compiz-0.9.11+14.04.20140409/0000755000015301777760000000000012321344021015474 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/VERSION0000644000015301777760000000000712321343002016537 0ustar pbusernogroup000000000000000.9.11 compiz-0.9.11+14.04.20140409/cmake/0000755000015301777760000000000012321344021016554 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/cmake/CompizPlugin.cmake0000644000015301777760000003632212321343002022202 0ustar pbusernogroup00000000000000####################################################################### # # Generic Compiz Fusion plugin cmake module # # Copyright : (C) 2008 by Dennis Kasprzyk # E-mail : onestone@opencompositing.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. # ####################################################################### # # This module provides the following macro: # # compiz_plugin ( # [PKGDEPS dep1 dep2 ...] # [PLUGINDEPS plugin1 plugin2 ...] # [LDFLAGSADD flag1 flag2 ...] # [CFLAGSADD flag1 flag2 ...] # [LIBRARIES lib1 lib2 ...] # [LIBDIRS dir1 dir2 ...] # [INCDIRS dir1 dir2 ...]) # # PKGDEPS = pkgconfig dependencies # PLUGINDEPS = compiz plugin dependencies # LDFLAGSADD = flags added to the link command # CFLAGSADD = flags added to the compile command # LIBRARIES = libraries added to link command # LIBDIRS = additional link directories # INCDIRS = additional include directories # NOINSTALL = do not install this plugin # # The following variables will be used by this macro: # # BUILD_GLOBAL=true Environment variable to install a plugin # into the compiz directories # # COMPIZ_PLUGIN_INSTALL_TYPE = (package | compiz | local (default)) # package = Install into ${CMAKE_INSTALL_PREFIX} # compiz = Install into compiz prefix (BUILD_GLOBAL=true) # local = Install into home directory # # COMPIZ_I18N_DIR = Translation file directory # # COMPIZ_DISABLE_SCHEMAS_INSTALL = Disables gconf schema installation with gconftool # COMPIZ_INSTALL_GCONF_SCHEMA_DIR = Installation path of the gconf schema file # # VERSION = package version that is added to a plugin pkg-version file # ####################################################################### include (CompizCommon) include (CompizBcop) if (COMPIZ_PACKAGING_ENABLED) set (prefix ${CMAKE_INSTALL_PREFIX} CACHE PATH "prefix") set (exec_prefix ${CMAKE_INSTALL_PREFIX}/bin CACHE PATH "bindir") set (libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX} CACHE PATH "libdir") set (includedir ${CMAKE_INSTALL_PREFIX}/include CACHE PATH "includedir") set (datadir ${CMAKE_INSTALL_PREFIX}/share CACHE PATH "datadir") else (COMPIZ_PACKAGING_ENABLED) set (prefix ${CMAKE_INSTALL_PREFIX} ) set (exec_prefix ${CMAKE_INSTALL_PREFIX}/bin ) set (libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) set (includedir ${CMAKE_INSTALL_PREFIX}/include ) set (datadir ${CMAKE_INSTALL_PREFIX}/share ) endif (COMPIZ_PACKAGING_ENABLED) ### Set up core lib dependences so this in correctly imported into plugins set (COMPIZ_REQUIRES x11 xext xdamage xcomposite x11-xcb xrandr xinerama xext ice sm libxml-2.0 libxslt "libstartup-notification-1.0 >= 0.7" ) compiz_pkg_check_modules (COMPIZ REQUIRED ${COMPIZ_REQUIRES}) list (APPEND COMPIZ_LIBRARIES ${Boost_LIBRARIES}) # determinate installation directories macro (_prepare_directories) set (CMAKE_CONFIGURATION_TYPES "Debug;Release;RelWithDebInfo;MinSizeRe" CACHE INTERNAL "" FORCE) if ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") set (PLUGIN_BUILDTYPE global) set (PLUGIN_PREFIX ${CMAKE_INSTALL_PREFIX}) set (PLUGIN_LIBDIR ${libdir}/compiz) set (PLUGIN_INCDIR ${includedir}) set (PLUGIN_PKGDIR ${libdir}/pkgconfig) set (PLUGIN_XMLDIR ${datadir}/compiz) if (NOT CMAKE_BUILD_TYPE) set (CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Build type (Debug/Release/RelWithDebInfo/MinSizeRe)" FORCE) endif (NOT CMAKE_BUILD_TYPE) elseif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") set (PLUGIN_BUILDTYPE global) set (PLUGIN_PREFIX ${COMPIZ_PREFIX}) set (PLUGIN_LIBDIR ${COMPIZ_LIBDIR}/compiz) set (PLUGIN_INCDIR ${COMPIZ_INCLUDEDIR}) set (PLUGIN_PKGDIR ${COMPIZ_LIBDIR}/pkgconfig) set (PLUGIN_XMLDIR ${COMPIZ_PREFIX}/share/compiz) if (NOT CMAKE_BUILD_TYPE) set (CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (Debug/Release/RelWithDebInfo/MinSizeRe)" FORCE) endif (NOT CMAKE_BUILD_TYPE) else ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") set (PLUGIN_BUILDTYPE local) set (PLUGIN_PREFIX $ENV{HOME}/.compiz-1) set (PLUGIN_LIBDIR $ENV{HOME}/.compiz-1/plugins) set (PLUGIN_XMLDIR $ENV{HOME}/.compiz-1/metadata) if (NOT CMAKE_BUILD_TYPE) set (CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (Debug/Release/RelWithDebInfo/MinSizeRe)" FORCE) endif (NOT CMAKE_BUILD_TYPE) endif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") endmacro (_prepare_directories) # check plugin dependencies macro (_check_plugin_plugin_deps _prefix) set (${_prefix}_HAS_PLUGIN_DEPS TRUE) foreach (_val ${ARGN}) string (TOUPPER ${_val} _name) find_file ( _plugin_dep_${_val} compiz-${_val}.pc.in PATHS ${CMAKE_CURRENT_SOURCE_DIR}/../${_val} NO_DEFAULT_PATH ) if (_plugin_dep_${_val}) file (RELATIVE_PATH _relative ${CMAKE_CURRENT_SOURCE_DIR} ${_plugin_dep_${_val}}) get_filename_component (_plugin_inc_dir ${_relative} PATH) list (APPEND ${_prefix}_LOCAL_INCDIRS "${_plugin_inc_dir}/include") list (APPEND ${_prefix}_LOCAL_LIBRARIES ${_val}) else () # fallback to pkgconfig compiz_pkg_check_modules (_${_name} compiz-${_val}) if (_${_name}_FOUND) list (APPEND ${_prefix}_PKG_LIBDIRS "${_${_name}_LIBRARY_DIRS}") list (APPEND ${_prefix}_PKG_LIBRARIES "${_${_name}_LIBRARIES}") list (APPEND ${_prefix}_PKG_INCDIRS "${_${_name}_INCLUDE_DIRS}") else () set (${_prefix}_HAS_PLUGIN_DEPS FALSE) compiz_set (COMPIZ_${_prefix}_MISSING_DEPS "${COMPIZ_${_prefix}_MISSING_DEPS} compiz-${_val}") endif () endif () compiz_set (_plugin_dep_${_val} "${_plugin_dep_${_val}}") endforeach () endmacro () # main function macro (_build_compiz_plugin plugin) string (TOUPPER ${plugin} _PLUGIN) if (COMPIZ_PLUGIN_INSTALL_TYPE) set ( COMPIZ_PLUGIN_INSTALL_TYPE ${COMPIZ_PLUGIN_INSTALL_TYPE} CACHE STRING "Where a plugin should be installed \(package | compiz | local\)" ) else (COMPIZ_PLUGIN_INSTALL_TYPE) set ( COMPIZ_PLUGIN_INSTALL_TYPE "local" CACHE STRING "Where a plugin should be installed \(package | compiz | local\)" ) endif (COMPIZ_PLUGIN_INSTALL_TYPE) set (_install_plugin_${plugin} ON) foreach (ARG ${ARGN}) if (${ARG} STREQUAL "NOINSTALL") set (_install_plugin_${plugin} OFF) endif (${ARG} STREQUAL "NOINSTALL") endforeach () _get_parameters (${_PLUGIN} ${ARGN}) _prepare_directories () find_file ( _${plugin}_xml_in ${plugin}.xml.in PATHS ${CMAKE_CURRENT_SOURCE_DIR} NO_DEFAULT_PATH ) if (_${plugin}_xml_in) set (_${plugin}_xml ${_${plugin}_xml_in}) else () find_file ( _${plugin}_xml ${plugin}.xml PATHS ${CMAKE_CURRENT_SOURCE_DIR} } NO_DEFAULT_PATH ) endif () set (${_PLUGIN}_HAS_PKG_DEPS) set (${_PLUGIN}_HAS_PLUGIN_DEPS) # check dependencies compiz_unset (COMPIZ_${_PLUGIN}_MISSING_DEPS) _check_plugin_plugin_deps (${_PLUGIN} ${${_PLUGIN}_PLUGINDEPS}) _check_pkg_deps (${_PLUGIN} ${${_PLUGIN}_PKGDEPS}) if (${_PLUGIN}_HAS_PKG_DEPS AND ${_PLUGIN}_HAS_PLUGIN_DEPS) compiz_set (COMPIZ_${_PLUGIN}_BUILD TRUE PARENT_SCOPE) if (NOT EXISTS ${CMAKE_BINARY_DIR}/generated) file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/generated) endif (NOT EXISTS ${CMAKE_BINARY_DIR}/generated) if (_${plugin}_xml_in) # translate xml compiz_translate_xml ( ${_${plugin}_xml_in} "${CMAKE_BINARY_DIR}/generated/${plugin}.xml") set (_translation_sources "${CMAKE_BINARY_DIR}/generated/${plugin}.xml") set (_translated_xml ${CMAKE_BINARY_DIR}/generated/${plugin}.xml) else () if (_${plugin}_xml) set (_translated_xml ${_${plugin}_xml}) endif () endif () if (_${plugin}_xml) # do we need bcop for our plugin compiz_plugin_needs_bcop (${_${plugin}_xml} _needs_bcop) if (_needs_bcop) # initialize everything we need for bcop compiz_add_bcop_targets (${plugin} ${_${plugin}_xml} _bcop_sources) endif () endif () if (_translated_xml) if (_install_plugin_${plugin}) # install xml install ( FILES ${_translated_xml} DESTINATION $ENV{DESTDIR}${PLUGIN_XMLDIR} ) endif (_install_plugin_${plugin}) endif (_translated_xml) find_file ( _${plugin}_pkg compiz-${plugin}.pc.in PATHS ${CMAKE_CURRENT_SOURCE_DIR} NO_DEFAULT_PATH ) set (COMPIZ_CURRENT_PLUGIN ${plugin}) set (COMPIZ_CURRENT_XML_FILE ${_translated_xml}) # find extension files file (GLOB _extension_files "${COMPIZ_CMAKE_MODULE_PATH}/plugin_extensions/*.cmake") foreach (_file ${_extension_files}) include (${_file}) endforeach () # generate pkgconfig file and install it and the plugin header file if (_${plugin}_pkg AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/include/${plugin}) if ("${PLUGIN_BUILDTYPE}" STREQUAL "local") message (STATUS "[WARNING] The plugin ${plugin} might be needed by other plugins. Install it systemwide.") else () set (prefix ${PLUGIN_PREFIX}) set (libdir ${PLUGIN_LIBDIR}) set (includedir ${PLUGIN_INCDIR}) if (NOT VERSION) set (VERSION 0.0.1-git) endif (NOT VERSION) #add CFLAGSADD so pkg-config file has correct flags set (COMPIZ_CFLAGS ${COMPIZ_CFLAGS} ${${_PLUGIN}_CFLAGSADD}) compiz_configure_file ( ${_${plugin}_pkg} ${CMAKE_BINARY_DIR}/generated/compiz-${plugin}.pc COMPIZ_REQUIRES COMPIZ_CFLAGS PKGCONFIG_LIBS ) if (_install_plugin_${plugin}) install ( FILES ${CMAKE_BINARY_DIR}/generated/compiz-${plugin}.pc DESTINATION ${PLUGIN_PKGDIR} ) install ( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/${plugin} DESTINATION ${PLUGIN_INCDIR}/compiz ) endif () endif () endif () # find files for build file (GLOB _h_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h") file (GLOB _h_ins_files "${CMAKE_CURRENT_SOURCE_DIR}/include/${plugin}/*.h") file (GLOB _cpp_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp") # set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs") # set (_cflags "-Wall -Wpointer-arith -fno-strict-aliasing") add_definitions (-DPREFIX='\"${PLUGIN_PREFIX}\"' ${COMPIZ_DEFINITIONS_ADD}) foreach (_def ${_PLUGIN}_DEFSADD) add_definitions (-D${_def}) endforeach (_def) # Need to know the include-dirs for the internal # modules to this plugin, core (if built with core) # and any other plugins that we depend on get_property (${_PLUGIN}_MOD_INCLUDE_DIRS GLOBAL PROPERTY ${_PLUGIN}_MOD_INCLUDE_DIRS) get_property (CORE_MOD_INCLUDE_DIRS GLOBAL PROPERTY CORE_MOD_INCLUDE_DIRS) foreach (_plugindep ${${_PLUGIN}_PLUGINDEPS}) string (TOUPPER ${_plugindep} _PLUGINDEP) get_property (${_PLUGINDEP}_MOD_INCLUDE_DIRS GLOBAL PROPERTY ${_PLUGINDEP}_MOD_INCLUDE_DIRS) list (APPEND ${_PLUGIN}_PLUGINDEP_MOD_INCLUDE_DIRS ${${_PLUGINDEP}_MOD_INCLUDE_DIRS}) endforeach (_plugindep) include_directories ( ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/generated ${${_PLUGIN}_LOCAL_INCDIRS} ${${_PLUGIN}_PKG_INCDIRS} ${${_PLUGIN}_INCDIRS} ${COMPIZ_INCLUDE_DIRS} ${PLUGIN_PREFIX}/include ${CMAKE_INCLUDE_PATH} ${${_PLUGIN}_MOD_INCLUDE_DIRS} ${CORE_MOD_INCLUDE_DIRS} ${${_PLUGIN}_PLUGINDEP_MOD_INCLUDE_DIRS} ) get_property (${_PLUGIN}_MOD_LIBRARY_DIRS GLOBAL PROPERTY ${_PLUGIN}_MOD_LIBRARY_DIRS) set (SYSTEM_LINK_DIRS "/usr/lib" "/usr/lib32" "/usr/lib64" "/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}") link_directories ( ${COMPIZ_LINK_DIRS} ${${_PLUGIN}_PKG_LIBDIRS} ${${_PLUGIN}_LIBDIRS} ${COMPIZ_LIBDIR} ${PLUGIN_LIBDIR} ${${_PLUGIN}_MOD_LIBRARY_DIRS} ${SYSTEM_LINK_DIRS} ) add_library ( ${plugin} SHARED ${_cpp_files} ${_h_files} ${_h_ins_files} ${_bcop_sources} ${_translation_sources} ${COMPIZ_CURRENT_SOURCES_ADDS} ) if (COMPIZ_BUILD_WITH_RPATH) set_target_properties ( ${plugin} PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1 BUILD_WITH_INSTALL_RPATH 1 SKIP_BUILD_RPATH 0 COMPILE_FLAGS "${${_PLUGIN}_CFLAGSADD}" LINK_FLAGS "${${_PLUGIN}_LDFLAGSADD}" ) else (COMPIZ_BUILD_WITH_RPATH) set_target_properties ( ${plugin} PROPERTIES INSTALL_RPATH_USE_LINK_PATH 0 SKIP_BUILD_RPATH 1 INSTALL_RPATH "${COMPIZ_LIBDIR}/compiz" COMPILE_FLAGS "${${_PLUGIN}_CFLAGSADD}" LINK_FLAGS "${${_PLUGIN}_LDFLAGSADD}" ) endif (COMPIZ_BUILD_WITH_RPATH) get_property (${_PLUGIN}_MOD_LIBRARIES GLOBAL PROPERTY ${_PLUGIN}_MOD_LIBRARIES) target_link_libraries ( ${plugin} ${COMPIZ_LIBRARIES} ${${_PLUGIN}_LOCAL_LIBRARIES} ${${_PLUGIN}_PKG_LIBRARIES} ${${_PLUGIN}_LIBRARIES} ${${_PLUGIN}_MOD_LIBRARIES} compiz_core ) if (_install_plugin_${plugin}) install ( TARGETS ${plugin} LIBRARY DESTINATION ${PLUGIN_LIBDIR} ) endif (_install_plugin_${plugin}) if (NOT _COMPIZ_INTERNAL AND _install_plugin_${plugin}) compiz_add_uninstall () endif (NOT _COMPIZ_INTERNAL AND _install_plugin_${plugin}) if (NOT COMPIZ_PLUGIN_PACK_BUILD) set (CMAKE_PROJECT_NAME plugin-${plugin}) if (EXISTS ${CMAKE_SOURCE_DIR}/VERSION) file (READ ${CMAKE_SOURCE_DIR}/VERSION COMPIZ_RELEASE_VERSION LIMIT 12 OFFSET 0) endif (EXISTS ${CMAKE_SOURCE_DIR}/VERSION) if (NOT COMPIZ_RELEASE_VERSION) set (COMPIZ_RELEASE_VERSION "0.0.1-git") endif (NOT COMPIZ_RELEASE_VERSION) string (STRIP ${COMPIZ_RELEASE_VERSION} COMPIZ_RELEASE_VERSION) set (VERSION ${COMPIZ_RELEASE_VERSION}) compiz_add_git_dist () compiz_add_release () compiz_add_distcheck () compiz_add_release_signoff () endif (NOT COMPIZ_PLUGIN_PACK_BUILD) else () message (STATUS "[WARNING] One or more dependencies for compiz plugin ${plugin} not found. Skipping plugin.") message (STATUS "Missing dependencies :${COMPIZ_${_PLUGIN}_MISSING_DEPS}") compiz_set (COMPIZ_${_PLUGIN}_BUILD FALSE) endif () endmacro () macro (compiz_plugin plugin) string (TOUPPER ${plugin} _PLUGIN) # If already defined, use the existing value... if (NOT DEFINED COMPIZ_DISABLE_PLUGIN_${_PLUGIN}) set (COMPIZ_DISABLE_PLUGIN_${_PLUGIN} OFF) endif () option ( COMPIZ_DISABLE_PLUGIN_${_PLUGIN} "Disable building of plugin \"${plugin}\"" ${COMPIZ_DISABLE_PLUGIN_${_PLUGIN}} ) if (NOT COMPIZ_DISABLE_PLUGIN_${_PLUGIN}) _build_compiz_plugin (${plugin} ${ARGN}) endif (NOT COMPIZ_DISABLE_PLUGIN_${_PLUGIN}) endmacro () compiz-0.9.11+14.04.20140409/cmake/copy_file_install_user_env.cmake0000644000015301777760000000103712321343002025162 0ustar pbusernogroup00000000000000set (FILE "" CACHE FORCE "File to Install") set (INSTALLDIR_USER "" CACHE FORCE "Installation dir if user") set (INSTALLDIR_ROOT "" CACHE FORCE "Installation dir if root") if (ENV{USER}) set (USERNAME $ENV{USER}) else (ENV${USER}) set (USERNAME "user") endif (ENV{USER}) if (${USERNAME} STREQUAL "root") set (INSTALLDIR ${INSTALLDIR_ROOT}) else (${USERNAME} STREQUAL "root") set (INSTALLDIR ${INSTALLDIR_USER}) endif (${USERNAME} STREQUAL "root") file (INSTALL DESTINATION ${INSTALLDIR} TYPE FILE FILES ${FILE}) compiz-0.9.11+14.04.20140409/cmake/FindLcov.cmake0000644000015301777760000000172012321343002021260 0ustar pbusernogroup00000000000000# - Find lcov # Will define: # # LCOV_EXECUTABLE - the lcov binary # GENHTML_EXECUTABLE - the genhtml executable # # Copyright (C) 2010 by Johannes Wienke # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation; # either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # INCLUDE(FindPackageHandleStandardArgs) FIND_PROGRAM(LCOV_EXECUTABLE lcov) FIND_PROGRAM(GENHTML_EXECUTABLE genhtml) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lcov DEFAULT_MSG LCOV_EXECUTABLE GENHTML_EXECUTABLE) # only visible in advanced view MARK_AS_ADVANCED(LCOV_EXECUTABLE GENHTML_EXECUTABLE) compiz-0.9.11+14.04.20140409/cmake/EnableCoverageReport.cmake0000644000015301777760000001641412321343002023620 0ustar pbusernogroup00000000000000# - Creates a special coverage build type and target on GCC. # # Defines a function ENABLE_COVERAGE_REPORT which generates the coverage target # for selected targets. Optional arguments to this function are used to filter # unwanted results using globbing expressions. Moreover targets with tests for # the source code can be specified to trigger regenerating the report if the # test has changed # # ENABLE_COVERAGE_REPORT(TARGETS target... [FILTER filter...] [TESTS test targets...]) # # To generate a coverage report first build the project with # CMAKE_BUILD_TYPE=coverage, then call make test and afterwards make coverage. # # The coverage report is based on gcov. Depending on the availability of lcov # a HTML report will be generated and/or an XML report of gcovr is found. # The generated coverage target executes all found solutions. Special targets # exist to create e.g. only the xml report: coverage-xml. # # Copyright (C) 2010 by Johannes Wienke # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation; # either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # INCLUDE(CompizCommon) FIND_PACKAGE(Lcov) FIND_PACKAGE(gcovr) FUNCTION(ENABLE_COVERAGE_REPORT) # argument parsing PARSE_ARGUMENTS(ARG "FILTER;TARGETS;TESTS" "" ${ARGN}) SET(COVERAGE_RAW_FILE "${CMAKE_BINARY_DIR}/coverage.raw.info") SET(COVERAGE_FILTERED_FILE "${CMAKE_BINARY_DIR}/coverage.info") SET(COVERAGE_REPORT_DIR "${CMAKE_BINARY_DIR}/coveragereport") SET(COVERAGE_XML_FILE "${CMAKE_BINARY_DIR}/coverage.xml") SET(COVERAGE_XML_COMMAND_FILE "${CMAKE_BINARY_DIR}/coverage-xml.cmake") # decide if there is any tool to create coverage data SET(TOOL_FOUND FALSE) IF(LCOV_FOUND OR GCOVR_FOUND) SET(TOOL_FOUND TRUE) ENDIF() IF(NOT TOOL_FOUND) MESSAGE(STATUS "Cannot enable coverage targets because neither lcov nor gcovr are found.") ENDIF() STRING(TOLOWER "${CMAKE_BUILD_TYPE}" COVERAGE_BUILD_TYPE) IF(CMAKE_COMPILER_IS_GNUCXX AND TOOL_FOUND AND "${COVERAGE_BUILD_TYPE}" MATCHES "coverage") MESSAGE(STATUS "Coverage support enabled for targets: ${ARG_TARGETS}") # create coverage build type SET(CMAKE_CXX_FLAGS_COVERAGE ${CMAKE_CXX_FLAGS_DEBUG} PARENT_SCOPE) SET(CMAKE_C_FLAGS_COVERAGE ${CMAKE_C_FLAGS_DEBUG} PARENT_SCOPE) SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES} coverage PARENT_SCOPE) # instrument targets SET_TARGET_PROPERTIES(${ARG_TARGETS} PROPERTIES COMPILE_FLAGS --coverage LINK_FLAGS --coverage) # html report IF (LCOV_FOUND) MESSAGE(STATUS "Enabling HTML coverage report") # set up coverage target ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_RAW_FILE} COMMAND ${LCOV_EXECUTABLE} -c -d ${CMAKE_BINARY_DIR} -o ${COVERAGE_RAW_FILE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Collecting coverage data" DEPENDS ${ARG_TARGETS} ${ARG_TESTS} VERBATIM) # filter unwanted stuff LIST(LENGTH ARG_FILTER FILTER_LENGTH) IF(${FILTER_LENGTH} GREATER 0) SET(FILTER COMMAND ${LCOV_EXECUTABLE}) FOREACH(F ${ARG_FILTER}) SET(FILTER ${FILTER} -r ${COVERAGE_FILTERED_FILE} ${F}) ENDFOREACH() SET(FILTER ${FILTER} -o ${COVERAGE_FILTERED_FILE}) ELSE() SET(FILTER "") ENDIF() ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_FILTERED_FILE} COMMAND ${LCOV_EXECUTABLE} -e ${COVERAGE_RAW_FILE} "${CMAKE_SOURCE_DIR}*" -o ${COVERAGE_FILTERED_FILE} ${FILTER} DEPENDS ${COVERAGE_RAW_FILE} COMMENT "Filtering recorded coverage data for project-relevant entries" VERBATIM) ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_REPORT_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${COVERAGE_REPORT_DIR} COMMAND ${GENHTML_EXECUTABLE} --legend --show-details -t "${PROJECT_NAME} test coverage" -o ${COVERAGE_REPORT_DIR} ${COVERAGE_FILTERED_FILE} DEPENDS ${COVERAGE_FILTERED_FILE} COMMENT "Generating HTML coverage report in ${COVERAGE_REPORT_DIR}" VERBATIM) ADD_CUSTOM_TARGET(coverage-html DEPENDS ${COVERAGE_REPORT_DIR}) ENDIF() # xml coverage report IF(GCOVR_FOUND) MESSAGE(STATUS "Enabling XML coverage report") # gcovr cannot write directly to a file so the execution needs to # be wrapped in a cmake file that generates the file output FILE(WRITE ${COVERAGE_XML_COMMAND_FILE} "SET(ENV{LANG} en)\n") FILE(APPEND ${COVERAGE_XML_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND \"${GCOVR_EXECUTABLE}\" -x -r \"${CMAKE_SOURCE_DIR}\" OUTPUT_FILE \"${COVERAGE_XML_FILE}\" WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\")\n") ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_XML_FILE} COMMAND ${CMAKE_COMMAND} ARGS -P ${COVERAGE_XML_COMMAND_FILE} COMMENT "Generating coverage XML report" VERBATIM) ADD_CUSTOM_TARGET(coverage-xml DEPENDS ${COVERAGE_XML_FILE}) ENDIF() # provide a global coverage target executing both steps if available SET(GLOBAL_DEPENDS "") IF(LCOV_FOUND) LIST(APPEND GLOBAL_DEPENDS ${COVERAGE_REPORT_DIR}) ENDIF() IF(GCOVR_FOUND) LIST(APPEND GLOBAL_DEPENDS ${COVERAGE_XML_FILE}) ENDIF() IF(LCOV_FOUND OR GCOVR_FOUND) ADD_CUSTOM_TARGET(coverage DEPENDS ${GLOBAL_DEPENDS}) ENDIF() ENDIF() ENDFUNCTION() function (compiz_generate_coverage_report) get_property (COMPIZ_COVERAGE_REPORT_TARGETS_SET GLOBAL PROPERTY COMPIZ_COVERAGE_REPORT_TARGETS ${TARGET}) if (NOT COMPIZ_COVERAGE_REPORT_TARGETS_SET) message (STATUS "No coverage report targets set, not generating coverage report") else (NOT COMPIZ_COVERAGE_REPORT_TARGETS_SET) get_property (COMPIZ_COVERAGE_REPORT_TARGETS GLOBAL PROPERTY COMPIZ_COVERAGE_REPORT_TARGETS) enable_coverage_report (TARGETS ${COMPIZ_COVERAGE_REPORT_TARGETS}) endif (NOT COMPIZ_COVERAGE_REPORT_TARGETS_SET) endfunction () compiz-0.9.11+14.04.20140409/cmake/FindXorgGTest.cmake0000644000015301777760000000371112321343002022245 0ustar pbusernogroup00000000000000# Find xorg-gtest,with pkg-config. This sets: # # XORG_GTEST_FOUND # XORG_SERVER_INCLUDE_XORG_GTEST # XORG_SERVER_GTEST_SRC # xorg-gtest pkg_check_modules (XORG_SERVER xorg-gtest>=0.7.0 xorg-server x11 xi) if (XORG_SERVER_FOUND) execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=prefix xorg-gtest OUTPUT_VARIABLE _xorg_gtest_prefix) execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=includedir xorg-gtest OUTPUT_VARIABLE _xorg_gtest_include_dir) execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=sourcedir xorg-gtest OUTPUT_VARIABLE _xorg_gtest_source_dir) execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=CPPflags xorg-gtest OUTPUT_VARIABLE _xorg_gtest_cflags) string (STRIP ${_xorg_gtest_prefix} _xorg_gtest_prefix) string (STRIP ${_xorg_gtest_include_dir} _xorg_gtest_include_dir) string (STRIP ${_xorg_gtest_source_dir} _xorg_gtest_source_dir) string (STRIP ${_xorg_gtest_cflags} _xorg_gtest_cflags) set (XORG_SERVER_GTEST_INCLUDES ${XORG_SERVER_INCLUDE_DIRS}) set (XORG_SERVER_GTEST_LIBRARY_DIRS ${XORG_SERVER_LIBRARIES}) set (XORG_SERVER_GTEST_LIBRARIES} ${XORG_SERVER_LIBRARIES}) set (XORG_SERVER_INCLUDE_XORG_GTEST ${_xorg_gtest_include_dir} CACHE PATH "Path to Xorg GTest Headers") set (XORG_SERVER_GTEST_SRC ${_xorg_gtest_source_dir} CACHE PATH "Path to Xorg GTest Sources") set (XORG_SERVER_GTEST_CFLAGS ${_xorg_gtest_cflags}) set (XORG_SERVER_GTEST_ROOT ${CMAKE_SOURCE_DIR}/tests/xorg-gtest CACHE PATH "Path to Xorg GTest CMake sources") set (COMPIZ_XORG_SYSTEM_TEST_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/tests/xorg-gtest/include CACHE PATH "Path to Compiz Xorg GTest Headers") message (STATUS "Found xorg-gtest sources at " ${XORG_SERVER_GTEST_SRC}) set (XORG_GTEST_FOUND ON) else (XORG_SERVER_FOUND) message (WARNING "Could not found xorg-gtest, can't build xserver tests") set (XORG_GTEST_FOUND OFF) endif (XORG_SERVER_FOUND) compiz-0.9.11+14.04.20140409/cmake/base.cmake0000644000015301777760000001022112321343002020462 0ustar pbusernogroup00000000000000set (USE_GCONF 1 CACHE BOOL "Install core GConf schemas") if (USE_GCONF) pkg_check_modules (GCONF gconf-2.0) find_program (GCONFTOOL_EXECUTABLE gconftool-2) mark_as_advanced (FORCE GCONFTOOL_EXECUTABLE) if (NOT COMPIZ_INSTALL_GCONF_SCHEMA_DIR) set (SCHEMADIR "${CMAKE_INSTALL_PREFIX}/share/gconf/schemas") else (NOT COMPIZ_INSTALL_GCONF_SCHEMA_DIR) set (SCHEMADIR "${COMPIZ_INSTALL_GCONF_SCHEMA_DIR}") endif (NOT COMPIZ_INSTALL_GCONF_SCHEMA_DIR) if (NOT GCONF_FOUND OR NOT GCONFTOOL_EXECUTABLE) set (USE_GCONF 0) else () include (CompizGconf) include (CompizGSettings) endif () endif () function (_print_configure_results) compiz_print_configure_header ("Compiz") compiz_color_message ("\n${_escape}[4mOptional features:${_escape}[0m\n") compiz_print_result_message ("GLESv2" USE_GLES) compiz_print_result_message ("gtk window decorator" USE_GTK) compiz_print_result_message ("metacity theme support" USE_METACITY) compiz_print_result_message ("gconf schemas" USE_GCONF) compiz_print_result_message ("gnome" USE_GNOME) compiz_print_result_message ("kde4 window decorator" USE_KDE4) compiz_print_result_message ("protocol buffers" USE_PROTOBUF) compiz_print_result_message ("file system change notifications" HAVE_INOTIFY) compiz_print_result_message ("Xig Tests" COMPIZ_XIG_TEST_FOUND) compiz_print_configure_footer () compiz_print_plugin_stats ("${CMAKE_SOURCE_DIR}/plugins") compiz_print_configure_footer () endfunction () function (_check_compiz_cmake_macro) find_file (_find_compiz FindCompiz.cmake PATHS ${CMAKE_ROOT}/Modules ${ARGN}) if (NOT _find_compiz) compiz_color_message ("${_escape}[1;31mWARNING:${_escape}[0m") message ("\"FindCompiz.cmake\" file not found in cmake module directories.") message ("It should be installed to allow building of external compiz packages.") message ("Call \"sudo make findcompiz_install\" to install it.\n") compiz_print_configure_footer () endif () install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindCompiz.cmake ${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindOpenGLES2.cmake DESTINATION ${CMAKE_INSTALL_PREFIX}/share/cmake-${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}/) add_custom_target (findcompiz_install ${CMAKE_COMMAND} -E make_directory ${CMAKE_ROOT}/Modules && ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/cmake/FindCompiz.cmake ${CMAKE_ROOT}/Modules && ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/cmake/FindOpenGLES2.cmake ${CMAKE_ROOT}/Modules ) find_file (_find_compizconfig FindCompizConfig.cmake PATHS ${CMAKE_ROOT}/Modules ${ARGN}) if (NOT _find_compizconfig) compiz_color_message ("${_escape}[1;31mWARNING:${_escape}[0m") message ("\"FindCompizConfig.cmake\" file not found in cmake module directories.") message ("It should be installed to allow building of external compiz packages.") message ("Call \"sudo make findcompiz_install\" to install it.\n") compiz_print_configure_footer () endif (NOT _find_compizconfig) install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig/libcompizconfig/cmake/FindCompizConfig.cmake DESTINATION ${CMAKE_INSTALL_PREFIX}/share/cmake-${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}/) add_custom_target ( findcompizconfig_install ${CMAKE_COMMAND} -E make_directory ${CMAKE_ROOT}/Modules && ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig/libcompizconfig/cmake/FindCompizConfig.cmake ${CMAKE_ROOT}/Modules ) endfunction () # add install prefix to pkgconfig search path if needed string (REGEX REPLACE "([\\+\\(\\)\\^\\\$\\.\\-\\*\\?\\|])" "\\\\\\1" PKGCONFIG_REGEX ${CMAKE_INSTALL_PREFIX}) set (PKGCONFIG_REGEX ".*${PKGCONFIG_REGEX}/lib/pkgconfig:${PKGCONFIG_REGEX}/share/pkgconfig.*") if (NOT "$ENV{PKG_CONFIG_PATH}" MATCHES "${PKGCONFIG_REGEX}") if ("" STREQUAL "$ENV{PKG_CONFIG_PATH}") set (ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/share/pkgconfig") else () set (ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/share/pkgconfig:$ENV{PKG_CONFIG_PATH}") endif () endif () compiz-0.9.11+14.04.20140409/cmake/FindCompiz.cmake0000644000015301777760000000716412321343002021626 0ustar pbusernogroup00000000000000################################################################################ # # FindCompiz # # This module finds Compiz (https://launchpad.net/compiz). It uses the FindPkgConfig to # locate Compiz and adds the Compiz CMake module path to the CMake module path. # It also loads the CompizDefaults that sets all variables to compile Compiz # modules. # # This module sets the following variables: # COMPIZ_FOUND ... set to true if compiz and its CompizDefaults macro # is found # # Variables set by the FindPkgConfig macro for compiz # COMPIZ_CMAKE_MODULE_PATH ... the path containing all other # compiz cmake modules # COMPIZ_LIBRARY_DIRS ... the paths of the libraries (w/o the '-L') # COMPIZ_LDFLAGS ... all required linker flags # COMPIZ_LDFLAGS_OTHER ... all other linker flags # COMPIZ_INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I') # COMPIZ_CFLAGS ... all required cflags # COMPIZ_CFLAGS_OTHER ... the other compiler flags # COMPIZ_VERSION ... version of the module # COMPIZ_PREFIX ... prefix-directory of the module # COMPIZ_INCLUDEDIR ... include-dir of the module # COMPIZ_LIBDIR ... lib-dir of the module # # If the _COMPIZ_INTERNAL variable is set to true, then this module will do # nothing. This is required for the Compiz core package build system. # # Author: Dennis Kasprzyk # ################################################################################ if (NOT _COMPIZ_INTERNAL) if (Compiz_FIND_REQUIRED) set (_req REQUIRED) endif () # look for pkg-config find_package (PkgConfig ${_req}) if (PKG_CONFIG_FOUND) # do we need to look for a specified version? set (_comp_ver) if (Compiz_FIND_VERSION) if (Compiz_FIND_VERSION_EXACT) set (_comp_ver "=${Compiz_FIND_VERSION}") else () set (_comp_ver ">=${Compiz_FIND_VERSION}") endif () endif () # add install prefix to pkgconfig search path if needed string (REGEX REPLACE "([\\+\\(\\)\\^\\\$\\.\\-\\*\\?\\|])" "\\\\\\1" PKGCONFIG_REGEX ${CMAKE_INSTALL_PREFIX}) set (PKGCONFIG_REGEX ".*${PKGCONFIG_REGEX}/lib/pkgconfig:${PKGCONFIG_REGEX}/share/pkgconfig.*") if (NOT CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) if (NOT "$ENV{PKG_CONFIG_PATH}" MATCHES "${PKGCONFIG_REGEX}") if ("" STREQUAL "$ENV{PKG_CONFIG_PATH}") set (ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/share/pkgconfig") else () set (ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/share/pkgconfig:$ENV{PKG_CONFIG_PATH}") endif () endif () endif (NOT CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) # look for compiz pkg_check_modules (COMPIZ ${_req} "compiz${_comp_ver}") # COMPIZ_PREFIX is not set by default on all machines. The CMake docs # seem to vagely suggest this is normal in some cases for # pkg_check_modules. if (NOT COMPIZ_PREFIX) set (COMPIZ_PREFIX ${CMAKE_INSTALL_PREFIX}) endif () # is the CompizDefaults module installed? find_path(_compiz_def_macro CompizDefaults.cmake ${COMPIZ_PREFIX}/share/compiz/cmake) if (COMPIZ_FOUND AND _compiz_def_macro) # everything found. Set module path and include defaults module set (COMPIZ_CMAKE_MODULE_PATH ${COMPIZ_PREFIX}/share/compiz/cmake) set (CMAKE_MODULE_PATH ${COMPIZ_CMAKE_MODULE_PATH} ${CMAKE_MODULE_PATH}) include (CompizDefaults) else () set (COMPIZ_FOUND 0) endif () if (Compiz_FIND_REQUIRED AND NOT COMPIZ_FOUND) message (FATAL_ERROR "Unable to find Compiz ${_comp_ver}") endif () endif () endif () compiz-0.9.11+14.04.20140409/cmake/CompizGconf.cmake0000644000015301777760000000270312321343002021774 0ustar pbusernogroup00000000000000option ( COMPIZ_DISABLE_SCHEMAS_INSTALL "Disables gconf schema installation with gconftool" OFF ) set ( COMPIZ_INSTALL_GCONF_SCHEMA_DIR ${COMPIZ_INSTALL_GCONF_SCHEMA_DIR} CACHE PATH "Installation path of the gconf schema file" ) function (compiz_install_gconf_schema _src _dst) find_program (GCONFTOOL_EXECUTABLE gconftool-2) mark_as_advanced (FORCE GCONFTOOL_EXECUTABLE) if (GCONFTOOL_EXECUTABLE AND NOT COMPIZ_DISABLE_SCHEMAS_INSTALL) install (CODE " if (\"\$ENV{USER}\" STREQUAL \"root\") exec_program (${GCONFTOOL_EXECUTABLE} ARGS \"--get-default-source\" OUTPUT_VARIABLE ENV{GCONF_CONFIG_SOURCE}) exec_program (${GCONFTOOL_EXECUTABLE} ARGS \"--makefile-install-rule ${_src} > /dev/null\") else (\"\$ENV{USER}\" STREQUAL \"root\") exec_program (${GCONFTOOL_EXECUTABLE} ARGS \"--install-schema-file=${_src} > /dev/null\") endif (\"\$ENV{USER}\" STREQUAL \"root\") ") endif () install ( FILES "${_src}" DESTINATION "${_dst}" ) endfunction () # generate gconf schema function (compiz_gconf_schema _src _dst _inst) find_program (XSLTPROC_EXECUTABLE xsltproc) mark_as_advanced (FORCE XSLTPROC_EXECUTABLE) if (XSLTPROC_EXECUTABLE) add_custom_command ( OUTPUT ${_dst} COMMAND ${XSLTPROC_EXECUTABLE} -o ${_dst} ${COMPIZ_GCONF_SCHEMAS_XSLT} ${_src} DEPENDS ${_src} ) compiz_install_gconf_schema (${_dst} ${_inst}) endif () endfunction () compiz-0.9.11+14.04.20140409/cmake/all_plugins_in_folder_example-CMakeLists.txt0000644000015301777760000000040112321343002027350 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizCommon) include (CompizPackage) compiz_add_plugins_in_folder ("${CMAKE_SOURCE_DIR}") compiz_print_configure_header ("Compiz") compiz_print_plugin_stats ("${CMAKE_SOURCE_DIR}") compiz_print_configure_footer ()compiz-0.9.11+14.04.20140409/cmake/CompizTesting.cmake0000644000015301777760000000127112321343002022354 0ustar pbusernogroup00000000000000# Based on gtest's GTEST_ADD_TESTS, but with run-with-xvfb.sh function(ENV_GTEST_ADD_TESTS executable extra_args) if(NOT ARGN) message(FATAL_ERROR "Missing ARGN") endif() foreach(source ${ARGN}) file(READ "${source}" contents) string(REGEX MATCHALL "TEST_?F?\\(([A-Za-z_0-9 ,]+)\\)" found_tests ${contents}) foreach(hit ${found_tests}) string(REGEX REPLACE ".*\\( *([A-Za-z_0-9]+), *([A-Za-z_0-9]+) *\\).*" "\\1.\\2" test_name ${hit}) add_test(${test_name} "/bin/bash" "${CMAKE_SOURCE_DIR}/scripts/run-with-xvfb.sh" "./${executable} --gtest_filter=${test_name} ${extra_args}") endforeach() endforeach() endfunction() compiz-0.9.11+14.04.20140409/cmake/CompizPackage.cmake0000644000015301777760000001026712321343002022277 0ustar pbusernogroup00000000000000include (CompizCommon) function (compiz_package_generation _name) include(InstallRequiredSystemLibraries) set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "${_name}") set (CPACK_PACKAGE_VENDOR "Compiz") set (CPACK_PACKAGE_VERSION "${VERSION}") set (CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${VERSION}") set (CPACK_RPM_PACKAGE_SUMMARY ${CPACK_PACKAGE_DESCRIPTION_SUMMARY}) set (CPACK_RPM_PACKAGE_NAME ${CPACK_PACKAGE_NAME}) set (CPACK_RPM_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION}) set (CPACK_RPM_PACKAGE_RELEASE 1) set (CPACK_RPM_PACKAGE_LICENCE "GPL") set (CPACK_RPM_PACKAGE_GROUP "unknown") set (CPACK_RPM_PACKAGE_VENDOR ${CPACK_PACKAGE_VENDOR}) set (CPACK_RPM_PACKAGE_DESCRIPTION "The blingiest window manager in the world") set (CPACK_SOURCE_GENERATOR "TGZ;TBZ2") set (CPACK_SOURCE_IGNORE_FILES "\\\\.#;/#;.*~") list (APPEND CPACK_SOURCE_IGNORE_FILES "/\\\\.git") list (APPEND CPACK_SOURCE_IGNORE_FILES "${CMAKE_BINARY_DIR}") list (APPEND CPACK_SOURCE_IGNORE_FILES "legacy/") list (APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.intltool-merge-cache") list (APPEND CPACK_SOURCE_IGNORE_FILES "/po/POTFILES$") list (APPEND CPACK_SOURCE_IGNORE_FILES "CMakeCache.txt") list (APPEND CPACK_SOURCE_IGNORE_FILES "CMakeFiles") include(CPack) #file (REMOVE "${CMAKE_BINARY_DIR}/CPackConfig.cmake") endfunction () function (compiz_print_configure_header _name) compiz_format_string ("${_name}" 40 _project) compiz_format_string ("${VERSION}" 40 _version) compiz_color_message ("\n${_escape}[40;37m************************************************************${_escape}[0m") compiz_color_message ("${_escape}[40;37m* ${_escape}[1;31mCompiz ${_escape}[0;40;34mBuildsystem${_escape}[0m${_escape}[40;37m *${_escape}[0m") compiz_color_message ("${_escape}[40;37m* *${_escape}[0m") compiz_color_message ("${_escape}[40;37m* Package : ${_escape}[32m${_project} ${_escape}[37m *${_escape}[0m") compiz_color_message ("${_escape}[40;37m* Version : ${_escape}[32m${_version} ${_escape}[37m *${_escape}[0m") compiz_color_message ("${_escape}[40;37m************************************************************${_escape}[0m") endfunction () function (compiz_print_configure_footer) compiz_color_message ("${_escape}[40;37m************************************************************${_escape}[0m\n") endfunction () function (compiz_print_plugin_stats _folder) compiz_color_message ("\n${_escape}[4mPlugin configure check results:${_escape}[0m\n") file ( GLOB _plugins_in RELATIVE "${_folder}" "${_folder}/*/CMakeLists.txt" ) list (SORT _plugins_in) foreach (_plugin ${_plugins_in}) file (READ "${_folder}/${_plugin}" _file) if (_file MATCHES "^.*compiz_plugin ?\\(([^\\)\r\n ]*).*$") string ( REGEX REPLACE "^.*compiz_plugin ?\\(([^\\)\r\n ]*).*$" "\\1" _plugin_name ${_file} ) else () get_filename_component (_plugin_name ${_plugin} PATH) endif () string (TOUPPER ${_plugin_name} _PLUGIN) compiz_format_string (${_plugin_name} 14 _plugin_name) if (NOT COMPIZ_ENABLED_PLUGIN_${_PLUGIN}) compiz_color_message (" ${_plugin_name}: ${_escape}[1;34mDisabled${_escape}[0m") else () if (COMPIZ_${_PLUGIN}_BUILD) compiz_color_message (" ${_plugin_name}: ${_escape}[1;32mYes${_escape}[0m") else () compiz_color_message (" ${_plugin_name}: ${_escape}[1;31mNo${_escape}[0m (Missing dependencies :${COMPIZ_${_PLUGIN}_MISSING_DEPS})") endif () endif () endforeach () message ("") endfunction () function (compiz_print_result_message _name _var) compiz_format_string ("${_name}" 30 __name) if (${_var}) set (_result "${_escape}[1;32mYes${_escape}[0m") else (${_var}) set (_result "${_escape}[1;31mNo${_escape}[0m") endif (${_var}) compiz_color_message (" ${__name} : ${_result}") endfunction (compiz_print_result_message) function (compiz_get_version_from_file) file (READ "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" _file) string ( REGEX REPLACE "^.*VERSION=([^\n]*).*$" "\\1" _version ${_file} ) set (VERSION ${_version} PARENT_SCOPE) endfunction () compiz-0.9.11+14.04.20140409/cmake/Findgcovr.cmake0000644000015301777760000000170212321343002021475 0ustar pbusernogroup00000000000000# - Find gcovr scrip # Will define: # # GCOVR_EXECUTABLE - the gcovr script # # Uses: # # GCOVR_ROOT - root to search for the script # # Copyright (C) 2011 by Johannes Wienke # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation; # either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # INCLUDE(FindPackageHandleStandardArgs) FIND_PROGRAM(GCOVR_EXECUTABLE gcovr HINTS ${GCOVR_ROOT} "${GCOVR_ROOT}/bin") FIND_PACKAGE_HANDLE_STANDARD_ARGS(gcovr DEFAULT_MSG GCOVR_EXECUTABLE) # only visible in advanced view MARK_AS_ADVANCED(GCOVR_EXECUTABLE) compiz-0.9.11+14.04.20140409/cmake/XorgGTest.cmake0000644000015301777760000000045712321343002021450 0ustar pbusernogroup00000000000000# XorgGTest.cmake # # build_xorg_gtest_locally (dir) specifies a subdirectory to # build xorg-gtest in locally function (build_xorg_gtest_locally build_directory) if (XORG_GTEST_FOUND) add_subdirectory (${XORG_SERVER_GTEST_ROOT} ${build_directory}) endif (XORG_GTEST_FOUND) endfunction () compiz-0.9.11+14.04.20140409/cmake/GoogleTest.cmake0000644000015301777760000000366212321343002021637 0ustar pbusernogroup00000000000000find_package (Threads REQUIRED) # Find the the Google Mock include directory # by searching the system-wide include directory # paths find_path (GMOCK_INCLUDE_DIR gmock/gmock.h) if (GMOCK_INCLUDE_DIR) set (GMOCK_INCLUDE_BASE "include/") string (LENGTH ${GMOCK_INCLUDE_BASE} GMOCK_INCLUDE_BASE_LENGTH) string (LENGTH ${GMOCK_INCLUDE_DIR} GMOCK_INCLUDE_DIR_LENGTH) math (EXPR GMOCK_INCLUDE_PREFIX_LENGTH "${GMOCK_INCLUDE_DIR_LENGTH} - ${GMOCK_INCLUDE_BASE_LENGTH}") string (SUBSTRING ${GMOCK_INCLUDE_DIR} 0 ${GMOCK_INCLUDE_PREFIX_LENGTH} GMOCK_INCLUDE_PREFIX) set (GMOCK_SRC_DIR ${GMOCK_INCLUDE_PREFIX}/src/gmock CACHE PATH "Path to Google Mock Sources") set (GMOCK_INCLUDE_DIR ${GMOCK_INCLUDE_DIR} CACHE PATH "Path to Google Mock Headers") set (GTEST_INCLUDE_DIR ${GMOCK_SRC_DIR}/gtest/include CACHE PATH "Path to Google Test Headers") set (GMOCK_LIBRARY "gmock" CACHE STRING "Name of the Google Mock library") set (GMOCK_MAIN_LIBRARY "gmock_main" CACHE STIRNG "Name of the Google Mock main () library") set (GTEST_BOTH_LIBRARIES ${CMAKE_THREAD_LIBS_INIT} gtest gtest_main) endif (GMOCK_INCLUDE_DIR) if (NOT GTEST_BOTH_LIBRARIES) set (GTEST_FOUND FALSE) else (NOT GTEST_BOTH_LIBRARIES) set (GTEST_FOUND TRUE) endif (NOT GTEST_BOTH_LIBRARIES) if (NOT GMOCK_LIBRARY OR NOT GMOCK_MAIN_LIBRARY OR NOT GTEST_FOUND) message ("Google Mock and Google Test not found - cannot build tests!") set (GOOGLE_TEST_AND_MOCK_FOUND FALSE) else (NOT GMOCK_LIBRARY OR NOT GMOCK_MAIN_LIBRARY OR NOT GTEST_FOUND) set (GOOGLE_TEST_AND_MOCK_FOUND TRUE) add_definitions(-DGTEST_USE_OWN_TR1_TUPLE=0) add_subdirectory (${GMOCK_SRC_DIR} ${CMAKE_BINARY_DIR}/__gmock) include_directories (${GMOCK_INCLUDE_DIR} ${GTEST_INCLUDE_DIR}) endif (NOT GMOCK_LIBRARY OR NOT GMOCK_MAIN_LIBRARY OR NOT GTEST_FOUND) compiz-0.9.11+14.04.20140409/cmake/CompizBcop.cmake0000644000015301777760000000321712321343002021624 0ustar pbusernogroup00000000000000find_program (XSLTPROC_EXECUTABLE xsltproc) mark_as_advanced (FORCE XSLTPROC_EXECUTABLE) if (NOT XSLTPROC_EXECUTABLE) message (FATAL_ERROR "xsltproc not found.") endif () # does the plugin require bcop function (compiz_plugin_needs_bcop _file _return) file (READ ${_file} _xml_content) if ("${_xml_content}" MATCHES "useBcop=\"true\"") set (${_return} TRUE PARENT_SCOPE) else () set (${_return} FALSE PARENT_SCOPE) endif () endfunction () # prepare bcop build function (compiz_add_bcop_targets _plugin _file _sources) add_custom_target (${_plugin}-options SOURCES ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.h ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.cpp ) add_custom_command ( OUTPUT ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.h COMMAND ${XSLTPROC_EXECUTABLE} -o ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.h --stringparam "file" "header" ${COMPIZ_BCOP_XSLT} ${_file} DEPENDS ${_file} ) add_custom_command ( OUTPUT ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.cpp COMMAND ${XSLTPROC_EXECUTABLE} -o ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.cpp --stringparam "file" "source" ${COMPIZ_BCOP_XSLT} ${_file} > ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.cpp DEPENDS ${_file} ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.h ) set (${_sources} "${CMAKE_BINARY_DIR}/generated/${_plugin}_options.h;${CMAKE_BINARY_DIR}/generated/${_plugin}_options.cpp" PARENT_SCOPE) endfunction () compiz-0.9.11+14.04.20140409/cmake/CompizDefaults.cmake.in0000644000015301777760000000051012321343002023106 0ustar pbusernogroup00000000000000 set (COMPIZ_BCOP_XSLT @CMAKE_INSTALL_PREFIX@/share/compiz/xslt/bcop.xslt) set (COMPIZ_GCONF_SCHEMAS_SUPPORT @USE_GCONF@) set (COMPIZ_GCONF_SCHEMAS_XSLT @CMAKE_INSTALL_PREFIX@/share/compiz/xslt/compiz_gconf_schemas.xslt) set (COMPIZ_GSETTINGS_SCHEMAS_XSLT @CMAKE_INSTALL_PREFIX@/share/compiz/xslt/compiz_gsettings_schemas.xslt)compiz-0.9.11+14.04.20140409/cmake/CompizCommon.cmake0000644000015301777760000011760612321343002022201 0ustar pbusernogroup00000000000000cmake_minimum_required (VERSION 2.6) include (FindPkgConfig) if ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") message (SEND_ERROR "Building in the source directory is not supported.") message (FATAL_ERROR "Please remove the created \"CMakeCache.txt\" file, the \"CMakeFiles\" directory and create a build directory and call \"${CMAKE_COMMAND} \".") endif ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") #### CTest enable_testing() #### policies cmake_policy (SET CMP0000 OLD) cmake_policy (SET CMP0002 OLD) cmake_policy (SET CMP0003 NEW) cmake_policy (SET CMP0005 OLD) cmake_policy (SET CMP0011 OLD) set (CMAKE_SKIP_RPATH FALSE) pkg_check_modules (GL QUIET gl) set (BUILD_GLES_DEFAULT OFF) if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm.*" OR NOT GL_FOUND) set (BUILD_GLES_DEFAULT ON) endif () option (BUILD_GLES "Build against GLESv2 instead of GL" ${BUILD_GLES_DEFAULT}) option (COMPIZ_BUILD_WITH_RPATH "Leave as ON unless building packages" ON) option (COMPIZ_RUN_LDCONFIG "Leave OFF unless you need to run ldconfig after install") option (COMPIZ_PACKAGING_ENABLED "Enable to manually set prefix, exec_prefix, libdir, includedir, datadir" OFF) option (COMPIZ_BUILD_TESTING "Build Unit Tests" ON) option (BUILD_XORG_GTEST "Build Xorg GTest integration tests" ON) set (COMPIZ_DATADIR ${CMAKE_INSTALL_PREFIX}/share) set (COMPIZ_METADATADIR ${CMAKE_INSTALL_PREFIX}/share/compiz) set (COMPIZ_IMAGEDIR ${CMAKE_INSTALL_PREFIX}/share/compiz/images) set (COMPIZ_PLUGINDIR ${libdir}/compiz) set (COMPIZ_SYSCONFDIR ${sysconfdir}) set ( VERSION ${VERSION} CACHE STRING "Package version that is added to a plugin pkg-version file" ) set ( COMPIZ_I18N_DIR ${COMPIZ_I18N_DIR} CACHE PATH "Translation file directory" ) # Almost everything is a shared library now, so almost everything needs -fPIC set (COMMON_FLAGS "-fPIC -Wall") option (COMPIZ_UNUSED_PRIVATE_FIELD_WARNINGS "Warn unused private fields" OFF) if (NOT COMPIZ_UNUSED_PRIVATE_FIELD_WARNINGS) set (COMMON_FLAGS "${COMMON_FLAGS} -Wno-unused-private-field") endif () option (COMPIZ_UNUSED_LOCAL_TYPEDEFS_WARNINGS "Warn about unused local typedefs" OFF) if (NOT COMPIZ_UNUSED_LOCAL_TYPEDEFS_WARNINGS) set (COMMON_FLAGS "${COMMON_FLAGS} -Wno-unused-local-typedefs") endif (NOT COMPIZ_UNUSED_LOCAL_TYPEDEFS_WARNINGS) option (COMPIZ_DEPRECATED_WARNINGS "Warn about declarations marked deprecated" OFF) if (NOT COMPIZ_DEPRECATED_WARNINGS) set (COMMON_FLAGS "${COMMON_FLAGS} -Wno-deprecated-declarations") endif () option (COMPIZ_SIGN_WARNINGS "Should compiz use -Wsign-conversion during compilation." ON) if (NOT COMPIZ_SIGN_WARNINGS) set (COMMON_FLAGS "${COMMON_FLAGS} -Wno-sign-conversion") endif () if (${CMAKE_PROJECT_NAME} STREQUAL "compiz") set (COMPIZ_WERROR_DEFAULT ON) else () set (COMPIZ_WERROR_DEFAULT OFF) endif () option (COMPIZ_WERROR "Treat warnings as errors" ${COMPIZ_WERROR_DEFAULT}) if (COMPIZ_WERROR) set (COMMON_FLAGS "${COMMON_FLAGS} -Werror") endif () set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS}") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}") set (COMMON_LINKER_FLAGS "-Wl,-zdefs") set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${COMMON_LINKER_FLAGS}") set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${COMMON_LINKER_FLAGS}") set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${COMMON_LINKER_FLAGS}") if (IS_DIRECTORY ${CMAKE_SOURCE_DIR}/.bzr) set(IS_BZR_REPO 1) elseif (IS_DIRECTORY ${CMAKE_SOURCE_DIR}/.bzr) set(IS_BZR_REPO 0) endif (IS_DIRECTORY ${CMAKE_SOURCE_DIR}/.bzr) set (USE_GLES ${BUILD_GLES}) if (USE_GLES) find_package(OpenGLES2) if (NOT OPENGLES2_FOUND) set (USE_GLES 0) message (SEND_ERROR "OpenGLESv2 not found") endif (NOT OPENGLES2_FOUND) endif (USE_GLES) # Parse arguments passed to a function into several lists separated by # upper-case identifiers and options that do not have an associated list e.g.: # # SET(arguments # hello OPTION3 world # LIST3 foo bar # OPTION2 # LIST1 fuz baz # ) # PARSE_ARGUMENTS(ARG "LIST1;LIST2;LIST3" "OPTION1;OPTION2;OPTION3" ${arguments}) # # results in 7 distinct variables: # * ARG_DEFAULT_ARGS: hello;world # * ARG_LIST1: fuz;baz # * ARG_LIST2: # * ARG_LIST3: foo;bar # * ARG_OPTION1: FALSE # * ARG_OPTION2: TRUE # * ARG_OPTION3: TRUE # # taken from http://www.cmake.org/Wiki/CMakeMacroParseArguments MACRO(PARSE_ARGUMENTS prefix arg_names option_names) SET(DEFAULT_ARGS) FOREACH(arg_name ${arg_names}) SET(${prefix}_${arg_name}) ENDFOREACH(arg_name) FOREACH(option ${option_names}) SET(${prefix}_${option} FALSE) ENDFOREACH(option) SET(current_arg_name DEFAULT_ARGS) SET(current_arg_list) FOREACH(arg ${ARGN}) SET(larg_names ${arg_names}) LIST(FIND larg_names "${arg}" is_arg_name) IF (is_arg_name GREATER -1) SET(${prefix}_${current_arg_name} ${current_arg_list}) SET(current_arg_name ${arg}) SET(current_arg_list) ELSE (is_arg_name GREATER -1) SET(loption_names ${option_names}) LIST(FIND loption_names "${arg}" is_option) IF (is_option GREATER -1) SET(${prefix}_${arg} TRUE) ELSE (is_option GREATER -1) SET(current_arg_list ${current_arg_list} ${arg}) ENDIF (is_option GREATER -1) ENDIF (is_arg_name GREATER -1) ENDFOREACH(arg) SET(${prefix}_${current_arg_name} ${current_arg_list}) ENDMACRO(PARSE_ARGUMENTS) function (compiz_add_to_coverage_report TARGET TEST) set_property (GLOBAL APPEND PROPERTY COMPIZ_COVERAGE_REPORT_TARGETS ${TARGET}) set_property (GLOBAL APPEND PROPERTY COMPIZ_COVERAGE_REPORT_TESTS ${TARGET}) endfunction () function (compiz_add_test_to_testfile CURRENT_BINARY_DIR TEST) message (STATUS "Will discover tests in ${TEST}") set (INCLUDE_STR "INCLUDE (${CURRENT_BINARY_DIR}/${TEST}_test.cmake) \n") set_property (GLOBAL APPEND PROPERTY COMPIZ_TEST_INCLUDE_FILES ${INCLUDE_STR}) endfunction (compiz_add_test_to_testfile) function (compiz_generate_testfile_target) # Adding a rule for the toplevel CTestTestfile.cmake # will cause enable_testing not to generate the file # for this directory, so we need to do some of the work # that command did for us file (WRITE ${CMAKE_BINARY_DIR}/CompizCTestTestfile.cmake "") file (GLOB ALL_DIRS "*") foreach (DIR ${ALL_DIRS}) if (IS_DIRECTORY ${DIR} AND NOT ${DIR} STREQUAL ${CMAKE_BINARY_DIR}) file (RELATIVE_PATH RDIR ${CMAKE_CURRENT_SOURCE_DIR} ${DIR}) file (APPEND ${compiz_BINARY_DIR}/CompizCTestTestfile.cmake "SUBDIRS (${RDIR})\n") endif (IS_DIRECTORY ${DIR} AND NOT ${DIR} STREQUAL ${CMAKE_BINARY_DIR}) endforeach () get_property (COMPIZ_TEST_INCLUDE_FILES_SET GLOBAL PROPERTY COMPIZ_TEST_INCLUDE_FILES SET) if (NOT COMPIZ_TEST_INCLUDE_FILES_SET) message (WARNING "No tests were added for discovery, not generating CTestTestfile.cmake rule") endif (NOT COMPIZ_TEST_INCLUDE_FILES_SET) get_property (COMPIZ_TEST_INCLUDE_FILES GLOBAL PROPERTY COMPIZ_TEST_INCLUDE_FILES) foreach (INCLUDEFILE ${COMPIZ_TEST_INCLUDE_FILES}) file (APPEND ${compiz_BINARY_DIR}/CompizCTestTestfile.cmake ${INCLUDEFILE}) endforeach () # Overwrite any existing CTestTestfile.cmake - we cannot use # configure_file as enable_testing () will clobber the result add_custom_command (OUTPUT ${CMAKE_BINARY_DIR}/CTestTestfileValid COMMAND cat ${CMAKE_BINARY_DIR}/CompizCTestTestfile.cmake > ${CMAKE_BINARY_DIR}/CTestTestfile.cmake && touch ${CMAKE_BINARY_DIR}/CTestTestfileValid COMMENT "Generating CTestTestfile.cmake" VERBATIM) add_custom_target (compiz_generate_ctest_testfile ALL DEPENDS ${CMAKE_BINARY_DIR}/CTestTestfileValid) # Invalidate the CTestTestfile.cmake if (EXISTS ${CMAKE_BINARY_DIR}/CTestTestfileValid) execute_process (COMMAND rm ${CMAKE_BINARY_DIR}/CTestTestfileValid) endif (EXISTS ${CMAKE_BINARY_DIR}/CTestTestfileValid) endfunction (compiz_generate_testfile_target) # Create target to discover tests function (compiz_discover_tests EXECUTABLE) string (TOLOWER "${CMAKE_BUILD_TYPE}" COVERAGE_BUILD_TYPE) if (${COVERAGE_BUILD_TYPE} MATCHES "coverage") parse_arguments (ARG "COVERAGE" "" ${ARGN}) foreach (COVERAGE ${ARG_COVERAGE}) compiz_add_to_coverage_report (${COVERAGE} ${EXECUTABLE}) endforeach () endif (${COVERAGE_BUILD_TYPE} MATCHES "coverage") set (XORG_GTEST_WRAPPER_REQUIRED 0) foreach (ARG ${ARGN}) if (${ARG} STREQUAL "WITH_XORG_GTEST") set (XORG_GTEST_WRAPPER_REQUIRED 1) endif (${ARG} STREQUAL "WITH_XORG_GTEST") endforeach () set (COMPIZ_DISCOVER_TESTS_CMD ${CMAKE_BINARY_DIR}/compiz_gtest/compiz_discover_gtest_tests ${CMAKE_CURRENT_BINARY_DIR}/${EXECUTABLE}) if (XORG_GTEST_WRAPPER_REQUIRED) set (COMPIZ_DISCOVER_TESTS_CMD ${COMPIZ_DISCOVER_TESTS_CMD} --wrapper ${COMPIZ_XORG_GTEST_WRAPPER}) endif (XORG_GTEST_WRAPPER_REQUIRED) add_custom_command (TARGET ${EXECUTABLE} POST_BUILD COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${EXECUTABLE} --gtest_list_tests | ${COMPIZ_DISCOVER_TESTS_CMD} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Discovering Tests in ${EXECUTABLE}" VERBATIM) add_dependencies (${EXECUTABLE} compiz_discover_gtest_tests) compiz_add_test_to_testfile (${CMAKE_CURRENT_BINARY_DIR} ${EXECUTABLE}) endfunction (compiz_discover_tests) function (compiz_ensure_linkage) find_program (LDCONFIG_EXECUTABLE ldconfig) mark_as_advanced (FORCE LDCONFIG_EXECUTABLE) if (LDCONFIG_EXECUTABLE AND ${COMPIZ_RUN_LDCONFIG}) install ( CODE "message (\"Running \" ${LDCONFIG_EXECUTABLE} \" \" ${CMAKE_INSTALL_PREFIX} \"/lib\") exec_program (${LDCONFIG_EXECUTABLE} ARGS \"-v\" ${CMAKE_INSTALL_PREFIX}/lib)" ) endif (LDCONFIG_EXECUTABLE AND ${COMPIZ_RUN_LDCONFIG}) endfunction () macro (compiz_add_git_dist) add_custom_target (dist COMMAND bzr export --root=${CMAKE_PROJECT_NAME}-${VERSION} ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) endmacro () macro (compiz_add_distcheck) add_custom_target (distcheck COMMAND mkdir -p ${CMAKE_BINARY_DIR}/dist-build && cp ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2 ${CMAKE_BINARY_DIR}/dist-build && cd ${CMAKE_BINARY_DIR}/dist-build && tar xvf ${CMAKE_BINARY_DIR}/dist-build/${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2 && mkdir -p ${CMAKE_BINARY_DIR}/dist-build/${CMAKE_PROJECT_NAME}-${VERSION}/build && cd ${CMAKE_BINARY_DIR}/dist-build/${CMAKE_PROJECT_NAME}-${VERSION}/build && cmake -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/dist-build/buildroot -DCOMPIZ_PLUGIN_INSTALL_TYPE='package' .. -DCMAKE_MODULE_PATH=/usr/share/cmake -DCOMPIZ_DISABLE_PLUGIN_KDE=ON -DBUILD_KDE4=OFF && make && make test && make install WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) add_dependencies (distcheck dist) endmacro () macro (compiz_add_release_signoff) set (AUTO_VERSION_UPDATE "" CACHE STRING "Automatically update VERSION to this number") if (AUTO_VERSION_UPDATE) message ("-- Next version will be " ${AUTO_VERSION_UPDATE}) endif (AUTO_VERSION_UPDATE) add_custom_target (release-signoff) add_custom_target (release-update-working-tree COMMAND cp NEWS ${CMAKE_SOURCE_DIR} && bzr add ${CMAKE_SOURCE_DIR}/NEWS && cp AUTHORS ${CMAKE_SOURCE_DIR} && bzr add ${CMAKE_SOURCE_DIR}/AUTHORS COMMENT "Updating working tree" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) # TODO add_custom_target (release-commits) add_custom_target (release-tags) add_custom_target (release-branch) add_custom_target (release-update-dist) add_custom_target (release-version-bump) add_custom_target (release-sign-tarballs COMMAND gpg --armor --sign --detach-sig ${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2 COMMENT "Signing tarball" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_custom_target (release-sha1-tarballs COMMAND sha1sum ${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2 > ${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2.sha1 COMMENT "SHA1Summing tarball" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_custom_target (release-sign-sha1-tarballs COMMAND gpg --armor --sign --detach-sig ${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2.sha1 COMMENT "Signing SHA1Sum checksum" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_dependencies (release-commits release-update-working-tree) add_dependencies (release-tags release-commits) add_dependencies (release-branch release-tags) add_dependencies (release-update-dist release-branch) add_dependencies (release-version-bump release-update-dist) add_dependencies (release-sign-tarballs release-version-bump) add_dependencies (release-sha1-tarballs release-sign-tarballs) add_dependencies (release-sign-sha1-tarballs release-sha1-tarballs) add_dependencies (release-signoff release-sign-sha1-tarballs) # Actually pushes the release add_custom_target (push-master) add_custom_target (push-release-branch) add_custom_target (push-tag) add_custom_target (release-push) add_dependencies (release-push push-release-branch) add_dependencies (push-release-branch push-tag) add_dependencies (push-tag push-master) # Push the tarball to releases.compiz.org # Does nothing for now add_custom_target (release-upload-component) add_custom_target (release-upload) add_dependencies (release-upload-component release-upload-version) add_dependencies (release-upload release-upload-component) endmacro () macro (compiz_add_release) set (AUTO_NEWS_UPDATE "" CACHE STRING "Value to insert into NEWS file, leave blank to get an editor when running make news-update") if (AUTO_NEWS_UPDATE) message ("-- Using auto news update: " ${AUTO_NEWS_UPDATE}) endif (AUTO_NEWS_UPDATE) if (NOT EXISTS ${CMAKE_SOURCE_DIR}/.AUTHORS.sed) file (WRITE ${CMAKE_SOURCE_DIR}/.AUTHORS.sed "") endif (NOT EXISTS ${CMAKE_SOURCE_DIR}/.AUTHORS.sed) add_custom_target (authors COMMAND bzr log --long --levels=0 | grep -e "^\\s*author:" -e "^\\s*committer:" | cut -d ":" -f 2 | sed -r -f ${CMAKE_SOURCE_DIR}/.AUTHORS.sed | sort -u > AUTHORS COMMENT "Generating AUTHORS") if (AUTO_NEWS_UPDATE) add_custom_target (news-header echo > ${CMAKE_BINARY_DIR}/NEWS.update COMMAND echo "Release ${VERSION} ('`date +%Y-%m-%d`' '`bzr config email`')" > ${CMAKE_BINARY_DIR}/NEWS.update && seq -s "=" `cat ${CMAKE_BINARY_DIR}/NEWS.update | wc -c` | sed 's/[0-9]//g' >> ${CMAKE_BINARY_DIR}/NEWS.update && echo '${AUTO_NEWS_UPDATE}' >> ${CMAKE_BINARY_DIR}/NEWS.update && echo >> ${CMAKE_BINARY_DIR}/NEWS.update COMMENT "Generating NEWS Header" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) else (AUTO_NEWS_UPDATE) add_custom_target (news-header echo > ${CMAKE_BINARY_DIR}/NEWS.update COMMAND echo "Release ${VERSION} ('`date +%Y-%m-%d`' '`bzr config email`')" > ${CMAKE_BINARY_DIR}/NEWS.update && seq -s "=" `cat ${CMAKE_BINARY_DIR}/NEWS.update | wc -c` | sed 's/[0-9]//g' >> ${CMAKE_BINARY_DIR}/NEWS.update && $ENV{EDITOR} ${CMAKE_BINARY_DIR}/NEWS.update && echo >> ${CMAKE_BINARY_DIR}/NEWS.update COMMENT "Generating NEWS Header" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) endif (AUTO_NEWS_UPDATE) add_custom_target (news COMMAND cat ${CMAKE_SOURCE_DIR}/NEWS > NEWS.old && cat NEWS.old >> NEWS.update && cat NEWS.update > NEWS WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_dependencies (news-header authors) add_dependencies (news news-header) add_custom_target (release-prep) add_dependencies (release-prep news) endmacro (compiz_add_release) # unsets the given variable macro (compiz_unset var) set (${var} "" CACHE INTERNAL "") endmacro () # sets the given variable macro (compiz_set var value) set (${var} ${value} CACHE INTERNAL "") endmacro () macro (compiz_format_string str length return) string (LENGTH "${str}" _str_len) math (EXPR _add_chr "${length} - ${_str_len}") set (${return} "${str}") while (_add_chr GREATER 0) set (${return} "${${return}} ") math (EXPR _add_chr "${_add_chr} - 1") endwhile () endmacro () string (ASCII 27 _escape) function (compiz_color_message _str) if (CMAKE_COLOR_MAKEFILE) message (${_str}) else () string (REGEX REPLACE "${_escape}.[0123456789;]*m" "" __str ${_str}) message (${__str}) endif () endfunction () function (compiz_configure_file _src _dst) foreach (_val ${ARGN}) set (_${_val}_sav ${${_val}}) set (${_val} "") foreach (_word ${_${_val}_sav}) set (${_val} "${${_val}}${_word} ") endforeach (_word ${_${_val}_sav}) endforeach (_val ${ARGN}) configure_file (${_src} ${_dst} @ONLY) foreach (_val ${ARGN}) set (${_val} ${_${_val}_sav}) set (_${_val}_sav "") endforeach (_val ${ARGN}) endfunction () macro (compiz_add_plugins_in_folder folder) set (COMPIZ_PLUGIN_PACK_BUILD 1) file ( GLOB _plugins_in RELATIVE "${folder}" "${folder}/*/CMakeLists.txt" ) foreach (_plugin ${_plugins_in}) get_filename_component (_plugin_dir ${_plugin} PATH) string (TOUPPER ${_plugin_dir} _plugin_upper) if (NOT COMPIZ_DISABLE_PLUGIN_${_plugin_upper}) add_subdirectory (${folder}/${_plugin_dir}) set (COMPIZ_ENABLED_PLUGIN_${_plugin_upper} Y CACHE INTERNAL "") endif () endforeach () endmacro () #### pkg-config handling include (FindPkgConfig) function (compiz_pkg_check_modules _var _req) if (NOT ${_var}) pkg_check_modules (${_var} ${_req} ${ARGN}) if (${_var}_FOUND) set (${_var} 1 CACHE INTERNAL "" FORCE) endif () set(__pkg_config_checked_${_var} 0 CACHE INTERNAL "" FORCE) endif () endfunction () #### translations # translate metadata file function (compiz_translate_xml _src _dst) find_program (INTLTOOL_MERGE_EXECUTABLE intltool-merge) mark_as_advanced (FORCE INTLTOOL_MERGE_EXECUTABLE) set (_additional_arg -x -u ${COMPIZ_I18N_DIR}) foreach (_arg ${ARGN}) if ("${_arg}" STREQUAL "NOTRANSLATIONS") set (_additional_arg --no-translations -x -u) endif ("${_arg}" STREQUAL "NOTRANSLATIONS") endforeach (_arg ${ARGN}) if (INTLTOOL_MERGE_EXECUTABLE AND COMPIZ_I18N_DIR AND EXISTS ${COMPIZ_I18N_DIR}) add_custom_command ( OUTPUT ${_dst} COMMAND ${INTLTOOL_MERGE_EXECUTABLE} -c ${CMAKE_BINARY_DIR}/.intltool-merge-cache ${_additional_arg} ${_src} ${_dst} DEPENDS ${_src} ) else () add_custom_command ( OUTPUT ${_dst} COMMAND cat ${_src} | sed -e 's:<_:<:g' -e 's: ${_dst} DEPENDS ${_src} ) endif () endfunction () function (compiz_translate_desktop_file _src _dst) find_program (INTLTOOL_MERGE_EXECUTABLE intltool-merge) mark_as_advanced (FORCE INTLTOOL_MERGE_EXECUTABLE) if (INTLTOOL_MERGE_EXECUTABLE AND COMPIZ_I18N_DIR AND EXISTS ${COMPIZ_I18N_DIR}) add_custom_command ( OUTPUT ${_dst} COMMAND ${INTLTOOL_MERGE_EXECUTABLE} -d -u -c ${CMAKE_BINARY_DIR}/.intltool-merge-cache ${COMPIZ_I18N_DIR} ${_src} ${_dst} DEPENDS ${_src} ) else () add_custom_command ( OUTPUT ${_dst} COMMAND cat ${_src} | sed -e 's:^_::g' > ${_dst} DEPENDS ${_src} ) endif () endfunction () #### modules / tests macro (_get_parameters _prefix) set (_current_var _foo) set (_supported_var PKGDEPS PLUGINDEPS MODULES LDFLAGSADD CFLAGSADD LIBRARIES LIBDIRS INCDIRS DEFSADD) foreach (_val ${_supported_var}) set (${_prefix}_${_val}) endforeach (_val) foreach (_val ${ARGN}) set (_found FALSE) foreach (_find ${_supported_var}) if ("${_find}" STREQUAL "${_val}") set (_found TRUE) endif ("${_find}" STREQUAL "${_val}") endforeach (_find) if (_found) set (_current_var ${_prefix}_${_val}) else (_found) list (APPEND ${_current_var} ${_val}) endif (_found) endforeach (_val) endmacro (_get_parameters) macro (_check_pkg_deps _prefix) set (${_prefix}_HAS_PKG_DEPS TRUE) foreach (_val ${ARGN}) string (REGEX REPLACE "[<>=\\.]" "_" _name ${_val}) string (TOUPPER ${_name} _name) compiz_pkg_check_modules (_${_name} ${_val}) if (_${_name}_FOUND) list (APPEND ${_prefix}_PKG_LIBDIRS "${_${_name}_LIBRARY_DIRS}") list (APPEND ${_prefix}_PKG_LIBRARIES "${_${_name}_LIBRARIES}") list (APPEND ${_prefix}_PKG_INCDIRS "${_${_name}_INCLUDE_DIRS}") else (_${_name}_FOUND) set (${_prefix}_HAS_PKG_DEPS FALSE) compiz_set (${_prefix}_MISSING_DEPS "${${_prefix}_MISSING_DEPS} ${_val}") set(__pkg_config_checked__${_name} 0 CACHE INTERNAL "" FORCE) endif (_${_name}_FOUND) endforeach () endmacro (_check_pkg_deps) macro (_build_include_flags _prefix) foreach (_include ${ARGN}) if (NOT ${_prefix}_INCLUDE_CFLAGS) compiz_set (${_prefix}_INCLUDE_CFLAGS "" PARENT_SCOPE) endif (NOT ${_prefix}_INCLUDE_CFLAGS) list (APPEND ${_prefix}_INCLUDE_CFLAGS -I${_include}) endforeach (_include) endmacro (_build_include_flags) macro (_build_definitions_flags _prefix) foreach (_def ${ARGN}) if (NOT ${_prefix}_DEFINITIONS_CFLAGS) compiz_set (${_prefix}_DEFINITIONS_CFLAGS "") endif (NOT ${_prefix}_DEFINITIONS_CFLAGS) list (APPEND ${_prefix}_DEFINITIONS_CFLAGS -D${_def}) endforeach (_def) endmacro (_build_definitions_flags) macro (_build_link_dir_flags _prefix) foreach (_link_dir ${ARGN}) if (NOT ${_prefix}_LINK_DIR_LDFLAGS) compiz_set (${_prefix}_LINK_DIR_LDFLAGS "") endif (NOT ${_prefix}_LINK_DIR_LDFLAGS) list (APPEND ${_prefix}_LINK_DIR_LDFLAGS -L${_link_dir}) endforeach (_link_dir) endmacro (_build_link_dir_flags) macro (_build_library_flags _prefix) foreach (_library ${ARGN}) if (NOT ${_prefix}_LIBRARY_LDFLAGS) compiz_set (${_prefix}_LIBRARY_LDFLAGS "") endif (NOT ${_prefix}_LIBRARY_LDFLAGS) list (APPEND ${_prefix}_LIBRARY_LDFLAGS -l${_library}) endforeach (_library) endmacro (_build_library_flags) function (_build_compiz_module _prefix _name _full_prefix) if (${_full_prefix}_INCLUDE_DIRS) _build_include_flags (${_full_prefix} ${${_full_prefix}_INCLUDE_DIRS}) endif (${_full_prefix}_INCLUDE_DIRS) _build_include_flags (${_full_prefix} ${${_full_prefix}_SOURCE_DIR}) _build_include_flags (${_full_prefix} ${${_full_prefix}_INCLUDE_DIR}) if (${_full_prefix}_DEFSADD) _build_definitions_flags (${_full_prefix} ${${_full_prefix}_DEFSADD}) endif (${_full_prefix}_DEFSADD) if (${_full_prefix}_LIBRARY_DIRS) _build_link_dir_flags (${_full_prefix} ${${_full_prefix}_LIBRARY_DIRS}) endif (${_full_prefix}_LIBRARY_DIRS) if (${_full_prefix}_LIBRARIES) _build_library_flags (${_full_prefix} ${${_full_prefix}_LIBRARIES}) endif (${_full_prefix}_LIBRARIES) file (GLOB _cpp_files "${${_full_prefix}_SOURCE_DIR}/*.cpp") add_library (${_prefix}_${_name}_internal STATIC ${_cpp_files}) target_link_libraries (${_prefix}_${_name}_internal ${${_full_prefix}_LIBRARIES} m pthread dl) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_INCLUDE_CFLAGS}) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_DEFINITIONS_CFLAGS}) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_CFLAGSADD}) set (${_full_prefix}_COMPILE_FLAGS_STR " ") foreach (_flag ${${_full_prefix}_COMPILE_FLAGS}) set (${_full_prefix}_COMPILE_FLAGS_STR "${_flag} ${${_full_prefix}_COMPILE_FLAGS_STR}") endforeach (_flag) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LINK_LDFLAGS}) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LDFLAGSADD}) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LIBARY_FLAGS}) set (${_full_prefix}_LINK_FLAGS_STR " ") foreach (_flag ${${_full_prefix}_LINK_FLAGS}) set (${_full_prefix}_LINK_FLAGS_STR "${_flag} ${${_full_prefix}_LINK_FLAGS_STR}") endforeach (_flag) set_target_properties (${_prefix}_${_name}_internal PROPERTIES COMPILE_FLAGS ${${_full_prefix}_COMPILE_FLAGS_STR} LINK_FLAGS ${${_full_prefix}_LINK_FLAGS_STR}) file (GLOB _h_files "${_full_prefix}_INCLUDE_DIR/*.h") foreach (_file ${_h_files}) install ( FILES ${_file} DESTINATION ${includedir}/compiz/${_prefix} ) endforeach (_file) endfunction (_build_compiz_module) macro (compiz_module _prefix _name) string (TOUPPER ${_prefix} _PREFIX) string (TOUPPER ${_name} _NAME) set (_FULL_PREFIX ${_PREFIX}_${_NAME}) _get_parameters (${_FULL_PREFIX} ${ARGN}) _check_pkg_deps (${_FULL_PREFIX} ${${_FULL_PREFIX}_PKGDEPS}) if (${_FULL_PREFIX}_HAS_PKG_DEPS) list (APPEND ${_FULL_PREFIX}_LIBRARIES ${${_FULL_PREFIX}_PKG_LIBRARIES}) list (APPEND ${_FULL_PREFIX}_INCLUDE_DIRS ${${_FULL_PREFIX}_INCDIRS}) list (APPEND ${_FULL_PREFIX}_INCLUDE_DIRS ${${_FULL_PREFIX}_PKG_INCDIRS}) list (APPEND ${_FULL_PREFIX}_LIBRARY_DIRS ${${_FULL_PREFIX}_LIBDIRS}) list (APPEND ${_FULL_PREFIX}_LIBRARY_DIRS ${${_FULL_PREFIX}_PKG_LIBDIRS}) # also add modules foreach (_module ${${_FULL_PREFIX}_MODULES}) string (TOUPPER ${_module} _MODULE) list (APPEND ${_FULL_PREFIX}_INCLUDE_DIRS ${${_MODULE}_INCLUDE_DIR}) list (APPEND ${_FULL_PREFIX}_LIBRARY_DIRS ${${_MODULE}_BINARY_DIR}) list (APPEND ${_FULL_PREFIX}_LIBRARIES ${_module}_internal) endforeach (_module) compiz_set (${_FULL_PREFIX}_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${_name}) compiz_set (${_FULL_PREFIX}_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${_name}/src) compiz_set (${_FULL_PREFIX}_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${_name}/include) compiz_set (${_FULL_PREFIX}_TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${_name}tests) # Need to abuse set_property here since set () with CACHE INTERNAL will save the # value to the cache which we will just read right back (but we need to regenerate that) set_property (GLOBAL APPEND PROPERTY ${_PREFIX}_MOD_LIBRARY_DIRS ${${_FULL_PREFIX}_BINARY_DIR}) set_property (GLOBAL APPEND PROPERTY ${_PREFIX}_MOD_INCLUDE_DIRS ${${_FULL_PREFIX}_INCLUDE_DIR}) set_property (GLOBAL APPEND PROPERTY ${_PREFIX}_MOD_INCLUDE_DIRS ${${_FULL_PREFIX}_SOURCE_DIR}) set_property (GLOBAL APPEND PROPERTY ${_PREFIX}_MOD_LIBRARIES ${_prefix}_${_name}_internal) _build_compiz_module (${_prefix} ${_name} ${_FULL_PREFIX}) add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/${_name}/tests) else (${_FULL_PREFIX}_HAS_PKG_DEPS) message (STATUS "[WARNING] One or more dependencies for module ${_name} for ${_prefix} not found. Skipping module.") message (STATUS "Missing dependencies :${${_FULL_PREFIX}_MISSING_DEPS}") compiz_set (${_FULL_PREFIX}_BUILD FALSE) endif (${_FULL_PREFIX}_HAS_PKG_DEPS) endmacro (compiz_module) function (_build_compiz_test_base _prefix _module _full_prefix) file (GLOB _cpp_files "${${_FULL_TEST_BASE_PREFIX}_SOURCE_DIR}/*.cpp") if (${_full_prefix}_INCLUDE_DIRS) _build_include_flags (${_full_prefix} ${${_full_prefix}_INCLUDE_DIRS}) endif (${_full_prefix}_INCLUDE_DIRS) _build_include_flags (${_full_prefix} ${${_full_prefix}_SOURCE_DIR}) _build_include_flags (${_full_prefix} ${${_full_prefix}_INCLUDE_DIR}) if (${_full_prefix}_DEFSADD) _build_definitions_flags (${_full_prefix} ${${_full_prefix}_DEFSADD}) endif (${_full_prefix}_DEFSADD) if (${_full_prefix}_LIBRARY_DIRS) _build_link_dir_flags (${_full_prefix} ${${_full_prefix}_LIBRARY_DIRS}) endif (${_full_prefix}_LIBRARY_DIRS) if (${_full_prefix}_LIBRARIES) _build_library_flags (${_full_prefix} ${${_full_prefix}_LIBRARIES}) endif (${_full_prefix}_LIBRARIES) add_library (${_prefix}_${_module}_test_internal STATIC ${_cpp_files}) target_link_libraries (${_prefix}_${_module}_test_internal ${${_full_prefix}_LIBRARIES} ${_prefix}_${_module}_internal) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_INCLUDE_CFLAGS}) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_DEFINITIONS_CFLAGS}) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_CFLAGSADD}) set (${_full_prefix}_COMPILE_FLAGS_STR " ") foreach (_flag ${${_full_prefix}_COMPILE_FLAGS}) set (${_full_prefix}_COMPILE_FLAGS_STR "${_flag} ${${_full_prefix}_COMPILE_FLAGS_STR}") endforeach (_flag) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LINK_LDFLAGS}) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LDFLAGSADD}) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LIBARY_FLAGS}) set (${_full_prefix}_LINK_FLAGS_STR " ") foreach (_flag ${${_full_prefix}_LINK_FLAGS}) set (${_full_prefix}_LINK_FLAGS_STR "${_flag} ${${_full_prefix}_LINK_FLAGS_STR}") endforeach (_flag) set_target_properties (${_prefix}_${_module}_test_internal PROPERTIES COMPILE_FLAGS "${${_full_prefix}_COMPILE_FLAGS_STR}" LINK_FLAGS "${${_full_prefix}_LINK_FLAGS_STR}") endfunction (_build_compiz_test_base) macro (compiz_test_base _prefix _module) string (TOUPPER ${_prefix} _PREFIX) string (TOUPPER ${_module} _MODULE) set (_FULL_MODULE_PREFIX ${_PREFIX}_${_NAME}) set (_FULL_TEST_BASE_PREFIX ${_FULL_MODULE_PREFIX}_TEST_BASE) _get_parameters (${_FULL_TEST_BASE_PREFIX} ${ARGN}) _check_pkg_deps (${_FULL_TEST_BASE_PREFIX} ${${_FULL_TEST_BASE_PREFIX}_PKGDEPS}) if (${_FULL_TEST_BASE_PREFIX}_HAS_PKG_DEPS) list (APPEND ${_FULL_TEST_BASE_PREFIX}_LIBRARIES ${${_FULL_TEST_BASE_PREFIX}_PKG_LIBDIRS}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_BASE_PREFIX}_INCDIRS}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_BASE_PREFIX}_PKG_INCDIRS}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_LIBRARY_DIRS ${${_FULL_TEST_BASE_PREFIX}_LIBDIRS}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_LIBRARY_DIRS ${${_FULL_TEST_BASE_PREFIX}_PKG_LIBDIRS}) compiz_set (${_FULL_TEST_BASE_PREFIX}_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) compiz_set (${_FULL_TEST_BASE_PREFIX}_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) compiz_set (${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIRS ${${_FULL_MODULE_PREFIX}_INCLUDE_DIRS}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIRS ${${_FULL_MODULE_PREFIX}_INCLUDE_DIR}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIRS ${${_FULL_MODULE_PREFIX}_SOURCE_DIR}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_LIBRARY_DIRS ${${_FULL_MODULE_PREFIX}_LIBRARY_DIRS}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_LIBRARY_DIRS ${${_FULL_MODULE_PREFIX}_BINARY_DIR}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_LIBRARIES ${${_FULL_MODULE_PREFIX}_LIBRARIES}) _build_compiz_test_base (${_prefix} ${_module} ${_FULL_TEST_BASE_PREFIX}) else (${_FULL_TEST_BASE_PREFIX}_HAS_PKG_DEPS) message (STATUS "[WARNING] One or more dependencies for test base on module ${_module} for ${_prefix} not found. Skipping test base.") message (STATUS "Missing dependencies :${${_FULL_TEST_BASE_PREFIX}_MISSING_DEPS}") compiz_set (${_FULL_TEST_BASE_PREFIX}_BUILD FALSE) endif (${_FULL_TEST_BASE_PREFIX}_HAS_PKG_DEPS) endmacro (compiz_test_base) function (_build_compiz_test _prefix _module _test _full_prefix) file (GLOB _cpp_files "${${_FULL_TEST_PREFIX}_SOURCE_DIR}/*.cpp") if (${_full_prefix}_INCLUDE_DIRS) _build_include_flags (${_full_prefix} ${${_full_prefix}_INCLUDE_DIRS}) endif (${_full_prefix}_INCLUDE_DIRS) _build_include_flags (${_full_prefix} ${${_full_prefix}_SOURCE_DIR}) _build_include_flags (${_full_prefix} ${${_full_prefix}_INCLUDE_DIR}) if (${_full_prefix}_DEFSADD) _build_definitions_flags (${_full_prefix} ${${_full_prefix}_DEFSADD}) endif (${_full_prefix}_DEFSADD) if (${_full_prefix}_LIBRARY_DIRS) _build_link_dir_flags (${_full_prefix} ${${_full_prefix}_LIBRARY_DIRS}) endif (${_full_prefix}_LIBRARY_DIRS) if (${_full_prefix}_LIBRARIES) _build_library_flags (${_full_prefix} ${${_full_prefix}_LIBRARIES}) endif (${_full_prefix}_LIBRARIES) add_executable (${_prefix}_${_module}_${_test}_test ${_cpp_files}) target_link_libraries (${_prefix}_${_module}_${_test}_test ${${_full_prefix}_LIBRARIES} ${_prefix}_${_module}_internal ${_prefix}_${_module}_test_internal) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_INCLUDE_CFLAGS}) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_DEFINITIONS_CFLAGS}) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_CFLAGSADD}) set (${_full_prefix}_COMPILE_FLAGS_STR " ") foreach (_flag ${${_full_prefix}_COMPILE_FLAGS}) set (${_full_prefix}_COMPILE_FLAGS_STR "${_flag} ${${_full_prefix}_COMPILE_FLAGS_STR}") endforeach (_flag) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LINK_LDFLAGS}) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LDFLAGSADD}) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LIBARY_FLAGS}) set (${_full_prefix}_LINK_FLAGS_STR " ") foreach (_flag ${${_full_prefix}_LINK_FLAGS}) set (${_full_prefix}_LINK_FLAGS_STR "${_flag} ${${_full_prefix}_LINK_FLAGS_STR}") endforeach (_flag) set_target_properties (${_prefix}_${_module}_${_test}_test PROPERTIES COMPILE_FLAGS "${${_full_prefix}_COMPILE_FLAGS_STR}" LINK_FLAGS "${${_full_prefix}_LINK_FLAGS_STR}") add_test (test-${_prefix}-${_module}-${_test} ${CMAKE_CURRENT_BINARY_DIR}/${_prefix}_${_module}_${_test}_test) endfunction (_build_compiz_test) macro (compiz_test _prefix _module _test) set (_supported_var PKGDEPS LDFLAGSADD CFLAGSADD LIBRARIES LIBDIRS INCDIRS DEFSADD) set (_FULL_TEST_PREFIX ${_FULL_MODULE_PREFIX}_TEST) _get_parameters (${_FULL_TEST_PREFIX} ${ARGN}) _check_pkg_deps (${_FULL_TEST_PREFIX} ${${_FULL_TEST_PREFIX}_PKGDEPS}) if (${_FULL_TEST_PREFIX}_HAS_PKG_DEPS) list (APPEND ${_FULL_TEST_PREFIX}_LIBRARIES ${${_FULL_TEST_PREFIX}_PKG_LIBDIRS}) list (APPEND ${_FULL_TEST_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_PREFIX}_INCDIRS}) list (APPEND ${_FULL_TEST_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_PREFIX}_PKG_INCDIRS}) list (APPEND ${_FULL_TEST_PREFIX}_LIBRARY_DIRS ${${_FULL_TEST_PREFIX}_LIBDIRS}) list (APPEND ${_FULL_TEST_PREFIX}_LIBRARY_DIRS ${${_FULL_TEST_PREFIX}_PKG_LIBDIRS}) compiz_set (${_FULL_TEST_PREFIX}_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) compiz_set (${_FULL_TEST_PREFIX}_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) compiz_set (${_FULL_TEST_PREFIX}_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) list (APPEND ${_FULL_TEST_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIRS}) list (APPEND ${_FULL_TEST_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIR}) list (APPEND ${_FULL_TEST_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_BASE_PREFIX}_SOURCE_DIR}) list (APPEND ${_FULL_TEST_PREFIX}_LIBRARY_DIRS ${${_FULL_TEST_BASE_PREFIX}_LIBRARY_DIRS}) list (APPEND ${_FULL_TEST_PREFIX}_LIBRARY_DIRS ${${_FULL_TEST_BASE_PREFIX}_BINARY_DIR}) list (APPEND ${_FULL_TEST_PREFIX}_LIBRARIES ${${_FULL_TEST_BASE_PREFIX}_LIBRARIES}) _build_compiz_test (${_prefix} ${_module} ${_test} ${_FULL_TEST_PREFIX}) else (${_FULL_TEST_PREFIX}_HAS_PKG_DEPS) message (STATUS "[WARNING] One or more dependencies for test ${_test} on module ${_name} for ${_prefix} not found. Skipping test.") message (STATUS "Missing dependencies :${${_FULL_TEST_PREFIX}_MISSING_DEPS}") compiz_set (${_FULL_TEST_PREFIX}_BUILD FALSE) endif (${_FULL_TEST_PREFIX}_HAS_PKG_DEPS) endmacro (compiz_test) #### optional file install function (compiz_opt_install_file _src _dst) install (CODE "message (\"-- Installing: ${_dst}\") execute_process ( COMMAND ${CMAKE_COMMAND} -E copy_if_different \"${_src}\" \"$ENV{DESTDIR}${_dst}\" RESULT_VARIABLE _result OUTPUT_QUIET ERROR_QUIET ) if (_result) message (\"-- Failed to install: ${_dst}\") endif () " ) endfunction () #### uninstall function (compiz_add_code_to_uninstall_target CODE WORKING_DIRECTORY) set_property (GLOBAL APPEND PROPERTY COMPIZ_UNINSTALL_CODE_TARGETS ${CODE}) set_property (GLOBAL APPEND PROPERTY COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS ${WORKING_DIRECTORY}) endfunction () macro (compiz_add_uninstall) if (NOT _compiz_uninstall_rule_created) compiz_set(_compiz_uninstall_rule_created TRUE) set (_file "${CMAKE_BINARY_DIR}/cmake_uninstall.cmake") file (WRITE ${_file} "message (STATUS \"Uninstalling\")\n") get_property (COMPIZ_UNINSTALL_CODE_TARGETS_SET GLOBAL PROPERTY COMPIZ_UNINSTALL_CODE_TARGETS SET) get_property (COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS_SET GLOBAL PROPERTY COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS SET) if (COMPIZ_UNINSTALL_CODE_TARGETS_SET AND COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS_SET) get_property (COMPIZ_UNINSTALL_CODE_TARGETS GLOBAL PROPERTY COMPIZ_UNINSTALL_CODE_TARGETS) get_property (COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS GLOBAL PROPERTY COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS) list (LENGTH COMPIZ_UNINSTALL_CODE_TARGETS COMPIZ_UNINSTALL_CODE_TARGETS_LEN) math (EXPR COMPIZ_UNINSTALL_CODE_TARGETS_RANGE "${COMPIZ_UNINSTALL_CODE_TARGETS_LEN} - 1") foreach (ITER RANGE ${COMPIZ_UNINSTALL_CODE_TARGETS_RANGE}) list (GET COMPIZ_UNINSTALL_CODE_TARGETS ${ITER} CODE_TARGET) list (GET COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS ${ITER} WORKING_DIRECTORY_TARGET) file (APPEND ${_file} "message (STATUS \"Executing custom uninstall script ${CODE_TARGET}\")\n") file (APPEND ${_file} "execute_process (COMMAND ${CODE_TARGET}\n") file (APPEND ${_file} " WORKING_DIRECTORY \"${WORKING_DIRECTORY_TARGET}\"\n") file (APPEND ${_file} " OUTPUT_VARIABLE cmd_output\n") file (APPEND ${_file} " RESULT_VARIABLE cmd_ret)\n") file (APPEND ${_file} "message (\"\${cmd_output}\")\n") file (APPEND ${_file} "if (NOT \"\${cmd_ret}\" STREQUAL 0)\n") file (APPEND ${_file} " message (FATAL_ERROR \"Problem executing uninstall script ${CODE_TARGET} : \${cmd_ret}\")\n") file (APPEND ${_file} "endif (NOT \"\${cmd_ret}\" STREQUAL 0)\n") endforeach () endif (COMPIZ_UNINSTALL_CODE_TARGETS_SET AND COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS_SET) # Get the code that we need to uninstall, and write it out to the file file (APPEND ${_file} "if (NOT EXISTS \"${CMAKE_BINARY_DIR}/install_manifest.txt\")\n") file (APPEND ${_file} " message (FATAL_ERROR \"Cannot find install manifest: \\\"${CMAKE_BINARY_DIR}/install_manifest.txt\\\"\")\n") file (APPEND ${_file} "endif (NOT EXISTS \"${CMAKE_BINARY_DIR}/install_manifest.txt\")\n\n") file (APPEND ${_file} "file (READ \"${CMAKE_BINARY_DIR}/install_manifest.txt\" files)\n") file (APPEND ${_file} "string (REGEX REPLACE \"\\n\" \";\" files \"\${files}\")\n") file (APPEND ${_file} "foreach (file \${files})\n") file (APPEND ${_file} " message (STATUS \"Uninstalling \\\"\${file}\\\"\")\n") file (APPEND ${_file} " if (EXISTS \"\${file}\")\n") file (APPEND ${_file} " exec_program(\n") file (APPEND ${_file} " \"${CMAKE_COMMAND}\" ARGS \"-E remove \\\"\${file}\\\"\"\n") file (APPEND ${_file} " OUTPUT_VARIABLE rm_out\n") file (APPEND ${_file} " RETURN_VALUE rm_retval\n") file (APPEND ${_file} " )\n") file (APPEND ${_file} " if (\"\${rm_retval}\" STREQUAL 0)\n") file (APPEND ${_file} " else (\"\${rm_retval}\" STREQUAL 0)\n") file (APPEND ${_file} " message (FATAL_ERROR \"Problem when removing \\\"\${file}\\\"\")\n") file (APPEND ${_file} " endif (\"\${rm_retval}\" STREQUAL 0)\n") file (APPEND ${_file} " else (EXISTS \"\${file}\")\n") file (APPEND ${_file} " message (STATUS \"File \\\"\${file}\\\" does not exist.\")\n") file (APPEND ${_file} " endif (EXISTS \"\${file}\")\n") file (APPEND ${_file} "endforeach (file)\n") add_custom_target(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_BINARY_DIR}/cmake_uninstall.cmake") endif () endmacro () #posix 2008 scandir check if (CMAKE_CXX_COMPILER) include (CheckCXXSourceCompiles) CHECK_CXX_SOURCE_COMPILES ( "# include int func (const char *d, dirent ***list, void *sort) { int n = scandir(d, list, 0, (int(*)(const dirent **, const dirent **))sort); return n; } int main (int, char **) { return 0; } " HAVE_SCANDIR_POSIX) endif (CMAKE_CXX_COMPILER) if (HAVE_SCANDIR_POSIX) add_definitions (-DHAVE_SCANDIR_POSIX) endif () compiz-0.9.11+14.04.20140409/cmake/CompizDefaults.cmake0000644000015301777760000000117512321343002022511 0ustar pbusernogroup00000000000000set (COMPIZ_PREFIX ${CMAKE_INSTALL_PREFIX}) set (COMPIZ_INCLUDEDIR ${includedir}) set (COMPIZ_CORE_INCLUDE_DIR ${includedir}/compiz/core) set (COMPIZ_LIBDIR ${libdir}) list (APPEND COMPIZ_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include) list (APPEND COMPIZ_INCLUDE_DIRS ${CMAKE_BINARY_DIR}) set (COMPIZ_BCOP_XSLT ${CMAKE_SOURCE_DIR}/xslt/bcop.xslt) set (COMPIZ_GCONF_SCHEMAS_SUPPORT ${USE_GCONF}) set (COMPIZ_GCONF_SCHEMAS_XSLT ${CMAKE_SOURCE_DIR}/xslt/compiz_gconf_schemas.xslt) set (COMPIZ_GSETTINGS_SCHEMAS_XSLT ${CMAKE_BINARY_DIR}/xslt/compiz_gsettings_schemas.xslt) set (COMPIZ_PLUGIN_INSTALL_TYPE "package") set (_COMPIZ_INTERNAL 1) compiz-0.9.11+14.04.20140409/cmake/opt_install_file.cmake0000644000015301777760000000052712321343002023107 0ustar pbusernogroup00000000000000set (src "" CACHE STRING "Source") set (dst "" CACHE STRING "Destination") message (\"-- Installing: ${src}\") execute_process ( COMMAND ${CMAKE_COMMAND} -E copy_if_different \"${src}\" \"$ENV{DESTDIR}${dst}\" RESULT_VARIABLE _result OUTPUT_QUIET ERROR_QUIET ) if (_result) message (\"-- Failed to install: ${dst}\") endif () compiz-0.9.11+14.04.20140409/cmake/CMakeLists.txt0000644000015301777760000000261312321343002021314 0ustar pbusernogroup00000000000000compiz_configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/CompizDefaults.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CompizDefaults.cmake ) set (_files CompizCommon.cmake CompizPlugin.cmake CompizPackage.cmake CompizBcop.cmake copy_file_install_user_env.cmake recompile_gsettings_schemas_in_dir_user_env.cmake ${CMAKE_CURRENT_BINARY_DIR}/CompizDefaults.cmake ) list (APPEND _PluginExtensionFiles plugin_extensions/CompizGenInstallData.cmake) list (APPEND _PluginExtensionFiles plugin_extensions/CompizGenInstallImages.cmake) list (APPEND _PluginExtensionFiles plugin_extensions/CompizOpenGLFixups.cmake) if (USE_GCONF) list (APPEND _files CompizGconf.cmake) list (APPEND _PluginExtensionFiles plugin_extensions/CompizGenGconf.cmake) endif (USE_GCONF) if (USE_GSETTINGS) list (APPEND _files CompizGSettings.cmake) list (APPEND _PluginExtensionFiles plugin_extensions/CompizGenGSettings.cmake) endif (USE_GSETTINGS) install ( FILES ${_files} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/compiz/cmake ) install ( FILES ${_PluginExtensionFiles} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/compiz/cmake/plugin_extensions ) # Do not install src/compiz for a while until we've polished it up #install (DIRECTORY src/compiz # DESTINATION ${CMAKE_INSTALL_PREFIX}/src) if (COMPIZ_BUILD_TESTING) add_subdirectory (src) endif (COMPIZ_BUILD_TESTING) compiz-0.9.11+14.04.20140409/cmake/recompile_gsettings_schemas_in_dir_user_env.cmake0000644000015301777760000000122712321343002030561 0ustar pbusernogroup00000000000000set (SCHEMADIR_USER "" CACHE FORCE "Installation dir if user") set (SCHEMADIR_ROOT "" CACHE FORCE "Installation dir if root") if (ENV{USER}) set (USERNAME $ENV{USER}) else (ENV${USER}) set (USERNAME "user") endif (ENV{USER}) if (${USERNAME} STREQUAL "root") set (SCHEMADIR ${SCHEMADIR_ROOT}) else (${USERNAME} STREQUAL "root") set (SCHEMADIR ${SCHEMADIR_USER}) endif (${USERNAME} STREQUAL "root") find_program (GLIB_COMPILE_SCHEMAS glib-compile-schemas) if (GLIB_COMPILE_SCHEMAS) message ("-- Recompiling GSettings schemas in ${SCHEMADIR}") execute_process (COMMAND ${GLIB_COMPILE_SCHEMAS} ${SCHEMADIR}) endif (GLIB_COMPILE_SCHEMAS) compiz-0.9.11+14.04.20140409/cmake/plugin_extensions/0000755000015301777760000000000012321344021022331 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/cmake/plugin_extensions/CompizGenInstallImages.cmake0000644000015301777760000000205712321343002027705 0ustar pbusernogroup00000000000000# determinate installation directories macro (compiz_images_prepare_dirs) if ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") set (PLUGIN_IMAGEDIR ${datadir}/compiz/${COMPIZ_CURRENT_PLUGIN}) elseif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") set (PLUGIN_IMAGEDIR ${COMPIZ_PREFIX}/share/compiz/${COMPIZ_CURRENT_PLUGIN}) else ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") set (PLUGIN_IMAGEDIR $ENV{HOME}/.compiz-1/${COMPIZ_CURRENT_PLUGIN}) endif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") endmacro (compiz_images_prepare_dirs) # install plugin data files if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/images) compiz_images_prepare_dirs () if (_install_plugin_${COMPIZ_CURRENT_PLUGIN}) install ( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/images DESTINATION ${PLUGIN_IMAGEDIR} ) endif (_install_plugin_${COMPIZ_CURRENT_PLUGIN}) list (APPEND COMPIZ_DEFINITIONS_ADD "-DIMAGEDIR='\"${PLUGIN_IMAGEDIR}\"'") endif () compiz-0.9.11+14.04.20140409/cmake/plugin_extensions/CompizGenGSettings.cmake0000644000015301777760000000407112321343002027056 0ustar pbusernogroup00000000000000include (${COMPIZ_CMAKE_MODULE_PATH}/CompizGSettings.cmake) macro (compiz_gsettings_prepare_install_dirs) # package if ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") if (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${datadir}/glib-2.0/schemas/") else (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR}") endif (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) # compiz elseif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") if (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${COMPIZ_PREFIX}/share/glib-2.0/schemas/") else (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR}") endif (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) # local else ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") if (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "$ENV{HOME}/.config/compiz-1/gsettings/schemas") else (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR}") endif (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) endif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") endmacro (compiz_gsettings_prepare_install_dirs) if (USE_GSETTINGS) compiz_gsettings_prepare_install_dirs () set (PLUGIN_GSETTINGS_SCHEMA_DST ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/org.compiz.${COMPIZ_CURRENT_PLUGIN}.gschema.xml) set (_install_gsettings_schema ) if (NOT _install_plugin_${COMPIZ_CURRENT_PLUGIN}) set (_install_gsettings_schema NOINSTALL) endif (NOT _install_plugin_${COMPIZ_CURRENT_PLUGIN}) compiz_gsettings_schema (${COMPIZ_CURRENT_PLUGIN} ${COMPIZ_CURRENT_XML_FILE} ${PLUGIN_GSETTINGS_SCHEMA_DST} ${PLUGIN_SCHEMADIR} ${_install_gsettings_schema}) list (APPEND COMPIZ_CURRENT_SOURCES_ADDS ${PLUGIN_GSETTINGS_SCHEMA_DST}) endif (USE_GSETTINGS) compiz-0.9.11+14.04.20140409/cmake/plugin_extensions/CompizGenInstallData.cmake0000644000015301777760000000203612321343002027346 0ustar pbusernogroup00000000000000# determinate installation directories macro (compiz_data_prepare_dirs) if ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") set (PLUGIN_DATADIR ${datadir}/compiz/${COMPIZ_CURRENT_PLUGIN}) elseif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") set (PLUGIN_DATADIR ${COMPIZ_PREFIX}/share/compiz/${COMPIZ_CURRENT_PLUGIN}) else ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") set (PLUGIN_DATADIR $ENV{HOME}/.compiz-1/${COMPIZ_CURRENT_PLUGIN}) endif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") endmacro (compiz_data_prepare_dirs) # install plugin data files if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/data) compiz_data_prepare_dirs () if (_install_plugin_${COMPIZ_CURRENT_PLUGIN}) install ( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data DESTINATION ${PLUGIN_DATADIR} ) endif (_install_plugin_${COMPIZ_CURRENT_PLUGIN}) list (APPEND COMPIZ_DEFINITIONS_ADD "-DDATADIR='\"${PLUGIN_DATADIR}\"'") endif () compiz-0.9.11+14.04.20140409/cmake/plugin_extensions/CompizGenGconf.cmake0000644000015301777760000000606112321343002026204 0ustar pbusernogroup00000000000000option ( COMPIZ_DISABLE_SCHEMAS_INSTALL "Disables gconf schema installation with gconftool" OFF ) set ( COMPIZ_INSTALL_GCONF_SCHEMA_DIR ${COMPIZ_INSTALL_GCONF_SCHEMA_DIR} CACHE PATH "Installation path of the gconf schema file" ) macro (compiz_gconf_prepare_install_dirs) if ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") if (NOT COMPIZ_INSTALL_GCONF_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${datadir}/gconf/schemas") else (NOT COMPIZ_INSTALL_GCONF_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${COMPIZ_INSTALL_GCONF_SCHEMA_DIR}") endif (NOT COMPIZ_INSTALL_GCONF_SCHEMA_DIR) elseif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") if (NOT COMPIZ_INSTALL_GCONF_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${COMPIZ_PREFIX}/share/gconf/schemas") else (NOT COMPIZ_INSTALL_GCONF_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${COMPIZ_INSTALL_GCONF_SCHEMA_DIR}") endif (NOT COMPIZ_INSTALL_GCONF_SCHEMA_DIR) else ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") if (NOT COMPIZ_INSTALL_GCONF_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "$ENV{HOME}/.gconf/schemas") else (NOT COMPIZ_INSTALL_GCONF_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${COMPIZ_INSTALL_GCONF_SCHEMA_DIR}") endif (NOT COMPIZ_INSTALL_GCONF_SCHEMA_DIR) endif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") endmacro (compiz_gconf_prepare_install_dirs) function (compiz_install_gconf_schema _src _dst) find_program (GCONFTOOL_EXECUTABLE gconftool-2) mark_as_advanced (FORCE GCONFTOOL_EXECUTABLE) if (GCONFTOOL_EXECUTABLE AND NOT COMPIZ_DISABLE_SCHEMAS_INSTALL) install (CODE " if (\"\$ENV{USER}\" STREQUAL \"root\") exec_program (${GCONFTOOL_EXECUTABLE} ARGS \"--get-default-source\" OUTPUT_VARIABLE ENV{GCONF_CONFIG_SOURCE}) exec_program (${GCONFTOOL_EXECUTABLE} ARGS \"--makefile-install-rule ${_src} > /dev/null\") else (\"\$ENV{USER}\" STREQUAL \"root\") exec_program (${GCONFTOOL_EXECUTABLE} ARGS \"--install-schema-file=${_src} > /dev/null\") endif (\"\$ENV{USER}\" STREQUAL \"root\") ") endif () install ( FILES "${_src}" DESTINATION "${_dst}" ) endfunction () # generate gconf schema find_program (XSLTPROC_EXECUTABLE xsltproc) mark_as_advanced (FORCE XSLTPROC_EXECUTABLE) if (XSLTPROC_EXECUTABLE) compiz_gconf_prepare_install_dirs () add_custom_command ( OUTPUT "${CMAKE_BINARY_DIR}/generated/compiz-${COMPIZ_CURRENT_PLUGIN}.schemas" COMMAND ${XSLTPROC_EXECUTABLE} -o "${CMAKE_BINARY_DIR}/generated/compiz-${COMPIZ_CURRENT_PLUGIN}.schemas" ${COMPIZ_GCONF_SCHEMAS_XSLT} ${COMPIZ_CURRENT_XML_FILE} DEPENDS ${COMPIZ_CURRENT_XML_FILE} ) if (_install_plugin_${COMPIZ_CURRENT_PLUGIN}) compiz_install_gconf_schema ("${CMAKE_BINARY_DIR}/generated/compiz-${COMPIZ_CURRENT_PLUGIN}.schemas" ${PLUGIN_SCHEMADIR}) endif (_install_plugin_${COMPIZ_CURRENT_PLUGIN}) list (APPEND COMPIZ_CURRENT_SOURCES_ADDS ${CMAKE_BINARY_DIR}/generated/compiz-${COMPIZ_CURRENT_PLUGIN}.schemas) endif () compiz-0.9.11+14.04.20140409/cmake/plugin_extensions/CompizOpenGLFixups.cmake0000644000015301777760000000145412321343002027042 0ustar pbusernogroup00000000000000 # modify pkg-config libs for opengl based on if we found GLES or not if (${COMPIZ_CURRENT_PLUGIN} STREQUAL "opengl") if (USE_GLES) set (PKGCONFIG_LIBS "-lGLESv2 -lEGL") else (USE_GLES) set (PKGCONFIG_LIBS "-lGL") endif (USE_GLES) endif (${COMPIZ_CURRENT_PLUGIN} STREQUAL "opengl") # if plugin is using opengl plugin check for GLES library and set correct define if (NOT "${${_PLUGIN}_PLUGINDEPS}" STREQUAL "") string (REGEX MATCH "opengl" opengl_found ${${_PLUGIN}_PLUGINDEPS}) if (opengl_found STREQUAL "opengl") if (USE_GLES) set (${_PLUGIN}_CFLAGSADD ${${_PLUGIN}_CFLAGSADD} " -DUSE_GLES") string (REPLACE ";" " " ${_PLUGIN}_CFLAGSADD ${${_PLUGIN}_CFLAGSADD}) endif (USE_GLES) endif (opengl_found STREQUAL "opengl") endif (NOT "${${_PLUGIN}_PLUGINDEPS}" STREQUAL "") compiz-0.9.11+14.04.20140409/cmake/src/0000755000015301777760000000000012321344021017343 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/cmake/src/compiz/0000755000015301777760000000000012321344021020644 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/cmake/src/compiz/compiz_discover_gtest_tests.cpp0000644000015301777760000000414512321343002027201 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include #include #include #include using namespace std; int usage () { cout << "Usage: PATH_TO_TEST_BINARY --gtest_list_tests | ./build_test_cases PATH_TO_TEST_BINARY --wrapper PATH_TO_WRAPPER" << endl; return 1; } int main (int argc, char **argv) { string testBinary; string wrapperBinary; cin >> noskipws; if (argc == 2) testBinary = string (argv[1]); else if (argc == 4 && string (argv[2]) == "--wrapper") { testBinary = string (argv[1]); wrapperBinary = string (argv[3]); } else return usage (); map > testCases; string line; string currentTestCase; while (getline (cin, line)) { /* Is test case */ if (line.find (" ") == 0) testCases[currentTestCase].push_back (currentTestCase + line.substr (2)); else currentTestCase = line; } ofstream testfilecmake; char *base = basename (argv[1]); string gtestName (base); testfilecmake.open (string (gtestName + "_test.cmake").c_str (), ios::out | ios::trunc); if (testfilecmake.is_open ()) { for (map >::iterator it = testCases.begin (); it != testCases.end (); ++it) { for (vector ::iterator jt = it->second.begin (); jt != it->second.end (); ++jt) { if (testfilecmake.good ()) { stringstream addTest, escapedWrapper, escapedTest, testExec, gTestFilter, endParen; addTest << "ADD_TEST ("; if (wrapperBinary.size ()) escapedWrapper << " \"" << wrapperBinary << "\""; escapedTest << " \"" << testBinary << "\""; testExec << escapedWrapper.str () << escapedTest.str (); gTestFilter << " \"--gtest_filter="; endParen << "\")"; std::string testName = jt->substr(0, jt->find("#")); testfilecmake << addTest.str () << testName << testExec.str () << gTestFilter.str () << testName << endParen.str () << endl; } } } testfilecmake.close (); } return 0; } compiz-0.9.11+14.04.20140409/cmake/src/compiz/CMakeLists.txt0000644000015301777760000000056712321343002023412 0ustar pbusernogroup00000000000000add_executable (compiz_discover_gtest_tests EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/compiz_discover_gtest_tests.cpp) if (BUILD_XORG_GTEST) add_dependencies (compiz_discover_gtest_tests xorg_gtest_wrapper) endif (BUILD_XORG_GTEST) set_target_properties (compiz_discover_gtest_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/compiz_gtest) compiz-0.9.11+14.04.20140409/cmake/src/CMakeLists.txt0000644000015301777760000000003212321343002022074 0ustar pbusernogroup00000000000000add_subdirectory (compiz) compiz-0.9.11+14.04.20140409/cmake/FindOpenGLES2.cmake0000644000015301777760000000246612321343002022023 0ustar pbusernogroup00000000000000# - Try to find OpenGLES # Once done this will define # # OPENGLES2_FOUND - system has OpenGLES # OPENGLES2_INCLUDE_DIR - the GLES include directory # OPENGLES2_LIBRARY - the GLES library # OPENGLES2_LIBRARIES - Link this to use OpenGLES # FIND_PATH(OPENGLES2_INCLUDE_DIR GLES2/gl2.h /usr/openwin/share/include /opt/graphics/OpenGL/include /usr/X11R6/include /usr/include ) FIND_LIBRARY(OPENGLES2_LIBRARY NAMES GLESv2 PATHS /opt/graphics/OpenGL/lib /usr/openwin/lib /usr/shlib /usr/X11R6/lib /usr/lib ) FIND_LIBRARY(OPENGLES2_EGL_LIBRARY NAMES EGL PATHS /usr/shlib /usr/X11R6/lib /usr/lib ) # On Unix OpenGL most certainly always requires X11. # Feel free to tighten up these conditions if you don't # think this is always true. # It's not true on OSX. IF (OPENGLES2_LIBRARY) IF(NOT X11_FOUND) INCLUDE(FindX11) ENDIF(NOT X11_FOUND) IF (X11_FOUND) IF (NOT APPLE) SET (OPENGLES2_LIBRARIES ${X11_LIBRARIES}) ENDIF (NOT APPLE) ENDIF (X11_FOUND) ENDIF(OPENGLES2_LIBRARY) SET( OPENGLES2_FOUND "NO" ) IF(OPENGLES2_LIBRARY AND OPENGLES2_EGL_LIBRARY) SET( OPENGLES2_LIBRARIES ${OPENGLES2_LIBRARY} ${OPENGLES2_EGL_LIBRARY} ${OPENGLES2_LIBRARIES}) SET( OPENGLES2_FOUND "YES" ) ENDIF(OPENGLES2_LIBRARY AND OPENGLES2_EGL_LIBRARY) compiz-0.9.11+14.04.20140409/cmake/CompizGSettings.cmake0000644000015301777760000001701112321343002022645 0ustar pbusernogroup00000000000000option ( USE_GSETTINGS "Generate GSettings schemas" ON ) option ( COMPIZ_DISABLE_GS_SCHEMAS_INSTALL "Disables gsettings schema installation" OFF ) set ( COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR ${COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR} CACHE PATH "Installation path of the gsettings schema file" ) # Detect global schemas install dir find_program (PKG_CONFIG_TOOL pkg-config) get_property (GSETTINGS_GLOBAL_INSTALL_DIR_SET GLOBAL PROPERTY GSETTINGS_GLOBAL_INSTALL_DIR SET) if (PKG_CONFIG_TOOL AND NOT GSETTINGS_GLOBAL_INSTALL_DIR_SET) mark_as_advanced (FORCE PKG_CONFIG_TOOL) # find out where schemas need to go if we are installing them systemwide execute_process (COMMAND ${PKG_CONFIG_TOOL} glib-2.0 --variable prefix OUTPUT_VARIABLE GSETTINGS_GLIB_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE) set (GSETTINGS_GLOBAL_INSTALL_DIR "${GSETTINGS_GLIB_PREFIX}/share/glib-2.0/schemas/") set_property (GLOBAL PROPERTY GSETTINGS_GLOBAL_INSTALL_DIR ${GSETTINGS_GLOBAL_INSTALL_DIR}) endif (PKG_CONFIG_TOOL AND NOT GSETTINGS_GLOBAL_INSTALL_DIR_SET) function (compiz_add_install_recompile_gsettings_schemas _schemadir_user) get_property (GSETTINGS_GLOBAL_INSTALL_DIR_SET GLOBAL PROPERTY GSETTINGS_GLOBAL_INSTALL_DIR SET) if (GSETTINGS_GLOBAL_INSTALL_DIR_SET) get_property (GSETTINGS_GLOBAL_INSTALL_DIR GLOBAL PROPERTY GSETTINGS_GLOBAL_INSTALL_DIR) # Recompile GSettings Schemas install (CODE " execute_process (COMMAND cmake -DSCHEMADIR_USER=${_schemadir_user} -DSCHEMADIR_ROOT=${GSETTINGS_GLOBAL_INSTALL_DIR} -P ${COMPIZ_CMAKE_MODULE_PATH}/recompile_gsettings_schemas_in_dir_user_env.cmake) ") # We must also recompile on uninstall too compiz_add_code_to_uninstall_target ("cmake -DSCHEMADIR_USER=${_schemadir_user} -DSCHEMADIR_ROOT=${GSETTINGS_GLOBAL_INSTALL_DIR} -P ${COMPIZ_CMAKE_MODULE_PATH}/recompile_gsettings_schemas_in_dir_user_env.cmake" ${CMAKE_CURRENT_BINARY_DIR}) endif (GSETTINGS_GLOBAL_INSTALL_DIR_SET) endfunction (compiz_add_install_recompile_gsettings_schemas) function (compiz_install_gsettings_schema _src _dst) find_program (PKG_CONFIG_TOOL pkg-config) find_program (GLIB_COMPILE_SCHEMAS glib-compile-schemas) mark_as_advanced (FORCE PKG_CONFIG_TOOL) mark_as_advanced (GLIB_COMPILE_SCHEMAS) # find out where schemas need to go if we are installing them systemwide execute_process (COMMAND ${PKG_CONFIG_TOOL} glib-2.0 --variable prefix OUTPUT_VARIABLE GSETTINGS_GLIB_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE) SET (GSETTINGS_GLOBAL_INSTALL_DIR "${GSETTINGS_GLIB_PREFIX}/share/glib-2.0/schemas/") if (PKG_CONFIG_TOOL AND GLIB_COMPILE_SCHEMAS AND NOT COMPIZ_DISABLE_SCHEMAS_INSTALL AND USE_GSETTINGS) # Install schema file install (CODE " execute_process (COMMAND cmake -DFILE=${_src} -DINSTALLDIR_USER=${_dst} -DINSTALLDIR_ROOT=${GSETTINGS_GLOBAL_INSTALL_DIR} -P ${COMPIZ_CMAKE_MODULE_PATH}/copy_file_install_user_env.cmake) ") get_filename_component (_src_file_basename ${_src} NAME) compiz_add_code_to_uninstall_target ("cmake -E remove -f ${_dst}/${_src_file_basename}" ${CMAKE_CURRENT_BINARY_DIR}) get_property (COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE_SET GLOBAL PROPERTY COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE SET) if (COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE_SET) get_property (COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE GLOBAL PROPERTY COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE) else (COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE_SET) set (COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE FALSE) endif (COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE_SET) if (NOT COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE) compiz_add_install_recompile_gsettings_schemas (${_dst} ${GSETTINGS_GLOBAL_INSTALL_DIR}) endif (NOT COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE) endif (PKG_CONFIG_TOOL AND GLIB_COMPILE_SCHEMAS AND NOT COMPIZ_DISABLE_SCHEMAS_INSTALL AND USE_GSETTINGS) endfunction () function (add_gsettings_local_recompilation_rule _schemas) get_property (GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE_SET GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE SET) if (GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE_SET) get_property (GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE) else (GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE_SET) set (GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE FALSE) endif (GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE_SET) get_property (GSETTINGS_LOCAL_COMPILE_TARGET_SET GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_TARGET_SET SET) if (NOT GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE AND NOT GSETTINGS_LOCAL_COMPILE_TARGET_SET) find_program (GLIB_COMPILE_SCHEMAS glib-compile-schemas) mark_as_advanced (GLIB_COMPILE_SCHEMAS) if (GLIB_COMPILE_SCHEMAS) set (_compiled_gschemas ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/gschemas.compiled) # Invalidate the rule if (EXISTS ${_compiled_gschemas}) execute_process (COMMAND rm ${_compiled_gschemas}) endif (EXISTS ${_compiled_gschemas}) add_custom_command (OUTPUT ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/gschemas.compiled COMMAND ${GLIB_COMPILE_SCHEMAS} --targetdir=${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/ ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/ COMMENT "Recompiling GSettings schemas locally" DEPENDS ${${_schemas}} ) add_custom_target (compiz_gsettings_compile_local ALL DEPENDS ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/gschemas.compiled) set_property (GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_TARGET_SET TRUE) endif (GLIB_COMPILE_SCHEMAS) endif (NOT GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE AND NOT GSETTINGS_LOCAL_COMPILE_TARGET_SET) endfunction () function (add_all_gsettings_schemas_to_local_recompilation_rule) get_property (GSETTINGS_LOCAL_COMPILE_SCHEMAS GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_SCHEMAS) # Deferencing it appears to just give it the first schema, that's not what # we really want, so just pass the reference and double-dereference # internally add_gsettings_local_recompilation_rule (GSETTINGS_LOCAL_COMPILE_SCHEMAS) endfunction () function (add_gsettings_schema_to_recompilation_list _schema_file_name) set_property (GLOBAL APPEND PROPERTY GSETTINGS_LOCAL_COMPILE_SCHEMAS "${_schema_file_name}") add_all_gsettings_schemas_to_local_recompilation_rule () endfunction () # generate gconf schema function (compiz_gsettings_schema _name _src _dst _inst) find_program (XSLTPROC_EXECUTABLE xsltproc) find_program (GLIB_COMPILE_SCHEMAS glib-compile-schemas) mark_as_advanced (FORCE XSLTPROC_EXECUTABLE) if (XSLTPROC_EXECUTABLE AND GLIB_COMPILE_SCHEMAS AND USE_GSETTINGS) add_custom_command ( OUTPUT ${_dst} COMMAND ${XSLTPROC_EXECUTABLE} -o ${_dst} ${COMPIZ_GSETTINGS_SCHEMAS_XSLT} ${_src} DEPENDS ${_src} ) add_custom_target (${_name}_gsettings_schema DEPENDS ${_dst}) set (_install_gsettings_schema ON) foreach (ARG ${ARGN}) if (${ARG} STREQUAL "NOINSTALL") set (_install_gsettings_schema OFF) endif (${ARG} STREQUAL "NOINSTALL") endforeach () if (_install_gsettings_schema) compiz_install_gsettings_schema (${_dst} ${_inst}) endif (_install_gsettings_schema) add_gsettings_schema_to_recompilation_list (${_name}_gsettings_schema) endif () endfunction () compiz-0.9.11+14.04.20140409/libdecoration/0000755000015301777760000000000012321344021020312 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/libdecoration/decoration.c0000644000015301777760000022137012321343002022610 0ustar pbusernogroup00000000000000 /* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include int decor_version (void) { return DECOR_INTERFACE_VERSION; } /* decoration property ------------------- data[0] = version data[1] = decoration type data[2] = number of decorations specified in property WINDOW_DECORATION_TYPE_WINDOW property -------------------------------------- data[3] = input left data[4] = input right data[5] = input top data[6] = input bottom data[7] = input left when maximized data[8] = input right when maximized data[9] = input top when maximized data[10] = input bottom when maximized data[11] = min width data[12] = min height fields 13 to 15 are only used by the default decorations on the root window data[13] = frame state data[14] = frame type data[15] = frame actions WINDOW_DECORATION_TYPE_PIXMAP property -------------------------------------- data[3] = pixmap extents frame input is used for creating the input area of the frame window which the client will be reparented into, border is used for positioning data[4] = frame left data[5] = frame right data[6] = frame top data[7] = frame bottom data[8] = input left data[9] = input right data[10] = input top data[11] = input bottom data[12] = frame left when maximized data[13] = frame right when maximized data[14] = frame top when maximized data[15] = frame bottom when maximized data[16] = border left when maximized data[17] = border right when maximized data[18] = border top when maximized data[19] = border bottom when maximized data[20] = min width data[21] = min height fields 22 to 24 are only used by the default decorations on the root window data[22] = frame state data[23] = frame type data[24] = frame actions data[25] = num quads flags 1st to 4nd bit p1 gravity, 5rd to 8th bit p2 gravity, 9rd and 10th bit alignment, 11rd and 12th bit clamp, 13th bit XX, 14th bit XY, 15th bit YX, 16th bit YY. data[26 + n * 9 + 1] = flags data[26 + n * 9 + 2] = p1 x data[26 + n * 9 + 3] = p1 y data[26 + n * 9 + 4] = p2 x data[26 + n * 9 + 5] = p2 y data[26 + n * 9 + 6] = widthMax data[26 + n * 9 + 7] = heightMax data[26 + n * 9 + 8] = x0 data[26 + n * 9 + 9] = y0 */ long * decor_alloc_property (unsigned int n, unsigned int type) { unsigned int propSize = 0; long *data; if (type == WINDOW_DECORATION_TYPE_WINDOW) propSize = WINDOW_PROP_SIZE; else if (type == WINDOW_DECORATION_TYPE_PIXMAP) propSize = BASE_PROP_SIZE + N_QUADS_MAX * QUAD_PROP_SIZE; propSize *= n; propSize += PROP_HEADER_SIZE; data = calloc (propSize, sizeof (long)); data[0] = DECOR_INTERFACE_VERSION; data[1] = type; data[2] = n; return data; } void decor_quads_to_property (long *data, unsigned int n, Pixmap pixmap, decor_extents_t *frame, decor_extents_t *border, decor_extents_t *max_frame, decor_extents_t *max_border, int min_width, int min_height, decor_quad_t *quad, int nQuad, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions) { /* FIXME: Allocating for N_QUAD_MAX is slightly inefficient, but there * isn't really a better way to do this at the moment */ data += PROP_HEADER_SIZE + n * (BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); memcpy (data++, &pixmap, sizeof (Pixmap)); *data++ = frame->left; *data++ = frame->right; *data++ = frame->top; *data++ = frame->bottom; *data++ = border->left; *data++ = border->right; *data++ = border->top; *data++ = border->bottom; *data++ = max_frame->left; *data++ = max_frame->right; *data++ = max_frame->top; *data++ = max_frame->bottom; *data++ = max_border->left; *data++ = max_border->right; *data++ = max_border->top; *data++ = max_border->bottom; *data++ = min_width; *data++ = min_height; *data++ = frame_type; *data++ = frame_state; *data++ = frame_actions; *data++ = nQuad; while (nQuad--) { *data++ = (quad->p1.gravity << 0) | (quad->p2.gravity << 4) | (quad->align << 8) | (quad->clamp << 10) | (quad->stretch << 12) | (quad->m.xx ? XX_MASK : 0) | (quad->m.xy ? XY_MASK : 0) | (quad->m.yx ? YX_MASK : 0) | (quad->m.yy ? YY_MASK : 0); *data++ = quad->p1.x; *data++ = quad->p1.y; *data++ = quad->p2.x; *data++ = quad->p2.y; *data++ = quad->max_width; *data++ = quad->max_height; *data++ = quad->m.x0; *data++ = quad->m.y0; ++quad; } } void decor_gen_window_property (long *data, unsigned int n, decor_extents_t *input, decor_extents_t *max_input, int min_width, int min_height, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions) { data += PROP_HEADER_SIZE + n * WINDOW_PROP_SIZE; *data++ = input->left; *data++ = input->right; *data++ = input->top; *data++ = input->bottom; *data++ = max_input->left; *data++ = max_input->right; *data++ = max_input->top; *data++ = max_input->bottom; *data++ = min_width; *data++ = min_height; *data++ = frame_type; *data++ = frame_state; *data++ = frame_actions; } int decor_property_get_version (long *data) { return (int) *data; } int decor_property_get_type (long *data) { return (int) data[1]; } int decor_property_get_num (long *data) { return (int) data[2]; } int decor_pixmap_property_to_quads (long *data, unsigned int nOffset, int size, Pixmap *pixmap, decor_extents_t *frame, decor_extents_t *border, decor_extents_t *max_frame, decor_extents_t *max_border, int *min_width, int *min_height, unsigned int *frame_type, unsigned int *frame_state, unsigned int *frame_actions, decor_quad_t *quad) { int i, n, flags; if (size < PROP_HEADER_SIZE + nOffset * (BASE_PROP_SIZE + QUAD_PROP_SIZE + N_QUADS_MAX)) return 0; if (decor_property_get_version (data) != decor_version ()) return 0; if (decor_property_get_type (data) != WINDOW_DECORATION_TYPE_PIXMAP) return 0; data += PROP_HEADER_SIZE + nOffset * (BASE_PROP_SIZE + N_QUADS_MAX * QUAD_PROP_SIZE); memcpy (pixmap, data++, sizeof (Pixmap)); frame->left = *data++; frame->right = *data++; frame->top = *data++; frame->bottom = *data++; border->left = *data++; border->right = *data++; border->top = *data++; border->bottom = *data++; max_frame->left = *data++; max_frame->right = *data++; max_frame->top = *data++; max_frame->bottom = *data++; max_border->left = *data++; max_border->right = *data++; max_border->top = *data++; max_border->bottom = *data++; *min_width = *data++; *min_height = *data++; *frame_type = *data++; *frame_state = *data++; *frame_actions = *data++; n = *data++; for (i = 0; i < n; ++i) { flags = *data++; quad->p1.gravity = (flags >> 0) & 0xf; quad->p2.gravity = (flags >> 4) & 0xf; quad->align = (flags >> 8) & 0x3; quad->clamp = (flags >> 10) & 0x3; quad->stretch = (flags >> 12) & 0x3; quad->m.xx = (flags & XX_MASK) ? 1.0f : 0.0f; quad->m.xy = (flags & XY_MASK) ? 1.0f : 0.0f; quad->m.yx = (flags & YX_MASK) ? 1.0f : 0.0f; quad->m.yy = (flags & YY_MASK) ? 1.0f : 0.0f; quad->p1.x = *data++; quad->p1.y = *data++; quad->p2.x = *data++; quad->p2.y = *data++; quad->max_width = *data++; quad->max_height = *data++; quad->m.x0 = *data++; quad->m.y0 = *data++; ++quad; } return n; } static int decor_point_cmp (const decor_point_t *a, const decor_point_t *b) { /* Use binary | to avoid branch prediction slow-downs */ return (a->x - b->x) | (a->y - b->y) | (a->gravity - b->gravity); } int decor_shadow_options_cmp (const decor_shadow_options_t *a, const decor_shadow_options_t *b) { return (a->shadow_radius != b->shadow_radius) || (a->shadow_opacity != b->shadow_opacity) || (a->shadow_offset_x != b->shadow_offset_x) || (a->shadow_offset_y != b->shadow_offset_y) || memcmp (a->shadow_color, b->shadow_color, sizeof (unsigned short) * 3); } static int decor_matrix_cmp (const decor_matrix_t *a, const decor_matrix_t *b) { return (a->xx != b->xx) || (a->yx != b->yx) || (a->xy != b->xy) || (a->yy != b->yy) || (a->x0 != b->x0) || (a->y0 != b->y0); } static int decor_quad_cmp (const decor_quad_t *a, const decor_quad_t *b) { return decor_point_cmp (&a->p1, &b->p1) || decor_point_cmp (&a->p2, &b->p2) || decor_matrix_cmp (&a->m, &b->m) || ( (a->max_width - b->max_width) | (a->max_height - b->max_height) | (a->align - b->align) | (a->clamp - b->clamp) | (a->stretch - b->stretch) ); } int decor_extents_cmp (const decor_extents_t *a, const decor_extents_t *b) { /* Use binary | to avoid branch prediction slow-downs */ return (a->left - b->left) | (a->right - b->right) | (a->top - b->top) | (a->bottom - b->bottom); } /* Returns n for a match, returns -1 for no match */ int decor_match_pixmap (long *data, int size, Pixmap *pixmap, decor_extents_t *frame, decor_extents_t *border, decor_extents_t *max_frame, decor_extents_t *max_border, int min_width, int min_height, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions, decor_quad_t *quad, unsigned int n_quad) { int n = decor_property_get_num (data); unsigned int i = 0; for (; i < n; ++i) { Pixmap cPixmap; decor_extents_t cFrame, cBorder, cMax_frame, cMax_border; int cMin_width, cMin_height; int q; unsigned int cFrame_type, cFrame_state, cFrame_actions, cNQuad; decor_quad_t cQuad[N_QUADS_MAX]; cNQuad = decor_pixmap_property_to_quads (data, i, size, &cPixmap, &cFrame, &cBorder, &cMax_frame, &cMax_border, &cMin_width, &cMin_height, &cFrame_type, &cFrame_state, &cFrame_actions, cQuad); if (cPixmap != *pixmap) continue; if (decor_extents_cmp (&cFrame, frame) || decor_extents_cmp (&cBorder, border) || decor_extents_cmp (&cMax_frame, max_frame) || decor_extents_cmp (&cMax_border, max_border)) continue; if (cFrame_type != frame_type || cFrame_state != frame_state || cFrame_actions != frame_actions || cMin_width != min_width || cMin_height != min_height) continue; if (cNQuad != n_quad) continue; q = 0; while (q < n_quad && !decor_quad_cmp (&cQuad[q], &quad[q])) ++q; if (q < n_quad) continue; return n; } return -1; } int decor_window_property (long *data, unsigned int n, int size, decor_extents_t *input, decor_extents_t *max_input, int *min_width, int *min_height, unsigned int *frame_type, unsigned int *frame_state, unsigned int *frame_actions) { if (decor_property_get_version (data) != decor_version ()) return 0; if (decor_property_get_type (data) != WINDOW_DECORATION_TYPE_WINDOW) return 0; if (size < PROP_HEADER_SIZE + n * WINDOW_PROP_SIZE) return 0; data += PROP_HEADER_SIZE + n * WINDOW_PROP_SIZE; input->left = *data++; input->right = *data++; input->top = *data++; input->bottom = *data++; max_input->left = *data++; max_input->right = *data++; max_input->top = *data++; max_input->bottom = *data++; *min_width = *data++; *min_height = *data++; *frame_type = *data++; *frame_state = *data++; *frame_actions = *data++; return 1; } static int add_blur_boxes (long *data, BoxPtr box, int n_box, int width, int height, int gravity, int offset) { int x1, y1, x2, y2; int more_gravity; int n = n_box; while (n--) { x1 = box->x1; y1 = box->y1; x2 = box->x2; y2 = box->y2; if (gravity & (GRAVITY_NORTH | GRAVITY_SOUTH)) { if (x1 > offset) { more_gravity = GRAVITY_EAST; x1 -= width; } else { more_gravity = GRAVITY_WEST; } } else { if (y1 > offset) { more_gravity = GRAVITY_SOUTH; y1 -= height; } else { more_gravity = GRAVITY_NORTH; } } *data++ = gravity | more_gravity; *data++ = x1; *data++ = y1; if (gravity & (GRAVITY_NORTH | GRAVITY_SOUTH)) { if (x2 > offset) { more_gravity = GRAVITY_EAST; x2 -= width; } else { more_gravity = GRAVITY_WEST; } } else { if (y2 > offset) { more_gravity = GRAVITY_SOUTH; y2 -= height; } else { more_gravity = GRAVITY_NORTH; } } *data++ = gravity | more_gravity; *data++ = x2; *data++ = y2; ++box; } return n_box * 6; } void decor_region_to_blur_property (long *data, int threshold, int filter, int width, int height, Region top_region, int top_offset, Region bottom_region, int bottom_offset, Region left_region, int left_offset, Region right_region, int right_offset) { *data++ = threshold; *data++ = filter; if (top_region) data += add_blur_boxes (data, top_region->rects, top_region->numRects, width, height, GRAVITY_NORTH, top_offset); if (bottom_region) data += add_blur_boxes (data, bottom_region->rects, bottom_region->numRects, width, height, GRAVITY_SOUTH, bottom_offset); if (left_region) data += add_blur_boxes (data, left_region->rects, left_region->numRects, width, height, GRAVITY_WEST, left_offset); if (right_region) data += add_blur_boxes (data, right_region->rects, right_region->numRects, width, height, GRAVITY_EAST, right_offset); } void decor_apply_gravity (int gravity, int x, int y, int width, int height, int *return_x, int *return_y) { if (gravity & GRAVITY_EAST) { x += width; *return_x = MAX (0, x); } else if (gravity & GRAVITY_WEST) { *return_x = MIN (width, x); } else { x += width / 2; x = MAX (0, x); x = MIN (width, x); *return_x = x; } if (gravity & GRAVITY_SOUTH) { y += height; *return_y = MAX (0, y); } else if (gravity & GRAVITY_NORTH) { *return_y = MIN (height, y); } else { y += height / 2; y = MAX (0, y); y = MIN (height, y); *return_y = y; } } int decor_set_vert_quad_row (decor_quad_t *q, int top, int top_corner, int bottom, int bottom_corner, int left, int right, int gravity, int height, int splitY, int splitGravity, double x0, double y0, int rotation) { int nQuad = 0; q->p1.x = left; q->p1.y = -top; q->p1.gravity = gravity | GRAVITY_NORTH; q->p2.x = right; q->p2.y = splitY; q->p2.gravity = gravity | splitGravity; q->max_width = SHRT_MAX; q->max_height = top + top_corner; q->align = ALIGN_TOP; q->clamp = CLAMP_VERT; q->stretch = 0; q->m.x0 = x0; q->m.y0 = y0; if (rotation) { q->m.xx = 0.0; q->m.xy = 1.0; q->m.yx = 1.0; q->m.yy = 0.0; } else { q->m.xx = 1.0; q->m.xy = 0.0; q->m.yx = 0.0; q->m.yy = 1.0; } ++q; ++nQuad; q->p1.x = left; q->p1.y = top_corner; q->p1.gravity = gravity | GRAVITY_NORTH; q->p2.x = right; q->p2.y = -bottom_corner; q->p2.gravity = gravity | GRAVITY_SOUTH; q->max_width = SHRT_MAX; q->max_height = SHRT_MAX; q->align = 0; q->clamp = CLAMP_VERT; q->stretch = 0; if (rotation) { q->m.xx = 0.0; q->m.xy = 0.0; q->m.yx = 1.0; q->m.yy = 0.0; q->m.x0 = x0 + top + top_corner; q->m.y0 = y0; } else { q->m.xx = 1.0; q->m.xy = 0.0; q->m.yx = 0.0; q->m.yy = 0.0; q->m.x0 = x0; q->m.y0 = y0 + top + top_corner; } ++q; ++nQuad; q->p1.x = left; q->p1.y = splitY; q->p1.gravity = gravity | splitGravity; q->p2.x = right; q->p2.y = bottom; q->p2.gravity = gravity | GRAVITY_SOUTH; q->max_width = SHRT_MAX; q->max_height = bottom_corner + bottom; q->align = ALIGN_BOTTOM; q->clamp = CLAMP_VERT; q->stretch = 0; if (rotation) { q->m.xx = 0.0; q->m.xy = 1.0; q->m.yx = 1.0; q->m.yy = 0.0; q->m.x0 = x0 + height; q->m.y0 = y0; } else { q->m.xx = 1.0; q->m.xy = 0.0; q->m.yx = 0.0; q->m.yy = 1.0; q->m.x0 = x0; q->m.y0 = y0 + height; } ++nQuad; return nQuad; } int decor_set_horz_quad_line (decor_quad_t *q, int left, int left_corner, int right, int right_corner, int top, int bottom, int gravity, int width, int splitX, int splitGravity, double x0, double y0) { int nQuad = 0; q->p1.x = -left; q->p1.y = top; q->p1.gravity = gravity | GRAVITY_WEST; q->p2.x = splitX; q->p2.y = bottom; q->p2.gravity = gravity | splitGravity; q->max_width = left + left_corner; q->max_height = SHRT_MAX; q->align = ALIGN_LEFT; q->clamp = 0; q->stretch = 0; q->m.xx = 1.0; q->m.xy = 0.0; q->m.yx = 0.0; q->m.yy = 1.0; q->m.x0 = x0; q->m.y0 = y0; ++q; ++nQuad; q->p1.x = left_corner; q->p1.y = top; q->p1.gravity = gravity | GRAVITY_WEST; q->p2.x = -right_corner; q->p2.y = bottom; q->p2.gravity = gravity | GRAVITY_EAST; q->max_width = SHRT_MAX; q->max_height = SHRT_MAX; q->align = 0; q->clamp = 0; q->stretch = 0; q->m.xx = 0.0; q->m.xy = 0.0; q->m.yx = 0.0; q->m.yy = 1.0; q->m.x0 = x0 + left + left_corner; q->m.y0 = y0; ++q; ++nQuad; q->p1.x = splitX; q->p1.y = top; q->p1.gravity = gravity | splitGravity; q->p2.x = right; q->p2.y = bottom; q->p2.gravity = gravity | GRAVITY_EAST; q->max_width = right_corner + right; q->max_height = SHRT_MAX; q->align = ALIGN_RIGHT; q->clamp = 0; q->stretch = 0; q->m.xx = 1.0; q->m.xy = 0.0; q->m.yx = 0.0; q->m.yy = 1.0; q->m.x0 = x0 + width; q->m.y0 = y0; ++nQuad; return nQuad; } int decor_set_lSrS_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l) { int lh, rh, splitY, n, nQuad = 0; splitY = (c->top_corner_space - c->bottom_corner_space) / 2; if (l->rotation) { lh = l->left.x2 - l->left.x1; rh = l->right.x2 - l->right.x1; } else { lh = l->left.y2 - l->left.y1; rh = l->right.y2 - l->right.y1; } /* left quads */ n = decor_set_vert_quad_row (q, 0, c->top_corner_space, 0, c->bottom_corner_space, -c->left_space, 0, GRAVITY_WEST, lh, splitY, 0, l->left.x1, l->left.y1, l->rotation); q += n; nQuad += n; /* right quads */ n = decor_set_vert_quad_row (q, 0, c->top_corner_space, 0, c->bottom_corner_space, 0, c->right_space, GRAVITY_EAST, rh, splitY, 0, l->right.x1, l->right.y1, l->rotation); nQuad += n; return nQuad; } int decor_set_lSrStSbS_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l) { int splitX, n, nQuad = 0; splitX = (c->left_corner_space - c->right_corner_space) / 2; /* top quads */ n = decor_set_horz_quad_line (q, c->left_space, c->left_corner_space, c->right_space, c->right_corner_space, -c->top_space, 0, GRAVITY_NORTH, l->top.x2 - l->top.x1, splitX, 0, l->top.x1, l->top.y1); q += n; nQuad += n; n = decor_set_lSrS_window_quads (q, c, l); q += n; nQuad += n; /* bottom quads */ n = decor_set_horz_quad_line (q, c->left_space, c->left_corner_space, c->right_space, c->right_corner_space, 0, c->bottom_space, GRAVITY_SOUTH, l->bottom.x2 - l->bottom.x1, splitX, 0, l->bottom.x1, l->bottom.y1); nQuad += n; return nQuad; } int decor_set_lSrStXbS_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l, int top_stretch_offset) { int splitX, n, nQuad = 0; int top_left, top_right; splitX = (c->left_corner_space - c->right_corner_space) / 2; top_left = top_stretch_offset; top_right = l->top.x2 - l->top.x1 - c->left_space - c->right_space - top_left - 1; /* top quads */ n = decor_set_horz_quad_line (q, c->left_space, top_left, c->right_space, top_right, -c->top_space, 0, GRAVITY_NORTH, l->top.x2 - l->top.x1, -top_right, GRAVITY_EAST, l->top.x1, l->top.y1); q += n; nQuad += n; n = decor_set_lSrS_window_quads (q, c, l); q += n; nQuad += n; /* bottom quads */ n = decor_set_horz_quad_line (q, c->left_space, c->left_corner_space, c->right_space, c->right_corner_space, 0, c->bottom_space, GRAVITY_SOUTH, l->bottom.x2 - l->bottom.x1, splitX, 0, l->bottom.x1, l->bottom.y1); nQuad += n; return nQuad; } int decor_set_lSrStSbX_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l, int bottom_stretch_offset) { int splitX, n, nQuad = 0; int bottom_left, bottom_right; splitX = (c->left_corner_space - c->right_corner_space) / 2; bottom_left = bottom_stretch_offset; bottom_right = l->bottom.x2 - l->bottom.x1 - c->left_space - c->right_space - bottom_left - 1; /* top quads */ n = decor_set_horz_quad_line (q, c->left_space, c->left_corner_space, c->right_space, c->right_corner_space, -c->top_space, 0, GRAVITY_NORTH, l->top.x2 - l->top.x1, splitX, 0, l->top.x1, l->top.y1); q += n; nQuad += n; n = decor_set_lSrS_window_quads (q, c, l); q += n; nQuad += n; /* bottom quads */ n = decor_set_horz_quad_line (q, c->left_space, bottom_left, c->right_space, bottom_right, 0, c->bottom_space, GRAVITY_SOUTH, l->bottom.x2 - l->bottom.x1, -bottom_right, GRAVITY_EAST, l->bottom.x1, l->bottom.y1); nQuad += n; return nQuad; } int decor_set_lXrXtXbX_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l, int left_stretch_offset, int right_stretch_offset, int top_stretch_offset, int bottom_stretch_offset) { int lh, rh, n, nQuad = 0; int left_top, left_bottom; int right_top, right_bottom; int top_left, top_right; int bottom_left, bottom_right; top_left = top_stretch_offset; top_right = l->top.x2 - l->top.x1 - c->left_space - c->right_space - top_left - 1; bottom_left = bottom_stretch_offset; bottom_right = l->bottom.x2 - l->bottom.x1 - c->left_space - c->right_space - bottom_left - 1; if (l->rotation) { lh = l->left.x2 - l->left.x1; rh = l->right.x2 - l->right.x1; } else { lh = l->left.y2 - l->left.y1; rh = l->right.y2 - l->right.y1; } left_top = left_stretch_offset; left_bottom = lh - left_top - 1; right_top = right_stretch_offset; right_bottom = rh - right_top - 1; /* top quads */ n = decor_set_horz_quad_line (q, c->left_space, top_left, c->right_space, top_right, -c->top_space, 0, GRAVITY_NORTH, l->top.x2 - l->top.x1, -top_right, GRAVITY_EAST, l->top.x1, l->top.y1); q += n; nQuad += n; /* left quads */ n = decor_set_vert_quad_row (q, 0, left_top, 0, left_bottom, -c->left_space, 0, GRAVITY_WEST, lh, -left_bottom, GRAVITY_SOUTH, l->left.x1, l->left.y1, l->rotation); q += n; nQuad += n; /* right quads */ n = decor_set_vert_quad_row (q, 0, right_top, 0, right_bottom, 0, c->right_space, GRAVITY_EAST, rh, -right_bottom, GRAVITY_SOUTH, l->right.x1, l->right.y1, l->rotation); q += n; nQuad += n; /* bottom quads */ n = decor_set_horz_quad_line (q, c->left_space, bottom_left, c->right_space, bottom_right, 0, c->bottom_space, GRAVITY_SOUTH, l->bottom.x2 - l->bottom.x1, -bottom_right, GRAVITY_EAST, l->bottom.x1, l->bottom.y1); nQuad += n; return nQuad; } #if INT_MAX != LONG_MAX static int errors; static int error_handler (Display *xdisplay, XErrorEvent *event) { ++errors; return 0; } /* XRenderSetPictureFilter used to be broken on LP64. This * works with either the broken or fixed version. */ static void XRenderSetPictureFilter_wrapper (Display *dpy, Picture picture, char *filter, XFixed *params, int nparams) { int (*old) (Display *, XErrorEvent *); errors = 0; old = XSetErrorHandler (error_handler); XRenderSetPictureFilter (dpy, picture, filter, params, nparams); XSync (dpy, False); XSetErrorHandler (old); if (errors) { long *long_params = malloc (sizeof (long) * nparams); int i; for (i = 0; i < nparams; ++i) long_params[i] = params[i]; XRenderSetPictureFilter (dpy, picture, filter, (XFixed *) long_params, nparams); free (long_params); } } #define XRenderSetPictureFilter XRenderSetPictureFilter_wrapper #endif static void set_picture_transform (Display *xdisplay, Picture p, int dx, int dy) { XTransform transform = { { { 1 << 16, 0, -dx << 16 }, { 0, 1 << 16, -dy << 16 }, { 0, 0, 1 << 16 }, } }; XRenderSetPictureTransform (xdisplay, p, &transform); } static void set_picture_clip (Display *xdisplay, Picture p, int width, int height, int clipX1, int clipY1, int clipX2, int clipY2) { XRectangle clip[4]; clip[0].x = 0; clip[0].y = 0; clip[0].width = width; clip[0].height = clipY1; clip[1].x = 0; clip[1].y = clipY2; clip[1].width = width; clip[1].height = height - clipY2; clip[2].x = 0; clip[2].y = clipY1; clip[2].width = clipX1; clip[2].height = clipY2 - clipY1; clip[3].x = clipX2; clip[3].y = clipY1; clip[3].width = width - clipX2; clip[3].height = clipY2 - clipY1; XRenderSetPictureClipRectangles (xdisplay, p, 0, 0, clip, 4); } static void set_no_picture_clip (Display *xdisplay, Picture p) { XRectangle clip; clip.x = 0; clip.y = 0; clip.width = SHRT_MAX; clip.height = SHRT_MAX; XRenderSetPictureClipRectangles (xdisplay, p, 0, 0, &clip, 1); } static XFixed * create_gaussian_kernel (double radius, double sigma, double alpha, int *r_size) { XFixed *params; double *amp, scale, x_scale, fx, sum; int size, half_size, x, i, n; scale = 1.0f / (2.0f * M_PI * sigma * sigma); half_size = alpha + 0.5f; if (half_size == 0) half_size = 1; size = half_size * 2 + 1; x_scale = 2.0f * radius / size; if (size < 3) return NULL; n = size; amp = malloc (sizeof (double) * n); if (!amp) return NULL; n += 2; params = malloc (sizeof (XFixed) * n); if (!params) { free (amp); return NULL; } i = 0; sum = 0.0f; for (x = 0; x < size; ++x) { fx = x_scale * (x - half_size); amp[i] = scale * exp ((-1.0f * (fx * fx)) / (2.0f * sigma * sigma)); sum += amp[i]; ++i; } /* normalize */ if (sum != 0.0) sum = 1.0 / sum; params[0] = params[1] = 0; for (i = 2; i < n; ++i) params[i] = XDoubleToFixed (amp[i - 2] * sum); free (amp); *r_size = size; return params; } #define SIGMA(r) ((r) / 2.0) #define ALPHA(r) (r) decor_shadow_t * decor_shadow_create (Display *xdisplay, Screen *screen, int width, int height, int left, int right, int top, int bottom, int solid_left, int solid_right, int solid_top, int solid_bottom, decor_shadow_options_t *opt, decor_context_t *c, decor_draw_func_t draw, void *closure) { static XRenderColor white = { 0xffff, 0xffff, 0xffff, 0xffff }; XRenderPictFormat *format; Pixmap pixmap; Picture src, dst, tmp; XFixed opacity, *params; XFilters *filters; char *filter = NULL; int size, n_params = 0; XRenderColor color; int shadow_offset_x; int shadow_offset_y; Pixmap d_pixmap; int d_width; int d_height; Window xroot = screen->root; decor_shadow_t *shadow; int clipX1, clipY1, clipX2, clipY2; shadow = malloc (sizeof (decor_shadow_t)); if (!shadow) return NULL; shadow->ref_count = 1; shadow->pixmap = 0; shadow->picture = 0; shadow->width = 0; shadow->height = 0; shadow_offset_x = opt->shadow_offset_x; shadow_offset_y = opt->shadow_offset_y; /* compute a gaussian convolution kernel */ params = create_gaussian_kernel (opt->shadow_radius, SIGMA (opt->shadow_radius), ALPHA (opt->shadow_radius), &size); if (!params) shadow_offset_x = shadow_offset_y = size = 0; if (opt->shadow_radius <= 0.0 && shadow_offset_x == 0 && shadow_offset_y == 0) size = 0; n_params = size + 2; size = size / 2; c->extents.left = left; c->extents.right = right; c->extents.top = top; c->extents.bottom = bottom; c->left_space = left + size - shadow_offset_x; c->right_space = right + size + shadow_offset_x; c->top_space = top + size - shadow_offset_y; c->bottom_space = bottom + size + shadow_offset_y; c->left_space = MAX (left, c->left_space); c->right_space = MAX (right, c->right_space); c->top_space = MAX (top, c->top_space); c->bottom_space = MAX (bottom, c->bottom_space); c->left_corner_space = MAX (1, size - solid_left + shadow_offset_x); c->right_corner_space = MAX (1, size - solid_right - shadow_offset_x); c->top_corner_space = MAX (1, size - solid_top + shadow_offset_y); c->bottom_corner_space = MAX (1, size - solid_bottom - shadow_offset_y); width = MAX (width, c->left_corner_space + c->right_corner_space); height = MAX (height, c->top_corner_space + c->bottom_corner_space); width = MAX (1, width); height = MAX (1, height); d_width = c->left_space + width + c->right_space; d_height = c->top_space + height + c->bottom_space; /* all pixmaps are ARGB32 */ format = XRenderFindStandardFormat (xdisplay, PictStandardARGB32); /* no shadow */ if (size <= 0) { if (params) free (params); return shadow; } pixmap = XCreatePixmap (xdisplay, xroot, d_width, d_height, 32); if (!pixmap) { free (params); return shadow; } /* query server for convolution filter */ filters = XRenderQueryFilters (xdisplay, pixmap); if (filters) { int i; for (i = 0; i < filters->nfilter; ++i) { if (strcmp (filters->filter[i], FilterConvolution) == 0) { filter = (char *) FilterConvolution; break; } } XFree (filters); } if (!filter) { XFreePixmap (xdisplay, pixmap); free (params); return shadow; } /* create pixmap for temporary decorations */ d_pixmap = XCreatePixmap (xdisplay, xroot, d_width, d_height, 32); if (!d_pixmap) { XFreePixmap (xdisplay, pixmap); free (params); return shadow; } src = XRenderCreateSolidFill (xdisplay, &white); dst = XRenderCreatePicture (xdisplay, d_pixmap, format, 0, NULL); tmp = XRenderCreatePicture (xdisplay, pixmap, format, 0, NULL); /* draw decoration */ (*draw) (xdisplay, d_pixmap, dst, d_width, d_height, c, closure); /* first pass */ params[0] = (n_params - 2) << 16; params[1] = 1 << 16; clipX1 = c->left_space + size; clipY1 = c->top_space + size; clipX2 = d_width - c->right_space - size; clipY2 = d_height - c->bottom_space - size; if (clipX1 < clipX2 && clipY1 < clipY2) set_picture_clip (xdisplay, tmp, d_width, d_height, clipX1, clipY1, clipX2, clipY2); set_picture_transform (xdisplay, dst, shadow_offset_x, 0); XRenderSetPictureFilter (xdisplay, dst, filter, params, n_params); XRenderComposite (xdisplay, PictOpSrc, src, dst, tmp, 0, 0, 0, 0, 0, 0, d_width, d_height); set_no_picture_clip (xdisplay, tmp); XRenderFreePicture (xdisplay, src); /* second pass */ params[0] = 1 << 16; params[1] = (n_params - 2) << 16; opacity = XDoubleToFixed (opt->shadow_opacity); if (opacity < (1 << 16)) { /* apply opacity as shadow color if less than 1.0 */ color.red = (opt->shadow_color[0] * opacity) >> 16; color.green = (opt->shadow_color[1] * opacity) >> 16; color.blue = (opt->shadow_color[2] * opacity) >> 16; color.alpha = opacity; opacity = 1 << 16; } else { /* shadow color */ color.red = opt->shadow_color[0]; color.green = opt->shadow_color[1]; color.blue = opt->shadow_color[2]; color.alpha = 0xffff; } src = XRenderCreateSolidFill (xdisplay, &color); clipX1 = c->left_space; clipY1 = c->top_space; clipX2 = d_width - c->right_space; clipY2 = d_height - c->bottom_space; if (clipX1 < clipX2 && clipY1 < clipY2) set_picture_clip (xdisplay, dst, d_width, d_height, clipX1, clipY1, clipX2, clipY2); set_picture_transform (xdisplay, tmp, 0, shadow_offset_y); XRenderSetPictureFilter (xdisplay, tmp, filter, params, n_params); XRenderComposite (xdisplay, PictOpSrc, src, tmp, dst, 0, 0, 0, 0, 0, 0, d_width, d_height); set_no_picture_clip (xdisplay, dst); XRenderFreePicture (xdisplay, src); if (opacity != (1 << 16)) { XFixed p[3]; p[0] = 1 << 16; p[1] = 1 << 16; p[2] = opacity; if (clipX1 < clipX2 && clipY1 < clipY2) set_picture_clip (xdisplay, tmp, d_width, d_height, clipX1, clipY1, clipX2, clipY2); /* apply opacity */ set_picture_transform (xdisplay, dst, 0, 0); XRenderSetPictureFilter (xdisplay, dst, filter, p, 3); XRenderComposite (xdisplay, PictOpSrc, dst, None, tmp, 0, 0, 0, 0, 0, 0, d_width, d_height); XFreePixmap (xdisplay, d_pixmap); shadow->pixmap = pixmap; } else { XFreePixmap (xdisplay, pixmap); shadow->pixmap = d_pixmap; } XRenderFreePicture (xdisplay, tmp); XRenderFreePicture (xdisplay, dst); shadow->picture = XRenderCreatePicture (xdisplay, shadow->pixmap, format, 0, NULL); shadow->width = d_width; shadow->height = d_height; free (params); return shadow; } void decor_shadow_destroy (Display *xdisplay, decor_shadow_t *shadow) { --shadow->ref_count; if (shadow->ref_count) return; if (shadow->picture) XRenderFreePicture (xdisplay, shadow->picture); if (shadow->pixmap) XFreePixmap (xdisplay, shadow->pixmap); free (shadow); } void decor_shadow_reference (decor_shadow_t *shadow) { ++shadow->ref_count; } void decor_draw_simple (Display *xdisplay, Pixmap pixmap, Picture picture, int width, int height, decor_context_t *c, void *closure) { static XRenderColor clear = { 0x0000, 0x0000, 0x0000, 0x0000 }; static XRenderColor white = { 0xffff, 0xffff, 0xffff, 0xffff }; XRenderFillRectangle (xdisplay, PictOpSrc, picture, &clear, 0, 0, width, height); XRenderFillRectangle (xdisplay, PictOpSrc, picture, &white, c->left_space - c->extents.left, c->top_space - c->extents.top, width - c->left_space - c->right_space + c->extents.left + c->extents.right, height - c->top_space - c->bottom_space + c->extents.top + c->extents.bottom); } void decor_get_default_layout (decor_context_t *c, int width, int height, decor_layout_t *layout) { width = MAX (width, c->left_corner_space + c->right_corner_space); height = MAX (height, c->top_corner_space + c->bottom_corner_space); width += c->left_space + c->right_space; layout->top.x1 = 0; layout->top.y1 = 0; layout->top.x2 = width; layout->top.y2 = c->top_space; layout->top.pad = 0; layout->left.x1 = 0; layout->left.y1 = c->top_space; layout->left.x2 = c->left_space; layout->left.y2 = c->top_space + height; layout->left.pad = 0; layout->right.x1 = width - c->right_space; layout->right.y1 = c->top_space; layout->right.x2 = width; layout->right.y2 = c->top_space + height; layout->right.pad = 0; layout->bottom.x1 = 0; layout->bottom.y1 = height + c->top_space; layout->bottom.x2 = width; layout->bottom.y2 = height + c->top_space + c->bottom_space; layout->bottom.pad = 0; layout->width = width; layout->height = height + c->top_space + c->bottom_space; layout->rotation = 0; } void decor_get_best_layout (decor_context_t *c, int width, int height, decor_layout_t *layout) { int y; /* use default layout when no left and right extents */ if (c->extents.left == 0 && c->extents.right == 0) { decor_get_default_layout (c, width, 1, layout); return; } width = MAX (width, c->left_corner_space + c->right_corner_space); height = MAX (height, c->top_corner_space + c->bottom_corner_space); width += c->left_space + c->right_space; if (width >= (height + 2)) { int max; layout->width = width; layout->top.x1 = 0; layout->top.y1 = 0; layout->top.x2 = width; layout->top.y2 = c->top_space; y = c->top_space; max = MAX (c->left_space, c->right_space); if (max < height) { layout->rotation = 1; y += 2; layout->top.pad = PAD_BOTTOM; layout->bottom.pad = PAD_TOP; layout->left.pad = PAD_TOP | PAD_BOTTOM | PAD_LEFT | PAD_RIGHT; layout->right.pad = PAD_TOP | PAD_BOTTOM | PAD_LEFT | PAD_RIGHT; layout->left.x1 = 1; layout->left.y1 = y; layout->left.x2 = 1 + height; layout->left.y2 = y + c->left_space; if ((height + 2) <= (width / 2)) { layout->right.x1 = height + 3; layout->right.y1 = y; layout->right.x2 = height + 3 + height; layout->right.y2 = y + c->right_space; y += max + 2; } else { y += c->left_space + 2; layout->right.x1 = 1; layout->right.y1 = y; layout->right.x2 = 1 + height; layout->right.y2 = y + c->right_space; y += c->right_space + 2; } } else { layout->rotation = 0; layout->top.pad = 0; layout->bottom.pad = 0; layout->left.pad = 0; layout->right.pad = 0; layout->left.x1 = 0; layout->left.y1 = y; layout->left.x2 = c->left_space; layout->left.y2 = y + height; layout->right.x1 = width - c->right_space; layout->right.y1 = y; layout->right.x2 = width; layout->right.y2 = y + height; y += height; } layout->bottom.x1 = 0; layout->bottom.y1 = y; layout->bottom.x2 = width; layout->bottom.y2 = y + c->bottom_space; y += c->bottom_space; } else { layout->rotation = 1; layout->left.pad = PAD_TOP | PAD_BOTTOM | PAD_LEFT | PAD_RIGHT; layout->right.pad = PAD_TOP | PAD_BOTTOM | PAD_LEFT | PAD_RIGHT; layout->top.x1 = 0; layout->top.y1 = 0; layout->top.x2 = width; layout->top.y2 = c->top_space; if (((width * 2) + 3) <= (height + 2)) { layout->width = height + 2; layout->top.pad = PAD_BOTTOM | PAD_RIGHT; layout->bottom.pad = PAD_TOP | PAD_BOTTOM | PAD_RIGHT | PAD_LEFT; layout->bottom.x1 = width + 2; layout->bottom.y1 = 1; layout->bottom.x2 = width + 2 + width; layout->bottom.y2 = 1 + c->bottom_space; y = MAX (c->top_space, 1 + c->bottom_space) + 2; layout->left.x1 = 1; layout->left.y1 = y; layout->left.x2 = 1 + height; layout->left.y2 = y + c->left_space; y += c->left_space + 2; layout->right.x1 = 1; layout->right.y1 = y; layout->right.x2 = 1 + height; layout->right.y2 = y + c->right_space; y += c->right_space; } else { layout->width = height + 2; layout->top.pad = PAD_BOTTOM | PAD_RIGHT; layout->bottom.pad = PAD_TOP | PAD_RIGHT; y = c->top_space + 2; layout->left.x1 = 1; layout->left.y1 = y; layout->left.x2 = 1 + height; layout->left.y2 = y + c->left_space; y += c->left_space + 2; layout->right.x1 = 1; layout->right.y1 = y; layout->right.x2 = 1 + height; layout->right.y2 = y + c->right_space; y += c->right_space + 2; layout->bottom.x1 = 0; layout->bottom.y1 = y; layout->bottom.x2 = width; layout->bottom.y2 = y + c->bottom_space; y += c->bottom_space; } } layout->height = y; } static XTransform xident = { { { 1 << 16, 0, 0 }, { 0, 1 << 16, 0 }, { 0, 0, 1 << 16 }, } }; void decor_fill_picture_extents_with_shadow (Display *xdisplay, decor_shadow_t *shadow, decor_context_t *context, Picture picture, decor_layout_t *layout) { int w, h, left, right, top, bottom, width, height; if (!shadow->picture) return; width = layout->top.x2 - layout->top.x1; if (layout->rotation) height = layout->left.x2 - layout->left.x1; else height = layout->left.y2 - layout->left.y1; height += context->top_space + context->bottom_space; left = context->left_space + context->left_corner_space; right = context->right_space + context->right_corner_space; top = context->top_space + context->top_corner_space; bottom = context->bottom_space + context->bottom_corner_space; if (width - left - right < 0) { left = width / 2; right = width - left; } if (height - top - bottom < 0) { top = height / 2; bottom = height - top; } w = width - left - right; h = height - top - bottom; /* top left */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->top.x1, layout->top.y1, left, context->top_space); /* top right */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, shadow->width - right, 0, 0, 0, layout->top.x2 - right, layout->top.y1, right, context->top_space); /* bottom left */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, shadow->height - context->bottom_space, 0, 0, layout->bottom.x1, layout->bottom.y1, left, context->bottom_space); /* bottom right */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, shadow->width - right, shadow->height - context->bottom_space, 0, 0, layout->bottom.x2 - right, layout->bottom.y1, right, context->bottom_space); if (w > 0) { int sw = shadow->width - left - right; int sx = left; if (sw != w) { XTransform t = { { { (sw << 16) / w, 0, left << 16 }, { 0, 1 << 16, 0 }, { 0, 0, 1 << 16 }, } }; sx = 0; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); } /* top */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, sx, 0, 0, 0, layout->top.x1 + left, layout->top.y1, w, context->top_space); /* bottom */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, sx, shadow->height - context->bottom_space, 0, 0, layout->bottom.x1 + left, layout->bottom.y1, w, context->bottom_space); if (sw != w) XRenderSetPictureTransform (xdisplay, shadow->picture, &xident); } if (layout->rotation) { XTransform t = { { { 0, 1 << 16, 0 }, { 1 << 16, 0, 0 }, { 0, 0, 1 << 16 } } }; t.matrix[1][2] = context->top_space << 16; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); /* left top */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->left.x1, layout->left.y1, top - context->top_space, context->left_space); t.matrix[0][2] = (shadow->width - context->right_space) << 16; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); /* right top */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->right.x1, layout->right.y1, top - context->top_space, context->right_space); XRenderSetPictureTransform (xdisplay, shadow->picture, &xident); } else { /* left top */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, context->top_space, 0, 0, layout->left.x1, layout->left.y1, context->left_space, top - context->top_space); /* right top */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, shadow->width - context->right_space, context->top_space, 0, 0, layout->right.x1, layout->right.y1, context->right_space, top - context->top_space); } if (layout->rotation) { XTransform t = { { { 0, 1 << 16, 0 }, { 1 << 16, 0, 0 }, { 0, 0, 1 << 16 } } }; t.matrix[1][2] = (shadow->height - bottom) << 16; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); /* left bottom */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->left.x2 - (bottom - context->bottom_space), layout->left.y1, bottom - context->bottom_space, context->left_space); t.matrix[0][2] = (shadow->width - context->right_space) << 16; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); /* right bottom */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->right.x2 - (bottom - context->bottom_space), layout->right.y1, bottom - context->bottom_space, context->right_space); XRenderSetPictureTransform (xdisplay, shadow->picture, &xident); } else { /* left bottom */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, shadow->height - bottom, 0, 0, layout->left.x1, layout->left.y2 - (bottom - context->bottom_space), context->left_space, bottom - context->bottom_space); /* right bottom */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, shadow->width - context->right_space, shadow->height - bottom, 0, 0, layout->right.x1, layout->right.y2 - (bottom - context->bottom_space), context->right_space, bottom - context->bottom_space); } if (h > 0) { int sh = shadow->height - top - bottom; if (layout->rotation) { XTransform t = { { { 0, 1 << 16, 0 }, { (sh << 16) / h, 0, 0 }, { 0, 0, 1 << 16 } } }; t.matrix[1][2] = top << 16; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); /* left */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->left.x1 + (top - context->top_space), layout->left.y1, h, context->left_space); t.matrix[0][2] = (shadow->width - context->right_space) << 16; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); /* right */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->right.x1 + (top - context->top_space), layout->right.y1, h, context->right_space); XRenderSetPictureTransform (xdisplay, shadow->picture, &xident); } else { int sy = top; if (sh != h) { XTransform t = { { { 1 << 16, 0, 0 }, { 0, (sh << 16) / h, top << 16 }, { 0, 0, 1 << 16 }, } }; sy = 0; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); } /* left */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, sy, 0, 0, layout->left.x1, layout->left.y1 + (top - context->top_space), context->left_space, h); /* right */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, shadow->width - context->right_space, sy, 0, 0, layout->right.x2 - context->right_space, layout->right.y1 + (top - context->top_space), context->right_space, h); if (sh != h) XRenderSetPictureTransform (xdisplay, shadow->picture, &xident); } } } static void _decor_pad_border_picture (Display *xdisplay, Picture dst, decor_box_t *box) { int x1, y1, x2, y2; x1 = box->x1; y1 = box->y1; x2 = box->x2; y2 = box->y2; if (box->pad & PAD_TOP) { XRenderComposite (xdisplay, PictOpSrc, dst, None, dst, x1, y1, 0, 0, x1, y1 - 1, x2 - x1, 1); --y1; } if (box->pad & PAD_BOTTOM) { XRenderComposite (xdisplay, PictOpSrc, dst, None, dst, x1, y2 - 1, 0, 0, x1, y2, x2 - x1, 1); ++y2; } if (box->pad & PAD_LEFT) { XRenderComposite (xdisplay, PictOpSrc, dst, None, dst, x1, y1, 0, 0, x1 - 1, y1, 1, y2 - y1); } if (box->pad & PAD_RIGHT) { XRenderComposite (xdisplay, PictOpSrc, dst, None, dst, x2 - 1, y1, 0, 0, x2, y1, 1, y2 - y1); } } #ifndef HAVE_XRENDER_0_9_3 /* XRenderCreateLinearGradient and XRenderCreateRadialGradient used to be * broken. Flushing Xlib's output buffer before calling one of these * functions will avoid this specific issue. */ static Picture XRenderCreateLinearGradient_wrapper (Display *xdisplay, const XLinearGradient *gradient, const XFixed *stops, const XRenderColor *colors, int nStops) { XFlush (xdisplay); return XRenderCreateLinearGradient (xdisplay, gradient, stops, colors, nStops); } static Picture XRenderCreateRadialGradient_wrapper (Display *xdisplay, const XRadialGradient *gradient, const XFixed *stops, const XRenderColor *colors, int nStops) { XFlush (xdisplay); return XRenderCreateRadialGradient (xdisplay, gradient, stops, colors, nStops); } #define XRenderCreateLinearGradient XRenderCreateLinearGradient_wrapper #define XRenderCreateRadialGradient XRenderCreateRadialGradient_wrapper #endif static void _decor_blend_horz_border_picture (Display *xdisplay, decor_context_t *context, Picture src, int xSrc, int ySrc, Picture dst, decor_layout_t *layout, Region region, unsigned short alpha, int shade_alpha, int x1, int y1, int x2, int y2, int dy, int direction, int ignore_src_alpha) { XRenderColor color[3] = { { 0xffff, 0xffff, 0xffff, 0xffff }, { alpha, alpha, alpha, alpha }, { 0x0, 0x0, 0x0, 0xffff } }; int op = PictOpSrc, gop = PictOpSrc; int left, right; left = context->extents.left; right = context->extents.right; XOffsetRegion (region, x1, y1); XRenderSetPictureClipRegion (xdisplay, dst, region); XOffsetRegion (region, -x1, -y1); if (ignore_src_alpha) { XRenderComposite (xdisplay, PictOpSrc, src, None, dst, xSrc, ySrc, 0, 0, x1, y1, x2 - x1, y2 - y1); XRenderFillRectangle (xdisplay, PictOpAdd, dst, &color[2], x1, y1, x2 - x1, y2 - y1); gop = PictOpInReverse; } if (alpha != 0xffff) { op = PictOpIn; if (shade_alpha) { static XFixed stop[2] = { 0, 1 << 16 }; XTransform transform = { { { 1 << 16, 0, 0 }, { 0, 1 << 16, 0 }, { 0, 0, 1 << 16 } } }; Picture grad; XLinearGradient linear; XRadialGradient radial; XRenderPictureAttributes attrib; attrib.repeat = RepeatPad; radial.inner.x = 0; radial.inner.y = 0; radial.inner.radius = 0; radial.outer.x = 0; radial.outer.y = 0; /* left */ radial.outer.radius = left << 16; grad = XRenderCreateRadialGradient (xdisplay, &radial, stop, color, 2); transform.matrix[1][1] = (left << 16) / dy; transform.matrix[0][2] = -left << 16; if (direction < 0) transform.matrix[1][2] = -left << 16; XRenderSetPictureTransform (xdisplay, grad, &transform); XRenderChangePicture (xdisplay, grad, CPRepeat, &attrib); XRenderComposite (xdisplay, gop, grad, None, dst, 0, 0, 0, 0, x1, y1, left, dy); XRenderFreePicture (xdisplay, grad); /* middle */ linear.p1.x = 0; linear.p2.x = 0; if (direction > 0) { linear.p1.y = 0; linear.p2.y = dy << 16; } else { linear.p1.y = dy << 16; linear.p2.y = 0; } grad = XRenderCreateLinearGradient (xdisplay, &linear, stop, color, 2); XRenderChangePicture (xdisplay, grad, CPRepeat, &attrib); XRenderComposite (xdisplay, gop, grad, None, dst, 0, 0, 0, 0, x1 + left, y1, (x2 - x1) - left - right, dy); XRenderFreePicture (xdisplay, grad); /* right */ radial.outer.radius = right << 16; grad = XRenderCreateRadialGradient (xdisplay, &radial, stop, color, 2); transform.matrix[1][1] = (right << 16) / dy; transform.matrix[0][2] = 1 << 16; if (direction < 0) transform.matrix[1][2] = -right << 16; XRenderSetPictureTransform (xdisplay, grad, &transform); XRenderChangePicture (xdisplay, grad, CPRepeat, &attrib); XRenderComposite (xdisplay, gop, grad, None, dst, 0, 0, 0, 0, x2 - right, y1, right, dy); XRenderFreePicture (xdisplay, grad); } else { XRenderFillRectangle (xdisplay, gop, dst, &color[1], x1, y1, x2 - x1, y2 - y1); } } if (!ignore_src_alpha) XRenderComposite (xdisplay, op, src, None, dst, xSrc, ySrc, 0, 0, x1, y1, x2 - x1, y2 - y1); set_no_picture_clip (xdisplay, dst); } static void _decor_blend_vert_border_picture (Display *xdisplay, decor_context_t *context, Picture src, int xSrc, int ySrc, Picture dst, decor_layout_t *layout, Region region, unsigned short alpha, int shade_alpha, int x1, int y1, int x2, int y2, int direction, int ignore_src_alpha) { XRenderColor color[3] = { { 0xffff, 0xffff, 0xffff, 0xffff }, { alpha, alpha, alpha, alpha }, { 0x0, 0x0, 0x0, 0xffff } }; int op = PictOpSrc, gop = PictOpSrc; if (layout->rotation) { Region rotated_region; XRectangle rect; BoxPtr pBox = region->rects; int nBox = region->numRects; rotated_region = XCreateRegion (); while (nBox--) { rect.x = x1 + pBox->y1; rect.y = y1 + pBox->x1; rect.width = pBox->y2 - pBox->y1; rect.height = pBox->x2 - pBox->x1; XUnionRectWithRegion (&rect, rotated_region, rotated_region); ++pBox; } XRenderSetPictureClipRegion (xdisplay, dst, rotated_region); XDestroyRegion (rotated_region); } else { XOffsetRegion (region, x1, y1); XRenderSetPictureClipRegion (xdisplay, dst, region); XOffsetRegion (region, -x1, -y1); } if (ignore_src_alpha) { if (layout->rotation) { XTransform t = { { { 0, 1 << 16, 0 }, { 1 << 16, 0, 0 }, { 0, 0, 1 << 16 } } }; t.matrix[0][2] = xSrc << 16; t.matrix[1][2] = ySrc << 16; XRenderSetPictureTransform (xdisplay, src, &t); XRenderComposite (xdisplay, PictOpSrc, src, None, dst, 0, 0, 0, 0, x1, y1, x2 - x1, y2 - y1); XRenderFillRectangle (xdisplay, PictOpAdd, dst, &color[2], x1, y1, x2 - x1, y2 - y1); XRenderSetPictureTransform (xdisplay, src, &xident); } else { XRenderComposite (xdisplay, PictOpSrc, src, None, dst, xSrc, ySrc, 0, 0, x1, y1, x2 - x1, y2 - y1); XRenderFillRectangle (xdisplay, PictOpAdd, dst, &color[2], x1, y1, x2 - x1, y2 - y1); } gop = PictOpInReverse; } if (alpha != 0xffff) { op = PictOpIn; if (shade_alpha) { static XFixed stop[2] = { 0, 1 << 16 }; Picture grad; XLinearGradient linear; XRenderPictureAttributes attrib; attrib.repeat = RepeatPad; if (layout->rotation) { linear.p1.x = 0; linear.p2.x = 0; if (direction < 0) { linear.p1.y = 0; linear.p2.y = (y2 - y1) << 16; } else { linear.p1.y = (y2 - y1) << 16; linear.p2.y = 0 << 16; } } else { linear.p1.y = 0; linear.p2.y = 0; if (direction < 0) { linear.p1.x = 0; linear.p2.x = (x2 - x1) << 16; } else { linear.p1.x = (x2 - x1) << 16; linear.p2.x = 0; } } grad = XRenderCreateLinearGradient (xdisplay, &linear, stop, color, 2); XRenderChangePicture (xdisplay, grad, CPRepeat, &attrib); XRenderComposite (xdisplay, gop, grad, None, dst, 0, 0, 0, 0, x1, y1, x2 - x1, y2 - y1); XRenderFreePicture (xdisplay, grad); } else { XRenderFillRectangle (xdisplay, gop, dst, &color[1], x1, y1, x2 - x1, y2 - y1); } } if (!ignore_src_alpha) { if (layout->rotation) { XTransform t = { { { 0, 1 << 16, 0 }, { 1 << 16, 0, 0 }, { 0, 0, 1 << 16 } } }; t.matrix[0][2] = xSrc << 16; t.matrix[1][2] = ySrc << 16; XRenderSetPictureTransform (xdisplay, src, &t); XRenderComposite (xdisplay, op, src, None, dst, 0, 0, 0, 0, x1, y1, x2 - x1, y2 - y1); XRenderSetPictureTransform (xdisplay, src, &xident); } else { XRenderComposite (xdisplay, op, src, None, dst, xSrc, ySrc, 0, 0, x1, y1, x2 - x1, y2 - y1); } } set_no_picture_clip (xdisplay, dst); } void decor_blend_border_picture (Display *xdisplay, decor_context_t *context, Picture src, int xSrc, int ySrc, Picture dst, decor_layout_t *layout, unsigned int border, Region region, unsigned short alpha, int shade_alpha, int ignore_src_alpha) { int left, right, bottom, top; int x1, y1, x2, y2; left = context->extents.left; right = context->extents.right; top = context->extents.top; bottom = context->extents.bottom; switch (border) { case BORDER_TOP: x1 = layout->top.x1 + context->left_space - left; y1 = layout->top.y1 + context->top_space - top; x2 = layout->top.x2 - context->right_space + right; y2 = layout->top.y2; _decor_blend_horz_border_picture (xdisplay, context, src, xSrc, ySrc, dst, layout, region, alpha, shade_alpha, x1, y1, x2, y2, top, -1, ignore_src_alpha); _decor_pad_border_picture (xdisplay, dst, &layout->top); break; case BORDER_BOTTOM: x1 = layout->bottom.x1 + context->left_space - left; y1 = layout->bottom.y1; x2 = layout->bottom.x2 - context->right_space + right; y2 = layout->bottom.y1 + bottom; _decor_blend_horz_border_picture (xdisplay, context, src, xSrc, ySrc, dst, layout, region, alpha, shade_alpha, x1, y1, x2, y2, bottom, 1, ignore_src_alpha); _decor_pad_border_picture (xdisplay, dst, &layout->bottom); break; case BORDER_LEFT: x1 = layout->left.x1; y1 = layout->left.y1; x2 = layout->left.x2; y2 = layout->left.y2; if (layout->rotation) y1 += context->left_space - context->extents.left; else x1 += context->left_space - context->extents.left; _decor_blend_vert_border_picture (xdisplay, context, src, xSrc, ySrc, dst, layout, region, alpha, shade_alpha, x1, y1, x2, y2, 1, ignore_src_alpha); _decor_pad_border_picture (xdisplay, dst, &layout->left); break; case BORDER_RIGHT: x1 = layout->right.x1; y1 = layout->right.y1; x2 = layout->right.x2; y2 = layout->right.y2; if (layout->rotation) y2 -= context->right_space - context->extents.right; else x2 -= context->right_space - context->extents.right; _decor_blend_vert_border_picture (xdisplay, context, src, xSrc, ySrc, dst, layout, region, alpha, shade_alpha, x1, y1, x2, y2, -1, ignore_src_alpha); _decor_pad_border_picture (xdisplay, dst, &layout->right); break; default: break; } } int decor_post_pending (Display *xdisplay, Window client, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions) { XEvent event; Atom decor_pending = XInternAtom (xdisplay, DECOR_PIXMAP_PENDING_ATOM_NAME, FALSE); /* Send a client message indicating that a new * decoration can be generated for this window */ event.xclient.type = ClientMessage; event.xclient.window = client; event.xclient.message_type = decor_pending; event.xclient.format = 32; event.xclient.data.l[0] = frame_type; event.xclient.data.l[1] = frame_state; event.xclient.data.l[2] = frame_actions; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (xdisplay, DefaultRootWindow (xdisplay), 0, StructureNotifyMask, &event); return 1; } int decor_post_generate_request (Display *xdisplay, Window client, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions) { XEvent event; Atom decor_request = XInternAtom (xdisplay, DECOR_REQUEST_PIXMAP_ATOM_NAME, FALSE); /* Send a client message indicating that a new * decoration can be generated for this window */ event.xclient.type = ClientMessage; event.xclient.window = client; event.xclient.message_type = decor_request; event.xclient.format = 32; event.xclient.data.l[0] = frame_type; event.xclient.data.l[1] = frame_state; event.xclient.data.l[2] = frame_actions; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (xdisplay, DefaultRootWindow (xdisplay), 0, StructureNotifyMask, &event); return 1; } int decor_post_delete_pixmap (Display *xdisplay, Window window, Pixmap pixmap) { XEvent event; Atom decor_delete_pixmap = XInternAtom (xdisplay, DECOR_DELETE_PIXMAP_ATOM_NAME, FALSE); /* Send a client message indicating that this * pixmap is no longer in use and can be removed */ event.xclient.type = ClientMessage; event.xclient.window = window; event.xclient.message_type = decor_delete_pixmap; event.xclient.format = 32; event.xclient.data.l[0] = pixmap; event.xclient.data.l[1] = 0; event.xclient.data.l[2] = 0; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (xdisplay, DefaultRootWindow (xdisplay), 0, StructureNotifyMask, &event); return 1; } int decor_acquire_dm_session (Display *xdisplay, int screen, const char *name, int replace_current_dm, Time *timestamp) { XEvent event; XSetWindowAttributes attr; Window current_dm_sn_owner, new_dm_sn_owner; Atom dm_sn_atom; Atom manager_atom; Atom dm_name_atom; Atom utf8_string_atom; Time dm_sn_timestamp; char buf[128]; manager_atom = XInternAtom (xdisplay, "MANAGER", FALSE); dm_name_atom = XInternAtom (xdisplay, "_COMPIZ_DM_NAME", 0); utf8_string_atom = XInternAtom (xdisplay, "UTF8_STRING", 0); snprintf (buf, 128, "_COMPIZ_DM_S%d", screen); dm_sn_atom = XInternAtom (xdisplay, buf, 0); current_dm_sn_owner = XGetSelectionOwner (xdisplay, dm_sn_atom); if (current_dm_sn_owner != None) { if (!replace_current_dm) return DECOR_ACQUIRE_STATUS_OTHER_DM_RUNNING; XSelectInput (xdisplay, current_dm_sn_owner, StructureNotifyMask); } attr.override_redirect = TRUE; attr.event_mask = PropertyChangeMask; new_dm_sn_owner = XCreateWindow (xdisplay, XRootWindow (xdisplay, screen), -100, -100, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); XChangeProperty (xdisplay, new_dm_sn_owner, dm_name_atom, utf8_string_atom, 8, PropModeReplace, (unsigned char *) name, strlen (name)); XWindowEvent (xdisplay, new_dm_sn_owner, PropertyChangeMask, &event); dm_sn_timestamp = event.xproperty.time; XSetSelectionOwner (xdisplay, dm_sn_atom, new_dm_sn_owner, dm_sn_timestamp); if (XGetSelectionOwner (xdisplay, dm_sn_atom) != new_dm_sn_owner) { XDestroyWindow (xdisplay, new_dm_sn_owner); return DECOR_ACQUIRE_STATUS_FAILED; } /* Send client message indicating that we are now the DM */ event.xclient.type = ClientMessage; event.xclient.window = XRootWindow (xdisplay, screen); event.xclient.message_type = manager_atom; event.xclient.format = 32; event.xclient.data.l[0] = dm_sn_timestamp; event.xclient.data.l[1] = dm_sn_atom; event.xclient.data.l[2] = 0; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (xdisplay, XRootWindow (xdisplay, screen), 0, StructureNotifyMask, &event); /* Wait for old decoration manager to go away */ if (current_dm_sn_owner != None) { do { XWindowEvent (xdisplay, current_dm_sn_owner, StructureNotifyMask, &event); } while (event.type != DestroyNotify); } *timestamp = dm_sn_timestamp; return DECOR_ACQUIRE_STATUS_SUCCESS; } void decor_set_dm_check_hint (Display *xdisplay, int screen, int supports) { XSetWindowAttributes attrs; unsigned long data; Window xroot; Atom atom; Atom type_pixmap_atom; Atom type_window_atom; Atom type_supported_atom; Atom supported_deco_atoms[2]; int i; type_supported_atom = XInternAtom (xdisplay, DECOR_TYPE_ATOM_NAME, 0); type_pixmap_atom = XInternAtom (xdisplay, DECOR_TYPE_PIXMAP_ATOM_NAME, 0); type_window_atom = XInternAtom (xdisplay, DECOR_TYPE_WINDOW_ATOM_NAME, 0); if (!supports) return; attrs.override_redirect = 1; attrs.event_mask = PropertyChangeMask; xroot = RootWindow (xdisplay, screen); data = XCreateWindow (xdisplay, xroot, -100, -100, 1, 1, 0, CopyFromParent, CopyFromParent, (Visual *) CopyFromParent, CWOverrideRedirect | CWEventMask, &attrs); i = 0; if (supports & WINDOW_DECORATION_TYPE_PIXMAP) { supported_deco_atoms[i] = type_pixmap_atom; ++i; } if (supports & WINDOW_DECORATION_TYPE_WINDOW) { supported_deco_atoms[i] = type_window_atom; ++i; } XChangeProperty (xdisplay, data, type_supported_atom, XA_ATOM, 32, PropModeReplace, (unsigned char *) supported_deco_atoms, i); atom = XInternAtom (xdisplay, DECOR_SUPPORTING_DM_CHECK_ATOM_NAME, 0); XChangeProperty (xdisplay, xroot, atom, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &data, 1); } /* from fvwm2, Copyright Matthias Clasen, Dominik Vogt */ static int convert_property (Display *xdisplay, Window w, Atom target, Atom property, Time dm_sn_timestamp) { static const unsigned short N_TARGETS = 4; Atom conversion_targets[N_TARGETS]; conversion_targets[0] = XInternAtom (xdisplay, "TARGETS", 0); conversion_targets[1] = XInternAtom (xdisplay, "MULTIPLE", 0); conversion_targets[2] = XInternAtom (xdisplay, "TIMESTAMP", 0); conversion_targets[3] = XInternAtom (xdisplay, "VERSION", 0); if (target == conversion_targets[0]) XChangeProperty (xdisplay, w, property, XA_ATOM, 32, PropModeReplace, (unsigned char *) conversion_targets, N_TARGETS); else if (target == conversion_targets[2]) XChangeProperty (xdisplay, w, property, XA_INTEGER, 32, PropModeReplace, (unsigned char *) &dm_sn_timestamp, 1); else if (target == conversion_targets[3]) { long icccm_version[] = { 2, 0 }; XChangeProperty (xdisplay, w, property, XA_INTEGER, 32, PropModeReplace, (unsigned char *) icccm_version, 2); } else return 0; /* Be sure the PropertyNotify has arrived so we * can send SelectionNotify */ XSync (xdisplay, 0); return 1; } void decor_handle_selection_request (Display *xdisplay, XEvent *event, Time timestamp) { XSelectionEvent reply; Atom multiple_atom; Atom atom_pair_atom; reply.type = SelectionNotify; reply.display = xdisplay; reply.requestor = event->xselectionrequest.requestor; reply.selection = event->xselectionrequest.selection; reply.target = event->xselectionrequest.target; reply.property = None; reply.time = event->xselectionrequest.time; multiple_atom = XInternAtom (xdisplay, "MULTIPLE", 0); atom_pair_atom = XInternAtom (xdisplay, "ATOM_PAIR", 0); if (event->xselectionrequest.target == multiple_atom) { if (event->xselectionrequest.property != None) { Atom type, *adata; int i, format; unsigned long num, rest; unsigned char *data; if (XGetWindowProperty (xdisplay, event->xselectionrequest.requestor, event->xselectionrequest.property, 0, 256, FALSE, atom_pair_atom, &type, &format, &num, &rest, &data) != Success) return; /* FIXME: to be 100% correct, should deal with rest > 0, * but since we have 4 possible targets, we will hardly ever * meet multiple requests with a length > 8 */ adata = (Atom *) data; i = 0; while (i < (int) num) { if (!convert_property (xdisplay, event->xselectionrequest.requestor, adata[i], adata[i + 1], timestamp)) adata[i + 1] = None; i += 2; } XChangeProperty (xdisplay, event->xselectionrequest.requestor, event->xselectionrequest.property, atom_pair_atom, 32, PropModeReplace, data, num); } } else { if (event->xselectionrequest.property == None) event->xselectionrequest.property = event->xselectionrequest.target; if (convert_property (xdisplay, event->xselectionrequest.requestor, event->xselectionrequest.target, event->xselectionrequest.property, timestamp)) reply.property = event->xselectionrequest.property; } XSendEvent (xdisplay, event->xselectionrequest.requestor, FALSE, 0L, (XEvent *) &reply); } int decor_handle_selection_clear (Display *xdisplay, XEvent *xevent, int screen) { Atom dm_sn_atom; char buf[128]; snprintf (buf, 128, "_COMPIZ_DM_S%d", screen); dm_sn_atom = XInternAtom (xdisplay, buf, 0); if (xevent->xselectionclear.selection == dm_sn_atom) return DECOR_SELECTION_GIVE_UP; return DECOR_SELECTION_KEEP; } compiz-0.9.11+14.04.20140409/libdecoration/libdecoration.pc.in0000644000015301777760000000044612321343002024063 0ustar pbusernogroup00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libdecoration Description: Window decoration library Version: @VERSION@ Requires: @DECORATION_REQUIRES@ Libs: @DECORATION_LIBS@ -L${libdir} -ldecoration Cflags: @DECORATION_CFLAGS@ -I${includedir}/compiz compiz-0.9.11+14.04.20140409/libdecoration/config.h.libdecoration.in0000644000015301777760000000021412321343002025145 0ustar pbusernogroup00000000000000/* Define to 1 if xrender version >= 0.9.3 */ #cmakedefine HAVE_XRENDER_0_9_3 1 #define DECOR_INTERFACE_VERSION ${DECOR_INTERFACE_VERSION} compiz-0.9.11+14.04.20140409/libdecoration/CMakeLists.txt0000644000015301777760000000235412321343002023054 0ustar pbusernogroup00000000000000compiz_pkg_check_modules (HAVE_XRENDER_0_9_3 xrender>=0.9.3) configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.libdecoration.in ${CMAKE_CURRENT_BINARY_DIR}/config.h ) include_directories ( ${compiz_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${LIBDECORATION_INCLUDE_DIRS} ) add_definitions ( -DHAVE_CONFIG_H ) link_directories ( ${LIBDECORATION_LINK_DIRS} ) add_library (decoration SHARED decoration.c ) set_target_properties (decoration PROPERTIES VERSION 0.0.0 SOVERSION 0 ) target_link_libraries ( decoration ${LIBDECORATION_LIBRARIES} m ) install ( TARGETS decoration DESTINATION ${libdir} ) set (DECORATION_LIBS "") foreach (_val ${LIBDECORATION_LDFLAGS}) set (DECORATION_LIBS "${DECORATION_LIBS}${_val} ") endforeach (_val ${LIBDECORATION_LDFLAGS}) set (DECORATION_CFLAGS "") foreach (_val ${LIBDECORATION_CFLAGS}) set (DECORATION_CFLAGS "${DECORATION_CFLAGS}${_val} ") endforeach (_val ${LIBDECORATION_CFLAGS}) compiz_configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/libdecoration.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libdecoration.pc ) install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/libdecoration.pc DESTINATION ${libdir}/pkgconfig ) compiz-0.9.11+14.04.20140409/contribute/0000755000015301777760000000000012321344021017652 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/contribute/QtCreatorConfig.xml0000644000015301777760000000361112321343002023425 0ustar pbusernogroup00000000000000 CodeStyleData true false true false false false false true true false false false true true false true false false false 4 true true 2 false 8 DisplayName X11 compiz-0.9.11+14.04.20140409/COPYING.GPL0000644000015301777760000004311012321343002017145 0ustar pbusernogroup00000000000000 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. compiz-0.9.11+14.04.20140409/tests/0000755000015301777760000000000012321344021016636 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/compiz.supp0000644000015301777760000000554712321343002021061 0ustar pbusernogroup00000000000000# # Valgrind suppression file for running compiz # # Copyright (C) 2013 Canonical Ltd. # Author: Daniel van Vugt # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02110-1301, USA. # { Google protobuf leaks in operator new(unsigned long) Memcheck:Leak fun:_Znwm ... fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:*protobuf_AddDesc_* } { g_spawn_check_exit_status Memcheck:Cond fun:g_spawn_check_exit_status } { drmIoctl Memcheck:Param ioctl(generic) fun:ioctl fun:drmIoctl } { drm_intel_bufmgr_gem_init Memcheck:Cond fun:drm_intel_bufmgr_gem_init } { Mesa i965 x64 Memcheck:Cond obj:/usr/lib/x86_64-linux-gnu/dri/i965_dri.so } { Mesa libdrm_intel x64 Memcheck:Cond obj:/usr/lib/x86_64-linux-gnu/libdrm_intel.so.1.0.0 } { _mesa_TexImage2D bad write 4 Memcheck:Addr4 fun:* ... fun:_mesa_TexImage2D } { _mesa_TexImage2D bad write 1 Memcheck:Addr1 fun:* ... fun:_mesa_TexImage2D } { _mesa_TexImage2D bad memcpy 8 Memcheck:Addr8 fun:memcpy* ... fun:_mesa_TexImage2D } { Mesa, how do you get glClear wrong? Memcheck:Addr1 fun:bcmp ... fun:_mesa_meta_glsl_Clear } { Mesa glLinkProgram off by 1 Memcheck:Addr1 fun:bcmp ... fun:_mesa_glsl_link_shader } { g_type_init leaks by design, at least up to glib 2.35 Memcheck:Leak fun:*alloc ... fun:g_type_init_with_debug_flags } { g_bus_get_sync Memcheck:Leak fun:*alloc ... fun:g_bus_get_sync } { g_bus_get_sync memalign Memcheck:Leak fun:memalign ... fun:g_bus_get_sync } { dbus *alloc leaks Memcheck:Leak fun:*alloc ... fun:g_dbus_* } { dbus memalign leaks Memcheck:Leak fun:memalign ... fun:g_dbus_* } { compizBinPath needs to leak env vars Memcheck:Leak fun:malloc fun:strdup fun:*detectCompizBinPath* } { g_settings_class_init intentionally leaks signals Memcheck:Leak fun:*alloc ... fun:g_signal_new ... fun:g_type_class_ref ... fun:g_object_new } compiz-0.9.11+14.04.20140409/tests/util/0000755000015301777760000000000012321344021017613 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/util/run_with_ld_library_path.sh0000755000015301777760000000023612321343002025227 0ustar pbusernogroup00000000000000#!/bin/bash args=("$@") ld_library_path=${args[0]} unset args[0] LD_LIBRARY_PATH=${ld_library_path} export LD_LIBRARY_PATH echo ${args[@]} exec ${args[@]} compiz-0.9.11+14.04.20140409/tests/xorg-gtest/0000755000015301777760000000000012321344021020741 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/xorg-gtest/plugins/0000755000015301777760000000000012321344021022422 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/xorg-gtest/plugins/testhelper/0000755000015301777760000000000012321344021024601 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/xorg-gtest/plugins/testhelper/testhelper.xml.in0000644000015301777760000000020512321343002030102 0ustar pbusernogroup00000000000000 compiz-0.9.11+14.04.20140409/tests/xorg-gtest/plugins/testhelper/CMakeLists.txt0000644000015301777760000000032612321343002027340 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) include_directories (${COMPIZ_XORG_GTEST_COMMUNICATOR_INCLUDE_DIR}) compiz_plugin (testhelper NOINSTALL LIBRARIES ${COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY}) compiz-0.9.11+14.04.20140409/tests/xorg-gtest/plugins/testhelper/src/0000755000015301777760000000000012321344021025370 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/xorg-gtest/plugins/testhelper/src/testhelper.cpp0000644000015301777760000001664012321343002030260 0ustar pbusernogroup00000000000000/* * Copyright © 2013 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #include #include #include "testhelper.h" COMPIZ_PLUGIN_20090315 (testhelper, TestHelperPluginVTable) namespace { template void XFreeT (T *t) { XFree (t); } } namespace ct = compiz::testing; namespace ctm = compiz::testing::messages; void TestHelperScreen::handleEvent (XEvent *event) { if (event->type == ClientMessage) { if (event->xclient.window != screen->root ()) { std::map ::iterator it = mMessageHandlers.find (event->xclient.message_type); if (it != mMessageHandlers.end ()) { ClientMessageHandler handler (it->second); CompWindow *w = screen->findWindow (event->xclient.window); XClientMessageEvent *xce = &event->xclient; long *data = xce->data.l; if (w) ((*TestHelperWindow::get (w)).*(handler)) (data); } } } screen->handleEvent (event); } void TestHelperScreen::watchForMessage (Atom message, ClientMessageHandler handler) { if (mMessageHandlers.find (message) != mMessageHandlers.end ()) { boost::shared_ptr name (XGetAtomName (screen->dpy (), message), boost::bind (XFreeT , _1)); compLogMessage ("testhelper", CompLogLevelWarn, "a message handler was already defined for %s", name.get ()); return; } mMessageHandlers[message] = handler; } void TestHelperScreen::removeMessageWatch (Atom message) { std::map ::iterator it = mMessageHandlers.find (message); if (it != mMessageHandlers.end ()) mMessageHandlers.erase (it); } Atom TestHelperScreen::fetchAtom (const char *message) { return mAtomStore.FetchForString (message); } void TestHelperWindow::configureAndReport (long *data) { XWindowChanges xwc; XWindowChanges saved; xwc.x = data[0]; xwc.y = data[1]; xwc.width = data[2]; xwc.height = data[3]; int mask = data[4]; /* configureXWindow has a nasty side-effect of * changing xwc to the client-window co-ordinates, * so we should back it up first */ saved = xwc; window->configureXWindow (mask, &xwc); xwc = saved; std::vector response; response.push_back (xwc.x); response.push_back (xwc.y); response.push_back (xwc.width); response.push_back (xwc.height); TestHelperScreen *ts = TestHelperScreen::get (screen); const Atom atom = ts->fetchAtom (ctm::TEST_HELPER_WINDOW_CONFIGURE_PROCESSED); ct::SendClientMessage (screen->dpy (), atom, screen->root (), window->id (), response); } void TestHelperWindow::setFrameExtentsAndReport (long *data) { /* Only change the frame input and not the border */ CompWindowExtents input (data[0], data[1], data[2], data[3]); CompWindowExtents border (0, 0, 0, 0); window->setWindowFrameExtents (&border, &input); std::vector response; response.push_back (input.left); response.push_back (input.right); response.push_back (input.top); response.push_back (input.bottom); TestHelperScreen *ts = TestHelperScreen::get (screen); const Atom atom = ts->fetchAtom (ctm::TEST_HELPER_FRAME_EXTENTS_CHANGED); ct::SendClientMessage (screen->dpy (), atom, screen->root (), window->id (), response); } void TestHelperWindow::setConfigureLock (long *data) { bool enabled = data[0] ? true : false; if (enabled && !configureLock) configureLock = window->obtainLockOnConfigureRequests (); else if (!enabled && configureLock) { configureLock->release (); configureLock.reset (); } } void TestHelperWindow::setDestroyOnReparent (long *) { destroyOnReparent = true; } void TestHelperWindow::restackAtLeastAbove (long *data) { ServerLock lock (screen->serverGrabInterface ()); Window above = data[0]; XWindowAttributes attrib; if (!XGetWindowAttributes (screen->dpy (), above, &attrib)) return; CompWindow *w = screen->findTopLevelWindow (above, true); for (; w; w = w->next) if (!w->overrideRedirect ()) break; if (!w) return; XWindowChanges xwc; xwc.stack_mode = Above; xwc.sibling = w->frame () ? w->frame () : w->id (); window->restackAndConfigureXWindow (CWStackMode | CWSibling, &xwc, lock); } void TestHelperWindow::windowNotify (CompWindowNotify n) { switch (n) { case CompWindowNotifyReparent: if (destroyOnReparent) { Window id = window->id (); window->destroy (); XDestroyWindow (screen->dpy (), id); } break; default: break; } window->windowNotify (n); } TestHelperWindow::TestHelperWindow (CompWindow *w) : PluginClassHandler (w), window (w), configureLock (), destroyOnReparent (false) { WindowInterface::setHandler (w); TestHelperScreen *ts = TestHelperScreen::get (screen); std::vector data; data.push_back (static_cast (window->id ())); data.push_back (static_cast (window->overrideRedirect ())); ct::SendClientMessage (screen->dpy (), ts->fetchAtom (ctm::TEST_HELPER_WINDOW_READY), screen->root (), screen->root (), data); } TestHelperScreen::TestHelperScreen (CompScreen *s) : PluginClassHandler (s), screen (s), mAtomStore (s->dpy ()) { ScreenInterface::setHandler (s); /* Register the message handlers on each window */ watchForMessage (fetchAtom (ctm::TEST_HELPER_CONFIGURE_WINDOW), &TestHelperWindow::configureAndReport); watchForMessage (fetchAtom (ctm::TEST_HELPER_CHANGE_FRAME_EXTENTS), &TestHelperWindow::setFrameExtentsAndReport); watchForMessage (fetchAtom (ctm::TEST_HELPER_LOCK_CONFIGURE_REQUESTS), &TestHelperWindow::setConfigureLock); watchForMessage (fetchAtom (ctm::TEST_HELPER_DESTROY_ON_REPARENT), &TestHelperWindow::setDestroyOnReparent); watchForMessage (fetchAtom (ctm::TEST_HELPER_RESTACK_ATLEAST_ABOVE), &TestHelperWindow::restackAtLeastAbove); ct::SendClientMessage (s->dpy (), mAtomStore.FetchForString (ctm::TEST_HELPER_READY_MSG), s->root (), s->root (), std::vector ()); } bool TestHelperPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/tests/xorg-gtest/plugins/testhelper/src/testhelper.h0000644000015301777760000000536012321343002027722 0ustar pbusernogroup00000000000000/* * Copyright © 2013 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #ifndef _COMPIZ_TESTHELPER_H #define _COMPIZ_TESTHELPER_H #include #include #include #include #include #include #include #include "testhelper_options.h" class TestHelperWindow; class TestHelperScreen : public PluginClassHandler , public ScreenInterface, public TesthelperOptions { public: typedef void (TestHelperWindow::*ClientMessageHandler) (long *); TestHelperScreen (CompScreen *); void handleEvent (XEvent *event); void watchForMessage (Atom, ClientMessageHandler); void removeMessageWatch (Atom); Atom fetchAtom (const char *); private: CompScreen *screen; compiz::testing::MessageAtoms mAtomStore; std::map mMessageHandlers; }; class TestHelperWindow : public PluginClassHandler , public WindowInterface { public: TestHelperWindow (CompWindow *); void configureAndReport (long *); void setFrameExtentsAndReport (long *); void setConfigureLock (long *); void setDestroyOnReparent (long *); void restackAtLeastAbove (long *); private: void windowNotify (CompWindowNotify n); CompWindow *window; compiz::window::configure_buffers::Releasable::Ptr configureLock; bool destroyOnReparent; }; class TestHelperPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #endif compiz-0.9.11+14.04.20140409/tests/xorg-gtest/plugins/CMakeLists.txt0000644000015301777760000000043712321343002025164 0ustar pbusernogroup00000000000000set (COMPIZ_CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${COMPIZ_CMAKE_MODULE_PATH}) include (CompizDefaults) include (CompizCommon) set (COMPIZ_FOUND "true") include_directories (${COMPIZ_INTERNAL_INCLUDES}) add_subdirectory (testhelper) compiz-0.9.11+14.04.20140409/tests/xorg-gtest/communicator/0000755000015301777760000000000012321344021023441 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/xorg-gtest/communicator/compiz_xorg_gtest_communicator.h0000644000015301777760000000425612321343002032145 0ustar pbusernogroup00000000000000/* * Copyright © 2013 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #ifndef _COMPIZ_XORG_GTEST_COMMUNICATOR_H #define _COMPIZ_XORG_GTEST_COMMUNICATOR_H #include #include namespace compiz { namespace testing { namespace messages { extern const char *TEST_HELPER_READY_MSG; extern const char *TEST_HELPER_REGISTER_CLIENT; extern const char *TEST_HELPER_LOCK_CONFIGURE_REQUESTS; extern const char *TEST_HELPER_CHANGE_FRAME_EXTENTS; extern const char *TEST_HELPER_FRAME_EXTENTS_CHANGED; extern const char *TEST_HELPER_CONFIGURE_WINDOW; extern const char *TEST_HELPER_WINDOW_CONFIGURE_PROCESSED; extern const char *TEST_HELPER_DESTROY_ON_REPARENT; extern const char *TEST_HELPER_RESTACK_ATLEAST_ABOVE; extern const char *TEST_HELPER_WINDOW_READY; } class MessageAtoms { public: MessageAtoms (Display *); Atom FetchForString (const char *string); private: class Private; std::auto_ptr priv; }; bool ReceiveMessage (Display *, Atom, XEvent &, int timeout = -1); void SendClientMessage (Display *, Atom, Window, Window, const std::vector &data); } } #endif compiz-0.9.11+14.04.20140409/tests/xorg-gtest/communicator/compiz_xorg_gtest_communicator.cpp0000644000015301777760000001244412321343002032476 0ustar pbusernogroup00000000000000/* * Copyright © 2013 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #include #include #include #include #include #include #include #include #include namespace compiz { namespace testing { namespace messages { namespace internal { const char *messages[] = { "_COMPIZ_TEST_HELPER_READY", "_COMPIZ_TEST_HELPER_REGISTER_CLIENT", "_COMPIZ_TEST_HELPER_LOCK_CONFIGURE_REQUESTS", "_COMPIZ_TEST_HELPER_CHANGE_FRAME_EXTENTS", "_COMPIZ_TEST_HELPER_FRAME_EXTENTS_CHANGED", "_COMPIZ_TEST_HELPER_CONFIGURE_WINDOW", "_COMPIZ_TEST_HELPER_WINDOW_CONFIGURE_PROCESSED", "_COMPIZ_TEST_HELPER_DESTROY_ON_REPARENT", "_COMPIZ_TEST_HELPER_RESTACK_ATLEAST_ABOVE", "_COMPIZ_TEST_HELPER_WINDOW_READY" }; } const char *TEST_HELPER_READY_MSG = internal::messages[0]; const char *TEST_HELPER_REGISTER_CLIENT = internal::messages[1]; const char *TEST_HELPER_LOCK_CONFIGURE_REQUESTS = internal::messages[2]; const char *TEST_HELPER_CHANGE_FRAME_EXTENTS = internal::messages[3]; const char *TEST_HELPER_FRAME_EXTENTS_CHANGED = internal::messages[4]; const char *TEST_HELPER_CONFIGURE_WINDOW = internal::messages[5]; const char *TEST_HELPER_WINDOW_CONFIGURE_PROCESSED = internal::messages[6]; const char *TEST_HELPER_DESTROY_ON_REPARENT = internal::messages[7]; const char *TEST_HELPER_RESTACK_ATLEAST_ABOVE = internal::messages[8]; const char *TEST_HELPER_WINDOW_READY = internal::messages[9]; } } } namespace ct = compiz::testing; namespace ctmi = compiz::testing::messages::internal; class ct::MessageAtoms::Private { public: std::map atoms; }; ct::MessageAtoms::MessageAtoms (Display *display) : priv (new ct::MessageAtoms::Private) { int nAtoms = sizeof (ctmi::messages) / sizeof (const char *); Atom atoms[nAtoms]; if (!XInternAtoms (display, const_cast (ctmi::messages), sizeof (ctmi::messages) / sizeof (const char *), 0, atoms)) throw std::runtime_error ("XInternAtoms generated an error"); for (int i = 0; i < nAtoms; ++i) priv->atoms[ctmi::messages[i]] = atoms[i]; } Atom ct::MessageAtoms::FetchForString (const char *message) { std::map ::iterator it (priv->atoms.find (message)); if (it == priv->atoms.end ()) { std::stringstream ss; ss << "Atom for message " << message << " does not exist"; throw std::runtime_error (ss.str ()); } return it->second; } namespace { bool FindClientMessage (Display *display, XEvent &event, Atom message) { while (XPending (display)) { XNextEvent (display, &event); if (event.type == ClientMessage) { if (event.xclient.message_type == message) return true; } } return false; } } bool ct::ReceiveMessage (Display *display, Atom message, XEvent &event, int timeout) { /* Ensure the event queue is fully flushed */ XFlush (display); if (FindClientMessage (display, event, message)) return true; else { struct pollfd pfd; pfd.events = POLLIN | POLLHUP | POLLERR; pfd.revents = 0; pfd.fd = ConnectionNumber (display); poll (&pfd, 1, timeout); /* Make sure we get something */ if ((pfd.revents & POLLIN) && !(pfd.revents & (POLLHUP | POLLERR))) { return ReceiveMessage (display, message, event, timeout); } else return false; } return false; } void ct::SendClientMessage (Display *display, Atom message, Window destination, Window target, const std::vector &data) { if (data.size () > 5) throw std::runtime_error ("data size must be less than 5"); XEvent event; memset (&event, 0, sizeof (XEvent)); event.type = ClientMessage; event.xclient.display = display; event.xclient.send_event = 1; event.xclient.serial = 0; event.xclient.message_type = message; event.xclient.window = target; event.xclient.format = 32; int count = 0; for (std::vector ::const_iterator it = data.begin (); it != data.end (); ++it) event.xclient.data.l[count++] = *it; XSendEvent (display, destination, 0, StructureNotifyMask, &event); XFlush (display); }; compiz-0.9.11+14.04.20140409/tests/xorg-gtest/communicator/CMakeLists.txt0000644000015301777760000000117312321343002026201 0ustar pbusernogroup00000000000000include (FindPkgConfig) pkg_check_modules (COMPIZ_XORG_GTEST_COMMUNICATOR x11) if (COMPIZ_XORG_GTEST_COMMUNICATOR_FOUND) include_directories (${COMPIZ_XORG_GTEST_COMMUNICATOR_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}) link_directories (${COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY_DIRS}) add_library (${COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY} STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compiz_xorg_gtest_communicator.cpp) target_link_libraries (${COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY} ${COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARIES}) endif (COMPIZ_XORG_GTEST_COMMUNICATOR_FOUND) compiz-0.9.11+14.04.20140409/tests/xorg-gtest/CMakeLists.txt0000644000015301777760000000441612321343002023504 0ustar pbusernogroup00000000000000set (COMPIZ_LD_LIBRARY_PATH ${CMAKE_BINARY_DIR}/src CACHE STRING "" FORCE) set (COMPIZ_BINARY ${CMAKE_BINARY_DIR}/src/compiz CACHE STRING "" FORCE) set (COMPIZ_XORG_GTEST_COMMUNICATOR_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/communicator CACHE PATH "" FORCE) set (COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY_DIRS ${CMAKE_CURRENT_BINARY_DIR}/communicator CACHE PATH "" FORCE) set (COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY compiz_xorg_gtest_communicator CACHE STRING "" FORCE) set (COMPIZ_TEST_ONLY_PLUGIN_PATH ${CMAKE_CURRENT_BINARY_DIR}/plugins/) set (COMPIZ_REAL_PLUGIN_PATH ${CMAKE_BINARY_DIR}/plugins/) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/src/compiz-xorg-gtest-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/compiz-xorg-gtest-config.h @ONLY) include_directories (${XORG_SERVER_INCLUDE_XORG_GTEST} ${XORG_SERVER_GTEST_INCLUDES} ${COMPIZ_XORG_SYSTEM_TEST_INCLUDE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src ${compiz_SOURCE_DIR}/tests/shared ${COMPIZ_XORG_GTEST_COMMUNICATOR_INCLUDE_DIR}) link_directories (${XORG_SERVER_LIBRARY_DIRS}) add_definitions (${XORG_SERVER_GTEST_CFLAGS}) set (_xorg_gtest_all_srcs ${XORG_SERVER_GTEST_SRC}/src/xorg-gtest-all.cpp) add_library (xorg_gtest_all STATIC ${_xorg_gtest_all_srcs}) add_library (compiz_xorg_gtest_main STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/compiz_xorg_gtest_main.cpp) add_library (compiz_xorg_gtest_system_test STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/compiz-xorg-gtest.cpp) add_executable (xorg_gtest_wrapper ${CMAKE_CURRENT_SOURCE_DIR}/src/xorg_gtest_wrapper.cpp) target_link_libraries (xorg_gtest_all ${X11_XI_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_GTEST_LIBRARIES}) target_link_libraries (compiz_xorg_gtest_main ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_GTEST_LIBRARIES}) target_link_libraries (compiz_xorg_gtest_system_test xorg_gtest_all compiz_xorg_gtest_main ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_LIBRARIES} ${COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY} ${X11_XI_LIBRARIES}) add_executable (xorg_gtest_wrapper ${CMAKE_CURRENT_SOURCE_DIR}/src/xorg_gtest_wrapper.cpp) add_subdirectory (communicator) add_subdirectory (plugins) compiz-0.9.11+14.04.20140409/tests/xorg-gtest/src/0000755000015301777760000000000012321344021021530 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/xorg-gtest/src/compiz-xorg-gtest.cpp0000644000015301777760000006257412321343002025652 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "compiz-xorg-gtest-config.h" using ::testing::MakeMatcher; using ::testing::MatchResultListener; using ::testing::MatcherInterface; using ::testing::Matcher; namespace ct = compiz::testing; namespace { const int WINDOW_X = ct::WINDOW_X; const int WINDOW_Y = ct::WINDOW_Y; const unsigned int WINDOW_WIDTH = ct::WINDOW_HEIGHT; const unsigned int WINDOW_HEIGHT = ct::WINDOW_HEIGHT; const unsigned int WINDOW_BORDER = 0; const unsigned int WINDOW_DEPTH = CopyFromParent; const unsigned int WINDOW_CLASS = InputOutput; Visual *WINDOW_VISUAL = CopyFromParent; const long WINDOW_ATTRIB_VALUE_MASK = 0; void RemoveEventFromQueue (Display *dpy) { XEvent event; if (XNextEvent (dpy, &event) != Success) throw std::runtime_error("Failed to remove X event"); } } Window ct::CreateNormalWindow (Display *dpy) { XSetWindowAttributes WINDOW_ATTRIB; Window w = XCreateWindow (dpy, DefaultRootWindow (dpy), WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_BORDER, WINDOW_DEPTH, WINDOW_CLASS, WINDOW_VISUAL, WINDOW_ATTRIB_VALUE_MASK, &WINDOW_ATTRIB); XSelectInput (dpy, w, StructureNotifyMask); return w; } Window ct::GetImmediateParent (Display *display, Window w, Window &rootReturn) { Window parentReturn = w; Window *childrenReturn; unsigned int nChildrenReturn; XQueryTree (display, w, &rootReturn, &parentReturn, &childrenReturn, &nChildrenReturn); XFree (childrenReturn); return parentReturn; } Window ct::GetTopmostNonRootParent (Display *display, Window w) { Window rootReturn = 0; Window parentReturn = w; Window lastParent = 0; do { lastParent = parentReturn; parentReturn = GetImmediateParent (display, lastParent, rootReturn); } while (parentReturn != rootReturn); return lastParent; } bool ct::AdvanceToNextEventOnSuccess (Display *dpy, bool waitResult) { if (waitResult) RemoveEventFromQueue (dpy); return waitResult; } bool ct::WaitForEventOfTypeOnWindow (Display *dpy, Window w, int type, int ext, int extType, int timeout) { while (xorg::testing::XServer::WaitForEventOfType (dpy, type, ext, extType, timeout)) { XEvent event; if (!XPeekEvent (dpy, &event)) throw std::runtime_error ("Failed to peek event"); if (event.xany.window != w) { RemoveEventFromQueue (dpy); continue; } return true; } return false; } bool ct::WaitForEventOfTypeOnWindowMatching (Display *dpy, Window w, int type, int ext, int extType, const XEventMatcher &matcher, int timeout) { while (ct::WaitForEventOfTypeOnWindow (dpy, w, type, ext, extType, timeout)) { XEvent event; if (!XPeekEvent (dpy, &event)) throw std::runtime_error ("Failed to peek event"); if (!matcher.MatchAndExplain (event, NULL)) { RemoveEventFromQueue (dpy); continue; } return true; } std::stringstream ss; matcher.DescribeTo (&ss); ADD_FAILURE () << "Expected event matching: " << ss.str (); return false; } std::list ct::NET_CLIENT_LIST_STACKING (Display *dpy) { Atom property = XInternAtom (dpy, "_NET_CLIENT_LIST_STACKING", false); Atom actual_type; int actual_fmt; unsigned long nitems, nleft; unsigned char *prop; std::list stackingOrder; /* _NET_CLIENT_LIST_STACKING */ if (XGetWindowProperty (dpy, DefaultRootWindow (dpy), property, 0L, 512L, false, XA_WINDOW, &actual_type, &actual_fmt, &nitems, &nleft, &prop) == Success) { if (nitems && !nleft && actual_fmt == 32 && actual_type == XA_WINDOW) { Window *window = reinterpret_cast (prop); while (nitems--) stackingOrder.push_back (*window++); } if (prop) XFree (prop); } return stackingOrder; } namespace { class StartupClientMessageMatcher : public ct::XEventMatcher { public: StartupClientMessageMatcher (Atom startup, Window root, ct::CompizProcess::StartupFlags state) : mStartup (startup), mRoot (root), mFlags (state) { } virtual bool MatchAndExplain (const XEvent &event, MatchResultListener *listener) const { int state = mFlags & ct::CompizProcess::ExpectStartupFailure ? 0 : 1; if (event.xclient.window == mRoot && event.xclient.message_type == mStartup && event.xclient.data.l[0] == state) return true; return false; } virtual void DescribeTo (std::ostream *os) const { *os << "is startup message"; } virtual void DescribeNegationTo (std::ostream *os) const { *os << "is not startup message"; } private: Atom mStartup; Window mRoot; ct::CompizProcess::StartupFlags mFlags; }; } class ct::PrivateClientMessageXEventMatcher { public: PrivateClientMessageXEventMatcher (Display *display, Atom message, Window target) : display (display), message (message), target (target) { } Display *display; Atom message; Window target; }; ct::ClientMessageXEventMatcher::ClientMessageXEventMatcher (Display *display, Atom message, Window target) : priv (new ct::PrivateClientMessageXEventMatcher (display, message, target)) { } bool ct::ClientMessageXEventMatcher::MatchAndExplain (const XEvent &event, MatchResultListener *listener) const { const XClientMessageEvent *xce = reinterpret_cast (&event); if (xce->message_type == priv->message && xce->window == priv->target) return true; return false; } void ct::ClientMessageXEventMatcher::DescribeTo (std::ostream *os) const { CharacterWrapper name (XGetAtomName (priv->display, priv->message)); *os << "matches ClientMessage with type " << name << " on window " << std::hex << static_cast (priv->target) << std::dec << std::endl; } class ct::PrivatePropertyNotifyXEventMatcher { public: PrivatePropertyNotifyXEventMatcher (Display *dpy, const std::string &propertyName) : mPropertyName (propertyName), mProperty (XInternAtom (dpy, propertyName.c_str (), false)) { } std::string mPropertyName; Atom mProperty; }; ct::PropertyNotifyXEventMatcher::PropertyNotifyXEventMatcher (Display *dpy, const std::string &propertyName) : priv (new ct::PrivatePropertyNotifyXEventMatcher (dpy, propertyName)) { } bool ct::PropertyNotifyXEventMatcher::MatchAndExplain (const XEvent &event, MatchResultListener *listener) const { const XPropertyEvent *propertyEvent = reinterpret_cast (&event); if (priv->mProperty == propertyEvent->atom) return true; else return false; } void ct::PropertyNotifyXEventMatcher::DescribeTo (std::ostream *os) const { *os << "Is property identified by " << priv->mPropertyName; } class ct::PrivateConfigureNotifyXEventMatcher { public: PrivateConfigureNotifyXEventMatcher (Window above, unsigned int border, int x, int y, unsigned int width, unsigned int height, unsigned int mask) : mAbove (above), mBorder (border), mX (x), mY (y), mWidth (width), mHeight (height), mMask (mask) { } Window mAbove; int mBorder; int mX; int mY; int mWidth; int mHeight; unsigned int mMask; }; ct::ConfigureNotifyXEventMatcher::ConfigureNotifyXEventMatcher (Window above, unsigned int border, int x, int y, unsigned int width, unsigned int height, unsigned int mask) : priv (new ct::PrivateConfigureNotifyXEventMatcher (above, border, x, y, width, height, mask)) { } bool ct::ConfigureNotifyXEventMatcher::MatchAndExplain (const XEvent &event, MatchResultListener *listener) const { const XConfigureEvent *ce = reinterpret_cast (&event); if (priv->mMask & CWSibling) if (ce->above != priv->mAbove) return false; if (priv->mMask & CWBorderWidth) if (ce->border_width != priv->mBorder) return false; if (priv->mMask & CWX) if (ce->x != priv->mX) return false; if (priv->mMask & CWY) if (ce->y != priv->mY) return false; if (priv->mMask & CWWidth) if (ce->width != priv->mWidth) return false; if (priv->mMask & CWHeight) if (ce->height != priv->mHeight) return false; return true; } void ct::ConfigureNotifyXEventMatcher::DescribeTo (std::ostream *os) const { std::stringstream x, y, width, height, border, sibling; if (priv->mMask & CWX) x << " x: " << priv->mX; if (priv->mMask & CWY) y << " y: " << priv->mY; if (priv->mMask & CWWidth) width << " width: " << priv->mWidth; if (priv->mMask & CWHeight) height << " height: " << priv->mHeight; if (priv->mMask & CWBorderWidth) border << " border: " << priv->mBorder; if (priv->mMask & CWSibling) sibling << " above: " << std::hex << priv->mAbove << std::dec; *os << "Matches ConfigureNotify with parameters : " << std::endl << x.str () << y.str () << width.str () << height.str () << border.str () << sibling.str (); } class ct::PrivateShapeNotifyXEventMatcher { public: PrivateShapeNotifyXEventMatcher (int kind, int x, int y, unsigned int width, unsigned int height, Bool shaped) : mKind (kind), mX (x), mY (y), mWidth (width), mHeight (height), mShaped (shaped) { } int mKind; int mX; int mY; unsigned int mWidth; unsigned int mHeight; Bool mShaped; }; bool ct::ShapeNotifyXEventMatcher::MatchAndExplain (const XEvent &event, MatchResultListener *listener) const { const XShapeEvent *sev = reinterpret_cast (&event); return sev->kind == priv->mKind && sev->x == priv->mX && sev->y == priv->mY && sev->width == priv->mWidth && sev->height == priv->mHeight && sev->shaped == priv->mShaped; } void ct::ShapeNotifyXEventMatcher::DescribeTo (std::ostream *os) const { std::string kindStr (priv->mKind == ShapeBounding ? " ShapeBounding " : " ShapeInput "); *os << " Matches ShapeNotify with parameters : " << std::endl << " kind : " << kindStr << " x : " << priv->mX << " y : " << priv->mY << " width: " << priv->mWidth << " height: " << priv->mHeight << " shaped: " << priv->mShaped; } ct::ShapeNotifyXEventMatcher::ShapeNotifyXEventMatcher (int kind, int x, int y, unsigned int width, unsigned int height, Bool shaped) : priv (new ct::PrivateShapeNotifyXEventMatcher (kind, x, y, width, height, shaped)) { } void ct::RelativeWindowGeometry (Display *dpy, Window w, int &x, int &y, unsigned int &width, unsigned int &height, unsigned int &border) { Window root; unsigned int depth; if (!XGetGeometry (dpy, w, &root, &x, &y, &width, &height, &border, &depth)) throw std::logic_error ("XGetGeometry failed"); } void ct::AbsoluteWindowGeometry (Display *display, Window window, int &x, int &y, unsigned int &width, unsigned int &height, unsigned int &border) { Window root; Window child; unsigned int depth; if (!XGetGeometry (display, window, &root, &x, &y, &width, &height, &border, &depth)) throw std::logic_error ("XGetGeometry failed"); if (!XTranslateCoordinates (display, window, root, x, y, &x, &y, &child)) throw std::logic_error ("XTranslateCoordinates failed"); } class ct::WindowGeometryMatcher::Private { public: Private (Display *dpy, ct::RetrievalFunc func, const Matcher &x, const Matcher &y, const Matcher &width, const Matcher &height, const Matcher &border); Display *mDpy; RetrievalFunc mFunc; Matcher mX; Matcher mY; Matcher mWidth; Matcher mHeight; Matcher mBorder; }; Matcher ct::HasGeometry (Display *dpy, RetrievalFunc func, const Matcher &x, const Matcher &y, const Matcher &width, const Matcher &height, const Matcher &border) { return MakeMatcher (new WindowGeometryMatcher (dpy, func, x, y, width, height, border)); } ct::WindowGeometryMatcher::WindowGeometryMatcher (Display *dpy, RetrievalFunc func, const Matcher &x, const Matcher &y, const Matcher &width, const Matcher &height, const Matcher &border) : priv (new Private (dpy, func, x, y, width, height, border)) { } ct::WindowGeometryMatcher::Private::Private (Display *dpy, RetrievalFunc func, const Matcher &x, const Matcher &y, const Matcher &width, const Matcher &height, const Matcher &border): mDpy (dpy), mFunc (func), mX (x), mY (y), mWidth (width), mHeight (height), mBorder (border) { } bool ct::WindowGeometryMatcher::MatchAndExplain (Window w, MatchResultListener *listener) const { int x, y; unsigned int width, height, border; priv->mFunc (priv->mDpy, w, x, y, width, height, border); bool match = priv->mX.MatchAndExplain (x, listener) && priv->mY.MatchAndExplain (y, listener) && priv->mWidth.MatchAndExplain (width, listener) && priv->mHeight.MatchAndExplain (height, listener) && priv->mBorder.MatchAndExplain (border, listener); if (!match) { *listener << "Geometry:" << " x: " << x << " y: " << y << " width: " << width << " height: " << height << " border: " << border; } return match; } void ct::WindowGeometryMatcher::DescribeTo (std::ostream *os) const { *os << "Window geometry matching :"; *os << std::endl << " - "; priv->mX.DescribeTo (os); *os << std::endl << " - "; priv->mY.DescribeTo (os); *os << std::endl << " - "; priv->mWidth.DescribeTo (os); *os << std::endl << " - "; priv->mHeight.DescribeTo (os); *os << std::endl << " - "; priv->mBorder.DescribeTo (os); } class ct::PrivateCompizProcess { public: PrivateCompizProcess (ct::CompizProcess::StartupFlags flags) : mFlags (flags), mIsRunning (true) { } void WaitForStartupMessage (Display *dpy, ct::CompizProcess::StartupFlags flags, unsigned int waitTimeout); typedef boost::shared_ptr ProcessPtr; ct::CompizProcess::StartupFlags mFlags; bool mIsRunning; xorg::testing::Process mProcess; std::string mPluginPaths; std::auto_ptr mPluginPathsEnv; }; void ct::PrivateCompizProcess::WaitForStartupMessage (Display *dpy, ct::CompizProcess::StartupFlags flags, unsigned int waitTimeout) { XWindowAttributes attrib; Window root = DefaultRootWindow (dpy); Atom startup = XInternAtom (dpy, "_COMPIZ_TESTING_STARTUP", false); StartupClientMessageMatcher matcher (startup, root, flags); /* Save the current event mask and subscribe to StructureNotifyMask only */ ASSERT_TRUE (XGetWindowAttributes (dpy, root, &attrib)); XSelectInput (dpy, root, StructureNotifyMask | attrib.your_event_mask); ASSERT_TRUE (ct::AdvanceToNextEventOnSuccess ( dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, root, ClientMessage, -1, -1, matcher, waitTimeout))); XSelectInput (dpy, root, attrib.your_event_mask); } namespace { std::string PathForPlugin (const std::string &name, ct::CompizProcess::PluginType type) { switch (type) { case ct::CompizProcess::Real: return compizRealPluginPath + name; case ct::CompizProcess::TestOnly: return compizTestOnlyPluginPath + name; default: throw std::logic_error ("Incorrect value for type"); } return ""; } } ct::CompizProcess::CompizProcess (::Display *dpy, ct::CompizProcess::StartupFlags flags, const ct::CompizProcess::PluginList &plugins, int waitTimeout) : priv (new PrivateCompizProcess (flags)) { xorg::testing::Process::SetEnv ("LD_LIBRARY_PATH", compizLDLibraryPath, true); std::vector args; if (flags & ct::CompizProcess::ReplaceCurrentWM) args.push_back ("--replace"); args.push_back ("--send-startup-message"); /* Copy in plugin list and set environment variables */ for (ct::CompizProcess::PluginList::const_iterator it = plugins.begin (); it != plugins.end (); ++it) { priv->mPluginPaths += PathForPlugin (it->name, it->type) + ":"; args.push_back (it->name); } priv->mPluginPathsEnv.reset (new TmpEnv ("COMPIZ_PLUGIN_DIR", priv->mPluginPaths.c_str ())); priv->mProcess.Start (compizBinaryPath, args); EXPECT_EQ (priv->mProcess.GetState (), xorg::testing::Process::RUNNING); if (flags & ct::CompizProcess::WaitForStartupMessage) priv->WaitForStartupMessage (dpy, flags, waitTimeout); } ct::CompizProcess::~CompizProcess () { if (priv->mProcess.GetState () == xorg::testing::Process::RUNNING) priv->mProcess.Kill (); } xorg::testing::Process::State ct::CompizProcess::State () { return priv->mProcess.GetState (); } pid_t ct::CompizProcess::Pid () { return priv->mProcess.Pid (); } class ct::PrivateCompizXorgSystemTest { public: boost::shared_ptr mProcess; }; ct::CompizXorgSystemTest::CompizXorgSystemTest () : priv (new PrivateCompizXorgSystemTest) { } void ct::CompizXorgSystemTest::SetUp () { const unsigned int MAX_CONNECTION_ATTEMPTS = 10; const unsigned int USEC_TO_MSEC = 1000; const unsigned int SLEEP_TIME = 50 * USEC_TO_MSEC; int connectionAttemptsRemaining = MAX_CONNECTION_ATTEMPTS; /* Work around an inherent race condition in XOpenDisplay * * All xorg::testing::Test::SetUp does is call XOpenDisplay * and assign a display string, the former before the latter. * The current X Error handler will throw an exception if * an X error occurrs. * * Unfortunately there's an inherent race condition in spawning * a new server and using XOpenDisplay to connect to it - we * simply don't know when the new server will be ready, and even * watching its socket with inotify will be racey too. The only * solution would be a handshake process where we pass the server * a socket or pipe and it writes to it indicating that it is ready * to accept connections. There isn't such a thing. As such, we need * to work around that by simply re-trying our connection to the server * once every 50ms or so, and we're trying about 10 times before giving up * and assuming there is a problem with the server. * * The predecrement here is so that connectionAttemptsRemaining will be 0 * on failure */ while (--connectionAttemptsRemaining) { try { xorg::testing::Test::SetUp (); break; } catch (std::runtime_error &exception) { usleep (SLEEP_TIME); } } if (!connectionAttemptsRemaining) { throw std::runtime_error ("Failed to connect to X Server. "\ "Check the logs by setting "\ "XORG_GTEST_CHILD_STDOUT=1 to see if "\ "there are any startup errors. Otherwise "\ "if you suspect the server is running "\ "particularly slowly, try bumping up the "\ "maximum number of connection attempts in "\ "compiz-xorg-gtest.cpp"); } } void ct::CompizXorgSystemTest::TearDown () { priv->mProcess.reset (); xorg::testing::Test::TearDown (); } xorg::testing::Process::State ct::CompizXorgSystemTest::CompizProcessState () { if (priv->mProcess) return priv->mProcess->State (); return xorg::testing::Process::NONE; } void ct::CompizXorgSystemTest::StartCompiz (ct::CompizProcess::StartupFlags flags, const ct::CompizProcess::PluginList &plugins) { priv->mProcess.reset (new ct::CompizProcess (Display (), flags, plugins)); } class ct::PrivateAutostartCompizXorgSystemTest { }; ct::AutostartCompizXorgSystemTest::AutostartCompizXorgSystemTest () : priv (new ct::PrivateAutostartCompizXorgSystemTest ()) { } ct::CompizProcess::StartupFlags ct::AutostartCompizXorgSystemTest::GetStartupFlags () { return static_cast ( ct::CompizProcess::ReplaceCurrentWM | ct::CompizProcess::WaitForStartupMessage); } int ct::AutostartCompizXorgSystemTest::GetEventMask () const { return 0; } ct::CompizProcess::PluginList ct::AutostartCompizXorgSystemTest::GetPluginList () { return ct::CompizProcess::PluginList (); } void ct::AutostartCompizXorgSystemTest::SetUp () { ct::CompizXorgSystemTest::SetUp (); ::Display *display = Display (); XSelectInput (display, DefaultRootWindow (display), GetEventMask ()); StartCompiz (GetStartupFlags (), GetPluginList ()); } class ct::PrivateAutostartCompizXorgSystemTestWithTestHelper { public: std::auto_ptr mMessages; }; std::vector ct::AutostartCompizXorgSystemTestWithTestHelper::WaitForWindowCreation (Window w) { ::Display *dpy = Display (); XEvent event; bool requestAcknowledged = false; while (ct::ReceiveMessage (dpy, FetchAtom (ct::messages::TEST_HELPER_WINDOW_READY), event)) { requestAcknowledged = w == static_cast (event.xclient.data.l[0]); if (requestAcknowledged) break; } EXPECT_TRUE (requestAcknowledged); std::vector data; for (int i = 0; i < 5; ++i) data.push_back(static_cast (event.xclient.data.l[i])); return data; } bool ct::AutostartCompizXorgSystemTestWithTestHelper::IsOverrideRedirect (std::vector &data) { return (data[1] > 0) ? true : false; } Atom ct::AutostartCompizXorgSystemTestWithTestHelper::FetchAtom (const char *message) { return priv->mMessages->FetchForString (message); } ct::AutostartCompizXorgSystemTestWithTestHelper::AutostartCompizXorgSystemTestWithTestHelper () : priv (new ct::PrivateAutostartCompizXorgSystemTestWithTestHelper) { } int ct::AutostartCompizXorgSystemTestWithTestHelper::GetEventMask () const { return AutostartCompizXorgSystemTest::GetEventMask () | StructureNotifyMask; } void ct::AutostartCompizXorgSystemTestWithTestHelper::SetUp () { ct::AutostartCompizXorgSystemTest::SetUp (); priv->mMessages.reset (new ct::MessageAtoms (Display ())); ::Display *dpy = Display (); Window root = DefaultRootWindow (dpy); Atom ready = priv->mMessages->FetchForString (ct::messages::TEST_HELPER_READY_MSG); ct::ClientMessageXEventMatcher matcher (dpy, ready, root); ASSERT_TRUE (ct::AdvanceToNextEventOnSuccess ( dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, root, ClientMessage, -1, -1, matcher))); } ct::CompizProcess::PluginList ct::AutostartCompizXorgSystemTestWithTestHelper::GetPluginList () { ct::CompizProcess::PluginList list; list.push_back (ct::CompizProcess::Plugin ("testhelper", ct::CompizProcess::TestOnly)); return list; } compiz-0.9.11+14.04.20140409/tests/xorg-gtest/src/compiz-xorg-gtest-config.h.in0000644000015301777760000000235212321343002027153 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_XORG_GTEST_CONFIG_H #define _COMPIZ_XORG_GTEST_CONFIG_H namespace { const std::string compizLDLibraryPath ("@COMPIZ_LD_LIBRARY_PATH@"); const std::string compizBinaryPath ("@COMPIZ_BINARY@"); const std::string compizTestOnlyPluginPath ("@COMPIZ_TEST_ONLY_PLUGIN_PATH@"); const std::string compizRealPluginPath ("@COMPIZ_REAL_PLUGIN_PATH@"); } #endif compiz-0.9.11+14.04.20140409/tests/xorg-gtest/src/compiz_xorg_gtest_main.cpp0000644000015301777760000000652512321343002027014 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest Decoration Pixmap Protocol Integration Tests * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include "xorg/gtest/xorg-gtest-environment.h" #include namespace compiz { namespace testing { class XorgEnvironment : public xorg::testing::Environment { public: virtual void SetUp () { /* Another hack - if the server fails * to start then just set another display * number until it does */ const int MaxConnections = 255; int displayNumber = 0; bool serverRunningOnDisplay = true; while (serverRunningOnDisplay && displayNumber < MaxConnections) { std::stringstream ss; ss << ":" << displayNumber; Display *check = XOpenDisplay (ss.str ().c_str ()); if (!check) serverRunningOnDisplay = false; else { XCloseDisplay (check); ++displayNumber; } } if (displayNumber == MaxConnections) throw std::runtime_error ("couldn't find a socket " "to launch on"); std::stringstream logFile; logFile << "/tmp/Compiz.Xorg.GTest." << displayNumber << ".log"; SetDisplayNumber (displayNumber); SetLogFile (logFile.str ()); xorg::testing::Environment::SetUp (); } }; } } /* X testing environment - Google Test environment feat. dummy x server * Copyright (C) 2011, 2012 Canonical Ltd. */ compiz::testing::XorgEnvironment *environment = NULL; namespace { void SignalHandler (int signum) { if (environment) environment->Kill (); /* This will call the default handler because we used SA_RESETHAND */ raise (signum); } void SetupSignalHandlers () { static const int signals[] = { SIGHUP, SIGTERM, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, SIGUSR1, SIGUSR2, SIGBUS, SIGPOLL, SIGPROF, SIGSYS, SIGTRAP, SIGVTALRM, SIGXCPU, SIGXFSZ, SIGIOT, SIGSTKFLT, SIGIO, SIGPWR, SIGUNUSED, }; struct sigaction action; action.sa_handler = SignalHandler; sigemptyset(&action.sa_mask); action.sa_flags = SA_RESETHAND; for (unsigned i = 0; i < sizeof(signals) / sizeof(signals[0]); ++i) if (sigaction(signals[i], &action, NULL)) std::cerr << "Warning: Failed to set signal handler for signal " << signals[i] << "\n"; } } int main (int argc, char **argv) { ::testing::InitGoogleTest (&argc, argv); SetupSignalHandlers (); environment = new compiz::testing::XorgEnvironment (); ::testing::AddGlobalTestEnvironment (environment); return RUN_ALL_TESTS (); } compiz-0.9.11+14.04.20140409/tests/xorg-gtest/src/xorg_gtest_wrapper.cpp0000644000015301777760000000447512321343002026171 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest Wrapper * * Copyright (C) 2013 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include int usage () { printf ("usage: xorg_gtest_wrapper EXECUTABLE ARGUMENTS\n"); return 1; } int main (int argc, char **argv) { if (argc < 2) return usage (); /* We need to force the child stdout to remain open here. * * This is ugly, but the X Server and clients seem to * have some real trouble when you close their stdin/stdout. * It isn't really clear why, but at having a noisy test is * better than having a test that fails randomly. Without it, * the tests will occasionally hang in _XReply (), or the servers * will hang in other areas, probably in an IPC area or syscall */ setenv ("XORG_GTEST_CHILD_STDOUT", "1", 1); char * const *exec_args = const_cast (&argv[1]); /* Fork and spawn the new process */ pid_t test = fork (); if (test == -1) { perror ("fork"); return 1; } if (test == 0) { if (execvp (argv[1], exec_args) == -1) { perror ("execvp"); return 1; } } int status = 0; /* Make sure it exited normally */ do { pid_t child = waitpid (test, &status, 0); if (test == child) { if (WIFSIGNALED (status)) return 1; } else { perror ("waitpid"); return 1; } } while (!WIFEXITED (status) && !WIFSIGNALED (status)); return WEXITSTATUS (status); } compiz-0.9.11+14.04.20140409/tests/xorg-gtest/include/0000755000015301777760000000000012321344021022364 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/xorg-gtest/include/compiz-xorg-gtest.h0000644000015301777760000001761212321343002026144 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_XORG_GTEST_H #define _COMPIZ_XORG_GTEST_H #include #include #include #include #include using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::Matcher; namespace compiz { namespace testing { typedef ::testing::MatcherInterface XEventMatcher; class PrivateClientMessageXEventMatcher; class ClientMessageXEventMatcher : public compiz::testing::XEventMatcher { public: ClientMessageXEventMatcher (Display *display, Atom message, Window target); virtual bool MatchAndExplain (const XEvent &event, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; private: std::auto_ptr priv; }; class PrivatePropertyNotifyXEventMatcher; class PropertyNotifyXEventMatcher : public compiz::testing::XEventMatcher { public: PropertyNotifyXEventMatcher (Display *dpy, const std::string &propertyName); virtual bool MatchAndExplain (const XEvent &event, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; private: std::auto_ptr priv; }; class PrivateConfigureNotifyXEventMatcher; class ConfigureNotifyXEventMatcher : public compiz::testing::XEventMatcher { public: ConfigureNotifyXEventMatcher (Window above, unsigned int border, int x, int y, unsigned int width, unsigned int height, unsigned int mask); virtual bool MatchAndExplain (const XEvent &event, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; private: std::auto_ptr priv; }; class PrivateShapeNotifyXEventMatcher; class ShapeNotifyXEventMatcher : public compiz::testing::XEventMatcher { public: ShapeNotifyXEventMatcher (int kind, int x, int y, unsigned int width, unsigned int height, Bool shaped); virtual bool MatchAndExplain (const XEvent &event, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; private: std::auto_ptr priv; }; const int WINDOW_X = 0; const int WINDOW_Y = 0; const unsigned int WINDOW_WIDTH = 640; const unsigned int WINDOW_HEIGHT = 480; Window CreateNormalWindow (Display *dpy); Window GetImmediateParent (Display *display, Window w, Window &rootReturn); Window GetTopmostNonRootParent (Display *display, Window w); std::list NET_CLIENT_LIST_STACKING (Display *); bool AdvanceToNextEventOnSuccess (Display *dpy, bool waitResult); bool WaitForEventOfTypeOnWindow (Display *dpy, Window w, int type, int ext, int extType, int timeout = 0); bool WaitForEventOfTypeOnWindowMatching (Display *dpy, Window w, int type, int ext, int extType, const XEventMatcher &matcher, int timeout = 0); void RelativeWindowGeometry (Display *dpy, Window w, int &x, int &y, unsigned int &width, unsigned int &height, unsigned int &border); void AbsoluteWindowGeometry (::Display *display, Window window, int &x, int &y, unsigned int &width, unsigned int &height, unsigned int &border); typedef void (*RetrievalFunc) (Display *dpy, Window window, int &x, int &y, unsigned int &width, unsigned int &height, unsigned int &border); class WindowGeometryMatcher : public MatcherInterface { public: WindowGeometryMatcher (Display *dpy, RetrievalFunc func, const Matcher &x, const Matcher &y, const Matcher &width, const Matcher &height, const Matcher &border); bool MatchAndExplain (Window x, MatchResultListener *listener) const; void DescribeTo (std::ostream *os) const; private: class Private; std::auto_ptr priv; }; Matcher HasGeometry (Display *dpy, RetrievalFunc func, const Matcher &x, const Matcher &y, const Matcher &width, const Matcher &height, const Matcher &border); class PrivateCompizProcess; class CompizProcess { public: typedef enum _StartupFlags { ReplaceCurrentWM = (1 << 0), WaitForStartupMessage = (1 << 1), ExpectStartupFailure = (1 << 2) } StartupFlags; typedef enum _PluginType { Real = 0, TestOnly = 1 } PluginType; struct Plugin { Plugin (const char *name, PluginType type) : name (name), type (type) { } std::string name; PluginType type; }; typedef std::vector PluginList; CompizProcess (Display *dpy, StartupFlags, const PluginList &plugins, int timeout = 0); ~CompizProcess (); xorg::testing::Process::State State (); pid_t Pid (); private: std::auto_ptr priv; }; class PrivateCompizXorgSystemTest; class CompizXorgSystemTest : public xorg::testing::Test { public: CompizXorgSystemTest (); virtual void SetUp (); virtual void TearDown (); xorg::testing::Process::State CompizProcessState (); void StartCompiz (CompizProcess::StartupFlags flags, const CompizProcess::PluginList &plugins); private: std::auto_ptr priv; }; class PrivateAutostartCompizXorgSystemTest; class AutostartCompizXorgSystemTest : public CompizXorgSystemTest { public: AutostartCompizXorgSystemTest (); virtual CompizProcess::StartupFlags GetStartupFlags (); virtual int GetEventMask () const; virtual CompizProcess::PluginList GetPluginList (); virtual void SetUp (); private: std::auto_ptr priv; }; class PrivateAutostartCompizXorgSystemTestWithTestHelper; class AutostartCompizXorgSystemTestWithTestHelper : public AutostartCompizXorgSystemTest { public: AutostartCompizXorgSystemTestWithTestHelper (); virtual CompizProcess::PluginList GetPluginList (); protected: virtual void SetUp (); Atom FetchAtom (const char *); std::vector WaitForWindowCreation (Window w); bool IsOverrideRedirect (std::vector &data); virtual int GetEventMask () const; private: std::auto_ptr priv; }; } } #endif compiz-0.9.11+14.04.20140409/tests/integration/0000755000015301777760000000000012321344021021161 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/integration/glib/0000755000015301777760000000000012321344021022076 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/integration/glib/glib_integration_test.cpp0000644000015301777760000000613312321343002027162 0ustar pbusernogroup00000000000000/* * Compiz GLib integration test * * Copyright (C) 2012 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include "privateeventsource.h" #include "privatetimeoutsource.h" #include "privateiosource.h" class DieVerifier { public: MOCK_METHOD0 (Die, void ()); }; class GLibSourceDestroyIntegration : public ::testing::Test { public: GLibSourceDestroyIntegration () : context (Glib::MainContext::get_default ()), mainloop (Glib::MainLoop::create ()) { } DieVerifier die; Glib::RefPtr context; Glib::RefPtr mainloop; }; class StubTimeoutSource : public CompTimeoutSource { public: StubTimeoutSource (DieVerifier *dieVerifier, Glib::RefPtr &context) : CompTimeoutSource (context), mDie (dieVerifier) { } virtual ~StubTimeoutSource () { mDie->Die (); } private: DieVerifier *mDie; }; class StubEventSource : public CompEventSource { public: StubEventSource (DieVerifier *dieVerifier) : CompEventSource (NULL, 0), mDie (dieVerifier) { } virtual ~StubEventSource () { mDie->Die (); } private: DieVerifier *mDie; }; class StubWatchFd : public CompWatchFd { public: StubWatchFd (DieVerifier *dieVerifier, int fd, Glib::IOCondition iocond, const FdWatchCallBack &cb) : CompWatchFd (fd, iocond, cb), mDie (dieVerifier) { } virtual ~StubWatchFd () { mDie->Die (); } private: DieVerifier *mDie; }; TEST_F (GLibSourceDestroyIntegration, TimeoutSourceGSourceDestroy) { Glib::RefPtr sts(new StubTimeoutSource (&die, context)); EXPECT_CALL (die, Die ()); g_source_destroy (sts->gobj ()); } TEST_F (GLibSourceDestroyIntegration, EventSourceGSourceDestroy) { Glib::RefPtr sts(new StubEventSource (&die)); sts->attach (context); EXPECT_CALL (die, Die ()); g_source_destroy (sts->gobj ()); } TEST_F (GLibSourceDestroyIntegration, FdSourceGSourceDestroy) { Glib::IOCondition iocond = Glib::IO_IN; int fd = 0; FdWatchCallBack cb; Glib::RefPtr sts(new StubWatchFd (&die, fd, iocond, cb)); sts->attach (context); EXPECT_CALL (die, Die ()); g_source_destroy (sts->gobj ()); } compiz-0.9.11+14.04.20140409/tests/integration/glib/CMakeLists.txt0000644000015301777760000000174212321343002024640 0ustar pbusernogroup00000000000000include (FindPkgConfig) pkg_check_modules (COMPIZ_GLIB_INTEGRATION_TEST glibmm-2.4) if (COMPIZ_GLIB_INTEGRATION_TEST_FOUND) include_directories (${compiz_SOURCE_DIR}/src/) include_directories (${compiz_SOURCE_DIR}/src/timer/include) include_directories (${compiz_SOURCE_DIR}/src/timer/src) include_directories (${compiz_SOURCE_DIR}/include) include_directories (${COMPIZ_GLIB_INTEGRATION_TEST_INCLUDE_DIRS}) link_directories (${compiz_BINARY_DIR}/src) link_directories (${COMPIZ_GLIB_INTEGRATION_TEST_LIBRARY_DIRS}) add_executable (compiz_glib_integration_test ${CMAKE_CURRENT_SOURCE_DIR}/glib_integration_test.cpp) target_link_libraries (compiz_glib_integration_test compiz_core ${COMPIZ_GLIB_INTEGRATION_TEST_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_glib_integration_test COVERAGE compiz_core) endif (COMPIZ_GLIB_INTEGRATION_TEST_FOUND) compiz-0.9.11+14.04.20140409/tests/integration/xig/0000755000015301777760000000000012321344021021750 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/integration/xig/CMakeLists.txt0000644000015301777760000000175712321343002024520 0ustar pbusernogroup00000000000000include (CompizCommon) include (FindPkgConfig) pkg_check_modules (COMPIZ_XIG_TEST xig-0 glib-2.0 gobject-2.0) if (COMPIZ_XIG_TEST_FOUND) compiz_set (COMPIZ_XIG_TEST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) compiz_set (COMPIZ_XIG_TEST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory (src) add_test (compiz-xig-test-startup ${CMAKE_CURRENT_BINARY_DIR}/src/compiz-xig-test-runner startup) add_test (compiz-xig-test-restart ${CMAKE_CURRENT_BINARY_DIR}/src/compiz-xig-test-runner restart) add_test (compiz-xig-test-xserver-quit ${CMAKE_CURRENT_BINARY_DIR}/src/compiz-xig-test-runner xserver-quit) add_test (compiz-xig-test-new-window ${CMAKE_CURRENT_BINARY_DIR}/src/compiz-xig-test-runner new-window) add_test (compiz-xig-test-existing-window ${CMAKE_CURRENT_BINARY_DIR}/src/compiz-xig-test-runner existing-window) else (COMPIZ_XIG_TEST_FOUND) message (WARNING "Xig not found, you will not be able to run X Server integration tests") endif (COMPIZ_XIG_TEST_FOUND) compiz-0.9.11+14.04.20140409/tests/integration/xig/src/0000755000015301777760000000000012321344021022537 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/integration/xig/src/test-runner.c0000644000015301777760000003760212321343002025177 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include /* For some reason sys/un.h doesn't define this */ #ifndef UNIX_PATH_MAX #define UNIX_PATH_MAX 108 #endif /* Timeout in ms waiting for the status we expect */ #define STATUS_TIMEOUT 2000 /* Timeout in ms to wait for SIGTERM to kill compiz */ #define KILL_TIMEOUT 2000 static XigServer *xserver; static GKeyFile *config; static GPid compiz_pid = 0; static GList *statuses = NULL; static GList *script = NULL; static GList *script_iter = NULL; static guint status_timeout = 0; static gboolean failed = FALSE; static guint compiz_kill_timeout = 0; static void check_status (const gchar *status); static gboolean compiz_kill_timeout_cb (gpointer data) { if (getenv ("DEBUG")) g_print ("Sending SIGKILL to compiz\n"); kill (compiz_pid, SIGKILL); compiz_kill_timeout = 0; return FALSE; } static void stop_compiz () { if (compiz_pid && compiz_kill_timeout == 0) { if (getenv ("DEBUG")) g_print ("Sending SIGTERM to compiz process %d\n", compiz_pid); kill (compiz_pid, SIGINT); compiz_kill_timeout = g_timeout_add (KILL_TIMEOUT, compiz_kill_timeout_cb, NULL); } } static void restart_compiz () { if (compiz_pid) { if (getenv ("DEBUG")) g_print ("Sending SIGHUP to compiz process %d\n", compiz_pid); kill (compiz_pid, SIGHUP); } } static void quit (int status) { if (xserver) xig_server_stop (xserver); if (compiz_pid) kill (compiz_pid, SIGKILL); exit (status); } static void fail (const gchar *event, const gchar *expected) { GList *link; if (failed) return; failed = TRUE; g_printerr ("Test failed, got the following events:\n"); for (link = statuses; link; link = link->next) g_printerr (" %s\n", (gchar *)link->data); if (event) g_printerr (" %s\n", event); if (expected) g_printerr (" ^^^ expected \"%s\"\n", expected); else g_printerr ("^^^ expected nothing\n"); /* Either wait for the compiz to quit, or stop now if it already is */ if (compiz_pid) stop_compiz (); else quit (EXIT_FAILURE); } static gchar * get_script_line () { if (!script_iter) return NULL; return script_iter->data; } static void compiz_exit_cb (GPid pid, gint status, gpointer data) { gchar *status_text; compiz_pid = 0; if (compiz_kill_timeout) g_source_remove (compiz_kill_timeout); compiz_kill_timeout = 0; /* Quit when compiz does */ if (failed) quit (EXIT_FAILURE); if (WIFEXITED (status)) status_text = g_strdup_printf ("COMPIZ EXIT STATUS=%d", WEXITSTATUS (status)); else status_text = g_strdup_printf ("COMPIZ TERMINATE SIGNAL=%d", WTERMSIG (status)); check_status (status_text); g_free (status_text); } static void unmap_notify_cb (XigWindow *window) { gchar *status_text; status_text = g_strdup_printf ("UNMAP-NOTIFY ID=%d", xig_window_get_id (window)); check_status (status_text); g_free (status_text); } static void map_notify_cb (XigWindow *window) { gchar *status_text; status_text = g_strdup_printf ("MAP-NOTIFY ID=%d", xig_window_get_id (window)); check_status (status_text); g_free (status_text); } static void reparent_notify_cb (XigWindow *window) { gchar *status_text; status_text = g_strdup_printf ("REPARENT-NOTIFY ID=%d", xig_window_get_id (window)); check_status (status_text); g_free (status_text); } static void configure_notify_cb (XigWindow *window) { gchar *status_text; status_text = g_strdup_printf ("CONFIGURE-NOTIFY ID=%d", xig_window_get_id (window)); check_status (status_text); g_free (status_text); } static void run_commands () { /* Stop compiz if requested */ while (TRUE) { gchar *command, *name = NULL, *c; GHashTable *params; command = get_script_line (); if (!command) break; /* Commands start with an asterisk */ if (command[0] != '*') break; statuses = g_list_append (statuses, g_strdup (command)); script_iter = script_iter->next; c = command + 1; while (*c && !isspace (*c)) c++; name = g_strdup_printf ("%.*s", (int) (c - command - 1), command + 1); params = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); while (TRUE) { gchar *start, *param_name, *param_value; while (isspace (*c)) c++; start = c; while (*c && !isspace (*c) && *c != '=') c++; if (*c == '\0') break; param_name = g_strdup_printf ("%.*s", (int) (c - start), start); if (*c == '=') { c++; while (isspace (*c)) c++; if (*c == '\"') { gboolean escaped = FALSE; GString *value; c++; value = g_string_new (""); while (*c) { if (*c == '\\') { if (escaped) { g_string_append_c (value, '\\'); escaped = FALSE; } else escaped = TRUE; } else if (!escaped && *c == '\"') break; if (!escaped) g_string_append_c (value, *c); c++; } param_value = value->str; g_string_free (value, FALSE); if (*c == '\"') c++; } else { start = c; while (*c && !isspace (*c)) c++; param_value = g_strdup_printf ("%.*s", (int) (c - start), start); } } else param_value = g_strdup (""); g_hash_table_insert (params, param_name, param_value); } if (strcmp (name, "STOP-XSERVER") == 0) xig_server_stop (xserver); else if (strcmp (name, "STOP-COMPIZ") == 0) stop_compiz (); else if (strcmp (name, "RESTART-COMPIZ") == 0) restart_compiz (); else if (strcmp (name, "CREATE-WINDOW") == 0) { XigWindow *root, *window; gchar *v; guint32 id = 0; gint16 x = 0, y = 0; guint16 width = 0, height = 0, border_width = 0; v = g_hash_table_lookup (params, "ID"); if (v) id = atoi (v); v = g_hash_table_lookup (params, "X"); if (v) x = atoi (v); v = g_hash_table_lookup (params, "Y"); if (v) y = atoi (v); v = g_hash_table_lookup (params, "WIDTH"); if (v) width = atoi (v); v = g_hash_table_lookup (params, "HEIGHT"); if (v) height = atoi (v); v = g_hash_table_lookup (params, "BORDER-WIDTH"); if (v) border_width = atoi (v); root = xig_server_get_root (xserver, 0); window = xig_window_add_child (root, NULL, id, XIG_WINDOW_CLASS_InputOutput, x, y, width, height, border_width, xig_window_get_visual (root), 0, NULL, 0, NULL, 0, 0, 0, 0, 0, 0, FALSE, FALSE); g_signal_connect (window, "unmap-notify", G_CALLBACK (unmap_notify_cb), NULL); g_signal_connect (window, "map-notify", G_CALLBACK (map_notify_cb), NULL); g_signal_connect (window, "reparent-notify", G_CALLBACK (reparent_notify_cb), NULL); g_signal_connect (window, "configure-notify", G_CALLBACK (configure_notify_cb), NULL); } else if (strcmp (name, "MAP-WINDOW") == 0) { gchar *v; guint32 id = 0; XigWindow *window; v = g_hash_table_lookup (params, "ID"); if (v) id = atoi (v); window = xig_server_get_window (xserver, id); xig_window_map (window, NULL); } else { g_printerr ("Unknown command '%s'\n", name); quit (EXIT_FAILURE); return; } g_free (name); g_hash_table_unref (params); } gchar *l = get_script_line (); /* Stop at the end of the script */ if (l == NULL) { if (compiz_pid) stop_compiz (); else quit (EXIT_SUCCESS); } } static gboolean status_timeout_cb (gpointer data) { fail ("(timeout)", get_script_line ()); status_timeout = 0; return FALSE; } static void check_status (const gchar *status) { gchar *pattern; if (getenv ("DEBUG")) g_print ("%s\n", status); if (failed) return; statuses = g_list_append (statuses, g_strdup (status)); /* Try and match against expected */ pattern = get_script_line (); if (!pattern || !g_regex_match_simple (pattern, status, 0, 0)) { fail (NULL, pattern); return; } script_iter = script_iter->next; /* Restart timeout */ if (status_timeout) g_source_remove (status_timeout); status_timeout = g_timeout_add (STATUS_TIMEOUT, status_timeout_cb, NULL); run_commands (); } static void signal_cb (int signum) { if (compiz_pid != 0) { if (compiz_pid) { g_print ("Caught signal %d, killing Compiz\n", signum); kill (compiz_pid, SIGKILL); } else g_print ("Caught signal %d, quitting\n", signum); } else { g_print ("Caught signal %d, quitting\n", signum); quit (EXIT_FAILURE); } } static void load_script (const gchar *filename) { int i; gchar *data, **lines; if (!g_file_get_contents (filename, &data, NULL, NULL)) { g_printerr ("Unable to load script: %s\n", filename); quit (EXIT_FAILURE); } lines = g_strsplit (data, "\n", -1); g_free (data); /* Load lines with #? prefix as expected behaviour */ for (i = 0; lines[i]; i++) { gchar *line = g_strstrip (lines[i]); if (g_str_has_prefix (line, "#?")) script = g_list_append (script, g_strdup (line+2)); } script_iter = script; g_strfreev (lines); } static void client_connected_cb (XigServer *server, XigRemoteClient *client) { check_status ("X CLIENT-CONNECTED"); } static void client_disconnected_cb (XigServer *server, XigRemoteClient *client) { check_status ("X CLIENT-DISCONNECTED"); } static gboolean client_stdout_cb (GIOChannel *source, GIOCondition condition, gpointer data) { gchar *str_return; gsize length; gsize terminator_pos; GError *error; if (condition & G_IO_IN) { while (g_io_channel_read_line (source, &str_return, &length, &terminator_pos, &error) == G_IO_STATUS_NORMAL) { if (getenv ("DEBUG")) g_print ("%s", str_return); } } return TRUE; } int main (int argc, char **argv) { GMainLoop *loop; XigScreen *screen; XigVisual *visual; gchar *script_name, *config_file, *config_path; GString *command_line; gchar **compiz_env, **compiz_argv; gint compiz_stdin, compiz_stdout, compiz_stderr; GIOChannel *compiz_stdout_channel = NULL; GError *error = NULL; signal (SIGINT, signal_cb); signal (SIGTERM, signal_cb); g_type_init (); loop = g_main_loop_new (NULL, FALSE); if (argc != 2) { g_printerr ("Usage %s SCRIPT-NAME\n", argv[0]); quit (EXIT_FAILURE); } script_name = argv[1]; config_file = g_strdup_printf ("%s.conf", script_name); config_path = g_build_filename (COMPIZ_XIG_TEST_SOURCE_DIR "/scripts", config_file, NULL); g_free (config_file); config = g_key_file_new (); g_key_file_load_from_file (config, config_path, G_KEY_FILE_NONE, NULL); load_script (config_path); /* Disable config if requested */ if (g_key_file_has_key (config, "test-runner-config", "have-config", NULL) && !g_key_file_get_boolean (config, "test-runner-config", "have-config", NULL)) config_path = NULL; g_print ("----------------------------------------\n"); g_print ("Running script %s\n", script_name); /* Create an X server to test with */ xserver = xig_server_new ("compiz-test", 99); xig_server_set_listen_tcp (xserver, FALSE); g_signal_connect (xserver, "client-connected", G_CALLBACK (client_connected_cb), NULL); g_signal_connect (xserver, "client-disconnected", G_CALLBACK (client_disconnected_cb), NULL); xig_server_add_pixmap_format (xserver, 1, 1, 32); xig_server_add_pixmap_format (xserver, 4, 8, 32); xig_server_add_pixmap_format (xserver, 8, 8, 32); xig_server_add_pixmap_format (xserver, 15, 16, 32); xig_server_add_pixmap_format (xserver, 16, 16, 32); xig_server_add_pixmap_format (xserver, 24, 32, 32); xig_server_add_pixmap_format (xserver, 32, 32, 32); screen = xig_server_add_screen (xserver, 0x00FFFFFF, 0x00000000, 1024, 768, 1024, 768); visual = xig_screen_add_visual (screen, 24, XIG_VISUAL_CLASS_TrueColor, 8, 1, 0x00FF0000, 0x0000FF00, 0x000000FF); xig_screen_add_root (screen, visual); run_commands (); status_timeout = g_timeout_add (STATUS_TIMEOUT, status_timeout_cb, NULL); if (!xig_server_start (xserver, &error)) { g_printerr ("Failed to start Xig X server: %s", error->message); quit (EXIT_FAILURE); } compiz_env = g_strsplit ("DISPLAY=:99", " ", -1); command_line = g_string_new (compiz_BINARY_DIR "/src/compiz"); g_print ("Start Compiz with command: %s\n", command_line->str); if (!g_shell_parse_argv (command_line->str, NULL, &compiz_argv, &error)) { g_warning ("Error parsing command line: %s", error->message); quit (EXIT_FAILURE); } g_clear_error (&error); if (!g_spawn_async_with_pipes (NULL, /* working directory */ compiz_argv, compiz_env, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, /* child setup */ &compiz_pid, &compiz_stdin, &compiz_stdout, &compiz_stderr, &error)) { g_warning ("Error launching Compiz: %s", error->message); quit (EXIT_FAILURE); } g_clear_error (&error); g_child_watch_add (compiz_pid, compiz_exit_cb, NULL); if (getenv ("DEBUG")) g_print ("Compiz running with PID %d\n", compiz_pid); compiz_stdout_channel = g_io_channel_unix_new (compiz_stdout); g_io_channel_set_flags (compiz_stdout_channel, G_IO_FLAG_NONBLOCK, NULL); g_io_add_watch (compiz_stdout_channel, G_IO_IN, client_stdout_cb, NULL); check_status ("COMPIZ START"); g_main_loop_run (loop); g_object_unref (compiz_stdout_channel); return EXIT_FAILURE; } compiz-0.9.11+14.04.20140409/tests/integration/xig/src/config.h.in0000644000015301777760000000026412321343002024562 0ustar pbusernogroup00000000000000#define COMPIZ_XIG_TEST_SOURCE_DIR "@COMPIZ_XIG_TEST_SOURCE_DIR@" #define COMPIZ_XIG_TEST_BINARY_DIR "@COMPIZ_XIG_TEST_BINARY_DIR@" #define compiz_BINARY_DIR "@compiz_BINARY_DIR@" compiz-0.9.11+14.04.20140409/tests/integration/xig/src/CMakeLists.txt0000644000015301777760000000057412321343002025303 0ustar pbusernogroup00000000000000include_directories (${COMPIZ_XIG_TEST_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR}) link_directories (${COMPIZ_XIG_TEST_LIBRARY_DIRS}) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) add_executable (compiz-xig-test-runner test-runner.c) target_link_libraries (compiz-xig-test-runner ${COMPIZ_XIG_TEST_LIBRARIES}) compiz-0.9.11+14.04.20140409/tests/integration/xig/scripts/0000755000015301777760000000000012321344021023437 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/integration/xig/scripts/xserver-quit.conf0000644000015301777760000000030412321343002026757 0ustar pbusernogroup00000000000000# # Check Compiz quits with an error when the X server quits # # Start Compiz #?COMPIZ START # Compiz connects to X server #?X CLIENT-CONNECTED # Cleanup #?*STOP-XSERVER #?COMPIZ EXIT STATUS=1 compiz-0.9.11+14.04.20140409/tests/integration/xig/scripts/restart.conf0000644000015301777760000000052512321343002025772 0ustar pbusernogroup00000000000000# # Check Compiz restarts # # Start Compiz #?COMPIZ START # Compiz connects to X server #?X CLIENT-CONNECTED # Restart #?*RESTART-COMPIZ #?(X CLIENT-DISCONNECTED|X CLIENT-CONNECTED) #?(X CLIENT-DISCONNECTED|X CLIENT-CONNECTED|) #?*STOP-COMPIZ #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) compiz-0.9.11+14.04.20140409/tests/integration/xig/scripts/new-window.conf0000644000015301777760000000102112321343002026374 0ustar pbusernogroup00000000000000# # Check Compiz correctly places a window # # Start Compiz #?COMPIZ START # Compiz connects to X server #?X CLIENT-CONNECTED # Place a window #?*CREATE-WINDOW ID=123 X=0 Y=0 WIDTH=100 HEIGHT=100 #?*MAP-WINDOW ID=123 # FIXME: Compiz is reparentining after the map #?MAP-NOTIFY ID=123 #?UNMAP-NOTIFY ID=123 # Compiz reparents us #?REPARENT-NOTIFY ID=123 # Window is mapped by Compiz #?MAP-NOTIFY ID=123 # Cleanup #?*STOP-COMPIZ #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) compiz-0.9.11+14.04.20140409/tests/integration/xig/scripts/existing-window.conf0000644000015301777760000000075312321343002027450 0ustar pbusernogroup00000000000000# # Check Compiz correctly places a window # # Place a window #?*CREATE-WINDOW ID=123 X=0 Y=0 WIDTH=100 HEIGHT=100 #?*MAP-WINDOW ID=123 # X server maps us (no window manager) #?MAP-NOTIFY ID=123 # Start Compiz #?COMPIZ START # Compiz connects to X server #?X CLIENT-CONNECTED # Compiz reparents us #?UNMAP-NOTIFY ID=123 #?REPARENT-NOTIFY ID=123 #?MAP-NOTIFY ID=123 # Cleanup #?*STOP-COMPIZ #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) compiz-0.9.11+14.04.20140409/tests/integration/xig/scripts/startup.conf0000644000015301777760000000034512321343002026010 0ustar pbusernogroup00000000000000# # Check Compiz starts # # Start Compiz #?COMPIZ START # Compiz connects to X server #?X CLIENT-CONNECTED # Cleanup #?*STOP-COMPIZ #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) compiz-0.9.11+14.04.20140409/tests/integration/CMakeLists.txt0000644000015301777760000000005712321343002023721 0ustar pbusernogroup00000000000000add_subdirectory (xig) add_subdirectory (glib) compiz-0.9.11+14.04.20140409/tests/shared/0000755000015301777760000000000012321344021020104 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/shared/gtest_shared_characterwrapper.h0000644000015301777760000000243712321343002026352 0ustar pbusernogroup00000000000000/* * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GTEST_SHARED_CHARACTERWRAPPER #define _COMPIZ_GTEST_SHARED_CHARACTERWRAPPER #include #include class CharacterWrapper : boost::noncopyable { public: explicit CharacterWrapper (char *c) : mChar (c) { } ~CharacterWrapper () { free (mChar); } operator char * () { return mChar; } operator const char * () const { return mChar; } private: char *mChar; }; #endif compiz-0.9.11+14.04.20140409/tests/shared/glib/0000755000015301777760000000000012321344021021021 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/shared/glib/glib_gsettings_memory_backend_env.h0000644000015301777760000000265612321343002030114 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GLIB_GSETTINGS_MEMORY_BACKEND_TEST_ENV_H #define _COMPIZ_GLIB_GSETTINGS_MEMORY_BACKEND_TEST_ENV_H #include class CompizGLibGSettingsMemoryBackendTestingEnv { public: virtual ~CompizGLibGSettingsMemoryBackendTestingEnv () {} virtual void SetUpEnv (const std::string &MOCK_PATH) { g_setenv ("GSETTINGS_SCHEMA_DIR", MOCK_PATH.c_str (), true); g_setenv ("GSETTINGS_BACKEND", "memory", 1); } virtual void TearDownEnv () { g_unsetenv ("GSETTINGS_BACKEND"); g_unsetenv ("GSETTINGS_SCHEMA_DIR"); } }; #endif compiz-0.9.11+14.04.20140409/tests/shared/glib/glib_gslice_off_env.h0000644000015301777760000000231312321343002025134 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GLIB_GSLICE_OFF_ENV_H #define _COMPIZ_GLIB_GSLICE_OFF_ENV_H #include class CompizGLibGSliceOffEnv { public: virtual ~CompizGLibGSliceOffEnv () {} virtual void SetUpEnv () { g_setenv ("G_SLICE", "always-malloc", 1); } virtual void TearDownEnv () { g_unsetenv ("G_SLICE"); } }; #endif compiz-0.9.11+14.04.20140409/tests/shared/gtest_unspecified_bool_type_matcher.h0000644000015301777760000000221712321343002027540 0ustar pbusernogroup00000000000000/* * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GTEST_UNSPECIFIED_BOOL_TYPE_MATCHER_H #define _COMPIZ_GTEST_UNSPECIFIED_BOOL_TYPE_MATCHER_H #include #include MATCHER (IsTrue, "Is True") { if (arg) return true; else return false; } MATCHER (IsFalse, "Is False") { if (!arg) return true; else return false; } #endif compiz-0.9.11+14.04.20140409/tests/shared/gtest_shared_asynctask.h0000644000015301777760000000264212321343002025013 0ustar pbusernogroup00000000000000/* * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GTEST_SHARED_ASYNCTASK_H #define _COMPIZ_GTEST_SHARED_ASYNCTASK_H #include #include class PrivateAsyncTask; class AsyncTask { public: typedef boost::shared_ptr Ptr; AsyncTask (); virtual ~AsyncTask (); void SendMsgToTask (char msg); bool ReadMsgFromTask (char msg, int maximumWait); protected: void SendMsgToTest (char msg); bool ReadMsgFromTest (char msg, int maximumWait); private: static void * ThreadEntry (void *data); virtual void Task () = 0; std::auto_ptr priv; }; #endif compiz-0.9.11+14.04.20140409/tests/shared/gtest_shared_autodestroy.h0000644000015301777760000000224012321343002025367 0ustar pbusernogroup00000000000000/* * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GTEST_SHARED_AUTODESTROY_H #define _COMPIZ_GTEST_SHARED_AUTODESTROY_H #include #include namespace { template boost::shared_ptr AutoDestroy (T *t, TDel d) { return boost::shared_ptr (t, boost::bind (d, _1)); } } #endif compiz-0.9.11+14.04.20140409/tests/shared/gtest_shared_tmpenv.h0000644000015301777760000000260312321343002024321 0ustar pbusernogroup00000000000000/* * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GTEST_SHARED_TMPENV #define _COMPIZ_GTEST_SHARED_TMPENV #include #include class TmpEnv : boost::noncopyable { public: explicit TmpEnv (const char *env, const char *val) : envRestore (env), envRestoreVal (getenv (env)) { if (!val) unsetenv (env); else setenv (env, val, 1); } ~TmpEnv () { if (envRestoreVal) setenv (envRestore, envRestoreVal, 1); else unsetenv (envRestore); } private: const char *envRestore; const char *envRestoreVal; }; #endif compiz-0.9.11+14.04.20140409/tests/shared/CMakeLists.txt0000644000015301777760000000012212321343002022635 0ustar pbusernogroup00000000000000set (GTEST_SHARED_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory (src) compiz-0.9.11+14.04.20140409/tests/shared/src/0000755000015301777760000000000012321344021020673 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/shared/src/gtest_shared_asynctask.cpp0000644000015301777760000000622012321343002026131 0ustar pbusernogroup00000000000000/* * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include "gtest_shared_asynctask.h" #include "gtest_shared_characterwrapper.h" namespace { void runtimeErrorWithErrno () { CharacterWrapper allocatedError (strerror (errno)); throw std::runtime_error (std::string (allocatedError)); } bool checkForMessageOnFd (int fd, int timeout, char expected) { struct pollfd pfd; pfd.fd = fd; pfd.events = POLLIN; pfd.revents = 0; /* Wait 1ms */ poll (&pfd, 1, timeout); if (pfd.revents == POLLIN) { char msg[1]; size_t sz = read (pfd.fd, reinterpret_cast (msg), 1); if (sz == 1 && msg[0] == expected) return true; } return false; } } class PrivateAsyncTask { public: int testToTaskFd[2]; int taskToTestFd[2]; pthread_t mThread; }; AsyncTask::AsyncTask () : priv (new PrivateAsyncTask) { if (pipe2 (priv->testToTaskFd, O_NONBLOCK | O_CLOEXEC) == -1) runtimeErrorWithErrno (); if (pipe2 (priv->taskToTestFd, O_NONBLOCK | O_CLOEXEC) == -1) runtimeErrorWithErrno (); if (pthread_create (&priv->mThread, NULL, AsyncTask::ThreadEntry, reinterpret_cast (this)) != 0) runtimeErrorWithErrno (); } AsyncTask::~AsyncTask () { void *ret; if (pthread_join (priv->mThread, &ret) != 0) { runtimeErrorWithErrno (); } close (priv->testToTaskFd[0]); close (priv->testToTaskFd[1]); close (priv->taskToTestFd[0]); close (priv->taskToTestFd[0]); } bool AsyncTask::ReadMsgFromTest (char msg, int maximumWait) { return checkForMessageOnFd (priv->testToTaskFd[0], maximumWait, msg); } bool AsyncTask::ReadMsgFromTask (char msg, int maximumWait) { return checkForMessageOnFd (priv->taskToTestFd[0], maximumWait, msg); } void AsyncTask::SendMsgToTest (char msg) { char buf[1] = { msg }; if (write (priv->taskToTestFd[1], reinterpret_cast (buf), 1) == -1) runtimeErrorWithErrno (); } void AsyncTask::SendMsgToTask (char msg) { char buf[1] = { msg }; if (write (priv->testToTaskFd[1], reinterpret_cast (buf), 1) == -1) runtimeErrorWithErrno (); } void * AsyncTask::ThreadEntry (void *data) { AsyncTask *task = reinterpret_cast (data); task->Task (); return NULL; } compiz-0.9.11+14.04.20140409/tests/shared/src/CMakeLists.txt0000644000015301777760000000030712321343002023431 0ustar pbusernogroup00000000000000include_directories (${GTEST_SHARED_INCLUDE_DIR}) add_library (compiz_gtest_shared_async_task STATIC gtest_shared_asynctask.cpp) target_link_libraries (compiz_gtest_shared_async_task) compiz-0.9.11+14.04.20140409/tests/system/0000755000015301777760000000000012321344021020162 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/system/xorg-gtest/0000755000015301777760000000000012321344021022265 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/system/xorg-gtest/tests/0000755000015301777760000000000012321344021023427 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/system/xorg-gtest/tests/compiz_xorg_gtest_icccm.cpp0000644000015301777760000001654212321343002031045 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest, ICCCM compliance * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using ::testing::MatchResultListener; using ::testing::MakeMatcher; using ::testing::Matcher; namespace ct = compiz::testing; namespace { char TEST_FAILED_MSG = 's'; char PROCESS_EXITED_MSG = 'd'; bool Advance (Display *d, bool r) { return ct::AdvanceToNextEventOnSuccess (d, r); } } class WaitForSuccessDeathTask : public AsyncTask { public: typedef boost::function GetProcessState; WaitForSuccessDeathTask (const GetProcessState &procState) : mProcessState (procState) { } virtual ~WaitForSuccessDeathTask () {} private: GetProcessState mProcessState; void Task (); }; void WaitForSuccessDeathTask::Task () { do { if (ReadMsgFromTest (TEST_FAILED_MSG, 1)) return; } while (mProcessState () != xorg::testing::Process::FINISHED_FAILURE); /* The process died, send a message back saying that it did */ SendMsgToTest (PROCESS_EXITED_MSG); } class CompizXorgSystemICCCM : public ct::CompizXorgSystemTest { public: CompizXorgSystemICCCM () : /* See note in the acceptance tests about this */ env ("XORG_GTEST_CHILD_STDOUT", "1") { } virtual void SetUp () { ct::CompizXorgSystemTest::SetUp (); ::Display *dpy = Display (); XSelectInput (dpy, DefaultRootWindow (dpy), StructureNotifyMask | FocusChangeMask | PropertyChangeMask | SubstructureRedirectMask); } private: TmpEnv env; }; TEST_F (CompizXorgSystemICCCM, SomeoneElseHasSubstructureRedirectMask) { StartCompiz (static_cast ( ct::CompizProcess::ExpectStartupFailure | ct::CompizProcess::ReplaceCurrentWM | ct::CompizProcess::WaitForStartupMessage), ct::CompizProcess::PluginList ()); WaitForSuccessDeathTask::GetProcessState processState (boost::bind (&CompizXorgSystemICCCM::CompizProcessState, this)); AsyncTask::Ptr task (boost::make_shared (processState)); /* Now wait for the thread to tell us the news - * this will block for up to ten seconds */ const int maximumWaitTime = 1000 * 10; // 10 seconds if (!task->ReadMsgFromTask (PROCESS_EXITED_MSG, maximumWaitTime)) { task->SendMsgToTask (TEST_FAILED_MSG); throw std::runtime_error ("compiz process did not exit with failure status"); } } class AutostartCompizXorgSystemICCCM : public ct::CompizXorgSystemTest { public: virtual void SetUp () { ct::CompizXorgSystemTest::SetUp (); ::Display *dpy = Display (); XSelectInput (dpy, DefaultRootWindow (dpy), StructureNotifyMask | SubstructureNotifyMask | FocusChangeMask | PropertyChangeMask); StartCompiz (static_cast ( ct::CompizProcess::ReplaceCurrentWM | ct::CompizProcess::WaitForStartupMessage), ct::CompizProcess::PluginList ()); } }; TEST_F (AutostartCompizXorgSystemICCCM, ConfigureRequestSendsBackAppropriateConfigureNotify) { ::Display *dpy = Display (); Window root = DefaultRootWindow (dpy); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w1); XMapRaised (dpy, w2); ct::PropertyNotifyXEventMatcher propertyMatcher (dpy, "_NET_CLIENT_LIST_STACKING"); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, propertyMatcher))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, propertyMatcher))); /* Select for StructureNotify on w1 */ XSelectInput (dpy, w1, StructureNotifyMask); /* Send a ConfigureRequest to the server asking for * a particular geometry and stack position relative * to w2 */ XEvent event; XConfigureRequestEvent *configureRequestEvent = &event.xconfigurerequest; event.type = ConfigureRequest; const Window REQUEST_ABOVE = w2; const unsigned int REQUEST_BORDER_WIDTH = 0; const unsigned int REQUEST_X = 110; const unsigned int REQUEST_Y = 120; const unsigned int REQUEST_WIDTH = 200; const unsigned int REQUEST_HEIGHT = 200; configureRequestEvent->window = w1; configureRequestEvent->above = REQUEST_ABOVE; configureRequestEvent->detail = Above; configureRequestEvent->border_width = REQUEST_BORDER_WIDTH; configureRequestEvent->x = REQUEST_X; configureRequestEvent->y = REQUEST_Y; configureRequestEvent->width = REQUEST_WIDTH; configureRequestEvent->height = REQUEST_HEIGHT; configureRequestEvent->value_mask = CWX | CWY | CWWidth | CWHeight | CWBorderWidth | CWSibling | CWStackMode; XSendEvent (dpy, root, 0, SubstructureRedirectMask | SubstructureNotifyMask, &event); XFlush (dpy); /* Now wait for a ConfigureNotify to be sent back */ ct::ConfigureNotifyXEventMatcher configureMatcher (0, // Always zero REQUEST_BORDER_WIDTH, REQUEST_X, REQUEST_Y, REQUEST_WIDTH, REQUEST_HEIGHT, configureRequestEvent->value_mask & ~(CWSibling | CWStackMode)); /* Should get a ConfigureNotify with the right parameters */ EXPECT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, w1, ConfigureNotify, -1, -1, configureMatcher))); /* Check if the window is actually above */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, propertyMatcher))); /* Check the client list to see that w1 > w2 */ std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); ASSERT_EQ (2, clientList.size ()); EXPECT_EQ (w2, clientList.front ()); EXPECT_EQ (w1, clientList.back ()); } ././@LongLink0000000000000000000000000000014600000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/tests/system/xorg-gtest/tests/compiz_xorg_gtest_test_window_stacking.cppcompiz-0.9.11+14.04.20140409/tests/system/xorg-gtest/tests/compiz_xorg_gtest_test_window_stacking.cp0000644000015301777760000005636412321343002034046 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest, window stacking * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include using ::testing::MatchResultListener; using ::testing::MakeMatcher; using ::testing::Matcher; namespace ct = compiz::testing; namespace ctm = compiz::testing::messages; class CompizXorgSystemStackingTest : public ct::AutostartCompizXorgSystemTest { public: virtual void SetUp () { ct::AutostartCompizXorgSystemTest::SetUp (); ::Display *dpy = Display (); XSelectInput (dpy, DefaultRootWindow (dpy), SubstructureNotifyMask | PropertyChangeMask); } }; namespace { bool Advance (Display *dpy, bool waitResult) { return ct::AdvanceToNextEventOnSuccess (dpy, waitResult); } void MakeDock (Display *dpy, Window w) { Atom _NET_WM_WINDOW_TYPE = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE", false); Atom _NET_WM_WINDOW_TYPE_DOCK = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DOCK", false); XChangeProperty (dpy, w, _NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, reinterpret_cast (&_NET_WM_WINDOW_TYPE_DOCK), 1); } void SetUserTime (Display *dpy, Window w, Time time) { Atom _NET_WM_USER_TIME = XInternAtom (dpy, "_NET_WM_USER_TIME", false); unsigned int value = (unsigned int) time; XChangeProperty (dpy, w, _NET_WM_USER_TIME, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &value, 1); } void SetClientLeader (Display *dpy, Window w, Window leader) { Atom WM_CLIENT_LEADER = XInternAtom (dpy, "WM_CLIENT_LEADER", false); XChangeProperty (dpy, w, WM_CLIENT_LEADER, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &leader, 1); } } TEST_F (CompizXorgSystemStackingTest, TestSetup) { } TEST_F (CompizXorgSystemStackingTest, TestCreateWindowsAndRestackRelativeToEachOther) { ::Display *dpy = Display (); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w1); XMapRaised (dpy, w2); /* Both reparented and both mapped */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy,w1, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w1, MapNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w2, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w2, MapNotify, -1, -1))); ct::PropertyNotifyXEventMatcher matcher (dpy, "_NET_CLIENT_LIST_STACKING"); /* Wait for property change notify on the root window to happen twice */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); /* Check the client list to see that w2 > w1 */ std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); ASSERT_EQ (clientList.size (), 2); EXPECT_EQ (clientList.front (), w1); EXPECT_EQ (clientList.back (), w2); } TEST_F (CompizXorgSystemStackingTest, TestCreateWindowsAndRestackRelativeToEachOtherDockAlwaysOnTop) { ::Display *dpy = Display (); ct::PropertyNotifyXEventMatcher matcher (dpy, "_NET_CLIENT_LIST_STACKING"); Window dock = ct::CreateNormalWindow (dpy); /* Make it a dock */ MakeDock (dpy, dock); /* Immediately map the dock window and clear the event queue for it */ XMapRaised (dpy, dock); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, dock, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, dock, MapNotify, -1, -1))); /* Dock window needs to be in the client list */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); ASSERT_EQ (clientList.size (), 1); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); XSelectInput (dpy, w2, StructureNotifyMask); XMapRaised (dpy, w1); XMapRaised (dpy, w2); /* Both reparented and both mapped */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w1, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w1, MapNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w2, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w2, MapNotify, -1, -1))); /* Wait for property change notify on the root window to happen twice */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); clientList = ct::NET_CLIENT_LIST_STACKING (dpy); /* Check the client list to see that dock > w2 > w1 */ ASSERT_EQ (clientList.size (), 3); std::list ::iterator it = clientList.begin (); EXPECT_EQ (*it++, w1); /* first should be the bottom normal window */ EXPECT_EQ (*it++, w2); /* second should be the top normal window */ EXPECT_EQ (*it++, dock); /* dock must always be on top */ } TEST_F (CompizXorgSystemStackingTest, TestMapWindowWithOldUserTime) { ::Display *dpy = Display (); ct::PropertyNotifyXEventMatcher matcher (dpy, "_NET_CLIENT_LIST_STACKING"); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); Window w3 = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w1); XMapRaised (dpy, w2); /* Wait for property change notify on the root window to happen twice */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); SetUserTime (dpy, w2, 200); SetClientLeader (dpy, w2, w2); SetUserTime (dpy, w3, 100); SetClientLeader (dpy, w3, w3); XMapRaised (dpy, w3); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); /* Check the client list to see that w2 > w3 > w1 */ std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); ASSERT_EQ (clientList.size (), 3); std::list ::iterator it = clientList.begin (); EXPECT_EQ (*it++, w1); EXPECT_EQ (*it++, w3); EXPECT_EQ (*it++, w2); } TEST_F (CompizXorgSystemStackingTest, TestMapWindowAndDenyFocus) { ::Display *dpy = Display (); ct::PropertyNotifyXEventMatcher matcher (dpy, "_NET_CLIENT_LIST_STACKING"); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); Window w3 = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w1); XMapRaised (dpy, w2); /* Wait for property change notify on the root window to happen twice */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); SetUserTime (dpy, w3, 0); SetClientLeader (dpy, w3, w3); XMapRaised (dpy, w3); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); /* Check the client list to see that w2 > w3 > w1 */ std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); ASSERT_EQ (clientList.size (), 3); std::list ::iterator it = clientList.begin (); EXPECT_EQ (*it++, w1); EXPECT_EQ (*it++, w3); EXPECT_EQ (*it++, w2); } TEST_F (CompizXorgSystemStackingTest, TestCreateRelativeToDestroyedWindowFindsAnotherAppropriatePosition) { ::Display *dpy = Display (); ct::PropertyNotifyXEventMatcher matcher (dpy, "_NET_CLIENT_LIST_STACKING"); Window dock = ct::CreateNormalWindow (dpy); /* Make it a dock */ MakeDock (dpy, dock); /* Immediately map the dock window and clear the event queue for it */ XMapRaised (dpy, dock); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, dock, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, dock, MapNotify, -1, -1))); /* Dock window needs to be in the client list */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); ASSERT_EQ (clientList.size (), 1); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w1); /* All reparented and mapped */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy,w1, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w1, MapNotify, -1, -1))); /* Grab the server so that we can guarantee that all of these requests * happen before compiz gets them */ XGrabServer (dpy); XSync (dpy, false); /* Map the second window, so it ideally goes above w1. Compiz will * receive the MapRequest for this first */ XMapRaised (dpy, w2); /* Create window that has w2 as its ideal above-candidate * (compiz will receive the CreateNotify for this window * after the MapRequest but before the subsequent MapNotify) */ Window w3 = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w3); /* Destroy w2 */ XDestroyWindow (dpy, w2); XUngrabServer (dpy); XSync (dpy, false); /* Reparented and mapped */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w3, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w3, MapNotify, -1, -1))); /* Update _NET_CLIENT_LIST_STACKING twice */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); /* Check the client list to see that dock > w3 > w1 */ clientList = ct::NET_CLIENT_LIST_STACKING (dpy); std::list ::iterator it = clientList.begin (); EXPECT_EQ (3, clientList.size ()); EXPECT_EQ (w1, (*it++)); EXPECT_EQ (w3, (*it++)); EXPECT_EQ (dock, (*it++)); } TEST_F(CompizXorgSystemStackingTest, TestWindowsDontStackAboveTransientForWindows) { /* Here we are testing if new windows are being stacked above transientFor * windows. A problem is if a window is set to transientFor on a dock type * then a new window is mapped it set to be lower or above the transientFor * window causing it to be above the dock type window int the stack (which * is incorrect behavior) */ ::Display *dpy = Display (); ct::PropertyNotifyXEventMatcher matcher (dpy, "_NET_CLIENT_LIST_STACKING"); Window dock = ct::CreateNormalWindow (dpy); MakeDock (dpy, dock); XMapRaised (dpy, dock); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); XSetTransientForHint(dpy, w1, dock); XMapRaised (dpy, w1); XMapRaised (dpy, w2); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); std::list ::iterator it = clientList.begin (); /* Assert, w1 > dock > w2 */ EXPECT_EQ (3, clientList.size ()); EXPECT_EQ (w2, (*it++)); EXPECT_EQ (dock, (*it++)); EXPECT_EQ (w1, (*it++)); } class StackingSync : public ct::AutostartCompizXorgSystemTestWithTestHelper { public: void SetUp (); }; void StackingSync::SetUp () { ct::AutostartCompizXorgSystemTestWithTestHelper::SetUp (); XSelectInput (Display (), DefaultRootWindow (Display ()), StructureNotifyMask | SubstructureNotifyMask); } namespace { Window CreateAndWaitForCreation (Display *dpy) { Window w = ct::CreateNormalWindow (dpy); Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, DefaultRootWindow (dpy), CreateNotify, -1, -1)); return w; } Window CreateOverrideRedirectWindow (Display *dpy) { XSetWindowAttributes attrib; attrib.override_redirect = true; Window w = XCreateWindow (dpy, DefaultRootWindow (dpy), ct::WINDOW_X, ct::WINDOW_Y, ct::WINDOW_WIDTH, ct::WINDOW_HEIGHT, 0, DefaultDepth (dpy, 0), InputOutput, DefaultVisual (dpy, DefaultScreen (dpy)), CWOverrideRedirect, &attrib); XSelectInput (dpy, w, StructureNotifyMask); return w; } Window MapAndWaitForParent (Display *dpy, Window w) { XMapRaised (dpy, w); Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w, ReparentNotify, -1, -1)); return ct::GetTopmostNonRootParent (dpy, w); } void DestroyOnReparent (Display *dpy, ct::MessageAtoms &atoms, Window w) { Window root = DefaultRootWindow (dpy); Atom atom = atoms.FetchForString (ctm::TEST_HELPER_DESTROY_ON_REPARENT); std::vector data (4); ct::SendClientMessage (dpy, atom, root, w, data); } Window WaitForNextCreatedWindow (Display *dpy) { XEvent ev; while (true) { XNextEvent (dpy, &ev); if (ev.type == CreateNotify) return ev.xcreatewindow.window; } return 0; } void WaitForManage (Display *dpy, ct::MessageAtoms &atoms) { Atom atom = atoms.FetchForString (ctm::TEST_HELPER_WINDOW_READY); XEvent ev; ct::ReceiveMessage (dpy, atom, ev); } void RestackAbove (Display *dpy, Window w, Window above) { XWindowChanges xwc; xwc.stack_mode = Above; xwc.sibling = above; XConfigureWindow (dpy, w, CWStackMode | CWSibling, &xwc); } void RestackAtLeastAbove (Display *dpy, ct::MessageAtoms &atoms, Window w, Window above) { Window root = DefaultRootWindow (dpy); Atom atom = atoms.FetchForString (ctm::TEST_HELPER_RESTACK_ATLEAST_ABOVE); std::vector data (4); data[0] = above; ct::SendClientMessage (dpy, atom, root, w, data); } void FreeWindowArray (Window *array) { XFree (array); } typedef boost::shared_array WindowArray; WindowArray GetChildren (Display *dpy, Window w, unsigned int &n) { Window unused; Window *children; if (!XQueryTree (dpy, w, &unused, &unused, &children, &n)) throw std::logic_error ("XQueryTree failed"); return WindowArray (children, boost::bind (FreeWindowArray, _1)); } class StackPositionMatcher : public MatcherInterface { public: StackPositionMatcher (const WindowArray &array, Window cmp, unsigned int n); protected: bool MatchAndExplain (Window window, MatchResultListener *listener) const; void DescribeTo (std::ostream *os) const; private: virtual bool Compare (int lhsPos, int rhsPos) const = 0; virtual void ExplainCompare (std::ostream *os) const = 0; WindowArray array; unsigned int arrayNum; Window cmp; }; StackPositionMatcher::StackPositionMatcher (const WindowArray &array, Window cmp, unsigned int n) : array (array), arrayNum (n), cmp (cmp) { } bool StackPositionMatcher::MatchAndExplain (Window window, MatchResultListener *listener) const { int lhsPos = -1, rhsPos = -1; for (unsigned int i = 0; i < arrayNum; ++i) { if (array[i] == window) lhsPos = i; if (array[i] == cmp) rhsPos = i; } if (lhsPos > -1 && rhsPos > -1) { if (Compare (lhsPos, rhsPos)) return true; } /* Match failed, add stack to MatchResultListener */ if (listener->IsInterested ()) { std::stringstream windowStack; windowStack << "Window Stack (bottom to top [" << arrayNum << "]): \n"; *listener << windowStack.str (); for (unsigned int i = 0; i < arrayNum; ++i) { std::stringstream ss; ss << " - 0x" << std::hex << array[i] << std::dec << std::endl; *listener << ss.str (); } std::stringstream lhsPosMsg, rhsPosMsg; lhsPosMsg << "Position of 0x" << std::hex << window << std::dec << " : " << lhsPos; rhsPosMsg << "Position of 0x" << std::hex << cmp << std::dec << " : " << rhsPos; *listener << lhsPosMsg.str () << "\n"; *listener << rhsPosMsg.str () << "\n"; } return false; } void StackPositionMatcher::DescribeTo (std::ostream *os) const { *os << "Window is "; ExplainCompare (os); *os << " in relation to 0x" << std::hex << cmp << std::dec; } class GreaterThanInStackMatcher : public StackPositionMatcher { public: GreaterThanInStackMatcher (const WindowArray &array, Window cmp, unsigned int n); private: bool Compare (int lhsPos, int rhsPos) const; void ExplainCompare (std::ostream *os) const; }; GreaterThanInStackMatcher::GreaterThanInStackMatcher (const WindowArray &array, Window cmp, unsigned int n) : StackPositionMatcher (array, cmp, n) { } bool GreaterThanInStackMatcher::Compare (int lhsPos, int rhsPos) const { return lhsPos > rhsPos; } void GreaterThanInStackMatcher::ExplainCompare (std::ostream *os) const { *os << "greater than"; } class LessThanInStackMatcher : public StackPositionMatcher { public: LessThanInStackMatcher (const WindowArray &array, Window cmp, unsigned int n); private: bool Compare (int lhsPos, int rhsPos) const; void ExplainCompare (std::ostream *os) const; }; LessThanInStackMatcher::LessThanInStackMatcher (const WindowArray &array, Window cmp, unsigned int n) : StackPositionMatcher (array, cmp, n) { } bool LessThanInStackMatcher::Compare (int lhsPos, int rhsPos) const { return lhsPos < rhsPos; } void LessThanInStackMatcher::ExplainCompare (std::ostream *os) const { *os << "less than"; } inline Matcher GreaterThanInStack (const WindowArray &array, unsigned int n, Window cmp) { return MakeMatcher (new GreaterThanInStackMatcher (array, cmp, n)); } inline Matcher LessThanInStack (const WindowArray &array, unsigned int n, Window cmp) { return MakeMatcher (new LessThanInStackMatcher (array, cmp, n)); } } TEST_F (StackingSync, DestroyClientJustBeforeReparent) { ::Display *dpy = Display (); ct::MessageAtoms atoms (dpy); /* Set up three normal windows */ Window w1 = CreateAndWaitForCreation (dpy); Window w2 = CreateAndWaitForCreation (dpy); Window w3 = CreateAndWaitForCreation (dpy); Window p1 = MapAndWaitForParent (dpy, w1); Window p2 = MapAndWaitForParent (dpy, w2); Window p3 = MapAndWaitForParent (dpy, w3); /* Create another normal window, but immediately mark * it destroyed within compiz as soon as it is reparented, * so that we force the reparented-but-destroyed strategy * to kick in */ Window destroyed = CreateAndWaitForCreation (dpy); DestroyOnReparent (dpy, atoms, destroyed); XMapRaised (dpy, destroyed); /* Wait for the destroyed window's parent to be created * in the toplevel stack as a result of the reparent operation */ Window parentOfDestroyed = WaitForNextCreatedWindow (dpy); WaitForManage (dpy, atoms); /* Create an override redirect window and wait for it to be * managed */ Window override = CreateOverrideRedirectWindow (dpy); WaitForManage (dpy, atoms); /* Place the destroyed window's parent above * p1 in the stack directly */ RestackAbove (dpy, parentOfDestroyed, p1); /* Ask compiz to place the override redirect window * at least above the destroyed window's parent * in the stack. This requires compiz to locate the * destroyed window's parent in the stack */ RestackAtLeastAbove (dpy, atoms, override, parentOfDestroyed); /* Wait for the override window to be configured */ Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, override, ConfigureNotify, -1, -1)); unsigned int n; WindowArray windows (GetChildren (dpy, DefaultRootWindow (dpy), n)); EXPECT_THAT (p2, LessThanInStack (windows, n, override)); EXPECT_THAT (p3, GreaterThanInStack (windows, n, override)); } compiz-0.9.11+14.04.20140409/tests/system/xorg-gtest/tests/compiz_xorg_gtest_test_shape_handling.cpp0000644000015301777760000001200612321343002033761 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest, window stacking * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include using ::testing::MatchResultListener; using ::testing::MakeMatcher; using ::testing::Matcher; using ::testing::IsNull; using ::testing::NotNull; namespace ct = compiz::testing; namespace { bool Advance (Display *dpy, bool waitResult) { return ct::AdvanceToNextEventOnSuccess (dpy, waitResult); } Window FindTopLevelParent (Display *dpy, Window child) { Window lastParent = child; Window parent = lastParent, root = None; Window *children; unsigned int nchildren; /* Keep doing XQueryTree until we find a non-root parent */ while (parent != root) { lastParent = parent; XQueryTree (dpy, lastParent, &root, &parent, &children, &nchildren); XFree (children); } return lastParent; } } class CompizXorgSystemShapeHandling : public ct::AutostartCompizXorgSystemTest { public: virtual void SetUp () { ct::AutostartCompizXorgSystemTest::SetUp (); ::Display *dpy = Display (); XSelectInput (dpy, DefaultRootWindow (dpy), SubstructureNotifyMask | PropertyChangeMask); XShapeQueryExtension (dpy, &shapeBase, &shapeError); shapeEvent = shapeBase + ShapeNotify; w = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w, MapNotify, -1, -1))); /* Now that we've received the ReparentNotify, find the toplevel parent */ parent = FindTopLevelParent (dpy, w); /* Select for ShapeNotify on the parent window */ XShapeSelectInput (dpy, parent, ShapeNotifyMask); } int shapeBase; int shapeError; int shapeEvent; Window w; Window parent; }; TEST_F (CompizXorgSystemShapeHandling, TestParentInputShapeSet) { ::Display *dpy = Display (); /* Change the input shape on the child window to None */ XShapeCombineRectangles (dpy, w, ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); ct::ShapeNotifyXEventMatcher matcher (ShapeInput, 0, 0, 0, 0, True); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, parent, shapeEvent, -1, 0, matcher))); /* Query Input Shape - should be no rectangles */ int n, ordering; ASSERT_THAT (XShapeGetRectangles (dpy, parent, ShapeInput, &n, &ordering), IsNull ()); EXPECT_EQ (0, n); /* Query Bounding Shape - should be one rectangle */ XRectangle *rects = XShapeGetRectangles (dpy, parent, ShapeBounding, &n, &ordering); ASSERT_THAT (rects, NotNull ()); ASSERT_EQ (1, n); EXPECT_EQ (ct::WINDOW_X, rects->x); EXPECT_EQ (ct::WINDOW_Y, rects->y); EXPECT_EQ (ct::WINDOW_WIDTH, rects->width); EXPECT_EQ (ct::WINDOW_HEIGHT, rects->height); } TEST_F (CompizXorgSystemShapeHandling, TestParentBoundingShapeSet) { ::Display *dpy = Display (); /* Change the input shape on the child window to None */ XShapeCombineRectangles (dpy, w, ShapeBounding, 0, 0, NULL, 0, ShapeSet, 0); ct::ShapeNotifyXEventMatcher matcher (ShapeBounding, 0, 0, 0, 0, True); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, parent, shapeEvent, -1, 0, matcher))); /* Query Bounding Shape - should be no rectangles */ int n, ordering; ASSERT_THAT (XShapeGetRectangles (dpy, parent, ShapeBounding, &n, &ordering), IsNull ()); EXPECT_EQ (0, n); /* Query Input Shape - should be one rectangle */ XRectangle *rects = XShapeGetRectangles (dpy, parent, ShapeInput, &n, &ordering); ASSERT_THAT (rects, NotNull ()); ASSERT_EQ (1, n); EXPECT_EQ (ct::WINDOW_X, rects->x); EXPECT_EQ (ct::WINDOW_Y, rects->y); EXPECT_EQ (ct::WINDOW_WIDTH, rects->width); EXPECT_EQ (ct::WINDOW_HEIGHT, rects->height); } compiz-0.9.11+14.04.20140409/tests/system/xorg-gtest/tests/compiz_xorg_gtest_ewmh.cpp0000644000015301777760000000720312321343002030721 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest, EWMH compliance * * Copyright (C) 2013 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using ::testing::MatchResultListener; using ::testing::MakeMatcher; using ::testing::Matcher; namespace ct = compiz::testing; namespace { unsigned int DEFAULT_VIEWPORT_WIDTH = 4; unsigned int DEFAULT_VIEWPORT_HEIGHT = 1; bool Advance (Display *d, bool r) { return ct::AdvanceToNextEventOnSuccess (d, r); } } class CompizXorgSystemEWMH : public ct::CompizXorgSystemTest { public: virtual void SetUp () { ct::CompizXorgSystemTest::SetUp (); ::Display *dpy = Display (); XSelectInput (dpy, DefaultRootWindow (dpy), PropertyChangeMask); Window wDummy; unsigned int uiDummy; int iDummy; ASSERT_TRUE (XGetGeometry (dpy, DefaultRootWindow (dpy), &wDummy, &iDummy, &iDummy, &screenWidth, &screenHeight, &uiDummy, &uiDummy)); } unsigned int screenWidth; unsigned int screenHeight; private: }; TEST_F (CompizXorgSystemEWMH, InitialViewportGeometry) { ::Display *dpy = Display (); StartCompiz (static_cast ( ct::CompizProcess::ReplaceCurrentWM), ct::CompizProcess::PluginList ()); ct::PropertyNotifyXEventMatcher desktopHintsProperty (dpy, "_NET_DESKTOP_GEOMETRY"); /* Assert that we get the property update */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, desktopHintsProperty))); unsigned int expectedDefaultWidth = screenWidth * DEFAULT_VIEWPORT_WIDTH; unsigned int expectedDefaultHeight = screenHeight * DEFAULT_VIEWPORT_HEIGHT; Atom actualType; int actualFmt; unsigned long nItems, bytesAfter; unsigned char *property; ASSERT_EQ (Success, XGetWindowProperty (dpy, DefaultRootWindow (dpy), XInternAtom (dpy, "_NET_DESKTOP_GEOMETRY", False), 0L, 8L, False, XA_CARDINAL, &actualType, &actualFmt, &nItems, &bytesAfter, &property)); ASSERT_EQ (XA_CARDINAL, actualType); ASSERT_EQ (32, actualFmt); ASSERT_EQ (2, nItems); unsigned long *geometry = reinterpret_cast (property); EXPECT_EQ (expectedDefaultWidth, geometry[0]); EXPECT_EQ (expectedDefaultHeight, geometry[1]); if (property) XFree (property); } compiz-0.9.11+14.04.20140409/tests/system/xorg-gtest/tests/compiz_xorg_gtest_configure_window.cpp0000644000015301777760000005051512321343002033335 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest, ConfigureWindow handling * * Copyright (C) 2012 Sam Spilsbury (smspillaz@gmail.com) * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include using ::testing::MatchResultListener; using ::testing::MakeMatcher; using ::testing::Matcher; using ::testing::_; using ::compiz::testing::HasGeometry; using ::compiz::testing::RelativeWindowGeometry; using ::compiz::testing::AbsoluteWindowGeometry; namespace ct = compiz::testing; namespace { bool Advance (Display *d, bool r) { return ct::AdvanceToNextEventOnSuccess (d, r); } Window GetTopParent (Display *display, Window w) { return ct::GetTopmostNonRootParent (display, w); } bool QueryGeometry (Display *dpy, Window w, int &x, int &y, unsigned int &width, unsigned int &height) { Window rootRet; unsigned int depth, border; if (!XGetGeometry (dpy, w, &rootRet, &x, &y, &width, &height, &depth, &border)) return false; return true; } bool WaitForReparentAndMap (Display *dpy, Window w) { bool ret = Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w, ReparentNotify, -1, -1)); EXPECT_TRUE (ret); if (!ret) return false; ret = Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w, MapNotify, -1, -1)); EXPECT_TRUE (ret); if (!ret) return false; return true; } struct ReparentedWindow { Window client; Window frame; }; typedef boost::function CreateWaitFunc; ReparentedWindow GetNewWindowAndFrame (Display *dpy, const CreateWaitFunc &waitForCreation) { ReparentedWindow w; w.client = ct::CreateNormalWindow (dpy); waitForCreation (w.client); XMapRaised (dpy, w.client); WaitForReparentAndMap (dpy, w.client); w.frame = GetTopParent (dpy, w.client); XSelectInput (dpy, w.frame, StructureNotifyMask); return w; } bool WaitForConfigureNotify (Display *dpy, Window w, int x, int y, int width, int height, int border, Window above, unsigned int mask) { ct::ConfigureNotifyXEventMatcher matcher (above, border, x, y, width, height, mask); return Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, w, ConfigureNotify, -1, -1, matcher)); } } class CompizXorgSystemConfigureWindowTest : public ct::AutostartCompizXorgSystemTestWithTestHelper { public: CompizXorgSystemConfigureWindowTest () : /* See note in the acceptance tests about this */ env ("XORG_GTEST_CHILD_STDOUT", "1") { } void SendConfigureRequest (Window w, int x, int y, int width, int height, int mask); void SendSetFrameExtentsRequest (Window w, int left, int right, int top, int bottom); void SendConfigureLockRequest (Window w, bool lockRequests); bool VerifyConfigureResponse (Window w, int x, int y, int width, int height); bool VerifySetFrameExtentsResponse (Window w, int left, int right, int top, int bottom); /* Helper functions for the Create*WindowOverrideRedirect* tests */ Window GrabAndCreateWindowWithAttrs (::Display *dpy, XSetWindowAttributes &attr); void UngrabSyncAndTestOverride (::Display *dpy, Window w, bool overrideAssert); protected: ReparentedWindow CreateWindow (::Display *); int GetEventMask () const; private: TmpEnv env; }; int CompizXorgSystemConfigureWindowTest::GetEventMask () const { return ct::AutostartCompizXorgSystemTestWithTestHelper::GetEventMask () | SubstructureNotifyMask; } void CompizXorgSystemConfigureWindowTest::SendConfigureRequest (Window w, int x, int y, int width, int height, int mask) { ::Display *dpy = Display (); std::vector data; data.push_back (x); data.push_back (y); data.push_back (width); data.push_back (height); data.push_back (mask); ct::SendClientMessage (dpy, FetchAtom (ct::messages::TEST_HELPER_CONFIGURE_WINDOW), DefaultRootWindow (dpy), w, data); } void CompizXorgSystemConfigureWindowTest::SendSetFrameExtentsRequest (Window w, int left, int right, int top, int bottom) { ::Display *dpy = Display (); std::vector data; data.push_back (left); data.push_back (right); data.push_back (top); data.push_back (bottom); ct::SendClientMessage (dpy, FetchAtom (ct::messages::TEST_HELPER_CHANGE_FRAME_EXTENTS), DefaultRootWindow (dpy), w, data); } void CompizXorgSystemConfigureWindowTest::SendConfigureLockRequest (Window w, bool lockRequests) { ::Display *dpy = Display (); std::vector data; data.push_back (lockRequests); ct::SendClientMessage (dpy, FetchAtom (ct::messages::TEST_HELPER_LOCK_CONFIGURE_REQUESTS), DefaultRootWindow (dpy), w, data); } bool CompizXorgSystemConfigureWindowTest::VerifyConfigureResponse (Window w, int x, int y, int width, int height) { ::Display *dpy = Display (); XEvent event; while (ct::ReceiveMessage (dpy, FetchAtom (ct::messages::TEST_HELPER_WINDOW_CONFIGURE_PROCESSED), event)) { bool requestAcknowledged = x == event.xclient.data.l[0] && y == event.xclient.data.l[1] && width == event.xclient.data.l[2] && height == event.xclient.data.l[3]; if (requestAcknowledged) return true; } return false; } bool CompizXorgSystemConfigureWindowTest::VerifySetFrameExtentsResponse (Window w, int left, int right, int top, int bottom) { ::Display *dpy = Display (); XEvent event; while (ct::ReceiveMessage (dpy, FetchAtom (ct::messages::TEST_HELPER_FRAME_EXTENTS_CHANGED), event)) { bool requestAcknowledged = left == event.xclient.data.l[0] && right == event.xclient.data.l[1] && top == event.xclient.data.l[2] && bottom == event.xclient.data.l[3]; if (requestAcknowledged) return true; } return false; } ReparentedWindow CompizXorgSystemConfigureWindowTest::CreateWindow (::Display *dpy) { return GetNewWindowAndFrame (dpy, boost::bind (&CompizXorgSystemConfigureWindowTest::WaitForWindowCreation, this, _1)); } TEST_F (CompizXorgSystemConfigureWindowTest, ConfigureAndReponseUnlocked) { ::Display *dpy = Display (); int x = 1; int y = 1; int width = 100; int height = 200; int mask = CWX | CWY | CWWidth | CWHeight; ReparentedWindow w = CreateWindow (dpy); SendConfigureRequest (w.client, x, y, width, height, mask); /* Wait for a response */ ASSERT_TRUE (VerifyConfigureResponse (w.client, x, y, width, height)); /* Query the window size again */ ASSERT_THAT (w.frame, HasGeometry (dpy, RelativeWindowGeometry, x, y, width, height, _)); } TEST_F (CompizXorgSystemConfigureWindowTest, FrameExtentsAndReponseUnlocked) { ::Display *dpy = Display (); int left = 1; int right = 2; int top = 3; int bottom = 4; ReparentedWindow w = CreateWindow (dpy); int x, y; unsigned int width, height; ASSERT_TRUE (QueryGeometry (dpy, w.client, x, y, width, height)); SendSetFrameExtentsRequest (w.client, left, right, top, bottom); /* Wait for a response */ ASSERT_TRUE (VerifySetFrameExtentsResponse (w.client, left, right, top, bottom)); /* Client geometry is always unchanged */ ASSERT_THAT (w.client, HasGeometry (dpy, RelativeWindowGeometry, x, y, width, height, _)); /* Frame geometry is frame geometry offset by extents */ x -= left; y -= top; width += left + right; height += top + bottom; ASSERT_THAT (w.frame, HasGeometry (dpy, RelativeWindowGeometry, x, y, width, height, _)); } TEST_F (CompizXorgSystemConfigureWindowTest, MoveFrameLocked) { ::Display *dpy = Display (); int x = 1; int y = 1; int width = 0; int height = 0; int mask = CWX | CWY; ReparentedWindow w = CreateWindow (dpy); int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, w.frame, currentX, currentY, currentWidth, currentHeight)); SendConfigureLockRequest (w.client, true); SendConfigureRequest (w.client, x, y, width, height, mask); /* Wait for a response */ ASSERT_TRUE (VerifyConfigureResponse (w.client, x, y, width, height)); /* Query the window size again - it should be the same */ ASSERT_THAT (w.frame, HasGeometry (dpy, RelativeWindowGeometry, currentX, currentY, currentWidth, currentHeight, _)); SendConfigureLockRequest (w.client, false); /* Expect buffer to be released */ ASSERT_TRUE (WaitForConfigureNotify (dpy, w.frame, x, y, 0, 0, 0, 0, mask)); } TEST_F (CompizXorgSystemConfigureWindowTest, ResizeFrameLocked) { ::Display *dpy = Display (); int x = 0; int y = 0; int width = 200; int height = 300; int mask = CWWidth | CWHeight; ReparentedWindow w = CreateWindow (dpy); int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, w.frame, currentX, currentY, currentWidth, currentHeight)); SendConfigureLockRequest (w.client, true); SendConfigureRequest (w.client, x, y, width, height, mask); /* Expect buffer to be released immediately */ ASSERT_TRUE (WaitForConfigureNotify (dpy, w.frame, 0, 0, width, height, 0, 0, mask)); /* Wait for a response */ ASSERT_TRUE (VerifyConfigureResponse (w.client, x, y, width, height)); SendConfigureLockRequest (w.client, false); /* Query the window size again - it should be the same */ ASSERT_THAT (w.frame, HasGeometry (dpy, RelativeWindowGeometry, currentX, currentY, width, height, _)); } TEST_F (CompizXorgSystemConfigureWindowTest, SetFrameExtentsLocked) { ::Display *dpy = Display (); /* Give the client window a 1px border, this will cause * the client to move within the frame window by 1, 1 , * the frame window to move by -1, -1 and resize by 2, 2 */ int left = 1; int right = 1; int top = 1; int bottom = 1; int frameMask = CWX | CWY | CWWidth | CWHeight; ReparentedWindow w = CreateWindow (dpy); int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, w.frame, currentX, currentY, currentWidth, currentHeight)); SendConfigureLockRequest (w.client, true); SendSetFrameExtentsRequest (w.client, left, right, top, bottom); /* Expect buffer to be released immediately */ ASSERT_TRUE (WaitForConfigureNotify (dpy, w.frame, currentX - left, currentY - top, currentWidth + (left + right), currentHeight + (top + bottom), 0, 0, frameMask)); /* Wait for a response */ ASSERT_TRUE (VerifySetFrameExtentsResponse (w.client, left, right, top, bottom)); SendConfigureLockRequest (w.client, false); /* Query the window size again - it should be the same */ ASSERT_THAT (w.frame, HasGeometry (dpy, RelativeWindowGeometry, currentX - left, currentY - top, currentWidth + (left + right), currentHeight + (top + bottom), _)); } /* Check that changing the frame extents by one on each side * adjusts the wrapper window appropriately */ TEST_F (CompizXorgSystemConfigureWindowTest, SetFrameExtentsAdjWrapperWindow) { ::Display *dpy = Display (); ReparentedWindow w = CreateWindow (dpy); int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, w.frame, currentX, currentY, currentWidth, currentHeight)); /* Set frame extents and get a response */ int left = 1; int right = 1; int top = 1; int bottom = 1; SendSetFrameExtentsRequest (w.client, left, right, top, bottom); ASSERT_TRUE (VerifySetFrameExtentsResponse (w.client, left, right, top, bottom)); /* Wrapper geometry is extents.xy, size.wh */ Window root; Window wrapper = ct::GetImmediateParent (dpy, w.client, root); ASSERT_THAT (wrapper, HasGeometry (dpy, RelativeWindowGeometry, left, top, currentWidth, currentHeight, _)); } TEST_F (CompizXorgSystemConfigureWindowTest, SetFrameExtentsUnmapped) { ::Display *dpy = Display (); Window client = ct::CreateNormalWindow (dpy); WaitForWindowCreation (client); /* Set frame extents and get a response */ int left = 1; int right = 1; int top = 1; int bottom = 1; int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, client, currentX, currentY, currentWidth, currentHeight)); /* We should get a response with our frame extents but it shouldn't actually * do anything to the client as it is unmapped */ SendSetFrameExtentsRequest (client, left, right, top, bottom); ASSERT_TRUE (VerifySetFrameExtentsResponse (client, left, right, top, bottom)); ASSERT_THAT (client, HasGeometry (dpy, RelativeWindowGeometry, currentX, currentY, currentWidth, currentHeight, _)); } TEST_F (CompizXorgSystemConfigureWindowTest, SetFrameExtentsCorrectMapBehaviour) { ::Display *dpy = Display (); Window client = ct::CreateNormalWindow (dpy); WaitForWindowCreation (client); /* Set frame extents and get a response */ int left = 1; int right = 1; int top = 1; int bottom = 1; int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, client, currentX, currentY, currentWidth, currentHeight)); SendSetFrameExtentsRequest (client, left, right, top, bottom); ASSERT_TRUE (VerifySetFrameExtentsResponse (client, left, right, top, bottom)); /* Map the window */ XMapRaised (dpy, client); WaitForReparentAndMap (dpy, client); /* Check the geometry of the frame */ Window frame = GetTopParent (dpy, client); ASSERT_THAT (frame, HasGeometry (dpy, RelativeWindowGeometry, currentX - left, currentY - top, currentWidth + (left + right), currentHeight + (top + bottom), _)); /* Wrapper geometry is extents.xy, size.wh */ Window root; Window wrapper = ct::GetImmediateParent (dpy, client, root); ASSERT_THAT (wrapper, HasGeometry (dpy, RelativeWindowGeometry, left, top, currentWidth, currentHeight, _)); } TEST_F (CompizXorgSystemConfigureWindowTest, SetFrameExtentsConsistentBehaviourAfterMap) { ::Display *dpy = Display (); Window client = ct::CreateNormalWindow (dpy); WaitForWindowCreation (client); /* Set frame extents and get a response */ int left = 1; int right = 1; int top = 1; int bottom = 1; int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, client, currentX, currentY, currentWidth, currentHeight)); SendSetFrameExtentsRequest (client, left, right, top, bottom); ASSERT_TRUE (VerifySetFrameExtentsResponse (client, left, right, top, bottom)); /* Map the window */ XMapRaised (dpy, client); WaitForReparentAndMap (dpy, client); /* Send it another frame extents request */ right = right + 1; bottom = bottom + 1; SendSetFrameExtentsRequest (client, left, right, top, bottom); ASSERT_TRUE (VerifySetFrameExtentsResponse (client, left, right, top, bottom)); /* Check the geometry of the frame */ Window frame = GetTopParent (dpy, client); ASSERT_THAT (frame, HasGeometry (dpy, RelativeWindowGeometry, currentX - left, currentY - top, currentWidth + (left + right), currentHeight + (top + bottom), _)); /* Wrapper geometry is extents.xy, size.wh */ Window root; Window wrapper = ct::GetImmediateParent (dpy, client, root); ASSERT_THAT (wrapper, HasGeometry (dpy, RelativeWindowGeometry, left, top, currentWidth, currentHeight, _)); } Window CompizXorgSystemConfigureWindowTest::GrabAndCreateWindowWithAttrs (::Display *dpy, XSetWindowAttributes &attr) { /* NOTE: We need to ungrab the server after this function */ XGrabServer (dpy); /* Create a window with our custom attributes */ return XCreateWindow (dpy, DefaultRootWindow (dpy), 0, 0, 100, 100, 0, CopyFromParent, InputOutput, CopyFromParent, CWOverrideRedirect, &attr); } void CompizXorgSystemConfigureWindowTest::UngrabSyncAndTestOverride (::Display *dpy, Window w, bool overrideAssert) { XSync (dpy, false); XUngrabServer (dpy); XSync (dpy, false); /* Check if the created window had the attributes passed correctly */ std::vector data = WaitForWindowCreation (w); EXPECT_EQ (overrideAssert, IsOverrideRedirect (data)); } TEST_F (CompizXorgSystemConfigureWindowTest, CreateDestroyWindowOverrideRedirectTrue) { ::Display *dpy = Display (); XSetWindowAttributes attr; attr.override_redirect = 1; Window w = GrabAndCreateWindowWithAttrs (dpy, attr); XDestroyWindow (dpy, w); UngrabSyncAndTestOverride (dpy, w, true); } TEST_F (CompizXorgSystemConfigureWindowTest, CreateDestroyWindowOverrideRedirectFalse) { ::Display *dpy = Display (); XSetWindowAttributes attr; attr.override_redirect = 0; Window w = GrabAndCreateWindowWithAttrs (dpy, attr); XDestroyWindow (dpy, w); UngrabSyncAndTestOverride (dpy, w, false); } TEST_F (CompizXorgSystemConfigureWindowTest, CreateChangeWindowOverrideRedirectTrue) { ::Display *dpy = Display (); XSetWindowAttributes attr; attr.override_redirect = 0; Window w = GrabAndCreateWindowWithAttrs (dpy, attr); attr.override_redirect = 1; XChangeWindowAttributes (dpy, w, CWOverrideRedirect, &attr); UngrabSyncAndTestOverride (dpy, w, true); XDestroyWindow (dpy, w); } TEST_F (CompizXorgSystemConfigureWindowTest, CreateChangeWindowOverrideRedirectFalse) { ::Display *dpy = Display (); XSetWindowAttributes attr; attr.override_redirect = 1; Window w = GrabAndCreateWindowWithAttrs (dpy, attr); attr.override_redirect = 0; XChangeWindowAttributes (dpy, w, CWOverrideRedirect, &attr); UngrabSyncAndTestOverride (dpy, w, false); XDestroyWindow (dpy, w); } compiz-0.9.11+14.04.20140409/tests/system/xorg-gtest/tests/CMakeLists.txt0000644000015301777760000000461112321343002026167 0ustar pbusernogroup00000000000000pkg_check_modules (X11_XI x11 xi xext) if (BUILD_XORG_GTEST AND X11_XI_FOUND) include_directories (${compiz_SOURCE_DIR}/tests/shared ${COMPIZ_XORG_SYSTEM_TEST_INCLUDE_DIR} ${X11_INCLUDE_DIRS} ${XORG_SERVER_INCLUDE_XORG_GTEST} ${XORG_SERVER_GTEST_SRC} ${GTEST_INCLUDE_DIRS} ${COMPIZ_XORG_GTEST_COMMUNICATOR_INCLUDE_DIR}) link_directories (${X11_XI_LIBRARY_DIRS} ${compiz_BINARY_DIR}/tests/shared/src) add_executable (compiz_xorg_gtest_test_window_stacking ${CMAKE_CURRENT_SOURCE_DIR}/compiz_xorg_gtest_test_window_stacking.cpp) add_executable (compiz_xorg_gtest_test_configure_window ${CMAKE_CURRENT_SOURCE_DIR}/compiz_xorg_gtest_configure_window.cpp) add_executable (compiz_xorg_gtest_test_icccm ${CMAKE_CURRENT_SOURCE_DIR}/compiz_xorg_gtest_icccm.cpp) add_executable (compiz_xorg_gtest_test_ewmh ${CMAKE_CURRENT_SOURCE_DIR}/compiz_xorg_gtest_ewmh.cpp) add_executable (compiz_xorg_gtest_test_shape_handling ${CMAKE_CURRENT_SOURCE_DIR}/compiz_xorg_gtest_test_shape_handling.cpp) set (COMPIZ_XORG_GTEST_LIBRARIES compiz_xorg_gtest_system_test xorg_gtest_all compiz_xorg_gtest_main ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_LIBRARIES} ${X11_XI_LIBRARIES}) target_link_libraries (compiz_xorg_gtest_test_window_stacking ${COMPIZ_XORG_GTEST_LIBRARIES}) compiz_discover_tests (compiz_xorg_gtest_test_window_stacking WITH_XORG_GTEST) target_link_libraries (compiz_xorg_gtest_test_icccm compiz_gtest_shared_async_task ${COMPIZ_XORG_GTEST_LIBRARIES}) compiz_discover_tests (compiz_xorg_gtest_test_icccm WITH_XORG_GTEST) target_link_libraries (compiz_xorg_gtest_test_ewmh ${COMPIZ_XORG_GTEST_LIBRARIES}) compiz_discover_tests (compiz_xorg_gtest_test_ewmh WITH_XORG_GTEST) target_link_libraries (compiz_xorg_gtest_test_shape_handling ${COMPIZ_XORG_GTEST_LIBRARIES}) compiz_discover_tests (compiz_xorg_gtest_test_shape_handling WITH_XORG_GTEST) target_link_libraries (compiz_xorg_gtest_test_configure_window ${COMPIZ_XORG_GTEST_LIBRARIES}) add_dependencies (compiz_xorg_gtest_test_configure_window testhelper) compiz_discover_tests (compiz_xorg_gtest_test_configure_window WITH_XORG_GTEST) endif (BUILD_XORG_GTEST AND X11_XI_FOUND) compiz-0.9.11+14.04.20140409/tests/system/xorg-gtest/CMakeLists.txt0000644000015301777760000000011612321343002025021 0ustar pbusernogroup00000000000000if (BUILD_XORG_GTEST) add_subdirectory (tests) endif (BUILD_XORG_GTEST) compiz-0.9.11+14.04.20140409/tests/system/untest/0000755000015301777760000000000012321344021021504 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/system/untest/untest.c0000644000015301777760000002422612321343002023176 0ustar pbusernogroup00000000000000/* * Unredirect Fullscreen Windows Stress Tester * * Copyright (C) 2012 Canonical Ltd. * Author: Daniel van Vugt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #define SECONDS 1000 #define MINUTES 60000 #define FPS 30 #define CYCLE_PERIOD 2 /* seconds */ #define FULLSCREEN_PERIOD (3 * SECONDS) #define DIALOG_PERIOD (7 * SECONDS) #define PADDING 20 #define RED {0, 0xffff, 0x0000, 0x0000} #define YELLOW {0, 0xffff, 0xffff, 0x0000} #define GREEN {0, 0x0000, 0xffff, 0x0000} #define CYAN {0, 0x0000, 0xffff, 0xffff} #define BLUE {0, 0x0000, 0x0000, 0xffff} #define MAGENTA {0, 0xffff, 0x0000, 0xffff} static const char *app_title = "Unredirect Fullscreen Windows Stress Tester"; static const char *copyright = "Copyright (c) 2012 Canonical Ltd."; static gint test_duration = 120; /* seconds */ static guint64 start_time = 0; static GLXWindow glxwin = None; static GtkButton *button; static void blend (guint16 scale, const GdkColor *a, const GdkColor *b, GdkColor *c) { unsigned long src = 0xffff - scale; unsigned long dest = scale; c->pixel = 0; c->red = (guint16)((src * a->red + dest * b->red) / 0xffff); c->green = (guint16)((src * a->green + dest * b->green) / 0xffff); c->blue = (guint16)((src * a->blue + dest * b->blue) / 0xffff); } static gboolean cycle_color (gpointer data) { static const GdkColor color_stop[] = {RED, YELLOW, GREEN, CYAN, BLUE, MAGENTA}; static const int color_stops = sizeof(color_stop)/sizeof(color_stop[0]); static guint16 pos = 0; guint16 scale; GtkWindow *win = GTK_WINDOW (data); int from, to; GdkColor color; pos = (pos + 0xffff / (FPS * CYCLE_PERIOD)) & 0xffff; from = (pos * color_stops) >> 16; to = (from + 1) % color_stops; scale = (pos * color_stops) & 0xffff; blend (scale, color_stop+from, color_stop+to, &color); if (glxwin == None) { gtk_widget_modify_bg (GTK_WIDGET (win), GTK_STATE_NORMAL, &color); } else { glClearColor (color.red / 65535.0f, color.green / 65535.0f, color.blue / 65535.0f, 1.0); glClear (GL_COLOR_BUFFER_BIT); glFinish (); } return TRUE; } static gboolean on_redraw (GtkWidget *widget, void *cr, gpointer data) { GtkProgressBar *b = GTK_PROGRESS_BAR (data); guint64 elapsed = g_get_real_time () - start_time; gtk_progress_bar_set_fraction (b, (float)elapsed / (1000000 * test_duration)); g_print ("\r%d%% ", (int)(elapsed / (10000 * test_duration))); return FALSE; } static gboolean toggle_fullscreen (gpointer data) { static gboolean is_fullscreen = FALSE; GtkWindow *w = GTK_WINDOW (data); is_fullscreen = !is_fullscreen; if (is_fullscreen) gtk_window_fullscreen (w); else gtk_window_unfullscreen (w); return TRUE; } static gboolean toggle_dialog (gpointer data) { static gboolean visible = FALSE; GtkWindow *dialog = GTK_WINDOW (data); visible = !visible; gtk_widget_set_visible (GTK_WIDGET (dialog), visible); return TRUE; } static void close_window (GtkWidget *widget, gpointer user_data) { gtk_main_quit (); g_print ("\rYou're a quitter. No test results for you.\n"); } static gboolean end_test (gpointer data) { gtk_main_quit (); g_print ("\rCongratulations! Nothing crashed.\n"); return FALSE; } static gboolean init_opengl (GtkWindow *win) { gboolean ret = FALSE; static const int attr[] = { GLX_X_RENDERABLE, True, GLX_DOUBLEBUFFER, False, None }; Display *dpy = gdk_x11_get_default_xdisplay (); int screen = gdk_x11_get_default_screen (); int nfb; GLXFBConfig *fb = glXChooseFBConfig (dpy, screen, attr, &nfb); if (fb != NULL && nfb > 0) { GdkWindow *gdkwin = gtk_widget_get_window (GTK_WIDGET (win)); Window xwin = gdk_x11_window_get_xid (gdkwin); glxwin = glXCreateWindow (dpy, fb[0], xwin, NULL); if (glxwin != None) { GLXContext ctx = glXCreateNewContext (dpy, fb[0], GLX_RGBA_TYPE, NULL, True); if (ctx != NULL) { if (glXMakeContextCurrent (dpy, glxwin, glxwin, ctx)) { const char *vendor = (const char*) glGetString (GL_VENDOR); const char *renderer = (const char*) glGetString (GL_RENDERER); const char *version = (const char*) glGetString (GL_VERSION); g_print ("GL Vendor: %s\n" "GL Renderer: %s\n" "GL Version: %s\n" "\n", vendor != NULL ? vendor : "?", renderer != NULL ? renderer : "?", version != NULL ? version : "?"); ret = TRUE; } else { g_warning ("glXMakeContextCurrent failed. " "OpenGL won't be used.\n"); } } } else { g_warning ("glXCreateWindow failed. OpenGL won't be used.\n"); } XFree (fb); } else { g_warning ("glXChooseFBConfig returned nothing. " "OpenGL won't be used.\n"); } return ret; } int main (int argc, char *argv[]) { static gboolean gl_disabled = FALSE; static GOptionEntry custom_options[] = { { "disable-opengl", 'd', 0, G_OPTION_ARG_NONE, &gl_disabled, "Disable OpenGL rendering. Use GTK only.", NULL }, { "test-duration", 't', 0, G_OPTION_ARG_INT, &test_duration, "How long the test lasts (default 120 seconds)", "SECONDS" }, { NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL } }; GtkWindow *win; GtkWindow *dialog; GtkLabel *label; GtkBox *vbox; GtkBox *hbox; GtkAlignment *align; GtkProgressBar *bar; g_print ("%s\n" "%s\n" "\n", app_title, copyright); if (!gtk_init_with_args (&argc, &argv, NULL, custom_options, NULL, NULL)) { g_warning ("Invalid options? Try: %s --help\n", argv[0]); return 1; } win = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)); gtk_window_set_title (win, app_title); gtk_window_set_default_size (win, 300, 300); gtk_window_set_position (win, GTK_WIN_POS_CENTER); gtk_widget_show (GTK_WIDGET (win)); align = GTK_ALIGNMENT (gtk_alignment_new (0.5f, 1.0f, 0.5f, 0.1f)); gtk_container_add (GTK_CONTAINER (win), GTK_WIDGET (align)); gtk_widget_show (GTK_WIDGET (align)); vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, PADDING)); gtk_container_add (GTK_CONTAINER (align), GTK_WIDGET (vbox)); gtk_widget_show (GTK_WIDGET (vbox)); hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, PADDING)); gtk_box_set_homogeneous (hbox, FALSE); gtk_container_add (GTK_CONTAINER (vbox), GTK_WIDGET (hbox)); gtk_widget_show (GTK_WIDGET (hbox)); bar = GTK_PROGRESS_BAR (gtk_progress_bar_new ()); gtk_progress_bar_set_text (bar, NULL); gtk_progress_bar_set_show_text (bar, TRUE); gtk_container_add (GTK_CONTAINER (hbox), GTK_WIDGET (bar)); gtk_box_set_child_packing (hbox, GTK_WIDGET (bar), TRUE, TRUE, 0, GTK_PACK_START); gtk_widget_show (GTK_WIDGET (bar)); button = GTK_BUTTON (gtk_button_new_with_label ("Cancel")); gtk_container_add (GTK_CONTAINER (hbox), GTK_WIDGET (button)); gtk_box_set_child_packing (hbox, GTK_WIDGET (button), FALSE, FALSE, 0, GTK_PACK_END); gtk_widget_show (GTK_WIDGET (button)); dialog = GTK_WINDOW (gtk_window_new (GTK_WINDOW_POPUP)); gtk_window_set_transient_for (dialog, win); gtk_window_set_default_size (dialog, 100, 100); gtk_window_set_position (dialog, GTK_WIN_POS_CENTER); label = GTK_LABEL (gtk_label_new ("Popup!")); gtk_label_set_justify (label, GTK_JUSTIFY_CENTER); gtk_container_add (GTK_CONTAINER (dialog), GTK_WIDGET (label)); gtk_widget_show (GTK_WIDGET (label)); gtk_widget_realize (GTK_WIDGET (win)); if (!gl_disabled) init_opengl (win); /* XXX For now, hide the widgets in OpenGL mode. People will think the flickering is a bug */ if (glxwin) gtk_widget_hide (GTK_WIDGET (align)); g_timeout_add (1000 / FPS, cycle_color, win); g_timeout_add (FULLSCREEN_PERIOD, toggle_fullscreen, win); g_timeout_add (test_duration * SECONDS, end_test, NULL); g_timeout_add (DIALOG_PERIOD, toggle_dialog, dialog); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (close_window), NULL); g_signal_connect (G_OBJECT (win), "draw", G_CALLBACK (on_redraw), bar); g_signal_connect (G_OBJECT (win), "destroy", G_CALLBACK (close_window), NULL); start_time = g_get_real_time (); gtk_main (); return 0; } compiz-0.9.11+14.04.20140409/tests/system/untest/CMakeLists.txt0000644000015301777760000000047212321343002024245 0ustar pbusernogroup00000000000000cmake_minimum_required (VERSION 2.6) include (FindPkgConfig) pkg_check_modules (COMPIZ_UNTEST REQUIRED gtk+-3.0 gl x11) add_executable (untest untest.c) include_directories (${COMPIZ_UNTEST_INCLUDE_DIRS}) link_directories (${COMPIZ_UNTEST_LIBRARY_DIRS}) target_link_libraries (untest ${COMPIZ_UNTEST_LIBRARIES}) compiz-0.9.11+14.04.20140409/tests/system/CMakeLists.txt0000644000015301777760000000012312321343002022714 0ustar pbusernogroup00000000000000add_subdirectory (xorg-gtest) if (NOT USE_GLES) add_subdirectory (untest) endif () compiz-0.9.11+14.04.20140409/tests/migration-scripts/0000755000015301777760000000000012321344021022314 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/migration-scripts/test_migration.py0000755000015301777760000001360312321343002025722 0ustar pbusernogroup00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright (C) 2012 Canonical # # Authors: # Francis 'fginther' Ginther # Åukasz 'sil2100' Zemczak # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; version 3. # # This program is distributed in the hope that it will be useful, but WITHOUTa # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA import sys import unittest from mock import MagicMock, patch from StringIO import StringIO import gconf import glib import os.path import subprocess # Module Under Test (mut) try: mut = __import__("02_migrate_to_gsettings") except (ImportError): sys.exit("Error! 02_migrate_to_gsettings module-under-test not found - perhaps you missed including it in the PYTHONPATH environment variable? Add the migration module directory and re-run the script again.") class MigrateGconfToGsettingsTests(unittest.TestCase): """Test suite for method migrate_gconf_to_gsettings""" def setUp(self): """Redirects stdout so that tests can assert print statements""" self.stdout = sys.stdout self.out = StringIO() sys.stdout = self.out def tearDown(self): """Restores stdout""" sys.stdout = self.stdout # Dump the content that was sent to stdout # print(self.out.getvalue()) def testClientGetDefaultFalse(self): """Test missing gconf client""" gconf.client_get_default = MagicMock(return_value=False) mut.migrate_gconf_to_gsettings() self.assertEqual(self.out.getvalue().strip(), "WARNING: no gconf client found. No transitionning will be done") def testGetSchemaException(self): """Test exception handling for get_schema""" gconf_mock = MagicMock(name="gconf-Mock") gconf.client_get_default = MagicMock(return_value=gconf_mock) gconf_schema_mock = MagicMock(name="gconf.Schema-Mock") gconf_mock.get_schema = MagicMock(return_value=gconf_schema_mock, side_effect=glib.GError) self.assertRaises(glib.GError, mut.migrate_gconf_to_gsettings()) def testGetSchemaNone(self): """Test missing schema""" gconf_mock = MagicMock(name="gconf-Mock") gconf.client_get_default = MagicMock(return_value=gconf_mock) #gconf_schema_mock = MagicMock(name="gconf.Schema-Mock") gconf_mock.get_schema = MagicMock(return_value=False) mut.migrate_gconf_to_gsettings() self.assertEqual(self.out.getvalue().strip(), "No current profile set, no migration needed") def setupGetSchema(self, profile): """Set up mock objects for testing a valid schema""" # gconf.client_get_default gconf_mock = MagicMock(name="gconf-Mock") gconf.client_get_default = MagicMock(return_value=gconf_mock) # client.get_schema gconf_schema_mock = MagicMock(name="gconf.Schema-Mock") gconf_mock.get_schema = MagicMock(return_value=gconf_schema_mock) # current_profile_schema.get_default_value gconf_gconfvalue_mock = MagicMock(name="gconf.Schema.gconfvalue-Mock") gconf_schema_mock.get_default_value = MagicMock(return_value=gconf_gconfvalue_mock) # current_profile_gconfvalue.get_string gconf_gconfvalue_mock.get_string = MagicMock(return_value=profile) # Popen subprocess_mock = MagicMock(name="subprocess-Mock") popen_mock = MagicMock(name="popen-Mock", return_value=subprocess_mock) subprocess.Popen = popen_mock return popen_mock def testGetSchemaUnity(self): """Test the 'unity' schema""" popen_mock = self.setupGetSchema("unity") mut.migrate_gconf_to_gsettings() # 2 files should be converted self.assertEqual(len(popen_mock.call_args_list), 2) self.assertEqual(popen_mock.call_args_list[0][0][0][1], '--file=/usr/lib/compiz/migration/compiz-profile-active-unity.convert') self.assertEqual(popen_mock.call_args_list[1][0][0][1], '--file=/usr/lib/compiz/migration/compiz-profile-Default.convert') def testGetSchemaDefaultConvertPathInvalid(self): """Test the default schema""" popen_mock = self.setupGetSchema("Default") os.path.exists = MagicMock(return_value=False) mut.migrate_gconf_to_gsettings() # 1 file should be converted self.assertEqual(len(popen_mock.call_args_list), 1) self.assertEqual(popen_mock.call_args_list[0][0][0][1], '--file=/usr/lib/compiz/migration/compiz-profile-active-Default.convert') def testGetSchemaDefaultConvertPathValid(self): """Test the default schema with a valid unity convert file""" popen_mock = self.setupGetSchema("Default") exists_mock = MagicMock(return_value=True) os.path.exists = exists_mock mut.migrate_gconf_to_gsettings() self.assertEqual(exists_mock.call_args_list[0][0][0], mut.CONVERT_PATH + 'compiz-profile-unity.convert') # 2 files should be converted self.assertEqual(len(popen_mock.call_args_list), 2) self.assertEqual(popen_mock.call_args_list[0][0][0][1], '--file=/usr/lib/compiz/migration/compiz-profile-active-Default.convert') self.assertEqual(popen_mock.call_args_list[1][0][0][1], '--file=/usr/lib/compiz/migration/compiz-profile-unity.convert') if __name__ == '__main__': unittest.main() compiz-0.9.11+14.04.20140409/tests/manual/0000755000015301777760000000000012321344021020113 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/manual/NVIDIAForceRefreshRate.txt0000644000015301777760000000045412321343002024741 0ustar pbusernogroup00000000000000NVIDIA REFRESH RATE =================== Sam Spilsbury Force Refresh Rate ------------------ Actions #. Open ccsm and turn "Benchmark" on #. Hit Alt-F12 #. Run glxgears #. Benchmark should display roughly under 60 frames per second and not under 50 frames per second compiz-0.9.11+14.04.20140409/tests/manual/plugins/0000755000015301777760000000000012321344021021574 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/manual/plugins/wall.txt0000644000015301777760000000232512321343002023274 0ustar pbusernogroup00000000000000COMPIZ WALL PLUGIN MANUAL TESTS =============================== Sam Spilsbury Edge Flip Pointer ----------------- Setup: #. Enable "Edge Flip Pointer" in the wall plugin and set up screen edges as appropriate Actions: #. Move cursor to relevant screen edge #. Viewport will change to the next one over #. Viewport will not change if that viewport is the last one in the row or column Edge Flip Move -------------- Setup: #. Disable "Edge Flip Pointer" in the wall plugin, enable "Edge Flip Move" in the wall plugin, and set up screen edges as appropriate Actions: #. Grab window by titlebar #. Move cursor to relevant screen edge #. Viewport will change to the next one over while window is grabbed #. Viewport will not change if that viewport is the last one in the row or colum Edge Flip Dnd ------------- Setup: #. Disable "Edge Flip Pointer" in the wall plugin, enable "Edge Flip Dnd" in the wall plugin, and set up screen edges as appropriate Actions: #. Grab a desktop icon #. Move cursor to relevant screen edge #. Viewport will change to the next one over while icon is grabbed #. Viewport will not change if that viewport is the last one in the row or colum compiz-0.9.11+14.04.20140409/tests/manual/plugins/decor.txt0000644000015301777760000000152612321343002023433 0ustar pbusernogroup00000000000000COMPIZ DECOR PLUGIN =================== Sam Spilsbury Static Gravity Handling - no decorations ---------------------------------------- Setup: # Install guake Actions: # Start and launch guake Expected Result: Guake should sit flush with the panels and work area Static Gravity Handling - decorations ------------------------------------- Setup: # Install friends-app Actions: # Start and launch friends-app Expected Result: The QML window should have its decorations visible and be contained in the top left hand corner of the work area _NET_REQUEST_FRAME_EXTENTS handling ----------------------------------- Setup: # Install any sun-awt application - examples: 1. netbeans 2. ecplise Actions: # Run the application Expected Result: The application should not have its contents offset by its decoration size compiz-0.9.11+14.04.20140409/tests/manual/Unredirect.txt0000644000015301777760000000570712321343002022767 0ustar pbusernogroup00000000000000WINDOW UNREDIRECTION TESTS =========================== Daniel van Vugt Browser unredirect with context menus ------------------------------------- Setup: #. Install Chromium or Chrome browser. Actions: #. Open Chrome/Chromium and hit F11 to go full screen. #. Right click on the web page to open a context menu. #. Left click on the web page to close the context menu. #. Right click on the web page to open a context menu. #. Left click on the web page to close the context menu. #. Press F11 to exit from full screen. Expected Result: Every time you right-clicked, the context menu should be visible. Video unredirect with window menu --------------------------------- Setup: #. Install mplayer. #. Get a video file you can play in mplayer. Actions: #. Open the video in mplayer. #. Hit F to go fullscreen. #. Hit Alt+Space to open the window menu. #. Hit Escape to close the window menu. #. Hit Alt+Space to open the window menu. #. Hit Escape to close the window menu. #. Hit Escape to close the video. Expected Result: Every time you hit Alt+Space the window menu should have appeared and the video should still be playing behind it. Video unredirect with transformed screen ---------------------------------------- Setup: #. Install mplayer. #. Get a video file you can play in mplayer. Actions: #. Open the video in mplayer. #. Hit F to go fullscreen. #. Trigger expo mode (Super+E or mouse to top-left corner) #. Leave expo mode (click on the full screen video) #. Trigger expo mode again. #. Leave expo mode (click on the full screen video) #. Hit Escape to close the video. Expected Result: Every time you triggered expo mode, expo mode should have become visible and you should see the video still playing in the expo view. Unredirect cancelation by alpha windows on top (LP: #1046661) ------------------------------------------------------------- Setup: #. Install Chromium or Chrome browser. Actions: #. Open a Chrome/Chromium window. #. Open a gnome-terminal window (Ctrl+Alt+T) #. Move the gnome-terminal to the centre of the screen, above the Chrome window. #. Click on the Chrome window and make it fullscreen (F11). #. Alt+Tab to the gnome-terminal window. Expected Result: The gnome-terminal window should be visible on top. Unredirect cancelation by transformed windows (LP: #1047168) ------------------------------------------------------------- Setup: #. Install Chromium or Chrome browser. #. Run ccsm and ensure the Scale plugin is loaded and "Initiate Window Picker" is bound to Shift+Alt+Up. Actions: #. Open a Chrome/Chromium window. #. Open a gnome-terminal window (Ctrl+Alt+T) #. Move the gnome-terminal to the centre of the screen, above the Chrome window. #. Click on the Chrome window and make it fullscreen (F11). #. Hold Shift+Alt and tap Up to engage scale mode. Keep holding Shift+Alt for a few seconds. Expected Result: Windows get scaled and you can see both the Chrome and Terminal windows. compiz-0.9.11+14.04.20140409/tests/manual/GTKWindowDecoratorResourceUsage.txt0000644000015301777760000000055312321343002027032 0ustar pbusernogroup00000000000000GTK-Window-Decorator Resource Usage =================================== Sam Spilsbury XRestop usage ------------- #. Install xrestop (sudo apt-get install xrestop) #. Run xrestop (eg, $ xrestop &) #. Note the number in the "Wns" column for gtk-window-decorator #. Open a window #. Close that window #. The number should be the same compiz-0.9.11+14.04.20140409/tests/manual/GSettings.txt0000644000015301777760000001654612321343002022575 0ustar pbusernogroup00000000000000BASIC GSETTINGS MANUAL TESTS ============================= Daniel van Vugt NOTE 1: Common setup "Compile compiz and install to ~/staging": (Starting in the compiz source directory) mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX=~/staging make -j2 make install NOTE 2: "Set XDG_DATA_DIRS": All of these tests depend of XDG_DATA_DIRS being defined already, as it is in X. If you're not in X then you can set it with this command: export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/ NOTE 3: "Create a dev profile": All of these tests require a compizconfig profile to exist, called "dev". To make one, edit ~/.config/compiz-1/compizconfig/config and add: [general_dev] backend = gsettings profile = dev integration = true plugin_list_autosort = true NOTE 4: "Delete your old compiz gsettings": dconf reset -f "/apps/compiz-1/" dconf reset -f "/org/freedesktop/compiz/" dconf reset -f "/org/compiz/profiles/dev/" CompizConfig Settings Manager (CCSM) initialization ---------------------------------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. Close CCSM. #. dconf dump /org/compiz/ Expected Result: Some settings are shown by the dconf dump. Correct storage of plugin-list ------------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, tick several different boxes (each one is a plugin) #. Close CCSM. #. Start ccsm again (same as above) Expected Result: All the same boxes are still ticked when CCSM is restarted. Correct storage of enumerations -------------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, OpenGL > Texture Filter = Best #. Close CCSM. #. dconf read /org/compiz/profiles/dev/plugins/opengl/texture-filter Expected Result: The value "2" is output. Correct storage of bools ------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, Composite > Detect Refresh Rate = OFF #. Close CCSM. #. dconf read /org/compiz/profiles/dev/plugins/composite/detect-refresh-rate Expected Result: The value "false" is output. Correct storage of integers ---------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, Composite > Refresh Rate = 100 #. Close CCSM. #. dconf read /org/compiz/profiles/dev/plugins/composite/refresh-rate Expected Result: The value "100" is output. Correct storage of strings --------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, General Options > Default Icon = hello #. Close CCSM. #. dconf read /org/compiz/profiles/dev/plugins/core/default-icon Expected Result: The value 'hello' is output. Loading colour settings ------------------------ Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, enable Composite, OpenGL, Desktop Wall, Window Decoration, Move Window, Resize Window. #. In CCSM, Desktop Wall > Outline Color = RED #. Close CCSM. #. Switch to a VT and log in. #. cd ~/staging #. Set XDG_DATA_DIRS (see NOTE 2 above). #. env DISPLAY=:0 LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev ./bin/compiz --replace ccp #. Switch to X using Ctrl+Alt+F7. #. Switch between viewports using Ctrl+Alt+Left/Right. Expected Result: Windows are decorated, moveable and resizeable. When switching viewports, the switcher preview has a RED border. Real-time plugin unloads ------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, enable Composite, OpenGL, Desktop Wall, Window Decoration, Move Window, Resize Window. #. Close CCSM. #. Switch to a VT and log in. #. cd ~/staging #. Set XDG_DATA_DIRS (see NOTE 2 above). #. env DISPLAY=:0 LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev ./bin/compiz --replace ccp #. Switch to X using Ctrl+Alt+F7. #. Open a window (if none already). e.g. Ctrl+Alt+T and verify its moveable. #. Start ccsm again, as above. #. Untick (disable) "Move Window". Expected Result: Can't move windows any more. Real-time settings changes --------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, enable Composite, OpenGL, Desktop Wall, Window Decoration, Move Window, Resize Window, Expo. #. Close CCSM. #. Switch to a VT and log in. #. cd ~/staging #. Set XDG_DATA_DIRS (see NOTE 2 above). #. env DISPLAY=:0 LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev ./bin/compiz --replace ccp #. Switch to X using Ctrl+Alt+F7. #. Start ccsm again, as above. #. In CCSM, General Options > Horizontal Virtual Size = 10 #. Press Super+E. Expected Result: Verify you can now see 10 workspaces when in expo mode (Super+E). compiz-0.9.11+14.04.20140409/tests/manual/README.txt0000644000015301777760000000053012321343002021605 0ustar pbusernogroup00000000000000Compiz Manual Tests =================== Avoid writing manual tests if you can. Acceptance tests that can be run on an automatic basis are always preferred. If getting some part of the code would be too difficult or invasive, then write a manual test in here so that we can remind ourselves to deploy test frameworks for the code in quesiton. compiz-0.9.11+14.04.20140409/tests/experimental-memcheck/0000755000015301777760000000000012321344021023105 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/experimental-memcheck/compiz.supp0000644000015301777760000004122212321343002025316 0ustar pbusernogroup00000000000000# -*- tab-width: 3; indent-tabs-mode: nil -*- # # GNOME supressions base.supp: # git://github.com/dtrebbien/GNOME.supp.git # Copyright (C) 2012 Daniel Trebbien # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Python supressions valgrind-python.supp: # http://hg.python.org/cpython # Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Python Software Foundation; All Rights Reserved # PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 # -------------------------------------------- # # 1. This LICENSE AGREEMENT is between the Python Software Foundation # ("PSF"), and the Individual or Organization ("Licensee") accessing and # otherwise using this software ("Python") in source or binary form and # its associated documentation. # 2. Subject to the terms and conditions of this License Agreement, PSF hereby # grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, # analyze, test, perform and/or display publicly, prepare derivative works, # distribute, and otherwise use Python alone or in any derivative version, # provided, however, that PSF's License Agreement and PSF's notice of copyright, # i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Python Software Foundation; All Rights Reserved" are retained in Python # alone or in any derivative version prepared by Licensee. # 3. In the event Licensee prepares a derivative work that is based on # or incorporates Python or any part thereof, and wants to make # the derivative work available to others as provided herein, then # Licensee hereby agrees to include in any such work a brief summary of # the changes made to Python. # 4. PSF is making Python available to Licensee on an "AS IS" # basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR # IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND # DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS # FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT # INFRINGE ANY THIRD PARTY RIGHTS. # # 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON # FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS # A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, # OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. # # 6. This License Agreement will automatically terminate upon a material # breach of its terms and conditions. # 7. Nothing in this License Agreement shall be deemed to create any # relationship of agency, partnership, or joint venture between PSF and # Licensee. This License Agreement does not grant permission to use PSF # trademarks or trade name in a trademark sense to endorse or promote # products or services of Licensee, or any third party. # # 8. By copying, installing or otherwise using Python, Licensee # agrees to be bound by the terms and conditions of this License # Agreement. # # All other supressions: # # Copyright © 2012 Canonical Ltd. # # Permission to use, copy, modify, distribute, and sell this software # and its documentation for any purpose is hereby granted without # fee, provided that the above copyright notice appear in all copies # and that both that copyright notice and this permission notice # appear in supporting documentation, and that the name of # Canonical Ltd. not be used in advertising or publicity pertaining to # distribution of the software without specific, written prior permission. # Canonical Ltd. makes no representations about the suitability of this # software for any purpose. It is provided "as is" without express or # implied warranty. # # CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, # INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN # NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS # OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # # Authored by: Sam Spilsbury # / { xmlReadFile leaks a string Memcheck:Leak fun:malloc fun:xmlStrndup ... fun:xmlReadFile } { xmlReadFile leaks an xmlNewCharEncodingHandler Memcheck:Leak fun:malloc fun:xmlNewCharEncodingHandler ... fun:xmlReadFile } { xmInitCharEncodingHandlers leaks Memcheck:Leak fun:*alloc* fun:xmlInitCharEncodingHandlers } { xmlReadFile leaks an xmlNewRMutex Memcheck:Leak fun:malloc fun:xmlNewRMutex ... fun:xmlReadFile } { xmlParseDocument leaks an xmlNewMutex Memcheck:Leak fun:malloc fun:xmlNewMutex ... fun:xmlParseDocument } { dlopen leaks some tokens Memcheck:Leak fun:*alloc* ... fun:dlopen* } { dlclose calls malloc and leaks Memcheck:Leak fun:*alloc* ... fun:dlclose* } { import_submodule Memcheck:Leak fun:*alloc* ... fun:import_*module* } { everything from PyInitialize_Ex Memcheck:Leak fun:*alloc* ... fun:Py_InitializeEx* } { everything from PySys* Memcheck:Leak fun:*alloc* ... fun:PySys* } { everything from PyList Memcheck:Leak fun:*alloc* ... fun:PyList_* } { everything from PyThread Memcheck:Leak fun:*alloc* ... fun:PyThread* } { everything from PyStructSequence Memcheck:Leak fun:*alloc* ... fun:PyStructSequence* } { don't care about protobuf Memcheck:Leak ... fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ } { google::protobuf::protobufAddDesc Memcheck:Leak ... fun:*protobuf*AddDesc* } { don't care about protobuf Memcheck:Leak ... fun:_ZN6google8protobuf8internal10OnShutdownEPFvvE } { g_types are never free'd Memcheck:Leak ... fun:g_type* } { g_settings_class_init intentionally leaks signals Memcheck:Leak fun:*alloc ... fun:g_signal_new ... fun:g_type_class_ref ... fun:g_object_new } { g_list_append calls g_slice_alloc can call g_private_get which seems to leave reachable blocks Memcheck:Leak fun:malloc ... fun:g_private_get fun:g_slice_alloc fun:g_list_append } { g_list_append calls g_mutex_lock which calls malloc Memcheck:Leak fun:malloc ... fun:g_mutex* ... fun:g_slice_alloc fun:g_list_append } # not entirely certain about this { g_list_append calls thread_memory_from_self, but we can't detect it Memcheck:Leak fun:calloc ... fun:g_slice_alloc fun:g_list_append } { g_variant_builder_end calls g_rec_mutex_lock Memcheck:Leak fun:malloc ... fun:g_slice_alloc ... fun:g_rec_mutex_lock fun:g_variant_type_info_get ... fun:g_variant_builder_end } { Memcheck:Cond fun:__GI___strcasecmp_l } { Memcheck:Value8 fun:__GI___strcasecmp_l } { Memcheck:Addr8 fun:__strspn_sse42 } { Memcheck:Cond fun:__strspn_sse42 } { Memcheck:Addr4 fun:FcConfigFileExists } { g_hash_table_insert_node() in ghash.c Memcheck:Leak ... fun:g_memdup fun:g_hash_table_insert_node } { g_hash_table_resize() in ghash.c Memcheck:Leak ... fun:g_hash_table_resize } { Memcheck:Leak ... fun:g_get_application_name } { Memcheck:Leak ... fun:g_get_home_dir } { Memcheck:Leak ... fun:g_get_host_name } { Memcheck:Leak ... fun:g_get_prgname } { Memcheck:Leak ... fun:g_get_real_name } { Memcheck:Leak ... fun:g_get_system_config_dirs } { Memcheck:Leak ... fun:g_get_system_data_dirs } { Memcheck:Leak ... fun:g_get_tmp_dir } { Memcheck:Leak ... fun:g_get_user_cache_dir } { Memcheck:Leak ... fun:g_get_user_config_dir } { Memcheck:Leak ... fun:g_get_user_data_dir } { Memcheck:Leak ... fun:g_get_user_name } { Memcheck:Leak ... fun:g_get_user_runtime_dir } { Memcheck:Leak ... fun:g_get_user_special_dir } { Memcheck:Leak ... fun:g_reload_user_special_dirs_cache } { Memcheck:Leak ... fun:g_set_application_name } { Memcheck:Leak ... fun:g_set_prgname } { Memcheck:Leak ... fun:g_random_double } { Memcheck:Leak ... fun:g_random_double_range } { Memcheck:Leak ... fun:g_random_int } { Memcheck:Leak ... fun:g_random_int_range } { Memcheck:Leak ... fun:g_random_set_seed } { Memcheck:Leak ... fun:g_bus_get fun:g_bus_own_name } { Memcheck:Leak ... fun:g_hash_table_new fun:g_bus_own_name } { Memcheck:Leak ... fun:g_main_context_ref_thread_default fun:g_bus_own_name } { Memcheck:Leak ... fun:g_hash_table_new fun:g_bus_own_name_on_connection } { Memcheck:Leak ... fun:g_variant_new fun:g_bus_unown_name } { _g_dbus_initialize() in gio/gdbusprivate.c Memcheck:Leak ... fun:_g_dbus_initialize } { Memcheck:Leak ... fun:FcConfigSubstitute* fun:pango_cairo_fc_font_map_fontset_key_substitute } { _gtk_accessibility_init() in gail.c Memcheck:Leak ... fun:atk_add_focus_tracker fun:_gtk_accessibility_init } { Memcheck:Leak ... fun:gdk_display_manager_get } { Memcheck:Leak ... fun:gdk_display_manager_get_default_display } { Memcheck:Leak ... fun:gdk_display_get_default } { Memcheck:Leak ... fun:gtk_clipboard_get_for_display } { Memcheck:Leak ... fun:gtk_clipboard_request_contents } { gtk_im_module_initialize() in gtkimmodule.c Memcheck:Leak ... fun:gtk_im_module_initialize } { Memcheck:Leak ... fun:gtk_widget_get_style_context } { g_main_context_default calls malloc Memcheck:Leak fun:*alloc* ... fun:g_main_context_new fun:g_main_context_default } { g_main_context_default calls g_mutex_lock Memcheck:Leak fun:*alloc* ... fun:g_mutex_lock ... fun:g_main_context_default } { g_main_context_default calls g_cond_broadcast Memcheck:Leak fun:*alloc* ... fun:g_cond_broadcast ... fun:g_main_context_default } { g_main_context_default calls g_slist_prepend Memcheck:Leak fun:*alloc* ... fun:g_slist_prepend ... fun:g_main_context_default } { g_get_worker_context calls malloc Memcheck:Leak fun:*alloc* ... fun:g_main_context_new fun:g_get_worker_context } { g_get_worker_context calls g_thread_new Memcheck:Leak fun:*alloc* ... fun:g_thread_new fun:g_get_worker_context } { g_get_worker_context calls g_mutex_lock Memcheck:Leak fun:*alloc* ... fun:g_mutex_lock ... fun:g_get_worker_context } { g_main_context_iterate calls malloc Memcheck:Leak fun:*alloc* ... fun:g_main_context_iterate* } { g_main_loop_run calls malloc Memcheck:Leak fun:*alloc* ... fun:g_main_loop_run* } { g_thread_proxy calls malloc Memcheck:Leak fun:*alloc* ... fun:g_thread_proxy } { g_unix_signal_add_full calls g_mutex_lock which calls malloc Memcheck:Leak fun:*alloc* ... fun:g_mutex_lock ... fun:g_unix_signal_add_full } { Memcheck:Leak ... fun:gtk_source_style_scheme_manager_get_default } { Memcheck:Leak ... fun:gtk_source_style_scheme_get_style } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Addr4 fun:Py_ADDRESS_IN_RANGE } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Value4 fun:Py_ADDRESS_IN_RANGE } { ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64) Memcheck:Value8 fun:Py_ADDRESS_IN_RANGE } { ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value Memcheck:Cond fun:Py_ADDRESS_IN_RANGE } { Suppress leaking the GIL. Happens once per process, see comment in ceval.c. Memcheck:Leak fun:malloc fun:PyThread_allocate_lock fun:PyEval_InitThreads } { Suppress leaking the GIL after a fork. Memcheck:Leak fun:malloc fun:PyThread_allocate_lock fun:PyEval_ReInitThreads } { Suppress leaking the autoTLSkey. This looks like it shouldn't leak though. Memcheck:Leak fun:malloc fun:PyThread_create_key fun:_PyGILState_Init fun:Py_InitializeEx fun:Py_Main } { Hmmm, is this a real leak or like the GIL? Memcheck:Leak fun:malloc fun:PyThread_ReInitTLS } { Handle PyMalloc confusing valgrind (possibly leaked) Memcheck:Leak fun:realloc fun:_PyObject_GC_Resize } { Handle PyMalloc confusing valgrind (possibly leaked) Memcheck:Leak fun:malloc fun:_PyObject_GC_New } { Handle PyMalloc confusing valgrind (possibly leaked) Memcheck:Leak fun:malloc fun:*PyObject*Malloc* } { Handle PyMalloc confusing valgrind (possibly leaked) Memcheck:Leak fun:malloc fun:_PyObject_GC_NewVar } { Dictresize confuses valgrind too Memcheck:Leak ... fun:dictresize* } { PyString can confuse it too Memcheck:Leak ... fun:PyString* } # # Non-python specific leaks # { Handle pthread issue (possibly leaked) Memcheck:Leak fun:calloc fun:allocate_dtv fun:_dl_allocate_tls_storage fun:_dl_allocate_tls } { Handle pthread issue (possibly leaked) Memcheck:Leak fun:memalign fun:_dl_allocate_tls_storage fun:_dl_allocate_tls } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Addr4 fun:PyObject_Free } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Value4 fun:PyObject_Free } { ADDRESS_IN_RANGE/Use of uninitialised value of size 8 Memcheck:Addr8 fun:PyObject_Free } { ADDRESS_IN_RANGE/Use of uninitialised value of size 8 Memcheck:Value8 fun:PyObject_Free } { ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value Memcheck:Cond fun:PyObject_Free } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Addr4 fun:PyObject_Realloc* } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Value4 fun:PyObject_Realloc* } { ADDRESS_IN_RANGE/Use of uninitialised value of size 8 Memcheck:Addr8 fun:PyObject_Realloc* } { ADDRESS_IN_RANGE/Use of uninitialised value of size 8 Memcheck:Value8 fun:PyObject_Realloc* } { ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value Memcheck:Cond fun:PyObject_Realloc* } # Additional suppressions for the unified decimal tests: { test_decimal Memcheck:Addr4 fun:PyUnicodeUCS2_FSConverter } { test_decimal2 Memcheck:Addr4 fun:PyUnicode_FSConverter } compiz-0.9.11+14.04.20140409/tests/CMakeLists.txt0000644000015301777760000000027612321343002021401 0ustar pbusernogroup00000000000000if (COMPIZ_BUILD_TESTING) add_subdirectory (integration) add_subdirectory (system) add_subdirectory (shared) add_subdirectory (acceptance-tests) endif (COMPIZ_BUILD_TESTING) compiz-0.9.11+14.04.20140409/tests/acceptance-tests/0000755000015301777760000000000012321344021022064 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/acceptance-tests/autopilot/0000755000015301777760000000000012321344021024104 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/acceptance-tests/autopilot/CMakeLists.txt0000644000015301777760000000072412321343002026645 0ustar pbusernogroup00000000000000add_executable (compiz_autopilot_acceptance_tests ${CMAKE_CURRENT_SOURCE_DIR}/compiz_autopilot_acceptance_tests.cpp) set (COMPIZ_AUTOPILOT_ACCEPTANCE_TEST_LIBRARIES ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (compiz_autopilot_acceptance_tests ${COMPIZ_AUTOPILOT_ACCEPTANCE_TEST_LIBRARIES}) install (TARGETS compiz_autopilot_acceptance_tests RUNTIME DESTINATION ${exec_prefix}) compiz-0.9.11+14.04.20140409/tests/acceptance-tests/autopilot/compiz_autopilot_acceptance_tests.cpp0000644000015301777760000004003212321343002033576 0ustar pbusernogroup00000000000000/* * Compiz Autopilot GTest Acceptance Tests * * Copyright (C) 2013 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include using ::testing::ValuesIn; using ::testing::WithParamInterface; namespace { class Pipe : boost::noncopyable { public: Pipe () { if (pipe2 (mPipe, O_CLOEXEC) == -1) throw std::runtime_error (strerror (errno)); } ~Pipe () { if (mPipe[0] && close (mPipe[0]) == -1) std::cerr << "mPipe[0] " << strerror (errno) << std::endl; if (mPipe[1] && close (mPipe[1]) == -1) std::cerr << "mPipe[0] " << strerror (errno) << std::endl; } /* Read end descriptor is read-only */ int ReadEnd () { return mPipe[0]; } /* Write end descriptor is writable, we need to close it * from other objects */ int & WriteEnd () { return mPipe[1]; } private: int mPipe[2]; }; class FileDescriptorBackup : boost::noncopyable { public: FileDescriptorBackup (int fd) : mOriginalFd (fd), mBackupFd (0) { mBackupFd = dup (mOriginalFd); /* Save original */ if (mBackupFd == -1) throw std::runtime_error (strerror (errno)); } ~FileDescriptorBackup () { /* Redirect backed up fd to old fd location */ if (mBackupFd && dup2 (mBackupFd, mOriginalFd) == -1) std::cerr << "Failed to restore file descriptor " << strerror (errno) << std::endl; } private: int mOriginalFd; int mBackupFd; }; class RedirectedFileDescriptor : boost::noncopyable { public: RedirectedFileDescriptor (int from, int &to) : mFromFd (from), mToFd (to) { /* Make 'to' take the old file descriptor's place */ if (dup2 (to, from) == -1) throw std::runtime_error (strerror (errno)); } ~RedirectedFileDescriptor () { if (mToFd && close (mToFd) == -1) std::cerr << "Failed to close redirect-to file descriptor " << strerror (errno) << std::endl; mToFd = 0; } private: int mFromFd; int &mToFd; }; pid_t launchBinary (const std::string &executable, const char **argv, int &stderrWriteEnd, int &stdoutWriteEnd) { FileDescriptorBackup stderr (STDERR_FILENO); FileDescriptorBackup stdout (STDOUT_FILENO); /* Close the originals once they have been backed up * We have to do this here and not in the FileDescriptorBackup * constructors because of an order-of-operations issue - * namely if we close an original file descriptor name * before duplicating another one, then there's a possibility * that the duplicated other one will get the same name as * the one we just closed, making us unable to restore * the closed one properly */ if (close (STDERR_FILENO) == -1) throw std::runtime_error (strerror (errno)); if (close (STDOUT_FILENO) == -1) throw std::runtime_error (strerror (errno)); /* Replace the current process stderr and stdout with the write end * of the pipes. Now when someone tries to write to stderr or stdout * they'll write to our pipes instead */ RedirectedFileDescriptor pipedStderr (STDERR_FILENO, stderrWriteEnd); RedirectedFileDescriptor pipedStdout (STDOUT_FILENO, stdoutWriteEnd); /* Fork process, child gets a copy of the pipe write ends * - the original pipe write ends will be closed on exec * but the duplicated write ends now taking the place of * stderr and stdout will not be */ pid_t child = fork (); /* Child process */ if (child == 0) { if (execvpe (executable.c_str (), const_cast (argv), environ) == -1) { std::cerr << "execvpe failed with error " << errno << std::endl << " - binary " << executable << std::endl; abort (); } } /* Parent process - error */ else if (child == -1) throw std::runtime_error (strerror (errno)); /* The old file descriptors for the stderr and stdout * are put back in place, and pipe write ends closed * as the child is using them at return */ return child; } int launchBinaryAndWaitForReturn (const std::string &executable, const char **argv, int &stderrWriteEnd, int &stdoutWriteEnd) { int status = 0; pid_t child = launchBinary (executable, argv, stderrWriteEnd, stdoutWriteEnd); do { /* Wait around for the child to get a signal */ pid_t waitChild = waitpid (child, &status, 0); if (waitChild == child) { /* If it died unexpectedly, say so */ if (WIFSIGNALED (status)) { std::stringstream ss; ss << "child killed by signal " << WTERMSIG (status); throw std::runtime_error (ss.str ()); } } else { /* waitpid () failed */ throw std::runtime_error (strerror (errno)); } /* Keep going until it exited */ } while (!WIFEXITED (status) && !WIFSIGNALED (status)); /* Return the exit code */ return WEXITSTATUS (status); } const char *autopilot = "/usr/bin/autopilot"; const char *runOpt = "run"; const char *dashV = "-v"; } class CompizAutopilotAcceptanceTest : public ::testing::Test, public ::testing::WithParamInterface { public: CompizAutopilotAcceptanceTest (); const char ** GetAutopilotArgv (); void PrintChildStderr (); void PrintChildStdout (); protected: std::vector autopilotArgv; Pipe childStdoutPipe; Pipe childStderrPipe; }; CompizAutopilotAcceptanceTest::CompizAutopilotAcceptanceTest () { autopilotArgv.push_back (autopilot); autopilotArgv.push_back (runOpt); autopilotArgv.push_back (dashV); autopilotArgv.push_back (GetParam ()); autopilotArgv.push_back (NULL); } const char ** CompizAutopilotAcceptanceTest::GetAutopilotArgv () { return &autopilotArgv[0]; } namespace { std::string FdToString (int fd) { std::string output; int bufferSize = 4096; char buffer[bufferSize]; ssize_t count = 0; do { struct pollfd pfd; pfd.events = POLLIN | POLLERR | POLLHUP; pfd.revents = 0; pfd.fd = fd; /* Check for 10ms if there's anything waiting to be read */ int nfds = poll (&pfd, 1, 10); if (nfds == -1) throw std::runtime_error (strerror (errno)); if (nfds) { /* Read as much as we have allocated for */ count = read (fd, (void *) buffer, bufferSize - 1); /* Something failed, bail */ if (count == -1) throw std::runtime_error (strerror (errno)); /* Always null-terminate */ buffer[count] = '\0'; /* Add it to the output */ output += buffer; } else { /* There's nothing on the pipe, assume EOF */ count = 0; } /* Keep going until there's nothing left */ } while (count != 0); return output; } } void CompizAutopilotAcceptanceTest::PrintChildStderr () { std::string output = FdToString (childStderrPipe.ReadEnd ()); std::cout << "[== TEST ERRORS ==]" << std::endl << output << std::endl; } void CompizAutopilotAcceptanceTest::PrintChildStdout () { std::string output = FdToString (childStdoutPipe.ReadEnd ()); std::cout << "[== TEST MESSAGES ==]" << std::endl << output << std::endl; } TEST_P (CompizAutopilotAcceptanceTest, AutopilotTest) { std::string scopedTraceMsg ("Running Autopilot Test"); scopedTraceMsg += GetParam (); int status = launchBinaryAndWaitForReturn (std::string (autopilot), GetAutopilotArgv (), childStderrPipe.WriteEnd (), childStdoutPipe.WriteEnd ()); EXPECT_EQ (status, 0) << "expected exit status of 0"; if (status) { PrintChildStdout (); PrintChildStderr (); } else { /* Extra space here to align with gtest output */ std::cout << "[AUTOPILOT ] Pass test " << GetParam () << std::endl; } } namespace { const char *AutopilotTests[] = { "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_clicking_icon_twice_initiates_spread", "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_expo_launcher_icon_initiates_expo", "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_expo_launcher_icon_terminates_expo", "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_launcher_activate_last_focused_window", "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_unminimize_initially_minimized_windows", "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_unminimize_minimized_immediately_after_show_windows", "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_while_in_scale_mode_the_dash_will_still_open", "unity.tests.test_dash.DashRevealWithSpreadTests.test_command_lens_opens_when_in_spread", "unity.tests.test_dash.DashRevealWithSpreadTests.test_dash_closes_on_spread", "unity.tests.test_dash.DashRevealWithSpreadTests.test_dash_opens_when_in_spread", "unity.tests.test_dash.DashRevealWithSpreadTests.test_lens_opens_when_in_spread", "unity.tests.test_hud.HudBehaviorTests.test_alt_arrow_keys_not_eaten", "unity.tests.test_panel.PanelCrossMonitorsTests.test_panel_title_updates_moving_window", "unity.tests.test_panel.PanelCrossMonitorsTests.test_window_buttons_close_inactive_when_clicked_in_another_monitor", "unity.tests.test_panel.PanelCrossMonitorsTests.test_window_buttons_dont_show_for_maximized_window_on_mouse_in", "unity.tests.test_panel.PanelCrossMonitorsTests.test_window_buttons_dont_show_in_other_monitors_when_dash_is_open", "unity.tests.test_panel.PanelCrossMonitorsTests.test_window_buttons_dont_show_in_other_monitors_when_hud_is_open", "unity.tests.test_panel.PanelCrossMonitorsTests.test_window_buttons_minimize_inactive_when_clicked_in_another_monitor", "unity.tests.test_panel.PanelCrossMonitorsTests.test_window_buttons_unmaximize_inactive_when_clicked_in_another_monitor", "unity.tests.test_panel.PanelGrabAreaTests.test_focus_the_maximized_window_works", "unity.tests.test_panel.PanelGrabAreaTests.test_lower_the_maximized_window_works", "unity.tests.test_panel.PanelGrabAreaTests.test_panels_dont_steal_keynav_foucs_from_hud", "unity.tests.test_panel.PanelGrabAreaTests.test_unmaximize_from_grab_area_works", "unity.tests.test_panel.PanelHoverTests.test_menus_show_for_maximized_window_on_mouse_in_btn_area", "unity.tests.test_panel.PanelHoverTests.test_menus_show_for_maximized_window_on_mouse_in_grab_area", "unity.tests.test_panel.PanelHoverTests.test_menus_show_for_maximized_window_on_mouse_in_menu_area", "unity.tests.test_panel.PanelHoverTests.test_only_menus_show_for_restored_window_on_mouse_in_grab_area", "unity.tests.test_panel.PanelHoverTests.test_only_menus_show_for_restored_window_on_mouse_in_menu_area", "unity.tests.test_panel.PanelHoverTests.test_only_menus_show_for_restored_window_on_mouse_in_window_btn_area", "unity.tests.test_panel.PanelMenuTests.test_menus_dont_show_for_maximized_window_on_mouse_out", "unity.tests.test_panel.PanelMenuTests.test_menus_dont_show_for_restored_window_on_mouse_out", "unity.tests.test_panel.PanelMenuTests.test_menus_dont_show_if_a_new_application_window_is_opened", "unity.tests.test_panel.PanelMenuTests.test_menus_show_for_maximized_window_on_mouse_in", "unity.tests.test_panel.PanelMenuTests.test_menus_show_for_restored_window_on_mouse_in", "unity.tests.test_panel.PanelMenuTests.test_menus_shows_when_new_application_is_opened", "unity.tests.test_panel.PanelTitleTests.test_panel_shows_app_title_with_maximised_app", "unity.tests.test_panel.PanelTitleTests.test_panel_title_doesnt_change_with_switcher", "unity.tests.test_panel.PanelTitleTests.test_panel_title_on_empty_desktop", "unity.tests.test_panel.PanelTitleTests.test_panel_title_updates_on_maximized_window_title_changes", "unity.tests.test_panel.PanelTitleTests.test_panel_title_updates_when_switching_to_maximized_app", "unity.tests.test_panel.PanelTitleTests.test_panel_title_with_maximized_application", "unity.tests.test_panel.PanelTitleTests.test_panel_title_with_maximized_window_restored_child", "unity.tests.test_panel.PanelTitleTests.test_panel_title_with_restored_application", "unity.tests.test_panel.PanelWindowButtonsTests.test_double_click_unmaximize_window", "unity.tests.test_panel.PanelWindowButtonsTests.test_minimize_button_disabled_for_non_minimizable_windows", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_dont_show_for_maximized_window_on_mouse_out", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_dont_show_for_restored_window", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_dont_show_for_restored_window_with_mouse_in_panel", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_dont_show_on_empty_desktop", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_minimize_button_works_for_window", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_show_for_maximized_window_on_mouse_in", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_unmaximize_button_works_for_window", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_unmaximize_follows_fitts_law", "unity.tests.test_showdesktop.ShowDesktopTests.test_showdesktop_hides_apps", "unity.tests.test_showdesktop.ShowDesktopTests.test_showdesktop_switcher", "unity.tests.test_showdesktop.ShowDesktopTests.test_showdesktop_unhides_apps", "unity.tests.test_showdesktop.ShowDesktopTests.test_unhide_single_app", "unity.tests.test_spread.SpreadTests.test_scale_application_windows", "unity.tests.test_spread.SpreadTests.test_scaled_window_closes_on_close_button_click", "unity.tests.test_spread.SpreadTests.test_scaled_window_closes_on_middle_click", "unity.tests.test_spread.SpreadTests.test_scaled_window_is_focused_on_click", "unity.tests.test_switcher.SwitcherDetailsModeTests.test_detail_mode_selects_last_active_window", "unity.tests.test_switcher.SwitcherDetailsModeTests.test_detail_mode_selects_third_window", "unity.tests.test_switcher.SwitcherDetailsTests.test_no_details_for_apps_on_different_workspace", "unity.tests.test_switcher.SwitcherTests.test_application_window_is_fake_decorated", "unity.tests.test_switcher.SwitcherTests.test_application_window_is_fake_decorated_in_detail_mode", "unity.tests.test_switcher.SwitcherWindowsManagementTests.test_switcher_raises_only_last_focused_window", "unity.tests.test_switcher.SwitcherWindowsManagementTests.test_switcher_rises_next_window_of_same_application", "unity.tests.test_switcher.SwitcherWindowsManagementTests.test_switcher_rises_other_application", "unity.tests.test_switcher.SwitcherWorkspaceTests.test_switcher_all_mode_shows_all_apps", "unity.tests.test_switcher.SwitcherWorkspaceTests.test_switcher_can_switch_to_minimised_window", "unity.tests.test_switcher.SwitcherWorkspaceTests.test_switcher_is_disabled_when_wall_plugin_active", "unity.tests.test_switcher.SwitcherWorkspaceTests.test_switcher_shows_current_workspace_only" }; } INSTANTIATE_TEST_CASE_P (UnityIntegrationAutopilotTests, CompizAutopilotAcceptanceTest, ValuesIn (AutopilotTests)); compiz-0.9.11+14.04.20140409/tests/acceptance-tests/autopilot/README0000644000015301777760000000214512321343002024764 0ustar pbusernogroup00000000000000COMPIZ AUTOPILOT ACCEPTANCE TESTS ================================= compiz_autopilot_acceptance_tests is a simple Google Test wrapper around a suite of Unity Autopilot tests which effectively validate window manager functionality by actually interacting with a running instance. Note: These tests are very sensitive. There's a high chance of false-positives unless your session is set up exactly as indicated below: 1. Use a session with a completely default configuration. This might include an Ubuntu guest session, or a new user. 2. Do not have any external monitors plugged in, even in mirror mode. Gdk will detect any plugged in monitors and report them as part of the monitors available - autopilot assumes that the monitors are always in xinerama mode, which may cause tests to fail in very non-obvious ways. 3. Do not have any other windows open at the time the test binary is launched. It is suggested to launch the test binary from another session with the same environment variables present in the guest session. Do not add this binary to the auto-test discovery. compiz-0.9.11+14.04.20140409/tests/acceptance-tests/xorg-gtest/0000755000015301777760000000000012321344021024167 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/tests/acceptance-tests/xorg-gtest/tests/0000755000015301777760000000000012321344021025331 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000015600000000000011217 Lustar 00000000000000compiz-0.9.11+14.04.20140409/tests/acceptance-tests/xorg-gtest/tests/compiz_acceptance_replace_current_wm.cppcompiz-0.9.11+14.04.20140409/tests/acceptance-tests/xorg-gtest/tests/compiz_acceptance_replace_curre0000644000015301777760000001631412321343002033621 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest Acceptance Tests * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace ct = compiz::testing; class XorgAcceptance : public xorg::testing::Test { public: typedef boost::shared_ptr ProcessPtr; }; namespace { char TEST_FAILED_MSG = 's'; char PROCESS_EXITED_MSG = 'd'; } class WaitForSuccessDeathTask : public AsyncTask { public: typedef boost::function GetProcessState; WaitForSuccessDeathTask (const GetProcessState &procState) : mProcessState (procState) { } private: GetProcessState mProcessState; void Task (); }; void WaitForSuccessDeathTask::Task () { do { if (ReadMsgFromTest (TEST_FAILED_MSG, 1)) return; } while (mProcessState () != xorg::testing::Process::FINISHED_SUCCESS); /* The process died, send a message back saying that it did */ SendMsgToTest (PROCESS_EXITED_MSG); } TEST_F (XorgAcceptance, SIGINTClosesDown) { /* XXX: This is a bit stupid, but we have to do it. * It seems as though closing the child stdout or * stderr will cause the client to hang indefinitely * when the child calls XSync (and that can happen * implicitly, eg XCloseDisplay) */ TmpEnv env ("XORG_GTEST_CHILD_STDOUT", "1"); ProcessPtr compiz (boost::make_shared (Display (), ct::CompizProcess::WaitForStartupMessage, ct::CompizProcess::PluginList ())); pid_t firstProcessPid = compiz->Pid (); WaitForSuccessDeathTask::GetProcessState procState (boost::bind (&ct::CompizProcess::State, compiz.get ())); AsyncTask::Ptr task (boost::make_shared (procState)); kill (firstProcessPid, SIGINT); const unsigned int maximumWaitTime = 10 * 1000; // Ten seconds if (!task->ReadMsgFromTask (PROCESS_EXITED_MSG, maximumWaitTime)) { task->SendMsgToTask (TEST_FAILED_MSG); throw std::runtime_error ("compiz process did not exit with success status"); } } TEST_F (XorgAcceptance, ReplaceOtherWMFast) { /* XXX: This is a bit stupid, but we have to do it. * It seems as though closing the child stdout or * stderr will cause the client to hang indefinitely * when the child calls XSync (and that can happen * implicitly, eg XCloseDisplay) */ TmpEnv env ("XORG_GTEST_CHILD_STDOUT", "1"); ProcessPtr firstCompiz (boost::make_shared (Display (), ct::CompizProcess::WaitForStartupMessage, ct::CompizProcess::PluginList ())); /* Expect it to exit */ WaitForSuccessDeathTask::GetProcessState procState (boost::bind (&ct::CompizProcess::State, firstCompiz.get ())); AsyncTask::Ptr task (boost::make_shared (procState)); const unsigned int maximumWaitTime = 10 * 1000; // Ten seconds ProcessPtr secondCompiz (boost::make_shared (Display (), static_cast ( ct::CompizProcess::WaitForStartupMessage | ct::CompizProcess::ReplaceCurrentWM), ct::CompizProcess::PluginList (), maximumWaitTime)); if (!task->ReadMsgFromTask (PROCESS_EXITED_MSG, maximumWaitTime)) { task->SendMsgToTask (TEST_FAILED_MSG); throw std::runtime_error ("compiz process did not exit with success status"); } } namespace { char TEST_FINISHED_MSG = 's'; } class SlowDownTask : public AsyncTask { public: typedef boost::function GetProcessState; typedef boost::function GetPid; SlowDownTask (const GetProcessState &procState, const GetPid &pid) : mProcessState (procState), mPid (pid), mIsRunning (true) { } virtual ~SlowDownTask () {} private: GetProcessState mProcessState; GetPid mPid; bool mIsRunning; void Task (); }; void SlowDownTask::Task () { do { if (ReadMsgFromTest (TEST_FINISHED_MSG, mIsRunning ? 1 : 400)) return; pid_t pid = mPid (); if (pid) { if (mIsRunning) { kill (pid, SIGSTOP); mIsRunning = false; } else { kill (pid, SIGCONT); mIsRunning = true; } } } while (mProcessState () != xorg::testing::Process::FINISHED_SUCCESS); /* The process died, send a message back saying that it did */ SendMsgToTest (PROCESS_EXITED_MSG); } TEST_F (XorgAcceptance, ReplaceOtherWMSlow) { ::Display *dpy = Display (); /* XXX: This is a bit stupid, but we have to do it. * It seems as though closing the child stdout or * stderr will cause the client to hang indefinitely * when the child calls XSync (and that can happen * implicitly, eg XCloseDisplay) */ TmpEnv env ("XORG_GTEST_CHILD_STDOUT", "1"); ProcessPtr firstCompiz (boost::make_shared (dpy, ct::CompizProcess::WaitForStartupMessage, ct::CompizProcess::PluginList (), 3000)); SlowDownTask::GetProcessState procState (boost::bind (&ct::CompizProcess::State, firstCompiz.get ())); SlowDownTask::GetPid getPid (boost::bind (&ct::CompizProcess::Pid, firstCompiz.get ())); /* Slow down the first compiz */ AsyncTask::Ptr task (boost::make_shared (procState, getPid)); /* Select for StructureNotifyMask */ XSelectInput (dpy, DefaultRootWindow (dpy), StructureNotifyMask); const unsigned int maximumWaitTime = 20 * 1000; // Twenty seconds ProcessPtr secondCompiz (boost::make_shared (Display (), static_cast ( ct::CompizProcess::ReplaceCurrentWM | ct::CompizProcess::WaitForStartupMessage), ct::CompizProcess::PluginList (), maximumWaitTime)); /* Wait until the first one goes away */ if (!task->ReadMsgFromTask (PROCESS_EXITED_MSG, maximumWaitTime)) { task->SendMsgToTask (TEST_FINISHED_MSG); throw std::runtime_error ("compiz process did not exit with success status"); } } compiz-0.9.11+14.04.20140409/tests/acceptance-tests/xorg-gtest/tests/CMakeLists.txt0000644000015301777760000000133512321343002030071 0ustar pbusernogroup00000000000000link_directories (${X11_XI_LIBRARY_DIRS} ${compiz_BINARY_DIR}/tests/shared/src) add_executable (compiz_acceptance_test_xorg_replace_current_wm ${CMAKE_CURRENT_SOURCE_DIR}/compiz_acceptance_replace_current_wm.cpp) set (COMPIZ_XORG_ACCEPTANCE_TEST_LIBRARIES compiz_xorg_gtest_system_test xorg_gtest_all compiz_xorg_gtest_main ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_LIBRARIES} ${X11_XI_LIBRARIES}) target_link_libraries (compiz_acceptance_test_xorg_replace_current_wm ${COMPIZ_XORG_ACCEPTANCE_TEST_LIBRARIES} compiz_gtest_shared_async_task) # Not autodiscovering tests here, these tests are # inherently flakey. See README compiz-0.9.11+14.04.20140409/tests/acceptance-tests/xorg-gtest/tests/README0000644000015301777760000000027312321343002026211 0ustar pbusernogroup00000000000000These tests are acceptance tests and may take a while to run. As such please do not add them to the compiz_discover_tests list. Use them to check that startup and shutdown work correctly compiz-0.9.11+14.04.20140409/tests/acceptance-tests/xorg-gtest/CMakeLists.txt0000644000015301777760000000047712321343002026735 0ustar pbusernogroup00000000000000if (BUILD_XORG_GTEST) include_directories (${compiz_SOURCE_DIR}/tests/shared ${COMPIZ_XORG_SYSTEM_TEST_INCLUDE_DIR} ${X11_INCLUDE_DIRS} ${XORG_SERVER_INCLUDE_XORG_GTEST} ${XORG_SERVER_GTEST_SRC} ${GTEST_INCLUDE_DIRS}) add_subdirectory (tests) endif (BUILD_XORG_GTEST) compiz-0.9.11+14.04.20140409/tests/acceptance-tests/CMakeLists.txt0000644000015301777760000000007312321343002024622 0ustar pbusernogroup00000000000000add_subdirectory (xorg-gtest) add_subdirectory (autopilot) compiz-0.9.11+14.04.20140409/plugins/0000755000015301777760000000000012321344021017155 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/showdesktop/0000755000015301777760000000000012321344021021527 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/showdesktop/showdesktop.xml.in0000644000015301777760000000657012321343002025236 0ustar pbusernogroup00000000000000 <_short>Show Desktop <_long>Access the desktop easily by using variable ways to move windows out of view Desktop showdesktop opengl composite opengl fade decor unityshell <_short>General <_short>Appearance compiz-0.9.11+14.04.20140409/plugins/showdesktop/CMakeLists.txt0000644000015301777760000000016012321343002024262 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (showdesktop PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/showdesktop/src/0000755000015301777760000000000012321344021022316 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/showdesktop/src/showdesktop.h0000644000015301777760000001703312321343002025043 0ustar pbusernogroup00000000000000/* * showdesktop.h * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * Give credit where credit is due, keep the authors message below. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * - Diogo Ferreira (playerX) * - Danny Baumann * - Sam Spilsbury * * * Copyright (c) 2007 Diogo "playerX" Ferreira * * This wouldn't have been possible without: * - Ideas from the compiz community (mainly throughnothing's) * - David Reveman's work * * */ #include #include #include #include #include #include "showdesktop_options.h" extern const unsigned short SD_STATE_OFF; extern const unsigned short SD_STATE_ACTIVATING; extern const unsigned short SD_STATE_ON; extern const unsigned short SD_STATE_DEACTIVATING; /* Initialize the enums containing allowed directions * for intelligent random and fully random direction modes */ enum IRDirection { IntelligentRandomToCorners, IntelligentRandomUpDown, IntelligentRandomLeftRight }; enum FRDirection { FullRandomUp, FullRandomDown, FullRandomLeft, FullRandomRight, FullRandomTopLeft, FullRandomBottomLeft, FullRandomTopRight, FullRandomBottomRight }; class ShowdesktopPlacer { public: ShowdesktopPlacer (); void up (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void down (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void left (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void right (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void topLeft (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void topRight (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void bottomLeft (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void bottomRight (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void upOrDown (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, const CompSize &screen, int partSize); void leftOrRight (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, const CompSize &screen, int partSize); void closestCorner (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, const CompSize &screen, int partSize); void partRandom (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, const CompSize &screen, int partSize); void random (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); int placed; int onScreenX, onScreenY; int offScreenX, offScreenY; int origViewportX; int origViewportY; }; class ShowdesktopScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public ShowdesktopOptions { public: ShowdesktopScreen (CompScreen *); CompositeScreen *cScreen; GLScreen *gScreen; int state; int moreAdjust; void handleEvent (XEvent *event); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void donePaint (); void enterShowDesktopMode (); void leaveShowDesktopMode (CompWindow *); int prepareWindows (int oldState); }; class ShowdesktopWindow: public PluginClassHandler , public WindowInterface, public GLWindowInterface { public: ShowdesktopWindow (CompWindow *); ~ShowdesktopWindow (); CompWindow *window; GLWindow *gWindow; int sid; int distance; ShowdesktopPlacer *placer; GLfloat xVelocity, yVelocity; GLfloat tx, ty; unsigned int notAllowedMask; unsigned int stateMask; bool showdesktoped; bool wasManaged; float delta; bool adjust; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void getAllowedActions (unsigned int &, unsigned int &); bool focus (); bool is (); void setHints (bool enterSDMode); void repositionPlacer (int oldState); int adjustVelocity (); int state; int moreAdjust; }; /* shortcut macros, usually named X_SCREEN and X_WINDOW * these might seem overly complicated but they are shortcuts so * we don't have to access the privates arrays all the time * */ #define SD_SCREEN(s) \ ShowdesktopScreen *ss = ShowdesktopScreen::get(s) #define SD_WINDOW(w) \ ShowdesktopWindow *sw = ShowdesktopWindow::get(w) /* class vtable definition */ class ShowdesktopPluginVTable: public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/showdesktop/src/showdesktop.cpp0000644000015301777760000005472512321343002025407 0ustar pbusernogroup00000000000000/* * showdesktop.cpp * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * Give credit where credit is due, keep the authors message below. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * - Diogo Ferreira (playerX) * - Danny Baumann * - Sam Spilsbury * * * Copyright (c) 2007 Diogo "playerX" Ferreira * * This wouldn't have been possible without: * - Ideas from the compiz community (mainly throughnothing's) * - David Reveman's work * * */ #include "showdesktop.h" COMPIZ_PLUGIN_20090315 (showdesktop, ShowdesktopPluginVTable); namespace cw = compiz::window; namespace cwe = compiz::window::extents; namespace { int windowBorderX (const cw::Geometry &geometry, const cwe::Extents &border) { return geometry.x () - border.left; } int windowBorderY (const cw::Geometry &geometry, const cwe::Extents &border) { return geometry.y () - border.top; } int windowBorderWidth (const cw::Geometry &geometry, const cwe::Extents &border) { return geometry.width () + border.left + border.right; } int windowBorderHeight (const cw::Geometry &geometry, const cwe::Extents &border) { return geometry.height () + border.top + border.bottom; } int widthAndRightBorder (const cw::Geometry &geometry, const cwe::Extents &border) { return geometry.width () + border.left + border.right; } int leftBorder (const cwe::Extents &border) { return border.left; } int widthAndBottomBorder (const cw::Geometry &geometry, const cwe::Extents &border) { return geometry.height () + border.bottom; } int topBorder (const cwe::Extents &border) { return border.top; } bool centerOfWindowIsOnLeftHalf (const cw::Geometry &geometry, const cwe::Extents &border, const CompSize &screen) { return (windowBorderX (geometry, border) + (windowBorderWidth (geometry, border) / 2)) < (screen.width () / 2); } bool centerOfWindowIsOnTopHalf (const cw::Geometry &geometry, const cwe::Extents &border, const CompSize &screen) { return (windowBorderY (geometry, border) + (windowBorderHeight (geometry, border) / 2)) < (screen.height () / 2); } } const unsigned short SD_STATE_OFF = 0; const unsigned short SD_STATE_ACTIVATING = 1; const unsigned short SD_STATE_ON = 2; const unsigned short SD_STATE_DEACTIVATING = 3; /* non interfacing code, aka the logic of the plugin */ bool ShowdesktopWindow::is () { SD_SCREEN (screen); if (window->grabbed ()) return false; if (!window->focus ()) return false; if (!ss->optionGetWindowMatch ().evaluate (window)) return false; if (window->wmType () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) return false; if (window->state () & CompWindowStateSkipPagerMask) return false; return true; } void ShowdesktopWindow::setHints (bool enterSDMode) { unsigned int state = window->state (); showdesktoped = enterSDMode; if (enterSDMode) { stateMask = state & CompWindowStateSkipPagerMask; state |= CompWindowStateSkipPagerMask; notAllowedMask = (CompWindowActionMoveMask | CompWindowActionResizeMask); window->changeState (state); //#warning need to make window->managed wrappable //window->setManaged (false) } else { //window->setManaged (wasManaged); state &= ~CompWindowStateSkipPagerMask; state |= (stateMask & CompWindowStateSkipPagerMask); notAllowedMask = 0; stateMask = 0; window->changeState (state); } } namespace { int topOffscreenPosition (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { return workArea.y () - widthAndBottomBorder (geometry, border) + partSize; } int bottomOffscreenPosition (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { return workArea.y () + workArea.height () + topBorder (border) - partSize; } int leftOffscreenPosition (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { return workArea.x () - widthAndRightBorder (geometry, border) + partSize; } int rightOffscreenPosition (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { return workArea.x () + workArea.width () + leftBorder (border) - partSize; } } void ShowdesktopPlacer::up (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = geometry.x (); offScreenY = topOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::down (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = geometry.x (); offScreenY = bottomOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::left (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = leftOffscreenPosition (workArea, geometry, border, partSize); offScreenY = geometry.y (); } void ShowdesktopPlacer::right (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = rightOffscreenPosition (workArea, geometry, border, partSize); offScreenY = geometry.y (); } void ShowdesktopPlacer::topLeft (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = leftOffscreenPosition (workArea, geometry, border, partSize); offScreenY = topOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::topRight (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = rightOffscreenPosition (workArea, geometry, border, partSize); offScreenY = topOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::bottomLeft (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = leftOffscreenPosition (workArea, geometry, border, partSize); offScreenY = bottomOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::bottomRight (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = rightOffscreenPosition (workArea, geometry, border, partSize); offScreenY = bottomOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::leftOrRight (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, const CompSize &screen, int partSize) { offScreenY = geometry.y (); if (centerOfWindowIsOnLeftHalf (geometry, border, screen)) offScreenX = leftOffscreenPosition (workArea, geometry, border, partSize); else offScreenX = rightOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::upOrDown (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, const CompSize &screen, int partSize) { offScreenX = geometry.x (); if (centerOfWindowIsOnTopHalf (geometry, border, screen)) offScreenY = topOffscreenPosition (workArea, geometry, border, partSize); else offScreenY = bottomOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::closestCorner (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, const CompSize &screen, int partSize) { if (centerOfWindowIsOnLeftHalf (geometry, border, screen)) offScreenX = leftOffscreenPosition (workArea, geometry, border, partSize); else offScreenX = rightOffscreenPosition (workArea, geometry, border, partSize); if (centerOfWindowIsOnTopHalf (geometry, border, screen)) offScreenY = topOffscreenPosition (workArea, geometry, border, partSize); else offScreenY = bottomOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::partRandom (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, const CompSize &screen, int partSize) { /* generate a random value in the range 0-2, which represents * the allowed direction for intelligent random direction mode */ IRDirection randomMode = static_cast(rand () % 3); /* move to corners */ switch (randomMode) { case IntelligentRandomToCorners: closestCorner (workArea, geometry, border, screen, partSize); break; case IntelligentRandomLeftRight: leftOrRight (workArea, geometry, border, screen, partSize); break; case IntelligentRandomUpDown: upOrDown (workArea, geometry, border, screen, partSize); break; } } void ShowdesktopPlacer::random (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { /* generate a random value in the range 0-7, which represents * the allowed direction for fully random direction mode */ FRDirection randomDirection = static_cast(rand () % 8); switch (randomDirection) { case FullRandomUp: up (workArea, geometry, border, partSize); break; case FullRandomDown: down (workArea, geometry, border, partSize); break; case FullRandomLeft: left (workArea, geometry, border, partSize); break; case FullRandomRight: right (workArea, geometry, border, partSize); break; case FullRandomTopLeft: topLeft (workArea, geometry, border, partSize); break; case FullRandomTopRight: topRight (workArea, geometry, border, partSize); break; case FullRandomBottomLeft: bottomLeft (workArea, geometry, border, partSize); break; case FullRandomBottomRight: bottomRight (workArea, geometry, border, partSize); break; } } void ShowdesktopWindow::repositionPlacer (int oldState) { if (!placer) return; SD_SCREEN (screen); if (oldState == SD_STATE_OFF) { placer->onScreenX = window->x (); placer->onScreenY = window->y (); placer->origViewportX = screen->vp ().x (); placer->origViewportY = screen->vp ().y (); } const int partSize = ss->optionGetWindowPartSize (); const CompRect &workArea = screen->workArea (); const cw::Geometry &geometry = window->geometry (); const cwe::Extents &border = window->border (); switch (ss->optionGetDirection ()) { /* Single directions */ case ShowdesktopOptions::DirectionUp: placer->up (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionDown: placer->down (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionLeft: placer->left (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionRight: placer->right (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionTopLeftCorner: placer->topLeft (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionBottomLeftCorner: placer->bottomLeft (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionTopRightCorner: placer->topRight (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionBottomRightCorner: placer->bottomRight (workArea, geometry, border, partSize); break; /* Dual directions */ case ShowdesktopOptions::DirectionUpDown: placer->upOrDown (workArea, geometry, border, *screen, partSize); break; case ShowdesktopOptions::DirectionLeftRight: placer->leftOrRight (workArea, geometry, border, *screen, partSize); break; /* Quad directions */ case ShowdesktopOptions::DirectionToCorners: placer->closestCorner (workArea, geometry, border, *screen, partSize); break; /* One of 3 random directions per window */ case ShowdesktopOptions::DirectionIntelligentRandom: placer->partRandom (workArea, geometry, border, *screen, partSize); break; /* One of 8 random directions per window */ case ShowdesktopOptions::DirectionFullyRandom: placer->random (workArea, geometry, border, partSize); break; default: break; } } int ShowdesktopScreen::prepareWindows (int oldState) { int count = 0; foreach (CompWindow *w, screen->windows ()) { SD_WINDOW (w); if (!sw->is ()) continue; if (!sw->placer) sw->placer = new ShowdesktopPlacer (); if (!sw->placer) continue; sw->repositionPlacer (oldState); sw->placer->placed = true; sw->adjust = true; w->setShowDesktopMode (true); sw->setHints (true); if (sw->tx) sw->tx -= (sw->placer->onScreenX - sw->placer->offScreenX); if (sw->ty) sw->ty -= (sw->placer->onScreenY - sw->placer->offScreenY); w->move (sw->placer->offScreenX - w->x (), sw->placer->offScreenY - w->y (), true); count++; } return count; } int ShowdesktopWindow::adjustVelocity () { float adjust, amount; float x1, y1; float baseX, baseY; SD_SCREEN (screen); x1 = y1 = 0.0; if (ss->state == SD_STATE_ACTIVATING) { x1 = placer->offScreenX; y1 = placer->offScreenY; baseX = placer->onScreenX; baseY = placer->onScreenY; } else { x1 = placer->onScreenX; y1 = placer->onScreenY; baseX = placer->offScreenX; baseY = placer->offScreenY; } float dx = x1 - (baseX + tx); adjust = dx * 0.15f; amount = fabs (dx) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; xVelocity = (amount * xVelocity + adjust) / (amount + 1.0f); float dy = y1 - (baseY + ty); adjust = dy * 0.15f; amount = fabs (dy) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; yVelocity = (amount * yVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (xVelocity) < 0.2f && fabs (dy) < 0.1f && fabs (yVelocity) < 0.2f) { xVelocity = yVelocity = 0.0f; tx = x1 - baseX; ty = y1 - baseY; return 0; } return 1; } /* this function gets called periodically (about every 15ms on this machine), * animation takes place here */ void ShowdesktopScreen::preparePaint (int msSinceLastPaint) { cScreen->preparePaint (msSinceLastPaint); if ((state == SD_STATE_ACTIVATING) || (state == SD_STATE_DEACTIVATING)) { int steps; float amount, chunk; amount = msSinceLastPaint * 0.05f * optionGetSpeed (); steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float)steps; while (steps--) { moreAdjust = 0; foreach (CompWindow *w, screen->windows ()) { SD_WINDOW (w); if (sw->adjust) { sw->adjust = sw->adjustVelocity (); moreAdjust |= sw->adjust; sw->tx += sw->xVelocity * chunk; sw->ty += sw->yVelocity * chunk; } } if (!moreAdjust) break; } } } bool ShowdesktopScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if ((state == SD_STATE_ACTIVATING) || (state == SD_STATE_DEACTIVATING)) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; return gScreen->glPaintOutput (attrib, transform, region, output, mask); } void ShowdesktopScreen::donePaint () { if (moreAdjust) cScreen->damageScreen (); else if (state == SD_STATE_ACTIVATING) state = SD_STATE_ON; else if (state == SD_STATE_DEACTIVATING) { bool inSDMode = false; foreach (CompWindow *w, screen->windows ()) { if (w->inShowDesktopMode ()) inSDMode = true; else { SD_WINDOW (w); if (sw->placer) { delete sw->placer; sw->placer = NULL; sw->tx = 0; sw->ty = 0; } } } if (inSDMode) state = SD_STATE_ON; else state = SD_STATE_OFF; } cScreen->donePaint (); } bool ShowdesktopWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { SD_SCREEN (screen); if ((ss->state == SD_STATE_ACTIVATING) || (ss->state == SD_STATE_DEACTIVATING)) { GLMatrix wTransform = transform; GLWindowPaintAttrib wAttrib = attrib; if (adjust) { float offsetX = (ss->state == SD_STATE_DEACTIVATING) ? (placer->offScreenX - placer->onScreenX) : (placer->onScreenX - placer->offScreenX); float offsetY = (ss->state == SD_STATE_DEACTIVATING) ? (placer->offScreenY - placer->onScreenY) : (placer->onScreenY - placer->offScreenY); mask |= PAINT_WINDOW_TRANSFORMED_MASK; wTransform.translate (window->x (), window->y (), 0.0f); wTransform.scale (1.0f, 1.0f, 1.0f); wTransform.translate(tx + offsetX - window->x (), ty + offsetY - window->y (), 0.0f); } return gWindow->glPaint (wAttrib, wTransform, region, mask); } else if (ss->state == SD_STATE_ON) { GLWindowPaintAttrib wAttrib = attrib; if (window->inShowDesktopMode ()) wAttrib.opacity = wAttrib.opacity * ss->optionGetWindowOpacity (); return gWindow->glPaint (wAttrib, transform, region, mask); } else return gWindow->glPaint (attrib, transform, region, mask); } void ShowdesktopScreen::handleEvent (XEvent *event) { switch (event->type) { case PropertyNotify: if (event->xproperty.atom == Atoms::desktopViewport) { SD_SCREEN (screen); if ((ss->state == SD_STATE_ON) || (ss->state == SD_STATE_ACTIVATING)) screen->leaveShowDesktopMode (NULL); } break; } screen->handleEvent (event); } void ShowdesktopWindow::getAllowedActions (unsigned int &setActions, unsigned int &clearActions) { window->getAllowedActions (setActions, clearActions); clearActions |= notAllowedMask; } void ShowdesktopScreen::enterShowDesktopMode () { if (state == SD_STATE_OFF || state == SD_STATE_DEACTIVATING) { int count = prepareWindows (state); if (count > 0) { XSetInputFocus (screen->dpy (), screen->root (), RevertToPointerRoot, CurrentTime); state = SD_STATE_ACTIVATING; cScreen->damageScreen (); } } screen->enterShowDesktopMode (); } void ShowdesktopScreen::leaveShowDesktopMode (CompWindow *w) { if (state != SD_STATE_OFF) { foreach (CompWindow *cw, screen->windows ()) { SD_WINDOW (cw); if (w && (w->id () != cw->id ())) continue; if (sw->placer && sw->placer->placed) { sw->adjust = true; sw->placer->placed = false; /* adjust onscreen position to handle viewport changes */ sw->tx += (sw->placer->onScreenX - sw->placer->offScreenX); sw->ty += (sw->placer->onScreenY - sw->placer->offScreenY); sw->placer->onScreenX += (sw->placer->origViewportX - screen->vp (). x ()) * screen->width (); sw->placer->onScreenY += (sw->placer->origViewportY - screen->vp ().y ()) * screen->height (); cw->move (sw->placer->onScreenX - cw->x (), sw->placer->onScreenY - cw->y (), true); sw->setHints (false); cw->setShowDesktopMode (false); } } state = SD_STATE_DEACTIVATING; cScreen->damageScreen (); } screen->leaveShowDesktopMode (w); } bool ShowdesktopWindow::focus () { /* if (sw->showdesktoped) w->managed = sw->wasManaged;*/ bool ret = window->focus (); /* if (sw->showdesktoped) w->managed = false; */ return ret; } ShowdesktopPlacer::ShowdesktopPlacer () : placed (0), onScreenX (0), onScreenY (0), offScreenX (0), offScreenY (0), origViewportX (0), origViewportY (0) { } /* screen initialization */ ShowdesktopScreen::ShowdesktopScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), state (SD_STATE_OFF), moreAdjust (0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); } /* window initialization */ ShowdesktopWindow::ShowdesktopWindow (CompWindow *window) : PluginClassHandler (window), window (window), gWindow (GLWindow::get (window)), sid (0), distance (0), placer (NULL), xVelocity (0.0f), yVelocity (0.0f), tx (0.0f), ty (0.0f), notAllowedMask (0), stateMask (0), showdesktoped (false), wasManaged (window->managed ()), delta (1.0f), adjust (false), state (0), moreAdjust (false) { WindowInterface::setHandler (window); GLWindowInterface::setHandler (gWindow); } ShowdesktopWindow::~ShowdesktopWindow () { if (placer) delete placer; } bool ShowdesktopPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/grid/0000755000015301777760000000000012321344021020102 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/grid/grid.xml.in0000644000015301777760000003616512321343002022167 0ustar pbusernogroup00000000000000 <_short>Grid <_long>Warp and resize windows to fit an imaginary grid Window Management opengl wobbly composite opengl decor <_short>Bindings <_short>Corners / Edges <_short>Resize Actions <_short>Grid Snapback Thresholds <_short>Grid Snapoff Threshold <_short>Appearance compiz-0.9.11+14.04.20140409/plugins/grid/CMakeLists.txt0000644000015301777760000000043512321343002022642 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) include_directories (src/grabhandler/include) link_directories (${CMAKE_CURRENT_BINARY_DIR}/src/grabhandler) compiz_plugin (grid PLUGINDEPS composite opengl LIBRARIES compiz_grid_grabhandler) add_subdirectory (src/grabhandler) compiz-0.9.11+14.04.20140409/plugins/grid/src/0000755000015301777760000000000012321344021020671 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/grid/src/grabhandler/0000755000015301777760000000000012321344021023142 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/grid/src/grabhandler/tests/0000755000015301777760000000000012321344021024304 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/grid/src/grabhandler/tests/test-grid-grab-handler.cpp0000644000015301777760000000522112321343002031234 0ustar pbusernogroup00000000000000/* * Compiz Fusion Grid plugin, GrabHandler class * * Copyright (c) 2011 Canonical Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Description: * * Plugin to act like winsplit revolution (http://www.winsplit-revolution.com/) * use NUMPAD_KEY to move and tile your windows. * * Press the tiling keys several times to cycle through some tiling options. * * Authored By: * Sam Spilsbury */ #include #include #include #include /* FIXME: Not entirely portable, but we can't * include window.h without pulling in bunch of * static initalizers */ #define CompWindowGrabKeyMask (1 << 0) #define CompWindowGrabButtonMask (1 << 1) #define CompWindowGrabMoveMask (1 << 2) #define CompWindowGrabResizeMask (1 << 3) #define CompWindowGrabExternalAppMask (1 << 4) using testing::Eq; using testing::Return; namespace { bool returnFalse () { return false; } class MockGrabExist { public: MOCK_METHOD1 (grabExist, bool (const char *)); }; } TEST(GridGrabHandlerTest, TestMoveHandler) { compiz::grid::window::GrabWindowHandler moveHandler (CompWindowGrabMoveMask | CompWindowGrabButtonMask, boost::bind (returnFalse)); EXPECT_TRUE (moveHandler.track ()); EXPECT_FALSE (moveHandler.resetResize ()); } TEST(GridGrabHandlerTest, TestResizeHandler) { compiz::grid::window::GrabWindowHandler resizeHandler (CompWindowGrabButtonMask | CompWindowGrabResizeMask, boost::bind (returnFalse)); EXPECT_FALSE (resizeHandler.track ()); EXPECT_TRUE (resizeHandler.resetResize ()); } TEST(GridGrabHandlerTest, TestNoTrackOnExpoGrab) { const std::string expoPlugin ("expo"); MockGrabExist mge; compiz::grid::window::GrabActiveFunc grabExist (boost::bind (&MockGrabExist::grabExist, &mge, _1)); compiz::grid::window::GrabWindowHandler moveHandler (CompWindowGrabMoveMask | CompWindowGrabButtonMask, grabExist); EXPECT_CALL (mge, grabExist (Eq (expoPlugin))).WillOnce (Return (true)); EXPECT_FALSE (moveHandler.track ()); } compiz-0.9.11+14.04.20140409/plugins/grid/src/grabhandler/tests/CMakeLists.txt0000644000015301777760000000063112321343002027042 0ustar pbusernogroup00000000000000add_executable (compiz_test_grid_grabhandler ${CMAKE_CURRENT_SOURCE_DIR}/test-grid-grab-handler.cpp) target_link_libraries (compiz_test_grid_grabhandler compiz_grid_grabhandler ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_grid_grabhandler COVERAGE compiz_grid_grabhandler) compiz-0.9.11+14.04.20140409/plugins/grid/src/grabhandler/CMakeLists.txt0000644000015301777760000000106612321343002025703 0ustar pbusernogroup00000000000000INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS} ${COMPIZ_LIBRARY_DIRS}) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/grabhandler.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/grabhandler.cpp ) ADD_LIBRARY( compiz_grid_grabhandler STATIC ${SRCS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) compiz-0.9.11+14.04.20140409/plugins/grid/src/grabhandler/src/0000755000015301777760000000000012321344021023731 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/grid/src/grabhandler/src/grabhandler.cpp0000644000015301777760000000275612321343002026716 0ustar pbusernogroup00000000000000/* * Compiz Fusion Grid plugin * * Copyright (c) 2008 Stephen Kennedy * Copyright (c) 2010 Scott Moreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Description: * * Plugin to act like winsplit revolution (http://www.winsplit-revolution.com/) * use NUMPAD_KEY to move and tile your windows. * * Press the tiling keys several times to cycle through some tiling options. */ #include "grabhandler.h" compiz::grid::window::GrabWindowHandler::GrabWindowHandler (unsigned int mask, const GrabActiveFunc &grabActive) : mMask (mask), mGrabActive (grabActive) { } compiz::grid::window::GrabWindowHandler::~GrabWindowHandler () { } bool compiz::grid::window::GrabWindowHandler::track () { if (mGrabActive ("expo")) return false; return ((mMask & (CompWindowGrabMoveMask | CompWindowGrabButtonMask)) && !(mMask & CompWindowGrabResizeMask)); } bool compiz::grid::window::GrabWindowHandler::resetResize () { return (mMask & CompWindowGrabResizeMask); } compiz-0.9.11+14.04.20140409/plugins/grid/src/grabhandler/include/0000755000015301777760000000000012321344021024565 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/grid/src/grabhandler/include/grabhandler.h0000644000015301777760000000317212321343002027210 0ustar pbusernogroup00000000000000/* * Compiz Fusion Grid plugin, GrabHandler class * * Copyright (c) 2011 Canonical Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Description: * * Plugin to act like winsplit revolution (http://www.winsplit-revolution.com/) * use NUMPAD_KEY to move and tile your windows. * * Press the tiling keys several times to cycle through some tiling options. * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GRID_GRABHANDLER_H #define _COMPIZ_GRID_GRABHANDLER_H #include #define CompWindowGrabKeyMask (1 << 0) #define CompWindowGrabButtonMask (1 << 1) #define CompWindowGrabMoveMask (1 << 2) #define CompWindowGrabResizeMask (1 << 3) #define CompWindowGrabExternalAppMask (1 << 4) namespace compiz { namespace grid { namespace window { typedef boost::function GrabActiveFunc; class GrabWindowHandler { public: GrabWindowHandler (unsigned int mask, const GrabActiveFunc &grabActive); ~GrabWindowHandler (); bool track (); bool resetResize (); private: unsigned int mMask; GrabActiveFunc mGrabActive; }; } } } #endif compiz-0.9.11+14.04.20140409/plugins/grid/src/grid.cpp0000644000015301777760000011433212321343002022324 0ustar pbusernogroup00000000000000/* * Compiz Fusion Grid plugin * * Copyright (c) 2008 Stephen Kennedy * Copyright (c) 2010 Scott Moreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Description: * * Plugin to act like winsplit revolution (http://www.winsplit-revolution.com/) * use NUMPAD_KEY to move and tile your windows. * * Press the tiling keys several times to cycle through some tiling options. */ #include #include #include #include "grid.h" #include "grabhandler.h" using namespace GridWindowType; namespace cgw = compiz::grid::window; static std::map gridProps; static int const CURVE_ANIMATION = 35; void GridScreen::handleCompizEvent(const char *plugin, const char *event, CompOption::Vector& o) { if (strcmp(event, "start_viewport_switch") == 0) mSwitchingVp = true; else if (strcmp(event, "end_viewport_switch") == 0) mSwitchingVp = false; screen->handleCompizEvent(plugin, event, o); } CompRect GridScreen::slotToRect (CompWindow *w, const CompRect& slot) { return CompRect (slot.x () + w->border ().left, slot.y () + w->border ().top, slot.width () - (w->border ().left + w->border ().right), slot.height () - (w->border ().top + w->border ().bottom)); } CompRect GridScreen::constrainSize (CompWindow *w, const CompRect& slot) { int cw, ch; CompRect result = slotToRect (w, slot); if (w->constrainNewWindowSize (result.width (), result.height (), &cw, &ch)) { /* constrained size may put window offscreen, adjust for that case */ int dx = result.x () + cw - workarea.right () + w->border ().right; int dy = result.y () + ch - workarea.bottom () + w->border ().bottom; if (dx > 0) result.setX (result.x () - dx); if (dy > 0) result.setY (result.y () - dy); result.setWidth (cw); result.setHeight (ch); } return result; } void GridScreen::getPaintRectangle (CompRect &cRect) { if (typeToMask (edgeToGridType ()) != GridUnknown && optionGetDrawIndicator ()) cRect = desiredSlot; else cRect.setGeometry (0, 0, 0, 0); } int applyProgress (int a, int b, float progress) { return a < b ? b - (ABS (a - b) * progress) : b + (ABS (a - b) * progress); } void GridScreen::setCurrentRect (Animation &anim) { anim.currentRect.setLeft (applyProgress (anim.targetRect.x1 (), anim.fromRect.x1 (), anim.progress)); anim.currentRect.setRight (applyProgress (anim.targetRect.x2 (), anim.fromRect.x2 (), anim.progress)); anim.currentRect.setTop (applyProgress (anim.targetRect.y1 (), anim.fromRect.y1 (), anim.progress)); anim.currentRect.setBottom (applyProgress (anim.targetRect.y2 (), anim.fromRect.y2 (), anim.progress)); } bool GridScreen::initiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &option, unsigned int where, bool resize, bool key) { CompWindow *cw = 0; Window xid = CompOption::getIntOptionNamed (option, "window"); cw = screen->findWindow (xid); if (cw) { XWindowChanges xwc; bool maximizeH = where & (GridBottom | GridTop | GridMaximize); bool maximizeV = where & (GridLeft | GridRight | GridMaximize); bool horzMaximizedGridPosition = where & (GridTop | GridBottom); bool vertMaximizedGridPosition = where & (GridLeft | GridRight); bool anyMaximizedGridPosition = horzMaximizedGridPosition || vertMaximizedGridPosition || where & GridMaximize; if (!(cw->actions () & CompWindowActionResizeMask) || (maximizeH && !(cw->actions () & CompWindowActionMaximizeHorzMask)) || (maximizeV && !(cw->actions () & CompWindowActionMaximizeVertMask)) || where & GridUnknown) return false; GRID_WINDOW (cw); if (gw->lastTarget & ~(where)) gw->resizeCount = 0; else if (!key) return false; props = gridProps[where]; /* get current available area */ if (cw == mGrabWindow) workarea = screen->getWorkareaForOutput (screen->outputDeviceForPoint (pointerX, pointerY)); else { workarea = screen->getWorkareaForOutput (cw->outputDevice ()); if (props.numCellsX == 1) centerCheck = true; /* Do not overwrite the original size if we already have been gridded or * have been grid-maximized */ if (!gw->isGridResized && !gw->isGridHorzMaximized && !gw->isGridVertMaximized && !(cw->state () & MAXIMIZE_STATE)) /* Store size not including borders when using a keybinding */ gw->originalSize = slotToRect(cw, cw->serverBorderRect ()); } if ((cw->state () & MAXIMIZE_STATE) && resize) // maximized state interferes with us, clear it cw->maximize (0); if ((where & GridMaximize) && resize) { cw->maximize (MAXIMIZE_STATE); /* Core can handle fully maximized windows so we don't * have to worry about them. Don't mark the window as a * gridded one. */ gw->isGridResized = false; gw->isGridHorzMaximized = false; gw->isGridVertMaximized = false; for (unsigned int i = 0; i < animations.size (); ++i) animations.at (i).fadingOut = true; return true; } /* Convention: * xxxSlot include decorations (it's the screen area occupied) * xxxRect are undecorated (it's the constrained position of the contents) */ /* slice and dice to get desired slot - including decorations */ desiredSlot.setY (workarea.y () + props.gravityDown * (workarea.height () / props.numCellsY)); desiredSlot.setHeight (workarea.height () / props.numCellsY); desiredSlot.setX (workarea.x () + props.gravityRight * (workarea.width () / props.numCellsX)); desiredSlot.setWidth (workarea.width () / props.numCellsX); if (!optionGetCycleSizes ()) { /* Adjust for constraints and decorations */ if (!anyMaximizedGridPosition) desiredRect = constrainSize (cw, desiredSlot); else desiredRect = slotToRect (cw, desiredSlot); } else /* (optionGetCycleSizes ()) */ { /* Adjust for constraints and decorations */ if (where & ~GridMaximize) desiredRect = constrainSize (cw, desiredSlot); else desiredRect = slotToRect (cw, desiredSlot); } /* Get current rect not including decorations */ currentRect.setGeometry (cw->serverX (), cw->serverY (), cw->serverWidth (), cw->serverHeight ()); /* We do not want to allow cycling through sizes, * unless the user explicitely specified that in CCSM */ if (gw->lastTarget == where && gw->isGridResized && !optionGetCycleSizes ()) return false; /* !(Grid Left/Right/Top/Bottom) are only valid here, * if cycling through sizes is disabled also */ if ((where & ~(GridMaximize) || ((!horzMaximizedGridPosition || !vertMaximizedGridPosition) && !optionGetCycleSizes ())) && gw->lastTarget & where) { int slotWidth25 = workarea.width () / 4; int slotWidth33 = (workarea.width () / 3) + cw->border ().left; int slotWidth17 = slotWidth33 - slotWidth25; int slotWidth66 = workarea.width () - slotWidth33; int slotWidth75 = workarea.width () - slotWidth25; if (props.numCellsX == 2) /* keys (1, 4, 7, 3, 6, 9) */ { if ((currentRect.width () == desiredRect.width () && currentRect.x () == desiredRect.x ()) || (gw->resizeCount < 1) || (gw->resizeCount > 5)) gw->resizeCount = 3; /* tricky, have to allow for window constraints when * computing what the 33% and 66% offsets would be */ switch (gw->resizeCount) { case 1: desiredSlot.setWidth (slotWidth66); desiredSlot.setX (workarea.x () + props.gravityRight * slotWidth33); ++gw->resizeCount; break; case 2: ++gw->resizeCount; break; case 3: desiredSlot.setWidth (slotWidth33); desiredSlot.setX (workarea.x () + props.gravityRight * slotWidth66); ++gw->resizeCount; break; case 4: desiredSlot.setWidth (slotWidth25); desiredSlot.setX (workarea.x () + props.gravityRight * slotWidth75); ++gw->resizeCount; break; case 5: desiredSlot.setWidth (slotWidth75); desiredSlot.setX (workarea.x () + props.gravityRight * slotWidth25); ++gw->resizeCount; break; default: break; } } else /* keys (2, 5, 8) */ { if ((currentRect.width () == desiredRect.width () && currentRect.x () == desiredRect.x ()) || (gw->resizeCount < 1) || (gw->resizeCount > 5)) gw->resizeCount = 1; switch (gw->resizeCount) { case 1: desiredSlot.setWidth (workarea.width () - (slotWidth17 * 2)); desiredSlot.setX (workarea.x () + slotWidth17); ++gw->resizeCount; break; case 2: desiredSlot.setWidth ((slotWidth25 * 2) + (slotWidth17 * 2)); desiredSlot.setX (workarea.x () + (slotWidth25 - slotWidth17)); ++gw->resizeCount; break; case 3: desiredSlot.setWidth ((slotWidth25 * 2)); desiredSlot.setX (workarea.x () + slotWidth25); ++gw->resizeCount; break; case 4: desiredSlot.setWidth (slotWidth33 - (cw->border ().left + cw->border ().right)); desiredSlot.setX (workarea.x () + slotWidth33); ++gw->resizeCount; break; case 5: ++gw->resizeCount; break; default: break; } } if (gw->resizeCount == 6) gw->resizeCount = 1; desiredRect = constrainSize (cw, desiredSlot); } xwc.x = desiredRect.x (); xwc.y = desiredRect.y (); xwc.width = desiredRect.width (); xwc.height = desiredRect.height (); /* Store a copy of xwc since configureXWindow changes it's values */ XWindowChanges wc = xwc; if (cw->mapNum ()) cw->sendSyncRequest (); /* TODO: animate move+resize */ if (resize) { unsigned int valueMask = CWX | CWY | CWWidth | CWHeight; gw->lastTarget = where; gw->currentSize = CompRect (wc.x, wc.y, wc.width, wc.height); CompWindowExtents lastBorder = gw->window->border (); gw->sizeHintsFlags = 0; if (!optionGetCycleSizes ()) { /* Special cases for left/right and top/bottom gridded windows, where we * actually vertically respective horizontally semi-maximize the window */ if (horzMaximizedGridPosition || vertMaximizedGridPosition) { /* First restore the window to its original size */ XWindowChanges rwc; rwc.x = gw->originalSize.x (); rwc.y = gw->originalSize.y (); rwc.width = gw->originalSize.width (); rwc.height = gw->originalSize.height (); cw->configureXWindow (CWX | CWY | CWWidth | CWHeight, &rwc); /* GridLeft || GridRight */ if (vertMaximizedGridPosition) { gw->isGridVertMaximized = true; gw->isGridHorzMaximized = false; gw->isGridResized = false; /* Semi-maximize the window vertically */ cw->maximize (CompWindowStateMaximizedVertMask); } /* GridTop || GridBottom */ else /* (horzMaximizedGridPosition) */ { gw->isGridHorzMaximized = true; gw->isGridVertMaximized = false; gw->isGridResized = false; /* Semi-maximize the window horizontally */ cw->maximize (CompWindowStateMaximizedHorzMask); } /* Be evil */ if (cw->sizeHints ().flags & PResizeInc) { gw->sizeHintsFlags |= PResizeInc; gw->window->sizeHints ().flags &= ~(PResizeInc); } } else /* GridCorners || GridCenter */ { gw->isGridResized = true; gw->isGridHorzMaximized = false; gw->isGridVertMaximized = false; } } else /* if (optionGetCycleSizes ()) */ { gw->isGridResized = true; gw->isGridHorzMaximized = false; gw->isGridVertMaximized = false; } int dw = (lastBorder.left + lastBorder.right) - (gw->window->border ().left + gw->window->border ().right); int dh = (lastBorder.top + lastBorder.bottom) - (gw->window->border ().top + gw->window->border ().bottom); xwc.width += dw; xwc.height += dh; /* Make window the size that we want */ cw->configureXWindow (valueMask, &xwc); for (unsigned int i = 0; i < animations.size (); ++i) animations.at (i).fadingOut = true; } /* This centers a window if it could not be resized to the desired * width. Without this, it can look buggy when desired width is * beyond the minimum or maximum width of the window. */ if (centerCheck) { if (cw->serverBorderRect ().width () > desiredSlot.width () || cw->serverBorderRect ().width () < desiredSlot.width ()) { wc.x = (workarea.width () >> 1) - ((cw->serverBorderRect ().width () >> 1) - cw->border ().left); cw->configureXWindow (CWX, &wc); } centerCheck = false; } } return true; } void GridScreen::glPaintRectangle (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output) { CompRect rect; GLMatrix sTransform (transform); std::vector::iterator iter; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLfloat vertexData[12]; GLushort colorData[4]; GLushort *color; GLboolean isBlendingEnabled; const float MaxUShortFloat = std::numeric_limits ::max (); getPaintRectangle (rect); for (unsigned int i = 0; i < animations.size (); ++i) setCurrentRect (animations.at (i)); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glGetBooleanv (GL_BLEND, &isBlendingEnabled); glEnable (GL_BLEND); for (iter = animations.begin (); iter != animations.end () && animating; ++iter) { Animation& anim = *iter; float curve = powf (CURVE_ANIMATION, -anim.progress); float alpha = (optionGetFillColorAlpha () / MaxUShortFloat) * anim.opacity; color = optionGetFillColor (); colorData[0] = alpha * color[0]; colorData[1] = alpha * color[1]; colorData[2] = alpha * color[2]; colorData[3] = alpha * MaxUShortFloat; if (optionGetDrawStretchedWindow ()) colorData[3] *= (1.0 - curve); vertexData[0] = anim.currentRect.x1 (); vertexData[1] = anim.currentRect.y1 (); vertexData[2] = 0.0f; vertexData[3] = anim.currentRect.x1 (); vertexData[4] = anim.currentRect.y2 (); vertexData[5] = 0.0f; vertexData[6] = anim.currentRect.x2 (); vertexData[7] = anim.currentRect.y1 (); vertexData[8] = 0.0f; vertexData[9] = anim.currentRect.x2 (); vertexData[10] = anim.currentRect.y2 (); vertexData[11] = 0.0f; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); /* Set outline rect smaller to avoid damage issues */ anim.currentRect.setGeometry (anim.currentRect.x () + 1, anim.currentRect.y () + 1, anim.currentRect.width () - 2, anim.currentRect.height () - 2); /* draw outline */ alpha = (optionGetOutlineColorAlpha () / MaxUShortFloat) * anim.opacity; color = optionGetOutlineColor (); colorData[0] = alpha * color[0]; colorData[1] = alpha * color[1]; colorData[2] = alpha * color[2]; colorData[3] = alpha * MaxUShortFloat; if (optionGetDrawStretchedWindow ()) colorData[3] *= (1.0 - curve); vertexData[0] = anim.currentRect.x1 (); vertexData[1] = anim.currentRect.y1 (); vertexData[3] = anim.currentRect.x1 (); vertexData[4] = anim.currentRect.y2 (); vertexData[6] = anim.currentRect.x2 (); vertexData[7] = anim.currentRect.y2 (); vertexData[9] = anim.currentRect.x2 (); vertexData[10] = anim.currentRect.y1 (); glLineWidth (2.0); streamingBuffer->begin (GL_LINE_LOOP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); } if (!animating) { /* draw filled rectangle */ float alpha = optionGetFillColorAlpha () / MaxUShortFloat; color = optionGetFillColor (); colorData[0] = alpha * color[0]; colorData[1] = alpha * color[1]; colorData[2] = alpha * color[2]; colorData[3] = alpha * MaxUShortFloat; vertexData[0] = rect.x1 (); vertexData[1] = rect.y1 (); vertexData[2] = 0.0f; vertexData[3] = rect.x1 (); vertexData[4] = rect.y2 (); vertexData[5] = 0.0f; vertexData[6] = rect.x2 (); vertexData[7] = rect.y1 (); vertexData[8] = 0.0f; vertexData[9] = rect.x2 (); vertexData[10] = rect.y2 (); vertexData[11] = 0.0f; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); /* Set outline rect smaller to avoid damage issues */ rect.setGeometry (rect.x () + 1, rect.y () + 1, rect.width () - 2, rect.height () - 2); /* draw outline */ alpha = optionGetOutlineColorAlpha () / MaxUShortFloat; color = optionGetOutlineColor (); colorData[0] = alpha * color[0]; colorData[1] = alpha * color[1]; colorData[2] = alpha * color[2]; colorData[3] = alpha * MaxUShortFloat; vertexData[0] = rect.x1 (); vertexData[1] = rect.y1 (); vertexData[3] = rect.x1 (); vertexData[4] = rect.y2 (); vertexData[6] = rect.x2 (); vertexData[7] = rect.y2 (); vertexData[9] = rect.x2 (); vertexData[10] = rect.y1 (); glLineWidth (2.0); streamingBuffer->begin (GL_LINE_LOOP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); } if (!isBlendingEnabled) glDisable (GL_BLEND); } bool GridScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = glScreen->glPaintOutput (attrib, matrix, region, output, mask); glPaintRectangle (attrib, matrix, output); return status; } namespace { class GridTypeMask { public: GridTypeMask (unsigned int m, int t): mask (m), type (t) { } unsigned int mask; int type; }; } unsigned int GridScreen::typeToMask (int t) { std::vector type; type.push_back (GridTypeMask (GridWindowType::GridUnknown, 0)); type.push_back (GridTypeMask (GridWindowType::GridBottomLeft, 1)); type.push_back (GridTypeMask (GridWindowType::GridBottom, 2)); type.push_back (GridTypeMask (GridWindowType::GridBottomRight, 3)); type.push_back (GridTypeMask (GridWindowType::GridLeft, 4)); type.push_back (GridTypeMask (GridWindowType::GridCenter, 5)); type.push_back (GridTypeMask (GridWindowType::GridRight, 6)); type.push_back (GridTypeMask (GridWindowType::GridTopLeft, 7)); type.push_back (GridTypeMask (GridWindowType::GridTop, 8)); type.push_back (GridTypeMask (GridWindowType::GridTopRight, 9)); type.push_back (GridTypeMask (GridWindowType::GridMaximize, 10)); for (unsigned int i = 0; i < type.size (); ++i) { GridTypeMask &tm = type[i]; if (tm.type == t) return tm.mask; } return GridWindowType::GridUnknown; } int GridScreen::edgeToGridType () { int ret; switch (edge) { case Left: ret = optionGetLeftEdgeAction (); break; case Right: ret = optionGetRightEdgeAction (); break; case Top: ret = optionGetTopEdgeAction (); break; case Bottom: ret = optionGetBottomEdgeAction (); break; case TopLeft: ret = optionGetTopLeftCornerAction (); break; case TopRight: ret = optionGetTopRightCornerAction (); break; case BottomLeft: ret = optionGetBottomLeftCornerAction (); break; case BottomRight: ret = optionGetBottomRightCornerAction (); break; case NoEdge: default: ret = -1; break; } return ret; } void GridScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (event->type != MotionNotify || !mGrabWindow) return; /* Detect when cursor enters another output */ currentWorkarea = screen->getWorkareaForOutput (screen->outputDeviceForPoint (pointerX, pointerY)); if (lastWorkarea != currentWorkarea) { lastWorkarea = currentWorkarea; if (cScreen) cScreen->damageRegion (desiredSlot); initiateCommon (0, 0, o, typeToMask (edgeToGridType ()), false, false); if (cScreen) cScreen->damageRegion (desiredSlot); } CompOutput out = screen->outputDevs ().at ( screen->outputDeviceForPoint (CompPoint (pointerX, pointerY))); /* Detect corners first */ /* Bottom Left */ if (pointerY > (out.y () + out.height () - optionGetBottomEdgeThreshold ()) && pointerX < (out.x () + optionGetLeftEdgeThreshold ())) edge = BottomLeft; /* Bottom Right */ else if (pointerY > (out.y () + out.height () - optionGetBottomEdgeThreshold ()) && pointerX > (out.x () + out.width () - optionGetRightEdgeThreshold ())) edge = BottomRight; /* Top Left */ else if (pointerY < (out.y () + optionGetTopEdgeThreshold ()) && pointerX < (out.x () + optionGetLeftEdgeThreshold ())) edge = TopLeft; /* Top Right */ else if (pointerY < (out.y () + optionGetTopEdgeThreshold ()) && pointerX > (out.x () + out.width () - optionGetRightEdgeThreshold ())) edge = TopRight; /* Left */ else if (pointerX < (out.x () + optionGetLeftEdgeThreshold ())) edge = Left; /* Right */ else if (pointerX > (out.x () + out.width () - optionGetRightEdgeThreshold ())) edge = Right; /* Top */ else if (pointerY < (out.y () + optionGetTopEdgeThreshold ())) edge = Top; /* Bottom */ else if (pointerY > (out.y () + out.height () - optionGetBottomEdgeThreshold ())) edge = Bottom; /* No Edge */ else edge = NoEdge; /* Detect edge region change */ CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (o, "window")); if (lastEdge != edge) { bool check = false; unsigned int target = typeToMask (edgeToGridType ()); lastSlot = desiredSlot; if (edge == NoEdge || target == GridUnknown) desiredSlot.setGeometry (0, 0, 0, 0); if (cScreen) cScreen->damageRegion (desiredSlot); check = initiateCommon (NULL, 0, o, target, false, false); if (cScreen) cScreen->damageRegion (desiredSlot); if (lastSlot != desiredSlot) { if (!animations.empty ()) /* Begin fading previous animation instance */ animations.at (animations.size () - 1).fadingOut = true; if (edge != NoEdge && check) { if (w) { animations.push_back (Animation ()); int current = animations.size () - 1; animations.at (current).fromRect = w->serverBorderRect (); animations.at (current).currentRect = w->serverBorderRect (); animations.at (current).duration = optionGetAnimationDuration (); animations.at (current).timer = animations.at (current).duration; animations.at (current).targetRect = desiredSlot; animations.at (current).window = w->id(); if (lastEdge == NoEdge || !animating) { /* Cursor has entered edge region from non-edge region */ animating = true; glScreen->glPaintOutputSetEnabled (this, true); cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); } } } } lastEdge = edge; } if (w) { GRID_WINDOW (w); int snapoffThreshold = optionGetSnapoffThreshold (); /* we just care about snapping of grid-resized windows */ if ((gw->pointerBufDx > snapoffThreshold || gw->pointerBufDy > snapoffThreshold || gw->pointerBufDx < -snapoffThreshold || gw->pointerBufDy < -snapoffThreshold) && gw->isGridResized) restoreWindow (0, 0, o); } } void GridWindow::validateResizeRequest (unsigned int &xwcm, XWindowChanges *xwc, unsigned int source) { window->validateResizeRequest (xwcm, xwc, source); /* Don't allow non-pagers to change * the size of the window, the user * specified this size */ if (isGridHorzMaximized || isGridVertMaximized) if (source != ClientTypePager) xwcm = 0; } void GridWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { static cgw::GrabActiveFunc grabActive (boost::bind (&CompScreen::grabExist, screen, _1)); cgw::GrabWindowHandler gwHandler (mask, grabActive); if (gwHandler.track ()) { gScreen->o[0].value ().set ((int) window->id ()); screen->handleEventSetEnabled (gScreen, true); gScreen->mGrabWindow = window; pointerBufDx = pointerBufDy = 0; grabMask = mask; if (!isGridResized && !isGridHorzMaximized && !isGridVertMaximized) /* Store size not including borders when grabbing with cursor */ originalSize = gScreen->slotToRect (window, window->serverBorderRect ()); } else if (gwHandler.resetResize ()) { isGridResized = false; resizeCount = 0; } window->grabNotify (x, y, state, mask); } void GridWindow::ungrabNotify () { if (window == gScreen->mGrabWindow) { gScreen->initiateCommon (NULL, 0, gScreen->o, gScreen->typeToMask (gScreen->edgeToGridType ()), true, gScreen->edge != gScreen->lastResizeEdge); screen->handleEventSetEnabled (gScreen, false); grabMask = 0; gScreen->mGrabWindow = NULL; gScreen->o[0].value ().set (0); gScreen->cScreen->damageRegion (gScreen->desiredSlot); } gScreen->lastResizeEdge = gScreen->edge; gScreen->edge = NoEdge; window->ungrabNotify (); } void GridWindow::moveNotify (int dx, int dy, bool immediate) { window->moveNotify (dx, dy, immediate); if (isGridResized && !isGridHorzMaximized && !isGridVertMaximized && !GridScreen::get (screen)->mSwitchingVp) { if (window->grabbed () && screen->grabExist ("expo")) { /* Window is being dragged in expo. * Restore the original geometry right * away to avoid any confusion. */ gScreen->restoreWindow (0, 0, gScreen->o); return; } if (window->grabbed () && (grabMask & CompWindowGrabMoveMask)) { pointerBufDx += dx; pointerBufDy += dy; } /* Do not allow the window to be moved while it * is resized */ dx = currentSize.x () - window->geometry ().x (); dy = currentSize.y () - window->geometry ().y (); window->move (dx, dy); } } void GridWindow::stateChangeNotify (unsigned int lastState) { if (lastState & MAXIMIZE_STATE && !(window->state () & MAXIMIZE_STATE)) { lastTarget = GridUnknown; if (isGridHorzMaximized) { window->saveMask () |= CWY | CWHeight; window->saveWc ().y = originalSize.y (); window->saveWc ().height = originalSize.height (); } else if (isGridVertMaximized) { window->saveMask () |= CWX | CWWidth; window->saveWc ().x = originalSize.x () - window->border ().left; window->saveWc ().width = originalSize.width () + window->border ().left + window->border ().right; } if ((isGridHorzMaximized && (lastState & MAXIMIZE_STATE) == CompWindowStateMaximizedHorzMask) || (isGridVertMaximized && (lastState & MAXIMIZE_STATE) == CompWindowStateMaximizedVertMask)) gScreen->restoreWindow(0, 0, gScreen->o); } else if (!(lastState & MAXIMIZE_STATE) && window->state () & MAXIMIZE_STATE) { /* Unset grid resize state */ isGridResized = false; resizeCount = 0; if ((window->state () & MAXIMIZE_STATE) == MAXIMIZE_STATE) lastTarget = GridMaximize; if (window->grabbed ()) originalSize = gScreen->slotToRect (window, window->serverBorderRect ()); } window->stateChangeNotify (lastState); } bool GridScreen::restoreWindow (CompAction *action, CompAction::State state, CompOption::Vector &option) { XWindowChanges xwc; int xwcm = 0; CompWindow *cw = screen->findWindow (screen->activeWindow ()); if (!cw) return false; GRID_WINDOW (cw); /* We have nothing to do here */ if (!gw->isGridResized && !gw->isGridVertMaximized && !gw->isGridHorzMaximized) return false; else if (!gw->isGridResized && gw->isGridHorzMaximized && !gw->isGridVertMaximized) { /* Window has been horizontally maximized by grid. We only need * to restore Y and height - core handles X and width. */ if (gw->sizeHintsFlags) gw->window->sizeHints ().flags |= gw->sizeHintsFlags; xwcm |= CWY | CWHeight; } else if (!gw->isGridResized && !gw->isGridHorzMaximized && gw->isGridVertMaximized) { /* Window has been vertically maximized by grid. We only need * to restore X and width - core handles Y and height. */ if (gw->sizeHintsFlags) gw->window->sizeHints ().flags |= gw->sizeHintsFlags; xwcm |= CWX | CWWidth; } else if (gw->isGridResized && !gw->isGridHorzMaximized && !gw->isGridVertMaximized) /* Window is just gridded (center, corners). * We need to handle everything. */ xwcm |= CWX | CWY | CWWidth | CWHeight; else { /* This should never happen. But if it does, just bail out * gracefully. */ assert (gw->isGridResized && (gw->isGridHorzMaximized || gw->isGridVertMaximized)); return false; } if (cw == mGrabWindow) { /* The windows x-center is different in this case. */ if (optionGetSnapbackWindows ()) xwc.x = pointerX - (gw->originalSize.width () / 2); else /* the user does not want the original size back */ xwc.x = pointerX - gw->currentSize.width () / 2; xwc.y = pointerY + cw->border ().top / 2; } else if (cw->grabbed () && screen->grabExist ("expo")) { /* We're restoring a window inside expo by dragging. This is a bit * tricky. Pointer location is absolute to the screen, not relative * to expo viewport. So we can't use pointer location to calculate * the position of the restore window. * * The best solution is to resize it in place. */ xwcm = CWWidth | CWHeight; } else { xwc.x = gw->originalSize.x (); xwc.y = gw->originalSize.y (); } /* We just need the original size, if * this option is enabled or we are not grabbed */ if (optionGetSnapbackWindows () || !(cw == mGrabWindow)) { xwc.width = gw->originalSize.width (); xwc.height = gw->originalSize.height (); } else { /* the current size is also our new size */ xwc.width = gw->currentSize.width (); xwc.height = gw->currentSize.height (); } if (cw->mapNum() && xwcm) cw->sendSyncRequest(); /* Mark window as not gridded before configuring. If the current geometry * is the same as restored geometry, moveNotify blocks the restoration * movement and the pointer will detach from the window (LP: #1115344). */ gw->isGridHorzMaximized = false; gw->isGridVertMaximized = false; gw->isGridResized = false; cw->configureXWindow (xwcm, &xwc); gw->currentSize = CompRect (); gw->pointerBufDx = 0; gw->pointerBufDy = 0; if (cw->state () & MAXIMIZE_STATE) cw->maximize(0); gw->resizeCount = 0; gw->lastTarget = GridUnknown; return true; } void GridScreen::preparePaint (int msSinceLastPaint) { std::vector::iterator iter; for (iter = animations.begin (); iter != animations.end (); ++iter) { Animation& anim = *iter; anim.timer -= msSinceLastPaint; if (anim.timer < 0) anim.timer = 0; if (anim.fadingOut) anim.opacity -= msSinceLastPaint * 0.002; else if (anim.opacity < 1.0f) anim.opacity = anim.progress * anim.progress; else anim.opacity = 1.0f; if (anim.opacity < 0) { anim.opacity = 0.0f; anim.fadingOut = false; anim.complete = true; } anim.progress = (anim.duration - anim.timer) / anim.duration; } if (optionGetDrawStretchedWindow ()) { CompWindow *cw = screen->findWindow (CompOption::getIntOptionNamed (o, "window")); if (!cw) cw = screen->findWindow (screen->activeWindow ()); if (cw) { GRID_WINDOW (cw); gw->gWindow->glPaintSetEnabled (gw, true); } } cScreen->preparePaint (msSinceLastPaint); } void GridScreen::donePaint () { std::vector::iterator iter; for (iter = animations.begin (); iter != animations.end ();) { Animation& anim = *iter; if (anim.complete) iter = animations.erase(iter); else ++iter; } if (animations.empty ()) { cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); if (edge == NoEdge) glScreen->glPaintOutputSetEnabled (this, false); animations.clear (); animating = false; } if (optionGetDrawStretchedWindow ()) { CompWindow *cw = screen->findWindow (CompOption::getIntOptionNamed (o, "window")); if (!cw) cw = screen->findWindow (screen->activeWindow ()); if (cw) { GRID_WINDOW (cw); gw->gWindow->glPaintSetEnabled (gw, false); } } cScreen->damageScreen (); cScreen->donePaint (); } Animation::Animation () { progress = 0.0f; fromRect = CompRect (0, 0, 0, 0); targetRect = CompRect (0, 0, 0, 0); currentRect = CompRect (0, 0, 0, 0); opacity = 0.0f; timer = 0.0f; duration = 0; complete = false; fadingOut = false; window = 0; } GridScreen::GridScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), glScreen (GLScreen::get (screen)), props (), centerCheck (false), mGrabWindow (NULL), animating (false), mSwitchingVp (false) { o.push_back (CompOption ("window", CompOption::TypeInt)); ScreenInterface::setHandler (screen, false); screen->handleCompizEventSetEnabled (this, true); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (glScreen, false); edge = lastEdge = lastResizeEdge = NoEdge; currentWorkarea = lastWorkarea = screen->getWorkareaForOutput (screen->outputDeviceForPoint (pointerX, pointerY)); gridProps[GridUnknown] = GridProps (0,1, 1,1); gridProps[GridBottomLeft] = GridProps (0,1, 2,2); gridProps[GridBottom] = GridProps (0,1, 1,2); gridProps[GridBottomRight] = GridProps (1,1, 2,2); gridProps[GridLeft] = GridProps (0,0, 2,1); gridProps[GridCenter] = GridProps (0,0, 1,1); gridProps[GridRight] = GridProps (1,0, 2,1); gridProps[GridTopLeft] = GridProps (0,0, 2,2); gridProps[GridTop] = GridProps (0,0, 1,2); gridProps[GridTopRight] = GridProps (1,0, 2,2); gridProps[GridMaximize] = GridProps (0,0, 1,1); animations.clear (); #define GRIDSET(opt,where,resize,key) \ optionSet##opt##Initiate (boost::bind (&GridScreen::initiateCommon, this, \ _1, _2, _3, where, resize, key)) GRIDSET (PutCenterKey, GridWindowType::GridCenter, true, true); GRIDSET (PutLeftKey, GridWindowType::GridLeft, true, true); GRIDSET (PutRightKey, GridWindowType::GridRight, true, true); GRIDSET (PutTopKey, GridWindowType::GridTop, true, true); GRIDSET (PutBottomKey, GridWindowType::GridBottom, true, true); GRIDSET (PutTopleftKey, GridWindowType::GridTopLeft, true, true); GRIDSET (PutToprightKey, GridWindowType::GridTopRight, true, true); GRIDSET (PutBottomleftKey, GridWindowType::GridBottomLeft, true, true); GRIDSET (PutBottomrightKey, GridWindowType::GridBottomRight, true, true); GRIDSET (PutMaximizeKey, GridWindowType::GridMaximize, true, true); GRIDSET (RightMaximize, GridWindowType::GridRight, true, true); GRIDSET (LeftMaximize, GridWindowType::GridLeft, true, true); #undef GRIDSET optionSetPutRestoreKeyInitiate (boost::bind (&GridScreen:: restoreWindow, this, _1, _2, _3)); } GridWindow::GridWindow (CompWindow *window) : PluginClassHandler (window), window (window), gWindow (GLWindow::get(window)), gScreen (GridScreen::get (screen)), isGridResized (false), isGridHorzMaximized (false), isGridVertMaximized (false), grabMask (0), pointerBufDx (0), pointerBufDy (0), resizeCount (0), lastTarget (GridUnknown), sizeHintsFlags (0) { WindowInterface::setHandler (window); GLWindowInterface::setHandler (gWindow, false); } GridWindow::~GridWindow () { if (gScreen->mGrabWindow == window) gScreen->mGrabWindow = NULL; CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (gScreen->o, "window")); if (w == window) gScreen->o[0].value ().set (0); } bool GridWindow::glPaint (const GLWindowPaintAttrib& attrib, const GLMatrix& matrix, const CompRegion& region, const unsigned int mask) { bool status = gWindow->glPaint (attrib, matrix, region, mask); std::vector::iterator iter; for (iter = gScreen->animations.begin (); iter != gScreen->animations.end () && gScreen->animating; ++iter) { Animation& anim = *iter; if (anim.timer > 0.0f && anim.window == window->id()) { GLWindowPaintAttrib wAttrib(attrib); GLMatrix wTransform (matrix); unsigned int wMask(mask); float curve = powf (CURVE_ANIMATION, -anim.progress); wAttrib.opacity *= curve; wMask |= PAINT_WINDOW_TRANSFORMED_MASK; wMask |= PAINT_WINDOW_TRANSLUCENT_MASK; wMask |= PAINT_WINDOW_BLEND_MASK; float scaleX = (anim.currentRect.x2 () - anim.currentRect.x1 ()) / (float) window->borderRect ().width (); float scaleY = (anim.currentRect.y2 () - anim.currentRect.y1 ()) / (float) window->borderRect ().height (); float translateX = (anim.currentRect.x1 () - window->x ()) + window->border ().left * scaleX; float translateY = (anim.currentRect.y1 () - window->y ()) + window->border ().top * scaleY; wTransform.translate (window->x (), window->y (), 0.0f); wTransform.scale (scaleX, scaleY, 1.0f); wTransform.translate (translateX / scaleX - window->x (), translateY / scaleY - window->y (), 0.0f); gWindow->glPaint (wAttrib, wTransform, region, wMask); } } return status; } /* Initial plugin init function called. Checks to see if we are ABI * compatible with core, otherwise unload */ bool GridPluginVTable::init () { if (CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/grid/src/grid.h0000644000015301777760000001327212321343002021772 0ustar pbusernogroup00000000000000/* * Compiz Fusion Grid plugin * * Copyright (c) 2008 Stephen Kennedy * Copyright (c) 2010 Scott Moreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Description: * * Plugin to act like winsplit revolution (http://www.winsplit-revolution.com/) * use NUMPAD_KEY to move and tile your windows. * * Press the tiling keys several times to cycle through some tiling options. */ #include #include #include #include #include #include "grid_options.h" namespace GridWindowType { static const unsigned int GridUnknown = (1 << 0); static const unsigned int GridBottomLeft = (1 << 1); static const unsigned int GridBottom = (1 << 2); static const unsigned int GridBottomRight = (1 << 3); static const unsigned int GridLeft = (1 << 4); static const unsigned int GridCenter = (1 << 5); static const unsigned int GridRight = (1 << 6); static const unsigned int GridTopLeft = (1 << 7); static const unsigned int GridTop = (1 << 8); static const unsigned int GridTopRight = (1 << 9); static const unsigned int GridMaximize = (1 << 10); }; typedef unsigned int GridType; class GridProps { public: GridProps (): gravityRight (0), gravityDown (0), numCellsX (0), numCellsY (0) {} GridProps (int r, int d, int x, int y): gravityRight (r), gravityDown (d), numCellsX (x), numCellsY (y) { } int gravityRight; int gravityDown; int numCellsX; int numCellsY; }; enum Edges { NoEdge = 0, BottomLeft, Bottom, BottomRight, Left, Right, TopLeft, Top, TopRight }; class Animation { public: Animation (); GLfloat progress; CompRect fromRect; CompRect targetRect; CompRect currentRect; GLfloat opacity; GLfloat timer; Window window; int duration; bool complete; bool fadingOut; }; class GridScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler , public GridOptions { public: GridScreen (CompScreen *); CompositeScreen *cScreen; GLScreen *glScreen; CompRect workarea; CompRect currentRect; CompRect desiredSlot; CompRect lastSlot; CompRect desiredRect; CompRect lastWorkarea; CompRect currentWorkarea; GridProps props; Edges edge; Edges lastEdge; Edges lastResizeEdge; CompOption::Vector o; bool centerCheck; CompWindow *mGrabWindow; bool animating; bool mSwitchingVp; void getPaintRectangle (CompRect&); void setCurrentRect (Animation&); bool initiateCommon (CompAction *, CompAction::State , CompOption::Vector &, unsigned int , bool , bool ); void glPaintRectangle (const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void preparePaint (int msSinceLastPaint); void donePaint (); std::vector animations; int edgeToGridType (); unsigned int typeToMask (int); void handleEvent (XEvent *event); void handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options); bool restoreWindow (CompAction *, CompAction::State , CompOption::Vector &); void snapbackOptionChanged (CompOption *option, Options num); CompRect slotToRect (CompWindow *w, const CompRect& slot); CompRect constrainSize (CompWindow *w, const CompRect& slot); }; class GridWindow : public WindowInterface, public GLWindowInterface, public PluginClassHandler { public: GridWindow (CompWindow *); ~GridWindow (); CompWindow *window; GLWindow *gWindow; GridScreen *gScreen; bool isGridResized; bool isGridHorzMaximized; bool isGridVertMaximized; unsigned int grabMask; int pointerBufDx; int pointerBufDy; int resizeCount; CompRect currentSize; CompRect originalSize; GridType lastTarget; unsigned int sizeHintsFlags; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); void grabNotify (int, int, unsigned int, unsigned int); void ungrabNotify (); void moveNotify (int, int, bool); void stateChangeNotify (unsigned int); void validateResizeRequest (unsigned int &valueMask, XWindowChanges *xwc, unsigned int source); }; #define GRID_WINDOW(w) \ GridWindow *gw = GridWindow::get (w) class GridPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; COMPIZ_PLUGIN_20090315 (grid, GridPluginVTable); compiz-0.9.11+14.04.20140409/plugins/screenshot/0000755000015301777760000000000012321344021021332 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/screenshot/screenshot.xml.in0000644000015301777760000000401012321343002024627 0ustar pbusernogroup00000000000000 <_short>Screenshot <_long>Easily capture parts of your screen and save them as .png image Extras opengl compiztoolbox imageext:png decor compiz-0.9.11+14.04.20140409/plugins/screenshot/CMakeLists.txt0000644000015301777760000000017412321343002024072 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(screenshot PLUGINDEPS composite opengl compiztoolbox) compiz-0.9.11+14.04.20140409/plugins/screenshot/src/0000755000015301777760000000000012321344021022121 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/screenshot/src/screenshot.cpp0000644000015301777760000003305312321343002025004 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include "screenshot.h" #include #if defined(HAVE_SCANDIR_POSIX) // POSIX (2008) defines the comparison function like this: #define scandir(a,b,c,d) scandir((a), (b), (c), (int(*)(const dirent **, const dirent **))(d)); #else #define scandir(a,b,c,d) scandir((a), (b), (c), (int(*)(const void*,const void*))(d)); #endif COMPIZ_PLUGIN_20090315 (screenshot, ShotPluginVTable) bool ShotScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root"); if (xid != ::screen->root () || ::screen->otherGrabExist ("screenshot", NULL)) return false; if (!mGrabIndex) { mGrabIndex = ::screen->pushGrab (None, "screenshot"); screen->handleEventSetEnabled (this, true); } if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); /* Start selection screenshot rectangle */ mX1 = mX2 = pointerX; mY1 = mY2 = pointerY; mGrab = true; gScreen->glPaintOutputSetEnabled (this, true); return true; } bool ShotScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root"); if (xid && xid != ::screen->root ()) return false; if (mGrabIndex) { /* Enable screen capture */ cScreen->paintSetEnabled (this, true); ::screen->removeGrab (mGrabIndex, 0); mGrabIndex = 0; ::screen->handleEventSetEnabled (this, false); if (state & CompAction::StateCancel) mGrab = false; if (mX1 != mX2 && mY1 != mY2) { int x1 = MIN (mX1, mX2) - 1; int y1 = MIN (mY1, mY2) - 1; int x2 = MAX (mX1, mX2) + 1; int y2 = MAX (mY1, mY2) + 1; cScreen->damageRegion (CompRegion (x1, y1, x2 - x1, y2 - y1)); } } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } static int shotFilter (const struct dirent *d) { int number; if (sscanf (d->d_name, "screenshot%d.png", &number)) { int nDigits = 0; for (; number > 0; number /= 10) ++nDigits; /* Make sure there are no trailing characters in the name */ if ((int) strlen (d->d_name) == 14 + nDigits) return 1; } return 0; } static int shotSort (const void *_a, const void *_b) { struct dirent **a = (struct dirent **) _a; struct dirent **b = (struct dirent **) _b; int al = strlen ((*a)->d_name); int bl = strlen ((*b)->d_name); if (al == bl) return strcoll ((*a)->d_name, (*b)->d_name); else return al - bl; } void ShotScreen::paint (CompOutput::ptrList &outputs, unsigned int mask) { if (mGrab) { if (!mGrabIndex) { /* Taking screenshot, enable full paint on * this frame */ outputs.clear (); outputs.push_back (&screen->fullscreenOutput ()); } } cScreen->paint (outputs, mask); } namespace { bool paintSelectionRectangleFill (const CompRect &rect, unsigned short *fillColor, GLVertexBuffer *streamingBuffer, const GLMatrix &transform) { GLfloat vertexData[12]; GLushort colorData[4]; int x1 = rect.x1 (); int y1 = rect.y1 (); int x2 = rect.x2 (); int y2 = rect.y2 (); const float MaxUShortFloat = std::numeric_limits ::max (); /* draw filled rectangle */ float alpha = fillColor[3] / MaxUShortFloat; colorData[0] = alpha * fillColor[0]; colorData[1] = alpha * fillColor[1]; colorData[2] = alpha * fillColor[2]; colorData[3] = alpha * MaxUShortFloat; vertexData[0] = x1; vertexData[1] = y1; vertexData[2] = 0.0f; vertexData[3] = x1; vertexData[4] = y2; vertexData[5] = 0.0f; vertexData[6] = x2; vertexData[7] = y1; vertexData[8] = 0.0f; vertexData[9] = x2; vertexData[10] = y2; vertexData[11] = 0.0f; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); if (streamingBuffer->end ()) { glEnable (GL_BLEND); streamingBuffer->render (transform); glDisable (GL_BLEND); return true; } return false; } bool paintSelectionRectangleOutline (const CompRect &rect, unsigned short *outlineColor, GLVertexBuffer *streamingBuffer, const GLMatrix &transform) { GLfloat vertexData[12]; GLushort colorData[4]; int x1 = rect.x1 (); int y1 = rect.y1 (); int x2 = rect.x2 (); int y2 = rect.y2 (); const float MaxUShortFloat = std::numeric_limits ::max (); /* draw outline */ float alpha = outlineColor[3] / MaxUShortFloat; colorData[0] = alpha * outlineColor[0]; colorData[1] = alpha * outlineColor[1]; colorData[2] = alpha * outlineColor[2]; colorData[3] = alpha * MaxUShortFloat; vertexData[0] = x1; vertexData[1] = y1; vertexData[2] = 0.0f; vertexData[3] = x1; vertexData[4] = y2; vertexData[5] = 0.0f; vertexData[6] = x2; vertexData[7] = y2; vertexData[8] = 0.0f; vertexData[9] = x2; vertexData[10] = y1; vertexData[11] = 0.0f; streamingBuffer->begin (GL_LINE_LOOP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); if (streamingBuffer->end ()) { glEnable (GL_BLEND); glLineWidth (2.0); streamingBuffer->render (transform); glDisable (GL_BLEND); return true; } return false; } void ensureDirectoryForImage (CompString &directory) { /* If dir is empty, use user's desktop directory instead */ if (directory.length () == 0) directory = getXDGUserDir (XDGUserDirDesktop); } int getImageNumberFromDirectory (const CompString &directory) { struct dirent **namelist; int n = scandir (directory.c_str (), &namelist, shotFilter, shotSort); if (n >= 0) { int number = 0; if (n > 0) sscanf (namelist[n - 1]->d_name, "screenshot%d.png", &number); ++number; if (n) free (namelist); return number; } else { perror ("scandir"); return 0; } } CompString getImageAbsolutePath (const CompString &directory, int number) { std::stringstream ss; ss << directory << "/screenshot" << number << ".png"; return ss.str (); } bool saveBuffer (const boost::scoped_array &buffer, int w, int h, const CompString &path) { CompSize imageSize (w, h); if (!::screen->writeImageToFile (const_cast (path), "png", imageSize, buffer.get ())) { compLogMessage ("screenshot", CompLogLevelError, "failed to write screenshot image"); return false; } return true; } bool launchApplicationAndTakeScreenshot (const CompString &app, const CompString &directory) { if (app.length () > 0) { ::screen->runCommand (app + " " + directory); return true; } return false; } bool readFromGPUBufferToCPUBuffer (const CompRect &rect, boost::scoped_array &buffer) { int x1 = rect.x1 (); int y1 = rect.y1 (); int x2 = rect.x2 (); int y2 = rect.y2 (); int w = x2 - x1; int h = y2 - y1; if (w && h) { size_t size = w * h * 4; buffer.reset (new GLubyte[size]); if (buffer.get ()) { GLint drawBinding = 0; GLint readBinding = 0; /* Bind the currently bound draw framebuffer to * the read framebuffer and read from it */ if (GL::fboEnabled) { glGetIntegerv (GL::DRAW_FRAMEBUFFER_BINDING, &drawBinding); glGetIntegerv (GL::READ_FRAMEBUFFER_BINDING, &readBinding); (GL::bindFramebuffer) (GL::READ_FRAMEBUFFER, drawBinding); } glGetError (); glReadPixels (x1, ::screen->height () - y2, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *) buffer.get ()); if (GL::fboEnabled) (GL::bindFramebuffer) (GL::READ_FRAMEBUFFER, readBinding); if (glGetError () != GL_NO_ERROR) return false; return true; } } return false; } /* We need to take directory by copy because * it may be modified later */ bool saveScreenshot (CompRect rect, CompString directory, const CompString &alternativeApplication) { ensureDirectoryForImage (directory); int number = getImageNumberFromDirectory (directory); CompString path = getImageAbsolutePath (directory, number); boost::scoped_array buffer; bool success = readFromGPUBufferToCPUBuffer (rect, buffer); if (success) { success = saveBuffer (buffer, rect.width (), rect.height (), path); } else { compLogMessage ("screenshot", CompLogLevelWarn, "glReadPixels failed"); } if (!success) success = launchApplicationAndTakeScreenshot (alternativeApplication, directory); return success; } } bool ShotScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, matrix, region, output, mask); if (status && mGrab) { /* We just want to draw the screenshot selection box if * we are grabbed, the size has changed and the CCSM * option to draw it is enabled. */ CompRect selectionRect (std::min (mX1, mX2), std::min (mY1, mY2), std::abs (mX2 - mX1), std::abs (mY2 - mY1)); if (mGrabIndex && selectionSizeChanged && optionGetDrawSelectionIndicator ()) { GLMatrix transform (matrix); GLVertexBuffer *streamingBuffer (GLVertexBuffer::streamingBuffer ()); transform.toScreenSpace (output, -DEFAULT_Z_CAMERA); paintSelectionRectangleFill (selectionRect, optionGetSelectionFillColor (), streamingBuffer, transform); paintSelectionRectangleOutline (selectionRect, optionGetSelectionOutlineColor (), streamingBuffer, transform); /* we finished painting the selection box, * reset selectionSizeChanged now */ selectionSizeChanged = false; } else if (!mGrabIndex) { /* Taking a screenshot */ saveScreenshot (selectionRect, optionGetDirectory (), optionGetLaunchApp ()); cScreen->paintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); } } return status; } void ShotScreen::handleMotionEvent (int xRoot, int yRoot) { /* update screenshot rectangle size */ if (mGrabIndex && (mX2 != xRoot || mY2 != yRoot)) { /* the size has changed now */ selectionSizeChanged = true; int x1 = MIN (mX1, mX2) - 1; int y1 = MIN (mY1, mY2) - 1; int x2 = MAX (mX1, mX2) + 1; int y2 = MAX (mY1, mY2) + 1; cScreen->damageRegion (CompRegion (x1, y1, x2 - x1, y2 - y1)); mX2 = xRoot; mY2 = yRoot; x1 = MIN (mX1, mX2) - 1; y1 = MIN (mY1, mY2) - 1; x2 = MAX (mX1, mX2) + 1; y2 = MAX (mY1, mY2) + 1; cScreen->damageRegion (CompRegion (x1, y1, x2 - x1, y2 - y1)); } } void ShotScreen::handleEvent (XEvent *event) { switch (event->type) { case MotionNotify: if (event->xmotion.root == screen->root ()) handleMotionEvent (pointerX, pointerY); break; case EnterNotify: case LeaveNotify: if (event->xcrossing.root == screen->root ()) handleMotionEvent (pointerX, pointerY); break; default: break; } ::screen->handleEvent (event); } ShotScreen::ShotScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mGrabIndex (0), mGrab (false), selectionSizeChanged (false) { optionSetInitiateButtonInitiate (boost::bind (&ShotScreen::initiate, this, _1, _2, _3)); optionSetInitiateButtonTerminate (boost::bind (&ShotScreen::terminate, this, _1, _2, _3)); ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } bool ShotPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("compiztoolbox", COMPIZ_COMPIZTOOLBOX_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/screenshot/src/screenshot.h0000644000015301777760000000503212321343002024445 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "screenshot_options.h" #include #include #include #include #include class ShotScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler, public ScreenshotOptions { public: ShotScreen (CompScreen *screen); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector &options); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector &options); void handleMotionEvent (int xRoot, int yRoot); void handleEvent (XEvent *event); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask); void paint (CompOutput::ptrList &outputs, unsigned int mask); CompositeScreen *cScreen; GLScreen *gScreen; CompScreen::GrabHandle mGrabIndex; bool mGrab; bool selectionSizeChanged; int mX1, mY1, mX2, mY2; }; class ShotPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/staticswitcher/0000755000015301777760000000000012321344021022215 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/staticswitcher/staticswitcher.xml.in0000644000015301777760000002356712321343002026417 0ustar pbusernogroup00000000000000 <_short>Static Application Switcher <_long>Static Application Switcher opengl compiztoolbox composite opengl fade compiztoolbox decor bs Window Management <_short>Bindings <_short>Behaviour <_short>Appearance <_short>Selected Window Highlight compiz-0.9.11+14.04.20140409/plugins/staticswitcher/CMakeLists.txt0000644000015301777760000000020112321343002024744 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (staticswitcher PLUGINDEPS composite opengl compiztoolbox) compiz-0.9.11+14.04.20140409/plugins/staticswitcher/src/0000755000015301777760000000000012321344021023004 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/staticswitcher/src/staticswitcher.cpp0000644000015301777760000010464412321343002026557 0ustar pbusernogroup00000000000000/* * * Compiz application switcher plugin * * staticswitcher.cpp * * Copyright : (C) 2008 by Danny Baumann * E-mail : maniac@compiz-fusion.org * * Based on switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "staticswitcher.h" COMPIZ_PLUGIN_20090315 (staticswitcher, StaticSwitchPluginVTable) const unsigned short ICON_SIZE = 48; const unsigned short PREVIEWSIZE = 150; const unsigned short BORDER = 10; void StaticSwitchScreen::updatePopupWindow () { int newXCount, newYCount; int winWidth, winHeight; float aspect; int count = windows.size (); double dCount = count; int w = PREVIEWSIZE, h = PREVIEWSIZE, b = BORDER; int x, y; XSizeHints xsh; /* maximum window size is 2/3 of the current output */ winWidth = ::screen->currentOutputDev ().width () * 2 / 3; winHeight = ::screen->currentOutputDev ().height () * 2 / 3; if (count <= 4) { /* don't put 4 or less windows in multiple rows */ newXCount = count; newYCount = 1; } else { aspect = (float) winWidth / winHeight; /* round is available in C99 only, so use a replacement for that */ newYCount = floor (sqrt (dCount / aspect) + 0.5f); newXCount = ceil (dCount / newYCount); } while ((w + b) * newXCount > winWidth || (h + b) * newYCount > winHeight) { /* shrink by 10% until all windows fit */ w = w * 9 / 10; h = h * 9 / 10; b = b * 9 / 10; } winWidth = MIN (count, newXCount); winHeight = (count + newXCount - 1) / newXCount; winWidth = winWidth * w + (winWidth + 1) * b; winHeight = winHeight * h + (winHeight + 1) * b; xCount = MIN (newXCount, count); previewWidth = w; previewHeight = h; previewBorder = b; x = ::screen->currentOutputDev ().region ()->extents.x1 + ::screen->currentOutputDev ().width () / 2; y = ::screen->currentOutputDev ().region ()->extents.y1 + ::screen->currentOutputDev ().height () / 2; xsh.flags = PSize | PPosition | PWinGravity; xsh.x = x; xsh.y = y; xsh.width = winWidth; xsh.height = winHeight; xsh.win_gravity = StaticGravity; XSetWMNormalHints (::screen->dpy (), popupWindow, &xsh); CompWindow *popup = screen->findWindow (popupWindow); XWindowChanges xwc; unsigned int valueMask = 0; valueMask |= (CWX | CWY | CWWidth | CWHeight); xwc.x = x - winWidth / 2; xwc.y = y - winHeight / 2; xwc.width = winWidth; xwc.height = winHeight; if (popup) popup->configureXWindow (valueMask, &xwc); else XConfigureWindow (::screen->dpy (), popupWindow, valueMask, &xwc); } void StaticSwitchScreen::updateWindowList () { pos = 0; move = 0; selectedWindow = windows.front (); if (popupWindow) updatePopupWindow (); } void StaticSwitchScreen::createWindowList () { windows.clear (); foreach (CompWindow *w, ::screen->windows ()) { SWITCH_WINDOW (w); if (sw->isSwitchWin ()) { windows.push_back (w); sw->cWindow->damageRectSetEnabled (sw, true); } } windows.sort (BaseSwitchScreen::compareWindows); updateWindowList (); } bool StaticSwitchWindow::damageRect (bool initial, const CompRect &rect) { return BaseSwitchWindow::damageRect (initial, rect); } BaseSwitchWindow::IconMode StaticSwitchWindow::getIconMode () { if (sScreen->optionGetIconOnly ()) return ShowIconOnly; if (!sScreen->optionGetIcon ()) return HideIcon; return ShowIcon; } bool StaticSwitchScreen::getPaintRectangle (CompWindow *w, CompRect &rect, int *opacity) { int mode; mode = optionGetHighlightRectHidden (); if (w->isViewable () || w->shaded ()) { rect = w->borderRect (); return true; } else if (mode == HighlightRectHiddenTaskbarEntry && (w->iconGeometry ().x1 () != 0 || w->iconGeometry ().y1 () != 0 || w->iconGeometry ().x2 () != 0 || w->iconGeometry ().y2 () != 0)) { rect = w->iconGeometry (); return true; } else if (mode == HighlightRectHiddenOriginalWindowPosition) { rect = w->serverBorderRect (); if (opacity) *opacity /= 4; return true; } return false; } void StaticSwitchScreen::doWindowDamage (CompWindow *w) { if (w->isViewable () || w->shaded ()) { CompositeWindow::get (w)->addDamage (); } else { CompRect box; if (getPaintRectangle (w, box, NULL)) { CompRect boxExtended (box.x () - 2, box.y () - 2, box.width () + 4, box.height () + 4); cScreen->damageRegion (CompRegion (boxExtended)); } } } void StaticSwitchScreen::handleSelectionChange (bool toNext, int nextIdx) { move = nextIdx; moreAdjust = true; } void StaticSwitchScreen::createPopup () { if (!popupWindow) { Display *dpy = ::screen->dpy (); XWMHints xwmh; XClassHint xch; Atom state[4]; int nState = 0; XSetWindowAttributes attr; Visual *visual; visual = findArgbVisual (dpy, ::screen->screenNum ()); if (!visual) return; xwmh.flags = InputHint; xwmh.input = 0; xch.res_name = (char *)"compiz"; xch.res_class = (char *)"switcher-window"; attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap (dpy, ::screen->root (), visual, AllocNone); attr.override_redirect = 1; popupWindow = XCreateWindow (dpy, ::screen->root (), -1, -1, 1, 1, 0, 32, InputOutput, visual, CWBackPixel | CWBorderPixel | CWColormap | CWOverrideRedirect, &attr); XSetWMProperties (dpy, popupWindow, NULL, NULL, programArgv, programArgc, NULL, &xwmh, &xch); state[nState++] = Atoms::winStateAbove; state[nState++] = Atoms::winStateSticky; state[nState++] = Atoms::winStateSkipTaskbar; state[nState++] = Atoms::winStateSkipPager; XChangeProperty (dpy, popupWindow, Atoms::winState, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, nState); XChangeProperty (dpy, popupWindow, Atoms::winType, XA_ATOM, 32, PropModeReplace, (unsigned char *) &Atoms::winTypeUtil, 1); ::screen->setWindowProp (popupWindow, Atoms::winDesktop, 0xffffffff); setSelectedWindowHint (false); updatePopupWindow (); } } bool StaticSwitchScreen::showPopup () { /* Always checks for an existing popup */ createPopup (); XMapWindow (::screen->dpy (), popupWindow); cScreen->damageScreen (); popupDelayTimer.stop (); return false; } Cursor StaticSwitchScreen::getCursor (bool mouseSelectOn) { if (mouseSelectOn) return ::screen->normalCursor (); return ::screen->invisibleCursor (); } void StaticSwitchScreen::initiate (SwitchWindowSelection selection, bool shouldShowPopup) { bool noSwitchWindows; bool newMouseSelect; if (::screen->otherGrabExist ("switcher", "scale", "cube", 0)) return; this->selection = selection; selectedWindow = NULL; noSwitchWindows = true; foreach (CompWindow *w, ::screen->windows ()) { if (StaticSwitchWindow::get (w)->isSwitchWin ()) { noSwitchWindows = false; break; } } if (noSwitchWindows) return; newMouseSelect = optionGetMouseSelect () && selection != Panels && shouldShowPopup; if (!grabIndex) grabIndex = ::screen->pushGrab (getCursor (newMouseSelect), "switcher"); else if (newMouseSelect != mouseSelect) ::screen->updateGrab (grabIndex, getCursor (newMouseSelect)); mouseSelect = newMouseSelect; if (grabIndex) { if (!switching) { lastActiveNum = ::screen->activeNum (); createWindowList (); if (shouldShowPopup) { unsigned int delay; delay = optionGetPopupDelay () * 1000; if (delay) { if (popupDelayTimer.active ()) popupDelayTimer.stop (); popupDelayTimer.start (boost::bind (&StaticSwitchScreen::showPopup, this), delay, delay * 1.2); } else { showPopup (); } setSelectedWindowHint (optionGetFocusOnSwitch ()); } lastActiveWindow = screen->activeWindow (); activateEvent (true); } cScreen->damageScreen (); switching = true; moreAdjust = true; ::screen->handleEventSetEnabled (this, true); cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); foreach (CompWindow *w, ::screen->windows ()) { SWITCH_WINDOW (w); sw->gWindow->glPaintSetEnabled (sw, true); } } } static bool switchTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid; xid = (Window) CompOption::getIntOptionNamed (options, "root"); if (action) action->setState (action->state () & (unsigned)~(CompAction::StateTermKey | CompAction::StateTermButton)); if (xid && xid != ::screen->root ()) return false; SWITCH_SCREEN (screen); if (ss->grabIndex) { if (ss->popupDelayTimer.active ()) ss->popupDelayTimer.stop (); if (ss->popupWindow) XUnmapWindow (::screen->dpy (), ss->popupWindow); ss->switching = false; if (state & CompAction::StateCancel) ss->selectedWindow = NULL; if (state && ss->selectedWindow && !ss->selectedWindow->destroyed ()) ::screen->sendWindowActivationRequest (ss->selectedWindow->id ()); ::screen->removeGrab (ss->grabIndex, 0); ss->grabIndex = NULL; if (!ss->popupWindow) ::screen->handleEventSetEnabled (ss, false); ss->selectedWindow = NULL; if (screen->activeWindow () != ss->lastActiveWindow) { CompWindow *w = screen->findWindow (ss->lastActiveWindow); if (w) w->moveInputFocusTo (); } ss->setSelectedWindowHint (false); ss->lastActiveNum = 0; ss->cScreen->damageScreen (); } return false; } static bool switchInitiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &options, SwitchWindowSelection selection, bool shouldShowPopup, bool nextWindow) { Window xid; xid = (Window) CompOption::getIntOptionNamed (options, "root"); if (xid != ::screen->root ()) return false; SWITCH_SCREEN (::screen); if (!ss->switching) { if (selection == Group) { CompWindow *w; Window xid; xid = (Window) CompOption::getIntOptionNamed (options, "window"); w = ::screen->findWindow (xid); if (w) ss->clientLeader = (w->clientLeader ()) ? w->clientLeader () : xid; else ss->clientLeader = None; } ss->initiate (selection, shouldShowPopup); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); if (state & CompAction::StateInitEdge) action->setState (action->state () | CompAction::StateTermEdge); else if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); } ss->switchToWindow (nextWindow, ss->optionGetAutoChangeVp (), ss->optionGetFocusOnSwitch ()); return false; } void StaticSwitchScreen::getMinimizedAndMatch (bool &minimizedOption, CompMatch *&matchOption) { minimizedOption = optionGetMinimized (); matchOption = &optionGetWindowMatch (); } bool StaticSwitchScreen::getMipmap () { return optionGetMipmap (); } void StaticSwitchScreen::windowRemove (CompWindow *w) { if (w) { bool inList = false; CompWindow *selected; CompWindow *old; SWITCH_WINDOW (w); if (!sw->isSwitchWin (true)) return; sw->cWindow->damageRectSetEnabled (sw, false); sw->gWindow->glPaintSetEnabled (sw, false); old = selected = selectedWindow; CompWindowList::iterator it = windows.begin (); while (it != windows.end ()) { if (*it == w) { inList = true; if (w == selected) { ++it; if (it == windows.end ()) selected = windows.front (); else selected = *it; --it; } CompWindowList::iterator del = it; ++it; windows.erase (del); } else ++it; } if (!inList) return; if (windows.size () == 0) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) ::screen->root ()); switchTerminate (NULL, 0, o); return; } if (!grabIndex) return; updateWindowList (); int i = 0; foreach (CompWindow *w, windows) { selectedWindow = w; move = pos = i; if (selectedWindow == selected) break; i++; } if (popupWindow) { CompWindow *popup; popup = ::screen->findWindow (popupWindow); if (popup) CompositeWindow::get (popup)->addDamage (); setSelectedWindowHint (optionGetFocusOnSwitch ()); } if (old != selectedWindow) { CompositeWindow::get (selectedWindow)->addDamage (); CompositeWindow::get (w)->addDamage (); if (old && !old->destroyed ()) CompositeWindow::get (old)->addDamage (); moreAdjust = true; } } } int StaticSwitchScreen::getRowXOffset (int y) { int retval = 0; int count = windows.size (); if (count - (y * (int)xCount) >= (int)xCount) return 0; switch (optionGetRowAlign ()) { case RowAlignLeft: break; case RowAlignCentered: retval = (xCount - count + (y * (int)xCount)) * (previewWidth + previewBorder) / 2; break; case RowAlignRight: retval = (xCount - count + (y * (int)xCount)) * (previewWidth + previewBorder); break; } return retval; } void StaticSwitchScreen::getWindowPosition (unsigned int index, int *x, int *y) { int row, column; if (index >= windows.size ()) return; column = (int)index % xCount; row = (int)index / xCount; *x = column * previewWidth + (column + 1) * previewBorder; *x += getRowXOffset (row); *y = row * previewHeight + (row + 1) * previewBorder; } CompWindow * StaticSwitchScreen::findWindowAt (int x, int y) { CompWindow *popup; popup = ::screen->findWindow (popupWindow); if (popup) { unsigned int i = 0; foreach (CompWindow *w, windows) { int x1, x2, y1, y2; getWindowPosition (i, &x1, &y1); x1 += popup->geometry ().x (); y1 += popup->geometry ().y (); x2 = x1 + previewWidth; y2 = y1 + previewHeight; if (x >= x1 && x < x2 && y >= y1 && y < y2) return w; i++; } } return NULL; } void StaticSwitchScreen::handleEvent (XEvent *event) { BaseSwitchScreen::handleEvent (event); switch (event->type) { case ButtonPress: if (grabIndex && mouseSelect) { CompWindow *selected; selected = findWindowAt (event->xbutton.x_root, event->xbutton.y_root); if (selected) { selectedWindow = selected; CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) ::screen->root ()); switchTerminate (NULL, CompAction::StateTermButton, o); } } break; default: break; } } bool StaticSwitchScreen::adjustVelocity () { float dx, adjust, amount; int count = windows.size (); dx = move - pos; if (abs (dx) > abs (dx + count)) dx += count; if (abs (dx) > abs (dx - count)) dx -= count; adjust = dx * 0.15f; amount = fabs (dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; mVelocity = (amount * mVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.001f && fabs (mVelocity) < 0.001f) { mVelocity = 0.0f; return false; } return true; } void StaticSwitchScreen::preparePaint (int msSinceLastPaint) { if (moreAdjust) { int steps; float amount, chunk; int count = windows.size (); amount = msSinceLastPaint * 0.05f * optionGetSpeed (); steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float) steps; while (steps--) { moreAdjust = adjustVelocity (); if (!moreAdjust) { pos = move; break; } pos += mVelocity * chunk; pos = fmod (pos, count); if (pos < 0.0) pos += count; } } cScreen->preparePaint (msSinceLastPaint); } void StaticSwitchScreen::paintRect (const GLMatrix &transform, CompRect &box, int offset, unsigned short *color, unsigned short opacity) { GLushort colorData[4] = { color[0], color[1], color[2], static_cast (color[3] * opacity / 100) }; GLfloat vertexData[12] = { static_cast (box.x1 () + offset), static_cast (box.y1 () + offset), 0, static_cast (box.x2 () - offset), static_cast (box.y1 () + offset), 0, static_cast (box.x2 () - offset), static_cast (box.y2 () - offset), 0, static_cast (box.x1 () + offset), static_cast (box.y2 () - offset), 0 }; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_LINE_LOOP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (transform); } bool StaticSwitchScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; if (grabIndex) { int mode; CompWindow *switcher, *zoomed; Window zoomedAbove = None; if (!popupDelayTimer.active ()) mode = optionGetHighlightMode (); else mode = HighlightModeNone; if (mode == HighlightModeBringSelectedToFront) { CompWindow *frontWindow = ::screen->clientList ().back (); zoomed = selectedWindow; if (zoomed && zoomed != frontWindow) { CompWindow *w; for (w = zoomed->prev; w && w->id () <= 1; w = w->prev) ; zoomedAbove = (w) ? w->id () : None; ::screen->unhookWindow (zoomed); ::screen->insertWindow (zoomed, frontWindow->id ()); } else { zoomed = NULL; } } else { zoomed = NULL; } ignoreSwitcher = true; status = gScreen->glPaintOutput (sAttrib, transform, region, output, mask); if (zoomed) { ::screen->unhookWindow (zoomed); ::screen->insertWindow (zoomed, zoomedAbove); } ignoreSwitcher = false; switcher = ::screen->findWindow (popupWindow); if (switcher || mode == HighlightModeShowRectangle) { GLMatrix sTransform (transform); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); if (mode == HighlightModeShowRectangle) { CompWindow *w; w = selectedWindow; if (w) { CompRect box; int opacity = 100; if (getPaintRectangle (w, box, &opacity)) { unsigned short *color; GLushort colorData[4]; GLfloat vertexData[12]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); glEnable (GL_BLEND); /* fill rectangle */ colorData[0] = optionGetHighlightColorRed (); colorData[1] = optionGetHighlightColorGreen (); colorData[2] = optionGetHighlightColorBlue (); colorData[3] = optionGetHighlightColorAlpha (); colorData[3] = colorData[3] * opacity / 100; vertexData[0] = box.x1 (); vertexData[1] = box.y2 (); vertexData[2] = 0.0f; vertexData[3] = box.x1 (); vertexData[4] = box.y1 (); vertexData[5] = 0.0f; vertexData[6] = box.x2 (); vertexData[7] = box.y2 (); vertexData[8] = 0.0f; vertexData[9] = box.x2 (); vertexData[10] = box.y1 (); vertexData[11] = 0.0f; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); /* draw outline */ glLineWidth (1.0); color = optionGetHighlightBorderColor (); paintRect (sTransform, box, 0, color, opacity); paintRect (sTransform, box, 2, color, opacity); color = optionGetHighlightBorderInlayColor (); paintRect (sTransform, box, 1, color, opacity); glDisable (GL_BLEND); } } } if (switcher) { SWITCH_WINDOW (switcher); if (!switcher->destroyed () && switcher->isViewable () && sw->cWindow->damaged ()) { sw->gWindow->glPaint (sw->gWindow->paintAttrib (), sTransform, infiniteRegion, 0); } } } } else { status = gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } return status; } void StaticSwitchScreen::donePaint () { if (grabIndex && moreAdjust) { CompWindow *w; w = ::screen->findWindow (popupWindow); if (w) CompositeWindow::get (w)->addDamage (); } else if (!grabIndex && !moreAdjust) { activateEvent (false); cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); foreach (CompWindow *w, ::screen->windows ()) { SWITCH_WINDOW (w); sw->cWindow->damageRectSetEnabled (sw, false); sw->gWindow->glPaintSetEnabled (sw, false); } } cScreen->donePaint (); } void StaticSwitchScreen::paintSelectionRect (const GLMatrix &transform, int x, int y, float dx, float dy, unsigned int opacity) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLushort colorData[4]; GLfloat vertexData[18]; GLMatrix sTransform (transform); float op; int w, h; int count = windows.size (); w = previewWidth + previewBorder; h = previewHeight + previewBorder; glEnable (GL_BLEND); if (dx > xCount - 1) op = 1.0 - MIN (1.0, dx - (xCount - 1)); else if (dx + (dy * xCount) > count - 1) op = 1.0 - MIN (1.0, dx - (count - 1 - (dy * xCount))); else if (dx < 0.0) op = 1.0 + MAX (-1.0, dx); else op = 1.0; for (unsigned int i = 0; i < 4; i++) colorData[i] = (float)fgColor[i] * opacity * op / 0xffff; sTransform.translate (x + previewBorder / 2 + (dx * w), y + previewBorder / 2 + (dy * h), 0.0f); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = -1; vertexData[1] = -1; vertexData[2] = 0; vertexData[3] = -1; vertexData[4] = 1; vertexData[5] = 0; vertexData[6] = w + 1; vertexData[7] = -1; vertexData[8] = 0; vertexData[9] = w + 1; vertexData[10] = 1; vertexData[11] = 0; streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = -1; vertexData[1] = h - 1; vertexData[2] = 0; vertexData[3] = -1; vertexData[4] = h + 1; vertexData[5] = 0; vertexData[6] = w + 1; vertexData[7] = h - 1; vertexData[8] = 0; vertexData[9] = w + 1; vertexData[10] = h + 1; vertexData[11] = 0; streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = -1; vertexData[1] = 1; vertexData[2] = 0; vertexData[3] = -1; vertexData[4] = h - 1; vertexData[5] = 0; vertexData[6] = 1; vertexData[7] = 1; vertexData[8] = 0; vertexData[9] = 1; vertexData[10] = h - 1; vertexData[11] = 0; streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = w - 1; vertexData[1] = 1; vertexData[2] = 0; vertexData[3] = w - 1; vertexData[4] = h - 1; vertexData[5] = 0; vertexData[6] = w + 1; vertexData[7] = 1; vertexData[8] = 0; vertexData[9] = w + 1; vertexData[10] = h - 1; vertexData[11] = 0; streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); glDisable (GL_BLEND); } bool StaticSwitchWindow::isSwitchWin (bool removing) { bool baseIsSwitchWin = BaseSwitchWindow::isSwitchWin (removing); if (baseIsSwitchWin && sScreen->selection == Group) { if (sScreen->clientLeader != window->clientLeader () && sScreen->clientLeader != window->id ()) return false; } return baseIsSwitchWin; } void StaticSwitchWindow::updateIconTexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, int x, int y, GLTexture *icon) { float xScale, yScale; xScale = (float) ICON_SIZE / icon->width (); yScale = (float) ICON_SIZE / icon->height (); if (xScale < yScale) yScale = xScale; else xScale = yScale; sAttrib.xScale = (float) sScreen->previewWidth * xScale / PREVIEWSIZE; sAttrib.yScale = (float) sScreen->previewWidth * yScale / PREVIEWSIZE; wx = x + sScreen->previewWidth - (sAttrib.xScale * icon->width ()); wy = y + sScreen->previewHeight - (sAttrib.yScale * icon->height ()); } void StaticSwitchWindow::updateIconNontexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, float &width, float &height, int x, int y, GLTexture *icon) { sAttrib.xScale = width / icon->width (); sAttrib.yScale = height / icon->height (); if (sAttrib.xScale < sAttrib.yScale) sAttrib.yScale = sAttrib.xScale; else sAttrib.xScale = sAttrib.yScale; width = icon->width () * sAttrib.xScale; height = icon->height () * sAttrib.yScale; wx = x + (sScreen->previewWidth / 2) - (width / 2); wy = y + (sScreen->previewHeight / 2) - (height / 2); } void StaticSwitchWindow::updateIconPos (int &wx, int &wy, int x, int y, float width, float height) { wx = x + (sScreen->previewWidth / 2) - (width / 2); wy = y + (sScreen->previewHeight / 2) - (height / 2); } void StaticSwitchWindow::paintThumb (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, int x, int y) { BaseSwitchWindow::paintThumb (attrib, transform, mask, x, y, sScreen->previewWidth, sScreen->previewHeight, sScreen->previewWidth * 3 / 4, sScreen->previewHeight * 3 / 4); } bool StaticSwitchWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; /* We are painting the switcher popup window: * Paint the popup window first and then paint * the relevant thumbnails */ if (window->id () == sScreen->popupWindow) { int x, y, offX; float px, py, pos; int count = sScreen->windows.size (); const CompWindow::Geometry &g = window->geometry (); if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK || sScreen->ignoreSwitcher) return false; status = gWindow->glPaint (attrib, transform, region, mask); if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK) && region.isEmpty ()) return true; glEnable (GL_SCISSOR_TEST); glScissor (g.x (), 0, g.width (), ::screen->height ()); unsigned int i = 0; foreach (CompWindow *w, sScreen->windows) { sScreen->getWindowPosition (i, &x, &y); StaticSwitchWindow::get (w)->paintThumb ( gWindow->lastPaintAttrib (), transform, mask, x + g.x (), y + g.y ()); i++; } pos = fmod (sScreen->pos, count); px = fmod (pos, sScreen->xCount); py = floor (pos / sScreen->xCount); offX = sScreen->getRowXOffset (py); if (pos > count - 1) { px = fmod (pos - count, sScreen->xCount); sScreen->paintSelectionRect (transform, g.x (), g.y (), px, 0.0, gWindow->lastPaintAttrib ().opacity); px = fmod (pos, sScreen->xCount); sScreen->paintSelectionRect (transform, g.x () + offX, g.y (), px, py, gWindow->lastPaintAttrib ().opacity); } if (px > sScreen->xCount - 1) { sScreen->paintSelectionRect (transform, g.x (), g.y (), px, py, gWindow->lastPaintAttrib ().opacity); py = fmod (py + 1, ceil ((double) count / sScreen->xCount)); offX = sScreen->getRowXOffset (py); sScreen->paintSelectionRect (transform, g.x () + offX, g.y (), px - sScreen->xCount, py, gWindow->lastPaintAttrib ().opacity); } else { sScreen->paintSelectionRect (transform, g.x () + offX, g.y (), px, py, gWindow->lastPaintAttrib ().opacity); } glDisable (GL_SCISSOR_TEST); } /* Adjust opacity/brightness/saturation of windows that are * not selected */ else if (sScreen->switching && !sScreen->popupDelayTimer.active () && (window != sScreen->selectedWindow)) { GLWindowPaintAttrib sAttrib (attrib); GLuint value; value = (GLuint) sScreen->optionGetSaturation (); if (value != 100) sAttrib.saturation = sAttrib.saturation * value / 100; value = (GLuint) sScreen->optionGetBrightness (); if (value != 100) sAttrib.brightness = sAttrib.brightness * value / 100; if (window->wmType () & (unsigned)~(CompWindowTypeDockMask | CompWindowTypeDesktopMask)) { value = (GLuint) sScreen->optionGetOpacity (); if (value != 100) sAttrib.opacity = sAttrib.opacity * value / 100; } status = gWindow->glPaint (sAttrib, transform, region, mask); } /* Fallback case for selected window */ else { status = gWindow->glPaint (attrib, transform, region, mask); } return status; } StaticSwitchScreen::StaticSwitchScreen (CompScreen *screen) : BaseSwitchScreen (screen), PluginClassHandler (screen), clientLeader (None), previewWidth (0), previewHeight (0), previewBorder (0), xCount (0), switching (false), mVelocity (0.0), pos (0), move (0), mouseSelect (false) { #define SWITCHBIND(a,b,c) boost::bind (switchInitiateCommon, _1, _2, _3, a, b, c) optionSetNextButtonInitiate (SWITCHBIND (CurrentViewport, true, true)); optionSetNextButtonTerminate (switchTerminate); optionSetNextKeyInitiate (SWITCHBIND (CurrentViewport, true, true)); optionSetNextKeyTerminate (switchTerminate); optionSetPrevButtonInitiate (SWITCHBIND (CurrentViewport, true, false)); optionSetPrevButtonTerminate (switchTerminate); optionSetPrevKeyInitiate (SWITCHBIND (CurrentViewport, true, false)); optionSetPrevKeyTerminate (switchTerminate); optionSetNextAllButtonInitiate (SWITCHBIND (AllViewports, true, true)); optionSetNextAllButtonTerminate (switchTerminate); optionSetNextAllKeyInitiate (SWITCHBIND (AllViewports, true, true)); optionSetNextAllKeyTerminate (switchTerminate); optionSetPrevAllButtonInitiate (SWITCHBIND (AllViewports, true, false)); optionSetPrevAllButtonTerminate (switchTerminate); optionSetPrevAllKeyInitiate (SWITCHBIND (AllViewports, true, false)); optionSetPrevAllKeyTerminate (switchTerminate); optionSetNextGroupButtonInitiate (SWITCHBIND (Group, true, true)); optionSetNextGroupButtonTerminate (switchTerminate); optionSetNextGroupKeyInitiate (SWITCHBIND (Group, true, true)); optionSetNextGroupKeyTerminate (switchTerminate); optionSetPrevGroupButtonInitiate (SWITCHBIND (Group, true, false)); optionSetPrevGroupButtonTerminate (switchTerminate); optionSetPrevGroupKeyInitiate (SWITCHBIND (Group, true, false)); optionSetPrevGroupKeyTerminate (switchTerminate); optionSetNextNoPopupButtonInitiate (SWITCHBIND (CurrentViewport, false, true)); optionSetNextNoPopupButtonTerminate (switchTerminate); optionSetNextNoPopupKeyInitiate (SWITCHBIND (CurrentViewport, false, true)); optionSetNextNoPopupKeyTerminate (switchTerminate); optionSetPrevNoPopupButtonInitiate (SWITCHBIND (CurrentViewport, false, false)); optionSetPrevNoPopupButtonTerminate (switchTerminate); optionSetPrevNoPopupKeyInitiate (SWITCHBIND (CurrentViewport, false, false)); optionSetPrevNoPopupKeyTerminate (switchTerminate); optionSetNextPanelButtonInitiate (SWITCHBIND (Panels, false, true)); optionSetNextPanelButtonTerminate (switchTerminate); optionSetNextPanelKeyInitiate (SWITCHBIND (Panels, false, true)); optionSetNextPanelKeyTerminate (switchTerminate); optionSetPrevPanelButtonInitiate (SWITCHBIND (Panels, false, false)); optionSetPrevPanelButtonTerminate (switchTerminate); optionSetPrevPanelKeyInitiate (SWITCHBIND (Panels, false, false)); optionSetPrevPanelKeyTerminate (switchTerminate); #undef SWITCHBIND ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } StaticSwitchScreen::~StaticSwitchScreen () { if (popupDelayTimer.active ()) popupDelayTimer.stop (); if (popupWindow) XDestroyWindow (::screen->dpy (), popupWindow); } StaticSwitchWindow::StaticSwitchWindow (CompWindow *window) : BaseSwitchWindow (dynamic_cast (StaticSwitchScreen::get (screen)), window), PluginClassHandler (window), sScreen (StaticSwitchScreen::get (screen)) { GLWindowInterface::setHandler (gWindow, false); CompositeWindowInterface::setHandler (cWindow, false); if (sScreen->popupWindow && sScreen->popupWindow == window->id ()) gWindow->glPaintSetEnabled (this, true); } bool StaticSwitchPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("compiztoolbox", COMPIZ_COMPIZTOOLBOX_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/staticswitcher/src/staticswitcher.h0000644000015301777760000001102612321343002026213 0ustar pbusernogroup00000000000000/* * * Compiz application switcher plugin * * staticswitcher.h * * Copyright : (C) 2008 by Danny Baumann * E-mail : maniac@compiz-fusion.org * * Based on switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include #include #include #include "staticswitcher_options.h" class StaticSwitchScreen : public BaseSwitchScreen, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler, public StaticswitcherOptions { public: StaticSwitchScreen (CompScreen *screen); ~StaticSwitchScreen (); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void updatePopupWindow (); void updateWindowList (); void createWindowList (); bool getPaintRectangle (CompWindow *w, CompRect &rect, int *opacity); void doWindowDamage (CompWindow *w); void handleSelectionChange (bool toNext, int nextIdx); void createPopup (); bool showPopup (); Cursor getCursor (bool mouseSelectOn); void initiate (SwitchWindowSelection selection, bool shouldShowPopup); void windowRemove (CompWindow *w); int getRowXOffset (int y); void getWindowPosition (unsigned int index, int *x, int *y); CompWindow *findWindowAt (int x, int y); void handleEvent (XEvent *event); bool adjustVelocity (); void paintRect (const GLMatrix &transform, CompRect &box, int offset, unsigned short *color, unsigned short opacity); void paintSelectionRect (const GLMatrix &transform, int x, int y, float dx, float dy, unsigned int opacity); void getMinimizedAndMatch (bool &minimizedOption, CompMatch *&match); bool getMipmap (); Window lastActiveWindow; CompTimer popupDelayTimer; Window clientLeader; int previewWidth; int previewHeight; int previewBorder; int xCount; bool switching; GLfloat mVelocity; float pos; float move; bool mouseSelect; }; class StaticSwitchWindow : public BaseSwitchWindow, public CompositeWindowInterface, public GLWindowInterface, public PluginClassHandler { public: StaticSwitchWindow (CompWindow *window); bool isSwitchWin (bool removing = false); bool damageRect (bool initial, const CompRect &rect); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void paintThumb (const GLWindowPaintAttrib &, const GLMatrix &, unsigned int, int, int); void updateIconTexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, int x, int y, GLTexture *icon); void updateIconNontexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, float &width, float &height, int x, int y, GLTexture *icon); void updateIconPos (int &wx, int &wy, int x, int y, float width, float height); IconMode getIconMode (); StaticSwitchScreen *sScreen; }; extern const unsigned short MAX_ICON_SIZE; extern const unsigned short PREVIEWSIZE; extern const unsigned short BORDER; #define SWITCH_SCREEN(s) \ StaticSwitchScreen *ss = StaticSwitchScreen::get (s) #define SWITCH_WINDOW(w) \ StaticSwitchWindow *sw = StaticSwitchWindow::get (w) class StaticSwitchPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/ccp/0000755000015301777760000000000012321344021017722 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/ccp/CMakeLists.txt0000644000015301777760000000062212321343002022460 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (ccp LIBRARIES compizconfig CFLAGSADD -I${CMAKE_SOURCE_DIR}/compizconfig/libcompizconfig/include) if (NOT COMPIZ_DISABLE_PLUGIN_CCP) if (COMPIZ_BUILD_WITH_RPATH) set_target_properties ( ccp PROPERTIES INSTALL_RPATH "${COMPIZCONFIG_LIBDIR}" ) endif (COMPIZ_BUILD_WITH_RPATH) endif (NOT COMPIZ_DISABLE_PLUGIN_CCP) compiz-0.9.11+14.04.20140409/plugins/ccp/src/0000755000015301777760000000000012321344021020511 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/ccp/src/ccp.h0000644000015301777760000000341012321343002021423 0ustar pbusernogroup00000000000000/* * Compiz configuration system library plugin * * Copyright (C) 2007 Dennis Kasprzyk * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ extern "C" { #include #include #include #include #include } #include #include #include class CcpScreen : public ScreenInterface, public PluginClassHandler { public: CcpScreen (CompScreen *screen); ~CcpScreen (); bool initPluginForScreen (CompPlugin *p); bool setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &v); bool timeout (); bool reload (); void setOptionFromContext (CompOption *o, const char *plugin); void setContextFromOption (CompOption *o, const char *plugin); public: CCSContext *mContext; bool mApplyingSettings; CompTimer mTimeoutTimer; CompTimer mReloadTimer; }; class CcpPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/ccp/src/ccp.cpp0000644000015301777760000002777712321343002022004 0ustar pbusernogroup00000000000000/* * Compiz configuration system library plugin * * Copyright (C) 2007 Dennis Kasprzyk * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "ccp.h" COMPIZ_PLUGIN_20090315 (ccp, CcpPluginVTable) static const unsigned short CCP_UPDATE_MIN_TIMEOUT = 250; static const unsigned short CCP_UPDATE_MAX_TIMEOUT = 4000; #define CORE_VTABLE_NAME "core" static void ccpSetValueToValue (CCSSettingValue *sv, CompOption::Value *v, CCSSettingType type) { switch (type) { case TypeInt: v->set ((int) sv->value.asInt); break; case TypeFloat: v->set ((float) sv->value.asFloat); break; case TypeBool: v->set ((bool) sv->value.asBool); break; case TypeColor: v->set ((unsigned short *) sv->value.asColor.array.array); break; case TypeString: v->set (CompString (sv->value.asString)); break; case TypeMatch: v->set (CompMatch (sv->value.asMatch)); break; case TypeKey: { CompAction action; int keycode = (sv->value.asKey.keysym == NoSymbol) ? 0 : XKeysymToKeycode (screen->dpy (), sv->value.asKey.keysym); action.setKey (CompAction::KeyBinding (keycode, sv->value.asKey.keyModMask)); v->set (action); } break; case TypeButton: { CompAction action; action.setEdgeMask (sv->value.asButton.edgeMask); action.setButton (CompAction::ButtonBinding ( sv->value.asButton.button, sv->value.asButton.buttonModMask)); v->set (action); } break; case TypeEdge: { CompAction action; action.setEdgeMask (sv->value.asEdge); v->set (action); } break; case TypeBell: { CompAction action; action.setBell (sv->value.asBell); v->set (action); } break; default: break; } } static bool ccpCCSTypeToCompizType (CCSSettingType st, CompOption::Type *ct) { switch (st) { case TypeBool: *ct = CompOption::TypeBool; break; case TypeInt: *ct = CompOption::TypeInt; break; case TypeFloat: *ct = CompOption::TypeFloat; break; case TypeColor: *ct = CompOption::TypeColor; break; case TypeString: *ct = CompOption::TypeString; break; case TypeMatch: *ct = CompOption::TypeMatch; break; case TypeKey: *ct = CompOption::TypeKey; break; case TypeButton: *ct = CompOption::TypeButton; break; case TypeEdge: *ct = CompOption::TypeEdge; break; case TypeBell: *ct = CompOption::TypeBell; break; case TypeList: *ct = CompOption::TypeList; break; default: return false; } return true; } static void ccpConvertPluginList (CCSSetting *s, CCSSettingValueList list, CompOption::Value *v) { CCSString *strCcp = (CCSString *) calloc (1, sizeof (CCSString)); CCSString *strCore = (CCSString *) calloc (1, sizeof (CCSString)); int i; strCcp->value = strdup ("ccp"); strCcp->refCount = 1; strCore->value = strdup ("core"); strCore->refCount = 1; CCSStringList sl = ccsGetStringListFromValueList (list); while (ccsStringListFind(sl, strCcp)) sl = ccsStringListRemove (sl, strCcp, TRUE); while (ccsStringListFind(sl, strCore)) sl = ccsStringListRemove (sl, strCore, TRUE); sl = ccsStringListPrepend (sl, strCcp); sl = ccsStringListPrepend (sl, strCore); CompOption::Value::Vector val (ccsStringListLength (sl)); CCSStringList l; for (l = sl, i = 0; l; l = l->next) { if (l->data) val[i].set (CompString (((CCSString *)l->data)->value)); ++i; } v->set (CompOption::TypeString, val); ccsStringListFree (sl, TRUE); } static void ccpSettingToValue (CCSSetting *s, CompOption::Value *v) { if (ccsSettingGetType (s) != TypeList) ccpSetValueToValue (ccsSettingGetValue (s), v, ccsSettingGetType (s)); else { CCSSettingValueList list; CompOption::Type type; ccsGetList (s, &list); if (!ccpCCSTypeToCompizType (ccsSettingGetInfo (s)->forList.listType, &type)) type = CompOption::TypeBool; if ((strcmp (ccsSettingGetName (s), "active_plugins") == 0) && (strcmp (ccsPluginGetName (ccsSettingGetParent (s)), CORE_VTABLE_NAME) == 0)) { ccpConvertPluginList (s, list, v); } else { int i = 0; CompOption::Value::Vector val (ccsSettingValueListLength (list)); while (list) { ccpSetValueToValue (list->data, &val[i], ccsSettingGetInfo (s)->forList.listType); list = list->next; ++i; } v->set (type, val); } } } static void ccpInitValue (CCSSettingValue *value, CompOption::Value *from, CCSSettingType type) { switch (type) { case TypeInt: value->value.asInt = from->i (); break; case TypeFloat: value->value.asFloat = from->f (); break; case TypeBool: value->value.asBool = from->b (); break; case TypeColor: { for (unsigned int i = 0; i < 4; ++i) value->value.asColor.array.array[i] = from->c ()[i]; } break; case TypeString: value->value.asString = strdup (from->s ().c_str ()); break; case TypeMatch: value->value.asMatch = strdup (from->match ().toString ().c_str ()); break; case TypeKey: if (from->action ().type () & CompAction::BindingTypeKey) { value->value.asKey.keysym = XKeycodeToKeysym (screen->dpy (), from->action ().key ().keycode (), 0); value->value.asKey.keyModMask = from->action ().key ().modifiers (); } else { value->value.asKey.keysym = 0; value->value.asKey.keyModMask = 0; } break; case TypeButton: if (from->action ().type () & CompAction::BindingTypeButton) { value->value.asButton.button = from->action ().button ().button (); value->value.asButton.buttonModMask = from->action ().button ().modifiers (); value->value.asButton.edgeMask = 0; } else if (from->action ().type () & CompAction::BindingTypeEdgeButton) { value->value.asButton.button = from->action ().button ().button (); value->value.asButton.buttonModMask = from->action ().button ().modifiers (); value->value.asButton.edgeMask = from->action ().edgeMask (); } else { value->value.asButton.button = 0; value->value.asButton.buttonModMask = 0; value->value.asButton.edgeMask = 0; } break; case TypeEdge: value->value.asEdge = from->action ().edgeMask (); break; case TypeBell: value->value.asBell = from->action ().bell (); break; default: break; } } static void ccpValueToSetting (CCSSetting *s, CompOption::Value *v) { CCSSettingValue *value = (CCSSettingValue *) calloc (1, sizeof (CCSSettingValue)); if (!value) return; value->refCount = 1; value->parent = s; if (ccsSettingGetType (s) == TypeList) { CCSSettingValue *val; foreach (CompOption::Value &lv, v->list ()) { val = (CCSSettingValue *) calloc (1, sizeof (CCSSettingValue)); if (val) { val->refCount = 1; val->parent = s; val->isListChild = TRUE; ccpInitValue (val, &lv, ccsSettingGetInfo (s)->forList.listType); value->value.asList = ccsSettingValueListAppend (value->value.asList, val); } } } else ccpInitValue (value, v, ccsSettingGetType (s)); ccsSetValue (s, value, TRUE); ccsFreeSettingValue (value); } static bool ccpTypeCheck (CCSSetting *s, CompOption *o) { CompOption::Type ot; switch (ccsSettingGetType (s)) { case TypeList: return ccpCCSTypeToCompizType (ccsSettingGetType (s), &ot) && (ot == o->type ()) && ccpCCSTypeToCompizType (ccsSettingGetInfo (s)->forList.listType, &ot) && (ot == o->value ().listType ()); break; default: return ccpCCSTypeToCompizType (ccsSettingGetType (s), &ot) && (ot == o->type ()); break; } return false; } void CcpScreen::setOptionFromContext (CompOption *o, const char *plugin) { CCSPlugin *bsp = ccsFindPlugin (mContext, (plugin) ? plugin : CORE_VTABLE_NAME); if (!bsp) return; CCSSetting *setting = ccsFindSetting (bsp, o->name ().c_str ()); if (!setting || !ccpTypeCheck (setting, o)) return; CompOption::Value value; ccpSettingToValue (setting, &value); mApplyingSettings = true; screen->setOptionForPlugin (plugin, o->name ().c_str (), value); mApplyingSettings = false; } void CcpScreen::setContextFromOption (CompOption *o, const char *plugin) { CCSPlugin *bsp = ccsFindPlugin (mContext, (plugin) ? plugin : CORE_VTABLE_NAME); if (!bsp) return; CCSSetting *setting = ccsFindSetting (bsp, o->name ().c_str ()); if (!setting || !ccpTypeCheck (setting, o)) return; ccpValueToSetting (setting, &o->value ()); ccsWriteChangedSettings (mContext); } bool CcpScreen::reload () { foreach (CompPlugin *p, CompPlugin::getPlugins ()) foreach (CompOption &o, p->vTable->getOptions ()) setOptionFromContext (&o, p->vTable->name ().c_str ()); return false; } bool CcpScreen::timeout () { ccsProcessEvents (mContext, ProcessEventsNoGlibMainLoopMask); CCSSettingList list = ccsContextStealChangedSettings (mContext); if (ccsSettingListLength (list)) { CCSSettingList l = list; CCSSetting *s; CompPlugin *p; CompOption *o; while (l) { s = l->data; l = l->next; p = CompPlugin::find (ccsPluginGetName (ccsSettingGetParent (s))); if (!p) continue; o = CompOption::findOption (p->vTable->getOptions (), ccsSettingGetName (s)); if (o) setOptionFromContext (o, ccsPluginGetName (ccsSettingGetParent (s))); ccsDebug ("Setting Update \"%s\"", ccsSettingGetName (s)); } ccsSettingListFree (list, FALSE); ccsContextClearChangedSettings (mContext); } return true; } bool CcpScreen::setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &v) { CompOption *o = NULL; CompPlugin *p; bool can_save = (!mApplyingSettings && !mReloadTimer.active ()); if (can_save) { p = CompPlugin::find (plugin); if (p) { o = CompOption::findOption (p->vTable->getOptions (), name); if (o && (o->value () == v)) o = NULL; } } bool status = screen->setOptionForPlugin (plugin, name, v); if (o && status && can_save) setContextFromOption (o, p->vTable->name ().c_str ()); return status; } bool CcpScreen::initPluginForScreen (CompPlugin *p) { bool status = screen->initPluginForScreen (p); if (status) { foreach (CompOption &opt, p->vTable->getOptions ()) setOptionFromContext (&opt, p->vTable->name ().c_str ()); } return status; } CcpScreen::CcpScreen (CompScreen *screen) : PluginClassHandler (screen), mApplyingSettings (false) { ccsSetBasicMetadata (TRUE); mContext = ccsContextNew (screen->screenNum (), &ccsDefaultInterfaceTable); ccsReadSettings (mContext); ccsContextClearChangedSettings (mContext); mReloadTimer.start (boost::bind (&CcpScreen::reload, this), 0); mTimeoutTimer.start (boost::bind (&CcpScreen::timeout, this), CCP_UPDATE_MIN_TIMEOUT, CCP_UPDATE_MAX_TIMEOUT); ScreenInterface::setHandler (screen); } CcpScreen::~CcpScreen () { ccsContextDestroy (mContext); } bool CcpPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/ccp/ccp.xml.in0000644000015301777760000000024312321343002021613 0ustar pbusernogroup00000000000000 <_short>CCP <_long>Compizconfig Settings Plugins compiz-0.9.11+14.04.20140409/plugins/workarounds/0000755000015301777760000000000012321344021021533 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/workarounds/workarounds.xml.in0000644000015301777760000001172512321343002025244 0ustar pbusernogroup00000000000000 Utility <_short>Workarounds <_long>Metacity-like workarounds. composite opengl decor animation opengl <_short>Window stickyness compiz-0.9.11+14.04.20140409/plugins/workarounds/CMakeLists.txt0000644000015301777760000000016012321343002024266 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (workarounds PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/workarounds/src/0000755000015301777760000000000012321344021022322 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/workarounds/src/workarounds.cpp0000644000015301777760000006774512321343002025425 0ustar pbusernogroup00000000000000/* * Copyright (C) 2007 Andrew Riedi * * Sticky window handling and OpenGL fixes: * Copyright (c) 2007 Dennis Kasprzyk * * Ported to Compiz 0.9: * Copyright (c) 2008 Sam Spilsbury * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public 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 plug-in for Metacity-like workarounds. */ #include "workarounds.h" bool haveOpenGL; COMPIZ_PLUGIN_20090315 (workarounds, WorkaroundsPluginVTable); /* * WorkaroundsWindow::clearInputShape * */ void WorkaroundsWindow::clearInputShape (HideInfo *hideInfo) { XRectangle *rects; int count = 0, ordering; Window xid = hideInfo->shapeWindow; rects = XShapeGetRectangles (screen->dpy (), xid, ShapeInput, &count, &ordering); if (count == 0) return; /* check if the returned shape exactly matches the window shape - * if that is true, the window currently has no set input shape */ if ((count == 1) && (rects[0].x == -window->serverGeometry ().border ()) && (rects[0].y == -window->serverGeometry ().border ()) && (rects[0].width == (window->serverGeometry ().width () + window->serverGeometry ().border ())) && (rects[0].height == (window->serverGeometry ().height () + window->serverGeometry ().border ()))) { count = 0; } if (hideInfo->inputRects) XFree (hideInfo->inputRects); hideInfo->inputRects = rects; hideInfo->nInputRects = count; hideInfo->inputRectOrdering = ordering; XShapeSelectInput (screen->dpy (), xid, NoEventMask); XShapeCombineRectangles (screen->dpy (), xid, ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); XShapeSelectInput (screen->dpy (), xid, ShapeNotifyMask); } /* * GroupWindow::restoreInputShape * */ void WorkaroundsWindow::restoreInputShape (HideInfo *info) { Window xid = info->shapeWindow; if (info->nInputRects) { XShapeCombineRectangles (screen->dpy (), xid, ShapeInput, 0, 0, info->inputRects, info->nInputRects, ShapeSet, info->inputRectOrdering); } else { XShapeCombineMask (screen->dpy (), xid, ShapeInput, 0, 0, None, ShapeSet); } if (info->inputRects) XFree (info->inputRects); XShapeSelectInput (screen->dpy (), xid, info->shapeMask); } /* * groupSetWindowVisibility * */ void WorkaroundsWindow::setVisibility (bool visible) { if (!visible && !windowHideInfo) { HideInfo *info; windowHideInfo = info = new HideInfo (); if (!windowHideInfo) return; info->inputRects = NULL; info->nInputRects = 0; info->shapeMask = XShapeInputSelected (screen->dpy (), window->id ()); /* We are a reparenting window manager now, which means that we either * shape the frame window, or if it does not exist, shape the window **/ if (window->frame ()) info->shapeWindow = window->frame (); else info->shapeWindow = window->id (); clearInputShape (info); info->skipState = window->state () & (CompWindowStateSkipPagerMask | CompWindowStateSkipTaskbarMask); } else if (visible && windowHideInfo) { HideInfo *info = windowHideInfo; restoreInputShape (info); XShapeSelectInput (screen->dpy (), window->id (), info->shapeMask); delete info; windowHideInfo = NULL; } cWindow->addDamage (); gWindow->glPaintSetEnabled (this, !visible); } bool WorkaroundsWindow::isGroupTransient (Window clientLeader) { if (!clientLeader) return false; if (window->transientFor () == None || window->transientFor () == screen->root ()) { if (window->type () & (CompWindowTypeUtilMask | CompWindowTypeToolbarMask | CompWindowTypeMenuMask | CompWindowTypeDialogMask | CompWindowTypeModalDialogMask)) { if (window->clientLeader () == clientLeader) return true; } } return false; } void WorkaroundsWindow::minimize () { if (!window->managed ()) return; if (!isMinimized) { WORKAROUNDS_SCREEN (screen); unsigned long data[2]; int state = IconicState; CompOption::Vector propTemplate = ws->inputDisabledAtom.getReadTemplate (); CompOption::Value enabled = CompOption::Value (true); screen->handleCompizEventSetEnabled (ws, true); window->windowNotify (CompWindowNotifyMinimize); window->changeState (window->state () | CompWindowStateHiddenMask); foreach (CompWindow *w, screen->windows ()) { if (w->transientFor () == window->id () || WorkaroundsWindow::get (w)->isGroupTransient (window->clientLeader ())) w->unminimize (); } window->windowNotify (CompWindowNotifyHide); setVisibility (false); /* HACK ATTACK */ data[0] = state; data[1] = None; XChangeProperty (screen->dpy (), window->id (), Atoms::wmState, Atoms::wmState, 32, PropModeReplace, (unsigned char *) data, 2); propTemplate.at (0).set (enabled); ws->inputDisabledAtom.updateProperty (window->id (), propTemplate, XA_CARDINAL); isMinimized = true; } } void WorkaroundsWindow::unminimize () { if (isMinimized) { WORKAROUNDS_SCREEN (screen); unsigned long data[2]; int state = NormalState; CompOption::Vector propTemplate = ws->inputDisabledAtom.getReadTemplate (); CompOption::Value enabled = CompOption::Value (false); window->windowNotify (CompWindowNotifyUnminimize); window->changeState (window->state () & ~CompWindowStateHiddenMask); isMinimized = false; window->windowNotify (CompWindowNotifyShow); setVisibility (true); if (!ws->skipTransients) { foreach (CompWindow *w, screen->windows ()) { if (w->transientFor () == window->id () || WorkaroundsWindow::get (w)->isGroupTransient (window->clientLeader ())) w->unminimize (); } } /* HACK ATTACK */ data[0] = state; data[1] = None; XChangeProperty (screen->dpy (), window->id (), Atoms::wmState, Atoms::wmState, 32, PropModeReplace, (unsigned char *) data, 2); propTemplate.at (0).set (enabled); ws->inputDisabledAtom.updateProperty (window->id (), propTemplate, XA_CARDINAL); } } bool WorkaroundsWindow::minimized () const { return isMinimized; } bool WorkaroundsWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (isMinimized) { WORKAROUNDS_SCREEN (screen); bool doMask = true; foreach (CompWindow *w, ws->minimizingWindows) { if (w->id () == window->id ()) doMask = false; break; } if (doMask) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; } return gWindow->glPaint (attrib, transform, region, mask); } bool WorkaroundsWindow::damageRect (bool initial, const CompRect &rect) { if (initial) cWindow->addDamage (true); cWindow->damageRectSetEnabled (this, false); return cWindow->damageRect (initial, rect); } void WorkaroundsScreen::checkFunctions (bool checkWindow, bool checkScreen) { if (haveOpenGL && optionGetForceGlxSync () && checkScreen) { gScreen->glPaintOutputSetEnabled (this, true); } else if (haveOpenGL && checkScreen) { gScreen->glPaintOutputSetEnabled (this, false); } if (haveOpenGL && optionGetForceSwapBuffers () && checkScreen) { cScreen->preparePaintSetEnabled (this, true); } else if (haveOpenGL && checkScreen) { cScreen->preparePaintSetEnabled (this, false); } if ((optionGetLegacyFullscreen () || optionGetFirefoxMenuFix () || optionGetOooMenuFix () || optionGetNotificationDaemonFix () || optionGetJavaFix () || optionGetQtFix () || optionGetConvertUrgency () ) && checkScreen) { screen->handleEventSetEnabled (this, true); } else if (checkScreen) { screen->handleEventSetEnabled (this, false); } if (checkWindow) { bool legacyFullscreen = optionGetLegacyFullscreen (); bool keepMinimized = optionGetKeepMinimizedWindows (); foreach (CompWindow *w, screen->windows ()) { WORKAROUNDS_WINDOW (w); bool m = ww->window->minimized (); ww->window->getAllowedActionsSetEnabled (ww, legacyFullscreen); ww->window->resizeNotifySetEnabled (ww, legacyFullscreen); if (m) ww->window->unminimize (); ww->window->minimizeSetEnabled (ww, keepMinimized); ww->window->unminimizeSetEnabled (ww, keepMinimized); ww->window->minimizedSetEnabled (ww, keepMinimized); if (m) ww->window->minimize (); } } } void WorkaroundsScreen::addToFullscreenList (CompWindow *w) { mfwList.push_back (w->id ()); } void WorkaroundsScreen::removeFromFullscreenList (CompWindow *w) { mfwList.remove (w->id ()); } #ifndef USE_GLES static void workaroundsProgramEnvParameter4f (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { WorkaroundsScreen *ws; GLdouble data[4]; ws = WorkaroundsScreen::get (screen); data[0] = x; data[1] = y; data[2] = z; data[3] = w; (*ws->programEnvParameter4dv) (target, index, data); } #endif void WorkaroundsScreen::updateParameterFix () { #ifndef USE_GLES if (!GL::programEnvParameter4f || !programEnvParameter4dv) return; if (optionGetAiglxFragmentFix ()) GL::programEnvParameter4f = workaroundsProgramEnvParameter4f; else GL::programEnvParameter4f = origProgramEnvParameter4f; #endif } void WorkaroundsScreen::updateVideoSyncFix () { #ifndef USE_GLES if ((!GL::getVideoSync || origGetVideoSync) || (!GL::waitVideoSync || origWaitVideoSync)) return; if (optionGetNoWaitForVideoSync ()) { GL::getVideoSync = NULL; GL::waitVideoSync = NULL; } else { GL::getVideoSync = origGetVideoSync; GL::waitVideoSync = origWaitVideoSync; } #endif } void WorkaroundsScreen::preparePaint (int ms) { if (optionGetForceSwapBuffers ()) cScreen->damageScreen (); // Massive CPU usage here cScreen->preparePaint (ms); } bool WorkaroundsScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { #ifndef USE_GLES if (optionGetForceGlxSync ()) glXWaitX (); #endif return gScreen->glPaintOutput (attrib, transform, region, output, mask); } CompString WorkaroundsWindow::getRoleAtom () { Atom type; unsigned long nItems; unsigned long bytesAfter; unsigned char *str = NULL; int format, result; CompString retval; WORKAROUNDS_SCREEN (screen); result = XGetWindowProperty (screen->dpy (), window->id (), ws->roleAtom, 0, LONG_MAX, FALSE, XA_STRING, &type, &format, &nItems, &bytesAfter, (unsigned char **) &str); if (result != Success) return ""; if (type != XA_STRING) { XFree (str); return ""; } retval = CompString ((const char *) str); return retval; } void WorkaroundsWindow::removeSticky () { if (window->state () & CompWindowStateStickyMask && madeSticky) window->changeState (window->state () & ~CompWindowStateStickyMask); madeSticky = FALSE; } void WorkaroundsWindow::updateSticky () { Bool makeSticky = FALSE; WORKAROUNDS_SCREEN (screen); if (ws->optionGetStickyAlldesktops () && window->desktop () == 0xffffffff && ws->optionGetAlldesktopStickyMatch ().evaluate (window)) makeSticky = TRUE; if (makeSticky) { if (!(window->state () & CompWindowStateStickyMask)) { madeSticky = TRUE; window->changeState ( window->state () | CompWindowStateStickyMask); } } else removeSticky (); } void WorkaroundsWindow::updateUrgencyState () { Bool urgent; XWMHints *xwmh; xwmh = XGetWMHints (screen->dpy (), window->id ()); if (!xwmh) { XFree (xwmh); return; } urgent = (xwmh->flags & XUrgencyHint); XFree (xwmh); if (urgent) { madeDemandAttention = TRUE; window->changeState (window->state () | CompWindowStateDemandsAttentionMask); } else if (madeDemandAttention) { madeDemandAttention = FALSE; window->changeState (window->state () & ~CompWindowStateDemandsAttentionMask); } } /* Use this function to forcibly refresh java window properties when they * have been unmarked as transient. This is just a copy of * PrivateScreen::setWindowState. I would use CompWindow::changeState, but * it checks whether oldstate==newstate */ void WorkaroundsScreen::setWindowState (unsigned int state, Window id) { int i = 0; Atom data[32]; i = compiz::window::fillStateData (state, data); XChangeProperty (screen->dpy (), id, Atoms::winState, XA_ATOM, 32, PropModeReplace, (unsigned char *) data, i); } void WorkaroundsWindow::getAllowedActions (unsigned int &setActions, unsigned int &clearActions) { window->getAllowedActions (setActions, clearActions); if (isFullscreen) setActions |= CompWindowActionFullscreenMask; } void WorkaroundsWindow::fixupFullscreen () { Bool isFullSize; BoxPtr box; WORKAROUNDS_SCREEN (screen); if (!ws->optionGetLegacyFullscreen ()) return; if (window->wmType () & CompWindowTypeDesktopMask) { /* desktop windows are implicitly fullscreen */ isFullSize = FALSE; } else { /* get output region for window */ int output = screen->outputDeviceForGeometry (window->geometry ()); box = &screen->outputDevs ().at (output).region ()->extents; /* does the size match the output rectangle? */ isFullSize = (window->serverX () == box->x1) && (window->serverY () == box->y1) && (window->serverWidth () == (box->x2 - box->x1)) && (window->serverHeight () == (box->y2 - box->y1)); /* if not, check if it matches the whole screen */ if (!isFullSize) { if ((window->serverX () == 0) && (window->serverY () == 0) && (window->serverWidth () == screen->width ()) && (window->serverHeight () == screen->height ())) { isFullSize = TRUE; } } } isFullscreen = isFullSize; if (isFullSize && !(window->state () & CompWindowStateFullscreenMask)) { unsigned int state = window->state () & ~CompWindowStateFullscreenMask; if (isFullSize) state |= CompWindowStateFullscreenMask; madeFullscreen = isFullSize; if (state != window->state ()) { window->changeState (state); window->updateAttributes (CompStackingUpdateModeNormal); /* keep track of windows that we interact with */ ws->addToFullscreenList (window); } } else if (!isFullSize && !ws->mfwList.empty () && (window->state () & CompWindowStateFullscreenMask)) { /* did we set the flag? */ foreach (Window mfw, ws->mfwList) { if (mfw == window->id ()) { unsigned int state = window->state () & ~CompWindowStateFullscreenMask; if (isFullSize) state |= CompWindowStateFullscreenMask; madeFullscreen = isFullSize; if (state != window->state ()) { window->changeState (state); window->updateAttributes (CompStackingUpdateModeNormal); } ws->removeFromFullscreenList (window); break; } } } } void WorkaroundsWindow::updateFixedWindow (unsigned int newWmType) { if (newWmType != window->wmType ()) { adjustedWinType = TRUE; oldWmType = window->wmType (); window->recalcType (); window->recalcActions (); screen->matchPropertyChanged (window); window->wmType () = newWmType; } } unsigned int WorkaroundsWindow::getFixedWindowType () { unsigned int newWmType; XClassHint classHint; CompString resName; WORKAROUNDS_SCREEN (screen); newWmType = window->wmType (); if (!XGetClassHint (screen->dpy (), window->id (), &classHint)) return newWmType; if (classHint.res_name) { resName = CompString (classHint.res_name); XFree (classHint.res_name); } if (classHint.res_class) { XFree (classHint.res_class); } /* FIXME: Is this the best way to detect a notification type window? */ if (ws->optionGetNotificationDaemonFix ()) { if (newWmType == CompWindowTypeNormalMask && window->overrideRedirect () && !resName.empty () && resName.compare("notification-daemon") == 0) { newWmType = CompWindowTypeNotificationMask; return newWmType; } } if (ws->optionGetFirefoxMenuFix ()) { if (newWmType == CompWindowTypeNormalMask && window->overrideRedirect () && !resName.empty ()) { if ((resName.compare ( "gecko") == 0) || (resName.compare ( "popup") == 0)) { newWmType = CompWindowTypeDropdownMenuMask; return newWmType; } } } if (ws->optionGetOooMenuFix ()) { if (newWmType == CompWindowTypeNormalMask && window->overrideRedirect () && !resName.empty ()) { if (resName.compare ( "VCLSalFrame") == 0) { newWmType = CompWindowTypeDropdownMenuMask; return newWmType; } } } /* FIXME: Basic hack to get Java windows working correctly. */ if (ws->optionGetJavaFix () && !resName.empty ()) { if ((resName.compare ( "sun-awt-X11-XMenuWindow") == 0) || (resName.compare ( "sun-awt-X11-XWindowPeer") == 0)) { newWmType = CompWindowTypeDropdownMenuMask; return newWmType; } else if (resName.compare ( "sun-awt-X11-XDialogPeer") == 0) { newWmType = CompWindowTypeDialogMask; return newWmType; } else if (resName.compare ( "sun-awt-X11-XFramePeer") == 0) { newWmType = CompWindowTypeNormalMask; return newWmType; } } if (ws->optionGetQtFix ()) { CompString windowRole; /* fix tooltips */ windowRole = getRoleAtom (); if (!windowRole.empty ()) { if ((windowRole.compare ("toolTipTip") == 0) || (windowRole.compare ("qtooltip_label") == 0)) { newWmType = CompWindowTypeTooltipMask; return newWmType; } } /* fix Qt transients - FIXME: is there a better way to detect them? */ if (resName.empty () && window->overrideRedirect () && (window->windowClass () == InputOutput) && (newWmType == CompWindowTypeUnknownMask)) { newWmType = CompWindowTypeDropdownMenuMask; return newWmType; } } return newWmType; } void WorkaroundsScreen::optionChanged (CompOption *opt, WorkaroundsOptions::Options num) { checkFunctions (true, true); foreach (CompWindow *w, screen->windows ()) WorkaroundsWindow::get (w)->updateSticky (); #ifndef USE_GLES if (haveOpenGL) { updateParameterFix (); updateVideoSyncFix (); if (optionGetFglrxXglFix ()) GL::copySubBuffer = NULL; else GL::copySubBuffer = origCopySubBuffer; } #endif if (optionGetKeepMinimizedWindows ()) { foreach (CompWindow *window, screen->windows ()) { WORKAROUNDS_WINDOW (window); bool m = window->minimized (); if (m) window->unminimize (); window->minimizeSetEnabled (ww, true); window->unminimizeSetEnabled (ww, true); window->minimizedSetEnabled (ww, true); if (m) window->minimize (); } } else { foreach (CompWindow *window, screen->windows ()) { WORKAROUNDS_WINDOW (window); bool m = window->minimized (); if (m) window->unminimize (); window->minimizeSetEnabled (ww, false); window->unminimizeSetEnabled (ww, false); window->minimizedSetEnabled (ww, false); if (m) { ww->isMinimized = false; window->minimize (); } } } } void WorkaroundsScreen::handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &o) { if (strncmp (pluginName, "animation", 9) == 0 && strncmp (eventName, "window_animation", 16) == 0) { if (CompOption::getStringOptionNamed (o, "type", "") == "minimize") { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed ( o, "window", 0)); if (w) { if (CompOption::getBoolOptionNamed (o, "active", false)) minimizingWindows.push_back (w); else minimizingWindows.remove (w); } } } if (!CompOption::getBoolOptionNamed (o, "active", false) && minimizingWindows.empty ()) screen->handleCompizEventSetEnabled (this, false); screen->handleCompizEvent (pluginName, eventName, o); } void WorkaroundsScreen::handleEvent (XEvent *event) { CompWindow *w; switch (event->type) { case ConfigureRequest: w = screen->findWindow (event->xconfigurerequest.window); if (w) { WORKAROUNDS_WINDOW (w); if (ww->madeFullscreen) w->changeState (w->state () &= ~CompWindowStateFullscreenMask); } break; case MapRequest: w = screen->findWindow (event->xmaprequest.window); if (w) { WORKAROUNDS_WINDOW (w); ww->updateSticky (); ww->updateFixedWindow (ww->getFixedWindowType ()); ww->fixupFullscreen (); } break; case MapNotify: w = screen->findWindow (event->xmap.window); if (w && w->overrideRedirect ()) { WORKAROUNDS_WINDOW (w); ww->updateFixedWindow (ww->getFixedWindowType ()); } break; case DestroyNotify: w = screen->findWindow (event->xdestroywindow.window); if (w) removeFromFullscreenList (w); break; } screen->handleEvent (event); switch (event->type) { case ConfigureRequest: w = screen->findWindow (event->xconfigurerequest.window); if (w) { WORKAROUNDS_WINDOW (w); if (ww->madeFullscreen) w->state () |= CompWindowStateFullscreenMask; } break; case ClientMessage: if (event->xclient.message_type == Atoms::winDesktop) { w = screen->findWindow (event->xclient.window); if (w) { WORKAROUNDS_WINDOW (w); ww->updateSticky (); } } break; case PropertyNotify: if ((event->xproperty.atom == XA_WM_CLASS) || (event->xproperty.atom == Atoms::winType)) { w = screen->findWindow (event->xproperty.window); if (w) { WORKAROUNDS_WINDOW (w); ww->updateFixedWindow (ww->getFixedWindowType ()); } } else if (event->xproperty.atom == XA_WM_HINTS) { if (optionGetConvertUrgency ()) { w = screen->findWindow (event->xproperty.window); if (w) { WORKAROUNDS_WINDOW (w); ww->updateUrgencyState (); } } } else if (event->xproperty.atom == Atoms::clientList) { if (optionGetJavaTaskbarFix ()) { foreach (CompWindow *w, screen->windows ()) { if (w->managed ()) setWindowState (w->state (), w->id ()); } } } break; default: break; } } void WorkaroundsWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { if (window->isViewable ()) fixupFullscreen (); window->resizeNotify (dx, dy, dwidth, dheight); } WorkaroundsScreen::WorkaroundsScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), roleAtom (XInternAtom (screen->dpy (), "WM_WINDOW_ROLE", 0)), skipTransients (false) { CompOption::Vector propTemplate; ScreenInterface::setHandler (screen, false); if (haveOpenGL) { CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } propTemplate.push_back (CompOption ("enabled", CompOption::TypeBool)); inputDisabledAtom = PropertyWriter ("COMPIZ_NET_WM_INPUT_DISABLED", propTemplate); optionSetStickyAlldesktopsNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); optionSetAlldesktopStickyMatchNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); optionSetAiglxFragmentFixNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); optionSetFglrxXglFixNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); optionSetForceSwapBuffersNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); optionSetNoWaitForVideoSyncNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); optionSetKeepMinimizedWindowsNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); #ifndef USE_GLES if (haveOpenGL) { origProgramEnvParameter4f = GL::programEnvParameter4f; programEnvParameter4dv = (GLProgramParameter4dvProc) gScreen->getProcAddress ("glProgramEnvParameter4dvARB"); origCopySubBuffer = GL::copySubBuffer; origGetVideoSync = GL::getVideoSync; origWaitVideoSync = GL::waitVideoSync; updateParameterFix (); updateVideoSyncFix (); } if (optionGetFglrxXglFix () && haveOpenGL) GL::copySubBuffer = NULL; #endif checkFunctions (false, true); } WorkaroundsScreen::~WorkaroundsScreen () { #ifndef USE_GLES if (haveOpenGL) { GL::copySubBuffer = origCopySubBuffer; GL::getVideoSync = origGetVideoSync; GL::waitVideoSync = origWaitVideoSync; } #endif } WorkaroundsWindow::WorkaroundsWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), adjustedWinType (false), madeSticky (false), madeFullscreen (false), isFullscreen (false), madeDemandAttention (false), isMinimized (window->minimized ()), oldWmType (window->wmType ()), windowHideInfo (NULL) { WindowInterface::setHandler (window, false); GLWindowInterface::setHandler (gWindow, false); WORKAROUNDS_SCREEN (screen); if (ws->optionGetInitialDamageCompleteRedraw ()) CompositeWindowInterface::setHandler (cWindow); if (ws->optionGetLegacyFullscreen ()) { window->getAllowedActionsSetEnabled (this, false); window->resizeNotifySetEnabled (this, false); } if (ws->optionGetKeepMinimizedWindows ()) { window->minimizeSetEnabled (this, true); window->unminimizeSetEnabled (this, true); window->minimizedSetEnabled (this, true); } } WorkaroundsWindow::~WorkaroundsWindow () { WORKAROUNDS_SCREEN (screen); /* It is not safe to loop the whole window list at this point * to _also_ unminimize transient windows because this could * be the plugin tear-down stage and other WorkaroundWindow * structures could be destroyed. * * It is ok to skip transients in this case, since it is likely * that we will be unminimizing every single window as * WorkaroundsWindow is destroyed (in the case that the window * itself has been destroyed while the plugin is enabled, this * is not much of a problem since the transient windows go with * the destroyed window in this case) * * FIXME: We need a ::fini stage before we do this! */ ws->skipTransients = true; if (isMinimized) { unminimize (); window->minimizeSetEnabled (this, false); window->unminimizeSetEnabled (this, false); window->minimizedSetEnabled (this, false); window->minimize (); } if (!window->destroyed ()) { if (adjustedWinType) { window->wmType () = oldWmType; window->recalcType (); window->recalcActions (); } if (window->state () & CompWindowStateStickyMask && madeSticky) { window->state () &= ~CompWindowStateStickyMask; } } ws->skipTransients = false; } bool WorkaroundsPluginVTable::init () { if (CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) haveOpenGL = true; else haveOpenGL = false; if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/workarounds/src/workarounds.h0000644000015301777760000001125612321343002025054 0ustar pbusernogroup00000000000000/* * Copyright (C) 2007 Andrew Riedi * * Sticky window handling and OpenGL fixes: * Copyright (c) 2007 Dennis Kasprzyk * * Ported to Compiz 0.9: * Copyright (c) 2008 Sam Spilsbury * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public 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 plug-in for Metacity-like workarounds. */ #include #include #include #include #include #include #include #include #include #include "workarounds_options.h" extern bool haveOpenGL; #ifndef USE_GLES typedef void (*GLProgramParameter4dvProc) (GLenum target, GLuint index, const GLdouble *data); #endif class WorkaroundsScreen : public PluginClassHandler , public ScreenInterface, public GLScreenInterface, public CompositeScreenInterface, public WorkaroundsOptions { public: WorkaroundsScreen (CompScreen *); ~WorkaroundsScreen (); CompositeScreen *cScreen; GLScreen *gScreen; Atom roleAtom; std::list mfwList; CompWindowList minimizingWindows; bool skipTransients; PropertyWriter inputDisabledAtom; #ifndef USE_GLES GL::GLProgramParameter4fProc origProgramEnvParameter4f; GLProgramParameter4dvProc programEnvParameter4dv; GL::GLXGetVideoSyncProc origGetVideoSync; GL::GLXWaitVideoSyncProc origWaitVideoSync; GL::GLXCopySubBufferProc origCopySubBuffer; #endif void handleEvent (XEvent *); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &o); void addToFullscreenList (CompWindow *w); void removeFromFullscreenList (CompWindow *w); void updateParameterFix (); void updateVideoSyncFix (); void optionChanged (CompOption *opt, WorkaroundsOptions::Options num); void checkFunctions (bool window, bool screen); void setWindowState (unsigned int state, Window id); }; #define WORKAROUNDS_SCREEN(s) \ WorkaroundsScreen *ws = WorkaroundsScreen::get (s) class WorkaroundsWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: typedef struct _HideInfo { Window shapeWindow; unsigned long skipState; unsigned long shapeMask; XRectangle *inputRects; int nInputRects; int inputRectOrdering; } HideInfo; public: WorkaroundsWindow (CompWindow *); ~WorkaroundsWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool adjustedWinType; bool madeSticky; bool madeFullscreen; bool isFullscreen; bool madeDemandAttention; bool isMinimized; unsigned int oldWmType; HideInfo *windowHideInfo; bool isGroupTransient (Window); void resizeNotify (int, int, int, int); void getAllowedActions (unsigned int &, unsigned int &); void minimize (); void unminimize (); bool minimized () const; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void setVisibility (bool); void restoreInputShape (HideInfo *); void clearInputShape (HideInfo *); void removeSticky (); CompString getRoleAtom (); void updateSticky (); void updateUrgencyState (); void fixupFullscreen (); void updateFixedWindow (unsigned int newWmType); unsigned int getFixedWindowType (); bool damageRect (bool initial, const CompRect &rect); }; #define WORKAROUNDS_WINDOW(w) \ WorkaroundsWindow *ww = WorkaroundsWindow::get (w) class WorkaroundsPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/winrules/0000755000015301777760000000000012321344021021025 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/winrules/winrules.xml.in0000644000015301777760000000700012321343002024017 0ustar pbusernogroup00000000000000 <_short>Window Rules <_long>Set windows rules Window Management opengl composite decor regex <_short>Matches <_short>Size rules <_short>Fixed Size Windows compiz-0.9.11+14.04.20140409/plugins/winrules/CMakeLists.txt0000644000015301777760000000012112321343002023555 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (winrules) compiz-0.9.11+14.04.20140409/plugins/winrules/src/0000755000015301777760000000000012321344021021614 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/winrules/src/winrules.h0000644000015301777760000000541612321343002023641 0ustar pbusernogroup00000000000000/* * winrules plugin for compiz * * Copyright (C) 2007 Bellegarde Cedric (gnumdk (at) gmail.com) * Copyright (C) 2009 Sam Spilsbury (smspillaz@gmail.com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "winrules_options.h" class WinrulesScreen : public PluginClassHandler , public WinrulesOptions, public ScreenInterface { public: WinrulesScreen (CompScreen *screen); void handleEvent (XEvent *event); void matchExpHandlerChanged (); void matchPropertyChanged (CompWindow *w); void setProtocols (unsigned int protocols, Window id); void optionChanged (CompOption *option, WinrulesOptions::Options num); }; #define WINRULES_SCREEN(screen) \ WinrulesScreen *ws = WinrulesScreen::get(screen); class WinrulesWindow : public PluginClassHandler , public WindowInterface { public: WinrulesWindow (CompWindow *window); CompWindow *window; void getAllowedActions (unsigned int &, unsigned int &); bool is (); void setNoFocus (int optNum); void setNoAlpha (int optNum); void updateState (int optNum, int mask); void setAllowedActions (int optNum, int action); bool matchSizeValue (CompOption::Value::Vector matches, CompOption::Value::Vector widthValues, CompOption::Value::Vector heightValues, int *width, int *height); bool matchSize (int *width, int *height); void updateWindowSize (int width, int height); bool applyRules (); bool alpha () const; bool isFocussable () const; bool focus (); unsigned int allowedActions; unsigned int stateSetMask; unsigned int protocolSetMask; }; #define WINRULES_WINDOW(window) \ WinrulesWindow *ww = WinrulesWindow::get(window); class WinrulesPluginVTable: public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/winrules/src/winrules.cpp0000644000015301777760000003171712321343002024177 0ustar pbusernogroup00000000000000/* * winrules plugin for compiz * * Copyright (C) 2007 Bellegarde Cedric (gnumdk (at) gmail.com) * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "winrules.h" COMPIZ_PLUGIN_20090315 (winrules, WinrulesPluginVTable); void WinrulesScreen::setProtocols (unsigned int protocols, Window id) { Atom protocol[4]; int count = 0; if (protocols & CompWindowProtocolDeleteMask) protocol[count++] = Atoms::wmDeleteWindow; if (protocols & CompWindowProtocolTakeFocusMask) protocol[count++] = Atoms::wmTakeFocus; if (protocols & CompWindowProtocolPingMask) protocol[count++] = Atoms::wmPing; if (protocols & CompWindowProtocolSyncRequestMask) protocol[count++] = Atoms::wmSyncRequest; XSetWMProtocols (screen->dpy (), id, protocol, count); } bool WinrulesWindow::is () { if (window->overrideRedirect ()) return false; if (window->wmType () & CompWindowTypeDesktopMask) return false; return true; } bool WinrulesWindow::isFocussable () const { window->isFocussable (); return false; // We only want to return false else where we are not wrapped } bool WinrulesWindow::focus () { window->focus (); return false; // We only want to return false for the window we are wrapped } bool WinrulesWindow::alpha () const { window->alpha (); return false; // We only want to return false else where we are not wrapped } void WinrulesWindow::setNoFocus (int optNum) { unsigned int newProtocol = window->protocols (); WINRULES_SCREEN (screen); if (!is ()) return; if (ws->getOptions ().at (optNum). value ().match ().evaluate (window)) { if (window->protocols () & CompWindowProtocolTakeFocusMask) { protocolSetMask |= (window->protocols () & CompWindowProtocolTakeFocusMask); newProtocol = window->protocols () & ~CompWindowProtocolTakeFocusMask; } window->isFocussableSetEnabled (this, true);// causes w->isFocussable () // to return false window->focusSetEnabled (this, true); // causes w->focus () to return // false for this window } else if ((protocolSetMask & CompWindowProtocolTakeFocusMask)) { newProtocol = window->protocols () | (protocolSetMask & CompWindowProtocolTakeFocusMask); protocolSetMask &= ~CompWindowProtocolTakeFocusMask; window->isFocussableSetEnabled (this, false); window->focusSetEnabled (this, false); } if (newProtocol != window->protocols ()) { ws->setProtocols (newProtocol, window->id ()); } } void WinrulesWindow::setNoAlpha (int optNum) { WINRULES_SCREEN (screen); if (!is ()) return; if (ws->getOptions ().at (optNum). value ().match ().evaluate (window)) { window->alphaSetEnabled (this, true); // Causes w->alpha () to return // false } else { window->alphaSetEnabled (this, false); } } void WinrulesWindow::updateState (int optNum, int mask) { unsigned int newState = window->state (); WINRULES_SCREEN (screen); if (!is ()) return; if (ws->getOptions ().at (optNum). value ().match ().evaluate (window)) { newState |= mask; newState = window->constrainWindowState (newState, window->actions ()); stateSetMask |= (newState & mask); } else if (stateSetMask & mask) { newState &= ~mask; stateSetMask &= ~mask; } if (newState != window->state ()) { window->changeState (newState); if (mask & (CompWindowStateFullscreenMask | CompWindowStateAboveMask | CompWindowStateBelowMask )) window->updateAttributes (CompStackingUpdateModeNormal); else window->updateAttributes (CompStackingUpdateModeNone); } } void WinrulesWindow::setAllowedActions (int optNum, int action) { WINRULES_SCREEN (screen); if (!is ()) return; if (ws->getOptions ().at (optNum). value ().match ().evaluate (window)) allowedActions &= ~action; else if (!(allowedActions & action)) allowedActions |= action; window->recalcActions (); } bool WinrulesWindow::matchSizeValue (CompOption::Value::Vector matches, CompOption::Value::Vector widthValues, CompOption::Value::Vector heightValues, int *width, int *height) { int min; if (!is ()) return false; if (window->type () & CompWindowTypeDesktopMask) return false; min = MIN (matches.size (), widthValues.size ()); min = MIN ((unsigned int) min, heightValues.size ()); min = MIN ((unsigned int) min, matches.size ()); for (int i = 0; i < min; i++) { if ((matches.at (i).match ().evaluate (window))) { *width = widthValues.at (i).i (); *height = heightValues.at (i).i (); return true; } } return false; } bool WinrulesWindow::matchSize (int *width, int *height) { WINRULES_SCREEN (screen); return matchSizeValue (ws->optionGetSizeMatches (), ws->optionGetSizeWidthValues (), ws->optionGetSizeHeightValues (), width, height); } void WinrulesWindow::updateWindowSize (int width, int height) { XWindowChanges xwc; unsigned int xwcm = 0; if (width != window->serverWidth ()) xwcm |= CWWidth; if (height != window->serverHeight ()) xwcm |= CWHeight; xwc.width = width; xwc.height = height; if (window->mapNum () && xwcm) window->sendSyncRequest (); window->configureXWindow (xwcm, &xwc); } void WinrulesScreen::optionChanged (CompOption *option, WinrulesOptions::Options num) { unsigned int updateStateMask = 0, updateActionsMask = 0; switch (num) { case WinrulesOptions::SkiptaskbarMatch: updateStateMask = CompWindowStateSkipTaskbarMask; break; case WinrulesOptions::SkippagerMatch: updateStateMask = CompWindowStateSkipPagerMask; break; case WinrulesOptions::AboveMatch: updateStateMask = CompWindowStateAboveMask; break; case WinrulesOptions::BelowMatch: updateStateMask = CompWindowStateBelowMask; break; case WinrulesOptions::StickyMatch: updateStateMask = CompWindowStateStickyMask; break; case WinrulesOptions::FullscreenMatch: updateStateMask = CompWindowStateFullscreenMask; break; case WinrulesOptions::MaximizeMatch: updateStateMask = CompWindowStateMaximizedHorzMask | CompWindowStateMaximizedVertMask; break; case WinrulesOptions::NoMoveMatch: updateActionsMask = CompWindowActionMoveMask; break; case WinrulesOptions::NoResizeMatch: updateActionsMask = CompWindowActionResizeMask; break; case WinrulesOptions::NoMinimizeMatch: updateActionsMask = CompWindowActionMinimizeMask; break; case WinrulesOptions::NoMaximizeMatch: updateActionsMask = CompWindowActionMaximizeVertMask | CompWindowActionMaximizeHorzMask; break; case WinrulesOptions::NoCloseMatch: updateActionsMask = CompWindowActionCloseMask; break; case WinrulesOptions::NoArgbMatch: foreach (CompWindow *w, screen->windows ()) { WINRULES_WINDOW (w); ww->setNoAlpha (num); } return; break; case WinrulesOptions::SizeMatches: foreach (CompOption::Value &v, option->value ().list ()) { CompMatch &m = v.match (); m.update (); } return; break; default: return; break; } if (updateStateMask) { /* We traverse a copy of the list here because windows can be unhooked * on state change rather than the delayed unhook that happens in <0.8.x */ CompWindowList windows = screen->windows (); foreach (CompWindow *w, windows) { WINRULES_WINDOW (w); ww->updateState (num, updateStateMask); } return; } if (updateActionsMask) { foreach (CompWindow *w, screen->windows ()) { WINRULES_WINDOW (w); ww->setAllowedActions (num, updateActionsMask); } return; } return; } bool WinrulesWindow::applyRules () { int width, height; updateState (WinrulesOptions::SkiptaskbarMatch, CompWindowStateSkipTaskbarMask); updateState (WinrulesOptions::SkippagerMatch, CompWindowStateSkipPagerMask); updateState (WinrulesOptions::AboveMatch, CompWindowStateAboveMask); updateState (WinrulesOptions::BelowMatch, CompWindowStateBelowMask); updateState (WinrulesOptions::StickyMatch, CompWindowStateStickyMask); updateState (WinrulesOptions::FullscreenMatch, CompWindowStateFullscreenMask); updateState (WinrulesOptions::MaximizeMatch, CompWindowStateMaximizedHorzMask | CompWindowStateMaximizedVertMask); setAllowedActions (WinrulesOptions::NoMoveMatch, CompWindowActionMoveMask); setAllowedActions (WinrulesOptions::NoResizeMatch, CompWindowActionResizeMask); setAllowedActions (WinrulesOptions::NoMinimizeMatch, CompWindowActionMinimizeMask); setAllowedActions (WinrulesOptions::NoMaximizeMatch, CompWindowActionMaximizeVertMask | CompWindowActionMaximizeHorzMask); setAllowedActions (WinrulesOptions::NoCloseMatch, CompWindowActionCloseMask); setNoAlpha (WinrulesOptions::NoArgbMatch); if (matchSize (&width, &height)) updateWindowSize (width, height); return false; } void WinrulesScreen::handleEvent (XEvent *event) { if (event->type == MapRequest) { CompWindow *w = screen->findWindow (event->xmap.window); if (w) { WINRULES_WINDOW (w); ww->setNoFocus (WinrulesOptions::NoFocusMatch); ww->applyRules (); } } screen->handleEvent (event); } void WinrulesWindow::getAllowedActions (unsigned int &setActions, unsigned int &clearActions) { window->getAllowedActions (setActions, clearActions); clearActions |= ~allowedActions; } void WinrulesScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); /* match options are up to date after the call to matchExpHandlerChanged */ foreach (CompWindow *w, screen->windows ()) { WINRULES_WINDOW (w); ww->applyRules (); } } void WinrulesScreen::matchPropertyChanged (CompWindow *w) { WINRULES_WINDOW (w); /* Re-apply rules on match property change */ ww->applyRules (); screen->matchPropertyChanged (w); } WinrulesScreen::WinrulesScreen (CompScreen *screen) : PluginClassHandler (screen) { ScreenInterface::setHandler (screen); optionSetSkiptaskbarMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetSkippagerMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetAboveMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetBelowMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetFullscreenMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetStickyMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetMaximizeMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoArgbMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoMoveMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoResizeMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoMinimizeMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoMaximizeMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoCloseMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoFocusMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); } WinrulesWindow::WinrulesWindow (CompWindow *window) : PluginClassHandler (window), window (window), allowedActions (~0), stateSetMask (0), protocolSetMask (0) { CompTimer timer; WindowInterface::setHandler (window); window->isFocussableSetEnabled (this, false); window->alphaSetEnabled (this, false); window->focusSetEnabled (this, false); timer.setCallback (boost::bind(&WinrulesWindow::applyRules, this)); timer.setTimes (0, 0); timer.start (); } bool WinrulesPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/dbus/0000755000015301777760000000000012321344021020112 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/dbus/dbus.xml.in0000644000015301777760000000051412321343002022174 0ustar pbusernogroup00000000000000 <_short>D-Bus <_long>D-Bus Control Backend Utility composite opengl decor compiz-0.9.11+14.04.20140409/plugins/dbus/CMakeLists.txt0000644000015301777760000000172412321343002022654 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${compiz_plugindir}\\\" -DMETADATADIR=\\\"${compiz_metadatadir}\\\" ) compiz_plugin (dbus PKGDEPS dbus-1 libxml-2.0) #AC_ARG_ENABLE(dbus, # [ --disable-dbus Disable dbus plugin], # [use_dbus=$enableval], [use_dbus=yes]) #if test "x$use_dbus" = "xyes"; then # PKG_CHECK_MODULES(DBUS, dbus-1 libxml-2.0, [use_dbus=yes], [use_dbus=no]) #fi #AM_CONDITIONAL(DBUS_PLUGIN, test "x$use_dbus" = "xyes") #if test "$use_dbus" = yes; then # AC_DEFINE(USE_DBUS, 1, [Build dbus plugin]) #fi #AC_ARG_ENABLE(dbus-glib, # [ --disable-dbus-glib Disable dbus-glib support], # [use_dbus_glib=$enableval], [use_dbus_glib=yes]) #if test "x$use_dbus_glib" = "xyes"; then # PKG_CHECK_MODULES(DBUS_GLIB, dbus-glib-1, [use_dbus_glib=yes], [use_dbus_glib=no]) #fi #if test "$use_dbus" = yes; then # AC_DEFINE(USE_DBUS_GLIB, 1, [Build dbus glib support]) #fi compiz-0.9.11+14.04.20140409/plugins/dbus/src/0000755000015301777760000000000012321344021020701 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/dbus/src/dbus.h0000644000015301777760000001446012321343002022012 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman * * Ported to Compiz 0.9 by: * Copyright (C) 2009 Sam Spilsbury */ #include #include #include #include #include #define DBUS_API_SUBJECT_TO_CHANGE #include #include #define COMPIZ_DBUS_SERVICE_NAME "org.freedesktop.compiz" #define COMPIZ_DBUS_INTERFACE "org.freedesktop.compiz" #define COMPIZ_DBUS_ROOT_PATH "/org/freedesktop/compiz" #define COMPIZ_DBUS_ACTIVATE_MEMBER_NAME "activate" #define COMPIZ_DBUS_DEACTIVATE_MEMBER_NAME "deactivate" #define COMPIZ_DBUS_SET_MEMBER_NAME "set" #define COMPIZ_DBUS_GET_MEMBER_NAME "get" #define COMPIZ_DBUS_GET_METADATA_MEMBER_NAME "getMetadata" #define COMPIZ_DBUS_LIST_MEMBER_NAME "list" #define COMPIZ_DBUS_GET_PLUGIN_METADATA_MEMBER_NAME "getPluginMetadata" #define COMPIZ_DBUS_CHANGED_SIGNAL_NAME "changed" #define COMPIZ_DBUS_PLUGINS_CHANGED_SIGNAL_NAME "pluginsChanged" #define DBUS_FILE_WATCH_CURRENT 0 #define DBUS_FILE_WATCH_PLUGIN 1 #define DBUS_FILE_WATCH_HOME 2 #define DBUS_FILE_WATCH_NUM 3 class IntrospectionResponse { public: IntrospectionResponse (); ~IntrospectionResponse (); void addArgument (const char *type, const char *direction); void addMethod (const char *name, int nArgs, ...); void addSignal (const char *name, int nArgs, ...); void addNode (const char *name); void startInterface (); void endInterface (); const char* finishAndGetXml (); private: xmlBufferPtr xmlBuf; xmlTextWriterPtr xmlWriter; }; class DbusScreen : public PluginClassHandler , public ScreenInterface { public: DbusScreen (CompScreen *); ~DbusScreen (); CompFileWatchHandle fileWatch[DBUS_FILE_WATCH_NUM]; DBusConnection *connection; CompWatchFdHandle watchFdHandle; bool setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &v); bool initPluginForScreen (CompPlugin *p); CompOption::Vector & getOptionsFromPath (const std::vector& path); static bool sendIntrospectResponse (DBusConnection *connection, DBusMessage *message, IntrospectionResponse &response); bool handleRootIntrospectMessage (DBusConnection *connection, DBusMessage *message); bool handlePluginIntrospectMessage (DBusConnection *connection, DBusMessage *message); bool handleScreenIntrospectMessage (DBusConnection *connection, DBusMessage *message, std::vector& path); bool handleOptionIntrospectMessage (DBusConnection *connection, DBusMessage *message, std::vector& path); bool handleActionMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path, bool activate); bool tryGetValueWithType (DBusMessageIter *iter, int type, void *value); bool getOptionValue (DBusMessageIter *iter, CompOption::Type type, CompOption::Value &value); bool handleSetOptionMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path); void appendSimpleOptionValue (DBusMessage *message, CompOption::Type type, CompOption::Value &value); void appendListOptionValue (DBusMessage *message, CompOption::Type type, CompOption::Value &value); void appendOptionValue (DBusMessage *message, CompOption::Type type, CompOption::Value &value); bool handleGetOptionMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path); bool handleListMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path); DBusHandlerResult handleMessage (DBusConnection *connection, DBusMessage *message, void *userData); bool processMessages (short int); void sendChangeSignalForOption (CompOption *o, const CompString &plugin); bool getPathDecomposed (const char *data, std::vector &path); bool registerOptions (DBusConnection *connection, char *screenPath); bool unregisterOptions (DBusConnection *connection, char *screenPath); void registerPluginForScreen (DBusConnection *connection, const char *pluginName); void registerPluginsForScreen (DBusConnection *connection); void unregisterPluginForScreen (DBusConnection *connection, const char *pluginName); void unregisterPluginsForScreen (DBusConnection *connection); void sendPluginsChangedSignal (const char *name); }; class DbusPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; #define DBUS_SCREEN(s) \ DbusScreen *ds = DbusScreen::get (s) compiz-0.9.11+14.04.20140409/plugins/dbus/src/dbus.cpp0000644000015301777760000013113412321343002022343 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman * * Ported to Compiz 0.9 by: * Copyright (C) 2009 Sam Spilsbury * Copyright (C) 2013 Sami Jaktholm (introspection) */ #include "dbus.h" COMPIZ_PLUGIN_20090315 (dbus, DbusPluginVTable); CompOption::Vector emptyList; const char* IntrospectionResponse::finishAndGetXml () { xmlTextWriterEndDocument (xmlWriter); return reinterpret_cast (xmlBuf->content); } void IntrospectionResponse::startInterface () { xmlTextWriterStartElement (xmlWriter, BAD_CAST "interface"); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "name", BAD_CAST COMPIZ_DBUS_SERVICE_NAME); } void IntrospectionResponse::endInterface () { xmlTextWriterEndElement (xmlWriter); } void IntrospectionResponse::addArgument (const char *type, const char *direction) { xmlTextWriterStartElement (xmlWriter, BAD_CAST "arg"); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "type", BAD_CAST type); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "direction", BAD_CAST direction); xmlTextWriterEndElement (xmlWriter); } void IntrospectionResponse::addMethod (const char *name, int nArgs, ...) { va_list var_args; const char *type, *direction; xmlTextWriterStartElement (xmlWriter, BAD_CAST "method"); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "name", BAD_CAST name); va_start (var_args, nArgs); while (nArgs) { type = va_arg (var_args, const char *); direction = va_arg (var_args, const char *); addArgument (type, direction); --nArgs; } va_end (var_args); xmlTextWriterEndElement (xmlWriter); } void IntrospectionResponse::addSignal (const char *name, int nArgs, ...) { va_list var_args; const char *type; xmlTextWriterStartElement (xmlWriter, BAD_CAST "signal"); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "name", BAD_CAST name); va_start (var_args, nArgs); while (nArgs) { type = va_arg (var_args, const char *); addArgument (type, "out"); --nArgs; } va_end (var_args); xmlTextWriterEndElement (xmlWriter); } void IntrospectionResponse::addNode (const char *name) { xmlTextWriterStartElement (xmlWriter, BAD_CAST "node"); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "name", BAD_CAST name); xmlTextWriterEndElement (xmlWriter); } IntrospectionResponse::IntrospectionResponse () { xmlBuf = xmlBufferCreate (); xmlWriter = xmlNewTextWriterMemory (xmlBuf, 0); /* Add introspection node. */ xmlTextWriterStartElement (xmlWriter, BAD_CAST "node"); xmlTextWriterStartElement (xmlWriter, BAD_CAST "interface"); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "name", BAD_CAST "org.freedesktop.DBus.Introspectable"); addMethod ("Introspect", 1, "s", "out"); xmlTextWriterEndElement (xmlWriter); } IntrospectionResponse::~IntrospectionResponse () { if (xmlWriter) xmlFreeTextWriter (xmlWriter); if (xmlBuf) xmlBufferFree (xmlBuf); } #ifdef __cplusplus /* A simple wrapper for dbus to Compiz 0.9 */ extern "C" { #endif static DBusHandlerResult dbusHandleMessage (DBusConnection *, DBusMessage *, void *); DBusHandlerResult dbusHandleMessage (DBusConnection *c, DBusMessage *m, void *v) { DBUS_SCREEN (screen); return ds->handleMessage (c, m, v); } static DBusObjectPathVTable dbusMessagesVTable = { NULL, dbusHandleMessage, /* handler function */ NULL, NULL, NULL, NULL }; #ifdef __cplusplus } #endif CompOption::Vector & DbusScreen::getOptionsFromPath (const std::vector& path) { CompPlugin *p; p = CompPlugin::find (path[0].c_str ()); if (!p) { return emptyList; } if (p->vTable->getOptions ().empty ()) return emptyList; return p->vTable->getOptions (); } bool DbusScreen::sendIntrospectResponse (DBusConnection *connection, DBusMessage *message, IntrospectionResponse &response) { DBusMessage *reply = dbus_message_new_method_return (message); if (!reply) return false; DBusMessageIter args; dbus_message_iter_init_append (reply, &args); const char* responseXml = response.finishAndGetXml (); if (!dbus_message_iter_append_basic (&args, DBUS_TYPE_STRING, &responseXml)) return false; if (!dbus_connection_send (connection, reply, NULL)) return false; dbus_connection_flush (connection); dbus_message_unref (reply); return true; } /* introspection handlers */ bool DbusScreen::handleRootIntrospectMessage (DBusConnection *connection, DBusMessage *message) { IntrospectionResponse response; response.startInterface (); #if GET_PLUGIN_METADATA_ENABLED response.addMethod (COMPIZ_DBUS_GET_PLUGIN_METADATA_MEMBER_NAME, 7, "s", "in", "s", "out", "s", "out", "s", "out", "b", "out", "as", "out", "as", "out"); #endif response.addSignal (COMPIZ_DBUS_PLUGINS_CHANGED_SIGNAL_NAME, 0); response.endInterface (); const CompPlugin::List &plugins = CompPlugin::getPlugins (); if (plugins.empty ()) return false; foreach (CompPlugin* p, plugins) { if (p->vTable) response.addNode (p->vTable->name ().c_str()); } return sendIntrospectResponse (connection, message, response); } /* MULTIDPYERROR: only works with one or less displays present */ bool DbusScreen::handlePluginIntrospectMessage (DBusConnection *connection, DBusMessage *message) { char screenName[256]; IntrospectionResponse response; snprintf (screenName, 256, "screen%d", screen->screenNum ()); response.addNode (screenName); return sendIntrospectResponse (connection, message, response); } bool DbusScreen::handleScreenIntrospectMessage (DBusConnection *connection, DBusMessage *message, std::vector& path) { IntrospectionResponse response; response.startInterface (); response.addMethod (COMPIZ_DBUS_LIST_MEMBER_NAME, 1, "as", "out"); response.endInterface (); CompOption::Vector &options = getOptionsFromPath (path); if (!options.empty ()) { foreach (CompOption &option, options) { response.addNode (option.name ().c_str()); } } return sendIntrospectResponse (connection, message, response); } bool DbusScreen::handleOptionIntrospectMessage (DBusConnection *connection, DBusMessage *message, std::vector& path) { #if GET_PLUGIN_METADATA_ENABLED bool metadataHandled = false; #endif bool isList = false; char type[3]; IntrospectionResponse response; CompOption::Type restrictionType; CompOption::Vector &options = getOptionsFromPath (path); CompOption *option = CompOption::findOption (options, path[2]); response.startInterface (); if (option) { restrictionType = option->type (); if (restrictionType == CompOption::TypeList) { restrictionType = option->value ().listType (); isList = true; } switch (restrictionType) { case CompOption::TypeInt: if (isList) strcpy (type, "ai"); else strcpy (type, "i"); #if GET_PLUGIN_METADATA_ENABLED response.addMethod (COMPIZ_DBUS_GET_METADATA_MEMBER_NAME, 6, "s", "out", "s", "out", "b", "out", "s", "out", "i", "out", "i", "out"); metadataHandled = true; #endif break; case CompOption::TypeFloat: if (isList) strcpy (type, "ad"); else strcpy (type, "d"); #if GET_PLUGIN_METADATA_ENABLED response.addMethod (COMPIZ_DBUS_GET_METADATA_MEMBER_NAME, 7, "s", "out", "s", "out", "b", "out", "s", "out", "d", "out", "d", "out", "d", "out"); metadataHandled = true; #endif break; case CompOption::TypeString: if (isList) strcpy (type, "as"); else strcpy (type, "s"); #if GET_PLUGIN_METADATA_ENABLED response.addMethod (COMPIZ_DBUS_GET_METADATA_MEMBER_NAME, 5, "s", "out", "s", "out", "b", "out", "s", "out", "as", "out"); metadataHandled = true; #endif break; case CompOption::TypeBool: case CompOption::TypeBell: if (isList) strcpy (type, "ab"); else strcpy (type, "b"); break; case CompOption::TypeColor: case CompOption::TypeKey: case CompOption::TypeButton: case CompOption::TypeEdge: case CompOption::TypeMatch: if (isList) strcpy (type, "as"); else strcpy (type, "s"); break; default: break; } response.addMethod (COMPIZ_DBUS_GET_MEMBER_NAME, 1, type, "out"); response.addMethod (COMPIZ_DBUS_SET_MEMBER_NAME, 1, type, "in"); response.addSignal (COMPIZ_DBUS_CHANGED_SIGNAL_NAME, 1, type, "out"); #if GET_PLUGIN_METADATA_ENABLED if (!metadataHandled) response.addMethod (COMPIZ_DBUS_GET_METADATA_MEMBER_NAME, 4, "s", "out", "s", "out", "b", "out", "s", "out"); #endif } response.endInterface (); return sendIntrospectResponse (connection, message, response); } /* * Activate can be used to trigger any existing action. Arguments * should be a pair of { string, bool|int32|double|string }. * * Example (rotate to face 1): * * dbus-send --type=method_call --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/rotate/allscreens/rotate_to \ * org.freedesktop.compiz.activate \ * string:'root' \ * int32:`xwininfo -root | grep id: | awk '{ print $4 }'` \ * string:'face' int32:1 * * * You can also call the terminate function * * Example unfold and refold cube: * dbus-send --type=method_call --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/cube/allscreens/unfold \ * org.freedesktop.compiz.activate \ * string:'root' \ * int32:`xwininfo -root | grep id: | awk '{ print $4 }'` * * dbus-send --type=method_call --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/cube/allscreens/unfold \ * org.freedesktop.compiz.deactivate \ * string:'root' \ * int32:`xwininfo -root | grep id: | awk '{ print $4 }'` * */ bool DbusScreen::handleActionMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path, bool activate) { CompOption::Vector &options = getOptionsFromPath (path); if (options.empty ()) return false; foreach (CompOption& option, options) { if (option.name () == path[2]) { CompOption::Vector argument; DBusMessageIter iter; CompAction *action = &option.value ().action (); if (option.type () != CompOption::TypeAction && option.type () != CompOption::TypeKey && option.type () != CompOption::TypeButton && option.type () != CompOption::TypeEdge && option.type () != CompOption::TypeBell) return false; if (activate) { if (!action->initiate ()) return false; } else { if (!action->terminate ()) return false; } if (dbus_message_iter_init (message, &iter)) { CompOption::Value value; CompOption::Type type; char *name; do { name = NULL; type = CompOption::TypeUnset; while (!name) { switch (dbus_message_iter_get_arg_type (&iter)) { case DBUS_TYPE_STRING: dbus_message_iter_get_basic (&iter, &name); default: break; } if (!dbus_message_iter_next (&iter)) break; } while (type == CompOption::TypeUnset) { switch (dbus_message_iter_get_arg_type (&iter)) { case DBUS_TYPE_BOOLEAN: { bool tmp; type = CompOption::TypeBool; dbus_message_iter_get_basic (&iter, &tmp); value.set (tmp ? true : false); } break; case DBUS_TYPE_INT32: { int tmp; type = CompOption::TypeInt; dbus_message_iter_get_basic (&iter, &tmp); value.set (tmp); } break; case DBUS_TYPE_DOUBLE: { double tmp; type = CompOption::TypeFloat; dbus_message_iter_get_basic (&iter, &tmp); value.set ((float) tmp); } break; case DBUS_TYPE_STRING: { char *s; dbus_message_iter_get_basic (&iter, &s); /* XXX: use match option type if name is "match" */ if (name && strcmp (name, "match") == 0) { type = CompOption::TypeMatch; value.set (CompMatch (CompString (s))); } else { type = CompOption::TypeString; value.set (CompString (s)); } } default: break; } if (!dbus_message_iter_next (&iter)) break; } if (name && type != CompOption::TypeUnset) { CompOption arg (name, type); arg.set (value); argument.push_back (arg); } } while (dbus_message_iter_has_next (&iter)); } if (activate) action->initiate () (action, 0, argument); else action->terminate () (action, 0, argument); if (!dbus_message_get_no_reply (message)) { DBusMessage *reply; reply = dbus_message_new_method_return (message); dbus_connection_send (connection, reply, NULL); dbus_connection_flush (connection); dbus_message_unref (reply); } return true; } } return false; } bool DbusScreen::tryGetValueWithType (DBusMessageIter *iter, int type, void *value) { if (dbus_message_iter_get_arg_type (iter) == type) { dbus_message_iter_get_basic (iter, value); return true; } return false; } bool DbusScreen::getOptionValue (DBusMessageIter *iter, CompOption::Type type, CompOption::Value &value) { bool success; switch (type) { case CompOption::TypeBool: { bool b; success = tryGetValueWithType (iter, DBUS_TYPE_BOOLEAN, &b); if (success) value.set (b ? true : false); } break; case CompOption::TypeInt: { int i; success = tryGetValueWithType (iter, DBUS_TYPE_INT32, &i); if (success) value.set (i); } break; case CompOption::TypeFloat: { double d; success = tryGetValueWithType (iter, DBUS_TYPE_DOUBLE, &d); if (success) value.set ((float) d); } break; case CompOption::TypeString: { char *s; success = tryGetValueWithType (iter, DBUS_TYPE_STRING, &s); if (success) value.set (CompString (s)); } break; case CompOption::TypeColor: { char *s; unsigned short c[4]; success = tryGetValueWithType (iter, DBUS_TYPE_STRING, &s); if (success) success &= CompOption::stringToColor (CompString (s), c); if (success) value.set (c); } break; case CompOption::TypeKey: { char *s; CompAction action; success = tryGetValueWithType (iter, DBUS_TYPE_STRING, &s); if (success) success = action.keyFromString (CompString (s)); if (success) value.set (action); } break; case CompOption::TypeButton: { char *s; CompAction action; success = tryGetValueWithType (iter, DBUS_TYPE_STRING, &s); if (success) success = action.buttonFromString (CompString (s)); if (success) value.set (action); } break; case CompOption::TypeEdge: { char *s; CompAction action; success = tryGetValueWithType (iter, DBUS_TYPE_STRING, &s); if (success) success = action.edgeMaskFromString (CompString (s)); if (success) value.set (action); } break; case CompOption::TypeBell: { bool bell; CompAction action; success = tryGetValueWithType (iter, DBUS_TYPE_BOOLEAN, &bell); if (success) { action.setBell (bell ? true : false); value.set (action); } } break; case CompOption::TypeMatch: { char *s; success = tryGetValueWithType (iter, DBUS_TYPE_STRING, &s); if (success) value.set (CompMatch (s)); } break; default: success = false; break; } return success; } /* * 'Set' can be used to change any existing option. Argument * should be the new value for the option. * * Example (will set command0 option to firefox): * * dbus-send --type=method_call --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/core/allscreens/command0 \ * org.freedesktop.compiz.set \ * string:'firefox' * * List and action options can be changed using more than one * argument. * * Example (will set active_plugins option to * [dbus,decoration,place]): * * dbus-send --type=method_call --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/core/allscreens/active_plugins \ * org.freedesktop.compiz.set \ * array:string:'dbus','decoration','place' * * Example (will set run_command0 option to trigger on key * binding Return and not trigger on any button * bindings, screen edges or bell notifications): * * dbus-send --type=method_call --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/core/allscreens/run_command0 \ * org.freedesktop.compiz.set \ * string:'Return' \ * string:'Disabled' \ * boolean:'false' \ * string:'' \ * int32:'0' */ bool DbusScreen::handleSetOptionMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path) { CompOption::Vector &options = getOptionsFromPath (path); foreach (CompOption& option, options) { if (option.name () == path[2]) { DBusMessageIter iter, aiter; CompOption::Value value, tmpValue; bool status = false; if (option.type () == CompOption::TypeList) { if (dbus_message_iter_init (message, &iter) && dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY) { dbus_message_iter_recurse (&iter, &aiter); do { if (getOptionValue (&aiter, option.value ().listType (), tmpValue)) { option.value ().list ().push_back (tmpValue); } } while (dbus_message_iter_next (&aiter)); status = true; } } else if (dbus_message_iter_init (message, &iter)) { status = getOptionValue (&iter, option.type (), value); } if (status) { screen->setOptionForPlugin (path[0].c_str (), option.name ().c_str (), value); if (!dbus_message_get_no_reply (message)) { DBusMessage *reply; reply = dbus_message_new_method_return (message); dbus_connection_send (connection, reply, NULL); dbus_connection_flush (connection); dbus_message_unref (reply); } } return status; } } return false; } void DbusScreen::appendSimpleOptionValue (DBusMessage *message, CompOption::Type type, CompOption::Value &value) { switch (type) { case CompOption::TypeBool: { bool b = value.b () ? true : false; dbus_message_append_args (message, DBUS_TYPE_BOOLEAN, &b, DBUS_TYPE_INVALID); } break; case CompOption::TypeInt: { int i = value.i (); dbus_message_append_args (message, DBUS_TYPE_INT32, &i, DBUS_TYPE_INVALID); } break; case CompOption::TypeFloat: { double d = value.f (); dbus_message_append_args (message, DBUS_TYPE_DOUBLE, &d, DBUS_TYPE_INVALID); } break; case CompOption::TypeString: { CompString string = value.s (); const char *s = string.c_str (); dbus_message_append_args (message, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } break; case CompOption::TypeColor: { CompString color = CompOption::colorToString (value.c ()); const char *s = color.c_str (); dbus_message_append_args (message, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } break; case CompOption::TypeKey: { CompString key = value.action ().keyToString (); const char *s = key.c_str (); dbus_message_append_args (message, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } break; case CompOption::TypeButton: { CompString button = value.action ().buttonToString (); const char *s = button.c_str (); dbus_message_append_args (message, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } break; case CompOption::TypeEdge: { CompString edge = value.action ().edgeMaskToString (); const char *s = edge.c_str (); dbus_message_append_args (message, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } break; case CompOption::TypeBell: { bool bell = value.action ().bell () ? true : false; dbus_message_append_args (message, DBUS_TYPE_BOOLEAN, &bell, DBUS_TYPE_INVALID); } break; case CompOption::TypeMatch: { CompString match = value.match ().toString (); const char *s = match.c_str (); dbus_message_append_args (message, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } default: break; } } void DbusScreen::appendListOptionValue (DBusMessage *message, CompOption::Type type, CompOption::Value &value) { DBusMessageIter iter; DBusMessageIter listIter; char sig[2]; switch (value.listType ()) { case CompOption::TypeInt: sig[0] = DBUS_TYPE_INT32; break; case CompOption::TypeFloat: sig[0] = DBUS_TYPE_DOUBLE; break; case CompOption::TypeBool: case CompOption::TypeBell: sig[0] = DBUS_TYPE_BOOLEAN; break; default: sig[0] = DBUS_TYPE_STRING; break; } sig[1] = '\0'; dbus_message_iter_init_append (message, &iter); if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, sig, &listIter)) return; foreach (CompOption::Value& val, value.list ()) { switch (value.listType ()) { case CompOption::TypeInt: { int i = val.i (); dbus_message_iter_append_basic (&listIter, sig[0], &i); } break; case CompOption::TypeFloat: { float f = val.f (); dbus_message_iter_append_basic (&listIter, sig[0], &f); } break; case CompOption::TypeBool: { bool b = val.b () ? true : false; dbus_message_iter_append_basic (&listIter, sig[0], &b); } break; case CompOption::TypeString: { CompString string = val.s (); const char *s = string.c_str (); dbus_message_iter_append_basic (&listIter, sig[0], &s); } break; case CompOption::TypeKey: { CompString key = val.action ().keyToString (); const char *s = key.c_str (); dbus_message_iter_append_basic (&listIter, sig[0], &s); } break; case CompOption::TypeButton: { CompString button = val.action ().buttonToString (); const char *s = button.c_str (); dbus_message_iter_append_basic (&listIter, sig[0], &s); } break; case CompOption::TypeEdge: { CompString edge = val.action ().edgeMaskToString (); const char *s = edge.c_str (); dbus_message_iter_append_basic (&listIter, sig[0], &s); } break; case CompOption::TypeBell: { bool bell = val.action ().bell () ? true : false; dbus_message_iter_append_basic (&listIter, sig[0], &bell); } break; case CompOption::TypeMatch: { CompString match = val.match ().toString (); const char *s = match.c_str (); dbus_message_iter_append_basic (&listIter, sig[0], &s); } break; case CompOption::TypeColor: { CompString color = CompOption::colorToString (val.c ()); const char *s = color.c_str (); dbus_message_iter_append_basic (&listIter, sig[0], &s); } break; default: break; } } dbus_message_iter_close_container (&iter, &listIter); } void DbusScreen::appendOptionValue (DBusMessage *message, CompOption::Type type, CompOption::Value &value) { if (type == CompOption::TypeList) appendListOptionValue (message, type, value); else appendSimpleOptionValue (message, type, value); } /* * 'Get' can be used to retrieve the value of any existing option. * * Example (will retrieve the current value of command0 option): * * dbus-send --print-reply --type=method_call \ * --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/core/allscreens/command0 \ * org.freedesktop.compiz.get */ bool DbusScreen::handleGetOptionMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path) { CompOption::Vector &options = getOptionsFromPath (path); DBusMessage *reply = NULL; foreach (CompOption& option, options) { if (option.name () == path[2]) { reply = dbus_message_new_method_return (message); appendOptionValue (reply, option.type (), option.value ()); break; } } if (!reply) reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "No such option"); dbus_connection_send (connection, reply, NULL); dbus_connection_flush (connection); dbus_message_unref (reply); return true; } /* * 'List' can be used to retrieve a list of available options. * * Example: * * dbus-send --print-reply --type=method_call \ * --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/core/allscreens \ * org.freedesktop.compiz.list */ bool DbusScreen::handleListMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path) { CompOption::Vector &options = getOptionsFromPath (path); DBusMessage *reply; reply = dbus_message_new_method_return (message); foreach (CompOption& option, options) { CompString name = option.name (); const char *s = name.c_str (); dbus_message_append_args (reply, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } dbus_connection_send (connection, reply, NULL); dbus_connection_flush (connection); dbus_message_unref (reply); return true; } /* * 'GetMetadata' can be used to retrieve metadata for an option. * * Example: * * dbus-send --print-reply --type=method_call \ * --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/core/allscreens/run_command0 \ * org.freedesktop.compiz.getMetadata */ #if GETMETADATA_ENABLED bool DbusScreen::handleGetMetadataMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path) { CompOption::Vector options; DBusMessage *reply = NULL; CompMetadata *m; options = getOptionsFromPath (path, &m); foreach (CompOption *option, options) { if (strcmp (option->name ().c_str (), path[2]) == 0) { /* TODO: Write xmlTextWriter for getting long screen option descriptions */ CompOption::Type restrictionType = option->type (); const char *type; char *shortDesc = NULL; char *longDesc = NULL; const char *blankStr = ""; reply = dbus_message_new_method_return (message); type = optionTypeToString (option->type); if (m) { if (object->type == COMP_OBJECT_TYPE_SCREEN) { shortDesc = compGetShortScreenOptionDescription (m, option); longDesc = compGetLongScreenOptionDescription (m, option); } else { shortDesc = compGetShortDisplayOptionDescription (m, option); longDesc = compGetLongDisplayOptionDescription (m, option); } } if (shortDesc) dbus_message_append_args (reply, DBUS_TYPE_STRING, &shortDesc, DBUS_TYPE_INVALID); else dbus_message_append_args (reply, DBUS_TYPE_STRING, &blankStr, DBUS_TYPE_INVALID); if (longDesc) dbus_message_append_args (reply, DBUS_TYPE_STRING, &longDesc, DBUS_TYPE_INVALID); else dbus_message_append_args (reply, DBUS_TYPE_STRING, &blankStr, DBUS_TYPE_INVALID); dbus_message_append_args (reply, DBUS_TYPE_STRING, &type, DBUS_TYPE_INVALID); if (shortDesc) free (shortDesc); if (longDesc) free (longDesc); if (restrictionType == CompOptionTypeList) { type = optionTypeToString (option->value.list.type); restrictionType = option->value.list.type; dbus_message_append_args (reply, DBUS_TYPE_STRING, &type, DBUS_TYPE_INVALID); } switch (restrictionType) { case CompOptionTypeInt: dbus_message_append_args (reply, DBUS_TYPE_INT32, &option->rest.i.min, DBUS_TYPE_INT32, &option->rest.i.max, DBUS_TYPE_INVALID); break; case CompOptionTypeFloat: { double min, max, precision; min = option->rest.f.min; max = option->rest.f.max; precision = option->rest.f.precision; dbus_message_append_args (reply, DBUS_TYPE_DOUBLE, &min, DBUS_TYPE_DOUBLE, &max, DBUS_TYPE_DOUBLE, &precision, DBUS_TYPE_INVALID); } break; default: break; } break; } option++; } if (!reply) reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "No such option"); dbus_connection_send (connection, reply, NULL); dbus_connection_flush (connection); dbus_message_unref (reply); return true; } #endif /* * 'GetPluginMetadata' can be used to retrieve metadata for a plugin. * * Example: * * dbus-send --print-reply --type=method_call \ * --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz \ * org.freedesktop.compiz.getPluginMetadata \ * string:'png' */ /* TODO: This and xmlTextWriter to get short and long descs */ #if GET_PLUGIN_METADATA_ENABLED bool DbusScreen::handleGetPluginMetadataMessage (DBusConnection *connection, DBusMessage *message) { DBusMessage *reply; DBusMessageIter iter; char *name; CompPlugin *p, *loadedPlugin = NULL; if (!dbus_message_iter_init (message, &iter)) return false; if (!tryGetValueWithType (&iter, DBUS_TYPE_STRING, &name)) return false; p = findActivePlugin (name); if (!p) p = loadedPlugin = loadPlugin (name); if (p) { bool initializedPlugin = true; char *shortDesc = NULL; char *longDesc = NULL; const char *blankStr = ""; reply = dbus_message_new_method_return (message); if (loadedPlugin) { if (!(*p->vTable->init) (p)) initializedPlugin = false; } if (initializedPlugin && p->vTable->getMetadata) { CompMetadata *m; m = (*p->vTable->getMetadata) (p); if (m) { shortDesc = compGetShortPluginDescription (m); longDesc = compGetLongPluginDescription (m); } } dbus_message_append_args (reply, DBUS_TYPE_STRING, &p->vTable->name, DBUS_TYPE_INVALID); if (shortDesc) dbus_message_append_args (reply, DBUS_TYPE_STRING, &shortDesc, DBUS_TYPE_INVALID); else dbus_message_append_args (reply, DBUS_TYPE_STRING, &blankStr, DBUS_TYPE_INVALID); if (longDesc) dbus_message_append_args (reply, DBUS_TYPE_STRING, &longDesc, DBUS_TYPE_INVALID); else dbus_message_append_args (reply, DBUS_TYPE_STRING, &blankStr, DBUS_TYPE_INVALID); dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &initializedPlugin, DBUS_TYPE_INVALID); if (shortDesc) free (shortDesc); if (longDesc) free (longDesc); if (loadedPlugin && initializedPlugin) (*p->vTable->fini) (p); } else { char *str; str = malloc (strlen (name) + 256); if (!str) return false; sprintf (str, "Plugin '%s' could not be loaded", name); reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, str); free (str); } if (loadedPlugin) unloadPlugin (loadedPlugin); dbus_connection_send (connection, reply, NULL); dbus_connection_flush (connection); dbus_message_unref (reply); return true; } #endif DBusHandlerResult DbusScreen::handleMessage (DBusConnection *connection, DBusMessage *message, void *userData) { bool status = false; std::vector path; if (!getPathDecomposed (dbus_message_get_path (message), path)) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; /* root messages */ if (path.empty ()) { if (dbus_message_is_method_call (message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { if (handleRootIntrospectMessage (connection, message)) return DBUS_HANDLER_RESULT_HANDLED; } #if GET_PLUGIN_METADATA_ENABLED else if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_GET_PLUGIN_METADATA_MEMBER_NAME)) { if (handleGetPluginMetadataMessage (connection, message)) return DBUS_HANDLER_RESULT_HANDLED; } #endif return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } /* plugin message */ else if (path.size () == 1) { if (dbus_message_is_method_call (message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { if (handlePluginIntrospectMessage (connection, message)) return DBUS_HANDLER_RESULT_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } /* screen message */ else if (path.size () == 2) { if (dbus_message_is_method_call (message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { if (handleScreenIntrospectMessage (connection, message, path)) return DBUS_HANDLER_RESULT_HANDLED; } if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_LIST_MEMBER_NAME)) { if (handleListMessage (connection, message, path)) return DBUS_HANDLER_RESULT_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } /* option message */ if (dbus_message_is_method_call (message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { status = handleOptionIntrospectMessage (connection, message, path); } if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_ACTIVATE_MEMBER_NAME)) { status = handleActionMessage (connection, message, path, true); } else if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_DEACTIVATE_MEMBER_NAME)) { status = handleActionMessage (connection, message, path, false); } else if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_SET_MEMBER_NAME)) { status = handleSetOptionMessage (connection, message, path); } else if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_GET_MEMBER_NAME)) { status = handleGetOptionMessage (connection, message, path); } #if GETMETADATA_ENABLED else if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_GET_METADATA_MEMBER_NAME)) { status = handleGetMetadataMessage (connection, message, path); } #endif if (status) return DBUS_HANDLER_RESULT_HANDLED; return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } bool DbusScreen::processMessages (short int data) { DBusDispatchStatus status; do { dbus_connection_read_write_dispatch (connection, 0); status = dbus_connection_get_dispatch_status (connection); } while (status == DBUS_DISPATCH_DATA_REMAINS); return true; } void DbusScreen::sendChangeSignalForOption (CompOption *o, const CompString &plugin) { DBusMessage *signal; char path[256]; CompOption::Value v; if (!o) return; snprintf (path, 256, "%s/%s/%s/%s", COMPIZ_DBUS_ROOT_PATH, plugin.c_str (), "options", o->name ().c_str ()); signal = dbus_message_new_signal (path, COMPIZ_DBUS_SERVICE_NAME, COMPIZ_DBUS_CHANGED_SIGNAL_NAME); appendOptionValue (signal, o->type (), o->value ()); dbus_connection_send (connection, signal, NULL); dbus_connection_flush (connection); dbus_message_unref (signal); } bool DbusScreen::getPathDecomposed (const char *data, std::vector &path) { CompString full (data); size_t lastPos = 0, pos; path.clear (); while ((pos = full.find ('/', lastPos)) != CompString::npos) { CompString part = full.substr (lastPos, pos - lastPos); /* If we just have "/", then strip it, but don't push back * an empty string at the start */ if (part.empty ()) { lastPos = pos + 1; continue; } path.push_back (part); lastPos = pos + 1; } /* Remaining part because there was no "/" at the end of path */ path.push_back (full.substr (lastPos, pos - lastPos).c_str ()); if (path.size () < 3) return false; /* strip leading org.freedesktop.compiz */ path.erase (path.begin (), path.begin () + 3); return true; } /* dbus registration */ bool DbusScreen::registerOptions (DBusConnection *connection, char *screenPath) { std::vector path; char objectPath[256]; if (!getPathDecomposed (screenPath, path)) return false; CompOption::Vector &options = getOptionsFromPath (path); if (options.empty ()) { return false; } foreach (CompOption& option, options) { snprintf (objectPath, 256, "%s/%s", screenPath, option.name ().c_str ()); dbus_connection_register_object_path (connection, objectPath, &dbusMessagesVTable, 0); } return true; } bool DbusScreen::unregisterOptions (DBusConnection *connection, char *screenPath) { char objectPath[256]; std::vector path; getPathDecomposed (screenPath, path); CompOption::Vector &options = getOptionsFromPath (path); if (options.empty ()) return false; foreach (CompOption& option, options) { snprintf (objectPath, 256, "%s/%s", screenPath, option.name ().c_str ()); dbus_connection_unregister_object_path (connection, objectPath); } return true; } void DbusScreen::registerPluginForScreen (DBusConnection *connection, const char *pluginName) { char objectPath[256]; /* register plugin/screen path */ snprintf (objectPath, 256, "%s/%s/screen%d", COMPIZ_DBUS_ROOT_PATH, pluginName, screen->screenNum ()); dbus_connection_register_object_path (connection, objectPath, &dbusMessagesVTable, screen->dpy ()); } void DbusScreen::registerPluginsForScreen (DBusConnection *connection) { CompPlugin::List pl = CompPlugin::getPlugins (); char path[256]; foreach (CompPlugin *p, pl) { const char *plugin = p->vTable->name ().c_str (); snprintf (path, 256, "%s/%s/screen%d", COMPIZ_DBUS_ROOT_PATH, plugin, screen->screenNum ()); registerPluginForScreen (connection, plugin); registerOptions (connection, path); } } void DbusScreen::unregisterPluginForScreen (DBusConnection *connection, const char *pluginName) { char objectPath[256]; snprintf (objectPath, 256, "%s/%s/screen%d", COMPIZ_DBUS_ROOT_PATH, pluginName, screen->screenNum ()); unregisterOptions (connection, objectPath); dbus_connection_unregister_object_path (connection, objectPath); } void DbusScreen::unregisterPluginsForScreen (DBusConnection *connection) { CompPlugin::List pl = CompPlugin::getPlugins (); foreach (CompPlugin *p, pl) { const char *plugin = p->vTable->name ().c_str (); unregisterPluginForScreen (connection, plugin); } } bool DbusScreen::initPluginForScreen (CompPlugin *p) { char objectPath[256]; snprintf (objectPath, 256, "%s/%s/screen%d", COMPIZ_DBUS_ROOT_PATH, p->vTable->name ().c_str (), screen->screenNum ()); registerOptions (connection, objectPath); screen->initPluginForScreen (p); return true; } bool DbusScreen::setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &value) { bool status = screen->setOptionForPlugin (plugin, name, value); if (status) { CompPlugin *p; p = CompPlugin::find (plugin); if (p && p->vTable) { CompOption::Vector &options = p->vTable->getOptions (); sendChangeSignalForOption (CompOption::findOption (options, name), p->vTable->name ()); if (p->vTable->name () == "core" && strcmp (name, "active_plugins") == 0) { unregisterPluginsForScreen (connection); registerPluginsForScreen (connection); } } } return status; } void DbusScreen::sendPluginsChangedSignal (const char *name) { DBusMessage *signal; signal = dbus_message_new_signal (COMPIZ_DBUS_ROOT_PATH, COMPIZ_DBUS_SERVICE_NAME, COMPIZ_DBUS_PLUGINS_CHANGED_SIGNAL_NAME); dbus_connection_send (connection, signal, NULL); dbus_connection_flush (connection); dbus_message_unref (signal); } /* We might have to hook initScreen here instead of the screen ctor */ DbusScreen::DbusScreen (CompScreen *screen) : PluginClassHandler (screen) { DBusError error; dbus_bool_t status; int fd, ret, mask; char *home; char objectPath[256]; FdWatchCallBack fdCb; FileWatchCallBack fileCb; dbus_error_init (&error); connection = dbus_bus_get (DBUS_BUS_SESSION, &error); if (dbus_error_is_set (&error)) { compLogMessage ("dbus", CompLogLevelError, "dbus_bus_get error: %s", error.message); dbus_error_free (&error); setFailed (); } ret = dbus_bus_request_name (connection, COMPIZ_DBUS_SERVICE_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING | DBUS_NAME_FLAG_ALLOW_REPLACEMENT, &error); if (dbus_error_is_set (&error)) { compLogMessage ("dbus", CompLogLevelError, "dbus_bus_request_name error: %s", error.message); /* dbus_connection_unref (dc->connection); */ dbus_error_free (&error); setFailed (); } dbus_error_free (&error); if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { compLogMessage ("dbus", CompLogLevelError, "dbus_bus_request_name reply is not primary owner"); /* dbus_connection_unref (dc->connection); */ setFailed (); } status = dbus_connection_get_unix_fd (connection, &fd); if (!status) { compLogMessage ("dbus", CompLogLevelError, "dbus_connection_get_unix_fd failed"); /* dbus_connection_unref (dc->connection); */ setFailed (); } fdCb = boost::bind (&DbusScreen::processMessages, this, _1); watchFdHandle = screen->addWatchFd (fd, POLLIN | POLLPRI | POLLHUP | POLLERR, fdCb); mask = NOTIFY_CREATE_MASK | NOTIFY_DELETE_MASK | NOTIFY_MOVE_MASK; fileCb = boost::bind (&DbusScreen::sendPluginsChangedSignal, this, _1); fileWatch[DBUS_FILE_WATCH_CURRENT] = screen->addFileWatch (".", mask, fileCb); fileWatch[DBUS_FILE_WATCH_PLUGIN] = screen->addFileWatch (PLUGINDIR, mask, fileCb); fileWatch[DBUS_FILE_WATCH_HOME] = 0; home = getenv ("HOME"); if (home) { CompString pluginDir (home); pluginDir += "/"; pluginDir += HOME_PLUGINDIR; fileWatch[DBUS_FILE_WATCH_HOME] = screen->addFileWatch (pluginDir.c_str (), mask, fileCb); } ScreenInterface::setHandler (screen); /* register the objects */ dbus_connection_register_object_path (connection, COMPIZ_DBUS_ROOT_PATH, &dbusMessagesVTable, 0); snprintf (objectPath, 256, "%s/%s/screen%d", COMPIZ_DBUS_ROOT_PATH, "core", screen->screenNum ()); registerPluginForScreen (connection, "core"); registerPluginsForScreen (connection); registerOptions (connection, objectPath); } DbusScreen::~DbusScreen () { for (int i = 0; i < DBUS_FILE_WATCH_NUM; i++) screen->removeFileWatch (fileWatch[i]); screen->removeWatchFd (watchFdHandle); /* can't unref the connection returned by dbus_bus_get as it's shared and we can't know if it's closed or not. dbus_connection_unref (connection); */ dbus_bus_release_name (connection, COMPIZ_DBUS_SERVICE_NAME, NULL); unregisterPluginForScreen (connection, "core"); unregisterPluginsForScreen (connection); } bool DbusPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/wobbly/0000755000015301777760000000000012321344021020453 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wobbly/wobbly.xml.in0000644000015301777760000000701612321343002023102 0ustar pbusernogroup00000000000000 <_short>Wobbly Windows <_long>Use spring model for wobbly window effect Effects edgeresistance opengl decor composite opengl fade cube scale compiz-0.9.11+14.04.20140409/plugins/wobbly/CMakeLists.txt0000644000015301777760000000015212321343002023207 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(wobbly PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/wobbly/src/0000755000015301777760000000000012321344021021242 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wobbly/src/wobbly.cpp0000644000015301777760000013470612321343002023255 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman * Ported to GLVertexBuffer by Daniel van Vugt * Spring model implemented by Kristian Hogsberg. */ #include "wobbly.h" COMPIZ_PLUGIN_20090315 (wobbly, WobblyPluginVTable) const float MASS = 15.0f; const unsigned short EDGE_DISTANCE = 25; const unsigned short EDGE_VELOCITY = 13; void WobblyWindow::findNextWestEdge (Object *object) { int start = -65535; int end = 65535; int v1 = -65535; int v2 = 65535; int x = object->position.x + window->output ().left - window->border ().left; int output = ::screen->outputDeviceForPoint (x, object->position.y); const CompRect &workArea = ::screen->outputDevs ()[(unsigned) output].workArea (); int workAreaEdge = workArea.x1 (); if (x >= workAreaEdge) { int v, s, e; v1 = workAreaEdge; foreach (CompWindow *p, ::screen->windows ()) { if (window == p) continue; if (p->mapNum () && p->struts ()) { s = p->struts ()->left.y - window->output ().top; e = p->struts ()->left.y + p->struts ()->left.height + window->output ().bottom; } else if (!p->invisible () && (p->type () & SNAP_WINDOW_TYPE)) { s = p->geometry ().y () - p->border ().top - window->output ().top; e = p->geometry ().y () + p->height () + p->border ().bottom + window->output ().bottom; } else continue; if (s > object->position.y) { if (s < end) end = s; } else if (e < object->position.y) { if (e > start) start = e; } else { if (s > start) start = s; if (e < end) end = e; if (p->mapNum () && p->struts ()) v = p->struts ()->left.x + p->struts ()->left.width; else v = p->geometry ().x () + p->width () + p->border ().right; if (v <= x) { if (v > v1) v1 = v; } else if (v < v2) v2 = v; } } } else v2 = workAreaEdge; v1 = v1 - window->output ().left + window->border ().left; v2 = v2 - window->output ().left + window->border ().left; if (v1 != (int) object->vertEdge.next) object->vertEdge.snapped = false; object->vertEdge.start = start; object->vertEdge.end = end; object->vertEdge.next = v1; object->vertEdge.prev = v2; object->vertEdge.attract = v1 + EDGE_DISTANCE; object->vertEdge.velocity = EDGE_VELOCITY; } void WobblyWindow::findNextEastEdge (Object *object) { int start = -65535; int end = 65535; int v1 = 65535; int v2 = -65535; int x = object->position.x - window->output ().right + window->border ().right; int output = ::screen->outputDeviceForPoint (x, object->position.y); const CompRect &workArea = ::screen->outputDevs ()[(unsigned) output].workArea (); int workAreaEdge = workArea.x2 (); if (x <= workAreaEdge) { int v, s, e; v1 = workAreaEdge; foreach (CompWindow *p, ::screen->windows ()) { if (window == p) continue; if (p->mapNum () && p->struts ()) { s = p->struts ()->right.y - window->output ().top; e = p->struts ()->right.y + p->struts ()->right.height + window->output ().bottom; } else if (!p->invisible () && (p->type () & SNAP_WINDOW_TYPE)) { s = p->geometry ().y () - p->border ().top - window->output ().top; e = p->geometry ().y () + p->height () + p->border ().bottom + window->output ().bottom; } else continue; if (s > object->position.y) { if (s < end) end = s; } else if (e < object->position.y) { if (e > start) start = e; } else { if (s > start) start = s; if (e < end) end = e; if (p->mapNum () && p->struts ()) v = p->struts ()->right.x; else v = p->geometry ().x () - p->border ().left; if (v >= x) { if (v < v1) v1 = v; } else if (v > v2) v2 = v; } } } else v2 = workAreaEdge; v1 = v1 + window->output ().right - window->border ().right; v2 = v2 + window->output ().right - window->border ().right; if (v1 != (int) object->vertEdge.next) object->vertEdge.snapped = false; object->vertEdge.start = start; object->vertEdge.end = end; object->vertEdge.next = v1; object->vertEdge.prev = v2; object->vertEdge.attract = v1 - EDGE_DISTANCE; object->vertEdge.velocity = EDGE_VELOCITY; } void WobblyWindow::findNextNorthEdge (Object *object) { int start = -65535; int end = 65535; int v1 = -65535; int v2 = 65535; int y = object->position.y + window->output ().top - window->border ().top; int output = ::screen->outputDeviceForPoint (object->position.x, y); const CompRect &workArea = ::screen->outputDevs ()[(unsigned) output].workArea (); int workAreaEdge = workArea.y1 (); if (y >= workAreaEdge) { int v, s, e; v1 = workAreaEdge; foreach (CompWindow *p, ::screen->windows ()) { if (window == p) continue; if (p->mapNum () && p->struts ()) { s = p->struts ()->top.x - window->output ().left; e = p->struts ()->top.x + p->struts ()->top.width + window->output ().right; } else if (!p->invisible () && (p->type () & SNAP_WINDOW_TYPE)) { s = p->geometry ().x () - p->border ().left - window->output ().left; e = p->geometry ().x () + p->width () + p->border ().right + window->output ().right; } else continue; if (s > object->position.x) { if (s < end) end = s; } else if (e < object->position.x) { if (e > start) start = e; } else { if (s > start) start = s; if (e < end) end = e; if (p->mapNum () && p->struts ()) v = p->struts ()->top.y + p->struts ()->top.height; else v = p->geometry ().y () + p->height () + p->border ().bottom; if (v <= y) { if (v > v1) v1 = v; } else if (v < v2) v2 = v; } } } else v2 = workAreaEdge; v1 = v1 - window->output ().top + window->border ().top; v2 = v2 - window->output ().top + window->border ().top; if (v1 != (int) object->horzEdge.next) object->horzEdge.snapped = false; object->horzEdge.start = start; object->horzEdge.end = end; object->horzEdge.next = v1; object->horzEdge.prev = v2; object->horzEdge.attract = v1 + EDGE_DISTANCE; object->horzEdge.velocity = EDGE_VELOCITY; } void WobblyWindow::findNextSouthEdge (Object *object) { int start = -65535; int end = 65535; int v1 = 65535; int v2 = -65535; int y = object->position.y - window->output ().bottom + window->border ().bottom; int output = ::screen->outputDeviceForPoint (object->position.x, y); const CompRect &workArea = ::screen->outputDevs ()[(unsigned) output].workArea (); int workAreaEdge = workArea.y2 (); if (y <= workAreaEdge) { int v, s, e; v1 = workAreaEdge; foreach (CompWindow *p, ::screen->windows ()) { if (window == p) continue; if (p->mapNum () && p->struts ()) { s = p->struts ()->bottom.x - window->output ().left; e = p->struts ()->bottom.x + p->struts ()->bottom.width + window->output ().right; } else if (!p->invisible () && (p->type () & SNAP_WINDOW_TYPE)) { s = p->geometry ().x () - p->border ().left - window->output ().left; e = p->geometry ().x () + p->width () + p->border ().right + window->output ().right; } else continue; if (s > object->position.x) { if (s < end) end = s; } else if (e < object->position.x) { if (e > start) start = e; } else { if (s > start) start = s; if (e < end) end = e; if (p->mapNum () && p->struts ()) v = p->struts ()->bottom.y; else v = p->geometry ().y () - p->border ().top; if (v >= y) { if (v < v1) v1 = v; } else if (v > v2) v2 = v; } } } else v2 = workAreaEdge; v1 = v1 + window->output ().bottom - window->border ().bottom; v2 = v2 + window->output ().bottom - window->border ().bottom; if (v1 != (int) object->horzEdge.next) object->horzEdge.snapped = false; object->horzEdge.start = start; object->horzEdge.end = end; object->horzEdge.next = v1; object->horzEdge.prev = v2; object->horzEdge.attract = v1 - EDGE_DISTANCE; object->horzEdge.velocity = EDGE_VELOCITY; } void Object::init (float positionX, float positionY, float velocityX, float velocityY) { force.x = 0; force.y = 0; position.x = positionX; position.y = positionY; velocity.x = velocityX; velocity.y = velocityY; theta = 0; immobile = false; edgeMask = 0; vertEdge.snapped = false; horzEdge.snapped = false; vertEdge.next = 0.0f; horzEdge.next = 0.0f; } void Spring::init (Object *newA, Object *newB, float newOffsetX, float newOffsetY) { a = newA; b = newB; offset.x = newOffsetX; offset.y = newOffsetY; } void Model::calcBounds () { topLeft.x = MAXSHORT; topLeft.y = MAXSHORT; bottomRight.x = MINSHORT; bottomRight.y = MINSHORT; Object *object = objects; for (int i = 0; i < numObjects; ++i, ++object) { if (topLeft.x > object->position.x) topLeft.x = object->position.x; else if (bottomRight.x < object->position.x) bottomRight.x = object->position.x; if (topLeft.y > object->position.y) topLeft.y = object->position.y; else if (bottomRight.y < object->position.y) bottomRight.y = object->position.y; } } void Model::addSpring (Object *a, Object *b, float offsetX, float offsetY) { Spring *spring; spring = &springs[numSprings]; ++numSprings; spring->init (a, b, offsetX, offsetY); } void Model::setMiddleAnchor (int x, int y, int width, int height) { float gx = ((GRID_WIDTH - 1) / 2 * width) / (float) (GRID_WIDTH - 1); float gy = ((GRID_HEIGHT - 1) / 2 * height) / (float) (GRID_HEIGHT - 1); if (anchorObject) anchorObject->immobile = false; anchorObject = &objects[GRID_WIDTH * ((GRID_HEIGHT - 1) / 2) + (GRID_WIDTH - 1) / 2]; anchorObject->position.x = x + gx; anchorObject->position.y = y + gy; anchorObject->immobile = true; } void Model::setTopAnchor (int x, int y, int width) { float gx = ((GRID_WIDTH - 1) / 2 * width) / (float) (GRID_WIDTH - 1); if (anchorObject) anchorObject->immobile = false; anchorObject = &objects[(GRID_WIDTH - 1) / 2]; anchorObject->position.x = x + gx; anchorObject->position.y = y; anchorObject->immobile = true; } void Model::addEdgeAnchors (int x, int y, int width, int height) { Object *o; o = &objects[0]; o->position.x = x; o->position.y = y; o->immobile = true; o = &objects[GRID_WIDTH - 1]; o->position.x = x + width; o->position.y = y; o->immobile = true; o = &objects[GRID_WIDTH * (GRID_HEIGHT - 1)]; o->position.x = x; o->position.y = y + height; o->immobile = true; o = &objects[numObjects - 1]; o->position.x = x + width; o->position.y = y + height; o->immobile = true; if (!anchorObject) anchorObject = &objects[0]; } void Model::removeEdgeAnchors (int x, int y, int width, int height) { Object *o; o = &objects[0]; o->position.x = x; o->position.y = y; if (o != anchorObject) o->immobile = false; o = &objects[GRID_WIDTH - 1]; o->position.x = x + width; o->position.y = y; if (o != anchorObject) o->immobile = false; o = &objects[GRID_WIDTH * (GRID_HEIGHT - 1)]; o->position.x = x; o->position.y = y + height; if (o != anchorObject) o->immobile = false; o = &objects[numObjects - 1]; o->position.x = x + width; o->position.y = y + height; if (o != anchorObject) o->immobile = false; } void Model::adjustObjectPosition (Object *object, int x, int y, int width, int height) { Object *o; int i = 0; for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++i) { o = &objects[i]; if (o == object) { o->position.x = x + (gridX * width) / (GRID_WIDTH - 1); o->position.y = y + (gridY * height) / (GRID_HEIGHT - 1); return; } } } } void Model::initObjects (int x, int y, int width, int height) { float gw = GRID_WIDTH - 1; float gh = GRID_HEIGHT - 1; Object *object = objects; for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++object) { object->init (x + (gridX * width) / gw, y + (gridY * height) / gh, 0, 0); } } setMiddleAnchor (x, y, width, height); } void WobblyWindow::updateModelSnapping () { unsigned int gridMask, mask; unsigned int edgeMask = model->edgeMask; if (model->snapCnt[North]) edgeMask &= ~SouthEdgeMask; else if (model->snapCnt[South]) edgeMask &= ~NorthEdgeMask; if (model->snapCnt[West]) edgeMask &= ~EastEdgeMask; else if (model->snapCnt[East]) edgeMask &= ~WestEdgeMask; Object *object = model->objects; for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { if (gridY == 0) gridMask = edgeMask & NorthEdgeMask; else if (gridY == GRID_HEIGHT - 1) gridMask = edgeMask & SouthEdgeMask; else gridMask = 0; for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++object) { mask = gridMask; if (gridX == 0) mask |= edgeMask & WestEdgeMask; else if (gridX == GRID_WIDTH - 1) mask |= edgeMask & EastEdgeMask; if (mask != object->edgeMask) { object->edgeMask = mask; if (mask & WestEdgeMask) { if (!object->vertEdge.snapped) findNextWestEdge (object); } else if (mask & EastEdgeMask) { if (!object->vertEdge.snapped) findNextEastEdge (object); } else object->vertEdge.snapped = false; if (mask & NorthEdgeMask) { if (!object->horzEdge.snapped) findNextNorthEdge (object); } else if (mask & SouthEdgeMask) { if (!object->horzEdge.snapped) findNextSouthEdge (object); } else object->horzEdge.snapped = false; } } } } void Model::reduceEdgeEscapeVelocity () { Object *object = objects; for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++object) { if (object->vertEdge.snapped) object->vertEdge.velocity *= drand48 () * 0.25f; if (object->horzEdge.snapped) object->horzEdge.velocity *= drand48 () * 0.25f; } } } bool Model::disableSnapping () { bool snapped = false; Object *object = objects; for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++object) { if (object->vertEdge.snapped || object->horzEdge.snapped) snapped = true; object->vertEdge.snapped = false; object->horzEdge.snapped = false; object->edgeMask = 0; } } memset (snapCnt, 0, sizeof (snapCnt)); return snapped; } void Model::adjustObjectsForShiver (int x, int y, int width, int height) { float vX, vY; float scale; float w = width; float h = height; Object *object = objects; for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++object) { if (!object->immobile) { vX = object->position.x - (x + w / 2); vY = object->position.y - (y + h / 2); vX /= w; vY /= h; scale = ((float) rand () * 7.5f) / RAND_MAX; object->velocity.x += vX * scale; object->velocity.y += vY * scale; } } } } void Model::initSprings (int x, int y, int width, int height) { int i = 0; numSprings = 0; float hpad = ((float) width) / (GRID_WIDTH - 1); float vpad = ((float) height) / (GRID_HEIGHT - 1); for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++i) { if (gridX > 0) addSpring (&objects[i - 1], &objects[i], hpad, 0); if (gridY > 0) addSpring (&objects[i - GRID_WIDTH], &objects[i], 0, vpad); } } } void Model::move (float tx, float ty) { Object *object = objects; for (int i = 0; i < numObjects; ++i, ++object) { object->position.x += tx; object->position.y += ty; } } Model::Model (int x, int y, int width, int height, unsigned int edgeMask) : numObjects (GRID_WIDTH * GRID_HEIGHT), numSprings (0), anchorObject (0), steps (0), edgeMask (edgeMask) { objects = new Object [numObjects]; memset (snapCnt, 0, sizeof (snapCnt)); initObjects (x, y, width, height); initSprings (x, y, width, height); calcBounds (); } void Object::applyForce (float fx, float fy) { force.x += fx; force.y += fy; } void Spring::exertForces (float k) { Vector da, db; Vector &aPos = a->position; Vector &bPos = b->position; da.x = 0.5f * (bPos.x - aPos.x - offset.x); da.y = 0.5f * (bPos.y - aPos.y - offset.y); db.x = 0.5f * (aPos.x - bPos.x + offset.x); db.y = 0.5f * (aPos.y - bPos.y + offset.y); a->applyForce (k * da.x, k * da.y); b->applyForce (k * db.x, k * db.y); } bool WobblyWindow::objectReleaseWestEastEdge (Object *object, Direction dir) { if (fabs (object->velocity.x) > object->vertEdge.velocity) { object->position.x += object->velocity.x * 2.0f; --model->snapCnt[dir]; object->vertEdge.snapped = false; object->edgeMask = 0; updateModelSnapping (); return true; } object->velocity.x = 0.0f; return false; } bool WobblyWindow::objectReleaseNorthSouthEdge (Object *object, Direction dir) { if (fabs (object->velocity.y) > object->horzEdge.velocity) { object->position.y += object->velocity.y * 2.0f; --model->snapCnt[dir]; object->horzEdge.snapped = false; object->edgeMask = 0; updateModelSnapping (); return true; } object->velocity.y = 0.0f; return false; } float WobblyWindow::modelStepObject (Object *object, float friction, float *force) { object->theta += 0.05f; if (object->immobile) { object->velocity.x = 0.0f; object->velocity.y = 0.0f; object->force.x = 0.0f; object->force.y = 0.0f; *force = 0.0f; return 0.0f; } else { object->force.x -= friction * object->velocity.x; object->force.y -= friction * object->velocity.y; object->velocity.x += object->force.x / MASS; object->velocity.y += object->force.y / MASS; if (object->edgeMask) { if (object->edgeMask & WestEdgeMask) { if (object->position.y < object->vertEdge.start || object->position.y > object->vertEdge.end) findNextWestEdge (object); if (!object->vertEdge.snapped || objectReleaseWestEastEdge (object, West)) { object->position.x += object->velocity.x; if (object->velocity.x < 0.0f && object->position.x < object->vertEdge.attract) { if (object->position.x < object->vertEdge.next) { object->vertEdge.snapped = true; object->position.x = object->vertEdge.next; object->velocity.x = 0.0f; ++model->snapCnt[West]; updateModelSnapping (); } else { object->velocity.x -= object->vertEdge.attract - object->position.x; } } if (object->position.x > object->vertEdge.prev) findNextWestEdge (object); } } else if (object->edgeMask & EastEdgeMask) { if (object->position.y < object->vertEdge.start || object->position.y > object->vertEdge.end) findNextEastEdge (object); if (!object->vertEdge.snapped || objectReleaseWestEastEdge (object, East)) { object->position.x += object->velocity.x; if (object->velocity.x > 0.0f && object->position.x > object->vertEdge.attract) { if (object->position.x > object->vertEdge.next) { object->vertEdge.snapped = true; object->position.x = object->vertEdge.next; object->velocity.x = 0.0f; ++model->snapCnt[East]; updateModelSnapping (); } else { object->velocity.x = object->position.x - object->vertEdge.attract; } } if (object->position.x < object->vertEdge.prev) findNextEastEdge (object); } } else object->position.x += object->velocity.x; if (object->edgeMask & NorthEdgeMask) { if (object->position.x < object->horzEdge.start || object->position.x > object->horzEdge.end) findNextNorthEdge (object); if (!object->horzEdge.snapped || objectReleaseNorthSouthEdge (object, North)) { object->position.y += object->velocity.y; if (object->velocity.y < 0.0f && object->position.y < object->horzEdge.attract) { if (object->position.y < object->horzEdge.next) { object->horzEdge.snapped = true; object->position.y = object->horzEdge.next; object->velocity.y = 0.0f; ++model->snapCnt[North]; updateModelSnapping (); } else { object->velocity.y -= object->horzEdge.attract - object->position.y; } } if (object->position.y > object->horzEdge.prev) findNextNorthEdge (object); } } else if (object->edgeMask & SouthEdgeMask) { if (object->position.x < object->horzEdge.start || object->position.x > object->horzEdge.end) findNextSouthEdge (object); if (!object->horzEdge.snapped || objectReleaseNorthSouthEdge (object, South)) { object->position.y += object->velocity.y; if (object->velocity.y > 0.0f && object->position.y > object->horzEdge.attract) { if (object->position.y > object->horzEdge.next) { object->horzEdge.snapped = true; object->position.y = object->horzEdge.next; object->velocity.y = 0.0f; ++model->snapCnt[South]; updateModelSnapping (); } else { object->velocity.y = object->position.y - object->horzEdge.attract; } } if (object->position.y < object->horzEdge.prev) findNextSouthEdge (object); } } else object->position.y += object->velocity.y; } else { object->position.x += object->velocity.x; object->position.y += object->velocity.y; } *force = fabs (object->force.x) + fabs (object->force.y); object->force.x = 0.0f; object->force.y = 0.0f; return fabs (object->velocity.x) + fabs (object->velocity.y); } } unsigned int WobblyWindow::modelStep (float friction, float k, float time) { unsigned int wobbly = 0; float velocitySum = 0.0f; float force, forceSum = 0.0f; model->steps += time / 15.0f; int steps = floor (model->steps); model->steps -= steps; if (!steps) return WobblyInitialMask; for (int j = 0; j < steps; ++j) { for (int i = 0; i < model->numSprings; ++i) model->springs[i].exertForces (k); for (int i = 0; i < model->numObjects; ++i) { velocitySum += modelStepObject (&model->objects[i], friction, &force); forceSum += force; } } model->calcBounds (); if (velocitySum > 0.5f) wobbly |= WobblyVelocityMask; if (forceSum > 20.0f) wobbly |= WobblyForceMask; return wobbly; } void Model::bezierPatchEvaluate (float u, float v, float *patchX, float *patchY) { float coeffsU[4], coeffsV[4]; coeffsU[0] = (1 - u) * (1 - u) * (1 - u); coeffsU[1] = 3 * u * (1 - u) * (1 - u); coeffsU[2] = 3 * u * u * (1 - u); coeffsU[3] = u * u * u; coeffsV[0] = (1 - v) * (1 - v) * (1 - v); coeffsV[1] = 3 * v * (1 - v) * (1 - v); coeffsV[2] = 3 * v * v * (1 - v); coeffsV[3] = v * v * v; float x = 0.0f; float y = 0.0f; for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { x += coeffsU[i] * coeffsV[j] * objects[j * GRID_WIDTH + i].position.x; y += coeffsU[i] * coeffsV[j] * objects[j * GRID_WIDTH + i].position.y; } } *patchX = x; *patchY = y; } bool WobblyWindow::ensureModel () { if (!model) { unsigned int edgeMask = 0; CompRect outRect (window->outputRect ()); if (window->type () & CompWindowTypeNormalMask) edgeMask = WestEdgeMask | EastEdgeMask | NorthEdgeMask | SouthEdgeMask; try { model = new Model (outRect.x (), outRect.y (), outRect.width (), outRect.height (), edgeMask); } catch (std::bad_alloc &) { return false; } } return true; } float Object::distanceToPoint (float x, float y) { float dx = position.x - x; float dy = position.y - y; return sqrt (dx * dx + dy * dy); } Object * Model::findNearestObject (float x, float y) { Object *object = &objects[0]; float distance, minDistance = 0.0; for (int i = 0; i < numObjects; ++i) { distance = objects[i].distanceToPoint (x, y); if (i == 0 || distance < minDistance) { minDistance = distance; object = &objects[i]; } } return object; } bool WobblyWindow::isWobblyWin () { if (model) return true; /* avoid tiny windows */ if (window->width () == 1 && window->height () == 1) return false; const CompWindow::Geometry &geom = window->geometry (); /* avoid fullscreen windows */ if (geom.x () <= 0 && geom.y () <= 0 && geom.x () + window->width () >= ::screen->width () && geom.y () + window->height () >= ::screen->height ()) return false; return true; } void WobblyScreen::preparePaint (int msSinceLastPaint) { if (wobblingWindowsMask & (WobblyInitialMask | WobblyVelocityMask)) { Point topLeft, bottomRight; float friction, springK; Model *model; friction = optionGetFriction (); springK = optionGetSpringK (); wobblingWindowsMask = false; foreach (CompWindow *w, ::screen->windows ()) { WobblyWindow *ww = WobblyWindow::get (w); if (ww->wobblingMask) { if (ww->wobblingMask & (WobblyInitialMask | WobblyVelocityMask)) { model = ww->model; topLeft = model->topLeft; bottomRight = model->bottomRight; ww->wobblingMask = ww->modelStep (friction, springK, (ww->wobblingMask & (unsigned) WobblyVelocityMask) ? msSinceLastPaint : cScreen->redrawTime ()); if ((ww->state & MAXIMIZE_STATE) && ww->grabbed) ww->wobblingMask |= WobblyForceMask; if (ww->wobblingMask) { /* snapped to more than one edge, we have to reduce edge escape velocity until only one edge is snapped */ if (ww->wobblingMask == WobblyForceMask && !ww->grabbed) { ww->model->reduceEdgeEscapeVelocity (); ww->wobblingMask |= WobblyInitialMask; } if (!ww->grabbed && constraintBox) { float topmostYPos = MAXSHORT; float bottommostYPos = MINSHORT; for (int i = 0; i < GRID_WIDTH; ++i) { int modelY = model->objects[i].position.y; /* find the bottommost top-row object */ bottommostYPos = MAX (modelY, bottommostYPos); /* find the topmost top-row object */ topmostYPos = MIN (modelY, topmostYPos); } int decorTop = bottommostYPos + w->output ().top - w->border ().top; int decorTitleBottom = topmostYPos + w->output ().top; if (constraintBox->y () > decorTop) { /* constrain to work area box top edge */ model->move (0, constraintBox->y () - decorTop); model->calcBounds (); } else if (constraintBox->y2 () < decorTitleBottom) { /* constrain to work area box bottom edge */ model->move (0, constraintBox->y2 () - decorTitleBottom); model->calcBounds (); } } } else { ww->model = 0; if (w->geometry ().x () == w->serverX () && w->geometry ().y () == w->serverY ()) { w->move (model->topLeft.x + w->output ().left - w->geometry ().x (), model->topLeft.y + w->output ().top - w->geometry ().y (), true); } ww->model = model; } if (!(cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_ALL_MASK)) { CompositeWindow *cw = CompositeWindow::get (w); if (ww->wobblingMask) { Point topLeft2 = ww->model->topLeft; Point bottomRight2 = ww->model->bottomRight; // Find the bounding box of the two rectangles if (topLeft.x > topLeft2.x) topLeft.x = topLeft2.x; if (topLeft.y > topLeft2.y) topLeft.y = topLeft2.y; if (bottomRight.x < bottomRight2.x) bottomRight.x = bottomRight2.x; if (bottomRight.y < bottomRight2.y) bottomRight.y = bottomRight2.y; } else cw->addDamage (); int wx = w->geometry ().x (); int wy = w->geometry ().y (); int borderWidth = w->geometry ().border (); // Damage a box that's 1-pixel larger on each side // to prevent artifacts topLeft.x -= 1; topLeft.y -= 1; bottomRight.x += 1; bottomRight.y += 1; topLeft.x -= wx + borderWidth; topLeft.y -= wy + borderWidth; bottomRight.x += 0.5f - (wx + borderWidth); bottomRight.y += 0.5f - (wy + borderWidth); cw->addDamageRect (CompRect (topLeft.x, topLeft.y, bottomRight.x - topLeft.x, bottomRight.y - topLeft.y)); } } if (!ww->wobblingMask) // Wobbling just finished for this window ww->enableWobbling (false); wobblingWindowsMask |= ww->wobblingMask; } } } cScreen->preparePaint (msSinceLastPaint); } void WobblyScreen::donePaint () { if (wobblingWindowsMask & (WobblyVelocityMask | WobblyInitialMask)) cScreen->damagePending (); if (!wobblingWindowsMask) { // Wobbling has finished for all windows cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); constraintBox = NULL; } cScreen->donePaint (); } void WobblyWindow::glAddGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { CompRect outRect (window->outputRect ()); int wx = outRect.x (); int wy = outRect.y (); int width = outRect.width (); int height = outRect.height (); int gridW = width / wScreen->optionGetGridResolution (); if (gridW < wScreen->optionGetMinGridSize ()) gridW = wScreen->optionGetMinGridSize (); int gridH = height / wScreen->optionGetGridResolution (); if (gridH < wScreen->optionGetMinGridSize ()) gridH = wScreen->optionGetMinGridSize (); if (gridW > (int) maxGridWidth) gridW = (int) maxGridWidth; if (gridH > (int) maxGridHeight) gridH = (int) maxGridHeight; GLVertexBuffer *vb = gWindow->vertexBuffer (); int oldCount = vb->countVertices (); gWindow->glAddGeometry (matrix, region, clip, gridW, gridH); int newCount = vb->countVertices (); int stride = vb->getVertexStride (); GLfloat *v = vb->getVertices () + oldCount * stride; GLfloat *vMax = vb->getVertices () + newCount * stride; for (; v < vMax; v += stride) { float deformedX, deformedY; GLfloat normalizedX = (v[0] - wx) / width; GLfloat normalizedY = (v[1] - wy) / height; model->bezierPatchEvaluate (normalizedX, normalizedY, &deformedX, &deformedY); v[0] = deformedX; v[1] = deformedY; } } bool WobblyWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (wobblingMask) mask |= PAINT_WINDOW_TRANSFORMED_MASK; return gWindow->glPaint (attrib, transform, region, mask); } bool WobblyScreen::enableSnapping () { foreach (CompWindow *w, ::screen->windows ()) { WobblyWindow *ww = WobblyWindow::get (w); if (ww->grabbed && ww->model) ww->updateModelSnapping (); } snapping = true; return false; } bool WobblyScreen::disableSnapping () { if (!snapping) return false; foreach (CompWindow *w, ::screen->windows ()) { WobblyWindow *ww = WobblyWindow::get (w); if (ww->grabbed && ww->model && ww->model->disableSnapping ()) startWobbling (ww); } snapping = false; return false; } bool WobblyScreen::shiver (CompOption::Vector &options) { Window xid = (Window) CompOption::getIntOptionNamed (options, "window"); CompWindow *w = ::screen->findWindow (xid); if (w) { WobblyWindow *ww = WobblyWindow::get (w); if (ww->isWobblyWin () && ww->ensureModel ()) { CompRect outRect (w->serverOutputRect ()); ww->model->setMiddleAnchor (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); ww->model->adjustObjectsForShiver (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); startWobbling (ww); } } return false; } void WobblyWindow::windowNotify (CompWindowNotify n) { switch (n) { case CompWindowNotifyMap: if (model && isWobblyWin ()) initiateMapEffect (); break; default: break; } window->windowNotify (n); } void WobblyScreen::handleEvent (XEvent *event) { Window activeWindow = ::screen->activeWindow (); CompWindow *w; if (event->type == ::screen->xkbEvent ()) { XkbAnyEvent *xkbEvent = (XkbAnyEvent *) event; if (xkbEvent->xkb_type == XkbStateNotify) { XkbStateNotifyEvent *stateEvent = (XkbStateNotifyEvent *) event; CompAction *action; unsigned int mods = 0xffffffff; action = &optionGetSnapKey (); bool inverted = optionGetSnapInverted (); if (action->type () & CompAction::BindingTypeKey) mods = action->key ().modifiers (); if ((stateEvent->mods & mods) == mods) { if (inverted) disableSnapping (); else enableSnapping (); } else { if (inverted) enableSnapping (); else disableSnapping (); } } } ::screen->handleEvent (event); switch (event->type) { case MotionNotify: if (event->xmotion.root == ::screen->root () && grabWindow && moveWindow && optionGetMaximizeEffect ()) { WobblyWindow *ww = WobblyWindow::get (grabWindow); if (ww && (ww->state & MAXIMIZE_STATE)) { if (ww->model && ww->grabbed) { int dx, dy; if (ww->state & CompWindowStateMaximizedHorzMask) dx = pointerX - lastPointerX; else dx = 0; if (ww->state & CompWindowStateMaximizedVertMask) dy = pointerY - lastPointerY; else dy = 0; ww->model->anchorObject->position.x += dx; ww->model->anchorObject->position.y += dy; startWobbling (ww); } } } break; default: break; } if (::screen->activeWindow () != activeWindow) { w = screen->findWindow (::screen->activeWindow ()); if (!w) return; WobblyWindow *ww = WobblyWindow::get (w); if (ww->isWobblyWin ()) { int focusEffect = optionGetFocusEffect (); if ((focusEffect != WobblyOptions::FocusEffectNone) && optionGetFocusWindowMatch ().evaluate (w) && ww->ensureModel ()) { switch (focusEffect) { case WobblyOptions::FocusEffectShiver: { CompRect outRect (w->serverOutputRect ()); ww->model->adjustObjectsForShiver (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); } break; default: break; } startWobbling (ww); } } } } void WobblyWindow::enableWobbling (bool enabling) { gWindow->glPaintSetEnabled (this, enabling); gWindow->glAddGeometrySetEnabled (this, enabling); cWindow->damageRectSetEnabled (this, enabling); } void WobblyScreen::startWobbling (WobblyWindow *ww) { if (!ww->wobblingMask) ww->enableWobbling (true); if (!wobblingWindowsMask) { cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); } ww->wobblingMask |= WobblyInitialMask; wobblingWindowsMask |= ww->wobblingMask; cScreen->damagePending (); } bool WobblyWindow::damageRect (bool initial, const CompRect &rect) { if (!initial) if (wobblingMask == WobblyForceMask) { int x1 = model->topLeft.x; int y1 = model->topLeft.y; int x2 = model->bottomRight.x + 0.5f; int y2 = model->bottomRight.y + 0.5f; wScreen->cScreen->damageRegion (CompRegion (x1, y1, x2 - x1, y2 - y1)); return true; } return cWindow->damageRect (initial, rect); } void WobblyWindow::initiateMapEffect () { int mapEffect = wScreen->optionGetMapEffect (); if ((mapEffect != WobblyOptions::MapEffectNone) && wScreen->optionGetMapWindowMatch ().evaluate (window) && ensureModel ()) { CompRect outRect (window->outputRect ()); model->initObjects (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); model->initSprings (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); switch (mapEffect) { case WobblyOptions::MapEffectShiver: model->adjustObjectsForShiver (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); break; default: break; } wScreen->startWobbling (this); } } void WobblyWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { CompRect outRect (window->outputRect ()); if (wScreen->optionGetMaximizeEffect () && isWobblyWin () && /* prevent wobbling when shading maximized windows - assuming that the height difference shaded - non-shaded will hardly be -1 and a lack of wobbly animation in that corner case is tolerable */ (dheight != -1) && ((window->state () | state) & MAXIMIZE_STATE)) { state &= (unsigned)~MAXIMIZE_STATE; state |= window->state () & MAXIMIZE_STATE; if (ensureModel ()) { if (window->state () & MAXIMIZE_STATE) { if (!grabbed && model->anchorObject) { model->anchorObject->immobile = false; model->anchorObject = NULL; } model->addEdgeAnchors (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); } else { model->removeEdgeAnchors (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); model->setMiddleAnchor (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); } model->initSprings (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); wScreen->startWobbling (this); } } else if (model) { if (wobblingMask && !(state & MAXIMIZE_STATE)) model->setTopAnchor (outRect.x (), outRect.y (), outRect.width ()); else model->initObjects (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); model->initSprings (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); } /* update grab */ if (model && grabbed) { if (model->anchorObject) model->anchorObject->immobile = false; model->anchorObject = model->findNearestObject (pointerX, pointerY); model->anchorObject->immobile = true; model->adjustObjectPosition (model->anchorObject, outRect.x (), outRect.y (), outRect.width (), outRect.height ()); } window->resizeNotify (dx, dy, dwidth, dheight); } void WobblyWindow::moveNotify (int dx, int dy, bool immediate) { if (model) { if (grabbed && !immediate) { if (state & MAXIMIZE_STATE) { Object *object = model->objects; for (int i = 0; i < model->numObjects; ++i, ++object) { if (object->immobile) { object->position.x += dx; object->position.y += dy; } } } else { model->anchorObject->position.x += dx; model->anchorObject->position.y += dy; } wScreen->startWobbling (this); } else model->move (dx, dy); } window->moveNotify (dx, dy, immediate); } void WobblyWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { if (!wScreen->grabWindow) { wScreen->grabMask = mask; wScreen->grabWindow = window; } wScreen->moveWindow = false; if (mask & (CompWindowGrabButtonMask) && mask & (CompWindowGrabMoveMask) && wScreen->optionGetMoveWindowMatch ().evaluate (window) && isWobblyWin ()) { wScreen->moveWindow = true; if (ensureModel ()) { Spring *s; if (wScreen->optionGetMaximizeEffect ()) { CompRect outRect (window->outputRect ()); if (window->state () & MAXIMIZE_STATE) model->addEdgeAnchors (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); else { model->removeEdgeAnchors (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); if (model->anchorObject) model->anchorObject->immobile = false; } } else if (model->anchorObject) model->anchorObject->immobile = false; model->anchorObject = model->findNearestObject (x, y); model->anchorObject->immobile = true; grabbed = true; /* Update isConstrained and work area box at grab time */ wScreen->yConstrained = false; if (mask & CompWindowGrabExternalAppMask) { CompPlugin *pMove; pMove = CompPlugin::find ("move"); if (pMove) { CompOption::Vector &moveOptions = pMove->vTable->getOptions (); wScreen->yConstrained = CompOption::getBoolOptionNamed (moveOptions, "constrain_y", true); } } if (wScreen->yConstrained) { int output = ::screen->outputDeviceForGeometry (window->serverGeometry ()); wScreen->constraintBox = &::screen->outputDevs ()[output].workArea (); } if (mask & CompWindowGrabMoveMask) { model->disableSnapping (); if (wScreen->snapping) updateModelSnapping (); } if (wScreen->optionGetGrabWindowMatch ().evaluate (window)) { for (int i = 0; i < model->numSprings; ++i) { s = &model->springs[i]; if (s->a == model->anchorObject) { s->b->velocity.x -= s->offset.x * 0.05f; s->b->velocity.y -= s->offset.y * 0.05f; } else if (s->b == model->anchorObject) { s->a->velocity.x += s->offset.x * 0.05f; s->a->velocity.y += s->offset.y * 0.05f; } } wScreen->startWobbling (this); } } } window->grabNotify (x, y, state, mask); } void WobblyWindow::ungrabNotify () { if (window == wScreen->grabWindow) { wScreen->grabMask = 0; wScreen->grabWindow = NULL; wScreen->constraintBox = NULL; } if (grabbed) { if (model) { if (model->anchorObject) model->anchorObject->immobile = false; model->anchorObject = NULL; if (wScreen->optionGetMaximizeEffect () && (state & MAXIMIZE_STATE)) { CompRect outRect (window->outputRect ()); model->addEdgeAnchors (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); } wScreen->startWobbling (this); } grabbed = false; } window->ungrabNotify (); } bool WobblyScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (wobblingWindowsMask) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } void WobblyScreen::snapKeyChanged (CompOption *opt) { // ignore the key CompAction::KeyBinding newKeyBinding (0, opt->value ().action ().key ().modifiers ()); opt->value ().action ().setKey (newKeyBinding); } void WobblyScreen::snapInvertedChanged (CompOption *opt) { // ignore the key if (opt->value ().b ()) enableSnapping (); else disableSnapping (); } WobblyScreen::WobblyScreen (CompScreen *s) : PluginClassHandler (s), cScreen (CompositeScreen::get (s)), gScreen (GLScreen::get (s)), wobblingWindowsMask (0), grabMask (0), grabWindow (NULL), moveWindow (false), snapping (false), yConstrained (false), constraintBox (NULL) { optionSetSnapKeyInitiate (boost::bind (&WobblyScreen::enableSnapping, this)); optionSetSnapKeyTerminate (boost::bind (&WobblyScreen::disableSnapping, this)); optionSetShiverInitiate (boost::bind (&WobblyScreen::shiver, this, _3)); optionSetSnapKeyNotify (boost::bind (&WobblyScreen::snapKeyChanged, _1)); optionSetSnapInvertedNotify (boost::bind (&WobblyScreen::snapInvertedChanged, this, _1)); ScreenInterface::setHandler (::screen); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } WobblyWindow::WobblyWindow (CompWindow *w) : PluginClassHandler (w), wScreen (WobblyScreen::get (::screen)), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), model (0), wobblingMask (0), grabbed (false), state (w->state ()) { if (((w->mapNum () && wScreen->optionGetMaximizeEffect ()) || wScreen->optionGetMapEffect () != WobblyOptions::MapEffectNone) && isWobblyWin ()) ensureModel (); WindowInterface::setHandler (window); CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); } WobblyWindow::~WobblyWindow () { if (wScreen->grabWindow == window) { wScreen->grabWindow = NULL; wScreen->grabMask = 0; } if (model) delete model; } Model::~Model () { delete[] objects; } bool WobblyPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/wobbly/src/wobbly.h0000644000015301777760000002261512321343002022715 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ /* * Spring model implemented by Kristian Hogsberg. */ #include #include #include #include #include #include "wobbly_options.h" #define SNAP_WINDOW_TYPE (CompWindowTypeNormalMask | \ CompWindowTypeToolbarMask | \ CompWindowTypeMenuMask | \ CompWindowTypeUtilMask) const unsigned short GRID_WIDTH = 4; const unsigned short GRID_HEIGHT = 4; const unsigned short MODEL_MAX_SPRINGS = (GRID_WIDTH * GRID_HEIGHT * 2); extern const float MASS; #define NorthEdgeMask (1L << 0) #define SouthEdgeMask (1L << 1) #define WestEdgeMask (1L << 2) #define EastEdgeMask (1L << 3) extern const unsigned short EDGE_DISTANCE; extern const unsigned short EDGE_VELOCITY; typedef enum { North = 0, South, West, East } Direction; #define WobblyInitialMask (1L << 0) #define WobblyForceMask (1L << 1) #define WobblyVelocityMask (1L << 2) class WobblyWindow; typedef struct _xy_pair { float x, y; } Point, Vector; typedef struct _Edge { float next, prev; float start; float end; float attract; float velocity; bool snapped; } Edge; class Object { public: Vector force; Point position; Vector velocity; float theta; bool immobile; unsigned int edgeMask; Edge vertEdge; Edge horzEdge; void init (float positionX, float positionY, float velocityX, float velocityY); void applyForce (float fx, float fy); float distanceToPoint (float x, float y); }; class Spring { public: Object *a; Object *b; Vector offset; void init (Object *newA, Object *newB, float newOffsetX, float newOffsetY); void exertForces (float k); }; class Model { public: Model (int x, int y, int width, int height, unsigned int edgeMask); ~Model (); void calcBounds (); void addSpring (Object *a, Object *b, float offsetX, float offsetY); void setMiddleAnchor (int x, int y, int width, int height); void setTopAnchor (int x, int y, int width); void addEdgeAnchors (int x, int y, int width, int height); void removeEdgeAnchors (int x, int y, int width, int height); void adjustObjectPosition (Object *object, int x, int y, int width, int height); void initObjects (int x, int y, int width, int height); void initSprings (int x, int y, int width, int height); void reduceEdgeEscapeVelocity (); bool disableSnapping (); void adjustObjectsForShiver (int x, int y, int width, int height); void move (float tx, float ty); void bezierPatchEvaluate (float u, float v, float *patchX, float *patchY); Object * findNearestObject (float x, float y); Object *objects; int numObjects; Spring springs[MODEL_MAX_SPRINGS]; int numSprings; Object *anchorObject; float steps; Point topLeft; Point bottomRight; unsigned int edgeMask; unsigned int snapCnt[4]; }; class WobblyScreen : public PluginClassHandler, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public WobblyOptions { public: WobblyScreen (CompScreen *s); bool enableSnapping (); bool disableSnapping (); bool shiver (CompOption::Vector &options); /// Start given window's wobbling void startWobbling (WobblyWindow *ww); // ScreenInterface methods void handleEvent (XEvent *event); // CompositeScreenInterface methods void preparePaint (int); void donePaint (); // GLScreenInterface methods bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); static void snapKeyChanged (CompOption *opt); void snapInvertedChanged (CompOption *opt); CompositeScreen *cScreen; GLScreen *gScreen; unsigned int wobblingWindowsMask; unsigned int grabMask; CompWindow *grabWindow; bool moveWindow; bool snapping; bool yConstrained; const CompRect *constraintBox; }; class WobblyWindow : public PluginClassHandler, public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: WobblyWindow (CompWindow *); ~WobblyWindow (); void findNextWestEdge (Object *object); void findNextEastEdge (Object *object); void findNextNorthEdge (Object *object); void findNextSouthEdge (Object *object); void updateModelSnapping (); bool objectReleaseWestEastEdge (Object *object, Direction dir); bool objectReleaseNorthSouthEdge (Object *object, Direction dir); float modelStepObject (Object *object, float friction, float *force); unsigned int modelStep (float friction, float k, float time); bool ensureModel (); bool isWobblyWin (); void enableWobbling (bool enabling); void initiateMapEffect (); // WindowInterface methods void resizeNotify (int dx, int dy, int dwidth, int dheight); void moveNotify (int dx, int dy, bool immediate); void grabNotify (int x, int y, unsigned int state, unsigned int mask); void ungrabNotify (); void windowNotify (CompWindowNotify n); // CompositeWindowInterface methods bool damageRect (bool, const CompRect &); // GLWindowInterface methods bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void glAddGeometry (const GLTexture::MatrixList &, const CompRegion &, const CompRegion &, unsigned int = MAXSHORT, unsigned int = MAXSHORT); WobblyScreen *wScreen; CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; Model *model; unsigned int wobblingMask; bool grabbed; bool velocity; unsigned int state; }; class WobblyPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; /* TODO rm #define WIN_X(w) ((w)->attrib.x - (w)->output.left) #define WIN_Y(w) ((w)->attrib.y - (w)->output.top) #define WIN_W(w) ((w)->width + (w)->output.left + (w)->output.right) #define WIN_H(w) ((w)->height + (w)->output.top + (w)->output.bottom) #define WOBBLY_SCREEN_OPTION_FRICTION 0 #define WOBBLY_SCREEN_OPTION_SPRING_K 1 #define WOBBLY_SCREEN_OPTION_GRID_RESOLUTION 2 #define WOBBLY_SCREEN_OPTION_MIN_GRID_SIZE 3 #define WOBBLY_SCREEN_OPTION_MAP_EFFECT 4 #define WOBBLY_SCREEN_OPTION_FOCUS_EFFECT 5 #define WOBBLY_SCREEN_OPTION_MAP_WINDOW_MATCH 6 #define WOBBLY_SCREEN_OPTION_FOCUS_WINDOW_MATCH 7 #define WOBBLY_SCREEN_OPTION_GRAB_WINDOW_MATCH 8 #define WOBBLY_SCREEN_OPTION_MOVE_WINDOW_MATCH 9 #define WOBBLY_SCREEN_OPTION_MAXIMIZE_EFFECT 10 #define WOBBLY_SCREEN_OPTION_NUM 11 static CompMetadata wobblyMetadata; static int displayPrivateIndex; #define WOBBLY_DISPLAY_OPTION_SNAP_KEY 0 #define WOBBLY_DISPLAY_OPTION_SNAP_INVERTED 1 #define WOBBLY_DISPLAY_OPTION_SHIVER 2 #define WOBBLY_DISPLAY_OPTION_NUM 3 #define WOBBLY_EFFECT_NONE 0 #define WOBBLY_EFFECT_SHIVER 1 #define WOBBLY_EFFECT_LAST WOBBLY_EFFECT_SHIVER #define GET_WOBBLY_DISPLAY(d) \ ((WobblyDisplay *) (d)->base.privates[displayPrivateIndex].ptr) #define WOBBLY_DISPLAY(d) \ WobblyDisplay *wd = GET_WOBBLY_DISPLAY (d) #define GET_WOBBLY_SCREEN(s, wd) \ ((WobblyScreen *) (s)->base.privates[(wd)->screenPrivateIndex].ptr) #define WOBBLY_SCREEN(s) \ WobblyScreen *ws = GET_WOBBLY_SCREEN (s, GET_WOBBLY_DISPLAY (s->display)) #define GET_WOBBLY_WINDOW(w, ws) \ ((WobblyWindow *) (w)->base.privates[(ws)->windowPrivateIndex].ptr) #define WOBBLY_WINDOW(w) \ WobblyWindow *ww = GET_WOBBLY_WINDOW (w, \ GET_WOBBLY_SCREEN (w->screen, \ GET_WOBBLY_DISPLAY (w->screen->display))) #define NUM_OPTIONS(s) (sizeof ((s)->opt) / sizeof (CompOption)) */ compiz-0.9.11+14.04.20140409/plugins/resizeinfo/0000755000015301777760000000000012321344021021332 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/resizeinfo/resizeinfo.xml.in0000644000015301777760000000543312321343002024641 0ustar pbusernogroup00000000000000 <_short>Resize Info <_long>Display info on resize similar to metacity Utility opengl opengl composite resize decor compiz-0.9.11+14.04.20140409/plugins/resizeinfo/CMakeLists.txt0000644000015301777760000000023312321343002024066 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (resizeinfo PLUGINDEPS opengl composite PKGDEPS pango pangocairo cairo-xlib-xrender) compiz-0.9.11+14.04.20140409/plugins/resizeinfo/src/0000755000015301777760000000000012321344021022121 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/resizeinfo/src/resizeinfo.cpp0000644000015301777760000003561012321343002025005 0ustar pbusernogroup00000000000000/** * * Compiz metacity like info during resize * * resizeinfo.cpp * * Copyright (c) 2007 Robert Carr * * Compiz resize atom usage and general cleanups by * Copyright (c) 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "resizeinfo.h" COMPIZ_PLUGIN_20090315 (resizeinfo, InfoPluginVTable); const unsigned short RESIZE_POPUP_WIDTH = 100; const unsigned short RESIZE_POPUP_HEIGHT = 33; const double PI = 3.14159265359f; /* Set up an InfoLayer to build a cairo->opengl texture pipeline */ InfoLayer::~InfoLayer () { if (cr) cairo_destroy (cr); if (surface) cairo_surface_destroy (surface); if (pixmap) XFreePixmap (screen->dpy (), pixmap); } /* Here 's' is Screen * 'screen' is 'CompScreen *' */ InfoLayer::InfoLayer () : valid (false), s (ScreenOfDisplay (screen->dpy (), screen->screenNum ())), pixmap (None), surface (NULL), cr (NULL) { format = XRenderFindStandardFormat (screen->dpy (), PictStandardARGB32); if (!format) return; pixmap = XCreatePixmap (screen->dpy (), screen->root (), RESIZE_POPUP_WIDTH, RESIZE_POPUP_HEIGHT, 32); if (!pixmap) return; surface = cairo_xlib_surface_create_with_xrender_format (screen->dpy (), pixmap, s, format, RESIZE_POPUP_WIDTH, RESIZE_POPUP_HEIGHT); if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS) { compLogMessage ("resizeinfo", CompLogLevelWarn, "Could not create cairo layer surface,"); return; } texture = GLTexture::bindPixmapToTexture (pixmap, RESIZE_POPUP_WIDTH, RESIZE_POPUP_HEIGHT, 32); if (!texture.size ()) { compLogMessage ("resizeinfo", CompLogLevelWarn, "Bind Pixmap to Texture failure"); return; } cr = cairo_create (surface); if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) { compLogMessage ("resizeinfo", CompLogLevelWarn, "Could not create cairo context"); return; } valid = true; } /* Draw the window "size" derived from the window hints. We calculate width or height - base_width or base_height and divide it by the increment in each direction. For windows like terminals setting the proper size hints this gives us the number of columns/rows. */ void InfoLayer::renderText () { unsigned short *color; char info[50]; PangoLayout *layout; PangoFontDescription *font; int w, h; INFO_SCREEN (screen); if (!valid) return; unsigned int baseWidth = is->pWindow->sizeHints ().base_width; unsigned int baseHeight = is->pWindow->sizeHints ().base_height; unsigned int widthInc = is->pWindow->sizeHints ().width_inc; unsigned int heightInc = is->pWindow->sizeHints ().height_inc; unsigned int width = is->resizeGeometry.width; unsigned int height = is->resizeGeometry.height; color = is->optionGetTextColor (); unsigned int xv = (widthInc > 1) ? (width - baseWidth) / widthInc : width; unsigned int yv = (heightInc > 1) ? (height - baseHeight) / heightInc : height; /* Clear the context. */ cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); snprintf (info, 50, "%u x %u", xv, yv); font = pango_font_description_new (); layout = pango_cairo_create_layout (is->textLayer.cr); pango_font_description_set_family (font,"Sans"); pango_font_description_set_absolute_size (font, is->optionGetResizeinfoFontSize () * PANGO_SCALE); pango_font_description_set_style (font, PANGO_STYLE_NORMAL); if (is->optionGetResizeinfoFontBold ()) pango_font_description_set_weight (font, PANGO_WEIGHT_BOLD); else pango_font_description_set_weight (font, PANGO_WEIGHT_NORMAL); pango_layout_set_font_description (layout, font); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); pango_layout_set_text (layout, info, -1); pango_layout_get_pixel_size (layout, &w, &h); cairo_move_to (cr, RESIZE_POPUP_WIDTH / 2.0f - w / 2.0f, RESIZE_POPUP_HEIGHT / 2.0f - h / 2.0f); pango_layout_set_width (layout, RESIZE_POPUP_WIDTH * PANGO_SCALE); pango_cairo_update_layout (cr, layout); cairo_set_source_rgba (cr, *(color) / (float)0xffff, *(color + 1) / (float)0xffff, *(color + 2) / (float)0xffff, *(color + 3) / (float)0xffff); pango_cairo_show_layout (cr, layout); pango_font_description_free (font); g_object_unref (layout); } /* Draw the background. We draw this on a second layer so that we do not have to draw it each time we have to update. Granted we could use some cairo trickery for this... */ void InfoLayer::renderBackground () { cairo_pattern_t *pattern; float border = 7.5; float r, g, b, a; INFO_SCREEN (screen); if (!valid) return; cairo_set_line_width (cr, 1.0f); /* Clear */ cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); /* Setup Gradient */ pattern = cairo_pattern_create_linear (0, 0, RESIZE_POPUP_WIDTH, RESIZE_POPUP_HEIGHT); r = is->optionGetGradient1Red () / (float)0xffff; g = is->optionGetGradient1Green () / (float)0xffff; b = is->optionGetGradient1Blue () / (float)0xffff; a = is->optionGetGradient1Alpha () / (float)0xffff; cairo_pattern_add_color_stop_rgba (pattern, 0.00f, r, g, b, a); r = is->optionGetGradient2Red () / (float)0xffff; g = is->optionGetGradient2Green () / (float)0xffff; b = is->optionGetGradient2Blue () / (float)0xffff; a = is->optionGetGradient2Alpha () / (float)0xffff; cairo_pattern_add_color_stop_rgba (pattern, 0.65f, r, g, b, a); r = is->optionGetGradient3Red () / (float)0xffff; g = is->optionGetGradient3Green () / (float)0xffff; b = is->optionGetGradient3Blue () / (float)0xffff; a = is->optionGetGradient3Alpha () / (float)0xffff; cairo_pattern_add_color_stop_rgba (pattern, 0.85f, r, g, b, a); cairo_set_source (cr, pattern); /* Rounded Rectangle! */ cairo_arc (cr, border, border, border, PI, 1.5f * PI); cairo_arc (cr, border + RESIZE_POPUP_WIDTH - 2 * border, border, border, 1.5f * PI, 2.0 * PI); cairo_arc (cr, RESIZE_POPUP_WIDTH - border, RESIZE_POPUP_HEIGHT - border, border, 0, PI / 2.0f); cairo_arc (cr, border, RESIZE_POPUP_HEIGHT - border, border, PI / 2.0f, PI); cairo_close_path (cr); cairo_fill_preserve (cr); /* Outline */ r = is->optionGetOutlineColorRed () / (float)0xffff; g = is->optionGetOutlineColorGreen () / (float)0xffff; b = is->optionGetOutlineColorBlue () / (float)0xffff; a = is->optionGetOutlineColorAlpha () / (float)0xffff; cairo_set_source_rgba (cr, r, g, b, a); cairo_stroke (cr); cairo_pattern_destroy (pattern); } static void backgroundColorChanged (CompOption *o, ResizeinfoOptions::Options num) { INFO_SCREEN (screen); is->backgroundLayer.renderBackground (); } void InfoScreen::damagePaintRegion () { if (!fadeTime && !drawing) return; int x = resizeGeometry.x + resizeGeometry.width / 2.0f - RESIZE_POPUP_WIDTH / 2.0f; int y = resizeGeometry.y + resizeGeometry.height / 2.0f - RESIZE_POPUP_HEIGHT / 2.0f; CompRegion reg (x - 5, y - 5, (RESIZE_POPUP_WIDTH + 5), (RESIZE_POPUP_HEIGHT + 5)); cScreen->damageRegion (reg); } /* Handle the fade in /fade out. */ void InfoScreen::preparePaint (int ms) { if (fadeTime) { fadeTime -= ms; if (fadeTime < 0) fadeTime = 0; } cScreen->preparePaint (ms); } void InfoScreen::donePaint () { if (pWindow) { if (fadeTime) damagePaintRegion (); if (!fadeTime && !drawing) { pWindow = NULL; cScreen->preparePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); } } cScreen->donePaint (); } void InfoWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { INFO_SCREEN (screen); if ((!is->pWindow || !is->drawing) && ((window->state () & MAXIMIZE_STATE) != MAXIMIZE_STATE)) { bool showInfo = (((window->sizeHints ().width_inc != 1) && (window->sizeHints ().height_inc != 1)) || is->optionGetAlwaysShow ()); if (showInfo && (mask & CompWindowGrabResizeMask)) { is->pWindow = window; is->drawing = true; is->fadeTime = is->optionGetFadeTime () - is->fadeTime; is->resizeGeometry.x = window->x (); is->resizeGeometry.y = window->y (); is->resizeGeometry.width = window->width (); is->resizeGeometry.height = window->height (); screen->handleEventSetEnabled (is, true); } } window->grabNotify (x, y, state, mask); } void InfoWindow::ungrabNotify () { INFO_SCREEN (screen); if (window == is->pWindow) { is->drawing = false; is->fadeTime = is->optionGetFadeTime () - is->fadeTime; is->cScreen->damageScreen (); screen->handleEventSetEnabled (is, false); window->ungrabNotifySetEnabled (this, false); } window->ungrabNotify (); } /* Draw a texture at x/y on a quad of RESIZE_POPUP_WIDTH / RESIZE_POPUP_HEIGHT with the opacity in InfoScreen. */ void InfoLayer::draw (const GLMatrix &transform, int x, int y) { BOX box; float opacity; INFO_SCREEN (screen); if (!valid) return; for (unsigned int i = 0; i < texture.size (); i++) { GLushort colorData[4]; GLfloat textureData[8]; GLfloat vertexData[12]; GLTexture *tex = texture[i]; GLTexture::Matrix matrix = tex->matrix (); GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); tex->enable (GLTexture::Good); matrix.x0 -= x * matrix.xx; matrix.y0 -= y * matrix.yy; box.x1 = x; box.x2 = x + RESIZE_POPUP_WIDTH; box.y1 = y; box.y2 = y + RESIZE_POPUP_HEIGHT; opacity = (float) is->fadeTime / is->optionGetFadeTime (); if (is->drawing) opacity = 1.0f - opacity; streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = opacity * 65535; colorData[1] = opacity * 65535; colorData[2] = opacity * 65535; colorData[3] = opacity * 65535; textureData[0] = COMP_TEX_COORD_X (matrix, box.x1); textureData[1] = COMP_TEX_COORD_Y (matrix, box.y2); textureData[2] = COMP_TEX_COORD_X (matrix, box.x2); textureData[3] = COMP_TEX_COORD_Y (matrix, box.y2); textureData[4] = COMP_TEX_COORD_X (matrix, box.x1); textureData[5] = COMP_TEX_COORD_Y (matrix, box.y1); textureData[6] = COMP_TEX_COORD_X (matrix, box.x2); textureData[7] = COMP_TEX_COORD_Y (matrix, box.y1); vertexData[0] = box.x1; vertexData[1] = box.y2; vertexData[2] = 0; vertexData[3] = box.x2; vertexData[4] = box.y2; vertexData[5] = 0; vertexData[6] = box.x1; vertexData[7] = box.y1; vertexData[8] = 0; vertexData[9] = box.x2; vertexData[10] = box.y1; vertexData[11] = 0; streamingBuffer->addColors (1, colorData); streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (transform); tex->disable (); } } bool InfoScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if ((drawing || fadeTime) && pWindow) { GLMatrix sTransform = transform; int x = resizeGeometry.x + resizeGeometry.width / 2.0f - RESIZE_POPUP_WIDTH / 2.0f; int y = resizeGeometry.y + resizeGeometry.height / 2.0f - RESIZE_POPUP_HEIGHT / 2.0f; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glEnable (GL_BLEND); #ifndef USE_GLES gScreen->setTexEnvMode (GL_MODULATE); #endif backgroundLayer.draw (sTransform, x, y); textLayer.draw (sTransform, x, y); gScreen->setTexEnvMode (GL_REPLACE); glDisable (GL_BLEND); } return status; } void InfoScreen::handleEvent (XEvent *event) { switch (event->type) { case ClientMessage: if (event->xclient.message_type == resizeInfoAtom) { CompWindow *w; w = screen->findWindow (event->xclient.window); if (w && w == pWindow) { resizeGeometry.x = event->xclient.data.l[0]; resizeGeometry.y = event->xclient.data.l[1]; resizeGeometry.width = event->xclient.data.l[2]; resizeGeometry.height = event->xclient.data.l[3]; textLayer.renderText (); cScreen->preparePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); w->ungrabNotifySetEnabled (InfoWindow::get (w), true); damagePaintRegion (); } } break; default: break; } screen->handleEvent (event); } InfoScreen::InfoScreen (CompScreen *screen) : PluginClassHandler (screen), ResizeinfoOptions (), gScreen (GLScreen::get (screen)), cScreen (CompositeScreen::get (screen)), resizeInfoAtom (XInternAtom (screen->dpy (), "_COMPIZ_RESIZE_NOTIFY", 0)), pWindow (0), drawing (false), fadeTime (0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); memset (&resizeGeometry, 0, sizeof (resizeGeometry)); cScreen->preparePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); screen->handleEventSetEnabled (this, false); backgroundLayer.renderBackground (); optionSetGradient1Notify (backgroundColorChanged); optionSetGradient2Notify (backgroundColorChanged); optionSetGradient3Notify (backgroundColorChanged); optionSetOutlineColorNotify (backgroundColorChanged); } InfoWindow::InfoWindow (CompWindow *window) : PluginClassHandler (window), window (window) { WindowInterface::setHandler (window); window->ungrabNotifySetEnabled (this, false); } bool InfoPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/resizeinfo/src/resizeinfo.h0000644000015301777760000000542512321343002024453 0ustar pbusernogroup00000000000000/** * * Compiz metacity like info during resize * * resizeinfo.c * * Copyright (c) 2007 Robert Carr * * Compiz resize atom usage and general cleanups by * Copyright (c) 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include #include #include #include #include #include #include #include #include "resizeinfo_options.h" extern const unsigned short RESIZE_POPUP_WIDTH; extern const unsigned short RESIZE_POPUP_HEIGHT; extern const double PI; /* Cairo helper class */ class InfoLayer { public: InfoLayer (); ~InfoLayer (); bool valid; Screen *s; XRenderPictFormat *format; Pixmap pixmap; cairo_surface_t *surface; GLTexture::List texture; cairo_t *cr; void draw (const GLMatrix &transform, int x, int y); void renderBackground (); void renderText (); }; class InfoScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public ResizeinfoOptions { public: InfoScreen (CompScreen *); GLScreen *gScreen; CompositeScreen *cScreen; Atom resizeInfoAtom; CompWindow *pWindow; bool drawing; int fadeTime; InfoLayer backgroundLayer; InfoLayer textLayer; XRectangle resizeGeometry; void damagePaintRegion (); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void donePaint (); void handleEvent (XEvent *event); }; class InfoWindow : public PluginClassHandler , public WindowInterface { public: InfoWindow (CompWindow *); CompWindow *window; void grabNotify (int, int, unsigned int, unsigned int); void ungrabNotify (); }; #define INFO_SCREEN(s) \ InfoScreen *is = InfoScreen::get (s); #define INFO_WINDOW(w) \ InfoWindow *iw = InfoWindow::get (w); class InfoPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/vpswitch/0000755000015301777760000000000012321344021021024 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/vpswitch/CMakeLists.txt0000644000015301777760000000012112321343002023554 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (vpswitch) compiz-0.9.11+14.04.20140409/plugins/vpswitch/src/0000755000015301777760000000000012321344021021613 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/vpswitch/src/vpswitch.cpp0000644000015301777760000002041612321343002024167 0ustar pbusernogroup00000000000000/* * Compiz vpswitch plugin * * vpswitch.cpp * * Copyright (c) 2007 Dennis Kasprzyk * * Go-to-numbered-viewport functionality by * * Copyright (c) 2007 Robert Carr * (c) 2007 Danny Baumann * * Go-to-specific-viewport functionality by * * Copyright (c) 2007 Michael Vogt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "vpswitch.h" COMPIZ_PLUGIN_20090315 (vpswitch, VPSwitchPluginVTable); bool VPSwitchScreen::initPluginAction (CompAction *action, CompAction::State state, CompOption::Vector &options) { GET_DATA; CompPlugin *plugin = CompPlugin::find (optionGetInitPlugin ().c_str ()); bool rv = false; if (!plugin) return false; foreach (CompOption &opt, plugin->vTable->getOptions ()) { if (opt.type () == CompOption::TypeAction || opt.type () == CompOption::TypeKey || opt.type () == CompOption::TypeButton || opt.type () == CompOption::TypeEdge || opt.type () == CompOption::TypeBell) if (opt.name () == optionGetInitAction () && opt.value ().action ().initiate ()) { rv = opt.value ().action ().initiate () (action, state, options); break; } } if (rv) action->setState(action->state () | CompAction::StateTermButton); return rv; } bool VPSwitchScreen::termPluginAction (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompPlugin *plugin = CompPlugin::find (optionGetInitPlugin ().c_str ()); bool rv = false; if (!plugin) return false; foreach (CompOption &opt, plugin->vTable->getOptions ()) { if (opt.type () == CompOption::TypeAction || opt.type () == CompOption::TypeKey || opt.type () == CompOption::TypeButton || opt.type () == CompOption::TypeEdge || opt.type () == CompOption::TypeBell) if (opt.name () == optionGetInitAction () && opt.value ().action ().terminate ()) { rv = opt.value ().action ().terminate () (action, state, options); break; } } return rv; } void VPSwitchScreen::gotovp (int x, int y) { XEvent xev; xev.xclient.type = ClientMessage; xev.xclient.display = screen->dpy (); xev.xclient.format = 32; xev.xclient.message_type = Atoms::desktopViewport; xev.xclient.window = screen->root (); xev.xclient.data.l[0] = x * screen->width (); xev.xclient.data.l[1] = y * screen->height (); xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent (screen->dpy (), screen->root (), false, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } /* desktop mouse button initiated actions */ bool VPSwitchScreen::next (CompAction *action, CompAction::State state, CompOption::Vector &options) { int targetX, targetY; CompPoint vp (screen->vp ()); CompSize vpsize (screen->vpSize ()); GET_DATA; targetX = vp.x () + 1; targetY = vp.y (); if (targetX >= vpsize.width ()) { targetX = 0; targetY++; } if (targetY >= vpsize.height ()) targetY = 0; gotovp (targetX, targetY); return true; } bool VPSwitchScreen::prev (CompAction *action, CompAction::State state, CompOption::Vector &options) { int targetX, targetY; CompPoint vp (screen->vp ()); CompSize vpsize (screen->vpSize ()); GET_DATA; targetX = vp.x () - 1; targetY = vp.y (); if (targetX < 0) { targetX = vpsize.width () - 1; targetY--; } if (targetY < 0) targetY = vpsize.height () - 1; gotovp (targetX, targetY); return true; } bool VPSwitchScreen::movevp (CompAction *action, CompAction::State state, CompOption::Vector &options, unsigned int dx, unsigned int dy) { CompPoint vp (screen->vp ()); CompSize vpsize (screen->vpSize ()); GET_DATA; /* Check bounds */ if (vp.x () + dx > (unsigned int) vpsize.width ()) return false; if (vp.y () + dy > (unsigned int) vpsize.height ()) return false; gotovp (vp.x () + dx, vp.y () + dy); return true; } /* Handle viewport number switch key events */ void VPSwitchScreen::handleEvent (XEvent *event) { switch (event->type) { case KeyPress: KeySym pressedKeySym; unsigned int mods; int i, row; if (!numberedActive) break; pressedKeySym = XLookupKeysym (&event->xkey, 0); mods = modHandler->keycodeToModifiers (event->xkey.keycode); if (mods & CompNumLockMask) row = 1; /* use first row of lookup table */ else row = 2; for (i = 0; i < 10; i++) { /* first try to handle normal number keys */ if (numberKeySyms[0][i] == pressedKeySym) { destination *= 10; destination += i; break; } else { if (numberKeySyms[row][i] == pressedKeySym) { destination *= 10; destination += i; break; } } } } screen->handleEvent (event); } bool VPSwitchScreen::initiateNumbered (CompAction *action, CompAction::State state, CompOption::Vector &options) { numberedActive = true; if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); return true; } bool VPSwitchScreen::terminateNumbered (CompAction *action, CompAction::State state, CompOption::Vector &options) { int nx, ny; CompSize vpsize (screen->vpSize ()); if (!numberedActive) return false; numberedActive = false; if (destination < 1 || destination > (int) (vpsize.width () * vpsize.height ())) return false; nx = (destination - 1 ) % vpsize.width (); ny = (destination - 1 ) / vpsize.width (); gotovp (nx, ny); return true; } /* switch-to-specific viewport stuff */ bool VPSwitchScreen::switchto (CompAction *action, CompAction::State state, CompOption::Vector &options, int num) { destination = num; numberedActive = true; return terminateNumbered (action, state, options); } VPSwitchScreen::VPSwitchScreen (CompScreen *screen): PluginClassHandler (screen), destination (0), numberedActive (false) { ScreenInterface::setHandler (screen); #define directionBind(name, dx, dy) \ optionSet##name##ButtonInitiate (boost::bind (&VPSwitchScreen::movevp, \ this, _1, _2, _3, dx, dy)) directionBind (Left, -1, 0); directionBind (Right, 1, 0); directionBind (Up, 0, -1); directionBind (Down, 0, 1); #undef directionBind #define numberedBind(num) \ optionSetSwitchTo##num##KeyInitiate (boost::bind (&VPSwitchScreen::switchto, \ this, _1, _2, _3, num)) /* Note: get actions in multi-lists, this is ugly */ numberedBind (1); numberedBind (2); numberedBind (3); numberedBind (4); numberedBind (5); numberedBind (6); numberedBind (7); numberedBind (8); numberedBind (9); numberedBind (10); #undef numberedBind optionSetBeginKeyInitiate (boost::bind(&VPSwitchScreen::initiateNumbered, this, _1, _2, _3)); optionSetBeginKeyTerminate (boost::bind (&VPSwitchScreen::terminateNumbered, this, _1, _2, _3)); optionSetNextButtonInitiate (boost::bind (&VPSwitchScreen::next, this, _1, _2, _3)); optionSetPrevButtonInitiate (boost::bind (&VPSwitchScreen::prev, this, _1, _2, _3)); optionSetInitiateButtonInitiate (boost::bind (&VPSwitchScreen::initPluginAction, this, _1, _2, _3)); optionSetInitiateButtonTerminate (boost::bind (&VPSwitchScreen::termPluginAction, this, _1, _2, _3)); } bool VPSwitchPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/vpswitch/src/vpswitch.h0000644000015301777760000000671612321343002023643 0ustar pbusernogroup00000000000000/* * Compiz vpswitch plugin * * vpswitch.cpp * * Copyright (c) 2007 Dennis Kasprzyk * * Go-to-numbered-viewport functionality by * * Copyright (c) 2007 Robert Carr * (c) 2007 Danny Baumann * * Go-to-specific-viewport functionality by * * Copyright (c) 2007 Michael Vogt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include "vpswitch_options.h" /* Helper macro to obtain necesary action data */ /* ??? xid = screen->grabWindow () else xid = screen->below () */ #define GET_DATA \ CompWindow *w;\ Window xid; \ if (screen->otherGrabExist ("rotate", "wall", "plane", 0)) \ return false; \ xid = CompOption::getIntOptionNamed (options, "window"); \ w = screen->findWindow (xid); \ if ((!w || (w->type () & CompWindowTypeDesktopMask) == 0) && \ xid != screen->root ()) \ return false; /* number-to-keysym mapping */ static const KeySym numberKeySyms[3][10] = { /* number key row */ { XK_0, XK_1, XK_2, XK_3, XK_4, XK_5, XK_6, XK_7, XK_8, XK_9 }, /* number keypad with activated NumLock */ { XK_KP_0, XK_KP_1, XK_KP_2, XK_KP_3, XK_KP_4, XK_KP_5, XK_KP_6, XK_KP_7, XK_KP_8, XK_KP_9 }, /* number keypad without NumLock */ { XK_KP_Insert, XK_KP_End, XK_KP_Down, XK_KP_Next, XK_KP_Left, XK_KP_Begin, XK_KP_Right, XK_KP_Home, XK_KP_Up, XK_KP_Prior } }; class VPSwitchScreen : public PluginClassHandler , public VpswitchOptions, public ScreenInterface { public: VPSwitchScreen (CompScreen *); int destination; bool numberedActive; /* Wrappable functions */ void handleEvent (XEvent *); /* Actions */ bool movevp (CompAction *action, CompAction::State state, CompOption::Vector &options, unsigned int dx, unsigned int dy); bool switchto (CompAction *action, CompAction::State state, CompOption::Vector &options, int num); bool initiateNumbered (CompAction *action, CompAction::State state, CompOption::Vector &options); bool terminateNumbered (CompAction *action, CompAction::State state, CompOption::Vector &options); bool prev (CompAction *action, CompAction::State state, CompOption::Vector &options); bool next (CompAction *action, CompAction::State state, CompOption::Vector &options); bool initPluginAction (CompAction *action, CompAction::State state, CompOption::Vector &options); bool termPluginAction (CompAction *action, CompAction::State state, CompOption::Vector &options); /* General Functions */ void gotovp (int x, int y); }; #define VPSWITCH_SCREEN(s) \ VPSwitchScreen *vs = VPSwitchScreen::get (s); class VPSwitchPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/vpswitch/vpswitch.xml.in0000644000015301777760000001001612321343002024016 0ustar pbusernogroup00000000000000 <_short>Viewport Switcher <_long>Initiate viewport changes through several events Desktop composite decor opengl <_short>Number-Based Viewport Switching <_short>Go to specific viewport <_short>Desktop-based Viewport Switching compiz-0.9.11+14.04.20140409/plugins/animation/0000755000015301777760000000000012321344021021134 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/animation/compiz-animation.pc.in0000644000015301777760000000041512321343002025341 0ustar pbusernogroup00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-animation Description: Animation plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite compiz-opengl Libs: -L${libdir} -lanimation Cflags: @COMPIZ_CFLAGS@ compiz-0.9.11+14.04.20140409/plugins/animation/animation.xml.in0000644000015301777760000006305112321343002024245 0ustar pbusernogroup00000000000000 <_short>Animations <_long>Use various animations as window effects windowanimations Effects opengl regex decor composite opengl regex fade <_short>Open Animation <_short>Animation Selection <_short>Random Effects <_short>Close Animation <_short>Animation Selection <_short>Random Effects <_short>Minimize Animation <_short>Animation Selection <_short>Random Effects <_short>Unminimize Animation <_short>Animation Selection <_short>Random Effects <_short>Shade Animation <_short>Animation Selection <_short>Random Effects <_short>Focus Animation <_short>Animation Selection <_short>Effect Settings <_short>Curved Fold <_short>Dodge <_short>Dream <_short>Glide 1 <_short>Glide 2 <_short>Horizontal Folds <_short>Magic Lamp <_short>Magic Lamp Wavy <_short>Roll Up <_short>Sidekick <_short>Wave <_short>Zoom open_effects close_effects minimize_effects unminimize_effects shade_effects animation:None <_name>None animation:Random <_name>Random open_effects open_random_effects close_effects close_random_effects minimize_effects minimize_random_effects unminimize_effects unminimize_random_effects shade_effects shade_random_effects animation:Curved Fold <_name>Curved Fold animation:Horizontal Folds <_name>Horizontal Folds shade_effects shade_random_effects animation:Roll Up <_name>Roll Up open_effects open_random_effects close_effects close_random_effects minimize_effects minimize_random_effects unminimize_effects unminimize_random_effects animation:Dream <_name>Dream animation:Fade <_name>Fade animation:Glide 1 <_name>Glide 1 animation:Glide 2 <_name>Glide 2 animation:Magic Lamp <_name>Magic Lamp animation:Magic Lamp Wavy <_name>Magic Lamp Wavy animation:Sidekick <_name>Sidekick animation:Zoom <_name>Zoom open_effects open_random_effects close_effects close_random_effects animation:Wave <_name>Wave focus_effects animation:None <_name>None animation:Dodge <_name>Dodge animation:Focus Fade <_name>Fade animation:Wave <_name>Wave compiz-0.9.11+14.04.20140409/plugins/animation/CMakeLists.txt0000644000015301777760000000015612321343002023674 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (animation PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/animation/src/0000755000015301777760000000000012321344021021723 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/animation/src/extensionplugin.cpp0000644000015301777760000005533112321343002025667 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * extensionplugin.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" ExtensionPluginAnimation::ExtensionPluginAnimation (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex) : ExtensionPluginInfo (name, nEffects, effects, effectOptions, firstEffectOptionIndex), mAWinWasRestackedJustNow (false), mRestackAnimCount (0) { } ExtensionPluginAnimation::~ExtensionPluginAnimation () { } void ExtensionPluginAnimation::postPreparePaintGeneral () { if (mAWinWasRestackedJustNow) mAWinWasRestackedJustNow = false; } void ExtensionPluginAnimation::cleanUpParentChildChainItem (AnimWindow *aw) { PersistentDataMap::iterator itData = aw->persistentData.find ("restack"); if (itData != aw->persistentData.end ()) // if found { RestackPersistentData *restackData = static_cast (itData->second); if (restackData->mWinThisIsPaintedBefore && !restackData->mWinThisIsPaintedBefore->destroyed ()) { RestackPersistentData *dataOther = static_cast (AnimWindow::get (restackData->mWinThisIsPaintedBefore)-> persistentData["restack"]); if (dataOther) dataOther->mWinToBePaintedBeforeThis = 0; } restackData->mWinThisIsPaintedBefore = 0; restackData->mMoreToBePaintedPrev = 0; restackData->mMoreToBePaintedNext = 0; } itData = aw->persistentData.find ("dodge"); if (itData != aw->persistentData.end ()) // if found { DodgePersistentData *dodgeData = static_cast (itData->second); dodgeData->isDodgeSubject = false; dodgeData->skipPostPrepareScreen = false; } } bool ExtensionPluginAnimation::paintShouldSkipWindow (CompWindow *w) { AnimWindow *aw = AnimWindow::get (w); PersistentDataMap::iterator itData = aw->persistentData.find ("restack"); if (itData != aw->persistentData.end ()) // if found { RestackPersistentData *data = static_cast (itData->second); // Increment (glPaint) visit count ++data->mVisitCount; // If the window is (to be) painted somewhere other than in its // original stacking order, we don't need to paint it now. if (aw->curAnimation ()->info ()->isRestackAnim && dynamic_cast (aw->curAnimation ())->paintedElsewhere ()) return true; } return false; } /// Returns whether this window is relevant for fade focus. bool ExtensionPluginAnimation::relevantForRestackAnim (CompWindow *w) { unsigned int wmType = w->wmType (); if (!((wmType & // these two are to be used as "host" windows // to host the painting of windows being focused // at a stacking order lower than them (CompWindowTypeDockMask | CompWindowTypeSplashMask)) || wmType == CompWindowTypeNormalMask || wmType == CompWindowTypeDialogMask || wmType == CompWindowTypeUtilMask || wmType == CompWindowTypeUnknownMask)) { return false; } return !w->destroyed (); } void ExtensionPluginAnimation::prePreparePaintGeneral () { if (!mAWinWasRestackedJustNow) return; bool focusAnimInitiated = false; AnimScreen *as = AnimScreen::get (::screen); // Go in reverse order so that restack chains are handled properly for (CompWindowVector::reverse_iterator rit = mLastClientList.rbegin (); rit != mLastClientList.rend (); ++rit) { CompWindow *w = (*rit); AnimWindow *aw = AnimWindow::get (w); RestackPersistentData *data = static_cast (aw->persistentData["restack"]); if (!data) continue; RestackInfo *restackInfo = data->restackInfo (); if (!restackInfo) continue; data->mIsSecondary = false; if (as->otherPluginsActive () || // Don't initiate focus anim for current dodgers aw->curAnimation () || // Don't initiate focus anim for windows being passed thru data->mWinPassingThrough || // Don't animate with stale restack info !restackInfoStillGood (restackInfo)) { data->resetRestackInfo (true); continue; } // Find the first window at a higher stacking order than w CompWindow *nw; for (nw = w->next; nw; nw = nw->next) if (relevantForRestackAnim (nw)) break; // If w is being lowered, there has to be a window // at a higher stacking position than w (like a panel) // which this w's copy can be painted before. // Otherwise the animation will only show w fading in // rather than 2 copies of it cross-fading. if (!restackInfo->raised && !nw) { // Free unnecessary restackInfo data->resetRestackInfo (true); continue; } // Check if above window is focus-fading/dodging too. // (like a dialog of an app. window) // If so, focus-fade/dodge this together with the one above // (link to it) if (nw) { RestackPersistentData *dataNext = static_cast (AnimWindow::get (nw)->persistentData["restack"]); if (dataNext && dataNext->restackInfo () && wontCreateCircularChain (w, nw)) { // Link the two dataNext->mMoreToBePaintedPrev = w; data->mMoreToBePaintedNext = nw; // so far, bottommost on chain data->mMoreToBePaintedPrev = 0; } } else { // Reset chain connections as this is not (yet) on a chain data->mMoreToBePaintedNext = 0; data->mMoreToBePaintedPrev = 0; } } // Now initiate focus animations (after the restack chains are formed // right above) for (CompWindowVector::reverse_iterator rit = mLastClientList.rbegin (); rit != mLastClientList.rend (); ++rit) { CompWindow *w = (*rit); AnimWindow *aw = AnimWindow::get (w); RestackPersistentData *data = static_cast (aw->persistentData["restack"]); if (!data) continue; RestackInfo *restackInfo = data->restackInfo (); if (restackInfo) { if (as->initiateFocusAnim (aw)) focusAnimInitiated = true; else data->resetRestackInfo (true); } } if (!focusAnimInitiated) resetStackingInfo (); if (!focusAnimInitiated || as->otherPluginsActive () || !as->isAnimEffectPossible (AnimEffectDodge)) // Only dodge stuff below return; // Calculate dodge amounts foreach (CompWindow *w, mLastClientList) { AnimWindow *aw = AnimWindow::get (w); Animation *curAnim = aw->curAnimation (); if (!curAnim || curAnim->info () != AnimEffectDodge) continue; // Only process subjects with a dodge chain DodgePersistentData *dodgeData = static_cast (aw->persistentData["dodge"]); if (!dodgeData || !dodgeData->dodgeChainStart || !dodgeData->isDodgeSubject) continue; dynamic_cast (curAnim)->calculateDodgeAmounts (); } // TODO consider removing this loop and skipPostPrepareScreen for (CompWindowVector::reverse_iterator rit = mLastClientList.rbegin (); rit != mLastClientList.rend (); ++rit) { CompWindow *w = (*rit); AnimWindow *aw = AnimWindow::get (w); PersistentDataMap::iterator itData = aw->persistentData.find ("dodge"); if (itData == aw->persistentData.end ()) // if not found continue; DodgePersistentData *data = static_cast (itData->second); if (!data->isDodgeSubject) continue; bool dodgersAreOnlySubjects = true; CompWindow *dw; DodgePersistentData *dataDodger; for (dw = data->dodgeChainStart; dw; dw = dataDodger->dodgeChainNext) { dataDodger = static_cast (AnimWindow::get (dw)->persistentData["dodge"]); if (!dataDodger) break; if (!dataDodger->isDodgeSubject) dodgersAreOnlySubjects = false; } if (dodgersAreOnlySubjects) data->skipPostPrepareScreen = true; } } void ExtensionPluginAnimation::handleRestackNotify (AnimWindow *aw) { const CompWindowVector &clients = ::screen->clientList (); // Only handle restack notifies when the window is (or was) on the client // list (i.e. not for menus, combos, etc.). if (find (clients.begin (), clients.end (), aw->mWindow) == clients.end () && find (mLastClientList.begin (), mLastClientList.end (), aw->mWindow) == mLastClientList.end ()) return; bool winOpenedClosed = false; unsigned int n = clients.size (); if (n != mLastClientList.size ()) winOpenedClosed = true; // if restacking occurred and not window open/close if (!winOpenedClosed) { RestackPersistentData *data = static_cast (aw->persistentData["restack"]); data->mConfigureNotified = true; // Find which window is restacked // e.g. here 8507730 was raised: // 54526074 8507730 48234499 14680072 6291497 // 54526074 48234499 14680072 8507730 6291497 // compare first changed win. of row 1 with last // changed win. of row 2, and vica versa // the matching one is the restacked one CompWindow *wRestacked = 0; CompWindow *wStart = 0; CompWindow *wEnd = 0; CompWindow *wOldAbove = 0; CompWindow *wChangeStart = 0; CompWindow *wChangeEnd = 0; bool raised = false; int changeStart = -1; int changeEnd = -1; for (unsigned int i = 0; i < n; ++i) { CompWindow *wi = clients[i]; // skip if minimized (prevents flashing problem) if (!wi || wi->destroyed ()) continue; // TODO find another filter criteria for Group plugin // because some apps like gedit sets its open dialog // to skip taskbar too, which shouldn't be ignored here. /* // skip if (tabbed and) hidden by Group plugin // unless it's a dock/panel if (!(wi->wmType () & CompWindowTypeDockMask) && (wi->state () & (CompWindowStateSkipPagerMask | CompWindowStateSkipTaskbarMask))) continue; */ if (wi != mLastClientList[i]) { if (changeStart < 0) { changeStart = (int)i; wChangeStart = wi; // make use of already found w } else { changeEnd = (int)i; wChangeEnd = wi; } } else if (changeStart >= 0) // found some change earlier break; } // if restacking occurred if (changeStart >= 0 && changeEnd >= 0) { // if we have only 2 windows changed, // choose the one clicked on bool preferRaised = false; bool onlyTwo = false; if (wChangeEnd && clients[(unsigned)changeEnd] == mLastClientList[(unsigned)changeStart] && clients[(unsigned)changeStart] == mLastClientList[(unsigned)changeEnd]) { // Check if the window coming on top was // mConfigureNotified (clicked on) RestackPersistentData *data = static_cast (AnimWindow::get (wChangeEnd)-> persistentData["restack"]); if (data->mConfigureNotified) preferRaised = true; onlyTwo = true; } // Clear all mConfigureNotified's foreach (CompWindow *w2, CompositeScreen::get (::screen)->getWindowPaintList ()) { RestackPersistentData *data = static_cast (AnimWindow::get (w2)->persistentData["restack"]); data->mConfigureNotified = false; } if (preferRaised || (!onlyTwo && clients[(unsigned)changeEnd] == mLastClientList[(unsigned)changeStart])) { // raised raised = true; wRestacked = wChangeEnd; wStart = wChangeStart; wEnd = wRestacked; wOldAbove = wStart; } else if ((unsigned int)changeEnd < n - 1 && clients[(unsigned)changeStart] == mLastClientList[(unsigned)changeEnd]) // lowered // We don't animate lowering if there is no // window above this window, since this window needs // to be drawn on such a "host" in animPaintWindow // (at least for now). { wRestacked = wChangeStart; wStart = wRestacked; wEnd = wChangeEnd; wOldAbove = mLastClientList[(unsigned)(changeEnd + 1)]; } for (; wOldAbove; wOldAbove = wOldAbove->next) if (!wOldAbove->destroyed ()) break; } if (wRestacked && wStart && wEnd && wOldAbove) { AnimWindow *awRestacked = AnimWindow::get (wRestacked); RestackPersistentData *data = static_cast (awRestacked->persistentData["restack"]); { data->setRestackInfo (wRestacked, wStart, wEnd, wOldAbove, raised); mAWinWasRestackedJustNow = true; } } } updateLastClientList (); } void ExtensionPluginAnimation::updateLastClientList () { mLastClientList = ::screen->clientList (); } /// Returns true if linking wCur to wNext would not result /// in a circular chain being formed. bool ExtensionPluginAnimation::wontCreateCircularChain (CompWindow *wCur, CompWindow *wNext) { RestackPersistentData *dataNext = 0; while (wNext) { if (wNext == wCur) // would form circular chain return false; dataNext = static_cast (AnimWindow::get (wNext)->persistentData["restack"]); if (!dataNext) return false; wNext = dataNext->mMoreToBePaintedNext; } return true; } void ExtensionPluginAnimation::postUpdateEventEffects (AnimEvent e, bool forRandom) { AnimScreen *as = AnimScreen::get (::screen); // If a restacking anim. is (now) possible if (e == AnimEventFocus) { if (as->isRestackAnimPossible ()) { // Update the stored window list so that we have an up-to-date list, // since that list wasn't updated while a restacking animation // was not possible. updateLastClientList (); foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ()) { AnimWindow *aw = AnimWindow::get (w); // Allocate persistent restack data if it doesn't already exist if (aw->persistentData.find ("restack") != aw->persistentData.end ()) continue; aw->persistentData["restack"] = new RestackPersistentData (); } } if (as->isAnimEffectPossible (AnimEffectDodge)) { foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ()) { AnimWindow *aw = AnimWindow::get (w); // Allocate persistent dodge data if it doesn't already exist if (aw->persistentData.find ("dodge") != aw->persistentData.end ()) continue; aw->persistentData["dodge"] = new DodgePersistentData (); } } } } void ExtensionPluginAnimation::initPersistentData (AnimWindow *aw) { AnimScreen *as = AnimScreen::get (::screen); // TODO: Optimize (via caching isRestackAnimPossible, isAnimEffectPossible) // Only allocate restack data when restack animation is possible if (as->isRestackAnimPossible () && // doesn't exist yet aw->persistentData.find ("restack") == aw->persistentData.end ()) aw->persistentData["restack"] = new RestackPersistentData (); if (as->isAnimEffectPossible (AnimEffectDodge) && // doesn't exist yet aw->persistentData.find ("dodge") == aw->persistentData.end ()) aw->persistentData["dodge"] = new DodgePersistentData (); if (aw->persistentData.find ("multi") == aw->persistentData.end ()) aw->persistentData["multi"] = new MultiPersistentData (); } void ExtensionPluginAnimation::destroyPersistentData (AnimWindow *aw) { aw->deletePersistentData ("restack"); aw->deletePersistentData ("dodge"); } void ExtensionPluginAnimation::incrementCurRestackAnimCount () { ++mRestackAnimCount; // Enable custom paint list when there is now a restack anim happening if (mRestackAnimCount == 1) AnimScreen::get (::screen)->enableCustomPaintList (true); } void ExtensionPluginAnimation::decrementCurRestackAnimCount () { --mRestackAnimCount; // Disable custom paint list when there is no more a restack anim happening if (mRestackAnimCount == 0) AnimScreen::get (::screen)->enableCustomPaintList (false); } bool ExtensionPluginAnimation::restackInfoStillGood (RestackInfo *restackInfo) { bool wStartGood = false; bool wEndGood = false; bool wOldAboveGood = false; bool wRestackedGood = false; foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ()) { AnimWindow *aw = AnimWindow::get (w); if (aw->mWindow->destroyed ()) continue; if (restackInfo->wStart == w) wStartGood = true; if (restackInfo->wEnd == w) wEndGood = true; if (restackInfo->wRestacked == w) wRestackedGood = true; if (restackInfo->wOldAbove == w) wOldAboveGood = true; } return (wStartGood && wEndGood && wOldAboveGood && wRestackedGood); } /// Resets stacking related info. void ExtensionPluginAnimation::resetStackingInfo () { foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ()) { AnimWindow *aw = AnimWindow::get (w); PersistentDataMap::iterator itData = aw->persistentData.find ("restack"); if (itData != aw->persistentData.end ()) // if found { RestackPersistentData *data = static_cast (itData->second); data->mConfigureNotified = false; if (data->restackInfo ()) data->resetRestackInfo (); } } } void ExtensionPluginAnimation::postStartupCountdown () { updateLastClientList (); } void ExtensionPluginAnimation::preInitiateOpenAnim (AnimWindow *aw) { // Only do when the window is on the client list // (i.e. not for menus, combos, etc.). if (find (::screen->clientList ().begin (), ::screen->clientList ().end (), aw->mWindow) != ::screen->clientList ().end ()) { resetStackingInfo (); updateLastClientList (); } } void ExtensionPluginAnimation::preInitiateCloseAnim (AnimWindow *aw) { preInitiateOpenAnim (aw); } void ExtensionPluginAnimation::preInitiateMinimizeAnim (AnimWindow *aw) { preInitiateOpenAnim (aw); } void ExtensionPluginAnimation::preInitiateUnminimizeAnim (AnimWindow *aw) { preInitiateOpenAnim (aw); } void ExtensionPluginAnimation::cleanUpAnimation (bool closing, bool destructing) { if (closing || destructing) updateLastClientList (); } /// Go to the bottommost window in this "focus chain" /// This chain is used to handle some cases: e.g when Find dialog /// of an app is open, both windows should be faded when the Find /// dialog is raised. CompWindow * ExtensionPluginAnimation::getBottommostInExtendedFocusChain (CompWindow *wStartPoint) { if (!wStartPoint) return 0; RestackPersistentData *data = static_cast (AnimWindow::get (wStartPoint)->persistentData["restack"]); CompWindow *wBottommost = data->mWinToBePaintedBeforeThis; if (!wBottommost || wBottommost->destroyed ()) return wStartPoint; RestackPersistentData *dataBottommost = static_cast (AnimWindow::get (wBottommost)->persistentData["restack"]); CompWindow *wPrev = dataBottommost->mMoreToBePaintedPrev; while (wPrev) { wBottommost = wPrev; RestackPersistentData *dataPrev = static_cast (AnimWindow::get (wPrev)->persistentData["restack"]); wPrev = dataPrev->mMoreToBePaintedPrev; } return wBottommost; } /// Finds the bottommost subject in restack chain, /// simpler version of getBottommostInExtendedFocusChain. CompWindow * ExtensionPluginAnimation::getBottommostInRestackChain (CompWindow *wStartPoint) { CompWindow *wBottommost = wStartPoint; RestackPersistentData *dataCur; for (CompWindow *wCur = wStartPoint; wCur; wCur = dataCur->mMoreToBePaintedPrev) { wBottommost = wCur; dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; } return wBottommost; } void ExtensionPluginAnimation::resetMarks () { foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ()) { RestackPersistentData *data = static_cast (AnimWindow::get (w)->persistentData["restack"]); data->mWalkerOverNewCopy = false; data->mVisitCount = 0; } } void ExtensionPluginAnimation::prePaintWindowsBackToFront () { resetMarks (); } CompWindow * ExtensionPluginAnimation::walkFirst () { resetMarks (); CompWindow *w = getBottommostInExtendedFocusChain (*CompositeScreen::get (::screen)->getWindowPaintList ().begin ()); if (w) { RestackPersistentData *data = static_cast (AnimWindow::get (w)->persistentData["restack"]); ++data->mVisitCount; } return w; } bool ExtensionPluginAnimation::markNewCopy (CompWindow *w) { RestackPersistentData *data = static_cast (AnimWindow::get (w)->persistentData["restack"]); // if window is in a focus chain if (data->mWinThisIsPaintedBefore || data->mMoreToBePaintedPrev) { data->mWalkerOverNewCopy = true; return true; } return false; } CompWindow * ExtensionPluginAnimation::walkNext (CompWindow *w) { RestackPersistentData *data = static_cast (AnimWindow::get (w)->persistentData["restack"]); CompWindow *wRet = 0; if (!data->mWalkerOverNewCopy) { // Within a chain? (not the 1st or 2nd window) if (data->mMoreToBePaintedNext) wRet = data->mMoreToBePaintedNext; else if (data->mWinThisIsPaintedBefore) // 2nd one in chain? wRet = data->mWinThisIsPaintedBefore; } else data->mWalkerOverNewCopy = false; if (!wRet && w->next && markNewCopy (w->next)) wRet = w->next; else if (!wRet) wRet = getBottommostInExtendedFocusChain (w->next); if (wRet) { RestackPersistentData *dataRet = static_cast (AnimWindow::get (wRet)->persistentData["restack"]); // Prevent cycles, which cause freezes if (dataRet->mVisitCount > 1) // each window is visited at most twice return 0; ++dataRet->mVisitCount; } return wRet; } const CompWindowList & ExtensionPluginAnimation::getWindowPaintList () { mWindowList.clear (); for (CompWindow *w = walkFirst (); w; w = walkNext (w)) mWindowList.push_back (w); return mWindowList; } compiz-0.9.11+14.04.20140409/plugins/animation/src/dream.cpp0000644000015301777760000001017412321343002023520 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * dream.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" const float DreamAnim::kDurationFactor = 1.67; // ===================== Effect: Dream ========================= DreamAnim::DreamAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridZoomAnim::GridZoomAnim (w, curWindowEvent, duration, info, icon) { } void DreamAnim::init () { GridZoomAnim::init (); if (!zoomToIcon ()) mUsingTransform = false; } void DreamAnim::adjustDuration () { if (zoomToIcon ()) mTotalTime *= ZoomAnim::kDurationFactor; else mTotalTime *= kDurationFactor; mRemainingTime = mTotalTime; } void DreamAnim::initGrid () { mGridWidth = 2; mGridHeight = optValI (AnimationOptions::MagicLampWavyGridRes); // TODO new option } void DreamAnim::step () { GridZoomAnim::step (); float forwardProgress = getActualProgress (); CompRect winRect (mAWindow->savedRectsValid () ? mAWindow->saveWinRect () : mWindow->geometry ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); int wx = winRect.x (); int wy = winRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); float waveAmpMax = MIN (oheight, owidth) * 0.125f; float waveWidth = 10.0f; float waveSpeed = 7.0f; GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i, ++object) { Point3d &objPos = object->position (); Point &objGridPos = object->gridPosition (); if (i % 2 == 0) // object is at the left side { float origy = (wy + (oheight * objGridPos.y () - outExtents.top) * mModel->scale ().y ()); objPos.setY (origy); } else // object is at the right side { // Set y position to the y position of the object at the left // on the same row (previous object) objPos.setY ((object - 1)->position ().y ()); } float origx = (wx + (owidth * objGridPos.x () - outExtents.left) * mModel->scale ().x ()); objPos.setX ( origx + forwardProgress * waveAmpMax * mModel->scale ().x () * sin (objGridPos.y () * M_PI * waveWidth + waveSpeed * forwardProgress)); } } float DreamAnim::getFadeProgress () { if (zoomToIcon ()) return ZoomAnim::getFadeProgress (); return progressLinear (); } bool DreamAnim::zoomToIcon () { return ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValB (AnimationOptions::DreamZoomToTaskbar)); } compiz-0.9.11+14.04.20140409/plugins/animation/src/options.cpp0000644000015301777760000002201212321343002024115 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * options.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ================= Option Related Functions ================= AnimEvent win2AnimEventMap[WindowEventNum] = { AnimEventOpen, AnimEventClose, AnimEventMinimize, AnimEventUnminimize, AnimEventShade, AnimEventShade, AnimEventFocus }; AnimEvent PrivateAnimScreen::getCorrespondingAnimEvent (AnimationOptions::Options optionId) { switch (optionId) { case AnimationOptions::OpenOptions: case AnimationOptions::OpenEffects: case AnimationOptions::OpenRandomEffects: return AnimEventOpen; case AnimationOptions::CloseEffects: case AnimationOptions::CloseRandomEffects: case AnimationOptions::CloseOptions: return AnimEventClose; case AnimationOptions::MinimizeOptions: case AnimationOptions::MinimizeEffects: case AnimationOptions::MinimizeRandomEffects: return AnimEventMinimize; case AnimationOptions::UnminimizeOptions: case AnimationOptions::UnminimizeEffects: case AnimationOptions::UnminimizeRandomEffects: return AnimEventUnminimize; case AnimationOptions::FocusOptions: case AnimationOptions::FocusEffects: return AnimEventFocus; case AnimationOptions::ShadeOptions: case AnimationOptions::ShadeEffects: case AnimationOptions::ShadeRandomEffects: return AnimEventShade; default: return AnimEventNum; } } bool IdValuePair::matchesPluginOption (ExtensionPluginInfo *testPluginInfo, int testOptionId) const { return (pluginInfo == testPluginInfo && optionId == testOptionId); } CompOption::Value & AnimWindow::pluginOptVal (ExtensionPluginInfo *pluginInfo, unsigned int optionId, Animation *anim) { PrivateAnimWindow *aw = priv; PrivateAnimScreen *as = aw->paScreen (); // Handle -1 case, used in Dodge for non-matching (stable) dodgers if (aw->curAnimSelectionRow () < 0) return (*pluginInfo->effectOptions)[optionId].value (); OptionSet *os = as->getOptionSetForSelectedRow (aw, anim); IdValuePairVector::iterator it = find_if (os->pairs.begin (), os->pairs.end (), boost::bind (&IdValuePair::matchesPluginOption, _1, pluginInfo, optionId)); return (it == os->pairs.end () ? (*pluginInfo->effectOptions)[optionId].value () : (*it).value); } OptionSet * PrivateAnimScreen::getOptionSetForSelectedRow (PrivateAnimWindow *aw, Animation *anim) { const AnimEvent event = win2AnimEventMap[anim->curWindowEvent ()]; OptionSets &eventOptionSets = mEventOptionSets[event]; OptionSet *setSelectedForRow = &eventOptionSets.sets[(unsigned int) aw->curAnimSelectionRow ()]; return setSelectedForRow; } void PrivateAnimScreen::updateOptionSet (OptionSet *os, const char *optNamesValuesOrig) { unsigned int len = strlen (optNamesValuesOrig); char *optNamesValues = (char *)calloc (len + 1, 1); // Find the first substring with no spaces in it sscanf (optNamesValuesOrig, " %s ", optNamesValues); if (!strlen (optNamesValues)) { free (optNamesValues); return; } // Backup original, since strtok is destructive strcpy (optNamesValues, optNamesValuesOrig); char *nameTrimmed = (char *)calloc (len + 1, 1); char *valueStr = 0; const char *betweenPairs = ","; const char *betweenOptVal = "="; // Count number of pairs char *pairToken = (char *)optNamesValuesOrig; // TODO do with CompString unsigned int nPairs = 1; while ((pairToken = strchr (pairToken, betweenPairs[0]))) { ++pairToken; // skip delimiter ++nPairs; } os->pairs.clear (); os->pairs.reserve (nPairs); // Tokenize pairs char *name = strtok (optNamesValues, betweenOptVal); int errorNo = -1; unsigned int i; for (i = 0; name && i < nPairs; ++i) { errorNo = 0; if (strchr (name, betweenPairs[0])) // handle "a, b=4" case { errorNo = 1; break; } sscanf (name, " %s ", nameTrimmed); if (!strlen (nameTrimmed)) { errorNo = 2; break; } valueStr = strtok (0, betweenPairs); if (!valueStr) { errorNo = 3; break; } // TODO: Fix: Convert to "pluginname:option_name" format // Warning: Assumes that option names in different extension plugins // will be different. bool matched = false; const ExtensionPluginInfo *chosenExtensionPlugin = NULL; CompOption *o = 0; int optId = -1; unsigned int nOptions; foreach (ExtensionPluginInfo *extensionPlugin, mExtensionPlugins) { nOptions = extensionPlugin->effectOptions->size (); for (optId = (int)extensionPlugin->firstEffectOptionIndex; optId < (int)nOptions; ++optId) { o = &(*extensionPlugin->effectOptions)[(unsigned)optId]; if (strcasecmp (nameTrimmed, o->name ().c_str ()) == 0) { matched = true; chosenExtensionPlugin = extensionPlugin; break; } } if (matched) break; } if (!matched) { errorNo = 4; break; } CompOption::Value v; os->pairs.push_back (IdValuePair ()); IdValuePair *pair = &os->pairs[i]; pair->pluginInfo = chosenExtensionPlugin; pair->optionId = optId; int valueRead = -1; switch (o->type ()) { case CompOption::TypeBool: int vb; valueRead = sscanf (valueStr, " %d ", &vb); if (valueRead) pair->value.set ((bool)vb); break; case CompOption::TypeInt: { int vi; valueRead = sscanf (valueStr, " %d ", &vi); if (valueRead > 0) { if (o->rest ().inRange (vi)) { v.set (vi); pair->value = v; } else errorNo = 7; } break; } case CompOption::TypeFloat: { float vf; valueRead = sscanf (valueStr, " %f ", &vf); if (valueRead > 0) { if (o->rest ().inRange (vf)) { v.set (vf); pair->value = v; } else errorNo = 7; } break; } case CompOption::TypeString: { v.set (CompString (valueStr)); valueRead = 1; break; } case CompOption::TypeColor: { unsigned short vc[4]; valueRead = sscanf (valueStr, " #%2hx%2hx%2hx%2hx ", &vc[0], &vc[1], &vc[2], &vc[3]); if (valueRead == 4) { CompOption::Value *pairVal = &pair->value; for (int j = 0; j < 4; ++j) vc[j] = vc[j] << 8 | vc[j]; pairVal->set (vc); } else errorNo = 6; break; } default: break; } if (valueRead == 0) errorNo = 6; if (errorNo > 0) break; // If valueRead is -1 here, then it must be a // non-(int/float/string) option, which is not supported yet. // Such an option doesn't currently exist anyway. errorNo = -1; name = strtok (0, betweenOptVal); } if (i < nPairs) { switch (errorNo) { case -1: case 2: compLogMessage ("animation", CompLogLevelError, "Option name missing in \"%s\"", optNamesValuesOrig); break; case 1: case 3: compLogMessage ("animation", CompLogLevelError, "Option value missing in \"%s\"", optNamesValuesOrig); break; case 4: //compLogMessage ("animation", CompLogLevelError, // "Unknown option \"%s\" in \"%s\"", // nameTrimmed, optNamesValuesOrig); break; case 6: compLogMessage ("animation", CompLogLevelError, "Invalid value \"%s\" in \"%s\"", valueStr, optNamesValuesOrig); break; case 7: compLogMessage ("animation", CompLogLevelError, "Value \"%s\" out of range in \"%s\"", valueStr, optNamesValuesOrig); break; default: break; } os->pairs.clear (); } free (optNamesValues); free (nameTrimmed); } void PrivateAnimScreen::updateOptionSets (AnimEvent e) { OptionSets *oss = &mEventOptionSets[e]; CompOption::Value::Vector *listVal = &getOptions ()[(unsigned) customOptionOptionIds[e]].value ().list (); unsigned int n = listVal->size (); oss->sets.clear (); oss->sets.reserve (n); for (unsigned int i = 0; i < n; ++i) { oss->sets.push_back (OptionSet ()); updateOptionSet (&oss->sets[i], (*listVal)[i].s ().c_str ()); } } compiz-0.9.11+14.04.20140409/plugins/animation/src/horizontalfold.cpp0000644000015301777760000001326712321343002025474 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * horizontalfold.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Horizontal Folds ========================= HorizontalFoldsAnim::HorizontalFoldsAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), FoldAnim::FoldAnim (w, curWindowEvent, duration, info, icon) { } void HorizontalFoldsAnim::initGrid () { mGridWidth = 2; if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) mGridHeight = 3 + 2 * optValI (AnimationOptions::HorizontalFoldsNumFolds); else mGridHeight = 1 + 2 * optValI (AnimationOptions::HorizontalFoldsNumFolds); } float HorizontalFoldsAnim::getObjectZ (GridAnim::GridModel *mModel, float forwardProgress, float sinForProg, float relDistToFoldCenter, float foldMaxAmp) { return -(sinForProg * foldMaxAmp * mModel->scale ().x () * 2 * (0.5 - relDistToFoldCenter)); } void HorizontalFoldsAnim::step () { GridZoomAnim::step (); CompRect winRect (mAWindow->savedRectsValid () ? mAWindow->saveWinRect () : mWindow->geometry ()); CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->inputRect ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); int wx = winRect.x (); int wy = winRect.y (); int oy = outRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); float winHeight = 0; if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) winHeight = winRect.height (); else winHeight = inRect.height (); int nHalfFolds = 2.0 * optValI (AnimationOptions::HorizontalFoldsNumFolds); float foldMaxAmp = 0.3 * pow ((winHeight / nHalfFolds) / ::screen->height (), 0.3) * optValF (AnimationOptions::HorizontalFoldsAmpMult); float forwardProgress = getActualProgress (); float sinForProg = sin (forwardProgress * M_PI / 2); GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i, ++object) { Point3d &objPos = object->position (); if (i % 2 == 0) // object is at the left side { float objGridY = object->gridPosition ().y (); int rowNo = (int)i / mGridWidth; float origy = (wy + (oheight * objGridY - outExtents.top) * mModel->scale ().y ()); if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) { // Execute shade mode if (objGridY == 0) { objPos.setY (oy); objPos.setZ (0); } else if (objGridY == 1) { objPos.setY ( (1 - forwardProgress) * origy + forwardProgress * (oy + mDecorTopHeight + mDecorBottomHeight)); objPos.setZ (0); } else { float relDistToFoldCenter = (rowNo % 2 == 1 ? 0.5 : 0); objPos.setY ( (1 - forwardProgress) * origy + forwardProgress * (oy + mDecorTopHeight)); objPos.setZ ( getObjectZ (mModel, forwardProgress, sinForProg, relDistToFoldCenter, foldMaxAmp)); } } else // Execute normal mode { float relDistToFoldCenter = (rowNo % 2 == 0 ? 0.5 : 0); objPos.setY ( (1 - forwardProgress) * origy + forwardProgress * (inRect.y () + inRect.height () / 2.0)); objPos.setZ ( getObjectZ (mModel, forwardProgress, sinForProg, relDistToFoldCenter, foldMaxAmp)); } } else // object is at the right side { // Set y/z position to the y/z position of the object at the left // on the same row (previous object) Point3d &leftObjPos = (object - 1)->position (); objPos.setY (leftObjPos.y ()); objPos.setZ (leftObjPos.z ()); } float origx = (wx + (owidth * object->gridPosition ().x () - outExtents.left) * mModel->scale ().x ()); objPos.setX (origx); } } bool HorizontalFoldsAnim::zoomToIcon () { return ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValB (AnimationOptions::HorizontalFoldsZoomToTaskbar)); } compiz-0.9.11+14.04.20140409/plugins/animation/src/grid.cpp0000644000015301777760000003046012321343002023355 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * grid.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * Ported to GLVertexBuffer by: Daniel van Vugt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Dodge ========================= GridAnim::GridModel::GridObject::GridObject () : mPosition (0, 0, 0), mGridPosition (0, 0), mOffsetTexCoordForQuadBefore (0, 0), mOffsetTexCoordForQuadAfter (0, 0) { } void GridAnim::GridModel::GridObject::setGridPosition (Point &gridPosition) { mGridPosition = gridPosition; } GridAnim::GridModel::GridModel (CompWindow *w, WindowEvent curWindowEvent, int height, int gridWidth, int gridHeight, int decorTopHeight, int decorBottomHeight) : mScale (1.0f, 1.0f), mScaleOrigin (0, 0) { mNumObjects = (unsigned)(gridWidth * gridHeight); mObjects = new GridObject[mNumObjects]; initObjects (curWindowEvent, height, gridWidth, gridHeight, decorTopHeight, decorBottomHeight); } GridAnim::GridModel::~GridModel () { delete[] mObjects; } void GridAnim::GridModel::initObjects (WindowEvent curWindowEvent, int height, int gridWidth, int gridHeight, int decorTopHeight, int decorBottomHeight) { int gridX, gridY; int nGridCellsY; // number of grid cells in x direction int nGridCellsX = gridWidth - 1; if (curWindowEvent == WindowEventShade || curWindowEvent == WindowEventUnshade) { // Number of grid cells in y direction. // One allocated for top, one for bottom. nGridCellsY = gridHeight - 3; float winContentsHeight = height - decorTopHeight - decorBottomHeight; //Top for (gridX = 0; gridX < gridWidth; ++gridX) { Point gridPos ((float)gridX / nGridCellsX, 0); mObjects[gridX].setGridPosition (gridPos); } float inWinY, gridPosY; // Window contents for (gridY = 1; gridY < gridHeight - 1; ++gridY) { inWinY = (gridY - 1) * winContentsHeight / nGridCellsY + decorTopHeight; gridPosY = inWinY / height; for (gridX = 0; gridX < gridWidth; ++gridX) { Point gridPos ((float)gridX / nGridCellsX, gridPosY); mObjects[gridY * gridWidth + gridX].setGridPosition (gridPos); } } // Bottom (gridY is gridHeight-1 now) for (gridX = 0; gridX < gridWidth; ++gridX) { Point gridPos ((float)gridX / nGridCellsX, 1); mObjects[gridY * gridWidth + gridX].setGridPosition (gridPos); } } else { int objIndex = 0; // number of grid cells in y direction nGridCellsY = gridHeight - 1; for (gridY = 0; gridY < gridHeight; ++gridY) { for (gridX = 0; gridX < gridWidth; ++gridX) { // TODO Optimize Point gridPos ((float)gridX / nGridCellsX, (float)gridY / nGridCellsY); mObjects[objIndex].setGridPosition (gridPos); ++objIndex; } } } } void GridAnim::GridModel::move (float tx, float ty) { GridObject *object = mObjects; for (unsigned int i = 0; i < mNumObjects; ++i, ++object) { object->mPosition.add (Point3d (tx, ty, 0)); } } void GridAnim::updateBB (CompOutput &output) { GridModel::GridObject *object = mModel->mObjects; for (unsigned int i = 0; i < mModel->mNumObjects; ++i, ++object) { mAWindow->expandBBWithPoint (object->position ().x () + 0.5, object->position ().y () + 0.5); } } void GridAnim::initGrid () { mGridWidth = 2; mGridHeight = 2; } GridAnim::GridAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), mModel (NULL), mGridWidth (0), mGridHeight (0), mUseQTexCoord (false) { } void GridAnim::init () { initGrid (); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); mModel = new GridModel (mWindow, mCurWindowEvent, outRect.height (), mGridWidth, mGridHeight, mDecorTopHeight, mDecorBottomHeight); } GridAnim::~GridAnim () { if (mModel) delete mModel; } void GridAnim::addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { if (region.isEmpty ()) // nothing to do return; GLfloat *v, *vMax; bool notUsing3dCoords = !using3D (); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); // window output (contents + decorations + shadows) coordinates and size int ox = outRect.x (); int oy = outRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); // to be used if event is shade/unshade float winContentsY = oy + outExtents.top; float winContentsHeight = oheight - outExtents.top - outExtents.bottom; GLWindow *gWindow = GLWindow::get (mWindow); GLVertexBuffer *vertexBuffer = gWindow->vertexBuffer (); int vSize = vertexBuffer->getVertexStride (); // Indentation kept to provide a clean diff with the old code, for now... { int y1 = outRect.y1 (); int x2 = outRect.x2 (); int y2 = outRect.y2 (); float gridW = (float)owidth / (mGridWidth - 1); float gridH; if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) { if (y1 < winContentsY) // if at top part gridH = mDecorTopHeight; else if (y2 > winContentsY + winContentsHeight) // if at bottom gridH = mDecorBottomHeight; else // in window contents (only in Y coords) { float winContentsHeight = oheight - (mDecorTopHeight + mDecorBottomHeight); gridH = winContentsHeight / (mGridHeight - 3); } } else gridH = (float)oheight / (mGridHeight - 1); int oldCount = vertexBuffer->countVertices (); gWindow->glAddGeometry (matrix, region, clip, gridW, gridH); int newCount = vertexBuffer->countVertices (); v = vertexBuffer->getVertices () + (oldCount * vSize); vMax = vertexBuffer->getVertices () + (newCount * vSize); float x, y, topiyFloat; // For each vertex for (; v < vMax; v += vSize) { x = v[0]; y = v[1]; if (y > y2) y = y2; if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) { if (y1 < winContentsY) // if at top part { topiyFloat = (y - oy) / mDecorTopHeight; topiyFloat = MIN (topiyFloat, 0.999); // avoid 1.0 } else if (y2 > winContentsY + winContentsHeight) // if at bottom topiyFloat = (mGridHeight - 2) + (mDecorBottomHeight ? (y - winContentsY - winContentsHeight) / mDecorBottomHeight : 0); else // in window contents (only in Y coords) topiyFloat = (mGridHeight - 3) * (y - winContentsY) / winContentsHeight + 1; } else topiyFloat = (mGridHeight - 1) * (y - oy) / oheight; // topiy should be at most (mGridHeight - 2) int topiy = (int)(topiyFloat + 1e-4); if (topiy == mGridHeight - 1) --topiy; int bottomiy = topiy + 1; float iny = topiyFloat - topiy; float inyRest = 1 - iny; // End of calculations for y // Indentation kept to provide a clean diff with the old code... { if (x > x2) x = x2; // find containing grid cell (leftix rightix) x (topiy bottomiy) float leftixFloat = (mGridWidth - 1) * (x - ox) / owidth; int leftix = (int)(leftixFloat + 1e-4); if (leftix == mGridWidth - 1) --leftix; int rightix = leftix + 1; // GridModel::GridObjects that are at top, bottom, left, right corners of quad GridModel::GridObject *objToTopLeft = &(mModel->mObjects[topiy * mGridWidth + leftix]); GridModel::GridObject *objToTopRight = &(mModel->mObjects[topiy * mGridWidth + rightix]); GridModel::GridObject *objToBottomLeft = &(mModel->mObjects[bottomiy * mGridWidth + leftix]); GridModel::GridObject *objToBottomRight = &(mModel->mObjects[bottomiy * mGridWidth + rightix]); Point3d &objToTopLeftPos = objToTopLeft->mPosition; Point3d &objToTopRightPos = objToTopRight->mPosition; Point3d &objToBottomLeftPos = objToBottomLeft->mPosition; Point3d &objToBottomRightPos = objToBottomRight->mPosition; // find position in cell by taking remainder of flooring float inx = leftixFloat - leftix; float inxRest = 1 - inx; // Interpolate to find deformed coordinates float hor1x = (inxRest * objToTopLeftPos.x () + inx * objToTopRightPos.x ()); float hor1y = (inxRest * objToTopLeftPos.y () + inx * objToTopRightPos.y ()); float hor1z = (notUsing3dCoords ? 0 : inxRest * objToTopLeftPos.z () + inx * objToTopRightPos.z ()); float hor2x = (inxRest * objToBottomLeftPos.x () + inx * objToBottomRightPos.x ()); float hor2y = (inxRest * objToBottomLeftPos.y () + inx * objToBottomRightPos.y ()); float hor2z = (notUsing3dCoords ? 0 : inxRest * objToBottomLeftPos.z () + inx * objToBottomRightPos.z ()); float deformedX = inyRest * hor1x + iny * hor2x; float deformedY = inyRest * hor1y + iny * hor2y; float deformedZ = inyRest * hor1z + iny * hor2z; v[0] = deformedX; v[1] = deformedY; v[2] = deformedZ; } } } } void GridAnim::drawGeometry () { // Deprecated } GridTransformAnim::GridTransformAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridAnim::GridAnim (w, curWindowEvent, duration, info, icon), mUsingTransform (true) { } void GridTransformAnim::init () { GridAnim::init (); TransformAnim::init (); } void GridTransformAnim::updateBB (CompOutput &output) { if (using3D ()) { GLMatrix wTransform; // center for perspective correction Point center = getCenter (); GLMatrix fullTransform (mTransform.getMatrix ()); applyPerspectiveSkew (output, fullTransform, center); prepareTransform (output, wTransform, fullTransform); mAWindow->expandBBWithPoints3DTransform (output, wTransform, 0, mModel->objects (), mModel->numObjects ()); } else { GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i, ++object) { GLVector coords (object->mPosition.x (), object->mPosition.y (), 0, 1); mAWindow->expandBBWithPoint2DTransform (coords, mTransform); } } } void GridTransformAnim::updateTransform (GLMatrix &wTransform) { if (!mUsingTransform) return; TransformAnim::updateTransform (wTransform); if (using3D ()) { // center for perspective correction Point center = getCenter (); GLMatrix skewTransform; applyPerspectiveSkew (AnimScreen::get (::screen)->output (), skewTransform, center); wTransform *= skewTransform; } } compiz-0.9.11+14.04.20140409/plugins/animation/src/restack.cpp0000644000015301777760000002620712321343002024070 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * restack.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Restack ========================= RestackAnim::RestackAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon) { mRestackData = static_cast (AnimWindow::get (w)->persistentData["restack"]); } void RestackAnim::cleanUp (bool closing, bool destructing) { if (mRestackData->restackInfo ()) mRestackData->resetRestackInfo (); bool thereIsUnfinishedChainElem = false; // Look for still playing windows in parent-child chain CompWindow *wCur = mRestackData->mMoreToBePaintedNext; while (wCur) { AnimWindow *awCur = AnimWindow::get (wCur); if (awCur->curAnimation () && awCur->curAnimation ()->remainingTime () > 0) { thereIsUnfinishedChainElem = true; break; } RestackPersistentData *dataCur = static_cast (awCur->persistentData["restack"]); wCur = dataCur->mMoreToBePaintedNext; } if (!thereIsUnfinishedChainElem) { wCur = mRestackData->mMoreToBePaintedPrev; while (wCur) { AnimWindow *awCur = AnimWindow::get (wCur); if (awCur->curAnimation () && awCur->curAnimation ()->remainingTime () > 0) { thereIsUnfinishedChainElem = true; break; } RestackPersistentData *dataCur = static_cast (awCur->persistentData["restack"]); wCur = dataCur->mMoreToBePaintedPrev; } } if (closing || destructing || !thereIsUnfinishedChainElem) { // Finish off all windows in parent-child chain CompWindow *wCur = mRestackData->mMoreToBePaintedNext; while (wCur) { AnimWindow *awCur = AnimWindow::get (wCur); RestackPersistentData *dataCur = static_cast (awCur->persistentData["restack"]); wCur = dataCur->mMoreToBePaintedNext; static_cast (getExtensionPluginInfo ())->cleanUpParentChildChainItem (awCur); } wCur = mWindow; while (wCur) { AnimWindow *awCur = AnimWindow::get (wCur); RestackPersistentData *dataCur = static_cast (awCur->persistentData["restack"]); wCur = dataCur->mMoreToBePaintedPrev; static_cast (getExtensionPluginInfo ())->cleanUpParentChildChainItem (awCur); } } ExtensionPluginAnimation *extPlugin = static_cast (getExtensionPluginInfo ()); extPlugin->decrementCurRestackAnimCount (); } bool RestackAnim::initiateRestackAnim (int duration) { CompWindow *wStart = 0; CompWindow *wEnd = 0; CompWindow *wOldAbove = 0; if (!mRestackData) return false; ExtensionPluginAnimation *extPlugin = static_cast (getExtensionPluginInfo ()); extPlugin->incrementCurRestackAnimCount (); // If a focus chain (application with open dialog, etc.) is the subject, // in compiz++, their order changes during restack (which wasn't the case // in compiz 0.8. e.g: (subject chain: a b, dodger: x) (a: secondary) // a b x // b x a // x a b if (mRestackData->mIsSecondary) { if (!mRestackData->mMoreToBePaintedNext) return false; AnimWindow *awAbove = AnimWindow::get (mRestackData->mMoreToBePaintedNext); RestackPersistentData *dataAbove = static_cast (awAbove->persistentData["restack"]); mTotalTime = awAbove->curAnimation ()->totalTime (); mRemainingTime = mTotalTime; if (dataAbove && dataAbove->mWinThisIsPaintedBefore) { // Host this subject instead, on the above subject's host mRestackData->getHostedOnWin (mWindow, dataAbove->mWinThisIsPaintedBefore); } // do basic secondary subject initialization postInitiateRestackAnim (0, 0, 0, 0, false); return true; // We're done here } RestackInfo *restackInfo = mRestackData->restackInfo (); bool raised = true; if (restackInfo) { wStart = restackInfo->wStart; wEnd = restackInfo->wEnd; wOldAbove = restackInfo->wOldAbove; raised = restackInfo->raised; } // Find union region of all windows that will be // faded through by w. If the region is empty, don't // run focus fade effect. CompRegion fadeRegion; int numSelectedCandidates = 0; CompRegion subjectsRegion (unionRestackChain (mWindow)); // Compute subject win. region // wCand: Dodge or Focus fade candidate window for (CompWindow *wCand = wStart; wCand && wCand != wEnd->next; wCand = wCand->next) { RestackPersistentData *dataCand = static_cast (AnimWindow::get (wCand)->persistentData["restack"]); if (!extPlugin->relevantForRestackAnim (wCand)) continue; // Skip windows that have been restacked if (wCand != wEnd && dataCand->restackInfo ()) continue; if (wCand->minimized ()) continue; if (!CompositeWindow::get (wCand)->pixmap ()) continue; if (onSameRestackChain (mWindow, wCand)) continue; // Compute intersection of this (wCand) with subject CompRegion candidateWinRegion (wCand->borderRect ()); CompRegion candidateAndSubjectIntersection (candidateWinRegion.intersected (subjectsRegion)); fadeRegion += candidateAndSubjectIntersection; if (!candidateAndSubjectIntersection.isEmpty ()) processCandidate (wCand, mWindow, candidateAndSubjectIntersection, numSelectedCandidates); } if (fadeRegion.isEmpty ()) // empty intersection -> won't be drawn return false; if (wOldAbove) // Store this window in the next window // so that this is drawn before that, i.e. in its old place mRestackData->getHostedOnWin (mWindow, wOldAbove); postInitiateRestackAnim (numSelectedCandidates, duration, wStart, wEnd, raised); // Handle other subjects down the chain if there are any if (mRestackData->mMoreToBePaintedPrev) { RestackPersistentData *dataCur; for (CompWindow *wCur = mRestackData->mMoreToBePaintedPrev; wCur; wCur = dataCur->mMoreToBePaintedPrev) { dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; dataCur->mIsSecondary = true; } } return true; } bool RestackAnim::onSameRestackChain (CompWindow *wSubject, CompWindow *wOther) { RestackPersistentData *dataCur; for (CompWindow *wCur = wSubject; wCur; wCur = dataCur->mMoreToBePaintedNext) { if (wOther == wCur) return true; dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; } RestackPersistentData *dataSubj = static_cast (AnimWindow::get (wSubject)-> persistentData["restack"]); for (CompWindow *wCur = dataSubj->mMoreToBePaintedPrev; wCur; wCur = dataCur->mMoreToBePaintedPrev) { if (wOther == wCur) return true; dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; } return false; } bool RestackAnim::overNewCopy () { bool lowering = (mRestackData->restackInfo () && !mRestackData->restackInfo ()->raised); // Reverse behavior if lowering (i.e. not raising) return ((!lowering && mRestackData->mVisitCount == 2) || (lowering && mRestackData->mVisitCount == 1)); } CompRegion RestackAnim::unionRestackChain (CompWindow *w) { CompRegion unionRegion; RestackPersistentData *dataCur; for (CompWindow *wCur = w; wCur; wCur = dataCur->mMoreToBePaintedNext) { unionRegion += wCur->borderRect (); dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; } RestackPersistentData *dataSubj = static_cast (AnimWindow::get (w)-> persistentData["restack"]); for (CompWindow *wCur = dataSubj->mMoreToBePaintedPrev; wCur; wCur = dataCur->mMoreToBePaintedPrev) { unionRegion += wCur->borderRect (); dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; } return unionRegion; } RestackInfo::RestackInfo (CompWindow *wRestacked, CompWindow *wStart, CompWindow *wEnd, CompWindow *wOldAbove, bool raised) : wRestacked (wRestacked), wStart (wStart), wEnd (wEnd), wOldAbove (wOldAbove), raised (raised) { } RestackPersistentData::RestackPersistentData () : PersistentData (), mRestackInfo (0), mWinToBePaintedBeforeThis (0), mWinThisIsPaintedBefore (0), mMoreToBePaintedPrev (0), mMoreToBePaintedNext (0), mConfigureNotified (false), mWinPassingThrough (0), mWalkerOverNewCopy (false), mVisitCount (0), mIsSecondary (false) { } RestackPersistentData::~RestackPersistentData () { if (mRestackInfo) delete mRestackInfo; } void RestackPersistentData::resetRestackInfo (bool alsoResetChain) { delete mRestackInfo; mRestackInfo = 0; if (alsoResetChain) { // Reset chain connections as this is not on a chain mMoreToBePaintedNext = 0; mMoreToBePaintedPrev = 0; } } void RestackPersistentData::setRestackInfo (CompWindow *wRestacked, CompWindow *wStart, CompWindow *wEnd, CompWindow *wOldAbove, bool raised) { if (mRestackInfo) delete mRestackInfo; mRestackInfo = new RestackInfo (wRestacked, wStart, wEnd, wOldAbove, raised); } /// Make this window be hosted on (i.e. drawn before) the given window. void RestackPersistentData::getHostedOnWin (CompWindow *wGuest, CompWindow *wHost) { RestackPersistentData *dataHost = static_cast (AnimWindow::get (wHost)->persistentData["restack"]); dataHost->mWinToBePaintedBeforeThis = wGuest; mWinThisIsPaintedBefore = wHost; } compiz-0.9.11+14.04.20140409/plugins/animation/src/transform.cpp0000644000015301777760000001022712321343002024442 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz * * transform.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" TransformAnim::TransformAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), mTransformStartProgress (0.0f), mTransformProgress (0.0f) { } void TransformAnim::init () { adjustDuration (); } void TransformAnim::updateBB (CompOutput &output) { GLMatrix wTransform; prepareTransform (output, wTransform, mTransform); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); float corners[4*3] = { static_cast (outRect.x ()), static_cast (outRect.y ()), 0, static_cast (outRect.x () + outRect.width ()), static_cast (outRect.y ()), 0, static_cast (outRect.x ()), static_cast (outRect.y () + outRect.height ()), 0, static_cast (outRect.x () + outRect.width ()), static_cast (outRect.y () + outRect.height ()), 0 }; mAWindow->expandBBWithPoints3DTransform (output, wTransform, corners, 0, 4); } void TransformAnim::step () { mTransform.reset (); applyTransform (); } void TransformAnim::updateTransform (GLMatrix &wTransform) { wTransform *= mTransform; } /// Scales z by 0 and does perspective distortion so that it /// looks the same wherever on the screen. void TransformAnim::perspectiveDistortAndResetZ (GLMatrix &transform) { float v = -1.0 / ::screen->width (); /* This does transform = M * transform, where M is 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, v, 0, 0, 0, 1 */ transform[8] = v * transform[12]; transform[9] = v * transform[13]; transform[10] = v * transform[14]; transform[11] = v * transform[15]; } void TransformAnim::applyPerspectiveSkew (CompOutput &output, GLMatrix &transform, Point ¢er) { GLfloat skewx = -(((center.x () - output.region ()->extents.x1) - output.width () / 2) * 1.15); GLfloat skewy = -(((center.y () - output.region ()->extents.y1) - output.height () / 2) * 1.15); /* transform = M * transform, where M is the skew matrix {1,0,0,0, 0,1,0,0, skewx,skewy,1,0, 0,0,0,1}; */ transform[8] = skewx * transform[0] + skewy * transform[4] + transform[8]; transform[9] = skewx * transform[1] + skewy * transform[5] + transform[9]; transform[10] = skewx * transform[2] + skewy * transform[6] + transform[10]; transform[11] = skewx * transform[3] + skewy * transform[7] + transform[11]; } Point TransformAnim::getCenter () { CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); Point center (inRect.x () + inRect.width () / 2, inRect.y () + inRect.height () / 2); return center; } compiz-0.9.11+14.04.20140409/plugins/animation/src/fade.cpp0000644000015301777760000000346712321343002023336 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * fade.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Fade ========================= FadeAnim::FadeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon) { } void FadeAnim::updateAttrib (GLWindowPaintAttrib &attrib) { attrib.opacity = (GLushort) (mStoredOpacity * (1 - getFadeProgress ())); } void FadeAnim::updateBB (CompOutput &output) { mAWindow->expandBBWithWindow (); } compiz-0.9.11+14.04.20140409/plugins/animation/src/animation.cpp0000644000015301777760000023320112321343002024405 0ustar pbusernogroup00000000000000/** * Animation plugin for compiz/beryl * * animation.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Airplane added by : Carlo Palma * E-mail : carlopalma@salug.it * Based on code originally written by Mark J. Kilgard * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Fold and Skewer added by : Tomasz Kolodziejski * E-mail : tkolodziejski@gmail.com * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to GLES by : Travis Watkins * (C) 2011 Linaro Limited * E-mail : travis.watkins@linaro.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ /* * TODO: * * - Custom bounding box update function for Airplane * * - Auto direction option: Close in opposite direction of opening * - Proper side surface normals for lighting * - decoration shadows * - shadow quad generation * - shadow texture coords (from clip tex. matrices) * - draw shadows * - fade in shadows * * - Voronoi tessellation * - Brick tessellation * - Triangle tessellation * - Hexagonal tessellation * * Effects: * - Circular action for tornado type fx * - Tornado 3D (especially for minimize) * - Helix 3D (hor. strips descend while they rotate and fade in) * - Glass breaking 3D * - Gaussian distr. points (for gradually increasing polygon size * starting from center or near mouse pointer) * - Drawing cracks * - Gradual cracking * * - fix slowness during transparent cube with <100 opacity * - fix occasional wrong side color in some windows * - fix on top windows and panels * (These two only matter for viewing during Rotate Cube. * All windows should be painted with depth test on * like 3d-plugin does) * - play better with rotate (fix cube face drawn on top of polygons * after 45 deg. rotation) * */ #include #include #include #include #include #include "private.h" using namespace compiz::core; class AnimPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (animation, AnimPluginVTable); static const unsigned short FAKE_ICON_SIZE = 4; const unsigned short LAST_ANIM_DIRECTION = 5; const unsigned short NUM_EFFECTS = 16; const char *eventNames[AnimEventNum] = {"Open", "Close", "Minimize", "Unminimize", "Shade", "Focus"}; int chosenEffectOptionIds[AnimEventNum] = { AnimationOptions::OpenEffects, AnimationOptions::CloseEffects, AnimationOptions::MinimizeEffects, AnimationOptions::UnminimizeEffects, AnimationOptions::ShadeEffects, AnimationOptions::FocusEffects, }; int randomEffectOptionIds[AnimEventNum] = { AnimationOptions::OpenRandomEffects, AnimationOptions::CloseRandomEffects, AnimationOptions::MinimizeRandomEffects, AnimationOptions::UnminimizeRandomEffects, AnimationOptions::ShadeRandomEffects, -1 }; int customOptionOptionIds[AnimEventNum] = { AnimationOptions::OpenOptions, AnimationOptions::CloseOptions, AnimationOptions::MinimizeOptions, AnimationOptions::UnminimizeOptions, AnimationOptions::ShadeOptions, AnimationOptions::FocusOptions }; int matchOptionIds[AnimEventNum] = { AnimationOptions::OpenMatches, AnimationOptions::CloseMatches, AnimationOptions::MinimizeMatches, AnimationOptions::UnminimizeMatches, AnimationOptions::ShadeMatches, AnimationOptions::FocusMatches }; int durationOptionIds[AnimEventNum] = { AnimationOptions::OpenDurations, AnimationOptions::CloseDurations, AnimationOptions::MinimizeDurations, AnimationOptions::UnminimizeDurations, AnimationOptions::ShadeDurations, AnimationOptions::FocusDurations }; // Bind each effect in the list of chosen effects for every event, to the // corresponding animation effect (i.e. effect with that name) if it is // provided by a plugin, otherwise set it to None. void PrivateAnimScreen::updateEventEffects (AnimEvent e, bool forRandom, bool callPost) { CompOption::Value::Vector *listVal; EffectSet *effectSet; if (forRandom) { listVal = &getOptions ()[(unsigned)randomEffectOptionIds[e]].value (). list (); effectSet = &mRandomEffects[e]; } else { listVal = &getOptions ()[(unsigned)chosenEffectOptionIds[e]].value (). list (); effectSet = &mEventEffects[e]; } unsigned int n = listVal->size (); effectSet->effects.clear (); effectSet->effects.reserve (n); AnimEffectVector &eventEffectsAllowed = mEventEffectsAllowed[e]; for (unsigned int r = 0; r < n; ++r) // for each row { const CompString &animName = (*listVal)[r].s (); // Find the animation effect with matching name AnimEffectVector::iterator it = find_if (eventEffectsAllowed.begin (), eventEffectsAllowed.end (), boost::bind (&AnimEffectInfo::matchesEffectName, _1, animName)); effectSet->effects.push_back (it == eventEffectsAllowed.end () ? AnimEffectNone : *it); } if (callPost) { foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->postUpdateEventEffects (e, forRandom); } } void PrivateAnimScreen::updateAllEventEffects () { // for each anim event for (int e = 0; e < AnimEventNum; ++e) updateEventEffects ((AnimEvent)e, false); // for each anim event except focus for (int e = 0; e < AnimEventNum - 1; ++e) updateEventEffects ((AnimEvent)e, true); } bool PrivateAnimScreen::isAnimEffectInList (AnimEffect theEffect, EffectSet &effectList) { for (unsigned int i = 0; i < effectList.effects.size (); ++i) if (effectList.effects[i] == theEffect) return true; return false; } bool PrivateAnimScreen::isAnimEffectPossibleForEvent (AnimEffect theEffect, AnimEvent event) { // Check all rows to see if the effect is chosen there unsigned int nRows = mEventEffects[event].effects.size (); for (unsigned int i = 0; i < nRows; ++i) { AnimEffect chosenEffect = mEventEffects[event].effects[i]; // if chosen directly if (chosenEffect == theEffect) return true; // if chosen in random pool if (mRandomEffects[event].effects.size () && chosenEffect == AnimEffectRandom && isAnimEffectInList (theEffect, mRandomEffects[event])) return true; } return false; } bool PrivateAnimScreen::isAnimEffectPossible (AnimEffect theEffect) { for (int e = 0; e < AnimEventNum; ++e) if (isAnimEffectPossibleForEvent (theEffect, (AnimEvent)e)) return true; return false; } bool PrivateAnimScreen::isRestackAnimPossible () { // Check all rows to see if the chosen effect is a restack animation unsigned int nRows = mEventEffects[AnimEventFocus].effects.size (); for (unsigned int i = 0; i < nRows; ++i) { AnimEffect chosenEffect = mEventEffects[(unsigned)AnimEventFocus]. effects[i]; if (chosenEffect->isRestackAnim) return true; } return false; } bool AnimScreen::isRestackAnimPossible () { return priv->isRestackAnimPossible (); } // Extension functions void AnimScreen::addExtension (ExtensionPluginInfo *extensionPluginInfo) { priv->addExtension (extensionPluginInfo, true); } void PrivateAnimScreen::addExtension (ExtensionPluginInfo *extensionPluginInfo, bool shouldInitPersistentData) { mExtensionPlugins.push_back (extensionPluginInfo); unsigned int nPluginEffects = extensionPluginInfo->nEffects; bool eventEffectsNeedUpdate[AnimEventNum] = {false, false, false, false, false}; // Put this plugin's effects into mEventEffects and // mEventEffectsAllowed for (unsigned int j = 0; j < nPluginEffects; ++j) { const AnimEffect effect = extensionPluginInfo->effects[j]; // Update allowed effects for each event for (int e = 0; e < AnimEventNum; ++e) { if (effect->usedForEvents[e]) { mEventEffectsAllowed[e].push_back (effect); eventEffectsNeedUpdate[e] = true; } } } for (int e = 0; e < AnimEventNum; ++e) { if (eventEffectsNeedUpdate[e]) { updateEventEffects ((AnimEvent)e, false, false); if (e != AnimEventFocus) updateEventEffects ((AnimEvent)e, true, false); } } if (shouldInitPersistentData) { const CompWindowList &pl = pushLockedPaintList (); AnimWindow *aw; // Initialize persistent window data for the extension plugin foreach (CompWindow *w, pl) { aw = AnimWindow::get (w); extensionPluginInfo->initPersistentData (aw); } popLockedPaintList (); } } void AnimScreen::removeExtension (ExtensionPluginInfo *extensionPluginInfo) { priv->removeExtension (extensionPluginInfo); } void PrivateAnimScreen::removeExtension (ExtensionPluginInfo *extensionPluginInfo) { // Stop all ongoing animations const CompWindowList &pl = pushLockedPaintList (); PrivateAnimWindow *aw; foreach (CompWindow *w, pl) { aw = AnimWindow::get (w)->priv; if (aw->curAnimation ()) aw->postAnimationCleanUp (); } popLockedPaintList (); // Find the matching plugin and delete it ExtensionPluginVector::iterator it = find (mExtensionPlugins.begin (), mExtensionPlugins.end (), extensionPluginInfo); if (it == mExtensionPlugins.end ()) return; // couldn't find that extension plugin mExtensionPlugins.erase (it); if (extensionPluginInfo->nEffects == 0) return; // no animation effects -> we're done here // Also delete the "allowed effect" entries for that plugin for (int e = 0; e < AnimEventNum; ++e) { AnimEffectVector &eventEffectsAllowed = mEventEffectsAllowed[e]; // Find the first animation effect with matching name AnimEffectVector::iterator itBeginEffect = find_if (eventEffectsAllowed.begin (), eventEffectsAllowed.end (), boost::bind (&AnimEffectInfo::matchesPluginName, _1, extensionPluginInfo->name)); if (itBeginEffect == eventEffectsAllowed.end ()) continue; // plugin didn't provide any effects for this event // Find the first animation effect with non-matching name, // starting with itBeginEffect AnimEffectVector::iterator itEndEffect = find_if (itBeginEffect, eventEffectsAllowed.end (), boost::bind (&AnimEffectInfo::matchesPluginName, _1, extensionPluginInfo->name) == false); eventEffectsAllowed.erase (itBeginEffect, itEndEffect); // Update event effects to complete removal updateEventEffects ((AnimEvent)e, false); if (e != AnimEventFocus) updateEventEffects ((AnimEvent)e, true); } const CompWindowList &cpl = pushLockedPaintList (); // Destroy persistent window data for the extension plugin foreach (CompWindow *w, cpl) { AnimWindow *aw = AnimWindow::get (w); extensionPluginInfo->destroyPersistentData (aw); } popLockedPaintList (); } ExtensionPluginInfo::ExtensionPluginInfo (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex) : name (name), nEffects (nEffects), effects (effects), effectOptions (effectOptions), firstEffectOptionIndex (firstEffectOptionIndex) { } // End of extension functions Animation::Animation (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : mWindow (w), mAWindow (AnimWindow::get (w)), mTotalTime (duration), mRemainingTime (duration), mTimeElapsedWithinTimeStep (0), mOverrideProgressDir (0), mCurPaintAttrib (GLWindow::defaultPaintAttrib), mStoredOpacity (CompositeWindow::get (w)->opacity ()), mCurWindowEvent (curWindowEvent), mInitialized (false), // store window opacity mInfo (info), mIcon (icon) { if (curWindowEvent == WindowEventShade || curWindowEvent == WindowEventUnshade) { mDecorTopHeight = w->output ().top; mDecorBottomHeight = w->output ().bottom; } texturesCache = new GLTexture::List (GLWindow::get (w)->textures ()); PrivateAnimScreen *as = mAWindow->priv->paScreen (); mTimestep = as->optionGetTimeStep (); } Animation::~Animation () { delete texturesCache; } CompOption::Value & Animation::optVal (unsigned int optionId) { return mAWindow->pluginOptVal (getExtensionPluginInfo (), optionId, this); } /// Play the animation effect backwards from where it left off. void Animation::reverse () { mRemainingTime = mTotalTime - mRemainingTime; // avoid window remains if (mRemainingTime <= 0) mRemainingTime = 1; switch (mCurWindowEvent) // the old event { case WindowEventOpen: mCurWindowEvent = WindowEventClose; break; case WindowEventClose: mCurWindowEvent = WindowEventOpen; break; case WindowEventMinimize: mCurWindowEvent = WindowEventUnminimize; break; case WindowEventUnminimize: mCurWindowEvent = WindowEventMinimize; break; case WindowEventShade: mCurWindowEvent = WindowEventUnshade; break; case WindowEventUnshade: mCurWindowEvent = WindowEventShade; break; default: break; } // 1: forward, 2: backward (3 - progressDir is opposite direction) int progressDir = 1; switch (mCurWindowEvent) // the new event { case WindowEventClose: case WindowEventMinimize: case WindowEventShade: progressDir = 2; break; default: break; } if (mOverrideProgressDir == 0) mOverrideProgressDir = progressDir; else if (mOverrideProgressDir == 3 - progressDir) mOverrideProgressDir = 0; // disable override } PartialWindowAnim::PartialWindowAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), mUseDrawRegion (false), mDrawRegion () { } void PrivateAnimWindow::updateSelectionRow (unsigned int r) { mPrevAnimSelectionRow = mCurAnimSelectionRow; mCurAnimSelectionRow = (int)r; } // Assumes events in the metadata are in // [Open, Close, Minimize, Unminimize, Shade, Focus] order // and effects among those are in alphabetical order // but with "(Event) None" first and "(Event) Random" last. AnimEffect PrivateAnimScreen::getMatchingAnimSelection (CompWindow *w, AnimEvent e, int *duration) { PrivateAnimWindow *aw = AnimWindow::get (w)->priv; EffectSet *eventEffects = &mEventEffects[e]; CompOption::Value &valMatch = getOptions ()[(unsigned)matchOptionIds[e]].value (); CompOption::Value &valDuration = getOptions ()[(unsigned)durationOptionIds[e]].value (); CompOption::Value &valCustomOptions = getOptions ()[(unsigned)customOptionOptionIds[e]].value (); unsigned int nRows = valMatch.list ().size (); if (nRows != eventEffects->effects.size () || nRows != valDuration.list ().size () || nRows != valCustomOptions.list ().size ()) { compLogMessage ("animation", CompLogLevelError, "Animation settings mismatch in \"Animation " "Selection\" list for %s event.", eventNames[e]); return AnimEffectNone; } // Find the first row that matches this window for this event for (unsigned int i = 0; i < nRows; ++i) { if (!valMatch.list ()[i].match ().evaluate (w)) continue; aw->updateSelectionRow (i); if (duration) *duration = valDuration.list ()[i].i (); AnimEffect effect = eventEffects->effects[i]; return (effect ? effect : AnimEffectNone); } return AnimEffectNone; } AnimEffect PrivateAnimScreen::getActualEffect (AnimEffect effect, AnimEvent animEvent) { bool allRandom = optionGetAllRandom (); AnimEffectVector *randomEffects = &mRandomEffects[animEvent].effects; unsigned int nRandomEffects = randomEffects->size (); if ((effect == AnimEffectRandom) || allRandom) { unsigned int nFirstRandomEffect = 0; if (nRandomEffects == 0) // no random animation selected, assume "all" { randomEffects = &mEventEffectsAllowed[animEvent]; // exclude None and Random nFirstRandomEffect = 2; nRandomEffects = randomEffects->size () - 2; } unsigned int index = nFirstRandomEffect + (unsigned int)(nRandomEffects * (double)rand () / RAND_MAX); return (*randomEffects)[index]; } else return effect; } /// Converts animation direction (up, down, left, right, random, auto) /// to an actual direction (up, down, left, or right). AnimDirection Animation::getActualAnimDirection (AnimDirection dir, bool openDir) { if (dir == AnimDirectionRandom) dir = (AnimDirection)(rand () % 4); else if (dir == AnimDirectionAuto) { CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); // away from icon int centerX = outRect.centerX (); int centerY = outRect.centerY (); float relDiffX = ((float)centerX - mIcon.x ()) / outRect.width (); float relDiffY = ((float)centerY - mIcon.y ()) / outRect.height (); if (openDir) { if (mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) // min/unmin. should always result in +/- y direction dir = (mIcon.y () < (int)::screen->height () - mIcon.y ()) ? AnimDirectionDown : AnimDirectionUp; else if (fabs (relDiffY) > fabs (relDiffX)) dir = relDiffY > 0 ? AnimDirectionDown : AnimDirectionUp; else dir = relDiffX > 0 ? AnimDirectionRight : AnimDirectionLeft; } else { if (mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) // min/unmin. should always result in +/- y direction dir = (mIcon.y () < (int)::screen->height () - mIcon.y ()) ? AnimDirectionUp : AnimDirectionDown; else if (fabs (relDiffY) > fabs (relDiffX)) dir = relDiffY > 0 ? AnimDirectionUp : AnimDirectionDown; else dir = relDiffX > 0 ? AnimDirectionLeft : AnimDirectionRight; } } return dir; } float Animation::progressLinear () { float forwardProgress = 1 - mRemainingTime / (mTotalTime - mTimestep); forwardProgress = MIN (forwardProgress, 1); forwardProgress = MAX (forwardProgress, 0); if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade || mCurWindowEvent == WindowEventFocus) forwardProgress = 1 - forwardProgress; return forwardProgress; } float Animation::progressEaseInEaseOut () { float forwardProgress = 1 - mRemainingTime / (mTotalTime - mTimestep); forwardProgress = MIN (forwardProgress, 1); forwardProgress = MAX (forwardProgress, 0); // Apply sigmoid and normalize forwardProgress = (sigmoid (forwardProgress) - sigmoid (0)) / (sigmoid (1) - sigmoid (0)); if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade || mCurWindowEvent == WindowEventFocus) forwardProgress = 1 - forwardProgress; return forwardProgress; } /// Gives some acceleration (when closing a window) /// or deceleration (when opening a window). /// Applies a sigmoid with slope s, /// where minx and maxx are the /// starting and ending points on the sigmoid. float Animation::progressDecelerateCustom (float progress, float minx, float maxx) { float x = 1 - progress; float s = 8; return 1 - ((sigmoid2 (minx + (x * (maxx - minx)), s) - sigmoid2 (minx, s)) / (sigmoid2 (maxx, s) - sigmoid2 (minx, s))); } float Animation::progressDecelerate (float progress) { return progressDecelerateCustom (progress, 0.5, 0.75); } BoxPtr AnimWindow::BB () { return &priv->mBB; } CompRegion & AnimWindow::stepRegion () { return priv->mStepRegion; } void PrivateAnimWindow::copyResetStepRegion () { mLastStepRegion = mStepRegion; // Reset bounding box for current step mBB.x1 = mBB.y1 = MAXSHORT; mBB.x2 = mBB.y2 = MINSHORT; } void AnimWindow::expandBBWithBox (Box &source) { Box &target = priv->BB (); if (source.x1 < target.x1) target.x1 = source.x1; if (source.x2 > target.x2) target.x2 = source.x2; if (source.y1 < target.y1) target.y1 = source.y1; if (source.y2 > target.y2) target.y2 = source.y2; } void AnimWindow::expandBBWithPoint (float fx, float fy) { Box &target = priv->BB (); short x = MAX (MIN (fx, MAXSHORT - 1), MINSHORT); short y = MAX (MIN (fy, MAXSHORT - 1), MINSHORT); if (target.x1 == MAXSHORT) { target.x1 = x; target.y1 = y; target.x2 = x + 1; target.y2 = y + 1; return; } if (x < target.x1) target.x1 = x; else if (x > target.x2) target.x2 = x; if (y < target.y1) target.y1 = y; else if (y > target.y2) target.y2 = y; } /// This will work for zoom-like 2D transforms, /// but not for glide-like 3D transforms. void AnimWindow::expandBBWithPoint2DTransform (GLVector &coords, GLMatrix &transformMat) { GLVector coordsTransformed = transformMat * coords; expandBBWithPoint (coordsTransformed[GLVector::x], coordsTransformed[GLVector::y]); } static bool project (float objx, float objy, float objz, const float modelview[16], const float projection[16], const GLint viewport[4], float *winx, float *winy, float *winz) { unsigned int i; float in[4]; float out[4]; in[0] = objx; in[1] = objy; in[2] = objz; in[3] = 1.0; for (i = 0; i < 4; ++i) { out[i] = in[0] * modelview[i] + in[1] * modelview[4 + i] + in[2] * modelview[8 + i] + in[3] * modelview[12 + i]; } for (i = 0; i < 4; ++i) { in[i] = out[0] * projection[i] + out[1] * projection[4 + i] + out[2] * projection[8 + i] + out[3] * projection[12 + i]; } if (in[3] == 0.0) return false; in[0] /= in[3]; in[1] /= in[3]; in[2] /= in[3]; /* Map x, y and z to range 0-1 */ in[0] = in[0] * 0.5 + 0.5; in[1] = in[1] * 0.5 + 0.5; in[2] = in[2] * 0.5 + 0.5; /* Map x,y to viewport */ in[0] = in[0] * viewport[2] + viewport[0]; in[1] = in[1] * viewport[3] + viewport[1]; *winx = in[0]; *winy = in[1]; *winz = in[2]; return true; } /// Either points or objects should be non-0. bool AnimWindow::expandBBWithPoints3DTransform (CompOutput &output, GLMatrix &transform, const float *points, GridAnim::GridModel::GridObject *objects, unsigned int nPoints) { GLfloat x, y, z; GLint viewport[4] = {output.region ()->extents.x1, output.region ()->extents.y1, output.width (), output.height ()}; const float *projection = GLScreen::get (::screen)->projectionMatrix ()->getMatrix (); if (points) // use points { for (; nPoints; --nPoints, points += 3) { if (!project (points[0], points[1], points[2], transform.getMatrix (), projection, viewport, &x, &y, &z)) return false; expandBBWithPoint (x + 0.5, (::screen->height () - y) + 0.5); } } else // use grid model objects { GridAnim::GridModel::GridObject *object = objects; for (; nPoints; --nPoints, ++object) { if (!project (object->position ().x (), object->position ().y (), object->position ().z (), transform.getMatrix (), projection, viewport, &x, &y, &z)) return false; expandBBWithPoint (x + 0.5, (::screen->height () - y) + 0.5); } } return true; } void AnimWindow::expandBBWithWindow () { CompRect outRect (savedRectsValid () ? savedOutRect () : mWindow->outputRect ()); Box windowBox = { static_cast (outRect.x ()), static_cast (outRect.x () + outRect.width ()), static_cast (outRect.y ()), static_cast (outRect.y () + outRect.height ()) }; expandBBWithBox (windowBox); } void AnimWindow::expandBBWithScreen () { Box screenBox = {0, static_cast (::screen->width ()), 0, static_cast (::screen->height ())}; expandBBWithBox (screenBox); } void Animation::prepareTransform (CompOutput &output, GLMatrix &resultTransform, GLMatrix &transform) { GLMatrix sTransform; sTransform.toScreenSpace (&output, -DEFAULT_Z_CAMERA); resultTransform = sTransform * transform; } void AnimWindow::resetStepRegionWithBB () { // Have a 1 pixel margin to prevent occasional 1 pixel line artifact CompRegion region (priv->mBB.x1 - 1, priv->mBB.y1 - 1, priv->mBB.x2 - priv->mBB.x1 + 2, priv->mBB.y2 - priv->mBB.y1 + 2); priv->mStepRegion = region; } /// Damage the union of window's bounding box /// before and after animStepFunc does its job. void PrivateAnimWindow::damageThisAndLastStepRegion () { // Find union of the regions for this step and last step CompRegion totalRegionToDamage (mStepRegion + mLastStepRegion); mPAScreen->cScreen->damageRegion (totalRegionToDamage); } CompOutput & AnimScreen::output () { return priv->output (); } bool AnimScreen::getMousePointerXY (short *x, short *y) { Window w1, w2; int xp, yp, xj, yj; unsigned int m; if (XQueryPointer (::screen->dpy (), ::screen->root (), &w1, &w2, &xj, &yj, &xp, &yp, &m)) { *x = xp; *y = yp; return true; } return false; } unsigned int PrivateAnimWindow::getState () { Atom actual; int format; unsigned long n, left; unsigned char *data; unsigned int retval = WithdrawnState; int result = XGetWindowProperty (::screen->dpy (), mWindow->id (), Atoms::wmState, 0L, 1L, false, Atoms::wmState, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) memcpy (&retval, data, sizeof (int)); XFree ((void *)data); } return retval; } CompOption::Vector & AnimScreen::getOptions () { return priv->getOptions (); } bool AnimScreen::setOption (const CompString &name, CompOption::Value &value) { return priv->setOption (name, value); } void PrivateAnimScreen::eventMatchesChanged (CompOption *opt, AnimationOptions::Options num) { if (mExtensionPlugins.empty ()) initAnimationList (); foreach (CompOption::Value &val, opt->value ().list ()) val.match ().update (); } void PrivateAnimScreen::eventOptionsChanged (CompOption *opt, AnimationOptions::Options num) { if (mExtensionPlugins.empty ()) initAnimationList (); updateOptionSets (getCorrespondingAnimEvent (num)); } void PrivateAnimScreen::eventEffectsChanged (CompOption *opt, AnimationOptions::Options num) { if (mExtensionPlugins.empty ()) initAnimationList (); updateEventEffects (getCorrespondingAnimEvent (num), false); } void PrivateAnimScreen::eventRandomEffectsChanged (CompOption *opt, AnimationOptions::Options num) { if (mExtensionPlugins.empty ()) initAnimationList (); updateEventEffects (getCorrespondingAnimEvent (num), true); } void PrivateAnimWindow::postAnimationCleanUpCustom (bool closing, bool destructing, bool clearMatchingRow) { bool shouldDamageWindow = false; notifyAnimation (false); if (mCurAnimation && mCurAnimation->shouldDamageWindowOnEnd ()) shouldDamageWindow = true; enablePainting (false); if (shouldDamageWindow) mAWindow->expandBBWithWindow (); if (shouldDamageWindow || (mCurAnimation && !mCurAnimation->stepRegionUsed () && mAWindow->BB ()->x1 != MAXSHORT)) // BB intialized mAWindow->resetStepRegionWithBB (); damageThisAndLastStepRegion (); if (mCurAnimation) { mCurAnimation->cleanUp (closing, destructing); delete mCurAnimation; mCurAnimation = 0; } mBB.x1 = mBB.y1 = MAXSHORT; mBB.x2 = mBB.y2 = MINSHORT; mState = mNewState; if (clearMatchingRow) mCurAnimSelectionRow = -1; mFinishingAnim = true; if (!destructing) { mIgnoreDamage = true; while (mUnmapCnt > 0) { mWindow->unmap (); --mUnmapCnt; } if (mUnmapCnt < 0) mUnmapCnt = 0; mIgnoreDamage = false; } while (mDestroyCnt) { mWindow->destroy (); --mDestroyCnt; } mFinishingAnim = false; foreach (ExtensionPluginInfo *extPlugin, mPAScreen->mExtensionPlugins) extPlugin->cleanUpAnimation (closing, destructing); } void AnimWindow::postAnimationCleanUp () { priv->postAnimationCleanUp (); } void PrivateAnimWindow::postAnimationCleanUp () { if (mCurAnimation->curWindowEvent () == WindowEventClose) postAnimationCleanUpCustom (true, false, true); else postAnimationCleanUpCustom (false, false, true); } void PrivateAnimWindow::postAnimationCleanUpPrev (bool closing, bool clearMatchingRow) { int curAnimSelectionRow = mCurAnimSelectionRow; // Use previous event's anim selection row mCurAnimSelectionRow = mPrevAnimSelectionRow; postAnimationCleanUpCustom (closing, false, clearMatchingRow); // Restore current event's anim selection row mCurAnimSelectionRow = curAnimSelectionRow; } void PrivateAnimScreen::activateEvent (bool activating) { if (activating) { if (mAnimInProgress) return; } else // Animations have finished for all windows // (Keep preparePaint enabled) aScreen->enableCustomPaintList (false); cScreen->donePaintSetEnabled (this, activating); gScreen->glPaintOutputSetEnabled (this, activating); mAnimInProgress = activating; CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("active", CompOption::TypeBool)); o[0].value ().set ((int) ::screen->root ()); o[1].value ().set (activating); ::screen->handleCompizEvent ("animation", "activate", o); } void PrivateAnimWindow::notifyAnimation (bool activation) { if (!mCurAnimation) return; CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("window", CompOption::TypeInt)); o.push_back (CompOption ("type", CompOption::TypeString)); o.push_back (CompOption ("active", CompOption::TypeBool)); o[0].value ().set ((int) ::screen->root ()); o[1].value ().set ((int) mWindow->id ()); switch (mCurAnimation->curWindowEvent ()) { case WindowEventOpen: o[2].value ().set ("open"); break; case WindowEventClose: o[2].value ().set ("close"); break; case WindowEventMinimize: o[2].value ().set ("minimize"); break; case WindowEventUnminimize: o[2].value ().set ("unminimize"); break; case WindowEventShade: o[2].value ().set ("shade"); break; case WindowEventUnshade: o[2].value ().set ("unshade"); break; case WindowEventFocus: o[2].value ().set ("focus"); break; case WindowEventNum: case WindowEventNone: default: o[2].value ().set ("none"); break; } o[3].value ().set (activation); screen->handleCompizEvent ("animation", "window_animation", o); } bool PrivateAnimScreen::otherPluginsActive () { for (int i = 0; i < WatchedScreenPluginNum; ++i) if (mPluginActive[i]) return true; return false; } bool Animation::shouldSkipFrame (int msSinceLastPaintActual) { mTimeElapsedWithinTimeStep += msSinceLastPaintActual; if (mTimeElapsedWithinTimeStep < mTimestep) // if timestep not yet completed return true; mTimeElapsedWithinTimeStep = fmod (mTimeElapsedWithinTimeStep, mTimestep); return false; } bool Animation::advanceTime (int msSinceLastPaint) { mRemainingTime -= msSinceLastPaint; mRemainingTime = MAX (mRemainingTime, 0); // avoid sub-zero values mTimeSinceLastPaint = msSinceLastPaint; return (mRemainingTime > 0); } void PrivateAnimScreen::preparePaint (int msSinceLastPaint) { // Check and update "switcher post wait" counter if (mSwitcherPostWait > 0) { ++mSwitcherPostWait; if (mSwitcherPostWait > 5) // wait over { mSwitcherPostWait = 0; // Reset stacking related info since it will // cause problems because of the restacking // just done by Switcher. ExtensionPluginAnimation *extPlugin = static_cast (mExtensionPlugins[0]); extPlugin->resetStackingInfo (); } } foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->prePreparePaintGeneral (); if (mAnimInProgress) { int msSinceLastPaintActual; const CompWindowList &pl = pushLockedPaintList (); CompWindowList windowsFinishedAnimations; struct timeval curTime; gettimeofday (&curTime, 0); if (mLastRedrawTimeFresh) { msSinceLastPaintActual = timer::timeval_diff (&curTime, &mLastRedrawTime); // handle clock rollback if (msSinceLastPaintActual < 0) msSinceLastPaintActual = 0; } else msSinceLastPaintActual = 20; // assume 20 ms passed mLastRedrawTime = curTime; // Store current time for next time mLastRedrawTimeFresh = true; CompWindow *w; AnimWindow *animWin; PrivateAnimWindow *aw; Animation *curAnim; /* Paint list includes destroyed windows */ for (CompWindowList::const_reverse_iterator rit = pl.rbegin (); rit != pl.rend (); ++rit) { w = (*rit); animWin = AnimWindow::get (w); aw = animWin->priv; curAnim = aw->curAnimation (); if (curAnim) { if (!curAnim->initialized ()) curAnim->init (); curAnim->prePreparePaint (msSinceLastPaint); /* TODO optimize grid model by reusing one GridModel if (aw->com.mModel && (aw->com.mModel->winWidth != outRect.width () || aw->com.mModel->winHeight != outRect.height ())) { // mModel needs update // re-create mModel if (!animEnsureModel (w)) { // Abort this window's animation postAnimationCleanUp (w); continue; } }*/ bool animShouldSkipFrame = (curAnim->shouldSkipFrame (msSinceLastPaintActual) && // Skip only if we're not on the first animation frame curAnim->initialized ()); // Skip only if we're not on the last animation frame animShouldSkipFrame &= curAnim->advanceTime (msSinceLastPaint); if (!animShouldSkipFrame) { if (curAnim->updateBBUsed ()) { aw->copyResetStepRegion (); if (!curAnim->initialized () && curAnim->shouldDamageWindowOnStart ()) aw->aWindow ()->expandBBWithWindow (); } if (!curAnim->initialized ()) curAnim->setInitialized (); curAnim->step (); if (curAnim->updateBBUsed ()) { foreach (CompOutput &output, ::screen->outputDevs ()) curAnim->updateBB (output); if (!curAnim->stepRegionUsed () && aw->BB ().x1 != MAXSHORT) // BB initialized { // BB is used instead of step region, // so reset step region here with BB. animWin->resetStepRegionWithBB (); } if (!(cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_ALL_MASK)) aw->damageThisAndLastStepRegion (); } } bool finished = (curAnim->remainingTime () <= 0); if (finished) // Animation is done windowsFinishedAnimations.push_back (w); } } foreach (CompWindow *w, pl) { PrivateAnimWindow *aw = AnimWindow::get (w)->priv; if (aw->curAnimation ()) aw->curAnimation ()->postPreparePaint (); } popLockedPaintList (); } foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->postPreparePaintGeneral (); cScreen->preparePaint (msSinceLastPaint); if (mStartCountdown) { --mStartCountdown; if (!mStartCountdown) { foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->postStartupCountdown (); } } } void PrivateAnimScreen::donePaint () { assert (mAnimInProgress); const CompWindowList &pl = pushLockedPaintList (); CompWindowList windowsFinishedAnimations; bool animStillInProgress = false; CompWindow *w; AnimWindow *animWin; PrivateAnimWindow *aw; Animation *curAnim; /* Paint list includes destroyed windows */ for (CompWindowList::const_reverse_iterator rit = pl.rbegin (); rit != pl.rend (); ++rit) { w = (*rit); animWin = AnimWindow::get (w); aw = animWin->priv; curAnim = aw->curAnimation (); if (curAnim) { bool finished = (curAnim->remainingTime () <= 0); if (finished) // Animation is done windowsFinishedAnimations.push_back (w); else animStillInProgress = true; } } popLockedPaintList (); foreach (CompWindow *w, windowsFinishedAnimations) { AnimWindow *aw = AnimWindow::get (w); aw->priv->notifyAnimation (false); aw->priv->postAnimationCleanUp (); } if (!animStillInProgress) { activateEvent (false); mLastRedrawTimeFresh = false; // Reset stacking related info after all animations are done. ExtensionPluginAnimation *extPlugin = static_cast (mExtensionPlugins[0]); extPlugin->resetStackingInfo (); } cScreen->damagePending (); cScreen->donePaint (); } void PrivateAnimWindow::enablePainting (bool enabling) { gWindow->glPaintSetEnabled (this, enabling); gWindow->glAddGeometrySetEnabled (this, enabling); //gWindow->glDrawGeometrySetEnabled (this, enabling); gWindow->glDrawTextureSetEnabled (this, enabling); } void PrivateAnimWindow::glAddGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { // if window is being animated if (mCurAnimation) { if (mCurAnimation->initialized ()) mCurAnimation->addGeometry (matrix, region, clip, maxGridWidth, maxGridHeight); } else { gWindow->glAddGeometry (matrix, region, clip, maxGridWidth, maxGridHeight); } } bool Animation::shouldDamageWindowOnStart () { return (mCurWindowEvent == WindowEventClose || mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventShade); } bool Animation::shouldDamageWindowOnEnd () { return (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade); } void Animation::addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { mAWindow->priv->gWindow->glAddGeometry (matrix, region, clip, maxGridWidth, maxGridHeight); } void PartialWindowAnim::addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { if (mUseDrawRegion) { CompRegion awRegion (region.intersected (mDrawRegion)); Animation::addGeometry (matrix, awRegion, clip, maxGridWidth, maxGridHeight); } else { Animation::addGeometry (matrix, region, clip, maxGridWidth, maxGridHeight); } } void PrivateAnimWindow::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { if (mCurAnimation) mCurAnimation->setCurPaintAttrib (attrib); gWindow->glDrawTexture (texture, transform, attrib, mask); } #if 0 // Not ported yet void PrivateAnimWindow::glDrawGeometry () { if (mCurAnimation) { if (mCurAnimation->initialized ()) mCurAnimation->drawGeometry (); } else gWindow->glDrawGeometry (); } #endif void Animation::drawTexture (GLTexture *texture, const GLWindowPaintAttrib &attrib, unsigned int mask) { mCurPaintAttrib = attrib; } void Animation::drawGeometry () { #if 0 // Not ported yet mAWindow->priv->gWindow->glDrawGeometry (); #endif } bool PrivateAnimWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; // Is this the first glPaint call this round // without the mask PAINT_WINDOW_OCCLUSION_DETECTION_MASK? if (mPAScreen->mStartingNewPaintRound && !(mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK)) { mPAScreen->mStartingNewPaintRound = false; // Back-to-front painting of windows is starting now. if (mPAScreen->mPrePaintWindowsBackToFrontEnabled) mPAScreen->prePaintWindowsBackToFront (); } assert (mCurAnimation); foreach (ExtensionPluginInfo *extPlugin, mPAScreen->mExtensionPlugins) { if (extPlugin->paintShouldSkipWindow (mWindow)) return false; } if (mCurAnimation->curWindowEvent () == WindowEventFocus && mPAScreen->otherPluginsActive ()) { postAnimationCleanUp (); return gWindow->glPaint (attrib, transform, region, mask); } GLWindowPaintAttrib wAttrib = attrib; GLMatrix wTransform (transform.getMatrix ()); /* TODO check if this is still necessary if (mCurAnimation->addCustomGeometryFunc) { // Use slightly smaller brightness to force core // to handle indexCount = 0; // TODO check if this is still necessary if (mCurAnimation->requiresTransformedWindow ()) mask |= PAINT_WINDOW_TRANSFORMED_MASK; wAttrib.xScale = 1.0f; wAttrib.yScale = 1.0f; mCurAnimation->updateAttrib (wAttrib); mCurAnimation->updateTransform (wTransform); mCurAnimation->prePaintWindow (); if (mCurAnimation->paintWindowUsed ()) status = mCurAnimation->paintWindow (gWindow, wAttrib, wTransform, region, mask); else status = gWindow->glPaint (wAttrib, wTransform, region, mask); if (mCurAnimation->postPaintWindowUsed ()) { #if 0 // Not ported yet // Transform to make post-paint coincide with the window glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); #endif mCurAnimation->postPaintWindow (); #if 0 // Not ported yet glPopMatrix (); #endif } return status; } const CompWindowList & PrivateAnimScreen::pushLockedPaintList () { if (!mLockedPaintListCnt) { const CompWindowList &pl = cScreen->getWindowPaintList (); mLockedPaintList = &pl; if (!mGetWindowPaintListEnableCnt) { ++mGetWindowPaintListEnableCnt; cScreen->getWindowPaintListSetEnabled (this, true); } } ++mLockedPaintListCnt; return *mLockedPaintList; } void PrivateAnimScreen::popLockedPaintList () { --mLockedPaintListCnt; if (!mLockedPaintListCnt) { mLockedPaintList = NULL; --mGetWindowPaintListEnableCnt; if (!mGetWindowPaintListEnableCnt) cScreen->getWindowPaintListSetEnabled (this, false); } } /// This is enabled only during restack animations. /// or when we need to lock it const CompWindowList & PrivateAnimScreen::getWindowPaintList () { if (mLockedPaintList) return *mLockedPaintList; ExtensionPluginAnimation *extPlugin = static_cast (mExtensionPlugins[0]); return extPlugin->getWindowPaintList (); } /// This is enabled only during restack animations. void PrivateAnimScreen::prePaintWindowsBackToFront () { assert (mAnimInProgress); ExtensionPluginAnimation *extPlugin = static_cast (mExtensionPlugins[0]); extPlugin->prePaintWindowsBackToFront (); } void PrivateAnimScreen::enablePrePaintWindowsBackToFront (bool enabled) { mPrePaintWindowsBackToFrontEnabled = enabled; } void PrivateAnimScreen::pushPaintList () { if (!mGetWindowPaintListEnableCnt) cScreen->getWindowPaintListSetEnabled (this, true); ++mGetWindowPaintListEnableCnt; } void PrivateAnimScreen::popPaintList () { --mGetWindowPaintListEnableCnt; if (!mGetWindowPaintListEnableCnt) cScreen->getWindowPaintListSetEnabled (this, false); } void AnimScreen::enableCustomPaintList (bool enabled) { enabled ? priv->pushPaintList () : priv->popPaintList (); priv->enablePrePaintWindowsBackToFront (enabled); } static const PluginEventInfo watchedScreenPlugins[] = { {"switcher", "activate"}, {"ring", "activate"}, {"shift", "activate"}, {"scale", "activate"}, {"group", "tabChangeActivate"}, {"fadedesktop", "activate"} }; static const PluginEventInfo watchedWindowPlugins[] = { {"kdecompat", "slide"}, }; void PrivateAnimScreen::handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &options) { ::screen->handleCompizEvent (pluginName, eventName, options); for (int i = 0; i < WatchedScreenPluginNum; ++i) { if (strcmp (pluginName, watchedScreenPlugins[i].pluginName) == 0) { if (strcmp (eventName, watchedScreenPlugins[i].activateEventName) == 0) { mPluginActive[i] = CompOption::getBoolOptionNamed (options, "active", false); if (!mPluginActive[i] && (i == WatchedPluginSwitcher || i == WatchedPluginRing || i == WatchedPluginShift || i == WatchedPluginScale)) mSwitcherPostWait = 1; } break; } } for (int i = 0; i < WatchedWindowPluginNum; ++i) { if (strcmp (pluginName, watchedWindowPlugins[i].pluginName) == 0) { if (strcmp (eventName, watchedWindowPlugins[i].activateEventName) == 0) { Window xid = CompOption::getIntOptionNamed (options, "window", 0); CompWindow *w = screen->findWindow (xid); if (w) { AnimWindow *aw = AnimWindow::get (w); PrivateAnimWindow *pw = aw->priv; pw->mPluginActive[i] = CompOption::getBoolOptionNamed ( options, "active", false); } } break; } } } /// Returns true for windows that don't have a pixmap or certain properties, /// like the dimming layer of gksudo and x-session-manager. inline bool PrivateAnimScreen::shouldIgnoreWindowForAnim (CompWindow *w, bool checkPixmap) { AnimWindow *aw = AnimWindow::get (w); for (int i = 0; i < WatchedWindowPluginNum; ++i) if (aw->priv->mPluginActive[i]) return true; return ((checkPixmap && !CompositeWindow::get (w)->pixmap ()) || mNeverAnimateMatch.evaluate (w)); } void PrivateAnimWindow::reverseAnimation () { mCurAnimation->reverse (); // Inflict the pending unmaps while (mUnmapCnt > 0) { mWindow->unmap (); --mUnmapCnt; } if (mUnmapCnt < 0) mUnmapCnt = 0; } void PrivateAnimScreen::initiateCloseAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->preInitiateCloseAnim (aw->mAWindow); if (shouldIgnoreWindowForAnim (w, true)) return; int duration = 200; AnimEffect chosenEffect = getMatchingAnimSelection (w, AnimEventClose, &duration); aw->mState = NormalState; aw->mNewState = WithdrawnState; if (chosenEffect != AnimEffectNone) { bool startingNew = true; WindowEvent curWindowEvent = WindowEventNone; if (aw->curAnimation ()) curWindowEvent = aw->curAnimation ()->curWindowEvent (); if (curWindowEvent != WindowEventNone) { if (curWindowEvent == WindowEventOpen) { startingNew = false; aw->reverseAnimation (); } /* TODO check if necessary else if (aw->com.curWindowEvent == WindowEventClose) { if (aw->com.animOverrideProgressDir == 2) { aw->com.animRemainingTime = tmpSteps; startingNew = false; } }*/ else aw->postAnimationCleanUpPrev (true, false); } if (startingNew) { AnimEffect effectToBePlayed = getActualEffect (chosenEffect, AnimEventClose); // handle empty random effect list if (effectToBePlayed && effectToBePlayed == AnimEffectNone) { aw->mState = aw->mNewState; return; } aw->mCurAnimation = effectToBePlayed->create (w, WindowEventClose, duration, effectToBePlayed, getIcon (w, true)); aw->mCurAnimation->adjustPointerIconSize (); aw->enablePainting (true); } activateEvent (true); aw->notifyAnimation (true); // Increment 3 times to make sure close animation works // (e.g. for popup menus). for (int i = 0; i < 3; ++i) { ++aw->mUnmapCnt; w->incrementUnmapReference (); } cScreen->damagePending (); } /* TODO check if necessary else if (AnimEffectNone != getMatchingAnimSelection (w, AnimEventOpen, &duration)) { // stop the current animation and prevent it from rewinding if (aw->com.animRemainingTime > 0 && aw->com.curWindowEvent != WindowEventOpen) { aw->com.animRemainingTime = 0; } if ((aw->com.curWindowEvent != WindowEventNone) && (aw->com.curWindowEvent != WindowEventClose)) { postAnimationCleanUp (w); } // set some properties to make sure this window will use the // correct open effect the next time it's "opened" activateEvent (w->screen, true); aw->com.curWindowEvent = WindowEventClose; ++aw->mUnmapCnt; w->incrementUnmapRefCnt (); damagePendingOnScreen (w->screen); }*/ else aw->mState = aw->mNewState; // Make sure non-animated closing windows get a damage. if (!aw->curAnimation ()) aw->mAWindow->expandBBWithWindow (); } CompRect PrivateAnimScreen::getIcon (CompWindow *w, bool alwaysUseMouse) { CompRect icon; if (!alwaysUseMouse) icon = w->iconGeometry (); if (alwaysUseMouse || (icon.x () == 0 && icon.y () == 0 && icon.width () == 0 && icon.height () == 0)) // that is, couldn't get icon from window { // Minimize to mouse pointer if there is no // window list or if the window skips taskbar short x, y; if (!aScreen->getMousePointerXY (&x, &y)) { // Use screen center if can't get mouse coords x = ::screen->width () / 2; y = ::screen->height () / 2; } icon.setX (x); icon.setY (y); icon.setWidth (FAKE_ICON_SIZE); icon.setHeight (FAKE_ICON_SIZE); } return icon; } void PrivateAnimScreen::initiateMinimizeAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; if (aw->mWindow->destroyed ()) return; // Store window geometry for use during animation. aw->mAWindow->mSavedInRect = w->inputRect (); aw->mAWindow->mSavedOutRect = w->outputRect (); aw->mAWindow->mSavedOutExtents = w->output (); aw->mAWindow->mSavedWinRect = w->geometry (); aw->mAWindow->mSavedRectsValid = true; aw->mNewState = IconicState; foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->preInitiateMinimizeAnim (aw->mAWindow); int duration = 200; AnimEffect chosenEffect = getMatchingAnimSelection (w, AnimEventMinimize, &duration); if (chosenEffect != AnimEffectNone) { bool startingNew = true; WindowEvent curWindowEvent = WindowEventNone; if (aw->curAnimation ()) curWindowEvent = aw->curAnimation ()->curWindowEvent (); if (curWindowEvent != WindowEventNone) { if (curWindowEvent != WindowEventUnminimize) aw->postAnimationCleanUpPrev (false, false); else { startingNew = false; aw->reverseAnimation (); } } if (startingNew) { AnimEffect effectToBePlayed = getActualEffect (chosenEffect, AnimEventMinimize); // handle empty random effect list if (effectToBePlayed == AnimEffectNone) { aw->mState = aw->mNewState; return; } aw->mCurAnimation = effectToBePlayed->create (w, WindowEventMinimize, duration, effectToBePlayed, getIcon (w, false)); aw->enablePainting (true); } activateEvent (true); aw->notifyAnimation (true); cScreen->damagePending (); } else aw->mState = aw->mNewState; } void PrivateAnimScreen::initiateShadeAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; int duration = 200; AnimEffect chosenEffect = getMatchingAnimSelection (w, AnimEventShade, &duration); aw->setShaded (true); if (chosenEffect != AnimEffectNone) { bool startingNew = true; WindowEvent curWindowEvent = WindowEventNone; if (aw->curAnimation ()) curWindowEvent = aw->curAnimation ()->curWindowEvent (); if (curWindowEvent != WindowEventNone) { if (curWindowEvent != WindowEventUnshade) aw->postAnimationCleanUpPrev (false, false); else { startingNew = false; aw->reverseAnimation (); } } if (startingNew) { AnimEffect effectToBePlayed = getActualEffect (chosenEffect, AnimEventShade); // handle empty random effect list if (effectToBePlayed == AnimEffectNone) return; aw->mCurAnimation = effectToBePlayed->create (w, WindowEventShade, duration, effectToBePlayed, getIcon (w, false)); aw->enablePainting (true); } activateEvent (true); aw->notifyAnimation (true); ++aw->mUnmapCnt; w->incrementUnmapReference (); cScreen->damagePending (); } } void PrivateAnimScreen::initiateOpenAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; int duration = 200; AnimEffect chosenEffect; aw->mNewState = NormalState; foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->preInitiateOpenAnim (aw->mAWindow); WindowEvent curWindowEvent = WindowEventNone; if (aw->curAnimation ()) curWindowEvent = aw->curAnimation ()->curWindowEvent (); if (!shouldIgnoreWindowForAnim (w, false) && (AnimEffectNone != (chosenEffect = getMatchingAnimSelection (w, AnimEventOpen, &duration)) || // reversing case curWindowEvent == WindowEventClose)) { bool startingNew = true; bool playEffect = true; if (curWindowEvent != WindowEventNone) { if (curWindowEvent != WindowEventClose) aw->postAnimationCleanUpPrev (false, false); else { startingNew = false; aw->reverseAnimation (); } } if (startingNew) { AnimEffect effectToBePlayed = getActualEffect (chosenEffect, AnimEventOpen); // handle empty random effect list if (effectToBePlayed == AnimEffectNone) playEffect = false; if (playEffect) { aw->mCurAnimation = effectToBePlayed->create (w, WindowEventOpen, duration, effectToBePlayed, getIcon (w, true)); aw->mCurAnimation->adjustPointerIconSize (); aw->enablePainting (true); } } if (playEffect) { activateEvent (true); aw->notifyAnimation (true); cScreen->damagePending (); } } } void PrivateAnimScreen::initiateUnminimizeAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; if (aw->mWindow->destroyed ()) return; aw->mAWindow->mSavedRectsValid = false; int duration = 200; AnimEffect chosenEffect = getMatchingAnimSelection (w, AnimEventUnminimize, &duration); aw->mNewState = NormalState; if (chosenEffect != AnimEffectNone && !mPluginActive[3]) // fadedesktop { bool startingNew = true; bool playEffect = true; foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->preInitiateUnminimizeAnim (aw->mAWindow); // TODO Refactor the rest? (almost the same in other initiateX methods) WindowEvent curWindowEvent = WindowEventNone; if (aw->curAnimation ()) curWindowEvent = aw->curAnimation ()->curWindowEvent (); if (curWindowEvent != WindowEventNone) { if (curWindowEvent != WindowEventMinimize) aw->postAnimationCleanUpPrev (false, false); else { startingNew = false; aw->reverseAnimation (); } } if (startingNew) { AnimEffect effectToBePlayed = getActualEffect (chosenEffect, AnimEventUnminimize); // handle empty random effect list if (effectToBePlayed == AnimEffectNone) playEffect = false; if (playEffect) { aw->mCurAnimation = effectToBePlayed->create (w, WindowEventUnminimize, duration, effectToBePlayed, getIcon (w, false)); aw->enablePainting (true); } } if (playEffect) { activateEvent (true); aw->notifyAnimation (true); cScreen->damagePending (); } } } void PrivateAnimScreen::initiateUnshadeAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; aw->mAWindow->mSavedRectsValid = false; aw->setShaded (false); aw->mNewState = NormalState; int duration = 200; AnimEffect chosenEffect = getMatchingAnimSelection (w, AnimEventShade, &duration); if (chosenEffect != AnimEffectNone) { bool startingNew = true; bool playEffect = true; WindowEvent curWindowEvent = WindowEventNone; if (aw->curAnimation ()) curWindowEvent = aw->curAnimation ()->curWindowEvent (); if (curWindowEvent != WindowEventNone) { if (curWindowEvent != WindowEventShade) aw->postAnimationCleanUpPrev (false, false); else { startingNew = false; aw->reverseAnimation (); } } if (startingNew) { AnimEffect effectToBePlayed = getActualEffect (chosenEffect, AnimEventShade); // handle empty random effect list if (effectToBePlayed == AnimEffectNone) playEffect = false; if (playEffect) { aw->mCurAnimation = effectToBePlayed->create (w, WindowEventUnshade, duration, effectToBePlayed, getIcon (w, false)); aw->enablePainting (true); } } if (playEffect) { activateEvent (true); aw->notifyAnimation (true); cScreen->damagePending (); } } } bool PrivateAnimScreen::initiateFocusAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; int duration = 200; if (aw->curAnimation () || otherPluginsActive () || // Check the "switcher post-wait" counter that effectively prevents // focus animation to be initiated when the zoom option value is low // in Switcher. mSwitcherPostWait) return false; AnimEffect chosenEffect = getMatchingAnimSelection (w, AnimEventFocus, &duration); if (chosenEffect != AnimEffectNone) { aw->createFocusAnimation (chosenEffect, duration); if (chosenEffect->isRestackAnim && !(dynamic_cast (aw->mCurAnimation)-> initiateRestackAnim (duration))) { aw->postAnimationCleanUp (); return false; } activateEvent (true); aw->notifyAnimation (true); cScreen->damagePending (); return true; } return false; } void PrivateAnimWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { if (mUnshadePending) { mUnshadePending = false; mPAScreen->initiateUnshadeAnim (this); } else if (mCurAnimation && mCurAnimation->inProgress () && // Don't let transient window open anim be interrupted with a resize notify !(mCurAnimation->curWindowEvent () == WindowEventOpen && (mWindow->wmType () & (CompWindowTypeDropdownMenuMask | CompWindowTypePopupMenuMask | CompWindowTypeMenuMask | CompWindowTypeTooltipMask | CompWindowTypeNotificationMask | CompWindowTypeComboMask | CompWindowTypeDndMask))) && // Ignore resize with dx=0, dy=0, dwidth=0, dheight=0 !(dx == 0 && dy == 0 && dwidth == 0 && dheight == 0) && !mCurAnimation->resizeUpdate (dx, dy, dwidth, dheight)) { postAnimationCleanUp (); mPAScreen->updateAnimStillInProgress (); } mWindow->resizeNotify (dx, dy, dwidth, dheight); } void PrivateAnimScreen::updateAnimStillInProgress () { bool animStillInProgress = false; const CompWindowList &pl = pushLockedPaintList (); foreach (CompWindow *w, pl) { PrivateAnimWindow *aw = AnimWindow::get (w)->priv; if (aw->curAnimation () && aw->curAnimation ()->inProgress ()) { animStillInProgress = true; break; } else aw->notifyAnimation (false); } popLockedPaintList (); if (!animStillInProgress) activateEvent (false); } void PrivateAnimWindow::moveNotify (int dx, int dy, bool immediate) { if (mCurAnimation && mCurAnimation->inProgress () && (mGrabbed || !mCurAnimation->moveUpdate (dx, dy))) { // Stop the animation postAnimationCleanUp (); mPAScreen->updateAnimStillInProgress (); } mWindow->moveNotify (dx, dy, immediate); } void PrivateAnimWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { mGrabbed = true; mWindow->grabNotify (x, y, state, mask); } void PrivateAnimWindow::ungrabNotify () { mGrabbed = false; mWindow->ungrabNotify (); } bool PrivateAnimScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask) { assert (mAnimInProgress); mStartingNewPaintRound = true; foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->prePaintOutput (output); mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; mOutput = output; return gScreen->glPaintOutput (attrib, matrix, region, output, mask); } AnimEffectUsedFor AnimEffectUsedFor::all () { AnimEffectUsedFor usedFor; usedFor.open = usedFor.close = usedFor.minimize = usedFor.shade = usedFor.unminimize = usedFor.focus = true; return usedFor; } AnimEffectUsedFor AnimEffectUsedFor::none () { AnimEffectUsedFor usedFor; usedFor.open = usedFor.close = usedFor.minimize = usedFor.shade = usedFor.unminimize = usedFor.focus = false; return usedFor; } AnimEffectUsedFor& AnimEffectUsedFor::exclude (AnimEvent event) { switch (event) { case AnimEventOpen: open = false; break; case AnimEventClose: close = false; break; case AnimEventMinimize: minimize = false; break; case AnimEventUnminimize: unminimize = false; break; case AnimEventShade: shade = false; break; case AnimEventFocus: focus = false; break; default: break; } return *this; } AnimEffectUsedFor& AnimEffectUsedFor::include (AnimEvent event) { switch (event) { case AnimEventOpen: open = true; break; case AnimEventClose: close = true; break; case AnimEventMinimize: minimize = true; break; case AnimEventUnminimize: unminimize = true; break; case AnimEventShade: shade = true; break; case AnimEventFocus: focus = true; break; default: break; } return *this; } AnimEffectInfo::AnimEffectInfo (const char *name, AnimEffectUsedFor usedFor, CreateAnimFunc create, bool isRestackAnim) : name (name), create (create), isRestackAnim (isRestackAnim) { usedForEvents[AnimEventOpen] = usedFor.open; usedForEvents[AnimEventClose] = usedFor.close; usedForEvents[AnimEventMinimize] = usedFor.minimize; usedForEvents[AnimEventUnminimize] = usedFor.unminimize; usedForEvents[AnimEventShade] = usedFor.shade; usedForEvents[AnimEventFocus] = usedFor.focus; } bool AnimEffectInfo::matchesEffectName (const CompString &animName) { return (0 == strcasecmp (animName.c_str (), name)); } bool AnimEffectInfo::matchesPluginName (const CompString &pluginName) { return (0 == strncmp (pluginName.c_str (), name, pluginName.length ())); } AnimEffect animEffects[NUM_EFFECTS]; ExtensionPluginAnimation animExtensionPluginInfo (CompString ("animation"), NUM_EFFECTS, animEffects, 0, NUM_NONEFFECT_OPTIONS); ExtensionPluginInfo * Animation::getExtensionPluginInfo () { return &animExtensionPluginInfo; } AnimEffect AnimEffectNone; AnimEffect AnimEffectRandom; AnimEffect AnimEffectCurvedFold; AnimEffect AnimEffectDodge; AnimEffect AnimEffectDream; AnimEffect AnimEffectFade; AnimEffect AnimEffectFocusFade; AnimEffect AnimEffectGlide1; AnimEffect AnimEffectGlide2; AnimEffect AnimEffectHorizontalFolds; AnimEffect AnimEffectMagicLamp; AnimEffect AnimEffectMagicLampWavy; AnimEffect AnimEffectRollUp; AnimEffect AnimEffectSidekick; AnimEffect AnimEffectWave; AnimEffect AnimEffectZoom; PrivateAnimScreen::PrivateAnimScreen (CompScreen *s, AnimScreen *as) : cScreen (CompositeScreen::get (s)), gScreen (GLScreen::get (s)), aScreen (as), mLastRedrawTimeFresh (false), mSwitcherPostWait (0), mStartCountdown (20), // start the countdown mLastActiveWindow (0), mAnimInProgress (false), mStartingNewPaintRound (false), mPrePaintWindowsBackToFrontEnabled (false), mOutput (0), mLockedPaintList (NULL), mLockedPaintListCnt (0), mGetWindowPaintListEnableCnt (0) { for (int i = 0; i < WatchedScreenPluginNum; ++i) mPluginActive[i] = false; // Never animate screen-dimming layer of logout window and gksu. mNeverAnimateMatch |= "title=gksu"; mNeverAnimateMatch |= "title=x-session-manager"; mNeverAnimateMatch |= "title=gnome-session"; mNeverAnimateMatch.update (); // Set-up option notifiers #define MATCHES_BIND \ boost::bind (&PrivateAnimScreen::eventMatchesChanged, this, _1, _2) #define OPTIONS_BIND \ boost::bind (&PrivateAnimScreen::eventOptionsChanged, this, _1, _2) #define EFFECTS_BIND \ boost::bind (&PrivateAnimScreen::eventEffectsChanged, this, _1, _2) #define RANDOM_EFFECTS_BIND \ boost::bind (&PrivateAnimScreen::eventRandomEffectsChanged, this, _1, _2) optionSetOpenMatchesNotify (MATCHES_BIND); optionSetCloseMatchesNotify (MATCHES_BIND); optionSetMinimizeMatchesNotify (MATCHES_BIND); optionSetUnminimizeMatchesNotify (MATCHES_BIND); optionSetFocusMatchesNotify (MATCHES_BIND); optionSetShadeMatchesNotify (MATCHES_BIND); optionSetOpenOptionsNotify (OPTIONS_BIND); optionSetCloseOptionsNotify (OPTIONS_BIND); optionSetMinimizeOptionsNotify (OPTIONS_BIND); optionSetUnminimizeOptionsNotify (OPTIONS_BIND); optionSetFocusOptionsNotify (OPTIONS_BIND); optionSetShadeOptionsNotify (OPTIONS_BIND); optionSetOpenEffectsNotify (EFFECTS_BIND); optionSetCloseEffectsNotify (EFFECTS_BIND); optionSetMinimizeEffectsNotify (EFFECTS_BIND); optionSetUnminimizeEffectsNotify (EFFECTS_BIND); optionSetFocusEffectsNotify (EFFECTS_BIND); optionSetShadeEffectsNotify (EFFECTS_BIND); optionSetOpenRandomEffectsNotify (RANDOM_EFFECTS_BIND); optionSetCloseRandomEffectsNotify (RANDOM_EFFECTS_BIND); optionSetMinimizeRandomEffectsNotify (RANDOM_EFFECTS_BIND); optionSetUnminimizeRandomEffectsNotify (RANDOM_EFFECTS_BIND); optionSetShadeRandomEffectsNotify (RANDOM_EFFECTS_BIND); ScreenInterface::setHandler (::screen); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } PrivateAnimScreen::~PrivateAnimScreen () { if (mAnimInProgress) activateEvent (false); for (int i = 0; i < NUM_EFFECTS; ++i) delete animEffects[i]; } void PrivateAnimScreen::initAnimationList () { int i = 0; animEffects[i++] = AnimEffectNone = new AnimEffectInfo ("animation:None", AnimEffectUsedFor::all(), 0); animEffects[i++] = AnimEffectRandom = new AnimEffectInfo ("animation:Random", AnimEffectUsedFor::all().exclude(AnimEventFocus), 0); animEffects[i++] = AnimEffectCurvedFold = new AnimEffectInfo ("animation:Curved Fold", AnimEffectUsedFor::all().exclude(AnimEventFocus), &createAnimation); animEffects[i++] = AnimEffectDodge = new AnimEffectInfo ("animation:Dodge", AnimEffectUsedFor::none().include(AnimEventFocus), &createAnimation, true); animEffects[i++] = AnimEffectDream = new AnimEffectInfo ("animation:Dream", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectFade = new AnimEffectInfo ("animation:Fade", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectFocusFade = new AnimEffectInfo ("animation:Focus Fade", AnimEffectUsedFor::none().include(AnimEventFocus), &createAnimation, true); animEffects[i++] = AnimEffectGlide1 = new AnimEffectInfo ("animation:Glide 1", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectGlide2 = new AnimEffectInfo ("animation:Glide 2", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectHorizontalFolds = new AnimEffectInfo ("animation:Horizontal Folds", AnimEffectUsedFor::all().exclude(AnimEventFocus), &createAnimation); animEffects[i++] = AnimEffectMagicLamp = new AnimEffectInfo ("animation:Magic Lamp", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectMagicLampWavy = new AnimEffectInfo ("animation:Magic Lamp Wavy", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectRollUp = new AnimEffectInfo ("animation:Roll Up", AnimEffectUsedFor::none().include(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectSidekick = new AnimEffectInfo ("animation:Sidekick", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectWave = new AnimEffectInfo ("animation:Wave", AnimEffectUsedFor::all().exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectZoom = new AnimEffectInfo ("animation:Zoom", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animExtensionPluginInfo.effectOptions = &getOptions (); // Extends itself with the basic set of animation effects. addExtension (&animExtensionPluginInfo, false); for (int e = 0; e < AnimEventNum; ++e) // for each anim event updateOptionSets ((AnimEvent)e); updateAllEventEffects (); cScreen->preparePaintSetEnabled (this, true); } PrivateAnimWindow::PrivateAnimWindow (CompWindow *w, AnimWindow *aw) : gWindow (GLWindow::get (w)), mWindow (w), mAWindow (aw), mPAScreen (AnimScreen::get (::screen)->priv), mCurAnimation (0), mUnshadePending (false), mEventNotOpenClose (false), mNowShaded (false), mGrabbed (false), mUnmapCnt (0), mDestroyCnt (0), mIgnoreDamage (false), mFinishingAnim (false), mCurAnimSelectionRow (-1) { mBB.x1 = mBB.y1 = MAXSHORT; mBB.x2 = mBB.y2 = MINSHORT; for (int i = 0; i < WatchedWindowPluginNum; ++i) mPluginActive[i] = false; if (w->minimized ()) mState = mNewState = IconicState; else if (w->shaded ()) { mState = mNewState = NormalState; mNowShaded = true; } else mState = mNewState = getState (); WindowInterface::setHandler (mWindow, true); GLWindowInterface::setHandler (gWindow, false); } PrivateAnimWindow::~PrivateAnimWindow () { notifyAnimation (false); postAnimationCleanUpCustom (false, true, true); } void PrivateAnimWindow::windowNotify (CompWindowNotify n) { switch (n) { case CompWindowNotifyEnterShowDesktopMode: case CompWindowNotifyMinimize: mPAScreen->initiateMinimizeAnim (this); mEventNotOpenClose = true; break; case CompWindowNotifyLeaveShowDesktopMode: case CompWindowNotifyUnminimize: mPAScreen->initiateUnminimizeAnim (this); mEventNotOpenClose = true; break; case CompWindowNotifyShade: mPAScreen->initiateShadeAnim (this); mEventNotOpenClose = true; break; case CompWindowNotifyUnshade: if (mNowShaded && mCurAnimation && mCurAnimation->curWindowEvent () == WindowEventShade) mPAScreen->initiateUnshadeAnim (this); // reverse the shade anim break; case CompWindowNotifyClose: if (!(mCurAnimation && (mCurAnimation->curWindowEvent () == WindowEventClose || mCurAnimation->curWindowEvent () == WindowEventUnminimize))) mPAScreen->initiateCloseAnim (this); break; case CompWindowNotifyShow: case CompWindowNotifyBeforeMap: // Prevent dialog disappearing when a dialog is reopened during // its close animation. if (mCurAnimation && mCurAnimation->curWindowEvent () == WindowEventClose) { mPAScreen->initiateOpenAnim (this); mEventNotOpenClose = false; } break; case CompWindowNotifyMap: if (mNowShaded) mUnshadePending = true; else if (!mUnshadePending && !mEventNotOpenClose && !mPAScreen->mStartCountdown && !(mCurAnimation && (mCurAnimation->curWindowEvent () == WindowEventUnminimize || mCurAnimation->curWindowEvent () == WindowEventOpen))) mPAScreen->initiateOpenAnim (this); mEventNotOpenClose = false; break; case CompWindowNotifyBeforeUnmap: if (mCurAnimation && mCurAnimation->curWindowEvent () == WindowEventMinimize) { ++mUnmapCnt; mWindow->incrementUnmapReference (); } break; case CompWindowNotifyBeforeDestroy: if (!mFinishingAnim) { if (mPAScreen->shouldIgnoreWindowForAnim (mWindow, true) || /* Don't increment the destroy reference count unless * the window is already animated */ !mCurAnimation) break; ++mDestroyCnt; mWindow->incrementDestroyReference (); } break; case CompWindowNotifyUnreparent: if (!mFinishingAnim && mPAScreen->shouldIgnoreWindowForAnim (mWindow, false)) break; break; case CompWindowNotifyFocusChange: if (!mPAScreen->mLastActiveWindow || mPAScreen->mLastActiveWindow != mWindow->id ()) { mPAScreen->mLastActiveWindow = mWindow->id (); if (mPAScreen->mStartCountdown) // Don't animate at startup break; int duration = 200; AnimEffect chosenEffect = mPAScreen->getMatchingAnimSelection (mWindow, AnimEventFocus, &duration); if (chosenEffect && chosenEffect != AnimEffectNone && !chosenEffect->isRestackAnim) mPAScreen->initiateFocusAnim (this); } break; case CompWindowNotifyRestack: { // Prevent menu disappearing when a menu is reopened during // its close animation. In that case a restack notify is thrown // for menus. if (mCurAnimation && mCurAnimation->curWindowEvent () == WindowEventClose) { mPAScreen->initiateOpenAnim (this); mEventNotOpenClose = false; break; } // Handle CompWindowNotifyRestack only when necessary. if (!mPAScreen->isRestackAnimPossible () || mPAScreen->mStartCountdown) // Don't animate at startup break; foreach (ExtensionPluginInfo *extPlugin, mPAScreen->mExtensionPlugins) extPlugin->handleRestackNotify (mAWindow); break; } default: break; } mWindow->windowNotify (n); } Animation * AnimWindow::curAnimation () { return priv->curAnimation (); } AnimEffect AnimScreen::getMatchingAnimSelection (CompWindow *w, AnimEvent e, int *duration) { return priv->getMatchingAnimSelection (w, e, duration); } bool AnimScreen::otherPluginsActive () { return priv->otherPluginsActive (); } bool AnimScreen::isAnimEffectPossible (AnimEffect theEffect) { return priv->isAnimEffectPossible (theEffect); } bool AnimScreen::initiateFocusAnim (AnimWindow *aw) { return priv->initiateFocusAnim (aw->priv); } /// If duration is 0, it should be set to a positive value later. void AnimWindow::createFocusAnimation (AnimEffect effect, int duration) { priv->createFocusAnimation (effect, duration); } void AnimWindow::deletePersistentData (const char *name) { PersistentDataMap::iterator itData = persistentData.find (name); if (itData != persistentData.end ()) // if found { delete itData->second; persistentData.erase (itData); } } void PrivateAnimWindow::createFocusAnimation (AnimEffect effect, int duration) { mCurAnimation = effect->create (mWindow, WindowEventFocus, duration, effect, CompRect ()); enablePainting (true); } template class PluginClassHandler; AnimScreen::AnimScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateAnimScreen (s, this)) { priv->initAnimationList (); } AnimScreen::~AnimScreen () { delete priv; } template class PluginClassHandler; AnimWindow::AnimWindow (CompWindow *w) : PluginClassHandler (w), mWindow (w), priv (new PrivateAnimWindow (w, this)), mSavedRectsValid (false) { foreach (ExtensionPluginInfo *extPlugin, priv->mPAScreen->mExtensionPlugins) extPlugin->initPersistentData (this); } AnimWindow::~AnimWindow () { delete priv; // Destroy each persistent data object PersistentDataMap::iterator itData = persistentData.begin (); for (; itData != persistentData.end (); ++itData) delete itData->second; persistentData.clear (); } bool AnimPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) { CompPrivate p; p.uval = ANIMATION_ABI; ::screen->storeValue ("animation_ABI", p); return true; } return false; } void AnimPluginVTable::fini () { ::screen->eraseValue ("animation_ABI"); } compiz-0.9.11+14.04.20140409/plugins/animation/src/magiclamp.cpp0000644000015301777760000003362712321343002024372 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * magiclamp.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Magic Lamp ========================= void MagicLampAnim::initGrid () { mGridWidth = 2; mGridHeight = optValI (AnimationOptions::MagicLampGridRes); } void MagicLampWavyAnim::initGrid () { mGridWidth = 2; mGridHeight = optValI (AnimationOptions::MagicLampWavyGridRes); } MagicLampAnim::MagicLampAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), GridAnim::GridAnim (w, curWindowEvent, duration, info, icon), mTopLeftCornerObject (0), mBottomLeftCornerObject (0) { CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : w->outputRect ()); mTargetTop = ((outRect.y () + outRect.height () / 2) > (icon.y () + icon.height () / 2)); mUseQTexCoord = true; } MagicLampWavyAnim::MagicLampWavyAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), MagicLampAnim::MagicLampAnim (w, curWindowEvent, duration, info, icon) { unsigned int maxWaves = (unsigned) optValI (AnimationOptions::MagicLampWavyMaxWaves); float waveAmpMin = optValF (AnimationOptions::MagicLampWavyAmpMin); float waveAmpMax = optValF (AnimationOptions::MagicLampWavyAmpMax); float distance; if (waveAmpMax < waveAmpMin) waveAmpMax = waveAmpMin; // Initialize waves CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : w->outputRect ()); if (mTargetTop) distance = outRect.y () + outRect.height () - mIcon.y (); else distance = mIcon.y () - outRect.y (); mNumWaves = 1 + (float)maxWaves * distance / ::screen->height (); mWaves = new WaveParam[mNumWaves]; // Compute wave parameters int ampDirection = (RAND_FLOAT () < 0.5 ? 1 : -1); float minHalfWidth = 0.22f; float maxHalfWidth = 0.38f; for (unsigned int i = 0; i < mNumWaves; ++i) { mWaves[i].amp = ampDirection * (waveAmpMax - waveAmpMin) * rand () / RAND_MAX + ampDirection * waveAmpMin; mWaves[i].halfWidth = RAND_FLOAT () * (maxHalfWidth - minHalfWidth) + minHalfWidth; // avoid offset at top and bottom part by added waves float availPos = 1 - 2 * mWaves[i].halfWidth; float posInAvailSegment = 0; if (i > 0) posInAvailSegment = (availPos / mNumWaves) * RAND_FLOAT (); mWaves[i].pos = (posInAvailSegment + i * availPos / mNumWaves + mWaves[i].halfWidth); // switch wave direction ampDirection *= -1; } } MagicLampWavyAnim::~MagicLampWavyAnim () { delete[] mWaves; } /// Makes sure the window gets fully damaged with /// effects that possibly have models that don't cover /// the whole window (like in MagicLampAnim with menus). MagicLampAnim::~MagicLampAnim () { if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade) mAWindow->expandBBWithWindow (); } bool MagicLampWavyAnim::hasMovingEnd () { return optValB (AnimationOptions::MagicLampWavyMovingEnd); } bool MagicLampAnim::hasMovingEnd () { return optValB (AnimationOptions::MagicLampMovingEnd); } /// Applies waves (at each step of the animation). void MagicLampWavyAnim::filterTargetX (float &targetX, float x) { for (unsigned int i = 0; i < mNumWaves; ++i) { float cosx = ((x - mWaves[i].pos) / mWaves[i].halfWidth); if (cosx < -1 || cosx > 1) continue; targetX += (mWaves[i].amp * mModel->scale ().x () * (cos (cosx * M_PI) + 1) / 2); } } void MagicLampAnim::step () { if ((curWindowEvent () == WindowEventOpen || curWindowEvent () == WindowEventClose) && hasMovingEnd ()) { short x, y; // Update icon position AnimScreen::get (::screen)->getMousePointerXY (&x, &y); mIcon.setX (x); mIcon.setY (y); } float forwardProgress = progressLinear (); float iconCloseEndY; float iconFarEndY; float winFarEndY; float winVisibleCloseEndY; CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); float iconShadowLeft = ((float)(outRect.x () - inRect.x ())) * mIcon.width () / mWindow->width (); float iconShadowRight = ((float)(outRect.x2 () - inRect.x2 ())) * mIcon.width () / mWindow->width (); float sigmoid0 = sigmoid (0); float sigmoid1 = sigmoid (1); float winw = outRect.width (); float winh = outRect.height (); if (mTargetTop) { iconFarEndY = mIcon.y (); iconCloseEndY = mIcon.y () + mIcon.height (); winFarEndY = outRect.y () + winh; winVisibleCloseEndY = outRect.y (); if (winVisibleCloseEndY < iconCloseEndY) winVisibleCloseEndY = iconCloseEndY; } else { iconFarEndY = mIcon.y () + mIcon.height (); iconCloseEndY = mIcon.y (); winFarEndY = outRect.y (); winVisibleCloseEndY = outRect.y () + winh; if (winVisibleCloseEndY > iconCloseEndY) winVisibleCloseEndY = iconCloseEndY; } float preShapePhaseEnd = 0.22f; float preShapeProgress = 0; float postStretchProgress = 0; float stretchProgress = 0; float stretchPhaseEnd = preShapePhaseEnd + (1 - preShapePhaseEnd) * (iconCloseEndY - winVisibleCloseEndY) / ((iconCloseEndY - winFarEndY) + (iconCloseEndY - winVisibleCloseEndY)); if (stretchPhaseEnd < preShapePhaseEnd + 0.1) stretchPhaseEnd = preShapePhaseEnd + 0.1; if (forwardProgress < preShapePhaseEnd) { preShapeProgress = forwardProgress / preShapePhaseEnd; // Slow down "shaping" toward the end preShapeProgress = 1 - progressDecelerate (1 - preShapeProgress); } if (forwardProgress < preShapePhaseEnd) stretchProgress = forwardProgress / stretchPhaseEnd; else { if (forwardProgress < stretchPhaseEnd) stretchProgress = forwardProgress / stretchPhaseEnd; else postStretchProgress = (forwardProgress - stretchPhaseEnd) / (1 - stretchPhaseEnd); } // The other objects are squeezed into a horizontal line behind the icon int topmostMovingObjectIdx = -1; int bottommostMovingObjectIdx = -1; unsigned int n = mModel->numObjects (); float fx = 0.0f; GridModel::GridObject *object = mModel->objects (); for (unsigned int i = 0; i < n; ++i, ++object) { Point3d &objPos = object->position (); float objGridX = object->gridPosition ().x (); if (i % 2 == 0) // object is at the left side { float objGridY = object->gridPosition ().y (); float origY = (mWindow->y () + (winh * objGridY - outExtents.top) * mModel->scale ().y ()); float iconY = (mIcon.y () + mIcon.height () * objGridY); float stretchedPos; if (mTargetTop) stretchedPos = objGridY * origY + (1 - objGridY) * iconY; else stretchedPos = (1 - objGridY) * origY + objGridY * iconY; // Compute current y position if (forwardProgress < preShapePhaseEnd) objPos.setY ((1 - stretchProgress) * origY + stretchProgress * stretchedPos); else { if (forwardProgress < stretchPhaseEnd) objPos.setY ((1 - stretchProgress) * origY + stretchProgress * stretchedPos); else objPos.setY ((1 - postStretchProgress) * stretchedPos + postStretchProgress * (stretchedPos + (iconCloseEndY - winFarEndY))); } if (mTargetTop) { // pick the first one that is below icon's bottom (close) edge if (objPos.y () > iconCloseEndY && topmostMovingObjectIdx < 0) topmostMovingObjectIdx = (int)i; if (objPos.y () < iconFarEndY) objPos.setY (iconFarEndY); } else { // pick the first one that is below icon's top (close) edge if (objPos.y () > iconCloseEndY && bottommostMovingObjectIdx < 0) bottommostMovingObjectIdx = (int)i; if (objPos.y () > iconFarEndY) objPos.setY (iconFarEndY); } fx = ((iconCloseEndY - objPos.y ()) / (iconCloseEndY - winFarEndY)); } else // object is at the right side { // Set y position to the y position of the object at the left // on the same row (previous object) objPos.setY ((object - 1)->position ().y ()); } float origX = (mWindow->x () + (winw * objGridX - outExtents.left) * mModel->scale ().x ()); float iconX = (mIcon.x () - iconShadowLeft) + (mIcon.width () + iconShadowLeft + iconShadowRight) * objGridX; // Compute "target shape" x position float fy = ((sigmoid (fx) - sigmoid0) / (sigmoid1 - sigmoid0)); float targetX = fy * (origX - iconX) + iconX; filterTargetX (targetX, fx); // Compute current x position if (forwardProgress < preShapePhaseEnd) objPos.setX ((1 - preShapeProgress) * origX + preShapeProgress * targetX); else objPos.setX (targetX); // No need to set objPos.z () to 0, since they won't be used // due to modelAnimIs3D being false for magic lamp. } if (stepRegionUsed ()) { // Pick objects that will act as the corners of rectangles subtracted // from this step's damaged region const float topCornerRowRatio = (mTargetTop ? 0.55 : 0.35);// 0.46 0.42; // rectangle corner row ratio const float bottomCornerRowRatio = (mTargetTop ? 0.65 : 0.42);// 0.46 0.42; // rectangle corner row ratio if (topmostMovingObjectIdx < 0) topmostMovingObjectIdx = 0; if (bottommostMovingObjectIdx < 0) bottommostMovingObjectIdx = (int)n - 2; int nRows = (bottommostMovingObjectIdx - topmostMovingObjectIdx) / 2; int firstMovingRow = topmostMovingObjectIdx / 2; mTopLeftCornerObject = &mModel->objects () [(int)(firstMovingRow + topCornerRowRatio * nRows) * 2]; mBottomLeftCornerObject = &mModel->objects () [(int)(firstMovingRow + bottomCornerRowRatio * nRows) * 2]; } } void MagicLampAnim::updateBB (CompOutput &output) { // Just consider the corner objects GridModel::GridObject *objects = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i) { Point3d &objPos = objects[i].position (); mAWindow->expandBBWithPoint (objPos.x () + 0.5, objPos.y () + 0.5); // skip to the last row after considering the first row // (each row has 2 objects) if (i == 1) i = n - 3; } // Subtract a rectangle from each bounding box corner left empty by // the animation mAWindow->resetStepRegionWithBB (); BoxPtr BB = mAWindow->BB (); CompRegion ®ion = mAWindow->stepRegion (); // Left side if (objects[0].position ().x () > objects[n-2].position ().x ()) { // Top-left corner is empty // Position of grid object to pick as the corner of the subtracted rect. Point3d &objPos = mTopLeftCornerObject->position (); region -= CompRect (BB->x1, BB->y1, objPos.x () - BB->x1, objPos.y () - BB->y1); } else // Bottom-left corner is empty { // Position of grid object to pick as the corner of the subtracted rect. Point3d &objPos = mBottomLeftCornerObject->position (); region -= CompRect (BB->x1, objPos.y (), objPos.x () - BB->x1, BB->y2); } // Right side if (objects[1].position ().x () < objects[n-1].position ().x ()) { // Top-right corner is empty // Position of grid object to pick as the corner of the subtracted rect. Point3d &objPos = (mTopLeftCornerObject + 1)->position (); region -= CompRect (objPos.x (), BB->y1, BB->x2, objPos.y () - BB->y1); } else // Bottom-right corner is empty { // Position of grid object to pick as the corner of the subtracted rect. Point3d &objPos = (mBottomLeftCornerObject + 1)->position (); region -= CompRect (objPos.x (), objPos.y (), BB->x2, BB->y2); } } void MagicLampWavyAnim::updateBB (CompOutput &output) { GridAnim::updateBB (output); } void MagicLampAnim::adjustPointerIconSize () { mIcon.setWidth (MAX (4, optValI (AnimationOptions::MagicLampOpenStartWidth))); // Adjust position so that the icon is centered at the original position. mIcon.setX (mIcon.x () - mIcon.width () / 2); } void MagicLampWavyAnim::adjustPointerIconSize () { mIcon.setWidth (MAX (4, optValI (AnimationOptions::MagicLampWavyOpenStartWidth))); // Adjust position so that the icon is centered at the original position. mIcon.setX (mIcon.x () - mIcon.width () / 2); } compiz-0.9.11+14.04.20140409/plugins/animation/src/zoomside.cpp0000644000015301777760000003072412321343002024264 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * zoomside.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Zoom and Sidekick ========================= const float ZoomAnim::kDurationFactor = 1.33; const float ZoomAnim::kSpringyDurationFactor = 1.82; const float ZoomAnim::kNonspringyDurationFactor = 1.67; ZoomAnim::ZoomAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), FadeAnim::FadeAnim (w, curWindowEvent, duration, info, icon) { CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); if (isZoomFromCenter ()) { mIcon.setX (outRect.x () + outRect.width () / 2 - mIcon.width () / 2); mIcon.setY (outRect.y () + outRect.height () / 2 - mIcon.height () / 2); } } SidekickAnim::SidekickAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), ZoomAnim::ZoomAnim (w, curWindowEvent, duration, info, icon) { // determine number of rotations randomly in [0.9, 1.1] range mNumRotations = optValF (AnimationOptions::SidekickNumRotations) * (1.0f + 0.2f * rand () / RAND_MAX - 0.1f); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); float winCenterX = outRect.x () + outRect.width () / 2.0; float iconCenterX = mIcon.x () + mIcon.width () / 2.0; // if window is to the right of icon, rotate clockwise instead // to make rotation look more pleasant if (winCenterX > iconCenterX) mNumRotations *= -1; } float ZoomAnim::getSpringiness () { return 2 * optValF (AnimationOptions::ZoomSpringiness); } float SidekickAnim::getSpringiness () { return 1.6 * optValF (AnimationOptions::SidekickSpringiness); } bool ZoomAnim::isZoomFromCenter () { return (optValI (AnimationOptions::ZoomFromCenter) == AnimationOptions::ZoomFromCenterOn || ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValI (AnimationOptions::ZoomFromCenter) == AnimationOptions::ZoomFromCenterMinimizeUnminimizeOnly) || ((mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventClose) && optValI (AnimationOptions::ZoomFromCenter) == AnimationOptions::ZoomFromCenterOpenCloseOnly)); } bool SidekickAnim::isZoomFromCenter () { return (optValI (AnimationOptions::SidekickZoomFromCenter) == AnimationOptions::ZoomFromCenterOn || ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValI (AnimationOptions::SidekickZoomFromCenter) == AnimationOptions::SidekickZoomFromCenterMinimizeUnminimizeOnly) || ((mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventClose) && optValI (AnimationOptions::SidekickZoomFromCenter) == AnimationOptions::SidekickZoomFromCenterOpenCloseOnly)); } void ZoomAnim::adjustDuration () { // allow extra time for spring damping / deceleration if ((mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) && getSpringiness () > 1e-4) mTotalTime *= kSpringyDurationFactor; else if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventClose) mTotalTime *= kNonspringyDurationFactor; else mTotalTime *= kDurationFactor; mRemainingTime = mTotalTime; } void ZoomAnim::getZoomProgress (float *pMoveProgress, float *pScaleProgress, bool neverSpringy) { float forwardProgress = 1 - mRemainingTime / (mTotalTime - mTimestep); forwardProgress = MIN (forwardProgress, 1); forwardProgress = MAX (forwardProgress, 0); float x = forwardProgress; bool backwards = false; int animProgressDir = 1; if (mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) animProgressDir = 2; if (mOverrideProgressDir != 0) animProgressDir = mOverrideProgressDir; if ((animProgressDir == 1 && (mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen)) || (animProgressDir == 2 && (mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventClose))) backwards = true; if (backwards) x = 1 - x; float dampBase = (pow (1-pow (x,1.2)*0.5,10)-pow (0.5,10))/(1-pow (0.5,10)); float nonSpringyProgress = 1 - pow (progressDecelerateCustom (1 - x, .5f, .8f), 1.7f); float damping = pow (dampBase, 0.5); float damping2 = ((pow (1-(pow (x,0.7)*0.5),10)-pow (0.5,10))/(1-pow (0.5,10))) * 0.7 + 0.3; float springiness = 0; // springy only when appearing if ((mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) && !neverSpringy) springiness = getSpringiness (); float springyMoveProgress = cos (2*M_PI*pow (x,1)*1.25) * damping * damping2; float scaleProgress; float moveProgress; if (springiness > 1e-4f) { if (x > 0.2) springyMoveProgress *= springiness; else { // interpolate between (springyMoveProgress * springiness) // and springyMoveProgress for smooth transition at 0.2 // (where it crosses y=0) float progressUpto02 = x / 0.2f; springyMoveProgress = (1 - progressUpto02) * springyMoveProgress + progressUpto02 * springyMoveProgress * springiness; } moveProgress = 1 - springyMoveProgress; } else moveProgress = nonSpringyProgress; if (mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) moveProgress = 1 - moveProgress; if (backwards) moveProgress = 1 - moveProgress; float scProgress = nonSpringyProgress; if (mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) scProgress = 1 - scProgress; if (backwards) scProgress = 1 - scProgress; scaleProgress = pow (scProgress, 1.25); if (pMoveProgress) *pMoveProgress = moveProgress; if (pScaleProgress) *pScaleProgress = scaleProgress; } float ZoomAnim::getFadeProgress () { float fadeProgress; getZoomProgress (0, &fadeProgress, false); return fadeProgress; } void ZoomAnim::getCenterScaleFull (Point *pCurCenter, Point *pCurScale, Point *pWinCenter, Point *pIconCenter, float *pMoveProgress) { CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); Point winCenter ((outRect.x () + outRect.width () / 2.0), (outRect.y () + outRect.height () / 2.0)); Point iconCenter (mIcon.x () + mIcon.width () / 2.0, mIcon.y () + mIcon.height () / 2.0); Point winSize (outRect.width (), outRect.height ()); winSize.setX (winSize.x () == 0 ? 1 : winSize.x ()); winSize.setY (winSize.y () == 0 ? 1 : winSize.y ()); float scaleProgress; float moveProgress; getZoomProgress (&moveProgress, &scaleProgress, neverSpringy ()); Point curCenter ((1 - moveProgress) * winCenter.x () + moveProgress * iconCenter.x (), (1 - moveProgress) * winCenter.y () + moveProgress * iconCenter.y ()); Point curScale (((1 - scaleProgress) * winSize.x () + scaleProgress * mIcon.width ()) / winSize.x (), ((1 - scaleProgress) * winSize.y () + scaleProgress * mIcon.height ()) / winSize.y ()); // Copy calculated variables if (pCurCenter) *pCurCenter = curCenter; if (pCurScale) *pCurScale = curScale; if (pWinCenter) *pWinCenter = winCenter; if (pIconCenter) *pIconCenter = iconCenter; if (pMoveProgress) *pMoveProgress = moveProgress; } void ZoomAnim::applyTransform () { if (!zoomToIcon ()) return; Point curCenter; Point curScale; Point winCenter; Point iconCenter; float moveProgress; getCenterScaleFull (&curCenter, &curScale, &winCenter, &iconCenter, &moveProgress); if (scaleAroundIcon ()) { mTransform.translate (iconCenter.x (), iconCenter.y (), 0); mTransform.scale (curScale.x (), curScale.y (), curScale.y ()); mTransform.translate (-iconCenter.x (), -iconCenter.y (), 0); if (hasExtraTransform ()) { mTransform.translate (winCenter.x (), winCenter.y (), 0); applyExtraTransform (moveProgress); mTransform.translate (-winCenter.x (), -winCenter.y (), 0); } } else { mTransform.translate (winCenter.x (), winCenter.y (), 0); float tx, ty; if (shouldAvoidParallelogramLook ()) { // avoid parallelogram look float maxScale = MAX (curScale.x (), curScale.y ()); mTransform.scale (maxScale, maxScale, maxScale); tx = (curCenter.x () - winCenter.x ()) / maxScale; ty = (curCenter.y () - winCenter.y ()) / maxScale; } else { mTransform.scale (curScale.x (), curScale.y (), curScale.y ()); tx = (curCenter.x () - winCenter.x ()) / curScale.x (); ty = (curCenter.y () - winCenter.y ()) / curScale.y (); } mTransform.translate (tx, ty, 0); applyExtraTransform (moveProgress); mTransform.translate (-winCenter.x (), -winCenter.y (), 0); } } void SidekickAnim::applyExtraTransform (float progress) { mTransform.rotate (progress * 360 * mNumRotations, 0.0f, 0.0f, 1.0f); } bool ZoomAnim::scaleAroundIcon () { return (getSpringiness () == 0.0f && (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventClose)); } void ZoomAnim::getCenterScale (Point *pCurCenter, Point *pCurScale) { getCenterScaleFull (pCurCenter, pCurScale, NULL, NULL, NULL); } float ZoomAnim::getActualProgress () { float forwardProgress = 0; if (zoomToIcon ()) getZoomProgress (&forwardProgress, 0, true); else forwardProgress = progressLinear (); return forwardProgress; } Point ZoomAnim::getCenter () { Point center; if (zoomToIcon ()) getCenterScale (¢er, 0); else { float forwardProgress = progressLinear (); CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); center.setX (inRect.x () + inRect.width () / 2.0); if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) { float origCenterY = (inRect.y () + inRect.height () / 2.0); center.setY ((1 - forwardProgress) * origCenterY + forwardProgress * (inRect.y () + mDecorTopHeight)); } else // i.e. (un)minimizing without zooming center.setY (inRect.y () + inRect.height () / 2.0); } return center; } GridZoomAnim::GridZoomAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridTransformAnim::GridTransformAnim (w, curWindowEvent, duration, info, icon), ZoomAnim::ZoomAnim (w, curWindowEvent, duration, info, icon) { } void GridZoomAnim::adjustDuration () { if (zoomToIcon ()) { mTotalTime *= ZoomAnim::kDurationFactor; mRemainingTime = mTotalTime; } } compiz-0.9.11+14.04.20140409/plugins/animation/src/rollup.cpp0000644000015301777760000001016412321343002023744 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * rollup.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Roll Up ========================= const float RollUpAnim::kDurationFactor = 1.67; RollUpAnim::RollUpAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), GridAnim::GridAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { } void RollUpAnim::initGrid () { mGridWidth = 2; if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) mGridHeight = 4; else mGridHeight = 2; } void RollUpAnim::step () { float forwardProgress = progressEaseInEaseOut (); bool fixedInterior = optValB (AnimationOptions::RollupFixedInterior); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); int ox = outRect.x (); int oy = outRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i, ++object) { // Executing shade mode Point3d &objPos = object->position (); if (i % 2 == 0) // object is at the left side { float objGridY = object->gridPosition ().y (); if (objGridY == 0) objPos.setY (oy); else if (objGridY == 1) objPos.setY ( (1 - forwardProgress) * (oy + oheight * objGridY) + forwardProgress * (oy + mDecorTopHeight + mDecorBottomHeight)); else { // find position in window contents // (window contents correspond to 0.0-1.0 range) float relPosInWinContents = (objGridY * oheight - mDecorTopHeight) / mWindow->height (); if (relPosInWinContents > forwardProgress) { objPos.setY ( (1 - forwardProgress) * (oy + oheight * objGridY) + forwardProgress * (oy + mDecorTopHeight)); if (fixedInterior) object->offsetTexCoordForQuadBefore (). setY (-forwardProgress * mWindow->height ()); } else { objPos.setY (oy + mDecorTopHeight); if (!fixedInterior) object->offsetTexCoordForQuadAfter (). setY ((forwardProgress - relPosInWinContents) * mWindow->height ()); } } } else // object is at the right side { // Set y position to the y position of the object at the left // on the same row (previous object) objPos.setY ((object - 1)->position ().y ()); // Also copy offset texture y coordinates object->offsetTexCoordForQuadBefore (). setY ((object - 1)->offsetTexCoordForQuadBefore ().y ()); object->offsetTexCoordForQuadAfter (). setY ((object - 1)->offsetTexCoordForQuadAfter ().y ()); } float origx = ox + owidth * object->gridPosition ().x (); objPos.setX (origx); } } compiz-0.9.11+14.04.20140409/plugins/animation/src/wave.cpp0000644000015301777760000001022012321343002023362 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * wave.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" const float WaveAnim::kMinDuration = 400; // ===================== Effect: Wave ========================= WaveAnim::WaveAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridTransformAnim::GridTransformAnim (w, curWindowEvent, duration, info, icon) { } void WaveAnim::adjustDuration () { if (mTotalTime < kMinDuration) { mTotalTime = kMinDuration; mRemainingTime = mTotalTime; } } void WaveAnim::initGrid () { mGridWidth = 2; mGridHeight = optValI (AnimationOptions::MagicLampWavyGridRes); // TODO new option } void WaveAnim::step () { float forwardProgress = 1 - progressLinear (); if (mCurWindowEvent == WindowEventClose) forwardProgress = 1 - forwardProgress; CompRect winRect (mAWindow->savedRectsValid () ? mAWindow->saveWinRect () : mWindow->geometry ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); int wx = winRect.x (); int wy = winRect.y (); int oy = outRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); float waveHalfWidth = (oheight * mModel->scale ().y () * optValF (AnimationOptions::WaveWidth) / 2); float waveAmp = (pow ((float)oheight / ::screen->height (), 0.4) * 0.04 * optValF (AnimationOptions::WaveAmpMult)); float wavePosition = oy - waveHalfWidth + forwardProgress * (oheight * mModel->scale ().y () + 2 * waveHalfWidth); GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i, ++object) { Point3d &objPos = object->position (); if (i % 2 == 0) // object is at the left side { float origy = wy + mModel->scale ().y () * (oheight * object->gridPosition ().y () - outExtents.top); objPos.setY (origy); float distFromWaveCenter = fabs (objPos.y () - wavePosition); if (distFromWaveCenter < waveHalfWidth) objPos. setZ (waveAmp * (cos (distFromWaveCenter * M_PI / waveHalfWidth) + 1) / 2); else objPos.setZ (0); } else // object is at the right side { // Set y/z position to the y/z position of the object at the left // on the same row (previous object) Point3d &leftObjPos = (object - 1)->position (); objPos.setY (leftObjPos.y ()); objPos.setZ (leftObjPos.z ()); } float origx = wx + mModel->scale ().x () * (owidth * object->gridPosition ().x () - outExtents.left); objPos.setX (origx); } } compiz-0.9.11+14.04.20140409/plugins/animation/src/private.h0000644000015301777760000006071612321343002023556 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include #define foreach BOOST_FOREACH #include #include "animation_options.h" typedef std::vector CompWindowVector; typedef std::vector ExtensionPluginVector; typedef std::vector AnimEffectVector; class RestackInfo { public: RestackInfo (CompWindow *wRestacked, CompWindow *wStart, CompWindow *wEnd, CompWindow *wOldAbove, bool raised); CompWindow *wRestacked; CompWindow *wStart; CompWindow *wEnd; CompWindow *wOldAbove; bool raised; }; class IdValuePair { public: IdValuePair () : pluginInfo (0), optionId (-1), value () {} bool matchesPluginOption (ExtensionPluginInfo *pluginInfo, int optionId) const; const ExtensionPluginInfo *pluginInfo; int optionId; CompOption::Value value; }; typedef std::vector IdValuePairVector; class OptionSet { public: OptionSet () {} IdValuePairVector pairs; }; typedef std::vector OptionSetVector; class OptionSets { public: OptionSets () {} OptionSetVector sets; }; class EffectSet { public: EffectSet () {} AnimEffectVector effects; }; extern AnimEffect AnimEffectNone; extern AnimEffect AnimEffectRandom; extern AnimEffect AnimEffectCurvedFold; extern AnimEffect AnimEffectDodge; extern AnimEffect AnimEffectDream; extern AnimEffect AnimEffectFade; extern AnimEffect AnimEffectFocusFade; extern AnimEffect AnimEffectGlide1; extern AnimEffect AnimEffectGlide2; extern AnimEffect AnimEffectHorizontalFolds; extern AnimEffect AnimEffectMagicLamp; extern AnimEffect AnimEffectMagicLampWavy; extern AnimEffect AnimEffectRollUp; extern AnimEffect AnimEffectSidekick; extern AnimEffect AnimEffectWave; extern AnimEffect AnimEffectZoom; extern const unsigned short NUM_EFFECTS; extern int customOptionOptionIds[AnimEventNum]; typedef struct _PluginEventInfo { const char *pluginName; const char *activateEventName; } PluginEventInfo; typedef enum { WatchedPluginSwitcher = 0, WatchedPluginRing, WatchedPluginShift, WatchedPluginScale, WatchedPluginGroup, WatchedPluginFadedesktop, WatchedScreenPluginNum } WatchedScreenPlugin; typedef enum { WatchedPluginKDECompat, WatchedWindowPluginNum } WatchedWindowPlugin; // This must have the value of the first "effect setting" above // in PrivateAnimScreenOptions #define NUM_NONEFFECT_OPTIONS AnimationOptions::CurvedFoldAmpMult class ExtensionPluginAnimation : public ExtensionPluginInfo { public: ExtensionPluginAnimation (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex); virtual ~ExtensionPluginAnimation (); // Overriden methods from ExtensionPluginInfo void postPreparePaintGeneral (); void prePreparePaintGeneral (); void handleRestackNotify (AnimWindow *aw); // Always reset stacking related info when a window is opened, closed, // minimized, or unminimized. void preInitiateOpenAnim (AnimWindow *aw); void preInitiateCloseAnim (AnimWindow *aw); void preInitiateMinimizeAnim (AnimWindow *aw); void preInitiateUnminimizeAnim (AnimWindow *aw); void initPersistentData (AnimWindow *aw); void destroyPersistentData (AnimWindow *aw); void postUpdateEventEffects (AnimEvent e, bool forRandom); void cleanUpAnimation (bool closing, bool destructing); void postStartupCountdown (); // Other methods void handleSingleRestack (AnimWindow *aw); void prePaintWindowsBackToFront (); bool paintShouldSkipWindow (CompWindow *w); const CompWindowList & getWindowPaintList (); void resetStackingInfo (); static CompWindow *getBottommostInExtendedFocusChain (CompWindow *wStartPoint); static CompWindow *getBottommostInRestackChain (CompWindow *wStartPoint); void resetMarks (); bool markNewCopy (CompWindow *w); CompWindow * walkFirst (); CompWindow * walkNext (CompWindow *w); void incrementCurRestackAnimCount (); void decrementCurRestackAnimCount (); bool wontCreateCircularChain (CompWindow *wCur, CompWindow *wNext); static void cleanUpParentChildChainItem (AnimWindow *aw); static bool relevantForRestackAnim (CompWindow *w); /// Is restackInfo still good? static bool restackInfoStillGood (RestackInfo *restackInfo); void updateLastClientList (); /// A window was restacked this paint round. bool mAWinWasRestackedJustNow; private: CompWindowVector mLastClientList; ///< Last known stacking order CompWindowVector mPrevClientList; ///< The stacking order before mLastClientList int mRestackAnimCount; ///< Count of how many windows are currently involved in ///< animations that require walker (dodge & focus fade). std::vector mRestackedWindows; CompWindowList mWindowList; }; class PrivateAnimScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public AnimationOptions { friend class PrivateAnimWindow; friend class AnimWindow; public: CompositeScreen *cScreen; GLScreen *gScreen; AnimScreen *aScreen; private: struct timeval mLastRedrawTime; bool mLastRedrawTimeFresh; bool mPluginActive[WatchedScreenPluginNum]; int mSwitcherPostWait; int mStartCountdown; ///< To mark windows as "created" if they were opened before compiz ///< was started and to prevent already opened windows from doing ///< open animation. Window mLastActiveWindow; ///< Last known active window bool mAnimInProgress; ///< Is an animation currently being played? bool mStartingNewPaintRound; ///< Is a new round of glPaints starting? bool mPrePaintWindowsBackToFrontEnabled; EffectSet mRandomEffects[AnimEventNum]; OptionSets mEventOptionSets[AnimEventNum]; // Effect extension plugins ExtensionPluginVector mExtensionPlugins; // Possible effects for each event AnimEffectVector mEventEffectsAllowed[AnimEventNum]; // List of chosen effects for each event EffectSet mEventEffects[AnimEventNum]; CompOutput *mOutput; Window mActiveWindow; CompMatch mNeverAnimateMatch; const CompWindowList *mLockedPaintList; unsigned int mLockedPaintListCnt; unsigned int mGetWindowPaintListEnableCnt; void updateEventEffects (AnimEvent e, bool forRandom, bool callPost = true); void updateAllEventEffects (); void updateOptionSets (AnimEvent e); void updateOptionSet (OptionSet *os, const char *optNamesValuesOrig); void activateEvent (bool activating); bool isWinVisible (CompWindow *w); AnimEvent getCorrespondingAnimEvent (AnimationOptions::Options optionId); void eventMatchesChanged (CompOption *opt, AnimationOptions::Options num); void eventOptionsChanged (CompOption *opt, AnimationOptions::Options num); void eventEffectsChanged (CompOption *opt, AnimationOptions::Options num); void eventRandomEffectsChanged (CompOption *opt, AnimationOptions::Options num); CompRect getIcon (CompWindow *w, bool alwaysUseMouse); void updateAnimStillInProgress (); bool isAnimEffectInList (AnimEffect theEffect, EffectSet &effectList); bool isAnimEffectPossibleForEvent (AnimEffect theEffect, AnimEvent event); public: PrivateAnimScreen (CompScreen *s, AnimScreen *); ~PrivateAnimScreen (); // In order to prevent other plugins from modifying // the paint lists as we use it we need to lock the // list const CompWindowList & pushLockedPaintList (); void popLockedPaintList (); void pushPaintList (); void popPaintList (); // Utility methods void initiateOpenAnim (PrivateAnimWindow *aw); void initiateCloseAnim (PrivateAnimWindow *aw); void initiateMinimizeAnim (PrivateAnimWindow *aw); void initiateUnminimizeAnim (PrivateAnimWindow *aw); void initiateShadeAnim (PrivateAnimWindow *aw); void initiateUnshadeAnim (PrivateAnimWindow *aw); bool initiateFocusAnim (PrivateAnimWindow *aw); /// Is a restacking animation currently possible? bool isRestackAnimPossible (); void initAnimationList (); bool isAnimEffectPossible (AnimEffect theEffect); inline CompOutput &output () { return *mOutput; } AnimEffect getActualEffect (AnimEffect effect, AnimEvent animEvent); bool shouldIgnoreWindowForAnim (CompWindow *w, bool checkPixmap); OptionSet *getOptionSetForSelectedRow (PrivateAnimWindow *aw, Animation *anim); void addExtension (ExtensionPluginInfo *extensionPluginInfo, bool shouldInitPersistentData); void removeExtension (ExtensionPluginInfo *extensionPluginInfo); AnimEffect getMatchingAnimSelection (CompWindow *w, AnimEvent e, int *duration); bool otherPluginsActive (); void enablePrePaintWindowsBackToFront (bool enabled); void prePaintWindowsBackToFront (); // CompositeScreenInterface methods void preparePaint (int); void donePaint (); const CompWindowList & getWindowPaintList (); // GLScreenInterface methods bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); // ScreenInterface methods void handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options); }; class PrivateAnimWindow : public WindowInterface, public GLWindowInterface { friend class PrivateAnimScreen; friend class AnimWindow; public: PrivateAnimWindow (CompWindow *, AnimWindow *aw); ~PrivateAnimWindow (); void createFocusAnimation (AnimEffect effect, int duration); inline void setShaded (bool shaded) { mNowShaded = shaded; } inline Animation *curAnimation () { return mCurAnimation; } inline PrivateAnimScreen *paScreen () { return mPAScreen; } inline AnimWindow *aWindow () { return mAWindow; } inline Box &BB () { return mBB; } inline int curAnimSelectionRow () { return mCurAnimSelectionRow; } void damageThisAndLastStepRegion (); void postAnimationCleanUp (); void copyResetStepRegion (); GLWindow *gWindow; private: CompWindow *mWindow; AnimWindow *mAWindow; PrivateAnimScreen *mPAScreen; unsigned int mState; unsigned int mNewState; Animation *mCurAnimation; bool mUnshadePending; bool mEventNotOpenClose; bool mNowShaded; bool mGrabbed; int mUnmapCnt; int mDestroyCnt; bool mIgnoreDamage; bool mFinishingAnim; int mCurAnimSelectionRow; int mPrevAnimSelectionRow; ///< For the case when one event interrupts another Box mBB; ///< Bounding box of area to be damaged CompRegion mStepRegion; ///< Region to damage this step CompRegion mLastStepRegion; ///< Region damaged last step bool mPluginActive[WatchedWindowPluginNum]; // Utility methods unsigned int getState (); void updateSelectionRow (unsigned int i); void postAnimationCleanUpPrev (bool closing, bool clearMatchingRow); void postAnimationCleanUpCustom (bool closing, bool destructing, bool clearMatchingRow); void reverseAnimation (); void enablePainting (bool enabling); void notifyAnimation (bool activation); // WindowInterface methods void resizeNotify (int dx, int dy, int dwidth, int dheight); void moveNotify (int dx, int dy, bool immediate); void windowNotify (CompWindowNotify n); void grabNotify (int x, int y, unsigned int state, unsigned int mask); void ungrabNotify (); // GLWindowInterface methods bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); void glAddGeometry (const GLTexture::MatrixList &, const CompRegion &, const CompRegion &, unsigned int = MAXSHORT, unsigned int = MAXSHORT); void glDrawTexture (GLTexture *texture, const GLMatrix &, const GLWindowPaintAttrib &, unsigned int ); //void glDrawGeometry (); }; class RollUpAnim : public GridAnim { public: RollUpAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: static const float kDurationFactor; void initGrid (); void step (); }; class MagicLampAnim : public GridAnim { public: MagicLampAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); virtual ~MagicLampAnim (); protected: bool mTargetTop; GridModel::GridObject *mTopLeftCornerObject; GridModel::GridObject *mBottomLeftCornerObject; void initGrid (); void step (); void updateBB (CompOutput &output); inline bool stepRegionUsed () { return true; } void adjustPointerIconSize (); virtual bool hasMovingEnd (); virtual void filterTargetX (float &targetX, float x) { } }; class MagicLampWavyAnim : public MagicLampAnim { public: MagicLampWavyAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~MagicLampWavyAnim (); protected: struct WaveParam { float halfWidth; float amp; float pos; }; unsigned int mNumWaves; WaveParam *mWaves; void initGrid (); void updateBB (CompOutput &output); inline bool stepRegionUsed () { return false; } void adjustPointerIconSize (); bool hasMovingEnd (); void filterTargetX (float &targetX, float x); }; class SidekickAnim : public ZoomAnim { public: SidekickAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: float mNumRotations; float getSpringiness (); bool isZoomFromCenter (); inline bool hasExtraTransform () { return true; } void applyExtraTransform (float progress); inline bool shouldAvoidParallelogramLook () { return true; } bool requiresTransformedWindow () const { return true; } }; class WaveAnim : public GridTransformAnim { public: WaveAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void adjustDuration (); void initGrid (); inline bool using3D () { return true; } void step (); bool requiresTransformedWindow () const { return true; } static const float kMinDuration; }; class GlideAnim : public ZoomAnim { public: GlideAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void prePaintWindow (); inline bool postPaintWindowUsed () { return true; } void postPaintWindow (); void adjustDuration (); bool zoomToIcon (); void applyTransform (); float getFadeProgress (); bool requiresTransformedWindow () const { return true; } float getProgress (); virtual void getParams (float *finalDistFac, float *finalRotAng, float *thickness); float glideModRotAngle; ///< The angle of rotation, modulo 360. }; class Glide2Anim : public GlideAnim { public: Glide2Anim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: bool zoomToIcon (); void getParams (float *finalDistFac, float *finalRotAng, float *thickness); }; class RestackPersistentData; class RestackAnim : virtual public Animation { public: RestackAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void cleanUp (bool closing, bool destructing); bool initiateRestackAnim (int duration); inline bool moveUpdate (int dx, int dy) { return false; } static bool onSameRestackChain (CompWindow *wSubject, CompWindow *wOther); /// Find union of restack chain (group) static CompRegion unionRestackChain (CompWindow *w); virtual bool paintedElsewhere () { return false; } protected: // Overridable methods virtual void processCandidate (CompWindow *candidateWin, CompWindow *subjectWin, CompRegion &candidateAndSubjectIntersection, int &numSelectedCandidates) {} virtual void postInitiateRestackAnim (int numSelectedCandidates, int duration, CompWindow *wStart, CompWindow *wEnd, bool raised) {} // Other methods bool overNewCopy (); ///< Is glPaint on the copy at the new position? RestackPersistentData *mRestackData; }; class RestackPersistentData : public PersistentData { friend class ExtensionPluginAnimation; friend class RestackAnim; friend class FocusFadeAnim; friend class DodgeAnim; public: RestackPersistentData (); ~RestackPersistentData (); protected: inline RestackInfo *restackInfo () { return mRestackInfo; } void resetRestackInfo (bool alsoResetChain = false); void setRestackInfo (CompWindow *wRestacked, CompWindow *wStart, CompWindow *wEnd, CompWindow *wOldAbove, bool raised); void getHostedOnWin (CompWindow *wGuest, CompWindow *wHost); RestackInfo *mRestackInfo; ///< restack info if window was restacked this paint round CompWindow *mWinToBePaintedBeforeThis; ///< Window which should be painted before this CompWindow *mWinThisIsPaintedBefore; ///< the inverse relation of mWinToBePaintedBeforeThis CompWindow *mMoreToBePaintedPrev; CompWindow *mMoreToBePaintedNext; ///< doubly linked list for windows underneath that ///< raise together with this one bool mConfigureNotified; ///< was mConfigureNotified before restack check CompWindow *mWinPassingThrough; ///< win. passing through this one during focus effect bool mWalkerOverNewCopy; ///< whether walker is on the copy at the new pos. int mVisitCount; ///< how many times walker/glPaint has visited this window bool mIsSecondary; ///< whether this is one of the secondary (non-topmost) in its restack chain }; class FocusFadeAnim : public RestackAnim, public FadeAnim { public: FocusFadeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void updateAttrib (GLWindowPaintAttrib &attrib); void cleanUp (bool closing, bool destructing); protected: void processCandidate (CompWindow *candidateWin, CompWindow *subjectWin, CompRegion &candidateAndSubjectIntersection, int &numSelectedCandidates); GLushort computeOpacity (GLushort opacityInt); }; typedef enum { DodgeDirectionUp = 0, DodgeDirectionRight, DodgeDirectionDown, DodgeDirectionLeft, DodgeDirectionXY, // movement possibly in both X and Y (for subjects) DodgeDirectionNone } DodgeDirection; class DodgePersistentData; class DodgeAnim : public RestackAnim, public TransformAnim { public: DodgeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void cleanUp (bool closing, bool destructing); static int getDodgeAmount (CompRect &rect, CompWindow *dw, DodgeDirection dir); void step (); void updateTransform (GLMatrix &wTransform); bool shouldDamageWindowOnStart (); void updateBB (CompOutput &output); void postPreparePaint (); void calculateDodgeAmounts (); bool moveUpdate (int dx, int dy); protected: void processCandidate (CompWindow *candidateWin, CompWindow *subjectWin, CompRegion &candidateAndSubjectIntersection, int &numSelectedCandidates); void postInitiateRestackAnim (int numSelectedCandidates, int duration, CompWindow *wStart, CompWindow *wEnd, bool raised); bool paintedElsewhere (); void applyDodgeTransform (); float dodgeProgress (); void updateDodgerDodgeAmount (); DodgePersistentData *mDodgeData; CompWindow *mDodgeSubjectWin;///< The window being dodged float mDodgeMaxAmountX; ///< max # pixels it should dodge ///< (neg. value dodges leftward) float mDodgeMaxAmountY; ///< max # pixels it should dodge ///< (neg. value dodges upward) DodgeDirection mDodgeDirection; int mDodgeMode; }; class DodgePersistentData : public PersistentData { friend class ExtensionPluginAnimation; friend class DodgeAnim; public: DodgePersistentData (); private: int dodgeOrder; ///< dodge order (used temporarily) // TODO mov the below members into DodgeAnim bool isDodgeSubject; ///< true if this window is the cause of dodging bool skipPostPrepareScreen; CompWindow *dodgeChainStart;///< for the subject window CompWindow *dodgeChainPrev; ///< for dodging windows CompWindow *dodgeChainNext; ///< for dodging windows }; class DreamAnim : public GridZoomAnim { public: DreamAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void init (); void initGrid (); void step (); void adjustDuration (); float getFadeProgress (); bool zoomToIcon (); bool requiresTransformedWindow () const { return true; } static const float kDurationFactor; }; class FoldAnim : public GridZoomAnim { public: FoldAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: inline bool using3D () { return true; } float getFadeProgress (); void updateWindowAttrib (GLWindowPaintAttrib &attrib); bool requiresTransformedWindow () const { return true; } }; class CurvedFoldAnim : public FoldAnim { public: CurvedFoldAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void initGrid (); void step (); void updateBB (CompOutput &output); bool zoomToIcon (); float getObjectZ (GridAnim::GridModel *mModel, float forwardProgress, float sinForProg, float relDistToCenter, float curveMaxAmp); bool requiresTransformedWindow () const { return true; } }; class HorizontalFoldsAnim : public FoldAnim { public: HorizontalFoldsAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void initGrid (); void step (); bool zoomToIcon (); float getObjectZ (GridAnim::GridModel *mModel, float forwardProgress, float sinForProg, float relDistToFoldCenter, float foldMaxAmp); bool requiresTransformedWindow () const { return true; } }; compiz-0.9.11+14.04.20140409/plugins/animation/src/glide.cpp0000644000015301777760000001203712321343002023514 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * glide.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Glide ========================= GlideAnim::GlideAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), ZoomAnim::ZoomAnim (w, curWindowEvent, duration, info, icon), glideModRotAngle (0.0f) { } Glide2Anim::Glide2Anim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GlideAnim::GlideAnim (w, curWindowEvent, duration, info, icon) { } void GlideAnim::getParams (float *finalDistFac, float *finalRotAng, float *thickness) { *finalDistFac = optValF (AnimationOptions::Glide1AwayPosition); *finalRotAng = optValF (AnimationOptions::Glide1AwayAngle); } void Glide2Anim::getParams (float *finalDistFac, float *finalRotAng, float *thickness) { *finalDistFac = optValF (AnimationOptions::Glide2AwayPosition); *finalRotAng = optValF (AnimationOptions::Glide2AwayAngle); } float GlideAnim::getProgress () { float forwardProgress = progressLinear (); return progressDecelerate (forwardProgress); } float GlideAnim::getFadeProgress () { if (zoomToIcon ()) return ZoomAnim::getFadeProgress (); return getProgress (); } void GlideAnim::applyTransform () { if (zoomToIcon ()) ZoomAnim::applyTransform (); float finalDistFac; float finalRotAng; float thickness; getParams (&finalDistFac, &finalRotAng, &thickness); float forwardProgress; if (zoomToIcon ()) getZoomProgress (&forwardProgress, 0, true); else forwardProgress = getProgress (); float finalz = finalDistFac * 0.8 * DEFAULT_Z_CAMERA * ::screen->width (); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); GLVector rotAxis (1, 0, 0, 0); GLVector rotAxisOffset (outRect.x () + outRect.width () / 2.0f, outRect.y () + outRect.height () / 2.0f, 0, 0); GLVector translation (0, 0, finalz * forwardProgress, 0); float rotAngle = finalRotAng * forwardProgress; glideModRotAngle = fmodf (rotAngle + 720, 360.0f); // put back to window position mTransform.translate (rotAxisOffset); perspectiveDistortAndResetZ (mTransform); // animation movement mTransform.translate (translation); // animation rotation mTransform.rotate (rotAngle, rotAxis); // intentional scaling of z by 0 to prevent weird opacity results and // flashing that happen when z coords are between 0 and 1 (bug in compiz?) mTransform.scale (1.0f, 1.0f, 0.0f); // place window rotation axis at origin mTransform.translate (-rotAxisOffset); } void GlideAnim::adjustDuration () { if (zoomToIcon ()) { mTotalTime *= kDurationFactor; mRemainingTime = mTotalTime; } } void GlideAnim::prePaintWindow () { if (90 < glideModRotAngle && glideModRotAngle < 270) glCullFace (GL_FRONT); } void GlideAnim::postPaintWindow () { if (90 < glideModRotAngle && glideModRotAngle < 270) glCullFace (GL_BACK); } bool GlideAnim::zoomToIcon () { return ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValB (AnimationOptions::Glide1ZoomToTaskbar)); } bool Glide2Anim::zoomToIcon () { return ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValB (AnimationOptions::Glide2ZoomToTaskbar)); } compiz-0.9.11+14.04.20140409/plugins/animation/src/dodge.cpp0000644000015301777760000006113612321343002023516 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * dodge.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Dodge ========================= void DodgeAnim::applyDodgeTransform () { if (mDodgeData->isDodgeSubject && mDodgeDirection == DodgeDirectionNone) return; float amountX = 0.0f; float amountY = 0.0f; if (mDodgeMaxAmountX != 0) amountX = sin (M_PI * mTransformProgress) * mDodgeMaxAmountX; if (mDodgeMaxAmountY != 0) amountY = sin (M_PI * mTransformProgress) * mDodgeMaxAmountY; mTransform.translate (amountX, amountY, 0.0f); } bool DodgeAnim::moveUpdate (int dx, int dy) { if (mDodgeData->isDodgeSubject && mDodgeDirection == DodgeDirectionXY) { mDodgeDirection = DodgeDirectionNone; mDodgeMaxAmountX = 0; mDodgeMaxAmountY = 0; } CompWindow *wBottommost = ExtensionPluginAnimation::getBottommostInRestackChain (mWindow); // Update dodge amount for the dodgers of all subjects // in the restack chain RestackPersistentData *dataCur; for (CompWindow *wCur = wBottommost; wCur; wCur = dataCur->mMoreToBePaintedNext) { AnimWindow *awCur = AnimWindow::get (wCur); dataCur = static_cast (awCur->persistentData["restack"]); if (!dataCur) break; Animation *curAnim = awCur->curAnimation (); if (!curAnim || curAnim->info () != AnimEffectDodge) continue; DodgePersistentData *dodgeDataDodger; // Update dodge amount for each dodger for (CompWindow *dw = mDodgeData->dodgeChainStart; dw; dw = dodgeDataDodger->dodgeChainNext) { AnimWindow *adw = AnimWindow::get (dw); dodgeDataDodger = static_cast (adw->persistentData["dodge"]); DodgeAnim *animDodger = dynamic_cast (adw->curAnimation ()); if (!animDodger) continue; if (animDodger->mDodgeSubjectWin && animDodger->mTransformProgress <= 0.5f) animDodger->updateDodgerDodgeAmount (); } } return false; } /// Should only be called for non-subjects. void DodgeAnim::updateDodgerDodgeAmount () { // Find the box to be dodged, it can contain multiple windows // when there are dialog/utility windows of subject windows // (stacked in the mMoreToBePaintedNext chain). // Then this would be a bounding box of the subject windows // intersecting with dodger. CompRect subjectRect (unionRestackChain (mDodgeSubjectWin).boundingRect ()); // Update dodge amount if subject window(s) moved during dodge float newDodgeAmount = getDodgeAmount (subjectRect, mWindow, mDodgeDirection); // Only update if amount got larger if (((mDodgeDirection == DodgeDirectionDown && newDodgeAmount > 0) || (mDodgeDirection == DodgeDirectionUp && newDodgeAmount < 0)) && abs (newDodgeAmount) > abs (mDodgeMaxAmountY)) mDodgeMaxAmountY = newDodgeAmount; else if (((mDodgeDirection == DodgeDirectionRight && newDodgeAmount > 0) || (mDodgeDirection == DodgeDirectionLeft && newDodgeAmount < 0)) && abs (newDodgeAmount) > abs (mDodgeMaxAmountX)) mDodgeMaxAmountX = newDodgeAmount; } float DodgeAnim::dodgeProgress () { float forwardProgress = progressLinear (); forwardProgress = 1 - forwardProgress; return forwardProgress; } void DodgeAnim::step () { TransformAnim::step (); mTransformProgress = 0; float forwardProgress = dodgeProgress (); if (forwardProgress > mTransformStartProgress) { // Compute transform progress and normalize mTransformProgress = (forwardProgress - mTransformStartProgress) / (1 - mTransformStartProgress); } mTransform.reset (); applyDodgeTransform (); } void DodgeAnim::updateTransform (GLMatrix &wTransform) { TransformAnim::updateTransform (wTransform); } void DodgeAnim::postPreparePaint () { // Only dodge subjects (with dodger chains) should be processed here if (!mDodgeData || !mDodgeData->isDodgeSubject || !mDodgeData->dodgeChainStart || !mRestackData || !mRestackData->restackInfo () || mDodgeData->skipPostPrepareScreen) return; // Find the bottommost subject in restack chain CompWindow *wBottommost = mWindow; RestackPersistentData *dataCur; for (CompWindow *wCur = mRestackData->mMoreToBePaintedPrev; wCur; wCur = dataCur->mMoreToBePaintedPrev) { wBottommost = wCur; dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; } AnimWindow *awBottommost = AnimWindow::get (wBottommost); RestackPersistentData *restackDataBottommost = static_cast (awBottommost->persistentData["restack"]); // Find the first dodging window that hasn't yet // reached 50% progress yet. The subject window should be // painted right behind that one (or right in front of it // if subject is being lowered). RestackPersistentData *restackDataDodger = NULL; DodgePersistentData *dodgeDataDodger = NULL; CompWindow *dw; for (dw = mDodgeData->dodgeChainStart; dw; dw = dodgeDataDodger->dodgeChainNext) { AnimWindow *adw = AnimWindow::get (dw); restackDataDodger = static_cast (adw->persistentData["restack"]); dodgeDataDodger = static_cast (adw->persistentData["dodge"]); DodgeAnim *animDodger = dynamic_cast (adw->curAnimation ()); if (!(animDodger->mTransformProgress > 0.5f)) break; } RestackInfo *bottommostRestackInfo = restackDataBottommost->restackInfo (); if (!bottommostRestackInfo) return; if (bottommostRestackInfo->raised && // if mWindow's host should change dw != restackDataBottommost->mWinThisIsPaintedBefore) { if (restackDataBottommost->mWinThisIsPaintedBefore) { // Clear old host RestackPersistentData *dataOldHost = static_cast (AnimWindow::get (restackDataBottommost-> mWinThisIsPaintedBefore)-> persistentData["restack"]); dataOldHost->mWinToBePaintedBeforeThis = 0; } // if a dodger win. is still at <0.5 progress if (dw && restackDataDodger) // Put subject right behind new host restackDataDodger->mWinToBePaintedBeforeThis = wBottommost; // otherwise all dodger win.s have passed 0.5 progress CompWindow *wCur = wBottommost; while (wCur) { RestackPersistentData *dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); // dw can be null, which is ok dataCur->mWinThisIsPaintedBefore = dw; wCur = dataCur->mMoreToBePaintedNext; } } else if (!bottommostRestackInfo->raised) { // Put the subject right in front of dw. // But we need to find the (dodger) window above dw // (since we need to put the subject *behind* a window). CompWindow *wDodgeChainAbove = 0; // if a dodger win. is still at <0.5 progress if (dw && dodgeDataDodger) { if (dodgeDataDodger->dodgeChainPrev) wDodgeChainAbove = dodgeDataDodger->dodgeChainPrev; else // Use the wOldAbove of topmost subject wDodgeChainAbove = mRestackData->restackInfo ()->wOldAbove; if (!wDodgeChainAbove) compLogMessage ("animation", CompLogLevelError, "%s: error at line %d", __FILE__, __LINE__); else if (restackDataBottommost->mWinThisIsPaintedBefore != wDodgeChainAbove) // w's host is changing { RestackPersistentData *dataNewHost = static_cast (AnimWindow::get (wDodgeChainAbove)-> persistentData["restack"]); // Put subject right behind new host dataNewHost->mWinToBePaintedBeforeThis = wBottommost; } } if (restackDataBottommost->mWinThisIsPaintedBefore && restackDataBottommost->mWinThisIsPaintedBefore != wDodgeChainAbove) { // Clear old host RestackPersistentData *dataOldHost = static_cast (AnimWindow::get (restackDataBottommost-> mWinThisIsPaintedBefore)-> persistentData["restack"]); dataOldHost->mWinToBePaintedBeforeThis = 0; } // otherwise all dodger win.s have passed 0.5 progress CompWindow *wCur = wBottommost; while (wCur) { RestackPersistentData *dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); // wDodgeChainAbove can be null, which is ok dataCur->mWinThisIsPaintedBefore = wDodgeChainAbove; wCur = dataCur->mMoreToBePaintedNext; } } } bool DodgeAnim::shouldDamageWindowOnStart () { // for dodging windows only, when subject is fixed return !(mDodgeMode == AnimationOptions::DodgeModeFixedClickedWindow && mDodgeData->isDodgeSubject); } void DodgeAnim::updateBB (CompOutput &output) { TransformAnim::updateBB (output); } DodgeAnim::DodgeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), RestackAnim::RestackAnim (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), mDodgeData (static_cast (AnimWindow::get (w)->persistentData["dodge"])), mDodgeSubjectWin (0), mDodgeMaxAmountX (0), mDodgeMaxAmountY (0), mDodgeDirection (DodgeDirectionNone), mDodgeMode (optValI (AnimationOptions::DodgeMode)) { } void DodgeAnim::cleanUp (bool closing, bool destructing) { // Remove this window from its subject's dodger chain if (mDodgeSubjectWin) { CompWindow *w = mDodgeSubjectWin; AnimWindow *aw = AnimWindow::get (w); Animation *curAnim = aw->curAnimation (); DodgePersistentData *dodgeData = static_cast (aw->persistentData["dodge"]); if (curAnim && curAnim->info () == AnimEffectDodge && // Only process subjects with a dodge chain dodgeData && dodgeData->dodgeChainStart && dodgeData->isDodgeSubject) { // Go through each dodger, checking if this is that one // dw: Dodger window DodgePersistentData *dodgeDataDodger; for (CompWindow *dw = dodgeData->dodgeChainStart; dw; dw = dodgeDataDodger->dodgeChainNext) { AnimWindow *adw = AnimWindow::get (dw); dodgeDataDodger = static_cast (adw->persistentData["dodge"]); if (dw == mWindow) { // Remove mWindow from the chain CompWindow *dwNext = dodgeDataDodger->dodgeChainNext; if (dwNext) { AnimWindow *adwNext = AnimWindow::get (dwNext); DodgePersistentData *dodgeDataDodgerNext = static_cast (adwNext->persistentData["dodge"]); dodgeDataDodgerNext->dodgeChainPrev = dodgeDataDodger->dodgeChainPrev; } CompWindow *dwPrev = dodgeDataDodger->dodgeChainPrev; if (dwPrev) { AnimWindow *adwPrev = AnimWindow::get (dwPrev); DodgePersistentData *dodgeDataDodgerPrev = static_cast (adwPrev->persistentData["dodge"]); dodgeDataDodgerPrev->dodgeChainNext = dodgeDataDodger->dodgeChainNext; } if (dodgeData->dodgeChainStart == mWindow) dodgeData->dodgeChainStart = dodgeDataDodger->dodgeChainNext; dodgeDataDodger->dodgeChainPrev = 0; dodgeDataDodger->dodgeChainNext = 0; } } } } else { DodgePersistentData *dodgeData = static_cast (mAWindow->persistentData["dodge"]); if (dodgeData && dodgeData->isDodgeSubject) { // Update this window's dodgers so that they no longer point // to this window as their subject DodgePersistentData *dodgeDataDodger; for (CompWindow *dw = dodgeData->dodgeChainStart; dw; dw = dodgeDataDodger->dodgeChainNext) { AnimWindow *adw = AnimWindow::get (dw); if (!adw) break; dodgeDataDodger = static_cast (adw->persistentData["dodge"]); Animation *curAnim = adw->curAnimation (); if (curAnim && curAnim->info () == AnimEffectDodge) { DodgeAnim *animDodger = dynamic_cast (curAnim); if (animDodger->mDodgeSubjectWin == mWindow) animDodger->mDodgeSubjectWin = NULL; } } } } // Reset dodge parameters //if (!(restackData->mMoreToBePaintedPrev || // restackData->mMoreToBePaintedNext)) //{ mDodgeData->isDodgeSubject = false; mDodgeData->skipPostPrepareScreen = false; //} RestackAnim::cleanUp (closing, destructing); } int DodgeAnim::getDodgeAmount (CompRect &rect, CompWindow *dw, DodgeDirection dir) { CompRect dRect (dw->borderRect ().x () + (dw->outputRect ().x () - dw->borderRect ().x ()) / 2, dw->borderRect ().y () + (dw->outputRect ().y () - dw->borderRect ().y ()) / 2, (dw->borderRect ().width () + dw->outputRect ().width ()) / 2, (dw->borderRect ().height () + dw->outputRect ().height ()) / 2); int amount = 0; switch (dir) { case DodgeDirectionUp: amount = (rect.y () - (dRect.y () + dRect.height ())); break; case DodgeDirectionDown: amount = (rect.y () + rect.height () - dRect.y ()); break; case DodgeDirectionLeft: amount = (rect.x () - (dRect.x () + dRect.width ())); break; case DodgeDirectionRight: amount = (rect.x () + rect.width () - dRect.x ()); break; default: break; } return amount; } void DodgeAnim::processCandidate (CompWindow *candidateWin, CompWindow *subjectWin, CompRegion &candidateAndSubjectIntersection, int &numSelectedCandidates) { AnimWindow *aCandidateWin = AnimWindow::get (candidateWin); AnimScreen *as = AnimScreen::get (::screen); if ((!aCandidateWin->curAnimation () || aCandidateWin->curAnimation ()->info () == AnimEffectDodge) && candidateWin != subjectWin) // don't let the subject dodge itself { // Mark this window for dodge bool nonMatching = false; if (as->getMatchingAnimSelection (candidateWin, AnimEventFocus, 0) != AnimEffectDodge) nonMatching = true; ++numSelectedCandidates; DodgePersistentData *data = static_cast (aCandidateWin->persistentData["dodge"]); data->dodgeOrder = numSelectedCandidates; if (nonMatching) // Use neg. values for non-matching windows data->dodgeOrder *= -1; } } void DodgeAnim::postInitiateRestackAnim (int numSelectedCandidates, int duration, CompWindow *wStart, CompWindow *wEnd, bool raised) { DodgePersistentData *dataSubject = mDodgeData; if (!dataSubject) return; dataSubject->isDodgeSubject = true; dataSubject->dodgeChainStart = 0; if (mRestackData && mRestackData->mIsSecondary) return; // We're done here float maxTransformTotalProgress = 0; float dodgeMaxStartProgress = numSelectedCandidates * optValF (AnimationOptions::DodgeGapRatio) * duration / 1000.0f; CompWindow *wDodgeChainLastVisited = 0; // dw: Dodger window(s) for (CompWindow *dw = wStart; dw && dw != wEnd->next; dw = dw->next) { AnimWindow *adw = AnimWindow::get (dw); DodgePersistentData *dataDodger = static_cast (adw->persistentData["dodge"]); // Skip non-dodgers if (dataDodger->dodgeOrder == 0) continue; // Initiate dodge for this window bool stationaryDodger = false; if (dataDodger->dodgeOrder < 0) { dataDodger->dodgeOrder *= -1; // Make it positive again stationaryDodger = true; } if (!adw->curAnimation ()) { // Create dodge animation for dodger adw->createFocusAnimation (AnimEffectDodge); ExtensionPluginAnimation *extPlugin = static_cast (getExtensionPluginInfo ()); extPlugin->incrementCurRestackAnimCount (); } DodgeAnim *animDodger = dynamic_cast (adw->curAnimation ()); animDodger->mDodgeSubjectWin = mWindow; if (mDodgeMode == AnimationOptions::DodgeModeFixedClickedWindow) { // Slight change in dodge movement start // to reflect stacking order of dodger windows if (raised) animDodger->mTransformStartProgress = dodgeMaxStartProgress * (dataDodger->dodgeOrder - 1) / numSelectedCandidates; else animDodger->mTransformStartProgress = dodgeMaxStartProgress * (1 - (float)dataDodger->dodgeOrder / numSelectedCandidates); } float transformTotalProgress = 1 + animDodger->mTransformStartProgress; if (maxTransformTotalProgress < transformTotalProgress) maxTransformTotalProgress = transformTotalProgress; // normalize animDodger->mTransformStartProgress /= transformTotalProgress; if (stationaryDodger) { animDodger->mTransformStartProgress = 0; transformTotalProgress = 0; } animDodger->mTotalTime = transformTotalProgress * duration; animDodger->mRemainingTime = animDodger->mTotalTime; // Put window on dodge chain // if dodge chain was started before if (wDodgeChainLastVisited) { DodgePersistentData *dataDodgeChainLastVisited = static_cast (AnimWindow::get (wDodgeChainLastVisited)-> persistentData["dodge"]); if (raised) dataDodgeChainLastVisited->dodgeChainNext = dw; else dataDodgeChainLastVisited->dodgeChainPrev = dw; } else if (raised) // mark chain start dataSubject->dodgeChainStart = dw; if (raised) { dataDodger->dodgeChainPrev = wDodgeChainLastVisited; dataDodger->dodgeChainNext = 0; } else { dataDodger->dodgeChainPrev = 0; dataDodger->dodgeChainNext = wDodgeChainLastVisited; } wDodgeChainLastVisited = dw; // Reset back to 0 for the next dodge calculation dataDodger->dodgeOrder = 0; } // if subject is being lowered, // point chain-start to the topmost doding window if (!raised) dataSubject->dodgeChainStart = wDodgeChainLastVisited; mTotalTime = maxTransformTotalProgress * duration; mRemainingTime = mTotalTime; } void DodgeAnim::calculateDodgeAmounts () { // holds whether each side of the subject is covered by dodgers or not bool coveredSides[4] = {false, false, false, false}; // maximum distance between a dodger window and the subject in X and Y axes int maxDistX = 0; int maxDistXActual = 0; int maxDistY = 0; int maxDistYActual = 0; CompRect subjectRect (unionRestackChain (mWindow).boundingRect ()); // Go through each dodger, calculating its dodge amount. // dw: Dodger window DodgePersistentData *dodgeDataDodger; for (CompWindow *dw = mDodgeData->dodgeChainStart; dw; dw = dodgeDataDodger->dodgeChainNext) { AnimWindow *adw = AnimWindow::get (dw); dodgeDataDodger = static_cast (adw->persistentData["dodge"]); DodgeAnim *animDodger = dynamic_cast (adw->curAnimation ()); if (!animDodger) continue; // Find direction (left, right, up, down) that minimizes dodge amount int dodgeAmount[4]; for (int i = 0; i < 4; ++i) dodgeAmount[i] = DodgeAnim::getDodgeAmount (subjectRect, dw, (DodgeDirection)i); int amountMinActual = dodgeAmount[0]; int amountMinAbs = abs (amountMinActual); int iMin = 0; for (int i = 1; i < 4; ++i) { int absAmount = abs (dodgeAmount[i]); if (amountMinAbs > absAmount) { amountMinAbs = absAmount; amountMinActual = dodgeAmount[i]; iMin = i; } } if (iMin == DodgeDirectionUp || iMin == DodgeDirectionDown) { animDodger->mDodgeMaxAmountX = 0; animDodger->mDodgeMaxAmountY = dodgeAmount[iMin]; if (mDodgeMode == AnimationOptions::DodgeModeAllMoving && maxDistY < amountMinAbs) { maxDistY = amountMinAbs; maxDistYActual = amountMinActual; } } else { animDodger->mDodgeMaxAmountX = dodgeAmount[iMin]; animDodger->mDodgeMaxAmountY = 0; if (mDodgeMode == AnimationOptions::DodgeModeAllMoving && maxDistX < amountMinAbs) { maxDistX = amountMinAbs; maxDistXActual = amountMinActual; } } animDodger->mDodgeDirection = (DodgeDirection)iMin; coveredSides[iMin] = true; } if (mDodgeMode == AnimationOptions::DodgeModeFixedClickedWindow) { // Subject doesn't move mDodgeMaxAmountX = 0; mDodgeMaxAmountY = 0; mDodgeDirection = DodgeDirectionNone; } else { // Subject should dodge in an axis if only one side is // covered by a dodger. bool subjectDodgesInX = (coveredSides[DodgeDirectionLeft] ^ coveredSides[DodgeDirectionRight]); bool subjectDodgesInY = (coveredSides[DodgeDirectionUp] ^ coveredSides[DodgeDirectionDown]); float dodgeAmountX = subjectDodgesInX ? -maxDistXActual / 2 : 0; float dodgeAmountY = subjectDodgesInY ? -maxDistYActual / 2 : 0; DodgeDirection dodgeDirection; if (!subjectDodgesInX && !subjectDodgesInY) dodgeDirection = DodgeDirectionNone; else dodgeDirection = DodgeDirectionXY; CompWindow *wBottommost = ExtensionPluginAnimation::getBottommostInRestackChain (mWindow); float offsetX = 0; float offsetY = 0; float offsetIncrementX = (dodgeAmountX == 0 ? 0 : 100 * dodgeAmountX / fabs (dodgeAmountX)); float offsetIncrementY = (dodgeAmountY == 0 ? 0 : 100 * dodgeAmountY / fabs (dodgeAmountY)); // Set dodge amount and direction for all subjects // in the restack chain RestackPersistentData *dataCur; for (CompWindow *wCur = wBottommost; wCur; wCur = dataCur->mMoreToBePaintedNext, offsetX += offsetIncrementX, offsetY += offsetIncrementY) { AnimWindow *awCur = AnimWindow::get (wCur); dataCur = static_cast (awCur->persistentData["restack"]); if (!dataCur) break; Animation *curAnim = awCur->curAnimation (); if (!curAnim || curAnim->info () != AnimEffectDodge) continue; DodgeAnim *dodgeAnim = dynamic_cast (curAnim); dodgeAnim->mDodgeMaxAmountX = dodgeAmountX + offsetX; dodgeAnim->mDodgeMaxAmountY = dodgeAmountY + offsetY; dodgeAnim->mDodgeDirection = dodgeDirection; dodgeAnim->mTransformStartProgress = 0; } if (dodgeDirection == DodgeDirectionXY) { // Go through each dodger, adjusting its dodge amount if the // subject(s) is dodging in that axis (X or Y). // dw: Dodger window DodgePersistentData *dodgeDataDodger; for (CompWindow *dw = mDodgeData->dodgeChainStart; dw; dw = dodgeDataDodger->dodgeChainNext) { AnimWindow *adw = AnimWindow::get (dw); dodgeDataDodger = static_cast (adw->persistentData["dodge"]); DodgeAnim *animDodger = dynamic_cast (adw->curAnimation ()); if (!animDodger) continue; // if both dodge in X axis if (subjectDodgesInX && animDodger->mDodgeMaxAmountX != 0) { if (animDodger->mDodgeMaxAmountX * (animDodger->mDodgeMaxAmountX + dodgeAmountX) < 0) // If the sign is going to change, just reset instead animDodger->mDodgeMaxAmountX = 0; else animDodger->mDodgeMaxAmountX += dodgeAmountX; } // if both dodge in Y axis if (subjectDodgesInY && animDodger->mDodgeMaxAmountY != 0) { if (animDodger->mDodgeMaxAmountY * (animDodger->mDodgeMaxAmountY + dodgeAmountY) < 0) { // If the sign is going to change, just reset instead animDodger->mDodgeMaxAmountY = 0; } else animDodger->mDodgeMaxAmountY += dodgeAmountY; } } } } } bool DodgeAnim::paintedElsewhere () { bool elsewhere = mRestackData && mRestackData->mWinThisIsPaintedBefore && // has to be currently hosted mDodgeData && mDodgeData->isDodgeSubject && overNewCopy (); return elsewhere; } DodgePersistentData::DodgePersistentData () : dodgeOrder (0), isDodgeSubject (false), skipPostPrepareScreen (false), dodgeChainStart (0), dodgeChainPrev (0), dodgeChainNext (0) { } compiz-0.9.11+14.04.20140409/plugins/animation/src/curvedfold.cpp0000644000015301777760000001575612321343002024600 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * curvedfold.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Curved Fold ========================= FoldAnim::FoldAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridZoomAnim::GridZoomAnim (w, curWindowEvent, duration, info, icon) { } float FoldAnim::getFadeProgress () { // if shade/unshade, don't do anything if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) return 0; if (zoomToIcon ()) return ZoomAnim::getFadeProgress (); return progressLinear (); } CurvedFoldAnim::CurvedFoldAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), FoldAnim::FoldAnim (w, curWindowEvent, duration, info, icon) { } void CurvedFoldAnim::initGrid () { mGridWidth = 2; mGridHeight = optValI (AnimationOptions::MagicLampWavyGridRes); // TODO new option } float CurvedFoldAnim::getObjectZ (GridAnim::GridModel *mModel, float forwardProgress, float sinForProg, float relDistToCenter, float curveMaxAmp) { return -(sinForProg * (1 - pow (pow (2 * relDistToCenter, 1.3), 2)) * curveMaxAmp * mModel->scale ().x ()); } void CurvedFoldAnim::step () { GridZoomAnim::step (); float forwardProgress = getActualProgress (); CompRect winRect (mAWindow->savedRectsValid () ? mAWindow->saveWinRect () : mWindow->geometry ()); CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); int wx = winRect.x (); int wy = winRect.y (); int wheight = winRect.height (); int oy = outRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); float curveMaxAmp = (0.4 * pow ((float)oheight / ::screen->height (), 0.4) * optValF (AnimationOptions::CurvedFoldAmpMult)); float sinForProg = sin (forwardProgress * M_PI / 2); GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i, ++object) { Point3d &objPos = object->position (); if (i % 2 == 0) // object is at the left side { float objGridY = object->gridPosition ().y (); float origy = (wy + (oheight * objGridY - outExtents.top) * mModel->scale ().y ()); if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) { // Execute shade mode // find position in window contents // (window contents correspond to 0.0-1.0 range) float relPosInWinContents = (objGridY * oheight - mDecorTopHeight) / wheight; float relDistToCenter = fabs (relPosInWinContents - 0.5); if (objGridY == 0) { objPos.setY (oy); objPos.setZ (0); } else if (objGridY == 1) { objPos.setY ( (1 - forwardProgress) * origy + forwardProgress * (oy + mDecorTopHeight + mDecorBottomHeight)); objPos.setZ (0); } else { objPos.setY ( (1 - forwardProgress) * origy + forwardProgress * (oy + mDecorTopHeight)); objPos.setZ ( getObjectZ (mModel, forwardProgress, sinForProg, relDistToCenter, curveMaxAmp)); } } else { // Execute normal mode // find position within window borders // (border contents correspond to 0.0-1.0 range) float relPosInWinBorders = (objGridY * oheight - (inRect.y () - oy)) / inRect.height (); float relDistToCenter = fabs (relPosInWinBorders - 0.5); // prevent top & bottom shadows from extending too much if (relDistToCenter > 0.5) relDistToCenter = 0.5; objPos.setY ( (1 - forwardProgress) * origy + forwardProgress * (inRect.y () + inRect.height () / 2.0)); objPos.setZ ( getObjectZ (mModel, forwardProgress, sinForProg, relDistToCenter, curveMaxAmp)); } } else // object is at the right side { // Set y/z position to the y/z position of the object at the left // on the same row (previous object) Point3d &leftObjPos = (object - 1)->position (); objPos.setY (leftObjPos.y ()); objPos.setZ (leftObjPos.z ()); } float origx = (wx + (owidth * object->gridPosition ().x () - outExtents.left) * mModel->scale ().x ()); objPos.setX (origx); } } void CurvedFoldAnim::updateBB (CompOutput &output) { if (optValF (AnimationOptions::CurvedFoldAmpMult) < 0) // if outward { GridZoomAnim::updateBB (output); // goes through all objects return; } // Just consider the corner objects GridModel::GridObject *objects = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i) { Point3d &pos = objects[i].position (); GLVector coords (pos.x (), pos.y (), 0, 1); mAWindow->expandBBWithPoint2DTransform (coords, mTransform); if (i == 1) { // skip to the last row after considering the first row // (each row has 2 objects) i = n - 3; } } } bool CurvedFoldAnim::zoomToIcon () { return ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValB (AnimationOptions::CurvedFoldZoomToTaskbar)); } compiz-0.9.11+14.04.20140409/plugins/animation/src/focusfade.cpp0000644000015301777760000001043212321343002024364 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * focusfade.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Focus Fade ========================= FocusFadeAnim::FocusFadeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), RestackAnim::RestackAnim (w, curWindowEvent, duration, info, icon), FadeAnim::FadeAnim (w, curWindowEvent, duration, info, icon) { } /// Compute the cross-fade opacity to make the effect look good with every /// window opacity value. GLushort FocusFadeAnim::computeOpacity (GLushort opacityInt) { float progress = 1 - progressLinear (); float opacity = opacityInt / (float)OPAQUE; float multiplier; bool newCopy = overNewCopy (); // flip opacity behavior for the other side of the cross-fade if (newCopy) progress = 1 - progress; if (mWindow->alpha () || (newCopy && opacity >= 0.91f)) multiplier = progressDecelerate (progress); else if (opacity > 0.94f) multiplier = progressDecelerateCustom (progress, 0.55, 1.32); else if (opacity >= 0.91f && opacity < 0.94f) multiplier = progressDecelerateCustom (progress, 0.62, 0.92); else if (opacity >= 0.89f && opacity < 0.91f) multiplier = progressDecelerate (progress); else if (opacity >= 0.84f && opacity < 0.89f) multiplier = progressDecelerateCustom (progress, 0.64, 0.80); else if (opacity >= 0.79f && opacity < 0.84f) multiplier = progressDecelerateCustom (progress, 0.67, 0.77); else if (opacity >= 0.54f && opacity < 0.79f) multiplier = progressDecelerateCustom (progress, 0.61, 0.69); else multiplier = progress; multiplier = 1 - multiplier; float finalOpacity = opacity * multiplier; finalOpacity = MIN (finalOpacity, 1); finalOpacity = MAX (finalOpacity, 0); return (GLushort)(finalOpacity * OPAQUE); } void FocusFadeAnim::updateAttrib (GLWindowPaintAttrib &attrib) { attrib.opacity = computeOpacity (attrib.opacity); } void FocusFadeAnim::processCandidate (CompWindow *candidateWin, CompWindow *subjectWin, CompRegion &candidateAndSubjectIntersection, int &numSelectedCandidates) { AnimWindow *aCandidateWin = AnimWindow::get (candidateWin); RestackPersistentData *data = static_cast (aCandidateWin->persistentData["restack"]); data->mWinPassingThrough = subjectWin; } void FocusFadeAnim::cleanUp (bool closing, bool destructing) { // Clear winPassingThrough of each window // that this one was passing through // during focus effect. foreach (CompWindow *w, ::screen->windows ()) { AnimWindow *aw = AnimWindow::get (w); PersistentDataMap::iterator itData = aw->persistentData.find ("restack"); if (itData != aw->persistentData.end ()) // if found { RestackPersistentData *data = static_cast (itData->second); if (data->mWinPassingThrough == mWindow) data->mWinPassingThrough = 0; } } RestackAnim::cleanUp (closing, destructing); } compiz-0.9.11+14.04.20140409/plugins/animation/include/0000755000015301777760000000000012321344021022557 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/animation/include/.directory0000644000015301777760000000006712321343002024565 0ustar pbusernogroup00000000000000[Dolphin] ShowPreview=true Timestamp=2010,8,12,5,55,57 compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/0000755000015301777760000000000012321344021024536 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/persistent.h0000644000015301777760000000046012321343002027105 0ustar pbusernogroup00000000000000#ifndef ANIMATION_PERSISTENT_H #define ANIMATION_PERSISTENT_H #include "animation.h" class PersistentData { }; typedef std::map PersistentDataMap; class MultiPersistentData : public PersistentData { public: MultiPersistentData () : num (0) {} int num; }; #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/multi.h0000644000015301777760000002141212321343002026037 0ustar pbusernogroup00000000000000#ifndef ANIMATION_MULTI_H #define ANIMATION_MULTI_H #include "animation.h" /// Special class, allows multiple copies of an animation to happen /// at any one time. Create your "single copy" animation class first /// and then create a new animation which derives from this template /// class. Each function of your animation will be called since this /// class overloads everything in Animation. You will have /// access to which number effect is happening. (I think) template class MultiAnim : public Animation { public: static inline int getCurrAnimNumber (AnimWindow *aw) { MultiPersistentData *pd = static_cast (aw->persistentData["multi"]); if (!pd) { pd = new MultiPersistentData (); aw->persistentData["multi"] = pd; } if (!pd) return 0; return pd->num; } static inline void setCurrAnimNumber (AnimWindow *aw, int what) { MultiPersistentData *pd = static_cast (aw->persistentData["multi"]); if (!pd) pd = new MultiPersistentData (); if (!pd) return; pd->num = what; } public: MultiAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation (w, curWindowEvent, duration, info, icon), currentAnim (0) { for (unsigned int i = 0; i < num; ++i) animList.push_back (new SingleAnim (w, curWindowEvent, duration, info, icon)); mGlPaintAttribs.resize (num); mGlPaintTransforms.resize (num); } virtual ~MultiAnim () {} public: /// Overload everything /// Needed since virtual method calls can't be done in the constructor. void init () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->init (); } } /// To be called during post-animation clean up. void cleanUp (bool closing, bool destructing) { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->cleanUp (closing, destructing); delete a; } animList.clear (); } /// Returns true if frame should be skipped (e.g. due to /// higher timestep values). In that case no drawing is /// needed for that window in current frame. bool shouldSkipFrame (int msSinceLastPaintActual) { int count = 0; bool skip = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; skip |= a->shouldSkipFrame (msSinceLastPaintActual); } return skip; } /// Advances the animation time by the given time amount. /// Returns true if more animation time is left. bool advanceTime (int msSinceLastPaint) { int count = 0; bool advance = false; advance |= Animation::advanceTime (msSinceLastPaint); foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; advance |= a->advanceTime (msSinceLastPaint); } return advance; } /// Computes new animation state based on remaining time. void step () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->step (); } } void updateAttrib (GLWindowPaintAttrib &attrib) { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); GLWindowPaintAttrib attr (attrib); a->updateAttrib (attr); mGlPaintAttribs.at (count) = attr; ++count; } } void updateTransform (GLMatrix &transform) { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); GLMatrix mat (transform); a->updateTransform (mat); mGlPaintTransforms.at (count) = mat; ++count; } } void prePaintWindow () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->prePaintWindow (); } } void postPaintWindow () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->postPaintWindow (); } } bool postPaintWindowUsed () { int count = 0; bool used = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; used |= a->postPaintWindowUsed (); } return used; } /// Returns true if the animation is still in progress. bool prePreparePaint (int msSinceLastPaint) { int count = 0; bool inProgress = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; inProgress |= a->prePreparePaint (msSinceLastPaint); } return inProgress; } void postPreparePaint () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->postPreparePaint (); } } /// Updates the bounding box of damaged region. Should be implemented for /// any animation that doesn't update the whole screen. // NB!! void updateBB (CompOutput &out) { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->updateBB (out); } } bool updateBBUsed () { int count = 0; bool used = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; used |= a->updateBBUsed (); } return used; } /// Should return true for effects that make use of a region /// instead of just a bounding box for damaged area-> bool stepRegionUsed () { int count = 0; bool used = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; used |= a->stepRegionUsed (); } return used; } bool shouldDamageWindowOnStart () { int count = 0; bool should = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; should |= a->shouldDamageWindowOnStart (); } return should; } bool shouldDamageWindowOnEnd () { int count = 0; bool should = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; should |= a->shouldDamageWindowOnStart (); } return should; } /// Should return false if the animation should be stopped on move bool moveUpdate (int dx, int dy) { int count = 0; bool update = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; update |= a->moveUpdate (dx, dy); } return update; } /// Should return false if the animation should be stopped on resize bool resizeUpdate (int dx, int dy, int dwidth, int dheight) { int count = 0; bool update = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; update |= a->resizeUpdate (dx, dy, dwidth, dheight); } return update; } void adjustPointerIconSize () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->adjustPointerIconSize (); } } void addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { setCurrAnimNumber (mAWindow, currentAnim); animList.at (currentAnim)->addGeometry (matrix, region, clip, maxGridWidth, maxGridHeight); } void drawGeometry () { setCurrAnimNumber (mAWindow, currentAnim); animList.at (currentAnim)->drawGeometry (); } bool paintWindowUsed () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->paintWindowUsed (); } /* Always return true because we need to take over painting */ return true; } bool paintWindow (GLWindow *gWindow, const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { int count = 0; bool status = false; for (currentAnim = 0; currentAnim < animList.size (); currentAnim++) { GLWindowPaintAttrib wAttrib (mGlPaintAttribs.at (currentAnim)); GLMatrix wTransform (mGlPaintTransforms.at (currentAnim)); setCurrAnimNumber (mAWindow, count); ++count; if (animList.at (currentAnim)->paintWindowUsed ()) status |= animList.at (currentAnim)->paintWindow (gWindow, wAttrib, wTransform, region, mask); else status |= gWindow->glPaint (wAttrib, wTransform, region, mask); } return status; } private: std::vector mGlPaintAttribs; std::vector mGlPaintTransforms; std::vector animList; unsigned int currentAnim; }; #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/window.h0000644000015301777760000000457112321343002026223 0ustar pbusernogroup00000000000000#ifndef ANIMATION_WINDOW_H #define ANIMATION_WINDOW_H #include "animation.h" extern template class PluginClassHandler; class AnimWindow : public PluginClassHandler { friend class PrivateAnimScreen; friend class PrivateAnimWindow; friend class AnimScreen; friend class Animation; public: AnimWindow (CompWindow *); ~AnimWindow (); BoxPtr BB (); CompRegion &stepRegion (); void resetStepRegionWithBB (); void expandBBWithWindow (); void expandBBWithScreen (); void expandBBWithBox (Box &source); void expandBBWithPoint (float fx, float fy); void expandBBWithPoint2DTransform (GLVector &coords, GLMatrix &transformMat); bool expandBBWithPoints3DTransform (CompOutput &output, GLMatrix &transform, const float *points, GridAnim::GridModel::GridObject *objects, unsigned int nPoints); inline bool savedRectsValid () { return mSavedRectsValid; } inline const CompRect & saveWinRect () { return mSavedWinRect; } inline const CompRect & savedInRect () { return mSavedInRect; } inline const CompRect & savedOutRect () { return mSavedOutRect; } inline CompWindowExtents & savedOutExtents () { return mSavedOutExtents; } Animation *curAnimation (); void createFocusAnimation (AnimEffect effect, int duration = 0); void postAnimationCleanUp (); // TODO: Group persistent data for a plugin and allow a plugin to only // delete its own data. void deletePersistentData (const char *name); /// A "string -> persistent data" map for animations that require such data, /// like some focus animations. PersistentDataMap persistentData; CompWindow *mWindow; ///< Window being animated. // TODO move to private: private: PrivateAnimWindow *priv; bool mSavedRectsValid; CompRect mSavedWinRect; ///< Saved window contents geometry CompRect mSavedInRect; ///< Saved window input geometry CompRect mSavedOutRect; ///< Saved window output geometry CompWindowExtents mSavedOutExtents; ///< Saved window output extents CompOption::Value &pluginOptVal (ExtensionPluginInfo *pluginInfo, unsigned int optionId, Animation *anim); }; #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/partialwindow.h0000644000015301777760000000121612321343002027571 0ustar pbusernogroup00000000000000#ifndef ANIMATION_PARTIALWINDOW_H #define ANIMATION_PARTIALWINDOW_H #include "animation.h" class PartialWindowAnim : virtual public Animation { public: PartialWindowAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight); protected: bool mUseDrawRegion; CompRegion mDrawRegion; }; #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/animation.h0000644000015301777760000000307512321343002026671 0ustar pbusernogroup00000000000000#ifndef _ANIMATION_H #define _ANIMATION_H #define ANIMATION_ABI 20091205 #include #include typedef enum { WindowEventOpen = 0, WindowEventClose, WindowEventMinimize, WindowEventUnminimize, WindowEventShade, WindowEventUnshade, WindowEventFocus, WindowEventNum, WindowEventNone } WindowEvent; typedef enum { AnimEventOpen = 0, AnimEventClose, AnimEventMinimize, AnimEventUnminimize, AnimEventShade, AnimEventFocus, AnimEventNum } AnimEvent; typedef enum { AnimDirectionDown = 0, AnimDirectionUp, AnimDirectionLeft, AnimDirectionRight, AnimDirectionRandom, AnimDirectionAuto } AnimDirection; extern const unsigned short LAST_ANIM_DIRECTION; class PrivateAnimScreen; class PrivateAnimWindow; class Animation; class AnimWindow; class AnimEffectInfo; typedef AnimEffectInfo * AnimEffect; #define RAND_FLOAT() ((float)rand() / RAND_MAX) #define sigmoid(fx) (1.0f/(1.0f+exp(-5.0f*2*((fx)-0.5)))) #define sigmoid2(fx, s) (1.0f/(1.0f+exp(-(s)*2*((fx)-0.5)))) #define NUM_OPTIONS(s) (sizeof ((s)->opt) / sizeof (CompOption)) #include "extensionplugin.h" #include "animeffect.h" #include "point3d.h" #include "persistent.h" #include "grid.h" #include "screen.h" #include "window.h" #include "transform.h" #include "fade.h" #include "partialwindow.h" #include "gridtransform.h" #include "zoom.h" #include "multi.h" // ratio of perceived length of animation compared to real duration // to make it appear to have the same speed with other animation effects #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/zoom.h0000644000015301777760000000444012321343002025673 0ustar pbusernogroup00000000000000#ifndef ANIMATION_ZOOM_H #define ANIMATION_ZOOM_H #include "animation.h" class ZoomAnim : public FadeAnim, virtual public TransformAnim { public: ZoomAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); public: void step () { TransformAnim::step (); } void adjustDuration (); float getFadeProgress (); bool updateBBUsed () { return true; } void updateBB (CompOutput &output) { TransformAnim::updateBB (output); } void applyTransform (); protected: float getActualProgress (); Point getCenter (); virtual float getSpringiness (); virtual bool isZoomFromCenter (); virtual bool zoomToIcon () { return true; } virtual bool hasExtraTransform () { return false; } virtual void applyExtraTransform (float progress) {} virtual bool shouldAvoidParallelogramLook () { return false; } virtual bool scaleAroundIcon (); virtual bool neverSpringy () { return false; } void getZoomProgress (float *moveProgress, float *scaleProgress, bool neverSpringy); bool requiresTransformedWindow () const { return true; } static const float kDurationFactor; static const float kSpringyDurationFactor; static const float kNonspringyDurationFactor; private: void getCenterScaleFull (Point *pCurCenter, Point *pCurScale, Point *pWinCenter, Point *pIconCenter, float *pMoveProgress); void getCenterScale (Point *pCurCenter, Point *pCurScale); }; class GridZoomAnim : public GridTransformAnim, public ZoomAnim { public: GridZoomAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init () { GridTransformAnim::init (); } void step () { ZoomAnim::step (); } void updateTransform (GLMatrix &wTransform) { GridTransformAnim::updateTransform (wTransform); } void updateBB (CompOutput &output) { GridTransformAnim::updateBB (output); } bool updateBBUsed () { return true; } bool neverSpringy () { return true; } float getSpringiness () { return 0; } bool scaleAroundIcon () { return false; } void adjustDuration (); bool requiresTransformedWindow () const { return true; } }; #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/extensionplugin.h0000644000015301777760000000464412321343002030150 0ustar pbusernogroup00000000000000#ifndef ANIMATION_EXTENSIONPLUGIN_H #define ANIMATION_EXTENSIONPLUGIN_H #include "animation.h" class ExtensionPluginInfo { public: ExtensionPluginInfo (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex); virtual ~ExtensionPluginInfo () {} CompString name; unsigned int nEffects; AnimEffect *effects; /// Plugin options to be used in "effect options" strings. CompOption::Vector *effectOptions; /// Index of first effect option. unsigned int firstEffectOptionIndex; // More general and/or non-window functions (including functions that access // persistent animation data) to be overriden /// To be run at the beginning of glPaintOutput. virtual void prePaintOutput (CompOutput *output) {} /// To be run at the beginning of preparePaint. virtual void prePreparePaintGeneral () {} /// To be run at the end of preparePaint. virtual void postPreparePaintGeneral () {} /// To be run when a CompWindowNotifyRestack is handled. virtual void handleRestackNotify (AnimWindow *aw) {} /// To be run at the beginning of initiateOpenAnim. virtual void preInitiateOpenAnim (AnimWindow *aw) {} /// To be run at the beginning of initiateCloseAnim. virtual void preInitiateCloseAnim (AnimWindow *aw) {} /// To be run at the beginning of initiateMinimizeAnim. virtual void preInitiateMinimizeAnim (AnimWindow *aw) {} /// To be run at the beginning of initiateUnminimizeAnim. virtual void preInitiateUnminimizeAnim (AnimWindow *aw) {} /// Initializes plugin's persistent animation data for a window (if any). virtual void initPersistentData (AnimWindow *aw) {} /// Destroys plugin's persistent animation data for a window (if any). virtual void destroyPersistentData (AnimWindow *aw) {} /// To be run at the end of updateEventEffects. virtual void postUpdateEventEffects (AnimEvent e, bool forRandom) {} /// To be run after the startup countdown ends. virtual void postStartupCountdown () {} virtual bool paintShouldSkipWindow (CompWindow *w) { return false; } virtual void cleanUpAnimation (bool closing, bool destructing) {} virtual void processAllRestacks () {} }; #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/fade.h0000644000015301777760000000107512321343002025607 0ustar pbusernogroup00000000000000#ifndef ANIMATION_FADE_H #define ANIMATION_FADE_H #include "animation.h" class FadeAnim : virtual public Animation { public: FadeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); public: void updateBB (CompOutput &output); bool updateBBUsed () { return true; } void updateAttrib (GLWindowPaintAttrib &wAttrib); virtual bool requiresTransformedWindow () const { return false; } virtual float getFadeProgress () { return progressLinear (); } }; #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/point3d.h0000644000015301777760000000424512321343002026272 0ustar pbusernogroup00000000000000#ifndef ANIMATION_POINT_H #define ANIMATION_POINT_H #include "animation.h" class Point { public: Point () : mX (0), mY (0) {} Point (float x, float y) : mX (x), mY (y) {} inline float x () const { return mX; } inline float y () const { return mY; } inline void setX (float x) { mX = x; } inline void setY (float y) { mY = y; } void set (float x, float y) { mX = x; mY = y; } inline void add (const Point &p) { mX += p.x (); mY += p.y (); } Point &operator= (const Point &p); bool operator== (const Point &p) const; bool operator!= (const Point &p) const; private: float mX, mY; }; typedef Point Vector; class Point3d { public: Point3d () : mX (0), mY (0), mZ (0) {} Point3d (float x, float y, float z) : mX (x), mY (y), mZ (z) {} inline float x () const { return mX; } inline float y () const { return mY; } inline float z () const { return mZ; } inline void setX (float x) { mX = x; } inline void setY (float y) { mY = y; } inline void setZ (float z) { mZ = z; } inline void set (float x, float y, float z) { mX = x; mY = y; mZ = z; } inline void add (const Point3d &p) { mX += p.x (); mY += p.y (); mZ += p.z (); } inline void add (float x, float y, float z) { mX += x; mY += y; mZ += z; } Point3d &operator= (const Point3d &p); bool operator== (const Point3d &p) const; bool operator!= (const Point3d &p) const; private: float mX, mY, mZ; }; typedef Point3d Vector3d; /* XXX: change this to CompRect */ typedef struct { float x1, x2, y1, y2; } Boxf; inline Point & Point::operator= (const Point &p) { mX = p.x (); mY = p.y (); return *this; } inline bool Point::operator== (const Point &p) const { return (mX == p.x () && mY == p.y ()); } inline bool Point::operator!= (const Point &p) const { return !(*this == p); } inline Point3d & Point3d::operator= (const Point3d &p) { mX = p.x (); mY = p.y (); mZ = p.z (); return *this; } inline bool Point3d::operator== (const Point3d &p) const { return (mX == p.x () && mY == p.y () && mZ == p.z ()); } inline bool Point3d::operator!= (const Point3d &p) const { return !(*this == p); } #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/screen.h0000644000015301777760000000222312321343002026163 0ustar pbusernogroup00000000000000#ifndef ANIMATION_SCREEN_H #define ANIMATION_SCREEN_H #include "animation.h" class AnimScreen; extern template class PluginClassHandler; class AnimScreen : public PluginClassHandler, public CompOption::Class { friend class ExtensionPluginAnimation; friend class PrivateAnimScreen; friend class PrivateAnimWindow; public: AnimScreen (CompScreen *); ~AnimScreen (); void addExtension (ExtensionPluginInfo *extensionPluginInfo); void removeExtension (ExtensionPluginInfo *extensionPluginInfo); bool getMousePointerXY (short *x, short *y); CompOption::Vector &getOptions (); bool setOption (const CompString &name, CompOption::Value &value); CompOutput &output (); AnimEffect getMatchingAnimSelection (CompWindow *w, AnimEvent e, int *duration); void enableCustomPaintList (bool enabled); bool isRestackAnimPossible (); bool isAnimEffectPossible (AnimEffect theEffect); bool otherPluginsActive (); bool initiateFocusAnim (AnimWindow *aw); private: PrivateAnimScreen *priv; }; #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/grid.h0000644000015301777760000000567412321343002025646 0ustar pbusernogroup00000000000000#ifndef ANIMATION_GRID_H #define ANIMATION_GRID_H #include "animation.h" class GridAnim : virtual public Animation { public: class GridModel { friend class GridAnim; public: GridModel (CompWindow *w, WindowEvent curWindowEvent, int height, int gridWidth, int gridHeight, int decorTopHeight, int decorBottomHeight); ~GridModel (); void move (float tx, float ty); class GridObject { friend class GridAnim; friend class GridZoomAnim; friend class GridTransformAnim; public: GridObject (); void setGridPosition (Point &gridPosition); inline Point3d &position () { return mPosition; } inline Point &gridPosition () { return mGridPosition; } inline Point &offsetTexCoordForQuadBefore () { return mOffsetTexCoordForQuadBefore; } inline Point &offsetTexCoordForQuadAfter () { return mOffsetTexCoordForQuadAfter; } private: Point3d mPosition; ///< Position on screen Point mGridPosition; ///< Position on window in [0,1] range Point mOffsetTexCoordForQuadBefore; Point mOffsetTexCoordForQuadAfter; ///< Texture x, y coordinates will be offset by given amounts ///< for quads that fall after and before this object in x and y directions. ///< Currently only y offset can be used. }; inline GridObject *objects () { return mObjects; } inline unsigned int numObjects () { return mNumObjects; } inline Point &scale () { return mScale; } private: GridObject *mObjects; // TODO: convert to vector unsigned int mNumObjects; Point mScale; Point mScaleOrigin; void initObjects (WindowEvent curWindowEvent, int height, int gridWidth, int gridHeight, int decorTopHeight, int decorBottomHeight); }; protected: GridModel *mModel; int mGridWidth; ///< Number of cells along grid width int mGridHeight; ///< Number of cells along grid height /// true if effect needs Q texture coordinates. /// Q texture coordinates are used to avoid jagged-looking quads /// ( http://www.r3.nu/~cass/qcoord/ ) bool mUseQTexCoord; virtual bool using3D () { return false; } virtual bool requiresTransformedWindow () const { return true; } virtual void initGrid (); ///< Initializes grid width/height. ///< Default grid size is 2x2. ///< Override for custom grid size. public: GridAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~GridAnim (); void init (); void updateBB (CompOutput &output); bool updateBBUsed () { return true; } void addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight); void drawGeometry (); }; #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/animeffect.h0000644000015301777760000001714612321343002027017 0ustar pbusernogroup00000000000000#ifndef ANIMATION_ANIMEFFECT_H #define ANIMATION_ANIMEFFECT_H #include "animation.h" typedef Animation *(*CreateAnimFunc) (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); class AnimEffectUsedFor { public: static AnimEffectUsedFor all(); static AnimEffectUsedFor none(); AnimEffectUsedFor& exclude(AnimEvent event); AnimEffectUsedFor& include(AnimEvent event); bool open; bool close; bool minimize; bool shade; bool unminimize; bool focus; }; /// Animation info class that holds the name, the list of supported events, and /// the creator function for a subclass of Animation. /// A pointer to this class is used as an identifier for each implemented /// animation. class AnimEffectInfo { public: AnimEffectInfo (const char *name, AnimEffectUsedFor usedFor, CreateAnimFunc create, bool isRestackAnim = false); ~AnimEffectInfo () {} bool matchesEffectName (const CompString &animName); bool matchesPluginName (const CompString &pluginName); const char *name; ///< Name of the animation effect, e.g. "animationpack:Implode". /// To be set to true for the window event animation list(s) that /// the new animation (value) should be added to /// (0: open, 1: close, 2: minimize, 3: shade, 4: unminimize, 5: focus) bool usedForEvents[AnimEventNum]; /// Creates an instance of the Animation subclass and returns it as an /// Animation instance. CreateAnimFunc create; /// Is it a complex focus animation? (i.e. restacking-related, /// like FocusFade/Dodge) bool isRestackAnim; }; template Animation *createAnimation (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) { return new T (w, curWindowEvent, duration, info, icon); } /** The base class for all animations. A n*imations should derive from the closest animation class to override as few methods as possible. Also, an animation method should call ancestors' methods instead of duplicating their code. */ class Animation { protected: CompWindow *mWindow; AnimWindow *mAWindow; float mTotalTime; float mRemainingTime; float mTimestep; ///< to store anim. timestep at anim. start float mTimeElapsedWithinTimeStep; int mTimeSinceLastPaint; ///< in milliseconds int mOverrideProgressDir; ///< 0: default dir, 1: forward, 2: backward GLWindowPaintAttrib mCurPaintAttrib; GLushort mStoredOpacity; WindowEvent mCurWindowEvent; bool mInitialized; ///< whether the animation is initialized (in preparePaint) AnimEffect mInfo; ///< information about the animation class CompRect mIcon; int mDecorTopHeight; int mDecorBottomHeight; GLTexture::List *texturesCache; CompOption::Value &optVal (unsigned int optionId); inline bool optValB (unsigned int optionId) { return optVal (optionId).b (); } inline int optValI (unsigned int optionId) { return optVal (optionId).i (); } inline float optValF (unsigned int optionId) { return optVal (optionId).f (); } inline CompString optValS (unsigned int optionId) { return optVal (optionId).s (); } inline unsigned short *optValC (unsigned int optionId) { return optVal (optionId).c (); } public: Animation (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); virtual ~Animation (); inline AnimEffect info () { return mInfo; } // Overridable animation methods. /// Needed since virtual method calls can't be done in the constructor. virtual void init () {} /// To be called during post-animation clean up. virtual void cleanUp (bool closing, bool destructing) {} /// Returns true if frame should be skipped (e.g. due to /// higher timestep values). In that case no drawing is /// needed for that window in current frame. virtual bool shouldSkipFrame (int msSinceLastPaintActual); /// Advances the animation time by the given time amount. /// Returns true if more animation time is left. virtual bool advanceTime (int msSinceLastPaint); /// Computes new animation state based on remaining time. virtual void step () {} virtual void updateAttrib (GLWindowPaintAttrib &) {} virtual void updateTransform (GLMatrix &) {} virtual void prePaintWindow () {} virtual void postPaintWindow () {} virtual bool postPaintWindowUsed () { return false; } /// Returns true if the animation is still in progress. virtual bool prePreparePaint (int msSinceLastPaint) { return false; } virtual void postPreparePaint () {} /// Updates the bounding box of damaged region. Should be implemented for /// any animation that doesn't update the whole screen. virtual void updateBB (CompOutput &) {} virtual bool updateBBUsed () { return false; } /// Should return true for effects that make use of a region /// instead of just a bounding box for damaged area. virtual bool stepRegionUsed () { return false; } virtual bool shouldDamageWindowOnStart (); virtual bool shouldDamageWindowOnEnd (); /// Should return false if the animation should be stopped on move virtual bool moveUpdate (int dx, int dy) { return true; } /// Should return false if the animation should be stopped on resize virtual bool resizeUpdate (int dx, int dy, int dwidth, int dheight) { return true; } virtual void adjustPointerIconSize () {} virtual void addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight); virtual void drawGeometry (); virtual bool paintWindowUsed () { return false; } virtual bool paintWindow (GLWindow *gWindow, const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { return gWindow->glPaint (attrib, transform, region, mask); } virtual bool requiresTransformedWindow () const { return true; } /// Gets info about the (extension) plugin that implements this animation. /// Should be overriden by a base animation class in every extension plugin. virtual ExtensionPluginInfo *getExtensionPluginInfo (); void drawTexture (GLTexture *texture, const GLWindowPaintAttrib &attrib, unsigned int mask); // Utility methods void reverse (); inline bool inProgress () { return (mRemainingTime > 0); } inline WindowEvent curWindowEvent () { return mCurWindowEvent; } inline float totalTime () { return mTotalTime; } inline float remainingTime () { return mRemainingTime; } float progressLinear (); float progressEaseInEaseOut (); float progressDecelerateCustom (float progress, float minx, float maxx); float progressDecelerate (float progress); AnimDirection getActualAnimDirection (AnimDirection dir, bool openDir); void perspectiveDistortAndResetZ (GLMatrix &transform); static void prepareTransform (CompOutput &output, GLMatrix &resultTransform, GLMatrix &transform); void setInitialized () { mInitialized = true; } inline bool initialized () { return mInitialized; } inline void setCurPaintAttrib (const GLWindowPaintAttrib &newAttrib) { mCurPaintAttrib = newAttrib; } }; #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/transform.h0000644000015301777760000000163712321343002026727 0ustar pbusernogroup00000000000000#ifndef ANIMATION_TRANSFORM_H #define ANIMATION_TRANSFORM_H #include "animation.h" class TransformAnim : virtual public Animation { public: TransformAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); void step (); void updateTransform (GLMatrix &wTransform); void updateBB (CompOutput &output); bool updateBBUsed () { return true; } protected: GLMatrix mTransform; float mTransformStartProgress; float mTransformProgress; void perspectiveDistortAndResetZ (GLMatrix &transform); void applyPerspectiveSkew (CompOutput &output, GLMatrix &transform, Point ¢er); virtual void adjustDuration () {} virtual void applyTransform () {} virtual Point getCenter (); virtual bool requiresTransformedWindow () const { return true; } }; #endif compiz-0.9.11+14.04.20140409/plugins/animation/include/animation/gridtransform.h0000644000015301777760000000121512321343002027565 0ustar pbusernogroup00000000000000#ifndef ANIMATION_GRIDTRANSFORM_H #define ANIMATION_GRIDTRANSFORM_H #include "animation.h" class GridTransformAnim : public GridAnim, virtual public TransformAnim { public: GridTransformAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); void updateTransform (GLMatrix &wTransform); void updateBB (CompOutput &output); bool updateBBUsed () { return true; } bool requiresTransformedWindow () const { return true; } protected: bool mUsingTransform; ///< whether transform matrix is used (default: true) }; #endif compiz-0.9.11+14.04.20140409/plugins/animation/docs/0000755000015301777760000000000012321344021022064 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/animation/docs/animation-class-hierarchy.odg0000644000015301777760000004166012321343002027622 0ustar pbusernogroup00000000000000PKÜDí:Ÿ.Ä++mimetypeapplication/vnd.oasis.opendocument.graphicsPKÜDí: content.xmlÝ\ÉŽã6¾ÏS樅¤V£«‚`‚κÆt‚ 榒h[(md»*/‘ã¼ß<Éü¤S.ۤڲݩ>Ti!¥ÿûøïbõ‡_Òd¶¥eçÙÃéæ|F³0âlõ0ÿíך7ÿññoòå2é"ÊÃMJ³Z ó¬†ß3˜U‹æîÃ|Sf‹<¨âj‘)­u¸È šu³âèWs¥ª_åé|°8»¦/µêd6v07xR3,ÎŽÊ`§:™RÅéË\uòK•hËXO‹ Ž¤xIâìùa¾®ëba»ÝNß=/Wò}ßàw{Ã~\±)>* šPö²Ê@:2º±)­UùØXQ¤l“>ÑR™š Þ¬jQÒ †\¦˜jç ôk»RÖ®íêÍá:(•õŒª ‰ÔU…DâÜ4¨×'Ö×3>ÃMþãó§½^•©ê»ØØUaÊ0›Ñâü<Ï{QÙ„ÆØ¹¸Ø4-£9FïÎß•qMKaxxvx$aÏxž# Æ!FhtËT¾7"FDub6šÛýà*:ùèþô5\Ó4؎僵8«ê Û3S¥q¢¼ 0ö„ÒY¬¬ lìÓ)™2œdÜ6JZäeÝ/ÐR=À[pÿ–hô¯‘•Ο ±‰ü]â æm 6å‡^ãcštæÕ Ù¾Ÿ¾´ŒÙÄ  bKŸGK +/†¾¹L_.zboXí\!ÈâùcQ ªŒþB°©s¶ ¡Æ]bõø¡qüç¬9fb<Ì£ÍÛ ËTà.5AF+‚§§®Ê7SWeP¬ã°»\%‹óüDk&1‚2šwÏm§h ¦eÓjÆàA¦Ú:/ã?rF“$ñ °‡4ãö<·e³Ãý¨4Ž¢„0çàà+ÂYÆ 3¯$‡€öÃþ9Î!€Û%Wšå3-5°´‡ùOe™ïæ‡×µ]±Xdê$LïE—7º  ª‡Ø_A.s.ÄtoÞËsÄ$®Zïþ„æâ€‚HÒ’ý´IZÏš›ì:Xú¼9mni,)x˜ÿï¿öb ÙËÙÛ-v(ÿøÕ:Ø_ϯ¯éSžt„l* Kžr§ñ‘­ÖÖåK7½Šÿ$–ýwý˜Pñ7AmæTEÂC)¸LÊtËaºÅï¤q¦%ÁÌéÝüK2D&cÈ»dÈš!ï]2dOÆÖ­wÉ3Cä]òãNÇÏ;õÓÞd YïÔOû2ô>ý42'£Èþk9jáv›N' ÛöÆS½ö'mûø× ¬Žmª‡&ýf稭'ć—Âm­RARÏ àöÞÏtl’zÞ>²¤aýö¼ îË”Aùô¥»CYG¸=K‚WÖá„_ù¦:·«E»(X·ù’±Kk¯Ö5OÙÜîÚ œú:ÁÝ9,Œ£›ÌZ +Z= ñøŸi1û=ؾ^¢ÂzH¶€Âé+›Á•ù<Ä_Ê8ú)‹¯©DŠÍ–+'²uÇ´Ç¢ûµ ²Šµó¾"V]>9FK·,™Š,`çjÎcü’'¯«<“ ó,ƒ³¼<“HaÁõ‚(äî. (NHŽà=æe}©jT´vq•l¨VäqVóþ› D§µÕ|¯ÁˆÙ¹¾%Ëó.•ÈíêÞ r#Gwå)ó¿(0>_YßíIôý07Q Ü?çÑê[Ü•*6¹·RÉ)ÑÀï@oŒíCç7’éLN&6AÂr\Vh§kÍ6mo«!âßÞaõX|]¬ƒdrÚ J¨a±v“ò MÓÕ‰à:Õ•¤ty’üV\³‹&÷· Ð\£·E:räÙ\IƒkfªÈ”bSHç©;þhlóäÚMB_XN.Ý0NÝ'Rtÿd›ŸÄk®Þ$ ÞnµÆáûKÞ" Àëxb(¥‰;`­Ä{O éÅ®…xÌûÇ.2å×Af•xçÐ6ׄ0‡ Gw RännÐÈ\I…6D@H‘7 ª‘»ðv˜-i¡}.„¸kèÚ0Ÿ’ö¢ÙÙ”Uè^cÛ5gµååÇ9¦jOöº\ÚbÒ$ñ–УÈ'î±mû>ŒñQCµBýF½â ö[bÁÄŽ*ž?ŽÅSŸß‰à£0H8óœÆEKšaâ ù¦=s‘åó£»uðay©åŽUCËE˜å‘‚éj¶îjº¢¥Sº¡iKv|à‘}¬ÐwaVËu®óu6ºUê)ïÄZºëÈ!0(ö™•¶o±8ÈvJß4žöMRÿ>r“ßHËRHŸzßîð,dñ=üà{Ôýú(íÖUZ›½_ßo‘4¿³ð(ÝgzÐE˜vŸißRPÚhÚê mš|›EspOÄD·Dî.ÛׇG’§°±Ë4…}ö©¸µï;Úê3JÇVâ**8ØêÓ‘.±Û"’]½ˆ¼l‡¤îAŸ¦ýÊ£úÇ)ÇcesÌþšjÿ‡\ìÿ-cð\Ɖÿ#ìñÿPKFUG_ dLPKÜDí: styles.xmlÝZ]rÛ6~ï)8̤o$;–j9“N§Ou§S'€HPB ´¤\¢½_OÒ@R DÊT"ÇŽ“™L´?öÃþ`—¼~¿É¨ó€¹ ,Ÿ»á(pœÇ,!ùrî~úø»w徿ù隥)‰ñ,aq™á\zBn)(çbf˜s·äùŒ!AÄ,G3ÏXóZifKÏôR†¢6T] ÛÚoäPe%ÛÒE‹á+ka[;áh=TYɦ¶zʆ*oõRæÅ,+${»ØP’ßÏÝ•”ÅÌ÷×ëõh=1¾ôÃétêkn³á¸‘+JNµTû˜bµ˜ðÃQèײ–hèþ”¬½¥¼Ì˜†ItpªÇDÀ\å—Ãdë´üëa9Ø»–=0Ç+Äû™n»Ê8î*ãÄÖÍ\õœï• LýÏí;¿âÙе”l ª˜“b°™FÚÖgŒ5[U &Øõv£ ˜øæ·%½>*¾æDbn‰ÇGÅcDãq–ur¡~P.ߨ:Øjíq”“ÁÐ+ÙWå ü^ /|Ž ÆeH:<éÂ*Q³J’¢f#ýO)êµì'ø*º}¥òÆuªämŒÈ½©«ƒ) 7×*××ò{Ìýµ³¹ûs¶v±ÙÁë_ÙfîNàD3 b$ æ…Š¶Š‚/®sm’C‚STÒªô8†–"8‹íÜ]rT¬HìÖ²âHÓ¼‚ƒ-\(V†¥J€‡JÉDTÑ" fFÑb…ÜJ¬(óX–ú|¼5°ç® YAq͇´Š½ÇR¯œÄ²æ(Ÿ…Lïe,ÇSîÉEÍJ”N’'XÁ«Ê¨~ŠÚˆ.·)¢76@¹[Y!¿ß¬F\Ùu`m)°u'akO/3Ê 1K^‚%)3;ªQüLüò‘€9âµó7ËPnˆ- Œ¼·Ä9Ãç.Wr-‰‚ÈrÖâDÍÝR‚|P¢I!5¢|Y¢%p® 1+sÉa/Ÿîº–/Ey½Ñðpê|Ê \W°s{÷èNku±g‡®ù»m[jçµ€Ùå• 5ïËfS³*cjNÎrܵ;•J(†`øˆV€ä1Ñ^‰~#‘N3n‡! O›²óËVhÖiÇ©IB¢ï UÿÖqÍ(¼8ubÓŒ‘ÌrÞŸå˜Ð8:Êù 4M8?%œU¾x ‚hW|’1ÍWXYXͰžÐt34;ÍÏUø|ç6QùM»\°dûœ;=~»©*Ú%d·“­ú\ p Ü;ðý~ÖõÝ‚ÌÛ J–PTÔnIº=ÝLs³y¹FžpÕkßÔêûï@8ˆ´*ä uäÉä$GV&…ÏaSï‚ÀäékBt¬&0kÂð(2UvèqD§Gô4ÇÑu= vïHZg¦q<¾¬3äf•ýŽnöôt £ã|OkëÚ‡>>©˜¬0JT7ôü™åè+4'QœQ8£Ó£ÆèYRÕóÔî³ëÆxÁhr:tO”V^,t“Ž‘äñ·"ša$Jþ=âÕ.’§6‰Ñ~“M`§^«9ŒZ¡u¢bY»Ì‰¬:Ì¡uº¿÷IUõS}·¤>‹½šQƒ¹ÄE[hÅZGñ×màvÈñ¯žZ°G6U&ì¬25U¯W½M'6½Fáèb7³—‚†q²ûô“‚OˆvSe™ÒIq«¯p=õ€›xàj ß/9+Á Ìy-OTý{´åó{ϬbdHHí—ÛÝWs`”"©Yïî·ý±Z­ÖÍßíwˆŒiâE¿h ŽÊ="QE»J¡ZÊ߷ÀR«0nÒoæÓ¡]VØ9éÎ…ë¨ß¥ }¸þä=,ýîïÕoþPKˆÕ**ˆï.PKÜDí:NgIYPPmeta.xml 2009-01-23T23:06:112009-07-13T03:38:56PT10H09M08S58OpenOffice.org/3.0$Unix OpenOffice.org_project/300m15$Build-9379PKÜDí:Thumbnails/thumbnail.pngmšuT[—öhÜ]‚DÚ¸,!´ƒ;Ü%¸îNp·Æ <@p×F×>®¼3w¾™jÕªujUÕ®óìó{ö>aj*r¸XTXWA^ú€òx èÃxòxÕxô ÒnéîŸ4¶æ.|y´_a20¤| |ñÂSøÛà++ ‚oṟ‹±9ö/êëoNtDI“š!õÓÓ:ã>Í­‰d„$.@" &Cág»y"äU ƒÔ…i"ãá ù6|Ì!–œ9€¼I#Jd\yÞ€G4Œÿl#éÇÓÞP†8! ô9*=‹,Pœ@ã+†}!€N.oüµO~ÒœÍ´Û Åïp ?,7ï$¾Õ Ìw— °FI¨q3J bã¬}§úµ=Î £`Õ¨1C¤ #ªNÇÇ÷pø…|„¶DX( ˆÂqŽß½ÂÄk@l ôž²€±y›Oy•5ÿZZÌ ë{åÊ@L æo3RBP >Œ;™ÙAÃ2®îØüå×|å5CG|sÒ§Ù gDw¶PüÏpÎ׊õv¬ñgº‰DÌ/•cäŠÈж„Wòò=€ÍÁh4ËΉÇR¢ÖÌÛÎÖãÁË5ñ}'àù芜M¸f,õàò%7n˜xaÀü:b÷™¬dè³ò5œ¦¹îd§…úä7÷t ™Ê möºœj†â@ñœÇ$Ó ¶&k»–ÓOÄ4$‰®êÙÇÙ“&-8‘¶%ù¯y"æg×édë:IiV¦|zøHD\3[}ïjÁ"“Íùy2 £M(^Ä1\ê¶“åÚ ž [BFU+­Š:×q}ˆ!»ŸQH*4{×z¯Áê‚'ÞV—s¾&þ'öÿý+‹”v¬u!~ÑprÛ2Nò!áö€ÿ§ÿŒ}­ hí-—_vÃ3óûPøS82حߘXøE¥…Q™‹.NœaüïI¡ü¡}É2:µ¨ÔüDK Çéü¤Ïáá೤]È ƒÕù½++2¥iµVWu%ÿ­õ¬5¦j‡òŸYfŸ EÆ•SG`}ø>ž_yÅÌ-´O#‡½‡U³âFÙA=µƒÀKСFl«WÁõ&7ø0£ŠO;›iÉñ„ §|Õ©q‰¶÷/uY+`rZúÒòIš{åMïŠ7àÍ[^ *NUQ>ï!¦z¯Éßl8o2xtÈñcú½ì½‰½z9KV‘Ãàû´÷|+‘¸). ›â£…ñ29 àûŒ÷W'EÛ–=™á1TÞÌœ©ñè—„kàŸ1Ü—<‚íQp-£™üsAEƒ„¨T$}.î‚­æšYîÍæ;"”fi¸ð—‡M –7åÛC§ 뺂<ŸEí™øÕâ EÁÜwÒO]¶çâ!žó :ox©xuÄê$_à› ÿ ¦?øU8qÞ(þClí³Êtð½ «rßÐu÷1®0áS°¾ÜïAÏ0\§ifŒÑ\VN¦•Ü$v™”`¯»û΄¹z“%Ÿ°RÚ³ªåƒò÷ ¥C³üN9/¿|ýX“,?• h|}V±wÍô‡×Z@>òHÌFàÃÀ®WÈjÔÓR;}ù€éò¼ñwÓøÃ(Wç´CEC•Ïw&§68ÿ¬¬5Át[SDàŠ#«!%óµ@ëÊÄog ×Hf–uÆÙêöì]¥M«¯Ó×_¤ÍpÌú=UÕiôdM»¢)=Ö/¼®¨:§6~îÀR£]ˆ]³Ú\Ä\†¸ëØÐäu΋ÇHô°{F5öíJOø^[ÝFà5E”ÏújÄžnìãhMËÏÎDèïЀ+¯$Ç?–\-7?’®–FémÍ÷%y½Êø"âsʽYÂéôôQVkQXÌZw£1ERäÏQŽ ˜*l´„ï·È=$¡è?¨±SøŸ9jUkz#%Uctÿ^¯Eýôî ò8\©<¤Ú%YÈ’ó.äü׺^I €ð½°ß"í$]¸8ûe ±½E5`h¶N}ëѵùÙVœ¦…ÛøŽ íÝ£ ?ãýE­ºœ98òNóâ£üxÄЬØV%›âòWUÓÃV‘Ó\û~§¹`d¤9³jT®@GáÅ´;‡S”+¶Ÿ¯ˆÂqÿÀ˜˜¸Ï0ÑÙ ¢pö3É]Q)óòÅ­’ÓïôŠçòÔEºL°JpžªP_u…Qrœ*-(¥ÅÂRª=hiŒÓ´5‡m@V¬¯3X¤0óŒÚWV'sjùÆ£â†6«ÝØY7ü¥ñ5_rƒˆam³ÝÂr³±õ±Í ´Mæ€ÀY×{™$â m68Þ]´ýìFÉWÆ“Ž#ÿ¢ò´¾÷ºÇ`^|ú"º˜švÄ|ሚTUüÛީWŒ]‹ûž9¸×ÐÍDÜõØkìU§vÚSòÙoið‹i~¼µÙyÆ´…‰îM2•®äƒÕö߃ËÍ<ÖöC‚OݳÊ™<ü<&»'Òœ—¦°s7‘‡D(ÇÄÜ­ÇÏ0Oo';ÚGVT̬ÄÑa͸;²Š[§t±«ò]ƒsZêJo¢Žè]u­¡ ø¸.!Âóßèî¢J¼© {HẾÉ%ëq$åœ?*H6Ìq{âf.Ê[ŒØ+ºÇ™«aÏè]/—kÉûöÑýV#R~÷*Og™´úZ`·þæ›L}µ=oÓ’N{³©içQµÛò×ÝsØ3pŽý~¯¡^`¯¡‡ÌKâq ìü ¹;‡ÙIÓm,Åî0ÁÁwŒÇFÖª!õr[¦H;¯ÐO5ªâÅc°É5± ›dš=~Þ~»O{ùFÌmRÒ/½‡ì-סLò~÷6PÁ2*½·-ºk½¨)ŸZL}†± XmñÓ:ó+ËI+<­Ë†Ëþ¯Õͨqv@{ãmÊÕÞŽ†÷É3Ó>ggüÓFË7/Ä€œôÌžÂ[× sˆƒ› ¹ŽÝÏ#O¹Œû²]XsKCd<¿ÜöÕ>@@v/'Í>kíãlXª˜¨šoƒ"ŠŠþ¡[D4áÈÓáaŒ“••¹†}£¾†–¬tá–ˆ8wÊ·mü„Æ2é"B‰Ì—‹Š9¡‹bí£>þG»X'ì?eä­Ð“ÀIénz–éâߢsñœyj:Ï!?ŒR=qZâé[—|²l¸c|O,ÄEdkp{»;ãKUìw½ÌôâZ†›ëœÄsÅÓj=7¥k8HùôÉ¢Hˆ¾ó [cÄmHV‘?b@­÷krÜ2Z1 3{eøaÈ?%ê!î$`Wïc0Ù)2Æð7Oüˆ Œ°ÎþcÒv›O„žETŠœI«†z@ý´€Ùä¯Ëk˜âõ¾0MèZºÃmþ§±C_¯@1`¼±å?,»u5·í'¾lß{6µC)  9ª[j|gÓ½•>¶®Â@ò/˜Mú¸"´|­üJ¢%éöáÕbÆcʱ]Ë.*õí=:rˆj?Yñ:vœЊ#óúW,“bcFsPÏÉ{%>ધ|@lÊûÇÙ6ðýMÇhªã}S°òç:³Gb&|Tê´#©ñ Öh¡>Ã$Š`×Nn,ƒÈMo¹ä‘dåDE ‘¯ÜŽLêWHÙ´ïWöŠo5ìÙëeR4¨*Ø6PÓl€>^tÆg‰ûM !úQš«·VÙFO’më |cÂiiçüBr 6£/ûw€›{A‘ŒËÁžo#ç[_SãMq[0‘FòƒUÚá“I7+ïÓ,êi+û?Õ »Ô4ø²…ajh®Þe@xrj²J|S¼ÁO߬j¶þÆÒûLË(Ç`´ë½![Æ‹KkŸ¯!ÎE9ž–ôqÂælöÿâL¼~Ò¥`R·çç«ñ/¸“ÑÕ—?§:(UóƒþËÏ2­0ÃϤR2 “Ú4*¼§ ÚW" àôä-¹HSPÕ ;àûW0‚ƒ5­°Rzt¶CO=èðOöüÓ zá@,Ñ݆웩T °Ñ³ƒ[WƶWÔ!§õv­_ µ¾#¶®ù“òžS¥‚×Û,%dbr:àÚbN†Å¼ [ ®©ø½yz)æêY˜Û0Ôi®þž‹7*«o²€ÎŽû]ˆ')ôê>0?S ‘™_o™QïZoZ–©o˜3Ò›`<ø ]É…fÆÝRpìDêDOR •²Ú„;f¢0ÏÞ–t|OÆ1ª Â/1/}sX"YˆÝiA+ö ÷O_{«ãNºåëgé_ ã›æ²açÊì‰ê™Ï•Ò­6c·'œ¨ž–ûUX:Àª/mÖ•{‰þcrÄ—•£]Ö C%Mñ0‚šÂÙõIËÍ«`ªþ1ë yÅaØ-úošbz‘ê©£žÎ·÷"]eçP†44¨7åmÁäœE°NHÓ´¡M9Aò K¬{£â™œ¬ØØÕyGh=D•¼&ñuÎ*¶r£ÀŸ²YÜWÌ`mÆë³òcè½qu-Φu–ý„=u [,Ò^¾gƒ íP•ê çU}m]ù6¡l9²‹õO÷b‰3£/Σ»±*Jà/¿ÜmFúÛzæàÔ´Á1$g¾õ›üÇáŸéLÍ¿hãû ññOÚˆZ™±D ^¤Mè!Ë¢ Äî˸ãö¤§¹RÏ,¿zÀ­™tõŸVwY…yKY©iäTŸ„à0Eœ™x‰rôû‘*\KZNXßåõwÁ=E~ç}ÓQ–Ñ÷põ»p«=¡\Íe%›R. ö3¸FVˆ<üÓ™‘ԡ芕¾ÚË­‚Ýa›ó\ ó—§82>!‚vN£Ü˜í_r!($_Ö€Ú±±¦UE¬Q+ù…ÆTKù¸»ÑÀGÒ­Ê•ÑÎYt6A¿êš5W²xìÆšbžYòÈKPw$u¦:˜Žõsè^ÜòJ|Üm‡'eݺep`j«€âá|!FûÔv¢7øT…é·ƒÍsHKzz‡O¤è.Eÿ`á×\… ó˜÷KuYúѼ¿¹1A½“cõ:Œ¨¿(ïÃp²|Áï±W{ù6MÀ=uYÚy§"oíDËÔ¶9ý:ÌŸ%HŽk³µž Óy+ΧßRûÄêûâTÉœU— t‡¥7‰VþÒ¶¬"¡J¿ÂÙ2/âþ¸RgѪ/Al2÷Е í Ö_+°ûíÄ›ekþI£!£-äÕûä3:§lA:ì–Z./'Ô`ý/®ž´Ð)|(jæ®oËó—«¿å’'Uû‚µã[¿ø"2Ý™î¼ÅP^àÙDòˆvE+zÖÑn`^´_ וþò>ƽ‹¼pæøº3Ùe*¬Àüørs¾|.4|1LÝ›ÍÚÔÈÒ)&¦äÎöC£CbNÎ=é:ó®j¦ýãä Ý÷º§rDšvŸH’;“cæ`—Äi{n´ÒT{gÉ@pŽ+; šÚ§'ŽÄ7‰DÛìg“x¸ó Ç ù•m87ü/TdSÞ¨È]6a4í•T©\XM«,<åvÆùxËFU˜Gy~ æW‰´ÿÈ8x:1RãÔÙÌc»âSÎx#]~¥ìX—‰-EP¯°š½5Ü´tœåþªcEu:ýÖ:Õ†°ÓÂ-ív÷õFüçýor´ˆ ¹È©›¨ÉX÷2â´¥šç}æŠ6)yÿ“<íž.uJÀaÀàÿkÁÉÄÍ ]‹¼”O^ɺ?¯·¹7Ž‹!Cæ?î;ùÎóú,ÏóªÊÿHxôJ!¿Ár Š§jóh\9Z¨ÙÝÑÿ"7™‘}Y!¦újK=ÕãÄèâ,VLïfÍ' êècîö¢#¿@}=rôüÛÏ!M{Sò¤‹³„ÁÇë¿¿8¡aý½°óçô˜Ó듚èH+yJ¨Ù¼SDÀNÁŸìÿG½Ï- ïÆj:ž†<21ì†O?^ø¨®»Í\=Öu;IßdœxcðàO/@÷ï;›ýfs[žjeU–B‘c`Ñ*d;¾ -¨%š¨`úwñø—­•`› %˜’)w†L²-–†kó 7ývì4^¥%éçð-ü—-¡Xî>Kw>Å÷Gó UrË^®Îu‰ëKÕ—L3÷ñåkѵg{ x‰;Ú5žØÓgí1©–=;,¯9Mûh•Â,j7ç'ï´òƒÒµdÁ’Žw ¼gSg{Ï N±u­‡ð5‰–¹³[´ôë3:¤š”ç!–ƒAÄœíäxè&5¶ /µL¥Ë °èh€ó`M:ìôRS¾A{˜ÌÉ_©ÁØ`Š®†vQ•Ãh0©µ…p‹yT>í C®-DȾ.¿mðAíýÂJ >Q=)ñ Þ¾h¦Å½ñ“<3.P»¹É Qø\§îI¿–jË&Hæ¦d’JMÛ)Ó¶ŠôŠÿhZ[üñÏÒÅsq1ZïíÑ3%‡Øõ¢!ÄÐj¼ˆk™æY@ÿô»Žs ƒ®³j±o[µ»SÎ^»z‹! !R±~m[´µZHª=C3UKFß»1e ·Wl (ÕûM‹cœ­Ï[‘ñ:[sQ qAgç àœjêžÁ]é9o?6…†—€«˜ì^–£1kmj¨w—Fî>Ù´–ºb¹ó~ð¡Â3¬§0žÃV7 |ŠÛ²XîÈè­û¡œ^âZ%åú•Þ)—Óãõ…ë€Âýé8EEúõ¨ÊÄNïp³5zLÁÛ†¶3Ø»ä$ª2”1œ‡a×5öäRü–öSñj=¯Å~Io!à¡ŠË [ñ×h Êy§ãÂaˆe­§`¶|gão¾ïл®ÙgÛ=w«TV0<ªÀ?T÷‚×þ"‹ $ñìtÐ_EvÜn¦Ù¿ümžšw%0ZÈ.|š‚Ó0Ö L?V-smù\g,œw–PÖ¸ºB8|ÕºÅ/6Nô³aĬôÜEõÄÇÉ[A]¦Øû!-vBç»<<õ”ûK‘…M͈7ì¨ôƒÛ –¤þÝ»ùKÃú=º!Ô±£‡2Àll·õ—ø`^à.ŽVF%ˆ}*¹ ãÑe\±Ù¶Ý™?¨fcПk±ÁŒ èn7ñ~þ1ƒ+Îó%³¶ß³î:.Åm-9Pé_gVèÕ·èÚ/è¶—²Á„XÏ"tÒ8^ÔžknæüN<&‘p¨hüþŽ[Ûnúcún¸Ÿ+NèÏ{Œfÿ>}t‹á©oh‚Ä‹Ûð*]¤”p¸-KÎ:óÅbdl >#`Y²L …+u„5£I°0wÙ‰¾÷Ét2§ýÄ3”ÉÓ°5ìd¯->ÐÎÊHeŸ XÆT ×oª”ù§ëÐ|~ûl¡“3¥žü­kƒU³õ%qÿòMf¥?c“‰!ŽÌœjö~¸˜Õ×ómûÁÔË•=M–Äü<+{ÈÄ5iï-±#ÄAæÅ"©‹ÞVê&„ïîáæÌ”£c1~X9½*SSšÃ›Ø‹à*;NÍ:Ôdvj]ô7ÞsAÈoŒK°MÓÇ¥„CfÕCÁ0†ìÎÍ¥Ô°”F3\eXúä.~Ý·Å­ÄiÞŸo–ÏwtÆ”=·­ë¯?ñp/Æáàiî¦YåBŒ¦‘„¶ðÖ‹mÅ‚¨ÚýÄS÷BãB7Êm ö9NmêË çKi²=5BŹóiLÑz'Ç&1fÜz¯‡_„¨ÏÂ`-æá¡ÔZßïI|uûÏ}©d~? q‡f[ÎmÆ2FE6yˆ%Þ'U`©÷îâ;2Óí~Êk K&v„]Qdž±åA¾¿ôTMR'˜I*…PK_e±¾Fv}ì?¼ëdsgK‘8wöºsÝãæ^=!d¹Ú£û°©<mˆL³Ö&"LÿŽ™œ5`dî-žËî;Y!UzâpbÂW‰½µ”´W }ÕÑ2:c—ðÌ`t\˧{ùòV]“úÉTµ [Ç“É3ÏÓ/>ÉÝõ9晌†F@˜œle¦nã²’ž÷úG8{C¦ù‹#GªÓÅoŠzw†]FìnÝhGq%)  4¸· {?ßä4ÎY­ÓëæOÌ7ÍËòÊ2n uù|wýfÓ¥ #ÂXð¦:Œ4§çêÂÇ`öY¿Œ¬¨Ûå‹T…qŠößG“ýë§ y¸|^i”>s°Ó›ªºê_t†cýA´J¨—ÇŸM«ŒÛ¯¡8¦™Sày±ÂÒ!fÕ:<%ÖïËe–wߪ<Ú‘=¦>B}ÑÛK3QFxF@‰·íÃo]"c¬òbÚR<4Ab¡&ï9}S7©‚ ‡\Åóvû~%$b}Sµ51[±­çòM^ìR [H[;LÇÔs¹üÿ°eà⥫Ü#ÝÒ å >¾aúv±qK‘wi]²’úªÕ=]2ƒ… Ÿ(]{]~ÞX7«:2]÷—5lá&ÓÌ@Ÿ0<ÆiŸÍ¶¨VW@ÃõeÒ²±rÞÓÙÚ¼¯U83…º:«ÿVâêQÌû2ïsŠùØÏ¯z~‹2$ú‰emÆŠpKíhÕ”›[~B†ä¶·ê®qŽD_Ôô ç] =Æ+Zë‰XßÎ\¬þ r'ÆùSÈ»´Ûhˆ©Æ¾ÉÖcN^Ó¹y‰ëЛ¯ì‘åÙBžõUF,H_Ü ŠÛÿHQ0¤r¸™5ùß*‡¾’ÉÁчæ?ò7ýrÕ`8údªF+ÑSþq¥«I$À­? v0²ÿzÉÂGªÃÛ ‹u™¢¹¹Y{ùw æû”„ 4f‹qñÙëϯkŠTJeZ¨‡t£.p»ŠRR:©ïÖ6¾åÛlÎYÜß Ô‹ŽzD óæB|) éÝh= Äg†Ç´+-K޵<·M`Þ˜^Šœ†7cAªI~:¬ójJ¢·'îƒÿNþ»¶Ð4êwés&îuPQ‘®üäÿÿPKˆ2·1 !PKÜDí:'Configurations2/accelerator/current.xmlPKPKÜDí:Configurations2/progressbar/PKÜDí:Configurations2/floater/PKÜDí:Configurations2/popupmenu/PKÜDí:Configurations2/menubar/PKÜDí:Configurations2/toolbar/PKÜDí:Configurations2/images/Bitmaps/PKÜDí:Configurations2/statusbar/PKÜDí: settings.xmlÝZßS"9~¿¿Âšº‡»QW¥„-D=©Eå÷nï-Ì43“žJ2"ÿý&aðXtÌ««óA‹™äûº;þ…çŸ_b¶÷ BRäÍà`¿ì1¢|Ò ‡×•Óàsë§siÃ4®*”ÒKäžÞÎecñº¤‚7H*œÄ *l`|¹­±ººaÉO^åOÍ`ªTÒ¨Vg³ÙþìpŤzpvvVµo—KRCe.F¸ºg•6D>¦“¢(‹Õ«ûñUh³a¡˜¼^«UŸ—«eLYQ.³¶bœh™Gì[Nã¢0fíŠÖ™áWŽ»´–g»<ÒÖy¦èâO…*ˆÍyïe _3Ъ7ž)Ì^=!ÈÛ÷㞯TeÚÈ“`ùRÍý’r´*GǧçÕMœa÷`¬òÁk'¥Áÿ ‘šæ¡×ÏjLJ¥áo€N¦¹Ò×ë'GGEñ+1I*”GðÑ:ÌòÏÊîÑ®#æE$†Y7ZS*¡!h·8p³Äo‚F]™Ùc ~„È€ð ¥D eà¯òu¿‚ “Žè]9à$¢aÙ½ìKô>™À-Ê¥?ó»G9l¥Ø™îGC¨®…~è¥úùQ¦ÏRyCxÄ@¶ÙŒÌßóÞRdÖZ—‚Lú¦1/ÇsÅhL9QÐG6·vëéªmøòâÒÁq­æªÎ&—²鑹Î{ëøD§£ -„˜­jáŸÓ¦›,}"ù¯HÓÃð ¢÷E©¾u‡m¥ãÿÈÇÞanŠX>Þ=¤ „Ç„c‚õ‡×3å…¾:Ž÷fL‡4ˆ øN»ÒºÂ-FLÑ•t’J/±ñS}†Fç!¼¨«ˆnMòe´°)áxÀEKáA£È>ˆœåŸqáZp-¼k³˜(}D¬{¦ éŽî³„¾CµqÄ»À5΃inqìXnþïG')Ü»×á$BÂVéê'ŽîòøvÙË¡_ëÊx«àŸKÅ o—º´)‡­ÐÞ¥1¢Pxä¸޶´Ëg)Ѿr|ûôøæG®´å´¡¹â¦ÜÚ/–I!ÝCÕþb|ÏsjÙ5çáêÔaÛël‘¿@‚*>±ZùèHV9Þœm–&ÑÁÏÏ\Ë¢_SõVZ)OpC£lêò2:µýÎ×HÓ2 )¿vR/ò›òœÃ‰+-’èH„œÍ=hu D¦ùƸ!Ë›Ž-žu¤4¸F“܆À±½ëë´?$™Ò8ö\­'ýžFÕºÙË ,,ˆ®. Í×:'öÈ|s*°ô&†³Š®l¥FÍR”9·:c)0Í0 ÒõÒ࣓Öy†¯‹opïy‡¡ôqW!aà§ù±ÐoönŽÀI¤ó“΀ñℽ‘«>Ö¡Ø£ºñ-yuÛÿD´¾PKëg½*ÃU!PKÜDí:META-INF/manifest.xmlµ•MnÂ0…÷œ"ò>q˪Š•Z©' œI°ä?yÆnßH[Å;Ûïí¯^Ö{Œ¤½kÄsõ$ tÊ·ÚõøÜ|”/âu½XYpºCâú<(†}Ž.ÓF¤èj¤©v`‘jVµèZ¯’EÇõÏøzTZ/Š+¸ÓË!0‹«¶J>l„`´|ʽk«“V5•¨úa§‰+a’Ùr²Ü%cʼk„ò.Œ–C2·iÊ;­Œsr‰iv¬E† ·a›]²[Úäó° ®Ÿ> ïÝ»N÷)ž-%(…‡©R¥»Äûµ²„èûˆD[È$ÐŒ¹ÜûÂPÐ)~$g;öÞdƒk =’|Ól!dªƒo,lbàôÈ£üÝû)¹±8«¤+5ÕøŸy32å¥5¯äŸ¯rýPKXp“¡IePKÜDí:Ÿ.Ä++mimetypePKÜDí:FUG_ dL Qcontent.xmlPKÜDí:ˆÕ**ˆï. – styles.xmlPKÜDí:NgIYPPVmeta.xmlPKÜDí:ˆ2·1 !ÌThumbnails/thumbnail.pngPKÜDí:'C7Configurations2/accelerator/current.xmlPKÜDí:š7Configurations2/progressbar/PKÜDí:Ô7Configurations2/floater/PKÜDí: 8Configurations2/popupmenu/PKÜDí:B8Configurations2/menubar/PKÜDí:x8Configurations2/toolbar/PKÜDí:®8Configurations2/images/Bitmaps/PKÜDí:ë8Configurations2/statusbar/PKÜDí:ëg½*ÃU! #9settings.xmlPKÜDí:Xp“¡Ie >META-INF/manifest.xmlPKî¬?compiz-0.9.11+14.04.20140409/plugins/wizard/0000755000015301777760000000000012321344021020455 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wizard/wizard.xml.in0000755000015301777760000006057712321343002023124 0ustar pbusernogroup00000000000000 <_short>Wizard <_long>Wastes resources to create fancy particle systems for wizard-wannabes :) Effects opengl cube opengl mousepoll <_short>General <_short>Gravity <_short>Global gravity <_short>Point gravity sources <_short>Emitters <_short>General <_short>Advanced compiz-0.9.11+14.04.20140409/plugins/wizard/CMakeLists.txt0000644000015301777760000000016512321343002023215 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (wizard PLUGINDEPS composite opengl mousepoll) compiz-0.9.11+14.04.20140409/plugins/wizard/src/0000755000015301777760000000000012321344021021244 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wizard/src/wizard.cpp0000755000015301777760000006404612321343002023263 0ustar pbusernogroup00000000000000/* * Compiz wizard particle system plugin * * wizard.cpp * * Written by : Sebastian Kuhlen * E-mail : DiCon@tankwar.de * * Ported to Compiz 0.9.x * Copyright : (c) 2010 Scott Moreau * * This plugin and parts of its code have been inspired by the showmouse plugin * by Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include "wizard.h" /* 3 vertices per triangle, 2 triangles per particle */ const unsigned short CACHESIZE_FACTOR = 3 * 2; /* 2 coordinates, x and y */ const unsigned short COORD_COMPONENTS = CACHESIZE_FACTOR * 2; /* each vertex is stored as 3 GLfloats */ const unsigned short VERTEX_COMPONENTS = CACHESIZE_FACTOR * 3; /* 4 colors, RGBA */ const unsigned short COLOR_COMPONENTS = CACHESIZE_FACTOR * 4; ParticleSystem::ParticleSystem () : tex (0), init (false) { } void ParticleSystem::initParticles (int f_hardLimit, int f_softLimit) { particles.clear (); hardLimit = f_hardLimit; softLimit = f_softLimit; active = false; lastCount = 0; // Initialize cache vertices_cache.clear (); coords_cache.clear (); colors_cache.clear (); dcolors_cache.clear (); for (int i = 0; i < hardLimit; ++i) { Particle part; part.t = 0.0f; particles.push_back (part); } } void WizardScreen::loadGPoints () { CompOption::Value::Vector GStrength = optionGetGStrength (); CompOption::Value::Vector GPosx = optionGetGPosx (); CompOption::Value::Vector GPosy = optionGetGPosy (); CompOption::Value::Vector GSpeed = optionGetGSpeed (); CompOption::Value::Vector GAngle = optionGetGAngle (); CompOption::Value::Vector GMovement = optionGetGMovement (); /* ensure that all properties have been updated */ unsigned int ng = GStrength.size (); if (ng != GPosx.size () || ng != GPosy.size () || ng != GSpeed.size () || ng != GAngle.size () || ng != GMovement.size ()) return; ps.g.clear (); for (unsigned int i = 0; i < ng; ++i) { GPoint gi; gi.strength = (float)GStrength.at (i).i () / 1000.0f; gi.x = (float)GPosx.at (i).i (); gi.y = (float)GPosy.at (i).i (); gi.espeed = (float)GSpeed.at (i).i () / 100.0f; gi.eangle = (float)GAngle.at (i).i () / 180.0f * M_PI; gi.movement = GMovement.at (i).i (); ps.g.push_back (gi); } } void WizardScreen::loadEmitters () { CompOption::Value::Vector EActive = optionGetEActive (); CompOption::Value::Vector ETrigger = optionGetETrigger (); CompOption::Value::Vector EPosx = optionGetEPosx (); CompOption::Value::Vector EPosy = optionGetEPosy (); CompOption::Value::Vector ESpeed = optionGetESpeed (); CompOption::Value::Vector EAngle = optionGetEAngle (); CompOption::Value::Vector EMovement = optionGetEMovement (); CompOption::Value::Vector ECount = optionGetECount (); CompOption::Value::Vector EH = optionGetEH (); CompOption::Value::Vector EDh = optionGetEDh (); CompOption::Value::Vector EL = optionGetEL (); CompOption::Value::Vector EDl = optionGetEDl (); CompOption::Value::Vector EA = optionGetEA (); CompOption::Value::Vector EDa = optionGetEDa (); CompOption::Value::Vector EDx = optionGetEDx (); CompOption::Value::Vector EDy = optionGetEDy (); CompOption::Value::Vector EDcirc = optionGetEDcirc (); CompOption::Value::Vector EVx = optionGetEVx (); CompOption::Value::Vector EVy = optionGetEVy (); CompOption::Value::Vector EVt = optionGetEVt (); CompOption::Value::Vector EVphi = optionGetEVphi (); CompOption::Value::Vector EDvx = optionGetEDvx (); CompOption::Value::Vector EDvy = optionGetEDvy (); CompOption::Value::Vector EDvcirc = optionGetEDvcirc (); CompOption::Value::Vector EDvt = optionGetEDvt (); CompOption::Value::Vector EDvphi = optionGetEDvphi (); CompOption::Value::Vector ES = optionGetES (); CompOption::Value::Vector EDs = optionGetEDs (); CompOption::Value::Vector ESnew = optionGetESnew (); CompOption::Value::Vector EDsnew = optionGetEDsnew (); CompOption::Value::Vector EG = optionGetEG (); CompOption::Value::Vector EDg = optionGetEDg (); CompOption::Value::Vector EGp = optionGetEGp (); /* ensure that all properties have been updated */ unsigned int ne = EActive.size (); if (ne != ETrigger.size () || ne != EPosx.size () || ne != EPosy.size () || ne != ESpeed.size () || ne != EAngle.size () || ne != EMovement.size () || ne != ECount.size () || ne != EH.size () || ne != EDh.size () || ne != EL.size () || ne != EDl.size () || ne != EA.size () || ne != EDa.size () || ne != EDx.size () || ne != EDy.size () || ne != EDcirc.size () || ne != EVx.size () || ne != EVy.size () || ne != EVt.size () || ne != EVphi.size () || ne != EDvx.size () || ne != EDvy.size () || ne != EDvcirc.size () || ne != EDvt.size () || ne != EDvphi.size () || ne != ES.size () || ne != EDs.size () || ne != ESnew.size () || ne != EDsnew.size () || ne != EG.size () || ne != EDg.size () || ne != EGp.size ()) return; ps.e.clear (); for (unsigned int i = 0; i < ne; ++i) { Emitter ei; ei.set_active = ei.active = EActive.at (i).b (); ei.trigger = ETrigger.at (i).i (); ei.x = (float)EPosx.at (i).i (); ei.y = (float)EPosy.at (i).i (); ei.espeed = (float)ESpeed.at (i).i () / 100.0f; ei.eangle = (float)EAngle.at (i).i () / 180.0f * M_PI; ei.movement = EMovement.at (i).i (); ei.count = (float)ECount.at (i).i (); ei.h = (float)EH.at (i).i () / 1000.0f; ei.dh = (float)EDh.at (i).i () / 1000.0f; ei.l = (float)EL.at (i).i () / 1000.0f; ei.dl = (float)EDl.at (i).i () / 1000.0f; ei.a = (float)EA.at (i).i () / 1000.0f; ei.da = (float)EDa.at (i).i () / 1000.0f; ei.dx = (float)EDx.at (i).i (); ei.dy = (float)EDy.at (i).i (); ei.dcirc = (float)EDcirc.at (i).i (); ei.vx = (float)EVx.at (i).i () / 1000.0f; ei.vy = (float)EVy.at (i).i () / 1000.0f; ei.vt = (float)EVt.at (i).i () / 10000.0f; ei.vphi = (float)EVphi.at (i).i () / 10000.0f; ei.dvx = (float)EDvx.at (i).i () / 1000.0f; ei.dvy = (float)EDvy.at (i).i () / 1000.0f; ei.dvcirc = (float)EDvcirc.at (i).i () / 1000.0f; ei.dvt = (float)EDvt.at (i).i () / 10000.0f; ei.dvphi = (float)EDvphi.at (i).i () / 10000.0f; ei.s = (float)ES.at (i).i (); ei.ds = (float)EDs.at (i).i (); ei.snew = (float)ESnew.at (i).i (); ei.dsnew = (float)EDsnew.at (i).i (); ei.g = (float)EG.at (i).i () / 1000.0f; ei.dg = (float)EDg.at (i).i () / 1000.0f; ei.gp = (float)EGp.at (i).i () / 10000.0f; ps.e.push_back (ei); } } void ParticleSystem::drawParticles (const GLMatrix &transform) { int i, j, k, l; /* Check that the cache is big enough */ if (vertices_cache.size () < particles.size () * VERTEX_COMPONENTS) vertices_cache.resize (particles.size () * VERTEX_COMPONENTS); if (coords_cache.size () < particles.size () * COORD_COMPONENTS) coords_cache.resize (particles.size () * COORD_COMPONENTS); if (colors_cache.size () < particles.size () * COLOR_COMPONENTS) colors_cache.resize (particles.size () * COLOR_COMPONENTS); if (darken > 0) if (dcolors_cache.size () < particles.size () * COLOR_COMPONENTS) dcolors_cache.resize (particles.size () * COLOR_COMPONENTS); GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); if (!glBlendEnabled) glEnable (GL_BLEND); if (tex) { glBindTexture (GL_TEXTURE_2D, tex); glEnable (GL_TEXTURE_2D); } i = j = k = l = 0; float offA, offB, cOff; GLfloat xMinusoffA, xMinusoffB, xPlusoffA, xPlusoffB; GLfloat yMinusoffA, yMinusoffB, yPlusoffA, yPlusoffB; GLushort r, g, b, a, dark_a; /* for each particle, use two triangles to display it */ foreach (Particle &part, particles) { if (part.t > 0.0f) { cOff = part.s / 2.0f; //Corner offset from center if (part.t > tnew) //New particles start larger cOff += (part.snew - part.s) * (part.t - tnew) / (1.0f - tnew) / 2.0f; else if (part.t < told) //Old particles shrink cOff -= part.s * (told - part.t) / told / 2.; //Offsets after rotation of Texture offA = cOff * (cos (part.phi) - sin (part.phi)); offB = cOff * (cos (part.phi) + sin (part.phi)); r = part.c[0] * 65535.0f; g = part.c[1] * 65535.0f; b = part.c[2] * 65535.0f; if (part.t > tnew) //New particles start at a == 1 a = part.a + (1.0f - part.a) * (part.t - tnew) / (1.0f - tnew) * 65535.0f; else if (part.t < told) //Old particles fade to a = 0 a = part.a * part.t / told * 65535.0f; else //The others have their own a a = part.a * 65535.0f; dark_a = a * darken; xMinusoffA = part.x - offA; xMinusoffB = part.x - offB; xPlusoffA = part.x + offA; xPlusoffB = part.x + offB; yMinusoffA = part.y - offA; yMinusoffB = part.y - offB; yPlusoffA = part.y + offA; yPlusoffB = part.y + offB; //first triangle vertices_cache[i + 0] = xMinusoffB; vertices_cache[i + 1] = yMinusoffA; vertices_cache[i + 2] = 0; vertices_cache[i + 3] = xMinusoffA; vertices_cache[i + 4] = yPlusoffB; vertices_cache[i + 5] = 0; vertices_cache[i + 6] = xPlusoffB; vertices_cache[i + 7] = yPlusoffA; vertices_cache[i + 8] = 0; //second triangle vertices_cache[i + 9] = xPlusoffB; vertices_cache[i + 10] = yPlusoffA; vertices_cache[i + 11] = 0; vertices_cache[i + 12] = xPlusoffA; vertices_cache[i + 13] = yMinusoffB; vertices_cache[i + 14] = 0; vertices_cache[i + 15] = xMinusoffB; vertices_cache[i + 16] = yMinusoffA; vertices_cache[i + 17] = 0; i += 18; coords_cache[j + 0] = 0.0; coords_cache[j + 1] = 0.0; coords_cache[j + 2] = 0.0; coords_cache[j + 3] = 1.0; coords_cache[j + 4] = 1.0; coords_cache[j + 5] = 1.0; //second coords_cache[j + 6] = 1.0; coords_cache[j + 7] = 1.0; coords_cache[j + 8] = 1.0; coords_cache[j + 9] = 0.0; coords_cache[j + 10] = 0.0; coords_cache[j + 11] = 0.0; j += 12; colors_cache[k + 0] = r; colors_cache[k + 1] = g; colors_cache[k + 2] = b; colors_cache[k + 3] = a; colors_cache[k + 4] = r; colors_cache[k + 5] = g; colors_cache[k + 6] = b; colors_cache[k + 7] = a; colors_cache[k + 8] = r; colors_cache[k + 9] = g; colors_cache[k + 10] = b; colors_cache[k + 11] = a; //second colors_cache[k + 12] = r; colors_cache[k + 13] = g; colors_cache[k + 14] = b; colors_cache[k + 15] = a; colors_cache[k + 16] = r; colors_cache[k + 17] = g; colors_cache[k + 18] = b; colors_cache[k + 19] = a; colors_cache[k + 20] = r; colors_cache[k + 21] = g; colors_cache[k + 22] = b; colors_cache[k + 23] = a; k += 24; if (darken > 0) { dcolors_cache[l + 0] = r; dcolors_cache[l + 1] = g; dcolors_cache[l + 2] = b; dcolors_cache[l + 3] = dark_a; dcolors_cache[l + 4] = r; dcolors_cache[l + 5] = g; dcolors_cache[l + 6] = b; dcolors_cache[l + 7] = dark_a; dcolors_cache[l + 8] = r; dcolors_cache[l + 9] = g; dcolors_cache[l + 10] = b; dcolors_cache[l + 11] = dark_a; //second dcolors_cache[l + 12] = r; dcolors_cache[l + 13] = g; dcolors_cache[l + 14] = b; dcolors_cache[l + 15] = dark_a; dcolors_cache[l + 16] = r; dcolors_cache[l + 17] = g; dcolors_cache[l + 18] = b; dcolors_cache[l + 19] = dark_a; dcolors_cache[l + 20] = r; dcolors_cache[l + 21] = g; dcolors_cache[l + 22] = b; dcolors_cache[l + 23] = dark_a; l += 24; } } } GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); if (darken > 0) { glBlendFunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); stream->begin (GL_TRIANGLES); stream->addVertices (i / 3, &vertices_cache[0]); stream->addTexCoords (0, j / 2, &coords_cache[0]); stream->addColors (l / 4, &dcolors_cache[0]); if (stream->end ()) stream->render (transform); } /* draw particles */ glBlendFunc (GL_SRC_ALPHA, blendMode); stream->begin (GL_TRIANGLES); stream->addVertices (i / 3, &vertices_cache[0]); stream->addTexCoords (0, j / 2, &coords_cache[0]); stream->addColors (k / 4, &colors_cache[0]); if (stream->end ()) stream->render (transform); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_TEXTURE_2D); /* only disable blending if it was disabled before */ if (!glBlendEnabled) glDisable (GL_BLEND); } void ParticleSystem::updateParticles (float time) { int i, j; int newCount = 0; Particle *part; GPoint *gi; float gdist, gangle; active = false; part = &particles[0]; for (i = 0; i < hardLimit; i++, part++) { if (part->t > 0.0f) { // move particle part->x += part->vx * time; part->y += part->vy * time; // Rotation part->phi += part->vphi*time; //Aging of particles part->t += part->vt * time; //Additional aging of particles increases if softLimit is exceeded if (lastCount > softLimit) part->t += part->vt * time * (lastCount - softLimit) / (hardLimit - softLimit); //Global gravity part->vx += gx * time; part->vy += gy * time; //GPoint gravity gi = &g[0]; for (j = 0; (unsigned int)j < g.size (); ++j, ++gi) { if (gi->strength != 0) { gdist = sqrt ((part->x-gi->x)*(part->x-gi->x) + (part->y-gi->y)*(part->y-gi->y)); if (gdist > 1) { gangle = atan2 (gi->y-part->y, gi->x-part->x); part->vx += gi->strength / gdist * cos (gangle) * time; part->vy += gi->strength / gdist * sin (gangle) * time; } } } active = true; newCount++; } } lastCount = newCount; //Particle gravity Particle *gpart; part = &particles[0]; for (i = 0; i < hardLimit; ++i, ++part) { if (part->t > 0.0f && part->g != 0) { gpart = &particles[0]; for (j = 0; j < hardLimit; ++j, ++gpart) { if (gpart->t > 0.0f) { gdist = sqrt ((part->x-gpart->x)*(part->x-gpart->x) + (part->y-gpart->y)*(part->y-gpart->y)); if (gdist > 1) { gangle = atan2 (part->y-gpart->y, part->x-gpart->x); gpart->vx += part->g/gdist* cos (gangle) * part->t*time; gpart->vy += part->g/gdist* sin (gangle) * part->t*time; } } } } } } void ParticleSystem::finiParticles () { particles.clear (); if (tex) glDeleteTextures (1, &tex); init = false; } void ParticleSystem::genNewParticles (Emitter *e) { float q, p, t = 0, h, l; int count = e->count; Particle *part = &particles[0]; int i, j; for (i = 0; i < hardLimit && count > 0; ++i, ++part) { if (part->t <= 0.0f) { //Position part->x = rRange (e->x, e->dx); // X Position part->y = rRange (e->y, e->dy); // Y Position if ((q = rRange (e->dcirc/2.,e->dcirc/2.)) > 0) { p = rRange (0, M_PI); part->x += q * cos (p); part->y += q * sin (p); } //Speed part->vx = rRange (e->vx, e->dvx); // X Speed part->vy = rRange (e->vy, e->dvy); // Y Speed if ((q = rRange (e->dvcirc / 2.0f, e->dvcirc / 2.0f)) > 0) { p = rRange (0, M_PI); part->vx += q * cos (p); part->vy += q * sin (p); } part->vt = rRange (e->vt, e->dvt); // Aging speed if (part->vt > -0.0001f) part->vt = -0.0001f; //Size, Gravity and Rotation part->s = rRange (e->s, e->ds); // Particle size part->snew = rRange (e->snew, e->dsnew); // Particle start size if (e->gp > (float)(random () & 0xffff) / 65535.0f) part->g = rRange (e->g, e->dg); // Particle gravity else part->g = 0.0f; part->phi = rRange (0, M_PI); // Random orientation part->vphi = rRange (e->vphi, e->dvphi); // Rotation speed //Alpha part->a = rRange (e->a, e->da); // Alpha if (part->a > 1) part->a = 1.0f; else if (part->a < 0) part->a = 0.0f; //HSL to RGB conversion from Wikipedia simplified by S = 1 h = rRange (e->h, e->dh); //Random hue within range if (h < 0) h += 1.0f; else if (t > 1) h -= 1.0f; l = rRange (e->l, e->dl); //Random lightness ... if (l > 1) l = 1.0f; else if (l < 0) l = 0.0f; q = e->l * 2; if (q > 1) q = 1.0f; p = 2 * e->l - q; for (j = 0; j < 3; j++) { t = h + (1-j)/3.0f; if (t < 0) t += 1.0f; else if (t > 1) t -= 1.0f; if (t < 1/6.) part->c[j] = p + ((q-p)*6*t); else if (t < 0.5f) part->c[j] = q; else if (t < 2/3.) part->c[j] = p + ((q-p)*6*(2/3.-t)); else part->c[j] = p; } // give new life part->t = 1.0f; active = true; count -= 1; } } } void WizardScreen::positionUpdate (const CompPoint &pos) { mx = pos.x (); my = pos.y (); if (ps.init && active) { Emitter *ei = &(ps.e[0]); GPoint *gi = &(ps.g[0]); for (unsigned int i = 0; i < ps.g.size (); ++i, ++gi) { if (gi->movement == MOVEMENT_MOUSEPOSITION) { gi->x = pos.x (); gi->y = pos.y (); } } for (unsigned int i = 0; i < ps.e.size (); ++i, ++ei) { if (ei->movement == MOVEMENT_MOUSEPOSITION) { ei->x = pos.x (); ei->y = pos.y (); } if (ei->active && ei->trigger == TRIGGER_MOUSEMOVEMENT) ps.genNewParticles (ei); } } } void WizardScreen::preparePaint (int time) { if (active && !pollHandle.active ()) pollHandle.start (); if (active && !ps.init) { ps.init = true; loadGPoints (); loadEmitters (); ps.initParticles (optionGetHardLimit (), optionGetSoftLimit ()); ps.darken = optionGetDarken (); ps.blendMode = (optionGetBlend ()) ? GL_ONE : GL_ONE_MINUS_SRC_ALPHA; ps.tnew = optionGetTnew (); ps.told = optionGetTold (); ps.gx = optionGetGx (); ps.gy = optionGetGy (); ps.active = true; glGenTextures (1, &ps.tex); glBindTexture (GL_TEXTURE_2D, ps.tex); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, particleTex); glBindTexture (GL_TEXTURE_2D, 0); } if (ps.init && active) { Emitter *ei = &(ps.e[0]); GPoint *gi = &(ps.g[0]); for (unsigned int i = 0; i < ps.g.size (); ++i, ++gi) { if (gi->movement == MOVEMENT_BOUNCE || gi->movement == MOVEMENT_WRAP) { gi->x += gi->espeed * cos (gi->eangle) * time; gi->y += gi->espeed * sin (gi->eangle) * time; if (gi->x >= screen->width ()) { if (gi->movement == MOVEMENT_BOUNCE) { gi->x = 2*screen->width () - gi->x - 1; gi->eangle = M_PI - gi->eangle; } else if (gi->movement == MOVEMENT_WRAP) gi->x -= screen->width (); } else if (gi->x < 0) { if (gi->movement == MOVEMENT_BOUNCE) { gi->x *= -1; gi->eangle = M_PI - gi->eangle; } else if (gi->movement == MOVEMENT_WRAP) gi->x += screen->width (); } if (gi->y >= screen->height ()) { if (gi->movement == MOVEMENT_BOUNCE) { gi->y = 2*screen->height () - gi->y - 1; gi->eangle *= -1; } else if (gi->movement == MOVEMENT_WRAP) gi->y -= screen->height (); } else if (gi->y < 0) { if (gi->movement == MOVEMENT_BOUNCE) { gi->y *= -1; gi->eangle *= -1; } else if (gi->movement == MOVEMENT_WRAP) gi->y += screen->height (); } } if (gi->movement == MOVEMENT_FOLLOWMOUSE && (my!=gi->y||mx!=gi->x)) { gi->eangle = atan2(my-gi->y, mx-gi->x); gi->x += gi->espeed * cos(gi->eangle) * time; gi->y += gi->espeed * sin(gi->eangle) * time; } } for (unsigned int i = 0; i < ps.e.size (); ++i, ++ei) { if (ei->movement == MOVEMENT_BOUNCE || ei->movement == MOVEMENT_WRAP) { ei->x += ei->espeed * cos (ei->eangle) * time; ei->y += ei->espeed * sin (ei->eangle) * time; if (ei->x >= screen->width ()) { if (ei->movement == MOVEMENT_BOUNCE) { ei->x = 2*screen->width () - ei->x - 1; ei->eangle = M_PI - ei->eangle; } else if (ei->movement == MOVEMENT_WRAP) ei->x -= screen->width (); } else if (ei->x < 0) { if (ei->movement == MOVEMENT_BOUNCE) { ei->x *= -1; ei->eangle = M_PI - ei->eangle; } else if (ei->movement == MOVEMENT_WRAP) ei->x += screen->width (); } if (ei->y >= screen->height ()) { if (ei->movement == MOVEMENT_BOUNCE) { ei->y = 2*screen->height () - ei->y - 1; ei->eangle *= -1; } else if (ei->movement == MOVEMENT_WRAP) ei->y -= screen->height (); } else if (ei->y < 0) { if (ei->movement == MOVEMENT_BOUNCE) { ei->y *= -1; ei->eangle *= -1; } else if (ei->movement == MOVEMENT_WRAP) ei->y += screen->height (); } } if (ei->movement == MOVEMENT_FOLLOWMOUSE && (my!=ei->y||mx!=ei->x)) { ei->eangle = atan2 (my-ei->y, mx-ei->x); ei->x += ei->espeed * cos (ei->eangle) * time; ei->y += ei->espeed * sin (ei->eangle) * time; } if (ei->trigger == TRIGGER_RANDOMPERIOD && ei->set_active && !((int)random ()&0xff)) ei->active = !ei->active; if (ei->active && ( (ei->trigger == TRIGGER_PERSISTENT) || (ei->trigger == TRIGGER_RANDOMSHOT && !((int)random()&0xff)) || (ei->trigger == TRIGGER_RANDOMPERIOD) )) ps.genNewParticles (ei); } } if (ps.active) { ps.updateParticles (time); cScreen->damageScreen (); } cScreen->preparePaint (time); } void WizardScreen::donePaint () { if (active || ps.active) cScreen->damageScreen (); if (!active && pollHandle.active ()) pollHandle.stop (); if (!active && !ps.active) { ps.finiParticles (); toggleFunctions (false); } cScreen->donePaint (); } bool WizardScreen::glPaintOutput (const GLScreenPaintAttrib &sa, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (sa, transform, region, output, mask); GLMatrix sTransform = transform; if (!ps.active) return status; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); ps.drawParticles (sTransform); return status; } bool WizardScreen::toggle () { active = !active; if (active) toggleFunctions (true); cScreen->damageScreen (); return true; } void WizardScreen::toggleFunctions(bool enabled) { cScreen->preparePaintSetEnabled (this, enabled); cScreen->donePaintSetEnabled (this, enabled); gScreen->glPaintOutputSetEnabled (this, enabled); } void WizardScreen::optionChanged (CompOption *opt, WizardOptions::Options num) { /* checked seperately to allow testing * the results of individual settings * without disturbing the particles * already on the screen */ if (opt->name () == "hard_limit") ps.initParticles (optionGetHardLimit (), optionGetSoftLimit ()); else if (opt->name () == "soft_limit") ps.softLimit = optionGetSoftLimit (); else if (opt->name () == "darken") ps.darken = optionGetDarken (); else if (opt->name () == "blend") ps.blendMode = (optionGetBlend ()) ? GL_ONE : GL_ONE_MINUS_SRC_ALPHA; else if (opt->name () == "tnew") ps.tnew = optionGetTnew (); else if (opt->name () == "told") ps.told = optionGetTold (); else if (opt->name () == "gx") ps.gx = optionGetGx (); else if (opt->name () == "gy") ps.gy = optionGetGy (); else { loadGPoints (); loadEmitters (); } } WizardScreen::WizardScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), active (false) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); #define optionNotify(name) \ optionSet##name##Notify (boost::bind (&WizardScreen::optionChanged, \ this, _1, _2)) optionNotify (HardLimit); optionNotify (SoftLimit); optionNotify (Darken); optionNotify (Blend); optionNotify (Tnew); optionNotify (Told); optionNotify (Gx); optionNotify (Gy); optionNotify (GStrength); optionNotify (GPosx); optionNotify (GPosy); optionNotify (GSpeed); optionNotify (GAngle); optionNotify (GMovement); optionNotify (EActive); optionNotify (EName); optionNotify (ETrigger); optionNotify (EPosx); optionNotify (EPosy); optionNotify (ESpeed); optionNotify (EAngle); optionNotify (GMovement); optionNotify (ECount); optionNotify (EH); optionNotify (EDh); optionNotify (EL); optionNotify (EDl); optionNotify (EA); optionNotify (EDa); optionNotify (EDx); optionNotify (EDy); optionNotify (EDcirc); optionNotify (EVx); optionNotify (EVy); optionNotify (EVt); optionNotify (EVphi); optionNotify (EDvx); optionNotify (EDvy); optionNotify (EDvcirc); optionNotify (EDvt); optionNotify (EDvphi); optionNotify (ES); optionNotify (EDs); optionNotify (ESnew); optionNotify (EDsnew); optionNotify (EG); optionNotify (EDg); optionNotify (EGp); #undef optionNotify pollHandle.setCallback (boost::bind (&WizardScreen::positionUpdate, this, _1)); optionSetToggleInitiate (boost::bind (&WizardScreen::toggle, this)); } WizardScreen::~WizardScreen () { if (pollHandle.active ()) pollHandle.stop (); if (ps.active) cScreen->damageScreen (); } bool WizardPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("mousepoll", COMPIZ_MOUSEPOLL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/wizard/include/0000755000015301777760000000000012321344021022100 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wizard/include/wizard.h0000644000015301777760000001360112321343002023550 0ustar pbusernogroup00000000000000/* * Compiz wizard particle system plugin * * wizard.h * * Written by : Sebastian Kuhlen * E-mail : DiCon@tankwar.de * * Ported to Compiz 0.9.x * Copyright : (c) 2010 Scott Moreau * * This plugin and parts of its code have been inspired by the showmouse plugin * by Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include "wizard_options.h" #include "wizard_tex.h" extern const unsigned short CACHESIZE_FACTOR; extern const unsigned short COORD_COMPONENTS; extern const unsigned short VERTEX_COMPONENTS; extern const unsigned short COLOR_COMPONENTS; static float rRange (float avg, float range) { return avg + (float)((random () & 0xff)/127.5-1.)*range; } typedef enum { TRIGGER_PERSISTENT = 0, TRIGGER_MOUSEMOVEMENT, TRIGGER_RANDOMSHOT, TRIGGER_RANDOMPERIOD } TriggerType; typedef enum { MOVEMENT_MOUSEPOSITION = 0, MOVEMENT_FOLLOWMOUSE, MOVEMENT_BOUNCE, MOVEMENT_WRAP } MovementType; class GPoint { public: float strength; // Strength of this gravity source float x; // X position float y; // Y position float espeed; // Speed of the gravity source float eangle; // Angle for the movement of this gravity source int movement; // Type of movement of this gravity source }; class Particle { public: float c[3]; // Color float a; // alpha value float x; // X position float y; // Y position float t; // t position (age, born at 1, dies at 0) float phi; // Orientation of texture float vx; // X speed float vy; // Y speed float vt; // t speed (aging speed) float vphi; // Rotation speed float s; // size (side of the square) float snew; // Size when born (reduced to s while new) float g; // Gravity from this particle }; class Emitter { public: bool set_active; // Set to active in the settings bool active; // Currently active (differs from set_active for // the random period trigger) int trigger; // When to generate particles int count; // Amount of particles to be generated float h; // color hue (0..1) float dh; // color hue range float l; // color lightness (0..1) float dl; // color lightness range float a; // Alpha float da; // Alpha range float x; // X position float y; // Y position float espeed; // Speed of the emitter float eangle; // Angle for the movement of this emitter int movement; // Type of movement of this emitter float dx; // X range float dy; // Y range float dcirc; // Circular range float vx; // X speed float vy; // Y speed float vt; // t speed (aging speed) float vphi; // Rotation speed float dvx; // X speed range float dvy; // Y speed range float dvcirc; // Circular speed range float dvt; // t speed (aging speed) range float dvphi; // Rotation speed range float s; // size (side of the square) float ds; // size (side of the square) range float snew; // Size when born (reduced to s while new) float dsnew; // Size when born (reduced to s while new) range float g; // Gravity of particles float dg; // Gravity range float gp; // Part of particles that have gravity }; class ParticleSystem { public: ParticleSystem (); int hardLimit; // Not to be exceeded int softLimit; // If exceeded, old particles age faster int lastCount; // Living particle count to evaluate softLimit float tnew; // Particle is new if t > tnew float told; // Particle is old if t < told float gx; // Global gravity x float gy; // Global gravity y std::vector particles; // The actual particles GLuint tex; // Particle Texture bool active, init; float darken; // Darken background GLuint blendMode; std::vector e; // All emitters in here std::vector g; // All gravity point sources in here /* Cache used in drawParticles It's here to avoid multiple mem allocation during drawing */ std::vector vertices_cache; std::vector coords_cache; std::vector colors_cache; std::vector dcolors_cache; void initParticles (int f_hardLimit, int f_softLimit); void drawParticles (const GLMatrix &transform); void updateParticles (float time); void genNewParticles (Emitter *e); void finiParticles (); }; class WizardScreen : public PluginClassHandler , public WizardOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: WizardScreen (CompScreen *screen); ~WizardScreen (); CompositeScreen *cScreen; GLScreen *gScreen; int mx, my; //Mouse Position from polling bool active; ParticleSystem ps; MousePoller pollHandle; void loadGPoints (); void loadEmitters (); void positionUpdate (const CompPoint &pos); void preparePaint (int time); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &sa, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); bool toggle (); void toggleFunctions(bool enabled); void optionChanged (CompOption *opt, WizardOptions::Options num); }; class WizardPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; COMPIZ_PLUGIN_20090315 (wizard, WizardPluginVTable); compiz-0.9.11+14.04.20140409/plugins/wizard/include/wizard_tex.h0000755000015301777760000065640512321343002024452 0ustar pbusernogroup00000000000000/* * Compiz wizard particle system plugin * Texture of a single particle. Generated using GIMP. * * wizard_tex.h * * Written by : Sebastian Kuhlen * E-mail : DiCon@tankwar.de * * Ported to Compiz 0.9.x * Copyright : (c) 2010 Scott Moreau * * This plugin and parts of its code have been inspired by the showmouse plugin * by Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ static const unsigned char particleTex[65536] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\4\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377" "\377\377\3\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\4\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\4\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2" "\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\7\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\5\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377" "\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\5\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377" "\7\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\6" "\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377" "\7\377\377\377\6\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\6\377" "\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\6\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\5\377\377\377\4\377\377\377" "\3\377\377\377\2\377\377\377\1\377\377\377\2\377\377\377\4\377\377\377\5" "\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\10" "\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377" "\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\7\377\377\377" "\5\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\2" "\377\377\377\4\377\377\377\5\377\377\377\7\377\377\377\11\377\377\377\12" "\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\7" "\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377" "\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377" "\377\377\10\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377\3\377\377" "\377\2\377\377\377\1\377\377\377\3\377\377\377\5\377\377\377\6\377\377\377" "\10\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377" "\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377" "\377\5\377\377\377\6\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377" "\377\10\377\377\377\7\377\377\377\5\377\377\377\3\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\5\377\377\377\7\377\377\377\11\377\377\377\14" "\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\5\377" "\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377" "\377\377\12\377\377\377\11\377\377\377\7\377\377\377\5\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\4\377\377\377\6\377\377\377\10\377\377" "\377\13\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\13\377\377" "\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377" "\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377" "\377\377\7\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7" "\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377" "\7\377\377\377\5\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\4" "\377\377\377\6\377\377\377\11\377\377\377\14\377\377\377\15\377\377\377\15" "\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377" "\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377" "\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1\377" "\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377" "\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\4\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10" "\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\6" "\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377" "\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377" "\377\12\377\377\377\13\377\377\377\13\377\377\377\10\377\377\377\6\377\377" "\377\4\377\377\377\2\377\377\377\3\377\377\377\5\377\377\377\7\377\377\377" "\12\377\377\377\15\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377" "\14\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377" "\377\12\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\5\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12" "\377\377\377\14\377\377\377\13\377\377\377\10\377\377\377\6\377\377\377\4" "\377\377\377\2\377\377\377\3\377\377\377\5\377\377\377\10\377\377\377\13" "\377\377\377\17\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377" "\14\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\11\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\3" "\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\6\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377" "\377\11\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377" "\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377" "\5\377\377\377\5\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\7\377\377\377\11\377\377\377\11\377\377\377\13" "\377\377\377\14\377\377\377\14\377\377\377\12\377\377\377\7\377\377\377\5" "\377\377\377\2\377\377\377\3\377\377\377\6\377\377\377\11\377\377\377\15" "\377\377\377\21\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377" "\15\377\377\377\14\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377" "\12\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\3" "\377\377\377\2\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\4\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10" "\377\377\377\11\377\377\377\13\377\377\377\14\377\377\377\13\377\377\377" "\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377" "\5\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6" "\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\11\377\377\377\12" "\377\377\377\13\377\377\377\15\377\377\377\16\377\377\377\12\377\377\377" "\7\377\377\377\5\377\377\377\2\377\377\377\4\377\377\377\7\377\377\377\13" "\377\377\377\16\377\377\377\22\377\377\377\21\377\377\377\17\377\377\377" "\16\377\377\377\15\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377" "\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\4\377\377\377" "\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377" "\377\377\3\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377" "\377\10\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\13\377\377\377" "\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10" "\377\377\377\11\377\377\377\13\377\377\377\14\377\377\377\16\377\377\377" "\17\377\377\377\13\377\377\377\10\377\377\377\5\377\377\377\3\377\377\377" "\4\377\377\377\10\377\377\377\14\377\377\377\20\377\377\377\22\377\377\377" "\22\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377" "\14\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377" "\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377" "\5\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10" "\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377\7" "\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\14\377\377\377" "\16\377\377\377\15\377\377\377\14\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12" "\377\377\377\13\377\377\377\15\377\377\377\17\377\377\377\20\377\377\377" "\13\377\377\377\10\377\377\377\5\377\377\377\3\377\377\377\5\377\377\377" "\11\377\377\377\15\377\377\377\22\377\377\377\24\377\377\377\22\377\377\377" "\21\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377\16\377\377\377" "\15\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377" "\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\5\377\377\377" "\3\377\377\377\3\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377" "\12\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377" "\11\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\10\377\377\377\11\377\377\377\13\377\377\377\14\377\377\377\16\377\377\377" "\17\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377" "\14\377\377\377\15\377\377\377\17\377\377\377\21\377\377\377\15\377\377\377" "\11\377\377\377\5\377\377\377\3\377\377\377\5\377\377\377\12\377\377\377" "\17\377\377\377\25\377\377\377\25\377\377\377\24\377\377\377\22\377\377\377" "\20\377\377\377\17\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377" "\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\11\377\377\377\10\377\377\377\6\377\377\377\4\377\377\377\3\377\377\377" "\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377" "\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\11" "\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377\13\377\377\377" "\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377" "\7\377\377\377\10\377\377\377\13\377\377\377\14\377\377\377\16\377\377\377" "\20\377\377\377\20\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377" "\14\377\377\377\16\377\377\377\20\377\377\377\22\377\377\377\16\377\377\377" "\12\377\377\377\5\377\377\377\3\377\377\377\6\377\377\377\13\377\377\377" "\20\377\377\377\27\377\377\377\26\377\377\377\24\377\377\377\22\377\377\377" "\21\377\377\377\20\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377" "\15\377\377\377\14\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377" "\11\377\377\377\7\377\377\377\5\377\377\377\4\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\5\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\7\377" "\377\377\10\377\377\377\11\377\377\377\14\377\377\377\16\377\377\377\16\377" "\377\377\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\10\377" "\377\377\7\377\377\377\10\377\377\377\12\377\377\377\14\377\377\377\15\377" "\377\377\20\377\377\377\22\377\377\377\20\377\377\377\17\377\377\377\14\377" "\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\10\377" "\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377" "\377\377\14\377\377\377\17\377\377\377\21\377\377\377\23\377\377\377\17\377" "\377\377\12\377\377\377\6\377\377\377\3\377\377\377\7\377\377\377\15\377" "\377\377\22\377\377\377\30\377\377\377\27\377\377\377\25\377\377\377\23\377" "\377\377\22\377\377\377\21\377\377\377\20\377\377\377\20\377\377\377\17\377" "\377\377\16\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\12\377" "\377\377\10\377\377\377\6\377\377\377\4\377\377\377\3\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\6" "\377\377\377\7\377\377\377\11\377\377\377\13\377\377\377\15\377\377\377\17" "\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377" "\12\377\377\377\11\377\377\377\10\377\377\377\11\377\377\377\13\377\377\377" "\15\377\377\377\20\377\377\377\22\377\377\377\23\377\377\377\20\377\377\377" "\16\377\377\377\14\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377" "\14\377\377\377\16\377\377\377\17\377\377\377\22\377\377\377\24\377\377\377" "\20\377\377\377\12\377\377\377\7\377\377\377\4\377\377\377\10\377\377\377" "\16\377\377\377\26\377\377\377\32\377\377\377\30\377\377\377\26\377\377\377" "\24\377\377\377\22\377\377\377\22\377\377\377\21\377\377\377\20\377\377\377" "\17\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377" "\12\377\377\377\7\377\377\377\5\377\377\377\3\377\377\377\2\377\377\377\1" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377" "\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377\12\377\377\377\14" "\377\377\377\16\377\377\377\21\377\377\377\20\377\377\377\20\377\377\377" "\16\377\377\377\15\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\12\377\377\377\15\377\377\377\17\377\377\377\22\377\377\377\25\377\377\377" "\23\377\377\377\21\377\377\377\16\377\377\377\14\377\377\377\12\377\377\377" "\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377" "\12\377\377\377\14\377\377\377\16\377\377\377\20\377\377\377\23\377\377\377" "\26\377\377\377\21\377\377\377\13\377\377\377\7\377\377\377\4\377\377\377" "\12\377\377\377\20\377\377\377\30\377\377\377\33\377\377\377\31\377\377\377" "\27\377\377\377\25\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377" "\21\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377" "\14\377\377\377\11\377\377\377\7\377\377\377\4\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\4\377\377\377\5\377\377\377\5" "\377\377\377\7\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\7\377" "\377\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377" "\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\6\377\377" "\377\7\377\377\377\10\377\377\377\12\377\377\377\15\377\377\377\20\377\377" "\377\23\377\377\377\22\377\377\377\21\377\377\377\17\377\377\377\15\377\377" "\377\14\377\377\377\12\377\377\377\12\377\377\377\14\377\377\377\16\377\377" "\377\21\377\377\377\24\377\377\377\26\377\377\377\23\377\377\377\20\377\377" "\377\16\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377" "\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\16\377\377" "\377\21\377\377\377\23\377\377\377\27\377\377\377\22\377\377\377\14\377\377" "\377\7\377\377\377\5\377\377\377\13\377\377\377\22\377\377\377\34\377\377" "\377\35\377\377\377\33\377\377\377\30\377\377\377\26\377\377\377\25\377\377" "\377\24\377\377\377\23\377\377\377\22\377\377\377\21\377\377\377\17\377\377" "\377\16\377\377\377\15\377\377\377\12\377\377\377\10\377\377\377\5\377\377" "\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\4\377\377\377" "\5\377\377\377\6\377\377\377\10\377\377\377\11\377\377\377\10\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4" "\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\4\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\7\377\377\377" "\11\377\377\377\14\377\377\377\16\377\377\377\21\377\377\377\25\377\377\377" "\24\377\377\377\22\377\377\377\21\377\377\377\17\377\377\377\15\377\377\377" "\13\377\377\377\13\377\377\377\16\377\377\377\20\377\377\377\23\377\377\377" "\27\377\377\377\26\377\377\377\23\377\377\377\21\377\377\377\16\377\377\377" "\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377" "\14\377\377\377\15\377\377\377\17\377\377\377\22\377\377\377\25\377\377\377" "\30\377\377\377\24\377\377\377\15\377\377\377\7\377\377\377\5\377\377\377" "\14\377\377\377\25\377\377\377\37\377\377\377\36\377\377\377\33\377\377\377" "\31\377\377\377\27\377\377\377\26\377\377\377\25\377\377\377\24\377\377\377" "\23\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377\15\377\377\377" "\11\377\377\377\6\377\377\377\4\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\4\377\377\377\5\377\377\377\7\377\377\377\10\377\377\377\11" "\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\11\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\2\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377\12" "\377\377\377\14\377\377\377\17\377\377\377\22\377\377\377\26\377\377\377" "\26\377\377\377\24\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377" "\14\377\377\377\15\377\377\377\17\377\377\377\23\377\377\377\27\377\377\377" "\32\377\377\377\27\377\377\377\23\377\377\377\20\377\377\377\15\377\377\377" "\15\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\14\377\377\377" "\15\377\377\377\17\377\377\377\22\377\377\377\25\377\377\377\31\377\377\377" "\25\377\377\377\15\377\377\377\10\377\377\377\7\377\377\377\16\377\377\377" "\30\377\377\377\"\377\377\377\37\377\377\377\35\377\377\377\32\377\377\377" "\31\377\377\377\30\377\377\377\26\377\377\377\25\377\377\377\23\377\377\377" "\22\377\377\377\20\377\377\377\17\377\377\377\13\377\377\377\7\377\377\377" "\5\377\377\377\3\377\377\377\1\377\377\377\3\377\377\377\4\377\377\377\6" "\377\377\377\7\377\377\377\11\377\377\377\13\377\377\377\12\377\377\377\12" "\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\11\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377" "\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377" "\13\377\377\377\15\377\377\377\20\377\377\377\24\377\377\377\30\377\377\377" "\30\377\377\377\26\377\377\377\24\377\377\377\21\377\377\377\16\377\377\377" "\14\377\377\377\17\377\377\377\22\377\377\377\26\377\377\377\31\377\377\377" "\33\377\377\377\27\377\377\377\23\377\377\377\20\377\377\377\16\377\377\377" "\14\377\377\377\13\377\377\377\12\377\377\377\14\377\377\377\16\377\377\377" "\20\377\377\377\23\377\377\377\27\377\377\377\33\377\377\377\30\377\377\377" "\17\377\377\377\10\377\377\377\10\377\377\377\20\377\377\377\33\377\377\377" "$\377\377\377!\377\377\377\36\377\377\377\33\377\377\377\31\377\377\377\30" "\377\377\377\27\377\377\377\26\377\377\377\24\377\377\377\22\377\377\377" "\20\377\377\377\15\377\377\377\11\377\377\377\7\377\377\377\4\377\377\377" "\2\377\377\377\3\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377\12" "\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377" "\13\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\6\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\5\377\377\377\6\377\377\377\5\377\377\377\7\377\377\377\11\377\377" "\377\13\377\377\377\16\377\377\377\22\377\377\377\26\377\377\377\32\377\377" "\377\32\377\377\377\30\377\377\377\25\377\377\377\22\377\377\377\17\377\377" "\377\15\377\377\377\20\377\377\377\24\377\377\377\30\377\377\377\35\377\377" "\377\33\377\377\377\27\377\377\377\23\377\377\377\17\377\377\377\15\377\377" "\377\15\377\377\377\14\377\377\377\15\377\377\377\17\377\377\377\21\377\377" "\377\24\377\377\377\27\377\377\377\34\377\377\377\31\377\377\377\20\377\377" "\377\10\377\377\377\11\377\377\377\22\377\377\377\37\377\377\377%\377\377" "\377!\377\377\377\36\377\377\377\34\377\377\377\33\377\377\377\32\377\377" "\377\31\377\377\377\26\377\377\377\24\377\377\377\23\377\377\377\21\377\377" "\377\14\377\377\377\10\377\377\377\5\377\377\377\2\377\377\377\3\377\377" "\377\5\377\377\377\6\377\377\377\11\377\377\377\13\377\377\377\14\377\377" "\377\14\377\377\377\14\377\377\377\13\377\377\377\14\377\377\377\14\377\377" "\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\7\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\6\377\377\377\7\377\377\377" "\11\377\377\377\14\377\377\377\17\377\377\377\23\377\377\377\27\377\377\377" "\35\377\377\377\35\377\377\377\32\377\377\377\27\377\377\377\24\377\377\377" "\20\377\377\377\20\377\377\377\23\377\377\377\30\377\377\377\34\377\377\377" "\40\377\377\377\33\377\377\377\26\377\377\377\22\377\377\377\20\377\377\377" "\16\377\377\377\15\377\377\377\15\377\377\377\17\377\377\377\21\377\377\377" "\24\377\377\377\30\377\377\377\34\377\377\377\33\377\377\377\20\377\377\377" "\10\377\377\377\12\377\377\377\25\377\377\377#\377\377\377&\377\377\377\"" "\377\377\377\37\377\377\377\35\377\377\377\34\377\377\377\32\377\377\377" "\31\377\377\377\27\377\377\377\25\377\377\377\23\377\377\377\16\377\377\377" "\11\377\377\377\6\377\377\377\3\377\377\377\3\377\377\377\5\377\377\377\10" "\377\377\377\11\377\377\377\13\377\377\377\16\377\377\377\16\377\377\377" "\15\377\377\377\15\377\377\377\15\377\377\377\14\377\377\377\14\377\377\377" "\14\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7" "\377\377\377\11\377\377\377\15\377\377\377\20\377\377\377\24\377\377\377" "\31\377\377\377\37\377\377\377\40\377\377\377\34\377\377\377\31\377\377\377" "\24\377\377\377\20\377\377\377\21\377\377\377\26\377\377\377\33\377\377\377" "!\377\377\377!\377\377\377\33\377\377\377\26\377\377\377\21\377\377\377\20" "\377\377\377\16\377\377\377\15\377\377\377\17\377\377\377\21\377\377\377" "\24\377\377\377\30\377\377\377\35\377\377\377\34\377\377\377\21\377\377\377" "\11\377\377\377\13\377\377\377\27\377\377\377'\377\377\377&\377\377\377#" "\377\377\377\37\377\377\377\36\377\377\377\34\377\377\377\33\377\377\377" "\31\377\377\377\27\377\377\377\25\377\377\377\22\377\377\377\14\377\377\377" "\7\377\377\377\4\377\377\377\2\377\377\377\5\377\377\377\10\377\377\377\12" "\377\377\377\15\377\377\377\17\377\377\377\17\377\377\377\17\377\377\377" "\16\377\377\377\16\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377" "\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10" "\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\12\377\377\377\15\377\377\377" "\21\377\377\377\25\377\377\377\33\377\377\377\"\377\377\377\"\377\377\377" "\36\377\377\377\32\377\377\377\26\377\377\377\21\377\377\377\24\377\377\377" "\31\377\377\377\37\377\377\377&\377\377\377\40\377\377\377\32\377\377\377" "\24\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377\17\377\377\377" "\21\377\377\377\24\377\377\377\31\377\377\377\36\377\377\377\36\377\377\377" "\22\377\377\377\11\377\377\377\15\377\377\377\33\377\377\377,\377\377\377" "'\377\377\377#\377\377\377\40\377\377\377\37\377\377\377\35\377\377\377\33" "\377\377\377\31\377\377\377\27\377\377\377\25\377\377\377\17\377\377\377" "\12\377\377\377\6\377\377\377\2\377\377\377\5\377\377\377\10\377\377\377" "\13\377\377\377\16\377\377\377\21\377\377\377\20\377\377\377\20\377\377\377" "\20\377\377\377\17\377\377\377\17\377\377\377\17\377\377\377\15\377\377\377" "\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7" "\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\11" "\377\377\377\11\377\377\377\11\377\377\377\12\377\377\377\11\377\377\377" "\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\12\377\377\377\15\377\377\377\21\377\377\377\26\377\377\377\35\377\377\377" "%\377\377\377&\377\377\377\"\377\377\377\35\377\377\377\27\377\377\377\23" "\377\377\377\27\377\377\377\35\377\377\377#\377\377\377&\377\377\377\37\377" "\377\377\30\377\377\377\23\377\377\377\21\377\377\377\17\377\377\377\17\377" "\377\377\22\377\377\377\25\377\377\377\31\377\377\377\37\377\377\377!\377" "\377\377\23\377\377\377\11\377\377\377\17\377\377\377\37\377\377\377-\377" "\377\377(\377\377\377$\377\377\377!\377\377\377\37\377\377\377\36\377\377" "\377\34\377\377\377\31\377\377\377\27\377\377\377\22\377\377\377\14\377\377" "\377\7\377\377\377\4\377\377\377\6\377\377\377\11\377\377\377\14\377\377" "\377\20\377\377\377\22\377\377\377\22\377\377\377\22\377\377\377\21\377\377" "\377\21\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377\14\377\377" "\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\7\377" "\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11\377" "\377\377\11\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\13\377" "\377\377\13\377\377\377\13\377\377\377\12\377\377\377\13\377\377\377\12\377" "\377\377\12\377\377\377\12\377\377\377\15\377\377\377\22\377\377\377\30\377" "\377\377\37\377\377\377(\377\377\377*\377\377\377$\377\377\377\37\377\377" "\377\30\377\377\377\25\377\377\377\32\377\377\377\40\377\377\377(\377\377" "\377%\377\377\377\35\377\377\377\26\377\377\377\23\377\377\377\21\377\377" "\377\17\377\377\377\22\377\377\377\25\377\377\377\32\377\377\377\40\377\377" "\377#\377\377\377\24\377\377\377\11\377\377\377\21\377\377\377#\377\377\377" ".\377\377\377)\377\377\377$\377\377\377\"\377\377\377\40\377\377\377\36\377" "\377\377\34\377\377\377\31\377\377\377\26\377\377\377\16\377\377\377\10\377" "\377\377\4\377\377\377\5\377\377\377\11\377\377\377\15\377\377\377\22\377" "\377\377\24\377\377\377\24\377\377\377\23\377\377\377\23\377\377\377\23\377" "\377\377\22\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377\14\377" "\377\377\13\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\10\377" "\377\377\10\377\377\377\7\377\377\377\10\377\377\377\7\377\377\377\7\377" "\377\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\11\377" "\377\377\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\13\377" "\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377" "\377\377\14\377\377\377\13\377\377\377\14\377\377\377\13\377\377\377\16\377" "\377\377\23\377\377\377\31\377\377\377!\377\377\377,\377\377\377.\377\377" "\377'\377\377\377\40\377\377\377\31\377\377\377\27\377\377\377\35\377\377" "\377%\377\377\377,\377\377\377#\377\377\377\33\377\377\377\25\377\377\377" "\22\377\377\377\20\377\377\377\22\377\377\377\25\377\377\377\32\377\377\377" "!\377\377\377&\377\377\377\25\377\377\377\11\377\377\377\24\377\377\377)" "\377\377\3770\377\377\377*\377\377\377&\377\377\377#\377\377\377!\377\377" "\377\37\377\377\377\34\377\377\377\31\377\377\377\21\377\377\377\12\377\377" "\377\5\377\377\377\5\377\377\377\11\377\377\377\16\377\377\377\23\377\377" "\377\26\377\377\377\26\377\377\377\25\377\377\377\25\377\377\377\24\377\377" "\377\24\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377\15\377\377" "\377\13\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377" "\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\10\377\377" "\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377" "\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377" "\377\377\12\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377\14\377" "\377\377\14\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377\16\377" "\377\377\16\377\377\377\16\377\377\377\15\377\377\377\16\377\377\377\15\377" "\377\377\14\377\377\377\16\377\377\377\24\377\377\377\33\377\377\377$\377" "\377\377/\377\377\3771\377\377\377)\377\377\377!\377\377\377\31\377\377\377" "\32\377\377\377!\377\377\377*\377\377\377*\377\377\377!\377\377\377\30\377" "\377\377\24\377\377\377\22\377\377\377\22\377\377\377\26\377\377\377\33\377" "\377\377\"\377\377\377*\377\377\377\26\377\377\377\11\377\377\377\30\377" "\377\3770\377\377\3771\377\377\377+\377\377\377'\377\377\377%\377\377\377" "\"\377\377\377\37\377\377\377\34\377\377\377\26\377\377\377\15\377\377\377" "\7\377\377\377\5\377\377\377\11\377\377\377\16\377\377\377\24\377\377\377" "\27\377\377\377\27\377\377\377\27\377\377\377\30\377\377\377\27\377\377\377" "\26\377\377\377\23\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377" "\14\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\12\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377" "\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5" "\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11" "\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\14\377\377\377" "\14\377\377\377\15\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377" "\17\377\377\377\17\377\377\377\20\377\377\377\17\377\377\377\20\377\377\377" "\17\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377\25\377\377\377" "\34\377\377\377%\377\377\3771\377\377\3774\377\377\377+\377\377\377\"\377" "\377\377\31\377\377\377\35\377\377\377&\377\377\3771\377\377\377)\377\377" "\377\36\377\377\377\27\377\377\377\24\377\377\377\22\377\377\377\26\377\377" "\377\33\377\377\377#\377\377\377-\377\377\377\30\377\377\377\11\377\377\377" "\34\377\377\3779\377\377\3772\377\377\377,\377\377\377)\377\377\377&\377" "\377\377#\377\377\377\37\377\377\377\33\377\377\377\20\377\377\377\11\377" "\377\377\4\377\377\377\11\377\377\377\17\377\377\377\25\377\377\377\31\377" "\377\377\31\377\377\377\31\377\377\377\31\377\377\377\31\377\377\377\27\377" "\377\377\24\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377\15\377" "\377\377\14\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377\13\377" "\377\377\14\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\13\377" "\377\377\13\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377" "\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7\377" "\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377" "\377\377\15\377\377\377\15\377\377\377\17\377\377\377\17\377\377\377\20\377" "\377\377\20\377\377\377\20\377\377\377\22\377\377\377\22\377\377\377\22\377" "\377\377\21\377\377\377\22\377\377\377\21\377\377\377\20\377\377\377\17\377" "\377\377\24\377\377\377\34\377\377\377&\377\377\3773\377\377\3777\377\377" "\377-\377\377\377#\377\377\377\31\377\377\377\"\377\377\377,\377\377\377" "2\377\377\377&\377\377\377\33\377\377\377\27\377\377\377\24\377\377\377\26" "\377\377\377\34\377\377\377$\377\377\377/\377\377\377\31\377\377\377\12\377" "\377\377!\377\377\377<\377\377\3774\377\377\377-\377\377\377*\377\377\377" "'\377\377\377#\377\377\377\37\377\377\377\25\377\377\377\13\377\377\377\5" "\377\377\377\11\377\377\377\17\377\377\377\26\377\377\377\32\377\377\377" "\33\377\377\377\33\377\377\377\33\377\377\377\33\377\377\377\30\377\377\377" "\26\377\377\377\23\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377" "\15\377\377\377\16\377\377\377\15\377\377\377\16\377\377\377\15\377\377\377" "\15\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377" "\377\377\14\377\377\377\15\377\377\377\16\377\377\377\17\377\377\377\20\377" "\377\377\20\377\377\377\21\377\377\377\21\377\377\377\23\377\377\377\23\377" "\377\377\24\377\377\377\24\377\377\377\24\377\377\377\23\377\377\377\23\377" "\377\377\22\377\377\377\21\377\377\377\24\377\377\377\34\377\377\377'\377" "\377\3776\377\377\377;\377\377\377/\377\377\377$\377\377\377\35\377\377\377" "'\377\377\3774\377\377\3770\377\377\377#\377\377\377\32\377\377\377\26\377" "\377\377\26\377\377\377\34\377\377\377&\377\377\3772\377\377\377\33\377\377" "\377\14\377\377\377(\377\377\377>\377\377\3775\377\377\377/\377\377\377," "\377\377\377(\377\377\377#\377\377\377\33\377\377\377\17\377\377\377\6\377" "\377\377\11\377\377\377\20\377\377\377\30\377\377\377\34\377\377\377\35\377" "\377\377\35\377\377\377\35\377\377\377\33\377\377\377\31\377\377\377\26\377" "\377\377\24\377\377\377\22\377\377\377\17\377\377\377\17\377\377\377\20\377" "\377\377\17\377\377\377\20\377\377\377\17\377\377\377\20\377\377\377\17\377" "\377\377\17\377\377\377\16\377\377\377\16\377\377\377\15\377\377\377\14\377" "\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\11\377" "\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377" "\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377" "\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377" "\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377\17\377" "\377\377\20\377\377\377\22\377\377\377\22\377\377\377\23\377\377\377\24\377" "\377\377\25\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\30\377" "\377\377\27\377\377\377\26\377\377\377\24\377\377\377\23\377\377\377\23\377" "\377\377\34\377\377\377(\377\377\3779\377\377\377@\377\377\3772\377\377\377" "$\377\377\377\"\377\377\377.\377\377\377=\377\377\377-\377\377\377\36\377" "\377\377\31\377\377\377\26\377\377\377\35\377\377\377'\377\377\3775\377\377" "\377\35\377\377\377\17\377\377\3772\377\377\377A\377\377\3776\377\377\377" "2\377\377\377.\377\377\377(\377\377\377#\377\377\377\23\377\377\377\11\377" "\377\377\11\377\377\377\21\377\377\377\32\377\377\377\37\377\377\377\37\377" "\377\377\37\377\377\377\37\377\377\377\34\377\377\377\31\377\377\377\26\377" "\377\377\24\377\377\377\22\377\377\377\21\377\377\377\22\377\377\377\22\377" "\377\377\22\377\377\377\22\377\377\377\22\377\377\377\21\377\377\377\22\377" "\377\377\21\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377\15\377" "\377\377\15\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\12\377" "\377\377\11\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7\377" "\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377" "\377\377\16\377\377\377\17\377\377\377\21\377\377\377\22\377\377\377\24\377" "\377\377\25\377\377\377\26\377\377\377\27\377\377\377\30\377\377\377\30\377" "\377\377\32\377\377\377\32\377\377\377\31\377\377\377\30\377\377\377\27\377" "\377\377\25\377\377\377\23\377\377\377\34\377\377\377)\377\377\377<\377\377" "\377E\377\377\3775\377\377\377%\377\377\377'\377\377\3777\377\377\377;\377" "\377\377(\377\377\377\35\377\377\377\31\377\377\377\36\377\377\377(\377\377" "\3778\377\377\377\40\377\377\377\22\377\377\377>\377\377\377C\377\377\377" "9\377\377\3774\377\377\377.\377\377\377(\377\377\377\32\377\377\377\14\377" "\377\377\10\377\377\377\21\377\377\377\34\377\377\377!\377\377\377!\377\377" "\377\"\377\377\377!\377\377\377\35\377\377\377\32\377\377\377\27\377\377" "\377\24\377\377\377\23\377\377\377\23\377\377\377\24\377\377\377\25\377\377" "\377\24\377\377\377\25\377\377\377\24\377\377\377\25\377\377\377\23\377\377" "\377\23\377\377\377\21\377\377\377\20\377\377\377\20\377\377\377\16\377\377" "\377\16\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\13\377\377" "\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\6\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\12\377" "\377\377\13\377\377\377\14\377\377\377\15\377\377\377\17\377\377\377\21\377" "\377\377\23\377\377\377\25\377\377\377\30\377\377\377\30\377\377\377\32\377" "\377\377\33\377\377\377\33\377\377\377\34\377\377\377\34\377\377\377\35\377" "\377\377\33\377\377\377\32\377\377\377\30\377\377\377\26\377\377\377\33\377" "\377\377*\377\377\377?\377\377\377L\377\377\3778\377\377\377%\377\377\377" "/\377\377\377D\377\377\3777\377\377\377#\377\377\377\35\377\377\377\36\377" "\377\377(\377\377\377;\377\377\377#\377\377\377\27\377\377\377O\377\377\377" "F\377\377\377<\377\377\3776\377\377\377/\377\377\377%\377\377\377\20\377" "\377\377\7\377\377\377\22\377\377\377\37\377\377\377$\377\377\377%\377\377" "\377%\377\377\377#\377\377\377\36\377\377\377\32\377\377\377\27\377\377\377" "\24\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\27\377\377\377" "\30\377\377\377\30\377\377\377\30\377\377\377\26\377\377\377\25\377\377\377" "\24\377\377\377\23\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377" "\17\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377" "\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6" "\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7\377" "\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377" "\377\377\11\377\377\377\12\377\377\377\14\377\377\377\15\377\377\377\16\377" "\377\377\17\377\377\377\21\377\377\377\23\377\377\377\25\377\377\377\30\377" "\377\377\32\377\377\377\35\377\377\377\35\377\377\377\36\377\377\377\36\377" "\377\377\37\377\377\377\37\377\377\377\37\377\377\377\35\377\377\377\33\377" "\377\377\31\377\377\377\32\377\377\377*\377\377\377C\377\377\377S\377\377" "\377<\377\377\377&\377\377\377:\377\377\377L\377\377\3771\377\377\377\"\377" "\377\377\36\377\377\377*\377\377\377?\377\377\377&\377\377\377\36\377\377" "\377Z\377\377\377H\377\377\377?\377\377\3778\377\377\377/\377\377\377\30" "\377\377\377\10\377\377\377\22\377\377\377\"\377\377\377(\377\377\377(\377" "\377\377(\377\377\377$\377\377\377\37\377\377\377\33\377\377\377\27\377\377" "\377\27\377\377\377\30\377\377\377\31\377\377\377\32\377\377\377\33\377\377" "\377\33\377\377\377\33\377\377\377\32\377\377\377\30\377\377\377\27\377\377" "\377\25\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377\21\377\377" "\377\20\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377\14\377\377" "\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\10\377" "\377\377\10\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\12\377" "\377\377\11\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\13\377" "\377\377\13\377\377\377\14\377\377\377\16\377\377\377\17\377\377\377\21\377" "\377\377\23\377\377\377\25\377\377\377\30\377\377\377\32\377\377\377\35\377" "\377\377\40\377\377\377\40\377\377\377!\377\377\377\"\377\377\377\"\377\377" "\377#\377\377\377\"\377\377\377\40\377\377\377\35\377\377\377\32\377\377" "\377*\377\377\377G\377\377\377]\377\377\377@\377\377\377/\377\377\377J\377" "\377\377G\377\377\377*\377\377\377!\377\377\377+\377\377\377C\377\377\377" "+\377\377\377)\377\377\377`\377\377\377L\377\377\377C\377\377\3778\377\377" "\377#\377\377\377\13\377\377\377\23\377\377\377&\377\377\377,\377\377\377" "-\377\377\377,\377\377\377&\377\377\377\40\377\377\377\33\377\377\377\31" "\377\377\377\33\377\377\377\34\377\377\377\35\377\377\377\36\377\377\377" "\36\377\377\377\36\377\377\377\34\377\377\377\33\377\377\377\32\377\377\377" "\31\377\377\377\27\377\377\377\25\377\377\377\24\377\377\377\23\377\377\377" "\22\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377" "\14\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6" "\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11" "\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\13\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377\15\377\377\377" "\14\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377" "\15\377\377\377\16\377\377\377\21\377\377\377\22\377\377\377\25\377\377\377" "\27\377\377\377\31\377\377\377\34\377\377\377\37\377\377\377#\377\377\377" "$\377\377\377%\377\377\377&\377\377\377'\377\377\377'\377\377\377%\377\377" "\377\"\377\377\377\37\377\377\377*\377\377\377K\377\377\377h\377\377\377" "D\377\377\377;\377\377\377b\377\377\377=\377\377\377)\377\377\377-\377\377" "\377G\377\377\3770\377\377\3778\377\377\377e\377\377\377R\377\377\377F\377" "\377\3777\377\377\377\22\377\377\377\23\377\377\377+\377\377\3772\377\377" "\3773\377\377\377/\377\377\377'\377\377\377\40\377\377\377\34\377\377\377" "\36\377\377\377\37\377\377\377!\377\377\377\"\377\377\377\"\377\377\377!" "\377\377\377\37\377\377\377\36\377\377\377\34\377\377\377\33\377\377\377" "\32\377\377\377\31\377\377\377\27\377\377\377\26\377\377\377\24\377\377\377" "\23\377\377\377\21\377\377\377\20\377\377\377\17\377\377\377\15\377\377\377" "\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6" "\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11" "\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\14\377\377\377\15\377\377\377\15\377\377\377\16\377\377\377" "\16\377\377\377\17\377\377\377\17\377\377\377\20\377\377\377\20\377\377\377" "\20\377\377\377\21\377\377\377\21\377\377\377\21\377\377\377\21\377\377\377" "\22\377\377\377\24\377\377\377\26\377\377\377\30\377\377\377\33\377\377\377" "\36\377\377\377\"\377\377\377&\377\377\377)\377\377\377*\377\377\377+\377" "\377\377,\377\377\377-\377\377\377)\377\377\377%\377\377\377(\377\377\377" "O\377\377\377w\377\377\377H\377\377\377O\377\377\377a\377\377\3774\377\377" "\377-\377\377\377L\377\377\3777\377\377\377Q\377\377\377k\377\377\377X\377" "\377\377F\377\377\377\36\377\377\377\22\377\377\3771\377\377\3779\377\377" "\377:\377\377\3772\377\377\377(\377\377\377!\377\377\377\"\377\377\377$\377" "\377\377&\377\377\377'\377\377\377&\377\377\377$\377\377\377\"\377\377\377" "!\377\377\377\37\377\377\377\36\377\377\377\34\377\377\377\33\377\377\377" "\32\377\377\377\30\377\377\377\26\377\377\377\25\377\377\377\22\377\377\377" "\21\377\377\377\20\377\377\377\16\377\377\377\15\377\377\377\15\377\377\377" "\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377" "\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377" "\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377" "\377\377\16\377\377\377\17\377\377\377\17\377\377\377\20\377\377\377\21\377" "\377\377\21\377\377\377\22\377\377\377\23\377\377\377\24\377\377\377\24\377" "\377\377\25\377\377\377\24\377\377\377\25\377\377\377\26\377\377\377\26\377" "\377\377\25\377\377\377\25\377\377\377\24\377\377\377\27\377\377\377\31\377" "\377\377\34\377\377\377\40\377\377\377$\377\377\377*\377\377\3770\377\377" "\3771\377\377\3773\377\377\3774\377\377\3773\377\377\377.\377\377\377'\377" "\377\377S\377\377\377\213\377\377\377K\377\377\377o\377\377\377Q\377\377" "\3771\377\377\377P\377\377\377@\377\377\377}\377\377\377r\377\377\377]\377" "\377\3775\377\377\377\21\377\377\3779\377\377\377C\377\377\377C\377\377\377" "4\377\377\377)\377\377\377'\377\377\377*\377\377\377,\377\377\377.\377\377" "\377,\377\377\377)\377\377\377'\377\377\377$\377\377\377#\377\377\377!\377" "\377\377\37\377\377\377\35\377\377\377\33\377\377\377\31\377\377\377\30\377" "\377\377\26\377\377\377\25\377\377\377\23\377\377\377\22\377\377\377\20\377" "\377\377\17\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\13\377" "\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377" "\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377" "\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377" "\377\14\377\377\377\16\377\377\377\17\377\377\377\20\377\377\377\21\377\377" "\377\24\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\30\377\377" "\377\31\377\377\377\31\377\377\377\32\377\377\377\33\377\377\377\33\377\377" "\377\33\377\377\377\33\377\377\377\33\377\377\377\32\377\377\377\32\377\377" "\377\31\377\377\377\32\377\377\377\36\377\377\377\"\377\377\377(\377\377" "\377.\377\377\3777\377\377\377;\377\377\377=\377\377\377?\377\377\377;\377" "\377\3773\377\377\377U\377\377\377\247\377\377\377M\377\377\377\230\377\377" "\377E\377\377\377T\377\377\377M\377\377\377\265\377\377\377\177\377\377\377" "^\377\377\377\20\377\377\377D\377\377\377Q\377\377\377I\377\377\3776\377" "\377\377.\377\377\3773\377\377\3776\377\377\3777\377\377\3773\377\377\377" "/\377\377\377,\377\377\377)\377\377\377'\377\377\377$\377\377\377!\377\377" "\377\36\377\377\377\34\377\377\377\32\377\377\377\30\377\377\377\27\377\377" "\377\25\377\377\377\24\377\377\377\23\377\377\377\21\377\377\377\20\377\377" "\377\16\377\377\377\15\377\377\377\14\377\377\377\14\377\377\377\12\377\377" "\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\12\377" "\377\377\13\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377\17\377" "\377\377\21\377\377\377\22\377\377\377\24\377\377\377\26\377\377\377\27\377" "\377\377\32\377\377\377\34\377\377\377\37\377\377\377!\377\377\377!\377\377" "\377\"\377\377\377\"\377\377\377\"\377\377\377\"\377\377\377\"\377\377\377" "\"\377\377\377\"\377\377\377!\377\377\377\40\377\377\377\37\377\377\377$" "\377\377\377+\377\377\3773\377\377\377?\377\377\377I\377\377\377L\377\377" "\377O\377\377\377E\377\377\377T\377\377\377\321\377\377\377w\377\377\377" "z\377\377\377Z\377\377\377`\377\377\377\313\377\377\377\214\377\377\377$" "\377\377\377U\377\377\377f\377\377\377N\377\377\3779\377\377\377?\377\377" "\377D\377\377\377B\377\377\377<\377\377\3777\377\377\3773\377\377\377/\377" "\377\377*\377\377\377&\377\377\377\"\377\377\377\37\377\377\377\35\377\377" "\377\33\377\377\377\31\377\377\377\27\377\377\377\25\377\377\377\24\377\377" "\377\23\377\377\377\22\377\377\377\21\377\377\377\17\377\377\377\16\377\377" "\377\16\377\377\377\14\377\377\377\14\377\377\377\13\377\377\377\12\377\377" "\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377" "\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377" "\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377" "\16\377\377\377\17\377\377\377\21\377\377\377\22\377\377\377\24\377\377\377" "\25\377\377\377\30\377\377\377\31\377\377\377\34\377\377\377\36\377\377\377" "\40\377\377\377#\377\377\377&\377\377\377)\377\377\377,\377\377\377-\377" "\377\377-\377\377\377.\377\377\377.\377\377\377.\377\377\377-\377\377\377" ",\377\377\377*\377\377\377.\377\377\3779\377\377\377I\377\377\377`\377\377" "\377f\377\377\377g\377\377\377O\377\377\377\377\377\377\377\337\377\377\377" "c\377\377\377\200\377\377\377\343\377\377\377j\377\377\377r\377\377\377\206" "\377\377\377R\377\377\377U\377\377\377\\\377\377\377R\377\377\377I\377\377" "\377B\377\377\377;\377\377\3773\377\377\377-\377\377\377(\377\377\377$\377" "\377\377\40\377\377\377\35\377\377\377\33\377\377\377\31\377\377\377\27\377" "\377\377\26\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377\21\377" "\377\377\21\377\377\377\20\377\377\377\16\377\377\377\15\377\377\377\15\377" "\377\377\13\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\10\377" "\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377" "\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377" "\11\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377" "\15\377\377\377\15\377\377\377\17\377\377\377\20\377\377\377\21\377\377\377" "\23\377\377\377\24\377\377\377\26\377\377\377\30\377\377\377\31\377\377\377" "\33\377\377\377\35\377\377\377\40\377\377\377\"\377\377\377%\377\377\377" ")\377\377\377-\377\377\3772\377\377\3779\377\377\377@\377\377\377C\377\377" "\377D\377\377\377E\377\377\377D\377\377\377B\377\377\377>\377\377\377V\377" "\377\377\177\377\377\377\231\377\377\377\213\377\377\377\377\377\377\377" "\365\377\377\377\301\377\377\377\377\377\377\377\253\377\377\377\235\377" "\377\377\177\377\377\377\204\377\377\377n\377\377\377_\377\377\377M\377\377" "\377?\377\377\3776\377\377\377.\377\377\377)\377\377\377$\377\377\377!\377" "\377\377\36\377\377\377\34\377\377\377\32\377\377\377\30\377\377\377\26\377" "\377\377\25\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377\21\377" "\377\377\20\377\377\377\17\377\377\377\17\377\377\377\15\377\377\377\14\377" "\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\11\377" "\377\377\11\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377" "\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7" "\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\11" "\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377" "\16\377\377\377\17\377\377\377\17\377\377\377\21\377\377\377\22\377\377\377" "\23\377\377\377\24\377\377\377\26\377\377\377\27\377\377\377\31\377\377\377" "\33\377\377\377\35\377\377\377\40\377\377\377#\377\377\377&\377\377\377+" "\377\377\3770\377\377\3777\377\377\377@\377\377\377K\377\377\377[\377\377" "\377q\377\377\377\207\377\377\377\212\377\377\377\205\377\377\377\254\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\376\377\377\377\335\377\377\377\231\377\377\377l\377\377\377R\377\377\377" "B\377\377\3778\377\377\3770\377\377\377*\377\377\377&\377\377\377\"\377\377" "\377\37\377\377\377\34\377\377\377\32\377\377\377\30\377\377\377\27\377\377" "\377\25\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377\21\377\377" "\377\20\377\377\377\17\377\377\377\17\377\377\377\16\377\377\377\15\377\377" "\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377" "\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\7" "\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377" "\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\15\377\377\377" "\15\377\377\377\16\377\377\377\17\377\377\377\20\377\377\377\22\377\377\377" "\22\377\377\377\23\377\377\377\24\377\377\377\25\377\377\377\26\377\377\377" "\27\377\377\377\30\377\377\377\32\377\377\377\33\377\377\377\35\377\377\377" "\37\377\377\377!\377\377\377$\377\377\377'\377\377\377+\377\377\377/\377" "\377\3774\377\377\377;\377\377\377C\377\377\377N\377\377\377^\377\377\377" "v\377\377\377\235\377\377\377\353\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\261\377\377\377v\377\377\377Y\377\377\377G\377\377\377" ";\377\377\3772\377\377\377,\377\377\377'\377\377\377#\377\377\377\40\377" "\377\377\35\377\377\377\33\377\377\377\31\377\377\377\27\377\377\377\26\377" "\377\377\25\377\377\377\23\377\377\377\22\377\377\377\21\377\377\377\21\377" "\377\377\20\377\377\377\17\377\377\377\16\377\377\377\16\377\377\377\15\377" "\377\377\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\12\377" "\377\377\11\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377" "\7\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\12\377\377\377" "\12\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377" "\16\377\377\377\17\377\377\377\20\377\377\377\22\377\377\377\22\377\377\377" "\24\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\31\377\377\377" "\32\377\377\377\33\377\377\377\35\377\377\377\37\377\377\377!\377\377\377" "$\377\377\377'\377\377\377*\377\377\377.\377\377\3773\377\377\3779\377\377" "\377>\377\377\377D\377\377\377K\377\377\377S\377\377\377]\377\377\377j\377" "\377\377\225\377\377\377\377\377\377\377\363\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\332\377\377\377\320\377" "\377\377\236\377\377\377h\377\377\377I\377\377\3776\377\377\377*\377\377" "\377\"\377\377\377\35\377\377\377\32\377\377\377\31\377\377\377\27\377\377" "\377\25\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377\21\377\377" "\377\20\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377\16\377\377" "\377\15\377\377\377\15\377\377\377\14\377\377\377\14\377\377\377\12\377\377" "\377\12\377\377\377\12\377\377\377\10\377\377\377\10\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\11" "\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377" "\16\377\377\377\17\377\377\377\17\377\377\377\21\377\377\377\22\377\377\377" "\23\377\377\377\25\377\377\377\27\377\377\377\30\377\377\377\31\377\377\377" "\33\377\377\377\34\377\377\377\35\377\377\377\37\377\377\377\40\377\377\377" "\"\377\377\377#\377\377\377%\377\377\377'\377\377\377)\377\377\377,\377\377" "\377/\377\377\3772\377\377\3775\377\377\377:\377\377\377J\377\377\377b\377" "\377\377\207\377\377\377\217\377\377\377z\377\377\377\322\377\377\377\354" "\377\377\377\352\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\271\377\377\377\220\377\377\377y\377\377\377m\377\377\377k\377\377\377" "h\377\377\377c\377\377\377O\377\377\377?\377\377\3774\377\377\377+\377\377" "\377$\377\377\377\37\377\377\377\33\377\377\377\30\377\377\377\25\377\377" "\377\22\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377\15\377\377" "\377\15\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\13\377\377" "\377\12\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6" "\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\12" "\377\377\377\13\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377" "\16\377\377\377\17\377\377\377\20\377\377\377\21\377\377\377\21\377\377\377" "\23\377\377\377\24\377\377\377\25\377\377\377\26\377\377\377\30\377\377\377" "\31\377\377\377\31\377\377\377\32\377\377\377\33\377\377\377\34\377\377\377" "\36\377\377\377\37\377\377\377\40\377\377\377\"\377\377\377#\377\377\377" "%\377\377\377*\377\377\3771\377\377\377;\377\377\377H\377\377\377Z\377\377" "\377b\377\377\377[\377\377\377Q\377\377\377r\377\377\377\332\377\377\377" "\236\377\377\377o\377\377\377\223\377\377\377\305\377\377\377\377\377\377" "\377\377\377\377\377\310\377\377\377\247\377\377\377p\377\377\377`\377\377" "\377U\377\377\377L\377\377\377H\377\377\377H\377\377\377G\377\377\377E\377" "\377\377C\377\377\377>\377\377\3774\377\377\377-\377\377\377'\377\377\377" "\"\377\377\377\36\377\377\377\33\377\377\377\30\377\377\377\26\377\377\377" "\24\377\377\377\22\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377" "\15\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377" "\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11\377" "\377\377\11\377\377\377\13\377\377\377\13\377\377\377\14\377\377\377\15\377" "\377\377\15\377\377\377\16\377\377\377\17\377\377\377\20\377\377\377\20\377" "\377\377\22\377\377\377\22\377\377\377\24\377\377\377\25\377\377\377\26\377" "\377\377\27\377\377\377\30\377\377\377\31\377\377\377\31\377\377\377\32\377" "\377\377\33\377\377\377\35\377\377\377!\377\377\377%\377\377\377*\377\377" "\3771\377\377\3779\377\377\377C\377\377\377J\377\377\377G\377\377\377B\377" "\377\377=\377\377\377N\377\377\377i\377\377\377\314\377\377\377v\377\377" "\377K\377\377\377u\377\377\377\36\377\377\377\224\377\377\377\260\377\377" "\377\223\377\377\377\342\377\377\377\226\377\377\377\223\377\377\377]\377" "\377\377Q\377\377\377H\377\377\377A\377\377\377<\377\377\3777\377\377\377" "6\377\377\3776\377\377\3775\377\377\3775\377\377\3774\377\377\3773\377\377" "\3771\377\377\377,\377\377\377'\377\377\377#\377\377\377\37\377\377\377\34" "\377\377\377\32\377\377\377\27\377\377\377\25\377\377\377\23\377\377\377" "\21\377\377\377\20\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377" "\12\377\377\377\12\377\377\377\11\377\377\377\7\377\377\377\7\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377" "\11\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\15\377\377\377\15\377\377\377\16\377\377\377\17\377\377\377" "\20\377\377\377\21\377\377\377\21\377\377\377\23\377\377\377\23\377\377\377" "\25\377\377\377\25\377\377\377\26\377\377\377\30\377\377\377\33\377\377\377" "\35\377\377\377!\377\377\377%\377\377\377)\377\377\377/\377\377\3776\377" "\377\377;\377\377\377:\377\377\3777\377\377\3774\377\377\3770\377\377\377" ";\377\377\377I\377\377\377n\377\377\377\272\377\377\377^\377\377\3778\377" "\377\377H\377\377\377\223\377\377\377/\377\377\377v\377\377\377\216\377\377" "\377\246\377\377\377\216\377\377\377\232\377\377\377x\377\377\377\201\377" "\377\377Y\377\377\377F\377\377\377?\377\377\3779\377\377\3775\377\377\377" "2\377\377\377.\377\377\377,\377\377\377+\377\377\377+\377\377\377+\377\377" "\377*\377\377\377*\377\377\377)\377\377\377)\377\377\377(\377\377\377&\377" "\377\377\"\377\377\377\37\377\377\377\34\377\377\377\32\377\377\377\27\377" "\377\377\25\377\377\377\22\377\377\377\21\377\377\377\17\377\377\377\15\377" "\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377" "\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\10\377\377" "\377\11\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377\14\377\377" "\377\14\377\377\377\14\377\377\377\16\377\377\377\16\377\377\377\17\377\377" "\377\20\377\377\377\20\377\377\377\22\377\377\377\24\377\377\377\26\377\377" "\377\30\377\377\377\33\377\377\377\35\377\377\377\40\377\377\377$\377\377" "\377(\377\377\377-\377\377\3772\377\377\3771\377\377\377/\377\377\377-\377" "\377\377+\377\377\377(\377\377\377/\377\377\3779\377\377\377F\377\377\377" "m\377\377\377\246\377\377\377O\377\377\377-\377\377\3777\377\377\377N\377" "\377\377J\377\377\3777\377\377\377b\377\377\377w\377\377\377\206\377\377" "\377b\377\377\377\231\377\377\377s\377\377\377d\377\377\377r\377\377\377" "S\377\377\377>\377\377\3778\377\377\3774\377\377\3770\377\377\377-\377\377" "\377*\377\377\377(\377\377\377&\377\377\377$\377\377\377$\377\377\377$\377" "\377\377$\377\377\377#\377\377\377#\377\377\377#\377\377\377\"\377\377\377" "\"\377\377\377!\377\377\377!\377\377\377\36\377\377\377\33\377\377\377\30" "\377\377\377\25\377\377\377\23\377\377\377\22\377\377\377\17\377\377\377" "\16\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7" "\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11" "\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\15\377\377\377\16\377\377\377\17\377\377\377\21\377\377\377" "\23\377\377\377\26\377\377\377\27\377\377\377\32\377\377\377\35\377\377\377" "\40\377\377\377#\377\377\377&\377\377\377*\377\377\377*\377\377\377)\377" "\377\377(\377\377\377&\377\377\377$\377\377\377\"\377\377\377(\377\377\377" ".\377\377\3776\377\377\377H\377\377\377j\377\377\377\203\377\377\377C\377" "\377\377%\377\377\377-\377\377\3775\377\377\377]\377\377\377\40\377\377\377" ";\377\377\377T\377\377\377f\377\377\377k\377\377\377l\377\377\377Y\377\377" "\377\221\377\377\377[\377\377\377U\377\377\377a\377\377\377N\377\377\377" "<\377\377\3772\377\377\377/\377\377\377,\377\377\377)\377\377\377'\377\377" "\377%\377\377\377#\377\377\377!\377\377\377\40\377\377\377\37\377\377\377" "\37\377\377\377\37\377\377\377\37\377\377\377\36\377\377\377\36\377\377\377" "\36\377\377\377\36\377\377\377\34\377\377\377\33\377\377\377\32\377\377\377" "\31\377\377\377\30\377\377\377\26\377\377\377\24\377\377\377\21\377\377\377" "\20\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377\12\377\377\377" "\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\10\377" "\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377" "\377\377\16\377\377\377\20\377\377\377\22\377\377\377\23\377\377\377\26\377" "\377\377\30\377\377\377\33\377\377\377\37\377\377\377!\377\377\377$\377\377" "\377%\377\377\377$\377\377\377#\377\377\377\"\377\377\377!\377\377\377\37" "\377\377\377\36\377\377\377\"\377\377\377'\377\377\377,\377\377\3774\377" "\377\377I\377\377\377f\377\377\377k\377\377\377;\377\377\377\40\377\377\377" "%\377\377\377+\377\377\377:\377\377\377U\377\377\377\17\377\377\377<\377" "\377\377J\377\377\377Y\377\377\377X\377\377\377k\377\377\377I\377\377\377" "b\377\377\377q\377\377\377K\377\377\377K\377\377\377T\377\377\377I\377\377" "\377:\377\377\377.\377\377\377+\377\377\377(\377\377\377&\377\377\377$\377" "\377\377\"\377\377\377\40\377\377\377\37\377\377\377\36\377\377\377\35\377" "\377\377\33\377\377\377\33\377\377\377\33\377\377\377\33\377\377\377\33\377" "\377\377\33\377\377\377\31\377\377\377\30\377\377\377\30\377\377\377\27\377" "\377\377\26\377\377\377\25\377\377\377\24\377\377\377\24\377\377\377\23\377" "\377\377\21\377\377\377\20\377\377\377\16\377\377\377\14\377\377\377\13\377" "\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11\377\377" "\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377\17\377\377" "\377\21\377\377\377\22\377\377\377\24\377\377\377\26\377\377\377\30\377\377" "\377\34\377\377\377\36\377\377\377\40\377\377\377\40\377\377\377\40\377\377" "\377\37\377\377\377\36\377\377\377\35\377\377\377\34\377\377\377\33\377\377" "\377\36\377\377\377!\377\377\377&\377\377\377+\377\377\3776\377\377\377H" "\377\377\377a\377\377\377Z\377\377\3774\377\377\377\33\377\377\377\40\377" "\377\377%\377\377\377*\377\377\377C\377\377\3771\377\377\377\23\377\377\377" "7\377\377\377A\377\377\377N\377\377\377N\377\377\377Z\377\377\377O\377\377" "\377@\377\377\377f\377\377\377\\\377\377\377@\377\377\377B\377\377\377J\377" "\377\377D\377\377\3777\377\377\377-\377\377\377'\377\377\377%\377\377\377" "#\377\377\377!\377\377\377\40\377\377\377\36\377\377\377\35\377\377\377\34" "\377\377\377\33\377\377\377\32\377\377\377\31\377\377\377\30\377\377\377" "\30\377\377\377\27\377\377\377\27\377\377\377\26\377\377\377\26\377\377\377" "\25\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377\22\377\377\377" "\21\377\377\377\20\377\377\377\17\377\377\377\17\377\377\377\16\377\377\377" "\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\12\377" "\377\377\13\377\377\377\14\377\377\377\16\377\377\377\17\377\377\377\21\377" "\377\377\22\377\377\377\25\377\377\377\27\377\377\377\31\377\377\377\32\377" "\377\377\33\377\377\377\33\377\377\377\33\377\377\377\34\377\377\377\33\377" "\377\377\32\377\377\377\31\377\377\377\30\377\377\377\32\377\377\377\35\377" "\377\377!\377\377\377$\377\377\377*\377\377\3777\377\377\377G\377\377\377" "]\377\377\377N\377\377\377/\377\377\377\30\377\377\377\34\377\377\377\40" "\377\377\377$\377\377\377/\377\377\377I\377\377\377\34\377\377\377\27\377" "\377\3772\377\377\377;\377\377\377E\377\377\377G\377\377\377L\377\377\377" "S\377\377\377:\377\377\377G\377\377\377f\377\377\377M\377\377\3777\377\377" "\377<\377\377\377B\377\377\377@\377\377\3775\377\377\377,\377\377\377%\377" "\377\377#\377\377\377!\377\377\377\37\377\377\377\36\377\377\377\34\377\377" "\377\33\377\377\377\32\377\377\377\31\377\377\377\31\377\377\377\30\377\377" "\377\27\377\377\377\25\377\377\377\25\377\377\377\23\377\377\377\23\377\377" "\377\22\377\377\377\22\377\377\377\21\377\377\377\21\377\377\377\20\377\377" "\377\20\377\377\377\17\377\377\377\17\377\377\377\16\377\377\377\15\377\377" "\377\14\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377" "\377\11\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377" "\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377" "\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377" "\377\13\377\377\377\15\377\377\377\16\377\377\377\17\377\377\377\21\377\377" "\377\22\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\26\377\377" "\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377" "\377\26\377\377\377\26\377\377\377\30\377\377\377\32\377\377\377\35\377\377" "\377\40\377\377\377#\377\377\377+\377\377\3777\377\377\377F\377\377\377X" "\377\377\377D\377\377\377+\377\377\377\26\377\377\377\31\377\377\377\34\377" "\377\377\37\377\377\377#\377\377\3774\377\377\3777\377\377\377\20\377\377" "\377\32\377\377\377.\377\377\3776\377\377\377>\377\377\377@\377\377\377B" "\377\377\377L\377\377\377>\377\377\3771\377\377\377J\377\377\377X\377\377" "\377B\377\377\3771\377\377\3776\377\377\377;\377\377\377<\377\377\3773\377" "\377\377+\377\377\377$\377\377\377\40\377\377\377\37\377\377\377\35\377\377" "\377\34\377\377\377\33\377\377\377\32\377\377\377\31\377\377\377\30\377\377" "\377\27\377\377\377\27\377\377\377\25\377\377\377\24\377\377\377\23\377\377" "\377\22\377\377\377\20\377\377\377\20\377\377\377\17\377\377\377\17\377\377" "\377\16\377\377\377\16\377\377\377\15\377\377\377\15\377\377\377\14\377\377" "\377\14\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377" "\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377" "\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377" "\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377" "\377\377\13\377\377\377\15\377\377\377\16\377\377\377\17\377\377\377\20\377" "\377\377\22\377\377\377\22\377\377\377\23\377\377\377\23\377\377\377\23\377" "\377\377\24\377\377\377\23\377\377\377\24\377\377\377\23\377\377\377\23\377" "\377\377\23\377\377\377\26\377\377\377\27\377\377\377\32\377\377\377\34\377" "\377\377\37\377\377\377#\377\377\377+\377\377\3776\377\377\377D\377\377\377" "S\377\377\377<\377\377\377'\377\377\377\24\377\377\377\26\377\377\377\31" "\377\377\377\33\377\377\377\36\377\377\377'\377\377\3779\377\377\377%\377" "\377\377\12\377\377\377\33\377\377\377+\377\377\3771\377\377\3778\377\377" "\377;\377\377\377:\377\377\377C\377\377\377A\377\377\3771\377\377\3777\377" "\377\377L\377\377\377K\377\377\3779\377\377\377-\377\377\3772\377\377\377" "6\377\377\3779\377\377\3771\377\377\377)\377\377\377$\377\377\377\37\377" "\377\377\35\377\377\377\34\377\377\377\33\377\377\377\32\377\377\377\31\377" "\377\377\30\377\377\377\27\377\377\377\25\377\377\377\24\377\377\377\23\377" "\377\377\22\377\377\377\21\377\377\377\20\377\377\377\20\377\377\377\16\377" "\377\377\16\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377\14\377" "\377\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377" "\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377" "\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377" "\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377" "\377\377\13\377\377\377\14\377\377\377\15\377\377\377\17\377\377\377\17\377" "\377\377\17\377\377\377\20\377\377\377\20\377\377\377\20\377\377\377\21\377" "\377\377\20\377\377\377\21\377\377\377\20\377\377\377\21\377\377\377\20\377" "\377\377\23\377\377\377\24\377\377\377\27\377\377\377\31\377\377\377\33\377" "\377\377\36\377\377\377#\377\377\377,\377\377\3776\377\377\377B\377\377\377" "I\377\377\3776\377\377\377$\377\377\377\24\377\377\377\24\377\377\377\26" "\377\377\377\31\377\377\377\33\377\377\377\35\377\377\377+\377\377\3779\377" "\377\377\30\377\377\377\14\377\377\377\35\377\377\377(\377\377\377-\377\377" "\3773\377\377\3777\377\377\3776\377\377\377;\377\377\377C\377\377\3773\377" "\377\377(\377\377\377:\377\377\377L\377\377\377A\377\377\3773\377\377\377" "*\377\377\377.\377\377\3771\377\377\3774\377\377\377.\377\377\377(\377\377" "\377#\377\377\377\36\377\377\377\33\377\377\377\32\377\377\377\31\377\377" "\377\30\377\377\377\27\377\377\377\27\377\377\377\25\377\377\377\24\377\377" "\377\23\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377\17\377\377" "\377\16\377\377\377\15\377\377\377\15\377\377\377\14\377\377\377\13\377\377" "\377\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\11\377\377" "\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377" "\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377" "\377\377\13\377\377\377\14\377\377\377\14\377\377\377\15\377\377\377\15\377" "\377\377\15\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377\16\377" "\377\377\16\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377\20\377" "\377\377\22\377\377\377\23\377\377\377\26\377\377\377\30\377\377\377\33\377" "\377\377\36\377\377\377$\377\377\377,\377\377\3775\377\377\377@\377\377\377" "A\377\377\3771\377\377\377!\377\377\377\23\377\377\377\22\377\377\377\24" "\377\377\377\26\377\377\377\30\377\377\377\32\377\377\377!\377\377\377.\377" "\377\377)\377\377\377\20\377\377\377\16\377\377\377\35\377\377\377&\377\377" "\377*\377\377\377/\377\377\3773\377\377\3772\377\377\3775\377\377\377;\377" "\377\3776\377\377\377*\377\377\377,\377\377\377<\377\377\377H\377\377\377" "9\377\377\377-\377\377\377'\377\377\377*\377\377\377.\377\377\3770\377\377" "\377-\377\377\377'\377\377\377\"\377\377\377\36\377\377\377\32\377\377\377" "\31\377\377\377\30\377\377\377\27\377\377\377\25\377\377\377\25\377\377\377" "\23\377\377\377\22\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377" "\16\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377" "\13\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377" "\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377" "\12\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377" "\13\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\15\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377\17\377\377\377" "\20\377\377\377\23\377\377\377\24\377\377\377\26\377\377\377\31\377\377\377" "\36\377\377\377$\377\377\377+\377\377\3774\377\377\377>\377\377\377;\377" "\377\377-\377\377\377\37\377\377\377\23\377\377\377\21\377\377\377\22\377" "\377\377\24\377\377\377\26\377\377\377\30\377\377\377\32\377\377\377$\377" "\377\3771\377\377\377\35\377\377\377\12\377\377\377\17\377\377\377\36\377" "\377\377#\377\377\377'\377\377\377,\377\377\377/\377\377\377/\377\377\377" "0\377\377\3776\377\377\3777\377\377\377,\377\377\377\"\377\377\377/\377\377" "\377=\377\377\377?\377\377\3773\377\377\377)\377\377\377%\377\377\377(\377" "\377\377*\377\377\377-\377\377\377+\377\377\377&\377\377\377!\377\377\377" "\35\377\377\377\32\377\377\377\30\377\377\377\27\377\377\377\25\377\377\377" "\24\377\377\377\23\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377" "\17\377\377\377\16\377\377\377\15\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377" "\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377" "\10\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\12\377\377\377" "\12\377\377\377\13\377\377\377\12\377\377\377\13\377\377\377\12\377\377\377" "\13\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377" "\20\377\377\377\21\377\377\377\23\377\377\377\26\377\377\377\30\377\377\377" "\36\377\377\377#\377\377\377+\377\377\3773\377\377\377<\377\377\3775\377" "\377\377)\377\377\377\35\377\377\377\22\377\377\377\20\377\377\377\21\377" "\377\377\22\377\377\377\24\377\377\377\26\377\377\377\27\377\377\377\35\377" "\377\377'\377\377\377*\377\377\377\25\377\377\377\7\377\377\377\20\377\377" "\377\36\377\377\377!\377\377\377%\377\377\377)\377\377\377,\377\377\377," "\377\377\377,\377\377\3771\377\377\3775\377\377\377-\377\377\377$\377\377" "\377%\377\377\3771\377\377\377=\377\377\3778\377\377\377.\377\377\377%\377" "\377\377\"\377\377\377%\377\377\377'\377\377\377*\377\377\377)\377\377\377" "$\377\377\377\40\377\377\377\35\377\377\377\32\377\377\377\26\377\377\377" "\25\377\377\377\23\377\377\377\22\377\377\377\22\377\377\377\20\377\377\377" "\20\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7" "\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\10" "\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\11\377\377\377\12\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377" "\17\377\377\377\20\377\377\377\22\377\377\377\24\377\377\377\27\377\377\377" "\34\377\377\377\"\377\377\377(\377\377\3771\377\377\377:\377\377\3771\377" "\377\377&\377\377\377\33\377\377\377\22\377\377\377\16\377\377\377\20\377" "\377\377\21\377\377\377\22\377\377\377\24\377\377\377\25\377\377\377\27\377" "\377\377\37\377\377\377)\377\377\377\40\377\377\377\17\377\377\377\10\377" "\377\377\21\377\377\377\35\377\377\377\37\377\377\377\"\377\377\377&\377" "\377\377)\377\377\377*\377\377\377)\377\377\377,\377\377\3771\377\377\377" "/\377\377\377&\377\377\377\37\377\377\377'\377\377\3772\377\377\377=\377" "\377\3773\377\377\377*\377\377\377\"\377\377\377!\377\377\377#\377\377\377" "%\377\377\377'\377\377\377'\377\377\377#\377\377\377\37\377\377\377\33\377" "\377\377\30\377\377\377\25\377\377\377\23\377\377\377\22\377\377\377\21\377" "\377\377\20\377\377\377\20\377\377\377\16\377\377\377\15\377\377\377\15\377" "\377\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377" "\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377" "\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7" "\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377" "\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\15\377\377\377" "\16\377\377\377\20\377\377\377\21\377\377\377\23\377\377\377\27\377\377\377" "\33\377\377\377!\377\377\377'\377\377\377.\377\377\3775\377\377\377-\377" "\377\377#\377\377\377\32\377\377\377\21\377\377\377\15\377\377\377\17\377" "\377\377\20\377\377\377\21\377\377\377\22\377\377\377\23\377\377\377\25\377" "\377\377\32\377\377\377!\377\377\377*\377\377\377\30\377\377\377\12\377\377" "\377\11\377\377\377\22\377\377\377\33\377\377\377\36\377\377\377!\377\377" "\377$\377\377\377'\377\377\377'\377\377\377'\377\377\377)\377\377\377-\377" "\377\3770\377\377\377'\377\377\377\40\377\377\377\40\377\377\377)\377\377" "\3773\377\377\3777\377\377\377.\377\377\377&\377\377\377\40\377\377\377\37" "\377\377\377!\377\377\377#\377\377\377%\377\377\377&\377\377\377!\377\377" "\377\36\377\377\377\31\377\377\377\27\377\377\377\24\377\377\377\21\377\377" "\377\20\377\377\377\20\377\377\377\16\377\377\377\16\377\377\377\15\377\377" "\377\14\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\12\377\377" "\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377" "\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377" "\377\377\16\377\377\377\20\377\377\377\22\377\377\377\26\377\377\377\32\377" "\377\377\37\377\377\377$\377\377\377+\377\377\3770\377\377\377(\377\377\377" "\40\377\377\377\31\377\377\377\21\377\377\377\15\377\377\377\16\377\377\377" "\17\377\377\377\20\377\377\377\21\377\377\377\22\377\377\377\23\377\377\377" "\25\377\377\377\34\377\377\377#\377\377\377!\377\377\377\22\377\377\377\7" "\377\377\377\12\377\377\377\23\377\377\377\32\377\377\377\34\377\377\377" "\37\377\377\377\"\377\377\377$\377\377\377%\377\377\377%\377\377\377&\377" "\377\377)\377\377\377,\377\377\377(\377\377\377\"\377\377\377\34\377\377" "\377\"\377\377\377*\377\377\3773\377\377\3771\377\377\377*\377\377\377#\377" "\377\377\35\377\377\377\35\377\377\377\37\377\377\377!\377\377\377\"\377" "\377\377#\377\377\377\37\377\377\377\34\377\377\377\30\377\377\377\25\377" "\377\377\23\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377\16\377" "\377\377\15\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377" "\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377" "\10\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377" "\16\377\377\377\17\377\377\377\22\377\377\377\25\377\377\377\31\377\377\377" "\35\377\377\377\"\377\377\377(\377\377\377*\377\377\377$\377\377\377\35\377" "\377\377\26\377\377\377\17\377\377\377\14\377\377\377\15\377\377\377\16\377" "\377\377\17\377\377\377\20\377\377\377\21\377\377\377\22\377\377\377\23\377" "\377\377\27\377\377\377\35\377\377\377$\377\377\377\32\377\377\377\16\377" "\377\377\6\377\377\377\13\377\377\377\23\377\377\377\31\377\377\377\33\377" "\377\377\35\377\377\377\40\377\377\377\"\377\377\377#\377\377\377#\377\377" "\377#\377\377\377&\377\377\377)\377\377\377)\377\377\377#\377\377\377\35" "\377\377\377\34\377\377\377#\377\377\377+\377\377\3773\377\377\377-\377\377" "\377&\377\377\377\40\377\377\377\33\377\377\377\34\377\377\377\36\377\377" "\377\36\377\377\377\37\377\377\377\40\377\377\377\35\377\377\377\32\377\377" "\377\27\377\377\377\24\377\377\377\22\377\377\377\20\377\377\377\16\377\377" "\377\16\377\377\377\14\377\377\377\14\377\377\377\13\377\377\377\13\377\377" "\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377" "\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377" "\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377" "\377\17\377\377\377\21\377\377\377\24\377\377\377\30\377\377\377\34\377\377" "\377!\377\377\377&\377\377\377%\377\377\377\40\377\377\377\32\377\377\377" "\24\377\377\377\17\377\377\377\12\377\377\377\13\377\377\377\15\377\377\377" "\16\377\377\377\17\377\377\377\17\377\377\377\20\377\377\377\21\377\377\377" "\23\377\377\377\31\377\377\377\37\377\377\377\"\377\377\377\25\377\377\377" "\12\377\377\377\6\377\377\377\14\377\377\377\23\377\377\377\30\377\377\377" "\32\377\377\377\34\377\377\377\36\377\377\377\40\377\377\377\"\377\377\377" "!\377\377\377!\377\377\377#\377\377\377&\377\377\377)\377\377\377$\377\377" "\377\36\377\377\377\31\377\377\377\35\377\377\377$\377\377\377+\377\377\377" "0\377\377\377)\377\377\377#\377\377\377\36\377\377\377\32\377\377\377\32" "\377\377\377\33\377\377\377\34\377\377\377\34\377\377\377\35\377\377\377" "\33\377\377\377\30\377\377\377\26\377\377\377\23\377\377\377\20\377\377\377" "\17\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377" "\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377" "\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5" "\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377" "\377\377\11\377\377\377\11\377\377\377\12\377\377\377\14\377\377\377\16\377" "\377\377\21\377\377\377\23\377\377\377\27\377\377\377\33\377\377\377\36\377" "\377\377#\377\377\377!\377\377\377\35\377\377\377\27\377\377\377\22\377\377" "\377\15\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377\14\377\377" "\377\16\377\377\377\16\377\377\377\17\377\377\377\20\377\377\377\21\377\377" "\377\25\377\377\377\32\377\377\377\40\377\377\377\33\377\377\377\20\377\377" "\377\10\377\377\377\7\377\377\377\15\377\377\377\24\377\377\377\27\377\377" "\377\31\377\377\377\33\377\377\377\35\377\377\377\37\377\377\377\40\377\377" "\377\40\377\377\377\40\377\377\377!\377\377\377$\377\377\377&\377\377\377" "$\377\377\377\37\377\377\377\32\377\377\377\30\377\377\377\37\377\377\377" "%\377\377\377+\377\377\377,\377\377\377&\377\377\377\40\377\377\377\33\377" "\377\377\27\377\377\377\27\377\377\377\31\377\377\377\31\377\377\377\31\377" "\377\377\32\377\377\377\31\377\377\377\26\377\377\377\24\377\377\377\22\377" "\377\377\20\377\377\377\16\377\377\377\15\377\377\377\13\377\377\377\13\377" "\377\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377" "\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10" "\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\15\377\377\377" "\20\377\377\377\22\377\377\377\25\377\377\377\31\377\377\377\34\377\377\377" "!\377\377\377\36\377\377\377\32\377\377\377\25\377\377\377\21\377\377\377" "\15\377\377\377\10\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377" "\14\377\377\377\15\377\377\377\15\377\377\377\17\377\377\377\20\377\377\377" "\22\377\377\377\26\377\377\377\33\377\377\377!\377\377\377\26\377\377\377" "\15\377\377\377\6\377\377\377\10\377\377\377\15\377\377\377\24\377\377\377" "\26\377\377\377\30\377\377\377\31\377\377\377\33\377\377\377\35\377\377\377" "\37\377\377\377\37\377\377\377\36\377\377\377\37\377\377\377!\377\377\377" "$\377\377\377%\377\377\377\40\377\377\377\33\377\377\377\27\377\377\377\32" "\377\377\377\40\377\377\377&\377\377\377+\377\377\377'\377\377\377\"\377" "\377\377\34\377\377\377\30\377\377\377\25\377\377\377\25\377\377\377\27\377" "\377\377\27\377\377\377\27\377\377\377\30\377\377\377\27\377\377\377\25\377" "\377\377\23\377\377\377\21\377\377\377\17\377\377\377\15\377\377\377\14\377" "\377\377\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\10\377" "\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5" "\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377" "\377\377\10\377\377\377\11\377\377\377\13\377\377\377\15\377\377\377\17\377" "\377\377\21\377\377\377\24\377\377\377\27\377\377\377\33\377\377\377\36\377" "\377\377\32\377\377\377\27\377\377\377\24\377\377\377\17\377\377\377\13\377" "\377\377\10\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377" "\377\377\14\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377\20\377" "\377\377\23\377\377\377\27\377\377\377\34\377\377\377\34\377\377\377\22\377" "\377\377\12\377\377\377\5\377\377\377\10\377\377\377\15\377\377\377\24\377" "\377\377\25\377\377\377\27\377\377\377\30\377\377\377\32\377\377\377\34\377" "\377\377\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377\37\377" "\377\377!\377\377\377#\377\377\377\40\377\377\377\34\377\377\377\30\377\377" "\377\26\377\377\377\33\377\377\377\40\377\377\377%\377\377\377)\377\377\377" "#\377\377\377\37\377\377\377\32\377\377\377\26\377\377\377\23\377\377\377" "\24\377\377\377\25\377\377\377\25\377\377\377\26\377\377\377\26\377\377\377" "\25\377\377\377\23\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377" "\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377" "\377\377\11\377\377\377\12\377\377\377\14\377\377\377\16\377\377\377\20\377" "\377\377\23\377\377\377\26\377\377\377\31\377\377\377\33\377\377\377\27\377" "\377\377\24\377\377\377\21\377\377\377\16\377\377\377\13\377\377\377\10\377" "\377\377\10\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\12\377" "\377\377\14\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377\20\377" "\377\377\23\377\377\377\30\377\377\377\35\377\377\377\27\377\377\377\17\377" "\377\377\10\377\377\377\5\377\377\377\11\377\377\377\16\377\377\377\23\377" "\377\377\25\377\377\377\26\377\377\377\27\377\377\377\31\377\377\377\33\377" "\377\377\34\377\377\377\34\377\377\377\34\377\377\377\34\377\377\377\35\377" "\377\377\37\377\377\377!\377\377\377!\377\377\377\35\377\377\377\31\377\377" "\377\25\377\377\377\26\377\377\377\33\377\377\377\37\377\377\377$\377\377" "\377$\377\377\377\40\377\377\377\33\377\377\377\30\377\377\377\24\377\377" "\377\22\377\377\377\23\377\377\377\23\377\377\377\24\377\377\377\23\377\377" "\377\23\377\377\377\24\377\377\377\22\377\377\377\20\377\377\377\17\377\377" "\377\15\377\377\377\14\377\377\377\12\377\377\377\11\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377" "\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377" "\377\11\377\377\377\13\377\377\377\15\377\377\377\17\377\377\377\21\377\377" "\377\24\377\377\377\27\377\377\377\30\377\377\377\26\377\377\377\23\377\377" "\377\20\377\377\377\15\377\377\377\12\377\377\377\7\377\377\377\7\377\377" "\377\10\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\12\377\377" "\377\13\377\377\377\13\377\377\377\15\377\377\377\15\377\377\377\21\377\377" "\377\24\377\377\377\30\377\377\377\33\377\377\377\23\377\377\377\14\377\377" "\377\6\377\377\377\6\377\377\377\11\377\377\377\16\377\377\377\23\377\377" "\377\24\377\377\377\25\377\377\377\26\377\377\377\30\377\377\377\31\377\377" "\377\33\377\377\377\33\377\377\377\33\377\377\377\33\377\377\377\34\377\377" "\377\35\377\377\377\37\377\377\377!\377\377\377\35\377\377\377\31\377\377" "\377\25\377\377\377\23\377\377\377\27\377\377\377\33\377\377\377\36\377\377" "\377\"\377\377\377!\377\377\377\34\377\377\377\31\377\377\377\25\377\377" "\377\22\377\377\377\21\377\377\377\21\377\377\377\22\377\377\377\22\377\377" "\377\21\377\377\377\22\377\377\377\22\377\377\377\21\377\377\377\17\377\377" "\377\15\377\377\377\14\377\377\377\12\377\377\377\12\377\377\377\11\377\377" "\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5" "\377\377\377\5\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\13" "\377\377\377\14\377\377\377\16\377\377\377\20\377\377\377\22\377\377\377" "\25\377\377\377\25\377\377\377\23\377\377\377\20\377\377\377\16\377\377\377" "\14\377\377\377\11\377\377\377\7\377\377\377\6\377\377\377\7\377\377\377" "\10\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\12\377\377\377" "\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377\21\377\377\377" "\24\377\377\377\30\377\377\377\27\377\377\377\17\377\377\377\10\377\377\377" "\3\377\377\377\6\377\377\377\12\377\377\377\16\377\377\377\22\377\377\377" "\23\377\377\377\24\377\377\377\26\377\377\377\27\377\377\377\30\377\377\377" "\32\377\377\377\32\377\377\377\32\377\377\377\32\377\377\377\32\377\377\377" "\34\377\377\377\35\377\377\377\36\377\377\377\35\377\377\377\31\377\377\377" "\26\377\377\377\22\377\377\377\23\377\377\377\27\377\377\377\32\377\377\377" "\36\377\377\377!\377\377\377\35\377\377\377\31\377\377\377\26\377\377\377" "\23\377\377\377\20\377\377\377\17\377\377\377\20\377\377\377\20\377\377\377" "\20\377\377\377\20\377\377\377\20\377\377\377\20\377\377\377\17\377\377\377" "\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377" "\377\377\6\377\377\377\7\377\377\377\11\377\377\377\12\377\377\377\13\377" "\377\377\15\377\377\377\17\377\377\377\21\377\377\377\24\377\377\377\23\377" "\377\377\21\377\377\377\17\377\377\377\15\377\377\377\12\377\377\377\11\377" "\377\377\6\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377" "\377\10\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\12\377\377" "\377\13\377\377\377\14\377\377\377\16\377\377\377\21\377\377\377\25\377\377" "\377\31\377\377\377\22\377\377\377\14\377\377\377\7\377\377\377\3\377\377" "\377\6\377\377\377\11\377\377\377\15\377\377\377\20\377\377\377\22\377\377" "\377\24\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\30\377\377" "\377\30\377\377\377\30\377\377\377\30\377\377\377\30\377\377\377\31\377\377" "\377\33\377\377\377\33\377\377\377\34\377\377\377\31\377\377\377\25\377\377" "\377\23\377\377\377\20\377\377\377\23\377\377\377\27\377\377\377\32\377\377" "\377\35\377\377\377\36\377\377\377\32\377\377\377\26\377\377\377\23\377\377" "\377\21\377\377\377\17\377\377\377\16\377\377\377\16\377\377\377\16\377\377" "\377\17\377\377\377\17\377\377\377\17\377\377\377\17\377\377\377\16\377\377" "\377\15\377\377\377\14\377\377\377\12\377\377\377\11\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377" "\4\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10" "\377\377\377\11\377\377\377\13\377\377\377\14\377\377\377\16\377\377\377" "\20\377\377\377\22\377\377\377\21\377\377\377\17\377\377\377\15\377\377\377" "\13\377\377\377\12\377\377\377\10\377\377\377\6\377\377\377\5\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10" "\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377" "\14\377\377\377\16\377\377\377\21\377\377\377\24\377\377\377\25\377\377\377" "\17\377\377\377\12\377\377\377\5\377\377\377\3\377\377\377\6\377\377\377" "\11\377\377\377\16\377\377\377\20\377\377\377\21\377\377\377\22\377\377\377" "\23\377\377\377\24\377\377\377\25\377\377\377\27\377\377\377\27\377\377\377" "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\30\377\377\377" "\32\377\377\377\32\377\377\377\30\377\377\377\25\377\377\377\22\377\377\377" "\20\377\377\377\20\377\377\377\23\377\377\377\26\377\377\377\31\377\377\377" "\34\377\377\377\33\377\377\377\27\377\377\377\25\377\377\377\22\377\377\377" "\17\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377" "\15\377\377\377\16\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377" "\14\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377" "\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11" "\377\377\377\13\377\377\377\15\377\377\377\17\377\377\377\20\377\377\377" "\17\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377\11\377\377\377" "\7\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\10" "\377\377\377\11\377\377\377\11\377\377\377\12\377\377\377\14\377\377\377" "\17\377\377\377\22\377\377\377\24\377\377\377\22\377\377\377\14\377\377\377" "\10\377\377\377\4\377\377\377\4\377\377\377\6\377\377\377\12\377\377\377" "\16\377\377\377\17\377\377\377\20\377\377\377\21\377\377\377\21\377\377\377" "\22\377\377\377\24\377\377\377\25\377\377\377\25\377\377\377\25\377\377\377" "\25\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\30\377\377\377" "\31\377\377\377\30\377\377\377\25\377\377\377\23\377\377\377\20\377\377\377" "\16\377\377\377\20\377\377\377\23\377\377\377\26\377\377\377\30\377\377\377" "\32\377\377\377\30\377\377\377\25\377\377\377\22\377\377\377\20\377\377\377" "\16\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\13\377\377\377\12\377\377\377\11\377\377\377\7\377\377\377\7\377\377\377" "\6\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377" "\377\377\6\377\377\377\7\377\377\377\10\377\377\377\12\377\377\377\14\377" "\377\377\15\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377\13\377" "\377\377\11\377\377\377\10\377\377\377\7\377\377\377\5\377\377\377\4\377" "\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\7\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\10\377\377" "\377\11\377\377\377\13\377\377\377\15\377\377\377\17\377\377\377\21\377\377" "\377\24\377\377\377\17\377\377\377\12\377\377\377\6\377\377\377\3\377\377" "\377\4\377\377\377\7\377\377\377\11\377\377\377\15\377\377\377\16\377\377" "\377\17\377\377\377\20\377\377\377\21\377\377\377\22\377\377\377\23\377\377" "\377\24\377\377\377\25\377\377\377\25\377\377\377\24\377\377\377\23\377\377" "\377\24\377\377\377\25\377\377\377\26\377\377\377\26\377\377\377\30\377\377" "\377\25\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377\16\377\377" "\377\20\377\377\377\23\377\377\377\25\377\377\377\26\377\377\377\30\377\377" "\377\26\377\377\377\23\377\377\377\21\377\377\377\17\377\377\377\14\377\377" "\377\13\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\13\377\377" "\377\13\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\12\377\377" "\377\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\5\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\5\377\377\377\5\377\377\377\7\377\377\377\10\377\377" "\377\11\377\377\377\12\377\377\377\14\377\377\377\14\377\377\377\13\377\377" "\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\6\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10" "\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\13\377\377\377" "\15\377\377\377\17\377\377\377\22\377\377\377\21\377\377\377\14\377\377\377" "\10\377\377\377\5\377\377\377\2\377\377\377\4\377\377\377\6\377\377\377\11" "\377\377\377\15\377\377\377\16\377\377\377\16\377\377\377\17\377\377\377" "\20\377\377\377\21\377\377\377\21\377\377\377\22\377\377\377\23\377\377\377" "\23\377\377\377\23\377\377\377\23\377\377\377\23\377\377\377\24\377\377\377" "\24\377\377\377\25\377\377\377\26\377\377\377\24\377\377\377\22\377\377\377" "\20\377\377\377\16\377\377\377\14\377\377\377\16\377\377\377\20\377\377\377" "\22\377\377\377\24\377\377\377\25\377\377\377\26\377\377\377\23\377\377\377" "\21\377\377\377\17\377\377\377\15\377\377\377\13\377\377\377\12\377\377\377" "\12\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\12\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377" "\7\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\6" "\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13" "\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377" "\6\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377" "\377\11\377\377\377\13\377\377\377\15\377\377\377\17\377\377\377\21\377\377" "\377\16\377\377\377\12\377\377\377\7\377\377\377\4\377\377\377\3\377\377" "\377\5\377\377\377\6\377\377\377\11\377\377\377\14\377\377\377\15\377\377" "\377\15\377\377\377\16\377\377\377\17\377\377\377\17\377\377\377\20\377\377" "\377\21\377\377\377\22\377\377\377\22\377\377\377\22\377\377\377\21\377\377" "\377\21\377\377\377\22\377\377\377\23\377\377\377\24\377\377\377\24\377\377" "\377\24\377\377\377\22\377\377\377\17\377\377\377\16\377\377\377\14\377\377" "\377\14\377\377\377\16\377\377\377\20\377\377\377\21\377\377\377\23\377\377" "\377\24\377\377\377\23\377\377\377\21\377\377\377\17\377\377\377\15\377\377" "\377\14\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377" "\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377" "\377\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11" "\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\7" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\7\377\377\377\7\377\377\377\11\377\377\377\13\377\377\377\15\377\377\377" "\17\377\377\377\20\377\377\377\14\377\377\377\10\377\377\377\5\377\377\377" "\3\377\377\377\3\377\377\377\4\377\377\377\6\377\377\377\11\377\377\377\13" "\377\377\377\14\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377" "\17\377\377\377\20\377\377\377\20\377\377\377\20\377\377\377\21\377\377\377" "\21\377\377\377\20\377\377\377\20\377\377\377\21\377\377\377\21\377\377\377" "\22\377\377\377\23\377\377\377\23\377\377\377\22\377\377\377\20\377\377\377" "\16\377\377\377\14\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377" "\17\377\377\377\21\377\377\377\22\377\377\377\23\377\377\377\22\377\377\377" "\17\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\10\377\377\377\7\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10" "\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377" "\377\377\5\377\377\377\4\377\377\377\4\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\13\377\377\377\15" "\377\377\377\17\377\377\377\15\377\377\377\12\377\377\377\7\377\377\377\4" "\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\7\377\377\377\10\377" "\377\377\13\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377\15\377" "\377\377\15\377\377\377\16\377\377\377\17\377\377\377\20\377\377\377\20\377" "\377\377\20\377\377\377\20\377\377\377\20\377\377\377\17\377\377\377\20\377" "\377\377\21\377\377\377\21\377\377\377\22\377\377\377\21\377\377\377\17\377" "\377\377\16\377\377\377\14\377\377\377\12\377\377\377\12\377\377\377\13\377" "\377\377\15\377\377\377\16\377\377\377\20\377\377\377\21\377\377\377\22\377" "\377\377\17\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377\11\377" "\377\377\10\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7" "\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377" "\377\377\4\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6" "\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\13\377\377\377\15" "\377\377\377\17\377\377\377\13\377\377\377\10\377\377\377\5\377\377\377\3" "\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\6\377\377\377\11\377" "\377\377\12\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\14\377" "\377\377\15\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377\16\377" "\377\377\16\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377\17\377" "\377\377\17\377\377\377\20\377\377\377\21\377\377\377\21\377\377\377\17\377" "\377\377\15\377\377\377\14\377\377\377\13\377\377\377\11\377\377\377\12\377" "\377\377\13\377\377\377\14\377\377\377\16\377\377\377\17\377\377\377\20\377" "\377\377\17\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377\11\377" "\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\10\377\377\377\11\377\377\377\13\377\377\377\14\377\377" "\377\15\377\377\377\11\377\377\377\7\377\377\377\5\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\5\377\377\377\6\377\377\377\11\377\377\377" "\11\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377" "\14\377\377\377\15\377\377\377\15\377\377\377\16\377\377\377\16\377\377\377" "\16\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377" "\16\377\377\377\17\377\377\377\17\377\377\377\20\377\377\377\17\377\377\377" "\15\377\377\377\14\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377" "\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377" "\17\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377" "\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377" "\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377" "\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377" "\10\377\377\377\11\377\377\377\13\377\377\377\14\377\377\377\12\377\377\377" "\10\377\377\377\6\377\377\377\4\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377\11\377\377\377\11" "\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\14\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377" "\15\377\377\377\15\377\377\377\14\377\377\377\15\377\377\377\15\377\377\377" "\16\377\377\377\16\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377" "\13\377\377\377\13\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377" "\12\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377\15\377\377\377" "\16\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\10\377\377\377" "\7\377\377\377\7\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377" "\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377" "\11\377\377\377\13\377\377\377\13\377\377\377\11\377\377\377\7\377\377\377" "\5\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4" "\377\377\377\6\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\11" "\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377" "\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\15\377\377\377\15\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377" "\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\10\377\377\377" "\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377" "\14\377\377\377\13\377\377\377\11\377\377\377\11\377\377\377\7\377\377\377" "\7\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5" "\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12" "\377\377\377\12\377\377\377\10\377\377\377\6\377\377\377\4\377\377\377\2" "\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\6\377" "\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\11\377" "\377\377\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\13\377" "\377\377\13\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\13\377" "\377\377\13\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377\14\377" "\377\377\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377" "\377\377\10\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377" "\377\377\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\13\377" "\377\377\11\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377" "\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377" "\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\10\377\377\377" "\6\377\377\377\4\377\377\377\3\377\377\377\1\377\377\377\1\377\377\377\2" "\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\7\377\377\377\7\377" "\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\12\377" "\377\377\12\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377\13\377" "\377\377\13\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\12\377" "\377\377\13\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377\14\377" "\377\377\13\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\7\377" "\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377" "\377\377\11\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\10\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377" "\377\377\5\377\377\377\6\377\377\377\6\377\377\377\10\377\377\377\11\377" "\377\377\11\377\377\377\7\377\377\377\5\377\377\377\4\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377" "\5\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\10" "\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\12\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\11\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\13\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377" "\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7" "\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\4\377\377\377\3\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377" "\377\4\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377" "\7\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377" "\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\11\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\11\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10" "\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\6" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\5\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\6\377\377\377" "\5\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\1" "\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\6\377" "\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377" "\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\11\377\377" "\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377" "\377\10\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\11\377\377" "\377\11\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377" "\6\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10" "\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\4\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\5" "\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\10" "\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377" "\11\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377" "\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\6\377\377" "\377\5\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\6\377\377\377\7\377\377\377\6\377\377\377\7\377\377\377\7\377\377" "\377\10\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\10" "\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\3" "\377\377\377\2\377\377\377\1\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377" "\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\0\0\0\0\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377" "\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\1\377\377" "\377\1\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377" "\6\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\5\377\377\377\5\377" "\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377" "\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377" "\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\3\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" }; compiz-0.9.11+14.04.20140409/plugins/bicubic/0000755000015301777760000000000012321344021020555 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/bicubic/bicubic.xml.in0000644000015301777760000000067512321343002023312 0ustar pbusernogroup00000000000000 <_short>Bicubic filter <_long>Bicubic texture filtering opengl Effects composite opengl blur compiz-0.9.11+14.04.20140409/plugins/bicubic/CMakeLists.txt0000644000015301777760000000015412321343002023313 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (bicubic PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/bicubic/src/0000755000015301777760000000000012321344021021344 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/bicubic/src/bicubic.h0000644000015301777760000000377512321343002023127 0ustar pbusernogroup00000000000000/* * * Compiz bicubic filter plugin * * bicubic.h * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2008 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include "bicubic_options.h" class BicubicFunction { public: int handle; int target; int param; int unit; }; class BicubicScreen : public PluginClassHandler , public BicubicOptions { public: BicubicScreen (CompScreen *screen); ~BicubicScreen (); GLScreen *gScreen; CompositeScreen *cScreen; std::list func; GLenum lTexture; int getBicubicFragmentFunction (GLTexture *texture, int param, int unit); void generateLookupTexture (GLenum format); }; class BicubicWindow : public PluginClassHandler , public GLWindowInterface { public: BicubicWindow (CompWindow *); CompositeWindow *cWindow; GLWindow *gWindow; void glDrawTexture (GLTexture *texture, GLFragment::Attrib &, unsigned int); }; #define BICUBIC_SCREEN(s) \ BicubicScreen *bs = BicubicScreen::get (s) #define BICUBIC_WINDOW(w) \ BicubicWindow *bw = BicubicWindow::get (w) class BicubicPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/bicubic/src/bicubic.cpp0000644000015301777760000001715612321343002023460 0ustar pbusernogroup00000000000000/* * * Compiz bicubic filter plugin * * bicubic.c * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * */ #include "bicubic.h" COMPIZ_PLUGIN_20090315 (bicubic, BicubicPluginVTable); int BicubicScreen::getBicubicFragmentFunction (GLTexture *texture, int param, int unit) { GLFragment::FunctionData *data; int target; CompString targetString; if (texture->target () == GL_TEXTURE_2D) { target = COMP_FETCH_TARGET_2D; targetString = "2D"; } else { target = COMP_FETCH_TARGET_RECT; targetString = "RECT"; } foreach (BicubicFunction *function, func) if (function->param == param && function->target == target && function->unit == unit) return function->handle; data = new GLFragment::FunctionData (); if (data) { int handle = 0; BicubicFunction *function = NULL; CompString filterTemp[] = { "hgX", "hgY", "cs00", "cs01", "cs10", "cs11" }; for (unsigned int i = 0; i < sizeof (filterTemp) / sizeof (filterTemp[0]); i++) data->addTempHeaderOp (filterTemp[i].c_str()); data->addDataOp ( "MAD cs00, fragment.texcoord[0], program.env[%d]," "{-0.5, -0.5, 0.0, 0.0};", param + 2); data->addDataOp ( "TEX hgX, cs00.x, texture[%d], 1D;", unit); data->addDataOp ( "TEX hgY, cs00.y, texture[%d], 1D;", unit); data->addDataOp ( "MUL cs10, program.env[%d], hgX.y;", param); data->addDataOp ( "MUL cs00, program.env[%d], -hgX.x;", param); data->addDataOp ( "MAD cs11, program.env[%d], hgY.y, cs10;", param + 1); data->addDataOp ( "MAD cs01, program.env[%d], hgY.y, cs00;", param + 1); data->addDataOp ( "MAD cs10, program.env[%d], -hgY.x, cs10;", param + 1); data->addDataOp ( "MAD cs00, program.env[%d], -hgY.x, cs00;", param + 1); data->addDataOp ( "ADD cs00, cs00, fragment.texcoord[0];"); data->addDataOp ( "ADD cs01, cs01, fragment.texcoord[0];"); data->addDataOp ( "ADD cs10, cs10, fragment.texcoord[0];"); data->addDataOp ( "ADD cs11, cs11, fragment.texcoord[0];"); data->addDataOp ( "TEX cs00, cs00, texture[0], %s;", targetString.c_str()); data->addDataOp ( "TEX cs01, cs01, texture[0], %s;", targetString.c_str()); data->addDataOp ( "TEX cs10, cs10, texture[0], %s;", targetString.c_str()); data->addDataOp ( "TEX cs11, cs11, texture[0], %s;", targetString.c_str()); data->addDataOp ( "LRP cs00, hgY.z, cs00, cs01;"); data->addDataOp ( "LRP cs10, hgY.z, cs10, cs11;"); data->addDataOp ( "LRP output, hgX.z, cs00, cs10;"); data->addColorOp ( "output", "output"); if (!data->status ()) { delete data; return 0; } function = new BicubicFunction (); if (function) { handle = data->createFragmentFunction ("bicubic"); function->handle = handle; function->target = target; function->param = param; function->unit = unit; func.push_back (function); } delete data; return handle; } return 0; } void BicubicWindow::glDrawTexture (GLTexture *texture, GLFragment::Attrib &attrib, unsigned int mask) { BICUBIC_SCREEN (screen); if ((mask & (PAINT_WINDOW_TRANSFORMED_MASK | PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK)) && bs->gScreen->textureFilter () == GLTexture::Good) { GLFragment::Attrib fa = attrib; int function, param; int unit = 0; param = fa.allocParameters (3); unit = fa.allocTextureUnits (1); function = bs->getBicubicFragmentFunction (texture, param, unit); if (function) { fa.addFunction (function); GL::activeTexture (GL_TEXTURE0_ARB + unit); glBindTexture (GL_TEXTURE_1D, bs->lTexture); GL::activeTexture (GL_TEXTURE0_ARB); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, param, texture->matrix ().xx, 0.0f, 0.0f, 0.0f); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, param + 1, 0.0f, -texture->matrix ().yy, 0.0f, 0.0f); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, param + 2, 1.0 / texture->matrix ().xx, 1.0 / -texture->matrix ().yy, 0.0f, 0.0f); } gWindow->glDrawTexture (texture, fa, mask); if (unit) { GL::activeTexture (GL_TEXTURE0_ARB + unit); glBindTexture (GL_TEXTURE_1D, 0); GL::activeTexture (GL_TEXTURE0_ARB); } } else { gWindow->glDrawTexture (texture, attrib, mask); } } void BicubicScreen::generateLookupTexture (GLenum format) { GLfloat values[512]; float a, a2, a3, w0, w1, w2, w3; for (int i = 0; i < 512; i += 4) { a = (float)i / 512.0; a2 = a * a; a3 = a2 * a; w0 = (1.0 / 6.0) * ((-a3) + (3.0 * a2) + (-3.0 * a) + 1.0); w1 = (1.0 / 6.0) * ((3.0 * a3) + (-6.0 * a2) + 4.0); w2 = (1.0 / 6.0) * ((-3.0 * a3) + (3.0 * a2) + (3.0 * a) + 1.0); w3 = (1.0 / 6.0) * a3; values[i] = 1.0 - (w1 / (w0 + w1)) + a; values[i + 1] = 1.0 + (w3 / (w2 + w3)) - a; values[i + 2] = w0 + w1; values[i + 3] = w2 + w3; } glGenTextures (1, &lTexture); glBindTexture (GL_TEXTURE_1D, lTexture); glTexImage1D (GL_TEXTURE_1D, 0, format, 128, 0, GL_RGBA, GL_FLOAT, values); glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT); glBindTexture (GL_TEXTURE_1D, 0); } BicubicScreen::BicubicScreen (CompScreen *screen) : PluginClassHandler (screen), gScreen (GLScreen::get (screen)), cScreen (CompositeScreen::get (screen)) { bool failed = false; const char *glExtensions; GLenum format = GL_RGBA16F_ARB; if (!GL::fragmentProgram) { compLogMessage ("bicube", CompLogLevelFatal, "GL_ARB_fragment_program not supported."); setFailed (); failed = true; } if (!failed) { glExtensions = (const char *) glGetString (GL_EXTENSIONS); if (!glExtensions) { compLogMessage ("bicubic", CompLogLevelFatal, "No valid GL extensions string found."); setFailed (); failed = true; } } if (!failed) { if (!strstr (glExtensions, "GL_ARB_texture_float")) { compLogMessage ("bicubic", CompLogLevelFatal, "GL_ARB_texture_float not supported. " "This can lead to visual artifacts."); format = GL_RGBA; } } generateLookupTexture (format); } BicubicScreen::~BicubicScreen () { BicubicFunction *f; while (func.size ()) { f = func.front (); GLFragment::destroyFragmentFunction (f->handle); func.remove (f); } glDeleteTextures (1, &lTexture); } BicubicWindow::BicubicWindow (CompWindow *window) : PluginClassHandler (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)) { GLWindowInterface::setHandler (gWindow); } bool BicubicPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/copytex/0000755000015301777760000000000012321344021020650 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/copytex/CMakeLists.txt0000644000015301777760000000015212321343002023404 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(copytex PLUGINDEPS composite opengl)compiz-0.9.11+14.04.20140409/plugins/copytex/src/0000755000015301777760000000000012321344021021437 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/copytex/src/copytex.h0000644000015301777760000000510312321343002023300 0ustar pbusernogroup00000000000000/* * Compiz copy to texture plugin * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@compiz-fusion.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. * */ /* * This plugin uses the "copy to texture" taken from Luminocity * http://live.gnome.org/Luminocity */ #include #include #include #include #include #include #include extern const int MAX_SUB_TEX; extern const unsigned int SHM_SIZE; class CopyTexture; class CopyPixmap { public: typedef std::vector Textures; typedef boost::shared_ptr Ptr; static CopyPixmap::Ptr create (Pixmap pixmap, int width, int height, int depth); ~CopyPixmap (); static GLTexture::List bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source); public: Textures textures; Pixmap pixmap; Damage damage; int depth; private: CopyPixmap (Pixmap pixmap, int width, int height, int depth); }; class CopyTexture : public GLTexture { public: CopyTexture (boost::shared_ptr cp, CompRect dim); ~CopyTexture (); void enable (Filter filter); void disable (); void update (); const CompRect & size () const { return dim; } public: CopyPixmap::Ptr cp; CompRect dim; CompRect damage; }; class CopytexScreen : public ScreenInterface, public PluginClassHandler { public: CopytexScreen (CompScreen *screen); ~CopytexScreen (); void handleEvent (XEvent *); bool useShm; XShmSegmentInfo shmInfo; int damageNotify; std::map pixmaps; GLTexture::BindPixmapHandle hnd; }; #define COPY_SCREEN(s) \ CopytexScreen *cs = CopytexScreen::get (s) class CopytexPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/copytex/src/copytex.cpp0000644000015301777760000002143612321343002023642 0ustar pbusernogroup00000000000000/* * Compiz copy to texture plugin * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@compiz-fusion.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. * */ /* * This plugin uses the "copy to texture" taken from Luminocity * http://live.gnome.org/Luminocity */ #include "copytex.h" #include COMPIZ_PLUGIN_20090315 (copytex, CopytexPluginVTable) const int MAX_SUB_TEX = 2048; const unsigned int SHM_SIZE = MAX_SUB_TEX * MAX_SUB_TEX * 4; static GLTexture::Matrix _identity_matrix = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }; GLTexture::List CopyPixmap::bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source) { if (depth != 32 && depth != 24) return GLTexture::List (); CopyPixmap::Ptr cp (CopyPixmap::create (pixmap, width, height, depth)); if (!cp->textures.size ()) return GLTexture::List (); else { GLTexture::List tl (cp->textures.size ()); for (unsigned int i = 0; i < cp->textures.size (); i++) tl[i] = cp->textures[i]; return tl; } return GLTexture::List (); } CopyPixmap::Ptr CopyPixmap::create (Pixmap pixmap, int width, int height, int depth) { int maxTS = MIN (MAX_SUB_TEX, GL::maxTextureSize); int nWidth = ceil ((float) width / (float) maxTS); int nHeight = ceil ((float) height / (float) maxTS); CopyPixmap::Ptr cp (new CopyPixmap (pixmap, width, height, depth)); cp->textures.resize (nWidth * nHeight); /* Creating a new CopyPixmap::Ptr here is okay since * the refcount will still effectively be the same */ for (int x = 0, w = width; x < nWidth; x++, w -= maxTS) for (int y = 0, h = height; y < nHeight; y++, h -= maxTS) cp->textures[y + (x * nHeight)] = new CopyTexture (cp, CompRect (x * maxTS, y * maxTS, MIN (w, maxTS), MIN (h, maxTS))); cp->damage = XDamageCreate (screen->dpy (), cp->pixmap, XDamageReportBoundingBox); CopytexScreen::get (screen)->pixmaps[cp->damage] = cp; return cp; } CopyPixmap::CopyPixmap (Pixmap pixmap, int width, int height, int depth) : pixmap (pixmap), damage (None), depth (depth) { } CopyPixmap::~CopyPixmap () { if (damage) XDamageDestroy (screen->dpy (), damage); if (CopytexScreen::get (screen)) CopytexScreen::get (screen)->pixmaps.erase (damage); } CopyTexture::CopyTexture (CopyPixmap::Ptr cp, CompRect dim) : cp (cp), dim (dim), damage (0, 0, dim.width (), dim.height ()) { GLenum target; GLTexture::Matrix matrix = _identity_matrix; #ifdef USE_GLES target = GL_TEXTURE_2D; matrix.xx = 1.0f / dim.width (); matrix.yy = 1.0f / dim.height (); matrix.x0 = -dim.x () * matrix.xx; matrix.y0 = -dim.y () * matrix.yy; #else if (GL::textureNonPowerOfTwo || (POWER_OF_TWO (dim.width ()) && POWER_OF_TWO (dim.height ()))) { target = GL_TEXTURE_2D; matrix.xx = 1.0f / dim.width (); matrix.yy = 1.0f / dim.height (); matrix.x0 = -dim.x () * matrix.xx; matrix.y0 = -dim.y () * matrix.yy; } else { target = GL_TEXTURE_RECTANGLE_NV; matrix.xx = 1.0f; matrix.yy = 1.0f; matrix.x0 = -dim.x (); matrix.y0 = -dim.y (); } #endif setData (target, matrix, false); setGeometry (dim.x1 (), dim.y1 (), dim.x2 () - dim.x1 (), dim.y2 () - dim.y1 ()); glBindTexture (target, name ()); if (cp->depth == 32) glTexImage2D (target, 0, GL_RGBA, dim.width (), dim.height (), 0, GL_BGRA, GL_UNSIGNED_BYTE, 0); else glTexImage2D (target, 0, GL_RGB, dim.width (), dim.height (), 0, GL_BGRA, GL_UNSIGNED_BYTE, 0); setFilter (GL_NEAREST); setWrap (GL_CLAMP_TO_EDGE); } CopyTexture::~CopyTexture () { CopyPixmap::Textures::iterator it = std::find (cp->textures.begin (), cp->textures.end (), this); if (it != cp->textures.end ()) cp->textures.erase (it); } void CopyTexture::update () { COPY_SCREEN (screen); char *addr = 0; Pixmap tmpPix; XImage *image = 0; XGCValues gcv; GC gc; if (!damage.width () || !damage.height ()) return; gcv.graphics_exposures = false; gcv.subwindow_mode = IncludeInferiors; gc = XCreateGC (screen->dpy (), cp->pixmap, GCGraphicsExposures | GCSubwindowMode, &gcv); if (cs->useShm) tmpPix = XShmCreatePixmap (screen->dpy (), cp->pixmap, cs->shmInfo.shmaddr, &cs->shmInfo, damage.width (), damage.height (), cp->depth); else tmpPix = XCreatePixmap (screen->dpy (), cp->pixmap, damage.width (), damage.height (), cp->depth); XCopyArea (screen->dpy (), cp->pixmap, tmpPix, gc, dim.x () + damage.x (), dim.y () + damage.y (), damage.width (), damage.height (), 0, 0); XSync (screen->dpy (), false); if (cs->useShm) addr = cs->shmInfo.shmaddr; else { image = XGetImage (screen->dpy (), tmpPix, 0, 0, damage.width (), damage.height (), AllPlanes, ZPixmap); if (image) addr = image->data; } glBindTexture (target (), name ()); glTexSubImage2D (target (), 0, damage.x (), damage.y (), damage.width (), damage.height (), GL_BGRA, #if IMAGE_BYTE_ORDER == MSBFirst GL_UNSIGNED_INT_8_8_8_8_REV, #else GL_UNSIGNED_BYTE, #endif addr); glBindTexture (target (), 0); XFreePixmap (screen->dpy (), tmpPix); XFreeGC (screen->dpy (), gc); if (image) XDestroyImage (image); damage.setGeometry (0, 0, 0, 0); } void CopyTexture::enable (Filter filter) { update (); GLTexture::enable (filter); } void CopyTexture::disable () { GLTexture::disable (); } void CopytexScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (event->type == damageNotify) { XDamageNotifyEvent *de = (XDamageNotifyEvent *) event; std::map::iterator it = pixmaps.find (de->damage); if (it != pixmaps.end ()) { CopyPixmap::Ptr cp = it->second; int x1, x2, y1, y2; foreach (CopyTexture *t, cp->textures) { x1 = MAX (de->area.x, t->dim.x1 ()) - t->dim.x1 (); x2 = MIN (de->area.x + de->area.width, t->dim.x2 ()) - t->dim.x1 (); y1 = MAX (de->area.y, t->dim.y1 ()) - t->dim.y1 (); y2 = MIN (de->area.y + de->area.height, t->dim.y2 ()) - t->dim.y1 (); if (t->damage.width () && t->damage.height ()) { x1 = MIN (x1, t->damage.x1 ()); x2 = MAX (x2, t->damage.x2 ()); y1 = MIN (y1, t->damage.y1 ()); y2 = MAX (y2, t->damage.y2 ()); } if (x1 < x2 && y1 < y2) t->damage.setGeometry (x1, y1, x2 - x1, y2 - y1); } } } } CopytexScreen::CopytexScreen (CompScreen *screen) : PluginClassHandler (screen) { useShm = false; if (XShmQueryExtension (screen->dpy ())) { int i; Bool b; XShmQueryVersion (screen->dpy (), &i, &i, &b); if (b) useShm = true; } if (useShm) { shmInfo.shmid = shmget (IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0600); if (shmInfo.shmid < 0) { compLogMessage ("copytex", CompLogLevelError, "Can't create shared memory\n"); useShm = false; } } if (useShm) { shmInfo.shmaddr = (char *) shmat (shmInfo.shmid, 0, 0); if (shmInfo.shmaddr == ((char *)-1)) { shmctl (shmInfo.shmid, IPC_RMID, 0); compLogMessage ("copytex", CompLogLevelError, "Can't attach shared memory\n"); useShm = false; } } if (useShm) { shmInfo.readOnly = false; if (!XShmAttach (screen->dpy (), &shmInfo)) { shmdt (shmInfo.shmaddr); shmctl (shmInfo.shmid, IPC_RMID, 0); compLogMessage ("copytex", CompLogLevelError, "Can't attach X shared memory\n"); useShm = false; } } damageNotify = CompositeScreen::get (screen)->damageEvent () + XDamageNotify; ScreenInterface::setHandler (screen); hnd = GLScreen::get (screen)-> registerBindPixmap (CopyPixmap::bindPixmapToTexture); } CopytexScreen::~CopytexScreen () { if (useShm) { XShmDetach (screen->dpy (), &shmInfo); shmdt (shmInfo.shmaddr); shmctl (shmInfo.shmid, IPC_RMID, 0); } GLScreen::get (screen)->unregisterBindPixmap (hnd); } bool CopytexPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/copytex/copytex.xml.in0000644000015301777760000000044512321343002023473 0ustar pbusernogroup00000000000000 <_short>Copy to texture <_long>Copy pixmap content to texture General opengl compiz-0.9.11+14.04.20140409/plugins/titleinfo/0000755000015301777760000000000012321344021021152 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/titleinfo/titleinfo.xml.in0000644000015301777760000000145512321343002024301 0ustar pbusernogroup00000000000000 <_short>Title Bar Info <_long>Shows additional information in the window title bar Utility composite opengl decor compiz-0.9.11+14.04.20140409/plugins/titleinfo/CMakeLists.txt0000644000015301777760000000012212321343002023703 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (titleinfo) compiz-0.9.11+14.04.20140409/plugins/titleinfo/src/0000755000015301777760000000000012321344021021741 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/titleinfo/src/titleinfo.cpp0000644000015301777760000001435512321343002024450 0ustar pbusernogroup00000000000000/* * * Compiz title bar information extension plugin * * titleinfo.cpp * * Copyright : (C) 2009 by Danny Baumann * E-mail : maniac@compiz.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "titleinfo.h" COMPIZ_PLUGIN_20090315 (titleinfo, TitleinfoPluginVTable); void TitleinfoWindow::updateVisibleName () { CompString root, text, f_machine; TITLEINFO_SCREEN (screen); CompString f_title = title.size () ? title : ""; if (ts->optionGetShowRoot () && owner == 0) root = "ROOT: "; if (ts->optionGetShowRemoteMachine () && remoteMachine.size ()) { char hostname[256]; if (gethostname (hostname, 256) || strcmp (hostname, remoteMachine.c_str ())) f_machine = remoteMachine; } if (f_machine.size ()) text = root + f_title + "(@" + f_machine + ")"; else if (root.size ()) text = root + f_title; if (text.size ()) { XChangeProperty (screen->dpy (), window->id (), ts->visibleNameAtom, Atoms::utf8String, 8, PropModeReplace, (unsigned char *) text.c_str (), text.size ()); text.clear (); } else XDeleteProperty (screen->dpy (), window->id (), ts->visibleNameAtom); } void TitleinfoWindow::updatePid () { int pid = -1; Atom type; int format; unsigned long nItems, bytesAfter; unsigned char *propVal; TITLEINFO_SCREEN (screen); owner = -1; int result = XGetWindowProperty (screen->dpy (), window->id (), ts->wmPidAtom, 0L, 1L, False, XA_CARDINAL, &type, &format, &nItems, &bytesAfter, &propVal); if (result == Success && propVal) { if (nItems) { unsigned long value; memcpy (&value, propVal, sizeof (unsigned long)); pid = value; } XFree (propVal); } if (pid >= 0) { char path[512]; struct stat fileStat; snprintf (path, 512, "/proc/%d", pid); if (!lstat (path, &fileStat)) owner = fileStat.st_uid; } if (ts->optionGetShowRoot ()) updateVisibleName (); } CompString TitleinfoScreen::getUtf8Property (Window id, Atom atom) { Atom type; int format; unsigned long nItems, bytesAfter; char *val = NULL, *retval_c = NULL; CompString retval; int result = XGetWindowProperty (screen->dpy (), id, atom, 0L, 65536, False, Atoms::utf8String, &type, &format, &nItems, &bytesAfter, (unsigned char **) &val); if (result != Success) return retval; if (type == Atoms::utf8String && format == 8 && val && nItems > 0) { retval_c = (char *) malloc (sizeof (char) * (nItems + 1)); if (retval_c) { strncpy (retval_c, val, nItems); retval_c[nItems] = 0; } } if (retval_c) { retval = CompString (retval_c); free (retval_c); } if (val) XFree (val); return retval; } CompString TitleinfoScreen::getTextProperty (Window id, Atom atom) { XTextProperty text; char *retval_c = NULL; CompString retval; text.nitems = 0; if (XGetTextProperty (screen->dpy (), id, &text, atom)) { if (text.value) { retval_c = (char *) malloc (sizeof (char) * (text.nitems + 1)); if (retval_c) { strncpy (retval_c, (char *) text.value, text.nitems); retval_c[text.nitems] = 0; } XFree (text.value); } } if (retval_c) { retval = CompString (retval_c); free (retval_c); } return retval; } void TitleinfoWindow::updateTitle () { TITLEINFO_SCREEN (screen); CompString f_title = ts->getUtf8Property (window->id (), Atoms::wmName); if (f_title.empty ()) title = ts->getTextProperty (window->id (), XA_WM_NAME);\ title = f_title; updateVisibleName (); } void TitleinfoWindow::updateMachine () { TITLEINFO_SCREEN (screen); if (remoteMachine.size ()) remoteMachine.clear (); remoteMachine = ts->getTextProperty (window->id (), XA_WM_CLIENT_MACHINE); if (ts->optionGetShowRemoteMachine ()) updateVisibleName (); } void TitleinfoScreen::addSupportedAtoms (std::vector &atoms) { screen->addSupportedAtoms (atoms); atoms.push_back (visibleNameAtom); atoms.push_back (wmPidAtom); } void TitleinfoScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (event->type == PropertyNotify) { CompWindow *w; if (event->xproperty.atom == XA_WM_CLIENT_MACHINE) { w = screen->findWindow (event->xproperty.window); if (w) { TITLEINFO_WINDOW (w); tw->updateMachine (); } } else if (event->xproperty.atom == wmPidAtom) { w = screen->findWindow (event->xproperty.window); if (w) { TITLEINFO_WINDOW (w); tw->updatePid (); } } else if (event->xproperty.atom == Atoms::wmName || event->xproperty.atom == XA_WM_NAME) { w = screen->findWindow (event->xproperty.window); if (w) { TITLEINFO_WINDOW (w); tw->updateTitle (); } } } } TitleinfoScreen::TitleinfoScreen (CompScreen *screen) : PluginClassHandler (screen), visibleNameAtom (XInternAtom (screen->dpy (), "_NET_WM_VISIBLE_NAME", 0)), wmPidAtom (XInternAtom (screen->dpy (), "_NET_WM_PID", 0)) { ScreenInterface::setHandler (screen); screen->updateSupportedWmHints (); }; TitleinfoScreen::~TitleinfoScreen () { screen->addSupportedAtomsSetEnabled (this, false); screen->updateSupportedWmHints (); } TitleinfoWindow::TitleinfoWindow (CompWindow *window) : PluginClassHandler (window), window (window), owner (-1) { updateTitle (); updateMachine (); updatePid (); updateVisibleName (); } bool TitleinfoPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; }; compiz-0.9.11+14.04.20140409/plugins/titleinfo/src/titleinfo.h0000644000015301777760000000421212321343002024104 0ustar pbusernogroup00000000000000/* * * Compiz title bar information extension plugin * * titleinfo.h * * Copyright : (C) 2009 by Danny Baumann * E-mail : maniac@compiz.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #include #include #include #include #include "titleinfo_options.h" class TitleinfoScreen : public PluginClassHandler , public ScreenInterface, public TitleinfoOptions { public: TitleinfoScreen (CompScreen *); ~TitleinfoScreen (); Atom visibleNameAtom; Atom wmPidAtom; void handleEvent (XEvent *); void addSupportedAtoms (std::vector &atoms); CompString getUtf8Property (Window id, Atom atom); CompString getTextProperty (Window id, Atom atom); }; #define TITLEINFO_SCREEN(s) \ TitleinfoScreen *ts = TitleinfoScreen::get (screen) class TitleinfoWindow : public PluginClassHandler { public: TitleinfoWindow (CompWindow *); CompWindow *window; CompString title; CompString remoteMachine; int owner; void updateMachine (); void updateTitle (); void updatePid (); void updateVisibleName (); }; #define TITLEINFO_WINDOW(w) \ TitleinfoWindow *tw = TitleinfoWindow::get (w); class TitleinfoPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/gnomecompat/0000755000015301777760000000000012321344021021466 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/gnomecompat/gnomecompat.xml.in0000644000015301777760000000400512321343002025123 0ustar pbusernogroup00000000000000 <_short>Gnome Compatibility <_long>Options that keep Compiz compatible to the Gnome desktop environment General wmkeybindings composite opengl decor <_short>Commands <_short>Run terminal command compiz-0.9.11+14.04.20140409/plugins/gnomecompat/CMakeLists.txt0000644000015301777760000000015612321343002024226 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(gnomecompat PLUGINDEPS composite opengl)compiz-0.9.11+14.04.20140409/plugins/gnomecompat/src/0000755000015301777760000000000012321344021022255 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/gnomecompat/src/gnomecompat.h0000644000015301777760000000350012321343002024733 0ustar pbusernogroup00000000000000/* * Copyright © 2009 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include #include #include "gnomecompat_options.h" class GnomeCompatScreen : public PluginClassHandler, public GnomecompatOptions { public: GnomeCompatScreen (CompScreen *s); void panelAction (CompOption::Vector& options, Atom action); Atom panelActionAtom; Atom panelMainMenuAtom; Atom panelRunDialogAtom; }; #define GNOME_SCREEN(s) \ GnomeCompatScreen *gs = GnomeCompatScreen::get (s) class GnomeCompatPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/gnomecompat/src/gnomecompat.cpp0000644000015301777760000001005412321343002025270 0ustar pbusernogroup00000000000000/* * Copyright © 2009 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include "gnomecompat.h" COMPIZ_PLUGIN_20090315 (gnomecompat, GnomeCompatPluginVTable); static bool runCommand (CompAction *action, CompAction::State state, CompOption::Vector& options, CompOption *commandOption) { Window xid; xid = CompOption::getIntOptionNamed (options, "root", 0); if (xid != screen->root ()) return false; screen->runCommand (commandOption->value ().s ()); return true; } void GnomeCompatScreen::panelAction (CompOption::Vector& options, Atom actionAtom) { Window xid; XEvent event; Time time; xid = CompOption::getIntOptionNamed (options, "root", 0); if (xid != screen->root ()) return; time = CompOption::getIntOptionNamed (options, "time", CurrentTime); /* we need to ungrab the keyboard here, otherwise the panel main menu won't popup as it wants to grab the keyboard itself */ XUngrabKeyboard (screen->dpy (), time); event.type = ClientMessage; event.xclient.window = screen->root (); event.xclient.message_type = panelActionAtom; event.xclient.format = 32; event.xclient.data.l[0] = actionAtom; event.xclient.data.l[1] = time; event.xclient.data.l[2] = 0; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (screen->dpy (), screen->root (), false, StructureNotifyMask, &event); } static bool showMainMenu (CompAction *action, CompAction::State state, CompOption::Vector& options) { GNOME_SCREEN (screen); gs->panelAction (options, gs->panelMainMenuAtom); return true; } static bool showRunDialog (CompAction *action, CompAction::State state, CompOption::Vector& options) { GNOME_SCREEN (screen); gs->panelAction (options, gs->panelRunDialogAtom); return true; } GnomeCompatScreen::GnomeCompatScreen (CompScreen *s) : PluginClassHandler (s) { panelActionAtom = XInternAtom (screen->dpy (), "_GNOME_PANEL_ACTION", false); panelMainMenuAtom = XInternAtom (screen->dpy (), "_GNOME_PANEL_ACTION_MAIN_MENU", false); panelRunDialogAtom = XInternAtom (screen->dpy (), "_GNOME_PANEL_ACTION_RUN_DIALOG", false); #define COMMAND_BIND(opt) \ boost::bind (runCommand, _1, _2, _3, &mOptions[opt]) optionSetMainMenuKeyInitiate (showMainMenu); optionSetRunKeyInitiate (showRunDialog); optionSetRunCommandScreenshotKeyInitiate (COMMAND_BIND (GnomecompatOptions::CommandScreenshot)); optionSetRunCommandWindowScreenshotKeyInitiate (COMMAND_BIND (GnomecompatOptions::CommandWindowScreenshot)); optionSetRunCommandTerminalKeyInitiate (COMMAND_BIND (GnomecompatOptions::CommandTerminal)); } bool GnomeCompatPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/mblur/0000755000015301777760000000000012321344021020276 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/mblur/mblur.xml.in0000644000015301777760000000364312321343002022552 0ustar pbusernogroup00000000000000 <_short>Motion blur <_long>Motion blur effect Effects opengl composite opengl decor <_short>Main <_short>Activate <_short>Main <_short>Visibility/Performance <_short>Activate compiz-0.9.11+14.04.20140409/plugins/mblur/CMakeLists.txt0000644000015301777760000000015212321343002023032 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (mblur PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/mblur/src/0000755000015301777760000000000012321344021021065 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/mblur/src/mblur.cpp0000644000015301777760000001557112321343002022721 0ustar pbusernogroup00000000000000/* * Compiz motion blur effect plugin * * mblur.c * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "mblur.h" COMPIZ_PLUGIN_20090315 (mblur, MblurPluginVTable); static void toggleFunctions (bool enabled) { MBLUR_SCREEN (screen); ms->cScreen->preparePaintSetEnabled (ms, enabled); ms->gScreen->glPaintOutputSetEnabled (ms, enabled); } /* activate/deactivate motion blur */ bool MblurScreen::toggle (CompAction *action, CompAction::State state, CompOption::Vector options) { activated = !activated; if (activated) toggleFunctions (true); return true; } void MblurScreen::preparePaint (int msec) { active |= activated; /* fade motion blur out if no longer active */ if (activated) { timer = 500; toggleFunctions (true); } else { timer -= msec; } // calculate motion blur strength dependent on framerate float val = 101 - MIN (100, MAX (1, msec) ); float a_val = optionGetStrength () / 20.0; a_val = a_val * a_val; a_val /= 100.0; alpha = 1.0 - pow (a_val, 1.0 / val); if (active && timer <= 0) cScreen->damageScreen (); if (timer <= 0) { active = FALSE; } if (timer <= 0 && !activated) toggleFunctions (false); if (update && active) cScreen->damageScreen (); cScreen->preparePaint (msec); } /* FIXME?: This function was originally paintScreen (!= paintOutput). However * no paintScreen exists in compiz 0.9. This might result in code being executed * twice! */ bool MblurScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; if (!active) update = true; status = gScreen->glPaintOutput (attrib, transform, region, output, mask); bool enable_scissor = false; if (active && glIsEnabled (GL_SCISSOR_TEST) ) { glDisable (GL_SCISSOR_TEST); enable_scissor = true; } if (active && optionGetMode () == ModeTextureCopy) { float tx, ty; GLuint target; if (GL::textureNonPowerOfTwo || (POWER_OF_TWO (screen->width ()) && POWER_OF_TWO (screen->height ()) ) ) { target = GL_TEXTURE_2D; tx = 1.0f / screen->width (); ty = 1.0f / screen->height (); } else { target = GL_TEXTURE_RECTANGLE_NV; tx = 1; ty = 1; } if (!texture) { glGenTextures (1, &texture); glBindTexture (target, texture); glTexParameteri (target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture (target, 0); } // blend motion blur texture to screen glPushAttrib (GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT | GL_VIEWPORT_BIT); glPushMatrix (); glLoadIdentity (); glViewport (0, 0, screen->width (), screen->height ()); glTranslatef (-0.5f, -0.5f, -DEFAULT_Z_CAMERA); glScalef (1.0f / screen->width (), -1.0f / screen->height (), 1.0f); glTranslatef (0.0f, -screen->height (), 0.0f); glBindTexture (target, texture); glEnable (target); if (!update) { glEnable (GL_BLEND); glBlendFunc (GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); alpha = (timer / 500.0) * alpha + (1.0 - (timer / 500.0) ) * 0.5; glColor4f (1, 1, 1, alpha); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glBegin (GL_QUADS); glTexCoord2f (0, screen->height () * ty); glVertex2f (0, 0); glTexCoord2f (0, 0); glVertex2f (0, screen->height ()); glTexCoord2f (screen->width () * tx, 0); glVertex2f (screen->width (), screen->height ()); glTexCoord2f (screen->width () * tx, screen->height () * ty); glVertex2f (screen->width (), 0); glEnd (); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_BLEND); // copy new screen to motion blur texture glCopyTexSubImage2D (target, 0, 0, 0, 0, 0, screen->width (), screen->height ()); } else { glCopyTexImage2D (target, 0, GL_RGB, 0, 0, screen->width (), screen->height (), 0); } glBindTexture (target, 0); glDisable (target); glPopMatrix (); glPopAttrib (); update = false; cScreen->damageScreen (); } if (active && optionGetMode () == ModeAccumulationBuffer) { // create motion blur effect using accumulation buffer alpha = (timer / 500.0) * alpha + (1.0 - (timer / 500.0) ) * 0.5; if (update) { glAccum (GL_LOAD, 1.0); } else { glAccum (GL_MULT, 1.0 - alpha); glAccum (GL_ACCUM, alpha); glAccum (GL_RETURN, 1.0); } update = FALSE; cScreen->damageScreen (); } if (enable_scissor) glEnable (GL_SCISSOR_TEST); return status; } void MblurScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (optionGetOnTransformedScreen () && (mask & PAINT_SCREEN_TRANSFORMED_MASK) ) { toggleFunctions (true); active = TRUE; timer = 500; } gScreen->glPaintTransformedOutput (attrib, transform, region, output, mask); } MblurScreen::MblurScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), active (false), update (true), timer (500), activated (false), texture (0) { CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); gScreen->glPaintTransformedOutputSetEnabled (this, true); optionSetInitiateKeyInitiate (boost::bind (&MblurScreen::toggle, this, _1, _2, _3)); cScreen->damageScreen (); } MblurScreen::~MblurScreen () { if (texture) glDeleteTextures (1, &texture); } bool MblurPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/mblur/src/mblur.h0000644000015301777760000000414612321343002022362 0ustar pbusernogroup00000000000000/* * Compiz motion blur effect plugin * * mblur.c * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 by * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include "mblur_options.h" class MblurScreen : public PluginClassHandler , public CompositeScreenInterface, public GLScreenInterface, public MblurOptions { public: MblurScreen (CompScreen *); ~MblurScreen (); CompositeScreen *cScreen; GLScreen *gScreen; bool active; bool update; /* is an update of the motion blur texture needed? */ float alpha; /* motion blur blending value */ float timer; /* motion blur fadeout time */ bool activated; GLuint texture; /* functions that we will intercept */ void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); bool toggle (CompAction *action, CompAction::State state, CompOption::Vector options); }; #define MBLUR_SCREEN(s) \ MblurScreen *ms = MblurScreen::get (s) class MblurPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/showrepaint/0000755000015301777760000000000012321344021021520 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/showrepaint/showrepaint.xml.in0000644000015301777760000000127312321343002025213 0ustar pbusernogroup00000000000000 <_short>Show Repaint <_long>Show repainted regions in different colors Utility opengl compiz-0.9.11+14.04.20140409/plugins/showrepaint/CMakeLists.txt0000644000015301777760000000016012321343002024253 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (showrepaint PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/showrepaint/src/0000755000015301777760000000000012321344021022307 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/showrepaint/src/showrepaint.h0000644000015301777760000000352412321343002025025 0ustar pbusernogroup00000000000000/* * Copyright (c) 2006 Darryll Truchan * * Pixel shader negating by Dennis Kasprzyk * Usage of matches by Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include "showrepaint_options.h" class ShowrepaintScreen : public GLScreenInterface, public PluginClassHandler , public ShowrepaintOptions { public: ShowrepaintScreen (CompScreen *); ~ShowrepaintScreen (); private: bool active; CompRegion tmpRegion; // GLScreenInterface method bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); bool toggle (CompAction *action, CompAction::State state, CompOption::Vector options); CompositeScreen *cScreen; GLScreen *gScreen; }; class ShowrepaintPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/showrepaint/src/showrepaint.cpp0000644000015301777760000000777112321343002025370 0ustar pbusernogroup00000000000000/* * * Compiz show repainted regions plugin * * showrepainted.c * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@compiz-fusion.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. * */ #include "showrepaint.h" COMPIZ_PLUGIN_20090315 (showrepaint, ShowrepaintPluginVTable); bool ShowrepaintScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; GLMatrix sTransform; // initially identity matrix unsigned short color[4]; status = gScreen->glPaintOutput (attrib, transform, region, output, mask); tmpRegion = region.intersected (*output); if (tmpRegion.isEmpty ()) return status; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); color[3] = optionGetIntensity () * 0xffff / 100; color[0] = (rand () & 7) * color[3] / 8; color[1] = (rand () & 7) * color[3] / 8; color[2] = (rand () & 7) * color[3] / 8; GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); if (!glBlendEnabled) glEnable (GL_BLEND); std::vector vertices; /* for each rectangle, use two triangles to display it */ foreach (const CompRect &box, tmpRegion.rects ()) { //first triangle vertices.push_back (box.x1 ()); vertices.push_back (box.y1 ()); vertices.push_back (0.0f); vertices.push_back (box.x1 ()); vertices.push_back (box.y2 ()); vertices.push_back (0.0f); vertices.push_back (box.x2 ()); vertices.push_back (box.y2 ()); vertices.push_back (0.0f); //second triangle vertices.push_back (box.x2 ()); vertices.push_back (box.y2 ()); vertices.push_back (0.0f); vertices.push_back (box.x2 ()); vertices.push_back (box.y1 ()); vertices.push_back (0.0f); vertices.push_back (box.x1 ()); vertices.push_back (box.y1 ()); vertices.push_back (0.0f); } GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); stream->begin (GL_TRIANGLES); stream->color4f ((float)color[0] / 65535.0f, (float)color[1] / 65535.0f, (float)color[2] / 65535.0f, (float)color[3] / 65535.0f); stream->addVertices (vertices.size () / 3, &vertices[0]); if (stream->end ()) stream->render (sTransform); stream->colorDefault (); /* only disable blending if it was disabled before */ if (!glBlendEnabled) glDisable (GL_BLEND); return status; } bool ShowrepaintScreen::toggle (CompAction *action, CompAction::State state, CompOption::Vector options) { active = !active; gScreen->glPaintOutputSetEnabled (this, active); if (!active) { // Turning off show-repaint mode, so request the screen to be repainted cScreen->damageScreen (); } return true; } ShowrepaintScreen::ShowrepaintScreen (CompScreen *screen) : PluginClassHandler (screen), ShowrepaintOptions (), active (false), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)) { GLScreenInterface::setHandler (gScreen, false); optionSetToggleKeyInitiate (boost::bind (&ShowrepaintScreen::toggle, \ this, _1, _2, _3)); } ShowrepaintScreen::~ShowrepaintScreen () { // Request the screen to be repainted on exit cScreen->damageScreen (); } bool ShowrepaintPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/stackswitch/0000755000015301777760000000000012321344021021504 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/stackswitch/CMakeLists.txt0000644000015301777760000000016512321343002024244 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (stackswitch PLUGINDEPS opengl composite text) compiz-0.9.11+14.04.20140409/plugins/stackswitch/src/0000755000015301777760000000000012321344021022273 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/stackswitch/src/stackswitch.cpp0000644000015301777760000007531112321343002025333 0ustar pbusernogroup00000000000000/* * * Compiz stackswitch switcher plugin * * stackswitch.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "stackswitch.h" COMPIZ_PLUGIN_20090315 (stackswitch, StackswitchPluginVTable) bool textAvailable; bool StackswitchWindow::isStackswitchable () { STACKSWITCH_SCREEN (screen); if (window->overrideRedirect () || window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return false; if (!window->mapNum () || !window->isViewable ()) { if (ss->optionGetMinimized ()) { if (!window->minimized () && !window->inShowDesktopMode () && !window->shaded ()) return false; } else return false; } if (ss->mType == StackswitchTypeNormal) { if (!window->mapNum () || !window->isViewable ()) { if (window->serverX () + window->width () <= 0 || window->serverY () + window->height () <= 0 || window->serverX () >= screen->width () || window->serverY () >= screen->height ()) return false; } else if (!window->focus ()) return false; } else if (ss->mType == StackswitchTypeGroup && ss->mClientLeader != window->clientLeader () && ss->mClientLeader != window->id ()) return false; if (window->state () & CompWindowStateSkipTaskbarMask || !ss->mCurrentMatch.evaluate (window)) return false; return true; } void StackswitchScreen::renderWindowTitle () { if (!textAvailable || !optionGetWindowTitle ()) return; CompText::Attrib tA; CompRect oe = screen->getCurrentOutputExtents (); /* 75% of the output device as maximum width */ tA.maxWidth = oe.width () * 3 / 4; tA.maxHeight = 100; tA.family = "Sans"; tA.size = optionGetTitleFontSize (); tA.color[0] = optionGetTitleFontColorRed (); tA.color[1] = optionGetTitleFontColorGreen (); tA.color[2] = optionGetTitleFontColorBlue (); tA.color[3] = optionGetTitleFontColorAlpha (); tA.flags = CompText::WithBackground | CompText::Ellipsized; if (optionGetTitleFontBold ()) tA.flags |= CompText::StyleBold; tA.bgHMargin = 15; tA.bgVMargin = 15; tA.bgColor[0] = optionGetTitleBackColorRed (); tA.bgColor[1] = optionGetTitleBackColorGreen (); tA.bgColor[2] = optionGetTitleBackColorBlue (); tA.bgColor[3] = optionGetTitleBackColorAlpha (); bool showViewport = (mType == StackswitchTypeAll); mText.renderWindowTitle (mSelectedWindow, showViewport, tA); } void StackswitchScreen::drawWindowTitle (GLMatrix &transform, CompWindow *w) { if (!textAvailable || !optionGetWindowTitle ()) return; GLint oldBlendSrc, oldBlendDst; GLMatrix wTransform (transform); float y; GLTexture *icon; STACKSWITCH_WINDOW (w); CompRect oe = screen->getCurrentOutputExtents (); float width = mText.getWidth (); float height = mText.getHeight (); float x = oe.centerX (); float tx = x - width / 2; switch (optionGetTitleTextPlacement ()) { case StackswitchOptions::TitleTextPlacementOnThumbnail: { GLVector v (w->x () + (w->width () / 2.0), w->y () + (w->width () / 2.0), 0.0f, 1.0f); GLMatrix pm (gScreen->projectionMatrix ()); wTransform.scale (1.0, 1.0, 1.0 / screen->height ()); wTransform.translate (sw->mTx, sw->mTy, 0.0f); wTransform.rotate (-mRotation, 1.0, 0.0, 0.0); wTransform.scale (sw->mScale, sw->mScale, 1.0); wTransform.translate (+w->border ().left, 0.0 - (w->height () + w->border ().bottom), 0.0f); wTransform.translate (-w->x (), -w->y (), 0.0f); GLMatrix mvp = pm * wTransform; v = mvp * v; v.homogenize (); x = (v[GLVector::x] + 1.0) * oe.width () * 0.5; y = (v[GLVector::y] - 1.0) * oe.height () * -0.5; x += oe.x1 (); y += oe.y1 (); tx = MAX (oe.x1 (), x - (width / 2.0)); if (tx + width > oe.x2 ()) tx = oe.x2 () - width; } break; case StackswitchOptions::TitleTextPlacementCenteredOnScreen: y = oe.centerY () + height / 2; break; case StackswitchOptions::TitleTextPlacementAbove: case StackswitchOptions::TitleTextPlacementBelow: { CompRect workArea = screen->currentOutputDev ().workArea (); if (optionGetTitleTextPlacement () == StackswitchOptions::TitleTextPlacementAbove) y = oe.y1 () + workArea.y () + height; else y = oe.y1 () + workArea.y2 () - 96; } break; default: return; break; } tx = floor (tx); y = floor (y); glGetIntegerv (GL_BLEND_SRC, &oldBlendSrc); glGetIntegerv (GL_BLEND_DST, &oldBlendDst); GLboolean wasBlend = glIsEnabled (GL_BLEND); if (!wasBlend) glEnable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glColor4f (1.0, 1.0, 1.0, 1.0); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); icon = sw->gWindow->getIcon (512, 512); if (!icon) icon = gScreen->defaultIcon (); if (icon && (icon->name ())) { float ix = floor (x - (icon->width () / 2.0)); icon->enable (GLTexture::Good); GLTexture::Matrix m = icon->matrix (); glColor4f (0.0, 0.0, 0.0, 0.1); for (int off = 0; off < 6; ++off) { glBegin (GL_QUADS); glTexCoord2f (COMP_TEX_COORD_X (m, 0), COMP_TEX_COORD_Y (m ,0)); glVertex2f (ix - off, y - off); glTexCoord2f (COMP_TEX_COORD_X (m, 0), COMP_TEX_COORD_Y (m, icon->height ())); glVertex2f (ix - off, y + icon->height () + off); glTexCoord2f (COMP_TEX_COORD_X (m, icon->width ()), COMP_TEX_COORD_Y (m, icon->height ())); glVertex2f (ix + icon->width () + off, y + icon->height () + off); glTexCoord2f (COMP_TEX_COORD_X (m, icon->width ()), COMP_TEX_COORD_Y (m, 0)); glVertex2f (ix + icon->width () + off, y - off); glEnd (); } glColor4f (1.0, 1.0, 1.0, 1.0); glBegin (GL_QUADS); glTexCoord2f (COMP_TEX_COORD_X (m, 0), COMP_TEX_COORD_Y (m ,0)); glVertex2f (ix, y); glTexCoord2f (COMP_TEX_COORD_X (m, 0), COMP_TEX_COORD_Y (m, icon->height ())); glVertex2f (ix, y + icon->height ()); glTexCoord2f (COMP_TEX_COORD_X (m, icon->width ()), COMP_TEX_COORD_Y (m, icon->height ())); glVertex2f (ix + icon->width (), y + icon->height ()); glTexCoord2f (COMP_TEX_COORD_X (m, icon->width ()), COMP_TEX_COORD_Y (m, 0)); glVertex2f (ix + icon->width (), y); glEnd (); icon->disable (); } mText.draw (x - mText.getWidth () / 2, y, 1.0); glPopMatrix (); glColor4usv (defaultColor); if (!wasBlend) glDisable (GL_BLEND); glBlendFunc (oldBlendSrc, oldBlendDst); } bool StackswitchWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; STACKSWITCH_SCREEN (screen); if (ss->mState != StackswitchStateNone) { bool scaled = false; float rotation; if (window->mapNum ()) { if (!gWindow->textures ().size ()) gWindow->bind (); } if (mAdjust || mSlot) { scaled = (mAdjust && ss->mState != StackswitchStateSwitching) || (mSlot && ss->mPaintingSwitcher); mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; } else if (ss->mState != StackswitchStateIn && ss->optionGetDarkenBack ()) { GLWindowPaintAttrib sAttrib (attrib); /* modify brightness of the other windows */ sAttrib.brightness = sAttrib.brightness / 2; } status = gWindow->glPaint (attrib, transform, region, mask); if (ss->optionGetInactiveRotate ()) rotation = MIN (mRotation, ss->mRotation); else rotation = ss->mRotation; if (scaled && gWindow->textures ().size ()) { GLFragment::Attrib fragment (gWindow->lastPaintAttrib ()); GLMatrix wTransform (transform); if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) return false; if (mSlot && window->id () != ss->mSelectedWindow) fragment.setOpacity ((float)fragment.getOpacity () * ss->optionGetInactiveOpacity () / 100); if (window->alpha () || fragment.getOpacity () != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.scale (1.0, 1.0, 1.0 / screen->height ()); wTransform.translate (mTx, mTy, 0.0f); wTransform.rotate (-rotation, 1.0, 0.0, 0.0); wTransform.scale (mScale, mScale, 1.0); wTransform.translate (+window->border ().left, 0.0 -(window->height () + window->border ().bottom), 0.0f); wTransform.translate (-window->x (), -window->y (), 0.0f); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); gWindow->glDraw (wTransform, fragment, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); glPopMatrix (); } if (scaled && !gWindow->textures ().size ()) { GLTexture *icon = gWindow->getIcon (512, 512); if (!icon) icon = ss->gScreen->defaultIcon (); if (icon && (icon->name ())) { CompRegion iconReg (0, 0, icon->width (), icon->height ()); float scale = MIN (window->width () / icon->width (), window->height () / icon->height ()); scale *= mScale; mask |= PAINT_WINDOW_BLEND_MASK; /* if we paint the icon for a minimized window, we need to force the usage of a good texture filter */ if (!gWindow->textures ().size ()) mask |= PAINT_WINDOW_TRANSFORMED_MASK; GLTexture::Matrix matrix = icon->matrix (); GLTexture::MatrixList matl; matl.push_back (matrix); gWindow->geometry ().reset (); gWindow->glAddGeometry (matl, iconReg, infiniteRegion); if (gWindow->geometry ().vCount) { GLFragment::Attrib fragment (attrib); GLMatrix wTransform (transform); if (!gWindow->textures ().size ()) fragment.setOpacity (gWindow->paintAttrib ().opacity); wTransform.scale (1.0, 1.0, 1.0 / screen->height ()); wTransform.translate (mTx, mTy, 0.0f); wTransform.rotate (-rotation, 1.0, 0.0, 0.0); wTransform.scale (scale, scale, 1.0); wTransform.translate (0.0, -icon->height (), 0.0f); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); gWindow->glDrawTexture (icon, fragment, mask); glPopMatrix (); } } } } else status = gWindow->glPaint (attrib, transform, region, mask); return status; } int compareWindows (const void *elem1, const void *elem2) { CompWindow *w1 = *((CompWindow **) elem1); CompWindow *w2 = *((CompWindow **) elem2); if (w1->mapNum () && !w2->mapNum ()) return -1; if (w2->mapNum () && !w1->mapNum ()) return 1; return w2->activeNum () - w1->activeNum (); } int compareStackswitchWindowDepth (const void *elem1, const void *elem2) { StackswitchSlot *a1 = *(((StackswitchDrawSlot *) elem1)->slot); StackswitchSlot *a2 = *(((StackswitchDrawSlot *) elem2)->slot); if (a1->y < a2->y) return -1; else if (a1->y > a2->y) return 1; else { CompWindow *a1 = (((StackswitchDrawSlot *) elem1)->w); CompWindow *a2 = (((StackswitchDrawSlot *) elem2)->w); STACKSWITCH_SCREEN (screen); if (a1->id () == ss->mSelectedWindow) return 1; else if (a2->id () == ss->mSelectedWindow) return -1; else return 0; } } bool StackswitchScreen::layoutThumbs () { CompWindow *w; int index; int ww, wh; float xScale, yScale; float swi = 0.0; int col = 0, row = 0; int c, cindex, ci, gap, hasActive = 0; bool exit; if ((mState == StackswitchStateNone) || (mState == StackswitchStateIn)) return false; CompRect oe = screen->getCurrentOutputExtents (); for (index = 0; index < mNWindows; ++index) { w = mWindows[index]; ww = w->width () + w->border ().left + w->border ().right; wh = w->height () + w->border ().top + w->border ().bottom; swi += ((float) ww / (float) wh) * (oe.width () / (float) oe.height ()); } int cols = ceil (sqrtf (swi)); swi = 0.0; for (index = 0; index < mNWindows; ++index) { w = mWindows[index]; ww = w->width () + w->border ().left + w->border ().right; wh = w->height () + w->border ().top + w->border ().bottom; swi += (float)ww / (float)wh; if (swi > cols) { ++row; swi = (float)ww / (float)wh; col = 0; } ++col; } int rows = row + 1; oe.setHeight (oe.width () / cols); float rh = ((float) oe.height () * 0.8) / rows; for (index = 0; index < mNWindows; ++index) { w = mWindows[index]; STACKSWITCH_WINDOW (w); if (!sw->mSlot) sw->mSlot = (StackswitchSlot *) malloc (sizeof (StackswitchSlot)); if (!sw->mSlot) return false; mDrawSlots[index].w = w; mDrawSlots[index].slot = &sw->mSlot; } index = 0; for (int r = 0; r < rows && index < mNWindows; ++r) { c = 0; swi = 0.0; cindex = index; exit = false; while (index < mNWindows && !exit) { w = mWindows[index]; STACKSWITCH_WINDOW (w); sw->mSlot->x = oe.x1 () + swi; sw->mSlot->y = oe.y2 () - (rh * r) - (oe.height () * 0.1); ww = w->width () + w->border ().left + w->border ().right; wh = w->height () + w->border ().top + w->border ().bottom; if (ww > oe.width ()) xScale = oe.width () / (float) ww; else xScale = 1.0f; if (wh > oe.height ()) yScale = oe.height () / (float) wh; else yScale = 1.0f; sw->mSlot->scale = MIN (xScale, yScale); if (swi + (ww * sw->mSlot->scale) > oe.width () && cindex != index) { exit = true; continue; } if (w->id () == mSelectedWindow) hasActive = 1; swi += ww * sw->mSlot->scale; ++c; ++index; } gap = oe.width () - swi; gap /= c + 1; index = cindex; ci = 1; while (ci <= c) { w = mWindows[index]; STACKSWITCH_WINDOW (w); sw->mSlot->x += ci * gap; if (hasActive == 0) sw->mSlot->y += sqrt(2 * oe.height () * oe.height ()) - rh; ++ci; ++index; } if (hasActive == 1) ++hasActive; } /* sort the draw list so that the windows with the * lowest Y value (the windows being farest away) * are drawn first */ qsort (mDrawSlots, mNWindows, sizeof (StackswitchDrawSlot), compareStackswitchWindowDepth); return true; } void StackswitchScreen::addWindowToList (CompWindow *w) { if (mWindowsSize <= mNWindows) { mWindows = (CompWindow **) realloc (mWindows, sizeof (CompWindow *) * (mNWindows + 32)); if (!mWindows) return; mDrawSlots = (StackswitchDrawSlot *) realloc (mDrawSlots, sizeof (StackswitchDrawSlot) * (mNWindows + 32)); if (!mDrawSlots) { free (mDrawSlots); return; } mWindowsSize = mNWindows + 32; } mWindows[++mNWindows] = w; } bool StackswitchScreen::updateWindowList () { qsort (mWindows, mNWindows, sizeof (CompWindow *), compareWindows); return layoutThumbs (); } bool StackswitchScreen::createWindowList () { mNWindows = 0; foreach (CompWindow *w, screen->windows ()) { STACKSWITCH_WINDOW (w); if (sw->isStackswitchable ()) { STACKSWITCH_WINDOW (w); addWindowToList (w); sw->mAdjust = true; } } return updateWindowList (); } void StackswitchScreen::switchToWindow (bool toNext) { CompWindow *w; if (!mGrabIndex) return; for (int cur = 0; cur < mNWindows; ++cur) { if (mWindows[cur]->id () == mSelectedWindow) break; } if (cur == mNWindows) return; if (toNext) w = mWindows[(cur + 1) % mNWindows]; else w = mWindows[(cur + mNWindows - 1) % mNWindows]; if (w) { Window old = mSelectedWindow; mSelectedWindow = w->id (); if (old != w->id ()) { mRotateAdjust = true; mMoreAdjust = true; foreach (CompWindow *w, screen->windows ()) { STACKSWITCH_WINDOW (w); sw->mAdjust = true; } cScreen->damageScreen (); renderWindowTitle (); } } } int StackswitchScreen::countWindows () { CompWindow *w; int count = 0; foreach (w, screen->windows ()) { if (StackswitchWindow::get (w)->isStackswitchable ()) ++count; } return count; } int StackswitchScreen::adjustStackswitchRotation (float chunk) { float rot; if (mState != StackswitchStateNone && mState != StackswitchStateIn) rot = optionGetTilt (); else rot = 0.0; float dx = rot - mRotation; float adjust = dx * 0.15f; float amount = fabs (dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; mRVelocity = (amount * mRVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (mRVelocity) < 0.2f) { mRVelocity = 0.0f; mRotation = rot; return false; } mRotation += mRVelocity * chunk; return true; } int StackswitchWindow::adjustVelocity () { float x1, y1, scale, rot; STACKSWITCH_SCREEN (screen); if (mSlot) { scale = mSlot->scale; x1 = mSlot->x; y1 = mSlot->y; } else { scale = 1.0f; x1 = window->x () - window->border ().left; y1 = window->y () + window->height () + window->border ().bottom; } if (window->id () == ss->mSelectedWindow) rot = ss->mRotation; else rot = 0.0; float dx = x1 - mTx; float adjust = dx * 0.15f; float amount = fabs (dx) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; mXVelocity = (amount * mXVelocity + adjust) / (amount + 1.0f); float dy = y1 - mTy; adjust = dy * 0.15f; amount = fabs (dy) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; mYVelocity = (amount * mYVelocity + adjust) / (amount + 1.0f); float ds = scale - mScale; adjust = ds * 0.1f; amount = fabs (ds) * 7.0f; if (amount < 0.01f) amount = 0.01f; else if (amount > 0.15f) amount = 0.15f; mScaleVelocity = (amount * mScaleVelocity + adjust) / (amount + 1.0f); float dr = rot - mRotation; adjust = dr * 0.15f; amount = fabs (dr) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; mRotVelocity = (amount * mRotVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (mXVelocity) < 0.2f && fabs (dy) < 0.1f && fabs (mYVelocity) < 0.2f && fabs (ds) < 0.001f && fabs (mScaleVelocity) < 0.002f && fabs (dr) < 0.1f && fabs (mRotVelocity) < 0.2f) { mXVelocity = mYVelocity = mScaleVelocity = 0.0f; mTx = x1; mTy = y1; mRotation = rot; mScale = scale; return 0; } return 1; } bool StackswitchScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { GLMatrix sTransform (transform); if (mState != StackswitchStateNone || mRotation != 0.0) { mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; mask |= PAINT_SCREEN_TRANSFORMED_MASK; mask |= PAINT_SCREEN_CLEAR_MASK; sTransform.translate (0.0, -0.5, -DEFAULT_Z_CAMERA); sTransform.rotate (-mRotation, 1.0, 0.0, 0.0); sTransform.translate (0.0, 0.5, DEFAULT_Z_CAMERA); } bool status = gScreen->glPaintOutput (attrib, sTransform, region, output, mask); if (mState != StackswitchStateNone && ((unsigned int) output->id () == (unsigned int) ~0 || screen->outputDevs ().at (screen->currentOutputDev ().id ()) == *output)) { CompWindow *aw = NULL; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glPushMatrix (); glLoadMatrixf (sTransform.getMatrix ()); mPaintingSwitcher = true; for (int i = 0; i < mNWindows; ++i) { if (mDrawSlots[i].slot && *(mDrawSlots[i].slot)) { CompWindow *w = mDrawSlots[i].w; if (w->id () == mSelectedWindow) aw = w; STACKSWITCH_WINDOW (w); sw->gWindow->glPaint (sw->gWindow->paintAttrib (), sTransform, infiniteRegion, 0); } } GLMatrix tTransform (transform); tTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glLoadMatrixf (tTransform.getMatrix ()); if (mText.getWidth () && (mState != StackswitchStateIn) && aw) drawWindowTitle (sTransform, aw); mPaintingSwitcher = false; glPopMatrix (); } return status; } void StackswitchScreen::preparePaint (int msSinceLastPaint) { if (mState != StackswitchStateNone && (mMoreAdjust || mRotateAdjust)) { CompWindow *w; float amount = msSinceLastPaint * 0.05f * optionGetSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; layoutThumbs (); while (steps--) { mRotateAdjust = adjustStackswitchRotation (chunk); mMoreAdjust = false; foreach (w, screen->windows ()) { STACKSWITCH_WINDOW (w); if (sw->mAdjust) { sw->mAdjust = sw->adjustVelocity (); mMoreAdjust |= sw->mAdjust; sw->mTx += sw->mXVelocity * chunk; sw->mTy += sw->mYVelocity * chunk; sw->mScale += sw->mScaleVelocity * chunk; sw->mRotation += sw->mRotVelocity * chunk; } else if (sw->mSlot) { sw->mScale = sw->mSlot->scale; sw->mTx = sw->mSlot->x; sw->mTy = sw->mSlot->y; if (w->id () == mSelectedWindow) sw->mRotation = mRotation; else sw->mRotation = 0.0; } } if (!mMoreAdjust && !mRotateAdjust) break; } } cScreen->preparePaint (msSinceLastPaint); } void StackswitchScreen::donePaint () { if (mState != StackswitchStateNone) { if (mMoreAdjust) cScreen->damageScreen (); else { if (mRotateAdjust) cScreen->damageScreen (); if (mState == StackswitchStateIn) mState = StackswitchStateNone; else if (mState == StackswitchStateOut) mState = StackswitchStateSwitching; } } cScreen->donePaint (); } bool StackswitchScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mGrabIndex) { screen->removeGrab (mGrabIndex, 0); mGrabIndex = 0; } if (mState != StackswitchStateNone) { CompWindow *w; foreach (CompWindow *w, screen->windows ()) { STACKSWITCH_WINDOW (w); if (sw->mSlot) { free (sw->mSlot); sw->mSlot = NULL; sw->mAdjust = true; } } mMoreAdjust = true; mState = StackswitchStateIn; cScreen->damageScreen (); if (!(state & CompAction::StateCancel) && mSelectedWindow) { w = screen->findWindow (mSelectedWindow); if (w) screen->sendWindowActivationRequest (w->id ()); } } if (action) action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton | CompAction::StateTermEdge)); return false; } bool StackswitchScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (screen->otherGrabExist ("stackswitch", 0)) return false; mCurrentMatch = optionGetWindowMatch (); CompMatch match = CompOption::getMatchOptionNamed (options, "match", CompMatch ()); mMatch = match; int count = countWindows (); if (count < 1) return false; if (!mGrabIndex) mGrabIndex = screen->pushGrab (screen->invisibleCursor (), "stackswitch"); if (mGrabIndex) { mState = StackswitchStateOut; if (!createWindowList ()) return false; mSelectedWindow = mWindows[0]->id (); renderWindowTitle (); foreach (CompWindow *w, screen->windows ()) { STACKSWITCH_WINDOW (w); sw->mTx = w->x () - w->border ().left; sw->mTy = w->y () + w->height () + w->border ().bottom; } mMoreAdjust = true; cScreen->damageScreen (); } return true; } bool StackswitchScreen::doSwitch (CompAction *action, CompAction::State state, CompOption::Vector options, bool nextWindow, StackswitchType type) { bool ret = true; if ((mState == StackswitchStateNone) || (mState == StackswitchStateIn)) { if (mType == StackswitchTypeGroup) { CompWindow *w; w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) { mType = StackswitchTypeGroup; mClientLeader = (w->clientLeader ()) ? w->clientLeader () : w->id (); ret = initiate (action, state, options); } } else { mType = type; ret = initiate (action, state, options); } if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); if (state & CompAction::StateInitEdge) action->setState (action->state () | CompAction::StateTermEdge); else if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); } if (ret) switchToWindow (nextWindow); return ret; } void StackswitchScreen::windowRemove (Window id) { CompWindow *w; w = screen->findWindow (id); if (w) { bool inList = false; int i = 0; STACKSWITCH_WINDOW (w); if (mState == StackswitchStateNone || sw->isStackswitchable ()) return; Window selected = mSelectedWindow; while (i < mNWindows) { if (w->id () == mWindows[i]->id ()) { inList = true; if (w->id () == selected) { if (i < (mNWindows - 1)) selected = mWindows[i + 1]->id (); else selected = mWindows[0]->id (); mSelectedWindow = selected; } --mNWindows; for (int j = i; j < mNWindows; ++j) mWindows[j] = mWindows[j + 1]; } else ++i; } if (!inList) return; if (mNWindows == 0) { CompOption::Vector o; terminate (NULL, 0, o); return; } if (!mGrabIndex) return; if (updateWindowList ()) { mMoreAdjust = true; mState = StackswitchStateOut; cScreen->damageScreen (); } } } void StackswitchScreen::handleEvent (XEvent *event) { screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == XA_WM_NAME) { CompWindow *w; w = screen->findWindow (event->xproperty.window); if (w && mGrabIndex && (w->id () == mSelectedWindow)) { renderWindowTitle (); cScreen->damageScreen (); } } break; case UnmapNotify: windowRemove (event->xunmap.window); break; case DestroyNotify: windowRemove (event->xdestroywindow.window); break; default: break; } } bool StackswitchWindow::damageRect (bool initial, const CompRect &rect) { bool status = false; STACKSWITCH_SCREEN (screen); if (initial) { if (ss->mGrabIndex && isStackswitchable ()) { ss->addWindowToList (window); if (ss->updateWindowList ()) { mAdjust = true; ss->mMoreAdjust = true; ss->mState = StackswitchStateOut; ss->cScreen->damageScreen (); } } } else if (ss->mState == StackswitchStateSwitching && mSlot) { ss->cScreen->damageScreen (); status = true; } status |= cWindow->damageRect (initial, rect); return status; } StackswitchScreen::StackswitchScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mGrabIndex (0), mState (StackswitchStateNone), mMoreAdjust (false), mRotateAdjust (false), mPaintingSwitcher (false), mRVelocity (0.0f), mWindows (NULL), mDrawSlots (NULL), mWindowsSize (0), mNWindows (0), mClientLeader (None), mSelectedWindow (None) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); #define STACKTERMBIND(opt, func) \ optionSet##opt##Terminate (boost::bind (&StackswitchScreen::func, \ this, _1, _2, _3)); #define STACKSWITCHBIND(opt, func, next, type) \ optionSet##opt##Initiate (boost::bind (&StackswitchScreen::func, \ this, _1, _2, _3, \ next, type)); STACKSWITCHBIND (NextKey, doSwitch, true, StackswitchTypeNormal); STACKSWITCHBIND (PrevKey, doSwitch, false, StackswitchTypeNormal); STACKSWITCHBIND (NextAllKey, doSwitch, true, StackswitchTypeAll); STACKSWITCHBIND (PrevAllKey, doSwitch, false, StackswitchTypeAll); STACKSWITCHBIND (NextGroupKey, doSwitch, true, StackswitchTypeGroup); STACKSWITCHBIND (PrevGroupKey, doSwitch, false, StackswitchTypeGroup); STACKTERMBIND (NextKey, terminate); STACKTERMBIND (PrevKey, terminate); STACKTERMBIND (NextAllKey, terminate); STACKTERMBIND (PrevAllKey, terminate); STACKTERMBIND (NextGroupKey, terminate); STACKTERMBIND (PrevGroupKey, terminate); STACKSWITCHBIND (NextButton, doSwitch, true, StackswitchTypeNormal); STACKSWITCHBIND (PrevButton, doSwitch, false, StackswitchTypeNormal); STACKSWITCHBIND (NextAllButton, doSwitch, true, StackswitchTypeAll); STACKSWITCHBIND (PrevAllButton, doSwitch, false, StackswitchTypeAll); STACKSWITCHBIND (NextGroupButton, doSwitch, true, StackswitchTypeGroup); STACKSWITCHBIND (PrevGroupButton, doSwitch, false, StackswitchTypeGroup); STACKTERMBIND (NextButton, terminate); STACKTERMBIND (PrevButton, terminate); STACKTERMBIND (NextAllButton, terminate); STACKTERMBIND (PrevAllButton, terminate); STACKTERMBIND (NextGroupButton, terminate); STACKTERMBIND (PrevGroupButton, terminate); } StackswitchScreen::~StackswitchScreen () { if (mWindows) free (mWindows); if (mDrawSlots) free (mDrawSlots); } StackswitchWindow::StackswitchWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), mSlot (NULL), mXVelocity (0.0f), mYVelocity (0.0f), mScaleVelocity (0.0f), mRotVelocity (0.0f), mTx (0.0f), mTy (0.0f), mScale (1.0f), mRotation (0.0f), mAdjust (false) { CompositeWindowInterface::setHandler (cWindow); GLWindowInterface::setHandler (gWindow); } StackswitchWindow::~StackswitchWindow () { if (mSlot) free (mSlot); } bool StackswitchPluginVTable::init () { if (CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) textAvailable = true; else { compLogMessage ("stackswitch", CompLogLevelWarn, "No compatible text plugin"\ " loaded"); textAvailable = false; } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/stackswitch/src/stackswitch.h0000644000015301777760000001076512321343002025002 0ustar pbusernogroup00000000000000/* * * Compiz stackswitch switcher plugin * * stackswitch.h * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include #include "stackswitch_options.h" typedef enum { StackswitchStateNone = 0, StackswitchStateOut, StackswitchStateSwitching, StackswitchStateIn } StackswitchState; typedef enum { StackswitchTypeNormal = 0, StackswitchTypeGroup, StackswitchTypeAll } StackswitchType; typedef struct _StackswitchSlot { int x, y; /* thumb center coordinates */ float scale; /* size scale (fit to maximal thumb size) */ } StackswitchSlot; typedef struct _StackswitchDrawSlot { CompWindow *w; StackswitchSlot **slot; } StackswitchDrawSlot; class StackswitchScreen: public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public StackswitchOptions { public: StackswitchScreen (CompScreen *); ~StackswitchScreen (); public: CompositeScreen *cScreen; GLScreen *gScreen; public: void handleEvent (XEvent *); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); public: void renderWindowTitle (); void drawWindowTitle (GLMatrix &transform, CompWindow *w); bool layoutThumbs (); void addWindowToList (CompWindow *w); bool updateWindowList (); bool createWindowList (); void switchToWindow (bool toNext); int countWindows (); int adjustStackswitchRotation (float chunk); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); bool doSwitch (CompAction *action, CompAction::State state, CompOption::Vector options, bool nextWindow, StackswitchType type); void windowRemove (Window id); public: CompText mText; CompScreen::GrabHandle mGrabIndex; StackswitchState mState; StackswitchType mType; bool mMoreAdjust; bool mRotateAdjust; bool mPaintingSwitcher; GLfloat mRVelocity; GLfloat mRotation; /* only used for sorting */ CompWindow **mWindows; StackswitchDrawSlot *mDrawSlots; int mWindowsSize; int mNWindows; Window mClientLeader; Window mSelectedWindow; CompMatch mMatch; CompMatch mCurrentMatch; }; class StackswitchWindow: public PluginClassHandler , public CompositeWindowInterface, public GLWindowInterface { public: StackswitchWindow (CompWindow *); ~StackswitchWindow (); public: CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; public: bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool damageRect (bool, const CompRect &); public: int adjustVelocity (); bool isStackswitchable (); public: StackswitchSlot *mSlot; GLfloat mXVelocity; GLfloat mYVelocity; GLfloat mScaleVelocity; GLfloat mRotVelocity; GLfloat mTx; GLfloat mTy; GLfloat mScale; GLfloat mRotation; bool mAdjust; }; #define STACKSWITCH_WINDOW(w) \ StackswitchWindow *sw = StackswitchWindow::get (w); #define STACKSWITCH_SCREEN(s) \ StackswitchScreen *ss = StackswitchScreen::get (s); class StackswitchPluginVTable: public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/stackswitch/stackswitch.xml.in0000644000015301777760000001505612321343002025167 0ustar pbusernogroup00000000000000 <_short>Stack Window Switcher <_long>Stack Window Switcher Window Management opengl composite opengl text decor <_short>Key bindings <_short>Behavior <_short>Window title display compiz-0.9.11+14.04.20140409/plugins/notification/0000755000015301777760000000000012321344021021643 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/notification/notification.xml.in0000644000015301777760000000225412321343002025461 0ustar pbusernogroup00000000000000 <_short>Notification <_long>Use libnotify to graphically display error messages Utility composite opengl place compiz-0.9.11+14.04.20140409/plugins/notification/images/0000755000015301777760000000000012321344021023110 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/notification/images/compiz.png0000644000015301777760000000244712321343002025124 0ustar pbusernogroup00000000000000‰PNG  IHDR D¤ŠÆ PLTEÂÇÊÉËÈÌÎËÏÑÎÓÕÒÕÞæÖØÕÙÛ×ÛäìÝßÜàãßàéòäæãåî÷èñùëíêìõýíòõîðíî÷ÿñóðóõòõúýøþÿùû÷þûÿþÿüsªs°u³}Áx°„ w¶ “Ðm¦~¯z¸o§•Óp©qª|ºŠÈ—Õ‚´ ™×"x«"Ë(‹Ã(Ï(“Ë( ×-¢Ú/–Ï2¥Ý3Š·4™Ò5§ß6›Ô7„¾7žÐ9•Ç9Ö>”Î?¡ÚC›ÎD¨ÚGžÑH«ÞK¡ÕL±ÝM¯âN˜ÍQ²åR¶ãVªßW¤ÒX»ç\šÑ\¥Ú]¿ì_µã`­ÔcžÛgµÞiÂélÅìn•Ân›Ío¥ÍoÈïp£Üp§Åq‡˜qÊñr¸Ûu“ªvŽy¾áz™­{Š{©Ü|ªÊ|Íï}½î~‚…Ðò€¡ÉÂ߃Ôö†‹Ž†§Â†×ùŠÚü‹Ôñ·ßÁÜÈõ”¾æ”Çî—Åå—Óê˜ÂÖ™›˜š¢ªžÐ÷ŸÉñ£Íö£âû¤Èë¦Óè§©¦¨Ñúª¯±®¹Å¯Ô÷°Ýñ±ÆÒ±Ñá³Øûµ·³µÓñµÖæ¶»½·éý¹»¸¹Þí»Ûù¾ØðÂÇÊÂÞöÅÎÖÆâúÈÜéÉéõÎÛìÎæøÏÑÎÑåòÕÞæÕåìÙïûÛäìÝßÜàéòáíüåî÷èñùìõýíòõî÷ÿõúýøþÿÐtRNS™bG±IDAT…Á½‹$EÀáß[UÓÓsûÅ ‹œ†ŠŠ àiæWl"øwšir‰`p ¡Ù…‚€p&—¨¡"¢ , ®,ËöÎL÷ÌTwÕ[åî ¢Ï#ü7Ãÿ0ü JÏß ÿ qÝw‹öÎ]ÌíÈ%9àRÄ£òÑÆKæ‚äç>ž¾ñÄø8X'ån?ßZpê2H2¤þ+îÜüÆ9ô=°GÊ\A"6Ú¬“0ˆ¤ò^|ÿ¾Ã (Ê…Ñ*õ…·PƒCÆÍÍÍOý z™õ@ V•  v»ÏÔªZ_ ®ûº®ñJEµtÑí¾úã!D\ŒÐEªU|=Ç9#Ͼ\U³YœQÁèü,2‚\Rλ¯ïõíŒu[­Yç UV0XNS4Öûüc´´¢ðFÀ£Mâ^yW¢¨D.šÁ€L"‘ÇaÞl¢ú”r¶&.±.ó}É¢¥§CȺ!¨ÿÜSaÎÎÃ|H«¾_I†²GÎ ¿<\Ý~ñì(æ*Vdš”¹P‚Á®¦&<ˆå’׈eÏË¢WPåÊOÀO¬ºôåXÜHiA“gï†Ø¶¿ý,äš š`DSþüø8_›’‹pòû“ä·&ÅDÈ’Á‹2¢¤ôE{ÜïmóëKHe§Y¸%“%:IQE“±ÖL­ÁqI² LRE$ë$M™¢p$V|ǧ9IEND®B`‚compiz-0.9.11+14.04.20140409/plugins/notification/CMakeLists.txt0000644000015301777760000000043612321343002024404 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (notification PKGDEPS libnotify gtk+-2.0) compiz_pkg_check_modules (HAVE_LIBNOTIFY_0_6_1 libnotify>=0.6.1) if (HAVE_LIBNOTIFY_0_6_1_FOUND) add_definitions (-DHAVE_LIBNOTIFY_0_6_1) endif (HAVE_LIBNOTIFY_0_6_1_FOUND) compiz-0.9.11+14.04.20140409/plugins/notification/src/0000755000015301777760000000000012321344021022432 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/notification/src/notification.h0000644000015301777760000000315612321343002025274 0ustar pbusernogroup00000000000000/* * Notification plugin for compiz * * notification.h * * Copyright (C) 2007 Mike Dransfield (mike (at) blueroot.co.uk) * Maintained by Danny Baumann * Ported to compiz++ by Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include "notification_options.h" extern const std::string IMAGE_DIR; class NotificationScreen : public PluginClassHandler , public NotificationOptions, public ScreenInterface { public: NotificationScreen (CompScreen *); void logMessage (const char *, CompLogLevel, const char *); }; #define NOTIFICATION_SCREEN(s) \ NotificationScreen *ns = NotificationScreen::get (s); class NotificationPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/notification/src/notification.cpp0000644000015301777760000000600112321343002025617 0ustar pbusernogroup00000000000000/* * Notification plugin for compiz * * notification.cpp * * Copyright (C) 2007 Mike Dransfield (mike (at) blueroot.co.uk) * Maintained by Danny Baumann * Ported to compiz++ by Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "notification.h" COMPIZ_PLUGIN_20090315 (notification, NotificationPluginVTable); const std::string IMAGE_DIR(".compiz/images"); /* libnotify 0.7 introduced proper NOTIFY_CHECK_VERSION macro */ #if defined(NOTIFY_CHECK_VERSION) && !defined(HAVE_LIBNOTIFY_0_6_1) #if NOTIFY_CHECK_VERSION(0,6,1) #define HAVE_LIBNOTIFY_0_6_1 #endif #endif void NotificationScreen::logMessage (const char *component, CompLogLevel level, const char *message) { NotifyNotification *n; char *logLevel, *homeDir; CompString iconUri; int timeout; NotifyUrgency urgency; if (level > optionGetMaxLogLevel ()) { screen->logMessage (component, level, message); return; } homeDir = getenv ("HOME"); if (!homeDir) return; /* FIXME: when not installing manually, the image will likely reside in $PREFIX/share/compiz, not in the home dir */ iconUri = "file://"; iconUri += homeDir; iconUri += "/" + IMAGE_DIR + "/compiz.png"; logLevel = (char *) logLevelToString (level); n = notify_notification_new (logLevel, message, iconUri.c_str () #ifndef HAVE_LIBNOTIFY_0_6_1 , NULL #endif ); timeout = optionGetTimeout (); if (timeout > 0) timeout *= 1000; notify_notification_set_timeout (n, timeout); if (level == CompLogLevelFatal || level == CompLogLevelError) urgency = NOTIFY_URGENCY_CRITICAL; else if (level == CompLogLevelWarn) urgency = NOTIFY_URGENCY_NORMAL; else urgency = NOTIFY_URGENCY_LOW; notify_notification_set_urgency (n, urgency); notify_notification_show (n, NULL); g_object_unref (G_OBJECT (n)); screen->logMessage (component, level, message); } NotificationScreen::NotificationScreen (CompScreen *screen) : PluginClassHandler (screen), NotificationOptions () { ScreenInterface::setHandler (screen); } bool NotificationPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/td/0000755000015301777760000000000012321344021017564 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/td/td.xml.in0000644000015301777760000000664412321343002021332 0ustar pbusernogroup00000000000000 <_short>3D Windows <_long>Elevates windows while rotating the cube Effects opengl cube composite opengl cube decor <_short>Misc. Options <_short>Window Depth <_short>Bevel Corners compiz-0.9.11+14.04.20140409/plugins/td/CMakeLists.txt0000644000015301777760000000015412321343002022322 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (td PLUGINDEPS composite opengl cube) compiz-0.9.11+14.04.20140409/plugins/td/src/0000755000015301777760000000000012321344021020353 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/td/src/3d.cpp0000644000015301777760000003512112321343002021365 0ustar pbusernogroup00000000000000#include "3d.h" COMPIZ_PLUGIN_20090315 (td, TdPluginVTable); const double PI = 3.14159265359f; void setFunctions (bool enabled) { TD_SCREEN (screen); tds->gScreen->glPaintOutputSetEnabled (tds, enabled); tds->gScreen->glApplyTransformSetEnabled (tds, enabled); tds->cScreen->donePaintSetEnabled (tds, enabled); tds->cubeScreen->cubePaintViewportSetEnabled (tds, enabled); tds->cubeScreen->cubeShouldPaintViewportSetEnabled (tds, enabled); tds->cubeScreen->cubeShouldPaintAllViewportsSetEnabled (tds, enabled); foreach (CompWindow *w, screen->windows ()) { TD_WINDOW (w); tdw->gWindow->glPaintSetEnabled (tdw, enabled); } } bool TdWindow::is3D () { if (window->overrideRedirect ()) return false; if (!window->isViewable () || window->shaded ()) return false; if (window->state () & (CompWindowStateSkipPagerMask | CompWindowStateSkipTaskbarMask)) return false; if (!TdScreen::get (screen)->optionGetWindowMatch ().evaluate (window)) return false; return true; } void TdScreen::preparePaint (int msSinceLastPaint) { bool active; CUBE_SCREEN (screen); active = (cs->rotationState () != CubeScreen::RotationNone) && screen->vpSize ().width () > 2 && !(optionGetManualOnly () && (cs->rotationState () != CubeScreen::RotationManual)); if (active || mBasicScale != 1.0) { float maxDiv = (float) optionGetMaxWindowSpace () / 100; float minScale = (float) optionGetMinCubeSize () / 100; float x, progress; cs->cubeGetRotation (x, x, progress); mMaxDepth = 0; foreach (CompWindow *w, screen->windows ()) { TD_WINDOW (w); tdw->mIs3D = false; tdw->mDepth = 0; if (!tdw->is3D ()) continue; tdw->mIs3D = true; mMaxDepth++; tdw->mDepth = mMaxDepth; } minScale = MAX (minScale, 1.0 - (mMaxDepth * maxDiv)); mBasicScale = 1.0 - ((1.0 - minScale) * progress); mDamage = (progress != 0.0 && progress != 1.0); } else { mBasicScale = 1.0; } /* comparing float values with != is error prone, so better cache the comparison and allow a small difference */ mActive = (fabs (mBasicScale - 1.0f) > 1e-4); mCurrentScale = mBasicScale; cScreen->preparePaint (msSinceLastPaint); setFunctions (mActive); } #define DOBEVEL(corner) (tds->optionGetBevel##corner () ? bevel : 0) #define SET_V \ for (int i = 0; i < 4; i++) \ v[i] = tPoint[i]; #define ADDQUAD(x1,y1,x2,y2) \ point[GLVector::x] = x1; point[GLVector::y] = y1; \ tPoint = transform * point; \ SET_V \ glVertex4fv (v); \ point[GLVector::x] = x2; point[GLVector::y] = y2; \ tPoint = transform * point; \ SET_V \ glVertex4fv (v); \ tPoint = tds->mBTransform * point; \ SET_V \ glVertex4fv (v); \ point[GLVector::x] = x1; point[GLVector::y] = y1; \ tPoint = tds->mBTransform * point; \ SET_V \ glVertex4fv (v); \ #define ADDBEVELQUAD(x1,y1,x2,y2,m1,m2) \ point[GLVector::x] = x1; point[GLVector::y] = y1; \ tPoint = m1 * point; \ SET_V \ glVertex4fv (v); \ tPoint = m2 * point; \ SET_V \ glVertex4fv (v); \ point[GLVector::x] = x2; point[GLVector::y] = y2; \ tPoint = m2 * point; \ SET_V \ glVertex4fv (v); \ tPoint = m1 * point; \ SET_V \ glVertex4fv (v); \ bool TdWindow::glPaintWithDepth (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; int wx, wy, ww, wh; int bevel, cull, cullInv; GLVector point, tPoint; unsigned short *c; TD_SCREEN (screen); CUBE_SCREEN (screen); glIsEnabled (GL_CULL_FACE); wx = window->x () - window->input ().left; wy = window->y () - window->input ().top; ww = window->width () + window->input ().left + window->input ().right; wh = window->height () + window->input ().top + window->input ().bottom; bevel = tds->optionGetBevel (); glGetIntegerv (GL_CULL_FACE_MODE, &cull); cullInv = (cull == GL_BACK)? GL_FRONT : GL_BACK; if (ww && wh && !(mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) && ((cs->paintOrder () == FTB && mFtb) || (cs->paintOrder () == BTF && !mFtb))) { float v[4]; int temp; /* Paint window depth. */ glPushMatrix (); glLoadIdentity (); if (cs->paintOrder () == BTF) glCullFace (cullInv); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (window->id () == screen->activeWindow ()) c = tds->optionGetWidthColor (); else c = tds->optionGetWidthColorInactive (); temp = c[3] * gWindow->paintAttrib ().opacity; temp /= 0xffff; glColor4us (c[0], c[1], c[2], temp); point[GLVector::z] = 0.0f; point[GLVector::w] = 1.0f; glBegin (GL_QUADS); /* Top */ ADDQUAD (wx + ww - DOBEVEL (Topleft), wy + 0.01, wx + DOBEVEL (Topright), wy + 0.01); /* Bottom */ ADDQUAD (wx + DOBEVEL (Bottomleft), wy + wh - 0.01, wx + ww - DOBEVEL (Bottomright), wy + wh - 0.01); /* Left */ ADDQUAD (wx + 0.01, wy + DOBEVEL (Topleft), wx + 0.01, wy + wh - DOBEVEL (Bottomleft)); /* Right */ ADDQUAD (wx + ww - 0.01, wy + wh - DOBEVEL (Topright), wx + ww - 0.01, wy + DOBEVEL (Bottomright)); /* Top left bevel */ if (tds->optionGetBevelTopleft ()) { ADDBEVELQUAD (wx + bevel / 2.0f, wy + bevel - bevel / 1.2f, wx, wy + bevel, tds->mBTransform, transform); ADDBEVELQUAD (wx + bevel / 2.0f, wy + bevel - bevel / 1.2f, wx + bevel, wy, transform, tds->mBTransform); } /* Bottom left bevel */ if (tds->optionGetBevelBottomleft ()) { ADDBEVELQUAD (wx + bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, wx, wy + wh - bevel, transform, tds->mBTransform); ADDBEVELQUAD (wx + bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, wx + bevel, wy + wh, tds->mBTransform, transform); } /* Bottom right bevel */ if (tds->optionGetBevelBottomright ()) { ADDBEVELQUAD (wx + ww - bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, wx + ww - bevel, wy + wh, transform, tds->mBTransform); ADDBEVELQUAD (wx + ww - bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, wx + ww, wy + wh - bevel, tds->mBTransform, transform); } /* Top right bevel */ if (tds->optionGetBevelTopright ()) { ADDBEVELQUAD (wx + ww - bevel, wy, wx + ww - bevel / 2.0f, wy + bevel - bevel / 1.2f, transform, tds->mBTransform); ADDBEVELQUAD (wx + ww, wy + bevel, wx + ww - bevel / 2.0f, wy + bevel - bevel / 1.2f, tds->mBTransform, transform); } glEnd (); glColor4usv (defaultColor); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glPopMatrix (); if (cs->paintOrder () == BTF) glCullFace (cull); } if (cs->paintOrder () == BTF) status = gWindow->glPaint (attrib, transform, region, mask); else status = gWindow->glPaint (attrib, tds->mBTransform, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); return status; } bool TdWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; TD_SCREEN (screen); if (mDepth != 0.0f && !tds->mPainting3D && tds->mActive) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; if (tds->mPainting3D && tds->optionGetWidth () && (mDepth != 0.0f) && tds->mWithDepth) { status = glPaintWithDepth (attrib, transform, region, mask); } else { status = gWindow->glPaint (attrib, transform, region, mask); } return status; } void TdScreen::glApplyTransform (const GLScreenPaintAttrib &attrib, CompOutput *output, GLMatrix *transform) { gScreen->glApplyTransform (attrib, output, transform); transform->scale (mCurrentScale, mCurrentScale, mCurrentScale); } void TdScreen::cubePaintViewport (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { CUBE_SCREEN (screen); if (cs->paintOrder () == BTF) { cs->cubePaintViewport (attrib, transform,region, output, mask); } if (mActive) { GLMatrix mTransform; // NOT a member variable GLMatrix screenSpace; GLMatrix screenSpaceOffset; TdWindow *tdw; CompWindowList pl; CompWindowList::iterator it; float wDepth = 0.0; float pointZ = cs->invert () * cs->distance (); unsigned int newMask; std::vector vPoints; vPoints.push_back (GLVector (-0.5, 0.0, pointZ, 1.0)); vPoints.push_back (GLVector (0.0, 0.5, pointZ, 1.0)); vPoints.push_back (GLVector (0.0, 0.0, pointZ, 1.0)); if (mWithDepth) wDepth = -MIN((optionGetWidth ()) / 30, (1.0 - mBasicScale) / mMaxDepth); if (wDepth != 0.0) { /* all BTF windows in normal order */ foreach (CompWindow *w, screen->windows ()) { tdw = TdWindow::get (w); if (!tdw->mIs3D) continue; mCurrentScale = mBasicScale + (tdw->mDepth * ((1.0 - mBasicScale) / mMaxDepth)); tdw->mFtb = cs->cubeCheckOrientation (attrib, transform, output, vPoints); } } mCurrentScale = mBasicScale; mPainting3D = true; gScreen->setLighting (true); screenSpace.reset (); screenSpace.toScreenSpace (output, -attrib.zTranslate); glPushMatrix (); pl = cScreen->getWindowPaintList (); /* paint all windows from bottom to top */ for (it = pl.begin (); it != pl.end (); ++it) { CompWindow *w = (*it); tdw = TdWindow::get (w); if (w->destroyed ()) continue; if (!w->shaded () || !w->isViewable ()) { if (!tdw->cWindow->damaged ()) continue; } mTransform = transform; newMask = PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK; if (tdw->mDepth != 0.0f) { mCurrentScale = mBasicScale + (tdw->mDepth * ((1.0 - mBasicScale) / mMaxDepth)); if (wDepth != 0.0) { mCurrentScale += wDepth; mBTransform = transform; gScreen->glApplyTransform (attrib, output, &mBTransform); mCurrentScale -= wDepth; } gScreen->glApplyTransform (attrib, output, &mTransform); gScreen->glEnableOutputClipping (mTransform, region, output); if ((cScreen->windowPaintOffset ().x () != 0 || cScreen->windowPaintOffset ().y () != 0) && !w->onAllViewports ()) { CompPoint moveOffset; moveOffset = w->getMovementForOffset ( cScreen->windowPaintOffset ()); screenSpaceOffset = screenSpace; screenSpaceOffset.translate (moveOffset.x (), moveOffset.y (), 0); if (wDepth != 0.0) mBTransform = mBTransform * screenSpaceOffset; mTransform = mTransform * screenSpaceOffset; newMask |= PAINT_WINDOW_WITH_OFFSET_MASK; } else { if (wDepth != 0.0) mBTransform = mBTransform * screenSpace; mTransform = mTransform * screenSpace; } glLoadMatrixf (mTransform.getMatrix ()); tdw->gWindow->glPaint (tdw->gWindow->paintAttrib (), mTransform, infiniteRegion, newMask); gScreen->glDisableOutputClipping (); } } glPopMatrix (); mPainting3D = false; mCurrentScale = mBasicScale; } if (cs->paintOrder () == FTB) { cs->cubePaintViewport (attrib, transform, region, output, mask); } } bool TdScreen::cubeShouldPaintAllViewports () { return true; } bool TdScreen::cubeShouldPaintViewport (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, CompOutput *outputPtr, PaintOrder order) { CUBE_SCREEN (screen); bool rv = cs->cubeShouldPaintViewport (attrib, transform, outputPtr, order); if (mActive) { float pointZ = cs->invert () * cs->distance (); bool ftb1, ftb2; std::vector vPoints; vPoints.push_back (GLVector (-0.5, 0.0, pointZ, 1.0)); vPoints.push_back (GLVector (0.0, 0.5, pointZ, 1.0)); vPoints.push_back (GLVector (0.0, 0.0, pointZ, 1.0)); mCurrentScale = 1.0; ftb1 = cs->cubeCheckOrientation (attrib, transform, outputPtr, vPoints); mCurrentScale = mBasicScale; ftb2 = cs->cubeCheckOrientation (attrib, transform, outputPtr, vPoints); return (order == FTB && (ftb1 || ftb2)) || (order == BTF && (!ftb1 || !ftb2)) || rv; } return true; } bool TdScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; if (mActive) { CompPlugin *p; mask |= PAINT_SCREEN_TRANSFORMED_MASK | PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK | PAINT_SCREEN_NO_OCCLUSION_DETECTION_MASK; mWithDepth = true; p = CompPlugin::find ("cubeaddon"); if (p) { CompOption::Vector &options = p->vTable->getOptions (); CompOption option; mWithDepth = (CompOption::getIntOptionNamed (options, "deformation", 0) == 0); } } status = gScreen->glPaintOutput (attrib, transform, region, output, mask); return status; } void TdScreen::donePaint () { if (mActive && mDamage) { mDamage = false; cScreen->damageScreen (); } cScreen->donePaint (); } TdScreen::TdScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), cubeScreen (CubeScreen::get (screen)), mActive (false), mPainting3D (false), mCurrentScale (1.0f), mBasicScale (1.0f) { CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); CubeScreenInterface::setHandler (cubeScreen, false); cScreen->preparePaintSetEnabled (this, true); } TdScreen::~TdScreen () { } TdWindow::TdWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), mIs3D (false), mFtb (false), mDepth (0.0f) { GLWindowInterface::setHandler (gWindow, false); } TdWindow::~TdWindow () { } bool TdPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("cube", COMPIZ_CUBE_ABI) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/td/src/3d.h0000644000015301777760000000630212321343002021031 0ustar pbusernogroup00000000000000/* * * Compiz 3d plugin * * 3d.c * * Copyright : (C) 2006 by Roi Cohen * E-mail : roico12@gmail.com * * Modified by : Dennis Kasprzyk * Danny Baumann * Robert Carr * Diogo Ferreira * Kevin Lange * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ /** TODO: 1. Add 3d shadows / projections. 2. Add an option to select z-order of windows not only by viewports, but also by screens. */ #include #include #include #include #include #include #include "td_options.h" extern const double PI; class TdScreen : public PluginClassHandler , public CompositeScreenInterface, public GLScreenInterface, public CubeScreenInterface, public TdOptions { public: TdScreen (CompScreen *); ~TdScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CubeScreen *cubeScreen; void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); void glApplyTransform (const GLScreenPaintAttrib &, CompOutput *, GLMatrix *); void cubePaintViewport (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); bool cubeShouldPaintViewport (const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, PaintOrder ); bool cubeShouldPaintAllViewports (); bool mActive; bool mPainting3D; float mCurrentScale; float mBasicScale; float mMaxDepth; bool mDamage; bool mWithDepth; GLMatrix mBTransform; }; #define TD_SCREEN(s) \ TdScreen *tds = TdScreen::get (s) class TdWindow : public PluginClassHandler , public GLWindowInterface { public: TdWindow (CompWindow *); ~TdWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool glPaintWithDepth (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool is3D (); bool mIs3D; bool mFtb; float mDepth; }; #define TD_WINDOW(w) \ TdWindow *tdw = TdWindow::get (w) class TdPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/imgpng/0000755000015301777760000000000012321344021020436 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/imgpng/CMakeLists.txt0000644000015301777760000000013412321343002023172 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(imgpng PKGDEPS libpng)compiz-0.9.11+14.04.20140409/plugins/imgpng/src/0000755000015301777760000000000012321344021021225 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/imgpng/src/imgpng.cpp0000644000015301777760000002010312321343002023204 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "imgpng.h" #include "core/abiversion.h" #include #include #include #include #include COMPIZ_PLUGIN_20090315 (imgpng, PngPluginVTable) const unsigned short PNG_SIG_SIZE = 8; PngScreen::PngScreen (CompScreen *screen) : PluginClassHandler (screen) { ScreenInterface::setHandler (screen, true); screen->updateDefaultIcon (); } PngScreen::~PngScreen () { screen->updateDefaultIcon (); } static void premultiplyData (png_structp png, png_row_infop row_info, png_bytep data) { for (unsigned int i = 0; i < row_info->rowbytes; i += 4) { unsigned char *base = &data[i]; unsigned char blue = base[0]; unsigned char green = base[1]; unsigned char red = base[2]; unsigned char alpha = base[3]; int p; red = (unsigned) red * (unsigned) alpha / 255; green = (unsigned) green * (unsigned) alpha / 255; blue = (unsigned) blue * (unsigned) alpha / 255; p = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); memcpy (base, &p, sizeof (int)); } } bool PngScreen::readPngData (png_struct *png, png_info *info, void *&data, CompSize &size) { png_uint_32 pngWidth, pngHeight; int depth, colorType, interlace; unsigned int pixelSize; png_byte **rowPointers; char *d; png_read_info (png, info); png_get_IHDR (png, info, &pngWidth, &pngHeight, &depth, &colorType, &interlace, NULL, NULL); size.setWidth (pngWidth); size.setHeight (pngHeight); /* convert palette/gray image to rgb */ if (colorType == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb (png); /* expand gray bit depth if needed */ if (colorType == PNG_COLOR_TYPE_GRAY && depth < 8) png_set_expand_gray_1_2_4_to_8 (png); /* transform transparency to alpha */ if (png_get_valid (png, info, PNG_INFO_tRNS)) png_set_tRNS_to_alpha (png); if (depth == 16) png_set_strip_16 (png); if (depth < 8) png_set_packing (png); /* convert grayscale to RGB */ if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb (png); if (interlace != PNG_INTERLACE_NONE) png_set_interlace_handling (png); png_set_bgr (png); png_set_filler (png, 0xff, PNG_FILLER_AFTER); png_set_read_user_transform_fn (png, premultiplyData); png_read_update_info (png, info); pixelSize = 4; d = (char *) malloc (pngWidth * pngHeight * pixelSize); if (!d) return false; data = d; rowPointers = new png_byte *[pngHeight]; if (!rowPointers) { free (d); return false; } for (unsigned int i = 0; i < pngHeight; ++i) rowPointers[i] = (png_byte *) (d + i * pngWidth * pixelSize); png_read_image (png, rowPointers); png_read_end (png, info); delete [] rowPointers; return true; } static void stdioReadFunc (png_structp png, png_bytep data, png_size_t size) { std::ifstream *file = (std::ifstream *) png_get_io_ptr (png); file->read ((char *) data, size); if (file->fail ()) png_error (png, "Read Error"); } bool PngScreen::readPng (std::ifstream &file, CompSize &size, void *&data) { unsigned char png_sig[PNG_SIG_SIZE]; file.read ((char *) png_sig, PNG_SIG_SIZE); if (file.fail () || png_sig_cmp (png_sig, 0, PNG_SIG_SIZE)) return false; png_struct *png = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png) return false; png_info *info = png_create_info_struct (png); if (!info) { png_destroy_read_struct (&png, NULL, NULL); return false; } png_set_read_fn (png, &file, stdioReadFunc); png_set_sig_bytes (png, PNG_SIG_SIZE); bool status = readPngData (png, info, data, size); png_destroy_read_struct (&png, &info, NULL); return status; } static void stdioWriteFunc (png_structp png, png_bytep data, png_size_t size) { std::ofstream *file = (std::ofstream *) png_get_io_ptr (png); file->write ((char *) data, size); if (file->bad ()) png_error (png, "Write Error"); } bool PngScreen::writePng (unsigned char *buffer, std::ostream &file, CompSize &size, int stride) { int height = size.height (); png_byte **rows = new png_byte *[height]; if (!rows) return false; for (int i = 0; i < height; ++i) rows[height - i - 1] = buffer + i * stride; png_struct *png = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png) { delete [] rows; return false; } png_info *info = png_create_info_struct (png); if (!info) { png_destroy_write_struct (&png, NULL); delete [] rows; return false; } if (setjmp (png_jmpbuf (png))) { png_destroy_write_struct (&png, NULL); delete [] rows; return false; } png_set_write_fn (png, &file, stdioWriteFunc, NULL); png_set_IHDR (png, info, size.width (), size.height (), 8, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_color_16 white; white.red = 0xff; white.blue = 0xff; white.green = 0xff; png_set_bKGD (png, info, &white); png_write_info (png, info); png_write_image (png, rows); png_write_end (png, info); png_destroy_write_struct (&png, &info); delete [] rows; return true; } CompString PngScreen::fileNameWithExtension (CompString &path) { unsigned int len = path.length (); if (len > 4 && path.substr (len - 4, 4) == ".png") return path; return path + ".png"; } bool PngScreen::imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data) { std::ofstream file; CompString fileName = fileNameWithExtension (path); bool status = false; if (format == "png") { file.open (fileName.c_str ()); if (file.is_open ()) { status = writePng ((unsigned char *) data, file, size, stride); file.close (); } if (status) return true; } status = screen->imageToFile (path, format, size, stride, data); if (!status) { file.open (fileName.c_str ()); if (file.is_open ()) { status = writePng ((unsigned char *) data, file, size, stride); file.close (); } } return status; } bool PngScreen::fileToImage (CompString &name, CompSize &size, int &stride, void *&data) { std::ifstream file; CompString fileName = fileNameWithExtension (name); bool status = false; file.open (fileName.c_str ()); if (file.is_open ()) { status = readPng (file, size, data); file.close (); } if (status) { stride = size.width () * 4; return true; } return screen->fileToImage (name, size, stride, data); } bool PngPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/imgpng/src/imgpng.h0000644000015301777760000000446212321343002022663 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef COMPIZ_IMGPGN_H #define COMPIZ_IMGPGN_H #include #include #include #include #include extern const unsigned short PNG_SIG_SIZE; class PngScreen : public ScreenInterface, public PluginClassHandler { public: PngScreen (CompScreen *screen); ~PngScreen (); bool fileToImage (CompString &path, CompSize &size, int &stride, void *&data); bool imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data); private: CompString fileNameWithExtension (CompString &path); bool readPngData (png_struct *png, png_info *info, void *&data, CompSize &size); bool readPng (std::ifstream &file, CompSize &size, void *&data); bool writePng (unsigned char *buffer, std::ostream &file, CompSize &size, int stride); }; class PngPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; #endif compiz-0.9.11+14.04.20140409/plugins/imgpng/imgpng.xml.in0000644000015301777760000000062612321343002023050 0ustar pbusernogroup00000000000000 <_short>PNG <_long>PNG image loader Image Loading imageext:png imagemime:image/png composite opengl decor compiz-0.9.11+14.04.20140409/plugins/colorfilter/0000755000015301777760000000000012321344021021501 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/colorfilter/colorfilter.xml.in0000644000015301777760000000476212321343002025163 0ustar pbusernogroup00000000000000 <_short>Color filter <_long>Filter colors for accessibility purposes Accessibility opengl blur composite opengl decor compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/0000755000015301777760000000000012321344021022412 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/0000755000015301777760000000000012321344021024062 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/blueish-filter0000644000015301777760000000036612321343002026726 0ustar pbusernogroup00000000000000!!ARBfp1.0 TEMP temp, neg; TEX temp, fragment.texcoord[0], texture[0], RECT; RCP neg.a, temp.a; MAD temp.rgb, -neg.a, temp, 1.0; MUL temp.rgb, temp.a, temp; MUL temp, fragment.color, temp; SUB_SAT temp.b, 0.8, -temp.b; MOV result.color, temp; ENDcompiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/deuteranopia0000644000015301777760000000233512321343002026466 0ustar pbusernogroup00000000000000!!ARBfp1.0 TEMP ab, ci, texv, temp1, temp2; TEX texv, fragment.texcoord[0], texture[0], RECT; MOV ab, {-0.0615003999429, 0.058589396688, 0.0827700165681, -0.0793451999536}; MOV ci, {-0.01320014122, 0.013289415272, 0.57638336864, 0.0}; POW texv.r, texv.r, {0.4761904, 0, 0, 0}.r; POW texv.g, texv.g, {0.5, 0, 0, 0}.r; POW texv.b, texv.b, {0.4761904, 0, 0, 0}.r; DP3 temp1.r, {0.05059983, 0.08585369, 0.00952420, 0.0}, texv; DP3 temp1.g, {0.01893033, 0.08925308, 0.01370054, 0.0}, texv; DP3 temp1.b, {0.00292202, 0.00975732, 0.07145979, 0.0}, texv; RCP temp2.r, temp1.r; MAD temp2.r, temp2.r, temp1.b, -ci.b; MUL temp2.g, ab.r, temp1.r; MAD temp2.g, ci.r, temp1.b, temp2.g; RCP temp2.a, -ab.b; MUL temp2.g, temp2.g, temp2.a; MUL temp2.b, ab.g, temp1.r; MAD temp2.b, ci.g, temp1.b, temp2.b; RCP temp2.a, -ab.a; MUL temp2.b, temp2.b, temp2.a; CMP temp1.g, temp2.r, temp2.g, temp2.b; DP3 temp2.r, {30.830854, -29.832659, 1.610474, 0.0}, temp1; DP3 temp2.g, {-6.481468, 17.715578, -2.532642, 0.0}, temp1; DP3 temp2.b, {-0.375690, -1.199062, 14.273846, 0.0}, temp1; POW temp2.r, temp2.r, {2.1, 0, 0, 0}.r; POW temp2.g, temp2.g, {2.0, 0, 0, 0}.r; POW temp2.b, temp2.b, {2.1, 0, 0, 0}.r; MOV temp2.a, texv.a; MOV result.color, temp2; END compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/protanopia0000644000015301777760000000233512321343002026162 0ustar pbusernogroup00000000000000!!ARBfp1.0 TEMP ab, ci, texv, temp1, temp2; TEX texv, fragment.texcoord[0], texture[0], RECT; MOV ab, {-0.0615003999429, 0.058589396688, 0.0827700165681, -0.0793451999536}; MOV ci, {-0.01320014122, 0.013289415272, 0.57638336864, 0.0}; POW texv.r, texv.r, {0.4761904, 0, 0, 0}.r; POW texv.g, texv.g, {0.5, 0, 0, 0}.r; POW texv.b, texv.b, {0.4761904, 0, 0, 0}.r; DP3 temp1.r, {0.05059983, 0.08585369, 0.00952420, 0.0}, texv; DP3 temp1.g, {0.01893033, 0.08925308, 0.01370054, 0.0}, texv; DP3 temp1.b, {0.00292202, 0.00975732, 0.07145979, 0.0}, texv; RCP temp2.r, temp1.g; MAD temp2.r, temp2.r, temp1.b, -ci.b; MUL temp2.g, ab.b, temp1.g; MAD temp2.g, ci.r, temp1.b, temp2.g; RCP temp2.a, -ab.r; MUL temp2.g, temp2.g, temp2.a; MUL temp2.b, ab.a, temp1.g; MAD temp2.b, ci.g, temp1.b, temp2.b; RCP temp2.a, -ab.g; MUL temp2.b, temp2.b, temp2.a; CMP temp1.r, temp2.r, temp2.g, temp2.b; DP3 temp2.r, {30.830854, -29.832659, 1.610474, 0.0}, temp1; DP3 temp2.g, {-6.481468, 17.715578, -2.532642, 0.0}, temp1; DP3 temp2.b, {-0.375690, -1.199062, 14.273846, 0.0}, temp1; POW temp2.r, temp2.r, {2.1, 0, 0, 0}.r; POW temp2.g, temp2.g, {2.0, 0, 0, 0}.r; POW temp2.b, temp2.b, {2.1, 0, 0, 0}.r; MOV temp2.a, texv.a; MOV result.color, temp2; END compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/negative0000644000015301777760000000033112321343002025602 0ustar pbusernogroup00000000000000!!ARBfp1.0 TEMP temp, neg; TEX temp, fragment.texcoord[0], texture[0], RECT; RCP neg.a, temp.a; MAD temp.rgb, -neg.a, temp, 1.0; MUL temp.rgb, temp.a, temp; MUL temp, fragment.color, temp; MOV result.color, temp; END compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/contrast0000644000015301777760000000077412321343002025650 0ustar pbusernogroup00000000000000!!ARBfp1.0 TEMP output; TEMP input; TEMP bright; TEMP dark; TEX input, fragment.texcoord[0], texture[0], RECT; # Subtract color by 0.51 => everything with more then 0.51 will have at least 0 ; SUB output.rgb, input, 0.51; # Create a dark color..; SUB dark.rgb, input, 0.3; # ..and a bright color ; ADD bright.rgb, input, 0.3; # All colors which are < 0 (original color - 0.51 < 0) get a dark color and everything else a bright color ; CMP output.rgb, output, dark, bright; MOV result.color, output; END compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/sepia0000644000015301777760000000037412321343002025110 0ustar pbusernogroup00000000000000!!ARBfp1.0 TEMP tex, temp; TEX tex, fragment.texcoord[0], texture[0], RECT; DP3 temp.r, tex, {0.393, 0.769, 0.189, 0}; DP3 temp.g, tex, {0.349, 0.686, 0.168, 0}; DP3 temp.b, tex, {0.272, 0.534, 0.131, 0}; MOV temp.a, tex.a; MOV result.color, temp; END compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/swap-red-green0000644000015301777760000000014612321343002026624 0ustar pbusernogroup00000000000000!!ARBfp1.0 TEMP tex; TEX tex, fragment.texcoord[0], texture[0], RECT; MOV result.color, tex.grba; END compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/swap-red-blue0000644000015301777760000000014612321343002026453 0ustar pbusernogroup00000000000000!!ARBfp1.0 TEMP tex; TEX tex, fragment.texcoord[0], texture[0], RECT; MOV result.color, tex.bgra; END compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/swap-green-blue0000644000015301777760000000014612321343002027001 0ustar pbusernogroup00000000000000!!ARBfp1.0 TEMP tex; TEX tex, fragment.texcoord[0], texture[0], RECT; MOV result.color, tex.rbga; END compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/negative-green0000644000015301777760000000036212321343002026704 0ustar pbusernogroup00000000000000!!ARBfp1.0 TEMP temp, neg; TEX temp, fragment.texcoord[0], texture[0], RECT; RCP neg.a, temp.a; MAD temp.rgb, -neg.a, temp, 1.0; MUL temp.rgb, temp.a, temp; MUL temp, fragment.color, temp; SUB temp.rb, temp, temp; MOV result.color, temp; END compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/blackandwhite0000644000015301777760000000044612321343002026607 0ustar pbusernogroup00000000000000!!ARBfp1.0 TEMP tex, temp, black, white; MOV black, {0, 0, 0, 0}; MOV white, {1, 1, 1, 1}; TEX tex, fragment.texcoord[0], texture[0], RECT; DP3 temp.x, tex, {0.33333, 0.33333, 0.33333, 0}; ADD temp.x, temp.x, -0.5; CMP temp, temp.x, black, white; MOV temp.a, tex.a; MOV result.color, temp; END compiz-0.9.11+14.04.20140409/plugins/colorfilter/data/filters/grayscale0000644000015301777760000000022612321343002025755 0ustar pbusernogroup00000000000000!!ARBfp1.0 TEMP tex; TEX tex, fragment.texcoord[0], texture[0], RECT; DP3 tex.r, tex, {0.33333, 0.33333, 0.33333, 0}; MOV result.color, tex.rrra; END compiz-0.9.11+14.04.20140409/plugins/colorfilter/compiz-core-print-fragment-program.patch0000644000015301777760000000371412321343002031354 0ustar pbusernogroup00000000000000From fc642f1752caa156d41f5245e5f05b583bb8b886 Mon Sep 17 00:00:00 2001 From: Guillaume Seguin Date: Thu, 16 Aug 2007 02:14:17 +0200 Subject: [PATCH] * Add fragment program pretty printer --- src/fragment.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 49 insertions(+), 0 deletions(-) diff --git a/src/fragment.c b/src/fragment.c index a1c9e6e..04ae571 100644 --- a/src/fragment.c +++ b/src/fragment.c @@ -154,6 +154,53 @@ static CompFunction initialLoadFunction = { COMP_FUNCTION_MASK }; +/* + * Print nicely formatted fragment program + */ +static void +printPrettyFragment (char *source) +{ + char *result, *current; + int feeds = 1, length; + + current = source; + while (*current != '\0') + { + if (strstr (current, ";") == current) break; + feeds++; + current = strstr (current, ";"); + if (!current) break; + else current++; + } + + result = malloc (sizeof (char) * (strlen (source) + feeds + 1)); + if (!result) + result = source; + else + { + current = source; + strcpy (result, "!!ARBfp1.0\n"); + current += 10; + while (*current != '\0') + { + if (strstr (current, ";")) + length = strstr (current, ";") + 1 - current; + else + length = strlen (current); + strncat (result, current, length); + strcat (result, "\n"); + current = strstr (current, ";"); + if (!current) break; + else current++; + } + result[strlen (source) + feeds] = '\0'; + } + compLogMessage (NULL, "core", CompLogLevelInfo, + "Using fragment program :"); + printf ("%s", result); + free (result); +} + static CompFunction * findFragmentFunction (CompScreen *s, int id) @@ -630,6 +677,8 @@ buildFragmentProgram (CompScreen *s, glGetError (); + printPrettyFragment (info.data); + (*s->genPrograms) (1, &program->name); (*s->bindProgram) (GL_FRAGMENT_PROGRAM_ARB, program->name); (*s->programString) (GL_FRAGMENT_PROGRAM_ARB, -- 1.5.2.4 compiz-0.9.11+14.04.20140409/plugins/colorfilter/CMakeLists.txt0000644000015301777760000000016012321343002024234 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (colorfilter PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/colorfilter/src/0000755000015301777760000000000012321344021022270 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/colorfilter/src/colorfilter.h0000644000015301777760000000707512321343002024774 0ustar pbusernogroup00000000000000/* * Compiz/Fusion color filtering plugin * * Author : Guillaume Seguin * Email : guillaume@segu.in * * Copyright (c) 2007 Guillaume Seguin * * Ported to Compiz 0.9 by: * Copyright (c) 2009 Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _COMPIZ_COLORFILTER_H #define _COMPIZ_COLORFILTER_H #include #include #include #include "colorfilter_options.h" class ColorfilterFunction { public: GLFragment::FunctionId id; CompString name; }; class ColorfilterScreen : public PluginClassHandler , public ColorfilterOptions { public: ColorfilterScreen (CompScreen *); ~ColorfilterScreen (); CompositeScreen *cScreen; GLScreen *gScreen; bool isFiltered; int currentFilter; /* 0 : cumulative mode 0 < c <= count : single mode */ /* The plugin can not immediately load the filters because it needs to * know what texture target it will use : when required, this boolean * is set to TRUE and filters will be loaded on next filtered window * texture painting */ bool filtersLoaded; std::vector filtersFunctions; ColorfilterFunction * findFragmentFunction (int id); void toggle (); void switchFilter (); bool toggleWindow (CompAction *action, CompAction::State state, CompOption::Vector options); bool toggleScreen (CompAction *action, CompAction::State state, CompOption::Vector options); bool filterSwitch (CompAction *action, CompAction::State state, CompOption::Vector options); void unloadFilters (); int loadFilters (GLTexture *texture); void windowAdd (CompWindow *w); void matchsChanged (CompOption *opt, ColorfilterOptions::Options num); void excludeMatchsChanged (CompOption *opt, ColorfilterOptions::Options num); void filtersChanged (CompOption *opt, ColorfilterOptions::Options num); void damageDecorations (CompOption *opt, ColorfilterOptions::Options num); }; #define FILTER_SCREEN(s) \ ColorfilterScreen *cfs = ColorfilterScreen::get (s) class ColorfilterWindow : public PluginClassHandler , public GLWindowInterface { public: ColorfilterWindow (CompWindow *); ~ColorfilterWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool isFiltered; void glDrawTexture (GLTexture *texture, GLFragment::Attrib &attrib, unsigned int mask); void toggle (); }; #define FILTER_WINDOW(w) \ ColorfilterWindow *cfw = ColorfilterWindow::get (w) class ColorfilterPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #endif compiz-0.9.11+14.04.20140409/plugins/colorfilter/src/colorfilter.cpp0000644000015301777760000002770612321343002025332 0ustar pbusernogroup00000000000000/* * Compiz/Fusion color filtering plugin * * Author : Guillaume Seguin * Email : guillaume@segu.in * * Copyright (c) 2007 Guillaume Seguin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "colorfilter.h" #include "parser.h" COMPIZ_PLUGIN_20090315 (colorfilter, ColorfilterPluginVTable); /* * Find fragment function by id (imported from compiz-core/src/fragment.c) */ ColorfilterFunction * ColorfilterScreen::findFragmentFunction (int id) { foreach (ColorfilterFunction *function, filtersFunctions) { if (function->id == (unsigned int) id) return function; } return NULL; } /* Actions handling functions ----------------------------------------------- */ void toggleWindowFunctions (ColorfilterWindow *cfw, bool enabled) { cfw->gWindow->glDrawTextureSetEnabled (cfw, enabled); } /* * Toggle filtering for a specific window */ void ColorfilterWindow::toggle () { FILTER_SCREEN (screen); /* Toggle window filtering flag */ isFiltered = !isFiltered; /* Check exclude list */ if (cfs->optionGetExcludeMatch ().evaluate (window)) isFiltered = false; /* Ensure window is going to be repainted */ cWindow->addDamage (); toggleWindowFunctions (this, isFiltered); } /* * Toggle filtering for the whole screen */ void ColorfilterScreen::toggle () { /* Toggle screen filtering flag */ isFiltered = !isFiltered; /* Toggle filtering for every window */ foreach (CompWindow *w, screen->windows ()) if (w) ColorfilterWindow::get (w)->toggle (); } /* * Switch current filter */ void ColorfilterScreen::switchFilter () { GLFragment::FunctionId id; ColorfilterFunction *function; /* % (count + 1) because of the cumulative filters mode */ currentFilter = (currentFilter + 1) % (filtersFunctions.size () + 1); if (currentFilter == 0) compLogMessage ("colorfilter", CompLogLevelInfo, "Cumulative filters mode"); else { id = filtersFunctions.at (currentFilter - 1)->id; if (id) { function = findFragmentFunction (id); compLogMessage ("colorfilter", CompLogLevelInfo, "Single filter mode (using %s filter)", function->name.c_str ()); } else { compLogMessage ("colorfilter", CompLogLevelInfo, "Single filter mode (filter loading failure)"); } } /* Damage currently filtered windows */ foreach (CompWindow *w, screen->windows ()) { FILTER_WINDOW (w); if (cfw->isFiltered) cfw->cWindow->addDamage (); } } /* * Window filtering toggle action */ bool ColorfilterScreen::toggleWindow (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w && GL::fragmentProgram) ColorfilterWindow::get (w)->toggle (); return true; } /* * Screen filtering toggle action */ bool ColorfilterScreen::toggleScreen (CompAction *action, CompAction::State state, CompOption::Vector options) { screen->findWindow (CompOption::getIntOptionNamed (options, "root", 0)); if (GL::fragmentProgram) toggle (); return true; } /* * Filter switching action */ bool ColorfilterScreen::filterSwitch (CompAction *action, CompAction::State state, CompOption::Vector options) { if (GL::fragmentProgram) switchFilter (); return true; } /* Filters handling functions ----------------------------------------------- */ /* * Free filters resources if any */ void ColorfilterScreen::unloadFilters () { if (!filtersFunctions.empty ()) { /* Destroy loaded filters one by one */ while (!filtersFunctions.empty ()) { ColorfilterFunction *function = filtersFunctions.back (); if (function->id) GLFragment::destroyFragmentFunction (function->id); delete function; filtersFunctions.pop_back (); } /* Reset current filter */ currentFilter = 0; } } /* * Load filters from a list of files for current screen */ int ColorfilterScreen::loadFilters (GLTexture *texture) { int target, loaded, count; GLFragment::FunctionId function; CompString name, file; CompOption::Value::Vector filters; FragmentParser *parser = new FragmentParser (); ColorfilterFunction *func; /* Free previously loaded filters and malloc */ unloadFilters (); filtersLoaded = true; /* Fetch filters filenames */ filters = optionGetFilters (); count = filters.size (); //filtersFunctions.resize (count); /* The texture target that will be used for some ops */ if (texture->target () == GL_TEXTURE_2D) target = COMP_FETCH_TARGET_2D; else target = COMP_FETCH_TARGET_RECT; /* Load each filter one by one */ loaded = 0; for (int i = 0; i < count; i++) { name = CompString (basename (filters.at (i).s ().c_str ())); file = filters.at (i).s (); if (name.empty ()) { name.clear (); continue; } compLogMessage ("colorfilter", CompLogLevelInfo, "Loading filter %s (item %s).", name.c_str (), file.c_str ()); function = parser->loadFragmentProgram (file, name, target); func = new ColorfilterFunction (); if (!func) continue; func->name = name; func->id = function; filtersFunctions.push_back (func); if (func && function) loaded++; } /* Warn if there was at least one loading failure */ if (loaded < count) compLogMessage ("colorfilter", CompLogLevelWarn, "Tried to load %d filter(s), %d succeeded.", count, loaded); /* Damage currently filtered windows */ foreach (CompWindow *w, screen->windows ()) { FILTER_WINDOW (w); if (cfw->isFiltered) cfw->cWindow->addDamage (w); } delete parser; return loaded; } /* * Wrapper that enables filters if the window is filtered */ void ColorfilterWindow::glDrawTexture (GLTexture *texture, GLFragment::Attrib &attrib, unsigned int mask) { GLFragment::FunctionId function; FILTER_SCREEN (screen); bool shouldFilter = isFiltered; foreach (GLTexture *tex, gWindow->textures ()) { if (tex->name () != texture->name ()) shouldFilter = false; } /* We are filtering a decoration */ if ((cfs->optionGetFilterDecorations () && isFiltered && !cfs->filtersFunctions.empty ())) shouldFilter = true; /* Check if filters have to be loaded and load them if so * Maybe should this check be done only if a filter is going to be applied * for this texture? */ if (!cfs->filtersLoaded) cfs->loadFilters (texture); /* Filter texture if : * o GL_ARB_fragment_program available * o Filters are loaded * o Texture's window is filtered */ /* Note : if required, filter window contents only and not decorations * (use that w->texture->name != texture->name for decorations) */ if (shouldFilter) // ??? { GLFragment::Attrib fa = attrib; if (cfs->currentFilter == 0) /* Cumulative filters mode */ { /* Enable each filter one by one */ foreach (ColorfilterFunction *func, cfs->filtersFunctions) { function = func->id; if (function) fa.addFunction (function); } } /* Single filter mode */ else if ((unsigned int) cfs->currentFilter <= cfs->filtersFunctions.size ()) { /* Enable the currently selected filter if possible (i.e. if it * was successfully loaded) */ function = cfs->filtersFunctions.at (cfs->currentFilter - 1)->id; if (function) fa.addFunction (function); } gWindow->glDrawTexture (texture, fa, mask); } else /* Not filtering */ { gWindow->glDrawTexture (texture, attrib, mask); } } /* * Filter windows when they are open if they match the filtering rules */ void ColorfilterScreen::windowAdd (CompWindow *w) { FILTER_WINDOW (w); /* cfw->isFiltered is initialized to false in InitWindow, so we only have to toggle it to true if necessary */ if (cfw->isFiltered && optionGetFilterMatch ().evaluate (w)) cfw->toggle (); } /* Internal stuff ----------------------------------------------------------- */ /* * Filtering match settings update callback */ void ColorfilterScreen::matchsChanged (CompOption *opt, ColorfilterOptions::Options num) { /* Re-check every window against new match settings */ foreach (CompWindow *w, screen->windows ()) { FILTER_WINDOW (w); if (optionGetFilterMatch ().evaluate (w) && isFiltered && !cfw->isFiltered) { cfw->toggle (); } } } /* * Exclude match settings update callback */ void ColorfilterScreen::excludeMatchsChanged (CompOption *opt, ColorfilterOptions::Options num) { /* Re-check every window against new match settings */ foreach (CompWindow *w, screen->windows ()) { bool isExcluded; FILTER_WINDOW (w); isExcluded = optionGetExcludeMatch ().evaluate (w); if (isExcluded && cfw->isFiltered) cfw->toggle (); else if (!isExcluded && isFiltered && !cfw->isFiltered) cfw->toggle (); } } /* * Filters list setting update callback */ void ColorfilterScreen::filtersChanged (CompOption *opt, ColorfilterOptions::Options num) { /* Just set the filtersLoaded boolean to false, unloadFilters will be * called in loadFilters */ filtersLoaded = false; } /* * Damage decorations after the "Filter Decorations" setting got changed */ void ColorfilterScreen::damageDecorations (CompOption *opt, ColorfilterOptions::Options num) { cScreen->damageScreen (); } ColorfilterScreen::ColorfilterScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), isFiltered (false), currentFilter (0), filtersLoaded (false) { optionSetToggleWindowKeyInitiate (boost::bind ( &ColorfilterScreen::toggleWindow, this, _1, _2, _3)); optionSetToggleScreenKeyInitiate (boost::bind ( &ColorfilterScreen::toggleScreen, this, _1, _2, _3)); optionSetSwitchFilterKeyInitiate (boost::bind ( &ColorfilterScreen::filterSwitch, this, _1, _2, _3)); optionSetFilterMatchNotify (boost::bind ( &ColorfilterScreen::matchsChanged, this, _1, _2)); optionSetExcludeMatchNotify (boost::bind ( &ColorfilterScreen::excludeMatchsChanged, this, _1, _2)); optionSetFiltersNotify (boost::bind ( &ColorfilterScreen::filtersChanged, this, _1, _2)); optionSetFilterDecorationsNotify (boost::bind ( &ColorfilterScreen::damageDecorations, this, _1, _2)); }; ColorfilterScreen::~ColorfilterScreen () { writeSerializedData (); unloadFilters (); } ColorfilterWindow::ColorfilterWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), isFiltered (false) { GLWindowInterface::setHandler (gWindow, false); } ColorfilterWindow::~ColorfilterWindow () { writeSerializedData (); } bool ColorfilterPluginVTable::init () { if (!GL::fragmentProgram) compLogMessage ("colorfilter", CompLogLevelWarn, "No fragment" \ "support, the plugin will continue to load but nothing"\ "will happen"); if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/colorfilter/src/parser.cpp0000644000015301777760000003171212321343002024272 0ustar pbusernogroup00000000000000/* * Compiz fragment program parser * * parser.cpp * * This should be usable on almost any plugin that wishes to parse fragment * program files separately, maybe it should become a separate plugin? * * Author : Guillaume Seguin * Email : guillaume@segu.in * * Copyright (c) 2007 Guillaume Seguin * * Port to std::string: * Copyright (c) 2010 Canonical Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include "parser.h" /* * Left trimming function */ CompString FragmentParser::ltrim (const CompString &string) { size_t pos = 0; while (!(pos >= string.size ())) { if (isspace (string.at (pos))) pos++; else break; } return string.substr (pos); } /* General fragment program related functions ----------------------- */ /* * Clean program name string */ void FragmentParser::programCleanName (CompString &name) { unsigned int pos = 0; /* Replace every non alphanumeric char by '_' */ while (!(pos >= name.size ())) { if (!isalnum (name.at (pos))) name[pos] = '_'; pos++; } } /* * File reader function */ CompString FragmentParser::programReadSource (const CompString &fname) { std::ifstream fp; int length; char *buffer; CompString data, path, home = CompString (getenv ("HOME")); /* Try to open file fname as is */ fp.open (fname.c_str ()); /* If failed, try as user filter file (in ~/.compiz/data/filters) */ if (!fp.is_open () && !home.empty ()) { path = home + "/.compiz/data/filters/" + fname; fp.open (path.c_str ()); } /* If failed again, try as system wide data file * (in PREFIX/share/compiz/filters) */ if (!fp.is_open ()) { path = CompString (DATADIR) + "/data/filters/" + fname; fp.open (path.c_str ()); } /* If failed again & again, abort */ if (!fp.is_open ()) { return CompString (""); } /* get length of file: */ fp.seekg (0, std::ios::end); length = fp.tellg (); length++; fp.seekg (0, std::ios::beg); /* allocate memory */ buffer = new char [length]; /* read data as a block: */ fp.read (buffer, length - 1); buffer[length - 1] = '\0'; fp.close (); data = buffer; delete[] buffer; return data; } /* * Get the first "argument" in the given string, trimmed * and move source string pointer after the end of the argument. * For instance in string " foo, bar" this function will return "foo". * * This function returns NULL if no argument found * or a malloc'ed string that will have to be freed later. */ CompString FragmentParser::getFirstArgument (const CompString &line, size_t &pos) { CompString arg; CompString string; size_t next, orig; int length; CompString retArg; if (pos >= line.size ()) return CompString (""); /* Left trim */ string = FragmentParser::ltrim (line.substr (pos)); orig = pos; pos = 0; /* Find next comma or semicolon (which isn't that useful since we * are working on tokens delimited by semicolons) */ if ((next = string.find (",", pos)) != std::string::npos || (next = string.find (";", pos)) != std::string::npos) { size_t temp; length = next - pos; if (!length) { pos = orig + 1; return getFirstArgument (line, pos); } if ((temp = string.find ("{", pos) != std::string::npos) && temp < next && (temp = string.find ("}", pos) != std::string::npos) && temp > next) { if ((next = string.find (",", temp)) != std::string::npos || (next = string.find (";", temp)) != std::string::npos) length = next - pos; else length = string.substr (pos).size (); } } else length = string.substr (pos).size (); /* Allocate, copy and end string */ arg = string.substr (pos, length); /* Increment source pointer */ if ((orig + arg.size () + 1) <= line.size ()) pos += orig + arg.size () + 1; else pos = std::string::npos; return arg; } /* Texture offset related functions ----------------------------------*/ /* * Add a new fragment offset to the offsets stack from an ADD op string */ FragmentParser::FragmentOffset * FragmentParser::programAddOffsetFromAddOp (const CompString &source) { FragmentOffset offset; CompString op; size_t pos = 0; CompString name; CompString offsetString; CompString temp; std::list ::iterator it = offsets.begin (); if (source.size () < 5) return NULL; op = source; pos += 3; name = getFirstArgument (op, pos); if (name.empty ()) return NULL; temp = getFirstArgument (op, pos); /* If an offset with the same name is * already registered, skip this one */ if ((!offsets.empty () && !programFindOffset (it, name).empty ()) || temp.empty ()) return &(*it); /* Just use the end of the op as the offset */ pos += 1; offsetString = ltrim (op.substr (pos)); if (offsetString.empty ()) return NULL; offset.name = name; offset.offset = offsetString; offsets.push_back (offset); return &(offsets.back ()); } /* * Find an offset according to its name */ CompString FragmentParser::programFindOffset (std::list::iterator it, const CompString &name) { if (it->name == name) return (*it).offset; return programFindOffset ((it++), name); } /* * Recursively free offsets stack */ void FragmentParser::programFreeOffset () { offsets.clear (); } /* Actual parsing/loading functions ----------------------------------*/ /* * Parse the source buffer op by op and add each op to function data * * FIXME : I am more than 200 lines long, I feel so heavy! */ void FragmentParser::programParseSource (GLFragment::FunctionData *data, int target, CompString &source) { CompString line, next; CompString current; CompString strtok; size_t pos = 0, strippos = 0; int length, oplength, type; CompString arg1, arg2, temp; /* Find the header, skip it, and start parsing from there */ pos = source.find ("!!ARBfp1.0", pos); if (pos != std::string::npos) { pos += 9; } /* Strip comments */ while ((strippos = source.find ("#", strippos)) != std::string::npos) { size_t carriagepos = source.find ("\n", strippos); if (carriagepos != std::string::npos) { source.erase (strippos, carriagepos - strippos); strippos = 0; } else source = source.substr (0, strippos); } strippos = 0; /* Strip linefeeds */ while ((strippos = source.find ("\n", strippos)) != std::string::npos) source[strippos] = ' '; /* Parse each instruction */ while (!(pos >= (source.size () - 1))) { size_t nPos = source.find (";", pos + 1); line = source.substr (pos + 1, nPos - pos); CompString origcurrent = current = ltrim (line); /* Find instruction type */ type = NoOp; /* Data ops */ if (current.substr (0, 3) == "END") type = NoOp; else if (current.substr (0, 3) == "ABS" || current.substr (0, 3) == "CMP" || current.substr (0, 3) == "COS" || current.substr (0, 3) == "DP3" || current.substr (0, 3) == "DP4" || current.substr (0, 3) == "EX2" || current.substr (0, 3) == "FLR" || current.substr (0, 3) == "FRC" || current.substr (0, 3) == "KIL" || current.substr (0, 3) == "LG2" || current.substr (0, 3) == "LIT" || current.substr (0, 3) == "LRP" || current.substr (0, 3) == "MAD" || current.substr (0, 3) == "MAX" || current.substr (0, 3) == "MIN" || current.substr (0, 3) == "POW" || current.substr (0, 3) == "RCP" || current.substr (0, 3) == "RSQ" || current.substr (0, 3) == "SCS" || current.substr (0, 3) == "SIN" || current.substr (0, 3) == "SGE" || current.substr (0, 3) == "SLT" || current.substr (0, 3) == "SUB" || current.substr (0, 3) == "SWZ" || current.substr (0, 3) == "TXP" || current.substr (0, 3) == "TXB" || current.substr (0, 3) == "XPD") type = DataOp; else if (current.substr (0, 4) == "TEMP") type = TempOp; else if (current.substr (0, 5) == "PARAM") type = ParamOp; else if (current.substr (0, 6) == "ATTRIB") type = AttribOp; else if (current.substr (0, 3) == "TEX") type = FetchOp; else if (current.substr (0, 3) == "ADD") { if (current.find ("fragment.texcoord", 0) != std::string::npos) programAddOffsetFromAddOp (current.c_str ()); else type = DataOp; } else if (current.substr (0, 3) == "MUL") { if (current.find ("fragment.color", 0) != std::string::npos) type = ColorOp; else type = DataOp; } else if (current.substr (0, 3) == "MOV") { if (current.find ("result.color", 0) != std::string::npos) type = ColorOp; else type = DataOp; } size_t cpos = 0; switch (type) { /* Data op : just copy paste the * whole instruction plus a ";" */ case DataOp: data->addDataOp (current.c_str ()); break; /* Parse arguments one by one */ case TempOp: case AttribOp: case ParamOp: { if (type == TempOp) oplength = 4; else if (type == ParamOp) oplength = 5; else if (type == AttribOp) oplength = 6; length = current.size (); if (length < oplength + 2) break; cpos = oplength + 1; while (current.size () && !(cpos >= current.size ()) && (arg1 = getFirstArgument (current, cpos)).size ()) { /* "output" is a reserved word, skip it */ if (arg1.substr (0, 6) == "output") continue; /* Add ops */ if (type == TempOp) data->addTempHeaderOp (arg1.c_str ()); else if (type == ParamOp) data->addParamHeaderOp (arg1.c_str ()); else if (type == AttribOp) data->addAttribHeaderOp (arg1.c_str ()); } } break; case FetchOp: { /* Example : TEX tmp, coord, texture[0], RECT; * "tmp" is dest name, while "coord" is either * fragment.texcoord[0] or an offset */ cpos += 3; if ((arg1 = getFirstArgument (current, cpos)).size ()) { if (!(temp = getFirstArgument (current, cpos)).size ()) break; if (temp == "fragment.texcoord[0]") data->addFetchOp (arg1.c_str (), NULL, target); else if (!offsets.empty ()) { arg2 = programFindOffset ( offsets.begin (), temp); if (arg2.size ()) data->addFetchOp (arg1.c_str (), arg2.c_str (), target); } } } break; case ColorOp: { if (current.substr (0, 3) == "MUL") /* MUL op, 2 ops */ { /* Example : MUL output, fragment.color, output; * MOV arg1, fragment.color, arg2 */ cpos += 3; if (!(arg1 = getFirstArgument (current, cpos)).size ()) { break; } if (!(temp = getFirstArgument (current, cpos)).size ()) break; if (!(arg2 = getFirstArgument (current, cpos)).size ()) break; data->addColorOp (arg1.c_str (), arg2.c_str ()); } else /* MOV op, 1 op */ { /* Example : MOV result.color, output; * MOV result.color, arg1; */ cpos = current.find (",") + 1; if ((arg1 = getFirstArgument (current, cpos)).size ()) data->addColorOp ("output", arg1.c_str ()); } break; } default: break; } pos = nPos; } programFreeOffset (); } /* * Build a Compiz Fragment Function from a source string */ GLFragment::FunctionId FragmentParser::buildFragmentProgram (CompString &source, const CompString &name, int target) { GLFragment::FunctionData *data; int handle; /* Create the function data */ data = new GLFragment::FunctionData (); if (!data) return 0; /* Parse the source and fill the function data */ programParseSource (data, target, source); /* Create the function */ handle = data->createFragmentFunction (name.c_str ()); delete data; return handle; } /* * Load a source file and build a Compiz Fragment Function from it */ GLFragment::FunctionId FragmentParser::loadFragmentProgram (const CompString &file, CompString &name, int target) { CompString source; GLFragment::FunctionId handle; /* Clean fragment program name */ programCleanName (name); /* Read the source file */ source = programReadSource (file); if (source.empty ()) { return 0; } /* Build the Compiz Fragment Program */ handle = buildFragmentProgram (source, name, target); return handle; } compiz-0.9.11+14.04.20140409/plugins/colorfilter/src/parser.h0000644000015301777760000000443712321343002023743 0ustar pbusernogroup00000000000000/* * Compiz fragment program parser * * parser.h * * This should be usable on almost any plugin that wishes to parse fragment * program files separately, maybe it should become a separate plugin? * * Author : Guillaume Seguin * Email : guillaume@segu.in * * Copyright (c) 2007 Guillaume Seguin * * Port to std::string: * Copyright (c) 2010 Canonical Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "colorfilter.h" class FragmentParser { private: enum { NoOp, DataOp, StoreDataOp, OffsetDataOp, BlendDataOp, FetchOp, ColorOp, LoadOp, TempOp, ParamOp, AttribOp, } OpType; class FragmentOffset { public: CompString name; CompString offset; }; std::list offsets; CompString getFirstArgument (const CompString &line, size_t &pos); void programCleanName (CompString &name); CompString programReadSource (const CompString &fname); FragmentOffset * programAddOffsetFromAddOp (const CompString &source); CompString programFindOffset (std::list::iterator it, const CompString &name); void programFreeOffset (); void programParseSource (GLFragment::FunctionData *data, int target, CompString &source); public: friend class FragmentString; static CompString ltrim (const CompString &string); GLFragment::FunctionId buildFragmentProgram (CompString &, const CompString &, int target); GLFragment::FunctionId loadFragmentProgram (const CompString &file, CompString &name, int target); }; compiz-0.9.11+14.04.20140409/plugins/cube/0000755000015301777760000000000012321344021020073 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/cube/cube.xml.in0000644000015301777760000001162312321343002022141 0ustar pbusernogroup00000000000000 <_short>Desktop Cube <_long>Place windows and viewports on a cube Desktop largedesktop opengl switcher scale decor <_short>Behaviour <_short>Appearance <_short>Cube Cap Colors <_short>Skydome <_short>Transparent Cube compiz-0.9.11+14.04.20140409/plugins/cube/compiz-cube.pc.in0000644000015301777760000000042412321343002023237 0ustar pbusernogroup00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-cube Description: Cube plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite compiz-opengl Libs: -L${libdir} -lcube Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compizcompiz-0.9.11+14.04.20140409/plugins/cube/images/0000755000015301777760000000000012321344021021340 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/cube/images/freedesktop.png0000644000015301777760000005053312321343002024365 0ustar pbusernogroup00000000000000‰PNG  IHDRʱma‰Q"IDATxÚì[obU†ý_b„É$Þ¨w“xe¼ò8šè‰£™¹q4јLÄ J;ô¥¥-”C¡Ph9 m¡¶ïÌ1NÒÙÀ† }žì‹6MšÍ!ÏúÖ÷®µöKXz@¯èÀ@¯€^Ð+zÒív›ÍæÑÑQ6›M$[[[áp8¬®®®¬¬,--=y†~Яbmm- mllììì¤R©ƒƒƒãããóósÐ+À5G*,‹»»»²¤¼éGFŽF£Òt½^ïõz W€©Gõéþþ¾JÎ……çH˜õûýÉd²V«¡Zô 0mUj>Ÿ—RçççcE…m$9<<¼¼¼4½L"šø«êóùœöÃív¯¯¯«ÏK=‹^&•„¥R)‹-//»\.ç$àõzuÃFÃô `·¸¿Z­*èWŽoB©öCKÔÁÐË1½Œ M¨•ȧÓé`0¨Y¶sŠP1«¡B Ð+À(C-uÒZÔ¹¹9çT£1#·ÛmÐ+ÀXBÿ©—¬Ö䲯½Xú_{Ô.PÍÎô 0h评çiBÿEk!´+Áô 0¹¡¿»R¼¥ªû¹··§“ä}©MaÚÙ3ÔÖÏ•JE»r¹œ¶ciÿ«Ž&P­mé«Ð?WEßét @¯úkw¬z»2i¹\Vš4à€qrr"#« ט¡í°VÜ­Ìnz°gè¯\Tr Eg–Ž%*{UÞêÌá¶:£‹²è B…þ6Ɉ´ß_ÓyÝØXšËÊët:v`XÝXu* @¯@è?ä26˜Édì³ëTU§ºêÕåÕ©ÿkzBÿ‘(y©½kóe|Cƒ7 Õ|0½¡¿u©ºN°Ö"|Å>º·Éª÷õ6Ø1PÏV,zBÿa¢ç²(äѱ~“¾\I’U:ˆd5ºhÙz ôBè?}6‘d···U‰÷½fKz°{è¯ø…Ð\ã™æ}ï‰Pǽú›ý¯*ÏûÛÔ·Ñþô @èÿüП§þ 5”Õéïm”aÑ+¡ÿ¿¡?ñ÷ÿQp§ÞH5¬ÞOô 0¢Ð_Ûê ý'…xúàú0¬&è€Ð® µrK•¾ÙHðôô½LyèÏùÁÑ|_#¥ÙÕZúJ WB¸U£š˜Ýq ¦6z0ú+&ô¿†´Z-u®fØÜÜD¯„þã¡~ÖNkáLÙŸ<ônåÝ›9G ý`-ù³/6ãOýÎx¢9ý)’­Ä µJã|ìó «N3h2^ý-¤Óíîk׳÷¼Û_:‚Ü_|û;×//üÀÔõæí?n~ïþè·•;®‡Th¯tÖîŒxU¬ kjz¡/z ôÍVG5é韛ێà;?x^ÿì¡ähÅõê'37ïÌ~ý(¤:WµðhjXªmêC””Ñ+úú÷Ïi»³+|û8¢ó•+´h•jß½ëýe1ž¯6­^k*ÏÔ· ½¡?¡¿9Ú˿ӥ=Ñ÷ïy_ûtF޳ÉõÞ]¯Ú¸Ö…uk LmëRW½¡?¡ÿt{½h®zÿIìÖO¾7>wÈe¶½ÔÞýæQ(SnXôàƒ?+Vs# êèý ýŸCꨮ^ꇿ.¿õÕŸ¨ÐÚ¦n[KŒa£‡n9_µÑÑ+úúÿÃÞ¹¼TEaüOk5z@P£hÔ44h= {E Š‚¢hÐ1±Ü…^“¼uM°¤÷*ÈMJJÅÚé£×]ûœsõ<~ß°QÞóµÖoïu~j|j¶£2zðnyãÉNC¥=d÷ß~>ö1ᱬ^ÞÎ,u*Ä+úúšù¬ó§ÇïW¶éR*åÌ:ÃpéñëdsinîlÒ`J¯âeã" п)Ð?ïÞzúaõ}‚¤TKœMúy¯èŸsèÿu~Áýsk½ENܘû:&!ø5X7¾ƒ5#"^ÐÿпV«ý³îNL‡IHÄÒÙñŠ€þ9þ#¦—¡á#õÏ‹¶ºñ•È/V ÓøzÖ\‹xE@ !×{Þ†±¥nÆX hºE¼" –49û ô/|húúX{e!ö¨G#,c3$þI¼" ?п(>p§_˽b®ÔÒoÉXÀ¯(yèßÛÛ ôú§ÓÚv³†3N`Õ¯èô/[Ú^~‡Œ_޹%^Qtè¯8úý3狆ÂÒàË8’Ò’xE@ÿU€þ›€þ«çŽÑ(`EP‰WôúËÚN .„Q¥ç¤QñŠ€þ@ÿÂyK냩Ù/‘GdÆšC›¹‰×Eýþ@ÿByïÍgß›|MV •xúý€þký3æ»ýÕ0’ÔNéÁ±@âµXп\.ýþxi)Á»Éˆý»H¯3HMñ ôú› ÿ! ¾¼ûZOS¿S­V‰×BÿÁÁA ?Ð7´þÄÑÚAËçÕ¢¯@ ÿïÐ'п0§¢}BfhhÈ2SUA¼fúýþ8ޝ<ý511a¼_@¼ý ý÷ý ïõGÛu 6Â|À‚4ÔS¯i‡þš‘ýþ¸I> ®5ºFÒ¼Žxúýqq­Fl“VŠ6¯@ ?.®¯úO`EnAz¨‰W  ÿY ?Žä ':>›=eY ¥ñº¢½¿Æ©A¨ãúýqvwj_‡k$5£zä‰×•HUý=ôß ôúã´y×å'¡§4:s ¥¯ÍÒÜÜœP»Ú ?ЧÙÁøTè#a gÐÈÈñš|¹*Ô^©T”k@ÿÈÐÿð= ?^!kvzÊ2âÓ â51)È4Êìîîúýq†¼¹µÓ÷ƒ²ºæãIÇ+Õ/¯ ÜUU÷­é*ÐßúŸëúãÕ÷‹Ú‡ÐGê Aâ.Äk¬ŠUw«Dáþ@œ]Ÿê|åûà[¦Ú¶L¼Fœ±êä°*V ¿úß(ýqz½ý¬ =¥OÓ»FÒ¿!^½¥š_³m ?ÐçÆõO3‰}K°V2¯cVݶúÿúýq&}¯\󭱜AÚaH¼Z¿!”ôúãüyß­>ßµv–mv:c@¼6žd'^´jn ôÇ8%^×ÒþÍs'⩯¯xýŸt¹­T*%Øû‹'.* ?ÆéñÀ¨_#¯{Y–ñ«&ŠÄëߥã‰Ü¿R@+Uu”*[ÐÿMè‹bU¾…—3Hp"^ÿ2[Ñ<4>ý×@Sp ?Æ)·:3ßÓ™–3ïÚèD¼þ¾µAgÖbþ×-vúcœ ¯9Ü&®úH|,+ñº,µðqVè®±ÎÄiàôÇ8[î Æ}‡‡Î •YÄë¢t†_…gä»UªXUù¦ú@Œ“Ùž¥RÌT¯×‰×ÅE¹‘¿Ìªýc?Ø»öß(ª0:ÿ×@bˆŠ`ˆÆh¢&‰Q£IÐÄG4J E* XPEyÈ£”–ÇÐç–¥ }·´Û»m),¥´lÙv·K \O 1_÷ÎÜ;³;ßwr~$e»™ûõÎw¾ïœl6Ë¢?“Y¼ÄµC(³ð2ÑÜÔË+2 ]/`ɪÐDÿ8‹þL¦"ñJ§‹ÒŽhnËè–»Á€x<޵bý™Ìp°æê˜P6ƒ$£¹‰–W˜û¹»´ÂÄÕ8‹þL¦>–žîP}’Œæ¦X^ÑuvÔiVlʲèÏd†Œ8S†¢¹É•WôLñ‚¯:w…ŠH;µûúTÙ…ý™L£Ä¸¡hnBå‹ÿ˜Pmd2á#<|„¤Š-Õ/láw&Ó¢ÛF0šÛÒ”­ê.skÌ´ú6MWª’Š¶å›ªlò;“é'×o!Ími4T@¶¶?‰Û÷0Û¼Œ«*“¡ EÀxPf4žDy…0娠««Ëtß$wátûÈ»{lò7“81ãH-šÛ dĵØhm¸•ÞTÙþtI¥Mþ™f2 „Ç.'¨Es[Z¼±!gHmíüè`”ǘÌB#vs¨Es[Þ-\£Ñ¨’€¡Ë|óÐø{#6ù‡˜ÉüG>µ¾âýŸªïƒÀ;65›™›œ9Õ6üáþ&>ö1 I š[_y…•Òœ€ -+ÒŸZµ³Î&~˜Ì'¸xÝÉU?ÖípzbCãsóþãï_¶iÕA š[SyE×C)»Eû ÖµñéÕûøÆÊdþ…¯mw6WuÔõÞ˜ÎÝ—ßZ\YVcúƒÁ‰T4·åO[~¯zýàÁ³¹º“Í™L|qËÙõ'[ÏvŽNdr.SñïåV|[môCÂmŽ@4·ŽòšH$äM°&''5î\¸’X^ÊC¬LêÄ‚ÌçGb8è¢ ¨hMýÀK6œÂvPÔ™hîP•×\.'?-€B,4aäNæíÝõ6ùsÅ$Kx ¯=ý5:8JK(Ej˜Í/˜ö2n&Íí±¼Â«F~T@Ë~Ä‘æ¡%ØÇšI1ð½?DÿÎÑIµÛŸ:¾8z™£¹ƒ,¯ÈÎräGq-Ufææ?9Ôl“?fLýMÞ+ÍXyÅo‹Å9hi¹â%èåmçlòçI¯Jˆþ¦äþ‚£‘þ©ý]ƒIa(¯©TÊ‘€®¿'ñ›lÅ$"úC»ÓŽòÑ*ÑÜ–êœD$q$€æ}Ö÷póÐâuÿ+6ŸùêØx„ãZêbbü³Ã1›üwÑß<ÐåhnÿÊ+F¬$¯®ù|^¸Å•ÄmÖ²žàÒ§1ó{4v-9qÏû>ñÇ¿\²É¥ÚEÿ3šEÿàqŸ£¹ý+¯ÈÅr$Ç…[ŒMÍ,ÝÈjÌãÕì5.îô÷Þ¸«W™ÉÏ¿¾ã‚MþöÈçK«w×õ ßɈ£©Påhn°$oæØê5zuEן¸g+žæwö4ìªímž¸¿`pKž›œæà…%§ÚàE-¬W™æne4·zyM&“`r0â»sÝ4Eÿ•?ÔBô¿8p ½QáÖ–GmòUÒ÷Eú À€£¹ý(¯X8s$Éd„+`fe‹þ>¢¾ï¦M¾Pº šàÀÚŠ£¹=ÂÒåXÓÒÒâº-€n Ñÿëã-²¢¿ùÎ’—lòåR5«*ú•ÒÁ4mPµ6\ÑÜêåuppБ¼„+àm‹EÿÁ±ªÄHœ „ T47B_Š+šÛÒ2Ç08 ¸ÛyvceøDÿMÊ¢¿:xwÃObÿMCyÓ€ÙhîC!æ¶´˜)ôöö WØz¦‹Eÿ@Ð}}Ê&_1•ØšœÄ€!Žæ6X^GFFÌÝÆ§fó¸ëµè#¢¿y,<|øLI¥M¾hÊiÕ‚PûP *š7Ó"Šæ¶¼çˆ544¸åÝYs•EÿÁ\Jĸ… ‡O §„”7…9šÛ’HÁ5b›—hX^‘è_¥Yô‡. Ù䋦<á)èê“ÑouMH¢¹ÕËk:6—ør¾û:‹þÁbh|Ú&_4UB¢=àùçhn×°<6^ñ—ÄÝ”Ùê}‘ÂýË%Dÿp¿áòÒ*›|Ý”wn…»  ¼½q4·þò ûC;S3spÆbÑ?p|ùÛe›|Ý”'ü[=`{Õl4wm¢¹ÕË«L6n¸Bˆ*Ñ®kØ_„QÑÊîº Ü~¾GÐCU;Gsë.¯˜à5çOƒÄ¡@ªoþýM gmòESžoî¬ôJs4·KX^t-¬÷ºÉB'ÛçlmäúEo¡*‡Ä(¥¼LgýN"ø½sí‰êŠÂ0ÿküÒh›Ú«­­M´µUÓ­iÚj¬I+&ÒVoxC4Ökmë•‹p¸ÑAÆÁqT.r €JÝ}ã8-gïÃìÅ™ÙëÍúÌ™9/{­½Özͺhî (¬†5.þH?厓Þ0ë4ʺpÃc¼oÊX/Â<ýRÐè*47˜ZÐÜ„ö æ2ìp!óÖºp`M«’À}ñ¦)Û ýÂ<¡¤¦7¿$@s»Ê^q2µì|£“9߮Ҽ Eþ{‚e§ÑÇãMS>–î¶DRÅhî4FsgØ´ hX5°8ç2Ák€ÑUÁ’Ó²½LßRˆØÖWÓô©ËÐÜHüÝæÎø¿Ö™Å_ããÊ¿³‰§S/À¼¬K ! –œ²‹nzŒ7MùV¨‹ÑÜÓÊ»hnWØ+|Sf.ÂAÛ@¤„âèZÀGWýê6 q–yþÍŸ.!‹Z¾¯|Íáj´ þø§¿™Ü²à<‰-b›Ïù„œÍm8š;ÃQW–óºF}ûC‚÷#X‚%-œôÑr”†<ó-l/þxµêPÆ7œ©ßr±qWiÓ¡ª[‡«Cÿ2)ð¢ìËÂ× ûUüâH`)êZ{¯«ÒùÕÏÓùïÏÔg]¼‘HçibþÏö[Äð‡ 󄚛ޱõ´Csg8^ùÕÔÔ$Ôµ^óòs6` –zGšéü;/¥óëO×ÇÓy¥‰•y•¶åˆÄ( £¹Í­f¯·oßÖd¯ßé,Äÿ@Öl£¹çlz‘ÎOç8{}kr:O—ZÒØÚ=$ÌÓZÍhî?®µS£¹éí5kÚ÷…w˜¿Ó Ít~áö¢X:,þÆx:Ÿ_«JÉØ[Ö,3¡tâJX˜§cŒæv³½¢0J`¯˜£,=hnœF‘Σ†ž]|“&§ûùqæ©¥“ÑÜ$ö …º>?PI`¯Ø%XzÐÜ8¥Â€Ò;ÖäÛw a©&j‘ŒæNzÀÁu ¹qÎu‹½vtthª½¢kŠÀ^±ÃT°ôTÆßÝZ”ööºI‚ÕšÂ<é~yÑ£¹é;45f­Î]¿ãfaãÝþ¼Ê ›b *…žê&247½½Â7- a{¡PÑäÓ)âï¸&Ô%XÐÜÆ›¦|`«¡Û.ý±{åÄ•6ìZœ›²C@s?£AsÓÛ+„µX:°Ë÷–S~I¸,ghnã}3’hn¾ôg4·‚½¨eÙ©ººšt-¡z ‹S°œa}÷Mùh›%4÷ÃÙ¾ôg4·Š½ª—_±Àt±‹zô<,CÆ›¦|œô†ùÒ?鱞 ÍMo¯–„"‘ˆP‘ïÎ+u=Fs»Ím¼iÊÇW¿Öò¥?£¹ìòz½–ü~¿Ú|Å“WêzŒæv5šÛxß”ïQÁt,_ú3š[Á^C¡e§ÊÊJtê:®ë1šÛÕhnã}S>°<,)—þ¡—/ýªthnz{íííµ$44¤V×?R"þ’DGKQÇkÛ<Æ¿Þò7é/ýÍ-k¯èÔ•)wt¨¯÷ÑÜ®U[ÏÇø×[u@ÿÈùÒ?¹hn4Ë ¹©ìU\àóùTëzóâu=Fs»y%秪BmyðÁ3»Kÿ¥»K=Æ?+ס¹éí«µeÀ±8“;[Åhn7 X-ñ¯·ƒÀì :Ûü‘þ®Á1ÔRÑ»²»äù¥¿ñOÆ4·Š½ XŠF£BE§ë^t¿2šÛÍ‚#xŒ½9f7ÖäS¡¹éíujjJ¦TŒC®PQ¸g˜øK‚¡‹Ù;÷ß(ª(Žÿaƒ6€i4$¢–—%¨Ñ¨ ‰ø¢]( ”²-m4yè¶@mwÚÝ-°Û––-íBµÕ€ÁJ…XÛ´X¢®ßÓ¨){açÌìÜïÉ÷GÉdæËÝï¹ç|Xšõj$iÿyS ‹hîG·W¢UÛ©Òé´n®‡” ÏŽhn?ײÊfËøÏ›ò\ÄÐÜòö:::êÆMÝ-'ÒxpDsû¶pÍÈ2þæÑÜk¯¸Öj+Ôø¸^ƒ/Öó=Ñܾ­ƒ©¬eü‡M- ¢¹ó`¯ˆŠ1še;F¼ôðw¦ðàˆæögýñç_¸ÅiÿaS’Bsƒ.æ–·WT__ŸíTÀså4ëÁL4·ëTzÔ2þ«¦&¢¹ói¯X‹e+ÔììlN§Êc½xpDsûp^‹ kqyÓò]œ¶’ÓŽÓRhny{œœ´ +bs:…ëÖxpDsû ËÌXÀQ[N¦£©ko:¿ˆT]¢¹ì5O7u‡†ôæ+Æ'gðàdÑÜWs¬‡×õŸ~]¹‡óšÎCYØõ@gúׄmŽcÍýèöŠÊd2n ¹KkÛˆæöCMÝ»_¿Z´•ˆ-- 5ÕÚWa¬ÿÖÎæ+ëëSK˜¨¸©3šhnŒ½*¢¹½·W@aÝ@s5H4·‡…§‘ÊÞB^¼Ë³•´ùD~:¯êSÙPãå·wâö`s»`^õÉ©n!4·¼½NOO»æîÈÞƒ#š[²Ðßëù9ɺHò F‡:Â-Ø¨Š¢×Jv·ZÆ?1ÐÜÊö*æÆé _8ÑÜ÷X1UEæ¸FÈvb'½GÖƒ?ÐÜŠ ÿ„ìUÍ3ÑÜ.-lÅêì²Á§þÁYyŠT„!Î"þæ‚Nt  ¹ìUÍ_©Dsç±°0t¬tÀ–[ËøÒ“X`E5cÓÑÜö*†æFH4÷cþÃhÍÜ5ö¾À¼ÏëXàƒ£Œˆæv°× £¹aCÁhú£M‡(ù%\n3þÃsU›Žw©ÆñFÛDsÏo¯Dsû¿éÁ³}mƒ¸À˦¿ŒÖÔØŒˆæÎƒ½Íͦ?õßÝ5qÆ>Ò»G:uÑ܉DBÍ-d¯òhî›Dsÿ¿é8رK߽ϦÄáVÆDs;Ø«)hn4ÖÙô§ò ¬"[»ÑÜ(œ…ìUÍ»™f¢¹ïL¡és[ãe6ý 7øðX—eüSDÍ-`¯ÁFsþx—Mÿ9+ÁI ²Œÿtç´ñ X`q—¹Ííd¯F¡¹wžínúwú§é¾qãŠêø;G:+N÷ESÿ8ņ†‹Ü­­3ð¯ðù ¹ìUÍ-8"혙5©éfQ칪–7??Wë$‡æ–?zi‘ñ±@8>ÀX HhnìB@s;ØkðÐÜò .º~kú/«l~=Ú}nûƒ*–ßÅ0bÆŽ Ç x£šø€»_Aè°WSÐÜPCçp~›þð2ÇT–0 5õÁ ´„õ%‹>c,à Õa¦Õ…qûe£ÐÜBö*æ†CyÂø…-»é_TC ë°Ÿì~r«YgXE•cœñ x¦gvœuÃ^æ–¶Wy4·¼¶~Õ31=«Þô¯úú êüÞ7²>ý²G×añWðMZȤ ”sˆÀKÝþmFw·‹âÂ?!{•GscÙŠgËx¶ŸAêîÔ=©¦¿¼ÃÆp ÕuX{‹ÊŒ8Ãâ@”±@áèâ·cn,À¡PÎ^åÑÜžßùÀ]TœÚ´LeqiéµúT`†ѰÚ<7å©,D·xÁZ ’Ÿ¿îF>€´Wy4·ñïÛ»ñØ7º Ü4~ 3€0ÊÅXÀúèdÚ%{…¹ Ù«<š›ÛKºy¸Üªë°•gû±Uš±gÛ|"EN³ÆÆÆ¯< Ú«<šÛøWGÀa74\ÐuXÐüƒ·¾ ¹‡z,°é8c¿hi¨)§Y˜° cSBö*æF_Þ2þÕ»<¨ë°U-™âmÂ÷cI«z,°$Ä!iê÷ûnà®Qrö*ææ~1aZW×aA}º"  ¸cÂÕ¿LæP.LÇb៽ʣ¹qÿÉ2þÕÓÏÍYŒúŽ(Üë@,PÍX Õ3z;‡ra÷+°­‚ö*æ6þÕ‘Ôúº”®Ã‚œŠñ_CbZ›±€Õrå†ûT‘ äÑÜ õYÆ¿:Âz%’ŒvduöÙÍ&Ä¥¼Í" ‘…!tRœ‡’³Wy47±EòzyB×a1ɶ|—þ³÷K‘ «o·±Œ7ü©ê–LN¿T.ìOLLÈÚ«<šÛø·G^¥{Ûê’z‹%‡ÏWÆä!õúÒrÆ>6â»D Ä Y9{•Gs:wÍ2þíñŠßW—ÒrØH2»¢º`6ö—ìf,`˜½êÏC¡&k¯òhnã߯´rO<’Ð;Ãâϯ Û à%c`û†rú¦–íTÃÃâö*æ&ßßC•T·Hèa‘*¼XÛæûX€·‚#¬^Êé×ÈȈíT¸r*n¯òhnã_ *×þv=‡­Oe×îkF,°vo»eü;ð7{çãSeÆñ?ì0Ú*˵rµõcµe³U³ÖO[e+s0I(È$ -fja“@å÷+!¹»\¸¢ —A—y !A t§ïÖÜÚ29ç½ïûÜsîy¾ûüòžÃ×Ã9Ïó|sÒ^“ɤ·ž0ÏšÜ^飹ß@ÙeSYãþÖ!-‡EíÁ惯 k÷4«^ |~’¯,ó‹CªÖÇìmR{¥æF  p~e'¿nØwVÓaÏ ¿ZÑfÚòáñ¨Fµ@_L嬽¢*@-èšÞ^飹ßC&Í–{5ϰ—_?Ün΀04˜>_ ä˜v/õ…yƒ*™ÁÛ+Gs3÷ecIýÞ=‡oVá°ùµïþØùé‰.vÐMÀ×9f_H}¥Óií•>š®Âù=d×íiÒvطׂPµ­•e ÷mBãz‹À’Ùd¯ÍÍ<€ »Ï”5&töý£fG¡nI]ß¿ÿ©/àk›8÷ß Eo¯FsãÖL8¿Ì‡;´Êè:ì¶ãÑ<3S j0SüŸj­/ª»…óëkÑ‘”MO[Íͬ Ší¿ÒwXLÿË+¨56µ Irm\MÍK}MOO«´Ao¯ÍÍ(ÆVï>×uX<.!§ÖÐà&öV ¹½ºÒA0‘HØkö£¹Ó. ç·‘™ÍûE§´]üœôÃÂÓeMÒ—FGG•mŠÞ^飹÷óÔ"3¶¶ ¶G×awV÷ä²Ã2qJÈ¢‘.ÍÍh£èÎên]‡-¬éy¨Ç¥3ëréK˜îï­'Ì%Þ^9š›ÑGÑ'/h5t•6$^;|.ÏùOÇdBëlÄb±˜·žP¼¼½r47ãÐ*ý nã)hff&,{åhn&;þ´:ÆåYvR×7jEðt–½r47CÿèO¯KSsÂùµ°Žg¿mÆ}‘ï›ôb):½ͽƒs’-,ß~"¦ðèO'ü?Íc8ºjß Œ…h¯ÍÍ~\Å•Ž4OÛ«bÂùÕ±ˆ—ö½s×õÈàà ) Ê"°W“£¹…ó[Í"ú'ÒÒHU_¸&œ_‹è‘ß)Y‘HD1H%D{åhn&@žÛÛ"MÕõ Âù²…~‚Kø×ää¤)Œ °WÓ£¹¿<Îo8+À$@i°ž*mί‘ù ™hf~)ì!Sú7úöÊÑÜL€l,®Sï¶¢WÁ¯=Âù52Ÿšîk5øJFÓÛ+}4÷ì-Žæ¶ô³JSUß7!œ_ ÃùàXg†ÿ?cx«âj {¥æF<Gsç*?G¯JS•š_Î/Él*mÄI™0ûʃôÑMº½r47,˜É" Öó{9!ÆÜVi”¼®CH”½ZÍýÛåß…óûÏ ):­ÞiC¯’º>áü™|åJpt…ðJDa¯ÍÍN"9+M²ò…ó d ¥õý4}ùPoo¯„ì•£¹™ÀÁtAiªn.­ä9¿@¦ñÙ/](8¡ÉLÐ/Kd¯VEs ç7¢ $M¬WF„ókd˜‰¼™OìSù£êîî–½r47Æ„lõ)®ô*o¾(œ_#CØv,ÈVÁHl‚£+½ÒGs¯¬q4·U ã¦*:’Î/ |Rù5aR*YJb%Df¯ÍÍ„Á~oPšª¥ÕµüB~&Í2(áÀ@¬@ù«DmC°`\H’Ú+Gs3a°¥¢MR‰£¹­«oEx„ HÃÃÃDPëJn¯ôÑÜçw§-¿Bê‰/ô:ÔÆÑÜY›J½š’)•JyjÂ|BL’¢¶WŽæfþfïZ_ã*âhþ¦|½B)‚P*X| T$PQñ1µ„Ú5Ji‰Z}Ð6“ö&iÜ$šGLóh’&iØm6MÜ6³Í£ù0Š‹:›ÌÌÉœÃù¼¹d÷ž;÷w~¿ß1Ä–›Yá*>ÿ%òN3=ÿ@hB>Ÿ‡hÆj˜œœ€eyõ.š{?£¹=!R …0š{g¼ÍT7 j1²äÂl¬¼ŠÕ§6OòÊhnÒ\.¬pÏ£à¿#;ÜWëäƒV¢ï(VÆÜÜœìË+£¹Isœ]\æjíÀ; OµÜ”‡V]@Ê@,¡¾þÔ¾¼&Ímq.!Íí ‘¿-\Eë—™åû?u"(/©|r÷)ÊË«ýhîÏwGÁÿv½à§—z„«¸u—¯A¦øÚɘ‡†îeK’zí11ye47i4”›ÉAñoÛ{nÿ)Ì —ËÉz£zRa’òÊhnÒ(Ó÷–„{XZy¸—ñÃZP ÎÎ À míêêBWRÂòêi47ï _xñúm×Z²ÚF¦Ù6 ‹{*ëŽÔ÷Mæþ&Ü¢´‰+++HV^ÍMš^å)’v‰ŽNÏ#¬ìÌo`»«î*¿üÞÈÁãÊ‚SEm•vŽ,¹&,¯Œæ&òÉʺ¤¢¹Q—@¾Èg;÷T²ÕD[¶Õ…®‰…–&ž1m@%h*yÍ8qr¶€NÛ†¾4:ž9ÜÿŸ×Eô¸Ü÷gõ l•SÈB\$°áEŽÈ+£¹IÓüÞp4÷ÂòÚµ¡)„5í«bEUwWÔ¾ýMÛ™ö[£wçí¿} r o*.å‚€¼šæ>RÏhîp£¹—×Ö;Æfª®`K3.õ¾ûÝ<„檵õÄò&°Î´ ãH) P¶ ¸"¯Œæ&-Dsk1@ð!]Çå§S»Ê™[¡/žh:Öp K«E¢À„QÁþVÕ6,9ä¼2š›t9š¶ØÈô<^Q˾£é¯“Ï»r°¶·qMä«Â ` T¡P(¦Jm @^mEs¿ÊhnOxòZq†ú(iúkçS‡~ùäBwmïdv./\¶ïÿ›D¨ìŒ–ÚꜼ2š›´Àç¿hT1ýëûÒå{ž>Ì]VÚøÄÁŸßýá÷sã㳋*¦ýÁÎt:]XiU÷²°™OÈ«íhîî Fs{CœFEÐ> ÓÿMݦÿ[5m5­#ƒwîkˆ 49‹U)]Ô¦ÁÍ>Ðå•ÑÜ$ åQÜðwî/!'¦ÿ+_5³z®Ýô¿>1‹ûB¸ LUÁŒŠ·lã ¼2š›$­›þN–ÐtµMaE¾ÖÌÌ >òj<š»&5‘šþ1b“—V„'€û„k{{{¼=´µµaÎHye47IºhúÛlE=— ;Y” #øXÊ«¥hnTîÍMî`ÓÿlÇØøÌ‚,™ùrVÅÛ*z­ZT—`oV)¯V£¹1s+’4ý¯«.,,`ÁNHŠy-êyY2ê•òj;š#=Qð·%é»é_Ý4(MÏç3™L__Ÿ<¨êŽÀ›ÊëÿbLDsMÍEÁߢ$M›ë¬¦¦¦R©Tl 8´â@&6@yM,šcéŒæ&}1ý?“¦¿W@žÚ¡°oÞ}l8„mŽcQ^“殸Ôë’4ýµ;Tðý‘·ÚÑÑÛf‹°cOl€òêD47+£àocÒ¢›e¿Ÿ¦?*xð‘`Óc •^‡J¥kH¶½S^ŠæÎ¯®ï®à¶:’¦ÿ¶LÿÞÞ^ÌDÅÖa•eVÊ«‹Ñܞ늂¿ÃIšþî˜þ*e@üu(»ØåÕÝhîÔp6 þn'm›þ+þ™þÙlִ鯲Ü B2ÿ‰òêz47’B¸z™4ǽGiúÇZ[q1rtˆòêG47püJ¼ &Lÿ)Mÿ\.gÍôWé¶Äk+ÎÎò )¯žEs§ï-=¼"4ýM í«ðʰ(ëÑ"åÕ×hnÉìQðAnÙôïÏøgú/..*˜þöÜ*œ—qjÆÙùѹʫ÷Ñܲï£àÅ‚¤éoXäŠÚ.ŠªÿØ@yu7š5„¢æB¼\ݯä˜þGëo´Óôß.p¸\.LNÉ+á˜È†®ög¢àE„Üa¦¿ÜóŸ,`JãÈŒƒ3ŽÏ‚pV^Ñw¥}9¡ÜðòÒ—MQðšoút¾«¶Ç?Ó%K§L”tQØEyE^wá¾¼â±+?2Q<Ðï¯/4ýiúoǡ•àzpU¸6AXWûÙ0(Ñníùú©_£àå&"‰ýÍšÖšMšþFÚ‡ñ€Y]]õO^ñlÔž+1:=Ï }šþ.›þ¨cÒôwX,UZZZRRRVV柼b•C¬|÷bKø¼î(x%ÚI|áD#Mšþ³wæARUW>**®¸j•àÖ"… KPQÀq0.ˆ–ÖRP‘EYD QÐ@@Á P V H‚ )5ÔÍW3©©7ÜûÞÜ~ýzè×}¿¢üÃjz†™×¿{îù%BK.\8xðà§K(**úè£JGÌL˜0á´ÓN“nºé¦øÉ+—#›§úpW•þéW#'ò^•rÃôßïLgúG ÿÑÓsÏ=W4N=õÔzõꉇã?ž„IÌä¾ù曤³¼Øy\yò§Å0gú;Ó?ƒ¿#ÂU4TRaöìÙVòÇüÀÚµkUX^›ãöÄÄÉôßáLgúgÒªzì±Ç$uºwï?yË!i¡g³Ýèe‰¼×/gú;ÓßÑ¡C ŵ×^Ky% ’´€´‘ U|’y/gYeú¹sï~v¦¿3ý#ƒÑ\ƒ jÔ¨QÕªUÏ9çV…«òKð†ñ“WÌ;›+¯Ig$#;y/mÎôw¦®ôéÓ礓NÓ¦MS:tþù狉úõë7ŽƒŠIÿŒ™¦ ë„N Þ0~ò „I S Ò€í‰¼—¹Ê7ý—nŠŸéO0èLÿ,Ïw“T,Ù÷ìÙCuªhtìØQy ÐJ4Ž;ÞzK7ýFŒa|ÃXÊ+9xËS:³úÌüC"ïUÏ™þÎôµª>ûì³5jÔ‘U«Vq ÖªUKL\vÙeʃQ‚_xῆóÚËkìdaóæÍ* Höu›´2‘÷"˜ Óæjgú;Ó?Spæ•©j………uëÖøIª8¢TÊW³îÝ»WùP½zuãÆR^9…’vð“Ri@!AÇñn ¬3ý³ÅôgúWHëÖ­%uÞ}÷ݲå~¢Q§NåOûöíoKyå¡'ÏeY›æ]éÇÃ?užðY"ï%2„éßeÂgcëLgúW6ï¼óޤÎ#<¢J˜1c†hÜwß}ÊŸÉ“'ß0–ò ¤¨“vP¡ ½¶ûd—%p¦¿3ý+|Ž–ñãÇ÷êÕëé^~ùåyóæññWþ`è‹W^ye×®]GE˜9|øðgžy&@^6l¨üá~#]tQ@l'Y~k³t¸Ó¥¿{’IKý‹×&ò^=ZcúÏs¦¿3ý£œÀ0gΜ‡~د•Lèý÷ß¿zõjåCµjÕÄ´§Kù0sæLÑà U ˆµhp@ÆR^ôSÒŽõë×G èJ_¾%‘÷bšK¦?î3ý³eË–]ýõbõOÆàéñÇ^}õUE1<@X4FWyžË¤<¾* >ýú¯M~3??%µ1¦ÿ gú;Ó?ƒ=þ:u’¹ùæ›õ-Ñ'NÏ?ÿ¼MæèX4èòRJÌKˆcy%5cùiY¾|¹6ˆ $ùÇ¡Nã?u¦¿3ýém3b$¡ “Š.M=ªÃÀVeÁ7ÞhÌpƒôr.Úmù]ÇU^í§5ÆÑ³GŽLüìÏ ^››«¦ggúGmú“OT $ Úµk§ÊsÅWˆ†å*W^yELôïß?`Ú”˜àšcyE1W¬X‘´cÆ ¦·þÂÀ‘Ü3ý:Óß™þ• ?4=ôƒO<±eË–o¿ýöܹsñ÷›5kf|: ëÈÔW±†e±Æ,‡±…ATÜØ¸qcÒáM“}ûÃÁ1É?µµ¬ò§_¸qõö=Îôw¦úìß¿úôéÌŸ~ðÁ[´hÁî)Ê?9ö¢J†0Õ_4ˆ:UELš4ILx›àiýò[%`Ÿ¸@4EÃÏõbï¡hà¨ç‚¼bw|þùçÙ£°Ûö „ì1yeævÌ´±xàì/ç¬Ûõí¾ƒÎôw¦TŸ&üO9å“Ï)Éö<Ѹí¶ÛltŸ*8«@‡×˜W XCëíyç'ðU˜Àí7m‹,p¼åÕû%µšÒǩҬ^ÂÉõ»öMûb[Ѭ5mG-£¼4œ˜RoÛnt’iß~÷õÊ­ûûÿv¦:)r¦¿~/N$RÌX![¹¼^sÍ5Êcï,»”‡€Ýö`†?õÔSF¥<®E‹ùM“¹îºëblméð9Iµ¤Æn,lôYÚÝ?\µmÏü?~‹'6rÑWÔH18æ×ÓWNý=úÍZƒÅ?tÁ’ S¿Ø¶ä«ïPçïöú¥ÄQq¦¿3ý£¢BÜ÷ä“OîÞ½›$Û%—\"v´jÕ ‹?Zy¥ø‰&.UÆ-ÙEEEÊË/¾h\%ÎÝyï½÷XûÀÜ{ï½]ºt9r$O‘òðñÇKyúöí›Sò œ!©Æ/Ô(‡3ýó¯ÍŸ $B³²ÊÍ;ï¼S/{ †¿®BؽªOÃÒa;‹hÐP/^ì¿› úL×-·ÜrTU–ߎ‰õ›)YÉT ¥@Â[9r×ôGJ”ê9ã!yÿý÷C?0gžy¦h`¦©Š P Ì¥£Æ’Pšj^%)¹Â¥RÌ7±)àxübXN»hw»Ò¾Åw®GèC† Ñ/ã°`Áã$Ù£–Êí¥EÂXíoÏÀIº0”’K™AbØpÁ‘Ÿagú;Ó_W•—^z©h¼ôÒKöAƒ÷ xÅè!ÕÖ­[Cëü-£º± 0t©o°‹m†,‰)..¦ZÀø£ƒ»ï¾ÛïÙhܸ1ý5"ƒ%‰ÉIS’@ ÜEˆX?øàƒ(;$Ç…tþ&C±fÍ%gú+Óß¾}|²äÔ!ä¡p½yóægŸ}6Z¯ÂB…©hPÖ£,à×Ô AIôE÷úèÓ zT =ôq$  yLI«ˆ„jáQ€È×+<ñÄôæîܹS¥Žä^Þ%eɰlÞ¼™ß3ýóÐôçàÁÖç{”ÄŒg"cß:’]¡P¯^= Åðª<íÛ·a¬3ÖÏ8¦(tOë°²…£Ž§W;œ¼þ?úØ´iS2,ÔÆLñ±w¦&Lꎳö«U«–h°|?oâA—lòÝF©-,,È0±‰LkÀEè,R°ÅBëT˧:-…ƒœä2 ‚tŠÿ3ÿùæ%Epð}øëN^³òJiZ+ˆ,Wgúçéo¾ºâÔG.Ùì>yî¹ç˜‚™NÏ¥* .þ¿qÄe…¢œdf¯¾.C…}S[¶lQ&‚³ H¤¾×š/|voUªßv}û¼†¥“E¼f̰ñL~ ÉòüQ]èLÿ”N&ºéâhúÏš5ËXrσ”¹l#î¶* þ¢AI–ñFE ìç}1ŽZy f4ï艴‘W<ãˆ)¿4ÒOv›ðYü©[·îo¼QV=éä5ëÀÐÊ Â@­5…{¤œéŸÃþœRÆ%z~øa¸–BîmÛ¶•@Î:ë,^é½;ë·~<뀋•˜`¿òеkWóŽþ@¸ã땪z-=ÓÿÄÃXƒ#ƧÈã"6.¸ž”?pïº<'¯Y}_ÆŽêªKˆ„£3ýòv¤k¦Œ1ŽÇG˜”?~z¿~ýÄDðd“7ß|S4âT ´ƒGïÆ9 ;úõÚ\ µ˜ ¬PaqòP%-QVÒ ôþKÞ Ó÷_²NÎô¯4Øãd¬ØWþ° š1ܲù™µwZ¡î`Ü«Wi— QÉOºVLPQäÍ•csnfʪEƒt‡2áfÌ;yÍ Ð)²“™poZîÅqبmúŽ?·Ô]»v1Œ#K$•âjÂvÍôÏAæÏŸ/&8J• ž¨2ÍâRO‰G_ËsƒhµªQ£†òû.æÓ[Wu®ºê*Ñ AyÀ¦³ßÑÏñI ¿åÖ`{ ˜@Ö¼æKŸ:Hì™Qc‡3ŸÊ0’GDdHG¢ì¤™~.»ÿåÙÅL§ýƒ¼§ýÂ~-ÕSgúÃd½±à Ñ4>Nzu*ÆTÙ Jýqô×^²3«lj’zôèal1P(2³lá' nÖ¬™±·Ê²H–5þ¹ p*;yÍ#Ð âͤÔôÐLÿ¼Cè ”å+ ÆÚë>‡¥7?À*¨¬%Û,¯´ŠªŠ˜2eŠ€æ‰Uf`š5vìXJ’iL",˜:u*“÷è Š®Èûƒd{)+(( ±•ËœÊ{Då+ÜY(*Hæ=n¼ÿÿØ;›W›×(ޝ?@J™Š$y+Bê”LÈ[d€DRÞH‰ƒS”·N˜"º¥D·Ü™‰±™ûW麟ö®ÝoÿÖzžýüö=çØ»½>£{Ï=öÙç\çû{žµ¾ë»j°Ø£çògàæaÛ>è”z¥Z(Ù¬–JÞß›—_ëÚ’:+ôå°>¶çï”!¯ËK‡¸ϰ¢EÓáy#Dœh…3gÎH7˜ê9ò7“l«°Ý\QíŨž§Wè{Ög+u- B^›ú¹MwÑspšþ1¨üŽìB¼¨Üñ´_¹r…e$ŒØy·%E¬ŸB ®ÒØ?¥ýí[²ó xÜÊk¶ ÷z1Œi7Œ«JC¨¢RB]!¯ÿKd©9Níx~4ýdªŸÞU··Îe\ nÇœø(…8ö¥›7n¨¡\²óKU•š+¾HöÓn&¬X±‚·¤AÈë”X÷9Üõ¹5PMæp,èhC² *Yh=i7ãããb I«]›¦ocÇ7«þP.Ù¶`…gË=ÀbÓ4l»Ll_·$@–G*ê¹qh y“,Süý¢éß÷ƒŠ¸†{÷î1vIÊßY`aá}è,˜P„¼¬ÚRyäÎΜ>m1º„_pÈÅh‰Vþcàƒ@W„AC>™û>jÂç~=Ôþmêî:{¾¯r“QÐ\~SÓúܲ3 öL¦Ú¥R¼fÓÿ›sæÌ‘†0Nš¹^ z™e'X¦¬Ä/X°@šÀT)j(i…áÐ ä5ð_(]“Páêc¼–RÀ¼yókÖn¸OˆÁXšŠ@ª¤9T0?•XÈ@aØ`5Z…]Iu‚ø˜òM<õÝAš5y ëºîøÚ‹Û·o›kt¼¶³…8êÚÄ€[dÆäéÑK‚ZÚ€-D¤¼M„óK–½{÷ªáãÇÛ·o'{Å.¦æG}ëÖ-î=M[µnåáõëׄ¼ƒ }1¬^½Z³°DšCË›jµVpûéëׯ§tË”¡{T©–ØO¹–vƒo7Õ¸'7ÿniL¥–D!”’€wÂq5ã6£ öw ,öõ˱oƒÊÎÕAƒ×`€ñÓ›èæ3ò¯ 87I¿à±­ª2*Íáí1_ëMáäNmAUæ¬MœŠ›B@y}É’%âa ^Ó® \´ô Y—À¸D„¥…¼CàÀ¯nfù¾Ý}Ÿê’ÓÛAθ§ONNb¨ê<íjk…Ÿ>}’~aj@+Ъʻ ÄLÄßܹsq‰¹aÕØø­SqŸÉ©¶K y †vŠD}5¤–˜¢¤Ä”ÔNUØŽ9"ÜîÍWo j&0;ç‚àܙ⧒À]Þ½éãÓâJÞ1äbÑ ä5jPÄJEóŠMV7såtsE—-[æåèPYëUj¾8ÏŠIUhAðoCúâÔ©S -¨±ŠÞÛZë©Ów² ¾HpªœŠ™Ÿ\+f4y ‚ª9ôÙ³gdAÙ)©òx*Š€MƒñQ%r°òÛ«°7ar¢Åo§¤(8 ¾l6åŸ{&ü32[â‚ÀÂLc*Ó#{Pƒ× (Ï)3øbhOEÃZ ù¹#4Ú=ÀÒ¥±&˜ÿnÁ|§l>R­ùºßBõîO&@¡ ‚M¶Ô0.!¾) B^ƒ çâ<ÝR•ÓžËû˜ˆw7å´JVKuŸ¾u_õ+ü° -^¼xQî‚`ZÃ@çÄJ¾þ-”>’!¯AÐî¹ÆÔ<•õ 0Úid}øðáüùó«V­BÑ23Klðgù¦}mAb  zR(vA0MÞUbY4y ‚rRH5ÊJ‚WŽ;†€»°iXÙ³¡/¯œûÈ…aö‰r>»„/„»5Ô¾À‚JqÀÆMÕì Ôy}D„¼©µÉį¼ÿžÛ+n$4¥¤—Å9ÑU:šãäQÕb¡][>yÛfȪ¶«JUuÑzj¸Õ8•ýû÷k7/_¾”Ö®]KsOƒ ä5hþ¡Œ]táÂ…‹/N9¨qThÁºÂøg«qÖÙZ½†ØšYI@\ô÷ïß±% µ,ΡãO {ܦPP;¶KÎ˼ÃþÁh„¼Ž8Œ }ûö }Á7Z¸/–%(©Ýy4Ø›ÒÙMsœºLK'#¯\áÕP¢q,’* ™.‡´i»tš¢.ÚK—.]»vmô÷øŽk ‚×c¿ŸlR¢íCwŒŠƒ°zämùDÚ³f¬b xØh„¼ N‰¯—4wîÜÑi€íÜË·˜àÊ,ôœâaR|‚Éøø¸¶`ößÝÜ×Ç\?‰®”8쓬dˆËž¯É¾Ò y"-ÉBÅP§JœH4„ò¢µ%ùOäééÓ§Ì›rzÍäï]¾|Y<>þ¬†|æ?‘ꎫnݺµp³æ¶­h„¼tì]Õ†˜L­VLyÐ_~‹²[H­®¥fÊ9~üxê¤\ ÖkG ÒXð"¨yµÔêinîâqýúõL¥›ÚÙ³g‹2Ë@“ŠïEƒ äuØ-MÖ„U“Èú‰‰ ÜBåzÍüÆe„›ä:ë H_Òàgʘ¨Ðê¨_È=½¢wgÏž¥šœ ä?­\¹òܹs6X¯S°‹^è}ÕB¯Oœ8‘ ܼysÏâ ßAµàͰ%&Sƒ×¡¥sy¢_ßÔÛTÕάQÑnHT.˧Ú#L–¹8p@Às¡Zy-géÒ¥l@ÈHêÓd£dªÀœ+Ñnf 8;[aµþtð4B^G ΤâñøñãÂ`*úà´nÚ«úܱUµê§- ðJ¢©}\Û­Àu¼Ÿ»wï–˜,à õܵ Û}ô²dŠ` @ƒ äu¤àæ.ìkÊ«ê—/_XXBõ Ýºá‚œªlr:Ö dòç×î[Ø÷'¶ÚâêÕ«™âÁzìèï¹ý‰'„-.saoêQ¥YG9Å_Y!¯#ƒLnÎHÊ\‰’¢ªµMvÜ‘—/_.iˆòËxïéå »DXq—nyÀÙšÚ"dQ–/þüI]‚.“["0?Ÿ\Éøëׯ|QzYTuùW2Hu!7Kƒ äuôð{8”&;¹ý´Ñ™ø4ëN‹¨…}šó¯AÈk`sžJ¤XM;W]ôEÒ°BÕ˜ÊÈ+¾¥¼·©½}š2(ÙW)íCé2¢Œ7‘Øccc™|†4‚×ÿÚ»c”Ö ÃÓÛXdá.A±²Kc¡`•Îm)l7¤rbçÒæ¾(\$3çÜÿ’p1ð>;°âf¾ï(áX1ŒÐ¿üôðð0µ¢?õ|‰öÇïÛ§É0dŒÆaˆ KIŽ×Ãñ¿0ÿÇ,ºï ‚bÛÿÏQ‹¨Ñ!itdO–ÏD‡·O·_Æß…§Âa ßJIŽ×£˜OáU±ME‰ 9àòò²mãíÓ\sq§Ÿ§§§W[c%9^ååå%¦QŸþs‚ „@At¸þÊ¿aKŒedlÏ|†b[‹…Óñhj‚Ãy,NIŽ×ãâ1”Eű#Q¬×ëì>Ù(9€ÒÓ©—þò…ÕWWW#Ÿ¡8{%ú`þàŠZøÃS’ãõXÆO‹E{øDqKûK°$¤ô¨˜:Ÿ­ª\"°û}°ÜÂæ,¢ mÙl6ô°µÊJ/!D[qãÀú­;ÿ’ãõ?á™5:AgÁ×|†iŸÄ:€:¿†Åä £ö¨XÛŠ›X)Éñúó‘iÒnp¯•rTûSÚ1···q®¶¸,HIŽ×Ÿïææ&Š»»»ìp­å²9†g„6akgäѤ$ÇëÏGeôä½VÁ]itf>OÕ†WãߟŸSf˜¿äx=ì“ÎÜkÕîr%Uº ŠZç·Z­bÇþ<ËòË7%9^O¿RùaÅóósvê×üÚM0²ÊÊví^œkµ\.¹X¥F0%9^OÑýý}›Ò’’«ún‚b¤y…º”¯%*Þd}¢·•ØívKž@Jr¼ž4N ¥M =‘zŸì&äxÕÈIÕÇÇGt±°ÕwHr¼jïŸtz´Æ«Ùíï» $9^µ‡xÿ(®¯¯³Ãç¦ö”Ö­)Éñª}TFA[*uªY«JýR’ãU{å¬Ñy{{9¥ýjŸ¦û/%9^µ§­h}||œ ä>;;c¡Š£/‚SM¢’¯šDjÙ¡7ÛÛÉñª!»Ý®mL¡¨5%ÉñZG|ɦ†€¢ª´8.HIr¼‚*Â[___ÍO‘äx•$Ç«$9^%IŽWIr¼J’ãU’äx•$Ç«$¾ß‘Ù©ÆH£NËIEND®B`‚compiz-0.9.11+14.04.20140409/plugins/cube/CMakeLists.txt0000644000015301777760000000014712321343002022633 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(cube PLUGINDEPS composite opengl)compiz-0.9.11+14.04.20140409/plugins/cube/src/0000755000015301777760000000000012321344021020662 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/cube/src/privates.h0000644000015301777760000001325312321343002022672 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _CUBE_PRIVATES_H #define _CUBE_PRIVATES_H #include #include "cube_options.h" class PrivateCubeScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public CubeOptions { public: PrivateCubeScreen (CompScreen *s); ~PrivateCubeScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CubeScreen *cubeScreen; void preparePaint (int); void donePaint (); void paint (CompOutput::ptrList &outputs, unsigned int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void glEnableOutputClipping (const GLMatrix &, const CompRegion &, CompOutput *); void glApplyTransform (const GLScreenPaintAttrib &, CompOutput *, GLMatrix *); bool setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &v); void outputChangeNotify (); const CompWindowList & getWindowPaintList (); bool updateGeometry (int sides, int invert); void updateOutputs (); void updateSkydomeTexture (); void updateSkydomeList (GLfloat fRadius); bool setOption (const CompString &name, CompOption::Value &value); bool adjustVelocity (); void moveViewportAndPaint (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, unsigned int mask, PaintOrder paintOrder, int dx); void paintAllViewports (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *outputPtr, unsigned int mask, int xMove, float size, int hsize, PaintOrder paintOrder); static bool unfold (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool fold (CompAction *action, CompAction::State state, CompOption::Vector &options); public: int mInvert; int mXRotations; PaintOrder mPaintOrder; CubeScreen::RotationState mRotationState; bool mPaintAllViewports; GLfloat mDistance; GLfloat mTc[12]; CompScreen::GrabHandle mGrabIndex; int mSrcOutput; bool mUnfolded; GLfloat mUnfold; GLfloat mUnfoldVelocity; GLfloat *mVertices; int mNVertices; GLuint mSkyListId; int mPw; int mPh; CompSize mSkySize; GLTexture::List mTexture; GLTexture::List mSky; int mImgCurFile; int mNOutput; int mOutput[64]; int mOutputMask[64]; bool mCleared[64]; bool mCapsPainted[64]; bool mFullscreenOutput; float mOutputXScale; float mOutputYScale; float mOutputXOffset; float mOutputYOffset; float mDesktopOpacity; float mToOpacity; int mLastOpacityIndex; bool mRecalcOutput; CompWindowList mReversedWindowList; }; class PrivateCubeWindow; extern template class PluginClassHandler; class PrivateCubeWindow : public PluginClassHandler, public GLWindowInterface { public: PrivateCubeWindow (CompWindow *w); ~PrivateCubeWindow (); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; CubeScreen *cubeScreen; }; #endif compiz-0.9.11+14.04.20140409/plugins/cube/src/cube.cpp0000644000015301777760000013131512321343002022306 0ustar pbusernogroup00000000000000 /* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman * Mirco Müller (Skydome support) */ #include #include #include #include #include "privates.h" class CubePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (cube, CubePluginVTable) void CubeScreenInterface::cubeGetRotation (float &x, float &v, float &progress) WRAPABLE_DEF (cubeGetRotation, x, v, progress); void CubeScreenInterface::cubeClearTargetOutput (float xRotate, float vRotate) WRAPABLE_DEF (cubeClearTargetOutput, xRotate, vRotate); void CubeScreenInterface::cubePaintTop (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) WRAPABLE_DEF (cubePaintTop, sAttrib, transform, output, size, normal) void CubeScreenInterface::cubePaintBottom (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) WRAPABLE_DEF (cubePaintBottom, sAttrib, transform, output, size, normal) void CubeScreenInterface::cubePaintInside (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) WRAPABLE_DEF (cubePaintInside, sAttrib, transform, output, size, normal) bool CubeScreenInterface::cubeCheckOrientation (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, std::vector &points) WRAPABLE_DEF (cubeCheckOrientation, sAttrib, transform, output, points) void CubeScreenInterface::cubePaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) WRAPABLE_DEF (cubePaintViewport, sAttrib, transform, region, output, mask) bool CubeScreenInterface::cubeShouldPaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, PaintOrder order) WRAPABLE_DEF (cubeShouldPaintViewport, sAttrib, transform, output, order) bool CubeScreenInterface::cubeShouldPaintAllViewports () WRAPABLE_DEF (cubeShouldPaintAllViewports); int CubeScreen::invert () const { return priv->mInvert; } unsigned short* CubeScreen::topColor () const { return priv->optionGetTopColor (); } unsigned short* CubeScreen::bottomColor () const { return priv->optionGetBottomColor (); } bool CubeScreen::unfolded () const { return priv->mUnfolded; } CubeScreen::RotationState CubeScreen::rotationState () const { return priv->mRotationState; } void CubeScreen::rotationState (CubeScreen::RotationState state) { priv->mRotationState = state; } int CubeScreen::xRotations () const { return priv->mXRotations; } int CubeScreen::nOutput () const { return priv->mNOutput; } float CubeScreen::outputXScale () const { return priv->mOutputXScale; } float CubeScreen::outputYScale () const { return priv->mOutputYScale; } float CubeScreen::outputXOffset () const { return priv->mOutputXOffset; } float CubeScreen::outputYOffset () const { return priv->mOutputYOffset; } float CubeScreen::distance () const { return priv->mDistance; } float CubeScreen::desktopOpacity () const { return priv->mDesktopOpacity; } CubeScreen::MultioutputMode CubeScreen::multioutputMode () const { switch (priv->optionGetMultioutputMode ()) { case CubeOptions::MultioutputModeOneBigCube: return OneBigCube; break; case CubeOptions::MultioutputModeMultipleCubes: return MultipleCubes; break; default: break; } return Automatic; } int CubeScreen::sourceOutput () const { return priv->mSrcOutput; } PaintOrder CubeScreen::paintOrder () const { return priv->mPaintOrder; } bool CubeScreen::cubeShouldPaintAllViewports () { WRAPABLE_HND_FUNCTN_RETURN (bool, cubeShouldPaintAllViewports); return priv->mPaintAllViewports; } void CubeScreen::repaintCaps () { memset (priv->mCapsPainted, 0, sizeof (Bool) * screen->outputDevs ().size ()); } bool PrivateCubeScreen::updateGeometry (int sides, int invert) { /* This will never happen, but we want to calm down the static code analyzer * Coverity * See: https://bugs.launchpad.net/compiz/+bug/1101541 for details */ if (!sides) return false; sides *= mNOutput; GLfloat mps = M_PI / sides; GLfloat tmps = 2 * mps; GLfloat distance = 0.5f / tanf (mps); GLfloat radius = 0.5f / sinf (mps); GLfloat normInvert = 0.5f * invert; int i, n = (sides + 2) * 2; GLfloat *v; if (mNVertices != n) { v = (GLfloat *) realloc (mVertices, sizeof (GLfloat) * n * 3); if (!v) return false; mNVertices = n; mVertices = v; } else v = mVertices; *v++ = 0.0f; *v++ = normInvert; *v++ = 0.0f; for (i = 0; i <= sides; ++i) { *v++ = radius * sinf (i * tmps + mps); *v++ = normInvert; *v++ = radius * cosf (i * tmps + mps); } *v++ = 0.0f; *v++ = -0.5 * invert; *v++ = 0.0f; for (i = sides; i >= 0; --i) { *v++ = radius * sinf (i * tmps + mps); *v++ = -normInvert; *v++ = radius * cosf (i * tmps + mps); } mInvert = invert; mDistance = distance; return true; } void PrivateCubeScreen::updateOutputs () { CompOutput *pBox0, *pBox1; unsigned int i, j; int k = 0; mFullscreenOutput = true; for (i = 0; i < screen->outputDevs ().size (); ++i) { mOutputMask[i] = -1; /* dimensions must match first output */ if (screen->outputDevs ()[i].width () != screen->outputDevs ()[0].width () || screen->outputDevs ()[i].height () != screen->outputDevs ()[0].height ()) continue; pBox0 = &screen->outputDevs ()[0]; pBox1 = &screen->outputDevs ()[i]; /* top and bottom line must match first output */ if (pBox0->y1 () != pBox1->y1 () || pBox0->y2 () != pBox1->y2 ()) continue; ++k; for (j = 0; j < screen->outputDevs ().size (); ++j) { pBox0 = &screen->outputDevs ()[j]; /* must not intersect other output region */ if (i != j && pBox0->x2 () > pBox1->x1 () && pBox0->x1 () < pBox1->x2 ()) { --k; break; } } } if (optionGetMultioutputMode () == CubeOptions::MultioutputModeOneBigCube) { mFullscreenOutput = false; mNOutput = 1; return; } if (optionGetMultioutputMode () == CubeOptions::MultioutputModeMultipleCubes) { mFullscreenOutput = true; mNOutput = 1; return; } if ((unsigned int) k != screen->outputDevs ().size ()) { mFullscreenOutput = false; mNOutput = 1; return; } /* add output indices from left to right */ int x; j = 0; for (;;) { x = MAXSHORT; k = -1; for (i = 0; i < screen->outputDevs ().size (); ++i) { if (mOutputMask[i] != -1) continue; if (screen->outputDevs ()[i].x1 () < x) { x = screen->outputDevs ()[i].x1 (); k = i; } } if (k < 0) break; mOutputMask[k] = j; mOutput[j] = k; ++j; } mNOutput = j; if (mNOutput == 1 && (screen->outputDevs ()[0].width () != screen->width () || screen->outputDevs ()[0].height () != screen->height ())) mFullscreenOutput = true; } void PrivateCubeScreen::updateSkydomeTexture () { mSky.clear (); if (!optionGetSkydome ()) return; CompString imgName = optionGetSkydomeImage (); CompString pname = "cube"; if (optionGetSkydomeImage ().empty () || (mSky = GLTexture::readImageToTexture (imgName, pname, mSkySize)).empty ()) { GLfloat MaxUShortFloat = static_cast (std::numeric_limits ::max ()); GLfloat aaafTextureData[128][128][3]; GLfloat fRStart = optionGetSkydomeGradientStartColorRed () / MaxUShortFloat; GLfloat fGStart = optionGetSkydomeGradientStartColorGreen () / MaxUShortFloat; GLfloat fBStart = optionGetSkydomeGradientStartColorBlue () / MaxUShortFloat; GLfloat fREnd = optionGetSkydomeGradientEndColorRed () / MaxUShortFloat; GLfloat fGEnd = optionGetSkydomeGradientEndColorGreen () / MaxUShortFloat; GLfloat fBEnd = optionGetSkydomeGradientEndColorBlue () / MaxUShortFloat; GLfloat fRStep = (fREnd - fRStart) / 128.0f; GLfloat fGStep = (fGEnd - fGStart) / 128.0f; GLfloat fBStep = (fBStart - fBEnd) / 128.0f; GLfloat fR = fRStart; GLfloat fG = fGStart; GLfloat fB = fBStart; for (int iX = 127; iX >= 0; --iX) { fR += fRStep; fG += fGStep; fB -= fBStep; for (int iY = 0; iY < 128; ++iY) { aaafTextureData[iX][iY][0] = fR; aaafTextureData[iX][iY][1] = fG; aaafTextureData[iX][iY][2] = fB; } } mSkySize = CompSize (128, 128); mSky = GLTexture::imageDataToTexture ((char *) aaafTextureData, mSkySize, GL_RGB, GL_FLOAT); mSky[0]->setFilter (GL_LINEAR); mSky[0]->setWrap (GL_CLAMP_TO_EDGE); } } #ifndef USE_GLES static bool fillCircleTable (GLfloat **ppSint, GLfloat **ppCost, const int n) { const GLfloat angle = 2 * M_PI / (GLfloat) ((n == 0) ? 1 : n); const int size = abs (n); *ppSint = (GLfloat *) calloc (sizeof (GLfloat), size + 1); *ppCost = (GLfloat *) calloc (sizeof (GLfloat), size + 1); if (!(*ppSint) || !(*ppCost)) { free (*ppSint); free (*ppCost); return false; } (*ppSint)[0] = 0.0; (*ppCost)[0] = 1.0; for (int i = 1; i < size; ++i) { (*ppSint)[i] = sin (angle * i); (*ppCost)[i] = cos (angle * i); } (*ppSint)[size] = (*ppSint)[0]; (*ppCost)[size] = (*ppCost)[0]; return true; } #endif void PrivateCubeScreen::updateSkydomeList (GLfloat fRadius) { #ifndef USE_GLES GLint iSlices = 128; GLint iStacks = 64; GLfloat afTexCoordX[4]; GLfloat afTexCoordY[4]; GLfloat *sint1; GLfloat *cost1; GLfloat *sint2; GLfloat *cost2; GLfloat r; GLfloat x; GLfloat y; GLfloat z; int iStacksStart; int iStacksEnd; int iSlicesStart; int iSlicesEnd; if (optionGetSkydomeAnimated ()) { iStacksStart = 11; /* min. 0 */ iStacksEnd = 53; /* max. 64 */ iSlicesStart = 0; /* min. 0 */ iSlicesEnd = 128; /* max. 128 */ } else { iStacksStart = 21; /* min. 0 */ iStacksEnd = 43; /* max. 64 */ iSlicesStart = 21; /* min. 0 */ iSlicesEnd = 44; /* max. 128 */ } GLfloat fStepX = 1.0 / (GLfloat) (iSlicesEnd - iSlicesStart); GLfloat fStepY = 1.0 / (GLfloat) (iStacksEnd - iStacksStart); GLfloat oneMinusFStepX = 1.0f - fStepX; GLfloat oneMinusFStepY = 1.0f - fStepY; if (!mSky.size () || !fillCircleTable (&sint1, &cost1, -iSlices)) return; if (!fillCircleTable (&sint2, &cost2, iStacks * 2)) { free (sint1); free (cost1); return; } afTexCoordX[0] = 1.0f; afTexCoordY[0] = oneMinusFStepY; afTexCoordX[1] = oneMinusFStepX; afTexCoordY[1] = oneMinusFStepY; afTexCoordX[2] = oneMinusFStepX; afTexCoordY[2] = 1.0f; afTexCoordX[3] = 1.0f; afTexCoordY[3] = 1.0f; if (!mSkyListId) mSkyListId = glGenLists (1); glNewList (mSkyListId, GL_COMPILE); mSky[0]->enable (GLTexture::Good); GLfloat mSkyWidth = mSkySize.width (); GLfloat mSkyHeight = mSkySize.height (); glBegin (GL_QUADS); for (int i = iStacksStart; i < iStacksEnd; ++i) { afTexCoordX[0] = 1.0f; afTexCoordX[1] = oneMinusFStepX; afTexCoordX[2] = oneMinusFStepX; afTexCoordX[3] = 1.0f; for (int j = iSlicesStart; j < iSlicesEnd; ++j) { /* bottom-right */ z = cost2[i]; r = sint2[i]; x = cost1[j]; y = sint1[j]; glTexCoord2f ( COMP_TEX_COORD_X (mSky[0]->matrix (), afTexCoordX[3] * mSkyWidth), COMP_TEX_COORD_Y (mSky[0]->matrix (), afTexCoordY[3] * mSkyHeight)); glVertex3f (x * r * fRadius, y * r * fRadius, z * fRadius); /* top-right */ z = cost2[i + 1]; r = sint2[i + 1]; x = cost1[j]; y = sint1[j]; glTexCoord2f ( COMP_TEX_COORD_X (mSky[0]->matrix (), afTexCoordX[0] * mSkyWidth), COMP_TEX_COORD_Y (mSky[0]->matrix (), afTexCoordY[0] * mSkyHeight)); glVertex3f (x * r * fRadius, y * r * fRadius, z * fRadius); /* top-left */ z = cost2[i + 1]; r = sint2[i + 1]; x = cost1[j + 1]; y = sint1[j + 1]; glTexCoord2f ( COMP_TEX_COORD_X (mSky[0]->matrix (), afTexCoordX[1] * mSkyWidth), COMP_TEX_COORD_Y (mSky[0]->matrix (), afTexCoordY[1] * mSkyHeight)); glVertex3f (x * r * fRadius, y * r * fRadius, z * fRadius); /* bottom-left */ z = cost2[i]; r = sint2[i]; x = cost1[j + 1]; y = sint1[j + 1]; glTexCoord2f ( COMP_TEX_COORD_X (mSky[0]->matrix (), afTexCoordX[2] * mSkyWidth), COMP_TEX_COORD_Y (mSky[0]->matrix (), afTexCoordY[2] * mSkyHeight)); glVertex3f (x * r * fRadius, y * r * fRadius, z * fRadius); afTexCoordX[0] -= fStepX; afTexCoordX[1] -= fStepX; afTexCoordX[2] -= fStepX; afTexCoordX[3] -= fStepX; } afTexCoordY[0] -= fStepY; afTexCoordY[1] -= fStepY; afTexCoordY[2] -= fStepY; afTexCoordY[3] -= fStepY; } glEnd (); mSky[0]->disable (); glEndList (); free (sint1); free (cost1); free (sint2); free (cost2); #endif } bool PrivateCubeScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = CubeOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case CubeOptions::In: rv = updateGeometry (screen->vpSize ().width (), value.b () ? -1 : 1); break; case CubeOptions::Skydome: case CubeOptions::SkydomeImage: case CubeOptions::SkydomeAnimated: case CubeOptions::SkydomeGradientStartColor: case CubeOptions::SkydomeGradientEndColor: updateSkydomeTexture (); updateSkydomeList (1.0f); cScreen->damageScreen (); break; case CubeOptions::MultioutputMode: updateOutputs (); updateGeometry (screen->vpSize ().width (), mInvert); cScreen->damageScreen (); break; default: break; } return rv; } bool PrivateCubeScreen::adjustVelocity () { float unfold; if (mUnfolded) unfold = 1.0f - mUnfold; else unfold = 0.0f - mUnfold; float adjust = unfold * 0.02f * optionGetAcceleration (); float amount = fabs (unfold); if (amount < 1.0f) amount = 1.0f; else if (amount > 3.0f) amount = 3.0f; mUnfoldVelocity = (amount * mUnfoldVelocity + adjust) / (amount + 2.0f); return (fabs (unfold) < 0.002f && fabs (mUnfoldVelocity) < 0.01f); } void PrivateCubeScreen::preparePaint (int msSinceLastPaint) { int opt; float x, progress; unsigned short *topColor, *bottomColor; if (mGrabIndex) { float amount = msSinceLastPaint * 0.2f * optionGetSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; while (steps--) { mUnfold += mUnfoldVelocity * chunk; if (mUnfold > 1.0f) mUnfold = 1.0f; if (adjustVelocity ()) { if (mUnfold < 0.5f) { if (mGrabIndex) { screen->removeGrab (mGrabIndex, NULL); mGrabIndex = 0; } mUnfold = 0.0f; } break; } } } memset (mCleared, 0, sizeof (Bool) * screen->outputDevs ().size ()); memset (mCapsPainted, 0, sizeof (Bool) * screen->outputDevs ().size ()); /* Transparency handling */ if (mRotationState == CubeScreen::RotationManual || (mRotationState == CubeScreen::RotationChange && !optionGetTransparentManualOnly ())) opt = mLastOpacityIndex = CubeOptions::ActiveOpacity; else if (mRotationState == CubeScreen::RotationChange) opt = mLastOpacityIndex = CubeOptions::InactiveOpacity; else opt = CubeOptions::InactiveOpacity; mToOpacity = (mOptions[opt].value ().f () / 100.0f) * OPAQUE; cubeScreen->cubeGetRotation (x, x, progress); if (mDesktopOpacity != mToOpacity || (progress > 0.0 && progress < 1.0)) { float inactiveOpacity = optionGetInactiveOpacity (); mDesktopOpacity = (inactiveOpacity - ((inactiveOpacity - mOptions[mLastOpacityIndex].value ().f ()) * progress)) / 100.0f * OPAQUE; } topColor = optionGetTopColor (); bottomColor = optionGetBottomColor (); mPaintAllViewports = (mDesktopOpacity != OPAQUE || topColor[3] != OPAQUE || bottomColor[3] != OPAQUE); cScreen->preparePaint (msSinceLastPaint); } void PrivateCubeScreen::paint (CompOutput::ptrList &outputs, unsigned int mask) { float x, progress; cubeScreen->cubeGetRotation (x, x, progress); if (optionGetMultioutputMode () == MultioutputModeOneBigCube && screen->outputDevs ().size () && (progress > 0.0f || mDesktopOpacity != OPAQUE)) { outputs.clear (); outputs.push_back (&screen->fullscreenOutput ()); } cScreen->paint (outputs, mask); } bool PrivateCubeScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (mGrabIndex || mDesktopOpacity != OPAQUE) { mask &= ~PAINT_SCREEN_REGION_MASK; mask |= PAINT_SCREEN_TRANSFORMED_MASK; } mSrcOutput = ((unsigned int) output->id () != (unsigned int) ~0) ? output->id () : 0; /* Always use BTF painting on non-transformed screen */ mPaintOrder = BTF; return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } void PrivateCubeScreen::donePaint () { if (mGrabIndex || mDesktopOpacity != mToOpacity) cScreen->damageScreen (); cScreen->donePaint (); } bool CubeScreen::cubeCheckOrientation (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, std::vector &points) { WRAPABLE_HND_FUNCTN_RETURN (bool, cubeCheckOrientation, sAttrib, transform, output, points) GLMatrix pm (priv->gScreen->projectionMatrix ()->getMatrix ()); GLMatrix sTransform = transform; bool rv = false; priv->gScreen->glApplyTransform (sAttrib, output, &sTransform); sTransform.translate (priv->mOutputXOffset, -priv->mOutputYOffset, 0.0f); sTransform.scale (priv->mOutputXScale, priv->mOutputYScale, 1.0f); GLMatrix mvp = pm * sTransform; GLVector pntA = mvp * points[0]; if (pntA[3] < 0.0f) rv = !rv; pntA.homogenize (); GLVector pntB = mvp * points[1]; if (pntB[3] < 0.0f) rv = !rv; pntB.homogenize (); GLVector pntC = mvp * points[2]; pntC.homogenize (); GLVector vecA = pntC - pntA; GLVector vecB = pntC - pntB; GLVector ortho = vecA ^ vecB; if (ortho[2] > 0.0f) rv = !rv; return rv; } bool CubeScreen::cubeShouldPaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, PaintOrder order) { WRAPABLE_HND_FUNCTN_RETURN (bool, cubeShouldPaintViewport, sAttrib, transform, output, order) float pointZ = priv->mInvert * priv->mDistance; std::vector vPoints; vPoints.push_back (GLVector (-0.5, 0.0, pointZ, 1.0)); vPoints.push_back (GLVector (0.0, 0.5, pointZ, 1.0)); vPoints.push_back (GLVector ( 0.0, 0.0, pointZ, 1.0)); bool ftb = cubeCheckOrientation (sAttrib, transform, output, vPoints); return (order == FTB && ftb) || (order == BTF && !ftb); } void PrivateCubeScreen::moveViewportAndPaint (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *outputPtr, unsigned int mask, PaintOrder paintOrder, int dx) { if (!cubeScreen->cubeShouldPaintViewport (sAttrib, transform, outputPtr, paintOrder)) return; int output = ((unsigned int) outputPtr->id () != (unsigned int) ~0) ? outputPtr->id () : 0; mPaintOrder = paintOrder; if (mNOutput > 1) { /* translate to cube output */ int cubeOutput = mOutputMask[output]; /* convert from window movement to viewport movement */ int dView = -dx; cubeOutput += dView; dView = cubeOutput / mNOutput; cubeOutput = cubeOutput % mNOutput; if (cubeOutput < 0) { cubeOutput += mNOutput; --dView; } /* translate back to compiz output */ output = mSrcOutput = mOutput[cubeOutput]; cScreen->setWindowPaintOffset (-dView * screen->width (), 0); CompRegion reg (screen->outputDevs () [output]); cubeScreen->cubePaintViewport (sAttrib, transform, reg, &screen->outputDevs () [output], mask); cScreen->setWindowPaintOffset (0, 0); } else { CompRegion region; cScreen->setWindowPaintOffset (dx * screen->width (), 0); if (optionGetMultioutputMode () == MultioutputModeMultipleCubes) region = CompRegion (*outputPtr); else region = screen->region (); cubeScreen->cubePaintViewport (sAttrib, transform, region, outputPtr, mask); cScreen->setWindowPaintOffset (0, 0); } } void PrivateCubeScreen::paintAllViewports (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *outputPtr, unsigned int mask, int xMove, float size, int hsize, PaintOrder paintOrder) { GLScreenPaintAttrib sa = sAttrib; int origXMoveAdd = 0; // dx for the viewport we start painting with (back-most). int iFirstSign; /* 1 if we do xMove += i first and -1 if we do xMove -= i first. */ float halfHsize = hsize / 2.0; if (mInvert == 1) { /* xMove ==> dx for the viewport which is the nearest to the viewer in z axis. xMove +/- hsize / 2 ==> dx for the viewport which is the farthest to the viewer in z axis. */ if ((sa.xRotate < 0.0f && hsize % 2 == 1) || (sa.xRotate > 0.0f && hsize % 2 == 0)) { origXMoveAdd = halfHsize; iFirstSign = 1; } else { origXMoveAdd = -halfHsize; iFirstSign = -1; } } else { /* xMove is already the dx for farthest viewport. */ if (sa.xRotate > 0.0f) iFirstSign = -1; else iFirstSign = 1; } int xMoveAdd; float tsSize = 360.0f / size; for (int i = 0; i <= halfHsize; ++i) { /* move to the correct viewport (back to front). */ xMoveAdd = origXMoveAdd; /* move to farthest viewport. */ xMoveAdd += iFirstSign * i; /* move i more viewports to the right / left. */ /* Needed especially for unfold. We paint the viewports around xMove viewport. Adding or subtracting hsize from xMove has no effect on what viewport we paint, but can make shorter paths. */ if (xMoveAdd < -halfHsize) xMoveAdd += hsize; else if (xMoveAdd > halfHsize) xMoveAdd -= hsize; /* Paint the viewport. */ xMove += xMoveAdd; sa.yRotate -= mInvert * xMoveAdd * tsSize; moveViewportAndPaint (sa, transform, outputPtr, mask, paintOrder, xMove); sa.yRotate += mInvert * xMoveAdd * tsSize; xMove -= xMoveAdd; /* do the same for an equally far viewport. */ if (i == 0 || i * 2 == hsize) continue; xMoveAdd = origXMoveAdd; /* move to farthest viewport. */ xMoveAdd -= iFirstSign * i; /* move i more viewports to the left / right (opposite side from the one chosen first) */ if (xMoveAdd < -halfHsize) xMoveAdd += hsize; else if (xMoveAdd > halfHsize) xMoveAdd -= hsize; xMove += xMoveAdd; sa.yRotate -= mInvert * xMoveAdd * tsSize; moveViewportAndPaint (sa, transform, outputPtr, mask, paintOrder, xMove); sa.yRotate += mInvert * xMoveAdd * tsSize; xMove -= xMoveAdd; } } void CubeScreen::cubeGetRotation (float &x, float &v, float &progress) { WRAPABLE_HND_FUNCTN (cubeGetRotation, x, v, progress) x = 0.0f; v = 0.0f; progress = 0.0f; } void CubeScreen::cubeClearTargetOutput (float xRotate, float vRotate) { WRAPABLE_HND_FUNCTN (cubeClearTargetOutput, xRotate, vRotate) if (!priv->mSky.empty ()) { priv->gScreen->setLighting (false); #ifndef USE_GLES glPushMatrix (); if (priv->optionGetSkydomeAnimated () && priv->mGrabIndex == 0) { glRotatef (vRotate / 5.0f + 90.0f, 1.0f, 0.0f, 0.0f); glRotatef (xRotate, 0.0f, 0.0f, -1.0f); } else glRotatef (90.0f, 1.0f, 0.0f, 0.0f); glCallList (priv->mSkyListId); glPopMatrix (); #endif } else priv->gScreen->clearTargetOutput (GL_COLOR_BUFFER_BIT); } void CubeScreen::cubePaintTop (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) { WRAPABLE_HND_FUNCTN (cubePaintTop, sAttrib, transform, output, size, normal) GLScreenPaintAttrib sa = sAttrib; GLMatrix sTransform = transform; GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); priv->gScreen->setLighting (true); unsigned short *color = priv->optionGetTopColor (); int opacity = priv->mDesktopOpacity * color[3] / 0xffff; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); std::vector colorData; colorData.push_back (color[0] * opacity / 0xffff); colorData.push_back (color[1] * opacity / 0xffff); colorData.push_back (color[2] * opacity / 0xffff); colorData.push_back (opacity); sa.yRotate += (360.0f / size) * (priv->mXRotations + 1); priv->gScreen->glApplyTransform (sa, output, &sTransform); sTransform.translate (priv->mOutputXOffset, -priv->mOutputYOffset, 0.0f); sTransform.scale (priv->mOutputXScale, priv->mOutputYScale, 1.0f); if ((priv->mDesktopOpacity != OPAQUE) || (color[3] != OPAQUE)) { #ifndef USE_GLES priv->gScreen->setTexEnvMode (GL_MODULATE); #endif // just enable blending if it is disabled if (!glBlendEnabled) glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } bool withTexture = priv->mInvert == 1 && size == 4 && priv->mTexture.size (); if (withTexture) priv->mTexture[0]->enable (GLTexture::Good); streamingBuffer->begin (GL_TRIANGLE_FAN); streamingBuffer->addColors (1, &(colorData[0])); streamingBuffer->addVertices (priv->mNVertices >> 1, priv->mVertices); streamingBuffer->addNormals (1, const_cast (&normal[0])); if (withTexture) streamingBuffer->addTexCoords (0, 2, priv->mTc); streamingBuffer->end (); streamingBuffer->render (sTransform); if (withTexture) priv->mTexture[0]->disable (); priv->gScreen->setTexEnvMode (GL_REPLACE); // just disable blending if it was disabled before if (!glBlendEnabled) glDisable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } void CubeScreen::cubePaintBottom (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) { WRAPABLE_HND_FUNCTN (cubePaintBottom, sAttrib, transform, output, size, normal) GLScreenPaintAttrib sa = sAttrib; GLMatrix sTransform = transform; GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); priv->gScreen->setLighting (true); unsigned short *color = priv->optionGetBottomColor (); int opacity = priv->mDesktopOpacity * color[3] / 0xffff; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); std::vector colorData; colorData.push_back (color[0] * opacity / 0xffff); colorData.push_back (color[1] * opacity / 0xffff); colorData.push_back (color[2] * opacity / 0xffff); colorData.push_back (opacity); sa.yRotate += (360.0f / size) * (priv->mXRotations + 1); priv->gScreen->glApplyTransform (sa, output, &sTransform); sTransform.translate (priv->mOutputXOffset, -priv->mOutputYOffset, 0.0f); sTransform.scale (priv->mOutputXScale, priv->mOutputYScale, 1.0f); if ((priv->mDesktopOpacity != OPAQUE) || (color[3] != OPAQUE)) { #ifndef USE_GLES priv->gScreen->setTexEnvMode (GL_MODULATE); #endif // just enable blending if it is disabled if (!glBlendEnabled) glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } streamingBuffer->begin (GL_TRIANGLE_FAN); streamingBuffer->addColors (1, &(colorData[0])); streamingBuffer->addVertices (priv->mNVertices, priv->mVertices); streamingBuffer->addNormals (1, const_cast (&normal[0])); streamingBuffer->setVertexOffset (priv->mNVertices >> 1); streamingBuffer->setMaxVertices (priv->mNVertices >> 1); streamingBuffer->end (); streamingBuffer->render (sTransform); priv->gScreen->setTexEnvMode (GL_REPLACE); // just disable blending if it was disabled before if (!glBlendEnabled) glDisable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } void CubeScreen::cubePaintInside (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) { WRAPABLE_HND_FUNCTN (cubePaintInside, sAttrib, transform, output, size, normal) } void PrivateCubeScreen::glEnableOutputClipping (const GLMatrix &transform, const CompRegion ®ion, CompOutput *output) { if (mRotationState != CubeScreen::RotationNone) { /* FIXME: No output clipping in OpenGL|ES yet */ #ifndef USE_GLES glPushMatrix (); glLoadMatrixf (transform.getMatrix ()); glTranslatef (mOutputXOffset, -mOutputYOffset, 0.0f); glScalef (mOutputXScale, mOutputYScale, 1.0f); GLdouble mDist2 = 0.5 / mDistance; if (mInvert == 1) { GLdouble clipPlane0[] = { 1.0, 0.0, mDist2, 0.0 }; GLdouble clipPlane1[] = { -1.0, 0.0, mDist2, 0.0 }; GLdouble clipPlane2[] = { 0.0, -1.0, mDist2, 0.0 }; GLdouble clipPlane3[] = { 0.0, 1.0, mDist2, 0.0 }; glClipPlane (GL_CLIP_PLANE0, clipPlane0); glClipPlane (GL_CLIP_PLANE1, clipPlane1); glClipPlane (GL_CLIP_PLANE2, clipPlane2); glClipPlane (GL_CLIP_PLANE3, clipPlane3); } else { GLdouble clipPlane0[] = { -1.0, 0.0, -mDist2, 0.0 }; GLdouble clipPlane1[] = { 1.0, 0.0, -mDist2, 0.0 }; GLdouble clipPlane2[] = { 0.0, 1.0, -mDist2, 0.0 }; GLdouble clipPlane3[] = { 0.0, -1.0, -mDist2, 0.0 }; glClipPlane (GL_CLIP_PLANE0, clipPlane0); glClipPlane (GL_CLIP_PLANE1, clipPlane1); glClipPlane (GL_CLIP_PLANE2, clipPlane2); glClipPlane (GL_CLIP_PLANE3, clipPlane3); } glEnable (GL_CLIP_PLANE0); glEnable (GL_CLIP_PLANE1); glEnable (GL_CLIP_PLANE2); glEnable (GL_CLIP_PLANE3); glPopMatrix (); #endif } else gScreen->glEnableOutputClipping (transform, region, output); } void CubeScreen::cubePaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { WRAPABLE_HND_FUNCTN (cubePaintViewport, sAttrib, transform, region, output, mask) priv->gScreen->glPaintTransformedOutput (sAttrib, transform, region, output, mask); } void PrivateCubeScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *outputPtr, unsigned int mask) { int output = ((unsigned int) outputPtr->id () != (unsigned int) ~0) ? outputPtr->id () : 0; mReversedWindowList = cScreen->getWindowPaintList (); mReversedWindowList.reverse (); if ((((unsigned int) outputPtr->id () != (unsigned int) ~0) && mRecalcOutput) || (((unsigned int) outputPtr->id () == (unsigned int) ~0) && !mRecalcOutput && mNOutput > 1)) { mRecalcOutput = ((unsigned int) outputPtr->id () == (unsigned int) ~0); mNOutput = 1; updateGeometry (screen->vpSize ().width (), mInvert); } int cullNorm; glGetIntegerv (GL_CULL_FACE_MODE, &cullNorm); int cullInv = (cullNorm == GL_BACK)? GL_FRONT : GL_BACK; bool wasCulled = glIsEnabled (GL_CULL_FACE); if (!mFullscreenOutput) { float outputWidth = outputPtr->width (); float outputHeight = outputPtr->height (); mOutputXScale = (float) screen->width () / outputWidth; mOutputYScale = (float) screen->height () / outputHeight; mOutputXOffset = (screen->width () / 2.0f - (outputPtr->x1 () + outputPtr->x2 ()) / 2.0f) / outputWidth; mOutputYOffset = (screen->height () / 2.0f - (outputPtr->y1 () + outputPtr->y2 ()) / 2.0f) / outputHeight; } else { mOutputXScale = 1.0f; mOutputYScale = 1.0f; mOutputXOffset = 0.0f; mOutputYOffset = 0.0f; } float xRotate, vRotate, progress; cubeScreen->cubeGetRotation (xRotate, vRotate, progress); GLScreenPaintAttrib sa = sAttrib; sa.xRotate += xRotate; sa.vRotate += vRotate; if (!mCleared[output]) { float rRotate = xRotate - ((screen->vp ().x () * 360.0f) / screen->vpSize ().width ()); cubeScreen->cubeClearTargetOutput (rRotate, vRotate); mCleared[output] = true; } mask &= ~PAINT_SCREEN_CLEAR_MASK; int hsize = screen->vpSize ().width () * mNOutput; float size = hsize; if (mGrabIndex) { sa.vRotate = 0.0f; size += mUnfold * 8.0f; size += powf (mUnfold, 6) * 64.0; size += powf (mUnfold, 16) * 8192.0; sa.zTranslate = -mInvert * (0.5f / tanf (M_PI / size)); /* Distance we move the camera back when unfolding the cube. TODO: Currently hardcoded to 1.5, make this configurable via CCSM. */ sa.zCamera -= mUnfold * 1.5f; } else { if (vRotate > 100.0f) sa.vRotate = 100.0f; else if (vRotate < -100.0f) sa.vRotate = -100.0f; else sa.vRotate = vRotate; sa.zTranslate = -mInvert * mDistance; } if (sa.xRotate > 0.0f) mXRotations = (int) (hsize * sa.xRotate + 180.0f) / 360.0f; else mXRotations = (int) (hsize * sa.xRotate - 180.0f) / 360.0f; sa.xRotate -= (360.0f * mXRotations) / hsize; sa.xRotate *= mInvert; sa.xRotate = sa.xRotate / size * hsize; GLenum oldFilter = gScreen->textureFilter (); if (mGrabIndex && optionGetMipmap ()) gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); PaintOrder paintOrder; if (mInvert == 1) { /* Outside cube - start with FTB faces */ paintOrder = FTB; glCullFace (cullInv); } else /* Inside cube - start with BTF faces */ paintOrder = BTF; if (mInvert == -1 || cubeScreen->cubeShouldPaintAllViewports ()) paintAllViewports (sa, transform, region, outputPtr, mask, mXRotations, size, hsize, paintOrder); glCullFace (cullNorm); if (wasCulled && cubeScreen->cubeShouldPaintAllViewports ()) glDisable (GL_CULL_FACE); bool paintCaps = !mGrabIndex && hsize > 2 && !mCapsPainted[output] && (mInvert != 1 || mDesktopOpacity != OPAQUE || cubeScreen->cubeShouldPaintAllViewports () || sa.vRotate != 0.0f || sa.yTranslate != 0.0f); if (paintCaps) { std::vector top; top.push_back (GLVector (0.5, 0.5, 0.0, 1.0)); top.push_back (GLVector (0.0, 0.5, -0.5, 1.0)); top.push_back (GLVector (0.0, 0.5, 0.0, 1.0)); std::vector bottom; bottom.push_back (GLVector (0.5, -0.5, 0.0, 1.0)); bottom.push_back (GLVector (0.0, -0.5, -0.5, 1.0)); bottom.push_back (GLVector (0.0, -0.5, 0.0, 1.0)); bool topDir = cubeScreen->cubeCheckOrientation (sa, transform, outputPtr, top); bool bottomDir = cubeScreen->cubeCheckOrientation (sa, transform, outputPtr, bottom); mCapsPainted[output] = true; bool allCaps = cubeScreen->cubeShouldPaintAllViewports () || mInvert != 1; if (topDir && bottomDir) { if (allCaps) { cubeScreen->cubePaintBottom (sa, transform, outputPtr, hsize, GLVector (0.0f, -1.0f, 0.0f, 1.0f)); cubeScreen->cubePaintInside (sa, transform, outputPtr, hsize, GLVector (0.0f, 0.0f, -1.0f, 1.0f)); } cubeScreen->cubePaintTop (sa, transform, outputPtr, hsize, GLVector (0.0f, -1.0f, 0.0f, 1.0f)); } else if (!topDir && !bottomDir) { if (allCaps) { cubeScreen->cubePaintTop (sa, transform, outputPtr, hsize, GLVector (0.0f, 1.0f, 0.0f, 1.0f)); cubeScreen->cubePaintInside (sa, transform, outputPtr, hsize, GLVector (0.0f, 0.0f, -1.0f, 1.0f)); } cubeScreen->cubePaintBottom (sa, transform, outputPtr, hsize, GLVector (0.0f, -1.0f, 0.0f, 1.0f)); } else if (allCaps) { cubeScreen->cubePaintTop (sa, transform, outputPtr, hsize, GLVector (0.0f, 1.0f, 0.0f, 1.0f)); cubeScreen->cubePaintBottom (sa, transform, outputPtr, hsize, GLVector (0.0f, -1.0f, 0.0f, 1.0f)); cubeScreen->cubePaintInside (sa, transform, outputPtr, hsize, GLVector (0.0f, 0.0f, -1.0f, 1.0f)); } } if (wasCulled) glEnable (GL_CULL_FACE); if (mInvert == 1) /* Outside cube - continue with BTF faces */ paintOrder = BTF; else { /* Inside cube - continue with FTB faces */ paintOrder = FTB; glCullFace (cullInv); } if (mInvert == 1 || cubeScreen->cubeShouldPaintAllViewports ()) paintAllViewports (sa, transform, region, outputPtr, mask, mXRotations, size, hsize, paintOrder); glCullFace (cullNorm); gScreen->setTextureFilter (oldFilter); } bool PrivateCubeWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if ((window->type () & CompWindowTypeDesktopMask) && (attrib.opacity != cubeScreen->priv->mDesktopOpacity)) { GLWindowPaintAttrib wAttrib = attrib; wAttrib.opacity = cubeScreen->priv->mDesktopOpacity; return gWindow->glPaint (wAttrib, transform, region, mask); } else return gWindow->glPaint (attrib, transform, region, mask); } const CompWindowList & PrivateCubeScreen::getWindowPaintList () { if (mPaintOrder == FTB) return mReversedWindowList; else return cScreen->getWindowPaintList (); } void PrivateCubeScreen::glApplyTransform (const GLScreenPaintAttrib &sAttrib, CompOutput *output, GLMatrix *transform) { transform->translate (mOutputXOffset, -mOutputYOffset, 0.0f); transform->scale (mOutputXScale, mOutputYScale, 1.0f); gScreen->glApplyTransform (sAttrib, output, transform); transform->scale (1.0f / mOutputXScale, 1.0 / mOutputYScale, 1.0f); transform->translate (-mOutputXOffset, mOutputYOffset, 0.0f); } bool PrivateCubeScreen::unfold (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root"); if (::screen->root () == xid) { CUBE_SCREEN (screen); if (screen->vpSize ().width () * cs->priv->mNOutput < 4 || screen->otherGrabExist ("rotate", "switcher", "cube", NULL)) return false; if (!cs->priv->mGrabIndex) cs->priv->mGrabIndex = screen->pushGrab (screen->invisibleCursor (), "cube"); if (cs->priv->mGrabIndex) { cs->priv->mUnfolded = true; cs->priv->cScreen->damageScreen (); } if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); } return false; } bool PrivateCubeScreen::fold (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root"); if (!xid || ::screen->root () == xid) { CUBE_SCREEN (screen); if (cs->priv->mGrabIndex) { cs->priv->mUnfolded = false; cs->priv->cScreen->damageScreen (); } } action->setState (action->state () & ~(CompAction::StateTermButton | CompAction::StateTermKey)); return false; } void PrivateCubeScreen::outputChangeNotify () { updateOutputs (); updateGeometry (screen->vpSize ().width (), mInvert); screen->outputChangeNotify (); } bool PrivateCubeScreen::setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &v) { bool status = screen->setOptionForPlugin (plugin, name, v); if (status && strcmp (plugin, "core") == 0 && strcmp (name, "hsize") == 0) updateGeometry (screen->vpSize ().width (), mInvert); return status; } PrivateCubeScreen::PrivateCubeScreen (CompScreen *s) : cScreen (CompositeScreen::get (s)), gScreen (GLScreen::get (s)), cubeScreen (CubeScreen::get (s)), mInvert (1), mXRotations (0), mPaintOrder (BTF), mRotationState (CubeScreen::RotationNone), mPaintAllViewports (false), mDistance (0.0f), mTc (), mGrabIndex (0), mSrcOutput (0), mUnfolded (false), mUnfold (0.0f), mUnfoldVelocity (0.0f), mVertices (NULL), mNVertices (0), mSkyListId (0), mPw (0), mPh (0), mSkySize (0, 0), mTexture (0), mSky (0), mImgCurFile (0), mNOutput (1), mOutput (), mOutputMask (), mCleared (), mCapsPainted (), mFullscreenOutput (true), mOutputXScale (1.0f), mOutputYScale (1.0f), mOutputXOffset (0.0f), mOutputYOffset (0.0f), mDesktopOpacity (OPAQUE), mToOpacity (OPAQUE), mLastOpacityIndex (CubeOptions::InactiveOpacity), mRecalcOutput (false), mReversedWindowList (0) { for (int i = 0; i < 8; ++i) mTc[i] = 0.0f; memset (mCleared, 0, sizeof (mCleared)); updateOutputs (); updateGeometry (screen->vpSize ().width (), mInvert); optionSetUnfoldKeyInitiate (PrivateCubeScreen::unfold); optionSetUnfoldKeyTerminate (PrivateCubeScreen::fold); ScreenInterface::setHandler (s); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); } PrivateCubeScreen::~PrivateCubeScreen () { if (mVertices) free (mVertices); #ifndef USE_GLES if (mSkyListId) glDeleteLists (mSkyListId, 1); #endif } template class PluginClassHandler; PrivateCubeWindow::PrivateCubeWindow (CompWindow *w) : PluginClassHandler (w), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), cubeScreen (CubeScreen::get (screen)) { GLWindowInterface::setHandler (gWindow, true); } PrivateCubeWindow::~PrivateCubeWindow () { } template class PluginClassHandler; CubeScreen::CubeScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateCubeScreen (s)) { } CubeScreen::~CubeScreen () { delete priv; } CompOption::Vector & CubeScreen::getOptions () { return priv->getOptions (); } bool CubeScreen::setOption (const CompString &name, CompOption::Value &value) { return priv->setOption (name, value); } bool CubePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) { CompPrivate p; p.uval = COMPIZ_CUBE_ABI; screen->storeValue ("cube_ABI", p); return true; } return false; } void CubePluginVTable::fini () { screen->eraseValue ("cube_ABI"); } compiz-0.9.11+14.04.20140409/plugins/cube/include/0000755000015301777760000000000012321344021021516 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/cube/include/cube/0000755000015301777760000000000012321344021022434 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/cube/include/cube/cube.h0000644000015301777760000001361412321343002023526 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_CUBE_H #define _COMPIZ_CUBE_H #include #include #include #include #include #include #include #define COMPIZ_CUBE_ABI 2 typedef enum { BTF = 0, FTB } PaintOrder; class CubeScreen; class PrivateCubeScreen; class CubeScreenInterface : public WrapableInterface { public: /** * Hookable function to get the current state of rotation * * @param x X rotation * @param v Y Rotation * @param progress */ virtual void cubeGetRotation (float &x, float &v, float &progress); virtual void cubeClearTargetOutput (float xRotate, float vRotate); virtual void cubePaintTop (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal); virtual void cubePaintBottom (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal); virtual void cubePaintInside (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal); virtual bool cubeCheckOrientation (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, std::vector &points); virtual void cubePaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); virtual bool cubeShouldPaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, PaintOrder order); virtual bool cubeShouldPaintAllViewports (); }; extern template class PluginClassHandler; class CubeScreen : public WrapableHandler, public PluginClassHandler, public CompOption::Class { public: typedef enum { RotationNone = 0, RotationChange, RotationManual } RotationState; typedef enum { Automatic = 0, MultipleCubes, OneBigCube } MultioutputMode; CubeScreen (CompScreen *s); ~CubeScreen (); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); WRAPABLE_HND (0, CubeScreenInterface, void, cubeGetRotation, float &, float&, float&); WRAPABLE_HND (1, CubeScreenInterface, void, cubeClearTargetOutput, float, float); WRAPABLE_HND (2, CubeScreenInterface, void, cubePaintTop, const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, int, const GLVector &); WRAPABLE_HND (3, CubeScreenInterface, void, cubePaintBottom, const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, int, const GLVector &); WRAPABLE_HND (4, CubeScreenInterface, void, cubePaintInside, const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, int, const GLVector &); WRAPABLE_HND (5, CubeScreenInterface, bool, cubeCheckOrientation, const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, std::vector &); WRAPABLE_HND (6, CubeScreenInterface, void, cubePaintViewport, const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); WRAPABLE_HND (7, CubeScreenInterface, bool, cubeShouldPaintViewport, const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, PaintOrder); WRAPABLE_HND (8, CubeScreenInterface, bool, cubeShouldPaintAllViewports); int invert () const; unsigned short* topColor () const; unsigned short* bottomColor () const; bool unfolded () const; RotationState rotationState () const; void rotationState (RotationState state); int xRotations () const; int nOutput () const; float outputXScale () const; float outputYScale () const; float outputXOffset () const; float outputYOffset () const; float distance () const; float desktopOpacity () const; MultioutputMode multioutputMode () const; int sourceOutput () const; PaintOrder paintOrder () const; void repaintCaps (); friend class PrivateCubeWindow; friend class PrivateCubeScreen; private: PrivateCubeScreen *priv; }; #define CUBE_SCREEN(s) \ CubeScreen *cs = CubeScreen::get (s) #endif compiz-0.9.11+14.04.20140409/plugins/trailfocus/0000755000015301777760000000000012321344021021330 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/trailfocus/trailfocus.xml.in0000644000015301777760000000704012321343002024631 0ustar pbusernogroup00000000000000 <_short>Trailfocus <_long>Adjust the opacity, saturation and brightness of windows based on when they last had focus. Effects opengl composite opengl fade decor <_short>Behaviour <_short>Appearance <_short>Opacity <_short>Brightness <_short>Saturation compiz-0.9.11+14.04.20140409/plugins/trailfocus/CMakeLists.txt0000644000015301777760000000015712321343002024071 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (trailfocus PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/trailfocus/src/0000755000015301777760000000000012321344021022117 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/trailfocus/src/trailfocus.cpp0000644000015301777760000002447212321343002025005 0ustar pbusernogroup00000000000000/** * Beryl Trailfocus - take three * * Copyright (c) 2006 Kristian Lyngstøl * Ported to Compiz and BCOP usage by Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This version is completly rewritten from scratch with opacify as a * basic template. The original trailfocus was written by: * François Ingelrest and rewritten by: * Dennis Kasprzyk * * * Trailfocus modifies the opacity, brightness and saturation on a window * based on when it last had focus. * */ #include "trailfocus.h" #include COMPIZ_PLUGIN_20090315 (trailfocus, TrailfocusPluginVTable); /* Determines if a window should be handled by trailfocus or not */ bool TrailfocusScreen::isTrailfocusWindow (CompWindow *w) { CompRect input (w->inputRect ()); if (input.left () >= (int) screen->width () || input.right () <= 0 || input.top () >= (int) screen->height () || input.bottom () <= 0) { return false; } if (w->overrideRedirect ()) return false; if (w->destroyed () || !w->mapNum () || w->minimized () || w->shaded ()) return false; if (!optionGetWindowMatch ().evaluate (w)) return false; return true; } /* Walks through the window-list and sets the opacity-levels for * all windows. The inner loop will result in ts->win[i] either * representing a recently focused window, or the least * focused window. */ void TrailfocusScreen::setWindows (TrailfocusWindow *removedWindow) { bool wasTfWindow; foreach (CompWindow *w, screen->windows ()) { TrailfocusWindow *tw = TrailfocusWindow::get (w); bool needDamage; if (removedWindow == tw) continue; wasTfWindow = tw->isTfWindow; tw->isTfWindow = isTrailfocusWindow (w); needDamage = wasTfWindow != tw->isTfWindow; if (tw->isTfWindow) { unsigned int i; for (i = 0; i < windows.size (); i++) if (windows[i] == tw) break; if (memcmp (&tw->attribs, &attribs[i], sizeof (TfAttribs)) != 0) needDamage = true; if (!wasTfWindow && tw->gWindow) tw->gWindow->glPaintSetEnabled (tw, true); tw->attribs = attribs[i]; } else if (wasTfWindow && tw->gWindow) { tw->gWindow->glPaintSetEnabled (tw, false); } if (needDamage && tw->cWindow) tw->cWindow->addDamage (); } } /* Push a new window-id on the trailfocus window-stack (not to be * confused with the real window stack). Only keep one copy of a * window on the stack. If the window allready exist on the stack, * move it to the top. */ bool TrailfocusScreen::pushWindow (Window id) { CompWindow *w; TfWindowList::iterator iter; w = screen->findWindow (id); if (!w) return false; if (!isTrailfocusWindow (w)) return false; for (iter = windows.begin (); iter != windows.end (); ++iter) if ((*iter)->window->id () == id) break; if (iter == windows.begin ()) return false; if (iter != windows.end ()) windows.erase (iter); windows.insert (windows.begin (), TrailfocusWindow::get (w)); if ((int) windows.size () > optionGetWindowsCount ()) windows.pop_back (); return true; } /* Pop a window-id from the trailfocus window-stack (not to be * confused with the real window stack). Only keep one copy of a * window on the stack. Also fill the empty space with the next * window on the real window stack. */ void TrailfocusScreen::popWindow (TrailfocusWindow *tw) { CompWindow *best = NULL; TfWindowList::iterator iter; int distance, bestDist = 1000000; for (iter = windows.begin (); iter != windows.end (); ++iter) if (*iter == tw) break; if (iter == windows.end ()) return; windows.erase (iter); /* find window that was activated right before the destroyed one to fill the empty space */ foreach (CompWindow *cur, screen->windows ()) { bool present = false; if (!isTrailfocusWindow (cur)) continue; if (cur == tw->window) continue; /* we only want windows that were activated before the popped one */ if (cur->activeNum () > tw->window->activeNum ()) continue; /* we do not want any windows already present in the list */ for (unsigned int i = 0; i < windows.size (); i++) { if (windows[i]->window == cur) { present = true; break; } } if (present) continue; if (!best) { best = cur; } else { distance = abs (cur->activeNum () - best->activeNum ()); if (distance < bestDist) { best = cur; bestDist = distance; } } } if (best) windows.push_back (TrailfocusWindow::get (best)); setWindows (tw); } static bool compareActiveness (CompWindow *w1, CompWindow *w2) { return w1->activeNum () >= w2->activeNum (); } /* Walks through the existing stack and removes windows that should * (no longer) be there. Used for option-change. */ void TrailfocusScreen::refillList () { CompWindowList activeList = screen->windows (); unsigned int winMax = optionGetWindowsCount (); activeList.sort (compareActiveness); windows.clear (); foreach (CompWindow *w, activeList) { if (!isTrailfocusWindow (w)) continue; windows.push_back (TrailfocusWindow::get (w)); if (windows.size () == winMax) break; } } /* Handles the event if it was a FocusIn event. */ void TrailfocusScreen::handleEvent (XEvent *event) { switch (event->type) { case FocusIn: if (pushWindow (event->xfocus.window)) setWindows (NULL); break; case PropertyNotify: if (event->xproperty.atom == Atoms::desktopViewport) { refillList (); setWindows (NULL); } break; default: break; } screen->handleEvent (event); } /* Settings changed. Reallocate rs->inc and re-populate it and the * rest of the TrailfocusScreen (-wMask). */ void TrailfocusScreen::recalculateAttributes () { TfAttribs tmp, min, max; int i, start, winMax; start = optionGetWindowsStart () - 1; winMax = optionGetWindowsCount (); if (start >= winMax) { compLogMessage ("trailfocus", CompLogLevelWarn, "Attempting to define start higher than max windows."); start = winMax - 1; } min.opacity = optionGetMinOpacity () * OPAQUE / 100; min.brightness = optionGetMinBrightness () * BRIGHT / 100; min.saturation = optionGetMinSaturation () * COLOR / 100; max.opacity = optionGetMaxOpacity () * OPAQUE / 100; max.brightness = optionGetMaxBrightness () * BRIGHT / 100; max.saturation = optionGetMaxSaturation () * COLOR / 100; attribs.resize (winMax + 1); tmp.opacity = (max.opacity - min.opacity) / (winMax - start); tmp.brightness = (max.brightness - min.brightness) / (winMax - start); tmp.saturation = (max.saturation - min.saturation) / (winMax - start); for (i = 0; i < start; i++) attribs[i] = max; for (i = 0; i + start <= winMax; i++) { attribs[i + start].opacity = max.opacity - (tmp.opacity * i); attribs[i + start].brightness = max.brightness - (tmp.brightness * i); attribs[i + start].saturation = max.saturation - (tmp.saturation * i); } } bool TrailfocusWindow::glPaint (const GLWindowPaintAttrib& attrib, const GLMatrix& transform, const CompRegion& region, unsigned int mask) { if (isTfWindow) { GLWindowPaintAttrib wAttrib (attrib); wAttrib.opacity = MIN (attrib.opacity, attribs.opacity); wAttrib.brightness = MIN (attrib.brightness, attribs.brightness); wAttrib.saturation = MIN (attrib.saturation, attribs.saturation); return gWindow->glPaint (wAttrib, transform, region, mask); } return gWindow->glPaint (attrib, transform, region, mask); } void TrailfocusScreen::optionChanged (CompOption *opt, Options num) { switch (num) { case MinOpacity: case MaxOpacity: case MinSaturation: case MaxSaturation: case MinBrightness: case MaxBrightness: case WindowsStart: case WindowsCount: recalculateAttributes (); break; default: break; } refillList (); setWindows (NULL); } bool TrailfocusScreen::setupTimerCb () { TrailfocusScreen *ts = TrailfocusScreen::get (screen); ts->refillList (); ts->setWindows (NULL); return false; } TrailfocusScreen::TrailfocusScreen (CompScreen *s) : PluginClassHandler (s), TrailfocusOptions () { ChangeNotify optionCb = boost::bind (&TrailfocusScreen::optionChanged, this, _1, _2); optionSetWindowMatchNotify (optionCb); optionSetWindowsCountNotify (optionCb); optionSetWindowsStartNotify (optionCb); optionSetMinOpacityNotify (optionCb); optionSetMaxOpacityNotify (optionCb); optionSetMinSaturationNotify (optionCb); optionSetMaxSaturationNotify (optionCb); optionSetMinBrightnessNotify (optionCb); optionSetMaxBrightnessNotify (optionCb); ScreenInterface::setHandler (screen); recalculateAttributes (); setupTimer.start (setupTimerCb, 0, 0); } TrailfocusWindow::TrailfocusWindow (CompWindow *w) : PluginClassHandler (w), isTfWindow (false), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)) { attribs.opacity = OPAQUE; attribs.brightness = BRIGHT; attribs.saturation = COLOR; GLWindowInterface::setHandler (gWindow, false); } TrailfocusWindow::~TrailfocusWindow () { /* Since we are popping the window from the stack * gWindow and cWindow are invalidated. Set them to * NULL so that their functions cannot be called */ gWindow = NULL; cWindow = NULL; TrailfocusScreen::get (screen)->popWindow (this); } bool TrailfocusPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/trailfocus/src/trailfocus.h0000644000015301777760000000500712321343002024443 0ustar pbusernogroup00000000000000/** * Beryl Trailfocus - take three * * Copyright (c) 2006 Kristian Lyngstøl * Ported to Compiz and BCOP usage by Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This version is completly rewritten from scratch with opacify as a * basic template. The original trailfocus was written by: * François Ingelrest and rewritten by: * Dennis Kasprzyk * * * Trailfocus modifies the opacity, brightness and saturation on a window * based on when it last had focus. * */ #include #include #include #include #include "trailfocus_options.h" typedef struct { GLushort opacity; GLushort brightness; GLushort saturation; } TfAttribs; class TrailfocusWindow : public GLWindowInterface, public PluginClassHandler { public: TrailfocusWindow (CompWindow *); ~TrailfocusWindow (); bool glPaint (const GLWindowPaintAttrib&, const GLMatrix&, const CompRegion&, unsigned int); bool isTfWindow; TfAttribs attribs; CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; }; class TrailfocusScreen : public ScreenInterface, public PluginClassHandler, public TrailfocusOptions { public: TrailfocusScreen (CompScreen *); void handleEvent (XEvent *); bool pushWindow (Window); void popWindow (TrailfocusWindow *); private: bool isTrailfocusWindow (CompWindow *); void setWindows (TrailfocusWindow *); void refillList (); void recalculateAttributes (); void optionChanged (CompOption *, Options); static bool setupTimerCb (); typedef std::vector TfWindowList; TfWindowList windows; std::vector attribs; CompTimer setupTimer; }; class TrailfocusPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/loginout/0000755000015301777760000000000012321344021021015 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/loginout/loginout.xml.in0000644000015301777760000000557012321343002024011 0ustar pbusernogroup00000000000000 <_short>Login/Logout <_long>Login/Logout effect Effects opengl regex composite opengl decor <_short>Login <_short>Logout compiz-0.9.11+14.04.20140409/plugins/loginout/CMakeLists.txt0000644000015301777760000000015512321343002023554 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (loginout PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/loginout/src/0000755000015301777760000000000012321344021021604 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/loginout/src/loginout.h0000644000015301777760000000450112321343002023613 0ustar pbusernogroup00000000000000/* * Compiz login/logout effect plugin * * loginout.cpp * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * */ #include #include #include #include #include "loginout_options.h" class LoginoutScreen : public PluginClassHandler , public LoginoutOptions, public ScreenInterface, public CompositeScreenInterface { public: LoginoutScreen (CompScreen *); ~LoginoutScreen (); CompositeScreen *cScreen; Atom kdeLogoutInfoAtom; Atom wmSnSelectionWindow; int numLoginWin; int numLogoutWin; float brightness; float saturation; float opacity; float in; float out; void updateWindowMatch (CompWindow *); void optionChanged (CompOption *opt, LoginoutOptions::Options num); void preparePaint (int); void donePaint (); void matchExpHandlerChanged (); void matchPropertyChanged (CompWindow *); }; class LoginoutWindow : public PluginClassHandler , public WindowInterface, public GLWindowInterface { public: LoginoutWindow (CompWindow *); ~LoginoutWindow (); CompWindow *window; GLWindow *gWindow; bool login; bool logout; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); bool glDraw (const GLMatrix &, GLFragment::Attrib &, const CompRegion &, unsigned int); }; #define LOGINOUT_SCREEN(s) \ LoginoutScreen *ls = LoginoutScreen::get (s); #define LOGINOUT_WINDOW(w) \ LoginoutWindow *lw = LoginoutWindow::get (w); class LoginoutPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/loginout/src/loginout.cpp0000644000015301777760000001654612321343002024162 0ustar pbusernogroup00000000000000/* * Compiz login/logout effect plugin * * loginout.cpp * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * */ #include "loginout.h" COMPIZ_PLUGIN_20090315 (loginout, LoginoutPluginVTable) void LoginoutScreen::updateWindowMatch (CompWindow *w) { bool curr; LOGINOUT_WINDOW (w); curr = optionGetInMatch ().evaluate (w); if (curr != lw->login) { lw->login = curr; if (curr) { lw->gWindow->glPaintSetEnabled (lw, true); lw->gWindow->glDrawSetEnabled (lw, true); numLoginWin++; } else { lw->gWindow->glPaintSetEnabled (lw, false); lw->gWindow->glDrawSetEnabled (lw, false); numLoginWin--; } cScreen->damageScreen (); } curr = optionGetOutMatch ().evaluate (w); if (curr != lw->logout) { lw->logout = curr; if (curr) { lw->gWindow->glPaintSetEnabled (lw, true); lw->gWindow->glDrawSetEnabled (lw, true); numLogoutWin++; } else { lw->gWindow->glPaintSetEnabled (lw, false); lw->gWindow->glDrawSetEnabled (lw, false); numLogoutWin--; } cScreen->damageScreen (); } if (numLoginWin || numLogoutWin) { cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); } else { cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); } } void LoginoutScreen::optionChanged (CompOption *opt, LoginoutOptions::Options num) { switch (num) { case LoginoutOptions::InMatch: case LoginoutOptions::OutMatch: foreach (CompWindow *w, screen->windows ()) updateWindowMatch (w); cScreen->damageScreen (); break; default: cScreen->damageScreen (); break; } } void LoginoutScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); /* match options are up to date after the call to matchExpHandlerChanged */ foreach (CompWindow *w, screen->windows ()) { updateWindowMatch (w); } } void LoginoutScreen::matchPropertyChanged (CompWindow *w) { updateWindowMatch (w); screen->matchPropertyChanged (w); } bool LoginoutWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; LOGINOUT_SCREEN (screen); if ((ls->in > 0.0 || ls->out > 0.0) && !login && !logout && !(window->wmType () & CompWindowTypeDesktopMask) && ls->opacity < 1.0) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; status = gWindow->glPaint (attrib, transform, region, mask); return status; } bool LoginoutWindow::glDraw (const GLMatrix &transform, GLFragment::Attrib &fragment, const CompRegion ®ion, unsigned int mask) { bool status; LOGINOUT_SCREEN (screen); if ((ls->in > 0.0 || ls->out > 0.0) && !login && !logout) { GLFragment::Attrib fA = fragment; if (!(window->wmType () & CompWindowTypeDesktopMask)) fA.setOpacity (fragment.getOpacity () * ls->opacity); fA.setBrightness (fragment.getBrightness () * ls->brightness); fA.setSaturation (fragment.getSaturation () * ls->saturation); status = gWindow->glDraw (transform, fA, region, mask); } else { status = gWindow->glDraw (transform, fragment, region, mask); } return status; } void LoginoutScreen::preparePaint (int ms) { float val; val = ((float)ms / 1000.0) / optionGetInTime (); if (numLoginWin) in = MIN (1.0, in + val); else in = MAX (0.0, in - val); val = ((float)ms / 1000.0) / optionGetOutTime (); if (numLogoutWin) out = MIN (1.0, out + val); else out = MAX (0.0, out - val); if (in > 0.0 || out > 0.0) { val = (in * optionGetInOpacity () / 100.0) + (1.0 - in); float val2 = (out * optionGetOutOpacity () / 100.0) + (1.0 - out); opacity = MIN (val, val2); val = (in * optionGetInSaturation () / 100.0) + (1.0 - in); val2 = (out * optionGetOutSaturation () / 100.0) + (1.0 - out); saturation = MIN (val, val2); val = (in * optionGetInBrightness () / 100.0) + (1.0 - in); val2 = (out * optionGetOutBrightness () / 100.0) + (1.0 - out); brightness = MIN (val, val2); } cScreen->preparePaint (ms); } void LoginoutScreen::donePaint () { if ((in > 0.0 && in < 1.0) || (out > 0.0 && out < 1.0)) cScreen->damageScreen (); cScreen->donePaint (); } LoginoutScreen::LoginoutScreen (CompScreen *screen) : PluginClassHandler (screen), LoginoutOptions (), cScreen (CompositeScreen::get (screen)), kdeLogoutInfoAtom (XInternAtom (screen->dpy (), "_KWIN_LOGOUT_EFFECT", 0)), numLoginWin (0), numLogoutWin (0), brightness (1.0), saturation (1.0), opacity (1.0), in (0.0), out (0.0) { char buf[128]; int scr = DefaultScreen (screen->dpy ()); ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); optionSetInMatchNotify (boost::bind (&LoginoutScreen::optionChanged, this, _1, _2)); optionSetOutMatchNotify (boost::bind (&LoginoutScreen::optionChanged, this, _1, _2)); /* wmSnSelectionWindow is not available, so we have to retrieve it * ourselves. */ snprintf (buf, 128, "WM_S%d", scr); wmSnSelectionWindow = XInternAtom (screen->dpy (), buf, 0); /* This is a temporary solution until an official spec will be released */ XChangeProperty (screen->dpy (), wmSnSelectionWindow, kdeLogoutInfoAtom, kdeLogoutInfoAtom, 8, PropModeReplace, (unsigned char*)&kdeLogoutInfoAtom, 1); /* Disable paint functions until we need them */ cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); } LoginoutScreen::~LoginoutScreen () { char buf[128]; int scr = DefaultScreen (screen->dpy ()); snprintf (buf, 128, "WM_S%d", scr); XDeleteProperty (screen->dpy (), wmSnSelectionWindow, kdeLogoutInfoAtom); } LoginoutWindow::LoginoutWindow (CompWindow *window) : PluginClassHandler (window), window (window), gWindow (GLWindow::get (window)), login (false), logout (false) { LOGINOUT_SCREEN (screen); WindowInterface::setHandler (window); GLWindowInterface::setHandler (gWindow); gWindow->glPaintSetEnabled (this, false); gWindow->glDrawSetEnabled (this, false); ls->updateWindowMatch (window); } LoginoutWindow::~LoginoutWindow () { LOGINOUT_SCREEN (screen); if (login) { ls->numLoginWin--; ls->cScreen->damageScreen (); } if (logout) { ls->numLogoutWin--; ls->cScreen->damageScreen (); } } bool LoginoutPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/opengl/0000755000015301777760000000000012321344021020441 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/opengl.xml.in0000644000015301777760000000616612321343002023063 0ustar pbusernogroup00000000000000 <_short>OpenGL <_long>OpenGL Plugin General composite compiz-0.9.11+14.04.20140409/plugins/opengl/CMakeLists.txt0000644000015301777760000000143312321343002023200 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) set (INTERNAL_LIBRARIES compiz_opengl_double_buffer compiz_opengl_fsregion compiz_opengl_blacklist compiz_opengl_glx_tfp_bind ) add_subdirectory (src/doublebuffer) add_subdirectory (src/fsregion) add_subdirectory (src/blacklist) add_subdirectory (src/glxtfpbind) include_directories (src/glxtfpbind/include) if (USE_GLES) compiz_plugin(opengl PLUGINDEPS composite CFLAGSADD "-DUSE_GLES" LIBRARIES ${OPENGLES2_LIBRARIES} ${INTERNAL_LIBRARIES} dl INCDIRS ${OPENGLES2_INCLUDE_DIR}) else (USE_GLES) find_package (OpenGL) if (OPENGL_FOUND) compiz_plugin(opengl PLUGINDEPS composite LIBRARIES ${OPENGL_gl_LIBRARY} ${INTERNAL_LIBRARIES} dl INCDIRS ${OPENGL_INCLUDE_DIR}) endif (OPENGL_FOUND) endif (USE_GLES) compiz-0.9.11+14.04.20140409/plugins/opengl/compiz-opengl.pc.in0000644000015301777760000000045112321343002024153 0ustar pbusernogroup00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-opengl Description: Opengl compositing plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite Libs: @PKGCONFIG_LIBS@ -L${libdir} -lopengl Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compizcompiz-0.9.11+14.04.20140409/plugins/opengl/src/0000755000015301777760000000000012321344021021230 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/src/matrix.cpp0000644000015301777760000003247712321343002023253 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Danny Baumann */ /* * Copyright (C) 1999-2005 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * From Mesa 3-D graphics library. */ #include #include #include #include #include #define DEG2RAD (M_PI / 180.0f) /** * Identity matrix. */ static const float identity[16] = { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; #define A(row, col) a[(col << 2) + row] #define B(row, col) b[(col << 2) + row] #define P(row, col) product[(col << 2) + row] /** * Perform a full 4x4 matrix multiplication. * * \param a matrix. * \param b matrix. * \param product will receive the product of \p a and \p b. * * \warning Is assumed that \p product != \p b. \p product == \p a is allowed. * * \note KW: 4*16 = 64 multiplications * * \author This \c matmul was contributed by Thomas Malik */ static void matmul4 (float *product, const float *a, const float *b) { for (int i = 0; i < 4; i++) { const float ai0 = A(i,0), ai1 = A(i,1), ai2 = A(i,2), ai3 = A(i,3); P(i,0) = ai0 * B(0,0) + ai1 * B(1,0) + ai2 * B(2,0) + ai3 * B(3,0); P(i,1) = ai0 * B(0,1) + ai1 * B(1,1) + ai2 * B(2,1) + ai3 * B(3,1); P(i,2) = ai0 * B(0,2) + ai1 * B(1,2) + ai2 * B(2,2) + ai3 * B(3,2); P(i,3) = ai0 * B(0,3) + ai1 * B(1,3) + ai2 * B(2,3) + ai3 * B(3,3); } } GLMatrix::GLMatrix () { memcpy (m, identity, sizeof (m)); } GLMatrix::GLMatrix (const float *mat) { memcpy (m, mat, sizeof (m)); } void GLMatrix::reset () { memcpy (m, identity, sizeof (m)); } const float * GLMatrix::getMatrix () const { return m; } GLMatrix& GLMatrix::operator*= (const GLMatrix& rhs) { *this = *this * rhs; return *this; } GLMatrix operator* (const GLMatrix& lhs, const GLMatrix& rhs) { GLMatrix result; matmul4 (result.m, lhs.m, rhs.m); return result; } GLVector operator* (const GLMatrix& lhs, const GLVector& rhs) { GLVector result; const float *a = lhs.m; for (int i = 0; i < 4; i++) { result[i] = A(i,0) * rhs[0] + A(i,1) * rhs[1] + A(i,2) * rhs[2] + A(i,3) * rhs[3]; } return result; } #undef A #undef B #undef P /* ** Invert 4x4 matrix. ** Contributed by David Moore (See Mesa bug #6748) */ bool GLMatrix::invert () { float inv[16], det; inv[0] = m[5]*m[10]*m[15] - m[5]*m[11]*m[14] - m[9]*m[6]*m[15] + m[9]*m[7]*m[14] + m[13]*m[6]*m[11] - m[13]*m[7]*m[10]; inv[4] = -m[4]*m[10]*m[15] + m[4]*m[11]*m[14] + m[8]*m[6]*m[15] - m[8]*m[7]*m[14] - m[12]*m[6]*m[11] + m[12]*m[7]*m[10]; inv[8] = m[4]*m[9]*m[15] - m[4]*m[11]*m[13] - m[8]*m[5]*m[15] + m[8]*m[7]*m[13] + m[12]*m[5]*m[11] - m[12]*m[7]*m[9]; inv[12] = -m[4]*m[9]*m[14] + m[4]*m[10]*m[13] + m[8]*m[5]*m[14] - m[8]*m[6]*m[13] - m[12]*m[5]*m[10] + m[12]*m[6]*m[9]; inv[1] = -m[1]*m[10]*m[15] + m[1]*m[11]*m[14] + m[9]*m[2]*m[15] - m[9]*m[3]*m[14] - m[13]*m[2]*m[11] + m[13]*m[3]*m[10]; inv[5] = m[0]*m[10]*m[15] - m[0]*m[11]*m[14] - m[8]*m[2]*m[15] + m[8]*m[3]*m[14] + m[12]*m[2]*m[11] - m[12]*m[3]*m[10]; inv[9] = -m[0]*m[9]*m[15] + m[0]*m[11]*m[13] + m[8]*m[1]*m[15] - m[8]*m[3]*m[13] - m[12]*m[1]*m[11] + m[12]*m[3]*m[9]; inv[13] = m[0]*m[9]*m[14] - m[0]*m[10]*m[13] - m[8]*m[1]*m[14] + m[8]*m[2]*m[13] + m[12]*m[1]*m[10] - m[12]*m[2]*m[9]; inv[2] = m[1]*m[6]*m[15] - m[1]*m[7]*m[14] - m[5]*m[2]*m[15] + m[5]*m[3]*m[14] + m[13]*m[2]*m[7] - m[13]*m[3]*m[6]; inv[6] = -m[0]*m[6]*m[15] + m[0]*m[7]*m[14] + m[4]*m[2]*m[15] - m[4]*m[3]*m[14] - m[12]*m[2]*m[7] + m[12]*m[3]*m[6]; inv[10] = m[0]*m[5]*m[15] - m[0]*m[7]*m[13] - m[4]*m[1]*m[15] + m[4]*m[3]*m[13] + m[12]*m[1]*m[7] - m[12]*m[3]*m[5]; inv[14] = -m[0]*m[5]*m[14] + m[0]*m[6]*m[13] + m[4]*m[1]*m[14] - m[4]*m[2]*m[13] - m[12]*m[1]*m[6] + m[12]*m[2]*m[5]; inv[3] = -m[1]*m[6]*m[11] + m[1]*m[7]*m[10] + m[5]*m[2]*m[11] - m[5]*m[3]*m[10] - m[9]*m[2]*m[7] + m[9]*m[3]*m[6]; inv[7] = m[0]*m[6]*m[11] - m[0]*m[7]*m[10] - m[4]*m[2]*m[11] + m[4]*m[3]*m[10] + m[8]*m[2]*m[7] - m[8]*m[3]*m[6]; inv[11] = -m[0]*m[5]*m[11] + m[0]*m[7]*m[9] + m[4]*m[1]*m[11] - m[4]*m[3]*m[9] - m[8]*m[1]*m[7] + m[8]*m[3]*m[5]; inv[15] = m[0]*m[5]*m[10] - m[0]*m[6]*m[9] - m[4]*m[1]*m[10] + m[4]*m[2]*m[9] + m[8]*m[1]*m[6] - m[8]*m[2]*m[5]; det = m[0]*inv[0] + m[1]*inv[4] + m[2]*inv[8] + m[3]*inv[12]; if (det == 0) return false; det = 1.0f / det; for (int i = 0; i < 16; i++) m[i] = inv[i] * det; return true; } /** * Generate a 4x4 transformation matrix from glRotate parameters, and * post-multiply the input matrix by it. * * \author * This function was contributed by Erich Boleyn (erich@uruk.org). * Optimizations contributed by Rudolf Opalla (rudi@khm.de). */ void GLMatrix::rotate (const float angle, const float xRot, const float yRot, const float zRot) { float x = xRot, y = yRot, z = zRot; float s, c; float matrix[16]; bool optimized; s = (float) sin (angle * DEG2RAD); c = (float) cos (angle * DEG2RAD); memcpy (matrix, identity, sizeof (matrix)); optimized = false; #define M(row, col) matrix[col * 4 + row] if (x == 0.0f) { if (y == 0.0f) { if (z != 0.0f) { optimized = true; /* rotate only around z-axis */ M(0,0) = c; M(1,1) = c; if (z < 0.0f) { M(0,1) = s; M(1,0) = -s; } else { M(0,1) = -s; M(1,0) = s; } } } else if (z == 0.0f) { optimized = true; /* rotate only around y-axis */ M(0,0) = c; M(2,2) = c; if (y < 0.0f) { M(0,2) = -s; M(2,0) = s; } else { M(0,2) = s; M(2,0) = -s; } } } else if (y == 0.0f) { if (z == 0.0f) { optimized = true; /* rotate only around x-axis */ M(1,1) = c; M(2,2) = c; if (x < 0.0f) { M(1,2) = s; M(2,1) = -s; } else { M(1,2) = -s; M(2,1) = s; } } } if (!optimized) { float xx, yy, zz, xy, yz, zx, xs, ys, zs, one_c; const float mag = sqrtf (x * x + y * y + z * z); if (mag <= 1.0e-4) { /* no rotation, leave mat as-is */ return; } x /= mag; y /= mag; z /= mag; /* * Arbitrary axis rotation matrix. * * This is composed of 5 matrices, Rz, Ry, T, Ry', Rz', multiplied * like so: Rz * Ry * T * Ry' * Rz'. T is the final rotation * (which is about the X-axis), and the two composite transforms * Ry' * Rz' and Rz * Ry are (respectively) the rotations necessary * from the arbitrary axis to the X-axis then back. They are * all elementary rotations. * * Rz' is a rotation about the Z-axis, to bring the axis vector * into the x-z plane. Then Ry' is applied, rotating about the * Y-axis to bring the axis vector parallel with the X-axis. The * rotation about the X-axis is then performed. Ry and Rz are * simply the respective inverse transforms to bring the arbitrary * axis back to it's original orientation. The first transforms * Rz' and Ry' are considered inverses, since the data from the * arbitrary axis gives you info on how to get to it, not how * to get away from it, and an inverse must be applied. * * The basic calculation used is to recognize that the arbitrary * axis vector (x, y, z), since it is of unit length, actually * represents the sines and cosines of the angles to rotate the * X-axis to the same orientation, with theta being the angle about * Z and phi the angle about Y (in the order described above) * as follows: * * cos ( theta ) = x / sqrt ( 1 - z^2 ) * sin ( theta ) = y / sqrt ( 1 - z^2 ) * * cos ( phi ) = sqrt ( 1 - z^2 ) * sin ( phi ) = z * * Note that cos ( phi ) can further be inserted to the above * formulas: * * cos ( theta ) = x / cos ( phi ) * sin ( theta ) = y / sin ( phi ) * * ...etc. Because of those relations and the standard trigonometric * relations, it is pssible to reduce the transforms down to what * is used below. It may be that any primary axis chosen will give the * same results (modulo a sign convention) using thie method. * * Particularly nice is to notice that all divisions that might * have caused trouble when parallel to certain planes or * axis go away with care paid to reducing the expressions. * After checking, it does perform correctly under all cases, since * in all the cases of division where the denominator would have * been zero, the numerator would have been zero as well, giving * the expected result. */ xx = x * x; yy = y * y; zz = z * z; xy = x * y; yz = y * z; zx = z * x; xs = x * s; ys = y * s; zs = z * s; one_c = 1.0f - c; /* We already hold the identity-matrix so we can skip some statements */ M(0,0) = (one_c * xx) + c; M(0,1) = (one_c * xy) - zs; M(0,2) = (one_c * zx) + ys; /* M(0,3) = 0.0F; */ M(1,0) = (one_c * xy) + zs; M(1,1) = (one_c * yy) + c; M(1,2) = (one_c * yz) - xs; /* M(1,3) = 0.0F; */ M(2,0) = (one_c * zx) - ys; M(2,1) = (one_c * yz) + xs; M(2,2) = (one_c * zz) + c; /* M(2,3) = 0.0F; */ /* M(3,0) = 0.0F; M(3,1) = 0.0F; M(3,2) = 0.0F; M(3,3) = 1.0F; */ } #undef M matmul4 (m, m, matrix); } void GLMatrix::rotate (const float angle, const GLVector& vector) { rotate (angle, vector[GLVector::x], vector[GLVector::y], vector[GLVector::z]); } /** * Multiply a matrix with a general scaling matrix. * * \param matrix matrix. * \param x x axis scale factor. * \param y y axis scale factor. * \param z z axis scale factor. * * Multiplies in-place the elements of \p matrix by the scale factors. */ void GLMatrix::scale (const float x, const float y, const float z) { m[0] *= x; m[4] *= y; m[8] *= z; m[1] *= x; m[5] *= y; m[9] *= z; m[2] *= x; m[6] *= y; m[10] *= z; m[3] *= x; m[7] *= y; m[11] *= z; } void GLMatrix::scale (const GLVector& vector) { scale (vector[GLVector::x], vector[GLVector::y], vector[GLVector::z]); } /** * Multiply a matrix with a translation matrix. * * \param matrix matrix. * \param x translation vector x coordinate. * \param y translation vector y coordinate. * \param z translation vector z coordinate. * * Adds the translation coordinates to the elements of \p matrix in-place. */ void GLMatrix::translate (const float x, const float y, const float z) { m[12] = m[0] * x + m[4] * y + m[8] * z + m[12]; m[13] = m[1] * x + m[5] * y + m[9] * z + m[13]; m[14] = m[2] * x + m[6] * y + m[10] * z + m[14]; m[15] = m[3] * x + m[7] * y + m[11] * z + m[15]; } void GLMatrix::translate (const GLVector& vector) { translate (vector[GLVector::x], vector[GLVector::y], vector[GLVector::z]); } void GLMatrix::toScreenSpace (const CompOutput *output, float z) { translate (-0.5f, -0.5f, z); scale (1.0f / output->width (), -1.0f / output->height (), 1.0f); translate (-output->x1 (), -output->y2 (), 0.0f); } float& GLMatrix::operator[] (unsigned int pos) { assert (pos <= 15); return m[pos]; } compiz-0.9.11+14.04.20140409/plugins/opengl/src/blacklist/0000755000015301777760000000000012321344021023200 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/src/blacklist/blacklist.h0000644000015301777760000000277012321343002025325 0ustar pbusernogroup00000000000000/* * Compiz opengl plugin, Blacklist function * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef __COMPIZ_OPENGL_BLACKLIST_H #define __COMPIZ_OPENGL_BLACKLIST_H namespace compiz { namespace opengl { bool blacklisted (const char *blacklistRegex, const char *glVendor, const char *glRenderer, const char *glVersion); } // namespace opengl } // namespace compiz #endif compiz-0.9.11+14.04.20140409/plugins/opengl/src/blacklist/blacklist.cpp0000644000015301777760000000411312321343002025651 0ustar pbusernogroup00000000000000/* * Compiz opengl plugin, Blacklist feature * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "blacklist.h" #include #include namespace compiz { namespace opengl { bool blacklisted (const char *blacklistRegex, const char *glVendor, const char *glRenderer, const char *glVersion) { bool matches = false; if (blacklistRegex && blacklistRegex[0]) { regex_t re; // Ensure the regex contains something other than spaces, or ignore. const char *p = blacklistRegex; while (*p == ' ') p++; if (*p && !regcomp (&re, blacklistRegex, REG_EXTENDED)) { char driver[1024]; snprintf (driver, sizeof driver, "%s\n%s\n%s", glVendor ? glVendor : "", glRenderer ? glRenderer : "", glVersion ? glVersion : ""); if (!regexec (&re, driver, 0, NULL, 0)) matches = true; regfree (&re); } } return matches; } } // namespace opengl } // namespace compiz compiz-0.9.11+14.04.20140409/plugins/opengl/src/blacklist/tests/0000755000015301777760000000000012321344021024342 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/src/blacklist/tests/test-blacklist.cpp0000644000015301777760000001275012321343002027776 0ustar pbusernogroup00000000000000/* * Compiz opengl plugin, Backlist feature * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "gtest/gtest.h" #include "blacklist.h" using namespace compiz::opengl; static const char *recommendedRegex = "(nouveau|Intel).*Mesa 8.0"; TEST (DriverBlacklist, QuantalIntelIsGood) { EXPECT_FALSE (blacklisted (recommendedRegex, "Intel Open Source Technology Center", "Mesa DRI Intel(R) Sandybridge Desktop", "3.0 Mesa 9.0")); } TEST (DriverBlacklist, PreciseIntelIsBad) { EXPECT_TRUE (blacklisted (recommendedRegex, "Tungsten Graphics, Inc", "Mesa DRI Intel(R) Sandybridge Desktop", "3.0 Mesa 8.0.2")); } TEST (DriverBlacklist, QuantalNouveauIsGood) { EXPECT_FALSE (blacklisted (recommendedRegex, "nouveau", "Gallium 0.4 on NV86", "3.0 Mesa 9.0-devel")); } TEST (DriverBlacklist, PreciseNouveauIsBad) { EXPECT_TRUE (blacklisted (recommendedRegex, "nouveau", "Gallium 0.4 on NVA8", "2.1 Mesa 8.0.2")); } TEST (DriverBlacklist, FglrxIsGood) { EXPECT_FALSE (blacklisted (recommendedRegex, "Advanced Micro Devices, Inc.", "ATI Radeon HD 5450", "4.2.11627 Compatibility Profile Context")); } TEST (DriverBlacklist, NvidiaIsGood) { EXPECT_FALSE (blacklisted (recommendedRegex, "NVIDIA Corporation", "Quadro 1000M/PCIe/SSE2", "4.2.0 NVIDIA 304.48")); } TEST (DriverBlacklist, RadeonIsGood1) { EXPECT_FALSE (blacklisted (recommendedRegex, "X.Org R300 Project", "Gallium 0.4 on ATI RV350", "2.1 Mesa 8.0.2")); } TEST (DriverBlacklist, RadeonIsGood2) { EXPECT_FALSE (blacklisted (recommendedRegex, "X.Org", "Gallium 0.4 on AMD CEDAR", "2.1 Mesa 8.0.3")); } TEST (DriverBlacklist, RadeonIsGood3) { EXPECT_FALSE (blacklisted (recommendedRegex, "X.Org", "Gallium 0.4 on AMD RS880", "2.1 Mesa 8.0.2")); } TEST (DriverBlacklist, LLVMpipeIsGood) { EXPECT_FALSE (blacklisted (recommendedRegex, "VMware, Inc.", "Gallium 0.4 on llvmpipe (LLVM 0x300)", "2.1 Mesa 8.0.4")); } TEST (DriverBlacklist, UnknownIsGood) { EXPECT_FALSE (blacklisted (recommendedRegex, "Acme", "Graphics Driver", "4.2 8.0 9.0 123.456")); } TEST (DriverBlacklist, NoBlacklist) { EXPECT_FALSE (blacklisted ("", "Tungsten Graphics, Inc", "Mesa DRI Intel(R) Sandybridge Desktop", "3.0 Mesa 8.0.2")); EXPECT_FALSE (blacklisted ("", "foo", "bar", "blah")); EXPECT_FALSE (blacklisted ("", "", "", "")); } TEST (DriverBlacklist, LineContinuation) { EXPECT_FALSE (blacklisted ("alpha", "beta", "gamma", "delta")); EXPECT_FALSE (blacklisted ("betagam", "beta", "gamma", "delta")); EXPECT_TRUE (blacklisted ("gamma", "beta", "gamma", "delta")); EXPECT_TRUE (blacklisted ("del", "beta", "gamma", "delta")); EXPECT_TRUE (blacklisted ("(mag|gam)", "beta", "gamma", "delta")); EXPECT_TRUE (blacklisted ("beta.*delt", "beta", "gamma", "delta")); EXPECT_FALSE (blacklisted ("beta.*felt", "beta", "gamma", "delta")); EXPECT_TRUE (blacklisted ("beta\ngamma\ndelta", "beta", "gamma", "delta")); } TEST (DriverBlacklist, StraySpaces) { EXPECT_FALSE (blacklisted (" ", "Hello world", "and", "goodbye")); EXPECT_FALSE (blacklisted (" ", " ", " ", " ")); EXPECT_FALSE (blacklisted (" ", "Tungsten Graphics, Inc", "Mesa DRI Intel(R) Sandybridge Desktop", "3.0 Mesa 8.0.2")); } compiz-0.9.11+14.04.20140409/plugins/opengl/src/blacklist/tests/CMakeLists.txt0000644000015301777760000000043312321343002027100 0ustar pbusernogroup00000000000000include_directories (${GTEST_INCLUDE_DIRS} ..) set (exe "compiz_opengl_test_blacklist") add_executable (${exe} test-blacklist.cpp) target_link_libraries (${exe} compiz_opengl_blacklist ${GTEST_BOTH_LIBRARIES} ) compiz_discover_tests(${exe} COVERAGE compiz_opengl_blacklist) compiz-0.9.11+14.04.20140409/plugins/opengl/src/blacklist/CMakeLists.txt0000644000015301777760000000017112321343002025735 0ustar pbusernogroup00000000000000if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif () add_library (compiz_opengl_blacklist STATIC blacklist.cpp) compiz-0.9.11+14.04.20140409/plugins/opengl/src/privatevertexbuffer.h0000644000015301777760000000770712321343002025514 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins * Frederic Plourde */ #ifndef _VERTEXBUFFER_PRIVATE_H #define _VERTEXBUFFER_PRIVATE_H #ifdef USE_GLES #include #else #include #endif #include #include class GLVertexBuffer; class AbstractUniform { public: virtual ~AbstractUniform() {} void virtual set(GLProgram* program) = 0; }; template < typename T, int C > class Uniform: public AbstractUniform { public: Uniform(const char *_name, ... ); void set(GLProgram* program); public: T a[C]; std::string name; }; template < typename T, int C > Uniform< T, C >::Uniform(const char *_name, ... ) { va_list arg_list; va_start( arg_list, _name ); name = _name; for( int i = 0; i < C; i++ ) a[i] = va_arg( arg_list, T ); va_end( arg_list ); } template < typename T, int C > void Uniform< T, C >::set(GLProgram* prog) { const char* n = name.c_str(); // This will only get called from privateVertexBuffer::render // so we know we've got a valid, bound program here if (typeid(a[0]) == typeid(double)) { switch (C) { case 1: prog->setUniform (n, (GLfloat) a[0]); break; case 2: prog->setUniform2f (n, a[0], a[1]); break; case 3: prog->setUniform3f (n, a[0], a[1], a[2]); break; case 4: prog->setUniform4f (n, a[0], a[1], a[2], a[3]); break; } } else if (typeid(a[0]) == typeid(int)) { switch (C) { case 1: prog->setUniform (n, (GLint) a[0]); break; case 2: prog->setUniform2i (n, a[0], a[1]); break; case 3: prog->setUniform3i (n, a[0], a[1], a[2]); break; case 4: prog->setUniform4i (n, a[0], a[1], a[2], a[3]); break; } } else { compLogMessage ("opengl", CompLogLevelError, "Unknown uniform type!"); } } class GLVertexBuffer; class PrivateVertexBuffer { public: PrivateVertexBuffer (); ~PrivateVertexBuffer (); int render (const GLMatrix *projection, const GLMatrix *modelview, const GLWindowPaintAttrib *attrib); int legacyRender (const GLMatrix &projection, const GLMatrix &modelview, const GLWindowPaintAttrib &attrib); public: static GLVertexBuffer *streamingBuffer; std::vector vertexData; std::vector normalData; std::vector colorData; enum { MAX_TEXTURES = 4 }; std::vector textureData[MAX_TEXTURES]; GLuint nTextures; GLfloat color[4]; GLuint vertexOffset; GLint maxVertices; GLProgram *program; GLenum primitiveType; GLenum usage; GLuint vertexBuffer; GLuint normalBuffer; GLuint colorBuffer; GLuint textureBuffers[4]; std::vector uniforms; GLVertexBuffer::AutoProgram *autoProgram; }; #endif //_VERTEXBUFFER_PRIVATE_H compiz-0.9.11+14.04.20140409/plugins/opengl/src/fsregion/0000755000015301777760000000000012321344021023044 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/src/fsregion/tests/0000755000015301777760000000000012321344021024206 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/src/fsregion/tests/test-fsregion.cpp0000644000015301777760000002044012321343002027501 0ustar pbusernogroup00000000000000/* * Compiz opengl plugin, FullscreenRegion class * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "gtest/gtest.h" #include "fsregion.h" using namespace compiz::opengl; TEST (OpenGLFullscreenRegion, NoWindows) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, OneFullscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_TRUE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, FullscreenNoDesktop) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_TRUE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); } TEST (OpenGLFullscreenRegion, AlphaFullscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Alpha)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, AlphaOverFullscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (50, 60, 70, 80), FullscreenRegion::Alpha)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, NoOcclusionFullscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::NoOcclusionDetection)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, NoOcclusionOverFullscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (50, 60, 70, 80), FullscreenRegion::NoOcclusionDetection)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, NormalWindows) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (10, 10, 40, 30))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (20, 20, 50, 20))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, TwoFullscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_TRUE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (10, 10, 40, 30))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (20, 20, 50, 20))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, Offscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (-100, -100, 1, 1))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (2000, 2000, 123, 456))); EXPECT_TRUE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (10, 10, 40, 30))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (20, 20, 50, 20))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, CancelFullscreen1) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (500, 500, 345, 234))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (10, 10, 40, 30))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (20, 20, 50, 20))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, CancelFullscreen2) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (-100, -100, 1, 1))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (2000, 2000, 123, 456))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (500, 500, 345, 234))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (10, 10, 40, 30))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (20, 20, 50, 20))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, Overflow) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (10, 10, 40, 30))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (-10, -10, 1044, 788))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, KeepUnredirectedStateIfNotOnMonitor) { CompRect left (0, 0, 1024, 768); CompRect right (1025, 0, 1024, 768); CompRegion all (0, 0, 2048, 768); CompRect offscreen1 (2048, 0, 1024, 768); CompRect offscreen2 (-1024, 0, 1024, 768); CompRegion window (right); FullscreenRegion monitor (left, all); /* Eg, not covering the monitor, should be redirected */ EXPECT_FALSE (monitor.isCoveredBy (window)); /* Don't allow the redirection however, because we weren't * covering the monitor at all. */ EXPECT_FALSE (monitor.allowRedirection (window)); /* Verify off-screen windows are always redirected (eg. other viewports) */ EXPECT_TRUE (monitor.allowRedirection (offscreen1)); EXPECT_TRUE (monitor.allowRedirection (offscreen2)); } TEST (OpenGLFullscreenRegion, MaximizedWithDocks) // LP: #1053902 { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 24))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 24, 64, 744))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (64, 24, 960, 744))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } compiz-0.9.11+14.04.20140409/plugins/opengl/src/fsregion/tests/CMakeLists.txt0000644000015301777760000000044712321343002026751 0ustar pbusernogroup00000000000000include_directories (${GTEST_INCLUDE_DIRS} ..) set (exe "compiz_opengl_test_fsregion") add_executable (${exe} test-fsregion.cpp) target_link_libraries (${exe} compiz_opengl_fsregion compiz_core ${GTEST_BOTH_LIBRARIES} ) compiz_discover_tests(${exe} COVERAGE compiz_opengl_fsregion) compiz-0.9.11+14.04.20140409/plugins/opengl/src/fsregion/fsregion.cpp0000644000015301777760000000453212321343002025366 0ustar pbusernogroup00000000000000/* * Compiz opengl plugin, FullscreenRegion class * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "fsregion.h" namespace compiz { namespace opengl { FullscreenRegion::FullscreenRegion (const CompRect &output) : untouched (output), orig (output), allOutputs (output) { } FullscreenRegion::FullscreenRegion (const CompRect &output, const CompRegion &all) : untouched (output), orig (output), allOutputs (all) { } bool FullscreenRegion::isCoveredBy (const CompRegion ®ion, WinFlags flags) { bool fullscreen = false; if (!(flags & (Desktop | Alpha | NoOcclusionDetection)) && region == untouched && region == orig) { fullscreen = true; } untouched -= region; return fullscreen; } bool FullscreenRegion::allowRedirection (const CompRegion ®ion) { /* Don't allow existing unredirected windows that cover this * region to be redirected again as they were probably unredirected * on another monitor * Also be careful to not allow unredirection of offscreen windows * (outside of allOutputs). */ return region.intersects (orig) || !region.intersects (allOutputs); } } // namespace opengl } // namespace compiz compiz-0.9.11+14.04.20140409/plugins/opengl/src/fsregion/fsregion.h0000644000015301777760000000370712321343002025036 0ustar pbusernogroup00000000000000/* * Compiz opengl plugin, FullscreenRegion class * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef __COMPIZ_OPENGL_FSREGION_H #define __COMPIZ_OPENGL_FSREGION_H #include "core/rect.h" #include "core/region.h" namespace compiz { namespace opengl { class FullscreenRegion { public: typedef enum { Desktop = 1, Alpha = 2, NoOcclusionDetection = 3 } WinFlag; typedef unsigned int WinFlags; FullscreenRegion (const CompRect &output); FullscreenRegion (const CompRect &output, const CompRegion &all); // isCoveredBy is called for windows from TOP to BOTTOM bool isCoveredBy (const CompRegion ®ion, WinFlags flags = 0); bool allowRedirection (const CompRegion ®ion); private: CompRegion untouched; CompRegion orig; CompRegion allOutputs; }; } // namespace opengl } // namespace compiz #endif compiz-0.9.11+14.04.20140409/plugins/opengl/src/fsregion/CMakeLists.txt0000644000015301777760000000026212321343002025602 0ustar pbusernogroup00000000000000if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif () add_library (compiz_opengl_fsregion STATIC fsregion.cpp) target_link_libraries (compiz_opengl_fsregion compiz_core) compiz-0.9.11+14.04.20140409/plugins/opengl/src/screen.cpp0000644000015301777760000020720312321343002023215 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Linaro Ltd. * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman * Travis Watkins */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include "privates.h" #include "blacklist/blacklist.h" #include #include template class WrapableInterface; #ifndef USE_GLES /* * Historically most versions of fglrx have contained a nasty hack that checks * if argv[0] == "compiz", and downgrades OpenGL features including dropping * GLSL support (hides GL_ARB_shading_language_100). (LP #1026920) * This hack in fglrx is misguided and I'm told AMD have or will remove * it soon. In the mean time, modify argv[0] so it's not triggered... */ class DetectionWorkaround { public: DetectionWorkaround () { program_invocation_short_name[0] = 'C'; } ~DetectionWorkaround () { program_invocation_short_name[0] = 'c'; } }; #endif using namespace compiz::opengl; namespace GL { #ifdef USE_GLES EGLCreateImageKHRProc createImage; EGLDestroyImageKHRProc destroyImage; GLEGLImageTargetTexture2DOESProc eglImageTargetTexture; EGLPostSubBufferNVProc postSubBuffer = NULL; #else typedef int (*GLXSwapIntervalProc) (int interval); GLXBindTexImageProc bindTexImage = NULL; GLXReleaseTexImageProc releaseTexImage = NULL; GLXQueryDrawableProc queryDrawable = NULL; GLXCopySubBufferProc copySubBuffer = NULL; GLXGetVideoSyncProc getVideoSync = NULL; GLXWaitVideoSyncProc waitVideoSync = NULL; GLXSwapIntervalProc swapInterval = NULL; GLXGetFBConfigsProc getFBConfigs = NULL; GLXGetFBConfigAttribProc getFBConfigAttrib = NULL; GLXCreatePixmapProc createPixmap = NULL; GLXDestroyPixmapProc destroyPixmap = NULL; GLGenProgramsProc genPrograms = NULL; GLDeleteProgramsProc deletePrograms = NULL; GLBindProgramProc bindProgram = NULL; GLProgramStringProc programString = NULL; GLProgramParameter4fProc programEnvParameter4f = NULL; GLProgramParameter4fProc programLocalParameter4f = NULL; #endif GLActiveTextureProc activeTexture = NULL; GLClientActiveTextureProc clientActiveTexture = NULL; GLMultiTexCoord2fProc multiTexCoord2f = NULL; GLGenFramebuffersProc genFramebuffers = NULL; GLDeleteFramebuffersProc deleteFramebuffers = NULL; GLBindFramebufferProc bindFramebuffer = NULL; GLCheckFramebufferStatusProc checkFramebufferStatus = NULL; GLFramebufferTexture2DProc framebufferTexture2D = NULL; GLGenerateMipmapProc generateMipmap = NULL; GLBindBufferProc bindBuffer = NULL; GLDeleteBuffersProc deleteBuffers = NULL; GLGenBuffersProc genBuffers = NULL; GLBufferDataProc bufferData = NULL; GLBufferSubDataProc bufferSubData = NULL; GLGetShaderivProc getShaderiv = NULL; GLGetShaderInfoLogProc getShaderInfoLog = NULL; GLGetProgramivProc getProgramiv = NULL; GLGetProgramInfoLogProc getProgramInfoLog = NULL; GLCreateShaderProc createShader = NULL; GLShaderSourceProc shaderSource = NULL; GLCompileShaderProc compileShader = NULL; GLCreateProgramProc createProgram = NULL; GLAttachShaderProc attachShader = NULL; GLLinkProgramProc linkProgram = NULL; GLValidateProgramProc validateProgram = NULL; GLDeleteShaderProc deleteShader = NULL; GLDeleteProgramProc deleteProgram = NULL; GLUseProgramProc useProgram = NULL; GLGetUniformLocationProc getUniformLocation = NULL; GLUniform1fProc uniform1f = NULL; GLUniform1iProc uniform1i = NULL; GLUniform2fProc uniform2f = NULL; GLUniform2iProc uniform2i = NULL; GLUniform3fProc uniform3f = NULL; GLUniform3iProc uniform3i = NULL; GLUniform4fProc uniform4f = NULL; GLUniform4iProc uniform4i = NULL; GLUniformMatrix4fvProc uniformMatrix4fv = NULL; GLGetAttribLocationProc getAttribLocation = NULL; #ifndef USE_GLES GLCreateShaderObjectARBProc createShaderObjectARB = NULL; GLCreateProgramObjectARBProc createProgramObjectARB = NULL; GLCompileShaderARBProc compileShaderARB = NULL; GLShaderSourceARBProc shaderSourceARB = NULL; GLValidateProgramARBProc validateProgramARB = NULL; GLDeleteObjectARBProc deleteObjectARB = NULL; GLAttachObjectARBProc attachObjectARB = NULL; GLLinkProgramARBProc linkProgramARB = NULL; GLUseProgramObjectARBProc useProgramObjectARB = NULL; GLGetUniformLocationARBProc getUniformLocationARB = NULL; GLGetAttribLocationARBProc getAttribLocationARB = NULL; GLGetObjectParameterivProc getObjectParameteriv = NULL; GLGetInfoLogProc getInfoLog = NULL; #endif GLEnableVertexAttribArrayProc enableVertexAttribArray = NULL; GLDisableVertexAttribArrayProc disableVertexAttribArray = NULL; GLVertexAttribPointerProc vertexAttribPointer = NULL; GLGenRenderbuffersProc genRenderbuffers = NULL; GLDeleteRenderbuffersProc deleteRenderbuffers = NULL; GLFramebufferRenderbufferProc framebufferRenderbuffer = NULL; GLBindRenderbufferProc bindRenderbuffer = NULL; GLRenderbufferStorageProc renderbufferStorage = NULL; bool textureFromPixmap = true; bool textureRectangle = false; bool textureNonPowerOfTwo = false; bool textureNonPowerOfTwoMipmap = false; bool textureEnvCombine = false; bool textureEnvCrossbar = false; bool textureBorderClamp = false; bool textureCompression = false; GLint maxTextureSize = 0; bool fboSupported = false; bool fboEnabled = false; bool fboStencilSupported = false; bool vboSupported = false; bool vboEnabled = false; bool shaders = false; GLint maxTextureUnits = 1; bool bufferAge = false; bool canDoSaturated = false; bool canDoSlightlySaturated = false; unsigned int vsyncCount = 0; bool stencilBuffer = false; #ifndef USE_GLES GLuint createShaderARBWrapper (GLenum type) { return static_cast ((GL::createShaderObjectARB) (type)); } GLuint createProgramARBWrapper (GLenum type) { return static_cast ((GL::createProgramObjectARB) ()); } void shaderSourceARBWrapper (GLuint shader, GLsizei count, const GLchar **string, const GLint *length) { (GL::shaderSourceARB) (static_cast (shader), count, string, length); } void compileShaderARBWrapper (GLuint shader) { (GL::compileShaderARB) (static_cast (shader)); } void validateProgramARBWrapper (GLuint program) { (GL::validateProgramARB) (static_cast (program)); } void deleteShaderARBWrapper (GLuint shader) { (GL::deleteObjectARB) (static_cast (shader)); } void deleteProgramARBWrapper (GLuint program) { (GL::deleteObjectARB) (static_cast (program)); } void attachShaderARBWrapper (GLuint program, GLuint shader) { (GL::attachObjectARB) (static_cast (program), static_cast (shader)); } void linkProgramARBWrapper (GLuint program) { (GL::linkProgramARB) (static_cast (program)); } void useProgramARBWrapper (GLuint program) { (GL::useProgramObjectARB) (static_cast (program)); } int getUniformLocationARBWrapper (GLuint program, const GLchar *name) { return (GL::getUniformLocationARB) (static_cast (program), name); } int getAttribLocationARBWrapper (GLuint program, const GLchar *name) { return (GL::getAttribLocationARB) (static_cast (program), name); } void getProgramInfoLogARBWrapper (GLuint object, int maxLen, int *len, char *log) { (GL::getInfoLog) (static_cast (object), maxLen, len, log); } void getShaderInfoLogARBWrapper (GLuint object, int maxLen, int *len, char *log) { (GL::getInfoLog) (static_cast (object), maxLen, len, log); } void getShaderivARBWrapper (GLuint object, GLenum type, int *param) { (GL::getObjectParameteriv) (static_cast (object), type, param); } void getProgramivARBWrapper (GLuint object, GLenum type, int *param) { (GL::getObjectParameteriv) (static_cast (object), type, param); } #endif } CompOutput *targetOutput = NULL; /** * Callback object to create GLPrograms automatically when using GLVertexBuffer. */ class GLScreenAutoProgram : public GLVertexBuffer::AutoProgram { public: GLScreenAutoProgram (GLScreen *gScreen) : gScreen(gScreen) {} GLProgram *getProgram (GLShaderParameters ¶ms) { const GLShaderData *shaderData = gScreen->getShaderData (params); std::list tempShaders; tempShaders.push_back (shaderData); return gScreen->getProgram (tempShaders); } GLScreen *gScreen; }; #ifndef USE_GLES class BufferAgeFrameProvider : public FrameProvider { public: BufferAgeFrameProvider (Display *disp, GLXDrawable drawable) : mDisplay (disp), mDrawable (drawable) { } unsigned int getCurrentFrame () { unsigned int age = 0; (*GL::queryDrawable) (mDisplay, mDrawable, GLX_BACK_BUFFER_AGE_EXT, &age); return age; } void endFrame () { } void invalidateAll () { } bool providesPersistence () { return true; } bool alwaysPostprocess () { return false; } private: Display *mDisplay; GLXDrawable mDrawable; }; namespace compiz { namespace opengl { void swapIntervalGLX (Display *d, int interval) { // Docs: http://www.opengl.org/registry/specs/SGI/swap_control.txt if (GL::swapInterval) GL::swapInterval (interval); } int waitVSyncGLX (int wait, int remainder, unsigned int *count) { /* * While glXSwapBuffers/glXCopySubBufferMESA are meant to do a * flush before they blit, it is best to not let that happen. * Because that flush would occur after GL::waitVideoSync, causing * a delay and the final blit to be slightly out of sync resulting * in tearing. So we need to do a glFinish before we wait for * vsync, to absolutely minimize tearing. */ glFinish (); // Docs: http://www.opengl.org/registry/specs/SGI/video_sync.txt if (GL::waitVideoSync) return GL::waitVideoSync (wait, remainder, count); return 0; } } } #else namespace compiz { namespace opengl { void swapIntervalEGL (Display *display, int interval) { eglSwapInterval (eglGetDisplay (display), interval); } int waitVSyncEGL (int wait, int remainder, unsigned int *count) { /* not supported */ return 0; } } } #endif class UndefinedFrameProvider : public FrameProvider { public: unsigned int getCurrentFrame () { return 0; } void endFrame () { } void invalidateAll () { } bool providesPersistence () { return false; } bool alwaysPostprocess () { return false; } }; class PostprocessFrameProvider : public FrameProvider { public: PostprocessFrameProvider (GLFramebufferObject *object) : mObject (object), mAge (0) { } unsigned int getCurrentFrame () { /* We are now using this buffer, reset * age back to zero */ unsigned int lastAge = mAge; mAge = 0; return lastAge; } void endFrame () { ++mAge; } void invalidateAll () { mAge = 0; } bool providesPersistence () { return true; } bool alwaysPostprocess () { return true; } private: GLFramebufferObject *mObject; unsigned int mAge; }; class OptionalPostprocessFrameProvider : public FrameProvider { public: typedef boost::function PostprocessRequired; OptionalPostprocessFrameProvider (const FrameProvider::Ptr &backbuffer, const FrameProvider::Ptr &scratchbuffer, const PostprocessRequired &ppRequired) : mBackbuffer (backbuffer), mScratchbuffer (scratchbuffer), mPPRequired (ppRequired) { } unsigned int getCurrentFrame () { if (mPPRequired ()) return mScratchbuffer->getCurrentFrame (); else return mBackbuffer->getCurrentFrame (); } void endFrame () { mScratchbuffer->endFrame (); } void invalidateAll () { mScratchbuffer->invalidateAll (); } bool providesPersistence () { /* We are only as good as the backbuffer is */ return mBackbuffer->providesPersistence (); } bool alwaysPostprocess () { if (mPPRequired ()) return mScratchbuffer->alwaysPostprocess (); else return mBackbuffer->alwaysPostprocess (); } private: FrameProvider::Ptr mBackbuffer; FrameProvider::Ptr mScratchbuffer; PostprocessRequired mPPRequired; }; bool GLScreen::glInitContext (XVisualInfo *visinfo) { #ifndef USE_GLES DetectionWorkaround workaround; #endif #ifdef USE_GLES Display *xdpy; Window overlay; EGLDisplay dpy; EGLConfig config; EGLint major, minor; const char *eglExtensions, *glExtensions; XWindowAttributes attr; EGLint count, visualid; EGLConfig configs[1024]; CompOption::Vector o (0); const EGLint config_attribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, 1, EGL_GREEN_SIZE, 1, EGL_BLUE_SIZE, 1, EGL_ALPHA_SIZE, 0, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_CONFIG_CAVEAT, EGL_NONE, EGL_STENCIL_SIZE, 1, EGL_NONE }; const EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; xdpy = screen->dpy (); dpy = eglGetDisplay ((EGLNativeDisplayType)xdpy); if (!eglInitialize (dpy, &major, &minor)) { screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } eglBindAPI (EGL_OPENGL_ES_API); if (!eglChooseConfig (dpy, config_attribs, configs, 1024, &count)) { screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } if (!XGetWindowAttributes (xdpy, screen->root (), &attr)) { screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } EGLint val; int msaaBuffers = MAXSHORT; int msaaSamples = MAXSHORT; visualid = XVisualIDFromVisual (attr.visual); config = configs[0]; for (int i = 0; i < count; ++i) { eglGetConfigAttrib (dpy, configs[i], EGL_SAMPLE_BUFFERS, &val); if (val > msaaBuffers) continue; msaaBuffers = val; eglGetConfigAttrib (dpy, configs[i], EGL_SAMPLES, &val); if (val > msaaSamples) continue; msaaSamples = val; eglGetConfigAttrib (dpy, configs[i], EGL_NATIVE_VISUAL_ID, &val); if (val != visualid) continue; config = configs[i]; break; } overlay = CompositeScreen::get (screen)->overlay (); priv->surface = eglCreateWindowSurface (dpy, config, overlay, 0); if (priv->surface == EGL_NO_SURFACE) { compLogMessage ("opengl", CompLogLevelFatal, "eglCreateWindowSurface failed"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } // Do not preserve buffer contents on swap eglSurfaceAttrib (dpy, priv->surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED); priv->ctx = eglCreateContext (dpy, config, EGL_NO_CONTEXT, context_attribs); if (priv->ctx == EGL_NO_CONTEXT) { compLogMessage ("opengl", CompLogLevelFatal, "eglCreateContext failed"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } if (!eglMakeCurrent (dpy, priv->surface, priv->surface, priv->ctx)) { compLogMessage ("opengl", CompLogLevelFatal, "eglMakeCurrent failed"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } eglExtensions = (const char *) eglQueryString (dpy, EGL_EXTENSIONS); glExtensions = (const char *) glGetString (GL_EXTENSIONS); if (!glExtensions || !eglExtensions) { compLogMessage ("opengl", CompLogLevelFatal, "No valid GL extensions string found."); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } GL::textureFromPixmap = true; GL::textureNonPowerOfTwo = true; GL::fboSupported = true; GL::fboEnabled = true; GL::vboSupported = true; GL::vboEnabled = true; GL::shaders = true; GL::stencilBuffer = true; GL::maxTextureUnits = 4; glGetIntegerv (GL_MAX_TEXTURE_SIZE, &GL::maxTextureSize); GL::createImage = (GL::EGLCreateImageKHRProc) eglGetProcAddress ("eglCreateImageKHR"); GL::destroyImage = (GL::EGLDestroyImageKHRProc) eglGetProcAddress ("eglDestroyImageKHR"); GL::eglImageTargetTexture = (GL::GLEGLImageTargetTexture2DOESProc) eglGetProcAddress ("glEGLImageTargetTexture2DOES"); if (!strstr (eglExtensions, "EGL_KHR_image_pixmap") || !strstr (glExtensions, "GL_OES_EGL_image") || !GL::createImage || !GL::destroyImage || !GL::eglImageTargetTexture) { compLogMessage ("opengl", CompLogLevelFatal, "GL_OES_EGL_image is missing"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } // work around efika supporting GL_BGRA directly instead of via this extension #ifndef GL_BGRA if (!strstr (glExtensions, "GL_EXT_texture_format_BGRA8888")) { compLogMessage ("opengl", CompLogLevelFatal, "GL_EXT_texture_format_BGRA8888 is missing"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } #endif if (strstr (glExtensions, "GL_OES_texture_npot")) GL::textureNonPowerOfTwoMipmap = true; if (strstr (eglExtensions, "EGL_NV_post_sub_buffer")) GL::postSubBuffer = (GL::EGLPostSubBufferNVProc) eglGetProcAddress ("eglPostSubBufferNV"); GL::fboStencilSupported = GL::fboSupported && strstr (glExtensions, "GL_OES_packed_depth_stencil"); if (!GL::fboSupported && !GL::postSubBuffer) { compLogMessage ("opengl", CompLogLevelFatal, "GL_EXT_framebuffer_object or EGL_NV_post_sub_buffer are required"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } GL::activeTexture = glActiveTexture; GL::genFramebuffers = glGenFramebuffers; GL::deleteFramebuffers = glDeleteFramebuffers; GL::bindFramebuffer = glBindFramebuffer; GL::checkFramebufferStatus = glCheckFramebufferStatus; GL::framebufferTexture2D = glFramebufferTexture2D; GL::generateMipmap = glGenerateMipmap; GL::bindBuffer = glBindBuffer; GL::deleteBuffers = glDeleteBuffers; GL::genBuffers = glGenBuffers; GL::bufferData = glBufferData; GL::bufferSubData = glBufferSubData; GL::getShaderiv = glGetShaderiv; GL::getShaderInfoLog = glGetShaderInfoLog; GL::getProgramiv = glGetProgramiv; GL::getProgramInfoLog = glGetProgramInfoLog; GL::createShader = glCreateShader; GL::shaderSource = (GL::GLShaderSourceProc) glShaderSource; GL::compileShader = glCompileShader; GL::createProgram = glCreateProgram; GL::attachShader = glAttachShader; GL::linkProgram = glLinkProgram; GL::validateProgram = glValidateProgram; GL::deleteShader = glDeleteShader; GL::deleteProgram = glDeleteProgram; GL::useProgram = glUseProgram; GL::getUniformLocation = glGetUniformLocation; GL::uniform1f = glUniform1f; GL::uniform1i = glUniform1i; GL::uniform2f = glUniform2f; GL::uniform2i = glUniform2i; GL::uniform3f = glUniform3f; GL::uniform3i = glUniform3i; GL::uniform4f = glUniform4f; GL::uniform4i = glUniform4i; GL::uniformMatrix4fv = glUniformMatrix4fv; GL::getAttribLocation = glGetAttribLocation; GL::enableVertexAttribArray = glEnableVertexAttribArray; GL::disableVertexAttribArray = glDisableVertexAttribArray; GL::vertexAttribPointer = glVertexAttribPointer; GL::genRenderbuffers = glGenRenderbuffers; GL::deleteRenderbuffers = glDeleteRenderbuffers; GL::bindRenderbuffer = glBindRenderbuffer; GL::framebufferRenderbuffer = glFramebufferRenderbuffer; GL::renderbufferStorage = glRenderbufferStorage; glClearColor (0.0, 0.0, 0.0, 1.0); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glEnable (GL_BLEND); glEnable (GL_CULL_FACE); priv->updateView (); priv->lighting = false; priv->filter[NOTHING_TRANS_FILTER] = GLTexture::Fast; priv->filter[SCREEN_TRANS_FILTER] = GLTexture::Good; priv->filter[WINDOW_TRANS_FILTER] = GLTexture::Good; if (GL::textureFromPixmap) registerBindPixmap (EglTexture::bindPixmapToTexture); priv->incorrectRefreshRate = false; #else Display *dpy = screen->dpy (); const char *glExtensions; GLfloat globalAmbient[] = { 0.1f, 0.1f, 0.1f, 0.1f }; GLfloat ambientLight[] = { 0.0f, 0.0f, 0.0f, 0.0f }; GLfloat diffuseLight[] = { 0.9f, 0.9f, 0.9f, 0.9f }; GLfloat light0Position[] = { -0.5f, 0.5f, -9.0f, 1.0f }; CompOption::Vector o (0); priv->ctx = glXCreateContext (dpy, visinfo, NULL, True); if (!priv->ctx) { compLogMessage ("opengl", CompLogLevelWarn, "glXCreateContext with direct rendering failed - trying indirect"); /* force Mesa libGL into indirect rendering mode, because glXQueryExtensionsString is context-independant */ setenv ("LIBGL_ALWAYS_INDIRECT", "1", True); priv->ctx = glXCreateContext(dpy, visinfo, NULL, true); if (!priv->ctx) { compLogMessage ("opengl", CompLogLevelWarn, "glXCreateContext failed"); XFree (visinfo); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } } XFree (visinfo); glXMakeCurrent (dpy, CompositeScreen::get (screen)->output (), priv->ctx); glExtensions = (const char *) glGetString (GL_EXTENSIONS); if (!glExtensions) { compLogMessage ("opengl", CompLogLevelFatal, "No valid GL extensions string found."); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } const char *glVendor = (const char *) glGetString (GL_VENDOR); const char *glRenderer = (const char *) glGetString (GL_RENDERER); const char *glVersion = (const char *) glGetString (GL_VERSION); priv->glVendor = glVendor; priv->glRenderer = glRenderer; priv->glVersion = glVersion; if (glRenderer != NULL && (strcmp (glRenderer, "Software Rasterizer") == 0 || strcmp (glRenderer, "Mesa X11") == 0)) { compLogMessage ("opengl", CompLogLevelFatal, "Software rendering detected"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } priv->commonFrontbuffer = true; priv->incorrectRefreshRate = false; if (glRenderer != NULL && strstr (glRenderer, "on llvmpipe")) { /* * Most drivers use the same frontbuffer infrastructure for * swapbuffers as well as subbuffer copying. However there are some * odd exceptions like LLVMpipe (and SGX-something?) that use separate * buffers, so we can't dynamically switch between buffer swapping and * copying in those cases. */ priv->commonFrontbuffer = false; } if (glVendor != NULL && strstr (glVendor, "NVIDIA")) { /* * NVIDIA provides an incorrect refresh rate, we need to * force 60Hz */ priv->incorrectRefreshRate = true; } if (strstr (glExtensions, "GL_ARB_texture_non_power_of_two")) GL::textureNonPowerOfTwo = true; GL::textureNonPowerOfTwoMipmap = GL::textureNonPowerOfTwo; glGetIntegerv (GL_MAX_TEXTURE_SIZE, &GL::maxTextureSize); if (strstr (glExtensions, "GL_NV_texture_rectangle") || strstr (glExtensions, "GL_EXT_texture_rectangle") || strstr (glExtensions, "GL_ARB_texture_rectangle")) { GL::textureRectangle = true; if (!GL::textureNonPowerOfTwo) { GLint maxTextureSize; glGetIntegerv (GL_MAX_RECTANGLE_TEXTURE_SIZE_NV, &maxTextureSize); if (maxTextureSize > GL::maxTextureSize) GL::maxTextureSize = maxTextureSize; } } if (!(GL::textureRectangle || GL::textureNonPowerOfTwo)) { compLogMessage ("opengl", CompLogLevelFatal, "Support for non power of two textures missing"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } if (strstr (glExtensions, "GL_ARB_texture_env_combine")) { GL::textureEnvCombine = true; /* XXX: GL_NV_texture_env_combine4 need special code but it seams to be working anyway for now... */ if (strstr (glExtensions, "GL_ARB_texture_env_crossbar") || strstr (glExtensions, "GL_NV_texture_env_combine4")) GL::textureEnvCrossbar = true; } if (strstr (glExtensions, "GL_ARB_texture_border_clamp") || strstr (glExtensions, "GL_SGIS_texture_border_clamp")) GL::textureBorderClamp = true; GL::maxTextureUnits = 1; if (strstr (glExtensions, "GL_ARB_multitexture")) { GL::activeTexture = (GL::GLActiveTextureProc) getProcAddress ("glActiveTexture"); GL::clientActiveTexture = (GL::GLClientActiveTextureProc) getProcAddress ("glClientActiveTexture"); GL::multiTexCoord2f = (GL::GLMultiTexCoord2fProc) getProcAddress ("glMultiTexCoord2f"); if (GL::activeTexture && GL::clientActiveTexture && GL::multiTexCoord2f) glGetIntegerv (GL_MAX_TEXTURE_UNITS_ARB, &GL::maxTextureUnits); } if (strstr (glExtensions, "GL_EXT_framebuffer_object")) { GL::genFramebuffers = (GL::GLGenFramebuffersProc) getProcAddress ("glGenFramebuffersEXT"); GL::deleteFramebuffers = (GL::GLDeleteFramebuffersProc) getProcAddress ("glDeleteFramebuffersEXT"); GL::bindFramebuffer = (GL::GLBindFramebufferProc) getProcAddress ("glBindFramebufferEXT"); GL::checkFramebufferStatus = (GL::GLCheckFramebufferStatusProc) getProcAddress ("glCheckFramebufferStatusEXT"); GL::framebufferTexture2D = (GL::GLFramebufferTexture2DProc) getProcAddress ("glFramebufferTexture2DEXT"); GL::generateMipmap = (GL::GLGenerateMipmapProc) getProcAddress ("glGenerateMipmapEXT"); GL::genRenderbuffers = (GL::GLGenRenderbuffersProc) getProcAddress ("glGenRenderbuffersEXT"); GL::deleteRenderbuffers = (GL::GLDeleteRenderbuffersProc) getProcAddress ("glDeleteRenderbuffersEXT"); GL::bindRenderbuffer = (GL::GLBindRenderbufferProc) getProcAddress ("glBindRenderbufferEXT"); GL::framebufferRenderbuffer = (GL::GLFramebufferRenderbufferProc) getProcAddress ("glFramebufferRenderbufferEXT"); GL::renderbufferStorage = (GL::GLRenderbufferStorageProc) getProcAddress ("glRenderbufferStorageEXT"); if (GL::genFramebuffers && GL::deleteFramebuffers && GL::bindFramebuffer && GL::checkFramebufferStatus && GL::framebufferTexture2D && GL::generateMipmap && GL::genRenderbuffers && GL::deleteRenderbuffers && GL::bindRenderbuffer && GL::framebufferRenderbuffer && GL::renderbufferStorage ) GL::fboSupported = true; } GL::fboStencilSupported = GL::fboSupported && strstr (glExtensions, "GL_EXT_packed_depth_stencil"); if (strstr (glExtensions, "GL_ARB_vertex_buffer_object")) { GL::bindBuffer = (GL::GLBindBufferProc) getProcAddress ("glBindBufferARB"); GL::deleteBuffers = (GL::GLDeleteBuffersProc) getProcAddress ("glDeleteBuffersARB"); GL::genBuffers = (GL::GLGenBuffersProc) getProcAddress ("glGenBuffersARB"); GL::bufferData = (GL::GLBufferDataProc) getProcAddress ("glBufferDataARB"); GL::bufferSubData = (GL::GLBufferSubDataProc) getProcAddress ("glBufferSubDataARB"); if (GL::bindBuffer && GL::deleteBuffers && GL::genBuffers && GL::bufferData && GL::bufferSubData) GL::vboSupported = true; } priv->updateRenderMode (); if (strstr (glExtensions, "GL_ARB_fragment_shader") && strstr (glExtensions, "GL_ARB_vertex_shader") && strstr (glExtensions, "GL_ARB_shader_objects") && strstr (glExtensions, "GL_ARB_shading_language_100")) { GL::getShaderiv = (GL::GLGetShaderivProc) GL::getShaderivARBWrapper; GL::getShaderInfoLog = (GL::GLGetShaderInfoLogProc) GL::getShaderInfoLogARBWrapper; GL::getProgramiv = (GL::GLGetProgramivProc) GL::getProgramivARBWrapper; GL::getProgramInfoLog = (GL::GLGetProgramInfoLogProc) GL::getProgramInfoLogARBWrapper; GL::getObjectParameteriv = (GL::GLGetObjectParameterivProc) getProcAddress ("glGetObjectParameterivARB"); GL::getInfoLog = (GL::GLGetInfoLogProc) getProcAddress ("glGetInfoLogARB"); GL::createShader = (GL::GLCreateShaderProc) GL::createShaderARBWrapper; GL::createShaderObjectARB = (GL::GLCreateShaderObjectARBProc) getProcAddress ("glCreateShaderObjectARB"); GL::shaderSource = (GL::GLShaderSourceProc) GL::shaderSourceARBWrapper; GL::shaderSourceARB = (GL::GLShaderSourceARBProc) getProcAddress ("glShaderSourceARB"); GL::compileShader = (GL::GLCompileShaderProc) GL::compileShaderARBWrapper; GL::compileShaderARB = (GL::GLCompileShaderARBProc) getProcAddress ("glCompileShaderARB"); GL::createProgram = (GL::GLCreateProgramProc) GL::createProgramARBWrapper; GL::createProgramObjectARB = (GL::GLCreateProgramObjectARBProc) getProcAddress ("glCreateProgramObjectARB"); GL::attachShader = GL::attachShaderARBWrapper; GL::attachObjectARB = (GL::GLAttachObjectARBProc) getProcAddress ("glAttachObjectARB"); GL::linkProgram = GL::linkProgramARBWrapper; GL::linkProgramARB = (GL::GLLinkProgramARBProc) getProcAddress ("glLinkProgramARB"); GL::validateProgram = GL::validateProgramARBWrapper; GL::validateProgramARB = (GL::GLValidateProgramARBProc) getProcAddress ("glValidateProgramARB"); GL::deleteShader = GL::deleteShaderARBWrapper; GL::deleteProgram = GL::deleteProgramARBWrapper; GL::deleteObjectARB = (GL::GLDeleteObjectARBProc) getProcAddress ("glDeleteObjectARB"); GL::useProgram = GL::useProgramARBWrapper; GL::useProgramObjectARB = (GL::GLUseProgramObjectARBProc) getProcAddress ("glUseProgramObjectARB"); GL::getUniformLocation = GL::getUniformLocationARBWrapper; GL::getUniformLocationARB = (GL::GLGetUniformLocationARBProc) getProcAddress ("glGetUniformLocationARB"); GL::uniform1f = (GL::GLUniform1fProc) getProcAddress ("glUniform1fARB"); GL::uniform1i = (GL::GLUniform1iProc) getProcAddress ("glUniform1iARB"); GL::uniform2f = (GL::GLUniform2fProc) getProcAddress ("glUniform2fARB"); GL::uniform2i = (GL::GLUniform2iProc) getProcAddress ("glUniform2iARB"); GL::uniform3f = (GL::GLUniform3fProc) getProcAddress ("glUniform3fARB"); GL::uniform3i = (GL::GLUniform3iProc) getProcAddress ("glUniform3iARB"); GL::uniform4f = (GL::GLUniform4fProc) getProcAddress ("glUniform4fARB"); GL::uniform4i = (GL::GLUniform4iProc) getProcAddress ("glUniform4iARB"); GL::uniformMatrix4fv = (GL::GLUniformMatrix4fvProc) getProcAddress ("glUniformMatrix4fvARB"); GL::getAttribLocation = (GL::GLGetAttribLocationProc) GL::getAttribLocationARBWrapper; GL::getAttribLocationARB = (GL::GLGetAttribLocationARBProc) getProcAddress ("glGetAttribLocationARB"); GL::enableVertexAttribArray = (GL::GLEnableVertexAttribArrayProc) getProcAddress ("glEnableVertexAttribArrayARB"); GL::disableVertexAttribArray = (GL::GLDisableVertexAttribArrayProc) getProcAddress ("glDisableVertexAttribArrayARB"); GL::vertexAttribPointer = (GL::GLVertexAttribPointerProc) getProcAddress ("glVertexAttribPointerARB"); GL::shaders = true; } if (strstr (glExtensions, "GL_ARB_texture_compression")) GL::textureCompression = true; glClearColor (0.0, 0.0, 0.0, 1.0); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glEnable (GL_CULL_FACE); glDisable (GL_BLEND); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glColor4usv (defaultColor); if (GL::textureEnvCombine && GL::maxTextureUnits >= 2) { GL::canDoSaturated = true; if (GL::textureEnvCrossbar && GL::maxTextureUnits >= 4) GL::canDoSlightlySaturated = true; } priv->updateView (); glLightModelfv (GL_LIGHT_MODEL_AMBIENT, globalAmbient); glEnable (GL_LIGHT0); glLightfv (GL_LIGHT0, GL_AMBIENT, ambientLight); glLightfv (GL_LIGHT0, GL_DIFFUSE, diffuseLight); glLightfv (GL_LIGHT0, GL_POSITION, light0Position); glColorMaterial (GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glNormal3f (0.0f, 0.0f, -1.0f); priv->lighting = false; priv->filter[NOTHING_TRANS_FILTER] = GLTexture::Fast; priv->filter[SCREEN_TRANS_FILTER] = GLTexture::Good; priv->filter[WINDOW_TRANS_FILTER] = GLTexture::Good; if (GL::textureFromPixmap) registerBindPixmap (TfpTexture::bindPixmapToTexture); #endif /* Scratch framebuffer must be allocated before updating * the backbuffer provider */ if (GL::fboSupported) { priv->scratchFbo.reset (new GLFramebufferObject ()); priv->scratchFbo->allocate (*screen, NULL, GL_BGRA); } GLVertexBuffer::streamingBuffer ()->setAutoProgram (priv->autoProgram); priv->updateFrameProvider (); return true; } template class PluginClassHandler; GLScreen::GLScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateGLScreen (this)) { #ifndef USE_GLES DetectionWorkaround workaround; #endif XVisualInfo *visinfo = NULL; #ifndef USE_GLES Display *dpy = s->dpy (); XVisualInfo templ; GLXFBConfig *fbConfigs; int defaultDepth, nvisinfo, nElements, value, i; const char *glxExtensions; XWindowAttributes attr; CompOption::Vector o (0); if (!XGetWindowAttributes (dpy, s->root (), &attr)) { screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } templ.visualid = XVisualIDFromVisual (attr.visual); visinfo = XGetVisualInfo (dpy, VisualIDMask, &templ, &nvisinfo); if (!nvisinfo) { compLogMessage ("opengl", CompLogLevelFatal, "Couldn't get visual info for default visual"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } defaultDepth = visinfo->depth; glXGetConfig (dpy, visinfo, GLX_USE_GL, &value); if (!value) { compLogMessage ("opengl", CompLogLevelFatal, "Root visual is not a GL visual"); XFree (visinfo); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } glXGetConfig (dpy, visinfo, GLX_DOUBLEBUFFER, &value); if (!value) { compLogMessage ("opengl", CompLogLevelFatal, "Root visual is not a double buffered GL visual"); XFree (visinfo); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } glxExtensions = glXQueryExtensionsString (dpy, s->screenNum ()); if (glxExtensions == NULL) { compLogMessage ("opengl", CompLogLevelFatal, "glXQueryExtensionsString is NULL for screen %d", s->screenNum ()); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } if (!strstr (glxExtensions, "GLX_SGIX_fbconfig")) { compLogMessage ("opengl", CompLogLevelFatal, "GLX_SGIX_fbconfig is missing"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } if (strstr (glxExtensions, "GLX_EXT_buffer_age")) { compLogMessage ("opengl", CompLogLevelInfo, "GLX_EXT_buffer_age is supported"); GL::bufferAge = true; } priv->getProcAddress = (GL::GLXGetProcAddressProc) getProcAddress ("glXGetProcAddressARB"); GL::bindTexImage = (GL::GLXBindTexImageProc) getProcAddress ("glXBindTexImageEXT"); GL::releaseTexImage = (GL::GLXReleaseTexImageProc) getProcAddress ("glXReleaseTexImageEXT"); GL::queryDrawable = (GL::GLXQueryDrawableProc) getProcAddress ("glXQueryDrawable"); GL::getFBConfigs = (GL::GLXGetFBConfigsProc) getProcAddress ("glXGetFBConfigs"); GL::getFBConfigAttrib = (GL::GLXGetFBConfigAttribProc) getProcAddress ("glXGetFBConfigAttrib"); GL::createPixmap = (GL::GLXCreatePixmapProc) getProcAddress ("glXCreatePixmap"); GL::destroyPixmap = (GL::GLXDestroyPixmapProc) getProcAddress ("glXDestroyPixmap"); if (!strstr (glxExtensions, "GLX_EXT_texture_from_pixmap") || !GL::bindTexImage || !GL::releaseTexImage) { compLogMessage ("opengl", CompLogLevelFatal, "GLX_EXT_texture_from_pixmap is missing"); GL::textureFromPixmap = false; } else GL::textureFromPixmap = true; if (!GL::queryDrawable || !GL::getFBConfigs || !GL::getFBConfigAttrib || !GL::createPixmap || !GL::destroyPixmap) { compLogMessage ("opengl", CompLogLevelFatal, "fbconfig functions missing"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } if (strstr (glxExtensions, "GLX_MESA_copy_sub_buffer")) GL::copySubBuffer = (GL::GLXCopySubBufferProc) getProcAddress ("glXCopySubBufferMESA"); if (strstr (glxExtensions, "GLX_SGI_video_sync")) { GL::getVideoSync = (GL::GLXGetVideoSyncProc) getProcAddress ("glXGetVideoSyncSGI"); GL::waitVideoSync = (GL::GLXWaitVideoSyncProc) getProcAddress ("glXWaitVideoSyncSGI"); } if (strstr (glxExtensions, "GLX_SGI_swap_control")) { GL::swapInterval = (GL::GLXSwapIntervalProc) getProcAddress ("glXSwapIntervalSGI"); } fbConfigs = (*GL::getFBConfigs) (dpy, s->screenNum (), &nElements); GL::stencilBuffer = false; for (i = 0; i <= MAX_DEPTH; i++) { int j, db, stencil, depth, alpha, mipmap, msaaBuffers, msaaSamples, rgba; priv->glxPixmapFBConfigs[i].fbConfig = NULL; priv->glxPixmapFBConfigs[i].mipmap = 0; priv->glxPixmapFBConfigs[i].yInverted = 0; priv->glxPixmapFBConfigs[i].textureFormat = 0; priv->glxPixmapFBConfigs[i].textureTargets = 0; db = MAXSHORT; stencil = MAXSHORT; depth = MAXSHORT; msaaBuffers = MAXSHORT; msaaSamples = MAXSHORT; mipmap = 0; rgba = 0; for (j = 0; j < nElements; j++) { XVisualInfo *vi; int visualDepth; vi = glXGetVisualFromFBConfig (dpy, fbConfigs[j]); if (vi == NULL) continue; visualDepth = vi->depth; XFree (vi); if (visualDepth != i) continue; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_ALPHA_SIZE, &alpha); (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_BUFFER_SIZE, &value); if (value != i && (value - alpha) != i) continue; value = 0; if (i == 32) { (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_BIND_TO_TEXTURE_RGBA_EXT, &value); if (value) { rgba = 1; priv->glxPixmapFBConfigs[i].textureFormat = GLX_TEXTURE_FORMAT_RGBA_EXT; } } if (!value) { if (rgba) continue; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_BIND_TO_TEXTURE_RGB_EXT, &value); if (!value) continue; priv->glxPixmapFBConfigs[i].textureFormat = GLX_TEXTURE_FORMAT_RGB_EXT; } (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_DOUBLEBUFFER, &value); if (value > db) continue; db = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_STENCIL_SIZE, &value); if (value > stencil) continue; stencil = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_DEPTH_SIZE, &value); if (value > depth) continue; depth = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_SAMPLE_BUFFERS, &value); if (value > msaaBuffers) continue; msaaBuffers = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_SAMPLES, &value); if (value > msaaSamples) continue; msaaSamples = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_BIND_TO_MIPMAP_TEXTURE_EXT, &value); if (value < mipmap) continue; mipmap = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_Y_INVERTED_EXT, &value); priv->glxPixmapFBConfigs[i].yInverted = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_BIND_TO_TEXTURE_TARGETS_EXT, &value); priv->glxPixmapFBConfigs[i].textureTargets = value; priv->glxPixmapFBConfigs[i].fbConfig = fbConfigs[j]; priv->glxPixmapFBConfigs[i].mipmap = mipmap; } if (i == defaultDepth) if (stencil != MAXSHORT) GL::stencilBuffer = true; } if (nElements) XFree (fbConfigs); if (!priv->glxPixmapFBConfigs[defaultDepth].fbConfig) { compLogMessage ("opengl", CompLogLevelFatal, "No GLXFBConfig for default depth, " "this isn't going to work."); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); } #endif if (!glInitContext (visinfo)) setFailed (); } GLScreen::~GLScreen () { if (priv->hasCompositing) CompositeScreen::get (screen)->unregisterPaintHandler (); #ifdef USE_GLES Display *xdpy = screen->dpy (); EGLDisplay dpy = eglGetDisplay (xdpy); eglMakeCurrent (dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (priv->ctx != EGL_NO_CONTEXT) eglDestroyContext (dpy, priv->ctx); eglDestroySurface (dpy, priv->surface); eglTerminate (dpy); eglReleaseThread (); #else glXMakeCurrent (screen->dpy (), None, NULL); if (priv->ctx) glXDestroyContext (screen->dpy (), priv->ctx); #endif delete priv; } PrivateGLScreen::PrivateGLScreen (GLScreen *gs) : gScreen (gs), cScreen (CompositeScreen::get (screen)), textureFilter (GL_LINEAR), backgroundTextures (), backgroundLoaded (false), rasterPos (0, 0), projection (NULL), clearBuffers (true), lighting (false), #ifndef USE_GLES ctx (NULL), getProcAddress (0), doubleBuffer (screen->dpy (), *screen, cScreen->output ()), #else ctx (EGL_NO_CONTEXT), doubleBuffer (screen->dpy (), *screen, surface), #endif scratchFbo (), outputRegion (), refreshSubBuffer (false), lastMask (0), bindPixmap (), hasCompositing (false), commonFrontbuffer (true), incorrectRefreshRate (false), programCache (new GLProgramCache (30)), shaderCache (), autoProgram (new GLScreenAutoProgram(gs)), rootPixmapCopy (None), rootPixmapSize (), frameProvider (), glVendor (NULL), glRenderer (NULL), glVersion (NULL), postprocessingRequired (false), prevRegex (), prevBlacklisted (false) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); } PrivateGLScreen::~PrivateGLScreen () { delete projection; delete programCache; delete autoProgram; if (rootPixmapCopy) XFreePixmap (screen->dpy (), rootPixmapCopy); } GLushort defaultColor[4] = { 0xffff, 0xffff, 0xffff, 0xffff }; GLenum GLScreen::textureFilter () { return priv->textureFilter; } void GLScreen::setTextureFilter (GLenum filter) { priv->textureFilter = filter; } void PrivateGLScreen::handleEvent (XEvent *event) { CompWindow *w; screen->handleEvent (event); switch (event->type) { case ConfigureNotify: if (event->xconfigure.window == screen->root ()) updateScreenBackground (); break; case PropertyNotify: if (event->xproperty.atom == Atoms::xBackground[0] || event->xproperty.atom == Atoms::xBackground[1]) { if (event->xproperty.window == screen->root ()) gScreen->updateBackground (); } else if (event->xproperty.atom == Atoms::winOpacity || event->xproperty.atom == Atoms::winBrightness || event->xproperty.atom == Atoms::winSaturation) { w = screen->findWindow (event->xproperty.window); if (w) GLWindow::get (w)->updatePaintAttribs (); } else if (event->xproperty.atom == Atoms::wmIcon) { w = screen->findWindow (event->xproperty.window); if (w) GLWindow::get (w)->priv->icons.clear (); } break; default: if (event->type == cScreen->damageEvent () + XDamageNotify) { XDamageNotifyEvent *de = (XDamageNotifyEvent *) event; #ifdef USE_GLES std::map::iterator it = boundPixmapTex.find (de->damage); #else std::map::iterator it = boundPixmapTex.find (de->damage); #endif if (it != boundPixmapTex.end ()) { it->second->damaged = true; } /* XXX: It would be nice if we could also update * the background of the root window when the root * window pixmap changes, but unfortunately XDamage * reports damage events any time a child of the root * window gets a damage event, which means that we'd * be recopying the root window pixmap all the time * which is no good, so don't do that */ } break; } } void GLScreen::clearTargetOutput (unsigned int mask) { clearOutput (targetOutput, mask); } static void frustum (GLfloat *m, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat nearval, GLfloat farval) { GLfloat x, y, a, b, c, d; x = (2.0 * nearval) / (right - left); y = (2.0 * nearval) / (top - bottom); a = (right + left) / (right - left); b = (top + bottom) / (top - bottom); c = -(farval + nearval) / ( farval - nearval); d = -(2.0 * farval * nearval) / (farval - nearval); #define M(row,col) m[col * 4 + row] M(0,0) = x; M(0,1) = 0.0f; M(0,2) = a; M(0,3) = 0.0f; M(1,0) = 0.0f; M(1,1) = y; M(1,2) = b; M(1,3) = 0.0f; M(2,0) = 0.0f; M(2,1) = 0.0f; M(2,2) = c; M(2,3) = d; M(3,0) = 0.0f; M(3,1) = 0.0f; M(3,2) = -1.0f; M(3,3) = 0.0f; #undef M } static void perspective (GLfloat *m, GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar) { GLfloat xmin, xmax, ymin, ymax; ymax = zNear * tan (fovy * M_PI / 360.0); ymin = -ymax; xmin = ymin * aspect; xmax = ymax * aspect; frustum (m, xmin, xmax, ymin, ymax, zNear, zFar); } void PrivateGLScreen::updateView () { GLfloat projection_array[16]; #ifndef USE_GLES glMatrixMode (GL_PROJECTION); glLoadIdentity (); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glDepthRange (0, 1); glRasterPos2f (0, 0); #endif glViewport (-1, -1, 2, 2); rasterPos = CompPoint (0, 0); perspective (projection_array, 60.0f, 1.0f, 0.1f, 100.0f); if (projection != NULL) delete projection; projection = new GLMatrix (projection_array); #ifndef USE_GLES glMatrixMode (GL_PROJECTION); glLoadIdentity (); glMultMatrixf (projection_array); glMatrixMode (GL_MODELVIEW); #endif CompRegion region (screen->region ()); /* remove all output regions from visible screen region */ foreach (CompOutput &o, screen->outputDevs ()) region -= o; /* we should clear color buffers before swapping if we have visible regions without output */ clearBuffers = !region.isEmpty (); gScreen->setDefaultViewport (); } void PrivateGLScreen::outputChangeNotify () { screen->outputChangeNotify (); frameProvider->invalidateAll (); if (scratchFbo) scratchFbo->allocate (*screen, NULL, GL_BGRA); updateView (); } #ifndef USE_GLES GL::FuncPtr GLScreen::getProcAddress (const char *name) { static void *dlhand = NULL; GL::FuncPtr funcPtr = NULL; if (priv->getProcAddress) funcPtr = priv->getProcAddress ((GLubyte *) name); if (!funcPtr) { if (!dlhand) dlhand = dlopen ("libopengl.so", RTLD_LAZY); if (dlhand) { dlerror (); funcPtr = (GL::FuncPtr) dlsym (dlhand, name); if (dlerror () != NULL) funcPtr = NULL; } } return funcPtr; } #endif void PrivateGLScreen::updateScreenBackground () { Display *dpy = screen->dpy (); Atom pixmapAtom, actualType; int actualFormat, i, status; unsigned int width = 1, height = 1, depth = 0; unsigned long nItems; unsigned long bytesAfter; unsigned char *prop; Pixmap pixmap = None; pixmapAtom = XInternAtom (dpy, "PIXMAP", false); for (i = 0; pixmap == 0 && i < 2; i++) { status = XGetWindowProperty (dpy, screen->root (), Atoms::xBackground[i], 0, 4, false, AnyPropertyType, &actualType, &actualFormat, &nItems, &bytesAfter, &prop); if (status == Success && nItems && prop) { if (actualType == pixmapAtom && actualFormat == 32 && nItems == 1) { Pixmap p = None; memcpy (&p, prop, 4); if (p) { unsigned int ui; int i; Window w; if (XGetGeometry (dpy, p, &w, &i, &i, &width, &height, &ui, &depth)) { if ((int) depth == screen->attrib ().depth) pixmap = p; } } } XFree (prop); } } if (pixmap) { backgroundTextures = GLTexture::bindPixmapToTexture (pixmap, width, height, depth); if (backgroundTextures.empty ()) { compLogMessage ("core", CompLogLevelWarn, "Couldn't bind background pixmap 0x%x to " "texture", (int) pixmap); } } else { backgroundTextures.clear (); } if (backgroundTextures.empty ()) { CompSize size; /* Try to get the root window background */ XGCValues gcv; GC gc; gcv.graphics_exposures = false; gcv.subwindow_mode = IncludeInferiors; gc = XCreateGC (screen->dpy (), screen->root (), GCGraphicsExposures | GCSubwindowMode, &gcv); if (rootPixmapSize.width () != screen->width () || rootPixmapSize.height () != screen->height ()) { if (rootPixmapCopy) XFreePixmap (screen->dpy (), rootPixmapCopy); rootPixmapSize = CompSize (screen->width (), screen->height ()); rootPixmapCopy = XCreatePixmap (screen->dpy (), screen->root (), rootPixmapSize.width (), rootPixmapSize.height (), DefaultDepth (screen->dpy (), DefaultScreen (screen->dpy ()))); backgroundTextures = GLTexture::bindPixmapToTexture (rootPixmapCopy, rootPixmapSize.width (), rootPixmapSize.height (), DefaultDepth (screen->dpy (), DefaultScreen (screen->dpy ()))); if (backgroundTextures.empty ()) { compLogMessage ("core", CompLogLevelWarn, "Couldn't bind background pixmap 0x%x to " "texture", (int) screen->width ()); } } if (rootPixmapCopy) { XCopyArea (screen->dpy (), screen->root (), rootPixmapCopy, gc, 0, 0, screen->width (), screen->height (), 0, 0); XSync (screen->dpy (), false); } else { backgroundTextures.clear (); } XFreeGC(dpy, gc); } } void GLScreen::setTexEnvMode (GLenum mode) { #ifndef USE_GLES if (priv->lighting) glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); else glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode); #endif } void GLScreen::setLighting (bool lighting) { #ifndef USE_GLES if (priv->lighting != lighting) { if (!priv->optionGetLighting ()) lighting = false; if (lighting) { glEnable (GL_COLOR_MATERIAL); glEnable (GL_LIGHTING); } else { glDisable (GL_COLOR_MATERIAL); glDisable (GL_LIGHTING); } priv->lighting = lighting; setTexEnvMode (GL_REPLACE); } #endif } bool GLScreenInterface::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) WRAPABLE_DEF (glPaintOutput, sAttrib, transform, region, output, mask) void GLScreenInterface::glPaintTransformedOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) WRAPABLE_DEF (glPaintTransformedOutput, sAttrib, transform, region, output, mask) void GLScreenInterface::glApplyTransform (const GLScreenPaintAttrib &sAttrib, CompOutput *output, GLMatrix *transform) WRAPABLE_DEF (glApplyTransform, sAttrib, output, transform) void GLScreenInterface::glEnableOutputClipping (const GLMatrix &transform, const CompRegion ®ion, CompOutput *output) WRAPABLE_DEF (glEnableOutputClipping, transform, region, output) void GLScreenInterface::glDisableOutputClipping () WRAPABLE_DEF (glDisableOutputClipping) GLMatrix * GLScreenInterface::projectionMatrix () WRAPABLE_DEF (projectionMatrix) bool GLScreenInterface::glPaintCompositedOutputRequired () WRAPABLE_DEF (glPaintCompositedOutputRequired) void GLScreenInterface::glPaintCompositedOutput (const CompRegion ®ion, GLFramebufferObject *fbo, unsigned int mask) WRAPABLE_DEF (glPaintCompositedOutput, region, fbo, mask) void GLScreenInterface::glBufferStencil(const GLMatrix &matrix, GLVertexBuffer &vertexBuffer, CompOutput *output) WRAPABLE_DEF (glBufferStencil, matrix, vertexBuffer, output) GLMatrix * GLScreen::projectionMatrix () { WRAPABLE_HND_FUNCTN_RETURN (GLMatrix *, projectionMatrix) return priv->projection; } void GLScreen::updateBackground () { priv->backgroundTextures.clear (); if (priv->backgroundLoaded) { priv->backgroundLoaded = false; CompositeScreen::get (screen)->damageScreen (); } } bool GLScreen::lighting () { return priv->lighting; } GLTexture::Filter GLScreen::filter (int filter) { return priv->filter[filter]; } void GLScreen::setFilter (int num, GLTexture::Filter filter) { priv->filter[num] = filter; } #ifndef USE_GLES GLFBConfig* GLScreen::glxPixmapFBConfig (unsigned int depth) { return &priv->glxPixmapFBConfigs[depth]; } #endif void GLScreen::clearOutput (CompOutput *output, unsigned int mask) { BoxPtr pBox = &output->region ()->extents; if (pBox->x1 != 0 || pBox->y1 != 0 || pBox->x2 != (int) screen->width () || pBox->y2 != (int) screen->height ()) { glEnable (GL_SCISSOR_TEST); glScissor (pBox->x1, screen->height () - pBox->y2, pBox->x2 - pBox->x1, pBox->y2 - pBox->y1); glClear (mask); glDisable (GL_SCISSOR_TEST); } else { glClear (mask); } } void GLScreen::setDefaultViewport () { priv->lastViewport.x = screen->outputDevs ()[0].x1 (); priv->lastViewport.y = screen->height () - screen->outputDevs ()[0].y2 (); priv->lastViewport.width = screen->outputDevs ()[0].width (); priv->lastViewport.height = screen->outputDevs ()[0].height (); glViewport (priv->lastViewport.x, priv->lastViewport.y, priv->lastViewport.width, priv->lastViewport.height); } #ifdef USE_GLES EGLContext GLScreen::getEGLContext () { return priv->ctx; } #endif GLProgram * GLScreen::getProgram (std::list shaders) { return (*priv->programCache)(shaders); } const GLShaderData * GLScreen::getShaderData (GLShaderParameters ¶ms) { return &priv->shaderCache.getShaderData(params); } GLDoubleBuffer::GLDoubleBuffer (Display *d, const CompSize &s, const compiz::opengl::impl::GLXSwapIntervalEXTFunc &swapIntervalFunc, const compiz::opengl::impl::GLXWaitVideoSyncSGIFunc &waitVideoSyncFunc) : compiz::opengl::DoubleBuffer (swapIntervalFunc, waitVideoSyncFunc), mDpy (d), mSize (s) { } #ifndef USE_GLES void GLXDoubleBuffer::copyFrontToBack() const { int w = screen->width (); int h = screen->height (); glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glOrtho (0, w, 0, h, -1.0, 1.0); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glReadBuffer (GL_FRONT); glRasterPos2i (0, 0); glCopyPixels (0, 0, w, h, GL_COLOR); glReadBuffer (GL_BACK); glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); } GLXDoubleBuffer::GLXDoubleBuffer (Display *d, const CompSize &s, Window output) : GLDoubleBuffer (d, s, boost::bind (compiz::opengl::swapIntervalGLX, d, _1), boost::bind (compiz::opengl::waitVSyncGLX, _1, _2, _3)), mOutput (output) { } void GLXDoubleBuffer::swap () const { glXSwapBuffers (mDpy, mOutput); } bool GLXDoubleBuffer::blitAvailable () const { return GL::copySubBuffer ? true : false; } void GLXDoubleBuffer::blit (const CompRegion ®ion) const { const CompRect::vector &blitRects (region.rects ()); foreach (const CompRect &r, blitRects) { int y = mSize.height () - r.y2 (); (*GL::copySubBuffer) (screen->dpy (), mOutput, r.x1 (), y, r.width (), r.height ()); } } bool GLXDoubleBuffer::fallbackBlitAvailable () const { return true; } void GLXDoubleBuffer::fallbackBlit (const CompRegion ®ion) const { const CompRect::vector &blitRects (region.rects ()); int w = screen->width (); int h = screen->height (); glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glOrtho (0, w, 0, h, -1.0, 1.0); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glDrawBuffer (GL_FRONT); foreach (const CompRect &r, blitRects) { int x = r.x1 (); int y = h - r.y2(); glRasterPos2i (x, y); glCopyPixels (x, y, w, h, GL_COLOR); } glDrawBuffer (GL_BACK); glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glFlush (); } #else EGLDoubleBuffer::EGLDoubleBuffer (Display *d, const CompSize &s, EGLSurface const &surface) : GLDoubleBuffer (d, s, boost::bind (compiz::opengl::swapIntervalEGL, d, _1), boost::bind (compiz::opengl::waitVSyncEGL, _1, _2, _3)), mSurface (surface) { } void EGLDoubleBuffer::swap () const { eglSwapBuffers (eglGetDisplay (mDpy), mSurface); } bool EGLDoubleBuffer::blitAvailable () const { return GL::postSubBuffer ? true : false; } void EGLDoubleBuffer::blit (const CompRegion ®ion) const { CompRect::vector blitRects (region.rects ()); int y = 0; foreach (const CompRect &r, blitRects) { y = mSize.height () - r.y2 (); (*GL::postSubBuffer) (eglGetDisplay (screen->dpy ()), mSurface, r.x1 (), y, r.width (), r.height ()); } } bool EGLDoubleBuffer::fallbackBlitAvailable () const { return false; } void EGLDoubleBuffer::fallbackBlit (const CompRegion ®ion) const { } void EGLDoubleBuffer::copyFrontToBack() const { } #endif void PrivateGLScreen::paintOutputs (CompOutput::ptrList &outputs, unsigned int mask, const CompRegion ®ion) { if (clearBuffers) { if (mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) glClear (GL_COLOR_BUFFER_BIT); } // Disable everything that we don't usually need and could slow us down glDisable (GL_BLEND); glDisable (GL_STENCIL_TEST); glDisable (GL_DEPTH_TEST); glDepthMask (GL_FALSE); glStencilMask (0); #ifdef UNSAFE_ARM_SGX_FIXME refreshSubBuffer = ((lastMask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) && !(mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) && (mask & COMPOSITE_SCREEN_DAMAGE_REGION_MASK)); if (refreshSubBuffer) { // FIXME: We shouldn't have to substract a 1X1 pixel region here !! // This is an ugly workaround for what appears to be a bug in the SGX // X11 driver (e.g. on Pandaboard OMAP4 platform). // Posting a fullscreen damage region to the SGX seems to reset the // framebuffer, causing the screen to blackout. cScreen->damageRegion (CompRegion (screen->fullscreenOutput ()) - CompRegion (CompRect(0, 0, 1, 1))); } #endif CompRegion paintRegion ((mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) ? screen->region () : region); bool useFbo = false; GLFramebufferObject *oldFbo = NULL; postprocessingRequired = gScreen->glPaintCompositedOutputRequired (); postprocessingRequired |= frameProvider->alwaysPostprocess (); /* Clear the color buffer where appropriate */ if (GL::fboEnabled && postprocessRequiredForCurrentFrame ()) { oldFbo = scratchFbo->bind (); if (scratchFbo->checkStatus ()) useFbo = true; } foreach (CompOutput *output, outputs) { XRectangle r; targetOutput = output; r.x = output->x1 (); r.y = screen->height () - output->y2 (); r.width = output->width (); r.height = output->height (); if (lastViewport.x != r.x || lastViewport.y != r.y || lastViewport.width != r.width || lastViewport.height != r.height) { glViewport (r.x, r.y, r.width, r.height); lastViewport = r; } if (mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) { GLMatrix identity; gScreen->glPaintOutput (defaultScreenPaintAttrib, identity, CompRegion (*output), output, PAINT_SCREEN_REGION_MASK | PAINT_SCREEN_FULL_MASK); } else if (mask & COMPOSITE_SCREEN_DAMAGE_REGION_MASK) { GLMatrix identity; #ifdef UNSAFE_ARM_SGX_FIXME /* * FIXME: * This code is unsafe and causes Unity bug 1036520. * So it probably needs to be replaced with something else * on platforms where it is required. * * We should NEVER be extending tmpRegion, because that's * telling windows/plugins it is OK to paint outside the * damaged region. */ if (refreshSubBuffer) tmpRegion = CompRegion (*output); #endif /* Clip current paint region to output extents */ CompRegionRef outputReg (output->region ()); outputRegion = (paintRegion & outputReg); if (!gScreen->glPaintOutput (defaultScreenPaintAttrib, identity, outputRegion, output, PAINT_SCREEN_REGION_MASK)) { identity.reset (); gScreen->glPaintOutput (defaultScreenPaintAttrib, identity, outputReg, output, PAINT_SCREEN_FULL_MASK); paintRegion += outputReg; cScreen->recordDamageOnCurrentFrame (outputReg); } } } targetOutput = &screen->outputDevs ()[0]; glViewport (0, 0, screen->width (), screen->height ()); if (useFbo) { // FIXME: does not work if screen dimensions exceed max texture size // We should try to use glBlitFramebuffer instead. GLFramebufferObject::rebind (oldFbo); /* If we must always postprocess, then we don't have any * "real" backbuffer persistence, redraw the whole thing */ gScreen->glPaintCompositedOutput (frameProvider->alwaysPostprocess () ? screen->region () : paintRegion, scratchFbo.get (), mask); } frameProvider->endFrame (); if (cScreen->outputWindowChanged ()) { /* * Changes to the composite output window seem to take a whole frame * to take effect. So to avoid a visible flicker, we skip this frame * and do a full redraw next time. */ cScreen->damageScreen (); return; } bool persistence = frameProvider->providesPersistence (); bool alwaysSwap = optionGetAlwaysSwapBuffers (); bool fullscreen = persistence || alwaysSwap || ((mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) && commonFrontbuffer); doubleBuffer.set (DoubleBuffer::VSYNC, optionGetSyncToVblank ()); doubleBuffer.set (DoubleBuffer::HAVE_PERSISTENT_BACK_BUFFER, persistence); doubleBuffer.set (DoubleBuffer::NEED_PERSISTENT_BACK_BUFFER, alwaysSwap); doubleBuffer.render (paintRegion, fullscreen); lastMask = mask; } unsigned int PrivateGLScreen::getFrameAge () { return frameProvider->getCurrentFrame (); } bool PrivateGLScreen::hasVSync () { #ifdef USE_GLES return false; #else return GL::waitVideoSync && optionGetSyncToVblank () && doubleBuffer.hardwareVSyncFunctional (); #endif } bool PrivateGLScreen::requiredForcedRefreshRate () { return incorrectRefreshRate; } bool PrivateGLScreen::compositingActive () { return true; } void PrivateGLScreen::damageCutoff () { cScreen->applyDamageForFrameAge (frameProvider->getCurrentFrame ()); cScreen->damageCutoff (); } void PrivateGLScreen::updateRenderMode () { #ifndef USE_GLES GL::fboEnabled = GL::fboSupported && optionGetFramebufferObject (); GL::vboEnabled = GL::vboSupported && optionGetVertexBufferObject (); #endif } void PrivateGLScreen::updateFrameProvider () { #ifndef USE_GLES const Window outputWindow = CompositeScreen::get (screen)->output (); if (GL::fboEnabled) { if (GL::bufferAge) { FrameProvider::Ptr back (new BufferAgeFrameProvider (screen->dpy (), outputWindow)); FrameProvider::Ptr scratch (new PostprocessFrameProvider (scratchFbo.get ())); OptionalPostprocessFrameProvider::PostprocessRequired ppReq (boost::bind (&PrivateGLScreen::postprocessRequiredForCurrentFrame, this)); frameProvider.reset (new OptionalPostprocessFrameProvider (back, scratch, ppReq)); } else { /* Prefer using FBO's instead of switching between a defined/undefined backbuffer */ frameProvider.reset (new PostprocessFrameProvider (scratchFbo.get ())); } } else { if (GL::bufferAge) frameProvider.reset (new BufferAgeFrameProvider (screen->dpy (), outputWindow)); else frameProvider.reset (new UndefinedFrameProvider ()); } #else frameProvider.reset (new PostprocessFrameProvider (scratchFbo.get ())); #endif } void PrivateGLScreen::prepareDrawing () { bool wasFboEnabled = GL::fboEnabled; updateRenderMode (); if (wasFboEnabled != GL::fboEnabled) { updateFrameProvider (); CompositeScreen::get (screen)->damageScreen (); } } bool PrivateGLScreen::driverIsBlacklisted (const char *regex) const { /* * regex matching is VERY expensive, so only do it when the result might * be different to last time. The gl* variables never change value... */ if (prevRegex != regex) { prevBlacklisted = blacklisted (regex, glVendor, glRenderer, glVersion); prevRegex = regex; } return prevBlacklisted; } bool PrivateGLScreen::postprocessRequiredForCurrentFrame () { return postprocessingRequired; } GLTexture::BindPixmapHandle GLScreen::registerBindPixmap (GLTexture::BindPixmapProc proc) { priv->bindPixmap.push_back (proc); if (!priv->hasCompositing && CompositeScreen::get (screen)->registerPaintHandler (priv)) priv->hasCompositing = true; return priv->bindPixmap.size () - 1; } void GLScreen::unregisterBindPixmap (GLTexture::BindPixmapHandle hnd) { bool hasBP = false; priv->bindPixmap[hnd].clear (); for (unsigned int i = 0; i < priv->bindPixmap.size (); i++) if (!priv->bindPixmap[i].empty ()) hasBP = true; if (!hasBP && priv->hasCompositing) { CompositeScreen::get (screen)->unregisterPaintHandler (); priv->hasCompositing = false; } } GLFramebufferObject * GLScreen::fbo () { return priv->scratchFbo.get (); } GLTexture * GLScreen::defaultIcon () { CompIcon *i = screen->defaultIcon (); CompSize size; if (!i) return NULL; if (!i->width () || !i->height ()) return NULL; if (priv->defaultIcon.icon == i) return priv->defaultIcon.textures[0]; priv->defaultIcon.textures = GLTexture::imageBufferToTexture ((char *) i->data (), *i); if (priv->defaultIcon.textures.size () == 1) priv->defaultIcon.icon = i; else { priv->defaultIcon.icon = NULL; priv->defaultIcon.textures.clear (); } return priv->defaultIcon.textures[0]; } void GLScreen::resetRasterPos () { #ifndef USE_GLES glRasterPos2f (0, 0); #endif priv->rasterPos.setX (0); priv->rasterPos.setY (0); } compiz-0.9.11+14.04.20140409/plugins/opengl/src/paint.cpp0000644000015301777760000011337312321343002023055 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * Copyright © 2011 Linaro, Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: David Reveman * Travis Watkins */ #include "privates.h" #include #include #include #include #include #include #define foreach BOOST_FOREACH #include #include "privates.h" #include "fsregion/fsregion.h" #define DEG2RAD (M_PI / 180.0f) using namespace compiz::opengl; GLScreenPaintAttrib defaultScreenPaintAttrib = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -DEFAULT_Z_CAMERA }; GLWindowPaintAttrib GLWindow::defaultPaintAttrib = { OPAQUE, BRIGHT, COLOR, 1.0f, 1.0f, 0.0f, 0.0f }; void GLScreen::glApplyTransform (const GLScreenPaintAttrib &sAttrib, CompOutput *output, GLMatrix *transform) { WRAPABLE_HND_FUNCTN (glApplyTransform, sAttrib, output, transform) transform->translate (sAttrib.xTranslate, sAttrib.yTranslate, sAttrib.zTranslate + sAttrib.zCamera); transform->rotate (sAttrib.xRotate, 0.0f, 1.0f, 0.0f); transform->rotate (sAttrib.vRotate, cosf (sAttrib.xRotate * DEG2RAD), 0.0f, sinf (sAttrib.xRotate * DEG2RAD)); transform->rotate (sAttrib.yRotate, 0.0f, 1.0f, 0.0f); } void PrivateGLScreen::paintBackground (const GLMatrix &transform, const CompRegion ®ion, bool transformed) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLfloat vertexData[18]; GLushort colorData[4]; BoxPtr pBox = const_cast (region.handle ())->rects; int n, nBox = const_cast (region.handle ())->numRects; if (!nBox) return; if (screen->desktopWindowCount ()) { if (!backgroundTextures.empty ()) { backgroundTextures.clear (); } backgroundLoaded = false; return; } else { if (!backgroundLoaded) updateScreenBackground (); backgroundLoaded = true; } if (backgroundTextures.empty ()) { streamingBuffer->begin (GL_TRIANGLES); n = nBox; while (n--) { vertexData[0] = pBox->x1; vertexData[1] = pBox->y1; vertexData[2] = 0.0f; vertexData[3] = pBox->x1; vertexData[4] = pBox->y2; vertexData[5] = 0.0f; vertexData[6] = pBox->x2; vertexData[7] = pBox->y1; vertexData[8] = 0.0f; vertexData[9] = pBox->x1; vertexData[10] = pBox->y2; vertexData[11] = 0.0f; vertexData[12] = pBox->x2; vertexData[13] = pBox->y2; vertexData[14] = 0.0f; vertexData[15] = pBox->x2; vertexData[16] = pBox->y1; vertexData[17] = 0.0f; streamingBuffer->addVertices (6, vertexData); pBox++; } colorData[0] = colorData[1] = colorData[2] = 0; colorData[3] = std::numeric_limits ::max (); streamingBuffer->addColors (1, colorData); streamingBuffer->end (); streamingBuffer->render (transform); } else { n = nBox; for (unsigned int i = 0; i < backgroundTextures.size (); i++) { GLfloat textureData[12]; GLTexture *bg = backgroundTextures[i]; CompRegion r = region & *bg; pBox = const_cast (r.handle ())->rects; nBox = const_cast (r.handle ())->numRects; n = nBox; streamingBuffer->begin (GL_TRIANGLES); while (n--) { GLfloat tx1 = COMP_TEX_COORD_X (bg->matrix (), pBox->x1); GLfloat tx2 = COMP_TEX_COORD_X (bg->matrix (), pBox->x2); GLfloat ty1 = COMP_TEX_COORD_Y (bg->matrix (), pBox->y1); GLfloat ty2 = COMP_TEX_COORD_Y (bg->matrix (), pBox->y2); vertexData[0] = pBox->x1; vertexData[1] = pBox->y1; vertexData[2] = 0.0f; vertexData[3] = pBox->x1; vertexData[4] = pBox->y2; vertexData[5] = 0.0f; vertexData[6] = pBox->x2; vertexData[7] = pBox->y1; vertexData[8] = 0.0f; vertexData[9] = pBox->x1; vertexData[10] = pBox->y2; vertexData[11] = 0.0f; vertexData[12] = pBox->x2; vertexData[13] = pBox->y2; vertexData[14] = 0.0f; vertexData[15] = pBox->x2; vertexData[16] = pBox->y1; vertexData[17] = 0.0f; textureData[0] = tx1; textureData[1] = ty1; textureData[2] = tx1; textureData[3] = ty2; textureData[4] = tx2; textureData[5] = ty1; textureData[6] = tx1; textureData[7] = ty2; textureData[8] = tx2; textureData[9] = ty2; textureData[10] = tx2; textureData[11] = ty1; streamingBuffer->addVertices (6, vertexData); streamingBuffer->addTexCoords (0, 6, textureData); pBox++; } streamingBuffer->end (); if (bg->name ()) { if (transformed) bg->enable (GLTexture::Good); else bg->enable (GLTexture::Fast); streamingBuffer->render (transform); bg->disable (); } } } } /* This function currently always performs occlusion detection to minimize paint regions. OpenGL precision requirements are no good enough to guarantee that the results from using occlusion detection is the same as without. It's likely not possible to see any difference with most hardware but occlusion detection in the transformed screen case should be made optional for those who do see a difference. */ void PrivateGLScreen::paintOutputRegion (const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { CompRegion tmpRegion (region); CompWindow *w; GLWindow *gw; int windowMask, odMask; bool status, unredirectFS; bool withOffset = false; GLMatrix vTransform; CompPoint offXY; std::set unredirected; CompWindowList pl; CompWindowList::reverse_iterator rit; unredirectFS = CompositeScreen::get (screen)-> getOption ("unredirect_fullscreen_windows")->value ().b (); const CompMatch &unredirectable = CompositeScreen::get (screen)-> getOption ("unredirect_match")->value ().match (); const CompString &blacklist = getOption ("unredirect_driver_blacklist")->value ().s (); bool blacklisted = driverIsBlacklisted (blacklist.c_str ()); if (mask & PAINT_SCREEN_TRANSFORMED_MASK) { windowMask = PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK; } else { windowMask = 0; } /* * We need to COPY the PaintList for now because there seem to be some * odd cases where the master list might change during the below loops. * (LP: #958540) */ pl = cScreen->getWindowPaintList (); if (!(mask & PAINT_SCREEN_NO_OCCLUSION_DETECTION_MASK)) { FullscreenRegion fs (*output, screen->region ()); /* detect occlusions */ for (rit = pl.rbegin (); rit != pl.rend (); ++rit) { w = (*rit); gw = GLWindow::get (w); if (w->destroyed ()) continue; if (!w->shaded ()) { /* Non-damaged windows don't have valid pixmap * contents and we aren't displaying them yet * so don't factor them into occlusion detection */ if (!gw->priv->cWindow->damaged ()) { gw->priv->clip = region; continue; } if (!w->isViewable ()) continue; } /* copy region */ gw->priv->clip = tmpRegion; odMask = PAINT_WINDOW_OCCLUSION_DETECTION_MASK; if ((cScreen->windowPaintOffset ().x () != 0 || cScreen->windowPaintOffset ().y () != 0) && !w->onAllViewports ()) { withOffset = true; offXY = w->getMovementForOffset (cScreen->windowPaintOffset ()); vTransform = transform; vTransform.translate (offXY.x (), offXY.y (), 0); gw->priv->clip.translate (-offXY.x (), -offXY. y ()); odMask |= PAINT_WINDOW_WITH_OFFSET_MASK; status = gw->glPaint (gw->paintAttrib (), vTransform, tmpRegion, odMask); } else { withOffset = false; status = gw->glPaint (gw->paintAttrib (), transform, tmpRegion, odMask); } if (status) { if (withOffset) { tmpRegion -= w->region ().translated (offXY); } else tmpRegion -= w->region (); } FullscreenRegion::WinFlags flags = 0; if (w->type () & CompWindowTypeDesktopMask) flags |= FullscreenRegion::Desktop; if (w->alpha ()) flags |= FullscreenRegion::Alpha; /* Anything which was not occlusion detected is not a suitable * candidate for unredirection either */ if (!status) flags |= FullscreenRegion::NoOcclusionDetection; CompositeWindow *cw = CompositeWindow::get (w); /* * Windows with alpha channels can partially occlude windows * beneath them and so neither should be unredirected in that case. * * Performance note: unredirectable.evaluate is SLOW because it * involves regex matching. Too slow to do on every window for * every frame. So we only call it if a window is redirected AND * potentially needs unredirecting. This means changes to * unredirect_match while a window is unredirected already may not * take effect until it is un-fullscreened again. But that's better * than the high price of regex matching on every frame. */ if (unredirectFS && !blacklisted && !(mask & PAINT_SCREEN_TRANSFORMED_MASK) && !(mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK) && fs.isCoveredBy (w->region (), flags) && (!cw->redirected () || unredirectable.evaluate (w))) { unredirected.insert (w); } else { if (!cw->redirected ()) { if (fs.allowRedirection (w->region ())) { // 1. GLWindow::release to force gw->priv->needsRebind gw->release (); // 2. GLWindow::bind, which redirects the window, // rebinds the pixmap, and then rebinds the pixmap // to a texture. gw->bind (); // 3. Your window is now redirected again with the // latest pixmap contents. } else { unredirected.insert (w); } } } } } /* Unredirect any redirected fullscreen windows */ foreach (CompWindow *fullscreenWindow, unredirected) CompositeWindow::get (fullscreenWindow)->unredirect (); if (!(mask & PAINT_SCREEN_NO_BACKGROUND_MASK)) paintBackground (transform, tmpRegion, (mask & PAINT_SCREEN_TRANSFORMED_MASK)); /* paint all windows from bottom to top */ foreach (w, pl) { if (w->destroyed ()) continue; gw = GLWindow::get (w); /* Release any queued ConfigureWindow requests now */ gw->priv->configureLock->release (); if (unredirected.find (w) != unredirected.end ()) continue; if (!w->shaded ()) { if (!w->isViewable ()) continue; } const CompRegion &clip = (!(mask & PAINT_SCREEN_NO_OCCLUSION_DETECTION_MASK)) ? gw->clip () : region; if ((cScreen->windowPaintOffset ().x () != 0 || cScreen->windowPaintOffset ().y () != 0) && !w->onAllViewports ()) { offXY = w->getMovementForOffset (cScreen->windowPaintOffset ()); vTransform = transform; vTransform.translate (offXY.x (), offXY.y (), 0); gw->glPaint (gw->paintAttrib (), vTransform, clip, windowMask | PAINT_WINDOW_WITH_OFFSET_MASK); } else { gw->glPaint (gw->paintAttrib (), transform, clip, windowMask); } } } // transformIsSimple tells you if it's simple enough to use scissoring static bool transformIsSimple (const GLMatrix &transform) { const float *t = transform.getMatrix (); return // t[0] can be anything (x scale) t[1] == 0.0f && t[2] == 0.0f && t[3] == 0.0f && t[4] == 0.0f && // t[5] can be anything (y scale) t[6] == 0.0f && t[7] == 0.0f && t[8] == 0.0f && t[9] == 0.0f && // t[10] can be anything (z scale) t[11] == 0.0f && // t[12]..t[14] can be anything (translation) t[15] == 1.0f; } void GLScreen::glEnableOutputClipping (const GLMatrix &transform, const CompRegion ®ion, CompOutput *output) { WRAPABLE_HND_FUNCTN (glEnableOutputClipping, transform, region, output) // Bottom-left corner of the output: const GLint x = output->x1 (); const GLint y = screen->height () - output->y2 (); const GLsizei w = output->width (); const GLsizei h = output->height (); // Transformed (only scale and translation is supported!) const float *t = transform.getMatrix (); const GLfloat scalex = t[0], scaley = t[5], transx = t[12], transy = t[13]; const GLfloat centrex = x + w / 2.0f; const GLfloat centrey = y + h / 2.0f; GLfloat scaledw = fabs (w * scalex); GLfloat scaledh = fabs (h * scaley); GLfloat tx = centrex - (scaledw / 2.0f) + transx * w; GLfloat ty = centrey - (scaledh / 2.0f) + transy * h; glScissor (tx, ty, roundf (scaledw), roundf (scaledh)); glEnable (GL_SCISSOR_TEST); } void GLScreen::glDisableOutputClipping () { WRAPABLE_HND_FUNCTN (glDisableOutputClipping) glDisable (GL_SCISSOR_TEST); } void GLScreen::glBufferStencil (const GLMatrix &matrix, GLVertexBuffer &vertexBuffer, CompOutput *output) { WRAPABLE_HND_FUNCTN (glBufferStencil, matrix, vertexBuffer, output); GLfloat x = output->x (); GLfloat y = screen->height () - output->y2 (); GLfloat x2 = output->x () + output->width (); GLfloat y2 = screen->height () - output->y2 () + output->height (); GLfloat vertices[] = { x, y, 0, x, y2, 0, x2, y, 0, x2, y2, 0 }; GLushort colorData[] = { 0xffff, 0xffff, 0xffff, 0xffff }; vertexBuffer.begin (GL_TRIANGLE_STRIP); vertexBuffer.addVertices (4, vertices); vertexBuffer.addColors (1, colorData); vertexBuffer.end (); } #define CLIP_PLANE_MASK (PAINT_SCREEN_TRANSFORMED_MASK | \ PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK) void GLScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { WRAPABLE_HND_FUNCTN (glPaintTransformedOutput, sAttrib, transform, region, output, mask) GLMatrix sTransform = transform; if (mask & PAINT_SCREEN_CLEAR_MASK) clearTargetOutput (GL_COLOR_BUFFER_BIT); setLighting (true); glApplyTransform (sAttrib, output, &sTransform); if ((mask & CLIP_PLANE_MASK) == CLIP_PLANE_MASK) { if (transformIsSimple (sTransform)) { glEnableOutputClipping (sTransform, region, output); sTransform.toScreenSpace (output, -sAttrib.zTranslate); priv->paintOutputRegion (sTransform, region, output, mask); glDisableOutputClipping (); } else if ( (GL::fboEnabled && GL::fboStencilSupported) || GL::stencilBuffer ) { sTransform.toScreenSpace (output, -sAttrib.zTranslate); glClearStencil (0); glClear (GL_STENCIL_BUFFER_BIT); glEnable (GL_STENCIL_TEST); glStencilFunc (GL_ALWAYS, 1, 1); glStencilOp (GL_KEEP, GL_KEEP, GL_REPLACE); GLVertexBuffer vb; vb.setAutoProgram (priv->autoProgram); glBufferStencil (sTransform, vb, output); glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glStencilMask (1); vb.render (sTransform); glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glStencilFunc (GL_EQUAL, 1, 1); glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP); priv->paintOutputRegion (sTransform, region, output, mask); glDisable (GL_STENCIL_TEST); } else { // This won't look quite right but should never happen. // Give a warning? sTransform.toScreenSpace (output, -sAttrib.zTranslate); priv->paintOutputRegion (sTransform, region, output, mask); } } else { sTransform.toScreenSpace (output, -sAttrib.zTranslate); priv->paintOutputRegion (sTransform, region, output, mask); } } bool GLScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { WRAPABLE_HND_FUNCTN_RETURN (bool, glPaintOutput, sAttrib, transform, region, output, mask) GLMatrix sTransform = transform; if (mask & PAINT_SCREEN_REGION_MASK) { if (mask & PAINT_SCREEN_TRANSFORMED_MASK) { if (mask & PAINT_SCREEN_FULL_MASK) { CompRegionRef region (output->region ()); CompositeScreen *cs = priv->cScreen; glPaintTransformedOutput (sAttrib, sTransform, region, output, mask); cs->recordDamageOnCurrentFrame (region); return true; } return false; } setLighting (false); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); /* * Sometimes region might be empty but we still need to force the * repaint. This can happen when a fullscreen window is unredirected, * and damageScreen is called. CompositeScreen::handlePaintTimeout * then subtracts the whole screen of damage because it's an overlay * and we're left with an empty damage region. * Even when this happens we may want to force the repaint if * windows are getting transformed (and so the unredirected window * needs to be redirected again). */ if (!region.isEmpty () || (mask & PAINT_SCREEN_FULL_MASK) || (mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK)) priv->paintOutputRegion (sTransform, region, output, mask); return true; } else if (mask & PAINT_SCREEN_FULL_MASK) { CompRegionRef region (output->region ()); CompositeScreen *cs = priv->cScreen; glPaintTransformedOutput (sAttrib, sTransform, region, output, mask); cs->recordDamageOnCurrentFrame (region); return true; } else { return false; } } bool GLScreen::glPaintCompositedOutputRequired () { WRAPABLE_HND_FUNCTN_RETURN (bool, glPaintCompositedOutputRequired); return false; } void GLScreen::glPaintCompositedOutput (const CompRegion ®ion, GLFramebufferObject *fbo, unsigned int mask) { WRAPABLE_HND_FUNCTN (glPaintCompositedOutput, region, fbo, mask) GLMatrix sTransform; const GLTexture::Matrix & texmatrix = fbo->tex ()->matrix (); GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_TRIANGLES); if (mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) { GLfloat tx1 = COMP_TEX_COORD_X (texmatrix, 0.0f); GLfloat tx2 = COMP_TEX_COORD_X (texmatrix, screen->width ()); GLfloat ty1 = 1.0 - COMP_TEX_COORD_Y (texmatrix, 0.0f); GLfloat ty2 = 1.0 - COMP_TEX_COORD_Y (texmatrix, screen->height ()); const GLfloat vertexData[] = { 0.0f, 0.0f, 0.0f, 0.0f, (float)screen->height (), 0.0f, (float)screen->width (), 0.0f, 0.0f, 0.0f, (float)screen->height (), 0.0f, (float)screen->width (), (float)screen->height (), 0.0f, (float)screen->width (), 0.0f, 0.0f, }; const GLfloat textureData[] = { tx1, ty1, tx1, ty2, tx2, ty1, tx1, ty2, tx2, ty2, tx2, ty1, }; streamingBuffer->addVertices (6, &vertexData[0]); streamingBuffer->addTexCoords (0, 6, &textureData[0]); } else { BoxPtr pBox = const_cast (region.handle ())->rects; int nBox = const_cast (region.handle ())->numRects; while (nBox--) { GLfloat tx1 = COMP_TEX_COORD_X (texmatrix, pBox->x1); GLfloat tx2 = COMP_TEX_COORD_X (texmatrix, pBox->x2); GLfloat ty1 = 1.0 - COMP_TEX_COORD_Y (texmatrix, pBox->y1); GLfloat ty2 = 1.0 - COMP_TEX_COORD_Y (texmatrix, pBox->y2); const GLfloat vertexData[] = { (float)pBox->x1, (float)pBox->y1, 0.0f, (float)pBox->x1, (float)pBox->y2, 0.0f, (float)pBox->x2, (float)pBox->y1, 0.0f, (float)pBox->x1, (float)pBox->y2, 0.0f, (float)pBox->x2, (float)pBox->y2, 0.0f, (float)pBox->x2, (float)pBox->y1, 0.0f, }; const GLfloat textureData[] = { tx1, ty1, tx1, ty2, tx2, ty1, tx1, ty2, tx2, ty2, tx2, ty1, }; streamingBuffer->addVertices (6, &vertexData[0]); streamingBuffer->addTexCoords (0, 6, &textureData[0]); pBox++; } } streamingBuffer->end (); fbo->tex ()->enable (GLTexture::Fast); sTransform.toScreenSpace (&screen->fullscreenOutput (), -DEFAULT_Z_CAMERA); streamingBuffer->render (sTransform); fbo->tex ()->disable (); } static void addSingleQuad (GLVertexBuffer *vertexBuffer, const GLTexture::MatrixList &matrix, unsigned int nMatrix, int x1, int y1, int x2, int y2, bool rect) { GLfloat vertexData[18] = { (float)x1, (float)y1, 0.0, (float)x1, (float)y2, 0.0, (float)x2, (float)y1, 0.0, (float)x2, (float)y1, 0.0, (float)x1, (float)y2, 0.0, (float)x2, (float)y2, 0.0 }; vertexBuffer->addVertices (6, vertexData); if (rect) { unsigned int it; for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_X (mat, x1); data[1] = COMP_TEX_COORD_Y (mat, y1); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_X (mat, x1); data[1] = COMP_TEX_COORD_Y (mat, y2); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_X (mat, x2); data[1] = COMP_TEX_COORD_Y (mat, y1); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_X (mat, x2); data[1] = COMP_TEX_COORD_Y (mat, y1); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_X (mat, x1); data[1] = COMP_TEX_COORD_Y (mat, y2); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_X (mat, x2); data[1] = COMP_TEX_COORD_Y (mat, y2); vertexBuffer->addTexCoords (it, 1, data); } } else { unsigned int it; for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_XY (mat, x1, y1); data[1] = COMP_TEX_COORD_YX (mat, x1, y1); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_XY (mat, x1, y2); data[1] = COMP_TEX_COORD_YX (mat, x1, y2); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_XY (mat, x2, y1); data[1] = COMP_TEX_COORD_YX (mat, x2, y1); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_XY (mat, x2, y1); data[1] = COMP_TEX_COORD_YX (mat, x2, y1); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_XY (mat, x1, y2); data[1] = COMP_TEX_COORD_YX (mat, x1, y2); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_XY (mat, x2, y2); data[1] = COMP_TEX_COORD_YX (mat, x2, y2); vertexBuffer->addTexCoords (it, 1, data); } } } static void addQuads (GLVertexBuffer *vertexBuffer, const GLTexture::MatrixList &matrix, unsigned int nMatrix, int x1, int y1, int x2, int y2, bool rect, unsigned int maxGridWidth, unsigned int maxGridHeight) { if (maxGridWidth == 0 || maxGridHeight == 0) return; int nQuadsX = (maxGridWidth == MAXSHORT) ? 1 : 1 + (x2 - x1 - 1) / (int) maxGridWidth; // ceil. division int nQuadsY = (maxGridHeight == MAXSHORT) ? 1 : 1 + (y2 - y1 - 1) / (int) maxGridHeight; if (nQuadsX == 1 && nQuadsY == 1) { addSingleQuad (vertexBuffer, matrix, nMatrix, x1, y1, x2, y2, rect); } else { int quadWidth = 1 + (x2 - x1 - 1) / nQuadsX; // ceil. division int quadHeight = 1 + (y2 - y1 - 1) / nQuadsY; int nx1, ny1, nx2, ny2; for (ny1 = y1; ny1 < y2; ny1 = ny2) { ny2 = MIN (ny1 + (int) quadHeight, y2); for (nx1 = x1; nx1 < x2; nx1 = nx2) { nx2 = MIN (nx1 + (int) quadWidth, x2); addSingleQuad (vertexBuffer, matrix, nMatrix, nx1, ny1, nx2, ny2, rect); } } } } void GLWindow::glAddGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { WRAPABLE_HND_FUNCTN (glAddGeometry, matrix, region, clip) BoxRec full; int nMatrix = matrix.size (); full = clip.handle ()->extents; if (region.handle ()->extents.x1 > full.x1) full.x1 = region.handle ()->extents.x1; if (region.handle ()->extents.y1 > full.y1) full.y1 = region.handle ()->extents.y1; if (region.handle ()->extents.x2 < full.x2) full.x2 = region.handle ()->extents.x2; if (region.handle ()->extents.y2 < full.y2) full.y2 = region.handle ()->extents.y2; if (full.x1 < full.x2 && full.y1 < full.y2) { BoxPtr pBox; int nBox; BoxPtr pClip; int nClip; BoxRec cbox; int it, x1, y1, x2, y2; bool rect = true; for (it = 0; it < nMatrix; it++) { if (matrix[it].xy != 0.0f || matrix[it].yx != 0.0f) { rect = false; break; } } pBox = const_cast (region.handle ())->rects; nBox = const_cast (region.handle ())->numRects; while (nBox--) { x1 = pBox->x1; y1 = pBox->y1; x2 = pBox->x2; y2 = pBox->y2; pBox++; if (x1 < full.x1) x1 = full.x1; if (y1 < full.y1) y1 = full.y1; if (x2 > full.x2) x2 = full.x2; if (y2 > full.y2) y2 = full.y2; if (x1 < x2 && y1 < y2) { nClip = const_cast (clip.handle ())->numRects; if (nClip == 1) { addQuads (priv->vertexBuffer, matrix, nMatrix, x1, y1, x2, y2, rect, maxGridWidth, maxGridHeight); } else { pClip = const_cast (clip.handle ())->rects; while (nClip--) { cbox = *pClip; pClip++; if (cbox.x1 < x1) cbox.x1 = x1; if (cbox.y1 < y1) cbox.y1 = y1; if (cbox.x2 > x2) cbox.x2 = x2; if (cbox.y2 > y2) cbox.y2 = y2; if (cbox.x1 < cbox.x2 && cbox.y1 < cbox.y2) { addQuads (priv->vertexBuffer, matrix, nMatrix, cbox.x1, cbox.y1, cbox.x2, cbox.y2, rect, maxGridWidth, maxGridHeight); } } } } } } } #ifndef USE_GLES static void enableLegacyOBSAndRender (GLScreen *gs, GLWindow *w, GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, GLTexture::Filter filter, unsigned int mask) { // XXX: This codepath only works with !GL::vbo so that's the only case // where you'll find it's called. At least for now. if (GL::canDoSaturated && attrib.saturation != COLOR) { GLfloat constant[4]; texture->enable (filter); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_PRIMARY_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glColor4f (1.0f, 1.0f, 1.0f, 0.5f); GL::activeTexture (GL_TEXTURE1_ARB); texture->enable (filter); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); if (GL::canDoSlightlySaturated && attrib.saturation > 0) { glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); constant[0] = 0.5f + 0.5f * RED_SATURATION_WEIGHT; constant[1] = 0.5f + 0.5f * GREEN_SATURATION_WEIGHT; constant[2] = 0.5f + 0.5f * BLUE_SATURATION_WEIGHT; constant[3] = 1.0; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); GL::activeTexture (GL_TEXTURE2_ARB); texture->enable (filter); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); constant[3] = attrib.saturation / 65535.0f; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); if (attrib.opacity < OPAQUE || attrib.brightness != BRIGHT) { GL::activeTexture (GL_TEXTURE3_ARB); texture->enable (filter); constant[3] = attrib.opacity / 65535.0f; constant[0] = constant[1] = constant[2] = constant[3] * attrib.brightness / 65535.0f; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); w->vertexBuffer ()->render (transform, attrib); texture->disable (); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); GL::activeTexture (GL_TEXTURE2_ARB); } else { w->vertexBuffer ()->render (transform, attrib); } texture->disable (); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); GL::activeTexture (GL_TEXTURE1_ARB); } else { glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); constant[3] = attrib.opacity / 65535.0f; constant[0] = constant[1] = constant[2] = constant[3] * attrib.brightness / 65535.0f; constant[0] = 0.5f + 0.5f * RED_SATURATION_WEIGHT * constant[0]; constant[1] = 0.5f + 0.5f * GREEN_SATURATION_WEIGHT * constant[1]; constant[2] = 0.5f + 0.5f * BLUE_SATURATION_WEIGHT * constant[2]; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); w->vertexBuffer ()->render (transform, attrib); } texture->disable (); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); GL::activeTexture (GL_TEXTURE0_ARB); texture->disable (); glColor4usv (defaultColor); gs->setTexEnvMode (GL_REPLACE); } else { texture->enable (filter); if (mask & PAINT_WINDOW_BLEND_MASK) { if (attrib.opacity != OPAQUE || attrib.brightness != BRIGHT) { GLushort color; color = (attrib.opacity * attrib.brightness) >> 16; gs->setTexEnvMode (GL_MODULATE); glColor4us (color, color, color, attrib.opacity); w->vertexBuffer ()->render (transform, attrib); glColor4usv (defaultColor); gs->setTexEnvMode (GL_REPLACE); } else { w->vertexBuffer ()->render (transform, attrib); } } else if (attrib.brightness != BRIGHT) { gs->setTexEnvMode (GL_MODULATE); glColor4us (attrib.brightness, attrib.brightness, attrib.brightness, BRIGHT); w->vertexBuffer ()->render (transform, attrib); glColor4usv (defaultColor); gs->setTexEnvMode (GL_REPLACE); } else { w->vertexBuffer ()->render (transform, attrib); } texture->disable (); } } #endif void GLWindow::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { WRAPABLE_HND_FUNCTN (glDrawTexture, texture, transform, attrib, mask) GLTexture::Filter filter; if (mask & PAINT_WINDOW_BLEND_MASK) glEnable (GL_BLEND); if (mask & (PAINT_WINDOW_TRANSFORMED_MASK | PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK)) filter = priv->gScreen->filter (SCREEN_TRANS_FILTER); else filter = priv->gScreen->filter (NOTHING_TRANS_FILTER); glActiveTexture(GL_TEXTURE0); texture->enable (filter); #ifdef USE_GLES priv->vertexBuffer->render (transform, attrib); #else if (!GLVertexBuffer::enabled ()) enableLegacyOBSAndRender (priv->gScreen, this, texture, transform, attrib, filter, mask); else priv->vertexBuffer->render (transform, attrib); #endif priv->shaders.clear (); texture->disable (); if (mask & PAINT_WINDOW_BLEND_MASK) glDisable (GL_BLEND); } bool GLWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { WRAPABLE_HND_FUNCTN_RETURN (bool, glDraw, transform, attrib, region, mask) const CompRegion ® = (mask & PAINT_WINDOW_TRANSFORMED_MASK) ? infiniteRegion : region; if (reg.isEmpty ()) return true; if (!priv->window->isViewable () || !priv->cWindow->damaged ()) return true; if (textures ().empty () && !bind ()) return false; if (mask & PAINT_WINDOW_TRANSLUCENT_MASK) mask |= PAINT_WINDOW_BLEND_MASK; GLTexture::MatrixList ml (1); // // Don't assume all plugins leave TexEnvMode in a clean state (GL_REPLACE). // Sometimes plugins forget to clean up correctly, so make sure we're // in the correct mode or else windows could be rendered incorrectly // like in LP: #877920. // priv->gScreen->setTexEnvMode (GL_REPLACE); if (priv->updateState & PrivateGLWindow::UpdateMatrix) priv->setWindowMatrix (); if (priv->updateState & PrivateGLWindow::UpdateRegion) priv->updateWindowRegions (); for (unsigned int i = 0; i < priv->textures.size (); i++) { ml[0] = priv->matrices[i]; priv->vertexBuffer->begin (); glAddGeometry (ml, priv->regions[i], reg); if (priv->vertexBuffer->end ()) glDrawTexture (priv->textures[i], transform, attrib, mask); } return true; } bool GLWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { WRAPABLE_HND_FUNCTN_RETURN (bool, glPaint, attrib, transform, region, mask) bool status; priv->lastPaint = attrib; if (priv->window->alpha () || attrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; priv->lastMask = mask; if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) { if (mask & PAINT_WINDOW_TRANSFORMED_MASK) return false; if (mask & PAINT_WINDOW_NO_CORE_INSTANCE_MASK) return false; if (mask & PAINT_WINDOW_TRANSLUCENT_MASK) return false; if (priv->window->shaded ()) return false; return true; } if (mask & PAINT_WINDOW_NO_CORE_INSTANCE_MASK) return true; status = glDraw (transform, attrib, region, mask); return status; } compiz-0.9.11+14.04.20140409/plugins/opengl/src/vector.cpp0000644000015301777760000001256212321343002023242 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Danny Baumann */ /* * Copyright (C) 1999-2005 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * From Mesa 3-D graphics library. */ #include #include #include GLVector::GLVector () { memset (v, 0, sizeof (v)); } GLVector::GLVector (float x, float y, float z, float w) { v[0] = x; v[1] = y; v[2] = z; v[3] = w; } float& GLVector::operator[] (int item) { return v[item]; } float& GLVector::operator[] (VectorCoordsEnum coord) { int item = (int) coord; return v[item]; } const float & GLVector::operator[] (int item) const { return v[item]; } const float & GLVector::operator[] (VectorCoordsEnum coord) const { int item = (int) coord; return v[item]; } GLVector& GLVector::operator+= (const GLVector& rhs) { for (int i = 0; i < 4; i++) v[i] += rhs[i]; return *this; } GLVector operator+ (const GLVector& lhs, const GLVector& rhs) { GLVector result; for (int i = 0; i < 4; i++) result[i] = lhs[i] + rhs[i]; return result; } GLVector& GLVector::operator-= (const GLVector& rhs) { for (int i = 0; i < 4; i++) v[i] -= rhs[i]; return *this; } GLVector operator- (const GLVector& lhs, const GLVector& rhs) { GLVector result; for (int i = 0; i < 4; i++) result[i] = lhs[i] - rhs[i]; return result; } GLVector operator- (const GLVector& vector) { GLVector result; for (int i = 0; i < 4; i++) result[i] = -vector[i]; return result; } GLVector& GLVector::operator*= (const float k) { for (int i = 0; i < 4; i++) v[i] *= k; return *this; } float operator* (const GLVector& lhs, const GLVector& rhs) { float result = 0; for (int i = 0; i < 4; i++) result += lhs[i] * rhs[i]; return result; } GLVector operator* (const float k, const GLVector& vector) { GLVector result; for (int i = 0; i < 4; i++) result[i] = k * vector[i]; return result; } GLVector operator* (const GLVector& vector, const float k) { return k * vector; } GLVector& GLVector::operator/= (const float k) { for (int i = 0; i < 4; i++) v[i] /= k; return *this; } GLVector operator/ (const GLVector& vector, const float k) { GLVector result; for (int i = 0; i < 4; i++) result[i] = vector[i] / k; return result; } GLVector& GLVector::operator^= (const GLVector& vector) { *this = *this ^ vector; return *this; } GLVector operator^ (const GLVector& lhs, const GLVector& rhs) { GLVector result; result[0] = lhs[1] * rhs[2] - lhs[2] * rhs[1]; result[1] = lhs[2] * rhs[0] - lhs[0] * rhs[2]; result[2] = lhs[0] * rhs[1] - lhs[1] * rhs[0]; result[3] = 0.0f; return result; } float GLVector::norm () { if (v[3] != 0.0) return 1.0; return sqrt ((v[0] * v[0]) + (v[1] * v[1]) + (v[2] * v[2])); } GLVector & GLVector::normalize () { float normal = norm (); /* Vector is not homogenous */ if (normal == 1.0) return *this; for (unsigned int i = 0; i < 3; i++) v[i] /= normal; return *this; } GLVector & GLVector::homogenize () { if (v[3] ==0) return *this; for (unsigned int i = 0; i < 4; i++) v[i] /= v[3]; return *this; } compiz-0.9.11+14.04.20140409/plugins/opengl/src/glxtfpbind/0000755000015301777760000000000012321344021023371 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/src/glxtfpbind/tests/0000755000015301777760000000000012321344021024533 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/src/glxtfpbind/tests/test-opengl-glx-tfp-bind.cpp0000644000015301777760000001334412321343002031774 0ustar pbusernogroup00000000000000#include #include #include #include #include "glx-tfp-bind.h" using ::testing::InSequence; using ::testing::NiceMock; using ::testing::StrictMock; using ::testing::Return; namespace cgl = compiz::opengl; namespace { const Pixmap pixmap = 1; const GLXPixmap glxPixmap = 2; void emptyWaitGLX () {} bool emptyCheckPixmap (Pixmap p) { return true; } void emptyBindTexImage (GLXPixmap p) {} cgl::WaitGLXFunc waitGLX () { return boost::bind (emptyWaitGLX); } cgl::PixmapCheckValidityFunc pixmapCheckValidity () { return boost::bind (emptyCheckPixmap, _1); } cgl::BindTexImageEXTFunc bindTexImageEXT () { return boost::bind (emptyBindTexImage, _1); } } class MockWaitGLX { public: MOCK_METHOD0 (waitGLX, void ()); }; class MockPixmapCheckValidity { public: MOCK_METHOD1 (checkValidity, bool (Pixmap)); }; class MockBindTexImageEXT { public: MOCK_METHOD1 (bindTexImageEXT, void (GLXPixmap)); }; class MockServerGrab : public ServerGrabInterface { public: MOCK_METHOD0 (grabServer, void ()); MOCK_METHOD0 (syncServer, void ()); MOCK_METHOD0 (ungrabServer, void ()); }; TEST (CompizOpenGLGLXTextureFromPixmapBindTest, TestTakesServerGrab) { MockServerGrab mockServerGrab; InSequence s; #ifndef LP_1030891_NOT_FIXED EXPECT_CALL (mockServerGrab, grabServer ()); EXPECT_CALL (mockServerGrab, syncServer ()); EXPECT_CALL (mockServerGrab, ungrabServer ()); EXPECT_CALL (mockServerGrab, syncServer ()); #endif cgl::bindTexImageGLX (&mockServerGrab, pixmap, glxPixmap, pixmapCheckValidity (), bindTexImageEXT (), waitGLX (), cgl::InternallyManaged); } #ifdef LP_1030891_NOT_FIXED TEST (CompizOpenGLGLXTextureFromPixmapBindTest, TestTakesServerGrabLP1030891SpecialCase) { MockServerGrab mockServerGrab; StrictMock mockPixmapCheck; StrictMock mockBindTexImage; cgl::PixmapCheckValidityFunc pixmapCheckFunc (boost::bind (&MockPixmapCheckValidity::checkValidity, &mockPixmapCheck, _1)); cgl::BindTexImageEXTFunc bindTexImageEXTFunc (boost::bind (&MockBindTexImageEXT::bindTexImageEXT, &mockBindTexImage, _1)); EXPECT_CALL (mockServerGrab, grabServer ()); EXPECT_CALL (mockServerGrab, syncServer ()).Times (2); EXPECT_CALL (mockServerGrab, ungrabServer ()); EXPECT_CALL (mockPixmapCheck, checkValidity (pixmap)).WillOnce (Return (true)); EXPECT_CALL (mockBindTexImage, bindTexImageEXT (glxPixmap)); cgl::bindTexImageGLX (&mockServerGrab, pixmap, glxPixmap, pixmapCheckFunc, bindTexImageEXTFunc, waitGLX (), cgl::ExternallyManaged); } #endif TEST (CompizOpenGLGLXTextureFromPixmapBindTest, TestCallsWaitGLX) { NiceMock mockServerGrab; MockWaitGLX mockWaitGLX; cgl::WaitGLXFunc waitGLXFuncMock (boost::bind (&MockWaitGLX::waitGLX, &mockWaitGLX)); #ifndef LP_1030891_NOT_FIXED EXPECT_CALL (mockWaitGLX, waitGLX ()); #endif cgl::bindTexImageGLX (&mockServerGrab, pixmap, glxPixmap, pixmapCheckValidity (), bindTexImageEXT (), waitGLXFuncMock, cgl::InternallyManaged); } TEST (CompizOpenGLGLXTextureFromPixmapBindTest, TestNoCallToCheckValidityIfInternalAndImmediateBind) { NiceMock mockServerGrab; StrictMock mockPixmapCheck; StrictMock mockBindTexImage; cgl::PixmapCheckValidityFunc pixmapCheckFunc (boost::bind (&MockPixmapCheckValidity::checkValidity, &mockPixmapCheck, _1)); cgl::BindTexImageEXTFunc bindTexImageEXTFunc (boost::bind (&MockBindTexImageEXT::bindTexImageEXT, &mockBindTexImage, _1)); EXPECT_CALL (mockBindTexImage, bindTexImageEXT (glxPixmap)); EXPECT_TRUE (cgl::bindTexImageGLX (&mockServerGrab, pixmap, glxPixmap, pixmapCheckFunc, bindTexImageEXTFunc, waitGLX (), cgl::InternallyManaged)); } TEST (CompizOpenGLGLXTextureFromPixmapBindTest, TestCheckValidityIfExternalNoBindIfInvalid) { NiceMock mockServerGrab; StrictMock mockPixmapCheck; StrictMock mockBindTexImage; cgl::PixmapCheckValidityFunc pixmapCheckFunc (boost::bind (&MockPixmapCheckValidity::checkValidity, &mockPixmapCheck, _1)); cgl::BindTexImageEXTFunc bindTexImageEXTFunc (boost::bind (&MockBindTexImageEXT::bindTexImageEXT, &mockBindTexImage, _1)); EXPECT_CALL (mockPixmapCheck, checkValidity (pixmap)).WillOnce (Return (false)); EXPECT_FALSE (cgl::bindTexImageGLX (&mockServerGrab, pixmap, glxPixmap, pixmapCheckFunc, bindTexImageEXTFunc, waitGLX (), cgl::ExternallyManaged)); } TEST (CompizOpenGLGLXTextureFromPixmapBindTest, TestCheckValidityIfExternalBindIfValid) { NiceMock mockServerGrab; StrictMock mockPixmapCheck; StrictMock mockBindTexImage; cgl::PixmapCheckValidityFunc pixmapCheckFunc (boost::bind (&MockPixmapCheckValidity::checkValidity, &mockPixmapCheck, _1)); cgl::BindTexImageEXTFunc bindTexImageEXTFunc (boost::bind (&MockBindTexImageEXT::bindTexImageEXT, &mockBindTexImage, _1)); EXPECT_CALL (mockPixmapCheck, checkValidity (pixmap)).WillOnce (Return (true)); EXPECT_CALL (mockBindTexImage, bindTexImageEXT (glxPixmap)); EXPECT_TRUE (cgl::bindTexImageGLX (&mockServerGrab, pixmap, glxPixmap, pixmapCheckFunc, bindTexImageEXTFunc, waitGLX (), cgl::ExternallyManaged)); } compiz-0.9.11+14.04.20140409/plugins/opengl/src/glxtfpbind/tests/CMakeLists.txt0000644000015301777760000000065212321343002027274 0ustar pbusernogroup00000000000000add_executable (compiz_test_opengl_glx_tfp_bind ${CMAKE_CURRENT_SOURCE_DIR}/test-opengl-glx-tfp-bind.cpp) target_link_libraries (compiz_test_opengl_glx_tfp_bind compiz_opengl_glx_tfp_bind ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_opengl_glx_tfp_bind COVERAGE compiz_opengl_glx_tfp_bind) compiz-0.9.11+14.04.20140409/plugins/opengl/src/glxtfpbind/CMakeLists.txt0000644000015301777760000000110512321343002026124 0ustar pbusernogroup00000000000000INCLUDE_DIRECTORIES ( ${compiz_SOURCE_DIR}/src/servergrab/include ${CMAKE_CURRENT_SOURCE_DIR}/../../include ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ) LINK_DIRECTORIES (${COMPIZ_LIBRARY_DIRS}) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/glx-tfp-bind.cpp ) ADD_LIBRARY( compiz_opengl_glx_tfp_bind STATIC ${SRCS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) TARGET_LINK_LIBRARIES( compiz_opengl_glx_tfp_bind compiz_servergrab ) compiz-0.9.11+14.04.20140409/plugins/opengl/src/glxtfpbind/src/0000755000015301777760000000000012321344021024160 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/src/glxtfpbind/src/glx-tfp-bind.cpp0000644000015301777760000000450012321343002027154 0ustar pbusernogroup00000000000000/* * Compiz, opengl plugin, GLX_EXT_texture_from_pixmap rebind logic * * Copyright (c) 2012 Canonical Ltd. * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include "glx-tfp-bind.h" namespace cgl = compiz::opengl; bool cgl::bindTexImageGLX (ServerGrabInterface *serverGrabInterface, Pixmap x11Pixmap, GLXPixmap glxPixmap, const cgl::PixmapCheckValidityFunc &checkPixmapValidity, const cgl::BindTexImageEXTFunc &bindTexImageEXT, const cgl::WaitGLXFunc &waitGLX, cgl::PixmapSource source) { #ifndef LP_1030891_NOT_FIXED ServerLock lock (serverGrabInterface); waitGLX (); #endif /* External pixmaps can disappear on us, but not * while we have a server grab at least */ if (source == cgl::ExternallyManaged) { #ifdef LP_1030891_NOT_FIXED ServerLock lock (serverGrabInterface); #endif if (!checkPixmapValidity (x11Pixmap)) return false; #ifdef LP_1030891_NOT_FIXED // We need to bind before the above ServerLock is lost bindTexImageEXT (glxPixmap); return true; #endif } bindTexImageEXT (glxPixmap); return true; } compiz-0.9.11+14.04.20140409/plugins/opengl/src/glxtfpbind/include/0000755000015301777760000000000012321344021025014 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/src/glxtfpbind/include/glx-tfp-bind.h0000644000015301777760000000404012321343002027454 0ustar pbusernogroup00000000000000/* * Compiz, opengl plugin, GLX_EXT_texture_from_pixmap rebind logic * * Copyright (c) 2012 Canonical Ltd. * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef _COMPIZ_OPENGL_GLX_TFP_BIND_H #define _COMPIZ_OPENGL_GLX_TFP_BIND_H #ifndef LP_1030891_NOT_FIXED #define LP_1030891_NOT_FIXED #endif #include #include class ServerGrabInterface; typedef unsigned long Pixmap; typedef unsigned long GLXPixmap; namespace compiz { namespace opengl { typedef boost::function PixmapCheckValidityFunc; typedef boost::function BindTexImageEXTFunc; typedef boost::function WaitGLXFunc; bool bindTexImageGLX (ServerGrabInterface *, Pixmap, GLXPixmap, const PixmapCheckValidityFunc &, const BindTexImageEXTFunc &, const WaitGLXFunc &, PixmapSource); } // namespace opengl } // namespace compiz #endif compiz-0.9.11+14.04.20140409/plugins/opengl/src/opengl.cpp0000644000015301777760000000570212321343002023222 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include #include "privates.h" const float DEFAULT_Z_CAMERA = 0.866025404f; const float RED_SATURATION_WEIGHT = 0.30f; const float GREEN_SATURATION_WEIGHT = 0.59f; const float BLUE_SATURATION_WEIGHT = 0.11f; const unsigned short NOTHING_TRANS_FILTER = 0; const unsigned short SCREEN_TRANS_FILTER = 1; const unsigned short WINDOW_TRANS_FILTER = 2; CompOption::Vector & GLScreen::getOptions () { return priv->getOptions (); } bool GLScreen::setOption (const CompString &name, CompOption::Value &value) { return priv->setOption (name, value); } bool PrivateGLScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = OpenglOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case OpenglOptions::TextureFilter: cScreen->damageScreen (); if (!optionGetTextureFilter ()) textureFilter = GL_NEAREST; else textureFilter = GL_LINEAR; break; default: break; } return rv; } class OpenglPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (opengl, OpenglPluginVTable) bool OpenglPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI)) { CompPrivate p; p.uval = COMPIZ_OPENGL_ABI; screen->storeValue ("opengl_ABI", p); return true; } return false; } void OpenglPluginVTable::fini () { screen->eraseValue ("opengl_ABI"); } compiz-0.9.11+14.04.20140409/plugins/opengl/src/window.cpp0000644000015301777760000002475412321343002023255 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include "privates.h" template class WrapableInterface; template class PluginClassHandler; GLWindow::GLWindow (CompWindow *w) : PluginClassHandler (w), priv (new PrivateGLWindow (w, this)) { CompositeWindow *cw = CompositeWindow::get (w); priv->paint.opacity = cw->opacity (); priv->paint.brightness = cw->brightness (); priv->paint.saturation = cw->saturation (); priv->lastPaint = priv->paint; } GLWindow::~GLWindow () { delete priv; } /** * Callback object to create GLPrograms automatically when using GLVertexBuffer. */ class GLWindowAutoProgram : public GLVertexBuffer::AutoProgram { public: GLWindowAutoProgram (PrivateGLWindow *pWindow) : pWindow(pWindow) {} GLProgram *getProgram (GLShaderParameters ¶ms) { GLScreen *gScreen = pWindow->gScreen; const GLShaderData *shaderData = gScreen->getShaderData (params); pWindow->shaders.push_back (shaderData); return gScreen->getProgram (pWindow->shaders); } PrivateGLWindow *pWindow; }; PrivateGLWindow::PrivateGLWindow (CompWindow *w, GLWindow *gw) : window (w), gWindow (gw), cWindow (CompositeWindow::get (w)), gScreen (GLScreen::get (screen)), textures (), regions (), updateState (UpdateRegion | UpdateMatrix), needsRebind (true), clip (), bindFailed (false), vertexBuffer (new GLVertexBuffer ()), autoProgram(new GLWindowAutoProgram (this)), icons (), configureLock (w->obtainLockOnConfigureRequests ()) { paint.xScale = 1.0f; paint.yScale = 1.0f; paint.xTranslate = 0.0f; paint.yTranslate = 0.0f; WindowInterface::setHandler (w); CompositeWindowInterface::setHandler (cWindow); vertexBuffer->setAutoProgram(autoProgram); cWindow->setNewPixmapReadyCallback (boost::bind (&PrivateGLWindow::clearTextures, this)); } PrivateGLWindow::~PrivateGLWindow () { delete vertexBuffer; delete autoProgram; cWindow->setNewPixmapReadyCallback (boost::function ()); } void PrivateGLWindow::setWindowMatrix () { CompRect input (window->inputRect ()); if (textures.size () != matrices.size ()) matrices.resize (textures.size ()); for (unsigned int i = 0; i < textures.size (); i++) { matrices[i] = textures[i]->matrix (); matrices[i].x0 -= (input.x () * matrices[i].xx); matrices[i].y0 -= (input.y () * matrices[i].yy); } updateState &= ~(UpdateMatrix); } void PrivateGLWindow::clearTextures () { textures.clear (); } bool GLWindow::bind () { if (priv->needsRebind) { if (!priv->cWindow->bind ()) { if (!priv->textures.empty ()) { /* Getting a new pixmap failed, recycle the old texture */ priv->needsRebind = false; return true; } else return false; } GLTexture::List textures = GLTexture::bindPixmapToTexture (priv->cWindow->pixmap (), priv->cWindow->size ().width (), priv->cWindow->size ().height (), priv->window->depth ()); if (textures.empty ()) { compLogMessage ("opengl", CompLogLevelInfo, "Couldn't bind redirected window 0x%x to " "texture\n", (int) priv->window->id ()); if (priv->cWindow->size ().width () > GL::maxTextureSize || priv->cWindow->size ().height () > GL::maxTextureSize) { compLogMessage ("opengl", CompLogLevelWarn, "Bug in window 0x%x (identifying as %s)", (int) priv->window->id (), priv->window->resName ().size () ? priv->window->resName ().c_str () : "(none available)"); compLogMessage ("opengl", CompLogLevelWarn, "This window tried to create an absurdly large window %i x %i\n", priv->cWindow->size ().width (), priv->cWindow->size ().height ()); compLogMessage ("opengl", CompLogLevelWarn, "Unforunately, that's not supported on your hardware, because you have a maximum texture size of %i", GL::maxTextureSize); compLogMessage ("opengl", CompLogLevelWarn, "you should probably file a bug against that application"); compLogMessage ("opengl", CompLogLevelWarn, "for now, we're going to hide tht window so that it doesn't break your desktop\n"); XReparentWindow (screen->dpy (), priv->window->id (), GLScreen::get (screen)->priv->saveWindow, 0, 0); } return false; } else { bool immediatelyUpdateMatricesAndRegions = priv->textures.size () != textures.size (); priv->textures = textures; priv->needsRebind = false; /* If the number of textures changed, we should immediately * update the matrices and regions so that they are at least * initialized, but we'll queue another update just before * glPaint too in case the window moved or changed size */ if (immediatelyUpdateMatricesAndRegions) { priv->setWindowMatrix (); priv->updateWindowRegions (); priv->updateState |= PrivateGLWindow::UpdateMatrix | PrivateGLWindow::UpdateRegion; } } } return true; } void GLWindow::release () { if (!priv->cWindow->frozen ()) priv->needsRebind = true; } bool GLWindowInterface::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) WRAPABLE_DEF (glPaint, attrib, transform, region, mask) bool GLWindowInterface::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) WRAPABLE_DEF (glDraw, transform, attrib, region, mask) void GLWindowInterface::glAddGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) WRAPABLE_DEF (glAddGeometry, matrix, region, clip, maxGridWidth, maxGridHeight) void GLWindowInterface::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) WRAPABLE_DEF (glDrawTexture, texture, transform, attrib, mask) const CompRegion & GLWindow::clip () const { return priv->clip; } GLWindowPaintAttrib & GLWindow::paintAttrib () { return priv->paint; } GLWindowPaintAttrib & GLWindow::lastPaintAttrib () { return priv->lastPaint; } void PrivateGLWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { window->resizeNotify (dx, dy, dwidth, dheight); updateState |= PrivateGLWindow::UpdateMatrix | PrivateGLWindow::UpdateRegion; gWindow->release (); } void PrivateGLWindow::moveNotify (int dx, int dy, bool now) { window->moveNotify (dx, dy, now); updateState |= PrivateGLWindow::UpdateMatrix; foreach (CompRegion &r, regions) r.translate (dx, dy); } void PrivateGLWindow::windowNotify (CompWindowNotify n) { switch (n) { case CompWindowNotifyUnmap: case CompWindowNotifyReparent: case CompWindowNotifyUnreparent: case CompWindowNotifyFrameUpdate: gWindow->release (); break; default: break; } window->windowNotify (n); } void GLWindow::updatePaintAttribs () { CompositeWindow *cw = CompositeWindow::get (priv->window); priv->paint.opacity = cw->opacity (); priv->paint.brightness = cw->brightness (); priv->paint.saturation = cw->saturation (); } GLVertexBuffer * GLWindow::vertexBuffer () { return priv->vertexBuffer; } const GLTexture::List & GLWindow::textures () const { static const GLTexture::List emptyList; /* No pixmap backs this window, let * users know that the window needs rebinding */ if (priv->needsRebind) return emptyList; return priv->textures; } const GLTexture::MatrixList & GLWindow::matrices () const { return priv->matrices; } GLTexture * GLWindow::getIcon (int width, int height) { GLIcon icon; CompIcon *i = priv->window->getIcon (width, height); if (!i) return NULL; if (!i->width () || !i->height ()) return NULL; foreach (GLIcon &icon, priv->icons) if (icon.icon == i) return icon.textures[0]; icon.icon = i; icon.textures = GLTexture::imageBufferToTexture ((char *) i->data (), *i); if (icon.textures.size () > 1 || icon.textures.size () == 0) return NULL; priv->icons.push_back (icon); return icon.textures[0]; } void GLWindow::addShaders (std::string name, std::string vertex_shader, std::string fragment_shader) { GLShaderData *data = new GLShaderData; data->name = name; data->vertexShader = vertex_shader; data->fragmentShader = fragment_shader; priv->shaders.push_back(data); } void PrivateGLWindow::updateFrameRegion (CompRegion ®ion) { window->updateFrameRegion (region); updateState |= PrivateGLWindow::UpdateRegion; } void PrivateGLWindow::updateWindowRegions () { CompRect input (window->serverInputRect ()); if (regions.size () != textures.size ()) regions.resize (textures.size ()); for (unsigned int i = 0; i < textures.size (); i++) { regions[i] = CompRegion (*textures[i]); regions[i].translate (input.x (), input.y ()); regions[i] &= window->region (); } updateState &= ~(UpdateRegion); } unsigned int GLWindow::lastMask () const { return priv->lastMask; } compiz-0.9.11+14.04.20140409/plugins/opengl/src/texture.cpp0000644000015301777760000004517412321343002023445 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include "privates.h" #include "glx-tfp-bind.h" namespace cgl = compiz::opengl; #ifdef USE_GLES std::map boundPixmapTex; #else std::map boundPixmapTex; #endif static GLTexture::Matrix _identity_matrix = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }; GLTexture::List::List () : std::vector (0) { } GLTexture::List::List (unsigned int size) : std::vector (size) { for (unsigned int i = 0; i < size; i++) at (i) = NULL; } GLTexture::List::List (const GLTexture::List &c) : std::vector (c.size ()) { for (unsigned int i = 0; i < c.size (); i++) { at (i) = c[i]; GLTexture::incRef (c[i]); } } GLTexture::List::~List () { foreach (GLTexture *t, *this) if (t) GLTexture::decRef (t); } GLTexture::List & GLTexture::List::operator= (const GLTexture::List &c) { this->clear (); resize (c.size ()); for (unsigned int i = 0; i < c.size (); i++) { at (i) = c[i]; GLTexture::incRef (c[i]); } return *this; } void GLTexture::List::clear () { foreach (GLTexture *t, *this) if (t) GLTexture::decRef (t); std::vector ::clear (); } GLTexture::GLTexture () : CompRect (0, 0, 0, 0), priv (new PrivateTexture (this)) { } GLTexture::~GLTexture () { if (priv) delete priv; } PrivateTexture::PrivateTexture (GLTexture *texture) : texture (texture), name (0), target (GL_TEXTURE_2D), filter (GL_NEAREST), wrap (GL_CLAMP_TO_EDGE), matrix (_identity_matrix), mipmap (true), mipmapSupport (false), initial (true), refCount (1) { glGenTextures (1, &name); } PrivateTexture::~PrivateTexture () { if (name) { glDeleteTextures (1, &name); } } GLuint GLTexture::name () const { return priv->name; } GLenum GLTexture::target () const { return priv->target; } const GLTexture::Matrix & GLTexture::matrix () const { return priv->matrix; } bool GLTexture::mipmap () const { return priv->mipmap && priv->mipmapSupport; } GLenum GLTexture::filter () const { return priv->filter; } void GLTexture::enable (GLTexture::Filter filter) { GLScreen *gs = GLScreen::get (screen); #ifndef USE_GLES glEnable (priv->target); #endif glBindTexture (priv->target, priv->name); if (filter == Fast) { if (priv->filter != GL_NEAREST) { glTexParameteri (priv->target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri (priv->target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); priv->filter = GL_NEAREST; } } else if (priv->filter != gs->textureFilter ()) { if (gs->textureFilter () == GL_LINEAR_MIPMAP_LINEAR) { if (mipmap ()) { glTexParameteri (priv->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); if (priv->filter != GL_LINEAR) glTexParameteri (priv->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); priv->filter = GL_LINEAR_MIPMAP_LINEAR; } else if (priv->filter != GL_LINEAR) { glTexParameteri (priv->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (priv->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); priv->filter = GL_LINEAR; } } else { glTexParameteri (priv->target, GL_TEXTURE_MIN_FILTER, gs->textureFilter ()); glTexParameteri (priv->target, GL_TEXTURE_MAG_FILTER, gs->textureFilter ()); priv->filter = gs->textureFilter (); } } if (priv->filter == GL_LINEAR_MIPMAP_LINEAR) { if (priv->initial) { GL::generateMipmap (priv->target); priv->initial = false; } } } void GLTexture::disable () { glBindTexture (priv->target, 0); #ifndef USE_GLES glDisable (priv->target); #endif } void GLTexture::setData (GLenum target, Matrix &m, bool mipmap) { priv->target = target; priv->matrix = m; priv->mipmapSupport = mipmap; } void GLTexture::setMipmap (bool enable) { priv->mipmap = enable; } void GLTexture::setFilter (GLenum filter) { glBindTexture (priv->target, priv->name); priv->filter = filter; glTexParameteri (priv->target, GL_TEXTURE_MIN_FILTER, filter); glTexParameteri (priv->target, GL_TEXTURE_MAG_FILTER, filter); glBindTexture (priv->target, 0); } void GLTexture::setWrap (GLenum wrap) { glBindTexture (priv->target, priv->name); priv->wrap = GL_CLAMP_TO_EDGE; glTexParameteri (priv->target, GL_TEXTURE_WRAP_S, wrap); glTexParameteri (priv->target, GL_TEXTURE_WRAP_T, wrap); glBindTexture (priv->target, 0); } GLTexture::List PrivateTexture::loadImageData (const char *image, unsigned int width, unsigned int height, GLenum format, GLenum type) { /* TODO Add support for multiple textures */ if ((int) width > GL::maxTextureSize || (int) height > GL::maxTextureSize) return GLTexture::List (); GLTexture::List rv (1); GLTexture *t = new GLTexture (); rv[0] = t; GLTexture::Matrix matrix = _identity_matrix; GLint internalFormat; GLenum target; bool mipmap; bool pot = POWER_OF_TWO (width) && POWER_OF_TWO (height); #ifdef USE_GLES target = GL_TEXTURE_2D; matrix.xx = 1.0f / width; matrix.yy = 1.0f / height; matrix.y0 = 0.0f; mipmap = GL::textureNonPowerOfTwoMipmap || pot; #else if (GL::textureNonPowerOfTwo || pot) { target = GL_TEXTURE_2D; matrix.xx = 1.0f / width; matrix.yy = 1.0f / height; matrix.y0 = 0.0f; mipmap = GL::generateMipmap && (GL::textureNonPowerOfTwoMipmap || pot); } else { target = GL_TEXTURE_RECTANGLE_NV; matrix.xx = 1.0f; matrix.yy = 1.0f; matrix.y0 = 0.0f; mipmap = false; } #endif t->setData (target, matrix, mipmap); t->setGeometry (0, 0, width, height); t->setFilter (GL_NEAREST); t->setWrap (GL_CLAMP_TO_EDGE); #ifdef USE_GLES // For GLES2 no format conversion is allowed, i.e., format must equal internalFormat internalFormat = format; #else internalFormat = GL_RGBA; #endif #ifndef USE_GLES CompOption *opt; opt = GLScreen::get (screen)->getOption ("texture_compression"); if (opt->value ().b () && GL::textureCompression) internalFormat = GL_COMPRESSED_RGBA_ARB; #endif glBindTexture (target, t->name ()); glTexImage2D (target, 0, internalFormat, width, height, 0, format, type, image); glBindTexture (target, 0); return rv; } GLTexture::List GLTexture::imageBufferToTexture (const char *image, CompSize size) { #if IMAGE_BYTE_ORDER == MSBFirst return PrivateTexture::loadImageData (image, size.width (), size.height (), GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV); #else return PrivateTexture::loadImageData (image, size.width (), size.height (), GL_BGRA, GL_UNSIGNED_BYTE); #endif } GLTexture::List GLTexture::imageDataToTexture (const char *image, CompSize size, GLenum format, GLenum type) { return PrivateTexture::loadImageData (image, size.width (), size.height (), format, type); } GLTexture::List GLTexture::readImageToTexture (CompString &imageFileName, CompString &pluginName, CompSize &size) { void *image = NULL; if (!screen->readImageFromFile (imageFileName, pluginName, size, image) || !image) return GLTexture::List (); GLTexture::List rv = GLTexture::imageBufferToTexture ((char *)image, size); free (image); return rv; } void GLTexture::decRef (GLTexture *tex) { tex->priv->refCount--; if (tex->priv->refCount <= 0) delete tex; } void GLTexture::incRef (GLTexture *tex) { tex->priv->refCount++; } GLTexture::List GLTexture::bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source) { if (!GL::textureFromPixmap) { compLogMessage("opengl", CompLogLevelError, "GL::textureFromPixmap is not supported."); } if (width <= 0 || height <= 0) { compLogMessage("opengl", CompLogLevelError, "Couldn't bind 0-sized pixmap to texture: " "the width and height arguments must be nonzero."); return GLTexture::List (); } if (width > GL::maxTextureSize || height > GL::maxTextureSize) { compLogMessage("opengl", CompLogLevelError, "Impossible to bind a pixmap bigger than %dx%d to texture.", GL::maxTextureSize, GL::maxTextureSize); return GLTexture::List (); } GLTexture::List rv; foreach (BindPixmapProc &proc, GLScreen::get (screen)->priv->bindPixmap) { if (!proc.empty ()) rv = proc (pixmap, width, height, depth, source); if (rv.size ()) return rv; } return GLTexture::List (); } #ifdef USE_GLES EglTexture::EglTexture () : damaged (true), damage (None), updateMipMap (true) { } EglTexture::~EglTexture () { GLuint temp = name (); glBindTexture (target (), name ()); glDeleteTextures (1, &temp); glBindTexture (target (), 0); boundPixmapTex.erase (damage); XDamageDestroy (screen->dpy (), damage); } GLTexture::List EglTexture::bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source) { GLTexture::List rv (1); EglTexture *tex = NULL; EGLImageKHR eglImage = NULL; GLTexture::Matrix matrix = _identity_matrix; const EGLint img_attribs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE }; eglImage = GL::createImage (eglGetDisplay (screen->dpy ()), EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, (EGLClientBuffer)pixmap, img_attribs); if (eglImage == EGL_NO_IMAGE_KHR) { compLogMessage ("core", CompLogLevelWarn, "eglCreateImageKHR failed"); return GLTexture::List (); } matrix.xx = 1.0f / width; matrix.yy = 1.0f / height; matrix.y0 = 0.0f; tex = new EglTexture (); tex->setData (GL_TEXTURE_2D, matrix, GL::textureNonPowerOfTwoMipmap || (POWER_OF_TWO (width) && POWER_OF_TWO (height))); tex->setGeometry (0, 0, width, height); rv[0] = tex; glBindTexture (GL_TEXTURE_2D, tex->name ()); GL::eglImageTargetTexture (GL_TEXTURE_2D, (GLeglImageOES)eglImage); GL::destroyImage (eglGetDisplay (screen->dpy ()), eglImage); tex->setFilter (GL_NEAREST); tex->setWrap (GL_CLAMP_TO_EDGE); glBindTexture (GL_TEXTURE_2D, 0); tex->damage = XDamageCreate (screen->dpy (), pixmap, XDamageReportBoundingBox); boundPixmapTex[tex->damage] = tex; return rv; } void EglTexture::enable (GLTexture::Filter filter) { glBindTexture (target (), name ()); GLTexture::enable (filter); if (damaged) updateMipMap = true; if (this->filter () == GL_LINEAR_MIPMAP_LINEAR && updateMipMap) { GL::generateMipmap (target ()); updateMipMap = false; } damaged = false; } #else namespace { bool checkPixmapValidityGLX (Pixmap pixmap) { Window windowReturn; unsigned int uiReturn; int iReturn; if (!XGetGeometry (screen->dpy (), pixmap, &windowReturn, &iReturn, &iReturn, &uiReturn, &uiReturn, &uiReturn, &uiReturn)) return false; return true; } const cgl::WaitGLXFunc & waitGLXFunc () { static const cgl::WaitGLXFunc f (boost::bind (glXWaitX)); return f; } const cgl::PixmapCheckValidityFunc & checkPixmapValidityFunc () { static const cgl::PixmapCheckValidityFunc f (boost::bind (checkPixmapValidityGLX, _1)); return f; } const cgl::BindTexImageEXTFunc & bindTexImageEXT () { static int *attrib_list = NULL; static const cgl::BindTexImageEXTFunc f (boost::bind (GL::bindTexImage, screen->dpy (), _1, GLX_FRONT_LEFT_EXT, attrib_list)); return f; } } TfpTexture::TfpTexture () : pixmap (0), damaged (true), damage (None), updateMipMap (true) { } TfpTexture::~TfpTexture () { if (pixmap) { glEnable (target ()); glBindTexture (target (), name ()); releaseTexImage (); glBindTexture (target (), 0); glDisable (target ()); GL::destroyPixmap (screen->dpy (), pixmap); boundPixmapTex.erase (damage); XDamageDestroy (screen->dpy (), damage); } } bool TfpTexture::bindTexImage (const GLXPixmap &glxPixmap) { return compiz::opengl::bindTexImageGLX (screen->serverGrabInterface (), x11Pixmap, glxPixmap, checkPixmapValidityFunc (), bindTexImageEXT (), waitGLXFunc (), source); } void TfpTexture::releaseTexImage () { (*GL::releaseTexImage) (screen->dpy (), pixmap, GLX_FRONT_LEFT_EXT); } GLTexture::List TfpTexture::bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, cgl::PixmapSource source) { GLTexture::List rv (1); TfpTexture *tex = NULL; unsigned int target = 0; GLenum texTarget = GL_TEXTURE_2D; GLXPixmap glxPixmap = None; GLTexture::Matrix matrix = _identity_matrix; bool mipmap = false; GLFBConfig *config = GLScreen::get (screen)->glxPixmapFBConfig (depth); int attribs[7], i = 0; if (!config->fbConfig) { compLogMessage ("core", CompLogLevelWarn, "No GLXFBConfig for depth %d", depth); return GLTexture::List (); } attribs[i++] = GLX_TEXTURE_FORMAT_EXT; attribs[i++] = config->textureFormat; bool pot = POWER_OF_TWO (width) && POWER_OF_TWO (height); /* If no texture target is specified in the fbconfig, or only the TEXTURE_2D target is specified and GL_texture_non_power_of_two is not supported, then allow the server to choose the texture target. */ if (config->textureTargets & GLX_TEXTURE_2D_BIT_EXT && (GL::textureNonPowerOfTwo || pot)) target = GLX_TEXTURE_2D_EXT; else if (config->textureTargets & GLX_TEXTURE_RECTANGLE_BIT_EXT) target = GLX_TEXTURE_RECTANGLE_EXT; mipmap = config->mipmap && GL::generateMipmap != NULL && (pot || GL::textureNonPowerOfTwoMipmap); attribs[i++] = GLX_MIPMAP_TEXTURE_EXT; attribs[i++] = mipmap; /* Workaround for broken texture from pixmap implementations, that don't advertise any texture target in the fbconfig. */ if (!target) { if (!(config->textureTargets & GLX_TEXTURE_2D_BIT_EXT)) target = GLX_TEXTURE_RECTANGLE_EXT; else if (!(config->textureTargets & GLX_TEXTURE_RECTANGLE_BIT_EXT)) target = GLX_TEXTURE_2D_EXT; } if (target) { attribs[i++] = GLX_TEXTURE_TARGET_EXT; attribs[i++] = target; } attribs[i++] = None; /* We need to take a server grab here if the pixmap is * externally managed as we need to be able to query * if it actually exists */ boost::scoped_ptr lock; if (source == cgl::ExternallyManaged) { lock.reset (new ServerLock (screen->serverGrabInterface ())); if (!checkPixmapValidityGLX (pixmap)) return false; } glxPixmap = (*GL::createPixmap) (screen->dpy (), config->fbConfig, pixmap, attribs); if (!glxPixmap) { compLogMessage ("core", CompLogLevelWarn, "glXCreatePixmap failed"); return GLTexture::List (); } if (!target) (*GL::queryDrawable) (screen->dpy (), glxPixmap, GLX_TEXTURE_TARGET_EXT, &target); switch (target) { case GLX_TEXTURE_2D_EXT: texTarget = GL_TEXTURE_2D; matrix.xx = 1.0f / width; if (config->yInverted) { matrix.yy = 1.0f / height; matrix.y0 = 0.0f; } else { matrix.yy = -1.0f / height; matrix.y0 = 1.0f; } break; case GLX_TEXTURE_RECTANGLE_EXT: texTarget = GL_TEXTURE_RECTANGLE_ARB; matrix.xx = 1.0f; if (config->yInverted) { matrix.yy = 1.0f; matrix.y0 = 0; } else { matrix.yy = -1.0f; matrix.y0 = height; } break; default: compLogMessage ("core", CompLogLevelWarn, "pixmap 0x%x can't be bound to texture", (int) pixmap); GL::destroyPixmap (screen->dpy (), glxPixmap); glxPixmap = None; return GLTexture::List (); } tex = new TfpTexture (); tex->setData (texTarget, matrix, mipmap); tex->setGeometry (0, 0, width, height); tex->pixmap = glxPixmap; tex->x11Pixmap = pixmap; tex->source = source; rv[0] = tex; glBindTexture (texTarget, tex->name ()); tex->bindTexImage (glxPixmap); tex->setFilter (GL_NEAREST); tex->setWrap (GL_CLAMP_TO_EDGE); glBindTexture (texTarget, 0); tex->damage = XDamageCreate (screen->dpy (), pixmap, XDamageReportBoundingBox); boundPixmapTex[tex->damage] = tex; return rv; } void TfpTexture::enable (GLTexture::Filter filter) { glEnable (target ()); glBindTexture (target (), name ()); if (damaged && pixmap) { releaseTexImage (); bindTexImage (pixmap); } GLTexture::enable (filter); if (damaged) updateMipMap = true; if (this->filter () == GL_LINEAR_MIPMAP_LINEAR && updateMipMap) { (*GL::generateMipmap) (target ()); updateMipMap = false; } damaged = false; } #endif compiz-0.9.11+14.04.20140409/plugins/opengl/src/program.cpp0000644000015301777760000001500512321343002023402 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins */ #include #include #include class PrivateProgram { public: GLuint program; bool valid; }; void printShaderInfoLog (GLuint shader) { GLint length = 0; GLint chars = 0; (*GL::getShaderiv) (shader, GL::INFO_LOG_LENGTH, &length); if (length > 0) { GLchar *infoLog; infoLog = new GLchar[length]; (*GL::getShaderInfoLog) (shader, length, &chars, infoLog); std::cout << infoLog << std::endl; delete[] infoLog; } } void printProgramInfoLog(GLuint program) { GLint length = 0; GLint chars = 0; (*GL::getProgramiv) (program, GL::INFO_LOG_LENGTH, &length); if (length > 0) { GLchar *infoLog; infoLog = new GLchar[length]; (*GL::getProgramInfoLog) (program, length, &chars, infoLog); std::cout << infoLog << std::endl; delete[] infoLog; } } static bool compileShader (GLuint *shader, GLenum type, CompString &source) { const GLchar *data; GLint status; data = (GLchar *)source.c_str (); *shader = (*GL::createShader) (type); (*GL::shaderSource) (*shader, 1, &data, NULL); (*GL::compileShader) (*shader); (*GL::getShaderiv) (*shader, GL::COMPILE_STATUS, &status); return (status == GL_TRUE); } GLProgram::GLProgram (CompString &vertexShader, CompString &fragmentShader) : priv (new PrivateProgram ()) { GLuint vertex, fragment; GLint status; priv->valid = false; priv->program = (*GL::createProgram) (); if (!compileShader (&vertex, GL::VERTEX_SHADER, vertexShader)) { printShaderInfoLog (vertex); std::cout << vertexShader << std::endl << std::endl; return; } if (!compileShader (&fragment, GL::FRAGMENT_SHADER, fragmentShader)) { printShaderInfoLog (fragment); std::cout << fragmentShader << std::endl << std::endl; return; } (*GL::attachShader) (priv->program, vertex); (*GL::attachShader) (priv->program, fragment); (*GL::linkProgram) (priv->program); (*GL::validateProgram) (priv->program); (*GL::getProgramiv) (priv->program, GL::LINK_STATUS, &status); if (status == GL_FALSE) { printProgramInfoLog (priv->program); return; } (*GL::deleteShader) (vertex); (*GL::deleteShader) (fragment); priv->valid = true; } GLProgram::~GLProgram () { (*GL::deleteProgram) (priv->program); delete priv; } bool GLProgram::valid () { return priv->valid; } void GLProgram::bind () { (*GL::useProgram) (priv->program); } void GLProgram::unbind () { (*GL::useProgram) (0); } bool GLProgram::setUniform (const char *name, GLfloat value) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform1f) (location, value); return true; } bool GLProgram::setUniform (const char *name, GLint value) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform1i) (location, value); return true; } bool GLProgram::setUniform (const char *name, const GLMatrix &value) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniformMatrix4fv) (location, 1, GL_FALSE, value.getMatrix ()); return true; } bool GLProgram::setUniform2f (const char *name, GLfloat x, GLfloat y) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform2f) (location, x, y); return true; } bool GLProgram::setUniform3f (const char *name, GLfloat x, GLfloat y, GLfloat z) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform3f) (location, x, y, z); return true; } bool GLProgram::setUniform4f (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform4f) (location, x, y, z, w); return true; } bool GLProgram::setUniform2i (const char *name, GLint x, GLint y) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform2i) (location, x, y); return true; } bool GLProgram::setUniform3i (const char *name, GLint x, GLint y, GLint z) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform3i) (location, x, y, z); return true; } bool GLProgram::setUniform4i (const char *name, GLint x, GLint y, GLint z, GLint w) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform4i) (location, x, y, z, w); return true; } GLuint GLProgram::attributeLocation (const char *name) { return (*GL::getAttribLocation) (priv->program, name); } compiz-0.9.11+14.04.20140409/plugins/opengl/src/framebufferobject.cpp0000644000015301777760000001352512321343002025413 0ustar pbusernogroup00000000000000/* * Copyright (c) 2011 Collabora, Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Collabora Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Collabora Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * COLLABORA LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL COLLABORA LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Pekka Paalanen */ #include #include #include struct PrivateGLFramebufferObject { PrivateGLFramebufferObject () : fboId (0), pushedId (0), glTex (NULL), status (-1) { } void pushFBO (); void popFBO (); GLuint fboId; GLuint pushedId; GLuint rbStencilId; GLTexture *glTex; GLint status; static GLuint boundId; static std::map idMap; }; GLuint PrivateGLFramebufferObject::boundId = 0; std::map PrivateGLFramebufferObject::idMap; void PrivateGLFramebufferObject::pushFBO () { pushedId = boundId; if (boundId != fboId) { (*GL::bindFramebuffer) (GL::FRAMEBUFFER, fboId); boundId = fboId; } } void PrivateGLFramebufferObject::popFBO () { if (boundId != pushedId) { (*GL::bindFramebuffer) (GL::FRAMEBUFFER, pushedId); boundId = pushedId; } } GLFramebufferObject::GLFramebufferObject () : priv (new PrivateGLFramebufferObject) { (*GL::genFramebuffers) (1, &priv->fboId); (*GL::genRenderbuffers) (1, &priv->rbStencilId); if (priv->fboId != 0) PrivateGLFramebufferObject::idMap[priv->fboId] = this; } GLFramebufferObject::~GLFramebufferObject () { if (priv->glTex) GLTexture::decRef (priv->glTex); PrivateGLFramebufferObject::idMap.erase (priv->fboId); (*GL::deleteFramebuffers) (1, &priv->fboId); (*GL::deleteRenderbuffers) (1, &priv->rbStencilId); delete priv; } bool GLFramebufferObject::allocate (const CompSize &size, const char *image, GLenum format, GLenum type) { priv->status = -1; if (!priv->glTex || size.width () != priv->glTex->width () || size.height () != priv->glTex->height ()) { if (priv->glTex) GLTexture::decRef (priv->glTex); priv->glTex = NULL; GLTexture::List list = GLTexture::imageDataToTexture (image, size, format, type); if (list.size () != 1 || list[0] == NULL) return false; priv->glTex = list[0]; GLTexture::incRef (priv->glTex); if (GL::fboStencilSupported) { (*GL::bindRenderbuffer) (GL::RENDERBUFFER, priv->rbStencilId); (*GL::renderbufferStorage) (GL::RENDERBUFFER, GL::DEPTH24_STENCIL8, size.width (), size.height ()); } } priv->pushFBO (); (*GL::framebufferTexture2D) (GL::FRAMEBUFFER, GL::COLOR_ATTACHMENT0, priv->glTex->target (), priv->glTex->name (), 0); priv->status = (*GL::checkFramebufferStatus) (GL::DRAW_FRAMEBUFFER); priv->popFBO (); return true; } GLFramebufferObject * GLFramebufferObject::bind () { GLFramebufferObject *old = NULL; if (priv->boundId != 0) { std::map::iterator it; it = PrivateGLFramebufferObject::idMap.find (priv->boundId); if (it != PrivateGLFramebufferObject::idMap.end ()) old = it->second; else compLogMessage ("opengl", CompLogLevelError, "An FBO without GLFramebufferObject cannot be restored"); } (*GL::bindFramebuffer) (GL::FRAMEBUFFER, priv->fboId); priv->boundId = priv->fboId; (*GL::framebufferRenderbuffer) (GL::FRAMEBUFFER, GL::DEPTH_ATTACHMENT, GL::RENDERBUFFER, priv->rbStencilId); (*GL::framebufferRenderbuffer) (GL::FRAMEBUFFER, GL::STENCIL_ATTACHMENT, GL::RENDERBUFFER, priv->rbStencilId); return old; } // static void GLFramebufferObject::rebind (GLFramebufferObject *fbo) { GLuint id = fbo ? fbo->priv->fboId : 0; if (id != fbo->priv->boundId) { (*GL::bindFramebuffer) (GL::FRAMEBUFFER, id); fbo->priv->boundId = id; } } static const char * getFboErrorString (GLint status) { switch (status) { case GL::FRAMEBUFFER_COMPLETE: return "GL::FRAMEBUFFER_COMPLETE"; case GL::FRAMEBUFFER_INCOMPLETE_ATTACHMENT: return "GL::FRAMEBUFFER_INCOMPLETE_ATTACHMENT"; case GL::FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: return "GL::FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"; case GL::FRAMEBUFFER_INCOMPLETE_DIMENSIONS: return "GL::FRAMEBUFFER_INCOMPLETE_DIMENSIONS"; case GL::FRAMEBUFFER_UNSUPPORTED: return "GL::FRAMEBUFFER_UNSUPPORTED"; default: return "unexpected status"; } } bool GLFramebufferObject::checkStatus () { priv->pushFBO (); priv-> status = (*GL::checkFramebufferStatus) (GL_FRAMEBUFFER); priv->popFBO (); if (priv->status == static_cast (GL::FRAMEBUFFER_COMPLETE)) return true; compLogMessage ("opengl", CompLogLevelError, "FBO is incomplete: %s (0x%04x)", getFboErrorString (priv->status), priv->status); return false; } GLTexture * GLFramebufferObject::tex () { return priv->glTex; } compiz-0.9.11+14.04.20140409/plugins/opengl/src/programcache.cpp0000644000015301777760000001221612321343002024367 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins */ #include #include #include "privates.h" typedef std::list access_history_t; typedef std::pair, access_history_t::iterator> value; static GLProgram * compileProgram (std::string name, std::list shaders) { std::list::const_iterator it; std::string vertex_shader; std::string fragment_shader; std::string vertex_functions = ""; std::string vertex_function_calls = ""; std::string fragment_functions = ""; std::string fragment_function_calls = ""; int vpos, vcallpos, fpos, fcallpos; for (it = shaders.begin (); it != shaders.end (); ++it) { //find the special shaders to put the rest in if ((*it)->vertexShader.find ("@VERTEX_FUNCTIONS@") != std::string::npos) { vertex_shader = (*it)->vertexShader; } else { if ((*it)->vertexShader.length ()) { vertex_functions += (*it)->vertexShader; vertex_function_calls += (*it)->name + "_vertex();\n"; } } if ((*it)->fragmentShader.find ("@FRAGMENT_FUNCTIONS@") != std::string::npos) { fragment_shader = (*it)->fragmentShader; } else { if ((*it)->fragmentShader.length ()) { fragment_functions += (*it)->fragmentShader; fragment_function_calls += (*it)->name + "_fragment();\n"; } } } // put shader functions and function calls into the main shader vpos = vertex_shader.find ("@VERTEX_FUNCTIONS@"); vertex_shader.replace (vpos, 18, vertex_functions); vcallpos = vertex_shader.find ("@VERTEX_FUNCTION_CALLS@"); vertex_shader.replace (vcallpos, 23, vertex_function_calls); fpos = fragment_shader.find ("@FRAGMENT_FUNCTIONS@"); fragment_shader.replace (fpos, 20, fragment_functions); fcallpos = fragment_shader.find ("@FRAGMENT_FUNCTION_CALLS@"); fragment_shader.replace (fcallpos, 25, fragment_function_calls); return new GLProgram (vertex_shader, fragment_shader); } class PrivateProgramCache { public: PrivateProgramCache (size_t); const size_t capacity; access_history_t access_history; std::map cache; void insert (std::string, GLProgram *); void evict (); }; GLProgramCache::GLProgramCache (size_t capacity) : priv (new PrivateProgramCache (capacity)) { assert (priv->capacity != 0); } GLProgramCache::~GLProgramCache () { delete priv; } GLProgram* GLProgramCache::operator () (std::list shaders) { std::list::const_iterator name_it; std::string name; for (name_it = shaders.begin(); name_it != shaders.end(); ++name_it) { if (name.length () == 0) name += (*name_it)->name; else name += ":" + (*name_it)->name; } std::map::iterator it = priv->cache.find (name); if (it == priv->cache.end ()) { GLProgram *program = compileProgram (name, shaders); priv->insert (name, program); return program; } else { priv->access_history.splice (priv->access_history.end (), priv->access_history, (*it).second.second); (*it).second.second = priv->access_history.rbegin ().base (); return (*it).second.first.get (); } } PrivateProgramCache::PrivateProgramCache (size_t c) : capacity (c) { } void PrivateProgramCache::insert (std::string name, GLProgram *program) { assert (cache.find (name) == cache.end ()); if (cache.size () == capacity) evict (); // update most recently used GLProgram access_history_t::iterator it = access_history.insert (access_history.end (), name); cache.insert (std::make_pair (name, std::make_pair (program, it))); } void PrivateProgramCache::evict () { assert (!access_history.empty ()); // find least recently used GLProgram std::map::iterator it = cache.find (access_history.front ()); assert (it != cache.end ()); cache.erase (it); access_history.pop_front (); } compiz-0.9.11+14.04.20140409/plugins/opengl/src/vertexbuffer.cpp0000644000015301777760000004323312321343002024446 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins * Frederic Plourde * Alexandros Frantzis */ #include #include #ifdef USE_GLES #include #else #include #include #endif #include #include "privates.h" GLVertexBuffer *PrivateVertexBuffer::streamingBuffer = NULL; bool GLVertexBuffer::enabled () { // FIXME: GL::shaders shouldn't be a requirement here. But for now, // fglrx doesn't have GL::shaders and that causes blending problems. return GL::vboEnabled && GL::shaders; } GLVertexBuffer::GLVertexBuffer () : priv (new PrivateVertexBuffer ()) { priv->usage = GL::STATIC_DRAW; colorDefault (); } GLVertexBuffer::GLVertexBuffer (GLenum usage) : priv (new PrivateVertexBuffer ()) { if (usage != GL::STATIC_DRAW && usage != GL::DYNAMIC_DRAW && usage != GL::STREAM_DRAW) usage = GL::STATIC_DRAW; priv->usage = usage; colorDefault (); } GLVertexBuffer::~GLVertexBuffer () { delete priv; } GLVertexBuffer *GLVertexBuffer::streamingBuffer () { if (PrivateVertexBuffer::streamingBuffer == NULL) PrivateVertexBuffer::streamingBuffer = new GLVertexBuffer (GL::STREAM_DRAW); return PrivateVertexBuffer::streamingBuffer; } void GLVertexBuffer::begin (GLenum primitiveType /* = GL_TRIANGLES */) { priv->primitiveType = primitiveType; priv->vertexData.clear (); priv->vertexOffset = 0; priv->maxVertices = -1; priv->normalData.clear (); priv->colorData.clear (); priv->uniforms.clear (); priv->nTextures = 0; for (int i = 0; i < PrivateVertexBuffer::MAX_TEXTURES; i++) priv->textureData[i].clear (); } bool GLVertexBuffer::end () { if (priv->vertexData.empty ()) return false; if (!enabled ()) return true; GL::bindBuffer (GL_ARRAY_BUFFER, priv->vertexBuffer); GL::bufferData (GL_ARRAY_BUFFER, sizeof(GLfloat) * priv->vertexData.size (), &priv->vertexData[0], priv->usage); if (priv->normalData.size ()) { GL::bindBuffer (GL_ARRAY_BUFFER, priv->normalBuffer); GL::bufferData (GL_ARRAY_BUFFER, sizeof(GLfloat) * priv->normalData.size (), &priv->normalData[0], priv->usage); } if (!priv->colorData.size ()) { priv->colorData.resize (4); priv->colorData[0] = priv->color[0]; priv->colorData[1] = priv->color[1]; priv->colorData[2] = priv->color[2]; priv->colorData[3] = priv->color[3]; } if (priv->colorData.size ()) { GL::bindBuffer (GL_ARRAY_BUFFER, priv->colorBuffer); GL::bufferData (GL_ARRAY_BUFFER, sizeof(GLfloat) * priv->colorData.size (), &priv->colorData[0], priv->usage); } for (GLuint i = 0; i < priv->nTextures; i++) { GL::bindBuffer (GL_ARRAY_BUFFER, priv->textureBuffers[i]); GL::bufferData (GL_ARRAY_BUFFER, sizeof(GLfloat) * priv->textureData[i].size (), &priv->textureData[i][0], priv->usage); } GL::bindBuffer (GL_ARRAY_BUFFER, 0); return true; } void GLVertexBuffer::addVertices (GLuint nVertices, const GLfloat *vertices) { priv->vertexData.reserve (priv->vertexData.size () + (nVertices * 3)); for (GLuint i = 0; i < nVertices * 3; i++) { priv->vertexData.push_back (vertices[i]); } } GLfloat *GLVertexBuffer::getVertices() const { return &priv->vertexData[0]; } int GLVertexBuffer::getVertexStride() const { return 3; // as seen in addVertices } int GLVertexBuffer::countVertices() const { return priv->vertexData.size() / 3; } void GLVertexBuffer::setVertexOffset (GLuint vOffset) { priv->vertexOffset = vOffset; } void GLVertexBuffer::setMaxVertices (GLint vMax) { priv->maxVertices = vMax; } void GLVertexBuffer::addNormals (GLuint nNormals, const GLfloat *normals) { priv->normalData.reserve (priv->normalData.size () + (nNormals * 3)); for (GLuint i = 0; i < nNormals * 3; i++) { priv->normalData.push_back (normals[i]); } } void GLVertexBuffer::addColors (GLuint nColors, const GLushort *colors) { priv->colorData.reserve (priv->colorData.size () + (nColors * 4)); for (GLuint i = 0; i < nColors * 4; i++) { priv->colorData.push_back (colors[i] / 65535.0f); } } void GLVertexBuffer::color4f (GLfloat r, GLfloat g, GLfloat b, GLfloat a) { priv->color[0] = r; priv->color[1] = g; priv->color[2] = b; priv->color[3] = a; } void GLVertexBuffer::colorDefault () { priv->color[0] = defaultColor[0] / 65535.0; priv->color[1] = defaultColor[1] / 65535.0; priv->color[2] = defaultColor[2] / 65535.0; priv->color[3] = defaultColor[3] / 65535.0; } void GLVertexBuffer::addTexCoords (GLuint texture, GLuint nTexcoords, const GLfloat *texcoords) { if (texture >= PrivateVertexBuffer::MAX_TEXTURES) return; if (texture >= priv->nTextures) priv->nTextures = texture + 1; std::vector &data = priv->textureData[texture]; data.reserve (data.size () + (nTexcoords * 2)); for (GLuint i = 0; i < nTexcoords * 2; i++) data.push_back (texcoords[i]); } void GLVertexBuffer::addUniform (const char *name, GLfloat value) { // we're casting to double here to make our template va_arg happy Uniform* uniform = new Uniform(name, (double)value); priv->uniforms.push_back (uniform); } void GLVertexBuffer::addUniform (const char *name, GLint value) { Uniform* uniform = new Uniform(name, value); priv->uniforms.push_back (uniform); } bool GLVertexBuffer::addUniform (const char *name, const GLMatrix &value) { //#warning Add 'addUniform' support to GLMatrix type ! return true; } void GLVertexBuffer::addUniform2f (const char *name, GLfloat x, GLfloat y) { // we're casting to double here to make our template va_arg happy Uniform* uniform = new Uniform(name, (double)x, (double)y); priv->uniforms.push_back (uniform); } void GLVertexBuffer::addUniform3f (const char *name, GLfloat x, GLfloat y, GLfloat z) { // we're casting to double here to make our template va_arg happy Uniform* uniform = new Uniform(name, (double)x, (double)y, (double)z); priv->uniforms.push_back (uniform); } void GLVertexBuffer::addUniform4f (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { // we're casting to double here to make our template va_arg happy Uniform* uniform = new Uniform(name, (double)x, (double)y, (double)z, (double)w); priv->uniforms.push_back (uniform); } void GLVertexBuffer::addUniform2i (const char *name, GLint x, GLint y) { Uniform* uniform = new Uniform(name, x, y); priv->uniforms.push_back (uniform); } void GLVertexBuffer::addUniform3i (const char *name, GLint x, GLint y, GLint z) { Uniform* uniform = new Uniform(name, x, y, z); priv->uniforms.push_back (uniform); } void GLVertexBuffer::addUniform4i (const char *name, GLint x, GLint y, GLint z, GLint w) { Uniform* uniform = new Uniform(name, x, y, z, w); priv->uniforms.push_back (uniform); } void GLVertexBuffer::setProgram (GLProgram *program) { priv->program = program; } void GLVertexBuffer::setAutoProgram (AutoProgram *autoProgram) { priv->autoProgram = autoProgram; } int GLVertexBuffer::render () { if (enabled ()) return priv->render (NULL, NULL, NULL); else return -1; } int GLVertexBuffer::render (const GLMatrix &modelview) { const GLWindowPaintAttrib attrib = { OPAQUE, BRIGHT, COLOR, 0, 0, 0, 0 }; return render (modelview, attrib); } int GLVertexBuffer::render (const GLMatrix &modelview, const GLWindowPaintAttrib &attrib) { GLScreen *gScreen = GLScreen::get (screen); GLMatrix *projection = gScreen->projectionMatrix (); return render (*projection, modelview, attrib); } #if 0 #define PRINT_MATRIX(m) printMatrix ((m), #m) static void printMatrix (const GLMatrix &matrix, const char *title = NULL) { const float *m = matrix.getMatrix(); printf ("--- %s ---\n", title ? title : "?"); for (int y = 0; y < 4; y++) printf ("[%5.1f %5.1f %5.1f %5.1f]\n", m[y], m[y+4], m[y+8], m[y+12]); } #else #define PRINT_MATRIX(m) #endif int GLVertexBuffer::render (const GLMatrix &projection, const GLMatrix &modelview, const GLWindowPaintAttrib &attrib) { if (!priv->vertexData.size ()) return -1; PRINT_MATRIX(modelview); PRINT_MATRIX(projection); if (enabled ()) return priv->render (&projection, &modelview, &attrib); else return priv->legacyRender (projection, modelview, attrib); } PrivateVertexBuffer::PrivateVertexBuffer () : nTextures (0), vertexOffset (0), maxVertices (-1), program (NULL), autoProgram (0) { if (!GL::genBuffers) return; GL::genBuffers (1, &vertexBuffer); GL::genBuffers (1, &normalBuffer); GL::genBuffers (1, &colorBuffer); GL::genBuffers (4, &textureBuffers[0]); } PrivateVertexBuffer::~PrivateVertexBuffer () { if (!GL::deleteBuffers) return; if (vertexBuffer) GL::deleteBuffers (1, &vertexBuffer); if (normalBuffer) GL::deleteBuffers (1, &normalBuffer); if (colorBuffer) GL::deleteBuffers (1, &colorBuffer); if (textureBuffers[0]) GL::deleteBuffers (4, &textureBuffers[0]); } int PrivateVertexBuffer::render (const GLMatrix *projection, const GLMatrix *modelview, const GLWindowPaintAttrib *attrib) { GLfloat attribs[3] = {1, 1, 1}; GLint positionIndex = -1; GLint normalIndex = -1; GLint colorIndex = -1; GLint texCoordIndex[4] = {-1, -1, -1, -1}; GLProgram *tmpProgram = program; // If we don't have an explicitly set program, try to get one // using the AutoProgram callback object. if (tmpProgram == NULL && autoProgram) { // Convert attrib to shader parameters GLShaderParameters params; params.opacity = attrib->opacity != OPAQUE; params.brightness = attrib->brightness != BRIGHT; params.saturation = attrib->saturation != COLOR; params.color = colorData.size () == 4 ? GLShaderVariableUniform : colorData.size () > 4 ? GLShaderVariableVarying : GLShaderVariableNone; params.normal = normalData.size () <= 4 ? GLShaderVariableUniform : GLShaderVariableVarying; params.numTextures = nTextures; // Get a program matching the parameters tmpProgram = autoProgram->getProgram(params); } if (tmpProgram == NULL) { std::cerr << "no program defined!" << std::endl; return -1; } tmpProgram->bind (); if (!tmpProgram->valid ()) { return -1; } if (projection) tmpProgram->setUniform ("projection", *projection); if (modelview) tmpProgram->setUniform ("modelview", *modelview); positionIndex = tmpProgram->attributeLocation ("position"); (*GL::enableVertexAttribArray) (positionIndex); (*GL::bindBuffer) (GL::ARRAY_BUFFER, vertexBuffer); (*GL::vertexAttribPointer) (positionIndex, 3, GL_FLOAT, GL_FALSE, 0, 0); (*GL::bindBuffer) (GL::ARRAY_BUFFER, 0); //use default normal if (normalData.empty ()) { tmpProgram->setUniform3f ("singleNormal", 0.0f, 0.0f, -1.0f); } // special case a single normal and apply it to the entire operation else if (normalData.size () == 3) { tmpProgram->setUniform3f ("singleNormal", normalData[0], normalData[1], normalData[2]); } else if (normalData.size () > 3) { normalIndex = tmpProgram->attributeLocation ("normal"); (*GL::enableVertexAttribArray) (normalIndex); (*GL::bindBuffer) (GL::ARRAY_BUFFER, normalBuffer); (*GL::vertexAttribPointer) (normalIndex, 3, GL_FLOAT, GL_FALSE, 0, 0); (*GL::bindBuffer) (GL::ARRAY_BUFFER, 0); } // special case a single color and apply it to the entire operation if (colorData.size () == 4) { tmpProgram->setUniform4f ("singleColor", colorData[0], colorData[1], colorData[2], colorData[3]); } else if (colorData.size () > 4) { colorIndex = tmpProgram->attributeLocation ("color"); (*GL::enableVertexAttribArray) (colorIndex); (*GL::bindBuffer) (GL::ARRAY_BUFFER, colorBuffer); (*GL::vertexAttribPointer) (colorIndex, 4, GL_FLOAT, GL_FALSE, 0, 0); (*GL::bindBuffer) (GL::ARRAY_BUFFER, 0); } for (int i = nTextures - 1; i >= 0; i--) { char name[10]; snprintf (name, 10, "texCoord%d", i); texCoordIndex[i] = tmpProgram->attributeLocation (name); (*GL::enableVertexAttribArray) (texCoordIndex[i]); (*GL::bindBuffer) (GL::ARRAY_BUFFER, textureBuffers[i]); (*GL::vertexAttribPointer) (texCoordIndex[i], 2, GL_FLOAT, GL_FALSE, 0, 0); (*GL::bindBuffer) (GL::ARRAY_BUFFER, 0); snprintf (name, 9, "texture%d", i); tmpProgram->setUniform (name, i); } // set per-plugin uniforms for (unsigned int i = 0; i < uniforms.size (); i++) { uniforms[i]->set (tmpProgram); } //convert paint attribs to 0-1 range if (attrib) { attribs[0] = attrib->opacity / 65535.0f; attribs[1] = attrib->brightness / 65535.0f; attribs[2] = attrib->saturation / 65535.0f; tmpProgram->setUniform3f ("paintAttrib", attribs[0], attribs[1], attribs[2]); } glDrawArrays (primitiveType, vertexOffset, maxVertices > 0 ? std::min (static_cast (vertexData.size () / 3), maxVertices) : vertexData.size () / 3); for (int i = 0; i < 4; ++i) { if (texCoordIndex[i] != -1) (*GL::disableVertexAttribArray) (texCoordIndex[i]); } if (colorIndex != -1) (*GL::disableVertexAttribArray) (colorIndex); if (normalIndex != -1) (*GL::disableVertexAttribArray) (normalIndex); (*GL::disableVertexAttribArray) (positionIndex); tmpProgram->unbind (); return 0; } int PrivateVertexBuffer::legacyRender (const GLMatrix &projection, const GLMatrix &modelview, const GLWindowPaintAttrib &attrib) { #ifndef USE_GLES glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadMatrixf (projection.getMatrix ()); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadMatrixf (modelview.getMatrix ()); glEnableClientState (GL_VERTEX_ARRAY); glVertexPointer (3, GL_FLOAT, 0, &vertexData[0]); //use default normal if (normalData.empty ()) { glNormal3f (0.0f, 0.0f, -1.0f); } // special case a single normal and apply it to the entire operation else if (normalData.size () == 3) { glNormal3fv (&normalData[0]); } else if (normalData.size () > 3) { glEnableClientState (GL_NORMAL_ARRAY); glNormalPointer (GL_FLOAT, 0, &normalData[0]); } // special case a single color and apply it to the entire operation if (colorData.size () == 4) { glColor4fv (&colorData[0]); } else if (colorData.size () > 4) { glEnableClientState (GL_COLOR_ARRAY); glColorPointer (4, GL_FLOAT, 0, &colorData[0]); } for (int i = nTextures - 1; i >= 0; i--) { GL::clientActiveTexture (GL_TEXTURE0_ARB + i); glEnableClientState (GL_TEXTURE_COORD_ARRAY); glTexCoordPointer (2, GL_FLOAT, 0, &textureData[i][0]); } glDrawArrays (primitiveType, vertexOffset, vertexData.size () / 3); glDisableClientState (GL_VERTEX_ARRAY); glDisableClientState (GL_NORMAL_ARRAY); glDisableClientState (GL_COLOR_ARRAY); for (int i = nTextures; i > 0; i--) { GL::clientActiveTexture (GL_TEXTURE0_ARB + i); glDisableClientState (GL_TEXTURE_COORD_ARRAY); } GL::clientActiveTexture (GL_TEXTURE0_ARB); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glPopMatrix (); #endif return 0; } compiz-0.9.11+14.04.20140409/plugins/opengl/src/privates.h0000644000015301777760000001645312321343002023245 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _OPENGL_PRIVATES_H #define _OPENGL_PRIVATES_H #include #include #include #include #include #include #include #include #include #include #include "privatetexture.h" #include "privatevertexbuffer.h" #include "opengl_options.h" extern CompOutput *targetOutput; class GLDoubleBuffer : public compiz::opengl::DoubleBuffer { public: GLDoubleBuffer (Display *, const CompSize &, const compiz::opengl::impl::GLXSwapIntervalEXTFunc &, const compiz::opengl::impl::GLXWaitVideoSyncSGIFunc &); protected: Display *mDpy; const CompSize &mSize; }; #ifndef USE_GLES class GLXDoubleBuffer : public GLDoubleBuffer { public: GLXDoubleBuffer (Display *, const CompSize &, Window); void swap () const; bool blitAvailable () const; void blit (const CompRegion ®ion) const; bool fallbackBlitAvailable () const; void fallbackBlit (const CompRegion ®ion) const; void copyFrontToBack () const; protected: Window mOutput; }; #else class EGLDoubleBuffer : public GLDoubleBuffer { public: EGLDoubleBuffer (Display *, const CompSize &, EGLSurface const &); void swap () const; bool blitAvailable () const; void blit (const CompRegion ®ion) const; bool fallbackBlitAvailable () const; void fallbackBlit (const CompRegion ®ion) const; void copyFrontToBack () const; private: EGLSurface const & mSurface; }; #endif class GLIcon { public: GLIcon () : icon (NULL) {} CompIcon *icon; GLTexture::List textures; }; class FrameProvider { public: typedef boost::shared_ptr Ptr; typedef std::tr1::tuple Frame; virtual ~FrameProvider () {} virtual GLuint getCurrentFrame () = 0; virtual void endFrame () = 0; virtual bool providesPersistence () = 0; virtual bool alwaysPostprocess () = 0; virtual void invalidateAll () = 0; }; class PrivateGLScreen : public ScreenInterface, public CompositeScreenInterface, public compiz::composite::PaintHandler, public OpenglOptions { public: PrivateGLScreen (GLScreen *gs); ~PrivateGLScreen (); bool setOption (const CompString &name, CompOption::Value &value); void handleEvent (XEvent *event); void outputChangeNotify (); void paintOutputs (CompOutput::ptrList &outputs, unsigned int mask, const CompRegion ®ion); bool hasVSync (); bool requiredForcedRefreshRate (); unsigned int getFrameAge (); void updateRenderMode (); void updateFrameProvider (); void prepareDrawing (); bool compositingActive (); void damageCutoff (); void paintBackground (const GLMatrix &transform, const CompRegion ®ion, bool transformed); void paintOutputRegion (const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void updateScreenBackground (); void updateView (); bool driverIsBlacklisted (const char *regex) const; bool postprocessRequiredForCurrentFrame (); public: GLScreen *gScreen; CompositeScreen *cScreen; GLenum textureFilter; #ifndef USE_GLES GLFBConfig glxPixmapFBConfigs[MAX_DEPTH + 1]; #endif GLTexture::List backgroundTextures; bool backgroundLoaded; GLTexture::Filter filter[3]; CompPoint rasterPos; GLMatrix *projection; bool clearBuffers; bool lighting; #ifdef USE_GLES EGLContext ctx; EGLSurface surface; EGLDoubleBuffer doubleBuffer; #else GLXContext ctx; GL::GLXGetProcAddressProc getProcAddress; GLXDoubleBuffer doubleBuffer; #endif boost::shared_ptr scratchFbo; CompRegion outputRegion; XRectangle lastViewport; bool refreshSubBuffer; unsigned int lastMask; std::vector bindPixmap; bool hasCompositing; bool commonFrontbuffer; bool incorrectRefreshRate; // hack for NVIDIA specifying an incorrect // refresh rate, causing us to miss vblanks GLIcon defaultIcon; Window saveWindow; // hack for broken applications, see: // https://bugs.launchpad.net/ubuntu/+source/compiz/+bug/807487 GLProgramCache *programCache; GLShaderCache shaderCache; GLVertexBuffer::AutoProgram *autoProgram; Pixmap rootPixmapCopy; CompSize rootPixmapSize; FrameProvider::Ptr frameProvider; const char *glVendor, *glRenderer, *glVersion; bool postprocessingRequired; mutable CompString prevRegex; mutable bool prevBlacklisted; }; class PrivateGLWindow : public WindowInterface, public CompositeWindowInterface { public: static const unsigned int UpdateRegion = 1 << 0; static const unsigned int UpdateMatrix = 1 << 1; public: PrivateGLWindow (CompWindow *w, GLWindow *gw); ~PrivateGLWindow (); void windowNotify (CompWindowNotify n); void resizeNotify (int dx, int dy, int dwidth, int dheight); void moveNotify (int dx, int dy, bool now); void updateFrameRegion (CompRegion ®ion); void setWindowMatrix (); void updateWindowRegions (); void clearTextures (); CompWindow *window; GLWindow *gWindow; CompositeWindow *cWindow; GLScreen *gScreen; GLTexture::List textures; GLTexture::MatrixList matrices; CompRegion::Vector regions; unsigned int updateState; bool needsRebind; CompRegion clip; bool bindFailed; bool overlayWindow; GLushort opacity; GLushort brightness; GLushort saturation; GLWindowPaintAttrib paint; GLWindowPaintAttrib lastPaint; unsigned int lastMask; GLVertexBuffer *vertexBuffer; // map of shaders, plugin name is key, pair of vertex and fragment // shader source code is value std::list shaders; GLVertexBuffer::AutoProgram *autoProgram; std::list icons; compiz::window::configure_buffers::Releasable::Ptr configureLock; }; #endif compiz-0.9.11+14.04.20140409/plugins/opengl/src/shadercache.cpp0000644000015301777760000001567712321343002024204 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Alexandros Frantzis */ #include #include #include /** * Compares two GLShaderParameters objects. */ class GLShaderParametersComparer { public: bool operator()(const GLShaderParameters &left, const GLShaderParameters &right) const { return left.hash() < right.hash(); } }; typedef std::map ShaderMapType; /** * Private data for GLPrivate */ class PrivateShaderCache { public: PrivateShaderCache() {} ShaderMapType::const_iterator addShaderData(const GLShaderParameters ¶ms); std::string createVertexShader (const GLShaderParameters ¶ms); std::string createFragmentShader (const GLShaderParameters ¶ms); ShaderMapType shaderMap; }; /********************** * GLShaderParameters * **********************/ int GLShaderParameters::hash() const { return static_cast(opacity) | (static_cast(brightness) << 1) | (static_cast(saturation) << 2) | (static_cast(color) << 3) | (static_cast(normal) << 5) | (static_cast(numTextures) << 8); } std::string GLShaderParameters::id() const { std::stringstream ss; ss << (opacity ? "t" : "f"); ss << (brightness ? "t" : "f"); ss << (saturation ? "t" : "f"); ss << (color == GLShaderVariableNone ? "n" : color == GLShaderVariableUniform ? "u" : "v"); ss << (normal == GLShaderVariableNone ? "n" : normal == GLShaderVariableUniform ? "u" : "v"); ss << numTextures; return ss.str(); } /***************** * GLShaderCache * *****************/ GLShaderCache::GLShaderCache () : priv (new PrivateShaderCache ()) { } GLShaderCache::~GLShaderCache () { delete priv; } const GLShaderData & GLShaderCache::getShaderData (const GLShaderParameters ¶ms) { ShaderMapType::const_iterator iter; // Try to find a cached shader pair that matches the parameters. // If we don't have it cached, create it. if ((iter = priv->shaderMap.find (params)) == priv->shaderMap.end ()) iter = priv->addShaderData (params); return iter->second; } /********************** * PrivateShaderCache * **********************/ ShaderMapType::const_iterator PrivateShaderCache::addShaderData (const GLShaderParameters ¶ms) { GLShaderData shaderData; shaderData.name = params.id (); shaderData.fragmentShader = createFragmentShader (params); shaderData.vertexShader = createVertexShader (params); std::pair ret = shaderMap.insert(std::pair(params,shaderData)); return ret.first; } /** * Creates a minimal vertex shader that can handle the GLShaderParameters. * * @param params the GLShaderParameters the created shader should handle. * * @return the shader string */ std::string PrivateShaderCache::createVertexShader (const GLShaderParameters ¶ms) { std::stringstream ss; ss << "#ifdef GL_ES\n" << "precision mediump float;\n" << "#endif\n"; ss << "uniform mat4 modelview;\n" << "uniform mat4 projection;\n"; ss << "attribute vec3 position;\n" << "attribute vec3 normal;\n" << "attribute vec4 color;\n" << "attribute vec2 texCoord0;\n" << "attribute vec2 texCoord1;\n" << "attribute vec2 texCoord2;\n" << "attribute vec2 texCoord3;\n"; ss << "@VERTEX_FUNCTIONS@\n"; if (params.color == GLShaderVariableVarying) ss << "varying vec4 vColor;\n"; for (int i = 0; i < params.numTextures; i++) ss << "varying vec2 vTexCoord" << i << ";\n"; ss << "void main() {\n"; for (int i = 0; i < params.numTextures; i++) ss << "vTexCoord" << i << " = texCoord" << i <<";\n"; if (params.color == GLShaderVariableVarying) ss << "vColor = color;\n"; ss << "gl_Position = projection * modelview * vec4(position, 1.0);\n"; ss << "@VERTEX_FUNCTION_CALLS@\n}"; return ss.str(); } /** * Creates a minimal fragment shader that can handle the GLShaderParameters. * * @param params the GLShaderParameters the created shader should handle. * * @return the shader string */ std::string PrivateShaderCache::createFragmentShader (const GLShaderParameters ¶ms) { std::stringstream ss; ss << "#ifdef GL_ES\n" << "precision mediump float;\n" << "#endif\n"; ss << "uniform vec3 paintAttrib;\n"; for (int i = 0; i < params.numTextures; i++) { ss << "uniform sampler2D texture" << i << ";\n"; ss << "varying vec2 vTexCoord" << i << ";\n"; } if (params.color == GLShaderVariableUniform) ss << "uniform vec4 singleColor;\n"; else if (params.color == GLShaderVariableVarying) ss << "varying vec4 vColor;\n"; ss << "@FRAGMENT_FUNCTIONS@\n"; ss << "void main() {\n vec4 color = "; if (params.color == GLShaderVariableUniform) ss << "singleColor *"; else if (params.color == GLShaderVariableVarying) ss << "vColor *"; for (int i = 0; i < params.numTextures; i++) ss << " texture2D(texture" << i << ", vTexCoord" << i << ") *"; ss << " 1.0;\n"; if (params.saturation) { ss << "vec3 desaturated = color.rgb * vec3 (0.30, 0.59, 0.11);\n" << "desaturated = vec3 (dot (desaturated, color.rgb));\n" << "color.rgb = color.rgb * vec3 (paintAttrib.z) + desaturated *\n" << " vec3 (1.0 - paintAttrib.z);\n"; } if (params.brightness) { ss << "color.rgb = color.rgb * paintAttrib.y;\n"; } ss << "gl_FragColor = color;\n"; ss << "@FRAGMENT_FUNCTION_CALLS@\n"; if (params.opacity) { ss << "gl_FragColor = gl_FragColor * paintAttrib.x;\n"; } ss << "}\n"; return ss.str(); } compiz-0.9.11+14.04.20140409/plugins/opengl/src/doublebuffer/0000755000015301777760000000000012321344021023674 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/src/doublebuffer/tests/0000755000015301777760000000000012321344021025036 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/src/doublebuffer/tests/test-opengl-double-buffer.cpp0000644000015301777760000003520212321343002032522 0ustar pbusernogroup00000000000000#include #include #include #include #include using namespace compiz::opengl; using testing::_; using testing::StrictMock; using testing::Return; using testing::DoAll; using testing::SetArgReferee; using testing::SetArgPointee; using testing::InSequence; char programName[] = "compiz_test_opengl_double_buffer"; bool debugOutput = false; class MockDoubleBuffer : public DoubleBuffer { public: MockDoubleBuffer (const impl::GLXSwapIntervalEXTFunc &swapIntervalFunc, const impl::GLXWaitVideoSyncSGIFunc &waitVideoSyncFunc) : DoubleBuffer (swapIntervalFunc, waitVideoSyncFunc) { } MOCK_CONST_METHOD0 (swap, void ()); MOCK_CONST_METHOD0 (blitAvailable, bool ()); MOCK_CONST_METHOD1 (blit, void (const CompRegion &)); MOCK_CONST_METHOD0 (fallbackBlitAvailable, bool ()); MOCK_CONST_METHOD1 (fallbackBlit, void (const CompRegion &)); MOCK_CONST_METHOD0 (copyFrontToBack, void ()); }; class MockVSyncDoubleBuffer : public MockDoubleBuffer { public: static void stubSwapInterval (int) {} static int stubWaitVideoSync (int, int, unsigned int *) { return 1; } MockVSyncDoubleBuffer () : MockDoubleBuffer (boost::bind (stubSwapInterval, _1), boost::bind (stubWaitVideoSync, _1, _2, _3)) { } MOCK_METHOD2 (enableAsyncVideoSync, bool (FrontbufferRedrawType, FrameThrottleState &)); MOCK_METHOD2 (enableBlockingVideoSync, bool (FrontbufferRedrawType, FrameThrottleState &)); MOCK_METHOD0 (disableAsyncVideoSync, void ()); MOCK_METHOD0 (disableBlockingVideoSync, void ()); }; class DoubleBufferTest : public ::testing::Test { public: MockVSyncDoubleBuffer db; CompRegion blitRegion; }; class CompizOpenGLDoubleBufferDeathTest : public DoubleBufferTest { }; TEST_F(DoubleBufferTest, TestPaintedFullAlwaysSwaps) { EXPECT_CALL (db, swap ()); EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Swap, _)) .WillOnce (Return (true)); EXPECT_CALL (db, copyFrontToBack ()).Times (0); db.render (blitRegion, true); } TEST_F(DoubleBufferTest, TestNoPaintedFullscreenOrFBOAlwaysBlitsSubBuffer) { EXPECT_CALL (db, blitAvailable ()).WillOnce (Return (true)); EXPECT_CALL (db, blit (_)); EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (true)); EXPECT_CALL (db, copyFrontToBack ()).Times (0); db.render (blitRegion, false); } TEST_F(DoubleBufferTest, SwapWithoutFBO) { db.set (DoubleBuffer::HAVE_PERSISTENT_BACK_BUFFER, false); db.set (DoubleBuffer::NEED_PERSISTENT_BACK_BUFFER, true); EXPECT_CALL (db, swap ()); EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Swap, _)) .WillOnce (Return (true)); EXPECT_CALL (db, copyFrontToBack ()).Times (1); db.render (blitRegion, true); } TEST_F(DoubleBufferTest, BlitWithoutFBO) { db.set (DoubleBuffer::HAVE_PERSISTENT_BACK_BUFFER, false); db.set (DoubleBuffer::NEED_PERSISTENT_BACK_BUFFER, false); EXPECT_CALL (db, blitAvailable ()).WillRepeatedly (Return (true)); EXPECT_CALL (db, blit (_)); EXPECT_CALL (db, swap ()).Times (0); EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (true)); EXPECT_CALL (db, copyFrontToBack ()).Times (0); db.render (blitRegion, false); } TEST_F(DoubleBufferTest, TestNoPaintedFullscreenOrFBODoesNotBlitIfNotSupported) { } TEST_F(DoubleBufferTest, TestBlitExactlyWithRegionSpecified) { CompRegion r1 (0, 0, 100, 100); CompRegion r2 (100, 100, 100, 100); CompRegion r3 (200, 200, 100, 100); EXPECT_CALL (db, blitAvailable ()).WillRepeatedly (Return (true)); EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillRepeatedly (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillRepeatedly (Return (true)); EXPECT_CALL (db, blit (r1)); db.render (r1, false); EXPECT_CALL (db, blit (r2)); db.render (r2, false); EXPECT_CALL (db, blit (r3)); db.render (r3, false); } TEST_F(CompizOpenGLDoubleBufferDeathTest, TestNoPaintedFullscreenOrFBODoesNotBlitOrCopyIfNotSupportedAndDies) { StrictMock dbStrict; ON_CALL (dbStrict, blitAvailable ()).WillByDefault (Return (false)); ON_CALL (dbStrict, fallbackBlitAvailable ()).WillByDefault (Return (false)); ASSERT_DEATH ({ dbStrict.render (blitRegion, false); }, ".*"); } TEST_F(DoubleBufferTest, TestSubBufferCopyIfNoFBOAndNoSubBufferBlit) { StrictMock dbStrict; EXPECT_CALL (dbStrict, blitAvailable ()).WillOnce (Return (false)); EXPECT_CALL (dbStrict, fallbackBlitAvailable ()).WillOnce (Return (true)); EXPECT_CALL (dbStrict, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (dbStrict, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (true)); EXPECT_CALL (dbStrict, fallbackBlit (blitRegion)); dbStrict.render (blitRegion, false); } TEST_F(DoubleBufferTest, TestCallWorkingStrategy) { EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Swap, _)) .WillOnce (Return (true)); db.vsync (DoubleBuffer::Swap); } TEST_F(DoubleBufferTest, TestCallNextWorkingStrategy) { /* This one fails */ EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); /* Try the next one */ EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (true)); db.vsync (DoubleBuffer::Blit); } TEST_F(DoubleBufferTest, TestCallPrevCallNextPrevDeactivated) { /* This one fails */ EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); /* Try the next one */ EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (true)); db.vsync (DoubleBuffer::Blit); EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (true)); /* Previous one must be deactivated */ EXPECT_CALL (db, disableBlockingVideoSync ()); db.vsync (DoubleBuffer::Blit); } TEST_F(DoubleBufferTest, TestReportNoHardwareVSyncIfMoreThan5UnthrottledFrames) { /* This one succeeds but fails to throttle */ for (unsigned int i = 0; i < 5; ++i) { EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (DoAll (SetArgReferee <1> (DoubleBuffer::ExternalFrameThrottlingRequired), Return (true))); db.vsync (DoubleBuffer::Blit); } EXPECT_FALSE (db.hardwareVSyncFunctional ()); } TEST_F(DoubleBufferTest, TestRestoreReportHardwareVSync) { /* This one succeeds but fails to throttle */ for (unsigned int i = 0; i < 5; ++i) { EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (DoAll (SetArgReferee <1> (DoubleBuffer::ExternalFrameThrottlingRequired), Return (true))); EXPECT_TRUE (db.hardwareVSyncFunctional ()); db.vsync (DoubleBuffer::Blit); } EXPECT_FALSE (db.hardwareVSyncFunctional ()); /* It works again */ EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (DoAll (SetArgReferee <1> (DoubleBuffer::FrameThrottledInternally), Return (true))); db.vsync (DoubleBuffer::Blit); /* And should report to work for another 5 bad frames */ for (unsigned int i = 0; i < 5; ++i) { EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (DoAll (SetArgReferee <1> (DoubleBuffer::ExternalFrameThrottlingRequired), Return (true))); EXPECT_TRUE (db.hardwareVSyncFunctional ()); db.vsync (DoubleBuffer::Blit); } EXPECT_FALSE (db.hardwareVSyncFunctional ()); } namespace { class MockOpenGLFunctionsTable { public: MOCK_METHOD3 (waitVideoSyncSGI, int (int, int, unsigned int *)); MOCK_METHOD1 (swapIntervalEXT, void (int)); }; namespace cgl = compiz::opengl; namespace cgli = compiz::opengl::impl; cgli::GLXWaitVideoSyncSGIFunc GetWaitVideoSyncFuncFromMock (MockOpenGLFunctionsTable &mock) { return boost::bind (&MockOpenGLFunctionsTable::waitVideoSyncSGI, &mock, _1, _2, _3); } cgli::GLXSwapIntervalEXTFunc GetSwapIntervalFuncFromMock (MockOpenGLFunctionsTable &mock) { return boost::bind (&MockOpenGLFunctionsTable::swapIntervalEXT, &mock, _1); } } class OpenGLVideoSyncTest : public ::testing::Test { public: OpenGLVideoSyncTest () : doubleBuffer (GetSwapIntervalFuncFromMock (functions), GetWaitVideoSyncFuncFromMock (functions)) { } MockDoubleBuffer doubleBuffer; MockOpenGLFunctionsTable functions; }; TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalOnVSyncForFlip) { EXPECT_CALL (functions, swapIntervalEXT (1)); doubleBuffer.vsync (cgl::DoubleBuffer::Swap); } TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalOnEnableForFlipOnlyOnce) { EXPECT_CALL (functions, swapIntervalEXT (1)).Times (1); doubleBuffer.vsync (cgl::DoubleBuffer::Swap); doubleBuffer.vsync (cgl::DoubleBuffer::Swap); } TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalOnEnableForFlipAndZeroForDisable) { EXPECT_CALL (functions, swapIntervalEXT (1)); doubleBuffer.vsync (cgl::DoubleBuffer::Swap); EXPECT_CALL (functions, swapIntervalEXT (0)); EXPECT_CALL (functions, waitVideoSyncSGI (1, 0, _)); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); } TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalZeroForDisableOnce) { /* Enable it */ EXPECT_CALL (functions, swapIntervalEXT (1)).Times (1); doubleBuffer.vsync (cgl::DoubleBuffer::Swap); /* Disable it twice */ EXPECT_CALL (functions, swapIntervalEXT (0)).Times (1); EXPECT_CALL (functions, waitVideoSyncSGI (1, 0, _)).Times (2); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); } TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalFailsToEnableForCopy) { EXPECT_CALL (functions, swapIntervalEXT (1)).Times (0); EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); } TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalUnthrottledWhereSuccess) { EXPECT_CALL (functions, swapIntervalEXT (1)); /* At the moment there's no way to test except for the general throttled method */ doubleBuffer.vsync (cgl::DoubleBuffer::Swap); EXPECT_FALSE (doubleBuffer.hardwareVSyncFunctional ()); } TEST_F (OpenGLVideoSyncTest, TestCallsGetVideoSyncAndWaitVideoSyncForCopy) { EXPECT_CALL (functions, waitVideoSyncSGI (_, _, _)); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); } TEST_F (OpenGLVideoSyncTest, TestCallsWaitVideoSyncAndThrottled) { /* Frames 1-5 */ ON_CALL (functions, waitVideoSyncSGI (1, _, _)).WillByDefault (DoAll (SetArgPointee<2> (0), Return (0))); EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).Times (5); /* Returned next frame, this frame was throttled */ doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); EXPECT_FALSE (doubleBuffer.hardwareVSyncFunctional ()); } TEST_F (OpenGLVideoSyncTest, TestCallsWaitVideoSyncAndThrottledEveryFrame) { InSequence s; /* Frame 0 to frame 1 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (1), Return (0))); /* Frame 1 to frame 2 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (2), Return (0))); /* Frame 2 to frame 3 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (3), Return (0))); /* Frame 3 to frame 4 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (4), Return (0))); /* Frame 5 to frame 5 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (5), Return (0))); /* Returned next frame, this frame was throttled */ doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); EXPECT_TRUE (doubleBuffer.hardwareVSyncFunctional ()); } TEST_F (OpenGLVideoSyncTest, TestCallsWaitVideoSyncAndUnthrottledDueToBrokenWaitVSync) { /* Frames 0 to 5 */ ON_CALL (functions, waitVideoSyncSGI (1, _, _)).WillByDefault (DoAll (SetArgPointee<2> (0), Return (0))); EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).Times (5); /* Returned next frame, this frame was not throttled */ doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); EXPECT_FALSE (doubleBuffer.hardwareVSyncFunctional ()); InSequence s; /* Frame 0 to frame 1 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (1), Return (0))); /* Frame 1 to frame 2 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (2), Return (0))); /* Frame 2 to frame 3 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (3), Return (0))); /* Frame 3 to frame 4 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (4), Return (0))); /* Frame 5 to frame 5 (eg, working waitVideoSyncSGI) */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (5), Return (0))); /* Returned next frame, this frame was throttled */ doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); EXPECT_TRUE (doubleBuffer.hardwareVSyncFunctional ()); } compiz-0.9.11+14.04.20140409/plugins/opengl/src/doublebuffer/tests/CMakeLists.txt0000644000015301777760000000066012321343002027576 0ustar pbusernogroup00000000000000add_executable (compiz_test_opengl_double_buffer ${CMAKE_CURRENT_SOURCE_DIR}/test-opengl-double-buffer.cpp) target_link_libraries (compiz_test_opengl_double_buffer compiz_opengl_double_buffer ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_opengl_double_buffer COVERAGE compiz_opengl_double_buffer) compiz-0.9.11+14.04.20140409/plugins/opengl/src/doublebuffer/CMakeLists.txt0000644000015301777760000000113212321343002026427 0ustar pbusernogroup00000000000000INCLUDE_DIRECTORIES ( ${compiz_SOURCE_DIR}/src/logmessage/include ${CMAKE_CURRENT_SOURCE_DIR}/../../include ${CMAKE_CURRENT_SOURCE_DIR}/../../src ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ) LINK_DIRECTORIES (${COMPIZ_LIBRARY_DIRS}) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/double-buffer.cpp ) ADD_LIBRARY( compiz_opengl_double_buffer STATIC ${SRCS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) TARGET_LINK_LIBRARIES( compiz_opengl_double_buffer compiz_region compiz_logmessage ) compiz-0.9.11+14.04.20140409/plugins/opengl/src/doublebuffer/src/0000755000015301777760000000000012321344021024463 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/src/doublebuffer/src/double-buffer.cpp0000644000015301777760000001173012321343002027710 0ustar pbusernogroup00000000000000/* * Compiz, opengl plugin, DoubleBuffer class * * Copyright (c) 2012 Canonical Ltd. * Authors: Sam Spilsbury * Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include "opengl/doublebuffer.h" using namespace compiz::opengl; namespace { const unsigned int UNTHROTTLED_FRAMES_MAX = 5; } namespace compiz { namespace opengl { DoubleBuffer::DoubleBuffer (const impl::GLXSwapIntervalEXTFunc &swapIntervalFunc, const impl::GLXWaitVideoSyncSGIFunc &waitVideoSyncFunc) : syncType (NoSync), bufferFrameThrottleState (FrameThrottledInternally), blockingVSyncUnthrottledFrames (0), swapIntervalFunc (swapIntervalFunc), waitVideoSyncFunc (waitVideoSyncFunc), lastVSyncCounter (0) { setting[VSYNC] = true; setting[HAVE_PERSISTENT_BACK_BUFFER] = false; setting[NEED_PERSISTENT_BACK_BUFFER] = false; } DoubleBuffer::~DoubleBuffer () { } void DoubleBuffer::set (Setting name, bool value) { setting[name] = value; } void DoubleBuffer::render (const CompRegion ®ion, bool fullscreen) { if (fullscreen) { if (setting[VSYNC]) vsync (Swap); swap (); if (setting[NEED_PERSISTENT_BACK_BUFFER] && !setting[HAVE_PERSISTENT_BACK_BUFFER]) { copyFrontToBack (); } } else { if (setting[VSYNC]) vsync (Blit); if (blitAvailable ()) blit (region); else if (fallbackBlitAvailable ()) fallbackBlit (region); else { // This will never happen unless you make a porting mistake... assert (false); abort (); } } } void DoubleBuffer::vsync (FrontbufferRedrawType redrawType) { FrameThrottleState throttleState; SyncType lastSyncType = syncType; if (enableAsyncVideoSync (redrawType, throttleState)) { syncType = Async; if (lastSyncType == Blocking) disableBlockingVideoSync (); /* Apply throttle */ bufferFrameThrottleState = throttleState; blockingVSyncUnthrottledFrames = 0; } else if (enableBlockingVideoSync (redrawType, throttleState)) { syncType = Blocking; if (lastSyncType == Async) disableAsyncVideoSync (); /* Accumulate throttle */ if (throttleState == ExternalFrameThrottlingRequired) blockingVSyncUnthrottledFrames++; else blockingVSyncUnthrottledFrames = 0; if (blockingVSyncUnthrottledFrames >= UNTHROTTLED_FRAMES_MAX) bufferFrameThrottleState = ExternalFrameThrottlingRequired; else bufferFrameThrottleState = FrameThrottledInternally; } else { syncType = NoSync; /* Throttle all rendering */ bufferFrameThrottleState = ExternalFrameThrottlingRequired; blockingVSyncUnthrottledFrames = 0; } } bool DoubleBuffer::hardwareVSyncFunctional () { return bufferFrameThrottleState == FrameThrottledInternally; } bool DoubleBuffer::enableAsyncVideoSync (FrontbufferRedrawType swapType, FrameThrottleState &throttleState) { /* Always consider these frames as un-throttled as the buffer * swaps are done asynchronously */ throttleState = ExternalFrameThrottlingRequired; /* Can't use swapInterval unless using SwapBuffers */ if (swapType != Swap) return false; /* Enable if not enabled */ if (syncType != Async) swapIntervalFunc (1); return true; } void DoubleBuffer::disableAsyncVideoSync () { /* Disable if enabled */ swapIntervalFunc (0); } bool DoubleBuffer::enableBlockingVideoSync (FrontbufferRedrawType swapType, FrameThrottleState &throttleState) { unsigned int oldVideoSyncCounter = lastVSyncCounter; waitVideoSyncFunc (1, 0, &lastVSyncCounter); /* Check if this frame was actually throttled */ if (lastVSyncCounter == oldVideoSyncCounter) throttleState = ExternalFrameThrottlingRequired; else throttleState = FrameThrottledInternally; return true; } void DoubleBuffer::disableBlockingVideoSync () { blockingVSyncUnthrottledFrames = 0; } } // namespace opengl } // namespace compiz compiz-0.9.11+14.04.20140409/plugins/opengl/src/privatetexture.h0000644000015301777760000000674712321343002024510 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman * Travis Watkins */ #ifndef _PRIVATETEXTURE_H #define _PRIVATETEXTURE_H #ifdef USE_GLES #define SUPPORT_X11 #include #include #include #else #include #include #endif #include #include #include class GLScreen; class GLDisplay; class PrivateTexture { public: PrivateTexture (GLTexture *); ~PrivateTexture (); static GLTexture::List loadImageData (const char *image, unsigned int width, unsigned int height, GLenum format, GLenum type); public: GLTexture *texture; GLuint name; GLenum target; GLenum filter; GLenum wrap; GLTexture::Matrix matrix; bool mipmap; bool mipmapSupport; bool initial; int refCount; }; #ifdef USE_GLES class EglTexture : public GLTexture { public: EglTexture (); ~EglTexture (); void enable (Filter filter); static List bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source); public: bool damaged; Damage damage; bool updateMipMap; }; extern std::map boundPixmapTex; #else class TfpTexture : public GLTexture { public: TfpTexture (); ~TfpTexture (); void enable (Filter filter); bool bindTexImage (const GLXPixmap &); void releaseTexImage (); static List bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source); public: Pixmap x11Pixmap; GLXPixmap pixmap; bool damaged; Damage damage; bool updateMipMap; compiz::opengl::PixmapSource source; }; extern std::map boundPixmapTex; #endif #endif compiz-0.9.11+14.04.20140409/plugins/opengl/include/0000755000015301777760000000000012321344021022064 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/include/opengl/0000755000015301777760000000000012321344021023350 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opengl/include/opengl/pixmapsource.h0000644000015301777760000000262212321343002026240 0ustar pbusernogroup00000000000000/* * * Copyright (c) 2012 Canonical Ltd. * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef _COMPIZ_OPENGL_PIXMAP_SOURCE_H #define _COMPIZ_OPENGL_PIXMAP_SOURCE_H namespace compiz { namespace opengl { typedef enum _PixmapSource { InternallyManaged = 0, ExternallyManaged = 1 } PixmapSource; } } #endif compiz-0.9.11+14.04.20140409/plugins/opengl/include/opengl/opengl.h0000644000015301777760000011040612321343002025005 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPIZ_OPENGL_H #define _COMPIZ_OPENGL_H #ifdef USE_GLES #define SUPPORT_X11 #include #include #include #include #else #include #include /* Some implementations have not yet given a definition * to GLX_BACK_BUFFER_AGE_EXT but this is the token as defined * in the spec (https://www.opengl.org/registry/specs/EXT/glx_buffer_age.txt) */ #define GLX_BACK_BUFFER_AGE_EXT 0x20F4 #endif #include #include #include #include #include #include #include #include #include #define COMPIZ_OPENGL_ABI 7 /* * Some plugins check for #ifdef USE_MODERN_COMPIZ_GL. Support it for now, but * but the offending code should be changed to: #if COMPIZ_OPENGL_ABI >= 5 * Or the preprocessor checks should be removed altogether. */ #define USE_MODERN_COMPIZ_GL 1 #if !defined(GL_BGRA) #if !defined(GL_BGRA_EXT) #error GL_BGRA support is required #else #define GL_BGRA GL_BGRA_EXT #endif #endif #if !defined(GL_BGRA) #if !defined(GL_BGRA_EXT) #error GL_BGRA support is required #else #define GL_BGRA GL_BGRA_EXT #endif #endif /** * camera distance from screen, 0.5 * tan (FOV) */ extern const float DEFAULT_Z_CAMERA; extern const float RED_SATURATION_WEIGHT; extern const float GREEN_SATURATION_WEIGHT; extern const float BLUE_SATURATION_WEIGHT; class PrivateGLScreen; class PrivateGLWindow; extern GLushort defaultColor[4]; #ifndef GLX_EXT_texture_from_pixmap #define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 #define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 #define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 #define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 #define GLX_Y_INVERTED_EXT 0x20D4 #define GLX_TEXTURE_FORMAT_EXT 0x20D5 #define GLX_TEXTURE_TARGET_EXT 0x20D6 #define GLX_MIPMAP_TEXTURE_EXT 0x20D7 #define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 #define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 #define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA #define GLX_TEXTURE_1D_BIT_EXT 0x00000001 #define GLX_TEXTURE_2D_BIT_EXT 0x00000002 #define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 #define GLX_TEXTURE_1D_EXT 0x20DB #define GLX_TEXTURE_2D_EXT 0x20DC #define GLX_TEXTURE_RECTANGLE_EXT 0x20DD #define GLX_FRONT_LEFT_EXT 0x20DE #endif namespace GL { #ifdef USE_GLES typedef EGLImageKHR (*EGLCreateImageKHRProc) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); typedef EGLBoolean (*EGLDestroyImageKHRProc) (EGLDisplay dpy, EGLImageKHR image); typedef void (*GLEGLImageTargetTexture2DOESProc) (GLenum target, GLeglImageOES image); typedef EGLBoolean (*EGLPostSubBufferNVProc) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); #else typedef void (*FuncPtr) (void); typedef FuncPtr (*GLXGetProcAddressProc) (const GLubyte *procName); typedef void (*GLXBindTexImageProc) (Display *display, GLXDrawable drawable, int buffer, int *attribList); typedef void (*GLXReleaseTexImageProc) (Display *display, GLXDrawable drawable, int buffer); typedef void (*GLXQueryDrawableProc) (Display *display, GLXDrawable drawable, int attribute, unsigned int *value); typedef void (*GLXCopySubBufferProc) (Display *display, GLXDrawable drawable, int x, int y, int width, int height); typedef int (*GLXGetVideoSyncProc) (unsigned int *count); typedef int (*GLXWaitVideoSyncProc) (int divisor, int remainder, unsigned int *count); typedef int (*GLXSwapIntervalProc) (int interval); #ifndef GLX_VERSION_1_3 typedef struct __GLXFBConfigRec *GLXFBConfig; #endif typedef GLXFBConfig *(*GLXGetFBConfigsProc) (Display *display, int screen, int *nElements); typedef int (*GLXGetFBConfigAttribProc) (Display *display, GLXFBConfig config, int attribute, int *value); typedef GLXPixmap (*GLXCreatePixmapProc) (Display *display, GLXFBConfig config, Pixmap pixmap, const int *attribList); typedef void (*GLXDestroyPixmapProc) (Display *display, GLXPixmap pixmap); typedef void (*GLGenProgramsProc) (GLsizei n, GLuint *programs); typedef void (*GLDeleteProgramsProc) (GLsizei n, GLuint *programs); typedef void (*GLBindProgramProc) (GLenum target, GLuint program); typedef void (*GLProgramStringProc) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); typedef void (*GLProgramParameter4fProc) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (*GLGetProgramivProc) (GLenum target, GLenum pname, int *params); #endif typedef void (*GLActiveTextureProc) (GLenum texture); typedef void (*GLClientActiveTextureProc) (GLenum texture); typedef void (*GLMultiTexCoord2fProc) (GLenum, GLfloat, GLfloat); typedef void (*GLGenFramebuffersProc) (GLsizei n, GLuint *framebuffers); typedef void (*GLDeleteFramebuffersProc) (GLsizei n, const GLuint *framebuffers); typedef void (*GLBindFramebufferProc) (GLenum target, GLuint framebuffer); typedef GLenum (*GLCheckFramebufferStatusProc) (GLenum target); typedef void (*GLFramebufferTexture2DProc) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (*GLGenerateMipmapProc) (GLenum target); typedef void (*GLBindBufferProc) (GLenum target, GLuint buffer); typedef void (*GLDeleteBuffersProc) (GLsizei n, const GLuint *buffers); typedef void (*GLGenBuffersProc) (GLsizei n, GLuint *buffers); typedef void (*GLBufferDataProc) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); typedef void (*GLBufferSubDataProc) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); typedef void (*GLGetShaderivProc) (GLuint shader, GLenum pname, GLint *params); typedef void (*GLGetShaderInfoLogProc) (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infoLog); typedef void (*GLGetProgramivProc) (GLuint program, GLenum pname, GLint* params); typedef void (*GLGetProgramInfoLogProc) (GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infoLog); typedef GLuint (*GLCreateShaderProc) (GLenum type); typedef void (*GLShaderSourceProc) (GLuint shader, GLsizei count, const GLchar **string, const GLint* length); typedef void (*GLCompileShaderProc) (GLuint shader); typedef GLuint (*GLCreateProgramProc) (); typedef void (*GLAttachShaderProc) (GLuint program, GLuint shader); typedef void (*GLLinkProgramProc) (GLuint program); typedef void (*GLValidateProgramProc) (GLuint program); typedef void (*GLDeleteShaderProc) (GLuint shader); typedef void (*GLDeleteProgramProc) (GLuint program); typedef void (*GLUseProgramProc) (GLuint program); typedef int (*GLGetUniformLocationProc) (GLuint program, const GLchar* name); typedef void (*GLUniform1fProc) (GLint location, GLfloat x); typedef void (*GLUniform1iProc) (GLint location, GLint x); typedef void (*GLUniform2fProc) (GLint location, GLfloat x, GLfloat y); typedef void (*GLUniform3fProc) (GLint location, GLfloat x, GLfloat y, GLfloat z); typedef void (*GLUniform4fProc) (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (*GLUniform2iProc) (GLint location, GLint x, GLint y); typedef void (*GLUniform3iProc) (GLint location, GLint x, GLint y, GLint z); typedef void (*GLUniform4iProc) (GLint location, GLint x, GLint y, GLint z, GLint w); typedef void (*GLUniformMatrix4fvProc) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef int (*GLGetAttribLocationProc) (GLuint program, const GLchar *name); typedef void (*GLEnableVertexAttribArrayProc) (GLuint index); typedef void (*GLDisableVertexAttribArrayProc) (GLuint index); typedef void (*GLVertexAttribPointerProc) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *ptr); typedef void (*GLGenRenderbuffersProc) (GLsizei n, GLuint *rb); typedef void (*GLDeleteRenderbuffersProc) (GLsizei n, const GLuint *rb); typedef void (*GLBindRenderbufferProc) (GLenum target, GLuint renderbuffer); typedef void (*GLFramebufferRenderbufferProc) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (*GLRenderbufferStorageProc) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); /* GL_ARB_shader_objects */ #ifndef USE_GLES typedef GLhandleARB (*GLCreateShaderObjectARBProc) (GLenum type); typedef GLhandleARB (*GLCreateProgramObjectARBProc) (); typedef void (*GLShaderSourceARBProc) (GLhandleARB shader, GLsizei count, const GLchar **string, const GLint* length); typedef void (*GLCompileShaderARBProc) (GLhandleARB shader); typedef void (*GLValidateProgramARBProc) (GLhandleARB program); typedef void (*GLDeleteObjectARBProc) (GLhandleARB object); typedef void (*GLAttachObjectARBProc) (GLhandleARB program, GLhandleARB shader); typedef void (*GLLinkProgramARBProc) (GLhandleARB program); typedef void (*GLUseProgramObjectARBProc) (GLhandleARB program); typedef int (*GLGetUniformLocationARBProc) (GLhandleARB program, const GLchar* name); typedef int (*GLGetAttribLocationARBProc) (GLhandleARB program, const GLchar *name); typedef void (*GLGetObjectParameterivProc) (GLhandleARB object, GLenum type, int *param); typedef void (*GLGetInfoLogProc) (GLhandleARB object, int maxLen, int *len, char *log); #endif #ifdef USE_GLES extern EGLCreateImageKHRProc createImage; extern EGLDestroyImageKHRProc destroyImage; extern GLEGLImageTargetTexture2DOESProc eglImageTargetTexture; #else extern GLXBindTexImageProc bindTexImage; extern GLXReleaseTexImageProc releaseTexImage; extern GLXQueryDrawableProc queryDrawable; extern GLXCopySubBufferProc copySubBuffer; extern GLXGetVideoSyncProc getVideoSync; extern GLXWaitVideoSyncProc waitVideoSync; extern GLXSwapIntervalProc swapInterval; extern GLXGetFBConfigsProc getFBConfigs; extern GLXGetFBConfigAttribProc getFBConfigAttrib; extern GLXCreatePixmapProc createPixmap; extern GLXDestroyPixmapProc destroyPixmap; extern GLGenProgramsProc genPrograms; extern GLDeleteProgramsProc deletePrograms; extern GLBindProgramProc bindProgram; extern GLProgramStringProc programString; extern GLProgramParameter4fProc programEnvParameter4f; extern GLProgramParameter4fProc programLocalParameter4f; extern GLGetProgramivProc getProgramiv; #endif extern GLActiveTextureProc activeTexture; extern GLClientActiveTextureProc clientActiveTexture; extern GLMultiTexCoord2fProc multiTexCoord2f; extern GLGenFramebuffersProc genFramebuffers; extern GLDeleteFramebuffersProc deleteFramebuffers; extern GLBindFramebufferProc bindFramebuffer; extern GLCheckFramebufferStatusProc checkFramebufferStatus; extern GLFramebufferTexture2DProc framebufferTexture2D; extern GLGenerateMipmapProc generateMipmap; extern GLBindBufferProc bindBuffer; extern GLDeleteBuffersProc deleteBuffers; extern GLGenBuffersProc genBuffers; extern GLBufferDataProc bufferData; extern GLBufferSubDataProc bufferSubData; extern GLGetShaderivProc getShaderiv; extern GLGetShaderInfoLogProc getShaderInfoLog; extern GLGetProgramivProc getProgramiv; extern GLGetProgramInfoLogProc getProgramInfoLog; extern GLCreateShaderProc createShader; extern GLShaderSourceProc shaderSource; extern GLCompileShaderProc compileShader; extern GLCreateProgramProc createProgram; extern GLAttachShaderProc attachShader; extern GLLinkProgramProc linkProgram; extern GLValidateProgramProc validateProgram; extern GLDeleteShaderProc deleteShader; extern GLDeleteProgramProc deleteProgram; extern GLUseProgramProc useProgram; extern GLGetUniformLocationProc getUniformLocation; extern GLUniform1fProc uniform1f; extern GLUniform1iProc uniform1i; extern GLUniform2fProc uniform2f; extern GLUniform2iProc uniform2i; extern GLUniform3fProc uniform3f; extern GLUniform3iProc uniform3i; extern GLUniform4fProc uniform4f; extern GLUniform4iProc uniform4i; extern GLUniformMatrix4fvProc uniformMatrix4fv; extern GLGetAttribLocationProc getAttribLocation; extern GLEnableVertexAttribArrayProc enableVertexAttribArray; extern GLDisableVertexAttribArrayProc disableVertexAttribArray; extern GLVertexAttribPointerProc vertexAttribPointer; extern GLGenRenderbuffersProc genRenderbuffers; extern GLDeleteRenderbuffersProc deleteRenderbuffers; extern GLBindRenderbufferProc bindRenderbuffer; extern GLFramebufferRenderbufferProc framebufferRenderbuffer; extern GLRenderbufferStorageProc renderbufferStorage; #ifndef USE_GLES extern GLCreateShaderObjectARBProc createShaderObjectARB; extern GLCreateProgramObjectARBProc createProgramObjectARB; extern GLShaderSourceARBProc shaderSourceARB; extern GLCompileShaderARBProc compileShaderARB; extern GLValidateProgramARBProc validateProgramARB; extern GLDeleteObjectARBProc deleteObjectARB; extern GLAttachObjectARBProc attachObjectARB; extern GLLinkProgramARBProc linkProgramARB; extern GLUseProgramObjectARBProc useProgramObjectARB; extern GLGetUniformLocationARBProc getUniformLocationARB; extern GLGetAttribLocationARBProc getAttribLocationARB; extern GLGetObjectParameterivProc getObjectParameteriv; extern GLGetInfoLogProc getInfoLog; #endif #ifdef USE_GLES static const GLenum FRAMEBUFFER_BINDING = GL_FRAMEBUFFER_BINDING; static const GLenum FRAMEBUFFER = GL_FRAMEBUFFER; static const GLenum RENDERBUFFER = GL_RENDERBUFFER; static const GLenum COLOR_ATTACHMENT0 = GL_COLOR_ATTACHMENT0; static const GLenum DEPTH_ATTACHMENT = GL_DEPTH_ATTACHMENT; static const GLenum STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT; static const GLenum DEPTH24_STENCIL8 = GL_DEPTH24_STENCIL8_OES; /* OpenGL|ES does not support different draw/read framebuffers */ static const GLenum DRAW_FRAMEBUFFER = GL_FRAMEBUFFER; static const GLenum READ_FRAMEBUFFER = GL_FRAMEBUFFER; static const GLenum DRAW_FRAMEBUFFER_BINDING = FRAMEBUFFER_BINDING; static const GLenum READ_FRAMEBUFFER_BINDING = FRAMEBUFFER_BINDING; static const GLenum FRAMEBUFFER_COMPLETE = GL_FRAMEBUFFER_COMPLETE; static const GLenum FRAMEBUFFER_UNDEFINED = 0; static const GLenum FRAMEBUFFER_INCOMPLETE_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; static const GLenum FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; static const GLenum FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = 0; static const GLenum FRAMEBUFFER_INCOMPLETE_READ_BUFFER = 0; static const GLenum FRAMEBUFFER_UNSUPPORTED = GL_FRAMEBUFFER_UNSUPPORTED; static const GLenum FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0; static const GLenum FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = 0; static const GLenum FRAMEBUFFER_INCOMPLETE_DIMENSIONS = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS; static const GLenum ARRAY_BUFFER = GL_ARRAY_BUFFER; static const GLenum STATIC_DRAW = GL_STATIC_DRAW; static const GLenum STREAM_DRAW = GL_STREAM_DRAW; static const GLenum DYNAMIC_DRAW = GL_DYNAMIC_DRAW; static const GLenum INFO_LOG_LENGTH = GL_INFO_LOG_LENGTH; static const GLenum COMPILE_STATUS = GL_COMPILE_STATUS; static const GLenum LINK_STATUS = GL_LINK_STATUS; static const GLenum FRAGMENT_SHADER = GL_FRAGMENT_SHADER; static const GLenum VERTEX_SHADER = GL_VERTEX_SHADER; #else static const GLenum FRAMEBUFFER_BINDING = GL_FRAMEBUFFER_BINDING_EXT; static const GLenum FRAMEBUFFER = GL_FRAMEBUFFER_EXT; static const GLenum RENDERBUFFER = GL_RENDERBUFFER; static const GLenum COLOR_ATTACHMENT0 = GL_COLOR_ATTACHMENT0_EXT; static const GLenum DEPTH_ATTACHMENT = GL_DEPTH_ATTACHMENT_EXT; static const GLenum STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT_EXT; static const GLenum DEPTH24_STENCIL8 = GL_DEPTH24_STENCIL8_EXT; static const GLenum DRAW_FRAMEBUFFER = GL_DRAW_FRAMEBUFFER_EXT; static const GLenum READ_FRAMEBUFFER = GL_READ_FRAMEBUFFER_EXT; static const GLenum DRAW_FRAMEBUFFER_BINDING = GL_DRAW_FRAMEBUFFER_BINDING_EXT; static const GLenum READ_FRAMEBUFFER_BINDING = GL_READ_FRAMEBUFFER_BINDING_EXT; static const GLenum FRAMEBUFFER_COMPLETE = GL_FRAMEBUFFER_COMPLETE_EXT; static const GLenum FRAMEBUFFER_UNDEFINED = GL_FRAMEBUFFER_UNDEFINED; static const GLenum FRAMEBUFFER_INCOMPLETE_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT; static const GLenum FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT; static const GLenum FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT; static const GLenum FRAMEBUFFER_INCOMPLETE_READ_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT; static const GLenum FRAMEBUFFER_UNSUPPORTED = GL_FRAMEBUFFER_UNSUPPORTED_EXT; static const GLenum FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT; static const GLenum FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT; static const GLenum FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0; static const GLenum ARRAY_BUFFER = GL_ARRAY_BUFFER_ARB; static const GLenum STATIC_DRAW = GL_STATIC_DRAW_ARB; static const GLenum STREAM_DRAW = GL_STREAM_DRAW_ARB; static const GLenum DYNAMIC_DRAW = GL_DYNAMIC_DRAW_ARB; static const GLenum INFO_LOG_LENGTH = GL_OBJECT_INFO_LOG_LENGTH_ARB; static const GLenum COMPILE_STATUS = GL_OBJECT_COMPILE_STATUS_ARB; static const GLenum LINK_STATUS = GL_OBJECT_LINK_STATUS_ARB; static const GLenum FRAGMENT_SHADER = GL_FRAGMENT_SHADER_ARB; static const GLenum VERTEX_SHADER = GL_VERTEX_SHADER_ARB; #endif extern bool textureFromPixmap; extern bool textureRectangle; extern bool textureNonPowerOfTwo; extern bool textureNonPowerOfTwoMipmap; extern bool textureEnvCombine; extern bool textureEnvCrossbar; extern bool textureBorderClamp; extern bool textureCompression; extern GLint maxTextureSize; extern bool fboSupported; extern bool fboStencilSupported; extern bool fboEnabled; extern bool vboSupported; extern bool vboEnabled; extern bool shaders; extern bool stencilBuffer; extern GLint maxTextureUnits; extern bool bufferAge; extern bool canDoSaturated; extern bool canDoSlightlySaturated; #ifndef USE_GLES void getProgramInfoLogARBWrapper (GLuint object, int maxLen, int *len, char *log); void getShaderInfoLogARBWrapper (GLuint object, int maxLen, int *len, char *log); void getShaderivARBWrapper (GLuint object, GLenum type, int *param); void getProgramivARBWrapper (GLuint object, GLenum type, int *param); GLuint createShaderARBWrapper (GLenum type); GLuint createProgramARBWrapper (GLenum type); void shaderSourceARBWrapper (GLuint shader, GLsizei count, const GLchar **string, const GLint *length); void compileShaderARBWrapper (GLuint shader); void validateProgramARBWrapper (GLuint program); void deleteShaderARBWrapper (GLuint shader); void deleteProgramARBWrapper (GLuint program); void attachShaderARBWrapper (GLuint program, GLuint shader); void linkProgramARBWrapper (GLuint program); void useProgramARBWrapper (GLuint program); int getUniformLocationARBWrapper (GLuint program, const GLchar *name); int getAttribLocationARBWrapper (GLuint program, const GLchar *name); #endif }; struct GLScreenPaintAttrib { GLfloat xRotate; GLfloat yRotate; GLfloat vRotate; GLfloat xTranslate; GLfloat yTranslate; GLfloat zTranslate; GLfloat zCamera; }; #define MAX_DEPTH 32 #ifndef USE_GLES struct GLFBConfig { GLXFBConfig fbConfig; int yInverted; int mipmap; int textureFormat; int textureTargets; }; #endif extern const unsigned short NOTHING_TRANS_FILTER; extern const unsigned short SCREEN_TRANS_FILTER; extern const unsigned short WINDOW_TRANS_FILTER; extern GLScreenPaintAttrib defaultScreenPaintAttrib; class GLScreen; class GLFramebufferObject; class GLScreenInterface; extern template class WrapableInterface; class GLScreenInterface : public WrapableInterface { public: /** * Hookable function used for plugins to use openGL to draw on an output * * @param attrib Describes some basic drawing attribs for the screen * including translation, rotation and scale * @param matrix Describes a 4x4 3D modelview matrix for which this * screen should be drawn in * @param region Describes the region of the screen being redrawn * @param output Describes the output being redrawn * @param mask Bitmask which describes how the screen is being redrawn' */ virtual bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask); /** * Hookable function used for plugins to use openGL to draw on an output * when the screen is transformed * * There is little difference between this and glPaintOutput, however * this will be called when the entire screen is being transformed * (eg cube) * * @param attrib Describes some basic drawing attribs for the screen * including translation, rotation and scale * @param matrix Describes a 4x4 3D modelview matrix for which this * screen should be drawn in * @param region Describes the region of the screen being redrawn * @param output Describes the output being redrawn * @param mask Bitmask which describes how the screen is being redrawn' */ virtual void glPaintTransformedOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask); /** * Hookable function to apply elements from a GLScreenPaintAttrib * to a GLMatrix in the context of a CompOutput * * @param attrib Describes the basic drawing attribs of a screen * including translation, rotation and scale to be applies to a matrix * @param output Describes the output in which these operations take * place * @param matrix Pointer to a matrix where transformations will * be applied */ virtual void glApplyTransform (const GLScreenPaintAttrib &attrib, CompOutput *output, GLMatrix *mask); virtual void glEnableOutputClipping (const GLMatrix &, const CompRegion &, CompOutput *); virtual void glDisableOutputClipping (); virtual GLMatrix *projectionMatrix (); /** * Hookable function used by plugins to shade the final composited * Output. * * @param tmpRegion Describes the final composited output region * @param scratchFbo Describes the final composited FBO that is * to be rendered. */ virtual void glPaintCompositedOutput (const CompRegion ®ion, GLFramebufferObject *fbo, unsigned int mask); /** * Return true if glPaintCompositedOutput is required for this frame */ virtual bool glPaintCompositedOutputRequired (); /** * Hookable function used by plugins to determine stenciling mask */ virtual void glBufferStencil (const GLMatrix &matrix, GLVertexBuffer &vertexBuffer, CompOutput *output); }; extern template class PluginClassHandler; class GLScreen : public WrapableHandler, public PluginClassHandler, public CompOption::Class { public: GLScreen (CompScreen *s); ~GLScreen (); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); /** * Returns the current compiz-wide openGL texture filter */ GLenum textureFilter (); /** * Sets a new compiz-wide openGL texture filter */ void setTextureFilter (GLenum); void clearTargetOutput (unsigned int mask); /** * Gets the libGL address of a particular openGL functor */ #ifndef USE_GLES GL::FuncPtr getProcAddress (const char *name); #endif void updateBackground (); /** * Returns the current compiz-wide texture filter */ GLTexture::Filter filter (int); /** * Sets a new compiz-wide texture filter */ void setFilter (int, GLTexture::Filter); /** * Sets a new compiz-wid openGL texture environment mode */ void setTexEnvMode (GLenum mode); /** * Turns lighting on and off */ void setLighting (bool lighting); /** * Returns true if lighting is enabled */ bool lighting (); void clearOutput (CompOutput *output, unsigned int mask); void setDefaultViewport (); GLTexture::BindPixmapHandle registerBindPixmap (GLTexture::BindPixmapProc); void unregisterBindPixmap (GLTexture::BindPixmapHandle); #ifndef USE_GLES GLFBConfig * glxPixmapFBConfig (unsigned int depth); #endif #ifdef USE_GLES EGLContext getEGLContext (); #endif /** * Returns a GLProgram from the cache or creates one and caches it */ GLProgram *getProgram (std::list); /** * Returns a GLShaderData from the cache or creates one and caches it */ const GLShaderData *getShaderData (GLShaderParameters ¶ms); /** * Returns the FBO compiz is using for the screen */ GLFramebufferObject *fbo (); /** * Returns a default icon texture */ GLTexture *defaultIcon (); void resetRasterPos (); bool glInitContext (XVisualInfo *); WRAPABLE_HND (0, GLScreenInterface, bool, glPaintOutput, const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); WRAPABLE_HND (1, GLScreenInterface, void, glPaintTransformedOutput, const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); WRAPABLE_HND (2, GLScreenInterface, void, glApplyTransform, const GLScreenPaintAttrib &, CompOutput *, GLMatrix *); WRAPABLE_HND (3, GLScreenInterface, void, glEnableOutputClipping, const GLMatrix &, const CompRegion &, CompOutput *); WRAPABLE_HND (4, GLScreenInterface, void, glDisableOutputClipping); WRAPABLE_HND (5, GLScreenInterface, GLMatrix *, projectionMatrix); WRAPABLE_HND (6, GLScreenInterface, void, glPaintCompositedOutput, const CompRegion &, GLFramebufferObject *, unsigned int); WRAPABLE_HND (7, GLScreenInterface, bool, glPaintCompositedOutputRequired); WRAPABLE_HND (8, GLScreenInterface, void, glBufferStencil, const GLMatrix &, GLVertexBuffer &, CompOutput *); friend class GLTexture; friend class GLWindow; private: PrivateGLScreen *priv; }; struct GLWindowPaintAttrib { GLushort opacity; GLushort brightness; GLushort saturation; GLfloat xScale; GLfloat yScale; GLfloat xTranslate; GLfloat yTranslate; }; class GLWindow; class GLWindowInterface; extern template class WrapableInterface; class GLWindowInterface : public WrapableInterface { public: /** * Hookable function to paint a window on-screen * * @param attrib Describes basic drawing attribs of this window; * opacity, brightness, saturation * @param matrix A 4x4 matrix which describes the transformation of * this window * @param region Describes the region of the window being drawn * @param mask Bitmask which describes how this window is drawn */ virtual bool glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, unsigned int mask); /** * Hookable function to draw a window on-screen * * Unlike glPaint, when glDraw is called, the window is * drawn immediately * * @param matrix A 4x4 matrix which describes the transformation of * this window * @param attrib A Fragment attrib which describes the texture * modification state of this window * @param region Describes which region will be drawn * @param mask Bitmask which describes how this window is drawn */ virtual bool glDraw (const GLMatrix &matrix, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask); /** * Hookable function to add points to a window * texture geometry * * This function adds rects to a window's texture geometry * and modifies their points by the values in the GLTexture::MatrixList * * It is used for texture transformation to set points * for where the texture should be skewed * * @param matrices Describes the matrices by which the texture exists * @param region * @param clipRegion * @param min * @param max */ virtual void glAddGeometry (const GLTexture::MatrixList &matrices, const CompRegion ®ion, const CompRegion &clipRegion, unsigned int min = MAXSHORT, unsigned int max = MAXSHORT); virtual void glDrawTexture (GLTexture *texture, const GLMatrix &, const GLWindowPaintAttrib &, unsigned int); }; extern template class PluginClassHandler; class GLWindow : public WrapableHandler, public PluginClassHandler { public: static GLWindowPaintAttrib defaultPaintAttrib; public: GLWindow (CompWindow *w); ~GLWindow (); const CompRegion & clip () const; /** * Returns the current paint attributes for this window */ GLWindowPaintAttrib & paintAttrib (); /** * Returns the last paint attributes for this window */ GLWindowPaintAttrib & lastPaintAttrib (); unsigned int lastMask () const; /** * Binds this window to an openGL texture */ bool bind (); /** * Releases this window from an openGL texture */ void release (); /** * Returns the tiled textures for this window */ const GLTexture::List & textures () const; /** * Returns the matrices for the tiled textures for this windwo */ const GLTexture::MatrixList & matrices () const; void updatePaintAttribs (); /** * Returns the window vertex buffer object */ GLVertexBuffer * vertexBuffer (); /** * Add a vertex and/or fragment shader function to the pipeline. * * @param name Name of the plugin adding the functions * @param vertex_shader Function to add to the vertex shader * @param fragment_shader Function to add to the fragment shader */ void addShaders (std::string name, std::string vertex_shader, std::string fragment_shader); GLTexture *getIcon (int width, int height); WRAPABLE_HND (0, GLWindowInterface, bool, glPaint, const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); WRAPABLE_HND (1, GLWindowInterface, bool, glDraw, const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int); WRAPABLE_HND (2, GLWindowInterface, void, glAddGeometry, const GLTexture::MatrixList &, const CompRegion &, const CompRegion &, unsigned int = MAXSHORT, unsigned int = MAXSHORT); WRAPABLE_HND (3, GLWindowInterface, void, glDrawTexture, GLTexture *texture, const GLMatrix &, const GLWindowPaintAttrib &, unsigned int); friend class GLScreen; friend class PrivateGLScreen; private: PrivateGLWindow *priv; }; #endif compiz-0.9.11+14.04.20140409/plugins/opengl/include/opengl/vector.h0000644000015301777760000000654712321343002025035 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Danny Baumann */ #ifndef _GLVECTOR_H #define _GLVECTOR_H /** * Class which describes a point or vector * in 3D space */ class GLVector { public: typedef enum { x, y, z, w } VectorCoordsEnum; GLVector (); GLVector (float x, float y, float z, float w = 0.0f); /** * Returns a reference to the x, y, z or w value by using * 0, 1, 2, 3 as array-access items */ float& operator[] (int item); /** * Returns a reference to the x, y, z or w value by using * x, y, z, w as array-access items */ float& operator[] (VectorCoordsEnum coord); /** * Returns a readonly x, y, z or w value by using * 0, 1, 2, 3 as array-access items */ const float & operator[] (int item) const; /** * Returns a readonly x, y, z or w value by using * x, y, z, w as array-access items */ const float & operator[] (VectorCoordsEnum coord) const; /** * Adds all elements in a GLVector */ GLVector& operator+= (const GLVector& rhs); /** * Subtracts all elements in a GLVector */ GLVector& operator-= (const GLVector& rhs); /** * Scales all elements in a vector * @param k Scale factor */ GLVector& operator*= (const float k); /** * Scales all elements in a vector by 1 / k * @param k Scale factor */ GLVector& operator/= (const float k); GLVector& operator^= (const GLVector& rhs); /** * Returns the norm of this vector */ float norm (); /** * Returns the normalized version of the vector */ GLVector& normalize (); /** * Returns the homogenized version of the vector */ GLVector& homogenize (); private: friend GLVector operator+ (const GLVector& lhs, const GLVector& rhs); friend GLVector operator- (const GLVector& lhs, const GLVector& rhs); friend GLVector operator- (const GLVector& vector); friend float operator* (const GLVector& lhs, const GLVector& rhs); friend GLVector operator* (const float k, const GLVector& vector); friend GLVector operator* (const GLVector& vector, const float k); friend GLVector operator/ (const GLVector& lhs, const GLVector& rhs); friend GLVector operator^ (const GLVector& lhs, const GLVector& rhs); float v[4]; }; #endif compiz-0.9.11+14.04.20140409/plugins/opengl/include/opengl/shadercache.h0000644000015301777760000000573012321343002025756 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Alexandros Frantzis */ #ifndef GL_SHADER_CACHE_H_ #define GL_SHADER_CACHE_H_ #include /** * How to use a variable in a shader. */ enum GLShaderVariableType { /** The variable is not used */ GLShaderVariableNone, /** The variable value is held in a uniform */ GLShaderVariableUniform, /** The variable value is held in a varying (from a vertex attribute) */ GLShaderVariableVarying, }; /** * Parameters that define a vertex-fragment shader pair. */ struct GLShaderParameters { /** Whether this shader supports opacity */ bool opacity; /** Whether this shader supports brightness */ bool brightness; /** Whether this shader supports saturation */ bool saturation; /** Whether this shader supports color and how */ GLShaderVariableType color; /** Whether this shader supports normals and how */ GLShaderVariableType normal; /** The number of textures this shader uses */ int numTextures; /** Gets a minimalistic string representation of the parameters */ std::string id() const; /** Gets a unique hash value for this set of parameters */ int hash() const; }; /** * An object representing a named vertex-fragment shader pair. */ struct GLShaderData { std::string name; std::string vertexShader; std::string fragmentShader; }; class PrivateShaderCache; /** * A cache of vertex-fragment shader pairs (GLShaderData). */ class GLShaderCache { public: GLShaderCache (); ~GLShaderCache (); /** * Gets the GLShaderData associated with the specified parameters. * * @param params the parameters to get the GLShaderData for. * * @return the GLShaderData */ const GLShaderData &getShaderData (const GLShaderParameters ¶ms); private: PrivateShaderCache *priv; }; #endif compiz-0.9.11+14.04.20140409/plugins/opengl/include/opengl/programcache.h0000644000015301777760000000316512321343002026157 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins */ #ifndef _COMPIZ_GLPROGRAMCACHE_H #define _COMPIZ_GLPROGRAMCACHE_H #include #include #include #include #include class PrivateProgramCache; struct GLShaderData; class GLProgramCache { private: PrivateProgramCache *priv; public: GLProgramCache (size_t); ~GLProgramCache (); GLProgram* operator () (std::list); }; #endif // _COMPIZ_GLPROGRAMCACHE_H compiz-0.9.11+14.04.20140409/plugins/opengl/include/opengl/program.h0000644000015301777760000000462312321343002025173 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins */ #ifndef _COMPIZ_GLPROGRAM_H #define _COMPIZ_GLPROGRAM_H #ifdef USE_GLES #include #else #include #endif #include #include class PrivateProgram; class GLProgram { public: GLProgram (CompString &vertexShader, CompString &fragmentShader); ~GLProgram (); bool valid (); void bind (); void unbind (); bool setUniform (const char *name, GLfloat value); bool setUniform (const char *name, GLint value); bool setUniform (const char *name, const GLMatrix &value); bool setUniform2f (const char *name, GLfloat x, GLfloat y); bool setUniform3f (const char *name, GLfloat x, GLfloat y, GLfloat z); bool setUniform4f (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); bool setUniform2i (const char *name, GLint x, GLint y); bool setUniform3i (const char *name, GLint x, GLint y, GLint z); bool setUniform4i (const char *name, GLint x, GLint y, GLint z, GLint w); GLuint attributeLocation (const char *name); private: PrivateProgram *priv; }; #endif // _COMPIZ_GLPROGRAM_H compiz-0.9.11+14.04.20140409/plugins/opengl/include/opengl/texture.h0000644000015301777760000001334312321343002025223 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _GLTEXTURE_H #define _GLTEXTURE_H #include "core/region.h" #include "core/string.h" #include #ifdef USE_GLES #include #else #include #endif #include #include #include #define POWER_OF_TWO(v) ((v & (v - 1)) == 0) /** * Returns a 2D matrix adjusted texture co-ordinate x */ #define COMP_TEX_COORD_X(m, vx) ((m).xx * (vx) + (m).x0) /** * Returns a 2D matrix adjusted texture co-ordinate y */ #define COMP_TEX_COORD_Y(m, vy) ((m).yy * (vy) + (m).y0) /** * Returns a 2D matrix adjusted texture co-ordinate xy */ #define COMP_TEX_COORD_XY(m, vx, vy) \ ((m).xx * (vx) + (m).xy * (vy) + (m).x0) /** * Returns a 2D matrix adjusted texture co-ordinate yx */ #define COMP_TEX_COORD_YX(m, vx, vy) \ ((m).yx * (vx) + (m).yy * (vy) + (m).y0) class PrivateTexture; /** * Class which represents an openGL texture */ class GLTexture : public CompRect { public: typedef enum { Fast, Good } Filter; typedef struct { float xx; float yx; float xy; float yy; float x0; float y0; } Matrix; typedef std::vector MatrixList; /** * Class which represents a list of openGL textures, * usually used for texture tiling */ class List : public std::vector { public: List (); List (unsigned int); List (const List &); ~List (); List & operator= (const List &); void clear (); }; typedef boost::function BindPixmapProc; typedef unsigned int BindPixmapHandle; public: /** * Returns the openGL texture name */ GLuint name () const; /** * Returns the openGL texture target */ GLenum target () const; /** * Returns the openGL texture filter */ GLenum filter () const; /** * Returns a 2D 2x3 matrix describing the transformation of * the texture */ const Matrix & matrix () const; /** * Establishes the texture as the current drawing texture * in the openGL context * * @param filter Defines what kind of filtering level this * texture should be drawn with */ virtual void enable (Filter filter); /** * Stops the textures from being the current drawing texture * in the openGL context */ virtual void disable (); /** * Returns true if this texture is MipMapped */ bool mipmap () const; /** * Sets if this texture should be MipMapped */ void setMipmap (bool); /** * Sets the openGL filter which should be used on this * texture */ void setFilter (GLenum); void setWrap (GLenum); /** * Increases the reference count of a texture */ static void incRef (GLTexture *); /** * Decreases the reference count of a texture */ static void decRef (GLTexture *); /** * Returns a GLTexture::List with the contents of * some pixmap * * @param pixmap Specifies the pixmap data which should be converted * into texture data * @param width Specifies the width of the texture * @param height Specifies the height of the texture * @param depth Specifies the color depth of the texture * @param source Whether the pixmap lifecycle is managed externall */ static List bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source = compiz::opengl::InternallyManaged); /** * Returns a GLTexture::List with the contents of of * a raw image buffer * * @param image Specifies a raw image buffer which should be converted * into texture data * @param size Specifies the size of this new texture */ static List imageBufferToTexture (const char *image, CompSize size); static List imageDataToTexture (const char *image, CompSize size, GLenum format, GLenum type); /** * Uses image loading plugins to read an image from the disk and * return a GLTexture::List with its contents * * @param imageFileName The filename of the image * @param pluginName The name of the plugin, used to find * the default image path * @param size The size of this new texture */ static List readImageToTexture (CompString &imageFileName, CompString &pluginName, CompSize &size); friend class PrivateTexture; protected: GLTexture (); virtual ~GLTexture (); void setData (GLenum target, Matrix &m, bool mipmap); private: PrivateTexture *priv; }; #endif compiz-0.9.11+14.04.20140409/plugins/opengl/include/opengl/doublebuffer.h0000644000015301777760000000377312321343002026175 0ustar pbusernogroup00000000000000#ifndef _COMPIZ_OPENGL_BUFFERBLIT_H #define _COMPIZ_OPENGL_BUFFERBLIT_H #include #include namespace compiz { namespace opengl { namespace impl { typedef boost::function GLXWaitVideoSyncSGIFunc; typedef boost::function GLXSwapIntervalEXTFunc; } class DoubleBuffer { public: DoubleBuffer (const impl::GLXSwapIntervalEXTFunc &swapIntervalFunc, const impl::GLXWaitVideoSyncSGIFunc &waitVideoSyncFunc); virtual ~DoubleBuffer (); virtual void swap () const = 0; virtual bool blitAvailable () const = 0; virtual void blit (const CompRegion ®ion) const = 0; virtual bool fallbackBlitAvailable () const = 0; virtual void fallbackBlit (const CompRegion ®ion) const = 0; virtual void copyFrontToBack () const = 0; typedef enum { VSYNC, HAVE_PERSISTENT_BACK_BUFFER, NEED_PERSISTENT_BACK_BUFFER, _NSETTINGS } Setting; typedef enum _RedrawType { Swap, Blit } FrontbufferRedrawType; typedef enum _SyncType { NoSync = 0, Async = 1, Blocking = 2 } SyncType; typedef enum _FrameThrottleState { ExternalFrameThrottlingRequired, FrameThrottledInternally } FrameThrottleState; void set (Setting name, bool value); void render (const CompRegion ®ion, bool fullscreen); void vsync (FrontbufferRedrawType redrawType); bool hardwareVSyncFunctional (); protected: bool setting[_NSETTINGS]; private: virtual bool enableAsyncVideoSync (FrontbufferRedrawType, FrameThrottleState &); virtual void disableAsyncVideoSync (); virtual bool enableBlockingVideoSync (FrontbufferRedrawType, FrameThrottleState &); virtual void disableBlockingVideoSync (); SyncType syncType; FrameThrottleState bufferFrameThrottleState; unsigned int blockingVSyncUnthrottledFrames; impl::GLXSwapIntervalEXTFunc swapIntervalFunc; impl::GLXWaitVideoSyncSGIFunc waitVideoSyncFunc; unsigned int lastVSyncCounter; }; } } #endif compiz-0.9.11+14.04.20140409/plugins/opengl/include/opengl/matrix.h0000644000015301777760000000413612321343002025027 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Danny Baumann */ #ifndef _GLMATRIX_H #define _GLMATRIX_H #include class CompOutput; class GLMatrix { public: GLMatrix (); GLMatrix (const float *); const float* getMatrix () const; GLMatrix& operator*= (const GLMatrix& rhs); float& operator[] (unsigned int pos); void reset (); void toScreenSpace (const CompOutput *output, float z); bool invert (); void rotate (const float angle, const float x, const float y, const float z); void rotate (const float angle, const GLVector& vector); void scale (const float x, const float y, const float z); void scale (const GLVector& vector); void translate (const float x, const float y, const float z); void translate (const GLVector& vector); private: friend GLMatrix operator* (const GLMatrix& lhs, const GLMatrix& rhs); friend GLVector operator* (const GLMatrix& lhs, const GLVector& rhs); float m[16]; }; #endif compiz-0.9.11+14.04.20140409/plugins/opengl/include/opengl/framebufferobject.h0000644000015301777760000000710012321343002027170 0ustar pbusernogroup00000000000000/* * Copyright (c) 2011 Collabora, Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Collabora Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Collabora Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * COLLABORA LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL COLLABORA LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Pekka Paalanen */ #ifndef _COMPIZ_GLFRAMEBUFFEROBJECT_H #define _COMPIZ_GLFRAMEBUFFEROBJECT_H #include struct PrivateGLFramebufferObject; /** * Class representing a framebuffer object in GL, supporting only one * color attachment as per GLES 2 spec. The color attachment is referred * to as the texture (of the FBO). * * Usage: * 1. create a GLFramebufferObject (requires a GL context) * 2. call allocate (size), and check status () * 3. old = bind () * 4. do your rendering * 5. rebind (old) * 6. use the rendered texture via tex () * 7. go to 2 or 3, or delete to quit (requires a GL context) */ class GLFramebufferObject { public: GLFramebufferObject (); ~GLFramebufferObject (); /** * Ensure the texture is of the given size, recreating it if needed, * and replace the FBO color attachment with it. The texture contents * become undefined, unless specified in the 'image' argument. * When specifying 'image', it's also possible to pass-in the * desired image's 'format' and 'type'. * * Returns true on success, and false on texture allocation failure. */ bool allocate (const CompSize &size, const char *image = NULL, GLenum format = GL_RGBA, GLenum type = GL_UNSIGNED_BYTE); /** * Bind this as the current FBO, previous binding in GL context is * undone. GL rendering is now targeted to this FBO. * Returns a pointer to the previously bound FBO, or NULL if * the previous binding was zero (the window system provided * framebuffer). * * The previous FBO is no longer bound, so you can use its * texture. To restore the previous FBO, call rebind (FBO) with * the returned pointer as the argument. */ GLFramebufferObject *bind (); /** * Bind the given FBO as the current FBO, without looking up the * previous binding. The argument can be NULL, in which case the * window system provided framebuffer gets bound (FBO is unbound). */ static void rebind (GLFramebufferObject *fbo); /** * Check the FBO completeness. Returns true on complete. * Otherwise returns false and reports the error to log. */ bool checkStatus (); /** * Return a pointer to the texture that is the color attachment. * This will return NULL, if allocate () has not been called, or * the last allocate () call failed. */ GLTexture *tex (); private: PrivateGLFramebufferObject *priv; }; #endif // _COMPIZ_GLFRAMEBUFFEROBJECT_H compiz-0.9.11+14.04.20140409/plugins/opengl/include/opengl/vertexbuffer.h0000644000015301777760000001003412321343002026224 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins * Frederic Plourde */ #ifndef _COMPIZ_GLVERTEXBUFFER_H #define _COMPIZ_GLVERTEXBUFFER_H #ifdef USE_GLES #include #else #include #endif #include #include #include class PrivateVertexBuffer; struct GLWindowPaintAttrib; namespace compiz { namespace gl { class AutoProgram { public: virtual ~AutoProgram () {} virtual GLProgram *getProgram(GLShaderParameters ¶ms) = 0; }; } } class GLVertexBuffer { public: static bool enabled (); GLVertexBuffer (); GLVertexBuffer (GLenum usage); ~GLVertexBuffer (); typedef compiz::gl::AutoProgram AutoProgram; static GLVertexBuffer *streamingBuffer (); void begin (GLenum primitiveType = GL_TRIANGLES); bool end (); // vertices and normals are 3 parts, count is number of xyz groups void addVertices (GLuint nVertices, const GLfloat *vertices); GLfloat *getVertices () const; // AKA GLWindow::Geometry::vertices int getVertexStride () const; // AKA GLWindow::Geometry::vertexStride int countVertices () const; // AKA GLWindow::Geometry::vCount void addNormals (GLuint nNormals, const GLfloat *normals); // color is always RGBA (4 parts), count is number of rgba groups void addColors (GLuint nColors, const GLushort *colors); void color4f (GLfloat r, GLfloat g, GLfloat b, GLfloat a); void colorDefault (); // texture is index, texcoords are 2 parts, count is number of pairs void addTexCoords (GLuint texture, GLuint nTexcoords, const GLfloat *texcoords); void addUniform (const char *name, GLfloat value); void addUniform (const char *name, GLint value); bool addUniform (const char *name, const GLMatrix &value); void addUniform2f (const char *name, GLfloat x, GLfloat y); void addUniform3f (const char *name, GLfloat x, GLfloat y, GLfloat z); void addUniform4f (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void addUniform2i (const char *name, GLint x, GLint y); void addUniform3i (const char *name, GLint x, GLint y, GLint z); void addUniform4i (const char *name, GLint x, GLint y, GLint z, GLint w); void setProgram (GLProgram *program); void setAutoProgram (AutoProgram *autoProgram); // This no-argument render () function is intended for use by plugins // that have custom programs. int render (); int render (const GLMatrix &modelview); int render (const GLMatrix &modelview, const GLWindowPaintAttrib &attrib); int render (const GLMatrix &projection, const GLMatrix &modelview, const GLWindowPaintAttrib &attrib); void setVertexOffset (GLuint vOffset); void setMaxVertices (GLint vMax); private: PrivateVertexBuffer *priv; }; #endif // _COMPIZ_GLVERTEXBUFFER_H compiz-0.9.11+14.04.20140409/plugins/opengl/DRIVERS0000644000015301777760000000514612321343002021506 0ustar pbusernogroup00000000000000Notes on Graphics Drivers ========================= Please amend this file as you discover undocumented behaviour in various graphics drivers as it will assist other developers who may face similar problems in future. fglrx ===== 1. fglrx is currently detecting the binary name "compiz" and forcing indirect mode rendering. This causes certain opengl functionality such as GLSL, framebuffer objects and vertex buffer objects to not work correctly even if they are advertised. RESOLVED. WORKAROUND: Distributions should change the binary name to something other than "compiz", either at ship time or execution time. nvidia ====== 1. nvidia does not permit vertex array client states and vertex buffer objects to be active at the same time. Eg, the following code has undefined behaviour and will crash. glEnableClientState (GL_VERTEX_ARRAY); ... glBindBufferARB (GL_ARRAY_BUFFER_ARB, vertexBuffer); glDrawArrays (GL_TRIANGLES, 0, vertexBufferSize); 2. nvidia does not permit mixing of extension and core functionality tokens with extension entry points and core functionality entry points. The following is undefined: glBindFramebufferEXT (GL_FRAMEBUFFER, fboId); mesa ==== 1. Mesa does not advertise GLX_BIND_TO_MIPMAP_TEXTURE_EXT even though mipmap storage for GLXPixmaps are supported. RESOLVED. WORKAROUND: Until this bug is fixed, detect when a Mesa driver is running and force the usage of GLX_BIND_TO_MIPMAP_TEXTURE on all 24 and 32 bit depth fbconfigs llvmpipe ======== 1. llvmpipe does not support using glXSwapBuffers and glXCopySubBufferMESA on the same front buffer RESOLVED. WORKAROUND: detect when llvmpipe is active and force the usage of glXSwapBuffers on every frame 2. llvmpipe will crash when a pixmap does not exist on the server side and glXBindTexImageEXT is used on it. RESOLVED. WORKAROUND: grab the server, query the server as to whether or not the pixmap exists, call glXBindTexImageEXT and then release the server grab. This will ensure we never call glXBindTexImageEXT on a destroyed pixmap. virtualbox ========== 1. vboxdrv requires the usage of a second X Server connection inside of glXBindTexImageEXT. If compiz requires a server grab at this time (eg, the pixmap may not have its lifetime managed by us, see issue #2 in llvmpipe), then the driver will hang in glXBindTexImageEXT as it must use this connection in order to listen for any new damage events. RESOLVED. WORKAROUND: force the usage of the copy-to-texture path when using this driver ("Chromium") and binding an externally managed pixmap to a texture compiz-0.9.11+14.04.20140409/plugins/fade/0000755000015301777760000000000012321344021020054 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/fade/CMakeLists.txt0000644000015301777760000000014712321343002022614 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(fade PLUGINDEPS composite opengl)compiz-0.9.11+14.04.20140409/plugins/fade/src/0000755000015301777760000000000012321344021020643 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/fade/src/fade.cpp0000644000015301777760000002263212321343002022251 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "fade.h" #include COMPIZ_PLUGIN_20090315 (fade, FadePluginVTable); bool FadeScreen::bell (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (optionGetFullscreenVisualBell () && CompOption::getBoolOptionNamed (options, "fullscreen", false)) { foreach (CompWindow *w, screen->windows ()) { if (w->destroyed () || !w->isViewable ()) continue; FadeWindow::get (w)->dim (false); } cScreen->damageScreen (); } else { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) FadeWindow::get (w)->dim (true); } return true; } void FadeScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (event->type == PropertyNotify && event->xproperty.atom == Atoms::winState) { CompWindow *w = screen->findWindow (event->xproperty.window); if (w && w->isViewable ()) { if (w->state () & CompWindowStateDisplayModalMask) FadeWindow::get (w)->addDisplayModal (); else FadeWindow::get (w)->removeDisplayModal (); } } } void FadeScreen::preparePaint (int msSinceLastPaint) { int steps = MAX (12, (msSinceLastPaint * OPAQUE) / fadeTime); unsigned int mode = optionGetFadeMode (); foreach (CompWindow *w, screen->windows ()) FadeWindow::get (w)->paintStep (mode, msSinceLastPaint, steps); cScreen->preparePaint (msSinceLastPaint); } void FadeWindow::dim (bool damage) { if (!cWindow->damaged ()) return; brightness = cWindow->brightness () / 2; if (damage) cWindow->addDamage (); } void FadeWindow::addDisplayModal () { if (!(window->state () & CompWindowStateDisplayModalMask) || dModal) return; dModal = true; ++fScreen->displayModals; if (fScreen->displayModals == 1) fScreen->cScreen->damageScreen (); } void FadeWindow::removeDisplayModal () { if (!dModal) return; dModal = false; --fScreen->displayModals; if (fScreen->displayModals == 0) fScreen->cScreen->damageScreen (); } void FadeWindow::paintStep (unsigned int mode, int msSinceLastPaint, int step) { if (mode == FadeOptions::FadeModeConstantSpeed) { steps = step; fadeTime = 0; } else if (mode == FadeOptions::FadeModeConstantTime) { if (fadeTime) { steps = 1; fadeTime -= msSinceLastPaint; if (fadeTime < 0) fadeTime = 0; } else steps = 0; } } void FadeWindow::windowNotify (CompWindowNotify n) { window->windowNotify (n); if (n == CompWindowNotifyAliveChanged) cWindow->addDamage (); } bool FadeWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (!GL::canDoSlightlySaturated) saturation = attrib.saturation; if (window->alive () && opacity == attrib.opacity && brightness == attrib.brightness && saturation == attrib.saturation && !fScreen->displayModals) return gWindow->glPaint (attrib, transform, region, mask); GLWindowPaintAttrib fAttrib (attrib); int mode = fScreen->optionGetFadeMode (); if (!window->alive () && fScreen->optionGetDimUnresponsive ()) { GLuint value = fScreen->optionGetUnresponsiveBrightness (); if (value != 100) fAttrib.brightness = fAttrib.brightness * value / 100; value = fScreen->optionGetUnresponsiveSaturation (); if (value != 100 && GL::canDoSlightlySaturated) fAttrib.saturation = fAttrib.saturation * value / 100; } else if (fScreen->displayModals && !dModal) { fAttrib.brightness = 0xa8a8; fAttrib.saturation = 0; } if (mode == FadeOptions::FadeModeConstantTime && (fAttrib.opacity != targetOpacity || fAttrib.brightness != targetBrightness || fAttrib.saturation != targetSaturation)) { fadeTime = fScreen->optionGetFadeTime (); steps = 1; opacityDiff = fAttrib.opacity - opacity; brightnessDiff = fAttrib.brightness - brightness; saturationDiff = fAttrib.saturation - saturation; targetOpacity = fAttrib.opacity; targetBrightness = fAttrib.brightness; targetSaturation = fAttrib.saturation; } if (steps) { GLint newOpacity = OPAQUE; GLint newBrightness = BRIGHT; GLint newSaturation = COLOR; if (mode == FadeOptions::FadeModeConstantSpeed) { newOpacity = opacity; if (fAttrib.opacity > opacity) newOpacity = MIN (opacity + steps, fAttrib.opacity); else if (fAttrib.opacity < opacity) newOpacity = MAX (opacity - steps, fAttrib.opacity); newBrightness = brightness; if (fAttrib.brightness > brightness) newBrightness = MIN (brightness + (steps / 12), fAttrib.brightness); else if (fAttrib.brightness < brightness) newBrightness = MAX (brightness - (steps / 12), fAttrib.brightness); newSaturation = saturation; if (fAttrib.saturation > saturation) newSaturation = MIN (saturation + (steps / 6), fAttrib.saturation); else if (fAttrib.saturation < saturation) newSaturation = MAX (saturation - (steps / 6), fAttrib.saturation); } else if (mode == FadeOptions::FadeModeConstantTime) { int totalFadeTime = fScreen->optionGetFadeTime (); if (totalFadeTime == 0) totalFadeTime = fadeTime; newOpacity = fAttrib.opacity - (opacityDiff * fadeTime / totalFadeTime); newBrightness = fAttrib.brightness - (brightnessDiff * fadeTime / totalFadeTime); newSaturation = fAttrib.saturation - (saturationDiff * fadeTime / totalFadeTime); } steps = 0; if (newOpacity > 0) { opacity = newOpacity; brightness = newBrightness; saturation = newSaturation; if (newOpacity != fAttrib.opacity || newBrightness != fAttrib.brightness || newSaturation != fAttrib.saturation) cWindow->addDamage (); } else opacity = 0; } fAttrib.opacity = opacity; fAttrib.brightness = brightness; fAttrib.saturation = saturation; return gWindow->glPaint (fAttrib, transform, region, mask); } FadeScreen::FadeScreen (CompScreen *s) : PluginClassHandler (s), displayModals (0), cScreen (CompositeScreen::get (s)) { fadeTime = 1000.0f / optionGetFadeSpeed (); optionSetVisualBellInitiate (boost::bind (&FadeScreen::bell, this, _1, _2, _3)); ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); } bool FadeScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = FadeOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case FadeOptions::FadeSpeed: fadeTime = 1000.0f / optionGetFadeSpeed (); break; case FadeOptions::WindowMatch: cScreen->damageScreen (); break; case FadeOptions::DimUnresponsive: foreach (CompWindow *w, screen->windows ()) w->windowNotifySetEnabled (FadeWindow::get (w), optionGetDimUnresponsive ()); break; default: break; } return rv; } FadeWindow::FadeWindow (CompWindow *w) : PluginClassHandler (w), fScreen (FadeScreen::get (screen)), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), opacity (cWindow->opacity ()), brightness (cWindow->brightness ()), saturation (cWindow->saturation ()), targetOpacity (opacity), targetBrightness (brightness), targetSaturation (saturation), dModal (false), steps (0), fadeTime (0), opacityDiff (0), brightnessDiff (0), saturationDiff (0) { if (window->isViewable ()) addDisplayModal (); WindowInterface::setHandler (window, false); GLWindowInterface::setHandler (gWindow); if (fScreen->optionGetDimUnresponsive ()) window->windowNotifySetEnabled (this, true); } FadeWindow::~FadeWindow () { removeDisplayModal (); } bool FadePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/fade/src/fade.h0000644000015301777760000000572512321343002021722 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include "fade_options.h" #include class FadeScreen : public ScreenInterface, public CompositeScreenInterface, public PluginClassHandler, public FadeOptions { public: FadeScreen (CompScreen *s); bool setOption (const CompString &, CompOption::Value &); bool bell (CompAction *, CompAction::State state, CompOption::Vector &); void handleEvent (XEvent *); void preparePaint (int); int displayModals; int fadeTime; CompositeScreen *cScreen; }; class FadeWindow : public WindowInterface, public GLWindowInterface, public PluginClassHandler { public: FadeWindow (CompWindow *w); ~FadeWindow (); void windowNotify (CompWindowNotify); void paintStep (unsigned int , int , int ); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); void addDisplayModal (); void removeDisplayModal (); void dim (bool); private: FadeScreen *fScreen; CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; GLushort opacity; GLushort brightness; GLushort saturation; GLushort targetOpacity; GLushort targetBrightness; GLushort targetSaturation; bool dModal; int steps; int fadeTime; int opacityDiff; int brightnessDiff; int saturationDiff; }; class FadePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/fade/fade.xml.in0000644000015301777760000000466712321343002022115 0ustar pbusernogroup00000000000000 <_short>Fading Windows <_long>Fade in windows when mapped and fade out windows when unmapped Effects opengl decor cube scale compiz-0.9.11+14.04.20140409/plugins/crashhandler/0000755000015301777760000000000012321344021021613 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/crashhandler/crashhandler.xml.in0000644000015301777760000000211712321343002025377 0ustar pbusernogroup00000000000000 <_short>Crash handler <_long>Compiz crash handler plugin Utility <_short>Main compiz-0.9.11+14.04.20140409/plugins/crashhandler/CMakeLists.txt0000644000015301777760000000012512321343002024347 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (crashhandler) compiz-0.9.11+14.04.20140409/plugins/crashhandler/src/0000755000015301777760000000000012321344021022402 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/crashhandler/src/crashhandler.cpp0000644000015301777760000000646212321343002025552 0ustar pbusernogroup00000000000000/* * * Compiz crash handler plugin * * crashhandler.cpp * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@compiz-fusion.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. * */ #include #include #include #include #include #include "crashhandler.h" COMPIZ_PLUGIN_20090315 (crashhandler, CrashPluginVTable) static void crash_handler (int sig) { #ifndef PR_SET_PTRACER #define PR_SET_PTRACER 0x59616d61 #endif prctl (PR_SET_PTRACER, getpid (), 0, 0, 0); if (sig == SIGSEGV || sig == SIGFPE || sig == SIGILL || sig == SIGABRT) { CrashScreen *cs = CrashScreen::get (screen); static int count = 0; if (++count > 1 || !cs) exit (1); // backtrace char cmd[1024]; snprintf (cmd, 1024, "echo -e \"set prompt\nthread apply all bt full\n" "echo \\\\\\n\necho \\\\\\n\nbt\nquit\" > /tmp/gdb.tmp;" "gdb -q %s %i < /tmp/gdb.tmp | " "grep -v \"No symbol table\" | " "tee %s/compiz_crash-%i.out; rm -f /tmp/gdb.tmp; " "echo \"\n[CRASH_HANDLER]: " "\\\"%s/compiz_crash-%i.out\\\" created!\n\"", programName, getpid (), cs->optionGetDirectory ().c_str (), getpid (), cs->optionGetDirectory ().c_str (), getpid () ); int ret = system (cmd); if (cs->optionGetStartWm ()) { if (fork () == 0) { setsid (); putenv (const_cast (screen->displayString ())); execl ("/bin/sh", "/bin/sh", "-c", cs->optionGetWmCmd ().c_str (), NULL); exit (0); } } exit (ret ? ret : 1); } } void CrashScreen::optionChanged (CompOption *opt, CrashhandlerOptions::Options num) { switch (num) { case CrashhandlerOptions::Enabled: if (optionGetEnabled ()) { // enable crash handler signal (SIGSEGV, crash_handler); signal (SIGFPE, crash_handler); signal (SIGILL, crash_handler); signal (SIGABRT, crash_handler); } else { // disable crash handler signal (SIGSEGV, SIG_DFL); signal (SIGFPE, SIG_DFL); signal (SIGILL, SIG_DFL); signal (SIGABRT, SIG_DFL); } break; default: break; } } CrashScreen::CrashScreen (CompScreen *screen) : PluginClassHandler (screen), CrashhandlerOptions () { if (optionGetEnabled ()) { // segmentation fault signal (SIGSEGV, crash_handler); // floating point exception signal (SIGFPE, crash_handler); // illegal instruction signal (SIGILL, crash_handler); // abort signal (SIGABRT, crash_handler); } optionSetEnabledNotify ( boost::bind (&CrashScreen::optionChanged, this, _1, _2)); } CrashScreen::~CrashScreen () { signal (SIGSEGV, SIG_DFL); signal (SIGFPE, SIG_DFL); signal (SIGILL, SIG_DFL); signal (SIGABRT, SIG_DFL); } bool CrashPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/crashhandler/src/crashhandler.h0000644000015301777760000000222012321343002025203 0ustar pbusernogroup00000000000000/* * * Compiz crash handler plugin * * crashhandler.h * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@compiz-fusion.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. * */ #include #include #include "crashhandler_options.h" #include class CrashScreen : public PluginClassHandler, public CrashhandlerOptions { public: CrashScreen (CompScreen *screen); ~CrashScreen (); void optionChanged (CompOption *opt, CrashhandlerOptions::Options num); }; class CrashPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/widget/0000755000015301777760000000000012321344021020440 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/widget/widget.xml.in0000644000015301777760000000446712321343002023063 0ustar pbusernogroup00000000000000 <_short>Widget Layer <_long>Show widget windows on a separate layer Desktop fade animation opengl composite opengl decor <_short>Behaviour <_short>Appearance <_short>Background in Widget Mode compiz-0.9.11+14.04.20140409/plugins/widget/CMakeLists.txt0000644000015301777760000000015312321343002023175 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (widget PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/widget/src/0000755000015301777760000000000012321344021021227 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/widget/src/widget.h0000644000015301777760000000707412321343002022671 0ustar pbusernogroup00000000000000/* * * Compiz widget handling plugin * * widget.c * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2008 Sam Spilsbury * E-mail : smspillaz@gmail.com * * Idea based on widget.c: * Copyright : (C) 2006 Quinn Storm * E-mail : livinglatexkali@gmail.com * * Copyright : (C) 2007 Mike Dransfield * E-mail : mike@blueroot.co.uk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include "widget_options.h" class WidgetScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public WidgetOptions { public: enum WidgetState { StateOff = 0, StateFadeIn = 1, StateOn = 2, StateFadeOut = 3 }; public: WidgetScreen (CompScreen *screen); ~WidgetScreen (); CompositeScreen *cScreen; void handleEvent (XEvent *event); void matchPropertyChanged (CompWindow *w); void matchExpHandlerChanged (); CompMatch::Expression * matchInitExp (const CompString &value); void preparePaint (int); void donePaint (); void setWidgetLayerMapState (bool map); bool registerExpHandler (); bool toggle (CompAction *action, CompAction::State state, CompOption::Vector &options); void endWidgetMode (CompWindow *closedWidget); bool updateStatus (CompWindow *w); void optionChanged (CompOption *, WidgetOptions::Options num); Window mLastActiveWindow; Atom mCompizWidgetAtom; WidgetState mState; int mFadeTime; CompScreen::GrabHandle mGrabIndex; Cursor mCursor; }; #define WIDGET_SCREEN(screen) \ WidgetScreen *ws = WidgetScreen::get (screen) class WidgetWindow : public PluginClassHandler , public WindowInterface, public GLWindowInterface { public: enum WidgetPropertyState { PropertyNotSet = 0, PropertyWidget, PropertyNoWidget }; public: WidgetWindow (CompWindow *w); ~WidgetWindow (); CompWindow *window; GLWindow *gWindow; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool focus (); void updateTreeStatus (); bool updateWidgetStatus (); bool updateWidgetPropertyState (); void updateWidgetMapState (bool map); bool updateMatch (); bool managed () const; bool mIsWidget; bool mWasHidden; CompWindow *mParentWidget; CompTimer mMatchUpdate; CompTimer mWidgetStatusUpdate; WidgetPropertyState mPropertyState; }; #define WIDGET_WINDOW(window) \ WidgetWindow *ww = WidgetWindow::get (window) class WidgetPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/widget/src/widget.cpp0000644000015301777760000003703312321343002023222 0ustar pbusernogroup00000000000000/* * * Compiz widget handling plugin * * widget.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2008 Sam Spilsbury * E-mail : smspillaz@gmail.com * * Idea based on widget.c: * Copyright : (C) 2006 Quinn Storm * E-mail : livinglatexkali@gmail.com * * Copyright : (C) 2007 Mike Dransfield * E-mail : mike@blueroot.co.uk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "widget.h" class WidgetExp : public CompMatch::Expression { public: WidgetExp (const CompString &str); bool evaluate (const CompWindow *w) const; bool value; }; COMPIZ_PLUGIN_20090315 (widget, WidgetPluginVTable); static void enableFunctions (WidgetScreen *ws, bool enabled) { ws->cScreen->preparePaintSetEnabled (ws, enabled); ws->cScreen->donePaintSetEnabled (ws, enabled); foreach (CompWindow *w, screen->windows ()) { WIDGET_WINDOW (w); ww->window->focusSetEnabled (ww, enabled); ww->gWindow->glPaintSetEnabled (ww, enabled); } } void WidgetWindow::updateTreeStatus () { /* first clear out every reference to our window */ foreach (CompWindow *win, screen->windows ()) { WIDGET_WINDOW (win); if (ww->mParentWidget == win) ww->mParentWidget = NULL; } if (window->destroyed () || !mIsWidget) return; foreach (CompWindow *win, screen->windows ()) { Window clientLeader = win->clientLeader (true); if ((clientLeader == window->clientLeader ()) && (window->id () != win->id ())) { WIDGET_WINDOW (win); ww->mParentWidget = window; } } } bool WidgetWindow::updateWidgetStatus () { bool isWidget; WIDGET_SCREEN (screen); switch (mPropertyState) { case PropertyWidget: isWidget = true; break; case PropertyNoWidget: isWidget = false; break; default: if (!window->managed () || (window->wmType () & CompWindowTypeDesktopMask)) isWidget = false; else isWidget = ws->optionGetMatch ().evaluate (window); break; } bool retval = (!isWidget && mIsWidget) || (isWidget && !mIsWidget); mIsWidget = isWidget; return retval; } bool WidgetWindow::updateWidgetPropertyState () { Atom retType; int format; unsigned long nitems, remain; unsigned char *data = NULL; WIDGET_SCREEN (screen); int result = XGetWindowProperty (screen->dpy (), window->id (), ws->mCompizWidgetAtom, 0, 1L, false, AnyPropertyType, &retType, &format, &nitems, &remain, &data); if (result == Success && data) { if (nitems && format == 32) { unsigned long int *retData = (unsigned long int *) data; if (*retData) mPropertyState = PropertyWidget; else mPropertyState = PropertyNoWidget; } XFree (data); } else mPropertyState = PropertyNotSet; return updateWidgetStatus (); } void WidgetWindow::updateWidgetMapState (bool map) { if (map && mWasHidden) { window->show (); window->raise (); mWasHidden = false; window->managedSetEnabled (this, false); } else if (!map && !mWasHidden) { /* never set ww->mHidden on previously unmapped windows - it might happen that we map windows when entering the widget mode which aren't supposed to be unmapped */ if (window->isViewable ()) { window->hide (); mWasHidden = true; window->managedSetEnabled (this, true); } } } bool WidgetWindow::managed () const { return false; } void WidgetScreen::setWidgetLayerMapState (bool map) { CompWindow *highest = NULL; unsigned int highestActiveNum = 0; CompWindowList copyWindows = screen->windows (); /* We have to operate on a copy of the list, since it's possible * for the screen->windows () to be re-ordered by * WidgetWindow::updateWidgetMapState, (-> CompWindow::raise -> * CompScreen::unhookWindow) */ foreach (CompWindow *window, copyWindows) { WIDGET_WINDOW (window); if (!ww->mIsWidget) continue; if (window->activeNum () > highestActiveNum) { highest = window; highestActiveNum = window->activeNum (); } ww->updateWidgetMapState (map); } if (map && highest) { if (!mLastActiveWindow) mLastActiveWindow = screen->activeWindow (); highest->moveInputFocusTo (); } else if (!map) { CompWindow *w = screen->findWindow (mLastActiveWindow); mLastActiveWindow = None; if (w) w->moveInputFocusTo (); } } bool WidgetScreen::registerExpHandler () { screen->matchExpHandlerChanged (); return false; } WidgetExp::WidgetExp (const CompString &str) : value (strtol (str.c_str (), NULL, 0)) { } bool WidgetExp::evaluate (const CompWindow *w) const { const WidgetWindow *ww = WidgetWindow::get (w); return ((value && ww->mIsWidget) || (!value && !ww->mIsWidget)); } CompMatch::Expression * WidgetScreen::matchInitExp (const CompString &str) { /* Create a new match object */ if (str.find ("widget=") == 0) return new WidgetExp (str.substr (7)); return screen->matchInitExp (str); } void WidgetScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); /* match options are up to date after the call to matchExpHandlerChanged */ foreach (CompWindow *w, screen->windows ()) { WIDGET_WINDOW (w); if (ww->updateWidgetStatus ()) { bool map = !ww->mIsWidget || (mState != StateOff); ww->updateWidgetMapState (map); ww->updateTreeStatus (); screen->matchPropertyChanged (w); } } } bool WidgetScreen::toggle (CompAction *action, CompAction::State state, CompOption::Vector &options) { switch (mState) { case StateOn: case StateFadeIn: setWidgetLayerMapState (false); mFadeTime = 1000.0f * optionGetFadeTime (); mState = StateFadeOut; break; case StateOff: case StateFadeOut: setWidgetLayerMapState (true); mFadeTime = 1000.0f * optionGetFadeTime (); mState = StateFadeIn; break; default: break; } if (!mGrabIndex) mGrabIndex = screen->pushGrab (mCursor, "widget"); enableFunctions (this, true); cScreen->damageScreen (); return true; } void WidgetScreen::endWidgetMode (CompWindow *closedWidget) { CompOption::Vector options; if (mState != StateOn && mState != StateFadeIn) return; if (closedWidget) { /* end widget mode if the closed widget was the last one */ WIDGET_WINDOW (closedWidget); if (ww->mIsWidget) { foreach (CompWindow *w, screen->windows ()) { WIDGET_WINDOW (w); if (w == closedWidget) continue; if (ww->mIsWidget) return; } } else return; } options.push_back (CompOption ("root", CompOption::TypeInt)); options[0].value ().set ((int) screen->root ()); toggle (NULL, 0, options); } void WidgetScreen::handleEvent (XEvent *event) { CompWindow *w; screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == mCompizWidgetAtom) { w = screen->findWindow (event->xproperty.window); if (w) { WIDGET_WINDOW (w); if (ww->updateWidgetPropertyState ()) { bool map = !ww->mIsWidget || mState != StateOff; ww->updateWidgetMapState (map); ww->updateTreeStatus (); screen->matchPropertyChanged (w); } } } else if (event->xproperty.atom == Atoms::wmClientLeader) { w = screen->findWindow (event->xproperty.window); if (w) { WIDGET_WINDOW (w); if (ww->mIsWidget) ww->updateTreeStatus (); else if (ww->mParentWidget) { WidgetWindow *pww = WidgetWindow::get (ww->mParentWidget); pww->updateTreeStatus (); } } } break; case ButtonPress: /* terminate widget mode if a non-widget window was clicked */ if (optionGetEndOnClick () && event->xbutton.button == Button1) { if (mState == StateOn) { w = screen->findWindow (event->xbutton.window); if (w && w->managed ()) { WIDGET_WINDOW (w); if (!ww->mIsWidget && !ww->mParentWidget) endWidgetMode (NULL); } } } break; case MapNotify: w = screen->findWindow (event->xmap.window); if (w) { WIDGET_WINDOW (w); ww->updateWidgetStatus (); if (ww->mIsWidget) ww->updateWidgetMapState (mState != StateOff); } break; case UnmapNotify: w = screen->findWindow (event->xunmap.window); if (w) { WIDGET_WINDOW (w); ww->updateTreeStatus (); endWidgetMode (w); } break; case DestroyNotify: w = screen->findWindow (event->xdestroywindow.window); if (w) { WIDGET_WINDOW (w); ww->updateTreeStatus (); endWidgetMode (w); } break; default: break; } } bool WidgetWindow::updateMatch () { if (updateWidgetStatus ()) { WIDGET_SCREEN (screen); updateTreeStatus (); updateWidgetMapState (ws->mState != WidgetScreen::StateOff); screen->matchPropertyChanged (window); } return false; } bool WidgetScreen::updateStatus (CompWindow *w) { WIDGET_WINDOW (w); if (ww->updateWidgetPropertyState ()) ww->updateWidgetMapState (mState != StateOff); Window clientLeader = w->clientLeader (true); if (ww->mIsWidget) ww->updateTreeStatus (); else if (clientLeader) { CompWindow *lw = screen->findWindow (clientLeader); if (lw) { WidgetWindow *lww = WidgetWindow::get (lw); if (lww->mIsWidget) ww->mParentWidget = lw; else if (lww->mParentWidget) ww->mParentWidget = lww->mParentWidget; } } return false; } void WidgetScreen::matchPropertyChanged (CompWindow *w) { WIDGET_WINDOW (w); /* one shot timeout which will update the widget status (timer is needed because we don't want to call wrapped functions recursively) */ if (!ww->mMatchUpdate.active ()) ww->mMatchUpdate.start (boost::bind (&WidgetWindow::updateMatch, ww), 0, 0); screen->matchPropertyChanged (w); } bool WidgetWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; WIDGET_SCREEN (screen); if (ws->mState != WidgetScreen::StateOff) { GLWindowPaintAttrib wAttrib = attrib; float fadeProgress; if (ws->mState == WidgetScreen::StateOn) fadeProgress = 1.0f; else { fadeProgress = ws->optionGetFadeTime (); if (fadeProgress) fadeProgress = (float) ws->mFadeTime / (1000.0f * fadeProgress); fadeProgress = 1.0f - fadeProgress; } if (!mIsWidget && !mParentWidget) { if (ws->mState == WidgetScreen::StateFadeIn || ws->mState == WidgetScreen::StateOn) fadeProgress = 1.0f - fadeProgress; float progress = ws->optionGetBgSaturation () / 100.0f; progress += (1.0f - progress) * fadeProgress; wAttrib.saturation = (float) wAttrib.saturation * progress; progress = ws->optionGetBgBrightness () / 100.0f; progress += (1.0f - progress) * fadeProgress; wAttrib.brightness = (float) wAttrib.brightness * progress; } status = gWindow->glPaint (wAttrib, transform, region, mask); } else status = gWindow->glPaint (attrib, transform, region, mask); return status; } bool WidgetWindow::focus () { WIDGET_SCREEN (screen); /* Don't focus non-widget windows while widget mode is enabled */ if (ws->mState != WidgetScreen::StateOff && !mIsWidget && !mParentWidget) return false; return window->focus (); } void WidgetScreen::preparePaint (int msSinceLastPaint) { if ((mState == StateFadeIn) || (mState == StateFadeOut)) { mFadeTime -= msSinceLastPaint; mFadeTime = MAX (mFadeTime, 0); } cScreen->preparePaint (msSinceLastPaint); } void WidgetScreen::donePaint () { if (mState == StateFadeIn || mState == StateFadeOut) { if (mFadeTime) cScreen->damageScreen (); else { if (mGrabIndex) { screen->removeGrab (mGrabIndex, NULL); mGrabIndex = 0; } if (mState == StateFadeIn) mState = StateOn; else mState = StateOff; } } if (mState == StateOff) { cScreen->damageScreen (); enableFunctions (this, false); } cScreen->donePaint (); } void WidgetScreen::optionChanged (CompOption *option, WidgetOptions::Options num) { switch (num) { case WidgetOptions::Match: { foreach (CompWindow *w, screen->windows ()) { WIDGET_WINDOW (w); if (ww->updateWidgetStatus ()) { bool map = !ww->mIsWidget || mState != StateOff; ww->updateWidgetMapState (map); ww->updateTreeStatus (); screen->matchPropertyChanged (w); } } } break; default: break; } } /* ------ */ WidgetScreen::WidgetScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), mLastActiveWindow (None), mCompizWidgetAtom (XInternAtom (screen->dpy (), "_COMPIZ_WIDGET", false)), mFadeTime (0), mGrabIndex (0), mCursor (XCreateFontCursor (screen->dpy (), XC_watch)) { CompAction::CallBack cb; ChangeNotify notify; CompTimer registerTimer; ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); screen->handleEventSetEnabled (this, true); screen->matchInitExpSetEnabled (this, true); screen->matchExpHandlerChangedSetEnabled (this, true); cb = boost::bind (&WidgetScreen::toggle, this, _1, _2, _3); optionSetToggleKeyInitiate (cb); optionSetToggleButtonInitiate (cb); optionSetToggleEdgeInitiate (cb); notify = boost::bind (&WidgetScreen::optionChanged, this, _1, _2); optionSetMatchNotify (notify); /* one shot timeout to which will register the expression handler after all screens and windows have been initialized */ registerTimer.start (boost::bind(&WidgetScreen::registerExpHandler, this), 0, 0); mState = StateOff; } WidgetScreen::~WidgetScreen () { screen->matchExpHandlerChangedSetEnabled (this, false); screen->matchExpHandlerChanged (); if (mCursor) XFreeCursor (screen->dpy (), mCursor); } WidgetWindow::WidgetWindow (CompWindow *window) : PluginClassHandler (window), window (window), gWindow (GLWindow::get (window)), mIsWidget (false), mWasHidden (false), mParentWidget (NULL), mPropertyState (PropertyNotSet) { WindowInterface::setHandler (window); GLWindowInterface::setHandler (gWindow, false); window->managedSetEnabled (this, false); mWidgetStatusUpdate.start (boost::bind (&WidgetScreen::updateStatus, WidgetScreen::get (screen), window), 0, 0); } WidgetWindow::~WidgetWindow () { if (mMatchUpdate.active ()) mMatchUpdate.stop (); if (mWidgetStatusUpdate.active ()) mWidgetStatusUpdate.stop (); } bool WidgetPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/maximumize/0000755000015301777760000000000012321344021021342 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/maximumize/maximumize.xml.in0000644000015301777760000001443312321343002024661 0ustar pbusernogroup00000000000000 <_short>Maximumize <_long>Maximumizes windows (resize them to fit the available screenspace). Window Management decor composite opengl <_short>Options <_short>Bindings <_short>Maximumize Bindings <_short>Minimumize Bindings compiz-0.9.11+14.04.20140409/plugins/maximumize/CMakeLists.txt0000644000015301777760000000012312321343002024074 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (maximumize) compiz-0.9.11+14.04.20140409/plugins/maximumize/src/0000755000015301777760000000000012321344021022131 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/maximumize/src/maximumize.cpp0000644000015301777760000003510212321343002025021 0ustar pbusernogroup00000000000000/* * Compiz Fusion Maximumize plugin * * Copyright 2007-2008 Kristian Lyngstøl * Copyright 2008 Eduardo Gurgel Pinho * Copyright 2008 Marco Diego Aurelio Mesquita * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Kristian Lyngstøl * Eduardo Gurgel * Marco Diego Aurélio Mesquita * * Description: * * Maximumize resizes a window so it fills as much of the free space in any * direction as possible without overlapping with other windows. * */ #include "maximumize.h" COMPIZ_PLUGIN_20090315 (maximumize, MaximumizePluginVTable); /* Convenience constants to make the code more readable (hopefully) */ const short REDUCE = -1; const unsigned short INCREASE = 1; /* Returns true if rectangles a and b intersect by at least 40 in both * directions */ bool MaximumizeScreen::substantialOverlap (const CompRect& a, const CompRect& b) { if (a.x2 () <= b.x1 () + 40) return false; if (b.x2 () <= a.x1 () + 40) return false; if (a.y2 () <= b.y1 () + 40) return false; if (b.y2 () <= a.y1 () + 40) return false; return true; } /* Generates a region containing free space (here the * active window counts as free space). The region argument * is the start-region (ie: the output dev). * Logic borrowed from opacify (courtesy of myself). */ CompRegion MaximumizeScreen::findEmptyRegion (CompWindow *window, const CompRect& output) { CompRegion newRegion (output); CompRect tmpRect, windowRect; if (optionGetIgnoreOverlapping ()) windowRect = window->serverBorderRect (); foreach (CompWindow *w, screen->windows ()) { CompRegion tmpRegion; if (w->id () == window->id ()) continue; if (w->invisible () /*|| w->hidden */|| w->minimized ()) continue; if (w->wmType () & CompWindowTypeDesktopMask) continue; if (w->wmType () & CompWindowTypeDockMask) { if (w->struts ()) { tmpRegion += w->struts ()->left; tmpRegion += w->struts ()->right; tmpRegion += w->struts ()->top; tmpRegion += w->struts ()->bottom; newRegion -= tmpRegion; } continue; } if (optionGetIgnoreSticky () && (w->state () & CompWindowStateStickyMask) && !(w->wmType () & CompWindowTypeDockMask)) { continue; } tmpRect = w->serverBorderRect (); if (optionGetIgnoreOverlapping () && substantialOverlap (tmpRect, windowRect)) { continue; } tmpRegion += tmpRect; newRegion -= tmpRegion; } return newRegion; } /* Returns true if box a has a larger area than box b. */ bool MaximumizeScreen::boxCompare (const CompRect& a, const CompRect& b) { int areaA, areaB; areaA = a.width () * a.height (); areaB = b.width () * b.height (); return (areaA > areaB); } /* While the rectangle has space, add inc to i. When it CHEKCREC fails (ie: * we overstepped our boundaries), reduce i by inc; undo the last change. * inc is either 1 or -1, but could easily be looped over for fun and * profit. (Ie: start with -100, hit the wall, go with -20, then -1, etc.) * * NOTE: We have to pass along tmp, r and w for CHECKREC. * FIXME: */ /* If a window, with decorations, defined by tmp and w is still in free * space, evaluate to true. */ inline void MaximumizeScreen::addToCorner (CompRect& rect, Corner corner, const short inc) { switch (corner) { case X1: rect.setX (rect.x () + inc); break; case X2: rect.setWidth (rect.width () + inc); break; case Y1: rect.setY (rect.y () + inc); break; case Y2: rect.setHeight (rect.height () + inc); break; } } #define CHECKREC \ r.contains (CompRect (tmp.x1 () - w->border ().left, \ tmp.y1 () - w->border ().top, \ tmp.width () + w->border ().right + w->border ().left, \ tmp.height () + w->border ().bottom + w->border ().top)) void MaximumizeScreen::growGeneric (CompWindow *w, CompRect& tmp, const CompRegion& r, Corner corner, const short inc) { bool touch = false; while (CHECKREC) { addToCorner (tmp, corner, inc); touch = true; } if (touch) addToCorner (tmp, corner, -inc); } /* Grow a box in the left/right directions as much as possible without * overlapping other relevant windows. */ void MaximumizeScreen::growWidth (CompWindow *w, CompRect& tmp, const CompRegion& r, const MaxSet& mset) { if (mset.left) growGeneric (w, tmp, r, X1, REDUCE); if (mset.right) growGeneric (w, tmp, r, X2, INCREASE); } /* Grow box in the up/down direction as much as possible without * overlapping other relevant windows. */ void MaximumizeScreen::growHeight (CompWindow *w, CompRect& tmp, const CompRegion& r, const MaxSet& mset) { if (mset.down) growGeneric (w, tmp, r, Y2, INCREASE); if (mset.up) growGeneric (w, tmp, r, Y1, REDUCE); } /* Extends the given box for Window w to fit as much space in region r. * If XFirst is true, it will first expand in the X direction, * then Y. This is because it gives different results. */ CompRect MaximumizeScreen::extendBox (CompWindow *w, const CompRect& tmp, const CompRegion& r, bool xFirst, const MaxSet& mset) { CompRect result = tmp; if (xFirst) { growWidth (w, result, r, mset); growHeight (w, result, r, mset); } else { growHeight (w, result, r, mset); growWidth (w, result, r, mset); } return result; } /* These two functions set the width and height respectively, with gravity * towards the center of the window. They will set the box-width to width * as long as at least one of the sides can be modified. Same for height. */ void MaximumizeScreen::setBoxWidth (CompRect& box, const int width, const MaxSet& mset) { int original = box.width (); int increment; if (!mset.left && !mset.right) return; if (mset.left != mset.right) increment = original - width; else increment = (original - width) / 2; box.setX (box.x () + (mset.left ? increment : 0)); box.setWidth (box.width () - (mset.right ? increment : 0)); } void MaximumizeScreen::setBoxHeight (CompRect& box, const int height, const MaxSet& mset) { int original = box.height (); int increment; if (!mset.down && !mset.up) return ; if (mset.up != mset.down) increment = original - height; else increment = (original - height) / 2; box.setY (box.y () + (mset.up ? increment : 0)); box.setHeight (box.height () - (mset.down ? increment : 0)); } /* Reduce box size by setting width and height to 1/4th or the minimum size * allowed, whichever is bigger. */ CompRect MaximumizeScreen::minimumize (CompWindow *w, const CompRect& box, const MaxSet& mset) { const int minWidth = w->sizeHints ().min_width; const int minHeight = w->sizeHints ().min_height; int width, height; CompRect result = box; /* unmaximize first */ w->maximize (0); width = result.width (); height = result.height (); if (width / 4 < minWidth) setBoxWidth (result, minWidth, mset); else setBoxWidth (result, width / 4, mset); if (height / 4 < minHeight) setBoxHeight (result, minHeight, mset); else setBoxHeight (result, height / 4, mset); return result; } /* Create a box for resizing in the given region * Also shrinks the window box in case of minor overlaps. * FIXME: should be somewhat cleaner. */ CompRect MaximumizeScreen::findRect (CompWindow *w, const CompRegion& r, const MaxSet& mset) { CompRect windowBox, ansA, ansB, orig; windowBox.setGeometry (w->serverX (), w->serverY (), w->serverWidth (), w->serverHeight ()); orig = windowBox; if (mset.shrink) windowBox = minimumize (w, windowBox, mset); if (!mset.grow) return windowBox; ansA = extendBox (w, windowBox, r, true, mset); ansB = extendBox (w, windowBox, r, false, mset); if (!optionGetAllowShrink ()) { if (boxCompare (orig, ansA) && boxCompare (orig, ansB)) return orig; } else { /* Order is essential here. */ if (!boxCompare (ansA, windowBox) && !boxCompare (ansB, windowBox)) return orig; } if (boxCompare (ansA, ansB)) return ansA; else return ansB; } /* Calls out to compute the resize */ unsigned int MaximumizeScreen::computeResize (CompWindow *w, XWindowChanges *xwc, const MaxSet& mset) { int outputDevice = w->outputDevice (); const CompOutput& output = screen->outputDevs ()[outputDevice]; CompRegion region; unsigned int mask = 0; CompRect box; region = findEmptyRegion (w, output); box = findRect (w, region, mset); if (box.x1 () != w->serverX ()) mask |= CWX; if (box.y1 () != w->serverY ()) mask |= CWY; if (box.width () != w->serverWidth ()) mask |= CWWidth; if (box.height () != w->serverHeight ()) mask |= CWHeight; xwc->x = box.x1 (); xwc->y = box.y1 (); xwc->width = box.width (); xwc->height = box.height (); return mask; } /* General trigger. This is for maximumizing / minimumizing without a direction * Note that the function is static in the class so 'this' in unavailable, * we have to use MAX_SCREEN (screen) to get the object */ bool MaximumizeScreen::triggerGeneral (CompAction *action, CompAction::State state, CompOption::Vector &options, bool grow) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findWindow (xid); if (w) { int width, height; unsigned int mask; XWindowChanges xwc; MaxSet mset; MAX_SCREEN (screen); if (screen->otherGrabExist (0)) return false; mset.left = ms->optionGetMaximumizeLeft (); mset.right = ms->optionGetMaximumizeRight (); mset.up = ms->optionGetMaximumizeUp (); mset.down = ms->optionGetMaximumizeDown (); mset.grow = grow; mset.shrink = true; mask = computeResize (w, &xwc, mset); if (mask) { if (w->constrainNewWindowSize (xwc.width, xwc.height, &width, &height)) { mask |= CWWidth | CWHeight; xwc.width = width; xwc.height = height; } if (w->mapNum () && (mask & (CWWidth | CWHeight))) w->sendSyncRequest (); w->configureXWindow (mask, &xwc); } } return true; } /* * Maximizing on specified direction. */ bool MaximumizeScreen::triggerDirection (CompAction *action, CompAction::State state, CompOption::Vector &options, bool left, bool right, bool up, bool down, bool grow) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findWindow (xid); if (w) { int width, height; unsigned int mask; XWindowChanges xwc; MaxSet mset; if (screen->otherGrabExist (0)) return false; mset.left = left; mset.right = right; mset.up = up; mset.down = down; mset.grow = grow; mset.shrink = !grow; mask = computeResize (w, &xwc, mset); if (mask) { if (w->constrainNewWindowSize (xwc.width, xwc.height, &width, &height)) { mask |= CWWidth | CWHeight; xwc.width = width; xwc.height = height; } if (w->mapNum () && (mask & (CWWidth | CWHeight))) w->sendSyncRequest (); w->configureXWindow (mask, &xwc); } } return true; } /* Configuration, initialization, boring stuff. --------------------- */ /* Screen Constructor */ MaximumizeScreen::MaximumizeScreen (CompScreen *screen) : PluginClassHandler (screen) { /* This macro uses boost::bind to have lots of callbacks trigger the same * function with different arguments */ #define MAXSET(opt, up, down, left, right) \ optionSet##opt##Initiate (boost::bind (&MaximumizeScreen::triggerDirection,\ this, _1, _2, _3, up, \ down, left, right, true)) #define MINSET(opt, up, down, left, right) \ optionSet##opt##Initiate (boost::bind (&MaximumizeScreen::triggerDirection,\ this, _1, _2, _3, up, \ down, left, right, false)) /* Maximumize Bindings */ optionSetTriggerMaxKeyInitiate ( boost::bind (&MaximumizeScreen::triggerGeneral,this, _1, _2, _3, true)); /* TriggerDirection, left, right, up, down */ MAXSET (TriggerMaxLeft, true, false, false, false); MAXSET (TriggerMaxRight, true, false, false, false); MAXSET (TriggerMaxUp, false, false, true, false); MAXSET (TriggerMaxDown, false, false, false, true); MAXSET (TriggerMaxHorizontally, true, true, false, false); MAXSET (TriggerMaxVertically, false, false, true, true); MAXSET (TriggerMaxUpLeft, true, false, true, false); MAXSET (TriggerMaxUpRight, false, true, true, false); MAXSET (TriggerMaxDownLeft, true, false, false, true); MAXSET (TriggerMaxDownRight, false, true, false, true); /* Maximumize Bindings */ optionSetTriggerMinKeyInitiate ( boost::bind (&MaximumizeScreen::triggerGeneral, this, _1, _2, _3, false)); MINSET (TriggerMinLeft, true, false, false, false); MINSET (TriggerMinRight, true, false, false, false); MINSET (TriggerMinUp, false, false, true, false); MINSET (TriggerMinDown, false, false, false, true); MINSET (TriggerMinHorizontally, true, true, false, false); MINSET (TriggerMinVertically, false, false, true, true); MINSET (TriggerMinUpLeft, true, false, true, false); MINSET (TriggerMinUpRight, false, true, true, false); MINSET (TriggerMinDownLeft, true, false, false, true); MINSET (TriggerMinDownRight, false, true, false, true); #undef MAXSET #undef MINSET } /* Initial plugin init function called. Checks to see if we are ABI * compatible with core, otherwise unload */ bool MaximumizePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/maximumize/src/maximumize.h0000644000015301777760000000727712321343002024502 0ustar pbusernogroup00000000000000/* * Compiz Fusion Maximumize plugin * * Copyright 2007-2008 Kristian Lyngstøl * Copyright 2008 Eduardo Gurgel Pinho * Copyright 2008 Marco Diego Aurelio Mesquita * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Kristian Lyngstøl * Eduardo Gurgel * Marco Diego Aurélio Mesquita * * Description: * * Maximumize resizes a window so it fills as much of the free space in any * direction as possible without overlapping with other windows. */ #include #include #include "maximumize_options.h" /* Convenience constants to make the code more readable (hopefully) */ extern const short REDUCE; extern const unsigned short INCREASE; typedef struct { bool left; bool right; bool up; bool down; bool shrink; // Shrink and grow can both be executed. bool grow; // Shrink will run first. } MaxSet; class MaximumizeScreen : public PluginClassHandler , public MaximumizeOptions { public: MaximumizeScreen (CompScreen *); bool triggerGeneral (CompAction *action, CompAction::State state, CompOption::Vector &options, bool grow); bool triggerDirection (CompAction *action, CompAction::State state, CompOption::Vector &options, bool left, bool right, bool up, bool down, bool grow); private: typedef enum { X1, X2, Y1, Y2 } Corner; bool substantialOverlap (const CompRect& a, const CompRect& b); CompRegion findEmptyRegion (CompWindow *window, const CompRect& output); bool boxCompare (const CompRect& a, const CompRect& b); void growGeneric (CompWindow *w, CompRect& tmp, const CompRegion& r, Corner corner, const short inc); inline void addToCorner (CompRect& rect, Corner corner, const short inc); inline void growWidth (CompWindow *w, CompRect& tmp, const CompRegion& r, const MaxSet& mset); inline void growHeight (CompWindow *w, CompRect& tmp, const CompRegion& r, const MaxSet& mset); CompRect extendBox (CompWindow *w, const CompRect& tmp, const CompRegion& r, bool xFirst, const MaxSet& mset); void setBoxWidth (CompRect& box, const int width, const MaxSet& mset); void setBoxHeight (CompRect& box, const int height, const MaxSet& mset); CompRect minimumize (CompWindow *w, const CompRect& box, const MaxSet& mset); CompRect findRect (CompWindow *w, const CompRegion& r, const MaxSet& mset); unsigned int computeResize (CompWindow *w, XWindowChanges *xwc, const MaxSet& mset); }; #define MAX_SCREEN(s) \ MaximumizeScreen *ms = MaximumizeScreen::get (s); class MaximumizePluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/clone/0000755000015301777760000000000012321344021020255 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/clone/clone.xml.in0000644000015301777760000000110212321343002022474 0ustar pbusernogroup00000000000000 <_short>Clone Output <_long>Output clone handler Desktop opengl decor compiz-0.9.11+14.04.20140409/plugins/clone/CMakeLists.txt0000644000015301777760000000015212321343002023011 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (clone PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/clone/src/0000755000015301777760000000000012321344021021044 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/clone/src/clone.h0000644000015301777760000000644212321343002022321 0ustar pbusernogroup00000000000000#ifndef COMPIZ_CLONE_H #define COMPIZ_CLONE_H /* * Copyright © 2006 Novell, Inc. * * clone.h * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Ported to Compiz 0.9 by: * Copyright (c) 2009 Sam Spilsbury * * Author: David Reveman */ #include "clone_options.h" #include #include #include class Clone { public: int src; int dst; CompRegion region; Window input; }; class CloneScreen : public PluginClassHandler , public CloneOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: CloneScreen (CompScreen *); ~CloneScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CompScreen::GrabHandle grabHandle; bool grab; float offset; bool transformed; std::list clones; int x, y; int grabbedOutput; int src, dst; void handleEvent (XEvent *); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void donePaint (); void outputChangeNotify (); /* Internal class functions */ void finish (); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); void setStrutsForCloneWindow (Clone *clone); void handleMotionEvent (CompPoint &p); }; class CloneWindow : public PluginClassHandler , public GLWindowInterface { public: CloneWindow (CompWindow *window); CompositeWindow *cWindow; GLWindow *gWindow; bool glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask); }; #define CLONE_SCREEN(s) \ CloneScreen *cs = CloneScreen::get (s) #define CLONE_WINDOW(w) \ CloneWindow *cw = CloneWindow::get (w) class ClonePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #endif compiz-0.9.11+14.04.20140409/plugins/clone/src/clone.cpp0000644000015301777760000003436512321343002022661 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * clone.cpp * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Ported to Compiz 0.9 by: * Copyright (c) 2009 Sam Spilsbury * * Author: David Reveman */ #include "clone.h" COMPIZ_PLUGIN_20090315 (clone, ClonePluginVTable); static void togglePaintFunctions (CloneScreen *cs, bool enabled) { screen->handleEventSetEnabled (cs, enabled); cs->cScreen->preparePaintSetEnabled (cs, enabled); cs->gScreen->glPaintOutputSetEnabled (cs, enabled); cs->cScreen->donePaintSetEnabled (cs, enabled); foreach (CompWindow *w, screen->windows ()) { CLONE_WINDOW (w); cw->gWindow->glPaintSetEnabled (cw, enabled); } } void CloneScreen::finish () { grab = false; if (src != dst) { Clone *fClone = NULL; /* check if we should replace current clone */ foreach (Clone *iClone, clones) { if (iClone->dst == dst) { fClone = iClone; break; } } /* no existing clone for this destination, we must allocate one */ if (!fClone) { fClone = new Clone (); XSetWindowAttributes attr; int x, y; attr.override_redirect = true; x = (int) screen->outputDevs ()[dst].x1 (); y = (int) screen->outputDevs ()[dst].y1 (); fClone->input = XCreateWindow (screen->dpy (), screen->root (), x, y, (int) screen->outputDevs ()[dst].width (), (int) screen->outputDevs ()[dst].height (), 0, 0, InputOnly, CopyFromParent, CWOverrideRedirect, &attr); XMapRaised (screen->dpy (), fClone->input); clones.push_back (fClone); } if (fClone) { fClone->src = src; fClone->dst = dst; } } if (grabbedOutput != dst) { /* remove clone */ foreach (Clone *iClone, clones) { if (iClone->dst == grabbedOutput) { XDestroyWindow (screen->dpy (), iClone->input); clones.remove (iClone); delete iClone; break; } } } } void CloneScreen::preparePaint (int msSinceLastPaint) { if (grab) { if (grabHandle) { offset -= msSinceLastPaint * 0.005f; if (offset < 0.0f) offset = 0.0f; } else { offset += msSinceLastPaint * 0.005f; if (offset >= 1.0f) offset = 1.0f; } } cScreen->preparePaint (msSinceLastPaint); foreach (Clone *iClone, clones) { CompOutput *srcOutput = &(screen->outputDevs () [iClone->src]); CompOutput *dstOutput = &(screen->outputDevs () [iClone->dst]); CompRegion dstOutputRegion (*dstOutput); CompRegion srcOutputRegion (*srcOutput); int dx, dy; dx = dstOutput->x1 () - srcOutput->x1 (); dy = dstOutput->y1 () - srcOutput->y1 (); if (cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_REGION_MASK) { if (srcOutput->width () != dstOutput->width () || srcOutput->height () != dstOutput->height ()) { cScreen->damageRegion (dstOutputRegion); iClone->region = srcOutputRegion; } else { CompRegion currentDamageRegion = cScreen->currentDamage (); iClone->region = currentDamageRegion - dstOutputRegion; iClone->region.translate (dx, dy); currentDamageRegion = iClone->region + currentDamageRegion; cScreen->damageRegion (currentDamageRegion); iClone->region = currentDamageRegion - srcOutputRegion; iClone->region.translate (-dx, -dy); } } else { iClone->region = srcOutputRegion; } } } void CloneScreen::donePaint () { if (grab) { if (offset == 1.0f) finish (); cScreen->damageScreen (); } cScreen->donePaint (); if (!grab && clones.empty ()) togglePaintFunctions (this, false); } bool CloneScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; unsigned int dstForThisOutput, outputId = 0; CompRegion sRegion = region; dstForThisOutput = outputId = ((unsigned int) output->id () != (unsigned int) ~0) ? output->id () : 0; if (!grab || (unsigned int) grabbedOutput != outputId) { foreach (Clone *iClone, clones) { if ((unsigned int) iClone->dst == outputId) { sRegion = iClone->region; dstForThisOutput = (unsigned int) iClone->src; if (screen->outputDevs ()[dstForThisOutput].width () != screen->outputDevs ()[outputId].width () || screen->outputDevs ()[dstForThisOutput].height () != screen->outputDevs ()[outputId].height ()) transformed = true; else transformed = false; break; } } } if (output->id () != (unsigned int) ~0) status = gScreen->glPaintOutput (attrib, transform, sRegion, &screen->outputDevs ()[dstForThisOutput], mask); else status = gScreen->glPaintOutput (attrib, transform, sRegion, output, mask); if (grab) { GLMatrix sTransform = transform; GLenum filter; float zoom1, zoom2x, zoom2y, x1, y1, x2, y2; float zoomX, zoomY; int dx, dy; zoom1 = 160.0f / screen->outputDevs ()[src].height (); x1 = x - (screen->outputDevs ()[src].x1 () * zoom1); y1 = y - (screen->outputDevs ()[src].y1 () * zoom1); x1 -= (screen->outputDevs ()[src].width () * zoom1) / 2; y1 -= (screen->outputDevs ()[src].height () * zoom1) / 2; if (grabHandle) { x2 = screen->outputDevs ()[grabbedOutput].x1 () - screen->outputDevs ()[src].x1 (); y2 = screen->outputDevs ()[grabbedOutput].y1 () - screen->outputDevs ()[src].y1 (); zoom2x = (float) screen->outputDevs ()[grabbedOutput].width () / screen->outputDevs ()[src].width (); zoom2y = (float) screen->outputDevs ()[grabbedOutput].height () / screen->outputDevs ()[src].height (); } else { x2 = screen->outputDevs ()[dst].x1 () - screen->outputDevs ()[src].x1 (); y2 = screen->outputDevs ()[dst].y1 () - screen->outputDevs ()[src].y1 (); zoom2x = (float) screen->outputDevs ()[dst].width () / screen->outputDevs ()[src].width (); zoom2y = (float) screen->outputDevs ()[dst].height () / screen->outputDevs ()[src].height (); } /* XXX: hmm.. why do I need this.. */ if (x2 < 0.0f) x2 *= zoom2x; if (y2 < 0.0f) y2 *= zoom2y; dx = x1 * (1.0f - offset) + x2 * offset; dy = y1 * (1.0f - offset) + y2 * offset; zoomX = zoom1 * (1.0f - offset) + zoom2x * offset; zoomY = zoom1 * (1.0f - offset) + zoom2y * offset; sTransform.translate (-0.5f, -0.5f, -DEFAULT_Z_CAMERA); sTransform.scale (1.0f / screen->outputDevs ()[outputId].width (), -1.0f / screen->outputDevs ()[outputId].height (), 1.0f); sTransform.translate (dx - screen->outputDevs ()[outputId].x1 (), dy - screen->outputDevs ()[outputId].y2 (), 0.0f); sTransform.scale (zoomX, zoomY, 1.0f); filter = gScreen->textureFilter (); if (offset == 0.0f) gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); CompRegion srcOutputRegion (screen->outputDevs ()[src]); foreach (CompWindow *w, screen->windows ()) { GLMatrix gTransform = transform; gTransform.translate (-100, 0, 0); CLONE_WINDOW (w); if (w->destroyed ()) continue; if (!w->shaded ()) { if (!w->isViewable () || !cw->cWindow->damaged ()) continue; } cw->gWindow->glPaint (cw->gWindow->paintAttrib (), sTransform, srcOutputRegion, PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK); } gScreen->setTextureFilter (filter); } return status; } bool CloneWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { CLONE_SCREEN (screen); if (!cs->clones.empty () && cs->transformed) mask |= PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK; return gWindow->glPaint (attrib, transform, region, mask); } bool CloneScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { std::list ::iterator it = clones.begin (); if (grab || screen->otherGrabExist ("clone", NULL)) return false; if (!grabHandle) grabHandle = screen->pushGrab (None, "clone"); grab = true; x = CompOption::getIntOptionNamed (options, "x", 0); y = CompOption::getIntOptionNamed (options, "y", 0); src = grabbedOutput = screen->outputDeviceForPoint (x, y); /* trace source */ while (it != clones.end ()) { if ((*it)->dst == src) { src = (*it)->src; it = clones.begin (); } else { ++it; } } togglePaintFunctions (this, true); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); return true; } bool CloneScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (grabHandle) { int x, y; screen->removeGrab (grabHandle, NULL); grabHandle = NULL; x = CompOption::getIntOptionNamed (options, "x", 0); y = CompOption::getIntOptionNamed (options, "y", 0); dst = screen->outputDeviceForPoint (x, y); cScreen->damageScreen (); } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } void CloneScreen::setStrutsForCloneWindow (Clone *clone) { #if 0 // Pointless code - needs fixing CompOutput *output = &screen->outputDevs ()[clone->dst]; XRectangle *rect = NULL; CompStruts *struts; CompStruts *wStruts; CompWindow *w; w = screen->findWindow (clone->input); if (!w) return; struts = new CompStruts (); if (!struts) return; wStruts = w->struts (); if (wStruts) delete wStruts; struts->left.x = 0; struts->left.y = 0; struts->left.width = 0; struts->left.height = screen->height (); struts->right.x = screen->width (); struts->right.y = 0; struts->right.width = 0; struts->right.height = screen->height (); struts->top.x = 0; struts->top.y = 0; struts->top.width = screen->width (); struts->top.height = 0; struts->bottom.x = 0; struts->bottom.y = screen->height (); struts->bottom.width = screen->width (); struts->bottom.height = 0; /* create struts relative to a screen edge that this output is next to */ if (output->x1 () == 0) rect = &struts->left; else if (output->x2 () == screen->width ()) rect = &struts->right; else if (output->y1 () == 0) rect = &struts->top; else if (output->y2 () == screen->height ()) rect = &struts->bottom; if (rect) { rect->x = output->x1 (); rect->y = output->y1 (); rect->width = output->width (); rect->height = output->height (); } wStruts = struts; /* * ^ FIXME: This code does nothing. Looks like it was meant to be: * *w->struts() = struts; * However that is not legal. CompWindow needs a setStruts(). */ #endif } void CloneScreen::handleMotionEvent (CompPoint &p) { if (grabHandle) { x = p.x (); y = p.y (); cScreen->damageScreen (); } } void CloneScreen::handleEvent (XEvent *event) { switch (event->type) { case MotionNotify: { CompPoint p (pointerX, pointerY); handleMotionEvent (p); } break; case EnterNotify: case LeaveNotify: { CompPoint p (pointerX, pointerY); handleMotionEvent (p); } default: break; } screen->handleEvent (event); switch (event->type) { case CreateNotify: { foreach (Clone *iClone, clones) { if (event->xcreatewindow.window == iClone->input) setStrutsForCloneWindow (iClone); } } default: break; } } void CloneScreen::outputChangeNotify () { std::list ::iterator it; for (it = clones.begin (); it != clones.end (); ++it) { if ((unsigned int) (*it)->dst >= screen->outputDevs ().size () || (unsigned int) (*it)->src >= screen->outputDevs ().size ()) { clones.erase (it); it = clones.begin (); continue; } } screen->outputChangeNotify (); } CloneScreen::CloneScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), grabHandle (NULL), grab (false), offset (1.0f), transformed (false), src (0) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); optionSetInitiateButtonInitiate (boost::bind (&CloneScreen::initiate, this, _1, _2, _3)); optionSetInitiateButtonTerminate (boost::bind (&CloneScreen::terminate, this, _1, _2, _3)); } CloneWindow::CloneWindow (CompWindow *window) : PluginClassHandler (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)) { GLWindowInterface::setHandler (gWindow, false); } CloneScreen::~CloneScreen () { while (!clones.empty ()) { clones.pop_front (); } } bool ClonePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/ring/0000755000015301777760000000000012321344021020114 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/ring/ring.xml.in0000644000015301777760000002223012321343002022177 0ustar pbusernogroup00000000000000 <_short>Ring Switcher <_long>Use a circular representation of open windows to switch focus between them Window Management text switcher staticswitcher decor opengl <_short>Bindings <_short>General Options <_short>Ring Appearance <_short>Window Title Display compiz-0.9.11+14.04.20140409/plugins/ring/CMakeLists.txt0000644000015301777760000000015612321343002022654 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (ring PLUGINDEPS composite opengl text) compiz-0.9.11+14.04.20140409/plugins/ring/src/0000755000015301777760000000000012321344021020703 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/ring/src/ring.cpp0000644000015301777760000007302612321343002022354 0ustar pbusernogroup00000000000000/* * * Compiz ring switcher plugin * * ring.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "ring.h" COMPIZ_PLUGIN_20090315 (ring, RingPluginVTable); const double PI = 3.14159265359f; const unsigned short ICON_SIZE = 512; bool textAvailable; static void toggleFunctions (bool enabled) { RING_SCREEN (screen); rs->cScreen->preparePaintSetEnabled (rs, enabled); rs->cScreen->donePaintSetEnabled (rs, enabled); rs->gScreen->glPaintOutputSetEnabled (rs, enabled); screen->handleEventSetEnabled (rs, enabled); foreach (CompWindow *w, screen->windows ()) { RING_WINDOW (w); rw->gWindow->glPaintSetEnabled (rw, enabled); rw->cWindow->damageRectSetEnabled (rw, enabled); } } void RingScreen::switchActivateEvent (bool activating) { CompOption::Vector o; CompOption o1 ("root", CompOption::TypeInt); o1.value ().set ((int) screen->root ()); o.push_back (o1); CompOption o2 ("active", CompOption::TypeBool); o2.value ().set (activating); o.push_back (o2); screen->handleCompizEvent ("ring", "activate", o); } bool RingWindow::is (bool removing) { if ((!removing && window->destroyed ()) || window->overrideRedirect () || window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return false; RING_SCREEN (screen); if (!removing && (!window->mapNum () || !window->isViewable ())) { if (rs->optionGetMinimized ()) { if (!window->minimized () && !window->inShowDesktopMode () && !window->shaded ()) return false; } else return false; } if (!removing && rs->mType == RingScreen::RingTypeNormal) { if (!window->mapNum () || !window->isViewable ()) { if (window->serverX () + window->width () <= 0 || window->serverY () + window->height () <= 0 || window->serverX () >= screen->width () || window->serverY () >= screen->height ()) return false; } else if (!window->focus ()) return false; } else if (rs->mType == RingScreen::RingTypeGroup && rs->mClientLeader != window->clientLeader () && rs->mClientLeader != window->id ()) return false; if (window->state () & CompWindowStateSkipTaskbarMask || !rs->mCurrentMatch.evaluate (window)) return false; return true; } void RingScreen::freeWindowTitle () { } void RingScreen::renderWindowTitle () { if (!textAvailable || !optionGetWindowTitle ()) return; CompText::Attrib attrib; freeWindowTitle (); if (!mSelectedWindow) return; CompRect oe = screen->getCurrentOutputExtents (); /* 75% of the output device as maximum width */ attrib.maxWidth = oe.width () * 3 / 4; attrib.maxHeight = 100; attrib.size = optionGetTitleFontSize (); attrib.color[0] = optionGetTitleFontColorRed (); attrib.color[1] = optionGetTitleFontColorGreen (); attrib.color[2] = optionGetTitleFontColorBlue (); attrib.color[3] = optionGetTitleFontColorAlpha (); attrib.flags = CompText::WithBackground | CompText::Ellipsized; if (optionGetTitleFontBold ()) attrib.flags |= CompText::StyleBold; attrib.family = "Sans"; attrib.bgHMargin = 15; attrib.bgVMargin = 15; attrib.bgColor[0] = optionGetTitleBackColorRed (); attrib.bgColor[1] = optionGetTitleBackColorGreen (); attrib.bgColor[2] = optionGetTitleBackColorBlue (); attrib.bgColor[3] = optionGetTitleBackColorAlpha (); mText.renderWindowTitle (mSelectedWindow->id (), mType == RingScreen::RingTypeAll, attrib); } void RingScreen::drawWindowTitle (const GLMatrix &transform) { if (!textAvailable || !optionGetWindowTitle ()) return; CompRect oe = screen->getCurrentOutputExtents (); float x = oe.centerX () - mText.getWidth () / 2; float y; unsigned short verticalOffset = optionGetVerticalOffset (); /* assign y (for the lower corner!) according to the setting */ switch (optionGetTitleTextPlacement ()) { case RingOptions::TitleTextPlacementCenteredOnScreen: y = oe.centerY () + mText.getHeight () / 2; break; case RingOptions::TitleTextPlacementTopOfScreenMinusOffset: case RingOptions::TitleTextPlacementBottomOfScreenPlusOffset: { CompRect workArea = screen->currentOutputDev ().workArea (); if (optionGetTitleTextPlacement () == RingOptions::TitleTextPlacementTopOfScreenMinusOffset) y = oe.y1 () + workArea.y () + mText.getHeight () + verticalOffset; else /* TitleTextPlacementBottomOfScreenPlusOffset */ y = oe.y1 () + workArea.y2 () - verticalOffset; } break; default: return; break; } mText.draw (transform, floor (x), floor (y), 1.0f); } bool RingWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { RING_SCREEN (screen); bool status; if (rs->mState != RingScreen::RingStateNone) { GLWindowPaintAttrib sAttrib = attrib; bool scaled = false; bool pixmap = true; if (window->mapNum () && gWindow->textures ().empty ()) { gWindow->bind (); } if (mAdjust || mSlot) { scaled = mAdjust || (mSlot); mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; } else if (rs->mState != RingScreen::RingStateIn) { if (rs->optionGetDarkenBack ()) /* modify brightness of the other windows */ sAttrib.brightness = sAttrib.brightness / 2; } status = gWindow->glPaint (sAttrib, transform, region, mask); pixmap = !gWindow->textures ().empty (); if (scaled && pixmap) { GLWindowPaintAttrib wAttrib (gWindow->lastPaintAttrib ()); GLMatrix wTransform = transform; if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) return false; if (mSlot) { wAttrib.brightness = (float)wAttrib.brightness * mSlot->depthBrightness; if (window != rs->mSelectedWindow) wAttrib.opacity = (float)wAttrib.opacity * rs->optionGetInactiveOpacity () / 100; } if (window->alpha () || wAttrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.translate (window->x (), window->y (), 0.0f); wTransform.scale (mScale, mScale, 1.0f); wTransform.translate (mTx / mScale - window->x (), mTy / mScale - window->y (), 0.0f); gWindow->glDraw (wTransform, wAttrib, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); } if (scaled && (rs->mState != RingScreen::RingStateIn) && ((rs->optionGetOverlayIcon () != RingOptions::OverlayIconNone) || !pixmap)) { GLTexture *icon; icon = gWindow->getIcon (512, 512); if (!icon) icon = rs->gScreen->defaultIcon (); if (icon) { GLTexture::Matrix matrix; GLTexture::MatrixList matricies; float scale; float x, y; enum RingOptions::OverlayIcon iconOverlay; int scaledWinWidth = window->width () * mScale; int scaledWinHeight = window->height () * mScale; if (!pixmap) iconOverlay = RingOptions::OverlayIconBig; else iconOverlay = (enum RingOptions::OverlayIcon) rs->optionGetOverlayIcon (); switch (iconOverlay) { case RingOptions::OverlayIconNone: case RingOptions::OverlayIconEmblem: scale = (mSlot) ? mSlot->depthScale : 1.0f; if (icon->width () > ICON_SIZE || icon->height () > ICON_SIZE) scale = MIN ((scale * ICON_SIZE / icon->width ()), (scale * ICON_SIZE / icon->height ())); break; case RingOptions::OverlayIconBig: default: /* only change opacity if not painting an icon for a minimized window */ if (pixmap) sAttrib.opacity /= 3; scale = MIN (((float) scaledWinWidth / icon->width ()), ((float) scaledWinHeight / icon->height ())); break; } int width = icon->width () * scale; int height = icon->height () * scale; switch (iconOverlay) { case RingOptions::OverlayIconNone: case RingOptions::OverlayIconEmblem: x = window->x () + scaledWinWidth - width; y = window->y () + scaledWinHeight - height; break; case RingOptions::OverlayIconBig: default: x = window->x () + scaledWinWidth / 2 - width / 2; y = window->y () + scaledWinHeight / 2 - height / 2; break; } x += mTx; y += mTy; mask |= PAINT_WINDOW_BLEND_MASK; /* if we paint the icon for a minimized window, we need to force the usage of a good texture filter */ if (!pixmap) mask |= PAINT_WINDOW_TRANSFORMED_MASK; CompRegion iconReg (window->x (), window->y (), icon->width (), icon->height ()); matrix = icon->matrix (); matrix.x0 -= (window->x () * matrix.xx); matrix.y0 -= (window->y () * matrix.yy); matricies.push_back (matrix); gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometry (matricies, iconReg, iconReg); if (gWindow->vertexBuffer ()->end ()) { GLWindowPaintAttrib wAttrib (sAttrib); GLMatrix wTransform = transform; if (!pixmap) sAttrib.opacity = gWindow->paintAttrib ().opacity; if (mSlot) wAttrib.brightness = (float)wAttrib.brightness * mSlot->depthBrightness; wTransform.translate (window->x (), window->y (), 0.0f); wTransform.scale (scale, scale, 1.0f); wTransform.translate ((x - window->x ()) / scale - window->x (), (y - window->y ()) / scale - window->y (), 0.0f); gWindow->glDrawTexture (icon, wTransform, wAttrib, mask); } } } } else status = gWindow->glPaint (attrib, transform, region, mask); return status; } static inline float ringLinearInterpolation (float valX, float minX, float maxX, float minY, float maxY) { double factor = (maxY - minY) / (maxX - minX); return (minY + (factor * (valX - minX))); } bool RingWindow::compareWindows (CompWindow *w1, CompWindow *w2) { if (w1->mapNum () && !w2->mapNum ()) return true; if (w2->mapNum () && !w1->mapNum ()) return false; return (w2->activeNum () < w1->activeNum ()); } bool RingWindow::compareRingWindowDepth (RingScreen::RingDrawSlot e1, RingScreen::RingDrawSlot e2) { RingScreen::RingSlot *a1 = (*(e1.slot)); RingScreen::RingSlot *a2 = (*(e2.slot)); if (a1->y < a2->y) return true; else /* if (a1->y >= a2->y) */ return false; } bool RingScreen::layoutThumbs () { float angle; int index = 0; float xScale, yScale; if ((mState == RingStateNone) || (mState == RingStateIn)) return false; float baseAngle = (2 * PI * mRotTarget) / 3600; CompRect oe = screen->getCurrentOutputExtents (); /* the center of the ellipse is in the middle of the used output device */ int centerX = oe.centerX (); int centerY = oe.centerY (); int ellipseA = oe.width () * optionGetRingWidth () / 200; int ellipseB = oe.height () * optionGetRingHeight () / 200; mDrawSlots.resize (mWindows.size ()); foreach (CompWindow *w, mWindows) { RING_WINDOW (w); if (!rw->mSlot) rw->mSlot = new RingSlot (); if (!rw->mSlot) return false; /* we subtract the angle from the base angle to order the windows clockwise */ angle = baseAngle - (index * (2 * PI / mWindows.size ())); rw->mSlot->x = centerX + (optionGetRingClockwise () ? -1 : 1) * ((float) ellipseA * sin (angle)); rw->mSlot->y = centerY + ((float) ellipseB * cos (angle)); int ww = w->width () + w->input ().left + w->input ().right; int wh = w->height () + w->input ().top + w->input ().bottom; if (ww > optionGetThumbWidth ()) xScale = (float)(optionGetThumbWidth ()) / (float) ww; else xScale = 1.0f; if (wh > optionGetThumbHeight ()) yScale = (float)(optionGetThumbHeight ()) / (float) wh; else yScale = 1.0f; rw->mSlot->scale = MIN (xScale, yScale); /* scale and brightness are obtained by doing a linear inter- polation - the y positions are the x values for the interpolation (the larger Y is, the nearer is the window), and scale/brightness are the y values for the interpolation */ rw->mSlot->depthScale = ringLinearInterpolation (rw->mSlot->y, centerY - ellipseB, centerY + ellipseB, optionGetMinScale (), 1.0f); rw->mSlot->depthBrightness = ringLinearInterpolation (rw->mSlot->y, centerY - ellipseB, centerY + ellipseB, optionGetMinBrightness (), 1.0f); mDrawSlots.at (index).w = w; mDrawSlots.at (index).slot = &rw->mSlot; ++index; } /* sort the draw list so that the windows with the lowest Y value (the windows being farest away) are drawn first */ sort (mDrawSlots.begin (), mDrawSlots.end (), RingWindow::compareRingWindowDepth); // TODO return true; } void RingScreen::addWindowToList (CompWindow *w) { mWindows.push_back (w); } bool RingScreen::updateWindowList () { sort (mWindows.begin (), mWindows.end (), RingWindow::compareWindows); mRotTarget = 0; foreach (CompWindow *w, mWindows) { if (w == mSelectedWindow) break; mRotTarget += DIST_ROT; } return layoutThumbs (); } bool RingScreen::createWindowList () { mWindows.clear (); foreach (CompWindow *w, screen->windows ()) { RING_WINDOW (w); if (rw->is ()) { addWindowToList (w); rw->mAdjust = true; } } return updateWindowList (); } void RingScreen::switchToWindow (bool toNext) { CompWindow *w; // We need w to be in this scope unsigned int cur = 0; if (!mGrabIndex) return; foreach (w, mWindows) { if (w == mSelectedWindow) break; ++cur; } if (cur == mWindows.size ()) return; if (toNext) w = mWindows.at ((cur + 1) % mWindows.size ()); else w = mWindows.at ((cur + mWindows.size () - 1) % mWindows.size ()); if (w) { CompWindow *old = mSelectedWindow; mSelectedWindow = w; if (old != w) { if (toNext) mRotAdjust += DIST_ROT; else mRotAdjust -= DIST_ROT; mRotateAdjust = true; cScreen->damageScreen (); renderWindowTitle (); } } } int RingScreen::countWindows () { int count = 0; foreach (CompWindow *w, screen->windows ()) { RING_WINDOW (w); if (rw->is ()) ++count; } return count; } int RingScreen::adjustRingRotation (float chunk) { float dx = mRotAdjust; float adjust = dx * 0.15f; float amount = fabs (dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; mRVelocity = (amount * mRVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (mRVelocity) < 0.2f) { mRVelocity = 0.0f; mRotTarget += mRotAdjust; mRotAdjust = 0; return 0; } int change = mRVelocity * chunk; if (!change) { if (mRVelocity) change = (mRotAdjust > 0) ? 1 : -1; } mRotAdjust -= change; mRotTarget += change; if (!layoutThumbs ()) return false; return true; } int RingWindow::adjustVelocity () { float x1, y1, scale; if (mSlot) { scale = mSlot->scale * mSlot->depthScale; x1 = mSlot->x - (window->width () * scale) / 2; y1 = mSlot->y - (window->height () * scale) / 2; } else { scale = 1.0f; x1 = window->x (); y1 = window->y (); } float dx = x1 - (window->x () + mTx); float adjust = dx * 0.15f; float amount = fabs (dx) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; mXVelocity = (amount * mXVelocity + adjust) / (amount + 1.0f); float dy = y1 - (window->y () + mTy); adjust = dy * 0.15f; amount = fabs (dy) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; mYVelocity = (amount * mYVelocity + adjust) / (amount + 1.0f); float ds = scale - mScale; adjust = ds * 0.1f; amount = fabs (ds) * 7.0f; if (amount < 0.01f) amount = 0.01f; else if (amount > 0.15f) amount = 0.15f; mScaleVelocity = (amount * mScaleVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (mXVelocity) < 0.2f && fabs (dy) < 0.1f && fabs (mYVelocity) < 0.2f && fabs (ds) < 0.001f && fabs (mScaleVelocity) < 0.002f) { mXVelocity = mYVelocity = mScaleVelocity = 0.0f; mTx = x1 - window->x (); mTy = y1 - window->y (); mScale = scale; return 0; } return 1; } bool RingScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (mState != RingStateNone) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; //mask |= PAINT_SCREEN_NO_OCCLUSION_DETECTION_MASK; bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (mState != RingStateNone) { GLMatrix sTransform = transform; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); /* TODO: This code here should be reworked */ if (mState == RingScreen::RingStateSwitching || mState == RingScreen::RingStateOut) for (std::vector ::iterator it = mDrawSlots.begin (); it != mDrawSlots.end (); ++it) { CompWindow *w = (*it).w; RING_WINDOW (w); status |= rw->gWindow->glPaint (rw->gWindow->paintAttrib (), sTransform, infiniteRegion, 0); } if (mState != RingStateIn) drawWindowTitle (sTransform); } return status; } void RingScreen::preparePaint (int msSinceLastPaint) { if (mState != RingStateNone && (mMoreAdjust || mRotateAdjust)) { float amount = msSinceLastPaint * 0.05f * optionGetSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; while (steps--) { mRotateAdjust = adjustRingRotation (chunk); mMoreAdjust = false; foreach (CompWindow *w, screen->windows ()) { RING_WINDOW (w); if (rw->mAdjust) { rw->mAdjust = rw->adjustVelocity (); mMoreAdjust |= rw->mAdjust; rw->mTx += rw->mXVelocity * chunk; rw->mTy += rw->mYVelocity * chunk; rw->mScale += rw->mScaleVelocity * chunk; } else if (rw->mSlot) { rw->mScale = rw->mSlot->scale * rw->mSlot->depthScale; rw->mTx = rw->mSlot->x - w->x () - (w->width () * rw->mScale) / 2; rw->mTy = rw->mSlot->y - w->y () - (w->height () * rw->mScale) / 2; } } if (!mMoreAdjust && !mRotateAdjust) { switchActivateEvent (false); break; } } } cScreen->preparePaint (msSinceLastPaint); } void RingScreen::donePaint () { if (mState != RingStateNone) { if (mMoreAdjust) cScreen->damageScreen (); else { if (mRotateAdjust) cScreen->damageScreen (); if (mState == RingStateIn) { toggleFunctions (false); mState = RingStateNone; } else if (mState == RingStateOut) mState = RingStateSwitching; } } cScreen->donePaint (); } bool RingScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mGrabIndex) { screen->removeGrab (mGrabIndex, 0); mGrabIndex = 0; } if (mState != RingStateNone) { foreach (CompWindow *w, screen->windows ()) { RING_WINDOW (w); if (rw->mSlot) { delete rw->mSlot; rw->mSlot = NULL; rw->mAdjust = true; } } mMoreAdjust = true; mState = RingStateIn; cScreen->damageScreen (); if (!(state & CompAction::StateCancel) && mSelectedWindow && !mSelectedWindow->destroyed ()) screen->sendWindowActivationRequest (mSelectedWindow->id ()); } if (action) action->setState ( ~(CompAction::StateTermKey | CompAction::StateTermButton | CompAction::StateTermEdge)); return false; } bool RingScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (screen->otherGrabExist ("ring", NULL)) return false; mCurrentMatch = optionGetWindowMatch (); mMatch = CompOption::getMatchOptionNamed (options, "match", CompMatch ()); if (!mMatch.isEmpty ()) mCurrentMatch = mMatch; int count = countWindows (); if (count < 1) return false; if (!mGrabIndex) { if (optionGetSelectWithMouse ()) mGrabIndex = screen->pushGrab (screen->normalCursor (), "ring"); else mGrabIndex = screen->pushGrab (screen->invisibleCursor (), "ring"); } if (mGrabIndex) { mState = RingScreen::RingStateOut; if (!createWindowList ()) return false; mSelectedWindow = mWindows.front (); renderWindowTitle (); mRotTarget = 0; mMoreAdjust = true; toggleFunctions (true); cScreen->damageScreen (); switchActivateEvent (true); } return true; } bool RingScreen::doSwitch (CompAction *action, CompAction::State state, CompOption::Vector options, bool nextWindow, RingType type) { bool ret = true; if ((mState == RingStateNone) || (mState == RingStateIn)) { if (type == RingTypeGroup) { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) { mType = RingTypeGroup; mClientLeader = (w->clientLeader ()) ? w->clientLeader () : w->id (); ret = initiate (action, state, options); } } else { mType = type; ret = initiate (action, mState, options); } if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); if (state & CompAction::StateInitEdge) action->setState (action->state () | CompAction::StateTermEdge); else if (mState & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); } if (ret) switchToWindow (nextWindow); return ret; } void RingScreen::windowSelectAt (int x, int y, bool shouldTerminate) { CompWindow *selected = NULL; if (!optionGetSelectWithMouse ()) return; /* first find the top-most window the mouse pointer is over */ foreach (CompWindow *w, mWindows) { RING_WINDOW (w); if (rw->mSlot) { if ((x >= (rw->mTx + w->x ())) && (x <= (rw->mTx + w->x () + (w->width () * rw->mScale))) && (y >= (rw->mTy + w->y ())) && (y <= (rw->mTy + w->y () + (w->height () * rw->mScale)))) { /* we have found one, select it */ selected = w; break; } } } if (selected && shouldTerminate) { CompOption o ("root", CompOption::TypeInt); CompOption::Vector opts; o.value ().set ((int) screen->root ()); opts.push_back (o); mSelectedWindow = selected; terminate (NULL, 0, opts); } else if (!shouldTerminate && (selected != mSelectedWindow )) { if (!selected) freeWindowTitle (); else { mSelectedWindow = selected; renderWindowTitle (); } cScreen->damageScreen (); } } void RingScreen::windowRemove (CompWindow *w) { if (w) { if (mState == RingStateNone) return; RING_WINDOW (w); if (!rw->is (true)) return; bool inList = false; CompWindow *selected; selected = mSelectedWindow; CompWindowVector::iterator it = mWindows.begin (); while (it != mWindows.end ()) { if (*it == w) { inList = true; if (w == selected) { ++it; if (it != mWindows.end ()) selected = *it; else selected = mWindows.front (); --it; mSelectedWindow = selected; renderWindowTitle (); } mWindows.erase (it); break; } ++it; } if (!inList) return; /* Terminate if the window closed was the last window in the list */ if (mWindows.empty ()) { CompOption o ("root", CompOption::TypeInt); CompOption::Vector opts; o.value ().set ((int) screen->root ()); opts.push_back (o); terminate (NULL, 0, opts); return; } // Let the window list be updated to avoid crash // when a window is closed while ending (RingStateIn). if (!mGrabIndex && mState != RingStateIn) return; if (updateWindowList ()) { mMoreAdjust = true; mState = RingStateOut; cScreen->damageScreen (); } } } void RingScreen::handleEvent (XEvent *event) { CompWindow *w = NULL; switch (event->type) { case DestroyNotify: /* We need to get the CompWindow * for event->xdestroywindow.window here because in the ::screen->handleEvent call below, that CompWindow's id will become 1, so findWindow won't be able to find the CompWindow after that. */ w = ::screen->findWindow (event->xdestroywindow.window); break; default: break; } screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == XA_WM_NAME) { w = screen->findWindow (event->xproperty.window); if (w && mGrabIndex && (w == mSelectedWindow)) { renderWindowTitle (); cScreen->damageScreen (); } } break; case ButtonPress: if (event->xbutton.button == Button1 && mGrabIndex) windowSelectAt (event->xbutton.x_root, event->xbutton.y_root, true); break; case MotionNotify: if (mGrabIndex) windowSelectAt (event->xmotion.x_root, event->xmotion.y_root, false); break; case UnmapNotify: w = ::screen->findWindow (event->xunmap.window); windowRemove (w); break; case DestroyNotify: windowRemove (w); break; default: break; } } bool RingWindow::damageRect (bool initial, const CompRect &rect) { bool status = false; RING_SCREEN (screen); if (initial) { if (rs->mGrabIndex && is ()) { rs->addWindowToList (window); if (rs->updateWindowList ()) { mAdjust = true; rs->mMoreAdjust = true; rs->mState = RingScreen::RingStateOut; rs->cScreen->damageScreen (); } } } else if (rs->mState == RingScreen::RingStateSwitching && mSlot) { cWindow->damageTransformedRect (mScale, mScale, mTx, mTy, rect); status = true; } status |= cWindow->damageRect (initial, rect); return status; } RingScreen::RingScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mGrabIndex (0), mState (RingScreen::RingStateNone), mMoreAdjust (false), mRotateAdjust (false), mRotAdjust (0), mRVelocity (0.0f), mSelectedWindow (NULL) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); #define RINGTERMBIND(opt, func) \ optionSet##opt##Terminate (boost::bind (&RingScreen::func, \ this, _1, _2, _3)); #define RINGSWITCHBIND(opt, func, next, type) \ optionSet##opt##Initiate (boost::bind (&RingScreen::func, \ this, _1, _2, _3, \ next, type)); RINGSWITCHBIND (NextKey, doSwitch, true, RingTypeNormal); RINGSWITCHBIND (PrevKey, doSwitch, false, RingTypeNormal); RINGSWITCHBIND (NextAllKey, doSwitch, true, RingTypeAll); RINGSWITCHBIND (PrevAllKey, doSwitch, false, RingTypeAll); RINGSWITCHBIND (NextGroupKey, doSwitch, true, RingTypeGroup); RINGSWITCHBIND (PrevGroupKey, doSwitch, false, RingTypeGroup); RINGTERMBIND (NextKey, terminate); RINGTERMBIND (PrevKey, terminate); RINGTERMBIND (NextAllKey, terminate); RINGTERMBIND (PrevAllKey, terminate); RINGTERMBIND (NextGroupKey, terminate); RINGTERMBIND (PrevGroupKey, terminate); RINGSWITCHBIND (NextButton, doSwitch, true, RingTypeNormal); RINGSWITCHBIND (PrevButton, doSwitch, false, RingTypeNormal); RINGSWITCHBIND (NextAllButton, doSwitch, true, RingTypeAll); RINGSWITCHBIND (PrevAllButton, doSwitch, false, RingTypeAll); RINGSWITCHBIND (NextGroupButton, doSwitch, true, RingTypeGroup); RINGSWITCHBIND (PrevGroupButton, doSwitch, false, RingTypeGroup); RINGTERMBIND (NextButton, terminate); RINGTERMBIND (PrevButton, terminate); RINGTERMBIND (NextAllButton, terminate); RINGTERMBIND (PrevAllButton, terminate); RINGTERMBIND (NextGroupButton, terminate); RINGTERMBIND (PrevGroupButton, terminate); } RingScreen::~RingScreen () { mWindows.clear (); mDrawSlots.clear (); } RingWindow::RingWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), mSlot (NULL), mXVelocity (0.0f), mYVelocity (0.0f), mScaleVelocity (0.0f), mTx (0.0f), mTy (0.0f), mScale (1.0f), mAdjust (false) { CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); } RingWindow::~RingWindow () { if (mSlot) delete mSlot; } bool RingPluginVTable::init () { if (CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) textAvailable = true; else { compLogMessage ("ring", CompLogLevelWarn, "No compatible text plugin"\ " loaded"); textAvailable = false; } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/ring/src/ring.h0000644000015301777760000001157612321343002022023 0ustar pbusernogroup00000000000000/* * * Compiz ring switcher plugin * * ring.h * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include #include "ring_options.h" extern bool textAvailable; class RingScreen : public PluginClassHandler , public RingOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: RingScreen (CompScreen *screen); ~RingScreen (); public: typedef enum { RingStateNone = 0, RingStateOut = 1, RingStateSwitching = 2, RingStateIn = 3 } RingState; typedef enum { RingTypeNormal = 0, RingTypeGroup = 1, RingTypeAll = 2 } RingType; class RingSlot { public: int x, y; /* thumb center coordinates */ float scale; /* size scale (fit to max thumb size) */ float depthScale; /* scale for depth impression */ float depthBrightness; /* brightness for depth impression */ }; class RingDrawSlot { public: CompWindow *w; RingSlot **slot; }; public: CompositeScreen *cScreen; GLScreen *gScreen; CompText mText; CompScreen::GrabHandle mGrabIndex; RingState mState; RingType mType; bool mMoreAdjust; bool mRotateAdjust; int mRotTarget; int mRotAdjust; GLfloat mRVelocity; /* only used for sorting */ std::vector mWindows; std::vector mDrawSlots; int mWindowsSize; int mNWindows; Window mClientLeader; CompWindow *mSelectedWindow; CompMatch mMatch; CompMatch mCurrentMatch; public: /* Functions that we hook */ void handleEvent (XEvent *); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); public: /* Internal Functions */ void freeWindowTitle (); void renderWindowTitle (); void drawWindowTitle (const GLMatrix &transform); bool layoutThumbs (); void addWindowToList (CompWindow *w); bool updateWindowList (); bool createWindowList (); void switchToWindow (bool toNext); int countWindows (); int adjustRingRotation (float chunk); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); bool doSwitch (CompAction *action, CompAction::State state, CompOption::Vector options, bool nextWindow, RingType f_type); void windowSelectAt (int x, int y, bool f_terminate); void windowRemove (CompWindow *w); void switchActivateEvent (bool); }; class RingWindow : public PluginClassHandler , public GLWindowInterface, public CompositeWindowInterface { public: RingWindow (CompWindow *); ~RingWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; RingScreen::RingSlot *mSlot; GLfloat mXVelocity; GLfloat mYVelocity; GLfloat mScaleVelocity; GLfloat mTx; GLfloat mTy; GLfloat mScale; bool mAdjust; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool damageRect (bool, const CompRect &); bool is (bool removing = false); static bool compareWindows (CompWindow *w1, CompWindow *w2); static bool compareRingWindowDepth (RingScreen::RingDrawSlot e1, RingScreen::RingDrawSlot e2); int adjustVelocity (); }; extern const double PI; #define DIST_ROT (3600 / mWindows.size ()) #define DIST_ROT_w (3600 / rs->mWindows.size ()) extern const unsigned short ICON_SIZE; #define RING_SCREEN(s) \ RingScreen *rs = RingScreen::get (s) #define RING_WINDOW(w) \ RingWindow *rw = RingWindow::get (w) class RingPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/neg/0000755000015301777760000000000012321344021017726 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/neg/CMakeLists.txt0000644000015301777760000000015012321343002022460 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (neg PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/neg/src/0000755000015301777760000000000012321344021020515 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/neg/src/neg.h0000644000015301777760000000434312321343002021441 0ustar pbusernogroup00000000000000/* * Copyright (c) 2006 Darryll Truchan * * Pixel shader negating by Dennis Kasprzyk * Usage of matches by Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "neg_options.h" class NegScreen : public PluginClassHandler , public NegOptions { public: NegScreen (CompScreen *); int negFunction; int negAlphaFunction; bool isNeg; bool checkStateTimeout (); void optionChanged (CompOption *opt, NegOptions::Options num); bool toggle (CompAction *action, CompAction::State state, CompOption::Vector opt, bool all); GLScreen *gScreen; }; class NegWindow : public PluginClassHandler , public GLWindowInterface { public: NegWindow (CompWindow *); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool isNeg; void glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask); void toggle (); }; #define NEG_SCREEN(s) \ NegScreen *ns = NegScreen::get (s); #define NEG_WINDOW(w) \ NegWindow *nw = NegWindow::get (w); class NegPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/neg/src/neg.cpp0000644000015301777760000003372512321343002022002 0ustar pbusernogroup00000000000000/* * Copyright (c) 2006 Darryll Truchan * * Pixel shader negating by Dennis Kasprzyk * Usage of matches by Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "neg.h" static std::string fragment_function = " \n\ void neg_fragment () { \n\ vec3 color = vec3(1.0, 1.0, 1.0) - gl_FragColor.rgb; \n\ gl_FragColor = vec4(color, gl_FragColor.a); \n\ } \n\ "; COMPIZ_PLUGIN_20090315 (neg, NegPluginVTable); void NegWindow::toggle () { NEG_SCREEN (screen); /* toggle window negative flag */ isNeg = !isNeg; /* check exclude list */ if (ns->optionGetExcludeMatch ().evaluate (window)) isNeg = false; /* cause repainting */ cWindow->addDamage (); if (isNeg) gWindow->glDrawTextureSetEnabled (this, true); else gWindow->glDrawTextureSetEnabled (this, false); } bool NegScreen::toggle (CompAction *action, CompAction::State state, CompOption::Vector options, bool all) { if (all) { foreach (CompWindow *w, screen->windows ()) NegWindow::get (w)->toggle (); /* toggle screen negative flag */ isNeg = !isNeg; } else { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findWindow (xid); if (w) NegWindow::get (w)->toggle (); } return true; } void NegWindow::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { bool doNeg = false; GLTexture *tex = NULL; NEG_SCREEN (screen); if (isNeg) { if (ns->optionGetNegDecorations ()) { doNeg = true; tex = texture; } else { doNeg = false; for (unsigned int i = 0; i < gWindow->textures ().size (); i++) { tex = gWindow->textures ()[i]; doNeg = (texture->name () == tex->name ()); if (doNeg) break; } } } if (doNeg && tex) { /* shader program negation */ if (true) { gWindow->addShaders ("neg", "", fragment_function); gWindow->glDrawTexture (texture, transform, attrib, mask); } else /* Texture manipulation negation */ { #ifndef USE_GLES GLTexture::Filter filter; /* this is for the most part taken from paint.c */ if (mask & PAINT_WINDOW_TRANSFORMED_MASK) filter = ns->gScreen->filter (WINDOW_TRANS_FILTER); else if (mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK) filter = ns->gScreen->filter (SCREEN_TRANS_FILTER); else filter = ns->gScreen->filter (NOTHING_TRANS_FILTER); /* if we can adjust saturation, even if it's just on and off */ if (GL::canDoSaturated && attrib.saturation != COLOR) { GLfloat constant[4]; /* enable the texture */ texture->enable (filter); /* texture combiner */ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_PRIMARY_COLOR); /* negate */ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glColor4f (1.0f, 1.0f, 1.0f, 0.5f); /* make another texture active */ GL::activeTexture (GL_TEXTURE1_ARB); /* enable that texture */ texture->enable (filter); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); /* if we can do saturation that is in between min and max */ if (GL::canDoSlightlySaturated && attrib.saturation > 0) { glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); constant[0] = 0.5f + 0.5f * RED_SATURATION_WEIGHT; constant[1] = 0.5f + 0.5f * GREEN_SATURATION_WEIGHT; constant[2] = 0.5f + 0.5f * BLUE_SATURATION_WEIGHT; constant[3] = 1.0; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); /* make another texture active */ GL::activeTexture (GL_TEXTURE2_ARB); /* enable that texture */ texture->enable (filter); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT); /* negate */ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); /* color constant */ constant[3] = attrib.saturation / 65535.0f; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); /* if we are not opaque or not fully bright */ if (attrib.opacity < OPAQUE || attrib.brightness != BRIGHT) { /* make another texture active */ GL::activeTexture (GL_TEXTURE3_ARB); /* enable that texture */ texture->enable (filter); /* color constant */ constant[3] = attrib.opacity / 65535.0f; constant[0] = constant[1] = constant[2] = constant[3] * attrib.brightness / 65535.0f; glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT); glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); gWindow->glDrawTexture (texture, transform, attrib, mask); /* disable the current texture */ texture->disable (); /* set texture mode back to replace */ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); /* re-activate last texture */ GL::activeTexture (GL_TEXTURE2_ARB); } else { /* fully opaque and bright */ gWindow->glDrawTexture (texture, transform, attrib, mask); } /* disable the current texture */ texture->disable (); /* set the texture mode back to replace */ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); /* re-activate last texture */ GL::activeTexture (GL_TEXTURE1_ARB); } else { /* fully saturated or fully unsaturated */ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); /* color constant */ constant[3] = attrib.opacity / 65535.0f; constant[0] = constant[1] = constant[2] = constant[3] * attrib.brightness / 65535.0f; constant[0] = 0.5f + 0.5f * RED_SATURATION_WEIGHT * constant[0]; constant[1] = 0.5f + 0.5f * GREEN_SATURATION_WEIGHT * constant[1]; constant[2] = 0.5f + 0.5f * BLUE_SATURATION_WEIGHT * constant[2]; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); gWindow->glDrawTexture (texture, transform, attrib, mask); } /* disable the current texture */ texture->disable (); /* set the texture mode back to replace */ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); /* re-activate last texture */ GL::activeTexture (GL_TEXTURE0_ARB); /* disable that texture */ texture->disable (); /* set the default color */ glColor4usv (defaultColor); /* set screens texture mode back to replace */ ns->gScreen->setTexEnvMode (GL_REPLACE); } else { /* no saturation adjustments */ /* enable the current texture */ texture->enable (filter); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); /* negate */ glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); /* we are not opaque or fully bright */ if ((mask & PAINT_WINDOW_TRANSLUCENT_MASK) || attrib.brightness != BRIGHT) { GLfloat constant[4]; /* color constant */ constant[3] = attrib.opacity / 65535.0f; constant[0] = constant[1] = constant[2] = constant[3] * attrib.brightness / 65535.0f; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT); /* negate */ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); gWindow->glDrawTexture (texture, transform, attrib, mask); } else { /* no adjustments to saturation, brightness or opacity */ gWindow->glDrawTexture (texture, transform, attrib, mask); } /* disable the current texture */ texture->disable (); /* set the screens texture mode back to replace */ ns->gScreen->setTexEnvMode (GL_REPLACE); } #endif } } else { /* not negative */ gWindow->glDrawTexture (texture, transform, attrib, mask); } } void NegScreen::optionChanged (CompOption *opt, NegOptions::Options num) { switch (num) { case NegOptions::NegMatch: case NegOptions::ExcludeMatch: { foreach (CompWindow *w, screen->windows ()) { bool isNowNeg; NEG_WINDOW (w); isNowNeg = optionGetNegMatch ().evaluate (w); isNowNeg = isNowNeg && !optionGetExcludeMatch ().evaluate (w); if (isNowNeg && isNeg && !nw->isNeg) nw->toggle (); else if (!isNowNeg && nw->isNeg) nw->toggle (); } } break; case NegOptions::NegDecorations: { foreach (CompWindow *w, screen->windows ()) if (NegWindow::get (w)->isNeg) NegWindow::get (w)->cWindow->addDamage (); } default: break; } } NegScreen::NegScreen (CompScreen *screen) : PluginClassHandler (screen), NegOptions (), negFunction (0), negAlphaFunction (0), isNeg (false), gScreen (GLScreen::get (screen)) { optionSetWindowToggleKeyInitiate (boost::bind (&NegScreen::toggle, this, _1, _2, _3, false)); optionSetScreenToggleKeyInitiate (boost::bind (&NegScreen::toggle, this, _1, _2, _3, true)); optionSetNegMatchNotify (boost::bind (&NegScreen::optionChanged, this, _1, _2)); optionSetExcludeMatchNotify (boost::bind (&NegScreen::optionChanged, this, _1, _2)); optionSetNegDecorationsNotify (boost::bind (&NegScreen::optionChanged, this, _1, _2)); } NegWindow::NegWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), isNeg (0) { GLWindowInterface::setHandler (gWindow, false); NEG_SCREEN (screen); /* Taken from ObjectAdd, since there is no equavilent * we check for screenNeg == true in ctor */ if (ns->isNeg && ns->optionGetNegMatch ().evaluate (window)) toggle (); } bool NegPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/neg/neg.xml.in0000644000015301777760000000260712321343002021631 0ustar pbusernogroup00000000000000 <_short>Negative <_long>Used to set a window or screen negative Accessibility opengl\ composite opengl blur decor compiz-0.9.11+14.04.20140409/plugins/workspacenames/0000755000015301777760000000000012321344021022177 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/workspacenames/workspacenames.xml.in0000644000015301777760000000741212321343002026352 0ustar pbusernogroup00000000000000 <_short>Workspace Naming <_long>Assign names to viewports and display them upon viewport switches Window Management opengl composite text opengl text <_short>Names <_short>Workspace Names <_short>Appearance <_short>Text Display <_short>Colors compiz-0.9.11+14.04.20140409/plugins/workspacenames/CMakeLists.txt0000644000015301777760000000017012321343002024733 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (workspacenames PLUGINDEPS composite opengl text) compiz-0.9.11+14.04.20140409/plugins/workspacenames/src/0000755000015301777760000000000012321344021022766 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/workspacenames/src/workspacenames.cpp0000644000015301777760000001523612321343002026521 0ustar pbusernogroup00000000000000/* * * Compiz workspace name display plugin * * workspacenames.cpp * * Copyright : (C) 2008 by Danny Baumann * E-mail : maniac@compiz-fusion.org * * Ported to Compiz 0.9.x * Copyright : (c) 2010 Scott Moreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "workspacenames.h" CompString WSNamesScreen::getCurrentWSName () { CompString ret; CompOption::Value::Vector vpNumbers = optionGetViewports (); CompOption::Value::Vector names = optionGetNames (); int currentVp = screen->vp ().y () * screen->vpSize ().width () + screen->vp ().x () + 1; int listSize = MIN (vpNumbers.size (), names.size ()); for (int i = 0; i < listSize; ++i) { if (vpNumbers[i].i () == currentVp) return names[i].s (); } return ret; } void WSNamesScreen::renderNameText () { CompText::Attrib attrib; textData.clear (); CompString name = getCurrentWSName (); if (name.empty ()) return; /* 75% of the output device as maximum width */ attrib.maxWidth = screen->getCurrentOutputExtents ().width () * 3 / 4; attrib.maxHeight = 100; attrib.family = "Sans"; attrib.size = optionGetTextFontSize (); attrib.color[0] = optionGetFontColorRed (); attrib.color[1] = optionGetFontColorGreen (); attrib.color[2] = optionGetFontColorBlue (); attrib.color[3] = optionGetFontColorAlpha (); attrib.flags = CompText::WithBackground | CompText::Ellipsized; if (optionGetBoldText ()) attrib.flags |= CompText::StyleBold; attrib.bgHMargin = 15; attrib.bgVMargin = 15; attrib.bgColor[0] = optionGetBackColorRed (); attrib.bgColor[1] = optionGetBackColorGreen (); attrib.bgColor[2] = optionGetBackColorBlue (); attrib.bgColor[3] = optionGetBackColorAlpha (); textData.renderText (name, attrib); } CompPoint WSNamesScreen::getTextPlacementPosition () { CompRect oe = screen->getCurrentOutputExtents (); float x = oe.centerX () - textData.getWidth () / 2; float y = 0; unsigned short verticalOffset = optionGetVerticalOffset (); switch (optionGetTextPlacement ()) { case WorkspacenamesOptions::TextPlacementCenteredOnScreen: y = oe.centerY () + textData.getHeight () / 2; break; case WorkspacenamesOptions::TextPlacementTopOfScreenMinusOffset: case WorkspacenamesOptions::TextPlacementBottomOfScreenPlusOffset: { CompRect workArea = screen->currentOutputDev ().workArea (); if (optionGetTextPlacement () == WorkspacenamesOptions::TextPlacementTopOfScreenMinusOffset) y = oe.y1 () + workArea.y () + verticalOffset + textData.getHeight (); else /* TextPlacementBottomOfScreenPlusOffset */ y = oe.y1 () + workArea.y () + workArea.height () - verticalOffset; } break; default: return CompPoint (floor (x), oe.centerY () - textData.getHeight () / 2); break; } return CompPoint (floor (x), floor (y)); } void WSNamesScreen::damageTextArea () { const CompPoint pos (getTextPlacementPosition ()); /* The placement position is from the lower corner, so we * need to move it back up by height */ CompRect area (pos.x (), pos.y () - textData.getHeight (), textData.getWidth (), textData.getHeight ()); cScreen->damageRegion (area); } void WSNamesScreen::drawText (const GLMatrix &matrix) { GLfloat alpha = 0.0f; /* assign y (for the lower corner!) according to the setting */ const CompPoint p = getTextPlacementPosition (); if (timer) alpha = timer / (optionGetFadeTime () * 1000.0f); else if (timeoutHandle.active ()) alpha = 1.0f; textData.draw (matrix, p.x (), p.y (), alpha); } bool WSNamesScreen::shouldDrawText () { return textData.getWidth () && textData.getHeight (); } bool WSNamesScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (shouldDrawText ()) { GLMatrix sTransform (transform); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); drawText (sTransform); } return status; } void WSNamesScreen::preparePaint (int msSinceLastPaint) { if (timer) { timer -= msSinceLastPaint; timer = MAX (timer, 0); } cScreen->preparePaint (msSinceLastPaint); } void WSNamesScreen::donePaint () { /* Only damage when the */ if (shouldDrawText ()) damageTextArea (); cScreen->donePaint (); /* Clear text data if done with fadeout */ if (!timer && !timeoutHandle.active ()) textData.clear (); } bool WSNamesScreen::hideTimeout () { timer = optionGetFadeTime () * 1000; /* Clear immediately if there is no fadeout */ if (!timer) textData.clear (); damageTextArea (); timeoutHandle.stop (); return false; } void WSNamesScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (event->type != PropertyNotify) return; if (event->xproperty.atom == Atoms::desktopViewport) { int timeout = optionGetDisplayTime () * 1000; timer = 0; if (timeoutHandle.active ()) timeoutHandle.stop (); renderNameText (); timeoutHandle.start (timeout, timeout + 200); damageTextArea (); } } WSNamesScreen::WSNamesScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), timer (0) { ScreenInterface::setHandler (screen, true); CompositeScreenInterface::setHandler (cScreen, true); GLScreenInterface::setHandler (gScreen, true); timeoutHandle.start (boost::bind (&WSNamesScreen::hideTimeout, this), 0, 0); } WSNamesScreen::~WSNamesScreen () { } bool WorkspacenamesPluginVTable::init () { if (!CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) compLogMessage ("workspacenames", CompLogLevelWarn, "No compatible text plugin loaded"); if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/workspacenames/src/workspacenames.h0000644000015301777760000000407112321343002026161 0ustar pbusernogroup00000000000000/* * * Compiz workspace name display plugin * * workspacenames.h * * Copyright : (C) 2008 by Danny Baumann * E-mail : maniac@compiz-fusion.org * * Ported to Compiz 0.9.x * Copyright : (c) 2010 Scott Moreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include #include #include "workspacenames_options.h" class WSNamesScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public WorkspacenamesOptions { public: WSNamesScreen (CompScreen *screen); ~WSNamesScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CompText textData; CompTimer timeoutHandle; int timer; CompString getCurrentWSName (); void renderNameText (); void drawText (const GLMatrix &); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void preparePaint (int ms); void donePaint (); bool hideTimeout (); void handleEvent (XEvent *); CompPoint getTextPlacementPosition (); void damageTextArea (); private: bool shouldDrawText (); }; class WorkspacenamesPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; COMPIZ_PLUGIN_20090315 (workspacenames, WorkspacenamesPluginVTable); compiz-0.9.11+14.04.20140409/plugins/wallpaper/0000755000015301777760000000000012321344021021144 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wallpaper/wallpaper.xml.in0000644000015301777760000000575012321343002024267 0ustar pbusernogroup00000000000000 <_short>Wallpaper <_long>Define individual desktop wallpapers for each viewport and cycle through them automatically Utility opengl composite opengl svg png imgjpeg decor <_short>Desktop Backgrounds <_short>Wallpaper Rotation compiz-0.9.11+14.04.20140409/plugins/wallpaper/CMakeLists.txt0000644000015301777760000000020012321343002023672 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (wallpaper PLUGINDEPS composite opengl LIBRARIES Xrender) compiz-0.9.11+14.04.20140409/plugins/wallpaper/src/0000755000015301777760000000000012321344021021733 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wallpaper/src/wallpaper.h0000644000015301777760000001015112321343002024067 0ustar pbusernogroup00000000000000/* * Compiz wallpaper plugin * * wallpaper.h * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@compiz-fusion.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. * */ #include #include #include #include #include #include #include "wallpaper_options.h" #include #include class WallpaperBackground { public: CompString image; int imagePos; int fillType; unsigned short color1[4]; unsigned short color2[4]; GLTexture::List imgTex; CompSize imgSize; GLTexture::List fillTex; GLTexture::MatrixList fillTexMatrix; }; typedef std::vector WallpaperBackgrounds; class WallpaperScreen : public PluginClassHandler, public WallpaperOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: WallpaperScreen (CompScreen *screen); ~WallpaperScreen (); CompositeScreen *cScreen; GLScreen *gScreen; bool propSet; Window fakeDesktop; CompWindow *desktop; int numBackgrounds; CompTimer rotateTimer; float fadeTimer; float fadeTimeout; float fadeDuration; float alpha; WallpaperBackgrounds backgroundsPrimary; WallpaperBackgrounds backgroundsSecondary; void createFakeDesktopWindow (); void destroyFakeDesktopWindow (); void updateProperty(); void blackenSecondary (); void updateBackgrounds (); void rotateBackgrounds (); void updateTimers (); bool rotateTimeout (); void wallpaperBackgroundsChanged (CompOption *opt, Options num); void wallpaperCycleOptionChanged (CompOption *opt, Options num); void wallpaperToggleCycle (CompOption *opt, Options num); WallpaperBackground *getBackgroundForViewport (WallpaperBackgrounds&); void handleEvent (XEvent *); void preparePaint (int msSinceLastPaint); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); /* _COMPIZ_WALLPAPER_SUPPORTED atom is used to indicate that * the wallpaper plugin or a plugin providing similar functionality is * active so that desktop managers can respond appropriately */ Atom compizWallpaperAtom; }; class WallpaperWindow : public PluginClassHandler , public CompositeWindowInterface, public GLWindowInterface { public: WallpaperWindow (CompWindow *); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; void drawBackgrounds (const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int , WallpaperBackgrounds &, bool ); bool glDraw (const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int ); bool damageRect (bool , const CompRect &); }; #define WALLPAPER_SCREEN(s) \ WallpaperScreen *ws = WallpaperScreen::get (s); #define WALLPAPER_WINDOW(w) \ WallpaperWindow *ww = WallpaperWindow::get (w); class WallpaperPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/wallpaper/src/wallpaper.cpp0000644000015301777760000004457312321343002024441 0ustar pbusernogroup00000000000000/* * Compiz wallpaper plugin * * wallpaper.cpp * * Copyright (c) 2008 Dennis Kasprzyk * * Rewrite of wallpaper.c * Copyright (c) 2007 Robert Carr * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "wallpaper.h" COMPIZ_PLUGIN_20090315 (wallpaper, WallpaperPluginVTable); static Visual * findArgbVisual (Display *dpy, int screen) { XVisualInfo temp; int nvi; temp.screen = screen; temp.depth = 32; temp.c_class = TrueColor; XVisualInfo *xvi = XGetVisualInfo (dpy, VisualScreenMask | VisualDepthMask | VisualClassMask, &temp, &nvi); if (!xvi) return 0; Visual *visual = 0; XRenderPictFormat *format; for (int i = 0; i < nvi; ++i) { format = XRenderFindVisualFormat (dpy, xvi[i].visual); if (format->type == PictTypeDirect && format->direct.alphaMask) { visual = xvi[i].visual; break; } } XFree (xvi); return visual; } void WallpaperScreen::createFakeDesktopWindow () { Display *dpy = screen->dpy (); XSizeHints xsh; XWMHints xwmh; XSetWindowAttributes attr; XserverRegion region; Visual *visual = findArgbVisual (dpy, screen->screenNum ()); if (!visual) return; xsh.flags = PSize | PPosition | PWinGravity; xsh.width = 1; xsh.height = 1; xsh.win_gravity = StaticGravity; xwmh.flags = InputHint; xwmh.input = 0; attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap (dpy, screen->root (), visual, AllocNone); fakeDesktop = XCreateWindow (dpy, screen->root (), -1, -1, 1, 1, 0, 32, InputOutput, visual, CWBackPixel | CWBorderPixel | CWColormap, &attr); XSetWMProperties (dpy, fakeDesktop, NULL, NULL, programArgv, programArgc, &xsh, &xwmh, NULL); XChangeProperty (dpy, fakeDesktop, Atoms::winStateSkipPager, XA_ATOM, 32, PropModeReplace, (unsigned char *) &Atoms::winStateSkipPager, 1); XChangeProperty (dpy, fakeDesktop, Atoms::winType, XA_ATOM, 32, PropModeReplace, (unsigned char *) &Atoms::winTypeDesktop, 1); region = XFixesCreateRegion (dpy, NULL, 0); XFixesSetWindowShapeRegion (dpy, fakeDesktop, ShapeInput, 0, 0, region); XFixesDestroyRegion (dpy, region); XMapWindow (dpy, fakeDesktop); XLowerWindow (dpy, fakeDesktop); } void WallpaperScreen::destroyFakeDesktopWindow () { if (fakeDesktop != None) XDestroyWindow (screen->dpy (), fakeDesktop); fakeDesktop = None; } void WallpaperScreen::updateProperty () { if (backgroundsPrimary.empty()) { if (propSet) XDeleteProperty (screen->dpy (), screen->root (), compizWallpaperAtom); propSet = false; } else if (!propSet) { unsigned char sd = 1; XChangeProperty (screen->dpy (), screen->root (), compizWallpaperAtom, XA_CARDINAL, 8, PropModeReplace, &sd, 1); propSet = true; } } static void initBackground (WallpaperBackground *back) { unsigned int c[2]; unsigned short *color; if (!back->image.empty ()) { CompString pname ("wallpaper"); back->imgTex = GLTexture::readImageToTexture (back->image, pname, back->imgSize); if (back->imgTex.empty ()) { compLogMessage ("wallpaper", CompLogLevelWarn, "Failed to load image: %s", back->image.c_str ()); back->imgSize.setWidth (0); back->imgSize.setHeight (0); } } color = back->color1; c[0] = ((color[3] << 16) & 0xff000000) | ((color[0] * color[3] >> 8) & 0xff0000) | ((color[1] * color[3] >> 16) & 0xff00) | ((color[2] * color[3] >> 24) & 0xff); color = back->color2; c[1] = ((color[3] << 16) & 0xff000000) | ((color[0] * color[3] >> 8) & 0xff0000) | ((color[1] * color[3] >> 16) & 0xff00) | ((color[2] * color[3] >> 24) & 0xff); if (back->fillType == WallpaperOptions::BgFillTypeVerticalGradient) { back->fillTex = GLTexture::imageBufferToTexture ((char *) &c, CompSize (1, 2)); back->fillTexMatrix.push_back (back->fillTex[0]->matrix()); back->fillTexMatrix[0].xx = 0.0; } else if (back->fillType == WallpaperOptions::BgFillTypeHorizontalGradient) { back->fillTex = GLTexture::imageBufferToTexture ((char *) &c, CompSize (2, 1)); back->fillTexMatrix.push_back (back->fillTex[0]->matrix()); back->fillTexMatrix[0].yy = 0.0; } else { back->fillTex = GLTexture::imageBufferToTexture ((char *) &c, CompSize (1, 1)); back->fillTexMatrix.push_back (back->fillTex[0]->matrix()); back->fillTexMatrix[0].xx = 0.0; back->fillTexMatrix[0].yy = 0.0; } } void WallpaperScreen::blackenSecondary () { unsigned short black [] = {1, 0, 0, 0}; backgroundsSecondary.clear (); for (int i = 0; i < numBackgrounds; ++i) { backgroundsSecondary.push_back (WallpaperBackground ()); backgroundsSecondary[i].image = ""; backgroundsSecondary[i].imagePos = 0; backgroundsSecondary[i].fillType = 0; memcpy (backgroundsSecondary[i].color1, black, 4 * sizeof(unsigned short)); memcpy (backgroundsSecondary[i].color2, black, 4 * sizeof(unsigned short)); initBackground (&backgroundsSecondary[i]); } } void WallpaperScreen::updateBackgrounds () { #define GET_OPTION(opt) CompOption::Value::Vector c##opt = optionGet##opt (); GET_OPTION (BgImage); GET_OPTION (BgImagePos); GET_OPTION (BgFillType); GET_OPTION (BgColor1); GET_OPTION (BgColor2); #undef GET_OPTION if (!((cBgImagePos.size () == cBgImage.size ()) && (cBgFillType.size () == cBgImage.size ()) && (cBgColor1.size () == cBgImage.size ()) && (cBgColor2.size () == cBgImage.size ()))) { compLogMessage ("wallpaper", CompLogLevelWarn, "Malformed option"); return; } numBackgrounds = cBgImage.size (); backgroundsPrimary.clear (); for (unsigned int i = 0; i < cBgImage.size (); ++i) { backgroundsPrimary.push_back (WallpaperBackground ()); backgroundsPrimary[i].image = cBgImage[i].s (); backgroundsPrimary[i].imagePos = cBgImagePos[i].i (); backgroundsPrimary[i].fillType = cBgFillType[i].i (); memcpy (backgroundsPrimary[i].color1, cBgColor1[i].c (), 4 * sizeof(unsigned short)); memcpy (backgroundsPrimary[i].color2, cBgColor2[i].c (), 4 * sizeof(unsigned short)); initBackground (&backgroundsPrimary[i]); } blackenSecondary (); fadeDuration = optionGetCycleTimeout (); fadeTimer = optionGetFadeDuration (); } void WallpaperScreen::rotateBackgrounds () { if (numBackgrounds) { WallpaperBackground item = backgroundsPrimary.front(); backgroundsSecondary = backgroundsPrimary; backgroundsPrimary.erase (backgroundsPrimary.begin ()); backgroundsPrimary.push_back (item); } fadeTimer = fadeDuration; } void WallpaperScreen::updateTimers () { fadeTimeout = (optionGetCycleTimeout () * 1000 * 60); fadeDuration = (optionGetFadeDuration () * 1000); fadeTimer = fadeDuration; if (optionGetCycleWallpapers ()) rotateTimer.start (fadeTimeout, fadeTimeout * 1.2); else rotateTimer.stop (); } bool WallpaperScreen::rotateTimeout () { rotateBackgrounds (); updateProperty (); cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); cScreen->damageScreen (); return true; } /* Installed as a handler for the images setting changing through bcop */ void WallpaperScreen::wallpaperBackgroundsChanged (CompOption *o, Options num) { updateBackgrounds (); updateProperty (); updateTimers (); cScreen->damageScreen (); } void WallpaperScreen::wallpaperCycleOptionChanged (CompOption *o, Options num) { blackenSecondary (); updateTimers (); } void WallpaperScreen::wallpaperToggleCycle (CompOption *o, Options num) { if (optionGetCycleWallpapers ()) rotateTimer.start (fadeTimeout, fadeTimeout * 1.2); else rotateTimer.stop (); } WallpaperBackground * WallpaperScreen::getBackgroundForViewport (WallpaperBackgrounds &bg) { CompPoint offset = cScreen->windowPaintOffset (); CompPoint vp = screen->vp (); CompSize vpSize = screen->vpSize (); CompRect workarea = screen->workArea (); if (bg.empty()) return NULL; int x = vp.x () - (offset.x () / (int) workarea.width ()); x %= vpSize.width (); if (x < 0) x += vpSize.width (); int y = vp.y () - (offset.y () / (int) workarea.height ()); y %= vpSize.height (); if (y < 0) y += vpSize.height (); return &bg[(x + (y * vpSize.width ())) % bg.size()]; } void WallpaperScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (!screen->desktopWindowCount () && fakeDesktop == None && !backgroundsPrimary.empty()) createFakeDesktopWindow (); if ((screen->desktopWindowCount () > 1 || backgroundsPrimary.empty()) && fakeDesktop != None) destroyFakeDesktopWindow (); } void WallpaperScreen::preparePaint (int msSinceLastPaint) { fadeTimer -= msSinceLastPaint; if (fadeTimer < 0) fadeTimer = 0; alpha = (fadeDuration - fadeTimer) / fadeDuration; cScreen->preparePaint (msSinceLastPaint); } void WallpaperScreen::donePaint () { if (fadeTimer > 0) cScreen->damageScreen (); else { cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); } cScreen->donePaint (); } bool WallpaperScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { desktop = NULL; return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } void WallpaperWindow::drawBackgrounds (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask, WallpaperBackgrounds &bg, bool fadingIn) { WALLPAPER_SCREEN (screen); CompRect tmpRect; GLTexture::Matrix matrix; GLTexture::MatrixList tmpMatrixList; WallpaperBackground *back = ws->getBackgroundForViewport (bg); GLWindowPaintAttrib tmpAttrib = attrib; tmpMatrixList.push_back (matrix); GLVertexBuffer *vb = gWindow->vertexBuffer (); vb->begin (); tmpMatrixList[0] = back->fillTexMatrix[0]; if (back->fillType == WallpaperOptions::BgFillTypeVerticalGradient) tmpMatrixList[0].yy /= (float) screen->height () / 2.0; else if (back->fillType == WallpaperOptions::BgFillTypeHorizontalGradient) tmpMatrixList[0].xx /= (float) screen->width () / 2.0; gWindow->glAddGeometry (tmpMatrixList, screen->region (), (mask & PAINT_WINDOW_TRANSFORMED_MASK) ? infiniteRegion : region); if (ws->optionGetCycleWallpapers ()) tmpAttrib.opacity *= fadingIn ? (1.0f - ws->alpha) : ws->alpha; if (tmpAttrib.opacity != OPAQUE) mask |= PAINT_WINDOW_BLEND_MASK; if (vb->end ()) gWindow->glDrawTexture(back->fillTex[0], transform, tmpAttrib, mask); if (back->imgSize.width () && back->imgSize.height ()) { CompRegion reg = screen->region (); float s1, s2; int x, y; vb->begin (); tmpMatrixList[0] = back->imgTex[0]->matrix (); if (back->imagePos == WallpaperOptions::BgImagePosScaleAndCrop) { s1 = (float) screen->width () / back->imgSize.width (); s2 = (float) screen->height () / back->imgSize.height (); s1 = MAX (s1, s2); tmpMatrixList[0].xx /= s1; tmpMatrixList[0].yy /= s1; x = (screen->width () - ((int)back->imgSize.width () * s1)) / 2.0; tmpMatrixList[0].x0 -= x * tmpMatrixList[0].xx; y = (screen->height () - ((int)back->imgSize.height () * s1)) / 2.0; tmpMatrixList[0].y0 -= y * tmpMatrixList[0].yy; } else if (back->imagePos == WallpaperOptions::BgImagePosScaled) { s1 = (float) screen->width () / back->imgSize.width (); s2 = (float) screen->height () / back->imgSize.height (); tmpMatrixList[0].xx /= s1; tmpMatrixList[0].yy /= s2; } else if (back->imagePos == WallpaperOptions::BgImagePosCentered) { x = (screen->width () - (int)back->imgSize.width ()) / 2; y = (screen->height () - (int)back->imgSize.height ()) / 2; tmpMatrixList[0].x0 -= x * tmpMatrixList[0].xx; tmpMatrixList[0].y0 -= y * tmpMatrixList[0].yy; tmpRect.setLeft (MAX (0, x)); tmpRect.setTop (MAX (0, y)); tmpRect.setRight (MIN (screen->width (), x + back->imgSize.width ())); tmpRect.setBottom (MIN (screen->height (), y + back->imgSize.height ())); reg = CompRegion (tmpRect); } if (back->imagePos == WallpaperOptions::BgImagePosTiled || back->imagePos == WallpaperOptions::BgImagePosCenterTiled) { if (back->imagePos == WallpaperOptions::BgImagePosCenterTiled) { x = (screen->width () - (int)back->imgSize.width ()) / 2; y = (screen->height () - (int)back->imgSize.height ()) / 2; if (x > 0) x = (x % (int)back->imgSize.width ()) - (int)back->imgSize.width (); if (y > 0) y = (y % (int)back->imgSize.height ()) - (int)back->imgSize.height (); } else { x = 0; y = 0; } while (y < (int) screen->height ()) { int xi = x; while (xi < (int) screen->width ()) { tmpMatrixList[0] = back->imgTex[0]->matrix (); tmpMatrixList[0].x0 -= xi * tmpMatrixList[0].xx; tmpMatrixList[0].y0 -= y * tmpMatrixList[0].yy; tmpRect.setLeft (MAX (0, xi)); tmpRect.setTop (MAX (0, y)); tmpRect.setRight (MIN (screen->width (), xi + back->imgSize.width ())); tmpRect.setBottom (MIN (screen->height (), y + back->imgSize.height ())); reg = CompRegion (tmpRect); gWindow->glAddGeometry (tmpMatrixList, reg, region); xi += (int)back->imgSize.width (); } y += (int)back->imgSize.height (); } } else gWindow->glAddGeometry (tmpMatrixList, reg, region); if (vb->end ()) gWindow->glDrawTexture (back->imgTex[0], transform, tmpAttrib, mask | PAINT_WINDOW_BLEND_MASK); } } bool WallpaperWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { WALLPAPER_SCREEN (screen); bool ret = gWindow->glDraw (transform, attrib, region, mask); if ((!ws->desktop || ws->desktop == window) && !ws->backgroundsPrimary.empty() && window->type () & CompWindowTypeDesktopMask) { int filterIdx; if (mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK) filterIdx = SCREEN_TRANS_FILTER; else if (mask & PAINT_WINDOW_TRANSFORMED_MASK) filterIdx = WINDOW_TRANS_FILTER; else filterIdx = NOTHING_TRANS_FILTER; GLTexture::Filter saveFilter = ws->gScreen->filter (filterIdx); ws->gScreen->setFilter (filterIdx, GLTexture::Good); if (ws->optionGetCycleWallpapers () && ws->rotateTimer.active ()) drawBackgrounds (transform, attrib, region, mask, ws->backgroundsSecondary, true); drawBackgrounds (transform, attrib, region, mask, ws->backgroundsPrimary, false); ws->gScreen->setFilter (filterIdx, saveFilter); ws->desktop = window; } return ret; } bool WallpaperWindow::damageRect (bool initial, const CompRect& rect) { WALLPAPER_SCREEN (screen); if (window->id () == ws->fakeDesktop){ ws->cScreen->damageScreen ();} return cWindow->damageRect (initial, rect); } WallpaperScreen::WallpaperScreen (CompScreen *screen) : PluginClassHandler (screen), WallpaperOptions (), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), backgroundsPrimary (), backgroundsSecondary () { ScreenInterface::setHandler (screen, true); CompositeScreenInterface::setHandler (cScreen, true); GLScreenInterface::setHandler (gScreen, true); compizWallpaperAtom = XInternAtom (screen->dpy (), "_COMPIZ_WALLPAPER_SUPPORTED", 0); propSet = false; fakeDesktop = None; desktop = NULL; fadeTimer = 0.0f; fadeTimeout = 0.0f; fadeDuration = 0.0f; alpha = 0.0f; optionSetBgImageNotify (boost::bind (&WallpaperScreen:: wallpaperBackgroundsChanged, this, _1, _2)); optionSetBgImagePosNotify (boost::bind (&WallpaperScreen:: wallpaperBackgroundsChanged, this, _1, _2)); optionSetBgFillTypeNotify (boost::bind (&WallpaperScreen:: wallpaperBackgroundsChanged, this, _1, _2)); optionSetBgColor1Notify (boost::bind (&WallpaperScreen:: wallpaperBackgroundsChanged, this, _1, _2)); optionSetBgColor2Notify (boost::bind (&WallpaperScreen:: wallpaperBackgroundsChanged, this, _1, _2)); optionSetCycleWallpapersNotify (boost::bind (&WallpaperScreen:: wallpaperToggleCycle, this, _1, _2)); optionSetCycleTimeoutNotify (boost::bind (&WallpaperScreen:: wallpaperCycleOptionChanged, this, _1, _2)); optionSetFadeDurationNotify (boost::bind (&WallpaperScreen:: wallpaperCycleOptionChanged, this, _1, _2)); rotateTimer.setCallback (boost::bind (&WallpaperScreen::rotateTimeout, this)); updateBackgrounds (); updateProperty (); cScreen->damageScreen (); if (!screen->desktopWindowCount () && backgroundsPrimary.size()) createFakeDesktopWindow (); } WallpaperScreen::~WallpaperScreen () { if (propSet) XDeleteProperty (screen->dpy (), screen->root (), compizWallpaperAtom); if (fakeDesktop != None) destroyFakeDesktopWindow (); } WallpaperWindow::WallpaperWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)) { CompositeWindowInterface::setHandler (cWindow, true); GLWindowInterface::setHandler (gWindow, true); } bool WallpaperPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/switcher/0000755000015301777760000000000012321344021021005 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/switcher/CMakeLists.txt0000644000015301777760000000017112321343002023542 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(switcher PLUGINDEPS composite opengl compiztoolbox)compiz-0.9.11+14.04.20140409/plugins/switcher/src/0000755000015301777760000000000012321344021021574 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/switcher/src/switcher.h0000644000015301777760000001132512321343002023575 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include #include "switcher_options.h" #define ZOOMED_WINDOW_MASK (1 << 0) #define NORMAL_WINDOW_MASK (1 << 1) class SwitchScreen : public BaseSwitchScreen, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler, public SwitcherOptions { public: SwitchScreen (CompScreen *screen); ~SwitchScreen (); void setZoom (); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void updateWindowList (int count); void createWindowList (int count); void getMinimizedAndMatch (bool &minimizedOption, CompMatch *&match); bool getMipmap (); void switchToWindow (bool toNext); void handleSelectionChange (bool toNext, int nextIdx); int countWindows (); void handleEvent (XEvent *event); void initiate (SwitchWindowSelection selection, bool showPopup); void windowRemove (CompWindow *w); bool adjustVelocity (); Window lastActiveWindow; CompWindow *zoomedWindow; float zoom; bool switching; bool zooming; int zoomMask; GLfloat mVelocity; GLfloat tVelocity; GLfloat sVelocity; int pos; int move; float translate; float sTranslate; }; class SwitchWindow : public BaseSwitchWindow, public WindowInterface, public CompositeWindowInterface, public GLWindowInterface, public PluginClassHandler { public: SwitchWindow (CompWindow *window); bool managed () const; bool damageRect (bool initial, const CompRect &rect); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void paintThumb (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, int x, int y); void updateIconTexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, int x, int y, GLTexture *icon); void updateIconNontexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, float &width, float &height, int x, int y, GLTexture *icon); void updateIconPos (int &wx, int &wy, int x, int y, float width, float height); IconMode getIconMode (); SwitchScreen *sScreen; }; #define MwmHintsDecorations (1L << 1) typedef struct { unsigned long flags; unsigned long functions; unsigned long decorations; } MwmHints; extern const unsigned short WIDTH; extern const unsigned short HEIGHT; extern const unsigned short SPACE; extern const unsigned short BOX_WIDTH; #define WINDOW_WIDTH(count) (WIDTH * (count) + (SPACE << 1)) #define WINDOW_HEIGHT (HEIGHT + (SPACE << 1)) #define SWITCH_SCREEN(s) \ SwitchScreen *ss = SwitchScreen::get (s) #define SWITCH_WINDOW(w) \ SwitchWindow *sw = SwitchWindow::get (w) class SwitchPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/switcher/src/switcher.cpp0000644000015301777760000006730112321343002024135 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "switcher.h" COMPIZ_PLUGIN_20090315 (switcher, SwitchPluginVTable) const unsigned short WIDTH = 212; const unsigned short HEIGHT = 192; const unsigned short SPACE = 10; const unsigned short BOX_WIDTH = 3; #define XWINDOWCHANGES_INIT {0, 0, 0, 0, 0, None, 0} static float _boxVertices[] = { -(WIDTH >> 1), BOX_WIDTH, 0.0f, (WIDTH >> 1), BOX_WIDTH, 0.0f, -(WIDTH >> 1), 0.0f, 0.0f, -(WIDTH >> 1), 0.0f, 0.0f, (WIDTH >> 1), BOX_WIDTH, 0.0f, (WIDTH >> 1), 0.0f, 0.0f, -(WIDTH >> 1), HEIGHT - BOX_WIDTH, 0.0f, -(WIDTH >> 1) + BOX_WIDTH, HEIGHT - BOX_WIDTH, 0.0f, -(WIDTH >> 1), BOX_WIDTH, 0.0f, -(WIDTH >> 1), BOX_WIDTH, 0.0f, -(WIDTH >> 1) + BOX_WIDTH, HEIGHT - BOX_WIDTH, 0.0f, -(WIDTH >> 1) + BOX_WIDTH, BOX_WIDTH, 0.0f, (WIDTH >> 1) - BOX_WIDTH, HEIGHT - BOX_WIDTH, 0.0f, (WIDTH >> 1), HEIGHT - BOX_WIDTH, 0.0f, (WIDTH >> 1) - BOX_WIDTH, BOX_WIDTH, 0.0f, (WIDTH >> 1) - BOX_WIDTH, BOX_WIDTH, 0.0f, (WIDTH >> 1), HEIGHT - BOX_WIDTH, 0.0f, (WIDTH >> 1), BOX_WIDTH, 0.0f, -(WIDTH >> 1), HEIGHT, 0.0f, (WIDTH >> 1), HEIGHT, 0.0f, -(WIDTH >> 1), HEIGHT - BOX_WIDTH, 0.0f, -(WIDTH >> 1), HEIGHT - BOX_WIDTH, 0.0f, (WIDTH >> 1), HEIGHT, 0.0f, (WIDTH >> 1), HEIGHT - BOX_WIDTH, 0.0f, }; void SwitchScreen::updateWindowList (int count) { int x, y; if (count > 1) { count -= (count + 1) & 1; if (count < 3) count = 3; } pos = ((count >> 1) - (int)windows.size ()) * WIDTH; move = 0; selectedWindow = windows.front (); x = screen->currentOutputDev ().x1 () + screen->currentOutputDev ().width () / 2; y = screen->currentOutputDev ().y1 () + screen->currentOutputDev ().height () / 2; if (popupWindow) { CompWindow *w = screen->findWindow (popupWindow); XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int valueMask = 0; valueMask |= (CWX | CWY | CWWidth | CWHeight); xwc.x = x - WINDOW_WIDTH (count) / 2; xwc.y = y - WINDOW_HEIGHT / 2; xwc.width = WINDOW_WIDTH (count); xwc.height = WINDOW_HEIGHT; if (w) w->configureXWindow (valueMask, &xwc); else XConfigureWindow (screen->dpy (), popupWindow, valueMask, &xwc); } } void SwitchScreen::createWindowList (int count) { windows.clear (); foreach (CompWindow *w, screen->windows ()) { SWITCH_WINDOW (w); if (sw->isSwitchWin ()) { windows.push_back (w); sw->cWindow->damageRectSetEnabled (sw, true); } } windows.sort (BaseSwitchScreen::compareWindows); if (windows.size () == 2) { windows.push_back (windows.front ()); windows.push_back ((*++windows.begin ())); } updateWindowList (count); } bool SwitchWindow::damageRect (bool initial, const CompRect &rect) { return BaseSwitchWindow::damageRect (initial, rect); } BaseSwitchWindow::IconMode SwitchWindow::getIconMode () { if (sScreen->optionGetIconOnly ()) return ShowIconOnly; if (!sScreen->optionGetIcon ()) return HideIcon; return ShowIcon; } void SwitchScreen::getMinimizedAndMatch (bool &minimizedOption, CompMatch *&matchOption) { minimizedOption = optionGetMinimized (); matchOption = &optionGetWindowMatch (); } bool SwitchScreen::getMipmap () { return optionGetMipmap (); } void SwitchScreen::switchToWindow (bool toNext) { CompWindow *w = BaseSwitchScreen::switchToWindow (toNext, optionGetAutoRotate (), optionGetFocusOnSwitch ()); if (w) { if (!zoomedWindow) zoomedWindow = selectedWindow; } } void SwitchScreen::handleSelectionChange (bool toNext, int nextIdx) { if (toNext) move -= WIDTH; else move += WIDTH; moreAdjust = true; } int SwitchScreen::countWindows () { int count = 0; foreach (CompWindow *w, screen->windows ()) if (SwitchWindow::get (w)->isSwitchWin ()) { count++; if (count == 5) break; } if (count == 5 && screen->width () <= WINDOW_WIDTH (5)) count = 3; return count; } void SwitchScreen::handleEvent (XEvent *event) { BaseSwitchScreen::handleEvent (event); } void SwitchScreen::initiate (SwitchWindowSelection selection, bool showPopup) { int count; if (screen->otherGrabExist ("switcher", NULL)) return; this->selection = selection; selectedWindow = NULL; count = countWindows (); if (count < 1) return; if (!popupWindow && showPopup) { Display *dpy = screen->dpy (); XSizeHints xsh; XWMHints xwmh; XClassHint xch; Atom state[4]; int nState = 0; XSetWindowAttributes attr; Visual *visual; visual = findArgbVisual (dpy, screen->screenNum ()); if (!visual) return; if (count > 1) { count -= (count + 1) & 1; if (count < 3) count = 3; } xsh.flags = PSize | PPosition | PWinGravity; xsh.width = WINDOW_WIDTH (count); xsh.height = WINDOW_HEIGHT; xsh.win_gravity = StaticGravity; xwmh.flags = InputHint; xwmh.input = 0; xch.res_name = (char *)"compiz"; xch.res_class = (char *)"switcher-window"; attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap (dpy, screen->root (), visual, AllocNone); attr.override_redirect = true; popupWindow = XCreateWindow (dpy, screen->root (), screen->width () / 2 - xsh.width / 2, screen->height () / 2 - xsh.height / 2, (unsigned) xsh.width, (unsigned) xsh.height, 0, 32, InputOutput, visual, CWBackPixel | CWBorderPixel | CWColormap | CWOverrideRedirect, &attr); XSetWMProperties (dpy, popupWindow, NULL, NULL, programArgv, programArgc, &xsh, &xwmh, &xch); state[nState++] = Atoms::winStateAbove; state[nState++] = Atoms::winStateSticky; state[nState++] = Atoms::winStateSkipTaskbar; state[nState++] = Atoms::winStateSkipPager; XChangeProperty (dpy, popupWindow, Atoms::winState, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, nState); XChangeProperty (dpy, popupWindow, Atoms::winType, XA_ATOM, 32, PropModeReplace, (unsigned char *) &Atoms::winTypeUtil, 1); screen->setWindowProp (popupWindow, Atoms::winDesktop, 0xffffffff); setSelectedWindowHint (false); } if (!grabIndex) grabIndex = screen->pushGrab (screen->invisibleCursor (), "switcher"); if (grabIndex) { if (!switching) { lastActiveNum = screen->activeNum (); createWindowList (count); sTranslate = zoom; if (popupWindow && showPopup) { XMapWindow (screen->dpy (), popupWindow); setSelectedWindowHint (optionGetFocusOnSwitch ()); } lastActiveWindow = screen->activeWindow (); activateEvent (true); } cScreen->damageScreen (); switching = true; moreAdjust = true; screen->handleEventSetEnabled (this, true); cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); foreach (CompWindow *w, screen->windows ()) { SWITCH_WINDOW (w); sw->gWindow->glPaintSetEnabled (sw, true); } } } static bool switchTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid; xid = (Window) CompOption::getIntOptionNamed (options, "root"); if (action) action->setState (action->state () & (unsigned)~(CompAction::StateTermKey | CompAction::StateTermButton)); if (xid && xid != screen->root ()) return false; SWITCH_SCREEN (screen); if (ss->grabIndex) { if (ss->popupWindow) { XUnmapWindow (screen->dpy (), ss->popupWindow); } ss->switching = false; if (state & CompAction::StateCancel) { ss->selectedWindow = NULL; ss->zoomedWindow = NULL; if (screen->activeWindow () != ss->lastActiveWindow) { CompWindow *w = screen->findWindow (ss->lastActiveWindow); if (w) w->moveInputFocusTo (); } } if (state && ss->selectedWindow && !ss->selectedWindow->destroyed ()) screen->sendWindowActivationRequest (ss->selectedWindow->id ()); screen->removeGrab (ss->grabIndex, 0); ss->grabIndex = NULL; if (!ss->popupWindow) screen->handleEventSetEnabled (ss, false); if (!ss->zooming) { ss->selectedWindow = NULL; ss->zoomedWindow = NULL; ss->activateEvent (false); } else { ss->moreAdjust = true; } ss->selectedWindow = NULL; ss->setSelectedWindowHint (false); ss->lastActiveNum = 0; ss->cScreen->damageScreen (); } return false; } static bool switchInitiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &options, SwitchWindowSelection selection, bool showPopup, bool nextWindow) { Window xid; xid = (Window) CompOption::getIntOptionNamed (options, "root"); if (xid != screen->root ()) return false; SWITCH_SCREEN (screen); if (!ss->switching) { ss->initiate (selection, showPopup); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); if (state & CompAction::StateInitEdge) action->setState (action->state () | CompAction::StateTermEdge); else if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); } ss->switchToWindow (nextWindow); return false; } void SwitchScreen::windowRemove (CompWindow *w) { if (w) { int count; CompWindow *selected; CompWindow *old; int allWindowsWidth; SWITCH_WINDOW (w); if (!sw->isSwitchWin (true)) return; sw->cWindow->damageRectSetEnabled (sw, false); sw->gWindow->glPaintSetEnabled (sw, false); old = selected = selectedWindow; CompWindowList::iterator it = std::find (windows.begin (), windows.end (), w); if (it == windows.end ()) return; if (w == selected) { CompWindowList::iterator newSelected = it; if (w == windows.back ()) newSelected = windows.begin (); else ++newSelected; selected = *newSelected; } windows.erase (it); count = windows.size (); if (count == 2) { if (windows.front () == windows.back ()) { windows.pop_back (); count = 1; } else { windows.push_back (windows.front ()); windows.push_back (*++windows.begin ()); } } else if (count == 0) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); switchTerminate (NULL, 0, o); return; } if (!grabIndex) return; updateWindowList (count); allWindowsWidth = windows.size () * WIDTH; foreach (CompWindow *w, windows) { selectedWindow = w; if (selectedWindow == selected) break; pos -= WIDTH; if (pos < -allWindowsWidth) pos += allWindowsWidth; } if (popupWindow) { CompWindow *popup; popup = screen->findWindow (popupWindow); if (popup) CompositeWindow::get (popup)->addDamage (); setSelectedWindowHint (optionGetFocusOnSwitch ()); } if (old != selectedWindow) { zoomedWindow = selectedWindow; CompositeWindow::get (selectedWindow)->addDamage (); CompositeWindow::get (w)->addDamage (); if (old && !old->destroyed ()) CompositeWindow::get (old)->addDamage (); } } } bool SwitchScreen::adjustVelocity () { float dx, adjust, amount; dx = move; adjust = dx * 0.15f; amount = fabs (dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; mVelocity = (amount * mVelocity + adjust) / (amount + 1.0f); if (zooming) { float dt, ds; if (switching) dt = zoom - translate; else dt = 0.0f - translate; adjust = dt * 0.15f; amount = fabs (dt) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; tVelocity = (amount * tVelocity + adjust) / (amount + 1.0f); if (selectedWindow == zoomedWindow) ds = zoom - sTranslate; else ds = 0.0f - sTranslate; adjust = ds * 0.5f; amount = fabs (ds) * 5.0f; if (amount < 1.0f) amount = 1.0f; else if (amount > 6.0f) amount = 6.0f; sVelocity = (amount * sVelocity + adjust) / (amount + 1.0f); if (selectedWindow == zoomedWindow) { if (fabs (dx) < 0.1f && fabs (mVelocity) < 0.2f && fabs (dt) < 0.001f && fabs (tVelocity) < 0.001f && fabs (ds) < 0.001f && fabs (sVelocity) < 0.001f) { mVelocity = tVelocity = sVelocity = 0.0f; return false; } } } else { if (fabs (dx) < 0.1f && fabs (mVelocity) < 0.2f) { mVelocity = 0.0f; return false; } } return true; } void SwitchScreen::preparePaint (int msSinceLastPaint) { if (moreAdjust) { int steps, m; float amount, chunk; int allWindowsWidth; allWindowsWidth = windows.size () * WIDTH; amount = msSinceLastPaint * 0.05f * optionGetSpeed (); steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float) steps; while (steps--) { moreAdjust = adjustVelocity (); if (!moreAdjust) { pos += move; move = 0; if (zooming) { if (switching) { translate = zoom; sTranslate = zoom; } else { translate = 0.0f; sTranslate = zoom; selectedWindow = NULL; zoomedWindow = NULL; if (grabIndex) { screen->removeGrab (grabIndex, 0); grabIndex = 0; } activateEvent (false); } } break; } m = mVelocity * chunk; if (!m) { if (mVelocity) m = (move > 0) ? 1 : -1; } move -= m; pos += m; if (pos < -allWindowsWidth) pos += allWindowsWidth; else if (pos > 0) pos -= allWindowsWidth; translate += tVelocity * chunk; sTranslate += sVelocity * chunk; if (selectedWindow != zoomedWindow) { if (sTranslate < 0.01f) zoomedWindow = selectedWindow; } } } cScreen->preparePaint (msSinceLastPaint); } bool SwitchScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; zoomMask = ZOOMED_WINDOW_MASK | NORMAL_WINDOW_MASK; if (grabIndex || (zooming && translate > 0.001f)) { GLMatrix sTransform (transform); CompWindow *zoomed; CompWindow *switcher; Window zoomedAbove = None; if (zooming) { mask &= (unsigned)~PAINT_SCREEN_REGION_MASK; mask |= PAINT_SCREEN_TRANSFORMED_MASK | PAINT_SCREEN_CLEAR_MASK; sTransform.translate (0.0f, 0.0f, -translate); zoomMask = NORMAL_WINDOW_MASK; } if (optionGetBringToFront ()) { CompWindow *frontWindow = ::screen->clientList ().back (); zoomed = zoomedWindow; if (zoomed && !zoomed->destroyed () && zoomed != frontWindow) { CompWindow *w; for (w = zoomed->prev; w && w->id () <= 1; w = w->prev) ; zoomedAbove = (w) ? w->id () : None; screen->unhookWindow (zoomed); screen->insertWindow (zoomed, frontWindow->id ()); } else { zoomed = NULL; } } else { zoomed = NULL; } ignoreSwitcher = true; status = gScreen->glPaintOutput (sAttrib, sTransform, region, output, mask); if (zooming) { float zTranslate; mask &= (unsigned)~PAINT_SCREEN_CLEAR_MASK; mask |= PAINT_SCREEN_NO_BACKGROUND_MASK; zoomMask = ZOOMED_WINDOW_MASK; zTranslate = MIN (sTranslate, translate); sTransform.translate (0.0f, 0.0f, zTranslate); status = gScreen->glPaintOutput (sAttrib, sTransform, region, output, mask); } if (zoomed) { screen->unhookWindow (zoomed); screen->insertWindow (zoomed, zoomedAbove); } ignoreSwitcher = false; switcher = screen->findWindow (popupWindow); if (switcher) { SWITCH_WINDOW (switcher); sTransform = transform; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); if (!switcher->destroyed () && switcher->isViewable () && sw->cWindow->damaged ()) { sw->gWindow->glPaint (sw->gWindow->paintAttrib (), sTransform, infiniteRegion, 0); } } } else { status = gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } return status; } void SwitchScreen::donePaint () { if ((grabIndex || zooming) && moreAdjust) { if (zooming) { cScreen->damageScreen (); } else { CompWindow *w; w = screen->findWindow (popupWindow); if (w) CompositeWindow::get (w)->addDamage (); } } else if (!grabIndex && !(zooming && translate > 0.001f) && !moreAdjust) { cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); foreach (CompWindow *w, screen->windows ()) { SWITCH_WINDOW (w); sw->cWindow->damageRectSetEnabled (sw, false); sw->gWindow->glPaintSetEnabled (sw, false); } } cScreen->donePaint (); } void SwitchWindow::paintThumb (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, int x, int y) { BaseSwitchWindow::paintThumb (attrib, transform, mask, x, y, WIDTH - (SPACE << 1), HEIGHT - (SPACE << 1), WIDTH - (WIDTH >> 2), HEIGHT - (HEIGHT >> 2)); } void SwitchWindow::updateIconTexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, int x, int y, GLTexture *icon) { sAttrib.xScale = (float) ICON_SIZE / icon->width (); sAttrib.yScale = (float) ICON_SIZE / icon->height (); if (sAttrib.xScale < sAttrib.yScale) sAttrib.yScale = sAttrib.xScale; else sAttrib.xScale = sAttrib.yScale; wx = x + WIDTH - icon->width () * sAttrib.xScale - SPACE; wy = y + HEIGHT - icon->height () * sAttrib.yScale - SPACE; } void SwitchWindow::updateIconNontexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, float &width, float &height, int x, int y, GLTexture *icon) { float iw, ih; iw = width - SPACE; ih = height - SPACE; sAttrib.xScale = iw / icon->width (); sAttrib.yScale = ih / icon->height (); if (sAttrib.xScale < sAttrib.yScale) sAttrib.yScale = sAttrib.xScale; else sAttrib.xScale = sAttrib.yScale; width = icon->width () * sAttrib.xScale; height = icon->height () * sAttrib.yScale; wx = x + SPACE + ((WIDTH - (SPACE << 1)) - width) / 2; wy = y + SPACE + ((HEIGHT - (SPACE << 1)) - height) / 2; } void SwitchWindow::updateIconPos (int &wx, int &wy, int x, int y, float width, float height) { wx = x + SPACE + ((WIDTH - (SPACE << 1)) - width) / 2; wy = y + SPACE + ((HEIGHT - (SPACE << 1)) - height) / 2; } /* Only for the popup window */ bool SwitchWindow::managed () const { return true; } bool SwitchWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLMatrix wTransform (transform); int zoomType = NORMAL_WINDOW_MASK; bool status; if (window->id () == sScreen->popupWindow) { int x, y, x1, x2, cx; unsigned short color[4]; const CompWindow::Geometry &g = window->geometry (); if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK || sScreen->ignoreSwitcher) return false; status = gWindow->glPaint (attrib, transform, region, mask); if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK) && region.isEmpty ()) return true; x1 = g.x () + SPACE; x2 = g.x () + g.width () - SPACE; x = x1 + sScreen->pos; y = g.y () + SPACE; glEnable (GL_SCISSOR_TEST); glScissor (x1, 0, x2 - x1, screen->height ()); foreach (CompWindow *w, sScreen->windows) { if (x + WIDTH > x1) SwitchWindow::get (w)->paintThumb (gWindow->lastPaintAttrib (), transform, mask, x, y); x += WIDTH; } foreach (CompWindow *w, sScreen->windows) { if (x > x2) break; SwitchWindow::get (w)->paintThumb (gWindow->lastPaintAttrib (), transform, mask, x, y); x += WIDTH; } glDisable (GL_SCISSOR_TEST); cx = g.x () + (g.width () >> 1); wTransform.translate (cx, y, 0.0f); glEnable (GL_BLEND); for (int i = 0; i < 4; i++) { color[i] = (unsigned int)sScreen->fgColor[i] * gWindow->lastPaintAttrib ().opacity / 0xffff; } streamingBuffer->begin (GL_TRIANGLES); streamingBuffer->addColors (1, color); streamingBuffer->addVertices (24, _boxVertices); streamingBuffer->end (); streamingBuffer->render (wTransform, attrib); glDisable (GL_BLEND); } else if (window == sScreen->selectedWindow) { if (sScreen->optionGetBringToFront () && sScreen->selectedWindow == sScreen->zoomedWindow) zoomType = ZOOMED_WINDOW_MASK; if (!(sScreen->zoomMask & zoomType)) return (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) ? false : true; status = gWindow->glPaint (attrib, transform, region, mask); } else if (sScreen->switching) { GLWindowPaintAttrib sAttrib (attrib); GLuint value; value = (GLuint) sScreen->optionGetSaturation (); if (value != 100) sAttrib.saturation = sAttrib.saturation * value / 100; value = (GLuint) sScreen->optionGetBrightness (); if (value != 100) sAttrib.brightness = sAttrib.brightness * value / 100; if (window->wmType () & (unsigned)~(CompWindowTypeDockMask | CompWindowTypeDesktopMask)) { value = (GLuint) sScreen->optionGetOpacity (); if (value != 100) sAttrib.opacity = sAttrib.opacity * value / 100; } if (sScreen->optionGetBringToFront () && window == sScreen->zoomedWindow) zoomType = ZOOMED_WINDOW_MASK; if (!(sScreen->zoomMask & zoomType)) return (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) ? false : true; status = gWindow->glPaint (sAttrib, transform, region, mask); } else { if (!(sScreen->zoomMask & zoomType)) return (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) ? false : true; status = gWindow->glPaint (attrib, transform, region, mask); } return status; } void SwitchScreen::setZoom () { if (optionGetZoom () < 0.05f) { zooming = false; zoom = 0.0f; } else { zooming = true; zoom = optionGetZoom () / 30.0f; } } SwitchScreen::SwitchScreen (CompScreen *screen) : BaseSwitchScreen (screen), PluginClassHandler (screen), lastActiveWindow (None), zoomedWindow (NULL), switching (false), zoomMask (~0), mVelocity (0.0), tVelocity (0.0), sVelocity (0.0), pos (0), move (0), translate (0.0), sTranslate (0.0) { zoom = optionGetZoom () / 30.0f; zooming = (optionGetZoom () > 0.05f); optionSetZoomNotify (boost::bind (&SwitchScreen::setZoom, this)); #define SWITCHBIND(a,b,c) boost::bind (switchInitiateCommon, _1, _2, _3, a, b, c) optionSetNextButtonInitiate (SWITCHBIND (CurrentViewport, true, true)); optionSetNextButtonTerminate (switchTerminate); optionSetNextKeyInitiate (SWITCHBIND (CurrentViewport, true, true)); optionSetNextKeyTerminate (switchTerminate); optionSetPrevButtonInitiate (SWITCHBIND (CurrentViewport, true, false)); optionSetPrevButtonTerminate (switchTerminate); optionSetPrevKeyInitiate (SWITCHBIND (CurrentViewport, true, false)); optionSetPrevKeyTerminate (switchTerminate); optionSetNextAllButtonInitiate (SWITCHBIND (AllViewports, true, true)); optionSetNextAllButtonTerminate (switchTerminate); optionSetNextAllKeyInitiate (SWITCHBIND (AllViewports, true, true)); optionSetNextAllKeyTerminate (switchTerminate); optionSetPrevAllButtonInitiate (SWITCHBIND (AllViewports, true, false)); optionSetPrevAllButtonTerminate (switchTerminate); optionSetPrevAllKeyInitiate (SWITCHBIND (AllViewports, true, false)); optionSetPrevAllKeyTerminate (switchTerminate); optionSetNextNoPopupButtonInitiate (SWITCHBIND (CurrentViewport, false, true)); optionSetNextNoPopupButtonTerminate (switchTerminate); optionSetNextNoPopupKeyInitiate (SWITCHBIND (CurrentViewport, false, true)); optionSetNextNoPopupKeyTerminate (switchTerminate); optionSetPrevNoPopupButtonInitiate (SWITCHBIND (CurrentViewport, false, false)); optionSetPrevNoPopupButtonTerminate (switchTerminate); optionSetPrevNoPopupKeyInitiate (SWITCHBIND (CurrentViewport, false, false)); optionSetPrevNoPopupKeyTerminate (switchTerminate); optionSetNextPanelButtonInitiate (SWITCHBIND (Panels, false, true)); optionSetNextPanelButtonTerminate (switchTerminate); optionSetNextPanelKeyInitiate (SWITCHBIND (Panels, false, true)); optionSetNextPanelKeyTerminate (switchTerminate); optionSetPrevPanelButtonInitiate (SWITCHBIND (Panels, false, false)); optionSetPrevPanelButtonTerminate (switchTerminate); optionSetPrevPanelKeyInitiate (SWITCHBIND (Panels, false, false)); optionSetPrevPanelKeyTerminate (switchTerminate); #undef SWITCHBIND ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } SwitchScreen::~SwitchScreen () { if (popupWindow) XDestroyWindow (screen->dpy (), popupWindow); } SwitchWindow::SwitchWindow (CompWindow *window) : BaseSwitchWindow (dynamic_cast (SwitchScreen::get (screen)), window), PluginClassHandler (window), sScreen (SwitchScreen::get (screen)) { GLWindowInterface::setHandler (gWindow, false); CompositeWindowInterface::setHandler (cWindow, false); if (window->id () == sScreen->popupWindow) WindowInterface::setHandler (window, true); else WindowInterface::setHandler (window, false); if (sScreen->popupWindow && sScreen->popupWindow == window->id ()) gWindow->glPaintSetEnabled (this, true); } bool SwitchPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("compiztoolbox", COMPIZ_COMPIZTOOLBOX_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/switcher/switcher.xml.in0000644000015301777760000001366412321343002023774 0ustar pbusernogroup00000000000000 <_short>Application Switcher <_long>Application Switcher Window Management opengl compiztoolbox <_short>Bindings compiz-0.9.11+14.04.20140409/plugins/regex/0000755000015301777760000000000012321344021020267 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/regex/regex.xml.in0000644000015301777760000000052612321343002022531 0ustar pbusernogroup00000000000000 <_short>Regex Matching <_long>Regex window matching Utility composite opengl decor compiz-0.9.11+14.04.20140409/plugins/regex/CMakeLists.txt0000644000015301777760000000011412321343002023021 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(regex)compiz-0.9.11+14.04.20140409/plugins/regex/src/0000755000015301777760000000000012321344021021056 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/regex/src/regex.cpp0000644000015301777760000001636312321343002022703 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "regexplugin.h" #include "core/atoms.h" #include #include COMPIZ_PLUGIN_20090315 (regex, RegexPluginVTable) class RegexExp : public CompMatch::Expression { public: typedef enum { TypeTitle, TypeRole, TypeClass, TypeName, } Type; RegexExp (const CompString& str, int item); virtual ~RegexExp (); bool evaluate (const CompWindow *w) const; static int matches (const CompString& str); private: typedef struct { const char *name; size_t length; Type type; unsigned int flags; } Prefix; static const Prefix prefix[]; Type mType; regex_t *mRegex; }; const RegexExp::Prefix RegexExp::prefix[] = { { "title=", 6, TypeTitle, 0 }, { "role=", 5, TypeRole, 0 }, { "class=", 6, TypeClass, 0 }, { "name=", 5, TypeName, 0 }, { "ititle=", 7, TypeTitle, REG_ICASE }, { "irole=", 6, TypeRole, REG_ICASE }, { "iclass=", 7, TypeClass, REG_ICASE }, { "iname=", 6, TypeName, REG_ICASE } }; RegexExp::RegexExp (const CompString& str, int item) : mRegex (NULL) { if ((unsigned int) item < sizeof (prefix) / sizeof (prefix[0])) { int status; CompString value; value = str.substr (prefix[item].length); mRegex = new regex_t; status = regcomp (mRegex, value.c_str (), REG_NOSUB | prefix[item].flags); if (status) { char errMsg[1024]; regerror (status, mRegex, errMsg, sizeof (errMsg)); compLogMessage ("regex", CompLogLevelWarn, "%s = %s", errMsg, value.c_str ()); regfree (mRegex); delete mRegex; mRegex = NULL; } mType = prefix[item].type; } } RegexExp::~RegexExp () { if (mRegex) { regfree (mRegex); delete mRegex; } } bool RegexExp::evaluate (const CompWindow *w) const { const CompString *string = NULL; const RegexWindow *rw = RegexWindow::get (w); switch (mType) { case TypeRole: string = &rw->role; break; case TypeTitle: string = &rw->title; break; case TypeClass: string = &rw->resClass; break; case TypeName: string = &rw->resName; break; } if (!mRegex || !string) return false; if (regexec (mRegex, string->c_str (), 0, NULL, 0)) return false; return true; } int RegexExp::matches (const CompString& str) { for (unsigned int i = 0; i < sizeof (prefix) / sizeof (prefix[0]); i++) if (str.compare (0, prefix[i].length, prefix[i].name) == 0) return (int) i; return -1; } CompMatch::Expression * RegexScreen::matchInitExp (const CompString& str) { int item = RegexExp::matches (str); if (item >= 0) return new RegexExp (str, item); return screen->matchInitExp (str); } bool RegexWindow::getStringProperty (Atom nameAtom, Atom typeAtom, CompString& string) { Atom type; unsigned long nItems; unsigned long bytesAfter; unsigned char *str = NULL; int format, result; result = XGetWindowProperty (screen->dpy (), window->id (), nameAtom, 0, LONG_MAX, false, typeAtom, &type, &format, &nItems, &bytesAfter, (unsigned char **) &str); if (result != Success) return false; if (type != typeAtom) { XFree (str); return false; } string = (char *) str; XFree (str); return true; } void RegexWindow::updateRole () { RegexScreen *rs = RegexScreen::get (screen); role = ""; getStringProperty (rs->roleAtom, XA_STRING, role); } void RegexWindow::updateTitle () { RegexScreen *rs = RegexScreen::get (screen); title = ""; if (getStringProperty (rs->visibleNameAtom, Atoms::utf8String, title)) return; if (getStringProperty (Atoms::wmName, Atoms::utf8String, title)) return; getStringProperty (XA_WM_NAME, XA_STRING, title); } void RegexWindow::updateClass () { XClassHint classHint; resClass = ""; resName = ""; if (!XGetClassHint (screen->dpy (), window->id (), &classHint) != Success) return; if (classHint.res_name) { resName = classHint.res_name; XFree (classHint.res_name); } if (classHint.res_class) { resClass = classHint.res_class; XFree (classHint.res_class); } } void RegexScreen::handleEvent (XEvent *event) { CompWindow *w; screen->handleEvent (event); if (event->type != PropertyNotify) return; w = screen->findWindow (event->xproperty.window); if (!w) return; if (event->xproperty.atom == XA_WM_NAME) { RegexWindow::get (w)->updateTitle (); screen->matchPropertyChanged (w); } else if (event->xproperty.atom == roleAtom) { RegexWindow::get (w)->updateRole (); screen->matchPropertyChanged (w); } else if (event->xproperty.atom == XA_WM_CLASS) { RegexWindow::get (w)->updateClass (); screen->matchPropertyChanged (w); } } /* It's not safe to call CompScreen::matchExpHandlerChanged * from the ::RegexScreen constructor since that could end * up calling RegexWindow::get () on windows (which haven't * had a RegexWindow struct created for them) through * ::matchExpHandlerChanged -> CompMatch::evaluate () -> * RegexExp::evaluate () -> RegexWindow::get () */ bool RegexScreen::applyInitialActions () { screen->matchExpHandlerChanged (); return false; } RegexScreen::RegexScreen (CompScreen *s) : PluginClassHandler (s) { CompTimer::CallBack cb = boost::bind (&RegexScreen::applyInitialActions, this); ScreenInterface::setHandler (s); roleAtom = XInternAtom (s->dpy (), "WM_WINDOW_ROLE", 0); visibleNameAtom = XInternAtom (s->dpy (), "_NET_WM_VISIBLE_NAME", 0); mApplyInitialActionsTimer.setTimes (0, 0); mApplyInitialActionsTimer.setCallback (cb); mApplyInitialActionsTimer.start (); } RegexScreen::~RegexScreen () { screen->matchInitExpSetEnabled (this, false); screen->matchExpHandlerChanged (); } RegexWindow::RegexWindow (CompWindow *w) : PluginClassHandler (w), window (w) { updateRole (); updateTitle (); updateClass (); } bool RegexPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/regex/src/regexplugin.h0000644000015301777760000000433412321343002023562 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef COMPIZ_REGEXPLUGIN_H #define COMPIZ_REGEXPLUGIN_H #include "core/screen.h" #include "core/timer.h" #include "core/pluginclasshandler.h" #include class RegexScreen : public PluginClassHandler, public ScreenInterface { public: RegexScreen (CompScreen *s); ~RegexScreen (); void handleEvent (XEvent *event); bool applyInitialActions (); CompMatch::Expression * matchInitExp (const CompString& value); Atom roleAtom; Atom visibleNameAtom; CompTimer mApplyInitialActionsTimer; }; class RegexWindow : public PluginClassHandler { public: RegexWindow (CompWindow *w); void updateRole (); void updateTitle (); void updateClass (); bool getStringProperty (Atom nameAtom, Atom typeAtom, CompString& string); CompString role; CompString title; CompString resName; CompString resClass; CompWindow *window; }; class RegexPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #endif compiz-0.9.11+14.04.20140409/plugins/shelf/0000755000015301777760000000000012321344021020256 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/shelf/CMakeLists.txt0000644000015301777760000000015212321343002023012 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (shelf PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/shelf/src/0000755000015301777760000000000012321344021021045 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/shelf/src/shelf.cpp0000644000015301777760000004674212321343002022665 0ustar pbusernogroup00000000000000/* * Compiz Shelf plugin * * shelf.h * * Copyright (C) 2007 Canonical Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Kristian Lyngstøl * Danny Baumann * Sam Spilsbury * * Description: * * This plugin visually resizes a window to allow otherwise obtrusive * windows to be visible in a monitor-fashion. Use case: Anything with * progress bars, notification programs, etc. * * Todo: * - Check for XShape events * - Handle input in a sane way * - Mouse-over? */ #include "shelf.h" COMPIZ_PLUGIN_20090315 (shelf, ShelfPluginVTable); const float SHELF_MIN_SIZE = 50.0f; // Minimum pixelsize a window can be scaled to /* Enables / Disables screen paint functions */ static void toggleScreenFunctions (bool enabled) { SHELF_SCREEN (screen); screen->handleEventSetEnabled (ss, enabled); ss->cScreen->preparePaintSetEnabled (ss, enabled); ss->gScreen->glPaintOutputSetEnabled (ss, enabled); ss->cScreen->donePaintSetEnabled (ss, enabled); } static void toggleWindowFunctions (CompWindow *w, bool enabled) { SHELF_WINDOW (w); sw->window->moveNotifySetEnabled (sw, enabled); sw->cWindow->damageRectSetEnabled (sw, enabled); sw->gWindow->glPaintSetEnabled (sw, enabled); } /* Checks if w is a ipw and returns the real window */ CompWindow * ShelfWindow::getRealWindow () { ShelfedWindowInfo *run; SHELF_SCREEN (screen); foreach (run, ss->shelfedWindows) { if (window->id () == run->ipw) return run->w; } return NULL; } void ShelfWindow::saveInputShape (XRectangle **retRects, int *retCount, int *retOrdering) { XRectangle *rects; int count = 0, ordering; Display *dpy = screen->dpy (); rects = XShapeGetRectangles (dpy, window->id (), ShapeInput, &count, &ordering); /* check if the returned shape exactly matches the window shape - if that is true, the window currently has no set input shape */ if ((count == 1) && (rects[0].x == -window->geometry ().border ()) && (rects[0].y == -window->geometry ().border ()) && (rects[0].width == (window->serverWidth () + window->serverGeometry ().border ())) && (rects[0].height == (window->serverHeight () + window->serverGeometry (). border ()))) { count = 0; } *retRects = rects; *retCount = count; *retOrdering = ordering; } /* Shape the input of the window when scaled. * Since the IPW will be dealing with the input, removing input * from the window entirely is a perfectly good solution. */ void ShelfWindow::shapeInput () { Window frame; Display *dpy = screen->dpy(); saveInputShape (&info->inputRects, &info->nInputRects, &info->inputRectOrdering); frame = window->frame(); if (frame) { saveInputShape (&info->frameInputRects, &info->frameNInputRects, &info->frameInputRectOrdering); } else { info->frameInputRects = NULL; info->frameNInputRects = -1; info->frameInputRectOrdering = 0; } /* clear shape */ XShapeSelectInput (dpy, window->id(), NoEventMask); XShapeCombineRectangles (dpy, window->id(), ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); if (frame) XShapeCombineRectangles (dpy, window->frame(), ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); XShapeSelectInput (dpy, window->id(), ShapeNotify); } /* Restores the shape of the window: * If the window had a custom shape defined by inputRects then we restore * that in order with XShapeCombineRectangles. * Most windows have no specific defined shape so we can restore it with * setting the shape to a 0x0 mask */ void ShelfWindow::unshapeInput () { Display *dpy = screen->dpy (); if (info->nInputRects) { XShapeCombineRectangles (dpy, window->id(), ShapeInput, 0, 0, info->inputRects, info->nInputRects, ShapeSet, info->inputRectOrdering); } else { XShapeCombineMask (dpy, window->id(), ShapeInput, 0, 0, None, ShapeSet); } if (info->frameNInputRects >= 0) { if (info->frameNInputRects) { XShapeCombineRectangles (dpy, window->frame(), ShapeInput, 0, 0, info->frameInputRects, info->frameNInputRects, ShapeSet, info->frameInputRectOrdering); } else { XShapeCombineMask (dpy, window->frame(), ShapeInput, 0, 0, None, ShapeSet); } } } void ShelfScreen::preparePaint (int msSinceLastPaint) { float steps; steps = (float) msSinceLastPaint / (float) optionGetAnimtime (); if (steps < 0.005) steps = 0.005; /* FIXME: should only loop over all windows if at least one animation is running */ foreach (CompWindow *w, screen->windows ()) ShelfWindow::get (w)->steps = steps; cScreen->preparePaint (msSinceLastPaint); } void ShelfScreen::addWindowToList (ShelfedWindowInfo *info) { shelfedWindows.push_back (info); } void ShelfScreen::removeWindowFromList (ShelfedWindowInfo *info) { shelfedWindows.remove (info); } /* Adjust size and location of the input prevention window */ void ShelfWindow::adjustIPW () { XWindowChanges xwc; Display *dpy = screen->dpy (); float f_width, f_height; if (!info || !info->ipw) return; f_width = window->width () + 2 * window->geometry ().border () + window->border ().left + window->border ().right + 2.0f; f_width *= targetScale; f_height = window->height () + 2 * window->geometry ().border () + window->border ().top + window->border ().bottom + 2.0f; f_height *= targetScale; xwc.x = window->x () - window->border ().left; xwc.y = window->y () - window->border ().top; xwc.width = (int) f_width; xwc.height = (int) f_height; xwc.stack_mode = Below; /* XXX: This causes XConfigureWindow to break */ //xwc.sibling = window->id (); XMapWindow (dpy, info->ipw); XConfigureWindow (dpy, info->ipw, CWStackMode | CWX | CWY | CWWidth | CWHeight, &xwc); } void ShelfScreen::adjustIPWStacking () { foreach (ShelfedWindowInfo *run, shelfedWindows) { if (!run->w->prev || run->w->prev->id () != run->ipw) ShelfWindow::get (run->w)->adjustIPW (); } } /* Create an input prevention window */ void ShelfWindow::createIPW () { Window ipw; XSetWindowAttributes attrib; XWindowChanges xwc; if (!info || info->ipw) return; attrib.override_redirect = true; //attrib.event_mask = 0; ipw = XCreateWindow (screen->dpy (), screen->root (), 0, 0, -100, -100, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect, &attrib); xwc.x = window->serverGeometry ().x () - window->border ().left; xwc.y = window->serverGeometry ().y () - window->border ().top; xwc.width = window->serverGeometry ().width () + window->border ().left + window->border ().right; xwc.height = window->serverGeometry ().height () + window->border ().top + window->border ().bottom; XMapWindow (screen->dpy (), ipw); XConfigureWindow (screen->dpy (), ipw, CWStackMode | CWX | CWY | CWWidth | CWHeight, &xwc); info->ipw = ipw; } ShelfedWindowInfo::ShelfedWindowInfo (CompWindow *window) : w (window), ipw (None), inputRects (NULL), nInputRects (0), inputRectOrdering (0), frameInputRects (NULL), frameNInputRects (0), frameInputRectOrdering (0) { } ShelfedWindowInfo::~ShelfedWindowInfo () { } bool ShelfWindow::handleShelfInfo () { SHELF_SCREEN (screen); if (targetScale == 1.0f && info) { if (info->ipw) XDestroyWindow (screen->dpy (), info->ipw); unshapeInput (); ss->removeWindowFromList (info); delete info; info = NULL; return false; } else if (targetScale != 1.0f && !info) { info = new ShelfedWindowInfo (window); if (!info) return false; shapeInput (); createIPW (); ss->addWindowToList (info); } return true; } /* Sets the scale level and adjust the shape */ void ShelfWindow::scale (float fScale) { if (window->wmType () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) return; targetScale = MIN (fScale, 1.0f); if ((float) window->width () * targetScale < SHELF_MIN_SIZE) targetScale = SHELF_MIN_SIZE / (float) window->width (); if (handleShelfInfo ()) adjustIPW (); cWindow->addDamage (); } /* Binding for toggle mode. * Toggles through three preset scale levels, * currently hard coded to 1.0f (no scale), 0.5f and 0.25f. */ bool ShelfScreen::trigger (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (screen->activeWindow ()); if (!w) return true; SHELF_WINDOW (w); if (sw->targetScale > 0.5f) sw->scale (0.5f); else if (sw->targetScale <= 0.5f && sw->targetScale > 0.25) sw->scale (0.25f); else sw->scale (1.0f); toggleWindowFunctions (w, true); toggleScreenFunctions (true); return true; } /* Reset window to 1.0f scale */ bool ShelfScreen::reset (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (screen->activeWindow ()); if (!w) return true; SHELF_WINDOW (w); sw->scale (1.0f); toggleWindowFunctions (w, true); toggleScreenFunctions (true); return true; } /* Returns the ratio to multiply by to get a window that's 1/ration the * size of the screen. */ static inline float shelfRat (CompWindow *w, float ratio) { float winHeight = (float) w->height (); float winWidth = (float) w->width (); float screenHeight = (float) screen->height (); float screenWidth = (float) screen->width (); float ret; if (winHeight / screenHeight < winWidth / screenWidth) ret = screenWidth / winWidth; else ret = screenHeight / winHeight; return ret / ratio; } bool ShelfScreen::triggerScreen (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (screen->activeWindow ()); if (!w) return true; SHELF_WINDOW (w); /* FIXME: better should save calculated ratio and reuse it */ if (sw->targetScale > shelfRat (w, 2.0f)) sw->scale (shelfRat (w, 2.0f)); else if (sw->targetScale <= shelfRat (w, 2.0f) && sw->targetScale > shelfRat (w, 3.0f)) sw->scale (shelfRat (w, 3.0f)); else if (sw->targetScale <= shelfRat (w, 3.0f) && sw->targetScale > shelfRat (w, 6.0f)) sw->scale (shelfRat (w, 6.0f)); else sw->scale (1.0f); toggleWindowFunctions (w, true); toggleScreenFunctions (true); return true; } /* shelfInc and shelfDec are matcing functions and bindings; * They increase and decrease the scale factor by 'interval'. */ bool ShelfScreen::inc (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (screen->activeWindow ()); if (!w) return true; SHELF_WINDOW (w); sw->scale (sw->targetScale / optionGetInterval ()); toggleWindowFunctions (w, true); toggleScreenFunctions (true); return true; } bool ShelfScreen::dec (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (screen->activeWindow ()); if (!w) return true; SHELF_WINDOW (w); sw->scale (sw->targetScale * optionGetInterval ()); toggleWindowFunctions (w, true); toggleScreenFunctions (true); return true; } void ShelfWindow::handleButtonPress (unsigned int x, unsigned int y) { SHELF_SCREEN (screen); if (!screen->otherGrabExist ("shelf", 0)) { window->activate (); ss->grabbedWindow = window->id (); ss->grabIndex = screen->pushGrab (ss->moveCursor, "shelf"); ss->lastPointerX = x; ss->lastPointerY = y; } } void ShelfScreen::handleMotionEvent (unsigned int x, unsigned int y) { CompWindow *w; int dx, dy; if (!grabIndex) return; w = screen->findWindow (grabbedWindow); if (!w) return; dx = x - lastPointerX; dy = y - lastPointerY; w->move (dx, dy, true); lastPointerX += dx; lastPointerY += dy; } void ShelfWindow::handleButtonRelease () { SHELF_SCREEN (screen); ss->grabbedWindow = None; if (ss->grabIndex) { window->moveInputFocusTo (); screen->removeGrab (ss->grabIndex, NULL); ss->grabIndex = 0; } } void ShelfWindow::handleEnter (XEvent *event) { XEvent enterEvent; memcpy (&enterEvent.xcrossing, &event->xcrossing, sizeof (XCrossingEvent)); enterEvent.xcrossing.window = window->id (); XSendEvent (screen->dpy (), window->id (), false, EnterWindowMask, &enterEvent); } CompWindow * ShelfScreen::findRealWindowID (Window wid) { CompWindow *orig; orig = screen->findWindow (wid); if (!orig) return NULL; return ShelfWindow::get (orig)->getRealWindow (); } void ShelfScreen::handleEvent (XEvent *event) { CompWindow *w = NULL, *oldPrev = NULL, *oldNext = NULL; switch (event->type) { case EnterNotify: w = findRealWindowID (event->xcrossing.window); if (w) ShelfWindow::get (w)->handleEnter (event); break; case ButtonPress: w = findRealWindowID (event->xbutton.window); if (w) ShelfWindow::get (w)->handleButtonPress (event->xbutton.x_root, event->xbutton.y_root); break; case ButtonRelease: w = screen->findWindow (grabbedWindow); if (w) ShelfWindow::get (w)->handleButtonRelease (); break; case MotionNotify: handleMotionEvent (event->xmotion.x_root, event->xmotion.y_root); break; case ConfigureNotify: w = screen->findWindow (event->xconfigure.window); if (w) { oldPrev = w->prev; oldNext = w->next; } break; } screen->handleEvent (event); switch (event->type) { case ConfigureNotify: if (w) /* already assigned above */ { if (w->prev != oldPrev || w->next != oldNext) { /* restacking occured, ensure ipw stacking */ adjustIPWStacking (); } } break; } } /* The window was damaged, adjust the damage to fit the actual area we * care about. */ bool ShelfWindow::damageRect (bool initial, const CompRect &rect) { bool status = false; if (mScale != 1.0f) { float xTranslate, yTranslate; xTranslate = window->border ().left * (mScale - 1.0f); yTranslate = window->border ().top * (mScale - 1.0f); cWindow->damageTransformedRect (mScale, mScale, xTranslate, yTranslate, rect); status = true; } status |= cWindow->damageRect (initial, rect); return status; } /* Scale the window if it is supposed to be scaled. * Translate into place. * * FIXME: Merge the two translations. */ bool ShelfWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (targetScale != mScale && steps) { mScale += (float) steps * (targetScale - mScale); if (fabsf (targetScale - mScale) < 0.005) mScale = targetScale; } if (mScale != 1.0f) { GLMatrix mTransform = transform; float xTranslate, yTranslate; xTranslate = window->border ().left * (mScale - 1.0f); yTranslate = window->border ().top * (mScale - 1.0f); mTransform.translate (window->x (), window->y (), 0); mTransform.scale (mScale, mScale, 0); mTransform.translate (xTranslate / mScale - window->x (), yTranslate / mScale - window->y (), 0.0f); mask |= PAINT_WINDOW_TRANSFORMED_MASK; return gWindow->glPaint (attrib, mTransform, region, mask); } else { return gWindow->glPaint (attrib, transform, region, mask); } } bool ShelfScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (!shelfedWindows.empty ()) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; return gScreen->glPaintOutput (attrib, transform, region, output, mask); } /* Checks to see if we need to adjust the window further and hence * damages it's area. Also checks if we still need to paint the area of the * window */ void ShelfScreen::donePaint () { bool stillPainting = false; /* Fixme: should create internal window list */ foreach (CompWindow *w, screen->windows ()) { SHELF_WINDOW (w); if (sw->mScale != sw->targetScale) { sw->cWindow->addDamage (); } if (sw->mScale == 1.0f && sw->targetScale == 1.0f) toggleWindowFunctions (w, false); else stillPainting = true; } if (!stillPainting) toggleScreenFunctions (false); cScreen->donePaint (); } void ShelfWindow::moveNotify (int dx, int dy, bool immediate) { if (targetScale != 1.00f) adjustIPW (); window->moveNotify (dx, dy, immediate); } /* Configuration, initialization, boring stuff. --------------------- */ ShelfScreen::ShelfScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), grabIndex (0), grabbedWindow (None), moveCursor (XCreateFontCursor (screen->dpy (), XC_fleur)), lastPointerX (0), lastPointerY (0) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); optionSetTriggerKeyInitiate (boost::bind (&ShelfScreen::trigger, this, _1, _2, _3)); optionSetResetKeyInitiate (boost::bind (&ShelfScreen::reset, this, _1 , _2, _3)); optionSetTriggerscreenKeyInitiate (boost::bind (&ShelfScreen::triggerScreen, this, _1, _2, _3)); optionSetIncButtonInitiate (boost::bind (&ShelfScreen::inc, this, _1, _2, _3)); optionSetDecButtonInitiate (boost::bind (&ShelfScreen::dec, this, _1, _2, _3)); } ShelfScreen::~ShelfScreen () { if (moveCursor) XFreeCursor (screen->dpy (), moveCursor); } ShelfWindow::ShelfWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), mScale (1.0f), targetScale (1.0f), steps (0), info (NULL) { WindowInterface::setHandler (window, false); CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); } ShelfWindow::~ShelfWindow () { if (info) { targetScale = 1.0f; /* implicitly frees sw->info */ handleShelfInfo (); } } /* Check for necessary plugin dependencies and for Xorg shape extension. * If we don't have either, bail out */ bool ShelfPluginVTable::init () { if (!screen->XShape ()) { compLogMessage ("shelf", CompLogLevelError, "No Shape extension found. Shelfing not possible \n"); return false; } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/shelf/src/shelf.h0000644000015301777760000001067012321343002022321 0ustar pbusernogroup00000000000000/* * Compiz Shelf plugin * * shelf.h * * Copyright (C) 2007 Canonical Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Kristian Lyngstøl * Danny Baumann * Sam Spilsbury * * Description: * * This plugin visually resizes a window to allow otherwise obtrusive * windows to be visible in a monitor-fashion. Use case: Anything with * progress bars, notification programs, etc. * * Todo: * - Check for XShape events * - Handle input in a sane way * - Mouse-over? */ #include #include #include #include #include #include #include "shelf_options.h" class ShelfedWindowInfo { public: ShelfedWindowInfo (CompWindow *); ~ShelfedWindowInfo (); public: CompWindow *w; Window ipw; XRectangle *inputRects; int nInputRects; int inputRectOrdering; XRectangle *frameInputRects; int frameNInputRects; int frameInputRectOrdering; }; class ShelfWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: ShelfWindow (CompWindow *); ~ShelfWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; float mScale; float targetScale; float steps; ShelfedWindowInfo *info; void moveNotify (int, int, bool); bool damageRect (bool, const CompRect &); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void saveInputShape (XRectangle **rectRects, int *retCount, int *retOrdering); CompWindow * getRealWindow (); void shapeInput (); void unshapeInput (); void adjustIPW (); void createIPW (); bool handleShelfInfo (); void scale (float fScale); void handleButtonPress (unsigned int x, unsigned int y); void handleButtonRelease (); void handleEnter (XEvent *event); }; #define SHELF_WINDOW(w) \ ShelfWindow *sw = ShelfWindow::get (w) class ShelfScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public ShelfOptions { public: ShelfScreen (CompScreen *); ~ShelfScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CompScreen::GrabHandle grabIndex; Window grabbedWindow; Cursor moveCursor; unsigned int lastPointerX; unsigned int lastPointerY; std::list shelfedWindows; void handleEvent (XEvent *); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void donePaint (); void addWindowToList (ShelfedWindowInfo *info); void removeWindowFromList (ShelfedWindowInfo *info); void adjustIPWStacking (); void handleMotionEvent (unsigned int x, unsigned int y); bool trigger (CompAction *action, CompAction::State state, CompOption::Vector options); bool reset (CompAction *action, CompAction::State state, CompOption::Vector options); bool triggerScreen (CompAction *action, CompAction::State state, CompOption::Vector options); bool inc (CompAction *action, CompAction::State state, CompOption::Vector options); bool dec (CompAction *action, CompAction::State state, CompOption::Vector options); CompWindow * findRealWindowID (Window wid); }; #define SHELF_SCREEN(w) \ ShelfScreen *ss = ShelfScreen::get (w) extern const float SHELF_MIN_SIZE; // Minimum pixelsize a window can be scaled to class ShelfPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/shelf/shelf.xml.in0000644000015301777760000000467312321343002022516 0ustar pbusernogroup00000000000000 <_short>Shelf <_long>Visually scales a window down to allow easy monitoring without true/traditional resizing. Window Management opengl composite opengl wall decor <_short>Bindings compiz-0.9.11+14.04.20140409/plugins/annotate/0000755000015301777760000000000012321344021020766 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/annotate/annotate.xml.in0000644000015301777760000000552012321343002023726 0ustar pbusernogroup00000000000000 <_short>Annotate <_long>Annotate plugin Extras decor opengl compiz-0.9.11+14.04.20140409/plugins/annotate/CMakeLists.txt0000644000015301777760000000023012321343002023517 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(annotate PLUGINDEPS composite opengl PKGDEPS pangocairo cairo cairo-xlib-xrender) compiz-0.9.11+14.04.20140409/plugins/annotate/src/0000755000015301777760000000000012321344021021555 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/annotate/src/annotate.cpp0000644000015301777760000006715112321343002024102 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "annotate.h" COMPIZ_PLUGIN_20090315 (annotate, AnnoPluginVTable) #define DEG2RAD (M_PI / 180.0f) void AnnoScreen::cairoClear (cairo_t *cr) { cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); content = false; } cairo_t * AnnoScreen::cairoContext () { if (!cairo) { XRenderPictFormat *format; Screen *xScreen; xScreen = ScreenOfDisplay (screen->dpy (), screen->screenNum ()); int w = screen->width (); int h = screen->height (); format = XRenderFindStandardFormat (screen->dpy (), PictStandardARGB32); pixmap = XCreatePixmap (screen->dpy (), screen->root (), w, h, 32); texture = GLTexture::bindPixmapToTexture (pixmap, w, h, 32); if (texture.empty ()) { compLogMessage ("annotate", CompLogLevelError, "Couldn't bind pixmap 0x%x to texture", (int) pixmap); XFreePixmap (screen->dpy (), pixmap); return NULL; } damage = XDamageCreate (screen->dpy (), pixmap, XDamageReportBoundingBox); surface = cairo_xlib_surface_create_with_xrender_format (screen->dpy (), pixmap, xScreen, format, w, h); cairo = cairo_create (surface); if (cairoBuffer.size ()) { cairo_t *cr = cairo_create (surface); int stride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32, w); cairo_surface_t *raw_source = cairo_image_surface_create_for_data ((unsigned char *) cairoBuffer.c_str (), CAIRO_FORMAT_ARGB32, w, h, stride); if (cr && raw_source) { cairo_set_source_surface (cr, raw_source, 0, 0); cairo_paint (cr); cairo_surface_destroy (raw_source); cairo_destroy (cr); cairoBuffer.clear (); } } else cairoClear (cairo); } return cairo; } void AnnoScreen::setSourceColor (cairo_t *cr, unsigned short *color) { cairo_set_source_rgba (cr, (double) color[0] / 0xffff, (double) color[1] / 0xffff, (double) color[2] / 0xffff, (double) color[3] / 0xffff); } void AnnoScreen::drawEllipse (double xc, double yc, double radiusX, double radiusY, unsigned short *fillColor, unsigned short *strokeColor, double strokeWidth) { cairo_t *cr = cairoContext (); if (cr) { setSourceColor (cr, fillColor); cairo_save (cr); cairo_translate (cr, xc, yc); if (radiusX > radiusY) { cairo_scale (cr, 1.0, radiusY/radiusX); cairo_arc (cr, 0, 0, radiusX, 0, 2 * M_PI); } else { cairo_scale (cr, radiusX/radiusY, 1.0); cairo_arc (cr, 0, 0, radiusY, 0, 2 * M_PI); } cairo_restore (cr); cairo_fill_preserve (cr); cairo_set_line_width (cr, strokeWidth); setSourceColor (cr, strokeColor); cairo_stroke (cr); content = true; } } void AnnoScreen::drawRectangle (double x, double y, double w, double h, unsigned short *fillColor, unsigned short *strokeColor, double strokeWidth) { cairo_t *cr = cairoContext (); if (cr) { double ex1, ey1, ex2, ey2; setSourceColor (cr, fillColor); cairo_rectangle (cr, x, y, w, h); cairo_fill_preserve (cr); cairo_set_line_width (cr, strokeWidth); cairo_stroke_extents (cr, &ex1, &ey1, &ex2, &ey2); setSourceColor (cr, strokeColor); cairo_stroke (cr); content = true; } } void AnnoScreen::drawLine (double x1, double y1, double x2, double y2, double width, unsigned short *color) { cairo_t *cr = cairoContext (); if (cr) { double ex1, ey1, ex2, ey2; cairo_set_line_width (cr, width); cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_stroke_extents (cr, &ex1, &ey1, &ex2, &ey2); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); setSourceColor (cr, color); cairo_stroke (cr); content = true; } } void AnnoScreen::drawText (double x, double y, const char *text, const char *fontFamily, double fontSize, cairo_font_slant_t fontSlant, cairo_font_weight_t fontWeight, unsigned short *fillColor, unsigned short *strokeColor, double strokeWidth) { REGION reg; cairo_t *cr = cairoContext (); if (cr) { cairo_text_extents_t extents; cairo_set_line_width (cr, strokeWidth); setSourceColor (cr, fillColor); cairo_select_font_face (cr, fontFamily, fontSlant, fontWeight); cairo_set_font_size (cr, fontSize); cairo_text_extents (cr, text, &extents); cairo_save (cr); cairo_move_to (cr, x, y); cairo_text_path (cr, text); cairo_fill_preserve (cr); setSourceColor (cr, strokeColor); cairo_stroke (cr); cairo_restore (cr); reg.rects = ®.extents; reg.numRects = 1; reg.extents.x1 = x; reg.extents.y1 = y + extents.y_bearing - 2.0; reg.extents.x2 = x + extents.width + 20.0; reg.extents.y2 = y + extents.height; content = true; } } /* DBUS Interface (TODO: plugin interface) */ /* Here, you can use DBUS or any other plugin via the action system to draw on * the screen using cairo. Parameters are as follows: * "tool": ["rectangle", "circle", "line", "text"] default: "line" * - This allows you to select what you want to draw * Tool-specific parameters: * - * "circle" * - * - "xc" float, default: 0 - X Center * - * - "yc" float, default: 0 - Y Center * - * - "radius" float, default: 0 - Radius * - * "rectangle" * - * - "x" float, default: 0 - X Point * - * - "y" float, default: 0 - Y Point * - * - "width" float, default: 0 - Width * - * - "height" float, default: 0 - Height * - * "line" * - * - "x1" float, default: 0 - X Point 1 * - * - "y1" float, default: 0 - Y Point 1 * - * - "x2" float, default: 0 - X Point 2 * - * - "y2" float, default: 0 - Y Point 2 * - * "text" * - * - "slant" string, default: "" - ["oblique", "italic", ""] - Text Slant * - * - "weight" string, default: " - ["bold", ""] - Text Weight * - * - "text" string, default: "" - Any Character - The text to display * - * - "family" float, default: "Sans" - The font family * - * - "size" float, default: 36.0 - Font Size * - * - "x" float, default: 0 - X Point * - * - "u" float, default: 0 - Y Point * Other parameters are: * - * - "fill_color" float, default: 0 - Drawing Fill Color * - * - "stroke_color" float, default: 0 - Drawing Border Color * - * - "line_width" float, default: 0 - Drawing Width * - * - "stroke_width" float, default: 0 - Drawing Height * - * - All of these are taken from the builtin options if not provided */ bool AnnoScreen::draw (CompAction *action, CompAction::State state, CompOption::Vector &options) { cairo_t *cr = cairoContext (); if (cr) { const char *tool; unsigned short *fillColor, *strokeColor; tool = CompOption::getStringOptionNamed (options, "tool", "line").c_str (); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); fillColor = optionGetFillColor (); fillColor = CompOption::getColorOptionNamed (options, "fill_color", fillColor); strokeColor = optionGetStrokeColor (); strokeColor = CompOption::getColorOptionNamed (options, "stroke_color", strokeColor); double strokeWidth = optionGetStrokeWidth (); strokeWidth = CompOption::getFloatOptionNamed (options, "stroke_width", strokeWidth); if (strcasecmp (tool, "rectangle") == 0) { double x = CompOption::getFloatOptionNamed (options, "x", 0); double y = CompOption::getFloatOptionNamed (options, "y", 0); double w = CompOption::getFloatOptionNamed (options, "w", 100); double h = CompOption::getFloatOptionNamed (options, "h", 100); drawRectangle (x, y, w, h, fillColor, strokeColor, strokeWidth); } else if (strcasecmp (tool, "ellipse") == 0) { double xc = CompOption::getFloatOptionNamed (options, "xc", 0); double yc = CompOption::getFloatOptionNamed (options, "yc", 0); double xr = CompOption::getFloatOptionNamed (options, "radiusX", 100); double yr = CompOption::getFloatOptionNamed (options, "radiusY", 100); drawEllipse (xc, yc, xr, yr, fillColor, strokeColor, strokeWidth); } else if (strcasecmp (tool, "line") == 0) { double x1 = CompOption::getFloatOptionNamed (options, "x1", 0); double y1 = CompOption::getFloatOptionNamed (options, "y1", 0); double x2 = CompOption::getFloatOptionNamed (options, "x2", 100); double y2 = CompOption::getFloatOptionNamed (options, "y2", 100); drawLine (x1, y1, x2, y2, strokeWidth, fillColor); } else if (strcasecmp (tool, "text") == 0) { const char *text, *family; cairo_font_slant_t slant; cairo_font_weight_t weight; const char *str; str = CompOption::getStringOptionNamed (options, "slant", "").c_str (); if (strcasecmp (str, "oblique") == 0) slant = CAIRO_FONT_SLANT_OBLIQUE; else if (strcasecmp (str, "italic") == 0) slant = CAIRO_FONT_SLANT_ITALIC; else slant = CAIRO_FONT_SLANT_NORMAL; str = CompOption::getStringOptionNamed (options, "weight", "").c_str (); if (strcasecmp (str, "bold") == 0) weight = CAIRO_FONT_WEIGHT_BOLD; else weight = CAIRO_FONT_WEIGHT_NORMAL; double x = CompOption::getFloatOptionNamed (options, "x", 0); double y = CompOption::getFloatOptionNamed (options, "y", 0); text = CompOption::getStringOptionNamed (options, "text", "").c_str (); family = CompOption::getStringOptionNamed (options, "family", "Sans").c_str (); double size = CompOption::getFloatOptionNamed (options, "size", 36.0); drawText (x, y, text, family, size, slant, weight, fillColor, strokeColor, strokeWidth); } } return true; } bool AnnoScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector& options) { if (grabIndex) { screen->removeGrab (grabIndex, NULL); grabIndex = 0; } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); switch (drawMode) { case LineMode: drawLine (initialPointerX, initialPointerY, lineVector.x (), lineVector.y (), optionGetStrokeWidth (), optionGetStrokeColor ()); break; case RectangleMode: drawRectangle (rectangle.x (), rectangle.y (), rectangle.width (), rectangle.height (), optionGetFillColor (), optionGetStrokeColor (), optionGetStrokeWidth ()); break; case EllipseMode: drawEllipse (ellipse.center.x (), ellipse.center.y (), ellipse.radiusX, ellipse.radiusY, optionGetFillColor (), optionGetStrokeColor (), optionGetStrokeWidth ()); break; default: break; } drawMode = NoMode; return false; } bool AnnoScreen::initiateErase (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist (NULL)) return false; if (!grabIndex) grabIndex = screen->pushGrab (None, "annotate"); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); annoLastPointerX = pointerX; annoLastPointerY = pointerY; drawMode = EraseMode; screen->handleEventSetEnabled (this, true); return false; } bool AnnoScreen::initiateFreeDraw (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist (NULL)) return false; if (!grabIndex) grabIndex = screen->pushGrab (None, "annotate"); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); annoLastPointerX = pointerX; annoLastPointerY = pointerY; drawMode = FreeDrawMode; screen->handleEventSetEnabled (this, true); return true; } bool AnnoScreen::initiateLine (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist (NULL)) return false; if (!grabIndex) grabIndex = screen->pushGrab (None, "annotate"); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); initialPointerX = pointerX; initialPointerY = pointerY; drawMode = LineMode; screen->handleEventSetEnabled (this, true); return true; } bool AnnoScreen::initiateRectangle (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist (NULL)) return false; if (!grabIndex) grabIndex = screen->pushGrab (None, "annotate"); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); drawMode = RectangleMode; initialPointerX = pointerX; initialPointerY = pointerY; rectangle.setGeometry (initialPointerX, initialPointerY, 0, 0); lastRect = rectangle; screen->handleEventSetEnabled (this, true); return true; } bool AnnoScreen::initiateEllipse (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist (NULL)) return false; if (!grabIndex) grabIndex = screen->pushGrab (None, "annotate"); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); drawMode = EllipseMode; initialPointerX = pointerX; initialPointerY = pointerY; ellipse.radiusX = 0; ellipse.radiusY = 0; lastRect.setGeometry (initialPointerX, initialPointerY, 0, 0); screen->handleEventSetEnabled (this, true); return true; } bool AnnoScreen::clear (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (content) { cairo_t *cr = cairoContext (); if (cr) cairoClear (cairo); cScreen->damageScreen (); /* We don't need to refresh the screen or handle events anymore */ screen->handleEventSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); } return true; } bool AnnoScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (status) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLfloat vertexData[18]; GLfloat textureData[12]; CompRect rect; GLMatrix sTransform = transform; int numRect; int pos = 0; int angle; float offset = optionGetStrokeWidth () / 2; /* This replaced prepareXCoords (s, output, -DEFAULT_Z_CAMERA) */ sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glEnable (GL_BLEND); if (content && !region.isEmpty ()) { foreach (GLTexture *tex, texture) { CompRect::vector rect = region.rects (); numRect = region.rects ().size (); tex->enable (GLTexture::Fast); streamingBuffer->begin (GL_TRIANGLES); while (numRect--) { GLfloat tx1 = COMP_TEX_COORD_X (tex->matrix (), rect.at (pos).x1 ()); GLfloat tx2 = COMP_TEX_COORD_X (tex->matrix (), rect.at (pos).x2 ()); GLfloat ty1 = COMP_TEX_COORD_Y (tex->matrix (), rect.at (pos).y1 ()); GLfloat ty2 = COMP_TEX_COORD_Y (tex->matrix (), rect.at (pos).y2 ()); vertexData[0] = rect.at (pos).x1 (); vertexData[1] = rect.at (pos).y1 (); vertexData[2] = 0.0f; vertexData[3] = rect.at (pos).x1 (); vertexData[4] = rect.at (pos).y2 (); vertexData[5] = 0.0f; vertexData[6] = rect.at (pos).x2 (); vertexData[7] = rect.at (pos).y1 (); vertexData[8] = 0.0f; vertexData[9] = rect.at (pos).x1 (); vertexData[10] = rect.at (pos).y2 (); vertexData[11] = 0.0f; vertexData[12] = rect.at (pos).x2 (); vertexData[13] = rect.at (pos).y2 (); vertexData[14] = 0.0f; vertexData[15] = rect.at (pos).x2 (); vertexData[16] = rect.at (pos).y1 (); vertexData[17] = 0.0f; textureData[0] = tx1; textureData[1] = ty1; textureData[2] = tx1; textureData[3] = ty2; textureData[4] = tx2; textureData[5] = ty1; textureData[6] = tx1; textureData[7] = ty2; textureData[8] = tx2; textureData[9] = ty2; textureData[10] = tx2; textureData[11] = ty1; streamingBuffer->addVertices (6, vertexData); streamingBuffer->addTexCoords (0, 6, textureData); ++pos; } streamingBuffer->end (); streamingBuffer->render (sTransform); tex->disable (); } } switch (drawMode) { case LineMode: glLineWidth (optionGetStrokeWidth ()); streamingBuffer->begin (GL_LINES); streamingBuffer->addColors (1, optionGetStrokeColor ()); vertexData[0] = initialPointerX; vertexData[1] = initialPointerY; vertexData[2] = 0.0f; vertexData[3] = lineVector.x (); vertexData[4] = lineVector.y (); vertexData[5] = 0.0f; streamingBuffer->addVertices (2, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); break; case RectangleMode: vertexData[0] = rectangle.x1 (); vertexData[1] = rectangle.y1 (); vertexData[2] = 0.0f; vertexData[3] = rectangle.x1 (); vertexData[4] = rectangle.y2 (); vertexData[5] = 0.0f; vertexData[6] = rectangle.x2 (); vertexData[7] = rectangle.y1 (); vertexData[8] = 0.0f; vertexData[9] = rectangle.x2 (); vertexData[10] = rectangle.y2 (); vertexData[11] = 0.0f; /* fill rectangle */ streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, optionGetFillColor ()); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); /* draw rectangle outline */ vertexData[0] = rectangle.x1 (); vertexData[1] = rectangle.y1 (); vertexData[2] = 0.0f; vertexData[3] = rectangle.x2 (); vertexData[4] = rectangle.y1 (); vertexData[5] = 0.0f; vertexData[6] = rectangle.x2 (); vertexData[7] = rectangle.y2 (); vertexData[8] = 0.0f; vertexData[9] = rectangle.x1 (); vertexData[10] = rectangle.y2 (); vertexData[11] = 0.0f; glLineWidth (optionGetStrokeWidth ()); streamingBuffer->begin (GL_LINE_LOOP); streamingBuffer->addColors (1, optionGetStrokeColor ()); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); break; case EllipseMode: /* fill ellipse */ streamingBuffer->begin (GL_TRIANGLE_FAN); streamingBuffer->addColors (1, optionGetFillColor ()); vertexData[0] = ellipse.center.x (); vertexData[1] = ellipse.center.y (); vertexData[2] = 0.0f; streamingBuffer->addVertices (1, vertexData); for (angle = 0; angle <= 360; angle += 1) { vertexData[0] = ellipse.center.x () + (ellipse.radiusX * sinf (angle * DEG2RAD)); vertexData[1] = ellipse.center.y () + (ellipse.radiusY * cosf (angle * DEG2RAD)); streamingBuffer->addVertices (1, vertexData); } vertexData[0] = ellipse.center.x (); vertexData[1] = ellipse.center.y () + ellipse.radiusY; streamingBuffer->addVertices (1, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); /* draw ellipse outline */ glLineWidth (optionGetStrokeWidth ()); streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, optionGetStrokeColor ()); vertexData[0] = ellipse.center.x (); vertexData[1] = ellipse.center.y () + ellipse.radiusY - offset; vertexData[2] = 0.0f; streamingBuffer->addVertices (1, vertexData); for (angle = 360; angle >= 0; angle -= 1) { vertexData[0] = ellipse.center.x () + ((ellipse.radiusX - offset) * sinf (angle * DEG2RAD)); vertexData[1] = ellipse.center.y () + ((ellipse.radiusY - offset) * cosf (angle * DEG2RAD)); vertexData[2] = 0.0f; vertexData[3] = ellipse.center.x () + ((ellipse.radiusX + offset) * sinf (angle * DEG2RAD)); vertexData[4] = ellipse.center.y () + ((ellipse.radiusY + offset) * cosf (angle * DEG2RAD)); vertexData[5] = 0.0f; streamingBuffer->addVertices (2, vertexData); } vertexData[0] = ellipse.center.x (); vertexData[1] = ellipse.center.y () + ellipse.radiusY + offset; streamingBuffer->addVertices (1, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); break; default: break; } glDisable (GL_BLEND); } return status; } void AnnoScreen::handleMotionEvent (int xRoot, int yRoot) { CompRect damageRect; if (grabIndex) { static unsigned short clearColor[] = { 0, 0, 0, 0 }; switch (drawMode) { case EraseMode: drawLine (annoLastPointerX, annoLastPointerY, xRoot, yRoot, optionGetEraseWidth (), clearColor); break; case FreeDrawMode: drawLine (annoLastPointerX, annoLastPointerY, xRoot, yRoot, optionGetStrokeWidth (), optionGetStrokeColor ()); break; case LineMode: lineVector.setX (xRoot); lineVector.setY (yRoot); damageRect.setGeometry (MIN(initialPointerX, lineVector.x ()), MIN(initialPointerY, lineVector.y ()), abs (lineVector.x () - initialPointerX), abs (lineVector.y () - initialPointerY)); break; case RectangleMode: if (optionGetDrawShapesFromCenter ()) rectangle.setGeometry (initialPointerX - abs (xRoot - initialPointerX), initialPointerY - abs (yRoot - initialPointerY), (abs (xRoot - initialPointerX)) * 2, (abs (yRoot - initialPointerY)) * 2); else rectangle.setGeometry (MIN(initialPointerX, xRoot), MIN(initialPointerY, yRoot), abs (xRoot - initialPointerX), abs (yRoot - initialPointerY)); damageRect = rectangle; break; case EllipseMode: if (optionGetDrawShapesFromCenter ()) { ellipse.center.setX (initialPointerX); ellipse.center.setY (initialPointerY); } else { ellipse.center.setX (initialPointerX + (xRoot - initialPointerX) / 2); ellipse.center.setY (initialPointerY + (yRoot - initialPointerY) / 2); } ellipse.radiusX = abs (xRoot - ellipse.center.x ()); ellipse.radiusY = abs (yRoot - ellipse.center.y ()); damageRect = CompRect (ellipse.center.x () - ellipse.radiusX, ellipse.center.y () - ellipse.radiusY, ellipse.radiusX * 2, ellipse.radiusY * 2); break; default: break; } if (cScreen && (drawMode == LineMode || drawMode == RectangleMode || drawMode == EllipseMode)) { /* Add border width to the damage region */ damageRect.setGeometry (damageRect.x () - (optionGetStrokeWidth () / 2), damageRect.y () - (optionGetStrokeWidth () / 2), damageRect.width () + optionGetStrokeWidth () + 1, damageRect.height () + optionGetStrokeWidth () + 1); cScreen->damageRegion (damageRect); cScreen->damageRegion (lastRect); lastRect = damageRect; } annoLastPointerX = xRoot; annoLastPointerY = yRoot; gScreen->glPaintOutputSetEnabled (this, true); } } void AnnoScreen::handleEvent (XEvent *event) { switch (event->type) { case MotionNotify: case EnterNotify: case LeaveNotify: handleMotionEvent (pointerX, pointerY); break; default: if (event->type == cScreen->damageEvent () + XDamageNotify) { XDamageNotifyEvent *de = (XDamageNotifyEvent *) event; if (pixmap == de->drawable) cScreen->damageRegion (CompRegion (CompRect (de->area))); } break; } screen->handleEvent (event); } AnnoScreen::AnnoScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), grabIndex (0), pixmap (None), surface (NULL), cairo (NULL), content (false), damage (None) { ScreenInterface::setHandler (screen, false); GLScreenInterface::setHandler (gScreen, false); optionSetDrawInitiate (boost::bind (&AnnoScreen::draw, this, _1, _2, _3)); optionSetEraseButtonInitiate (boost::bind (&AnnoScreen::initiateErase, this, _1, _2, _3)); optionSetEraseButtonTerminate (boost::bind (&AnnoScreen::terminate, this, _1, _2, _3)); optionSetInitiateFreeDrawButtonInitiate (boost::bind (&AnnoScreen::initiateFreeDraw, this, _1, _2, _3)); optionSetInitiateFreeDrawButtonTerminate (boost::bind (&AnnoScreen::terminate, this, _1, _2, _3)); optionSetInitiateLineButtonInitiate (boost::bind (&AnnoScreen::initiateLine, this, _1, _2, _3)); optionSetInitiateLineButtonTerminate (boost::bind (&AnnoScreen::terminate, this, _1, _2, _3)); optionSetInitiateRectangleButtonInitiate (boost::bind (&AnnoScreen::initiateRectangle, this, _1, _2, _3)); optionSetInitiateRectangleButtonTerminate (boost::bind (&AnnoScreen::terminate, this, _1, _2, _3)); optionSetInitiateEllipseButtonInitiate (boost::bind (&AnnoScreen::initiateEllipse, this, _1, _2, _3)); optionSetInitiateEllipseButtonTerminate (boost::bind (&AnnoScreen::terminate, this, _1, _2, _3)); optionSetClearButtonInitiate (boost::bind (&AnnoScreen::clear, this, _1, _2, _3)); optionSetClearKeyInitiate (boost::bind (&AnnoScreen::clear, this, _1, _2, _3)); drawMode = NoMode; } AnnoScreen::~AnnoScreen () { if (cairo) cairo_destroy (cairo); if (surface) cairo_surface_destroy (surface); if (pixmap) XFreePixmap (screen->dpy (), pixmap); if (damage) XDamageDestroy (screen->dpy (), damage); } bool AnnoPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/annotate/src/annotate.h0000644000015301777760000001157512321343002023546 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "annotate_options.h" #include #include #include #include static int annoLastPointerX = 0; static int annoLastPointerY = 0; static int initialPointerX = 0; static int initialPointerY = 0; typedef struct _Ellipse { CompPoint center; int radiusX; int radiusY; } Ellipse; enum DrawMode { NoMode = 0, EraseMode, FreeDrawMode, LineMode, RectangleMode, EllipseMode, TextMode }; class AnnoScreen : public PluginClassHandler , public ScreenInterface, public GLScreenInterface, public AnnotateOptions { public: AnnoScreen (CompScreen *screen); ~AnnoScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CompScreen::GrabHandle grabIndex; Pixmap pixmap; GLTexture::List texture; cairo_surface_t *surface; cairo_t *cairo; CompString cairoBuffer; // used for serialization bool content; Damage damage; CompRect rectangle; CompRect lastRect; DrawMode drawMode; CompPoint lineVector; Ellipse ellipse; void handleEvent (XEvent *); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void cairoClear (cairo_t *cr); cairo_t * cairoContext (); void setSourceColor (cairo_t *cr, unsigned short *color); void drawLine (double x1, double y1, double x2, double y2, double width, unsigned short *color); void drawRectangle (double x, double y, double w, double h, unsigned short *fillColor, unsigned short *strokeColor, double strokeWidth); void drawEllipse (double xc, double yc, double radiusX, double radiusY, unsigned short *fillColor, unsigned short *strokeColor, double strokeWidth); void drawText (double x, double y, const char *text, const char *fontFamily, double fontSize, cairo_font_slant_t fontSlant, cairo_font_weight_t fontWeight, unsigned short *fillColor, unsigned short *strokeColor, double strokeWidth); /* Actions */ bool draw (CompAction *action, CompAction::State state, CompOption::Vector& options); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector& options); bool initiateErase (CompAction *action, CompAction::State state, CompOption::Vector& options); bool initiateFreeDraw (CompAction *action, CompAction::State state, CompOption::Vector& options); bool initiateLine (CompAction *action, CompAction::State state, CompOption::Vector& options); bool initiateRectangle (CompAction *action, CompAction::State state, CompOption::Vector& options); bool initiateEllipse (CompAction *action, CompAction::State state, CompOption::Vector& options); bool clear (CompAction *action, CompAction::State state, CompOption::Vector& options); void handleMotionEvent (int xRoot, int yRoot); }; #define ANNO_SCREEN(s) \ AnnoScreen *as = get (s); class AnnoPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/freewins/0000755000015301777760000000000012321344021020777 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/freewins/freewins.xml.in0000644000015301777760000003234612321343002023756 0ustar pbusernogroup00000000000000 <_short>Freely Transformable Windows <_long>Freely transform windows Effects opengl opengl scale ring shift shelf group wobbly animation water cubeaddon 3d compiz-0.9.11+14.04.20140409/plugins/freewins/CMakeLists.txt0000644000015301777760000000042312321343002023534 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) include (FindOpenGL) if (OPENGL_GLU_FOUND) compiz_plugin (freewins PLUGINDEPS composite opengl PKGDEPS cairo-xlib cairo LIBRARIES ${OPENGL_glu_LIBRARY} INCDIRS ${OPENGL_INCLUDE_DIR} LDFLAGSADD) endif (OPENGL_GLU_FOUND) compiz-0.9.11+14.04.20140409/plugins/freewins/src/0000755000015301777760000000000012321344021021566 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/freewins/src/freewins.cpp0000644000015301777760000002066512321343002024123 0ustar pbusernogroup00000000000000/** * Compiz Fusion Freewins plugin * * freewins.cpp * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * Sam Spilsbury * * Button binding support and Reset added by: * enigma_0Z * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Modifier key to rotate on the Z Axis * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ #include "freewins.h" COMPIZ_PLUGIN_20090315 (freewins, FWPluginVTable); /* Information on window resize */ void FWWindow::resizeNotify (int dx, int dy, int dw, int dh) { calculateInputRect (); int x = WIN_REAL_X(window) + WIN_REAL_W(window)/2.0; int y = WIN_REAL_Y(window) + WIN_REAL_H(window)/2.0; mRadius = sqrt(pow((x - WIN_REAL_X (window)), 2) + pow((y - WIN_REAL_Y (window)), 2)); window->resizeNotify (dx, dy, dw, dh); } void FWWindow::moveNotify (int dx, int dy, bool immediate) { FREEWINS_SCREEN (screen); /* Did we move and IPW and not the actual window? */ CompWindow *useWindow = fws->getRealWindow (window); if (useWindow) useWindow->move (dx, dy, fws->optionGetImmediateMoves ()); else if (window != fws->mGrabWindow) adjustIPW (); if (!useWindow) useWindow = window; int x = WIN_REAL_X (useWindow) + WIN_REAL_W (useWindow) /2.0; int y = WIN_REAL_Y (useWindow) + WIN_REAL_H (useWindow) /2.0; mRadius = sqrt (pow((x - WIN_REAL_X (useWindow)), 2) + pow ((y - WIN_REAL_Y (useWindow)), 2)); useWindow->moveNotify (dx, dy, immediate); } void FWScreen::reloadSnapKeys () { unsigned int imask = optionGetInvertModsMask (); mInvertMask = 0; if (imask & InvertModsShiftMask) mInvertMask |= ShiftMask; if (imask & InvertModsAltMask) mInvertMask |= CompAltMask; if (imask & InvertModsControlMask) mInvertMask |= ControlMask; if (imask & InvertModsMetaMask) mInvertMask |= CompMetaMask; unsigned int smask = optionGetSnapModsMask (); mSnapMask = 0; if (smask & SnapModsShiftMask) mSnapMask |= ShiftMask; if (smask & SnapModsAltMask) mSnapMask |= CompAltMask; if (smask & SnapModsControlMask) mSnapMask |= ControlMask; if (smask & SnapModsMetaMask) mSnapMask |= CompMetaMask; } void FWScreen::optionChanged (CompOption *option, FreewinsOptions::Options num) { switch (num) { case FreewinsOptions::SnapMods: case FreewinsOptions::InvertMods: reloadSnapKeys (); break; default: break; } } /* ------ Plugin Initialisation ---------------------------------------*/ /* Window initialisation / cleaning */ FWWindow::FWWindow (CompWindow *w) : PluginClassHandler (w), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), mIMidX (WIN_REAL_W (w) / 2.0), mIMidY (WIN_REAL_H (w) / 2.0), mOMidX (0.0f), mOMidY (0.0f), mAdjustX (0.0f), mAdjustY (0.0f), mOldWinX (0), mOldWinY (0), mWinH (0), mWinW (0), mDirection (UpDown), mCorner (CornerTopLeft), mInput (NULL), mOutputRect (w->outputRect ()), mInputRect (w->borderRect ()), mResetting (false), mIsAnimating (false), mCan2D (false), mCan3D (false), mTransformed (false), mGrab (grabNone) { WindowInterface::setHandler (window); CompositeWindowInterface::setHandler (cWindow); GLWindowInterface::setHandler (gWindow); int x = WIN_REAL_X (w) + WIN_REAL_W (w) /2.0; int y = WIN_REAL_Y (w) + WIN_REAL_H (w) /2.0; mRadius = sqrt (pow ((x - WIN_REAL_X (w)), 2) + pow ((y - WIN_REAL_Y (w)), 2)); } FWWindow::~FWWindow () { if (canShape ()) handleWindowInputInfo (); FREEWINS_SCREEN (screen); if (fws->mGrabWindow == window) fws->mGrabWindow = NULL; } #define ROTATE_INC optionGetRotateIncrementAmount () #define NEG_ROTATE_INC optionGetRotateIncrementAmount () *-1 #define SCALE_INC optionGetScaleIncrementAmount () #define NEG_SCALE_INC optionGetScaleIncrementAmount () *-1 FWScreen::FWScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mClick_root_x (0), mClick_root_y (0), mGrabWindow (NULL), mHoverWindow (NULL), mLastGrabWindow (NULL), mAxisHelp (false), mSnap (false), mInvert (false), mSnapMask (0), mInvertMask (0), mGrabIndex (0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); /* TODO: warning about shape! */ /* BCOP Action initiation */ optionSetInitiateRotationButtonInitiate (boost::bind (&FWScreen::initiateFWRotate, this, _1, _2, _3)); optionSetInitiateRotationButtonTerminate (boost::bind (&FWScreen::terminateFWRotate, this, _1, _2, _3)); optionSetInitiateScaleButtonInitiate (boost::bind (&FWScreen::initiateFWScale, this, _1, _2, _3)); optionSetInitiateScaleButtonTerminate (boost::bind (&FWScreen::terminateFWScale, this, _1, _2, _3)); optionSetResetButtonInitiate (boost::bind (&FWScreen::resetFWTransform, this, _1, _2, _3)); optionSetResetKeyInitiate (boost::bind (&FWScreen::resetFWTransform, this, _1, _2, _3)); optionSetToggleAxisKeyInitiate (boost::bind (&FWScreen::toggleFWAxis, this, _1, _2, _3)); // Rotate / Scale Up Down Left Right TODO: rebind these actions on option change optionSetScaleUpButtonInitiate (boost::bind (&FWScreen::scale, this, _1, _2, _3, SCALE_INC)); optionSetScaleDownButtonInitiate (boost::bind (&FWScreen::scale, this, _1, _2, _3, NEG_SCALE_INC)); optionSetScaleUpKeyInitiate (boost::bind (&FWScreen::scale, this, _1, _2, _3, SCALE_INC)); optionSetScaleDownKeyInitiate (boost::bind (&FWScreen::scale, this, _1, _2, _3, NEG_SCALE_INC)); optionSetRotateUpKeyInitiate (boost::bind (&FWScreen::rotate, this, _1, _2, _3, 0, ROTATE_INC, 0)); optionSetRotateDownKeyInitiate (boost::bind (&FWScreen::rotate, this, _1, _2, _3, 0, NEG_ROTATE_INC, 0)); optionSetRotateLeftKeyInitiate (boost::bind (&FWScreen::rotate, this, _1, _2, _3, ROTATE_INC, 0, 0)); optionSetRotateRightKeyInitiate (boost::bind (&FWScreen::rotate, this, _1, _2, _3, NEG_ROTATE_INC, 0, 0)); optionSetRotateCKeyInitiate (boost::bind (&FWScreen::rotate, this, _1, _2, _3, 0, 0, ROTATE_INC)); optionSetRotateCcKeyInitiate (boost::bind (&FWScreen::rotate, this, _1, _2, _3, 0, 0, NEG_ROTATE_INC)); optionSetRotateInitiate (boost::bind (&FWScreen::rotateAction, this, _1, _2, _3)); optionSetIncrementRotateInitiate (boost::bind (&FWScreen::incrementRotateAction, this, _1, _2, _3)); optionSetScaleInitiate (boost::bind (&FWScreen::scaleAction, this, _1, _2, _3)); optionSetSnapModsNotify (boost::bind (&FWScreen::optionChanged, this, _1, _2)); optionSetInvertModsNotify (boost::bind (&FWScreen::optionChanged, this, _1, _2)); reloadSnapKeys (); } bool FWPluginVTable::init () { if (!screen->XShape ()) { compLogMessage ("shelf", CompLogLevelError, "No Shape extension found. IPW Usage not enabled \n"); } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/freewins/src/freewins.h0000644000015301777760000002766312321343002023575 0ustar pbusernogroup00000000000000/** * Compiz Fusion Freewins plugin * * freewins.h * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * * Button binding support and Reset added by: * enigma_0Z * * Scaling, Animation, Input-Shaping, Snapping * and Key-Based Transformation added by: * Sam Spilsbury * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ #include #include #include #include #include #include #include #include #include #include #include #include #include "freewins_options.h" /* #define ABS(x) ((x)>0?(x):-(x)) */ #define D2R(x) ((x) * (M_PI / 180.0)) #define R2D(x) ((x) * (180 / M_PI)) /* ------ Macros ---------------------------------------------------------*/ #define WIN_OUTPUT_X(w) (w->x () - w->output ().left) #define WIN_OUTPUT_Y(w) (w->y () - w->output ().top) #define WIN_OUTPUT_W(w) (w->width () + w->output ().left + w->output ().right) #define WIN_OUTPUT_H(w) (w->height () + w->output ().top + w->output ().bottom) #define WIN_REAL_X(w) (w->x () - w->border ().left) #define WIN_REAL_Y(w) (w->y () - w->border ().top) #define WIN_REAL_W(w) (w->width () + w->border ().left + w->border ().right) #define WIN_REAL_H(w) (w->height () + w->border ().top + w->border ().bottom) #define WIN_CORNER1(w) GLVector ic1 = GLVector (WIN_REAL_X (w), WIN_REAL_Y (w), 0.0f, 1.0f); #define WIN_CORNER2(w) GLVector ic2 = GLVector (WIN_REAL_X (w) + WIN_REAL_W (w), WIN_REAL_Y (w), 0.0f, 1.0f); #define WIN_CORNER3(w) GLVector ic3 = GLVector (WIN_REAL_X (w), WIN_REAL_Y (w) + WIN_REAL_H (w), 0.0f, 1.0f); #define WIN_CORNER4(w) GLVector ic4 = GLVector (WIN_REAL_X (w) + WIN_REAL_W (w), WIN_REAL_Y (w) + WIN_REAL_H (w), 0.0f, 1.0f); #define WIN_OCORNER1(w) GLVector oc1 = GLVector (WIN_OUTPUT_X (w), WIN_OUTPUT_Y (w), 0.0f, 1.0f); #define WIN_OCORNER2(w) GLVector oc2 = GLVector (WIN_OUTPUT_X (w) + WIN_OUTPUT_W (w), WIN_OUTPUT_Y (w), 0.0f, 1.0f); #define WIN_OCORNER3(w) GLVector oc3 = GLVector (WIN_OUTPUT_X (w), WIN_OUTPUT_Y (w) + WIN_OUTPUT_H (w), 0.0f, 1.0f); #define WIN_OCORNER4(w) GLVector oc4 = GLVector ( WIN_OUTPUT_X (w) + WIN_OUTPUT_W (w), WIN_OUTPUT_Y (w) + WIN_OUTPUT_H (w), 0.0f, 1.0f); /* ------ Structures and Enums ------------------------------------------*/ /* Enums */ typedef enum _StartCorner { CornerTopLeft = 0, CornerTopRight = 1, CornerBottomLeft = 2, CornerBottomRight = 3 } StartCorner; typedef enum _FWGrabType { grabNone = 0, grabRotate, grabScale, grabMove, grabResize } FWGrabType; typedef enum _Direction { UpDown = 0, LeftRight = 1 } Direction; typedef enum _FWAxisType { axisX = 0, axisY, axisZ, axisXY, axisXZ, } FWAxisType; /* Shape info / restoration */ class FWWindowInputInfo { public: FWWindowInputInfo (CompWindow *); ~FWWindowInputInfo (); public: CompWindow *w; Window ipw; XRectangle *inputRects; int nInputRects; int inputRectOrdering; XRectangle *frameInputRects; int frameNInputRects; int frameInputRectOrdering; }; class FWWindowOutputInfo { public: float shapex1; float shapex2; float shapex3; float shapex4; float shapey1; float shapey2; float shapey3; float shapey4; }; /* Trackball */ /*typedef struct _FWTrackball { CompVector mouseX; CompVector mouse0; CompVector tr_axis; float tr_ang; float tr_radius; } FWTrackball;*/ /* Transformation info */ class FWTransformedWindowInfo { public: FWTransformedWindowInfo () : angX (0), angY (0), angZ (0), scaleX (1.0f), scaleY (1.0f), unsnapAngX (0), unsnapAngY (0), unsnapAngZ (0), unsnapScaleX (0), unsnapScaleY (0) {} //FWTrackball trackball; float angX; float angY; float angZ; float scaleX; float scaleY; // Window transformation /* Used for snapping */ float unsnapAngX; float unsnapAngY; float unsnapAngZ; float unsnapScaleX; float unsnapScaleY; }; class FWAnimationInfo { public: FWAnimationInfo () : oldAngX (0), oldAngY (0), oldAngZ (0), oldScaleX (1.0f), oldScaleY (1.0f), destAngX (0), destAngY (0), destAngZ (0), destScaleX (1.0f), destScaleY (1.0f), steps (0) {} // Old values to animate from float oldAngX; float oldAngY; float oldAngZ; float oldScaleX; float oldScaleY; // New values to animate to float destAngX; float destAngY; float destAngZ; float destScaleX; float destScaleY; // For animation float steps; }; class FWScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public FreewinsOptions { public: FWScreen (CompScreen *screen); CompositeScreen *cScreen; GLScreen *gScreen; std::list mTransformedWindows; int mClick_root_x; int mClick_root_y; CompWindow *mGrabWindow; CompWindow *mHoverWindow; CompWindow *mLastGrabWindow; bool mAxisHelp; bool mSnap; bool mInvert; int mSnapMask; int mInvertMask; Cursor mRotateCursor; CompScreen::GrabHandle mGrabIndex; void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); void handleEvent (XEvent *); void optionChanged (CompOption *option, FreewinsOptions::Options num); void reloadSnapKeys (); bool initiateFWRotate (CompAction *action, CompAction::State state, CompOption::Vector options); bool terminateFWRotate (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiateFWScale (CompAction *action, CompAction::State state, CompOption::Vector options); bool terminateFWScale (CompAction *action, CompAction::State state, CompOption::Vector options); bool rotate (CompAction *action, CompAction::State state, CompOption::Vector options, int dx, int dy, int dz); bool scale (CompAction *action, CompAction::State state, CompOption::Vector options, int scale); bool resetFWTransform (CompAction *action, CompAction::State state, CompOption::Vector options); bool rotateAction (CompAction *action, CompAction::State state, CompOption::Vector options); bool incrementRotateAction (CompAction *action, CompAction::State state, CompOption::Vector options); bool scaleAction (CompAction *action, CompAction::State state, CompOption::Vector options); bool toggleFWAxis (CompAction *action, CompAction::State state, CompOption::Vector options); void addWindowToList (FWWindowInputInfo *info); void removeWindowFromList (FWWindowInputInfo *info); void adjustIPWStacking (); void rotateProjectVector (GLVector &vector, GLMatrix &transform, GLdouble *resultX, GLdouble *resultY, GLdouble *resultZ); void perspectiveDistortAndResetZ (GLMatrix &transform); void modifyMatrix (GLMatrix &transform, float angX, float angY, float angZ, float tX, float tY, float tZ, float scX, float scY, float scZ, float adjustX, float adjustY, bool paint); CompRect createSizedRect (float xScreen1, float xScreen2, float xScreen3, float xScreen4, float yScreen1, float yScreen2, float yScreen3, float yScreen4); CompWindow * getRealWindow (CompWindow *w); }; /* Freewins Window Structure */ class FWWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: FWWindow (CompWindow *w); ~FWWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool damageRect (bool initial, const CompRect &); void moveNotify (int, int, bool); void resizeNotify (int, int, int, int); float mIMidX; float mIMidY; float mOMidX; /* These will be removed */ float mOMidY; float mAdjustX; float mAdjustY; float mRadius; // Used for determining window movement int mOldWinX; int mOldWinY; // Used for resize int mWinH; int mWinW; Direction mDirection; // Used to determine starting point StartCorner mCorner; // Transformation info FWTransformedWindowInfo mTransform; // Animation Info FWAnimationInfo mAnimate; // Input Info FWWindowInputInfo *mInput; //Output Info FWWindowOutputInfo mOutput; CompRect mOutputRect; CompRect mInputRect; // Used to determine whether to animate the window bool mResetting; bool mIsAnimating; // Used to determine whether rotating on X and Y axis, or just on Z bool mCan2D; // These need to be removed bool mCan3D; bool mTransformed; // So does this in favor of FWWindowInputInfo FWGrabType mGrab; void shapeIPW (); void saveInputShape (XRectangle **retRects, int *retCount, int *retOrdering); void adjustIPW (); void createIPW (); bool handleWindowInputInfo (); void shapeInput (); void unshapeInput (); void handleIPWResizeInitiate (); void handleIPWMoveInitiate (); void handleIPWMoveMotionEvent (unsigned int x, unsigned int y); void handleIPWResizeMotionEvent (unsigned int x, unsigned int y); void handleRotateMotionEvent (float dx, float dy, int x, int y); void handleScaleMotionEvent (float dx, float dy, int x, int y); void handleButtonReleaseEvent (); void handleEnterNotify (XEvent *xev); void handleLeaveNotify (XEvent *xev); void damageArea (); void setPrepareRotation (float dx, float dy, float dz, float dsu, float dsd); void calculateInputOrigin (float x, float y); void calculateOutputOrigin (float x, float y); void calculateOutputRect (); void calculateInputRect (); CompRect calculateWindowRect (GLVector c1, GLVector c2, GLVector c3, GLVector c4); void determineZAxisClick (int px, int py, bool motion); bool canShape (); void handleSnap (); }; #define FREEWINS_SCREEN(screen) \ FWScreen *fws = FWScreen::get (screen); #define FREEWINS_WINDOW(window) \ FWWindow *fww = FWWindow::get (window); class FWPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/freewins/src/paint.cpp0000644000015301777760000003723712321343002023417 0ustar pbusernogroup00000000000000/** * Compiz Fusion Freewins plugin * * paint.cpp * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * Sam Spilsbury * * Button binding support and Reset added by: * enigma_0Z * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ #include "freewins.h" /* ------ Window and Output Painting ------------------------------------*/ /* Damage util function */ void FWWindow::damageArea () { CompositeScreen::get (screen)->damageRegion (mOutputRect); } /* Animation Prep */ void FWScreen::preparePaint (int ms) { /* FIXME: should only loop over all windows if at least one animation is running */ foreach (CompWindow *w, screen->windows ()) { FREEWINS_WINDOW (w); float speed = optionGetSpeed (); fww->mAnimate.steps = ((float) ms / ((20.1 - speed) * 100)); if (fww->mAnimate.steps < 0.005) fww->mAnimate.steps = 0.005; /* Animation. We calculate how much increment * a window must rotate / scale per paint by * using the set destination attributes minus * the old attributes divided by the time * remaining. */ /* Don't animate if the window is saved */ fww->mTransform.angX += (float) fww->mAnimate.steps * (fww->mAnimate.destAngX - fww->mTransform.angX) * speed; fww->mTransform.angY += (float) fww->mAnimate.steps * (fww->mAnimate.destAngY - fww->mTransform.angY) * speed; fww->mTransform.angZ += (float) fww->mAnimate.steps * (fww->mAnimate.destAngZ - fww->mTransform.angZ) * speed; fww->mTransform.scaleX += (float) fww->mAnimate.steps * (fww->mAnimate.destScaleX - fww->mTransform.scaleX) * speed; fww->mTransform.scaleY += (float) fww->mAnimate.steps * (fww->mAnimate.destScaleY - fww->mTransform.scaleY) * speed; if (((fww->mTransform.angX >= fww->mAnimate.destAngX - 0.05 && fww->mTransform.angX <= fww->mAnimate.destAngX + 0.05 ) && (fww->mTransform.angY >= fww->mAnimate.destAngY - 0.05 && fww->mTransform.angY <= fww->mAnimate.destAngY + 0.05 ) && (fww->mTransform.angZ >= fww->mAnimate.destAngZ - 0.05 && fww->mTransform.angZ <= fww->mAnimate.destAngZ + 0.05 ) && (fww->mTransform.scaleX >= fww->mAnimate.destScaleX - 0.00005 && fww->mTransform.scaleX <= fww->mAnimate.destScaleX + 0.00005 ) && (fww->mTransform.scaleY >= fww->mAnimate.destScaleY - 0.00005 && fww->mTransform.scaleY <= fww->mAnimate.destScaleY + 0.00005 ))) { fww->mResetting = FALSE; fww->mTransform.angX = fww->mAnimate.destAngX; fww->mTransform.angY = fww->mAnimate.destAngY; fww->mTransform.angZ = fww->mAnimate.destAngZ; fww->mTransform.scaleX = fww->mAnimate.destScaleX; fww->mTransform.scaleY = fww->mAnimate.destScaleY; fww->mTransform.unsnapAngX = fww->mAnimate.destAngX; fww->mTransform.unsnapAngY = fww->mAnimate.destAngY; fww->mTransform.unsnapAngZ = fww->mAnimate.destAngZ; fww->mTransform.unsnapScaleX = fww->mAnimate.destScaleX; fww->mTransform.unsnapScaleY = fww->mAnimate.destScaleX; } //else // fww->damageArea (); } cScreen->preparePaint (ms); } /* Paint the window rotated or scaled */ bool FWWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { GLMatrix wTransform (transform); int currentCull, invertCull; glGetIntegerv (GL_CULL_FACE_MODE, ¤tCull); invertCull = (currentCull == GL_BACK) ? GL_FRONT : GL_BACK; bool status; FREEWINS_SCREEN (screen); /* Has something happened? */ /* Check to see if we are painting on a transformed screen */ /* Enable this code when we can animate between the two states */ if ((mTransform.angX != 0.0 || mTransform.angY != 0.0 || mTransform.angZ != 0.0 || mTransform.scaleX != 1.0 || mTransform.scaleY != 1.0 || mOldWinX != WIN_REAL_X (window) || mOldWinY != WIN_REAL_Y (window)) && fws->optionGetShapeWindowTypes ().evaluate (window)) { mOldWinX = WIN_REAL_X (window); mOldWinY = WIN_REAL_Y (window); /* Figure out where our 'origin' is, don't allow the origin to * be where we clicked if the window is not grabbed, etc */ /* Here we duplicate some of the work the openGL does * but for different reasons. We have access to the * window's transformation matrix, so we will create * our own matrix and apply the same transformations * to it. From there, we create vectors for each point * that we wish to track and multiply them by this * matrix to give us the rotated / scaled co-ordinates. * From there, we project these co-ordinates onto the flat * screen that we have using the OGL viewport, projection * matrix and model matrix. Projection gives us three * co-ordinates, but we ignore Z and just use X and Y * to store in a surrounding rectangle. We can use this * surrounding rectangle to make things like shaping and * damage a lot more accurate than they used to be. */ calculateOutputRect (); /* Prepare for transformation by * doing any necessary adjustments */ float autoScaleX = 1.0f; float autoScaleY = 1.0f; if (fws->optionGetAutoZoom ()) { float apparantWidth = mOutputRect.width (); float apparantHeight = mOutputRect.height (); autoScaleX = (float) WIN_OUTPUT_W (window) / (float) apparantWidth; autoScaleY = (float) WIN_OUTPUT_H (window) / (float) apparantHeight; if (autoScaleX >= 1.0f) autoScaleX = 1.0f; if (autoScaleY >= 1.0f) autoScaleY = 1.0f; autoScaleX = autoScaleY = (autoScaleX + autoScaleY) / 2; /* Because we modified the scale after calculating * the output rect, we need to recalculate again */ calculateOutputRect (); } /* float scaleX = autoScaleX - (1 - mTransform.scaleX); float scaleY = autoScaleY - (1 - mTransform.scaleY); */ /* Actually Transform the window */ mask |= PAINT_WINDOW_TRANSFORMED_MASK; /* Adjust the window in the matrix to prepare for transformation */ if (mGrab != grabRotate && mGrab != grabScale) { calculateInputOrigin (WIN_REAL_X (window) + WIN_REAL_W (window) / 2.0f, WIN_REAL_Y (window) + WIN_REAL_H (window) / 2.0f); calculateOutputOrigin (WIN_OUTPUT_X (window) + WIN_OUTPUT_W (window) / 2.0f, WIN_OUTPUT_Y (window) + WIN_OUTPUT_H (window) / 2.0f); } float adjustX = 0.0f; float adjustY = 0.0f; fws->modifyMatrix (wTransform, mTransform.angX, mTransform.angY, mTransform.angZ, mIMidX, mIMidY , 0.0f, mTransform.scaleX, mTransform.scaleY, 1.0f, adjustX, adjustY, TRUE); /* Create rects for input after we've dealt with output */ calculateInputRect (); /* Determine if the window is inverted */ Bool xInvert = FALSE; Bool yInvert = FALSE; Bool needsInvert = FALSE; float renX = fabs (fmodf (mTransform.angX, 360.0f)); float renY = fabs (fmodf (mTransform.angY, 360.0f)); if (90 < renX && renX < 270) xInvert = TRUE; if (90 < renY && renY < 270) yInvert = TRUE; if ((xInvert || yInvert) && !(xInvert && yInvert)) needsInvert = TRUE; if (needsInvert) glCullFace (invertCull); status = gWindow->glPaint (attrib, wTransform, region, mask); if (needsInvert) glCullFace (currentCull); } else { status = gWindow->glPaint (attrib, wTransform, region, mask); } // Check if there are rotated windows if (!((mTransform.angX >= 0.0f - 0.05 && mTransform.angX <= 0.0f + 0.05 ) && (mTransform.angY >= 0.0f - 0.05 && mTransform.angY <= 0.0f + 0.05 ) && (mTransform.angZ >= 0.0f - 0.05 && mTransform.angZ <= 0.0f + 0.05 ) && (mTransform.scaleX >= 1.0f - 0.00005 && mTransform.scaleX <= 1.0f + 0.00005 ) && (mTransform.scaleY >= 1.0f - 0.00005 && mTransform.scaleY <= 1.0f + 0.00005 )) && !mTransformed) mTransformed = TRUE; else if (mTransformed) mTransformed = FALSE; /* There is still animation to be done */ if (!(((mTransform.angX >= mAnimate.destAngX - 0.05 && mTransform.angX <= mAnimate.destAngX + 0.05 ) && (mTransform.angY >= mAnimate.destAngY - 0.05 && mTransform.angY <= mAnimate.destAngY + 0.05 ) && (mTransform.angZ >= mAnimate.destAngZ - 0.05 && mTransform.angZ <= mAnimate.destAngZ + 0.05 ) && (mTransform.scaleX >= mAnimate.destScaleX - 0.00005 && mTransform.scaleX <= mAnimate.destScaleX + 0.00005 ) && (mTransform.scaleY >= mAnimate.destScaleY - 0.00005 && mTransform.scaleY <= mAnimate.destScaleY + 0.00005 )))) { damageArea (); mIsAnimating = TRUE; } else if (mIsAnimating) /* We're done animating now, and we were animating */ { if (handleWindowInputInfo ()) adjustIPW (); mIsAnimating = FALSE; } return status; } /* Paint the window axis help onto the screen */ bool FWScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { GLMatrix zTransform (transform); if (!mTransformedWindows.empty ()) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (mAxisHelp && mHoverWindow) { int j; float x = WIN_REAL_X(mHoverWindow) + WIN_REAL_W(mHoverWindow)/2.0; float y = WIN_REAL_Y(mHoverWindow) + WIN_REAL_H(mHoverWindow)/2.0; FREEWINS_WINDOW (mHoverWindow); float zRad = fww->mRadius * (optionGetTdPercent () / 100); bool wasCulled = glIsEnabled (GL_CULL_FACE); zTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glPushMatrix (); glLoadMatrixf (zTransform.getMatrix ()); if (wasCulled) glDisable (GL_CULL_FACE); if (optionGetShowCircle () && optionGetRotationAxis () == RotationAxisAlwaysCentre) { glColor4usv (optionGetCircleColor ()); glEnable (GL_BLEND); glBegin (GL_POLYGON); for (j = 0; j < 360; j += 10) glVertex3f ( x + zRad * cos(D2R(j)), y + zRad * sin(D2R(j)), 0.0 ); glEnd (); glDisable (GL_BLEND); glColor4usv (optionGetLineColor ()); glLineWidth (3.0); glBegin (GL_LINE_LOOP); for (j = 360; j >= 0; j -= 10) glVertex3f ( x + zRad * cos(D2R(j)), y + zRad * sin(D2R(j)), 0.0 ); glEnd (); glBegin (GL_LINE_LOOP); for (j = 360; j >= 0; j -= 10) glVertex3f( x + fww->mRadius * cos(D2R(j)), y + fww->mRadius * sin(D2R(j)), 0.0 ); glEnd (); } /* Draw the 'gizmo' */ if (optionGetShowGizmo ()) { glPushMatrix (); glTranslatef (x, y, 0.0); glScalef (zRad, zRad, zRad / (float)screen->width ()); glRotatef (fww->mTransform.angX, 1.0f, 0.0f, 0.0f); glRotatef (fww->mTransform.angY, 0.0f, 1.0f, 0.0f); glRotatef (fww->mTransform.angZ, 0.0f, 0.0f, 1.0f); glLineWidth (4.0f); for (int i = 0; i < 3; i++) { glPushMatrix (); glColor4f (1.0 * (i==0), 1.0 * (i==1), 1.0 * (i==2), 1.0); glRotatef (90.0, 1.0 * (i==0), 1.0 * (i==1), 1.0 * (i==2)); glBegin (GL_LINE_LOOP); for (j=360; j>=0; j -= 10) glVertex3f ( cos (D2R (j)), sin (D2R (j)), 0.0 ); glEnd (); glPopMatrix (); } glPopMatrix (); glColor4usv (defaultColor); } /* Draw the bounding box */ if (optionGetShowRegion ()) { glDisableClientState (GL_TEXTURE_COORD_ARRAY); glEnable (GL_BLEND); glColor4us (0x2fff, 0x2fff, 0x4fff, 0x4fff); glRecti (fww->mInputRect.x1 (), fww->mInputRect.y1 (), fww->mInputRect.x2 (), fww->mInputRect.y2 ()); glColor4us (0x2fff, 0x2fff, 0x4fff, 0x9fff); glBegin (GL_LINE_LOOP); glVertex2i (fww->mInputRect.x1 (), fww->mInputRect.y1 ()); glVertex2i (fww->mInputRect.x2 (), fww->mInputRect.y1 ()); glVertex2i (fww->mInputRect.x1 (), fww->mInputRect.y2 ()); glVertex2i (fww->mInputRect.x2 (), fww->mInputRect.y2 ()); glEnd (); glColor4usv (defaultColor); glDisable (GL_BLEND); glEnableClientState (GL_TEXTURE_COORD_ARRAY); } if (optionGetShowCross ()) { glColor4usv (optionGetCrossLineColor ()); glBegin(GL_LINES); glVertex3f(x, y - (WIN_REAL_H (mHoverWindow) / 2), 0.0f); glVertex3f(x, y + (WIN_REAL_H (mHoverWindow) / 2), 0.0f); glEnd (); glBegin(GL_LINES); glVertex3f(x - (WIN_REAL_W (mHoverWindow) / 2), y, 0.0f); glVertex3f(x + (WIN_REAL_W (mHoverWindow) / 2), y, 0.0f); glEnd (); /* Move to our first corner (TopLeft) */ if (fww->mInput) { glBegin(GL_LINES); glVertex3f(fww->mOutput.shapex1, fww->mOutput.shapey1, 0.0f); glVertex3f(fww->mOutput.shapex2, fww->mOutput.shapey2, 0.0f); glEnd (); glBegin(GL_LINES); glVertex3f(fww->mOutput.shapex2, fww->mOutput.shapey2, 0.0f); glVertex3f(fww->mOutput.shapex4, fww->mOutput.shapey4, 0.0f); glEnd (); glBegin(GL_LINES); glVertex3f(fww->mOutput.shapex4, fww->mOutput.shapey4, 0.0f); glVertex3f(fww->mOutput.shapex3, fww->mOutput.shapey3, 0.0f); glEnd (); glBegin(GL_LINES); glVertex3f(fww->mOutput.shapex3, fww->mOutput.shapey3, 0.0f); glVertex3f(fww->mOutput.shapex1, fww->mOutput.shapey1, 0.0f); glEnd (); } } if (wasCulled) glEnable(GL_CULL_FACE); glColor4usv(defaultColor); glPopMatrix (); } return status; } void FWScreen::donePaint () { if (mAxisHelp && mHoverWindow) { FREEWINS_WINDOW (mHoverWindow); REGION region; region.rects = ®ion.extents; region.numRects = region.size = 1; region.extents.x1 = MIN (WIN_REAL_X (mHoverWindow), WIN_REAL_X (mHoverWindow) + WIN_REAL_W (mHoverWindow) / 2.0f - fww->mRadius); region.extents.x2 = MAX (WIN_REAL_X (mHoverWindow), WIN_REAL_X (mHoverWindow) + WIN_REAL_W (mHoverWindow) / 2.0f + fww->mRadius); region.extents.y1 = MIN (WIN_REAL_Y (mHoverWindow), WIN_REAL_Y (mHoverWindow) + WIN_REAL_H (mHoverWindow) / 2.0f - fww->mRadius); region.extents.y2 = MAX (WIN_REAL_Y (mHoverWindow), WIN_REAL_Y (mHoverWindow) + WIN_REAL_H (mHoverWindow) / 2.0f + fww->mRadius); CompRegion damageRegion (region.extents.x1, region.extents.y1, region.extents.x2 - region.extents.x1, region.extents.y2 - region.extents.y1); cScreen->damageRegion (damageRegion); } cScreen->donePaint (); } /* Damage the Window Rect */ bool FWWindow::damageRect (bool initial, const CompRect &rect) { FREEWINS_SCREEN(screen); if (mTransformed) damageArea (); /** * Special situations where we must damage the screen * i.e when we are playing with windows and wobbly is * enabled */ if ((mGrab == grabMove && !fws->optionGetImmediateMoves ()) || (mIsAnimating || window->grabbed ())) fws->cScreen->damageScreen (); return cWindow->damageRect (initial, rect); } compiz-0.9.11+14.04.20140409/plugins/freewins/src/events.cpp0000644000015301777760000004544512321343002023610 0ustar pbusernogroup00000000000000/** * Compiz Fusion Freewins plugin * * events.cpp * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * Sam Spilsbury * * Button binding support and Reset added by: * enigma_0Z * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - X Input Redirection * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ #include "freewins.h" /* ------ Event Handlers ------------------------------------------------*/ void FWWindow::handleIPWResizeInitiate () { FREEWINS_SCREEN (screen); window->activate (); mGrab = grabResize; fws->mRotateCursor = XCreateFontCursor (screen->dpy (), XC_plus); if(!screen->otherGrabExist ("freewins", "resize", 0)) if(!fws->mGrabIndex) { unsigned int mods = 0; mods &= CompNoMask; fws->mGrabIndex = screen->pushGrab (fws->mRotateCursor, "resize"); window->grabNotify (window->x () + (window->width () / 2), window->y () + (window->height () / 2), mods, CompWindowGrabMoveMask | CompWindowGrabButtonMask); fws->mGrabWindow = window; } } void FWWindow::handleIPWMoveInitiate () { FREEWINS_SCREEN (screen); window->activate (); mGrab = grabMove; fws->mRotateCursor = XCreateFontCursor (screen->dpy (), XC_fleur); if(!screen->otherGrabExist ("freewins", "resize", 0)) if(!fws->mGrabIndex) { unsigned int mods = 0; mods &= CompNoMask; fws->mGrabIndex = screen->pushGrab (fws->mRotateCursor, "resize"); window->grabNotify (window->x () + (window->width () / 2), window->y () + (window->height () / 2), mods, CompWindowGrabResizeMask | CompWindowGrabButtonMask); fws->mGrabWindow = window; } } void FWWindow::handleIPWMoveMotionEvent (unsigned int x, unsigned int y) { FREEWINS_SCREEN (screen); int dx = x - lastPointerX; int dy = y - lastPointerY; if (!fws->mGrabIndex) return; window->move (dx, dy, fws->optionGetImmediateMoves ()); } void FWWindow::handleIPWResizeMotionEvent (unsigned int x, unsigned int y) { int dx = (x - lastPointerX) * 10; int dy = (y - lastPointerY) * 10; mWinH += dy; mWinW += dx; /* In order to prevent a window redraw on resize * on every motion event we have a threshold */ /* FIXME: cf-love: Instead of actually resizing the window, scale it up, then resize it */ if (mWinH - 10 > window->height () || mWinW - 10 > window->width ()) { XWindowChanges xwc; unsigned int mask = CWX | CWY | CWWidth | CWHeight; xwc.x = window->serverX (); xwc.y = window->serverY (); xwc.width = mWinW; xwc.height = mWinH; if (xwc.width == window->serverWidth ()) mask &= ~CWWidth; if (xwc.height == window->serverHeight ()) mask &= ~CWHeight; if (window->mapNum () && (mask & (CWWidth | CWHeight))) window->sendSyncRequest (); window->configureXWindow (mask, &xwc); } } /* Handle Rotation */ void FWWindow::handleRotateMotionEvent (float dx, float dy, int x, int y) { FREEWINS_SCREEN (screen); x -= 100; y -= 100; int oldX = lastPointerX - 100; int oldY = lastPointerY - 100; float midX = WIN_REAL_X (window) + WIN_REAL_W (window)/2.0; float midY = WIN_REAL_Y (window) + WIN_REAL_H (window)/2.0; float angX; float angY; float angZ; /* Save the current angles so we can work with them */ if (fws->optionGetSnap () || fws->mSnap) { angX = mTransform.unsnapAngX; angY = mTransform.unsnapAngY; angZ = mTransform.unsnapAngZ; } else { angX = mAnimate.destAngX; angY = mAnimate.destAngY; angZ = mAnimate.destAngZ; } /* Check for Y axis clicking (Top / Bottom) */ if (pointerY > midY) { /* Check for X axis clicking (Left / Right) */ if (pointerX > midX) mCorner = CornerBottomRight; else if (pointerX < midX) mCorner = CornerBottomLeft; } else if (pointerY < midY) { /* Check for X axis clicking (Left / Right) */ if (pointerX > midX) mCorner = CornerTopRight; else if (pointerX < midX) mCorner = CornerTopLeft; } float percentFromXAxis = 0.0, percentFromYAxis = 0.0; if (fws->optionGetZAxisRotation () == FreewinsOptions::ZAxisRotationInterchangeable) { /* Trackball rotation was too hard to implement. If anyone can implement it, * please come forward so I can replace this hacky solution to the problem. * Anyways, what happens here, is that we determine how far away we are from * each axis (y and x). The further we are away from the y axis, the more * up / down movements become Z axis movements and the further we are away from * the x-axis, the more left / right movements become z rotations. */ /* We determine this by taking a percentage of how far away the cursor is from * each axis. We divide the 3D rotation by this percentage ( and divide by the * percentage squared in order to ensure that rotation is not too violent when we * are quite close to the origin. We multiply the 2D rotation by this percentage also * so we are essentially rotating in 3D and 2D all the time, but this is only really * noticeable when you move the cursor over to the extremes of a window. In every case * percentage can be defined as decimal-percentage (i.e 0.036 == 3.6%). Like I mentioned * earlier, if you can replace this with trackball rotation, please come forward! */ float halfWidth = WIN_REAL_W (window) / 2.0f; float halfHeight = WIN_REAL_H (window) / 2.0f; float distFromXAxis = fabs (mIMidX - pointerX); float distFromYAxis = fabs (mIMidY - pointerY); percentFromXAxis = distFromXAxis / halfWidth; percentFromYAxis = distFromYAxis / halfHeight; } else if (fws->optionGetZAxisRotation () == FreewinsOptions::ZAxisRotationSwitch) determineZAxisClick (pointerX, pointerY, TRUE); dx *= 360; dy *= 360; /* Handle inversion */ bool can2D = mCan2D, can3D = mCan3D; if (fws->mInvert && fws->optionGetZAxisRotation () != FreewinsOptions::ZAxisRotationInterchangeable) { can2D = !mCan2D; can3D = !mCan3D; } if(can2D) { float zX = 1.0f; float zY = 1.0f; if (fws->optionGetZAxisRotation () == FreewinsOptions::ZAxisRotationInterchangeable) { zX = percentFromXAxis; zY = percentFromYAxis; } zX = zX > 1.0f ? 1.0f : zX; zY = zY > 1.0f ? 1.0f : zY; switch (mCorner) { case CornerTopRight: if (x < oldX) angZ -= dx * zX; else if (x > oldX) angZ += dx * zX; if (y < oldY) angZ -= dy * zY; else if (y > oldY) angZ += dy * zY; break; case CornerTopLeft: if (x < oldX) angZ -= dx * zX; else if (x > oldX) angZ += dx * zX; if (y < oldY) angZ += dy * zY; else if (y > oldY) angZ -= dy * zY; break; case CornerBottomLeft: if (x < oldX) angZ += dx * zX; else if (x > oldX) angZ -= dx * zX; if (y < oldY) angZ += dy * zY; else if (y > oldY) angZ -= dy * zY; break; case CornerBottomRight: if (x < oldX) angZ += dx * zX; else if (x > oldX) angZ -= dx * zX; if (y < oldY) angZ -= dy * zY; else if (y > oldY) angZ += dy * zY; break; } } if (can3D) { if (fws->optionGetZAxisRotation () != FreewinsOptions::ZAxisRotationInterchangeable) { percentFromXAxis = 0.0f; percentFromYAxis = 0.0f; } angX -= dy * (1 - percentFromXAxis); angY += dx * (1 - percentFromYAxis); } /* Restore angles */ if (fws->optionGetSnap () || fws->mSnap) { mTransform.unsnapAngX = angX; mTransform.unsnapAngY = angY; mTransform.unsnapAngZ = angZ; } else { mAnimate.destAngX = angX; mAnimate.destAngY = angY; mAnimate.destAngZ = angZ; } handleSnap (); } /* Handle Scaling */ void FWWindow::handleScaleMotionEvent (float dx, float dy, int x, int y) { FREEWINS_SCREEN (screen); x -= 100.0; y -= 100.0; int oldX = lastPointerX - 100; int oldY = lastPointerY - 100; float scaleX, scaleY; if (fws->optionGetSnap () || fws->mSnap) { scaleX = mTransform.unsnapScaleX; scaleY = mTransform.unsnapScaleY; } else { scaleX = mAnimate.destScaleX; scaleY = mAnimate.destScaleY; } calculateInputRect (); switch (mCorner) { case CornerTopLeft: // Check X Direction if (x < oldX) scaleX -= dx; else if (x > oldX) scaleX -= dx; // Check Y Direction if (y < oldY) scaleY -= dy; else if (y > oldY) scaleY -= dy; break; case CornerTopRight: // Check X Direction if (x < oldX) scaleX += dx; else if (x > oldX) scaleX += dx; // Check Y Direction if (y < oldY) scaleY -= dy; else if (y > oldY) scaleY -= dy; break; case CornerBottomLeft: // Check X Direction if (x < oldX) scaleX -= dx; else if (y > oldX) scaleX -= dx; // Check Y Direction if (y < oldY) scaleY += dy; else if (y > oldY) scaleY += dy; break; case CornerBottomRight: // Check X Direction if (x < oldX) scaleX += dx; else if (x > oldX) scaleX += dx; // Check Y Direction if (y < oldY) scaleY += dy; else if (y > oldY) scaleY += dy; break; } if (fws->optionGetSnap () || fws->mSnap) { mTransform.unsnapScaleX = scaleX; mTransform.unsnapScaleY = scaleY; } else { mAnimate.destScaleX = scaleX; mAnimate.destScaleY = scaleY; } /* Stop scale at threshold specified */ if (!fws->optionGetAllowNegative ()) { float minScale = fws->optionGetMinScale (); if (mAnimate.destScaleX < minScale) mAnimate.destScaleX = minScale; if (mAnimate.destScaleY < minScale) mAnimate.destScaleY = minScale; } /* Change scales for maintaining aspect ratio */ if (fws->optionGetScaleUniform ()) { float tempscaleX = mAnimate.destScaleX; float tempscaleY = mAnimate.destScaleY; mAnimate.destScaleX = (tempscaleX + tempscaleY) / 2; mAnimate.destScaleY = (tempscaleX + tempscaleY) / 2; mTransform.unsnapScaleX = (tempscaleX + tempscaleY) / 2; mTransform.unsnapScaleY = (tempscaleX + tempscaleY) / 2; } handleSnap (); } void FWWindow::handleButtonReleaseEvent () { FREEWINS_SCREEN (screen); if (mGrab == grabMove || mGrab == grabResize) { screen->removeGrab (fws->mGrabIndex, NULL); window->ungrabNotify (); window->moveInputFocusTo (); adjustIPW (); fws->mGrabIndex = 0; fws->mGrabWindow = NULL; mGrab = grabNone; } } void FWWindow::handleEnterNotify (XEvent *xev) { XEvent EnterNotifyEvent; memcpy (&EnterNotifyEvent.xcrossing, &xev->xcrossing, sizeof (XCrossingEvent)); /* if (window) { EnterNotifyEvent.xcrossing.window = window->id (); XSendEvent (screen->dpy (), window->id (), FALSE, EnterWindowMask, &EnterNotifyEvent); } */ } void FWWindow::handleLeaveNotify (XEvent *xev) { XEvent LeaveNotifyEvent; memcpy (&LeaveNotifyEvent.xcrossing, &xev->xcrossing, sizeof (XCrossingEvent)); LeaveNotifyEvent.xcrossing.window = window->id (); //XSendEvent (screen->dpy (), window->id (), FALSE, // LeaveWindowMask, &LeaveNotifyEvent); } /* X Event Handler */ void FWScreen::handleEvent (XEvent *ev) { float dx, dy; CompWindow *oldPrev, *oldNext, *w; /* Check our modifiers first */ if (ev->type == screen->xkbEvent ()) { XkbAnyEvent *xkbEvent = (XkbAnyEvent *) ev; if (xkbEvent->xkb_type == XkbStateNotify) { XkbStateNotifyEvent *stateEvent = (XkbStateNotifyEvent *) ev; unsigned int snapMods = 0xffffffff; unsigned int invertMods = 0xffffffff; if (mSnapMask) snapMods = mSnapMask; if ((stateEvent->mods & snapMods) == snapMods) mSnap = TRUE; else mSnap = FALSE; if (mInvertMask) invertMods = mInvertMask; if ((stateEvent->mods & invertMods) == invertMods) mInvert = TRUE; else mInvert = FALSE; } } switch(ev->type) { case EnterNotify: { CompWindow *btnW; btnW = screen->findWindow (ev->xbutton.subwindow); /* It wasn't the subwindow, try the window */ if (!btnW) btnW = screen->findWindow (ev->xbutton.window); /* We have established the CompWindow we clicked * on. Get the real window */ if (btnW) { FREEWINS_WINDOW (btnW); if (fww->canShape () && !mGrabWindow && !screen->otherGrabExist (0)) mHoverWindow = btnW; btnW = getRealWindow (btnW); } if (btnW) { FREEWINS_WINDOW (btnW); if (fww->canShape () && !mGrabWindow && !screen->otherGrabExist (0)) mHoverWindow = btnW; fww->handleEnterNotify (ev); } } break; case LeaveNotify: { CompWindow *btnW; btnW = screen->findWindow (ev->xbutton.subwindow); /* It wasn't the subwindow, try the window */ if (!btnW) btnW = screen->findWindow (ev->xbutton.window); /* We have established the CompWindow we clicked * on. Get the real window */ if (btnW) btnW = getRealWindow (btnW); if (btnW) FWWindow::get (btnW)->handleLeaveNotify (ev); } break; case MotionNotify: { if (mGrabWindow) { FREEWINS_WINDOW (mGrabWindow); dx = ((float)(pointerX - lastPointerX) / screen->width ()) * \ optionGetMouseSensitivity (); dy = ((float)(pointerY - lastPointerY) / screen->height ()) * \ optionGetMouseSensitivity (); if (optionGetShapeWindowTypes ().evaluate (mGrabWindow)) { if (fww->mGrab == grabMove || fww->mGrab == grabResize) { FWWindowInputInfo *info; // CompWindow *w = mGrabWindow; foreach (info, mTransformedWindows) { if (mGrabWindow->id () == info->ipw) /* The window we just grabbed was actually * an IPW, get the real window instead */ w = getRealWindow (mGrabWindow); } } switch (fww->mGrab) { case grabMove: fww->handleIPWMoveMotionEvent (pointerX, pointerY); break; case grabResize: fww->handleIPWResizeMotionEvent (pointerX, pointerY); break; default: break; } } if (fww->mGrab == grabRotate) { fww->handleRotateMotionEvent(dx, dy, ev->xmotion.x, ev->xmotion.y); } if (fww->mGrab == grabScale) { fww->handleScaleMotionEvent(dx * 3, dy * 3, ev->xmotion.x, ev->xmotion.y); } //if(dx != 0.0 || dy != 0.0) // fww->damageArea (); } } break; /* Button Press and Release */ case ButtonPress: { CompWindow *btnW; btnW = screen->findWindow (ev->xbutton.subwindow); /* It wasn't the subwindow, try the window */ if (!btnW) btnW = screen->findWindow (ev->xbutton.window); /* We have established the CompWindow we clicked * on. Get the real window * FIXME: Free btnW and use another CompWindow * such as realW */ if (btnW) btnW = getRealWindow (btnW); if (btnW) { FREEWINS_WINDOW (btnW); if (optionGetShapeWindowTypes ().evaluate (btnW)) switch (ev->xbutton.button) { case Button1: fww->handleIPWMoveInitiate (); break; case Button3: fww->handleIPWResizeInitiate (); break; default: break; } } mClick_root_x = ev->xbutton.x_root; mClick_root_y = ev->xbutton.y_root; } break; case ButtonRelease: { if (mGrabWindow) { FREEWINS_WINDOW (mGrabWindow); if (optionGetShapeWindowTypes ().evaluate (mGrabWindow)) if (fww->mGrab == grabMove || fww->mGrab == grabResize) { fww->handleButtonReleaseEvent (); mGrabWindow = 0; } } } break; case ConfigureNotify: { w = screen->findWindow (ev->xconfigure.window); if (w) { oldPrev = w->prev; oldNext = w->next; FREEWINS_WINDOW (w); fww->mWinH = WIN_REAL_H (w); fww->mWinW = WIN_REAL_W (w); } } break; #if 0 case ClientMessage: { if (ev->xclient.message_type == Atoms::desktopViewport) { /* Viewport change occurred, or something like that - adjust the IPW's */ CompWindow *adjW, *actualW; foreach (adjW, screen->windows ()) { int vX = 0, vY = 0, dX, dY; actualW = getRealWindow (adjW); if (!actualW) actualW = adjW; if (actualW) { CompWindow *ipw; FREEWINS_WINDOW (actualW); if (!fww->mInput || fww->mInput->ipw) break; ipw = screen->findWindow (fww->mInput->ipw); if (ipw) { dX = screen->vp ().x () - vX; dY = screen->vp ().y () - vY; CompPoint p = actualW->defaultViewport (); vX = p.x (); vY = p.y (); ipw->moveToViewportPosition (ipw->x () - dX * screen->width (), ipw->y () - dY * screen->height (), true); // ??? } } } } } break; #endif default: break; #if 0 if (ev->type == screen->shapeEvent () + ShapeNotify) { XShapeEvent *se = (XShapeEvent *) ev; if (se->kind == ShapeInput) { CompWindow *w; w = screen->findWindow (se->window); if (w) { FREEWINS_WINDOW (w); if (fww->canShape () && (fww->mTransform.scaleX != 1.0f || fww->mTransform.scaleY != 1.0f)) { // Reset the window back to normal fww->mTransform.scaleX = 1.0f; fww->mTransform.scaleY = 1.0f; fww->mTransform.angX = 0.0f; fww->mTransform.angY = 0.0f; fww->mTransform.angZ = 0.0f; /*FWShapeInput (w); - Disabled due to problems it causes*/ } } } } #endif } screen->handleEvent (ev); /* Now we can find out if a restacking occurred while we were handing events */ switch (ev->type) { case ConfigureNotify: { w = screen->findWindow (ev->xconfigure.window); if (w) { oldPrev = w->prev; oldNext = w->next; if (w->prev != oldPrev || w->next != oldNext) { /* restacking occured, ensure ipw stacking */ adjustIPWStacking (); } } } break; } } compiz-0.9.11+14.04.20140409/plugins/freewins/src/util.cpp0000644000015301777760000003244512321343002023255 0ustar pbusernogroup00000000000000/** * Compiz Fusion Freewins plugin * * util.cpp * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * Sam Spilsbury * * Button binding support and Reset added by: * enigma_0Z * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ #include "freewins.h" /* ------ Utility Functions ---------------------------------------------*/ /* Rotate and project individual vectors */ void FWScreen::rotateProjectVector (GLVector &vector, GLMatrix &transform, GLdouble *resultX, GLdouble *resultY, GLdouble *resultZ) { vector = transform * vector; GLint viewport[4]; // Viewport GLdouble modelview[16]; // Modelview Matrix GLdouble projection[16]; // Projection Matrix glGetIntegerv (GL_VIEWPORT, viewport); glGetDoublev (GL_MODELVIEW_MATRIX, modelview); glGetDoublev (GL_PROJECTION_MATRIX, projection); gluProject (vector[GLVector::x], vector[GLVector::y], vector[GLVector::z], modelview, projection, viewport, resultX, resultY, resultZ); /* Y must be negated */ *resultY = screen->height () - *resultY; } /* Scales z by 0 and does perspective distortion so that it * looks the same wherever on the screen * * This code taken from animation.c, * Copyright (c) 2006 Erkin Bahceci */ void FWScreen::perspectiveDistortAndResetZ (GLMatrix &transform) { float v = -1.0 / ::screen->width (); /* This does transform = M * transform, where M is 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, v, 0, 0, 0, 1 */ transform[8] = v * transform[12]; transform[9] = v * transform[13]; transform[10] = v * transform[14]; transform[11] = v * transform[15]; } void FWScreen::modifyMatrix (GLMatrix &transform, float angX, float angY, float angZ, float tX, float tY, float tZ, float scX, float scY, float scZ, float adjustX, float adjustY, bool paint) { /* Create our transformation Matrix */ transform.translate (tX, tY, 0.0); if (paint) perspectiveDistortAndResetZ (transform); else transform.scale (1.0f, 1.0f, 1.0f / screen->width ()); transform.rotate (angX, 1.0f, 0.0f, 0.0f); transform.rotate (angY, 0.0f, 1.0f, 0.0f); transform.rotate (angZ, 0.0f, 0.0f, 1.0f); transform.scale (scX, 1.0f, 0.0f); transform.scale (1.0f, scY, 0.0f); transform.translate (-(tX), -(tY), 0.0f); } /* static float det3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22) { float ret = 0.0; ret += m00 * m11 * m22 - m21 * m12 * m00; ret += m01 * m12 * m20 - m22 * m10 * m01; ret += m02 * m10 * m21 - m20 * m11 * m02; return ret; } static void FWFindInverseMatrix(CompTransform *m, CompTransform *r) { float *mm = m->m; float d, c[16]; d = mm[0] * det3(mm[5], mm[6], mm[7], mm[9], mm[10], mm[11], mm[13], mm[14], mm[15]) - mm[1] * det3(mm[4], mm[6], mm[7], mm[8], mm[10], mm[11], mm[12], mm[14], mm[15]) + mm[2] * det3(mm[4], mm[5], mm[7], mm[8], mm[9], mm[11], mm[12], mm[13], mm[15]) - mm[3] * det3(mm[4], mm[5], mm[6], mm[8], mm[9], mm[10], mm[12], mm[13], mm[14]); c[0] = det3(mm[5], mm[6], mm[7], mm[9], mm[10], mm[11], mm[13], mm[14], mm[15]); c[1] = -det3(mm[4], mm[6], mm[7], mm[8], mm[10], mm[11], mm[12], mm[14], mm[15]); c[2] = det3(mm[4], mm[5], mm[7], mm[8], mm[9], mm[11], mm[12], mm[13], mm[15]); c[3] = -det3(mm[4], mm[5], mm[6], mm[8], mm[9], mm[10], mm[12], mm[13], mm[14]); c[4] = -det3(mm[1], mm[2], mm[3], mm[9], mm[10], mm[11], mm[13], mm[14], mm[15]); c[5] = det3(mm[0], mm[2], mm[3], mm[8], mm[10], mm[11], mm[12], mm[14], mm[15]); c[6] = -det3(mm[0], mm[1], mm[3], mm[8], mm[9], mm[11], mm[12], mm[13], mm[15]); c[7] = det3(mm[0], mm[1], mm[2], mm[8], mm[9], mm[10], mm[12], mm[13], mm[14]); c[8] = det3(mm[1], mm[2], mm[3], mm[5], mm[6], mm[7], mm[13], mm[14], mm[15]); c[9] = -det3(mm[0], mm[2], mm[3], mm[4], mm[6], mm[7], mm[12], mm[14], mm[15]); c[10] = det3(mm[0], mm[1], mm[3], mm[4], mm[5], mm[7], mm[12], mm[13], mm[15]); c[11] = -det3(mm[0], mm[1], mm[2], mm[4], mm[5], mm[6], mm[12], mm[13], mm[14]); c[12] = -det3(mm[1], mm[2], mm[3], mm[5], mm[6], mm[7], mm[9], mm[10], mm[11]); c[13] = det3(mm[0], mm[2], mm[3], mm[4], mm[6], mm[7], mm[8], mm[10], mm[11]); c[14] = -det3(mm[0], mm[1], mm[3], mm[4], mm[5], mm[7], mm[8], mm[9], mm[11]); c[15] = det3(mm[0], mm[1], mm[2], mm[4], mm[5], mm[6], mm[8], mm[9], mm[10]); r->m[0] = c[0] / d; r->m[1] = c[4] / d; r->m[2] = c[8] / d; r->m[3] = c[12] / d; r->m[4] = c[1] / d; r->m[5] = c[5] / d; r->m[6] = c[9] / d; r->m[7] = c[13] / d; r->m[8] = c[2] / d; r->m[9] = c[6] / d; r->m[10] = c[10] / d; r->m[11] = c[14] / d; r->m[12] = c[3] / d; r->m[13] = c[7] / d; r->m[14] = c[11] / d; r->m[15] = c[15] / d; return; } */ /* Create a rect from 4 screen points */ CompRect FWScreen::createSizedRect (float xScreen1, float xScreen2, float xScreen3, float xScreen4, float yScreen1, float yScreen2, float yScreen3, float yScreen4) { /* Left most point */ float leftmost = xScreen1; if (xScreen2 <= leftmost) leftmost = xScreen2; if (xScreen3 <= leftmost) leftmost = xScreen3; if (xScreen4 <= leftmost) leftmost = xScreen4; /* Right most point */ float rightmost = xScreen1; if (xScreen2 >= rightmost) rightmost = xScreen2; if (xScreen3 >= rightmost) rightmost = xScreen3; if (xScreen4 >= rightmost) rightmost = xScreen4; /* Top most point */ float topmost = yScreen1; if (yScreen2 <= topmost) topmost = yScreen2; if (yScreen3 <= topmost) topmost = yScreen3; if (yScreen4 <= topmost) topmost = yScreen4; /* Bottom most point */ float bottommost = yScreen1; if (yScreen2 >= bottommost) bottommost = yScreen2; if (yScreen3 >= bottommost) bottommost = yScreen3; if (yScreen4 >= bottommost) bottommost = yScreen4; /* Box rect; rect.x1 = leftmost; rect.x2 = rightmost; rect.y1 = topmost; rect.y2 = bottommost; */ return CompRect (leftmost, topmost, rightmost - leftmost, bottommost - topmost); } CompRect FWWindow::calculateWindowRect (GLVector c1, GLVector c2, GLVector c3, GLVector c4) { FREEWINS_SCREEN (screen); GLMatrix transform; GLdouble xScreen1 = 0.0f, yScreen1 = 0.0f, zScreen1 = 0.0f; GLdouble xScreen2 = 0.0f, yScreen2 = 0.0f, zScreen2 = 0.0f; GLdouble xScreen3 = 0.0f, yScreen3 = 0.0f, zScreen3 = 0.0f; GLdouble xScreen4 = 0.0f, yScreen4 = 0.0f, zScreen4 = 0.0f; transform.reset (); fws->modifyMatrix (transform, mTransform.angX, mTransform.angY, mTransform.angZ, mIMidX, mIMidY, 0.0f, mTransform.scaleX, mTransform.scaleY, 0.0f, 0.0f, 0.0f, false); fws->rotateProjectVector(c1, transform, &xScreen1, &yScreen1, &zScreen1); fws->rotateProjectVector(c2, transform, &xScreen2, &yScreen2, &zScreen2); fws->rotateProjectVector(c3, transform, &xScreen3, &yScreen3, &zScreen3); fws->rotateProjectVector(c4, transform, &xScreen4, &yScreen4, &zScreen4); /* Save the non-rectangular points so that we can shape the rectangular IPW */ mOutput.shapex1 = xScreen1; mOutput.shapex2 = xScreen2; mOutput.shapex3 = xScreen3; mOutput.shapex4 = xScreen4; mOutput.shapey1 = yScreen1; mOutput.shapey2 = yScreen2; mOutput.shapey3 = yScreen3; mOutput.shapey4 = yScreen4; return fws->createSizedRect(xScreen1, xScreen2, xScreen3, xScreen4, yScreen1, yScreen2, yScreen3, yScreen4); } void FWWindow::calculateOutputRect () { GLVector corner1 = GLVector (WIN_OUTPUT_X (window), WIN_OUTPUT_Y (window), 1.0f, 1.0f); GLVector corner2 = GLVector (WIN_OUTPUT_X (window) + WIN_OUTPUT_W (window), WIN_OUTPUT_Y (window), 1.0f, 1.0f); GLVector corner3 = GLVector (WIN_OUTPUT_X (window), WIN_OUTPUT_Y (window) + WIN_OUTPUT_H (window), 1.0f, 1.0f); GLVector corner4 = GLVector (WIN_OUTPUT_X (window) + WIN_OUTPUT_W (window), WIN_OUTPUT_Y (window) + WIN_OUTPUT_H (window), 1.0f, 1.0f); mOutputRect = calculateWindowRect (corner1, corner2, corner3, corner4); } void FWWindow::calculateInputRect () { GLVector corner1 = GLVector (WIN_REAL_X (window), WIN_REAL_Y (window), 1.0f, 1.0f); GLVector corner2 = GLVector (WIN_REAL_X (window) + WIN_REAL_W (window), WIN_REAL_Y (window), 1.0f, 1.0f); GLVector corner3 = GLVector (WIN_REAL_X (window), WIN_REAL_Y (window) + WIN_REAL_H (window), 1.0f, 1.0f); GLVector corner4 = GLVector (WIN_REAL_X (window) + WIN_REAL_W (window), WIN_REAL_Y (window) + WIN_REAL_H (window), 1.0f, 1.0f); mInputRect = calculateWindowRect (corner1, corner2, corner3, corner4); } void FWWindow::calculateInputOrigin (float x, float y) { mIMidX = x; mIMidY = y; } void FWWindow::calculateOutputOrigin (float x, float y) { float dx, dy; dx = x - WIN_OUTPUT_X (window); dy = y - WIN_OUTPUT_Y (window); mOMidX = WIN_OUTPUT_X (window) + dx * mTransform.scaleX; mOMidY = WIN_OUTPUT_Y (window) + dy * mTransform.scaleY; } /* Change angles more than 360 into angles out of 360 */ /*static int FWMakeIntoOutOfThreeSixty (int value) { while (value > 0) { value -= 360; } if (value < 0) value += 360; return value; }*/ /* Determine if we clicked in the z-axis region */ void FWWindow::determineZAxisClick (int px, int py, bool motion) { bool directionChange = FALSE; if (!mCan2D && motion) { static int steps; /* Check if we are going in a particular 3D direction * because if we are going left/right and we suddenly * change to 2D mode this would not be expected behaviour. * It is only if we have a change in direction that we want * to change to 2D rotation. */ Direction direction, oldDirection = LeftRight; static int ddx, ddy; unsigned int dx = pointerX - lastPointerX; unsigned int dy = pointerY - lastPointerY; ddx += dx; ddy += dy; if (steps >= 10) { if (ddx > ddy) direction = LeftRight; else direction = UpDown; if (direction != oldDirection) directionChange = TRUE; direction = oldDirection; } steps++; } else directionChange = TRUE; if (directionChange) { float clickRadiusFromCenter; int x = (WIN_REAL_X(window) + WIN_REAL_W(window)/2.0); int y = (WIN_REAL_Y(window) + WIN_REAL_H(window)/2.0); clickRadiusFromCenter = sqrt(pow((x - px), 2) + pow((y - py), 2)); if (clickRadiusFromCenter > mRadius * (FWScreen::get (screen)->optionGetTdPercent () / 100)) { mCan2D = TRUE; mCan3D = FALSE; } else { mCan2D = FALSE; mCan3D = TRUE; } } } /* Check to see if we can shape a window */ bool FWWindow::canShape () { FREEWINS_SCREEN (screen); if (!fws->optionGetDoShapeInput ()) return FALSE; if (!screen->XShape ()) return FALSE; if (!fws->optionGetShapeWindowTypes ().evaluate (window)) return FALSE; return TRUE; } /* Checks if w is a ipw and returns the real window */ CompWindow * FWScreen::getRealWindow (CompWindow *w) { FWWindowInputInfo *info; foreach (info, mTransformedWindows) { if (w->id () == info->ipw) return info->w; } return NULL; } void FWWindow::handleSnap () { FREEWINS_SCREEN (screen); /* Handle Snapping */ if (fws->optionGetSnap () || fws->mSnap) { int snapFactor = fws->optionGetSnapThreshold (); mAnimate.destAngX = ((int) (mTransform.unsnapAngX) / snapFactor) * snapFactor; mAnimate.destAngY = ((int) (mTransform.unsnapAngY) / snapFactor) * snapFactor; mAnimate.destAngZ = ((int) (mTransform.unsnapAngZ) / snapFactor) * snapFactor; mTransform.scaleX = ((float) ( (int) (mTransform.unsnapScaleX * (21 - snapFactor) + 0.5))) / (21 - snapFactor); mTransform.scaleY = ((float) ( (int) (mTransform.unsnapScaleY * (21 - snapFactor) + 0.5))) / (21 - snapFactor); } } compiz-0.9.11+14.04.20140409/plugins/freewins/src/action.cpp0000644000015301777760000004745012321343002023557 0ustar pbusernogroup00000000000000/** * Compiz Fusion Freewins plugin * * action.cpp * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * Sam Spilsbury * * Button binding support and Reset added by: * enigma_0Z * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ /* TODO: Finish porting stuff to actions */ #include "freewins.h" /* ------ Actions -------------------------------------------------------*/ /* Initiate Mouse Rotation */ bool FWScreen::initiateFWRotate (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow* w; CompWindow *useW; Window xid; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); useW = screen->findWindow (xid); if (w) { foreach (FWWindowInputInfo *info, mTransformedWindows) { if (info->ipw) if (w->id () == info->ipw) /* The window we just grabbed was actually * an IPW, get the real window instead */ useW = getRealWindow (w); } mRotateCursor = XCreateFontCursor (screen->dpy (), XC_fleur); if (!screen->otherGrabExist ("freewins", 0)) if (!mGrabIndex) { mGrabIndex = screen->pushGrab (0, "freewins"); } } if (useW) { if (true || optionGetShapeWindowTypes ().evaluate (useW)) { FREEWINS_WINDOW (useW); int x = CompOption::getIntOptionNamed (options, "x", useW->x () + (useW->width () / 2)); int y = CompOption::getIntOptionNamed (options, "y", useW->y () + (useW->height () / 2)); int mods = CompOption::getIntOptionNamed (options, "modifiers", 0); mGrabWindow = useW; fww->mGrab = grabRotate; /* Save current scales and angles */ fww->mAnimate.oldAngX = fww->mTransform.angX; fww->mAnimate.oldAngY = fww->mTransform.angY; fww->mAnimate.oldAngZ = fww->mTransform.angZ; fww->mAnimate.oldScaleX = fww->mTransform.scaleX; fww->mAnimate.oldScaleY = fww->mTransform.scaleY; if (pointerY > fww->mIMidY) { if (pointerX > fww->mIMidX) fww->mCorner = CornerBottomRight; else if (pointerX < fww->mIMidX) fww->mCorner = CornerBottomLeft; } else if (pointerY < fww->mIMidY) { if (pointerX > fww->mIMidX) fww->mCorner = CornerTopRight; else if (pointerX < fww->mIMidX) fww->mCorner = CornerTopLeft; } switch (optionGetZAxisRotation ()) { case ZAxisRotationAlways3d: fww->mCan3D = TRUE; fww->mCan2D = FALSE; break; case ZAxisRotationAlways2d: fww->mCan3D = FALSE; fww->mCan2D = TRUE; break; case ZAxisRotationDetermineOnClick: case ZAxisRotationSwitch: fww->determineZAxisClick (pointerX, pointerY, FALSE); break; case ZAxisRotationInterchangeable: fww->mCan3D = TRUE; fww->mCan2D = TRUE; break; default: break; } /* Set the rotation axis */ switch (optionGetRotationAxis ()) { case RotationAxisAlwaysCentre: default: fww->calculateInputOrigin (WIN_REAL_X (mGrabWindow) + WIN_REAL_W (mGrabWindow) / 2.0f, WIN_REAL_Y (mGrabWindow) + WIN_REAL_H (mGrabWindow) / 2.0f); fww->calculateOutputOrigin (WIN_OUTPUT_X (mGrabWindow) + WIN_OUTPUT_W (mGrabWindow) / 2.0f, WIN_OUTPUT_Y (mGrabWindow) + WIN_OUTPUT_H (mGrabWindow) / 2.0f); break; case RotationAxisClickPoint: fww->calculateInputOrigin (mClick_root_x, mClick_root_y); fww->calculateOutputOrigin (mClick_root_x, mClick_root_y); break; case RotationAxisOppositeToClick: fww->calculateInputOrigin (useW->x () + useW->width () - mClick_root_x, useW->y () + useW->height () - mClick_root_y); fww->calculateOutputOrigin (useW->x () + useW->width () - mClick_root_x, useW->y () + useW->height () - mClick_root_y); break; } /* Announce that we grabbed the window */ useW->grabNotify (x, y, mods, CompWindowGrabMoveMask | CompWindowGrabButtonMask); /* Shape the window beforehand and avoid a stale grab */ if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); cScreen->damageScreen (); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); } } return true; } bool FWScreen::terminateFWRotate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mGrabWindow && mGrabIndex) { FREEWINS_WINDOW (mGrabWindow); if (fww->mGrab == grabRotate) { int distX, distY; fww->window->ungrabNotify (); switch (optionGetRotationAxis ()) { case RotationAxisClickPoint: case RotationAxisOppositeToClick: distX = (fww->mOutputRect.x1 () + (fww->mOutputRect.width ()) / 2.0f) - (WIN_REAL_X (mGrabWindow) + WIN_REAL_W (mGrabWindow) / 2.0f); distY = (fww->mOutputRect.y1 () + (fww->mOutputRect.height ()) / 2.0f) - (WIN_REAL_Y (mGrabWindow) + WIN_REAL_H (mGrabWindow) / 2.0f); mGrabWindow->move (distX, distY, true); fww->calculateInputOrigin (WIN_REAL_X (mGrabWindow) + WIN_REAL_W (mGrabWindow) / 2.0f, WIN_REAL_Y (mGrabWindow) + WIN_REAL_H (mGrabWindow) / 2.0f); fww->calculateOutputOrigin (WIN_OUTPUT_X (mGrabWindow) + WIN_OUTPUT_W (mGrabWindow) / 2.0f, WIN_OUTPUT_Y (mGrabWindow) + WIN_OUTPUT_H (mGrabWindow) / 2.0f); break; default: break; } if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); screen->removeGrab (mGrabIndex, 0); mGrabIndex = 0; mGrabWindow = NULL; fww->mGrab = grabNone; } } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } /*static void FWMoveWindowToCorrectPosition (CompWindow *w, float distX, float distY) { FREEWINS_WINDOW (w); action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); fprintf(stderr, "distX is %f distY is %f midX and midY are %f %f\n", distX, distY, fww->mIMidX, fww->mIMidY); moveWindow (w, distX * (1 + (1 - fww->mTransform.scaleX)), distY * (1 + (1 - fww->mTransform.scaleY)), TRUE, FALSE); syncWindowPosition (w); }*/ /* Initiate Scaling */ bool FWScreen::initiateFWScale (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow* w; CompWindow *useW; Window xid; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); useW = screen->findWindow (xid); if (w) { foreach (FWWindowInputInfo *info, mTransformedWindows) { if (info->ipw) if (w->id () == info->ipw) /* The window we just grabbed was actually * an IPW, get the real window instead */ useW = getRealWindow (w); } mRotateCursor = XCreateFontCursor (screen->dpy (), XC_fleur); if (!screen->otherGrabExist ("freewins", 0)) if (!mGrabIndex) mGrabIndex = screen->pushGrab (mRotateCursor, "freewins"); } if (useW) { if (optionGetShapeWindowTypes ().evaluate (useW)) { FREEWINS_WINDOW (useW); int x = CompOption::getIntOptionNamed (options, "x", useW->x () + (useW->width () / 2)); int y = CompOption::getIntOptionNamed (options, "y", useW->y () + (useW->height () / 2)); int mods = CompOption::getIntOptionNamed (options, "modifiers", 0); mGrabWindow = useW; /* Find out the corner we clicked in */ float MidX = fww->mInputRect.centerX (); float MidY = fww->mInputRect.centerY (); /* Check for Y axis clicking (Top / Bottom) */ if (pointerY > MidY) { /* Check for X axis clicking (Left / Right) */ if (pointerX > MidX) fww->mCorner = CornerBottomRight; else if (pointerX < MidX) fww->mCorner = CornerBottomLeft; } else if (pointerY < MidY) { /* Check for X axis clicking (Left / Right) */ if (pointerX > MidX) fww->mCorner = CornerTopRight; else if (pointerX < MidX) fww->mCorner = CornerTopLeft; } switch (optionGetScaleMode ()) { case ScaleModeToCentre: fww->calculateInputOrigin(WIN_REAL_X (useW) + WIN_REAL_W (useW) / 2.0f, WIN_REAL_Y (useW) + WIN_REAL_H (useW) / 2.0f); fww->calculateOutputOrigin(WIN_OUTPUT_X (useW) + WIN_OUTPUT_W (useW) / 2.0f, WIN_OUTPUT_Y (useW) + WIN_OUTPUT_H (useW) / 2.0f); break; /* *Experimental scale to corners mode */ case ScaleModeToOppositeCorner: switch (fww->mCorner) { case CornerBottomRight: /* Translate origin to the top left of the window */ //FWMoveWindowToCorrectPosition (w, fww->inputRect.x1 - WIN_REAL_X (useW), fww->inputRect.y1 - WIN_REAL_Y (useW)); fww->calculateInputOrigin (WIN_REAL_X (useW), WIN_REAL_Y (useW)); break; case CornerBottomLeft: /* Translate origin to the top right of the window */ //FWMoveWindowToCorrectPosition (w, fww->inputRect.x2 - (WIN_REAL_X (useW) + WIN_REAL_W (useW)), fww->inputRect.y1 - WIN_REAL_Y (useW)); fww->calculateInputOrigin (WIN_REAL_X (useW) + (WIN_REAL_W (useW)), WIN_REAL_Y (useW)); break; case CornerTopRight: /* Translate origin to the bottom left of the window */ //FWMoveWindowToCorrectPosition (w, fww->inputRect.x1 - WIN_REAL_X (useW) , fww->inputRect.y1 - (WIN_REAL_Y (useW) + WIN_REAL_H (useW))); fww->calculateInputOrigin (WIN_REAL_X (useW), WIN_REAL_Y (useW) + (WIN_REAL_H (useW))); break; case CornerTopLeft: /* Translate origin to the bottom right of the window */ //FWMoveWindowToCorrectPosition (w, fww->inputRect.x1 -(WIN_REAL_X (useW) + WIN_REAL_W (useW)) , fww->inputRect.y1 - (WIN_REAL_Y (useW) + WIN_REAL_H (useW))); fww->calculateInputOrigin (WIN_REAL_X (useW) + (WIN_REAL_W (useW)), WIN_REAL_Y (useW) + (WIN_REAL_H (useW))); break; } break; } fww->mGrab = grabScale; /* Announce that we grabbed the window */ useW->grabNotify (x, y, mods, CompWindowGrabMoveMask | CompWindowGrabButtonMask); cScreen->damageScreen (); /* Shape the window beforehand and avoid a stale grab */ if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); } } return TRUE; } bool FWScreen::terminateFWScale (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mGrabWindow && mGrabIndex) { FREEWINS_WINDOW (mGrabWindow); if (fww->mGrab == grabScale) { fww->window->ungrabNotify (); switch (optionGetScaleMode ()) { int distX, distY; case ScaleModeToOppositeCorner: distX = (fww->mOutputRect.x1 () + (fww->mOutputRect.width () / 2.0f) - (WIN_REAL_X (mGrabWindow) + WIN_REAL_W (mGrabWindow) / 2.0f)); distY = (fww->mOutputRect.y1 () + (fww->mOutputRect.width () / 2.0f) - (WIN_REAL_Y (mGrabWindow) + WIN_REAL_H (mGrabWindow) / 2.0f)); mGrabWindow->move (distX, distY, true); fww->calculateInputOrigin (WIN_REAL_X (mGrabWindow) + WIN_REAL_W (mGrabWindow) / 2.0f, WIN_REAL_Y (mGrabWindow) + WIN_REAL_H (mGrabWindow) / 2.0f); fww->calculateOutputOrigin (WIN_OUTPUT_X (mGrabWindow) + WIN_OUTPUT_W (mGrabWindow) / 2.0f, WIN_OUTPUT_Y (mGrabWindow) + WIN_OUTPUT_H (mGrabWindow) / 2.0f); break; default: break; } screen->removeGrab (mGrabIndex, 0); mGrabIndex = 0; mGrabWindow = NULL; fww->mGrab = grabNone; } } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return FALSE; } /* Repetitive Stuff */ void FWWindow::setPrepareRotation (float dx, float dy, float dz, float dsu, float dsd) { if (FWScreen::get (screen)->optionGetShapeWindowTypes ().evaluate (window)) { calculateInputOrigin (WIN_REAL_X (window) + WIN_REAL_W (window) / 2.0f, WIN_REAL_Y (window) + WIN_REAL_H (window) / 2.0f); calculateOutputOrigin (WIN_OUTPUT_X (window) + WIN_OUTPUT_W (window) / 2.0f, WIN_OUTPUT_Y (window) + WIN_OUTPUT_H (window) / 2.0f); mTransform.unsnapAngX += dy; mTransform.unsnapAngY -= dx; mTransform.unsnapAngZ += dz; mTransform.unsnapScaleX += dsu; mTransform.unsnapScaleY += dsd; mAnimate.oldAngX = mTransform.angX; mAnimate.oldAngY = mTransform.angY; mAnimate.oldAngZ = mTransform.angZ; mAnimate.oldScaleX = mTransform.scaleX; mAnimate.oldScaleY = mTransform.scaleY; mAnimate.destAngX = mTransform.angX + dy; mAnimate.destAngY = mTransform.angY - dx; mAnimate.destAngZ = mTransform.angZ + dz; mAnimate.destScaleX = mTransform.scaleX + dsu; mAnimate.destScaleY = mTransform.scaleY + dsd; } } #define ROTATE_INC freewinsGetRotateIncrementAmount (w->screen) #define NEG_ROTATE_INC freewinsGetRotateIncrementAmount (w->screen) *-1 #define SCALE_INC freewinsGetScaleIncrementAmount (w->screen) #define NEG_SCALE_INC freewinsGetScaleIncrementAmount (w->screen) *-1 bool FWScreen::rotate (CompAction *action, CompAction::State state, CompOption::Vector options, int dx, int dy, int dz) { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); foreach (FWWindowInputInfo *info, mTransformedWindows) { if (info->ipw == w->id ()) { w = getRealWindow (w); } } FREEWINS_WINDOW (w); fww->setPrepareRotation (dx, dy, dz, 0, 0); if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); return true; } bool FWScreen::scale (CompAction *action, CompAction::State state, CompOption::Vector options, int scale) { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); foreach (FWWindowInputInfo *info, mTransformedWindows) { if (info->ipw == w->id ()) { w = getRealWindow (w); } } FREEWINS_WINDOW (w); fww->setPrepareRotation (0, 0, 0, scale, scale); fww->cWindow->addDamage (); if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); if (!optionGetAllowNegative ()) { float minScale = optionGetMinScale (); if (fww->mAnimate.destScaleX < minScale) fww->mAnimate.destScaleX = minScale; if (fww->mAnimate.destScaleY < minScale) fww->mAnimate.destScaleY = minScale; } return true; } /* Reset the Rotation and Scale to 0 and 1 */ bool FWScreen::resetFWTransform (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); foreach (FWWindowInputInfo *info, mTransformedWindows) { if (info->ipw == w->id ()) { w = getRealWindow (w); } } if (w) { FREEWINS_WINDOW (w); fww->setPrepareRotation (fww->mTransform.angY, -fww->mTransform.angX, -fww->mTransform.angZ, (1 - fww->mTransform.scaleX), (1 - fww->mTransform.scaleY)); fww->cWindow->addDamage (); fww->mTransformed = FALSE; if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); fww->mResetting = TRUE; } return TRUE; } /* Callable action to rotate a window to the angle provided * x: Set angle to x degrees * y: Set angle to y degrees * z: Set angle to z degrees * window: The window to apply the transformation to */ bool FWScreen::rotateAction (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w; w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) { FREEWINS_WINDOW (w); float x = CompOption::getFloatOptionNamed(options, "x", 0.0f); float y = CompOption::getFloatOptionNamed(options, "y", 0.0f); float z = CompOption::getFloatOptionNamed(options, "z", 0.0f); fww->setPrepareRotation (x - fww->mAnimate.destAngX, y - fww->mAnimate.destAngY, z - fww->mAnimate.destAngZ, 0, 0); fww->cWindow->addDamage (); } else { return false; } return true; } /* Callable action to increment window rotation by the angles provided * x: Increment angle by x degrees * y: Increment angle by y degrees * z: Increment angle by z degrees * window: The window to apply the transformation to */ bool FWScreen::incrementRotateAction (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w; w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) { FREEWINS_WINDOW (w); float x = CompOption::getFloatOptionNamed(options, "x", 0.0f); float y = CompOption::getFloatOptionNamed(options, "y", 0.0f); float z = CompOption::getFloatOptionNamed(options, "z", 0.0f); fww->setPrepareRotation (x, y, z, 0, 0); fww->cWindow->addDamage (); } else { return false; } return true; } /* Callable action to scale a window to the scale provided * x: Set scale to x factor * y: Set scale to y factor * window: The window to apply the transformation to */ bool FWScreen::scaleAction (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w; w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) { FREEWINS_WINDOW (w); float x = CompOption::getFloatOptionNamed (options, "x", 0.0f); float y = CompOption::getFloatOptionNamed (options, "y", 0.0f); fww->setPrepareRotation (0, 0, 0, x - fww->mAnimate.destScaleX, y - fww->mAnimate.destScaleY); if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); /* Stop scale at threshold specified */ if (!optionGetAllowNegative ()) { float minScale = optionGetMinScale (); if (fww->mAnimate.destScaleX < minScale) fww->mAnimate.destScaleX = minScale; if (fww->mAnimate.destScaleY < minScale) fww->mAnimate.destScaleY = minScale; } fww->cWindow->addDamage (); if (fww->canShape ()) fww->handleWindowInputInfo (); } else { return false; } return true; } /* Toggle Axis-Help Display */ bool FWScreen::toggleFWAxis (CompAction *action, CompAction::State state, CompOption::Vector options) { mAxisHelp = !mAxisHelp; cScreen->damageScreen (); return TRUE; } compiz-0.9.11+14.04.20140409/plugins/freewins/src/input.cpp0000644000015301777760000002342512321343002023435 0ustar pbusernogroup00000000000000/** * Compiz Fusion Freewins plugin * * input.cpp * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * Sam Spilsbury * * Button binding support and Reset added by: * enigma_0Z * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ #include "freewins.h" #include /* ------ Input Prevention -------------------------------------------*/ /* Shape the IPW * Thanks to Joel Bosveld (b0le) * for helping me with this section */ void FWWindow::shapeIPW () { if (mInput) { Window xipw = mInput->ipw; CompWindow *ipw = screen->findWindow (xipw); if (ipw) { cairo_t *cr; int width, height; width = mInputRect.width (); height = mInputRect.height (); Pixmap b = XCreatePixmap (screen->dpy (), xipw, width, height, 1); cairo_surface_t *bitmap = cairo_xlib_surface_create_for_bitmap (screen->dpy (), b, DefaultScreenOfDisplay (screen->dpy ()), width, height); cr = cairo_create (bitmap); cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); /* Move to our first corner (TopLeft) */ cairo_move_to (cr, mOutput.shapex1 - MIN(mInputRect.x1 (), mInputRect.x2 ()), mOutput.shapey1 - MIN(mInputRect.y1 (), mInputRect.y2 ())); /* Line to TopRight */ cairo_line_to (cr, mOutput.shapex2 - MIN(mInputRect.x1 (), mInputRect.x2 ()), mOutput.shapey2 - MIN(mInputRect.y1 (), mInputRect.y2 ())); /* Line to BottomRight */ cairo_line_to (cr, mOutput.shapex4 - MIN(mInputRect.x1 (), mInputRect.x2 ()), mOutput.shapey4 - MIN(mInputRect.y1 (), mInputRect.y2 ())); /* Line to BottomLeft */ cairo_line_to (cr, mOutput.shapex3 - MIN(mInputRect.x1 (), mInputRect.x2 ()), mOutput.shapey3 - MIN(mInputRect.y1 (), mInputRect.y2 ())); /* Line to TopLeft */ cairo_line_to (cr, mOutput.shapex1 - MIN(mInputRect.x1 (), mInputRect.x2 ()), mOutput.shapey1 - MIN(mInputRect.y1 (), mInputRect.y2 ())); /* Ensure it's all closed up */ cairo_close_path (cr); /* Fill in the box */ cairo_set_source_rgb (cr, 1.0f, 1.0f, 1.0f); cairo_fill (cr); /* This takes the bitmap we just drew with cairo * and scans out the white bits (You can see these) * if you uncomment the following line after this * comment. Then, all the bits we drew on are clickable, * leaving us with a nice and neat window shape. Yummy. */ /* XWriteBitmapFile (ipw->screen->display->display, "/path/to/your/image.bmp", b, ipw->width, ipw->height, -1, -1); */ XShapeCombineMask (screen->dpy (), xipw, ShapeBounding, 0, 0, b, ShapeSet); XFreePixmap (screen->dpy (), b); cairo_surface_destroy (bitmap); cairo_destroy (cr); } } } void FWWindow::saveInputShape (XRectangle **retRects, int *retCount, int *retOrdering) { XRectangle *rects; int count = 0, ordering; Display *dpy = screen->dpy (); rects = XShapeGetRectangles (dpy, window->id (), ShapeInput, &count, &ordering); /* check if the returned shape exactly matches the window shape - if that is true, the window currently has no set input shape */ if ((count == 1) && (rects[0].x == -window->geometry ().border ()) && (rects[0].y == -window->geometry ().border ()) && (rects[0].width == (window->serverWidth () + window->serverGeometry ().border ())) && (rects[0].height == (window->serverHeight () + window->serverGeometry (). border ()))) { count = 0; } *retRects = rects; *retCount = count; *retOrdering = ordering; } void FWScreen::addWindowToList (FWWindowInputInfo *info) { mTransformedWindows.push_back (info); } void FWScreen::removeWindowFromList (FWWindowInputInfo *info) { mTransformedWindows.remove (info); } /* Adjust size and location of the input prevention window */ void FWWindow::adjustIPW () { XWindowChanges xwc; Display *dpy = screen->dpy (); float f_width, f_height; if (!mInput || !mInput->ipw) return; f_width = mInputRect.width (); f_height = mInputRect.height (); xwc.x = mInputRect.x (); xwc.y = mInputRect.y (); xwc.width = (int) f_width; xwc.height = (int) f_height; xwc.stack_mode = Below; /* XXX: This causes XConfigureWindow to break */ //xwc.sibling = window->id (); XMapWindow (dpy, mInput->ipw); XConfigureWindow (dpy, mInput->ipw, CWStackMode | CWX | CWY | CWWidth | CWHeight, &xwc); shapeIPW (); } void FWScreen::adjustIPWStacking () { foreach (FWWindowInputInfo *run, mTransformedWindows) { if (!run->w->prev || run->w->prev->id () != run->ipw) FWWindow::get (run->w)->adjustIPW (); } } /* Create an input prevention window */ void FWWindow::createIPW () { Window ipw; XSetWindowAttributes attrib; XWindowChanges xwc; if (!mInput || mInput->ipw) return; attrib.override_redirect = true; //attrib.event_mask = 0; xwc.x = mInputRect.x (); xwc.y = mInputRect.y (); xwc.width = mInputRect.width (); xwc.height = mInputRect.height (); ipw = XCreateWindow (screen->dpy (), screen->root (), xwc.x, xwc.y, xwc.width, xwc.height, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect, &attrib); XMapWindow (screen->dpy (), ipw); //XConfigureWindow (screen->dpy (), ipw, CWStackMode | CWX | CWY | CWWidth | CWHeight, &xwc); mInput->ipw = ipw; //shapeIPW (); } FWWindowInputInfo::FWWindowInputInfo (CompWindow *window) : w (window), ipw (None), inputRects (NULL), nInputRects (0), inputRectOrdering (0), frameInputRects (NULL), frameNInputRects (0), frameInputRectOrdering (0) { } FWWindowInputInfo::~FWWindowInputInfo () { } bool FWWindow::handleWindowInputInfo () { FREEWINS_SCREEN (screen); if (!mTransformed && mInput) { if (mInput->ipw) XDestroyWindow (screen->dpy (), mInput->ipw); unshapeInput (); fws->removeWindowFromList (mInput); delete mInput; mInput = NULL; return false; } else if (mTransformed && !mInput) { mInput = new FWWindowInputInfo (window); if (!mInput) return false; shapeInput (); createIPW (); fws->addWindowToList (mInput); } return true; } /* Shape the input of the window when scaled. * Since the IPW will be dealing with the input, removing input * from the window entirely is a perfectly good solution. */ void FWWindow::shapeInput () { Window frame; Display *dpy = screen->dpy(); saveInputShape (&mInput->inputRects, &mInput->nInputRects, &mInput->inputRectOrdering); frame = window->frame(); if (frame) { saveInputShape (&mInput->frameInputRects, &mInput->frameNInputRects, &mInput->frameInputRectOrdering); } else { mInput->frameInputRects = NULL; mInput->frameNInputRects = -1; mInput->frameInputRectOrdering = 0; } /* clear shape */ XShapeSelectInput (dpy, window->id(), NoEventMask); XShapeCombineRectangles (dpy, window->id(), ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); if (frame) XShapeCombineRectangles (dpy, window->frame(), ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); XShapeSelectInput (dpy, window->id(), ShapeNotify); } /* Restores the shape of the window: * If the window had a custom shape defined by inputRects then we restore * that in order with XShapeCombineRectangles. * Most windows have no specific defined shape so we can restore it with * setting the shape to a 0x0 mask */ void FWWindow::unshapeInput () { Display *dpy = screen->dpy (); if (mInput->nInputRects) { XShapeCombineRectangles (dpy, window->id(), ShapeInput, 0, 0, mInput->inputRects, mInput->nInputRects, ShapeSet, mInput->inputRectOrdering); } else { XShapeCombineMask (dpy, window->id(), ShapeInput, 0, 0, None, ShapeSet); } if (mInput->frameNInputRects >= 0) { if (mInput->frameNInputRects) { XShapeCombineRectangles (dpy, window->frame(), ShapeInput, 0, 0, mInput->frameInputRects, mInput->frameNInputRects, ShapeSet, mInput->frameInputRectOrdering); } else { XShapeCombineMask (dpy, window->frame(), ShapeInput, 0, 0, None, ShapeSet); } } } compiz-0.9.11+14.04.20140409/plugins/decor/0000755000015301777760000000000012321344021020251 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/tests/0000755000015301777760000000000012321344021021413 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/tests/CMakeLists.txt0000644000015301777760000000003612321343002024150 0ustar pbusernogroup00000000000000add_subdirectory (acceptance) compiz-0.9.11+14.04.20140409/plugins/decor/tests/acceptance/0000755000015301777760000000000012321344021023501 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/tests/acceptance/xorg-gtest/0000755000015301777760000000000012321344021025604 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/tests/acceptance/xorg-gtest/CMakeLists.txt0000644000015301777760000000254112321343002030344 0ustar pbusernogroup00000000000000include (FindPkgConfig) pkg_check_modules (X11_XI x11 xi xext) if (BUILD_XORG_GTEST AND X11_XI_FOUND) include_directories (${compiz_SOURCE_DIR}/tests/shared ${COMPIZ_XORG_SYSTEM_TEST_INCLUDE_DIR} ${X11_INCLUDE_DIRS} ${XORG_SERVER_INCLUDE_XORG_GTEST} ${XORG_SERVER_GTEST_SRC} ${GTEST_INCLUDE_DIRS}) link_directories (${X11_XI_LIBRARY_DIRS} ${COMPIZ_COMPOSITE_DAMAGETRACKING_INTEGRATION_LIBRARY_DIRS}) add_executable (compiz_test_decor_acceptance ${CMAKE_CURRENT_SOURCE_DIR}/compiz_decor_acceptance_tests.cpp) set (COMPIZ_DECOR_ACCEPTANCE_TEST_LIBRARIES xorg_gtest_all compiz_xorg_gtest_main compiz_xorg_gtest_system_test decoration compiz_point compiz_size compiz_rect ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_LIBRARIES} ${X11_XI_LIBRARIES}) target_link_libraries (compiz_test_decor_acceptance ${COMPIZ_DECOR_ACCEPTANCE_TEST_LIBRARIES}) # Disabled until the tests can be run without opengl #compiz_discover_tests (compiz_test_decor_acceptance WITH_XORG_GTEST) endif (BUILD_XORG_GTEST AND X11_XI_FOUND) ././@LongLink0000000000000000000000000000015100000000000011212 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/tests/acceptance/xorg-gtest/compiz_decor_acceptance_tests.cppcompiz-0.9.11+14.04.20140409/plugins/decor/tests/acceptance/xorg-gtest/compiz_decor_acceptance_tests0000644000015301777760000022166112321343002033602 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest Decoration Acceptance Tests * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include "decoration.h" #include #include #include #include #include #include namespace xt = xorg::testing; namespace ct = compiz::testing; using ::testing::AllOf; using ::testing::AtLeast; using ::testing::Eq; using ::testing::Field; using ::testing::ReturnNull; using ::testing::Return; using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::Matcher; using ::testing::MakeMatcher; using ::testing::StrEq; using ::testing::ValuesIn; using ::testing::WithParamInterface; using ::testing::_; using ::compiz::testing::HasGeometry; using ::compiz::testing::RelativeWindowGeometry; using ::compiz::testing::AbsoluteWindowGeometry; class BaseDecorAcceptance : public ct::AutostartCompizXorgSystemTestWithTestHelper { public: BaseDecorAcceptance (); virtual void SetUp (); virtual ct::CompizProcess::PluginList GetPluginList (); protected: Window mRootWindow; Atom mUtf8StringAtom; Atom mDecorationManagerNameAtom; Atom mDecorationTypeAtom; Atom mDecorationTypePixmap; Atom mDecorationTypeWindow; Atom mDecorationInputFrameAtom; Atom mDecorationOutputFrameAtom; TmpEnv mDisableConfigureBufferLocksEnv; private: int GetEventMask () const; }; BaseDecorAcceptance::BaseDecorAcceptance () : mRootWindow (0), mUtf8StringAtom (0), mDecorationManagerNameAtom (0), mDecorationTypeAtom (0), mDecorationTypePixmap (0), mDecorationTypeWindow (0), mDecorationInputFrameAtom (0), mDecorationOutputFrameAtom (0), /* Disable configure buffer locks as they cause event delivery indeterminacy * that isn't useful for a testing environment */ mDisableConfigureBufferLocksEnv ("COMPIZ_NO_CONFIGURE_BUFFER_LOCKS", "1") { } int BaseDecorAcceptance::GetEventMask () const { return ct::AutostartCompizXorgSystemTestWithTestHelper::GetEventMask () | SubstructureNotifyMask; } void BaseDecorAcceptance::SetUp () { ct::AutostartCompizXorgSystemTestWithTestHelper::SetUp (); mUtf8StringAtom = XInternAtom (Display (), "UTF8_STRING", 1); ASSERT_NE (0, mUtf8StringAtom); mDecorationManagerNameAtom = XInternAtom (Display (), "_COMPIZ_DM_NAME", 0); ASSERT_NE (0, mDecorationManagerNameAtom); mDecorationTypePixmap = XInternAtom (Display (), DECOR_TYPE_PIXMAP_ATOM_NAME, 0); ASSERT_NE (0, mDecorationTypePixmap); mDecorationTypeWindow = XInternAtom (Display (), DECOR_TYPE_WINDOW_ATOM_NAME, 0); ASSERT_NE (0, mDecorationTypeWindow); mDecorationTypeAtom = XInternAtom (Display (), DECOR_TYPE_ATOM_NAME, 0); ASSERT_NE (0, mDecorationTypeAtom); mDecorationInputFrameAtom = XInternAtom (Display (), DECOR_INPUT_FRAME_ATOM_NAME, 0); ASSERT_NE (0, mDecorationInputFrameAtom); mDecorationOutputFrameAtom = XInternAtom (Display (), DECOR_OUTPUT_FRAME_ATOM_NAME, 0); ASSERT_NE (0, mDecorationOutputFrameAtom); mRootWindow = DefaultRootWindow (Display ()); ASSERT_NE (0, mRootWindow); } ct::CompizProcess::PluginList BaseDecorAcceptance::GetPluginList () { typedef ct::AutostartCompizXorgSystemTestWithTestHelper Base; ct::CompizProcess::PluginList baseList (Base::GetPluginList ()); ct::CompizProcess::PluginList list; list.push_back (ct::CompizProcess::Plugin ("composite", ct::CompizProcess::Real)); list.push_back (ct::CompizProcess::Plugin ("opengl", ct::CompizProcess::Real)); list.push_back (ct::CompizProcess::Plugin ("decor", ct::CompizProcess::Real)); for (ct::CompizProcess::PluginList::iterator it = baseList.begin (); it != baseList.end (); ++it) list.push_back (*it); return list; } namespace compiz { namespace decor { namespace testing { const char *DecorationClientName = "fake"; const char *FailedToAcquireMessage = "Could not acquire selection for an unknown reason"; const char *OtherDecorationManagerRunningMessage = "Another decoration manager is already running"; struct MWMHints { unsigned long flags; unsigned long functions; unsigned long decorations; }; static const unsigned int MwmDecor = 1L << 0; class FakeDecorator { public: FakeDecorator (Display *d, int supporting = WINDOW_DECORATION_TYPE_WINDOW); ~FakeDecorator (); Window currentSelectionOwner (); Atom sessionOwnerAtom (); Window supportingCheckWindow (); private: Display *mDpy; int mScreenNumber; Window mRootWindow; int mSessionStatus; Time mDecorationManagerTimestamp; Atom mSessionOwnerAtom; Window mSessionOwner; Atom mSupportingHintAtom; Atom mSupportingHintWindowAtom; Window mSupportingHintWindow; }; class FakeDecoration { public: typedef boost::shared_ptr Ptr; FakeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight); virtual ~FakeDecoration (); virtual size_t propertyDataSize () const = 0; virtual void addPropertyData (std::vector &) const = 0; bool match (unsigned int type, unsigned int state, unsigned int actions) const; virtual CompPoint restoredFrameWindowOffset () const = 0; virtual CompSize restoredDecorationBorderSize () const = 0; virtual CompSize restoredDecorationInputSize () const = 0; protected: void insertBaseData (std::vector &) const; static const size_t BaseDataSize = 5; unsigned int mType; unsigned int mState; unsigned int mActions; unsigned int mMinWidth; unsigned int mMinHeight; }; class FakeWindowTypeDecoration : public FakeDecoration { public: FakeWindowTypeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight, const decor_extents_t &restored, const decor_extents_t &maximized); protected: size_t propertyDataSize () const; void addPropertyData (std::vector &) const; CompPoint restoredFrameWindowOffset () const; CompSize restoredDecorationBorderSize () const; CompSize restoredDecorationInputSize () const; static const unsigned int WindowDecorationSize = 8; private: decor_extents_t mRestored; decor_extents_t mMaximized; }; class FakePixmapTypeDecoration : public FakeDecoration { public: typedef boost::shared_ptr Ptr; FakePixmapTypeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight, const decor_extents_t &restoredBorder, const decor_extents_t &restoredInput, const decor_extents_t &maximizedBorder, const decor_extents_t &maximizedInput, Display *dpy); ~FakePixmapTypeDecoration (); void changeRestoredBorder (const decor_extents_t &border); void changeRestoredInput (const decor_extents_t &input); CompPoint restoredFrameWindowOffset () const; CompSize restoredDecorationBorderSize () const; CompSize restoredDecorationInputSize () const; protected: size_t propertyDataSize () const; void addPropertyData (std::vector &) const; private: decor_extents_t mRestoredBorder; decor_extents_t mRestoredInput; decor_extents_t mMaximizedBorder; decor_extents_t mMaximizedInput; decor_context_t mContext; decor_quad_t mQuads[N_QUADS_MAX]; decor_layout_t mLayout; unsigned int mNQuads; Display *mDpy; Pixmap mPixmap; }; class FakeDecorationList { public: FakeDecorationList () : mDecorationType (WINDOW_DECORATION_TYPE_PIXMAP) { } FakeDecorationList (unsigned int type) : mDecorationType (type) { } void AddDecoration (const FakeDecoration::Ptr &); void RemoveDecoration (unsigned int type, unsigned int state, unsigned int actions); void RemoveAllDecorations (); void SetPropertyOnWindow (Display *dpy, Window w, Atom property); private: unsigned int mDecorationType; std::vector decorations; }; class AcquisitionFailed : public std::exception { public: AcquisitionFailed (int status); const char * what () const throw (); private: int mStatus; }; } } } namespace { bool Advance (Display *d, bool result) { return ct::AdvanceToNextEventOnSuccess (d, result); } class ManagerMessageMatcher : public ct::ClientMessageXEventMatcher { public: ManagerMessageMatcher (Display *dpy, Atom managed); virtual bool MatchAndExplain (const XEvent &event, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; private: Display *mDpy; Atom mManager; Atom mManaged; }; void FreePropertyData (unsigned char *array) { if (array) XFree (array); } int SafeFetchProperty (Display *dpy, Window w, Atom property, long offset, long length, Atom requestedType, Atom &returnType, int &returnFormat, unsigned long &returnNItems, unsigned long &returnBytesRemaining, boost::shared_ptr &data) { unsigned char *dataLocation; int status = XGetWindowProperty (dpy, w, property, offset, length, 0, requestedType, &returnType, &returnFormat, &returnNItems, &returnBytesRemaining, &dataLocation); data.reset (dataLocation, boost::bind (FreePropertyData, _1)); return status; } void FetchAndVerifyProperty (Display *dpy, Window w, Atom property, Atom expectedType, int expectedFormat, unsigned long expectedItems, unsigned long expectedBytesAfter, boost::shared_ptr &data) { Atom returnedType = 0; int returnedFormat = 0; unsigned long returnedNItems = 0; unsigned long returnedBytesRemaining = 0; std::stringstream ss; int status = SafeFetchProperty (dpy, w, property, 0L, 1024L, expectedType, returnedType, returnedFormat, returnedNItems, returnedBytesRemaining, data); if (status != Success) ss << "XGetWindowProperty failed:" << std::endl; if (returnedType != expectedType) ss << "Expected type of " << XGetAtomName (dpy, expectedType) << std::endl; if (returnedFormat != expectedFormat) ss << "Expected format of " << expectedFormat << " but got " << returnedFormat << std::endl; if (returnedNItems != expectedItems) ss << "Expected " << expectedItems << " items" << " but got " << returnedNItems << " items" << std::endl; if (returnedBytesRemaining != expectedBytesAfter) ss << "Expected " << expectedBytesAfter << " bytes remaining" << " but got " << returnedBytesRemaining << " bytes remaining" << std::endl; if (!ss.str ().empty ()) throw std::logic_error (ss.str ()); } } ManagerMessageMatcher::ManagerMessageMatcher (Display *dpy, Atom managed) : ct::ClientMessageXEventMatcher (dpy, XInternAtom (dpy, "MANAGER", 1), DefaultRootWindow (dpy)), mDpy (dpy), mManaged (managed) { } bool ManagerMessageMatcher::MatchAndExplain (const XEvent &event, MatchResultListener *listener) const { if (ct::ClientMessageXEventMatcher::MatchAndExplain (event, listener)) { /* Evaluate the second field for the atom */ return event.xclient.data.l[1] == static_cast (mManaged); } return false; } void ManagerMessageMatcher::DescribeTo (std::ostream *os) const { *os << "manager of selection atom " << XGetAtomName (mDpy, mManaged); } namespace cdt = compiz::decor::testing; cdt::FakeDecoration::FakeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight) : mType (type), mState (state), mActions (actions), mMinWidth (minWidth), mMinHeight (minHeight) { } cdt::FakeDecoration::~FakeDecoration () { } bool cdt::FakeDecoration::match (unsigned int type, unsigned int state, unsigned int actions) const { return type == mType && state == mState && actions == mActions; } cdt::FakeWindowTypeDecoration::FakeWindowTypeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight, const decor_extents_t &restored, const decor_extents_t &maximized) : FakeDecoration (type, state, actions, minWidth, minHeight), mRestored (restored), mMaximized (maximized) { } void cdt::FakeWindowTypeDecoration::addPropertyData (std::vector &vec) const { long propData[PROP_HEADER_SIZE + propertyDataSize ()]; decor_gen_window_property (propData, 0, const_cast (&mRestored), const_cast (&mMaximized), mMinWidth, mMinHeight, mState, mType, mActions); for (size_t i = PROP_HEADER_SIZE; i < (PROP_HEADER_SIZE + propertyDataSize ()); ++i) vec.push_back (propData[i]); } size_t cdt::FakeWindowTypeDecoration::propertyDataSize () const { return WINDOW_PROP_SIZE; } CompPoint cdt::FakeWindowTypeDecoration::restoredFrameWindowOffset () const { int xOffset = -mRestored.left; int yOffset = -mRestored.top; return CompPoint (xOffset, yOffset); } CompSize cdt::FakeWindowTypeDecoration::restoredDecorationBorderSize () const { return CompSize (mRestored.left + mRestored.right, mRestored.top + mRestored.bottom); } CompSize cdt::FakeWindowTypeDecoration::restoredDecorationInputSize () const { return restoredDecorationBorderSize (); } cdt::FakePixmapTypeDecoration::FakePixmapTypeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight, const decor_extents_t &restoredBorder, const decor_extents_t &restoredInput, const decor_extents_t &maximizedBorder, const decor_extents_t &maximizedInput, Display *dpy) : FakeDecoration (type, state, actions, minWidth, minHeight), mRestoredBorder (restoredBorder), mRestoredInput (restoredInput), mMaximizedBorder (maximizedBorder), mMaximizedInput (maximizedInput), mDpy (dpy), mPixmap (XCreatePixmap (mDpy, DefaultRootWindow (mDpy), 10, 10, DefaultDepth (mDpy, (DefaultScreen (mDpy))))) { /* 10x10 decoration, 0 corner space, 0 spacing, 2px each side */ mContext.extents.left = 2; mContext.extents.right = 2; mContext.extents.top = 2; mContext.extents.bottom = 2; mContext.left_space = 0; mContext.right_space = 0; mContext.top_space = 0; mContext.bottom_space = 0; mContext.left_corner_space = 0; mContext.right_corner_space = 0; mContext.top_corner_space = 0; mContext.bottom_corner_space = 0; decor_get_default_layout (&mContext, minWidth, minHeight, &mLayout); mNQuads = decor_set_lSrStSbS_window_quads (mQuads, &mContext, &mLayout); } cdt::FakePixmapTypeDecoration::~FakePixmapTypeDecoration () { XFreePixmap (mDpy, mPixmap); } size_t cdt::FakePixmapTypeDecoration::propertyDataSize () const { return BASE_PROP_SIZE + (QUAD_PROP_SIZE * mNQuads); } void cdt::FakePixmapTypeDecoration::addPropertyData (std::vector &vec) const { long propData[PROP_HEADER_SIZE + propertyDataSize ()]; decor_quads_to_property (propData, 0, mPixmap, const_cast (&mRestoredInput), const_cast (&mRestoredBorder), const_cast (&mMaximizedInput), const_cast (&mMaximizedBorder), mMinWidth, mMinHeight, const_cast (mQuads), mNQuads, mType, mState, mActions); for (size_t i = PROP_HEADER_SIZE; i < (PROP_HEADER_SIZE + propertyDataSize ()); ++i) vec.push_back (propData[i]); } CompPoint cdt::FakePixmapTypeDecoration::restoredFrameWindowOffset () const { int xOffset = mRestoredBorder.left - mRestoredInput.left; int yOffset = mRestoredBorder.top - mRestoredInput.top; return CompPoint (xOffset, yOffset); } CompSize cdt::FakePixmapTypeDecoration::restoredDecorationBorderSize () const { return CompSize (mRestoredBorder.left + mRestoredBorder.right, mRestoredBorder.top + mRestoredBorder.bottom); } CompSize cdt::FakePixmapTypeDecoration::restoredDecorationInputSize () const { return CompSize (mRestoredInput.left + mRestoredInput.right, mRestoredInput.top + mRestoredInput.bottom); } void cdt::FakePixmapTypeDecoration::changeRestoredBorder (const decor_extents_t &b) { mRestoredBorder = b; } void cdt::FakePixmapTypeDecoration::changeRestoredInput (const decor_extents_t &i) { mRestoredInput = i; } void cdt::FakeDecorationList::AddDecoration (const cdt::FakeDecoration::Ptr &decoration) { decorations.push_back (decoration); } namespace { bool MatchesTypeStateAndActions (const cdt::FakeDecoration::Ptr &decoration, unsigned int type, unsigned int state, unsigned int actions) { return decoration->match (type, state, actions); } } void cdt::FakeDecorationList::RemoveDecoration (unsigned int type, unsigned int state, unsigned int actions) { decorations.erase ( std::remove_if (decorations.begin (), decorations.end (), boost::bind (MatchesTypeStateAndActions, _1, type, state, actions)), decorations.end ()); } void cdt::FakeDecorationList::RemoveAllDecorations () { decorations.clear (); } void cdt::FakeDecorationList::SetPropertyOnWindow (Display *dpy, Window w, Atom property) { size_t size = PROP_HEADER_SIZE; for (std::vector ::iterator it = decorations.begin (); it != decorations.end (); ++it) size += (*it)->propertyDataSize (); std::vector data; data.reserve (size); data.push_back (decor_version ()); data.push_back (mDecorationType); data.push_back (decorations.size ()); for (std::vector ::iterator it = decorations.begin (); it != decorations.end (); ++it) (*it)->addPropertyData (data); XChangeProperty (dpy, w, property, XA_INTEGER, 32, PropModeReplace, reinterpret_cast (&data[0]), size); } cdt::AcquisitionFailed::AcquisitionFailed (int status) : mStatus (status) { } const char * cdt::AcquisitionFailed::what () const throw () { switch (mStatus) { case DECOR_ACQUIRE_STATUS_FAILED: return FailedToAcquireMessage; case DECOR_ACQUIRE_STATUS_OTHER_DM_RUNNING: return OtherDecorationManagerRunningMessage; default: return "Unknown status"; } return "Unknown status"; } cdt::FakeDecorator::FakeDecorator (Display *d, int supports) : mDpy (d), mScreenNumber (DefaultScreen (d)), mRootWindow (DefaultRootWindow (d)), mSessionStatus (decor_acquire_dm_session (d, mScreenNumber, "fake", 1, &mDecorationManagerTimestamp)), mSessionOwnerAtom (0), mSessionOwner (0), mSupportingHintAtom (XInternAtom (d, DECOR_TYPE_ATOM_NAME, 0)), mSupportingHintWindowAtom (XInternAtom (d, DECOR_SUPPORTING_DM_CHECK_ATOM_NAME, 0)) { if (mSessionStatus != DECOR_ACQUIRE_STATUS_SUCCESS) throw AcquisitionFailed (mSessionStatus); std::stringstream sessionOwnerStream; sessionOwnerStream << "_COMPIZ_DM_S" << mScreenNumber; mSessionOwnerAtom = XInternAtom (d, sessionOwnerStream.str ().c_str (), 1); mSessionOwner = XGetSelectionOwner (d, mSessionOwnerAtom); if (!mSessionOwner) throw std::runtime_error ("Expected a selection owner"); decor_set_dm_check_hint (d, mScreenNumber, supports); boost::shared_ptr data; FetchAndVerifyProperty (mDpy, mRootWindow, mSupportingHintWindowAtom, XA_WINDOW, 32, 1, 0, data); mSupportingHintWindow = *(reinterpret_cast (data.get ())); if (!mSupportingHintWindow) throw std::runtime_error ("Failed to find supporting hint window"); } cdt::FakeDecorator::~FakeDecorator () { /* Destroy the session owner, taking the selection with it */ XDestroyWindow (mDpy, mSessionOwner); XDestroyWindow (mDpy, mSupportingHintWindow); } Window cdt::FakeDecorator::currentSelectionOwner () { return mSessionOwner; } Atom cdt::FakeDecorator::sessionOwnerAtom () { return mSessionOwnerAtom; } Atom cdt::FakeDecorator::supportingCheckWindow () { return mSupportingHintWindow; } TEST_F (BaseDecorAcceptance, Startup) { } TEST_F (BaseDecorAcceptance, FakeDecoratorSessionOwnerNameSetOnSelectionOwner) { cdt::FakeDecorator decorator (Display ()); boost::shared_ptr data; FetchAndVerifyProperty (Display (), decorator.currentSelectionOwner (), mDecorationManagerNameAtom, mUtf8StringAtom, 8, 4, 0, data); std::string name (reinterpret_cast (data.get ())); EXPECT_THAT (name, StrEq (cdt::DecorationClientName)); } TEST_F (BaseDecorAcceptance, FakeDecoratorReceiveClientMessage) { cdt::FakeDecorator decorator (Display ()); ManagerMessageMatcher matcher (Display (), decorator.sessionOwnerAtom ()); EXPECT_TRUE (Advance (Display (), ct::WaitForEventOfTypeOnWindowMatching (Display (), mRootWindow, ClientMessage, -1, -1, matcher))); } TEST_F (BaseDecorAcceptance, DecorationSupportsWindowType) { cdt::FakeDecorator decorator (Display (), WINDOW_DECORATION_TYPE_WINDOW); boost::shared_ptr data; FetchAndVerifyProperty (Display (), decorator.supportingCheckWindow (), mDecorationTypeAtom, XA_ATOM, 32, 1, 0, data); Atom *atoms = reinterpret_cast (data.get ()); EXPECT_EQ (atoms[0], mDecorationTypeWindow); } TEST_F (BaseDecorAcceptance, DecorationSupportsPixmapType) { cdt::FakeDecorator decorator (Display (), WINDOW_DECORATION_TYPE_PIXMAP); boost::shared_ptr data; FetchAndVerifyProperty (Display (), decorator.supportingCheckWindow (), mDecorationTypeAtom, XA_ATOM, 32, 1, 0, data); Atom *atoms = reinterpret_cast (data.get ()); EXPECT_EQ (atoms[0], mDecorationTypePixmap); } class DecorFakeDecoratorAcceptance : public BaseDecorAcceptance { protected: virtual void SetUp (); virtual void TearDown (); virtual unsigned int SupportedDecorations () const; virtual bool StartDecoratorOnSetUp () const; void SetUpDecorator (); void DisallowDecorationsOnWindow (Window window); void AllowDecorationsOnWindow (Window window); std::auto_ptr decorator; Atom NETWMFrameExtentsAtom; Atom WindowDecorationAtom; Atom DefaultActiveDecorationAtom; Atom DefaultBareDecorationAtom; Atom MWMHintsAtom; }; void DecorFakeDecoratorAcceptance::SetUp () { BaseDecorAcceptance::SetUp (); NETWMFrameExtentsAtom = XInternAtom (Display (), "_NET_FRAME_EXTENTS", 0); WindowDecorationAtom = XInternAtom (Display (), DECOR_WINDOW_ATOM_NAME, 0); DefaultActiveDecorationAtom = XInternAtom (Display (), DECOR_ACTIVE_ATOM_NAME, 0); DefaultBareDecorationAtom = XInternAtom (Display (), DECOR_BARE_ATOM_NAME, 0); if (StartDecoratorOnSetUp ()) SetUpDecorator (); } void DecorFakeDecoratorAcceptance::SetUpDecorator () { decorator.reset (new cdt::FakeDecorator (Display (), SupportedDecorations ())); } namespace { void ChangeDecorationState (Display *display, Window window, unsigned int decorationFlags) { Atom mwmHintsAtom = XInternAtom (display, "_MOTIF_WM_HINTS", 0); cdt::MWMHints hints; hints.flags = 1L << 1; hints.decorations = decorationFlags; XChangeProperty (display, window, mwmHintsAtom, mwmHintsAtom, 32, PropModeReplace, reinterpret_cast (&hints), 3); } } void DecorFakeDecoratorAcceptance::DisallowDecorationsOnWindow (Window window) { ChangeDecorationState (Display (), window, 0); } void DecorFakeDecoratorAcceptance::AllowDecorationsOnWindow (Window window) { ChangeDecorationState (Display (), window, cdt::MwmDecor); } void DecorFakeDecoratorAcceptance::TearDown () { decorator.reset (); BaseDecorAcceptance::TearDown (); } unsigned int DecorFakeDecoratorAcceptance::SupportedDecorations () const { return WINDOW_DECORATION_TYPE_WINDOW; } bool DecorFakeDecoratorAcceptance::StartDecoratorOnSetUp () const { return true; } namespace { void RecievePropertyNotifyEvents (Display *dpy, Window w) { XWindowAttributes attrib; XGetWindowAttributes (dpy, w, &attrib); XSelectInput (dpy, w, attrib.your_event_mask | PropertyChangeMask); } void WaitForPropertyNotify (Display *dpy, Window w, std::string const &prop) { RecievePropertyNotifyEvents (dpy, w); ct::PropertyNotifyXEventMatcher matcher (dpy, prop); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, w, PropertyNotify, -1, -1, matcher))); } void WaitForConfigureOn (Display *display, Window window, int x, int y, unsigned int width, unsigned int height, unsigned int mask) { /* Wait for the ConfigureNotify on the frame window * after an offset move */ ct::ConfigureNotifyXEventMatcher matcher (None, 0, x, y, width, height, mask); Advance (display, ct::WaitForEventOfTypeOnWindowMatching (display, window, ConfigureNotify, -1, -1, matcher)); } void WaitForFrameExtents (Display *dpy, Window w) { RecievePropertyNotifyEvents (dpy, w); XMapRaised (dpy, w); WaitForPropertyNotify (dpy, w, "_NET_FRAME_EXTENTS"); } Window FindParent (Display *dpy, Window w) { Window parent = 0; Window next = w; Window root = DefaultRootWindow (dpy); while (next != root) { parent = next; Window dummy; Window *children; unsigned int nchildren; int status = XQueryTree (dpy, parent, &dummy, &next, &children, &nchildren); XFree (children); if (!status) throw std::logic_error ("XQueryTree failed"); } return parent; } bool WaitForReparent (::Display *dpy, Window w) { return Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w, ReparentNotify, -1, -1)); } void FreeWindowArray (Window *array) { if (array) XFree (array); } boost::shared_array FetchChildren (Display *dpy, Window w, unsigned int &n) { Window *children; Window dummy; int status = XQueryTree (dpy, w, &dummy, &dummy, &children, &n); if (!status) throw std::logic_error ("XQueryTree failed"); return boost::shared_array (children, boost::bind (FreeWindowArray, _1)); } class FrameExtentsMatcher : public MatcherInterface { public: FrameExtentsMatcher (unsigned int left, unsigned int right, unsigned int top, unsigned int bottom); bool MatchAndExplain (unsigned long *extents, MatchResultListener *listener) const; void DescribeTo (std::ostream *os) const; private: unsigned int mLeft; unsigned int mRight; unsigned int mTop; unsigned int mBottom; }; Matcher IsExtents (unsigned int left, unsigned int right, unsigned int top, unsigned int bottom) { return MakeMatcher (new FrameExtentsMatcher (left, right, top, bottom)); } } FrameExtentsMatcher::FrameExtentsMatcher (unsigned int left, unsigned int right, unsigned int top, unsigned int bottom) : mLeft (left), mRight (right), mTop (top), mBottom (bottom) { } bool FrameExtentsMatcher::MatchAndExplain (unsigned long *extents, MatchResultListener *listener) const { return mLeft == extents[0] && mRight == extents[1] && mTop == extents[2] && mBottom == extents[3]; } void FrameExtentsMatcher::DescribeTo (std::ostream *os) const { *os << "Expected frame extents of :" << std::endl << " left: " << mLeft << std::endl << " right: " << mRight << std::endl << " top: " << mTop << std::endl << " bottom: " << mBottom << std::endl; } TEST_F (DecorFakeDecoratorAcceptance, WindowDefaultFallbackNoExtents) { Window w = ct::CreateNormalWindow (Display ()); WaitForFrameExtents (Display (), w); boost::shared_ptr data; FetchAndVerifyProperty (Display (), w, NETWMFrameExtentsAtom, XA_CARDINAL, 32, 4, 0, data); unsigned long *frameExtents = reinterpret_cast (data.get ()); EXPECT_THAT (frameExtents, IsExtents (0, 0, 0, 0)); } class DecorWithPixmapDefaultsAcceptance : public DecorFakeDecoratorAcceptance { protected: DecorWithPixmapDefaultsAcceptance (); virtual void SetUp (); virtual void TearDown (); virtual unsigned int SupportedDecorations () const; private: Window mRoot; protected: cdt::FakeDecoration::Ptr defaultActiveDecoration (); cdt::FakeDecoration::Ptr rootActiveDecoration; cdt::FakeDecoration::Ptr rootBareDecoration; cdt::FakeDecorationList rootActiveDecorationList; cdt::FakeDecorationList rootBareDecorationList; static const unsigned int MaximizedBorderExtent = 1; static const unsigned int ActiveBorderExtent = 2; static const unsigned int ActiveInputExtent = 4; }; namespace { cdt::FakePixmapTypeDecoration::Ptr MakeFakePixmapTypeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight, const decor_extents_t &restoredBorder, const decor_extents_t &restoredInput, const decor_extents_t &maximizedBorder, const decor_extents_t &maximizedInput, Display *dpy) { cdt::FakePixmapTypeDecoration *decoration = new cdt::FakePixmapTypeDecoration (type, state, actions, minWidth, minHeight, restoredBorder, restoredInput, maximizedBorder, maximizedInput, dpy); return boost::shared_ptr (decoration); } decor_extents_t DecorationExtents (unsigned int left, unsigned int right, unsigned int top, unsigned int bottom) { decor_extents_t extents; extents.left = left; extents.right = right; extents.top = top; extents.bottom = bottom; return extents; } class ExtentsFromMatcher : public MatcherInterface { public: ExtentsFromMatcher (Display *dpy, Window w, const decor_extents_t &extents); bool MatchAndExplain (Window window, MatchResultListener *listener) const; void DescribeTo (std::ostream *os) const; private: Display *mDpy; Window mWindow; decor_extents_t mExpectedExtents; }; Matcher ExtendsFromWindowBy (Display *dpy, Window w, const decor_extents_t &extents) { return MakeMatcher (new ExtentsFromMatcher (dpy, w, extents)); } } std::ostream & operator<< (std::ostream &lhs, const decor_extents_t &extents) { return lhs << "Extents: " << std::endl << " left: " << extents.left << std::endl << " right: " << extents.right << std::endl << " top: " << extents.top << std::endl << " bottom: " << extents.bottom << std::endl; } ExtentsFromMatcher::ExtentsFromMatcher (Display *dpy, Window w, const decor_extents_t &extents) : mDpy (dpy), mWindow (w), mExpectedExtents (extents) { } bool ExtentsFromMatcher::MatchAndExplain (Window window, MatchResultListener *listener) const { unsigned int border, depth; Window root; int compareX, compareY, matchX, matchY; unsigned int compareWidth, compareHeight, matchWidth, matchHeight; if (!XGetGeometry (mDpy, window, &root, &matchX, &matchY, &matchWidth, &matchHeight, &border, &depth)) throw std::logic_error ("XGetGeometry failed"); if (!XGetGeometry (mDpy, mWindow, &root, &compareX, &compareY, &compareWidth, &compareHeight, &border, &depth)) throw std::logic_error ("XGetGeometry failed"); unsigned int left = matchX - compareX; unsigned int top = matchY - compareY; unsigned int right = (matchX + matchWidth) - (compareX + compareWidth); unsigned int bottom = (matchY + matchHeight) - (compareY + compareHeight); decor_extents_t determinedExtents = DecorationExtents (left, right, top, bottom); return decor_extents_cmp (&determinedExtents, &mExpectedExtents); } void ExtentsFromMatcher::DescribeTo (std::ostream *os) const { *os << "Extends outwards from " << std::hex << mWindow << std::dec << " by: " << mExpectedExtents; } DecorWithPixmapDefaultsAcceptance::DecorWithPixmapDefaultsAcceptance () : mRoot (0), rootActiveDecorationList (WINDOW_DECORATION_TYPE_PIXMAP), rootBareDecorationList (WINDOW_DECORATION_TYPE_PIXMAP) { } unsigned int DecorWithPixmapDefaultsAcceptance::SupportedDecorations () const { return WINDOW_DECORATION_TYPE_PIXMAP; } void DecorWithPixmapDefaultsAcceptance::SetUp () { DecorFakeDecoratorAcceptance::SetUp (); mRoot = DefaultRootWindow (Display ()); unsigned int ResBo = ActiveBorderExtent; unsigned int ResIn = ActiveInputExtent; unsigned int MaxEx = MaximizedBorderExtent; decor_extents_t activeBorderRestored (DecorationExtents (ResBo, ResBo, ResBo, ResBo)); decor_extents_t activeBorderMaximized (DecorationExtents (MaxEx, MaxEx, MaxEx, MaxEx)); decor_extents_t activeInputRestored (DecorationExtents (ResIn, ResIn, ResIn, ResIn)); decor_extents_t activeInputMaximized (DecorationExtents (MaxEx, MaxEx, MaxEx, MaxEx)); decor_extents_t emptyExtents (DecorationExtents (0, 0, 0, 0)); rootActiveDecoration = MakeFakePixmapTypeDecoration (DECOR_WINDOW_TYPE_NORMAL, 0, 0, 10, 10, activeBorderRestored, activeInputRestored, activeBorderMaximized, activeInputMaximized, Display ()); rootBareDecoration = MakeFakePixmapTypeDecoration (0, 0, 0, 1, 1, emptyExtents, emptyExtents, emptyExtents, emptyExtents, Display ()); rootActiveDecorationList.AddDecoration (rootActiveDecoration); rootBareDecorationList.AddDecoration (rootBareDecoration); rootActiveDecorationList.SetPropertyOnWindow (Display (), mRoot, DefaultActiveDecorationAtom); rootBareDecorationList.SetPropertyOnWindow (Display (), mRoot, DefaultBareDecorationAtom); } void DecorWithPixmapDefaultsAcceptance::TearDown () { /* Remove inserted decorations */ rootActiveDecorationList.RemoveAllDecorations (); rootBareDecorationList.RemoveAllDecorations (); /* This is a bit of a kludge, but we also need to reset * the two decorations manually before TearDown. We can * probably fix this later by encapsulating it all in one * class, but that's a bit of an effort */ rootActiveDecoration.reset (); rootBareDecoration.reset (); DecorFakeDecoratorAcceptance::TearDown (); } TEST_F (DecorWithPixmapDefaultsAcceptance, FallbackRecieveInputFrameNotify) { Window w = ct::CreateNormalWindow (Display ()); RecievePropertyNotifyEvents (Display (), w); XMapRaised (Display (), w); ct::PropertyNotifyXEventMatcher matcher (Display (), DECOR_INPUT_FRAME_ATOM_NAME); EXPECT_TRUE (Advance (Display (), ct::WaitForEventOfTypeOnWindowMatching (Display (), w, PropertyNotify, -1, -1, matcher))); } TEST_F (DecorWithPixmapDefaultsAcceptance, FallbackHasInputFrameInParent) { Window w = ct::CreateNormalWindow (Display ()); XMapRaised (Display (), w); WaitForPropertyNotify (Display (), w, DECOR_INPUT_FRAME_ATOM_NAME); Window parent = FindParent (Display (), w); unsigned int nChildren; boost::shared_array children (FetchChildren (Display (), parent, nChildren)); EXPECT_EQ (2, nChildren); } namespace { Window FindDecorationWindowFromChildren (Display *dpy, const boost::shared_array &c, unsigned int nChildren) { for (unsigned int i = 0; i < nChildren; ++i) { /* The decoration window will have no children, but * the wrapper window will have one child */ unsigned int n; boost::shared_array childChildren (FetchChildren (dpy, c[i], n)); if (n == 0) return c[i]; } return None; } } TEST_F (DecorWithPixmapDefaultsAcceptance, FallbackNormalWindowExtentOnDecoration) { Window w = ct::CreateNormalWindow (Display ()); XMapRaised (Display (), w); WaitForPropertyNotify (Display (), w, DECOR_INPUT_FRAME_ATOM_NAME); Window parent = FindParent (Display (), w); unsigned int nChildren; boost::shared_array children (FetchChildren (Display (), parent, nChildren)); ASSERT_EQ (2, nChildren); Window decorationWindow = FindDecorationWindowFromChildren (Display (), children, nChildren); ASSERT_NE (None, decorationWindow); decor_extents_t borderExtents (DecorationExtents (ActiveBorderExtent, ActiveBorderExtent, ActiveBorderExtent, ActiveBorderExtent)); EXPECT_THAT (decorationWindow, ExtendsFromWindowBy (Display (), w, borderExtents)); } TEST_F (DecorWithPixmapDefaultsAcceptance, FallbackNormalWindowInputOnFrame) { Window w = ct::CreateNormalWindow (Display ()); XMapRaised (Display (), w); WaitForPropertyNotify (Display (), w, DECOR_INPUT_FRAME_ATOM_NAME); Window parent = FindParent (Display (), w); decor_extents_t inputExtents (DecorationExtents (ActiveInputExtent, ActiveInputExtent, ActiveInputExtent, ActiveInputExtent)); EXPECT_THAT (parent, ExtendsFromWindowBy (Display (), w, inputExtents)); } class DecorPixmapShapeSetAcceptance : public DecorWithPixmapDefaultsAcceptance { public: virtual void SetUp (); protected: int shapeEvent; int shapeError; int shapeMajor; int shapeMinor; }; void DecorPixmapShapeSetAcceptance::SetUp () { DecorWithPixmapDefaultsAcceptance::SetUp (); if (!XShapeQueryVersion (Display (), &shapeMajor, &shapeMinor)) throw std::runtime_error ("Unable to query shape extension version"); if (!XShapeQueryExtension (Display (), &shapeEvent, &shapeError)) throw std::runtime_error ("Unable to initialize shape extension"); } std::ostream & operator<< (std::ostream &os, const XRectangle &r) { os << "XRectangle: " << " x: " << r.x << " y: " << r.y << " width: " << r.width << " height: " << r.height; return os; } namespace { void FreeXRectangleArray (XRectangle *array) { XFree (array); } boost::shared_array ShapeRectangles (::Display *dpy, Window w, int &n, int &order) { XRectangle *rects = XShapeGetRectangles(dpy, w, ShapeInput, &n, &order); return boost::shared_array (rects, boost::bind (FreeXRectangleArray, _1)); } } TEST_F (DecorPixmapShapeSetAcceptance, FrameWindowHasInitialFullShape) { Window w = ct::CreateNormalWindow (Display ()); RecievePropertyNotifyEvents (Display (), w); XMapRaised (Display (), w); WaitForPropertyNotify (Display (), w, "_NET_FRAME_EXTENTS"); Window parent = FindParent (Display (), w); int x, y; unsigned int width, height, border; ct::AbsoluteWindowGeometry (Display (), parent, x, y, width, height, border); int n, order; boost::shared_array rects (ShapeRectangles (Display (), parent, n, order)); ASSERT_THAT (n, Eq (1)); EXPECT_THAT (rects[0], AllOf (Field (&XRectangle::x, Eq (0)), Field (&XRectangle::y, Eq (0)), Field (&XRectangle::width, Eq (width)), Field (&XRectangle::height, Eq (height)))); } TEST_F (DecorPixmapShapeSetAcceptance, FrameWindowShapeIsUpdated) { Window w = ct::CreateNormalWindow (Display ()); RecievePropertyNotifyEvents (Display (), w); XMapRaised (Display (), w); WaitForReparent (Display (), w); WaitForPropertyNotify (Display (), w, DECOR_INPUT_FRAME_ATOM_NAME); Window parent = FindParent (Display (), w); int clientX, clientY; unsigned int clientWidth, clientHeight, border; ct::AbsoluteWindowGeometry (Display (), w, clientX, clientY, clientWidth, clientHeight, border); /* Get the input frame remove its input shape completely */ boost::shared_ptr inputFramePropertyData; FetchAndVerifyProperty (Display (), w, mDecorationInputFrameAtom, XA_WINDOW, 32, 1, 0L, inputFramePropertyData); Window inputFrame = *(reinterpret_cast (inputFramePropertyData.get ())); /* Sync first, and then combine rectangles on the input frame */ XSync (Display (), false); XShapeSelectInput (Display (), parent, ShapeNotifyMask); XShapeCombineRectangles (Display (), inputFrame, ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); clientX += ActiveBorderExtent; clientY += ActiveBorderExtent; /* Wait for a shape event on the frame window */ ct::ShapeNotifyXEventMatcher matcher (ShapeInput, clientX, clientY, clientWidth, clientHeight, 1); Advance (Display (), ct::WaitForEventOfTypeOnWindowMatching (Display (), parent, shapeEvent + ShapeNotify, -1, 0, matcher)); /* Grab the shape rectangles of the parent, they should * be equal to the client window size */ int n, order; boost::shared_array rects (ShapeRectangles (Display (), parent, n, order)); ASSERT_THAT (n, Eq (1)); EXPECT_THAT (rects[0], AllOf (Field (&XRectangle::x, Eq (clientX)), Field (&XRectangle::y, Eq (clientY)), Field (&XRectangle::width, Eq (clientWidth)), Field (&XRectangle::height, Eq (clientHeight)))); } /* TODO: Get bare decorations tests */ /* Helper class with some useful member functions */ class PixmapDecoratorAcceptance : public DecorWithPixmapDefaultsAcceptance { public: typedef cdt::FakeDecoration::Ptr FakeDecorPtr; typedef cdt::FakePixmapTypeDecoration::Ptr FakePixDecorPtr; virtual void TearDown (); Window CreateDecoratableWindow (::Display *display); Window MapAndReparent (::Display *display, Window window); void DecorateWindow (::Display *display, Window window, const FakePixDecorPtr &decoration); void WaitForDecoration (::Display *display, Window window, const FakeDecorPtr &decoration); void WaitForDefaultDecoration (::Display *display, Window window, CompRect &testFrameDecorationGeometry, CompRect &testWindowDecorationGeometry); void WaitForDecorationUpdate (::Display *display, Window window, const FakeDecorPtr &decor); cdt::FakeDecorationList GetDecorations (Window window); Window GetParent (Window window); void ReconfigureDecoration (::Display *display, Window window, const FakePixDecorPtr &decor, cdt::FakeDecorationList &list, const decor_extents_t &border, const decor_extents_t &input); bool DestroyWindow (::Display *display, Window window); protected: std::map windowDecorations; std::map windowParents; }; void PixmapDecoratorAcceptance::TearDown () { windowDecorations.clear (); DecorWithPixmapDefaultsAcceptance::TearDown (); } Window PixmapDecoratorAcceptance::CreateDecoratableWindow (::Display *display) { return ct::CreateNormalWindow (display); } Window PixmapDecoratorAcceptance::MapAndReparent (::Display *display, Window window) { if (windowParents.find (window) != windowParents.end ()) return windowParents[window]; XSelectInput (display, window, StructureNotifyMask | PropertyChangeMask); XMapRaised (display, window); /* Wait for the window to be reparented */ WaitForReparent (display, window); /* Select for StructureNotify on the parent and wrapper * windows */ windowParents[window] = FindParent (display, window); Window root = 0; Window wrapper = ct::GetImmediateParent (display, window, root); XSelectInput (display, windowParents[window], StructureNotifyMask); XSelectInput (display, wrapper, StructureNotifyMask); return windowParents[window]; } void PixmapDecoratorAcceptance::DecorateWindow (::Display *display, Window window, const FakePixDecorPtr &decoration) { windowDecorations[window] = cdt::FakeDecorationList (WINDOW_DECORATION_TYPE_PIXMAP); windowDecorations[window].AddDecoration (decoration); windowDecorations[window].SetPropertyOnWindow (display, window, WindowDecorationAtom); } void PixmapDecoratorAcceptance::WaitForDecoration (::Display *display, Window window, const FakeDecorPtr &decoration) { WaitForDecorationUpdate (display, window, decoration); WaitForPropertyNotify (display, window, DECOR_INPUT_FRAME_ATOM_NAME); } void PixmapDecoratorAcceptance::WaitForDefaultDecoration (::Display *display, Window window, CompRect &decoratedWindowGeometry, CompRect &decoratedFrameGeometry) { WaitForDecoration (display, window, rootActiveDecoration); /* Fetch the window's absolute geometry */ int x, y; unsigned int width, height, border; ct::AbsoluteWindowGeometry (display, window, x, y, width, height, border); /* Fetch frame extents */ boost::shared_ptr data; FetchAndVerifyProperty (Display (), window, NETWMFrameExtentsAtom, XA_CARDINAL, 32, 4, 0, data); unsigned long *frameExtents = reinterpret_cast (data.get ()); decoratedWindowGeometry.setGeometry (x, y, width, height); /* Adjust for decoration size. This is what future decorations * will add and subtract from */ decoratedFrameGeometry.setGeometry (x - frameExtents[0], y - frameExtents[2], width + (frameExtents[0] + frameExtents[1]), height + (frameExtents[2] + frameExtents[3])); } void PixmapDecoratorAcceptance::WaitForDecorationUpdate (::Display *display, Window window, const FakeDecorPtr &decor) { const CompPoint &framePos (decor->restoredFrameWindowOffset ()); /* Wait for the ConfigureNotify on the frame window * after an offset move */ WaitForConfigureOn (display, GetParent (window), framePos.x (), framePos.y (), 0, 0, CWX | CWY); /* Wait for the frame extents to change */ WaitForPropertyNotify (display, window, "_NET_FRAME_EXTENTS"); } void PixmapDecoratorAcceptance::ReconfigureDecoration (::Display *display, Window window, const FakePixDecorPtr &decor, cdt::FakeDecorationList &list, const decor_extents_t &border, const decor_extents_t &input) { decor->changeRestoredInput (input); decor->changeRestoredBorder (border); list.SetPropertyOnWindow (display, window, WindowDecorationAtom); WaitForDecorationUpdate (display, window, decor); } bool PixmapDecoratorAcceptance::DestroyWindow (::Display *display, Window window) { std::map ::iterator parentIterator = windowParents.find (window); std::map ::iterator decorIterator = windowDecorations.find (window); if (parentIterator != windowParents.end ()) windowParents.erase (parentIterator); if (decorIterator != windowDecorations.end ()) { windowDecorations[window].RemoveAllDecorations (); windowDecorations.erase (decorIterator); } XDestroyWindow (display, window); return parentIterator != windowParents.end () || decorIterator != windowDecorations.end (); } Window PixmapDecoratorAcceptance::GetParent (Window window) { return windowParents[window]; } cdt::FakeDecorationList PixmapDecoratorAcceptance::GetDecorations (Window window) { return windowDecorations[window]; } class PixmapInitialDecorationAcceptance : public PixmapDecoratorAcceptance { public: virtual void SetUp (); virtual void TearDown (); virtual bool StartDecoratorOnSetUp () const; Window CreateDecoratedWindow (); protected: cdt::FakePixmapTypeDecoration::Ptr mTestWindowDecoration; CompRect mClientGeometryOnInitialDecoration; CompRect mBorderGeometryOnInitialDecoration; }; void PixmapInitialDecorationAcceptance::SetUp () { PixmapDecoratorAcceptance::SetUp (); unsigned int ResBo = ActiveBorderExtent + 1; unsigned int ResIn = ActiveInputExtent; unsigned int MaxEx = MaximizedBorderExtent; mTestWindowDecoration = MakeFakePixmapTypeDecoration (DECOR_WINDOW_TYPE_NORMAL, 0, 0, 10, 10, DecorationExtents (ResBo, ResBo, ResBo, ResBo), DecorationExtents (ResIn, ResIn, ResIn, ResIn), DecorationExtents (MaxEx, MaxEx, MaxEx, MaxEx), DecorationExtents (MaxEx, MaxEx, MaxEx, MaxEx), Display ()); } bool PixmapInitialDecorationAcceptance::StartDecoratorOnSetUp () const { return false; } void PixmapInitialDecorationAcceptance::TearDown () { mTestWindowDecoration.reset (); PixmapDecoratorAcceptance::TearDown (); } Window PixmapInitialDecorationAcceptance::CreateDecoratedWindow () { Window testWindow = CreateDecoratableWindow (Display ()); /* We need to first explicitly recieve PropertyNotify events before * core starts sending them */ RecievePropertyNotifyEvents (Display (), testWindow); /* Map and reparent the window so that it gets a decoration */ MapAndReparent (Display (), testWindow); /* Start the decorator */ SetUpDecorator (); WaitForDefaultDecoration (Display (), testWindow, mClientGeometryOnInitialDecoration, mBorderGeometryOnInitialDecoration); DecorateWindow (Display (), testWindow, mTestWindowDecoration); WaitForDecorationUpdate (Display (), testWindow, mTestWindowDecoration); return testWindow; } std::ostream & operator<< (std::ostream &os, const CompSize &sz) { return os << "Size: (width: " << sz.width () << " height: " << sz.height () << ")"; } TEST_F (PixmapInitialDecorationAcceptance, NoSizeChangeInitially) { CreateDecoratedWindow (); EXPECT_EQ (CompSize (mClientGeometryOnInitialDecoration.width (), mClientGeometryOnInitialDecoration.height ()), CompSize (ct::WINDOW_WIDTH, ct::WINDOW_HEIGHT)); } TEST_F (PixmapInitialDecorationAcceptance, SizeChangesApplySubsequently) { Window testWindow = CreateDecoratedWindow (); /* Measuring size change from default decoration to real decoration */ const CompSize &size (mTestWindowDecoration->restoredDecorationBorderSize ()); EXPECT_THAT (testWindow, HasGeometry (Display (), RelativeWindowGeometry, _, _, mBorderGeometryOnInitialDecoration.width () - size.width (), mBorderGeometryOnInitialDecoration.height () - size.height (), _)); } class PixmapDecoratedWindowAcceptance : public PixmapDecoratorAcceptance { public: PixmapDecoratedWindowAcceptance (); virtual void SetUp (); virtual void TearDown (); virtual bool StartDecoratorOnSetUp () const; protected: unsigned int RealDecorationActiveBorderExtent; Window mTestWindow; Window mTestWindowParent; cdt::FakePixmapTypeDecoration::Ptr mTestWindowDecoration; CompRect mClientGeometryOnInitialDecoration; CompRect mBorderGeometryOnInitialDecoration; }; PixmapDecoratedWindowAcceptance::PixmapDecoratedWindowAcceptance () : RealDecorationActiveBorderExtent (ActiveBorderExtent + 1) { } void PixmapDecoratedWindowAcceptance::SetUp () { DecorWithPixmapDefaultsAcceptance::SetUp (); ::Display *display = Display (); mTestWindow = CreateDecoratableWindow (display); mTestWindowParent = MapAndReparent (display, mTestWindow); /* Start the decorator */ SetUpDecorator (); WaitForDefaultDecoration (display, mTestWindow, mClientGeometryOnInitialDecoration, mBorderGeometryOnInitialDecoration); /* We need to change the border extent so that the window * will move from its position in the default decoration */ unsigned int ResBo = RealDecorationActiveBorderExtent; unsigned int ResIn = ActiveInputExtent; unsigned int MaxEx = MaximizedBorderExtent; mTestWindowDecoration = MakeFakePixmapTypeDecoration (DECOR_WINDOW_TYPE_NORMAL, 0, 0, 10, 10, DecorationExtents (ResBo, ResBo, ResBo, ResBo), DecorationExtents (ResIn, ResIn, ResIn, ResIn), DecorationExtents (MaxEx, MaxEx, MaxEx, MaxEx), DecorationExtents (MaxEx, MaxEx, MaxEx, MaxEx), Display ()); DecorateWindow (display, mTestWindow, mTestWindowDecoration); WaitForDecorationUpdate (display, mTestWindow, mTestWindowDecoration); } void PixmapDecoratedWindowAcceptance::TearDown () { mTestWindowDecoration.reset (); DestroyWindow (Display (), mTestWindow); PixmapDecoratorAcceptance::TearDown (); } bool PixmapDecoratedWindowAcceptance::StartDecoratorOnSetUp () const { return false; } namespace { static const unsigned int RemoveState = 0; static const unsigned int AddState = 1; static const unsigned int ToggleState = 2; void ChangeStateOfWindow (Display *dpy, unsigned int mode, const std::string &state, Window w) { XEvent event; const long ClientTypePager = 2; event.type = ClientMessage; event.xany.window = w; event.xclient.format = 32; event.xclient.message_type = XInternAtom (dpy, "_NET_WM_STATE", 0); event.xclient.data.l[0] = mode; event.xclient.data.l[1] = XInternAtom (dpy, state.c_str (), 0); event.xclient.data.l[2] = 0; event.xclient.data.l[3] = ClientTypePager; XSendEvent (dpy, DefaultRootWindow (dpy), 1, SubstructureRedirectMask, &event); XSync (dpy, 0); } boost::shared_ptr FetchCardinalProperty (Display *dpy, Window w, Atom NETWMFrameExtentsAtom) { boost::shared_ptr data; FetchAndVerifyProperty (dpy, w, NETWMFrameExtentsAtom, XA_CARDINAL, 32, 4, 0, data); return data; } } TEST_F (PixmapDecoratedWindowAcceptance, MaximizeBorderExtentsOnMaximize) { ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_VERT", mTestWindow); WaitForPropertyNotify (Display (), mTestWindow, "_NET_FRAME_EXTENTS"); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_HORZ", mTestWindow); WaitForPropertyNotify (Display (), mTestWindow, "_NET_FRAME_EXTENTS"); boost::shared_ptr data = FetchCardinalProperty (Display (), mTestWindow, NETWMFrameExtentsAtom); unsigned long *frameExtents = reinterpret_cast (data.get ()); unsigned int MaxEx = MaximizedBorderExtent; EXPECT_THAT (frameExtents, IsExtents (MaxEx, MaxEx, MaxEx, MaxEx)); } TEST_F (PixmapDecoratedWindowAcceptance, RestoredBorderExtentsOnVertMaximize) { ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_VERT", mTestWindow); WaitForPropertyNotify (Display (), mTestWindow, "_NET_FRAME_EXTENTS"); boost::shared_ptr data = FetchCardinalProperty (Display (), mTestWindow, NETWMFrameExtentsAtom); unsigned long *frameExtents = reinterpret_cast (data.get ()); unsigned int ActEx = RealDecorationActiveBorderExtent; EXPECT_THAT (frameExtents, IsExtents (ActEx, ActEx, ActEx, ActEx)); } TEST_F (PixmapDecoratedWindowAcceptance, RestoredBorderExtentsOnHorzMaximize) { ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_HORZ", mTestWindow); WaitForPropertyNotify (Display (), mTestWindow, "_NET_FRAME_EXTENTS"); boost::shared_ptr data = FetchCardinalProperty (Display (), mTestWindow, NETWMFrameExtentsAtom); unsigned long *frameExtents = reinterpret_cast (data.get ()); unsigned int ActEx = RealDecorationActiveBorderExtent; EXPECT_THAT (frameExtents, IsExtents (ActEx, ActEx, ActEx, ActEx)); } TEST_F (PixmapDecoratedWindowAcceptance, MaximizeFrameWindowSizeEqOutputSize) { XWindowAttributes attrib; XGetWindowAttributes (Display (), DefaultRootWindow (Display ()), &attrib); /* The assumption here is that there is only one output */ ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_VERT", mTestWindow); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_HORZ", mTestWindow); ct::ConfigureNotifyXEventMatcher matcher (None, 0, 0, 0, attrib.width, attrib.height, CWX | CWY | CWWidth | CWHeight); EXPECT_TRUE (Advance (Display (), ct::WaitForEventOfTypeOnWindowMatching (Display (), mTestWindowParent, ConfigureNotify, -1, -1, matcher))); } TEST_F (PixmapDecoratedWindowAcceptance, VertMaximizeFrameWindowYHeight) { XWindowAttributes attrib; XGetWindowAttributes (Display (), DefaultRootWindow (Display ()), &attrib); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_VERT", mTestWindow); int offset = RealDecorationActiveBorderExtent - ActiveInputExtent; ct::ConfigureNotifyXEventMatcher matcher (None, 0, 0, offset, 0, attrib.height - 2 * offset, CWY | CWHeight); EXPECT_TRUE (Advance (Display (), ct::WaitForEventOfTypeOnWindowMatching (Display (), mTestWindowParent, ConfigureNotify, -1, -1, matcher))); } TEST_F (PixmapDecoratedWindowAcceptance, HorzMaximizeFrameWindowXWidth) { XWindowAttributes attrib; XGetWindowAttributes (Display (), DefaultRootWindow (Display ()), &attrib); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_HORZ", mTestWindow); int offset = RealDecorationActiveBorderExtent - ActiveInputExtent; ct::ConfigureNotifyXEventMatcher matcher (None, 0, offset, 0, attrib.width - 2 * offset, 0, CWX | CWWidth); EXPECT_TRUE (Advance (Display (), ct::WaitForEventOfTypeOnWindowMatching (Display (), mTestWindowParent, ConfigureNotify, -1, -1, matcher))); } TEST_F (PixmapDecoratedWindowAcceptance, VertMaximizeFrameWindowSizeSameXWidth) { XWindowAttributes rootAttrib, attrib; XGetWindowAttributes (Display (), DefaultRootWindow (Display ()), &rootAttrib); XGetWindowAttributes (Display (), mTestWindowParent, &attrib); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_VERT", mTestWindow); /* Wait for the window to be maximized first */ int offset = RealDecorationActiveBorderExtent - ActiveInputExtent; WaitForConfigureOn (Display (), mTestWindowParent, 0, offset, 0, rootAttrib.height - 2 * offset, CWY | CWHeight); /* Query the window geometry and ensure that the width and * height have remained the same (adding on any extended borders, * in this case 0) */ EXPECT_THAT (mTestWindowParent, HasGeometry (Display (), RelativeWindowGeometry, attrib.x, _, attrib.width, _, _)); } TEST_F (PixmapDecoratedWindowAcceptance, HorzMaximizeFrameWindowSizeSameYHeight) { XWindowAttributes rootAttrib, attrib; XGetWindowAttributes (Display (), DefaultRootWindow (Display ()), &rootAttrib); XGetWindowAttributes (Display (), mTestWindowParent, &attrib); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_HORZ", mTestWindow); /* Wait for the window to be maximized first */ int offset = RealDecorationActiveBorderExtent - ActiveInputExtent; WaitForConfigureOn (Display (), mTestWindowParent, offset, 0, rootAttrib.width - 2 * offset, 0, CWX | CWWidth); /* Query the window geometry and ensure that the width and * height have remained the same (adding on any extended borders, * in this case 0) */ EXPECT_THAT (mTestWindowParent, HasGeometry (Display (), RelativeWindowGeometry, _, attrib.y, _, attrib.height, _)); } /* Ensure that a window expands to its original size when it is * undecorated */ TEST_F (PixmapDecoratedWindowAcceptance, UndecoratedWindowExpandToOrigSizePlusInitialBorder) { DisallowDecorationsOnWindow (mTestWindow); WaitForConfigureOn (Display (), mTestWindowParent, mBorderGeometryOnInitialDecoration.x (), mBorderGeometryOnInitialDecoration.y (), mBorderGeometryOnInitialDecoration.width (), mBorderGeometryOnInitialDecoration.height (), CWX | CWY | CWWidth | CWHeight); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, mBorderGeometryOnInitialDecoration.x (), mBorderGeometryOnInitialDecoration.y (), mBorderGeometryOnInitialDecoration.width (), mBorderGeometryOnInitialDecoration.height (), _)); } TEST_F (PixmapDecoratedWindowAcceptance, UndecorateStaticGravityWindow) { XSizeHints hints; hints.flags = PWinGravity; hints.win_gravity = StaticGravity; XSetWMNormalHints (Display (), mTestWindow, &hints); DisallowDecorationsOnWindow (mTestWindow); WaitForConfigureOn (Display (), mTestWindowParent, mBorderGeometryOnInitialDecoration.x (), mBorderGeometryOnInitialDecoration.y (), mBorderGeometryOnInitialDecoration.width (), mBorderGeometryOnInitialDecoration.height (), CWX | CWY | CWWidth | CWHeight); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, mBorderGeometryOnInitialDecoration.x (), mBorderGeometryOnInitialDecoration.y (), mBorderGeometryOnInitialDecoration.width (), mBorderGeometryOnInitialDecoration.height (), _)); } class PixmapDecorationAdjustment : public PixmapDecoratedWindowAcceptance, public WithParamInterface { public: void MaximizeWindow (Window window); void RestoreWindow (Window window, int restoredFrameX, int restoredFrameY, unsigned int restoredFrameWidth, unsigned int restoredFrameHeight); }; void PixmapDecorationAdjustment::MaximizeWindow (Window window) { XWindowAttributes rootAttrib; XGetWindowAttributes (Display (), DefaultRootWindow (Display ()), &rootAttrib); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_HORZ", window); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_VERT", window); /* Wait for the window to be maximized first */ WaitForConfigureOn (Display (), mTestWindowParent, 0, 0, rootAttrib.width, rootAttrib.height, CWX | CWY | CWWidth | CWHeight); } void PixmapDecorationAdjustment::RestoreWindow (Window window, int restoredFrameX, int restoredFrameY, unsigned int restoredFrameWidth, unsigned int restoredFrameHeight) { ChangeStateOfWindow (Display (), RemoveState, "_NET_WM_STATE_MAXIMIZED_HORZ", window); ChangeStateOfWindow (Display (), RemoveState, "_NET_WM_STATE_MAXIMIZED_VERT", window); /* Wait for the window to be restored first */ WaitForConfigureOn (Display (), mTestWindowParent, restoredFrameX, restoredFrameY, restoredFrameWidth, restoredFrameHeight, CWX | CWY | CWWidth | CWHeight); } TEST_P (PixmapDecorationAdjustment, AdjustRestoredWindowBorderMovesClient) { ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], GetParam (), GetParam ()); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, mBorderGeometryOnInitialDecoration.x () + GetParam ().left, mBorderGeometryOnInitialDecoration.y () + GetParam ().top, _, _, _)); } TEST_P (PixmapDecorationAdjustment, AdjustRestoredWindowBorderShrinkClient) { ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], GetParam (), GetParam ()); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, _, _, mBorderGeometryOnInitialDecoration.width () - (GetParam ().left + GetParam ().right), mBorderGeometryOnInitialDecoration.height () - (GetParam ().top + GetParam ().bottom), _)); } TEST_P (PixmapDecorationAdjustment, ClientExpandsAsBorderShrinks) { decor_extents_t newExtents = GetParam (); ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], DecorationExtents (10, 10, 10, 10), DecorationExtents (10, 10, 10, 10)); ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], newExtents, DecorationExtents (10, 10, 10, 10)); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, _, _, mBorderGeometryOnInitialDecoration.width () - (newExtents.left + newExtents.right), mBorderGeometryOnInitialDecoration.height () - (newExtents.top + newExtents.bottom), _)); } TEST_P (PixmapDecorationAdjustment, ClientExpandsAsBorderShrinksWhilstMaximized) { decor_extents_t newExtents = GetParam (); ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], DecorationExtents (10, 10, 10, 10), DecorationExtents (10, 10, 10, 10)); MaximizeWindow (mTestWindow); /* Set the property on the window, then demaximize without waiting * for a response we will continue to use the maximized window decoration */ mTestWindowDecoration->changeRestoredBorder (newExtents); windowDecorations[mTestWindow].SetPropertyOnWindow (Display (), mTestWindow, WindowDecorationAtom); const CompPoint &off (mTestWindowDecoration->restoredFrameWindowOffset ()); const CompSize &size (mTestWindowDecoration->restoredDecorationInputSize ()); /* As the window is shrunk to accomodate the border size, we must subtract * the border from the original window size */ CompSize shrink ((newExtents.left + newExtents.right), (newExtents.top + newExtents.bottom)); RestoreWindow (mTestWindow, mBorderGeometryOnInitialDecoration.x () + off.x (), mBorderGeometryOnInitialDecoration.y () + off.y (), mBorderGeometryOnInitialDecoration.width () - shrink.width () + size.width (), mBorderGeometryOnInitialDecoration.height () - shrink.height () + size.height ()); /* Subtract the old offset and size and add on the new decoration geometry */ EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, mBorderGeometryOnInitialDecoration.x () + newExtents.left, mBorderGeometryOnInitialDecoration.y () + newExtents.top, mBorderGeometryOnInitialDecoration.width () - ((newExtents.left + newExtents.right)), mBorderGeometryOnInitialDecoration.height () - ((newExtents.top + newExtents.bottom)), _)); } TEST_P (PixmapDecorationAdjustment, ClientExpandsAsBorderShrinksWhilstUndecorated) { decor_extents_t newExtents = GetParam (); ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], DecorationExtents (10, 10, 10, 10), DecorationExtents (10, 10, 10, 10)); /* When decorations are disabled on this window, the frame window * will retain the exact same size, as border == input in the previous * case. So there's no need to wait */ DisallowDecorationsOnWindow (mTestWindow); /* Set the property on the window, then decorate without waiting * for a response we will continue to use the maximized window decoration */ mTestWindowDecoration->changeRestoredBorder (newExtents); windowDecorations[mTestWindow].SetPropertyOnWindow (Display (), mTestWindow, WindowDecorationAtom); AllowDecorationsOnWindow (mTestWindow); const CompPoint &off (mTestWindowDecoration->restoredFrameWindowOffset ()); const CompSize &size (mTestWindowDecoration->restoredDecorationInputSize ()); /* As the window is shrunk to accomadate the border size, we must subtract * the border from the original window size */ CompSize shrink ((newExtents.left + newExtents.right), (newExtents.top + newExtents.bottom)); WaitForConfigureOn (Display (), mTestWindowParent, mBorderGeometryOnInitialDecoration.x () + off.x (), mBorderGeometryOnInitialDecoration.y () + off.y (), mBorderGeometryOnInitialDecoration.width () - shrink.width () + size.width (), mBorderGeometryOnInitialDecoration.height () - shrink.height () + size.height (), CWX | CWY | CWWidth | CWHeight); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, mBorderGeometryOnInitialDecoration.x () + newExtents.left, mBorderGeometryOnInitialDecoration.y () + newExtents.top, mBorderGeometryOnInitialDecoration.width () - (newExtents.left + newExtents.right), mBorderGeometryOnInitialDecoration.height () - (newExtents.top + newExtents.bottom), _)); } TEST_P (PixmapDecorationAdjustment, AdjustRestoredWindowInputNoMoveClient) { decor_extents_t newExtents = GetParam (); ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], DecorationExtents (1, 1, 1, 1), newExtents); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, mBorderGeometryOnInitialDecoration.x () + 1, mBorderGeometryOnInitialDecoration.y () + 1, _, _, _)); } decor_extents_t AdjustmentExtents[] = { DecorationExtents (2, 0, 0, 0), DecorationExtents (0, 2, 0, 0), DecorationExtents (0, 0, 2, 0), DecorationExtents (0, 0, 0, 2) }; INSTANTIATE_TEST_CASE_P (AdjustmentExtents, PixmapDecorationAdjustment, ValuesIn (AdjustmentExtents)); compiz-0.9.11+14.04.20140409/plugins/decor/tests/acceptance/CMakeLists.txt0000644000015301777760000000003612321343002026236 0ustar pbusernogroup00000000000000add_subdirectory (xorg-gtest) compiz-0.9.11+14.04.20140409/plugins/decor/decor.xml.in0000644000015301777760000000721512321343002022477 0ustar pbusernogroup00000000000000 <_short>Window Decoration <_long>Window decorations Effects decorations fade cube scale wobbly composite opengl <_short>Active Shadow <_short>Inactive Shadow compiz-0.9.11+14.04.20140409/plugins/decor/CMakeLists.txt0000644000015301777760000000135612321343002023014 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) include (CompizCommon) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/clip-groups/include/) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/pixmap-requests/include/) compiz_plugin(decor PLUGINDEPS composite opengl LIBRARIES decoration compiz_decor_clip_groups compiz_decor_pixmap_requests) add_subdirectory (src/clip-groups) add_subdirectory (src/pixmap-requests) if (COMPIZ_BUILD_WITH_RPATH AND NOT COMPIZ_DISABLE_PLUGIN_DECOR) set_target_properties ( decor PROPERTIES INSTALL_RPATH "${COMPIZ_LIBDIR}" ) endif (COMPIZ_BUILD_WITH_RPATH AND NOT COMPIZ_DISABLE_PLUGIN_DECOR) install (PROGRAMS "src/compiz-decorator" DESTINATION ${exec_prefix}) add_subdirectory (tests) compiz-0.9.11+14.04.20140409/plugins/decor/src/0000755000015301777760000000000012321344021021040 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/decor.cpp0000644000015301777760000024210312321343002022640 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include "decor.h" #include #include COMPIZ_PLUGIN_20090315 (decor, DecorPluginVTable) namespace cwe = compiz::window::extents; namespace { void updateRegionWithShapeRectangles (Display *dpy, Window w, CompRegion ®ion) { int n = 0; int order = 0; XRectangle *shapeRects = NULL; shapeRects = XShapeGetRectangles (dpy, w, ShapeInput, &n, &order); if (!shapeRects) return; for (int i = 0; i < n; i++) region += CompRegion (shapeRects[i].x, shapeRects[i].y, shapeRects[i].width, shapeRects[i].height); XFree (shapeRects); } } MatchedDecorClipGroup::MatchedDecorClipGroup (const CompMatch &match) : mMatch (match) { } bool MatchedDecorClipGroup::doPushClippable (DecorClippableInterface *dc) { if (dc->matches (mMatch)) return mClipGroupImpl.pushClippable (dc); return false; } void DecorWindow::doUpdateShadow (const CompRegion ®) { shadowRegion = outputRegion () - (reg - inputRegion ()); } void DecorWindow::doSetOwner (DecorClipGroupInterface *i) { mClipGroup = i; } bool DecorWindow::doMatches (const CompMatch &m) { return const_cast (m).evaluate (window) && !window->invisible (); } const CompRegion & DecorWindow::getOutputRegion () { return mOutputRegion; } const CompRegion & DecorWindow::getInputRegion () { return mInputRegion; } void DecorWindow::doUpdateGroupShadows () { if (mClipGroup) mClipGroup->updateAllShadows (); } /* From core */ /* * DecorWindow::glDraw * * Handles the drawing of the actual decoration texture * (whether that be the bound pixmap for a window type * decoration or a redirected scaled-quad pixmap for * pixmap type decorations). * * For pixmap type decorations, we need to use the precomputed * shadow region for the clipping region of when we draw the * window decoration with glDrawTexture. We also need to add * geometry for each quad on the pixmap decoration so that it * stretches from its original size to the size of the actual * window. * * Usually, this works something like this * * ----------------------------------- * | Q1 | Buttons ... Text (Q2) | Q3 | * ----------------------------------- * | Q4 | | Q5 | * ----------------------------------- * | Q6 | Q7 | Q8 | * ----------------------------------- * * * --------------------------------------------------- * | Q1 | Buttons ... Text (Q2) | Q3 | * --------------------------------------------------- * | Q4 | | Q5 | * | | | | * | | | | * | | | | * | | | | * | | | | * | | | | * | | | | * | | | | * | | | | * --------------------------------------------------- * | Q6 | Q7 | Q8 | * --------------------------------------------------- * * Note here that quads 2, 4, 5 and 7 are scaled according * to the matrix supplied on each quad structure. * * FIXME: This doesn't work with multiple textures, that * needs work to determine the quads for each separate texture * * For window type decorations we add geometry for the frame * region of the window. * * Next, we draw the actual texture with the saved window geometry * */ bool DecorWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { bool status; status = gWindow->glDraw (transform, attrib, region, mask); /* Don't render dock decorations (shadows) on just any old window */ if (!(window->type () & CompWindowTypeDockMask)) { glDecorate (transform, attrib, region, mask); /* Render dock decorations (shadows) on desktop windows only */ if (window->type () & CompWindowTypeDesktopMask) { foreach (CompWindow *w, dScreen->cScreen->getWindowPaintList ()) { bool isDock = w->type () & CompWindowTypeDockMask; bool drawShadow = !(w->invisible () || w->destroyed ()); if (isDock && drawShadow) { DecorWindow *d = DecorWindow::get (w); /* If the last mask was an occlusion pass, glPaint * return value will mean something different, so * remove it */ unsigned int pmask = d->gWindow->lastMask () & ~(PAINT_WINDOW_OCCLUSION_DETECTION_MASK); /* Check if the window would draw by seeing if glPaint * returns true when using PAINT_NO_CORE_INSTANCE_MASK */ pmask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; const GLWindowPaintAttrib &pAttrib (d->gWindow->paintAttrib ()); if (d->gWindow->glPaint (pAttrib, transform, region, pmask)) d->glDecorate (transform, pAttrib, region, mask); } } } } return status; } void DecorWindow::glDecorate (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { if (wd && wd->decor->type == WINDOW_DECORATION_TYPE_PIXMAP) { CompRect box; GLTexture::MatrixList ml (1); mask |= PAINT_WINDOW_BLEND_MASK; gWindow->vertexBuffer ()->begin (); const CompRegion *preg = NULL; if ((mask & (PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK | PAINT_WINDOW_WITH_OFFSET_MASK))) preg = ®ion; else if (mask & PAINT_WINDOW_TRANSFORMED_MASK) preg = &infiniteRegion; else if (mClipGroup) { tmpRegion = mOutputRegion; tmpRegion &= region; tmpRegion &= shadowRegion; preg = &tmpRegion; } else preg = ®ion; /* In case some plugin needs to paint us with an offset region */ if (preg->isEmpty ()) preg = ®ion; const CompRegion ® (*preg); if (updateMatrix) updateDecorationScale (); for (int i = 0; i < wd->nQuad; i++) { box.setGeometry (wd->quad[i].box.x1, wd->quad[i].box.y1, wd->quad[i].box.x2 - wd->quad[i].box.x1, wd->quad[i].box.y2 - wd->quad[i].box.y1); if (box.width () > 0 && box.height () > 0) { ml[0] = wd->quad[i].matrix; const CompRegionRef boxRegion (box.region ()); gWindow->glAddGeometry (ml, boxRegion, reg); } } if (gWindow->vertexBuffer ()->end ()) { glEnable (GL_BLEND); gWindow->glDrawTexture (wd->decor->texture->textures[0], transform, attrib, mask); glDisable (GL_BLEND); } } else if (wd && wd->decor->type == WINDOW_DECORATION_TYPE_WINDOW) { GLTexture::MatrixList ml (1); if (gWindow->textures ().empty ()) gWindow->bind (); if (gWindow->textures ().empty ()) return; if (updateMatrix) updateDecorationScale (); glEnable (GL_BLEND); if (gWindow->textures ().size () == 1) { ml[0] = gWindow->matrices ()[0]; gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometry (ml, window->frameRegion (), region); if (gWindow->vertexBuffer ()->end ()) gWindow->glDrawTexture (gWindow->textures ()[0], transform, attrib, mask); } else { if (updateReg) updateWindowRegions (); for (unsigned int i = 0; i < gWindow->textures ().size (); i++) { ml[0] = gWindow->matrices ()[i]; gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometry (ml, regions[i], region); if (gWindow->vertexBuffer ()->end ()) gWindow->glDrawTexture (gWindow->textures ()[i], transform, attrib, mask); } } glDisable (GL_BLEND); } } static bool bindFailed; /* * DecorTexture::DecorTexture * * Creates a texture for a given pixmap in the property. * bindFailed is a global variable used to determine if * binding to a pixmap gave us more than one texture since * FIXME that isn't supported yet. Also sets damage handlers * for this pixmap */ DecorTexture::DecorTexture (DecorPixmapInterface::Ptr pixmap) : status (true), refCount (1), pixmap (pixmap), damage (None) { unsigned int width, height, depth, ui; Window root; int i; if (!XGetGeometry (screen->dpy (), pixmap->getPixmap (), &root, &i, &i, &width, &height, &ui, &depth)) { status = false; return; } bindFailed = false; textures = GLTexture::bindPixmapToTexture (pixmap->getPixmap (), width, height, depth, compiz::opengl::ExternallyManaged); if (textures.size () != 1) { bindFailed = true; status = false; return; } if (!DecorScreen::get (screen)->optionGetMipmap ()) textures[0]->setMipmap (false); damage = XDamageCreate (screen->dpy (), pixmap->getPixmap (), XDamageReportBoundingBox); } /* * DecorTexture::~DecorTexture * * Remove damage handle on texture * */ DecorTexture::~DecorTexture () { if (damage) XDamageDestroy (screen->dpy (), damage); } /* * DecorScreen::getTexture * * Returns the texture for a given pixmap. Note * that if this particular pixmap was already found * in the list of decor textures, then the refcount * is increased and that one is returned instead of * binding a new texture. * */ DecorTexture * DecorScreen::getTexture (Pixmap pixmap) { if (!cmActive) return NULL; foreach (DecorTexture *t, textures) if (t->pixmap->getPixmap () == pixmap) { t->refCount++; return t; } DecorPixmap::Ptr pm = boost::make_shared (pixmap, mReleasePool); DecorTexture *texture = new DecorTexture (pm); if (!texture->status) { delete texture; return NULL; } textures.push_back (texture); return texture; } /* * DecorScreen::releaseTexture * * Unreferences the texture, deletes the texture from * the list of textures if its no longer in use */ void DecorScreen::releaseTexture (DecorTexture *texture) { texture->refCount--; if (texture->refCount) return; std::list::iterator it = std::find (textures.begin (), textures.end (), texture); if (it == textures.end ()) return; textures.erase (it); delete texture; } /* * computeQuadBox * * Determines a scaled quad box for the decor plugin * by determining the x2 and y2 points by either clamping * or stretching the box. Also applies gravity to determine * relative x1 and y1 points to the window * */ static void computeQuadBox (decor_quad_t *q, int width, int height, int *return_x1, int *return_y1, int *return_x2, int *return_y2, float *return_sx, float *return_sy) { int x1, y1, x2, y2; float sx = 1.0f; float sy = 1.0f; decor_apply_gravity (q->p1.gravity, q->p1.x, q->p1.y, width, height, &x1, &y1); decor_apply_gravity (q->p2.gravity, q->p2.x, q->p2.y, width, height, &x2, &y2); if (q->clamp & CLAMP_HORZ) { if (x1 < 0) x1 = 0; if (x2 > width) x2 = width; } if (q->clamp & CLAMP_VERT) { if (y1 < 0) y1 = 0; if (y2 > height) y2 = height; } if (q->stretch & STRETCH_X) { sx = (float) q->max_width / ((float) (x2 - x1)); } else if (q->max_width < x2 - x1) { if (q->align & ALIGN_RIGHT) x1 = x2 - q->max_width; else x2 = x1 + q->max_width; } if (q->stretch & STRETCH_Y) { sy = (float) q->max_height / ((float) (y2 - y1)); } else if (q->max_height < y2 - y1) { if (q->align & ALIGN_BOTTOM) y1 = y2 - q->max_height; else y2 = y1 + q->max_height; } *return_x1 = x1; *return_y1 = y1; *return_x2 = x2; *return_y2 = y2; if (return_sx) *return_sx = sx; if (return_sy) *return_sy = sy; } /* * Decoration::create * * Factory function to create a Decoration *, takes a decoration * property data, size, type and offset inside that property data * to start reading from. * * This function determines the decoration type and reads the property * data appropriately and then uses the property data to determine the * quads and extents of the input windows and the hinted extents. * */ Decoration::Ptr Decoration::create (Window id, long *prop, unsigned int size, unsigned int type, unsigned int nOffset, DecorPixmapRequestorInterface *requestor) { unsigned int frameType, frameState, frameActions; Pixmap pixmap = None; decor_extents_t border; decor_extents_t input; decor_extents_t maxBorder; decor_extents_t maxInput; int minWidth; int minHeight; int nQuad = N_QUADS_MAX; boost::shared_array quad (new decor_quad_t[nQuad]); if (type == WINDOW_DECORATION_TYPE_PIXMAP && !DecorScreen::get (screen)->cmActive) { compLogMessage ("decor", CompLogLevelWarn, "requested a pixmap type decoration when compositing isn't available"); throw std::exception (); } if (type == WINDOW_DECORATION_TYPE_PIXMAP) { nQuad = decor_pixmap_property_to_quads (prop, nOffset, size, &pixmap, &input, &border, &maxInput, &maxBorder, &minWidth, &minHeight, &frameType, &frameState, &frameActions, quad.get ()); if (!nQuad) throw std::exception (); } else if (type == WINDOW_DECORATION_TYPE_WINDOW) { if (!decor_window_property (prop, nOffset, size, &input, &maxInput, &minWidth, &minHeight, &frameType, &frameState, &frameActions)) { compLogMessage ("decor", CompLogLevelWarn, "malformed decoration - not a window"); throw std::exception (); } border = input; maxBorder = maxInput; } else { compLogMessage ("decor", CompLogLevelWarn, "malformed decoration - undetermined type"); throw std::exception (); } return Decoration::Ptr (new Decoration (type, border, input, maxBorder, maxInput, frameType, frameState, frameActions, minWidth, minHeight, pixmap, quad, nQuad, id, requestor)); } Decoration::Decoration (int type, const decor_extents_t &border, const decor_extents_t &input, const decor_extents_t &maxBorder, const decor_extents_t &maxInput, unsigned int frameType, unsigned int frameState, unsigned int frameActions, unsigned int minWidth, unsigned int minHeight, Pixmap pixmap, const boost::shared_array &quad, unsigned int nQuad, Window owner, DecorPixmapRequestorInterface *requestor) : refCount (0), texture (DecorScreen::get (screen)->getTexture (pixmap)), border (border.left, border.right, border.top, border.bottom), input (input.left, input.right, input.top, input.bottom), maxBorder (maxBorder.left, maxBorder.right, maxBorder.top, maxBorder.bottom), maxInput (maxInput.left, maxInput.right, maxInput.top, maxInput.bottom), minWidth (minWidth), minHeight (minHeight), frameType (frameType), frameState (frameState), frameActions (frameActions), quad (quad), nQuad (nQuad), type (type), updateState (0), mPixmapReceiver (requestor, this) { int x1, y1, x2, y2; if (!texture && type == WINDOW_DECORATION_TYPE_PIXMAP) { compLogMessage ("decor", CompLogLevelWarn, "failed to bind pixmap to texture"); throw std::exception (); } if (type == WINDOW_DECORATION_TYPE_PIXMAP) { int left = 0, right = minWidth, top = 0, bottom = minHeight; for (unsigned int i = 0; i < nQuad; i++) { computeQuadBox (&(quad[i]), minWidth, minHeight, &x1, &y1, &x2, &y2, NULL, NULL); if (x1 < left) left = x1; if (y1 < top) top = y1; if (x2 > right) right = x2; if (y2 > bottom) bottom = y2; } this->output.left = -left; this->output.right = right - minWidth; this->output.top = -top; this->output.bottom = bottom - minHeight; } else { this->output.left = MAX (input.left, maxInput.left); this->output.right = MAX (input.right, maxInput.right); this->output.top = MAX (input.top, maxInput.top); this->output.bottom = MAX (input.bottom, maxInput.bottom); } } /* * Decoration::~Decoration * * Unreferences the decoration, also unreferences the texture * if this decoration is about to be destroyed * */ Decoration::~Decoration () { if (texture) DecorScreen::get (screen)->releaseTexture (texture); } DecorPixmapReceiverInterface & Decoration::receiverInterface () { return mPixmapReceiver; } unsigned int Decoration::getFrameType () const { return frameType; } unsigned int Decoration::getFrameState () const { return frameState; } unsigned int Decoration::getFrameActions () const { return frameActions; } /* * DecorationList is a class which allows multiple decorations * to be stored in a list and read from a window property, which * allows caching to be done for decorations so that we aren't * always querying another process for decorations * */ DecorationList::DecorationList () : mList (0) { } /* * DecorationList::updateDecoration * * Fetches the window property for a particular * window for this decoration list on a particular * decoration atom (whether that be the default * atom on the root window or the _COMPIZ_WINDOW_DECOR * atom on the client) * * Note that due to the way XGetWindowProperty works, * we only cache what is appropriate and then get the * rest from the property in case we didn't read enough * data. It would be awesome if XGetWindowProperty allowed * you to read as much as you wanted. * * FIXME: Currently this function refreshes all decorations. * That's slow and should be fixed * */ bool DecorationList::updateDecoration (Window id, Atom decorAtom, DecorPixmapRequestorInterface *requestor) { unsigned long n, nleft; unsigned char *data; long *prop; Atom actual; int result, format; unsigned int type; /* Dispatch any new updates */ foreach (const Decoration::Ptr &d, mList) { d->mPixmapReceiver.update (); } result = XGetWindowProperty (screen->dpy (), id, decorAtom, 0L, PROP_HEADER_SIZE + 6 * (BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX), false, XA_INTEGER, &actual, &format, &n, &nleft, &data); if (result != Success || !n || !data) return false; /* Attempted to read the reasonable amount of * around 6 pixmap decorations, if there are more, we need * an additional roundtrip to read everything else */ if (nleft) { XFree (data); result = XGetWindowProperty (screen->dpy (), id, decorAtom, 0L, n + nleft, false, XA_INTEGER, &actual, &format, &n, &nleft, &data); if (result != Success || !n || !data) return false; } prop = (long *) data; if (decor_property_get_version (prop) != decor_version ()) { compLogMessage ("decoration", CompLogLevelWarn, "Property ignored because " "version is %d and decoration plugin version is %d\n", decor_property_get_version (prop), decor_version ()); XFree (data); return false; } type = decor_property_get_type (prop); std::list remove; std::list skip; /* only recreate decorations if they need to be updated */ foreach (const Decoration::Ptr &d, mList) { decor_extents_t input, border, maxInput, maxBorder; input.left = d->input.left; input.right = d->input.right; input.top = d->input.top; input.bottom = d->input.bottom; border.left = d->border.left; border.right = d->border.right; border.top = d->border.top; border.bottom = d->border.bottom; maxInput.left = d->maxInput.left; maxInput.right = d->maxInput.right; maxInput.top = d->maxInput.top; maxInput.bottom = d->maxInput.bottom; maxBorder.left = d->maxBorder.left; maxBorder.right = d->maxBorder.right; maxBorder.top = d->maxBorder.top; maxBorder.bottom = d->maxBorder.bottom; Pixmap pm = d->texture->pixmap->getPixmap (); int num = decor_match_pixmap (prop, n, &pm, &input, &border, &maxInput, &maxBorder, d->minWidth, d->minHeight, d->frameType, d->frameState, d->frameActions, d->quad.get (), d->nQuad); if (num != -1) skip.push_back (num); else remove.push_back (d); } /* Create a new decoration for each individual item on the property */ for (int i = 0; i < decor_property_get_num (prop); i++) { if (std::find (skip.begin (), skip.end (), i) != skip.end ()) continue; try { std::list ::iterator it = mList.begin (); Decoration::Ptr d = Decoration::create (id, prop, n, type, i, requestor); /* Try to replace an existing decoration */ for (; it != mList.end (); ++it) { if ((*it)->frameType == d->frameType && (*it)->frameState == d->frameState && (*it)->frameActions == d->frameActions) { remove.remove ((*it)); (*it) = d; break; } } if (it == mList.end ()) mList.push_back (d); } catch (...) { /* Creating a new decoration failed ... see if we can use * the old one */ unsigned int frameType, frameState, frameActions = 0; Pixmap pixmap = None; decor_extents_t border; decor_extents_t input; decor_extents_t maxBorder; decor_extents_t maxInput; int minWidth; int minHeight; int ok = 0; boost::shared_array quad (new decor_quad_t[N_QUADS_MAX]); if (type == WINDOW_DECORATION_TYPE_PIXMAP) { ok = decor_pixmap_property_to_quads (prop, i, n, &pixmap, &input, &border, &maxInput, &maxBorder, &minWidth, &minHeight, &frameType, &frameState, &frameActions, quad.get ()); } else if (type == WINDOW_DECORATION_TYPE_WINDOW) { ok = decor_window_property (prop, i, n, &input, &maxInput, &minWidth, &minHeight, &frameType, &frameState, &frameActions); } if (ok) { std::list ::iterator it = mList.begin (); /* Use an existing decoration */ for (; it != mList.end (); ++it) { if ((*it)->frameType == frameType && (*it)->frameState == frameState && (*it)->frameActions == frameActions) { remove.remove ((*it)); break; } } } } } foreach (const Decoration::Ptr &d, remove) mList.remove (d); XFree (data); return true; } /* * DecorWindow::updateDecoration * * Updates the decoration list on this window */ void DecorWindow::updateDecoration () { bindFailed = false; decor.updateDecoration (window->id (), dScreen->winDecorAtom, &mRequestor); if (bindFailed) pixmapFailed = true; else pixmapFailed = false; } /* * WindowDecoration::create * * Factory function for WindowDecoration, creates * a window specific decoration for this window, * not to be confused with window /type/ decorations * which are a different matter. * * Decorations can indeed be re-used, and that is what * WindowDecoration is for. * */ WindowDecoration * WindowDecoration::create (const Decoration::Ptr &d) { WindowDecoration *wd; unsigned int nQuad = d->nQuad; wd = new WindowDecoration (); if (!wd) return NULL; if (d->type == WINDOW_DECORATION_TYPE_PIXMAP) { wd->quad = new ScaledQuad[nQuad]; if (!wd->quad) { delete wd; return NULL; } } else { nQuad = 0; wd->quad = NULL; } d->refCount++; wd->decor = d; wd->nQuad = nQuad; return wd; } /* * WindowDecoration::destroy * * Unreferences the bound decoration * and frees quads */ void WindowDecoration::destroy (WindowDecoration *wd) { delete [] wd->quad; delete wd; } /* * DecorWindow::setDecorationMatrices * * Statically update the quad display matrices * (2x3 matrix) each time the window is moved * or resized * * For this to work, we need to multiply the * scaled quad and decor quad matrices together * to get the final scaled transformation * * Translation (x0, y0) is based on the actual box * position in decoration co-ordinate space multiplied * by the scaled transformation matrix */ void DecorWindow::setDecorationMatrices () { float x0, y0; decor_matrix_t a; GLTexture::Matrix b; if (!wd) return; for (int i = 0; i < wd->nQuad; i++) { /* Set the quad matrix to the texture matrix */ wd->quad[i].matrix = wd->decor->texture->textures[0]->matrix (); /* Initial translation point is based on existing translation point */ x0 = wd->decor->quad[i].m.x0; y0 = wd->decor->quad[i].m.y0; a = wd->decor->quad[i].m; b = wd->quad[i].matrix; /* Multiply wd->quad[i].matrix (decoration matrix) * and the scaled quad matrix */ wd->quad[i].matrix.xx = a.xx * b.xx + a.yx * b.xy; wd->quad[i].matrix.yx = a.xx * b.yx + a.yx * b.yy; wd->quad[i].matrix.xy = a.xy * b.xx + a.yy * b.xy; wd->quad[i].matrix.yy = a.xy * b.yx + a.yy * b.yy; wd->quad[i].matrix.x0 = x0 * b.xx + y0 * b.xy + b.x0; wd->quad[i].matrix.y0 = x0 * b.yx + y0 * b.yy + b.y0; wd->quad[i].matrix.xx *= wd->quad[i].sx; wd->quad[i].matrix.yx *= wd->quad[i].sx; wd->quad[i].matrix.xy *= wd->quad[i].sy; wd->quad[i].matrix.yy *= wd->quad[i].sy; /* Align translation points to the right * in the scaled quad (window) space */ if (wd->decor->quad[i].align & ALIGN_RIGHT) x0 = wd->quad[i].box.x2 - wd->quad[i].box.x1; else x0 = 0.0f; /* Align translation points to the bottom * in the scaled quad (window) space */ if (wd->decor->quad[i].align & ALIGN_BOTTOM) y0 = wd->quad[i].box.y2 - wd->quad[i].box.y1; else y0 = 0.0f; wd->quad[i].matrix.x0 -= x0 * wd->quad[i].matrix.xx + y0 * wd->quad[i].matrix.xy; wd->quad[i].matrix.y0 -= y0 * wd->quad[i].matrix.yy + x0 * wd->quad[i].matrix.yx; wd->quad[i].matrix.x0 -= wd->quad[i].box.x1 * wd->quad[i].matrix.xx + wd->quad[i].box.y1 * wd->quad[i].matrix.xy; wd->quad[i].matrix.y0 -= wd->quad[i].box.y1 * wd->quad[i].matrix.yy + wd->quad[i].box.x1 * wd->quad[i].matrix.yx; } updateMatrix = false; } /* * DecorWindow::updateDecorationScale * * Update the scaled quads box for this * window. Do that by determining * the scaled quad box for the window size * and then translating each quad box by * the window position * */ void DecorWindow::updateDecorationScale () { int x1, y1, x2, y2; float sx, sy; if (!wd) return; for (int i = 0; i < wd->nQuad; i++) { int x, y; unsigned int width = window->size ().width (); unsigned int height = window->size ().height (); if (window->shaded ()) { if (dScreen->cScreen && dScreen->cScreen->compositingActive ()) { if (!cWindow->pixmap ()) height = 0; } else height = 0; } computeQuadBox (&wd->decor->quad[i], width, height, &x1, &y1, &x2, &y2, &sx, &sy); /* Translate by x and y points of this window */ x = window->geometry ().x (); y = window->geometry ().y (); wd->quad[i].box.x1 = x1 + x; wd->quad[i].box.y1 = y1 + y; wd->quad[i].box.x2 = x2 + x; wd->quad[i].box.y2 = y2 + y; wd->quad[i].sx = sx; wd->quad[i].sy = sy; } setDecorationMatrices (); } /* * DecorWindow::checkSize * * Convenience function to check if this decoration * is going to display laerger than the window size * itself, in that case we can't use it since it * would like the decoration was larger than the window * (or trying to compress it anymore would result in * eg, distorted text or buttons). In that case * we'd use default decorations * */ bool DecorWindow::checkSize (const Decoration::Ptr &decoration) { return (decoration->minWidth <= (int) window->size ().width () && decoration->minHeight <= (int) window->size ().height ()); } /* * DecorWindow::matchType * * Converts libdecoration window types packed * into the property into Compiz window types * */ bool DecorWindow::matchType (CompWindow *w, unsigned int decorType) { const unsigned int nTypeStates = 5; struct typestate { unsigned int compFlag; unsigned int decorFlag; } typeStates[] = { { CompWindowTypeNormalMask, DECOR_WINDOW_TYPE_NORMAL }, { CompWindowTypeDialogMask, DECOR_WINDOW_TYPE_DIALOG }, { CompWindowTypeModalDialogMask, DECOR_WINDOW_TYPE_MODAL_DIALOG }, { CompWindowTypeMenuMask, DECOR_WINDOW_TYPE_MENU }, { CompWindowTypeUtilMask, DECOR_WINDOW_TYPE_UTILITY} }; for (unsigned int i = 0; i < nTypeStates; i++) { if ((decorType & typeStates[i].decorFlag) && (w->type () & typeStates[i].compFlag)) return true; } return false; } /* * DecorWindow::matchType * * Converts libdecoration window states packed * into the property into Compiz window states * * Since there is no _NET_WM_STATE_ACTIVE * we need to determine that ourselves from * _NET_ACTIVE_WINDOW on the root window * */ bool DecorWindow::matchState (CompWindow *w, unsigned int decorState) { const unsigned int nStateStates = 3; struct statestate { unsigned int compFlag; unsigned int decorFlag; } stateStates[] = { { CompWindowStateMaximizedVertMask, DECOR_WINDOW_STATE_MAXIMIZED_VERT }, { CompWindowStateMaximizedHorzMask, DECOR_WINDOW_STATE_MAXIMIZED_HORZ }, { CompWindowStateShadedMask, DECOR_WINDOW_STATE_SHADED } }; /* Active is a separate check */ if (screen->activeWindow () == w->id ()) decorState &= ~(DECOR_WINDOW_STATE_FOCUS); for (unsigned int i = 0; i < nStateStates; i++) { if ((decorState & stateStates[i].decorFlag) && (w->state () & stateStates[i].compFlag)) decorState &= ~(stateStates[i].decorFlag); } return (decorState == 0); } /* * DecorWindow::matchActions * * Converts libdecoration window actions packed * into the property into Compiz window types * */ bool DecorWindow::matchActions (CompWindow *w, unsigned int decorActions) { const unsigned int nActionStates =16; struct actionstate { unsigned int compFlag; unsigned int decorFlag; } actionStates[] = { { DECOR_WINDOW_ACTION_RESIZE_HORZ, CompWindowActionResizeMask }, { DECOR_WINDOW_ACTION_RESIZE_VERT, CompWindowActionResizeMask }, { DECOR_WINDOW_ACTION_CLOSE, CompWindowActionCloseMask }, { DECOR_WINDOW_ACTION_MINIMIZE, CompWindowActionMinimizeMask }, { DECOR_WINDOW_ACTION_UNMINIMIZE,CompWindowActionMinimizeMask }, { DECOR_WINDOW_ACTION_MAXIMIZE_HORZ, CompWindowActionMaximizeHorzMask }, { DECOR_WINDOW_ACTION_MAXIMIZE_VERT, CompWindowActionMaximizeVertMask }, { DECOR_WINDOW_ACTION_UNMAXIMIZE_HORZ, CompWindowActionMaximizeHorzMask }, { DECOR_WINDOW_ACTION_UNMAXIMIZE_VERT, CompWindowActionMaximizeVertMask }, { DECOR_WINDOW_ACTION_SHADE, CompWindowActionShadeMask }, { DECOR_WINDOW_ACTION_UNSHADE, CompWindowActionShadeMask }, { DECOR_WINDOW_ACTION_STICK, CompWindowActionStickMask }, { DECOR_WINDOW_ACTION_UNSTICK, CompWindowActionStickMask }, { DECOR_WINDOW_ACTION_FULLSCREEN, CompWindowActionFullscreenMask }, { DECOR_WINDOW_ACTION_ABOVE, CompWindowActionAboveMask }, { DECOR_WINDOW_ACTION_BELOW, CompWindowActionBelowMask }, }; for (unsigned int i = 0; i < nActionStates; i++) { if ((decorActions & actionStates[i].decorFlag) && (w->type () & actionStates[i].compFlag)) decorActions &= ~(actionStates[i].decorFlag); } return (decorActions == 0); } DecorationInterface::Ptr DecorationList::findMatchingDecoration (unsigned int frameType, unsigned int frameState, unsigned int frameActions) const { foreach (const Decoration::Ptr &d, mList) { if (d->frameType == frameType && d->frameState == frameState && d->frameActions == frameActions) return d; } return DecorationInterface::Ptr (); } DecorationInterface::Ptr DecorationList::findMatchingDecoration (Pixmap p) const { foreach (const Decoration::Ptr &d, mList) { if (d->texture->pixmap->getPixmap () == p) return d; } return DecorationInterface::Ptr (); } /* * DecorationList::findMatchingDecoration * * Searches a decoration list for a decoration * that actually matches this window, or at least * comes close to it. * * There is an order of preference when matching * decorations here. * * Type:State:Actions * * If a property before another one is matched, that * decoration is "locked" so if a decoration is found * that has the correct matching property but does not * match the locked property, then it is not matched * */ const Decoration::Ptr & DecorationList::findMatchingDecoration (CompWindow *w, bool sizeCheck) { std::list ::iterator cit = mList.end (); DECOR_WINDOW (w); if (!mList.empty ()) { const unsigned int typeMatch = (1 << 0); const unsigned int stateMatch = (1 << 1); const unsigned int actionsMatch = (1 << 2); unsigned int currentDecorState = 0; if (sizeCheck) if (dw->checkSize (mList.front ())) cit = mList.begin (); for (std::list ::iterator it = mList.begin (); it != mList.end (); ++it) { const Decoration::Ptr &d = *it; /* Must always match type */ if (DecorWindow::matchType (w, d->frameType)) { /* Use this decoration if the type matched */ if (!(typeMatch & currentDecorState) && (!sizeCheck || dw->checkSize (d))) { cit = it; currentDecorState |= typeMatch; } /* Must always match state if type is already matched */ if (DecorWindow::matchState (w, d->frameState) && (!sizeCheck || dw->checkSize (d))) { /* Use this decoration if the type and state match */ if (!(stateMatch & currentDecorState)) { cit = it; currentDecorState |= stateMatch; } /* Must always match actions if state and type are already matched */ if (DecorWindow::matchActions (w, d->frameActions) && (!sizeCheck || dw->checkSize (d))) { /* Use this decoration if the requested actions match */ if (!(actionsMatch & currentDecorState)) { cit = it; currentDecorState |= actionsMatch; /* Perfect match, no need to continue searching */ break; } } } } } } if (cit == mList.end ()) throw std::exception (); return *cit; } bool DecorWindow::bareDecorationOnly () { bool shadowOnly = true; /* Only want to decorate windows which have a frame or are in the process * of waiting for an animation to be unmapped (in which case we can give * them a new pixmap type frame since we don't actually need an input * window to go along with that * * FIXME: That's not going to play nice with reparented decorations in core * since the window gets reparented right away before plugins are done * with it */ /* Unconditionally decorate switchers */ if (!isSwitcher) { switch (window->type ()) { case CompWindowTypeDialogMask: case CompWindowTypeModalDialogMask: case CompWindowTypeUtilMask: case CompWindowTypeMenuMask: case CompWindowTypeNormalMask: if (window->mwmDecor () & (MwmDecorAll | MwmDecorTitle)) shadowOnly = false; default: break; } if (window->overrideRedirect ()) shadowOnly = true; if (window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) shadowOnly = true; if (!shadowOnly) { if (!dScreen->optionGetDecorationMatch ().evaluate (window)) shadowOnly = true; } /* Never on unmapped windows */ if (!window->isViewable ()) shadowOnly = false; } else shadowOnly = false; return shadowOnly; } Decoration::Ptr DecorWindow::findRealDecoration () { Decoration::Ptr decoration; /* Attempt to find a matching decoration */ try { decoration = decor.findMatchingDecoration (window, true); } catch (...) { /* Find an appropriate default decoration to use */ if (dScreen->dmSupports & WINDOW_DECORATION_TYPE_PIXMAP && dScreen->cmActive && !(dScreen->dmSupports & WINDOW_DECORATION_TYPE_WINDOW && pixmapFailed)) { try { decoration = dScreen->decor[DECOR_ACTIVE].findMatchingDecoration (window, false); } catch (...) { compLogMessage ("decor", CompLogLevelWarn, "No default decoration found, placement will not be correct"); decoration.reset (); } } else if (dScreen->dmSupports & WINDOW_DECORATION_TYPE_WINDOW) decoration = dScreen->windowDefault; } return decoration; } Decoration::Ptr DecorWindow::findBareDecoration () { Decoration::Ptr decoration; /* This window isn't "decorated" but it still gets a shadow as long * as it isn't shaped weirdly, since the shadow is just a quad rect */ if (dScreen->optionGetShadowMatch ().evaluate (window)) { if (window->region ().numRects () == 1 && !window->alpha () && dScreen->decor[DECOR_BARE].mList.size ()) decoration = dScreen->decor[DECOR_BARE].mList.front (); if (decoration) { if (!checkSize (decoration)) decoration.reset (); } } return decoration; } namespace { bool shouldDecorateWindow (CompWindow *w, bool shadowOnly, bool isSwitcher) { const bool frameOrUnmapReference = (w->frame () || w->hasUnmapReference ()); const bool realDecoration = frameOrUnmapReference && !shadowOnly; const bool forceDecoration = isSwitcher; return realDecoration || forceDecoration; } /* * notifyDecoration * * Notify other plugins that the window is now fully decorated */ void notifyDecoration (CompWindow *window) { CompOption::Vector o (1); o.at (0).setName ("window", CompOption::TypeInt); o.at (0).value ().set ((int) window->id ()); screen->handleCompizEvent ("decor", "window_decorated", o); } } /* * DecorWindow::update * This is the master function for managing decorations on windows * * The first part of this function determines if we want to actually * decorate a particular window. This only passes if the window * matches the decorated type match and it is also capable of being * decorated (eg, has a frame window and not override redirect) and * also has appropriate _MOTIF_WM_HINTS set on it (specifically 0x3 * and 0x6) * * The next part of the function attempts to find a matching decoration * has has been created by the decorators. If it can't find one, the * window gets a default decoration (until the decorators have "caught * up" with us and given this window an actual decoration. * * Windows that we've marked not to decorate get shadows around them * at least. This is the "bare" type decoration * * If an appropriate decoration is found for this window, a WindowDecoration * (which is a window specific class determining how that decoration * should operate on /this particular window/) is created. * * At this point we also update the "frame extents" in core (for * _NET_REQUEST_FRAME_EXTENTS) and also the actual frame geometry * since we might need a larger space on the frame window (which is * shaped to accomadate decorations) for things like, eg grab areas * which shouldn't be represented to clients as actual visible * decoration space * * FIXME: There are a bunch of hacks in here to allow override redirect * windows which have "special" switcher type decorations to be decorated * without being reparented. Ideally, these shouldn't be handled by * the decor plugin * */ bool DecorWindow::update (bool allowDecoration) { Decoration::Ptr old, decoration; CompPoint movement; CompSize sizeDelta; if (wd) old = wd->decor; else old.reset (); bool shadowOnly = bareDecorationOnly (); bool decorate = shouldDecorateWindow (window, shadowOnly, isSwitcher); unsigned int decorMaximizeState = window->state () & MAXIMIZE_STATE; if (decorate || frameExtentsRequested) { decoration = findRealDecoration (); /* Do not allow windows which are later undecorated * to have a set _NET_FRAME_EXTENTS */ if (decorate) frameExtentsRequested = false; } else decoration = findBareDecoration (); /* Don't allow the windows to be decorated if * we're tearing down or if a decorator isn't running * (nobody owns the selection window) */ if (!dScreen->dmWin || !allowDecoration) decoration.reset (); /* Don't bother going any further if * this window is going to get the same * decoration, just use the old one */ if (decoration == old && lastMaximizedStateDecorated == decorMaximizeState) return false; /* If a decoration was found for this window, create * a new WindowDecoration for it and set the frame * extents accordingly. We should also move the * window by the distance the new decoration provides * in case that actually changed */ if (decoration) { /* Set extents based on maximize/unmaximize state * FIXME: With the new type system, this should be * removed */ if (decorMaximizeState == MAXIMIZE_STATE) window->setWindowFrameExtents (&decoration->maxBorder, &decoration->maxInput); else if (!window->hasUnmapReference ()) window->setWindowFrameExtents (&decoration->border, &decoration->input); lastMaximizedStateDecorated = decorMaximizeState; /* This window actually needs its decoration contents updated * as it was actually visible */ if (decorate || shadowOnly) { if (wd) WindowDecoration::destroy (wd); wd = WindowDecoration::create (decoration); if (!wd) { /* Error condition, reset frame extents */ CompWindowExtents emptyExtents; memset (&emptyExtents, 0, sizeof (CompWindowExtents)); window->setWindowFrameExtents (&emptyExtents, &emptyExtents); return false; } window->updateWindowOutputExtents (); updateReg = true; updateMatrix = true; mOutputRegion = CompRegion (window->outputRect ()); if (dScreen->cmActive) cWindow->damageOutputExtents (); updateDecorationScale (); /* Update the input and output frame */ if (decorate) updateFrame (); } } else { CompWindowExtents emptyExtents; if (wd) { WindowDecoration::destroy (wd); wd = NULL; } /* _NET_FRAME_EXTENTS should be updated before the frame * atom is */ memset (&emptyExtents, 0, sizeof (CompWindowExtents)); window->setWindowFrameExtents (&emptyExtents, &emptyExtents); /* Undecorated windows need to have the * input and output frame removed and the * frame window geometry reset */ updateFrame (); } /* We need to damage the current output extents * and recompute the shadow region if a compositor * is running */ if (dScreen->cmActive) { cWindow->damageOutputExtents (); updateGroupShadows (); } notifyDecoration (window); return true; } /* * DecorWindow::updateFrame * * Updates the actual frame window which is * used for either displaying the decoration in the case of window * type reparented decorations, or handling input events in the case * of pixmap decorations */ void DecorWindow::updateFrame () { /* Destroy the input and output frames in case the window can't * actually be decorated */ if (!wd || !(window->border ().left || window->border ().right || window->border ().top || window->border ().bottom) || (wd->decor->type == WINDOW_DECORATION_TYPE_PIXMAP && outputFrame) || (wd->decor->type == WINDOW_DECORATION_TYPE_WINDOW && inputFrame)) { if (inputFrame) { XDeleteProperty (screen->dpy (), window->id (), dScreen->inputFrameAtom); if (window->frame ()) XDestroyWindow (screen->dpy (), inputFrame); inputFrame = None; frameRegion = CompRegion (); oldX = 0; oldY = 0; oldWidth = 0; oldHeight = 0; } if (outputFrame) { XDamageDestroy (screen->dpy (), frameDamage); XDeleteProperty (screen->dpy (), window->id (), dScreen->outputFrameAtom); if (window->frame ()) XDestroyWindow (screen->dpy (), outputFrame); dScreen->frames.erase (outputFrame); outputFrame = None; frameRegion = CompRegion (); oldX = 0; oldY = 0; oldWidth = 0; oldHeight = 0; } } /* If the window can be decorated, update the frames */ if (wd && (window->border ().left || window->border ().right || window->border ().top || window->border ().bottom)) { if (wd->decor->type == WINDOW_DECORATION_TYPE_PIXMAP) updateInputFrame (); else if (wd->decor->type == WINDOW_DECORATION_TYPE_WINDOW) updateOutputFrame (); } } /* * DecorWindow::updateInputFrame * * Actually creates an input frame if there isn't * one, otherwise sets the shape regions on it so that * if the decoration inside the parent window ever * gets stacked on top of the client, it won't obstruct * it * * This also sets the _COMPIZ_WINDOW_DECOR_INPUT_FRAME * atom on the window. Decorators should listen for this * to determine if a window is to be decorated, and when * they get a PropertyNotify indicating that this the case * should draw a decoration and set the _COMPIZ_WINDOW_DECOR * atom in response, otherwise this window is going to * be stuck with default decorations * */ void DecorWindow::updateInputFrame () { XRectangle rects[4]; int x, y, width, height; CompWindow::Geometry server = window->serverGeometry (); CompWindowExtents input; CompWindowExtents border; Window parent; /* Switchers are special, we need to put input frames * there in the root window rather than in the frame * window that this window is reparented into */ if (isSwitcher) parent = screen->root (); else parent = window->frame (); /* Determine frame extents */ if ((window->state () & MAXIMIZE_STATE) == MAXIMIZE_STATE) { border = wd->decor->maxBorder; input = wd->decor->maxInput; } else { border = wd->decor->border; input = wd->decor->input; } x = window->border ().left - border.left; y = window->border ().top - border.top; width = server.widthIncBorders () + input.left + input.right; height = server.heightIncBorders ()+ input.top + input.bottom ; /* Non switcher windows are rooted relative to the frame window of the client * and switchers need to be offset by the window geometry of the client */ if (isSwitcher) { x += window->x (); y += window->y (); } /* Shaded windows automatically have no height */ if (window->shaded ()) height = input.top + input.bottom; /* Since we're reparenting windows here, we need to grab the server * which sucks, but its necessary */ XGrabServer (screen->dpy ()); if (!inputFrame) { XSetWindowAttributes attr; attr.event_mask = StructureNotifyMask; attr.override_redirect = true; inputFrame = XCreateWindow (screen->dpy (), parent, x, y, width, height, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); XGrabButton (screen->dpy (), AnyButton, AnyModifier, inputFrame, true, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeSync, GrabModeSync, None, None); XMapWindow (screen->dpy (), inputFrame); /* Notify the decorators that an input frame has been created on * this window so that they can react by actually create a decoration * for it (while we use the default decorations) */ XChangeProperty (screen->dpy (), window->id (), dScreen->inputFrameAtom, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &inputFrame, 1); if (screen->XShape ()) XShapeSelectInput (screen->dpy (), inputFrame, ShapeNotifyMask); /* invalidate the decoration so that it gets shaped */ oldX = 0; oldY = 0; oldWidth = 0; oldHeight = 0; } if (x != oldX || y != oldY || width != oldWidth || height != oldHeight) { int i = 0; oldX = x; oldY = y; oldWidth = width; oldHeight = height; XMoveResizeWindow (screen->dpy (), inputFrame, x, y, width, height); /* Non switcher decorations need to be lowered in * in the frame to ensure that they go below * the window contents (so that our set input shape * works correctly */ if (!isSwitcher) XLowerWindow (screen->dpy (), inputFrame); rects[i].x = 0; rects[i].y = 0; rects[i].width = width; rects[i].height = input.top; if (rects[i].width && rects[i].height) i++; rects[i].x = 0; rects[i].y = input.top; rects[i].width = input.left; rects[i].height = height - input.top - input.bottom; if (rects[i].width && rects[i].height) i++; rects[i].x = width - input.right; rects[i].y = input.top; rects[i].width = input.right; rects[i].height = height - input.top - input.bottom; if (rects[i].width && rects[i].height) i++; rects[i].x = 0; rects[i].y = height - input.bottom; rects[i].width = width; rects[i].height = input.bottom; if (rects[i].width && rects[i].height) i++; XShapeCombineRectangles (screen->dpy (), inputFrame, ShapeInput, 0, 0, rects, i, ShapeSet, YXBanded); frameRegion = CompRegion (); /* Immediately query shape rectangles so that we can * report them if core asks for them */ updateRegionWithShapeRectangles (screen->dpy (), inputFrame, frameRegion); window->updateFrameRegion (); } XUngrabServer (screen->dpy ()); } /* * DecorWindow::updateOutputFrame * * Actually creates an output frame if there isn't * one, otherwise sets the shape regions on it so that * if the decoration inside the parent window ever * gets stacked on top of the client, it won't obstruct * it * * This also sets the _COMPIZ_WINDOW_DECOR_OUTPUT_FRAME * atom on the window. Decorators should listen for this * to determine if a window is to be decorated, and when * they get a PropertyNotify indicating that this the case * should draw a decoration inside the window and set the * _COMPIZ_WINDOW_DECOR atom in response, otherwise this * window is going to be stuck with default decorations * */ void DecorWindow::updateOutputFrame () { XRectangle rects[4]; int x, y, width, height; CompWindow::Geometry server = window->serverGeometry (); CompWindowExtents input; /* Determine frame extents */ if ((window->state () & MAXIMIZE_STATE) == MAXIMIZE_STATE) input = wd->decor->maxInput; else input = wd->decor->input; x = window->input ().left - input.left; y = window->input ().top - input.top; width = server.widthIncBorders () + input.left + input.right; height = server.heightIncBorders ()+ input.top + input.bottom; if (window->shaded ()) height = input.top + input.bottom; /* Since we're reparenting windows here, we need to grab the server * which sucks, but its necessary */ XGrabServer (screen->dpy ()); if (!outputFrame) { XSetWindowAttributes attr; attr.background_pixel = 0x0; attr.event_mask = StructureNotifyMask; attr.override_redirect = true; outputFrame = XCreateWindow (screen->dpy (), window->frame (), x, y, width, height, 0, CopyFromParent, InputOutput, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); XGrabButton (screen->dpy (), AnyButton, AnyModifier, outputFrame, true, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeSync, GrabModeSync, None, None); XMapWindow (screen->dpy (), outputFrame); /* Notify the decorators that an input frame has been created on * this window so that they can react by actually create a decoration * for it (while we use the default decorations) */ XChangeProperty (screen->dpy (), window->id (), dScreen->outputFrameAtom, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &outputFrame, 1); if (screen->XShape ()) XShapeSelectInput (screen->dpy (), outputFrame, ShapeNotifyMask); /* invalidate the decoration so that it gets shaped */ oldX = 0; oldY = 0; oldWidth = 0; oldHeight = 0; frameDamage = XDamageCreate (screen->dpy (), outputFrame, XDamageReportBoundingBox); dScreen->frames[outputFrame] = this; } if (x != oldX || y != oldY || width != oldWidth || height != oldHeight) { int i = 0; oldX = x; oldY = y; oldWidth = width; oldHeight = height; XMoveResizeWindow (screen->dpy (), outputFrame, x, y, width, height); XLowerWindow (screen->dpy (), outputFrame); rects[i].x = 0; rects[i].y = 0; rects[i].width = width; rects[i].height = input.top; if (rects[i].width && rects[i].height) i++; rects[i].x = 0; rects[i].y = input.top; rects[i].width = input.left; rects[i].height = height - input.top - input.bottom; if (rects[i].width && rects[i].height) i++; rects[i].x = width - input.right; rects[i].y = input.top; rects[i].width = input.right; rects[i].height = height - input.top - input.bottom; if (rects[i].width && rects[i].height) i++; rects[i].x = 0; rects[i].y = height - input.bottom; rects[i].width = width; rects[i].height = input.bottom; if (rects[i].width && rects[i].height) i++; XShapeCombineRectangles (screen->dpy (), outputFrame, ShapeBounding, 0, 0, rects, i, ShapeSet, YXBanded); frameRegion = CompRegion (); /* Immediately query shape rectangles so that we can * report them if core asks for them */ updateRegionWithShapeRectangles (screen->dpy (), outputFrame, frameRegion); window->updateFrameRegion (); } XUngrabServer (screen->dpy ()); } /* * DecorScreen::checkForDm * * Checks for a running decoration manager on the root window * and also checks to see what decoration modes it supports * * dmWin is set based on the window on supportingDmCheckAtom * on the root window. That's a window which is owned by * the decorator, so if it changes we need to invalidate * all the decorations */ void DecorScreen::checkForDm (bool updateWindows) { Atom actual; int result, format, dmSupports = 0; unsigned long n, left; unsigned char *data; Window dmWin = None; result = XGetWindowProperty (screen->dpy (), screen->root (), supportingDmCheckAtom, 0L, 1L, false, XA_WINDOW, &actual, &format, &n, &left, &data); if (result == Success && n && data) { XWindowAttributes attr; memcpy (&dmWin, data, sizeof (Window)); XFree (data); CompScreen::checkForError (screen->dpy ()); XGetWindowAttributes (screen->dpy (), dmWin, &attr); if (CompScreen::checkForError (screen->dpy ())) dmWin = None; else { result = XGetWindowProperty (screen->dpy (), dmWin, decorTypeAtom, 0L, 2L, false, XA_ATOM, &actual, &format, &n, &left, &data); if (result == Success && n && data) { Atom *ret = (Atom *) data; for (unsigned long i = 0; i < n; i++) { if (ret[i] == decorTypePixmapAtom) dmSupports |= WINDOW_DECORATION_TYPE_PIXMAP; else if (ret[i] == decorTypeWindowAtom) dmSupports |= WINDOW_DECORATION_TYPE_WINDOW; } if (!dmSupports) dmWin = None; XFree (data); } else dmWin = None; } } /* Different decorator became active, update all decorations */ if (dmWin != this->dmWin) { int i; this->dmSupports = dmSupports; /* Create new default decorations */ screen->updateSupportedWmHints (); if (dmWin) { for (i = 0; i < DECOR_NUM; i++) { decor[i].updateDecoration (screen->root (), decorAtom[i], &mRequestor); } } else { /* No decorator active, destroy all decorations */ for (i = 0; i < DECOR_NUM; i++) { decor[i].clear (); foreach (CompWindow *w, screen->windows ()) DecorWindow::get (w)->decor.mList.clear (); } } this->dmWin = dmWin; if (updateWindows) { foreach (CompWindow *w, screen->windows ()) if (w->shaded () || w->isViewable ()) DecorWindow::get (w)->update (true); } } } /* * DecorWindow::updateFrameRegion * * Shapes the toplevel frame region according to the rects * in the decoration that we have. This is a wrapped function * */ void DecorWindow::updateFrameRegion (CompRegion ®ion) { window->updateFrameRegion (region); if (wd) { if (!frameRegion.isEmpty ()) { int x, y; x = window->geometry (). x (); y = window->geometry (). y (); region += frameRegion.translated (x - wd->decor->input.left, y - wd->decor->input.top); } } updateReg = true; updateMatrix = true; } /* * DecorWindow::updateWindowRegions * * Used to update the region that the window type * decorations occupty when the window is moved */ void DecorWindow::updateWindowRegions () { const CompRect &input (window->inputRect ()); if (regions.size () != gWindow->textures ().size ()) regions.resize (gWindow->textures ().size ()); for (unsigned int i = 0; i < gWindow->textures ().size (); i++) { regions[i] = CompRegion (*gWindow->textures ()[i]); regions[i].translate (input.x (), input.y ()); regions[i] &= window->frameRegion (); } updateReg = false; } /* * DecorWindow::place * * Update any windows just before placement * so that placement algorithms will have the * border size at place-time */ bool DecorWindow::place (CompPoint &pos) { update (true); return window->place (pos); } /* * DecorWindow::windowNotify * * Window event notification handler. On various * events on windows we need to update the decorations * */ void DecorWindow::windowNotify (CompWindowNotify n) { switch (n) { case CompWindowNotifyMap: /* When the switcher is mapped, it has no frame window * so the frame window for it needs to mapped manually */ if (isSwitcher) { update (true); XMapWindow (screen->dpy (), inputFrame); break; } /* For non-switcher windows we need to update the decoration * anyways, since the window is unmapped. Also need to * update the shadow clip regions for panels and other windows */ update (true); updateDecorationScale (); if (dScreen->mMenusClipGroup.pushClippable (this)) updateGroupShadows (); break; case CompWindowNotifyUnmap: { /* When the switcher is unmapped, it has no frame window * so the frame window for it needs to unmapped manually */ if (isSwitcher) { update (true); XUnmapWindow (screen->dpy (), inputFrame); break; } /* For non-switcher windows we need to update the decoration * anyways, since the window is unmapped. Also need to * update the shadow clip regions for panels and other windows */ update (true); updateDecorationScale (); /* Preserve the group shadow update ptr */ DecorClipGroupInterface *clipGroup = mClipGroup; if (dScreen->mMenusClipGroup.popClippable (this)) if (clipGroup) clipGroup->updateAllShadows (); break; } case CompWindowNotifyUnreparent: { /* Compiz detaches the frame window from * the client on unreparent, so we must * destroy our frame windows by forcing * this window to have no decorations */ update (false); break; } case CompWindowNotifyReparent: /* Always update decorations when a window gets reparented */ update (true); break; case CompWindowNotifyShade: /* We get the notification for shade before the window is * actually resized which means that calling update -> * damageOutputExtents here will not do anything useful for us * so we need to track when windows are (un)shading and then wait * for the following resize notification to actually * update their decoration (since at this point they would have * been resized) */ shading = true; unshading = false; break; case CompWindowNotifyUnshade: unshading = true; shading = false; break; default: break; } window->windowNotify (n); } /* * DecorWindow::updateSwitcher * * Check this window to see if it is a switcher, * if so, update the switcher flag */ void DecorWindow::updateSwitcher () { Atom actualType; int actualFmt; unsigned long nitems, nleft; unsigned long *data; DECOR_SCREEN (screen); if (XGetWindowProperty (screen->dpy (), window->id (), ds->decorSwitchWindowAtom, 0L, 1024L, false, XA_WINDOW, &actualType, &actualFmt, &nitems, &nleft, (unsigned char **) &data) == Success) { if (data) XFree (data); if (nitems == 1) { isSwitcher = true; return; } } isSwitcher = false; } DecorPixmapRequestorInterface * DecorScreen::findWindowRequestor (Window window) { if (window == screen->root ()) { return &mRequestor; } else { CompWindow *w = screen->findWindow (window); if (w) return &(DecorWindow::get (w)->mRequestor); return NULL; } } DecorationListFindMatchingInterface * DecorScreen::findWindowDecorations (Window window) { if (window == screen->root ()) { return &decor[DECOR_ACTIVE]; } else { CompWindow *w = screen->findWindow (window); if (w) return &(DecorWindow::get (w)->decor); return NULL; } } /* * DecorScreen::handleEvent * * Handles X11 events */ void DecorScreen::handleEvent (XEvent *event) { Window activeWindow = screen->activeWindow (); CompWindow *w; switch (event->type) { case DestroyNotify: /* When a decorator selection owner window is destroyed * it means that this decorator went away, so we need * to account for this */ w = screen->findWindow (event->xdestroywindow.window); if (w) { if (w->id () == dmWin) checkForDm (true); } break; case ClientMessage: /* Update decorations whenever someone requests frame extents * so that core doesn't reply with the wrong extents when * when handleEvent is passed to core */ if (event->xclient.message_type == requestFrameExtentsAtom) { w = screen->findWindow (event->xclient.window); if (w) { DecorWindow *dw = DecorWindow::get (w); /* Set the frameExtentsRequested flag so that we know to * at least update _NET_WM_FRAME_EXTENTS (LP: #1110138) */ dw->frameExtentsRequested = true; dw->update (true); } } mCommunicator.handleClientMessage (event->xclient); break; default: /* Check for damage events. If the output or input window * or a texture is updated then damage output extents. */ if (cmActive && event->type == cScreen->damageEvent () + XDamageNotify) { XDamageNotifyEvent *de = (XDamageNotifyEvent *) event; if (frames.find (de->drawable) != frames.end ()) frames[de->drawable]->cWindow->damageOutputExtents (); foreach (DecorTexture *t, textures) { if (t->pixmap->getPixmap () == de->drawable) { foreach (CompWindow *w, screen->windows ()) { if (w->shaded () || w->mapNum ()) { DECOR_WINDOW (w); if (dw->wd && dw->wd->decor->texture == t) dw->cWindow->damageOutputExtents (); } } break; } } } break; } screen->handleEvent (event); /* If the active window changed, update the decoration, * as long as the decoration isn't animating out */ if (screen->activeWindow () != activeWindow) { w = screen->findWindow (activeWindow); if (w && !w->hasUnmapReference ()) DecorWindow::get (w)->update (true); w = screen->findWindow (screen->activeWindow ()); if (w) DecorWindow::get (w)->update (true); } switch (event->type) { case PropertyNotify: /* When the switcher atom changes we should probably * update the switcher property on this window */ if (event->xproperty.atom == decorSwitchWindowAtom) { CompWindow *w = screen->findWindow (event->xproperty.window); if (w) { DECOR_WINDOW (w); if (dw->isSwitcher && !event->xproperty.state == PropertyDelete) dw->updateSwitcher (); } } /* Decorator has created or updated a decoration for this window, * update the decoration */ else if (event->xproperty.atom == winDecorAtom) { w = screen->findWindow (event->xproperty.window); if (w) { DECOR_WINDOW (w); dw->updateDecoration (); dw->update (true); } } /* _MOTIF_WM_HINTS has been set on this window, it may not * may need to be decorated */ else if (event->xproperty.atom == Atoms::mwmHints) { w = screen->findWindow (event->xproperty.window); if (w) DecorWindow::get (w)->update (true); } else { if (event->xproperty.window == screen->root ()) { /* If the supportingDmCheckAtom changed on the root window * it could mean that the decorator changed, so we need * to update decorations */ if (event->xproperty.atom == supportingDmCheckAtom) { checkForDm (true); } else { /* A default decoration changed */ for (int i = 0; i < DECOR_NUM; i++) { if (event->xproperty.atom == decorAtom[i]) { decor[i].updateDecoration (screen->root (), decorAtom[i], &mRequestor); foreach (CompWindow *w, screen->windows ()) DecorWindow::get (w)->update (true); } } } } } break; /* Whenever a window is configured, we need to update the frame window */ case ConfigureNotify: w = screen->findTopLevelWindow (event->xconfigure.window); if (w) { DECOR_WINDOW (w); if (!w->hasUnmapReference () && dw->wd && dw->wd->decor) dw->updateFrame (); } break; case DestroyNotify: /* Only for when the client window gets destroyed */ w = screen->findTopLevelWindow (event->xproperty.window); if (w) { DECOR_WINDOW (w); if (dw->inputFrame && dw->inputFrame == event->xdestroywindow.window) { XDeleteProperty (screen->dpy (), w->id (), inputFrameAtom); dw->inputFrame = None; } else if (dw->outputFrame && dw->outputFrame == event->xdestroywindow.window) { XDeleteProperty (screen->dpy (), w->id (), outputFrameAtom); dw->outputFrame = None; } } break; /* Add new shape rects to frame region in case of a * shape notification */ default: if (screen->XShape () && event->type == screen->shapeEvent () + ShapeNotify) { w = screen->findWindow (((XShapeEvent *) event)->window); if (w) DecorWindow::get (w)->update (true); else { foreach (w, screen->windows ()) { DECOR_WINDOW (w); if (dw->inputFrame == ((XShapeEvent *) event)->window) { dw->frameRegion = CompRegion (); updateRegionWithShapeRectangles (screen->dpy (), dw->inputFrame, dw->frameRegion); w->updateFrameRegion (); } else if (dw->outputFrame == ((XShapeEvent *) event)->window) { dw->frameRegion = CompRegion (); updateRegionWithShapeRectangles (screen->dpy (), dw->outputFrame, dw->frameRegion); w->updateFrameRegion (); } } } } break; } } /* * DecorWindow::damageRect * * When this window is first presented to the user, we need to update * the decoration since it is now visible * */ bool DecorWindow::damageRect (bool initial, const CompRect &rect) { if (initial) update (true); return cWindow->damageRect (initial, rect); } /* * DecorWindow::getOutputExtents * * Extend "output extents" (eg decoration + shadows) for this * window if necessary */ void DecorWindow::getOutputExtents (CompWindowExtents& output) { window->getOutputExtents (output); if (wd) { CompWindowExtents *e = &wd->decor->output; if (e->left > output.left) output.left = e->left; if (e->right > output.right) output.right = e->right; if (e->top > output.top) output.top = e->top; if (e->bottom > output.bottom) output.bottom = e->bottom; } } /* * DecorScreen::updateDefaultShadowProperty * * Set some default shadow options on the root * window in case the default decorator doesn't * use custom shadows */ void DecorScreen::updateDefaultShadowProperty () { long data[8]; CompOption *activeColorOption = CompOption::findOption (getOptions (), "active_shadow_color"); CompOption *inactiveColorOption = CompOption::findOption (getOptions (), "inactive_shadow_color"); char *colorString[2]; XTextProperty xtp; if (!activeColorOption || !inactiveColorOption) return; colorString[0] = strdup (CompOption::colorToString (activeColorOption->value ().c ()).c_str ()); colorString[1] = strdup (CompOption::colorToString (inactiveColorOption->value ().c ()).c_str ()); /* 1) Active Shadow Radius * 2) Active Shadow Opacity * 3) Active Shadow Offset X * 4) Active Shadow Offset Y * 5) Inactive Shadow Radius * 6) Inactive Shadow Opacity * 7) Inactive Shadow Offset X * 8) Inactive Shadow Offset Y */ /* the precision is 0.0001, so multiply by 1000 */ data[0] = optionGetActiveShadowRadius () * 1000; data[1] = optionGetActiveShadowOpacity () * 1000; data[2] = optionGetActiveShadowXOffset (); data[3] = optionGetActiveShadowYOffset (); data[4] = optionGetInactiveShadowRadius () * 1000; data[5] = optionGetInactiveShadowOpacity () * 1000; data[6] = optionGetInactiveShadowXOffset (); data[7] = optionGetInactiveShadowYOffset (); XChangeProperty (screen->dpy (), screen->root (), shadowInfoAtom, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, 8); if (XStringListToTextProperty (colorString, 2, &xtp)) { XSetTextProperty (screen->dpy (), screen->root (), &xtp, shadowColorAtom); XFree (xtp.value); } free (colorString[0]); free (colorString[1]); } bool DecorScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = DecorOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case DecorOptions::Command: if (!dmWin) screen->runCommand (optionGetCommand ()); break; case DecorOptions::ShadowMatch: { CompString matchString; /* Make sure RGBA matching is always present and disable shadows for RGBA windows by default if the user didn't specify an RGBA match. Reasoning for that is that shadows are desired for some RGBA windows (e.g. rectangular windows that just happen to have an RGBA colormap), while it's absolutely undesired for others (especially shaped ones) ... by enforcing no shadows for RGBA windows by default, we are flexible to user desires while still making sure we don't show ugliness by default */ matchString = optionGetShadowMatch ().toString (); if (matchString.find ("rgba=") == CompString::npos) { CompMatch rgbaMatch ("rgba=0"); optionGetShadowMatch () &= rgbaMatch; } } /* fall-through intended */ case DecorOptions::DecorationMatch: foreach (CompWindow *w, screen->windows ()) DecorWindow::get (w)->update (true); break; case DecorOptions::ActiveShadowRadius: case DecorOptions::ActiveShadowOpacity: case DecorOptions::ActiveShadowColor: case DecorOptions::ActiveShadowXOffset: case DecorOptions::ActiveShadowYOffset: case DecorOptions::InactiveShadowRadius: case DecorOptions::InactiveShadowOpacity: case DecorOptions::InactiveShadowColor: case DecorOptions::InactiveShadowXOffset: case DecorOptions::InactiveShadowYOffset: updateDefaultShadowProperty (); break; default: break; } return rv; } /* * DecorWindow::moveNotify * * Translate window scaled quad boxes for movement * and also recompute shadow clip regions * for panels and menus */ void DecorWindow::moveNotify (int dx, int dy, bool immediate) { if (wd) { for (int i = 0; i < wd->nQuad; i++) { wd->quad[i].box.x1 += dx; wd->quad[i].box.y1 += dy; wd->quad[i].box.x2 += dx; wd->quad[i].box.y2 += dy; } } updateReg = true; updateMatrix = true; mInputRegion.translate (dx, dy); mOutputRegion.translate (dx, dy); if (dScreen->cmActive && mClipGroup) updateGroupShadows (); window->moveNotify (dx, dy, immediate); } /* * DecorWindow::resizeNotify * * Called whenever a window is resized. Update scaled quads and * recompute shadow region * */ void DecorWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { if (shading || unshading) { shading = false; unshading = false; } updateMatrix = true; updateReg = true; mInputRegion = CompRegion (window->inputRect ()); mOutputRegion = CompRegion (window->outputRect ()); if (dScreen->cmActive && mClipGroup) updateGroupShadows (); updateReg = true; window->resizeNotify (dx, dy, dwidth, dheight); } /* * DecorWindow::stateChangeNotify * * Called whenever a window state changes, we might need to use * different extents in case the decoration didn't change * */ void DecorWindow::stateChangeNotify (unsigned int lastState) { update (true); window->stateChangeNotify (lastState); } void DecorScreen::matchPropertyChanged (CompWindow *w) { DecorWindow::get (w)->update (true); screen->matchPropertyChanged (w); } /* * DecorScreen::addSupportedAtoms * * _NET_REQUEST_FRAME_EXTENTS is only supported where * a decorator is running, so add that to _NET_WM_SUPPORTED * where that is the case * */ void DecorScreen::addSupportedAtoms (std::vector &atoms) { screen->addSupportedAtoms (atoms); /* Don't support _NET_REQUEST_FRAME_EXTENTS * where there is no decorator running yet */ if (dmWin) atoms.push_back (requestFrameExtentsAtom); } void DecorWindow::updateHandlers () { if (dScreen->cmActive) { gWindow = GLWindow::get (window); cWindow = CompositeWindow::get (window); CompositeWindowInterface::setHandler (cWindow); GLWindowInterface::setHandler (gWindow); } else { CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); gWindow = NULL; cWindow = NULL; } } /* * DecorScreen::decoratorStartTimeout * * Start a decorator in case there isn't one running * */ bool DecorScreen::decoratorStartTimeout () { if (!dmWin) screen->runCommand (optionGetCommand ()); /* Update all the windows */ foreach (CompWindow *w, screen->windows ()) { DECOR_WINDOW (w); dw->updateHandlers (); dw->updateSwitcher (); if (!w->overrideRedirect () || dw->isSwitcher) dw->updateDecoration (); if (w->shaded () || w->isViewable ()) dw->update (true); } return false; } bool DecorScreen::registerPaintHandler (compiz::composite::PaintHandler *p) { cmActive = true; return cScreen->registerPaintHandler (p); } void DecorScreen::unregisterPaintHandler () { cmActive = false; return cScreen->unregisterPaintHandler (); } /* * DecorScreen::DecorScreen * * Initialize atoms, and create a * default "window type" decoration * and ensure that _NET_REQUEST_FRAME_EXTENTS * gets added to _NET_WM_SUPPORTED * */ DecorScreen::DecorScreen (CompScreen *s) : PluginClassHandler (s), cScreen (CompositeScreen::get (s)), textures (), dmWin (None), dmSupports (0), cmActive (false), windowDefault (new Decoration (WINDOW_DECORATION_TYPE_WINDOW, decor_extents_t (), decor_extents_t (), decor_extents_t (), decor_extents_t (), 0, 0, 0, 0, 0, None, boost::shared_array (static_cast (NULL)), 0, screen->root (), NULL)), mMenusClipGroup (CompMatch ("type=Dock | type=DropdownMenu | type=PopupMenu")), mRequestor (screen->dpy (), screen->root (), &(decor[DECOR_ACTIVE])), mReleasePool (new PixmapReleasePool ( boost::bind (XFreePixmap, screen->dpy (), _1))), mPendingHandler (boost::bind (&DecorScreen::findWindowRequestor, this, _1)), mUnusedHandler (boost::bind (&DecorScreen::findWindowDecorations, this, _1), mReleasePool, boost::bind (XFreePixmap, screen->dpy (), _1)), mCommunicator (XInternAtom (screen->dpy (), DECOR_PIXMAP_PENDING_ATOM_NAME, FALSE), XInternAtom (screen->dpy (), DECOR_DELETE_PIXMAP_ATOM_NAME, FALSE), boost::bind (&PendingHandler::handleMessage, &mPendingHandler, _1, _2), boost::bind (&UnusedHandler::handleMessage, &mUnusedHandler, _1, _2)) { supportingDmCheckAtom = XInternAtom (s->dpy (), DECOR_SUPPORTING_DM_CHECK_ATOM_NAME, 0); winDecorAtom = XInternAtom (s->dpy (), DECOR_WINDOW_ATOM_NAME, 0); decorAtom[DECOR_BARE] = XInternAtom (s->dpy (), DECOR_BARE_ATOM_NAME, 0); decorAtom[DECOR_ACTIVE] = XInternAtom (s->dpy (), DECOR_ACTIVE_ATOM_NAME, 0); inputFrameAtom = XInternAtom (s->dpy (), DECOR_INPUT_FRAME_ATOM_NAME, 0); outputFrameAtom = XInternAtom (s->dpy (), DECOR_OUTPUT_FRAME_ATOM_NAME, 0); decorTypeAtom = XInternAtom (s->dpy (), DECOR_TYPE_ATOM_NAME, 0); decorTypePixmapAtom = XInternAtom (s->dpy (), DECOR_TYPE_PIXMAP_ATOM_NAME, 0); decorTypeWindowAtom = XInternAtom (s->dpy (), DECOR_TYPE_WINDOW_ATOM_NAME, 0); decorSwitchWindowAtom = XInternAtom (s->dpy (), DECOR_SWITCH_WINDOW_ATOM_NAME, 0); decorPendingAtom = XInternAtom (s->dpy (), DECOR_PIXMAP_PENDING_ATOM_NAME, 0); decorRequestAtom = XInternAtom (s->dpy (), DECOR_REQUEST_PIXMAP_ATOM_NAME, 0); requestFrameExtentsAtom = XInternAtom (s->dpy (), "_NET_REQUEST_FRAME_EXTENTS", 0); shadowColorAtom = XInternAtom (s->dpy (), "_COMPIZ_NET_CM_SHADOW_COLOR", 0); shadowInfoAtom = XInternAtom (s->dpy (), "_COMPIZ_NET_CM_SHADOW_PROPERTIES", 0); cmActive = (cScreen) ? cScreen->compositingActive () && GLScreen::get (s) != NULL : false; checkForDm (false); decoratorStart.start (boost::bind (&DecorScreen::decoratorStartTimeout, this), 0); ScreenInterface::setHandler (s); CompositeScreenInterface::setHandler (cScreen); screen->updateSupportedWmHints (); } /* * DecorScreen::~DecorScreen * * Ensure that _NET_REQUEST_FRAME_EXTENTS * is cleared from _NET_WM_SUPPORTED * */ DecorScreen::~DecorScreen () { for (unsigned int i = 0; i < DECOR_NUM; i++) decor[i].clear (); screen->addSupportedAtomsSetEnabled (this, false); screen->updateSupportedWmHints (); } DecorWindow::DecorWindow (CompWindow *w) : PluginClassHandler (w), window (w), gWindow (GLWindow::get (w)), cWindow (CompositeWindow::get (w)), dScreen (DecorScreen::get (screen)), wd (NULL), inputFrame (None), outputFrame (None), pixmapFailed (false), regions (), updateReg (true), updateMatrix (true), unshading (false), shading (false), isSwitcher (false), frameExtentsRequested (false), mClipGroup (NULL), mOutputRegion (window->outputRect ()), mInputRegion (window->inputRect ()), mRequestor (screen->dpy (), w->id (), &decor), lastMaximizedStateDecorated (0) { WindowInterface::setHandler (window); /* FIXME :DecorWindow::update can call updateWindowOutputExtents * which will call a zero-diff resizeNotify. Since this window * might be part of a startup procedure, we can't assume that * all other windows in the list are necessarily safe to use * (since DecorWindow::DecorWindow might not have been called * for them) so we need to turn off resize notifications * and turn them back on once we're done updating the decoration */ window->resizeNotifySetEnabled (this, false); if (!dScreen->decoratorStart.active ()) { updateHandlers (); updateSwitcher (); if (!w->overrideRedirect () || isSwitcher) updateDecoration (); if (w->shaded () || w->isViewable ()) update (true); } window->resizeNotifySetEnabled (this, true); if (!window->invisible ()) if (dScreen->mMenusClipGroup.pushClippable (this)) updateGroupShadows (); } /* * DecorWindow::~DecorWindow * * On tear-down, we need to shift all windows * back to their original positions */ DecorWindow::~DecorWindow () { if (!window->destroyed ()) update (false); if (wd) WindowDecoration::destroy (wd); if (mClipGroup) mClipGroup->popClippable (this); decor.mList.clear (); } bool DecorPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/0000755000015301777760000000000012321344021024207 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/0000755000015301777760000000000012321344021025351 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000015100000000000011212 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/compiz_decor_pixmap_requests_mock.hcompiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/compiz_decor_pixmap_requests_mo0000644000015301777760000001027412321343002033757 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * Copyright © 2013 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_DECOR_PIXMAP_REQUESTS_MOCK_H #define _COMPIZ_DECOR_PIXMAP_REQUESTS_MOCK_H #include #include #include #include "pixmap-requests.h" class MockDecorPixmapDeletor : public PixmapDestroyQueue { public: MockDecorPixmapDeletor (); ~MockDecorPixmapDeletor (); MOCK_METHOD1 (destroyUnusedPixmap, int (Pixmap p)); }; class MockDecorPixmapReceiver : public DecorPixmapReceiverInterface { public: MockDecorPixmapReceiver (); ~MockDecorPixmapReceiver (); MOCK_METHOD0 (pending, void ()); MOCK_METHOD0 (update, void ()); }; class MockDecoration : public DecorationInterface { public: MockDecoration (); ~MockDecoration (); MOCK_METHOD0 (receiverInterface, DecorPixmapReceiverInterface & ()); MOCK_CONST_METHOD0 (getFrameType, unsigned int ()); MOCK_CONST_METHOD0 (getFrameState, unsigned int ()); MOCK_CONST_METHOD0 (getFrameActions, unsigned int ()); }; class MockDecorationListFindMatching : public DecorationListFindMatchingInterface { public: MockDecorationListFindMatching (); ~MockDecorationListFindMatching (); MOCK_CONST_METHOD3 (findMatchingDecoration, DecorationInterface::Ptr (unsigned int, unsigned int, unsigned int)); MOCK_CONST_METHOD1 (findMatchingDecoration, DecorationInterface::Ptr (Pixmap)); }; class MockDecorPixmapRequestor : public DecorPixmapRequestorInterface { public: MockDecorPixmapRequestor (); ~MockDecorPixmapRequestor (); MOCK_METHOD3 (postGenerateRequest, int (unsigned int, unsigned int, unsigned int)); MOCK_METHOD1 (handlePending, void (const long *)); }; class XlibPixmapMock { public: XlibPixmapMock (); ~XlibPixmapMock (); MOCK_METHOD1(freePixmap, int (Pixmap)); }; class MockFindRequestor { public: MockFindRequestor (); ~MockFindRequestor (); MOCK_METHOD1 (findRequestor, DecorPixmapRequestorInterface * (Window)); }; class MockFindList { public: MockFindList (); ~MockFindList (); MOCK_METHOD1 (findList, DecorationListFindMatchingInterface * (Window)); }; class MockUnusedPixmapQueue : public UnusedPixmapQueue { public: MockUnusedPixmapQueue (); ~MockUnusedPixmapQueue (); typedef boost::shared_ptr Ptr; MOCK_METHOD1 (markUnused, void (Pixmap)); }; class StubReceiver : public DecorPixmapReceiverInterface { public: void pending () {} void update () {} }; class StubDecoration : public DecorationInterface { public: DecorPixmapReceiverInterface & receiverInterface () { return mReceiver; } unsigned int getFrameType () const { return 0; } unsigned int getFrameState () const { return 0; } unsigned int getFrameActions () const { return 0; } private: StubReceiver mReceiver; }; class MockProtocolDispatchFuncs { public: MockProtocolDispatchFuncs (); ~MockProtocolDispatchFuncs (); MOCK_METHOD2 (handlePending, void (Window, const long *)); MOCK_METHOD2 (handleUnused, void (Window, Pixmap)); }; #endif compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/integration/0000755000015301777760000000000012321344021027674 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/integration/xorg-gtest/0000755000015301777760000000000012321344021031777 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000021600000000000011214 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/integration/xorg-gtest/compiz_test_decor_pixmap_protocol_integration.cppcompiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/integration/xorg-gtest/compiz_t0000644000015301777760000002661612321343002033557 0ustar pbusernogroup00000000000000/* * Compiz XOrg GTest Decoration Pixmap Protocol Integration Tests * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include "decoration.h" #include #include #include "pixmap-requests.h" #include "compiz_decor_pixmap_requests_mock.h" namespace xt = xorg::testing; namespace ct = compiz::testing; namespace cd = compiz::decor; namespace cdp = compiz::decor::protocol; using ::testing::AtLeast; using ::testing::ReturnNull; using ::testing::Return; using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::_; class DecorPixmapProtocol : public xorg::testing::Test { public: typedef boost::function ClientMessageReceiver; void SetUp (); void WaitForClientMessageOnAndDeliverTo (Window client, Atom message, const ClientMessageReceiver &receiver); protected: Atom deletePixmapMessage; Atom pendingMessage; }; namespace { bool Advance (Display *d, bool result) { return ct::AdvanceToNextEventOnSuccess (d, result); } Window MOCK_WINDOW = 1; Pixmap MOCK_PIXMAP = 2; class MockClientMessageReceiver { public: MOCK_METHOD1 (receiveMsg, void (const XClientMessageEvent &)); }; class DisplayFetch { public: virtual ~DisplayFetch () {} virtual ::Display * Display () const = 0; }; class XFreePixmapWrapper { public: XFreePixmapWrapper (const DisplayFetch &df) : mDisplayFetch (df) { } int FreePixmap (Pixmap pixmap) { return XFreePixmap (mDisplayFetch.Display (), pixmap); } private: const DisplayFetch &mDisplayFetch; }; class XErrorTracker { public: XErrorTracker (); ~XErrorTracker (); MOCK_METHOD1 (errorHandler, void (int)); private: XErrorHandler handler; static int handleXError (Display *dpy, XErrorEvent *ev); static XErrorTracker *tracker; }; XErrorTracker * XErrorTracker::tracker = NULL; XErrorTracker::XErrorTracker () { tracker = this; handler = XSetErrorHandler (handleXError); } XErrorTracker::~XErrorTracker () { tracker = NULL; XSetErrorHandler (handler); } int XErrorTracker::handleXError (Display *dpy, XErrorEvent *ev) { tracker->errorHandler (ev->error_code); return 0; } bool PixmapValid (Display *d, Pixmap p) { Window root; unsigned int width, height, border, depth; int x, y; XErrorTracker tracker; EXPECT_CALL (tracker, errorHandler (BadDrawable)).Times (AtLeast (0)); bool success = XGetGeometry (d, p, &root, &x, &y, &width, &height, &border, &depth); return success; } } void DecorPixmapProtocol::SetUp () { xorg::testing::Test::SetUp (); XSelectInput (Display (), DefaultRootWindow (Display ()), StructureNotifyMask); deletePixmapMessage = XInternAtom (Display (), DECOR_DELETE_PIXMAP_ATOM_NAME, 0); pendingMessage = XInternAtom (Display (), DECOR_PIXMAP_PENDING_ATOM_NAME, 0); } class DeliveryMatcher : public ct::XEventMatcher { public: DeliveryMatcher (Atom message, const DecorPixmapProtocol::ClientMessageReceiver &receiver) : mMessage (message), mReceiver (receiver) { } bool MatchAndExplain (const XEvent &xce, MatchResultListener *listener) const { if (xce.xclient.message_type == mMessage) { mReceiver (reinterpret_cast (xce)); return true; } else return false; } void DescribeTo (std::ostream *os) const { *os << "Message delivered"; } private: Atom mMessage; DecorPixmapProtocol::ClientMessageReceiver mReceiver; }; void DecorPixmapProtocol::WaitForClientMessageOnAndDeliverTo (Window client, Atom message, const ClientMessageReceiver &receiver) { ::Display *d = Display (); DeliveryMatcher delivery (message, receiver); ASSERT_TRUE (Advance (d, ct::WaitForEventOfTypeOnWindowMatching (d, client, ClientMessage, -1, -1, delivery))); } TEST_F (DecorPixmapProtocol, PostDeleteCausesClientMessage) { MockClientMessageReceiver receiver; ::Display *d = Display (); decor_post_delete_pixmap (d, MOCK_WINDOW, MOCK_PIXMAP); EXPECT_CALL (receiver, receiveMsg (_)).Times (1); WaitForClientMessageOnAndDeliverTo (MOCK_WINDOW, deletePixmapMessage, boost::bind (&MockClientMessageReceiver::receiveMsg, &receiver, _1)); } TEST_F (DecorPixmapProtocol, PostDeleteDispatchesClientMessageToReceiver) { MockProtocolDispatchFuncs dispatch; cdp::Communicator communicator (pendingMessage, deletePixmapMessage, boost::bind (&MockProtocolDispatchFuncs::handlePending, &dispatch, _1, _2), boost::bind (&MockProtocolDispatchFuncs::handleUnused, &dispatch, _1, _2)); decor_post_delete_pixmap (Display (), MOCK_WINDOW, MOCK_PIXMAP); EXPECT_CALL (dispatch, handleUnused (MOCK_WINDOW, MOCK_PIXMAP)).Times (1); WaitForClientMessageOnAndDeliverTo (MOCK_WINDOW, deletePixmapMessage, boost::bind (&cdp::Communicator::handleClientMessage, &communicator, _1)); } /* Test end to end. Post the delete message and cause the pixmap to be freed */ class DecorPixmapProtocolEndToEnd : public DecorPixmapProtocol, public DisplayFetch { public: DecorPixmapProtocolEndToEnd () : freePixmap (*this), releasePool (new PixmapReleasePool ( boost::bind (&XFreePixmapWrapper::FreePixmap, &freePixmap, _1))), pendingHandler (boost::bind (&MockFindRequestor::findRequestor, &mockFindRequestor, _1)), unusedHandler (boost::bind (&MockFindList::findList, &mockFindList, _1), releasePool, boost::bind (&XFreePixmapWrapper::FreePixmap, &freePixmap, _1)), stubDecoration (new StubDecoration ()) { } void SetUp () { DecorPixmapProtocol::SetUp (); communicator.reset (new cdp::Communicator ( pendingMessage, deletePixmapMessage, boost::bind (&cd::PendingHandler::handleMessage, &pendingHandler, _1, _2), boost::bind (&cd::UnusedHandler::handleMessage, &unusedHandler, _1, _2))); } ::Display * Display () const { return DecorPixmapProtocol::Display (); } XFreePixmapWrapper freePixmap; PixmapReleasePool::Ptr releasePool; cd::PendingHandler pendingHandler; cd::UnusedHandler unusedHandler; boost::shared_ptr communicator; MockFindList mockFindList; MockFindRequestor mockFindRequestor; StubDecoration::Ptr stubDecoration; MockDecorPixmapRequestor mockRequestor; MockDecorationListFindMatching mockFindMatching; }; class DecorPixmapProtocolDeleteEndToEnd : public DecorPixmapProtocolEndToEnd { public: void SetUp () { DecorPixmapProtocolEndToEnd::SetUp (); ::Display *d = Display (); pixmap = XCreatePixmap (d, DefaultRootWindow (d), 1, 1, DefaultDepth (d, DefaultScreen (d))); decor_post_delete_pixmap (d, MOCK_WINDOW, pixmap); } void TearDown () { if (PixmapValid (Display (), pixmap)) XFreePixmap (Display (), pixmap); } protected: Pixmap pixmap; }; TEST_F (DecorPixmapProtocolDeleteEndToEnd, TestFreeNotFoundWindowPixmapImmediately) { ::Display *d = Display (); EXPECT_CALL (mockFindList, findList (MOCK_WINDOW)).WillOnce (ReturnNull ()); /* Deliver it to the communicator */ WaitForClientMessageOnAndDeliverTo (MOCK_WINDOW, deletePixmapMessage, boost::bind (&cdp::Communicator::handleClientMessage, communicator.get (), _1)); /* Check if the pixmap is still valid */ EXPECT_FALSE (PixmapValid (d, pixmap)); } TEST_F (DecorPixmapProtocolDeleteEndToEnd, TestFreeUnusedPixmapImmediately) { ::Display *d = Display (); EXPECT_CALL (mockFindMatching, findMatchingDecoration (pixmap)).WillOnce (Return (DecorationInterface::Ptr ())); EXPECT_CALL (mockFindList, findList (MOCK_WINDOW)).WillOnce (Return (&mockFindMatching)); /* Deliver it to the communicator */ WaitForClientMessageOnAndDeliverTo (MOCK_WINDOW, deletePixmapMessage, boost::bind (&cdp::Communicator::handleClientMessage, communicator.get (), _1)); /* Check if the pixmap is still valid */ EXPECT_FALSE (PixmapValid (d, pixmap)); } TEST_F (DecorPixmapProtocolDeleteEndToEnd, TestQueuePixmapIfUsed) { ::Display *d = Display (); EXPECT_CALL (mockFindMatching, findMatchingDecoration (pixmap)).WillOnce (Return (stubDecoration)); EXPECT_CALL (mockFindList, findList (MOCK_WINDOW)).WillOnce (Return (&mockFindMatching)); /* Deliver it to the communicator */ WaitForClientMessageOnAndDeliverTo (MOCK_WINDOW, deletePixmapMessage, boost::bind (&cdp::Communicator::handleClientMessage, communicator.get (), _1)); /* Check if the pixmap is still valid */ EXPECT_TRUE (PixmapValid (d, pixmap)); /* Call destroyUnusedPixmap on the release pool, it should release * the pixmap which was otherwise unused */ releasePool->destroyUnusedPixmap (pixmap); /* Pixmap should now be invalid */ EXPECT_FALSE (PixmapValid (d, pixmap)); } class DecorPixmapProtocolPendingEndToEnd : public DecorPixmapProtocolEndToEnd { public: DecorPixmapProtocolPendingEndToEnd () : frameType (1), frameState (2), frameActions (3) { } void SetUp () { DecorPixmapProtocolEndToEnd::SetUp (); ::Display *d = Display (); decor_post_pending (d, MOCK_WINDOW, frameType, frameState, frameActions); } protected: unsigned int frameType, frameState, frameActions; }; MATCHER_P3 (MatchArrayValues3, v1, v2, v3, "Matches three array values") { return static_cast (arg[0]) == v1 && static_cast (arg[1]) == v2 && static_cast (arg[2]) == v3; } TEST_F (DecorPixmapProtocolPendingEndToEnd, TestPostPendingMarksAsPendingOnClient) { EXPECT_CALL (mockFindRequestor, findRequestor (MOCK_WINDOW)).WillOnce (Return (&mockRequestor)); EXPECT_CALL (mockRequestor, handlePending (MatchArrayValues3 (frameType, frameState, frameActions))); /* Deliver it to the communicator */ WaitForClientMessageOnAndDeliverTo (MOCK_WINDOW, pendingMessage, boost::bind (&cdp::Communicator::handleClientMessage, communicator.get (), _1)); } ././@LongLink0000000000000000000000000000015300000000000011214 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/integration/xorg-gtest/CMakeLists.txtcompiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/integration/xorg-gtest/CMakeLis0000644000015301777760000000305712321343002033355 0ustar pbusernogroup00000000000000include (FindPkgConfig) if (BUILD_XORG_GTEST) include_directories (${compiz_SOURCE_DIR}/tests/shared ${COMPIZ_XORG_SYSTEM_TEST_INCLUDE_DIR} ${X11_INCLUDE_DIRS} ${XORG_SERVER_INCLUDE_XORG_GTEST} ${XORG_SERVER_GTEST_SRC} ${GTEST_INCLUDE_DIRS} ${COMPIZ_DECOR_PIXMAP_PROTOCOL_INTEGRATION_INCLUDE_DIRS}) link_directories (${X11_XI_LIBRARY_DIRS} ${COMPIZ_COMPOSITE_DAMAGETRACKING_INTEGRATION_LIBRARY_DIRS}) add_executable (compiz_test_decor_pixmap_protocol_integration ${CMAKE_CURRENT_SOURCE_DIR}/compiz_test_decor_pixmap_protocol_integration.cpp) set (COMPIZ_DECOR_PIXMAP_PROTOCOL_XORG_INTEGRATION_TEST_LIBRARIES xorg_gtest_all compiz_xorg_gtest_main compiz_xorg_gtest_system_test compiz_decor_pixmap_requests compiz_decor_pixmap_requests_mock decoration ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_LIBRARIES} ${X11_XI_LIBRARIES} ${COMPIZ_DECOR_PIXMAP_PROTOCOL_INTEGRATION_LIBRARIES}) target_link_libraries (compiz_test_decor_pixmap_protocol_integration ${COMPIZ_DECOR_PIXMAP_PROTOCOL_XORG_INTEGRATION_TEST_LIBRARIES}) compiz_discover_tests (compiz_test_decor_pixmap_protocol_integration WITH_XORG_GTEST COVERAGE compiz_decor_pixmap_requests) endif (BUILD_XORG_GTEST) compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/integration/CMakeLists.txt0000644000015301777760000000003612321343002032431 0ustar pbusernogroup00000000000000add_subdirectory (xorg-gtest) compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/pixmap-requests/0000755000015301777760000000000012321344021030520 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/pixmap-requests/src/0000755000015301777760000000000012321344021031307 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000015300000000000011214 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/compiz_decor_pixmap_requests_mock.cppcompiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/compiz_decor_pixmap_requests_mo0000644000015301777760000000514612321343002033761 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * Copyright © 2013 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "compiz_decor_pixmap_requests_mock.h" /* These exist purely because the implicit details of the * constructors of the MOCK_METHODs are quite complex. We can * save compilation time by generating those constructors once, * and linking, rather than generating multiple definitions and * having the linker eliminate them */ MockDecorPixmapDeletor::MockDecorPixmapDeletor () { } MockDecorPixmapDeletor::~MockDecorPixmapDeletor () { } MockDecorPixmapReceiver::MockDecorPixmapReceiver () { } MockDecorPixmapReceiver::~MockDecorPixmapReceiver () { } MockDecoration::MockDecoration () { } MockDecoration::~MockDecoration () { } MockDecorationListFindMatching::MockDecorationListFindMatching () { } MockDecorationListFindMatching::~MockDecorationListFindMatching () { } MockDecorPixmapRequestor::MockDecorPixmapRequestor () { } MockDecorPixmapRequestor::~MockDecorPixmapRequestor () { } XlibPixmapMock::XlibPixmapMock () { } XlibPixmapMock::~XlibPixmapMock () { } MockFindRequestor::MockFindRequestor () { } MockFindRequestor::~MockFindRequestor () { } MockFindList::MockFindList () { } MockFindList::~MockFindList () { } MockUnusedPixmapQueue::MockUnusedPixmapQueue () { } MockUnusedPixmapQueue::~MockUnusedPixmapQueue () { } MockProtocolDispatchFuncs::MockProtocolDispatchFuncs () { } MockProtocolDispatchFuncs::~MockProtocolDispatchFuncs () { } compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/test-decor-pixmap-requests.cpp0000644000015301777760000002705512321343002033302 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include #include #include "pixmap-requests.h" #include "compiz_decor_pixmap_requests_mock.h" using ::testing::AtLeast; using ::testing::Pointee; using ::testing::Return; using ::testing::ReturnNull; using ::testing::IsNull; using ::testing::_; namespace cd = compiz::decor; namespace cdp = compiz::decor::protocol; TEST(DecorPixmapRequestsTest, TestDestroyPixmapDeletes) { boost::shared_ptr mockDeletor = boost::make_shared (); DecorPixmap pm (1, mockDeletor); EXPECT_CALL (*(mockDeletor.get ()), destroyUnusedPixmap (1)).WillOnce (Return (1)); } TEST(DecorPixmapRequestsTest, TestPendingGeneratesRequest) { MockDecorPixmapRequestor mockRequestor; MockDecoration mockDecoration; X11DecorPixmapReceiver receiver (&mockRequestor, &mockDecoration); EXPECT_CALL (mockDecoration, getFrameActions ()).WillOnce (Return (3)); EXPECT_CALL (mockDecoration, getFrameState ()).WillOnce (Return (2)); EXPECT_CALL (mockDecoration, getFrameType ()).WillOnce (Return (1)); EXPECT_CALL (mockRequestor, postGenerateRequest (1, 2, 3)); receiver.pending (); } TEST(DecorPixmapRequestsTest, TestPendingGeneratesOnlyOneRequest) { MockDecorPixmapRequestor mockRequestor; MockDecoration mockDecoration; X11DecorPixmapReceiver receiver (&mockRequestor, &mockDecoration); EXPECT_CALL (mockDecoration, getFrameActions ()).WillOnce (Return (3)); EXPECT_CALL (mockDecoration, getFrameState ()).WillOnce (Return (2)); EXPECT_CALL (mockDecoration, getFrameType ()).WillOnce (Return (1)); EXPECT_CALL (mockRequestor, postGenerateRequest (1, 2, 3)); receiver.pending (); receiver.pending (); } TEST(DecorPixmapRequestsTest, TestUpdateGeneratesRequestIfNewOnePending) { MockDecorPixmapRequestor mockRequestor; MockDecoration mockDecoration; X11DecorPixmapReceiver receiver (&mockRequestor, &mockDecoration); EXPECT_CALL (mockDecoration, getFrameActions ()).WillOnce (Return (3)); EXPECT_CALL (mockDecoration, getFrameState ()).WillOnce (Return (2)); EXPECT_CALL (mockDecoration, getFrameType ()).WillOnce (Return (1)); EXPECT_CALL (mockRequestor, postGenerateRequest (1, 2, 3)); receiver.pending (); receiver.pending (); EXPECT_CALL (mockDecoration, getFrameActions ()).WillOnce (Return (3)); EXPECT_CALL (mockDecoration, getFrameState ()).WillOnce (Return (2)); EXPECT_CALL (mockDecoration, getFrameType ()).WillOnce (Return (1)); EXPECT_CALL (mockRequestor, postGenerateRequest (1, 2, 3)); receiver.update (); } TEST(DecorPixmapRequestsTest, TestUpdateGeneratesNoRequestIfNoNewOnePending) { MockDecorPixmapRequestor mockRequestor; MockDecoration mockDecoration; X11DecorPixmapReceiver receiver (&mockRequestor, &mockDecoration); EXPECT_CALL (mockDecoration, getFrameActions ()).WillOnce (Return (3)); EXPECT_CALL (mockDecoration, getFrameState ()).WillOnce (Return (2)); EXPECT_CALL (mockDecoration, getFrameType ()).WillOnce (Return (1)); EXPECT_CALL (mockRequestor, postGenerateRequest (1, 2, 3)); receiver.pending (); receiver.update (); } class DecorPixmapReleasePool : public ::testing::Test { public: DecorPixmapReleasePool () : mockFreeFunc (boost::bind (&XlibPixmapMock::freePixmap, &xlibPixmapMock, _1)), releasePool (mockFreeFunc) { } XlibPixmapMock xlibPixmapMock; PixmapReleasePool::FreePixmapFunc mockFreeFunc; PixmapReleasePool releasePool; }; TEST_F (DecorPixmapReleasePool, MarkUnusedNoFree) { /* Never free pixmaps on markUnused */ EXPECT_CALL (xlibPixmapMock, freePixmap (_)).Times (0); releasePool.markUnused (static_cast (1)); } TEST_F (DecorPixmapReleasePool, NoFreeOnPostDeleteIfNotInList) { EXPECT_CALL (xlibPixmapMock, freePixmap (_)).Times (0); releasePool.destroyUnusedPixmap (static_cast (1)); } TEST_F (DecorPixmapReleasePool, FreeOnPostDeleteIfMarkedUnused) { EXPECT_CALL (xlibPixmapMock, freePixmap (1)).Times (1); releasePool.markUnused (static_cast (1)); releasePool.destroyUnusedPixmap (static_cast (1)); } TEST_F (DecorPixmapReleasePool, FreeOnPostDeleteIfMarkedUnusedOnceOnly) { EXPECT_CALL (xlibPixmapMock, freePixmap (1)).Times (1); releasePool.markUnused (static_cast (1)); releasePool.destroyUnusedPixmap (static_cast (1)); releasePool.destroyUnusedPixmap (static_cast (1)); } TEST_F (DecorPixmapReleasePool, UnusedUniqueness) { EXPECT_CALL (xlibPixmapMock, freePixmap (1)).Times (1); releasePool.markUnused (static_cast (1)); releasePool.markUnused (static_cast (1)); releasePool.destroyUnusedPixmap (static_cast (1)); releasePool.destroyUnusedPixmap (static_cast (1)); } class DecorPendingMessageHandler : public ::testing::Test { public: DecorPendingMessageHandler () : pendingHandler (boost::bind (&MockFindRequestor::findRequestor, &mockRequestorFind, _1)) { } MockFindRequestor mockRequestorFind; MockDecorPixmapRequestor mockRequestor; cd::PendingHandler pendingHandler; }; namespace { Window mockWindow = 1; } TEST_F (DecorPendingMessageHandler, NoPendingIfNotFound) { EXPECT_CALL (mockRequestor, handlePending (_)).Times (0); EXPECT_CALL (mockRequestorFind, findRequestor (mockWindow)).WillOnce (ReturnNull ()); long data = 1; pendingHandler.handleMessage (mockWindow, &data); } TEST_F (DecorPendingMessageHandler, PendingIfFound) { long data = 1; EXPECT_CALL (mockRequestor, handlePending (Pointee (data))); EXPECT_CALL (mockRequestorFind, findRequestor (mockWindow)).WillOnce (Return (&mockRequestor)); pendingHandler.handleMessage (mockWindow, &data); } class DecorUnusedMessageHandler : public ::testing::Test { public: DecorUnusedMessageHandler () : mockUnusedPixmapQueue (new MockUnusedPixmapQueue ()), unusedHandler (boost::bind (&MockFindList::findList, &mockListFind, _1), mockUnusedPixmapQueue, boost::bind (&XlibPixmapMock::freePixmap, &xlibPixmapMock, _1)) { } MockFindList mockListFind; MockDecorationListFindMatching mockListFinder; MockUnusedPixmapQueue::Ptr mockUnusedPixmapQueue; XlibPixmapMock xlibPixmapMock; cd::UnusedHandler unusedHandler; }; namespace { Pixmap mockPixmap = 2; } TEST_F (DecorUnusedMessageHandler, FreeImmediatelyWindowNotFound) { /* Don't verify calls to mockListFind */ EXPECT_CALL (mockListFind, findList (_)).Times (AtLeast (0)); /* Just free the pixmap immediately if no window was found */ EXPECT_CALL (xlibPixmapMock, freePixmap (mockPixmap)).Times (1); ON_CALL (mockListFind, findList (mockWindow)).WillByDefault (ReturnNull ()); unusedHandler.handleMessage (mockWindow, mockPixmap); } TEST_F (DecorUnusedMessageHandler, FreeImmediatelyIfNoDecorationFound) { /* Don't verify calls to mockListFind or mockListFinder */ EXPECT_CALL (mockListFind, findList (_)).Times (AtLeast (0)); EXPECT_CALL (mockListFinder, findMatchingDecoration (_)).Times (AtLeast (0)); EXPECT_CALL (xlibPixmapMock, freePixmap (mockPixmap)).Times (1); ON_CALL (mockListFind, findList (mockWindow)) .WillByDefault (Return (&mockListFinder)); ON_CALL (mockListFinder, findMatchingDecoration (mockPixmap)) .WillByDefault (Return (DecorationInterface::Ptr ())); unusedHandler.handleMessage (mockWindow, mockPixmap); } TEST_F (DecorUnusedMessageHandler, AddToQueueIfInUse) { /* Don't verify calls to mockListFind or mockListFinder */ EXPECT_CALL (mockListFind, findList (_)).Times (AtLeast (0)); EXPECT_CALL (mockListFinder, findMatchingDecoration (_)).Times (AtLeast (0)); DecorationInterface::Ptr mockDecoration (new StubDecoration ()); /* Do not immediately free the pixmap */ EXPECT_CALL (xlibPixmapMock, freePixmap (mockPixmap)).Times (0); EXPECT_CALL (*mockUnusedPixmapQueue, markUnused (mockPixmap)).Times (1); ON_CALL (mockListFind, findList (mockWindow)) .WillByDefault (Return (&mockListFinder)); ON_CALL (mockListFinder, findMatchingDecoration (mockPixmap)) .WillByDefault (Return (mockDecoration)); unusedHandler.handleMessage (mockWindow, mockPixmap); } namespace { Atom pendingMsg = 3; Atom unusedMsg = 4; } class DecorProtocolCommunicator : public ::testing::Test { public: DecorProtocolCommunicator () : handlePendingFunc (boost::bind (&MockProtocolDispatchFuncs::handlePending, &mockProtoDispatch, _1, _2)), handleUnusedFunc (boost::bind (&MockProtocolDispatchFuncs::handleUnused, &mockProtoDispatch, _1, _2)), protocolCommunicator (pendingMsg, unusedMsg, handlePendingFunc, handleUnusedFunc) { } void ClientMessageData (XClientMessageEvent &msg, Window window, Atom atom, long l1, long l2, long l3, long l4) { msg.window = window; msg.message_type = atom; msg.data.l[0] = l1; msg.data.l[1] = l2; msg.data.l[2] = l3; msg.data.l[3] = l4; } MockProtocolDispatchFuncs mockProtoDispatch; cdp::PendingMessage handlePendingFunc; cdp::PixmapUnusedMessage handleUnusedFunc; cdp::Communicator protocolCommunicator; }; MATCHER_P (MatchArray3, v, "Contains values") { return arg[0] == v[0] && arg[1] == v[1] && arg[2] == v[2]; } TEST_F (DecorProtocolCommunicator, TestDispatchToPendingHandler) { long data[3]; data[0] = 1; data[1] = 2; data[2] = 3; XClientMessageEvent ev; ClientMessageData (ev, mockWindow, pendingMsg, data[0], data[1], data[2], 0); EXPECT_CALL (mockProtoDispatch, handlePending (mockWindow, MatchArray3 (data))) .Times (1); protocolCommunicator.handleClientMessage (ev); } TEST_F (DecorProtocolCommunicator, TestDispatchToUnusedHandler) { XClientMessageEvent ev; ClientMessageData (ev, mockWindow, unusedMsg, mockPixmap, 0, 0, 0); EXPECT_CALL (mockProtoDispatch, handleUnused (mockWindow, mockPixmap)) .Times (1); protocolCommunicator.handleClientMessage (ev); } compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/tests/CMakeLists.txt0000644000015301777760000000147512321343002030116 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_decor_pixmap_requests_mock STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compiz_decor_pixmap_requests_mock.cpp) target_link_libraries (compiz_decor_pixmap_requests_mock compiz_decor_pixmap_requests) add_executable (compiz_test_decor_pixmap_requests ${CMAKE_CURRENT_SOURCE_DIR}/test-decor-pixmap-requests.cpp) target_link_libraries (compiz_test_decor_pixmap_requests compiz_decor_pixmap_requests compiz_decor_pixmap_requests_mock decoration ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_decor_pixmap_requests COVERAGE compiz_decor_pixmap_requests) add_subdirectory (integration) compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/CMakeLists.txt0000644000015301777760000000216212321343002026746 0ustar pbusernogroup00000000000000pkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry-saver/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/pixmap-requests.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/pixmap-requests.cpp ) ADD_LIBRARY( compiz_decor_pixmap_requests STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_decor_pixmap_requests PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) TARGET_LINK_LIBRARIES( compiz_decor_pixmap_requests compiz_core ${GLIBMM_LIBRARIES} ) compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/src/0000755000015301777760000000000012321344021024776 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/src/pixmap-requests.cpp0000644000015301777760000001131112321343002030644 0ustar pbusernogroup00000000000000#include "pixmap-requests.h" #include #include #ifndef foreach #define foreach BOOST_FOREACH #endif namespace cd = compiz::decor; namespace cdp = compiz::decor::protocol; DecorPixmap::DecorPixmap (Pixmap pixmap, PixmapDestroyQueue::Ptr d) : mPixmap (pixmap), mDeletor (d) { } DecorPixmap::~DecorPixmap () { mDeletor->destroyUnusedPixmap (mPixmap); } Pixmap DecorPixmap::getPixmap () { return mPixmap; } X11DecorPixmapReceiver::X11DecorPixmapReceiver (DecorPixmapRequestorInterface *requestor, DecorationInterface *decor) : mUpdateState (0), mDecorPixmapRequestor (requestor), mDecoration (decor) { } void X11DecorPixmapReceiver::pending () { if (mUpdateState & X11DecorPixmapReceiver::UpdateRequested) mUpdateState |= X11DecorPixmapReceiver::UpdatesPending; else { mUpdateState |= X11DecorPixmapReceiver::UpdateRequested; mDecorPixmapRequestor->postGenerateRequest (mDecoration->getFrameType (), mDecoration->getFrameState (), mDecoration->getFrameActions ()); } } void X11DecorPixmapReceiver::update () { if (mUpdateState & X11DecorPixmapReceiver::UpdatesPending) mDecorPixmapRequestor->postGenerateRequest (mDecoration->getFrameType (), mDecoration->getFrameState (), mDecoration->getFrameActions ()); mUpdateState = 0; } X11DecorPixmapRequestor::X11DecorPixmapRequestor (Display *dpy, Window window, DecorationListFindMatchingInterface *listFinder) : mDpy (dpy), mWindow (window), mListFinder (listFinder) { } int X11DecorPixmapRequestor::postGenerateRequest (unsigned int frameType, unsigned int frameState, unsigned int frameActions) { return decor_post_generate_request (mDpy, mWindow, frameType, frameState, frameActions); } void X11DecorPixmapRequestor::handlePending (const long *data) { DecorationInterface::Ptr d = mListFinder->findMatchingDecoration (static_cast (data[0]), static_cast (data[1]), static_cast (data[2])); if (d) d->receiverInterface ().pending (); else postGenerateRequest (static_cast (data[0]), static_cast (data[1]), static_cast (data[2])); } namespace { typedef PixmapReleasePool::FreePixmapFunc FreePixmapFunc; } PixmapReleasePool::PixmapReleasePool (const FreePixmapFunc &freePixmap) : mFreePixmap (freePixmap) { } void PixmapReleasePool::markUnused (Pixmap pixmap) { mPendingUnusedNotificationPixmaps.push_back (pixmap); mPendingUnusedNotificationPixmaps.unique (); } int PixmapReleasePool::destroyUnusedPixmap (Pixmap pixmap) { std::list ::iterator it = std::find (mPendingUnusedNotificationPixmaps.begin (), mPendingUnusedNotificationPixmaps.end (), pixmap); if (it != mPendingUnusedNotificationPixmaps.end ()) { Pixmap pixmap (*it); mPendingUnusedNotificationPixmaps.erase (it); mFreePixmap (pixmap); } return 0; } cd::PendingHandler::PendingHandler (const cd::RequestorForWindow &requestorForWindow) : mRequestorForWindow (requestorForWindow) { } void cd::PendingHandler::handleMessage (Window window, const long *data) { DecorPixmapRequestorInterface *requestor = mRequestorForWindow (window); if (requestor) requestor->handlePending (data); } cd::UnusedHandler::UnusedHandler (const cd::DecorListForWindow &listForWindow, const UnusedPixmapQueue::Ptr &queue, const FreePixmapFunc &freePixmap) : mListForWindow (listForWindow), mQueue (queue), mFreePixmap (freePixmap) { } void cd::UnusedHandler::handleMessage (Window window, Pixmap pixmap) { DecorationListFindMatchingInterface *findMatching = mListForWindow (window); if (findMatching) { DecorationInterface::Ptr decoration (findMatching->findMatchingDecoration (pixmap)); if (decoration) { mQueue->markUnused (pixmap); return; } } /* If a decoration was not found, then this pixmap is no longer in use * and we should free it */ mFreePixmap (pixmap); } cdp::Communicator::Communicator (Atom pendingMsg, Atom unusedMsg, const cdp::PendingMessage &pending, const cdp::PixmapUnusedMessage &pixmapUnused) : mPendingMsgAtom (pendingMsg), mUnusedMsgAtom (unusedMsg), mPendingHandler (pending), mPixmapUnusedHander (pixmapUnused) { } void cdp::Communicator::handleClientMessage (const XClientMessageEvent &xce) { if (xce.message_type == mPendingMsgAtom) mPendingHandler (xce.window, xce.data.l); else if (xce.message_type == mUnusedMsgAtom) mPixmapUnusedHander (xce.window, xce.data.l[0]); } compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/include/0000755000015301777760000000000012321344021025632 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/pixmap-requests/include/pixmap-requests.h0000644000015301777760000001461312321343002031155 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_DECOR_PIXMAP_REQUESTS_H #define _COMPIZ_DECOR_PIXMAP_REQUESTS_H #include #include #include #include #include #include #include #include class DecorPixmapInterface : boost::noncopyable { public: typedef boost::shared_ptr Ptr; virtual ~DecorPixmapInterface () {}; virtual Pixmap getPixmap () = 0; }; class DecorPixmapReceiverInterface : boost::noncopyable { public: virtual ~DecorPixmapReceiverInterface () {} virtual void pending () = 0; virtual void update () = 0; }; /* So far, nothing particularly interesting here * we just need a way to pass around pointers for * testing */ class DecorationInterface : boost::noncopyable { public: typedef boost::shared_ptr Ptr; virtual ~DecorationInterface () {} virtual DecorPixmapReceiverInterface & receiverInterface () = 0; virtual unsigned int getFrameType () const = 0; virtual unsigned int getFrameState () const = 0; virtual unsigned int getFrameActions () const = 0; }; class PixmapDestroyQueue : boost::noncopyable { public: typedef boost::shared_ptr Ptr; virtual ~PixmapDestroyQueue () {} virtual int destroyUnusedPixmap (Pixmap pixmap) = 0; }; class UnusedPixmapQueue : boost::noncopyable { public: typedef boost::shared_ptr Ptr; virtual ~UnusedPixmapQueue () {} virtual void markUnused (Pixmap pixmap) = 0; }; class PixmapReleasePool : public PixmapDestroyQueue, public UnusedPixmapQueue { public: typedef boost::function FreePixmapFunc; typedef boost::shared_ptr Ptr; PixmapReleasePool (const FreePixmapFunc &freePixmap); void markUnused (Pixmap pixmap); int destroyUnusedPixmap (Pixmap pixmap); private: std::list mPendingUnusedNotificationPixmaps; FreePixmapFunc mFreePixmap; }; class DecorPixmap : public DecorPixmapInterface { public: typedef boost::shared_ptr Ptr; DecorPixmap (Pixmap p, PixmapDestroyQueue::Ptr deletor); ~DecorPixmap (); Pixmap getPixmap (); private: Pixmap mPixmap; PixmapDestroyQueue::Ptr mDeletor; }; class DecorPixmapRequestorInterface : boost::noncopyable { public: virtual ~DecorPixmapRequestorInterface () {} virtual int postGenerateRequest (unsigned int frameType, unsigned int frameState, unsigned int frameActions) = 0; virtual void handlePending (const long *data) = 0; }; class DecorationListFindMatchingInterface { public: virtual ~DecorationListFindMatchingInterface () {} virtual DecorationInterface::Ptr findMatchingDecoration (unsigned int frameType, unsigned int frameState, unsigned int frameActions) const = 0; virtual DecorationInterface::Ptr findMatchingDecoration (Pixmap pixmap) const = 0; }; namespace compiz { namespace decor { typedef boost::function DecorListForWindow; typedef boost::function RequestorForWindow; class PendingHandler : virtual boost::noncopyable { public: PendingHandler (const RequestorForWindow &); void handleMessage (Window window, const long *data); private: RequestorForWindow mRequestorForWindow; }; class UnusedHandler : virtual boost::noncopyable { public: UnusedHandler (const DecorListForWindow &, const UnusedPixmapQueue::Ptr &, const PixmapReleasePool::FreePixmapFunc &); void handleMessage (Window, Pixmap); private: DecorListForWindow mListForWindow; UnusedPixmapQueue::Ptr mQueue; PixmapReleasePool::FreePixmapFunc mFreePixmap; }; namespace protocol { typedef boost::function PendingMessage; typedef boost::function PixmapUnusedMessage; class Communicator : virtual boost::noncopyable { public: Communicator (Atom pendingMsg, Atom unusedMsg, const PendingMessage &, const PixmapUnusedMessage &); void handleClientMessage (const XClientMessageEvent &); private: Atom mPendingMsgAtom; Atom mUnusedMsgAtom; PendingMessage mPendingHandler; PixmapUnusedMessage mPixmapUnusedHander; }; } } } class X11DecorPixmapRequestor : public DecorPixmapRequestorInterface { public: X11DecorPixmapRequestor (Display *dpy, Window xid, DecorationListFindMatchingInterface *listFinder); int postGenerateRequest (unsigned int frameType, unsigned int frameState, unsigned int frameActions); void handlePending (const long *data); private: Display *mDpy; Window mWindow; DecorationListFindMatchingInterface *mListFinder; }; class X11DecorPixmapReceiver : public DecorPixmapReceiverInterface { public: static const unsigned int UpdateRequested = 1 << 0; static const unsigned int UpdatesPending = 1 << 1; X11DecorPixmapReceiver (DecorPixmapRequestorInterface *, DecorationInterface *decor); void pending (); void update (); private: unsigned int mUpdateState; DecorPixmapRequestorInterface *mDecorPixmapRequestor; DecorationInterface *mDecoration; }; #endif compiz-0.9.11+14.04.20140409/plugins/decor/src/clip-groups/0000755000015301777760000000000012321344021023304 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/clip-groups/tests/0000755000015301777760000000000012321344021024446 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/clip-groups/tests/clip-groups/0000755000015301777760000000000012321344021026712 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/clip-groups/tests/clip-groups/src/0000755000015301777760000000000012321344021027501 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000015400000000000011215 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/clip-groups/tests/clip-groups/src/test-decor-clip-groups.cppcompiz-0.9.11+14.04.20140409/plugins/decor/src/clip-groups/tests/clip-groups/src/test-decor-clip-gro0000644000015301777760000002574312321343002033220 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include "clip-groups.h" using ::testing::Invoke; using ::testing::_; using ::testing::StrictMock; using namespace compiz::decor; class CompDecorClipGroupsTest : public ::testing::Test { }; class FakeDecorClippable : public DecorClippableInterface { public: FakeDecorClippable (const CompRegion &inputRegion, const CompRegion &outputRegion, DecorClippableInterface *parent, bool matches) : mInputRegion (inputRegion), mOutputRegion (outputRegion), mParent (parent), mOwner (NULL), mMatches (matches) { } ~FakeDecorClippable () { if (mOwner) mOwner->popClippable (mParent); } const CompRegion & getShadowRegion () { return mShadowRegion; } private: void doUpdateShadow (const CompRegion &r) { mShadowRegion = mOutputRegion.intersected (r - mInputRegion); } void doSetOwner (DecorClipGroupInterface *i) { mOwner = i; } bool doMatches (const CompMatch &m) { return mMatches; } const CompRegion & getOutputRegion () { return mOutputRegion; } const CompRegion & getInputRegion () { return mInputRegion; } void doUpdateGroupShadows () { if (mOwner) mOwner->updateAllShadows (); } CompRegion mInputRegion; CompRegion mOutputRegion; CompRegion mShadowRegion; DecorClippableInterface *mParent; DecorClipGroupInterface *mOwner; bool mMatches; }; class MockDecorClippable : public DecorClippableInterface { public: MOCK_METHOD1 (doUpdateShadow, void (const CompRegion &)); MOCK_METHOD1 (doSetOwner, void (DecorClipGroupInterface *)); MOCK_METHOD1 (doMatches, bool (const CompMatch &)); MOCK_METHOD0 (getOutputRegion, const CompRegion & ()); MOCK_METHOD0 (getInputRegion, const CompRegion & ()); MOCK_METHOD0 (doUpdateGroupShadows, void ()); void Delegate (DecorClippableInterface &other) { ON_CALL (*this, doUpdateShadow (_)).WillByDefault (Invoke (&other, &DecorClippableInterface::updateShadow)); ON_CALL (*this, doSetOwner (_)).WillByDefault (Invoke (&other, &DecorClippableInterface::setOwner)); ON_CALL (*this, doMatches (_)).WillByDefault (Invoke (&other, &DecorClippableInterface::matches)); ON_CALL (*this, getOutputRegion ()).WillByDefault (Invoke (&other, &DecorClippableInterface::outputRegion)); ON_CALL (*this, getInputRegion ()).WillByDefault (Invoke (&other, &DecorClippableInterface::inputRegion)); ON_CALL (*this, doUpdateGroupShadows ()).WillByDefault (Invoke (&other, &DecorClippableInterface::updateGroupShadows)); } }; void PrintTo(const CompRegion ®, ::std::ostream *os) { const CompRect &br = reg.boundingRect (); *os << "Bounding Rect " << br.x () << " " << br.y () << " " << br.width () << " " << br.height () << std::endl; const CompRect::vector &rv = reg.rects (); for (CompRect::vector::const_iterator it = rv.begin (); it != rv.end (); ++it) { const CompRect &r = *it; *os << " - Rect : " << r.x () << " " << r.y () << " " << r.width () << " " << r.height () << std::endl; } } TEST_F(CompDecorClipGroupsTest, TestPushClippable) { impl::GenericDecorClipGroup cg; StrictMock mdc; FakeDecorClippable fdc (CompRegion (50, 50, 100, 100), CompRegion (0, 0, 100, 100), &mdc, true); mdc.Delegate (fdc); EXPECT_CALL (mdc, getInputRegion ()); EXPECT_CALL (mdc, doSetOwner (_)).Times (2); EXPECT_CALL (mdc, doUpdateShadow (_)); cg.pushClippable (&mdc); } TEST_F(CompDecorClipGroupsTest, TestPushClippableUpdatesRegion) { impl::GenericDecorClipGroup cg; StrictMock mdc; FakeDecorClippable fdc (CompRegion (50, 50, 100, 100), CompRegion (0, 0, 100, 100), &mdc, true); mdc.Delegate (fdc); EXPECT_CALL (mdc, getInputRegion ()).Times (2); EXPECT_CALL (mdc, doSetOwner (_)).Times (2); EXPECT_CALL (mdc, doUpdateShadow (_)); cg.pushClippable (&mdc); EXPECT_EQ (cg.clipRegion (), mdc.inputRegion ()); } MATCHER_P (CompRegionEq, other, "") { return (arg ^ other).isEmpty (); } TEST_F(CompDecorClipGroupsTest, TestPush2ClippableUpdatesRegion) { impl::GenericDecorClipGroup cg; StrictMock mdc; FakeDecorClippable fdc (CompRegion (50, 50, 100, 100), CompRegion (0, 0, 100, 100), &mdc, true); mdc.Delegate (fdc); StrictMock mdc2; FakeDecorClippable fdc2 (CompRegion (250, 250, 100, 100), CompRegion (200, 200, 100, 100), &mdc2, true); mdc2.Delegate (fdc2); EXPECT_CALL (mdc, getInputRegion ()).Times (4); EXPECT_CALL (mdc, doSetOwner (&cg)); EXPECT_CALL (mdc, doSetOwner (NULL)); EXPECT_CALL (mdc, doUpdateShadow (_)).Times (1); EXPECT_CALL (mdc2, getInputRegion ()).Times (2); EXPECT_CALL (mdc2, doSetOwner (&cg)); EXPECT_CALL (mdc2, doSetOwner (NULL)); EXPECT_CALL (mdc2, doUpdateShadow (_)).Times (1); cg.pushClippable (&mdc); cg.pushClippable (&mdc2); CompRegion accumulated; accumulated += mdc.inputRegion (); accumulated += mdc2.inputRegion (); EXPECT_THAT (cg.clipRegion (), CompRegionEq (accumulated)); } TEST_F(CompDecorClipGroupsTest, TestPush3ClippableUpdatesRegion) { impl::GenericDecorClipGroup cg; StrictMock mdc; FakeDecorClippable fdc (CompRegion (50, 50, 100, 100), CompRegion (0, 0, 100, 100), &mdc, true); mdc.Delegate (fdc); StrictMock mdc2; FakeDecorClippable fdc2 (CompRegion (150, 150, 100, 100), CompRegion (100, 100, 100, 100), &mdc2, true); mdc2.Delegate (fdc2); StrictMock mdc3; FakeDecorClippable fdc3 (CompRegion (250, 250, 100, 100), CompRegion (200, 200, 100, 100), &mdc3, true); mdc3.Delegate (fdc3); EXPECT_CALL (mdc, getInputRegion ()).Times (6); EXPECT_CALL (mdc, doSetOwner (&cg)); EXPECT_CALL (mdc, doSetOwner (NULL)); EXPECT_CALL (mdc, doUpdateShadow (_)).Times (1); EXPECT_CALL (mdc2, getInputRegion ()).Times (4); EXPECT_CALL (mdc2, doSetOwner (&cg)); EXPECT_CALL (mdc2, doSetOwner (NULL)); EXPECT_CALL (mdc2, doUpdateShadow (_)).Times (1); EXPECT_CALL (mdc3, getInputRegion ()).Times (2); EXPECT_CALL (mdc3, doSetOwner (&cg)); EXPECT_CALL (mdc3, doSetOwner (NULL)); EXPECT_CALL (mdc3, doUpdateShadow (_)).Times (1); cg.pushClippable (&mdc); cg.pushClippable (&mdc2); cg.pushClippable (&mdc3); CompRegion accumulated; accumulated += mdc.inputRegion (); accumulated += mdc2.inputRegion (); accumulated += mdc3.inputRegion (); EXPECT_THAT (cg.clipRegion (), CompRegionEq (accumulated)); } TEST_F(CompDecorClipGroupsTest, TestPush2ClippableUpdatesShadow) { impl::GenericDecorClipGroup cg; StrictMock mdc; FakeDecorClippable fdc (CompRegion (50, 50, 25, 25), CompRegion (25, 25, 100, 100), &mdc, true); mdc.Delegate (fdc); StrictMock mdc2; FakeDecorClippable fdc2 (CompRegion (75, 75, 50, 50), CompRegion (25, 25, 100, 100), &mdc2, true); mdc2.Delegate (fdc2); EXPECT_CALL (mdc, getInputRegion ()).Times (4); EXPECT_CALL (mdc, doSetOwner (&cg)); EXPECT_CALL (mdc, doSetOwner (NULL)); EXPECT_CALL (mdc, doUpdateShadow (_)).Times (2); EXPECT_CALL (mdc2, getInputRegion ()).Times (2); EXPECT_CALL (mdc2, doSetOwner (&cg)); EXPECT_CALL (mdc2, doSetOwner (NULL)); EXPECT_CALL (mdc2, doUpdateShadow (_)).Times (2); cg.pushClippable (&mdc); cg.pushClippable (&mdc2); cg.updateAllShadows (); CompRegion accumulated; accumulated += mdc.inputRegion (); accumulated += mdc2.inputRegion (); EXPECT_THAT (cg.clipRegion (), CompRegionEq (accumulated)); CompRegion fdcRegion (75, 75, 50, 50); EXPECT_THAT (fdc.getShadowRegion (), CompRegionEq (fdcRegion)); CompRegion fdc2Region (50, 50, 25, 25); EXPECT_THAT (fdc2.getShadowRegion (), CompRegionEq (fdc2Region)); } TEST_F(CompDecorClipGroupsTest, TestPush3ClippableUpdatesRegionPop1) { impl::GenericDecorClipGroup cg; StrictMock mdc; FakeDecorClippable fdc (CompRegion (50, 50, 100, 100), CompRegion (0, 0, 100, 100), &mdc, true); mdc.Delegate (fdc); StrictMock mdc2; FakeDecorClippable fdc2 (CompRegion (150, 150, 100, 100), CompRegion (100, 100, 100, 100), &mdc2, true); mdc2.Delegate (fdc2); StrictMock mdc3; FakeDecorClippable fdc3 (CompRegion (250, 250, 100, 100), CompRegion (200, 200, 100, 100), &mdc3, true); mdc3.Delegate (fdc3); EXPECT_CALL (mdc, getInputRegion ()).Times (7); EXPECT_CALL (mdc, doSetOwner (&cg)); EXPECT_CALL (mdc, doSetOwner (NULL)); EXPECT_CALL (mdc, doUpdateShadow (_)).Times (1); EXPECT_CALL (mdc2, getInputRegion ()).Times (5); EXPECT_CALL (mdc2, doSetOwner (&cg)); EXPECT_CALL (mdc2, doSetOwner (NULL)); EXPECT_CALL (mdc2, doUpdateShadow (_)).Times (1); EXPECT_CALL (mdc3, getInputRegion ()).Times (2); EXPECT_CALL (mdc3, doSetOwner (&cg)); EXPECT_CALL (mdc3, doSetOwner (NULL)); EXPECT_CALL (mdc3, doUpdateShadow (_)).Times (1); cg.pushClippable (&mdc); cg.pushClippable (&mdc2); cg.pushClippable (&mdc3); CompRegion accumulated; accumulated += mdc.inputRegion (); accumulated += mdc2.inputRegion (); accumulated += mdc3.inputRegion (); EXPECT_THAT (cg.clipRegion (), CompRegionEq (accumulated)); cg.popClippable (&mdc3); accumulated = CompRegion (); accumulated += mdc.inputRegion (); accumulated += mdc2.inputRegion (); EXPECT_THAT (cg.clipRegion (), CompRegionEq (accumulated)); } compiz-0.9.11+14.04.20140409/plugins/decor/src/clip-groups/tests/CMakeLists.txt0000644000015301777760000000072212321343002027205 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_executable (compiz_test_decor_clip_groups ${CMAKE_CURRENT_SOURCE_DIR}/clip-groups/src/test-decor-clip-groups.cpp) target_link_libraries (compiz_test_decor_clip_groups compiz_decor_clip_groups ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_decor_clip_groups COVERAGE compiz_decor_clip_groups) compiz-0.9.11+14.04.20140409/plugins/decor/src/clip-groups/CMakeLists.txt0000644000015301777760000000213612321343002026044 0ustar pbusernogroup00000000000000pkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry-saver/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/clip-groups.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/clip-groups.cpp ) ADD_LIBRARY( compiz_decor_clip_groups STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_decor_clip_groups PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) TARGET_LINK_LIBRARIES( compiz_decor_clip_groups compiz_core ${GLIBMM_LIBRARIES} ) compiz-0.9.11+14.04.20140409/plugins/decor/src/clip-groups/src/0000755000015301777760000000000012321344021024073 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/clip-groups/src/clip-groups.cpp0000644000015301777760000000301012321343002027033 0ustar pbusernogroup00000000000000#include "clip-groups.h" #include #include #ifndef foreach #define foreach BOOST_FOREACH #endif using namespace compiz::decor; using namespace compiz::decor::impl; DecorClippableInterface::~DecorClippableInterface () {} DecorClipGroupInterface::~DecorClipGroupInterface () {} bool GenericDecorClipGroup::doPushClippable (DecorClippableInterface *dc) { std::vector ::iterator it = std::find (mClippables.begin (), mClippables.end (), dc); if (it == mClippables.end ()) { mClippables.push_back (dc); regenerateClipRegion (); dc->setOwner (this); return true; } return false; } bool GenericDecorClipGroup::doPopClippable (DecorClippableInterface *dc) { std::vector ::iterator it = std::find (mClippables.begin (), mClippables.end (), dc); if (it != mClippables.end ()) { dc->setOwner (NULL); dc->updateShadow (emptyRegion); mClippables.erase (it); regenerateClipRegion (); return true; } return false; } void GenericDecorClipGroup::doRegenerateClipRegion () { mRegion -= infiniteRegion; foreach (DecorClippableInterface *clippable, mClippables) { mRegion += clippable->inputRegion (); } } const CompRegion & GenericDecorClipGroup::getClipRegion () { return mRegion; } void GenericDecorClipGroup::doUpdateAllShadows () { foreach (DecorClippableInterface *clippable, mClippables) clippable->updateShadow (mRegion); } compiz-0.9.11+14.04.20140409/plugins/decor/src/clip-groups/include/0000755000015301777760000000000012321344021024727 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/decor/src/clip-groups/include/clip-groups.h0000644000015301777760000000611112321343002027341 0ustar pbusernogroup00000000000000/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 _COMPIZ_DECOR_CLIP_GROUPS_H #define _COMPIZ_DECOR_CLIP_GROUPS_H #include #include #include #include namespace compiz { namespace decor { class DecorClipGroupInterface; class DecorClippableInterface { public: virtual ~DecorClippableInterface () = 0; void updateShadow (const CompRegion &r) { doUpdateShadow (r); } void setOwner (DecorClipGroupInterface *i) { doSetOwner (i); } bool matches (const CompMatch &m) { return doMatches (m); } const CompRegion & outputRegion () { return getOutputRegion (); } const CompRegion & inputRegion () { return getInputRegion (); } void updateGroupShadows () { doUpdateGroupShadows (); } private: virtual void doUpdateShadow (const CompRegion &) = 0; virtual void doSetOwner (DecorClipGroupInterface *i) = 0; virtual bool doMatches (const CompMatch &m) = 0; virtual const CompRegion & getOutputRegion () = 0; virtual const CompRegion & getInputRegion () = 0; virtual void doUpdateGroupShadows () = 0; }; class DecorClipGroupInterface { public: virtual ~DecorClipGroupInterface () = 0; bool pushClippable (DecorClippableInterface *dc) { return doPushClippable (dc); } bool popClippable (DecorClippableInterface *dc) { return doPopClippable (dc); } void regenerateClipRegion () { doRegenerateClipRegion (); } const CompRegion & clipRegion () { return getClipRegion (); } void updateAllShadows () { return doUpdateAllShadows (); } private: virtual bool doPushClippable (DecorClippableInterface *dc) = 0; virtual bool doPopClippable (DecorClippableInterface *dc) = 0; virtual void doRegenerateClipRegion () = 0; virtual const CompRegion & getClipRegion () = 0; virtual void doUpdateAllShadows () = 0; }; namespace impl { class GenericDecorClipGroup : public DecorClipGroupInterface { private: bool doPushClippable (DecorClippableInterface *dc); bool doPopClippable (DecorClippableInterface *dc); void doRegenerateClipRegion (); const CompRegion & getClipRegion (); void doUpdateAllShadows (); std::vector mClippables; CompRegion mRegion; }; } } } #endif compiz-0.9.11+14.04.20140409/plugins/decor/src/decor.h0000644000015301777760000002410312321343002022303 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include #include #include #include "decor_options.h" #define DECOR_SCREEN(s) DecorScreen *ds = DecorScreen::get(s) #define DECOR_WINDOW(w) DecorWindow *dw = DecorWindow::get(w) struct Vector { int dx; int dy; int x0; int y0; }; /* FIXME: Remove */ #define DECOR_BARE 0 #define DECOR_ACTIVE 1 #define DECOR_NUM 2 using namespace compiz::decor; class MatchedDecorClipGroup : public DecorClipGroupInterface { public: MatchedDecorClipGroup (const CompMatch &match); private: bool doPushClippable (DecorClippableInterface *dc); bool doPopClippable (DecorClippableInterface *dc) { return mClipGroupImpl.popClippable (dc); } void doRegenerateClipRegion () { return mClipGroupImpl.regenerateClipRegion (); } const CompRegion & getClipRegion () { return mClipGroupImpl.clipRegion (); } void doUpdateAllShadows () { return mClipGroupImpl.updateAllShadows (); } impl::GenericDecorClipGroup mClipGroupImpl; CompMatch mMatch; }; class DecorTexture { public: DecorTexture (DecorPixmapInterface::Ptr pixmap); ~DecorTexture (); public: bool status; int refCount; DecorPixmapInterface::Ptr pixmap; Damage damage; GLTexture::List textures; }; class DecorWindow; class Decoration : public DecorationInterface { public: typedef boost::shared_ptr Ptr; static const unsigned int UpdateRequested = 1 << 0; static const unsigned int UpdatesPending = 1 << 1; static Decoration::Ptr create (Window id, long *prop, unsigned int size, unsigned int type, unsigned int nOffset, DecorPixmapRequestorInterface *requestor); Decoration (int type, const decor_extents_t &border, const decor_extents_t &input, const decor_extents_t &maxBorder, const decor_extents_t &maxInput, unsigned int frameType, unsigned int frameState, unsigned int frameActions, unsigned int minWidth, unsigned int minHeight, Pixmap pixmap, const boost::shared_array &quad, unsigned int nQuad, Window owner, DecorPixmapRequestorInterface *); ~Decoration (); DecorPixmapReceiverInterface & receiverInterface (); unsigned int getFrameType () const; unsigned int getFrameState () const; unsigned int getFrameActions () const; public: int refCount; DecorTexture *texture; CompWindowExtents output; CompWindowExtents border; CompWindowExtents input; CompWindowExtents maxBorder; CompWindowExtents maxInput; int minWidth; int minHeight; unsigned int frameType; unsigned int frameState; unsigned int frameActions; boost::shared_array quad; int nQuad; int type; unsigned int updateState; X11DecorPixmapReceiver mPixmapReceiver; private: bool bareDecorationOnly (); Decoration::Ptr findRealDecoration (); Decoration::Ptr findBareDecoration (); void moveDecoratedWindowBy (const CompPoint &movement); }; class DecorationList : public DecorationListFindMatchingInterface { public: bool updateDecoration (Window id, Atom decorAtom, DecorPixmapRequestorInterface *requestor); DecorationInterface::Ptr findMatchingDecoration (unsigned int frameType, unsigned int frameState, unsigned int frameActions) const; DecorationInterface::Ptr findMatchingDecoration (Pixmap p) const; const Decoration::Ptr & findMatchingDecoration (CompWindow *w, bool sizeCheck); void clear () { mList.clear (); }; DecorationList (); std::list mList; }; struct ScaledQuad { GLTexture::Matrix matrix; BoxRec box; float sx; float sy; }; class WindowDecoration { public: static WindowDecoration * create (const Decoration::Ptr &d); static void destroy (WindowDecoration *); public: Decoration::Ptr decor; ScaledQuad *quad; int nQuad; }; class DecorWindow; class DecorScreen : public ScreenInterface, public CompositeScreenInterface, public PluginClassHandler, public DecorOptions { public: DecorScreen (CompScreen *s); ~DecorScreen (); bool setOption (const CompString &name, CompOption::Value &value); void handleEvent (XEvent *event); void matchPropertyChanged (CompWindow *); void addSupportedAtoms (std::vector&); DecorTexture * getTexture (Pixmap); void releaseTexture (DecorTexture *); void checkForDm (bool); bool decoratorStartTimeout (); void updateDefaultShadowProperty (); bool registerPaintHandler (compiz::composite::PaintHandler *pHnd); void unregisterPaintHandler (); private: DecorPixmapRequestorInterface * findWindowRequestor (Window); DecorationListFindMatchingInterface * findWindowDecorations (Window); public: CompositeScreen *cScreen; std::list textures; Atom supportingDmCheckAtom; Atom winDecorAtom; Atom decorAtom[DECOR_NUM]; Atom inputFrameAtom; Atom outputFrameAtom; Atom decorTypeAtom; Atom decorTypePixmapAtom; Atom decorTypeWindowAtom; Atom requestFrameExtentsAtom; Atom shadowColorAtom; Atom shadowInfoAtom; Atom decorSwitchWindowAtom; Atom decorPendingAtom; Atom decorRequestAtom; Window dmWin; int dmSupports; bool cmActive; DecorationList decor[DECOR_NUM]; Decoration::Ptr windowDefault; std::map frames; CompTimer decoratorStart; MatchedDecorClipGroup mMenusClipGroup; X11DecorPixmapRequestor mRequestor; PixmapReleasePool::Ptr mReleasePool; PendingHandler mPendingHandler; UnusedHandler mUnusedHandler; protocol::Communicator mCommunicator; }; class DecorWindow : public WindowInterface, public CompositeWindowInterface, public GLWindowInterface, public PluginClassHandler, public DecorClippableInterface { public: DecorWindow (CompWindow *w); ~DecorWindow (); void getOutputExtents (CompWindowExtents&); void resizeNotify (int, int, int, int); void moveNotify (int, int, bool); void stateChangeNotify (unsigned int); void updateFrameRegion (CompRegion ®ion); bool damageRect (bool, const CompRect &); bool place (CompPoint &pos); bool glDraw (const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int); void glDecorate (const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int); void windowNotify (CompWindowNotify n); void updateDecoration (); void setDecorationMatrices (); void updateDecorationScale (); void updateFrame (); void updateInputFrame (); void updateOutputFrame (); void updateWindowRegions (); bool checkSize (const Decoration::Ptr &decor); int shiftX (); int shiftY (); bool update (bool); bool resizeTimeout (); void updateSwitcher (); void updateHandlers (); static bool matchType (CompWindow *w, unsigned int decorType); static bool matchState (CompWindow *w, unsigned int decorState); static bool matchActions (CompWindow *w, unsigned int decorActions); private: void doUpdateShadow (const CompRegion &); void doSetOwner (DecorClipGroupInterface *i); bool doMatches (const CompMatch &m); const CompRegion & getOutputRegion (); const CompRegion & getInputRegion (); void doUpdateGroupShadows (); public: CompWindow *window; GLWindow *gWindow; CompositeWindow *cWindow; DecorScreen *dScreen; WindowDecoration *wd; DecorationList decor; CompRegion frameRegion; CompRegion shadowRegion; CompRegion tmpRegion; Window inputFrame; Window outputFrame; Damage frameDamage; int oldX; int oldY; int oldWidth; int oldHeight; bool pixmapFailed; CompRegion::Vector regions; bool updateReg; bool updateMatrix; CompTimer resizeUpdate; CompTimer moveUpdate; bool unshading; bool shading; bool isSwitcher; bool frameExtentsRequested; DecorClipGroupInterface *mClipGroup; CompRegion mOutputRegion; CompRegion mInputRegion; X11DecorPixmapRequestor mRequestor; unsigned int lastMaximizedStateDecorated; private: bool bareDecorationOnly (); Decoration::Ptr findRealDecoration (); Decoration::Ptr findBareDecoration (); void moveDecoratedWindowBy (const CompPoint &movement, const CompSize &sizeDelta); }; class DecorPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/decor/src/compiz-decorator0000755000015301777760000000574012321343002024253 0ustar pbusernogroup00000000000000#!/bin/sh # Starts Compiz Decorator depending on the DE # # Copyright (c) 2007 CyberOrg # Based on compiz-manager script by Kristian Lyngstøl # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # Contributions by: crdlb # Modifications by: Daniel van Vugt # if [ -z "$COMPIZ_BIN_PATH" ]; then COMPIZ_BIN_PATH="/usr/bin/" fi KWIN=`which kwin` METACITY="/usr/bin/metacity" # # Default to gtk/kde4-window-decorator # USE_EMERALD="no" DECORATOR="" #Do not leave users without decoration if decorator fails if [ "$DESKTOP_SESSION" = "kde" ]; then FALLBACKWM="${KWIN}" else FALLBACKWM="${METACITY}" fi FALLBACKWM_OPTIONS=" --replace" # # Set to yes to enable verbose # VERBOSE="yes" # # Echos the arguments if verbose # verbose() { if [ "x$VERBOSE" = "xyes" ]; then printf "$*" fi } # Read configuration from XDG paths if [ -z "$XDG_CONFIG_DIRS" ]; then test -f /etc/xdg/compiz/compiz-manager && . /etc/xdg/compiz/compiz-manager else test -f $XDG_CONFIG_DIRS/compiz/compiz-manager && . $XDG_CONFIG_DIRS/compiz/compiz-manager fi if [ -z "$XDG_CONFIG_HOME" ]; then test -f $HOME/.config/compiz/compiz-manager && . $HOME/.config/compiz/compiz-manager else test -f $XDG_CONFIG_HOME/compiz/compiz-manager && . $XDG_CONFIG_HOME/compiz/compiz-manager fi # start a decorator if [ -x ${COMPIZ_BIN_PATH}emerald ] && [ "$USE_EMERALD" = "yes" ]; then DECORATOR=emerald elif [ -x ${COMPIZ_BIN_PATH}gtk-window-decorator ] && [ -n "$GNOME_DESKTOP_SESSION_ID" ]; then DECORATOR=gtk-window-decorator elif [ -x ${COMPIZ_BIN_PATH}kde4-window-decorator ] && [ x$KDE_SESSION_VERSION = x"4" ]; then DECORATOR=kde4-window-decorator fi # fall back to any decorator that is installed if [ -z "$DECORATOR" ]; then verbose "Couldn't find a perfect decorator match; trying all decorators\n" if [ -x ${COMPIZ_BIN_PATH}emerald ]; then DECORATOR=emerald elif [ -x ${COMPIZ_BIN_PATH}gtk-window-decorator ]; then DECORATOR=gtk-window-decorator elif [ -x ${COMPIZ_BIN_PATH}kde4-window-decorator ]; then DECORATOR=kde4-window-decorator fi fi if [ -n "$DECORATOR" ]; then verbose "Starting ${DECORATOR}\n" exec ${COMPIZ_BIN_PATH}$DECORATOR "$@" else verbose "Found no decorator to start\n" exec $FALLBACKWM $FALLBACKWM_OPTIONS fi compiz-0.9.11+14.04.20140409/plugins/thumbnail/0000755000015301777760000000000012321344021021140 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/thumbnail/CMakeLists.txt0000644000015301777760000000017512321343002023701 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (thumbnail PLUGINDEPS composite opengl text mousepoll) compiz-0.9.11+14.04.20140409/plugins/thumbnail/src/0000755000015301777760000000000012321344021021727 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/thumbnail/src/thumbnail_tex.h0000644000015301777760000005607612321343002024757 0ustar pbusernogroup00000000000000#ifndef _THUMBNAIL_TEX_H #define _THUMBNAIL_TEX_H static char glowTex[4097] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7\377" "\377\377\10\377\377\377\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7" "\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377" "\14\377\377\377\15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\4\377\377\377\5\377\377\377\7\377\377\377\10\377\377\377\12\377\377\377" "\13\377\377\377\15\377\377\377\17\377\377\377\20\377\377\377\21\377\377\377" "\23\377\377\377\24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377" "\377\377\7\377\377\377\11\377\377\377\12\377\377\377\15\377\377\377\17\377" "\377\377\21\377\377\377\23\377\377\377\25\377\377\377\27\376\376\376\31\377" "\377\377\33\377\377\377\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\5\377\377\377\6\377" "\377\377\10\377\377\377\12\377\377\377\15\377\377\377\17\377\377\377\22\377" "\377\377\25\377\377\377\30\377\377\377\33\377\377\377\36\377\377\377!\377" "\377\377#\377\377\377%\377\377\377'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\2\377\377\377\2\377\377\377\4\377\377\377\5\377\377\377\7\377" "\377\377\11\377\377\377\14\377\377\377\17\377\377\377\22\377\377\377\26\376" "\376\376\31\376\376\376\35\377\377\377!\377\377\377%\377\377\377)\377\377" "\377,\377\377\377/\376\376\3762\377\377\3774\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\6\377\377\377\10" "\377\377\377\12\377\377\377\15\377\377\377\21\377\377\377\25\376\376\376" "\31\377\377\377\36\377\377\377\"\377\377\377'\377\377\377,\377\377\3771\376" "\376\3765\376\376\376:\377\377\377=\377\377\377A\377\377\377D\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\6\377\377" "\377\10\377\377\377\13\377\377\377\16\377\377\377\22\377\377\377\27\377\377" "\377\34\377\377\377!\377\377\377'\377\377\377-\377\377\3773\377\377\3779" "\377\377\377?\377\377\377D\377\377\377I\377\377\377M\377\377\377Q\377\377" "\377U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\4\377\377\377" "\5\377\377\377\10\377\377\377\13\377\377\377\17\377\377\377\23\377\377\377" "\30\377\377\377\36\377\377\377$\377\377\377+\376\376\3762\377\377\3779\377" "\377\377@\377\377\377G\377\377\377N\377\377\377T\377\377\377Z\377\377\377" "_\377\377\377c\376\376\376g\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\3\377\377\377\5\377\377\377\10\377\377\377\13\377\377\377\17\377\377\377" "\23\376\376\376\31\377\377\377\37\377\377\377'\377\377\377.\377\377\3776" "\377\377\377?\377\377\377G\377\377\377P\377\377\377X\377\377\377_\377\377" "\377f\377\377\377l\377\377\377r\377\377\377w\377\377\377{\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\2\377\377\377\3\377\377\377\5\377\377\377\7\377\377\377\12\377\377\377\16" "\377\377\377\23\376\376\376\31\377\377\377\40\377\377\377'\377\377\3770\377" "\377\3779\377\377\377C\377\377\377L\377\377\377V\377\377\377_\377\377\377" "h\377\377\377q\377\377\377x\377\377\377\177\377\377\377\205\377\377\377\212" "\377\377\377\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\1\377\377\377\3\377\377\377\4\377\377\377\6\377" "\377\377\11\377\377\377\15\377\377\377\22\377\377\377\30\377\377\377\37\377" "\377\377(\377\377\3771\377\377\377;\377\377\377E\377\377\377P\376\376\376" "[\377\377\377f\377\377\377p\377\377\377z\377\377\377\202\377\377\377\212" "\377\377\377\221\377\377\377\227\377\377\377\235\377\377\377\241\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\2\377\377\377\3\377\377\377\5\377\377\377\10\377\377\377\14\377\377\377" "\21\377\377\377\27\377\377\377\36\377\377\377'\377\377\3770\377\377\377;" "\377\377\377F\377\377\377R\377\377\377^\376\376\376j\377\377\377v\377\377" "\377\200\377\377\377\213\377\377\377\224\377\377\377\234\377\377\377\243" "\377\377\377\251\377\377\377\256\377\377\377\262\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\3\377\377" "\377\5\377\377\377\7\377\377\377\13\377\377\377\17\377\377\377\25\377\377" "\377\34\377\377\377$\377\377\377.\377\377\3779\377\377\377E\377\377\377R" "\377\377\377_\377\377\377l\376\376\376y\377\377\377\205\377\377\377\221\377" "\377\377\233\377\377\377\244\377\377\377\255\377\377\377\264\376\376\376" "\271\377\377\377\276\377\377\377\302\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\2\377\377\377\4\377\377\377\6\377" "\377\377\11\377\377\377\15\377\377\377\22\376\376\376\31\377\377\377!\377" "\377\377+\377\377\3776\377\377\377C\377\377\377P\377\377\377^\377\377\377" "l\377\377\377z\377\377\377\210\377\377\377\224\377\377\377\240\377\377\377" "\253\377\377\377\264\377\377\377\274\377\377\377\302\376\376\376\310\377" "\377\377\314\377\377\377\320\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\1\377\377\377\3\377\377\377\4\377\377\377\7\377\377" "\377\13\377\377\377\20\377\377\377\26\377\377\377\36\377\377\377'\376\376" "\3762\377\377\377?\377\377\377L\376\376\376[\376\376\376j\376\376\376y\377" "\377\377\210\377\377\377\226\377\377\377\243\377\377\377\256\376\376\376" "\271\377\377\377\301\377\377\377\311\376\376\376\317\376\376\376\324\377" "\377\377\330\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\2\377\377\377\3\377\377\377\5\377\377\377\11\377\377" "\377\15\377\377\377\22\377\377\377\32\377\377\377#\377\377\377-\376\376\376" ":\377\377\377G\377\377\377V\377\377\377f\377\377\377v\377\377\377\205\377" "\377\377\224\377\377\377\243\377\377\377\257\376\376\376\273\377\377\377" "\305\377\377\377\315\376\376\376\324\377\377\377\332\377\377\377\336\377" "\377\377\342\377\377\377\345\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\2\377\377\377\4\377\377\377\7\377\377\377\12\377\377" "\377\17\377\377\377\25\377\377\377\36\377\377\377(\377\377\3773\377\377\377" "A\377\377\377P\377\377\377`\377\377\377p\377\377\377\201\377\377\377\221" "\377\377\377\240\377\377\377\256\376\376\376\273\377\377\377\306\376\376" "\376\317\377\377\377\327\377\377\377\336\377\377\377\343\377\377\377\347" "\376\376\376\352\377\377\377\354\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\3\377\377\377\5\377\377\377\10\377\377\377\14" "\377\377\377\21\377\377\377\30\377\377\377!\377\377\377,\377\377\3779\377" "\377\377H\377\377\377X\377\377\377h\377\377\377z\377\377\377\213\377\377" "\377\233\377\377\377\253\377\377\377\270\377\377\377\305\376\376\376\317" "\377\377\377\330\377\377\377\337\377\377\377\345\376\376\376\351\377\377" "\377\355\377\377\377\360\376\376\376\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\5\377\377\377\11\377" "\377\377\15\377\377\377\23\377\377\377\33\377\377\377%\377\377\3771\377\377" "\377?\377\377\377N\377\377\377_\377\377\377q\377\377\377\203\377\377\377" "\224\377\377\377\245\377\377\377\264\377\377\377\301\377\377\377\315\377" "\377\377\327\377\377\377\337\377\377\377\346\376\376\376\353\377\377\377" "\357\376\376\376\362\377\377\377\364\377\377\377\366\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\2\377\377\377\4\377\377\377\6\377" "\377\377\12\377\377\377\17\377\377\377\26\377\377\377\36\377\377\377)\377" "\377\3776\377\377\377D\377\377\377U\377\377\377f\377\377\377x\377\377\377" "\213\377\377\377\234\377\377\377\255\377\377\377\274\377\377\377\311\376" "\376\376\324\377\377\377\336\377\377\377\345\376\376\376\353\377\377\377" "\360\377\377\377\363\377\377\377\366\377\377\377\367\377\377\377\371\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\2\377\377\377\4\377" "\377\377\7\377\377\377\13\377\377\377\20\377\377\377\30\377\377\377!\377" "\377\377,\376\376\376:\377\377\377I\377\377\377Z\377\377\377l\377\377\377" "\177\377\377\377\221\377\377\377\243\377\377\377\264\377\377\377\302\376" "\376\376\317\377\377\377\332\377\377\377\343\376\376\376\352\377\377\377" "\357\377\377\377\363\377\377\377\366\377\377\377\370\377\377\377\372\377" "\377\377\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\3" "\377\377\377\5\377\377\377\10\377\377\377\14\377\377\377\22\377\377\377\32" "\377\377\377#\377\377\377/\377\377\377>\377\377\377N\377\377\377_\377\377" "\377r\377\377\377\205\377\377\377\230\377\377\377\251\376\376\376\271\376" "\376\376\310\376\376\376\324\377\377\377\336\377\377\377\347\377\377\377" "\355\376\376\376\362\377\377\377\365\377\377\377\370\377\377\377\372\377" "\377\377\373\377\377\377\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\3\377\377\377\5\377\377\377\10\377\377\377\15\377\377\377" "\23\377\377\377\33\377\377\377&\376\376\3762\377\377\377A\377\377\377R\376" "\376\376d\377\377\377w\377\377\377\212\377\377\377\235\377\377\377\256\377" "\377\377\276\377\377\377\314\377\377\377\330\377\377\377\342\376\376\376" "\352\377\377\377\360\377\377\377\364\377\377\377\367\377\377\377\371\377" "\377\377\373\377\377\377\374\377\377\377\375\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\2\377\377\377\3\377\377\377\5\377\377\377\11\377\377" "\377\16\377\377\377\24\376\376\376\35\377\377\377(\376\376\3765\377\377\377" "D\377\377\377U\376\376\376g\377\377\377{\377\377\377\216\377\377\377\241" "\377\377\377\262\377\377\377\302\377\377\377\320\377\377\377\333\377\377" "\377\345\377\377\377\354\376\376\376\362\377\377\377\366\377\377\377\370" "\377\377\377\372\377\377\377\374\377\377\377\374\377\377\377\375" }; static char windowTex[4097] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2" "\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2" "\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1" "\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\5\0\0\0\6\0\0\0\6" "\0\0\0\6\0\0\0\7\0\0\0\7\0\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6" "\0\0\0\7\0\0\0\10\0\0\0\11\0\0\0\11\0\0\0\12\0\0\0\13\0\0\0\13\0\0\0\14\0" "\0\0\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0" "\0\0\3\0\0\0\4\0\0\0\5\0\0\0\7\0\0\0\10\0\0\0\12\0\0\0\13\0\0\0\14\0\0\0" "\16\0\0\0\17\0\0\0\20\0\0\0\21\0\0\0\21\0\0\0\22\0\0\0\22\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\7\0\0\0\11" "\0\0\0\13\0\0\0\15\0\0\0\17\0\0\0\21\0\0\0\23\0\0\0\24\0\0\0\26\0\0\0\30" "\0\0\0\31\0\0\0\32\0\0\0\33\0\0\0\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0" "\0\2\0\0\0\3\0\0\0\4\0\0\0\6\0\0\0\10\0\0\0\12\0\0\0\15\0\0\0\20\0\0\0\22" "\0\0\0\25\0\0\0\30\0\0\0\33\0\0\0\35\0\0\0\37\0\0\0!\0\0\0#\0\0\0$\0\0\0" "%\0\0\0&\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\5\0\0\0\7\0\0\0\11" "\0\0\0\14\0\0\0\17\0\0\0\23\0\0\0\26\0\0\0\32\0\0\0\36\0\0\0\"\0\0\0%\0\0" "\0(\0\0\0+\0\0\0.\0\0\0""0\0\0\0""1\0\0\0""2\0\0\0""3\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0" "\0\2\0\0\0\3\0\0\0\5\0\0\0\7\0\0\0\12\0\0\0\15\0\0\0\21\0\0\0\25\0\0\0\32" "\0\0\0\36\0\0\0#\0\0\0(\0\0\0-\0\0\0""1\0\0\0""5\0\0\0""9\0\0\0<\0\0\0>\0" "\0\0@\0\0\0B\0\0\0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\5\0\0\0\7\0\0\0\12\0\0\0" "\16\0\0\0\22\0\0\0\27\0\0\0\34\0\0\0\"\0\0\0(\0\0\0/\0\0\0""5\0\0\0;\0\0" "\0@\0\0\0E\0\0\0I\0\0\0M\0\0\0P\0\0\0R\0\0\0T\0\0\0V\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3\0\0" "\0\5\0\0\0\7\0\0\0\12\0\0\0\16\0\0\0\22\0\0\0\30\0\0\0\36\0\0\0%\0\0\0,\0" "\0\0""4\0\0\0<\0\0\0C\0\0\0J\0\0\0Q\0\0\0V\0\0\0[\0\0\0`\0\0\0c\0\0\0f\0" "\0\0h\0\0\0i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\1\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\6\0\0\0\11\0\0\0\15\0\0\0\22\0\0\0\30" "\0\0\0\36\0\0\0&\0\0\0/\0\0\0""8\0\0\0A\0\0\0J\0\0\0S\0\0\0[\0\0\0b\0\0\0" "i\0\0\0\231\0\0\0\354\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3\0\0" "\0\5\0\0\0\10\0\0\0\14\0\0\0\21\0\0\0\27\0\0\0\36\0\0\0&\0\0\0/\0\0\0""9" "\0\0\0D\0\0\0O\0\0\0Y\0\0\0c\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\361" "\361\361\353\361\361\361\353\361\361\361\353\361\361\361\353\361\361\361" "\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0" "\0\3\0\0\0\4\0\0\0\7\0\0\0\12\0\0\0\17\0\0\0\25\0\0\0\34\0\0\0$\0\0\0.\0" "\0\0""9\0\0\0E\0\0\0Q\0\0\0]\0\0\0\234\0\0\0\377\0\0\0\377\361\361\361\353" "\361\361\361\353\361\361\361\353\361\361\361\353\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\5\0\0\0\10\0\0\0\15\0\0\0" "\22\0\0\0\31\0\0\0\"\0\0\0,\0\0\0""7\0\0\0C\0\0\0Q\0\0\0^\0\0\0\377\0\0\0" "\377\361\361\361\353\361\361\361\353\361\361\361\353\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\1\0\0\0\2\0\0\0\4\0\0\0\7\0\0\0\12\0\0\0\17\0\0\0\26\0\0\0\36\0\0\0'\0" "\0\0""3\0\0\0@\0\0\0N\0\0\0]\0\0\0\377\0\0\0\377\361\361\361\353\361\361" "\361\353\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3" "\0\0\0\5\0\0\0\10\0\0\0\14\0\0\0\22\0\0\0\31\0\0\0\"\0\0\0-\0\0\0:\0\0\0" "I\0\0\0X\0\0\0w\0\0\0\377\361\361\361\353\361\361\361\353\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\6" "\0\0\0\11\0\0\0\16\0\0\0\24\0\0\0\35\0\0\0'\0\0\0""3\0\0\0A\0\0\0Q\0\0\0" "b\0\0\0\377\361\361\361\353\361\361\361\353\341\341\341\326\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\7" "\0\0\0\13\0\0\0\20\0\0\0\27\0\0\0\40\0\0\0+\0\0\0""9\0\0\0H\0\0\0Y\0\0\0" "\225\0\0\0\377\361\361\361\353\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341" "\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\3\0\0\0\5\0\0" "\0\10\0\0\0\14\0\0\0\22\0\0\0\31\0\0\0#\0\0\0""0\0\0\0>\0\0\0N\0\0\0`\0\0" "\0\377\361\361\361\353\361\361\361\353\341\341\341\326\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341" "\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\3\0\0" "\0\5\0\0\0\10\0\0\0\15\0\0\0\23\0\0\0\34\0\0\0&\0\0\0""3\0\0\0B\0\0\0T\0" "\0\0f\0\0\0\377\361\361\361\353\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0" "\0\3\0\0\0\6\0\0\0\11\0\0\0\16\0\0\0\25\0\0\0\36\0\0\0)\0\0\0""7\0\0\0F\0" "\0\0X\0\0\0k\0\0\0\377\361\361\361\353\341\341\341\326\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341" "\341\341\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\2\0\0\0\3\0\0\0\6\0\0\0\12\0\0\0\17\0\0\0\26\0\0\0\37\0\0\0+\0\0\0""9" "\0\0\0J\0\0\0\\\0\0\0o\0\0\0\377\361\361\361\353\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\6\0\0\0\12\0\0\0\20\0\0\0\27\0\0\0!\0\0\0" "-\0\0\0<\0\0\0L\0\0\0_\0\0\0s\0\0\0\377\361\361\361\353\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\7\0\0\0\13\0\0\0\20\0\0\0\30\0\0\0\"\0" "\0\0.\0\0\0=\0\0\0O\0\0\0b\0\0\0v\0\0\0\377\361\361\361\353\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\7\0\0\0\13\0\0\0\21\0\0\0\31\0\0\0" "#\0\0\0""0\0\0\0?\0\0\0P\0\0\0c\0\0\0x\0\0\0\377\361\361\361\353\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\7\0\0\0\13\0\0\0\21\0\0\0" "\31\0\0\0#\0\0\0""0\0\0\0@\0\0\0Q\0\0\0e\0\0\0y\0\0\0\377\361\361\361\353" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" }; #endif compiz-0.9.11+14.04.20140409/plugins/thumbnail/src/thumbnail.cpp0000644000015301777760000007116712321343002024430 0ustar pbusernogroup00000000000000/* * * Compiz thumbnail plugin * * thumbnail.cpp * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * Based on thumbnail.c: * Copyright : (C) 2007 Stjepan Glavina * E-mail : stjepang@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "thumbnail.h" #include "thumbnail_tex.h" COMPIZ_PLUGIN_20090315 (thumbnail, ThumbPluginVTable); void ThumbScreen::freeThumbText (Thumbnail *t) { if (!t->text) return; delete t->text; t->text = NULL; } void ThumbScreen::renderThumbText (Thumbnail *t, bool freeThumb) { if (!textPluginLoaded) return; if (freeThumb || !t->text) { freeThumbText (t); t->text = new CompText (); } CompText::Attrib tA; tA.maxWidth = t->width; tA.maxHeight = 100; // text background tA.bgHMargin = 4; tA.bgVMargin = 4; tA.bgColor[0] = optionGetFontBackgroundColorRed (); tA.bgColor[1] = optionGetFontBackgroundColorGreen (); tA.bgColor[2] = optionGetFontBackgroundColorBlue (); tA.bgColor[3] = optionGetFontBackgroundColorAlpha (); tA.size = optionGetFontSize (); tA.color[0] = optionGetFontColorRed (); tA.color[1] = optionGetFontColorGreen (); tA.color[2] = optionGetFontColorBlue (); tA.color[3] = optionGetFontColorAlpha (); tA.flags = CompText::WithBackground | CompText::Ellipsized; if (optionGetFontBold ()) tA.flags |= CompText::StyleBold; tA.family = "Sans"; t->textValid = t->text->renderWindowTitle (t->win->id (), false, tA); } void ThumbScreen::damageThumbRegion (Thumbnail *t) { int x = t->x - t->offset; int y = t->y - t->offset; int width = t->width + t->offset * 2; int height = t->height + t->offset * 2; CompRect rect (x, y, width, height); if (t->text) rect.setHeight (rect.height () + t->text->getHeight () + optionGetTextDistance ()); CompRegion region (rect); cScreen->damageRegion (region); } #define GET_DISTANCE(a,b) \ (sqrt((((a)[0] - (b)[0]) * ((a)[0] - (b)[0])) + \ (((a)[1] - (b)[1]) * ((a)[1] - (b)[1])))) void ThumbScreen::thumbUpdateThumbnail () { if (thumb.win == pointedWin || (thumb.opacity && oldThumb.opacity)) return; if (thumb.win) damageThumbRegion (&thumb); freeThumbText (&oldThumb); ThumbWindow *tw; if (oldThumb.win) { tw = ThumbWindow::get (oldThumb.win); /* Disable painting on the old thumb */ tw->cWindow->damageRectSetEnabled (tw, false); tw->gWindow->glPaintSetEnabled (tw, false); tw->window->resizeNotifySetEnabled (tw, false); } oldThumb = thumb; thumb.text = NULL; thumb.win = pointedWin; thumb.dock = dock; if (!thumb.win || !dock) { thumb.win = NULL; thumb.dock = NULL; return; } CompWindow *w = thumb.win; tw = ThumbWindow::get (w); tw->cWindow->damageRectSetEnabled (tw, true); tw->gWindow->glPaintSetEnabled (tw, true); tw->window->resizeNotifySetEnabled (tw, true); float maxSize = optionGetThumbSize (); double scale = 1.0; int winWidth = w->width () + w->border ().left + w->border ().right; int winHeight = w->height () + w->border ().top + w->border ().bottom; /* do we need to scale the window down? */ if (winWidth > maxSize || winHeight > maxSize) { if (winWidth >= winHeight) scale = maxSize / winWidth; else scale = maxSize / winHeight; } thumb.width = winWidth * scale; thumb.height = winHeight * scale; thumb.scale = scale; if (optionGetTitleEnabled ()) renderThumbText (&thumb, false); else freeThumbText (&thumb); int igMidPoint[2], tMidPoint[2]; igMidPoint[0] = w->iconGeometry ().centerX (); igMidPoint[1] = w->iconGeometry ().centerY (); int off = optionGetBorder (); int oDev = screen->outputDeviceForPoint (igMidPoint[0], igMidPoint[1]); CompRect oGeom; if (screen->outputDevs ().size () == 1 || (unsigned int) oDev > screen->outputDevs ().size ()) oGeom.setGeometry (0, 0, screen->width (), screen->height ()); else oGeom = screen->outputDevs ()[oDev]; int tHeight = thumb.height; int tWidth = thumb.width; if (thumb.text) tHeight += thumb.text->getHeight () + optionGetTextDistance (); int halfTWidth = tWidth / 2; int halfTHeight = tHeight / 2; int tPos[2], tmpPos[2]; // failsave position tPos[0] = igMidPoint[0] - halfTWidth; if (w->iconGeometry ().y () - tHeight >= 0) tPos[1] = w->iconGeometry ().y () - tHeight; else tPos[1] = w->iconGeometry ().y () + w->iconGeometry ().height (); // above tmpPos[0] = igMidPoint[0] - halfTWidth; if (tmpPos[0] - off < oGeom.x1 ()) tmpPos[0] = oGeom.x1 () + off; if (tmpPos[0] + off + tWidth > oGeom.x2 ()) { if (tWidth + (2 * off) <= oGeom.width ()) tmpPos[0] = oGeom.x2 () - tWidth - off; else tmpPos[0] = oGeom.x1 () + off; } tMidPoint[0] = tmpPos[0] + halfTWidth; int dockX = dock->x () - dock->border ().left; int dockY = dock->y () - dock->border ().top; int dockWidth = dock->width () + dock->border ().left + dock->border ().right; int dockHeight = dock->height () + dock->border ().top + dock->border ().bottom; tmpPos[1] = dockY - tHeight - off; tMidPoint[1] = tmpPos[1] + halfTHeight; float distance = 1000000; if (tmpPos[1] > oGeom.y1 ()) { tPos[0] = tmpPos[0]; tPos[1] = tmpPos[1]; distance = GET_DISTANCE (igMidPoint, tMidPoint); } // below tmpPos[1] = dockY + dockHeight + off; tMidPoint[1] = tmpPos[1] + halfTHeight; if (tmpPos[1] + tHeight + off < oGeom.y2 () && GET_DISTANCE (igMidPoint, tMidPoint) < distance) { tPos[0] = tmpPos[0]; tPos[1] = tmpPos[1]; distance = GET_DISTANCE (igMidPoint, tMidPoint); } // left tmpPos[1] = igMidPoint[1] - halfTHeight; if (tmpPos[1] - off < oGeom.y1 ()) tmpPos[1] = oGeom.y1 () + off; if (tmpPos[1] + off + tHeight > oGeom.y2 ()) { if (tHeight + (2 * off) <= oGeom.height ()) tmpPos[1] = oGeom.y2 () - tHeight - off; else tmpPos[1] = oGeom.y1 () + off; } tMidPoint[1] = tmpPos[1] + halfTHeight; tmpPos[0] = dockX - tWidth - off; tMidPoint[0] = tmpPos[0] + halfTWidth; if (tmpPos[0] > oGeom.x1 () && GET_DISTANCE (igMidPoint, tMidPoint) < distance) { tPos[0] = tmpPos[0]; tPos[1] = tmpPos[1]; distance = GET_DISTANCE (igMidPoint, tMidPoint); } // right tmpPos[0] = dockX + dockWidth + off; tMidPoint[0] = tmpPos[0] + halfTWidth; if (tmpPos[0] + tWidth + off < oGeom.x2 () && GET_DISTANCE (igMidPoint, tMidPoint) < distance) { tPos[0] = tmpPos[0]; tPos[1] = tmpPos[1]; } thumb.x = tPos[0]; thumb.y = tPos[1]; thumb.offset = off; thumb.opacity = 0.0; damageThumbRegion (&thumb); cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); } bool ThumbScreen::thumbShowThumbnail () { showingThumb = true; thumbUpdateThumbnail (); damageThumbRegion (&thumb); return false; } bool ThumbScreen::checkPosition (CompWindow *w) { if (optionGetCurrentViewport ()) if (w->serverX () >= screen->width () || w->serverX () + w->serverWidth () <= 0 || w->serverY () >= screen->height () || w->serverY () + w->serverHeight () <= 0) return false; return true; } void ThumbScreen::positionUpdate (const CompPoint &p) { CompWindow *found = NULL; foreach (CompWindow *cw, screen->windows ()) { THUMB_WINDOW (cw); if (cw->destroyed () || cw->iconGeometry ().isEmpty () || !cw->isMapped () || cw->state () & CompWindowStateSkipTaskbarMask || cw->state () & CompWindowStateSkipPagerMask || !cw->managed () || !tw->cWindow->pixmap ()) continue; if (cw->iconGeometry ().contains (p) && checkPosition (cw)) { found = cw; break; } } if (found) { int showDelay = optionGetShowDelay (); if (!showingThumb && !(thumb.opacity != 0.0 && thumb.win == found)) { if (displayTimeout.active ()) { if (pointedWin != found) { displayTimeout.stop (); displayTimeout.start (boost::bind (&ThumbScreen::thumbShowThumbnail, this), showDelay, showDelay + 500); } } else { displayTimeout.stop (); displayTimeout.start (boost::bind (&ThumbScreen::thumbShowThumbnail, this), showDelay, showDelay + 500); } } pointedWin = found; thumbUpdateThumbnail (); } else { if (displayTimeout.active ()) displayTimeout.stop (); pointedWin = NULL; showingThumb = false; cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); } } void ThumbWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { THUMB_SCREEN (screen); ts->thumbUpdateThumbnail (); window->resizeNotify (dx, dy, dwidth, dheight); } void ThumbScreen::handleEvent (XEvent *event) { screen->handleEvent (event); CompWindow *w; switch (event->type) { case PropertyNotify: if (event->xproperty.atom == Atoms::wmName) { w = screen->findWindow (event->xproperty.window); if (w && thumb.win == w && optionGetTitleEnabled ()) renderThumbText (&thumb, true); } break; case ButtonPress: { if (displayTimeout.active ()) displayTimeout.stop (); pointedWin = NULL; showingThumb = false; } break; case EnterNotify: w = screen->findWindow (event->xcrossing.window); if (w) { if (w->wmType () & CompWindowTypeDockMask) { if (dock != w) { dock = w; if (displayTimeout.active ()) displayTimeout.stop (); pointedWin = NULL; showingThumb = false; } if (!poller.active ()) poller.start (); } else { dock = NULL; if (displayTimeout.active ()) displayTimeout.stop (); pointedWin = NULL; showingThumb = false; if (poller.active ()) poller.stop (); } } break; case LeaveNotify: w = screen->findWindow (event->xcrossing.window); if (w && (w->wmType () & CompWindowTypeDockMask)) { dock = NULL; if (displayTimeout.active ()) displayTimeout.stop (); pointedWin = NULL; showingThumb = false; cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); if (poller.active ()) poller.stop (); } break; default: break; } } void ThumbScreen::paintTexture (const GLMatrix &transform, GLushort *color, int wx, int wy, int width, int height, int off) { GLfloat textureData[8]; GLfloat vertexData[12]; GLfloat wxPlusWidth = wx + width; GLfloat wyPlusHeight = wy + height; GLfloat wxPlusWPlusOff = wxPlusWidth + off; GLfloat wyPlusHPlusOff = wyPlusHeight + off; GLfloat wxMinusOff = wx - off; GLfloat wyMinusOff = wy - off; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 1; textureData[1] = 1; vertexData[0] = wx; vertexData[1] = wy; vertexData[2] = 0; vertexData[3] = wx; vertexData[4] = wyPlusHeight; vertexData[5] = 0; vertexData[6] = wxPlusWidth; vertexData[7] = wy; vertexData[8] = 0; vertexData[9] = wxPlusWidth; vertexData[10] = wyPlusHeight; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 1, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 0; textureData[1] = 0; textureData[2] = 0; textureData[3] = 1; textureData[4] = 1; textureData[5] = 0; textureData[6] = 1; textureData[7] = 1; vertexData[0] = wxMinusOff; vertexData[1] = wyMinusOff; vertexData[2] = 0; vertexData[3] = wxMinusOff; vertexData[4] = wy; vertexData[5] = 0; vertexData[6] = wx; vertexData[7] = wyMinusOff; vertexData[8] = 0; vertexData[9] = wx; vertexData[10] = wy; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 1; textureData[1] = 0; textureData[2] = 1; textureData[3] = 1; textureData[4] = 0; textureData[5] = 0; textureData[6] = 0; textureData[7] = 1; vertexData[0] = wxPlusWidth; vertexData[1] = wyMinusOff; vertexData[2] = 0; vertexData[3] = wxPlusWidth; vertexData[4] = wy; vertexData[5] = 0; vertexData[6] = wxPlusWPlusOff; vertexData[7] = wyMinusOff; vertexData[8] = 0; vertexData[9] = wxPlusWPlusOff; vertexData[10] = wy; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 0; textureData[1] = 1; textureData[2] = 0; textureData[3] = 0; textureData[4] = 1; textureData[5] = 1; textureData[6] = 1; textureData[7] = 0; vertexData[0] = wxMinusOff; vertexData[1] = wyPlusHeight; vertexData[2] = 0; vertexData[3] = wxMinusOff; vertexData[4] = wyPlusHPlusOff; vertexData[5] = 0; vertexData[6] = wx; vertexData[7] = wyPlusHeight; vertexData[8] = 0; vertexData[9] = wx; vertexData[10] = wyPlusHPlusOff; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 1; textureData[1] = 1; textureData[2] = 1; textureData[3] = 0; textureData[4] = 0; textureData[5] = 1; textureData[6] = 0; textureData[7] = 0; vertexData[0] = wxPlusWidth; vertexData[1] = wyPlusHeight; vertexData[2] = 0; vertexData[3] = wxPlusWidth; vertexData[4] = wyPlusHPlusOff; vertexData[5] = 0; vertexData[6] = wxPlusWPlusOff; vertexData[7] = wyPlusHeight; vertexData[8] = 0; vertexData[9] = wxPlusWPlusOff; vertexData[10] = wyPlusHPlusOff; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 1; textureData[1] = 0; textureData[2] = 1; textureData[3] = 1; textureData[4] = 1; textureData[5] = 0; textureData[6] = 1; textureData[7] = 1; vertexData[0] = wx; vertexData[1] = wyMinusOff; vertexData[2] = 0; vertexData[3] = wx; vertexData[4] = wy; vertexData[5] = 0; vertexData[6] = wxPlusWidth; vertexData[7] = wyMinusOff; vertexData[8] = 0; vertexData[9] = wxPlusWidth; vertexData[10] = wy; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 1; textureData[1] = 1; textureData[2] = 1; textureData[3] = 0; textureData[4] = 1; textureData[5] = 1; textureData[6] = 1; textureData[7] = 0; vertexData[0] = wx; vertexData[1] = wyPlusHeight; vertexData[2] = 0; vertexData[3] = wx; vertexData[4] = wyPlusHPlusOff; vertexData[5] = 0; vertexData[6] = wxPlusWidth; vertexData[7] = wyPlusHeight; vertexData[8] = 0; vertexData[9] = wxPlusWidth; vertexData[10] = wyPlusHPlusOff; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 0; textureData[1] = 1; textureData[2] = 0; textureData[3] = 1; textureData[4] = 1; textureData[5] = 1; textureData[6] = 1; textureData[7] = 1; vertexData[0] = wxMinusOff; vertexData[1] = wy; vertexData[2] = 0; vertexData[3] = wxMinusOff; vertexData[4] = wyPlusHeight; vertexData[5] = 0; vertexData[6] = wx; vertexData[7] = wy; vertexData[8] = 0; vertexData[9] = wx; vertexData[10] = wyPlusHeight; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 1; textureData[1] = 1; textureData[2] = 1; textureData[3] = 1; textureData[4] = 0; textureData[5] = 1; textureData[6] = 0; textureData[7] = 1; vertexData[0] = wxPlusWidth; vertexData[1] = wy; vertexData[2] = 0; vertexData[3] = wxPlusWidth; vertexData[4] = wyPlusHeight; vertexData[5] = 0; vertexData[6] = wxPlusWPlusOff; vertexData[7] = wy; vertexData[8] = 0; vertexData[9] = wxPlusWPlusOff; vertexData[10] = wyPlusHeight; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); } void ThumbScreen::thumbPaintThumb (Thumbnail *t, const GLMatrix *transform) { CompWindow *w = t->win; if (!w) return; GLWindow *gWindow = GLWindow::get (w); GLushort color[4]; int wx = t->x; int wy = t->y; GLWindowPaintAttrib sAttrib; unsigned int mask = PAINT_WINDOW_TRANSFORMED_MASK | PAINT_WINDOW_TRANSLUCENT_MASK; sAttrib = gWindow->paintAttrib (); /* Wrap drawWindowGeometry to make sure the general drawWindowGeometry function is used */ unsigned int addWindowGeometryIndex = gWindow->glAddGeometryGetCurrentIndex (); if (!gWindow->textures ().empty ()) { GLMatrix wTransform (*transform); GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); /* just enable blending if it is currently disabled */ if (!glBlendEnabled) glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); int off = t->offset; float backheight = t->height; // background/glow height float width = t->width; if (optionGetWindowLike ()) { color[0] = 1; color[1] = 1; color[2] = 1; color[3] = t->opacity * 65535; foreach (GLTexture *tex, windowTexture) { tex->enable (GLTexture::Good); paintTexture (*transform, color, wx, wy, width, backheight, off); tex->disable (); } } else { color[0] = optionGetThumbColorRed (); color[1] = optionGetThumbColorGreen (); color[2] = optionGetThumbColorBlue (); color[3] = optionGetThumbColorAlpha () * t->opacity; foreach (GLTexture *tex, glowTexture) { tex->enable (GLTexture::Good); paintTexture (*transform, color, wx, wy, width, backheight, off); tex->disable (); } } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); /* we disable blending only, if it was disabled before */ if (!glBlendEnabled) glDisable (GL_BLEND); if (t->text) { float ox = 0.0f; float height = backheight + t->text->getHeight () + optionGetTextDistance (); if (t->text->getWidth () < width) ox = (width - t->text->getWidth ()) / 2.0; t->text->draw (*transform, wx + ox, wy + height, t->opacity); } gScreen->setTexEnvMode (GL_REPLACE); sAttrib.opacity *= t->opacity; sAttrib.yScale = t->scale; sAttrib.xScale = t->scale; sAttrib.xTranslate = wx - w->x () + w->border ().left * sAttrib.xScale; sAttrib.yTranslate = wy - w->y () + w->border ().top * sAttrib.yScale; GLenum filter = gScreen->textureFilter (); /* we just need to change the texture filter, if * thumbnail mipmapping is enabled */ if (optionGetMipmap ()) gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); wTransform.translate (w->x (), w->y (), 0.0f); wTransform.scale (sAttrib.xScale, sAttrib.yScale, 1.0f); wTransform.translate (sAttrib.xTranslate / sAttrib.xScale - w->x (), sAttrib.yTranslate / sAttrib.yScale - w->y (), 0.0f); /* XXX: replacing the addWindowGeometry function like this is very ugly but necessary until the vertex stage has been made fully pluggable. */ gWindow->glAddGeometrySetCurrentIndex (MAXSHORT); gWindow->glDraw (wTransform, sAttrib, infiniteRegion, mask); gScreen->setTextureFilter (filter); } gWindow->glAddGeometrySetCurrentIndex (addWindowGeometryIndex); } /* From here onwards */ void ThumbScreen::preparePaint (int ms) { float val = ms; val /= 1000; val /= optionGetFadeSpeed (); /*if (screen->otherGrabExist ("")) // shouldn't there be a s->grabs.empty () or something? { dock = NULL; if (displayTimeout.active ()) { displayTimeout.stop (); } pointedWin = 0; showingThumb = false; }*/ if (showingThumb && thumb.win == pointedWin) thumb.opacity = MIN (1.0, thumb.opacity + val); if (!showingThumb || thumb.win != pointedWin) { thumb.opacity = MAX (0.0, thumb.opacity - val); if (thumb.opacity == 0.0) thumb.win = NULL; } if (oldThumb.opacity > 0.0f) { oldThumb.opacity = MAX (0.0, oldThumb.opacity - val); if (oldThumb.opacity == 0.0) { damageThumbRegion (&oldThumb); freeThumbText (&oldThumb); oldThumb.win = NULL; } } if (oldThumb.win == NULL && thumb.win == NULL) { cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); } cScreen->preparePaint (ms); } void ThumbScreen::donePaint () { std::vector damageThumbs; if (thumb.opacity) damageThumbs.push_back (&thumb); if (oldThumb.opacity) damageThumbs.push_back (&oldThumb); if (!damageThumbs.empty ()) { foreach (Thumbnail *t, damageThumbs) damageThumbRegion (t); } else { cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); } cScreen->donePaint (); } bool ThumbScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { unsigned int newMask = mask; painted = false; x = screen->vp ().x (); y = screen->vp ().y (); if ((oldThumb.opacity > 0.0 && oldThumb.win) || (thumb.opacity > 0.0 && thumb.win)) newMask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; bool status = gScreen->glPaintOutput (attrib, transform, region, output, newMask); if (optionGetAlwaysOnTop () && !painted) { if (oldThumb.opacity > 0.0 && oldThumb.win) { GLMatrix sTransform = transform; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); thumbPaintThumb (&oldThumb, &sTransform); } if (thumb.opacity > 0.0 && thumb.win) { GLMatrix sTransform = transform; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); thumbPaintThumb (&thumb, &sTransform); } } return status; } void ThumbScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { gScreen->glPaintTransformedOutput (attrib, transform, region, output, mask); if (optionGetAlwaysOnTop () && x == screen->vp ().x () && y == screen->vp ().y ()) { painted = true; if (oldThumb.opacity && oldThumb.win) { GLMatrix sTransform = transform; gScreen->glApplyTransform (attrib, output, &sTransform); sTransform.toScreenSpace(output, -attrib.zTranslate); thumbPaintThumb (&oldThumb, &sTransform); } if (thumb.opacity && thumb.win) { GLMatrix sTransform = transform; gScreen->glApplyTransform (attrib, output, &sTransform); sTransform.toScreenSpace(output, -attrib.zTranslate); thumbPaintThumb (&thumb, &sTransform); } } } bool ThumbWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { THUMB_SCREEN (screen); bool status = gWindow->glPaint (attrib, transform, region, mask); if (!ts->optionGetAlwaysOnTop () && ts->x == screen->vp ().x () && ts->y == screen->vp ().y ()) { GLMatrix sTransform = transform; if (ts->oldThumb.opacity && ts->oldThumb.win && ts->oldThumb.dock == window) ts->thumbPaintThumb (&ts->oldThumb, &sTransform); if (ts->thumb.opacity && ts->thumb.win && ts->thumb.dock == window) ts->thumbPaintThumb (&ts->thumb, &sTransform); } return status; } bool ThumbWindow::damageRect (bool initial, const CompRect &rect) { THUMB_SCREEN (screen); if (ts->thumb.win == window && ts->thumb.opacity) ts->damageThumbRegion (&ts->thumb); if (ts->oldThumb.win == window && ts->oldThumb.opacity) ts->damageThumbRegion (&ts->oldThumb); return cWindow->damageRect (initial, rect); } ThumbScreen::ThumbScreen (CompScreen *screen) : PluginClassHandler (screen), gScreen (GLScreen::get (screen)), cScreen (CompositeScreen::get (screen)), dock (NULL), pointedWin (NULL), showingThumb (false), painted (false), glowTexture (GLTexture::imageDataToTexture (glowTex, CompSize (32, 32), GL_RGBA, GL_UNSIGNED_BYTE)), windowTexture (GLTexture::imageDataToTexture (windowTex, CompSize (32, 32), GL_RGBA, GL_UNSIGNED_BYTE)), x (0), y (0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); thumb.win = NULL; oldThumb.win = NULL; thumb.text = NULL; oldThumb.text = NULL; thumb.opacity = 0.0f; oldThumb.opacity = 0.0f; poller.setCallback (boost::bind (&ThumbScreen::positionUpdate, this, _1)); } ThumbScreen::~ThumbScreen () { poller.stop (); displayTimeout.stop (); freeThumbText (&thumb); freeThumbText (&oldThumb); } ThumbWindow::ThumbWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)) { WindowInterface::setHandler (window, false); CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); } ThumbWindow::~ThumbWindow () { THUMB_SCREEN (screen); if (ts->thumb.win == window) { ts->damageThumbRegion (&ts->thumb); ts->thumb.win = NULL; ts->thumb.opacity = 0; } if (ts->oldThumb.win == window) { ts->damageThumbRegion (&ts->oldThumb); ts->oldThumb.win = NULL; ts->oldThumb.opacity = 0; } if (ts->pointedWin == window) ts->pointedWin = NULL; } bool ThumbPluginVTable::init () { if (CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) textPluginLoaded = true; else textPluginLoaded = false; if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("mousepoll", COMPIZ_MOUSEPOLL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/thumbnail/src/thumbnail.h0000644000015301777760000001017512321343002024065 0ustar pbusernogroup00000000000000/* * * Compiz thumbnail plugin * * thumbnail.cpp * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * Based on thumbnail.c: * Copyright : (C) 2007 Stjepan Glavina * E-mail : stjepang@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ /* TODO: * - Make Thumbnail it's own class with methods * - Make a Thumbnail container class - this is where the window / glow texture is drawn * - Set KDE Thumbnail property * - Set Compiz Thumbnail property (for plugins like peek) */ #include #include #include #include #include #include #include #include "thumbnail_options.h" #define THUMB_SCREEN(s) \ ThumbScreen *ts = ThumbScreen::get (s) #define THUMB_WINDOW(w) \ ThumbWindow *tw = ThumbWindow::get (w) bool textPluginLoaded; typedef struct _Thumbnail { int x; int y; int width; int height; float scale; float opacity; int offset; CompWindow *win; CompWindow *dock; CompText *text; bool textValid; } Thumbnail; class ThumbScreen: public PluginClassHandler , public ScreenInterface, public GLScreenInterface, public CompositeScreenInterface, public ThumbnailOptions { public: ThumbScreen (CompScreen *sceen); ~ThumbScreen (); void handleEvent (XEvent *); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void freeThumbText (Thumbnail *t); void renderThumbText (Thumbnail *t, bool freeThumb); void damageThumbRegion (Thumbnail *t); void thumbUpdateThumbnail (); bool thumbShowThumbnail (); bool checkPosition (CompWindow *w); void positionUpdate (const CompPoint &pos); void paintTexture (const GLMatrix &transform, GLushort *color, int wx, int wy, int width, int height, int off); void thumbPaintThumb (Thumbnail *t, const GLMatrix *transform); GLScreen *gScreen; CompositeScreen *cScreen; CompWindow *dock; CompWindow *pointedWin; bool showingThumb; Thumbnail thumb; Thumbnail oldThumb; bool painted; CompTimer displayTimeout; GLTexture::List glowTexture; GLTexture::List windowTexture; int x; int y; MousePoller poller; }; class ThumbWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: ThumbWindow (CompWindow *window); ~ThumbWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask); void resizeNotify (int dx, int dy, int dwidth, int dheight); bool damageRect (bool initial, const CompRect &rect); }; class ThumbPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/thumbnail/thumbnail.xml.in0000755000015301777760000001160312321343002024254 0ustar pbusernogroup00000000000000 <_short>Thumbnail Window Previews <_long>Live window thumbnails at the dock, launcher or taskbar Extras opengl mousepoll text decor opengl mousepoll <_short>General <_short>Dock / Launcher / Taskbar <_short>Window Title Text compiz-0.9.11+14.04.20140409/plugins/gears/0000755000015301777760000000000012321344021020256 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/gears/gears.xml.in0000644000015301777760000000075312321343002022511 0ustar pbusernogroup00000000000000 <_short>Cube Gears <_long>Render gears inside of the transparent cube Effects composite opengl cube cube opengl compiz-0.9.11+14.04.20140409/plugins/gears/CMakeLists.txt0000644000015301777760000000015712321343002023017 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (gears PLUGINDEPS composite opengl cube) compiz-0.9.11+14.04.20140409/plugins/gears/src/0000755000015301777760000000000012321344021021045 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/gears/src/gears.cpp0000644000015301777760000002462112321343002022655 0ustar pbusernogroup00000000000000/* * Compiz cube gears plugin * * gears.cpp * * This is an example plugin to show how to render something inside * of the transparent cube * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * * Based on glxgears.c: * http://cvsweb.xfree86.org/cvsweb/xc/programs/glxgears/glxgears.c */ #include "gears.h" COMPIZ_PLUGIN_20090315 (gears, GearsPluginVTable); static void gear (GLfloat inner_radius, GLfloat outer_radius, GLfloat width, GLint teeth, GLfloat tooth_depth) { GLint i; GLfloat r0, r1, r2, maxr2, minr2; GLfloat angle, da; GLfloat u, v, len; r0 = inner_radius; r1 = outer_radius - tooth_depth / 2.0; maxr2 = r2 = outer_radius + tooth_depth / 2.0; minr2 = r2; da = 2.0 * M_PI / teeth / 4.0; glShadeModel (GL_SMOOTH); /* draw inside radius cylinder */ glBegin (GL_QUAD_STRIP); for (i = 0; i <= teeth; i++) { angle = i * 2.0 * M_PI / teeth; glNormal3f (-cos (angle), -sin (angle), 0.0); glVertex3f (r0 * cos (angle), r0 * sin (angle), -width * 0.5); glVertex3f (r0 * cos (angle), r0 * sin (angle), width * 0.5); } glEnd(); glShadeModel (GL_FLAT); glNormal3f (0.0, 0.0, 1.0); /* draw front face */ glBegin (GL_QUAD_STRIP); for (i = 0; i <= teeth; i++) { angle = i * 2.0 * M_PI / teeth; glVertex3f (r0 * cos (angle), r0 * sin (angle), width * 0.5); glVertex3f (r1 * cos (angle), r1 * sin (angle), width * 0.5); if (i < teeth) { glVertex3f (r0 * cos (angle), r0 * sin (angle), width * 0.5); glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), width * 0.5); } } glEnd(); /* draw front sides of teeth */ glBegin (GL_QUADS); for (i = 0; i < teeth; i++) { angle = i * 2.0 * M_PI / teeth; glVertex3f (r1 * cos (angle), r1 * sin (angle), width * 0.5); glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), width * 0.5); glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), width * 0.5); glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), width * 0.5); r2 = minr2; } r2 = maxr2; glEnd(); glNormal3f (0.0, 0.0, -1.0); /* draw back face */ glBegin (GL_QUAD_STRIP); for (i = 0; i <= teeth; i++) { angle = i * 2.0 * M_PI / teeth; glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * 0.5); glVertex3f (r0 * cos (angle), r0 * sin (angle), -width * 0.5); if (i < teeth) { glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), -width * 0.5); glVertex3f (r0 * cos (angle), r0 * sin (angle), -width * 0.5); } } glEnd(); /* draw back sides of teeth */ glBegin (GL_QUADS); da = 2.0 * M_PI / teeth / 4.0; for (i = 0; i < teeth; i++) { angle = i * 2.0 * M_PI / teeth; glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), -width * 0.5); glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), -width * 0.5); glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), -width * 0.5); glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * 0.5); r2 = minr2; } r2 = maxr2; glEnd(); /* draw outward faces of teeth */ glBegin (GL_QUAD_STRIP); for (i = 0; i < teeth; i++) { angle = i * 2.0 * M_PI / teeth; glVertex3f (r1 * cos (angle), r1 * sin (angle), width * 0.5); glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * 0.5); u = r2 * cos (angle + da) - r1 * cos (angle); v = r2 * sin (angle + da) - r1 * sin (angle); len = sqrt (u * u + v * v); u /= len; v /= len; glNormal3f (v, -u, 0.0); glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), width * 0.5); glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), -width * 0.5); glNormal3f (cos (angle + 1.5 * da), sin (angle + 1.5 * da), 0.0); glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), width * 0.5); glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), -width * 0.5); u = r1 * cos (angle + 3 * da) - r2 * cos (angle + 2 * da); v = r1 * sin (angle + 3 * da) - r2 * sin (angle + 2 * da); glNormal3f (v, -u, 0.0); glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), width * 0.5); glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), -width * 0.5); glNormal3f (cos (angle + 3.5 * da), sin (angle + 3.5 * da), 0.0); r2 = minr2; } r2 = maxr2; glVertex3f (r1 * cos (0), r1 * sin (0), width * 0.5); glVertex3f (r1 * cos (0), r1 * sin (0), -width * 0.5); glEnd(); } void GearsScreen::cubeClearTargetOutput (float xRotate, float vRotate) { csScreen->cubeClearTargetOutput (xRotate, vRotate); glClear (GL_DEPTH_BUFFER_BIT); } void GearsScreen::cubePaintInside (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) { /* we do not want to paint 3d gears if the camera is inside * the cube, because the gears would obstruct our view */ if (csScreen->invert () == -1) { /* it is enough to print the warning once */ if (!warningPrinted) { compLogMessage ("gears", CompLogLevelWarn, "Gears are disabled when viewing the cube from the inside"); warningPrinted = true; } return; } // CUBE_SCREEN (screen); static GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 }; GLScreenPaintAttrib sA = sAttrib; sA.yRotate += csScreen->invert () * (360.0f / size) * (csScreen->xRotations () - (screen->vp ().x () * csScreen->nOutput ())); //CompTransform mT = *transform; GLMatrix mT = transform; gScreen->glApplyTransform (sA, output, &mT); // (*s->applyScreenTransform) (s, &sA, output, &mT); glPushMatrix(); glLoadMatrixf (mT.getMatrix ()); glTranslatef (csScreen->outputXOffset (), -csScreen->outputYOffset (), 0.0f); glScalef (csScreen->outputXScale (), csScreen->outputYScale (), 1.0f); bool enabledCull = false; glPushAttrib (GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT); glDisable (GL_BLEND); if (!glIsEnabled (GL_CULL_FACE) ) { enabledCull = true; glEnable (GL_CULL_FACE); } glPushMatrix(); glRotatef (contentRotation, 0.0, 1.0, 0.0); glScalef (0.05, 0.05, 0.05); glColor4usv (defaultColor); glEnable (GL_NORMALIZE); glEnable (GL_LIGHTING); glEnable (GL_LIGHT1); glDisable (GL_COLOR_MATERIAL); glEnable (GL_DEPTH_TEST); glDepthMask (GL_TRUE); glDepthFunc (GL_LESS); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glPushMatrix(); glTranslatef (-3.0, -2.0, 0.0); glRotatef (angle, 0.0, 0.0, 1.0); glCallList (gear1); glPopMatrix(); glPushMatrix(); glTranslatef (3.1, -2.0, 0.0); glRotatef (-2.0 * angle - 9.0, 0.0, 0.0, 1.0); glCallList (gear2); glPopMatrix(); glPushMatrix(); glTranslatef (-3.1, 4.2, 0.0); glRotatef (-2.0 * angle - 25.0, 0.0, 0.0, 1.0); glCallList (gear3); glPopMatrix(); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, white); glPopMatrix(); glDisable (GL_LIGHT1); glDisable (GL_NORMALIZE); glEnable (GL_COLOR_MATERIAL); if (!gScreen->lighting ()) glDisable (GL_LIGHTING); glDisable (GL_DEPTH_TEST); if (enabledCull) glDisable (GL_CULL_FACE); glPopMatrix(); glPopAttrib(); damage = true; csScreen->cubePaintInside (sAttrib, transform, output, size, normal); } void GearsScreen::preparePaint (int ms) { contentRotation += ms * 360.0 / 20000.0; contentRotation = fmod (contentRotation, 360.0); angle += ms * 360.0 / 8000.0; angle = fmod (angle, 360.0); a1 += ms * 360.0 / 3000.0; a1 = fmod (a1, 360.0); a2 += ms * 360.0 / 2000.0; a2 = fmod (a2, 360.0); a3 += ms * 360.0 / 1000.0; a3 = fmod (a3, 360.0); cScreen->preparePaint (ms); } void GearsScreen::donePaint () { if (damage) { cScreen->damageScreen (); damage = false; } cScreen->donePaint (); } GearsScreen::GearsScreen (CompScreen *screen) : PluginClassHandler (screen), screen (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), csScreen (CubeScreen::get (screen)), damage(false), warningPrinted (false), contentRotation(0.0), angle(0.0), a1(0.0), a2(0.0), a3(0.0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); CubeScreenInterface::setHandler (csScreen); static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 }; static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; static GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 0.3f }; static GLfloat diffuseLight[] = { 0.5f, 0.5f, 0.5f, 0.5f }; glLightfv (GL_LIGHT1, GL_AMBIENT, ambientLight); glLightfv (GL_LIGHT1, GL_DIFFUSE, diffuseLight); glLightfv (GL_LIGHT1, GL_POSITION, pos); gear1 = glGenLists (1); glNewList (gear1, GL_COMPILE); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); gear (1.0, 4.0, 1.0, 20, 0.7); glEndList(); gear2 = glGenLists (1); glNewList (gear2, GL_COMPILE); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); gear (0.5, 2.0, 2.0, 10, 0.7); glEndList(); gear3 = glGenLists (1); glNewList (gear3, GL_COMPILE); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); gear (1.3, 2.0, 0.5, 10, 0.7); glEndList(); } GearsScreen::~GearsScreen () { glDeleteLists (gear1, 1); glDeleteLists (gear2, 1); glDeleteLists (gear3, 1); } bool GearsPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/gears/src/gears.h0000644000015301777760000000426212321343002022321 0ustar pbusernogroup00000000000000/* * Compiz cube gears plugin * * gears.h * * This is an example plugin to show how to render something inside * of the transparent cube * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * * Based on glxgears.c: * http://cvsweb.xfree86.org/cvsweb/xc/programs/glxgears/glxgears.c */ #include #include #include #include #include #include #include #include #include #include #include #include "gears_options.h" class GearsScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public CubeScreenInterface, public PluginClassHandler , public GearsOptions { public: GearsScreen (CompScreen *s); ~GearsScreen (); CompScreen *screen; CompositeScreen *cScreen; GLScreen *gScreen; CubeScreen *csScreen; void cubeClearTargetOutput (float xRotate, float vRotate); void cubePaintInside (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal); void preparePaint (int); void donePaint (); private: bool damage; bool warningPrinted; float contentRotation; GLuint gear1, gear2, gear3; float angle; float a1, a2, a3; }; #define GET_GEARS_SCREEN (screen) \ GearsScreen *es = GearsScreen::get (screen); class GearsPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/obs/0000755000015301777760000000000012321344021017740 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/obs/CMakeLists.txt0000644000015301777760000000014612321343002022477 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(obs PLUGINDEPS composite opengl)compiz-0.9.11+14.04.20140409/plugins/obs/src/0000755000015301777760000000000012321344021020527 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/obs/src/obs.h0000644000015301777760000000567412321343002021475 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include #include #include #include #include "obs_options.h" extern const unsigned short MODIFIER_OPACITY; extern const unsigned short MODIFIER_SATURATION; extern const unsigned short MODIFIER_BRIGHTNESS; const unsigned short MODIFIER_COUNT = 3; class ObsScreen : public ScreenInterface, public PluginClassHandler , public ObsOptions { public: ObsScreen (CompScreen *); bool setOption (const CompString &name, CompOption::Value &value); void matchPropertyChanged (CompWindow *); void matchExpHandlerChanged (); CompOption *stepOptions[MODIFIER_COUNT]; CompOption *matchOptions[MODIFIER_COUNT]; CompOption *valueOptions[MODIFIER_COUNT]; }; class ObsWindow : public GLWindowInterface, public PluginClassHandler { public: ObsWindow (CompWindow *); ~ObsWindow (); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); void glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask); void changePaintModifier (unsigned int, int); void updatePaintModifier (unsigned int); void modifierChanged (unsigned int); bool updateTimeout (); private: CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; ObsScreen *oScreen; int customFactor[MODIFIER_COUNT]; int matchFactor[MODIFIER_COUNT]; CompTimer updateHandle; }; class ObsPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/obs/src/obs.cpp0000644000015301777760000002155312321343002022022 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include "obs.h" COMPIZ_PLUGIN_20090315 (obs, ObsPluginVTable); const unsigned short MODIFIER_OPACITY = 0; const unsigned short MODIFIER_SATURATION = 1; const unsigned short MODIFIER_BRIGHTNESS = 2; void ObsWindow::changePaintModifier (unsigned int modifier, int direction) { if (window->overrideRedirect () || (modifier == MODIFIER_OPACITY && (window->type () & CompWindowTypeDesktopMask))) return; int step = oScreen->stepOptions[modifier]->value ().i (); int value = customFactor[modifier] + (step * direction); value = MAX (MIN (value, 100), step); if (value != customFactor[modifier]) { customFactor[modifier] = value; modifierChanged (modifier); } } void ObsWindow::updatePaintModifier (unsigned int modifier) { int lastFactor = customFactor[modifier]; if (modifier == MODIFIER_OPACITY && (window->type ()& CompWindowTypeDesktopMask)) { customFactor[modifier] = 100; matchFactor[modifier] = 100; } else { CompOption::Value::Vector *matches, *values; matches = &oScreen->matchOptions[modifier]->value ().list (); values = &oScreen->valueOptions[modifier]->value ().list (); int min = MIN (matches->size (), values->size ()); int lastMatchFactor = matchFactor[modifier]; matchFactor[modifier] = 100; for (int i = 0; i < min; ++i) { if (matches->at (i).match ().evaluate (window)) { matchFactor[modifier] = values->at (i).i (); break; } } if (customFactor[modifier] == lastMatchFactor) customFactor[modifier] = matchFactor[modifier]; } if (customFactor[modifier] != lastFactor) modifierChanged (modifier); } void ObsWindow::modifierChanged (unsigned int modifier) { bool hasCustom = false; if (modifier == MODIFIER_OPACITY) gWindow->glPaintSetEnabled (this, customFactor[modifier] != 100); for (unsigned int i = 0; i < MODIFIER_COUNT; ++i) { if (customFactor[i] != 100) { hasCustom = true; break; } } gWindow->glDrawTextureSetEnabled (this, hasCustom); cWindow->addDamage (); } static bool alterPaintModifier (CompAction *action, CompAction::State state, CompOption::Vector& options, unsigned int modifier, int direction) { CompWindow *w; Window xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findTopLevelWindow (xid); if (w) ObsWindow::get (w)->changePaintModifier (modifier, direction); return true; } bool ObsWindow::glPaint (const GLWindowPaintAttrib& attrib, const GLMatrix& transform, const CompRegion& region, unsigned int mask) { mask |= PAINT_WINDOW_TRANSLUCENT_MASK; return gWindow->glPaint (attrib, transform, region, mask); } /* Note: Normally plugins should wrap into glPaint to modify opacity, brightness and saturation. As some plugins bypass glPaint when they draw windows and our custom values always need to be applied, we wrap into glDrawTexture here */ void ObsWindow::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { GLWindowPaintAttrib wAttrib (attrib); int factor = customFactor[MODIFIER_OPACITY]; if (factor != 100) { wAttrib.opacity = factor * wAttrib.opacity / 100; mask |= PAINT_WINDOW_TRANSLUCENT_MASK; } factor = customFactor[MODIFIER_BRIGHTNESS]; if (factor != 100) wAttrib.brightness = factor * wAttrib.brightness / 100; factor = customFactor[MODIFIER_SATURATION]; if (factor != 100) wAttrib.saturation = factor * wAttrib.saturation / 100; return gWindow->glDrawTexture (texture, transform, wAttrib, mask); } void ObsScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); /* match options are up to date after the call to matchExpHandlerChanged */ foreach (CompWindow *w, screen->windows ()) { for (unsigned int i = 0; i < MODIFIER_COUNT; ++i) ObsWindow::get (w)->updatePaintModifier (i); } } void ObsScreen::matchPropertyChanged (CompWindow *w) { for (unsigned int i = 0; i < MODIFIER_COUNT; ++i) ObsWindow::get (w)->updatePaintModifier (i); screen->matchPropertyChanged (w); } #define MODIFIERBIND(modifier, direction) \ boost::bind (alterPaintModifier, _1, _2, _3, modifier, direction) ObsScreen::ObsScreen (CompScreen *s) : PluginClassHandler (s) { ScreenInterface::setHandler (screen); unsigned int mod = MODIFIER_OPACITY; stepOptions[mod] = &mOptions[ObsOptions::OpacityStep]; matchOptions[mod] = &mOptions[ObsOptions::OpacityMatches]; valueOptions[mod] = &mOptions[ObsOptions::OpacityValues]; mod = MODIFIER_SATURATION; stepOptions[mod] = &mOptions[ObsOptions::SaturationStep]; matchOptions[mod] = &mOptions[ObsOptions::SaturationMatches]; valueOptions[mod] = &mOptions[ObsOptions::SaturationValues]; mod = MODIFIER_BRIGHTNESS; stepOptions[mod] = &mOptions[ObsOptions::BrightnessStep]; matchOptions[mod] = &mOptions[ObsOptions::BrightnessMatches]; valueOptions[mod] = &mOptions[ObsOptions::BrightnessValues]; optionSetOpacityIncreaseKeyInitiate (MODIFIERBIND (MODIFIER_OPACITY, 1)); optionSetOpacityIncreaseButtonInitiate (MODIFIERBIND (MODIFIER_OPACITY, 1)); optionSetOpacityDecreaseKeyInitiate (MODIFIERBIND (MODIFIER_OPACITY, -1)); optionSetOpacityDecreaseButtonInitiate (MODIFIERBIND (MODIFIER_OPACITY, -1)); optionSetSaturationIncreaseKeyInitiate (MODIFIERBIND (MODIFIER_SATURATION, 1)); optionSetSaturationIncreaseButtonInitiate (MODIFIERBIND (MODIFIER_SATURATION, 1)); optionSetSaturationDecreaseKeyInitiate (MODIFIERBIND (MODIFIER_SATURATION, -1)); optionSetSaturationDecreaseButtonInitiate (MODIFIERBIND (MODIFIER_SATURATION, -1)); optionSetBrightnessIncreaseKeyInitiate (MODIFIERBIND (MODIFIER_BRIGHTNESS, 1)); optionSetBrightnessIncreaseButtonInitiate (MODIFIERBIND (MODIFIER_BRIGHTNESS, 1)); optionSetBrightnessDecreaseKeyInitiate (MODIFIERBIND (MODIFIER_BRIGHTNESS, -1)); optionSetBrightnessDecreaseButtonInitiate (MODIFIERBIND (MODIFIER_BRIGHTNESS, -1)); } bool ObsWindow::updateTimeout () { for (int i = 0; i < MODIFIER_COUNT; ++i) updatePaintModifier (i); return false; } bool ObsScreen::setOption (const CompString &name, CompOption::Value &value) { CompOption *o; if (!ObsOptions::setOption (name, value)) return false; o = CompOption::findOption (getOptions (), name, NULL); if (!o) return false; for (unsigned int i = 0; i < MODIFIER_COUNT; ++i) { if (o == matchOptions[i] || o == valueOptions[i]) { foreach (CompWindow *w, screen->windows ()) ObsWindow::get (w)->updatePaintModifier (i); } } return true; } ObsWindow::ObsWindow (CompWindow *w) : PluginClassHandler (w), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), oScreen (ObsScreen::get (screen)) { GLWindowInterface::setHandler (gWindow, false); for (unsigned int i = 0; i < MODIFIER_COUNT; ++i) { customFactor[i] = 100; matchFactor[i] = 100; /* defer initializing the factors from window matches as match evalution * means wrapped function calls */ updateHandle.setTimes (0, 0); updateHandle.setCallback (boost::bind (&ObsWindow::updateTimeout, this)); updateHandle.start (); } } ObsWindow::~ObsWindow () { updateHandle.stop (); } bool ObsPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/obs/obs.xml.in0000644000015301777760000001253712321343002021660 0ustar pbusernogroup00000000000000 <_short>Opacity, Brightness and Saturation <_long>Per window adjustments of opacity, brightness and saturation Accessibility opengl blur <_short>Opacity <_short>Window Specific Settings <_short>Brightness <_short>Window Specific Settings <_short>Saturation <_short>Window Specific Settings compiz-0.9.11+14.04.20140409/plugins/scaleaddon/0000755000015301777760000000000012321344021021252 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/scaleaddon/scaleaddon.xml.in0000644000015301777760000001272412321343002024502 0ustar pbusernogroup00000000000000 <_short>Scale Addons <_long>Some useful additions to the scale plugin Utility composite opengl scale text decor opengl scale <_short>Bindings <_short>Appearance <_short>Window Title <_short>Window Highlight <_short>Behaviour <_short>Natural Scale Mode <_short>Window Pull compiz-0.9.11+14.04.20140409/plugins/scaleaddon/CMakeLists.txt0000644000015301777760000000017212321343002024010 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (scaleaddon PLUGINDEPS composite opengl text scale) compiz-0.9.11+14.04.20140409/plugins/scaleaddon/src/0000755000015301777760000000000012321344021022041 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/scaleaddon/src/scaleaddon.cpp0000644000015301777760000010472712321343002024653 0ustar pbusernogroup00000000000000/* * * Compiz scale plugin addon plugin * * scaleaddon.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Organic scale mode taken from Beryl's scale.c, written by * Copyright : (C) 2006 Diogo Ferreira * E-mail : diogo@underdev.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * */ #include "scaleaddon.h" #include COMPIZ_PLUGIN_20090315 (scaleaddon, ScaleAddonPluginVTable); bool textAvailable; void ScaleAddonWindow::renderTitle () { ADDON_SCREEN (screen); int titleOpt = as->optionGetWindowTitle (); if (!textAvailable || titleOpt == ScaleaddonOptions::WindowTitleNoDisplay || !sWindow->hasSlot () || (titleOpt == ScaleaddonOptions::WindowTitleHighlightedWindowOnly && as->highlightedWindow != window->id ())) return; text.clear (); CompText::Attrib attrib; float scale = sWindow->getSlot ().scale; attrib.maxWidth = window->width () * scale; attrib.maxHeight = window->height () * scale; attrib.family = "Sans"; attrib.size = as->optionGetTitleSize (); attrib.color[0] = as->optionGetFontColorRed (); attrib.color[1] = as->optionGetFontColorGreen (); attrib.color[2] = as->optionGetFontColorBlue (); attrib.color[3] = as->optionGetFontColorAlpha (); attrib.flags = CompText::WithBackground | CompText::Ellipsized; if (as->optionGetTitleBold ()) attrib.flags |= CompText::StyleBold; attrib.bgHMargin = as->optionGetBorderSize (); attrib.bgVMargin = as->optionGetBorderSize (); attrib.bgColor[0] = as->optionGetBackColorRed (); attrib.bgColor[1] = as->optionGetBackColorGreen (); attrib.bgColor[2] = as->optionGetBackColorBlue (); attrib.bgColor[3] = as->optionGetBackColorAlpha (); text.renderWindowTitle (window->id (), as->sScreen->getType () == ScaleTypeAll, attrib); } void ScaleAddonWindow::drawTitle (const GLMatrix &transform) { ScalePosition pos = sWindow->getCurrentPosition (); CompRect geom = window->borderRect (); float width = text.getWidth (); float height = text.getHeight (); float x = pos.x () + window->x () + geom.width () * pos.scale / 2 - width / 2; float y = pos.y () + window->y () + geom.height () * pos.scale / 2 - height / 2; text.draw (transform, floor (x), floor (y), 1.0f); } void ScaleAddonWindow::drawHighlight (const GLMatrix &transform) { if (rescaled) return; GLint oldBlendSrc, oldBlendDst; GLushort colorData[4]; GLfloat vertexData[12]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); ScalePosition pos = sWindow->getCurrentPosition (); CompRect geom = window->borderRect (); ADDON_SCREEN (screen); #ifdef USE_GLES GLint oldBlendSrcAlpha, oldBlendDstAlpha; #endif float x = pos.x () + window->x () - (window->border ().left * pos.scale); float y = pos.y () + window->y () - (window->border ().top * pos.scale); float width = geom.width () * pos.scale; float height = geom.height () * pos.scale; /* we use a poor replacement for roundf() * (available in C99 only) here */ x = floor (x + 0.5f); y = floor (y + 0.5f); #ifdef USE_GLES glGetIntegerv (GL_BLEND_SRC_RGB, &oldBlendSrc); glGetIntegerv (GL_BLEND_DST_RGB, &oldBlendDst); glGetIntegerv (GL_BLEND_SRC_ALPHA, &oldBlendSrcAlpha); glGetIntegerv (GL_BLEND_DST_ALPHA, &oldBlendDstAlpha); #else GLboolean wasBlend = glIsEnabled (GL_BLEND); glGetIntegerv (GL_BLEND_SRC, &oldBlendSrc); glGetIntegerv (GL_BLEND_DST, &oldBlendDst); if (!wasBlend) glEnable (GL_BLEND); #endif glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = as->optionGetHighlightColorRed (); colorData[1] = as->optionGetHighlightColorGreen (); colorData[2] = as->optionGetHighlightColorBlue (); colorData[3] = as->optionGetHighlightColorAlpha (); streamingBuffer->addColors (1, colorData); vertexData[0] = x; vertexData[1] = y; vertexData[2] = 0.0f; vertexData[3] = x; vertexData[4] = y + height; vertexData[5] = 0.0f; vertexData[6] = x + width; vertexData[7] = y; vertexData[8] = 0.0f; vertexData[9] = x + width; vertexData[10] = y + height; vertexData[11] = 0.0f; streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (transform); #ifdef USE_GLES glBlendFuncSeparate (oldBlendSrc, oldBlendDst, oldBlendSrcAlpha, oldBlendDstAlpha); #else if (!wasBlend) glDisable (GL_BLEND); glBlendFunc (oldBlendSrc, oldBlendDst); #endif } void ScaleAddonScreen::checkWindowHighlight () { if (highlightedWindow != lastHighlightedWindow) { CompWindow *w = screen->findWindow (highlightedWindow); if (w) { ADDON_WINDOW (w); aw->renderTitle (); aw->cWindow->addDamage (); } w = screen->findWindow (lastHighlightedWindow); if (w) { ADDON_WINDOW (w); aw->renderTitle (); aw->cWindow->addDamage (w); } lastHighlightedWindow = highlightedWindow; } } bool ScaleAddonScreen::closeWindow (CompAction *action, CompAction::State state, CompOption::Vector options) { if (!sScreen->hasGrab ()) return false; CompWindow *w = screen->findWindow (highlightedWindow); if (w) w->close (screen->getCurrentTime ()); return true; } bool ScaleAddonScreen::pullWindow (CompAction *action, CompAction::State state, CompOption::Vector options) { if (!sScreen->hasGrab ()) return false; CompWindow *w = screen->findWindow (highlightedWindow); if (w) { CompPoint vp = w->defaultViewport (); int xOffset = (screen->vp ().x () - vp.x ()) * screen->width (); int yOffset = (screen->vp ().y () - vp.y ()) * screen->height (); int x = w->x () + xOffset; int y = w->y () + yOffset; if (optionGetConstrainPullToScreen ()) { CompRect workArea, extents; workArea = screen->outputDevs ()[w->outputDevice ()].workArea (); extents = w->borderRect (); extents.setX (extents.x () + xOffset); extents.setY (extents.y () + yOffset); if (extents.x1 () < workArea.x1 ()) x += workArea.x1 () - extents.x1 (); else if (extents.x2 () > workArea.x2 ()) x += workArea.x2 () - extents.x2 (); if (extents.y1 () < workArea.y1 ()) y += workArea.y1 () - extents.y1 (); else if (extents.y2 () > workArea.y2 ()) y += workArea.y2 () - extents.y2 (); } if (x != w->x () || y != w->y ()) { ScalePosition pos; ADDON_WINDOW (w); ScalePosition oldPos = aw->sWindow->getCurrentPosition (); w->moveToViewportPosition (x, y, true); /* Select this window when ending scale */ aw->sWindow->scaleSelectWindow (); /* stop scaled window disappearing */ pos.setX (oldPos.x () - xOffset); pos.setY (oldPos.y () - yOffset); if (optionGetExitAfterPull ()) { CompAction *action; CompOption::Vector o; CompOption *opt; o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); opt = CompOption::findOption (sScreen->getOptions (), "initiate_key", 0); action = &opt->value ().action (); if (action->terminate ()) action->terminate () (action, 0, o); } else { ScaleSlot slot = aw->sWindow->getSlot (); /* provide a simple animation */ aw->cWindow->addDamage (); pos.setX (oldPos.x () - slot.width () / 20); pos.setY (oldPos.y () - slot.height () / 20); pos.scale = oldPos.scale * 1.1f; aw->sWindow->setCurrentPosition (pos); aw->cWindow->addDamage (); } } } return true; } bool ScaleAddonScreen::zoomWindow (CompAction *action, CompAction::State state, CompOption::Vector options) { if (!sScreen->hasGrab ()) return false; CompWindow *w = screen->findWindow (highlightedWindow); if (w) { ADDON_WINDOW (w); if (!aw->sWindow->hasSlot ()) return false; int head = screen->outputDeviceForPoint (aw->sWindow->getSlot ().pos ()); CompRect output = screen->outputDevs ()[head]; /* damage old rect */ aw->cWindow->addDamage (); if (!aw->rescaled) { ScaleSlot slot = aw->sWindow->getSlot (); CompRect geom = w->borderRect (); aw->oldAbove = w->next; w->raise (); /* backup old values */ aw->origSlot = slot; aw->rescaled = true; int x1 = output.centerX () - geom.width () / 2 + w->border ().left; int y1 = output.centerY () - geom.height () / 2 + w->border ().top; int x2 = slot.x () + geom.width (); int y2 = slot.y () + geom.height (); slot.scale = 1.0f; slot.setGeometry (x1, y1, x2 - x1, y2 - y1); aw->sWindow->setSlot (slot); } else { if (aw->oldAbove) w->restackBelow (aw->oldAbove); aw->rescaled = false; aw->sWindow->setSlot (aw->origSlot); } /* slot size may have changed, so * update window title */ aw->renderTitle (); aw->cWindow->addDamage (); } return true; } void ScaleAddonScreen::handleEvent (XEvent *event) { screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == XA_WM_NAME && sScreen->hasGrab ()) { CompWindow *w = screen->findWindow (event->xproperty.window); if (w) { ADDON_WINDOW (w); aw->renderTitle (); aw->cWindow->addDamage (); } } break; case MotionNotify: if (sScreen->hasGrab ()) { highlightedWindow = sScreen->getHoveredWindow (); checkWindowHighlight (); } break; default: break; } } void ScaleAddonWindow::scalePaintDecoration (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { ScaleScreen::State state; ADDON_SCREEN (screen); state = as->sScreen->getState (); sWindow->scalePaintDecoration (attrib, transform, region, mask); if (state == ScaleScreen::Wait || state == ScaleScreen::Out) { if (as->optionGetWindowHighlight () && window->id () == as->highlightedWindow) drawHighlight (transform); if (textAvailable) drawTitle (transform); } } void ScaleAddonWindow::scaleSelectWindow () { ADDON_SCREEN (screen); as->highlightedWindow = window->id (); as->checkWindowHighlight (); sWindow->scaleSelectWindow (); } void ScaleAddonScreen::donePaint () { ScaleScreen::State state = sScreen->getState (); if (state != ScaleScreen::Idle && lastState == ScaleScreen::Idle) { foreach (CompWindow *w, screen->windows ()) ScaleAddonWindow::get (w)->renderTitle (); } else if (state == ScaleScreen::Idle && lastState != ScaleScreen::Idle) { foreach (CompWindow *w, screen->windows ()) ScaleAddonWindow::get (w)->text.clear (); } if (state == ScaleScreen::Out && lastState != ScaleScreen::Out) { lastHighlightedWindow = None; checkWindowHighlight (); } lastState = state; cScreen->donePaint (); } void ScaleAddonScreen::handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &options) { screen->handleCompizEvent (pluginName, eventName, options); if ((strcmp (pluginName, "scale") == 0) && (strcmp (eventName, "activate") == 0)) { bool activated = CompOption::getBoolOptionNamed (options, "active", false); if (activated) { screen->addAction (&optionGetCloseKey ()); screen->addAction (&optionGetZoomKey ()); screen->addAction (&optionGetPullKey ()); screen->addAction (&optionGetCloseButton ()); screen->addAction (&optionGetZoomButton ()); screen->addAction (&optionGetPullButton ()); /* TODO: or better ad->highlightedWindow = sd->selectedWindow; here? do we want to show up the highlight without mouse move initially? */ highlightedWindow = None; lastHighlightedWindow = None; checkWindowHighlight (); } else { foreach (CompWindow *w, screen->windows ()) { ADDON_WINDOW (w); aw->rescaled = false; } screen->removeAction (&optionGetCloseKey ()); screen->removeAction (&optionGetZoomKey ()); screen->removeAction (&optionGetPullKey ()); screen->removeAction (&optionGetCloseButton ()); screen->removeAction (&optionGetZoomButton ()); screen->removeAction (&optionGetPullButton ()); } } } /** * experimental organic layout method * inspired by smallwindows (smallwindows.sf.net) by Jens Egeblad * FIXME: broken. * */ #if 0 static const double ORGANIC_STEP = 0.05f; static int organicCompareWindows (const void *elem1, const void *elem2) { CompWindow *w1 = *((CompWindow **) elem1); CompWindow *w2 = *((CompWindow **) elem2); return (WIN_X (w1) + WIN_Y (w1)) - (WIN_X (w2) + WIN_Y (w2)); } static double layoutOrganicCalculateOverlap (CompScreen *s, int win, int x, int y) { int overlapX, overlapY; int xMin, xMax, yMin, yMax; double result = -0.01; SCALE_SCREEN (); ADDON_SCREEN (); int x1 = x; int y1 = y; int x2 = x1 + WIN_W (ss->windows[win]) * as->scale; int y2 = y1 + WIN_H (ss->windows[win]) * as->scale; for (int i = 0; i < ss->nWindows; ++i) { if (i == win) continue; overlapX = overlapY = 0; xMax = MAX (ss->slots[i].x1, x1); xMin = MIN (ss->slots[i].x1 + WIN_W (ss->windows[i]) * as->scale, x2); if (xMax <= xMin) overlapX = xMin - xMax; yMax = MAX (ss->slots[i].y1, y1); yMin = MIN (ss->slots[i].y1 + WIN_H (ss->windows[i]) * as->scale, y2); if (yMax <= yMin) overlapY = yMin - yMax; result += (double)overlapX * overlapY; } return result; } static double layoutOrganicFindBestHorizontalPosition (CompScreen *s, int win, int *bestX, int areaWidth) { double bestOverlap = 1e31, overlap; SCALE_SCREEN (); ADDON_SCREEN (); int y1 = ss->slots[win].y1; int y2 = ss->slots[win].y1 + WIN_H (ss->windows[win]) * as->scale; int w = WIN_W (ss->windows[win]) * as->scale; *bestX = ss->slots[win].x1; for (int i = 0; i < ss->nWindows; ++i) { CompWindow *lw = ss->windows[i]; if (i == win) continue; if (ss->slots[i].y1 < y2 && ss->slots[i].y1 + WIN_H (lw) * as->scale > y1) { if (ss->slots[i].x1 - w >= 0) { double overlap = layoutOrganicCalculateOverlap (s, win, ss->slots[i].x1 - w, y1); if (overlap < bestOverlap) { *bestX = ss->slots[i].x1 - w; bestOverlap = overlap; } } if (WIN_W (lw) * as->scale + ss->slots[i].x1 + w < areaWidth) { double overlap = layoutOrganicCalculateOverlap (s, win, ss->slots[i].x1 + WIN_W (lw) * as->scale, y1); if (overlap < bestOverlap) { *bestX = ss->slots[i].x1 + WIN_W (lw) * as->scale; bestOverlap = overlap; } } } } overlap = layoutOrganicCalculateOverlap (s, win, 0, y1); if (overlap < bestOverlap) { *bestX = 0; bestOverlap = overlap; } overlap = layoutOrganicCalculateOverlap (s, win, areaWidth - w, y1); if (overlap < bestOverlap) { *bestX = areaWidth - w; bestOverlap = overlap; } return bestOverlap; } static double layoutOrganicFindBestVerticalPosition (CompScreen *s, int win, int *bestY, int areaHeight) { double bestOverlap = 1e31, overlap; SCALE_SCREEN (); ADDON_SCREEN (); int x1 = ss->slots[win].x1; int x2 = ss->slots[win].x1 + WIN_W (ss->windows[win]) * as->scale; int h = WIN_H (ss->windows[win]) * as->scale; *bestY = ss->slots[win].y1; for (int i = 0; i < ss->nWindows; ++i) { CompWindow *w = ss->windows[i]; if (i == win) continue; if (ss->slots[i].x1 < x2 && ss->slots[i].x1 + WIN_W (w) * as->scale > x1) { if (ss->slots[i].y1 - h >= 0 && ss->slots[i].y1 < areaHeight) { double overlap = layoutOrganicCalculateOverlap (s, win, x1, ss->slots[i].y1 - h); if (overlap < bestOverlap) { *bestY = ss->slots[i].y1 - h; bestOverlap = overlap; } } if (WIN_H (w) * as->scale + ss->slots[i].y1 > 0 && WIN_H (w) * as->scale + h + ss->slots[i].y1 < areaHeight) { double overlap = layoutOrganicCalculateOverlap (s, win, x1, WIN_H (w) * as->scale + ss->slots[i].y1); if (overlap < bestOverlap) { *bestY = ss->slots[i].y1 + WIN_H(w) * as->scale; bestOverlap = overlap; } } } } overlap = layoutOrganicCalculateOverlap (s, win, x1, 0); if (overlap < bestOverlap) { *bestY = 0; bestOverlap = overlap; } overlap = layoutOrganicCalculateOverlap (s, win, x1, areaHeight - h); if (overlap < bestOverlap) { *bestY = areaHeight - h; bestOverlap = overlap; } return bestOverlap; } static bool layoutOrganicLocalSearch (CompScreen *s, int areaWidth, int areaHeight) { bool improvement; int i; double totalOverlap; SCALE_SCREEN (); do { improvement = false; for (i = 0; i < ss->nWindows; ++i) { bool improved; do { int newX, newY; double oldOverlap, overlapH, overlapV; improved = false; oldOverlap = layoutOrganicCalculateOverlap (s, i, ss->slots[i].x1, ss->slots[i].y1); overlapH = layoutOrganicFindBestHorizontalPosition (s, i, &newX, areaWidth); overlapV = layoutOrganicFindBestVerticalPosition (s, i, &newY, areaHeight); if (overlapH < oldOverlap - 0.1 || overlapV < oldOverlap - 0.1) { improved = true; improvement = true; if (overlapV > overlapH) ss->slots[i].x1 = newX; else ss->slots[i].y1 = newY; } } while (improved); } } while (improvement); totalOverlap = 0.0; for (i = 0; i < ss->nWindows; ++i) { totalOverlap += layoutOrganicCalculateOverlap (s, i, ss->slots[i].x1, ss->slots[i].y1); } return (totalOverlap > 0.1); } static void layoutOrganicRemoveOverlap (CompScreen *s, int areaWidth, int areaHeight) { CompWindow *w; SCALE_SCREEN (); ADDON_SCREEN (); int spacing = ss->opt[SCALE_SCREEN_OPTION_SPACING].value.i; while (layoutOrganicLocalSearch (s, areaWidth, areaHeight)) { for (int i = 0; i < ss->nWindows; ++i) { w = ss->windows[i]; int centerX = ss->slots[i].x1 + WIN_W (w) / 2; int centerY = ss->slots[i].y1 + WIN_H (w) / 2; int newWidth = (int)((1.0 - ORGANIC_STEP) * (double)WIN_W (w)) - spacing / 2; int newHeight = (int)((1.0 - ORGANIC_STEP) * (double)WIN_H (w)) - spacing / 2; int newX = centerX - (newWidth / 2); int newY = centerY - (newHeight / 2); ss->slots[i].x1 = newX; ss->slots[i].y1 = newY; ss->slots[i].x2 = newX + WIN_W (w); ss->slots[i].y2 = newY + WIN_H (w); } as->scale -= ORGANIC_STEP; } } static bool layoutOrganicThumbs (CompScreen *s) { CompWindow *w; int i; XRectangle workArea; SCALE_SCREEN (); ADDON_SCREEN (); int moMode = ss->opt[SCALE_SCREEN_OPTION_MULTIOUTPUT_MODE].value.i; switch (moMode) { case SCALE_MOMODE_ALL: workArea = s->workArea; break; case SCALE_MOMODE_CURRENT: default: workArea = s->outputDev[s->currentOutputDev].workArea; break; } as->scale = 1.0f; qsort (ss->windows, ss->nWindows, sizeof(CompWindow *), organicCompareWindows); for (i = 0; i < ss->nWindows; ++i) { w = ss->windows[i]; SCALE_WINDOW (w); sWindow->slot = &ss->slots[i]; ss->slots[i].x1 = WIN_X (w) - workArea.x; ss->slots[i].y1 = WIN_Y (w) - workArea.y; ss->slots[i].x2 = WIN_X (w) + WIN_W (w) - workArea.x; ss->slots[i].y2 = WIN_Y (w) + WIN_H (w) - workArea.y; if (ss->slots[i].x1 < 0) { ss->slots[i].x2 += abs (ss->slots[i].x1); ss->slots[i].x1 = 0; } if (ss->slots[i].x2 > workArea.width - workArea.x) { ss->slots[i].x1 -= abs (ss->slots[i].x2 - workArea.width); ss->slots[i].x2 = workArea.width - workArea.x; } if (ss->slots[i].y1 < 0) { ss->slots[i].y2 += abs (ss->slots[i].y1); ss->slots[i].y1 = 0; } if (ss->slots[i].y2 > workArea.height - workArea.y) { ss->slots[i].y1 -= abs (ss->slots[i].y2 - workArea.height - workArea.y); ss->slots[i].y2 = workArea.height - workArea.y; } } ss->nSlots = ss->nWindows; layoutOrganicRemoveOverlap (s, workArea.width - workArea.x, workArea.height - workArea.y); for (i = 0; i < ss->nWindows; ++i) { w = ss->windows[i]; SCALE_WINDOW (w); if (ss->type == ScaleTypeGroup) raiseWindow (ss->windows[i]); ss->slots[i].x1 += w->input.left + workArea.x; ss->slots[i].x2 += w->input.left + workArea.x; ss->slots[i].y1 += w->input.top + workArea.y; ss->slots[i].y2 += w->input.top + workArea.y; sWindow->adjust = true; } return true; } #endif /* * Inspired by KWin - the KDE Window Manager * presentwindows.cpp * Copyright (C) 2007 Rivo Laks * Copyright (C) 2008 Lucas Murray * */ bool ScaleAddonScreen::isOverlappingAny (ScaleWindow *w, std::map targets, const CompRegion &border) { if (border.intersects (targets[w])) return true; // Is there a better way to do this? std::map ::const_iterator i; for (i = targets.begin (); i != targets.end (); ++i) { if (w == (*i).first) continue; if (targets[w].intersects ((*i).second)) return true; } return false; } bool ScaleAddonScreen::layoutNaturalThumbs () { ScaleScreen::WindowList windows = ScaleScreen::get (screen)->getWindows (); bool overlapping; CompRect area = screen->workArea (); CompRect bounds = area; std::map targets; std::map directions; int direction = 0; int iterCount = 0; if (windows.size () == 1) { // Just move the window to its original location to save time if (screen->fullscreenOutput ().workArea ().contains (windows.front ()->window->geometry ())) { ScaleSlot slot ((CompRect &) windows.front ()->window->geometry ()); windows.front ()->setSlot (slot); return true; } } foreach (ScaleWindow *w, windows) { bounds = CompRegion (bounds).united (w->window->outputRect ()).boundingRect (); targets[w] = CompRegion (w->window->outputRect ()); // Reuse the unused "slot" as a preferred direction attribute. This is used when the window // is on the edge of the screen to try to use as much screen real estate as possible. directions[w] = direction; ++direction; if (direction == 4) direction = 0; } do { overlapping = false; foreach (ScaleWindow *w, windows) { foreach (ScaleWindow *e, windows) { if (e->window->id () != w->window->id () && targets[w].intersects (targets[e])) { int moveX = targets[w].boundingRect ().centerX () - targets[e].boundingRect ().centerX (); int moveY = targets[w].boundingRect ().centerY () - targets[e].boundingRect ().centerY (); //int xSection, ySection; // Overlap detected, determine direction to push overlapping = true; moveX /= optionGetNaturalPrecision (); moveY /= optionGetNaturalPrecision (); /* Force movement */ if (moveX == 0) moveX = optionGetNaturalPrecision (); if (moveY == 0) moveY = optionGetNaturalPrecision (); targets[w] = targets[w].translated (moveX, moveY); targets[e] = targets[e].translated (-moveX, -moveY); /* Try to keep the bounding rect the same aspect as the screen so that more * screen real estate is utilised. We do this by splitting the screen into nine * equal sections, if the window center is in any of the corner sections pull the * window towards the outer corner. If it is in any of the other edge sections * alternate between each corner on that edge. We don't want to determine it * randomly as it will not produce consistant locations when using the filter. * Only move one window so we don't cause large amounts of unnecessary zooming * in some situations. We need to do this even when expanding later just in case * all windows are the same size. * (We are using an old bounding rect for this, hopefully it doesn't matter) * FIXME: Disabled for now * xSection = (targets[w].boundingRect ().x () - bounds.x ()) / (bounds.width () / 3); ySection = (targets[w].boundingRect ().y () - bounds.y ()) / (bounds.height () / 3); moveX = 0; moveY = 0; if (xSection != 1 || ySection != 1) // Remove this if you want the center to pull as well { if (xSection == 1) xSection = (directions[w] / 2 ? 2 : 0); if (ySection == 1) ySection = (directions[w] % 2 ? 2 : 0); } if (xSection == 0 && ySection == 0) { moveX = bounds.left () - targets[w].boundingRect ().centerX (); moveY = bounds.top () - targets[w].boundingRect ().centerY (); } if (xSection == 2 && ySection == 0) { moveX = bounds.right () - targets[w].boundingRect ().centerX (); moveY = bounds.top () - targets[w].boundingRect ().centerY (); } if (xSection == 2 && ySection == 2) { moveX = bounds.right () - targets[w].boundingRect ().centerX (); moveY = bounds.bottom () - targets[w].boundingRect ().centerY (); } if (xSection == 0 && ySection == 2) { moveX = bounds.left () - targets[w].boundingRect ().centerX (); moveY = bounds.right () - targets[w].boundingRect ().centerY (); } if (moveX != 0 || moveY != 0) targets[w].translate (moveX, moveY); */ } // Update bounding rect bounds = CompRegion (bounds).united (targets[w]).boundingRect (); bounds = CompRegion (bounds).united (targets[e]).boundingRect (); } } } while (overlapping); // Work out scaling by getting the most top-left and most bottom-right window coords. // The 20's and 10's are so that the windows don't touch the edge of the screen. double scale; if (bounds == area) scale = 1.0; // Don't add borders to the screen else if (area.width () / double (bounds.width ()) < area.height () / double (bounds.height ())) scale = (area.width () - 20) / double (bounds.width ()); else scale = (area.height () - 20) / double (bounds.height ()); // Make bounding rect fill the screen size for later steps bounds = CompRect ( bounds.x () - (area.width () - 20 - bounds.width () * scale ) / 2 - 10 / scale, bounds.y () - (area.height () - 20 - bounds.height () * scale ) / 2 - 10 / scale, area.width () / scale, area.height () / scale ); // Move all windows back onto the screen and set their scale foreach (ScaleWindow *w, windows) { targets[w] = CompRect ( (targets[w].boundingRect ().x () - bounds.x () ) * scale + area.x (), (targets[w].boundingRect ().y () - bounds.y ()) * scale + area.y (), targets[w].boundingRect ().width () * scale, targets[w].boundingRect ().height () * scale ); ScaleSlot slt (targets[w].boundingRect ()); slt.scale = scale; slt.filled = true; w->setSlot (slt); } // Don't expand onto or over the border CompRegion borderRegion = CompRegion (area); CompRegion areaRegion = CompRegion (area); borderRegion.translate (-200, -200); borderRegion.shrink (-200, -200); // actually expands the region areaRegion.translate (10 / scale, 10 / scale); areaRegion.shrink (10 / scale, 10 / scale); borderRegion ^= areaRegion; bool moved = false; do { moved = false; foreach (ScaleWindow *w, windows) { CompRegion oldRegion; // This may cause some slight distortion if the windows are enlarged a large amount int widthDiff = optionGetNaturalPrecision (); int heightDiff = ((w->window->height () / w->window->width ()) * (targets[w].boundingRect ().width() + widthDiff)) - targets[w].boundingRect ().height (); int xDiff = widthDiff / 2; // Also move a bit in the direction of the enlarge, allows the int yDiff = heightDiff / 2; // center windows to be enlarged if there is gaps on the side. // Attempt enlarging to the top-right oldRegion = targets[w]; targets[w] = CompRegion ( targets[w].boundingRect ().x () + xDiff, targets[w].boundingRect ().y () - yDiff - heightDiff, targets[w].boundingRect ().width () + widthDiff, targets[w].boundingRect ().height () + heightDiff ); if (isOverlappingAny (w, targets, borderRegion)) targets[w] = oldRegion; else moved = true; // Attempt enlarging to the bottom-right oldRegion = targets[w]; targets[w] = CompRegion( targets[w].boundingRect ().x () + xDiff, targets[w].boundingRect ().y () + yDiff, targets[w].boundingRect ().width () + widthDiff, targets[w].boundingRect ().height () + heightDiff ); if (isOverlappingAny (w, targets, borderRegion)) targets[w] = oldRegion; else moved = true; // Attempt enlarging to the bottom-left oldRegion = targets[w]; targets[w] = CompRegion ( targets[w].boundingRect ().x() - xDiff - widthDiff, targets[w].boundingRect ().y() + yDiff, targets[w].boundingRect ().width() + widthDiff, targets[w].boundingRect ().height() + heightDiff ); if (isOverlappingAny (w, targets, borderRegion)) targets[w] = oldRegion; else moved = true; // Attempt enlarging to the top-left oldRegion = targets[w]; targets[w] = CompRegion ( targets[w].boundingRect ().x() - xDiff - widthDiff, targets[w].boundingRect ().y() - yDiff - heightDiff, targets[w].boundingRect ().width() + widthDiff, targets[w].boundingRect ().height() + heightDiff ); if (isOverlappingAny (w, targets, borderRegion)) targets[w] = oldRegion; else moved = true; } ++iterCount; } while (moved && iterCount < 100); // The expanding code above can actually enlarge windows over 1.0/2.0 scale, we don't like this // We can't add this to the loop above as it would cause a never-ending loop so we have to make // do with the less-than-optimal space usage with using this method. foreach (ScaleWindow *w, windows) { double scale = targets[w].boundingRect ().width() / double( w->window->width()); if (scale > 2.0 || (scale > 1.0 && (w->window->width() > 300 || w->window->height() > 300))) { scale = (w->window->width () > 300 || w->window->height () > 300) ? 1.0 : 2.0; targets[w] = CompRegion ( targets[w].boundingRect ().center().x() - int (w->window->width() * scale) / 2, targets[w].boundingRect ().center().y() - int (w->window->height () * scale) / 2, w->window->width() * scale, w->window->height() * scale ); } } return true; } bool ScaleAddonScreen::layoutSlotsAndAssignWindows () { bool status; switch (optionGetLayoutMode ()) { case LayoutModeNatural: status = layoutNaturalThumbs (); break; case LayoutModeNormal: default: status = sScreen->layoutSlotsAndAssignWindows (); break; } return status; } void ScaleAddonScreen::optionChanged (CompOption *opt, ScaleaddonOptions::Options num) { switch (num) { case ScaleaddonOptions::WindowTitle: case ScaleaddonOptions::TitleBold: case ScaleaddonOptions::TitleSize: case ScaleaddonOptions::BorderSize: case ScaleaddonOptions::FontColor: case ScaleaddonOptions::BackColor: if (textAvailable) { foreach (CompWindow *w, screen->windows ()) { ADDON_WINDOW (w); aw->renderTitle (); } } break; default: break; } } ScaleAddonScreen::ScaleAddonScreen (CompScreen *) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), sScreen (ScaleScreen::get (screen)), highlightedWindow (0), lastHighlightedWindow (0), lastState (ScaleScreen::Idle), scale (1.0f) { CompAction::CallBack cb; ChangeNotify notify; ScreenInterface::setHandler (screen, true); CompositeScreenInterface::setHandler (cScreen, true); ScaleScreenInterface::setHandler (sScreen, true); cb = boost::bind (&ScaleAddonScreen::closeWindow, this, _1, _2, _3); optionSetCloseKeyInitiate (cb); optionSetCloseButtonInitiate (cb); cb = boost::bind (&ScaleAddonScreen::zoomWindow, this, _1, _2, _3); optionSetZoomKeyInitiate (cb); optionSetZoomButtonInitiate (cb); cb = boost::bind (&ScaleAddonScreen::pullWindow, this, _1, _2, _3); optionSetPullKeyInitiate (cb); optionSetPullButtonInitiate (cb); notify = boost::bind (&ScaleAddonScreen::optionChanged, this, _1, _2); optionSetWindowTitleNotify (notify); optionSetTitleBoldNotify (notify); optionSetTitleSizeNotify (notify); optionSetBorderSizeNotify (notify); optionSetFontColorNotify (notify); optionSetBackColorNotify (notify); } ScaleAddonWindow::ScaleAddonWindow (CompWindow *window) : PluginClassHandler (window), window (window), sWindow (ScaleWindow::get (window)), cWindow (CompositeWindow::get (window)), rescaled (false), oldAbove (NULL) { ScaleWindowInterface::setHandler (sWindow); } bool ScaleAddonPluginVTable::init () { if (CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) textAvailable = true; else { compLogMessage ("scaleaddon", CompLogLevelInfo, "Text Plugin not loaded, no text will be drawn."); textAvailable = false; } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("scale", COMPIZ_SCALE_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/scaleaddon/src/scaleaddon.h0000644000015301777760000000657312321343002024320 0ustar pbusernogroup00000000000000/* * * Compiz scale plugin addon plugin * * scaleaddon.h * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Organic scale mode taken from Beryl's scale.c, written by * Copyright : (C) 2006 Diogo Ferreira * E-mail : diogo@underdev.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * */ #include #include #include #include #include #include #include #include #include "scaleaddon_options.h" class ScaleAddonScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public ScaleScreenInterface, public ScaleaddonOptions { public: ScaleAddonScreen (CompScreen *); CompositeScreen *cScreen; ScaleScreen *sScreen; Window highlightedWindow; Window lastHighlightedWindow; int lastState; float scale; std::vector paintSlots; void handleEvent (XEvent *); bool layoutSlotsAndAssignWindows (); bool layoutNaturalThumbs (); bool isOverlappingAny (ScaleWindow *w, const std::map , const CompRegion &border); void donePaint (); void checkWindowHighlight (); bool closeWindow (CompAction *action, CompAction::State state, CompOption::Vector options); bool pullWindow (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomWindow (CompAction *action, CompAction::State state, CompOption::Vector options); void handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &options); void optionChanged (CompOption *opt, ScaleaddonOptions::Options num); }; #define ADDON_SCREEN(s) \ ScaleAddonScreen *as = ScaleAddonScreen::get (s) class ScaleAddonWindow : public PluginClassHandler , public ScaleWindowInterface { public: ScaleAddonWindow (CompWindow *); CompWindow *window; ScaleWindow *sWindow; CompositeWindow *cWindow; ScaleSlot origSlot; CompText text; bool rescaled; CompWindow *oldAbove; void scalePaintDecoration (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void scaleSelectWindow (); void renderTitle (); void drawTitle (const GLMatrix &transform); void drawHighlight (const GLMatrix &transform); }; #define ADDON_WINDOW(w) \ ScaleAddonWindow *aw = ScaleAddonWindow::get (w) class ScaleAddonPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/place/0000755000015301777760000000000012321344021020241 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/place.xml.in0000644000015301777760000001102312321343002022447 0ustar pbusernogroup00000000000000 <_short>Place Windows <_long>Place windows at appropriate positions when mapped Window Management composite opengl decor <_short>Fixed Window Placement <_short>Windows with fixed positions <_short>Windows with fixed placement mode <_short>Windows with fixed viewport compiz-0.9.11+14.04.20140409/plugins/place/CMakeLists.txt0000644000015301777760000000102012321343002022770 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/constrain-to-workarea/include/) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/screen-size-change/include/) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/smart/include/) add_subdirectory (src/constrain-to-workarea) add_subdirectory (src/screen-size-change) add_subdirectory (src/smart) compiz_plugin (place LIBRARIES compiz_place_constrain_to_workarea compiz_place_screen_size_change compiz_place_smart) compiz-0.9.11+14.04.20140409/plugins/place/src/0000755000015301777760000000000012321344021021030 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/place.cpp0000644000015301777760000010254012321343002022620 0ustar pbusernogroup00000000000000/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include "place.h" COMPIZ_PLUGIN_20090315 (place, PlacePluginVTable) namespace cp = compiz::place; #define XWINDOWCHANGES_INIT {0, 0, 0, 0, 0, None, 0} PlaceScreen::PlaceScreen (CompScreen *screen) : PluginClassHandler (screen), mPrevSize (screen->width (), screen->height ()), mStrutWindowCount (0), fullPlacementAtom (XInternAtom (screen->dpy (), "_NET_WM_FULL_PLACEMENT", 0)) { ScreenInterface::setHandler (screen); mResChangeFallbackHandle.setTimes (4000, 4500); /* 4 Seconds */ screen->updateSupportedWmHints (); } PlaceScreen::~PlaceScreen () { screen->addSupportedAtomsSetEnabled (this, false); mResChangeFallbackHandle.stop (); screen->updateSupportedWmHints (); } CompWindowList compiz::place::collectStrutWindows (const CompWindowList &all) { CompWindowList l; foreach (CompWindow *w, all) { if (!w->managed () || w->overrideRedirect ()) continue; if (w->struts ()) l.push_back (w); } return l; } void PlaceScreen::doHandleScreenSizeChange (int newWidth, int newHeight) { foreach (CompWindow *w, screen->windows ()) { if (!w->managed ()) continue; if (w->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) continue; PlaceWindow::get (w)->adjustForSize (mPrevSize, CompSize (newWidth, newHeight)); } } const compiz::window::Geometry & PlaceWindow::getGeometry () const { return window->serverGeometry (); } const CompPoint & PlaceWindow::getViewport () const { return screen->vp (); } const CompRect & PlaceWindow::getWorkarea (const compiz::window::Geometry &g) const { return screen->getWorkareaForOutput (screen->outputDeviceForGeometry (g)); } const CompRect & PlaceWindow::getWorkarea () const { return getWorkarea (window->serverGeometry ()); } const compiz::window::extents::Extents & PlaceWindow::getExtents () const { return window->border (); } unsigned int PlaceWindow::getState () const { unsigned int state = 0; if (window->state () & CompWindowStateAboveMask) state |= compiz::place::WindowAbove; if (window->state () & CompWindowStateBelowMask) state |= compiz::place::WindowBelow; return state; } void PlaceWindow::applyGeometry (compiz::window::Geometry &ng, compiz::window::Geometry &og) { CompRect workArea = screen->getWorkareaForOutput ( screen->outputDeviceForGeometry (og)); XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int mask = og.changeMask (ng); xwc.x = ng.x (); xwc.y = ng.y (); xwc.width = ng.width (); xwc.height = ng.height (); xwc.border_width = ng.border (); window->configureXWindow (mask, &xwc); if ((window->actions () & MAXIMIZE_STATE) == MAXIMIZE_STATE && (window->mwmDecor () & (MwmDecorAll | MwmDecorTitle)) && !(window->state () & CompWindowStateFullscreenMask)) { if (og.width () >= workArea.width () && og.height () >= workArea.height ()) { sendMaximizationRequest (); } } } bool PlaceScreen::handleScreenSizeChangeFallback (int width, int height) { /* If countdown is not finished yet (i.e. at least one struct window didn't * update its struts), reset the count down and move windows around here */ if (mStrutWindowCount > 0) /* no windows with struts found */ { mStrutWindowCount = 0; doHandleScreenSizeChange (width, height); } return false; } void PlaceScreen::handleScreenSizeChange (int width, int height) { if (mPrevSize == CompSize (width, height)) return; mResChangeFallbackHandle.stop (); mStrutWindows = compiz::place::collectStrutWindows (screen->windows ()); /* Don't wait for strut windows to update if there are none */ if (mStrutWindows.empty ()) doHandleScreenSizeChange (width, height); else { /* Wait for windows with set struts to update their struts, but * if one of them isn't updating them, have a fallback to ignore them */ mResChangeFallbackHandle.setCallback ( boost::bind (&PlaceScreen::handleScreenSizeChangeFallback, this, width, height)); mResChangeFallbackHandle.start (); } } void PlaceScreen::handleEvent (XEvent *event) { if (event->type == ConfigureNotify && event->xconfigure.window == screen->root () && (event->xconfigure.width != screen->width () || event->xconfigure.height != screen->height ())) { mPrevSize.setWidth (screen->width ()); mPrevSize.setHeight (screen->height ()); } screen->handleEvent (event); switch (event->type) { case ConfigureNotify: { if (event->xconfigure.window == screen->root ()) { handleScreenSizeChange (event->xconfigure.width, event->xconfigure.height); } } break; case PropertyNotify: if (event->xproperty.atom == Atoms::wmStrut || event->xproperty.atom == Atoms::wmStrutPartial) { CompWindow *w; w = screen->findWindow (event->xproperty.window); if (w) { if (!mStrutWindows.empty ()) { mStrutWindows.remove (w); /* Only do when handling screen size change. ps->strutWindowCount is 0 at any other time */ if (mStrutWindows.empty ()) doHandleScreenSizeChange (screen->width (), screen->height ()); /* 2nd pass */ } } } } } /* sort functions */ static bool compareLeftmost (compiz::place::Placeable *a, compiz::place::Placeable *b) { int ax, bx; ax = a->geometry ().x () - a->extents ().left; bx = b->geometry ().x () - a->extents ().left; return (ax <= bx); } static bool compareTopmost (compiz::place::Placeable *a, compiz::place::Placeable *b) { int ay, by; ay = a->geometry ().y () - a->extents ().top; by = b->geometry ().y () - a->extents ().top; return (ay <= by); } static bool compareNorthWestCorner (compiz::place::Placeable *a, compiz::place::Placeable *b) { int fromOriginA; int fromOriginB; int ax, ay, bx, by; ax = a->geometry ().x () - a->extents ().left; bx = b->geometry ().x () - a->extents ().left; ay = a->geometry ().y () - a->extents ().top; by = b->geometry ().y () - a->extents ().top; /* probably there's a fast good-enough-guess we could use here. */ fromOriginA = sqrt (ax * ax + ay * ay); fromOriginB = sqrt (bx * bx + by * by); return (fromOriginA <= fromOriginB); } PlaceWindow::PlaceWindow (CompWindow *w) : PluginClassHandler (w), compiz::place::ScreenSizeChangeObject (w->serverGeometry ()), window (w), ps (PlaceScreen::get (screen)) { WindowInterface::setHandler (w); } PlaceWindow::~PlaceWindow () { if (!ps->mStrutWindows.empty() && window->struts()) { ps->mStrutWindows.remove(window); if (ps->mStrutWindows.empty()) { ps->doHandleScreenSizeChange(screen->width(), screen->height()); } } } bool PlaceWindow::place (CompPoint &pos) { bool status = window->place (pos); CompPoint viewport; if (status) return status; doPlacement (pos); if (matchViewport (viewport)) { int x, y; viewport.setX (MAX (MIN (viewport.x (), screen->vpSize ().width () - 1), 0)); viewport.setY (MAX (MIN (viewport.y (), screen->vpSize ().height () - 1), 0)); x = pos.x () % screen->width (); if (x < 0) x += screen->width (); y = pos.y () % screen->height (); if (y < 0) y += screen->height (); pos.setX (x + (viewport.x () - screen->vp ().x ()) * screen->width ()); pos.setY (y + (viewport.y () - screen->vp ().y ()) * screen->height ()); } return true; } CompRect PlaceWindow::doValidateResizeRequest (unsigned int &mask, XWindowChanges *xwc, bool onlyValidateSize, bool clampToViewport) { CompWindow::Geometry geom (xwc->x, xwc->y, xwc->width, xwc->height, window->serverGeometry ().border ()); CompPoint pos (geom.pos ()); if (clampToViewport) pos = cp::getViewportRelativeCoordinates(geom, *screen); CompWindowExtents edgePositions = cp::getWindowEdgePositions (pos, geom, window->border ()); int output = screen->outputDeviceForGeometry (geom); CompRect workArea = screen->getWorkareaForOutput (output); if (clampToViewport && xwc->width >= workArea.width () && xwc->height >= workArea.height ()) { if ((window->actions () & MAXIMIZE_STATE) == MAXIMIZE_STATE && (window->mwmDecor () & (MwmDecorAll | MwmDecorTitle)) && !(window->state () & CompWindowStateFullscreenMask)) { sendMaximizationRequest (); } } cp::clampHorizontalEdgePositionsToWorkArea (edgePositions, workArea); cp::clampVerticalEdgePositionsToWorkArea (edgePositions, workArea); /* bring left/right/top/bottom to actual window coordinates */ cp::subtractBordersFromEdgePositions (edgePositions, window->border (), geom.border ()); /* always validate position if the application changed only its size, * as it might become partially offscreen because of that */ if (cp::onlySizeChanged (mask)) onlyValidateSize = false; if (cp::applyWidthChange(edgePositions, *xwc, mask)) onlyValidateSize = false; if (cp::applyHeightChange(edgePositions, *xwc, mask)) onlyValidateSize = false; if (!onlyValidateSize) { if (edgePositions.left != pos.x ()) { xwc->x += edgePositions.left - pos.x (); mask |= CWX; } if (edgePositions.top != pos.y ()) { xwc->y += edgePositions.top - pos.y (); mask |= CWY; } } return workArea; } void PlaceWindow::validateResizeRequest (unsigned int &mask, XWindowChanges *xwc, unsigned int source) { CompRect workArea; CompWindow::Geometry geom; bool sizeOnly = false; window->validateResizeRequest (mask, xwc, source); if (!mask) return; /* Clamp all windows initially on placement */ if (window->placed () && source == ClientTypePager) return; if (window->state () & CompWindowStateFullscreenMask) return; if (window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return; /* do nothing if the window was already (at least partially) offscreen * and already placed */ bool onscreen = CompRect (0, 0, screen->width (), screen->height ()).contains (window->geometry ()); if (window->placed () && !onscreen) return; if (hasUserDefinedPosition (false)) /* try to keep the window position intact for USPosition - obviously we can't do that if we need to change the size */ sizeOnly = true; doValidateResizeRequest (mask, xwc, sizeOnly, true); } void PlaceScreen::addSupportedAtoms (std::vector &atoms) { atoms.push_back (fullPlacementAtom); screen->addSupportedAtoms (atoms); } void PlaceWindow::doPlacement (CompPoint &pos) { CompRect workArea; CompPoint targetVp; PlacementStrategy strategy; bool keepInWorkarea; int mode; if (matchPosition (pos, keepInWorkarea)) { strategy = keepInWorkarea ? ConstrainOnly : NoPlacement; } else { strategy = getStrategy (); if (strategy == NoPlacement) return; } mode = getPlacementMode (); const CompOutput &output = getPlacementOutput (mode, strategy, pos); workArea = output.workArea (); targetVp = window->initialViewport (); if (strategy == PlaceOverParent) { CompWindow *parent; parent = screen->findWindow (window->transientFor ()); if (parent) { /* center over parent horizontally */ pos.setX (parent->serverBorderRect ().x () + (parent->serverBorderRect ().width () / 2) - (window->serverBorderRect ().width () / 2)); /* "visually" center vertically, leaving twice as much space below as on top */ pos.setY (parent->serverBorderRect ().y () + (parent->serverBorderRect ().height () - window->serverBorderRect ().height ()) / 3); /* if parent is visible on current viewport, clip to work area; don't constrain further otherwise */ if (parent->serverBorderRect ().x () < screen->width () && parent->serverBorderRect ().x () + parent->serverBorderRect ().width () > 0 && parent->serverBorderRect ().y () < screen->height () && parent->serverBorderRect ().y () + parent->serverBorderRect ().height () > 0) { targetVp = parent->defaultViewport (); strategy = ConstrainOnly; } else { strategy = NoPlacement; } } } if (strategy == PlaceCenteredOnScreen) { /* center window on current output device */ pos.setX (output.x () + (output.width () - window->serverGeometry ().width ()) /2); pos.setY (output.y () + (output.height () - window->serverGeometry ().height ()) / 2); strategy = ConstrainOnly; } workArea.setX (workArea.x () + (targetVp.x () - screen->vp ().x ()) * screen->width ()); workArea.setY (workArea.y () + (targetVp.y () - screen->vp ().y ()) * screen->height ()); if (strategy == PlaceOnly || strategy == PlaceAndConstrain) { /* Construct list of placeables */ compiz::place::Placeable::Vector placeables; foreach (CompWindow *w, screen->windows ()) { PLACE_WINDOW (w); if (windowIsPlaceRelevant (w)) placeables.push_back (static_cast (pw)); } switch (mode) { case PlaceOptions::ModeCascade: placeCascade (workArea, pos); break; case PlaceOptions::ModeCentered: placeCentered (workArea, pos); break; case PlaceOptions::ModeRandom: placeRandom (workArea, pos); break; case PlaceOptions::ModePointer: placePointer (workArea, pos); break; case PlaceOptions::ModeMaximize: sendMaximizationRequest (); break; case PlaceOptions::ModeSmart: placeSmart (pos, placeables); break; } /* When placing to the fullscreen output, constrain to one output nevertheless */ if ((unsigned int) output.id () == (unsigned int) ~0) { int id; CompWindow::Geometry geom (window->serverGeometry ()); geom.setPos (pos); id = screen->outputDeviceForGeometry (geom); workArea = screen->getWorkareaForOutput (id); workArea.setX (workArea.x () + (targetVp.x () - screen->vp ().x ()) * screen->width ()); workArea.setY (workArea.y () + (targetVp.y () - screen->vp ().y ()) * screen->height ()); } /* Maximize windows if they are too big for their work area (bit of * a hack here). Assume undecorated windows probably don't intend to * be maximized. */ if ((window->actions () & MAXIMIZE_STATE) == MAXIMIZE_STATE && (window->mwmDecor () & (MwmDecorAll | MwmDecorTitle)) && !(window->state () & CompWindowStateFullscreenMask)) { if (window->serverWidth () >= workArea.width () && window->serverHeight () >= workArea.height ()) { sendMaximizationRequest (); } } } if (strategy == ConstrainOnly || strategy == PlaceAndConstrain) constrainToWorkarea (workArea, pos); } void PlaceWindow::placeCascade (const CompRect &workArea, CompPoint &pos) { Placeable::Vector placeables; /* Find windows that matter (not minimized, on same workspace * as placed window, may be shaded - if shaded we pretend it isn't * for placement purposes) */ foreach (CompWindow *w, screen->windows ()) { if (!windowIsPlaceRelevant (w)) continue; if (w->type () & (CompWindowTypeFullscreenMask | CompWindowTypeUnknownMask)) continue; if (w->serverX () >= workArea.right () || w->serverX () + w->serverGeometry ().width () <= workArea.x () || w->serverY () >= workArea.bottom () || w->serverY () + w->serverGeometry ().height () <= workArea.y ()) continue; placeables.push_back (static_cast (PlaceWindow::get (w))); } if (!cascadeFindFirstFit (placeables, workArea, pos)) { /* if the window wasn't placed at the origin of screen, * cascade it onto the current screen */ cascadeFindNext (placeables, workArea, pos); } } void PlaceWindow::placeCentered (const CompRect &workArea, CompPoint &pos) { pos.setX (workArea.x () + (workArea.width () - window->serverGeometry ().width ()) / 2); pos.setY (workArea.y () + (workArea.height () - window->serverGeometry ().height ()) / 2); } void PlaceWindow::placeRandom (const CompRect &workArea, CompPoint &pos) { int remainX, remainY; pos.setX (workArea.x ()); pos.setY (workArea.y ()); remainX = workArea.width () - window->serverGeometry ().width (); if (remainX > 0) pos.setX (pos.x () + (rand () % remainX)); remainY = workArea.height () - window->serverGeometry ().height (); if (remainY > 0) pos.setY (pos.y () + (rand () % remainY)); } void PlaceWindow::placePointer (const CompRect &workArea, CompPoint &pos) { if (PlaceScreen::get (screen)->getPointerPosition (pos)) { unsigned int dx = (window->serverGeometry ().widthIncBorders () / 2); unsigned int dy = (window->serverGeometry ().heightIncBorders () / 2); pos -= CompPoint (dx, dy); } else placeCentered (workArea, pos); } using namespace compiz::place; void PlaceWindow::placeSmart (CompPoint &pos, const compiz::place::Placeable::Vector &placeables) { compiz::place::smart (this, pos, placeables); } static void centerTileRectInArea (CompRect &rect, const CompRect &workArea) { int fluff; /* The point here is to tile a window such that "extra" * space is equal on either side (i.e. so a full screen * of windows tiled this way would center the windows * as a group) */ fluff = (workArea.width () % (rect.width () + 1)) / 2; rect.setX (workArea.x () + fluff); fluff = (workArea.height () % (rect.height () + 1)) / 3; rect.setY (workArea.y () + fluff); } static bool rectOverlapsWindow (const CompRect &rect, const compiz::place::Placeable::Vector &placeables) { CompRect dest; foreach (compiz::place::Placeable *other, placeables) { CompRect intersect; CompRect sbr = other->geometry (); sbr.setLeft (sbr.left () - other->extents ().left); sbr.setRight (sbr.right () + other->extents ().right); sbr.setTop (sbr.top () - other->extents ().top); sbr.setBottom (sbr.bottom () - other->extents ().bottom); intersect = rect & sbr; if (!intersect.isEmpty ()) return true; } return false; } /* Find the leftmost, then topmost, empty area on the workspace * that can contain the new window. * * Cool feature to have: if we can't fit the current window size, * try shrinking the window (within geometry constraints). But * beware windows such as Emacs with no sane minimum size, we * don't want to create a 1x1 Emacs. */ bool PlaceWindow::cascadeFindFirstFit (const Placeable::Vector &placeables, const CompRect &workArea, CompPoint &pos) { /* This algorithm is limited - it just brute-force tries * to fit the window in a small number of locations that are aligned * with existing windows. It tries to place the window on * the bottom of each existing window, and then to the right * of each existing window, aligned with the left/top of the * existing window in each of those cases. */ bool retval = false; Placeable::Vector belowSorted, rightSorted; /* Below each window */ belowSorted = placeables; std::sort (belowSorted.begin (), belowSorted.end (), compareLeftmost); std::sort (belowSorted.begin (), belowSorted.end (), compareTopmost); /* To the right of each window */ rightSorted = placeables; std::sort (belowSorted.begin (), belowSorted.end (), compareTopmost); std::sort (belowSorted.begin (), belowSorted.end (), compareLeftmost); CompRect rect = this->geometry (); rect.setLeft (rect.left () - this->extents ().left); rect.setRight (rect.right () + this->extents ().right); rect.setTop (rect.top () - this->extents ().top); rect.setBottom (rect.bottom () - this->extents ().bottom); centerTileRectInArea (rect, workArea); if (workArea.contains (rect) && !rectOverlapsWindow (rect, placeables)) { pos.setX (rect.x () + this->extents ().left); pos.setY (rect.y () + this->extents ().top); retval = true; } if (!retval) { /* try below each window */ foreach (Placeable *p, belowSorted) { CompRect outerRect; if (retval) break; outerRect = p->geometry (); outerRect.setLeft (rect.left () - this->extents ().left); outerRect.setRight (rect.right () + this->extents ().right); outerRect.setTop (rect.top () - this->extents ().top); outerRect.setBottom (rect.bottom () - this->extents ().bottom); outerRect.setX (outerRect.x ()); outerRect.setY (outerRect.bottom ()); if (workArea.contains (rect) && !rectOverlapsWindow (rect, belowSorted)) { pos.setX (rect.x () + this->extents ().left); pos.setY (rect.y () + this->extents ().top); retval = true; } } } if (!retval) { /* try to the right of each window */ foreach (Placeable *p, rightSorted) { CompRect outerRect; if (retval) break; outerRect = p->geometry (); outerRect.setLeft (rect.left () - this->extents ().left); outerRect.setRight (rect.right () + this->extents ().right); outerRect.setTop (rect.top () - this->extents ().top); outerRect.setBottom (rect.bottom () - this->extents ().bottom); outerRect.setX (outerRect.right ()); outerRect.setY (outerRect.y ()); if (workArea.contains (rect) && !rectOverlapsWindow (rect, rightSorted)) { pos.setX (rect.x () + this->extents ().left); pos.setY (rect.y () + this->extents ().top); retval = true; } } } return retval; } void PlaceWindow::cascadeFindNext (const Placeable::Vector &placeables, const CompRect &workArea, CompPoint &pos) { Placeable::Vector sorted; Placeable::Vector::iterator iter; int cascadeX, cascadeY; int xThreshold, yThreshold; int winWidth, winHeight; int cascadeStage; sorted = placeables; std::sort (sorted.begin (), sorted.end (), compareNorthWestCorner); /* This is a "fuzzy" cascade algorithm. * For each window in the list, we find where we'd cascade a * new window after it. If a window is already nearly at that * position, we move on. */ /* arbitrary-ish threshold, honors user attempts to * manually cascade. */ static const unsigned short CASCADE_FUZZ = 15; xThreshold = MAX (this->extents ().left, CASCADE_FUZZ); yThreshold = MAX (this->extents ().top, CASCADE_FUZZ); /* Find furthest-SE origin of all workspaces. * cascade_x, cascade_y are the target position * of NW corner of window frame. */ cascadeX = MAX (0, workArea.x ()); cascadeY = MAX (0, workArea.y ()); /* Find first cascade position that's not used. */ winWidth = window->serverWidth (); winHeight = window->serverHeight (); cascadeStage = 0; for (iter = sorted.begin (); iter != sorted.end (); ++iter) { Placeable *p = *iter; int wx, wy; /* we want frame position, not window position */ wx = p->geometry ().x () - p->extents ().left; wy = p->geometry ().y () - p->extents ().top; if (abs (wx - cascadeX) < xThreshold && abs (wy - cascadeY) < yThreshold) { /* This window is "in the way", move to next cascade * point. The new window frame should go at the origin * of the client window we're stacking above. */ wx = cascadeX = p->geometry ().x (); wy = cascadeY = p->geometry ().y (); /* If we go off the screen, start over with a new cascade */ if ((cascadeX + winWidth > workArea.right ()) || (cascadeY + winHeight > workArea.bottom ())) { cascadeX = MAX (0, workArea.x ()); cascadeY = MAX (0, workArea.y ()); static const unsigned short CASCADE_INTERVAL = 50; /* space between top-left corners of cascades */ cascadeStage += 1; cascadeX += CASCADE_INTERVAL * cascadeStage; /* start over with a new cascade translated to the right, * unless we are out of space */ if (cascadeX + winWidth < workArea.right ()) { iter = sorted.begin (); continue; } else { /* All out of space, this cascade_x won't work */ cascadeX = MAX (0, workArea.x ()); break; } } } else { /* Keep searching for a further-down-the-diagonal window. */ } } /* cascade_x and cascade_y will match the last window in the list * that was "in the way" (in the approximate cascade diagonal) */ /* Convert coords to position of window, not position of frame. */ pos.setX (cascadeX + this->extents ().left); pos.setY (cascadeY + this->extents ().top); } bool PlaceWindow::hasUserDefinedPosition (bool acceptPPosition) { PLACE_SCREEN (screen); CompMatch &match = ps->optionGetForcePlacementMatch (); if (match.evaluate (window)) return false; if (acceptPPosition && (window->sizeHints ().flags & PPosition)) return true; if ((window->type () & CompWindowTypeNormalMask) || ps->optionGetWorkarounds ()) { /* Only accept USPosition on non-normal windows if workarounds are * enabled because apps claiming the user set -geometry for a * dialog or dock are most likely wrong */ if (window->sizeHints ().flags & USPosition) return true; } return false; } PlaceWindow::PlacementStrategy PlaceWindow::getStrategy () { if (window->type () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask | CompWindowTypeUtilMask | CompWindowTypeToolbarMask | CompWindowTypeMenuMask | CompWindowTypeFullscreenMask | CompWindowTypeUnknownMask)) { /* assume the app knows best how to place these */ return NoPlacement; } if (window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) { /* see above */ return NoPlacement; } if (hasUserDefinedPosition (true)) return ConstrainOnly; if (window->transientFor () && (window->type () & (CompWindowTypeDialogMask | CompWindowTypeModalDialogMask))) { CompWindow *parent = screen->findWindow (window->transientFor ()); if (parent && parent->managed ()) return PlaceOverParent; } if (window->type () & (CompWindowTypeDialogMask | CompWindowTypeModalDialogMask | CompWindowTypeSplashMask)) { return PlaceCenteredOnScreen; } return PlaceAndConstrain; } const CompOutput & PlaceWindow::getPlacementOutput (int mode, PlacementStrategy strategy, CompPoint pos) { int output = -1; int multiMode; /* short cut: it makes no sense to determine a placement output if there is only one output */ if (screen->outputDevs ().size () == 1) return screen->outputDevs ().at (0); switch (strategy) { case PlaceOverParent: { CompWindow *parent; parent = screen->findWindow (window->transientFor ()); if (parent) output = parent->outputDevice (); } break; case ConstrainOnly: { CompWindow::Geometry geom = window->serverGeometry (); geom.setPos (pos); output = screen->outputDeviceForGeometry (geom); } break; default: break; } if (output >= 0) return screen->outputDevs ()[output]; multiMode = ps->optionGetMultioutputMode (); /* force 'output with pointer' for placement under pointer */ if (mode == PlaceOptions::ModePointer) multiMode = PlaceOptions::MultioutputModeUseOutputDeviceWithPointer; switch (multiMode) { case PlaceOptions::MultioutputModeUseActiveOutputDevice: return screen->currentOutputDev (); break; case PlaceOptions::MultioutputModeUseOutputDeviceWithPointer: { CompPoint p; if (PlaceScreen::get (screen)->getPointerPosition (p)) { output = screen->outputDeviceForPoint (p.x (), p.y ()); } } break; case PlaceOptions::MultioutputModeUseOutputDeviceOfFocussedWindow: { CompWindow *active; active = screen->findWindow (screen->activeWindow ()); if (active) output = active->outputDevice (); } break; case PlaceOptions::MultioutputModePlaceAcrossAllOutputs: /* only place on fullscreen output if not placing centered, as the constraining will move the window away from the center otherwise */ if (strategy != PlaceCenteredOnScreen) return screen->fullscreenOutput (); break; } if (output < 0) return screen->currentOutputDev (); return screen->outputDevs ()[output]; } int PlaceWindow::getPlacementMode () { CompOption::Value::Vector& matches = ps->optionGetModeMatches (); CompOption::Value::Vector& modes = ps->optionGetModeModes (); int i, min; min = MIN (matches.size (), modes.size ()); for (i = 0; i < min; i++) if (matches[i].match ().evaluate (window)) return modes[i].i (); return ps->optionGetMode (); } void PlaceWindow::constrainToWorkarea (const CompRect &workArea, CompPoint &pos) { pos = cp::constrainPositionToWorkArea (pos, window->serverGeometry (), window->border (), workArea); } bool PlaceWindow::windowIsPlaceRelevant (CompWindow *w) { if (w->id () == window->id ()) return false; if (!w->isViewable () && !w->shaded ()) return false; if (w->overrideRedirect ()) return false; if (w->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return false; return true; } void PlaceWindow::sendMaximizationRequest () { XEvent xev; Display *dpy = screen->dpy (); xev.xclient.type = ClientMessage; xev.xclient.display = dpy; xev.xclient.format = 32; xev.xclient.message_type = Atoms::winState; xev.xclient.window = window->id (); xev.xclient.data.l[0] = 1; xev.xclient.data.l[1] = Atoms::winStateMaximizedHorz; xev.xclient.data.l[2] = Atoms::winStateMaximizedVert; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent (dpy, screen->root (), false, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } bool PlaceScreen::getPointerPosition (CompPoint &p) { Window wDummy; int iDummy; unsigned int uiDummy; int x, y; bool ret; /* this means a server roundtrip, which kind of sucks; this * this code should be removed as soon as we have software cursor * rendering and thus a cache pointer co-ordinate */ ret = XQueryPointer (screen->dpy (), screen->root (), &wDummy, &wDummy, &x, &y, &iDummy, &iDummy, &uiDummy); p.set (x, y); return ret; } bool PlaceWindow::matchXYValue (CompOption::Value::Vector &matches, CompOption::Value::Vector &xValues, CompOption::Value::Vector &yValues, CompPoint &pos, CompOption::Value::Vector *constrainValues, bool *keepInWorkarea) { unsigned int i, min; if (window->type () & CompWindowTypeDesktopMask) return false; min = MIN (matches.size (), xValues.size ()); min = MIN (min, yValues.size ()); for (i = 0; i < min; i++) { if (matches[i].match ().evaluate (window)) { pos.setX (xValues[i].i ()); pos.setY (yValues[i].i ()); if (keepInWorkarea) { if (constrainValues && constrainValues->size () > i) *keepInWorkarea = (*constrainValues)[i].b (); else *keepInWorkarea = true; } return true; } } return false; } bool PlaceWindow::matchPosition (CompPoint &pos, bool &keepInWorkarea) { return matchXYValue ( ps->optionGetPositionMatches (), ps->optionGetPositionXValues (), ps->optionGetPositionYValues (), pos, &ps->optionGetPositionConstrainWorkarea (), &keepInWorkarea); } bool PlaceWindow::matchViewport (CompPoint &pos) { if (matchXYValue (ps->optionGetViewportMatches (), ps->optionGetViewportXValues (), ps->optionGetViewportYValues (), pos)) { /* Viewport matches are given 1-based, so we need to adjust that */ pos.setX (pos.x () - 1); pos.setY (pos.y () - 1); return true; } return false; } void PlaceWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { /* Don't restore geometry if the user moved the window */ if (screen->grabExist ("move") || screen->grabExist ("resize")) unset (); window->grabNotify (x, y, state, mask); } bool PlacePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/0000755000015301777760000000000012321344021024502 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/tests/0000755000015301777760000000000012321344021025644 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/tests/test-screen-size-change.cpp0000644000015301777760000000236512321343002033003 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-screen-size-change.h" compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/tests/screen-size-change/0000755000015301777760000000000012321344021031316 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/tests/screen-size-change/src/0000755000015301777760000000000012321344021032105 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000020100000000000011206 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/tests/screen-size-change/src/test-place-screen-size-change.cppcompiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/tests/screen-size-change/src/test-0000644000015301777760000005072612321343002033074 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include namespace cp = compiz::place; namespace cw = compiz::window; namespace compiz { namespace window { std::ostream & operator<< (std::ostream &os, const Geometry &g) { return os << "compiz::window::Geometry " << std::endl << " - x: " << g.x () << std::endl << " - y: " << g.y () << std::endl << " - width: " << g.width () << std::endl << " - height: " << g.height () << std::endl << " - border: " << g.border (); } } } namespace { class StubScreenSizeChangeObject : public cp::ScreenSizeChangeObject { public: StubScreenSizeChangeObject (const cw::Geometry &); ~StubScreenSizeChangeObject (); const cw::Geometry & getGeometry () const; void applyGeometry (cw::Geometry &n, cw::Geometry &o); const CompPoint & getViewport () const; const CompRect & getWorkarea (const cw::Geometry &g) const; const cw::extents::Extents & getExtents () const; void setVp (const CompPoint &); void setWorkArea (const CompRect &); void setExtents (unsigned int left, unsigned int right, unsigned int top, unsigned int bottom); void setGeometry (const cw::Geometry &g); cw::Geometry sizeAdjustTest (const CompSize &oldSize, const CompSize &newSize); private: CompPoint mCurrentVp; CompRect mCurrentWorkArea; cw::extents::Extents mCurrentExtents; cw::Geometry mCurrentGeometry; }; const unsigned int MOCK_STRUT_SIZE = 24; const unsigned int WIDESCREEN_MONITOR_WIDTH = 1280; const unsigned int TALLER_MONITOR_HEIGHT = 1050; const unsigned int MONITOR_WIDTH = 1024; const unsigned int MONITOR_HEIGHT = 768; const unsigned int DUAL_MONITOR_WIDTH = MONITOR_WIDTH * 2; const unsigned int DUAL_MONITOR_HEIGHT = MONITOR_HEIGHT * 2; const unsigned int WINDOW_WIDTH = 300; const unsigned int WINDOW_HEIGHT = 400; const unsigned int WINDOW_X = (MONITOR_WIDTH / 2) - (WINDOW_WIDTH / 2); const unsigned int WINDOW_Y = (MONITOR_HEIGHT / 2) - (WINDOW_HEIGHT / 2); void reserveStruts (CompRect &workArea, unsigned int strutSize) { workArea.setLeft (workArea.left () + strutSize); workArea.setTop (workArea.top () + strutSize); workArea.setBottom (workArea.bottom () - strutSize); } } class PlaceScreenSizeChange : public CompPlaceScreenSizeChangeTest { protected: PlaceScreenSizeChange () : windowGeometryBeforeChange (), stubScreenSizeChangeObject (windowGeometryBeforeChange) { } cw::Geometry ChangeScreenSizeAndAdjustWindow (const CompSize &newSize); void SetWindowGeometry (const cw::Geometry &geometry); void SetInitialScreenSize (const CompSize &size); cw::Geometry GetInitialWindowGeometry (); private: CompSize screenSizeAfterChange; CompSize screenSizeBeforeChange; cw::Geometry windowGeometryBeforeChange; StubScreenSizeChangeObject stubScreenSizeChangeObject; }; cw::Geometry PlaceScreenSizeChange::GetInitialWindowGeometry () { return windowGeometryBeforeChange; } void PlaceScreenSizeChange::SetInitialScreenSize (const CompSize &size) { screenSizeBeforeChange = size; } void PlaceScreenSizeChange::SetWindowGeometry (const compiz::window::Geometry &geometry) { windowGeometryBeforeChange = geometry; stubScreenSizeChangeObject.setGeometry (windowGeometryBeforeChange); } cw::Geometry PlaceScreenSizeChange::ChangeScreenSizeAndAdjustWindow (const CompSize &newSize) { cw::Geometry g (stubScreenSizeChangeObject.sizeAdjustTest (screenSizeBeforeChange, newSize)); screenSizeBeforeChange = newSize; return g; } StubScreenSizeChangeObject::StubScreenSizeChangeObject (const cw::Geometry &g) : ScreenSizeChangeObject (g), mCurrentVp (0, 0), mCurrentWorkArea (50, 50, 1000, 1000), mCurrentGeometry (g) { memset (&mCurrentExtents, 0, sizeof (cw::extents::Extents)); } StubScreenSizeChangeObject::~StubScreenSizeChangeObject () { } const cw::Geometry & StubScreenSizeChangeObject::getGeometry () const { return mCurrentGeometry; } void StubScreenSizeChangeObject::applyGeometry (cw::Geometry &n, cw::Geometry &o) { ASSERT_EQ (mCurrentGeometry, o) << "incorrect usage of applyGeometry"; mCurrentGeometry = n; } const CompPoint & StubScreenSizeChangeObject::getViewport () const { return mCurrentVp; } const CompRect & StubScreenSizeChangeObject::getWorkarea (const cw::Geometry &g) const { return mCurrentWorkArea; } const cw::extents::Extents & StubScreenSizeChangeObject::getExtents () const { return mCurrentExtents; } void StubScreenSizeChangeObject::setVp (const CompPoint &p) { mCurrentVp = p; } void StubScreenSizeChangeObject::setWorkArea (const CompRect &wa) { mCurrentWorkArea = wa; } void StubScreenSizeChangeObject::setExtents (unsigned int left, unsigned int right, unsigned int top, unsigned int bottom) { mCurrentExtents.left = left; mCurrentExtents.right = right; mCurrentExtents.top = top; mCurrentExtents.bottom = bottom; } void StubScreenSizeChangeObject::setGeometry (const cw::Geometry &g) { mCurrentGeometry = g; } cw::Geometry StubScreenSizeChangeObject::sizeAdjustTest (const CompSize &oldSize, const CompSize &newSize) { CompRect workArea (0, 0, newSize.width (), newSize.height ()); /* Reserve top, bottom and left parts of the screen for * fake "24px" panels */ reserveStruts (workArea, MOCK_STRUT_SIZE); setWorkArea (workArea); cw::Geometry g = adjustForSize (oldSize, newSize); return g; } TEST_F (PlaceScreenSizeChange, NoMovementOnSmallerWidth) { SetInitialScreenSize (CompSize (WIDESCREEN_MONITOR_WIDTH, MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* First test that changing the screen size * to something smaller here doesn't cause our * (small) window to be moved */ cw::Geometry expectedWindowGeometryAfterChange = GetInitialWindowGeometry (); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, MONITOR_HEIGHT)); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, NoMovementOnSmallerHeight) { SetInitialScreenSize (CompSize (MONITOR_WIDTH, TALLER_MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* First test that changing the screen size * to something smaller here doesn't cause our * (small) window to be moved */ cw::Geometry expectedWindowGeometryAfterChange = GetInitialWindowGeometry (); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, MONITOR_HEIGHT)); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, NoMovementOnLargerSize) { SetInitialScreenSize (CompSize (MONITOR_WIDTH, MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Making the screen size bigger with no * saved geometry should cause the window not to move */ cw::Geometry expectedWindowGeometryAfterChange = GetInitialWindowGeometry (); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, MovedToEdgeOfRemainingMonitorOnUnplug) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the window to the other "monitor" */ SetWindowGeometry (cw::Geometry (MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug a "monitor" */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, MONITOR_HEIGHT)); /* The window should be exactly on-screen at the edge */ cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH - WINDOW_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, MovedBackToOriginalPositionOnReplug) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); /* Move the window to the other "monitor" */ SetWindowGeometry (cw::Geometry (MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug a "monitor" */ ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, MONITOR_HEIGHT)); /* Re-plug the monitor - window should go back * to the same position */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); /* Window should be at the same position we left it at */ cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, MovedBackToOriginalPositionOnExpansion) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug a "monitor" */ ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, MONITOR_HEIGHT)); /* Re-plug the monitor */ ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); /* Plug 2 monitors downwards, no change */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, NoOverlapStrutsOnRePlacement) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the window to the bottom "monitor" */ SetWindowGeometry (cw::Geometry (MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT + WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug bottom "monitor" */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT - WINDOW_HEIGHT - MOCK_STRUT_SIZE, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, MovedToOriginalPositionOnPerpendicularExpansion) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the window to the bottom "monitor" */ SetWindowGeometry (cw::Geometry (MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT + WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug bottom "monitor" */ ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); /* Re-plug bottom "monitor" */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT + WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainOnSecondViewportWhenConstraineToFirst) { /* Unplug a "monitor" */ SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the entire window right a viewport */ SetWindowGeometry (cw::Geometry (DUAL_MONITOR_WIDTH + MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH + (MONITOR_WIDTH - WINDOW_WIDTH), WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); /* Now change the screen resolution again - the window should * move to be within the constrained size of its current * viewport */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainOnSecondViewportAfterMovedToOriginalPosition) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the entire window right a viewport */ SetWindowGeometry (cw::Geometry (DUAL_MONITOR_WIDTH + MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug a "monitor" */ ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Replug the monitor, make sure that the geometry is restored */ cw::Geometry expectedWindowGeometryAfterChange (DUAL_MONITOR_WIDTH + MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainAtOriginalPositionOnSecondViewportUnplug) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (DUAL_MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT + WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT + WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainAtOriginalPositionOnSecondViewportReplug) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (DUAL_MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT + WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Replug the monitor and move the window to where it fits on the first * monitor on the second viewport, then make sure it doesn't move */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange = GetInitialWindowGeometry (); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainOnPreviousViewportWhenMovedToFirstMonitor) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Deal with the case where the position is negative, which means * it's actually wrapped around to the rightmost viewport */ SetWindowGeometry (cw::Geometry (WINDOW_X - MONITOR_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug the right "monitor" */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange (-WINDOW_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainOnPreviousViewportWhenRestored) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Deal with the case where the position is negative, which means * it's actually wrapped around to the rightmost viewport */ SetWindowGeometry (cw::Geometry (WINDOW_X - MONITOR_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug the right "monitor" */ ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Re-plug the right "monitor" */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange = GetInitialWindowGeometry (); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainOnPreviousViewportFirstMonitor) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the window to the left monitor, verify that it survives an * unplug/plug cycle */ SetWindowGeometry (cw::Geometry (WINDOW_X - DUAL_MONITOR_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange (WINDOW_X - MONITOR_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainOnPreviousViewportFirstMonitorWhenRestored) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the window to the left monitor, verify that it survives an * unplug/plug cycle */ SetWindowGeometry (cw::Geometry (WINDOW_X - DUAL_MONITOR_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange = GetInitialWindowGeometry (); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/tests/test-screen-size-change.h0000644000015301777760000000321012321343002032436 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_PLACE_SCREEN_SIZE_CHANGE_H #define _COMPIZ_TEST_PLACE_SCREEN_SIZE_CHANGE_H #include #include #include #include #include #include #include #include #include #include class CompPlaceScreenSizeChangeTest : public ::testing::Test { public: }; #endif compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/tests/CMakeLists.txt0000644000015301777760000000130612321343002030402 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_place_screen_size_change_test ${CMAKE_CURRENT_SOURCE_DIR}/test-screen-size-change.cpp) add_executable (compiz_test_place_screen_size_change ${CMAKE_CURRENT_SOURCE_DIR}/screen-size-change/src/test-place-screen-size-change.cpp) target_link_libraries (compiz_test_place_screen_size_change compiz_place_screen_size_change_test compiz_place_screen_size_change ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_place_screen_size_change COVERAGE compiz_place_screen_size_change) compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/CMakeLists.txt0000644000015301777760000000235512321343002027245 0ustar pbusernogroup00000000000000pkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/plugins/place/src/constrain-to-workarea/include ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry-saver/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/screen-size-change.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/screen-size-change.cpp ) ADD_LIBRARY( compiz_place_screen_size_change STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_place_screen_size_change PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) TARGET_LINK_LIBRARIES( compiz_place_screen_size_change compiz_place_constrain_to_workarea compiz_core ${GLIBMM_LIBRARIES} ) compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/src/0000755000015301777760000000000012321344021025271 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/src/screen-size-change.cpp0000644000015301777760000001027012321343002031445 0ustar pbusernogroup00000000000000/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include "screen-size-change.h" #include compiz::place::ScreenSizeChangeObject::ScreenSizeChangeObject (const compiz::window::Geometry &g) : mSaver (g) { } compiz::place::ScreenSizeChangeObject::~ScreenSizeChangeObject () { } compiz::window::Geometry compiz::place::ScreenSizeChangeObject::adjustForSize (const CompSize &oldSize, const CompSize &newSize) { int vpX, vpY; compiz::window::Geometry g, vpRelRect; int pivotX, pivotY; g = getGeometry (); compiz::window::Geometry og (g); pivotX = g.x (); pivotY = g.y (); /* FIXME: Should use saved geometry for maximized / fullscreen windows */ /* calculate target vp x, y index for window's pivot point */ vpX = pivotX / oldSize.width (); if (pivotX < 0) vpX -= 1; vpY = pivotY / oldSize.height (); if (pivotY < 0) vpY -= 1; unsigned int mask = mSaver.pop (vpRelRect, CHANGE_X | CHANGE_Y | CHANGE_WIDTH | CHANGE_HEIGHT); if (mask) { /* set position/size to saved original rectangle */ g.applyChange (compiz::window::Geometry (vpRelRect.x (), vpRelRect.y (), vpRelRect.width (), vpRelRect.height (), vpRelRect.border ()), mask); } else { /* set position/size to window's current rectangle (with position relative to target viewport) */ vpRelRect.setX (g.x () - vpX * oldSize.width ()); vpRelRect.setY (g.y () - vpY * oldSize.height ()); vpRelRect.setWidth (g.width ()); vpRelRect.setHeight (g.height ()); g = vpRelRect; /* if coords. relative to viewport are outside new viewport area, shift window left/up so that it falls inside */ if (vpRelRect.x () + vpRelRect.width() >= newSize.width ()) g.setX (g.x () - (vpRelRect.x () + vpRelRect.width () - newSize.width ())); if (vpRelRect.y () + vpRelRect.height() >= newSize.height ()) g.setY (g.y () - (vpRelRect.y () + vpRelRect.width () - newSize.height ())); g.setWidth (vpRelRect.width ()); g.setHeight (vpRelRect.height ()); } unsigned int flags = 0; const CompRect &workArea = getWorkarea (g); compiz::place::clampGeometryToWorkArea (g, workArea, getExtents (), flags, newSize); if (!mask) { /* save window geometry (relative to viewport) so that it can be restored later */ mask = getGeometry ().changeMask (g); mSaver.push (vpRelRect, mask); } else { compiz::window::Geometry rg (vpRelRect.x () + vpX * newSize.width (), vpRelRect.y () + vpY * newSize.height (), vpRelRect.width (), vpRelRect.height (), vpRelRect.border ()); /* Don't care about any bits not restored */ rg.applyChange (g, ~mask); /* Push any bits back on the saver * that don't match the requested window geometry * since we will need to restore to them later */ unsigned int remaining = g.changeMask (rg); mSaver.push (vpRelRect, remaining); } g.setX (g.x () + vpX * newSize.width ()); g.setY (g.y () + vpY * newSize.height ()); /* for maximized/fullscreen windows, update saved pos/size XXX, * also pull in the old code to handle maximized windows which * currently can't be implemented yet */ /* actually move/resize window in directions given by mask */ applyGeometry (g, og); return g; } void compiz::place::ScreenSizeChangeObject::unset () { compiz::window::Geometry g; mSaver.pop (g, !0); } compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/include/0000755000015301777760000000000012321344021026125 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/screen-size-change/include/screen-size-change.h0000644000015301777760000000360312321343002031750 0ustar pbusernogroup00000000000000/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 _COMPIZ_PLACE_SCREEN_SIZE_CHANGE_H #define _COMPIZ_PLACE_SCREEN_SIZE_CHANGE_H #include #include #include #include #include #include #include "constrain-to-workarea.h" namespace compiz { namespace place { class ScreenSizeChangeObject { public: ScreenSizeChangeObject (const compiz::window::Geometry &g); virtual ~ScreenSizeChangeObject (); virtual const compiz::window::Geometry & getGeometry () const = 0; virtual void applyGeometry (compiz::window::Geometry &ng, compiz::window::Geometry &og) = 0; virtual const CompPoint & getViewport () const = 0; virtual const CompRect & getWorkarea (const compiz::window::Geometry &g) const = 0; virtual const compiz::window::extents::Extents & getExtents () const = 0; compiz::window::Geometry adjustForSize (const CompSize &oldSize, const CompSize &newSize); void unset (); private: compiz::window::GeometrySaver mSaver; }; } } #endif compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/0000755000015301777760000000000012321344021025261 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/0000755000015301777760000000000012321344021026423 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000015200000000000011213 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/test-constrain-to-workarea.cppcompiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/test-constrain-to-workare0000644000015301777760000000237012321343002033413 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-constrain-to-workarea.h" ././@LongLink0000000000000000000000000000015000000000000011211 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/test-constrain-to-workarea.hcompiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/test-constrain-to-workare0000644000015301777760000000310612321343002033411 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_TIMER_H #define _COMPIZ_TEST_TIMER_H #include #include #include #include #include #include #include #include #include #include class CompPlaceTest : public ::testing::Test { }; #endif compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/0000755000015301777760000000000012321344021032654 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000020600000000000011213 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/test-place-constrain-to-workarea.cppcompiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/tes0000644000015301777760000000424312321343002033373 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include #include class CompPlaceTestConstrainToWorkarea : public CompPlaceTest { public: CompPlaceTestConstrainToWorkarea (); ~CompPlaceTestConstrainToWorkarea (); }; CompPlaceTestConstrainToWorkarea::CompPlaceTestConstrainToWorkarea () { } CompPlaceTestConstrainToWorkarea::~CompPlaceTestConstrainToWorkarea () { } TEST_F(CompPlaceTestConstrainToWorkarea, TestConstrainToWorkarea) { CompSize screensize (1000, 2000); CompRect workArea (50, 50, 900, 1900); compiz::window::Geometry g (100, 100, 200, 200, 0); compiz::window::extents::Extents extents; unsigned int flags = 0; memset (&extents, 0, sizeof (compiz::window::extents::Extents)); /* Do nothing */ compiz::place::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, compiz::window::Geometry (100, 100, 200, 200, 0)); } ././@LongLink0000000000000000000000000000014600000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/src/compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/src0000755000015301777760000000000012321344021033364 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000021200000000000011210 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/src/test-place-constrain-to-workarea.cppcompiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/src0000644000015301777760000003702012321343002033366 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include #include #include namespace cw = compiz::window; namespace cwe = cw::extents; namespace cp = compiz::place; using ::testing::WithParamInterface; using ::testing::ValuesIn; using ::testing::Combine; class PlaceClampGeometryToWorkArea : public CompPlaceTest { public: PlaceClampGeometryToWorkArea () : screensize (1000, 2000), workArea (50, 50, 900, 1900), flags (0) { memset (&extents, 0, sizeof (cwe::Extents)); } protected: CompSize screensize; CompRect workArea; cw::Geometry g; cwe::Extents extents; unsigned int flags; }; namespace { const cw::Geometry LimitOfAllowedGeometry (50, 50, 900, 1900, 0); } namespace compiz { namespace window { std::ostream & operator<<(std::ostream &os, const Geometry &g) { return os << "Window Geometry: (" << g.x () << ", " << g.y () << ", " << g.width () << ", " << g.height () << ", " << g.border () << ")"; } namespace extents { std::ostream & operator<<(std::ostream &os, const Extents &e) { return os << "Window Extents: (left: " << e.left << ", right: " << e.right << ", top: " << e.top << ", bottom: " << e.bottom << ")"; } } } } std::ostream & operator<<(std::ostream &os, const CompPoint &p) { return os << "Point: (" << p.x () << ", " << p.y () << ")"; } TEST_F (PlaceClampGeometryToWorkArea, NoConstrainmentRequired) { g = cw::Geometry (100, 100, 200, 200, 0); /* Do nothing */ cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, cw::Geometry (100, 100, 200, 200, 0)); } TEST_F (PlaceClampGeometryToWorkArea, LargerThanWorkAreaConstrainsToWorkAreaSize) { /* Larger than workArea */ g = cw::Geometry (50, 50, 950, 1950, 0); cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, LimitOfAllowedGeometry); } TEST_F (PlaceClampGeometryToWorkArea, OutsideTopLeftConstrainment) { /* Outside top left */ g = cw::Geometry (0, 0, 900, 1900, 0); cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, LimitOfAllowedGeometry); } TEST_F (PlaceClampGeometryToWorkArea, OutsideTopRightConstrainment) { /* Outside top right */ g = cw::Geometry (100, 0, 900, 1900, 0); cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, LimitOfAllowedGeometry); } TEST_F (PlaceClampGeometryToWorkArea, OutsideBottomLeftConstrainment) { /* Outside bottom left */ g = cw::Geometry (0, 100, 900, 1900, 0); cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, LimitOfAllowedGeometry); } TEST_F (PlaceClampGeometryToWorkArea, OutsideBottomRightConstrainment) { /* Outside bottom right */ g = cw::Geometry (100, 100, 900, 1900, 0); cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, LimitOfAllowedGeometry); } TEST_F (PlaceClampGeometryToWorkArea, NoChangePositionIfSizeUnchanged) { /* For the size only case, we should not * change the position of the window if * the size does not change */ g = cw::Geometry (0, 0, 900, 1900, 0); flags = cp::clampGeometrySizeOnly; cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, cw::Geometry (0, 0, 900, 1900, 0)); } TEST_F (PlaceClampGeometryToWorkArea, ChangePositionIfSizeChanged) { g = cw::Geometry (0, 0, 1000, 2000, 0); flags = cp::clampGeometrySizeOnly; cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, LimitOfAllowedGeometry); } namespace { typedef std::tr1::tuple ConstrainPositionToWorkAreaParam; const cw::Geometry & WindowGeometry (const ConstrainPositionToWorkAreaParam &p) { return std::tr1::get <0> (p); } const cwe::Extents & WindowExtents (const ConstrainPositionToWorkAreaParam &p) { return std::tr1::get <1> (p); } CompPoint InitialPosition (const ConstrainPositionToWorkAreaParam &p) { /* Initial position is where the window is right now */ return (std::tr1::get <0> (p)).pos (); } const CompRect WArea (50, 50, 900, 1900); const CompPoint ExpectedPosition (WArea.pos ()); } class PlaceConstrainPositionToWorkArea : public CompPlaceTest, public WithParamInterface { public: PlaceConstrainPositionToWorkArea () { memset (&extents, 0, sizeof (cwe::Extents)); } protected: CompRect workArea; cw::Geometry g; cwe::Extents extents; }; TEST_P (PlaceConstrainPositionToWorkArea, PositionConstrainedWithExtents) { g = WindowGeometry (GetParam ()); extents = WindowExtents (GetParam ()); CompPoint pos = InitialPosition (GetParam ()); pos = cp::constrainPositionToWorkArea (pos, g, extents, WArea); const CompPoint expectedAfterExtentsAdjustment = ExpectedPosition + CompPoint (extents.left, extents.top); EXPECT_EQ (expectedAfterExtentsAdjustment, pos); } namespace { cwe::Extents PossibleExtents[] = { cwe::Extents (0, 0, 0, 0), cwe::Extents (1, 0, 0, 0), cwe::Extents (0, 1, 0, 0), cwe::Extents (0, 0, 1, 0), cwe::Extents (0, 0, 0, 1) }; cw::Geometry PossibleGeometries[] = { cw::Geometry (WArea.x (), WArea.y (), WArea.width (), WArea.height (), 0), cw::Geometry (WArea.x () - 1, WArea.y (), WArea.width (), WArea.height (), 0), cw::Geometry (WArea.x (), WArea.y () - 1, WArea.width (), WArea.height (), 0), cw::Geometry (WArea.x () + 1, WArea.y (), WArea.width (), WArea.height (), 0), cw::Geometry (WArea.x (), WArea.y () + 1, WArea.width (), WArea.height (), 0) }; } INSTANTIATE_TEST_CASE_P (PlacementData, PlaceConstrainPositionToWorkArea, Combine (ValuesIn (PossibleGeometries), ValuesIn (PossibleExtents))); class PlaceGetEdgePositions : public CompPlaceTest { public: PlaceGetEdgePositions () : geom (100, 200, 300, 400, 1), border (1, 2, 3, 4), pos (geom.pos ()) { } protected: cw::Geometry geom; cwe::Extents border; CompPoint pos; }; TEST_F (PlaceGetEdgePositions, GetEdgePositions) { int left = geom.x () - border.left; int right = left + (geom.widthIncBorders ()) + (border.left + border.right); int top = geom.y () - border.top; int bottom = top + (geom.heightIncBorders ()) + (border.top + border.bottom); const cwe::Extents ExpectedExtents (left, right, top, bottom); cwe::Extents actualExtents (cp::getWindowEdgePositions (pos, geom, border)); EXPECT_EQ (ExpectedExtents, actualExtents); } namespace { const CompSize SCREEN_SIZE (1000, 1000); const unsigned int WINDOW_SIZE = 250; } TEST (PlaceGetViewportRelativeCoordinates, WithinScreenWidth) { cw::Geometry geom (SCREEN_SIZE.width () / 2, SCREEN_SIZE.height () / 2, WINDOW_SIZE, WINDOW_SIZE, 0); CompPoint position (cp::getViewportRelativeCoordinates (geom, SCREEN_SIZE)); EXPECT_EQ (geom.pos ().x (), position.x ()); } TEST (PlaceGetViewportRelativeCoordinates, WithinScreenHeight) { cw::Geometry geom (SCREEN_SIZE.width () / 2, SCREEN_SIZE.height () / 2, WINDOW_SIZE, WINDOW_SIZE, 0); CompPoint position (cp::getViewportRelativeCoordinates (geom, SCREEN_SIZE)); EXPECT_EQ (geom.pos ().y (), position.y ()); } TEST (PlaceGetViewportRelativeCoordinates, OutsideOuterScreenWidth) { cw::Geometry geom (SCREEN_SIZE.width () + 1, SCREEN_SIZE.height () / 2, WINDOW_SIZE, WINDOW_SIZE, 0); CompPoint position (cp::getViewportRelativeCoordinates (geom, SCREEN_SIZE)); EXPECT_EQ (1, position.x ()); } TEST (PlaceGetViewportRelativeCoordinates, OutsideInnerScreenWidth) { cw::Geometry geom (-(WINDOW_SIZE + 1), SCREEN_SIZE.height () / 2, WINDOW_SIZE, WINDOW_SIZE, 0); CompPoint position (cp::getViewportRelativeCoordinates (geom, SCREEN_SIZE)); EXPECT_EQ (SCREEN_SIZE.width () - (WINDOW_SIZE + 1), position.x ()); } TEST (PlaceGetViewportRelativeCoordinates, OutsideOuterScreenHeight) { cw::Geometry geom (SCREEN_SIZE.width () / 2, SCREEN_SIZE.height () + 1, WINDOW_SIZE, WINDOW_SIZE, 0); CompPoint position (cp::getViewportRelativeCoordinates (geom, SCREEN_SIZE)); EXPECT_EQ (1, position.y ()); } TEST (PlaceGetViewportRelativeCoordinates, OutsideInnerScreenHeight) { cw::Geometry geom (SCREEN_SIZE.width () / 2, -(WINDOW_SIZE + 1), WINDOW_SIZE, WINDOW_SIZE, 0); CompPoint position (cp::getViewportRelativeCoordinates (geom, SCREEN_SIZE)); EXPECT_EQ (SCREEN_SIZE.height () - (WINDOW_SIZE + 1), position.y ()); } namespace { const CompRect WORK_AREA (25, 25, 1000, 1000); const cwe::Extents EdgePositions[] = { /* Exact match */ cwe::Extents (WORK_AREA.left (), WORK_AREA.right (), WORK_AREA.top (), WORK_AREA.bottom ()), /* Just within */ cwe::Extents (WORK_AREA.left () + 1, WORK_AREA.right () - 1, WORK_AREA.top () + 1, WORK_AREA.bottom () - 1), /* Just outside right */ cwe::Extents (WORK_AREA.left () + 1, WORK_AREA.right () + 1, WORK_AREA.top (), WORK_AREA.bottom ()), /* Just outside left */ cwe::Extents (WORK_AREA.left () - 1, WORK_AREA.right () - 1, WORK_AREA.top (), WORK_AREA.bottom ()), /* Just outside top */ cwe::Extents (WORK_AREA.left (), WORK_AREA.right (), WORK_AREA.top () - 1, WORK_AREA.bottom () - 1), /* Just outside bottom */ cwe::Extents (WORK_AREA.left (), WORK_AREA.right (), WORK_AREA.top () + 1, WORK_AREA.bottom () + 1), }; } class PlaceClampEdgePositions : public CompPlaceTest, public WithParamInterface { }; TEST_P (PlaceClampEdgePositions, WithinWorkAreaWidth) { CompWindowExtents edgePositions (GetParam ()); cp::clampHorizontalEdgePositionsToWorkArea (edgePositions, WORK_AREA); const int edgePositionsWidth = edgePositions.right - edgePositions.left; ASSERT_GT (edgePositionsWidth, 0); EXPECT_LE (edgePositionsWidth, WORK_AREA.width ()); } TEST_P (PlaceClampEdgePositions, OutsideLeft) { CompWindowExtents edgePositions (GetParam ()); cp::clampHorizontalEdgePositionsToWorkArea (edgePositions, WORK_AREA); ASSERT_GE (edgePositions.left, WORK_AREA.left ()); ASSERT_GE (edgePositions.right, WORK_AREA.left ()); } TEST_P (PlaceClampEdgePositions, OutsideRight) { CompWindowExtents edgePositions (GetParam ()); cp::clampHorizontalEdgePositionsToWorkArea (edgePositions, WORK_AREA); ASSERT_LE (edgePositions.left, WORK_AREA.right ()); ASSERT_LE (edgePositions.right, WORK_AREA.right ()); } TEST_P (PlaceClampEdgePositions, WithinWorkAreaHeight) { CompWindowExtents edgePositions (GetParam ()); cp::clampVerticalEdgePositionsToWorkArea (edgePositions, WORK_AREA); const int edgePositionsHeight = edgePositions.bottom - edgePositions.top; ASSERT_GT (edgePositionsHeight, 0); EXPECT_LE (edgePositionsHeight, WORK_AREA.height ()); } TEST_P (PlaceClampEdgePositions, OutsideTop) { CompWindowExtents edgePositions (GetParam ()); cp::clampVerticalEdgePositionsToWorkArea (edgePositions, WORK_AREA); ASSERT_GE (edgePositions.top, WORK_AREA.top ()); ASSERT_GE (edgePositions.bottom, WORK_AREA.top ()); } TEST_P (PlaceClampEdgePositions, OutsideBottom) { CompWindowExtents edgePositions (GetParam ()); cp::clampVerticalEdgePositionsToWorkArea (edgePositions, WORK_AREA); ASSERT_LE (edgePositions.top, WORK_AREA.bottom ()); ASSERT_LE (edgePositions.bottom, WORK_AREA.bottom ()); } INSTANTIATE_TEST_CASE_P (WAEdgePositions, PlaceClampEdgePositions, ValuesIn (EdgePositions)); TEST (PlaceSubtractBordersFromEdgePositions, NormalGravity) { const CompWindowExtents borders (1, 2, 3, 4); const CompWindowExtents edgePositions (100, 200, 100, 200); const unsigned int legacyBorder = 1; CompWindowExtents expectedEdgePositions (edgePositions.left + (borders.left), edgePositions.right - (borders.right + 2 * legacyBorder), edgePositions.top + (borders.top), edgePositions.bottom - (borders.bottom + 2 * legacyBorder)); CompWindowExtents modifiedEdgePositions (edgePositions); cp::subtractBordersFromEdgePositions (modifiedEdgePositions, borders, legacyBorder); EXPECT_EQ (expectedEdgePositions, modifiedEdgePositions); } TEST (PlaceSizeAndPositionChanged, PositionChangedReturnsFalse) { EXPECT_FALSE (cp::onlySizeChanged (CWX | CWY)); } TEST (PlaceSizeAndPositionChanged, SizeChangedReturnsTrue) { EXPECT_TRUE (cp::onlySizeChanged (CWWidth | CWHeight)); } TEST (PlaceSizeAndPositionChanged, XAndWidthChangedReturnsFalse) { EXPECT_FALSE (cp::onlySizeChanged (CWX | CWWidth)); } TEST (PlaceSizeAndPositionChanged, YAndHeightChangedReturnsFalse) { EXPECT_FALSE (cp::onlySizeChanged (CWY | CWHeight)); } TEST (PlaceApplyWidthChange, ReturnFalseIfNoChange) { CompWindowExtents edgePositions (100, 200, 100, 200); XWindowChanges xwc; xwc.width = 100; unsigned int mask = CWWidth; EXPECT_FALSE (cp::applyWidthChange(edgePositions, xwc, mask)); } TEST (PlaceApplyWidthChange, ApplyWidthAndSetFlag) { CompWindowExtents edgePositions (100, 200, 100, 200); XWindowChanges xwc; unsigned int mask = 0; ASSERT_TRUE (cp::applyWidthChange(edgePositions, xwc, mask)); EXPECT_EQ (edgePositions.right - edgePositions.left, xwc.width); EXPECT_EQ (CWWidth, mask); } TEST (PlaceApplyHeightChange, ReturnFalseIfNoChange) { CompWindowExtents edgePositions (100, 200, 100, 200); XWindowChanges xwc; xwc.height = 100; unsigned int mask = CWHeight; EXPECT_FALSE (cp::applyHeightChange(edgePositions, xwc, mask)); } TEST (PlaceApplyWidthChange, ApplyHeightAndSetFlag) { CompWindowExtents edgePositions (100, 200, 100, 200); XWindowChanges xwc; unsigned int mask = 0; ASSERT_TRUE (cp::applyHeightChange(edgePositions, xwc, mask)); EXPECT_EQ (edgePositions.bottom - edgePositions.top, xwc.height); EXPECT_EQ (CWHeight, mask); } ././@LongLink0000000000000000000000000000016400000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/src/CMakeLists.txtcompiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/src0000644000015301777760000000212012321343002033357 0ustar pbusernogroup00000000000000link_directories (${COMPIZ_TEST_PLACE_LINK_DIRS}) include_directories (${COMPIZ_TEST_PLACE_INCLUDE_DIRS} ${compiz_SOURCE_DIR}/include ${compiz_BINARY_DIR} ${compiz_BINARY_DIR}/generated ${compiz_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/plugins/place/src ${compiz_SOURCE_DIR}/src/window/geometry/include/ ${compiz_SOURCE_DIR}/src/window/geometry-saver/include/ ${compiz_SOURCE_DIR}/src/window/extents/include/ ${compiz_SOURCE_DIR}/src/point/include/ ${compiz_SOURCE_DIR}/src/rect/include/ ${COMPIZ_PLACE_TEST_BASE_DIR}) add_executable (test-place-clamp-to-workarea test-place-constrain-to-workarea.cpp ../test-place.cpp ${compiz_SOURCE_DIR}/plugins/place/src/constrain-to-workarea.cpp ${compiz_SOURCE_DIR}/src/size.cpp) target_link_libraries (test-place-clamp-to-workarea compiz_window_geometry compiz_window_extents compiz_point compiz_rect ${COMPIZ_TEST_PLACE_LIBRARIES}) add_test (test-place-clamp-to-workarea ${CMAKE_CURRENT_BINARY_DIR}/test-place-clamp-to-workarea) compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/tests/CMakeLists.txt0000644000015301777760000000134412321343002031163 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_place_constrain_to_workarea_test ${CMAKE_CURRENT_SOURCE_DIR}/test-constrain-to-workarea.cpp) add_executable (compiz_test_place_constrain_to_workarea ${CMAKE_CURRENT_SOURCE_DIR}/constrain-to-workarea/src/test-place-constrain-to-workarea.cpp) target_link_libraries (compiz_test_place_constrain_to_workarea compiz_place_constrain_to_workarea_test compiz_place_constrain_to_workarea ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_place_constrain_to_workarea COVERAGE compiz_place_constrain_to_workarea) compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/CMakeLists.txt0000644000015301777760000000226412321343002030023 0ustar pbusernogroup00000000000000pkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry-saver/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/constrain-to-workarea.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/constrain-to-workarea.cpp ${compiz_SOURCE_DIR}/src/size.cpp ) ADD_LIBRARY( compiz_place_constrain_to_workarea STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_place_constrain_to_workarea PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) TARGET_LINK_LIBRARIES( compiz_place_constrain_to_workarea compiz_core ${GLIBMM_LIBRARIES} ) compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/src/0000755000015301777760000000000012321344021026050 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/src/constrain-to-workarea.cpp0000644000015301777760000002011612321343002033003 0ustar pbusernogroup00000000000000/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include "constrain-to-workarea.h" namespace compiz { namespace place { unsigned int clampGeometrySizeOnly = (1 << 0); unsigned int clampGeometryToViewport = (1 << 1); } } namespace cp = compiz::place; namespace cw = compiz::window; void cp::clampGeometryToWorkArea (cw::Geometry &g, const CompRect &workArea, const CompWindowExtents &border, unsigned int flags, const CompSize &screenSize) { int x, y, left, right, bottom, top; if (flags & clampGeometryToViewport) { /* left, right, top, bottom target coordinates, clamed to viewport * sizes as we don't need to validate movements to other viewports; * we are only interested in inner-viewport movements */ x = g.x () % screenSize.width (); if ((x + g.width ()) < 0) x += screenSize.width (); y = g.y () % screenSize.height (); if ((y + g.height ()) < 0) y += screenSize.height (); } else { x = g.x (); y = g.y (); } left = x - border.left; right = left + g.widthIncBorders () + (border.left + border.right); top = y - border.top; bottom = top + g.heightIncBorders () + (border.top + border.bottom); if ((right - left) > workArea.width ()) { left = workArea.left (); right = workArea.right (); } else { if (left < workArea.left ()) { right += workArea.left () - left; left = workArea.left (); } if (right > workArea.right ()) { left -= right - workArea.right (); right = workArea.right (); } } if ((bottom - top) > workArea.height ()) { top = workArea.top (); bottom = workArea.bottom (); } else { if (top < workArea.top ()) { bottom += workArea.top () - top; top = workArea.top (); } if (bottom > workArea.bottom ()) { top -= bottom - workArea.bottom (); bottom = workArea.bottom (); } } /* bring left/right/top/bottom to actual window coordinates */ left += border.left; right -= border.right + 2 * g.border (); top += border.top; bottom -= border.bottom + 2 * g.border (); if ((right - left) != g.width ()) { g.setWidth (right - left); flags &= ~clampGeometrySizeOnly; } if ((bottom - top) != g.height ()) { g.setHeight (bottom - top); flags &= ~clampGeometrySizeOnly; } if (!(flags & clampGeometrySizeOnly)) { if (left != x) g.setX (g.x () + left - x); if (top != y) g.setY (g.y () + top - y); } } CompPoint & cp::constrainPositionToWorkArea (CompPoint &pos, const cw::Geometry &serverGeometry, const CompWindowExtents &border, const CompRect &workArea) { CompWindowExtents extents; int delta; extents.left = pos.x () - border.left; extents.top = pos.y () - border.top; extents.right = extents.left + serverGeometry.widthIncBorders () + (border.left + border.right); extents.bottom = extents.top + serverGeometry.heightIncBorders () + (border.top + border.bottom); delta = workArea.right () - extents.right; if (delta < 0) extents.left += delta; delta = workArea.left () - extents.left; if (delta > 0) extents.left += delta; delta = workArea.bottom () - extents.bottom; if (delta < 0) extents.top += delta; delta = workArea.top () - extents.top; if (delta > 0) extents.top += delta; pos.setX (extents.left + border.left); pos.setY (extents.top + border.top); return pos; } CompPoint cp::getViewportRelativeCoordinates (const cw::Geometry &geom, const CompSize &screen) { /* left, right, top, bottom target coordinates, clamed to viewport * sizes as we don't need to validate movements to other viewports; * we are only interested in inner-viewport movements */ int x = geom.x () % screen.width (); if ((geom.x2 ()) < 0) x += screen.width (); int y = geom.y () % screen.height (); if ((geom.y2 ()) < 0) y += screen.height (); return CompPoint (x, y); } CompWindowExtents cp::getWindowEdgePositions (const CompPoint &position, const cw::Geometry &geom, const CompWindowExtents &border) { CompWindowExtents edgePositions; edgePositions.left = position.x () - border.left; edgePositions.right = edgePositions.left + geom.widthIncBorders () + (border.left + border.right); edgePositions.top = position.y () - border.top; edgePositions.bottom = edgePositions.top + geom.heightIncBorders () + (border.top + border.bottom); return edgePositions; } void cp::clampHorizontalEdgePositionsToWorkArea (CompWindowExtents &edgePositions, const CompRect &workArea) { if ((edgePositions.right - edgePositions.left) > workArea.width ()) { edgePositions.left = workArea.left (); edgePositions.right = workArea.right (); } else { if (edgePositions.left < workArea.left ()) { edgePositions.right += workArea.left () - edgePositions.left; edgePositions.left = workArea.left (); } if (edgePositions.right > workArea.right ()) { edgePositions.left -= edgePositions.right - workArea.right (); edgePositions.right = workArea.right (); } } } void cp::clampVerticalEdgePositionsToWorkArea (CompWindowExtents &edgePositions, const CompRect &workArea) { if ((edgePositions.bottom - edgePositions.top) > workArea.height ()) { edgePositions.top = workArea.top (); edgePositions.bottom = workArea.bottom (); } else { if (edgePositions.top < workArea.top ()) { edgePositions.bottom += workArea.top () - edgePositions.top; edgePositions.top = workArea.top (); } if (edgePositions.bottom > workArea.bottom ()) { edgePositions.top -= edgePositions.bottom - workArea.bottom (); edgePositions.bottom = workArea.bottom (); } } } void cp::subtractBordersFromEdgePositions (CompWindowExtents &edgePositions, const CompWindowExtents &border, unsigned int legacyBorder) { const unsigned int doubleBorder = 2 * legacyBorder; edgePositions.left += border.left; edgePositions.right -= border.right + doubleBorder; edgePositions.top += border.top; edgePositions.bottom -= border.bottom + doubleBorder; } bool cp::onlySizeChanged (unsigned int mask) { return (!(mask & (CWX | CWY)) && (mask & (CWWidth | CWHeight))); } bool cp::applyWidthChange (const CompWindowExtents &edgePositions, XWindowChanges &xwc, unsigned int &mask) { bool alreadySet = mask & CWWidth; if (alreadySet) alreadySet = edgePositions.right - edgePositions.left == xwc.width; if (!alreadySet) { xwc.width = edgePositions.right - edgePositions.left; mask |= CWWidth; return true; } return false; } bool cp::applyHeightChange (const CompWindowExtents &edgePositions, XWindowChanges &xwc, unsigned int &mask) { bool alreadySet = mask & CWHeight; if (alreadySet) alreadySet = edgePositions.bottom - edgePositions.top == xwc.height; if (!alreadySet) { xwc.height = edgePositions.bottom - edgePositions.top; mask |= CWHeight; return true; } return false; } compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/include/0000755000015301777760000000000012321344021026704 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/constrain-to-workarea/include/constrain-to-workarea.h0000644000015301777760000000526712321343002033316 0ustar pbusernogroup00000000000000/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 _COMPIZ_PLACE_CLAMP_TO_WORKAREA_H #define _COMPIZ_PLACE_CLAMP_TO_WORKAREA_H #include #include #include #include #include namespace compiz { namespace place { extern unsigned int clampGeometrySizeOnly; extern unsigned int clampGeometryToViewport; void clampGeometryToWorkArea (compiz::window::Geometry &g, const CompRect &workArea, const CompWindowExtents &border, unsigned int flags, const CompSize &screenSize); CompPoint & constrainPositionToWorkArea (CompPoint &pos, const compiz::window::Geometry &serverGeometry, const CompWindowExtents &border, const CompRect &workArea); CompPoint getViewportRelativeCoordinates (const compiz::window::Geometry &geom, const CompSize &screen); CompWindowExtents getWindowEdgePositions (const CompPoint &position, const compiz::window::Geometry &geom, const CompWindowExtents &border); void clampHorizontalEdgePositionsToWorkArea (CompWindowExtents &edgePositions, const CompRect &workArea); void clampVerticalEdgePositionsToWorkArea (CompWindowExtents &edgePositions, const CompRect &workArea); void subtractBordersFromEdgePositions (CompWindowExtents &edgePositions, const CompWindowExtents &border, unsigned int legacyBorder); bool onlySizeChanged (unsigned int mask); bool applyWidthChange (const CompWindowExtents &edgePositions, XWindowChanges &xwc, unsigned int &mask); bool applyHeightChange (const CompWindowExtents &edgePositions, XWindowChanges &xwc, unsigned int &mask); } } #endif compiz-0.9.11+14.04.20140409/plugins/place/src/place.h0000644000015301777760000001116312321343002022265 0ustar pbusernogroup00000000000000/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * 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 "place_options.h" #include "screen-size-change.h" #include "smart.h" namespace compiz { namespace place { CompWindowList collectStrutWindows (const CompWindowList &allWindows); } } class PlaceScreen : public PluginClassHandler, public ScreenInterface, public PlaceOptions { public: PlaceScreen (CompScreen *); ~PlaceScreen (); void handleEvent (XEvent *event); void doHandleScreenSizeChange (int, int); bool handleScreenSizeChangeFallback (int width, int height); void handleScreenSizeChange (int width, int height); bool getPointerPosition (CompPoint &p); void addSupportedAtoms (std::vector&); CompSize mPrevSize; int mStrutWindowCount; CompTimer mResChangeFallbackHandle; CompWindowList mStrutWindows; Atom fullPlacementAtom; }; #define PLACE_SCREEN(s) \ PlaceScreen *ps = PlaceScreen::get (s) class PlaceWindow : public PluginClassHandler, public compiz::place::ScreenSizeChangeObject, public compiz::place::Placeable, public WindowInterface { public: PlaceWindow (CompWindow *w); ~PlaceWindow (); bool place (CompPoint &pos); CompRect doValidateResizeRequest (unsigned int &, XWindowChanges *, bool, bool); void validateResizeRequest (unsigned int &mask, XWindowChanges *xwc, unsigned int source); void grabNotify (int, int, unsigned int, unsigned int); CompPoint mPrevServer; protected: void applyGeometry (compiz::window::Geometry &ng, compiz::window::Geometry &og); const compiz::window::Geometry & getGeometry () const; const CompPoint & getViewport () const; const CompRect & getWorkarea (const compiz::window::Geometry &g) const; const CompRect & getWorkarea () const; const compiz::window::extents::Extents & getExtents () const; unsigned int getState () const; private: typedef enum { NoPlacement = 0, PlaceOnly, ConstrainOnly, PlaceAndConstrain, PlaceOverParent, PlaceCenteredOnScreen } PlacementStrategy; void doPlacement (CompPoint &pos); bool windowIsPlaceRelevant (CompWindow *w); bool hasUserDefinedPosition (bool); PlacementStrategy getStrategy (); const CompOutput & getPlacementOutput (int mode, PlacementStrategy strategy, CompPoint pos); int getPlacementMode (); void sendMaximizationRequest (); void constrainToWorkarea (const CompRect& workArea, CompPoint& pos); void placeCascade (const CompRect& workArea, CompPoint& pos); void placeCentered (const CompRect& workArea, CompPoint& pos); void placeRandom (const CompRect& workArea, CompPoint& pos); void placePointer (const CompRect& workArea, CompPoint& pos); void placeSmart (CompPoint& pos, const compiz::place::Placeable::Vector &); bool cascadeFindFirstFit (const Placeable::Vector &placeabless, const CompRect& workArea, CompPoint &pos); void cascadeFindNext (const Placeable::Vector &placeables, const CompRect& workArea, CompPoint &pos); bool matchPosition (CompPoint &pos, bool& keepInWorkarea); bool matchViewport (CompPoint &pos); bool matchXYValue (CompOption::Value::Vector &matches, CompOption::Value::Vector &xValues, CompOption::Value::Vector &yValues, CompPoint &pos, CompOption::Value::Vector *constrainValues = NULL, bool *keepInWorkarea = NULL); CompWindow *window; PlaceScreen *ps; }; #define PLACE_WINDOW(w) \ PlaceWindow *pw = PlaceWindow::get (w) class PlacePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/place/src/smart/0000755000015301777760000000000012321344021022156 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/smart/tests/0000755000015301777760000000000012321344021023320 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/smart/tests/offscreen/0000755000015301777760000000000012321344021025272 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/smart/tests/offscreen/src/0000755000015301777760000000000012321344021026061 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000015000000000000011211 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/smart/tests/offscreen/src/test-place-smart-on-screen.cppcompiz-0.9.11+14.04.20140409/plugins/place/src/smart/tests/offscreen/src/test-place-smart-on-screen.0000644000015301777760000001050612321343002033136 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include "smart.h" #include #include #include #include #ifndef foreach #define foreach BOOST_FOREACH #endif class CompPlaceSmartOffscreenTest : public ::testing::Test { }; class MockPlaceableObject : public compiz::place::Placeable { public: MockPlaceableObject (const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &extents, const std::vector &availableWorkareas); const compiz::window::Geometry & getGeometry () const { return mGeometry; } const CompRect & getWorkarea () const { return *mWorkarea; } const compiz::window::extents::Extents & getExtents () const { return mExtents; } unsigned int getState () const { return 0; } private: compiz::window::Geometry mGeometry; CompRect *mWorkarea; compiz::window::extents::Extents mExtents; }; MockPlaceableObject::MockPlaceableObject (const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &extents, const std::vector &availableWorkareas) : compiz::place::Placeable::Placeable (), mGeometry (geometry), mExtents (extents) { unsigned int areaMax = 0; CompRect *running = availableWorkareas.front (); /* Pick the workarea that we best intersect */ foreach (CompRect *rect, availableWorkareas) { unsigned int area = abs ((*rect & static_cast (geometry)).area ()); if (area > areaMax) { running = rect; areaMax = area; } } mWorkarea = running; } TEST_F(CompPlaceSmartOffscreenTest, TestOffscreenOne) { CompRect wa1 (0, 24, 1680, 1026); CompRect wa2 (1680, 24, 1024, 744); compiz::place::Placeable::Vector v; std::vector workAreas; workAreas.push_back (&wa1); workAreas.push_back (&wa2); /* Intersects 1 */ compiz::window::Geometry g (0, 0, 640, 480, 0); compiz::window::extents::Extents e; e.left = 10; e.right = 10; e.top = 10; e.bottom = 10; MockPlaceableObject p (g, e, workAreas); CompPoint pos (g.x (), g.y ()); compiz::place::smart (&p, pos, v); EXPECT_EQ (pos, CompPoint (10, 34)); /* Intersects 2 */ g = compiz::window::Geometry (1681, 0, 640, 480, 0); p = MockPlaceableObject (g, e, workAreas); compiz::place::smart (&p, pos, v); EXPECT_EQ (pos, CompPoint (1690, 34)); /* Intersects 2 partially */ g = compiz::window::Geometry (1681, 500, 640, 480, 0); p = MockPlaceableObject (g, e, workAreas); compiz::place::smart (&p, pos, v); EXPECT_EQ (pos, CompPoint (1690, 34)); /* Intersects 1 + 2 partially (1 more) */ g = compiz::window::Geometry (1300, 500, 640, 480, 0); p = MockPlaceableObject (g, e, workAreas); compiz::place::smart (&p, pos, v); EXPECT_EQ (pos, CompPoint (10, 34)); /* Intersects 1 + 2 partially (2 more) */ g = compiz::window::Geometry (1600, 500, 640, 480, 0); p = MockPlaceableObject (g, e, workAreas); compiz::place::smart (&p, pos, v); EXPECT_EQ (pos, CompPoint (1690, 34)); } ././@LongLink0000000000000000000000000000014600000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/smart/tests/offscreen/src/test-place-smart-onscren.cppcompiz-0.9.11+14.04.20140409/plugins/place/src/smart/tests/offscreen/src/test-place-smart-onscren.cp0000644000015301777760000000645412321343002033246 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include "smart.h" #include #include #include class CompPlaceSmartOffscreenTest : public ::testing::Test { }; class MockPlaceableObject : public compiz::place::Placeable { public: MockPlaceableObject (const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &extents, const std::vector &availableWorkareas); const compiz::window::Geometry & getGeometry () const { return mGeometry; } const CompRect & getWorkarea () const { return *mWorkarea; } const compiz::window::extents::Extents & getExtents () const { return mExtents; } private: compiz::window::Geometry mGeometry; CompRect *mWorkarea; compiz::window::extents::Extents mExtents; } MockPlaceableObject::MockPlaceableObject (const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &extents, const std::vector &availableWorkareas) : compiz::place::Placeable::Placeable (), mGeometry (geometry), mExtents (extents) { unsigned int areaMax = 0; CompRect *running = availableWorkareas.front (); /* Pick the workarea that we best intersect */ foreach (CompRect *rect, availableWorkareas) { unsigned int area = abs ((*rect & static_cast (geometry)).area ()); if (area > areaMax) { running = rect; areaMax = area; } } mWorkarea = running; } TEST_F(CompPlaceSmartOffscreenTest, TestOffscreenOne) { CompRect wa1 (0, 24, 1680, 1026); CompRect wa2 (1680, 24, 1024, 744); compiz::place::Placeable::Vector v; std::vector workAreas; workAreas.push_back (&wa1); workAreas.push_back (&wa2); /* Intersects 1 */ compiz::window::Geometry g (0, 0, 640, 480); compiz::window::extents::Extents e (10, 10, 10, 10); MockPlaceableObject p (g, e, workAreas); CompPoint pos (g.x (), g.y ()); compiz::place::smart (p, pos, v); std::cout << pos.x () << pos.y () << std::endl; EXPECT_EQ (pos, CompPoint (0, 0)); } compiz-0.9.11+14.04.20140409/plugins/place/src/smart/tests/CMakeLists.txt0000644000015301777760000000072412321343002026061 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_executable (compiz_test_place_smart_on_screen ${CMAKE_CURRENT_SOURCE_DIR}/offscreen/src/test-place-smart-on-screen.cpp) target_link_libraries (compiz_test_place_smart_on_screen compiz_place_smart ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_place_smart_on_screen COVERAGE compiz_place_smart) compiz-0.9.11+14.04.20140409/plugins/place/src/smart/CMakeLists.txt0000644000015301777760000000210012321343002024705 0ustar pbusernogroup00000000000000pkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry-saver/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/smart.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/smart.cpp ) ADD_LIBRARY( compiz_place_smart STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_place_smart PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) TARGET_LINK_LIBRARIES( compiz_place_smart compiz_core ${GLIBMM_LIBRARIES} ) compiz-0.9.11+14.04.20140409/plugins/place/src/smart/src/0000755000015301777760000000000012321344021022745 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/smart/src/smart.cpp0000644000015301777760000001305412321343002024600 0ustar pbusernogroup00000000000000#include "smart.h" #include #ifndef foreach #define foreach BOOST_FOREACH #endif /* overlap types */ static const unsigned short NONE = 0; static const short H_WRONG = -1; static const short W_WRONG = -2; namespace compiz { namespace place { const unsigned int WindowAbove = 1 << 0; const unsigned int WindowBelow = 1 << 1; Placeable::Placeable () { } Placeable::~Placeable () { } void smart (Placeable *placeable, CompPoint &pos, const compiz::place::Placeable::Vector &placeables) { /* * SmartPlacement by Cristian Tibirna (tibirna@kde.org) * adapted for kwm (16-19jan98) and for kwin (16Nov1999) using (with * permission) ideas from fvwm, authored by * Anthony Martin (amartin@engr.csulb.edu). * Xinerama supported added by Balaji Ramani (balaji@yablibli.com) * with ideas from xfce. * adapted for Compiz by Bellegarde Cedric (gnumdk(at)gmail.com) */ int overlap = 0, minOverlap = 0; /* temp holder */ int basket = 0; /* CT lame flag. Don't like it. What else would do? */ bool firstPass = true; /* get the maximum allowed windows space */ int xTmp = placeable->workArea ().x (); int yTmp = placeable->workArea ().y (); /* client gabarit */ int cw = placeable->geometry ().width () - 1; int ch = placeable->geometry ().height () - 1; int xOptimal = xTmp; int yOptimal = yTmp; /* loop over possible positions */ do { /* test if enough room in x and y directions */ if (yTmp + ch > placeable->workArea ().bottom () && ch < placeable->workArea ().height ()) overlap = H_WRONG; /* this throws the algorithm to an exit */ else if (xTmp + cw > placeable->workArea ().right ()) overlap = W_WRONG; else { overlap = NONE; /* initialize */ int cxl = xTmp; int cxr = xTmp + cw; int cyt = yTmp; int cyb = yTmp + ch; foreach (Placeable *p, placeables) { const compiz::window::Geometry &otherGeometry = p->geometry (); const compiz::window::extents::Extents &otherExtents = p->extents (); int xl = otherGeometry.x () - otherExtents.left; int yt = otherGeometry.y () - otherExtents.top; int xr = otherGeometry.x2 () + otherExtents.right + otherGeometry.border () * 2; int yb = otherGeometry.y2 () + otherExtents.bottom + otherGeometry.border () * 2; /* if windows overlap, calc the overall overlapping */ if (cxl < xr && cxr > xl && cyt < yb && cyb > yt) { xl = MAX (cxl, xl); xr = MIN (cxr, xr); yt = MAX (cyt, yt); yb = MIN (cyb, yb); if (p->state () & compiz::place::WindowAbove) overlap += 16 * (xr - xl) * (yb - yt); else if (p->state () & compiz::place::WindowBelow) overlap += 0; else overlap += (xr - xl) * (yb - yt); } } } /* CT first time we get no overlap we stop */ if (overlap == NONE) { xOptimal = xTmp; yOptimal = yTmp; break; } if (firstPass) { firstPass = false; minOverlap = overlap; } /* CT save the best position and the minimum overlap up to now */ else if (overlap >= NONE && overlap < minOverlap) { minOverlap = overlap; xOptimal = xTmp; yOptimal = yTmp; } /* really need to loop? test if there's any overlap */ if (overlap > NONE) { int possible = placeable->workArea ().right (); if (possible - cw > xTmp) possible -= cw; /* compare to the position of each client on the same desk */ foreach (Placeable *p, placeables) { const compiz::window::Geometry &otherGeometry = p->geometry (); const compiz::window::extents::Extents &otherExtents = p->extents (); int xl = otherGeometry.x () - otherExtents.left; int yt = otherGeometry.y () - otherExtents.top; int xr = otherGeometry.x2 () + otherExtents.right + otherGeometry.border () * 2; int yb = otherGeometry.y2 () + otherExtents.bottom + otherGeometry.border () * 2; /* if not enough room above or under the current * client determine the first non-overlapped x position */ if (yTmp < yb && yt < ch + yTmp) { if (xr > xTmp && possible > xr) possible = xr; basket = xl - cw; if (basket > xTmp && possible > basket) possible = basket; } } xTmp = possible; } /* else ==> not enough x dimension (overlap was wrong on horizontal) */ else if (overlap == W_WRONG) { xTmp = placeable->workArea ().x (); int possible = placeable->workArea ().bottom (); if (possible - ch > yTmp) possible -= ch; /* test the position of each window on the desk */ foreach (Placeable *p, placeables) { const compiz::window::Geometry &otherGeometry = p->geometry (); const compiz::window::extents::Extents &otherExtents = p->extents (); int yt = otherGeometry.y () - otherExtents.top; int yb = otherGeometry.y2 () + otherExtents.bottom + otherGeometry.border () * 2; /* if not enough room to the left or right of the current * client determine the first non-overlapped y position */ if (yb > yTmp && possible > yb) possible = yb; basket = yt - ch; if (basket > yTmp && possible > basket) possible = basket; } yTmp = possible; } } while (overlap != NONE && overlap != H_WRONG && yTmp < placeable->workArea ().bottom ()); if (ch >= placeable->workArea ().height ()) yOptimal = placeable->workArea ().y (); pos.setX (xOptimal + placeable->extents ().left); pos.setY (yOptimal + placeable->extents ().top); } } } compiz-0.9.11+14.04.20140409/plugins/place/src/smart/include/0000755000015301777760000000000012321344021023601 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/place/src/smart/include/smart.h0000644000015301777760000000401012321343002025071 0ustar pbusernogroup00000000000000/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 _COMPIZ_PLACE_SMART_H #define _COMPIZ_PLACE_SMART_H #include #include #include #include #include #include namespace compiz { namespace place { extern const unsigned int WindowAbove; extern const unsigned int WindowBelow; class Placeable { public: typedef std::vector Vector; const compiz::window::Geometry & geometry () const { return getGeometry (); } const compiz::window::extents::Extents & extents () const { return getExtents (); } const CompRect & workArea () const { return getWorkarea (); } unsigned int state () const { return getState (); } virtual ~Placeable () = 0; protected: virtual const compiz::window::Geometry & getGeometry () const = 0; virtual const compiz::window::extents::Extents & getExtents () const = 0; virtual const CompRect & getWorkarea () const = 0; virtual unsigned int getState () const = 0; Placeable (); }; void smart (Placeable *placeable, CompPoint &pos, const compiz::place::Placeable::Vector &placeables); } } #endif compiz-0.9.11+14.04.20140409/plugins/showmouse/0000755000015301777760000000000012321344021021206 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/showmouse/showmouse.xml.in0000644000015301777760000000667612321343002024403 0ustar pbusernogroup00000000000000 <_short>Show mouse <_long>Increases the visibility of the mouse pointer Accessibility opengl mousepoll cube decor opengl mousepoll <_short>General <_short>Particle Options compiz-0.9.11+14.04.20140409/plugins/showmouse/images/0000755000015301777760000000000012321344021022453 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/showmouse/images/Star.png0000644000015301777760000000245712321343002024100 0ustar pbusernogroup00000000000000‰PNG  IHDR Ùs²öIDATMÁÏŽWÀáß9÷VuÕTÿ™žöŒ'Ž ÄR” „” „Ä!Ɉï/À3M6켄JØÄ€bÅcg Ã0挸6æSsæLòG&¼é·†a(W„‚k3Þ–o¹v°-ºr[TÙô}ÞTòŠçʈ_ó1—ŒŸËƵƒ¾JQë²ul?é?´5;‘ȯxÅsEøsŽÙ"?–y–UÅA6×[ÝØ4þ.>ŒÏ™qÈ+ž×ÎÉx›ûÀ÷9PÍmìné /sKeŸµØgɘð=×<¯GÜå`O®+cŽô–f±Ìj[I=_&¼Å\󼡿÷ØY:-eßs‡÷áÂ?o³{ý½ÄK rÍóZ¤g'qê4+K™è ¹Aa[ÝסËÎÜ4x„žŽkž+Æ["@â±$7Ìe$S9”C)l›tLéÛ¿÷ߴН ó\òÐñX%Ê{ò]éY’4Ïm¨ê”}°vi_‡]{3n,³ïð »à0]Ø9óà´ñsŸg#ߨ⩜–z¨Çr“™È€VŽÜM†•YˆXž‡U8èIþ‰Vþ¸ÐJ+Š,ǹ—Rgî¶ËT†’1–#½-µLu0I¤õëIÓ6mï"YUÅ™ÉTGš‹ÃIaS½­wtJ…— ·4˜÷ÏYˆ)È*-äÌ]tý<ú»,5eRÉ wKd(…x e&7ÉG¥‡IÜ+ÛÐ[§k¹àÔZVÉÏÄ?e`†ªä2”c9”‰–RRÊ¡D´´-[km™.,È\4ŠX/­nËJ–²”† #Q‹'CL„Œ‚­­Mli­Õ¶HuØXpÉOí¢o›½ç)¼31OŽCv<"fmya'éa|Ù9uè†ÉG{˜ö¶}=—0:D’æxÉñ;˜uÔvšÆÿƇáa8ïu{î$ŸóAúg?MMlµÍÖ”2ÐR<Ê¥dÑ{fÿ‹ÿéÿÕŸôOu•Z‰¤ 9±?ÅzÛ¬š‹ø$¤S{AC°„ñJ µE:‹Óãî¼[>k-|šr@yéß|fïÙ6«´°,hèH‰h‘H"ѳ±/Ò¼¯O·wC°ûd€ç¥o#dLñf¦ˆ &Á"IÌÁTœ‚™Ý²ÂfüüðpÆ€¨ÞK!{Râ iMGg‰ŒB¥ ¤ôY¡š–_pøŸÌøzWÈØÚZ›[C”R&VÉd$#ö|Þé'é¾ ðŸséëâœäR1ahŽÆö̧…ë±2¨ËP¸>>°ÄŽÿ3;J‰¨dVPଡµy:I_ÄAÇî™ÜÖcÄŒ\ ËKý™|È%ÿ>;>•;ê=¬±'lì$}ÙÒbÚ™{–¾*c¶Dó>ÛºGòCjvü/¹4dHkÚSǧòÜö(<ÝžÓ¤¤Kßæn8Ç\:IÂŒŸÐ³ãÿÆÎ>‹4謎OlAbÑŸÇ…­Rß1Þ„¶[»Z÷)i™ÛÆ’Ù?X±#çì(•öl¨#²RÓÕi£Ý0U\hò}Q }¥bZ»Z×¾_'cÇßàŠ—m7›=,.CÛ݉¿O1æËÓAjºýºô®_÷“PXÁ%ÏkƒÔ÷Ë4îò´5+Kìô¼kNST;º”Y‘0®ü•7«ˆpføIEND®B`‚compiz-0.9.11+14.04.20140409/plugins/showmouse/CMakeLists.txt0000644000015301777760000000017012321343002023742 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (showmouse PLUGINDEPS composite opengl mousepoll) compiz-0.9.11+14.04.20140409/plugins/showmouse/src/0000755000015301777760000000000012321344021021775 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/showmouse/src/showmouse.cpp0000644000015301777760000003527212321343002024541 0ustar pbusernogroup00000000000000/* * * Compiz show mouse pointer plugin * * showmouse.cpp * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smpillaz@gmail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "showmouse.h" COMPIZ_PLUGIN_20090315 (showmouse, ShowmousePluginVTable); /* 3 vertices per triangle, 2 triangles per particle */ const unsigned short CACHESIZE_FACTOR = 3 * 2; /* 2 coordinates, x and y */ const unsigned short COORD_COMPONENTS = CACHESIZE_FACTOR * 2; /* each vertex is stored as 3 GLfloats */ const unsigned short VERTEX_COMPONENTS = CACHESIZE_FACTOR * 3; /* 4 colors, RGBA */ const unsigned short COLOR_COMPONENTS = CACHESIZE_FACTOR * 4; Particle::Particle () : life (0), fade (0), width (0), height (0), w_mod (0), h_mod (0), r (0), g (0), b (0), a (0), x (0), y (0), z (0), xi (0), yi (0), zi (0), xg (0), yg (0), zg (0), xo (0), yo (0), zo (0) { } ParticleSystem::ParticleSystem (int n) : x (0), y (0) { initParticles (n); } ParticleSystem::ParticleSystem () : x (0), y (0) { initParticles (0); } ParticleSystem::~ParticleSystem () { finiParticles (); } void ParticleSystem::initParticles (int f_numParticles) { particles.clear (); tex = 0; slowdown = 1; active = false; darken = 0; // Initialize cache vertices_cache.clear (); coords_cache.clear (); colors_cache.clear (); dcolors_cache.clear (); for (int i = 0; i < f_numParticles; i++) { Particle p; p.life = 0.0f; particles.push_back (p); } } void ParticleSystem::drawParticles (const GLMatrix &transform) { int i, j, k, l; /* Check that the cache is big enough */ if (vertices_cache.size () < particles.size () * VERTEX_COMPONENTS) vertices_cache.resize (particles.size () * VERTEX_COMPONENTS); if (coords_cache.size () < particles.size () * COORD_COMPONENTS) coords_cache.resize (particles.size () * COORD_COMPONENTS); if (colors_cache.size () < particles.size () * COLOR_COMPONENTS) colors_cache.resize (particles.size () * COLOR_COMPONENTS); if (darken > 0) if (dcolors_cache.size () < particles.size () * COLOR_COMPONENTS) dcolors_cache.resize (particles.size () * COLOR_COMPONENTS); glEnable (GL_BLEND); if (tex) glBindTexture (GL_TEXTURE_2D, tex); i = j = k = l = 0; /* use 2 triangles per particle */ foreach (Particle &part, particles) { if (part.life > 0.0f) { float w = part.width / 2; float h = part.height / 2; GLushort r, g, b, a, dark_a; r = part.r * 65535.0f; g = part.g * 65535.0f; b = part.b * 65535.0f; a = part.life * part.a * 65535.0f; dark_a = part.life * part.a * darken * 65535.0f; w += (w * part.w_mod) * part.life; h += (h * part.h_mod) * part.life; //first triangle vertices_cache[i + 0] = part.x - w; vertices_cache[i + 1] = part.y - h; vertices_cache[i + 2] = part.z; vertices_cache[i + 3] = part.x - w; vertices_cache[i + 4] = part.y + h; vertices_cache[i + 5] = part.z; vertices_cache[i + 6] = part.x + w; vertices_cache[i + 7] = part.y + h; vertices_cache[i + 8] = part.z; //second triangle vertices_cache[i + 9] = part.x + w; vertices_cache[i + 10] = part.y + h; vertices_cache[i + 11] = part.z; vertices_cache[i + 12] = part.x + w; vertices_cache[i + 13] = part.y - h; vertices_cache[i + 14] = part.z; vertices_cache[i + 15] = part.x - w; vertices_cache[i + 16] = part.y - h; vertices_cache[i + 17] = part.z; i += 18; coords_cache[j + 0] = 0.0; coords_cache[j + 1] = 0.0; coords_cache[j + 2] = 0.0; coords_cache[j + 3] = 1.0; coords_cache[j + 4] = 1.0; coords_cache[j + 5] = 1.0; //second coords_cache[j + 6] = 1.0; coords_cache[j + 7] = 1.0; coords_cache[j + 8] = 1.0; coords_cache[j + 9] = 0.0; coords_cache[j + 10] = 0.0; coords_cache[j + 11] = 0.0; j += 12; colors_cache[k + 0] = r; colors_cache[k + 1] = g; colors_cache[k + 2] = b; colors_cache[k + 3] = a; colors_cache[k + 4] = r; colors_cache[k + 5] = g; colors_cache[k + 6] = b; colors_cache[k + 7] = a; colors_cache[k + 8] = r; colors_cache[k + 9] = g; colors_cache[k + 10] = b; colors_cache[k + 11] = a; //second colors_cache[k + 12] = r; colors_cache[k + 13] = g; colors_cache[k + 14] = b; colors_cache[k + 15] = a; colors_cache[k + 16] = r; colors_cache[k + 17] = g; colors_cache[k + 18] = b; colors_cache[k + 19] = a; colors_cache[k + 20] = r; colors_cache[k + 21] = g; colors_cache[k + 22] = b; colors_cache[k + 23] = a; k += 24; if(darken > 0) { dcolors_cache[l + 0] = r; dcolors_cache[l + 1] = g; dcolors_cache[l + 2] = b; dcolors_cache[l + 3] = dark_a; dcolors_cache[l + 4] = r; dcolors_cache[l + 5] = g; dcolors_cache[l + 6] = b; dcolors_cache[l + 7] = dark_a; dcolors_cache[l + 8] = r; dcolors_cache[l + 9] = g; dcolors_cache[l + 10] = b; dcolors_cache[l + 11] = dark_a; //second dcolors_cache[l + 12] = r; dcolors_cache[l + 13] = g; dcolors_cache[l + 14] = b; dcolors_cache[l + 15] = dark_a; dcolors_cache[l + 16] = r; dcolors_cache[l + 17] = g; dcolors_cache[l + 18] = b; dcolors_cache[l + 19] = dark_a; dcolors_cache[l + 20] = r; dcolors_cache[l + 21] = g; dcolors_cache[l + 22] = b; dcolors_cache[l + 23] = dark_a; l += 24; } } } GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); if (darken > 0) { glBlendFunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); stream->begin (GL_TRIANGLES); stream->addVertices (i / 3, &vertices_cache[0]); stream->addTexCoords (0, j / 2, &coords_cache[0]); stream->addColors (l / 4, &dcolors_cache[0]); if (stream->end ()) stream->render (transform); } // draw particles glBlendFunc (GL_SRC_ALPHA, blendMode); stream->begin (GL_TRIANGLES); stream->addVertices (i / 3, &vertices_cache[0]); stream->addTexCoords (0, j / 2, &coords_cache[0]); stream->addColors (k / 4, &colors_cache[0]); if (stream->end ()) stream->render (transform); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_BLEND); } void ParticleSystem::updateParticles (float time) { float speed = (time / 50.0); float f_slowdown = slowdown * (1 - MAX (0.99, time / 1000.0) ) * 1000; active = false; foreach (Particle &part, particles) { if (part.life > 0.0f) { // move particle part.x += part.xi / f_slowdown; part.y += part.yi / f_slowdown; part.z += part.zi / f_slowdown; // modify speed part.xi += part.xg * speed; part.yi += part.yg * speed; part.zi += part.zg * speed; // modify life part.life -= part.fade * speed; active = true; } } } void ParticleSystem::finiParticles () { particles.clear (); if (tex) glDeleteTextures (1, &tex); } static void toggleFunctions (bool enabled) { SHOWMOUSE_SCREEN (screen); ss->cScreen->preparePaintSetEnabled (ss, enabled); ss->gScreen->glPaintOutputSetEnabled (ss, enabled); ss->cScreen->donePaintSetEnabled (ss, enabled); } void ShowmouseScreen::genNewParticles (int f_time) { bool rColor = optionGetRandom (); float life = optionGetLife (); float lifeNeg = 1 - life; float fadeExtra = 0.2f * (1.01 - life); float max_new = ps.particles.size () * ((float)f_time / 50) * (1.05 - life); unsigned short *c = optionGetColor (); float colr1 = (float)c[0] / 0xffff; float colg1 = (float)c[1] / 0xffff; float colb1 = (float)c[2] / 0xffff; float colr2 = 1.0 / 4.0 * (float)c[0] / 0xffff; float colg2 = 1.0 / 4.0 * (float)c[1] / 0xffff; float colb2 = 1.0 / 4.0 * (float)c[2] / 0xffff; float cola = (float)c[3] / 0xffff; float rVal; float partw = optionGetSize () * 5; float parth = partw; unsigned int i, j; float pos[10][2]; unsigned int nE = optionGetEmitters (); float rA = (2 * M_PI) / nE; int radius = optionGetRadius (); for (i = 0; i < nE; i++) { pos[i][0] = sin (rot + (i * rA)) * radius; pos[i][0] += mousePos.x (); pos[i][1] = cos (rot + (i * rA)) * radius; pos[i][1] += mousePos.y (); } for (i = 0; i < ps.particles.size () && max_new > 0; i++) { Particle &part = ps.particles.at (i); if (part.life <= 0.0f) { // give gt new life rVal = (float)(random() & 0xff) / 255.0; part.life = 1.0f; part.fade = rVal * lifeNeg + fadeExtra; // Random Fade Value // set size part.width = partw; part.height = parth; part.w_mod = part.h_mod = -1; // choose random position j = random() % nE; part.x = pos[j][0]; part.y = pos[j][1]; part.z = 0.0; part.xo = part.x; part.yo = part.y; part.zo = part.z; // set speed and direction rVal = (float)(random() & 0xff) / 255.0; part.xi = ((rVal * 20.0) - 10.0f); rVal = (float)(random() & 0xff) / 255.0; part.yi = ((rVal * 20.0) - 10.0f); part.zi = 0.0f; if (rColor) { // Random colors! (aka Mystical Fire) rVal = (float)(random() & 0xff) / 255.0; part.r = rVal; rVal = (float)(random() & 0xff) / 255.0; part.g = rVal; rVal = (float)(random() & 0xff) / 255.0; part.b = rVal; } else { rVal = (float)(random() & 0xff) / 255.0; part.r = colr1 - rVal * colr2; part.g = colg1 - rVal * colg2; part.b = colb1 - rVal * colb2; } // set transparency part.a = cola; // set gravity part.xg = 0.0f; part.yg = 0.0f; part.zg = 0.0f; ps.active = true; max_new -= 1; } } } void ShowmouseScreen::doDamageRegion () { float w, h; float x1 = screen->width (); float x2 = 0; float y1 = screen->height (); float y2 = 0; foreach (Particle &p, ps.particles) { w = p.width / 2; h = p.height / 2; w += (w * p.w_mod) * p.life; h += (h * p.h_mod) * p.life; x1 = MIN (x1, p.x - w); x2 = MAX (x2, p.x + w); y1 = MIN (y1, p.y - h); y2 = MAX (y2, p.y + h); } CompRegion r (floor (x1), floor (y1), (ceil (x2) - floor (x1)), (ceil (y2) - floor (y1))); cScreen->damageRegion (r); } void ShowmouseScreen::positionUpdate (const CompPoint &p) { mousePos = p; } void ShowmouseScreen::preparePaint (int f_time) { if (active && !pollHandle.active ()) { mousePos = MousePoller::getCurrentPosition (); pollHandle.start (); } if (active && !ps.active) { ps.initParticles (optionGetNumParticles ()); ps.slowdown = optionGetSlowdown (); ps.darken = optionGetDarken (); ps.blendMode = (optionGetBlend()) ? GL_ONE : GL_ONE_MINUS_SRC_ALPHA; ps.active = true; glGenTextures(1, &ps.tex); glBindTexture(GL_TEXTURE_2D, ps.tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, starTex); glBindTexture(GL_TEXTURE_2D, 0); } rot = fmod (rot + (((float)f_time / 1000.0) * 2 * M_PI * optionGetRotationSpeed ()), 2 * M_PI); if (ps.active) { ps.updateParticles (f_time); doDamageRegion (); } if (active) genNewParticles (f_time); cScreen->preparePaint (f_time); } void ShowmouseScreen::donePaint () { if (active || (ps.active)) doDamageRegion (); if (!active && pollHandle.active ()) pollHandle.stop (); if (!active && !ps.active) { ps.finiParticles (); toggleFunctions (false); } cScreen->donePaint (); } bool ShowmouseScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { GLMatrix sTransform = transform; bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (!ps.active) return status; //sTransform.reset (); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); ps.drawParticles (sTransform); return status; } bool ShowmouseScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { active = false; doDamageRegion (); gScreen->glPaintOutputSetEnabled (gScreen, false); return true; } bool ShowmouseScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (active) return terminate (action, state, options); active = true; toggleFunctions (true); gScreen->glPaintOutputSetEnabled (gScreen, true); return true; } ShowmouseScreen::ShowmouseScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), active (false), rot (0.0f) { CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); pollHandle.setCallback (boost::bind (&ShowmouseScreen::positionUpdate, this, _1)); optionSetInitiateInitiate (boost::bind (&ShowmouseScreen::initiate, this, _1, _2, _3)); optionSetInitiateTerminate (boost::bind (&ShowmouseScreen::terminate, this, _1, _2, _3)); optionSetInitiateButtonInitiate (boost::bind (&ShowmouseScreen::initiate, this, _1, _2, _3)); optionSetInitiateButtonTerminate (boost::bind (&ShowmouseScreen::terminate, this, _1, _2, _3)); optionSetInitiateEdgeInitiate (boost::bind (&ShowmouseScreen::initiate, this, _1, _2, _3)); optionSetInitiateEdgeTerminate (boost::bind (&ShowmouseScreen::terminate, this, _1, _2, _3)); } ShowmouseScreen::~ShowmouseScreen () { ps.finiParticles (); if (pollHandle.active ()) pollHandle.stop (); } bool ShowmousePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("mousepoll", COMPIZ_MOUSEPOLL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/showmouse/src/showmouse.h0000644000015301777760000000724112321343002024201 0ustar pbusernogroup00000000000000/* * * Compiz show mouse pointer plugin * * showmouse.c * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * */ #include #include #include #include #include #include "showmouse_options.h" #include "showmouse_tex.h" extern const unsigned short CACHESIZE_FACTOR; extern const unsigned short COORD_COMPONENTS; extern const unsigned short VERTEX_COMPONENTS; extern const unsigned short COLOR_COMPONENTS; /* ===================== Particle engine ========================= */ class Particle { public: Particle (); float life; /* particle life */ float fade; /* fade speed */ float width; /* particle width */ float height; /* particle height */ float w_mod; /* particle size modification during life */ float h_mod; /* particle size modification during life */ float r; /* red value */ float g; /* green value */ float b; /* blue value */ float a; /* alpha value */ float x; /* X position */ float y; /* Y position */ float z; /* Z position */ float xi; /* X direction */ float yi; /* Y direction */ float zi; /* Z direction */ float xg; /* X gravity */ float yg; /* Y gravity */ float zg; /* Z gravity */ float xo; /* orginal X position */ float yo; /* orginal Y position */ float zo; /* orginal Z position */ }; class ParticleSystem { public: ParticleSystem (int); ParticleSystem (); ~ParticleSystem (); std::vector particles; float slowdown; GLuint tex; bool active; int x, y; float darken; GLuint blendMode; /* Cache used in drawParticles It's here to avoid multiple mem allocation during drawing */ std::vector vertices_cache; std::vector coords_cache; std::vector colors_cache; std::vector dcolors_cache; void initParticles (int f_numParticles); void drawParticles (const GLMatrix &transform); void updateParticles (float time); void finiParticles (); }; class ShowmouseScreen : public PluginClassHandler , public ShowmouseOptions, public CompositeScreenInterface, public GLScreenInterface { public: ShowmouseScreen (CompScreen *); ~ShowmouseScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CompPoint mousePos; bool active; ParticleSystem ps; float rot; MousePoller pollHandle; void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); void genNewParticles (int); void doDamageRegion (); void positionUpdate (const CompPoint &p); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); }; #define SHOWMOUSE_SCREEN(s) \ ShowmouseScreen *ss = ShowmouseScreen::get (s); class ShowmousePluginVTable : public CompPlugin::VTableForScreen { bool init (); }; compiz-0.9.11+14.04.20140409/plugins/showmouse/src/showmouse_tex.h0000644000015301777760000003661012321343002025063 0ustar pbusernogroup00000000000000/* * * Compiz show mouse star texture plugin * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * */ static const unsigned char starTex[4097] = { "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\360\360\360\0\15" "\15\15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\16\16\0\336\336\336\0" "\311\311\311\1\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\2\361" "\361\361\1\267\267\267\0\17\17\17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0~~~\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\361\361\361\0\25\25" "\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0!!!\0\371\371\371\1\377\377" "\377\4\367\367\367\11\370\370\370\13\371\371\371\14\370\370\370\12\374\374" "\374\6\377\377\377\2""777\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\207\207\207\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\376\376\376\0\177" "\177\177\0\35\35\35\0\35\35\35\0\35\35\35\0\35\35\35\0\34\34\34\0~~~\1\360" "\360\360\4\361\361\361\13\354\354\354\26\352\352\352\35\353\353\353\37\352" "\352\352\31\357\357\357\16\354\354\354\6\332\332\332\1(((\0\35\35\35\0\35" "\35\35\0\35\35\35\0\32\32\32\0\27\27\27\0\352\352\352\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\274\274\274\0ooo\0\207\207\207\0\221\221" "\221\0\221\221\221\0\216\216\216\0\330\330\330\2\340\340\340\11\345\345\345" "\26\355\355\355(\357\357\3575\360\360\3608\355\355\355-\350\350\350\33\337" "\337\337\15\353\353\353\3\263\263\263\0\221\221\221\0\221\221\221\0\220\220" "\220\0mmm\0\200\200\200\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\247\247\247\0ttt\0\242\242\242\0QQQ\0QQQ\0\220\220\220\0" "\352\352\352\4\354\354\354\17\353\353\353$\360\360\360B\362\362\362U\362" "\362\362Y\361\361\361I\354\354\354+\350\350\350\26\360\360\360\5\263\263" "\263\2RRR\0QQQ\0```\0\207\207\207\0\202\202\202\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\246\246\246\0\212\212\212\0\304" "\304\304\0rrr\0rrr\0\232\232\232\1\361\361\361\7\353\353\353\27\362\362\362" "2\362\362\362X\364\364\364r\366\366\366w\363\363\363b\361\361\361<\353\353" "\353\37\361\361\361\11\304\304\304\2rrr\0rrr\0\201\201\201\0\240\240\240" "\0\201\201\201\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\246\246\246\0}}}\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\1\361\361\361\12\355\355\355\40\363\363\363B\366\366\366p\366\366" "\366\217\366\366\366\226\367\367\367{\363\363\363O\357\357\357*\351\351\351" "\16\377\377\377\4\377\377\377\0\377\377\377\0\377\377\377\0\247\247\247\0" "~~~\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\243\243\243\0xxx\0\377\377\377\0\377\377\377\0\375\375\375\0\345\345\345" "\4\347\347\347\17\360\360\360)\364\364\364Q\370\370\370\204\371\371\371\243" "\371\371\371\253\370\370\370\217\365\365\365_\361\361\3616\354\354\354\23" "\351\351\351\7\372\372\372\0\376\376\376\0\377\377\377\0\242\242\242\0xx" "x\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\376\376\376\0\274" "\274\274\1\244\244\244\1\377\377\377\1\375\375\375\1\343\343\343\2\341\341" "\341\7\355\355\355\25\361\361\3616\365\365\365b\371\371\371\231\372\372\372" "\270\373\373\373\300\372\372\372\244\366\366\366q\363\363\363D\354\354\354" "\34\355\355\355\13\307\307\307\2\364\364\364\1\377\377\377\1\300\300\300" "\1\243\243\243\1\373\373\373\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\371\371\371\0\337\337\337\2\367\367\367\3\364" "\364\364\4\343\343\343\5\370\370\370\6\372\372\372\6\354\354\354\6\341\341" "\341\10\347\347\347\16\354\354\354!\363\363\363E\367\367\367s\373\373\373" "\252\373\373\373\310\374\374\374\317\373\373\373\265\371\371\371\203\364" "\364\364T\356\356\356(\350\350\350\24\336\336\336\10\353\353\353\7\371\371" "\371\6\370\370\370\6\353\353\353\5\350\350\350\5\375\375\375\3\352\352\352" "\2\374\374\374\1\377\377\377\0\377\377\377\0\374\374\374\2\325\325\325\6" "\347\347\347\12\355\355\355\17\360\360\360\23\356\356\356\25\360\360\360" "\25\360\360\360\25\354\354\354\30\356\356\356!\360\360\3606\365\365\365]" "\370\370\370\212\373\373\373\274\374\374\374\327\375\375\375\336\374\374" "\374\307\372\372\372\231\367\367\367k\362\362\362>\356\356\356'\361\361\361" "\31\355\355\355\26\357\357\357\25\357\357\357\25\354\354\354\24\360\360\360" "\20\353\353\353\14\336\336\336\10\374\374\374\3\377\377\377\1\346\346\346" "\2\361\361\361\6\355\355\355\16\357\357\357\31\361\361\361$\361\361\361," "\363\363\3632\363\363\3635\362\362\3625\362\362\3629\363\363\363B\365\365" "\365U\370\370\370y\372\372\372\242\374\374\374\315\375\375\375\343\376\376" "\376\350\375\375\375\325\373\373\373\257\371\371\371\207\367\367\367]\364" "\364\364G\362\362\362:\362\362\3626\362\362\3625\363\363\3633\361\361\361" "/\362\362\362'\357\357\357\34\355\355\355\22\364\364\364\10\354\354\354\3" "\327\327\327\3\347\347\347\13\362\362\362\31\357\357\357,\362\362\362B\363" "\363\363S\365\365\365`\367\367\367f\370\370\370i\370\370\370l\371\371\371" "t\370\370\370\205\372\372\372\241\374\374\374\277\376\376\376\336\376\376" "\376\356\376\376\376\362\376\376\376\344\374\374\374\311\373\373\373\253" "\370\370\370\213\370\370\370y\370\370\370n\370\370\370j\370\370\370g\366" "\366\366c\364\364\364W\362\362\362H\360\360\3602\360\360\360\37\356\356\356" "\15\334\334\334\5\371\371\371\3\353\353\353\15\360\360\360\36\360\360\360" "7\363\363\363V\366\366\366p\370\370\370\206\371\371\371\222\372\372\372\232" "\373\373\373\236\373\373\373\245\373\373\373\261\374\374\374\304\375\375" "\375\330\376\376\376\353\377\377\377\365\377\377\377\370\377\377\377\357" "\376\376\376\336\374\374\374\312\373\373\373\265\373\373\373\251\372\372" "\372\240\372\372\372\233\371\371\371\225\370\370\370\212\367\367\367w\364" "\364\364_\361\361\361@\361\361\361&\354\354\354\21\357\357\357\6\342\342" "\342\3\351\351\351\14\357\357\357\36\361\361\3619\364\364\364\\\367\367\367" "|\371\371\371\236\372\372\372\263\373\373\373\302\375\375\375\313\375\375" "\375\323\375\375\375\333\376\376\376\344\376\376\376\355\377\377\377\367" "\377\377\377\373\377\377\377\374\377\377\377\370\376\376\376\360\376\376" "\376\347\375\375\375\335\375\375\375\325\375\375\375\316\374\374\374\306" "\373\373\373\270\371\371\371\245\367\367\367\206\365\365\365g\362\362\362" "B\357\357\357'\355\355\355\20\342\342\342\6\353\353\353\2\343\343\343\11" "\354\354\354\27\357\357\357-\362\362\362N\365\365\365n\370\370\370\224\371" "\371\371\257\373\373\373\312\375\375\375\330\376\376\376\345\376\376\376" "\355\376\376\376\363\377\377\377\367\377\377\377\374\377\377\377\376\377" "\377\377\376\377\377\377\375\377\377\377\371\377\377\377\365\376\376\376" "\357\376\376\376\350\375\375\375\335\373\373\373\317\372\372\372\270\370" "\370\370\235\366\366\366y\364\364\364X\360\360\3605\353\353\353\36\352\352" "\352\14\345\345\345\4\374\374\374\1\351\351\351\4\344\344\344\15\356\356" "\356\33\360\360\3602\362\362\362N\365\365\365r\370\370\370\223\372\372\372" "\266\375\375\375\317\376\376\376\345\377\377\377\361\377\377\377\371\377" "\377\377\374\377\377\377\376\377\377\377\377\377\377\377\377\377\377\377" "\376\377\377\377\375\377\377\377\372\377\377\377\364\376\376\376\351\374" "\374\374\326\373\373\373\276\371\371\371\235\366\366\366}\363\363\363W\361" "\361\361;\357\357\357\40\353\353\353\21\346\346\346\6\361\361\361\2\371\371" "\371\0\311\311\311\2\323\323\323\6\337\337\337\16\354\354\354\34\357\357" "\3570\362\362\362M\365\365\365l\370\370\370\224\373\373\373\264\375\375\375" "\325\376\376\376\351\377\377\377\367\377\377\377\375\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377" "\371\376\376\376\356\376\376\376\334\373\373\373\276\371\371\371\236\366" "\366\366w\363\363\363W\357\357\3577\353\353\353\"\345\345\345\21\330\330" "\330\11\302\302\302\2\337\337\337\0\377\377\377\0\371\371\371\0\313\313\313" "\1\344\344\344\4\342\342\342\13\351\351\351\25\353\353\353(\360\360\360B" "\364\364\364h\370\370\370\220\373\373\373\275\374\374\374\334\376\376\376" "\362\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\374\376\376\376\366\375\375\375\344\374\374\374" "\310\372\372\372\235\366\366\366u\361\361\361K\354\354\3540\347\347\347\31" "\351\351\351\15\343\343\343\5\331\331\331\2\362\362\362\0\377\377\377\0\377" "\377\377\0\377\377\377\0\215\215\215\0\234\234\234\1\325\325\325\4\337\337" "\337\11\341\341\341\25\355\355\355)\362\362\362M\366\366\366x\372\372\372" "\254\374\374\374\322\376\376\376\356\376\376\376\371\377\377\377\376\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\376\376\376" "\362\375\375\375\334\373\373\373\271\370\370\370\207\363\363\363[\357\357" "\3571\346\346\346\33\341\341\341\13\325\325\325\5\342\342\342\1\231\231\231" "\0\370\370\370\0\377\377\377\0\377\377\377\0\377\377\377\0ddd\0]]]\0\372" "\372\372\0\340\340\340\2\327\327\327\11\353\353\353\32\361\361\361<\366\366" "\366i\372\372\372\242\374\374\374\314\376\376\376\354\376\376\376\370\377" "\377\377\374\377\377\377\374\376\376\376\374\377\377\377\374\377\377\377" "\372\376\376\376\360\375\375\375\327\373\373\373\260\367\367\367x\363\363" "\363J\355\355\355!\341\341\341\16\311\311\311\4\367\367\367\1\336\336\336" "\0HHH\0\375\375\375\0\377\377\377\0\377\377\377\0\377\377\377\0\233\233\233" "\0\234\234\234\0\377\377\377\0\361\361\361\2\344\344\344\10\352\352\352\31" "\363\363\363<\367\367\367j\372\372\372\244\374\374\374\315\376\376\376\353" "\377\377\377\364\376\376\376\365\376\376\376\363\377\377\377\362\376\376" "\376\364\376\376\376\365\376\376\376\357\375\375\375\330\373\373\373\262" "\370\370\370{\365\365\365J\355\355\355\40\340\340\340\15\343\343\343\3\377" "\377\377\0\361\361\361\0\212\212\212\0\377\377\377\0\377\377\377\0\351\351" "\351\0\351\351\351\0\352\352\352\0\352\352\352\0\351\351\351\0\360\360\360" "\2\341\341\341\12\356\356\356\35\364\364\364D\370\370\370t\373\373\373\255" "\374\374\374\321\376\376\376\347\375\375\375\351\375\375\375\343\375\375" "\375\335\375\375\375\333\375\375\375\340\375\375\375\350\376\376\376\351" "\375\375\375\332\373\373\373\272\370\370\370\204\365\365\365S\361\361\361" "%\350\350\350\17\344\344\344\3\362\362\362\0\351\351\351\0\352\352\352\0" "\351\351\351\0\351\351\351\0CCC\0CCC\0DDD\0DDD\0WWW\0\324\324\324\3\351\351" "\351\16\361\361\361%\365\365\365P\370\370\370\201\373\373\373\265\374\374" "\374\321\375\375\375\334\374\374\374\324\373\373\373\304\372\372\372\272" "\372\372\372\267\373\373\373\300\374\374\374\317\374\374\374\332\374\374" "\374\327\373\373\373\277\371\371\371\221\366\366\366`\361\361\361/\354\354" "\354\25\342\342\342\5\225\225\225\1DDD\0EEE\0CCC\0CCC\0\40\40\40\0\40\40" "\40\0\40\40\40\0\40\40\40\0mmm\1\327\327\327\6\352\352\352\24\362\362\362" "0\365\365\365_\370\370\370\215\372\372\372\270\373\373\373\307\373\373\373" "\302\372\372\372\256\371\371\371\224\367\367\367\205\366\366\366\201\370" "\370\370\217\372\372\372\247\373\373\373\274\373\373\373\311\373\373\373" "\276\371\371\371\234\366\366\366n\362\362\362;\355\355\355\34\342\342\342" "\10\220\220\220\2\"\"\"\0\40\40\40\0\40\40\40\0\40\40\40\0\336\336\336\0" "\336\336\336\0\336\336\336\0\340\340\340\0\351\351\351\1\352\352\352\10\353" "\353\353\31\361\361\3618\365\365\365g\370\370\370\220\371\371\371\256\372" "\372\372\260\371\371\371\240\367\367\367\205\365\365\365f\362\362\362W\362" "\362\362S\364\364\364a\367\367\367{\370\370\370\227\372\372\372\257\372\372" "\372\260\370\370\370\233\366\366\366t\363\363\363C\354\354\354\"\353\353" "\353\12\353\353\353\3\336\336\336\0\336\336\336\0\336\336\336\0\336\336\336" "\0\6\6\6\0\6\6\6\0\6\6\6\0\15\15\15\0\315\315\315\2\352\352\352\12\357\357" "\357\35\361\361\361<\365\365\365g\367\367\367\206\367\367\367\225\367\367" "\367\214\366\366\366q\364\364\364T\361\361\3618\360\360\360*\357\357\357" "'\360\360\3603\363\363\363K\366\366\366g\366\366\366\206\367\367\367\224" "\367\367\367\215\366\366\366q\362\362\362G\360\360\360'\351\351\351\15\315" "\315\315\4\23\23\23\0\6\6\6\0\6\6\6\0\6\6\6\0ggg\0ggg\0ggg\0ggg\0\331\331" "\331\2\366\366\366\12\356\356\356\34\363\363\3637\365\365\365Z\364\364\364" "o\365\365\365t\364\364\364e\363\363\363I\357\357\3572\350\350\350\35\350" "\350\350\23\346\346\346\21\350\350\350\31\354\354\354+\362\362\362A\364\364" "\364^\364\364\364p\365\365\365s\365\365\365a\363\363\363A\361\361\361%\352" "\352\352\15\340\340\340\4lll\0ggg\0ggg\0ggg\0""111\0""111\0""111\0AAA\0\344" "\344\344\2\347\347\347\10\356\356\356\26\362\362\362*\362\362\362A\361\361" "\361K\361\361\361I\361\361\361:\354\354\354%\351\351\351\26\347\347\347\12" "\345\345\345\5\337\337\337\5\355\355\355\10\351\351\351\21\354\354\354\40" "\357\357\3574\361\361\361D\361\361\361M\361\361\361E\361\361\3611\360\360" "\360\34\351\351\351\13\337\337\337\3===\0""111\0""111\0""111\0\353\353\353" "\0\353\353\353\0\353\353\353\0\355\355\355\0\370\370\370\1\364\364\364\5" "\360\360\360\17\357\357\357\33\361\361\361(\361\361\361-\355\355\355)\353" "\353\353\37\345\345\345\22\343\343\343\11\345\345\345\3\361\361\361\1\374" "\374\374\1\351\351\351\3\347\347\347\7\342\342\342\17\352\352\352\33\356" "\356\356&\360\360\360-\360\360\360*\356\356\356\37\361\361\361\22\363\363" "\363\7\367\367\367\2\354\354\354\0\353\353\353\0\353\353\353\0\353\353\353" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\370\370\370\2\346\346\346\7\354\354\354\14\346\346\346\22\360\360\360\22" "\354\354\354\17\335\335\335\13\325\325\325\5\362\362\362\2\217\217\217\0" "\336\336\336\0\377\377\377\0\314\314\314\0\311\311\311\1\333\333\333\5\330" "\330\330\11\350\350\350\16\361\361\361\22\353\353\353\22\356\356\356\15\346" "\346\346\10\365\365\365\3\377\377\377\1\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\341\341\341\2\330\330\330\5\346\346\346\7" "\346\346\346\7\354\354\354\5\326\326\326\4\331\331\331\1\375\375\375\0\215" "\215\215\0\336\336\336\0\377\377\377\0\307\307\307\0\354\354\354\0\355\355" "\355\1\325\325\325\3\342\342\342\5\352\352\352\7\344\344\344\7\336\336\336" "\5\343\343\343\4\375\375\375\1\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0" }; compiz-0.9.11+14.04.20140409/plugins/imgsvg/0000755000015301777760000000000012321344021020451 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/imgsvg/imgsvg.xml.in0000644000015301777760000000112312321343002023067 0ustar pbusernogroup00000000000000 <_short>SVG <_long>SVG image loader Image Loading imageext:svg imagemime:image/svg+xml composite opengl decor compiz-0.9.11+14.04.20140409/plugins/imgsvg/CMakeLists.txt0000644000015301777760000000072512321343002023213 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) pkg_check_modules (RSVG librsvg-2.0>=2.36.2) if (RSVG_FOUND) compiz_set (HAVE_RSVG_2_36_2 1) endif (RSVG_FOUND) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/src/imgsvg-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/imgsvg-config.h) include_directories (${CMAKE_CURRENT_BINARY_DIR}/src) compiz_plugin(imgsvg PLUGINDEPS composite opengl PKGDEPS cairo>=1.0 cairo-xlib librsvg-2.0>=2.14.0 LIBRARIES decoration) compiz-0.9.11+14.04.20140409/plugins/imgsvg/src/0000755000015301777760000000000012321344021021240 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/imgsvg/src/imgsvg-config.h.in0000644000015301777760000000003612321343002024552 0ustar pbusernogroup00000000000000#cmakedefine HAVE_RSVG_2_36_2 compiz-0.9.11+14.04.20140409/plugins/imgsvg/src/imgsvg.cpp0000644000015301777760000003506312321343002023245 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "imgsvg.h" #include COMPIZ_PLUGIN_20090315 (imgsvg, SvgPluginVTable) static bool svgSet (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findWindow (xid); if (w) { decor_point_t p[2]; CompString data; SVG_WINDOW (w); memset (p, 0, sizeof (p)); p[0].gravity = CompOption::getIntOptionNamed (options, "gravity0", GRAVITY_NORTH | GRAVITY_WEST); p[0].x = CompOption::getIntOptionNamed (options, "x0"); p[0].y = CompOption::getIntOptionNamed (options, "y0"); p[1].gravity = CompOption::getIntOptionNamed (options, "gravity1", GRAVITY_SOUTH | GRAVITY_EAST); p[1].x = CompOption::getIntOptionNamed (options, "x1"); p[1].y = CompOption::getIntOptionNamed (options, "y1"); data = CompOption::getStringOptionNamed (options, "data"); sw->setSvg (data, p); } return false; } SvgScreen::SvgScreen (CompScreen *screen) : PluginClassHandler (screen) { optionSetSetInitiate (svgSet); ScreenInterface::setHandler (screen, true); } SvgScreen::~SvgScreen () { } bool SvgScreen::fileToImage (CompString &path, CompSize &size, int &stride, void *&data) { CompString fileName = path; bool status = false; int len = fileName.length (); if (len < 4 || fileName.substr (len - 4, 4) != ".svg") fileName += ".svg"; status = readSvgToImage (fileName.c_str (), size, data); if (status) { stride = size.width () * 4; return true; } status = screen->fileToImage (path, size, stride, data); return status; } void SvgScreen::handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options) { screen->handleCompizEvent (plugin, event, options); if (strcmp (plugin, "zoom") == 0) { int output = CompOption::getIntOptionNamed (options, "output"); if (output == 0) { if (strcmp (event, "in") == 0) { zoom.setGeometry (CompOption::getIntOptionNamed (options, "x1"), CompOption::getIntOptionNamed (options, "y1"), CompOption::getIntOptionNamed (options, "x2"), CompOption::getIntOptionNamed (options, "y2")); } else if (strcmp (event, "out") == 0) zoom.setGeometry (0, 0, 0, 0); } } } bool SvgScreen::readSvgToImage (const char *file, CompSize &size, void *&data) { cairo_surface_t *surface; std::ifstream svgFile; GError *error = NULL; RsvgHandle *svgHandle; RsvgDimensionData svgDimension; svgFile.open (file); if (!svgFile.is_open ()) return false; svgFile.close (); svgHandle = rsvg_handle_new_from_file (file, &error); if (!svgHandle) return false; rsvg_handle_get_dimensions (svgHandle, &svgDimension); size.setWidth (svgDimension.width); size.setHeight (svgDimension.height); data = malloc (svgDimension.width * svgDimension.height * 4); if (!data) { rsvg_handle_free (svgHandle); return false; } surface = cairo_image_surface_create_for_data ((unsigned char *) data, CAIRO_FORMAT_ARGB32, svgDimension.width, svgDimension.height, svgDimension.width * 4); if (surface) { cairo_t *cr; cr = cairo_create (surface); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); rsvg_handle_render_cairo (svgHandle, cr); cairo_destroy (cr); cairo_surface_destroy (surface); } rsvg_handle_free (svgHandle); return true; } SvgWindow::SvgWindow (CompWindow *window) : PluginClassHandler (window), source (NULL), context (NULL), sScreen (SvgScreen::get (screen)), gScreen (GLScreen::get (screen)), window (window), gWindow (GLWindow::get (window)) { if (gWindow) GLWindowInterface::setHandler (gWindow, false); } SvgWindow::~SvgWindow () { if (source) { rsvg_handle_free (source->svg); delete source; } if (context) { finiTexture (context->texture[0]); delete context; } } bool SvgWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { bool status = gWindow->glDraw (transform, attrib, region, mask); if (!status) return status; const CompRegion ® = (mask & PAINT_WINDOW_TRANSFORMED_MASK) ? infiniteRegion : region; if (context && reg.numRects ()) { GLTexture::MatrixList matrix (1); CompRect rect = context->box.boundingRect (); int x1 = MIN (rect.x1 (), sScreen->zoom.x1 ()); int y1 = MIN (rect.y1 (), sScreen->zoom.y1 ()); int x2 = MAX (rect.x2 (), sScreen->zoom.x2 ()); int y2 = MAX (rect.y2 (), sScreen->zoom.y2 ()); rect.setGeometry (x1, y1, x2 - x1, y2 - y1); for (unsigned int i = 0; i < context->texture[0].textures.size (); ++i) { matrix[0] = context->texture[0].matrices[i]; gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometry (matrix, context->box, reg); gWindow->vertexBuffer ()->end (); if (mask & PAINT_WINDOW_TRANSLUCENT_MASK) mask |= PAINT_WINDOW_BLEND_MASK; gWindow->glDrawTexture (context->texture[0].textures[i], transform, attrib, mask); if (rect.width () > 0 && rect.height () > 0) { rect.setGeometry (rect.x1 () - 1, rect.y1 () - 1, rect.width () + 1, rect.height () + 1); float xScale = screen->width () / (float) (sScreen->zoom.width ()); float yScale = screen->height () / (float) (sScreen->zoom.height ()); float dx = rect.width (); float dy = rect.height (); float width = dx * xScale + 0.5f; float height = dy * yScale + 0.5f; if (rect != context->rect || width != context->size.width () || height != context->size.height ()) { context->rect = rect; context->size.setWidth (width); context->size.setHeight (height); dx = context->box.boundingRect ().width (); dy = context->box.boundingRect ().height (); float x1 = (rect.x1 () - context->box.boundingRect ().x ()) / dx; float y1 = (rect.y1 () - context->box.boundingRect ().y ()) / dy; float x2 = (rect.x2 () - context->box.boundingRect ().x ()) / dx; float y2 = (rect.y2 () - context->box.boundingRect ().y ()) / dy; finiTexture (context->texture[1]); if (initTexture (context->source, context->texture[1], context->size)) { renderSvg (context->source, context->texture[1], context->size, x1, y1, x2, y2); updateSvgMatrix (); } } GLTexture::Filter saveFilter; CompRegion r (rect); for (unsigned int j = 0; j < context->texture[1].textures.size (); ++j) { matrix[0] = context->texture[1].matrices[j]; saveFilter = gScreen->filter (SCREEN_TRANS_FILTER); gScreen->setFilter (SCREEN_TRANS_FILTER, GLTexture::Good); gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometry (matrix, r, reg); gWindow->vertexBuffer ()->end (); gWindow->glDrawTexture (context->texture[1].textures[j], transform, attrib, mask); gScreen->setFilter (SCREEN_TRANS_FILTER, saveFilter); } } else if (context->texture[1].size.width ()) { finiTexture (context->texture[1]); initTexture (source, context->texture[1], CompSize ()); memset (&context->rect, 0, sizeof (BoxRec)); context->size.setWidth (0); context->size.setHeight (0); } } } return status; } void SvgWindow::moveNotify (int dx, int dy, bool immediate) { if (context) { context->box.translate (dx, dy); updateSvgMatrix (); } window->moveNotify (dx, dy, immediate); } void SvgWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { if (source) updateSvgContext (); window->resizeNotify (dx, dy, dwidth, dheight); } void SvgWindow::updateSvgMatrix () { GLTexture::Matrix *m; unsigned int i; CompRect rect = context->box.boundingRect (); SvgTexture *texture = &context->texture[0]; if (texture->matrices.size () != texture->textures.size ()) texture->matrices.resize (texture->textures.size ()); for (i = 0; i < texture->textures.size (); ++i) { m = &texture->matrices[i]; *m = texture->textures[i]->matrix (); m->xx *= (float) texture->size.width () / rect.width (); m->yy *= (float) texture->size.height () / rect.height (); m->x0 -= (rect.x () * m->xx); m->y0 -= (rect.y () * m->yy); } texture = &context->texture[1]; if (texture->matrices.size () != texture->textures.size ()) texture->matrices.resize (texture->textures.size ()); for (i = 0; i < texture->textures.size (); ++i) { m = &texture->matrices[i]; *m = texture->textures[i]->matrix (); m->xx *= (float) texture->size.width () / context->rect.width (); m->yy *= (float) texture->size.height () / context->rect.height (); m->x0 -= (context->rect.x () * m->xx); m->y0 -= (context->rect.y () * m->yy); } } void SvgWindow::updateSvgContext () { if (context) { finiTexture (context->texture[0]); finiTexture (context->texture[1]); } else { context = new SvgContext; if (!context) return; } int x1, y1, x2, y2; CompSize wSize; initTexture (source, context->texture[1], context->size); context->source = source; wSize.setWidth (window->geometry ().width ()); wSize.setHeight (window->geometry ().height ()); decor_apply_gravity (source->p1.gravity, source->p1.x, source->p1.y, wSize.width (), wSize.height (), &x1, &y1); decor_apply_gravity (source->p2.gravity, source->p2.x, source->p2.y, wSize.width (), wSize.height (), &x2, &y2); x1 = MAX (x1, 0); y1 = MAX (y1, 0); x2 = MIN (x2, wSize.width ()); y2 = MIN (y2, wSize.height ()); if (!initTexture (source, context->texture[0], wSize)) { delete context; context = NULL; } else { renderSvg (source, context->texture[0], wSize, 0.0f, 0.0f, 1.0f, 1.0f); initTexture (source, context->texture[1], CompSize ()); context->box += CompRect (x1, y1, x2 - x1, y2 - y1); context->box.translate (window->geometry ().x (), window->geometry ().y ()); updateSvgMatrix (); } } void SvgWindow::renderSvg (SvgSource *source, SvgTexture &texture, CompSize size, float x1, float y1, float x2, float y2) { float w = x2 - x1; float h = y2 - y1; cairo_save (texture.cr); cairo_set_operator (texture.cr, CAIRO_OPERATOR_SOURCE); cairo_set_source_rgba (texture.cr, 1.0, 1.0, 1.0, 0.0); cairo_paint (texture.cr); cairo_set_operator (texture.cr, CAIRO_OPERATOR_OVER); cairo_scale (texture.cr, 1.0 / w, 1.0 / h); cairo_scale (texture.cr, (double) size.width () / source->dimension.width, (double) size.height () / source->dimension.height); cairo_translate (texture.cr, -x1 * source->dimension.width, -y1 * source->dimension.height); rsvg_handle_render_cairo (source->svg, texture.cr); cairo_restore (texture.cr); } bool SvgWindow::initTexture (SvgSource *source, SvgTexture &texture, CompSize size) { Display *dpy = screen->dpy (); texture.size = size; texture.pixmap = None; texture.cr = NULL; if (size.width () && size.height ()) { cairo_surface_t *surface; XWindowAttributes attr; XGetWindowAttributes (dpy, window->id (), &attr); texture.pixmap = XCreatePixmap (dpy, screen->root (), size.width (), size.height (), attr.depth); texture.textures = GLTexture::bindPixmapToTexture (texture.pixmap, size.width (), size.height (), attr.depth); if (texture.textures.empty ()) { compLogMessage ("svg", CompLogLevelInfo, "Couldn't bind pixmap 0x%x to texture", (int) texture.pixmap); XFreePixmap (dpy, texture.pixmap); return false; } surface = cairo_xlib_surface_create (dpy, texture.pixmap, attr.visual, size.width (), size.height ()); texture.cr = cairo_create (surface); cairo_surface_destroy (surface); } return true; } void SvgWindow::finiTexture (SvgTexture &texture) { if (texture.cr) cairo_destroy (texture.cr); if (texture.pixmap) XFreePixmap (screen->dpy (), texture.pixmap); } void SvgWindow::setSvg (CompString &data, decor_point_t p[2]) { if (!gWindow) return; GError *error = NULL; RsvgHandle *svg = rsvg_handle_new_from_data ((guint8 *) data.c_str (), data.length (), &error); if (source) { rsvg_handle_free (source->svg); source->svg = svg; } else { source = new SvgSource; if (source) source->svg = svg; } if (source && source->svg) { source->p1 = p[0]; source->p2 = p[1]; source->svg = svg; gWindow->glDrawSetEnabled (this, true); rsvg_handle_get_dimensions (svg, &source->dimension); updateSvgContext (); } else { if (svg) rsvg_handle_free (svg); if (source) { delete source; source = NULL; } if (context) { finiTexture (context->texture[0]); delete context; context = NULL; } gWindow->glDrawSetEnabled (this, false); } } bool SvgPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) { rsvg_init (); return true; } return false; } void SvgPluginVTable::fini () { rsvg_term (); } compiz-0.9.11+14.04.20140409/plugins/imgsvg/src/imgsvg.h0000644000015301777760000000770312321343002022712 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "imgsvg_options.h" #include #include #include #include #include #include #include #include #include #ifndef HAVE_RSVG_2_36_2 #include #endif #include #include #include #include #define SVG_SCREEN(s) SvgScreen *ss = SvgScreen::get (s) #define SVG_WINDOW(w) SvgWindow *sw = SvgWindow::get (w) class SvgScreen : public ScreenInterface, public PluginClassHandler, public ImgsvgOptions { public: SvgScreen (CompScreen *screen); ~SvgScreen (); bool fileToImage (CompString &path, CompSize &size, int &stride, void *&data); void handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options); CompRect zoom; private: bool readSvgToImage (const char *file, CompSize &size, void *&data); }; class SvgWindow : public WindowInterface, public GLWindowInterface, public PluginClassHandler { public: SvgWindow (CompWindow *window); ~SvgWindow (); bool glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask); void moveNotify (int dx, int dy, bool immediate); void resizeNotify (int dx, int dy, int dwidth, int dheight); void setSvg (CompString &data, decor_point_t p[2]); private: typedef struct { decor_point_t p1; decor_point_t p2; RsvgHandle *svg; RsvgDimensionData dimension; } SvgSource; typedef struct { GLTexture::List textures; GLTexture::MatrixList matrices; cairo_t *cr; Pixmap pixmap; CompSize size; } SvgTexture; typedef struct { SvgSource *source; CompRegion box; SvgTexture texture[2]; CompRect rect; CompSize size; } SvgContext; SvgSource *source; SvgContext *context; SvgScreen *sScreen; GLScreen *gScreen; CompWindow *window; GLWindow *gWindow; void updateSvgMatrix (); void updateSvgContext (); void renderSvg (SvgSource *source, SvgTexture &texture, CompSize size, float x1, float y1, float x2, float y2); bool initTexture (SvgSource *source, SvgTexture &texture, CompSize size); void finiTexture (SvgTexture &texture); }; class SvgPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; compiz-0.9.11+14.04.20140409/plugins/composite/0000755000015301777760000000000012321344021021157 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/composite/composite.xml.in0000644000015301777760000000342212321343002024307 0ustar pbusernogroup00000000000000 <_short>Composite <_long>Composite plugin General compiz-0.9.11+14.04.20140409/plugins/composite/compiz-composite.pc.in0000644000015301777760000000047512321343002025415 0ustar pbusernogroup00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-composite Description: Compositing plugin for compiz Version: @VERSION@ Requires: compiz Libs: @_composite_plugin_LDFLAGS@ -L${libdir} -lcomposite Cflags: @COMPIZ_CFLAGS@ @_composite_plugin_CFLAGS@ -I${includedir}/compizcompiz-0.9.11+14.04.20140409/plugins/composite/CMakeLists.txt0000644000015301777760000000111712321343002023715 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/pixmapbinding/include) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/backbuffertracking/include) link_directories (${CMAKE_CURRENT_BINARY_DIR}/src/pixmapbinding) link_directories (${CMAKE_CURRENT_BINARY_DIR}/src/backbuffertracking) compiz_plugin (composite LIBRARIES compiz_composite_pixmapbinding compiz_composite_backbuffertracking) add_subdirectory (src/pixmapbinding) add_subdirectory (src/backbuffertracking) compiz-0.9.11+14.04.20140409/plugins/composite/src/0000755000015301777760000000000012321344021021746 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/composite/src/screen.cpp0000644000015301777760000006615212321343025023746 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include "privates.h" #include #include #include template class WrapableInterface; namespace bt = compiz::composite::buffertracking; static const int FALLBACK_REFRESH_RATE = 60; /* if all else fails */ CompWindow *lastDamagedWindow = 0; void PrivateCompositeScreen::handleEvent (XEvent *event) { CompWindow *w; switch (event->type) { case CreateNotify: if (screen->root () == event->xcreatewindow.parent) { /* The first time some client asks for the composite * overlay window, the X server creates it, which causes * an errorneous CreateNotify event. We catch it and * ignore it. */ if (overlay == event->xcreatewindow.window) return; } break; case PropertyNotify: if (event->xproperty.atom == Atoms::winOpacity) { w = screen->findWindow (event->xproperty.window); if (w) CompositeWindow::get (w)->updateOpacity (); } else if (event->xproperty.atom == Atoms::winBrightness) { w = screen->findWindow (event->xproperty.window); if (w) CompositeWindow::get (w)->updateBrightness (); } else if (event->xproperty.atom == Atoms::winSaturation) { w = screen->findWindow (event->xproperty.window); if (w) CompositeWindow::get (w)->updateSaturation (); } break; default: if (shapeExtension && event->type == shapeEvent + ShapeNotify) { w = screen->findWindow (((XShapeEvent *) event)->window); if (w && w->mapNum ()) CompositeWindow::get (w)->addDamage (); } else if (event->type == damageEvent + XDamageNotify) { XDamageNotifyEvent *de = (XDamageNotifyEvent*)event; damages[de->damage] = de->area; } break; } screen->handleEvent (event); switch (event->type) { case Expose: handleExposeEvent (&event->xexpose); break; case ClientMessage: if (event->xclient.message_type == Atoms::winOpacity) { w = screen->findWindow (event->xclient.window); if (w && (w->type () & CompWindowTypeDesktopMask) == 0) { unsigned short opacity = event->xclient.data.l[0] >> 16; screen->setWindowProp32 (w->id (), Atoms::winOpacity, opacity); } } else if (event->xclient.message_type == Atoms::winBrightness) { w = screen->findWindow (event->xclient.window); if (w) { unsigned short brightness = event->xclient.data.l[0] >> 16; screen->setWindowProp32 (w->id (), Atoms::winBrightness, brightness); } } else if (event->xclient.message_type == Atoms::winSaturation) { w = screen->findWindow (event->xclient.window); if (w) { unsigned short saturation = event->xclient.data.l[0] >> 16; screen->setWindowProp32 (w->id (), Atoms::winSaturation, saturation); } } break; default: if (event->type == damageEvent + XDamageNotify) { XDamageNotifyEvent *de = (XDamageNotifyEvent *) event; if (lastDamagedWindow && de->drawable == lastDamagedWindow->id ()) w = lastDamagedWindow; else { w = screen->findWindow (de->drawable); if (w) lastDamagedWindow = w; } if (w) CompositeWindow::get (w)->processDamage (de); } else if (shapeExtension && event->type == shapeEvent + ShapeNotify) { w = screen->findWindow (((XShapeEvent *) event)->window); if (w && w->mapNum ()) CompositeWindow::get (w)->addDamage (); } else if (randrExtension && event->type == randrEvent + RRScreenChangeNotify) { XRRScreenChangeNotifyEvent *rre; rre = (XRRScreenChangeNotifyEvent *) event; if (screen->root () == rre->root) detectRefreshRate (); } break; } } int CompositeScreen::damageEvent () { return priv->damageEvent; } template class PluginClassHandler; CompositeScreen::CompositeScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateCompositeScreen (this)) { if (!XQueryExtension (s->dpy (), COMPOSITE_NAME, &priv->compositeOpcode, &priv->compositeEvent, &priv->compositeError)) { compLogMessage ("core", CompLogLevelFatal, "No composite extension"); setFailed (); return; } int compositeMajor, compositeMinor; XCompositeQueryVersion (s->dpy (), &compositeMajor, &compositeMinor); if (compositeMajor == 0 && compositeMinor < 2) { compLogMessage ("core", CompLogLevelFatal, "Old composite extension"); setFailed (); return; } if (!XDamageQueryExtension (s->dpy (), &priv->damageEvent, &priv->damageError)) { compLogMessage ("core", CompLogLevelFatal, "No damage extension"); setFailed (); return; } if (!XFixesQueryExtension (s->dpy (), &priv->fixesEvent, &priv->fixesError)) { compLogMessage ("core", CompLogLevelFatal, "No fixes extension"); setFailed (); return; } priv->shapeExtension = XShapeQueryExtension (s->dpy (), &priv->shapeEvent, &priv->shapeError); priv->randrExtension = XRRQueryExtension (s->dpy (), &priv->randrEvent, &priv->randrError); priv->makeOutputWindow (); priv->detectRefreshRate (); priv->slowAnimations = false; if (!priv->init ()) setFailed (); } CompositeScreen::~CompositeScreen () { priv->paintTimer.stop (); XCompositeReleaseOverlayWindow (screen->dpy (), screen->root ()); delete priv; } namespace { bool alwaysMarkDirty () { return true; } } PrivateCompositeScreen::PrivateCompositeScreen (CompositeScreen *cs) : cScreen (cs), compositeEvent (0), compositeError (0), compositeOpcode (0), damageEvent (0), damageError (0), fixesEvent (0), fixesError (0), fixesVersion (0), shapeExtension (false), shapeEvent (0), shapeError (0), randrExtension (false), randrEvent (0), randrError (0), damageMask (COMPOSITE_SCREEN_DAMAGE_ALL_MASK), currentlyTrackingDamage (DamageForCurrentFrame), overlay (None), output (None), exposeRects (), windowPaintOffset (0, 0), overlayWindowCount (0), outputShapeChanged (false), redrawTime (1000 / FALLBACK_REFRESH_RATE), optimalRedrawTime (1000 / FALLBACK_REFRESH_RATE), scheduled (false), painting (false), reschedule (false), damageRequiresRepaintReschedule (true), slowAnimations (false), pHnd (NULL), FPSLimiterMode (CompositeFPSLimiterModeDefault), withDestroyedWindows (), cmSnAtom (0), newCmSnOwner (None), roster (*screen, ageingBuffers, boost::bind (alwaysMarkDirty)) { gettimeofday (&lastRedraw, 0); // wrap outputChangeNotify ScreenInterface::setHandler (screen); optionSetSlowAnimationsKeyInitiate (CompositeScreen::toggleSlowAnimations); } PrivateCompositeScreen::~PrivateCompositeScreen () { Display *dpy = screen->dpy (); if (cmSnAtom) XSetSelectionOwner (dpy, cmSnAtom, None, CurrentTime); if (newCmSnOwner != None) XDestroyWindow (dpy, newCmSnOwner); } bool PrivateCompositeScreen::init () { Display *dpy = screen->dpy (); Time cmSnTimestamp = 0; XEvent event; XSetWindowAttributes attr; char buf[128]; snprintf (buf, 128, "_NET_WM_CM_S%d", screen->screenNum ()); cmSnAtom = XInternAtom (dpy, buf, 0); Window currentCmSnOwner = XGetSelectionOwner (dpy, cmSnAtom); if (currentCmSnOwner != None && !replaceCurrentWm) { compLogMessage ( "composite", CompLogLevelError, "Screen %d on display \"%s\" already has a compositing " "manager (%x); try using the --replace option to replace " "the current compositing manager.", screen->screenNum (), DisplayString (dpy), currentCmSnOwner); return false; } attr.override_redirect = true; attr.event_mask = PropertyChangeMask; newCmSnOwner = XCreateWindow (dpy, screen->root (), -100, -100, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); XChangeProperty (dpy, newCmSnOwner, Atoms::wmName, Atoms::utf8String, 8, PropModeReplace, (unsigned char *) PACKAGE, strlen (PACKAGE)); XWindowEvent (dpy, newCmSnOwner, PropertyChangeMask, &event); cmSnTimestamp = event.xproperty.time; XSetSelectionOwner (dpy, cmSnAtom, newCmSnOwner, cmSnTimestamp); if (XGetSelectionOwner (dpy, cmSnAtom) != newCmSnOwner) { compLogMessage ("core", CompLogLevelError, "Could not acquire compositing manager " "selection on screen %d display \"%s\"", screen->screenNum (), DisplayString (dpy)); return false; } /* Send client message indicating that we are now the compositing manager */ event.xclient.type = ClientMessage; event.xclient.window = screen->root (); event.xclient.message_type = Atoms::manager; event.xclient.format = 32; event.xclient.data.l[0] = cmSnTimestamp; event.xclient.data.l[1] = cmSnAtom; event.xclient.data.l[2] = 0; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (dpy, screen->root (), FALSE, StructureNotifyMask, &event); return true; } bool CompositeScreen::registerPaintHandler (compiz::composite::PaintHandler *pHnd) { Display *dpy; WRAPABLE_HND_FUNCTN_RETURN (bool, registerPaintHandler, pHnd); dpy = screen->dpy (); if (priv->pHnd) return false; CompScreen::checkForError (dpy); XCompositeRedirectSubwindows (dpy, screen->root (), CompositeRedirectManual); priv->overlayWindowCount = 0; if (CompScreen::checkForError (dpy)) { compLogMessage ("composite", CompLogLevelError, "Another composite manager is already " "running on screen: %d", screen->screenNum ()); return false; } foreach (CompWindow *w, screen->windows ()) { CompositeWindow *cw = CompositeWindow::get (w); cw->priv->overlayWindow = false; cw->priv->redirected = true; } priv->pHnd = pHnd; priv->detectRefreshRate (); showOutputWindow (); return true; } void CompositeScreen::unregisterPaintHandler () { Display *dpy; WRAPABLE_HND_FUNCTN (unregisterPaintHandler) dpy = screen->dpy (); foreach (CompWindow *w, screen->windows ()) { CompositeWindow *cw = CompositeWindow::get (w); cw->priv->overlayWindow = false; cw->priv->redirected = false; cw->release (); } priv->overlayWindowCount = 0; XCompositeUnredirectSubwindows (dpy, screen->root (), CompositeRedirectManual); priv->pHnd = NULL; priv->paintTimer.stop (); priv->detectRefreshRate (); hideOutputWindow (); } bool CompositeScreen::compositingActive () { if (priv->pHnd) return priv->pHnd->compositingActive (); return false; } const CompRegion * PrivateCompositeScreen::damageTrackedBuffer (const CompRegion ®ion) { const CompRegion *currentDamage = NULL; switch (currentlyTrackingDamage) { case DamageForCurrentFrame: currentDamage = &(roster.currentFrameDamage ()); ageingBuffers.markAreaDirty (region); break; case DamageForLastFrame: currentDamage = &(lastFrameDamage); lastFrameDamage += region; break; case DamageFinalPaintRegion: currentDamage = &(tmpRegion); tmpRegion += region; break; default: compLogMessage ("composite", CompLogLevelFatal, "unreachable section"); assert (false); abort (); } assert (currentDamage); return currentDamage; } void CompositeScreen::damageScreen () { /* Don't tell plugins about damage events when the damage buffer is already full */ bool alreadyDamaged = priv->damageMask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK; alreadyDamaged |= ((currentDamage () & screen->region ()) == screen->region ()); priv->damageMask |= COMPOSITE_SCREEN_DAMAGE_ALL_MASK; priv->damageMask &= ~COMPOSITE_SCREEN_DAMAGE_REGION_MASK; if (priv->damageRequiresRepaintReschedule) priv->scheduleRepaint (); /* * Call through damageRegion since plugins listening for incoming damage * may need to know that the whole screen was redrawn */ if (!alreadyDamaged) { damageRegion (CompRegion (0, 0, screen->width (), screen->height ())); /* Set the damage region as the fullscreen region, because if * windows are unredirected we need to correctly subtract from * it later */ priv->damageTrackedBuffer (screen->region ()); } } void CompositeScreen::damageRegion (const CompRegion ®ion) { WRAPABLE_HND_FUNCTN (damageRegion, region); if (priv->damageMask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) return; /* Don't cause repaints to be scheduled for empty damage * regions */ if (region.isEmpty ()) return; const CompRegion *currentDamage = priv->damageTrackedBuffer (region); priv->damageMask |= COMPOSITE_SCREEN_DAMAGE_REGION_MASK; /* If the number of damage rectangles grows two much between repaints, * we have a lot of overhead just for doing the damage tracking - * in order to make sure we're not having too much overhead, damage * the whole screen if we have a lot of damage rects */ if (currentDamage->numRects () > 100) damageScreen (); if (priv->damageRequiresRepaintReschedule) priv->scheduleRepaint (); } void CompositeScreen::damageCutoff () { WRAPABLE_HND_FUNCTN (damageCutoff); } void CompositeScreen::damagePending () { priv->damageMask |= COMPOSITE_SCREEN_DAMAGE_PENDING_MASK; if (priv->damageRequiresRepaintReschedule) priv->scheduleRepaint (); } void CompositeScreen::applyDamageForFrameAge (unsigned int age) { /* Track into "last frame damage" */ priv->currentlyTrackingDamage = DamageForLastFrame; damageRegion (priv->roster.damageForFrameAge (age)); priv->currentlyTrackingDamage = DamageForCurrentFrame; } unsigned int CompositeScreen::getFrameAge () { if (priv->pHnd) return priv->pHnd->getFrameAge (); return 1; } void CompositeScreen::recordDamageOnCurrentFrame (const CompRegion &r) { priv->ageingBuffers.markAreaDirtyOnLastFrame (r); } typedef CompositeScreen::AreaShouldBeMarkedDirty ShouldMarkDirty; namespace { bool alwaysDirty () { return true; } } CompositeScreen::DamageQuery::Ptr CompositeScreen::getDamageQuery (ShouldMarkDirty callback) { /* No initial damage */ bt::AgeingDamageBufferObserver &observer (priv->ageingBuffers); return boost::make_shared (*screen, boost::ref (observer), !callback.empty () ? callback : boost::bind (alwaysDirty)); } unsigned int CompositeScreen::damageMask () { return priv->damageMask; } void CompositeScreen::showOutputWindow () { if (priv->pHnd) { Display *dpy = screen->dpy (); XserverRegion region; region = XFixesCreateRegion (dpy, NULL, 0); XFixesSetWindowShapeRegion (dpy, priv->output, ShapeBounding, 0, 0, 0); XFixesSetWindowShapeRegion (dpy, priv->output, ShapeInput, 0, 0, region); XFixesDestroyRegion (dpy, region); damageScreen (); priv->outputShapeChanged = true; } } void CompositeScreen::hideOutputWindow () { Display *dpy = screen->dpy (); XserverRegion region = XFixesCreateRegion (dpy, NULL, 0); XFixesSetWindowShapeRegion (dpy, priv->output, ShapeBounding, 0, 0, region); XFixesDestroyRegion (dpy, region); } void CompositeScreen::updateOutputWindow () { if (priv->pHnd) { Display *dpy = screen->dpy (); XserverRegion region; CompRegion tmpRegion (screen->region ()); for (CompWindowList::reverse_iterator rit = screen->windows ().rbegin (); rit != screen->windows ().rend (); ++rit) if (CompositeWindow::get (*rit)->overlayWindow ()) tmpRegion -= (*rit)->region (); XShapeCombineRegion (dpy, priv->output, ShapeBounding, 0, 0, tmpRegion.handle (), ShapeSet); region = XFixesCreateRegion (dpy, NULL, 0); XFixesSetWindowShapeRegion (dpy, priv->output, ShapeInput, 0, 0, region); XFixesDestroyRegion (dpy, region); priv->outputShapeChanged = true; } } bool CompositeScreen::outputWindowChanged () const { return priv->outputShapeChanged; } void PrivateCompositeScreen::makeOutputWindow () { overlay = XCompositeGetOverlayWindow (screen->dpy (), screen->root ()); output = overlay; XSelectInput (screen->dpy (), output, ExposureMask); cScreen->hideOutputWindow (); } Window CompositeScreen::output () { return priv->output; } Window CompositeScreen::overlay () { return priv->overlay; } int & CompositeScreen::overlayWindowCount () { return priv->overlayWindowCount; } void CompositeScreen::setWindowPaintOffset (int x, int y) { priv->windowPaintOffset = CompPoint (x, y); } CompPoint CompositeScreen::windowPaintOffset () { return priv->windowPaintOffset; } void PrivateCompositeScreen::detectRefreshRate () { const bool forceRefreshRate = (pHnd ? pHnd->requiredForcedRefreshRate () : false); const bool detect = optionGetDetectRefreshRate () && !forceRefreshRate; if (detect) { CompString name; CompOption::Value value; value.set ((int) 0); if (randrExtension) { XRRScreenConfiguration *config; config = XRRGetScreenInfo (screen->dpy (), screen->root ()); value.set ((int) XRRConfigCurrentRate (config)); XRRFreeScreenConfigInfo (config); } if (value.i () == 0) value.set ((int) FALLBACK_REFRESH_RATE); mOptions[CompositeOptions::DetectRefreshRate].value ().set (false); screen->setOptionForPlugin ("composite", "refresh_rate", value); mOptions[CompositeOptions::DetectRefreshRate].value ().set (true); optimalRedrawTime = redrawTime = 1000 / value.i (); } else { if (forceRefreshRate && (optionGetRefreshRate () < FALLBACK_REFRESH_RATE)) { CompOption::Value value; value.set ((int) FALLBACK_REFRESH_RATE); screen->setOptionForPlugin ("composite", "refresh_rate", value); } redrawTime = 1000 / optionGetRefreshRate (); optimalRedrawTime = redrawTime; } } CompositeFPSLimiterMode CompositeScreen::FPSLimiterMode () { return priv->FPSLimiterMode; } void CompositeScreen::setFPSLimiterMode (CompositeFPSLimiterMode newMode) { priv->FPSLimiterMode = newMode; } void PrivateCompositeScreen::scheduleRepaint () { if (painting) { reschedule = true; return; } if (scheduled) return; scheduled = true; int delay; if (FPSLimiterMode == CompositeFPSLimiterModeVSyncLike || (pHnd && pHnd->hasVSync ())) delay = 1; else { struct timeval now; gettimeofday (&now, 0); int elapsed = compiz::core::timer::timeval_diff (&now, &lastRedraw); if (elapsed < 0) elapsed = 0; delay = elapsed < optimalRedrawTime ? optimalRedrawTime - elapsed : 1; } paintTimer.start (boost::bind (&CompositeScreen::handlePaintTimeout, cScreen), delay); } int CompositeScreen::redrawTime () { return priv->redrawTime; } int CompositeScreen::optimalRedrawTime () { return priv->optimalRedrawTime; } bool CompositeScreen::handlePaintTimeout () { struct timeval tv; priv->painting = true; priv->reschedule = false; gettimeofday (&tv, 0); if (priv->damageMask) { /* Damage that accumulates here does not require a repaint reschedule * as it will end up on this frame */ priv->damageRequiresRepaintReschedule = false; if (priv->pHnd) priv->pHnd->prepareDrawing (); int timeDiff = compiz::core::timer::timeval_diff (&tv, &priv->lastRedraw); /* handle clock rollback */ if (timeDiff < 0) timeDiff = 0; /* * Now that we use a "tickless" timing algorithm, timeDiff could be * very large if the screen is truely idle. * However plugins expect the old behaviour where timeDiff is rarely * larger than the frame rate (optimalRedrawTime). * So enforce this to keep animations timed correctly and smooth... */ if (timeDiff > 100) timeDiff = priv->optimalRedrawTime; priv->redrawTime = timeDiff; preparePaint (priv->slowAnimations ? 1 : timeDiff); /* substract top most overlay window region */ if (priv->overlayWindowCount) { for (CompWindowList::reverse_iterator rit = screen->windows ().rbegin (); rit != screen->windows ().rend (); ++rit) { CompWindow *w = (*rit); if (w->destroyed () || w->invisible ()) continue; if (!CompositeWindow::get (w)->redirected ()) priv->ageingBuffers.subtractObscuredArea (w->region ()); break; } if (priv->damageMask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) { priv->damageMask &= ~COMPOSITE_SCREEN_DAMAGE_ALL_MASK; priv->damageMask |= COMPOSITE_SCREEN_DAMAGE_REGION_MASK; } } /* All further damage is for the next frame now, as * priv->tmpRegion will be assigned. Notify plugins that do * damage tracking of this */ damageCutoff (); priv->tmpRegion = (priv->roster.currentFrameDamage () + priv->lastFrameDamage) & screen->region (); priv->currentlyTrackingDamage = DamageFinalPaintRegion; if (priv->damageMask & COMPOSITE_SCREEN_DAMAGE_REGION_MASK && priv->tmpRegion == screen->region ()) damageScreen (); Display *dpy = screen->dpy (); std::map::iterator d = priv->damages.begin (); for (; d != priv->damages.end (); ++d) { XserverRegion sub = XFixesCreateRegion (dpy, &d->second, 1); if (sub != None) { XDamageSubtract (dpy, d->first, sub, None); XFixesDestroyRegion (dpy, sub); } } XSync (dpy, False); priv->damages.clear (); /* Any more damage requires a repaint reschedule */ priv->damageRequiresRepaintReschedule = true; priv->lastFrameDamage = CompRegion (); int mask = priv->damageMask; priv->damageMask = 0; CompOutput::ptrList outputs (0); if (priv->optionGetForceIndependentOutputPainting () || !screen->hasOverlappingOutputs ()) { foreach (CompOutput &o, screen->outputDevs ()) { outputs.push_back (&o); } } else outputs.push_back (&screen->fullscreenOutput ()); priv->currentlyTrackingDamage = DamageForCurrentFrame; /* All new damage goes on the next frame */ priv->ageingBuffers.incrementAges (); paint (outputs, mask); donePaint (); priv->outputShapeChanged = false; foreach (CompWindow *w, screen->windows ()) { if (w->destroyed ()) { CompositeWindow::get (w)->addDamage (); break; } } } priv->lastRedraw = tv; priv->painting = false; priv->scheduled = false; if (priv->reschedule) priv->scheduleRepaint (); return false; } void CompositeScreen::preparePaint (int msSinceLastPaint) WRAPABLE_HND_FUNCTN (preparePaint, msSinceLastPaint) void CompositeScreen::donePaint () WRAPABLE_HND_FUNCTN (donePaint) void CompositeScreen::paint (CompOutput::ptrList &outputs, unsigned int mask) { WRAPABLE_HND_FUNCTN (paint, outputs, mask) if (priv->pHnd) priv->pHnd->paintOutputs (outputs, mask, priv->tmpRegion); } const CompWindowList & CompositeScreen::getWindowPaintList () { WRAPABLE_HND_FUNCTN_RETURN (const CompWindowList &, getWindowPaintList) /* Include destroyed windows */ if (screen->destroyedWindows ().empty ()) return screen->windows (); else { CompWindowList destroyedWindows = screen->destroyedWindows (); priv->withDestroyedWindows.resize (0); foreach (CompWindow *w, screen->windows ()) { foreach (CompWindow *dw, screen->destroyedWindows ()) { if (dw->next == w) { priv->withDestroyedWindows.push_back (dw); destroyedWindows.remove (dw); break; } } priv->withDestroyedWindows.push_back (w); } /* We need to put all the destroyed windows which didn't get * inserted in the paint list at the top of the stack since * w->next was probably either invalid or NULL */ foreach (CompWindow *dw, destroyedWindows) priv->withDestroyedWindows.push_back (dw); return priv->withDestroyedWindows; } } void PrivateCompositeScreen::handleExposeEvent (XExposeEvent *event) { if (output == event->window) return; exposeRects.push_back (CompRect (event->x, event->y, event->width, event->height)); if (event->count == 0) { CompRect rect; foreach (CompRect rect, exposeRects) { cScreen->damageRegion (CompRegion (rect)); } exposeRects.clear (); } } void PrivateCompositeScreen::outputChangeNotify () { screen->outputChangeNotify (); XMoveResizeWindow (screen->dpy (), overlay, 0, 0, screen->width (), screen->height ()); cScreen->damageScreen (); } bool CompositeScreen::toggleSlowAnimations (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompositeScreen *cs = CompositeScreen::get (screen); if (cs) cs->priv->slowAnimations = !cs->priv->slowAnimations; return true; } void CompositeScreenInterface::preparePaint (int msSinceLastPaint) WRAPABLE_DEF (preparePaint, msSinceLastPaint) void CompositeScreenInterface::donePaint () WRAPABLE_DEF (donePaint) void CompositeScreenInterface::paint (CompOutput::ptrList &outputs, unsigned int mask) WRAPABLE_DEF (paint, outputs, mask) const CompWindowList & CompositeScreenInterface::getWindowPaintList () WRAPABLE_DEF (getWindowPaintList) bool CompositeScreenInterface::registerPaintHandler (compiz::composite::PaintHandler *pHnd) WRAPABLE_DEF (registerPaintHandler, pHnd); void CompositeScreenInterface::unregisterPaintHandler () WRAPABLE_DEF (unregisterPaintHandler); void CompositeScreenInterface::damageRegion (const CompRegion &r) WRAPABLE_DEF (damageRegion, r); void CompositeScreenInterface::damageCutoff () WRAPABLE_DEF (damageCutoff); const CompRegion & CompositeScreen::currentDamage () const { return priv->roster.currentFrameDamage (); } compiz-0.9.11+14.04.20140409/plugins/composite/src/window.cpp0000644000015301777760000003515312321343002023766 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include "privates.h" template class WrapableInterface; template class PluginClassHandler; CompositeWindow::CompositeWindow (CompWindow *w) : PluginClassHandler (w), priv (new PrivateCompositeWindow (w, this)) { CompScreen *s = screen; if (w->windowClass () != InputOnly) priv->damage = XDamageCreate (s->dpy (), w->id (), XDamageReportBoundingBox); else priv->damage = None; priv->opacity = OPAQUE; if (!(w->type () & CompWindowTypeDesktopMask)) priv->opacity = s->getWindowProp32 (w->id (), Atoms::winOpacity, OPAQUE); priv->brightness = s->getWindowProp32 (w->id (), Atoms::winBrightness, BRIGHT); priv->saturation = s->getWindowProp32 (w->id (), Atoms::winSaturation, COLOR); if (w->isViewable ()) priv->damaged = true; } CompositeWindow::~CompositeWindow () { if (priv->damage) XDamageDestroy (screen->dpy (), priv->damage); if (!priv->redirected) { priv->cScreen->overlayWindowCount ()--; if (priv->cScreen->overlayWindowCount () < 1) priv->cScreen->showOutputWindow (); } release (); addDamage (); if (lastDamagedWindow == priv->window) lastDamagedWindow = NULL; delete priv; } void PrivateCompositeWindow::setNewPixmapReadyCallback (const PixmapBinding::NewPixmapReadyCallback &cb) { mPixmapBinding.setNewPixmapReadyCallback (cb); } void CompositeWindow::setNewPixmapReadyCallback (const PixmapBinding::NewPixmapReadyCallback &cb) { priv->setNewPixmapReadyCallback (cb); } void PrivateCompositeWindow::allowFurtherRebindAttempts () { mPixmapBinding.allowFurtherRebindAttempts (); } PrivateCompositeWindow::PrivateCompositeWindow (CompWindow *w, CompositeWindow *cw) : window (w), cWindow (cw), cScreen (CompositeScreen::get (screen)), mPixmapBinding (boost::function (), this, this, this, screen->serverGrabInterface ()), damage (None), damaged (false), redirected (cScreen->compositingActive ()), overlayWindow (false), opacity (OPAQUE), brightness (BRIGHT), saturation (COLOR), damageRects (0), sizeDamage (0), nDamage (0) { WindowInterface::setHandler (w); } PrivateCompositeWindow::~PrivateCompositeWindow () { if (sizeDamage) free (damageRects); } bool PrivateCompositeWindow::bind () { return mPixmapBinding.bind (); } bool CompositeWindow::bind () { if (!priv->cScreen->compositingActive ()) return false; redirect (); return priv->bind (); } void PrivateCompositeWindow::release () { mPixmapBinding.release (); } void CompositeWindow::release () { return priv->release (); } Pixmap PrivateCompositeWindow::pixmap () const { return mPixmapBinding.pixmap (); } WindowPixmapInterface::Ptr PrivateCompositeWindow::getPixmap () { Pixmap pixmap = XCompositeNameWindowPixmap (screen->dpy (), ROOTPARENT (window)); WindowPixmapInterface::Ptr p (new X11WindowPixmap (screen->dpy (), pixmap)); return p; } bool PrivateCompositeWindow::getAttributes (XWindowAttributes &attr) { return window->queryFrameAttributes (attr); } bool PrivateCompositeWindow::frozen () { /* keep old pixmap for windows that are unmapped on the client side, * but not yet on our side as it's pretty likely that plugins are * currently using it for animations */ bool pendingUnmap = !window->mapNum () && window->isViewable (); bool hidden = window->state () & CompWindowStateHiddenMask; bool animated = window->hasUnmapReference (); return (pendingUnmap || hidden) && animated; } Pixmap CompositeWindow::pixmap () { return priv->pixmap (); } const CompSize & PrivateCompositeWindow::size () const { return mPixmapBinding.size (); } const CompSize & CompositeWindow::size () { return priv->size (); } void CompositeWindow::redirect () { if (priv->redirected || !priv->cScreen->compositingActive ()) return; XCompositeRedirectWindow (screen->dpy (), ROOTPARENT (priv->window), CompositeRedirectManual); priv->redirected = true; if (priv->overlayWindow) { priv->cScreen->overlayWindowCount ()--; priv->overlayWindow = false; } if (priv->cScreen->overlayWindowCount () < 1) priv->cScreen->showOutputWindow (); else priv->cScreen->updateOutputWindow (); } void CompositeWindow::unredirect () { if (!priv->redirected || !priv->cScreen->compositingActive ()) return; release (); priv->redirected = false; priv->overlayWindow = true; priv->cScreen->overlayWindowCount ()++; if (priv->cScreen->overlayWindowCount () > 0) priv->cScreen->updateOutputWindow (); XCompositeUnredirectWindow (screen->dpy (), ROOTPARENT (priv->window), CompositeRedirectManual); } bool CompositeWindow::redirected () { return priv->redirected; } bool CompositeWindow::overlayWindow () { return priv->overlayWindow; } bool CompositeWindow::frozen () { return priv->frozen (); } void CompositeWindow::damageTransformedRect (float xScale, float yScale, float xTranslate, float yTranslate, const CompRect &rect) { int x1 = (short) (rect.x1 () * xScale) - 1; int y1 = (short) (rect.y1 () * yScale) - 1; int x2 = (short) (rect.x2 () * xScale + 0.5f) + 1; int y2 = (short) (rect.y2 () * yScale + 0.5f) + 1; x1 += (short) xTranslate; y1 += (short) yTranslate; x2 += (short) (xTranslate + 0.5f); y2 += (short) (yTranslate + 0.5f); if (x2 > x1 && y2 > y1) { const CompWindow::Geometry &geom = priv->window->serverGeometry (); x1 += geom.x () + geom.border (); y1 += geom.y () + geom.border (); x2 += geom.x () + geom.border (); y2 += geom.y () + geom.border (); priv->cScreen->damageRegion (CompRegion (CompRect (x1, y1, x2 - x1, y2 - y1))); } } void CompositeWindow::damageOutputExtents () { if (priv->cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) return; if (priv->window->shaded () || (priv->window->isViewable ())) { const CompWindow::Geometry &geom = priv->window->geometry (); const CompWindowExtents &output = priv->window->output (); /* top */ int x1 = -output.left - geom.border (); int y1 = -output.top - geom.border (); int x2 = priv->window->size ().width () + output.right; int y2 = -geom.border (); if (x1 < x2 && y1 < y2) addDamageRect (CompRect (x1, y1, x2 - x1, y2 - y1)); /* bottom */ y1 = priv->window->size ().height (); y2 = y1 + output.bottom - geom.border (); if (x1 < x2 && y1 < y2) addDamageRect (CompRect (x1, y1, x2 - x1, y2 - y1)); /* left */ x1 = -output.left - geom.border (); y1 = -geom.border (); x2 = -geom.border (); y2 = priv->window->size ().height (); if (x1 < x2 && y1 < y2) addDamageRect (CompRect (x1, y1, x2 - x1, y2 - y1)); /* right */ x1 = priv->window->size ().width (); x2 = x1 + output.right - geom.border (); if (x1 < x2 && y1 < y2) addDamageRect (CompRect (x1, y1, x2 - x1, y2 - y1)); } } void CompositeWindow::addDamageRect (const CompRect &rect) { if (priv->cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) return; if (!damageRect (false, rect)) { int x = rect.x (); int y = rect.y (); const CompWindow::Geometry &geom = priv->window->geometry (); x += geom.x () + geom.border (); y += geom.y () + geom.border (); priv->cScreen->damageRegion (CompRegion (CompRect (x, y, rect.width (), rect.height ()))); } } void CompositeWindow::addDamage (bool force) { if (priv->cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) return; if (priv->window->shaded () || force || (priv->window->isViewable ())) { int border = priv->window->serverGeometry ().border (); int x1 = -MAX (priv->window->output ().left, priv->window->input ().left) - border; int y1 = -MAX (priv->window->output ().top, priv->window->input ().top) - border; int x2 = priv->window->size ().width () + MAX (priv->window->output ().right, priv->window->input ().right) ; int y2 = priv->window->size ().height () + MAX (priv->window->output ().bottom, priv->window->input ().bottom) ; CompRect r (x1, y1, x2 - x1, y2 - y1); addDamageRect (r); } } bool CompositeWindow::damaged () { return priv->damaged; } void CompositeWindow::processDamage (XDamageNotifyEvent *de) { if (priv->window->syncWait ()) { if (priv->nDamage == priv->sizeDamage) { priv->damageRects = (XRectangle *) realloc (priv->damageRects, (priv->sizeDamage + 1) * sizeof (XRectangle)); priv->sizeDamage += 1; } priv->damageRects[priv->nDamage].x = de->area.x; priv->damageRects[priv->nDamage].y = de->area.y; priv->damageRects[priv->nDamage].width = de->area.width; priv->damageRects[priv->nDamage].height = de->area.height; priv->nDamage++; } else priv->handleDamageRect (this, de->area.x, de->area.y, de->area.width, de->area.height); } void PrivateCompositeWindow::handleDamageRect (CompositeWindow *w, int x, int y, int width, int height) { if (!w->priv->redirected) return; bool initial = false; if (!w->priv->damaged) w->priv->damaged = initial = true; if (!w->damageRect (initial, CompRect (x, y, width, height))) { const CompWindow::Geometry &geom = w->priv->window->geometry (); x += geom.x () + geom.border (); y += geom.y () + geom.border (); w->priv->cScreen->damageRegion (CompRegion (CompRect (x, y, width, height))); } if (initial) w->damageOutputExtents (); } void CompositeWindow::updateOpacity () { if (priv->window->type () & CompWindowTypeDesktopMask) return; unsigned short opacity = screen->getWindowProp32 (priv->window->id (), Atoms::winOpacity, OPAQUE); if (opacity != priv->opacity) { priv->opacity = opacity; addDamage (); } } void CompositeWindow::updateBrightness () { unsigned short brightness = screen->getWindowProp32 (priv->window->id (), Atoms::winBrightness, BRIGHT); if (brightness != priv->brightness) { priv->brightness = brightness; addDamage (); } } void CompositeWindow::updateSaturation () { unsigned short saturation = screen->getWindowProp32 (priv->window->id (), Atoms::winSaturation, COLOR); if (saturation != priv->saturation) { priv->saturation = saturation; addDamage (); } } unsigned short CompositeWindow::opacity () { return priv->opacity; } unsigned short CompositeWindow::brightness () { return priv->brightness; } unsigned short CompositeWindow::saturation () { return priv->saturation; } bool CompositeWindow::damageRect (bool initial, const CompRect &rect) { WRAPABLE_HND_FUNCTN_RETURN (bool, damageRect, initial, rect) return false; } void PrivateCompositeWindow::windowNotify (CompWindowNotify n) { switch (n) { case CompWindowNotifyMap: allowFurtherRebindAttempts (); damaged = false; break; case CompWindowNotifyUnmap: cWindow->addDamage (true); cWindow->release (); if (!redirected && cScreen->compositingActive ()) cWindow->redirect (); break; case CompWindowNotifyRestack: case CompWindowNotifyHide: case CompWindowNotifyShow: case CompWindowNotifyAliveChanged: cWindow->addDamage (true); break; case CompWindowNotifyReparent: case CompWindowNotifyUnreparent: if (redirected) cWindow->release (); cScreen->damageScreen (); cWindow->addDamage (true); break; case CompWindowNotifyFrameUpdate: cWindow->release (); break; case CompWindowNotifySyncAlarm: { XRectangle *rects; rects = damageRects; while (nDamage--) { PrivateCompositeWindow::handleDamageRect (cWindow, rects[nDamage].x, rects[nDamage].y, rects[nDamage].width, rects[nDamage].height); } break; } default: break; } window->windowNotify (n); } void PrivateCompositeWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { window->resizeNotify (dx, dy, dwidth, dheight); if (window->shaded () || (window->isViewable ())) { int x = window->geometry ().x (); int y = window->geometry ().y (); int x1 = x - window->output ().left - dx; int y1 = y - window->output ().top - dy; int x2 = x + window->size ().width () + window->output ().right - dx - dwidth; int y2 = y + window->size ().height () + window->output ().bottom - dy - dheight; cScreen->damageRegion (CompRegion (CompRect (x1, y1, x2 - x1, y2 - y1))); } cWindow->release (); cWindow->addDamage (); } void PrivateCompositeWindow::moveNotify (int dx, int dy, bool now) { if (window->shaded () || (window->isViewable ())) { int x = window->geometry ().x (); int y = window->geometry ().y (); int x1 = x - window->output ().left - dx; int y1 = y - window->output ().top - dy; int x2 = x + window->geometry ().width () + window->output ().right - dx; int y2 = y + window->geometry ().height () + window->output ().bottom - dy; cScreen->damageRegion (CompRegion (CompRect (x1, y1, x2 - x1, y2 - y1))); } cWindow->addDamage (); window->moveNotify (dx, dy, now); } bool CompositeWindowInterface::damageRect (bool initial, const CompRect &rect) WRAPABLE_DEF (damageRect, initial, rect) compiz-0.9.11+14.04.20140409/plugins/composite/src/composite.cpp0000644000015301777760000000554312321343025024466 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include "composite/composite.h" #include "privates.h" #include "core/abiversion.h" class CompositePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (composite, CompositePluginVTable) CompOption::Vector & CompositeScreen::getOptions () { return priv->getOptions (); } bool CompositeScreen::setOption (const CompString &name, CompOption::Value &value) { return priv->setOption (name, value); } bool PrivateCompositeScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = CompositeOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case CompositeOptions::DetectRefreshRate: if (optionGetDetectRefreshRate ()) { detectRefreshRate (); break; } /* Fall through when DetectRefreshRate is unchecked */ case CompositeOptions::RefreshRate: if (optionGetDetectRefreshRate ()) return false; redrawTime = 1000 / optionGetRefreshRate (); optimalRedrawTime = redrawTime; break; default: break; } return rv; } bool CompositePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) { CompPrivate p; p.uval = COMPIZ_COMPOSITE_ABI; screen->storeValue ("composite_ABI", p); return true; } return false; } void CompositePluginVTable::fini () { screen->eraseValue ("composite_ABI"); } compiz-0.9.11+14.04.20140409/plugins/composite/src/backbuffertracking/0000755000015301777760000000000012321344021025563 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/composite/src/backbuffertracking/tests/0000755000015301777760000000000012321344021026725 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000016200000000000011214 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/composite/src/backbuffertracking/tests/test-composite-backbuffertracking.cppcompiz-0.9.11+14.04.20140409/plugins/composite/src/backbuffertracking/tests/test-composite-backbuffe0000644000015301777760000003164312321343002033542 0ustar pbusernogroup00000000000000/* * Compiz, composite plugin, GLX_EXT_buffer_age logic * * Copyright (c) 2012 Sam Spilsbury * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include "backbuffertracking.h" using ::testing::NiceMock; using ::testing::_; using ::testing::AtLeast; namespace bt = compiz::composite::buffertracking; namespace { class MockAgeingDamageBufferObserver : public bt::AgeingDamageBufferObserver { public: MOCK_METHOD1 (observe, void (bt::DamageAgeTracking &)); MOCK_METHOD1 (unobserve, void (bt::DamageAgeTracking &)); }; bool alwaysDirty () { return true; } class BackbufferTracking : public ::testing::Test { public: BackbufferTracking () : screen (1000, 1000), roster () { } virtual void SetUp () { SetupRoster (); } virtual void SetupRoster () { roster.reset (new bt::FrameRoster (screen, niceTracker, boost::bind (alwaysDirty))); } protected: CompSize screen; NiceMock niceTracker; bt::FrameRoster::Ptr roster; }; class BackbufferTrackingCallbacks : public BackbufferTracking { public: BackbufferTrackingCallbacks () : shouldDamage (false) { } protected: void allowDamage (bool allow) { shouldDamage = allow; } private: virtual void SetupRoster () { roster.reset (new bt::FrameRoster (screen, niceTracker, boost::bind (&BackbufferTrackingCallbacks::shouldDamageCallback, this, _1))); } bool shouldDamageCallback (const CompRegion &) { return shouldDamage; } bool shouldDamage; }; } std::ostream & operator<< (std::ostream &os, const CompRegion ®) { os << "Region with Bounding Rectangle : " << reg.boundingRect ().x () << " " << reg.boundingRect ().y () << " " << reg.boundingRect ().width () << " " << reg.boundingRect ().height () << std::endl; CompRect::vector rects (reg.rects ()); for (CompRect::vector::iterator it = rects.begin (); it != rects.end (); it++) os << " - subrectangle: " << (*it).x () << " " << (*it).y () << " " << (*it).width () << " " << (*it).height () << " " << std::endl; return os; } TEST (BackbufferTrackingConstruction, CreateAddsToObserverList) { MockAgeingDamageBufferObserver mockAgeingDamageBufferObserver; /* We can't verify the argument here, * but we can verify the function call */ EXPECT_CALL (mockAgeingDamageBufferObserver, observe (_)); EXPECT_CALL (mockAgeingDamageBufferObserver, unobserve (_)).Times (AtLeast (0)); bt::FrameRoster roster (CompSize (), mockAgeingDamageBufferObserver, boost::bind (alwaysDirty)); } TEST (BackbufferTrackingConstruction, DestroyRemovesFromObserverList) { MockAgeingDamageBufferObserver mockAgeingDamageBufferObserver; /* We can't verify the argument here, * but we can verify the function call */ EXPECT_CALL (mockAgeingDamageBufferObserver, observe (_)).Times (AtLeast (0)); EXPECT_CALL (mockAgeingDamageBufferObserver, unobserve (_)); bt::FrameRoster roster (CompSize (), mockAgeingDamageBufferObserver, boost::bind (alwaysDirty)); } TEST_F (BackbufferTrackingCallbacks, TrackIntoCurrentIfCallbackTrue) { allowDamage (true); CompRegion damage (100, 100, 100, 100); roster->dirtyAreaOnCurrentFrame (damage); EXPECT_EQ (damage, roster->currentFrameDamage ()); } TEST_F (BackbufferTrackingCallbacks, NoTrackIntoCurrentIfCallbackFalse) { allowDamage (false); CompRegion damage (100, 100, 100, 100); roster->dirtyAreaOnCurrentFrame (damage); EXPECT_EQ (emptyRegion, roster->currentFrameDamage ()); } TEST_F (BackbufferTracking, DirtyAreaSubtraction) { CompRegion dirty (100, 100, 100, 100); CompRegion obscured (150, 150, 50, 50); roster->dirtyAreaOnCurrentFrame (dirty); roster->subtractObscuredArea (obscured); EXPECT_EQ (dirty - obscured, roster->currentFrameDamage ()); } TEST_F (BackbufferTracking, DirtyAreaForAgeZeroAll) { EXPECT_EQ (CompRegion (0, 0, screen.width (), screen.height ()), roster->damageForFrameAge (0)); } TEST_F (BackbufferTracking, DirtyAreaAllForOlderThanTrackedAge) { EXPECT_EQ (CompRegion (0, 0, screen.width (), screen.height ()), roster->damageForFrameAge (1)); } TEST_F (BackbufferTracking, NoDirtyAreaForLastFrame) { CompRegion all (0, 0, screen.width (), screen.height ()); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); EXPECT_EQ (emptyRegion, roster->damageForFrameAge (1)); } TEST_F (BackbufferTracking, DirtyAreaIfMoreSinceLastFrame) { CompRegion all (0, 0, screen.width (), screen.height ()); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame(all); EXPECT_EQ (all, roster->damageForFrameAge (1)); } TEST_F (BackbufferTracking, AddOverdrawRegionForLastFrame) { CompRegion all (0, 0, screen.width (), screen.height ()); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->incrementFrameAges (); roster->overdrawRegionOnPaintingFrame (all); EXPECT_EQ (all, roster->damageForFrameAge (2)); } TEST_F (BackbufferTracking, TwoFramesAgo) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion topleft (0, 0, screen.width () / 2, screen.height () / 2); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (topleft); roster->incrementFrameAges (); EXPECT_EQ (topleft, roster->damageForFrameAge (2)); } TEST_F (BackbufferTracking, TwoFramesAgoCulmulative) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion topleft (0, 0, screen.width () / 2, screen.height () / 2); CompRegion topright (0, screen.width () / 2, screen.width () / 2, screen.height () / 2); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (topleft); roster->dirtyAreaOnCurrentFrame (topright); roster->incrementFrameAges (); EXPECT_EQ (topleft + topright, roster->damageForFrameAge (2)); } TEST_F (BackbufferTracking, ThreeFramesAgo) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion topleft (0, 0, screen.width () / 2, screen.height () / 2); CompRegion bottomright (screen.width () / 2, screen.height () / 2, screen.width () / 2, screen.height () / 2); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (topleft); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (bottomright); roster->incrementFrameAges (); EXPECT_EQ (topleft + bottomright, roster->damageForFrameAge (3)); } /* These are more or less functional tests from this point forward * just checking a number of different situations */ TEST_F (BackbufferTracking, ThreeFramesAgoWithFourFrames) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion topleft (0, 0, screen.width () / 2, screen.height () / 2); CompRegion bottomright (screen.width () / 2, screen.height () / 2, screen.width () / 2, screen.height () / 2); CompRegion topright (screen.width () / 2, 0, screen.width () / 2, screen.height () / 2); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (topleft); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (bottomright); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (topright); roster->incrementFrameAges (); EXPECT_EQ (topright + bottomright, roster->damageForFrameAge (3)); } TEST_F (BackbufferTracking, ThreeFramesAgoWithFourFramesAndOverlap) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion topleft (0, 0, screen.width () / 2, screen.height () / 2); CompRegion bottomright (screen.width () / 2, screen.height () / 2, screen.width () / 2, screen.height () / 2); CompRegion topright (screen.width () / 2, 0, screen.width () / 2, screen.height () / 2); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (topleft); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (bottomright); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (bottomright); roster->incrementFrameAges (); EXPECT_EQ (bottomright, roster->damageForFrameAge (3)); } TEST_F (BackbufferTracking, AllDamageForExceedingMaxTrackedFrames) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion damage (0, 0, 1, 1); roster->dirtyAreaOnCurrentFrame (all); for (unsigned int i = 0; i < bt::FrameRoster::NUM_TRACKED_FRAMES - 1; ++i) { roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (damage); } EXPECT_EQ (all, roster->damageForFrameAge (bt::FrameRoster::NUM_TRACKED_FRAMES + 1)); } TEST_F (BackbufferTracking, DamageForMaxTrackedFrame) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion damage (0, 0, 1, 1); roster->dirtyAreaOnCurrentFrame (all); for (unsigned int i = 0; i < bt::FrameRoster::NUM_TRACKED_FRAMES + 1; ++i) { roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (damage); } EXPECT_EQ (all, roster->damageForFrameAge (bt::FrameRoster::NUM_TRACKED_FRAMES)); } class MockDamageAgeTracking : public bt::DamageAgeTracking { public: typedef boost::shared_ptr Ptr; MOCK_METHOD0 (incrementFrameAges, void ()); MOCK_METHOD1 (dirtyAreaOnCurrentFrame, void (const CompRegion &)); MOCK_METHOD1 (subtractObscuredArea, void (const CompRegion &)); MOCK_METHOD1 (overdrawRegionOnPaintingFrame, void (const CompRegion &)); }; class AgeingDamageBuffers : public ::testing::Test { public: AgeingDamageBuffers () { ageing.observe (mockDamageAgeTracker); } MockDamageAgeTracking mockDamageAgeTracker; bt::AgeingDamageBuffers ageing; }; TEST_F (AgeingDamageBuffers, IncrementAgesOnValidRosters) { EXPECT_CALL (mockDamageAgeTracker, incrementFrameAges ()); ageing.incrementAges (); } TEST_F (AgeingDamageBuffers, DirtyAreaOnValidRosters) { CompRegion dirtyArea (100, 100, 100, 100); EXPECT_CALL (mockDamageAgeTracker, dirtyAreaOnCurrentFrame (dirtyArea)); ageing.markAreaDirty (dirtyArea); } TEST_F (AgeingDamageBuffers, SubtractObscuredAreaOnValidRosters) { CompRegion obscuredArea (100, 100, 100, 100); EXPECT_CALL (mockDamageAgeTracker, subtractObscuredArea (obscuredArea)); ageing.subtractObscuredArea (obscuredArea); } TEST_F (AgeingDamageBuffers, AddOverdrawAreaOnValidRosters) { CompRegion overdrawArea (100, 100, 100, 100); EXPECT_CALL (mockDamageAgeTracker, overdrawRegionOnPaintingFrame (overdrawArea)); ageing.markAreaDirtyOnLastFrame (overdrawArea); } TEST_F (AgeingDamageBuffers, IncrementAgesOnInvalidRosters) { EXPECT_CALL (mockDamageAgeTracker, incrementFrameAges ()).Times (0); ageing.unobserve (mockDamageAgeTracker); ageing.incrementAges (); } TEST_F (AgeingDamageBuffers, DirtyAreaOnInvalidRosters) { EXPECT_CALL (mockDamageAgeTracker, dirtyAreaOnCurrentFrame (_)).Times (0); ageing.unobserve (mockDamageAgeTracker); ageing.markAreaDirty (emptyRegion); } TEST_F (AgeingDamageBuffers, SubtractObscuredAreaOnInvalidRosters) { EXPECT_CALL (mockDamageAgeTracker, subtractObscuredArea (_)).Times (0); ageing.unobserve (mockDamageAgeTracker); ageing.subtractObscuredArea (emptyRegion); } TEST_F (AgeingDamageBuffers, AddOverdrawAreaOnInvalidRosters) { EXPECT_CALL (mockDamageAgeTracker, overdrawRegionOnPaintingFrame (_)).Times (0); ageing.unobserve (mockDamageAgeTracker); ageing.markAreaDirtyOnLastFrame (emptyRegion); } compiz-0.9.11+14.04.20140409/plugins/composite/src/backbuffertracking/tests/CMakeLists.txt0000644000015301777760000000161612321343002031467 0ustar pbusernogroup00000000000000find_library (GMOCK_LIBRARY gmock) find_library (GMOCK_MAIN_LIBRARY gmock_main) if (NOT GMOCK_LIBRARY OR NOT GMOCK_MAIN_LIBRARY OR NOT GTEST_FOUND) message ("Google Mock and Google Test not found - cannot build tests!") set (COMPIZ_BUILD_TESTING OFF) endif (NOT GMOCK_LIBRARY OR NOT GMOCK_MAIN_LIBRARY OR NOT GTEST_FOUND) include_directories (${GTEST_INCLUDE_DIRS}) link_directories (${COMPIZ_LIBRARY_DIRS}) add_executable (compiz_test_composite_backbuffertracking ${CMAKE_CURRENT_SOURCE_DIR}/test-composite-backbuffertracking.cpp) target_link_libraries (compiz_test_composite_backbuffertracking compiz_composite_backbuffertracking ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_composite_backbuffertracking COVERAGE compiz_composite_backbuffertracking) compiz-0.9.11+14.04.20140409/plugins/composite/src/backbuffertracking/CMakeLists.txt0000644000015301777760000000106712321343002030325 0ustar pbusernogroup00000000000000INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/../../include ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ) LINK_DIRECTORIES (${COMPIZ_LIBRARY_DIRS}) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/backbuffertracking.cpp ) ADD_LIBRARY( compiz_composite_backbuffertracking STATIC ${SRCS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) TARGET_LINK_LIBRARIES( compiz_composite_backbuffertracking compiz_size compiz_core ) compiz-0.9.11+14.04.20140409/plugins/composite/src/backbuffertracking/src/0000755000015301777760000000000012321344021026352 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/composite/src/backbuffertracking/src/backbuffertracking.cpp0000644000015301777760000001300012321343002032663 0ustar pbusernogroup00000000000000/* * Compiz, composite plugin, GLX_EXT_buffer_age logic * * Copyright (c) 2012 Sam Spilsbury * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include #include "backbuffertracking.h" #include namespace bt = compiz::composite::buffertracking; class bt::FrameRoster::Private { public: Private (const CompSize &size, bt::AgeingDamageBufferObserver &observer, const bt::FrameRoster::AreaShouldBeMarkedDirty &shouldBeMarkedDirty) : screenSize (size), observer (observer), shouldBeMarkedDirty (shouldBeMarkedDirty), oldFrames (1) { } CompSize screenSize; bt::AgeingDamageBufferObserver &observer; bt::FrameRoster::AreaShouldBeMarkedDirty shouldBeMarkedDirty; std::deque oldFrames; }; bt::FrameRoster::FrameRoster (const CompSize &size, bt::AgeingDamageBufferObserver &tracker, const AreaShouldBeMarkedDirty &shouldBeMarkedDirty) : priv (new bt::FrameRoster::Private (size, tracker, shouldBeMarkedDirty)) { priv->observer.observe (*this); } bt::FrameRoster::~FrameRoster () { priv->observer.unobserve (*this); } CompRegion bt::FrameRoster::damageForFrameAge (unsigned int age) { if (!age) return CompRegion (0, 0, priv->screenSize.width (), priv->screenSize.height ()); if (age >= priv->oldFrames.size ()) return CompRegion (0, 0, priv->screenSize.width (), priv->screenSize.height ()); CompRegion accumulatedDamage; while (age--) { unsigned int frameNum = (priv->oldFrames.size () - age) - 1; accumulatedDamage += priv->oldFrames[frameNum]; } return accumulatedDamage; } void bt::FrameRoster::dirtyAreaOnCurrentFrame (const CompRegion &r) { if (priv->shouldBeMarkedDirty (r)) (*priv->oldFrames.rbegin ()) += r; } void bt::FrameRoster::subtractObscuredArea (const CompRegion &r) { (*priv->oldFrames.rbegin ()) -= r; } void bt::FrameRoster::overdrawRegionOnPaintingFrame (const CompRegion &r) { assert (priv->oldFrames.size () > 1); std::deque ::reverse_iterator it = priv->oldFrames.rbegin (); ++it; (*it) += r; } void bt::FrameRoster::incrementFrameAges () { priv->oldFrames.push_back (CompRegion ()); /* Get rid of old frames */ if (priv->oldFrames.size () > NUM_TRACKED_FRAMES) priv->oldFrames.pop_front (); } const CompRegion & bt::FrameRoster::currentFrameDamage () { return *priv->oldFrames.rbegin (); } class bt::AgeingDamageBuffers::Private { public: std::vector damageAgeTrackers; }; bt::AgeingDamageBuffers::AgeingDamageBuffers () : priv (new bt::AgeingDamageBuffers::Private ()) { } void bt::AgeingDamageBuffers::observe (bt::DamageAgeTracking &damageAgeTracker) { priv->damageAgeTrackers.push_back (&damageAgeTracker); } void bt::AgeingDamageBuffers::unobserve (bt::DamageAgeTracking &damageAgeTracker) { std::vector ::iterator it = std::find (priv->damageAgeTrackers.begin (), priv->damageAgeTrackers.end (), &damageAgeTracker); if (it != priv->damageAgeTrackers.end ()) priv->damageAgeTrackers.erase (it); } void bt::AgeingDamageBuffers::incrementAges () { for (std::vector ::iterator it = priv->damageAgeTrackers.begin (); it != priv->damageAgeTrackers.end (); ++it) { bt::DamageAgeTracking *tracker = *it; tracker->incrementFrameAges (); } } void bt::AgeingDamageBuffers::markAreaDirty (const CompRegion ®) { for (std::vector ::iterator it = priv->damageAgeTrackers.begin (); it != priv->damageAgeTrackers.end (); ++it) { bt::DamageAgeTracking *tracker = *it; tracker->dirtyAreaOnCurrentFrame (reg); } } void bt::AgeingDamageBuffers::subtractObscuredArea (const CompRegion ®) { for (std::vector ::iterator it = priv->damageAgeTrackers.begin (); it != priv->damageAgeTrackers.end (); ++it) { bt::DamageAgeTracking *tracker = *it; tracker->subtractObscuredArea (reg); } } void bt::AgeingDamageBuffers::markAreaDirtyOnLastFrame (const CompRegion ®) { for (std::vector ::iterator it = priv->damageAgeTrackers.begin (); it != priv->damageAgeTrackers.end (); ++it) { bt::DamageAgeTracking *tracker = *it; tracker->overdrawRegionOnPaintingFrame (reg); } } compiz-0.9.11+14.04.20140409/plugins/composite/src/backbuffertracking/include/0000755000015301777760000000000012321344021027206 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/composite/src/backbuffertracking/include/backbuffertracking.h0000644000015301777760000000710612321343002033176 0ustar pbusernogroup00000000000000/* * Compiz, composite plugin, GLX_EXT_buffer_age logic * * Copyright (c) 2012 Sam Spilsbury * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef _COMPIZ_COMPOSITE_BACKBUFFERTRACKING_H #define _COMPIZ_COMPOSITE_BACKBUFFERTRACKING_H #include #include #include #include #include #include class CompSize; class CompRegion; namespace compiz { namespace composite { namespace buffertracking { class DamageAgeTracking { public: virtual ~DamageAgeTracking () {}; virtual void dirtyAreaOnCurrentFrame (const CompRegion &) = 0; virtual void overdrawRegionOnPaintingFrame (const CompRegion &) = 0; virtual void subtractObscuredArea (const CompRegion &) = 0; virtual void incrementFrameAges () = 0; }; class AgeingDamageBufferObserver { public: virtual ~AgeingDamageBufferObserver () {}; virtual void observe (DamageAgeTracking &damageAgeTracker) = 0; virtual void unobserve (DamageAgeTracking &damageAgeTracker) = 0; }; class AgeingDamageBuffers : public AgeingDamageBufferObserver, boost::noncopyable { public: AgeingDamageBuffers (); void observe (DamageAgeTracking &damageAgeTracker); void unobserve (DamageAgeTracking &damageAgeTracker); void incrementAges (); void markAreaDirty (const CompRegion ®); void markAreaDirtyOnLastFrame (const CompRegion ®); void subtractObscuredArea (const CompRegion ®); private: class Private; std::auto_ptr priv; }; class FrameRoster : public DamageAgeTracking, public AgeDamageQuery, boost::noncopyable { public: typedef AgeDamageQuery::AreaShouldBeMarkedDirty AreaShouldBeMarkedDirty; typedef boost::shared_ptr Ptr; FrameRoster (const CompSize &size, AgeingDamageBufferObserver &tracker, const AreaShouldBeMarkedDirty &shouldMarkDirty); ~FrameRoster (); void dirtyAreaOnCurrentFrame (const CompRegion &); void overdrawRegionOnPaintingFrame (const CompRegion &); void subtractObscuredArea (const CompRegion &); void incrementFrameAges (); CompRegion damageForFrameAge (unsigned int); const CompRegion & currentFrameDamage (); class Private; std::auto_ptr priv; static const unsigned int NUM_TRACKED_FRAMES = 10; static FrameRoster::Ptr create (const CompSize &size, const AreaShouldBeMarkedDirty &shouldMarkDirty); private: }; } // namespace buffertracking } // namespace composite } // namespace compiz #endif compiz-0.9.11+14.04.20140409/plugins/composite/src/privates.h0000644000015301777760000001135612321343002023760 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPOSITE_PRIVATES_H #define _COMPOSITE_PRIVATES_H #include #include #include #include #include #include "pixmapbinding.h" #include "backbuffertracking.h" #include "composite_options.h" extern CompPlugin::VTable *compositeVTable; extern CompWindow *lastDamagedWindow; enum DamageTracking { DamageForCurrentFrame = 0, DamageForLastFrame = 1, DamageFinalPaintRegion }; class PrivateCompositeScreen : ScreenInterface, public CompositeOptions { public: PrivateCompositeScreen (CompositeScreen *cs); ~PrivateCompositeScreen (); bool setOption (const CompString &name, CompOption::Value &value); void outputChangeNotify (); void handleEvent (XEvent *event); void makeOutputWindow (); bool init (); void handleExposeEvent (XExposeEvent *event); void detectRefreshRate (); void scheduleRepaint (); const CompRegion * damageTrackedBuffer (const CompRegion &); public: CompositeScreen *cScreen; int compositeEvent, compositeError, compositeOpcode; int damageEvent, damageError; int fixesEvent, fixesError, fixesVersion; bool shapeExtension; int shapeEvent, shapeError; bool randrExtension; int randrEvent, randrError; CompRegion lastFrameDamage; unsigned long damageMask; CompRegion tmpRegion; DamageTracking currentlyTrackingDamage; Window overlay; Window output; std::list exposeRects; CompPoint windowPaintOffset; int overlayWindowCount; bool outputShapeChanged; struct timeval lastRedraw; int redrawTime; int optimalRedrawTime; bool scheduled, painting, reschedule; bool damageRequiresRepaintReschedule; bool slowAnimations; CompTimer paintTimer; compiz::composite::PaintHandler *pHnd; CompositeFPSLimiterMode FPSLimiterMode; CompWindowList withDestroyedWindows; Atom cmSnAtom; Window newCmSnOwner; /* Map Damage handle to its bounding box */ std::map damages; compiz::composite::buffertracking::AgeingDamageBuffers ageingBuffers; compiz::composite::buffertracking::FrameRoster roster; }; class PrivateCompositeWindow : public WindowInterface, public CompositePixmapRebindInterface, public WindowPixmapGetInterface, public WindowAttributesGetInterface, public PixmapFreezerInterface { public: PrivateCompositeWindow (CompWindow *w, CompositeWindow *cw); ~PrivateCompositeWindow (); void windowNotify (CompWindowNotify n); void resizeNotify (int dx, int dy, int dwidth, int dheight); void moveNotify (int dx, int dy, bool now); Pixmap pixmap () const; bool bind (); const CompSize & size () const; void release (); void setNewPixmapReadyCallback (const boost::function &); void allowFurtherRebindAttempts (); bool frozen (); static void handleDamageRect (CompositeWindow *w, int x, int y, int width, int height); public: CompWindow *window; CompositeWindow *cWindow; CompositeScreen *cScreen; PixmapBinding mPixmapBinding; Damage damage; bool damaged; bool redirected; bool overlayWindow; unsigned short opacity; unsigned short brightness; unsigned short saturation; XRectangle *damageRects; int sizeDamage; int nDamage; private: bool getAttributes (XWindowAttributes &); WindowPixmapInterface::Ptr getPixmap (); }; #endif compiz-0.9.11+14.04.20140409/plugins/composite/src/pixmapbinding/0000755000015301777760000000000012321344021024577 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/composite/src/pixmapbinding/tests/0000755000015301777760000000000012321344021025741 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000015000000000000011211 Lustar 00000000000000compiz-0.9.11+14.04.20140409/plugins/composite/src/pixmapbinding/tests/test-composite-pixmapbinding.cppcompiz-0.9.11+14.04.20140409/plugins/composite/src/pixmapbinding/tests/test-composite-pixmapbinding.0000644000015301777760000003240512321343002033552 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Sam Spilsbury */ #include #include #include #include #include #include "pixmapbinding.h" using ::testing::Invoke; using ::testing::Return; using ::testing::_; class CompositePixmapBinderTest : public ::testing::Test { }; class MockPixmapFreezer : public PixmapFreezerInterface { public: MOCK_METHOD0 (frozen, bool ()); }; class MockWindowPixmapGet : public WindowPixmapGetInterface { public: MOCK_METHOD0 (getPixmap, WindowPixmapInterface::Ptr ()); }; class FakeWindowAttributesGet : public WindowAttributesGetInterface { public: FakeWindowAttributesGet (XWindowAttributes &wa) : mAttributes (wa) { } bool getAttributes (XWindowAttributes &wa) { wa = mAttributes; return true; } private: XWindowAttributes mAttributes; }; class MockWindowAttributesGet : public WindowAttributesGetInterface { public: MOCK_METHOD1 (getAttributes, bool (XWindowAttributes &)); }; class MockPixmap : public WindowPixmapInterface { public: typedef boost::shared_ptr Ptr; MOCK_CONST_METHOD0 (pixmap, Pixmap ()); MOCK_METHOD0 (releasePixmap, void ()); }; class MockServerGrab : public ServerGrabInterface { public: MOCK_METHOD0 (grabServer, void ()); MOCK_METHOD0 (ungrabServer, void ()); MOCK_METHOD0 (syncServer, void ()); }; class PixmapReadyInterface { public: virtual ~PixmapReadyInterface () {} virtual void ready () = 0; }; class MockPixmapReady : public PixmapReadyInterface { public: MOCK_METHOD0 (ready, void ()); }; TEST(CompositePixmapBinderTest, TestInitialBindSuccess) { /* Leave this here * There's a bug in Google Mock at the moment where * if a function with an expectation which returns * Mock B through a container is itself contained in * Mock A, then when Mock A is destroyed, it will first * lock a mutex, and then it will invoke * the destructor the container containing Mock B which * in turn might invoke Mock B's destructor and thus * lock the same mutex in the same thread (deadlock). * * Keeping this reference here ensures that MockPixmap * stays alive while MockWindowPixmapGet is being destroyed */ MockPixmap::Ptr wp (boost::make_shared ()); MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsViewable; xwa.border_width = 1; FakeWindowAttributesGet fwag (xwa); MockPixmapReady ready; boost::function readyCb (boost::bind (&PixmapReadyInterface::ready, &ready)); PixmapBinding pr (readyCb, &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_CALL (ready, ready ()); EXPECT_CALL (msg, ungrabServer ()); pr.bind (); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); EXPECT_CALL (*wp, releasePixmap ()); } TEST(CompositePixmapBinderTest, TestInitialBindSuccessNoRebind) { MockPixmap::Ptr wp (boost::make_shared ()); MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsViewable; xwa.border_width = 1; FakeWindowAttributesGet fwag (xwa); MockPixmapReady ready; boost::function readyCb (boost::bind (&PixmapReadyInterface::ready, &ready)); PixmapBinding pr (readyCb, &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_CALL (ready, ready ()); EXPECT_CALL (msg, ungrabServer ()); EXPECT_TRUE (pr.bind ()); EXPECT_TRUE (pr.bind ()); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); EXPECT_CALL (*wp, releasePixmap ()); } TEST(CompositePixmapBinderTest, TestRebindAfterRelease) { MockPixmap::Ptr wp (boost::make_shared ()); MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsViewable; xwa.border_width = 1; FakeWindowAttributesGet fwag (xwa); MockPixmapReady ready; boost::function readyCb (boost::bind (&PixmapReadyInterface::ready, &ready)); PixmapBinding pr (readyCb, &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_CALL (ready, ready ()); EXPECT_CALL (msg, ungrabServer ()); EXPECT_TRUE (pr.bind ()); EXPECT_CALL (mpf, frozen ()).WillOnce (Return (false)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); EXPECT_CALL (*wp, releasePixmap ()); pr.release (); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_CALL (ready, ready ()); EXPECT_CALL (msg, ungrabServer ()); EXPECT_TRUE (pr.bind ()); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); EXPECT_CALL (*wp, releasePixmap ()); } TEST(CompositePixmapBinderTest, TestNoRebindAfterReleaseWhenFrozen) { MockPixmap::Ptr wp (boost::make_shared ()); MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsViewable; xwa.border_width = 1; FakeWindowAttributesGet fwag (xwa); MockPixmapReady ready; boost::function readyCb (boost::bind (&PixmapReadyInterface::ready, &ready)); PixmapBinding pr (readyCb, &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_CALL (ready, ready ()); EXPECT_CALL (msg, ungrabServer ()); EXPECT_TRUE (pr.bind ()); EXPECT_CALL (mpf, frozen ()).WillOnce (Return (true)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); pr.release (); EXPECT_TRUE (pr.bind ()); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); EXPECT_CALL (*wp, releasePixmap ()); } TEST(CompositePixmapBinderTest, TestInitialBindFailureWindowUnmapped) { MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsUnmapped; xwa.border_width = 1; FakeWindowAttributesGet fwag (xwa); PixmapBinding pr (boost::function (), &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (msg, ungrabServer ()); EXPECT_FALSE (pr.bind ()); EXPECT_EQ (pr.pixmap (), 0); EXPECT_EQ (pr.size (), CompSize (0, 0)); } TEST(CompositePixmapBinderTest, TestInitialBindFailureWindowZeroSize) { MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 0; xwa.height = 0; xwa.map_state = IsViewable; xwa.border_width = 0; FakeWindowAttributesGet fwag (xwa); PixmapBinding pr (boost::function (), &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (msg, ungrabServer ()); EXPECT_FALSE (pr.bind ()); EXPECT_EQ (pr.pixmap (), 0); EXPECT_EQ (pr.size (), CompSize (0, 0)); } TEST(CompositePixmapBinderTest, TestInitialBindFailureNilPixmapReturned) { MockPixmap::Ptr wp (boost::make_shared ()); MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsViewable; xwa.border_width = 0; FakeWindowAttributesGet fwag (xwa); PixmapBinding pr (boost::function (), &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (0)); EXPECT_CALL (msg, ungrabServer ()); EXPECT_FALSE (pr.bind ()); EXPECT_EQ (pr.pixmap (), 0); EXPECT_EQ (pr.size (), CompSize (0, 0)); } TEST(CompositePixmapBinderTest, TestInitialBindFailureWindowUnmappedSuccessOnRemap) { MockPixmap::Ptr wp (boost::make_shared ()); MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsUnmapped; xwa.border_width = 1; FakeWindowAttributesGet fwag (xwa); PixmapBinding pr (boost::function (), &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (msg, ungrabServer ()); EXPECT_FALSE (pr.bind ()); EXPECT_EQ (pr.pixmap (), 0); EXPECT_EQ (pr.size (), CompSize (0, 0)); EXPECT_FALSE (pr.bind ()); pr.allowFurtherRebindAttempts (); xwa.width = 100; xwa.height = 200; xwa.map_state = IsViewable; xwa.border_width = 1; FakeWindowAttributesGet fwag2 (xwa); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag2, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (msg, ungrabServer ()); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_TRUE (pr.bind ()); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); } compiz-0.9.11+14.04.20140409/plugins/composite/src/pixmapbinding/tests/CMakeLists.txt0000644000015301777760000000070212321343002030476 0ustar pbusernogroup00000000000000add_executable (compiz_test_composite_pixmapbinding ${CMAKE_CURRENT_SOURCE_DIR}/test-composite-pixmapbinding.cpp) target_link_libraries (compiz_test_composite_pixmapbinding compiz_composite_pixmapbinding ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_composite_pixmapbinding COVERAGE compiz_composite_pixmapbinding) compiz-0.9.11+14.04.20140409/plugins/composite/src/pixmapbinding/CMakeLists.txt0000644000015301777760000000147312321343002027342 0ustar pbusernogroup00000000000000include (FindPkgConfig) PKG_CHECK_MODULES (X11 x11) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ${X11_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS} ${COMPIZ_LIBRARY_DIRS}) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/pixmapbinding.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/pixmapbinding.cpp ${compiz_SOURCE_DIR}/src/size.cpp # XXX: Remove once we've merged this into a general geometry lib ) ADD_LIBRARY( compiz_composite_pixmapbinding STATIC ${SRCS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) TARGET_LINK_LIBRARIES( compiz_composite_pixmapbinding compiz_servergrab ${X11_LIBRARIES} ) compiz-0.9.11+14.04.20140409/plugins/composite/src/pixmapbinding/src/0000755000015301777760000000000012321344021025366 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/composite/src/pixmapbinding/src/pixmapbinding.cpp0000644000015301777760000000733612321343002030732 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman * Sam Spilsbury */ #include #include "pixmapbinding.h" PixmapBinding::PixmapBinding (const NewPixmapReadyCallback &cb, WindowPixmapGetInterface *pmg, WindowAttributesGetInterface *wag, PixmapFreezerInterface *pf, ServerGrabInterface *sg) : mPixmap (), mSize (), needsRebind (true), bindFailed (false), newPixmapReadyCallback (cb), windowPixmapRetreiver (pmg), windowAttributesRetreiver (wag), pixmapFreezer (pf), serverGrab (sg) { } PixmapBinding::~PixmapBinding () { needsRebind = false; } const CompSize & PixmapBinding::size () const { return mSize; } Pixmap PixmapBinding::pixmap () const { static Pixmap nPixmap = None; if (needsRebind || !mPixmap.get ()) return nPixmap; return mPixmap->pixmap (); } bool PixmapBinding::bind () { /* don't try to bind window again if it failed previously */ if (bindFailed) return false; if (needsRebind) { XWindowAttributes attr; /* We have to grab the server here to make sure that window is mapped when getting the window pixmap */ ServerLock mLock (serverGrab); windowAttributesRetreiver->getAttributes (attr); if (attr.map_state != IsViewable || (attr.width == 0 && attr.border_width == 0) || (attr.height == 0 && attr.border_width == 0)) { bindFailed = true; needsRebind = false; return false; } WindowPixmapInterface::Ptr newPixmap = windowPixmapRetreiver->getPixmap (); CompSize newSize = CompSize (attr.border_width * 2 + attr.width, attr.border_width * 2 + attr.height); if (newPixmap->pixmap () && newSize.width () && newSize.height ()) { /* Notify renderer that a new pixmap is about to * be bound */ if (newPixmapReadyCallback) newPixmapReadyCallback (); /* Assign new pixmap */ std::auto_ptr newPixmapWrapper (new WindowPixmap (newPixmap)); mPixmap = newPixmapWrapper; mSize = newSize; needsRebind = false; } else { bindFailed = true; needsRebind = false; return false; } } return true; } void PixmapBinding::release () { if (!pixmapFreezer->frozen ()) needsRebind = true; } void PixmapBinding::setNewPixmapReadyCallback (const NewPixmapReadyCallback &cb) { newPixmapReadyCallback = cb; } void PixmapBinding::allowFurtherRebindAttempts () { bindFailed = false; needsRebind = true; } compiz-0.9.11+14.04.20140409/plugins/composite/src/pixmapbinding/include/0000755000015301777760000000000012321344021026222 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/composite/src/pixmapbinding/include/pixmapbinding.h0000644000015301777760000001062112321343002031222 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman * Sam Spilsbury */ #ifndef _COMPOSITE_PIXMAP_REBIND_H #define _COMPOSITE_PIXMAP_REBIND_H #include #include #include #include #include #include class ServerGrabInterface; class CompositePixmapRebindInterface { public: virtual ~CompositePixmapRebindInterface () {} virtual Pixmap pixmap () const = 0; virtual bool bind () = 0; virtual const CompSize & size () const = 0; virtual void release () = 0; /* This isn't great API, but probably necessary * unless we make it a requirement that the * renderer sets the strategy for the rebinder */ virtual void setNewPixmapReadyCallback (const boost::function &) = 0; /* Also don't like this either */ virtual void allowFurtherRebindAttempts () = 0; }; class PixmapFreezerInterface { public: virtual ~PixmapFreezerInterface () {} virtual bool frozen () = 0; }; class WindowAttributesGetInterface { public: virtual ~WindowAttributesGetInterface () {} virtual bool getAttributes (XWindowAttributes &) = 0; }; class WindowPixmapInterface { public: virtual ~WindowPixmapInterface () {} typedef boost::shared_ptr Ptr; virtual Pixmap pixmap () const = 0; virtual void releasePixmap () = 0; }; class X11WindowPixmap : public WindowPixmapInterface { public: X11WindowPixmap (Display *d, Pixmap p) : mDisplay (d), mPixmap (p) { } Pixmap pixmap () const { return mPixmap; } void releasePixmap () { if (mPixmap) XFreePixmap (mDisplay, mPixmap); mPixmap = None; } private: Display *mDisplay; Pixmap mPixmap; }; class WindowPixmap { public: WindowPixmap () : mPixmap () { } WindowPixmap (WindowPixmapInterface::Ptr &pm) : mPixmap (pm) { } Pixmap pixmap () const { if (mPixmap) return mPixmap->pixmap (); return None; } ~WindowPixmap () { if (mPixmap) mPixmap->releasePixmap (); } private: WindowPixmapInterface::Ptr mPixmap; }; class WindowPixmapGetInterface { public: virtual ~WindowPixmapGetInterface () {} virtual WindowPixmapInterface::Ptr getPixmap () = 0; }; class PixmapBinding : public CompositePixmapRebindInterface { public: typedef boost::function NewPixmapReadyCallback; PixmapBinding (const NewPixmapReadyCallback &, WindowPixmapGetInterface *, WindowAttributesGetInterface *, PixmapFreezerInterface *, ServerGrabInterface *); ~PixmapBinding (); Pixmap pixmap () const; bool bind (); const CompSize & size () const; void release (); void setNewPixmapReadyCallback (const boost::function &); void allowFurtherRebindAttempts (); private: std::auto_ptr mPixmap; CompSize mSize; bool needsRebind; bool bindFailed; NewPixmapReadyCallback newPixmapReadyCallback; WindowPixmapGetInterface *windowPixmapRetreiver; WindowAttributesGetInterface *windowAttributesRetreiver; PixmapFreezerInterface *pixmapFreezer; ServerGrabInterface *serverGrab; }; #endif compiz-0.9.11+14.04.20140409/plugins/composite/include/0000755000015301777760000000000012321344021022602 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/composite/include/composite/0000755000015301777760000000000012321344021024604 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/composite/include/composite/agedamagequery.h0000644000015301777760000000334212321343002027736 0ustar pbusernogroup00000000000000/* * Compiz, composite plugin, GLX_EXT_buffer_age logic * * Copyright (c) 2012 Sam Spilsbury * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef _COMPIZ_COMPOSITE_AGEDAMAGEQUERY_H #define _COMPIZ_COMPOSITE_AGEDAMAGEQUERY_H #include #include namespace compiz { namespace composite { namespace buffertracking { class AgeDamageQuery { public: typedef boost::shared_ptr Ptr; typedef boost::function AreaShouldBeMarkedDirty; virtual ~AgeDamageQuery () {} virtual CompRegion damageForFrameAge (unsigned int) = 0; virtual const CompRegion & currentFrameDamage () = 0; }; } } } #endif compiz-0.9.11+14.04.20140409/plugins/composite/include/composite/composite.h0000644000015301777760000003210212321343002026753 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPIZ_COMPOSITE_H #define _COMPIZ_COMPOSITE_H #include #define COMPIZ_COMPOSITE_ABI 6 #include "core/pluginclasshandler.h" #include "core/timer.h" #include "core/output.h" #include "core/screen.h" #include "core/wrapsystem.h" #include "composite/agedamagequery.h" #define COMPOSITE_SCREEN_DAMAGE_PENDING_MASK (1 << 0) #define COMPOSITE_SCREEN_DAMAGE_REGION_MASK (1 << 1) #define COMPOSITE_SCREEN_DAMAGE_ALL_MASK (1 << 2) #define OPAQUE 0xffff #define COLOR 0xffff #define BRIGHT 0xffff /** * Used to indicate only part of the screen is being redrawn */ #define PAINT_SCREEN_REGION_MASK (1 << 0) /** * Used to indicate that the whole screen is being redrawn */ #define PAINT_SCREEN_FULL_MASK (1 << 1) /** * Used to indicate that every window on this screen will be * transformed, so non-painted areas should be * double-buffered */ #define PAINT_SCREEN_TRANSFORMED_MASK (1 << 2) /** * Used to indicate that some windows on this screen will * be drawn transformed */ #define PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK (1 << 3) /** * Used to indicate that nothing is being drawn on this pass */ #define PAINT_SCREEN_CLEAR_MASK (1 << 4) /** * Used to indicate that occlusion detection is not in use * on this pass */ #define PAINT_SCREEN_NO_OCCLUSION_DETECTION_MASK (1 << 5) /** * Used to indicate that no background will be drawn on this * pass */ #define PAINT_SCREEN_NO_BACKGROUND_MASK (1 << 6) typedef enum { CompositeFPSLimiterModeDisabled = 0, CompositeFPSLimiterModeDefault, CompositeFPSLimiterModeVSyncLike } CompositeFPSLimiterMode; class PrivateCompositeScreen; class PrivateCompositeWindow; class CompositeScreen; class CompositeWindow; namespace compiz { namespace composite { class PaintHandler { public: virtual ~PaintHandler () {}; virtual void paintOutputs (CompOutput::ptrList &outputs, unsigned int mask, const CompRegion ®ion) = 0; virtual bool hasVSync () { return false; }; virtual bool requiredForcedRefreshRate () { return false; }; virtual void prepareDrawing () {}; virtual bool compositingActive () { return false; }; virtual unsigned int getFrameAge () { return 1; } }; } } class CompositeScreenInterface; extern template class WrapableInterface; /** * Wrapable function interface for CompositeScreen */ class CompositeScreenInterface : public WrapableInterface { public: /** * Hook which activates just before the screen is painted, * plugins should use this to calculate animation parameters * * @param msSinceLastPaint Describes how many milliseconds have passed * since the last screen repaint */ virtual void preparePaint (int); /** * Hook which activates right after the screen is painted, * plugins should use this to run post-paint cleanup, damage handling * and setting next paint variables * */ virtual void donePaint (); /** * Hookable function which dispatches painting of outputs * to rendering plugins such as OpenGL. Hook this function * to change which outputs are painted, or to paint them * manually if you are rendering */ virtual void paint (CompOutput::ptrList &outputs, unsigned int); /** * Hookable function which gets a list of windows that need to be * evaluated for repainting */ virtual const CompWindowList & getWindowPaintList (); /** * Hookable function to register a new paint handler, overload * and insert your own paint handler if you want to prevent * another one from being loaded */ virtual bool registerPaintHandler (compiz::composite::PaintHandler *pHnd); /** * Hookable function to notify unregistration of a paint handler * */ virtual void unregisterPaintHandler (); /** * Hookable function to damage regions directly */ virtual void damageRegion (const CompRegion &r); /** * Hookable function to notify plugins that the last damage * event for this frame has been received, and all further damage * events will be for the next frame */ virtual void damageCutoff (); }; extern template class PluginClassHandler; class CompositeScreen : public WrapableHandler, public PluginClassHandler, public CompOption::Class { public: CompositeScreen (CompScreen *s); ~CompositeScreen (); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); bool compositingActive (); /** * Returns the value of an XDamage Extension event signature */ int damageEvent (); /** * Causes the entire screen to be redrawn on the next * event loop */ void damageScreen (); void damagePending (); /** * Causes the damage that was recorded on N - 1 number of * frames ago to be added to the current frame, applied * culmulatively. An age of "zero" means that the entire frame * is considered undefined and must be completely repaired, * wheras an age of 1 means that this frame is the same as the * last frame, so no damage is required. */ void applyDamageForFrameAge (unsigned int); unsigned int getFrameAge (); /** * @brief recordDamageOnCurrentFrame * * Causes damage to be recorded on one-frame ago. Ideally this * should be used in the case where damage was already recorded * for a frame, but due to an unforeseen circumstance at the time * additional painting area needed to be allocated at paint-time. */ void recordDamageOnCurrentFrame (const CompRegion &); typedef compiz::composite::buffertracking::AgeDamageQuery DamageQuery; typedef DamageQuery::AreaShouldBeMarkedDirty AreaShouldBeMarkedDirty; DamageQuery::Ptr getDamageQuery (AreaShouldBeMarkedDirty callback = AreaShouldBeMarkedDirty ()); unsigned int damageMask (); const CompRegion & currentDamage () const; void showOutputWindow (); void hideOutputWindow (); void updateOutputWindow (); bool outputWindowChanged () const; Window overlay (); Window output (); int & overlayWindowCount (); void setWindowPaintOffset (int x, int y); CompPoint windowPaintOffset (); /** * Limits the number of redraws per second */ void setFPSLimiterMode (CompositeFPSLimiterMode newMode); CompositeFPSLimiterMode FPSLimiterMode (); int redrawTime (); int optimalRedrawTime (); bool handlePaintTimeout (); WRAPABLE_HND (0, CompositeScreenInterface, void, preparePaint, int); WRAPABLE_HND (1, CompositeScreenInterface, void, donePaint); WRAPABLE_HND (2, CompositeScreenInterface, void, paint, CompOutput::ptrList &outputs, unsigned int); WRAPABLE_HND (3, CompositeScreenInterface, const CompWindowList &, getWindowPaintList); WRAPABLE_HND (4, CompositeScreenInterface, bool, registerPaintHandler, compiz::composite::PaintHandler *); WRAPABLE_HND (5, CompositeScreenInterface, void, unregisterPaintHandler); /** * Adds a specific region to be redrawn on the next * event loop */ WRAPABLE_HND (6, CompositeScreenInterface, void, damageRegion, const CompRegion &); WRAPABLE_HND (7, CompositeScreenInterface, void, damageCutoff); friend class PrivateCompositeDisplay; private: PrivateCompositeScreen *priv; public: static bool toggleSlowAnimations (CompAction *action, CompAction::State state, CompOption::Vector &options); }; /* window paint flags bit 1-16 are used for read-only flags and they provide information that describe the screen rendering pass currently in process. bit 17-32 are writable flags and they provide information that is used to optimize rendering. */ /** * this flag is present when window is being painted * on a transformed screen. */ #define PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK (1 << 0) /** * this flag is present when window is being tested * for occlusion of other windows. */ #define PAINT_WINDOW_OCCLUSION_DETECTION_MASK (1 << 1) /** * this flag indicates that the window ist painted with * an offset */ #define PAINT_WINDOW_WITH_OFFSET_MASK (1 << 2) /** * flag indicate that window is translucent. */ #define PAINT_WINDOW_TRANSLUCENT_MASK (1 << 16) /** * flag indicate that window is transformed. */ #define PAINT_WINDOW_TRANSFORMED_MASK (1 << 17) /** * flag indicate that core PaintWindow function should * not draw this window. */ #define PAINT_WINDOW_NO_CORE_INSTANCE_MASK (1 << 18) /** * flag indicate that blending is required. */ #define PAINT_WINDOW_BLEND_MASK (1 << 19) class CompositeWindowInterface; extern template class WrapableInterface; class CompositeWindowInterface : public WrapableInterface { public: /** * Hookable function to determine which parts of the * screen for this window to redraw on the next pass * * @param initial Indicates if this is the first time * this window is being redrawn * @param rect Reference to a rect which describes which * parts of the screen need to be redrawn on next pass */ virtual bool damageRect (bool initial, const CompRect &rect); }; extern template class PluginClassHandler; class CompositeWindow : public WrapableHandler, public PluginClassHandler { public: CompositeWindow (CompWindow *w); ~CompositeWindow (); /** * Binds the window contents of this window to some offscreen pixmap */ bool bind (); /** * Releases the pixmap data for this window with XFreePixmap. */ void release (); /** * Returns the window pixmap */ Pixmap pixmap (); /** * Pixmap size at the time the pixmap was last bound */ const CompSize & size (); /** * Forces this window to be composited so that the X Server * stops drawing it and all output is redirected to an * offscreen pixmap */ void redirect (); /** * Stops this window from being composited, so that the X Server * draws the window on-screen normally and output is not redirected * to an offscreen pixmap */ void unredirect (); /** * Returns true if a window is redirected */ bool redirected (); bool overlayWindow (); /** * Returns true if pixmap updates are frozen */ bool frozen (); void damageTransformedRect (float xScale, float yScale, float xTranslate, float yTranslate, const CompRect &rect); void damageOutputExtents (); /** * Causes an area of the window to be redrawn on the * next event loop */ void addDamageRect (const CompRect &); /** * Causes the window to be redrawn on the next * event loop */ void addDamage (bool force = false); /** * Returns true if this window will be redrawn or * partially redrawn on the next event loop */ bool damaged (); /** * Sets screen redraw hints for "damaged" areas * as stated by XDamageNotifyEvent * * @param de An XDamageNotifyEvent to be used to * calculate areas to redraw on the next event loop */ void processDamage (XDamageNotifyEvent *de); void updateOpacity (); void updateBrightness (); void updateSaturation (); /** * Returns the window opacity */ unsigned short opacity (); /** * Returns the window brightness */ unsigned short brightness (); /** * Returns the window saturation */ unsigned short saturation (); /** * A function to call when a new pixmap is ready to * be bound just before the old one is released */ void setNewPixmapReadyCallback (const boost::function &cb); WRAPABLE_HND (0, CompositeWindowInterface, bool, damageRect, bool, const CompRect &); friend class PrivateCompositeWindow; friend class CompositeScreen; private: PrivateCompositeWindow *priv; }; #endif compiz-0.9.11+14.04.20140409/plugins/imgjpeg/0000755000015301777760000000000012321344021020577 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/imgjpeg/imgjpeg.xml.in0000644000015301777760000000124612321343002023351 0ustar pbusernogroup00000000000000 <_short>JPEG <_long>JPEG image format plugin Image Loading imageext:jpeg imageext:jpg imagemime:image/jpeg composite opengl compiz-0.9.11+14.04.20140409/plugins/imgjpeg/CMakeLists.txt0000644000015301777760000000030112321343002023327 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) include (FindJPEG) if (JPEG_FOUND) compiz_plugin (imgjpeg LIBRARIES ${JPEG_LIBRARIES} INCDIRS ${JPEG_INCLUDE_DIR}) endif (JPEG_FOUND) compiz-0.9.11+14.04.20140409/plugins/imgjpeg/src/0000755000015301777760000000000012321344021021366 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/imgjpeg/src/imgjpeg.cpp0000644000015301777760000001724312321343002023521 0ustar pbusernogroup00000000000000/* * jpeg.cpp * based on: * beryl-plugins::jpeg.c - adds JPEG image support to beryl. * Copyright: (C) 2006 Nicholas Thomas * Danny Baumann (JPEG writing, option stuff) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "imgjpeg.h" COMPIZ_PLUGIN_20090315 (imgjpeg, JpegPluginVTable) static bool rgbToBGRA (const JSAMPLE *source, void *&data, CompSize &size, int alpha) { int height = size.height (); int width = size.width (); char *dest = (char *) malloc ((unsigned)(height * width * 4)); if (!dest) return false; data = dest; int pos; for (int h = 0; h < height; ++h) { for (int w = 0; w < width; ++w) { pos = h * width + w; #if __BYTE_ORDER == __BIG_ENDIAN dest[(pos * 4) + 3] = source[(pos * 3) + 2]; /* blue */ dest[(pos * 4) + 2] = source[(pos * 3) + 1]; /* green */ dest[(pos * 4) + 1] = source[(pos * 3) + 0]; /* red */ dest[(pos * 4) + 0] = alpha; #else dest[(pos * 4) + 0] = (char)source[(pos * 3) + 2]; /* blue */ dest[(pos * 4) + 1] = (char)source[(pos * 3) + 1]; /* green */ dest[(pos * 4) + 2] = (char)source[(pos * 3) + 0]; /* red */ dest[(pos * 4) + 3] = alpha; #endif } } return true; } static bool rgbaToRGB (unsigned char *source, JSAMPLE **dest, CompSize &size, int stride) { int height = size.height (); int width = size.width (); JSAMPLE *d; d = (JSAMPLE *) malloc ((unsigned)height * (unsigned)width * 3 * sizeof (JSAMPLE)); if (!d) return false; *dest = d; int ps = stride / width; /* pixel size */ int pos; for (int h = 0; h < height; ++h) { for (int w = 0; w < width; ++w) { pos = h * width + w; #if __BYTE_ORDER == __BIG_ENDIAN d[(pos * 3) + 0] = source[(pos * ps) + 3]; /* red */ d[(pos * 3) + 1] = source[(pos * ps) + 2]; /* green */ d[(pos * 3) + 2] = source[(pos * ps) + 1]; /* blue */ #else d[(pos * 3) + 0] = source[(pos * ps) + 0]; /* red */ d[(pos * 3) + 1] = source[(pos * ps) + 1]; /* green */ d[(pos * 3) + 2] = source[(pos * ps) + 2]; /* blue */ #endif } } return true; } static void jpegErrorExit (j_common_ptr cinfo) { char buffer[JMSG_LENGTH_MAX]; struct jpegErrorMgr *err = (struct jpegErrorMgr *) cinfo->err; /* Format the message */ (*cinfo->err->format_message) (cinfo, buffer); printf ("%s\n", buffer); /* Return control to the setjmp point */ longjmp (err->setjmp_buffer, 1); } bool JpegScreen::readJPEG (FILE *file, CompSize &size, void *&data) { if (!file) return false; struct jpeg_decompress_struct cinfo; struct jpegErrorMgr jerr; cinfo.err = jpeg_std_error (&jerr.pub); jerr.pub.error_exit = jpegErrorExit; if (setjmp (jerr.setjmp_buffer)) { /* this is called on decompression errors */ jpeg_destroy_decompress (&cinfo); return false; } jpeg_create_decompress (&cinfo); jpeg_stdio_src (&cinfo, file); jpeg_read_header (&cinfo, true); cinfo.out_color_space = JCS_RGB; jpeg_start_decompress (&cinfo); size.setHeight ((int)cinfo.output_height); size.setWidth ((int)cinfo.output_width); JSAMPLE *buf = (JSAMPLE *) calloc (cinfo.output_height * cinfo.output_width * (unsigned)cinfo.output_components, sizeof (JSAMPLE)); if (!buf) { jpeg_finish_decompress (&cinfo); jpeg_destroy_decompress (&cinfo); return false; } JSAMPROW *rows = (JSAMPROW *) malloc (cinfo.output_height * sizeof (JSAMPROW)); if (!rows) { free (buf); jpeg_finish_decompress (&cinfo); jpeg_destroy_decompress (&cinfo); return false; } for (unsigned int i = 0; i < cinfo.output_height; ++i) rows[i] = &buf[i * cinfo.output_width * (unsigned)cinfo.output_components]; while (cinfo.output_scanline < cinfo.output_height) jpeg_read_scanlines (&cinfo, &rows[cinfo.output_scanline], cinfo.output_height - cinfo.output_scanline); jpeg_finish_decompress (&cinfo); jpeg_destroy_decompress (&cinfo); /* convert the rgb data into BGRA format */ bool result = rgbToBGRA (buf, data, size, 255); free (rows); free (buf); return result; } bool JpegScreen::writeJPEG (unsigned char *buffer, FILE *file, CompSize &size, int stride) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; JSAMPROW row_pointer[1]; JSAMPLE *data; /* convert the rgb data into BGRA format */ if (!rgbaToRGB (buffer, &data, size, stride)) return false; cinfo.err = jpeg_std_error (&jerr); jpeg_create_compress (&cinfo); jpeg_stdio_dest (&cinfo, file); cinfo.image_width = (unsigned) size.width (); cinfo.image_height = (unsigned) size.height (); cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; jpeg_set_defaults (&cinfo); jpeg_set_quality (&cinfo, optionGetQuality (), true); jpeg_start_compress (&cinfo, true); while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = &data[(cinfo.image_height - cinfo.next_scanline - 1) * (unsigned) size.width () * 3]; jpeg_write_scanlines (&cinfo, row_pointer, 1); } jpeg_finish_compress (&cinfo); jpeg_destroy_compress (&cinfo); free (data); return true; } CompString JpegScreen::fileNameWithExtension (CompString &path) { unsigned int len = path.length (); if ((len > 5 && path.substr (len - 5, 5) == ".jpeg") || (len > 4 && path.substr (len - 4, 4) == ".jpg")) return path; return path + ".jpeg"; } bool JpegScreen::imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data) { bool status = false; CompString fileName = fileNameWithExtension (path); if (format == "jpeg" || format == "jpg" || !(status = screen->imageToFile (path, format, size, stride, data))) { FILE *file = fopen (fileName.c_str (), "wb"); if (file) { status = writeJPEG ((unsigned char *) data, file, size, stride); fclose (file); } } return status; } bool JpegScreen::fileToImage (CompString &name, CompSize &size, int &stride, void *&data) { bool status = false; CompString fileName = fileNameWithExtension (name); FILE *file = fopen (fileName.c_str (), "rb"); if (file) { status = readJPEG (file, size, data); fclose (file); } if (status) { stride = size.width () * 4; return true; } /* Isn't a JPEG - pass to the next in the chain. */ return screen->fileToImage (name, size, stride, data); } JpegScreen::JpegScreen (CompScreen *screen) : PluginClassHandler (screen) { ScreenInterface::setHandler (screen, true); } bool JpegPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/imgjpeg/src/imgjpeg.h0000644000015301777760000000451312321343002023162 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include #include "imgjpeg_options.h" struct jpegErrorMgr { struct jpeg_error_mgr pub; /* "public" fields */ jmp_buf setjmp_buffer; /* for return to caller */ }; class JpegScreen : public ScreenInterface, public PluginClassHandler, public ImgjpegOptions { public: JpegScreen (CompScreen *screen); bool fileToImage (CompString &path, CompSize &size, int &stride, void *&data); bool imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data); private: CompString fileNameWithExtension (CompString &path); bool readJPEG (FILE *file, CompSize &size, void *&data); bool writeJPEG (unsigned char *buffer, FILE *file, CompSize &size, int stride); }; class JpegPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/mag/0000755000015301777760000000000012321344021017721 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/mag/images/0000755000015301777760000000000012321344021021166 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/mag/images/Oxygen/0000755000015301777760000000000012321344021022437 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/mag/images/Oxygen/image.svg0000644000015301777760000044704212321343002024253 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/plugins/mag/images/Oxygen/mask.png0000644000015301777760000000626712321343002024111 0ustar pbusernogroup00000000000000‰PNG  IHDRààJ N§ÙPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ö±GòtRNS  !"#$%&'()+,-./012345789:;<=>?@ABCDEFGHIJKMNOPQSTUVWXYZ[\^_`acdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°²³´¶·¸º»¼½¾¿ÀÁÂÃÄÅÆÈÉÊËÍÎÏÐÑÒÓÔÕÖ×ÙÚÛÜÝÞßàáâäåæçèéêëìíîïðñòóôõö÷øùúûüýþE] ›IDATíÁ‹£ÏõÇñ×ïü\:œs„êÐM1fñ‰ÊJ"Y•lÝ)“.´µÊ¨ÆŠI[º¬ë.µ¨ØZ—%FEÑÝrŠd:Éqš™sðû÷_°Zµ’Û¹ü.ßïçý|<€è)<¨KïïvíÐZGÇ.™ùÇ¿<ûÒ[ë6¥ìséê÷Ë—/üëC·;éð„O­zÿ`òÃ/o¶}Øúú£SÎï["ÄH¢lüëê¬!ÖÏ¿¶_RˆoWeRýÔ„Þ !Â:zøk’ªyc» ‘Ôcú{–³ú S:þUË òë: ‘QøÃ§S–au‹G•ð@µeEÍ#§6ò«Õk-‹6Ln+äOɵ•–e›§• ùÑ~Ê&Ë­³r¯ãÌ-–#Ûïÿ†[Gü¶Ör(5»‡;íïÙa9V7÷p!7£«,þsMs!ú,³<)?Qȶ¶w¥-æt²)1²Òòjó•Í„¬)[jy÷F!;šÝœ²¨»»PȂÖZD¼Ù]ȸÓ>²ÈØrYÍoµHùCk!ƒŽ\n³²‡1gýÛ"gëEBf´¼Ã"iv±.³ˆ*ï$4Ùo[dUôš¨g…Eئã…&9n“EZÍ™B «±ˆK],4ÚE)‹¾ÉB#M´X¸«@h„Ä,‹‰y-…†»Ýbãñ¤ÐP“-FîhŒÅÊMBƒœ¶x¹Bh€AÛ,fêÎêí¨-v¶Ÿ,ÔS·J‹¡-ý„z9d­ÅRUw¡ŠVXLýó aßþd±5¿@Ø—Ñc“„}èUc1–(ìUñÛkëK…½™c1· @سK,ö®ö¨wÅ^z°%«,vvoŽáï awNµ@Œv£p¢ª½°«)Œû„]t«µ`Ô-|Ý| ÈkIag#,(— ;)®° Tw¾êV Ìlá+zí°Ðœ(|é NyRøÂ` ÐùÂY€Ê „Ïô· -|æo¤7§úX † ŸzÜõ²ð‰uª¡‚4Û‚µDP×”…k ð; ØB¹×n›…¬‡¼kA›.ï–YÐÞ/oÝ-p'É·›,pɵ‚u¸-Eòlïyö o+ÚbÁK*¿~d\#¿š+åVÛ´yÐM^i.üX^Ýn.Ì•Wo™ ò©ƒ9Q&ŸÎ1'ÆË§û̉'åÓ»æDuRu27úÉ£‘æÆµòè!sãYy´ÎÜØÚLþ”˜#ÝäÏQæÈéòç*>1Ò5IøTóµ¤êý…ÿkAš*|¦å -í…ÏM°Í¾ÐºÒ‚³µTø¿‹,8?¾”xÑóv á+ÊR–ÁÂN~mA™#쬸ÂRÝQøšË…]Ì·`¼švѵÖQ×OØ-÷»³ß* †vÂnõ©µ¤‡{0Î0UØ£¹{‹“µYm1·á`a/úÔZ¬¥‡{5Îbmª°s-Æ'…}h³ÚbkÃÁÂ>õ©µ˜JêaDÚâiœP/c-–¦õt½ÅÐ=B½Ýa±óç¡Þ ±˜YÔRh€ó-V^+¤h™ÅÈêR¡(·ØXßYh°ÃVYLT– pÐ+ kº R¼ÐbàõB#µxÌ"oQ‰ÐhwXÄÍm)4Å$‹´; „¦¹8eÑ5Ih²3k,¢R£… 8fEÒÆ¡BF´{Â"è¹C„L¿Ý"&=%)dNß5)2ªÍ<‹¥B¦]Zk‘šT dÞwÞ±H¨ dEÑŒ–wu÷¶²åÛ‹-Ï^é'dÓyë-6]Z dWÉoR–/– ÙW¶ÄòbÅñBN$.¬´œûøªfB®´™¸Ñrêã„\j=¡Âræ_7¶r­å˜5–~V,äC³ Ê-ëÖ]V(äKÁðW-«Vj.äÕÀßo¶,©{ZRÈ»Vç>“²Œ«{aôþBDt¼ê ˨w&)DJ¯[>° ©ºóh!z’n|~›5Q꥛‡4¢ªpð/_Üa”~å–S‹…¨+:}yʨîÍÛÎh+ÄEɱ#§=¾r›ÕCjÕS3/Ð^ˆŸd—SÆß½¨b›íÖŽ K¸zX÷æBܵhDÏcO>òò‰Ó~5éÊQ#¾ÿ½²Îî'@pþ æ?×"•{IEND®B`‚compiz-0.9.11+14.04.20140409/plugins/mag/images/Oxygen/overlay.png0000644000015301777760000023737112321343002024641 0ustar pbusernogroup00000000000000‰PNG  IHDRàà}Ô¾•>ÀIDATxÚì}¸$Gunu÷ä¹ysv’¢…IÛ<Û°Â`óˆ’I„¶ñC‰(ƒ$À`„ÆÏ^ÛÄçD0$’€UÚÕ*ìjWZmºùÞ™éP¯Nõ9Õ§kºçÞ] !ÉUûõvßžžÎSýÿIž”R¸æšk®¹æšknóÝ-pÍ5×\s͵¿UÜ-pÍnžjÖ±¤“`\s͵ÿ®}­ëÿÀÚ/w7Kaëáà°h×\sͰktõ–±Î[æ÷›ð.c\Æw0»æškûæ$èG.ØU¯d¾Üåå€òR`[´¼Üu¢è’(»æšk€]ûenЮ·bÅ /I=!ˆÎí}[ëËγ <åì쬴@¶lyк ìÙ5×\{H÷å®zX‚îRl6¸ d}Y¬¸ìÙËô]¾l­[ŠËÎÍq}næ´<77—0àµx9€ÝÇ »æšk€];–ë-Áj½U«V ÅÉ·AVM>ýÝh4ô6xqî[\ ÈZŽýZ@¬ÿîõz’}FË _æà1[Sª~½^÷ x0û•J%€å£>ºñ¢³^|ìæÍ›Ži6›ãÕj}¨Z­´+•j»í Riß ü AËü¦çùMß÷Ôä7<áU¤½8Ne’,&RMjÇñ¬‹ãh–£0š¢p¾§æa¯7733sàæ›oºíÓŸþ?;Ã0Œ`lÕ²[e㄀栜,ÈŒ]sÍ5À®•‚n‘œl.€..«þÁ¶ ÐÈê¿O?ýôu§<õW³fõšãFGGŽi¶Ú›õúúj­²Zâð³È.\´^²¿q™¿{j¹öÂ{;Îîù…ùSS“·ß½ëî_þò—oùÁ®Ÿ°PVséĞô°°/»æšk€ÿ›ƒ®(b·0­]»ÖW £AW±GŸ1Ü€Ø-‚p€  Ø/xá ×>ïwN}úÄŠ‰Ç¶ÛíÍzcCM-°ØBP,X¯dÛå|Wæwpi9P+Ö<Õíuw+p¾{nnî®={öÜtõ'ÿæ{7Þxã‚/€nŒ lzqq‘À˜³äd¹`ì€Ø5×\süÈg»œå6˵—ƒmÁ7xö³Ÿ½òÌõì 6¤(€úÃa¸Þ2€¹ðb @x /qlýžÊlµú;ZX\¸mzzú†;v|÷ª+¯ø¯;wvˆûYwdñR€ìÀØ5×\süH]bºhÏ%Yƒ,./€næ'Ÿ|òè+^ñÊçuÔÑÏ}‚ÚnSþX^1¾yÅàçåOzyLx©W'EÊ<)^ Ĩٟٻ+E’ÈÞ¶©ÉC?Ù¶mÛw.»ìÒë[î «)"PF0ŽK™@Y±b×\sÍðÃx9øúºqk¦Kò2l­VË.,oÚ´©ýú7¼áÙjþ¬Ñѱ'4ÍG©Cå¬6Àælëá¬_îkã-ಠcOZåÞcµ'ñâÂü­‡&ýøç?ûÙ7/¹ä⟨O"dÄ‚r<ŒÇŠ]sÍ5ÀàÍIÌ乬€7 §)Å`dºÝJ³Ùª¿û¢‹žܱÇ6<2üdß÷k…ðêYÀ«…}{õ’ìÓó 8qx.ë•À|åçÀYbYÛjU"}Èž¬î¹"Ç“ßùþußßré%ߌYq„Ëñ2cÄ®¹æšà‡ð9SäL¥€À€.2Ý ,#肼\¹à‚wüꓟò”³&&&ž¥Ö{´»9ó[öú6‡qXï°¤àå*ƲŒÊbÁš½.wçùm0Û»±ÓšN·»{ß¾}×~þsŸý‡-[¶Ü­]È9îv»!âx Vì€Ø5×\sü^ŸÛvíZs…±ÝêÙ/yÉ1/xÁ Íš5Ï­×êëúm´Ó!= ”³-¥F[o€¡×ë§¼yó–Á~‹lÁ^1æö'e?³µN@Ê¥oÀµ˜›mÌr"sk0ççço¹ûî»ÿýCuùg·nÝ:£V0f@/ÁŒ»æšk€dÐ-^ÕyhÛ ,¶[ ‚ L÷ä“?ö†7¾ñì 6>¿Ùjïy´°5€ë‰~¼õR e§cƒ®ç±S´@Õ˦WÄbÐÊ%h³,á«… /¨ÛRCž,=ÉD$²˜ŽK‹ECK4+ÎNœ¸ff¦´mÛ¶/¼ã‚ó¿ÒS ˜±@‰z 0.´; vÍ5×?HÀKö] x+êoÞ*²ÝÚ[ßú¶§<óYÏzýÈÈÈS|Ï«ö(þék}YZ€ìe ZÀh‹lÃe• ½>là-õÉÂý~—²0¢Ò-ŠØì ‰ZÚ’´Ìï«è3io™2ãìs)¢8š>pàà7®þä'?òå/ÿÇdÅ!bn+Ž»æšk€ð-^²ïàð"ã­ãà}ç;ÿì×N9婯:ÑKÑ2'§dÖÏ­±çúyÙÙ–MØóúÐÒóúá3¾L¶Æ)Ǿ½¾{ÑÂ&öÇïæ8M)%N‰H3cÚ\¾l]¡Ý^ú8;/i¦4Š&IxðàÁonÙ²åÊ-[þñuݽ ޱ“¦]sÍ5Àë-^‹ñ‚3•Þw¿û¢ß~âŸtn«Õ|õÕŸÜÆ€8t@ìšk®9~—ÛxQ^ίïûu5¯½ç½ï;í„NxU³ÙÜl¡ïy(3å‹ šb3ÿž_®p“wtºä¾ræ<ó•óԘĜš„ˆ¥ŠÜ²ÔàKÌæfÿ^ ò^¦çYµgø6cÚl„‘z;qœôOžØ&}Ì–À¸[ë¤Eã¥è—¦Õñ’é™™~íšk®¼âŠÿŒ€ìÅj‹Ãb®¹æšàÁàkg¬ÒáDjÒl—¤f¼•J¥þÞ÷½ï÷;îø—×ëõõ™m6£>¦ëçpŸÜÜ' {9&ÀƒÕ¾¤ûÌVÌ4[É@ ÖëL’X³MuM äb=‡)ó²Ò^p¤Q;‰ãHV+•ôl}~~"—B2½2¨ë‚@M¾:o$Â÷™\ò{—^­–p®j’‰Ìƒr0ùñY8’—ÝÐ2¶¥iNagfgþÝï|çª÷¼ç²ëw„#Ño'æi/…b×\sÍp9ðÒ\@X±bE……à‰€·Õj5ßû¾÷¿ró¦M/­Öj+màõ=ÏbÀ~Ζkدt‹Ø×å s½ž»î"KöHÀšÈ"£$v _éözrjjª759Í-@ÕÀP¤u…!÷´>_+P (f ön…ƒÈ%%aIJ¥3%Ü“ Ac5Ó¥¡fÄP{È«ŽŽªûYMo¿Ö^Ÿ^“¯Á€Ùc÷$gOÙ1€(\°à$É%ÿÈ3ÙâuR0µ˜1`ëscZ¸õG?úá_ÿÅ_üù7ˆ{#.Jîádi×\sͰ¼6ëÍÙyQn®TUàUì­®æõ÷¿ÿƒg?î„ǽN1À ›ÚR3gÀ$×f€j0Α!k†«X"0Ì@3F’rE*%“<œ¦bqGo&Ýj€’rnv.>8y(š™žìOžb’Šº°*PyF™aT¿\ko#2Ð5ô—KÞܶL¡U$O«sSšÄê$¤Àˆv«åùãc¶•^³fÜjªèë}ÞÃÌ_pý)~KÃæiÊÎ9ïÀÅYqžcH“À‚±o ˆÅÂÂÂö/å+_yŇ!ËV·ˆmiÚÉÒ®¹æø¿÷o~9r3^µl€÷å/ÿŸ'œ~úÙj·Ãåa{ÙfÀ>‹ëåNX¬¬Œ¶\/ÛJd!?ì 8šáÆ"Š`ІôúÉC‡z{î½·«Xm ƒÕªµz½!Q¢Í<‘Ñ™IºRôƒS™§qþ¦š{+rÐëåeuš|¼¾Ü„Œöß {]uàhxxH¬[·®¶bÅŠªfÈÈÊ$½ OæÀ^Kì10äY/a¬Í€Î°&²Hš–}@Œ÷&Þ`ÿ×ÿò]ïºäæ›o>@¬ÞŸ.‚p;YÚ5×;Ök³^E^4ð„Œ—俯† G/¾øâ V¯Yó|d…ÅV¹sgÀÆó8gçMmÀžÅ–¹´œÊÎÐ3§lH€mŒ€ L7Ñ W®b¶{î½'œ™•ŠRV@U×Ô«8±@×r°²o¶zy–Ëœ¤ co-¯(YÈ¢|50ã„<·a]’^DØj5ÅÊU+++ÆÇƒZ­®8†¬@Y;Ÿ¹šTôÚÁÎmÀ•Å–œØ€ ˜ïÃÜC@Ö(š½å–[?öæ7¿éÕŸ] ˆ¹¸T–v ìšk€ÿÛ±^ðnfrs•äf^`½_réüãÿ¸R©Œe¡D^Î*]—ÉÉ™çr²>ý žË)‹#y™ãm4€‚¤ ¶ÙH0°ù…ùhÏž{ºJâ8©UkÕz‚öÐ8IY1J‚À›Ù;s÷ÃÄûf]^@r ´×qYšÇöX6¬š<¨泤#že‡{˜F3(ñÈN  œ$a³ÕLÖ¯[W ª•ŠPNËÕäN’½ydz8NmÇÒ^AáPV\°Lò×Àî£w8®Ÿ_X¸í‹_øÂ_~êSŸ¼Aê/Ç>ìØ°k®9þïÃzÁÉŠy7WInF[oó¬³^|ü‹_üâwµ‡†Nôrá>~ξk³XÎrSFŒÀÒ³ òrê ¬·Êø˜êщ傴 Àqààd÷Î;ïXP,ׯ7šm܉öÎÔ38Û„F©ô‹¬R;;‘g2:zy9Û5 DÞ†ËngÆûÙtŽi#èÅIœ³Õrù;aL_ƒÇ˜0±qÖÂë Ã^·Z©FG}t}åÊ•jdêªfÆÖ¥Õí$•žk‡4ŒAæ^Ï}6bΜ¹ül¶Í¶í}ûöõ /¸t×®]SŒ Ù‡vÍ5ÀxÖK(§Áw||¼‚¬·ŠxëÀz0_vÙ{Î[»ní U_%0Ê®—“‘ÝÖ0EÏ’™ ôÒÏÀÁHË««KìIËËŠé†0µHLÏÌE;wîìNMO Es› «ü„… †ÚiîXŒ5öMº¾ŸÉ¼‘ƒk÷2û2Iâ©ÓTÊÔi‘˜…ÒàÜÎl¼Áqðέ(Äq6›xãÆµ±ÑQ¿‚ÌBŸ‹¹†÷3Œ¢ô4S‡µì’dR,?³uÒæLâÖ²÷ôÖ­[¯:ï¼·diõ¾æ²t(ʽ¥…b×\süH’œm[/g½¾Í?ÿ‹w=ÿÉOzÒÛÔê‰<3`Ÿ/3Yš‚ƒ¢ ÄÁ‹7‘ ½—a9Lv³ÿ!T*M™Ö6 d‰P¹õñ)øø©×p‘–µ Èf6ç,u¥ÍvE¤>ï¨sí¨5jîw[ï¨ó‡ù"xù2Úë!ø{ˆ=0”€ð¥tH!¥¯Îµ¢@¬­>S“l'é¼ ÏÁ–¯3{uæÍƒs™öèŽÑá '&­“9ÀCF¯cŒýìúÕãv»•lX¿¡2ÔnyÕjM;¦ûAL7=^”1ñ„Ç ç¸Ÿ-—;jÁ¿…ù…[·lÙòç[¶üã6‹Ȅ‰ Ûœ§´k®9~DIξÅz©P‚a½ÃÃÃC¾âÊKW¬˜ø Îd3P¢x=c¶LÆåñºŠ¾Ÿe…J´=2Ñl·§&u>rß¾û:;wîêEqÒ¬Tª5Åâ2ÐISP ÊnšÐ"ºV ­`…0e¤¶™ª•©j5˜¬Vª3ê>,*PZTàU€$LDñžj0ÐöT)™úÚ‡’kÁÂÒ*¬‡÷NªkõãlGQÜV«‡ †ùÚj ¯R{j-–2a%8I9F@N×`K xf°¤J‚2ܙĽU«W{Ö­U—]õz=g> }¥¶viIÓÈÂ3TD°–…ŽZcÊÍ$émÛvëGþä-oùŒú¨c±á"YÚ°k®9~DHÎÁèè(0^’œ|ëÄzÏ8óÌǼìe/»¼V«¯ç@KL×xéZ Ø3ìÓÏ0±LÅ`S d¶RèÔ!T4R¬·Ûí&Û¶oŸÙ·o¿×V€ãShŲ¦¶×Tf ª)»ƒý¦Ù¤R™Y<ó$ÎR@úÝJÅW [™ªÕª“zc²^¯ÍªïHœ4ÀÂ2¯  Å9ã¾D6Ë´™ìŒ €æ•L¸”5ð)ªÀyDíš8‘kԑ֪럀zÊ&ÎW&æ»é¥öreMò:‡jÎŒaEaohh(yô£6×–W«W³&ž±6¤òwœ•=´í½ÆÅØä¥&ÏØðÔÔÔ÷þä-rÁÞ½÷N#î–°a'I»æšà‡·äLŽV$9C¾fŒém€£ÕE]|öI'ŸôfßóëÜÖËm¹”z6gŽJÚ¦¨Á1õj&ÖKÎU<•"°ªÔ¾ŠÅ…ÅxÛöÛæææª ô ³r{'^‚m <|óÀ›Å à o¦^«Ý£˜ÝþV³9©@wÀUmO€«ÁekÉ&a/SËiÞç<+fÌŒpA樰B&ÆN x%²`Xöx LF¤i]”: A2”ŠåUI,ר=¬Çuµû!²!C†ï¤Û‡zn$k™0™™1Þ?¸§êRãZ­nÞ´©><ÜöjÕšþ óú{ðÀ¼¼[f¶°~s Ë½¾a}Øëíû—ù—ó>ó™¿ÛªÎwA¸ˆ ;-×\sü°—œ«–äÜÉùCúð¥Ïö¬¸]›ó°¡l]êÍìù^?cRØ9k».0^ ‹ ñ¶m·uck¨®8ˆ‘¹‘³#€8™ Ò4Bâ #k’]$•jå`£^ß3<ÔÞÓhÔçÔöAW0¦«”¯OÚêsêØqÉÍ’ÉÏ‚02­O8;cà AçfsZfLX"Kƈ ¨;VsO ¢<\ç÷ÂpLm~œºV÷`5å¶Ž#úNDž‚'ÉøLÍ ®àG]{xÔÆ •ñ±Qm'& öÌsŒÐk:MI@ÌA™;›eÌåêŒ CÕ­Û¶}ìmoýÓÏ w,6ì$i×\sü°ß2ɹÆ$çÖé§Ÿñ˜—¾ô¥Tìg]–Â7¾œûÖç:n×àA“beɳòôƒÔîAzLXOŽjð\5¨“×6®•+/;‹>/pžÄcjjêú·¾õOÏß»w»Ë‘¤»æšà‡”ä €¯ê̪¶ä àûî‹.zɉ'žô&(¦ %²3W1g wñ0„(K !tç @&˜l€·× ÅÜìlxË­Ûx[P'˜täzÿŠ1瘮Ž[ °Ÿ‡çuêõú®V«±[1Ýj[È’ è’-Ø­Åx9ðf,­ŸUf"`αZª´M|¹cÑ„Ø2±‘±¹,Mß!Œ2µä•šý Ö  sâ^¯§9Ž¥0>Þó‚õ`SO·g5r*+'ûaÃ0& Œxl|̇Œ[iSzÏèÈ–M¿'dü®kœ+é(³íH¾VŒþÀç?÷Ù·æ3ŸÙZ†c‘Ï¢å쮹æø!¾ÁÈȈ_L#YGæÛ¹üò¿ºl||üY”m)•–³lV¹¿1|HhÍdfr´Jea_§ŠLuÊDƒÔj_Xœþó­“àÝ«XTƒdP‰±º$1ÓÕ™›ªFd¼•Õ’ÚfßP»yÛÈÈðݸjÒö\º$Y“m×#Ù_’›½¼“VÊ‚ca{fÖÈådNÑï„Åei8†o1ã„IÓ ‚Q‚“i’¦™D-+.b-M# dÂ"a Æj [jÇ+@}¢:©Uéw#ò†©\ˆöb©OÁËyO§¶w(þ”tŽ{ô£ëí¡!lÄ”­ NVg'C §ð0ÉR]ûoÑzÉ×ir¸}ûö¿í­úwêœæ @˜³a;Ÿ´a×\süK_ ,Áðð°v´‚¸^uuÕB‚Æi§öØ—ýÁ~¨V­®¡ŒN9G+&;›ìUh 6¡=&cTZ€¤é4~5fÑí…rÇm·Íœœ z›/ÉÌàL€ vF²ïò8ca½V½cdxø¶v»5 ²2L |=b¼Èv=ÃÈ=ÃØ=&/Àzô™0›¼¢@â6$ 'žÌ¦Øò³Å~esàNÈ.Ì€9ÈB§UŽr`Ì™˜q˜–M4¶^c/cá§ž‰ã(J6©gö+ TMŽ^a/uˆ#'€'…€€ÓZ&íV3Ú´iS­Ñhh•‚ìÃ1Iå¤nˆ|øQŸ'´å)MÌH¢ž™ž¹þOþä-ç$­6ZJ’vva×\süK_Ÿ˜ïÐÐP•ì½¾M`¾çœsî¯>ïÔç}@`“l´©´œÉÌEv_JìO ËA%·å2#°)›÷Þw_wçÎ]Q­ž/Ùa¿³íV0W±¶-z>÷¨>Øj5·Žì¬×ë=&MËÌs7 t X x=šÓ}²–i•¤w€IÉ9 &ù˜Ì¸øÅÄÞ†°± CyC”ž ðZ2v¿Ǚ²e/V˜¦[†ÂŒÃ2zNsyZ0„{+ö;¡îÒSÔs|¼:D3b %N“¡ )7á_ô,ÔƒŠW¯Z)Ö¬^Ô0†óh6¬AÜØ„3{on¹(T‰@¬tºÝ]ïz×_œ»õç?ß‹ \3ì@Ø5×ÿRÁ·ÂÁË€ù¶Þþöóž÷ô§?ýÏ(T „<ŸKÎ~.Æ×gñ¼¹<ÉAšæ± £Ô Juº ñÍ·Ü:•aºÙ5ð’7s•À¥ã,|då;G†‡¶)¶{ V«Id¼x‘ñ b¼xΓ“=\WáÌ—Ý3ÀøÜ¹ãšÄm¸÷²‡Y`+¬Ž>)c`kY6ð’,m ۈ΃Ôj漕p/jtØJÐIK'ü&L1bã†zBO¨Tª¿¢nÌD Ü¡aÅĪ)ñ9k‘>ð½hýúõ,yÕZÕ˜ (­¥ÔU«’ŒáZlá7ÇŠs…3$ ìÂW]uÕë¾þõ¯Ý©¶"»0/ìP–=˰k®9þ…ƒo@ÌWu–5t¶‚êEMßw¿û¢—žpâ‰o‚ÒùìUy ÚfÀ”ÂÐ8]iÖ›ÚfeJËt" ÕQË;n¿cnrz²Y6bÌž$Ð1ËTæAÆ›²VÃxeµZ¹Suà7(Ö; ¶]šlÐeàk@í¼Än=dÁU/Kæl¯çy}Iœ‰ KƹGs̪'òñ¿²ŒûéI–tRÀšvœDäcŠcaÜíÆ1cI¡L¾0WÀ륶ážâN§ã/..ŠÁW­ÖŸ®îñÑZšFYZKÓÈjé¹RÒ“4·tEÔkµhãQ+ÍFC¿7ð~‚}9N¨ØƒÍ€f–‡t’UJ WÌþÃ?üÛÿiË–­È„-Ž»æšà_ ø¶Ûí2_p¶ðmÁô^þ†c6oþÆYöªbœz2û9¦T†t]ÅzÝ®8xèPçÖ[o™µÂ[´üª¶ÕŽUµª)‹—^µ£JÜ=:2üã¡¡ö!Åx¶°q¤"ðÅ¿é:|^´×ÒýÜ èz l ø’ìÌ“}ðÜ\ŽFæiwæK²Ú@ЖnÇX0¦œX̘¼§€C.Ug~[ƆL ?ô9‚dMÞÔ8I`¿Àh‰ ÊØ0LÄêÛi4šÿCÔʸ×c@¬M iŽŸÉÒêØáúµk!áK œÆ‹KÌê•fçâ ïg]XæªF1ÏêÎW¯ùê…¹êªÿB&ÌA¸'Ê“v8vÍ5Àøš_øš" $9«Í‡®¸òÊÿµfÍšSy±w’–³|ÌyœÊÍh[Ÿ^ЂՀµðvº=yã7ê…q»V«6xÑó×°"Q ªA……8 °÷·8<<´W¯àr3/y6{̦ëðZò2fÈLe_³Ž/c¾6ûå9=‘%ß0aG±®`ŸbÀ)ºÏޤ®Ã|_ Ûý¾¾hÚ#'-þ‰O¼ottôi¼À|Ærý¬¤ « Ci©|_‘äÜíuÅÌÌlôó­[g†‡‡ÇUÇêIŒ!…ï“Ô\C6«Y³ç“WóÁ¡vó‡c££»0”Hƒ/|怱äT¥¾ë“1s¨ò¹ÜÌ—IÐö¹Ïo#{æ^Ó•ý"$"£™‘½^ô§¡4@ @ ã` `åàîcÁÜ Já“ “"¹Á^ß>–àCá-(ØŒ‹€Ø0aÄ€±š‚n·×¬Tk¿®žÏÓÔ®*Èž±xFO«Ä[᣷4 ¾Ô0¡wôÑ«£#£^úxpÃ(Kgiœ®l',À”œ„˜<Åo¹õÖ½ã‚óÿ¾„‰ G„]sÍðƒ¾ ß¡ááÑ+¯¼ê£­Vó±¯FäùYÉ@dÀ”x!ópN8+rà›N6t;]q÷ž=‹T@ ¬76rsÊ^k†ùú(cã9Ì´šõŒîÛ.ÈÍÈz=´õz8¥ú±j„÷ÀÔ.æà‹Ûø Œ5[*]°×p»e(k =‹2€µÂg³Ü9‹dä2‰ZdžÑÚŒ ó˜âà6qÈWŒ¶aà„ƒ±±ó"¸"†I­Ÿ¨×[¿S­ÕNRï‚§=¦6YµXlwT’Ñ‘ádÝÚÕ• REÛºÌÒdbêJ’ %óš–'lå—faJrçÎ][Þòæ?¾’ð¢X:Lɰk®9>bðÕ6_¾àl¥:½Ö¦Í›W]tÑÅS«U7rÉ9—ÏÙ€°°¤çÀx<ƒíÖC‰:D°÷v;yë­·Î*àÖ{€õbŽ JÍi¡÷”=§À®¬~666z}£^tArÆm53Æë!ðrMèú¦äÖ0`/u2 „å|%,°å-‹æÄ.Ëv%E>g´ñŒfNX…,˜¶g™±ŒLÍ·&_€v-Ö€o"2/lC û`NZ N2bI`LÞÒÂ䤵°°À¤ö´©Ùj?_sŽ&æLS‚é2³ ëT¢?Ú°ac¥Õl¤ Vd3 !OÚtÁ³e1/hÀ‚s„Åþý®9÷œ×þoa² óÄ]sÍðý_îpU)ßöºuëV¼ÿýø´Z^“_¯@~ÆLWÄVÈö›¦ L½Ž%2Hª13;nß¶}¡5Ô¥Ð"Ø–2WéÊ9Ę…9æäP»yíÈðнõz]’“U­V3YÀzÕ²]’™dõAÈç6]|-9ºÂ¶±8—.›;_e«$¯|D+“‚0¤¥de`.A—m/x<°ÈgÍ2çEŒŽX±(±siæ fÒ]’<ž9Nk'­Xh̵ˆ ^\\ôÀA ¦ùùùj­Ñ|†zG}½¡“V„@£³™5ªÕ” ¯\1áyÆÐB¸Sº=+æ`¤è<çâ„Ùthrò[¯}Í«ÿ A˜2guD>VØÉÑ®¹æøßF£1ò×ÿÄÕõZm3JøÚaF¦œV.J“í§‡[]¯ÛwïÞ3àÀ!Ñh6ÚÚÃY{/Wл¹†¬7“›¡“«UƒŸŒ^§Î+&¹¥gã\À v^cÜMذ] IÌ·Àîkƒq€ùö`» Z2ŽÅ¯g¬‚¡Àkê“«¹Õ¶“v !›¸aUÛ±‹ê Ð)MfÂÓ]Š4ч¾N  OKJè <IÒà ¥¦ŠbÃ~Å놆G^¢žéÆÔI«gbÂ)?´Hîô ÞÅ‚#¤!†˜pÀþɳš³\rò*² Û |ï½÷~ñMozã,&L™³œMØ5×?ðà«Îèê«?u¥úì$žï¸|)ÌHg·¢<¿ÊÏiMXÝ-A‡¨:Y¹õÆ­êµæ˜èjjßóMLoÕ0YžÆÒ; Xï5ÃCC÷)Ö› ä,ÑÞ«W}×G¥ÙÏp×8Xù©ï’ï¡·/¯À¹ÏŒ<À9ÐÌþ+Ø÷HKö Xaž#KØ{Ùg sž¢CÎ{šËËEà-ʵ(MeÈö“°’ˆ±u ÉB²ûüxsy©Ñ.¬1«¶“ð%'-`Â(K×êÖs[­ös¡âJØiŽi’¤Eê' Ù0¯'ºPw˜±Ž†,jQšKÚΆ•Ï9b€°¼ýöÛÿÏœuær´a×\s|Xà SU1Ê·ùø~ôc»dlt왹0#‹Û Ø$Ù²dûÀ|bÔ óñ~ø£}kÖ¬Õ%íà‘älB‹ªd½úhqµü`tdèúf³)ð¹­r7ÈÍ>e²bשWXb§Ø'=(cÕ„œmÁ΄ !àr}Ù+aÀ¹¬WEl•I¾¼³.`#—pðædfv˜ÄfÀH_{"#\$G'èåáy˜Xal¾Ž01äDiÄ´\€ˆççç}”¤+Š?o{©z€k(“Vå–Î;hU¡fq÷˜ÍG×õFš9 x€ÙÃö|¶3c•±`Øü†Ÿþô¯.¹ø¢Ï«å9‹ Û6a—¬Ã5×_ííŒà[Gðmø~ðòËÏ[»fí Šl¾6 Î'Ú z»U,¶žÖíív;bvv.ÚzÓÍÓ+¨Ô’3†k¿³ÊIb«Yÿáá”õªó$G+‰NYÀzµË`峂>—”a™`÷ÁlKæMdÂ|mû¯í„Å——b¿6ËåL,gô²˜1ؤ@Ö–\:†y—1Y#g[çiÖƒ4o³ òˆœs&@VÇ& `¬óM³ä1aÄÖÐÈ ›ÍÖ³“äë,yG¤ë>KLÞ…<­_·.hµÒÔäK:bòµ«„ñÅßúÖ·þò#¹ê–Ím„]sí!Ð*#ð…8ߦúÒK¶/¾ø’×®Y½æƒ÷›¯wËÁ$gŠ’XN`¾SS“áÎ]wwV¬HÁ>7’3€i…êýz?|ÓÈpû«ŠõvœƒÔ¬@Øx8£g³L››t%#&ÛY¨(DÇgìU0§(“R²Xí{›û>íãø,%_öž—:û¼“÷ÐÆ ˆiª6Q=Ek{a*×C.º_l[‰æ8V ÏPÍÊN†¬{>¬æ?×]\¸it|â÷½ÐþÚgè£$–,@Vß©ìÝ·/^91á ·=ðMÀúÃz[~ìw¤l()ÏyÎsþüàÁS[¶lù‰(㡲™k®¹öHàAõ|áü°Q’ Þ&$Ù8ÿü ÎÚ´iÓØ_&‚Ù¾:DžÎÈ"“ì84é5›ía`ÃYžß,•$ó¤øßº¾ÕjèÆàéL‰5|¡S¦ÎžB{ì V},“¾k³@D”]Á÷$ˈeƒ,:~>:pY¨²ìœ–:ç’ó·>²Ý¢…Ç,dŠî»h øõ­ÐÅÏ´u€p‚¡FzbpªSS<;;{ó¾½÷¾oŪկ®ÕêÇëÄ.^O¿s? ïÈÍ𞜜’¡bÙcc£úµ¥LhÂÒ…áÚgœù¾}û÷¿á×^»M,/v»pãšk®=°Åâ øû¥ W¾í?zÝëŸ{ÒÉ'½ƒFÖAó9_,°›V7B Å÷:¹Æ}ûî[˜›¯‚kª¶÷VS.°I5L]½³Åj5øüèÈðàå ÀKfÂòÑÑJ°z¼1å †ÊR±ÚF( Š+pE‘@_ +© 3Î…%±þxP§, ÛÈ¢|eßYêKaÏ Ækæ:ˆÍòòf¥ýe°<³ÆæÉ£[ Ü‰EÃþ™iRp&sssÑäÁý›8[½'ÏÔµ£{iU-PÐÓУD€y¬ÏìÜœ§Xq²b|ò¦ŽRæ@ØDoK±nžóÚs>¼ï¾}¯¹ñÆ­»Eq’ÞH²w ìškRóBì×·ÁWZƒƒï‹Ï~É)ÏxÆÓ/T]GP HyÆÄì´ÚaŠ˜oš›7ÅŽ¸ûîÝ3s |U§Y…íª |럹^u5ù•4;¦‚Þ×lÔ®V໣Ùl†àp…¡F1ÈÎê|= 5â¬W2{´´.\¼n.gjì{žÍJ+—Kd âl<×I£Ì]ÄxåÇ1àÅϽírˆE÷£HÚöXJ[>.Œ$–,.©'ô79ÉåM©Mž5¦•ê=HZ­V<<<µÛíHÍ{j Õ´0=uèïçæf?5¼Oð^Q,8¼“z ¨C˜"±¸Øñ÷8§U—£ž?Go9ádô‘ /¼ðcëÖ¯ŸP¶”ÕT† ¯:þÖúâÆ½åÀ5×\»øËìHÏ߀/•Ùù9ÏùõǼêU¯ú¨úZcP˜QnŽU|ÊÑ :´¨ÎNÜq瓞 øj-0¨¤9œ±foZýÈ£“¼¹Ýn|Qu°‹`ï[/e¶‚ýª9È9Q2 +‡³I¥Y–TËûpgò~î+²@Ÿcø9h‘”h_ð–`L<.—/džd3fž±ªÈ®˜ˆÌ«[ÈÙ}¹ ™GsѶ¹4“à ͽ³E…% ·¡p$zæ¼¹OkINa<ç4#„-ѾÁa+TMç†Æ4–¼c…½ùùù`vvV{IWkõ'M¼J}·Î½ªa HïðÖN~A´rÕÊŠï¸Þ.«œOÖ‘¯–Ôçõ„ï~Ík^ýj5Ÿ™c/àÀ«(ñgâšk®=‚Ø+’9ø‚·óèèØøW\ñ÷ªX6øbÖ+r¤".Öƒ7Ý|ó¾v{x"¼<íü’Ù{«&]¥H³%|ch¨õm`9hó5…@nàÅ’ˆ÷ ¾¹!Á<žÙgëL½‚íÍ>8ø"ØW-0Ï©ÌiËfOž(¯HTä™\XI,]XAˆ’ü3ËF«Î$¬¬Y0(À ] 0 ðsO˜RP¨SA¹ÃÐ 3lÕ¦Œ\«-%˜¼#fÕ•t¨$ëibÞ´bÕª7ªù¸U # =J++yŸž*5¢·fÕê½ë!†3 à²ð$˜¦gf¾÷ú×ýÑ;Ežd§­ä ÌW„]sí‘ÀŒšåŠ+ ,VWÀ¦kù‚·³—á|ô£ïk·ZOÎÀ×/Ít•¦˜Ä9€/æg&Ö×ítÄÍ7ß²ê÷jæˆNY¤©‚‘oêþFjqËP»} ÈŒ0aZI‰` àë#øfÁ½øŠ,ž7`¬Õ·byýJžýŠ/%åVV¬T)M0»§¶ºÐ'[@#Š$h18ãÕÀ¬X<ÉZ_ø=Š$m°$v¾¯ˆ'ÕÅé, «¥¬Xöwx˜cÏ9–\Tøã{c,sLX3S‚ìYsss„§§§+ tW¬^³îMêÙêl[,sV"MÁýz¢·zÕŠšŽ7‡?Ô~5À&ùP$ßþð¤<o½ñÆ+ßsÙeŸS›ÏZL˜ƒ0OÔá@Ø5×~íA·ÊtÒ³j:Ù†HíUí /¼ð¥Šu>Yxóå"™‰ÿEyÀ÷Ž;îœP¨YI3[aJI-%WE–8Éë©>ïÓ |oRÇÀæ«À’lD˜^’dm‰‰ö:9ÀÎÈ‹p»¦]ˆ ' 3o*QÄ-`„yŒàRmˆȘ\ ]Þé.¾½¢³]²eÛ¦Ýg7¶¯‘ÙÅ麨$!÷‚. +"g.Û™Œ«(Ösöõçw¾m#6Ÿ«÷!@s„D»p Ø„‡††B˜FGG{õzmÿ½÷ì~¯BëŸÔª©É£®Þ¿¥4MéµB÷N vðÐdï.Lã Xü[XªtÒI¯ûÍß|îñj±…¿/ø‘=¸"úm®¹æÚ/°ý²¼  ã}¡3™Hc}[Ï;õÔŽ?þ1¯æ}s¾”ô^WžQìa÷ž{fkõæ”Ý…Ãë¤Zž®¦y É[Zˆ®/äß µïDð¥:Äì½è # ų:ô"*›•z(ÿ ‘w.òðû´}‚vÞÙ5m¡Ä‰‚" ¨ 긅%%Ÿç€™4 E`^'Z”1dkðÂ%RiiÑÀ@8Ƥ¹jLÎ|°cxŠ<³é¸àt Š®G*Éððz)F|ï½»?²f݆ת÷êéXšËHÍ€á8i¹ËêôÌl<22P&­XÆ}ç`ŸW!q•²úŠW¾âÒï}ï¿^¡˜y"òv_;EeÂöåX°k®=ÜpÝ—ÀW³_Õ50Þ·5222ö’³_r‘²Âv ʧ²’v&`ÂðŽ Ã^BÒŠÃÒݽ÷ìþD¯Ó½T¨¨U«Õ‘ §©QAj† a³³ó1èÈyG/58µ‰¬ïy+?xùåï©Wt‹±à2Ïhçíškw^"ä~ü”l:…öe—½jœŽÛ´yƒ£¦sJ=@Åä¡CN·Wñ=(ç‹ V1ªèÎŽl¾j’bAõz­˜ïíª³ì‘ì à )u¬²’dgbà |E‰“‘,ai9Û(ïìøpÎÍm0ÄõEŸ•Mƒ€7)ìB»«u\1àûbÀúĺgÆ6;€åÚƒÉD<ùHñ=ÅP{–”xR7 Þ7Y&yÓóÇjW¦#Õ *Šz§À‰”B5Àì©©{Ï=w¬Ûëübϵ÷=š6´>¤§ÔY³bÈ+,.v´ÝY7&›9|)Zÿ©çŸÁé‡#E;v͵‡)/a÷Õҳ갚˜j²õŽ ÿ×KT‡õľ}¿íŽ1ê³¾«˜ïìÌlorj&R C{”‚³U­š:]™N :f!çT_ü±¡v dç&`¾˜b2!ûž×+¬Î?¬Ã.’[s€ÃÙ.ß–-ۀʽ‚sŒ”ÛaÙw–ÍBÙö‚{8I•yB›sÇ'¬ l;‡Ù ÑW ÁÙ€•ì8¶M½tÎ2ŽƒµaMèU Ã)x–9VÌÙ±LKYQå+rÐȆ%¼KÀ‚iÂxáÎ=»ï¾ªÛéü·5΀ƬkŽ"±ØéúÝNW’ã©<å¿»’Ÿ·Ôöàs~ý7~ã°ìÁ„]sím¿pðRyžQz6àûÛ¿ó;;þ¸ã^^¶¿ÂôP¸û¬Ð¹ÔIí£Ý{öÌM¬X9¡1ÃdâìV"eE³"‰>244´ÂŒ@vÀ…Xß´ä`Ù­$“·M®f–·™ìµä¹ëÙŸ±¹`—ûJß±ÛÊPd2;±bžu‹ÈýÈ채vF1~¾kÛ9ƒK= m§.´¹š SÏÌ®³!#+¥t“$³÷±_‹i÷…@xVÛ@œscºŸ¾í,Æm¢43%1½)ÊÄ’ìõ4(¢Ïq@“à5êxâ=»w}ø¨£6½¥^o<%³Óx&D ÎvÌ/tp¡WƒH=êô1e¥l¿¢°ÊFõ¯xÅ%×}ÿû`6¶ée$± ®¹æÚÃG‚ö–žµíWàÈÙgŸ}±ê“*¢Dn&G)ÛñÊ$ч^$ŽE§Óo»mÇþ•+WMPþg°³i†Ì×KóB«žhFÆá twëEé9&Ù˜ €11H5È:¹ÄÊLyœ ™;_’œc¬mÛ,Zô' àòrn^" sFMRºf0LŒÅ ‹þŒXÉ2%l¾M\ò=îé `Ö4¨ð9Ã9‚BRS Vƒ˜g:w,ðºÀ ”Øßû*.Y BÌ¤êØ²Ç Ü ÔÒf€,‘ {Äбb–Μ¥ÞwðŽ@ŠVóÅ;ïüp7ìÞ ‹~@h\MÍ¡fpúÛÉôTƒéé™^„e )¿y™]ä#‘ý(½øÀß…,¸åX°k®=‚ØëÏÙ'=Þ쾗\zÙ»U¯2Z8t/`¾YÆIb¿à´‹^·+o¼ñÆ=>z®ÿ‹²žOµ1ɆÚí|õ>¤÷n¼Zr;ƒ³•v¸¦ ö8fOL¸„ÉSLÉÇŒ!óØÕ˜…éä($e ,¬|6p0IÔ[ßÊEm€“e²’@•O†)1M˜3X„Ù6±•*a¶ê„'» àd5‚yB Á¯¸Ì>´ r¬”¡²Àœ ¯ 8´Ô þ®K;\IKL©Ù"@%ò…k»0¼gÄÀ`VóžšîºãöË{ÝÞÏÁ3¿TÓÌlÚOkVC8R¥ZŸœšéP¼/¼ßGÚÔ±O9ï¼óϰ¤èºa×\{KÐ%NW¹„ðc‡Ú¾ðãÿã7¿å…­fã ûéC\;æ츩´'DöÄwݹïQ>ö(JCI¬7õTõi_ {{Ÿh6{ìP#´÷juʾ()J^.°@f†¿tÈ¡Ï(†Õ¨Š1vp’‰'»®/²°£œ,Š,›Ž“Ë®eI…‰XºdaY~gÖ¤Dê%¥½]À¨xÒ‹Üõ²yŽ[1Å}6]N+…eÂÙ.KÆa¯d÷Rðs³>çÎÝämÎËIJë¾åBš°r’)¡HÎZ8(˜~4)2kݾcÛû=þ±ÖjÕ¤—],OÒÛ«K­Öª¹ùÅ^»ÕÔ¾ àÉ…—É…%› ,:,¤î} '¼ö¤“Núž´Â¢r´ç¤h×\{øHÐvØQ…KÏàxà;:::ròI'½FâB‰´æ§}:y‚Bÿ à;995?>¾rBW¨‡Еšf²ôw |ÿo½V¹ ˜/°_°ûFPN:Lç‹àË;èœm'žàéU§ N>]b‡<—‰á Ûó—I·’±GžcÚ©²P¤¸`*b»t®ÀΉ±±Ü²ýñ¿#–ø#ÁýѾ‘e_ŠíkÄå¸àø1xÈSl© cÝFòföç¥lÑ’©¶“„…Ü„À;W ŠJP‚=IÓèU¯3«òæ,à&¹»îØñµÿ}¬ä˜• õQtICµËZ†±4i,=QžœL”޽Ô÷«o|ã›ÞiIÑe,X8ìška =Lz6aGï|矽MÁXÓÄ~ Ö‘Ô§+ÊÄ1x‰*{ÕZ¥ 2sjKKegmGá@‡_QäöÛàlÅ2\iÙ$C,´NaF¦³æáG\²Äm$ó®±X@FˆÌ‹Yˆ~ïf.Û6I[z&IVX2r2¬…%%Œ'f…ìm"kêËREò:ÚOcƬ(!Ebý[Ÿˆ|nâ¸L·<½“AÛȃ46e°'“}Ö~®1Ù¹°&‘:©AhP5xQ[!d679Éa?˜Ò”@ìÂ…)©Ïݽs×{Õ–]@V+i€¼ü¥Î… ù¤½8J´g4¥\]â·Y¸^±íǾêU¯~6ÊÐvÕ$¾“¢]sí¡Ï€‹¯ øâ¼õ[¿õ[yúát&ÛK¶ÑíöäýfUÖJKFvÆB8zRåOTÏõϾhCu~!Ù}‰ùÂD!%\je¬Æ–'i!#ŠDqÕ’M˜UQ¼kYÁƒÂŒSbpŒn2€Û@[dà†ßן©sŠðú"Æncd·z=3\+™ß_LûåçÎØ¸Í”˼y5Èã@‰îqˆÏÍG[98yUðoYÈ “²s27ƒj x„Â*ˆ /ppÇA˜°ö=ÀÔ•1†'õ:…Û÷íÛ{•ë™oªTªÃby¶`¾®¹öPà’lW}ŽW`û|Æ™g¾½è<Š;F©1¤ƒ2]íÝ»÷àÄŠã|AzRç•ÀOK ¦9vãa¯óת£ÓI6 ÎY/¯\ |‹bxùßÔ¡GÈx£¶jwà…ÎTL~¶ÙRQ¬e ZH9³—§K$ÀÅëŠ ¾²9囎¬HÈ¤èˆæ0ѱ`ù¾‰QG œ£€&'6#s[,š;qI¾oHz©Ù" 0FG6þ|rÅÐ4ÁíÅæCq’îEZLŸ˜cþhí˜9£Ñ) <¤{{ï½ç?§§§>_ðöÓÜåzP‰u®ÕYI¥E‰É”µü,Y'røÝï~÷‰åÅ;)Ú5×îg{@°J¤gß_¹žßöö·Ÿ©6Zw0IÏï;==3?:>>š«$™„ß|GõƒSÅ…Ë[­æ<¦—ÔÅÔ)¿3~¯(vŽÄ“ Šc™ý×8ä cUÂÿý¡H:$ŽÇªñøSrÚò0¿³WpŸyèÒ|Ïì9È‚qŒíø%DÞéI0Ð4ŽR¢Ø»4Ó»G}¬‘Ó¶» ae´bÇÏKűuý…N[VíáØ’Šíp1Ødj7cËÆÁ¿w’} Ó…9>gq€W J†w6IkzQZzþ„2‡òöÛ¶ÿÝ 'ž¼Y½³O=‚‡4¼× A§'ž€gC ¾À¡say”nSx–óUq[½zÕo=ñ‰OúâOzÃí4°*È&'qÍ5×~ùô@Ç+àU«WÜñ/å˜-—;Zgvßn·-tº]Õ)U}ÏÇ WÆ´½¬·0?wy½^Ûq¾àpÅSL‚ô\IC9$2áÄòdM˜Ôœ`-ÚYX‘m8±3±L’;+\Òd²f_É;Qìˆ$Ä2œ«}åØ/g³Eò/³Ýj«Î+d ·g3\Vi‰U]"¥B&Ìö‘cÎLrŽØ¹Úì×fê1Þ·È:F‘ÌÍãz¢ÀqË2$D 上ÌXðð)>0±íÇ´_0“B‚€ NYúA" Nˆ ƒ2ƒµ§µ Lxûö[ßÅÑXª3Hí½N'S3L¬Ë‘•ú³å¸aÙ¿;µŸàœsϹ@d¶à2ìlÁ®¹öPàe:^iðUPë‚ó/x{œÄõåJd¬ò u"ì…òŽ;vîY¹bå„¶¯‘ÃV–˜´cqqþoåÜ6__ôxÖ)&©ã¬ gZ¼8“šcË›Ùv2Î:hOà­ú™1Z2ÐàémǨ"©™:ü"+î”e;?ål¶Pè•lÖ!ø…h¯ ‘ùqpí1 ¶A¸gÍCï1@¦ÁKß2þ¶€8d6äÈ}nsŽŠ€XôÛ¶) Š´î-1ã%fòØ6ïBš[£ReuR ÎX°~€àÂýv‹J‹E=4SºSPg„ÑIPƒ°:Ðä;v\¤Ž°ŽX`^ÑñÁ^ R4Ät{a—Xï )zfªýsÎ9ç>W”;d9[°k®=°7| û=õÔ矬ÀðI¹Ž`Ãtd³º\°ß;wí}Ô±>JWsâiñrßt a¯÷½(ì}ˆù¢Ý—w²‚lÀ41€¥¢ë!Å€Z¡+&Lˆl‚´OÜ*f›Ê9ëÓ²l“IÛ ,Dæ)n—ͱCü®&1²»`³׃7°Dš" ]\×ÅïQQ÷ž=á>Bš³í¢"ðµX²±C3»rŽ)ã$ÙwŠ»lÛ6·K箘¤Kbe!ÓEЛšŠHÛwŽM³ h -ëód©Mõ{CU” cL### FgÌš››½c÷î]ïóàýTƒLp¦•¼ÒP<¨§E:ìÍØƒ½å`¤ÌÿqÊ)§œ£~/Cb™YŽ»æÚ/ €—‘tð_˜^ø»/|+Ú7IQ.ÁòþQ{šˆ@*VÛéŽO´‚4×?²? ÓÀ ¨ÍÍÎ|b,yYA_ 7’,c.ü‡2/´˜®`¬Èδäaþã JÎ&³iFÂJÍÈØvæÎE¶Ço‘—³˜§È>¸¾­ãàªAW­ï"ûì"Ã%0îp×ÚØ^ãVhtŽ5‹¼ó—¹4„%ÛóШˆIó1ƒ”£0æ›03‚` —?Ñåé> fÏØØ¿±†pœš}¥Dˆ‚o„$±R†àœî¼ëÎÿšš<ô¹²´§?KG ‡UÌ æ‡‹*Lqë]ïúË7°àŠpY®¹öcÀ˲ý¾ã _õ<+ä5öhÛo‰ýû%&àÐ ¦Ìëîȹù¹«êõÚt\ëa؇f«ÄT±óå+­ EæeËíºFfé=ÌSìs`æŽF,±ƒ±;rvk/[‰$lûoó-cy6hqFiKÉÈDCÂt{Ê=Æ€{L–¦©kMxùw9c¶Á3´®97‘Ù¤£Ú}ßÃð(£ ÍrIçTž|„¶g1ËvX±bªþäÙ²4÷ˆæÙ¶è3`Âä Ëð®bîh]ÆÓV†?ùñ>ÇñnXF;VÕ;Ÿª?(x‰šà´ —Âˉ‰ñg?íiO”Å‚kÂ…%¹æÚC€—(5XãìWu#›7m>“~«ž7¨ž©Ìåz¦ÏAzž™™9zÓ¦uÈ0!‡å Ó.®Ûé~9{?ö ®|Y¦+Êre²WQœ(Ú>¹ÜÜÓËÖ{Øéú2ߎØm$,oR;‘„-{r`åò¨(p®bû7kI¸Ľ¦iäb¾šz²™o—­ë±}uIÆÆý†Ì¦ÈÖ`m{rˆ¦{ ! ––Sg×:Ï‘]ˆË]d6ñfóLø`¨àñXcŠ÷Í1b+|-çvNŸüLLí –ÅŒ‘Ã=šÛ¾}Û{a æ–Ô1+•¢ÓRÔêõ†z-c<@sî_¯« 'Ç: íâ5žù1øù0ßÁ®=šD÷ƒ½K¤£/Ý%œƒZoÞAPhÂ0™¶<(“ sÀZš¾õ–›¼~ýúÏ¿H¿x`†Öqñ’NFT‚ªet]3 ^·©ŸÊæç>÷¹½öÚkf›ØÀÐ…%¹æÚƒÍ€—Á~ ø*Ðk¯Y½ú7Lz&ìhrzúP³Õjjé9HGý ?{™MMú@£^ŸÃdät[¬:FL ˜°Nœœ“¨Óå% û!ÇsžJ²ˆ˜}˜w¼¡èOÖQähÅY/?F‘Ìl’fpG&‹ÝÆÉ˜pW0[/c®ô½.‚p—Ùyµ­—­ïa1{¾œ“¡Kض^fN^¶˜½MX2æ÷(´/·1é#­Ïº"†•KbÙ„cK•ès޳œ¹(á†ÎZ‚Û‡ó+°2 ™UX• ähðcÉ&üío}ë£Q߫Ñ0õjú[HËr‚‹t¥Z£Œ_âHÈ)¼r§vÚ¹¢Ø#:p,Ø5×~¹ xPÖ+À\ðŽ—©Ž¯f~›Eá½%f$bJn¯³zÕê±Ôí2+û¦ÿaJŠ…ùùêtoY¹r%9]é’‚0áöTÀ@³ tÞÉgÕm<^Á”‡I« RŠÙÖK‰4ð˜Ä*cê£È ;HªòàqôºƒÄfù9Æ¢V@žçαU<‡¾¤ œ—%àH Ø­IÂö!D¾ØAŽñrбØ'¿’2>Y.ýMÇò¸z‚çÁAÈ£ýCúHíÉgUY² +H¦TpF)-æ,¬Ç&AfZÓ8 I8( ùðÔ¦ž²ÛíB¬°~O!4 X±TÂ$![ÖÂÂÂôŽÛ¶_r '^)õOÂ÷.]¨Ÿìv ð{ĸ¨«zÚÓžþèë®ûþÍ"o¿Ù Äw,Ø5×$¼û%ð%nlܸᷗ󫔨ïììÜd@ÚªÀ$ž÷(/®šÂ(Úvï={>Cñ¾àñL©&)¹v„T~.A$¬J<¶Í×Ǻ(ÍdÌúÝ¢4‘<ÌÈxSóm­â\ÖË9aG]èhDÌ—¼™³£Š,ä'çÕ̘/÷T6±ZÛùб[ãMÅ'Û1í›ÎƒÛf‰¹ýŽb}áFd?fñÀƱŠmk¥Í˜&v¬˜‡>‰4¾»‹ûÒ >˜«¨ÎqŒ>&œŒÛ‚…åÐ%,ßxµQA¬Ìab•={pŒ¦’„üÈ™ã„Ãþàú맦¦¿H?C]7Ø£²›iý`?¨Ä|Sø{ó³à³Ï>ûµ¢ÜÌ#\s͵‰—±ßœóÕÛß~Þ‹Õ€¿áùG$énbjzúÀÑG½N"ûÐW¹ýÉp÷Ý».USªË ©¶ç¢C‹á"ÆV®ñ[¥4’|.1A?±"צï¡4mêö¦J±1tûÄÎðXäIË“s»¯UßÖÕ fƒ¢„ BLì0¨9àÕŽ…ÛÞ[\\˜ºmû¶K`háSRŒ ÆÑœ¨Vk÷ ÕÉx¯|å«ÎƒC’|á‘\síAaÀËa¿7¾ñM/ˆ£°Ýçù<( ÂË ô_÷Þ»w÷ãN8q“ð²Àyö‘Ìܾcû§šÍHÏ`/ƒŒ@~áA¦:.Ÿ1Ó١하‘vº ±PŠë̶‹l7W˜Ç%>cTÜVìQx Ňò¸c²Û Ѳ}zàÜû—uÔEÕ’øßr{åÛrÖÞ³™±(·õJ‹!›“&«E…ú0céÂbœyáñ7^óš×>7Ž¢á#ýÁîÍÎÍؼùQëRù‹³ß·êCwݸõçÿ<66b¡OuVZÒ@& ÙeüŒ—2±Ì×L5^=Æ’ü»¯ÇdrcGæµc¢)b±ºK·¨Ü^€`ÉË’„.XŒ.ÿœ<›“å”y[²O‘w.|îé;ào϶éŠ,–³¥2.æ1fe˜1·SÒ d§ g ¤†Ð¾˜³ùœT +Þ—ž¥^…,–T m··“ìÝĸ‘5'd{¥A°nbØ /Czh`¶XŽ0ç! 1Äöh÷ÖƒJ¾,æææ`9üÙÏn¸í‰Ozâ¿ŽŽŽ¦”Ú+Z¶ 5$jõz·³¸X·lòËnÃCí'¬^½z|ß¾}À‚¹-8Äw”ÇK.÷¸æšk÷ƒ°ß²Ø_ ÂOxÂÎ*×™¬3‰7’hÝú )û G6ÇAߨH‰EЬ‘d¶qɘ±‰™¶2P%¸ª×ëÛÅ𼌺§Ù/¬»§¥w#ʇM¶bc›'»/•dû7×C±ÂìZbº6òAà÷° ɽdï’®2—¢$iðoÀø``ÁÚ¬–{ßÿÞ÷>–€½Ù¯±òé—¢=4\T%‰ ,­ß¤•üÇo~µÈìÀEqÁ.=¥k®ý‚°]xÁ¶ýjð}ÙË^ö Õ¡ûGêù¬CäL£^ŸH« z¹ƒCëv»?¹á'?úúªU«BH²0^‰6[6vÈxÉË[?WÈ ¶bØÆëkE Zg|»ãŽÛ÷8xà3«W¯y]ÊÊaI úÚí¡hjj²’VoKˆìÏ7nÜð,5ûGa›Ó .çîX°k®Ý¼dìï«^õê3Áìw8€k­KÆÆÆëB—SK;EhÔ»?ÿé ‚Ñ>HÏÀtÁF§ÀÊ`í|Ô9ƒ<í@‹Ìl$[&ß&ÓµÃuÈ)Y+n&»!m×ÿí O±UЮ‰KŸS(ÅÅò¾¹LR”Û˜ì”"kkbX¹—51u‹Q6©¾f1^‰JZæ­W Ç=DÁl½lP`lçègf•(ïòT•f0Aƒ ò†¨[†G`§:Ï ±F;Éž]c‰)‹¼íšÇes/íÿ–ŒIóûjŽo)+9Ïo4¡¤©Õ9À¤î#¯Às3¥ Á. žÑp=` þÒ>µzS>¦j¥˜`Š n6[A‘sär&վǟø¤'-úíÀ•ìX°k®). ="&ð5¼nýú§%Zu<¼Fëâââþµk7¬ÁƒãQ³ßðÜÜÜ¿Ý~ûŽ=+W® |!O.y§æ‚²ŸGžÎ"­P”0fš°Í^J|5óð1L„Û|  =‘÷†¦AL,²ªF4Ú§îñ¼Â"‹t–x\Ã|Q:Í:~'f˹œÌ,‹•ye;÷³dveA ¢µí0$¹9¡yÙO¬”IV «Äzy›žžž‡ÉŒú=Bl6J­Úî$ð^Çg@)¹=¬¯«ß7æ¤ÕljMŠ4i…OÛQÚRž‘ ã}µç1;$ Ôy¸#g“óÅý æMÇ¥øcû¶ðd²=óóå¹ a=yW`Ã3R“‰ù†G ÛívaÞÐxCC®è……oÏž=3÷í»ïêõë7¼lÓ23ïÀä)gggªGÒqÀ~Î8ãŒ3zà —‹â2…°:æëšk÷G‚沪(/;Xÿ•_9e“¦R)ƒ¾àšÒ¿³äúõfSwÜñ…ë¶m·~ZuŒÚë& Ë6 :&_uTIÐÐYRBÆ÷Kª˜  é¡1‡Ïì“>:YÅ,í$w¢Jx:²O›±y<Ñ?a`ÀjX8—Ÿ­$ÿ}s¨"¦È–¨·¯a`Ž#-™–Áy+׉r0$-r a¦ç*ööX0¨0]"°BF`·ÊêÙ´J´B`†÷-a 7è}òƒ4×δbšÀu‘Ê&=GJ‚¶gß6x¥´””pCßS–VÓÜ/–X%ÆaéÂÐà€kÙSUJijÿïgþîïÞú¶ó^¡îÍJ‘ÚTà%¢“œ(Ö Y.…‘Ž=¾„“3–g™Yœ íškGÀEòsþ½ßû½3ÅaZ~ÓÇÄýÞ÷˜Ç;; @ æ¸/:öâá:´ ¦Y½zõë Îbš!vXµf¯ÛY¬‘Øt8ð¨nQã´ÓNò—¾ôÅï–°`ŸývŽÄáÚ5×ÑmI°%?ûò3·ÿÖGFFNÕ´ ®oFѤ¡j:¸°°0»¸¸8§:â‹Ç56[<’cvþ’Ûl)$†¡mã•­Œ‘‹þâó²äû…ÀÌ$ki3dZ¦¿1±EÒét 5cWÝ“E~=8ˆÈÅãu%(Ã&ŒÀ f‡¦w Brù¼1•¥ä6_ë]KP}‘¨Î˜{ÉãÏù:ºç0¦ç0x¿á8ìA‚ð%ö«3d©‰â£ï~÷;ÿ¤~F1ý~ÒÚÁ©YvR«U;÷‡”>ýÏx>€ÉÐÎìšk÷“—%ÞÈy?¿èEg†½úRþ¥R¥Læ;ö¸£=”Ë4;̸£;þõ_¿ôíññqŒ‹-èŽü®†††´Ç30PÈøã!C&æëQ}_–aŠâJÉš3Ù˜U6ârš¶@Ù~yQ ÆC޹ø,.µKÎUäÕ‹N<’+Ö¶_¸\õ·~v°LáQÀ„Eê= ƒ‡ó¡CjÖh×λþ‘×€¼g”%¯Ùjw–9Lî—¡ã(8çÜs»€sv,Ø5×€­ Be¹Ÿké@¸ÖP£îMG*?+)×®[7B‰ä¥ûª»›þ×ÿ÷¥Ï´q¿˜LCƒ ÙÄ ¡$G@“"n€À” 9âŘ² ¸}ë, ÚN3IÅ"Ð/ɇõˆcVâ.bI7(¤È<+ ¯—ѱŠÂd´ä×Í$gsM”r“…ø$$1ûCù½P"æëíP£2YzÐ>Ð>/Ðfi  š½’* øDÙ¬Eѵ0¦,ùvê^¤¸ÍÏÏw(æšÀs2Óþq²Ý‹„'ëà9'­b ¹A“`v_Ú/Ôÿ…‹Ì-ðjÃ;ÏíÇp~p-Xº0þøÇÿú›qïöµköžÉ*2Ï“dp eàj1%žƒœÁPJÎtÏY¸ÀfZ¸¼XÀÙíi)Ð.|Y±rÒ‘ ŠtTæ„e~ fê ¼c8uQ£õU«W¥˜›:_ùl¬:½¯}ë›ß¸g||@—l¯Ð1 ulø:PAñÀcÊ æ„l ¾ë¡„ë§ý•ci 0°ô“<´ˆÒ<)Š,ƒ‡²oK—<µ$¯„C „‹¨,±+aR ÐÞ‰Ó YMn[Ú® ´'èZøv̹h C^øí‹>+É„V ¢üzо,”¯«ä<†óa5…diæÉJžóââ"Ùï9êªP¢øˆ‚°n{V6/^ÎÎ l¼®X&¤pß áW¤Œ»€p,ØvffÞ퀸°°€­ÓUBûÎ~û¾½è¬¯ gàøbá“á¡áú¤ú^·×;2 ¼zÕ- ÚfÁ1ëGœ–k®¦mç~6|ÖY/~÷ª=ܦ~ÿSÕJ¥fdu~÷Ý·÷K0’W¦x€1cBµ ËÀ| tÀ‘…(i bê’¥ 4R®èO)™XÒ!gÛ¡qƒNíÚ@0«“dŒ®T¦e±ÁKÊÅ÷§-´û¯­ƒIsß®à &R ræ Ë$/S6S{Â÷/šžžîLMM-¨iQ½w=”£M¼¶Ít9+Fû®4ª·KgŒ…Z~»/Ù—a[pá`À°`š“*ϯ)![ðŽ·ý}^†ÎÿÂ[í¡èHŸ³:É‘¡¡á¶XÚìdh×\[&{%òsN‚Þ´iÓ“ŽdLkÀÀæÓZ¿ù˜_”ǾôÅ/~À :”v»­A $¶V«¥; bèlղɕ á&ºã0ÃuàYL9£S–Û)-ÐEÞóÙHÐè‰ ÒvGgbtEf¦),YíͼŸc^s˜œ¢Ð¹*fÕzrñºìoîU\Ê 98Ãþ¹³²¥©–ëxUâ %-Zhß%ùÚ¾Ž¢07¾]‘ ™p av½ÚS(Ë—y‰à!w8 ^³ÅÈÖ6øZs“ÜÞk<)çææb4­@8‘D°7lžÅkõG½÷ ²:½ áyX¬„¯øð‡¾¯ŽsÙ€AÐç+Jª~S½”/cÈDH6åõⳞUÀ€¹ í±\sí~2`Ûþ[SƆRö;÷z7¬_MÅÆþÒÔY˜ÿæ=÷ìYĸFíé   z®jÇaX†Îmy½„Mh$@ 6Œ`hy»dÅH.Ž…ò¾;‹jóyõw‡˜­¾1gΜ ÛL—Ûz)?°{ å¡¿í‘Õ³-$n×]΀¨ø–Á*—õý²c.çœ(”‰±×>†o3nË1Ë 4¨ê¯J`Åj=qÐB¬˜ïŸbœésÐÉÉÉÞ¡C‡Õ{Ùà e¹Xl ¿B‰X¿Ÿðn‚’CÎYðþªýègSBû‰À—@YÓ ¼(G4 R9Ãû9;;s GfeJwÃÃ#À÷¸3yô£}²(OÈἡ]sÍj•Ð,³ýö¥Ÿ\¿~ýxöšGú›RÎþZ­¾]çmß¾ýÿxt" `¾°)€ðÐЇt8ð™755•¬Y³Æ£ €GuHªOÇ Ã:Õ™W Q¤­Dh^DÁC;¡@{qÂ*ñP±÷ˆšD¾bRîok.¸‰uf}Á °¤T° ºçÊù‘-”KP @äÅÀSÙd-;1OÐqÄ/æ:¶ÁP%ä(²årÛ-OªQÀÅ<›ÝòûÄþ¶e6¶ÌwP4_Ï¥`ô•„í0‚r¥}5ÔñÀFkvÐ@Om—`x0YA¥)ϳz§Í=Uï½~Np 1÷µ ¤3p¤À±àwû߈;w^;±bŹ4pÑy 5éÕáI~³Õ^œ›mÉ3o·ZG±Áù x`×\sí0$h¯L‚>í´ÓŸ½ìŽºà§Wo4ÃAòó¾ðùkaôNLz)ÚÀ³¾?==­£}”šugJ6aX&ç$L^/ÑF¬%`Lx )V™²‰ÆÜºZz†dÀvÕ´HÉ3Xø.”+ÊN…0¾×ĆRHìí“”ÛÙš,û®‘q96µî0¦™ËÉ<ôg€„»,)z]öyÙkQ$sg#’‰+:AöoQžú²ì%cæ ÙÉ¿ Ìîk((ô‹3cΊi ÏvffpO )“™~N(!s¼£„Ï (;ðŽÃya1 pÒÒ1ÁÚ˜¼Þn·µ'4lO1Á0}êêOþP½YÓ¾çc™B_põ©V­utàEa{ÅŠ#– ˆþp$O8;°k® `;tP$AuÔÆ“Œ¤E=úOŽ:ê¨5æÙ'?/|kçλ ã€N€¦Ùlš’í:$Zc4Z®¹Žò‚'5HÓj“üà})Ï%A$lï4¼ãàå¼oß>ÉÕX.«X÷~#  QÝ`ˆmV¿‡oqšãàèØXƒi ‡Õ™Àëyæ™g>s دk®Iв_Ù€« ÖRò‚Ãmê»ój”>ÌÎOD8xàß ÓÛ/$Û9 :È‘‘ìŒA*–ŠçaFÀ"@¢ƒÎgllŒÊzÐ# Ù:7µO.IBh×Ç„=dÞ&ç°Ý)Sy¹²øO.?',Žˆ˜Ö»¥ 9º.1•ÉC鹩Òzôü& ÛΜûß—M>lÐY*$©lÛûÓl¹Ø–¢¹”n¿¶Bšré0yýebѨšôm?H‚¶×Á@ÈÜ;õìý"ƒT …#ô±Á”Ò34µ ƒF’š5cÁÿ†A¤6Qä¼&“€¶>/t0áØÈ«ßÕµÃ##§iáY—3Õ˜ žp£Õl' óGd Þ¼yóÔìßE(RŸ'´páH®9¼¤ô\䀥çÇ{ÜjÕ‡Ôñ^iuö2/?÷2Ìü¤z©ÅÏ~ö³_FHì—wÀÐáÎ(0ŸššPÖ¥ëÀÆJ7Fö#6 èÐXž˜+°˜r/³ŸÒ‰êë2I9Ç„-öKy©I¾Œ© eï¢<Á\‚¶Êæع-ÇR¨ŽýÛû—oWÄj—b¶ئ(Û_‘D]VTtÝ€XzÝ6#ÄMBNPÀ±¶®à!nEÌœÛe‹Ø¸êD 80'¹d,Xà»—TZH¢©·˜ Á ¯„. âðV¾6óiÉQêÂq!|Yõ*P·6\›.|UF@F¸’k¯}ÌeÇàC¸îÙŀ´}_ƒçFËnhb–Útç?|õ”ÓNmƒóµ]Ϧ)îG£Qt1••Œ™|u$´6mE*`• ZV¿ÁÓN;íõÙj:Þæb,ZYi²¹'E;Œ'Ï£Bá.3×õG9ŽX”àjŠê½Ù8¯®®fÕ°´ØY544°hŒ˜æÊÁF…Lõu ÄØ‰Ã¾6бHEKU­ëÖ4³eùñ–ïCð³¥Îš}`c¸~w´cäHmú©GIõ8…¤ßcªˆv¿(g?Hçs «”p1êX›j :’ 4÷Ì•.å…»¿ A†Š ´Êw ¢‰÷¡e2q…žž70°XÀ²÷b÷qP×5;ÎBÑ邚ý†4=ƒ.hˆLŒOü¥¶¶vµÉW3Û(GxÁšr æá¥Ë–ÕwíÝ;,©_¿yà¼mÚFtÞ:ÐÀU%¹žÎZ`²±A ¨d£#ÃÏËîgq$'W.`ÄœKì °ãÁjXè¶Fó4$¥òAle.7±C‡×Y¨8xP”'¥„K‰ b‹JH†1ÞJ)+ÌuI… €¼¡IîK>0ð@MV7²{X¥&ýæGó¹²UîÌbA©r/çQ¸† ¤„4ÁR†¶ø:ù{ËË2R6©_´|îeD÷º˜q_çgAù:µ_|ñõ&\ÐÃD¼/²A®Ü¼nhÈ’! íä°;/z£*«ª£X+:»¨—r2É÷ØO~ãÉGüüç?ëR(` ­M› à"ò=‘ÐÐ94¦Rååÿ,kØ²ÌÆÌJhNN»nkkÝLÅ7°Óóo)øŸCÐâ+PP„(ÎuÑWÁ97̦àšÏC5L.<³÷á;è:ÄÏ`9ºâ¹âsºŽªS–Á+ÂWüμð¿C W,ˆAéVÂ܇£R—| b– X•KXõZÕÅ(`Lªçó)zH;~¯•æ~ 1×—W¯Í:Ur·xé\ÈГþv÷!0ù¹  A[ç)(`§ÅëãBZâ1ÓàEX%ŠØ %(sŽApM«àëøA?——–t0P ãd—3Æ0ào\® Æ!+( `|·ˆ‡‡þÝÖc=+y²vÛ!FYâAÖ•ÓÆëëê—ùó€ÅM»Ÿµiû€˜g8J…Êù@‡u@UBGçxŒñÄ‹˜˜ão6W'ÏÿrõË:Mž¿É r`5,ÞÙ(?UH]]«†ý@Œ-GG`敳Ìêêjô ³¹b4R³¢ÛY„-¿ï*rYýr`»þ-æ1ó”$+ÃÛ"7¸T~P„f˜(ÚYÑ|sÁ"ddõ[ÌÜ£ ÑRæ~ý—#œóÁœG˜³k†R€(b9/Pñü«æuý¾ªh¼^0Ÿêèè(y¾·LÇF‘úx½ãçrC#¸ù<°ÉÛ‘½cûöñT:ÕïshV‹šîM8){}`ø¼¾S‘(@wÉÚvçSÀ¬1mÚ´iYfžÒ=HøŠ¦…M 2qøáuDMÄ'Ÿã‹ ä,Ÿ'ºŸÅŽÕ@Ø%lЪH²Š ãm!ËÆse™Ë›VbˆTtùÒg‰®fÂâ¼Eتö¡»Ø©bg‰(_ù†V0"åÍÊÊ*WV¾bQŠb\Çâ㪵uËU¾~îgUt>5K«ß“ƒm9s¿r*˜_Ÿ/‚³Ð<0þ–^ü½:;; ‚·\ŒÆëEÆòótÈ¿Ÿ˜Ž„AŽÉDòåp(|(«ˆ…Qø< ³` \öÚ„pŒUE(`C«`mÀ^>Ê –]ÐcŽÙôšr?0©HUWU×° ‹˜–ç#žç±ó±|Ö(ÅÎ;2êìvïÞí¬\¹²à¨@bYeø±X·ÝØòùaƒ×pVv"ÂÒpnQ¼ÔÁS$5ÏùeÀ§Â´v-¯ýëÈQ°Df!ˆ‰ÉÞ¿Ô¥b^ÒªcPNt뫾-k(CU °\£[Þ’;q× ¤ù¥$ùÍÓ{àoŽQùøè‰ÁëiºTou™Œ¥ðn8ò2ŽÒb¬]Á5ü BÏW kkk+Ë=ÆT*‚ÏÁ1amÚ4€ó(`„—,Y²²Ü•‰½~0;÷kˆƒ_çé§ÿòœP³˜^“SÂÜÏ)è@X§„æÿaÄxËULKŠS!„QyCGÅ€L‘¤¢[MTKXKÕéË)N|A Õ6©s”ðµ‹Ù窔©¸Þo1©Gùò}%`še*`§õœÏ-GQû(>G¬ÃŒžü­8°îEpÄŠ[òzMÙ»AÇGÁz˜³‹¿Æ” ÞRT°8@¤`,¬¨Üвú¥y`TÀ¸/¹¡ú_Y¸°‰ã,‚> §?s¢dyŠ×ü‰¯ýê¿üùσ øê@,mÚ$ç«€åÙ@.Êë1ÝÊ’‹:è œ(} „g~:½ûO?«©©a£sqþ—:]^XÞ0v$b vLTÈ+ ‰QÃù@Œ!)Bªß¾Õ*¸?Ù±àü0ª ÄbçάYMÉû‰çŸ—ß4x)K|‹ÔgljЦN–‚Ä9`¿%|­èªöS½ÄDQÇŨÞbLU¸ÃÏ­¬RÂôb ~7J-âîf›æ€iJƒê?çs)‹îZZ¡H|áqâÀÕ.Þâµ(„ð7æŒå熦ÁDW4¾€o Øyæ™g^yÍkS°Ð䃄ª4¼W ø!VÖŽ8üˆuà— u°^I›°¤ÀLÃ%$wƒŽ±>™L”üa“”øïH¼g³*ÿM± ƒ&õ¥¨ ä¹_1v\âRŽ!›Oµˆ¢:Ãþ¾¾>\‘ŠzäD@‹©.Ÿyt‡WÅ2ù>¹Ê‚±¨n3O]2ýܨR-dÌÅ̹ÊJÕoþ¶X÷s1ûÊ‘ÛTyž[<Q1Ó`Œæ7)Ú™¢Ÿie!´ùâ~h:‚ÜÖ"xñýdð–cåª`>@0ò¹¡EøŠ†ƒ;lOxŽýÃ#ïz×»÷Â~Ëd4 ˜¬ªL‚JäøÈŠÀå¢E‹V*à«Z–P›6í‚.à‚vA ´¢œÃÆí[Ð>-™Jí¡¹;ÊÿU¥ù¹ŸUª@\*„ ÁW†æ|â `pp÷c…50¯˜:F|­ØùS*“¼¼8‡É$¨‚„ù>”ždò¹bSI‚®ßœ/‹J¥ªR–|E‘Ï‚ ùö•ç„E¯G!p“ë™àË«ˆáÂOó_ù¸L¿ïLàE—6ΊïL«`UN°| øÍó*`®W¾¯ƒÑel}à̪I¼IšÐ¶*ìrÎA“ƒæç~Ö*X›°ÂíQÀuõõQh°rWXÄ„×KH"ÙÉ %¸.@êHTéG*÷³Ÿ‰nébÁZªaGKÌ-]ºÔáu©1JK[šÜ,Öˆå£ÀLìÈñ;r°x L)¾7‡+-ÔÎ:XTà~iY õëd=É‚®c|½\#;l Z‰J^|½p,ŽXlD<^±Ü$¥ñµx*ÀAùÀÅÖYžJD¥,1å­áRU°ì†¦ó‰ï!*1Uê—Ww3… @=¾5­È›fä\lÅ}ý`Œ×, N¸0ÿ2>FÑÎ¥Œ×Íå 6x€{-~?ܸÚÅ*V¦ßo7žNLU:+±¬¨jyIÑv6ïìãOák†æÃ\v$t]]]>ZkÓ 8W~ 8 ”M< :\“:Het¡Ñ¿ªtd©îç™4¾RÎŽ7TÁ´Æ±¨Œùb nå+^טåãþ¸ž+Ÿ£Cˆðe*£¯×£Y¤…€¬²rWIRY„®ây·z*]œßÅ[ ’ÂïMFØÒšÊt¾òAWþ-Êp±6*X•ŽDçPþå@,Ùp ÷øãzßû/G×S¹¦•-ŽƒWN(,ÀÕ5ÕU øêJXÚ´…]Ð9®hh°a;.ëâÑ€’ð@Ú¶÷Š–Gê\ñ±ÎFN'É—~4×ê7|¥ŽÒ¡ÁK ìTy«)zPõð…(X,nuU0¥=ÑHÃakR¹ù[.˜óZ<ü¾a|œÚpW1"—³Á?à9ãl0ƒŠÏHÉ]Õoâá|¿ý\FE3,g6È#<ÍÃeÓoY¥W´·3†B¶Ç“RÂð6­¬2ŠsAÓÇi7´¶ƒÀ~.h÷oh¬ep¤"Ìx¹ø*Hm 7©d2' M®€%(äy5ÿ[Šú•á+›c>À0y=cƒ™…GD»sǨq•&„1wE›ÂZÆ®Kšç… <•ù_•²-ÖØZ´<Ê¡‹ÇçDp½ã†ß•Øà‹b8¤rIiÝb!<*¸Øa9Áî<0_`ÁOíæ¸£iÐ §¶.•¥ª©Ù©äG+*¢†àUˆu.°6­€ó(`Ë´‚eX0d²hÅ`7OôòAÙà)KÌÿðõS¿åÂ×È"Œ©Óå6F› ¬Gcc#Ë9F㯳8 1jܤò•¼R—Ò<ó¿"L‹…3íKK?âgÑ*FTå ï`mZTëxc•*R¹âf&T*«‚§;K5ÌWå¢sçz°Á¥}Τ€3c2GZP$[ŒÃô® R”ÁqE AW«_mÀꑳ• à ÊMìa³Í\^¦‘ÀŽBµ¤Ÿ€EÍLÏÿë~žm“Õ1z°ÀÂa<00`ò`. Ö¢€-“wÀ¤Š™›U“jÞ°XȪ@]Šâ%àÒ1ð¼^HÅæzQéò5wmŒpÆýpþ_ƒ žnàî®h¿y`©Ý“žÏ Îo¿·Ù{pÙó´ÐV+ü¼i†žÿÕ¦\ºÞÍ ”ûa ž3¹¿ìVNG²SY1I†*ލJµé*=9ê·£eQ ãÀ„/cÈòŒQ1sк®irO£òáfƒ¨f¥ÎJu/«\‹äÑ R¨b)Ÿ ð·Mîe¼6ÆXo{¦ÕîL¹¢g2%IÌ`ûQEB‹q¨l©G*•ÞçÇÃ`0T~ FŒÂéGÚ´iûhVÏèÕÉÜ–¨|½µŸU†EˆT#xr7#ˆ©TàLH˜ õ;SðU¨c“Ï3#|Ĩ–ð–¢£Q!“ÆßE<·¤%ÂÒï|‹À¦Ýi_1_[ ‡ö¡åþ¨¨z@„y^¼ýýýì;P5WJx:¬Ôy`U VéæŒ3÷s¶¹ M×qJ)=+þ0_̇ÇsÁÜXLÕÁÚÑ6ü´Ð•‹9´6tÚi Þâë»kçòà'wa{•‘˘M9—ÀŽ]vƒ1Y‚!å{ßW“ËÓˆ¿r‚娋9è˜g’6x}dÖQã1*c>ßÊ”0ÀÍäîHæÆF…Œ •wÔ&¯“œ£²(% ?GvIÓþxK5™yN6@àóýWÞlá Ï5„eWô|TÁŘ¼¼"‰[fП‘}ÕqùuØúÕùæu:’6 à® ·‘X›-«Á€¶¸Ιg캹Ä:Ðráøy †æý*ƒW6Ä4ˆÁ9ßööv§±±‘©"Dç`©umm­C°¤s ÖT{ºñéé‹)Z½¡ÀHf¬a·±ºº:G:.ßï4× ž.›ît$1#<·Å”yºRÐgàÌZ}¹ÇÇ,à]Ó¦M¸ÈÆÖ)·ñ@ÇÈ6jo,F¾ ,qä^j%&Ñ ¹õÊM?šOê·|}@ì¡044dreG‹Ú³jIèæÏ?À”)e¼‹Åܹ]„/‚;v\Üa‹iDxËÓÉ‚*âRæ-çR —¢‚ç¨$¥wЫ^8«p-Þ6­`fUî¬8ÍÔͱ°vÎTœ2tñ mÚJ°?ˆM‡Õe5HPÏVfTnªFÚE ×gs‘ôýMý–ß|0¦9cùqZ&QüÙ¼d¢ÛA‹AT¨n¶w|/\ð~*ǹ¿¨áùî†ÎmÖFÆÍSù€™êß•í†ø' mÚ´•`•ŠK~¨p²vÚt@傆Nß·W‹p Í§Eæƒú*ЊPÇô˜Sìˆ@+¿Ïtë\¨áéTÁ…ÜÐÅäS‘ÊpÀ[sÇq«ãdÜNÑ]DÖR©d¢¤hÓ¦œÓH÷Ö1ÊNʇÎ8G¢*OT$RѨŽùßRÁ<—Ç5´æ›ÑªH8p-vIIÓ°‚–é)úîŽM³üò³Éd*ÁûGêW4ˆµôf)!›ÊSS~çLbƒ–+bᇚ2 6iÊóX¥.ÏVŽMWùÉÙT¿³ _=)ùZØ:‚€Uí« ¸Üã Eȵ·OÑ Ö¦œ§qx¶sá~Vu¦sYvRÃwî·j5×%H}Ú”›ÒWÈ`Ÿe™”^cÊ`*m—„ŸŒOøô%†VÃÚ4€ó¨]Õýt:='m±Æ¬¸^‹E8´iøêóRœá=¯Ã]l›äé…Örr=“WÊâ·Éd¼ìÈehÇ“>€ÕÐÕ¦\¼9£Öt:U:€À¼q[™-ƒÁ@ÓL~Ñ™¬OiȘžë"+Óiç¾ím ¼¹s0|TlYíml|lܧ?É7Ðצí °S@ýº '™LÅËý0ïîRYhÓjóU¹‹T%Ke³]†r.\޾óû<ùDÄç}ÍTcйîåŠròÎQGn\nðuº)Xü—H$ÊvA Œù æ ÅœhÓvÐ)`YýæŒ\¢e8•JüêÍy½?ÓhÓƒ•’ÏUÂ|Ý_ÃÌ Ârœx"^6€c±Ø˜‘þW›6 à<ölñx¼ì„CÛNWdjËf¶Œò5øàÛlâÞ/+åÌ´KRE[!+ulšÿ½’3¥Ë&ãñaǶCåSß(ï;l­‚µió°_àƓY±¦ÈVîñc;Žac­Éd’û¾r£-a ¿ùÌ3kçâ$LW ’†ïÁuÞæûNÛé䨨˜åéJ°^x¾Uî;ŒÂsÁÚ´t–áë«~±!µµµí1|^˜¾h££#A×íìYÿ,ÃäSN=íÈBÇçì„ÉQ®:K[¡kd¶­ººÚ±´Ù¶mò6„ó¿¸÷ëðoÑ+eò:444ˆkp—£€ ³{÷îAŸ>D±6mÀ øª ÌF±Ï>ûLk¹ x|l,€ :PÐGƲ®¯_°‘òEWÚÁ¢‚µúÝÿÎïþ4ËPb› ‡ÂÇ{ÜÎfvN”ݱXVÂGýê\`mÚ–óê•îg¼íé饥ÎÊðèèhŒæ˜0Ù_ ΍ˆlÄýür‹]^›¶Á¦²6 Zýæ/ºè¢``˜ÿë‰M¬ãS’Ã['\ðME¢Ó-&''õ¯7‹ÖØXZ©îþþþy­‚˜ßFÕ0ˆ·èfÆ[2t=S Òk_wük Æ^ŒÇ0]þR¡œ±ñ±Êr°FÇF}‡<,÷ÆÚjûA8-7¢d"9jYf…÷e…ƒ–±MLLTR)J,ê½2¾dÉ’ÐÐÐ*笸Љ8X2ò@VÀóÍý\*tó½v>ù@1+¶¸¢‰«"á`¶¶¦æl‡¬åòµAÉý<19ƒp- ÏrJ_5°·w_¯xu–6mÜ •¢´}F±é‘‘‘r?ttl¬*SkÖts…ià襗½k½jD¯®Ù.m3ñ¾Ú懡G"¯s¯”tlÇ*W”îlÞÑ®¸:K›6/€¹ë§`ð•Ø˜Ú;::Kù jÈx;21V[nxŽ!•¾¶¡ë@kÓV°´<œâ[:qå«ó4)jÐC1í]˜[(zó²eËC‚z5Å4$ =}622¢#¡` iç7U4¶ )Úä·îcçœsNm(<ƒiÕÜØ £««»×v³˜ETÏ¿øÂ‹ÛTý„ំ¤M›°„mœ¤Ñí–W^n.OÛÆäÄ„ ê3F–­¢¢âl¹,¥Øñ”ˆ5ßs5ÈfÿØ”@,t?ã*Hª,ÁÓcžqÆ›ÞØø¹ŸûaPì¸ð-ÄGïó@ÀùÃÙ)©_À:K›¶"l(pJÕ°~øámxQ„q”=80hRE,hÀ™Ž€o¡PèÄsÏ=·¡‹ ¨^v¼èNÃç@ÄÒ«ÜJx*Óù°Ââü/>W]Sývò2eò³îçD29 ƒâÅý\êüoÚ¶Ç M§üú ë,mÀŠ…ªa¥$ m>™€‹’–NŽ ÆyàªÄc‘ :k¡SN=íÍ\»‹ €µ»ù †—¶l; ,ª€F3PÓüï›Ï<³: ½ï«ÜÏ=ÝÝÝi;*˜ÿëcûöíÛ+ö Â–Ö X›¶©)`_Üß?Ð]·£Ž ŬT*¤Bðr0V]míùò<0ŒèÙ|u:39 ª[ÃW—Y¿†òM—øMÃ`»pÕ(Ÿÿ¥A*ºŸÏ>ëì³ }EE—³efÓë3ž©òRž}æÙ-yÔ¯ÀÒ¦­H«ÊQÊó¿îöâ /ló¥85d'÷q–Ž”J±X,€•ˆe¡pø-øà—bAT¿¼*Ö´Ïë \¸p¡¾j4„çÍ5‚Ó0b,qþ—nÉý\S[ûO²û™æ½|$oÒÈþ@šÖŠQ[©–oþ—òù}öØW\±$ ½ÕU½RÖ¾}ûá5»è,¯A[ò¯žÿÕ¦­XûÌ«à›(ȲÊRbƒß×»ÏL&’ êd7teeå{-Z„NÇÂŽGù”ná7¬Ó‘ôÀb¾[9X²ûY5ÿKƒTôáóè~>fÓ¦+LË eÔo6÷—ü‘¬F7´‘µ³ùbì€t:’VøóXOû{’·‡ÜÏ8 ”ÝÏü9–=P]Ssµ:÷—¹ŸÓÐn”ëzF{ì±Çžõéd{–!Ôó¿Ú4€ÕªT^¯ÓÏíñþú׿ú[~Žû)àL0VwwW%u a)Ë:ôÐõïGwÛèèhQn虚ž¯‘ÐÚý<÷Vìµáçm)6ýˆ¼>xýSn)ýÙŠ ë¸÷3‡³ù‘^»& ½U•û‹íkhh¨¼+)ú¹TCˆÿò¿ø›ª0¼.h]€C›¶)(`¹ ‡ì‚ŽSã»ï¾{Ÿñ­ §Ù96@8m]{÷VÓ¦[¡Ç±Y_W÷šóÅŽg>DCë@,m¥ ÚÊq?‹&»Ÿq#÷3]‹øÜúC½ÊÌÄZ1׳œæ×ÞÖ‘ðP5,¾¡X0¶ÇZZZúTý€Q ZÏÿjÓ–ÀBñ‹„V5º¨Ò±‰Éø`9ƒ£pìHúûÝœàLÇÁ öÀ޽鿛ÏÃàèÈ,Å[‚kmÖÜÐÓ5<888-ï£ççÞf:6@\òêWÌýLµŸiîÕïÙoyKmE´â=’Ás3m‹Ç'†G†W‹¹¿ÊeCóOssóŽðõ ÀÒ¦M›Qœ :„Bãsàs›Ÿ}¹Ôƒ±ººöV`'‘uC C˜ ^° á ‹- áÈUp,3E7ôTƒ±´úà±éÍ0x•Å70ň»Ÿ™ säIýžs醶R‹í½Hâ†uìéŒÙéT¨¸à+EÇa™Î½÷þôÕ Üð`i÷³6måXªŠåW:gþç—¿üåßA•¦KmiT”c`pЙ¤HM1r“»Ó6|ü㟸 ;&œ ÆÎ‡ÜÐÚ<³¶téR'ßv0‹|×ÚL¹ŸÅÚÏ|E¹¿xÕïW\¹¬2ý¹šƒ8ˆ5 7÷×±íxß¾sAîçRm||¢ŽyÂgž7K»Ÿµi+O竈ag¹*;…–Ö–H&)ã>£òy´UUWöøN¨à.8ù‰SmmmAQLÇWL™@Ñåx ƒ¿XÀŒ –¯…™P¿~ÁW\Yýn:vÓu@Û*r=g¼IÙÜß®îîžx"fêWr=+Ù¨xèÏþó ~0#7ýH+_mÚ¦`C¡‚E7t\n„?ýéOþ#𒹡ÌÁØÐ˜áqe{PÁËßý®w_‰àå)In0ºéf*ë`sC— ÔƒÄùl&‚¯¨ü$©ß/^wÝ1ápär5[VÀ0ݬ¥öîí\Hs¿åD?C|è¡ßnË_ß,­~µi+ÀŠ¢bU,Ù í6Æ–––þá‘Ñ}å;•ÖÖÖ(B]ièF˸ÔxGFÿõüóϯ£@RÁÐQ•´@ƒÎ ö‡è|xùh帟§KýbÐ!¨_Vé oEõ»|Ùò)òÙx¶¶ö¶Ø?Js¿åس›7¿ x«ÜÏzîW›¶iTÀÅb¹ñ¿ï¿ïqÃ0 ¼¥?„‡†bVÿ0å-‚AÏzÁp¿áMo~óG±£¢õ‚§SÏ–z>M'8ç+„§ë¼ÏFe4R¿xm‹ê—aÀëÿ«·Üò¶`(x2åÎc{§m`¿Ñ®½]KEõ«¤y®Ä}÷þô¹lkøjÓ6}–çe7ô$Ýߺuk7¨ËþRŠ:¦‚ÛZ«¡?±³)Iru¬è‡>ð.&Ü××gòkÆR’t7ôLó`qGOwð•œzê—_¡Fõ‹×<ÂwÆׄ,øw¬ ‡-DÎûÅ Ó†’©du!õ«vg|ñ%¶ì |ýæÉ™¦A¬M[©.¬ Ä"'~ñ‹žœŠ  ôôôQ •®>öØMŸ&ÌS ?<])IÓ­‚dø€5gZýJ=ÂÇð>ôª«®ºÒ²ë܆Ísã)ïwbr¢{`ppCaõ›ÇL3y×?ú›_[7òW¿Ò¦MÛ°¡€°\Ú£€q{þùç÷@g+À[_ãh½½£½ƒ£M¶HCÀÍe¤-©øÀu_ºþµ &,T½½½V><sÁÓ­‚÷‡|Ô î3q¾§KýÊs¿”z$ª_^xÃÄ}/{×»ªª«?#–œ¤r®ÔVvlßÞo8vMê×1r·ãã­[¶n“Úù¤¡çµi›5Ë9Áb0–<*vçÿ>ø¿ί‚½à•!ŒÁUÝ]]Ir¥e²\ V,_þÝ£ŽÚÁN —2ìîî¶fs.x®­¿¿ÊïQ, [[[•›V¿Óo~…70ÿÛÆ<œô†“þ ªž¯¨}Ð6‹í?,ÎÔ[/Sý¦øÃÿzZjß´Ñ\žûu]ÐÚý¬MÛœÇ -ÏË3þ—?ÿ¹:á’¥¶¨‚ÛÛ+lÇN“: ÈY‡_yÕUŸ‚j°¨6îl©àƒ!'¸h‹ñ=kê¡Ëƒ Í[¾öµ³CáÐ?«JNRÞÑ®]»*©æs¹‘Ï;w¾Ú Ÿ?é7È6ÔéGºÚ´M£6ò@8éaÖ@ÿû‡ÿªðjaì8°CêèØcÈA&b_S‰|â _øâQX•ž={ö+<ŸÝÐ¥(Ü™VÃSUûåžçéR¿¥äý"páÚ3Ź_„(Â÷ÒK/mhllú¥çaÛX¾”gfëîéÝ599±„—«,Iý:®ø5ÓwüàûOùµmÃßý\jsצM¸€ .Æ £‚ÿð‡?ìL¦Rc…`«zŒ ÜÑÞ€Îh2“Ó Îu™ž€¬ÐÊU+¿·zõêª`,VQÑZÏ|g Âû³úõ³|y¿¨~©è ª_|þ¤“ÞøM€ïšÞÁö`¸ÐdÙ‰ŽŽŽÌõ\fÍg´–Ö–ÝpLãBÛž ,F?çÌýj÷³6mÓ«€ C ­švêÿøØ3åª`ì<0ßqçÎÓ2íìšÁÞ€,ó1ú—:. ÷çÑÑs’<Û*x*ÊÐÏ5| tR¿xÝ ±üvh¬î9>Ç\Ï·ÜòÎP8tkI™U„’“™igO"¯ õ[a€kÿàû߯ME,=¨M›¶é°£€°JO£åøo|pk2•+õSĹàááa³sÏždv¹Â@Îb •Ñè§?ûÙϽöe*²PÓ¼ðLª`¿Nû`´™€÷t›íOêÝÎ8ÿ‹×>.º€ê÷CúÐòÚÚº¯›|¥#•ëyxh¨­§»g¹ß²ÔoKË.øŽ£ì»ô V¿Ú´M#€‹\'XÕXYƒ½ÿþû5¤-ÔN½Y‘‰É‰1 ÈRäGV­^õÝÆ¦¦@,cJ¸··—­¨Tp)ž¼àƒ!%é@V¿S ¼"õ‹àÅçÆ´ê^ÃGµñ?aìYOË_»S1FÆõ ûMîØ±£n­Ò\ÏÞi[Çv’·ß~Ûê #7øJ«_mÚfI‹–Up" ž|æoëèéÝ·§¬äsÁ Ð]ÝM£ÿŒÈ–‚ÇþsŸ¿çÎ8x)ŠtF\Ñó¥:V¹ ±««Ëœ { Y)¿y±J;¯p€ê¯áo|ó›Wƒ7f6ꙟäzÞºmÛ+Édj![¤!*kî÷ä‘Gž†¶3¡jÇFáÜ_­~µi› —‘’äi¼ßüÆ×áûŒû¨àá¡á@×Þ½ãTdU€[ý‡[eeå—¾ò•N¥Ü`T³åŠÖ*xþ .fBýΔë¯O¾Þ/ ¼‚ã¶¾ð¾Ö'?ù©C««ª¿bÙ¨ghz\Ï}ûú¶ ]NÔ³ØðFFGþç~½EjÓZýjÓ6?p!¬r[±ÆŒsJ}ú¯ÏgÁš¾ŠæLK{{{õääÄ­ujag$äÃË‚ -úñ¿|øÃ«±#KWôþ*m…á[Šg$ß N¾ÞÈõŒàEõ‹WèíÁyß7¿ùÌè¡ë½¸[IŠW¼J¦’ïîÚµ.ü°;÷k;ê›×Lç{ßýî#Š´¨€µúÕ¦m®\@' @8~Ï=?~~r2>ZÆçº®hê®]»+`äïÐb Ü*YMG~Äý'Ÿ|J•î› Wôþ¨‚׬Y3íï©ruÏWõ[Œ§£ãAÁëPt=#tA¹šäz‡ÃÖE]ø¸¾7ѵ yðaöß¶­Ûö:¶½PV¿¥²°¹yçΖ––>EÛuÛ¯‘›z¤Õ¯6m³¬€ó©`9kœonC¾ë®»ÅÑv9Æ’zIð`,fvuwÙb% 9( î}Ñ;.úîÐЃýÑu£dWt9À*ŽóYÑïO®g¸.™ëŸÃŠn_PÂÖ7Þø¥`0ôOtA‹õÐi fïÞ®cãc¯IaŒ´‹rÓŽRi;~Ûmß|\R¿ã€µúÕ¦m®,©`; GÐÔ˜'_zéÅÎö=e~¶ÕÒÒOP*F¦®W„‚¡‹¾ÿý|ƒZh-UtE”§a¿Žw>è˜kW´¬ ç+à‹…o)ž|ƒ¶|QÏèzÆçñºÆy߯ãï G"ÿJAV¸É®çÉød{GûôðL%çþ›ü (çxøjõ«MÛxvE—áéP¿˼/«‰Áƒ”ë‹×ôÇ>ö±Cáš¹v Ó@2 J‘þ¦±»ew¼®!|‹A;öþç·Q´SÚäà«´ ÀÚ´i›}¬RÁª”$¹Q3·ÖÏþûþ—FÇÆ†Ê °±ؠÕÒÒšÊ.Øp+‘+ްvé’%÷vØá‹V®\}ÃހܴÌkgöÛ_á;Ûó¾¸Ò‘8ï × …*øâK.Yçð¸\äØÑÝÝÝÕÜÛÛ»Šà[Èõœï¹—_~e{GGÇ€O;Õ‘ÏÚ´ÍWû¨`Ù­jØ.„ðýïýkï”Æ{ú|Ì ÎÌëvíÝîé鵨b乕²2^;ãÐÕkVß½bÅŠFèh+Ï<óÌèÄÄD`ªóÁŨ§ýÂ~ öïÁßRæ}ñ3áºsç} 7n ŸzÊ©÷ZV`½8D×3¹¢qÞÝÖÖ¾ÚNÛè~ÊM–¾Ü €üÛߺýIÃ,™Ïý¬\tA›6ms§€ #7"ZTÁy!¼cÇŽî§žzê¹2øë™ÆÎ¨µµµzdtdȲ̜Ê©ˆtj¯_¶lù‹/nljjªºøâ‹+ñ|ìAY³ a?‹[!xkøfMœ÷Å @š÷­©© \qÅ•ßÁã©äv¶xjtÕ»}ûŽº´móy_¹àFñ<„רßþö·~gø»žóÍýÚZýjÓ6ì“ì·T¡ “?þñŸõÚ]ÖçÛŽj€uFèÆkÞÑ\›L¦&0 7š?£Ž þ~CccÓ÷¡ãk¨«««¾ä’KªÐ=SAYû+„Eçk1ûì/ðõ³©ÀW5ïÛÛÛ‹õš|¿rÃ ß …C— éspÝb…7Ó@Úéôض­Ûà&Ýè™÷Å‚NQíÔó÷£=úìöíÛ{$õ;&z§ ï¢ :òY›¶i2sº®¦iŠ ø‚-[¶*Øj`«…­žou|«uP÷oÞzi$ŽPŽ£¼ñÏák›¼,n¶$%Â6Ê¢¾®Î>ò¨#ñ ˜Jƹbie| ÜrltôÚ‰‰‰tj£?ýéO‡á}lT*²ÁcÊVYY™óXUU•òAgëÞß·oŸøxÉ?Æ‚ Êþ­çÍ…8ßà;ÝÏ_Ê÷Å”£ÎÎN ®3sÑ¢EÁÏ~öswÀuûNº&ÑB¡ ‘@f®q¸dSÛ¶mëŽÅb+¾ h¦XÑTÀ™kÚ¡…Mœ¬gHÞÄ{¿ô¥ë~ƒ_¶aØÐýãÛlT€±Ò­Õ¯6ms¬€å¶¡Î –ó‚Ç„Ñ6käÐQ}ï{ßý?U£‡Û~CoÛÉ@•ÞØ½»%›¶ÁçÒ¤ ,üû”êêš[€ ¤uÿüÏÿ ì®3d%ƒmmÚ´•:ž©6dfËP™ô8„-Œ}’á®Sl5èþæ7o}g$©pç{¹"0<óÂÙ9`ñq‹æ„C!ær[¹råäÊ+*°óBù3ìÔèo¡rÖÞ7@³:åÁ»ï¾»^¯Ìï˜osÂhS™&›îùáé‚ûT³í,ÃW4Æe1Í#Ž8¢âý—_þSè½U|½(Èá»§yÇŽe©tšå§ÀÒ|.åÄÓ0y‚ iþ7­4êëk]ommmmO^}õÕ7À Oð(‡ñ„ᔡ#ŸµiÛ?,@Ø ” Œ”ªö0iÕlÚ´iåµ×~ì\‹ûŒ½ÁWùÌ>”-S˜ Ì ‡Cƪ•«Æ–¯X^•…°‘¥n‡&t~O§R_‚ή=÷ßsÏ==†ÏÆ*„§ äéVÔû#|ñs1݈à{üñÇW^rÉ%÷Áýð‡o暎ņZ·ïر®Ã ºœÀiR¿†Q€Åçð êëØ`ÔÍ“náÿú°–––A+ ohøjÓ¶XTÁaŠŠ!\«RÁøÜû/ÿÀ‰§ŸvÚ±å˜Ýòy_Œ* «V -_¾¬. aǯŠP'ô5_„ŽoK"‘èûõ¯Ý‹ÅR³ áùâ¹°™ïlÃó|?üá,õ ðµŽÏ6 •ò50€p÷ŽÍ+RéT8•Le"ž¾-1(‚7Cá¼Æª…ë ¿ðó(B0^°ÿæ¯|å+ï}àzlðUj*ðú­šµi›-KÏ2²©I¤‚)5©ÒȦ&Qz’«‚Âÿñ7¾}ùò勳6¼éI†”–$>fdO0§Œ.é5kÖŒ,]²¤+eú(;ëŽ6=Ç?çèPO¤û_xá…ÎÍ›7ONÂ~ !<]jxñTçµç|¿rà '655Ý ;/%ÊⵉWbzÀ·µ¹y'ºÃ®Û™U»²%Ðy,¤9™k0 3õ‹òÏ%#ñáþp¼[zè¡ >ùÉOvSp=KpÑ´ [›¶Ù°ÐEWt¾ù`Y 3C‡QóÍ[o»°®¶¶¶¬³É¬&Cs‡²fbñâÅQQ)ÐBæÒñc'ôŸ°Ïoà¹}{Áî¾ûî³Ì„ó©á©@xñt©^¾ÓÞRà{ë­·¾~ÿÛáú‰ˆ^ ¸’á‹Å:šwî\f§ÓÑ휶ÓYàÊ\Ñ*£êÂq±üx¸î)W^TÀx]à5ʦd2µÕÛÀÎ=묳vÙ@Ê¢ )×|ík_ë d|î¹çt$µ6m³ `ÃPèçƒUAY¤Š«>õ_ûÚ×/„Ž"jHõ+ÌApXmèŒ+]Òk×­M,Z¸(œUÂŽœ%}¼ù%@üÇÐ9uŽŽöÜÿý]ñxÜ)Â~ .ˆ§c£ÙP½ùà‹W^G‡²6|íµ×Þ°»FŒ/pËKJðèzõÕÝ‹Óé”ÅR’)¦|m*#*]éoÀ’‡Â,öT¯J# —,Yâ—6ŒîƒëüÜãŽ;î9£H׳èñBðÂùÀ˜9€ Màƒ‘HĆócÃà5½eËWYkkÓž=[Fn•¬|AYáªeË–-ü·ÿÊy‘H8,ØPÍ î>ÓUÂW¦BV­Z•\¾|YHìÀ¨Ï¿g–…j¦:Þ¾G}´íÕW_MLÂs¡†ç ˆ§¼s_¼¾1Ï—àû¾÷½¯ ÀõíiÅÀ·¯¯ßîÝ»›Ré4[\á›ÆÏŸ‘ç}…¿Ýy^ÂðqÀ±*}ž_Q/Z´ˆ ðŠ ~ÁGñh!HŠð=òÈ#ácئ°†à>z¼Pѧá1÷©$@9ÙØØ˜EœÖÖ¦<{¶ oPVX€p•‘ ʪ• Œ$ªzÍk[úÿ>ûÙsAÁóØ£~gR”2¹ÀL„-Z˜>ä5ø\@ aS„p+ÜÞªytV=»víj}øá‡•=üL¸¤gij äX«wÖU/ÁËKbqD"Áê:#ì¾øÅ/³xñâûáY“súÂ×ééílkmm`y¾©d¶ÊUÚJK–àLYV‹-uˆ—T0©_P§ À ðŠ'`{÷† ~^DûfðÅ6]‘©åŠz%|nŽ wIÂ{MÂ6ï?çƒú35¬!¬MxvT°j>8B –öF€¯Â'œxâêÿˇÿ°U€Ù?+“'̳Ƶuõö†õ‡& ³¨P©a^7š‚À&àƒï…Nìÿ ÃÜʧý'?ùIO)žÏ žN O7p§ÞéT½ß¾¾>we£›oþê;ª««¿Ë’nø^gXÝÊá J°­­}Üf•ÛÒ.€ÝzÎånñý0è á‹ ñ¸ˆW¯^Í^ç^ño´„¿“§mã|oTn>¡‹±u°ÕÂgÕàÊK°%`ƒï8 ƒ–axÙ8œÏIøŒä–-[(ÕIÏ kÓž%ËóÁa•vçƒñù³Ï>{Ã{ÞóÞS±”LÎ`¶Ð9vHV€©aì¢Ñ¨½aÃúQ¸­¥NMTÂâ"üöyèlî„NgtȜՂýÉLB8Ÿ[z¦@<Ÿ¬Ð F¥ªÞràKÁV_Tv—_~ùÂ7~®… Å×RBO¼n8c;wîL ,ÈTlK2—3›ó¥ À2<11ήeR¿´á7:–+V°k¬xå¿¿ ¾^ßÓO?Ý‚6ŽÂûÖÁg5|á'Zxω±Xìv·À{ Á{ Àwî‡óƒÛÑÉ̉MhkÓž]ËùÁbdtµ„kÂï¼ø’£Ï;ï¼ã¹ .ÀäŽfå)y®p81Ö­]7X__· s~2§´ê ut‚Gò?çw?ýôÓ;JMUšn5| ¸ÐïL«^¾xý¢Ë™ÊJÞxãçÃot–˜qãu9gå0¼v`Ûöí¡øäd —–ÐD—³íØ®úÍ0¸xã- `YÁ¤|e£úmhh`W2d‹ñwáöÇv˜-ºž×¬Yª¯¯¯@µ [# b—455}ß}8]»¢ÚEèö¬{à\ìƒ ]$#ýýýè–N¼úê«nÑ amÀ3 a9?XŽŒ–!\+CøÊ«®>Fßs–+,ÀäŽÎ¤†d£EW®X9¶dÉâ*¶h’ä’;E!Àæi¸w<ÿj{{ûŽo}ë[±åË—O9JºTH0ž ðæs9ãŠF½½½pe~â_ÿµéÐC½ {tmsÏŠärÆ‘Úðð¾ææué´Î[%àX!Û»œ`)Æ(þÞž^v‹ ­®®Fo®¨~Êx,=kcûAW|\¬A ÛðÜ»?üpœÃeó¾ð|¤¶¶¶ >§>cyccãáÜœ Ï¿°jժΡ¡!{ ¾ó l=p^÷bFüF½¨ˆáü#„á±DkkkJCX›ðì¹¢-„£†7=©FRÁáÊO}ú3§wÜqëË0{ÊÊ®–„J7/Z”\½zUö³DtZ±®0·~x;¡y:ù]·Ýv[;tF%Õ‘.×-]Œ*Þ`¬ZŒbºÀ;UÕ‹.gÜçÖ[o½~#T½M2|ÅÕ¶È¥»ºº†;;»êÓvÚ$w3A-élx×ó5¤R“yÜÝÝe$áø¶x‹×ŠazníÚµìúÂcÄë‘`+W„°êqxÝc|æ3Ÿçm¶Þ¿à¿~¯[àý7Ác} ”·@Û\ÝÝÝñÅûá<’Þ ç²¶.øMz°ä+ÜÇ5ˆÇÄq$¤üq amÀsá°a•ö@ø ×]÷¦#8rMN!10+ç¾éëÀ•iX  V©_°ÀY{Èšd(‹9—ò¼°`îù8¨‘Às;wîÜ~ÇwŒ¨ÔðL(âbUñ|‚ñt@w:Á+ÃU/îsÍ5×,µw+ÀåÑÝLÞ•ËÙ¶Óñ¯¾šX‰n攸ž/»†lOU«,péZ3Ü¿sŠq€jîîé6Æá{“Ê!Lj=:øØÊ•+™ûY,Â!ÊÀÍ£ã,Ð>ðú^yå•óþýßÿ}®%Àµëáý¿ï½Ž4¿áÓçœsÎøü(þv±X,ûï!ÜÀí†[„ðømö¢*†Û~øœ!x| q€uJ§)iÓž[ %Q(a„ñ¹Êü_O:ñÄË)Îa>÷³õw 1W˜Ï S¾p$\a¬Y³j:—¨a¨]Ò 5ƒûèªû5t2-÷ÜsÏnè`JZÐaª .Ƴå|Ë-ª ;“àͧzñ8¸áZ¾æm·ÝöŽheå7dÕ‹ÆÒ|¤)î¶ß¶}{8>™¢Ëá‹ê—U¶x✯·œ$W¾b± Ãðþ-\wíìx)ÊK°%£ ÆméÒ¥ÆâÅ‹=%(©Ð5\hX¥†áu-O<ñÄe¿ýíoë }ü¼ß 74Ýõ»÷Þ{ñœÕñóÐ ð‡Ï\¿C~«o׸£ž·nÝ —Ý>„0)áNد! ï·/1¸?¦Ó”´iÏ„-C½|¡J ׊ ,Üç‚ .<âï|ç nž0UºO¦ùàl'š2*a1;Ûh´ÂY³æáººÚ:¹c´…Õjßñ%ǶÊ_|ðÁæÍ›7§-Z4í ž*ŒËóT@[,pg¼¤zñïë¯ÿò&Pt_H-·“ ¼L>×ëu9§RÉÑæ¯Z ô*±¸FšG:§YŠ‘à^ç|]׳Oà•‘uQcàVóŽíÌ%LƒÝL÷Å —’\·n]ÎÜ´ bšæTÂVtCËpÆsö£ýo'Ï:ë¬]Çü xÿ0(],­‰ùÁ&øÂœâ´ƒøöíÛû»ººzqƒ²¨†q^! çpP§)iÓž],çRÂ5 GÏ8ãMk¯¸òÊS¡S ¨L‘ Àîc”/Ì@œYQ ƒ³ðà9¼jåŠJ踂ŽT“W.c)|O,Å÷GxþNÉæoûÛmCCCÎL¸X—åirC—´!èN¼á ¯g5˜?û¹ÏÚÔÔô%ÖE¦ÔFdå(>ŽVƒC»[Zªá÷ §Ù\o¼b‡••̤µe.”Ҍǹuëög&XÐ[çY1R9ôÐC=µŸ)XVÀâœ0EFÓµ,Ïÿªî?óÌ3Æ“O>ilܸqÛ…^¸®Ý(\Û&ìƒç7È;H`¸M\»vílkkëáîè.à=°oÜâ|ñ@|¾»NSÒ¦þñ/_ºtéçPïåƒ>ϼ¾_¼h‰Drt×®W­‘ÑñJÇFwsVùfóÇEÀf.îR<>6ð}…ݧ5} ¶"ˆIùb™I‚¯ìzKbŠÅBÄïVÈ ->ÖÑÑaüüç?ÇÜ⎫®ºªº¾¾¾ é òM³úÖlcê! ·*atGcÚ¼~xçÎèŠF—4‚wWÃ,BöÄ4%8¬‰žž¦¤Mx– ,Î ûA¸Z¡‚]¯]»vá—®ÿòÙÐÉV¸ö(â¦CÊFI[\ gn—-[šX¶tiPNWÊY›Õû]ñfÿ=t0÷íÞ½û©ï}ï{óâéòtZ1À-º¥€÷Š+®lX·nݧà¼_ͯ+ ¼†û›bÔ|©éžžÞñŽŽ=UZ AkÛ^Ûu9»QÎS0ÀÌØÊ— I—AŒ‘ÎXf’ÊOªÔ/Ýge2…J]gUP–Jýâ"wÝu^›£×\sM|ùòåuð˜ÅÀ+·Œ7 Іð 섬£Û¶mC¼~c„p'ÜvbºwQè4%mÀsá|sÂÕ ìB¸©©©î¦›¿z΂ ª§`šëËÌÿ\c‡V]Ui,_±|lA}}•_ÄÜ›(ƒkä>•L&þë™gžùí/~ñ‹É| .Æ¥y6 \,h§º"xÍH$b~þóŸßJí ÎÅüZɉdW¹›ÉÐ%ÚÜüª5ŸˆGø2–i¶|`šƒ—”¯ À†áõ˜ø¸¿¯ÏhnÞá—€)‚WtGã|;\‰*—î‹ó½ªö¡ï.º£EÅKpFþìg?Ãô"ûýïÿÀ‘GYE¸2ðÂ~½.•J¹WÂbÂh¿Íø+¯¼Ò ï…÷é"¤;)M n‡uš’6 àùáh1®²ÜrË×Ï]²dq½Y€×cmznQˆ->?ÌW˜I¯\¹b¬ª²²ÖÅšG›ÙNû‘W 3ºóå—_¾ëî»ïf´ò‹š.ÄåÀx®¬Xà‚.·»»›ísþùçWœrÊ)ï‡ÃWÀù>1ûó^J¼cÏžToo_%@ÖÌ@‰/EÄ{Á[€qëÚ»×hiÙí¹“Eõ+‚ËKâêF²«YYÑíì÷<}U0ßÿøGãïÿ»qñÅ÷ŸtÒIõV>¯Îjdã&*fÊÆýøæà ·¹K: ð€kŸ¥)Áuàæ SšÜöë4%mÀó‚®à+Ï G¡c‰^wÝõ§m‹„ÏŽº X¾.èy\7÷ÑGÿ°£"Y×OD¤¼ª‘_ º"¨Êcâ}y˜@®JO¢ÇHýˆ›››_ýêWÆ…^;óÌ3kð1T¿_ê_H-Óëò@ØUÂVLSêëëCÕÛ#ì`iJ°a!ì; ÷1H:¥#¤µiÏ„Å9á°¤„«v•0rê‚ .<üâK.9>Æél…,ÃÈ ÔÁ˜ï–œë& 2gáÂ…½ `Àßa¯òQ¹¦·ó|ƒŽëñÉÉ»ï¸ãŽßïÞ½;U ŒËòL¹È–\²ÖÖV¶ßßøÆ (ÞŒF£WÁor:‡‚ÒëôŠ`L ìÚµ;h§íÛɬ՛âÐõ®mäBÕÈM%ÊÝ7[å*644~óÍ7=¶mëÖžÕ«WGá;¼~ÇjÙMóÀ”ç‹rùÀ«Šz–AL ›£¿õÏÚÕÕeüøÇ?6ÞúÖ·Žž{î¹°522ÂK£›ÔV=Îb Ìç…Ó/ì¦)Áùlooïðö„qÃ4%ØÝÔƒccc#p;ÉÓ”R¼EêyamÀ³a±v´áªB†Ž¥â ×]wʦc6­–]Ò\KÁXj74‹jUÍó…Ø3óÄ&89K—.Á@­JŒ˜–•’cù~Vq»°ÎìwÐ ý÷æÍÏþá˜,Æó È¥­³³ÓÄŽûúë¯_]__.|ï·Áù9NkX>§î•£¯âC¼Ã»v·Âû'*m7 *Í¢›ÝÅØg؆ìÕð¦y¬¼5Xqô/xà…û|' ¾°¢¤©©ÉxßûÞ÷±êêêCHýâc¨zUó½~ó¾ò¯ŸRçšEW4z1Pù}ôÑéóÎ;φ@”¯΂úÍÉ‘–•° Â!†å Ãc,BTðÐŽ;°Le/EHÃ>8/ÌVS‚]àþH,×¹ÂÚ4€gÂr±Ž²Î0îþ¾æ²K/{]8šYúàìñÉÏgÊYZR°ÞVT`:¼hñ¢tr¾"ü z¨<¼cP¿Þ·oß_n¹å–=c´b<Óp.²2pñvýúõÖå—_~<¨Ü·(Îó|”¤\}Õ®;]à£x&“--mx"A¸2•Ë`a»ù¼ÞA‘3eÇcc7ÝtããÛ¶míåðçÛ0ÛêêêR ð¿ÔÐÐp,F:Ó\p¡ùÞB V^Q—ø‚s}9äçmo{[”w`è`Ð/¾j,ïÔŒ|_®¡.f‰Æèjx_І‡SÉÞÞ^LSB%ŒóÂÝq†b`)Ï ËiJ¨„ù¼0B8… wëÖ­]¸®2ì w´¸šì;Ç5®Ó”´iÏ.„E%,®¤$»¤«|”°ë’>îØãV«óK°èž6 Ä|±vÖÙñ—¨Š««ªÄ“õõõ‹<7¼º#,U'CÚ2}&–ÀÜ Ûß {:°g¿óïlµìˆPžM0#d¹ûÕ}ìsŸûÜ2Px ¶¸ž,_Sv•§ô…aæ›#ç É]|#\©hOçÞñ¾¾þZxˈcgÁën4ÇëSÑ,?€sç…é6‘L¤øùÏŸ¿ï¾{·ÂqÁå<.W¸?ÆŸÃýâ·ÜrËõ ˆ//EûØO‹û<õÔSìþé§Ÿž8ꨣXu+,¡ Hs®æ]ã8Â…–²L_,«aÑ-Ï ó\a¼µyªKSÚ²eKÀ¸WPÂl5%üöëƒÛ!¦¤Mxn œ/8«R`Ú¢Y—ô.½ô²×E+¢!?%œ Ýüv³2`Wºá¹ÊŠŠôÂE ‡Q‰0œÚGËY êØõ£g:À¸íÀ[Ü Ã:¼í»wïî¸óÎ;=U3DPc"\Ï9çÜðqÇ»°ººz ¼Ïbøî‹à;/ ëáö¸]\è=UÀõD£ûC;ûÔà`l¼­c‘J&kXž*;¨tOD3ƒ_µH¹Qwe¸¯¯oäæ›nzbûöm½†w¾WT¾â-y’o <µ_ýêW?][[ûÿ°-øÍÿúV¥xýÀüâ‹/²J\'Ÿ|râ¸ãŽÃ€g O6À×B›Á 1nMÄÍ®õÚ€i„L£$ûgq%Ìn±„4º£¬“Û¶msWSÅ»—*gé4%mÀ³ aÃðf‰¹Â~.é*IËŽÖ/XPóéOæ 0â_ne¨Y2€³ÇêuK›†)}0÷tÀ]W6 õuu‰ êÇAíÔX8‰\Lb¥­R~Û<Ì„Nç“÷òÎ#LÓ~·8¼Çm jXë‚iúÝs@›ºx:°ÃîììJ àô‚eÓ\$)^Ç\Íw3SÚBD³2å`±äd"žH=òÈ#Û¾ûÝÿ|Q€© ß1Õ;É•2ƒ/?ß)€ð‡ªªª¾fe¬`•ß­¬~éœb‘ ̧>þøãÓ¯{ÝëÒñÜÑÑaã'°™¼ü¥‰×íŒ{ÓnJ4¬€eTXù]ÑâµëW°C ÎÂyaa¶šRssó@WWW7­¦„sÂ莆}ÙjJ###1¦¤MxvÕ°¨„E«Ô° `Opn'¾þ ˯¹æš›ššª§À2‡QÖ|ý”¯^¥Ë™T¯_r§„ßPü`dc¡4#?ðâ¶e˦|«ªªR'žxâ0\ë𘃽0‡¯…‹Yв‡¸‰FèÇ“NöÚò6h¹A‚ù~ÿ|ÁY"„ùÜ0-i˜ìëëc«)áB!Í«f±4%Ø·—4„ï:ŽKê4%mÀ³a+KZœ®”\)¹¤™‚>ãŒ7­úÀ?øº ªL…KÚ_ùª•d>¹vštke€œ‰ÔvÜõŠqÞ¸²²r:Ï¡ºÚ£ººº#»çéU‚Îf½djFFFºF,6T P ŽéYÀ€ëSÙ¶ï’9Ÿá™óÍ8g.Xy?ó7¨«Þ¯ÝrËÓíím1AÁN €W€Wœë¥@+‚oZØÀ9ó˜7ÞxãFáÃð›/+¼¢BFiìÙ³‡ëM›6õmܸ±ò¹çžCè…-Z„-ƒ<]Â*%œ€â„“mŽ!øˆºP ¨4%Up–\¾’VSÀÚT¾rhhh  Ý###´C'Ÿîâå+ÙjJp=% Tø:MI›ðÌ@¸—´¬†Å”¥JI W ûâ|[ø£×~ì¸ÓÏ8cC8” `?—´X´j’)¸¤) +«Œ3@v˜r†ÑF86œU£DeK´[œÃ€Kç©HKÓ½>.æìcБ'žzò‰Ý?øÁ÷_•5‘GõN(ï„‘á,«^Ñål _²/~ñ‹5Ó‡à—9Y,Å)¯u  5Ø[˜^<ì°ÃA W|£Ó0€f‡«I«/aU,îŠV‚XtG¶{É›F]È2"5„åò•†aäͦya¬œ…ó´sçν{÷vñ9`6'ŒnitGÃý}°Ï ì:ŠÖiJÚ4€çÆ%­š–ç‡e‹€®^^¾|yí•W]s̱Ç»—;œ1{~;±R”Ð)–X4¹vU´™Cξ“iøˆuÕÇ©}ÕŽˆ,é)Wìêþ€%¯$¨_3#Q„ï/~ép .À##ÃñÇ{lçÿëŽW°“—À+¦M( ;áãnNRz‘ìr. W_}udÕªU¿€»çÊê­µµ•åùf\èÃÏ­_¿>‹ÅêFFFj _ØXÁ !ï—wÙ²eF}}½À*› Âø-÷g© ŒÊ å[.Ô/UIµ)a„0ÎbiJmmmƒ---!¥*÷Rå,œ†×é4%mÀsa9g8 PÃù± aW ã¶pá¢ê+¯ºê˜N8qºñTU±D“´dÓÚ‰êEGf „gŸ«¨$EÿϰÚñ¢Y&±#þ)V€ŽÆ1…ÝÄHdÇ“ƒ›-•¯ðº"s‡/ ¥«`pnVÀ±ØàÄïÿû?¾û®m˜Êbd¥d—³ _?ð&$ð¦ª`U ° Á@·3BM^Ï—‰E9üPI¯\¹R=O/]Wôx%®“mZ¸†&ûާÒlj¡>dAZªÅ6äu±Åyl)¢Û‚Ì,þ]qùÏšcŽ9&€‘ÝX>›oA¾±¿1v#Vccãœ;À$Âüó5„µi7l ?üð«êêê®äJq¬­­m3( l€ý¾¸¶¾8÷KêÁ+BWÌ!&SÎ/Â!ŒêY¯d„xát6ˆ×ÉF‡…!,ªaÚ(W˜r Œ·nšÒ®]»ú÷îÝ‹ÀeÒ”¦„«)õé4%m3iA} ¼ŸÔ°©£]…bYÀ”B)MJª¸‚wÔ*·tXØBÏ=·9[ÎEû¶\sæ›ÿáõÖ/ †B²½¾Nñû8ÿ¿½7ý’óªÎ¾OÍU=·ZÝ-µZƒ-ɲ-Û€§‡IŒ y€Ld9I+k…¬ Ÿß¯ï’oÉz ™ Y@â× Œ‰ `,ÛÑdÍcw«ÕcuUwWÕýìëÔÙ·v>wUɶ¦î}yÝ«æQ²~u³÷µ»\^–cIKæAøvo‡ßʾރû-//¯=ú?W¾õÍo¾ûöÛÿ=cZ÷÷×½åf¯7t„–™ùà¿#þRó{êëí_ ` _v||ü™/ã~¡yÎÛ̙ކåh:Jîï_†ÞFÚ½û”½½½¨\5 °Iúûº¶ß—D?flŸ°¬XÊ€F›ž6Ý0³Õu3\Ì™b&íÞ–™Ð|9pÌÞ¾pä~Xd²ö3ð–¹*š—žœö×¼+Êâ"«þþ~ÄV&¦eñõ¼ÍËØˆJ]®ãK½™}ÞŸÏÚ#i9:Ô/ì'g‰â¬8º{Â.9kíÆËhS¢ï ñ•WEj–¦D÷›ÅHCmSR©¾»ËÒ)±”˜äˆå²tÞm!à€ƒËÒææqŽþȾòÝ—OÓqÿîÑ?¶ùçžûäÎ'ŸzjçƒGvŒïHaLÒ-}È÷·¤ú"£[úŸßƒKF•ꥋç?6säõׯ¾ùæÓ¨ò lto¨Å,Ý5ï9ë&¹²ù©nîô'C€È4{ÌS%,1~•€ú› ÇÏœ9sŽ 1NÇ0 .œ/â¾it? _v޲H÷~jì6qžO¥«EÂ366ÖE¿E‰¯ãû7ýì¨GfKËôßâÁ“î7\ÌÇ÷k÷~ýÜk¾Í]—÷I»‹ùmÛ¶õ?ñĶM)ÓüUa[”°$ 'œn*CYØ)¤ˆ=÷Üs5mSR©¾snؘmKíqÈç=‡œÀ8ßɋױ¯;88X|î“ÏO|ä#Ù±ÿÀÁ‘ÑQTU§R>iÛ¹à–¡ïØ€û 9` b¿|ùÒ܉ǯ¿õæ›×~üã×®!„ßnèQ­xC§¡½ÝšIѸ“àÅßKû÷þ¬ ½½½Xz¡Ó?üáÿÀc§OŸ¾Hîr7ñd”à1ç‹)^®@ÐÅß™”,¬bH…–rZp @é–åó°C†Ë¥×@n°(KVG‡;*ôm®4ø½S¤ë† pÊé ½]z–lS UH£MÉgÙ6%¬ž#žr!W\hÇ环Óýè´L?zVµMI¥¾·@ì÷û0ÎN `AØñã´¿¿?ÿØc?¸ÿðäääÀøøŽ¾íÛG{‡· ÷äü®n—¡ß‹k6ï ÀØ»½qcvåúÌõ2B1.^¸°xêäÉùcÇ~9ç€Ûh]¾!×»–àn»î]¯ø»h7.\¸PÀò3ËÌ“ÏÍÌÌ Xâ\vF¯o‘À›²ËÎ2´BB7-ÆÊóü×Ð ¹L `œg "3ZNPò[“Úõ ¯Ñ_ ¸aûÜô{#Gð!'œI'\µ8aY ægH{Ò ‚*WHó4¥k¡iJ€0óôµMI¥¾‡AœNqÖj¾KεqÃI®X¾nÚ?öîÛ×ûÐÁ‡†÷î{ ½Èccãý#ÛGzúàR+¢»ýkÓÀp³óós²SS×–._º´töìÙ…_þòyr U“\…î/û'-5Kø®wÛ5ï9j঵7ÞÛ _ÏcNo^’ØÿÝIàÚøÒŸ% <L§½äF p¿n :Sئš8v•€CÎß7fÌ0L·mÛf!ênØ£F‘l¯° «APÇH)ß2Ò°–•’z…y_¦Ëä°zæÌ™ÙË—/s›Òe]OS"hÏk›’ê½J÷€ß£Äþp¨bÚ˜ä=âŒçV³Lsm\r®Í‘MpÅoiÜþƒ}þܹ:fMkQrÓccc¥ÁÁ|__ž\t¶··7GG¾TêÉõô”²ÅR)W*Òi±€Aí™B¡˜E )ù†:æúVW«tZYǜܕ•Ê:ýƒE§åµr¹\+//¯/——×–—Öæ×ÈaT=ˆ5Úu³± Ìw»!øú^8ÜvÐ ííÞqÇÛæ§PDn ÷Þ«=„ò:ý‰Ì¬¬šíä„óÙLÒ“øýz{Àm+¤]›’½þÀhSÊœ;w®%ºukøÿ סM‰à›Â!Ú”î{U«ÀwÄî÷z a†\ÝÖÌÆýâLÀÙæºoÈgº±Яþýâ_¦#äêw>ÉãFmNCGR¿u;ðúŽ·Ö¨I‡ÿøzàH‚îÝoË÷=88XŸššZ§JØ"ýuœ%øÙ*{ºŒHÊ,ZBŠa¼ç–†] Rʯn¨Ð‰8à$eŸ0$Û•x¿bà û}ÂI—Y¶M‰žg¡ap1ýá¤,„·‘.岉]fÇîC˜Þ'·)ex}~÷îÝÛá'N  ‡…0˜`M?B iÚ¦¤Rß 6tÆ>ˆÓ!gZ²Î&:Û¥îcÙj%Ï››.Ü-xÞRoýo»S>Zº®ÀßhóÞïØ2s§¿wø+÷Î;ï4öíÛ‡ÏVÁ ´¬Èl/¶DdKp.D°ÀeTÿÚ¥l<•tŽ!€I§Ê-Gn+aƒsöû}¥††‡‡[`ªö0Þ÷`:cÉ ×âTÚÌVÖÌÝ֗ϵÀ> ÄI{Å aÓ ÙH¹T0|ÀÔŽ;†è³fa#ª£ãLSéjµš¦4öÿl#“k®)„U à»bïúȃWäÁXVQ¯›ÕÔÀÜéðá.Ÿ_8cZ÷¯Sm“â¾õ.œï­õ.\nWn÷^o@ üƒ?99¹ÚÌ‘°@—ƒÝßG€%þLòÜÜ>KUÊIËÑG4š8‹ ­ØõÊ´,¾ß&¡ ÁûËÞíÜps9Ú˜ÁlÆ,Õ"³†Ï–N™9‚pn ûËáþÿ¼IN˜S³Ü>9¦GåGFFú>œ>~üx†ÅKÒüÿ@¼¸¸ˆiJöE¸WX!¬Rß;ËÓÒM6ÄùºŸFšÙ€Î´o&áyÛ9áNNrÀ·ßn‚q½ Ð&¹ÜNN÷^oì‚ñ9ÆÇÇkW¯^]Å# ™@a“»KDl°P4??o!Œ~]¹-“®d%´¿¬ÌEW|ž—Ÿ¥ë•}ÂÜKì–Á[o Ï6l0z…1W˜þäªxôz ÕuzÈ —òñÄþ¾p‡èJ>oIŒøJ8ÜÇ{l Ìÿ_±†Êår¦··×î ã¾ì¡# U à{×wc¯Öè­IàÍ$À7ýœáNWõ.@ÜÍ‘ÚMÝ$£õ©§ž²yÌäLm{M±Xä¥g¸º@ì–Yq½}B3a¸5¸†)vÁËÊìl¥;f'ÉN—!*!ηó׉ekvÂ(K‚o(ºRÎ&<šJ`o˜åu‚pÔ0#=ÅfõcÄ¡,i¿Õ*bû]¬¬¬ á ÞyìØ± ýx‰g #ºÿaéËÑ(΂IÆŸý™Ø^a…°J|o¹b‰Ú`ìïÉ&™§iÓE!ÖûtÀÝ,A7Lw{À˜Ö;œ&-'o*èv‚ðÔÔT„åaL‚Æí®Û Ž?; pyiiÉî ïܹ9ÈiWÄ› -GË%hyÃXöâòy™š533cA)0¿žX>ßpŸ–Ð/œM™¥Zö(UðœåŠ)ì¼ÁÅ'AX.GK0‹ iûÿÁÕ~'‡Þáò£-€9Ú“àb9zmmÍVGÓå*þLÐ+L÷Õ^a•ørÅþuÔÆ©˜ÓmÜr7GÊt.ÂJ*Äò!Üíp7 n´j§ÛB¯cÚA÷~o„qyrr²šËå¬h¶€0»`ÈÎå%(–ËesùòeŒ´½äÖ6-Kf%UGË¡ ìx¥kf0ócÙñ²Fj–ïv !‡Œ*l{jÛ”Rf±†û¤Ìj͘érÕl''Œà^öN‚°ß¦äxÃ4%÷<©‡~x ¡6W¯^åøÊ /G“[Ns›œ0ÀMÐF¯0žO{…U à{|‰Ú˜pûOªSm–’;v ÞN¸ÓRt70¾•ÓN‡Ù¬ÐM‚0XwéÒ¥ˆ ÌíB»`ùÝð¾0` 8¢–xg]1pÄËѾÅ>Êý`¹-+ƒ÷å j†0†8´](-ŸÏ5”˘…u„m4ó49áQ‚p>k—œågJòêæ$2Œ4„/^¼˜vN8ÃmJ8ès¦e¯0Ax 6Ú+¬Ö¯à¾pÆ&àŠM@îæèf7é|ÛÒ¥#6]€´Èvr·›ºm Ü ˜®ïÛ·Ï.Gv>x±/,ÎÛë ÂÅìÞ½;늗£¥øv¼;]vÁÄÂrOËÑ8„C{ÁIθµB:mjMÓ³N½Â=¢BÚ¯ÖöP´ ì½Âø^²øÁòÀlËçóìH‹=a cú.¬„Ñ+Œýv+¬RßG0î·³iÖ÷Ünƒ8:Øt€hèúNç·$p;A-Já*A"Bì¢tÂXåÂ,#Z”ªÕª¹pá‚Ù³gZ`S”)ù6Ir9ZV?‡\¬t²ÂIN˜ïÏ{Äòùÿ!‚ðb-²s…ñ‘fWVÒlú ù`j—\z–ÿ¿%€8î„ÁX,ÝOLL Á XãÔ,TE³ÆRÁ:Ý×ׇ 鼆v(€U›Ȧ8Û6ÕÅãMuäv0îÜ Ü÷a» àre´ÛŒ1w€öŽ Â9á¢'¹†Ð_†NÚö0»^!?¹Ì¸<==½Á KH'-OKæ²¶0k 醹QYmö ò-€å÷ Ë·û.?Ô¦äFæÈ妯ÇÇP|% œqËÕY¾LßjqqÑŽ4D`‡ö +€U› ÈIPîÖɾèš.aÜ-D£.®À}Fųƒ›uÂXVÅ1Z—8°ƒ¿STQ;'l!ÌN8©:Z^ÇNØw—¾ÆíXçb0ÞÆ)9Æ Ð í+ûKÜÏŽ¦Úhîà,T×LÌþ¶žBËR´±_¨Õnê·'¹ëМھ}{2ÕOž¼B0íöº÷ü6ßÇuúÓáDˆ„ˆX€° ëp0´ç1táüùóØΕJ%†`Ûêh?qJ§ÉÇI7ì/G'A7aÉ×ÁéC½˜Ì„¹Âuº™ðåhÍö £Bš'6IðÊóíB;Äÿc²W8>ÿÈ#ìD›ÒÂÂBZºaW¤•¡6i|‡Ø¡½Â `Õ€r8'ïvXA{‡!üî»ïFà Ìàã–$¸â†•Ñ8½c8a@˜s¤äRmRŸp’æ-éZùz¾,!ì·Ý24?>îN!¾²nÛ”VÖÖÍ4Ýe´·Øòÿ;[¹/Ü®_8Ð+Œ;Z'Œ»„Ñ+Ü`ìŒQ! ·Œï‹ Ú+¬V)œ7Ü5Õ®Úæƒ=Õí‡p„*\@x~~>Â2¯Œ«\JVƒ{‡ñ ¸V·'ŒQ• ¨”„]7}Â`xÎP1»Q9Ê0©ˆË¿.T¼…^á¾LÊ,×vˆCu½f®-­„Kv¤¡¬ö+¥ý}aƒpÂ-mJ¸íÑGÇžðôôtÚÁ7Ë©Y¸+ µÜjBÚïÖÿgÀ*•ÂsóA8åœ0COþt䊵ìÞ°[½°Т499ig Ëêh†`è÷Zh _K×+c/q=ŠÁ¸OXfFû  -GK0çlqV³W¸AÏ»N×M/¯˜íá‚›+ í£ù½·sÂbCç<8Šjék×®µ8a^ŽFu4}Çi—š…”-£ `•Jµ… ì²xÕ#î ˆ"Ìa¹ááá´ƒfJ¦^…œ0C°¬’†dJVh¤!–£1¹)äxCÀ ¹e;Òж)5¾N¿+¦–á¢íö\mâd¥„Ýg”N—ó8¿ÿ~ô §/_¾Ü²$m\qö„K¥’]ަï¡"z…5°C¬R©63„ÉuEÓÓÓØë5ÎíÚ~r€ŒS¸VÄVÒÓäFFFÒ@‰-J¾;æ`vÀ¸Ìç}Ig;;;›¸rÅþy¼ŽmS"Ç»h;"Gs®WØ_ŠMUòi˜º©À¼wïÞaô Ÿ={6nSâiJÆí à #Cš>' ¬½Â `•JµÙ!Œ%OÄ$¢WÎv““Fô ã:8ã+W®Ø!£££iÎHö{g}û}¨X–×s<¥tµ b^ŽÞ¶m[ lý6$´LÉ!¾#ƪºí^'ŒÇÒ€p~o – æ‡Ú•øóømJb9šç0ã»±ÅY)^>}:ízˆ­æ}aŽ®°7k¯°X¥Rm13dá‚ÝÞ0fù­Jvü!ævîÜ™‘…YIÕÑÒ12„ý içÄÛ”°MλÅáúùÓ~Z–øÌñù>rÂåZdVí\acæ*US£óÛzšÒInØ/ÒJ*ÖûÂi¶Ã¸ ö Âñ$%Αœ!Ø¡½Â `•Jµ‰!ìÀÑaôÿ:§uàîõæ´ƒÈ%’éUäð2ìý*è¤- _9ÆNŠ ô«£ù6nm åF—¤é@¯píIô±èç…Yª®Y'Œâ,ùþCKÒþ _XBwsX».ME›’«šn ì §oÝ0;´WX¬R©¶†Ž!|ýúõˆ—£Â<ÖÐ%1ží;99™á=aRIàò ²øzv¡B+ÜÖnOØßöA,"½>YT_‰OµB?>¦èú±¾‚œã÷Ô3,oO‚°ä€ï'û¹ÀެØŽ—¤‘˜U©T¸MIö +„À*•j“C8nÿáxJ·*̲à! Ú=á½{÷º¹­…Y>ÈBà‚¤f'Î˾ü|[ óùPh‡„.ö†àþaç £BzžË¤MumÝ\[l˜Ñ¾;Ò0É û‘–~®´øA!‹³[8á4AxìÔ©Si׺çG£ «ùµfà„SôÞSø.4°C¬R©¶„‘„Ås…Ù³æ%†ñÜÜ ”{ðÁ³!·s¡°ˆ—£%<¥£EUt“Ú”ü÷À?"†ˆ¶ kuÓH5ÌZ-2S‹e3Úßcйl \Âü^ü0®îZ-½ÂØîÅùC‡bO˜¾kë‚M3QË:aTN£W—Ñ+ìvðŸ™þÍU«TªMar\ÑÕ«Wm‹F41!.Ìâ‡ñã1÷öÝwßÅìÛ¡>át`y7i9š—¤e±•ÓhÏ—å÷ã2OyâËÍ6¥È !°mJÍ03µDî+™W]í¿ç¤%éÐ ‡æÝã^á´›–T¢ïjEX×®]KËÀŽ••›šEàå>a{`›>F{…À*•jsBø§?ý) ¼Žjgv¸ ×à=aãF:˜ÙËKKK¥S§NY;'xË£ !ÐÁ°•UÕ€_9÷m§(IàÊ6¥Pb–_´E/o{…ÖëñòöôRÅlëi˜þba€CÕÒò¶@¥´tÂÚQzðÁQ¹té’]zÆmÜ¢„S\‡6¥B¡žMÑw»æ;"ÝV«TªÍ á{ÂÖ »q†ì|ýìh ‚ååesâÄ sèС¬ë÷Mìö¡æWGso¯Ì–—ËÑ8Ïó„C–¦oö gl~ôº{Ìl®¸a†zZ+¤}7Ìà•·Éâ¬@¯p†Ó³öìÙƒÀŽôùóç㑆é¦à†Óôã"7Œêhã Ý4°C¬R©6/„mõ-CÅ@äÂ,lÁa7ÌÁ.I»H˸_˜ aŽ?n!Ì3…yÀ‡?G؇™tÂ|½ÜÍ%ÆýyOö]o»jiÆYž+L^uÀž¯¬šýÆé-mXn–.؇²aq»ì¶t ÑgGjVÚOÍb à Óô  ìP«Tª-a,GɋŨ sv´°9¶èرcÑÃ?œ£ûó~e*´üÜÉ ËÛa\'C>¸*ûÐrpƒâ¤v¥Ðõ½®M©Rk>ÏruÍÐ¯Ž¸WØÿ1ÑnÎ0N¹8‹—§E†4vàº,G“»Íú-J®ÄÜö ã —é~©çž{n]!¬V©T›ÂSSS¨†Fûä'&&6@Øï7%-G£8ŒŸCs@@.Ó{ º_ÿ:?Ò”ïi çz…ëÜ+\µmJÛ\›’ߢÔÎ 'AX´)¡ :õàƒ"°#sáÂ…àHCîæ¹ÂÚ+¬V©T›Âä´"‚°×;88WE¼8Íô^’¶ËѸƒçéªÜ®]»2ÎñuÝ'ìçCËÛe›ß Ì•Òö‚åã’z†m¯0ݯÒ—l–ØAçGû{¿·P”%C7 Âi¶ÁtÝž={l`Çùóç3þHC.ÎÂXCì ÂøŽŸ{î9…°X¥RmRcYN‰TÒ¨€íš´—±+$X'Œq†ì„Cð•}ÂÒ]&9a¾No1„eµ´Ì•öAìgKË÷"ç gRirÀ:æ £M)²mJw˜`ÿ½3ˆýiJ^…4ö~ñ¤-HgΜÉÈ‘†¼' `#ºÒˆ¯\%i¯°X¥RmN§œf/ž21Îã6®œ¨/]ºæ|ðÁØ KªŽ¶ÿ y-J>è°'ÌŽW¶*!*Ó‡ª„|»Á ryZVHs¯0ÞE%Z3×fl ×äé6ùøvQ–m ,AŒÇS;wîļàôÉ“'årt<ÈçQ!](°·µêz… `•JµY!|øðáhzz:âYÂîÀž°\Ž&7ä0Œ?¤ûzè¡´D*iŠ’®Ÿ˜å'O…Ü'C84®o]çCš÷…ù} æáA˜àOÎûÚ‚ëÎç’¾·àþpmJ—¢×MŸ8q"NÍâ iá4*¤á„ Ö)ü ¡?›Ô;ï¼S×^a°J¥Ú„F*fׄ. E@ÆyÖÁÂù©©)ë„y䑌[jÞa™Í×qv´Ÿ˜Å§ì†¥†ªÕj B9iɳúè9áÌÜÜ\ÚßæAH̾0]UÕ^a°J¥Ú„v ‰!|ýúuÛ¢Äwal\HGWâHéþæ¿øEŽ bg ãéºíF¶ËŽö3¤eì%ª¦±dŽêhY-pRu´ß¾ÄÓ”ri³¸Ž½e‚5{…Gèú>7W8Ô/,]0¿738Âp¸øèì -)@xvv6Ž«d'lܾ0‚Oˆ+ø³ÁŸ‘Ñ^a°J¥Útn˜!l¡ÊKÑrYš#,yŸØ¸~arr%‚°yì±ÇìLaß {¯Õâ„eŸp¨( ò+¤fìhç~“ö…ouäZR³–×ëfŽœv \£ç,Û~wIUÒ ½Â¼ÓúÑb÷„§§§Ór’’ÌÆ’5b+ Ô©¬¹ÀŽH÷…À*•jBø©§ž²{¼â+Á=‚`C,G7œŽ—£‘åü?ÿó?æ‰'žÈºÉKÆ–@îf”¡<Ø ã>8¡0ŽPEt¨ KžB}ÙŒ)Û^áÙÐŒ™_©Ú6¥‘¾žàô%YÚ_’„½Á\1žq@.:th½ÂW®\Ió4|5¨œ†¸:Ú­0h`‡X¥RmVÿô§?äLa]!=‹“³P ¹Â,qˆ–¡èg?ûYDÎ!fQ¶)I¨úÀ ;¦QºÌ1Ú”¤;nS)—²“z…{0¶îVµN82KôÑ0Òû @?°ƒZ’æÇÜpÜ+|ðàÁáb±˜9wî\ÆÝd]ðÊÊJ¼].—ÓôY5°C¬R©69„ãq†€0Aã #‚GWrb'eÅŽÕÊo¿ý¶ùЇ>”ëëëKÉÀé‚}7Ìæ4¬¤q€2¾’ÊNŠ£ô«¤“œ0z/™lÚ.IãÖzÉéŲèµs…Û)´$ û#¹W8µ{÷îA,7Ÿ9s&ívØ6%‚.–§íž0A¸¬ `•Jµ <55"€°›'lÛ‘8¾Òµ)Å3…q?áìàà`Ú:ªŽ–ŽX¶ò\c| ±ä’5GW†–›“B9$ÀCûÅÜ+¼DNñ\á…e›š•7&è°%€}÷Þ¡8‹—¤ …‚ÝæjhÙ¦„ËÈÆV¼v(€U*Õ€°¹9SØeqU4GWòa¼™Â¼½mÛ6@€NuªŽµ(Ió²/;a \NÍ’ñ˜I“•’ µxɘÏعÂìȘU@x± áB.úÎ÷„Ù c¼ÍHClúöa/øÄ‰qjï »6?:ØÑÐ^a°J¥Úd6n¦0 ,f 7|€Ã9b(»ùÂ(œŠP˜õØcåFGGÓÜ{ ë``ÉêèÐ4"yN˜÷‚ÙQW*•޳„ÒÆ´¯æƒùœMͪ»Çà oï¿Ù+œÄ<O˜¯K‚0÷ »ÀŽñcÇŽ¥¾œžeD›ýà5îV+€U*Õ&„ð¾}ûÐ’d³£Å~°=ƒð^ŽvX–hQzøá‡s˜¤$p¨¿6T˜JÎbq|¥¬zF`‡{ŒýýàPzVó½D.5«îC3³T6ÛèþÜ+,]°| ?9‹?cÂr4»avà‡ËøñãÇy)º%°ƒ~hØèJ ìP«Tª-až)¼´´d‡8D7e«£]Ñ•ÝæpÂäæpšß³gO‹–ÐepùyÒr¿×wÅ d,yË¥e@8TéÌ Mr¾Iî9c;š½Â5Ø1»¼bê ‚³˜+œT!í»`™(8K»•ë„ Â£€°¿M¯g¯+—Ë ìP«Tª-aÌÆ8C̆8;𓳨1SøÔ©SX–Îïß¿?ínó[…°_ ji„ea–¨CùѾÓõo—·ù°î#¯ W¸V³ïm~¥bÛ”†Å\á$ùs’ñÜxŽ„%i[€å¢+GNŸ>¾zõj>nŸ_;À*•jóAxÃ8ÃÁÁAÛ~„»¸A65Ë ’{Ãrå{챌».±:Z:F åPXŸAýÉ>CÐM‚§0‚þ…^©×èrÆTV×Ìt#²ÅYœ0ß.?“aw=;a«x`˜~d½^aÛ'l4°C¬R©¶„yœ¡s¡-XäGÇÁ€.>ÈÍæ>üág8¡Q:áÐ(C,ך¡A¾£äiJìnqN84®0´üÜÍ‘£÷Ñ›I›29áš{Üôb£Ù+쪨“ª¤“ú…CÒîs°ØC@Då©S§@oØïk`‡X¥RmËq†hQhá‚ݲtË4%wjC;èþ¥Ÿþô§¹'Ÿ|2ëÚ~RI!Ò5ÊåèvûÃØ–Åý¹MIÂÖoIJZ’–ÏÅÂì@y4º“‘š5ÒW2Å|~Ãû-Gûƒ¸Y8}Y!š˜˜è„?/Gó¾0WGãT;À*•j‹A˜'(!Â’s£Ý‡º{X<Öpvv¶ôæ›oš§Ÿ~Úqpî4%å;á¤=áÐ'ÌÒì|¹MI>Q™´\-Ã:d` \s×Í,Ff¤ß´Ìn'ßÅã9CÒî4î„w;vL:à¸8‹a¸MÎ2Ø¡V©T›Â-3…Ýu¶¸@`AìÀËÅAöáØC&GÏ<óL®X,¦8ºÒ‡“ªŒÈeN°1ƒ–Û”B‰X¬Òí&Ín®D~t#î¾¾T6Ãõ†é+6Ü?äì¥æÏ(ÎJ;H£WmJ;„åHÃxOסO˜>?Ú”4°C¬R©6©n™)Œåh$gApÅrœ¡qÜ7¼´´Ôóú믛gŸ}ÖqàÀ Xß CܦÔn”¡„0/or åvIñ•¡ÃBs…×ê¦Q¯™š‰ÌòŠMÐâ^á蓪£åç A˜Ä½Âc'NœHÏÎÎÊ él¦ù %ƒüèžžž4 Ñ4°C¬R©69„ÅLagèÖ›-Ãõ:qº`>àz+•JtäÈ@ØqKÜ-~¿NXîÿbŸ8´Ô,G†\q»<éf¯pݬ» è¦óÃ}=]}r©/гì 7M©øè£Žž:u*;55ÕR˜Ån_9–¢1ìáÆ•¬»^a ìP«TªÍa9S˜ÇÂíÄhQ"h‚Nö`7ŒÇV«Õè7Þ(<ýôÓ¹‘‘‘–ÀޤÒ)Êœç$ cO­I|;Ÿ—nX>Ö¿>]™ó%ô Ó§ªÖš3Œ—É Ó4ÛÂüƒ¡Û i>³…¹M /œ:tèв¡/]ºWHst¥ë)Nc)š~Üàq<—v(€U*Õæƒ0OR2“““v)à%øÅYr)ZìIÖØ†‹Î¥AK…ª¢¥[Ä!+£ýªh¢’t±€²Zé‚“b*ÛÁ9O Mg3ÍÀº®ŒJlz®‘þÞ¶  žàó\œ%nçêh8a³ÿþô Ÿ;wÎ’WÆW·/ /..Ú^a÷çS×6%°J¥Úd†Ã%GfǺþÝxˆƒÛƒˆíÒ4æ óXC,]ÿä'?‰>üáçvíÚx$FWúËÑ¡y¡ˀ.ƒ‚MO’Mš7ê#¶ÿˆÓûéÍ„ѦTÃ\acf\›÷ û—×ùaìö½â, av ¡úÙv´LTbgŒ=a‚°uÃëUíV«TªÍ a9I)rã kkk˜ ï »°ŽxI…[o¿ý¶ãÞ½{3Ò K8ùÁI…Y¾#æË¼x ÷Kè† ë;W¾ 8¶ r°N[×m¯0Ú”à„{L ŒÛ;9aY-÷½ýiJü™vïÞÍ‘šÕ²$¯Ò䄱"¯+„À*•jBXNRÂîvËÏA'ŒãèÑ£6ºò¡‡J;8mØö÷M% dV4ÃL˜“³øù: a~p'Û¼ÉíûÒ}ä„1M ¦Û¶)‘ÞÖßkJyÓÖ û?":¸}î6ýÒpòäÉ´lS2n9f c1bûöíe|f ìP«TªM aLRâ!ˆ¥„]rV¼?ì²£ã}agøè£f(»jQâ}aé$}g)—¤CÒ¬for@G»q†ì„ûÜHC~K×—Ìp_¯+ÚKö‹Âø=K s…´1CƒljÖ‰'Zœ0gHã¾0ĸâ+麪v(€U*Õæ„°œ¤d‡80xq-vÁ¦Y%m—«ñxŒ3„þЇ>”áüN¾côqhš’³œ+ q¯0C1i|b’#¹æ>fÕ›C"°G<·\¦÷Õ0®WX.IËçð‹³:TH3„1Ò°—~¸À ·˜—£q†[Æ’4Æ>|x}«v(€U*Õfƒð†!pÁ0\°±[® nOª;øÖÙ Ÿ={Ö:ariYÐT¾>hý=ay;ƒVr9Zo8ÔV”o‰‘†‚ð: eÌb¥bÛ”Ø{ÆÒ Ë iñÙÒb´aéá‡=}útæÚµkq…4ú„Ýýl›–£a<~«v(€U*Õ¦…°Œ®ä!Xzæ‚,g¹üè:÷ã@U5Üã3Ï<ƒ!-Ñ•!—jEâv¥PËvÈþ`¿W؇mÒt¥Ðõüþl¯0tÕr¥jÛ”Øá;aùzòóùg¥Ýt*8áâC=´ËÍ~¯0/I£0«T*!9+µÕ;À*•jSBØAbCt%Œ°·, [ sVoZX[œE..zíµ×ŠûØÇ2Hw2mÚ”$´d´£ièf1Œ±$ÍÌájé¤ö$™Ô…Ëy1 É)ömmÅ4\+ýWÅsg"³² pGáR¢EWÊ# æLp3?úàÁƒ¶WøâÅ‹i×ÜÒ¢„ñ•[=°C¬R©6»„#Ž®DZR³ŠÅ¢ é©Yñ\a<ËÖ³³³æG?úQáãÿx–îŸv€h»í÷ª˜Ç ÉYÒÕ&eH3x“аü¥jNÎÂ>pOmJMÀWp¿¥†MÍê¶W؇²ü¡á>k¨W=ÀY_؈ÀŽååeØAßSjß¾}[ªWX¬R©¶„mjªo§¦¦"Ž®D!–HÍÚЦ„ÇÎÍÍE?øÁ ŸøÄ'r½½½qt¥ïý¶% ²a9:k¿8‹Û”$T}(†TåÌmJì(¯×­#^5ëÍ6%‚p!ŸK|>¿¢[þàె⺔;Øæ÷ìÙ3„±…gÏžMK÷kšã 1¼Áî |Ó€0ÁÚl¥À°J¥ÚRÆE¤f¹À;Ác+„y’’]Ž^\\Œþë¿þ+úÕ_ýÕ|š÷„e@‡ï„}—Š«”;a.äÂs KÃ*Ì’×·ë¾Ù+ŒA ØfáË+f¨·dŠù›¡*ié†ýÏ!ã+9°ƒÏïÚµËö Ÿ9s&3??÷ Ë~a,GÄCCC):¿ºU;À*•jKAØR³\¤f [ÅûÁ b<|yy9"(@xxx¸eO8i€J¶&ùî7´dÍY á¤B©[ ïhBÒ áZ½iæo,—Í`OÉô Aèún8)KÚ‹¯L;XçQÍ–NX.G£8 Å[XŠÞ* `•Jµ%!HÍŠ£+^^Ž6®BÁ$%8á}ìcùñññ´{Δ^_²rؾ¸ˆ| EWÊ J<ÈÁ‡¯ï†CYÑþï ÓÑKN¸RC`½N”iŽ4¤Ç÷—Š-Ó”’ªðN¨Æi޾¯^䘚šJËåhž+\©Td›Ò¦ìP«Tª- á6©Y-3…9º’ ýèG?2¿ò+¿’ßµk(%£ïŠí?¶ÞžpÈ ûË»Â~›’ŸíƒWÂ9 ÊhSªZ'Ü|îåʪë.ÅKѾóæË~{R¨BÚÝžvŸ ¼¡—ÌŽb_øêÕ«9š ³¶J`‡X¥Rme·KͲäØê¼íÒ³,^{íµèÙgŸ-‹N;Ð$:áPaV;Ë=b€—aëgI8v‚mÒQ$W¼VÌÚ”è¿r%²©YØ–À Á ¥g%8aîUB,Ö |ùòe ]?Cz«v(€U*ÕV†p05 EV^U‰6%²@œýÖ[o!à£ðÐCeR~µ0Ÿ—®²][ƒM:aÀÅõ<ÈA€ÝŠ;ö/ÛJfzË«hSÊF¦²Y',;BNX~¶¤6¥Ö»Y£-©§‹CvÐûκÐ e8aú¬›6°C¬R©Â^jƺn/¸,2¤ãža7Î÷/Ðc³îé"šRR‹’ïÛ-Gûc C½Â>$; ppÆ{*eS¦Š÷…AtýìRÙ ÷ö˜¼qÿ¹CËÑ|ÙËN‰}áÂ<0LßmæÂ… YŽ®„36Í6%›šH{üýß÷NX¬R©¶<„ 6¤f¡E ì‚_]Ùâ„þóŸ[ ~ä#Á¿©)f»¿<+]+ÀÄÅXrY:`Ù®Ô©B:âvnXÞ¯ áŒ-Î2xÛ¦´l†zoÎn§Ðr4?¯lSÂ]Ýç*ìÙ³g½xñ"çF[¯¬¬´ì /..¦]`ÇÚf ìP«T*• §fa9zuuíIøGÞº`¯::nS:~ü¸]Ž~öÙgsÍmÍ”0Ø!,•á¤åi¿8«ÓmÜ0„Kͪ~†ùå3h{…óÁ%iß ûs…!ÞÍ¥&ó»wï Hco8=;;›öÛ”pôõõÙ´¬ÍØ¡V©TªVoHÍBå³sÀqn4ïó)ŽÓ§OÂæcûX@1®Wئ°_”Å÷ñ]°âiJf™±uÃX’¶y–®M KÏW®\‰^}õUóë¿þë9 qذm6.G‡–¥CUÑr˜S³d›œ°Ÿ’ÕiéÙwK›N˜Ýy¹ºjÛ•Ø‘ðÝ%î'ÄWò÷’q·õÈ®W8+{…9°ÅYpÂî±ÕÇ×îÇ^a°J¥Rµ‡pœšU.—‘šeÿ‘'ÐÙÔ,ô ‹é†oØ@KÓ+¯¼RúÔ§>•Çü[ε&I'ÌîÓßX%ˆå²4îëg…–˜%$“²žCñ–iX‹Ü¸ÄÌÍ^áÞRÇ6%¿=Iºx/?:âåèÑÑQ]‰ƒ~ÌlØvçmXzýêýØ+¬V©Tª.!ŒÔ¬7nØÀ¸]†¯qËÐîàÀ;Iéå—_6¿ñ¿‘ëëëKßäOjCbVh ZBXÂ׿»^ a<–«¤}÷ËpNrȸc+ù}b¤!‘Üp³:½Âøo çæ\a¹¼ìfùEY⬔û‘½ÂEºm;\o$nÂÙî ³¦D¬0`^óýØ+¬V©Tªî ,S³"NÍ€á„ÍÍ*é†hU²“”¾óï”Â…¡¡¡KGè»Pén}àÊÛùð ÅWúÛÏþ0‡n³àÊqBï)r½ÂóÈVHç²Ù ¯r¾¡Ï! ,ö„³.9k8ã$g #Ú’0ýи/{…À*•JÕ„S³¸Ú…wÄ3…¹M “”¾ûÝïFŸüä'‹£££rM6±BÚs˜b®_!ÍîY†wta˜t*Ý1k1“¶ÅYä€ëʆœp±%°#ôØPb;{ï‡HK`½æ L0 <33Ã{¶:Ú¸%inaÜáýÔ+¬V©Tª[„°Ÿšå–N` _W-m]\2¾²²b!üüóÏwìØ‘17—\S!'œä»ífhór´¿?ëÃׯL*ØÂÒ4v`î¶N/9_ŽÌ@)2…6s…ýq†òóòuÙ›Nš;¬vïÞÍûÂܦÄËÒ6E‹¾ßtoo/ ´î›^a°J¥RÝ„8ZR³Ò|>o³pƒ˜û†á„ÝÂ,€¡H@Aö1–Xƒ½ÂÂ2W¹Ûüh ›‹³üüèÐr3ÃÙ/ä’É¢BÚ¶)Õ94Ë,¬¬˜þS³Bn8ôþÂ"ºÒ¸¥æ<ö»iIñ4%1÷ W«Õû¦WX¬R©TïÍ [sjGW …·*¹ÊèºìÆý^}õÕèŸøDqÿþý6ºÒoS µ û3…C{Á\ŒÅËÐ~h.s…t|Ùã¾|¿@[§)¡W8²s… ¨hz …ø~¡K¿OØÿLâ:ž2eW 2†^a@÷Úµkqq;a^Žæ^azÌê½Ú+¬V©Tª÷aú‡Ñ•† l\j–Ý †#æèJ×'ÌÒ6?ú‡?ü!î[zä‘G²2–£e‹;a.Cp¥×ŠÛ”’2‡v@8ï5ôA a¹Ù/Ôâûp•4„6¥õFdç gÂe̦˽ņÊhÿµÄþž·çØ »ÛúÞ6b¤áòò²Í‘Æç½{…À*•Jõþ ,S³"NÍBŸ0†7¾. £.c+ã#GŽà~¥'žx"—av‹ImK Ô¤ J>„å~p(¾2)ÎRJ¶(µŒ4ŒP NÏ_s™ ¤fµ¶)ÉÓP`G(ñK@8rpµkÓœm-¯kMr ÎV*• ý9Ø‘†KKK¸_å^ëV«T*ÕaHÍ‚ñÅ?ö<ÊÇÊÔ¬ÿþïÿ†îyæ™gðïqZf%µ*…úÙ݆@,—¤å¾°\š%bµKÈ åKÛ½[ú¯† iS3k눯l¦f‰âª ÔC–£#7È!ž+슳²³³³xÞæ©Ji¡ôôôøs…£»½/¬V©TªÂqjÖòò²ˆ¸Kî 3”]jÆZüã‡N›–¢ëpŸ°ÖjS M&ò! òr´ÿZ!`&åHK'œ'‡»Vc§MŽª6?Z:aßuË ißí{`sl/0Üí0»`‚°\’ÎrŠ9 ehhh¾z…À*•Ju ìR³ØÐ5.CZ:a\wâÄ @¸÷“Ÿüd®¹’jÁ µ&µü#îb+}ÀÊËì~eN´lS‚üÙÂ>X}`&9e Œ}a»7M×/®D¦¯X4ù\vÃsù o_)Û”ÜÛ+L·Ù¹Âù|ÅYÔ§f‰¹Â©{¥WX¬R©T·Â~j–ëއ88øò¾°¤töìYܯ©Y¢È)X-s›JIiY~p‡¬˜–±”2E+ɇ€,÷„ù4›¥ë-„›ƒ[¹D@î+¹ }Âü¼¸Ž Ì’Z•ÄçméÆÞ0ï ¡¹Â½½½é{¥WX¬R©T·Âöá……›š%æ×y’’[†¶Q–8q†ßþö·£OúÓÅR©Ôb“œ0/ý6 3…» ë°¿ÄXCù¼²8´ïrË9X`9‡ýg¼/Ó¼m©™^´/åó7‹·<è‡Z”ägö!,*¤ )—¹|ùrÖEZfÑ'Œƒ—£ï…^a°J¥RÝûÑ•F¦fə¼íܱí+~饗¢Ï~ö³Åžž»·aš’“¿· Hñþ°„—ïŒvr¢’ ïnT¾V¨wØwËìÎñ¾èg>œÁ3/W"Û¦T*4Ã+}',?ƒÿågŒ4ÄJs^ö „3Ü+Œei†3œ2Ý'½¾¾Ž¹+s…À*•Ju› ì`Ñ]É©Yp»A îv@¶ ž™™‰þã?þÃüÖoýV±¿¿¿ÂHþ)§fI',Ý0/='9d?¾2]¿:šAë;áØóˆEƒeîºA'tÅ4ç ËÀà¼rï> ùlj«ÎŽŽö¦\teƹa9ØÁ¶)aIºZ­¦èÏhýN¶))€U*•êö»áÄÔ,ru]iÌ{ÅgøïÿþïÑç>÷¹âððp&aÿÔ‡p²~1VRhޤä,”I…[rÙZ¾/;Ì0BXvÃô–Š1LåÞ0?.)1K”˜Öå /Ms¯0WDs¯°»ž8ƒ%ž-ŒJø³2w`¤¡X¥R©î„ýÔ¬ÕÕÕ¨T*q•´gˆÑ†pÃn_¸±°°Ðp.eÜêv°WX:áPë‘_Œ•Ô',!,g ûÑ”¸¶IKÓ¼ç›I5—¹ñ×è|T©Z#TšaêCÞ_6—0f¸Cù|>å&T¡8+犳\t&{ýúuÜ1ä€}a.’ˆ§§§SX»½Â `•J¥ºsnIÍB`AÑ•(Ò²bs›&)½øâ‹Ï|æ3=Y“0¼!É ‡Z“’вäÁE]\œrµ’M¡èJ?5‹a™I¥[öšqôò‰­PÒ ‡ö¥=§÷ ;·WHcßKÒì„`úqÁÑ•)Ìlæåtú3ªßÎ i°J¥RÝa—šEÿÀ‘š/=sq»`\_©T(ÌúÍßüÍÞ½{÷fÛíØ¢$S³CßùvZŠ–.ÖßWNZv–¬ò§/ñí®øK>–ë¾el¥ÿ#£Ý¯H-ž+L·¡Wxˆ—£ÉéZ' Óœ¸MIö Ÿ;wnív¶))€U*•êî@¸A^Gt¥Ÿš…}a·lÛ“pÀ cÉúÛßþvãSŸúTßr^2” ÁX^f~$¥gù•äàvÀÒµúÏ›d8ÊP€à𥣆÷C÷[Ã@%z­b½ÂQK|¥ï‚CEY|½79Š;¸WxÀEW¦yš F~ôàà`†~ð¤ ÂeúÎSáõÛa°J¥RÝE'¤fÅËÐ8eà cÚÒ+¯¼‚Ô¬¾Ã‡ste*^ß ËªævýÂþ~0_æa2O_ íû&j%A ­¹÷³^ãûb'zœß+ìçf{³…åH ì¸rå ·)ey¤!9Ðç´½Ât6·£WX¬R©TwÂ~jZ”Úá  ×„íž0¡AŽÌBøÉ'ŸD3m „%x}wÚ÷•ƒÚ-G˽áÐ4¥$øú{Æþ8C[­l0\v¸+ÕUÛ7\©YÄ,?;:iгÜõÜ+l¸øjjjÊqàÔ,Øa£+é;¶ÕÑæ6ô +€U*•êîC8qj–kIª³#f'ìZ–¯¿þ:öû>úÑ„c6qð¡Å·Éô¬¤Šè¤6%?9ËdRz–|oÌCYs®šæ’t!Ÿo¹ÿ:IŸ3a÷°/Œ v)Ú)ËØ ßî^a°J¥RÝ}ÛÔ,Ø—‹ÙÂ(È"Ä…Y `ؽõÖ[!zî¹çŠÂ§|(úK´|¿Ünª’7Ù¦ä/3s±ì!–ØõÈI§›J£ÍÔš0ôN >œ?E‰Oý©OÊ1‡±6Ív¤’›¨d+¤Ý2u–{…qÐ÷›.‹65‹>«iø¾z…À*•Ju@ØA!lÂèJ®Ž† ö;xCãç?ÿ9ö†m~´K‚ÚP!ªF6Æ“³Ú¹_]);dÅtÞ9Vù¸¤&¹-÷„-„u¬Á›µõ5Ü/G‡œ0ÞSR{ßn¡çö„Ýmp¼8“âÀô »ëy”!‡vX' LªàÁïw¤¡X¥R©î-7,S³Z;à~½-äÐ8yò$ö„m`@q“¥)“b¿Ø_‚Ùo]â½aé†åT%鄞ò=$$´`®Óócû;ÊØ 醫öïË@NâàC˜?–ç„‹é›Ê M‰ÌùÑôHC°J¥R݃Fj.{¶ Ð…– „Ïž=kS³~û·»T(2Þ ‚¶{¥´,ºò¡ëC™°_Ùn¬!/9çÅþ.›]±…ªMÍrN—ÎWW×È g78aÿó–ž[~d˜Ö_(2°cœpéPFî ó4% È@…ôûi¨V©Tª{–ƒì@¯°ì°€Ãjt¾ÆNã ¿ñoD¿÷{¿GœèÉ8(´uÂìC£ ÛeJ‡öÂþXäóI-L2AËNSâÇÙÓæd¥¼ ÷ ³æ%iÿGFÈ »Â,èÐÏmJá¬ce¶ù› Y:>á÷;ÒP¬R©T÷6„m¯0AØ”Ëåh`` á;êØáœ0·Ç4®]»Öø×ý×úïÿþï÷“22°#© Ëwµ ]¿ÊY.Q'-GKWÌPôÝw’Cö—¤”0º¨çªÕšCø.9Ö‘T*Î AXô gˆí¾0`Kß'3Ìð±q¡Ø¢GÁ4]^½Õ6%°J¥RÝ'F`z… ª¶8KhÕ8ºÃpTRýë_^xá…~ri‘Õ#é\}è…Àª’AXjùÐ EVú·ËÜèø}EMçÛ¼©Iaë–½t-éœùy“R³BmJææ4¥8°C´)ÅNئɧñX,½>|¸ÆmJ ¬V©TªûÂ"°ÃÈÀú‡?ž¢WÌíJt¿Æ×¾öµNxtt4‚0ÃÊOÊjõª4–nS‚—÷uýЮv–ÃBŽÜ¯˜vÀ:aË`“¼ÏÌ?&BÙÑIÆUαÛiJtæ ['Œ}avÂrO·¹%»Š*önz…À*•Juÿ@8Øa\bWœUs n,..6à„቉ l¬¦å¾°_íOòÛn?˜áš+ÌÉY ÇvûÂ2;:'ZØgðƒû¶S82kœp’c÷@x# ã i:íu[¿Ö ÏÎÎÚ=a\ä,ér¹l—£o¥WX¬R©T÷„ÛvÄ{ÀÜ+lÄ$¥û·«ÿîïþîà¾}ûò¦eË3„Hs.yÈAØÎæ½a,GØÛæççÓz…À*•Juºá ˜”T,í’´¬’æ%ô¿øâ‹¸ßÐã?CØ-‘¶ä3·Ûû•põo㑆r”¡tÁrYš—¤Cn˜—žC·AàYs³O¸¹*ž?ÜÉ Ëö,ï>i·Ÿ›ud±'ÌÒÏN6T!Ýn¦p”ñ¾0£¢é†éõÝ󆜴Ö‘”#jSr9Ñ)Øa{…ihÜr4vp\„&9ሰX¥R©6„CÍÆV%î üãà =ÿüó½ÉhÄ\aß±J—è;aÖþ²´qèïsqV¼·âŽùr¼”îÅT†Ü°¿$-g Ëâ;áêñŒƒ0¶‹GòLaüñà¨T*†¾ksõêÕˆ—£À*•JµÉ ìv Rð„ ¶NËÓ?ùÉOì‡Ï~ö³½¢õæ–œp(+_Âþ´$ΑN]ÈŽYîUû¡üžº¸„±ïÜCC* l3yË:Z‡8ðò³±5bMøºçˆ0V’×Àj^B¬R©T›  uiq`§fÄGÅruô;¿ó;}JÁÀŽ$'ÿ'#jU’mJx^@8ôÀ–£(ƒo.UG^ìô‹Ñ|{½Â=ÍmàæÆ0î€U÷h³¶²²²†ªhú3©‘ ®+€U*•jóA¸%°Æ~°iö£Æ6®ZÎìØ±cÖ)þóŸïwË»æ '9a®xö[”:ULË iy‡vÈJg95)tr»Iû¿¡ÈJ¹Ììfù…i¸ž!ÌlvÐØO·¡¼ìOŸ£²ºººL¯±Lßë2ý¸(ˆW«ÕjZ¬R©T›Â;Yì€vKÑ5aÞqòäI qh¼ð ƒ®hˆ“êä„Cn8d¹ Ín6a†3ʸåÞÄ%i?=«“;NÚgö?›\îöÝ8nw{…±ïK)pûèâvº\]\\¼N÷ÅÊB‘Ž<–¨‘–…÷«V©TªMa‹ ®5©Á# Ù stå™3gÿò/ÿ}á _,‹YD'ì‡h$9`Yùìo…"-C–>,er–®ÞwËIûÁ~u´ï‚}‹ç³ÕÎp¶ýýýXB(œ:uªáö†SÜî%¥V©TªÍí†áˆ;a¸`vpkGWºv%Ìnüã?þcôÇüÇC¥R)a?7Z*tÑ.y*Ø!_ƒ‹³È~BVÀ~¬eèö”yï8ô~å{âó h^Ɔ[Ç^ð‰'–è=Wè=TéX¥Ï¶J÷_§@uzÿ °J¥Rm cN­µ›~`ªr¹UIùÊ•+Ñßÿýß×ÿäOþd[___V8¸¶NX.Û†œ0аl·ÍpLê–÷a8'je­I|Ê·1LÙ ‡Ú”¼øŽñ}Fôƒ%|¯]»6KïwÞ ô¸%ì“C^£ï³N.YÛT*•j«@Øxp»ÖûNxjjªñ•¯|%" éNN8TÀä/C‡Š°’ª£¥ä¾°ß Ú#f7ËP• æó¡Å7C=¢ ³‘£#>ÅúÎ*G½B?p®“ž¦ïw†Þó,_¤ç\¡ç[[XX¨#ÁL¬R©T[ Âq`œ0–¤]–äø4xYº1;;k!ü¥/}i„”£ëÓÝì Ë„)9ÈAÂL—£%ý",†ºt¹8ÂÝîñ†–žýjhÚþçbû¹Ùøâ޲²RûÁ~p±R©\§cŠŽkô>§èóÍÒ]Êå2&$­âÃ(€U*•j«BËËËØYÛë³Ür´ì077c9zt||<‚p7NØwÁ,^–ö±t¾~ø$Kù`öϳÃõ¡êe_ó}äçËÛö{ÃÒ3¾·ïÿû—ÈÝÎ8ø^%ø^£÷8MÇÜÒÒR™¾ëUzÝÚ;ï¼£V©Tª- á:v4] 7lƒ9Àa°‹S³p÷qNxtçΗe8é)äý"(?CÚ²¿_,ŸG:j¹lÌûÂ(~j×ì;dÈüZ~T¥tÉÞÞoä€l÷Ò92sùòå)r¹Ó䄯Ò) ß Ë‹ôž+ô¹ÖNœ8Qwß­X¥R©¶(„m¯°ì0ÃÃà .Î|!Ù-QÃ-óžðØîÝ»‘Œ‘iç„Ù5Êb©Ð4%¾ºÎ_Žö;Øå"k™ðk%íï&Mxò÷„år´çæ#çòíÔ©S§N-=zô2à çKÇ,?c)šî¿€½ßÙÙÙÕ}ûöÙ=±ó׿Š*•Jµµ!ìvD0ö€M+krsÑW¿úÕèÿðÇöïßâ±eì*1‹eRõs 'oYZB[BQ˜[•ŠÅbËë'¹ÞvÁ¾cæà 8^߈¾³ê«¯¾zž¾—ð5:½BÇ5z/3µZm~aa¡Lw|í÷Õë<`•J¥Úêv²v½Â¶0ËA˜;ì„q9;ô 7¾ð…/Œ:t¨èZ”Ò·â„y/Õï±õÝq;—ì{ÉK†phÿ·]Tehæ°¿ ðâX]]]ñÅ/x¯ºXzv…WÓtÌÑåå*ªÅŒÁàø*€U*•Jv 5† Œ‘ydhUŒ}ao8úçþçè…^üñÇKlÍÍq}-8ä„%üÚåFË€y~>º<–¤q_1Z–BUβøJfÉÛÝÒ¹-¸B&5Ü/ÝTÿö·¿}ennnšŒ½_^zž"ðÞ ïo‰îƒèõwß}·îÃW¬R©T* aØOMMEœšå‚&r9Ú3´ÙÑtºãÉ'Ÿìa–:§|̧Ⱦö“°$ C™c+å¾/ß—¤{zz6¸`ÎŽÆ)î—4=É='¾ΤFËQãÍ7ß¼~îܹ«[Z]!£‹cŠžë:Ý-G+óóókÏ<óL܈kÜ `•J¥R%A¸Š^aÌ Ft%€ ÷ÇËÑôÍo~÷ÿèG?Úç\°0ÞV dàmhZÞG:b?¾’y‡Û †Ö ·‹¡ôáËrÎ×öLãsãôÌ™3ËG޹ˆ¥fzî+ÎùÂÏ õŠ®_)•J«CCCµ¯ýëQÒ÷­V©T*U¸899iÝ!¶2Q€„´' b^’~饗0òpü×~í×ጃorÂþ^°Ÿ8%Aêjeò«£åÜ`œ'§j?Œ-°exË¥i±´m/n ²XZZZÿÖ·¾uŽžIWïeún®®®®"ñjÅâØ÷%P×^ýõ û¾ `•J¥Ru„0téÒ¥uŽ®$ÀZ7L0²éYX‚æ-\ñòË/['üéOºß=¨urÂ>Œ}ÐJÀ†Fú‡ì?–籯Ç`I{¹¡êgcZÙ”+ÌSÆ>8Æ8~å+_9ClÞËp¿ß)ºîÝui~~¾J_?zôh[ø*€U*•JÕÂ] ð2„Ñÿ (É=a¸áïÿûööÏ}îsîñé¦ Ž‚N8©0+iQÈ%'ÁÚ‡:??ܰ,Ð $`EnSÔÛÛ‹åg;=êïþîïÎÏÎÎÎÐm—é{¸HÏsÙµÁ /x7„m´ûŽÀ*•J¥ê ˆ®$§gš× Ä.¸#>^{í5;äáóŸÿüÐMNn ì€ô ³üÙ®íZ”øyd–ï„!ÄXÂà ó`.ârÏžh»ì\*•_ÿúׯ^¸pašz™žó–ž ºWé9®×jµº~ejjjÍÛP«T*•ê}C˜£+çççm~´sŠqu4ïãú·ÞzËVQ¿ð Ãéæo])°Ÿó,/°3fÀúÅXÒ 'ÍþåÛüçÅmx¾åååx_ؽVÔŒÁŽê£££/Øxùå—¯ÿò—¿¼J×]¡×;ø¢èŠî‡ÜgŒ,_¿~}¾› a `•J¥R}Ž]é l°7êd/@lšK¯öüÛo¿åèÆýÑmsm?†8¸}Ö'ÚÌà :àÐŒaé¬e„%_%i¸á¾¾>Ûë[­V_,;clàâo¼q…s\òYî%À×]ÍÓcË«ô¬ß |íëwy?•J¥Rmq¥nÚÏôáÇ3ÓÓÓy‚0ìãkÁtœŽ :& ¸“îüØÃ?<ö¥/}i;,ë†7¤¤ö+£CçeŸ/ÀËçQÙÌnV^Ï×…r¡å%qÞŠ~0ÔwìØÑ £>55Uþîw¿{{¾…Bá8ù÷"6ç™¶H¯aG rÕxt PMë_)•J¥Ruë„ÝYDWÖÇÆÆ0\ZÄÌ[ÕU:.Ñqû¤¨¦cêøñãSû·;Càªa¿ØMŠä^-»Ü¤óò2\3pÖþu.³9¾MÞÎÏÿ%xÙ¢u‚,ÞcíÚµk+¯¼ò öy§éyÞ¥ë/ÑûGÎó4¹åô¹–\Ìä{‚¯:`•J¥R½o'|ýúõÁ­D·ŸŽa¸^ºm¹àÝpÂt~|Ïž=c_þò—G{zz°ý™v.8•ä‚CXž—Ž—ÏËSé~¥ –§&rõêU,£×vïÞ]£‹•7ÞxcŠ._£÷zœ~\œ!ð^¤S´]'÷»@Ï¿BŸa~ˆÔÞ |À*•J¥z¿ Ž!L-Ât:L×ÑéN,G“£ÜM×c9z|×®]cþç>ÖßߟÞ0žu\Ά&.A'—À•@–0˜á‹Ó+W®ÔçææÖ'''k…Ba•-†)L÷öö'Ÿ!ç{Àw†]­Ðg[Å*€é¢ÝH¬R©TªÛá§žz*M.2GKù|iXC) aº{Âp»à„ÇÆÆFÿò/ÿrÇàà`®'œt^ž†ptܨÒ6gÏž­ÏÎή×èGÁêÑ£GápßtŸ3kkk¾],=ÇãQŒö~à«V©T*ÕáA8“ã-ÂÄ—!r¾£tóN±m!<222öWõW;¶mÛ–A¸[øúN8É {pF ˆ9yòdýÆ5ú!°600°FP-—Ë€ïI†/Ò®°L°ž£ÏU&WÝt£zô>ªEX*•J¥z_r ŠPŒ´sçÎu:_!`-‘sœ£SÀë  jçqJð»J®sêoþæo®ÌÌ̬ ënâR\œåcÉB¬P–,¾ò‹±¼S»ìüË_þÒ—»J×WOœ81»¼¼G¿üå/O芾îÝО° ç|É‘[ø¢™.WQÉŒ €/½¯w ¾çéüÀ—ÎO‘SÆžïà‹­÷Úë«V©T*Õ]…0)ÓÕƒÜrÁ;°íZ”P µ£P(ŒýÙŸýÙä#ýôÓ} a„u$9á„„+[5ÐjDçí²3Îwð¥÷ƒåæ ÀÖù–Ëå¼ì|»á é4$•J¥RÝ6u1IÉŽ4$60[Ø6Œþáþ¡A`Üýñ¼ß%f1\S<- ’Ó“ø2täÈ‘B6ðÔtT‘ÝLÚ¢fè¾—Ð…Î}¾ôstý29ð;_°J¥R©î„AáCxaa!à)DÀÁ:ÏÆå¯}ík˜N4ùüóÏÐuÀÕ/L1x˜íe¤[ýçþgãÒ¥K1|éXFz’1 ÂU:Ûlgzþ):°ç»´¸¸Xéíí½#ðU«T*•ê®@øðáØ>d0nvéT ”ag ãøÖ·¾'<ù™Ï|fˆžàMùîs}_z饯ÔÔà»Îð…óE[×N7ÀËΓ““w ¾ `•J¥RÝ¿óÎ;† ¼výúõ€‘„…»aN§pÂÕhuu5úüç?!°Ñ%`Å…YKKKæßøFãÆˆˆ”ð½áœ¯MãBµ3Z0&ûÁô ßµ; _°J¥R©î8„­}%v:‚0f÷F.Ž.£cŒ‡}ï{ß³×ýÁüÁÝǶ(q%9éÔ×¾öµúââ"î»Î{¾t/;ÓqÉÅ`2|oÐs/!ájûöíp¾hȆX¥R©T÷²¶~ê©§¢K—.fv± 6Í©Cþð‡Øn|ñ‹_Üî–žÓ.\0ÿôOÿT¯V«¸ö|+ì|éh/]óÓ ß……… àû~Ç *€U*•Ju_B˜ÜgD^»zõ*ö-€\œ¼'Œû9rÄîÿéŸþ騩S§ê_ýêWj,k×è>«+ö|áréaW°ßë ®°=E·#^2v¾w ¾ `•J¥RÝ ¶1‘aCF%3fõÆKÒ$NqÄ?ùÉO³³³µ©©)dGݾ2¦0•±ì øbÏ—ÎÛ‚+·ÿ; øWpu·ákݾq¨T*•ênËŸ¤„™ÂNäG£úy;†6¸™Âì@~ô8Ãt¾Ç=vx¶@ÐóuKÎXzFȆ…/ú|Ñjäú|w¾ê€U*•JuÏ9a\œœœ4¹\ÎV?„ÎÛåh/îƒý^L4êCQ]®²tÝ5ìû¾1]eç¹{ ¾ `•J¥RÝs/]º´¾oß¾(ŸÏ3„#.ÊB±Ýgà‹%gäJ#®²â\îU,9ÓÓipôôôܱxÉ[rýº­R©Tª{I¡q†S,5 …âÖX6›ÇÒ4ݧ߸Jç`@wŠÎϾkkkËhKº×à«V©T*Õ}aŒ3äIJØû¥›1ÈaˆnïÅ}èX%ÐbËШtž'ç\¾Wá«V©T*Õ}aŒ3$Â¥õõõ>€û¿梛ŒŽ2.æóù¥jµºøŽ×îEø*€U*•Ju?@Ø8grØ].Iä9ζ˜î^¡£×îeø*€U*•Ju_AøðáÙ¹¹¹lOOO¶R©äˆÁТó sN××ß}÷]Ûã{¯ÂW¬R©Tªû Âñ’tµZM¯¯¯ÛÑHä€Q1Ý©s®ó½ _°J¥R©îGËC*‡‰îqÀ)€U*•Ju¿ºa#\q ³è>›X¥R©Tª» ´~*•J¥R)€U*•J¥R«T*•J¥R«T*•J¥V©T*•J¥V©T*•J¬R©T*•J¬R©T*•X¥R©T*•X¥R©T*°J¥R©T `•J¥R©T `•J¥R©À*•J¥R©À*•J¥R)€U*•J¥R)€U*•J¥R«T*•J¥R«T*•J¥V©T*•J¬R©T*•J¬R©T*•X¥R©T*ÕûÕÿi'ßuNK,IEND®B`‚compiz-0.9.11+14.04.20140409/plugins/mag/images/Gnome/0000755000015301777760000000000012321344021022233 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/mag/images/Gnome/image.svg0000644000015301777760000004732712321343002024051 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/plugins/mag/images/Gnome/mask.png0000644000015301777760000000601012321343002023667 0ustar pbusernogroup00000000000000‰PNG  IHDR€€“EÓPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†ä&ŠðtRNS  !"#$%&'()*+,-./012345679:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghjklmopqrstuvwyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ’“”–—˜™šœžŸ ¡¢£¤¥¦§¨©ª«¬­®¯±³´µ¶·¸¹º»¼½¾ÀÁÂÃÄÅÆÇÈÉËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáãäåæçèéêëìíîïðñòóôõö÷øùúûüýþö'?ôIDATíÁŸôð×÷¾÷Ó8·îœJ%¤õC¶a*Ó Qü˜~ÿ°­UǪͲj­üÅRrÈÖ®äWŒÊ’‹°’$RÎs÷ý¾þ„õxlõèQK¸ïÏûóz>!"""""""""""""""""""""""""""""R+’Í‹:téÙØí÷>xïÃüà;Ûœž ©s9®»æ›Wð«Tî]Sú«Á7Ô3zÞ9iá{)_úƒWþðÓÞEZ“?ä©-`]Ú3¦äÿj6zëÚþqy¯Ôò¡ý¬åã _R0þ0ëËÑ'ÛB¾à¬©GYŸªŸëùŸœ±•¬oÕ›Aþãªml»†@>Óæ6”¥ç#zY%ål8U7FÜ®ØÌ†õ~D,ÞKg!V½>¦¯G”’ãR4bJâS°‚v¬;±ùÑÇ´äà`D%ùpšÆLÍA< _¥=oµC,zï¥E‡##«iSú>Ä`4ퟀw‰ ´ì¹Lø–5‹¶-lÏš.¢u«òàWÞjÚ÷Nxuæ» ÁÎNð©Ý‡ ÃþËàQÁv†bo;øÓ|=ñ½Þä¬`H64‡/É2†åÕFpeCS–„#ãžiðã.†h¼øqŠA.ªd˜j®„¹ï2TåÃY ×’‚w3Cv?B×éCVó}„­Éf†mg+mC· €`øJ®å _uW„*c-=ØÞE~‹0å GÛ!H3éÅ„¨ý¸áÉÜH?væ"8÷ГÇšÂCôäØÌóôeÂÒ‹Þ GPÖÓ›ÙHús²ŠþlK"?¤GÃŒåôhSèJŸ!/Ó§5Ã%ôª‚ð'zõBÐ>E·z OÓ¯°¯i9ýJ¼ô¬æ½BÏÞ†u­StíWBß&À¸ômw¦]JïŠaÚDz7–%÷лŠf0¬˜þÝÃJéß2Ø•ØKÿªì ƒ^0ëgŒÁ#0«Œ1xVeìc ªsaÔ¥ŒC1Œº‡qxFÍgÖÀ¦äAÆ¡¦9Lú.c1&a,&Á¤2Æâ ˜´™±Ø‹’UŒF+t.ãÑõec²æÌaL–ÜiŒÉK0gŒ@¨æÐƒ¿"XÍßcøö"\]ªºt„ìç Ýï¶¶•™[‹ Ù§EÝ÷Ž1\髾{®'à@b>Cµ* ´ü€aÚw|¸`?CTÑ ^t«`xªûÁ~Õ ÎðäF†f |ðL‚7’Ù x“(e8gÁŸ¬Å Åê¦ð¨é2†am+ø”=!Xš ¯2¦Ð¾ç³á؃´nr®ÝVCÓ€wƒ*iWÍ­ðïòѪÊkƒ‹>¢Mz ­_£EëÛ!ÉGÓ4ç©FˆÈUŸÐ–ÃC—¢×iɆó›ÌÇÒ4cz#D¨ï§´áðpÄ©ÍJZðv{Ä*ã®lhG~™ˆå?›fƒ*;‘ë¾ g[1$y÷A6ŒÊ_ç@>S0› áås ÿuåfÖ·÷@>—1dëÓÖ[² _°šõeãÐ$äËz¯`}X30ùjݱ®½Öò5.+K±-¹r­GodÝØ:ö\È7qɄݬmû¦v…|cÉ«faí©úËÀlȉɹ¬†µ!½òŽ“qZ¿ o¥yJ6O¹¶%ä´¼vÊfžœ­Óoø¤œqÃôwªy"RÛžÙR‹²:\3ú镟ðx¼9óþë.ÌÔ¼n7=6oÑÊ Û?©âçŽ}úþÛ[üç'ní‘©/Ùyg»[¯îµm•Sþ írðBì½IEND®B`‚compiz-0.9.11+14.04.20140409/plugins/mag/images/Gnome/overlay.png0000644000015301777760000010624312321343002024426 0ustar pbusernogroup00000000000000‰PNG  IHDR€€¤Çµ¿ŒjIDATxÚìÝkLTéðº½lÛM·iw“mÚšvÓ&Ýl²Mš´v¿µ¶i›¦ (®w¼­k­íf½ëª(^ADEWÄxCQ•­(Þ@nÈÀ0003\f`@1úôŸ'â±0Ì™3\<χ_ˆA†aæœÿÿœ÷}Ï™o‘BÒý „RB!¤„BH!„B! „B @ˆ¼oÁ/áø>†˜‹`D@4l‚åðÌ€ ø3|¿…wámø®Þ_[!¤ÄH†ûÏàO°¢á"”A8 ÈCÔƒ®Àø >†_À8½¿OBHµ!ÿüBa-…èºá‡ 0þoêý½B @¼ö¿†pˆ…,°½Âl ð)¼¯÷m@Hýþx˜ÉP$ì áð+½o#B @¼:ÿ„B"ƒ$쇢’aŒ×û6$¤ÄØ üÃDØ † s-!Bà½ocB @Œ"Ï–[®‚Bx$íoeïé}ÛRbdBÿM˜ ×à)ÐX39,˜¦Í˜JS¦†Œå2ȃEð¶Þ·I! üúß‚¿Â1x4’&…Rø¼Y´bÕ2ŠÜAQ1;(>!–’ cÇÒÙsitùÊEʹ‘MwóóÈP^J&S5ÙìVr¹ÚéÁƒÎç::\ÔÔd¥ÚÚþùyø¹kt9+“Φ§wobEÇìäß·jí š·`‡ކ"è…3¯ë}[RB#ÏÖäGh¸M6…–,]L›·D „÷Ó%„º¡¼„ÚÚœÔÕõ`:‡½G¬³ÓW<—Ê‚K"rÛ&ZúŸ%ôÉô°‘*'ÄÃGzßv…€Pú?…Ï¡h8Ì?›V­YA{âbèTÚ º“{›-ÔÝÝÕ/„»¿ <€›Žw ÊͽE§ñ÷ÄÆï¦5ëVÑü…s)(dX'×À»zߦ…€ðü‡Ëðd8ÛŽ-”‘yž8è»¡Ë T”€6 @ÑîÆÒPG3/ÐÎèm´àÓyÃQO!&ÃkzßÎ…€PBÿ5†b ™5ga‡ÇækÍ&zø°Û‡™³í €¹\ŠÚZ¥Ÿ?C[·oƼÆlM_÷À—M ¨‚™ðm½oûB @ӠHc¼ÂfýÆutòÔqª2VrÀ{¦Ÿ³—«?m¬ªª’‡Á""7ÐÌÙÓ}ûÁL4ÃBIc! £àÿÌ–-^HGR&E9Ì{zâkŸn7:8 PQîÊ %tôØú׿« ûÁXa)¼¡÷}CH¼ÊÁÿ}ø'4iG¨#V®YÎï“·¡п°~¢÷}IHŒµU= ´ þ…‹æÓá#ÉTo©£Gzú ÔZ†uø¾¹ÕÎGææú2š*”•ŠÉPyªªËQJÕ\Nö&+Î$Z8صR8ûe®3QÊÑôxÉ"oÂ^ä¦ ¾Y5$¤Fyøÿîù$$€Ö­_M…ÅùJè+´.B;Žèkë«ùè:FSYŸÊÁU˨Æ\…B«'‡³Y‹a p„¯”.*.¤õëx’ØcØ{VÔû>&¤FcðÿâቯÃ<7¯§ŠÊrü#èѰ”À0³›-¦±ø¬Ø-ø½‡a¤ª2ªÅ™‚ÕÖ€BhõC( †\ƒ± ïo‡¹÷&¼(dXHHŒ‚à3|à ™Ä“‰Õ5Õü mJ  C:­Žfžp­¬6pŽ1Z„>3¸ã¡-¼.<Ôe³7ò‡/Ã@î%à`÷«*hGÔv ä!ì=rÁâ‰A¾©÷}PHŒTø9@j…N™DÑ1;0¾o¦ÞÞGÀ¡¯I `R”W×TÕT(!ª£à÷úƒ»_SΓÌÍ-6m @ÁwEÝ» ïðÐ&ö¯>Ôû¾(¤†{YçNx ¤ß?6>†¬¶Æ¾àפ0´ÃcܕƲ±úàßÐ÷¬ä9œð²U‡£Yå0£?(˜ZJØí!T zoNx I ŸI ¤üþ!ÐèË­•÷íOÀQe³[ð«-î‡]¼ÆÞhª•a^R^HE¥wénÑmºs÷ݸ“MÙ7²(+û]þ:ƒ²®fRvNåÜÎ¦Ûø~~Ñ*.ÉçŸUüZ…>+wǯs£µžœÎÖ¡s g¡ÉI4uz˜‡°”ÂaœÞ÷S! uðÿ®øòéWûîCh8ð½ u%ÀC<¸ÀŠWí üF$Ø îåÒõ›ÿ¥ŒKçèÄéTþ¬€Äýñ—°ÃQµk;î6ÉÞ¢~³bb£øq“âéàá$:~*¿7¿ÿ*žGž¿C_QõÿLf#_¼†Ww àk;l6+/ù áPWéüFïû¬Ð*üÿ-@j¬^»’ÌæZü~xU®Ž6²4š9|†åèÝPˆ£ò>J?sî$¥¤¢„¤8¾2zÔØµ…öî‹¥#©‡ðeGþÜ èï!{&ÙùCœ >$ÆŸ«dÏfË £$d€åÿ8">Â!µþ<ÀJþ¼oè ÒäÆ.zÜé2ThD°»%Aóµ ‚„  ì¬]“0½]&Êc®fl‚#¿>ÆdÂ÷ƒïë ¾¿~÷vÑßCʼnÃ$s)ÎRYˆÜ`š9„ÉÇÙ@àk¼âÓÍÔ/½‹ÐýÈß4ˆÊÿ­·—cˆW3Ɉ„ðžïlwZü‡+Êèé¢sÇ“nž¾·ÅmŽþ‹æçáNÃoHÀܲC¥¿Æ…Þ$Ð锄`¨ÃïgHô݄>RqˆGöŽ ‰¤—.õJ…@cc½òöšUŽd¯fq<«w ƒ ž2³|BBƒhE¢Yü"!€^~§x)V’R\-üöÐðÔ¡òxÅ8ŒâXŒ@KÙ„`“>›-ÉñJùá³ì¥Àó¼!aTBW Ù;ä xAïB4àþ•ÿŸÀñÓ²ïƒùTÒç þ}ôZïŒøKÊ ]u¨ YmèÂå¯ìø„Ø5…Eù¿Ó@´»™Çd)GÀ!èV†"ðí Ù‹‚0]¡qrWäPô šÍe!ñ  vÑÀWHî|¦ë]ŠFÜòŸnŠÈÕê˜áÓB‚ºÌ…=ºÎ i£Y6˜m£µôƒM›Êâp›·ï žûp ‰B`|bÜÔôBà·%„6Ø$6>J)*Í7øÊ@{ ð&)UB—CéOW3ÞÔ»¸ä¿ ˆÈO†´+wpp€à «×¾¥NÙŽžƒ¸¥¡©øQÿ]8Ÿ•¡6Î’¼^`•‹’ÿFÇQCøB`ÿ¿ÆýNñ×YÑÔ\O3†¤KB8 €ØEøPïr4àÞ—ÿG¢%Ÿ‚¢ƒþàxB€J>ºÏ;q[·„ÆkxPÙŽÌ]{²^2d/ ûòrÿ yF›6vÈ!dƒb7G)‡–©D¯¢Ù&ô6€KdÂA€ÿ¯Ñ% áÀØ/`À='þ BDþ‹–ü]iim1ËŸ;ð¦ ]ë?u¦RIÍØ®UWÏMúåS¶'¿Ú××7ʾv¡€€<5}‡?ºŠÒðFu]@ø`£MRÓ·+Õ5§Hê"4‚æ¶Fôÿw‹†ÍZ´t‘XÌœž6}æ´ô.J#îùÿ¤óŠÝê]®t÷t“ðm`7®`Üoä….,RÑd®>dÓ¼9>æ]êÅ÷¬ðG‚QÀë.¼íàC?ªñº‹Q?`¤OB{{›:ŠVàbZ Cø,hëþü½t l%y64vÓF…CàܹVeÕ?VÙ“=˜f‹|ðÞeiÀð—ÿC Àì­™;[y÷ýwh–DÏ `)ùtt“ìå?Dc4¨í×$&Å/ÅH‰‘‘¼Eä¾ðáÀÛ^¶&ÁðØö[_‡Ä+I貘6bÓY ]îƒØÅ, uaõ‡}@rg1ÍÂqðˆÞ…iÀð•ÿàҾìÕ¬ýäcìÔýÎ"zvÐ^Üæ•šÕ“‘êt¹‡“•[·%½î&Ù{Ý%y?;ø²pux:Ò2vÎAã@)ðƒMf>W‘™J‹ðí ÿ›4·6*½‚%¡‹8þï†u*Ù3¨¿Ð»4f@ð‚b‹ì1‹@K$gä€o¯^¢•‚¢òGwÓcPr(EzŽ›„ïF*ák‚áÅBÀÁ°;'{Rx„)¢"á›TÂgAHó‹öã ˜„Ï º„¤JBÑá$wNƒ‡õ.N#† úe_öjpIâ"x-žR£0–ÙÙ‹\C8'ÈËÞ9I{Ù«…Ï‚?äƒB÷„Q¶pG(äíψEYúm ƒljɛ± ¦ÒZô-LdJB´ˆg"!P Ô»<c–=* efgXäϚブÔe.<µ;3h,/wß5“½µô}Áhðý(ŽŸ³È¾)h® „â’ h#M‡Ô‡Â'BˆMfh[.‘Ù}“}ît õ…&³ÒªIÈž6cÚ½ Ô©¯ óü•ƒHøœ@çõ‚»ÎÔž¢Z¿]=mx"{ÍÒ÷1KŸÁhmþ!àê@ÀÜt×Ü-ü‹ð™df§Ñÿ‡;/ÔšÜ{QlŒDQI¡â?ßß¶ðgØ$Fï5Àsò_Ê)ã|¬âÉÞ6ƒªÀ,Ú+Xòqf„Ã-lð éè8ïç¼ð‰QléˇXhÈ¿ ¸0FŠ#ýý}^(=þov}$vAâ·Ä*§ª+ úz‡ÐˆéžN¡¨<~ 3„m Lý?SͬջDp¿ügƒAù¾:_©ª>m%|Ö[ÀµëW•Úúj·•|ðóŠæïÿ£óÒ'¼c… üe~¾»ßÀî <ˆ<²PSúa˜,Ð"ÿâ²’»X!)Õø¼¼`%{Kõ.R#Ü'ÿ‰à–#éÏ€vö>ò ž3h3¹¹¥äƒrÏ…ä­‰ —>á£7›'d~ùàAüp˜îƒôÌÔù( 5Ù~]²v¥£$T+âBGðšM‚ç`ÌÑ»Lp½üǃkjÙ«™3o–’w`ÉAZÕ覒Ï툨°è³ÍMc¥Ï¿¶ O„úqÆœ°È.;·ɖäxL­¶+ýæ6kÎuð wvv(ËßZn–=‹~0Vï’5@HýG Ô‘ôgÝaÁÂ7pÑ¥“Ú8ùº}.pËÿøé£Øå.<®¹¤´è·*é ”{Â}Êd¾®A0FmÎ Øo.  Uœ>}ò9ì."ÁóA-Õ5'Ið< ‚;ÚÚ[ð¹[@’çà ø™ÞEk€X¬SË^Mnùžm>K<ÂQ\¼ÜÃ-ÿ£ÇË鿥ˆüñÁÛŽ7o‰<•{„Å/ÏÓ„Dx°ÐòÌÀ]%"þËcò88ÛŸnWú‘Âï»9’&Šâ¬‹‹ ç¸C ¾¡;†¹B`ò´) z­œ@ìƒ@aq ?O=ÄÂ@Í•«—ù—´)^×n’}ê)ñÈ ŸVAÀ8Cp[hFàù HNIü„?¨¾“˜/¥«<ÌÝÜ!Pv¨„º‚¬eo—Wô.[#Øòÿ%è¶+ý9‚L›Hölh¶÷x‡ò£¥´¹I@þƒèßþ@òƒí'"}A‰?-‹F¡3ö> “A°3mÛÈþ{³ðY £+'ùC [`€\\|, žƒ>0FïÂ5À¾üG€bµìÕ,[±„:~Øò§©žÜ[¼ŽøJôÉÿVrÊ–EÂå ªõ3D/Á3*4 ‘°þ!ÀžŒ˜ž‹ÛÃ}åe!*6\¨ÔÓË7JúVK®~g5oTŸê]ºFØb_ óç)˜¡Ã#šç‘Îܾø ˆtú\Ã.X ñ{»PüÏò´,Ã%<ùàá6ÒÇ÷å径è±%ü¡xZÆðÂÓ\ÐÒÞĽgøls£2/p>oÄê]ºF¨åÿ"ä €½y¹\òÿ›¼°Dƒ»Õ3:.‚ŠgІî/r÷üUPüÀRòq¯ôåÃ@$0dC€îÙCÚ‡€1 ƒuø ‘1aÍ6„o "W×p‚o¼C“qQ¬ Ëã{ø–ÉRk¨méOþ!óõ.^#,òtqÈò]OËÙÙ;|ùoùVמT0‘‘÷©_ÁùÀÙâ’¢ ‚â÷c¬„¨­ôŸ%„„/ÿ5´‘p¿OÀ¹·ÏÁéªSh¨"ɳˆU’·%ÒÒyˆž…ÐŽáÈèH<‹IÓ&_£õ._#ľÑôg3”ÅË)7nôS‡A€ÉžÜã¶nKt$|+0ýóÔ)ôd Êß[-lD¾«JHZ¼!¸«<¤YW‡@[{ë“1qQ¥j᫉kB—ÂxBc¤¹o ¿µz¥µìm1•(л|uüD²W1û|ëñdOâWcÝñÃÝ¾M%|{›6Uá{xŠ_ü„7¯øyŸÒÝ|éèk†ôôöøÅlŽ,³’½Š03´XÆ\ïgÀÝÔÐT¯øø[ÉÞz°n²r¯ ‹œ/w“üÍØ ÔýoâÐ÷k.ùgïÉ ±³¡²OËñ•ãùÅOørˆÿ7‹œ-ä‚€\h_ r_—烠¥µylL\DµJøvÈÉÝÅÇ}p°à žƒNð°Þ%¬Ó˜ñü×­ÿT%ÛAp›»î¿w·ü±¶±·°(ÿüâ'|Ý$ýq2Âw6ÄBÂó! õèOç™Àxœ ´ØŒ5ò÷*­¼ùó€Ðpo„é]žÄSò÷7TŸmÍÂÅo*ׯ_'Ñ3àñC” u^ù÷¡ÛçeAùûi$þqñœ|°ƒâÞù·€áÿcïLƒ«*Ï<Ö:cÇû£ýÓþaA­RT”ú£­e‘%€ˆ ­ÕN+ÒQ L;à8:2"•ì+I „-,Q Ä@$!==lÆ„„íôwr¹9|çœ÷åã»çÞ›Ãç‡A‚3rŸ'ß~$çÐx8Üj |$âŽ~„_E×E°×Þ_´€ÀýWÄ€,”<L»päÏž÷?~ò^£k-}ôÂ>ÿ7øâGFÈŠ_µô žRêÐÈß>jÃ(@I TF`ï×Ù“àX' _ ´?xF ´¼§z(ZÚxëÅ%'᪈éd&O›’<àt;" öiùùÕ –ü{zzàþóRÖŽŸ¸Ähsáë¹™œ’𯻔ÿc2ò·Aúô÷P.žP1 G|¼9ؾcËë ü^=AJZ¢ë¡+ð æz@XD¨[ô¯ôç=§ËØØ-ÿ_µ”üßœ÷†ÖÚÞ ‚¿ŽX€=ï¿5k“ |3à\À'„ø ùÛöÓþïT£2²q=™"Fl¼5ÈÈÜðOüMAúQzÖ;woãŒð ÛYïÌÿJÞ©·é~åt!ô¬0þ =°=-Å/"?ï;yPî°xæAù?©@ôOó ¥.÷ûèpâ `ŠHñú=5DE€ýHMO^.ß0íhÞaV›yë{öe£äÄ;]Èvc§üG½(y }øvíÚ5—ôMCðcç–üOœ<†÷¥säg2ñ3çüUNõ²¶^Ô¯Ø;$¿@ì£Ää¸Há DDZר—Æ-ùïRNnã.åû7„üñ XIi1>ì˜~íe?Åš÷OŠ¡å´n]]ÒÞÞ6ô.ä?œ'¾ômÿ3ˆDÄðã z*ÈþQ½CÈ×G]]]ƒcâ"óQôfDÀúô$­ºö,Î÷[Ñp®–µ5ôTy™6}f'ÅÀƒN³]Ø%ÿ¹ÆÒмůG ìB`Îûgš  òÏ8v8¸ÿ¥»øp £äï›ÒQð½m‹€½£þ!ûC ü‚¼ç"£Ã/¸…/ÙÇ®ìí(yö#2ѱÑd&ÀÇN³]Ø!ÿ‡F”¼óÞž ‹JPøV\½Ú»ßݼ¿Kö&$¯OXxª¡,ù«ÿ3ž„ú³í×ìuÓêÏ ˆøj¶nÏœ¢¿¥¾@8’{ìˆVw®š€·+¨µ­E[ðηìÍùøµÓå<@°Hþ,‘»w à)`Þ‘3ï÷£ƒÜIÂ×…¦ÝŇi!ÿ'eä¯PøcÌP õàGAíÔî(ÀßBœ¿N¾>._vº˜ À¹¦zöµÑ(yšN—³xZþÜÍŠ ¿½¤ü/]¾ÈšúùK–üáõ¯ò¦¦ÆŒÏ ×ÅnÄuÌâW-}{# ‚}SCt èÐøRà„ýظ¨CñÇèÙ˜™Æ´2ˆ-ÿt¹(ü)ý™¬—_:]Ð~û»„üñÐÓgNãÂ.`& Dcá÷Û¾©ŠÀàU]_ØûGžüyù«ÿPßÏ"0JÀskCmŠâÉËÏ{>*&â"Šþ¢î 7ïH¾Æ2õçyw…CfÍtÉÞŠåN´§ñ¤üªî~À„„£øõˆ!À=ÿôã.¸°e(ýµ }d'}?â‰)ÈŸuéš(>…âÿ½²1P~øSCÞ£!øD¶nßüWþ-½!HBR¬VUs/„³€½ Ÿ’'èqº¤ý5o¡ä-xuΫZsK ߊ®î.Xø-"°}ç#á D¬ ͼ ù—“?-~¾ðiñKýïÿ}¬0øÏ(€¿EÔ?B@G6ADê„oDl„–½o'Jž€umtSóyøüÏæD`±Ó%íw¹?œ¢ˆ‡¾¨ÀU´¤üó s5ØË‚·"8$°²¾¡~$SþC¤äO‹_½ôiÆÊƒÆþÈìØ"êoÀõ€øèãzá à±’²“dÎ7ò„cãcáOivº¨ý-¯RòŸõÚ,øËRLCpñRká795Op3kǶéLùF©ˆâ——¿ýâk†Dˆ@ð" øŽ! L ˆ(Ü"ÊÇ›8rôðK ùAúw°qSªk¾ß’VÆ bçàó?cö,=ÁB§‹ÚßPH`åª/uò7 Aïµ­¢²Œ”ÿ7‡ö¡à)"¢ÂÒHñ»)+AzŠÅOH},Ù°p`Ã"ñ£µÓ@"þõiIkQô†¬»MNî!2 ¼Âá‘át^™\<ätY{OÈŠ¡ôgÓ5/€«ª®BÙ[ÑÚÞLÊ¿¨ìÞlh(ý``ËgGÙ©Ò§˜ò®\þòâ+Á³.dB@G‚? wD zm@ÅõÑvŽTF ¥µyxl|dKøq«UÖœÑ×ZF6n¨««Ñ¦ܲ7åïN—µ¿ ×%{3>ÿâ3Rþ½½½ÚéÊ2Î5Ï:áÝfµŽ¤”„%LùäOůFþòÒ'+ƒúðG>¶6€! Ö(|=Û³¶,Ð _$ؽ' ¯„îO½Ô±FAÁA(yk&îßä˹ÿÉLúÓGå帯0 @[G+)ÿ¼ã9¸ð«¾œ >[I1äóþvÉ_½øièïÀêEboNÉl• âË€Ÿð÷è„oBqé(~+ZkUUgµ)Ó§õ—½s.l_ÀA”½Ë?]†âw#„€}è+i}< žàzöž]“hù#¹%¢^þÞ¿ºHȯøÕ4|†„À…qã`*¨K”~¤Ž ©¸ëÇ*çëXǬ\½ÒPúô”÷ŸŽôÅ€ÜÇEQÉI—ôMCÐq±”Î÷ß¡à)`'C-zêG•üYÊËþ9ú÷^4–ȼ=@ÀŽQbÃH°/éS¾DÑï¦àD5 `í:]QŽWB€à)f8]Ú¾€dJþKÿ·%Oq¦ºœ @Jj‚±ôCœ  l©ªªå?ÁãB¼+ÿg ñ+„ŽéQk‡Ô”ú ²£_‹ÀåË—‡Æ%DWº…/ dd¦áŽcÜ£<Éç+>ç`ŸÓ¥­Uòè¤_p w-åÏÚ÷Ÿ›X'üµ:ÖÜ&5-y!j×Â}šÑ‡Åÿ-DÇ ú€Ø@Àž½»æè…$Šœª(…÷ëô4ê`= ÿþ¿r"ðŠÓîí¬¥Ÿ‡¢·¢¹å<€-Û2PðVÀ•Õ===Chù‹Û>ežq”ùé_Rüãñ È„BvñXfàKÓB*ˆ9!‰)ñ(zâûØ•…Ä›S§µ0.‰ËØ´‘€ Nø½r/òÿ9Ðb!ÜTW_Kà qíCaq¾r·ŒÖ§'ÿ‡–?2š’¿%@Zþÿ'~%ÐÀ¯yjjÈÎÝAtøÛBå·†Ò¨€úEáÙYóÝÂ7çLe9nûD "pž1 ÔoLž6E/üIÝÀ£N—¸·0ЬøxÉG¤ü¯üH/þfïÛa$|$¤°ˆµçàe£a ùwÉ_2üëœiñ#ÿ‹DÔ,Û»;Hýù‰øu,ÖŠEéÇè8xh?ŠßÖ³‘Ë>Y†¢7ãe¸M´—a*ÿØ–µUƒ)À<0'Hþ’¹…/„¤¬O\FË-HqЋ#D¡ü_4‚øuæ4Ug|9Ôh€ À@,ôþC/| IOê†dü\[€õVœrËÞœCN—ø½ +ÿGîþ²Ÿz3gÏ‚ÿ‰]0 üóU­ül yðK¾ž°ðà–¶¶¶ ùç\ôFÈŸ}­³äá.Züò¼À; ¢ |ÈþÐ ÃD\nܸ1(1%®eo@BÅ¥…Ô(€|+ ½½U›ùÚl½·€AN¹­Á¿ hV|öÅg(x·üÅ\`Üú¹mÇf”¼ I±khù#£!p^÷â?è2ö^ä¯Hüã‘{ˆw*Hu¨ ( Áê·†Š °1ƒIø@6oÛ´eoÁž}»@ò ˆIXgV­!0A–;]äv ‹ ÀáœCÀ4µ U–ò/)ÿA‹Š 7—8r+7/çE†ü‡ónú¤t'äÏ€bù0 wzˆ@Áî Õ ÃtýÓ`€Òp(±øgňTÏä/8ôMñÄ/Þçà%þÏÄþ  !•"Àøóá0IÒéSЇ +3ÝÂW™)'É·i`ôˆ†J'¡|E\t¡';÷EeïEVv À¾ƒ»ÑÁo …ŸÇÌìéGÏž={³Á/s†ó3„½°ü¥p‰ËŸQÿ™€Š4°ETƒd &¿—µ²ìêfÇÎí•C̃Ý@…¡B=`lÐ…žÔà_' «œóçÏÞhÙ¹ýÀÂW˜ÞM æ)Oÿèó¦~-õ?X,þûä@ B2&†ý¹KÀþp€ÿðã- ²ªâ-·ðUêêœÃ,}Oh&H€ÍL0+èBOvêuòõÄhºÔýÉÿ\4J øâ|ç/K^ÇûuË3 ~‰oOÿ ¢?" Øâ‰@à€OBDj@}°qq €ðÿSÐ'Û¶ÜI’ÿobù8¡Ò'²p>/öF¡(AgñvÑÑO>á!þG£´]èò`ù_Fœ×`â‹Yþ1ÔÐëþ¢½ýZùgçfµüòögþƒ€#à¡o8vü€¨ø„” ƒ#€†ÂÒ5ýÑ™€U1á'æ@ÛÞø(A8z ¯¼òê}Ãb ‰q]Ð¥ž¬ !oFÒ®œ—üÅ`ï]Ú4­]¥J?ÛMQhN¶ü Yøä ØõCX“?ckVVPB € iÿ)ˆ6cLeÑ{PLlÞÚ̲÷Àèp¸ð¼pTö:~t©'+oÅÉ>!k×­ÖàOÿê¿ÿ/~o¡"ü™½XXù5?öþËÏýòOF‰ü5AÏ Ø\ö:X¾+]#@º¿46­æ¾ÊÊWè@àu€mÛ¶²äùA—z’0²ÉKü#ˆÑcÇ8§O¡ ÀÉ“'ðöϹ¡^ÂÿWo¾3&ûĆ `öìß© @ãšzoùç0ôŠYø®^þÌ-ưôäφ¿fò·ûF ¿]Ìﳂì†á(|}?ÝT½(2…EïA ±iËF]ŒÖT-0 Àø ‹ÝjHð/ŽŽæMÍàû?>ý³viµ"ü(³ºY¼¤æ)½ü™ ³àÃßÀ¯õãð°Š`!Êßÿ³ƒü_°u4E@€µëW?ä¾ÊõËIòŸÅ¡Džºs×§&øGÐÅn;ù:ù?>f”sºë´6ŸŸ<¿ÿ—„‹bÂW˜áÐç¡s§¾85@Ýý#?Îtø ÈFÀä¨g ò‡;„Ò:øsüh«HÕ·€ÒpÑa–½ ÿ¿]YUÎÒ×`´ðäSîu€‡£<ÚÃâ ‹ÝvuxæwÏð>Ax}ÿ?„Nÿ$Áψ¾B^~N#’ôâ@wþZÃ`ðçÁN M,Îøÿ ÈþLƒ…°´{ (Ÿ_‰~BöØ­ @§Á<À„?NdÑÇx¤7»‚.vÛ8ª À”צ°üÝœsÅ`ïý÷ÿ†¦•,y%áÐ;(Êô¯ø8|é»`ŒÐÿ (qðg@ Àþ¥òòؼ0ÆÏ·€ïo‹WObÑ{PJ4oÚÀßú»QÐщ×Þ~g‹^ÈKƒ.wLäµ—ø‡w3cÖ —üÅ`Ç®mÚ,ZR¥J¶›eï/­—?“a!hø‹A`Pþæ¸ßwùÛ» `kF@ù`XFêEÀÿ·€M[šïq _¥når¿7ø`¸Pi1‹t¹Û ÀÝ,{…=D.ÐàÌÙ.øý^E©"üì8rr³NÓ¿k€^þÌ >Goÿ4ߊ×ì‹_¾áÖPñQÑ`QØ(¶"notŽ×~–}"æ9 k#,z h!˜"²Â$c‚.w+ Ùÿ†Eß›Çb¬ß°N€“§>‡(å±èU²˜¼üÙ« žþzàÁ@ fwÿªòÇÀ6—º»)¸%T>ÀàÈ"þoóÃ5qÂ'B.Âå%NIžñÀñú bZ[[L09èr·€o³è5Ðd®6Ç:ðX®Kø E¡ü2ƒ§ÿ[5;€@dgáëåð/ê¿Sðô/XHß™€ô~ €Nþü'Ë^ÃC{ù[7J LN6"3¡øŠQt¹[ >¢“ÿÏi4›$¯îZ·±‰%Ÿ\‚ '‡¿à6bsa0?‚0»Ëæ5Xþx­@ âaT› ò·ty Xò^íó½…_Ö‹–ŸÄ@‰=0Âu€q¿Ï¢÷ä‘Gš‚.w[ئ À„‰`öÚ£ @}c]œðUrˆšÚªqzù3·ƒ0 Ž€gˆælî2=Ú‡ÏAwk/'s&ÀÖTpê ²€V7d²è5lüxɾ=Š“­ “_'û„ ºÜM@ò¿ˆø·.oM{`×ÞVx˜[ø*ë7¬½@yúSÀ –.7Ÿùû¿àïz¾:R‘¿ŸCa8Ì×ý- ³óèm$ùÿ3/Jq«>Z%Gé¯(3ff±èõ ýæŽà> ¿—ø3»)äÏhÐŽ€Ž,¬H ý™=ÐpçèÄA´ka€+6Ž À ˜@0ß Š±/ÉZ¿$i&àÇ> …q‚þ0·¢¤eïÁÒå‹Yö`"Õ‘Þ²OĽA|_0œe¯aùŠeÎÙ³g ƒÓ]_ @ü¤@¢÷$¯ §<ý߬Ù$˜ÆÁcù›Ï€øºl>€‘>ýÛ^ÆÛAñ‚0¸+Ø·¤CÊ+ëzK?ƒä]·‚®]·†%x&è‚ïSHð/ŽŽ–-,ÿn”Ð%0tă[úyn CsjÁ/éÍÄ­ €2 Þ à·üï·-ÿŸþñz€0 ¿µOA)º#èFââ‡ÄõügÐÙÿ…,{ íGÚøS£nmk;h€¿]ð} @¶"ý‘Q†ó40]ÃÂ÷‚¶uiåÿñÖõ,ùÞÌŽ£,šäOÄnР’É_þ3Xþ8ÂÅàÁ6Âà`˜ýd¸HÛ·ü5Äwˆ‹D.!.'®íD¿Ú%ÕV¤_¥„Ù³oÝÜ%&‡Âû¤Kø?U© ºàûý¼¨ìñôø§Yò:}¶ÞÌÂ÷d–©š?Ñ ¸ÃVð6P|$´|!co-ÀÿÅ`;mÞ,˜¶&µÀò¾‚¸I¦}‡»…¯²uûf¾>F»+Ç ¶‚>ûüs,z õA|0| áx@ÿžE€—À×Õ/ë-|…êW< .3h ‚á9Ë[A1žúþRc`ÿ„PÓ0€tz èOü€¸Ì¦THð×y‰n7k×7±øÓn´ô¥)“ݪÐtÁ÷5 º¼0é€Ýû>—À×°äæôðUû‘Àü];€ Ï ‚1¦ò·p.‰É_0 ò·¶ #Ã`Rð- ?ñ=â( yN±ð=ø°¡ŽeïÑ0ØëSß`ÑkØtÁ÷5›¼äÿ3bò«¯ À€šÅUqÂWÉËÏî4xú¨ €ì(<†gpîA˜ŠKÝ\þ‚µk“Á¶Ö4ò·:äŸjoý‰kÁw}+ä7+⯈QW¿ ÐtÁ÷5»YöL}s* À§»·kPUSé~n/æäì×ËŸ¹…ÅF𠘊`+(ˆ€u©øbùƒXÞ*Ÿ ‘¢oý‰kÀ÷}ÛhdÙ÷PêbùŠ¥N§& À»3¦ƒ é ºàû’|áx1íïÓHò]Ú´îúD€Uå,z•l&¿0w›Í§ñ•ò­ ŒDþöÅ/—¿å NÆvPá@Ë€HÁüˆø.¿}HòK 'óˆ¥Ëq\\`fçÍŽ—}"¾zpè‹‚.ù¾àœgF w¦gMçÄPb/‚¯¨ G…¯’ŸíÐ1Ñë€üc38B8 €·‚2 L’åŸùû:lq7#òOÁ·ÿUÄ·€’€Š˜ðUèö0§óx‡Ã#”à—÷ÈþAo® ºäuèäqLö !Iç:gÎt,“‹`h¡(Nø*…Åsê“Àè8< fð<cAþàgðÏ äŸÔÏA–NÅOÿæ¸=EÞúWñûI¾€pæDõ¢J–58 *Xò€‚.yQHðWŽ7™NqY1Ë¿%]]§`èê8Eúyq—Ôà6x„àbx¼ 䊖"ß„åo+¨ù\€"‹Ä`5 7Wñû€éQá»)c*«ÊÝâWCÀ§èP³¸&±ô‡¸øæjHanŒ“}B*#,|/N: PT’Ï¢OLŽSRVTä Àí(QäëÌ(`ùÛŸÀâÇòÇAð1X2 fû< Ÿ0€ø>ñíT Éþ͘ðUè¼ ]€u+Xò€ÁA—¼0™ƒIXµKkµøüä |dQn¼ðÊÂÅȈq‡<x Y3cù ÂÚ;ðVP_€ý ÀMÄUDJ/n’ä_V¤ï†'~5€Â}ÔÔh€¡A—¼4w³è5Ô­¬Óàø £ƒàT b„ËKgùsÀ ˜ù4°|"˜1_ðÿxˆ?Œí­ @þ.¤ÇAø`b7ð‹>•q¸ýsŒDϰ±yƒI¾¹^ü0€Õkš´ ´òß²½9Nø*sºdzš½àYÉD0Ø*Ú$]ÄÁºøí/Ë·‚úz„ýô#®&Òn+#‰þi—ðÂÎÁ¶ýì‚èˆa€í­Û<Åÿ@ŒqA—¼4cQ6oÙ¤ ÀÑÎ#ð$P·ðU*#寙D@¼HÁ]ÁIœÀ?g"?×lÞ €‚À°[ˆëÀÓ~ÊC’ÓKø ûìaù«t0'À‘ÐûöíÊ^ÃÂ.yiÆ{Ê8AìܹCxô†MkXò*³{¨Z¸àE½üþþ/SÀ?—Á6žÀçÉÖä‹Â>p¯­¡0ÿ·‚âA0 Æ^Xú×ÿgï\ƒ³¨Î<„äƒH¸ZDðB-m…:£Žhå¢ÜjÛiµÖ¶Ã”*Sm+Lµ¥8-¢ŽÚ©ÅñÈ=!!äB !‚Q.b’R&!wÛ/ÛwÞY²—³ç¼_NN–ïs÷ÇãŒÀÀÊŸgÏ9»gcŒ'yÂü'é§›8W_£]éhÕaB@Î3‹žÇK^—¼lVê²çÒØØ¢ïEœp¹¥Y€ã'?2„ogääe=3h0þÇ»ŒFèÄ£ñÀMÆ7‡Á¨~Q-…›Åˆ{ò§÷d¾  ì(ùL&o†sDáóÈLÑjëª ù³! —€ÚÛÛPòBzè¯K^* ø¥€&¢úl%ÊŸAB 1(=}Ô&|–¬œ«™ÐK@ˆ`x*p=p‰Ä80FÂ4”‡ºÌ¢~éÇýYA¨|%ÌÝÐð†ôY@ò‹­Âg©;_‹Âç@>Ú|é¢Möެñºäeð#»ðÚ8yªeÏ£õŠx ¬â#üX°°ŽÀËc ,3 ð×5‹_.ÈHñÀdü³úõf03÷åOC?$ÿ(¨Ä‹`ßUw‹7¤Ï‚ ÐXRû¸ÐÔ µ õõçPò+½.y©€à4+‹-þð¼íÛkÂò) 3U§Pò|Þ…»‡Ô7 ÙËnm aÑÀD`*ŠDâi Õ Ä{äf°ì{’˜I€~ì[ÀΚ¾W°Ì>Kp±¹ Ð¦Ó ô/Ÿ|RL~áuÉK`ñ½€&b_Q!JŸ `[0/‚™…o~.-=y ýM`N¦êrަ ×·è×uõDrùÓbV/~õòGdÞ`äO@ú(c/i4éu©hH~•Uø,Ÿ¶\Bù3€ã¥Ç¥ÿ •x},dp;€œ¼a°ÒDâ·š„χÅÅ6St¡¢D@¸$D0 ˜LÖ¯÷.jSXEÜ^¢å/¿,u*¨ü9@ç-à;ô°^—ˆ ø—éï´€Ïúƒð¹t(9\‚’'˜çõ± À$*ié©Âtuw’HJsÿVäÔ„bù#Ó0Õ? 8Tè c€o¢TPT†ðÜÞP1+ P D$‰7©»ÿ;ôp¢½. ðŠÞ‘4-3;]kïl³À ]ÈÞ}{ƒ ÀÝ^ ÙŒ´ÿ–mñÛ„èé馃NO4 Ÿ%)%._"ÓPÔºø]ˆ€|XÆÍ*”?¢nIˆþ=ˆÌRÿqxBþ€Eþøýi=Ì£®ã^—EÑ¿e>Cö®L”>KðÈÞ•L¦y},¤‚|hN,¶¼³E/€ l9ˆÿ½>à¸è’ 0Í€ÑÀ0"RŸ Ð10˜¤ÿ·Þ‰â“ OÊ×r/€’¿ä{±ü3˜¢w 0 ˆÐr?2H‹³K‡‰Ýù9¸GpB@ -}»ƒðçÌC&x},¨ˆ"Ћ²ç°ñï›@ò=ÂTÕœ2{»Iø@¼•„äm¥AÎðI ]”ÃW#@‡@YÖ ÀMúÒtŒƒ±ŒdWr³X½øé½©Aiùß LnÕÿÎÆèã=T'ÂŽ/ÿ eïDVšV°/7yûÀ¶„mºè…\çõ±Hþ ñxõõ #Ô7q*¢wd´µ:¸`Š.øaîG‰‘zPrã9˜¥dIH½üJþ,(û¦Ô&ãô1‰"M ôäïßý«D_hŸ¥è@ŠŸ%ølyçmJþ_x}€QÖ¾²…/¢¦®R€]{²MÂg‰OŒmâÊŸ ÀhFþ’P9 Cà>œÄ·ÆÎ(Üû­rW/÷šîÞo×ÇùVÛÑ£ôñ Q6"jÇ—ÿà’?Š{Å%E(|>t6nÞlþ÷Xº½> @©Uú‹,¼ø‡ÕdÎ5T °go.ŠÞ™÷µ¸„Ø^2Ƈ°ˆTÔÏB<1ýÂØ þ0˜L2Àܬs‹.ëÉú¸LÖÿýfý×ÞLЯë±z¼GéV´ÃØ8D+ÿîßÕÔ¢ìÈ}xPëèBÙó °þµ (z½> À¢ƒ€ÆãÙžÓz{{~êÎ×°·h·EøH‚•ªêÊûˆ(€›+§ABÿýDsÎa˜œüÙøK?×|$ð¹!|–ŽÆèHàëþL Úëc1Ðä:Ê1<½b9Ê߀AÃ…sÂ|px?J^DÑŸ˜D‰¨[¢‰Q -÷P?-•ò÷7~ütFúÙVNŸ9 âoGùô/¿[³š À1¯Å@‚²w`>ðø“O ðE457 p´ô#ü8Ù¹™"D›¸/}(Èß_ú éüEÏ%Ž‚>«uB6€eË—S8àõ±P@ô›PöÎà¾@k[«0ðMò³ y!驱‚Ü †·#@‡€&4¥¯^ü¾ü½H~Mø Í—šPüvhù,Z²„•þ\ )^‹$¿ÐDÀ‘ТP'‚"É©ñ6éÇjq‰Éi Å‚»ÿñúõFQJ#à~w…O‹?äï tÁÇÚ…¿ÓDVN.ñ€ð9Ðòo8_’g™kf×Çb ˜K ;7K€nú< \#Ñs—ÁÎ m€lTÎèÈ##x7Å/¿äCËß¿û›BÙÛÉ€‚Â<±üéàQô x °üÌëc1ÐL ðÖÛoè»Mô0TÕŠ_Û]ÃH?ÞʽŸõNwÀdÓõ¢Ü‹€|B˜ëTŠß—¿7Ù·Âg)9|@ëìXÒÒÓPòwy},(ðDºExiíË(~çÎ °ÿƒB½ˆcÇ?Zèû9Q "àVЗ>-~õK>êåïÀ@ð£Í™ äÄ©c€  À››7Ròÿ ðP€ã†ðZY´P[öô22MõÂ9ZÂÿV-> ò w¯tÀ(ÛõFJD@õlC ‹[ÂwGüîËß¿û¿æ¸Ï$|†, êlßtöÑ¿¼ðâï©4y},`a’.û>6ñȣ߇cŸ»„h¾ÜD}^—=Ÿ9;Þp@”íz‡â)ŠA´òШJ’_ h"êêk…hi», @Eu™½ŽâOÐIÏHI·`²ÃõF¤Û¸O´„ø•Êßâ'<É¿j>KkÛ§†üÙhkkÁ£Ÿ…˜3÷_^ Uø)€Åûñã/:Là‘/òI í;RLÂgIIK8i À ×;ˆt?Ht˜Ç Ú}ñ»/?ƒ ~' ñص' EχÀ™Šr›ìYîŸ3w•×ÇBUfRˆKŒCñóéÉ— »{'Oþ8;þwåJÛwLùæH"Ä’«!@BQø´øÝ—¿¿éhaÅ¿£ý÷Q —ò ò­²wf‘×ÇBU†_аá (zg‰c¡÷ï5dÏÎZj ÀÎ5•ˆ€ë! q_ö´ôiñûò÷´üïDÑÛÈ6q¢ô¨ÖÕÓ ¢$ð^l,OúÀœ«ÜêõñFQžyþ92õµÂ+=¢NfVúÛf˜ÙˆT:4ÑaÈðP¿/ÿðdÿ< ßÎ.ƒºú­»§éÒéoÖýõ/VÙ³üðÇXa yòøñã2À œýÁ•?.UŸÖ’RãMÂgIIK,3íàóöȸ$\¥//~õwý¾üC}¶.|x4 ÀÀ:#è¢ðÔÊ(zå^ Õø'ÊÞÌ«,@ZZ.cX00ðmÂTÖ”k9y™ù)qðEó¥‹3ñƒ#âk*—C€„¡ôQü”øUËßßô½¶€Ü#€N‘ü‹Š mògCÐI £ãжpÉ*^¥Ñ?«ËžËþâ"¾ˆªZçÄWê(.Ùg>KaQÁÓøE)ñ5Gð$âBˆи%{õÒG¾ü=€»­ÂÏ´œ,;Ž¢@Þý—>…’'XïõñP€šˆMÿØD ¡±V€§>æŠ?Iöb@rÈÝÙƒ0f˜›â÷å¾€ä×X„og÷ çëÄ覗/–ÿì9Ú¬Ùs~âõñP€Hà3QžZ±œ ¼, ’²=Ñ$|–Ôí‰UøApúºQD(ŒÁ°~ðåï’/° ß>æÝÞyDߥÓÉÌðoW¿h•=Ë—À8¯‡DÈ€g]ºÜ, @{Ggýß^áÈHâ¿âËAÑ (óúx VÖšˆü½ùä, º¶B€ƒ‡ŠìÂg€óÆÄ5QÅ! qEöòÜ¿/ÿðÿ_þ;‘²ò“}à„€¼û?zìc”<Á&¯Ç`à»ðçÙxýooÀ:^ƒ)ÌGâ+­Àƒá@ò\’´ô¤wƒ¼n”†‹!`cþT‹ß—ÿ×.k­Â7ÈÕi¼Ð`ÈŸ APëÿï¾ÿ^˜ý¨×ÇcP‚:̓¥¿þ _Dóå‹€¤e$Âwæ2ÄuGp#HXKŸ&j°ïú}ù‡. úr»ð‘Ý·'OùÙójýÿ7«VÙeoçs`¤×ÇC24 ù@ã€ï455 Ðny Ü1» r9âÒ®’°HbH.4 ÂPøòâ÷åÿõD?Ó*|øH¾á€\ÿomýT›;>Š^ÀQ¯Ç`à~æ#¹y983èb¨>WaZÿg9tä “ðí$ãuIÎÜMhÊž–¾zñÓK>¾üCüF@QQyÚ'ÄÝ?D¤„’¿vßìÙ¯{}<;3tÙsYÿÚz¿ˆ† u¼å¤¢ªLKMOBÑ;‘ÿb‚œ`Ü ,H±«'J­øé»þÿ³wî±YuOËb¦™ÄhŒ—¨‰Æ¿4S;œ E˜8 3÷‹'fC a â0úÇ‚£¹qkûRz/m)…퀶”[iûö¥´¥êFoÀ8~óKËyOŸsžß3„—ó¾ÏóÇ'YÈþx·ßáó9ç9ç<ÇÈ?"ä šÜÅà>mí×ïo /F@íðÛÛ·9e?±Ä³ºÏä`r h•`ί^bÐÔÜ ÀyëÈÌNµ…ïÍ<ÕØpàCà—øKúêâ7K>Q€)nÂO áØ‰|«³ëC1Jëÿ¯,Y씽È0T÷™<„°Hpÿ„jk«e BöÒ¼_|Ü[üñ÷ÉS]rÂ_ <²€È~øÅoäY@ö»Â™N‚Õ$~;Üþ?ô~Ñè Iô tŸG¸°ŒD/!p À^`{hYèŸ{œÂ'Þ å.ø²êU€B âgÙóÒçÅo–|¢ Èþ)ÐM¢÷ ã` ɽ³ë¦{ÀÍ›üúnÞ!’<ÛºÏ$,€à¿å)ÿɬY¿– Àõ–FHÞ3´q\nþA½{xCõ*€‰‚0Ä€! rg¥ÿ°Åoä™@ðó€%ãäé"’?ðŠ€ÒóÿÞºU%ãuŸI8@@ò×€åųS§BðM²Ðc_xHÀ%;ôR˜ |‘rú]ŠWa Å xˆßà€Ã¢ô“Ô××9 †€•{{«õãŸNãäßžÔ}&á À{À’ˆ‡äåWõ µâÙ¿â@J¢»ø<ó"À„€‹OôJ_]üFþQ!ÿ¯€»…ŸÞOV2¶mϤuþ.¸…@iù';7‡“?›«ûL€\–®\Að€€ÇÃ<–lŽÏ…Oì åmõ±a‹ÿeÏKÿaŠßÈ?2€ìÿà¾ÈÙó%VW÷M@p Á Ë?¿_³f ì‰N–ê>“p`0hwJR(ôdPU°’d/£ª¦\€så¥$yب SÀ£uü%zQúFüúáà›€%KÀ$!¬ü®]µÆÆÅ‘ä=3ö6xZ÷¹„3$ÿ÷Páwaû?·ÓZ¿ˆ€†Æ+ÒP)¶ì½ÙôxT! Dƒ…øü#È}'ÿü‚<¿ÓFˆ€ÚòÏÞ„}dïÊ~ÝgòXÁ–ŒY/Í!á˸q£Õõ°Í«ðd»ô|>«>| ÔÑ@ú$~sÖÕò êEé§Ü'\ª¼è €ú»Ï¿üµ„$Ï0]÷¹„/b*]å?ɦèýB6Õ—+e ÷IûHô"»CYûwˆˆ‘=O¬¿6Xà&|â Y9ixöÿ†Õ á{D@ééŸKå*òoƒuŸËã À:½„ÚÄ€¶ˆÆòg*n“äeÄ'înŸVŽOlb àÑóÒ7K=úÙ‚è«Â9{¾”äo#D@iïŸmÿØ®€mºÏ层ÿ¸' ÀÔŸMÃÓ>-Òtü·DoË_ ÀÅŠ³VbÒ>[öÞ¬~kxC@1ˆBb?!1FþÑä>X2²²ÓèïrwO§,JË?3^xA%ÃuŸKÀFà°d¤¦§²WW®ÖÊ@às‘¢ðÍàSðßóHb"YøFüÈ=”s8s¶òïê£Ó5Øû‡•ÿ‰ÂRñ B÷¹ø% ܤ?.„U«_cÐ~£• í š˜´—D/²'”•öoôUˆè>cÄÕø…»ôSû¡³ÿmvÜB xö¿qóf[öÞ¬Õ}.~ Àg ù`‰Äøt$¾ z™ÀåúYhëˆü‚\’¼ \ÿïÍ¡˜0Ä@À7¢ç‰1â×&e¡ÂÏì'Û¦´ì´-}tògÿô寸)S$âc =æ.øªîsñCÈ~/É^ÂŽwvbÀ}x\´· ”¿€ et/À¾û÷,²c¸B@Äú #}ÃáOs _gÿtßÙ¯(mü––‘>@ö®äë>Ÿ î9WñÇÙÌœõKú0† :<©«¯Ïþí‡æ¸_  ~o8c¢AøFüz¹Ç€`É(.=Iâ·CÐÅ¿ùK¼¼`Iža¾î³ñ[AòÍÀ’Hà/Ûš=–lÎ_*£{$z½¡l°g¸BÀãgáéB°X­¸rïéí&ĨŸýç=¢"ÿð”î³ñSþ¯\fÏ}Ñêèhg„Ú+U’\$òŽd“ä½Hàø&óÛÞð‹ÞHßà!ÿσwé§YàtI‘-¯tw*ý/^¶\%»uŸ_ð ð±›øÇ†’–Â-­MlΗŸ¡{¶ð]H"2Ãü?5Æé>av† ?«Ÿ'-­Íù !P<û/,*dåÿFè>ÿ@ŒÀ.½„¹ó_¦sÔ\®” äåg Âwgßóý¿ÑÄÀß ÂÙßs _äTq‘Õ Ñ¯(Ÿý¯\µJ”½È!Ýgãë@ðßw¹ÌÉb|2’ ½œ”’à&üÔƒ¡¯‰‚¾Á Ä>”KFö¡ ZÎ…üePÚõ³¸¤˜¯ÀÝçヰp˜¿x! ž£º®R¢ðTIÞ€“-~„½Á'xX•!ýž>º]C€›¿JÏ_{ýu^þ£Æ×}6‘€ï‰ÒŸÀD›ÃGòØ£ùú5& æ"½œBÂ÷âq|[÷ ù|è-þtë ÀÆŒ$÷Þ[=’¨ýŸ;ŽžùwÊÞ•)ºÏ'@@ö$z KV,S»PWÉ ìB‰ |wâÍ¢Áà€]¢ðA®“Ʀ’¿‚ųÿ5ë×{ Œî§X÷ÙDT ø‘2ùéãxáq•÷lù’¿3 œ¶ˆp¾³uºÁ0È~¢(|‘’3§¬[>FOþ(îù?Ζ½7Ïë>ÿ€@É^¯ûªÒYB}Cm¿ü½@ßHNÛï*ýýN:€ÙGÄ`èb®KFîá,;ä/@W—Ú“?oþq žá0÷¬"-|°8NŸâÚe°ª¶\âdqa¿ðE’‚'t¾ÁЀt`qk*!ý^÷(íøY]´Fï*ýï;yQ÷ùø7| ¹,ÿÍJ¥³…¦æ6U—°‚ðE,ð–îÃ7 öÕœø³s3°\{„äñË"`ïøÉ°~ÃQö"A«ûŒ"9SÅÆ(¾dpîb)½ ßIRrÂ=ðœî€Akù9…ŸáƒCN®ãíü[·{ (ßø=QTHOû@î¯è>#ÿ€@©«ø'ØLÿùL«¹¹‘=pÚÚ®s Ž?, ß„¢ |I÷ƒÀ ¥ü?êEá‹”+±n“ü ¯¨Üø¥gÍ«"ÿz`–i£ 3IôlýÛ_Ôn_»ÌNû—‹Âwå(0—™­€ØSÅAÏüwwR÷(oùðλïÊÅ?ò>+tŸQT²àËBe?Z„¾ Vvî wÑëçÁÚK¶ü…´etrZ€$ïMb?u? ZÉÿw*òÏÉË´ÚÚ[ ý[6.èíU»ñ[[WcŸü#Qö"õ`ˆîsІü(pX2-_JŠÂÂL"qª´ÈCø6¸ &é~0´ÿÁG|2ñfп$ª7~ßX»ŽÏcžû¼ðø7°8JSÝ• "ÿØ!AøRïÓ ¾ ûaˆjù? ®x ?'Ϧ´ì”uû _B/mù ò÷µàX‚øGY ]÷9Ek†v.?™1Ýjll`(|?‚'ñK€?§}ÌmáK)Cu?( Q)ÿA S¾HÁ‰ÃôDÏ…@éÆo[[‹5söQöà'½àëºÏ*rÀG`!°86¿µEm)¨¥‘ q÷RÒ÷KÄ%#95`ž>0DþN¼zÛx‡üo÷qË+Êßùý׎$xÖé>§h@ (r¼È˜‰qVII±ÒÁuO‘ü%‚Ó¥EîÂÉ"ÿÑýÀ0Dû`©P[WmË_žµ¥Ÿ`u•5zbœŠü«À“ºÏ*š@@ðß÷Ë~”ó-Tù~0ý;µW‚ž†päXž»ðÓ\ÙªûÁñ?öÎ;¸ÊëÌÃc'âdwâÍ$›ÙÝ”Íd™]²qŠŠz—Ýì@lœ!ØÁNì`ÇaÁÆlªD ª¨5$PêBB]u!ŠdÀBXóîoß¹WŸ.·œó]„þÎÏŒGÒð‡ï¹¿ç{ß÷|ç(¾á¿ å%øöaðà»~dÏú—}ú÷1úge0øÕ€¬gAìþX©EÖÛ{™^ ü¼ŽŠ@¸KrøU£/Å#þÏ€»‚–“›ŸÉOõzR}C.üG»î3úge4ü#¾#¼üý©®®Fj±á I‘@=_#™x숽À$€»àY£/Å#þ~à–À·âdÖqêÅ‹·n @ºïßÞÑFþ!¡6ÂÞŠ> ÞÆ7üt@"ž}þ9ÞE 9 àlK=_ ƒ¡°Uà[‘ÄÜê6"Å£þ. _ |û¤g¤â Å.º}û–†mÈöý¹-ûòrÀK°Ð蟗ñ I ˆeËß•[xWy S^Yl#ðíÒ\Œ¾X?õ§@ Ú:Z8ôm`!Ïtôý7GG ƒÿT€¯ý33²žŸ9Î ’õÌ„hÅe§8àÅÄè#¾`uøÿ´’çûk/€lß¿ °€\Ü<¬ÃÞš»ÀÕ蟙q I`©)è™1vð ú†Zùy€XÌ©¢{Ï$Xr5!9ÎÝè‹FñP†ÿHpˆôÌTª­¯â€#ß÷ïìl§€Ð0x1c¢þ™)„ûpˆYs~C=½—åæçÛdÀäžÊ²ø ÙŠ Äè GñP…¿;¸ê ð-¨¬*ã'{à 7©ïÀ¯¯Ú û{iß2ú禠Ià' ˆwW,—ž´vœ €i ¬œt-ðÅÜÏ}ñ(Šð7­ß¥åEÜÏ— ¼ð%Ý÷ßc{·À¯þ¹)XK` kÆ…çÉ)ÉÒ»phœŒøwØ'þ#ƒ$&¹ ^3úRü]Ãÿ7à‡»…Åy¸¶q€Û:ÃþEÅEäâîÁ/Á£nJv@ÀGÀ󀆯:^|275·6 ¸e„­sö_ã˜+ÁcF_HŠ/úëà. ò ²ÑË¿Î]t }»º:)(|¢8øG1qFÿÜ” `¨dÑ&fÏC½ró>Üê\kƒ@ƒ{øŠ<ËÀ²¨ä_Dð?V’„O÷ü¤ï;È…¿˜…‹Ù {kÐ÷¥úþJb üèã°¿K–¯\!»Pùf#„¼PçL@iÍá.標d Ž’V<Èðÿ*Ø H–|<ù÷iᯠÀŽð·Òß©˜]»8Üíñ´Æ- Þ£Qa?CÞ1<#ˆOŒ—^°—/_@ø7`®2²O8 |&ÉL S ~`ôE¥x áÿH–Â’|èÓ‚_ É›½˜“™¼ß_ {‡¨·}•ô€ßH„‡§efgJ/Ü‹—ºÅ`ùgÙyvß.W@¨Ñ–bXÃ8HÞíƒÛºLG9fW@Ï^¦¤´„\Ç{r¸KpÔ蟟€s*‰ðôõ£Ò²éÜ}±KFf¸ŒF¨ëánRJü*ð5£/0Å}÷ûÿþ,•Uåôé§7ˆ/nJ \—þîÔÔÖпÙðoOýsTp^Oë€Dø‡„P­ÜÉ¡ÌùîY0E¥ù‚Ð$Y£(95þ‡F_d §Âÿ»à yø _ÞçÏáÏp,\ý(ýiiiÆŽŸÙð¿FýsT¸ Ìdf”‰°)“y‘Ê.èÎómÒhnk¤²Š"ÇŸj“« Üè M¡+ü'€n@zh:×`þŒ& ûtOí©‹¦Î|V"øG›yÅ蟣ÀðI J {¸{ÐôY³øRy]•€µ¬%Ð €Šª2:–š ¾<«“SUKHá0øoëmùàF>Õ7uY ÀºÐýäùòEš;ï%ûaoÍ£–JÃÂý« Ù2ìíóÛ—æÑåž‹Ò üÂÅ.Y€³T]WI)'%ƒ?aˆ£ü»ÑÂføÿ3H¤Þ©v¾»“ÃHI@¾çÏ/RšÂ´c\)ß0úç©0Ì ØŸ€dxåµE|„žÝA €©?[ÃO^‚À'æ¸×Àl£/<…Eø‡ €ôîñG@cà{“Ñ`_×åwû0SŸ™é(왟kÔoýóTxpø'P'+w–.ѳØQ5\à  €áŸŸ*ʵøb²Á}<ø ’1:wúàIžwûhp,¾>Þç/ͼùó­ÃÞx ßÓÇkQ@°ÿH¿?u4ŠÀ“À÷A§¬V¯_«kÑãa>@N,Êê2JMKâ`×Gâí”㉀o}!,øG€·ÁMgZ>­íÍt“ƒßÌM‡ÀÏõ¼á˼ùÖbËwþäéãM~~ä‚üûƒ C"ƒCƒæ†„œd —{ˆŽÙªgñóÙA-íM²Àßž¥†¦Zþr:{&ÅÌ :Ád£/Fƒ„häLËç_qø) àwzÎöaÞ[ñ¾løó0x¼·'ùø0IÀŸ‚ü  H€‚B " . ‰ ›:g⤰‘S§OVRPpZ®à‡¼wúhíj^Üz†_­ÍV¶šø¿ Šsí¾˜ãà'F_”_Òàÿ>ˆ¤¾Ä…ßÖ½y“ƒ_Jøv¤³$¯¿ñ»,c='Ÿùøû À,l–DÁaA Phx0¡ðˆÐPD‚9“¦LTRPáîÜö.n¶y{Éßô †ùoÛ;[¤`æLu9OOæPw‚OSN$-_7úâü’ÿ×ÀŸÁ gZ>-mçüÀÝá?çÅu…¿ûøñäåëMÞ~Þäë‡ ÀŸ+Æ?H«‚‚)(”«€A „A¨ 3a ¸19¼DBs&Oø¤ .ŽW° ‚ý9p øã«|(œ tžo×%À-¡Ìœ4ÉÐO¢TšfA;˜F}‘>Â'wδ{D-žIáL`!‡èÇÚ•ÿÞÞŠ˜:MWø»ât^ }ÉÛט*ÿ{Û@CÚ@f W,€`K"&…$ÀLš<ñdP"!„¹S¦Múo%%€¡x $ü¤ÓÕÕ¡ëéèâånzY0ø]Iyúа×_Šn°¨Añ£3à}´r–šÚ3¼eÓþ²Ðs¢'séÒš÷ûßë ÿѨ´=Ñ÷÷òñ6U>À,­ ÄU@°&¡m ni°þšá?„‚n€"È`ø™Ñ×q I`•¬~ ¦ÎœIçZšt‡Û:›íÀZ­÷Sã¹:ÊÍϽÞÔ´ä·qYºTãá þo‚E‚ýüBŠJòù%F¼©ËX ÀŽð;ÝÃÞήNzþ·/è 77šàåI¼½¸€0 ÀÜbì´4„=áo ð9ؾcôuhd<6[…½‚#"¨º¦JÏ—†/›ïêîÐ%3gjNó—\>ô“q;H· ¼¾kôÅûÿ·À[ ³då¦s¯¡8ü%%ÀW=^ÕÙï?×ÜD“¦?£+üC"&ÒªVÐ’eïÐ_…ž›ó<"ص6/ã Im €Á6Û@¡m §Â(Õ@}/Œ' ûR@²xâ©«ˆ¿z¸Ä-¡&]ü÷Åe§8Ìm~º47ÀðoF_ÄÇ ZÞŸºøÁàZß~¡,% w?SU]Eþ¡aúžü]ÝèÅ¢õQk(rã:Ú¸ymÞIÑÛ7QÔæHZ 1,þë›ôÒüyŽ ç6P€VhµœÂ\€@5P0¤4 ,Ÿ²‰«%c=½)=#¿ú[B-vXÖhMu”“—!z1·Ž§Û†ËìÇõæƒ~°^¼«GLAQ.]¼xžßè¸ö²Àïõ¶|˜Â¢Bïã§»íã1a<ýîåy´.r5mظ–¢6­§M["i˶´5f3Å쌦»·Ñ®½1´wßNÚ¹7bXOソ/Ðô™Ó(Û@AÀº fÑr:ü•”%0Üâ·‰ÛPøzɸ£qü%q¢%$-MÍáÝaMÍ<äEø3:$ ÝÞ¥“´“éXçãu…ÿ(„¿ûøqÀ8íTZ»þ#Z‰*`ª€-hKtWÛvl¡»¶ÒÎ=ÛiwìŠÝ¿‹öÚCâöÑá£ûéHÂAŠ‹?1l§5ø7Þ\üg´fsø‡NÔ$ µt‡¿’€€%z_ÐÏ!/†gï¯ú€_s¦%„`´¬`*•žâ¾<%`P_ç{û/‚\pé3|®\ë¥~>c!±ô·|x+3Âz3ýrŒ›Îðw'·qcÉx@ž¾^ï¹ ˆŒZËOø›¢µ*`»© ØC{Pì;°›ÞKìGø £‰‡(!ù%¥ÆóK’ÜÅÚ†X"K–ý ç½€ŸdnɆ¿’€€mì. =~u³æÎ¡ÆÆ½_4Ggw»œ @ƒ¤..+@x§€c÷MZF ; Lêå2ñK[áàøÙóú9ø±§ßg⺆  üÔ¯óÅ.¦­½•æ½ÌÛ<õ‡ÿX0(n-_±ŒÖn@Dnä*³®h;ª€S°gßÚ{UÀA .UÀT‡(>é0ß©Œ·åSÒ’x¦g§Œœ”•w’rOeRnA6ÏÄvãßX¹ê}ZˆÒŒg§Ù %%¡~ Ú8ì%™àëGI)ÉΔڼ®[€ß°Ì?2úâ7…þ¿€Y`»`'n2²NPUMfE=Üîé7c-»­ üΙ^?““—‹MAº‚ÿiSÛÇÕðPŒ#n7þò'Z»îCm€*`óà,`ËY°UÀAT‡béБ}ü¤H8Ç*á½®nÓ2SøÿU&vBeçgP^aŸ²[XšÇïÑ”UQù™bÊ9•Éí¤×|@ÓfL!»’€€õÕ€$áñ²÷ߣžžKNÍpù¼#Û`ºZX å•Åü)|giÑ«gÀ÷ øß“A$¨$Fÿñ 5ugèã+=þO@£W}ÚK]ºø-ŸuQQô‹Ñ®zŸü{GaÝvÇLÌ@àÊÐ$ðÁ«×­BD™gÀVó, š0 €0 ˆÝI±x€*`ß`G‰¸Vgfñ“þ ¬Åô,ÌF²Ó(ÛTäeSaIaÇ\iE!  ²¦ŒÎÔ–SUÝie?M1YI@ @—žùÂðcɌٳ©®¾Ö¹/#v ¡-$-`€þûÓgJ9Xî3ðEáU Öƒ‰àÉ/Iàÿ«@ø§‡»µõÕøÜ{9ø5lH`À®œm÷0­­ÍôÂïæs ë¤[=½ðô¸ÓhTc< ­ 0ž>…V¯]iš¬±˜D£ ØfšìܽÝ4 Ø…*`aÀ¡—€* ñ0%ãYÚ@< n•eG(r¸ ȦSÅ9@þ`pºªÄ$€ ª®¯ TJJº%ðHÒÂ^ŽqÞ>t4!^ÿ—R»l†ƒÝzì¸ Ðh忯¬.ç ÑøúùT‚Xð˜žßxHƒþ ðs0 ¼vƒRpЄ_âªo¬¡«î⩹´ð—ªí1YÙYäåèLøçƒ'=<=íæÖ?Ê%@cÛ@,®<}|Ђ֮"žp Îþ_<  ]{bx{`7ªž`§ª€DÌ’ s ¢åJ7k;;Ÿ«´r¨ $—ŠË‡TÕe\@ÌÁ8%% п6’Ç•~ þºt‰ÖÒ½ƒÛBÎ t@€WÛPEÅy@‚Ànî‚6€Àü<ö\šþc‚(ptˆwê ?%Ø·´5ѵO® ô¯™Ñ$Ð/-A»G¸ùm™uhùŒq&ü÷¯kǬ»rÀm –€UèÝåÿƒãÕ!uÀà,0íÚ²u#­G‹hf»y°‹xËUÀÌâyp”p*Ÿuü$ϸʅP¹ßY¯^XŠ*àt  ¢ª­ %%€áÁÿ±wæÁQ]W®WjÆ55óÏÌ$U™q¦’Ìx;v@ ¶Á/ì‹c6³›EЂо#´²‰E,FØFlì/l6‹1vl³ €‰kœ²3äΧSýxÝ­nõëׯµ ûÇWØ¢1÷û}}Ϲ÷ÜApÛwØû‡9Bî#$l »X{NÊ@v Ô rgÁ N’~xà÷J-Ì·pÎÁI8{à X…10ÆÁ4˜©°Êa3ì†ýp¾‚kð-¨–dßÁ÷Õ§Ÿ–=·ÿd†¾OX¯±[î¾øòjôø v‚ÿ/0Áû™ ü‹D")©Îf/@Ê@Ñó¢Tn~¦Ù p;@ø ãTjZ²JÏHe|D–ìZ^^*=z¬¦¥À*€-¡»·J/`ôvÑ võxOÓ 0šÁwWÇO6H Æ]”˜Ök haÿŸ„z ¨`x¬GOv;¬6î°½[ˆQÓ! D&Àô ËÃCXiâ½ÞU'O¤ê®\"ôoºqË®äçnÙ/÷[¶V©'{÷±þgáaß-=öJ'ŸýöÆO'3òò^(Fw{¥"€”´•ž™ª2³3TNn6½ƒ<’å³:XÌk‹¤a¼Ž=Ùjöö¸z{î{R’^€Hà!úÞX§% <ú}°T° 5Rª>̧҃INŸ·+@î\>ÇÒÓ<0KêvàvwòÔ?Ì*íK´FàûF`YòuJF¡¼_X}žTã&I£×ëà~ÏBd·nÿƒ”!³`¬¤ŒÒÛ1 uࣴ(A%§$‰2²ÒTVN¦ÊÉ˦l$@…ª´¬aµP¦V¬\®V–7œ(çÜÀzÂn¶‡š[BéÈŽ )©£MH€^Á®% `OàvÀàô@FK$$-T/žéÁ¾Þ ‚º þ%` š€ÁyyÝ'ŸžTÈ@¯ šFþ~Ž}t˜1áge 'Amb†¾­UÿR©˜TGí}±lO¶üßÀø@Ï@×'žèЩK—¯#(e .¬zöêŧz›áêäêùæ¹€eÅ2()y¡JI]Ä?³ ÈJ—RPn~«PTÀA²"Δ²bX*Xµ¦\­­Xͪ`ÚøúÎl¤\TIŸ`«ì:è.9pØ€!aCe…–€€m üŽšaož}žæÈëÆRàrÝÅ«k¸ä‰Ì&:uæci`ÒlkÏ/ßÿÑcÕê³ÏÏPÞ©U7oßÂÞ'7íH€¯‡ü@£t—zúùì~êÿ²>Z½ë$ DRêÖ¨”’ȧz$—åê44„€«Àê@%&%ˆèp‚8M¤Á*€UC®”‚ŠŠ—ðúb$P¦–¯\Æ*`ÛGW©Šuk˜%´^½¾i£Ú´™BonfUð†›öß•À1ؤ% `Âü>(øøaÔØq|’<êC/»;Ø5d½`bÀ§XeµÀa3-}$#ªÙ^z/¾|GjJÁRÚ¹Ñ$à[ °(¾æDðËH’)3fJÛ¤‚ºMŽð/£ tW]ÜzsæÎV™9i*;U@~nž¦ "X£.JT‹(¥J? id¸JAy”ŽFI!¯§´ŒCd”ÊW­TkXT¬_ë.Vj󛛦pµHÀ<ÀöÐF`û©–€@H"è·$ì-ÓY,ÓSyÃ×ÕÕ†.ÊuW/IÐÓ€ð‚Pü‚m'A) 8Ng¶Ù>µcêøÕR»T{^Ng ·€?Ú—?ÊçfhÔ_»JM½TEvÜnðcí¼ï96º#hÜ 0Ë@4‚©í§èF/  ˜§ƒKiòÆ,˜O38^VÉ”‚ÒÒú”‚2¥$ ᢑ@iC)ˆ~ÀÊU+ÔªÕåÞ`°ÜzJK¥. |à&ƒ¦Ni h8 ¡þñöéýì³ìy–d!CxÉÎ!>½†(ð#€Ú+—Mø½Î1¨î¬œ=8ΉäCGöÉiMî´tÐËŸ£šIªŸ¬á“ý'Ò´½rµVݸyÍÀ~K€àKA·ÍOûN°—]Ïʧþ3`ûžÜˆÇº=Ø‘ò'Pî½)5¤Ò³R(ë¤ÉŽ \cGP!“B]½€ñ1*>q«”¨R\ÛB‘€”ŽŒRP!¥ ’Ò"žRPC? ¼±ÖR*æ5"·L È!1/ œ8}ÌCœCÐÐI÷æqð ¨ ‰èÌñü‰\ÆqÀ±`û)#¨ë$Ì}ü | | .° ©sƒ¯Éa6.·‘27[‰ Žò©›¦³ÜoËP/9£@PS‚yÇŸ4äë”häu¼^.KaD¶¬DjhÌ2M“û8#9NpáYÙ>[ýŠºþÇzY)xÀ”€ƒ«GC_øøÄÇ\µJðÿ²Œ’]"»uïÀàį;!JAe COõî-“AÓV¹éºì2O—,!ô(‰\¥ …"ŒÌ4Ä‘)È_,¥ ^ß°+¨ØŸ¤GÀVSw ‡ÄÌ“ÂU›øÄ[«µ´Bƒ0ÿ ìöM2æÕWù„·×Ñà`Þ|ê%Ømô¼1àS¿7µw¹RïÎeD× êäkü>òç`5#_'Ì=¸&\U×nxrý.úžð'¿€àVN‡¾P}¸š[³f©_Et%ü?€_8x>f¿”ºtõî¥ B=º¾×*@vI/@~.–2P\|¬â\¯o(ÑHç×H? ‹_Cé¨@JAMI@~ŽÕ‚»˜.Z)8dQ´´œA?¸(ìÕÃ_­vîÚét˜Hhr`ÉJȆ txPßÀuð)¸áOõ†œ_˜0C_êúŽÂ³÷ÕøI“%ÀC ^v|„:çb€Ü—aH€2À @ˆš;K¥f$›½€<9lÜ&«yó£UlÜ|ŸÐP ’~«úÆÖÐlY9¸K ÄKôdµ@ßÀ‡X 6$ §…ýŒ¸­LK@ tø¿‡ øNÂÞ&†ãMü–q¢ØÑ20&Ô­ À,9&$ ô[``A7gמÝjÄ+cB þ;Pÿ¦ò/ƒ@Ð ð(Ñ–ýþé™É„y£^A½˜ÝBQ*&vžô€¬Ø$H—RPF@ äåçª ‘E¦ T§…½FFh h„BüAxT(ôíן:åzƒÕA!\•òKhe {up3|0£_¦É6\myà-æ }áü…sÔ¯ËU¯gú:üB4ë­m¬öe w Dv½Û œãU áÌ*@š¾YÙÒ ôDÑDÆ® @ÈÍËy¯³.-›}ŒŒ¨öuZXàþb[ÐÐø…PïÕ–Â>lA•C+7ɸ{d¿lÄidùN@»äPk U­ÀÁ°·xkÛŽíjêŒ2Ê¡à?=Zæ dç˜ aã`˜”Ôœy³e"€Œli»ve«ld``î¼9j~ì\‘@\‚ 0ATÊFÑ®×›H°¸Ølud„Àƶ$  iþ·°Ï ûÐèüø“*jÞ<õÎïÞ±Ñ4v~Å@èrV" €7ƒßŠL€Gøð@Ð{×øù;0ƒ¾%Ù·ŸŠOJRÝ{þơЎà £ÜÓBõðì<&àŽ` šÁ aV¹„¿@ò3f½¦fÎ~MEEÏ F”<$àkd8ª% мð?ï€rЧ~û £&2Ô±ã2s¨ÕCPظ‰ùu‘´þïGîˆÎ/\¢žy±Ÿƒ¡/€g[É`ĉˆxöL 6T‚ßÀh3óÇ!Nð7)…I þl5yêD5uúd5}Æ´&%°(Å@š_ 0VÚ÷È?àK[ÐÐXATÁß@9[I™Á¾L}É…à„“&L\¼x‘ëd §qhËAÞ…­ìƼ¬¾~4 4ê øÍÓ}<Â<‡! nBß—d^Ь¨™jü«cÕ¸ cÔ„‰ãÕ¤)¯+„cH ÏKoø¡% Ðr"ø%l€ÿå<¤]墥+–«šc5í>°€ËWh®UÓfÎbÀ_7§Cÿo°"[ñy—}RjÀ» }€îÒèup?&rˆš3K±H Ðå“þè1£ÔðCÕˆQÃÕ¨Ñ#Ô+c_¶$ظà$°Å]Ç‘€ÿÓÂÂÊÕËlI@ @¬~ +à;PNóD¯Þ굨( °SŸœj÷an…Ï?ÿŒ‹H*UtlŒ¹ƒÇyîÀëðpØÐ° (SÞ½€nÊfø›``Ì ’°öÒ5xèÀFðõðK`Û›žsƒ´´Z‘~ KàPá¢OßçÔÜØXîN­Tl/m÷aêüù¯TÕÖ*iâöí7@þžÂÈwP?k[ç["põÀ«0yÚdïð70JA. Ä)qNKÀ˜pdpg©- hhìŠà_! ¾fdäpÁWµmk»é\àÚη÷ìR)ér*ר凙ËÿÞç^ýwÃ÷ Íà³ ä.¡#†{‡¿o ä‹ÔÐáƒmJ`ªH`öû¨Ú.°22BX^^fKZšPDð=x–ÃmPÍA·žO©a£F©è˜Žñ!†*¹ÙŒýím*ä§!µûoïT¥Ë–ª˜øxiÜR“ï³™ø_X}àûmøpcVW¨K# ôèÕKfûöþ𘚘d]cÇ;-‘€ï¹A5¾%°Òž´4NÈà0vÀ_A53rí™^T¦LQ‹ÒRé)¬Q¿g¤õ_ü¡ÅË7îÿJ˜KŸ¥&OŸ®žë?@‚‰?wKpöÂh¸ÿz~ˆ2h$Ž®2Ðsý_”}ü–%°Èž¦Ló–@”M ¼u÷´ð‘¦GFËV–Ú’€€ÆÉñ_`&ÕèúdOÅ^xÙŠ:ȓČ(ʸ8dÁŸÇ Qe¥´YCsu“œ”}wï»\ør€3 5êPõ!¹aûΪòÍ\ ¾–KÅË%°X%§§«Ø„x5+:ZMœ6MîZôÒK2W§ûSr誵pæÃïÍ÷]D>ß›ò”€¹0$ð|ÿ~4ƒH Ç”@ rÐK#íH`e lEþæy Ø]WbKZšpÈà µ 4ÍÎ5Xîõ÷ÚC#†!eJÀètµ#“‰I-,[¼æ‹´4áAè%pöaÌáä+XÏÃßµ£÷Ø}Hàœ!VÐů^Ðß’rò Ä…YÉ~%PºÔ€÷Èÿ([^lKZšæxX#`¥–íP¨… ÿѾßWô5:F+ç$ “C›Gé™þ%°mç_##—€€¦¹Ü`,TÈvDêÊ:›`ü¼½¿w|ìL+°H  $, $aa–@°62ØaVdKZš–|ÿ &A%\ÕŽ¹U0‚ïµ÷÷‡ ”%MK€AnÈæ\Ê5dØ f“@~A# øœtâô1Ÿ(YjOZšÖò@?£ 6ÃIø ¨{ˆoá l ¡C{4‡^8 °rÝ$°0 ¼bY‰IÖ$°ýí­–FF˜(´%-Mkn,?OÃkP ¿ƒKÆ$ÓVÊx–Âlè ?…ï·÷ÿ§-.A%ÀÎ $0Ɇ²I`G°(³'-M[{øÿ…a۶¸$qÎÀ%¸ wB8Tõg¸ ŸÂØ UP%°FBüc{ÿÓÚ%Ð 0."°ò—À¼˜`$Pè&Væ ÅeKlI@ @Ó¤ñoð3ø5< ÏÁxzBGø9üî×õø6#²à$0Ð’r] °ƒ–ÀÄÉÞ˜i_»¶Z$•Ú“€€F£iè?ت¸ ¾ 5H`ðqªÆ¿J lI@ @£Ñ´  XA çر!I`ƬÐ$°s÷6##üK °d±- hh4šv!Cš–ÛCmI`ô˜°IÀßÈG%  Ñh´ ä¹K ¦…%°ÝaAKŠómI@ @£Ñ´U , NƒJ€í¡–Vœ$¶!ùAIàí=Û½æ ‹´þŸ½;émê Ã8.±éèªê‚~”î*2™ç8P 2O ¥¥Ûq& C‹(C€LŽ3O %(Ýôt_UUWo_Åñ½®íûžk'î³øoœÅ7þErÎsBŽ@àp® O!@í-;ˆ@— nOL¤»Aü=A-Bho#ÀÉÈ"ÀÈ~ŠSŠ@ÿ`ád„B ·ß!äŽäå$¼[8¶Ž–¤ï/„pÇD`&8)>-¬èë±…@uF ‚€ÏßCmÍïŸm|6¡½ŠÀ°¹¸Ít¼o¦¤“êuŸ¿Û!ä²óxwöN9#¿Y#൉@ÓdD2T)NœJs Ñd„B ÷²-BÈää‰vƒ¼[´¶'‹ÀI…@}£>W†‡(0ÏÈ&#Ô뛄Ð^Eàª&âÉ__&-*«S‹À,#ðòµ ð]²…@9ÜÂ|1½Œ@KJh°À´t2B!Ðc€ꌀÏ"С‡À[!Þ‹¶!G WT`½ä3 ÐÖh‰@QIJàç˜LFD趉@Èiá]Fà‡¸ ¼ àqÛB „ö*×tÈg„“ æÖÝF '§… \¶‰@}„pÑÆGÀ4Áô‡h P,üü8,ÎЦ=ö!G PÀ'#v–6=æ´ùF†À^eÈl!BÎ@ ¤H<ágš´¨#pî¼Þ ’!Ðm OB„'#¶ðòw}Wœ9›KÃnЦ%õ˜ãö„Ð^E`DÂÒbÁnЇƒÀüÒ¬h2‚S?ç÷¡‹@@î Q“É!pì›hêl 0¨€[¿¹ÏBÈ1••H'#͉È/´ƒ@«…å m &#Âð{ÑA  „…@qY©x2Â?Bàì{Gà• õÅ1߉,à€rå¥ÒÉ…@ƒå®T#0D +AÉd„êùæ?«VŠÀ!´×ØÇ]7!À%ƒ€Ç€@_¦ºwÖ<ž|¨~_„#(©(“NF0>¹;ŠÀ¢·¿ÇýRXMKðy .€r.. "“ úÆÝEÀã3#°´2':-<0ä—ÐBA€‹@©«<Î#=Îh P*F ³+ŒÀw X^[°D`ìÖu m!äxÊ*ËÅ“}ƒÉ P#Fà‚;ŒÀ%W¯[NFÜüiT@)@}¬Œê!Pÿ´° ¯BàlCêhl–#pãÖ(_0ÿ42±[#t8;Ë €/Bl!P^U!žŒèWœÞMÔ¥2‹«Az±¹Á.˜Ú ê:ßA‡ ö„0!àJˆ€7„@_^ªÛEîür›6^¬Ò³—kôâÕ½dbMF—Ò¡#™‰øÁB@ Õ.«É3õµI!pê´5>¿—–×çiýÙ2=5"ðÚ„€:3u8“²€\!  ‹€'j7h@’2}Ü—¤Ùù)ZY_ Õ§K´þ<ŒÀzíɈÆÖÊ<”a…À€rc:¸j*ãOFDíõõò¸>ÕG£¨5!pîü·41=®þ²_Z3#ðë*=7 pçÞmÊÈJ§  qŸ„°@ ²¦J´Ô'@ 'ïˆ €ûãw)¸0ÍÑR¬)hM!°²Àú³5SÎX p÷ „€€£qˆžŒØBàT²¨3½}çÍ'(0?EÁE…-*æieÃŒ@'Ÿ&NËL£t.ÿ2ûBh P¥í 0§ë¤E#Àœ ‘Ñaš˜yDS' Y…ÀÌ6ËîÞÿ™fäÒ¬ÀÀ!Çg cÕâÉÞãaNj#püä1¦GèÉÔCš !0…Àòì6“Ç”—MÒZ!ð#ð9@¡78âDTÇDÀýµP÷ Þ¼FÝ¥ñ'÷¶7 0©˜ÛB`š_Ë/Ê£¯Ó0\bºCï „PRÔHwƒµg¬ø¯½{m* 0Œè"èèàìæ¦à­i’ö4i« P«V‚7К^pr¨Åj©ˆ"¢hï6½¤­µÖKñ ‚›KgqrpDÄÛç÷ÿ4‰ž–Ô¤ú/ä~þ³ä9$'_êëdh¤_&nÉ­;ãŠÀ„XÌ ðÈ ðÔ"`/GF%²m« ýWŠÀ "ÊGcG]Œèè64äD ñx½ %â2v3!ã·FA`Ê ðh‡O¦ì)ªáªˆ„·Eþ„À7E`‹ÙO "Êu¹GFd pÅ"Д…ÀCQ}ÎY=òKblPFLJäF“w“LZô÷Ú=‰5Ä$´5,!ÀgÌþQž¨«¯s=2¢Shim–&=â?uºYúâÝê“Áá~N!0œ†À ‹À)‹€~'0©ˆ4I0’ÊHØ ÓŠÀ2 "rÀðœh8– ì‘®ÞkÒs½Súú»¥ G,‰,&rs{ªçaOWJ0rƒÀ;E`Ù' "Z@ŽÍ‚ÀÅŒ¹A—Ò¸*ÝIâYŒÆe$…Àˆ¾ñÚˆjjwKE¨Rš >)›Í¾QÈ=2b6ze …À@ ®ÞÙ®§q:•A“¾*vØ-ÚlÄc¹GF¤¸œ†@‡ô&Ì@ÀN FÂR ˜Ü"pȬˆˆ ƒ€ë‘=³#pòT³}Ó÷*¤Ls‰€ý£w "Ê/‰9!Д…@ÆÈˆ‹##,}.û¸ê=5âsñU8â×\"`é DDE€@MíikoÍ52"½í‚Dî—Ò²2ñ–—‹×)w‹ÀEà„Y#^DZ3~ΞkËa;w¾]'±óøýâQæ€ÀmŸYZ‰G¼N…ÔFkeç®j UUÙ뛽^Í'[|>)ñù¥ÄàZÀ¬ ˆˆŠ ÚF©T6•š¼óEà"°Î¬ˆˆ ƒÀH˜TV™5QáXúx¯ìMnˆˆþî+«Íö€ˆèÿ@à…"P“Üïw´ïy@`ZØ¡,1¯ DD‹ö|¼U'ýõ€ˆhñA°VkUž)¯Ïi|P^*E`½":Ú"¢,E`¥"°<×ý@DD@DD@DD@DD ÕO-OZm-fIEND®B`‚compiz-0.9.11+14.04.20140409/plugins/mag/mag.xml.in0000644000015301777760000001072112321343002021613 0ustar pbusernogroup00000000000000 <_short>Magnifier <_long>Magnifier box Accessibility composite opengl mousepoll cube decor imgsvg imgpng imgjpeg opengl mousepoll <_short>Bindings <_short>General <_short>Simple <_short>Image overlay <_short>Fisheye compiz-0.9.11+14.04.20140409/plugins/mag/CMakeLists.txt0000644000015301777760000000016212321343002022456 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (mag PLUGINDEPS composite opengl mousepoll) compiz-0.9.11+14.04.20140409/plugins/mag/src/0000755000015301777760000000000012321344021020510 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/mag/src/mag.cpp0000644000015301777760000005567212321343002021775 0ustar pbusernogroup00000000000000/* * * Compiz magnifier plugin * * mag.cpp * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * */ #include "mag.h" COMPIZ_PLUGIN_20090315 (mag, MagPluginVTable); void MagScreen::cleanup () { if (overlay.size ()) { overlay.clear (); } if (mask.size ()) { mask.clear (); } if (program) { #if 0 GL::deletePrograms (1, &program); #endif program = 0; } } bool MagScreen::loadFragmentProgram () { #if 0 char buffer[1024]; GLsizei bufSize; GLint errorPos; if (!GL::fragmentProgram) return false; if (target == GL_TEXTURE_2D) sprintf (buffer, fisheyeFpString, "2D"); else sprintf (buffer, fisheyeFpString, "RECT"); /* clear errors */ glGetError (); if (!program) GL::genPrograms (1, &program); bufSize = (GLsizei) strlen (buffer); GL::bindProgram (GL_FRAGMENT_PROGRAM_ARB, program); GL::programString (GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, bufSize, buffer); glGetIntegerv (GL_PROGRAM_ERROR_POSITION_ARB, &errorPos); if (glGetError () != GL_NO_ERROR || errorPos != -1) { compLogMessage ("mag", CompLogLevelError, "failed to load fisheye fragment program"); GL::deletePrograms (1, &program); program = 0; return false; } GL::bindProgram (GL_FRAGMENT_PROGRAM_ARB, 0); return true; #endif return false; } bool MagScreen::loadImages () { #if 0 CompString overlay_s = optionGetOverlay (); CompString mask_s = optionGetMask (); CompString pname ("mag"); if (!GL::multiTexCoord2f) return false; overlay = GLTexture::readImageToTexture (overlay_s, pname, overlaySize); if (!overlay.size ()) { compLogMessage ("mag", CompLogLevelWarn, "Could not load magnifier overlay image \"%s\"!", overlay_s.c_str ()); return false; } mask = GLTexture::readImageToTexture (mask_s, pname, maskSize); if (!mask.size ()) { compLogMessage ("mag", CompLogLevelWarn, "Could not load magnifier mask image \"%s\"!", mask_s.c_str ()); overlay.clear (); return false; } if (overlaySize.width () != maskSize.width () || overlaySize.height () != maskSize.height ()) { compLogMessage ("mag", CompLogLevelWarn, "Image dimensions do not match!"); overlay.clear (); mask.clear (); return false; } return true; #endif return false; } void MagScreen::optionChanged (CompOption *opt, MagOptions::Options num) { cleanup (); switch (optionGetMode ()) { case ModeImageOverlay: if (loadImages ()) mode = MagOptions::ModeImageOverlay; else mode = MagOptions::ModeSimple; break; case MagOptions::ModeFisheye: if (loadFragmentProgram ()) mode = MagOptions::ModeFisheye; else mode = MagOptions::ModeSimple; break; default: mode = MagOptions::ModeSimple; } if (zoom != 1.0) cScreen->damageScreen (); } void MagScreen::doDamageRegion () { int w, h, x, y; CompRegion region; switch (mode) { case MagOptions::ModeSimple: { int b; w = optionGetBoxWidth (); h = optionGetBoxHeight (); b = optionGetBorder (); w += 2 * b; h += 2 * b; x = MAX (0, MIN (posX - (w / 2), screen->width () - w)); y = MAX (0, MIN (posY - (h / 2), screen->height () - h)); CompRegion tmpRegion (x, y, w, h); region = tmpRegion; } break; case MagOptions::ModeImageOverlay: { x = posX - optionGetXOffset (); y = posY - optionGetYOffset (); w = overlaySize.width (); h = overlaySize.height (); CompRegion tmpRegion (x, y, w, h); region = tmpRegion; } break; case MagOptions::ModeFisheye: { int radius = optionGetRadius (); int x2, y2; x = MAX (0.0, posX - radius); y = MAX (0.0, posY - radius); x2 = MIN (screen->width (), posX + radius); y2 = MIN (screen->height (), posY + radius); w = x2 - x; h = y2 - y; CompRegion tmpRegion (x, y, w, h); region = tmpRegion; } break; default: break; } cScreen->damageRegion (region); } void MagScreen::positionUpdate (const CompPoint &pos) { doDamageRegion (); posX = pos.x (); posY = pos.y (); doDamageRegion (); } int MagScreen::adjustZoom (float chunk) { float dx, adjust, amount; float change; dx = zTarget - zoom; adjust = dx * 0.15f; amount = fabs(dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; zVelocity = (amount * zVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.002f && fabs (zVelocity) < 0.004f) { zVelocity = 0.0f; zoom = zTarget; return false; } change = zVelocity * chunk; if (!change) { if (zVelocity) change = (dx > 0) ? 0.01 : -0.01; } zoom += change; return true; } void MagScreen::preparePaint (int time) { if (adjust) { int steps; float amount, chunk; amount = time * 0.35f * optionGetSpeed (); steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float) steps; while (steps--) { adjust = adjustZoom (chunk); if (adjust) break; } } if (zoom != 1.0) { if (!poller.active ()) { CompPoint pos; pos = poller.getCurrentPosition (); posX = pos.x (); posY = pos.y (); poller.start (); } doDamageRegion (); } cScreen->preparePaint (time); } void MagScreen::donePaint () { if (adjust) doDamageRegion (); if (!adjust && zoom == 1.0 && (width || height)) { glBindTexture (target, texture); glTexImage2D (target, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); width = 0; height = 0; glBindTexture (target, 0); } if (zoom == 1.0 && !adjust) { // Mag mode has ended cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); if (poller.active ()) poller.stop (); } cScreen->donePaint (); } void MagScreen::paintSimple () { float pw, ph, bw, bh; int x1, x2, y1, y2; float vc[4]; float tc[4]; int w, h, cw, ch, cx, cy; bool kScreen; unsigned short *color; float tmp; GLMatrix projection; GLMatrix modelview; GLVertexBuffer *vb = GLVertexBuffer::streamingBuffer (); const GLWindowPaintAttrib attrib = { OPAQUE, BRIGHT, COLOR, 0, 0, 0, 0 }; w = optionGetBoxWidth (); h = optionGetBoxHeight (); kScreen = optionGetKeepScreen (); x1 = posX - (w / 2); if (kScreen) x1 = MAX (0, MIN (x1, screen->width () - w)); x2 = x1 + w; y1 = posY - (h / 2); if (kScreen) y1 = MAX (0, MIN (y1, screen->height () - h)); y2 = y1 + h; cw = ceil ((float)w / (zoom * 2.0)) * 2.0; ch = ceil ((float)h / (zoom * 2.0)) * 2.0; cw = MIN (w, cw + 2); ch = MIN (h, ch + 2); cx = (w - cw) / 2; cy = (h - ch) / 2; cx = MAX (0, MIN (w - cw, cx)); cy = MAX (0, MIN (h - ch, cy)); if (x1 != (posX - (w / 2))) { cx = 0; cw = w; } if (y1 != (posY - (h / 2))) { cy = 0; ch = h; } glBindTexture (target, texture); if (width != w || height != h) { glCopyTexImage2D(target, 0, GL_RGB, x1, screen->height () - y2, w, h, 0); width = w; height = h; } else glCopyTexSubImage2D (target, 0, cx, cy, x1 + cx, screen->height () - y2 + cy, cw, ch); if (target == GL_TEXTURE_2D) { pw = 1.0 / width; ph = 1.0 / height; } else { pw = 1.0; ph = 1.0; } vc[0] = ((x1 * 2.0) / screen->width ()) - 1.0; vc[1] = ((x2 * 2.0) / screen->width ()) - 1.0; vc[2] = ((y1 * -2.0) / screen->height ()) + 1.0; vc[3] = ((y2 * -2.0) / screen->height ()) + 1.0; tc[0] = 0.0; tc[1] = w * pw; tc[2] = h * ph; tc[3] = 0.0; /* Draw zoom box contents */ glScissor (x1, screen->height () - y2, w, h); glEnable (GL_SCISSOR_TEST); modelview.translate ((float)(posX - (screen->width () / 2)) * 2 / screen->width (), (float)(posY - (screen->height () / 2)) * 2 / -screen->height (), 0.0); modelview.scale (zoom, zoom, 1.0); modelview.translate ((float)((screen->width () / 2) - posX) * 2 / screen->width (), (float)((screen->height () / 2) - posY) * 2 / -screen->height (), 0.0); GLfloat vertices[] = { vc[0], vc[2], 0, vc[0], vc[3], 0, vc[1], vc[2], 0, vc[1], vc[3], 0, }; GLfloat texcoords[] = { tc[0], tc[2], tc[0], tc[3], tc[1], tc[2], tc[1], tc[3], }; vb->begin (GL_TRIANGLE_STRIP); vb->colorDefault (); vb->addVertices (4, vertices); vb->addTexCoords (0, 4, texcoords); vb->end (); vb->render (projection, modelview, attrib); glDisable (GL_SCISSOR_TEST); modelview.reset (); glBindTexture (target, 0); /* Save blending state */ #if USE_GLES GLboolean isBlendingEnabled = GL_TRUE; GLint blendSrcRGB = GL_ONE; GLint blendSrcAlpha = GL_ONE; GLint blendDstRGB = GL_ZERO; GLint blendDstAlpha = GL_ZERO; glGetBooleanv (GL_BLEND, &isBlendingEnabled); glGetIntegerv (GL_BLEND_SRC_RGB, &blendSrcRGB); glGetIntegerv (GL_BLEND_DST_RGB, &blendDstRGB); glGetIntegerv (GL_BLEND_SRC_ALPHA, &blendSrcAlpha); glGetIntegerv (GL_BLEND_DST_ALPHA, &blendDstAlpha); #else glPushAttrib (GL_COLOR_BUFFER_BIT); #endif /* Draw zoom box border */ glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); tmp = MIN (1.0, (zoom - 1) * 3.0); bw = bh = optionGetBorder (); bw = bw * 2.0 / screen->width (); bh = bh * 2.0 / screen->height (); bw = bh = optionGetBorder (); bw *= 2.0 / (float)screen->width (); bh *= 2.0 / (float)screen->height (); color = optionGetBoxColor (); GLfloat verticesBorder[] = { vc[0] - bw, vc[2] + bh, 0, vc[0], vc[2], 0, vc[1] + bw, vc[2] + bh, 0, vc[1], vc[2], 0, vc[1] + bw, vc[3] - bh, 0, vc[1], vc[3], 0, vc[0] - bw, vc[3] - bh, 0, vc[0], vc[3], 0, vc[0] - bw, vc[2] + bh, 0, vc[0], vc[2], 0, }; vb->begin (GL_TRIANGLE_STRIP); vb->color4f (color[0] / 65535.0, color[1] / 65535.0, color[2] / 65535.0, color[3] * tmp / 65535.0); vb->addVertices (10, verticesBorder); vb->end (); vb->render (projection, modelview, attrib); vb->colorDefault (); /* Restore blending state */ #if USE_GLES if (!isBlendingEnabled) glDisable (GL_BLEND); glBlendFuncSeparate (blendSrcRGB, blendDstRGB, blendSrcAlpha, blendDstAlpha); #else glPopAttrib (); #endif } void MagScreen::paintImage () { #if 0 float pw, ph; int x1, x2, y1, y2; float vc[4]; float tc[4]; int w, h, cw, ch, cx, cy; float tmp, xOff, yOff; w = overlaySize.width (); h = overlaySize.height (); xOff = MIN (w, optionGetXOffset ()); yOff = MIN (h, optionGetYOffset ()); x1 = posX - xOff; x2 = x1 + w; y1 = posY - yOff; y2 = y1 + h; cw = ceil ((float)w / (zoom * 2.0)) * 2.0; ch = ceil ((float)h / (zoom * 2.0)) * 2.0; cw = MIN (w, cw + 2); ch = MIN (h, ch + 2); cx = floor (xOff - (xOff / zoom)); cy = h - ch - floor (yOff - (yOff / zoom)); cx = MAX (0, MIN (w - cw, cx)); cy = MAX (0, MIN (h - ch, cy)); glPushAttrib (GL_TEXTURE_BIT); glEnable (target); glBindTexture (target, texture); if (width != w || height != h) { glCopyTexImage2D(target, 0, GL_RGB, x1, screen->height () - y2, w, h, 0); width = w; height = h; } else glCopyTexSubImage2D (target, 0, cx, cy, x1 + cx, screen->height () - y2 + cy, cw, ch); if (target == GL_TEXTURE_2D) { pw = 1.0 / width; ph = 1.0 / height; } else { pw = 1.0; ph = 1.0; } glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); vc[0] = ((x1 * 2.0) / screen->width ()) - 1.0; vc[1] = ((x2 * 2.0) / screen->width ()) - 1.0; vc[2] = ((y1 * -2.0) / screen->height ()) + 1.0; vc[3] = ((y2 * -2.0) / screen->height ()) + 1.0; tc[0] = xOff - (xOff / zoom); tc[1] = tc[0] + (w / zoom); tc[2] = h - (yOff - (yOff / zoom)); tc[3] = tc[2] - (h / zoom); tc[0] *= pw; tc[1] *= pw; tc[2] *= ph; tc[3] *= ph; glEnable (GL_BLEND); glColor4usv (defaultColor); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); GL::activeTexture (GL_TEXTURE1_ARB); foreach (GLTexture *tex, mask) { tex->enable (GLTexture::Good); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glBegin (GL_QUADS); GL::multiTexCoord2f (GL_TEXTURE0_ARB, tc[0], tc[2]); GL::multiTexCoord2f (GL_TEXTURE1_ARB, COMP_TEX_COORD_X (tex->matrix (), 0), COMP_TEX_COORD_Y (tex->matrix (), 0)); glVertex2f (vc[0], vc[2]); GL::multiTexCoord2f (GL_TEXTURE0_ARB, tc[0], tc[3]); GL::multiTexCoord2f (GL_TEXTURE1_ARB, COMP_TEX_COORD_X (tex->matrix (), 0), COMP_TEX_COORD_Y (tex->matrix (), h)); glVertex2f (vc[0], vc[3]); GL::multiTexCoord2f (GL_TEXTURE0_ARB, tc[1], tc[3]); GL::multiTexCoord2f (GL_TEXTURE1_ARB, COMP_TEX_COORD_X (tex->matrix (), w), COMP_TEX_COORD_Y (tex->matrix (), h)); glVertex2f (vc[1], vc[3]); GL::multiTexCoord2f (GL_TEXTURE0_ARB, tc[1], tc[2]); GL::multiTexCoord2f (GL_TEXTURE1_ARB, COMP_TEX_COORD_X (tex->matrix (), w), COMP_TEX_COORD_Y (tex->matrix (), 0)); glVertex2f (vc[1], vc[2]); glEnd (); tex->disable (); } GL::activeTexture (GL_TEXTURE0_ARB); glBindTexture (target, 0); glDisable (target); tmp = MIN (1.0, (zoom - 1) * 3.0); glColor4f (tmp, tmp, tmp, tmp); foreach (GLTexture *tex, overlay) { tex->enable (GLTexture::Fast); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glBegin (GL_QUADS); glTexCoord2f (COMP_TEX_COORD_X (tex->matrix (), 0), COMP_TEX_COORD_Y (tex->matrix (), 0)); glVertex2f (vc[0], vc[2]); glTexCoord2f (COMP_TEX_COORD_X (tex->matrix (), 0), COMP_TEX_COORD_Y (tex->matrix (), h)); glVertex2f (vc[0], vc[3]); glTexCoord2f (COMP_TEX_COORD_X (tex->matrix (), w), COMP_TEX_COORD_Y (tex->matrix (), h)); glVertex2f (vc[1], vc[3]); glTexCoord2f (COMP_TEX_COORD_X (tex->matrix (), w), COMP_TEX_COORD_Y (tex->matrix (), 0)); glVertex2f (vc[1], vc[2]); glEnd (); tex->disable (); } glColor4usv (defaultColor); glDisable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glPopMatrix(); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glPopAttrib (); #endif } void MagScreen::paintFisheye () { #if 0 float pw, ph; float radius, fZoom, base; // fZoom is the local zoom variable int x1, x2, y1, y2; float vc[4]; int size; radius = optionGetRadius (); base = 0.5 + (0.0015 * radius); fZoom = (zoom * base) + 1.0 - base; size = radius + 1; x1 = MAX (0.0, posX - size); x2 = MIN (screen->width (), posX + size); y1 = MAX (0.0, posY - size); y2 = MIN (screen->height (), posY + size); glEnable (target); glBindTexture (target, texture); if (width != 2 * size || height != 2 * size) { glCopyTexImage2D(target, 0, GL_RGB, x1, screen->height () - y2, size * 2, size * 2, 0); width = height = 2 * size; } else glCopyTexSubImage2D (target, 0, 0, 0, x1, screen->height () - y2, x2 - x1, y2 - y1); if (target == GL_TEXTURE_2D) { pw = 1.0 / width; ph = 1.0 / height; } else { pw = 1.0; ph = 1.0; } glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glColor4usv (defaultColor); glEnable (GL_FRAGMENT_PROGRAM_ARB); GL::bindProgram (GL_FRAGMENT_PROGRAM_ARB, program); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, 0, posX, screen->height () - posY, 1.0 / radius, 0.0f); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, 1, pw, ph, M_PI / radius, (fZoom - 1.0) * fZoom); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, 2, -x1 * pw, -(screen->height () - y2) * ph, -M_PI / 2.0, 0.0); x1 = MAX (0.0, posX - radius); x2 = MIN (screen->width (), posX + radius); y1 = MAX (0.0, posY - radius); y2 = MIN (screen->height (), posY + radius); vc[0] = ((x1 * 2.0) / screen->width ()) - 1.0; vc[1] = ((x2 * 2.0) / screen->width ()) - 1.0; vc[2] = ((y1 * -2.0) / screen->height ()) + 1.0; vc[3] = ((y2 * -2.0) / screen->height ()) + 1.0; y1 = screen->height () - y1; y2 = screen->height () - y2; glBegin (GL_QUADS); glTexCoord2f (x1, y1); glVertex2f (vc[0], vc[2]); glTexCoord2f (x1, y2); glVertex2f (vc[0], vc[3]); glTexCoord2f (x2, y2); glVertex2f (vc[1], vc[3]); glTexCoord2f (x2, y1); glVertex2f (vc[1], vc[2]); glEnd (); glDisable (GL_FRAGMENT_PROGRAM_ARB); glColor4usv (defaultColor); glPopMatrix(); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glBindTexture (target, 0); glDisable (target); #endif } bool MagScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (zoom == 1.0) return status; /* Temporarily set the viewport to fullscreen */ glViewport (0, 0, screen->width (), screen->height ()); switch (mode) { case MagOptions::ModeImageOverlay: paintImage (); break; case MagOptions::ModeFisheye: paintFisheye (); break; default: paintSimple (); } gScreen->setDefaultViewport (); return status; } bool MagScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { zTarget = 1.0; adjust = true; cScreen->damageScreen (); return true; } bool MagScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { float factor; factor = CompOption::getFloatOptionNamed (options, "factor", 0); if (factor == 0.0 && zTarget != 1.0) return terminate (action, state, options); if (mode == MagOptions::ModeFisheye) { if (factor != 1.0) factor = optionGetZoomFactor () * 3; zTarget = MAX (1.0, MIN (10.0, factor)); } else { if (factor != 1.0) factor = optionGetZoomFactor (); zTarget = MAX (1.0, MIN (64.0, factor)); } adjust = true; cScreen->damageScreen (); // Mag mode is starting cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); return true; } bool MagScreen::zoomIn (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mode == MagOptions::ModeFisheye) zTarget = MIN (10.0, zTarget + 1.0); else zTarget = MIN (64.0, zTarget * 1.2); adjust = true; cScreen->damageScreen (); // Mag mode is starting cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); return true; } bool MagScreen::zoomOut (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mode == MagOptions::ModeFisheye) zTarget = MAX (1.0, zTarget - 1.0); else zTarget = MAX (1.0, zTarget / 1.2); adjust = true; cScreen->damageScreen (); return true; } MagScreen::MagScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), posX (0), posY (0), adjust (false), zVelocity (0.0f), zTarget (1.0f), zoom (1.0f), program (0) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); poller.setCallback (boost::bind (&MagScreen::positionUpdate, this, _1)); glGenTextures (1, &texture); #ifdef USE_GLES target = GL_TEXTURE_2D; #else if (GL::textureNonPowerOfTwo) target = GL_TEXTURE_2D; else target = GL_TEXTURE_RECTANGLE_ARB; #endif /* Bind the texture */ glBindTexture (target, texture); /* Load the parameters */ glTexParameteri (target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D (target, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); width = 0; height = 0; glBindTexture (target, 0); #define optionNotify(name) \ optionSet##name##Notify (boost::bind (&MagScreen::optionChanged, \ this, _1, _2)) optionNotify (Overlay); optionNotify (Mask); optionNotify (Mode); #undef optionNotify optionSetInitiateInitiate (boost::bind (&MagScreen::initiate, this, _1, _2, _3)); optionSetInitiateTerminate (boost::bind (&MagScreen::initiate, this, _1, _2, _3)); optionSetZoomInButtonInitiate (boost::bind (&MagScreen::zoomIn, this, _1, _2, _3)); optionSetZoomOutButtonInitiate (boost::bind (&MagScreen::zoomOut, this, _1, _2, _3)); switch (optionGetMode ()) { case MagOptions::ModeImageOverlay: if (loadImages ()) mode = MagOptions::ModeImageOverlay; else mode = MagOptions::ModeSimple; break; case MagOptions::ModeFisheye: if (loadFragmentProgram ()) mode = MagOptions::ModeFisheye; else mode = MagOptions::ModeSimple; break; default: mode = MagOptions::ModeSimple; } #if 0 if (!GL::fragmentProgram) compLogMessage ("mag", CompLogLevelWarn, "GL_ARB_fragment_program not supported. " "Fisheye mode will not work."); #endif } MagScreen::~MagScreen () { poller.stop (); if (zoom) cScreen->damageScreen (); glDeleteTextures (1, &target); cleanup (); } bool MagPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("mousepoll", COMPIZ_MOUSEPOLL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/mag/src/mag.h0000644000015301777760000000637512321343002021436 0ustar pbusernogroup00000000000000/* * * Compiz magnifier plugin * * mag.h * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * */ #include #include #include #include #include #include "mag_options.h" #define MAG_SCREEN(s) \ MagScreen *ms = MagScreen::get (s) class MagScreen : public PluginClassHandler , public MagOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: MagScreen (CompScreen *screen); ~MagScreen (); CompositeScreen *cScreen; GLScreen *gScreen; int posX; int posY; bool adjust; GLfloat zVelocity; GLfloat zTarget; GLfloat zoom; enum MagOptions::Mode mode; GLuint texture; GLenum target; int width; int height; GLTexture::List overlay; GLTexture::List mask; CompSize overlaySize, maskSize; GLuint program; MousePoller poller; bool checkStateTimeout (); void preparePaint (int ms); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void donePaint (); void cleanup (); bool loadFragmentProgram (); bool loadImages (); void optionChanged (CompOption *opt, MagOptions::Options num); void doDamageRegion (); void positionUpdate (const CompPoint &pos); int adjustZoom (float chunk); void paintSimple (); void paintImage (); void paintFisheye (); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomIn (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomOut (CompAction *action, CompAction::State state, CompOption::Vector options); }; class MagPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; #if 0 static const char *fisheyeFpString = "!!ARBfp1.0" "PARAM p0 = program.env[0];" "PARAM p1 = program.env[1];" "PARAM p2 = program.env[2];" "TEMP t0, t1, t2, t3;" "SUB t1, p0.xyww, fragment.texcoord[0];" "DP3 t2, t1, t1;" "RSQ t2, t2.x;" "SUB t0, t2, p0;" "RCP t3, t2.x;" "MAD t3, t3, p1.z, p2.z;" "COS t3, t3.x;" "MUL t3, t3, p1.w;" "MUL t1, t2, t1;" "MAD t1, t1, t3, fragment.texcoord[0];" "CMP t1, t0.z, fragment.texcoord[0], t1;" "MAD t1, t1, p1, p2;" "TEX result.color, t1, texture[0], %s;" "END"; #endif compiz-0.9.11+14.04.20140409/plugins/commands/0000755000015301777760000000000012321344021020756 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/commands/commands.xml.in0000644000015301777760000004265512321343002023720 0ustar pbusernogroup00000000000000 <_short>Commands <_long>Assigns bindings to arbitrary commands General composite opengl decor <_short>Commands <_short>Key Bindings <_short>Button Bindings <_short>Edge Bindings compiz-0.9.11+14.04.20140409/plugins/commands/CMakeLists.txt0000644000015301777760000000011712321343002023513 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(commands)compiz-0.9.11+14.04.20140409/plugins/commands/src/0000755000015301777760000000000012321344021021545 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/commands/src/commands.h0000644000015301777760000000332212321343002023515 0ustar pbusernogroup00000000000000/* * Copyright © 2009 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include "commands_options.h" #include "core/plugin.h" #include class CommandsScreen : public PluginClassHandler, public CommandsOptions { public: CommandsScreen (CompScreen *s); static bool runCommand (CompAction *action, CompAction::State state, CompOption::Vector &options, int commandOption); }; class CommandsPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/commands/src/commands.cpp0000644000015301777760000001562012321343002024054 0ustar pbusernogroup00000000000000/* * Copyright © 2009 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include "commands.h" #include "core/abiversion.h" #include "core/screen.h" COMPIZ_PLUGIN_20090315 (commands, CommandsPluginVTable); bool CommandsScreen::runCommand (CompAction *action, CompAction::State state, CompOption::Vector& options, int commandOption) { Window xid = CompOption::getIntOptionNamed (options, "root", 0); if (xid != screen->root ()) return false; CommandsScreen *cs = CommandsScreen::get (screen); screen->runCommand (cs->mOptions[commandOption].value (). s ()); return true; } CommandsScreen::CommandsScreen (CompScreen *s) : PluginClassHandler (s) { #define DISPATCH(opt) boost::bind (CommandsScreen::runCommand, _1, _2, _3, opt) optionSetRunCommand0KeyInitiate (DISPATCH (CommandsOptions::Command0)); optionSetRunCommand1KeyInitiate (DISPATCH (CommandsOptions::Command1)); optionSetRunCommand2KeyInitiate (DISPATCH (CommandsOptions::Command2)); optionSetRunCommand3KeyInitiate (DISPATCH (CommandsOptions::Command3)); optionSetRunCommand4KeyInitiate (DISPATCH (CommandsOptions::Command4)); optionSetRunCommand5KeyInitiate (DISPATCH (CommandsOptions::Command5)); optionSetRunCommand6KeyInitiate (DISPATCH (CommandsOptions::Command6)); optionSetRunCommand7KeyInitiate (DISPATCH (CommandsOptions::Command7)); optionSetRunCommand8KeyInitiate (DISPATCH (CommandsOptions::Command8)); optionSetRunCommand9KeyInitiate (DISPATCH (CommandsOptions::Command9)); optionSetRunCommand10KeyInitiate (DISPATCH (CommandsOptions::Command10)); optionSetRunCommand11KeyInitiate (DISPATCH (CommandsOptions::Command11)); optionSetRunCommand12KeyInitiate (DISPATCH (CommandsOptions::Command12)); optionSetRunCommand13KeyInitiate (DISPATCH (CommandsOptions::Command13)); optionSetRunCommand14KeyInitiate (DISPATCH (CommandsOptions::Command14)); optionSetRunCommand15KeyInitiate (DISPATCH (CommandsOptions::Command15)); optionSetRunCommand16KeyInitiate (DISPATCH (CommandsOptions::Command16)); optionSetRunCommand17KeyInitiate (DISPATCH (CommandsOptions::Command17)); optionSetRunCommand18KeyInitiate (DISPATCH (CommandsOptions::Command18)); optionSetRunCommand19KeyInitiate (DISPATCH (CommandsOptions::Command19)); optionSetRunCommand20KeyInitiate (DISPATCH (CommandsOptions::Command20)); optionSetRunCommand0ButtonInitiate (DISPATCH (CommandsOptions::Command0)); optionSetRunCommand1ButtonInitiate (DISPATCH (CommandsOptions::Command1)); optionSetRunCommand2ButtonInitiate (DISPATCH (CommandsOptions::Command2)); optionSetRunCommand3ButtonInitiate (DISPATCH (CommandsOptions::Command3)); optionSetRunCommand4ButtonInitiate (DISPATCH (CommandsOptions::Command4)); optionSetRunCommand5ButtonInitiate (DISPATCH (CommandsOptions::Command5)); optionSetRunCommand6ButtonInitiate (DISPATCH (CommandsOptions::Command6)); optionSetRunCommand7ButtonInitiate (DISPATCH (CommandsOptions::Command7)); optionSetRunCommand8ButtonInitiate (DISPATCH (CommandsOptions::Command8)); optionSetRunCommand9ButtonInitiate (DISPATCH (CommandsOptions::Command9)); optionSetRunCommand10ButtonInitiate (DISPATCH (CommandsOptions::Command10)); optionSetRunCommand11ButtonInitiate (DISPATCH (CommandsOptions::Command11)); optionSetRunCommand12ButtonInitiate (DISPATCH (CommandsOptions::Command12)); optionSetRunCommand13ButtonInitiate (DISPATCH (CommandsOptions::Command13)); optionSetRunCommand14ButtonInitiate (DISPATCH (CommandsOptions::Command14)); optionSetRunCommand15ButtonInitiate (DISPATCH (CommandsOptions::Command15)); optionSetRunCommand16ButtonInitiate (DISPATCH (CommandsOptions::Command16)); optionSetRunCommand17ButtonInitiate (DISPATCH (CommandsOptions::Command17)); optionSetRunCommand18ButtonInitiate (DISPATCH (CommandsOptions::Command18)); optionSetRunCommand19ButtonInitiate (DISPATCH (CommandsOptions::Command19)); optionSetRunCommand20ButtonInitiate (DISPATCH (CommandsOptions::Command20)); optionSetRunCommand0EdgeInitiate (DISPATCH (CommandsOptions::Command0)); optionSetRunCommand1EdgeInitiate (DISPATCH (CommandsOptions::Command1)); optionSetRunCommand2EdgeInitiate (DISPATCH (CommandsOptions::Command2)); optionSetRunCommand3EdgeInitiate (DISPATCH (CommandsOptions::Command3)); optionSetRunCommand4EdgeInitiate (DISPATCH (CommandsOptions::Command4)); optionSetRunCommand5EdgeInitiate (DISPATCH (CommandsOptions::Command5)); optionSetRunCommand6EdgeInitiate (DISPATCH (CommandsOptions::Command6)); optionSetRunCommand7EdgeInitiate (DISPATCH (CommandsOptions::Command7)); optionSetRunCommand8EdgeInitiate (DISPATCH (CommandsOptions::Command8)); optionSetRunCommand9EdgeInitiate (DISPATCH (CommandsOptions::Command9)); optionSetRunCommand10EdgeInitiate (DISPATCH (CommandsOptions::Command10)); optionSetRunCommand11EdgeInitiate (DISPATCH (CommandsOptions::Command11)); optionSetRunCommand12EdgeInitiate (DISPATCH (CommandsOptions::Command12)); optionSetRunCommand13EdgeInitiate (DISPATCH (CommandsOptions::Command13)); optionSetRunCommand14EdgeInitiate (DISPATCH (CommandsOptions::Command14)); optionSetRunCommand15EdgeInitiate (DISPATCH (CommandsOptions::Command15)); optionSetRunCommand16EdgeInitiate (DISPATCH (CommandsOptions::Command16)); optionSetRunCommand17EdgeInitiate (DISPATCH (CommandsOptions::Command17)); optionSetRunCommand18EdgeInitiate (DISPATCH (CommandsOptions::Command18)); optionSetRunCommand19EdgeInitiate (DISPATCH (CommandsOptions::Command19)); optionSetRunCommand20EdgeInitiate (DISPATCH (CommandsOptions::Command20)); } bool CommandsPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/reflex/0000755000015301777760000000000012321344021020442 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/reflex/reflex.xml.in0000644000015301777760000000323112321343002023053 0ustar pbusernogroup00000000000000 <_short>Reflection <_long>Draws reflections Effects opengl blur svg png imgjpeg composite opengl <_short>Main compiz-0.9.11+14.04.20140409/plugins/reflex/images/0000755000015301777760000000000012321344021021707 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/reflex/images/reflection.png0000644000015301777760000225343512321343002024563 0ustar pbusernogroup00000000000000‰PNG  IHDRZvt_ vpAgæ”1ÆIDATxÚlýY°mÙuˆÍf­ÝœþöÝëò½Ì|Ùw@&$v%Ê¢¤RCå E)Âr•£þð§í¨Ÿ ‡ýé&aûÃåN’¥²,R”("HDD“}¾|}ûöôgïµæôÇZ{Ÿ›´ ï{÷ž{ÎÚkÍ5ç˜cŒ‰k¨À"ˆ€ˆª¤¨äA‰TAQA€THH@=)¢*¢‚ ª""…?PDUT@EŠI€@IAP”„@)¼Lø ü?(†/5|‡høþøkª¯QÃë+("¢¢ª‚†×BÐøÊ ÕŸ„?$ADUB ¿Q©™gË« ðÚòJ·“(î~~êS,μ Zfœª²1I{-;ùåÚßûçŸˆÒÆqgé"ýä¿;—Î+IøŒB Hª¨Þ6 **‚†· €(ÞFø[òá»A@ T„UHÂÇEP¥ê•AIÐüï¯üä{£Ù‘#d^ÿƒÿóÆ?Ib3zî2 *âìÓ›åæsT&&¡Âà¬ÐÙl–![ë}ö×'ï¬þû-¼|ñÁ÷wRÒj¡A ¼+EUETRRÔêa†Sа_Ÿkø” €^ã· " "z“6Ö¯®pÞí4ZYƒAQŽïNµIÅYi¼`¶2CSúK­§Ç‹ï,~üïn„Ф”®]0ß¿1î/¸ÏPÃ_¡„wJHú?úï÷¿UÉÞ#k¨åÖÿ÷þ7ÉÖÿêOþÛ3« @HâÃ% ë¡ÊáùÇNž°Ä#€@B¨N” oý7ÿúgÙýì!‚e“½ýþß¡ôûÿ‡“×.]_WUûÇ2Û#x`~õÒý˜—.íÜpH*)~®pHÔ#„ÿ€‚ãÉQDR ç5l¢°ßÂÀT‘%,"…s „ŠŠªˆ J·°‘øäÏ=vÔó{4>üù?ó/´~{ ŠXb…ð9â#­‚@xý'PQ@‰‘TQ9ì<$“4K]kšíõ……f €~ûÖ™Gñ3¯‚ „ˆêT•ØR«q¯¯gc¹ü™5Y¶7}zY7M21ž¤ú$ˆ„aQEU5|–ð](ñpÄ÷ á4<²ðˆ€V+¼ûðoˆ  áÈh½³ ¤€„ ” L¥i^~¦ M×»ºD J8üüNÙÙ‚a#OfcaWx¦x£ýÁ_×Öo<ñÝ…Ë“Ÿô †>ju€`õÐÃaŽï6†~¬bxø”%>B$ ËÈ áÆð¬ ³pùÛÎb³™5,¡"èìàiß'F#2Þ33ºXu펻é^|}ü§ßß&Uî­¯}tœpsþ®o‰x 0lذËã®Fdí~ v'É^ÆÖjãµö·¬üöñ_MØŽ¢ˆ€T}.@ Q8>WE@@B¨‚ ¡(T·¯BTü‹{?Ëö[§ÊÄœ-}ý³Ÿ' ßxûB³·¤ªpú´™WfPFc|«÷àSDÌÜŽ0¢UÅpPPÀŠÆ«ƒ”Â^ª®`T@­Nz}>ç1lÛ:¦+‚ ÆdÂ¥£@a(Ög; *‘€: Ô°ºÓÃíx. € ÇC/4h¼I«Ã X‡2­^™@P³`úLAH4<²I£¹¼œ//-¶;FA‰Š»;#b™Î "2¨ZŠEc­;÷h¥Ù?»s7Ö·mt,ñzVR­?ª"ùðD´:a™8E@T–yüˆ *x@ÁðЍ &laD ëL¤u| §JQ (¬‰s ¨ªíîå6)]x¦K pxã4/4J̲tVL %6ÙJöË-]õŸZÏí>XÙV>žUãï©KÜSäч­Cª$oÜøÃqk…XU­H¼4bˆdL‹—/Z³ÔË ›„¿Ÿ>>ì—ŒÓY¡XœeçœG«ùÉþ—Vîë“"  åK›ðñ}gQ1l ·U|+a9Cô {œ„b*¬„ ¿}avǵʼáæk÷n$—¿ö—÷„„@H°ºÕæ@ažQH~Â# '¾úõ¨1ÕCEA»ü·õç8ö|Œ€ˆòúÖÌ7ñ¯©³²`==í³ $rHÈž¶Z?:c¤f~|~Áê>Äøb.Lñ-I}XÂÕíÃM U.S6 ¢C GJ5@ Çæ¹\HëËU¹‚ªÎ—C¸¯ö;¡J¼­(ÜÈZ¯bØ3  á°WÁ;äÏÕ=â(‚TŸ¥JSQ)æÎU’Uf¨ ˆh³¼½Þ2¦±¸¶ÐM Žî?.<Él,H€d-ˆªe2”ó£§½vûpïÒÆL‡§Ÿ¿xkҶˬ€‚^bØŠŸ-dcÓOŒñRHQâû Pcf ¤@aY}µ ®(‚X¨Quÿ ÇÕ¥*¦1 ‚#,=×^k¼¸¹  ‚|ôÁ¾¤í|ê[I‚ à'Ä[dn.ñÏ2°í‹?Ýk­<÷ôÆzÿ˜ÂÖD‰û¡Îy‘b:O¨á÷#(€h}< ºð!”ÕQˆ;‰°zøHY{ý¹žM{‰Ç=Úä››·Òm:Bî½µ.üÖOžlv²@±mìh‚†@ÁS{ýèsUÌZ¸]¨"¬BUÛMBùjŽXC<3áóx¸äçW•"( ’Ä\;äIÕd X”âYÔzC‡s¦UÑ‹¡&žgZgÓÚxP…ªXn~Œ×f¨k@1ÞæPU¡|±-fÔai(æÏ4¤™LY«½¼¬¦½¼¼ØÈÝ|*DÓ²Ï̤ ^1ñéâôó[§>÷Öî¼|áÎì¬ovuõSjµþa?@…}* *…¤CUUÕÂu]õ¬#l$ª®“y©w‰°.$MºTBPAD"/°úÒVÒ²Ú¼’‡-¸ýé¡k“…"ÉSR 6Í÷‹÷§YëÙ³;fõÚÃÚ­‘”4n.Ô*ç ñŒ@AćûFI¤¾5t^ÓÅ/5æF¨õ)Š qÖÙ¼š'Ýn»•%)`¹ÿdàuæ@QÅ P·;y˜|ùâñŸýè› kù½;…5®b(@0¤L!¾²x‹T㉉I*¼qUvíO,Zææ›ûŸbïKïßë«æ)-T)?„:9Æ¥˜ì" Ãü)Æ Ù®~Ãÿ¸¢c4Äš¾¾ð¿{d¿Iß÷µnCPéøyVXR!p´Òúŧíã>³G0J1´!†ÃyNI¤ `*°Â•"â£ÍYØ­@!Îi}5Õ˜š†è\Ýõ¨ñ S] B}"´>Ò¡~ÙI¬Ç´Ê´JŸCÍYGܺÁy¶p€JÄʪÜlAÔñxŽË˜¬µ´Ö"Û^XYì¤ ‚'w¼AWx l ¢z!›@»ÑÿäÞP—™YŒF0ìçGô‚±3¬cˆ=ª €Ê³?T ‰±Ä§‚¤ˆà)./$O8RÄðâÓÔ¸VóK‡B² @\ 8 £ÒÆKmÌZ‰A@¤GIn i}n-!@1ñè‘ÚKÓŸÞ!®/ÿlxå™O>N׌´# ÑCñßV8\T!·!U ¸¹êJ$‰.žúP·ahˆ ˜d‹WV“|a¡ÝÈSžàøéÞX­N&^U Tç Ùh/©ûá¼1#Ed¥|}uôË4pV€WˆÅuº*õnˆI"²©‚ö÷²ÃÃr’ß6–éÊÅ61¿k¿ßÇ9< ñIÄ÷Nö0R•§†°Y:Tªñ§s08±yw}çóÖ‰9‚„AìÒ;w>æÍ/ÿbgemqÅxP|XšÉØ'¤%¡ÑÒ^™|êØ÷]@ßÀˆG` …†PTÐKHLT'¼IE:G j•“#ªVC-U¥£s¨°†é±Ž.ó„C!0ðð^C8Ðã]M¢D 8¯¨êJ+¦-Šç=Wbhõ>jàRñ  "ž \„”ä­îFÇ™ÖZo±“…ͼ÷Ù )‹RPÄ N„IÃݸ3•²è®¸ryPŽ6Q.ôT‡0DEP`I¿°Çp,!¶Xæé°(…ûH¨jy(ú‡l QÄïTb 86(€ª‚3D> ?Åù”íê+—Z)´2 UT÷øóŒ›M°„¦SÏ„HK«Ç?ÞÖÔ5.Ÿîn]ùÅMZI) `¸×ª7VElª°àªšCUÆÐLñ‚„ª²TýB í‰Ó|åù ßêu[$5+ïoÀ4x#%2 4@é*>€WŸýÅ·ö4í®÷2¶5àæê­ú Ž ª­Uu,B¼U%‹Ï¼Ou€££” ÚÆ›“d·o} \ÕÑŠäëÚ5ÂÀÊ @A€€ê„;ܳ1§ !'® Ç|lf3Š˜xLß\ýç¥ù­â;°²œ6&c"Dà­æûÛHÔ\èŸhØ.`þë§·îŽ W°"²Š …¦Q˜F€*~~Dúâq… ú Ð?†~’Æ<IÏc…oDOŠb©ú‡XH D=—y  ©`l@œ»©b˜Qýº˜õ“@Hä("QˆUŽ)X'•óÏzîÔ‡5%$Qâ$k,/5 ±°²Ôl¥áÃì~6@+£U -‹Ú4I›ù½F€©±&·ö A„ƒ×ž:l7’iXH=–I¶$äêÖ¥ RÀÕÃÑGE?/OY€:e%•)Qb0& ªD* ¶¡WDel±6Û“²·z}¹›'æBBŠ (?šæpZna¹ØHIfG㎠_èíüì±)…Ÿi}z±ó—ÛØZÝ+L¼©º´ªÎqÌ™CZ C£’¨D´‹PH0Î ¶Ð9Ös©aXcÛ«×—´»Ôi42 €Xîퟎ4•þDHJIˆ ˆ( 7:ãÝîkûòÓ!«"æ›ëúó§Ä=J{Â*ç@Äð‹+øc4…Ø« ¢ðï·'òAúˆÓ­ëßõúÚò¿>$­ST 1C¬8@¸¾¯ªCvpŒ:‚JÂö›G4ñŒŠ1½wn~\ùõ=îõZ=«°íhzæòb˜XøÒäÃ%iÚGNcâmþŒï?õ ƳPfPB  ç»K!äzp¬ À_ ºcH*š4±Á\e¤J$¦±ðÌ•Ô..¤FjBå0ÝÙž@γÙ"z—¨Y²‡ý+oñOþã-o˜[;?›”x.UB !Ï$­ÓÈjã‡Ë¦ðU‘×ß…[<¤b/ç”5}qô¬þƒ÷´™j”/4 E%‚Ë!UÙœ_”+¬É$ d×~Û}'‹ž !!~³ý'eú ÿ=ßëv{(@³mÀґ婊5ŠÍ…{÷}Úš C¸ŸÍŒ“ë×Én÷£Ã;wú³RAÁjÀûëóšj¸½‚mñnz„BŽ £Z-Ö€¤Å+\€E\;ÀÐ ÔÁŠïSS€ÂsÑ/þÂÐ2 ¿0쓪¶7t<ê ±ú¬ $ˆ©f,=µ‚˪taÞ DÛh47–(iô›ÍLŠû'ÊÅx¦ê€ 3hé=§Ì‹å `ĤÝî?²g¾´t€Ǿè7pãsD ÁL‘…8b^žD…DBâ fD"bc0musÊÈLÜì6³,I #Æ](XãS¨:_•ØØ¨³ɵ  ¨#?/YcR†J ’ؤ`޳ó.‚鳯ϤÑÙ¾8¹a¡ N 7[oçq{a¹•‹"žœ’ ¨G'd/¯F„Y38L"ÀƒIž}f£ãw÷ïœL}EC©DÞYÄbRG›‰}¶ù’М¶§Z÷ݵB*fb¿K•l Ìébs®A OÔxÁ¼QXÅ×pÔåaÅPˆ´@†š¯Dó¾ ÕÈKøpÕ¯­!ŠØÀ$k5.-’6––ºÝÌ¢‚êôæ“’tVÌ &$2R ±±Y·üðóÓRU9ïµý±[ËŽäòùÓq¶¿ÏýµaΪTO€ªáDa6LY§Õ²ÖKi¯µ˜Û„)œk2†©êÄí¤(HK ó*I#ä>ïnF´§¢[ů5bjwˆSÁ乿ŸÿþÞg6ì¹jûÖO niP}ùcÝ.S:×V«(]!#.ü¼_øœ ÂéW[ÿafÿÞø°¸Òë’"ÊC—žjbJƒùúÉMoÐ6§Ga¡QÍ¿\[ìvò UÅ swá–G£ní<8-1rE!7”"©¢ÀqçĪ›*JpÝõ¯?XøûÈx ?O_ üTtWŒ¥G„«á¾wG¨ œ‹«Â8gI ª¨ ‹ÉÃ9ŠaÌ(!ÔZXoi?îR¶yÖÚì¡m..÷òÜ€ÂðöîÄhY8¯JˆDÀäDÈ$ÔXÜûìvF¯$£iIK G£+?dþôÒ™ÀVc4­ÈÒ¡ÌEb“fÝ41&1+› ‰a"2™M©b]‡P«¡ŠªZ!6Z‡ (ö«|U•DC¦ ªJ $5ˆÇ„8‰M×°-QDIE‘Α´Î“¥=®U0I^ô: €ŸŒ W žîô‹ÑqâÔI܌ꌪjÀn©bmIuÚj@,47c¡ ¨Üè¬_j§ÝÅv+³&´£ŠÃþb2™ŽE½³e™³ØÃë—‹¿þÎ#±ª€6émd·o9Ž—øÂ7 Ô Ín`TÌc´‚¶•üëä¡=L' déõÛOì•çÿø©Áņ²­N–Ik¶S ‹×8™VEN}#…5 ,±ôKOo˜¡9t ðÒ¿ú Ÿ}ãÛó…¥fKp¼ëÌpÆÌžŒ2ñFë½An´¶¡IH`vÁØ4[[í¥y‚àœ"¯¬>«ÓíƒÏn>9˜xõÄs ¤æØ×µ¼›«C{î¯þiºñxSŒÛ€:çàP*B[@:ã Ž~¨F*ÂÍÙãóë«‚ôb•óŠ@hª$‘Ïž0Åx€¤5F«ç›‘´AdòFo«‡Iku±—Ç,óøî¾d¾,K§ÄDD„…pb³fsûÇ»cOI£cGô]vx²ÒÀ1Ãé«· Ûê‹(›¼ÕH“¤}a¹™²á4k&Dƒ1Þå*ñŠÀ(…"'‚ã bù,  Þ{?s¥:õ*àKVBPã| ³‹ˆ¢¯È,d°Tî½Ø¯ÈÕòJé©t85¤ŠQ¯H-B‰@±µ¬ŠŠ¢à5Ô·YHø%@-úÃI1Û¿< …÷ˆ¢ž(B(Z¡±¡­¹hZ]Ÿñ–VT0Ùâ¥+¤µØjdi åàødgFC癘T ½æ©?N¾¼þð¯Þë‹Q4ˆ­ÕåÉ/v«‡.zŽZRÝz ‘U©‘ŒpŽAV];曼wdŽ›û&µŒrqéP«øÑ„«&ž¶`ňDóy&1ÿ|u¾]óµÃ‚høy²[ßð¥Щµˆ ¿‘|[Ìo¾[.-/´SU•ã1ÇŠ xf°ë'ï BÒ–ãÈÇP17‘ZØmö餻ØÜêÚ„Ä£½|õ«zøèÉO·÷GNÉhlÚ¢ªàRs­3E­²yü «‚Q5ñDÏ]ýj\­øX!ˆ1cªèÇ5-,HIæÁS!"ÚqtÁ@4­ˆ„úµZG°öA$_@äT ì+!¤Ù\Üì’i//¶YÀîo3:Wˆ"!ƒ„‚Ö¦¶•ÝùàéX…Õ´ÛÉ`8rf6LùèÕÕ»ZúÝ_Ëáß:Hó”lk±eÃU"‘€¢^¥êÊb\ Ôpa«÷nV¥ªªxQõž D"?C(„Jà PúÒ£xõPQ™©BZ"€jaIT8RRµ‘0…î•…¢Å4,º Èai¥O]ÒZJØFEô^€My<5 ÑäÆn—òRãÈS’¥)!"ͱ¯ „¼°0=<÷F^<+°"¹ê.Äóã}ëLùWÜI¥¤Ñ{fÅ$‹ÝVž¤FQd´ß/ Ê`ìEÉò3ô,ÚNúãõ×›ýÙçSBOÊIokáÁ'Co¥ˆëaŒ=&¾ˆ0qü¬‰íDU’koøG8äñ™±Ì¾õÊã_QïK¿ºG5Z¶º°™ù.;|Q 6ªÄ¦A…f!òooßKNÌXT›®¾óÁ'xííïmÓâRg¨¸‹f¬E¿kiá{œµOú¡#‹ª æ õŒ-ÛV2>iÝžb{is³iÔ«.,~é ï<øùýÑEÆB$§žI iÀ¹Ä\" ó\Hkâ÷úÐ@jÁs$ܨz¨i_5ÑTŒÉלý áe"‰¿úG R`ì×`Ä3cWš”+±J¼`t~È€Ș¬µx±‰¦·¶ÐÊÓp,önïK e©"jb% MÚåû¿Øq¤È¦Ý.ú¥C»fï,ýÊBgѬ­u2ÕwQ!Ôb>Rø(ì,Rdõ¬¥ó⦥xç ö:+z•Ét6UuàÙϼxò€œ Í@B÷ÕƒQrAWä54e­ ‚ËÄ”ˆà %eT)²V¢Š„ÆÄ^p‰RàlÔ÷àÑøÂ@ðS!æÑ£ck}A˜-%ƒ'ïjéKþ®·Ö&¹MÈä&AF¶Ä(‡Ë]ÂIF³± „гÃÝþɇ§£R  ×xŠÁ8¨D)°”jÒ9*°f­õ«­F¯Óiå“ –‡û3A.SQWRb|IB ¼Ç¯>7ýóï>ÅÄ#"´V.?$) h€«”ÈÇüëW“¥a®‚ ¼Ø5"ünw´—d·‹ PÚ®ü‘‡¯àÇu–LzNV£*ñ/&ÉQŠÅSu§Îé[Qqé·ðÃÙÔÉUb‚·›ÿVí7†?(–––›© Âplq46ÄÊÈÆË3þæŒ9ið‘ð‹ š+e1+Æ^Í1¥PÖ™žlϦ‹ëW¶ य¾þfŸÞûéÍ~IŠVˆ‚<7ÐÐd0…¨¦±ˆQ,)`œyšµÂ…Tê北ž¾K¥B¥@·ªÄЍR¬ó/ ‘¨î8œ'ƒP•@ ÇZ:«@2¾ù¨#Î9.2SÚh-nv é,/µ”Ýö'ƒ$”…%$"C!SdÓÜÐÞ?r%%Ít:û¬õÜå…++êÛ_T/)€°AÁˆ 2…wÞ;§ê'…Nx(|Qˆ—Kt¢ªâ]¡¤ª „ ŠÂ@ÀEÉ+‚õH ”"9ÎYذ¦ÂÄÖx™ ¯ ý?$Ф­Õå–#GŽ»wÎØE_Pjœf Æ€W4ÉàÁij ˜wìÙìÖRL¹uôñ™QÈ-&©É­a›çLÀ&IL’gI,mA”y}  ¸ûp´ûñ~¡ž@ z1 ‘¦$@¨ª Àõ#6yoåù<í,¶šyZ“0ÝÛŸâQ_È{¡Ô²:‡ªÜΦ;Ý·Wï~ë#B!Tj_Ù|üÁIbk.bEÉŒP2V{–*>zU†×0W„ÆA[_‡{cç͉ak^—Ÿqò[7ß÷V+œ *¢Ây ˹Nû|#FðƒCÏ)ß$ûÍÕþûÍ#ó4苺oöˆŸ}ó/oC»×m±âã1O3"ˆF¨³öà ™ÞÙq8k¡ö5ý´ÕÉ2™žNg£!¡'l5íÓ≗‹k›+¬â ¢WßøÃâýOß{0š3ÕäZE?³uÍ*xDôA8§5 (…r ¨÷ Ív…@Eú"ô'­¹ò:§èÅãê=(¡* TÐvM ÐØ×Á/p*C¥A´C‰Š"KÍ>'4¶ÙY[MM²°¼ØLˇwÇÆ¥S4 %A°ÍÖÞ·ú%5—^\oÍV×2PQP/ª¬(h5–˜üËö‰|ýè'eê´‚µRÚÎ%XçzW$uW6Ô«TÉuw\PÑÛ_ÛÜ{ßøÈ2ÐÆ›¿¸A¯¼ôgO¥½ØMsÅoÆ%“dï[ë'· !iONtNx0ø‰ôw íf¼tÉL'Ãál œ¶Ú½ôý&Ù ›+‰J °ôÍoœÜûÑGcO†E6‰ñ¦¨BB-ü†º¯JyÕÝ*©ukH€ ¬Ts±`ΛV8×lœ‹©©÷MýÈá©5J&ùRúï8ýÛ‡ß/Mk¥ÝBÝi2+€Y<+*]È~q€icgªZ“+Œ°€ÞöÃ3ñf’-m° ÇÃéxt˜'ÍFÛ}ÖL/ouY½ç…·ß>{òýOŽ ¨¨ÛwÎYŠ*v¡p¹*He8TÛpU:µ*H—‡…‡›4ü,Á95|EôUaTó©°Òjyæ&dÎÁR⼦ª1öªy´+µÔĦֿrb½Ån3 ï~øh¯du¥WÏŒ€j€[íN§2Å4ñˆ/ÅÏÆ'Ø2'­«{wÆÓqã<¦er‡{cõ@if3˱k^" wÞ©œ–¥ÌTB@ž¼²÷&0ª…TÄá% ¢Bä2("8äS`Éè‘ Dë„„*)‹ aP!içÚ•¼‘¤¿ZN† §E‘eФÛBJ,#€@B{€ÉfK­{þRqglTi;ã}1!v¬‚HÍŒ²4mä Lä&£i1 Ç ‡jLBÍL“´aM³ÙLÓÜX«¨êÑö¯ëèôñÏo½$ú×!6sÖ¹ülK[‹½,O-C&gc2:8WPbAUÅtÍ6\¡üηŸå«I.mú?¨X*!WUAD®Q¡Ð¼ ']BC¦N€¤2´Eü~ûøÄÓ]f„Ï-ÿ¿ß=ýk_Ñ—Cóç$­*ßt£ ¨|›HˆVIqÃ})Š„š|c£;ÝO÷|f•ì…7>}B×_þ“‡ÜXèämÀÁ “‚S@FBL/ Y4zþÐQÈIÌU) çTTɪö%iuó®âì¬ÎF¬ÙJcjŸ,u³ +Mö5_zeøä;7žˆ&‘˜þZÉr!Ò |4¤ÁŠxP›s`mÿ]HôœÓÛУ(:<Ö*ï×9UdÞ ¤£è°«ü‚ùŠ`U~Îq˜ŠþQg(Z V‘ÈdÍÅÍ6ÙöR¯—'¡:8{xʹӲtÄÀí…N·•‘!…JmCÕýÉ`<öÓá°œ9»µzŠá¡¡¸ŽÚzá‚/'B†Å•n4>šÎfN¤D( ’rÈŽH½AòŠÊ€À¬¢¤Ê&è|Ø!c´tÈD“(k ô$@€ä5ªº„ƒ O웪°†zn_Zo¦iÚ´ÑÁ•`i2J[ ¢m&Þrð1Åî xL“´±Øzp[®®~|@¨Øzöö“  AãQp6RR¯ªL6o4šy'A$ã†ãádÜw'Ö²Á̶›I£Ñle™5 ¨"xżyñÝéÞã÷ô…4ÔyIºtm+KÛÝVž&™,ýãgÕ%ŠRF)ψ›º—¿rñø/~zDÕyomc÷£VU$•óÐï¼_@•Ljâh8”±{”ÚûªÞÀ ÏÒÄz“\ßÿ _{ïz¤è?ÇŸŒ½mŠÀ¥©:쨂¬R{TT»”ìÊïèûcQí½g¦ŒÛjw·.ÈNÙé O÷Æå«÷ ßôDg‰»ŠÐ3¨‘*EÙ² §Ñ€¬jcVŠœÕ蛀4÷/P P¹ÿ„+ˆhXQ%b+d–®®uRÛè5:íg£’È• †LˆIõ†@§ûS³Fk!½û«égO=Ïoõ©$QkÀ{c,:ÁÊ*˜OX¢Q“·—[íd ã³ñØ$l)O{½¦i¶šYž2zðˆW®þÎðÁ§ï=,„óÖÖó=Ÿ.vóÀÊDÐéþÉ”NÆ"Þ«µH ¦Iy/½8ûö÷¶½E$Âææ•þO³W••eTLÕëZÛòh …“P¾%ÊcB’Nþ.lOñ¬wª æåÙLï|~CaNPÕº –PÕ‡§¹ËYTÄE£¨xO΃¸dõ샙)í{kÀ¼Ùù6ðïœýtÝÅÅÌ žÙÒ¡s†¼çöæî=¶­Ñé¹3¦h¾`§‹H¼¹'ÓÁÑ`t¼[.]òÃÁtÖöÓV{|öY¾uåbª¾ä+×þ“û¿úó‡…K+ð®2ÂJ¹mS dÕ±%©=:”¢*jÊ»Ö=’ʳ–”Ï…ªPר Áe³²Oй«8Ö%þ¼“Sñ„¢£žóŸEPdJóÖâå¦Iº‹‹íŒ#Ì‘_=3¢Ržs!Ä£ƒÇÛ‡§3§y;s§ã23IÞζ¦Ý¿ÒÝæ/mß-¦Èo Ç=lK"j¿Šˆ!*Â)úbW6¥HTÔ:„•—2D‚‰ Ý;´ Èèl”ÑUeŽŽàA'”n½ÔÍŒÍ;yØ©RÎ#(@"L­‰P–NC:Ý™*fÎ"Ý;ð´´5¾;f"¼dv”I‘Ô9-”Å8Ãmñ ª `%ð£áS@¡Fg¥ýR†ÃÓ½á¨ÏG9§‰Yk7³F+Oª¢ê){ñ•ÿtÿãoÒ³/4©Ñ3YšFáYÿè°LXŽgà )UM”2?K_¿¼û?=CVUI;—6oÿj¤½´"ÙÖN–sœ>r¯+SÈPéί  ü«×å!›ý±µ °ðü{;ðë ÿêŒç´ørt8J,7¤öa…*;ù‚õ$æË“÷š‡v F $Ko~ø)½øú·xÛì¶ZFt×ÈlÆ {D°@«üÉQÒNögpŽç†ª&`kUª:§Ñ$KK€ 0x-ǧGÛÃá¾Á•ìð¶\½t¡«Râ•«ÿðþ¾û¸4‚ÁV]CÒ4÷ÅX[G[ûÊ6 œ5‰~`QŽ ž"“œb_´^BEÏÑð¼'èÜ÷²’ „_‚Yá|€@ VÒe­+©š(¸de›4k[ l.-5[ Gî2ø²¶f@P_ÎJrtûNß@ºz©å¦+)÷‡GƒÑ †’A·9zøÎ°Õ™ØÑn=J<9E% Î$D@ &’ž‹Œ‚A`(‰À‡\ˆ¢w+) ƒ Ie¾Œˆì™N‚FÓy6ÀÄa¯+KpàüÊÕ¥ÄÚFËe”z§FAD @2ƒ¤‘c ‚‚?ž’BbóÎâìîót«ñþaS¶n`W*hI•¼z`KB€` Y.Ù‰zð È(ÖO&û%û´µ´þê¢=:í–”ÛÔtÚÆ¶)¢Wuºø[¿£ãá^¿×¶6IÊÑîvÇJEYRš²WQgÍ©®¿ÑøÅŸßr¤D€ÍÅkð£{j£‘G¤¡×b³(•ª]–Ð5(Ôî­PåîT;Å|³y°¯g‹÷Sór÷ç¹|mû#±PÑÚC¦Y ã‚S¢Vf˜*Ê‚ ªD€­Z«œT+ç^üþÒOg¸g åïØ?!óûãïÏ4ë¬d=ÀÑ>êl"žÐ‚'“lNîLiwväãgÀ¨ã0Gˆ,Kå snõŠN‘Ÿ‰LöOOh³7øà—ë—W»Z >óÌÞzï{»‚„à±òL­)zÕÛG„¹¯+Æ®çÜ•K…@4zÝ…` ŽœWŒçÒzÔy¦HÓ禂Tº1¨œŒ*Ò¹£Fe)feÕù²&ï,¯XÍzk ‰¡Úî¼H •´8™8逸§]¯™Ú¥+½bÿhçñÈ•Þëß@5ž  1-¯ÞI9;ÈO.Êjš@Ì6ži»ý£ƒ³‚’V n¯™vÛ ‹ ’å%WÆY €XN t4,Á’XkÔ‹81‰ÎðúsÅ·þj‡-(7¯n=ýøŒ ¢šš5Åÿ¼À§j U–Ùäâ^­ÉBò꾩Oq Ç}4€Þ·WrÞ9y†àºŽ¨‡U†  ‘ µœ&`‚›†&yjÁ²1ˆH€Ä–‚ØTPœw¾T¢Þ« U@½Š:už¼¨› ;í]ìe†M7­Ýª¤-†.ÂÕñ$í f©)‰ë³ä´Á†:  `õå­IYPC§+8+Æ3'རzPB/ƒ>Xð: šÞ[@e–˜š©÷%ߢFkãUã÷öOÍi–uV—ºYÂêŠÅød¤)ƒB°,45ŒÞ{qš›>\z)ýåw>s„(`òåkÓ_<ñÉÜFú ùbXÇa‘ *7-F/âsT¬]z!ý=y/Jˆ¥õúÉÐyçÆ=ª¤±¨jÚzÎD®\Õí‰ ›Ê¥öЩ©AHʯ^~}{X&„hÖ_ùäFú«öÀS»×í´€F;fÚ÷Æ‚#Ÿ€_X?¹DygxZ‹ï¯ļ!Þ—å¬(ŠbV–Eé=«™-µ“$Of¦àï¨\oZÐbZœ&m#àxëÿöÝŸýü©£JûÊÆ¸ª)(ÎXÿ àüF/žPëD‚‘Æ¡€sã¥ÊÖ»z…y  _@ órôÜÔ›ŠÑY¥Ѷ\©¼½öÉ;d¤¥õ«¯o¬f "ußJÑr0ôåLŒ¡$1†)=üüæñ@lÖhøþ¨PFB€è«†J€L¨ýVºÿìÆ‘Uœ&êØ¬ì5Õ9o‚SšZFcÕPÎÌŒÖ6ÒfÊIðH$#Ω¨u¾tàݸœNgS/¢ ¥ ú`§âó^TTU¤»„,HQ”•˜îÏ,Û5$Õ!t¤˜ŒNÄ4=Ú¸þ“Ãç·¤ÑÉ„‡ïi1µWº»Ç%[æÅæÎq“½n:Y5 hYzl]¿,'3?u.Òª ¬'QÅ’” µÉ´¨‚"z4âg0=}šq{Ṇ?Ü=;Ýo\O¹š‘óñ™gSN§è$h‘D¼Wb-ù¥+Å÷þj™;««O?;!STS#•£ÉÜ㤺çn¾ •b»ö¦W$!xö5w7?ÁÓ’‘U/ýô ¿ÒúÞØÌ9¿ÂµQ•Õ& uy¯•_ûœsŽ.k³ððÀÁ4?dŸd¯'ßÿ»“ïˬµ´¸˜*€î•ìÆÊä¼%ŸèFöþ"'æheòÕ@j˜ßÙXh¦‹UE‹RœsÓñl4™L½whÙ‚aæ$I³{-Çá^2èÃàÕƒˆã#@Ñv:P›JGýíÏieãÅüìpÒÎÝ ‘HkO3HW›ãaª‰+Ťˆ¢ ‰uƒÅ×.íÿùÏú¢¤vábãþ§×t\{¥á¹S°ç[B£•*šY=°,Ú’~½}xˆÃì@ L¯ä?4úöÉ⤦9F «ÆÔ†ˆ‚ @>4tPæCðôüžÐ«}ëÙÁ¯’³|â "óÊ7?¦ç_ýËm'is!_`Q-Œ+&Äêɲóv£üÐ1$­I?ŽfB@0ËÛü±š´ÛX]Ú¸ØKÑO&~I¯#̦n2ë÷‡³qI^ÒÄØ,•$k5’,3qšT´à¥¥quýwîþôÇ»…'©è´ƒsR³*¡¡¡èí{®ï_;rFš@|8GõÖp~´®RðµgXµz•aѹ ³ópªÊ0¿GÀ{›µ_½¾~½I*R†²#иÔO0ÆáB‚@P ¦ªåxæ ÚV~p÷щck;Ùh8)£Ã rÝyGbC`ºÓbë‚üªG}¦tÔJ­ðNÊé`p2+½›–ÓIQ3qâÀGµ  äT1ŠìŨ0{OàãÚx`@Y$0À` Š¢p‰,žÌÊÖÆRË&«KAýçžîö—ÝxªP!xrÓ^É8oZT¤Ã]ÉÊFö‹mžd^È^Énî{´NgŸí¡ 8V4jÓ$íu³¬‘´/m vF®‘µšiãJ;ƒÙp<ްÔFÆj“Äš¬ÙHóÌ‚ªÊ\z‹ê=^yö?ûåOF@牼Vt«0¡òŒs¬(¶`Â"SeîýO«ybU{6ª‡Ñ3àfö€R ‚ª†1BÓA=çÀˆ ¬&ŒÄBaVÔXÿõÕW6Œ:ô.Dk_õ*ÀMÇe³ ÎeæÔS†ÒžÝýt{À´2žœM©Ò1+„K@Õ:àte¹Odñ7I)]²Hrqr|Ô/&ÓÑälRÌÊÒ‡®h=~@½·ävKb<8ö¨„¢(¢¨:,U‚xVÁ¼"–D \†aPW ‡›+Ï\^°¦½ÒbEWî|^6sðŒ #LXg£eYíbÖI@ñÎNšuõ§÷Se˜ø|uóÞçCƒÞ, ™U¼¡À„ÚV£˜eÙj·Ól/_ë%ªeÿ´ìž9š, Ð ‰‚ŠðêQ-•&´t¦¹ O$is´BЀiƒ@ëåÉã[Ò%ÏE(Õ¡œ¾ø’ÿþŸîzF æÕåí-U&ƒ0?]TdÕ¹÷§OÍM)#]qNECð¯lNðÈc,Ñ•õ?ÏüoÌ~ìM5¹L@Q0ÎßäÚ Y«¡ %(º©D*m”»"“š×_ñç‡pŸ± …Nðõ1¬~2)€3l[½KË­ÖÚ -£Åøàlº0{G$VЀ&€¾™• †¼ñ^0É—ž[æ’0ÿTAD«ñèš*¤‘ì^x÷ƒŸÅdëݹ°…0ˆ^”½/JRG$(ìØ"20*´ÖAšÙ”’„ÉX"²ÈL¶ÑL"@B"dBF$¥Ê–j$!«’@+6iG ÔSžS%·zVÑ÷q›ï ´~“™jQ ]8½¶Ç˼(Þ+ˆzP3±4cŠÂ© ¢,Žî¢IZ…«½öÒˉ÷gGGÇ'ƒY©Š"H ’¢Wp3uÎ(±%h®¿¸IÒ4DA âDˆQ‘@½Ù\=x¤=béßh~þ­_M,(4W6Ëî"z ØÜ—s½Ý Ó­©£‘ˆp®"{€kœsð…7ü=ÓǾ؄œ,<ó“©üšýÁ,?%U/­è J‘v\qŒêñ›ÂÙ–ÊUª6Ùç®®œàáÔ²ßyóæûæâ—¿ÿÀ{›wº½ªâÉ8íO•=!ùd¹ñÓ}B“g·¥šµô·Ò‚ ó{³Ã£IY†÷eBëc¶»£yoóÚåçßœìî•¥óƒò¡¸¼Õlä½ÅæòëäFý³“BÓ¤i;½…Ì®Šnt€¸¼üÕrxðÙÓ';/*ŠŠ¢bÅ‹V­ç“ŸŸZA#ñe¨¶¨GøqŒ°°J  œó Û!šÙ¡òú³[oo¶YEJDë&ãÉþàddš-‚v¯ÙL8´&Šƒ“™árX 0±!B4jR;Ú¾·?# ¶Í¦?NÕ¢M»­ÆR¯i}0Ù;9< §…zn_Ú:>ýj~†NžNšC‚µBUœPW=m$$£Hœ ²M¹Íˆ¬!æ¤ÙL­% ËŒÈÈ !R^T q¥çK/¥:Îyç°,f…õNÔzU0Þqsý²‡Æjׄm?|r¦©ÓµWd(2T%gŸîv¯ŒÈ@az’¶ù`†È1[ÃŒ‹W¼ †âgãéñÀ•e1Œ‡3ŠCp½ õ©0(wn´«?#“´Ú+WÖ;—Þ2Åäèèt´?™ú=)ÚÜNg¾(óÞõg6ij ÍAr)Ù+Y¡_ÎK&ÃéËÏèÿâ>ZÔ¤³Ù=üô ©™‡|iÅ*¯bUüMĨÎ8+$:bˆˆúNûlÏ }hذƒÒŸ }÷öÇŒÈZ¡Îs~z þ¡PÈJ…|àd+AÌP5àOT½Qdówûf&O…^[ù—eúwÆßN9köš T}" S¯ ¬Ì&w Æ´== !“Wÿó×Àóñ÷Ì?ñ£³ÑáýÑéáØ{"0  Rìý*]\¿zíż8Þ>8š¤œéèL­1Íf»·±Ô 7Ù=9öÁP¶¼ØL„²V †‚@…çe|öøÎã½BË2ñ[v{?? ¶_Ž£…P°² ž3¢æ3V£—L«r?øc…wüÀý@DP¯d×7žkuÕ `鯧ǧƒc¯­k‹Í$oä‰ À¥NN=£/<†<Æ*²Ržvî:BÒf«Í‡v³Ñ[ê5V¦“òäÞÑÞ`0™ŠÓ28z Nú=>ö<‰ú½åëºi­2NÓ̤ ÙÄ4&µ‰aNŒ5Á0PżWqÞ•®,\QL§ãR}áJñÞ‹ñ¾ñª(ž%:«K䬧•`¬üû“Þ–™É´:&¬ñÓ’Éxäü«:ìϦûªfÖ^:úüÚ³4Ý)®"€ûøÉ³›Ÿ|0#K)HºöÜög§˜&ëWuÂIjÚ W™AUWÌ WÌ&G»ãr2ê _zõcUdð¬@*¥ïÝþ1˜|©sñÙ¥+=SLŽ·OŽ&%ˆB‰6¨tí‹k†³4IªøRnâRkIÅn.ž<ܵ/_üà;{xÛ\ºl>¿3MµNøë[¾Ê1«8_dàkÅ«W‚žPi!f¿K;~6’¾± ܽtç_}æŸs¤öÌ hH¢UtÁ¤D‚çm@æeµ‡}(<žy³ü9œ¹ã)3 ­|éÑ/Í¥×q·@4½•v pzà ðY Bˆâ[íÝ{Èœ5úQ—¤¯üÓ-½óþØ|°”/_¡¯»ÑááãñÉÀ9äÐ÷‡𥋗Ÿ{-mïö(DØ{?Z$Ikm©qq#…ñôøðèfÚZXJú;ÒXÈRC‡¢ æÍ ïúá΃÷ŽG΋†©W9s?­PØ*+ïäjìEec¢_€ów"ä* Daˆ(a˜³°W4qì Úµ¥·Ÿ__BQõ€0ž{G§‡GlíÂÅÍÔAj«ŠP'ûg`ÔÍf‚h˜Ñ‚ˆA„„N>=- ÚÎ¥ž1ŠF¤=<<<ì‹REÄSt4Ç:ŒÓñÞZ÷Ì0½¹'°ö›»Ód¥°±Ö¤6 ^`Î{ï}1™úþt4™Íœ+]銡÷*ÞÇd¤ê_¡G Ï.Ž ÷JÀJg؃‘zªLì”Ék²rñâZBÍž ó”vo%,ÓÁÌ8@K êU(YÞ Á#ÝÊ…`güÊâ_NŒ”àt .ïSGÂk7?2‘ÉÚ,±Ý…ån+ËÛö•ŒÄ•ÃÑlÒ?<<+¦“þ¤QF"”`¸íu<Ò•»«‹ë¯ö¾Ô˜ŽŽöOÎΜç0[½¶aÙ¦™‰ð›ª+f€8Íšå¨(mj-…?Ûl®6»w¾ÿÞЀ¢Pcó™ÁO·ÃÔ¯êŒ×£‰«v~$a=³ú ò‘ún™O‚¹5ý‹õsÛ}oU¶®þkvï îm­/¨'ÔnU!Ÿ¥ºãGÑXGðo ¥÷цßLžìecs‚&j¼´øïÊä÷Ì·'ž)ít A€£ ¹‰XTBÈ·Ìý¡iâIa¾5ÈÂüÞGãWJækòµËÍÍ«­­k¿6›íîžögX˜X€ñôôX»võ¹çg‡O÷ާ Sð’ú£¯–;˽ޅkT̆GÛ©MùàiÚi7ó„*QªPëú {º½sãÁþxZ–*•ߩTX^h_ý·†ª ÚPs©ê¡>ÿ}cÿÀ×FŒô ¥g^]|÷Úµª÷(äe0î? žôg*&ïl,l­ëø›–8ªÿFGghdVz`fÃŒ¥ Ô ÁÉ ¿ÚYmuº-éŸíïííŠR<¡ #ÅzÏBH&±ÝEÖ•oîvr¾²±’ü-ð¥/½›Ó³“Áh4-ÊÉxèJïÅ{%¯Y¬:òÈâÉ„ D‚ì/Z¥xd­†/¢W9¿]%U…½hcñâå•ÜvÖ–‚f³|r˯³q áÙ‰‡>±Ø¸zAî 7Á——›ÝpX&(%êÂæÍmÌéÚñ(zV?8òÑY…ѤùJ7K;ëë½…“&èËéI2|t0™ŒÇ£R µ„Šž•ŽOþجon¾tñ™dr´ÿôø”Œðâõu‹iÂLñü‹›yõå„ÒFVÊÌ{c–¬wãßÜŸ&Ü}fõáGdžÑ"X@ðÐchb«V¸`À¤äü¬™ù²h:çhäá+Vý{4L§Ù¾1Œ / ~a_}ï ɵÎG#G\Ñq=c‹çÒC¬<®æ»»ö¹ßpŸ¦}?XFKËo>ý©¹ðÆw …daa±mUY&‰( A¢ÅÁ§€”å£QàÙÒ¥ô ãqúãGIÿÔ¼>)f«P¾xq¡wqó Êt¸÷øÁîÙÄ‘‰6þ(½p嵯ÀÉ£§„"*3dMu\”ùÙ©G¥…‹K ×Û0žN'£Á çív»ÅšPTç µ¹rõkrüäñ'ON§Î«‹ *…1„zn4Z„e«)ɵûO-ß­MÀ£¼ªÚJ¡pÕÀ'ÁÈ$ñ¦½ô΋¯¶QÄ+£³ƒíÁáþÀ+`#_håeª‡§Èér'K“ðô‡O§ŒR™fCDΫa¶ySš+¯³º“½}=~|z& \‚ ˆŠ* o’¤‘šda£ÓZÙj:Ë_ó* àœñÛíï¹Y)â½²¢Dÿk@à‰<u Š*ÂàAPÁ…±&±Q-ˆ€á\ë¼ 5ª‘j‚6¶zW..¦vq³ ý“;%Ùb8ÇäXœÌÄZ“øu3,v, ŒsÿÉýÒ9ΣŠt®ëÍC¤žy¢&lj ,(èÝ´¿+@ž ç+ë y÷âÆJÂ|1<> ìÆ“Ò)0#¡'0„ðô©ü‰]fãK¯~¹<ÜÛ›´×,ØÌFØØ—ÞûÒ«whuídûØYTe Š[ªü½£N_Ωc+ ©Ö@E=ö9ù)Öúü¨ÏZx >iöý`–/¶ýü'Sÿý°°ç›ŠÑ7`ÕÊUÍ!Z™WÕì¤s U÷*ºbû·#~ÈV=¥Ï¯ýóaúuøþÔ$Íåf@pºR8Bu–!o=|‚d²ôp°i5/þ—¯¨àÑûÛ?›šÿ…*H9<OŠƒ_~'Û¼Òi/­¿áG'û÷<=S cȨ2>~øýÎK×_ùÊÑÎݳјrõ…`žÏÄ!Qáö§Ië—/lt¬ïí>.•kLJõlcåÅÅ7þ Ø½wïã±CBE+âo=l.ŽF?ç“•ss¶jôG¨¬jÛE¬æ!‚x@³øöõ7×CsšÐÍúÇO÷Ÿö=É­n6>~ìòM¤¤Õîä™%ÍL*GÄ–)`˜¤ÖPÊ2;ÙÞ}´3•FNÃÁx¢Bâ´¤@…´”&¶µÚ[hç­•F’0¨xžM¯ÝÿñΠ€údõÜùîÑH ‡¤ÈìâüD‰f0  7·”‹ƒJcã„«Îù¯ÔP Ì¡'­­ôˆT@XíÖú¥^fÖ›¨€BÅÝ'’úbA¼Ž$µP€ùpî;®5mõÜ×ø‹xõ+ôic,n`¼é¼}ò}»ùk7>-”l³¹7ÎFì'n´HŸŽAl.Ã!¡@þ›ÿÃ/æé_§åÑÈöÌ~š°É²å(Ü)ÏŽN»½,¹pñË~¼{÷éݳ™zLHµÿÞÏü•W_{i¶{g»(J[LÅfâ@0›•öÁm6éê³k+_µÇ‡ã½»½å,i6lµ……Ä“*_¸ø[:øüÎçe¡4cð@Õ5 n?·°÷ÁÔš$U ÜÿÅd6õŠ RN;—&­€_Kî×^o¡R«æY ª”(ET_ƒÇ¤„d{/^î®]{—AÝhÿÁé£{ƒé´ ÆS(¶>ûüO›¯ýöVÖòq>ˆw ®DS X€b7i´Úãc¿ÔðL®ý/öGã«o|ðÞ!S½©¢ÎZX¢Â+NŽÍ«y·.¤KQoJçÆÎJݺª¬»~Ÿú©òÈX°”¿v´Í/þóA©¸nq"Ìg`Ôâ¾ A9?ù´ÚÐó9ä1þ`òwVNî6O²m$6Önmþˉùrò ¤­…vUQvÇC`RkP‰.?WƒikÐG$³ð÷þÓ´@xï!OF‰Ü0ÿsËÖæ­îr¯™5l7_XBAñJØzö9_œ<|øà¸ï"4žèñãïfo¾ð›ºsoRú²,Á 9Ô çäJdšNŽoÙfºõüå-ƒ£‘/5ïæ‘¹!Á‘ŽÄ“`ãí/»ÉÍ[79øéUößú…L«JöÏͬûU¦@{ƒ.…€õP1‡J٥׿ôlƒµTBw|2ܾ»sæL»ÝnœõïM§à•LÖ»x-÷i»ÙÈFUÐrÐ/ ¤t˜fy–¥±tÅl|àsPOÖ·þ‹ß(~ê_ñøÂ$.Ä`½T™{ªB8çe]äF&à9Â\”̅߸ô®ÿa:ãY?5ĘýÖÎ÷ÍòïÝút"Ig¥Ñ@˜³ŒK4Á`„;Ž‘M†‡34J´ñO¿Ž…p§18›¶ú·¼é£±ç„‰l£AíÞ¥…FÖhd„¨Æ4/¼;›?~rx4(Ëtü—?l½úê—ÍÁ£§ƒrF0rÁ“±!AïËÓ¤³¹¾nº½¼Ó’éh’'LäûgÔè¥Á‡Õ;‚æ—¾4>ºyûá©/]œ@ ¡}Pg¼(•'T*.©þ4xG¤•j¢‰oÖžõÕ^ D’ºÙÉéÁÝíþÄQÚi'\ŒîŽg¥AOÆpÞYÜJÉ´»Ä†Ù¿å°_fÐá,Mлéál6NÕR3;»ûéñDÕ±Éídâ“´±´ÜÛXnçyÅxð`owx:š8ï ‘QAfñã—Û‡éxá£Ñ‚ÝÜ3Ž<¢Ô½&­ÆÞÇO^#ÎaˆO= =ö³t~õ~AÌVù‰iløàa#ÜÛ¼¼•$ÕÅ$ Î'·Ÿæ©ïgˆâRF?ReJyýùÙO®uy3V '¿8kL= •º×NnTpÇVÆ‹ª~^ÖJ´u>R:è8¤ë0Ÿ<ýk°Ý|ñK/<§åxðøÎÁƒÓñ±Ï÷­fâ¹€ˆ œhƒŽÖÆŽ÷ó«-óW²¾¾Ôl’hvytèS–êªVE_ÈVÖ¯ŠHÛ8Ÿ,ÞªD÷úJ>W÷ ªÁˆˆˆ_ã£#S4ÊÌBÙzÁ”Ø—?Û q¢¬·­¢ª¢£j„eQÂõ'Ãù‚^Ì»+ýíô ½íªêå­s‚¿|{ä8ë,¶rÀÓ~:+IŲZ÷7jš»"`òÚþ²xsüã"럹ôðA‘›¦¯€Ã9ÈF¬±y#Ï:+;y³eó¼{U§ãÉîÎ`p6N¥8ýÉ{­çÞzíÍí'ý´ãÔy’Â+†|YÄ‘?¼½°Þ)'ÙÖÅ^J š^óøó½¸ÞȃXÈ+ÙÅ•·¦§?¿õdÀêRuÆy‘á?Žõ p¸it ÃâÃý¯¾„Æ3Ͼ}a™EœÊlØß½»{4vv›;;ÞŸŒ #™tqu£g³f«‘pŒ•£iÖ˘IüätTÌ §~æHòüô£íƒ1¥½¥Ìb²ºÞÉ›V&ãÁ½Ýþéx\âÁ1Q˜oPnêžðú$='g ¸ÂÖQÌQq>²¥ª+÷ƒ8“îœ7}m çê°¢pnpJ\À[»¼±¹ž¤õ%Ezç$Oüh8SL½N<€’5›Ïþòð:´V€`v£ß”ÙD”Ô{uEvií'Ç€ˆÙâN¿bqý »Ú‘ù|ó¬ø>¨~eò¥öÂo¬/¼óëEÿlçæá©v¶Ys¡‘¢ŠF¤NÄF A«3¿°šìœÎ:ú{6» Ž^þ¯ÿÍg0wäQ  HPOêª<"«Õ` ¢V&Z€õ3 ð’a뫺o‡:B~í£Cx£÷›ÙÚÆ3è¯çæþÑf¥’ÕÚйÚ`>y°nØÅ?ÀO}1£3«Ì˜ÿúäG¶óîÏ E²­Ån“vUÆŽ-yRŸˆY=|„Ü8œ)SókÿxÃݺSƒÃ$y|Œ˜‹R€:ï½–¢^ãÙU)5¼ÓÚ|a¥ÓläzÁc1ŸíîŸNÇÇï}¼xùw¾ôôÞéLa6CT *oT 1ÅþQãJ{øþ¯òÅõË ˆÀ´¹¶ëçÒ^]Zke¬‚êÑ£]]ÿêààéûv¦SOUîz8p¸uq[¹„!T¹¦# x€díò;Ïn4Ái \E÷ᣣa©Y§¹È³“ǃ‰亣gÓ…Ë› h5[Y†¡âóÔê ͦ£á`àU ¨+= é仟?p­VãòÖr‹Á¸Ñøøöîþi0)¼ר0©F@½ž¡àfE~8»öt:=É®ÂEKqv áÕ“âx®“®ÍgÎû:ž9WRŠÚ…¡ŸÏ)Ø.\ÙZjfÍÅÐwÕGO†&›ôG%¨"’…°b±ËWÿŃr]l)"ÀÉcƒnêU<+'í+Çw†€È ðT)z;ê\Í^9¿×¬­ŠðŽÑຬHeúTýìÂzïÕWïþºŸLÝ`͵ʈrVÚÌ‚)"‘Šõ†ýÍý_ÝÊ¿ú[÷ž~zòZËz¿õ_½þ/ö”@ ÂäÔ0j¬ÿ@Q8ÔD‰z¸|€à¼Outæ¨Ø@-BëŠ8¶O4»ºòÿaýÊîg¦F`*ë¨^­Òúˆµ„)ð}cƒfKÏõ¸…í[ëGäûpDˆªÉåkßÞ7_[þçÃRU ËÍ¡<2:t€àÉû^r÷L9mÒÐ'Úý‡¿å©¼uгa£¼}œXC†¡‰d¼Su*Sç •Ò‹¨+JzeæÞòÊó/u Üh®¿:ìŸí<~z£÷Ìëß=yzDŒKnª/J5à”­:Õ³óÍâøþ½Ï–6W³¤m@ysãøÃ{‡6Ë{k+ATå—ŸùÚøéÝOK+ÕHVA¨eùRkªT€‚À?´XÐ)æÏ}ùê:‰:@ðÃòøæîÁÑT¹Ý^²þìñé DB Ñ„“låÂÅ Òn35.4nVŽÇãQÁÀ†ŒLÕ& ­Ñ¨óëë Kí”e|zÿÑîÑÉÙÔ9%%Bý£(*zýžB)PÌZûÙ+Ìž¬n6’ñe© õ„U¬ÆÊK NV•¡Ì;ñÕê繈4ÄDª%C1Ð\Þ|v½Õ* P±}–àd0p!R¡ÎY4•Í…'ÿúéÚjÙ]Lg·f r•QÊ2]ë¼·[¢ú¬»[ؘ§%çöæ"°J˜¼5”TUCÕ&Ä hÅú˜ö«k¿þÌ2Cé°¶ï 'žSc›¹ºÒ‰¨GB)$m÷Üç?ÛÇáŸ_}õ⣜§¸œ¡çß¾ü/~U²D׉P‹ÔõÚ✳¬J°U fލ_¦ÚhípñµäpìKsB‰Í¼¾pr6_øË#Žü‚è‰U¬iˆPÍe© ú­=ôò¨Àoè-tCÜM”¶¿:þŽmÿö½G i£›7Æ4™‹8d³"7§„Icz4,f•m'RÕ¨ Y‚I@·\GVVr¡}á×/¿”©÷ˆ³ÑéΣ'gjìf7Çãíã¡S 2õð@&ÛXº²•sÖh¥±Éèx,0:‚÷&Èò<ËZÝ–øR-F÷Kwvoïh* ЈJµ“P}WÊ5´Œ%ÌŠÞìñ›Æ#ÀökïÜjVÒ0G´ªûÃuqÂÝüœªâU†Ò ¾Ž µwÖˆ¡`c}óÊ*Pw£VqvsÏ1OO'¥{ç¥TBpéF÷çÿá,ÙJ†¤ÅøðaædH¼uù…Ñ­)ã¢ß6qfF5&Î \ÅÚ$X!(ä¥ö¿öª±ûÜà‘˜tøËÕéÆÊêz£âd¢ŒÎ a=*•[‹‹™/f%‹*Ÿ¹å¥ñ¯~qš %¾óu¾ý½âÊÕî2jñÌÿìßþ»3ààŠ¤Ñ6YÏMâ;_j׳ä#’6]x¿ÖhÚ,kW¿‚³C;.˜¤H¯~oB_6? ÝÆ`ÿÝ,âJDÓÁ8é÷\µ‡Àq(¨º/ÈTíÛ×GŸÚÓì(¨Z¶^øñ®¾³øÇƒmka¥i@Ñ戴Yr0ï žxkÓdob®ý_RÇ»ïÏ’''®õøæ¨@dî0"£6µ&QËÆrÂ"Y{ *õS8'þî­?˯½þ¥«“ÓÇ;½ÆÖÅÞ3 îÉàÝ|ṓÇü4Î)“q>!”™ãJ Ÿ¬^¹¼ÿðÉáÞÊÂ“æÆ *,þî»7?zTæ““=×XÞX_ÊDEÔƒ§Î[_þ‡·oÜzÚ÷a:V°€‰F6‡©¬Ñ QQÅ!7¿úâ——QĉUW ŸÜ{rxR wWG'cD„èÔˆHˆm®n\èØ¼™Q%þžì•© NgcÙÚÜ&YÖÎSƒ¨ýmOµmùt2-Ñ€*€ L2¨æ= ¨²( ’DÞ¨÷v¯±þÄ#¬wóÕãBm#$T+E)tÓCP¥@±6Òó"йâUCíÇ\M˜TÏ íK+mÊ»[ T¥ñý"§Ó¡ g–HA@Öc¾Úþô?ìåí…2åV¢òûÞ–¤¾³¸òÓ@ÑÆÂñ vZ›7UÛêϪçpô¢#vÅòFE¡jöKô¾j®¼°˜÷9Ç,úÃk9Á‰@9:yÚ[Zj¤ÅÔ)j) Ké“_Þׯ “Åì`Bz4<¾:]MÐÑ>ûÚ®nöÚ_&NX@Ab;­j„€ ‚ *Ë9ÔŒDkÙ`åFäõŽìë4¹O Fá9ó±õoݾE5S¥vÒjÄ}œËW•|,ù%ΩçY†­~ªñ;æÃ‘›¦VÃ`Þ€ÿ(ݯ?~¿È𽤅Š:;Êd¦è B§ùÉÑ4ÜßüŸlÀÛï²‡»l€ ͰPB£h­kNR2 Zò@„NÀM§®(‹ÛŸý«Æ×_~ëƒ;¿5Ë_ZZ½r…À;ÐÆ¥ÉþÞþéØCÌÞ£*¥IâÅÃáaþÜoÞz|”·—øê¦Õ2}ã­£ûvFGvxrìÖú…¥,øÁÐòÊ×ü“Ÿv<.¢‹ ƒP°«fŒ"“GPöù/¿õ‚ñP" ”g‡oN Óõvo|vçt(œ0*@H@JdÛX\}i­‘† _£<=A.fƒiI&k÷½,O,©Ž†~øäW·§(”wg§ã¾ø0d\„bÈTO˜¢œˆ-”EÖÚóÏ?F0…=ìòÕ÷9¦ûõ̶pYJ¸û"”Î Õ‰B­QÁZ÷¬žˆs¿K4b—/l5Ò|y# $Ë“›gžtzæ<°¯ž '¢-ÿÝ_ ºÜó„…ï‚EÅ·^=ùhˆˆ´ìwX㬧¿9ò:ð¸5L?ŠïÏÍÉÓjp+’V–€ŠhÛ+/_„Ör«a+>áµå¢¿=Vq&³zzj—³rVØZÀÇ¿º;p‹ùT“gÞšýð“öמýüÉð´l¯ø7þ×ÿíCÑ-£zÄõÒUNóª •ugø¯'B©æR½ùˆÛ¯ÓÎÀ8Ú¥f‚Ø}ùþx~ýßNX±VºÌ ±Dƒ{8øZX‚ÄÙØ1Q'a¥¯¾$å'ð`¤qó•÷¦/_þ– ÊéÂRbU‡÷gb 9Z/nz“d­±ýú?i•(¿¼“úíÉÊôó“”ÈzBÃ*ê@SE&LH2NJlžÏ­Y) _¨+}ÿÇßÏ^}óÕwÎß¹÷ƒ¡f«ë——»›ÔÆ3Ï”g‡»'ãÙÄ¥¼²%•eá¤ü嫝޷ûÃI'¿·½zÑj‰Ý7.ÃàèþþÔš£{yÚ»°µ”hÆ"]¼ôÍé½n?<)¢¬ ë1K¡ P¯¥é¼üܯ­Zõ¥"¹âp÷áÎáÉÌðòB¦ûŸ*g"&Œ~$dV‘fûê•gV2-ü0 zé?8ãD'YΗ[íFB$Ó~0<£¦Ü¼½WPê¹Õkûƒq,ŠŠýˆAAB†)q4’÷€ê Ä ÌÊIcûì "Âð`åàš\bb­Ç‹U3TÏmœÊö`nƒ9ùªlãœHò:IÕ©h:+Ï\L![_7a4Ëñç'˜ÂdP(#S)Z:DÄ¡øÙ/&èÛ¸ÜUD€éçSㆥ[)ÉV÷[ÇJΣHO’sˆŸž¿¦$¨XùÍ#ž©§DW#[FŸ´¯¼Øå´ÓάAž­Vš5—‡û‡y#!'“cwaµí§È³'7îbs6ç×O~ô0üÙõW¶·o>ç:M‘åÿéÚŸI5ªo"«2Ö&ÕH Pˆwq`Kª˜à.5¦ÍCP‘UáÂórË›}oöéÒ…¥úkvhfÕvÖ‡C¬͑#Œ´V ©Â9¥ ‚5~ÏÜ8J‹r¦(œ¾˜oîüx*d½^Û(€ˆÌHMkáà!¦`ÿðïXg†>íœìú¥Ã{3‹ÌVJ@6JL>¤)€( Á! JbÁ¦i3IòTLÆèaR.€+o¶tñ­g_=½ñÙãû·dòåÞ…gVÒÕÕën|v´}ÜIÀ³"–Rü­{ ðhpbצOÖ¶:¢ÐKnßo¿üuyôtçÀ$‡mcckeÁª¨Š*$/¿29üàÆƒƒI$Âj¼!Wfõ¹ç£kÀ;d§Ãƒ§ööÆÀùZSýìé`ê-XD@%ú¾ìÑæ—^\n“í }ÞËMÔ™oò&ãJ’·SÖ¢8œ ú3ai,º;·Š’óž9;ÁxˆÌ0 Þ¶H¾ÖBFv Š“îÎÑ+ˆ9ººãq5›MCqùèÕ°s”þ8Çä¼ÏAn8ŸX¥s ¢GRê^¼°žpss%x–âÎ'“ÊäxŠ„hPJ¯…‹I¶™Ãø¶+K¾²Ü¹œ+ àÓ3ïTIT}é¡yýѽ) Òât!nïsR9<7×Mç“‹#:‚C5b£ölRwíùživWËa ÀðèlB›.µó…+ƒ~¿E¯´ý¤ui ýág™p.ÓäúÕ»?<ÍK‚{o¿úàQÿù«šSiþñ³ÿÝÀUQ¬Tºó©úH¨æ—…¹F^)~k4¦Áªœa£ˆòµN”ÎÒkT•ž/F½7~¸gj®Zm5,ˆó1¿ÑìM+;¬¨€¤À¾fq„è„€JϾ2ý 5˜ ¼MíÒK?¿C¯=û/"€mõš-ÁòŠY™“(±R²Þ{“/¼üÎ5,ÍáÄìœr÷ÑEc,“¢M)K ÁjRÕ§Ö=¤P:( ÄÖf6K™%Ë)¸ÎØ=¼¹zõՋ׿±óñ­£Ó!|Ìigùâ3k+­¤{ñµb°»0Ðl\ª1‚ì àÎxii©x/_Yp‡‹[=•æ—~ò3¿öìk¿6yøôÄ[>ø(ï]ÜZn“W/”\Øúý“»¿|ôd\z,u ú!8æÚµ_»´Ä^=‚ΆûÛïõ JW;Í¢<8º2O@(ˆˆ,¨†[«kW–›Óâá„(]èdI¸ÆüxÐÚh&#³éáÞt4+|á¬!n/ o}~<õ¦ÑËŽGƒ©WÖ‘‹- áHÕ§:=È–-¹N¦ÿ_®þ;زì:ï×Z{sý½Ï›|/ó¥¯,ï-P¨*€áI$èÙÒ"›!µÄ™é‰Ž˜˜™ˆéEkBÝRS"ER¤($ á_U…ò>³Òg>ïݽïúsÎ^kþØûœûJDE”É÷î=gïe¾ï÷½•GF×`åöf/—/µ$U¨BÖ¦Œô¸D2jºB:o—­ú8¥V» äôoúc“G¦<¯:Y³áÂÉúFï5;=7Wˆc·OcþäIBîˆøÁdyªÒÍ‘Qf%êF »ZE&8’yW9¨]ïëÌ# egçŠs=nÖš`f··S6Ïð*g‡^y¸h'}îîìcYZ~Xš,F{ëûFå’N’¸ãÍ$W6X ??¾Áa=V­gΞÞZ>ß91^ÆG‡ÿüR¢@9÷MÊšw* Θý‚$€œölɱ&…µ¤‹;Ñgÿ\Ã=êu”ðÊ·\ëÁÙÂk}í6˜.ñW„ rGÈ@Ñ-&Ë(<øVøtñfÝ7^‰‰¼»ŠO‹þøæ›1"€ +C9¥ÑËí´A@%še<¹¾®}èáš1´|ÞÈNøò®ð”åµÝ0ÙÍ»$DVîhD4Ä" w |ßËya>ôKŠ£øÂ»S§o=z¦»tåâr#¢¤³}QŠ“ÇïžÉ+d\úíÆN}ë )¡C¨U²¹W®ìíoìŽÛ«³eáÏ>üì[oécã'Opwqq'h5×ýríØtÉaƒT{ðÁö7®­7c ÑŽ‹ b GÎÞ¼" tZKKK[M#Åá‚OûkXˆ´ö …P+ô¤:|äH¹ØÙ¿¸ºÙ/MV•«Uò²Ë^§}%qw¿±Ûîô ,Œ²*õó‹}Ô…!:8èvì;îÐe™yÄ>˜v-©dÌ⻑˜ Ój8½Á†Öu¯‘§£[€ièŸ| rÀ¢Êì© }`ä–›€’plâèX¨«S;¬O:%¿{ÐŽ 5²1qýœè™ã7×î&ÑÎW: ³ ÷L¢33ÿØÚ øýmîkmXØY’KšøìòÝ\¾Rª ´ñð6„üá¹39¿2T´vJs»ã+nwP·w®MT ùÑæâ~£Ï³§¼·žî|øã«—×scÇÍ› ÛA1gz„"6ï¸õæ•æÙ‰ª‚äÌïýÇwY°}¤½ØÓœ@3¨šÜ²’A;á‚E5:îÛ©$“?–¬pÛ¬±ò ô‘â]º˜Ž§3à‘´ Jƒ«Swæ@ÿ.b‡ 8 •ê#÷ÇoÓê÷5*’ữ-øçÎ~u-f€|µ’× (±×O´Íöe¿0¼¾itícO†1Âõóº_ïñõ–oó¤'ž:®ÝÍbë±;w0Ns¬„ D¤|ßsE¿BÝW_Ÿ¾õä©SŸX|ûæz+IPvê—~xò¶{G“6†å¡Òí쬬ïu´!˜½ýòÄÄÎÞŠ®®ïMO†À#?ÿÔO~|ñü ù“ãÇno5®×¼n}UUgŽ …Ú°0 ︫³|íÝ…zOˆ 0SuìÁ;Nú,(ˆ;++Kë=ÖÅ¡ºÛ]ƒ€H mض²ï Æ Vœ û»ïÏ/µLP¨ •Å”F+y_¹ïÝÓ®ï®×ûœ:f1BÈ^¹¸ÿÞÍv_Dù¥ 6Z1£dR%!—2‚.uÍiÍ…0åƒ$:1º¸ÆSo P#*íOÁñ·u¢"r±&‡ é“Àéó„ph±.‡a•‡Jú@j ¯ &'Œh=6Y°­Jw~±šf·#)ÔÄÆ$&¡PIáÁá׿õ¡»ÑS<úÀª«I^O%½„‘ì,Ü?ž{m€¤P¾yÙýï2gÒ`«¦-(œ‘’»2Ý]¦€¶G›ÒC'çØijOÚ-NúæŠõ5:22T­Å+ ÃÇ»¯=»Í7üát¯YØ|m/˜®× y‰™´Ú|öþ»n.wN«cÿú¯~܃ì¤>2=ÀF¤e‘ÉÑ‚ç,Ø~¦„{û Œƒ:x«àl}jǾy >çíŒ\n™åIsüA`ˆðP  Ò+›a+¿Eñlécý±ƒWº€T'J€h£.+Ö¨PW:ÞØgŸòŠß›Ï×·©°³X¼$ÇèÝö¤÷W³0Âô¯ll :š¡I*H¬˜ ÷D+¦À/ü`yÁ¿ÿÖ±Ó§ã•‹ç÷ÚI)îE—/ï·fÎ'Åተ6|6©oml´ûèG‰a¿}½86µWotJË›µ™’ðÐçž|ñ›ý×I—NÔ4÷w%lïœÏ9R$AÃàŸ<ýÉko]­G Åéß5l1û+;Ëk[}Œ}ê.6X¢Ðíp5¸ ƒ`|nfÊïm½my¿/*§Ui¤û“¥P¹j4jìÆFÄL’#LxC¹Õ++­X¼Bw݈Iaïl]^JD@Ø‘bÒ˜SÛb‰#Ñp/.¬4§…G›µ­ÛxRå› Ó: Û.y ªµ#¥Á ñ Ö©8]äƒ dH£­óÓ“3U_Låíëwps5©ÙIÔ‚>šÄD‰¨¼ñÓC?þf³ D0òèl¯^-£0zQ'ìy#ˆ.Îmßè2"´×Åun;Óæ!³ö¡-ˆÓo¤êí”ÿäjFQŒ@”/?–+†KE²@ÔÞîØéöú±çBA2%7;S8zL¶¿ýzÃ÷‚ú·^ùÄãã»—ZpˆvsÅ(6ÂK‹O _y¿yz<„¤úÏ«ß:Ð*qé©ÛïPíPì9eS]I€™ˆE\X¢”’UŸwºZ{–¾Ðá‡:¯•n7È%äÚ…§C7S‹’íxSL& ¶;šý¨¹¨ö’ƒ–¯ÕĽ7/«c·þp#!„ 4€½–ê¶I2yTi/âä/?‰n½¾ïíµüpíºøJ!)0J÷<±ÿçµÝ4fµ¥84´.§"|°f°‰u0rÒÜOùa~íû÷Ü[9vìÉùóËQlúqûÅ—¦{4ºþúF~rfhrdäôö¶WÖ·ÅcŽU÷:Ý2»µ¾ß)òÞðѼĹŸ~ì‡?ªC\ë>{ên^ÜX©ûÕÞ"”çfG|»Œi|òñæüùKí3§î®a³Vq¿³óÊZ¯« “U/YÛoÇ¢€|kˆ›š‡ÃÂб#s³ýö•ÕF'Rh@aX=:V¨y£}s©‹~¯™ xl€1‰V‚cåËïmtX@ ¥ ï6:1g–\ ’pvov‰Äòß_ÖbM¨^¿/Ï•;ií–¥ª¥Ž¢0d JÎî²Q³šþ°V}0”rÒúIŸ‘@ü\µ”÷@öcéR*Ò„ÅêÊþñ_ºËˆÚ|9V:æ/m‚ï+m< ŠŸ¸õýÿ²è@Ûad'Ö|(l7'é‚ € ˜)!@•ÄÝ&ˆwåÅü©‡ï»åäÖ…õ½’¨ÓÝý»o|ä¡»–Þ™¿&ž˜ž™šºZkËëõn·çûÕÜÙƒõ½fa¢ñîÈd‘“Ò>ñ½ÖÅGÞ\{6˜ºýô#Å­-)Ê»ïªÙÙ‰ª ”5’¿ý@aŽÉ4šë›×6[¤ss£áÚ½ˆI{ðŽ‚ ¥òµÙ£GkfíÂû7›öIauö®ñb9/&µÆ«IδûŒ†DcM8^<¿Ù +µÎ~³»å69ˆ)  ÓQ.ãÉ–W™*%é·‡óË· ·éúýíN©<½­-üËMˆÝ ì^wçf·*²£3x1%è:ËÔb"ø½®L+ù‘±Ð¶¾› ;B{¿¢4(4Ìq"Úý‰»ûûxܯtöö­÷+C9-»UŠcV ‘0)Ï­]î3ŒöwœKÑû2j§½@ýé EÀá ]æ6ŠJ3¦Â¡“ÓJW‡ŠZ DýXC§—˜8Ö*T&1&AÍÆLŸN^Û;þàÃKϾØÒ#÷íýéÎäç?t÷+7: ä¨Ó«=0Æ‹~pï¹ÅÍjV ÿ¸NvÛÇLnñ—ÔâJµŒ1k*ŒŒ”FÕ¹¾@>ìowúݰîy ”>·x…NN}·å¹APZõ#ŒlYú%Z“Xb%öl„ O„( jOªëaÛHË'Ò¤\{YM=øâ~¢Ð/åBdÞ7Òë‡È"H%^»åç§ÆÍ5×^Üö”"/&åÍ|ôÈ×ÿ6ÉDZ'M.™´²1óé# qêÐ%bP1&½×ßÎÏ>qýëó»QaFÚÝ×^=õЧwÎÏ·ºo½®õÄ™éjåô)ÓÝ:XŸßÕÞü‘³Íõ}SÛÞŸÊ%üì“Ïüx›´Ö/¯¨Úìí·ÐêZ½ä–—tuz¶J6dÚ1âíƒÅåŽýÙZ­»ñæA‚X~³€ËQzô艙J²íýåý‹$` a/=yn"O÷˜´½ºËë&õvÏ*ÖZÁôÇèâå­¶!ñò•Bs¿ÕI@÷‚ Y™“àHºÓ´5¼K%@Â8ê…ë0qnçt£¤F•J1²"lV "f~ Òâ%WÛÑTPw5 oèÈÌ”¯ó“£Ê2¦·.6•/Ýý’R¤%ŽJéÙ{·¾|^È@úìôÁeˇ"­…Š» ¡€îúá\þ¹º b¾x™ ÅIíHû0>;}—Üãc?0VzèLwife8zjN…C£E­A€z{Da·“$}P¾¯“H˜…˜ãsÇÍ ßY¡ÉÏ=ú+Ÿ¼tƒ/_j˜Å?yö Oœxc#ˆ•ßéÆÅ$ÂDïî=V½üfãøTÎÈcå?\BaA§ F¦t'Hv„“R:…X@”+p”8o šÂ=¸(}¨· H¬ÆŽ~›øîö›*Ó’¤ 6{4 "[êEª*²’qU+éÍŸ*;Èè•~r²õ~p ×„ˆ”>1ý¥H=ÆÏõD!  å\ØléNAŸÆÍ‰sC ÓâÒÞv¿t0ßô)ÍlÐ ÏýTüG/@ÈSZ²½²X³˜eùfòs»d‡íC1”á rÜxç½êm¿å¾£7oîî‘Ân¼ûc}øá+×ÖbéÜ\Ramzftø„ÜÞß^ZÛk/¬OŸ6ë`ô`gt"`(ýÌG¾ûÊžÒ ÍÎþû¹‰[Κ+}.l­½3tú„J7 ¹xe5òk£^gãZ+²üe5/VìE^mtôĤw°ùìâN/N”D ÔùpzúöÙZ@ÝÍ&«b^Û6¹³¸ŽªÙl "jÈûŠt¾Â—¯ì÷„ C^»qÐM °8Û¢€€åC fÐg×Vº@ žaBˆ!Üì{ÕD­ÚþŒŠT’ºúàU>ØªÕæDg$$ ÉüeéæX éñ¹£¥Ð¯ŽØìOL–盚úNÇš¨M%FÐó±xæøõ¿½ŠP¼‘µ )äH÷êãõØb, ˜Ñ¹7:¤ÐoíºêPR•C»d¨öA™Ù–ÒE'dš«] /;y4È µ¶€Øvý€uw£Ø ŠŒ „DÝ:·ý߀¬üá×ú±=øÎŸï‚§’ó7øÜg.¾您¯ó}ÆåÜsÇ÷û4–¹ã_ýçë?k›%·„sƒ>$PwQƒrCVðèäžÑxMšá*yYï¾LêÁ×7ÝÍî~GäŠØ/Œ3ïº\[Îò«l–“ ¹Óž`äCò6öu|@ä®=ºñ ?ñÆM#h(WAz—¢^ zž.—Ïz1ðîjg?)ïn&9RD*üÐCËyÅSòÀg´Lfq»ÿ“ÓÏÆV=†€­§„X‰Vˆ±2«g^š}â{]¾°Û†§‚F»ýãKçn»cùÆr³uõ›~ß:S9z,n¬¬mnÍÔwº­òx£5<ˆ©üâãO¿Þð5 ~õÄ™3fy—‡OŒèp\°?<|ÛAsiñÆ~/!ñmQ‰BBÄ <ÊU.vv²°Þ=0 °*„ã#'Ž…¦»Òj40*–ÛZÜ$/i´™@˜E4S±Ü»r½Þ*Ö¼ƒf»ce¾¼MÜÓ|ˆI’=>Ö9îú=ë)î'¹Ùü ¹YÚc™ ìƒ0Ë!èišœQ“K5t{+ŒÎ’,d…‰¹0>37ae¢¨±·°Ôô©×é@0¾’$æ$AOëð¶“çÿz]³ ©"ð„TË…"B Ñ’$)éî/æÁ™—¯C~§h1jÿ¹ûN]¼Þ¾k²lðÌïþÑ$9”ûuˆXàösìi´5¦›=ä„ê!µÕ“Xx$€…³K{p§ÿZ¬1«²2 9á€(Ê&GYÜUÚ81Ì(ìpÖ÷í\·õŠñPÀ›ý»†ÿý¤›ˆŸ¯æ ÄROt7ñ 4y¾÷1Áh=ŽV›^Üu„#¾ãõ¿Ú Tð¡Ï5´dÙ\i؉Ãñ¡ԎtšÅh\ˆb²e²Qнrù+wÿô½wÜxïÚ¥ó##¥¿÷ʵã§×W®ìwÚ=Ž;¸|9¬ŽÎMצšƒýŽ`6ÙÛìÇ¡>Rñ…§õC?¸ØR ˜ˆÅt{;ïÔ&x0ðµ5±›Á|azfºt}Ý2UŠB!€ <<374®Î/íw c&Ñ:ÌOœ/D{ï­î@É£Üx­Z  Ôç[¨z݈DH€aATªTi^šoF, Ë•p¿Ùî °Í{ "Mý]é¾?‹+tI¥ƒ7TXL¿ÆkçrM@˜d)òÆj}ÉR×áГiÒUà0š€UZeqipH€BÅéÙãUOWFËV†Ð¾¾(¡J:=FµI’X€Hå+§§^þû OÀø^eÁ“x¨PP€"Ý„YPÙ=±˜Éc+ 1‚âáæ¶r0=—Ú<n“I`ÕXe|w[+QogáØÑÙ 8\Í{vï!½ƒ®(îtz“R„œ03é$ºµzþ;¨MÝø7òا~íÃÏ¿¸­´lþ·—î£'^Þ#*šae^½åôÆBtÇÉ’S¿ù§WŒÙˆ_vk9Ì¥'%i±äšyFDÅÀÅ ‚0z7/J›6#<¢©±ydõ¼›à:A+B–ôgIs>R\xCé«d±Š6Ü‚TîÓÞù~¿«Z„¬Uáþä•pè‘‹—¢ƒâPgdê6Ãn—Y!+/ÌMŸ „Õöf¾±º˜…ºRB¬ +í}®úowó\ú¹n|]N t'§?]ÜN*×bZd•k묊šÀò«ÍΞ¹åCOݱtñí啯åCî\>z×ÝgÖ77öšÍH|³½uåÂpéä©Êìñ¨Yï÷v6›­êh¼:<<þ[מ¾ØU¾ &âßvz¶’I¢~¿C¹r¨m"çn½õ`þÚ½^b´5 ê\yòÄT9Úx~yw71À 0«B~èÈÙ‘ÉBR¿vyq+ÊNø^~d¤dßâúßKšmè" Rn½¿Ðì BP-Cý Óc»´EV®óEÀÌO2 FZ¤ºÝo¥æ%FVõ…Öï›ÚP»•(ò½™ ³ Áá‹á*ôw5¥Çpºc¶°i‹·”2 3g'ËʯMØñŸ´®.’’v§'B¨b#‹òC¿vnôù¯5´¤pìîj¤KB>,‚ D:0b4 `–.4k…K0(Nln)¥A»@‡ J{ÛªÁ2¨^±;A¨8r|"Ì å}€ˆI·ÑB•t:ýD 8fÃ79®wnÞ\ÙoÅl„9(ÕFoŸËËÁÂ¥+ëû¬Š…±ñ µJ¹ €ì-µòÒŸ?ûùŸþíû¾~% ¸ý­+¿øäñg{€‰A¥Z‡+oÊÜ$GþÇÿ|…À8ø f©l‰®l1äTúîTæ½ùI؈ºMDb:òv[îñ_Š|—f¥¼vç/œçƒ oËDˆü;…Hî“j±ãõõ&+ î~¨ü_{?16Î3WÊ… a[ Ó ˆArá¹S>]YJ6ZÁþ5 D!¡Æâ=Yÿoï{~rׯ–þáéŽpËÒ¾ÓÖ¶"7³me)ýQ³ù”؃ӥ§Xã(QïýðÜgŸ¼gáµWVòšçߘ8{ç¹ÑƒöD²¿·ßé·{}Ýi,½å•'Ožž¨ÕÎ56V›±Íµ±a•À‰ß¹üÆ¥öì§æÐ@b„%é4ãÂpeÔÊIÒg €°rçÝûóK<|ôh®?ÿìüz'1‚Ì"P(OŸ:]Ò­…Ëçb¥T1(Ox*?çOyïíU 7ÙÅÅØ§aÏi;+vª L˜Ý/bÇ!.0” pPÉG‡óŠ˜Ðtö»:höâ~›rJ›î@ãíÇwø\C ˆ GÏÞ|·ï1€ÇË¿ÿƒ_úÐ?üîêäÚ¿ýܧî•K¢t!Œý$òvž¿çèâ;ñ¹àñßû?.&ö'Uâ²?ØÅrZÉžBÅîygxA0Q$`hø6™סÎZûÕ^𢻖®i2Œä$¿éV7Åz¸àJ—ˇbîU8²Ó 0Й;ãwTêQ(À‰ÛÞY¥{G¾ÕèÛ «… `¯©z=CJ‰ªÞ6ÍÒz¾ÓÛÓ ‹„F! ¢öÃßùöŸoˆŸþüö¿¼Ÿ n§!.9 …1ƒ(ºn4ÍPrrÖC%Ù7¹'ÓIP\Ù{ïþþç>ñ‹?ýú+ë*OûW¿sôÑÏÖ×;cÃQ²Ë­Ý(i·×ÞöÇž>2Z9“ìÔûÞA«VÖ1ÝrkC`fîµ[‘ªŽhԀȨáhAX¨rϽ†»›¯_¯÷ Aðóã'Nœ.«öâóW®ìÇÊWÂÚQ%Áhµ–mÈÀæNÞïì÷Ô ‘İ€ Uò+—V’>úµJ«Ó‹>€i`›75ð술JDÈdݱ  ˜$ÑSÞÚžRÀÔ]œk#ÎÈ”nWù;äùO‡éÿRg;¦yËÈ€hôÈÜñ‰Ðó‡«dÚ•ëÛ… ßìÔ¨Å$3¯‚¹»ëú®h£Ks'/¼ÕÎS¢Ö÷Jº%¨¼DHbPÅ£7T &» UʶH™>¬(ÍÁP¢Ó."7ûf ‚ andfŒsµJ¨<@äý]H³žD‰Z#$‰0Ò.Ý1¹ü÷ç»(˜›¸¥ýêM#°¢øÒÿóöþ¹ûþþ¥¶Oí¿yýw>>ùf/&ÝŽtÔzéCw^zgÇ9û½);—•ÌÄphkì*Q IûàHŠó[{«MŽÐ?¾¹„“'¾ÚòÄ–À¨øSÈYÃÒÝŠÄ:UL¸- 5ª»|RqëT>QXÚ :áªfT!< ¿…O,½Ý·% s¥BND¤u ÍnHFaõÁ1aŒ‚Ý|-x{Ay`”¯@F>=ûµ‚T¾xÿ»_»ÜLéTwtˆ$éf—™ð”¦gAµsR`×/¥@sFTñµ‡ú‰‡ßõ­FàCÿâõ¸ÿñãû[;a©bâ3íÝ­F['}é,-¾\œ<;{tbœ“N¯_/æ$!aˆ£v䇵œfÀ¡•€ $Bppùf‹Ùh•¯ž?;Fëo^\Øè1è@|?›"(׆kåXÁâBÏó:͞جy‹è%Va!X}w§+(’Ê5›Ý^I„D3ÐUæÆO3ìøí¬@• £ÄͲ¬Î–êˆzçÞó}¯XiD] —œ1Ád„6ýšZŒ¸c£ †#s'‡óº8V²zÔdõJ?$Óê1³1l<tîÖ“ _¾¬ó•;F^¾È~^Aˆž(Ѳ褫9ïADHL3p©‚Xõ¯¡ ¼A.Á‰-jÇ’™X™ŒÛXØj3APvð®ó#§ÆƒÒøp^+ ‰› ñ¡×Šcä)6“þÐíCïã{àÌí¾±Š¸TùÂÿüÙÏýö#_»yæÚ¿ùô'F^\' ãE ’ï9sýí~¡ÌÉÈoþç˱mmIq,®¶Dp!`4”=ôÊMÆ)|–;1&=˜àì±Wãä¾ök.WÈÞä2€„UºÄ±¦ÃÃæOë5LÙÏïMxT®ú]¿ÙÓHÄ“w¼wÓ;w䯷cÛê 2’÷€c£´'3÷L°€´›Íƒþ~}IydƒÙ•ºåãá?O>OýÇžþÎbu:O'·œp–D[áÀ¤ ‡•4€œg0‚›‡ŒªûßøücwÝ|íÕõ¦ïK·÷ÝŸÜùøÉÒÕk¥±„¥ñÞN¿Ýlv•1ÍÎ’?vË©šÎìIì³Æ$XÑ‚õIf¸<94 ³HE@î<»xñ­~Pž½u¼ ;.-.7bD¥í¶¼076@~x¨ZòQ ¿»b|ê´"F šÒÎ]T¡†×.îvXX•ªA¿ÓM(uýg ºcÜHV¼¥û¯Ìß"n¸c½>L•D¾·¢çÞDÀé4‡ƒÚ2YÙù`ÀïÄDî=4±œYQV—«Ì ’ÏáøÜÜpNUÆó¶ è­.ôµZî7bØ$Ji®Ü>ùÖ߯ù˜@œÉ?{ü`LC€9Àƒ–G ÐøÀFhòÄâbPùû;š•C–´ÁNx¸'Dc[£€m•RÛ-(WwzÅÑ©©‚72T²ˆ~‰›È£¨õ ïœ$@I2z{þõ¼Ž¼Ñ¹‘o7¹: …ÉWòKO{æíüÍê>ùÆ%è(ÔFȼ{Ïé«×宼ŽýÖ^“$õä+wò²Õ&±±ß€µý‘ °£a†ê9vœÉ=Mø‰—;ƾ¯~X)åAã}Eøj澪aè·¶úÓñÛ(AE:îxróß_ÉArßχ_yn#a7£Ò‘¨‹‘H;ÿàP?°˜Ê–È D©²˜ ¢V|ùßþíã?õËO¼ùÊ–§Pöž{厧îݺðzæÊµÚL´Ðï¶öZÀýdaõå©ÛN牕¯pr{ˆ5 Ü, d}æÌS{»\ š/_¿¹ß%"™µ r“SåÑ‘RÉGA^]‰<ì6â„=RHlEŸAÅ\½°ß`U ëÍfϸbD±ˆÊ–\”ÚËQMçe¯ CÀn?æK’$&ØìϽŠ›mÜ¡c 1™x€Ý ÈµÎ‹žêÿÒ¨ Éò•ÓÐ{w ä§NÎT‚ 2\°CÁhqµëI»Ùf°@4ƒœ$à{Aþö‰×¾¶«¼¡;¼gW”‚üP7$ÏCÙ@ê{‰æ˜â8)ŸÀó{€†ªþ¥Ô¿ëœäܪf³`l×+ "¹Š…ȦŸ!Raxn”¼‘‘!F†QÜéö£”Ò*1̆ÅБ[ãï=·$Âá3µwÎw•¥|;‰ž©Õÿðê/ýÌ™¸ÀÐvý‹¾V7à%J'˜Þwœ[~Ï?Y¥äø?ÿË.‰mÅëv ¶½:˜Æ‚@æ®âÁvÔñöH(ÁéÍE=;ùýŽât jÍÃ`ÿe´£FFd†ÁÝàÖ¿ˆÀƒå±Õ ªÉGá’ê%ý}RÚó+÷^~_Ÿ<ñõ­Øí#‚\ÉÏ€tw9I”_8u¶d€ŠÖÖÃû‹Ë ”b$ 4ñàC¾´¡Áûȧë_ym7±3͈vöa` _À,’Ç… ¹¶7‹KH·V ŽÎ{(N23j¸yã;÷ÿÜgyç¹-òú¯¼yë'?²õÞBTŠù‰Ñ!“H{·~ÐjéÚ‘[Ž% Gs<Œteš&&Ú7 !•ms6—@AL¨T>.Ë—.¯7FÏYØ‚ÂÔ„§ó£CÕ‚O €Éâ+j´cE„JÁ˜k¥ä浃8Q@ÅjÐ<èDˆ…,Ö'5î¢J íâÈ9òÁ(÷ÂÛú(Ed "›n³¸Û%èÔ‡wNÊQå'‡70©SŒ˜×à+(c¤bS«Ö²ÉÂT?v´ªÃÒ„o¿´Îò|œ£Î~ÇBò Ÿ$,H¤õè-Å|ç@BÊOœNž_õÐèš´j¤@6÷4ǹâN€‹cK7ú$è 7êÊ~©™$•&ºÙ'ê^2U°½]P ! èÂðÑ© Í{ A@LóÀôÚ½Ø(/éÆFÆO=xæ¹}B@.ŽÏ©¯²å‡SŠ(âç/þìgÿõwŸÞ•äýÿ…Ç /oöYG ôÞŽµß‡3CÆœúÍ?Ya—IÇ©qÏÚ¹²Õœg"ÊÀHl™¥Ñ*2Ä)Ržý6Äçzof Ûñ§L±ã-CœßÉž¡L)=>UN Š÷ÈtcÞÛ÷–Q:;ú5ñ>¾ÿRÏ=:¬Ö y@¦Ýn$ºxæÖ ŒD,6óÍÈĆ<L$ýØÜËÕ¹ð ¿÷í‹Äî£PÛ3Ím¬-iÒ%ˆ]§òn«š–°ŒÑ©)å õ®¤ÃÔ°ù?ð¹Çxã'W÷“‚B|ïÂ-O}tÿ…Íuu±:Q t±u©2V+"Gb¬t>»b ¹µªqW`’uX.F—«‰ E¿ßgå6΀N:Ì•Œ*Uª” > DË ýÚ1 )$"àUjÑ•ë{ƒàç+þ~³ÝeWl8M£(¸ ø¬.²ÃS̶q€€:½Ë 0‰âÚêÞP¾IÊlZgCm)_iˆOÚdˆS& ã2 )g9°’Z,™9:ä«¡qÏ®ÚW6“µ;1(A4FÈzß|뙎`(Ξ[ÿIÓ¤Ê02h€d=öâv…ÐP¤88AçÂJ*þqNh«wa{:ëoêƒ2”©%Eë¤"aAñŠÃ³“ùÜðHÑ#D`Lê»àC·×}ß3I ÐÓdôÉS;ßz½®!ñtaìÄÁÛ‹¤lÌØf‰m7O¸ÿ_ÎÿÒîøÒµ„vþëögê¥ëqˆ!¢Äã÷{gÖßï8¹ýþ¬Û$9ß.v\ÿ4}ÙRÙåv(™˜ãëÒ-,‹"a}F_ÔòÈû« €×€|€Ð„ŽKä"ð€íñmÑL˜…¼bî ¼ÄQÌM¥0÷ðú›|äö–7n÷üêPA 7<ìñð]'µANú^o©©÷:ã½®§ÑL}lìkß7¹dêoyá;×:™VISúÂÛS20ÚdâôÍNs Ó{Î8 PwK09¦$žj~ÿÙû>õø£ï}ÿÚž„¨ñòÅ“ÿÄÞëWÛz{—k¡:v[Q3$ ‰R ¤Å[­oŠ­@€ 3 Q ÃÎö¬ž<óéw¿»ØÔ‰±ËÉ|Pžž ©Õj•¼OÀˆýùUÌ›V ˜‰lù)L¦j¹uåÚvψò 5ØköÚÎ×¢\ˆŒd6ýšÊÈ3(ƒÊt^®E…wGpíÔÔe$oõîÝ~P*F䜶Ù%âîzâ2ÐV_œ ÒZM•U'OÌ”ÈñíMÛXÞ‚9h&‚ Iİû…ÉsÑ—^ce¨<}öæë-Õx V… Ò½!32&&ž½±!˜px·®Øv'‚"ÆffCv‹e’®ù%û Ý-F]üüð©Y?_+( €I£n|Ž[ý¾(–„ kNüÛ'¿ýN¤•äŽ]{MÙU~&ª³±æ‚øÊÅ_ÿÄÿíëÏt!ùæÒo|´öNCÈhV£¹¢/] Ï…íüeœ¸*™m~/¢ ¨4L…, 9ž›Ãö®ùÛ¬”˜òÙë+8;ü¥$`r“~k3wÎ¥N· +C²÷’MOtaÄ®²t§Dpÿ±þ’¿«WØ”àäÄŸuõGéÙv Z ‚\€ ö‚<8‡ IA’ŽZ¨ ¶Å'2J'?­ÿèÕ àã¿“ÿÚ3kÝlz&ª4@³aH%Y †Ke›ûRd@BuU_–b{Hñ—…»£3þ ! Ê’‡]-€Õ>zq¡ßPË rÅÓW£±/^üN‡A `eøÄø¸€úºŠ‹÷žd€¨—0xÑ÷·«Ój³ÍšD•üLóßω<ôÛ½¿zv½£‰müŠSÕgGtš²ãÀÄd1š‚.­a0Úê"hXÄ\A%{y¾ñoÿÓo|ì^øñ+ÍÀ÷ÌêïO|ü3­ GOŽ¢Hš­:,UJ”–Ìi ¨˜( ¨[oö˜Hé _(XÒb*BKëa0 §ÏþÓo¿°’ / JÓ£:¬”«¥‚(í«;Ê÷Û=ˆ¤™X@–j{o.´c¥«åd÷ Û³Òl·%d»èQ6ÑHJ&[Ì[lÂ!I±%õcŠÀ6WWûÓŒ‚Í^u÷ˆÍãC«XbH05¹§|P!“›B8Y ¢˜plêÌH^å'+ößN¶–Û¨ûÝf?åˆÄý® è@ŸºåÚ—ozrå3“¯¾Oq~Ì3Àìlæ¸ÝMP!k2ŒÃ³7û(àí(t¼ƒ¡§÷¥Íø@±$Ol¢>øÜMŽÞŠÏ}oK„)ži¿»ÀÊ-Ü1•ñ –ÕHÂ$Ôù»÷ÿÅçüív¾~ð³{ñ’'±Æþ»râÆ«¹¹œ„¿°v©ÇÆáÓÐNqk(NëÙ4ÚÐ9eÑû¨,Fä^€ zbâË`îÛ¸HV_awã$Àhq^š³^%[bKêäJ‡ÌîÆwðÔÈ5ú=ûò¾~¸ú·ˆ\ T*æD:tlJ(Š“ˆT¼²£N„±>þ±Ú_ÿòñé_ÿÞ?®'é.ÍéTèc•›©[ñÚ`;8CçZ^&HAXƒ‰4¸™f²»÷D…¨Q¤ùÝ—øøO=:¥vËTÀ‚`Ha{½”ÂJÉ·ÞÉ6\ÂF¬Å}•jÔûËåœGqcse/bòǧÆK÷"ms[ÄÖgN~êÂùx|ÄÇb­Z ìJö`a×ç8jõŒò”B J0¬†‹–›1“Òµb«Õê%ÀÄNÄ!© 'âà@@j;·æ8˜ƒ¦9]îgà¨jé®ñ T¸ð„é”*Sš·ÿê_–bt Dζ%êÆÍU<¯:  t—z%¿¹Ûd_›Ä$1ûžïœ)ç;-%"^8uúàÅ-Eö€)Ô”?VÎ3B¼c ×AQI„ày'äâ¾”’^•–(õ#‹ +™Óõ­½% )êÆ%P€*È×fg Am´ ”µÿÖ›šúín±öIbÖ¦‡§Îö~ôôùÈT>2»~i´pêƒÎ¾€˜ÊŒ€‘´9ÿ¿þÊã“q¹ß}¦ýŧp«ccöâ÷ðèüK0[”Êoüñõ>»&ÅòIá3•fƒ2ÁÌÌš%h«"ANóuϿ兦¶ôâ± 9ÓufIqƒ1’Þ%“ÛºN“(÷dn'ì†+” šàÎäiÌ|툜Œü\Ù÷DÀôF'uBÒïq?Œp½«ýj­‘°çŸøüÁ;Jó¿õòFŒÙÒÞe³Å½-JðÌØ©M+Ô’tI­/#„eàc"÷_&D$&$@¥ZϾöÔ/Þw?Žê·÷¶ÌìÌ©¶Ñaž‰ ¶–`Ä.Ææ *IÆ{õ­½v‚îü‚?tzºØïǬ4eu(ƒ09úá½í=ª”Ê…Àâ²7vQ™vÔcTDnj%@”S ï¬wbf +Åv³Û5€À6Í1Ý|(0ÊvJ8fÇŵpœtX‚b SŒ7#AÒ뫵dŒ¡®ô~EM]V)ýwàÌž<­O¯;p§ŒéñŒTšœ™+¹ááÐnš ›qQï´Ik bbö|?¨ÞI_ûIßc! 'Ïn½^W`1Ç4˜R¡¢X°×ÕI¯ï1R&™žš_N@À¯m7´Þ`ê>:4òsž‘Ô7‚F2P8¦ÓD_UGr•±F»MEÜn÷<ßCÃIkèsÇZßýqC  ªMŽ­¼Û Ôvä0 Ywº½r÷µ†¥ßßúÜo}ãùvÿ¥Î/}ì¥môØL(:Ÿ?~ñ]˜-$Ç~ã÷×!A¶x;Àlù}ì”NÅ%åÑ=èmp¬ê•©›»Éíú5yb?cÓÀÜrtÀq·RH`@?FBD9XL= 烮ê¶C*U=}éº{í» ãÞ9ör•|N²”kЉ{qÜ7È{C°žø¯ÛFxtý//ÄO}v盯îAN1åˆÚÆl;3[zeƒPgN†ÃYS­ æši4¢[F•ˆÌºK‚0« úД!²˜Ýƒµ$ØéÎ ±¤øka@”¨ÛItÅS"lµõÌ)dî7–÷|ò ‹ŽcÐQk{aìÜ\¹×6yßýY©'Ÿó…‰ÆAàç¬ü®ïkŠ{½žEH.!V#ä–ÞYos¢|¿6ëݶÁ,7µÙ}°"ãàî¶×A×þØï˜fY;Tgn&‘¨%Å­îQ• âN¸yLŽÂ‰ôÃeP´¬@=ó‰Š-2L ”&«*] ëK«^Am£@yŠb#¦O¨r2}®ÿÍ—DÎ]~½å ‘ •+QnªX@Ó˜cFc„›6ç÷Eû˶å‡LD,mñí”,`=b–g;u±J•«L¨øÕ‘’“ÈšÝ6 7{‘Aíç(I#‰:}dçûÏw…Éxµ#•¥K Y2ùbJ÷q+2¶Ë5Òí¿¼ñ?þrîùýäÍîo}X]ï¡ÏZ˜uòÚ#'nœ×'(9ý+ÿeO ¸èO›/™Œ?±[¶1Û«÷YâHÄÊâMþe’<°qÍÞö$T¶m dì”Ed¦V'eBRéZÉd¨¾„]Ý4Pº³ô#ÆŸZ¹—êm”‡J›šJI%ÝÄ‹w»ÍUòÅîAT{øáë¼rðäç¯ýÅÕŽqxO—KB¢ !ÕÕÒ!¹™?ËP™þPˆM*J Cîù·[1DDNþô­ÇÈ+2fåB»rfT¶×OÍSs @¯¾ÕÌærŠY q¦¼w¤+·¨wþ2ÈýÆAˆ}F­q#±¨ûw`dòÄL!ÐãcÊ~w» JÅíVlD 3K7Òa8sËÎ_]A`AU96sñ½$ÀT¼=&£Õñ€âD™$1ì ’Òø‘«Ë1y£»-­æ0“Œ§`Ç¿ë–ÆCú6{j!ƒ•©3e¯<\$Û6ôw´oÚ͸ϡöÁˆ1˜'Žl}óµ®RP;\¿ØÓbáyx(‹<•°Ø*Ãõ‘,¿°û»??ü»rùíQïƒÑ1ëäå/wDøî_6[™·Œ?Á^vs Î#檺Ùãñªà54³:ªÞÇêɧë:õ§,wà” ‰ÂÄ™dÝ$ríd)Å ¨KÃyˆL‡´&¿|×õ Þ'ÿv#"÷D(/W-ä\P4˜nœôŒëÍrn!/tÛÅOÝöôWš93ú+·=ÿØ\ü©;…L‹Î,Íœ¡¨mÎl–:c‡]Šíƒ?£³¡g¶y°.#¦, j쉇N#K¤{ýÝ«å»ONݵµ-©òÉÙt×(¦»×Ôã§óךàër5HÌ âP°³]˜ &Æû­õ¤õ&êxóÙwî99¾¿çç=O¢‰ÈWÌHNPØZnØ­÷E”¯@‘²W{ãÉ{—w{ –«ªÙì´ ‚Iu¶h—¶è°®V×.(äp$®V8 óq¢øÃù—FGíÙ`u¶Ø2"ó'o¸’ô‡}¦û2ÌV´ŽÿïJHr»Çô?TgM…^0:¢mѶuµUÔýF·Ã ”"N‰b$­ýÓ·\û›kA¿|bäõ d+Û|‰ýñr™A$6À°ñㆨ)}~QÔ·&ÃìÞ,ý5Eì›A„À‰ ²«ÑL$Ô†ç†U­VÖöÓê Ц}ÐañBBHâ„=îVn¾ö÷û‚ÀÁð}éªÑ©ù9ó`j>p˜+n%{½¾ÿÿúן¨~e%¹ö¿ý!óž V ˆÑÑkwÍ.zåR¢ÝøV.bd±õ+2¦Ò³Ôi×^ö´5÷äöö”ñ[„„ÞòvCŸ(¼)îH“Gû4S’°•¹ò Rï/¸8Rë6r]=<Ѿ °Ž„„á©êß <Ö~¹ï¤ÕJÈ +yß5ŠI¯Ÿô{aoÛxEXWTðýèøÃ'øß°Ð›þ­Ùï}c%q³<+5´#o!ƒÈI·Â¥ô—V2  â†Ùf…85 A;´û·£6ñÔŽFJß÷ˆ'lÈô6–6·%¿pïãׇ†N•Ø®rDÀô;Qa<¤¨Ñj¶!ÁÜlAcŠ$!¡ÉêÖ ¿Z ‡†;{õv/R ‰Ñ±1¡oêO_¼o¦²ßôB?@Ò`"¥1MŸFS_ikŒûÌà!!)Ã(HÞh÷ý«NV*z»Ýí²²,rk+_w9@ŠÓÆÍMäDÇ’µ‚’…åe°6ÆÄ®>9²®÷KíÆh0QWœ†IºaßáÖ3%йº°BNÇ€àÌœ (¤€0Y_ŠóuÚ±—€Ö » {‚ümsïþÅV€†HÕÎ_½î‘Ø€:5ÈÔP%LÐ0p' µp”S€CG¯¬$ŒnÔ-8#’fnûé>/±>pŒ‚”?‹^eäܰªŒlüÆ{’V½âµaFÃç†ßÿòM£879_¾f4¦rŸtAšr(ÒUª$¥ÚWpûû¹Ÿ›ü³KfýþÙãÞ{=D¨(òê/hlñÅ'B£¶ñô]¦Ùªœ »!Ó.Xl„©›Òì6ûÚð&&¾®»^¸B–Œ ƒL?±´n¢hçãÌ.&ÐÁŸÓ¹ÂÀXHùÊõ¦êñ>)DoøÁµ×åäÝϬöMʃQ…j9o+búQ±ßØMt.hï¾W{8ü?_R:ºó·ô_<³¡²²l·jp’ñ-,ÂTê0Ar2Õ1¢‹;5dT™NÃŒ‚LúH€ûCVQ’öþÒÕõF7œš¨´_{ùäGÆÅ¦@†ŠGI£Ýíí³~®xʆO¥™¹£›¤M^05ÕØ=èõ"$ÊuzöÖ¾süÞÑö^ËOB%@¾“ Êâµ|è¶:Æ3ÆÈˆ&‡£ó7ZmñÊUÚku;l%‡YîÍr$f·}? ãqÏþáIÉá«‹‰íGâ~ïÔ»HÔéùõ1œ¼¡úƒ–ˉêÝÚŸìTľtv¦Ä•]–†áÐÑcãy*MT@…£ùù¸Hñn?ã‘B0q?ÁµW¾wèÇßÚ „IÔð­ø£u­$Õ/J±ŠÁd~XP@p!ÁÐôU§œê¿×"©è%œ{":"#&[üX?¤²UÀ¹ÂÎêd0W?;ÆáPQ[&S²¿O^ÔìD14‘¸K^×n-½ú­ùDAub²yqTJ×Ã4ÊWPˆS ‚˜4ÌÂáü¤ýW»¿ö[ý¦Ùûo¿ò¨~«¯„½èüѵê¹JâýâÆeæܩƢ0Kò €é¢¾P¦æx£p€gZWUùÖ¯t=6 ÖWÄè„óÀéó‘Å7:–¦q€’q-Ü—I,(¨î;Õ»nçoÆ)EãÓòŸè¿ÒL¬œ€‚B­˜³7´IâN‚¼ÛfÁ0Üî Æ‘™¹Ö¿‘Cþø¶¾úêK†˜6A»°ÆtN•ÉO  .måÀ6Zå°B8…W¡Û€dË"J@ŸºíÉ™Hoyy~5ò†¦‡TóZ«¢nî=x‹¶Ý?/ЦÛi'ŒA"ùb˜óRGØ*;è [%^µ5wšq?Ì%q,9æk[çnÚo'QI!¨l¢‹8Tllou >ƒ@"*Ip¸ݸ±LjùJ1>è´û@œšØüÎžŽŠÈé=3Ëଊ€‡\ÓŽ¶là=îì#ˆ· {ˆGD¹+âÐ÷ã¶«öÒGÑM=ÀäF·ˆ ù±éÙ†&òö¬ê®®CÚ­~ ¨”GI' )ª‰[rßùvW±3Ñkë>f¶+Ñ#y­Ô4 ¢q¤40ÖÔ÷Æ^Z‹H%¹ÑÍ BtIR •|Ñ*YŠAÖÿX÷”_=5¢óã5eAQ£P·Óé±§4 pdÅ0qºðú߯ Ç"CS£û6H»*Ù‚ìBÕ ¶Åh™( úßïüÓê¿Ö[ÿë/>¤ÞŠüØ3÷_}T_Î*Iù×þÓjlÃïœOÃØ Ñè¬rô@¸³Fx@H§/¨ûâ×í8$õͦ]ÈdÂN#ƒ E7èµm;*ý”eOZÕº§HaîþöËáÄÝço$JìBš´Ÿ)øVX ¦ìm)­ƒr°ÓUÞðÙó8Ÿÿ“Ÿ¾ù2.#Щú$Ý{H†œ‘L×jÿmÎêWÉJ|›lµLîê"LEÕ‚¥nhâÌç*b Žk+ ËMÌMêþü…•R±püº²ˆ†$öPZ…_“ˆ D&îvÃGXòœúɉÁ®õ÷wë‰1Úï©„9n½Ñ¸e"h›ØDèl+˜Ãf[ȇ$  h¬T.Ï×û†)¬UâýfÜM#.²­Ð@i-€ä^€Í-ÙÖÎ~³†•ƒx"‰ì4ÆÖ×Ïä:ÉÚ‰ €Ù\w`&Ií-éæPÒÀA7Þ:D”ÀâøÌ©Šçç¬ô¬umÛ„µZBJ“Äý$ uP»]ýíó±0Xœ<µùêv¾&@)U%Ë3 &ŠXÄKHõ.ÕX†õ¼(É XR榾ÆTá:X0»†»¨0t|", Õ|KßLûŠL·%äk…b’ÁHõ\î™.‹BÄÚäèÎ…]¥Ò†,|ùLk84¼ÏÖ‘ À?ßøí_Ͻ­ýMpor¾£ceHï^8·úŠw*Hæ¾øGu§~sg¬fgÈJ»ôïƒuÕ5íXi{ãcß$yøæršÍÊx[u(æ]…2 )ŠGM7¾éŒõÉsp±¸WÜꇞ"îø?î‡Ïï AC“ À†;M¿··«5iEÑ^‚µŽ]øo 9*üê=ï~õB7¤e©¶Ù@š|EÎ¥NˆôûL•þ”Ï] À¡šÚÍ·…Émý………Ks<4- œìï.Þ¼ÞâprT÷6vEùº2”¯ÝzT÷sï`o¯››ž¨•ØÓd«eÓ=hì4û &Qéˆßj•'jrŸ\³ïW´1Áähsg§ DíÉàÍ•{OŒ´Å ¢h¹ŸkïÎoÅ,$È^­Üxoé Ða­Ô9èô¢go£ÿÈmÜSëdŠ$Hûž4 .ÓeªŸT%h èé—péžÑeX»ïrß+—©€) ¸~SsIê-ÄL}ˆ‚ •±ÓGk*,MöÉß»¹AÔÛ=@ÒÊ$I£ö|oöÖöß½ùÌ䕎L/¼ÛöSG'€ h¸:–3€ù!mzˆ €1.pÅ[_0ÝîèLrCà<ŒH†²|†?Jƒ:»ìGE^eèÔ”—®ˆÀI« ÷:}&/Pbbâ©ÓòÌ?îø•cùÕËûj0#ËB*œC”3P Ȫ®2C@H’·ÿßûåâÓ­Õ/ýüýøvŸ÷ à<ž\½àT|ϧ¿y ±ûçØÍ­·1»ó,øjúD²PZ 7€Ðc8“¼«Ê'¿ÒU®Iqð¶va'2f·¹Ìb)[Æ&$”ûdis©ØÒ›AÈ¿¯ûœ.?:!²¾”°8;[´ ¥‰Z†·ë€ÊÓAxP§ñͽûW›9û•[žýûù¹_$Kh²o–›F“º¸»tôñR€žÅñAŠ4H 2VÁøÞâ 3tvWV®¯÷ýÜÐH²±×CòüBi(7uÛIÜtX1ï\=€;W[g nc‘tš›6‘¡Ðä½ÞúØdoërex4PD€èí½“LÎeŒªV¦÷6‘*öHzzgŠ}Êt6¨íjld~ÏPOñGjï,$ ʯV›V7·¥Aл%0¹ôDǸerƒðŒ€éþáÅ_2G¿”sÔ ÖäÔ’(®ÔÇ¡5ã¡Hð¬MïgäÁÕ3V¿V9väL‘s#CÄí_ÚöBhôòš~?-^!7snÿ¿¾çyˆÃG®¿Ã˜µ.€ÅJRÊ×D°?(f4ŠâNÕÅ:À0.keÒñ§(gL·n%0`›Û©¡ˆ Ÿ«Mͪ\µ¸hðVCü¤ÛéDžïkÀ~£ŸàØYþѳ;€¢ÔÈTuþâ¥$-—ŽD¬Œ#ÓÚ§ÊôÁtÍÅó;?ã}·½ò¥ß¹¿ÿ6’ ÉuonþBeBè§V_â8Û¾¤œ7FF' ¶_Mò@qo7ϪEDL•×#<oHjK>¯mØ9eª©CÉö¢à"ÕRç=®'ï–ó…í´<@¤Ñ“ooz÷æžÛOÒ¶‚ЯÞ5b9÷9Þm*¥Àósj·3ñÄÌß; äì¯}ëÛ+1û8S—eÊ*ÿ3­f-+&ÔZmq¶Ör%¿¸öA"•På¾ÇîˉI ×\ž¿±ÖQù‘‚>x¿›øD^®X¬Žž®F$ÃZz½ 8á-/ÕGŽL€•'q½Ó,)ß|Ф¡ÏAx¦ßNb%  7wäú³ß:qWY±Á|n²¾°í‡=/‰‰ôÁ.êÃq9b’„ *Œ#Õ½k~GŒ” [ï­tc0*¨[õn·€Ä6ÔCè'Ù Êð–Ül¹v®M‡¹Â0$®nv× ÇýFy¯5dh§‘Û£Sü„È]iYœVbHi'Bƒ †¡™3“%íUÀí_«çrqó + }ÐÄQÂè{䟙»ö·W !U=1ôî%ðLfÿF=¢°P©iAÚÚ> 0j`Á~OÖº ˆþÈvCaDâ´òwå½8X‹‹ØrZ!WÏ*3s œÿ·ÓÅíN×(ícÌI¢P¦NÇOÿhG˜|õDpõJSá¡NcP Ìë™W¬Xwò ÀÍÿð{Ÿ7?joÿùo4V_V}Øñ4 Á]á·Á{råÍÈ8ëŽ"*}ìØHÜo´XiÕ§®=ývGÌ­¿…ýý-ãê/'oC©Œ¨zR‘ØY{Ê/8œ˜bÓÒ0(Ap¡éµG@(DhôÎ|òÁ!01&Íë›Ë×Ê›¬z;×ãØ‡P¡ +yú–À0#awa~Ïž™9ÇyÅ+H0¼0$$"DÈad¨Pˆ“D#‹Dï¶So½xíÛ·=pÆçix¨½¶”z©\Ù4‹> v˜lDb6ä” $0:¼ûv?`ª–Öß[mÇ‚ކ½½N·ïd1ÙßYyQTú$ÛäV²@ûþÊä±óÔÔ4¨èY¥‹>Iz­êúö81@²;´#8—M\É%è»h P…³ C>4uë1O‡ÃUmKë‹[¾Ÿ4‰‘l¢($QåÓ'/ü— b46—ýšr%®›—«\ £• 4: €°$lü)i0п‚b· ˆ@˜%ß¡$9 ?„ÉŠ[À ),ÏæÃ¡á)Ó>H¢¤ïPŠvfE‹í¯aÈM–9“ß"–?Šo÷¢¸ßõ HÞycÉ»ëÈßìÚY!’ÊöQJ¬á"ÎFÄš=PÊîËùf!N>ô?ìý××vÂÇ&þÁ £t„cn«ää­Ô{nyò®ÔE‹Ä¶,`·³¿r³ 7«7zä±ÝFÌ(Ýõµå«kƯËææ>{¨•Bä #•ácG0±7sgmq|óÞÂ#Sy‘¸»·Úð§fKE2€Äq?1Üï¢ðE—Çó #2#Šaõð=o¿øþ›Ã½§`ú‚…³G·¶ (Ìkˆá 0S@›>$Ýv>Tˆ``ô‰¥ËÑxaåüZ«/ Šåð ÝêõãHC=IkùtÏË 2#—³Ä åJ‰ŒZ1•£E‰a›À¬.oc$E„Æ(£L8:ŸóÁÝhx)¸Ä¶Ær!A]B+ bK­:Âjö)ž8QðF†Bm±³V¬¸yÐ7àûJqÜíjŸ“sß}©®I¤0u¬yi!öÁâ91k)²Ônˆ,dĨ̇ÍáÈUQ «ÿæùœ÷öÒý_ž|n1A’„TÿÅÃÕ‘³ˆ§~á/êÐ@4œÖåÂdìôÏÙ\ïöööHruRÄàŸ¼TŠÞäÌŒ)Íédày™Q˜èP}€då¶¡³8#ñîo/äÔ†R:ïÖòŸ€<¾ûlß *‚ðg~JYˆh¯wö|D/ÙøãÑNô…O\ýë7Ûø cÚœµ¤0‹#JÿßNœ3Å) `$lÔâ.E±í¬b÷O Cxç‡.³ŠZ+ëo®ô1?œïî-ô?P¤”¦ X.†ÏXÏ¥Š7——ûDc÷M@„ ³zMFO…:R¨ïu;Ýf³×1ꉊŒxâÖ‘$$àH=xû…7¿ò=:GmÈÍ9hŠÖJeL$Jzè%¬¨y¡FŸÞÞ¸ym½TsõV§—`¦l‚rF¾§ ?@V.êr0‘Ϻ~þÀÄÏ `0¥‡‚A܃›Oî"óv±Þ)c}ÍdCj„lN£u’º«5n"Lg‹ÞøÉ³ãÚ+ —¬¤,¾¹Ä>ö[½T¹˜ˆ1‚ANŸ+~ëÛQc8}ÛîK»ÚÜÀ ¦p&_2€É 6y@ öD·®Î jWÈÚüÁE{Hó DTšÿë4ó(ätéG„ Õfk¹Jµ¤€t›±–f3Mž‡˜´»¤YŽŸ¨ó•&pab¦qeÁ(»„VF]ôYaš‚½ÒÑuJñMŸw§«lüïÿòêkÍ¥/ý³G:«˜  «ö+OE/WŽõàÊ·!våzö&HÈ]™à=ëÜ2;‘'ÀÞÔÔPßµ:ŸéÔÝ!KÏH­qéT4¢¥>àÌq,®íFú \‰(‚¦Ž‰¨rǵ÷ü·ü`ϲ@‘ó¿ò)mÜ)bú»-RH:$¿\¼ñ§Û#¡úäoþù§°×1 Lÿî×Ó’q¤mOB”ì†_Nÿ’õгm®+ðÈúô”åd²šyìñ)Ÿ »»xíR+ Çk½½åvŸT µ"…ž.WGªÓG ˆ,²»¶~Àªplº¦0Þï— ³£‘QÊt·[¹©j{{¹ÝHlÛs"xáâÑ[åm˜:;Z`a1Á§ÞwýùWùpÕ;XÎU«“$ ¤)«ŸAÀƒ¨é•òqDŠYçI@$˜-,­µ ÉWÂÖA¿Í)y?5–ØïÌ&~2ÚÝ¿| ã9EbQˆöÅ%ç1u´ ’¬Ã2I¿W^–™ €j)†z¯Rº’³ú쌭—š³ŸËM5ƒ‰c§«ä•ky{çõo®D¡t:± )…6O’7t}홞6H”;zvùÕ†VÆ^ØÖªŽ¨Æ3RÍ1ÂÒ†’”…z°¹>R@Žn´ÝiŸ 2=’»Ž œ»,ÅZXACµã* íûÏÝFLØnF@äiéFZ˜fŽoïåŽPåé#õË«&ÍYî€{N™^qéŽSk:8ý†dßíþÁo~´ÿÖå/ýÚ£?Ú#å%" wÏßró•VYýÔüÛaÏÑÒIxškRsFOðº¿ë­!"`xŠ.Âð‰otõ¡ÉŸõ¹´´±ß|Ê€C’‘A;`Õäèß2×¹ öÃ%$4$Ç'ÿÒàGš/õ%ˆ„$¹Ÿÿ¤f×Kr·×DJH ¥·þf·äO=9úô7ntñ!Ê<¦ ÉD1¢›- Í %u¸I7aeß<àPØ¡(ûbˆ0ïøè©Q0q}ëý«;*WuëÆåH)R 5åscãs“Å‚"ïÝ܈J#ãã„öÊ|[;YÌq{w½±¿sáÜG¹z¡3ƒf1 táê©™þÛïŒÎE1Õ‡N_¾¹òì;ß=î/•†O ,CŸžþþ V¥*6Z݈³¹=~ zÀsh³C³w6„ÊLü’ZTMƒY¹ž5Å÷‹Ä,ªq0C‚ØéŒìåPî8É3= ˆIµÙ.gJ#§f§É«Ž DÍå¦íVH)dÑhÏ Çú*3bùÔ̵×:¥YÂv­,”ÆâLaP’«-Í Ô>&¢ãØWô¶Ûª‰©ªCŒÈö3@Bø E\Qº¸”Á’žýRùÄ –F*> p?Fìµ"¥4š$ê ™ÛùÆÛ‚åÉ©ÝË«÷åœyŽÊcÃâŸ}6ç’ŒJî™’z(ÀàÚŸüæ§Ô×{ÿþ‹ù~Ó' Æ¿ž;yõå'B®ýÂöªgcÜ6PÓ_g¿»ÚÝ‹ºµº‡œ¼ÒÆáÛ68=sѸʄRÓ2¹ì/9ÜdéÙ˜ÝÖÖÁ“ÁbÝïé‚"¯|ïþ+4y×[7#E„D…_þ¤gÜÃÁ­vb<…HÀP+ï}ó /·|2øþW×â¨ÏYbËàDvp±|a>H™6î·ÈÞƒçÛÒÒ)ü#€0âÏÝÿáÙ a1ÝÝù«óu)Ž—[[ž(B$­@‘*?3–C0 Ô]XìŽ  ‚Ý¥+ñèÑŠÚÛ¯JÉ¥wÖH¢…×îúħ.Ÿ_?"ˆ%&Zzo]9w|sþÚëçNkayøøÍù­^øôÔD±×•鍊©ZY%ãN³›/䣾Jêý¢È‰÷ÈmϽZ/P£EqŠÚ„lzšÝ%Y  ñ¦°2}§ Kæ²vX¥Æ$êqéH®‹À«CÀcžGˆ.KóÐGìu§%sm rqbúlYû¥áÐv™­›»:̓®DRcF§Î6¿ü–Q äUŽž~ûµžŸ½›¹¹æI­TÖŒ¸Ý ŽŒ>$¤"ÆJÙ´L¯èÉðV[a þJ©m)ÿ3HÁ!Ž1»µ pXª™ÄÊpÉ#DAî4{º6 *¥0î'€sÇÖ¿ûf—„¤<6³ùþF*ðƒ û>pÛH–.© ÁR*•á’Kòr¼ ?ü|´ýLû5ÿó½ºèƆß½V}ˆÌ±Ïþå'f #Jét®fWªõ^´:J3øÃGž¦þC+7 ]¼ÈaíÆ`dÄÀöÈÄKðÆ`^èŽbЧî3ƒ–¿iEÊ›;ö–~žk:›ý“Ï‚avó'±Ö€€˜;Rl¼Ö@sçg‚øúª]R‘K'Fƒiëê¤[6“ípËšI|1Í=,gB@VQYH—(1B•3»sˆÑHï`åúµ­n0\ÆÆü~B *BBò«£·Ÿ®q?VˆÂ+Ûñ‘Òp¢ùÉÈHUõº;‹»ê¾[žœxærÓÃdû™wþø©×ÞÛOH!!Ò€˜çwnÞ3±´õ“k'LJ§BašY\ÛÿöÝwr‘£œ/Ãè @~b£Çí(Á¸îçòŠ9Îöñ7_^î÷ûƆ¹Rj¥o6»´#¥`Fî{A8±¸³£9E™I<œ8–S­´ˆ@Ü«†K·Œ.¡¨Åc›=¸Ôµ?/¹6#³f=´%žÙƒ— SçNÖ8¨Õ<{ĵ–Të{ ú$N#Œ^>òøü—¯(e¼á3#O_–ÀMÿ9-v %Ìj(?Ð’ô­ˆÁö†©mÈxjL­ ‰%Iúy¤Sw –p´HJUNøjÛ_¿\?¢òCÕÐvfq«ãA¿Þ4¾R¤Pâ„ÃÜÑͼ!°ªNÖ®ï¦ñtF–?â ÙàB*{ßš#Y¾•Í!†íÿø?}&y6zÉû\ôR7&/fyõÃGß8òÐÂ"wû§ÂïìÞDÒ9Xòös×Qc‚x¬û>UoùfOgƒyº ±í•Ý&"]J¤fZÎ*&o1x<·¾ƒ]G¡R*wwûE*?vårÄ@ÄÕßx ›Ä®ð +¥Ê+n¶V¢äñÏúßÿö `ÊL°ö£ô¸2”n¸4Ó!Ú/¤˜ßô‘K%º0ºbúé»ù*ñ‡~ü,¡Á~{÷æå¥=¿0F«Û‰"ŸI42⟻mVï_ëNŒ(‘¨OTó"Õ_¹Ö˜ž.ÄÝÖúêv«Ý~aú#O¼øƒëÍÀ7{ßxñ£OÝþÂ¥6 `ºñôÜÝÇ®¬ŒÎ® ëÙÊd³Õ^}cYÆ‚"b)±0¾ÕnÓ/罘dsÏQF’âSg¾ü^œ(1™cgð̓}~p àNMïéGãB‘E$©‰Ãc¤r•Á¿ ¢æWpb È̼ժ–Žl‘M¹t«óÚÐ8«8Àlé¥òGçN•%7RÑöë8XÜñt¯Õ‰„ !ŽâXs~éÔìµ/-k`oø¶òËɳͱ¸*PUjTÎÀÕ/Â8f!JDWG6†Œ ?²Ó I AǾwDòlí—îýmÙNnEÌ¢t±<~:ðGÊ¡&¡x¿­U§ÙB­tÒúI ÉÉc›ß}»ÆóKcµý;‚lG Ø©¢z–ôÍd5ög"÷*²5®¹é|â”Ø‹ÿá_ÿlãõîó#tÞPŒ ¤ýÞ}õ—*Uö>sõë$Ë6FĵL¢ä–b²MýJÃS~ìû§÷ñ¼ii/l±ƒ–„DÞFÙ>½©ð6%§ "gB ñ‡øvq·x ÒÄÙoy„/t h…ÿñ16¸«= =V‰BTÌ¥“þÅ8Üæÿbôƒï¬&Ú~3Î~’6Fbekn\ÂhOâtŒƒÊNQìÑžZ·]è§;â,î‡QÙ! CpôgîJ€¡³¿råæº„s¹~ûzW”‡Ê}ŠôÐñ»Oå; ÷¸ˆ°ÈUý¨ÁÅ@`ëÎô™¢Ôwnlï·ã¤Ç—ÞÿÖÏø¶7¿»ÐAÍkõôOaþÙ¥ŽJP±ÔƒÅ…3÷4®lŒ´ÖNO*#å|ÓFZÓÀÌ,*=£s;{Êëoy£µdóf«uáÖ{G‘xú÷^þʲA¦¸ÉtÚ(ƒÔʉ™r² Š:/­DElÜúÀáϹ D¦ïmõ'Q·%0ÌGÏ{‰Ç‚È’šŸÓ‘,¢›?º dáȹc%/®Ú}—ª/ìä¤×ìõ…˜ØòH•ïõ+Û>3R8~wÿ»k ‘AHŒM¨E.VDW* K±R½NlÀD!Á«gBÓËy+6¶1¥# 3YE8ÚGˆ«1eÅ&8¥$`¾8y¶ &†óžˆ÷š^Ðj6òH)‘8¢@¢écõï¼Õ$D*ÎT6nl¨ÓÊ-•d,2we4FW ¸ï„ESƵbCóÿîÿþËÉëÝo–h_ìCô<æÅàö+/?‘ãáŸÿ£mm8[âK¦&cï)ZŽ„:>ie†g¿NæÞ…ËÊq!¬íósðð œ £³ MêÔ££»7ýV8¯´NTx‡ÿC¢Çn¾³"ªþÎc,´Ñ.ùöNÚÀôtøÚæí«­~~ëG6ŒÎº0J íY’LÖ6)Ñ|Ê _g ÉT,Ì Ó"”€8Æ¡GŸ¸$AÓ\¹~q¹ç åê×ë}­4 ¢ È¹ó®ZóæÍVCU8bC-´2ÍwöÓÐ~géÄ=^wmciû ß3I?N šëÿæKÿô±{žÿÎZ×yãOø3¿¸øòBÛ I„Y&xÿò­--F¡h~vV8ÐQ Ĭ2{ƒ’Š éÍÕ:=ᘚQÔÖ[pmõ¡SÚH„ÝõýoÕD»ìDwçS6$IÇqœ¢ÁY^H2,Fê´/?KñcØŽƒ1îÇÁîÖÉ|7«[Çe½;ð(2€±”@LCÚ3° –ŽÞ:(¸ìP;×9ˆ[-#¨HâØ$LÊËUnýá×: E°8}÷Æ‹›!³ó1¥ÁÅ‚µ‚7…—±‰­–àè]o¯ªGgþ°‘ !AíwKPVö«‘…[²A6¨Tç’6FãöÏÜsñïºõ8‹’O_™}˜€]ŽŒvI·A5éžS— “[KºA {fEjúìë!jî.\\ÝÜŒJ¶v{ˆy$?¬gï;5j²Ôðü ôÐQÔY_X»k˜¢›óÞcåÞÖÒêÎfq”D&åÉâÿçö/~üÞ?³!D°ôŸnùü/¿¼ ‚64`¡Ðœ¿yÏC7VÚùœ@÷"?Kñfà €-¶E 8¹ÖÖaع¹ÕƼ¦ª¬nÌÓ,Qþgøû: µ˜,Ø/íR]ÚZŒ’“¿¡¢©ÚÙ¡­uûD§ŒMTbThã\©+HKÇ÷œ z˜q èmP@ö†ŽýüPÕ[«ý"të=DTÀœ˜„Q+ø^ï«Ïô4'¢ŠGÏ,=×öº¼Þ½4LÅÉrÌ…$ä¶ X0Çâ»ý ˜\q“P,¸‘Å"¹Ð±ÒdÀåqyGB!D‡†ÎÖT¥Vô4¢i¶´ê×[Fy¾”„08¾óÍóm"ñ+3¹ù…:Ñ`åÜUœæWf»—t-íLÙ.Þµ ƒ“] ¦ÐúøW?׺±ó7¿þ¡þMÔÔõ$¢‹c'^©ž~êÒ›~œ¸ÃD™TL||¼»íuóûJ)åóMuV¿’%¦ˆÿl·fÛe·V$䌙a^S|¬-“Ád¼uƒá:"í-þÈSO®¾1’’ñÿén¾º[îçÈ=”ºÄxd²õr=_ñ(¿üͽ‘î@tü"$Í“É8§¢àjTàjÐfáX;¡uá  |ìÞ0w[kW—V:jh4@¹0-Á‰3wñ×_˜_èÊHµ ·66áã>n¿×=2¥wW6wÚ1›$2 3‚a4o½ç/ýÌCÏ?»åTòîõ{?õ+コ †Sm<‹ßyáșۗ¦32F¢ Ƥ[ŽŒ@Bžv¿²¾2è÷—6‚òØQMÉÞÂùÛ©Äàäï>ú7×YÅV’—ùxÒè¡AyggËS0˜;(…!`û²à@“îV÷ ÀI/À¥ûË[À°úÐN7_î éØIQå0ŒÐPªâÖÕ™¹ñBWìm.w}ÕªGƈœˆI„ Èßmþî™D1€.ϹöZÇÇlFYéÒHAåjÅ€·ö%±pÜ/kˆY'——ÍÁ$j½Ö¶\ÌCñö•W)‹Ï=é’ɦR x^¹rlH×ÆÊž Šë}ÏUÔ‹Åg™8¾ýÝ÷» èUÇiy¡ŽJÀÊ”œ© ;À‰InˆSpzê¤? 2"‹(UïýÁ¿øå?[^ýêo<ÒÚcô‘™Í ýdx”ƒ_X]Ñ£}èÃêVuè˜f‹rIuâ[”ܹ3O),a ¨M×G˜’ (eÊãf,DŒI î3€”X¼ gf¾YQ™ýÍ»™q©á5½P!‚@°{ÁØÔî[;¹Üè4<û;ÃEàÊWÉá¶Ù3, SÛÖî“Yç\£•²Ñrè€P%,jâþÒ"IgwíÆÕM)Oçyi?"!eçå“·ž(×/¿Ùfò}¡ Bgqy¯=}Çh¯-Nû­Í«v/Ib“$lõ>b5$¯¾ÿäç¾øÀ3/í£ÒÝ.|èc§Þ¥¡Ù +&†W7gޝnz5Ó U*QO½aÆ$äµÊÎ6US½ƒåùížêEqí¶øæ^ÒZœ}hJb¤{Nüè{Û@` ‘tøž%”§tH‡b’­èÅBCíÌÓ5¤MZ•t_%¬’ôš:zºsPTëžÁ´A²Z BQ.XüѹEÊ-û"Yß臺[’„•eŒac(„ðÈm­¿zÇ(AÖ•S3ï½y,Î¦äœ B‚^Í ¦«5ä=Jº‰ÓMŒxÌ[Ü1±O5h’…I¦ŸâT~`RÉ”»Dh•u· yÅòÌ1(<…(´ëDûVZ!BœÄ¬ŒŸÜýÎù6kñ*ÁúrÝY™~"l³ÙÓÀçFë,é©=ÔY² ›°ÍÂyýÏû‹±yõ[_xðù6{+Ýwîœî3y3ý3Ú/ ”}ƒéÒ3w—,©†¿+ˆª9:þéz:ÕÒˆKJ³/RJnäìN!{Ð.o.ÍæDïÎÓñšÚñV¢¼(¥Ïüa'xjÿõÈø$Gþù}⎤ Sâƒ&ú&?=¶ðõØ„úÑ×Wò¹^lÈHzþfbÕLæ> ‚ÚÍ.\ŒYf‰Å7(g‹LƒA Ѳ™ÜìýOÍ šdáÚâF G*ê`¾‰GZ(fd,LÝ}t²³xãÒ>LT±vâÎI߀lÍï7Ím÷|pmÿh-^¿ys»õ™£>3 €€qûòÚßüÉc¿ðÏîzö|µ4¾ýÖÇ<ñÆ¥®Ÿ(1‰r¶ëÀ\Ûºûö(iMÄèÙX[¥G‰$&‰:ùœ‡ivWì..7{ZÑÒ^eRßèK‹wß[dæÒîÿê[[ñ ’:ÀÑæ]êË`ß“rqÓ¨A; ΫéõÄŽ]+È"ÇÝÜÞÁ‰§Aa{ÏÛ™¦‰wmà&¢ã ³vYÍÂô؉ÓcʯŒæ€‘ú[ˉOíFG=BÅœ$,aáØ­ë_=OŠü¡³ã¯]Œ=0FR:ù:ÖJX)å`k ¸ßMŒ'1(5:²x¥§ºž®tèß)•ØØûSg‚£Ÿ[[Ž[ " z…òô‰œ©ù Ðtë±­fBÖ¦“—àÔÑýï¿ÓbI¼Ê„¿¾¼ÏÊmUÄ‘P2€r°K¢¬ªk«4É)ㆽXùå/üõ?Õ{¥—h#öÖFæÎ¿þ!”‡.¿ÙÚÆæ¹ËðÄt´j:´ Ê×qùôú6žÉ¿žJ;€Sf|@ØoB>f”%@ô“ùëk"Áž4Jß³÷†:rÛk F#Îüî |¥Ûßæ vJ((’`ÔÍͯ¾brêØ©ð½¿Û ¼w` °­Y‚GªàÒ&ý*µ¤ª)øÊà'i2š›ï¢ æ DF)œúÔÝ1Ü߸±~y'f‚x¹£x mÁe”_;{ç^ÿþûõ ĺvæì-#dŒ &«ßZÇ›—*·¨õÕµ•F/‰%‰ãÄÁX8Uĉ†Ý¯¿ô³?}Ç«?¼ÚÓš×ÿü¹_ø©³ïÌw  EF@TÙ¼sä‘ñ¨^BË"AIå“Z w¢‚§Éé®uØÜè’Îå:[&º}ygéž3Ú0Îþ«wþ|U ªDÁþRV6Èô“Îö–X3­£Ó°sN¸}ÇýúHccB1@g±²xÂSÄÈ2ÊŠ ˆÅ@¥6;;~v4§Š#yÛn·Ö¶ ݽ0(ÈlŒa Ãü©¹¥?_PÈ(zâxíÅKd}<˜¢ë- “ù"˜•.%ýˆHC dDMšËu–®ô–!0Zo”_¥aºölpÀÿlž ÄÀ @¼ByòtAÔr– Úm°æz3ð”B' „Æg{ßy»ÍÞдZ_ÚGu؉î6-•³¤* Ìèý$6ŠX(‹µ”µ< |•|»øùÖ?,ýþ7ûç>öõoAæÒÿz߯ÝþÒ;{,Hlì*Wš=º³79%Digè¼}ˆX‘2IÌIÜÊÚõ¯g·_ëa)ßnt"V²½säÄèb\\ûÊ=÷”Ž‹¿úà—ߢ̀ˆ@é§30‰ Žù4úþÙzÐnÓH$]He¾/0Q’ Ÿi è½\½ŠžNÜåk´°CFbrv ªC¡M‡8XÜ¥Àt[‘!F"0ý®ôµï˜yéË %´wäÞƒ§×4EKí U€`—øŽø…£å!e®6TÒOÉpHô¤½NÈ8¡¶ûî´·4€$ëÁm‰dÀ‹sH¶à’|yèTYÊ£9"ýzOI§1(­ÄÄ1£@íxòÌkm&¤ê¨·º¼?ˆšOK×k/ƒÎâ¡¢úÊ_[A1PÚº"ˆg;7Œa¥›:ú©½—wÿâÿúØÎ¶ˆ'=OêÏÜxû mxëy2‘(ë Jqz&ÙöëACNo/Êé¡w/3Ô GÇbˆ!£ («+ æÌ+˜ŠÌQMÜç½¾wЈ|5ròí=zÔûI‹½Ñß;™ \nÇk­BkýHN)‘žŠÁ;ïyFßy²wYV›D¾ßMLv¾à!&ÉÀžžž8‚:+³Ø µ)=B\ô *ˆ½ñO6‡FÌò•KûR z ,Ê#…dëÝáÛžN6¿ñÆŽ1fî°êE‹7ác@Q[ÑÙÛ³~¥6+·÷»Ql ŠaAäćF¾,ü/ç~õ×ꛯnißD/¿õÑòÐ/Ô#ÍÄ ÊóË“SA ã~N °žÆmå±és’˜¤Ø!XþñîEït×’­lNîï€ÿÚËŸ>§8Óÿï§¿º&H"Ä<¸m²úbv¹—éGÎé¬\È7§3ÂlªJ6´“~³²Õ›}GƒÚì÷›9obS¢!£D±«rS³§«^®6êÛW®¹´©ƒ^£ !)2’Ä Raé®áüV[±ˆŸŸ¾só™Eš”w‡(Ä (¬U%gjµ¢o÷çŽ{FPw‰±:¶x3B ¿Ñì•ý>;7›EèÊH3©Û"M?EH}ôHáÿŸ­ÿ –-»î;ÁµÖÞǤϛæúç½÷¯| ŽðH€A‘”(J1jI1’zzfb&¦?ôÄÄDOLÄL7[!J”DÂU0S¾^¹ç½½Þß›>Û{͇}ÎÉ,Åðƒ°Þ}7󜽗ùÿÿriÏ´ÌŽä…@›-Ëi5Ò¶¨HqeOøË×6‰XÔFÅüü¦ÄAP6NçA®Ž‘g3'YIñ÷a<ÚæpІRÄ:aéøÛI,[8?ÿï¿ì½»ùWÿìùŸu|K“°è^}×­ñcÈ_ž»ç`Ä:žŸÅzƒs…Õ0”]Ûþºâ½+8ÐÐCìÁNý=—|¬HM†‰ÐFùÔXo;4oÙˆNY?ÄÜGî½ÀØ¿9 ºáû[ìÖ\5ëZÈ€ZYEùþM‡ó§vvÞnï\ …–Φ¯ax¼Ìt,Ò0L:ó™ÊøM=„ÆõŒÄ È(&|j$­­SŸx* ƒù‡—ïw¬ñŒÞšë¢#,¢ÒþSr›o½½Ð B0_=öØNן»ú¨ƒµ§§5kXºÑôŽE5·>auî>Zé{‘ÖùŠ5€Ö‰U) M;A®ÿOüÑ?{þG[`±ÿâ[Ÿüع×l°Ô $G·Õ²L…¼ˆï¥A"BvªßÊ ŽP+ý^/t%(´€µûtv¾Ùô-P±fÞ[ݳ{sSæ~qõ‰Z‡âÃ'¾þZ¤Nìd1}"ÚrЦJJ¾D¦—Ö<´}æX LaèCÕÍ­¶¦…&n5++c|ô‚˜êYjFÖ€ b=³ÈoÛ¹³&3ÕŠmþ›³mÛ Ä t)”‚œñƒ™ïþ¼/µ–”Û±ëÞ…®-PÇ[ùøÊBb@§N=Wý@£P}£ëf²zn‹‘­÷¹_!¾tÍ¢›4 \ <°D’Á;R84å+yi®åž/±×è1HKÚž#]Þ¿~}4Û¹:,¬6rŠÓOnôøãFLÙˆ±<ÒÌÑ;:]eÇESr8ˆ”^LŠtDóþ?þþÖ݇ßÿƒÇ_Q,$Û}ºòLáÒÈ6]þÿБ*Š×ŽñO³Îá²ê…M_€F{g骈ξßrШq'!&Ô{<6æ4Þ4r `ñãx‡ûAÐs˜Æ\›‘ÿ¨-¶ÿÛ#x·{ÞF¿ºxÛ)liŠpñAáäTã…möb:.úzˆQƒ¢3ÅM§”$i :Cü5JAa¼ÊµÆãHL¨¬3Ÿ:‘Óy‹·¯Íùö¸«–ØD@ĬH9ÛN›¼«éGQÝ÷Ô®j´xçòº¢üȹ#еXàñ3Ûț٬«¥ [=?R¬¥…#^cšÇ’ Áѯ\úÐçÿåÕŸÝlÛ 6ÿöÏêÑ[³––t¦v:¡ëfÇ4Š‘¯Jf²D¨aJK:±”`=›¤«uÖ4+DD&æÖõå}ÛÖ=±ú½£O£PTÿÅãß¾«„Â$Ç€EŠq6vÏ´ü€h%:o“¾nPˆ*n&˜µ µã-m+6)‚ÖÔÒQ˜J:q¼`b©gD%²;ö”É­Ô,f&äÍÙ† n«jE¤B²¬éCáß^- Š»öÞ¾HFdf l ”Äâ‰ÈX.«Òh)¯×gH{¾T‚˜© /--D(§êìXqB:N lÀCOµAÉ$ º¨‚•/nßNù‘¢e¤k9ÞVG ’–dåGPÚ‡¯½¼€VuÔ^XiRÚA¥ q”fJ·ÑÉ¢*-p‘‡’¯a4ÅÙ;±t‰be¬ñè?ý«/ÿÕ»ÓÚºàe5GR÷nž¼ÿ~9Ï'žù9h­“ÎŽ‘+{ø¾P™ ËRÖŽå¯\d 4d~ä$1™IÈÿ©(?^N3~ S­sãþ}Ù…†²,÷Dö×à<µùžšü·G#Š®zA£c=˜l!g0€È†×¯J¨›Üx{Iäº !X–ï) a 7Š1â'µÔï›ãÿÞ  Þ‹ YgNÿÖ‰0oÌÞº¹d§²[‹ÝˆA€åOír7_¼±ÔC­Dv×±ÓbëÕKw›T,9Ù£Ç4hÑ{°ç·sg!í-ÎÎu¼0T‘ŽBÖ :Þ]2Xw¼zD@"Ùý¿ñ™Oÿ›K/ÞQ èþŸŸùäïÞ~·v~jBùLƵ À[©0Ú²$#9 ÐÆ®'¥›u¢Í»¹S°P/ æÜ±õ …Z€Ž4àåÎätÔÑteæôqKâ±=?øe—Àèzâ€D=¤ª0³9ŽsT(2é~“eØ0µ‚bª8hà°gÁÌѱ&Íî}Êr. 8N¤ÑŽ™q&;¾}oMصªÍ€áÖü–…A«qe«0 ‰„+G7þá툰•;:vñj`’Ñb®Ž¯ #m»Fb,Sf˜éÉ(ðAjÆC-œÝ@²Ä›YÝq &@ŒéEfCcÁ9ñD…‹ÈF÷²S+;™½M%t«J´\¡ƒP U÷ˆ ¿Ú ­BÍZ\lÄ -ÒñÔ|U‹¨‡¸KÉ€AA¼9M«1"4L¡ûÉi¥ÍI­Yâ{_ÿÓßýjóc§6o µ°ôLejáöI!?~çÔ *Ê ª#¹þº d5÷Þ õ“k׀͙ž4ˆ)ïYÇ–ýd&ÉPc®“¾ýLÈTù8­ø pM ²9üà†ul÷O[ÿúHþí®^íeVfT¶TÈÁÈ õ̲%+§jËo­¸na¦O ÝëAy‘ŽKõ€Ì>$¬‰©ð¬ùÎâ]éf y×ýÍÃØ™âÌ;Ë6eíù>Û }Æj `Ý•¼TÉ¢Ï8IW‡$Ž™±Û·|âsG$p§qÿâü&£•FÀ$¥4{QÞvþ€½øÃ»K½‹Ú¶gö×£…Ÿ_ï*Ërܼe=UÃÛ‹¥Ã“zkÕÒ³ ÷š0Œ”U¤8Ưp‚NÑ0hµÓ]ŠŸÒ£ÿïK_zîȯ^_‡û?»òɧ®‡ ;k[„ ÌA§å÷F,»ÕUÇptÉÑ ÜÜr‹;åÂèŽUßβ¦Ã¥—oúµ”¬JÐÍÎÊÞ±õȾóðÜWGâÜþ¿´‰ ép<üJ)ˆi¼l.!Ü—ˆÉ œã;A…a+»ÜŸF°Õ.6ª¸çžŒ(ŽfŠ¢( ÓÛ÷ S+I`ôWg»ö;^„ˆDê T@Žmí8pÿ›·Ù­îÊ¿qŸcŒ§qî™3*yIYuag+Bƒzд£ž§µ  /§VBF.åî¶óàg„¥S‚ÛŒ}­%,¹ î™D¦PÞ›·J#ŽDæ  Õiø(mK`äG ufWöÒ+ë!iY™²g—7ÍžÌðç‚R}òÉ-Vê@¤™)†sz¡1 b,IéÔ·¬• ¿]fõ×s?øÊÙÍ,PLÞÅów¯Tluöô»Zi­‘€¹vLݳj IH»Âëº6þm%Ó ÓCä”’)iÓDÄá”4͆©žêÈýXvy ºrÍB‘9·õ¶Ü~è]ýg'FW‚h¥›]¾£Hd3®+ÂõÍÐ?SxøÚ¦ *-…dY¡ª„ô’´£©ê+ VHΛ»u¢f‹“¨„Ñý#‚‘'>r’X«×oÎ4í=Ð^h‡Ê"„¬íÚ™³[W.Ýé( CÌN=vrR®¿|åÚ&´IÊœkߦ¢Ù¹üñZÔYÏôW®¬}¥•ŽBÖ)ø&iÞâ u˜OÙÖ—®žÿÃôøo^o#Ûß»ó{{½ å:RÂRÔîj;x(&ª½u]1ÖË¥@7ï¶œÝF}¨µ;ä«©/ÝzëAˆ¤4“0 ¿ÚÙ>î÷mxíþ‡v0‡¹?8þÛ!¢Pƒ‰¤Ac'ë~-Ù̈“UK’o’Ä Q_²Ò •ꎬlL’BŒšÕ•½<. &¤D‰ÌXœ:°;kÙ##Ʀ-Îy®ð6ÍŒ$µf­™„åd÷ìºþ·‹ÄŒQnt¿:/Ì1àÓ¦TzdP²’‡B%ã0`oÞr[Ý%ÊгCôVÚB‚km4-Ù¶M3­Íш5!k@쉤Ä<ãæ‹»ÇD¾\ȈZ·{‚Û["ª0R6g§Š÷±Ø×(F&åå-MI° Æ3Šdb•ÜÜãPí$ª)¶\ NPqì®NHªq6#’Žc>Àˆ´b«ý—Û?·õÎÕ—>qþeF;R$–v]ß»ÄïÎ,Ú‚Ž¼­Úo@`u,Ò™Ý7CÞç]¢¥<¡}–+ÄÏ€NÞÅtš•NM5 Pf€{OñuÙÀ®¶‘µ}ÛÛÎGyæ‹§"Ð×BXÙ,.ÜF„ÉH  úèUÏß~}%ÃÚ­¬¯"Xv2 –8\ï~`åŒ,)ÉN³ì®C€`†ì3Ÿ9ˆ úË—./…™íùöR+Ò¶ ¨‰ì‘£'í…ï^[ B¥´¨œ>}´Ø¹÷ÆÅùˆP P$3Òñ¬çnæÏy£ayssK /Œ´â(ÐŒšY fD¡ÓÄñØ9C©ñ#y ùKýÇÿì±Ý-×n¼~pïD  ŽzžÆÐ×[éñ|{½j¢A¸ÔXÝèn¼³ýÉŠ6{“6cäÜÿökžÅ0J·o.íª6}kí»‡>b)ÖÇöýôÛ]óg'‹@m^CÒ1;H/bÞ(Mb ä+ƒÕˆÀíÚ3çJ›4ôGch™“O&kÈ02½g§ke+yãã æûµ·BÖñæIJ;ÂÉÙvá[‹N€Åú!ÿõe™ä~kN“jâv•@ŒØv½\`xزC¥!²™!âº=¡]’”WâÝTELœ¨c‹‹¡th7È,œb¦¾ƒ¬‘< D`nu;@€@‰ì…,Ùš¬Þÿá¢,ËÛœ…õ-EFxφÄnZ¤;öxÂnJ2<(Ù}kó‹ªxp@I$®6”ÒÔkxË,hóßÿ_\{øò¶Cs÷´mcYï~jôµzAM}â¯Yè8çÎÊ…>«È,´š}‚³Ö(…XüyHp± Ì¥oÖ# ELy#h¾­§3Ed¹BäÎøoÉê‰Ç#ìÞjâ\7·t›-a»vÆfFDXÚ—»qaƒlÌgœÍ€åú¡ÒÃY_¦SŠ“(ÝŠAJ£öšb&©3D Cá>õ»û ûðÊõ])cg¶Í,]4eƒU;ÿØèæ…K B%²{;_å—ߺÙÛHˆÒ’¬#‰qå}º kmÙš{°Òëù‘ÖJGZa"}ƒˆŒCP°¦ä “ œê¨€¤ÿ£—?÷‡'.üê‘ßFw;»‹ .WušhéÐ%®ú£%o½«ÿPæ9`¶—xúl½››5°ô©çO¾öÞ2Y¬4aFkЛ×FŽ”fl¾0óÜAˆëóǾv)JdºÆX¢ÓÍi‚‰ßqMФ8¤i‚LÌIôâ ©„u'°gÛ¾Ž,oŸîw³#µEœ†2!*vK;íÌR®R4)xÞÃ9*¨V+ÔH@!h_I)óåý£/ÿ]ÓRJ 5uxíÕ†%>IìÍeMIoˆT®Si,[Ò š7Cô;"‹P9eÉŽïxDµÅ65«L}K§°K@æ(Y&šqÐ@5ÅD@ùìÄ1ÊÇ@ît„Õ^óÀ’Ò"í…šÙš¨/þäQŸQ–Çœ…ÕU•´U:‘[h4ü„¸k"Làƒ@-ó–qj™x“ ±:62™1Hùæ ŒPÞü«óÿׯwÿùSmAõÔ›Ïßyí#(g_¾¾EJkgûéó;æë—ß]S@B˜É´°²BŽ=‹€6oá™rØn[ëæ–ú~EZéÈ|/FYkšKE¨ÙdÖJIDŸñ¯ °`ÑþúË¿÷é“7v%UJadCì±õA)fKB'¶›aFF’¹x¿ò‹ßÚþÔˆðý â®™¯ïøä§ŽþúFFd°ûÀjí©I…Ûß;ð\MiÞõ|á…u4ŽÓ¡ùJ’çl¼ÜB'Hê8 v¸,E*ñ/”Ä }•YŠ&/ià5G´²ö®9B1HY7Ÿ,íٽ˅l-5a÷Á¦°¹ÝŒÀØÿU©Е…ãÅý¤c1 –¦Ž>|½cql/Œå)±Í0å¼Ú£Šˆšg»2è,A!³žÒH]f;ïÞCÝÉ‚îæ¬(ÎYÒqY†ð¹ù§$ü€óùò¬;Rp1ƒò:(½†BÚB°ßg-ÄäÄÒOy ¬ò¸³ºº¦0¹Äã,AÐfÅ1Ó »ä¡¤Sú¢©¿µHÄ-¦|@üWM²\X«W÷}î3ßÙüÆ¿xâç}ËêG7¯º?³Oç?ù¨ª™µ`ع-X=«!„Ä ¸{®É§‚ë”uâPb_031JýT00És£ý»™-"ˆü1ç»zJç4ëk‘šo,ÌIG B&˵€¢~qß{'¡ËZåÂ…@[¤½Ès1™8€b 9Ý…HHåææ3ؤM åžüäa‡£Æ½;f¡”×Ëkž°Hš YN=;ѽtùAKq¤eþàÙcµ`îÂ¥= $ ÖÂ’Q퉱 ySŸªéF[-?\Øjû‘bVJkÖƒ˜ÓÁk£¨KÌÌ’¶4FñaãÆ½ñùÓ'g‚‘RÎhG@õ»” zH ›BlxùœV‰DÅ=¿û½† +koþÎn*♵W.}ú©?¸ýËmŽ€$±¬›Ý­í“mŸî,­·t÷§÷Ÿ­³†Ýÿý/ÿaK R:ÞWàlæ´1Kž” …ãÄ#”ÀaE|‘ÙEA{tnc<çÓLnñ8VA‘ŠÅ/ȈJV÷íÞáb±âš¸9»A–ïo¢Ö(YGŠII'W?ŠßúU "¶dyÿøõ·C‹cΣ†XD*ÞB›«]g/V„f¸Û •d-R¡’ûÜù ˪d߉„+ôJ†ßÅ›I¨“ø=LŠ80¢UrwÕ‚ZѵPu=;h¶#a±¶(è…ˆTßúÅÍ>¹ã#«›ë¡L^ Î' FE@Jâ†xPm`L'MÈÊÌU4Çhe•äÖê!l9è4ƒ× u@35¾6ùéåëoî<¹ú¥Ðv ®ytëq‰Ÿx{ƒ¤R„Ìò4¯B@kÚfœÎ޲䶟wå ‰ÌTu”L\L&§)Æ®c#RÇ'&’uz‡ÿ;¸H’ÐÎÌÏaÏ3¨Ð›íòR¿8w%¢ ·>•ר©*¯¾¥Q3( lw¡ h¹Ý02 °ö±0kX׃2A­˜ˆo©ˆ ²ÖöáÏ=–ápëáõ»Ë8’‹;‘’Òl daò¹ძ×7t¨K»Ÿ:Xóï]½ð ¯…L®n)-¢ÌôY+\X:RÓn´:³²Õ ¥5GJÇ©·Ã ä)I'2fìA|2ƒž“´\§V½¶rr²¨ ±E…`嬠(Aˆˆ@Z³öƒÐɰß^swÛ;¬îIùè'ÐÞš$­ÊŸýÚÊ£??ö{;òúå¶ã*&€àÑÆŽb/ ëKçÎ’Ž2ŸÙû­Ë:ž+%pzL+‚˜¡˜(©3uâLI 0æÁ·¬)ꌊ¹=…uŠÄÃg敘ÎF"‚Æñã•Ç+W¶Í מ_gG÷»j‰(´•RÚuì±ÃÞw^c©…¥£Õ ×XšèŒ7:±Ï;Þ‰C>ùj>«»óÀÊÓHL¡Æ‘é•Ö9$v'gÛÑ+le9î8‰Ü=˜/§ €(ìB~j‡,Tr DMÏÆvW !P€F©¼-xõf+ ÈÕKë¥cxœ€ÆñkEC©á#L¤cY#›o)ޙà ‰Yã€we&ñÃÙX1k]1Îý_¡õègcO56Ù%_ê¹±©Û{&Uý³ßD 5#êú”šUÊj+ûÐܬÜ]¸œFí±BFR1hc¨\XºkcX6…NÀ€…àF»Ø E–U9¶twûçË £¹voÉË/Ï Fºz ‚@& ·}Qr­õ”ýPÙþpn‚yc4 1Ââf_&ßib DB`eü­çò¬6g/Ý\Å*.ljÀŒdä­Úñó[ï¼=ÛÓ*`{üÄù½ÔxóÍK›Br¼êBBڹѧÊèÙ¹Û°·¬Î,4ÛA¨”ÖQ¤ ©=‰ÏK30ÙúÅ$–Ä:È– ùÎv3#;òv4'+Âüëz}«0™÷C?)r(@æÀ VÛµ²“Q`„ÉOüê2H¸ùÆ“ÚSEˆŽ|ì;½àÝÛÏ~ñ û^Yif Ô¨Öû£;¢-»õâ܇êZóáÿÃ÷¾Ñ —2qw³ñ.%ø…Tž¨½‰•¡SÄ»_`DÔ:ð‚̬3}_"­•oµG²mƒ/ndWwžr­lÕ1^¾öÌ–EQ£ËIÒQ¨´é8S'[ÿåŠZ‘[=S~íª™£by|fÅP`DbMhWmk¬X%F|Ø 4DFVÚÞe_ #D=·¬È×n»U'б9ѨÆc« §¾q£€”¹âøÌŽ•BFP¶v¥ ‹¼ndIÝɯ½×PÙj¹¹²ÚñÚ,ÎOçið§¢hLÅmé Âl¹ãã;qh¥Ë $¸¦Ô©„xïÛüñ¯ÍýâKgÞê[1ó­1ùÞˆ«{û–Ð"ä}¥æFp„:·ý×Jݸ#Œ{Ê_æ^Š0H0Ñ@=)K"±4šwðàQ5«ûª¹(lkߨwÄïÖ3©iÜ …$ˆäø©í~·€€¬×o¯’@²HåÃEMÒ¢@%JéÂCU* 8ªšXÆ&L­¿ÌrÛç>‘a½ñàÚÍ%»6âÏmJ$¡5;qîñÂÂÏ.¬²ò}§<ýعjÿÁïÏø„‚$ÐŽ‘Ð亹S»•ÂõÙí; Ýè-,/ot”i­8RAsëΔãá`ÿ¯ã2‰`(j„í¸Å©vGƸ×ñmÝ}”¯Žåš=s³­"@iÍÝýØèñ7o‹¬Å 3Ÿ9øÂR_½1}üíþ‚âg—__³»?¾ô‡§¼ùÖR„lÑü¹­íÅÀË\_øð!¡‚ÌWNýõ=%˜ SÂVäTj€Ċ×·ÑÍS¼r£øÙÃD¦¡!P}w½{ðFÙíb£Êõ‡"Â${ „S™Þ¿=cŠ®©ßZ3ëhG^ÈÒ¡Ò*Rd»öîC‹ß¼$„ÊTNf_|@„,b¥.hÖ4Øó`’S™+‘S+ u5úŒH:"bdjá®J™¯­w-`Vª°ÕÚ†)û9EF'H‚™ d®0²Ï¶jEW #DŽÅí¦GBrØóˆ°8m_x«±ÈÔGš+=„„ýð âÝ ²q1$¥aPêÊŽ½ëœäp%ë˜8K›–1m-yàÜNÙa¬Dô³é=xå½ég6Þg)”íÛ§oÞ:ÅÅOÍtÈÒâœXSt#i“²v®9þ™7º"ýÓ(¶q¼bŒe—Éø†R$0>D•.€ó‘ìú¼êæI´ªo=úÜ Í¼ØäÅ®½q/²HÆ‘óךu‹pu&ãx”9o#× BN t@“ˆB£8D=¸ÿ$0ò kª}ú ­/ß\Ò£µþLC#IbÖtqê5¡…æüq¾O¾ìês{–ádù2'à@éŽlFðØ|M©HéB"ÁqÒPŽŽÃyîh¯Ã ,{ç¶wÏ< š7Âå–»vO9B Еs§¯í±5D¼(N1ÂÊm45[–„±R;±d%Î4†ALbîÈ( „hÿQ3W?ÿ~ÌæÞÝ_¾|¹;ºƒçf[˜q, *ŸûÊ'G®}ó'÷{¾§2{?û§*Íþä¿þôQÈ$©Ç0B@$Ë–Žßþé¢BuÓÙ/ƒÕöÒÂÊzÇWQ¤@‡3*SP\?&“RN”³æE r™ßX:n¦²­,3ÕZ1ë ™R¦ßêùå~¾šaPHZ±(ò£…¶Z]9P]¾²YË(Θ^ol♵–,3˩ݗ~åy²ºÑ#I“ ~ŠZ[Ö¸T,˜mhLƧˆñ~š&¡ï@6D¼ã3rkKfêã»ß!Rå©­ƒÚz7ò!³5¾ãÈtÖ-¸f=Ó¸³Ž"hyJ3Z’´òƒPXn¦ppÏÍ¿z(Yå¶?æýl‰ŒBÍŒ0ó$¼.“èȲ4áföŒ"Sp©-u¯ÏH¨,9s|óBŸ/¬å—g=b¡·³ž;|9ˆ!—f·†B§cÐT¥AL@v1·sRæj‡P{m%­.a ‚0Ô@…éµ_/zŒ™jÅ[ÜÚÂ8½ˆp(놶Mò’H‡Ù”ƒS:òÖIû¨ÓAÍPÂ¥›nã:sOï¾±¹qrtÖ“Š8Ò‹§VýI‹F/‡¨|Î{{4Ëh“r?qÿ=þxöo½¡ /§.NHÇ,ñ¸BÇW2ˆK¢ Ñh!Ù¿ý„÷¦Ø|™±íüÅæYKCsÍ[ßÌnÜKZIƒûÔãWUŸ.@hÎ@·€@–™Ñ‡×µ•)7[¾æ!°w<&…è—¸ARÂ( BD"¦ÂGÿÝs6øw~ó›+Ò6ñhÞƒLµÕ'¿ü8¾úÝß,¾' gÿwo|ãïßoh¢x¦{ŒQ"’–%mkìC»#àÙÞa‹7›‹ Ë«Ý CÍ*T&?Ê$ ˜½Mº2áøL0“0 b ¸”Ž›-ï(ËÌXµ’wÑŸ_°‹ÜÚà¬4‚B4#€íFsók]p+·M8Þíµ±Bè †±CÑÊüÈÑ¥0Ÿe° £2j+T7Þ9ˆ7Ž@„Zû=]rò4jÖ<þxw!ŠŒƒA©+w)qÌ €©#Œ .¥‘‰¥tÊçäÝeT(O><$¬÷º~ęڞý{lYqˆ6gÒê·z!³t$±ŠB(²Ùƒ»ßÿ›eÍ¢´óìòÏ×$1P¬3I?¹x-Ìq% öhƶMäÄíÛ’ú=j¶úöN¾y/‚çG¢ÞEÏ´@R죗ûš“Pèä·ÄœŒòÑ*¦÷X¥Úˆ+Pû-_ªF;´¤%ƒÐ'r¦‹~¹(¦Z-Xm´ÓÄÓ3”è€Á`} }¦nÄô·‹· 1JŒV‡‘\ÈVH­Qñ?`»õ¬}wSŸ…‡ÒÒJpî™)×¹Üd@úÔá¥ìû –$ Éç~¸æ}ñá/i¨Ï§‰–ôßÉê—ÿÕÀr‡Àô!ɱ?¹¶ô¢yA(¬½OÚuKƒ·Þ\ÛpÛµcYR€Â‡ŸºøÍÌÞÑÂò¦jt"!¨Rzo¬\¦Ññ"À䨉A–I¨5ð`Â.ú ¢f÷Ô—9*\»þÞ]] çÚž$4ht&Ϭ¬|÷Úr¨tdï>úì.½öÞL׌^µ&­“”S$$!…Vþè¡x«³ß ZÍõåÍ-?Œ”Ö¬£ÈôÅZ§ø}s SHÄ) ÿ ؈‘H8ŽS˜(P¶Z/2yK+a°91š¯=`!ôÒÖ¶ŠÓiG–­×f×ÛJ¹7&ög'øÎ«Íz}[@éw}ÿ¥m{ï/;6sè>¿ï{k—þ—×ÿà ûó´@¦Œ¹;:æyòêÍ/ìZÿùñoÍʯriã`ÄtŠÉ(bK<14ŸÁ €&B ÈAÀù%o÷ -¢U6F‘eÕ¬±éC5iG\f`{›yÑïùJMt„š]²ËFýí5Wi°JÛNÎüª%ãÑ”N‚JSŒG;-¨ÌX¶¨»sƒ¾ ®*¤âÞåG}Ám®¾½ai&†À/B -¡0YÄpò !¤¡æ…"QÈÕwK»4’‘ÀaדÜî([HÀQJg¬¼òÚ|_©l©Î+f”Xø@§7$êD95´=×ilkì<ÐƒØ N£™uD<°@&ÇÔõ÷mš˜– cw"í¿àê†Ù>’†~4ÐöÆìôìâDÓ‹@8M$mIöcâ~¹a[¶%«»ÌÜ]iX­›¡Â¬)îü;_Óc£“Õ!¥‘Óoãù*^N0Õ7¥'2 ™³P”Q @"1ö¥zÄÑ›ï¾ñê£ì˜Ó\n Wf ÜöÏ}jzæ…núýJç~÷3‡¼÷¿þ“ë͈L™›êB0‰HÛ‘™Lù™}ÔB®ýõå…åŽï‡3«0vÿbŽˆ]¤˜hg†õeÉpMƒAÒu³ÅÉ’,VGË‚å&“¿x‹kn¥Vú*ŠzëA¥H«×z‘FQ¨„{ã;7°”)«n ñÈÁv°k),¹œËýìíÒái§í!{7nN?±Ók+"Í&eI·Ù1Ô¸v·4‚ŠK'óú¿È±8u঄]æ@‚ó i%%Ä"]Ì.ì};†íeãÛJ!3ÓØÎ#Sv¦T¶fl}®k‰^+ô•B€RžÏ(2nñDéÅ·-`´ ^{ŘN½€(ª¦ÍŸù(1?eçwV§`ÿB[ê~ĤAû=Ó|cƒ‘Oí]#ä>0!n{Ìmª•(nËLr"AœÇ$ ¹ÜÁqª,B Üo±å7ú,¥°)òÈÄéqê¶#»°òµµÒÉk ]Ù9s˜2¯Ffm×wíÝæ$ø_æÖlß’^£ï3A Â0dY·|ªðã{È€véÄþ7Þñd"1¥ø'ŧgúв µ²˜(k ‡·ÂnÈ’PCÄbï¶·oùéøþþÍBPØûî]_´l2ÈtÓ¯gÝBfÏ^*Ž ÜÛ Ý°Ù ¥m[ùÒvq]x·å+Qu×¶6=ŠcÔ)ùMшR' pü@ ÆR#F¢8ƒË`kâv,‘¶3@‚SæA?<%ÛäR±¯©ˆ[kû—[‚P¯l†SÂÊ]Äß»¶¨î†éÄ¡ïôíßé¢4°&L´jæA(äðÜ:¡B@œ°1X¾“.þñî¥ÛjKΑ@×9ù„`Ôܘ½‹}KØ®dŸ gž¸ñ_‘ýäi¥ ™6×¹ÕbBGb¹z÷A 3…N'Ði8Aœg…ñL%€cLû #Dˆòø¿üíû~õóz[©ù`UÛR`Ä”ÙýùÏ×®|ç×s½€åøg~ÿ™â|ã•ù@Rl§4øÀx½DDˆ(¤#¥›Ùö±²†FsšË+Km/TJ)СNrÓÍÚpȶ1Š1”4Ȳ³n¾6êäêÕrÁ1`”•ÕˆTgËK8ÔXæR¥Ê­V©Ò¿zw|i£o•Ša+Pt{§º·îå'²&(m!æ¨ÌçJÌS«ËsotŸÚízˆý{—êOè¯)2úNB¡š½‘J_ñ£å±"*?Ì„iprØ2"hƒžÍÔÅ@|•ˆÑYÈìˆ>63 àÐÒnW¾Óïk õG¦²nyÄ1*øÆÏË‹<9Ra¨IZ™Ê©ÜßýÂÌH#‡w¼ñ®’˜Ä–c,ó¸áçÁ+qnå`BˆÄŸ_Ü:::ëh­Ûb×£é"׿ÔïÊËÑ*ÏGQYÒ?å#§þ~ €hH{ï¤8JÖésïc&%@bÔb÷ï9ït7EwѶ¬ÜîOæ4D`-_aÿnÓ±m[Ÿœ'ž½ú7}Gâ£þš-p±«30Ù„•Ü{Kl¹ÙÍ^0ˆL¢XÉC+4LÉ­f F1Ãèÿ«i ç/üìJ°}lëÞ¦rlììü½Ï—ßøÑË«aÈΞ/þ£“ö{ßüû+[Æðĉ]{ÔDf±l'Szv¿‚`³š×Íõ…Åv7 •ÖZE:Ž[ŒcaéGò¡aq %ÖÒrs¹É7;R¯åPËK*£[]mÇ_^³«õ8á£×ßN²lÇï‚ß×ÈË|¸Ð]½êìËmn *ˆb$hf3`^ÕÞý÷kUe¿KÜ|sþ©ÓµE/JªZ3´Vu=ßµ7¬qÁ:s¦2Óe‹JÓY8ÇÞ S¹¬‘±4=ŽÉ…"D@Bw„—Ÿn^A„öéå‰ =Zõ•,n;0•ÉäjŽb­/F¶î4ûa$, XëÐg'O‹¯¿¬Š‘ÓS¿¸ d XFIqjðîˆl:#;·h ûWYèv60@Hr|ß;·™;²G½¦<íXg/D5žQI!žzkb;™­bfôLήU27:’V7XR û¾"+;å^}e¹¯03VÚØÜìÅÉMCãz¬xP÷#¢BL3ô8%ð@šÉ ƒû>6’ñha*¸M~ñð7±—°š}b÷Í•ÌqµHB+‚m:š"+g½;ݾ3KR ¨}èí«øçÛšRk] "QËéw0Ü'ãÒ¾ƒŒì~þL÷"­YBKº»>YWÔof{ïöøâ¦-m)PAé±§oþEÏ >úÿ®ª? ü³F‚ä¤xgd^lzQ:5üÄä2 –)±Ö‰ 1>ý9-õê[/¾Ù¨mïß]dˤ˜Ä¡?þœûú÷^[òC•=ñ•ßÛ×yãkß¾Õ£xÎÊšQ³F¦dËHˆ„$iÙvùè“‚£F®ufW·:Q ´Ö…éÉk›+DǡΠb(Å)©úâ „㺅£"S­Uг hí­PHi‘Övg±ïÔ'ì»W}ÿÆÛOLn­wB1¯ÕöåW›*ÛóÞB‡td –#Ð* VK š—Ž(s/b=û«ü³g;›Zh´I úín¹àÞjŽætD{Ïϯǥ¦‚ÄŽŒßx`ñ¨ƒ˜âÈx`›Ã€‚2%kóPåm‚3ÅÞå«SûŽX¢Vq­{õQ ¡·(ÂfV*è‡èع±³üŸßDbkôlñ…ûÂÖdá™a*¢ˆ3@Ì-«…;AÖΉ1DˆÞðln$Y*ŽrçÚ¯­"ƒµNÑ»=ÏîgϾë•l\P»É–)Þ$A>Ÿ9[Õµšk# r{ËÊl¬DèØo Ã™zmþWË]¦Lµ¾¹±å™·PÄ?#w–Œq‰O˜ð¬7ÆdRà„ï‹éy Ž-#4äsE(ƒÑ||š’j5>*nÌï?x·+ ì‡ûo•ê<ºÃ]˜§f°"¥EÖÎ'¾ÛÌ|éÝ×ÅÇâWq fJwD8\‚%ÉAñÍ„îø?Ë_] úá|Æã¿=©°·UÌÜ_ñßoËŒejU=õ̽¿,|êO6^”Û‹Ì.ªîVhqÈ–Ööµ+mÈû-_%òö““N0ÆÂ¥jaQbçô¿þT6/ýê7ë¹íôh)°hvñSøÊ7/¬hÅå'ÿèÓS‹/~õ§¡uk‚Æj¼¯I`[”qócŸ(+nAVöVç—Íý¯”f)d“1«@&öÍD)ƒ)Í4F˜C‚²DËÍdJcuáŽÖ«Eƒùu´ Ý 5X–EëËn¾X¸¿‚ÄGÞöÝÑj[!b´±}J¯{+c㻽ÕG_Ú,Š2²Çï´4Àì{öù)úšûïß>ðdyµ‚uü wÖ¡€ž½y¹V•Š É{¡¥cÙ éD(›d‘›Õ¿6…§Ûm@@$´‹¥Í±ƒïµY«Z}õ0xoqnòДãVFldBÐ+K>A·é+…$ˆ5¡"“™:Ûøëw# Nýœ|iFæ¸bQ’9k¦Ï”^­²^ÉTvŽWqá~Ī HB¡è2ïÚÿöõHäê+¦ë-ûÀÎÑ«½Zýf”äšÄY³ŠZÊæóG·©b=g Dàþ¦ÄÖŠ²,K ä>r&j‹/ßî0ÚåZg½ÙÒqÒš™REÏ"3²`CA3õc®i­´Á‡bLÖÄøÆ‡,±Ìƒ¿N_ÎÔ˜¼¤Ë•gfWVN”µnöYàâBÃ÷—»–d%žùN|ä;s,â‘;ꔃŸãÏ&´¤oI„L"@@Ú}ê#ê7Ô¢yp©ú;»ü»Üm^_³laÛCáô³3Þ%ÿñ?žùn°mÌÕ€½EhôIKǵ2#˷;¾6K~éøqHêRÒ¸`1¶íÏþh;un¾ôÊÝÌx~~¦ƒR€9ú»Ç·þáíDP}úž¯<úñ×__Q¨€8¾d¢¸´L:„H‚PH[H;_:sHA7ÊÊ`}vq}³ëJ1+­XÑ:9‘Kͧãáhý”¤q" ´3™âd=ãŽÔ«—ÃÙ†&Õjù–!•¶Å‘U\¿ÞÛy"³Ñqòrî½à±­®¨›[‡'ýMoŸë—ýuv , ³…k@x7ol?[‚^ˆ<÷Žxò®Æ&eš ‚Ž_˶Ýil³™íûf‰Ø›ba7aL ·b²D±\` €DANµ+ŽÜ]TthæÁ¥Líø6Ç.Tm£2[]ò%{Í®Ö(¥@¥ÃˆÑÎÂŽë}I£ÌL~±h¥£h¬Êc "`̪(;í¦'¶ ààB¹çÅ ’sçZo/ K{*˜ÿŒõhɇž@yèA£uëõÌö¿ö‰tœ5œëâîh(Lã =6Ùf ö@æ)¯ÿi}ænØSs.g¾|Yo„¹üÊÝKë–-\I;gž¾ûŸ›vôá4ÿŸwOKÞZ‡MŸPkaK¬•nÌõe.ÛèÉ$7" ° 8¤srê™gáŸüw§þÃ_¿r=¨•Z³m°„fîþ/|Øyë»ï5t€£OýÁ‡3÷¿ÿÍ ›J0êAÒ‰Ñ7Åm&!¢ HŽ%…“;ô¬¥#?ãF[ ‹«íV?Pk­X%Ð@œýC*éØbd dC’vÆÍOT\§2VÍg 1œ_éoöF’Q ÖP¨Š¹‹¯\}üˆðAu7®O=Qìh` zËÚ;Ò]jánn<»Ò•6 ¦ÚêRD´~µ{ê€ã÷Xô/ß<üXy½m²ÔˆT¯™ ¥;úÄG&ÒšA*ÉLݵ&·MYÕû› ‚€-ˆº/“½7×PLG÷¢§G—îõe[1íS݃×ûÆ©˜ˆþ̆4"’(d §Çh¤’58®­¶ÍØ6GaÈ, “üþ»[S¡n­u¶BLÁ*±®–Eª"ÑNC:ÏJo8X¿¤°ØØL4ˆSZÑà®ÆÁn<1Æêµ²íìú#ÿ8>@ÐÌÔ:°fM2Ú˽v“‘´8¹í[aöË?º#X¨á9{b¾ØqyáñÿŠ}Ád—Ü?Ù¶~/ìÀ‚}ê9Òmô­úúÏ’K– a˜;ùTë/Ö„:ñ§kÿÛ­ÂäÞÑÀå~Ð ˜@IW”ÿNŸÝ6ú%Ôçd•w>1 Ð(þmãæÏ_›ÍŽñʆ/mDgú³Ÿ*_þ‡ í(ÐSOýá“öÕ¯ýðF×øLÂjêßO¾ŠøÆ!IÚíLùàyd­¤ì-Î-¬7¼0Œ´Ö¬#ƒMç6³žÌ›Î`°`Öq@ ;“Ím«¹¹êhµDÞâJ„ªÕTˆBJa0ºÈ²*oÝÜôªåûõ}ûËM%ô›;Ïfý6JÇÛܾ—»û'—àvZÞrб¸Ò› CM(hëzûÄnö"ê_Ÿ9ðÄèJ߈}Má®Zí|©/ù~k<«µ½oÇ£FZ¹Äíl¼X`ÐB|B›y6 ;[^Ý5þžÏlwÔpˆd©š1G÷Ú‚çè^Ë‹„@Ž¢^…cg»õ72X¹©“­Ÿ5„9i0Y0 ª€$O!>uAT«rdçxæ/2y}e¦QD;w½w»Hű™†xjjã†B±Çºi¿ÝÕ‰03Ù4%Dr‹™Ã;±XÍZÐi «ÓôI‹¢PiÀÌ8^ys³¯¨0æ¬7¶úVBŽ!“> Ico,–ü§&~ØŒ‡™`Ì4‹ B§û¾at\Ž»ãÒâ<½™Urüµ-Ýuc¡p¬Ù@bÀ®5îÓ”YÖ =&B÷ùæ¯ÔùC_oÒ Ö7q¯§Dí¤ÅMQDƒ-1¤‘Ũ iߟàûÍŽl6éÔg Ø_ïLÛ¿|¯/lÛ"P¹ƒÏ9ç„§þtë?]•‰•<¨9îw´Š-)ÄdãrÝ¢×ôU <´ 8u^fª…â3¿þÅM]µ×W[R¢Ö,G?õ;׿ùÚf¨`üÃÿäq¸øµïÝñ‘p+£ÞjBé#c(²-°2¹é”Ž,®>œ[mxA)­+H%É€2‘úq<ôO†ÌC'7 JÛηWíl­VÉ»&]cþ"xÍ…E&ªƒÂˆzxmÝ ™ä¼u♽›[񾁾ÓÇT[‘ ¼m£áfGï©/®®5WZù²³Ž=lD @ÕÃkã§jÚ뱘{Ç~|¯¿¡LµB š¢^[T¥'–ïT«È<}zcE  IÑ—(P[ÿ˜Ð+ØÐÈvÆÖЇ/µ‘U~§·0Â܈c¦z¶ÕmúJ“m TQhaYÙ=ûnýõ ;;N̿ұb˜B¬‹‰ßÓr*Ä™®3;)ì}£Ó6Côþ:aÏgľ´Îû¯-Ø<Šð‰Ý+¾èk"Г¥Köñ;5™$3f$fv!7uš²µœCˆÞ:}Ã(”©¾¾Ü‹°XËm4Z=J-3‰ß)î¥Ê¥„“,€QAÌ×@$m>QC^Ð RŸM*óKy2Iõ’d¤RÂkUÔê>×[GÆïÄ ôÚÑ Ës@Dzâù÷îªÏ6~8xf ²hXg4 Åá w€0HÿZ„˜ùò¡­‹àËêüç Š–Wå®Ù·¤íؤüìáÿñ¾ûçÞÿòåk£{ª{‹ÜÙBZ¸k3w|Ê–šmŸS1ŠIøy”Ä "7û'Ö{ýÚd{¾%,dF«úé/îºõÝ߬³†Ê³ödpñ«?xè›_,.Ýõ€,n„&ÉdQ°\”ÙBù™½J õÆÜ£ÕV? È5ØŽaè&SüÍÅh]LlÛ:â^NÚ™|vlÒÉVkå‚K ˆÑòB`‡ífÙB±:3nݸºé… ÄH®ß¾ý«öéçK» yæâȇê›=à.l¯5V¶&§y¡·$wëí7:W{ØV¬‘ {iåð ©z!õÞŸ9ûdf-‚8I5½Q»•ÕïÓ´`]xœïú¦45·Ž+Ì¥Eq‡“øÚÐP„1ž|Sn¤§›YP™çE•XÙ9›PëåùŽ+»›>k”¶@^ßÎØ…ƒû¯ýõ’dM”Û~þÞ¯ºVìùÕÄñ®gÈ‚h"ž"‚ DÀZÅ*í«k Å‹È~O9VÉé½ï^ëaqì~ÛÒûv/ÂÓˆ(F§ÞåCsp×W±L(„,å&ÎZ¢Z2 p=²ú[}E Œ4Úc#ë¯Ì¶•ÎWGÖ;íNúÎ ŠhŠ—þ±}5Á&*^Ný æÿÕ”±d8â”dp%{þÈCG@šÙße©NÎøRYÎï~êÁÃàŒ·@B‡òI‹‘ K3B²ÂC'ÿ¦›ùòkï‹/¬ØØ@<‰ÛLÊiФw¹óO2¶ü µzòK#µú{3/>Ò®%€03õ±ìÿk.£wý«àÿóŽ–¹ÚÔö’Å€íEj6¤¶m‰Åâµ¹ÀÊ8­^ÈÂÀnZ2¥C–fEØåñÎÜ8„ZØ…ÿñ¡_ÿÕ«¨þ‘ú´zó/ô(PšãCX¯Ẇ@aI´3ùÏ1ëÈÂîÃ…¥V7 ÂHif6Î`'"f: ÙVP ¸µf[b9n6[ß‘‘•Ñ‘bF ¨¥ÙP@·ãƒ%-"BˆP@èŒàƒ›[Ý>²[.ö;ê^}¥öüy^t./?Í«Z¯ËF»±¼ÑWwWçú“2"®Uõ"d $,\)>]‚ -åìkÙç4[ A³žï¯‹±~?{}fO޵zýÕH EjqeJK3èêSÍ+ØS®³}t§dà7Ö ZžL _]F gï²ÐÓõ/*å+$æÒ‘7a×úJ¨ÑœkˆGò±£È OTÂjÍj«› ÖzLŽEľ‚È*×7_½ÛŽ [®·Ö;-mÜRñåÉ0Q©›·“(Î_ŽMó:]?RâN>Ò'­-“†+. rƒãl‚qà°†"sxùÜÞë‹c‡îû™Õs" ¬+¡²žË|OîzòoÖÐØücµ¥Ùf0 ¸ãµfodVZ‰×-®~¥ûñ'Ú¯C'¾RPiñ`½²wæå&JCÆŸvþã]×›ú?…ÿë[ ­lqïDpkKmô™ˆÑ"³/n(§@[ý(Éh"ŒÍ_I JÒ\zSœq—7”è[”{âN¬|ûÅ¥@«Ú‡ÿì\ôúß¾81'’ýä—QüÆ’‘-Hd µgkZ+!¼¥Kë]?ˆ" T¤R@R¢Úé–q û Ìo ¤íº™Éél¦\¯æ\B@ÔË}Knö-I"ëìÍ\[îF¹#ù~Ç÷"í·ïøÐÔÖj aþBîÃc[½^89­oÙÛ‹[}«»äìiôÆÙ—ÄzbÇÒVÇOŠÞÕ™SGeèÐoîð“¹åЀÆø]]Ovneë‚ÕøÙÆ‚Šùp†œ#"“!Š„ Lœµ‘ ²–³yxä5 ìáƒYc¦`ÐK3¾#š[‘Ò²PGìûÊÎdƒ»_ûƦ``Y<°ïò›Qâ‘CmÊ>Nvþ1~p3""ËZê;ê5Ú¸ö4HA,U@㇯^ï#ŠÂøÌ†¬=§.†A Èžú èÎ+ÜÔ€©]Ÿ(›ÏîÛT³wºlm*!…:‘qÿí«-ÝjÍ_ï7"DDÐF¹HD€‡¯³±1 ÄâœòöÒ`-dÙEŽuD)š(Pªxƒœ4ªioÉqÖ(R ÉHïmÔ$nâÑ­ÍSùš5«]qÃ&Î?ì‰òÏ_½}¬ð E<¬6H®µ$ù`¸ƒ4’P"Ä ±?®Ì-…ž§¾<­Á÷ÜÆu¹+ÿú-!³±ÜùÉ쾜éoÿâ/_Ž$8¹ÚÚ#ˆå¾·¡™¥°­)ïRbÔò¢ä#‹Úœ®üã/j`5G‘عÔHÉ=ùå'×¾÷ƒuåÃrÞ»ð_Ìy„IöÐ45=Fˆ ´l!­léä ÐI^º»°ÑöÂ@±fÖZ'0Rº5 —T ’Ä‚+¡@Âθùm¶[«äŒÇ$Zõ3Øê„!Ik´€s%ž½¶Ö2•\¿åû†s7ÿ–÷¡'¬uŸeÿæƒSçU§ÕÛ6¶Ò\¢5-½åÞg¥/ ë{W7"fBÀò5û±1ö< ™×§Îîl5B…€Âœw^«ãdŽnã6ëÜ)ûAVݘ@L‘ElJ3O™(¦^" a»•F}ÿ+a~÷¾q+umðÚƒ®#ºM_¡´-šÃ@¹n&lúõolHf¢üîWÞWVºÍ"ãDA"`ÒñÏ5'ÅnÆÌx!39¾ÃTW]ìL’4pÀöùèÍ…ˆÈW4V?*n¶èkÂ=ú&ìÆ‡Š õ€qdNt îîCªP/X°ß»±¡%ur(ª|ㆯ푺^noø2Nê"6íå`/Ç‹) 3Å^±jœèn)•µ üÿf¦O‰BÅÐ (ÙÄN©Á¹0<¢5³˜ßwüÑ¢8¹º*A;ÏlWAè ´–E€Sÿd•¿|û7‚’•YC4Ê»†Œs 0Ñe˜ÉU°Ê•JÞ!@€`eÎwD§*@Ë’L¬B”Á×׺ ·\èôú¾gË»q}ò#{6Ö}¡W/ÉçF—×xg¦ÕÝÚYmú!èõµLµÔRŽÖå#ÁJ`zعµxz¿Œºtß[xò4u@3#ø­4=? 5kÔ‘<¢É”fH•†©Ð`{‹fÌ$ÛqÆ·íÒh5ï`½¹à n68Ò$,‰ˆZ£Ön•æ®­ú>BfÄíwú~¨“oV/¿Û8ÿDy¹«Ù»¹zü8nºãÎ|ÓÛ—my!¿Ú™ÙBIœ;’]èƒé}ÈÒË— O*¯pÿêÄSÓ+=:.[¼nT±”nÝuÇ…ÂíG—¶T|úS"™…! *ÅËÓX’‚ÀÌ„™r?8£àÐxÖr(o5´mÙiû¬É¶X…>“›-œxåï6%2X¥“Û_»ªE²ñ7ÄJƒ!ãpŠe¶qïîX.3>=á0ÀÅ áuCÖT¨å¹àe”“pGI uî/‡Ø•@'ïµ+µ«QjJMÍ( …âñ5RË€nõ-µÙFW‰*ˆ4*…¥WçzeG³ËvOĔߴägÒ Œ½–cqïðØ:9"81aúËų¢ø*aåM×:Õ›¦zºÆJSzŒx7r7ï…§£ù¬3ù8ÎIŸ³lѼ—{bóeuvç·Zbà´N…ÄðAæÞ0 xèáp™Å‰ßW{}9õ¸Ãºd³š'Å/zhA@µç÷ÿè%+Èý‹É¯¾àYÈ œ‘mÛ+x‹°ÙAfE9ÂÒÈÍÙ@æFߊ‘“<üá%t¢¡+N1`åùßÛyõ‡¯¯ºxä÷?–»ñÍîzIèyB\OÏLC4ÀA’Ùâ›x‡„•Ëï{^è@ÏÝYh÷ûA±ÒE:Áå§fÒdF‘© )>cS7IÇu3SÛr–;6R0ó?½µØCîôf!-dI B€U·n_[ï+ÍÙr¶ßì~a(ƒ;W&žÞ×_÷æ®–Ÿ(¬”sQ«YŸ‚†Ö ¼Åh¯ìÚ„ÀÊÞ»c®c@Ê,Qv®¯?êô=…›ïöž8ìmè¸BA@æ~?Sñ¹wW×]#g¢¹‡³¢‹ÓóšÌ£$eQ€'ën‰¶å¤•1£-ÝXð,ÕÝ µ"a“VQè(sÙC¯|§aF«trüµ«(b]«NòdªôªIÒá ¡4š)îC€Öõ¶VžŠHh¦¨ºÿÖÅç'çÖj@úh~aÆÇ.‘PîÉ¥Õ¾÷x`ÐMžy$È탻ÔH=+t¿-ôzŸP‚~ÄìVË7ïõ.Ô +[½¶ÙY&SÀ„I‘4|ƒN´¦/4å~·k¦i)+8½•R0˜O\¤s>D3Šª#Ò)AjÞf"Z:uèÚÜô·JÚ.sÁ×9ÎÍ÷ëg^¹¯?»þÂë¿ Ežx\“§zHuKƒÈ‹ØàŠ˜ûý}÷<}äXNs·ÏYº±0~òöÛJR¨ÊÏýÕ÷E”û£CÿðÝžL$³õ]ãUÉÀ­5jE‘Öà’-ëÎ;«‘]ížï˜?`{ŒEƒ²T¶¢Ž™C¿nö…Ÿ.„˜Ûû•ÏÕ|ó{wz&‚4'ò‹”'Ÿ:cϾ9 H !‘c +“«#yëQÏÂnC &iIBB ™=¼½Ù 5f+N¯„ž†ø;1woã­ÕçÎ6Úšº×NìŽ$´›z[}­/YEbÍÚ§Xšksâäæj„ PàÌûÛN•a3dïÖíÏå—|`mŽzÁºÛ†rt{i_F«ÌÉò?@b4œ(¬1Yö©€Œ -×)„GÇ¥EY—âüå.è^/ˆ4 AŒìûÍåýòï›k´FŽOüú& l•Ò” ¨0©¦ÒjÁž*:“;F¸|Ï¥À×lBŽ8sß\@{™pkþØÈÊOöé@{.»ïrà:fšÉ„²ìî9¡ò‰?Ûk¶Úš‰,Œ¼€*7n5Yd¤ eNVxiÔ¶9ÄÙ€l–,©aÐÄ“ÝuÂÈç!:Pú`½©‚A¬LŸž™©î_,œ±ÁŠr*yÎ/í¶~Ì;žþúÚàßæ¤›‹‰ßip¢h!Û[bv0³‘ýâ±þ –Oºšƒ.ûeù‹»ŸZx…YEÙ§ﯕ…ÿè©ÿMÓdD’…êÞÚˆF†ùÐ[ó4ƒÎH‘Û|߃\¾Ópœòðõ({âR‚Ò€ÿòK…ß|÷šÇÖøþhÿò¾úN[ 6¯¿óÄ ÷ñ†;-’A #'Bi‘´2îÄÇˬ٠-¶»ý0b¥9‚¡ãÐú5ño§dùd! ÐD!»™Ñ9‘¯ä]€[Ë¡6·ÂPYÂ"~,²%÷îíU/P”«æzmφµñFû´ùö‘çk‹»ï·wVJÞr{G)ÜB+ŒôÎe+ËŒ=I¿13€ÖHfß{¶ôzR_|xöI¹œ ÛLÉ é1—¸íÑÿ×ëß¾Ðdùôküô[¯6 4kCRRÉ„Þ üSD;&SÓú˜F…%¤° gfÐûóK]/ˆ"1êˆãä²}ÍÊÊÅÕŽü19ãÇÀ "[Wºïö¼øáÍ]ÏdWü˜‡ vý\6 Þ½LM]_QÂè¿7zºfN'žæª°j•-"ÛkBèw:Ad õ¢\‹'Š?y¡‡Àd…_?LИiü ‹ç“@Õ¸eö(Š£nqר8µ.·û>’ >Âô‰ÛW;œ™\X1éÒ0ò!x¿©1sìm>¼±Qlr2›|arÕÓª•-‰Œ6"Ç[÷$ IF:#•þå›-zimËk§ïmÉè’I\,;M8‹‰û/˜ÐJ½…áö6~ñõPöv*¦$zdHo¡i 4+/¯õ!ëræî…µÞÃ}›¹,‡Ûg·}½©ãˆr*Npè»H±Éþwhl”³¶sâÓòa}ŠP·#¿ £Ù7VkO«_®6óÛŸÇÿúÐ Ÿþƒ;ÿ~V¢ÉÛDviz¢b1Âj7jú€2ÃöxÿJ+´Kºé…øÌÄú–ò°¬ÆF‚Ó1õáÚ±°ŸsÙ7z½*Z‡j³½8Q™ExoeÇ!v#Z}·þÔŽ­MÍÀD‚}GCÖ3Á¤Åjädo)¬8q¤‡D_a¦œ (ª»ŽŒ;Ž0â2ÖZ Àv«ã!Zpäû‘ëˆÊÉü÷Ü‘"3zN¼8+bMbu¡¸QæG›Bo’Í 1¸õ{ûÄdŽ¯ß¡ÛŠ1hŸÄþÒksš˜&œ»Š˜ ¨ÑúŒ¾º¥•‡èœ7œŽfCæ‘@æÝìÑ*TëA¨:¾mtm„€( –ëúêŦ¯²ÕR{#èïÚ ^%î$)eêñ‹t¹e¸&í´aò`Ô?páÁÿÓ[¬ˆÇßÃ%ÀàÿFœ–웓§ç U/ìK*(•6ëdù‹_ûqŒ]6êÛáacœRŒ†š‚<,ÿ‡;Ú½‚¡A”­®¿bŸÞq÷rÛøXá¯n¸Ñ±<ÿïHN÷â2WÞ]« Fž ‚¶Òš³˜›X¿Ò\Þo÷U’Úœf | !`øoŸÖø¨8þÔW­ÿìk»dd‚œæ]§ÀW ´wbbÔL“¼ €¤äæòß¡™1x4»Ôð‚Piͬ#eÚ“ÊS¸;AÒÒ?F¾’®ã–'F­L­VÊY€è-¶Ií€Ñ"’RBŒ`—Ù›ë~‘]Ëõ𽍝’Š?•†à€”ÎÈêáû…ÇŽ÷W¼æTp%3‰Žö5hA~ç¬]• f×mgpçŽÙ®6!>L„´x¥öXÑëÔ»°ñäñv³ŠÓ~ʶ¯§r¨ÜS•›A2æ&b“ÉEF¯Ÿ4BHhì<=‘u]i†ƒ‘'XµZ=m V ‚;y,Ÿ*~ÿ§žd@«vJþlE$ÞÄ6¤Ø{l&íÉQŽŒev2—ÙY¯#cÿjƒ¶"`ˆ"¨Yx¿CˆÎôÊ%ë"â/é{«¶"ò“»ù; ‡lÜ$Ýœµ{7—êyGwÛÒoµQ´(ò¢óãÖýw׼ȉւ–GÚx%ÍVœŤ©r1N‰×LŒbWJ+P‚a­MúÎ&¦;Ö„C€8ÀŠ›ª•Lzmü0 Áü†é"ˆH°yv¼ZÓÜ [ ݉fÙ&gýÜ[—$.éÿ÷º¥¡W/]g¦.ó³%9G‡Z—¡ßz±vq¹ö˜xsÇŸžþû‹ŽªþëÞŸ_‹Ûl@@°s•½µ*âlÔk«-)ÜÚµóÙvÏ‹ó‡ã øp0Œ! •¦ëâÿý‘àÍ¿y­¤ã9\‚¬cÚûqn—®7M×…D„(,),Ëu÷>‡ÌË3 ®D:ÒZsÄÌ)„! NJàTœ’Eµ0ß/Hi¹nv{Í)Tk嬙Ž÷滂º]/ÐB IöY’Sq箯õu¹J¶·å‡žŽ#q0NÉÌ °óÞ½sÏŒ,6‚£7½íÒnë"%[û¢õ²D™ïn¬…½\†'.­)ÐHš%’weùéÜõß{çÐóÙ™ Q¦BÐ +BË­™z•Ø7ñ°A1Ø,Îp‹QA‰óDfçñ®›·Íz0ètsLD½–’" !ò|t$äO¼øcÏÍrì)þÙ‚ ¡°TNgc<Ø>ÅCÁäH`D»R—Ó“9Fœy  è3 âiõ­9…(F»ZCžV_¤‡K¾Õ ÎßlÕë7"5PÕYùÌèiÈ×KŽ@ö;HÍ‘ ðÖ¹zfé­/Âb…–»]16à˜q9hCöÉøõ 8d …ãpÐo’@6œ‘î;㟆´˜&OÅŠiâaVfZÖÆÒ®X‹jºç~é±TV3jö@ê|ÙΫlqìGóBq,3äDÞ7¤ RLJCšÊq Pö‹µÈ †½ Y­qz ÷\|½5vþÈ#Â⿵þâmA ºîèžÊFKºÓŽ2:@Å‘{™³Z½@§úÇ!m'Ç449™Ü‰±Šø.}õ'ËâtXeÓ”ìFØ´j¦Rã$’Yp\ñ€ @$)$‘]ÿ訠ÞÍù¥N?Št¨X+6`ŸÔñ~’!¢xrþjL¶íº¹±º“©•ò³k6;¡%%°’"²Fœ•«^ª\5ÓmF—¼h(í„f!C#"^xµøáãk÷‹û–ßíLçœ5ᣈúîî Èp8ÒzèùXåòãþ¼N±Hzáú¾óÙf+´š¯Á§wn5UL÷QHÜngG[VÿfqµÞyzfUšŸ§HcÚ 9Z<†æüöc{]·˜Èv›ª A€î€V‹~O‰Œ[:7ú£„R:µ§‚dŸÃ©Ó<¦t kÑ1ÁÖ2‚»Ãu÷T'©û~ƒ°˜»2b.ž{¯ ÈîäÆ"%ç¢úTöábWt¤Ç7æ²Û¯„Ê.ø¥”wϬz5+¢¦¶º-ÅHR¨À‹Ð®ÖÖßÐ _Í/µý.£F†¤?Ý :ͬK. bƒÔ üH €ÉÐ_cJóJ¯00öÅI³‡Kúü¡ÐÀ$Ó›bJ] Æõ§³Q#öM)¹¿sT ¬xßðQ›¸MCDJŠ×¡ìµôoH@‚c‡ˆ#ˆ„b矒²‘±ôûN?Ø{õ~å|ñÕ¹ì©s¯‡ÂÌ¿ý÷/§)ô Bæ§vUŠØ_Ö¾f$¥]Ë__PvÖjzJ¶~”ä7ñÐÁ˜>ÿÀHÔ'Gê¾õHhdõé8Ôˆâ8vLƒZ(‘: Ÿ$ˆ€„´ÈÙ‘óCÎÜŸox¯"Íš9Ò±ñ-±v°Ù~! e¨°q \BD Ër3¹‰iÛ­WG 6{ -Kúë½(iKŽƒÊUäâõÕ~Q¾dõºžßKÀ"ÀIºpÒ rb‘$@Öýw×?—½Tܶx½¿?_êwI†rsg®Q²föyÖ»"cãñÂýPC ów¢§¦tÛ³¢Ksçoo *@2ªn 'ß¹Þ™vë>ˆÍ©Q,!2ÅvGÎì>tÐuó%ÓëE^7²2Ø@ýÀ"êõÁrs¥c•ïþȬѭ}(úáŠCœ¦äB2å‹'@ÄÃlܤ Á€rbBMlÍ1â£{]M‚A{u& †ZáN(Â,~b|íQ=$B<à? ã—•Fx’Ìäå¡1¨Ô³6£nøN°0’e¡ßÙ.U»ïßëôt¦^ZkúmNÁ<û@ãÆ=ñõ›ÖŸA$Ù¦»Aüâoð– dâT—€Ãе!É jFÔÉøpˆÐoÞZ‘~Xqd™¬BðvoWvisÕ³÷+Ûf‹Œ›/ æ·9”’˜/ࢶäi7BátæùŸÒ~Ïw¼™ýÙ7åŽC뿲N?ué«–Êüw;ÿÓ/ØJÿtB„liçtÝ„­ núŠ¥p¾µ¥í<4¼P›ÔѸ%‰ýÑé†sX"Ì€›¨MÒ/;ƒÖFª§QsJgÏŠS?8a·d³8”y%„B€Ìºg2ZIjÌ­´µ2…?€VÿÌo£c±%$p"LàBd„{DÒÉ8Ùɺ©UË9Ã…†Q»§Ármm¨’_¼¹ÜñB”…¼ßõ"z0c5ßVì‡Hâ›ýŸýÛWžýŠS:b_¿É¥ý“.¹ܯÀò ÿÊŽSÁKÛ(ë_ìÈÄ ‰Hpù¥¿´>õìvñÚÿíîïÿN‰,‰Hí?¸ž­*qé;¶ŽòÿüËyFD0ˆ°6o–6N Âôν®Ì-@dæ¨NÔ¥@Ú‚¼X®Ì©üäÅ@h™úùö ëÁ Z-ùdE’?5mJ›gS¬qnJcÙ†<_¡ 4£ÎmŸŸ %ˆüèj'ÉŽbFÖM±‰LkÖÉC/gT@VΞÚåFr6w{RmŒÒiB™+ÒƒÛ­Nd—‹[[AW'W5QLÒ€…ÓßÈìq8Ö,M#N€¸_å4"hˆT7±¬õЪ9Y2Ä–©Úœ*Þk``ˆ´"³ÌÙ cYÒŠÔ½£tI#ºKIb:´`ŠL~ƒÙ£†$˜‘äø³Ì:èzK¥ñ‡-{’®êí=øzÄüO~ãEN¬žDg€zA±ÖflwúZ‘«"¥‘’ ™P ,‰?5 c³çë…ò”(èÄdAqÅE ˆ=iXqX>¬9Œ °N‘m¡´2Åck îάôúA¤t¤5ÇüŒ¸T„I¦[Ä!ôGò Žëæ&G³ÙZµR°H€·¶‰èµú>ÛŽ%Y‘ˆ”»ä¬ÞZîG ÙJ®ßô¼@Ñl°Éu;‚H$rÂ{oîüYnÏn̨mÎFDОvšy‹ºu+»ss­‰O|Ô¡(ö–,_)Ÿ)öûì¼}tçŠOû€A°ßÍúع;RE‡wÝí$^§zÚ4Ž13±ëpA*v’WÑ$èòHß4ƒÐk±, ÷Dí§?è F”µsáO—-*ˆM]ŤyÌ<’E!ÛÕI165Yd Ù›€AO³`­I)u¸öÆ\ˆLåÒ=Ÿ’0éc‡‚ë]è!@­rÏ^o‡déˆv!W9žÉ—âÐ-í-Fi[Z@v$óèÊbϳF*áªßó(%@'.`NJn€~É çŒ‘ßÃ4¤É~CÓ 3I‹w¡I!K‰¦q ‰ªHÇS˜øL‰¿"ü" È|%£õ}«¶¥ýö‚ªaöþ²VJ€ÖÉ£œ†¥¥^l4²Aú'àXBçù§4 Vý~›y6Ü_y§[;µõÆäSÍ¿Y±Ôï>ýÂ7ºrH ÌVÎÝ_GZÚ [ ¤c“=¾z½‹Ùb»FCy¤±ÞHã Z9~bävU¦÷³bmFô&Åšca%cÂJ¯ÈŒdbQ¢ ãkɸ¹sBñÒüŠF*R:pJ&aNóI’ü¤äÀJwe(,!\ÇÊNŽç •j¹à FÆhuM’×îøàØ–%%éPÉjañúRWiÉçºÍÀ÷R2ÅÁœ'ÉF2d™!zðÊÿýÝò¶§§æßÐí‡SOVµÞ«Y]@Þ¾ßx¨<ÿîÅåHïúߟu éA)’Në›?Úû[ÇëÞßÿO…?=éH („@Š6înÕ…jýì} Ïþ»£ˆ„‚bsˆAÛkA²¾ópMæGp²e)?ò}1Ø6†=ßÉZ¹3£?ùaÏ”ð§ƒ_¬Ú¨™Éä1èt jòÚ†¿kLXš°PÖV=_Æh&"ÝÌ8WG*¿waÖÓLvm£-’‚–5/³+ ³Þ*+†l ÚC”N&ã-8Õ|F"Dm-{›!J)Y«Ð­»7|ßÊ×i9êö A›¿w,›ôd0xä’+Ý\Ë0¹§!6¥Æ™ß—Ù<°Â€~t¢Ò¥dš7ÕÄŒ¬$ÆT aÿ%ã:­„µ÷óåuÞG6P®ò€g#¦ÇsB"N…ŒCÖ€ØõiÊ\H‚ÌS™ ]«úœ``¥{¤U/?µµäLÚËÁ_-9øÑßúåßvD2(Š’NNX€¨=)ÅDB¹Ôì$u©aÞA|éÅ¥NRJ¤š;k¬˜©ï*fø~ã÷1Ýp˜ÊL3k`kI8´‘ "¢Ù³“Š›³›­žE¬™™•†á¨L«º¤Ä´á0¼„Dèºn~r¢¯ÕËyÉ̈áF¤îŒŽ#%!+)äˆ\¾½Ø"p‹ù~×BË<‡åƒ¼Ôo·—¬ùþÿöî¾ß*_¸][xË}î ÂL¯¾á1—ŽÙ7/L¯^ã.ê±þñ¢0l`²£×þ}ðüÙ)›áÒÿãþ—> D! nß›):üò7¡¥Õ÷„LD±Â–ÌõJ£ã‡F([Î"²Vý¤òCß·#ËÒ=Îf-ëàøK?êHPÚ™8ýbÉBÊåÍÇÇ SýŸf Èÿ »\+Z̸¸FzJd!ðny{‹¨äÎûÙ™i%´ff¯Œº›˜¥Üœ==IÅrÎBPíÐU¾%¥@V¡ÖT*ônÌ´=ÌTÅR»×ODù ‚` P׃·)MŸI¦&ñKÅÃñ“R¢µ dc/ÑÓ–#Îit^+= àQlÝç]í[cu©©–½Ö,GÇvK‰&:pGZ±D'¶GNfs&9²p~§Ž Ûôpu#3ißÒù=½æÉÒ7ˆ}áê7¶$éä¥M2¹ @Ô“s¨Y)ÆŒ^Õ(Py*‰ÿLrˆÒc6æ'%w!0@¶’-VkLZ›¥ =œ2xWãQ‚!ޱâT±/PHéæFÏ’bð–A uiP&$=îõ ,5 AÀ¡: ‰-×qsã;‹n¹R)¸€m®(7ê`»®%‰4Z,‹™•‡K]O£]ξïG 8- ùí!§"ì´…Ô ÷“ïx'¿2ù^÷ðÌÏ×Ï@¢"ÒÚRÔfG+°Â8Ø §ÓIæ®é  õH¥:>í°*%N•4:*1êq’Ø„ ÙWBYm5h¥£Hç÷Ù3wï®î´MY#,bY(}åÒüTÈlp8ÐMbì)D"¥]?W›=PñFÇk76vЃ^OÈñ]Gk´–”x§y÷I׈¸å‚Ùï¡àä³.d¶j%ò­dž$À°êÎM[×óíÛ½ã#­‘B³„àDk}Ø_™ÚÛìu¦È=‘_ Ùb’> ¤º·£—FL9æêÒg.îïG€À¨M£Uu»¸ÿh¦ 6.¿ÐSÙxŠkšS9>ï”F‹‚Xr½6Ê•B—ÔrQ¹gæôŸ[ŽçÆžçol¹ +Y-HòÚg|›4¢ŒšT€âŽ8£‡Æ‹À´{¼n‡f­:|ø½‡‘ˆª×ïõtæTþgéF«=$EêÂõάzhP@©B±p~œFGÚnʹÍÃsùŲ*]i‰°d¶[LOÝ¡h»A+ÎÉJ!¥p‘B•ÿük ÌÜÞÈí,‘7}àÖýܳ^sú{ßPÝê¿€sK‘ ­¯‘0Wœ><‘¡î†ôZÆ çØ1¾ºè<ïѰÞwðÒ-~jáAîõõك³*>¨Ò<‹Á¹g=ÃC€FN=Õ )î|rÇŸc —vv;ý~d…YØaVT%S˜ìbÉâ` ‘F¥É+–Ç_¸xôЉ£SI0ÕFK°Êç}×ótL)vî<é‹¿Z ÷ºAd‡Ò^0³Å+H $ÊAâ ÒG»ß{%÷…Q>Q Þþvù“¥Û%ݰÇ:ºì¼¿rŠîܾ¾%ð™9•óL*V”«~øÿÌ}áâDÈü£ÿnóWß𠈂Zk‡vo6&5þà†R‘|é_Õ„4$z¡XÒªò'ù…RÑAÖz‹µµ.XÂ…ª…’ãž=ôã?m)f(Œ¼¢¾µ«Xã½-gL†tW†"-È éBQN½œ+”‰t ˜xîå‰Í]}¢3ºÛBŽÏĸ—hµ(¿Ö®c³”X8Ä/yg¦ûõš¯íåÚÛâ9ÈÖ0{#…[Û‘Uåz°iÓISªÖKÄ¡"˜lfuK¶­‰Ýa {rØöGqÓYj|¬b2™IšÉÄ–¨¢‰ žy3€ø”)0Shn¤¿É+k3Ì„®xK•÷nZ©¿ MZ« ¶—ä&8úïUâ_ÂìHfpðð5 Øî&Dkå¼Cs£Ñä­¿R¶ò_×þ§k¨â?Eâ3Pb›g •@7ì–•X£¨¤saö[Kä‚ œ&ÄáSÒ)r&ª#£}U!²- ^õ Ú%(”¨Ù–(€ŠhW£vóµ7Ž1 ,>Xjö¢0æxQ'q”l:ðÇ!…f’š@$ŠjíºžöÊcc‡O?u`²^Í«l{‘+•óå±éšï{žF`å*-­Ü^îšÜr±× Â07¨ìÃXc8¼ˆ*·ÁP`§nÁŒÊÁczôhâ¢r »ž®^ë÷‰×ûÏF[;RËÁäÙ'­Ô  ý¡ûF1êDz瓟[ïÌ¡Ønš"pßÎh–Ùço1Ò‡VÊÓgæò~½ê‚ @{£ë:ªåæ‘Ò¶„à0µ:v臰¯PØ­½Øûú¦“¿%!ê‰ÇMR]\Ú$+<ŒÕO±ê ÕèŒ[>:^ µFµ;È ‡0ô‡! ®×ïw)MŒy-J>]]YUI?³²^‰Ä-&f{‚!™íPÅ>´ïMVò”ðV!ƒ !ÚÚ_(yª|ÿÀðÂIÍ-H›Õ•’ÏŸß¹ÓëtƦäà^yêýVéÍ…Ç¥Q(_늰Øt³„iØøPø&rbxÚ\CJ)5ù/&-Ø(l5åqÇw¦/Þv.Ôôâÿhµü³ãÿÃ÷@ÅÙâC|Ð^ñÈìˆÄÕ}èŒJ‘?Þ¸Ù³åb«ØAú°¤AD˜²a“AU«MULÛùd@7@'q’YF0´Ê DBÇ!¥råÉÏ ˆ4ï-­õûÆDÂV˜YI•‰\ãHñ4ÿ…Ð*¥ÈQ®ïz…‘±é#çž»xîpÕsT:ûM¶èú~©6V-æ4(§ä5>é…"ªVî·ûñûŸiáaؽ(ƒ‘И0 lŒ7”­Ãµï?8åV›»¶uß9åèŽã!x› Òzýh~1ètǹúì⮊’‚Õ‚&Þßi&lÊ\zò¹“»û`XŽmÛ)ìëÅÝC¾ØÚ ;ëû÷bP~âÄé¼W­»(ØYï(Ç‘.•:FQTrú9{ÎÔÁïÿy‹DHO_°ßÝòÒ%²ÀSŸ3¶½KH”ìý‰$¢¢7•óg§Gu{ÓáV‰3(¼ÒzwPéí¥¡ ž˜™Ko¶ºÐEQ¤í­æN_FA·X*½ä{#e_!vö=»ÙRžB% B©n/ÝÜoÚ|¹°˜v"w û÷“Í`Â4„dK'ÀNžVdC¢äìmËð"‡–#éKA@2¬˜‚˜8ùéW'îôÔ:Ÿ‘SÅ|ô8ø]µ} ŠëãÝÙÐæPÃ@U):SP§j€¢@Qî·.2° ‚V¸ØôtõPþûíÙóîÚ¿ßuúÿÅ3ü—†Ò¶'I "¹Å≱Q% žÒ ¬XðUª,>êB©´Û56Ý b¨5dHÀ¡ˆJ(Ì›wAU²˜Ÿ,—ä´À4‡@o ľ‚dñ8XD: üã)B/~ºÿ!´hÙV„‹³ÅÛ{…¬&[óP¹»#"G.$+À´òÀä|CI¸f™È!ºø%0]î­>!§è¨½»wð´ü݇,ç~óú¿ÝQÃOi:Å#'?rl¤ˆòØéöm$¢Ä|õʶq‹¶Ù7œ™t‡³H²…© rò&ÇtѪrvÑcV$Ä»êÔœ=p!fÏ\œk¦ˆ”Ò¤t®ø±#FÀÜ]^m‡¡±–AÐZNrñÒñHŒÀ´ƒV |W;N®8>2sô¥×ÏL9lxh”9˜Ït­T™ÁŽQÅœé…QdãŒZŠõÿO?^,êSҘ̜äõI÷xqq­|Ð?XÙnËÚÊÑ lFXt´^>ÒYe§FîI½`yh-ª×^œŠZ¡n_ >wl£“‚tÛÅzËïã<2¨=ì ¢¨ÚS#P®H ÜÞˆÈtí«°BûÂÍÖi þú-ha úE÷;ËNºÅ˜ûÛ²s ½f̘ˆ@Ržq+‡j#Ôþ¨íD]D`²V{ÿ~Pj£ Í´·J?tÞ -G@¤&æ?Ôg7Bô*¹ÚKZ&+JwÚì5´&…h#t­¾wå^«‡•º³ÞíµÀÙ¶-Nÿƒ4Ÿ†¨¼’wŸ.ù3av¯¦M·Ð}ÙÉq‹zгC³kA†f!üÌ©µÇý ·ëÊ¡±oìz£ráG ý¹Æl^y×#‰•.YHº2§Ìû…²Å"ÆøÜùÿj†%ìÊæý°¨‹¹#­÷GŸ¯ÞûzÛú­åÿÏ¢jdÒCüâÄ©ZQ‚GºÙï €Ò¨F½Ë-㹆CÖÁ¾¼C¦'tÆ•§ÖX€ÖTY2Ê )è„dÐA©4cÄuœª:DJ{ÕÙ7AÙº±¶ß [¶"Ì<ìÌ SN—"ízŽãúù±™¹g>ñü¬ÃvèûMU"I¥•þû@éÈÎÔ¹ós9¿Ó MdQ›7œñ2ŒÃ²hJ¶øÈ´2ýÜ±ÎÆæ±Rg~~[:ê+ˆPÚk‡,L¯šÓÁã¶§òêdi¡ &‰¶$Tò`ùÅ5ÙÜÜæB¸gEbƒCOêN`ú£®¥Ã‡4I¡U#s§güâX‘ÌÖzŸ¸×§à™\¾5ú4å° ½?»Ï Œ#ç ß{’ì…(±¥ÚvL"h3ÝFZ Åv ‹€ÞtÝ:0î ½eMí’C‚`€^n¿³ €ÞœY°ÚcN¾.†G„$åãïÁ©ÕÐÉ—òÏÕx¬â)”^°¹Íj"9rÊu¾v{¯#ùZq³´- Ì)˜'«ð`0Hö4Wihr“ͪ?ªÌßA2 ÍBB3¯„D©4¹ø% í…Á©‘Üp ,÷F?l·i·å*÷˜JÝãÓÕãJ5˜“âGûÉS™þ¡1í9‰¸•§á…ëÜ”è‘zžEØvq÷v»Pð½©É[{'›¿[êÖWþû ²øí,Ó)—Ÿ=VÉ BoIï=BÔŠÜÉþµ†äªÝ}ÛÏÒy~4XŠ béÀäøüœÀàCUÂì„Jæ´él•b"Xš …Š\ÔŽS,½yÐtï®®5ÆŠ€ÄI€C¦ë´ D D­´ç:®“¯ŽŽýãÇ e}¹ åÙÌ É)¦R2æÏh7;MÖE)Ü•2Â#Ê€‰Ú<”3<}~a ˳ç«R½ªÌÎvWÙnÇ [,Rî4öu¹à‰–Æw­‰«&¾óH%vIJ'`1 ”²ÓlÈ€68áârAPªsNåÐXXµ/‰ô÷ #‰bÃ2zöÚíž§žlrÌw@ì”ó9ü¨F¡ IþÙíTEŠ%uú¨©ùŠiÕÛŒ\¥”’Є¶V×/7Zè×+ý eA’—ï©×"^Tò`D5øÞ%}%Mû¥A ¸ÄÚ`^(0d©‰PzYÐ ‘' ¥¨NçÙ 1E…Ìþ’~/ìª'Öu÷OMæ[åæ±þw 'óŽ×»#ñœ‹†P›Ã¢"”Š”%¢ëþÊ((έՂëû¹ryúTîÞ÷öó¿1õ?¿—nrä©96‚ò‹Ó3c"´×¹Ùgñùã»·zœ/6º‘`YpHe­#"Ššœ®Í¬2 ,Ü£ie ©dr(ƒ®?Å*$»ú,URsv…¢Hk7Wœ?ʰ±Ö0}kµñh7–"e_øP^&)ÇuIçJµ‘Ú±_þµs¾µIÇÇ`vIˆO 0Sa3‚pÈ¿ú/_+(íhå*"à8»8 “ÿ)Q ÄY˜&ÃÅuMd¶.Ó ùþÊÑ»ßp¿ü¥âÚ%û˜ ìÔtÙGÇW¢s«?®Í¯]¹¶ÅøÒïŒùy ÞÅZrüÝÿö‹_8í[|ôß¾÷3_)‘R"ˆ¤Póêm©Fx÷«†³ÿ×7É–¦ÍS¡XŠG‚{›m” Õ¬µ€]¡m¿J]ÏÊyJ€*g'¿ÿÐÑÂ"@`¬¤Èç$*‡‡ÈX’]dðÈ! ¹õJEÁrÛFE†ÙöÏ5¶‰”ï,SÆaN+lÞUfqÄÚ–ÎÍ*;¾®Ÿ‰üŠïp;¨hMJ‰Œq îڭͶ¡J¥·A<&8S‘bMšûÏê8Q¦’ôAÕ*Ä"™¯'ÝQ¤F縟 û( ‰L/õ ÇÒ€$À a>0˜¤"$!ö'Š]­‰w[—”÷!©¬‰†Ö­(xeDi…Š$ ÈÒŠQ Æðë’“F½ô-F¸¹šÏùˆ…¦¢\jE_¹ðGßáDŸ?!Må´5‹e`ÒD´CT mÚÑ¤Ì zz¥ŸÆR¢0¦ªµ±Q+Ñ£¾5±×ŽâZ~îè½Å~ÔÞV”³ö°÷¾=åýdEYêjÌ(omÉ0$æùLR@0ÜO'ɰ*™(¥Õ…ÿºdÄôMïJ£ìûž:\¼vdšs÷³_þ›ÿÔwƒJˆž”ðÁ)OM×QViV ¸¤ýÉû‹¬=·Ù5üÔ˜l›dÑH ´ÉMÍÔgçîß Õÿùä§·Ué 9E.eŠ1ø4þI’8+R„ˆèº€®ŸŸ~Ó”G÷wöºQd,‚aI89©x –@*­×Ѻ2Y©½úég ÆÆ/¿±ItR鑘(ˆL?¢hP¶§áô莊g_V[6Kx¨(3¦ÔðVå©Y`²Ñ$eô^Ý?2·¸tÏžiî[P%$o¯ÍÆ¢E.UmlöJ9¬YnèH$Z&­ÕêÃÏr³'rýÑ'ŸiïqŠPGìí`=¢þ]š"¦ógõ¡²®Ö\j/5ÛÃìzÊË9|!ÎÍø·öÇaí8&¾y×Á¸Ì[¡X\õMÎÏØP›-Ÿœ‰š?5?š » t»¢€ž§¬MÃ=É‚c%É”&€7Ë›ºE ”>¾±YŸ{è«gç \Ï+°ÃÐßeO£&°ÕµÑàÎGPJU£4³®Ó‰vòÄ·ˆƒˆ‘…©/ ¹Ô0È“,:9-§üëi"WRg%&MQ2"‘a²˜¤•:¿S¼Òján_; Ý•ðîz§ÇbƒªòG ôa”ŒâS2ßN¾ôÇEüÍ ÆÿÅt„€¥ßõ56ðˆQß½ùÂ/ÿøj¸ÂôÓ¦ÞøS;¹òùÊÀ#îs¨µRåÑëë‘*@#ˆ8ãààÓ«o‘»ÄÚÚøüPër3§þ•胯[]«õ€(˜*¦pˆ!ŸHŒ¤Èq8~¹üÊaÙ¿»Üh‡3³ˆ0gxJuC'ˆ+í::W*Wžùì¹¢Ž‚À 94¼Œ±ahYXÑðo»+¾9wæ™î–Q©ØX†ŸÒû"3¤štNŒdI`vëóÛëüœ+x´wül§û„®ìt!BDŬy¥x|ç ш*ŸzÔÐÂ)|›P5>ª¼î-¦åG^ïmÆø=D1m˜‰"u_Ï* õƒ¨ªE‡D‚Çû@Ñ~Ć´F?§·ÝÚ~¯4ç.¯¶@ÿºsöð÷®+ÇZH–Ð4äŠÏ(‹Ù>%m¨Ó ¹8îTŒ_骰¡V Ô/ÞºÞ"T¥‰¥½4ö!Þ '¿`…¯NìÝêê ï>®ž¼¯&/ 7šwl/„ hQAY.Öó÷nlA±VÛkJÛdó#¡jŃ1tºº¥Œ9+OaÓÃDÒ¼S|z²z¥}LN|J:$vP"¡\ö?  Ðô?¶—yW-VŒ£/™‘…yºn"ekÂÂ= 6ñ·qf>ç49WRœFRû’ÊÿÆsV!ŠzÛ«Ý¢«ÍŒmM¯Kô—µß|ò߯)„¡(ÔDp¿¹n¾|¾Xc@y„6[-ÊUªZº²kœ¢i„&î¤sÿF$ z3cãs‡ "@·ЪÿÒvg_¹À{‘dUãH¢¢$d)éyQ» ÈÉå¦ÞtäáãÝFf6"bR)"¦âÁØ=ì8ž£|¡R?ÿé‹k8ìvC7ŸslÐ7Yåa­E A¥]lj ާ¯pZò –ÏkïÅÉÒé¸r‚Þy°öÛ=J¹¢ ÏÐÚæáã‹Zz8R•–ÝŠ@Å_6BÀ„ $«Áñh9ÈùNéøÎqÒþ!©þÍþSA·Ûx­°i8íœÐ6¢Z®[ÍIŸAs¾Kˆ½ÕPA£o™´ èjeÜjÛÎxß¼}xõὓG~|Tš+0HÀ†á²æã`LuAÄÄÞXUMÍMEhñ©V?NÈE‹òŒûöšÄqz`q0CÎÈ@üÂî•Hõ‘ð¸¾SzîaîlEÕË1¡×i¶Ek" ûl½‘ÊÖ‡+Ý>Uëí do¿¥¬°xê(—Lµ‡™†'žad/QöíÉO ý²o<7£D‘²ƒ1óa¶ô ø„£lï5À G¾üúÞ¨MO´V Žœ½4S§ý}fÃÝI͹r#¾ê†®Z&É„¦™‚‘Hkÿ _Vb%4»{kÚó=ñBnsùÈK¿þÿî yê ÍŠ"Ôn¡~¶\ÀpY7Û¡€UºãæZ#rJA/ˆøég!³Ù¥otf[Ÿ¯Ï™Ú¿ÔSM¥ÌˆÏLS¯œ³{}~ê%KÍ2Ù41S:c‡£)×ñʯe€æÍ•Ýnd¬eˆP„Ñ JLO\y‚ä8Ž&Ì þÑ7^ ˆÝWên»Ùlö…Åo'DTZ;Zgù!ÿ›…|b]?WYmÉP’ff±§ èi6çº<þO£‡ö¶Ì…ÒCÃëUær²^Wˆãþ^cõX”lӱΓŒ8•3›È ê$–kûpùÙã¦Ý…þûæóókmb‹¢@Pq;¬¹!®Ã,"V !ZÙ²^ÔêXÐHȘwU K¹Ÿ|³õÜÊßËþÎûBò1)>Iip‰R?Oà@ÃUˆå±‚sxlÍ•¦ÃmÚ!cƒ±ç>ºÑÂâôÚ.dQ*‰˜8þ+ì©3½[´a¾vmä¹ÅÃ3XŒ) b› Ýf_k"a‹‚#åÞåGí>Ô*²a‚V:z‰£Ò `ÜšƒÍ„ççLËe’Í“|€4ËSœt‘Ål̓CâÀäÙgâ žjX&€ü³ ù~áУÇÓn:Ž‹ør靿ÓúÈÞHd‰Þ´Œ¿Óƒ†Ä ’ð&¡©ƒ R¨.üvÎr¨‘ak«ÕÍ9é©ijüèœüàSÿáQ©-’+ÓÄá©tiòh5/€ý ÕìÛÐñ•?ºy§ËùR·×Ó[²t 2 $£7=3>{À¼ýØéî«Ã×n´¦}2jò• Q³+œ5-ð[*>’û_)Bå‘Ê&¾¨D샇ký~h­030Ç"¥ 9®ÖZ;~97ñúg‘Œº­Ð©ôÞÙdFÇó\¿ÿ–E)¥•v K‘ ³Y›¥APØ;z*\”ÄnÝ!åŸ<ý9 C$ÛÉäOs õ—wO\Ý1лÑ:VS&‡¦9=¹¶OžD€7vÎØµ¦S¢ü©Æò`ÇÓXeåþü³&lSx«ûìÙÕ6X‰eùíVeªS-x”>ÄÑΖÑQ'`!E("§îõsyçÚ×[rro¬‚µü ‰)LiÂtš–3Çô1>ÍÎPHª^óÆ—DÔÊÃÛ= ‰}ÑûÑ’TÓê¾IÇÖÙ‰( §_„ë=î[DÒÕã—'žµÚ¯—bH·¯ÂF\­ÑXËRƒ·ö{\ªø[ݰXÔSÚ ©+–ïP"7‘X:šrŸúzq˜²™âöâ“.¹ð‡â=$q›HŠÄÅL^ÉóawO5Sj\ò¿V¹ÚiãºU¤ÙýäÂé\ôÍ9³ 2Ï4g=oýq¢YÄÞ—Ós%ÍN¦3¿;cl—\ {«½}sŽçöþA={{ìÜ_ýe¤ á™Éþ2íaµŸ?ppÄ æÅ%£ö 7±ºÐ·¥|»ð@’}à6ÒN~ì@ml~Œp瑱pWõ£{6Ç lÕÄëy·/¬pˆ¿œV)!“b¢g@"¥v¼Â+‡-àöݵ½04Ʋå PCCÓR®£´Rn¡š;÷¥‹®ä`?(Õõ+WW±–wýœçÄK¶€D¨I wˆ )rwI@–Ú³ÅvòC~CeM"BÂY*v¦Æ×‚5…ƒ›;ý w#Æèqp²èRïÚìÑÆ>°Ôh ÷wN{‹»P.øg›Ëƒ NÔzÿZõºÙ1òàÃO=ßÛ&ˆDý†3;=›vT>ØnŸ™Œl»•qêäò·þª f6§'ñÑW»ÈC³LÄ2Cduôðf{¨³&ôf þ±ñ)…^jklckÆ.Ü¿ÒÔ(ùɵÍTœ3€öÅpl¬|¯ï!’*]¸^9_‰x¤î `¿áÈ^›¥H ÛÈ÷_ÙîE~¥²×ˆ:‡ŠwÁ84=^Ûg„è$Ä‹Lo¤Èâé‰{† ©7Ëθ~”JèSørʯK°ì$ÍKÿkŒ•«€È‡¿b?ˆú¼ÚÿÔ—šoÚ÷¼Ã‹]ÆL]IõÀ¬0K¼øKãGâc`:|$ÂÂï^déÙ"J¸Þ7{¾rAOû罋ÿðûm‡‡ùç2#„Ê+™­9‚¸»-{=±€ä`~òÑb Þ~?²Ùø—êôüL]*?1=1Ŷâöw›ôùZÂoÿë?jxññÿöÿñs£$D “_¢!©† W €H‘ã–êÇPl5Ãв5ÆÆ NßSaA帮£´ã×F§¿üKól@ÄôšÚ¬þè/þöJ³6]r}ßsc3¯0 ‘râ·?ãÅ$âËx£ËlSËq² 6ð©ÿÓ+Z;Î …0E%ÉšU<#BDR*áÜuîÒI÷Þý¹iE èËŽƒ€åÖ__>Mèù =*¿ý=·véƒ&æëÓ¾ë¤ÉMbAùÑÿé¹Ïœ(=ù¿ÜûÊ[yGÇ êº}NÔ9á)÷w"²íE1÷÷Èí«‰‚Ük¢Ø­1Ì"33RÂuãôýOW½±€‡œh1L“ãhbÆjÁ)ÜnAÔí0( ,ÆcönSD¨Ê›ƒZTLüb n5®AX«ªŽ[4•ŠVˆˆa›¨Ù`E"…꺷zk«Q±ÒÝ3 Ý e¢";úê«ù&S:—4b:#®Æ¸CEŽVŽÎ{¯œµ¶Úý¾1Ì ,'$ç¡ ‘v\‡”öóµÒ…/œQ†Øô¹Tk]ÿ‡kûª2=_v|ß×Io+˦‡×ö™–ˆP)Eå)܈âscûœ\~IuT”b(–Ô'Y]ÊÚâ±ý-õŒYŠ˜…›§"­E×®¾?ò†³ä*²–Ñí/˜^Ú„‚¯Ÿ %©H7Þ!Û‡‹Ÿ8Ýïõ óîì[Õ–x1ï”ÌÉÓéqµ×W¦c#‹J@¸¸£9¯ZÔ“(¼U(ˆs9Œ ËOù˜0CWÆ‚À÷Œ™ÞŠR'­€ð¦‹þÑ9 Â7WŒíDfc¥öüãKûŒº0¿¶®ƒRf_ r?å.-‡¶G •÷üÊØIèŽ5!wŒê6¬CJ« oB®Ö£KÚ}SªÃzvcõI:Jè iñ5ˆÎ”0Ÿ@éâ Nyjj‹é'íT—ÜSq¿q­š­ESaÆ^Ôy•$³$î$ÉâB(©L‘~õàƒ•>4ZZc$¯ÉßÂÙ³[³7J‡•œ|]Û"‰äaÀ8K®¯¤)VÌÐÅßõ8jbQAc¿í;Ê`áÐäÊ_…Ÿ™wÿ_’$Ž ý¨{öüü‰ú( ª Z¡‹º^¾½y9µg"‚B TM‰›: [A~º~hÞ${u]»=TkW«¯·[ª°òþý‘QmmíÙ×`§Ç:^Å']7f´L” •V¤uqâ³¾Eswy¿Û¬ Á $aà þRˆ”ÖJÖŲ;ùÉ7*Ì(Æa±Ô¸ò­[{N­>9^p|ßõ(‹/C"|ʾ'GXka¶&bTІø®ÇÀÐó{›–0'ª¥ø[&…1"+>—ãJ ­™VöŽYl034GFGtãÑe|iä!ǧ#…ËåÃË;¾WÃ…û±ð_0κ µ~õÀs²×“ðý/Zk!ÆP”ʱCžÊÅ3pK¸¿c¡õ»nÙ5“íoŽ©Ë$4ýܢΩë{=³]†H*4ìòŒ!b¬yŒ´@htRWç¦êŒôä {Ø2@Éuufìû"BËÝ‹SED JäX$Ÿ.¬,EªVéÊ‹íñqŠ¡wûÀ;]rÈÛÂ=¸Ñìšâ„¿Ö5]“D© eÉÇa|O³!%‹P g?5††Ìœ,CðÝAÚE"žÄ†¥ˆ öWœðìD@%° *1x˜1Û¹`þ·rïõÛîjä(áÊ[¯â'íw_Ü}x~¿©ˆa²7këtYl QÂ4Ð ?¢¡‰&ÿù$›vO¡·×QûCèOÎ8¿<ýi¯ù?^S”E@–ƒˆƒü"D¯P9U¯ˆ,ÛnÓ0Xrs®ì¯`vM à Øt?©Kœñ¹‘©££Œ –n15wÙUcí»·ŠgÏ9Fï~ð¨8¢­Tž šm`²a¦¦ï&i•vó…WNZ µ›»{mcm,2U‘ÖÊ!åÔòþ™Ÿ=©­€5ÆúÅþÕoÝnèB¡6:Uò=×s<¯§ÿì&`Óïõ¶Q¿×nîl7{–%Ù–1W.к—ØBŠ )&tR×Zd±¢c‹B"MR˜ilÙ‹ÞíDæâ¿*šw›/Xo+bÐfÍ=¸·ÑÉ郼ÄÄœp)D`ûvñ%'lEôhåÕ3]ƒB…ƒçÆ]7çd)Ô:×ÙeTXÖ0y˜?|ïàØ‡Öy}ä}gœ–¬I³â Lj²Œaá èK<äô'rîÜÄ” 7v56{’²¥—VÞÝCr¼ÙݵA¯lbHAÙOŒîÞ ƒàäGÏUT®q`Øé6A+",Gù‘ÒãË;À+í·M'D•Øp$ÃK ö%-+Iù±ÎK†F7Ù„cÞ ÇJ½XÒvø)Fò{ ÌøY4ßд”2 u–$Œˆ4÷ ò=lÚUTîükß^—_¸ýÍ óWk‹ÌšQ-úG&!~ìöø”h)~˜ ‹¿õ,›^×Tüp§Û×û¨Ù›˜¬®þ½¼v<ü³¯›,Š)‹eÁ4(Y=¯zªVXÇvNjҞå«mörÁ¾ Óù»BÒ i¼•›œŸ=¢€?hP'R¢¦HöoÝ1Ç/ävCgóÒ£òˆ²X{ñ¢ÝëJj& ÈF­€J#)¥µ¢\®þ¹œ ¹±´ßíG6îX²Q."*G+t´W,V>ö™1Ë „N>ºùí+;¦èzå‰Ñ²ïå‚B;WmËÄ7UÈæäÄôp¬p·O©h"œKJá@~v~ÿN_ZJ9µò‘Ú~ÞUš1j³ê5"­‰±ÐH¹}}©8•Zg;ì†2Dd‰”t/’E˜K"õÅë9ÝÓI˜Äž¢4-a‰§è¬ @äL~cÂS³OörÒàœFŒ "Â'ŸÛ¹ŽA[imÝ“'ÿHê_ø«…âK[»g›®0#v^ŠÉSRÏ_Òà ¶ Éý—ôZ!Öu»m±ÛÑŒ…ÙQýíÅÑÏç~øûM•Œ$`h5%€Liïçê'j Vt«k€Øu=g²q³c½|¿m£Ì5”° E†B1âqžªÍŽŒ­YÜøˆ¸ÑTd5Ьã½^8~÷.»îÿäa—áøsÿkïíZ@”XM‹)$›ÇYG:矩1Àúj«šˆ-sŒ`Fˆ‚HDJ+tÜ’?óæHhTÉ>ºô°¡s^Î/ÖÇ*y×ÕêiœWÖ…þZBÒ b-+¶„Âl–WGGF Éø æ°>_ÿÓ[‘à l-Z@·Pvuµ4;YÒ H“vÀD–™%ên/®wM»ZfÇ«wOÍ.¼ý Ï Ùþè·ï-ž&zeë¼õïýg¾þ@%ßÜáà —{ê þþ©Ž¢Á ‘ˆ(òø[[?ÿ‰÷4áñÿû·®ðv¼©“'çÅegdÐÕ þ1yìŠ5a3¨8R>E_¿{Ì{âŒ7>VøZí¹VS ‰I«’HÖŽ&æd(3[¶–@t+/*A{·ë@/!²(ÌõOzà×·›É½L äÓHXBY—éH“òý‚®…‚"!«¨(­™1’b9¸·Üëb¾Û‘é ~ÜÄ"(”¸ícµŒ0¢€Í¦™Üì§3]0æÄA6Ó´hN[ ÉV" P('àK”lW&‰$],$CI*ê .©ÐÙBšßnúGúwí¥OžûFãì{nàD»árÏ™šoˆÅ$e|@ÏÂt&”h+ûEdž­~¿®MÏz_¬”gÆÝí[îÅúÆŸîé„ÜšéíÒÛ6ý.Ié¼ç"XÅ–âc/ ±(2Ð1b7Fp~1W/åÆê€@ýÛ¡ÓoR*^º+n}÷Ý_8qﮉ<:öùY éäÑ;r}U²œDä¤=bV@ ÉÕä_DþÂnËŒñåŸ6ŒˆŠ”RŽWÌŸykÊcÄõ¶~r·yÚ-¸Õ±ÑjÞwš_bÔ–A°1ˆ¦˜£hÒJ)bÃ,HBÁ“­ÑqMÌ@ Ý•ÄÊÁößêØUÉÏ;VÉÕÆ½4ebhà†G ìoôú>jôÂîãÉù{ëgï<1ÊÊâöô¶ñ¹øskýûÿÃoüüßߎD˜¼È¸Ñ>¼v7ÈÓ'áÏÊZĘ¥+À¤(º¼óO?ÿ£;[øä_ÿîÆÿ¾];8On>–Ï€°!%ìž.Ü ÀömµÈ…³Å¿x{ÄT6ÌÑúøW÷^ï´Ëµâ¾6Yy:È}ŠÍH¶:‹ÅI•TÊ›bµVÍ'ÈÜc °,ʱܭ &¥ªî“8gºE¼ADFaÜ£j¡o4è|~ÖsŠ.!ŠpØCitÈÑlĆ~]ß»³ß7¥Rn£kº¬dHÓ‹wIDˆ‡ñ4ñ³;°ðd®Ýa¾iziK–ö*”RbßäháL ”r‘‰SY° ðbµd¿YL_ȈP:$Kn[·DÀ?tƒÓ[{jëÇ_½ûê%/rÃ`»þä˜zõ6 7é´#U$=™øÍŠåfØ”:5û¢ŽcŠ3`>Ú;ù|øµE«ˆA˜Òi'˜QülyG †"Ö *$†œêYåæ í=„ïK5ñÉÎX•«ùñ¹‚ðÒ"A»oŠŽwdD¶÷ö/¼vîѵ.ܽ}áÍC`ðì©kÿùVǸò4^i! BpýÓÔúVÐ k”{rúÇÐRNÙ/½ö1ß2ˆ t¡û“ËëÊq•ΕJãÕ‚3 ~§ í[%ì÷#*­•ö¬‰Œ1†N0N6Q V«ˆ¯‚l?ٻߘYùèsg×ɇžýÎWׂÍýZ훽õûË_ª\nƒpu¤Í½ðÜâ½âéƒôÙüîy}É®\»ðo~åSÅË[þ»õ_©üxì@Áós. ô­ ÷ú Låq³Ó)åMñäè·¿÷««½‹ë³D;âï–ݹ–(&N@ƒ6ŸÖ7źÁkIe­*y=S!!~`ÐZÈÂ`r³ú ÇvÚéÚY(¾-%AÂÄeÜüŽu9_˜Ÿ 9MÈ¦ÏØlŠ£ØDlÜj~ëöN/ô‹å½¦‘ µ#Iñ˜&¡‡i= æI^Û”é÷ãr³)Ç-*Ë?Œ«ƒ”3žÄ[$!ép>9â? Δá_-Á±~€ûZ!ãhå:ѱw"Ǿó©g~ùH‹²ëõ‡ð|qßNA§é°#³-BìÆ¤Ÿ;e°Ýo5ç<î1¸»ŽÉ×gõ^í£òÕÛ?ñàô‹ƒñŸÆé•…@¾ã€Dh£Ð"2 ºØ¶Æ!cY¥URö18­ã$:ðGFFFGº÷@uÛ–P”ޝ e‰¡÷wŸûÌÑ«·\ÿîµg??Áž=ÿþXè«8ç$öÙÆª&¥j¿ú<2˜»AdldPÐXàÔPZÅíÿÄ'ÎCˆÂÆÔ½÷CdÇUnÑu³}i:¼Jï„øÈV`{{-£¼¨g…ó¾Ö¢]6Adlˆ Ð¿;9ë€M,Wñ¼Ìyá…ø·g…þ«àð T%Í?P##ô)±çn.ѵDü¸U»1åòžübéoÍÿø Ÿ¬~»ƒdŒ’¾Ç‹ÑÙõŸ´Üy|]þ]äE×H1ÃX(¿û{¿ðIçÚª þ|ãhÛ‚—wдz¹"!}´x¸üƒ¾ŸuüÀw¿ÖËݱüné‡W¢Ž¿}HNÜÁ”–Añ1 Oµq€Ù+ä¶Šå+nqªPÁæ}°Ò¤­{Ô -aÙY’Á¯RG*<”ßU*Ó®Qy%€ ýL#r”– FR/õnõC®Ö‚ Û‹S±$•E\ÊÇ#{F‰MG± ë§2-†É$Ã4‡Œ‡’º!ÖUHfçÈ.Rb!LÑcüS}¦‰¡¿DíIµ±XÝ»æÔK—EdýOnŸ}ÐA¯Óèï_ü6)C vàŸ‚áDˆD½ö„^»³­¦°gXl[Ùú\ñÑôãÝ·ŽF?ÜŠ÷æ É€—Ä@%$‚ZÅìqd-[vmCœÈÓ lãÔäs¹•ñ|mÒaµº§¥Ó# àh !†³+ì½}éâ/\»Ì¥K—>öñ)6øê‹ßû“…P Ðj‰½O ¹þ̘AXXßov-ƒØLQˆˆ´ƒùrmâK3†•‰Œ[Þ»tg'ÒŽvÁ÷æOŒkd!Æ©Èà›H<= 4R ¢žqT/à}qKåXÒFÚcXÉns®+nÒ‘N¢í @T62mZ›¸FâÇE;Ž 9މCö¡òºXúÌn÷uؾöòû}_J}öóõÿØ„?o~¡øwûâ+ͤWÌ‹k”w>aþ¸%œbúÑ*!/øÏ‹¿9õ΃¶úð÷~k¶äAˆÚÝ>‹F6lž„G_ºj,Îúè/.pÏ;Ÿç],Of×P&Å·@ñê,U‰¦y_24Y‹ß %<$aÂ…õ\ p¥¯¸¢Ch‰äo/´bnbw'¥j ðX‚Äi7JûŒ%ÁBDsv@¡pÔl—€# Ê«ÐÂB§ËÅšZé…AÖÊ'ò1Qñ=çíHfc"N'dÓútP˜ÔéûÏ”:T’Gž2i1Ç3RÎÒ†0"L±U/N€bÉFR2Pd\Z<‹kÜ×[¨®î…§º«lP½÷ê™÷Ÿ=Ñ4€¸~äÉ8?ÿö€ $€’äÄ63aPDxðŸxÆ4[{ÑŒ/]fµIufbQ¼Ï¿Lk?„bÙÏH³vš ‘€ )LÒ¹eT¯a ’Fâ* ¤ÿîµ oºuŸé½÷Ÿkœ |úÅï}uETªèŠõŠœœŸ¿èG>Ùkõ"k™³Ù,1iTHŽOåúù7ˆ!Š$'7>Xzaéб)b°’€‡ô؉êM†ªHí@XBË‘1Ý–ö y¥µ¢È„&Ǭ„uò%žò 6Q`"¶VLØl SØi¥G+‰Pç<ÐNÜ02 LýbgéÖÍÏ®¿JzþÏ_úDùÛ¿]ûõ_øóŽîl¼ó²\wNœÆ7sÿ¡‘$@2A`aí™w{?û ÿn·Þ¹þl1í¸Ó²Ôoùeeló(0_½º9{öÁí¸Â ç—çnivî[ ô¸Rr¬¦‘Ê o’½ù`_’]ñ´[üJÎ/J랎0Dda0ú`í‡D%ç®%NÑ|™gm¼Èèí×rä•ûcs”÷“õ Ôl ƒÂb­WÏ?¾µD~ÅßîBßb¦Æ$Ø#Ùȃĵd m„83›q¶ÈÔöŒ"*Q%A,ûLg #!KCbLj}ɸâ’B?³Ò´lâÌv')`L‰Øê1ÞU}ÚÔ*ÊøÅ“O6È(µxýùk÷ÞêÙ½pù´èð RŒ˜*¶“øÀ‰‚Rú'“ÆvZvem˜aajríáó+øI½×0`)JñÈȉ=JiW Ø€˜EX‘"ôl[ġФ Ìò8‘9Å#!¨B±45ïYõ°Ñn ¬²Ú J8ݱ!öß¹ýÌgo}Þå›/¿^1\þÙÿæÛ;€ä$‹¥4ͰkëÝ 0&æ 'ºnD¥‰4‘S(Œ¼öœkl฻Ý]­Ð;xzZ [cI')d(nW@†éx’(Ÿ`@¶!÷#ÏUDNd´uÄp+Wû_™!èE6ê¶{Ý®‰,HÄF"d'^ºÖ%EH~ÎË— 2ä<å$äâéSŸ[¹ß;v¯Q…“—¾¾û3ÿünñ‡öýòß<×FŽD¶~òzáFß;ª^þSÐ$Ý‹ 2¹æêú?ýdn§|6¸TÅ<¿n‡ÉFݾ-9l{¶¨Ä–ÎŒÌìüÑ¢'(4u`ñ[óÚ2m9¶]­ÍßQ:~ÙS²öÀí™1R‡vxi6˜ˆ7žwÆÇF´Eõ`×—¦Q€Ð'ò5î4AЫuv‡…y)¢7žü !E[Õ¢C%ÿlQåF^ˆA‰=dË ’Ïï>ØîºRiìBâ?ˆEbj²$¸Ùôí¦ä„HÇ'C;uIqñ˜ ¾TPe'UœS7¼¿ŒÓŸ³°JÞwNŠ‘Tß”t(C!U‰€‘äX!Ø5b»D j¬´¤õï@úï<æÆççZ6ߊ6ý'ÇÝ—ïE1Ê&% KŽã@Ý/^°ÒmõX)HŒÞjç&ç{M”¯¼–—ýwzÉ®S² ÅS&7«P¹DÚ pÈÖF¢A¬Kžé(·Ÿ¨š“€"Üžix1æ&jåñ* bç¡–°Á Eô›w¶,JLµ’ÖÛ·.¼~üÃ%Åß½òÒKe#Ó¿óñ¯ÿ  œij•BHÞ9/‚þÝÍ0ˆŒ1H< D@aMŽF$rËù±ÏžFˆØçû7Z躌þ¡³s l ‘CðÚ2ÕùÇ ;"d …)ª^„•rÁî+G‘bÏF%Ƽ÷¿6 èþ½÷zQ?°h²9Ïuµ«À•#î…Qd"ñ\×Íi*ó¥œçû* z–‰ãVuÛU)=»øíÕ_ÿí¯¾×¿ÜøÝ_ü‡;‚Àr·Þ¡Ï83Îøm%œlLQ…•¦÷s¿¼½›s}ë€@Ø ­¥p—ë® Â ¦ÅV+­?}ì UªrnóÒæÒ¿FîVMÍÝIP­C¤È!PLƒ™üï‚CYµäHOúE .‹µ¡%1 |¤þ¢ÿ !@'1r<_R–’¤,]œ,(E¾gûF}´û}•5,àùÑR;€|9ØeÓOÅñõ‡IQ¯’âR=}çÐ5 IN g àT$éE!Y;ì…Ž?=f…Qn“Œä•P:¡ ß—éd@ðiØ#èÄæçé‘=P½Bñöc—wÞçHÛ?>Bgj[DH6™µ!ãÐ0žHÁ3_P¶[ûÝ 2¸£ësÞwŸ‰ޝN´%gâ €Ø6•ís¼ø< ÙŠŽ±†è4B#b%36Æt@LYz Šj•buÔ¼½YàŽÕ$ˆhõ?[ü‡v(=ó™ÃÎw¯½öüÅküÞ?\úÄyÏ©£¯íjOPI€‘"tž°[[¾1†ÓXW Ô11DŠ?q-HnïúýˆmÕ‘s‡±íÙKîÿ´¯‹ý.ÆÚäT#­2ýKh”ë¢DEÀ–Ii$‘§ q¢ÚHñnÈjµJI£Š‰© (DÈ$,bÍþ¦éí¿è–Š…ù2ì ‰Â³Ž¿r¥ñ;¿žûQÿÁÿüK_ˆ‰k#r"E?xÃ}PîÑoD_m¸ųeIE¨jûÏïìÛš‹"Q»'hÂÈ¢m;EÏF]]A„޶¬Üâ3ý¯åiû\¹7ªk'`”œn:±lˆãÇ…d¨ÒLîÀA˜èrÁ¯×]Fx¸ïJŸ­B$4…s7ÛBìT;ÛHÄ0è¶ñ 1Åw)mC=§Šsž.jD°ÙfË*W±­®ç–v{ì×Üõ êHkNÆÑñó•^¹2غŞäTô–ÌõÒ|OI]¼©« vÇðà-Ã$þ7Éæyœž ñ$-‰„އ§;‰S­<™rÝ3²Œìli$eÕ¡å&{HŒ áûgŽÜ{erÉè ½ãìÕë§¿ÊÄ©q±š­±ˆIQý—ë‘t»ûÝrcZwldúAi²v÷ñѱÖä gìÛ} 0TÄC Jk¦ä·†ˆ¬ÛGZAÖ ´Ó H"fIÏ (ÙÅ^©ÜH¡47€°ÿÀÁæ‚ "6úýóÿÕâÛW׌R[5PH”Yÿë÷_}áܵ…\ãO?øä1eÕKç¾ýõûVÅÝ)…äç^ò ˜Gûý®a”Ø©ˆÂ¬Ý¢_>üÖ€ˆœõÛw7Á·ÄõNû`÷6¼¢ë)TCKncLt/Œ6]×5Íõ»ÝÀ Š!$@ V¼\Y¼Üè\‘Y_mîmäœÝuî–‹Ì*5(!©¿¶Ü~øo~ãümçÞ¿û§_ùÛ»¬Å‚‚;ê\eÿ |Úû}ëBÇNi§üÎÄ\ÞjDcEE$”FXU·o‹.IùŸþûûìåNû+'ò«¹‰5$^xnÓÐ7Š3[˜U’kO<–™ðšÓH4ŠëÉU]w¦T€Þƒ~!2¡"+‚2>þƒµˆ‹¥aL"„© R¼‹¹ „²¹‚¤–\EÉÓÚkƒï( ´¡r~ÿÞZ×êri«mCƒMKþ—wljÕÉ’(ӋІ«›Ì×(`2ósª–„À 8#פîI¦F%©®%Õ·úM1Y. Ôð¶DnQ©È™{WG§îì;J€‘®|æÔß7¯Gš‘¥Qxþ}kÁc™f00Aàýü1–n§±£º^I:†Õ¦p~õ]÷€*,\úµG÷&‰3Ê,XÉ—É@6™bøy 4OÛÑ¡°"²ƒF(>wbëˆÄþTÕR¾:®t©Óì#!2¨ë×üSÏ_(¶÷-(§õ ’Rغû øÒüv×ßû`»TvO½ènôˆ”ÖZiR¹ÒÌ'•àÒ½nÛ(€,²"MJçs¹âÉÏÏX1Z=zçÞ®rs/|ú‚½Û«ù‘¼NìþŽ•XËÊs}%¤¤·ûäQ#Ø{²Ñê…agýáå;{…’„ä þù”Ë<ur бW/ݼþÑÂúÊúön«Õëu{½~ÈÜ‹¬‘¢ ÝØÙzpù[k›rô™ÓÓã¸x´Ó,ë~D6­¿qäXgëÒìk•Å^ÿÆôÇ;›L(¤#¤ÖÎAçáÞ”§çi!R, ÀqIJàäÙÀ-úñö 5öAk–þž™rºÖ÷ vv{'wæàw–‹#¼ûRï&€ÅWÖkïJ'æ!VlÑb€Ð` ˜ /ãqØÈˆ7:3Z õ{û VŠpà%úñ èY¾›FYeRÒä L7?\}O['«®E¤¿ßÕ®Rh$(WÍ{Í6”FƒuÓë /Y$öÇH"2ÄdÑž(\†³¢ee®ùSNg†ºL¨Ô‰b91RâŠg ŽŽð€7J€pì‹Ñ°-KèÒüÇþzý‡W5 H”{aoû܃žÁŒÃ¨ÞÜgfN–niMÖT¯ý²#ÑNs3’­G£†5±#ü­î±Sºÿ{‡Oí£~‰³’†zˆDž_?]Ë Ðþ†jw h­ŠõÇ FûN#°Iàr&äΆDåÍׯæ’´/lï[RHU}ýGxgÏ¿XØéY @`Ô1Ávo>œy£°7/wf}¶ÅçžílFè F¥œRþã GWVv»±–-°ÑDŠ4é‚7zög*F„Å o\yÒ÷‚ß;ïKãÖ=˜›vH !ç=‹1&bPˆÊõˆfñîB?Wr¨<䨩ӧOœðV/Ýn• ž«ž¢ 1[Ë"N‡)ÄT†Ô_2´ŠÌÒ-!aþaªÆ Çað8œiœÔ‹þcÉ,à $øiV&q¢D Ì‚Jé3Ïlß•vC¹Êª¦¾Ê“Ÿý³5B@M{/Õ>:ÖÝ0nŸ1_©êîMaNNÆÔ ¿ADÿM…í^g#p—ë/CÛ˜hNU°Y<<ýÙÒ¯íüù6cã‘Ä’?e‚‰\íåÆNÖ}ÚÝöö{‚ŽR¥ê'“×;¡µiNrf˜NÐëñ¡®ëcÕXD}ôĉv;IAUwü :zñõñÖ®‰•ϱB •ltãô[Å¥(ÿà‡î¬ÑèÇN/7E7£ÈnüÔŠ—„}Š`mf|äðQ ˆ»ï¶v,iPb-*u1ŠDµ?ü–;wúùÑfƒ™ˆ@ˆD@4…{­Éݼ{ÃÐŒYï“rܼû±£L›­V`"kãÂ7+´ëŠ¥?ãGq飛»Ê<û¹ÃÜÿ`sþĈ‹, ÔQØ7¨HkÇÕ¶ÓÚÃêøøxÁq´F`îu£Ð².†ž€lî£_%ÁHÆ2)œÊoYÑAGyž*ç½\ÉñœJ©œÏrž#FiÇuÚÐ:®gö1ÜßðËé7w÷»y/–y³x§_î,\¸°¾=¦W-²ñËéoÏW–:³¦û$À(¨D¼ñ¹Ãnm¢ì ØuÝßÏW]f!Vv׌ùÆ›¡ŸÜ² ¹Id),>¤Âh˽x£Õg»G û‘ „-‰ ¿*8p·>mĤßÅÜd!h|ÚäkÛ Ý ŽŽ˜G.<¸ÚAÒåñÕ-L‘ñI,”¤;±4äµ;ñŠ+V{ CÄÊn"f+Q¹ÞxÔ p´ÚÜ‘^¼©Ÿ0ï"d¶íÔð? ~g7&c}‚á(ǘڞ¦lA–÷3 Í&s $8‘ã»c^ÿ`qHØÓÒšÒ– û?$_ Â?ñ¯¶ÛîŠU¤iòÍk·ág7ÿAHP)ÀæKÞ•s{†ŒÑ4™Ë=ܶÂ2ðÇö%Mèü§z[í-é<˜yÃé„AØ+ßø†“??¿ü¿D¿Eÿi%”’Im!M¸N ??whÔÄÍ4û†ˆ<匮ì˜\)ÜçH†£S1%»}펎M+ €se‚½6RŒÄQŽú*Ù ûþÛ½ù ÏN6š†’-6‰’]½Þ~öL¿iì퇣uaïÄEµºn~üͼ¥åû»Nhlœncõ?(MÚËå+¯~ܵ(Võ{-m¹öÙWJvý‡ÇO0 -J bz!£ÖZk­@8ФR©ä=Ñîê­÷~ü“wÞ{çê®›w(ö‡C¶óF` ¤HA¿ÝG~‘%€cÞ~K8+aÔmµ:­V»×kwÛ& X¼|±P((ß2XP9bìseܹ»6Z‰&F½ÆŠÔƒ$`ZÐ?4VNvW£…þ§êË¡ f‚îÆQ÷q³Pp‡ÅÆÆU›>Z+ŒÖ¼˜£À}k×Wœñ\„Äa—**ðÁ·W !-é:"žÆGVùµ°ÿÜÎ#ÎÙ8êJ?dæ”Ç60üèŸCi¸IB= gÕ衱QAÜúÈPÐÔJPŒÐ™ú÷IOÒ=K›$fš¤ÏQÍSN¹x¡Ìì¸qÇ!l ö‚e6ÅQ¼s{§T'Ì:s‹ñ)l†Å” ›¸—)ÖPžíP’fóLTòœ‡Ü»84ÈKÒ3•oFƒ‘„ò3„ÆÇ̲?ì8˜é€àä—ø}iÁ2*…pèůíù¿ðÞe/† ?rî~©¾ÜEËz–&ؽdA8.À1;PˆÕ3¿åY»nôômyù0w¢¦¥yþ{ëL?cþpáìg.}³ 楙L’$:%ÎI@tüâ‘™@Ëit­fÔÊS6LÎïwÉX(T2 åÇk³óG„ö>0ØÞ틎ñ¾.«¯ÌŽÖtn_{?˜»ðÌh«iH Äa@ˆÁ“›î‹Gzûz÷ÖÎTA¸rîp»á/œcŠ®¯4[a’F–ˆH‘ÖÚñós{ݳÀV…W/¯ïô—ªÖ‡¨óU0&`å9 ¨ lÐ AkG9ŽB°,bEù®Š‚Þö½Ë|xéþòÆž;ÿ‰ç¦<A"$D°Ý@SR 3*°¡±–\äEL&´¨pÌYî šÀw×wrÊu…mA»Óë£ö\?ŸFaGrGp¯4úèR¿2?Å¾îº Ä0!ˆŸ“Òi³Ò{Ò~b»G¬TwíPy½:ÜZ±©¿¥:}²VË)0{­JAíuÛ›…‘|a«Wô­{¤òí¯·ëNÔÃñ2ŠsÊ{h<7×<Ïט.<9æ8—‘å8«"øá ÚÌží4"қ̪:sc.ÜØR¦:`%2¶ôÂß´ °0µº©7â`ú”3QT¡P83"¢!ˆX‘>:-@¶``¤°vm¥c¼Q½#häšÞê,)Ç ùDˆóò0ÑL<õ6fzʈâ,CtÛÄ#—ÍBGU %‹&ђ݉©§²àäœËp_‹Ÿ~fïQ¿¬kåXõÌ?¶óoüçu`n ¿ÊNîí°µ2ÍBñRDzˆp²oŒ¿­'þù”‘½îVÛ»·:ÿ±|¿Ûï¹õ‘ï,Sùµê;¯¿2úŸ‚8áiw d›É)PçóG'G…–lØì#±hÇ/wûy¿Û2&U  à  e,¨Ñ±É™“Eà+kº¿ÝA… (¤\W5èÀl}Ä·!âþ•ŸÐì…‹¥^Ë€BA•Ônй¿0þl}/‚•vÜ58ýÜdP~³$¸rw§ÓMÄÌ)Z+í+¯¿F¬qz—ol «‘W?^²K?Z:|n”Bku_t§^ȱ""°‘–=)u"…¶G‘T«ÍkK­@ÕËûûÜ †óv’GQ¥š|dÝÇÎÙ¡äéôâƒA²F'IqÌsêòϸH’àŒ)›€S–o1àåP¢‘K'O4„Ñð¾2û`£Ë=G#ç?n¿É¯Nü>ÇÊZDÕ;väÖnöU~m4ïn?æŒJ‹°Hy¿ùCk¿µŽû÷üÓ Õï:¥±[xêÙ#ö÷Zvñk;qj*ÉÀä‘Ì'ÐБäæÜã#u¢ê¶ *Ýñýë}Ìå:mkÑ_‰)YPyr¼zl–iïrè´¶…´¢%%‡Tôà=0?R&î[i¾ÿaxô™ ¹fKPÅa7Ä{-}Öm¨îƒÅj sðÌÜ„ ¹ÿd·D6÷@RŠˆÈQÅâäg^$bÝíËÆâÔçOëÆ•«ççU'Œ £ë;z(Œ)êBÚqEIÈ*‘í®Ü¼qgwãþãF»Ÿ;ý~éãÓƒ¡él-Ý¿ñÁ¥Ç­É\Áë﫜* ÚàjGYcJúì‚!EÈ4ê7À„¬±a˜Š vµ“ÏWªe½^§k]¿ ™*#½âDÔ0½•…öH‰5H°Ú¥0«çOw¶VvžŸ_é»hToë³ÚÍûG÷ž(Aoüèl¥2^qA»+-Ù7£EiGÞ.ºœ#zü ‚öäKÕo¾N¹ŒÇŠU­Q:{£)Ð?èëilÜ mBYFDH²ˆp€œËögIÛ gk¹‰¹‰œ ß^¶ÐíÆïÆBù™•Ë ÉOol$¹M)·+yåÒß¡WÈçŸ?KvhŠ’-Uì‡h"1ýü<¼·pµ­sØÎâ7Ò|oá$Ë a ×ENb“ö37ŸPÊ4NµC¦JŠÎ2F8Ö÷ó`@i„¤d¯ô1À4§;.,$ ΄ԒeIå—‹×úû²:áěބŸkü]¢9D@EF?ߨ?ºÒEfUvÇQ}hÍPî4€"¥éc¿*mñ²‘[fô­ºmöÃÊèÆ7E~ɹ÷wøÖÙ¯]ë¥:&’a€¤îÄKn¾pº6€òP÷;†TÞèÖ +9¿Ùµf•5;Hñi@zlblþx™äæ'Ü b‹®eÄÂIU±{î›c§KšÀÞå÷àä…óºÑ6I/‚’ݺb_œ [¥ýÑhN¬® Àö­­^32IùmŠWW ¥7_VEôê;†s/q”W¾¹vüT¡¿Û4Ęó==$wû‘hÇóB‰³ß¶_¿öxW[}5ûs¿øù9ß b¿µ±òøöãF§‹dœœã9+—x ]Í}㸊¢Üä!‰Ð§@4"èš“+êB¾P(äsÅb¾à¸žFí@H‘±“/V 9¢f›ŠŽ7ê6Ì4=&[Ž_Û,(tZWBP ÕçFöž,½t|¡ÇȨ°»}—"¿ìXØF"¨Ïž*ÕjuÁ¬®*'XjÍVu_ÌNP§¾-ÍïþÅGeäùÇ×i{ý¸ËxxbI‹<÷ä‰ OÚ€¸ù¡…ö"T`µ†SUU!Íû·¢ƒÇçË*ìî¿ÿnñôÅ‹´$Ó?á⥉Wë«”ò¸\#‹²x«Ñëk¬•Xú‚Z¡vÜRµþú›lD€>Úê…áØçžuÍOÞvÏÍÊÎê®ã;Ú+ú S°å°oÀñ|WX+Ê.^½·¼ÑS¼³WzóW~öH™ @Øz²ôàö¥NwäÙ×_ÿúêLy¬øáÚDžA¹a+p”v€•Jz€ÀX€D¸ÖÉËõ‘ZµZ­”J…œ§ÈqÜz%_,úÐûâêœç{¦ÛVµZÐ-÷º: pg÷l(o×Vöú„ÊAaœ{Þ[\¸pt%P ¨tsãB´GüÓË›¥™“ã¹z¥ ÐlnôPºíÍíã¹@Â…íÙà\÷¯n9èøø;?™Ü§í홼åÙ¹íhë•æu ñÎ=<®Õ{¶lx³üïxkœúaÒ˜³Ä7 ˆ81âœÈ Êã¦~Q!ŸÛ{wŸsÓÛk„Héæ)IëVig,Ù÷J~饼ªÄ¨ ÐFnÏÍIF*ëÕÞµGí®3RØkÙ~eaâqDf5H‡¶Yˆif’¡ñµ°zê8 ”.³ ÍβChÈ1(ó!6¯ l9Oe ¥®Ìœá ƒ‹ßx~÷NØ·kŽñÏÍ~=œýO6Ó¢ „Åçyf¡‡ÆÀx¾ªº·¬˜¸iGF!ôÿÅæv°¿UÚ¼î¾2gwYê¹ï>,åÞ·[_•^ùþÚ˜ˆ/b„Áž1™ ¤b(/—?1^bóD·Û¡ãG/äc+4q€%5C:e‹=:5:q¸Â@öê†n·z EƒõüʱuU!@¢ÆýëícGgr® öß~»|êâ3Ñ~Ç"ŠRÄ.E·nú¤ÓpÜ…öˆ#ÊÝ_l±6Ñð)D­|±ô‰W„Å¢ºy}-°Ñ™/Ä­o,<ån¯®4+Ïñó¾Î¾kÀIûžFû>ZÞÞ<´gå—ÏVÄ2*2íÍ¥·î,ïZœ>ýæøÒ?üø5OÞ«]¹¬G(Ç]å+mE¥³âPÜ4^däð©3§N;|äð¡C‡9rüôùg.ž;uôPÕqѪT©äÄF;…J¾À»0íîèÀØÎøÈ^I 8r›¶ÛF)çØÙíë§O.Ä"®QÔY<¬48¥gmù3'ç å‘’ÃØ|ÜTQ³ÏÒX›Ãv£g›•± }÷}D«püãK»é̦ÿð` ¢ú‘ÝG§J Pó¹Ù¼{eÏX°b@©Té=|ƒÒè(î$Ës9ut|»ïõmÐdT(F¢cóïßÔXánÄg¥ðJŒmᜢ¨œ\^]<Ö ñ¥1½rŸóÒìî•ÇèæíýÐTFºQ¿›@<³”¤8¥\Rªø–Ì{/9«m€TF—**›~dñÏ 0„´ðX$™F&e¥Òðˆp(£4>Šâš'µ?Ó?š}¼Õ¦£½÷¾c^üó>pbŠÔÎÇÜç;À¡Œàœ®öÀ2²$@Rú+ŸèwúËnøŽÍyÕm÷MnôêÛ®÷âéÝÜ÷¯©_tÿt!¢th:S=7fâD ‡rå3• EOœýž$­©T½·`AÚ}c@†Ò¡2l*''&Î+@ںĸ݄Ø\cÉÑGòïjFFRd÷¾yéÜ+¯Ÿ[¸¹Ø½ð¯ÿì·Ÿùǽ-ñ(@3³BYùÓ_9v{¯hV‘€Ô¾Pÿûe¶ b( (R¨œR©ôÖKhœàú­nÔÕ¯¼á˜GïÉ™j¸³× k­½‚›ÞþlƒÈ’ë;( BÖP´~y·Ù°SgÎÍæI"@"ÓÞon®ìšŽ¸S§Ç[þã>‡J©²íþÉÊ[ù×.}ñãyv+NÔÁ¼.›|ñžBDZqÂ.ËýÛK{‘µ,¢Èõ&f|­ cÇ]`Ûk7wwäuk]ÏÈÈæãõ‰ÝJ+2OÆ¥ã.lϽµúÑÍÉåœ/`k?óàÒ©ô—ëˆhã@뇯Èýï|l<÷»¿·wâ°—«æµPcµ§lØÐÐüñÅy½£h¥ÿjuóº‘vËŸj~—é‘=²ôÿúËcbsÛ[zvdËpÔ©6&ðøc7ŒÐ$=^8“Ù¥¦NdBâ–})WH¶zÀ‘e‹ëØ;¸õ( ¿¼Ó&L)uS MàDûy?a‹ù¸­¶‘ؾAeb–ž*9Ë›a”¯ÉŽp”F—ÆHA&NÄ5Ù~[R¨dâ$R+5æ#¤•,¤XÜOC¸ìØ>Ÿ%Öñdã¿$阒` ¡|áTHŒ1¾SaZt{'yûNC¡B©¿gøèúNúÿ°J,ì_záÖî±vC»WéøãsÛ¨YP³p<»øsÀQ§³ÉxÅøùÛwtõGÚ9»µ]ø®>|ìƒûH"‰K±Ç³|1H?" \@ˆ"/^‰hdÅ]&Ç1±žC¤Twd¬6>ë‹ß &Šíö•±åûª$B€@ ÚOîö9X۰ýã[ÓÇ.Ì´÷"Rˆ Q7¨çF{ê@Qôü™ÎrÂ;AS©TûÄ‹`Á(óáýv»?ö™ç½Þ¥«õS¹í¥õ¶T'ën®˜KÓq„9 "Ö^ÞÁÄK „Ñã[Ëkí¹Ïÿü…ñø‚Þæúƒ+w—÷z2~áù±Ç?~ïqÇ*bÃðáêÁòDáÁÊXÉDnŒù»bÓ´^sź$[ß\Üj4Z{í~·×é5vn\»òÁO~ðÝo}÷VÔáƒ;0RðwÐÅr`$Ú×QÁ„Ó©€¢»— ÏLî¬nu”Vc3AõèFÙ*Píæ!^$¿Z8SªV󵊋"-oA¤ ¸ÐÚÊÕò=šŸê”r+!8¹Oè¿ÝFµíXßöÔ…ó³ÑøÒ*Š™«µJûªi!$Ñ?Ùr›Bú½Xž,äŽLŽ@÷FGLQ‘‹áÃ'>¸ âhùQ€QcMR7¦Ú qó^á¹S/(1½ÀÉ›ÈSÍ ´åÑî+íÀ©·Ú¦ÄoÂ)%ÖÅ Œ»äAÇOà »t]—bá®,`‚>JwÿédjHðžÎRµÏð‚?Í”Lï#ip'eøôä$„Ã_±—¥e×A»‡_üÆVîgÞ¹¤³^è­Zî°0N¸u¢ ˜8µQ‘*ý§,·{;Òýû¹âü«Å°¥Ëø7[^í3xõø½ïÈççþòN@éÎ3”hœcăßr £'ªyAl/{Í> ¡ƒN͹µkÝœi™ˆ“?òIÅé‰Éùy ¬ííŠ`Dë8ú¬óýUÂXडùðVûð‘É’!š¥wWž¹8Ýns‰Pk·µ°sðD¹à†â —ÏÕVšÇîÒŽSõ˯?O#§ûÑãf—g?wLíþpíàDÿÉÒ^•§êÎðû‘ ¸9OX‹""6ê®Ü~¼œø™/œð€¢ææý›7mwMýÌùÑ•«—îw@Dç] ˆzàÂÆ£cå±ÑÕ…rH“R±Çc“äþ{· õ=Ì)‘q½Æé†”èh ‰m¯»÷äÒ{ï½÷ã<œ>qø@ÝÐ¥|Þí™Z¾ö¬–Òd3¯¡Ôll=ºëŸÛÝØé)E$à–!w¨·¯‘" î‰þš©çs“*UÐnnˆZ‘°`NSðûQõÄò¿[~köQà<;õõ5¢d׎å»vy´¶0¢¶³s|õ„ðOlW„™ÁË`ž>’c{‚£c¹‘C£%zr—t¯'¤P,38Ï„?Úc gº±Æ$‰î?›ÃÅFÜøeqü¢sò<ç‹. +AOTNwµ×ê‡¥Š¾}¯ÑåòHg/ê<ò§@Waˆ5òsi¸&GÂsÀ`P˜({ s(&ð lé’X²3 y…’é%ÓÌØ‘\ýHét1>? 3`þ º46*áÇ^Ü»Ýë[Š@Ü‹ÿ8:ôÆWWU6’‹g|í£ó7ËZÈsT{'°c‰ˆ¼_zÝB¯ÛÜ÷Ö¯b®zèœt%_¼r¹¤^}Ç9ð‡Ûõ__ù‹]3Ðî¥õ>ÏxÒ]&;9üXÕ„ý=Ü @iíŽÂÍ=ñrѾ„Ê¡¤˜´$ß]ÎÌ,2 \_‡h¿¡´B¥U~ôàý÷UÊhŠˆH{> ŽŸÉ‡6„èÞ;­ƒgΕ¶;Œ¨Hh··Žó‘hsI Zœc§º+F+ÒZëj)÷æKšÁ:­k‹Ž=þ¥QXþ!-6Ÿl4Y—'ën®œÓéÎlMžï(af@‚(âþÒí5ýüßœwPú›oß\Øh…åSgw/¿¿eˆˆH13³°Ö*íÕË¥R{[—×sYˆ0 º½ÅÇÅC{ûÚUs¹‡ˆµ‘c„¢ ÛËï¾}åÒÃZíèуcÐ+å©íÔ€)0Q4š¨°š½{‹îù‘ŽÀË+ ,ÌÙ}‹–‹ÐÜa-7ÏNÑɹÐ^êÙ(˜ãÀÊns_ONM¶~ÿæ¼x¤9õÂ7ï’ÙN0š‚•‰22݈@º/?9ìªÚ'àâ´ÊPÈFÈäÏ”Šs“#Ž ÜÞpœf€qÂ(óØ™+·{Œ0ZyÜNe¹Y„,á óFò‹¹êË%¨[¶è9=åušP+-ÞÚj‡¹qµÙžðœ¤îd(™½y™à°Ô÷©§7ÕÄzîDÙ€¢†>côïËx/ƒ´¯Az<Ò "²Ä@Šñ‰%Á©ËJˆÕ—Ž,nì›fC)BÿÖwäù£¿(›Š—cÔoè½´ÝŸZjéœÑbÁ_ ¤œH©çÍå°µ¿%øãŽ_)_*4ÿ†áø«®¼ºý×ôñ ßú —åí%+¼4ôQÉš@®ïÏqp¯{"‘éßo…^®Û°V†’%u|…©ÉñCs@Û—Ez{ •B" Ç;Ú{‘T ã:5¡’Öƒ|òèDÎöŒto|`ž=+;ý˜ŒZ‘Îççr‚݇›¥‚Hý¹êfKÖ^¹PþØ+ ëÖ‡K=zþrtï£ò»úhµ%^av$ç— :õ9ZËÖ@.çÄ@}Ó m¸¼ä¼ôæù*±B·µq÷Úý•ýÐ=üüÉöõ÷îîZ( Ê%ò\×Ëy¹æÎt!7–÷K „Ã…û‹\Ë‘œíÍ…‘ë S &eGÈñs¾ã‚1& Ã~FBšÂÝ­{?|ïÎrmòàTÁó¨’o[íB¿2Ú,仑+… ç|ms/¬:€à͸ûŠBQFÑ~ëHŸæ] ßQˆÝÕs/`fbkí>ÁêÝw¼³øÆÙƒ~iDA Ûj» Ù*×A¨Ò{Ô{uo¬¢W–¬+"1£‘ÏY˜ˆõY›« ÐæTýVH(,¬^p~´Ê€Îto1ñϦu3e¢ŒdèŠúü‘¨Tòˆeî…‚®ë4¸²×©T-wúz¼´¹oû}’LŠ–(v86ؤÆÝ„øî©(£l-/È@˜œ"„”AòƒHLò…CV£l#(i@ŠÅvða™PbHfI³“iޱðkåÛÝ}½¸ŽËåOݺa~f÷ë©K!•)6ž½s|cKÙ _¥I„#± ̤ÉýÃÞf?we¥àû³/P×”í{¼©Ou¾1ñÌß.>¼øŒ²ú gÿør@JQÅwŸ}E[aj|¸ô¼×ž×«Ëª;+k{ºN½œ+ý„Šl ÛHy. ‹0s#ôT§ø‰f ŒÚÁ“•­6wôÌáúîÇ;¨QF‹D¢ÐóQ´z‹%]©rKªÜ^n¯Ã¼BŠˆ@*'ï}ñì–²ZÄûâëíÈñ\à ˆŽú½Å¨ô ¢"í"ŠÝÞ½üw3§OÏù~ÓxEëDl:3ýVE¼ÉMÓBmŸ,Þ|æ…­Ç×w.ÔE8ÿríý=µ^¤ü÷-ÝÈ£ŠŸ³½eU„6&wÛžÊéœÏÑô™ÛûrãOþw¸B(4¨`÷£#c{{?)×Aè³íK=Ù¯lÍà4qâôgYJd@PLœA)àRr#Ž[Í—A€¬æ¦%Qڎϼ¿f”@µ°btÌZaLËŠl±Î¤—'7ï¥ÈVîE( -ˆ_2K«í>ÕJ=Ýí¤¼émO™†þJJJJ+î‘cæBø”(xÀôˆGŸ1¦(öÝB’|ƒ6iøbù@’úÖ©?AÒC““ÖÒ̵äì‹tóãÑvØÕF”o£>ö·ÖD‘%gIóæ›NûÄbW‡í]¿Ÿ;:{Oi+ä û³',ÝF³úè~Áqò]‘¼^¸îë…?Ø~3ú ž˜ûþr”%ñ›ËBÂ?=ÐF% úñ”-°¨T *'¶"gA:Cê)&,ŒÔj“%¤ÆfD½ƒCŒV”Ö#á¶VZ(Æì0Aà‡¿÷éWºúx[ìýÿûË¿tîÈO¾óXˆ$íznñ˰®¿mè‡w>9eÌÜÿáÿ©º®Õ3oºÆ’Úýh­¿ï|æœjþ¤Ìy²¶¾àçk#…\Þw’/¶†™ßak‚f”+äF@±€Øko,mìFŽ>3ߺùÝ- E D"!tE+ÔÊŠc71{¨Z@àð½·ñgÎbþláVó[/j‹ éøT(•|„*u€aÏ:Š€ío,·š÷vz€äx^Zûáä[/VÇEêQ„åÎæÌd·D8µÖŒ ÆÕ'×_yqáñ΋sÄ‚–NWÞi*Õsp¥ÿbÐ*ÇjiíG:êFÆ"²í‹æø©w¿ýÉ/ÉÝfoÖ~õÏ¶Ф²­Çk悟cëý¢÷mº{rÇà8¨XRˆ0a:+Šu¶I’T&ÜÚDÝc e¤^_ZF6ÆëÞn£•{[qn'Éœùÿ“y2)/çºgr¦’WÿŽ8²H„¨' û¨\ 7­ty(¯PH˜BÆÀ°%0+˾›ã˜`IŒ±Ù¾0p†ñH$ƒ¨±«ŸAã"&‘Y’㈘ԳÌ147Ë-ED8àï4Œµ‘Vˆj¶ÿ&ò70M’‘”mÀòþëGž+vìlŽoÍåÏ,•H2N} Å´{~ë:º®S:ŒýýÛ»úùù·o;ün?F?h 3 0%"¢TÍ—|*ü¹žƒ†€)­µ¤¢e8 -Ž?ˆ¿G¡úH~l\ €,4Ð4Ô DŽÜ^Œ)Y-"*{÷Á÷¾ôìáÛ7ï¶Ø¼ýîg~õÍç¾ý½}B—ÈqKSc"æÑbùÔç®_uÖþ—×_r­þÌé?½š/¸Ï¾å‡Hª}¹lW¾p¶ÞÆãêÉ£Õ–"¿R›ñ‹E<l-³8®F6@È&ìöq¢¢Eâ4Y¸ÙX£ú©içÞŸl Ù B¥@iO"Ë£ó“UÕ¼sg©öåéÓ·ï~Ý9nqÞ¹ºù>'U DÙM]ð˜ñÁ×î4ú,ÄHjôàLÞÑ…#ŽîÜX~r³ÑFÒ9¶¸þíõÓ¹C¹™±õ.scºc‰ Õ‘(ê‘o—–Ž}ìS·têY@†™Ï^»³´:ÊU£^%¡øCo'ÊÍ^È€¤XŒ8JMžüÇOnÿÊ—ê7f§þMðßýêWßGFPh@óö'nîoŒ”Äꟕﯿ¾mõl©E”¶x’„i „&»8Hz4Z-  ½‘éšXu#Àã³W6"@Ì—BqÊžPœô6Ž£UAÍ ó%/±ì±‰ [¿Ý+©ÆÝ•8g#²=¼Æ1•-¢ ²¤e’¤¶M.êDË'ñ áhe¬BNéÀ(IºzúT§( JX@„„™â D Œ)VF¡A ù £—t²*HLÄÏàž9[q+txeÏì,(J9AaKOnŸ^ÔG7´ßitVfàù¯# ×ÿ˼ÁV{‹àƒ®ONa¶$6=ØóÏßûFáYûm=}ñöÃã&3&òp:büM'î´‚9¥CfN¢rÚ‚Ba0CÒôg@‚\½>:Q@Ú~ ¸ß×J±%íèÑàV“(—gÓN,(27žÿìkǯÝYèˆùûwñ‹?ûò×otÅ'Ÿ §\K­Îöæ~ø.¾9ÇáÌ¿xçƒÞ±"`Õ¾¾µ×›úâl°v©:Õ^^Þn3å¼Òôˆ_.ë”hm"@M¤„…%jõý‘rl6äýÇ[­ÍŸ,m¾½$‹ƒPiÒš”K¤ª§¦òféý[·{8[¿=ýéhñ›å1ÐFº’G‡Ps¸xkmþ‹ÝëÓ'rÀóÏ<ĈãÔÓÖZp=]þ€{tþápçÚòƒÅ.8.tWn\¾ø)rû«ã¹@‘ÙÌRhÉ7÷½üì{á/Bο<ñÁò~åONîxÕXØnšm…í­€uúÝ¢c+[±êöþTÞ¼þÅ2ÿßþÕ/Þë r¬Õ¾[šîu¥3Ž¢~–®[lŽÜV1è-‰! MY𠈀‹¹~}´à`w[A» ­°XV'¢û{ G‚­T:d!¦r¦ €¤óªxÖRÙI°™H, %°Ù|su­ðHq·m¢@’ªD%®v!´BÉeŸro€l|· &ÄÎH䉞0kâ]}#œZüy˜&N(¨2`:d$CÉ#(k¥1…ªÄ~ŤG"ðÂ:F:"T¥‰k go[…2P- ‚UªóÝ‹µåãW:Jõ×üý‘™Ã-2çÿñŒ¡v«Õ.Ý\vÀ-æ”QêÎîþÄ«í¿æÑÃKOä¢z·³Qe ØLlüÙH"‹IW ÿºþûI²ìºóÏ9÷>á:ÜC«ÌH©eeUeéB$A‚@Ý$›l²mvÚÖÆlÖöXÛÝÛ]ÛÝYë¶é™m.»É‚ ªP@)”ȬÔ:3"Cëð×îOÜsö‡÷ž{Ôp¦ƒ°*‹ÈðxïÞ#¾ßÏ×B%ÜIW¤» m‚ Gû¡®*Ú(2.û²ýŠ`¡¥ÌN 4ˆÒ¢GÆ>^&F­»=Gï;B´Œùþ¥ÏêÄÕ»Ë@ÿøîï=ó‡³oÌúyÛíï !X¯sgãáÝW_¿µÂÕ¿ê)ê—O?:Ü‚Põúr»uðÕ!ž¹?<°»¸TöB×r ¦Ói+öapÈHˆ„Q„øM=æÆ¢Q¿Õnì®mV1sb¬5ÿ¸ ¬H‡À¤Ñ"ÐŽ¡ÌððÁ¢SŸxc¥nÈF0¾ó‡ŸúIuµ¤ E‘ŽIc¥IT*»ô¥“3›Ãi—¿à0âǽùÊ B._xö`öÔ¥µ{ÿþì¦àÎÎäÊ­ç‚ú ÷W%Õäáª1†håÿæî+çÖïK{¬¨CÅ+÷·sG÷¹±éÝtÇó#ƒHÝË8&{ÊùÏ#Y­d?÷ÁŽÂÿîϾ”{³Í(QlVãÆ3Eêé‚1ú·ó¾Ôqèžò•¡½èÛ¨$l‘WØ #"é‚3–Ï“/·u0 Í>Cqb~=PéÂ’Æ£p–o‚’”ËMÉñá°Ò‡ó‚ˆ¶*/Ô<“ɇ[!w8颚øÕV Æ"EO’W `’ÿ‘ü,{v ,BsW߆B{p^É ?—C×ÕÍ7èf FßnîTœ—Dq/Ä!‚˜‰a³b|µŠŒ=ÔwOѾ_û&‚¡¤qd#3Ûî˜x m¿®è§æ‘”¼ôšA¿âÕôÖLÖEeZ›kMõ|öûKƒ‡ú¾ïõ¿°v«•.(9#%æG@æn&N|$¢Ö €}ËÄÁF XCEƯãd`ê}Ô˜.d‹ÃED ú’`«Cˆ (Ôj¢q§.¨] Ä@Å{\A1DDÌ7o¾öâçŽ\y¼c`îÿvî_»u¥ãdF³ŒÍ6M_Í,Ÿùôk;peã…Åg £:¶;;Ÿ-zóóãÙÕå…ŠÚvû†ŠéTÎ’8ÏÍ„¨€EÁ¨~'®‚ÚF5líTp߸ÚþÕ²¨™ˆ´¥´²ûJÃãÖöƒÛw×:¨LG™0xøÆ×MøYÄoÝyž¸„*±&Ë”?Ê|¶µªµª×·>¨’(×]HE!ˆ´›KwȞʿ:5þé×j×*³ÙÁ­[ÏÈ›©'GÒ,¬ó}uŸ,T:`výêÏú<Ö¦gÕlî¤OÐù_øÂ`ö}Ó6aM6¹ÛI+ q8#è?´ª§Ž}t%]8U»¡ ý|Ñ ' ÷âžã¸"‰3=#‚§@(Âyü,€q²Ù$pWuIbgúó}£ÚÂ\ÕîT,@`£Y §¬‚b'§9 ƒæH‰H³àö÷>úÜ¥ƒ7o-ÔÃàúò+¿ýÒôíµü$l{a+Tµ>Zÿô«³sÞê—ÆQÐ@ûær}wú3}íãÎÒÜzňv¬¾©T*ïÆIqb0è ¸„`üÚÚòv=çT¾63»CH€Z…¢IY¨P*Ó?v vnÞ¾½V*dc¹ûœ$è3ÕZÞmîô©¼ì^-S!¢¤¦6ÙÝ·û.]™W#d²¿³1+¡D‘E"‚"`Æ|¬ö½|d꘿¹¥TãÞ™éGËל:™6ŒÐ_ÝõIHB„ÆRÁìÊ™§w³Ýg»4 é´£"†PŸV(€HƃZSǯÿ]Û€Ü1ÿÿ2þõ<-úµÿ×—¿fÿ´a$©]>R«ƒJtaú‘Á}™ MÂÑœ¤KÓÝ@€G_[ù4•Š Í]%­@i#驹¥2ùrG%I ‰NÅ#öHXLÚÑö‰¾VÆÑ Æ×ˆŠE¤O3WkmÊfª5ò¼î6¯Kgd쀹‹O‚+£‰\’^¿€‰ J‡nb‘€‰èà$&¾1{ÌŽÕÝ RìIÍ–½ £ç GŸŸÙƒTSÇpG{X'A!=QnÈ‘ÎÕ ÿM>#a1æúK£+û–mÝ.m ý@…ÿ½!–zcg·xoÍFqÀÞGÌK>»Ïnÿ½qÇFU·_ð>huõÐÜÍÄ•$ZxªŸb]4)ˆÕ¨ˆ…H“£˜‘™%ÑKîQ=‚rsý}ýyÄú,A³Ž$Hd  »¯z×t2ÝÕ}ì©À@$ PÈ yù‹]¿³â«¿¿ûõ³¯o4ӌͭZˆ„¬`ñ;—^¹ïîù@0˜]ØmN.×¼»= ³ó-#ʲ3£®•râ_‹€&‘ƒ»ë‰ò*ë‹›íÁt6«Ö®Î6Eñ!Fg ¡²4¥&§úõÎÕë÷¶ ƒ˜0@Ý7pæôÁ> :Sþþ™ßÑ[ÛÇ9¯Ô7ŠL ¥±²xÕ,þpU ýÎäH4jŠ3Õ$Öb*ÐÀ 3ï¤ÎO¿60ŽÞØÃÆx¿Ï»v>e4€]j4X¼@l+:†0¸ºxþÙ¾ÁÅÊHA …V #S]葪Øçú ÜéØFï~Í =Qº¼¼D_r?ºËÍog¿ ¿Ü‰VV‚¸ue¬´tÖkƒÆsú2U"é2»AÔÝ´ Nî6Jk°?+Þ<§ƒN6 j+£÷§TDÀ*ªѦNj¶Œ±hÉIéñS^ªÏBÀh$Ñ–À±*š=IåÃ-/ô€c”•ŠÄòÿh|ׯ%[KbìéU»á¸G××Í´„|³Î¹+D`‰´"IGU LÒÍ…Q{8¢ñ-I¢¥IïM”"¢ì#2¯kv”2˜(|dµ‡u£S š—œ™?2½Xánuy˜žûÜàSO³x¾¿S¨—„ÖÔk ‚Jë~u¯Ì¶¶" Xw&Ò5ˆ:ã£c“$ˆ[»³+.€î‰Öo6@é|¡¢ {)޽Él (B"Ìà=szB5˜ÔúÌD0XYn×Ûh@Þœuª”"a¤ÂäØ%«yËl­<^k…-«8v¸ßÍe)Y )R¨ˆb–KëÉõ™FXzötõ7ï®· &0ˆ@š”c9©”¦ÌÑK/6w¿û7o?n³H(™á¾öÇŸ?6°ùþ÷ÿÝ.?i4·ÏìoÏ- þHÑÝ\í×ßm¼»}.¿äÁÉÍ ?É"2Å»&«žhcMÕö(e§°p„j¾ß¿5®D—ŠÔî0qˆ8¤Í‡©±êýT^b&´vÉj9ÜB (š¬È>½ÿ—?3 H—žÚ¼Ö²Ö_lÔ9|¸û¥¡'!ŠA­Xè ?W^€1èêãÐ'©w$]ñ¸ÄRD"”ÌDÞÙ?R"@ó ŠA=DM(b<ëÀÁ{Bv)÷ÄKÌ'ûé‰$áh"P:-GN‡Ù’­0ô}R‚HÀ€ÚMoßËÔf3¥Æ6sÛD»*–ã•4 1u'®ØeuÅ—?£|b‘°z{¬À=b¡øÿRb|Nt“mI´?HB„»_<ž9$?³$DàHÛO~®sÇïÐ"*…zêôßuò_þÛyµgÊ"=D)¶/?<²¶!B¦”wj³é9ÉÒh®WK·æmDZ$˜8§¹Zõ2O/ÿgλÓ'~¸PüÃÝïnÆFe’ùtãcœ7Exc@KeOåÓØÞÄF Pȶu‘oÕÄNõ0LR{÷5h•ö—Æ'úÐÛ¬*aÑÎþ}÷n¢t?ìªtÑ‹ØófD6K¤…®¥Ï_²Ùñ1 »;íN(,HZ©ÜÎÆ6aÓƒ°{C Ídz[²³¹}‡3…tŒa!"¥by¸0›wŸ´aøâáòW6M' `„•e9¶¶ˆ '_ùÔQûî÷þú¹€™=Vé±/å_¼°ÏÜþùÿûÛo?i‰E ë­sCëk•éþÖMêww7ö9 ˆÈ­ZâÆæEý¤3D¬lo³‰nQÐËcŒÚ)²QU›ï_ï/d-xµíÓË8Èd‡2^ Q¡‡ ±å¨ÆƒÚáQµ’w0Næƒp{2¦®™ì\à7Û¾rÒ'oüM˱Ò'üw+ P©ûçyU†¥ægÎÖ™³©5V©Ô:E‹ Ⱦç®H}Õ}ê{Ä-ÖƒãVéÐP—³i5IÙÎs›—ËÌ–=¾»HÔR¢î%ÛÍ~Ò;w)­Òrè‰×((ƒûŒä¸îÜc;5[âÅ€›>ÄFe@Žbí“RVbÀ€ì%uìU/$ æ=”þn,'·RÕMŒ(_EÔÒ¸u èúý8ÙPBG‰¾®B¤xÃN‘ü™¡ûF ?ÄÏÚxâyµM˲%õ\ê§þ¹ßßU=:_”ŽK€¨ýþ3Ë}jžÅ‡Q=&úÑo=#RoV7rÛ×l×uõ+£²³[uδÿývŸq?ÿÉ\xá¶Dº®†^PAÂ}„$Í(þÝh7]<‘wE°µMõ†‚eé¸Û`ÛmWÙÈž˜¸èéCÀÌÀäÐÔ¸ÅHµ;5¬ì°ÒÑtÖq¦šïmZ…RÙ×ñ*±«‹•&Ò[) dãÿwã«g&ŸÜj—‰k,wëŽbFpX¥óD)2¢Ø´;:,,9S^ßjtXDÛÙ¡ý%7“J$g̨"p#RlÁ–ÀwW·SÒÛ—›¦Ú !ðвˆP¡r4Rjòèx®qg•v¨ÁˆaQ¥CgÏ»¸yç½G»¥ÁW—§Ÿ~ëÉG¯M?¾Ò¹xÔºzçÏÒ …¡ aÞúüÖÖü”Òg×}ÓÝ+%Z1ˆ|AdưN]þû?J•‡ž9¿p½½o;5»ttj|æÑn‡S")e§|cë֭Η ? P§¸œv óuÒYÄþ“›?ÚÕŒÚ:y·¦ ‘³ö—𺾿cþ~ö¿ùçÿyC…õàìðL¸H'ˆ‡†¼¡ '3(DŠÔ6{2ý´S k(•fAXó´ˆ@ê‘ì­­Àô©uV²§ñ޳9¹;¤'íZt¨öÙD`|æ¦Ï \›½`wùBA¯t0ô#ç$Ie½Á]²ïAIÂ*’•€¡[C’£¢'ùK„B(À* ºï™ˆ@DDŹˆhB1[˜1Ñøï!ôïlaèU(‘  /—iØd·Ágk|Þç#k½xñèÃfŠm×^ßïÛ²ü°\heö}îidÏkoÞжMÄ08ÜÛgR?^Épzßð?¶á%ÿr‹1AEY¢‘2Bv•z™I" *Ji`Da4@(ŠA6qu7 bLÝÒ@ŠQh¥¬LKl¢hØ­‡r7VAç½ «Üó^€:`—œŒ¨´Ú¸Þ8vd²ÿðÉú3<9TZ@¬¬L!k ¾T@h×êÕŒ€nn{f©Ú-ǘÉR ¼.""EÔaöëmimšÉþ…gBhµ|6l€´ÒN*e9®vÆžyþLqõgßûÕ£Z (ƈî;÷Ûð™Ó™õ÷þæ;o<©E*æ5 óÖ‘ onwrŒ7¶Ìp¿ÌO¸-¨UÕ} wô…ÍJ.ÏÒ †Ý€MÕÅÑb’Õ(È Ž´–'‹ÿðnX?š/lbô‡>)Þ§Ú(b )$ ^¯ÊkH@”äW¼ßwSf“T˜=ëüÍMÐ!ºcû®ÏZ1k÷›-Øšû̱…zdqs¥•ÃùÛV‘D,g¡’¨~’.YH¸³ cöÀÁR˜v€i{†•@§“¾¾»‚öHk)Aç FïNT‘ÇÞX!m§œÂs)êOk߇vÝê³!0F|ÊÚ»apÙ~f¾¶)a»—øõÿ Å'™»ÇÈ‘OâÌ>4…Oe¯A?6ñF¸,Ž{|`@$4”Ä'}‚êöÿÝ&{Økì’ »,„˜%JÅ©ïU:j•BÕÿÒo–ôW¾ÍéP÷ AÂÖþƒóãåU`°Kù¢K ·[åVáÚ’¶´’0}~Jj¡ý×Hi•®ï{õƒ_~ôãš u¿{tzQ¤\NX ]=¦  å¤‡Žål¬W±Òf­ÈîkÝk{©T³ ^q”˜‘ˆ”ž˜œ°Ñ¿WÁz•4! Xê0¸NhgJÛu¥òÿĪ)´gƒHˆ¤,Ë ”Ž(†ù{- ›É`*Ÿw/L°ˆˆvúr$à–çÐr³#Grù4%Y ‚QnRÔúƒˆ©ÕB˜>çÑûü>lµM2h¥´mYDNfèÄËFZoýè§·vÛŒFûB…S_ü½OwVÞü›þz¡JAÔSÄ Ðfçôøê .îlmñÐHPéo)ä´š^胿 Õ+ŠAí‘ö·þž‰\wß¼'@$¾¼»pî.›0iL!E•'7%?Æãx!žð0Æä&‚Ÿ˜3vÿáÀ—‚«a;XU QŽ\üQµø¹Ÿ=RIc-‚ȈDÉééç·Uá¡c*3ZÄoî”ûæoiÇv-y:Í»Uutç¯*éŒêáÉÏá3G~xËÃdD‰Ñþ÷ä²öä1 •;3|4gPµÆõ1XJ»¥úú©f›tÁ&]ååGF&¦‚©6PGÆ/Òãûî^ó5fKá¦ï¨DlÜ7Ø®¬1û¬.¸¿^$k,œ“(x{†ìŠg@Ù®yŽ~W i‡Ühkm§ ô1€ -­7ÇoæÏÞY‚N*šTL{ĺ=‹¾ô^éî[׋ëFyD›°nèg2ýáöŒ=­Ƥˆ×5QåÑMù‹©äÑ—T&*¯ã¢,Î c$ØËBLÒË^xzã±ñÚee¡à³ƒ}ö;»”¨/9*¹ 2úO§«¢5>¨¸Ý¬Pp'­Y OO²W«µ~øÈÉ :sì§ Åo•°Á±Ó¡W²ìÉèÅ*ÆÀ3p¬ÔÄ¡œ€Õ¦ì6Pе”[ÚyäiK×Z½ Q"€;818±Ï„Öíªªï°F 0 NúXûý RV¾¸³k«h °Ñ©0 (¤Hk[uöŠÕíF½~vxz:_W)+}ô8 Cg®¼žÓ½@iQS£+&“*NM3Y-½B•(Îa¿Óñ<»äîܼñ°NÙ‘¾r50" µ¶´¶ìñKÏê[|ãû¿ž¯2Kàf¦^úêWÎæÖÞøÎ÷?\hXO€9‘T qsjÜŸo+4Ö¡ìMdÛTpÚÛ $4Ðh^Àe«ˆœ.=nI×¥ÿB$Y.ÅŒd{B/óÙÆ2s{qóx`äa© õGRûƒš­‘ƒ%ÖN/®µ2Hl¶¦@åS“í¿YÐ"Ê>š¾RÖÝÄ{T'é‹TõLmæés•2 »¯Ý9±|—[ºÐL‹à~œñeO.ìaÀD¯Ñ‚396œbÄG+VÐlƒFˆ}ûï¾÷ñ¢2ÃVéÙ¯ýás“å·¾ýí<"ŒaJ ë1>效ÒåÑ#jv{bÂ[áú²3¡¨‰¢¦š'†M¸™º8Ó°lo†Â m• €¤›#­Ê ”>ÚzÒb}… ·;ï ¤˜†Î6¡ìÞÞ985èy¡`îà„í¸Žê&T ª´i8N]Y$õuHûO/Ü ÜÆI¦§ògÝOy7¯=ý\sU#ûVÇúï´·y_Ñs, ãú~˜ð®“(P@_‘öÀ >0äâÊ*Q½ÎÊCáÀ…‡×+¬ 7´ZVeÃÇW¡Ä()Šç½vÖÍ<_ŠìЮŠ&R”5m̬6­ã殾îswœ½Šss’'‰¢Á Eh¯®}_o(QT à P ªÈ‚ ‰bÝB„C‰&"$ñ\©wã'¤h±E­8ÎÍ¢8S¢à›øùdØÿ%¹á7Ì2’5þâ«ê÷}WE^Ä(’(¦#P´÷LÌïßÜTî±gÍ6îøÊQ`ÚùçUÚ£î?\Éht2/õ»6úÍ?¨IüŽCoŒñRwï=Á:Ž»¢€€°šj-¥ ¥­Ù@¹Ø $¤lHRu~x`âÀ0 ¨õ{Úß­¡D0Döľ[7<‚LÁßô´STùˆâÔ=Ä#—v²MD@B"¥IiÇž|1þÕ_].Ÿì«ù"•{éá‰I[y}Å;e{Ë­fEnԬǭËX“C©Ñ8âï„~'ÐiË +K­¶¹BÐ)m+ÊþS¶ùW¿|Ò Ùg•9ûå?yí@ëýÿô—ïε¢=¤7ÙÄ‹‰–¢üÚщʢžš¡N°M#Ž4%d·ê~Èòç¦̘AepßÂ.ÞämÜC˜ïNÝe$µÕº¨Å{º›©é眭VØœ¿Â'§rfß¾¡´íºvô[ääѶ\1;Õ!l§,Ì8·!~óc£"ç_âR!Kî×^I7êÜüøôs­ /(çö?ò¸Ö9Ú²>ªú´gf‘ôîû’2ù̾á!lÝꈩúh‘T2φH0n=2Qµ/ÿ£r8z¸)>zZÒ}!@Ð1¦â[Z ¥-ð•UYªÅ£Õë©Ãø!$ZúHÁ‹Z(Z ˆJ¸;1Ð|Ïø]z+AP —¢»_)ä0¸#‡ÉªS!’êÊe"‹X"ïIç{ÿ¢nP&¢ŠŸELºoŠ%E@€ ù™—Ë·;^°IŽòÔÀeâ•¿Ù´â ÑnÆPœ½á­§·3jž¦~Û@ rwU¥ÈM?M€åbnþ?eÓNß ÿ@_Üÿã›^×öØ!aO>‘ä#e¹©EÀÍ Üm±›µç|•2‡½Fô§SvÿÄÀ¾ýŽðõ²µ» D(ÄFtöhýíu";›ÛnŠK%ÔnœôI _<Êjd…DJ§ûö•BZÛ±ÊÿßC_yzâÚÇübù«("fëIkô¸n…fkÕ;þÔêõÌrçBQütªkQ®&S„ÃÀ; õ†¦­Õr­Bv€}¶‡˜8v°TÿÍÇw[ŠðUqÿÅ ãvõòÕ+ë>ˆBb$N–I$‰e$ñ‚sˆOÞþÒ3 –<÷†6íë©“yÀì¾²×ñm¦Î÷ÿäÈL~ Mÿo—W8ì"í9éñº›_ [³g³ K‡2DÚ½wôYýîÙ‹_yö'ïšÝïßøÚ‘ûõáÂßq?Xð¶þOú%çCipv×XGÿñÜ€n¨¾Ôù¡G±·8ŠÜ¡É:o…n&¥ [[å5B¥H ‚ÌÀü“fóëmE,@¢z×wwˆ†"àØ:ý”†‚ÐHÛ³I)cB@Ò°¶Úîè,Ù¼k4'Sĸ‰s!6DÐ$ÿ7¢{Æ¿›¸âçD1$œD‘¡AD E„”•qGRJ!’0CPY©·Ã€5TÒM”ÞÙÿ9zÙX‰C(vb‰ã‚$Â!%ãˆHÂtÀªÂ–…œšÜjÑùÕ%•`’zÀ´(~ €5ø«ûƲúõ>qún”mËB5õ´Ø-ÊÕÞl§Ä*ü vntâ0é5þ€Ä[0¶O`âT‘ C  [©ø“ÄGmd‘!ÓßW+ˆ®lÚ^+´ …€Y[ùÔÝec‘“7õ@“Êid›Ú N‘DM!¨P ¡r³ÓˆÁ£šRpköõO¿~øáb+]o½=pÐwBÕØ,×Vž{v¦aLioô{¤-Ž^f²©Ynö¥¶7¶ëM_åú¡!YðôÀèô¸Z}ïʲǂFœ¡SOËw|üÑj+êÕ"^”ô&ÉÒ Ÿaé wýÔá“—ßÚ7öÄjúe§²~¨'+/ôEVÿñ[³…"„Ó/ÿ¼ÄÎ1‰[Éx  I9„ÎïÛ~ï÷ο@êÆy¨øÀÛ?xã‹þ蕸é÷¶/½òT³#–ÝcÌÊiyi;Ògà³V…CtÝ>®?WÿhlêÍŠÙZ%¦ÛÆŒlÛ|~`Á¯üÏßÓwÉmS7™:WÇÐ_<ê°þü];€D|PDf@V(VŽRƒ}9æ:in BbÃ2iÍ” ¼aLô}»¡öq[LnZh %l°B ¹“Í%õÝÝ–d²ÛyòL®"ÀñœNb§ G?«8ÿ'ÚË ôHWÝ.þ;yvP” ƒh †NLXäÚÔs íÀ´nÍÖf·C1`IRl@ìíÅWÝ76nÆ/\,:ŒþŽù=ê XÇaÛnI@sWH/7b¦XwWÜÝ7E"§¯Î;GŠû…™uÐ 3‡gÇ¥Y ?~bYHêXë#sªô«å÷è!‰H%±\)žtF'šb)ÖŒÝ Y…ZiqCÓ5*ÆÚNAÔélº?OŒzì»í† D“ x÷š„Úq7:ŒÊUzOÉÔÅ2wÏT@”X®¯H U¶*ÜÖßÎ~ñ侇k—@)ÕŸË»-ÞÙ¬v8¸¾ñÙ§BÞ„ÖÞŽ&.ЙÃ0Tõ6ÓÍ¥­JÝ8é>aMŽ94оsùÁ phN?ur@VÞþÍ“*‹P2JÚÈ>C¡Ú,(ªÍO-ÎÞºt| ÛÞÊÛy1„bhßmá;_xûþS.ÃK —]0™D™.û1ªù°YŸ91³P9úëPD--Ì Û™‹ ÿîðoù‹‡ÿ8¬ÿt櫇s-ЊýF*›Ú-艧<åìÜ©dÇÒ_Íåo̧|%ß0vÅh"„Z>jþžóÞb³òÿÓ×SüÂjeØ7;Û%H×oŸ±Cý»òÃŽA€c &„K]ȺÙb!% ÖË@~( <ô!sxk± Hvq§N]Š8`¯WH¤œ žð)­M`LÓS¤1$ÅŠU»¼Ó®gGü™‹ºUé[V…cØ—$s#ÆxpKªa/í®çÚ—˜Qì#8•›È={$W°ÀH·ÄA¡4àà„;µw6C¨#Rjd‡EèêkcbXWMO%Ñ&íYJõˆXLX–Ei:ž" y(û€ìÑC«·ÐàØ\9õ Ùø¿¯>›&fBPÆö-Ê;ü¤•ò,çê̦&¥­Ñ±ËmuÞmJ7‰T’²+BLj—xTˆ(N¤`à RÀ ™Äû”ÕT&—*0 •7 Ý&×2ñŠ$c Üb}Ë WëÞÇ›¬ ¨ØUc’‰êtîDʘ™ªß 4Ü^úÚsOÕŠv(àszÒØÁއµ­]O„ƒå¿õLËw»{“^S&Æ¡46+&4¹Lki³æ‰Ê*¯ùü¡ÃîÆ;ï?ic2º.\:…œýÜÒ¶´ã8Ž©cLÂ(4—ŽŽ?¼õÒ‘;HÊ»ñ[×<O^¯7nÝ9÷g½óÖ†Y¿NûÓQE,&€fŠk«ÃfêKÁÖGÅ·_™ÌýöÕ[ 4p¢ž£î]Ũ4ÜùÁï¾òþLgçßþѧŠÛ¨wæ-iî–k%I-tÎæŒõà'm` áOœ†"é‚í– }ÂÈ‹^ªÓŽF#Ì€“™×DJ´Â »AØñ‡]å¢v-<8Ñ*¦JpØ"­Ðšk°µÝn`.µh[Öîn.Ò+‰~ ÑÏÊBIPWŸÞøwY|IuÎ;QP136ú©Ñ1 Œ@‚`M|ƒ‹ ( !ôúÝêòÍ++C&©œ¡›ÜѭݺÀ!Ù;f—^”%ŒŒ™bÓVPu)ð‘`Ápú>FA‚‘W˜’+“•@¸°2±6D!° Hn9&ðqÿ™êå/æ—ïÕQ@MÃ;4rtîATì14#;°@—é‘üjò¨è˜`£LåpÛ¶Õá8‚MPöÚh¥ŠC#š™ŽU­d$DA´Ôï4錳ÙÔèj]¤ô6$|.ži¥µëŒMh­³fAÛ’Ÿ.}aX Bpoéø‹CÏk¯í4<vµw3s(Îr€Þ^\„M( ÐozátÆ[Z«z 2#éjß·Dæ®Paf*î{åÌ€¿úÑ[Ë+ÉÝÝ\è¸GCŽ{À²¡ª\=zôîÊÍ—.n4›—‡N#ˆœn3³Úùñ¿<8_Ø/|àõŸz¡D¡õ¢ÃO*ÕDDyõÕ‰'W_:wAé{ŸO-ž„ñ}åº >|ô[ŸýâéŸßïswœ!;jB:ŒX—ÌÐÖ.¹h@ ‚CÝ)¾õ¡5jMôù"^^¬ —dIfPÃõðÏ™¹Në¯ ×·ìíé¶ÞQ[ý*gͶ_qŒþ&þ¸£œÅ l@É–Ül©ä byÍVµ 4sÛI­Î6Ð-Uj±J&eJ7R› ɶ ÿ0«,ßpËhB0Â^VË^˜-lîäCËoö 0QÒÙÅÃaÀˆ»+ñ‹•‰?Ôvý«QŽlìÂÔKû[ÂଠðÁà³0j­5 ¥„,fÈ8õÏ.¿¿Ò0±|€¡G4NDMÈìºø”ص}ì,*&ÔÄKÆãX·C«Z ˜š¬ÔÕáÖl$îåOÉL1¢ù¶¯~D@?LXû[Ø `ðtáûù‚±‚«²a1h*X~‚—œ÷+ z)~ ’!.»ù$Øm *E1î0:šèC6 éú0ˆÜB¾ÉŠÕ¶46[@‚¬”ÌÝœ3H:ï׌R¤2 "IjtŸ F4ÔÍa“H ¬§²kAÈ"€:²Vç‡ /̶I¬ÒÂÜVÐì¤-ÛÍ”‹ýH]‘YôacX”˜vÇCÔ:.­UCVîpº¡O(un¿w¿e ²àŽ\xfš*o~p½Å=É{÷Éhˆ&Q´rD ÑdHLˆ+—?w~óƒ£CÃem•w& (L·Ú¾‘ÐÐòÏ¿Z~ÔŸcyzã-ßpj—@æ$v~Š ß\Z^œ^ãPvnO¬%çÔLÅ.ÿÇßü³gþlq¹m|?Êo EH‚JPÙØêÏD'Ƚœ?ý¸2Âãøï¢¢J#:P2L·ü?ýÌ›O:µÿÑ{)W©c‹nØÚ:²0°T}Œ¯Z¡ûÍÎÏý(ï>vÒ1¢ÕgI&›A˜o+Ï ÁR(Æ€5P|k «—ÕÅcFg|4¹Oh Ú²iºd5„¡¨˜R‚P©6ìb°øÕÒœ7a""݃8‰£eQÄ]èw’w³'É’f@EìNÆìÙÏôƒ‘EÀ Ù ƒÐ÷ƒ°ã V –íZʱµåÛŽå:Œ!:üõ‡¿ú°vwš=ÀHdª•0éE…Qq Þ!ÜkKû¬ÚU«¦XÒc@­Ö#H)Ǽ ¸IèÌÌpã+9n’ÔsÖäœøªxdòÚƒ?¡¹m,§¥hªôk?uvçºýÖz°´îGá?ö Í]PDa0 •qB昑œ0VX(ן²Aæ:ºÞF¥„E‰"u¨y¿©Ig앆¹¡&æx& ¬âÔTèê'QQãÀ%þŠ×n@BËM»‡/ ²É>lÑû ´¤å‹ ‘B•S;åZ€Ž=:6Þo­üàòNl0kâùÐú¯Þ˜÷£‡Ô q÷ÑI¬]›­gï‘âG PjãÚþ“OnŸ=xô–¡ùöaP¤V:ÛXTD@_ŒŸº™=2þrÃ<ãê¢ÇUalWWõß«¿Ò&+\Z^Ÿ„¾ƒ³:P"ÝüŸ¾u¤¿äÇìr'™M ó‹k&gE6Ï#ßøùêó埌1õú¯XŠæñûÏĤ`öÿó¯>ï<èT¿³o¼ÙÊî‚ö¤é‘¬ ××·?›bý¯ø-_‡ÈÐ}ÿA]{¨¿_Àã†mŸ"00÷^Þ@dÕçÎ{:²ÎG: ý(’#¡ãhu4$Q`ú  ³pÚ2QØOàvyv¾1Å´÷j€ÐoGŸ$Ð^S.ƒRF+ £ú_þ€¬LØj6›ÕfÐîx¾g劮¥m'›Fn×;¡¶v7|Œ›/å\+“Î@ýßúÒ;?Zñ *éÉAâË ‡!Ús¦'d8†\x¬TŒÑ¾²DhÐÞ ·p¯§A†(ë4ÖÅl–C@ã§w7&wá5÷Z5í¸…¡¡RÖ½zŒ¸çl†8céêNËGÈž:šõf?¸^ ˜@BÝÿò3…àÖ/o–ƒˆŠ±Ê ñ­ÅQZ„ôb&¨u4†Zî=yùÞäù9à•' T“'ÎU}l;åŸ}s`¹¯$x~¹"lˆ£µÝýø#\ qsýÈÈý«¯¼ƒ„[¯\oeáôûu@€ÐîKߪL+@([ù!" 4-wxcGúÈ´T¼ïk«kÎã[çñ[õ«ÀaÔ) AÔäF²0‘½òïþÍg¹zëûß8`` p£íìfÁŸ/›Ù7¾ Åú|Ã(ƒñÒVÑÎ+]ʦA¨¾lÈk›@ŒÑ›«Èêom)2IP E…(,H;Lö2)5à7P!c(ç—ÓšÓã»ó —§±.ÙM2Ñ$¥‹•N–nˆ‰EdÏxN€ˆcÙ @úØ‹/eİ ˜zsk·V ;^/ iÓj´Ú«•¦6ŠÙüàñ>ÚYÙÝ]ZI÷åú3vÎuLhîù·~ºâEw},!ÐtOØdØã>DÔÝè‘ÒÀ‡u= SÍÀ%àÌdmO4ç⧘Q wçÄ8öH,×ÿ5 PÈ8+÷Aþðȇ÷Zœã­¶CÂxL¿k»§Öo†Ä‘$*rv?â¤Åï%|)ŽPa(Z‘`0&H´Ð~È*îSüc£b´r™ì`?Pc¸á“R, 1[x°J§2íÝP!äpRc︉éDË™¡Rîä˜`g»xb§3XxnŒƒKžÅV±º½¹þðÑ^wËîëÈ9{øì± Ø´BÛ€­ÛM/Ð¥ÒÙ‚ýýùjƒõèñW¦Òoÿf®ŠP„—ŠÛ£äN‰”‹Š{tÌn2U\cJ¸seüÈÌ㓇¯!Ø«¯[ÆBíιG*URQ8óÁ+ï­:Y“}in.d?`ÅIÛÑ”PPÄ46ò©‡/Ÿ{ !À×a;g&Fj¡„”*í`WÙ" ­Ì’°€ˆ©rfx³ê¦`;M ÷çÞ½~Ü|˜?ýçå'®ï‰¯oÓ©RëÿÓöý{•·/‚±PZ•áêíÿqkjc÷aæù”ÉüiøV¤1@ÀÔ—µûòy- ë-àv@Dˆ¡a쟼¹ª¬³Ô¶÷&O!F!Ù1 ”­m÷h.HYl6†Æp˜¶v[c¤²ùÕš¡@ª9Õªg™LbAPq픜±T º:Í$²>vÓ *•¾ø…Ã.Àúµ­ÝJ§Ñ1Å©ƒ9éTüÆk5}6°±™@ ƒÚi»ïðäQ]ÙÜZK¹CC™\ÊÁ0ó¥§ßþE¥Åt)‡ñb;j­£óˆã‚©+îõ‘$ˆGaK×õ‹ˆrG;Áò†ÚSÇÏW¤C‰¾$°ûùÉ0’ÑmTl/ô­t¿ž\ÿEê@Ûóܼ0ZVßôÊC¾`_)Å ÿ$î ªï®ßaˆÁó™ÅÌa„Ò ™C1Â]ž "fûJýC®¨…–jW­Q„„5˜‡5A˵×Ú@ ´.¸%dºÆõGÔ¾õ¼¦ˆ$€V&u0'¸Ôðý6“Ò¶VN°A³4?z6íµû ƒK&ôßxðÓƒ×ÊùþbÖÂ=F¯D’I‰sKXòìfG þãw7C_<„ôÄÅç†yîý+«£¢D˜n&›Ä!ÇJâ"ºÝ=Ù“p1º½xóÅ“ï_Þ÷ÔCñ T¯¼°;LXZ¼óÔ™åŽ1è½;}özꙉkAh tÇYÒU«14ÞÚX~ñÑtß#m¯îŸÓúÌzË#­ûG³Ùb*ZætjŒ~!£ê>¢´ƒ×«áåõQX¿óàÔ½wõþ?ú÷KJ”ÌË£Ó7rµ0€²æÿÇ?~füµ·üS‡Ÿ4¯:¾È4i-\½ï½š6Ο4¯ŠDÁ¤REL "è=ñi-¢L'˜öì„Ô€·a'ꓨÌ0I /(eY8:jW#cŸI´ 9Àt.Xmœsû;Õ]ƒ¾Áª¤j^QâØž˜ì Ðý Å'€P¼êï†Çƒ "2jôÜë‡,Ø«onÔ; ;r0TîlÔë)–RA¨ÐAcêM^ºí:}‡LóÂòüj~p(wÁŒ|ýüß߬‡,:QÒ“päTh{úŠ3×Q€;-[âÛU­ „Ìà¶Ï{JXEO➊9jŸÔ‰—QXHÜêª& •>¤Ò[8"2[õSu •R£ƒ?ö—j—;$h"ÿzO Ñ HĶ ®f˜¢îQ{!aŒr”â3QÙ\¶Pð ÖÛZ!¨Pùhú&g怔õ«> ²Rƒ}öp¥»˜ÀØ«¨•Vé¾£Èár;h$ÛFµïi QÖoé‹ýáÚNntôl»QÁ¥÷»Ï¾´ÙÌälú¤»·óéÊŽìÜ8¨`éÊêj'ôC±ÒÓ//µ>~ûÎNˆHB5±Gcí¥ÈÇ _•´ÐÜÝøvË2„;wMôßy~âä ›Œ¹|Z5r€ûÞ¢g_hmæZ?ýÃÉ}%4—*AÈÒÛ3`2d•æðú£'ßmøê—žÔKæÄåm+„ÒÈ@¶/ï .†µêúÀhÖjyư_ü íƒËóûÓ‚c_úùü‘[Wœñ#¿÷ïw5˜ '%dNN˜×ÿúO_ÅõNú§ýϼW¶wU“±d7ïÕOtZwåsJ Ê(”KYùRŸ#€»v|%"ÆgV¥±…åœÌ|KqÜCad€^J¢h›Ü£E“¶Ø7àùé0vì•ÅjÍÙ½P"´:£5º šDDÝU”EÖ"Jòлfã½6Ž<ý¥ }`S_Ûj´êìžšP•Ù¥Ív‹X9ÊBÇ0b¨"ÄjÄöMÀ̵•ßô=Й«56J£™\:¤éÿêÊOŸ˜¦ôºÚ(I%ÒxFË Ó¥)1Å»äèÄ @,pC@u”ÖLƒ™Ê üC—Oµ—þíÈ©ðÛ¹À ëjÍ…À m™öÈaØ({z£#f{/ÃØäõ¹ iÿ)1Çt‡hÄM‚qFH7?15jEȈÂ!(0b)²)^JFhe ™¾Ñ< Ðb•ZµF~;oú÷k€*ån´ !’ÊÒˆ ˜ q—&*˜ˆÀ‘Ôþ¼ÀZÅä\;Ý÷Š‚©ÝóÏ ø;íÚƒêÙ ¯ån¬bûG»Ÿì€FèÍ…öî!ŸG;F€ìà®ëlõŸ{vÚÚþñÇÛF;ä¿„‰´‡pê›ÒÍxìfQw­àȆ¼Õ«/L•?øêñû6ù°v÷¹•´–Rávÿ‘§~m8`á™÷^ßzp!%©› –zQ÷KöŠFùÍ¥ƒîÎ] àîçúVûþñ•6¥Ƴ}¥œБôxn¦µÖ/¤9dÍ­`È*_áðþ•¦­…~þÍÊé;÷íÑ _ÿv @â+8|Å HF²×þþv¹¦*÷ž;È¿jî06òvÃ<¦©åÖÝô+dþ<¼¢ B´KNª˜)`0/¶×R¨@DÓ>ûnYtÉì GÓÍž"Ÿ8¾ Q[Œí*²ß…*`FÒª>·Q[N›]”е:ƒ*‡,³7ŽKÄÄ“mHd}Ýõ%î(ADP ÓÏ|mö¶×6ʾØgG­',î¶UV“P”“Ö¢9ÖÆ×ö”FÃnnÜ,œ:“Þ\XXëÏdŒûêÑ@Ah#Â;ˆ’Bµ„1gK’äáh†k)<††¯:R$Ö0,ÊxzŽâb1†bò@!@EÏŸXʸˆ]ø^oÀŽÄ½°-ä½ô/Ò„îÙõå<ÄÍ•û³‹ÛæØ3§vïþò㥊іe)­-Kk­ ¿íãë $m§]G…Ѹ,í=¹¹]zªT]Ù¬9¹³#«A'ÒEžÇ*âÈì‘hÞâà1L ~Ñí÷;ÓåÙVX+‹ d_òª^ýË»¹À³„9²É ¢5þoÒ,FÇÏn9®¦Å+´ÿujlmµÍ“”mÛ©ã§~2ŸûVã¯*˜L(%Ù%Žà(ªº$Ó(ó¹Ù£Åx«ºÓ Qét±y¯£m«î1Ç+ @È íDZ¿¯Úµª…ˆ !嬩܇O Ú™ÂΦ¯ˆ”KÙ‹9•Kì’CJ1úäPiÒJ)+uø¬…•…­VІt†ô…gX˜—ïL]¤r¹¾½¼Ó0Ë—‡ÏŽeUaØésñÑà'þ«‡¡Ba5xúÕ—¦s·~òÈ"ÜGH'‰é¡+‘ìaz~ƒîp·K‰G…tXžÀ©¾;>iŽYÏi±› LJWdÁ_»äÜÊ3ÖˆC‰vÆ]»-Å^ypRÃk­gÕcDj¯­d$7[£}öPÎ&AXZjL~„«­´Å¬ jÕ=ØYªôçpmÍN‘) ßÎY[0:´²AÇ$¹ø{  jÞyö¸³½yþ3Åe·Ôÿ¡ñqǪ;Á>0™³w¢ù=P°GlA˜Ù¤°0)1¦°ê½G@ª?5×"¤=À‡ÈGÇnYvšG»O) ý°]'RÂØÏª6ëÁÔq¹ÙiU} %£ãã‰{ÙËð‹?sD’®Ñ7yAP)t4ÿëßbFj<¼õdc·ÿ¹çäê=i)ÛѨ-E „14¬”mY‚h L€5Yˆ!)bQfó΃ÔSÕ²ŽÅ¸ÿ|eG„)Ö&Çû SFb˜@O"Ì1ó!z¹õï÷Ï×ÚáVGÛùÏܹÉ_ÜþGŒeÈ "ÉQ… S>m Ýn4ût+ÛaðM¦ „fõç†`cw'\­Ø táüÏ|òå·ÞñcÓ>'ê1Ð⃡× µHYÙÔÑR^Z»n¹¹DN¡þÀÃÔ;,ÝŠõ LgE@®îè­ªR A³ëØ~¯E*S2 B"m;ûÝKJå!1QQÜ`G¸%"¥h;[|aŠåö‚ßð´­µ3õšÍ ‹·ö=eÕÊ;[«Û5Fj]­>h _š,hÜ{íÿ¯þÕ DÇhìenÿðN‘€£ª˜¿,?²11yêÈ &ÜŽQRÒ;K†áàÄêÚ¡‘­]Û„›¦¯"Ù «B0·\ö­'`~·á…ˆ$ééëÁɕݭhñýÎ0VÙ EþU"eÙ”ýÆÿþ€°Ñ­?)7¿45óï/v,[ie+eÛd#ƒ(MVÊNåÛ¶µhʦ²iËÒ¤i+e©(o©ùàVêéâÆR=P)âì%guÜ$À.u_“!uËy‰·>4ñUg¡Ó¢ÅÐ&Í#/¿±iëÝkêO›P×$Íã>ÿe Ù¨Û~Ÿ`¦"¡ô—R­Ñ ¬Ô«ð@”mëÉg®}`}µðÝ'Qs< ‹ fÝ”·ð˜(Û“nY”vRÙcŬv6u¹A 0[¨Ìyè@Ócbj lÿÑö= « EÌÂi½¿ðÑ}A;›ß){„¤\+Uš8oT>fÿ2Fû’¨(Q„ˆˆZi•r÷=íBxoÕxmÇgൃ¦r[ŸÏu6j;ë»-/`Ô°Z90^*æm„zßòõ–¹†[›žÅC}‚„"£I¨ уx\Çш4®Õ‘÷¤LÇÿœÂ“´\?Öw×7Â呱ކ4Ï® Ô bˆ¼4qü®?†Ï¥L_k¹Z¹´U½â5ÃÉáL~Ó–Z—4A_ÿR1\,¸G?î° ôÂàºß˜E‘j>9;QÉ÷_»í<›±v´zÜi±˜Jjÿn»¦&@2Çç·‰Ñ*•¬á±1PfV©´‘$„ý‡¯ÝíR)=W³’븪A1ô@k; Ï7ë „tD¡w3ÖúüfS ƒÇi}µ‚m$|îvýÌÎ EDÆÄ<ñ*MŒôO`HZÙŠÎý7Ï©ÀhoöÚ£ª{ì%¼öÓmÖŠ”eéØṲ̈Dz]­T¨´Bp´¥X„A“€ÅBBÇŽ~SÐ~|×½0¶ô¤ªµ#räèRCG¡iIïg °DyH(€BÑ¢2zuO.¸ï5Â$ ñô¡¿k }îK˜Tiq¦M$ "@ Ñtð¿vÙÔÃ]nßÍn%h¹‡R5Óm¬o4;µEÇ"´.Lý—òÈWÿ¬ÜÌÄÉHØ£yâ'\3˜„¶""hÇÎ/d¡³¥v}DT`eûÊsmqTÝ6I2PßðÈþC94÷¶TkÇèXõA©#;ï4X¥ °Þ@D­m»T<;aT¾‹ƒïÂXE@EÌ5¥ˆ”NNG^yØ cÙ*ÿìQØxÔ9;,Õ·W·ëMß0’UÄÁ‚£ÿ7_üî¦>zûEºÞmÈŸ<î±1¡Gkìž½:SöÐñ“o’)«|cdPŠÁ=V^=|lÐÎä«e”²ÔTöBAT¡ eL`Ñ=AŠP)Ò¤ÝôðÅÃ×:^Ç!¥O_$‘àɱ}\®–W7«í€@•†‹™T^ÿ/Ûÿ`-{Ô`QŸD!3ˆˆ”N o4 &1S{‰ñÉ f¯‹»ë~ÀÕ$ÔÈì H“ð´½ÀÇ­ôDê't¥„hgWƒéÁ9_„w6úÓ&kÍv$LD¤ÔaGŸŒ(m¦üíÑÃk!@g|t{蔇…>±5×6TiF»V± ¹F>Ì«¶áöHÊP';¶»¢²(k§¹:a ë ‡¤ÛîÉi!­o!»²ì?ðŽaÁÚ{V¬}`ÅÓw`f‡­þ±¡ŒÍÍ;^§IÚBÆ0 Ñ#¯·©PZ¨ZITŽDÌ"" ÄŒ¶²`ú$;y£ ÝÒJ¡0„œ±×W¶Ú*ënòoù¦ƒ@çV×F ÷A‘(¿¨h`ò‰™! ZŽÖ/üùy ׮ܮ§O­¾ýÎ YÚ¶ã¹]&•ɦ3Ù\ipxhxdddt¸`pp`` TÌçJ}…b>›µ•íØD‘å’1¨uõñÎÔ´7_µµ ©ig= 4Œ*6CLþã=Q 1w“Ý+~}rc½a¶ªÚrƒÜË›¿×üÜ“º%DD,ªœ´õ©¯€tü憳:縖Áþ‰òÕ¢í£Ùl6ä±Ò–¶\üõ-ýÁ·W“Éx$ßKÒ#©I÷AGìö³(¨];;ÝŸ€Ú®Úm¢bT”ÍîÌ…Ê•ZÀãèìððÐá>@QÖT³ìiFFqô©Ú[5Ôé¼Þ¨3‘åªÑì%KT¾«£ézBb ’Òʲ,7øœ¦ÝÙ²jÇR£¯ä ˜ÅÇûŽéòvym«ÙY­Li`tj8£þWZÿžä1VbI Š4‘øž C±VYï?û>P‚„çˆ1m'öDv'qR[¬ñÄžé³0dôÈèêÖ‘-á©åL 8e––SÇrË~È f«xl‘J †ë0Ÿ„ØÆèA±K#Kí‹þŒùιÙR†­0•Ik@•ÀîÔÂÁ±ê˦TìO/½•™îÛâ±Tg ·¾£'+:µb§‹v%?OEgª±R¤ ×*V$PÊí¬ô¸w}3?tD+àÆ vR“`£T3<:Œ–Ü‘áhî´ì (¥% û”õÁ29£í¥x*h혠eiKÛ™t__ià©Q»à*d#¦åÙ F…tsnm×s³í#Sx£m7BÂÃð8¿ïvÀ€]rw\DJ“ë’êâGI—þÙ7úCV•;76íã'o¾¿¥‹lmYZ°Rù´•ÍæûúÇ÷8°ort¨ÔWÈ[ÄH¤3}Åb©40Xì/ê|F“­m!‘¢”Äò:6°¶$yzzx±MØl$[µC„Ý„Ÿžìž€ì^˜ßÝ¥eµR/\ž±¾òømŒ¢ 6*³#b±¶Æþë-o•Ûw‚Tz$íÛ4˜ùùN&Ÿ¤NmÇ/—•7}©øÝú‘Ï_}£ÓõG$æŒSN»ç@¬›Ø³A@ËJõM÷e¡^·vkbBMÊÍ6g}í†@«"Hªt|ÿ”@íYª5±¢œp¢±‘«÷ é\¡¾€R¶•+ ]Љk3–ëwmˆ„DD$¤tî@Z`¥ê ’²í‹Åpw¶tªo6ÊÕFÛcTéR¡tÿ·jÿ!FT´xÑÈ *ô€ˆY+dþçÇ~°Ìh˜“!\ìV‡½1ó{ô&(Š£ DØI”HN‘ gØP¹1pâÊ•/Ÿ}R>x­´Q„ãk·ÞÚwtírÈ€þêо¹þq¶^^ê€ñ BL4r’lŒEØ´—F k['Þ @ÁíO î fÅ!€ê–¯M3šG†¦q¥r¦˜k¾yæ/­ lÍ<=í}x;;¾˜ŸãÂ}Γ©ûÙ#é¯U.ëˆôÐÍ΂.ªGLÈÆÿÅÄøÉ{•àí³6q±Ï'RÂÞÉO¬UñåQsþ·iÊ mØØÖF £PGî¸b1í¬ÀBÇ"ËÊ¥‹CEW!)DRS)EŽpÄÌ$K»)V$v^6MqlSö7RdPQmôãÚKi/èj;)ÖÚtSÕºëA…ŠOÿñ! É_|´FÓvßx`JtÕ8ý‘Cn>—I;ø­fksm»áW›  B>í¸Å£ýª8v h–w+n{&ð=´tH‚ðí™×ÏÏ=l8Ÿû/m¤£¨ÙKN‚È1–7ÆnDhÀþØàP@Zƒî])ô?ì5éñ(!ž'")÷‹Ã!áv+wy+Þv‰Ô@vñ~º]Dhø-„J•>^¤KæF½§.MlR‘-;æ0ö\Òc–#³¶4‚R`˜€HQb‚='w¢JõåKC£à“ZºÑ` Yˆ€ÈÞ·v/@²2ᮣF%ãT!èd!ÚÍW$œCU)BêŸDn-Õ…,:yˆ›ì³éÎNs}c·á‡b”ΔJcûöçäŸdÀJo«!b|£\¥\‘úÖêNnß`Ño†J„A @ˆÏïÿþå“ÄlnÜk$éRž»]r¤í@³7"'ÞïF>b ¿¹úä@éÞ¥©CwÔë¾rm2d?µ5ÿ÷ð\宯ÔåÿÁÊB_&|q£ãpÈI\%öŒÄí`äî­Ïžú Ý™9¿(pEzKž¥¶=AMÊWAH3;¯ Ø£÷Ö¾ûé§úwÖÞùíS­{—_46¹,c€#¡ãßÉLæó‰ÝLç=ût@ý0÷ðþó/еææf0 ©áª" ‰wṵ̀×|óµ1Îü,(d \ðÓízÑ„@™áÆ­Ý ´2ÃŽ=6xlÄqì‘RŠö4b±v7i³~3j@'Âu m×Y5m§Áß®X¬„º“¯ê Ö.QL’ì-¸»I!‚h)´_ÿF>½yk‡Î¿¾ØÊ¦PŒ­m;í*L•úG³6†ÁæìÂÒb#4„Ê(@2»H„Ê¡ÔñÓ}ùtj»Ûu?l7|£”²=ƒB«ßyæåí‡Òxø/þ‡%¥Uå“ (îuÚÝàu¿ŒpÂòZÆÓZ‰3 jïÇîÜ$©+q‹Fé9>ŠïÕ[¹íÕ”EÁú~…éÖ‡Ys} ì³êì ²µ=•ýóg6n=;dq(±†)òH7âHâ@Õè_D¥¢£4¢"‘ ƒH¬t"ÔéB¾TBìàÚPÝu!h‰X*„ÐwÒ›÷øñbÿ‘а „=¼=‚–hË`$QoFö ŽÕ©sùz $Ð_ýòÎJ³í/¯äú:íœïBÑeãJÛP’]  ”¶%÷'/qHÞ;•ì©ÁµÄv‰ 2YY‡²Jeû÷ d”tn?º9ï ¢¥!”Àj»ïàhÑv²ùLŠ &kh|ß«U¶j;-v[+ðßÛøôù™·Ï·pè¿ý× O™,QÜPì-‰=fÝ„@A:ŒMöí*(MJl8ÚXN²9â'˜âODT4ðÍL ¡)ƒ\3–¶¥¶3Âü`Õî?ÔÞØ‡FqfÒ6²:|DÇJ?ßFÞ“B¿'.1ŽI<Ù*ºÿÅ‘IF‰*mPÈ ¢bŠK_trùÒ@p½J:Û„Ä,6é‘òƒ&¢J3ÒÎkeå¨$€:Ôp¬êå³""*mõæuŸµÎ_Ì0ëk§†¤^­lU[žJõJ§Ú{oëRcvA˜BÐÙXá“9]_Ô!o­ÜØwüPºêÛvÓ²0TŸ?ø—O@ ²DjÙª›.ÐmæX"ËGôG&¸ÂJ(/q=ÚÜX]<2»\>2ùDjçñôýq—¬Æôúµ‡ž¹ð.A›Uû×û§¯õ‰õÙGˆßÂd0#  ì-™¹||Î tÅ+v4‡ê¦¡ É |òûOWþüÉký×®- }úÃ'‹ï¼z©õøÖS'¯;ôàÈÒ0tæ:ÃGþèßv9bè BôžBü|z~µ¸Ü,½ŠWV¦6'ÍÁÇ~»ƒC±Ã>}lV~þÛýÆLæÛ}ÄóÕ¨ƒ%ÒvuêàøÔ~.ºjLÔª™faˆây;ŒV*í¦ –¦è3KŽ¢¤¢R±KÑ€€ U©‰¸å¿+—†ÏÔî–w<&4Š„‚à(µ„ˆ”æCÿf"Ú¼¹ÈÓÓ3o¬¥lFFK¥\Ëus¥É¡šÅ{<ñP¡Fa˜Ü£Çû»‘k€£¥P,3¶ìL Ñ4ªËK›–¶˜ô£Å/)´˜lËuÓn*{x(K‡7.o¶µp€ÌJåí;p,£,(Á9Ô^Ü n1—Ÿ¼ÔÚY]ßÞ©{~ûæ?×ÿ z±h;´ï‡Æ1äHò’CÜ6ÆÄ2Ž^·Ìlg7ˆî”²÷ µÿïAIÚÂQ•,]e*;?BèyõâÒ’e“A„#éÓ¿|òœ *ªÖRµšÖ¿²†®Ì… Èt³“‘@T"w¡]ˆ2%Îæ0Ù= ˜ÀDú&ÆŒ CÅ"Häö æ67ÝF[”‹œrû÷šLv–ë^„aVJ,5®BMj“‚ƒQ@ÅX|¥ÒùýŽÁͦÑÌ4vZ ´»‡Ùì–×+Vˆš2ý‡ÎÁ1{r ƒŠh€è¤`0@§”Œ¼úÑZh:9cfçö?5éÔ}mƒFa.ýAéçÛ‚*eDcq†O¨ó»¡³{šÑø„»+iBFFnn.Zºyüðþyª•ÙÉ•ƒ ­åñó;¿øç/¬Ï#óG‡Ï¿uÿ,à3¯ù¶áØšÑ áAÓ\Ÿ(ÍVŽäë”Þß -ŽXµª±:­€X„Äì;tûfþßz陟lî˜ß¾èÜ›·_|áW …S‡>¾4:¯†§qž±?»ñ(#"ÌÉø"²Šƒˆ„§¹:Vùëöìš½í+Øé­ R-#Xýàùƒk›³'I Yhú÷gÓ–4FˆÄ Ç,í°%ì^Ã÷C`BÏÛÑÜÞ-8¹AcÜè#c6a$åaF­ýZ¹†T®¶Ø 3óÁZ 9c[ÊÕ1³R ÜÂ4`Ø ÌæÍj{s± jMH”ýì婢Ú×gü#Ówoí « ‚B+•qÂèXÉ f>º½Ù4Z û ˜Ù79}$“±B £&6*ëX„9ôCe“¢^Ìtjr2l¬/Îo5ƒÛõOŸxðîô)´>K×D€ g¯C‘Qº`žÄ…?V ªbGAˆ4Œëj€î"GÀÂ8r@E6ETø}7àŽìøê¦e)‚Õ?BdR'Ž.¼}.ÅŒ¹ìc´EañàÖ¬>ï|P£xÄÓÔu?5•ãé‚tCŸãÞ¬èb#Ì–ˆ(²t,'ŽnpTn¡Pè·0\ ¡SEbÀ•ò÷6-'Õ¨›(ý•.À0€Ž¢ öJ9Aˆ!RŽªôÐ`{”S|*#`–+—RÁööÆF³Š'{èâ ð'§{=ΉÂ]åH‚Ð1^˜S\¼t}MÕÃÀ€?³|ìÌ@»Ål»:_ýÀ “Õ­ïý'‰/eµQC‘à€‘ÃÚ͉=zñè+dþàO¶F¡xG žÿÕí«O_ªìbhŒ÷“¿Ø??Y’Üë«‹„Â]vS|ÿ# Š¿Õ]¿óì‘›zlÊïd  ø»laÍ3¡¥HÀ¡Ò±æOv,P•~µzùZí+§áîâÍÓ/ÿâaö@õã3sVÀpÌæO:ß\šÕ‚ùºF`Ð^GñÒKý ßþã™üî`àkþšÁˆÚ|÷Sû˦œw” #L¦la6>ÉÖv›šéÁ­û&0"ÌÆ=B¦€U„}FeÛn*¥ó9%D$(,À! ‰1ÆXÀk›µt»µé[žÊNTÍ£]1Zg'ðÞÁáªB+e S^hä4J{×óî-5j+Ûi$M}ß|½uy£tߘ ÐE# RV&•)LSùʵ…:# ûˆ™}Î —Ò"™ ˜ˆ™ ’ÒÂÂa-ƒÚVÝÀH…â‘ÚâúÝ핼vþÁk*…Ÿ¢ÕÁ˜ñL̰‡ ¯#À”]õ}åZ#§+U˜î¬P* ùˆ…£ÀC"÷óû„R« |P³\ÛEHïï_*Y|BÞŽ¡8n9 ÃcC¿öí§ªWCÅ1˽‹­Š/2án>ubjX±ñ=TQï‹–v€JGÃ:Ãq"²Îåó…`c]5[že) L– íu$+¥jÆ2¤(c ‹`[“°MÐö¾º$Ž]g¬È²[%-*}lL„·×ŽæM¥Z]ß©wBƒ™¾çžIñÿrøŸ0š4ljÍ&ôA”¿åj)\¼¾ ;&0â_¾ÿì±|ñ-¡Rß› µ1ØSar—+‘؃z±1Iè t3â@Å 6ØY]™xxåÂôû»êþöÈò0eŠëÎñù{oŽ[¸¬ÚHÖÚ;¯¿¿˜N™ƒÏVw,ÃIž0å€ úÕÕ ÷þÓ§gRÓð3JÀ4:!Õ[…®Š*NëDñ» °•ÕÿQç ß*ýzþ{ßÜQ–$åfÝT:wh,Ó~ðÞÌŠQŠ;¼ï©©Ñ´°š¶àµ=iû <ÐVªo$o;¶ ;^s«©¬SÈD!)}ýþ‰ÙÙõwΛÿ¸~2£_Ë|;ʺHD‚ȱ~\ˆ#:0ƒZئ hNO¬¶pjw ÷²Œ%áNþ õr¾¼äXdIHƒ‡¶ò¥A_Ý~89Á Ӓ"¥ìýú#Ü7qkÞS<”îáO¸tG&Å£R€„rA8vs(Šð&ÀJ€DD1“/ô8ëuÇo– ‹ƒBPN®Y "Á(M:ÛÏHe äT&;$DF¥‰ö)–õS 5v„Bì<•æÖöj¹é…B(é¡Ï[üOWÿɳ,"ÝÄmr@ˆˆLè@öä½²±ý´æÏæ/„ ›‘ œïû«‡!V…h`ò#6X¤¥’Ø™oX÷`g°»ò6~ãÁÐÔÃN¿$áÇŸÞjæðð#>zqwíÍßqqKi4êã#Çoƒzîq;´¸÷*Fì16ÜY;>´275–/Y±ƒ6ë X"†LzôÀãßøÊjèà/Vþø ¥-}û+'R×n&žùàÊ¥góÁËÓù(ÄC»t¼”Vݬ LhÂüvÝËõmÞ]×öøÑÉ­“ÙN¹RÝlW¾o EY‘&T(`YCÚØUÒ„a'T"Ì`”åõ-S’¶8í´›n´Ý)Ûinƒç{ÕúNg9WKʱ´‹`Î1äôx¿&4jx™`ØIù͵PŒ•¶SéTnx|È©¿÷þŸœþWOg„C ;^»Ñl´Úfà‹=~Ôq²KüV½ÚÒRß]Fêï· nnï”çVòC#©hM¡ ÿô‰‡®L?á£YýÿmM „‰ÈŠ ¾E¢ä’xö]œ jûÒ+*“½ ÈÈ”$p&"Ô/>kÄ÷ê~éêBFkdIO=¸f/ðû(¯­,+79¯Ì¿dÎî\oS"@„xë±v"VáJ~¼—yý-`¡dˆ”TŒ(, F€€R…R©˜6B²Z³«uP1ÔR§sËOBÒ·Ý ’îCIÆP 2«#;hÏ$ÚXDÐnf"kp«i$°O 2ÀúÖÓiS«U6wÛ¾±9ôÕ)6°×MÞ¡;U¤ä³‹¾~è!Æh‘üù[-KkÏrüV_j´3 Œÿù¸Ze¤ÛÝwii’P{’“|O:0'РdÀAmöÅáù™ã‡w,±wï\x,Hg®Ý=±tç'OÌÞ±D”™¿ò›ψ¹ð ˆágk2˜P˜ý'§Ò÷_9¹`R)çÚq-,Ã"¤'‡~r€•;`neýŸÿõ…ÂXûÛߺ ?üàõCµ‡W/½ôÓëϬ?8<\¿{ó|úKëp—¯eDáf&»ïÝ`mhäüô!—9!Ý¡˜jÇ wºïÑþ¬ÿl–¶ªêÞÍ­ºh¢Xb¢c’¢Îi7kŒ8ÊR (Æ€Fd’ò·—wwZc'ãóðó£õë,ë…L&•v.µúÏv껕†·¨´E:]%Mh³uDz¹Pè,’ ŠF<´³ÞÚ\©“ÎõNŒ8_ÿ|5ÐhXg.p­‰W/õûˆ^³Z­z»õöÀþ‰1¥ö^­îµBD2†m«„šÙ´[[3¿<|î ›Ãùy{8Oøh! aýlcS{rÿXšŸêü¨,ÊŽëžH~ˈ¡FŽ0„pê “­B_ìÑõf)-EÉÑЬoùàûUҗÂ¥Xé Åïnªì¥•>osÇS–nµR¹Á¹uz>¸ÖÆ8)Š*‹ƒÆL œˆÂ‚â]–I‹‡óÄŒM#D1YBˆ!9-a @S…¾BZPd§eüfè*#!)KôXãQ¨ÀN{5C1ã’H9éQF¬×U¡ëIŒs" ˆDYZ[nnêŒàβï[…gCÞãô©¬¯¯ï4š¡`è¾þu—÷Zÿ»zöÈ„¨˜}OCc¹¹zvéÉ­»÷®-f b·ßj†„9šOZS™:¢qOt6üdÛ§P‚yŠAH{í»Øe&œªH> $w¸µ899·Ë•ÉýË“¤‚™]8l-®8gõ\  Óxa£:js)Xò"Ô(uðÑ–Q£8ùQohˆ0e«øáFÙ „2ùgôwfQrZ·¢Å¿?wpmy)}¬¸°;1RYSSîïxm7ýÿçê¿¿ìÊ®û^tι֎'WÎU 96Ð@çÄØ ¢(Ѥ,‰’mÙ’¯íç7üîoï—÷ÜqÃ{7øÊ×–ueÙ’LR¤D²IŠÝÍÎ œ •sÕÉi§5çûaŸS€Ücôh=Pçœ}ö^k®9¿ßÏ×i.g³™Ã·[}:ô#ÕÈáÚ“ëëˆ|ÈM1³Vîyæ©'g³Æ€$|pðA Gg&Æ3jogÕÈÇoíD ÁX¤)…ˆJ€ÒÌ7‚ÔÔ¦ü¼3~س,ÀÌ&é©çÙÒá~¹ ;»CI¬-š=; Çq$Óx[ ¾¹üðþý[wWÛÖàÌ܉c3þt¢F­íõÔYÍÊ´ÚŠ[­ˆ4±1lÀs-„ œ±»±Î?÷­otaD°YßÜÚX\Ýî zy2Ù|ëOïmìuBЖ­,×¶œ¬ãiTJÙŽ²„›÷p¾82XÿôÖz=çk”$ÓY«äúÅ•FÞÂéìÝ”yÝo±¢ >°×ǯÏlï´p¯îXÖï_¿^û›Ô7€}f"¢Fõì·X¸Û©Úw–ÇB ÕùÓ7¿g¹_žús{¤=‹ÜŒ#•¸Nµ*só?]ü•úŸí@><ò°?Âþ¥qém­úì DG;ÃGó€t:TA i«ä,íʉ‚ÔÚe†¦§g³È7Ðhp—(Êž¹úÀ -ÔvS‰)e»îäÀZ¸ªÓ\Gxd}KwD¨3¥ãVÂ(>“1Œ[tƒòþn¥ÝeFq¿ô9Ë0>†ƒíY‹¹'žìQ™Úfmd6oï–ƒ¨Æu£Öo?õÔššóˆMæ­†h2ÆW»O´:`[D‰ó ÷ïv“@¥÷(à’zóœ”-ø˜Æò@Ž }îŠJ—–NO¯~2}iä7sô£¥ë‡NÞ|wæìý;±Œ?=rþ9Ôçï´!I УZC@€PŒn¯)XOZ¥/¢PÛ6*a`N(Ô§Æ~z ݯÅ:M£«ýûæW~ã/nÏ×bÆôÉ$RVXpÐý>âAp; ŠN‰ –SghW™ev wˇ²á~µRí„¢0*|ó2™¾]äþ‘i"mQ9ЬÌôh·š­Êæ^³öZrîÝP¢Žä—ëcÛãíÚK£F,Dã}ÍúÑŽ0È£çý€"Bý³/àÁ ÀêѲßQ1Àaåö呇åÃã@Ù »3 OPöôÎþõ±½í×g?WÝf#H¯Ÿ~0æ›Á+»›ÆôÎ2òÈ$‰2QËïvŠNZ]H‚Jyže !‘5}då§]@‚Á‘…=V› ­? ¾ñí?¾û#xFxûìÜÉž nÑ¡­ÅSŽøÏ¼÷п²÷çqŠxE  êŒÊöt¦#ñòçâˆì'Ÿ"aa0q7­Š0€Ýí@d«C£ŸÖ²5tÒm*¨â”€)c–4Ún);:â¤uT(”Ž;dM%I’8²€ã^¬³¶å†‰F¬qCÊ€EÈ( Â…ÈK@Ú+eJZucl,òôæý®í:ž#û©EŽë¡,"p$„‚ܪí—[íÐgǂťõ€Œ²A)P¶ˆAÛx*AeD£`¤Ü$±À@R~ãæ…3ã£g>ºÿÉÚÉÓÙœw›ìg‘©xvysÜÃð¯êÆÆ„%mJ§7 ¸.‡J¦iØê 0Ð-èbn€¤uÐ[Hiû—f ‡I­éÚÈX.R·pzð;Û~æÕïwo¾8Œr µÑX gs#÷"û)~·•vû ¾ðÈô•fñ¥Iá=®5¦I~yßÉRéMdBQ˜,­MOº%@^¾T*Ú [!vëlÛI‚‰Ò4û¤,HŽSoCº ™¬7f TTª‡ì³v ˆ‘²ÜÒéÃÛhœsy†îfv”*{{ûa, üú–ƒ9DŸŸ‹DiošÝ|!¯•vÜ¡‰™Ξ6Kr¢¾¸ä‘¨\ŽX%I:¼Z«Ù‰8$D±éÍ{FF$:«úø¤G´‡Ghµ^©Eˆ2ŸYÖÇ’Û$dÏ®Ž[àÜì4â©üJ%w\/0ˆº²ˆ£B[ð#YñA¬Î^Š”›Zº "¤F(ʘÝп˜ùþUbRÞtrµ? E‚èœ<Ó^Ü(Ê.Ф¿¿[šn-Ús»"ç?¬eòÓõ•> µD¨´=Ö<ôi(‚/esÈÆ°a «ë2äi…ÂIb„Ü\d"ÊÍ×6"rk]T?2QiED¤)ÒDZùYß›Ñʦtbˉ"0dSs¿äæê{J# ˆ~Ò©ïFQ @»ùù[r´±˜Îß,´U–œ4öwW¶FŸ³ tëC³ÖÃz¶ƒX´ör”ïß}°¶¾eA‰NAh‚ºÛ®‡¥Sã»ïýânň²lE5)•e ›8é0 2)­€µ²µ¶\²m+Ùz‡vË; ·¤È¶¡ÓŠA¡ˆ5 „g±ÖéIGz Jz…N}.º×nªÖZðâà÷“SOüY¥oüë§ ¦Zü£¿í4ËÞÎu¥]KŒ?÷ðϳæKGÿஞb‰¢°±Yr|Ýñ§ÿz{âÕý?­¢Äÿö:±Øƒ`o‹ëKñuÎÑríâÉŒìEˆ ‰JîÊ6ku A¯4165¥¨s'Ž›5­È &`Ó<½»ƒèh§Ú›)eyj4{©È¼Î`d} õy Ž?DÌ`o~€Ev­IêìVöª%‘Œþ“#̞lj_òù´?oRƒ[(„ŠE` a}/¼ñIã ‹¡äe·Én'ʳBìV^çíºñ}@ã~±û³JŒÈ©‚é1±L¯ï÷ßd›õ‚zòÝÞDºÕ‡'‡?}öXiO?y©°:Oƒ“­ý•ÂìôÂë3g—®;Š“O¾:^“#ª£® 0€5¾ðáÍ-:è5c_ùoåc ‚®˜¢¬k³ŠÇÏ&ßÃîü3o¿+ÐÞ?LbÚ ãØà Ö×­³ÞûM•BÄûuIY„=§ñ¤èQÑŸÆb¤q„¨Àp_=L` ‚0‚>ÀßÍJCŽÒvK7»‹‹q(»°#¨\¿ÒŽ5 pêóUyg€*­Œ*õp”éÊÓ›&¥u6øŸ ÀøZÄúåÎ{ûaŸñ' ÜOâ´8ëtûvʾl°ßùFâÎÖÚŒÿÑÙ 78¹ñtX3ó¹f³|ïÊÙ¯^ºpq /\;ùÖÒqħ6b'âÙR50&*õ4wCèºj𳎠¢wÜýÎC` k&¹×KÆ@ô·åñëüÉßÄ—ãkWÎFó'ŸýWF6qåXøÀ;räýO(é {'²hwD‚§Ÿå$E¦v–Ü©‘UÉÔÇÝJ³à'‡9&… ãAÛÛÜ6¶Ö³ƒÛ&R€6h³²Q9Y$GùJk×ñ´ò(é¿hÑ" „Ð$ ùV`eL×S Ç DÐo`7®hÏtÆî‡"&FP6Æ6©±¯G¸{#{æÖÕÐuÀæ@òJÕ>ÞÎ¥°87NÁ½{³g-Án‡ÝÜP¶ ¡5ƒç¾ïl®­”mÏ%F‰Qäx6Yža$•!‰AÈØ A"ŒEzaíÊÉ©¯\ûôfåÒDöæúäh±¾¿;4h1"€q~ÅÜ¢Ì#ošú„àÍ@» ‚¥ì"eFÞex”% $Ež} X:ÜP[w´í뜉c»ß'ó¥Ò¿{àK20vŒI\Ì Lß_ç£ê R_ ¦™I©ïOú`î%6`/ºEP’.Ïš Ú±@šL$qª¸ñ³™œË°×°ÛMV(‚”|¸ÎˆŽßéÄ`´ )å«1• ®S¤ D¥)"H$J)ϘéÖc55Ä’TüUwv«Ad‚øs¿j%`ÂÀѽê_úîÊ^” 2v·î­luã }úY¹Vݹùß?«ÿª!ÜxïÝ?úì¥)9<³ðI|Òdk~paS¡غËÑûͳVˆ"Ö¯{?­FÜÇ<¦98 ¨¨¾’ºŸ:”v&9• 0²áÖ­#swW޹‘€YY˜\âÑ-?\ñOÎÜùÞØù‡÷6¿vtvq¬(™ ![‰BIï°rCœR[ân„ÑFÀÉX, xrþÓ·# ¬‡ŠŸ„ {Ñ?Â"J ÇïÄÿÝ?,þüûöy¸sñ\ý®;åÝ÷Ÿž¾ç žªÞÈœþ­?BAdN;¬5¡Á/å0a0ÂY[{Í3Ÿë®>üãÏ\( E qtí8BÁš °Î>Jv¦º.©¬ïf‹Žc{¶å¦sT“Äa»Ý‰ÀÕÄ{¬öT¥¦ æç@Ð ‚ Äíj;ÓÕ1ªQªcÖ@;«: Bò8µªI, AMüÆx Û7œ×n©‚ÖÊõ†'Fåê;{ÝHJ/>éDË«þr sÔ®tB?/¶8¦BÞõ}Ã8>~¢­Ý•ݦ“-º®¯5#’AP`‹áD86Qµc±PŽØÝ×Wž-={øÓ‡sóçWî,ÌÍ•7+Ó> cþ›Ý%LyôýHõ~C!7(;é®"Rñ(ÝS#Ù… jO{B¤Ü_Ë'Ü…J¢>JË1@ù ô§±yå­¿!”d~$AÁ‘¸•ËŠìÊõq™D@„é@Ÿ)Àôà³Ö<˜¦Û‹FéÕ´ˆRÀÌ„HŠ•_Ì–†šuàzhDCŠQKm!;#õ@ì¡”"'”x‹Œ¶•úБR 2 "eJÁN—Æ'¨ÕwÛ[;íN;ˆðË_³ $A×qé1‘Ÿô{ô½ÚƽՇÐ.꿸ýÅË•fÌÿg÷…Ü_ì'9I’úŸüå‰/§£ãëû£$ÜÉ:Ί‰µ±Œ@x-ùL©NÆ×œØ_n¾We°×R?gP¯þ7ˆéŠÚ›õíÕ"Úôw·WÇï¼wìü5ݾ÷ÕNFž|?[[ã‡w+ßû§ÏnÕl©ýð{kE SW›¡Õ‹™B)7P@[§'¹ ËØ® tXç)DôNw¶KB”ŸÛ\UýTIŒ™á£ÿíÿõùø&鯙§ÞyàiÞxÿÙùÛgD?ùöíœûüêO-éiÕ…”vžþÒ°Çíf4^ò죇tuxë­¥âÆèhѤn€(äœmLlƒXv­ky®Œæ:ãÅ‘Œ—ËZˆ˜´*{­(ÜÙ¨ÅÃ`XÀr³™ '\–ã$©#ØAØÎçªÖ=9Ûàd‡ $Q9 2™Ä°±¼ö±aqF¹›@Ä1j!ÐLìFC_‰aûnéÈÒ’…¤Û›Ë7?ü¨‰uæ‹#øàÍèò94 0ît뙉øçermí6BmÐ˺ 1=5õ›0ˆR–¥í>e¸«quƒÚn»ƒŸˆ¶£å楹ÑWFn]OöV7&f k … s_ÿÎJj(`àtYO‘“rTI‹¥™ØÁ™ˆ›2ÛyØŸ$§l&QJÓ¥'… wºî†g»V”ÎOüìžC_Šÿ «E«“N À~8hsäÈPpº{;"îÛôö!¯{bÙ¾.˜1µç ö³1Xé±Ä€±¥ %)ŵ7<8G¨op§k"&ot)DåúÝ–a€Ô;„ä€Ç£"خڨ_~=¶ùˈ@Z²]÷0&j/ñ'† :è™Ju¿ZýõUŒa#ÊfÔ#@¿5Ók9ioááv9Ò¶_¯,mÿúgùf§öû­W¿ü×ûJ‡d>½óÔ×&s‡¢È!ÕX<š?QxÐ2i»e:7øåBÃh Œ³_—ö“^ò?Š¡T9#ýv=“ˆpG— ìÓÏÆqpûʼn­Í£#ÂÖç²Ë§ddî™êƒgN~pëýgοXÑÕ‹g>7¥g·Û b`$“®Ù7ïÛˆ‚hFiGCÀ ÇÕ‰s|ീ$Þ4ÜfÅ*I0°¤vïOÿÿâ—¼ŸýÐ>ƒKÇžþùMÿ\ãÁÛŸ›^˜/ªìÅ«7Ï9ÿ`õžÅIOô <üÔ/30v¶×ëèØ€0xõFõòå§ßÛTÈ €ÐÎ$¨‰Ñˆ¼_@›J¹Ò^^kIš˜‘9UgYh;’™Ñž( ÆÄ!„&Q±å&[{n_+GœD@¶cåOŒ 1{8IÚõÄÏ ’Qã$†À#Y™áÏ6I{%;ç&!¸N¶05ìîþl©aÔì³§¼úß.Ì~që¼v':1f-Ô—·æWv»ãEžúê_î‚q6Òcð¥%8œ¦ª°U%…ˆ™±õÖ˪ŸP“>¸„HªðõLq´•EmÙ{êèÎk6==ÿïW- ¦tLlƒ•i+:l ÜYÆ>ò§t¥T¶‘ži{ÑÞý=¿7JÑL©n[ÀJbs "‰R(ÀÌ̈BŽï”J¶¨õ¶wP#B"îXæÃ €å©F7NÁ¹@ÚͰÒÍtõ¿À_„šÕAošœ ˆ¬Üè« ,£E³ãpyo»ÑánömªžØ[ú1F†D?ùw¿÷…è½òÙÍ­‰'>¹qáÉÆöÏEK‡K2tæ“¥£Ùoÿþ†Fiæ…çF‰ p’øÝ{u3d÷ît£wìgJUÀ$Ñ‚À (VšÈî‰Lì'ã(Y¼¹Øê´š±Q „‰TϨ…’z$ÞdÑØvÊšà$DðKåíz¬=j‚æX 1mø ÿŸ™åw G2>]AëɹíZ«Û ;ì ªDÀ²ÕÓ§ ÔÑ¥­••q&ÆðÎ{±cŸ~v,úè­è…g´Þß,·3ÓÎÇ‹R±2É^#©$™¬ CM"iȘ«K‹ë3RÎM¶“qíÜÑ™Bq“¨^Ù¯žY‰ŽN[7W“óðҬ^Û92¿u|R39úòÛk¢(˜öÝzQIzö¸‹5@qJ\Žm<ðê!¢BÔ_<Æ’Ø¿8JkÁ¡úoZÞÈ«×^0‡Ça×q&êÊ¡˜–…#±é¦„zEao ¡ä±Y6€ê!Ó†¥¼€ åd+BRôJí>Gœ Åâ` °³­¢j"CÂìúÃÕ‡1(íX(•A!¡Ëw ª-ÁPýwêè@ ˜†&*ey™ËОxS°FCÒÞÛh´Ã ÿ§‘M«–JúqEþ' Ä$¦¹û÷Ë-VD­Z˜|ÜùíÏÁ§­îã/÷ Æb[äTÿ0¸êXû¿>a½¿ •£¢ø¾yµÐfí$C_îTcC)8³÷zxÐûK{¬Ò¯²R±— ¦¸”t%0d¢Îâ³CŸ>÷éšBóñ“Éæ´jv soü‰Êî_~~­eØJ6oœ}{å(Ò‹µ®Õ?u€ ¢Ušð yO3¹A'Óo‹`±L…yëµM€Å©Ýeýè’ô"ʲèÿðŸ½ê¼ñs:±º3׺}ÿÂ3on||ÏÃØ©»…ÑC¿öûJ„YMéÉAf“DQÒÙ=îÉø¹Éê¼ÊÅäï¼Ë¥]ípª,Ñ– ©ž„aëÍ}”ÛVŠE‰a1,F1B¢ £02éÈ)¡Ò„bØÄc1䢽vàP­!l:¨zFx$hlÌù•}³Ëh»C¿¹zÿäte`ÄÊB¶+{í¤í»D oXãëg”í[…áb|çÃý ½pÞÞ{ûn難¦»±Õ1Ó3Kw«J꫞ëû™ LÈäû–Vƒn}× ”².±x±¾³r}{'A!ƒIÔ­±¨¬ü`iúÌàðxÒ)—w[Óã£ÙëêÈ ÷‚ÝíDzÝYGÌÅ8À€1´ `fÊÒÕEhÈsï*oäÇ’3éž–:ñ1Ü k…•5[Ù Äž™¾qÝ ¿¦þ¬¡…IÎ+Só}/[“84¶Ái}ÀÊôµ)¨Y¢ú™¶òßäf ¥yD Ì)ù T  ØhÌ•ÀͶ©ûYÐrJþÇÛ€¶gïµY¥ír@ÅN2 L°ªãHãðïÂë ‚JzRGDF­IÙ™9SqFò,A'ïår¹×Ç¿~’™k{Q1O}¾ôi½+'IÐàÁRµkb‰êÝ Ú7ÿí¿ø<ß*·þcýëü{ZâIùÍïÐDKtñn3±˜™P ;÷•ÎæN§U¯Uƒn’$’€ILØXSþÔ±333Sõ½«' 'Ý•;óÃG-ÂòûS3z\Æ{ž>¬VØ8ÕÐXÂ$„Ón§«0ÑZ„&›mžv©×iLMY@Dú¹S’834r–„Çþzó_¸ÿÖÈó“P–¦Ÿdaî*ù¥Ö¥®õ42)x=ͼàƒô»t€–ºÛ ,8HYfAÅAÌi—›8e˜!õFÜÚ/d|FÄÊIÇXéÃN”¾»am§Âc!¤Šœ‚W¡z#ýý³Bá_«7B ´ÉžœÂŒ6¦¬Æ#(Rc¿ÞÚûö¨á¤¼”¤Gšª^¨@ºÑEÝn;ôiãv¥†Xð«-fNÄ’Åÿé¿ÿܯÒ¤Ïë?®+ƒ„±`õõ¯7þú¹ z5úÉÒïÎÓƒ¦ÀBË,ÿðë €Ï|å/¹&µOûÌ‘ô2QzàO%ž=ë 21ö0IÔ­¹Ûæç®*‘»Ár^F§Û-2Í…ñÓÕ›ï¾ôÔ,c¬èÓËß›Œ§/—cLÒ¼ÔÙ ?3˜÷ÓAGb너ë™Ä()xùï-Û‚àÍUé Ë Õ*öí‰B|[þõׂ›ßýÕ‘rñÊë×Sáµ[êôõ‡GÏ}º1éýÆìÐ92¡Š›[·×Ú¨ŸX[}’ºà¶êùfN .»ìÎòæ!']x J£[­ÖMTœ™ˆ7º§\“ÿ|ûc@¶¼ÂÔè€?>èYº˜ \_ßnE »0fy¶N?Ml 1ØqÂj5t¦Æ&Uo³i—«a§]Mô±ö.Å&R¸Ý$¢jß½ÅÒ šÍà0g/C˜H{ºüa%ëÏÏÑÒë»S_1 Æ‹[ñà¡ÎßÖ´å¥Ë´mk;—õF ¾ oܹUÃÜÐìn¬77Ë(¸JX!J‚öáÃ=d´_ ª«Ë 6±4îÜ}mòìÓCgÃÍhàpöÖµÓã‡×@ uwõÜpÛ¸±ûRçf"1 àÞ¸Šd;Šì=Fm¢ÜðFg÷ö”¦>z‰Æ¿,ÖuåíxZ¦Ž-¿©Ì×KÿÎň‚/:Q3h*w¼[´Í°w3îf°Í: 1=…/ñú`k!2©<ó@ó€Žl˜ÓYX†@Ǹ=Ã“Íæ4 ÂFì„mB`TH·š \š­^0÷ò~ôpöbdÖþ—5<ôoà-–¾ P)ÊÉŒ0ÆÁxÁ@dU\ÝoÔçÿa>xk'†lìùd9tؤ´CË®ÝÝ®‡mÊÔëF’ˆ”]ùßïKþû5ýþÚwš$ÈŠÙ,ýèŸü×Ïž¦D}­ñîÿøÏgŽû÷Ëa‡:Zì{ßûr¶‰–BÁç?Å–ÓY!`DF|䓪({]^<ð# SÜÞ_ž¶?=qî~!øàù¶uq/¨ª¨|û™óï¿6}þîJ”Ýùþ¿{ï3Ž<û0ˆÝŠQÙ¢52œ#2qâÈõ»¶$a }Éä¶ÞNìPì)ÿí¶Õóyaä&‚×’Ø•wÕï~Ëï/¾1Z+]yç¶:Û¼÷~áäMgÒRç¯,ç³"ÆpeéÁn ýSÇ;7lÞ¾0eÀêáúÌÜF]šÊRd©tº$Ñz-p,»Ð2µÌlûa£sÉ5ôê@53>‘ÕJ´¹Öˆ“ÆöJ¹Fñmÿô¹ÌHN#HÆŠIŃtïö¸™ý½X RÞÈÑ!—”*Õ(€ñ³ç»õíz³zSµpønÙ –&þìÓ+ïÏ4~j2ÃS…ü„‹”?Óîä§½î«ðê)ŒÙ^iЩÌÍ(‹ åY™ŒmŒd­äá÷+d)ÓØ &ž˜±s%zQ)& Ú¦”#Ã)ÕCM ˜Í•ý…Å.›`yù§óO>wBkÄ}¸¦†¯*!§ûÖѳÐe›D}ÁúHê"™>,ÂÀ1(G!5Iƒrrƒ²3s3p‰zÐ`BA°~uÂH·ë#´|3vþklºøÃS!Eñ"´¬ˆ¶ãiR£Õ±ðúQ´9&CFHóÔƒeõ½k}ýâÊEúi«€&éi[P¯}  S}¢å ŽŽ”P:k:¬±ÓCèÉàÄýe!rrõîq†H‰‡K®A\;2Úßýƒß*ük|Ëôl D¤PYùIß` JIàØPÛ®íÕÎýrÎH¸\¶ ùôq÷}ÐǤÛ“6–Â;[õvWò…v=‰%1(À@6nýÛþ"_kDÿ‰¿¦ÿ¸NÂÀ|ËúUùñÖË–¨_wþ‡ßyb: T.uTtÇy9Û„¼B¯Tߎî]8éÒ÷&‘túvš~ë¾§äÄb6íõÙµÕ¹áÀuãØ1‡3 66ï¸S}ã›Ï­Wu ÖÆ­Ó·t’½—Ö;‰btØÎc±ä; (µFÎ kc¹ µ[¹€‰âëM@´J#«ÛZà‘JYõêAAIRÂÎÛÑ¿ùrçÚk_)´J¯.œ¿Ò^}ëÅ£ëÖ°e‰# W—Wך2tbhë»{ç†*¢]ê8-£JÅ0ö\0‰7ý ÇVyÝMl2b—aØwCÅû ´nu¢êýõjœ" „ \Qb¹œ8ŸÍf´rÌ+‹XÇÊÉe+íĶ| lâØ˜°v”måÿÇãµu=y……­ÚšÎåÊëµN"QH–e]ù¬o\œüQÃï®l9§†í«•œÎžq`æôì(‰Êe53Tù¸HÊŠ•ã“mû…°•­ÆJqF@ƒ‡g¦ÆJ DVíþn3¦D+?£œ¡ÑÉ2‹@³¼’u¼ùéiˆÃÕûkZÜz8vöÌ 0çO,.™¡I…­ª)Ü©<9!­Œû3öTÑ )æÅ™•FÔÒ¢Äö½=Êzw äÉ‹JÙgŸÃI'ÈÜ+[JáÂÑá¿]ÎÛ_]ÿÓÄÁ“ƒÉ^\³·»‘âÑnq¿Ùv‰g³ J¾DPI?k2EÕ¤ <`†K I÷-†”gh¸74€˜$š AAÅèeóNÖcÚìV—X#2ƒ­F`©N \¬Ì=ê—A[r<€fÓ7mÒã;«ÿþ_æ‹ÿÒ¼èTî J—'’ ä Ä’¡v½¼Ýyú3CcuÛ(RÚ;~4þKLjlâ Ó1ÍdXîoÔ;ö‹ÝJ1JRC^ù?üÓWàj#ù“á§é¯Ú¨DP üdð¹ðýö Ã&ÿÍàÓ?ê<3«o‡]"ŽTô‘|ÉìÊñ¿Ô¼ÊÝ¥+Ý\{€Åžò/-Dñ£8—tOg&¢Xš{ÍÉÊí/Y&¤òƒñýiÈÌ­[EûËsO¼{ÿæ•+oDF0ùÉØôÂŒ'óÇš±Ø ‚€Î²¥Rޱ½cl+…r,Ýv%Ç®$kŽáÄ‹ïô|æý/@ QÖGøí¯Å÷ðëÙÎxð‰êéhïÆ³eœ|`ì´èМ^y½&:ì8´szxWaSy ©ñ†75èjÁ­íl2:E•Hâ³£s .SÊ5ÑŸÞ©–cÀ`Qïd$Â(d9Ê>œ×¾•zM82Ôs<èîÎ~G[NYÁhât‘´kõ§';ÙôÃØ89=–=8ŽÃz{{3¬—“c¿’‰w>ı¿Ûpíá¹§é­·öcçé)oeÃ;†‰ D]=꯮BA’ض=×÷²ù‚#ËÜ-+²8‰À;ròôPVc´Ò¨ÜÞê&V!ç{ÝJB¶•süýûöÀÈèD¸[½Yýž9=38sêdÒZ¸y§ÚYÚþðä•Y+qolÓð(*]kävúÌ ìøš­çŸw•›”3’çŽNì@iÔzT¯Ù£Ùmu ÕADM…_u0ÜTÑu¶%žž_}=~qäÙÔˆ _@I&©éý±NnʺÕjðð©÷Aõ*½:¦7î#súµ? ¥B%$sÀxBm„‘—\€Ó¼bT^®00®C³ÑvPX0¶Èi,$¢ÝL«“V;=(gœêì9I‹õ¯üäÞêïÿöèà¿€·FTD¤H9™Ñ"C„9%q쨤\Þ¯?õ’N ~cpRµ³6ý}( 0ÇA§%¦ä>\(7㥢1{äa­7þÃï}>i¿Ϩ? ló3ëiu·ûÕ|’ù†|ú'­Wf’ûû]¥Ù€¾–.¨ÚžBúJ뎉S»LÊ2ï±ÿQÒ8qH/ç#ò*‚¦)c"¦±t)óàÙ3¯7“ë'êy9÷ž°Ó)_{áÐÎ^^^YÉöß}å«'D_^ìmíâˆ.s¶$Ûû~SÜÊUØH;±  ¶ÜíRñf[KTü¨6‘¾Ý 㟪ßþú~ö9?™k.{óWÞ«úä|¨[Ûz~‚\«+¥ñ*”ßv‰Œàa)8I(K°í…×rÏŒ›VÎQ9ÇVaîøÅ,‚=üwm°Mšò§à@'¤ñ§QÛŠŒ¥(GÛjìU ¹Qƒ‰a^êÙ(+2à´»;!._-ýRóõ§.¼qõ¹WT˜Œpsdla :YÏ9r)xëÃfäÿÊeýñŸ×~š‰{ ±lÇP–¯´›Ëœ`áÃ…&è8NÀ?yöØ ‡ÁzåÚ½ýÀ(¬ªÚ™•F³ºÃ®c9•‡î`þÐXÁ²ÎžéîzógføøÙÑÑËOVV?}PÙkÜ>yÜR³»1 œdºï´/Ù!ÛF?cýtÓ@’.Ëj£HÜ qÌÔ÷i–r§@H¡þ܉Db©Å¹Ÿt\[I—ù“¨É?~C)V8~ªÝ–·ðҨ±dÓ´›¶>ý±ÑI¯•&§s/Œ¯‡àí¥w&I³®øR@,¥!%8 ˜^å­€@Èv2EŸÔþ¶ ;@(¢-=¨ï—UFïwûÝh$Tb¹ÞˆÕšÅ0uùéZ½öð˜Ÿ;¾³Aˆ¤‘c‹'Ç"ÏÐçúîFõÉç,ÀÅ­Ü”ÃvÖyĕހńA»†lv÷ÖV£9Eª¶Å$ñcªKÔT_˜?Þ©&íkÓ—q3î•áÊÈ…­rc('™Ã+û÷ÕÑ‚tÓ;6Þræº ×A0¥ürÈ=›†¤n;D#é7F)Ø´7 ”žß"…@aÊÇ©8¿¿ À•s:æÜýv “;´¹çćÂqõèô'£y.Å+†ÙˆX¥™Qz$KØÞèÚí¨[²š†9у P7×»’›©Ý„G›}êßL§mßUsîðöÝ`Ö†ÁövfÜ®[ƒ3@‚t±05øàÍ[‘"Rî(6ŽpÍÒj¬¶øvgýN™| ŒC­È/å‡ ®ÂÖŸ¾y§¶m¶œ¬Ð‘`ƒÈôFÐëó iËvdú ø¾ƒ &æ¨KfFmmmVAÛÕf$d.``ë|V_ YbKi{pêýΑÝùð§?ý»w?þèVkÖ3–œòæfœ<‰?þ°~ý™ø§ßoœúÍYÆúâ[7;æúVf`îðìX._ÈJÃÃ9^ùá[k Rvöå_zåh¾½þÆ÷þú­ÅÛ"+ ë+[Uö“ Ýe“Ä­¥¥•²¥•U<ñÌ…ÙÍ[o|¸ÈÖàÄ… CÝVcýaÍ)O7ÑóÐc¼e&¬P!ÈTn=é…}<®¾&åÛ"v_^þ>}/mÖ` ÇW3¿k DqÙ[¾©íŒöOœ¼ùËü#ý®:Œ dž{6»5ý ñ­YÍÖÎUu%»¬üü/‚„ ç÷MoX ìUñQ¼õÌÇH½h0@´,×9:˜„°¬+ˆ8гîβh+QùéÁÃ%ä›uÓ­¡C(ä9Óá[{ 2%³ßê‡ê"Bí¸ãù'QèÎM/h¡jO¯´ËëDzÙã[›¬•Ö„Ž?í €ŠGAecýÙ+ÌîÝâ!ü¢÷Ȳ(}»¼Äa·Û»m5Ú¼¶ÖB,zV"q| |J?4Vž=Õ¨ÅáãOÅ+P€ WÆnìoÎøìÏlUîÛ³· Š7Š#ÄUˆ0¦·B#½€ÑGÁ¦}r7ôsµzÏÞIáQä ©Ì‘ÍÖIÿn ŸX×:\IB¤ãÉ¡õµ£³ÃãøÒb0…4°ÔŽ€+;>ç—&K àú©ˆ<èf¼vÄQã‚€þ§‰Œå?iª~Wâà”D >@X!0™ûúÂÌÚM’•©•ýÉ‘£ý%?ån¿ó°ã ?ZhMy{èLŒBã–’±L‘Dš›%ß;1h)”öþÃ}uý'÷v«C/Ç ÕIÔüþ¦90µÈ´‘´íPæÌÊû„‘IB&f ·½¼Û—÷†0éÿ̓ÄU4_¥­$‰Prg>– ëe‡lŒ*[+ꬃk÷u¹•+Í=:?iÕW­Ìü×Ï4_{-yõùË7êcƒï^¿÷чÖÖhrhd(_Èû°öî»Û.1êÜ©W_=Y 7~öç?¼³Ç®&ꃲ€%AmuµíMŽJ£Ùiv“¨±|c­¡µ¢ÜÜsOÝ]xëí8[:|y>®ï/mæóŽc…à¸&´%0°n¦•Q2>¸Õ:ؼô7Æw·Û¸Ù" ðüÝ;æ›×ßÖ ]DÊùÆ–X*¬ÞÌxžRfú\ðŸƒð³OýÉßY`íoÍÅ;­V²dik°„tw{èéê]sî‰$,cjðïÓl¨§aéõб?› ¥5_,€`²«M¥Jþöª! ÔðÀèŒ%€í«ÕÛZI"D¨ݹ€•/ì—£4 @DIÙ¶;8~Î~¸éÖcPÞÝù+õÝÍSVîÔʶ&‹Èv3ã‡æQ@¡@¤´T–·/\D‘õ;»þaiû9O4¹GdNÂ°Û ƒÀn­T‚3¥n#dNLÿYíùȪ>xêxµžtn_x¢½žètƒ/Lmu“Ž)M¯Uî‡Ç‹ùv Fs{{èP#¶-˜·LÒæÁãi¡ý6`?X(®ö»¦ˆ¢yÎ^š\ÝÀöŪ—c÷v+aDìCýÆéá‡I(•±c ¥‚xí݈èüáR~|(‹X[ œ¤­skßÔbÃ2üŦsdå¾JGéøÈ•"{~—~\’»Ùó‹Kj–ýB ‡³6ÑQ`#ØÀ¨êK$ „ää†KÁP&<;Ÿª£º7ðD¤ÜܱkŸ,´Ô½Xs÷¸s½Ú™Òì½[eÕ7½AOG‹¨m¦Î:~Ö&@L!3ñí­õjèfª #`ïv=ˆ —3µÕ:HêÉÍãÕe¨µå ýÞ8ì¼Á»?xëŸ,µãAˆ½Wž¹8ßXû‹¶1+×·¼£ôÆŽE¤º•ýå[w«NÆCCì\¢ÁÃOùʨl¼ýç»[ÚÒ=z—JI:ˆ‚–¢Îîꆜ°£z«ÛeÝ]¹q¯†ž‚ÜôKÏM7?}çµBfôÒiwgo1œ¶”cŒ«c„8®X)¦v|â¾!މH ÷ÌN­i­DŽ8òÔßmù¿úúm ¢¨Ñ©Ôùoi†n§êß¹§ÝŒâȽ4þƒ›jè×—þ÷8…úÈô·ÝFµ"µm˱3c wʧ¦®ÝñQ|%îô–R8È&?@Wõ£@àÑö†¨µïœ(%)[åºA"° þúz¬lðGG''€×ugŸQ [Ì@³Î»[²EÞköPä$ˆHʦÁ¡ãs‚òFG—cPÓñ͉g×[{+§œÜ‰µ­È¶Ý¡cCÒcCÚI{uïÂi4¸v©t¨¯%¼ç_œ°êL€36„,`:UÁBÄš±ÇxX •-¸Ã#”ÍŽãÍŠwýœÝîòôP0;b+lÞ{óæBiD×òså5I”[ÚÓ*λÕì#½’“ÉrÈ>3¡²žF‘$6Ií“í,m7Ù–íD Œû@£zß³!º4Üt/>Ü›´èD)¥ìß;š­|ÿÏìÉ™+çOœ¹4ã´n~÷§÷Cí¦pEt€Ì1éÛW Úë‹{|.5ÚÝ0{ÿÖ:ç”8³/]xx&‹Êöb±‰t·ìû H†ÆWÛ(ˆ4ùµÞîÊ"8–ÂãG¾N?÷ÔïJ+çÿ9f0é6©ù ȸ0pèÂòwlçkcÿó²Ð„ϼ›¶¾—øŽÒc®pù¬ûúNaØ÷?l¢éM…téýtï?”ZÚ{¦Ütò(@$ $¤-{n¸(\Öµ†A…ŠŠÙu£²vnxl&+ˆÁU‰k5MÈhÐùùõêdå µJ7õÆ¢RÚ£ÒCŒÁkÀ]5‰ÝÛó/ì;Ëgì♕š(åJS§¬³Á’Õ3ÇA`íÃÝñ£ÁVf¸àÐP!m•€Hw»Ý0‰¸h?¼³ß2‘;HÕNb’\Ýã‘bd½»æ«USûðÊ…Ú¦@úE7ÖŸ3å MCR<ºR[nŸ,ÛÂÂJac}¶Ð‡@ìÉf÷ÓS”¹@h$HØ‹€–Þá‹z¹pÀ ìÃѽ““÷Û±Dµw ê›&a€éH²Õ:tx¹ ¡‰W®8«W¢D.' àÖz¢;MA/oº¶vãìQ~–3Rz{—ú¡»pЬéS¥ûÍ`&Ę̽áãsKk…AR(H¦¼±o— ª:öH{_£²=ßËLNŒg¥ýƒ¾{o"T£hÚ#ÓEÄÕÅ;Ù¤ÛìTJvÖ~°ÐV@Såw.ø•²Œ#”f¯u™zZòô_Ëqiøœëf…hbŽC!d‘˜ ´ºQŽ·Zán¯uЃ°¦¹òññcÉ'¡U ¢ÓűћJixùKØùpÿô{+èyöÄg‡~ñn«3øÔðÚÿüg׆s€ÕôÑ£¹±3çž8uäÐØ`©4rììTüýÿûAgåæG?yÇ9–S€­Ý ²," THJ‘ E¤€Y:ªm¬$ã‡'íf#®µXïßÿ¸®ò”dþÙÌ›¯¥CÏøîLåP±­,2¦Y)ZÊB@™Ýn3‚œ}ɬ5;ÁšåÚ ®èŸð3cßéöà @HÞ«¯0GIXϼSͺ3^Qÿ©mþÂ÷^Óé]¨Ü_›N–¢ ºkù¶E¹@[õ•‹ÙQ}ûQ–؇ðËcɹ)Ž…Uºeô—ëtz¥µOsà {v³ÎD¶e•²;k‰ÎzÅá™q¤õEèTÏbƒb\=“{Ù›³·êŒÜ¯>Q“rh¢tÅeÜyÃåÀ šHî_Yo4öOX™ã›ûÚò‹Ç&{õ¨¢òÖü!~xup¶»70Xt©î%ñs…Ýn7NºÙý{[Í(V%«ÖbNbFêûtzùhHº¾~ñHµ–´n=ujwPP¤Ò~¾ÝÜÈLä&vjËíã¹l“L cX>æÔlòë‰Iú)ªi‚¤ª•Ê$ûƒ·<™¦H4"k"³•™¯?àúSq0Ä™­®H ÎÛÛ(œðî pûxîþ”Çc[û±7;쎌ûÍî†Z¨•“Õ].Å»êPîÉÔFÅÍÞ}$mRI¡•:0NR #Ô|øÄŒ;ï2ˆ$‰%&ãÙ²MjiÛÖh%t÷ìÃçŽd£÷» LŠ“ qgó‚ÉÝk+ëË›C^K¥g÷VňÊ/WwÏP»aK2Z¼Bß@Ù{/¶£õì;ç;(’DI0„ºÐXØk€»˜8"’Ü30"’ =…wêa—‘ˆæí¥7Qãäo£ÛžX¼-Ú²F>_xëõV|èŸzø‡›¿y€Œ!ÇÏG';zxvXßþ/wÂíC¿ôã½ÿí?ý´íO¿ðÂű<˜˜-ÛBb…J)ŠJÊ|"MÁîÚ¾79c­nCÕº­£2²§>sßyc¿8åÞAŒsbeÔ²š+q ÁTasùäôî:C .¯Éˆhg9>âÆJ"àî6¨ °òýLÜ.ªüôæË×G,½¾Ëh8ý5zJ¥ž „ÉÒ²tfrÚD”FÃÊz²¹’ÏÔ<-ζrüÁnœ±ò§ž?›ÙXXüx<óV‚F]Æ!Ôˆ{·8i†¦58œTÃNyÎÛ¾[C¡cÑZ˜£Iµž™69UœöhÃè8–äO ¸YW!r' °$Éé­Õrh»†aŒ%µÁ§Û>±½—ôR9–atêëÌý*UøæI³ñáxò^l«bñʼnw~ÞÿÆä½ÿ\½øS|`EfIƒžM”ÏX˜?ñ¥_9CýÇ¿Zj·Þyóõ_D¹cÏ=urÈ—ˆ•…J)!e*BÅŠpJÊR&®líéÙÏ´ÚÍ6›Úƒëí‘Lœ}fxñÍÝ¡Ã#õÄ&åPlˆ[è×B)M?l*BþÆh}¿n6›ÚaxöÞmõÕ•7©é#Dmýò“FLReù¨m¹9êZ“ç:‚ñ×ýÁ w žywÚ5\NKôèÉX³¥Þ\I°4èßi`/ö1¹ì_ :È^-ÛgÈõ¾) @­kr²²k5š©\ßÏ﯄ö`>?2a`ãScZmB1Ê‚±ñ«w Ø9¿–ôŒ¬½!€­³C3'ძ‚¨)DÔÝ…C¶ºÕΕ›Ûîçç÷tKag`!Þødcl¼]õ2á£B/Q6Ã(îâ(ÝZ,Gç³ÝZ'x€;è•æ½ò˜d»üÜà^lÔŸ™YkBAÄd+si-XŸÍ”†¶Ë‹ÎLÁ*Ç¢í˜yON´;y%€cÍ]6)UûÀ†GÙDÕþ/HÁÓR|Â^›[ÛeâöS{¹<Úwº ³ˆ!>žììž-Ý4ï^ñ![ÖãÃù‘¡œ ÎÝX›¦c¹YGÚ^.¶Þ¼[ùLÅÉ¿µÑô}À#H:öÛ„-’¿ð¤-",ŠÑ²÷+Ýú¨½çZXŽmÊûí±³WŽ˜wþúí{7èýÈÎ_8?¨â „ïVÝn-¡ 5:ÊÕ(˜,Ù‹eTÞ©MÀ}9Ù¬×Gr€Çv6Lqôi/Övl˜=îùY›@86Q˜Òå åÃå&Ú°áûà5¦ôR3±õ²»¶Hˆ:sî]9µºo!½ð%h½ cï?uøÓ5‘4uíûÇ;4ªQQÅÙ3Ÿzá¹yõñüñJDJiâ`ïæÛï¾óIfêü•'Æˈ"m)b¥P¡mIÄ&aE¨ ©míÃø„Ÿ„NÃöû&k“èÂÑò‡[ù±†Z– ÆVTsN'«D†f–Û(þ?pk2-¶Ã8ýäÏ7 _üùmu€æ"­ý. „­ªsgÉò2:ÆÓƒ±$‡¿ö៙4g AýÆt¸ÛnE –¥íìüÔqRÁkí$ÊF­½HϽȼ4Æ©O$í‰ZS²2÷"ö÷Œ5„°Y~j¢ZÅ•ÎóÓK­íËlÙ¨•»‚þÈ~uÙ-êZh Ķlççš‘¯쉽JdRÉLº)=¨ñ,ÿ^*€ô’¶Ò÷¶sl=>£n c01¸3ŽþÞvlD@8Ý­Øç`€!l\Þˆ'E «¢ÈÙ Èe%ÍV"è í¸Q\ðü»¶‚鑯X«•6°é·!ä±U©Ïy”ì5ëäï|ÞaÂxqßwµÝÝ÷=ƒaw¼ÑÉ$aÊOÏ T^û«÷·Øèº'*¹Ï}ᬠÜ mªÞj·­‚Úø@Ò(Ínl´ô¬,$P¡³Õ°=i‰:¶Z~d£R¶MÎùQ;ëk@‰bîÆŠ˜EŒïî/V[v¦Ö0,Ë£Øú~“H™ Õ‡1tô7['»ëfþI&øh÷èuôìÂ'ü ÿúìÊ—^=J¦—¿!©§Eуp²¾NvîuÙpÇ ¨ÈÖQyó£7>¼¶3{êÉ‹GP´k²­ÁéãóÇO;1;6•O ¢¤½U–‰Q;ì´Â mdLÒ­Rð{ 9qó‡–óMïܲSÇ ÂøoÙ•VC¶¶Ƕüóò‹#.¶ß4ÙÒ¸Òï >H›ïh<¾ ¦;õŸô¼Ð‹TÔʱÏ÷íF5t•Δ*‹¦phØ›È `t#0•VTš^¹Š•÷ªµPà ýC¨”o¹Ïšo`Üd5•š”º«gNÔâ²UùéNní@leyùæÚèä^7SÊ{öcIÀ½4 EAEQXÛ¾¶ÝIºÎWB#I" "À©I§7“OŸW-kÁÓþNàÙÂB·‡ø ÖOŽlVã%º8TÞ^ÊMR‡c0ˆ­½ñ¡Ç%‘Li%4ÑAUðÑÃÿتúXyÕ¿ê”BÏVŽÝí áÂÚŒE|Ã$FŇx¯ubî^˜BcüøÝLÉäó¤r°½š¨°Æ¢´ ïs­è5ßÜá.wŠHáR‰IÝH}è|TÞ^#TJ)B)þÃßœ‘­xÇÍ"…•¸äFAE¦­Vè'žµõƒ}Ú0 N±èž??g×÷ÂØP6²ÜÙ±šíK3˜,ª)óãÕ “kpdw“0ÞÏÏoµÌ‰?»f2éÑv5rÎö3Ž ‰QÄ =³¼ÞH2j¿ƒ‰ÓaFšÉx0b%áK“û1t‰àâæîï.ºßžçå«ó•Œ§3g/mÿu9ýö|³ýļN¤wG3$I’pozÓ ·fÜé'¯\<›õ ‰"# B¶–fùîëoÞ{8pñâ¹c㊕_š¾üÒó/½xñÜ©“'Oœ½ôäS—Ïw3‘…7¶vÕô”Ûiv;q»³y{3ëQfú0o_ÐÃ}ömØB¨›ÁfÀ„¢ÇÖ;GŸÁÍF äZÂÏæ¿k.ÎýÇà@O¦Àzú—È$Üjå®od<E†/ÐÖ¥§ÿô Ò¸ ‚Wž—¸ìß츞ʎŸzpcºÄüA$(ƒù¼ÿiC ?ýÞô…«i²r|ƒ@J¹ÎÜta:•´ÊÊ‹áèL!;¡ÔîhÖC¥‰ÝCù÷–¼ï5SŒ1hBO:/[B[ØQSX©qdB@ÕzxáØf¼faa¸PT} 8€fëúÆàÀn×É”ŠYç± HÌl¢0 "‰ÃìpùÚV3Ь’So²˜ø@ Ã}3D"J–ùEUmÊ]ë³ÎrBFˆt6ŸáÆÍJad³²84™Z¡bN ¨ËÖˆ‡&1éc&= ý=3e¯øïo5(Hb¾Ä*Œ¯dæk ªv.éaáî0@bòG*ûÖI^Ž8¬?ì[`‹Êe,Àõ*J«ƒ&„ÄΫZÑÝú Ëh.gD£{£Ù1ýÒCúŒwè&Ò6„"ЗÿÏX"õï7' …FÅ·ì¤Ay+æz¶ØhDC6¢Ôþn/†hðâ“Ç\Ýùè'?艳B·bÛ‚ÈõúÄhæö§×Z/ä»îrƒ…Q¢ÝCÃ[-5R¼Š JÁt¶EÞ‘Y?“± Œ9ˆˆL"œdì½årËö N •o§Ô F &Äñ úFB&$>®ŒÎ]ƒ¯¾ Õ·²Ö{¡ÊécÏDßÛ ¿}$Ö%Ïpš;%I4kµ€€FÝF;ЉúEë¡Ù§^yòì¬RœD1³•6ÛKïþøæŽ:såì‰KO?;?”w$aNØÃä M_|òTÞ€1 …«ÛzrÔi·ºaÇ4n¯AƲröBGí«íÈ(àº_l:>-Gg6.6{í¨³â(ï¹ê;ê‹îŸb?T’H~kÒcöÕ«žíÚü“3¯_Í俱õï: ‚ýñ~; oXþñ‰íÍİR‘8É[Õ{‚ ‚,HiÉÚ'W ˆP*ùï§•ÄÜõÍdÙ4=VB@Úp—5±¥übm Ç'ó…¢ñG ¬×ÑF6ÀHÙ#ûï6‘ò¹j5e*Y[@&k»<¨¥˜úõU¿Ð:ˆIëBåÝß;‘½É†ÛƒÇ–ƒSYKFAHÂ#ÖîÚÉÙ}”®îA±¨Ï®o26›D‘B׳õ€Õø8F†£¹»ãèÞ¯‡,}H¿öìAP!Y†Gþñ·c‰VÞ¹½ÛšË8Ëw¬‚å%MÇ®y%=™·¶ïd²%ºkØ*½ðÎæ-jÿáÛ©‹"Òör'IÃbâms»þ€õ  K†@“P¼vÞÙneY&훆…„P¹. Ÿ*yWp—MDz@(^ß(«Œ½Ó1Qºñ³à£ÐgFh /Y·&ŒˆÆÇ¯ ½vä·uøÎÞ‘«Û”·‡¾à÷a0ðí#Iq ƈ$õ@ç²¥œkiD„°½·“øqïÚ%w߸¿ ç/|ö³çN"6jK£Ú[¾µ9=RÈØ’#"œ"Ì‘…Ù¨g‡Q‰$Ô6jÙÉ6ÚA'l­ÝÛµKDˆ€âé=ËW%;ŽCæu7V«šƒ¡ÙÑ\T­Éî¾m+«øÜÂ5úêÒÏÒŽ5*R/|I˜¹Þ´ßmø–ˑ̞lÿg»û«s¿ÇêwUdö›n£»Ek»–çjë™ø/ÍÅÑ$¦Å0v¬wÒT2éÕèýZŒö-é'¦7/Pª(e;42[$@(c·’$ÄZe«ëzf:7ä @p““rSiÅ„jjüÚ7§Êízp@B²m·tô½·é@–šI,B PÔºÿÒÌ®Þ/„šWD Ûw6†ó«§44œ÷-z4LBd#ÂqØ ÂDºf”n/VˆóÅv-NXÒ,TÕ ÒKý¹£Šî >ÅûÝèÓó—ã¢DPv’Kûé¢å&×÷f&ò­f „!ìÑ¡¤•Qjr³%‰@Êýï?߀ Dä‘2°¯¯FäGE"ϸ§fÊÛ cå©í\2׸+hPbl=Qß._.Þ2&Ú;mµÇP[(áz“’zÀ¤,E"àæF(ÌßjU:\¸6é(s7 A˜S¤|ÿ¸CØÛý‘Ñ"Яü›ó$fç½w÷’3çïì´×Í å$·À ¼ÁBûúG»Ûcî”lÏíןʵV¶vä½ ;G~Kv·®¢&€"@éêðPvo­-Ëc§Ê÷2ˆd S¾ÒjìåKÂóí•TÚµ‰ŽÍ»^Æ"€$€0@K pä9µµrÃñÚû «8zd±FîW® Äþßß%T UñÐ-çÄþ7åþíÃ[TF†??üúµÎð·Ž%½;Úĉ‰ª8ydÌNLØ1ŽæýšÉMv(.¯7­AÔäÑèÎ/~ø³•øÅç¿ú…3Ç †L1*ýò?µÄFÄ 2¤ƒä4G—Åž:;j-̤T¸³Óš+µ šúúB{ÈŒ_·:ÚS}8 ò:³^-a1Ãíf›Ö»Ž£qüâkÛÙ_yãªRéi´šúçY᤽—[z íŒ fà‰¡ï¬&'éƒÿDH=%}öY³ÕõÇ‘«Ñ:sõvÔòK vq(Ÿ¹^`àÔ †¯'úˆ}¡†êŸ“‰€XdÛ#‡Š Pêï&â(¿PÛËÌŒç K»Ð®[ƒ*•› Þ,£öK­JǤëM A'¥§˜b’~Ô¥V,¨¼™ˆ ijí\œè(S°ð`Š`¶?Ús;™Üð€Ÿ±é ± I†aAØžÈ?X¨tÂÐ)DÕ€9NRKEOøDÀ=é@ÿGˆ¢èaéIÜŒÃO_8^Ù Ú>¹ïÌdDâÒàzíþìh6lǬÌúÐD+ñ Ä+.uÓõK?¨€¢Gá`}q@ïžvC„ôd­ržo–úá¡Ú{Kµ.ƒab4ùñüéö¶aÀ@^èf5Rúw[{15 £­Ø =”]Z›nïç”É4À¥ƒŒôœøh HHŠ´˜ü­oåiô‹¥hú2¾óéš=5ÚÚPÚŠÄr½‘L}áÇ­ÉðZuÚ>öìs‡ñúkßßê´ž\\ÃÌø4ù(XÛtQ‘hŒYM mŒ@9sbºRf$!@¨µ.•ÃF)/8¿¿Á €`Ùù—†,ßSÅÜ1MÂ3zm«’xÖnÈbBá´Öƒ´¬‘‚Wå­@5jÒ—nF—ÏÎHã¸Y÷¼ÒóóŸü¢3û«‡LO†‘tí¹9]}¸²Ûh+ç´¯}¸°|gS•l Ÿ;[û!ºÁè©s#í‡Wßùñ×ëþ³ÏñéC3Éýú?;Ÿ1†A Ç‘²ˆÀ˜8LæÞݤGæý•1¨%ÚÙm&¼¤QKâöÚ­Z6«A@{ 8 ¨ÔP9Èîtòˆ„MµØ–ÐÜÉ¿íŒ]ùÎÙÖ7.&MÁ÷C7g¡àñc×dYߎþ¿;VJ¤Dû×&’ýr7|h[в'Ç~Zž{®ÛØ^áØrãVu%øôE±¦BAEi ?*?ΠÖÚ=T°©&Ñn¤ˆlå£rnj4g£ÁäZ”ÔkÚBC Kwo…dç²»õ)SAT ”£‡ÝËEÆö\hVÿ[sÅ  Ôj—GB×òÓØR!”Å;µaµÔÈ …|:8pÿ‰ˆDI…q’Äù¡­{ÛÍ6ë’µß5b ãA úßW`z$D<<|¦V‹ê+Oݨ¤W„“Õc›ÍðˆBéæ×öwd÷Ö SPÞ³\bLvB6(—ï± ¦QØÿ¹¤7s: {J/žºÓ4È|eeÐÖr›#1 "Tm_j¡`R;?ÓµÓ°VŒ–:VÐ…œHn†n­Ïëë85÷sœ_žAgi72Ìi—£—úª¨7öERDúÕ~ž$\üÅÒ…±…×wT²çÌ–÷ò­Œ­­æÂû×Z¦»gØc6ÚŸÿék ”Ëí<ѹiGRqáF;-cJœd/´~\='˹6²Z!#,°ïßï6F=¶ç*ŒˆbkW¦Î£—sB™ BK‘Ðw«+»mÇí–MÂq,@JðÀX•nu€HÈOŽ6:v‹´¼p/¸ÞZb„Ê•0÷z±{3ͭҩ΢ƒ2yȤø#”rEL³£"‚$"JŽLVwWG&—ã'×oð•ÅàA!³(‘Ôˆ|¼‹D¨IËôoþjÞ˜ê®Ê¡Ó»o,' v'††›õœkYŠqïÃ'&¤‘WÎf’¥ïì0;^i÷DîCk&_BÀ`1„fÛà8‘ácW¯?pÏhƒ·n¿xh½‘:À»#³{µpÂ’ìÄÝ*۱쓳:ëkHâ$2¨LFò´±^‰{¿ÍÌ='Ècã‹þâé£|³M"u¡-—Y¸7¿x_»Þü‹{?ŒžþÌ@’fÞp"n¦½ºRëtµï{™‚Ç+Ÿ4õ‰Ër¸º|ÿn+wh¼³¾Éž ÂÎôŒÄ„¶…Ýíëo”Œ—l`°¾½·³½ƒ797―ÉúšCÓ‰ q`†c­ˆ9M»êÛm°ØlȵõÍ8륀 PYê¶“y¥ycÀ²¢ò¶E@ù+ÝŸãsÎw㔊¤Üß8j8I*TyÏõ<‚Ð?3ýÓÞÈ×ßPÚ&RðÜs°ß©ÑÍÐV¶ž:{õFñKòÝî¹È]m B©”÷oV8m§>Šœ—¿¿sÉÁàCQY:“;Y´… @9Ô€2EhgG\P {Üm eØÎYý´EV.W®E’æA÷âÈi;30ý„uû6´Ûˆ ªæ…'j[éÚ '„ãÛÂ~tªìÜ© ÙwjžŸ(zvš–þ/1qu£Ø„8©®-Õ‚P2™N#a“˜44} ¥¯†O”v9zMñÊÊS3åj²Ö}~âa;`Äzã餼t¨(N%žTË»Éá!½§â„wq^šq·šÌB(Btà´êO/ˆNôX TïJ+Ñúxcí\îZ çgËcänì'±03 ™õ퓳š˜ØùÑQ7L“p×HØ ™4ˆaC¦ôD{«Á©Èͽ׮Ÿ#3l27º3Ë# "š©­P?õ¯žNVß¹[ºèr«•¦i'ÝÒ`©CY‚Ú"ÆûܵN}æ…a]¹›óFZ‹¢l{¸1pø¦È* "@m¹!€ˆ‰Ø>§ÞÜmm»0°°¹Syjr1$†xkbt¯Šã(#¥ë‘v\<·}—8Œ£„ÆØÎ´WöšV&Ù1lLr±Ð?BRßL,0vI>mR€D¤NØ¥Sªõþ¾Ù™áÏ[?ê¾rÅ5iW–m,ì'ÆÎå³™L·µåX$æXf÷íOkZrgíÆšÕ›»àia(œh‡ÀÊÖÖÈ_H_•¶]ŠÍÀá©·³½¹tëÚýå•zùœc›0ŽX€=Sª’6Š™¢"êì×Ua@:­.·v똳ÒÊVå­NƒG“E—³®€c­o»’ÌÅ{×Ô—÷Ôß'”uñW³i6íë{yËåH¦ÏUÿ‹+_žø·K:}˜oM‡»­Ng™µå8g&ÿ²~ø™Å7.ºÐXIÜ‘§{M„Ôø²˜ÇØQp »è÷¬H[¶²h `·‰Û] Ђì$ù¡‚BÀøÓ j¶m EÀ™ýhÁ)À^;éuà (R–Î玜¤wjªiT÷þKg÷wDY„–Ÿ·£ü0Q*iÊw+ÃtwßΗŠC¥¬­ñ±¥KDÄDQt“Ęá܃ûû݈ÝÁ¸Š1Ü—¾Ó³Ä¥©÷?±\¢Ô©˜ExÙ½ÍÈ P¦ ÕöÎaô–™ëlodæ¢nl$FØög‘¯ îF;åÕôúOWè¿p?&¬÷nÒ,”i{mdns?fn?½•É"Ý2! 3¡Í[á{1’Üä¸JÍÚÜ­ ·;‰Q„ ‰:5ôúÂd¼qn ï<„`dncJYû[TîÒ' A¢tú…ßøÍ"Kó£·×cGÖÞÚRˆÊ²½°9VÌFÆ–ÕÕ©J|îÙ+SüðÝë×ÛsjvkW‘3ò™M{ˆÆrˆˆQ5Œ;mc§}v>{ëz:»—ÆïnËFù¥ÂjØ«´’½ùÌvÃe™6"ÛRÇ:^ÆB„¸k¢ˆ˜Ð£íÕ²qíJƒ“°¤Ï|âÒ׬¤úï¼ÞB1HÚ;2ç'˵é_T]¯ðÂØ{ÝÏžèeZ ÝåµÐÉz~ÖÏe3nóáf¬r³ç'qç“2@ ÊFÒØ|p«yè­ok@`bF:ÚPéåßyÖgÓÙÙXÜÅ\q|vî¿ûÞúêN#híï,ÞxPîæ¼œGI¢`i2ެž“FI™J%Ìå­¨ÑMZMÌY).Båݰl:¾VŽ­Ñ ¶ £$ñƒ ÷Õ÷?îèhåþÎTÂ&¨8Ûw]í*¦Â‰á¿Yác_ùù_!BšL@LÓ¿æ6ª ³ºoÙ®Î_‰þR½|øg7øÐ\Çy€8ù!7ÿº‘TÕsWöçó؇[öøÃò#—žÅµR®{rÀÄNÓÚP”ƒ™!%…BŽi÷¾tk‘Rœ+;3Û|§œÍ5k݃™ ¡£Gü“sŒÑ[§ÎLjpwíåÓµ]Ö„”±‹žŸuÓ·ÆÛ«[ƒÖÍ]7›+ ¦ÀÞ`[DDÄ$QG]$7¶~o³VQÊ6ý§Ÿåöôdû½eOúI©¨x³ý|v·•<˜½ÒÙHPâjq~³S9®Ýʪn­OŽ”ê¡ŠM¢ƒõñ±-7(C͈îkªÃÁA‚èp9í· ¥6OmÚ,?!7Œ‚Î<%£’¹×‰XD€Ð$…¡ÊÖÄ©ýº*+P‘„ƒ¶tË*’RÁä¹åŸ·'½ÍÙ‘å÷c–ÚKÛƒ.Å·¢Tí’¦ƒ§Ë€"¥Ïý›§Èȃ×oVÇΛwî$ÔJùŽeù#3¾ª½½2‘ñwj㇎-ÅþôG·£Ñ4”Ÿ¾Ýk ê\ ÙvG A¢ZÖš(ÄJàXá ¬#PÌŠõ2¯õ 4Ò©œÁr}4gðHe™\¬'JVÖU€%I HÆHD~¼¾ÝR^¼“p H°§iN-jiiøŠ·¼ÇÒE~é©ln ݹo»Ù3aD¬—Ív5[ð¼\ÖÕ®-;{äx“‡üèÖ-ãØ¾m¹¬xõjmî-U}ÄŽeÃìéo¿”7†âÖúÊæZ{h°û`¹îefÍ (¥Á($›o¬I&›ñ¢H²ãIâ>8_D¶öÚÖHÞ4;ÝÈ$C€T,´ª9'È*Ô((X‚]!?þ‹Ý‰² zÍzú«Â ·ÛîÛ5Çõ½#'ïWËïÆÿ붦žw—¯¼ÌkážuÓX¶£Ç/|p#÷%û« ž Ýõ=1P(ù÷wR5° õdvØÿÉAµúx¡zà ²•ëœt0èP¥ËliÈŽXèå]¥ª©µY‘ brr# ·bqKV¹ö,…½©8ºÖxæÂ Bóç$URò¹ôêÉ­2hÛÍx~a¸äl»K%{¡nùùÂÀ`ѧG7aNâ(Ꚙ5Ö½¶VU´«M'ý¥áª4úÒˆöi"¤Í†~ÎÚi›kçÏ/ï Pwël~sK†Lëîü\ecmj´°±A‰£æ1w«hè‘ò¾$ÜC„>Sˆ½¨0y$†~û!Õâ*šK¶Ž}±÷‰ûÓÊÝYfcÑXÑ<î6®äoê™ ÏÍZ@ÀÇF‚š ³ð îw—1?]ÍLí|Ê­Kq4$þõ0î9h‘z¤eM±ýÍ>”Põú[[xöÄ÷Z -R–çùG_º`í(¿z7Íç8ç»Ý{óæž1 /»46/ÜdUòjçÜ=g¸èÆõ°Y‰‰Ñ$b_^½Ú²ò|ïD¶Z“…+[˜@ªÉ¥½jwÌc:ú a‘?µ³6$Ç*a6‰o×—+±çî7%a#ðXh}úIð`UæÅ¡êr¤BÔVþô!6Æ[¾ÖÉxÇ_)¯>=Ì „ñf#Ó =[!H ¹Œî6,O WÕë»%ARžKJÛÑÆÍ«í#G;·¢‚¬¦Oœ{º$FLçÖÒò~ñÒÑ;¯ºxõ½Åºž˜;yrÊç@l¥µªríýM(`@dg’ê(„,¨@…”•Ô¶ôà€4÷ö¬IˆÓOâ•x?GÆÓ$’°²&âø‡¦~}â»»”žÕào°á?¸ãYqá¬÷uõÂÿåu·ÓBúGSÁn³fî+ËB÷ÔØ_VF¾´öƒƒËò )dÆTp‹ûû¢0ÊãìQB9%?Ö¸D[yö©Oƒ†ÚëˆÒ¤rƒŽ8YˆÁ¢éîÆZq¢•ž¶¯n2yySérOvÐSË)²<5Q¼ân}èwÚ ²ºØà­çO—·eÝl~h´¨ çöA/î.î£ãåGzþ³~(,l¢8ŒÂÇOT‚ò~­ qo0‡„4q©·¬gæGPæ!½¨·ºáÝW.,ï)…`ÂÏtk[ƒã2´ùðÐÀÎöæá‘ü~ ÔZÇ ZT Y¹%ñAªŸÔ³>öô?:“€B@$v2Ó«êdm™ØÔž¬rRücƒl„@$3QÞš:j‚£9Û÷UZÍwšÝD4‘€8}ìã×#Ë:bgF¬!B`ÝšD{'0Ìr`Tb$TZ3Ìÿ¿_Bc–ßþ¸9ôTøÚr’òþt!«_|:{÷~¶|b®sC¦²CNB×þ¶ÑIDÂVA-Ïd'é–©ÍŽ®æF<›Òþz½)J‰Æ(‚£S¿X…ìaþ¨òR~¯Ý>ÿt¥’(ƒÊTís»ÕÆBÿÐP«3“^ÆÕ’$qÀ L¡Î&5ôÍ^‹ ÓMÿ`Šy€7HUæÂLx3Á®VÖøç¼dMÙ?n³žyI׎åÃDÕÎXÒŠô2ƒŽÙߪví‘IûªàÛŽoÛ6*ËÖ¶MeãÃÎÉùêCÉŠ°ãƒaÖV«CÏOÞùÁ‡;F[jíÜý`=vÇ=3mW›b³×­_ÿ 1Xt˜‘˜ÆÝ.+fèM¿PªÌP&ØÌJ’êAÝÑLGÇà$!Ô“á¦{_K>7ð‡I:²±õK_ƨ˜w/ëpbŸ8ôú¥ì¯-ÿ±î;Ûyè÷¨RßÓ«UÏv¨p¹û7ÖgýðX2v¸ãÝ…qpÌÉ|ÒAaHÓþzh˜¾L4=ká#`Ì#Y!ÙÚ·Nø€Õh¿£5(»4à ë€ÚÞâjMX$t”stóã8ÙL¹"r/k 5  vÜÁÁ+Äx{Ñj„(¨¾Ö‰y}ó…cµ}/ï9ÅÁ‘l¯MaìÜõÚ)䇆²šÄu)^8‰Â Ž G#ÞÍ{•0‰Ü|»'Æ(ôTODžŽ”@ëòÈG HáÊЩz=ª­¿0õ Ó³J×ê/Wš«'}ÿ¤yª¸¹Δœz‚`{Ý;YæäyÓ˜øWVwXœ½éŠ"™Sí3ù1BwlvyZ ë¡1lPÈP<êo휣¬Îdêýpn6# ÄÁìÅÎ÷6‰hæP·1µµg¢§¶óìÜMb4|àHШµ&°¾ø¯&é^gÑ>7óÉ]A¥È²—F.fríO^Û wöOÏú£ÄÍw¢ùÎN"´2Ac*3·¿ï”dl²œ+ø‚ tÛÕe"vÏÕ>¬° ?\ÞÞæ+z7 o>yb§&©¿ÜlLN­uh y`bµ5|&ëdlD4‡£0›®ãÔVö"Ë«WÙHÂ}Í$ ý½¹5 OŸÇ·µ¤òÏœ‚Æ­ñÖÛà¼8Ýv J[ L}g¢Í‘íû™¬‹Izƒc£EÅah9Z»ž¶×±D!°Î«Ôƒ»Î©õfÎi®®wF/~üÇ’å(p3ÚÅêÒõOwØ;|îø(GDIÇØ¼|µ2Q2”«‡Xú1"ÛªUò˃Å$¦tn”-¸ôÿç꿾-»®3OpιֶǻëMÄ oï AOŠIJ¢R>mUeVöè‡5úè‡îQY#S©LUJ))EQHщAxïãÆõöx³íZ³ö>ç^Öqï9{¯5Í÷ý¾ÀAfÅž’²ÖŒNm]ПØùQúºÙ•Uùýìõ%#gi…Ó'¼¿ÑWfþ¿K"¡u0"#¿ôl-ã2¸RXcçߺâ~–¿»E€xFõ-Í\¬ìÍe­’,‚Ô\=Œ®Hr5uš•’$öd­hJÏ”3Àw°ÙEbiË6Z&êÛ~§ÛE"M€¦˜,¿¿¤ÁÉÁî NŒ2)Œ„adŠç5â{ëfÇGPhˆÿ`6=¹Ù}|¡˜Y»R­€È*Œ ¶í5p‹Åj­`Wi#ZÇ‘aÀa¦ºv¹ÞW‘QŽ;¾†8’9@Ã0f}ÿyxÒ%‡“¿|èt¯¡V{/¯ûét'óÐýnwA…÷ÝCÆÆ}8TR»¬ ®ON¬g1¶ÕT1kÞTáPLCþZªde°Å@ÆXùÎØÂÝ]fœÛ˜21ºGÌ4ÏD›â´˜9×ÎxеVÀž8øÓw’8pìö­³ú hô,œÝ›9N]ØD&ûW\í¾r©=ó@ýÍ5MBSJÛ(žyþXë¯ÿvÙ57Ê'òÍ ×nN^«CŒ¬B¨lј{piPssÓ™u ƒFK3kÐZËê¡ë·ú VÙºïózöXºëÏL¯÷ˆ5€Æ`ûPi«]¨j=A[“‡7# µ •")¥5g`yµlù:†xªš÷¼+„„ùgå{J)íø„¥›Ýr|rR1p¬LÜnÙ“¥X˜¶ã:–IÌ`gS!ÙÙœ›u,)¥”†ëX’ -mRVÿöZõˆi¦–ñ~¿t,{åÕ•@Ò¶L$´MÇuÍÞ⽕žQž>tl<§(Dµ¼b{ž)J%åIÍ,Ó-²··£¢ž1¢@ˆä¶AEAÇ2¢¿°¼l¼tõm( óÙç4Gº#¼·c;KŒöñ©ÜÒÇ>õÊw¦â3$û·&¼ Ï ®¶adŽÍ~·qè¹{?ð¿0ã æÈ¬Ö¼ƒfШ‡õÉJ5õɶ8ý܉÷Ë„„!L:YÎ4e«EÈÒ­m4z·Œö€H)i!x«£0›ï$#À´Ø`‚LQ.-VÀo ÌN,Å‹óV3„•ø±¹NHÕZ5Ÿdo먗 ÛN±T­Øz½xøþG¡*í±Ý+k=?ä51ª(•à!2éê ÜH§ÿw:øH6 Ä¢¿vnb«ß©>É·{Å»sóÛâ ð­ÂQkqËžÏGFޱß=bídMF'³Ñ¥ù¾Oë‚¡ŽGò€Q†#Hs¾¾ûHpûÆQ³Wü™52EãN—Ë1ER5bZ¨˜ŠÌ£Ío7 ¥qfâæâÂä;è pbe­•]?æ8-ž‰¤D!Nÿû³¨¢»?[Á#µ.õ¢0¤S:ðüCôóo]ëj aú³9äýøí¹JæÆCÓw¬IÅ¡[Í–ów­91˜1w^8fãˆya5Ö©v·X„˳Gû­hÍ{ª°ä§:Èþö#Q½5™c˜‚lÑÎ8AÇqèÅÅšµéöVvûÂí7#…Q”rÌöpûü«ˆðÓÆ>Š0÷òBm¶â#ç3H¬˜p¯g[k`™–•q“ÉI“´¯È0LËÍåŠEÛ”B×4()ÈÍö¶æ‹2ùŠÈ(¹›×•´ …Ô’$¦e™äïÞ¿ßöÔôÂtFÅ í;<¯‚ƒœ«rž`d$Á „ý†=i†¡‘0Ò%’ |-‘-;ïoUŸ~ÿ²@Xý½¼f´­V,ËÕ€3§Ö¾IÎ?ÂÿºaìÛlÃì¯dš»x£mËtŸ|G=¿ðã £Ú /sgÀš'jVî=4°jaiÈhâGS…ýøf’˜‘Ç«f §ÝF@Ë­æLi¢nn`³Ž"1%Rvîöµœ¬YïÅ#Ým2J‚LYÍ>Re ŽªÍD(þw£€½PßsÏLûQµV5GEÞŠtxÌ åì„ÉCŠIª+Ò*ŽÂÀc¥Ì_\i>­v_q‚ìÝëiÃÍC2kFn¶r[]}cááæ2 ­™coçA³±^‡êÆÕ³ƒ¥íÉÉòŽ1kÞ5Žt{%]‰×¢8Ú·I™­“ECR|àžêR (иuû±Ë€gŸXkc#ŠYkBD4o8ÓYÃ4%2²Öˆ ! •f­åùòß_@féLo°™;²¼ÅÀú¡¥ÅE²î’¥D°?õ{5Ž»o½¿“}2~uU¡B˜ŽcOœûXùò7^Û‰9ÐÓ_üòéðÝÆ4^¾:9Ol=˜¹«˜@Ä¡én—ÊåL÷Mp@kÂx-ŒD BUǯÿÏW®O.¼uuîxã#ÿ©pF^3NÕ•l9l² àí ´â86Jï¬Æ,œŠ·ª€:›g§6ûÑ͉‡Â5…š‘šöÑzÀBK KpÅž¬4ktË»}‘Ô#­ã˜42¥“ä0¥§Œ ­ nG”ùl)¾ë½Ó;$§FFÖ(‚»ý­ ›Ïf‹HJô/¼rÏ­v¾ûÃåÆîöæÚý;W?¸ps½c™BÁ5HHiBº™ãMk¨4ƒ• C™²ù|¦X›˜žŸ¬• Å¢kZÛkÜ\ÝÉcÇj{ë“saV0fç3A1PâAMêN Vj“‘@f=´ˆˆnË¡ÈDò×O}·#HÈÚïfµŠϹ²m;Ž:vèÖ³öWÿq@ûùSÆoN†V·È±eæØÄw“Ÿºþ ¦zòºb-Šã|¨4DIDï·:íú™÷L2£ü¡ÅM–q´–g@¨ÝN¤Ð-—³›½În$A3!¢spãr'¶ÝL³ò –+=E@7¯Ù^?Ñô‰‹¢4­·6&”dÑAFdÕí€#zjP´°P4cE´·`Ò:WÞ¸²6ˆbYŒžÖ*Ö¸¿zÜ_˜§\¹„ÌE©ZwxþêuóÁ^=h¯>sðnH Æ¨ž;¿ÜîœD'óš:U[_÷—M ) póHi+c;™6Ej¬ºZŽT†OðèM¶Z„†1ëïœso ý#¹Þ˜Î\ò#¬ˆµ”׺ÂM£¾/HÄñ YÓy÷{·4,Ï]iÌX‹ µ«ä¸tbi͵bRHÁúÈ8оòú&=&q;f"!„aËÉ—žÂ_|ýz7æØ~òŸ~fögï!êò‰ ·ÚÔ`Ne3™Ëõ„˸WHÖéqÀbôºŒæ.dKÎM曲S–ùRÉ!$lvûÍ@#jæXõ£ûÙ9¬÷cH2‘ Q˜2_œ>Ç@î9ý>*AâcV…ƒn/;‡*;á4¡·º{Àn3e+H¢@S?kVQýX¢Ú½ºÚCQº§XÇŒÌÄH£÷.Œ˜’II©†32!2 a´]8í7üíÝÏf?RB±ˆ—OM¬íÚs8Þ}/wÔ]]’ ån›t« >î‡9b.[!kµ7„½øP áêbx6h$=‚õà”»21w¯ÁZ«‡—ÇMÃ[ñ#fˆÄ²x*'¤%ÃÍ~ÁðMbâÈ#ôÎ\þQ@ Ýéà&§–ðÔúiˆÙ(ºL7ƒX! ‰$4¿üoÆ¢¸ñ‹kõÙGïý¢Î…¦e9¼žwLÓ0L!…4M;Sªæ2´¹·t}Y•Μv¯´gÚÝIóí¿ßž{úT©î3%Þ~ $¼æ©ÜÎv•Xb D’—Íi¡ƒ•Ÿ’BQûgY Üí‹·š†mš Ž^ý±YýÊíÿ¥É”@Þ~¶z¾;,ÌÙ>¸l}–þz]€žÏps•9²jkçjf ¬qh-uY‰Ä«Â©üG1áˆ(¥-Šóy L^¨×™ X- ¶zíö É„ˆò@ôaS“[è¶}=º“­ aÈ\åÐ1`~-0  ¥(Ìç@[&Z$šÓnò§Æñ ±´¦ËÀ ‘DºÿKû<Ea8ÙÇ©ðöNsÁnv"V*/“Æ$‡„‡ÓÞó“q‚ÆÙÇDÙ:X=z¤Ù‰Wá%^L4ïž3×¶jUž»÷Aḱz;7_«³Ïâ]çx BœÙ¨Gík¢’‚d«B؆3¥[$"m¨…ð\xƒ“³ˆöG3kL$«óY×”ªÃŠÌ 6!è…JÛGß\!ÖøÜÅŽcÍ÷[ÒRÐ9åú0¯x!H¢âï}ÅŒÕõWWô#ÕW®D(IÖòð§i󻫱Öxðws|ëÏþäŽ&¥awññ…ÖÍõ'ÇnÜ?=w+VD "˜ÚšÉ° "¬û:n!³Bñ°÷Áçk›4ÂxÃ>·âöÍGÞî'Vlì÷1VÞH?õ(N:Pë´7êe6»±'%hºŒEÞž $Ÿ±óœ±=xl^Ý[™¸^¨óVBDBŒýò`ÍÏd²(¤„_üÍ}䣿kÿôoíÇŸüÊo|ùsŸ|ù¥—>þñO¿tîØ;Ò¾¿±zuUgs™b¾êjdxTrï\õ+ޝ‚‘˺Y7_™œ¬8¬~tãµo~ë»ßùþôúíÍŽéØn¹äX¦Ýëm*Çpqz³Uù·.½ý6?ú±Y¯KQ†Ýðxa+*hÒÐ0ÊäX¡èþ‡B(”â“ÅûMsóŠ™qç‚? å—Çÿ?KF2V¢DÐë~u&Úîõ¼›†c¡ûÀÄ_‡Ÿ¿ñ·!%äKòP?w;`ÌL”Ü«ÉXžSê¦n@LÁuû°á{g"³4 cü`Q0жŠwÍjÅ5s\÷­XSIª¯Ü€•3vQrãpü…BS ç'½_DÜc$!ÄÑëÙ*2ŽÏvLçîKìÕëµ›³DV¤Ê¹ÑýÌJÅ‘xBéqûÞ?R™\«iŽôpž‘®øqÄ•O‹ñ4R?èdÀž<=ämœ¬µÛÑâôÓ[ë‚t7|´ßÝ>n˜cVNÌ…«3¹`¨ÕÚ‘RÃ1ÌÜj”F GªÁžÔ‚hWN½‘öÊ Í)¶ouü8ÙðRaªZÈ„ˆô ×µQw•/zã˜@ææwoZeçæÁ™} œ_Xž"sm³ŸÚþëG@uß¼¸YzxëÍM’H¶U~âùŸ~írO(]úìïë|ç®*¥˜5rsãÑ…õ«ýÙ–ž(ÜбŸ-f+”tbj‹žÅX÷U¨Ãxêð•ë=@«"V”<Í@áZíl°­êËŸž¼í f@ñ€¹4mGÅQÅ1øœ 7všÚUÛ>넳D{#ßT¡’ÜZÌÀ(ųV3sŽzWÇ›•Y§”¦± à¨ãûæZ®B„ÿZ;VýZ~W}öãçW, J±B£2üá矚®ÅÝîÆ­ ßv1ë8Œ —W×´×·ŠJ™–“«l^yåüôⵕžÖÈÞ »~óâ{û˜u29+Ö†Û÷®^÷§§Ü1LκWï\zecê¥óV«§G²Bs«4“[4­mÓ"ò1"š×:@K¿ŸQ¬¡ûÖ®í¨ãS?»œñ•oIÜ‹Ã"‚¹¯ØVClµ,2 ÿXôM|êØß^L”þ(Ð|0Î/í*åWJÙÜ;mT:ÝŒ¥¤HËâ´Ð‚3h§#…CãK 0ÞU­2¦ özÝíº ¡0ÊîÕõˆ³… Ä#WL"È%dÑxö9GCë :ÌL$Lñ´q¯?eh.Ι¹…dÿGíÝnlÂvyÜÂa˜ÕèýV:‚` 8,å—®n÷üÈÍù­H±Ú3Á%Ó#2Éqô[áIaÆ€ÈíÎcÆn0¸ýäé«ýôÞÞ*¹Û€y*› SƒµÆB•×™c¾w˜Wäâõãábfè[8Š•bØ“ ã(K gn)sl}!޽;%%_"`fÔîäX©˜!ºï3÷uID‘ô»‘ó@ÿ;›„ìŽ;W&‰ÒÁ<ÑZ€ÆóÛÕm•œiOþ¯³±^ûÅÝî±C×/tP Cš¦›;üñS‹ýz›YýþÓâí?þEµR¬X1mô¿|3ÿ„%zÆ_KdbÁ¹ÚITf¿éf:’òâæw7#öX{[ÐÈÂ[^8ÚìÄ;ð4­&TaôœÃŽ‘(ºt+?&Œ4EF¦»¾Û7­~›¨pŸ1uc*'!"”O¢J®{ã×Ýâ”%‡-Œš=›VÁ¶-Á‘ÑûáÍ óùOÙ:7ën_»õÃ?ûú·¾û½ï}ÿG?yõƒfÃÌgœzôá¢åõ½l ‘‰˜²·ÍYué L0ÆíÛ?øÛwï i¥µFZ…ýÆÍK÷™\¾ê@¬ÐT«W¹Zr1søn‚;ï^py|œ; ‘€@쬉Ý"/gÌ´MF­Q’ÀüØ­KùñG5sÔ «ÂÍ(*§ü¿&ñEûÿ¬K½'9O=Ë[ý¶¸›`3çÞ¾âüŠø“# @òÊÆýûZ‹B¡&Û7«$–XRJ©Ja €÷ƒäS]‹¦Y<\@Ô‹a70²µœ“”¦ýAs+21RQSÁ‡u-ó™F?ÐLC`6 “@i‹ç)É´þNŽÛ ÞúXWÝÕBµ=9e%â¸Yo{ ÛECñÞ-y“µÖQìy^¤‚L­}i³ë)ÊŠv_i4ìS0 üR8vz¡°ÞŸ‡”蔎ˆô.Ÿ»ª»ùìÔ0IH‹6m¯¦pª~‰—–Wà`Ùkk„¦>ÑGAävë*_§h˜@44Vâ~*=¦#+˜ïov® ;§—8ÿAifQœ/K®Œû "¿c–|I •×9:ù³ Š “[‹B €ÙnýŒu3œa í‹QȤÌ_ýõ\ÜykQœv_YŒQ€iF¦öÌ“òµoÝõ@ó/©|ókßÜ@PJqZ°(u×›ß\ºuà¡Kæ“ BâȘœ#K ¨N„ùŽ+h7èGÚ'W/v•¦¢»ÞCÐ À‡€›Çæ›-u¯úD]'ªOÑ™€¬u°V*våÖÆnìr³k a˜°œ R†1ö8¢D(OϘYjß_꺵š8>Puš–Ýr²–ã¯où?x§%þµ‡ R‹oÿñ7¿÷êµn§×muêõÆý‹o¾ýÖËÅ‘³§ç0‘ú} a"J8©ûÜ»ùãw–¼˜ã8 ƒPI2lKµVÑæÍ[½|®Pä•ÞºtŸªƒÎmøšuûý÷ºÇ?­˜‰‰5ýÃ…Aw¬Óé Q 1㸳‰±”W:î÷ì·znÖdeÿÉUqþ™ÿ=îáÕP¿;Ö»Íð¦aKiŸþzoòå›?ðˆ¤.œðr×"`U™0ŒwcT:Ó¦#:C™Ü^Û¿‡‘J­«B¹C% ½6Ô}³TsL‰u£mÆØ'Òhæ'–®ùèæU³!rúP²Õ–dXöxåQfqín¶ã0Åÿû€êºÈ!Ð0¾SïJglÆ‚‘wi¸®Ð: ƒ RZÔ‚«÷QÀy»Û 4D:Õö§ÿ#ÎÈœ<&¼·‘K:ý¡/„Ú©žìµƒàeº™êú;OE»ëG²4}ínù€»¶’?PªÇD´¦ªÛ90clwAÅ)ˆ¶ÊäÞbJ‚­†S€}Ž!"Y.Þ:p³ Ä¥‹sàlîD1ƒ"·6¯”2U¬ý°¯J›VÏ:¼öÃmDv'àz$AŽ››sãw›qöh³†f³ßc]ýÏKÝ¿qy§xr÷ ¦iÈ̉ºÿ×Ú±ŽÝgþé©úßýÅ5…Zqš_ѵ ÛAwñ±#7n>~§o0¡“¯ DdÐ}Ŷ–&zí` ÔBíâ„96ØåkúŒvwß𼛞]ê0IiÑĸÀtóÂýP±Ràú;ÓòêZAŒ{9v©|’ˆˆ¤(àð1$½ÎÞŠ]=fD1º¿eåûä:–«±à»ï'¾øò8o¿ñçùêš§ "JVRkŽUçúkï¯)ÓÊWK+oÀ‚ˆ#$B4s C$dòÖ]¢AöØìSŸ}ñã/¾ø±gŸzò‰‡ ¥Tgy1*媥A ¥f7Þºé;’$T'vÌ ýkoß|ä¬ÛW 5ð¡LSLØÆ^‡¨ "œ1VÍçޱnÔ¯ÈL†€ÇNn~ÝÎ|1úm1Dz%±Ac¿möºuskÛ6%eüD½pø{’@&àsÂ\ÞÖcÕLæJƒb``Òì‡ÚZ`JùàCm0ìS –á.] Û´­3¥²k ÐýÀÛhˆ´ ƬýÞ6K7Ûé †@œa‘i9ãó'ŠWzF3ЉÐxòŒÌŽŸ5Óš±¿Ó ŒÊ\±Ø JF« V:ŽÂ RZUœ{7[ýH¹…~;d­†ÙTâ74ãÿ *³OŒ³§‰Lo¤`ëÐz/^œ|¶¾¢“*¦ë=³îµŽÈLöÒêäáh}kv,»2+GŒF‘*ÁrȱN9J#=Àè(¢_"†¥Œ$Á¦yp·÷Ðàž&n<Ò(ePÜ%JÓ¥ÂXÞB`ÖBÄ~ gòa°Äræg7´f«V]Ú0%ùÙU:Ý^VüØfÑÂÞz7>ô¿œÔzëâûí¹…›,…4„eWŸx†^ýÖí8Vâà¿ü½õGïôQÇ:í™F¯ÅØÙy¼vmñ™Û¡TV©”+&;ÀØS ³± ´ Ø=Ww€²•í–NK5FBÞQgÝFß¿÷Ø‘õ6å'ò‰äÈå@( *cnm6=[ì ”Â0fJ´¨ÄÃH.€(…¨=¬±]woé‰cI‡ÍÐÛ5r¡rs¦5¸Þ;}ûrå¥/½ŸþáÏV’„¬S6& fVšRpÿÝ ú fF´b¡…´%2eY–k“ h`’¬¶U¶rⳟþ ggÆKùŒãK•ñC?ùÀQ1Ú÷×Dµ0a¶B`0#w`µ…ÃÕ“µî@Z{ûrîч3 Úœ µŠÉ¤Ó'H»‘‹šÅA'z9§žýN=—5˜Ý÷îžyäë¯SºÌF"AðÜ3z··¹îZ³¼ÁýŒú›5™Ð Qà¡j¤cÍFµbµ®±NÚRe ŒÆaé;02³¤ý’é-,8TÍ2`Ü6·¸P*Ú†€¸ÃÝí.HP‘ÈϵÞeìz?nÝFT'"aÈ|íì¤ü;Í­˜5‚0laÜ.«ôPì¡×‹­p+v~¾Øí ࡉ'åù¨8 |/R:Sظ¶=B«6ûšu y”k–¤*©½Ü¡ªqQ‡vG‰ ;sÙ¦çß|ðÌÒ®ÐÄ õNm~£aϨ±ÞÕÖÂd{±{ 44Ël X–WÛ ¢T¿²7aÀƒpY‘/IXÉ,«^‘»‡ËÛS:s£ 3=“©Nä Ä0u?)0/6€™Yýa—4¹Ó꺖š„\èížu/*¦àAí»ñ#¿=¦ÕÚ+7øDî•ÅHBJÃr>sôÞ×_ïÄ…OÿöôÚûN4 N´ ª¶·£áGÍÇ­{ ÎBÑ,¸‰¬=Ôý¸2pP®†šùà¦Çd”i¥?ªáÒ*~Kœåf´½ýbõN€¦‘5jS®iRºØÓеf­l}§É¹¸±V!ƒdF*€ uU§õ BAdÊ©G”Ú¶ûëåã3ÃØSf+*ʤÙxG?ýhñѯž"ÞüOßk'«˜ÄŸPj&qdd(ŸŸ"VθwµŸ3…AÂ0Lǵ-Ý¡g˜{úSÌ•t¸û¿ñúëo|ðÑõ SŠòôC ëË*_¬ä=O ôÚÙ±]ÃÖÖüÃóA3RÜøàMã‰'f{žB¡º3•ÈÏÖ# öš²23N”ë ¥‡íþ(!p8úc=Dfï !#šèâ‘jŽ£ºU‹¥œe #øêîxÌ"¢U­]½‚U ;ƒ˜™Ž@B˜b*óH^ÓàFÜWÀ€ÒrÅáîõèôœ]+¤PÝoç3ݶ(O•}ÃFêµð*Ž‚nÇÃKKýÀÇ‚ØòµÖ‘NÙ†5‹!õ(ù/Ð^+Ž#D§¥‚NÒ˜©Ý{^×=oñ“SWýäôðšç­µúÁ¼˜»µÔ=^Ü]3UêmŒY­ùñ ×FÕkAR‚è½¹οQRðÐ"¬ ‰¤6òë•ùå¶ÒJ=²>‰v{IÇ1gçJ¥±ª ÀzÊ„~ MêÅž)ùòµQ»Ù D!°–_žœ¿>ÇU°ƒÇŸ·8¾ö›Ù‡ýŸ×QH’¦%*¼`¿òµ˜cuòŸ?ƒßýÏw5³ÒzH3KÈtD¼\zaë2>¿»î”ÙnÉMkXõ‚ZèØè…pR½½©QØcÍ].ïÒ9ëµv{j™žµW´pmwrÊ”öÐ)ZÅ †Ý^kõ-³Ý5è8á¦&—tm»÷Ä#¡0ñ‘ªØ+ñÜ1Ò¨€ƒ–.ÅÊÎråÍìcüÃÆ¯?nrõÿ¼¢A©DTÀÃ<"#1 A!/ü¯§”æ­¦m‘UÂÝ6˜†e!¥A;½sGV¼¾ èÖ²‚—_ûŸþÍ×.Þ¼³¸¼tëÚÕ÷üý‹­\Þžzø¬Z¹¹R¨”ÆúžbKÒ`³0¾Y´â`ùøÓ;¡f–Þ¥·Î¼pPõB- êË\Á*)4‚¾ª-ú†`´#{ž¼ÜuM7ÒÎÑê×ÖðSGÿì}‰{Ô D€©_µ½nS,íZî£ÁßÀS‡ÿá½!Ü‹‘àœ0¶Ö “son¡VÀ ”FS0ýËÚµôuÑRHGÏ3p¼#ºPÊgL€ºçc§hP1²´è·¶•™Ë6{¬©æ¥Ž1•yØfÚ~Ï{ÌAZŽ8dàÖÊÄœ3$‚ÚôÇ+1Wîö Û° a¯Zg`¥¢ ô•²¸~·Õâ¼ÙíFI @"ŽÜ`ßa™x9uhƒNÃ2@tÁ#êçœ×v¼ãmNºÚ^ÿ™Ízó8YcW·ÅBnqµ<“kz€ìãîaÚ-!sÙßñ!Pi´ÂJà\<$.+b B0c;[l? ®ZyOw¹ ¬k} sSöÌD^¤M™aÉfzÐÊ8‹H}´fæ;7$ê1*ÕñXgEƒEçw+&Ç8î_~¯3qæòžaÓ0Ð9óò[ÿýín¤UõW¯táÿ÷ ÏÐ*å )â¼ÇOa†[ Ý¿\xvµ7[¶Êy‰âz4ÆhPs×Ï»u±De{µGÃdtMDäíŒm·ã;¹§£åŒmº35!­aÙ)djäqc§«\ÜêsŒ‘÷ÅšêQ®”†¨ýZ–êíÒkø¯C¼Uehd\}ññ‡ƒ·Ç?S CûÚ¼C©‘k„¼cF"C€qè¦ù¯ßŠ2åµ™p72 …Ò_½Óh÷–ã¹"0êŸþÏ}ÔІ!Iˆ¨cݸüƒWEÙÍ9ß¿{³7“Ÿ‚.ƒÆ`P/V[Y“.}­yðéOušJª»¿6ÿ‰SÐÑÌž3ë fiÉ HSÞþÐs@$ +%¶®[¦#L¿÷gâ³wÿKjŒN7ìÄüäsØíl[—b! «öÐ髸g›£Á)!áàÈL`Þˆ”ÎÖ&¨w€YóžÃ*5þ¥Ms*»Ä}T[NH®tp¬Ä€P·ºº˜w,B„¸êf7Ò$Aܽì‘ç¶"! 2Lw|òœ`qï²ÓõˆIÈ¢XYÛó‹‘^NØË½Êt9ÓìKǶá^Ô=‚ÖQžÖQ¡|ïR}èL©ßRZëT>¦ÔpˆCs³f$ÄÔ˜Ã{q]©W'õ ÂÐoÍû]µXù˜w—’Ïj'ûÄÊÖ¾´;}(¾·s`ÒÜ„ÖаŽu¢,™YojŽS6”L##í-!2 MQÞÝ84y·)mgê„ápöÀ#/~öóÏŸ=>é$£^2L"³4^­V3FH 0×:¾(ä®´¡ :D'œˆÞY6L W.t˜þÙ0´ÜÂC/8?ÿÆJ²|è_=Ðø«¿Ú¥dn2¹á~¨32þçß¹yôt½fækch«êë’© ô·Ô|öí{šÁ˜hî„éh*e‘13ò`ûôT³Þ˜{²Ý°¬ü×°ÍT(u”í¯7núJs’œ8®@#&ÑJiµŸFx%Î@ÖäÃ!=‚éßò·ÏLì¶¢«O[j$Îkµq²ºº|$ó÷Ö[µ‰þ¶°ÔoPÌïÎÔ¶r&@Æoô ÖûAËû´€‰ =—‘‰Y)DwþøD¥vèù^xvÖ±¨\+çM‚QÕ€Hˆ Ót N–¯œ;3}ä”^SŠU €Ìj~yrv¥e2Ïϲê_¹‡¯l “Ȱd¦òâƒõo¿ÚPJ×~ã‹îÛø¡Qâ¹¾õ<$§òD†ÞöãµKQXÊ»2ǰ!™ mPÙ…µ‹ëÈ"WÜì¤'££D ɽî‰LgÐ[~ëc5 ¨ƒ=-& CHAÿË¢Âå·z§Þ¹êAûzX¶…i"öƒHNœ=?e°Š:†Ä‰âºO1sr‡})@ܽ÷ÎâT±z:sý^¶Z3w R^c^©¼1·µzÿ½7ÃÏ?ä´B-6?øÈyì!×kéÁšÀï°%R™3¯‡• @@fFùÙeùÌSŸ¿ò—Zìí™hê·m¯Õ2×6-i[ù߯§ýìÝÑ ˜TsÞ¹œè®†:ÌUÜ«[Ì÷»SS—AÊåá5–䦆ÃSÓD¦‰œÏ% á°Æ-? PaƯ™«ÙtÚk­„ Ð6JåcsôžÙTŒRf-q&ƒ¥ÏÎ0y €E‘##c©¤dQZ±¯"Q /-ö Øì(j€‡ R¦}CŽ‘¢†Fâ”S´ßŸ^Ké³×œwýÁú³·|TŒ~ëÉpwë¸)æ®m†'K+kÖÁB§+•V]ÿ0ö ‚©ÐØYëPöÙ’‡ždJ  ‡š)wìÈ©Ï~å¥ss3Êv-Ó€4¢\ÇšuúCj€Sj’-ÈVù豃'žüÄ'?>;9^Q:F.·ù¤·b²‘9a €xñ~öĽ×`€0 +sî¾sÝ‹”õøï©ÿÅ·ë RHìhs‘|`ÄC´9²&ÚŽ_¯è‡ ¯”±ÒØh-ŒÀ/D&àF­ðþmÙ‹7ú“æ*Ý&ó{]Wç°v6ž=°ž›È–IÉÞ €€Œ0pxc§ËY¯¥sêä%©ì9Ö’H5"$!…ü©h±íÜ„P¬™€uÏÌ{fN¬¿·[}<çÝÛ[{üæ.A"}à}áWŒŒ(¥æ3¿›WêÞûý#ÙÝ'zRõ¤)€Ôî¶‘ÍÈìä|Ùo¼v«äö%Quj«'ât91|˜Q`oýÃþdifbó†˜*C¿¯(än8¥É¶&ïu¢Æï¬Ì?÷D5èÅãîÅ ôÐùlgÖb ú l@¢}=ïæ*F‚¬ÒÅ™’H{¡øíÍÜ'Æþô¶Á4¥,?‡~ü[†+ÇÎÜxÏþ|}• ç€çyæMÙ¬L˜êiÍ~I‘‚í¦úù$•'½'Ð6TJ@ "™uL½ïGQˆÈšÆJ÷/ÀÉcÓ‹†$ÞQ(=¡#j…ÓUÆàRõä—0lCœq+/b•ˆ™5#¬MWÚ¦HΦôT@E¡ĘÏܽ[÷7Z½t¬†_ñ0cOýÈIÕŸ4æÃ’W§ÝNêxÐ{S{Ruù@ܶ¼ó-Ni»Ö¹ûu<¬ ÆåF怹Þ›vî“„ێqÖ:J+Ü¿ìKëX&¢”33‡Î}õ‹Ÿý•?q¸”‘:F¥uÔ€ÜêDqœæ4éPiâXi­•V<Ä*@r³¥ÚÉÇžî±gž:Y›ÎY×|™}p‚1¬Wª/õ…RJ§öÄ“ê'?Ùˆ4L|é Ù7ÿÇ)­ÈH¹/0×+Ïø[S“Òt%ÇXX¡¥ÄÞX烘…[ÝÞ¡${=áµãP^AÑné˜j©6ž/c†eKBÔJ'É‚"c°Ôî“ÙêjÍ*âýGg:Ú›Î! SÀÑ_3W—fÑ(À „×X{·S~¨¦møék§ž½ý'K”ÖéH SgQÒiJC‚üìW³±º~ Ψ××w¥²ŠÒ@ ïoÈ|¾˜Çhýý7×Ûµ\_ ,[žÆX'RSN~]TÞÛÕJõHóªªMÛ[‘B†V=Ç(È{ÄþíׯM>ñô± iàΕËñƒ'2Id¯š¥@ÂÖrT›N. Å$òämÿĪ|æúŸîÅ̦w‰õùnýÁÓ&°ŽÍwwæÅûßéSRåh44 -fk©‰¨*ålé•Y¥™Qɽšz/G¿Æý¶uD’dŠâBɤ6iÛID_ôì1S,Üiyi)03…^wÀC‚sâDdX¢V~Ôaì¾'ûƒ˜P@ŽÅÙü '‡Q"}A´,™†k ìUƒ±ï‡±vÊ;Wv:‘2sƒN¬#ò"(¥~Ò>:ÒýïÙõq”‡š¨òi¸"Ú;ãíÚ±FÏ[žyjsƒA0€Z?4ucrŒ'Ö—{c ƒÁjØŽB¸{ ²“3ËýºAê¦zS†IË PyþÙ¯|ú«Ÿ{ú`­(@±RìGFÿîúî–Wò$²Rɾ •ÅŠ5ª8T1h  •ß µÒ€€”-Ï[8€ùIsò©£ÉGoñ{WC‰Ò0lcîSÇV¿ùæ Œ¬sÿä¿ùæºJkÚLáž3jÔ« `|÷裪U.‚IŒZiÄX Ó M}ÿ‚§´¨˜=LS›(ùðqx؆ÛÓ ½®ÎZRZ¦ÔJ'¡aÛ«íȈw#¥t¤y¿€+¡(~_HD‚ÅWû‰)C dfˆÀ! EYsývá¡)eö~øê3Ï.ÿá"Ǭ““aoÖ€’ ‰æ§¾jªèúÅø„ÿê’–¡éºNîàB>^Ñ™ÌEYºwój[új·WÊBàÔ#Ј<÷¤C&ë—Û³…óZcvÌì ˆtØ6ŠaFNooF„:Xõ"œé°î1PëÆuûPb`ˆck‹u;°¦jiÔS„²Z+þvÍy©öÇ‹)4UíâØo¸ýf+ØÚt af¡Ÿ9ùã·™F=B2ûÊòà¾âÈ*N:·7@±Fæ[‘jÕÓ±Ìð-áT»–6ÕRJ™;V´˜ ‹‚lÓ@`ÖQ¯XA(ÊÌvßí²5šƒp¿Ð>W¢0,s>÷°dZºäô»‰ÍØÈûâüs€Ò1%q {ZÒ0n¯<ÝK¹ úaÀÅèòZ;Ôds+ŒY)•T;)Ðl€# îÛiàpB•HÅ.¦ÐáW*üú±Z»,>züº‡Ì¢·õl°Ù9dåkÛÞÁƒ÷Ö­¹ÒF_D¤ypÔrÈ\hïÆJ U˜ÂK“L^Vféà¯|ú·í±ã2G;×îÞ½µÆ¶×ʘ÷ëƒN¿Lž… •6 €ìµÃ(ð™P±€ CWFb@„¬êw¯_ºr}ñ~+6“ÞF"TŽ+§´ÿÃû] PËyðã¥×þr9йòůäÞÿÓw#RJëÔ¤€‰>‚pO¡f³¦(7oñÙ¹Ýþ8"+Å,ÙCak“ŒÁõ±ÖÎxcSã°­LËÃé"‹ÁÖ‘ù–'×Í2ZâH'ž4baùk át[ZiˆR'júð(žj”·B\ø5±zÆrYÇ”ˆ“BhÓò»í샳 ëÿíÚÇ^\üO÷@éQ5ªGã.$" ò7¾d¨àÒ…ÌÃ[¯Ô Èvlkâì‘ÌÒ·~z3¬Y¥²Ð(T§¡´`«¾;•ïKÓ´iÖÙibOb`¼»«såÉê­‰ÚŽ‘|ÝÉÛE1{»§â­^ Ï¿xÎê D/x†™I*PìSu+GMN0uÐQÙ´õ;ÁÂÇ/} FXLFâs/cÇ«‹[CNùܵw¬/dþ|†êBÀ‚AèÒ±XÞ"Äü¬}¨Y1hæÑpÔÞœz´-^ã „i:‡Ë(¥iJÔµëÊô͈cc7núìæ‚¶%+…ÑH€eÈéÊyfqí®ÑòÁ°ò-ñOŸ#` FÐlšŠF4‚Ñ€zxž1ô<¨8Wîì†QT°[ƒX«XëtxE@#ýMšféá˜tÉ<üWS9¦Ýênïw;h.þJñ¢ÀÄÔ÷?¶ºëŸ€2\ïdæÜÕé‰ìnL¡ê7sºÒv`³K<&9&É/TdüÜçÿÍNÍ;¨©{gåâG×oßYÝêô"„ £¼¹Úiìê™õ VdÌzÐàGÒ*–"Pܹ–ë‚M-mn‡j0è v×®½usË3e °7 !ø9µ§ŸñÿêN¤ñäï?æ}ãë[‚uÌ4J#nŒ I“™ä ÈAîdÞ˨} Z>K"ðL’«W6µ6ŠîZWpJ? !ÀÓwç«u¿Ÿ;`$DŽ”ŠY‚&Dcs¥ãuŸU²¬ß[ƤS€á<ˆHH!¤ó«‡zïT]c`fA Jš(Ä÷ë¹Çç„\üó•?³úÜgˆ†ëi7ʈˆBJ¬ßýjÿÍ+…SWßh£!œl67ùМ~õwÃú²3ƒÌ훲\À~ß°™:[ÅZÇš‘ _%maª§†dÌ€¼ýQa¶8çÞä±™F7h×Ì8›-^ “K&n~ô­3Ï=ä4z‘<ô8«X€–¤báH ”ÇÜxJ˜%Q P0ž:x úGK4¦¥;"!|ùH¼;¨Ë`¡!Ï»1ÿÉÕ¿ R¢õIÞ"äóÒ¸ÙÒŽMfsïüOÚ¢¥?ú0Å"Ëù„Ó¹a扲£"–Â00DíºÎ :“™×ë!å2í¾!`²¸e:5ÆI‹²³s‡Á{»F'dF†íìŠ?”w™dE6سV80†^š½‰'#(D2`3ç.Ýmv|ÎØ¶Zi=ô/2CÂ&aߟ6øˆÉ'‚ÄiP ãþȞα wð¼ßšð‚ºË À¯O»»:SÓs‹«-ãL¸Ú<^áe…vØ<â¶³‚Èmµz4²œ|Lš5™Ç^þ­ÿ™³ÓLÔ^½{ý£KwWêÍz£Ûn5ë]tÍC´éŽ×r³®,,G2AÛ.)),) ¬’ÑØÌM-ç$ÒÖòF½^ow½F_’ï :6" íNrö¡§NÏ”íƒ/ùàë×|¥2Ÿýýê?|-•Ü´ÃD˜¡¸”ã %ô­Ô¨Ñ5&']„¬[dwÁáHI(o_í€6jþvœÒN€Ò&J§¬ÄvÔÅmc¼X„:ÖqÛ2Öˆ¨ ëŠv¼Ý@‡£ ÷¾0µ!þ6Y¢ôðçñ~?sï`ž˜µÒ,™Pn¾ßÉ=|@Ò¾ñüçÖÿ»ˆZã¾°6DL8¥”‚œßù$só½;㧯¾9L™L&{è©Úö7~ÒÕqæ…g])Ѽ¯Æ'¬Ž2€ÝfµØ7 æýF¿”¨—HU"…ƒëj!3½{ob&¿á#*¯?»Æx´¢8`!cïÚîO~âùJðÈIÝŽ-F0(„\ D¦RAD…B!µüú× ÍDšÓ{TÅf‡íl-ÒŠ+ówÃÇNþäM&Ðû3?Q­b|—5Ûåq{ý>(Žu*öV {.Y¢}¾D4O\q´”a„(0¥a"kP»-Ãî "0Ñ>¶öá r FËF÷(#PR†¬•ON0ð›ÑP˜Á°ŒºøVV&Kˆˆ<è°-ÌgÃ&](!3k@–iÔï¬vB ¬ßñ5hû|?CÌgZþï!÷-#áHCˆzŠ#€jTŽw»þ½C¬l°V»çÜ­#ލ]n &5V¬¹B·§XÄ< CÚ1êMx’0hТúÔçÿíçšQí¬Þ½páÆâNs{·ÕÜivûQlÍœär>„L«a»=‡\$b\¯÷Ú[Û„:¦é…íë/Ä&Š‚]°)ôü~³ßó}¥ÍŒc„*V* [-ó3'Î,4~¾ìÅ8ÿÏŸîÿèO—AqÂÚNßñáî' ¥Ï3ŠR5˜pC?2"‘ —îô5f ëx8Q¥ôÔÖ8LÅ@€Fí iÇ4Tâù'¡´@ä|´&ë}­X…œÂ[qUE£G“I’¤ÜWfú·T³xR$U ³ÖŒ °ñ^ß>uL»ßl>ûåÎÞ ÇzÝ´`@‚$gÿåó¨ëo,ÏyûJ$휙{ð¡Ì•ÿ~-f˜ý§Ìõ¾?Q¬LÝØ.WKÝHÐJ©kJœím1+5…g ú^w!?½³ûìcãO|iòæŸüCYkP{¨T&â}J«½E ¥)°SÓ¥œddD!ÎÄ& ؼj«¤VÂô¡F<ܸ'óe½ƒ ÅŒeZˆ¨cŽ" J›¨P „·»¡´‚pÏÁ¶o‡“œ$ITž$Aâìgèêòxÿ|Y§%¬Ö ‘WoäçϚ굿ê>ü•Ý?ºÄŠS>,O}B@’ ™ú ª÷7'¦.^U¤¬¬kM%é^I‹‰ÃGMQ_ŽjåbþÍ&E"ì[ ¹µ8’JWYdW,TË €Ê$A€¬êžpú~¨Ð˜×ïíÆ–iõ4” ‹D¢ù³i¼ø Í´ó~Ök+IdU½†øwÚ0ÝDbÆQœQ+ËÛ²HI‚ïˆá‘~*È¡2ðêZ;dÛéuc œˆ÷<8É©…û¬·‰Ò‘PÓpá¸UŸ¼F–]P°ž2š½†÷¼s5R´3søþút §–VCû`æ^ë`…·)Vì·Nc?+@æ; "ÀÀæÉ'þå—ž±¢æÆÍ.ÝY¯o4wV¹Ê‘ÃSãNosgie}y'.K²÷BR½³AijÐô z „) -éA†VïøqØ:aö,b¼°²¸´¼ºí³;97U›8TFDÕóD¿- •€JH!ÌÒ±YSÝß–Ý Šˆ0a!"€À‘ MâØO/WœòXÆ@F12*K´ XêwB¶J»»zèI.ë}áÓ@¦¥›gf$[&!hűbŠBa%酯ĵ-iˆ†Ž)ÖûÁ ÃZ…H TúÉΕ¹Æäa5Œ¶P‰¨Ã'õÊwû§~Gýéû¬õ0ìf$JG` !„¤âï<§yõÝÝé±WoD(7_ì`ÿ‡ßïÅzòKŸÌÜû?mÅq咽,–Õ2ÔªÑ@HPƒF&“°'›]’|FÃÔä Õ€\_žœ˜ØZ™œí6¼(tÉvJxK“ÖCÎêw›g…0x°T²0 Ã0­ôÍ“M(M¹¸H“Ùë~.{ö\«ÃÐO‚2ûs~k7nÞ²Maf‘ßöŸ;úÚk ~y•J ‚#SÞŒµâꔹq’ÍÒ&Y'½Û0»*½y #†£æ&‹ÀÈJ@d޵ˆ½ADÒž]½ìi+‡-/‰åH•8i<8 )-1=v˜îÜ’Ík 0Ür§!~ó.gDjŽMØXS¾,›£œrÀ˜™TkÍÌź¶ìN;bÖ±©ÿGæþ¤‰È›F¶œQÀ{zÜ·hø¥Â€¡éœñv£Õ©Ç·Ö“‹HÕÂíúQ˨^©{c‡›Kê@±Þ 5Ç]y¬kJÇo·4ÇŠ³ /ÿî¯>5fø;w/}p}ic·¹[÷)šǵå›w–¶ûbAHÕÒVyj§Ž,g&T*¥…¨­…ßcÃ4€Ù6œ…Å%Œ-ž+ߌŠìzÍvûƒA{kc}OT€`F‹»F1$,ô×Öî5cçòÑ'Љ¥‡£ÿ4¶€4cšc•ŒSq˜cªÙª–Œ©jV2èÀ’6Ív$a ß茹֡Qpï0“)yš !듇]aI¨µŽ4k-,ðÑvÕÕ D¥F\ N¢S7 &I@‚„|ð“|§ë‡S´*è(&¯¨‚}ȉüãÎß–ÿó5­´Â_°$ß:H$‰åñ$ëõwë³å×W@Û¶…G¦6¿þV ñÐï<þìOoǬÄ÷ïÍ–ÊΫø ú;ÕLl`¦¶ëEЇº\Í©Y)ñqçÎBµ¶ÛžïÔÆAPcj}@‹¤½ àSy¹åUH`?g¡ÇÃÕW¯# )H·¨p õÍka6[ytb»ƒi×NxòSF{°eßôl’FùüÍWésÙoß…Ñ %}  ‘Ð<;·ú¬ÅlÍ÷T"BRË‹M^Ò—wè@),šš)ŽäX *fŠ»=$¿ÇhŒgoÜ„ :¾æ‘)>ñ1"Ú–9S= @W×íV$4HB×m4ÅÇV¨`¤Ö\ЭF ¦fYéd{ãy­bm‚2A`É¿eeân ˜#=˜'¿ÅþT“¡0}D FŸî£…㈦‡1©)!1Ü98Óîøwž?r£Ÿx;Á³+›Ñ (wîúbz|µ^˜[ #޼ÉZ3K€"¬wÙ˜þüoüƃcÄÚ_»úöË›;;Í^¯‡îøÂÁ c{íöíµ®¯H!IF {Îo5c£8Uщ‰ ¢N x‚Œ¦DË¡ö* ]®äà ¥ì‹dÞ‰'AV¡gØAË.fòH©ïÝØÙj·Ü²åï(h¦Ÿúø#Nøì)­¤+ûá€f)í1AR¾ZtgkyˆdêÐbvû}&° À¸2 B+Ff&f@Òz/Љ‘ ÕP›u¤”‡™9ö3F¯ÂøÖš¡•jû¾–ô‹"IBf~}¢{Ñ Í&škä(Bƒ…×™¼Íÿéß«}ýï+V ÷}ËŒˆšH¢"ÿ»Oh½ùNópéu%-#ã–=V¾õç×|e<óÛs›öƒz2'gêÜÌMæ²~eŒ{Š4{¾]ˆóãË>ê},ý¤MјLB{·g§*Û™êÚ@1ä„kWoöU"çD$ÄÙO@³«ËÓ6 %„ÿA»d¥Rìx‚H€À`‡æ­·.Aý3 ÈYÁËç¢Ý~W]C2È>tðV¦>¿õ?û{±~)ƒóØÙTåš{±£õP»ßø«G;rÜS³'c")l˜8P¤Q¤h¥)ôiŸÙW·”•uO ¼¸GsE¦éNX`ÀËc;F`ìšÛ]ñr¦’(þ4´ƒ¸p¤u@þ2—A©( …­¹îein£fV öÑã)iŽˆS±c ” Àö픑öê¤tcŸ®X€Ò¯5ùÍs…Ýn·ýBîj²ôQ»ss·7VðÀ•€Ž‰ÅÃãýf„¬|<ì ÀÁ¾ù±_ùÝsUÁì¯øÎåíÝÝV;ˆ 6·0å­Þº±¸ë©Ôÿ…‰ Yw{>ÏÏåD:´X „@Ö, ÇŽ°°Yr6Ú<Ô´³Ú ¶[ŠP )³/¾„ÑÀ¡k«qç BF^ü`{kW>|Ì\½ôÎ;‹»÷#— ç?õÂé#^4Ð ˜ˆ5¥"ÞT3—0¥ÐÊW쉉ªÅ€ôíL ¹QSí"°\Ùͺ[-Í:¥°'š{& F2pÃFw:ŸK3NA)`Ž‘¤ßŒmÉÆ;­(ÄûéCg;¢RâŸÒWÚãՙ᠛c–’x 7*Eßùn«ú;ó÷-ŸuºJzçR—’R²û/žŽyíõÍÃöÏV@¦mUÏ>d_ýqœû̯e.ÿᥘ͉oοáNf‹ƒÊDØFƒ¢A,«$2;^”’*yRI¦^ Ø»s¤–_Á‰ÒªÏÊC°¬l1¾­Qík¬Ï=©› oÂBdÄ­öìæ’M GI¥µ3¡~tÁâ¦SÌœ;¶ÙÔL€àþNÅ«7ag ƒäyó›þù³oýL¥1<0*ÉÊÄáˆoLî̸ո®@ñh„™ê`öy_žErýšÒÂÊB^¦QíÇÀà÷AžâÌäî…Ûù¨åÇÊKq´ÊA™"_;SÓ¿q#&Ð(Œ¢µÖÿÏ­d^wwûAq¾¦šÊ"Ú¯{Ь¢(ðL·»²nÌ#[‹½XǼ'zÚñ ©›£Sˆ÷ž¤=çË>` Œh‡Æˆíøñh{°^y»ƒÌRËpãh»~ܶ W»ƒÒ¡þVx ²Ó6u·2×ÈÊê™OÖPc´yíÍ뛫›»ƒ¶¯*Nםߨì)"JÂØ‰5 @af&·äl£YšÊYFòµ)/2¢¢aH ò´¼>gncmâÚõ¹òRUB¥ ­€bñ…H{Û:o+»çAØÏ¸±@Õó-Ó˜zi¾û³ï®z ºkWßYtr°3uêSŸ;u8lűÐ  hbÃC§\6fÆÊ¨ ôMWc˜Áއ…LŒHÖJµ»(€!Ú&•“ñ‰Eš–Ó ÛFL¬ŠY+Â\}`ÙBe ·ZŠRß÷h³ç D"!$º¿UmÜŸ æ-P (qv ÐõFÅwôßk;¿ü{=‘NöÙÃ5 IRýëÇêï Ž?ß$’9Çž:wš^ûë:Çcÿüyõƒÿ¼ÉqÂÇB­F÷ZGÜüv«0%{‘†Á b"BU5ü†œ‘½B#qmÈîò¡Zå®;™_Ô‡é8öÔÚv‡„âÉ3qgÀË?kÖr„ƒhnëg“™ä­Ñ̤d4&œ‹¯–²þnع¼;m?;±6@d}âËØóöí>YRN>´ò ó‹ÙïÜ =Kç0TIO1Ýë€öÊ“næUÅÑ>¥, ë!Ї×é^f¢ÒÌ*𩾀ã˜Ã^ϰ:J_ºAÆõÚa´OM˜œCÄ@šÌ<êjì¿e©†F²n„âÏZ) âõݘf&¹­,›ˆaè6+Ç¡–v¼½ywÊqkï´#„X†|éÎi¶è¨ AÐ:ÉäÞ§xÝ›âžh_§MÜÈGˆª•?Öoøw;z³|]ÿùí%{jÍ»œÙ\›1W˜Þ1 IÌÈLaýêå+777·ƒ~äN8!¶/_[¤—""¡‚ P¢Óº7gïŽÛÒJʰÈGåG(„@ÖÈ‘“Ó++Ó¹ oGñ٦΂ë=fåß~ŒuóÊúŒ»³[5ë, Ÿ—¸ôÁêàÉdzÁ?òšƒn«ùUÚ¸ñÆV×tQ3§>ñ«ÇæÌÝHi­ ™LFê$Zäkvf¶–„vÞÚòò„‘-›®QßÂB ÷v‡Jj"Í{…{ƒDÂ4ÈZ8`Û.!p¨b­LoÍ,o›ì"L„7+L|}{j d D”II¿ˆ÷›41®A+9Ìð£Öª?–ˈݯÕáWž|óÏû¨SÄEr ‘„”˜ýwÆjéõÆ‘àÕm´(cfjO ¿ù£n¨þ›cõÿøãXk :Ñ4j «wTÊÞf©w´ÅÝþ¸  ñÞÀgÅû7œÐL@#`çÞÉR~ÙÔ5 @gdΚ›Õp­AHŸ› »}c©mrIhÊY…­¥3×1(´vE¨À_¯uUÕô©ù[ ÏÅ+!ÈÏŸâu¯K4Ñ\8ò“{åOm}­C€†ù9”Ü×Áeh,1éJ©’û¨5´–î}L:eiÃGThšÖá¢=RÅ‘ÖLQÛ3¨§qJ¾]צã6 n åâ"£@ÌŠÙìÈ‹v¯•Š\w'ÿJXÚWªŽžž‚nlZò—æ7È ”Š»¼Uµîo4‹Šu-Ä(ñ7†²Á´ƒ§_R¸cšÐ7¼Ûi”ï~J'00Qúð!`Ô88ÙnuÏ–¯G¤€HïL¸ß¯ÐÌm_²îµŽŒM©‚د1Q·oÞXÜì´BmLÉ îÜ\j*‰QD”b:œ„Ò™(6 U•ÏšCn¶bT*áx"!ÓX¦ß¯ˆÖ­ êOO¶3e{¾²ÐüGgt¼}½u07ˆÛe»«BÁdB ï¹gŽÂ±X><ë ï·ÂæV7nkíƒK­rIÓÔ™g¾pz,ÓŽ# )#Y ¿jÒ° f$~#2ÓÒ=62…â„èF†aÜWþ#³Š›Îî¥ÞÁÁv‹f`Vß Ôd²ï±ö-‰ÀgèþOØö<Ê=Ù[/b:wƾkT0BpÞht×óÏ…·@#Ç;õÆ)##ou…CÞg¶Ro‚{úåcFê+ªß»³±Òpaîh¶}o©†1’H:þ]<äQR„\¡ðdÆ0 SШ]!2,Ó £X´m³“+¹MÌøƒã;”˪3å¾|TûÖîAç¶Ìv†ãl¥,ÂÐ@ÃxpÁûÑ÷¶ý¥õ6MÌO4 A»Ó‰3þæ¥ËM,ÁæÌ¹'>~¢`6c¥IãpH„2W)æfÆÊÔYÓ‘QV]GÊÐŒúã´æS€a¿ë¡J&Ó¼ßm;tHÓ8y¸äfMÖ*è©8ƒ›»íÝ;ýI ì‰ë=ÈL‰6eoÃi+$~B_…±)@ƒH«Uá­ìÚÓ9¹~Û¾úàç–ÿËúðn#&Ä#€Â@Qü×j¼ÿfÿôà•: )-wþé¹å¯_Ô‘ý…/Ù¯þÑ*Äì5ö¬±{»<™‰w¬1³2ð¸lgÊ}l`¸yOÕKÀÀÐ^?—‡^vr£GÒ*Š™;8¥ñd~ÝèõºòŠv2a8f)@µRú&rlWnul‹eme ãv˜)„¾×ºßÊ–jæ'ž¿ ÷»–t°üðÖß×+_»…B§“‘‡&Qvùƒû¥/6ÿ¢%@²’qd"ÊAŽM±·¤@çÆÊ™;› µf­G䵋r¡†ûÀä†%2 NæÒLRÖ‘â˜LÕôX(*©‹@º¢íEjŸs1Y3!I’–;¾0¯ÞðÅNœÐʲr«‡â3RûwcÕ(‚Ö„¦1¦ŒrÌTdÐÆf§s³üàòÖíÚ¤5~kg>JèCºÿ/mô‡Nê’ܧ5apöýÐ{î“ä ;“ `ý™êQDÛóî­ŸtÅÄÅ^ÌÙ›| 7?n1cD¨EÌc ÎòåVÈ I¤˜] &)„a’@‚„”ùL¹vàà±Ó*¥2" í'âÀ´Ö*Ö D6êl¾PÎ ÊNŒ –œ4‘ÜüÙ)­:׺óÑ{QÎÛ^ÆÈš+[ÓJJë?¹¡X#‚ÐJÇþ`g­­¬É©2ÝÞÀë‚0¾uçJ] «xôÙ'™DÝ×E²ë!·XÍÔ*àß  »Žù¥Îâm·¤]˜©/&Bêd€2D áèѲx°êº1k å)r„ŽH{»ÐØRs9¦in{=Ö£»gß:7á ó¡—áJ8]”©!Q³u¶Ôä” Á;ý³§ã¯½Ã{À­}E"«ûýÇYÝþ ÔÿÅ–m˜ÂÊz®zñoV#5ùÏjýû=Hðaœ27X ÐZc|Ÿ:†G5®Ç¨V¡*W9L ›CÔÀèšÑˆp4Äú.bànÖ)÷î«är"\x ÚÝ^x[Ý#VŒÄ}¹W(zm³*·”SUę̈ü–]Æ7X]Îç ͺÕܶ ËÌÎ~Ûàá7ªq¨$i4i$vÎÆ­’˜7¼ Ì @³†¤Kç¡û—GïCr’&ÍÌg‡AW*ÔZIS·ûdiÌnßðB×U?dÖL˜xQSæ gj ùgšÛ:I¬êˆ?þqÜ´Á†4„A顤÷~$ !qsµ×éõ'J‹»wNeKÕË"N{J{ü=”ÐhÞ9zÏyOî€#ú)O€)!5yýîi·Þß _îßK†ÃAëÁ~«u JÞ]OÙÇ,8 1ëA{· ´Dmdõε[!%6ˆL …¦”‚LÒv³ã³Ç~â‘Ç?9?f‡í°9 mõ¨6o_¿yÿþý¥«Wn^¿eëïïÃÕÜê™byvÜp,`4óY{+°Þ ò…LÖBàÖf§=Câð BÖ1'Úž0ì7·¶wf®fô{=¿ßðâXß¾~£.ˆ„3~ö…ÇÎXì{1 @’™‰L~v2¯™Ö7Å †nňHƒÅ†œêV!VÖôÕ3ë¤àÃáû¯Óy§abb!ŸÍ›hbÔΠź»Ó×ååGJwâ\ÍÙ»Y Ý™<¤ J!²¿UmÞtµÍŒ²å>¸´Sšá™•ÖØ³Æ\Ô^gsecÓ.E$P¨å» VP’@‰•URH®pjGyì‰g?w¨xóîÅ7~ò·÷“×n8‚3(†On7 D£8Ð:¨>pñ oן2¯¨±wðæ›ï]Û®ž 4J²¾åY™\¦àXR„÷·=5‘#Á¼Ô‚˜5¡d@)«Øk¬oöé#5åõ¼n¯õûñÒ·[–”›}òåsÇÐóBÍF©ìV'«‘oöeÏ×äg ¤·WÛ|¸5Ñv¦X»ñX#ÚêPe& “¬¹©l6#tWIƒ¢¾çd„ Ú~–6»çýõÁd&Ε/û,•HŠVÞKU'!$ZG?‹7U¥"RÝ–ÒA÷<9]ä•íCÓ«ÞG j6æ=Ú©!Áü_žƒxå ÿ\ûC–[8öLîÕo6czàŸOÞûÃˬX%€±ô&ÕiÂ$iÔÝØØ5ª¢Mä¼RѬn÷}Jœ´I’ùPq P/ÏN²gXö0 !g»yûªJgÏ‹ê=llØqéØÒýYT25礊JBéfÍ;7ÌÚ³·Öv¡bxœšÐÙÊæ–‘búØ7J_h~c—FÃ?­O!M{è<àË1i·8áÞÞÔ¬÷{œ¨@pO˜¦jršJ†°då„“0•@Gqka`·ÏÒrôµ-Y³3Hey”¦%¯ $aËÉêC&cý3ì‘”ÕÝF,Ĥì14òÖÖÝl f:„äáŽI  hnÖû".­~Œ×7§Ä\û¦¹~Gï/S*&Å'poçÏ{£BØÏžÁ½Ì/ýuЛkµ‚¥f®IÕæùÒÚÎQÛ0qµ ÞîbqìFÉdæÎ²ž,–Ž›+g³YK s íSBÊn=b­ˆ™y!hB ¤¢úîý¦;qz‚:½N_u۪߼ýá½ cUŽ>÷Ùã3~_ÔÊîÌx[ב›! 2q¨LZÚê{§¢E7mw¸ªR;vj‹ÑÃX˜†äÊ¡j&g#pľt0 ÛÁæN[eúëªÕxþNGÍNKÁÝ?Rj“@$Ù_:нSpÒ?D‚USTÊ´þÖöØùZkûÇz#¤Gk4%Éú¢Žï½Û>3øyÃÂÈäO=íüôÛ=Àç§ðþ\¢XiNz8’ô$Ó@ jep(‹ž9Æ-ßöâ0çHΔ·|V1#3jÀDM‡ ™5!ú‹”¸[ÉÞ‰!P˜·Ü©å-``Ƨ§Â¦'î72ŽÀ±£oÞ-ÆÀZ%¸a@­Hê6¤-íLùNâ>€^×ò¹+$yd²Û7òGËßé}ꃟD‚GŸ<¢bM˜ 4ÎÇÆÕáì´Œ>Œ5°­qˆ†MWç èDD›üCš¢x"›&\q«„ýAl»ööµ9ÕŽ"=dðcªËG F¦%kãgèÞ-§ß×AQiÔ#-þ E}uØ€¾éiÒÈL†CÈ™§ÓT©|,lœ(ïvëêã|“4j€pûcÍÝÜ4d*ˆÀÜk6l……ùqà„B0fÞ§µD) !H€;}ꉿôØ\çî›ßü£o¿öá-E€†Ä­““ȶ€äècÀ¸Ùõƒ¾ßóÃÁÜá·Þê)…ù…öÚæøá掅ÒꟉÀKwà ßýûÅvÇ™ªYHØš›’ÚGAñVà)!’‘8'R' bfµjoÞof§W Õî÷‚¸KAý£k›QÖ1uú“Ÿ9:[ÓcÜk´ X4âЦ»ëÔ=–'‹Z‹…ÌüÎ "«dÉË"’”†Ac åLÆDÔ‡Û‘Òoz%{°íK¬w!ÞÉŸ¾ã™c «:NËïá@€„‚„0N}‘¯ñ\q(¸‰ˆ@· eÑxe)>5sûkÇ®·9‰VÅa.+¢4ˆL2þñg”^yuð`û§mSH×)=ð”øöO¼?ñ[ò•ÿÒÒQ0TϤ¬„dÐö#¨7Gra {‚ý~P´JÎf “´ôHœ‚½õcÅØŸö7Q ”(YæØ%ŸQ3ZŸ+úýÞòmSâôÜ«ƒÚ2«0ð’4ºÜ¹;7æLÝh¦ßSrÕ LhˆÉöxx0ï!SO p<™&YYÀˆ¬ú|·ë-9q·¤AC/ÿÒüi4èͺoø7[ÕŒ“ÍÔï®®ÍYžM@Øö}¥¤0¤4M´rSçžüÔ3'ÄÊ»õ?~ýÊJ „‚PF c­DöxͶD2¸A&DQ˜œšœ®Ô&gNк?–5óñý\wýÈÄýnª[8-5GcÛï7Ôöí;÷VJ¥0V@vÑÅ^`°@«>ˆ´ÒÉŸ•ªB 4¡@³öë+ýÂÄ¡‚4/Œã ±sýfC8ääÁÓ'*6to²nw  ³6¢ÀûOö\4¯ø¥ìÁÅtμ—Å@RšÂ>6™Éæ òØS̶­8cÛ›-WïèõÙÊýN¡ª¬‰+]E©8u´ØHD´¾t ³4Y45"k¥šˆJdMÿg·ÂSOª¯ß?±¹ŒþÐÉ’>Á¤I2ÈøO‚^z58WÿEßÂÊäN?û~désú9`­h¸Ò×£ q‚¦KªCµÙ_ÈÀÀ¬¨ ¡.Y¨Ëƒ] ˜U‚´ÉiãôꂦwÚVêÀÎE¤¬šY€Dö Ö®n‹[¡e-¿©ŽÖ a@×7Lk“$¼.ÏVžÊã:%w5ÄÝÇâØk‡[èÓùÉ÷¯¾èÿÅ20Pq5Rù‰¤ˆP=Æ‹!(1SuW–5kÞ›‡¤VÜ#°iNŸ”RÚùS‘@DuEŠ ’ª«ÜLxaË—ÙðcÍ#©0'&"²ŒBeá¿;4‰Œ±Þ)þ =*ÍÆ…þ˜%¥û…U#Y‰P1!Xü­nKÿî܉{ý;g3ÕüÅ ÚS’¶Ç€ ‡yé$ F8H±ï†ÒÀ!sTp2xÀÔ½—ô˺]:ÒiyëÏoÆÈ èìƒg&$ (õƵm.Cu­­;;ž âù˜-Ûï” A&IaTÏ=ññ§Ä‹?ùËïÿì£-?L"®8VJ… „p玟}æLÎL.èdhg …ÒøÌìÌtÖ9ôØ3O?÷ÜÃ3‡ÏÏU*nÞtó S Lèî\hZ¡i™Õçgï^77Ç$qàº&qè1‰šI#’H~íDí¯4‘Ö •ߨÞõJcS¹¸Ýl·#ͽÕÖ¥¥Ø6™“•hkÉãNl+&Â8“ä,îŠÉ‰fNøõ¸\šùÀ‡á|YEJË…“U'ëB*/……F%«GíÝH+î5ô7Ãi[—Ý[~Ê«º5S¯„aœüœqo0SH¼AÇ1¸‘’$,øà£þ§]ÿíƒ|ôðLe ,$JôÕO™ñò‡'[¯yÍœ•{øñè›oú*ûë/Æù½µ¢§I'eÒÞ6B'ê\ ^oq!cñŽIALEEm·ňÉ20Å¿ŽfR„°í,ˆÀ𾫰GäÍÚíãØ§©çõäU²,°ŽZo¹"# kµÑ¶,#¹I åß̵ünÁ˜Y°`d$p^®ê( ZËmΊLQ|¸òðƒ¿‰aà5CÇ‘yô>&år#¦pzÌÆw4+›#<ÞˆiÏ<4¥_¥”2“;VL²’Q©8f$)£¦Ÿ­4/µ”éFÍ8ä= 82'F2À¥Ú‰qá[Z550‹zÝG)þ \¯[` {Rýd™ÖƒYÀrþÆZ̨wŸ¸×]?mÏnÅijÜÐÙ˜f¿$"Ðt$;\­%å]Zà1qE›"Gx4 Å!ƒˆUãx¡Ù«›ëßUà>ð??¯tbyc±/æ&¢-×õ7@)ôªå`˜¡™B:‡Î¿üÌqãþkßüÛ×n´|ÍB3SÄaÈÂ*,?ñü¯|þSŸ|þრ°Š20†›[‹wnܸµUì½ym§Ýé….dÊ“,9õÀùóÓɯ¡ït:¾¡äÜKÓ^ÛÉåÌ*†¯¿vag:&¤R¥¨• [JA@Œ(E’” Љ0ÄvvºP“ª×ª÷(ôúÛQ¤eÒRº³c´;ÐéH”T4Öïϖ׋L¹š¿Ì‚uòÙ‰á"¥´HNÊdr2{‘7Ð*×¼µäL‹µ~¬™Ã–zb³Ë³À3Õhÿ( Hbå óÝkÓ“"‰N`¥•#Ö£\{gµøÅê›à¾;}Aï âÓÀ$@/}•ôâ[»§õOû&ÛŽÈ?y¶÷­w•¦ff „¬€™wÚr¬DUÕ%t•Yà8k­£.‡3hdÒzyj†Ã‚¼­U¬Á®8Öµˆ=Çý¾§nX¦‰Î©àûWÚCÚ”FW`tçÎíha`5ôüpb•ÀÑÞ<~ïq2YJ‘/®¤( G1 J÷¹âʵ¾vìî ÞÏ©‡o¢@—ª•s9ý÷!j3 aå;!Iño“Ÿ2ºß*g9t$íåx$B¾t¯Ëí:f­™Õ]¡´êí> ëu}Ä8°¾<Ú{ðþp[öàmCèÅûW£ýYF{ôqlzKçNÞ±ŸþêË“¨5EË-˦ì¦1ípx+wû¾P"RÓH„`’ç±Y8ôâsOµ?üη~vu3LÒ)£XGlT{ê Ÿùô§_|ê„«ãÞÊý­ v´ªïxR+Aq½¹¶Ökmek?úæ»o¾úÚÅ{?ûþ;K½»ïíu¶­¤"$ªL–óùLíÅâßÿ¼­J'Æ-þ¢ß^œ$?ƒaX:yæX9#|m"/%Š8ä—jEìõv¶Csl¼ˆ^¯Õïe§d˜ŽdÐ,L>hDžbÍö´@Øö”iïd²xIÓn¡0íÝKX4Ããø¦…ÙÃãvÖÊ‹½0Ž´áŠÝ¥åÙ‰Î-kdàÝâ¡åAvL‹…mÅ{Ê.B †5÷ik‰g]fB`ÖJK³~Ϩt®Ý3>{èÒw SÇ>òYíI>‰‘$ âÅß2`éµÖ‰àõ®) ×-=qvð÷½¸òÛýoo+­”¦šã¾\É=£YrÃòNÿ£b»ØñPû*ŸE(Ò Ç R: Ó‘1Åìb´q¼¤ÔDÅ #ι™Úæ:“zè\Üëí;iBîÌÊ…Ü €¦`Ç&’"¥iq5ÚôïÍXKæ*ƒÖ„âɳÜï5ìmÄú† •£5ÿ[›rˆùæ=Ïð&ÙS oD ±q{å>ë}~=L¢ÓFþ?Y)“¯RÊ—ŽTÒ’œ£8&Adè_°o/Fl¹-/V#¢óHYŸÉS¹óÃúGvÐ(¥UènÅBÊdVËÍ;k ‘B\RfBúfGÊ2"Y»Ö˸&óÿº§µ7úÉÖ­×f)üÆÊ±aÆÃÿMzÄ4ÄáV#2A ûb§öq÷×± È oÌj üoþûa”™uØÝ€…Îbç1õâ_¿úÐÜôÊÜäáhLjƒÝÆXL‚©²`ãÔ„;Xùéåõ™¤R µ0ò•±sUwãB«¿²¥“cµB‚À4Aäô,m¹=Û‰¨úÀÖe˜œ—õ¾kZZ0~a¼XÅpP`bÎ䠎ؼÒ.xö¸½¼‡+3kUˆÿ´ïææÏ> ºÅÍV †8•nœ“7hN²8"¹½.̱Ò|Ô¯û^›Ê2IdÍŒÚ7êQ !Iãòãç/®e€ùK³ÝwÙ/,]EÀ œœ…DÈ…aGZÇLÌñ–šË:ÑÒ›Ÿ=ü¾Ï@Œ"øñï¾yµVÕ¥/ý—ˆÕpNËLD‚ìG þʬ›*oc¶ãµV™7Ü3'—¾·»}H4eµƒ¨Ób6 ÈBà§¾âÆ›oÕϯ6\ašféáêßþ@ñäoYûó÷PE<|§!ó˜ ‰R½ˆfŒß‘ŸË„‘ûÀÅmîoÞ1«,þÿ\ýç—$Ùu剞sî53×Ú=wåÒɰg™ÂBˆÀ”J$ÿ˜ðº‡[õøÄÂɤŠG"ˆèÛÏS 4ÄËgNŽe•Bb«3ãT¦ZcØ~0ˆèrzb©O$2IÓrr:žŒ[ìøî@³¯`€±(TÚùiZsP³Ft[Ï´šjÂÐcú‘Ò,†IO„(@Vá·ŒÅÁÉH°ž'p¼ˆÜÛ’Çãì>®x©õ÷ËLWoÎ4Ö =ªe Q‚^ùwqÞzçàþ°a2Ï>{¾ûåÛ}žøÝó;ÿï» ¾­†GQq8Äh0r)øþ±¨Ò‰|ÛGSÎ`#}ØSžà`¥6œªðC@Ó< ~<¶Ä¾ëGãÉT]ÓO—ü~[l4q4ó'îÖæÎ ï"ß‹€2#ŒÀ&2™3í=³¿Ùȧ…˜Þoƒb>ý’Pv‹*[ŠÒ–žÓßtÆØ¼ÛÐ(Œ”Ú–ЛâÎŽ#8WL&>l“V ‡Ä¡s„áÂ0-˜L+Vš)B˜¾á¹€ÉÄ>$zˇ¾°œ–熼âÿ‰¯‹B #R*^Ô÷ªFÝW€ŒfÔ:l!ø³dR,&Ã_5s0ÐZ!õ6h+UÜ?( òs÷;ˆà®>5µÞÛº™Ô\ m£²ì‡½#‹Ê“  'DbÃ,ÔP|0ÚÊÝ“@Üó?òS¿zMúdï®®=Ün;ƒ+Ó‡í14ÌG]¯0)T>ÑõLSØ™8 Ôõo|éÇk]Ò Oi-’ç?û ¿ý© Óâæ›_ÿ¿þê[ï?®¹(-S’´Š¹ôxÆ"fw ûýxÔ7}‡ãW¿Ù`¤Ø„·äK¾<Ýêœ(˜þ`e{:jí&#Ì{ƒ‰Á—¾µ²^ŸˆÉñ˜Ì öš'EÜDÕ2œƒÇ?úÚëmûÒ«ÏŸ,!(ß4„ òÊÄpÚ†¬!°¯š›ýb¹‰ dî·Yw›]—%1G29at1©›eÛjHÞëx¥m£\Šß 3&uH$)M;^L$RQ÷•ãø,<“uÔ¯¨õø¥öh­Eݽ¶Ú0&@Ì­×uèà§$Jƒ¬/»‹Ç ¡3\¨ˆt–ì““ÞãÔ‹øOï O­íOe  ¸DDÄgþ“¥«¯ž4ߨšBZÑÔ+çëÿø£Kº°øÿ_B­ý.H< gâ(ßmôónï”åq,ÑtýFÒÂϾã‡>ØÐ†Ù¦Œˆ¨¶§§”.© ò' Vy©N¿ñœzdÍ‹š$ffßîœ:>Œè²\?÷YH¿’öÐ<Ùøý„‘ÅŸ„xå„ÖƒXt¥«­±±õpÜ$ëÜ¥ýŠÆ!R•áɨ÷0”2yÁ<ìÃLÉ8Xbða¸1À`÷ÐDÂsc8C$KfJ³ùa¸‚òÈñÞvHÓq½YìOµWë,‰"2:9}‚?èU—X£°2r¯M’ÅŸ"!k (êhÄÄao®ƒàî üÕ?Ü^ÍXTüvfW[‚h°ôI±Ñêž'·7‡eP¸Fá“ ]` émÃbÄ@R¨™Âù1„L"®,þüsYÖdßX;èøÑÙt¿ôp-:ùΞé ÷ Ÿ´PÅ q ŒèÝ{T!Ð>ûžgÄÎÿôoýÎ'ζÞýÚþË×Þ[éj) ¤ Ð/&så´ Ä ¾3p¡àK¢A×ñNeþõ¾”¹Ìö¡€€å¤;þÒîiû³V#²4ãþÓýÚÒÆØ÷­uÓC3wî™.äãÚ¾Û·0¡‰ƒÕ¾ñ`üc/ŸšH*Cú$Ý!!)&hoŽ$ß·2fG&¢è7›º_÷H{Îjm–bJ­tóΘ°–šÝIfíE¦@F¤CJÌœÎÄÒQv\¿§ˆ=-;5+';Û^¼°Õöƒ/]ŸÛiå3Ê:ö¨í 20 LhDÊ¿[kÌ™C±Q_§œåæøIé#¶/e¿û]fÐ'q¹4vO‡"^bbAR ¾òù˜_{½5'ØŒ SF§®^ØÿÂOOÿñÜÍÿïi­Fô '4ðR^q•B´Cm›1Üí½kQ±[ñHͬÄ\Ô0,Z†(°ÐB5†ˆGaÆ3å™ÌpZî¹É$û›.Õqúð„ gç PF|âô˜Fõ–òjÌ,„0“j{€Äâψ€51›æp,“‚”SE¢]ëTwæÍ½láƒh @•Æ{ˆÐo|¼ÓÚ2NÈ0ð >B"T€¼ý¬Á @çÄt”~2ü3 W€CM¦ ¡|qî·þäh¿¾¼Ëînúùã™ú½û©“+õc¦Ì=tT¼ˆ$z¢8s2/Ée@a6ºmÝWþ©ŸûíŸ~*¾ýæßüÕ×ÞXl1šB‚gE,(3•N– 1d`¤×v|]HM'qfïõºfH•Ý%% !"ç.•˜ëëcέ†:Ó¢(Pÿ½Å®ŸýõWÿúû«zûƒyïÖá ‹HЉˆÛë:ž€ {7ôÏocæé/2€$„AˆÄrR X #6–Næ’QÐnJöZžvHݽFP00Fж•Ñ2bìï÷›ÚœJ«îޏÐC",SˆòL<–2´íº¶Ö¾b¢¶Ù*M6ךWËk ÁÈzï’Qõ',IÜr™@kd¦ùÊ•ÞÊ\>XÉ:½˜µ»eœMxû)ʧ×ÿ©Åj¶|+qâ~O*=¢@ ƒàÂu÷­ã‰Tc„f:÷ü¹Ê—5ÿ'³oÿ· úú‰*XŒ¸¸á«qª%à}sVjÎpCxÀñ˜©×UZs° ÇË!ŽŽT§wIº–XSÚõe"›ÝÔŸÐŽÝ“‹nÂ`:ýx)Å̾'H£å™ñª"õÎælÊõ1ziºvÐTÑ”ŒÍÈöØóZ¹uXµ¥¹à½»yëÍeoÌ:~¹³«‡¯(gÒÃ;abÞ‡%Üèx6öAsHÿgÁ¼–CF451™ ùÑà9:øó*ÝØ¶ûh8=o0â¢Åù10 –ÌÎä{o“j€@IÙ6™®ø3Ì."FˆDd (ˆ(ÔÛ‡¶³«ªwŽÞ*¥4è±Ìr ÷“Ïl··g ‰Ò­>ަ—áÛ¯‡Éß0ê‚‘‡ppÁgGÁÂ8l¢C!°þà7N[Ì6ìßxgï|±9_{¸=pÚ—àÀŸÁ”·åÙ¼jæÍD.i¼s'Cž u+ Ìœé·>ûÌdó½/ÿÍ7ÞÜl{h 1Ê¿ @F/¦ÊåŒd_÷Ò%ѨúÓéÞ÷ÍbjýÐD„l=[MLþrû'’^±{§Ý(ýÖÅÍ?¿­¢©ãû©âëÿòÁ›Ï3J˜}êÅÓÃu|—5³ êðö»?ü‰“;ÿÜű2! Q Aðébº˜Éº²ï»˜Ië:ŽÏv+TAd ˆú;½A§0èL¤g5¥YÒÄèÉB<—Êöû ØÓÊ‹Òn}O‹½ýo¨  uOöeyª¿å1kÒ(IC¦!wК—ˆB¹o&ZëΉ"Ü»± ÍÖ¿ôbW~¤Ï­ÔÐ ”]($ âS2áµÞ[œJþøÐÒˆež¹PýÛÅœùÝñwþ¯*k­†ihC­ˆ8!9k&ä`Ù·™A)·dÚà”ùØãpì ŽR6±‘›e]ìo ­ š‹åð´R}Ç}ÀQ!Å¥îO"¯X¬µë9ÂD—²Õj:‘Æbc:éûngòR|¯a˜9ˆNOMå5«>­9)ÍÒü£/áîÛÛ¹Lþzf¿ËB‹'®áaB€uÙ.6q|\.2+àa †HÍјl´ `f`+’™K:`ßÓ€l ggdzÁl”«Ÿ0ÜUù„BD‰äå(`í†iw@“ˆ¦‡JŽø<1¨ $!Ãl­5‡bf¿Zít]·/&7—O'ß™Šú‚§£K‚Ú^˜_ïï/$ŠÖbŸðI„ØÈ‘€oC*DØgGþŸQ^ÀÑ '蜴2/üÞ¯-H´·îoøÎvµ=~Üzo¹â!ñ§jõ|†K¦Lg³1Ã$õàÆ­=sÆ7 0š˜{ùç>v‰Ö¾ñÅúþrÕ)‚Ì“`CEÖƒÍü\*;™#"+׋rÕ2’t%à€æ×^o³‰±Þ2I`={t•’þí#F¦ !r°7ö«'ïýå#dCεçËÜïœh©¸nìySÏ<ûÒsS)Ùñ=Å$ìúÝ·ßz·;yòé§Æb€RÄPdŒe3…tœí}ß©V:*–I §ãe­Ýš=Óð‚6ÈèõšŽ*:³™Ü£¡ Ðb¦40u2›HG Àu=GVšÁê4;v.Ý©÷×f.×v‘42s+sz»™Íi<¶Ró!èHñç_TK…’VZ('A«µñãrÿ«³IïÝûØ@Fa<õA÷\kk8Ï#‰ÒÀòÿ6¡ì÷–JÙŠØÔµË;_zìò™?Ê¿ñ7‡¶ÿA7Æéáë1ÂÅ=)ffBííÆQY§­”Mš5ík=¢Î QÔ„X›-zÆØúÀG•Ìij¹¸öl»»kF%Z÷Œ=KÌÚÁM/Ë µyà# Rv퓦#·ÞÏ_šléHÖoÑ4°vj¢†4NäÞ88v©únßé·ïwÇ [‡¾ó5ƒ”;PCý›pÎçEeG »41ÞqC1àhmÈOp`8ED$@‹Nã2“ißÓ€ ¤ÝͪbÔÍïé'·ðzø'$¦aŒg¯ÐúC«ßÓ$(=¬ƒ=ñ‚Ž_ˆ0߀•R:LÖfM¨*îÀM nXÖ?%GÐ1½îõ¶ŸÎo5zçhº¶ª‡ ˆQûÅO‡ârFzb<†b…cBþO"BÍòìŸüÚ‚‰Îêý;wnÏŽsd?=öhÏ#4ëgr»Þ,© ¯PN&Á6ï5mÏhÎÄ•ˆNœsoýÃ?~íö^_“D:Ì# à¦ 2Š’å±h~<-ÁsH²cBŒ…#bþøžBeåÓëMÐÀ‹?S½%J÷V!´ž{€"n}rüÎ_¬1™¹èþYyË—^~ÖÎ@í¯ðÖ;+éì¥Wžær2âÛ¾«…† ^íá߽ߚ?}åLÚd() È#¡ÈgÒŤ @Í&¸‡=ßoµ:˜H¤Š­‡ë”T2ÞÄ‚w=¾p&é5Ud'>V6©`Ä iQžIGR&‚øŽ«•ÖWköÌÉNÕ]=wúñÀ×ÈÈ~}6¿×š3T¼tÏf­AJi¤>SH" ²0–J§€÷°ÛÁóf½™œ4û2îE’µŒaidŒžyîT6îíÄJs­ÍѾÕ0L2çÇ’ñ¤ðo PûJ+S7[}0+'çz•ÚG ½`åv®ÚM5ƒº¤ƒ#B!#Æ•ðZ! }!7á®òlžÞ{]ÿÜ M÷«º§ HŸ€Ç“…[Œ  ARbú¯jïÎÍâĶ¥0Hö¥ ·èâÙß)¼þ÷up‡Ä<4ÂÿDÄÉ€Ô?ÃNm6Ë:ž8èÊKˆÂ¡öô H¡'n4]h'Žƒ*¶vUÎ2ƒv`·aFÒ§ïoÍŸÒÌŽßÛ€x–d£nMÓR4ZºÙÙ-Møúxåíåô©ãr?›ÈJf!aÃÓ*L­û$ÿÓã¦N›ŽÝYtÆ’óg{û žÀrål(¤¾FæJÉ›œˆÖîsÀî¿ ðÂñ0!w´;C”ÑTy.™zó”¯IÃh.·ÁÄV×óƒ$6}˜ÃÀ D! +:]:Ë@·V£Ì$Œ”Ø ¢->¨ú ˜F€RZНì[i½å‚×síõóÅ»{ÏÛÍ¢0NÔ·4Ñ~ì¹õþÆL>^¸×B b¿)È$¡#\ø‘%0Œ&ÔÈ:ä‚¶6ÃÚ…ÒÆÂüá¼Éýå[ï.î4ýøl¹f;•FË|ÆÝÈ­AéÔa¿``‰?xk'jlÑxj×QÉÓ§Ó€@ìÝx´ç’t”•;z x¨K—£åŒ`„Á¡çVÔªhÎ:ÿxÍF¶Š±•¦Ô†DÌüÑIU[ŽÎf*;{ÆééZ–·¿²)A3)I'êâÄÁ† 碗”Æþ®Ç–p+Kïí»++“'¯|üå³óÊómå a¨ÎÖíï½{ÐúÙsó)ß·XH¤Äx>‘KE±¿'d³C¡VWNÞ_Š+æÁì¿ïæc¬ Y3RnþôÙx+ŸY­ˆà‰£"w&–NGÁñì²ïk±V³êYmöNFêͽè‹Ý]ÅÀ€º)ŸZogrŒ“›Uè…eX¿^¬¶Æ-å îDfyÂÜùvõÕW:–ØÚ•›˜työVää4 ’AÑßyžÝïÅ~²j 5óׯ6ÿæ±Ç×~7ýÚ_×H± ²¼†Š“À!£š0ˆ’²c˜G¼{A ºýãÀ¸<à ‘aÊTj¨¼ÐC<"GÂÞ|É“ãû¨L+ÖÜmBÂäôûÍ«efo ×b˜3µ€íîDi÷v2ñ«Ý™ÂÀ˜Þ|x¯2~"ß·ÀÓfÌëRZ3©‡óWk_íÂ`K8ýÁΚU,]Oïv!ôî‡_‰€öO—ðpGQo.›HüPqˆ@ !lGHœáð3tõ›Vjz:gáP[§|%¡)mqO±b¦àµ šk L$L‘-šRŠß÷¡¦‘É€HÎÝõÉÀ¾ø<‚7@)FÖ?­•f"<Ú+N6k´ýA×Ó½Êséϲ¶&óäÁ>oΜ[én>£»>âÿDý ϱQ â Ó–ªþGž  j3ÐÇ™ÿðû'ý•·o>ÜêBz2S}´²ÿœ¬øÍÓ'w;¦ ¦­Ë™±´õæ××é {<—Š^{ál–ÈFbÁ‡}õ$rtÈ#MH(déX$;]ˆÞk1nY1ÏF_g„/É}£ã)L”šˆÂD¿ó¬>|³r ö*ÅB¯{êlë‡û'×ó&è»·\­@ s"²w†ï±ög’œÄÁ#eƒÖdä­ßþÖ?ÜÛ×Ïü£çæE×ö”2rgýƒo½3°>òÒÙ)r£ÙÙD6”ÀPïI§ÉA 81¿ýÞa½žœ¶èÞ~m2â³@»VWQ³4#(6{§ˆ ‰LCÈòñD*i"hÛ³}$_£²Yk@„kv.¹»ÎÒÂÓ[­0cûpnúá`2Ê‘c·úIJ)Ž6ÒE Ê#áA¼·eÍFýïÜ›ûµöWÇꛎî1$/~н²Ø&ˆ%©ß{ü[7Ìs?Z2YfæÙ§+_ZòÔSÿþ_u€õ0]†–1†'ŠÃ!Ù,°¸‡ÓaØ‚j½3Ré°êŽ[lZp9X1i  C¦Ð~ý²á%"[}áÊR€ûb£+"–/ÿØ»ž¥¸ÞŠŠHŒÞTì•XÁ*Ý«9íÉ~rz¹Y½Ã³L~­S®§Í9þ÷ÜØ€^Ç/Dœ~g±v-Ty€ BÂÄ9½¥5cc‰÷šÁ ¨XF²Çpó9<’IŸÈ˜#T¢RŠJKÖ–;Ñh¿íö½€….ÒhD6D—²Lî]¯ÉÈ(e$3Øóúñyd×Eƒ†Ô~VJ1¢”¬ö¶V—i­Õó€÷½gí{ÍÛj™=ý¨¡¥³ýLv¯Ñ>-ÕÖûö‘D¿ðsÜzïñÉf·ÔjŒ—RÇ?\Þ.\ R­y]fED2=^™OÞrÁKœm啼ãØ:ˆÊ$!¥wpë{ÿ½VóÜÕW?s¥︶Ïh ¢õàÍzK§>ñò‰ÉøT1E‘Á«ijÙ†ˆÊšÉ£ÔÃw­ówïY&I3óüµ½¿yä•ߋ¾ö}Ô¡!>ËñˆÇ¶‰A'Ë!Ù‡sf dªàÐ1Á˜évMÍ9©óΡf ¤™‡Œs s‘@׬ðÇö¶ìã%°i‘-yëG™ë&ûîÀ{¨-’ñ£¡rþ·*f:eÆïøƒö‰H/ŸYöœ'³Œ¬îû¥ù˜Þ¸›~Q|cS0÷:±¤×Ñõr<÷rq­„ù&c³´Î[ÑGM&·8eÚw4hÍ4$¹„sÿaím¢DiŲ'JY‰Ã%§ö4$CÖWÉd§áÚ @3ð/ ÚHHa‰rò9‹Eõ}£×´R±dµ¢ p]ñ9`Ïc¸`­|$C™r{·¶¤æ²z¹­`K<ëÝÖW2QB|~­¢Óx¥ßÝÎÌÓK‡ø?øz0<ÀŸ”§†Ðôð‡ç@+¶,6Z"ã©ßýÃ3»ßý`i§Ã‰‰X{³ÎHDcÅj»:{ºíHsêÊGÏVœ•o40©»0¾0[”Ú¹ÿúû;ûþIE‚¥Wí ˜¥…´1®""¹©Xv"%@¨4…´-c‘mÛSPôM0+›Z'&· I ¼økÒãîBk™‹±Z2—ª¿·ÛS “LéÚ§˜™„ÌLd&7AE¯ìŒ¡|Ôqƒ^¥&wï¼ùoöŽ]á“WŠéîÀö™¤·î¾ù½‡Vùùùt"!ì÷Èí³Ä <Èœ¬>:+[ŽRŠä‰|"%`ÇQhOkEf»ÒòM¬ÚZ;ÉR»Õn¼ße˹¾{(iž®ï „HdáS°Í#0k_HWÅ›;ãÑýzýßœùÖkýést»G¶"ÎåÝÊ.’ôê¯,ÿDž¿q×$¬Â3×¾´âég~+ý_ì£ÒÀ÷ƒô' ÃèØ‘¤~”1ƒô‡€‰¸#§%ËBëÀìEÒ¥ýžò­' õpÅdej\É­.âì”Fö½E1|1¯Þ?qm¯ñX¦!SÈ29|Í3¢©Dn}_Õèúcî:Þ‚…,EoÉÙõ§&‘{ÕS§«ÿìÔä¶ýtÔîV{Å䉧•#ýkFDòf§µ»ªÀIÏÄco¹¨xä•ӣЬa®×(=Ð0ã¥ÙìÑQ¢= ‚HŠÎš›ŽUÛŽã“â0‘<´„/ Á’ù¼±ö(ê¶ID’Õ ²]ñyÔ®"C#9b¥’Ìš@Ø;ƒ]=9©7=ö·Nžª`³MîÇUvl¹Ï|È9¨nË$ 7CõÃfV–Ã_WÁð˜t Ò] ‰ˆ™æþÝï—Ü[zïÃŽ>e‹‘êVCÎtO]MÕ>WêŸy&»ü/_]yj£’-ëB+õü¥”a·,¸»#jÇÓŽHìu›ÛFãsƒÃ‘€Y0‰©R|l,+±µ¤ÙñeÌ‘ñ~“¼A:ÍÆ]McÑÅJ<ý§)çæDôNS–~&nTéÚ5³}¯()¹8pYiN©Î™Æ éÁÅAÁ[;ž§‡7Øx$UçÞ^ÿ׊.¼ðìG®ç#]ÛQ…0ØÝþàÆŠN¦¢HÐ`ðd‘¥”œ(Ý[ë3™§ÌFïXÕ9Ì @ŒÔ·®;plê+Ø<öÌGç#=ÄÌt*™2y ¶ö]$ÏÂJ§í›Þ¡‡Z÷[§ãõþ^ö…Ú‡À½úäìºÈ)³¸8`†L|tÁ«•L`—MÝMú«ñrÿõƒg>þá—[QÜn+O >yz …Aòâï'ü½×z—ÜÄ(H+{ñùÆ_® ôó¿ýæ?P±†álGÞó' žÈUb(ŽÆÁ®–JÀVì@Åt,–Øí¡ËaY΂å۾h©¬»%ÙYÐ$»›Ò2”¹0¸yv˜{¼¿‰F%¤¥A«zd¤sÝÁÁ~aÆÓ‡‡@…+ÄHÂÞSf£fèA÷LùÞÛ~Žºß‰Ä¶³·+žNlX†}-0!1F/)ã~´,•c‹{,.P‡ö0¢q2ŒLÁdšñ܉L:tI³ò5¢0¤êí81¬tm—}`}tÇ @a‰±üÓ´±juú cænÛ7±§ÅçÁwµiÒ0_U)¥™.û=L™í.ÜÛ:wÌÜ(ÎþÂøÁ½ül?Õt£X”kŽÔ{3§7û»§â%gI©0˜J}mÁ!>Ä!ÅXƒ4±’5ûÅ?¹áþã÷>\Úìq,oVv;> BAÚ.žèúýô©©9ñáwÿuµ×ËŸXªÏE"g¯ò[ööÛ©±Ø:ùÞÀœ–[o{ \O†Ý?£1v,‘žÊ[ˆì®š~—Íé8W}²³ÙÑ¥~´¼³ˆ„é?<! wš$£åéŠÃ-qýEkVÔ˜Nî;>#ÑTjí’qÓ&ïT‘cà<ÐŽæ°;=i "¿zç‡?úÑVºøüsÏ-$Ìžç{Z*!"¢{`DÍ â“B°RŸå»ÍF¶¨îtò»œeÊ·Óè4ºëé8*߈æ¹sRæ ÉxB2x¶7P¬}ÉÊTê]2Z-­|ÑïZ§ÝVoåÂ…}df ¿ñ­úÎÈO›Ò˜ùy³æå”ocDörR®~3ÿËýÿ¾Ã¯šÛU—@¡‹37àÚݱ!àôïýw.mÞ“I¦ž~®ú=8û;Ñïþc‡”â ¢‹ŸÈˆÄGâ€zG™a83󺹼†¨8}Ê“Nö÷X+æÑ>z$Ô&¢ižb.îÔñä”&ýËb#y¼²v¹ÀÊïÒrˈJ2J’à½UPF,ËmhwïdƉŒ­µäÓ ‹Û¶Vþ´;]šŒ¼¶"‚L\¡ú~.6°ëíbæÌ…ýªt„€Ò¿36*Þä„Õ»3Ü<Yê†ùâÂ0“ó¹8S‡Xû @ ýƒ¶áuú¶ËA ‡F …C¢ ³&æÎ)¤›Ul:Ä,È̉Þ0°¯ÄçÁ÷„)q4𙑄DdæþÖº,'Ýêj㩹Ác@´[×Ók÷§ÆÜtEJ1+>ú;—3[Uû¤ql{k¼Œ2øˆìr”8É#£ÔŠa"F(Oÿê>åþʇï=Úí@j̪Wš¨… DS¹Ôüñ´±ø¥wö}_ôŸ!k:®ækß¼‰¥æÁL¶Öñ]jÏ¥mu¬Õik¥qÄ• #€(9“‹•“„@õ v‡­”5ˆDj¶–3æ®eÊzuÎ}l‘0þÍK~åÝÉÕCf|¦è?HævÏ>-ßúŠulmÜÂôme3²™™Ù/—´ÑÏÍ7³lÞÐ½à‡¦áwN†¤ƒÃûÿú“ÛS3¯¾pmÆ Çõ…‘šH É8f"‘ˆRfÌLîtÝ«¿øîß7…ÒŠù ì kv~"”dˆ 7„C @u`MÈȃÎñ„Â\·¤:b´ÙWæärK±O¦´O€";Æ==]x³¶÷¾Y—!\i{ ÓÚll$Š¥k±½þ°n ŸèÏ΀³êH7“+$h£ÒCPx*‚'ƒÙI“‰MÍäÍ'Vê¾0…R¢ÙBßél¨ÂÝ!óP> @ Ë,.Ìi 7ÝqÁ$™uöû$}ÛŸ×>K“FW“VÌD†D­úõÍ¥ä±ÔÞ³^¹pÜ>ðÁ]÷7Ïyr¶¹¯E»ýj«VÉG&ï¶(°$†¹GÐoy|ÃA/ôÃÕ?0~ùÏž‰³¿ñÎG]•(ÇwZ¾Dd„0$óOM7fZïôØ'óê §Ò„¼ÿÕ]Û?–]µÊÖ®§Ð1N8‚5¨u=­u¸­Á§‰æ¢Ùñ¼€z³mx]Û'">&¼*Œ•œf/‡Ø›½·O¥xê·°óÃ͹ƒRœ•Öqvï)_iP0R¹ö4@Ãü7A$Ûßú‡ŸÔøêÜ©…’AˆzÅ3;mò.uÂìx¬µßòød§)ÄçýU8åG,ÉËÓË«W¼g‰2"¹qG-…·%]Ûw=Ö‘v½Æk6kf +Ï ÚÎÆ³'—Š€5÷_jì$ B©ÃÄ'ÆZ~‡—ªÀZ6 øÞƯñŸ?bÀÒú¨\nø¾0[L¹¥_‘½÷J¥×êšqëÒ«âë7úþÜçrßú»>©!ºðH5ÎC\8BÒÃö0`…úípª’³…@Õ)ç}N¸ÛI7ƒˆ{`³ ÀÀZ1Ñ0¨RPÏq$U440cÔwA”r·Ë“ ½®ÖMËé‰Þƒøûñø}í+‘IGòû;ÄÎÞô˜'ÒÀj`«®Œà^# îvéÚÁÿçûs?رµò~Qè“öæCg.úÔ…Õ& ЄD@\:í{B%æR±÷{ŠAs‚-F…Æ2eÙ BOH@CÍ@8dWi&aš¢yçƒÇL"g½;è£$ÕæÊ{÷r‘âù¹Ç í®™I6&Ò€U&q0[KóåM϶¨¿±Ï]3k–ö**›– ƒ†ÃÈãþ §£jÿ°‹†Ýt˜Ág@`·79Þk6*ŸÌ<Ð ,ªò¹íV*§Åt·ðWÒ‘°KE0»"ë›[ßøÄ©/¼ÉZ ;Ÿ6kÛ>÷ ‹gnF®Þ|ú³à¿óaáØkIf41û)óÞsøäç3ßþ›>²¯†¬ÜpÔ<õ¤ñ((jt{ðp&ŽÂ³†i>"9Ýé´©};ád’ûÅJÁ†¡¥†‰Áî^"‘–€JÈx[a9ùÁų;ÐK¾°"rlbm{|`0VÝ%Ÿ1“5Kïyšûµ3)…Àj€•FÔ4¢Õ”•¾z"úæ[Õ÷j¯¼Ø­zÍ…€Xë~Od”ï¯.e‹¯˜=I4$ô ^ÂèRC Ž'6WI…0óÑ»;šŽLÁf$515ç mhÙÆ ¥“جv¤í:Z!©°Ô` |ÕÎÍR麡iã¾Ùh”Šv•IÏŸ{B†Ï*ágk·^k*²ý»©«ÙZË_s/ŸÜ¨R³ûldoÙœ§è¶HBÉ\VìT?Ú¨íå˱½  ƒgûðtÿECn!(:ýŸ~} ¹òá·ïÕýød¦²ÙòIÈ0×Ë0ˆRW~ùïëùAÛWéxϘ=SH>üÊWnu”Û~©²ŸÑÅÕCöÆËf1¶£ØwÍY׈4œšËJ„;Ù®’Å©ôD!+Ñ]ínÓc!…AQ°31ºw»•¸°_ù°«}xù—°ñFsêÑ6DìO}÷'=ûÔqqwëÜñ˜Õö«{<¦Ý]×#TftÞvWYy/PßïûJù^™‡ñÃHÅ)<'Üd·‚ ̉)³Ss53 éÒØ»þV|þ…§ÊV±¬/­ö…›8ÖËhÌoœ¬úÊq|-™NõE.&ÉÀ`~¦)VK8~¯ÕìJYïkÔLF”?8žlµ+ô ï¨ f{~r§;i²,Ngz½´`­™õ ã øÞÔGÞúŠ­5²â«Eç¡=H‘+ú§Û§UØwÞIμY‰Z–=ñSÆwßìûÇÿ¤ðÍ/÷…ÖB›ØÑ¨nT!#°ZCGR’‘¥„õ„(¸3–o»BX1Ž©Ã Ó`”‚‘Y ²èfæ|D`í ƒ-·ž— ~ISÜ”ÓÙ¨sÙšåQvÑ%"™D¼¾ gÞbFÝÇ­eZVÚÜ~/‘Ö‹wzí½ñOŒU[HŒ@HÈ€~3:ž½ìMÆÎ_Ø«Ð(%pp¡@Mƒü¬e¼ÉGq ÈàQ+ÒˆÇfÇæ¤F5Ð’‚GX+Iý.ÄŒÆ^Ç´'A†»R=|½„0L£4qîìÆ›I)±Û#©_‰?c<ò]…*=’ v½Ö—ö¡«ìEãj¢Uó—§Oì7YÀAê)g¥4iʵ”ÅÓÕ õèÓ•½Óñ>P#6©Æp3â#?yíøí?˜'î•jþøî‰é•& wä•»¥(&V{.HQJTÎÂM þsvÜ”»»Ž¯ahÏb{‡Õa\hŽæ éc“9ÉàV0Qš?=nù¬ûŸÊÞ^ݽõöíº>ŸK!Œ×ö-9ÖÈ"š±E<çTÁgkàI³žMDâXŽ‚0@³R€"=ž×»Nªkf/èÀx ØtÖæ/ïU!3«ƒë^Ã(Ǫ‰0ø¾@vD{ñÅõOWþº¢tÞ>qoy¢ $H^YïŸ>=êÝy'yòæªA†HÎþTòë?iùs¿7ö¯_l£bÍÀjHˆ}oDÈG³>|b†LzxýËUŒ„ÀÊIŽ‘NÙµ¸›œÚk{ÊWÑ3 öPe(€Ne´«ƒ"Mw6O#ëW[—Â2­©È’Œ¡)/Ó^G)Dr· ¸]˜ÑŒS^m»'¬ÉÝ-=Ìö:Rowr*=pâ'k·êŒZlýà'Ké©r6ãjžëf¤r³x7w¢Ò4‚M1³7.¬A/‰åûJkåX¥ùªÃ¦ ´Bd@Òº[8Ñj÷vŸŸ\ô5²øÏtÒi`Pƒ¨Df°•ÅÈm$Ý?“úÂ]T9–Eìy±Üõ_ˆ-¨Êù3†Ú|Ë=³xOÂŒO~,÷ú;jì÷§¿÷¥ðH¢ŽøÄÝû‚\ÀᢙF’qà pQ#iYÇ5j¥²É–§e ]±µÏ€(ƒç t¬DFOKPàU’BêAÙéO3ª®µ¤´ŒäLÿVù¬ówÍKˆÙ¥8˜J'“ÍeDÐã ,q·dš¦ ƒýK…õÆÓìÛÝ»-?5·ßfÔ #yNö ³Îc©§Žm·Q ¢ðžŠFÛšôÔ„µµìˆ9Œ@ ·è¡*šÉ0c©Ųàƒ¨ÎÑ4›nׯT¬¹jkí;®fÔGùÚp´jŽŽg€÷z~ÓM€FÒ9´Ñô\W‹Ï¥¬ô¨UG`Õkv½NÕUºu¯p-zØuËJ+]¤ÞæµñÝý“éÔaµ ññå6Ø•`Ož°Æ×GÍ=yœ‡Cf…ÁˆTògþô…ÖrëáÎ@NŽu×k6‚@˜Ò0JÏ|öÜÚ×¾ú8È5ΜÿíÏÌ5·ßýÁÚÎÕã÷È€ØUw–æR†±Øš27&’݆fÕ=Å‘ÜN³‡è„µQÈŒÑFn!ÌÇj» =[kA¨D#‰˜‰7ûÀé‹ÕÄ–?}MW~©»]”Ö™ÏüS­_ú͹{_¬Ì8Ç=n"C?³ðxÆÂì}Ïf3r²š˜^©ƒäév½ÛÚÑŠ™öÑ!0ÔÀ#Ñ4 ÌGÆfŠR#.ÚP]Z\ZD3Ó'OÍE—¶•0‹ªZÝýpqµ¬DÎðu>1a%^ê<žßrH¢rd me˜ÉDö”íj¥|¥!2ýÔ ¯Ó¶ùaN.jÕžÏµÛ ÿùèºfbB<œ˜ÛVã„Ìà{dÑ£Äȥ׿ëòÈÈj¾jîî;ìBœÏè ÞÿIýÒâ}- 39ñSã?þnÛûíoýu0ôÿ裙„’÷pÞ=„„ÿÀ'<‚äò⤂øWÇ›ˆ±eì˜:a`ªÚ÷]­5€æ¡E‡2sD@ÍÉ20°rö™~n@9fÏVa™Fvfu}~nù_ŽOuÒjµOé\$÷¾l=?¥ØØ©›`ÜÒqgÁøêWöžz1{ØöÛ÷7ϽŒû^ˆá §M{Þf-—¾4Øõ‚ `}lRlj´Ç&£ð.ƒ‚á÷ei>Ÿ‹hšÑò\)ψN3*C9+3¹}RV{««…ëúZ3h}4[ÖˆÈR )bÅ…Iî[¨š ˜â™vÝèx>‹Ï NáûÏn³^³ízO)&‡{§¯À~ß½uêLq¥‡Øm]IVÖÛg­ä6&!YPU½pX[?•É›÷†ý í?¡å“‡ø[d@BI¬¢/üéÏfÐY{ûÃ;]£X²7÷zRHD”BJA¹?s~ñ¿¾ä‚Ç@Ùë¿ùË¥õ/um²Y¯>æ?ƒóxÏ»À…ýMå§d1±ßÖž[*û­wZJÔHæ‹ÈÄ\¤8ž–Èàlô@w$ÖJEbEË,ׄ,Ü€´è¦>NÝw·c«Rˆ¹_Ð_Üñ#¿}æÖßns2½ë]¦šQï?Ûë!Qß·}!Obo¾õXxƵVä­ž d× èQŒÍÐ2¶`‘±¬1[È `ópÏøýõûë2WL)íY‰fø½î‡¹÷Ê«Þ÷P"3"è¾uΫ 6Ÿ>óÀf@Ù\îš¹P¥ƒ^7&µÐP‰$÷fÌÿs´Òôãè_žðîyf„K<›Ð°qsÖÿ‰dƳ/-¼ÿC'ó{goþ÷]P¡ï5$fòPù2Ê!ŠÃQ­~â!zr|´)ÓÙðb%Äd(I­·|ß߃€6—ª³)ƶ ARÔR(×ë-3ZÑèTôè9ãesjÆã}Ô>%ÒÑìŽyñšÐšP9ŽšôèuÀÚ{û?6¶×õz‹ëWžWû1 £ BD»žHùgûp,¹p±rÈD„ÞSÑÈj“Å`¢©>òµ:Ž`f!5 XÈXtº+¨—Ç·g(¹Yež*r„ê—óŠHSµ×U¬õT(ã“32?5Àßîƒv_‘LŽçönOeî«ùØÆÉÝqa˜°{+æ,yRX¿2÷Ýw áãËÿu%ëD¹Ò~*õÀGEÕšTö½uÅFnz*u¿öl’brC¹AGªEh~a(¡ŽRÒˆ!šÏF&ËEpÛæ -„À.X3©oÿÅ7·ûOŸzæÌ´ßñXŽ­ók·–onœP›©š*fîÄÎ4ÛÈÂd™,È(!!²òü~·ç[Qƒý^³mcûîF**rW?}\UlBbЭ‰©N£Õy1óÀ .ÞÜ8g5>èžS„Ô´'\üÆ|VÃ+ŠOxrÀBÆ.Ï+P5J¾Ñ5À´’/]|ü¥ºcþá…ûÿ}K3úÄÐC~Ø 1ŒÂSÂÁlœŸ@|† ø¤}Ð¥$c¬&)†ïû®R¨A+E<›P"¿šayØHit3B ۯ좌Ù)çNürãû{†n>-¹ü¸…®aä“iûQòcÓ¬X“Iß–™B½–zpú«o$>úŒ¿åpå=ëçŽmõ!°€æ^Óf«s¸žÌçŸN.»ÈåcÐZñ¤79ob(Ò!tDŸUÃH$&rs€{ "Baãèµ\A– ZÍíúk»ò( „€("Æs—  å%Ñó|&b3mìõH@ß÷Y|~%WJ) ÓHìN¯ß©µ<­•ïi’í›—/ЖÝ~|õ¬^&ÃݾPªUÏæûÕqˆL>î©þÁÇÚÕ­±‰hþ¦T´AHpˆ" h©,Y§þà=/¸ùá[ï/·(>ß[íO#RöÕß8ýÎß}sÛ>M~ú>¦^ûÿ}ï4²F;:Û¬5sÏWw‘ ®}|o?7¹;}-梛Siï\íŸò 0Ùí6|f÷ˆ<„Fq&‘œ,Æ ÷Ûm†àLé…^}32¿í9¸w¢1¥¶2w;†Ÿ¹úú.ô³•ÿ²„Èž´§ü•…ãk€ØŸ{Ræ¡ßG´Ìñ¾9UÙ7}fãÁ}pÙ ìï|4öz‚¡Ï%YÈFfŠIªoJ·*1<{‰«Í+ýåoî¤^þøÇGŒuÎõQW&QŽÍ' cÞN-TzR˜ˆº˜•„ Jù>á Û󬼨¯t°½Ó\¹ÛLÄåÜG>’Ûï¹ H¾ß»œÚëîg^ЄÄ(”nLhbÔ® Èݘýü£/õØóƒ; £¯ÒFËö}yæSÄÛÍéƒ7%E’±ç®?þ»š›þãKKÿDZ7L‘ }€#)±GXl``Av`³Z¸g™ý (ÅˆŽø¶JJÈÖT@f°cÀ ƒVRü#Q¤^=JR ôc hÃN•#JÎm<:¾ððÇm;qr Xûv¢ÍßÉÿŒéûžmÀQÛßnç ¢û úïÝ{ê§æ+‡nÿÁÃKŸÂMDH@L<èe’^¯µº3—:söà@ ².JZì3Úc©»-ÅJ‡<Ôô„+‰„iÅ“Såqtv c´Èky† †YÛqz¾£µÌTC'’% YÊ_A€Å]«i ¢w+ÊU†@€@)AÛÇÙ«\ÖÚó#öÖ.×{~uéãó‡{ˆÍÚ3¹ÆÖÙtñUV<ÐX7_\ﮟI–üGÁŠi8Ì’à“’DÖÑŸù>kqëÁ»7–š*šõ:“! …)-„ì3¿~üÖ?|{Ç×Ziœýìï=_ûö~£Î AÛÇ¡ÓÙøéüm—´J§ÖΙΊG¥‰ê ÛíXÞ`>¢‰…S?tý Åg ‘ñ±¤@g£ƒ¦Ã2ì:™½7p÷.EªæÃNzÆÍ ^ëíHâ+Ÿ¼ù½žwíßvÿêv œÛi>½¯õÖ«Æ4Æ[6ÊI³qªuüÂaY‹”ã _ ¡üGÅ#8ŠY,$KSc’A¯vÍF€Àúøí.Éxqëµï}k.<ûÂÂbú@ ‘áï½íYÉ|¡^Ûõ" ‘+ BÔ¾ò}öèÝ«ËR¼·½Þµ{û÷V½œ‘¾øÉ“Üp|"Õ‹ºÚÞ¼¼°ÞÔ‰p꘲mmŠ0\÷§í˜÷ß7Y«@Žìqìψ ³+®ü¼¥û·ÒÅïì™(ŒÔÓ/|yË3þÝÕõÿº®ƒüÏ Íx”%ù„ n˜ ?ÄI â†JàajÕÑÔA øœÌ 0lψ±áîùž;TØ2Ò«Ð @$Ò— ¢)%XF`*ÀãD Y˜¸½qì­›4ŸŠû…ý=Ó…„™OØÉ+ÚW}»kIˆºh¿Ç,N;K>#ì½é¾ü‚±×Ãê ÷cgõ€mFH¨Z:'ì^}5Ÿ{wlìÏ—h­®¤7=Gõ» ‡³‘£Ùy¸"!#ÑòìDëU³Çi#x`´]u¤Œ8[=¶²•fÉaÆ6RȆ4gò5òí7|Šd¼}¤¶]¥Åxò` R"°îµûƒ¶ã+Ю R‘ñpãÊ|óЫ¸×f¶‘sNå z.ž¼›ŽâxK©Ý¹ùÝFý²˜ÞÜ.4ð㠠!@„¾ñâŸ}&½û?þ`ußµ ±ÎfÕ TšH i–^øÅS÷þþÛ›¾Ï¨¬ã?ó‡W¿ø7o¶4q˜§Æ®Xpk]ï{Y fÔõ«öv|Ë›hMÆ7ÇR½†‹ýØŒB«Ùr\Ÿ½P¡„dä’Éé¼…XÝfÕé) ö :siýw¬6WîW6´¸ž4*Öá}!àÔ/í}µ¦~¾ð_) ȘƒÕò™Ý 8‰sS&'–\ÍZ”J[çð¶Oêl»$äý¶§õP×: H†a =aöË͉ñvÖ=_°òظFoxˆÉ\³®K?ùáC³89‹xÍmNPõ‡wÞïLr2•óLŒÇBÜ Š{¥• "Þ,ggí 9iô›õ;ÝÝ»5+™{þEÓi³íäÅN}pð\aÍRÆ™…üðc²%@ˆÊæ‰É~ƒ•¯‡ò€ÈþK©ö¦k¶OÿJÆ÷`oܼÕÍ\zqÿËk¾ü…W¶þó(f5ò‚ޤáGÌX|ÒÔÁ#J%b£‡ŒàQö8""H‰Ù$í±ep¬>pµ¼û™`š’"û‘€,hkÓ“ Ô]õØçFgÒ7Ýg¬7 8±e%ïõ¥ ±|b¢”`íxщøÎ£Ò¾P¯¹öÊÒéWiß _ˆÁØIËõZë­éĹùŽ.œ!oÉnj2dž°v×Ãæf¸`”HfÄššœi€í¦eëlhݯ©"†Ò)µÓ"9p]ÅD:ˆãàp•(ˆ¤ŒM-h€wmÝÒ D"×?tI¸ŽòY|~”¥ª42 ‰@Ëïvë{µž§X;Zq(¢­^n¶ÜùôÄJ—isò‚³·kL¸Ëei–Wš`o¿¢s‘ÒÝ6ÑPé*>Cã ²§ÿø×§ÑY¿yãáNßÈúÛU%„DDÂ4%^øÌÉ_ùΖG µ9ÿÙwe÷Ÿþúf' ¡@´0˜,ÕÚ{gO/µPS//7ÏF¢ƒuWMNÔE!¹á œ0´£Ýmö}VḠEl¢/&û«žÑî)@$d‡Q\H¼¶iÌõâÓ½;A3ÀhÔoõL,ÖÿÊŽ?õ[Éo¼6ÐZ#3*mæ«ý+Ö=­A×®Õí1N×ö<ŒÈñýÉÌR  ©¨)77´§µ>"Zà6éPDZËT!šœ-Åp³"ú-¥”ÆÔŽwºŠŒ, „0…·ýá2û˜9vq.¥K­ið?äÖFç”wƒ'gò%[d2q!ƒl'í±VŒ$ UoµšÛ+ÆdÚn·»~§²¶±Xîúsóƒ¶ë´OLT:‡ñgUÕ6¢±ÈøuÎÏXMà<*޳yû:Jë°EH§ŽÓ¢Iÿò4wÖ é{q{Ͳ’'_ö¿üئO}úà/îiͬù‰ Ÿ¡£•†5#‡•ãëÁ`C Rt‚ØiDRJe– °T/ÑÞómíÒ á(u ‘_ÕÀÀÂtRP+»¿ÎdXñióøµþw6…`ÄÊ¥Œ—©í£ÒÞXÎJ‚Çí­ªt\ 7»çÆz[ÑT~©ƒÄï¾ï^{ÖØíûõ;ÞO:l‡G3{­HVÙÎÞa"?~É>ð®s±‹lÍç£* tø¦àÿ`„B@)£‘¹Â1 ÈûJØ"1 ðò›~Äp¼8Ô<Óq•ÇšQ ›)F g€éÜé) ü¦òZšˆ¢Ñæ/Èõ|Bñ¹àØÕ€Zi@<54Ø«¶úZk'\Þ ªƒÎ ÅZÃ^._{Üï©|£º™ŸMÕvf!‘»oc×~æ°³1Ÿ.Ð#7Ì2Fb¿ "Äé_ùƒ3ÒßzïíÅõe³°}à‘$D(P˜¹ú gVþñ[k(r᳿yiû«u£<ü¨ Xø0EõNç£ô0y\0–­]®èÈœ±SL¶kZôÒcŒ@´×ojfÅØ+ó3±t9A<Ø7¸aû@)ŸÈÍ]|ø–'¦ oÆy_EÒ—£šnÕ4E>5ùíE/ós?üzƒ…6 TӉʼnùÝ #ö¬K+å¤ï¸>ÉØ\[L­ìöÌÌ ö}pYkŽÎx¤ÕÀA¤¥•ÉÇ'Æ ’Ñ]´¹ßE¾§ñdéÝ%O‰x¾UW¤I’èï.ž?L]>=‹"ßT¾ÚµNný Îéã©D„˜:åë€>Ïz¡¶s°ï–âbÐïûÐ]Ú<ŒÆ’ó/^ð{Ýú|b¯³{îÔ~FæØÜDÞ®ˆPû¯¶Y©°€TׯÄSôØÎ|êôîWf7o'“5ñ1üÇ»¶xé—;qC³f}9,àÉêh 5DýP¸ÀçáÝÏCìKÔQúMPRj¢d •hTú^Ø3ÆòAm,ÄÔKš5J H €rÛ»`DÌèl÷Ãâùí×k¤#Î*‘Yì’Æd1ÊÀª/WZÈé#,Û—£wo$3E¹¨@+Јý»÷Ž}ìd³ê¹Ë«§_.¶ {v:Þm×w#éüÅô~ºlnùbPžˆtî°Eí?QÏ–'@ohåˆxLp{¿í[dë¸Y­Ú–ë+OkÌ6<Ü3 ’¦+žËöÞŒö; €$F­ZWKt<¥Pü‡ „S3¯QA¨¹ž_Ö*tøKoS?—¨ z‹gNZ˾luž¦FuãR.¹ ys7]®ŒÝlV.YS‡Ëu8êaD4ä^ýÏF¸sûûëuNN{{6  H!W~ñéÝüêš­@kcöÓ¿saóËsËAÐúH@F€ nn|Ю»ò°ˆ£§×6Ï%bæ}rãuÌ›®Öj”€XÅiú=d–¦&Æã¥rZ€»âP»ã1 IÊ!P—ßÛd‘-éräÁ@~옯`½'áÙ«o½aÇ~ùò‡{šy-›Ù¬\ÏÜÕ¨uçºMyÎT*¬HÌYÕSUpçjyï+[+`ÃMS(f`DJåÒ‰Ùb ëÂox„ Øõ8~­÷ãƒH'÷[ÁèŒH)·wvó¿·geÓÒ­t]µY¼Z»‘â÷j鱘,tÀ× ¨¸Õp…jxè6k5s<ÁƒfßÐ[«{˜ˆŒ¿p9³aÃZ¯úLa—øØå˜Rz«™iÔßü‰rãQ‡ªn)¬MûåóÊ´WÛ[-–qò“éþÐ~Åûë·= )]ÿö?\{‡P„#åËÈ _y´"ЧGi²@!;W ~>ÎBõe¬~͵U`m »† p Ä©kš£ÕÓV·Š–%S³k'fï¾×&HÜ\(¹¹Æ&hˆO¤Ùuô´<‘F?>¯~´è–2Ókû +Cí½ß{öe¹×õ*·¢¯ÌÔ;hAh§É*·³]-¥Mv³‚9ÒMÍ$?ð‚Ħp„£˜,!E";3Yf¦Î¦è»"’Ĉ̺ç`«x¬yØ7|×ót34üÉP“ a˜Å̹”ƒ±¦ Lˆ"­´YâÀSÅç8T Ô>¢0 ´#ÖöŽëºÊÕÚPá›GîfìYqÐï,=½0ØØ‹^ÒÛÚ™Œõa1Î3‡;àî^NïZÇÌÙ»Íp‰Ã H Š\ÿOŸNBíÍ›‹U/6ßÙki!ˆHHaˆÄµ_z®ù•¿[vµ-æ~þ®¬ýåîöµâ#õ|ðó+焬vë/do+ÔuãXbß>§ó+ OƒJ)Ùnô'“š€üj»¯Y1“"Œæ'ò¹‰L ¹¶/ì¦ë‘`•,œ}ð“¾0#g£N±¾ê£èØ Þ²N|äñ·:ê§^}üWš€ yf°3sª²§º¹“÷'MH¬;ÊôÄÞqëŽ-×E2ßu\¥C .ò(Fd@™Ë' “¥(ƒxÜ#¯É„„àj9=…Q¶÷Ü Z–hÅŽUgÆß:|ünÜòcâôé’íôž¼¸óàjâ½U#ìst=M^½©£ºék à·ªn>kt»-O¶n÷2Vîü³)ét*Ƴ~U&çyø¢"êýÖiKÜþÚ@Ïj0Ja@"‚ç’ÙKŠW–‹ÉýñGÖ±­Ô'sߣ¯.ý¦õ·¯»Äš†\át!Èøy4 ]…¡$f¤o§°•ö ÈL÷µ4±(‘l#¶vZìù @¡Î>Ô"¡qé‚f_# }@d—7û`H+;ñ u1óÎí10®å¸Œæ™÷¡²iFX)àT>Zýî!E&#åûí@œ«û÷o}zá ¦GË×_t<x€40ª¶—2:Nw+‘Ï—€Sk%Œ‰Bòî!+ Ìa>Ú>i AÒŠ§'³ XÛ³Z¾e$Œ0µÓVB»:šìU{ÄŽï*ªMCA°ÒÙôu“qÿÕI#aì÷IPßÓŒâsÊJ)$ð„!ˆ‘5£AK_)Ÿ(•XLä,Î]÷ª½úöõùú>èǧµê[t6í­Î«ô Gþ+•æö±\¸ïáHô (%‘¯gÿ·ßÈ1ï¾yóî¦ɧš[M a"¢ÂÂ8ù+¯ô¿ü·÷Ú—?ÿGO/þåß,y!éäè’à |ì§fZíÃä‹»š‰Éí½¼{0Ÿ‘ò¡-J噇]”1 Ù´|ÅŒ„É©©ÔX!M hoŒ^×ÕB x }ã\ôµ-A"y.zû„Øù™”Û58‚æFñåî—«pù×ZþY3†ÞiÄ'*öùØvŸu[eNU÷]eFgvÊÙ»]rž2âd¬úJ ¹VH0¤ÆeÀ€€ÂÌç#ã“9t•×î0 "ðµy~|ài/Ö ‚ÄG-Åx;¹ð¾cxœ9œæ–<ÿòÓ¥ÆÖ©3ÛÛ×,{‚Y ýÏZ10ÓìbªÕR€¤s¿fMçT£åJõøf+ŒÏÍÍîÕ×Μ«R Ù'PÕ,ìÝÌ8öÿf“}­ÃʤI×séIâ[ÉÂöé%:á™yãõâ÷¢_ú®V¬‡h_Ô x(f‚Ňâ€#×(ŽàÀÁ‰;¤k…øÌ`uNXcD¦³,¡%´š‡0Ð 4ëQø.# W4ûJiɆ qD@VîšG"bò·ÝKâûK*ôÔNÙ™Þ*«Â¹3ô#Ëé›"–ŸL~ôžÛs²¹¼¸§X3¾Õ~ñUcmÀµ÷ŸÞkÐ(I(»™ÊùÞzoʯmºÆ 4kú·Œi؆NQ ¨³T<ÓH[ £‹–‰HVžÒÊS䃆®«]Å*€)…»|h˜F¹tW6EÏf@”FRÕú$|[)`ñgÁJ}%$(!%‚ff¯­(­”Öjxz£F"gùØuoÏÙé½püaS;Û—òµ­éñôfkBeÄ’M‡ñ«ËÝÍëætkI¥žDˆÒW¥ßýSŒ­wß¹³Ò3óÙþNÓiHQdÎÿÚÏÚÿøçwZy>–î?]^ú¯·è¸ÑÞ'ä& èÎ\ªÞZ}yöCêå©•îÈîî¡5#+ã‰Ã¦ðü ÌÁ í(­"›¥ã±ÜX& ¸USªkû( ”P™ ÷~bÊÂIïáT¹8©¶vfjQŒzó±ï¬º'ÿïoß š‡æjÆXMž¯0À xb{Jbú‘Pd¶C3Û{ìN•5+ 3ß‘ÊÄüˆ$“ùDt¶cÀÝ òª>!jÖe/nØÕdäÄ~‘‚èVC”•{a}ŸÝ¥ÿû[½øµÌC>·Ô¼–Õ–4(|MI ^»ëH¨ØCê,Ièìõ2“V·Qó£Í7w­4ÉÂ3ÉÆú™­Âi<§"hôÆbø7ÕР^‰¥'Ž Ô8w·*µûÇŽÝüZ×.þÇä?}ÃÆ0iîèð~Bb/†@Ša4>ÑûV¡vzKGb–HH„X2Á𼨠Øï³¯U&Œ"DA’Àç”îôÒ¢ÁÛf¯€$Ú‘7ç»ÿ²KĬs窡KKäôE‹‘yðXJP9£ß|(”ïGŠ“û{>†GïáÛ³Ÿ>ÛØ÷œ{K×?Ê{>PÀ>G ÕôóV×éì3¹•¦–’©÷: :ì”i$ AiDãsùY €yÜe)"q#¨¡´r}‡ýD¬rà ×õŒ Á†6¼j–5•;Ï„jÜ a@±_qIxޝ5ˆ?EV”æ ä‹@à4¥‰ßë+í«¥Áˆ×Ûë— *özâba§gtšO[ûí³ùì(ÁøÞ¾R›× =ï¤Ðd˜'RýŽ{<#Z÷D©jDU6ýà^éwr_Í­™  (ùÍg ·|Þ©æ8^kõȘ•ÝSûZEÏ4ŠìÞÑÀpØ;¢¡Œu àh:+O%?ì’Ý&(µò̹ÒÍ¥ñ|§¢|’€Hºxx¡»È¨ŸªOZ‘÷kï½þZט32ÇmRJ¬3¢ÈLÊî ÑiyAz! ð *¦pÐêYøpÉLJãÄ ²1ŸŽ¤áȹ„ÈÑòWzÚSZ¯p@"”B@ù’bo±y|iEŠ)êÍ'o~»1(ýqù;_¶ÁW ^pÅ0$G½G[p£>ü $ffb¤a 5Dm‡¶;‚4°%¢EÙ‰ ˆ¶àxÃÊ`ÄÝCñ‰1Í>¶sBK)ƒ“©· ¦!b“Îý±…ÍU(«uJÇTT?.œ[`0×·-SÈÄŒx/ªÝu…çÊ©øÄbƒºƒ¬¿³óÜGÅnOï}0ö±‰ÃöPÝšÐn'2vG5Ì<$Nl×\=_ŒllrJ‚\ÈÄh‘ÄLqôMÔu!ÑJ™¡Êw)šì¸»Jù ùM,¥¦9~ìÜn{u‘¬|£î’áºJ3‹?C@ö4²çK‰@ èJ=n¦Ú˾Ò~¨úQˆ­ÊSåfÍYž¹dÄX¶™ÏSuÛÔ5‘8Æ/÷ß>d-Òñƒ"hbÍ#©òîñ¡ö¤É™7;¬Ú÷ÞþI§œ‹’)„D`ß×J#‘aZ0hwL«éz¬D0$&É èõj^1'nϧíL i¦Ìñ$½ºªô öþvÍwŒÈðò%D!(òÒ,ãf}vå¾Àt1#§½omªäoŸzãï» àhå7ôù=a‰ $ODCŽ7@ TGÉу¼°9ωÐ2|Hû&z¯çúЇ{À!’†¥ø¹4€GíDq(¬w´$#>SY;9u÷f=ôÄ@窡³òù k$qÐ1 ! “Û?ˆN”ª»Ä=‹ùè­`,n/œÕ›…Ÿ>xèyw×_x®w¨ŒQð;‘œßr0›Ð©Óþ.”Æ"ôŽVÌObëöH#žDû¡pÚ–F2øõ@ z>(+ç˜]Ïó™‘ bM39=?¥Y½^M ŠHºVS’¾ÖâÏAy Q¹dŠ 2]z%‘¸ÝV¬| #‚/€Ðƒg§*Íþ£gç»{ÚÝ››nÖ*Éùd{oœÒ´ìb ŸÝ¯\Œ–:+!O ¿ûË%T»wß}°Ù‹•ÍÚö… (¤”"’ýÈgf>üÛº>3•?õ{Ïïñ  `4pEÆb€ZùÓtØiýÞgzïÅÖf¹,bK}˜,í'S¼%½ÁlRK¿Úê)­}J+ÅËãI@€Þ–¢~߉ÈÚg)/©×v´‘)±™ÊaóqrwãB'zqÑûÄ•õ/n ]a8ÄÙÖáÙÄ=_hì]ëˆ"$wš¾HLïŒ>p|ç•ô¨ãúšêpé}tÃ"ŠT.“2àã†pêŠú Æ–îõDò^Õ UD‚ƬòáØø‡6èÜ$–aeO+ɺ·±z&îƒ@Úך+ñdTª1`DÔÌH(‰{•nªd º ×ìG-dЏ‚P%@ M^·]X $ˆ„4ð¹Ï Vʽ·QF)yº@ƒ;»ñ_½r÷/k‚õ0Õ'ìø¨¢"˜éH x´æ!ÓÂz8L=ù…Šb â4-‘—(: Üé³íûáÝn@Ñgã ]±ãD£fH` EdÅ'×÷.d~r¿DÉh—ŽyÑ(]¬‘ªhJk*þfmzŠ}QXi#»”ÎMïí*øœ44>8xæåèNOmÝÍüôø^'ÈÅ$&î9ÉÈ ŸŽŸ‰ï¦²Éwz TX Ñ0S…!£Ùé™#µ—ÅÀ1¤01 ’t¸ÓñÐ3sz·ãëù¾@Žm¢dÊìØÉ‚ûmò#,’Úï°”}¥4jñy$öňZK ݺ½N~k#“IèEí+?ˆ@¦!æKoYWåa¿¹ùì±Ê¾Ù;x&¹×Ùš™L¬ù%.î(½7?»^S ‘ñLJHL Ë¿ü;§¤j>¼yk¥iŒe»;-_ $„$J^þì™û_ø×_`éÕß¹õµ¿ºÕ#Íü,Cll°¶“ýìñV}îòÝt­ k—e¦»*S~§Ú¶•–S€f¥×ñ™•96Ë–²ê–°» åkV3'î¼ãQ®¼]Kž^Üo 6ý…˜IØ[¾ðÑΗï*Y>0i“æZìbc »©Ó«’¢ËÚ6Ž÷Œ©åCtbdÉ­}­‚ë‡ù¡*)˜¦£Ž–rVqºLÌöRßo»¦.ÅßÜôP$rÃpOD$#EEgUbgêóP]TŠAYf¿yìÖïká“ o¯F™é¢:ì+ B䆔Ñ^½ ¥ uÛ]™£ž'Gi$!k  ­[¾­QKyD@$ óÔ X/UE,†SSîûr·ú Ï<ü‹-T ÔQþë°‘ñþޏaE@£ñÿ086œ†ñÈ6Í£*4v`oÏ(-?—`T`¢tk®§A…%$“oIü’ÉìšënÒ2cp®ý–”f©pÇ»h|mÛÁQˆ¶/Äül1¬(ÖíKHÎõ_3žNúÒÏÇ8FO‹ljb±…!ï„™È[¹;þÑã­ݼ×|æª]ñüfd§/3Fo&æ³1;{àOFjËÌJs k€ ˜y¤+OLfq½]_°iFc"$é^WKßÌÈýº"×eO‘ CÞ ™f6s%©±û¡è¶%c»m-Ñö|,>O¬\×W$€QDT»ûÉ袞4Š‹5VAÞ }.DgoüšÚxÏ–m®òE·ÖØ¿œ…Ç9+R^jJûà%÷p;?=ò@@ä…ÿBT÷WÞ¿±rˆé²Þ®x@‚¥"ÈøÂÏ¿°ÿÅïn8žÈ¾ò;Ÿp¿ñçïtüðÑÃm±ƒ“ô`^T»/'ï°ÙÎ%µVœ¤üížQÌdbý h{2ŠˆF§Ó(ÐÉÉ\¢<–$ê=fè´=m (Ÿ‘¬«Þ7P`bL®é³I ²½ÑéI‰$äsâ_¾¯Ø ²ÎF馈Ed¶Y»\x8ÐZÕ®µúEÈîtœ‰ÖO4—„Ÿ™õSÔXóCøsÀJDÅ "S:OΔ“Œ°½)uK €¯ ëÊÁÛm² ;Á„H$¬¼Y»¶»Á(/TçAßò]Í$…QOÍ+O`24+"Éݯ¦ÎN²íùšD¸õqŒª]óËSºÙç¢èâPnÊZ²VD€Ù¥ºËì !H ÌüîqÛn×}°ŒÉsÑÛïg3ßúokèƒÖ£l˜'Ó}‚y\øep˜ýÃȨ0XŠ‘uQä£ÝÀˆ†W& %"@ˆDdÞ@ð¥º9P¾¯53#üi$!ÿÔà+^Ü2Œ°›FˆïpÌÌgnYgìïø¤Ãm 'vV™ VJEš:RÊ/ݿηâ15ÙYÑë' yóžÄÜ ¿ _ý°öêËPé¹ëŽ}$}à -ÝžŸ‰$Ên½ŸÈÏG#Ò|Ï’«uè’<âÖ1s¦x܀Ǡ #7¹®îuAúœŽ·š}Ów•ï3*\Q1ž¹lÕîcÀ (Œ¬8è¾bÐâóÈží{>‚$³Uw¿w¬¶™)DÅ=7Xâð°W 5ý­“§:µÞêäS‘G¾>(œêT" ™ÎÞ¥"«}îÙ¯îuW/G'»‹®œûÜ/fÙÛùðýÅ=/V6ööZHD"isî3Ÿò¾ôµG}fÅ™Ëô³ô½ÿüF ”b>€¹¤Ã1"…|áÊ…N£9~}¹¡4¶b—–{çŒxuC$f'ÙSÂO11ÉŠWShä&b¹‰‚…j«jø3ø’plîÆ[ YdÇvâì5m»±5¡òÓì“5žxûŸûìéð & øÃ,¬çNîí 6Ú鳋“Eï§ •c|[@üz/Íþ-gÀšýðÉ$B3lWÀV&ËÍ•%2/õ£ýNPÚÚ<>õÁ¢Çd:57D>I*f*»y;‰`Ÿ®ÍÆŽ«€„ó dÀZ1 Al°¿Ózp£¾põ\ΨÇ.Ù1hÔ:Íü¶“©¸!FJ"ÐJ8f=ô´Ï£ÐADBDÿ—gÔÞFI¬ì+ X~)5hÞÍ<{®ñßïé‘7|³Ÿô»„jUÂ/FÃPÒÀŽtÒ<ìFƒ‚0߉†'1#!ƒÕé “@ê·m[y Ìš_d0a¤ø/¢ÏX¤IRÇ åôL³`~X:¹ÿF5”å2ÕŸŽi­”ÏJšŽ5_ï\ŸÝûòÞ9¡§×ö%´"éüäîŽú9PáÙŒÿ̉JÍmßl}ìÂaa¨ ƒVº8 þ;µR<Æ|ЧÌ4T92 4‘™ò1Á¨T,[Á3£Ý®F€hÆ­6lÏ÷™5)@`Ä‚I‹'SWig•{fa¥Õª¯A‰Ïƒö<¥<%->DPƒVeÛ:}{÷Ž­l‡= ó[P# jì]›iTí‡WO÷WÉÝ?_j5×M¦w1Ëåà ÆÝ¹SÛKòämó7þpùàûw6z‘Éxu»ÏD…†ÀÒ/þ‚ñÕ/Üë’f½øGÿ6õ¯ÿÇë vä4âà‘cŽq“ltº?o´Ö?™¿á!ÃÁeXKÌéÒ£v|*yJªè³Œæ–êØœ˜(æ& Ib¤úš4ûmW"iðY ¸"%#ˆD:)Mæ±¾d`Õ œøJEž²RQ(Rñj“ ˜  42cû§o!æ¡—7Zša¤K!‚Vªë1ÓЈ«ï‹Þæí×7ô רÉJ^4 ҖäÆN'Œ¸IÀ4\ö±ÇR0Î×v”>œ@‘„ÀÏü 6Þ>Ù/åÜð6#GC÷CFgaˬ}´2/ …ƒÐCb!S™”@d0z}FyÜo“ÝÓ:ŠPË“…‹Œ¸±H™Ê êIå+…ÌâÏL©Ð2®åw¤MÔÝò÷7çáŽX´Ç>ñã_ŽbçšFaˆ±Y{¹º5èÝùÊâF]öú—íýÆî3¹ÔõY!§ô0Ú~±¼½[œµÞúG§÷n}vó~KT';kFBB")-)Ǿðù¿ÿ‹«mF­í#ò‡¥÷þ_?Ø'ˆ¥ÚC¯ØÈ‘„ U ñgÅМð]õæþš`…䇯ܯvÓtªãÄDÞt†,Ý©÷äÔ¼31ž·ž D{ß7š ‹È ,y÷zH$+Û{òÌ7À YáfšªŸ'óî=O±Ö‰«…™cÜ2ªCé'¥S­`Ú/~4%íìŠÅÆ™XßBï„HIù¨ák“ø¾Ep‹Câ(”‹™#i|¼-¦DÂÔ‰[wŠí1ÞóÐ$2o󦱬ó'îÔ?Þ}5õó(eLƒŒŒd’.Ÿÿ˧2Ÿš{d¥X€‡'þS9±¾$¾bmCFfó ˜^K÷92@hxä²’“okdcÖdÊ!ËIdõäÖrf{ëhå—›<$[|ÑfªÍ”+-.e?Y½pÚûÁr´yx,¬Ú#xîÄXùz±M*ìywn{®¾§šŸ˜¯m×Q“ $Ó.C¾×ê89âéG{ `â¥Á ˆ`YNî|uÊ ´¥»^$l™B™·ãϽˆÑÊæk5Íah´6ÌÒ ]…BØNæðÄ tg×®…(É-µêš¤ç`ñgFaĘ*²,kµv»Žg×7§JåúcZ)ÍF+6Êc”6Ú˜ZpA5­½—æWöUݺثգ3™pw óf9äz¥»·wÊýå«×ìÃÄX°¾@ ùC‹,r^ø½Ãþåû-meù'ÿ|öÓÿñïkŒF £ðéPѤa¤$Ùb©+‡åñv{ÿìâÃ.2¶ÎÛK©Ã&û¨•žNÕËÙvK™IF4²ÑîææŠöx%/±¹nŒ×@)…GdÜ{?Øg„üx°©óÿl¬Ý¶·±Ü.=óðæ¢•6øÙ†*¹Ó N˜ˆOj "k¦½õlávL_Ø… “_ódÙîÞZE5?&Ò¼¹¡”Ö©è8T¢D´ •Ìø\Uzw ôº€¡V,/¦>Ü f*½Q˜Vlõ”Ö «ã÷w%§Ží¥ð¦‰Œ@²ªs¥”+€Ñ¨¼NWÙDhϪµ [ÞÊ¿À…/œ±<¥‘$æñB:2,Ì 1±†ÖrȬí–—´NšD"´þ¤~ruÆñ¦å”æOoý¬nΜεoÞe6œ|ãz)ÎèˆM@±x 0¼ýGü–xZÊ€È$L¢¡á,éiÙ¬…ÈŽ.[À,Ðê7¼ˆ 1&~-™äüÌÌzÒÉ40¢Ñ­VQØ=žÞØ?žzg«“„Ç"£@ãÇs€l`§žrmrSê=~±øð'm »§Òf®¹*hã¥éú:%a0œWî~ìá%ØóÕƒŸCl… À:áä6÷M=—e÷xm› 3=‡l rÝÂññÖ¶°ãKIƶSy;þVuØIœÉ¶v}СÖJ3 ›xO‚„ҲǧŸxª­P •k5˜È´6ÌâÏtEÊp,mHZ ×õVsëpu¥·àLìtm'U¨LNÏ/Ì-9rôèñ£GŽ=vô}èìlz<<47é‘éTwú»åÉüdhbwKñîÄYùòipãÞ¦.LÒÖ¦B@H‚„ÀôÙß½ôø?þt+dehêwþëSKÿÛw×4hÖ#3<…ùÆižœàž.p³Ãov–P0sÔu¹~:“ÃxµieôV„jÎB`«ÝV“©âxÙf„èIÛøÝÈ€h$ùÐ⯮F„Vqz«Io¾¡–{ٽƢ=ïo-Vˆeï.{†YŽ¥,É(¤™Ì­äN´7Œ¿xdeÖ¼dç2Í“á=†Ü© ûFZ‚Gø‡ø¡fÈ—Jéù©0í,KÓ%!µÏ¥ó[µì’]ëÇ+ôQ°¸”e§q¾¶ŒÎíEñKRHÚ““×1ÍGkÒ¿g gv1Óîä»7?¼Y|ñù)Ñ×@4´ # 'ɚƑ8Aâî&”Ll×T¼!’Brù¿9¡ï¼Ÿžº%OóÏëüb-(ŸÏ~þ({-BeÀÀSjÇ„‡6”¼âÁÄÿ`ª“ô†ÐX†pXÇÖN”€ÌÌ”œÂ`жR¹,`Øîé@q<u$Ž¿hØp´"3–™˜‰Ýmæ][›ñÕà(¿Óè%@R r§/¸À zU8ŽE$¶o.^„_^õ€Ûá9–s÷ë=œÍL=l&¿Ûhi޽;Ë‹_œßlªöMx{a·o´t¦&P×ú·Má¬G8Ê&`f$'eÏ™N3ÒjSõ a,7•“qÀ‘Ö݈@»y³; ò#™x¸ ÇJŸ˜Ò€s¿Í  ËBf¯Ç$¡1hŒ4J)²í_L à 5Sšõ°pq5û¯{€€ÒñІéMl'_4EG{fÝc½ö9¢Ì×Ýû-|üÖ KkµôÀÏܽ}, ’@`÷ÐëG–ÿýçM0Néù¯Ì=þ‹÷Û€ ù×#FdQä%>IŒŽS_Œ^›¨L®~ð…×>h3"ñ½+g®]}ž¹ÝÝœ-´ÊcËv·>Meµ@%'UÎY €í.h–„Ĩ(wlýsO ä&u]ø2íÞ>Öt×£éðóm­HàI·„”GxKF¤­•sÕOÏ=oWFðÞiýø Ÿ¸ÝLEÁ¤í‹ &-ð’|úä;€¿0ZéŒÈå²È¬žòCLr3g-·æzýaê;$™‚Zù¥íÞ¼¥¨é§z¥R¦/œ’K Ù0¡h’»µu4sóo,}p§ $ôàÖíùç®|s÷ÎÝ]%fF "•ÍM-Œu€` 2 wÒ‡8ýÛOBmˆ…÷ŸžçäìF.‚JzÞ[1©Wóû?*_N{1šÊp}ã:ÞÐA“ÌÃ霉û Š×¾É Q[,g88 81 ŒK 6JjÚ÷[;Å ±TÎe¢¾4IhÒÈœÈIÒI#‰ i*90­ •ÓËdž˜Ñ!²‹yFÙ :ÐâšuØÞ¿ãfÿ½ϪÊoý¹';÷+oLþÖÿÔ†Á­ãaU¤Þ_úÖWþßùyg÷¯–ëŸýä3?~¿‰ZN›\*€­ãv”þÖá¿%p˜y§^¡)óÒ1Àд¢@¡Ž„ÖF…Žnª¯,å«b¥ B!ƒÉfP82ÏÈ0J[z«…(þ¥VlÐM3Âq-‰hÏ9}á|•Jy@¶³…|>—I9R k­¢HE*R È„#¬\Þ";[)"  ®¼ðêsi` ŒŽ¿Ž¹þæ~H’D’ökå-ù“¿º7`@È]ùã·{ßûw7ú‚Ùð; Ì¢$dR£`mFÐÑŒlõºoúKÌÀx¯m®žÈ¹fIL–›©Œ¿#"gŽP„¥ åª9ÕJG„½(6± èC ÿpË ¤ÆÇ7¬/½ä½¯t}²WÌî|¬Nž´6ißê‚2¬,ÃèþPGäzùHc €û¹ãk‡È†uw²+Ýi³z¦=tßóM’ÿx™>„;å\za| X´‚ö<YE˜~fðñž‘/춆ÑxŸND2;µ?S¾@pó 8ªúñ ÿO$KO‘kyäuê0cã ƒ‚PØiÊäã,žf7 ŒÑÌ`â Aг— °ñwÜ,‘“‰ï—-ô –°á^i~÷Ã¦âø‰c¤ôÌ[e…Ìì¹ \I¸=ç^ý ‹Àí)…“Þ#ÄЫLŒ·V52s‚8I¬°ÝK—^ßn›·ÇÞ(ïøÈ(˜Hç3üp? ²9ÉC'ë{,’­{ü¡ˆlW/Ï2Þ¿Ë ¥eÉœk¤ŒE^?²lJešíýP›ˆ53 A¶U?™7è]#¿ÍLÒqÓ¸ãо2€%ÈLì£`L{,Mbo…¡m™Á½Fä™È(cØ¥ VRÚ¹“gê71[ñ[8ý¶~Ø.®¤ff\{¥‹©AK¦Ä¥ ‰L2võa\¥b6Fyέ~pôÅÏ=´Â›—Õî¬9ò0PÅÚìü†6mM™âž@ŒÙÍI«;JÄ"‘Í:ÙB`K ô˜Øƒ¹Â­] `eÃ~D øUh`ÖÄ #7žËtH¬œß> ‹Ä”u,ËŒ†) r¹Pâ^«]ìLdòÿŸÜÅç~û7ï~p«‰DÆÿã¹ç_»¼zíaà©”SJ†‰ìž¹Í%kz\¡1¯Ü»î'ÉQtöwìð£'Gv—,cÕ )zx[‹.7~y9¿æO,i‚Ïx˜m(¡õ†}/WII @|Š#ÌOɇ“Ììd•B „ÈÊaà~6ì·Ç\d`QÊ4m)˜„!ýÔ 1ÍÀ€ŠQŽ a–R©nŠ„â ÖB #P/"OÆÙt^¹:L-fõõ&1³‚ý1ÂÛËd´ûQuò=ZÒÂ Ø s0øÕê¼uüß:Øü_¯üÞáïß÷‰˜P 6JÙù;a. ×Ô‰cÿæ¿ü¤kS8òN3 $;oIhRQ<ô+ð-'Þ¦\_‹¨_*:vèH²,ÃŒK÷‰Àu]€iŒ¨ ‚Ø›ù¯ LI„:@¸õøÁ½û·’ü 1&øóÖ·6w÷Ͷ×îùž¯•R]cT°Û_Ìö­nœv7>yÜ,×?þL‘6É/ˆ˜s3ç^}û‹Ï_¼t:g9¥/}í䣿øYYGâð·þhú'ÿöÝfrj økkßQVâp,„O§ir°®uwSÜdDÝ{u«y8—2ËÎx¦“Ëì7þX‘H± Y‹ƒµ…mŸÑ"ÒQ$¬Åùwoh·\ÚÜÇ?8ÓøP×ÛX:–7¸råÐÊ£bmäg:ІµIWÈqŠ+ "ÑLj-w¦±£“ ÷æ¤#·Êvíhÿ®mffÐ+:Ò&³>€?ÄÕ¬](§f¦Ç%£ºf°ß3 °fsºúþRÄ2]iïi޳IÑ@DhOýgîí!†ç·OAç.1Bjn2“ÎÚÀJ 2*eû!‰îþ¾3ö 7¾|~íGO¢K¯>7ÛòBÍ»ïÔ¦^?S(BËÍäŠÇæÐ˜ƒ”~@ oyk?í0pªx;ŠG\ý³ÉèÆg9ûFHn¶´ ÛŸv:'¾þÍçG+sé{1Óç©ä¯!³:þ‘žBààÁ€Å0ùkˆ®û‡ñÉ”ð…AàÄB"2¦d&ÿ¿»ÝÐÓŠAkN."²^:Ìl`Ðp3R¸N|Èyû)ÈØlÎ>{ÔfM%Dzþµy'[A×N!W”µïï32-ö³GÁ™¼Û•~èΔìJ‹8¬ŒGf/@¤Æ§;Ï|¡¸Ò 6î.|ÁÝ„›>b¥Ô|w6åèŸõ+…óóº1=®q„e»Å£ãU쬈ÎFËÊ–LÓÎJ`Pဈ¡H{žÐA„±ÿ!¾|JKÎNŸ¶˜wMÇGD´DQï…ÂBe4‹?c6ÈF­V_;HÆ@m•â¾YH­¹%gìqBE¡ßïù¾ç ú½^ ÚݰV;•êך³SѾãeO½|&A»š^mÏKõûB‡,Qæ'çŽ<÷æÛ_xíõà/´3PÚPå·þå±kÿïÖFIÑÀÈ‚GVñäM#â‚aœ¨apäVgeM…­æì³ö¡1;¶ǹºÞÉOõ8K[VDs W2± k»¨{MDÄ*B*\ÚøI›‹Óƒ'êÈïÛ77Ôfà:TïT‹‡ûß}ðLmJ8Ëûĵ%¦•d@‰„ÆR'ö'ª·<U{mÇ-ëìžUØ™so÷¹t¬“ÇÎ#2£Nf´ôT¼%¥ÆŠ¹ùÉì/CÔ Q€Ñ@Wš¿ê°¡Bf»Çiµ«HB U(î_nß#^ìÎSô²¹™ñt&À_HéqŠ=ô{ •Ù_-U[›f탿ßÌ¿þ…³Ôð€ƒ¥_Ýp¿ðü,l'•=“6<õîßÑA;›Ñ„Uµ²$é?9ÅfO|Þ'ÛÉžžàåÁÜ×íþ2š._·Ü Aµ¼¿†üzÕcOçÐü›üôG=&åáÏxœÂ±L`(Å`Ž÷À$‰EÚNå Áê÷ü(Іcþf|±ùÊ<C§neebcd6¤°Ò̪ûñv‹1–ä¢U9ûš F!2¤”–GúÕõ>f`mvGeû&‹ÉV57LRøsB3B4$øÑ§ã_9³¿6®ê·î´ˆ „\Ì‹­Ý°«rÖã‡cùù˵­D(Ž ¤å–WpÕiJØV®àïº;ÏœM7[–ñ|0J›ÄO%„–;7vœ€6žX½2¦&:{%ûfFñ§&ò²çé `Ÿ]±VÛm7[›Ýã«÷gÒÙî½®ßó¼Aà‡¡ ü ðý0 ÂÐßÞº`oloõÎgo´öçò»ûå<p°³Uªn³¦³èÿèýÇëõ6kÁJ8ŽI¿ðÕ“§NÎ/¾òßžÿìýΦF=ìŒG?×§_v®Ø7>´³†phD8›îô¶^/Ü6̆¡óÆjs± éazJt ©ZWDÓvü•º6`t€~3d[(e˜ŽLýdI:ã•Çíôïí¼ëÖ›ªú’{¯¶P0\kŸˆDÞêÜçŒIdm8Ä[B3—»—=Q[!¤Îá©AÐ-·Ëùû —϶+ln†¾a£xXÿÇ‘O¢PIgÇF¾?ˆú=%%„H•SŸ<êk‘lGɧ?r\$Ù4»{,}•‘/ J)ºÁJÈÊL!•w´¯ú`O¤Œ ›ýžªƒ·2>vlu×v¢Ç¿úqxæÍ/. %ÀÚµŸöϽxÌaÎ^˜4è)”;¢ªõj»]®(-ÈÐì ®XüÖ›Øx§}îѶ$Û~]b°TýÍü;ß×Â:÷á็XÇÀ †§éˆ 7>n§GA8™Bðè¥üŒžÿÒðI”a‘Bœáf+õêú6¢êLz(`v«]ªöl7Ø6&;¯º¥ ¬m²îBµÒ€¹ç6~Ö5(sóU>÷-üE$këÅ“[ª3COÞõô…ÑíW6© ©ºÑÄ“mŒ.@–ìTh†:¢a @È€"S,ÙÓ3ìÝÓ^w %ëÐÈËðÁvÄ”/Öšge2Œsh\yhgvü=Í<ž‘ù¨ÅZT§2Ù¼D }Õש´ñE>ì·›ë5Km)Ì–EîmgËMp˜SGü“~þ÷Üþ{kGî.“ÖÌoÈ®«ö^ª|ö×`ëÙÛýgö6ÍSSÛ¡(qráÈm(éã(© Ž0òK¾âY~Âf& Qµ( ’°-7' ¹Þïaf˜·ÁHB¼5ÎÈ¢Þɺ(]G´šTß8Ž‹®?o÷ 3¡°Æ½‘3ÆPËHÊÉwvR.úl¢FÁÆ gN 1û¨Eýp¢ZÈÞà„H0jŒbPÌãksožØ«y«øöÂN×aŸ"k¥CÚšKeÖöÂÕ•Éâé3Oš,â'DÚŽ=?±è0ðz_ïiᦳîÞ>L¦bW¼ò†P±æk=P*óW -Ëš? ÷ëQ™È\ºÞ0D~¨ ƒø3$ìw÷ÇæL.u[9}o¬:Þ\Õd`d‚xÊßȼÿIðü+öúÀ´ùìó¸Z̋ζ²Ôt5]kªvw%Už¾Ðß0ñ€Ä)ëÈØ"ðcß«¡6 ];ÇÛMªäd¼ ‹B…ò©N›Í@i6&F ° rdfúð¬¾Û;ÐÉföšF²ÅQü òÚìæ2Žõwyvp{Ðìíí.[G>Ú:êä<ìzƒÁÀ÷~õÃÈ÷‚0Cõ“¹ÕíîåìͶ}"+†QmvÉkùØ;1ÞîØßÝ4“—º¿úźg;8è§&­Ý›ûÐÍe'.½øê_ž£ÕA`Üp ËÎø@4ûÔkKÈ)Vúµ­M@àåÎÞƒPÜhWóƒŒÓíˆÁ¼s°x«mu<%%(c4rñ™G¿è Êâ\}Ï|3úxÐØŽœß¨ülãÈŒ…í{&m'/Û 2ÃHàa˜_"X%@šï¯ÏÝ÷˜tøÂv&©ÐÙŸÆ›ŠÆf´#Ö6t[SâgVp¼µJeglnÌbÔ÷òz PiÄSc?‰€RcÝ(Y|Ž$Qˆ@hçíÁ¥Õ-4ò™Æ#GЯqÕ-bè΋˜,áf²H5?22Ö(Èúb™±ÓO¹B¸X‡Ù‘³ àþǃȘDrî–æÞ(kÅ<8bayÝYÒ?C`6lÕîñ²šÚßÔ³ÓS÷[„ÌÃ9êèþbFïö½Ã¯O×áÖÝñ× »—æP>V¶.ÏÈÞ­¼êõÖ£‰ê3ùµž@´DÚ=Z0ÑC3h£r,Yôv*mF&zÁ)» BÃF'zBA˜¢ôì¤F}+ŠêZ‰é´³ÝE‰ƒx0³-nǶ‘Q÷jOVÆïl¼Žïo=¯È#2uׂ $" ä˜ DÚæR~§³9}*3øêki„`'HǯæòõVÃëÎ4eNŠ©ÜÅËò³ߪ5z½¾|å­C½¯>¾óѧ·oì„äŠÓ—_}ùµËÙœŽtŒ!ÀÑú‡ñ@þ= ‡N¶fd J•V{ûòÂuÐ ÷žo¬Ë,gÆ#iᘱ<ÊjŃ–oˆ´AÄCã?~ ÂdÆÝå~æg6î¨Ýž~óóOËù=¿ßDoìh}ÆÀM¥â—ò9€ ô‘ÔjñÄþ&07檻Ólº¥üÍå™~–:@Ç ‹œt¤ñ'ÒårzfºÄLõ;Æï†Œq°ƒ|¦óaݰ,¤·ÛC«ôЂHæ*»çzw â3­yÝ%]šÎg  îiÏèÐs3Ö ,õërÐ £R“Å9ÿ $q3àm¼w½{òµç¦ý‘nêÙi¼RÃá“ݪ ÚÛ]9›[µ2Ìîá¬î|¨æ¯5A¦2—^øì®º"ù½›Ð%¬ýÎÞéc”¬ãÚ8Z࡞w‡0² Ãx€KbÂÍP®<ÜŒ\5€0òg 8³ÜœÌ‚›Þ Nbb“¨6Ñùb‘‘©í¥\!Žv])¨_–!Qóv;Š-5ˆT)¼p@)î/¥0ãÄ­Ícy£°úY/F–褔ck¶é¹³ç–"4£fetdPèí«æ —£]¿s·ûê©nO–îƒ5Ìeè9­ÁæÖTñø±Í& [¤RÇ*3 쯈 l,)­ o3”™bÊŠ»ãÀBتE‘VÆ2$HH‘Ÿ<^6ÞU %9Üê e09E:ì¢å¤ÑóL} OÊ%EɃçW7Τ*å$ˆ=6I£ Œ„¼W¸$öíóóç§%j îÞ©äÐIXŠ¼Î–>±²éOJw.»ôÎ=¶1uêèýä‡×÷ûÊq¬`íÃ÷n<܃…‰Ã/éÊs)Œ"c†±¨IHÂxE¨Ô–ÁYnuÔw6#r;súQpËÛÝi Sîî _*1Æ.^jí£Þó˜Ð(CPxfù½>“,Œw6à™¯G¿0ƒm]øÝàýK'áCïðú*ÃàÂÞ§´ÌPFÅ1ðÑĺTˆâØnãlåšÖ á³[×8¡ï”îõ…º2(@xC‡*Ö¥yuq¬}v"W˜ŸrñQSxmM„¨†ÉÅk·lœñÁž7l¥q”v$¤mW÷Ž¥?QÂVc)÷q §Çœ|޼ ì3(¥ìŒÞ–s^¯Óf´›Så…äÕB®Ýzmîâ«G!‹¯Xq@ôhX¯,OUwݪwNå"± ½7³²Ê$S'¾´õýýðð Ô~·kÕ0è+7ýÛ;¨MrHŒBP€Ñà0#”Ÿ qžN€BFb‰ˆF«C ‚GÙŠ‰©ˆeÞ’¹ w:~hƒlLÌe”z;ÇhD+LYBÚˆÈÒèŒ3ÈšvŠôÝF”$¾ŠôXåëE ÐrÓµì!îê£"ê8)uÇ€1ÿ¿‰®{Œ‹™;¡íEc•™è±4üTòñPâË€Ô»½qöõâV/\{rê…Ôf¹j ¶"KŒe¶%æ¢í€¤ò´a4 C6 ,W"]µ Þv­Õ#‹»MŒLýèÄcu\Nßè 4ÈDDâ¿B¼}~ºÑ;/Q+¿æÙ­M1låuMcT?>ÿªiPßýÛGõFK¹—ï•ìòßÜØW~¯çu›¾²\᯾ÿ³«»Ò¡êÂs_~ã™EÃ!ƒaFIö$"šá#ã I` 䧃æÎ›óŸÐ|!X›ª’»\¬ Çk”ʹ¡ŽÙìô Õg" ŒûDù ˜Ë­ôíoÏ?\²–úúÍ ß}\ýrióþþys]‰Þ ¿•{Ë:2‰q(iYŒñ,rÚY)žØÞ7,:Çr­1樲³§Ãçýèk¡¯â›`$©FDt+SîÜÄú<5G¬/¦>ÞVhe+µŽYg‡b8"Dîxgjâ“Ô¸›)ãJÛ¬ºù4‚ø~Ê8^§˜óVgëË‘AÐ~:h/æžì##¢1H$hðäçíó/œ™;>mH1уäíµcéµÙlwžÁÀ5h˜=Ú¿Õ±l»ú5óW›AùÛUmn÷a  ¢¹°¾7Ç0jÅœH¸_4œè'ú „§0i„ÃìÉxq? òÄaÃŽaˆ f‰"(˜,ËÍg @ÐVO+ä+ED"õÅ£¡N²…´‘Ð[ '%J©Zyén>QÀ̈à–+¯Úï=AÛŒ̀¹">Z.fÊ7:¨‡‰ã ÖŽŒñlgI`ǞΔ¯w“ ?Q°òˆd ­_Ï|ét³5od_žl–¥\ke¢â¸m]õÚX‰üÎJ§<ýl~­/…c—Ìäh§Î; 4£ÄL±¶¥W¦Ó‰M 76Àø‘Ö`ÂØu!¤eWÇÏØ@ûwhÐG`K8%oG“Œe€ ‚øÓ¸Û1ì¤-—xµ)¥¿Ñ6{ÏSù¯´V'+|¬ˆ "Iq¶"ý“ÇŸ+ÃF××ÝŸ˜wëNQ!³Èo{:‹þ…ñ© ¬Ý„‘ɽñÅê§ÿñ-+—Ëä,#ßó½§Ûê/ÿâG·ë½’™9÷µ¯]X?2Æ0ƘdsûÈâ^‘c¦7F0OÍ~ÿ ­ƒ 0¨ž¹¥Oƒ[÷'Hg¬N¹`Q2]î¶Xµ|fÀ‘"þñO}@«8Ù^§³¿ƒ?Óµº?õ­G?寞YºioŸÊ}qX=Ú˜D÷cVc~‘É`’”@Œ€ÆµŽmíž-?ôÁá‹K… “îU¼%œ”®àë½HÅ©š d¶ aªZ°gÇòÌ´· f H3G"{ió“AY1µ~Ìö‰§¤8´0 ·ŠúÂÝpöT0…{»åJÞ-:Œª­=mBFÊ:n†¨9 U©îMNLÞò’f P:´óÉçÁ©ÃÕ8ñPÀ°Û`é}º76§ö ±_*·\X¶_l äØWfþò~„ÿìTß–› í… ŽÉ{ã“w)Á±’;¾Ù %Š$ï GF $áÛ“¬„apRï`AyP‘`´ mƒ2eçÀ´ü^d"ÃÆhƒD2ûÅ ƒȵȲ±ýDÓ(…ßÍ#ágZ#3‚È—¾P0†bµi ×I§ÀX9R?©Q5gn0 € Es)=û¨!Ã07YHÝŽ šø“S2î…ŸÌÄÍk{o¾Æ›ýÁíçŽXµ¶kœ‰l[^Îô;«•±“gu)mÏO§ Òr?ÜgÖŒÂÉe6ö¢”ŒRy®‹¬»ë ß‹4ƈ`&”¶œ;in=Áޝ%¹•v-"éûIVšø³ÑrÖrõ£&ÛTÛ?a#(àÖÔ©{cr|m›â6v݉’8;^kh€ÖKѓℿ©)ö€ÅäQ bƒgþøkÓÞôФSµÁ˜Zã9Ï6ˆ/È{kL7zßž‘ Ûgþè¥öþã#-Œöúín»º©rÉE¯×ïE"“n?xçgk=L§¦Ï¿ù›¦Ö†Åª ‰ ‡DH|¼ƒZgýð Þ}FèGÏßÁELõÂqeYiiÅG±ö”j÷"-$F–ÏßýyQV§›âô?îý<³]3'¿ðѧÙoU~ò‰®Ú»£‡õNa:+OŒf0Ð"µb7½D}¼±}1'D£ùÊ£‚˲çØ÷“>di}-PqNelЉe îø˜3=_b ú]uBb6¡q.x¶#–Åì^›‡;´d2³ùPÌvžíÞ$#.ì.€ý¤’uÒy@èhÅšÃô`9š»½{^?&0*•[ώϘ{±ÖžAK;ÇÇ^v˜ %8 %›AgÏ=l¯G˜$ ²G7òDFXìeíÉ“ãw~ÖW/cçyxa¢w¯ïvHÑó¿‚³+5HøœïG{|ˆ68Z6òÓ›C@ ` Ã>þÿ"ň ~ùéð0$!@º×ÉØ@~Çó½H³f’r_p€CmK)2Ö6‘œ¼0~X6*ÞE(3¥ìü›6JÁJÃJ;V¡jB" ßÝm™ÒDJÝ3¨cï/Am|Þ”ù¡‘ÍâxnüöI›á^s8¡HÊ#ˆkù/½ÌÛQyf ÅN˲ªǹ!†U–ÝÆzc¢|~z/˜žœ²Àà ûÈ ÉvÆû»m²œHWŠÒ*¥@›lö•Û ƒÖ&¦ŠYöäôI\j˜VH† 3Û5¶q t ·ÿŠG¯Ôw=/tö^átôH"wä•ú¢Sª¯¢fA$ˆDœ ‰æþé7'ÙP´öáÒ̸Sß®ïL»“Y%-ÂgOôß¹q7ùÔ¥Kâ—ÿá3_P¢ÞDB­¢n«Ý¨TºœqXéþ`0ˆ,‹Ú÷>úÕ“žMÏ>óêÛ'ò&ÙàÐ/—Éí°†‹¬)nï8s½‡†koxÛ3e²:Yi¤`²D|`˜( ºh´¶Äiç'ˆÏ<ö¬?œ¼nøâ[ðÁK/>ú^ÏNUvæ+·»¤*“­ÆÏA±1&VyQòŒÆ3ˆT±w²G÷¶l†ÝSö  :·³g¬Ký"÷ï d,za,Œå‹óÓ3nìÉ §ã†Ê©{÷LN1¨ûÃPÜÄ”Dd!bÊß?žùˆ1<7˜±i§ä:¹£ii…dÐjïlå§ÅÇøìF5‚6.m/Ô6Pij"IBë÷ç=ÖIóPÈ-÷jíÉÙAŸLÊ Ó=2›³Õ}O·-q°Ô9õOÌÿr—§OYw=ê!ÐÅåÚÉþŠþµí›ƒÊý@Î;ªéâÿÐ0Šñå!8¸À8K…)¹ûcÞ‰²7—D Z¾ï›ˆ!Ö‘ Ò[.€:RHAŒ@{k•E<(øÍüäÍŽB ¹çŽ3ý²Ó©Jz¿•G?_3Fާ‹7›f”sÍ#E3½¹árkºZ6·ÙŒæq¡ˆ P+ÑۧߘÝj†ýc™Tn7¤`,Ÿ½ßFã÷Ê"r“ §üBu ê;Øh6€–[Åç³)LÀf ŒãZãö½H3'1¨Ò¶ÆæŽ(„ݰiåÓë}àGF£añ¯Œ:¨Á€¹³9h÷)kÕ×OÚl" âÆsÙ'8/Êë}!¤–EdIË’Hª|ùO[ÊkkìïP®ì.o™®,»Ý;!"æéö®mÀùš—›d{óÏÕ±HÅÓxbEýö~ov:“"Ô^ËómÓ¸õã cgóG^zå•j*ð @Â$cnø2Ä3 0zÁ®u{¯‹†1²Ÿ½ '@6Dž…@”äñê Õñ4HeŒ¨ž¿õ‘O Š“»[Öâ·ýŸóN;|ù…ß+};úë% ³Ð—Ç77H ^ÜûNWéäÆ!À!Ë•‘’©™~ý\á¡/!Œ®ì—%£Ÿk?&sZ展ú11Þ ²]-¸“Sc‚)¼åàÌLFºùl5dÊ–ö[ Géöü#lk2Hÿx ‚ã…t¶íæ-¯cº& ‘´Ã­F£79ã_-]XkAŽ¢"îMTæ7ö(6ÓJ’ä\ø²Ö¨=c%Ç®=8’¹éO¥ùÊ^„RTÖ oA½ŽF]$;1ùRö?hÀyUÞo/D uÖ,/fîT¿žâ £/ë@ÙÉ4Š9†7ËAüËPD0â±zš–àÊ’dËrœlŠÛ~/ÐZÈ$¨ü† hÛ’"rnmHÛJ¹ˆÂé>žÌ ZùlñЫŽ6°´›F'U­ò]oØÚ¾##ž«d{÷Mœ‹ ¢œ!gêÆÀñÕáôô½f+G>FÅÙ$‰Æµ›öK—úûÝñCª4]ï™ÉŠÕYac½®]4­Þ®ž;]Äí¶¯µB²Ó…ÚJ$‘Y»Ù¢Œ¿¥P¢ : Â8I G:s‡gàV'h*©’½åaa¼@ñ§:Œ’8vH…»ý 9îÁñ\M:dŒ¸ÜÛ˜v ¹Ut„åH‰Ò²liÛVáåß{ÁQÞîòÒz¹”OÕa"פt+?gmUs@ ÞýtTýìbådŠÍþ/ú¨âM‚x‰$ Pƒ ¼†70V&¨}¿ï”ÁÞí·ê¶(?óÚK§ŽBÍ£w?¾0Ì%É"tfû½ù‹wºˆº}1X[Ì‘ÝËÄIÉ¡c8èô™@ip‰~ºÎ€Ùн¤þé¡»K\ëV¿ýäÇâ«'~õN€ÅÌÉ&J§­úz fU΄( ƒšpêcó{ ÿ„E v¼û¨gì á5Ï7±á{t‡sa¬”žŸ.0àî2…­ɰ`m2ç·®¶ ˼½ßÑ¥†¯RÒ{ØÖøçïÕ' Ƙ´Èd°3Ð= 2ZzûÝ Ú›>Üüäüâ-L™Â 3;6~σá¸%•sL!øžm oí%8µó÷Òãs ?ËuD´853*D‘½Ì|f·îææ²·~àÓÿªØÛÁ'<1s=wøFj$åħ!`#T$#}‚§*ù„J2Rz¸‚úÿK4ŒTL2Ç…ÔDVʵsY D¿çõ£†HC’•7,àÀØI µmÇ’©¡%ëwŠÅÜÍeËéâ[“!‚îm[Úéü„»qÿp €¬OC1(¥ËÌñ¼éC\‡FÖ™låNH¤á)*9R\íÐPâÎÝ»Í/å¶g¬A昽Gǽ×zQr–o^9[ÈuÖì†o “e25å°ÒZdK©ØŒ¦”ãd ÆäûJ33I$Eæðá1Cx= z†ˆ¤]tÖz(¡o±øS2‘F1„¶¡,ÛõÐä'l]?Œt1W.¸‡Æ!›¥Jqüð‰ÓçN^¸xîü¥ËçN/\úÊ 9mtàµBk"Wè®öç 9C¢?Vƒ<šÇ}fvæÎOš Ë)ùKZ˜ÄÏGB Àa4” {Ýf_ÛÙ´M ûƒPdtïÉÕÛ÷Œë–½þÊó m†ö0 x$FÉt0\Hõ:µ¯É»ha ž¹GÐX6aâ.6^_£`ʺöQÀlç'öwèØïÀ‡~Í ß<ù_¶OþÆÞwv´ «‹ãŸx2(LôÆ!¼Jf“°«‡ò5AD)MÌÌ©ÆÑÜ’*HØ‚Â`ªjÙâN'ÒÊÄœ…wJåB¶<;!èvÇò»Ì’˜•Q‡>y2§Æz Ö¡É(…U±Ïl®2äÏmÍ  (ë™}è:2ÈÂi·ÚJî?<;·òðRî1``¶ÍN¤î‡ÈLB Â=ù&0FÊ&–HÎXþ7¼-V0›å~RÈ… )­„ïÎÖïlt'ìîNHêÙJoÙ³z@ˆîÙÏ‚‹÷Û¬©†A>Åšx0>Ú޶€£œ8號:bñÄ>ÄðJT- 'c»¹`Øò¡˜cä-É‚fKŠßÈÕ=˶­¢0Dµ{Ñ\Þ’É•²ÇŸefÖô`/G©t¹ÈãY Ád¶¶$•JqØÄrg&Ø9R13µU‹;Õñjo™Gû⧸§Ée[õê­ñ—¢Òÿ ΕTz©Ž¬…ôKY¿7 bÜêÊÝH[¢]¡•}å¢2ˆ¢”‹7[FEÌÂMy}'èF ‹2³GKƒ«ä÷Œ1 í ®„Œ|¥ ”že šhø…:§s÷õääÂé~A>wB ™Ñš‰$ØW|£#VÀ@}š± "¥3³DLxጲi²E];wl`€}Á7Ùñ‹G"óáÝs¯ÒKwYêál$Þ1 ŽiñL@ÈìPˆTº$µñýAœr:\º—™šxv¢:~!|øä§-¥PÆÀx· €h´hß?=U[ýø™_.ƒ07_™{¼?©ËÂSc"$PE ‘àD÷æ€í*l ñfîqC·‚©—î­¥ßt~ò ƒjºÖã׎}øèò–†Åb]†@‚’üZ Ñd]9rÈA€³,^ù)stír¶SA ¹ÒŽÕqÃŒ¬l$†G¸™´¬ôÛ–ö#ˆtz[žF+#:]ƒ††p-…&–Ç3G¦³¸Ì!Ë}£˜\aPiP 4’Ý÷(oó?ÿÑ×ÿÃO¾Öù©f_”®Ÿ}¹ý×Z ýŒÙ/Øp¨1t±U£²ç9öÆàÙsöyÜ‚°x¹`4“"F»È¥þÚœ²´ÿç¾ó˜WL»¤ÀÀV¾Z 'VA(é|yX»ÑD1Ìžš3DÑĉ:`(ÖÇ´ŽDX?=‰ÐÐ UÇF“1á ž˜Ë¤3}_Ä À8n†ž èHÅ´GÏ,?qù®‘¹ây2ÌL]‡+•ÛçRØ·H¾t_ãîÎ1çõO÷ `ȬÙøÁ㦿²ÔÍî26÷åë+(™5F!QˆãÍElw@Xù¾öÛߨé¬û·W^ší„î©%Ô"Ó[ ƒÚJÖ ¬3Šâ©‡åâ ÆXþ~­RBF®‚Ra~¬eJ _Á’ÁX‚lá2r8ˆ¤ Én(bŽ)&âµ´†£ `ªž81SH9Þf*Û½~ëó~ùÝ_BðçÛ ¢ÿÿüó¿úî_ýÕ_ÿÍ÷þîï~tuzÒyüáO¾ÿƒw?¸óñ»ËYýhi‡JXÕ,ZYÏoò…Éç^ß½îèF³”Ëæoi” ãi3"!ÊÄ€‰úÝŽÙrÆö½A½«ŠÙàÑ/?©µ¦œ‰_yåÕÕJ±!L+Ãñhª\ï5ÞÈÜ4À@Aúòë ˆtÀ¢d?ÐAi´¦N^ÿ44`•gê›ÖÔï[?]ý•‰¿n½úúïôÀ]v÷ÎÁM uÂ˧äæ&+Fˆï6H$-Ûuœ—þäŸ( £td€¹L½ËQåØfIˆý-Hðs´³dBxŠ- rÕbiz"ÇÀk›è·†Ëg—n4¤Êak@Œ€ÿG:ŽÚ¦£ [ÎìÎV¯…Ò\ÉŠÒÐ T”`7¬u‰=oU?—ùØ{­¶o aÙîæTuaS‘ÎÅ7“@Êf6€(¶‘*X‡ »í^õðÃ_ìÏ+"pOMêþzÎÝ16[ê^mÓ¡s|õj1;û\#ó¬¸çiŸ!ºØ^;*V4sü†c"Ù‰{î˜E4Üúá¡g”ùw@j9éS‡ÇÅ(rg2Dˆl7-²9AÈÜé÷ÂÀhÃh4 °J¯[€ˆJK!âQ®ÕHÚ™ `ÄÕˉ½Téìa6ÈL·|+e»ÓEó¹{F¨sYSÞØ¡™*æšKqw"ËÀfú˜)Y·•ée&‹ô b¡ù3>Ö†D™!œÐ°zò™âÍk­¹ ÄÜçÈ l¤ê›©Ì SvõÚýi nÕ_òÈ‚P±­ÒÙ"!AÈ–kõùƒHƒ$¤U?–al=°ú]ÃL2›kîiÀЋÃRÄ¿¶…4 ©EÃzðƒÿñoo?øð§áýüÉÊz¿µzY]MµËŸû–E¶Ã˜ûöÿå„C»¿¸qg=r*bm­¶ÕŸßúð“õsôîWWË…p­QÞ'  8]ÜÂü!+ªÍÊñhPH‰@–HL^1ã¿r˜‘Yù­fÛs«ÇRƒf» ÕLí³Ÿßm¥r…o}íX¾šä߯D/¬)ræT½1uéI™Qo¿¬7¦Š#ÏIò§áV^¤,÷\øƒ-&‘›ä‡‘óõ Û×­½þâ7>¾Zúý{B+f²ÔÜæÂÄuûÅC^…Ôݸ–±,ËžúãoÑ&1.2:[Ø2õ³D. ð*Âa¿„Û*â„ÙdÛ'­ñé Vw|îz$lc„\¨|°±Ì›­ØÝaF˜xù‘äK {<ȹޱøXÒ ÈA€zôtÄ`8Õjô"Rm–r/ÉŸ^^m Ô¾Îf­îŠx|™ÿJ ÅÀYJΖ;;çÜ[ƒç^­îo–'v–6NgÆ'ªãh¶Zgà¥m^ýh§ü†óÞ? öÇò—wO¸õÃ>˜É‰[飷|4<Ì·êþixfÿZJ‚aƒxŒü2F|Àƒ¦úé”H%… D,];›uˆAô;žçÇ–aìU €µ”˜¹×w…大ʼg§2¹-œ †Åæšp¤œËKÏæèú¯úGIdï d7;‘®^ıd‰"U¬šÔ“;Û¶êŽWæ¶¶“¨Ãä Hˆ±$‘b'™Pû|nR¤÷–÷ŸL”8ÓØ’Æ00H5¨NŽçÒ,«Þ"&+=ÞzìY6†é‚ïñµÑ,¥£{ÈýPŽW¢rlò”Øx„­–f"_hí‡d{‘†äø7:Ô,0ˆbî¼öÁbëHê±Wv‚½Î›ö "Ï{mu}¡TØÞ J[¯ÿ_¯HnþáÝÕ¾3–ÙßõD{ñ o·äɲ¾pÅ~È›”«S@ì=zÿI¡4{ì¸xØö@jAH$ˆP&æñFñ–Ppàuk•.e-­ÖÀ)õï½µ¹Ìâ ÿèl©?ˆFc!$f2Qe¼×j¼U¼¦X„pénzž†îXŽª"EQ8=qò“ëž Ì§juYþû¯©;ý7ݯœýð'>…„žðÜ£ë›tqkì[¨8óŒXØÂ•Ò¶žÿ?V±Úܨ8Ö8‡æ­ìÑnšÄÒÀ?aJ np¤Ø$‘[ËM³ó“El>Q?¤¸>ãÔ©Þû-m°lï¶Gê«áV™­“t+Ž>oOXåù¨À,,ƨ ýÀD a­Õ7"è0w/ìzâÔýŒâ<ìɽé#¡ ºòZ觨¥Ý‚AêÝÌ]ØùŸ~~-wå¥\»`ïÖáh€96n¹M ÈFô–¬—Ç—ouúº³b—fÎZ(n1t ˆŠÏ¼ï=§%Íî‘Юx8oF3|‰“›†IKɽü§O;?h(¹ÂG R!»®“É»„Q»×¢4#’¬¾bÇ݉á2bm ¥“êôóœZÛOW*®Òg lÐwW9Dùñ´÷áÄ ìüýÎæô¤Îní8Úž­8{«YÇuŠaý²mMÞéZ^j>3þIÀdH†LpÐf1¼#ZÎÌóTcC­Oå1µÑ÷Ý ÉÎ¥8Ø¥"ËÊ•ë+¾méPƒ@²*Y €€šµÛ±ºÆò|eŒÄhɱñÓ´½Š}_‚ÊåZû‘E½ˆu\}‹×¶zÍnF² &Òå€\pú·±»pq{ÓDÐ\˜½Õ=ãTn7£ÿ‹\4{×?¹ö¸¡²i£îi:Ǫºë«,ïÿí¯¢ÓõËý¼@Üú«k7>ýèÃÏgžü$ÌÛtøÙ—_8Wž“"#)ˆ3Çy³"> ).X Úûž.¹Zy~+Âjxÿ³a:?ÿì›— a/2çC °YÐõFáÊÃ=d¨¿éÖg]„§‡Ì ÆD‘ UÈö3ýw¶X`f7xå•ÍÏ­­þì7~ucü[½ÿ¼Nư ­Rzç²¹F¢w¾9%ÝÇ5I³D[ á‘ùí¯ç"&†ÐW†‘ˆ™¡<6Nö,˜6ëzÑÎ’ù<ôµÑqÎ5³,Ž‹sc6 .ïÊ i eôôñ[wî˜WЙñàeD‚œl¶ñ\ý‘p¬KQžI’×Ç}Pˆ[Ý”=?bÍK'Îo}vaü! £uº 3Åò_•o‚(z"c@ë+§'>ù,ÚþèZîù㥙ýÖîÔxh#Ek­’ZÁÕÇO=øßv'ìfÇßíT³Ìö²Â¡uéVó…Í Lœµ¿6Õ#NÆfoÂÉ:bÈöSTˆÄ[¹˜ã,¤Yô)Ìr’*ˆÒHaË´[H VÝî@…†™M¼ ͉'PCÚi}[ÚéüdÛ+¡´vó4n»Õ !3Á“º•¢ìLŽv/døæG}}žl뾟 ‹SNîóØP2‹$²Îa(Ê»,k…ÙJô9þ ½ëøÒœ‘˜ˆ‘(œqíí}_Œ¥s¥µƒR-–rh"ªN4ºÒTÊ]ß];TŠ@€“+ºq{¡ÙDÒ•žOÜ ´L–;1qW¶T30š$åó[ ¶ØWÊÄrTñœûu]H'§­…^hÑYVy¯»ÿÜ̃¶1D¼Öß9š.çü™ãÿä[G Ú}°ÖP…ÙEǰ“É:–e‡rÖÅâdöÎV¯V9Ü=wf¬˜I 0’ˆPdЇ@D$È  íw:-.älö›ŠÜòµkkB”g.¿r!¯*¹!€p¬Ôì6^*Þ2€¿´4Q8¸=ãy±1ad‚HÃô±Ÿß Êjyß¶ÿ»Ün­…ÿÔ|/üùŸý\ƒd¹gŠ×CåONUòïB„ ÙKK Yýƶ2¤šífskw?„ ˆòã]5¸LÔê›ê¤°ðn]iNìZ@NµêLNWÁ¿¯¸7 $¡8çür'b‘Ë7šCÁˆ :ºïHHÛ«WÉÕW0¿mßk2 (½nCKÓ "¢¾ñÂÑ«;¯¸KÌDJAe5W–@¼ô÷-»‰ ²Ab ï{ÏÀßÖ ô÷>}\ž//xæ3.DƒL&høÖ„tÉžšlý§µ^]V£Æ ¹[Í¥¶ÙSÈhδ6މ;ŒdYM÷càÐ(Oéþôt~Àˆ 9¼6ã. ÞàÈF4TÛ±A &)ˆ@ØÙT6m# ÷»¾) ÌlP¸¹Wݸ!J²qÇqüäWòûH¹¼“Ž¡èÝ%iÛ²8žêÞ=>ƒõ¿ÙkëÞñI]ÚÞ“¹Üò6ƒaD`BB&Øž™à©ÚºôšG S+û¤ŸŒÜŒŸ‡;"ìP˜;ž^ï)Áøá ˆù9Ž])0Qš¶ÈMgÝÕ•’¾V L*äF¥1m •‚ž@$ÎôäaX®›fhÁΤvÛ(q Lbd’ÓÑóͶ=g%åejì¡=¦éµñG¥[A{þOöl©œùßëˆ_{^H4YãU¥QØÐ5fªNŸ¤Åábw°raÞŽjý#"{î–/5ÓõK/ÿý½¿œ?úÞ9>‘9tþô‹¶×Û]Ý«µMÈ–Qó0c³ 1¢1˜Hƒ`£¯ngS92½ €V&en_-zn¢òÂóµ'ÞY 4E{Ë/Íw7o<ô"\ã”Ñ"¹ÿu²LR’ •´Ž×ïûDè£]„‹3µûØ /ÿnã̹õ_†dŒadTáþ±ôÝçϾϸrbe¥V(µ‚aö·®€ÓlLal6–3ƒ6¥g6-mD%µœ¬<ÈÝ‹…›±SŬƽ¾|MÙ(ÖÅ©ÕeÀÊFpæ¤^>ÐË#‚VÑÀûY¡r4!Dô# «>ˆŠÉÁ÷ÿÓ}㻼¶ý¹ÐäxÝò……W[¿48ö{~%òIʤØßŸ)Ý_ƒBGŸ/½ðéo=ØÒ’÷jÓ¹‰Âv¯[ÔZKüxÇÑZkÚêïÓß¿x ž/ü42³·}äÓ•…t?yð™‡yfdo%ýDØa C̶ÀxbNÌBãpï; c…a =<ö™H"­ƒ ïgÙJ¹.&9ŒhŽç†ÃG!Р ?‹Šì“7Ýž±"1X'[XéŠcççY½¿õSÞ»ÇÐ~ñn@kûSΫ÷»$u’òÈ:ݘ+ȯ¯Ö3{¿üZñkk]-¤ÒÂ0ñ´±!)n "³ºñìŠ×§~u·”Ý¡ß*~ØP[=RRxÀ-ÞûX!E‡Æ G¤õr>Þ&EÆD¾•ë©Bà @`i ÍŠ X:¡2&~ùã/^ü÷N¿æ™l “„=g ‰ÇN>rñbQ”¦Æ*Å\!¹¹‘†Ð°VýúözT«Q÷Œ°¥Ž›Jç Z]xîùg/ld¯S\ÞÙ"ª­7ûûç³3õ':»k7~ö“ï>àÅÏ=áh!e4€ñ¤„€ ˆ±¤•ßkz.e4øÝvÜÖ¯ «8ÿüK§SQƒQ~ª×|òåâUF&/k+¶| ›‹2 ƒ@G“ó^e¹´¿-íoO]¯÷Zú·õ÷ÅïN|ïs6F2Û8‘®_n’ôO{%7u½c˜YJ"i¿ù"0ûÛûî¡éì`§ÞëÛ‹ @„TV €°¦ô±~×VÑg­‡âYOÏNXð° ^O£$Ô ô±ÉO–<”ÎX§¦ãèŠÀÃÔÄá „s­Ü‘ë¡Ä“ùXtõ±M:ddõî@ÈnŸb`Ü/;?O½²·,` l{{6·ÐÝu_~V×­ÌÀ£´ƒ XÜÝ;_ùù]ð5Ú^+M&æìßéUsŽô»d˜kíPƒiuªçyr‘`b±µ °|æ3:{·O˜ÏÁfhä8T£òJ>”ÓA&Ì ©™†@¬ŽýAR @i»n:+ÑßïuQïÞT_q’£‚†ëæ²pÜêØFª(´Ò…œˆƒ§÷6SÂqÊeÚ^?›¦G?î¶4RwvZ•×·mßžÈßi¸§ˆ$PtÓ‡DN<@èffÇê&NGM3éÀøãU­èd¥õNxæ¨ÎfzßM]™ZóQ;[Y¬ä 7ðv#×™ª4£¢^imBm˜QXs„Œ@Ì ãêžà ˆ4!!5~hFÜíùm…`ÙvAlöÑÒ¥ 0ƒ4eÇégr;6Õ DC)0µŽVêÍþôk¿WëGÆ·Þ¸òÃÊ73FÀæÒÍG¶sºÕUŒ„$7:ôö1è>ZóÏœ÷¶'ËvD„³³µó{/6×VjÝþÏ^ßhüÝ·å7î,KÌ®®šBîølùÅ3Ö ¶yµÕï3´ØŽ¥ohQ€TÀÄÀºÓÅL.•Òþ Ûi¥\±vÏ^Y,½òjëö»wš¾vºÇ¦wkï¼}ö:"?þ’ë[rxišde#2æ×ïE.y{B;Ù[wõú~ç¹cO>4‚1¤6Ï=Ü[ß†ÆæX­HÏl ¡$% ÷Û/hí 總ñh·±ªóGÆì4¦˜öB¥YÎÅKÒ L`ìlNs63¶jVßW‘ g÷ŸŒ”¥NCÆ.s“ßÙfcÂNqÏšj¢íI`@fÏ ´h+"¤ÎÀÒžb±Ôß~ëݱßhíZ‘müz©óé Õ¯·»'ÉóÆÉ³, 0õ·²Sƒë¨$ yò÷o•4³ºÝkïž,}ÎX‹ÛtÂåÖ‚S{ðÜ´Ñ¿o}Ö´òF©M®™äýޝi3ÚÚ%o®Š:9N;fÆX ‰ÔŒx|±gF¤`0d˜´1‚9Ô` ,d@&±2¤€…Ñ1Q&T‘!ÇE×È †ý²8æ—$0ŠÞvÎB+_ýµ£ôßkø}aÂî{'%¾þHãæNÙycÕ°:[…þrþŒzþáµ\ëα©/>Ø0‚˜ÄdÄ£AM†MÿÁ‘Jê¯÷Þ¸4ÐcöÿþÂWþè®GD$í¬m£aPn«„3¹#c×B߀a¤ÐEÝÝ­R¬ÈN™0•ÉôòcƒÀ„Hd—И¾@Àd`ŠÑ­ þ”dy²šu ´ç£ÍloŒI„ÝÏî\½sxö£‡¾çéÁþÅÓgËŒêÖ/—Wr¼Ún ¤²Ëv]'Ź·¾RøÉíÏ>»ñrª›5ïýç;Õf÷í´¶&οöÅ·/Ož8ZjZÕ"ÝïÍ`"„Û÷®ÿÝ÷îìDç¿ôÚ…Ó“ ‰I "Åq2H@‚@ !‘€ ßèN1g‡~7ð\;úä§[¢”›ãË‹Øu”Ÿiwë¯fobNUŽW”²@ €êOν;+m4úSwÕÛð-ïÖ7³ß½Ž¬ubA!‰óÌá¥mÁæÜÆac]‹TlŒ”VþÍ·°¹9±Pûŵm¥¥Å¨Û=é¢H:v@@”ƒ=^Ä<ŸkJC«TÍ–'\ZÙG¯«‰Y<}êÖk2Ø buÌAÝ8bi"Çú ·XjŸë­¸¥Ã@Ð]Ýõ£>ÚÆrÚû=”QGÑZ>uáÉS‡÷…:äâ¾ÏO¦Ïâ®,Z"ã³4í®Ï/Þÿ+͉è¶x€ížã[³ léÚ XÝîr„,ä áÌ+ûpÔéóã#‹/ìnçå$iØèãSC &£cÒÅ&LxÆ„'iß@0JˆÕ@H1yHŽ áIÞ² @NZ¦ ¶@îo·”jÆ5 7÷R:‘çaRY¡ZÏdócÙNÎíîU0qãªWHÚ"=–Š–² „Ÿü2jF„ ÃCÓº´¾‘äæœÒƒ†.¢ãT³óœ°æ¯œNuº·Hcò­¡LÜß “Ý{‰R×o6çŠÚŠ>¼~á ¯E¶öᩲˆK2í{½¾H§¦2kk}Ë<Í‚‘YV¶@ b]DàZˆ”dé”*‡*ôýÀkFn©½ù¡Ö€† Yü+tDÔÛj[’™QmÝÛÍdX–íNNM¶zÍöS·•%QVÞ:™Z¹ºar•`³BX „–´S/ýÑ©OþçwÔy‹ÎŽVþíÏw7Zå¥Òû÷¥ô½?¸¾TŸXtJÇ.W¥:z¤à(m"Ð(¤ÈÑö½¾óW×#zíÍ—OÏ‚1Š€Hˆw5LIœok½vÓsòY‡½~Ð&×ÿüg[é’»øæWgu;pSÍFö…ÝMD*Ï•+b$uæX‚l¼(pO6ÒälÅÛÔVõí_™þá7¸|åå{ßÄnìÜ+“®_€ë†ºW:eÛ}܈ŠS—¾niÓÚ:œúà½6ÛvÚi×–(l/H eÄPµêîú•œôQäé!Ó ­RÉ™™, Ä覆~ B éBþ½uÅ-íÕc,<•+õTÊ6":陿q÷!'«1™²ÉîG‚W´°:=c°aFÜ«¯åî! šÈL×íréöw¦¬®±3‚ ŠÈ³¯ûÏ8?\¥„\øRÑì|RM9Ó©nåÞZwJ‚•»¸ìià BÕzs³ØÞJ9³vöÅbîZiâv›ùb†[<´'%: {yNl£àðX.”PWxèõ¿ú5>ä€0ÖÈr³Vªà Àh»îõ#­˜Ù€ü Ù¡a˜XLT®P•í¼Ýí¬Äyĸßv¥´‹Þ73­ýuÃk!’é]°1}KY½ñ²ë?Œ†‹&bÒÔ÷Os6uÃ1;ó•™'{‰-0îÛhèÆI]Þ‚wbÒÙX­=™¬råÉÎΧ©/Ïoõœtza¬$ £hZƒ Ï)+—¾ß´,å)BB‹¤•OÆ_[’”¡Æ PÀ(¬üØñ4Sp?4˜PÈL¾S I6@ @<÷ÃGò9#QSFïoÙÀéõª…ª·³=u¡¹¡TîwÿOãJyžC©»0&k»‹P "ûÈï¾²öï~º«tsúØÑ¯‘ðÎ5”ÞÞñŠ3}»8…ΧŸ^ýø½~÷G8vw7—âég_ûÊ[MÚ* $b‰ªv탿ÿqÇ,|á•‹ónß„$ˆP¢`oÐø®/²9'Š|¯/œþíŸî¹¹Ì±×^Î¥S^góÕêÕìÅE7:àÈ1«04Ó•_ÜŒÝJnw߯?¿t×ß ¿ýÈþù‡À†ÁÄhYpbóPùsŸüÅ´©wWhDáÎ}³h°QŸó¶f¬Œ›¶­TÞb™û˜cÿÎLh½ô¤±ìe ‚bƒ¹ññìÜd[EÐñÝì¥Ý»¬ îw ?…BˆÑ©ñ^€™AX©™Ælù”§ ˆ¤zÐE_‘ÓÙö6¶}Ö ³! ÞÎsǯn¿«Ú2TwÎlê1Õ°­1 "ºž>¿ûƒÀD $ÌW¯04›µö„¬NNgo^[‰HibÌ»‘–À(È«•NZý­.¤ó¸–=ú™8ù°ƒfÈ{Nj}ó¿žæÇiáÉ™Å(ølä¤.ÿF…C»íÈ'G¡@ÂqE&o[H¸Z×=¨·H®ä+9$Q…,ÀÍfòÜËX}´]J†~Ý•Â)äqЭ¤ÉûácÝHúS3º¼½™QÅ»r»÷-lbªQ·:¥'·6óA÷D¦x34#¡Rœ†ÃV††y—$ìôÑì vާíÃkµÞ½+—eM¤§J%bôwaw7cù! ¥£»MRa?Îäps¢IXh оQIUJGlÆàê·@`ºØª‡–ðCm43°ø¿×>ªŒeÒBð [pkƒM·Êbbg}RšâÔvmóÙ…ƒ—ÿä9”\»š-¤³«ÍÝ®$‰€„#äôÛÿH~ÿ»ƒüÙ{ý . @²:m û^äªñ¢ÛXS†ˆ€ÈjŸqåøÍµ SEoÙÐÁ17ŠvÚºãÈáÙŒs³ë¶™;ÝÝ 7ï-¾äÔõ|¥L~[MŸ ¶…Ózw)Dè8ÆÊ§q(‰ˆÐ–‘B(KÇI¦ÎZäù†‰(—n5´A܈ÿÛb¸¾™+YÀ4¸=˜-·«NÅÄúƬ„Bee;zeòù/—0Úº£éF÷°Uýü‰"Dˆ–”ä\ø'‡?þËOŠ ¦ßüz®÷ó¿y4}¾¾†›Å£"Ÿ¸°´ ^øÚúÎÞ±ÿoÿêgïþô>éô3—_~éµÓå «0dH„lºßûåG÷3ÓϾty>ÛWHb”$’E™4„„€&h·"Ìe¤éy¢¨q÷Z7“µ§Ÿ9Íïãܬ›M;4œš³"@`V^¶øñMØ®æ7š¶8õÕæ]½~³÷Ù߯¿^bæ½!Õ|û„zÈ^ìŒ[î#O#K‘{å„°QÙÿ¨'-AìX¶-Û®eI;µGECg":ö‚NÑÚª ˜™ €È”J©Ù‰*"øOu<$˜5Ê øÑn2—Þk G«.<Øš#’´gsúÄ–7›umDà êûÑ@ÛŠ°ÑöQz] @‚fÜp^RW®,u-Rc‹ãŒÒ†ž²]†°eî6Ÿ£mc‘PPê÷N¨ÛkóæQ·?í9cÙÇêŸgŸ¤ÒÀ)³­¢ä82¹sÂoÚ{éÜädncïxôÑ$ã"9ŒOâW’F8ÍX›N”ˆ†Áš04~à0XFëÅ¡X@ˆIi+c5öÁ@±fÅ ¬ÔË…Hp@¡7 l×hXº#61²™´¥znŠhåïöM]"I"¬ÎGåí”ïLÛ©›Ç gŸÈ„¾<õˆô`¶R¹šX\9 »§!8®h˜„™Ÿ›[Æ’G²Ê>W\ë4¥^X0¹Rý&×ìQ´u­â‰ÔRÛR"¸; Œ6š…B!Ë…EØz¯ ¡•ÍÖ,ØubÑBñ/ݹôV#U@ÄîÆ^g¦Úꮺ%”“[õ12•âJã¥é ÒÍ»·o<<“êçsÒ½ Aˆ„’ìC¿ýúÞþÑVšóÏþó7kïvõV£qeòf—HoÏg§×—NÚnðHÍÈûó‹Kû¹£%ûó^sëÞ»?yç“»¹Ô±W_}ñù3E‡­@"’®¯¾÷ÅÅgŸ½0–˜8†ˆHÄ¢k""1 ù½^(si+ô½¥z«÷–­Bjb«%>d¥Šy{hÇDˆåŒ¬±ÔùeÝ·›Æ2¿?ÿI}¯~è‹ÿ°òò³ÿ8 8ú{˜\D2=³v¤t­½IG”dm‹mgîË­™öGž$©´cgs™Œm !mÇ5ûU+¤ˆâÑÞ¢±©vBmØÊÊùÙé ®oɰ¥Á"mìÜùÇŸö 8czÇ§Ñ Ÿˆùà$ˆƒÝÊØþ¹^k2í¸h¨yËHFn(¨;ÐF¡I.""X›x®óñü‰'>S Œ{!ÍHd"å3™½‚³rnûïB­™I"¾ù6-}êºíù ó¸]œ)›ï}6…ì a¡ÝU¬ÉÂW¡~³Þ¥bÎÑ÷Ǫ·¢F ›¡Ùw‡0 D0H±t>Vù2ŽLþÃWkè!†k$£ÐÝ`¢'Ñ@ÖN¥Õj[÷•ÑÌ‚Ò/8ñ"ÒÉHZŒH'® Ø"D;+Øã bÿoV¿IHŒ˜8xFÈÌuD8’ίm"&&Ÿ$P{znc×î¥å‚ÅqÒ(éð)%#" p/Xþƒ~JU¦á#ueq«ÝèŸ;i§]özºPàéRÖölgs •G=@ªQ6#]3Ú‚h«T™'€Öšx`í|z»ƒ¼È(BÃ@ þ Ëi·9€`š=µÖ82ÑÕÛ4ÆÖÌf£D4uìÙ²á`íþí‡mž9öðá\¦²³KÌ(¥ão~ÃýÙ¼ç1€}ø~×þ‡?¿Ê—ƒµ½ÂÅð.!öš—r©[…Y.Þm‚ ¯õ‚¿¿{¦0ûh -!Œ¿³üáßýýÕ›O&ÊG^}ãÕ‹‹£Pk°†»kïýÃíÚô©+ç¥UhŒˆUÂLh…1"!èÀkEV!kEN@ÐÚÈÀ@ZböÌŒ(Òâ€$Ü( À¦›7`·œÙn Yþ#}ˬú¿!~”ú-ü/ËdXÅZib"´ÅD?ux}‡”s¾9…tWK²ª/œ2ºæ£†°²¹Rel¬”‘Q \‹µn®i•ÚÊ5ÉsfGv ¼©}cØYÏLM Fý Íž%Øh–'K¿X LW›5NvÜ0bMc¼?JÛ‚…[œÞ>iûÙ´ã ƒQýòc;¦°1h††(#KgŸyøðÊì]“‚ç/@ 2X)Dê7§–6Ï•?ù”ŒF ’óß.´>èÝwçzḸwUMJÔ6/lìŽeÛóŒ!Dã½nm¯Œ;ýçÅ„i/Þë'и·§QŒ#¯ýÃôœ§ODd“aHaL&Þp ©1œÇ‡¿ 6Ù®Ìåqµ=cÑJ])HF‡IB"ñ¬´ÖD$\!¸ê½Oƒ°i 3“ºø¤–ñ U;wUIö‘?”ªy,#§®G¦³PšZÛfâØÜL< ‚i’±tt!—ZÚsƒÌQgý¯ísº{ÞnonVwûÜPÒ`–*ýÕZ½˜Y8¼UWÄ‚ÀI(ÓÙ$"†±c4°=^A¦ö¦ßó„ ’³Õ1–öU¬´c`1wLðDÉ.X€ ú=mj½ÙéÀk¤r(+ H ,•Xë­Ï—68_ÙŸP·ÌküîI’p_úíS·ÿí{-fÄò—þÛã7þç5¹73¹ÙX}{özZé#•½å£v&zw­Ìå'uuÖ.]ï’UíÑÕ¿û›mÎ:óöŸ=†ÈW†%ÉÁÎøÑrÿܳ/žš‰Âˆ $I@f âD+€Èë6ÃL1c]/tKöÒ­NÖ©rÖ&êË“8ÙûïjŽòcÞ;üÕKKKͽ©¯¾ÿàÅ+ïÿL£˜É°$²’®Ÿo 1ögÁ½¯ÊyÕŽ<>mH‘+•Š¥b&—/WÆ2¶tl@JÃþ>£ÀF¡kƒùL{ÌÆhéRÙ«–°ù‚®O€` 2x¥õ~ÛQJí¶â¬“%L‚IY@(„“]èOUºNÆ•ª¯B/"²Ó€ôB:ácƒl]>ykïUkÍ+óÆ„…@"³lÊ s‘XCÅ€ ß?a>Y]\ÛÐG³Å“¡­Åj½{úTgýø’[¶8ïlrwYêÌÜÞžJµÏËgMf–kÈÄ]ýÖ ÆÇÚÁ?Ö¡0Å­Qè°é¡Ñ-›(‚Þ÷=,Ù0 dA(1-Û;ž¯"0@XÎ3cIù;¬  F;ÆÌÍX‹ š¥@üìMÝíéC@DpÂö5—.]ï*0ÀŒ@4,°íãBðÐèãÙÒumFÀ“ä3Å{ˆ„w‚ÀD<¾(K@ÑÑbîÝw®\Éîõ÷Õdš±„]fC,£Œµ½ë5Laê™ö†±‘Àr­‚HÐÉÉ“Q¡´JÕIF±[×m™¬tk¶t LÓ (ôÖɬΗ$Ù4Ú³Ón¸›OUr„6*°í[›©j~ûñÚ[{kÓÕ¬¿"%Òô7ßjýå÷÷4hã^úï¾Üü·¹‚¨ƒ‹¼ÑM_RwÀìtoæætåñ~ŒhÞ9coo-N”ëõ°ËBH ÷ï|ò¿ú|»îÔË_{éø¸ñ‚±`R+×¾ÿN;ûòë—çR¡b‚âi"’L\æ(ˆƒÆ¾I\3hnN.x7i4ˆ ôÃ,–bÀ“;ƒ(¦·›RºßÎ]ïmu¾˜û[ç7ÔwÖu “Äal…@pÜé­“…k>‡ÜtÆj4A”_œUa¨®K»TÌUÆÊ×¶,²Ò %1Y©ž(·7&Ebe'•Ba>#›d¡œŸO3ÐJ“ü³­iìÌ>Pf²½%2Ȥ¼;xj‡…1Ùé#:=Ó²\—UW…–Ú¦'vϘ“™O²S«w^™ÿEÿ-\uìÅ—°ÓÏS²]cŠVg÷+'7~l´)ˆ_û®|TñnGY<Ô‡NNuþ÷_õŸË:z-S146ÓÜ%&faOµ–{{ƒ9ÕU½ ‘ËwïQ|Œ NCÖ;À=y$ü…añ?₲ˆ½SÃŽoh©.Ccï(#Ž£ÃIH –(¤ò.ˆÆFßxÊhF”–{~Ú÷8¬Ë) Gs±{˜!­ÿÃ^ [:Öð‹¸7ŸÒ¥íÕò`bRˆÇ0œÄ”$àîôO.í§z¹ÉÒÞnȈ:^…Âxlj½ …¾å“žqöï=¹3ýò‰í¶´'-îÚg6šR¶öPùëãc—¬‡a<n&-†³KHjc!ìjµj6»¦í)KÁN_X‘¯4CØ,^X}´PŠ0î]¤‹vyª˜ÏTg2(­DAcÒEk¬õ ögO.µÙcOZPüâä¿÷÷Ì‘8þ_ýqúÿøÿ^É(ƒAùÈ~}û¹…Ç5Øo=?¹²yÒrè®`¿ûöf»y>5³F<ÚÞ"H²l¡7?{÷?~¿±Yyîù¯¾}v&ì…@ѹûî__Ó'ßzõpNôBƒ(FÞ! (Ù¿Õ0¹r–C×´Æ&„ÆQÔIüô1Äßëµõ~™RqáË­ônéÝzîÅ«ïDš Ŧ-aÑ|W..íQ8qx ­‡ä\ºÄ&–bº˜›©¤XRÆ©´Ž@!8e ¹GÁX2þHô¨¡"¨uº8íNM Cƒ»¬›=°„ EÎ%üpÍ0²{ͧh`Ãç•QS2ö2HH䤿SzuÚ€Q[õ@p”Qµ¶¶ m5'ß\/æ>Ì<×ìå_ˆ–ÒYäXu‹¢Ñ›_Þ:3þóÛ` I¢±-Û降Oº®KÇÓ7®îž,øß}¬îüªz¬ZZÝ›s ”NÉ­‰ìKV}°±ÄôýbzM¯¸\O(JI®rÂõ¡IÌh2aì›!@fLþ Ò€FV:r\A0Æ«°la糌æq[Tì7—ÎüQ3„MñxœKrBœŠñÔ€$6ö8Ðí éïI"TpeöVáX:s§oø LjQµ³Ž[ºEØž-Voõ  ¤¡ ’4¬d§ƒ$£“÷Ñ*{Á™Úçtñ–&Fö=¿Xˆ.9îæc5ío=)Ž;ô¸Ï’ÐBc§Ó‰™™P€ à”‹Eؘ¾†¥“å€0ò#È(þûhos&;,´ìÒôÌä„ÃL2ÉÐIÂÖ±r¨Z®ݼ8ؘ.fܽËß<ùé¿û°kÀàäþÅÉþ‡w:„†)'Íf_4בöÆŽØÒSPZ«±dÓœ>²\wŽ¥­Û>" W²±G”¤Ø¿ùÁ¿w£//^þâÛ''´…„@‚£«?ûQ+ûúkg&„Qwm˜Ü„F"+¿Û‚tvª2Æ2ÉXy+ÉÀ±˜ˆÕÆVÄv)¿Ö±,ü­Å»ûÛû¯O}O~[ÿÕºbPv›X€D\M×Îî a.4'È]Ʊçs*òj«¾SªÌMä,¢`ã£_~p¿g§)A³Òy½š.Æ$kˆD«›*ÐÌÚ ÅÔôT·W)¬G1QäÃÿ¬ÿ ’l»Ò4±µÖÞç×*<<´ŽÈˆÔ:ójT¡€ÒÓºklª‡d“Ö=F¾ñ…F#f4ù@ãÛLs¦º{z¦«kª%‚ºWß¼©3#"CK×Úýˆ½Î9q‹fxAf"‘á~ÎÿúÿïÏ_;øªÁlŒa±Caüß;|% uˆ@d@Á$ŒX!=˜×2 Àëx]ÅJ›ÍJ~Ãe è µD`ˆÇ©‡ö×Ù;åÌCj¶²Ð¡_ïgRÏÛú?u@kDû_OÙ_n¯¼>6…¸±28=Âfû£>ÐàñËÉÉyÕÎt*7–K  ùVLh:ª HäM*yUïj?ÝTú¿Ü|£<×?“ö+—üñ`Ñ¢°Ì?ó#„ ¤À¬ÏqÍþ-ÂfS̳ž­3¢”¢pCŸË<4 Ë=åÛôû0V¹Ýóܶÿ'" !œñq('{ó™è`Ë ?[Ö¢g,A¶rlÚÉÉ”ÞB CŠ$Ò‹ìë Hcú²hîòòhüICô_—WnNz‰ÈîÔX†)ëð°i*•Ö®16wë¨D„@†H#nú¼b„(´ñd:Á(N{Üõ„Fqމ[+Ì!Åÿ}œNÁ:ïœeÅa/ÔpEd¦äÔÚ­·nçGg;'s8y}µö¿üõñ€=¿û/¿[þ·ÿለ3€†Nj©]>y°ø²©;µ›'¥e2ÍW.3ht¾å÷Æó'»ÃÞ”àmÓÈ$QªÞþÇ?ûÛGÚ¸uïÛÌç ç)- b¯õêã_<Ï®üÚqÑw<2䊢 á/Ùm7Ú‘k³ ’†¿h¦óçßÿôíZ¥Ñ…â!HÊÿcùËÈ1ÿÓ§On=üú¯ffª1||%’”ñ\e5öÄ5ZWL+bÔÛ« Úë·÷F*=5\zô‹_mU«Ç/ŸqÞ¦‡Ú„^:~ÔÎYá‰Nö §Yfò‘ÌܸÀ›mÑm‚@l»ÆÒÄÓõ>k¬yæ°Ÿ££p>ä`B±\Þ›&Û4}{P×íjÏ#¬µ{(z]ÂZœà6ML¤¶ï5ž/¬%Gc+õ§ß>šk¿½¼ÿwþc H~ðšonš$f¾ÓߌÓ­*¡ö„–& ,ûŸ¯Þ'®‘ÅQëõ ^ï›ÓÆìKΚWR›ýÐÜáè=¼üŸ+šð ,< ûø€Ã0 Eb%F‚!,\F dF/‘Î wÛÊÕŒ€$ÍÄø†—èÀÚeò™4>jºú嫊暇è[Ñ€$#£¶ ¢—æ 9n%;@J‡?#`ufÆ^µÑžÉŽlWµæd¿ó5ù#ÖsŸ”îC^·¤“X4϶€øàht± ! uA#ƒ5ÏíJê Nªã·ô®+€¥)#q ÷9$$­TÚ ×ijI("‰Á©k`ßÓ~/"ˆ>¶pi)1®ø^ŒÕ<´¾,¬I¦gâ‰Å‘˜dëWòª§ˆ­Ùö#ûoõ‘•äZ×^¶Š ë®^÷PS“nÅŸŒe1]<ÖˆÜ3î®Û›ñÔ×8/‰„°>M3± ^ûàßøÜŠÞ~÷·Ç^ÏÓB2póð“žÑòfb®Ë€(‚¡0"úø?B§˜Y¶Ø„ȨMàs´ü Ýn³*çÒ¯ÛHôÎ;§;ÕòýÕ¿òþÀú_öHo?’ÏpF&!„XlDæwê&¥g:yЭ«iϳ‹‡[(˜X~ô‹Wžc3;í³z*#£¤^<â”"IáÛ Q47u_ƒ‘ŒMç û†¡ÕBAÊ…èíÞ'g6ÈT¤Ô ôËûNèa.…!­ø‚Ì^D"0uû=å*Ó«vƒ;fEZ™4þaU¯®ÔWÆ ÙȤa #ñ™;½[ºœûÅ+`Í$gþa¶ñ‘yÑ6eö»©¿Ø½5wö·3ãë=…šÛÑù˜ Œ£_}ž}{¼ÚstÁ8¶½¦æ¶ž*œTfµ¹<±×2•?)¾ãðú>¬f¾+ž‡ê€ÿ]1…äðo"ÄÂÂX_Þ%â „h&!R# ¤Úë¶rµÿvâ¡9D\Ø~ü´0+­ƒ ³ÿû½G5Ww{8LñûIr' *sP‹ôDzÑâ©‹› Ñë\±’æÓXß]Š›¯”Ÿ½å/qÚŸð9™¥º–‹ì¥g­%ð3ú§Ó†Þ^*ov:ÚVÏÎÈèׄi×G#ã×RG=!¤‹åiÄ€D’YÆc€Ï¸Ýa‹öŠ(Áõ´böó™âSV=’A´?o+åcXHÊ•Q¾­2:ýù? 1¬)@õüIÅc»t±‡j!¾ &>‹÷’³2þªç{ ‡/Ñ5`jÿTVóc#Å¢G¨‡£ÿT3¤!°ÀäšÙÝp…šI>® C% DÝÙï{“…~×"+éž”ÉpÛUʹõÖq||ey· (MòV¸(" É2f .ª¶@‚’ñî©@rmÖD©Åÿ™Æ$‚òEVñrÉ~0­]ߎæ¾&gIEÖþÙ÷«ÿþ?îj¥tø=uŠuñ6<÷Á¶ß’;Óq•¯íözo—jí;bìyÎ9Wp!%ÆkIÐàäÅ_ÿìUqfæƒ÷îMí0ImŸ|ýÓÅ[÷ï/²VP ò¯ë„$Í…™¸i`ÏQ¬•;p³S̘O«LÆÔï÷^¸û×ïüuûw£²ZyÄV0 J1w´š|Êà^Á¨4’R»Îv ÆWFEëãçÇ Ê,ÜûÖ;oå"ÒqºozQ0zV©cš†²µzátµÒ2Qˆä'&$ƒóÒ¡fPÔÄËñ÷\ d¦RVçÕÄ¡{œC¬npzRš2viTX eËí¸è²Vï“Ùë9 ™•<á)\È*Þ˜LJŽD4 %XeœÂÊÎ/0ßùyôYJ½ÒFdî»?êšïªUŽ×·;šYé¾Qø2–iìlnÌ¿›+9W"ªh‹:hg–Êbô³ÃÙɵ“"`† ø_¼@ ™Ù¾ŸŽ8€^ð>p(ç ‡_á05¬µ¿PGAŸͬÒ“’ùW-¥u8‘+pž6*3nž_Éür›Q'þuªùswúqˈ$¿/þSÝýàaeS×k¥bÏ=dºr9ö4–ccä¨yö%½»ÒLŽà¡+z ¦¶.mLŒní”§Æo—N „Bú¶ •Aä ç)j?&Ä~ñ/„w¸° DÓyáP‘†`Ak"]Œ)ø¬¢Aû~*ƒû&\‡Ýeþ¢/hè>dp7ë¶êõ.T—…t3!2Ôëxo¬`¨uÅL€ H…£Dmëe+)^ŽMgªÇ  ƒŸÙ§ðù)Îßdxf6zxH€ó™Ô/ ŸŸÕ̳Y=kæçm3Þ9îJô<ÐývÖèØµúÌè-çÐ2ˆQF¡ÔƒÌ†’ ­•”0ìj°åÅÿA{~9 20 Ë2|£†ðkSÏaf$YX¹="¥£)<üÛSGûTÔÁl¼þåÈqÛ{‹_0!õìw¢[“$ŒWZ10{å·§§wc[ǽP…ˆu ö„€#C$¥®>ÿ韼©Ìßyÿ»—òmÛBJàú³ÿª±ü½÷.sÛÑ€B ”‰µ±èˆIˆªk£ïhEDÔa»E#5!Àü£è3gs샟Ÿý ÷—/¶M\çüB’4S‰Ö•֮ѕ~ QckÇÎ,ŒÓ_œôÍßúþ|™œ £×o:µb"NŠmÃ(aø¨$öš-¥ 9ONÇ4ÀzSöj($åqdrõñ‹Sl´}æ…¹Ê,˜ƒûmàöÍIš…Å22;ȈPÕ®ét=S·¥8HjúIHèÜ0ìr,‚¬e-dFX¬ßñ~ÔeVH þñuýèÍÕÝ-#–|ûÊ_íÚSÿÌþã“kÍjyä^õ…fì·ß;pf Ýkô×7ߺ.LÙꪚZªk{‡WìõæYrò®·Åç§y8Ïô¿!,$¦ùþqîü.Þ¾?˜4«ÛÅý_ðW»µö’i¬ b4Ø—ÇBTCÐ4 ÃÉ"R8ž`Vž#è´L­v0l8¿4"Dw6çe·»€3fîK[iÖÀš‚òVd”¥ü ¶úýþr|ìUG#€ hðMC£/5ǯ“ýJQq:ùU“,LÌO¥‰“ñ³£î©¹œWT=µ£†kÛõÚV¦W®×FG®e¶!Ïð¤))d¯"‚ $åºBšIã´Á’=í” &Xª¨¨D ‰áMsppøæÌ2u¹ªL AXQSUΚʴ]Yóèw¯{Õ®çË˾jŽˆ*9å•Êwf¶«ÄZ/-í æÂÞ)r?تÊËÑä“î…ËžoAXš‡C@dJoû³?û˺~ûÁo½5­ž(¤j¼øñ»#¿ýÅdÛq„$$‚•_Î%S¦@DpÛžÓ°)ðë¸L¦ÚoàÂüï4ß´¾ù»±îþeAûn $ & fB æìájd]Y°1 Ø;©Ç¦¦#¥˼ö»+Û_üÕ¿ù“?ýÿñ/‘Š^Y:ÝmŒÇQ2[fOšr˜=?)lÏJD'&'±ÿj@¶  ”'j6SÉJƒiØ‹4æú£i>¯rDd SŽ.æQ@v¡¡\-Ë-Ènj­ /¹Á™PJÁ³o3iGJD8Ž"3¶ÿs4"âíßÇ½ÏÆZ-‘žýÎÓŸ¹‘ÿ*ó§Ÿög&Nå ;-D`QK]y"G„½Rªô«Æ—zgÐï"cÖ|f.nUû‡™ÂÄÏ ¾x ðŸ7èyØ}bðGȧ} OéV"²ß/$y$älÈ7Ü+­”¶íÞ^ä2¶k¥X!#!ª©Õà@ƯxAeD Áq-‘ˆì—w•`p‰ÔĈ+`y¯b½Ñ|¤z H3h¿ ƒúÛîlÆŠ?•k&‰¯]’ŽüÜ3 ]€L¹c%^ÖL/¾¼$!R‹31f> ü¬S¬—Ôä„*V] ÇcâAOäu§[Šæök.D=”†¤s¹Ùgåx=—„™¥. VÁ–.’øíäXÎðÜúÅX(”Â>lF£g‘èn[GÄð#!l÷{fŒ 0 o½©wÏMUþåÔÓ ùÓŠxW=cFôïˆbÞTVt³Ç€Àº|#·¿·:’/mù›€ÿºÓ‰çç­á¸ Cµžüü/¶œéw¾õÞ¢ìv–@ûÕ¯~Þ™úཥ¸Ý×’E|!ŸJÇük-´k;ZXrXOG µ1¹<ÖiÃ_”öŒßzúò·Ç~ú´ ©tDš“­ÂÄö âNåY"·Ëzr$b¿?Ù“Q6‰q€Q=mR$*mkV"ñ_4?žö"Fò‡ýÿÜõ~pçá:μ®7·½L¬ÎÞî•ò)͉ëæI¯óÜ["(¤§Ñ€ÄÒçæü~¤Ú9Ôs+S/ú@ì$xXnÀÃý ‚6AÖ¡qýì#*·ïŸˆhè ‘Á~수 î»H¿Tì*_€g6îÓ°—<ü®‡bdx1Ñè¼<ÅBìp§/6¨8óÛ­Ð]L«Ä34Œyˆ=îkí¿ÿìKž„vëZ;¢];Q1 »Lýì3 áNÍ‹Ö&“\NË/I©Ù‰(“|\‚Ìbì [ëås´ß6Ùv53“×¶GÌ^¹¢ÆÇo•δǰ?mcÆæÿЭ™ƒU_¼ž3 áoRƒ6ðA<þqc 5²ïsÞ7ÏñjÃ$Ò0oå_‚5å={6Öx®’‡0ç@c–ËhU­ÞT2zXQ>åøBscd'¾Rl¯Fé§},ÎéhDˆ(…yÃOû¢5=•Ø;3ÅèÜ„Å@»ƒã½Ñ…‰V³oDÇÆJ}í¸4°=ˆ'ìf«—Ë]¢2ØcéWž‡IKD@VÚS®–ÒLºÕ>ZÊólIBñÃ/Ÿn¹ “ÈöþDù¤&tÓLuK„+¬ýÙ¯^©±!:Tý¬–ŽÖ©ïD¥Ã”%°pœ¥‘Ýfòv÷MN÷[ž§ÑUŸšÙ©ŽÎ¤ºë1‡ 8/Î mÁ\üy¿€þÑÇ¿ø¤™½÷î[«4èy ¤°›_ÿê©1ÿöíQX³©DÒÈì9Bô{ŒRJÿ~  yPµèäŠÑ뻿{úé¯-ú™;ìí¢o×±%’#§×"o„[ ÜóFrÞ“½ô;Ë¢õÿ©¤l[³V ¬‘úÏŽ–Òcј4°L‰ Éîô:2Ÿ£#“ T~NËDˆì¨äÍÆgE2;«žW­Î•@ ñ$¥ ñù±´$Ál»ÂPy=Íz—Ùí¸Š´_¹Å!·ŽP‚è·/µŸH3†šQš˜ëµ4µ ÂÝ‹ù/”²7=½öî³_ R¿Ÿøß kî,$O[û©×.²®^‹ìår‡û7î¶KNú' ½ªk’4/Ÿ_i?Ñc½æYbni§94 g€ . öBŸ<Àža©†&4ûp±óÎá‹ãaÊŸA!XxuB~¶ç^]ÜMÃ…?=lï:w'yÍŠ'½Í™‘ÈzÛÿ´oFffðÏìj1‰ÇÀ©q 6´ï·bbðkLj+ñ¸x¥ûÓùÂaQ‘Ÿ‚ò-Ax/˜G ºž2×ë¨2sIç‰ÉÏŽÀ° íírvfÖ­y^yê’Sï*`ÍD‚í¶•õzƒjfd)µ?`K,,:§¨ùê=+d&íö€XÙè£1 ò“ˆ(M©5Њ}mÊ6gÓN`1€Hl«î&¦D_H ¢ƒõr"&4'oߦzŸÑïnÖèäfÕÆƒ±çm$„êÝ\ß4Ôó9s]¢Ûx¯vv72±y–½ú'¿ ±™ñ¼IÂSá°þ‰È>ýò'æW¾ýÖšáõ=-ÜÒgŸ¼J­¾s}q&bf¢µÝ3ŒAW’BJóˆìÕöOm¢Y™[ü¥óÃþŸùR[P` #†L)fÚcc›vddÑ£œÜ|‘y{†ÿ§O»ÚUì÷-ùtú£Ýù‘œq˜Œ ÖA{™.µF.’œžLÓö‘tÚŠ€\-ÆV_?ëjŒºE›Ô°N'<÷Ó0xn…¦‘šÏ'Mà‚KÒ ·WouAöú.kfÞu5²_»BdÈ‘ÿR>oEºcĬ ]êOºÍ¨Ùƒ& ˲Ðû°2±Ñ–‘©ïµÿ¶¡~ãÖÏî‚Ö乫FiäN½¬Xtœ·Û¹8Ç>z¶ôvæ´÷דª¨x&¶99ö´êæV³=3±vPAâ;àÂ(ÀGÚðpʾ,<¡|‰‚™¿ôG ¢F}³ ]|þ£ÆÐÎàÎMƒ ÀoÔE?e Ûg'GgùH¼RiÌdËZk >CÍþV%˜À­¨ÄQUê9+þu[R¡`DÐÂv/Cá¸Fý…Dä©ÇÚŸOêoÌÞ†ª¨ÐùQÝõÈ[Ê'?W‘ñ©1¨·©Ùjí‹ÉÅ„Ûx½±pÃ9éª`-D¯A#ncPJægÆw[Âd"”"2 Œ„A2uš ¸Y¯Û:ϧOª£7ê[ VB@åjç«‘ 'æ§½ž9xUM°G ï'÷úš˜ µZLÖ¦W϶÷GqŠž½y§¾çƒ¢ÞwwËxÝJ<íùŒ~bÌ'G]ph±Ä Å<Ì‚" ”ŸýùÇ­‰{|kŽ2¹2Ræ”@O¨>ÇÉVDÒ7Q´lw0‘h7­ì‘‰¸pg¬ÓvXZf ÀÄ(ÉÈl»0r]õïrxr6³(‹¼ÍžëjŸ#šõH÷6WG⮊ úÁÝ®I@ƒ–‘²’£c1 j£„^Óñ£§Z,Í~µÕWÍ·KNxc÷7ªð‚{î•&f"ÙÏ& PžÓO 0¸å”[½® J³òK0Ç "a|ã;ö'£qÝóë4u³79x5=Rü"2:Þ«ýö’ûô`æeMÊùo÷þº)oå?ÿJ³L±ùV­tsîM_02Ô'/=3§QL­Wž½ºšcy¼`_n ôZíxY¿QbPÊgŠõNjúöé‘ à_‚÷ý¸ 9ÑýØS !Ä÷œŸß…³Ä°„óÜ”¦˜Q · _}ïOåÈ÷„ŸÇPØÔJ§Ç‡gÍž+ºù‚…/‰¼±ÞF_ÒÌÚÏe De¯ÅžÅ¼¹DäøH1h_™Ð¾½ ¨’›’}[.d›»Jßa †é¨`?Fd!âש³Áè\MÇ_ñôx{²Ü÷˜¹ÛM]7ý—;÷¾SÝÓ‘5Ò iŽ9½j§\‰n³FÉþ`(Ÿ£BHaDÐC)$…$Bß‹æ&Æ|&£ç ËO 9>;cIŠ&Ò£c§g¨†gH¿NZg–b»½v¼·j¸ÇxyNuÍÖ³úH”uãnëÌ%áóœÓS­ZíýØÍ Øy«”5DìÏV—7›€¤‹«Û»W²£•õp!÷¡0CÓªîçÌw¾Ø­ŠáñœHpùÑ_ü—»÷í_Ÿµš<²I s»mF•  )ˆÐqzzdFWë7:Ÿ"¶H¯~ÿz¼è9á\&tŸ"IhJ- 3h&ìŽ/Y­ÿiÝQŽÇ 88Ɔ9 æþë¥QËeX›¦Á€@}à\nÛ¯Pµ{(‰µ­UâºýaQ»f:~Z~Ç ÿZÐAnžý =‘†©‰±xÒ@åö=+ª% :•f¹ÛwýÛëù.ƒ„$Pš`þ—“Çëܺ2¦tÉ‹#z%=i¬XÛ§TznjÍÜÿd¼¹a‘ߘüÑ|ðõÿÑF­iâÁrªTm¼—x©hT´Ç2*N›îég³S`W67n_´ÒñýÑÂ+Ù«YcÝÊÞØø]wExÅó[œéƒ±?žç~üó¿_å;š4|î\¥CÔp¸œÏêq@¥4¢ 2Á|jP­ŸU;ýKl/É‘¯]})³Wñ˜3+¶œë‘›XtÓ›]™ž”ø5ûû;hÖšU×’VäkÙ›Îe^·ˆtx Ç HH€(HÝŠšOæ`|6V-MM'±s‚%W±ˆv#{}¾XÚRøõôö¢ÂëðØ~<9›Þîz‘ˆKÖyVˆ„†!”gF„") CH2’xwâÆ”áÛ®„% d‰4š&1JK =°Í¨á ÃMEºWaÐ|º’ßÌ‹Ú<ž\›myFyò¦Ö¹·&ŽšŠ™E±º°zv„€\_•ÝQÎl~õ=ë1#²Wû Ô(?4¦×}«ŸÏe€…ÉÓçâ,‚o§ç÷|0¡!TãËŸ|èåï¼ók Ói™-XÝ6™fD²)<­Q!P«úéHÁÆÃèüsqYÿäã†HŽÝþõYÙì9ÁûÏCr4‘„…BsIæ"žFBf6ÖÿñʱŬ}}› €;· e fµ8ˆ`zÈ|.É wc^Ù•ŒJóÄÚæ£®’±±~ið V_,”ó“ò¾‘!¦N½´–¨Ë]Ûç ÏÚE–$&þ`¾ô$Ú)\Òª2˜0€!uŽ'òŸ»1×C8y3»YŽÇòßmþyOþaþϾdö‚³êŽOŸ¶Ë7fv{š ±˜ÛÏiÓ\÷°?±ìÎÔê;ùkñÔ^{­¶+P lñD³ÒÔÓWÌMütC'þ…S !®þZÞÂ3‘ÿûzx;ÄsÖ#‡ÀáÀ|Ñš È?R8F=3f0³VšYî5Îê­žçR¿ï¹Wä‹z|9³ÑTÁ'éï×þ:OÀDª0ÅÉ—Ê5K‡*¨Û`Ã0 B;?!²/ÞÄhz§ÅÀ tÖ<¤£ùt0ÄÈ-ÙÛ°ãr:—ØO&©ØVg3J3!/“+×݃Îúá;÷åÀ‚ÄN?‘iôF2=W­*ËT+TÂêR1šVÔ$+bšÑhLü_¤f«êvʯŸ?.'¬ò‹¯NRQ‡ ºÕP~ ÃËRÒ¨u=¡:Ó Gƒicr÷xëqwêòHíJ"¥9u;Wl)6ÀWèäìúâó:0Cõݺ;ÁÉÇëoå_ üФú=ï¤qÇ*¬Ÿa8¸øÎH¡cä3P‡ÂÈN°I`|þBg£ ‹ìÓ´•SW¦0$"¡oj<7{9ƒEQ>¨ÝÜm?À/ÞÔmIžœ@zâÖÛ ÑŽíéa, Id$G@©–0…„㿬:ÊQ¬ýA°`„q/Që]ÑV8•´å÷èH2ȵ Í5[b‡ã·ëŸÔ4›*7Ñ·˜ÇÐ9Ðò9´Ñ Rp|v$“‰#³Ý>8)"Ä“fÃÅ~Ïш}"”$höŒMÕ¿=¢ÇÉ<#‚îèH­¹(Ÿ Ëœ'pëý=‰wgÿäØ{ïݯÿ¼ï?ýÁR¤KXªgnöwXP[ÜßoÌ]<³orèÜ?º¢9„øŸC…ƒ]9, 5‚ó7!›„¤›ñ³ç*­´``ã¸^êúÅzƒ.‚=5n6w½+Éú®Ö/$š…&âK2Z<1Å"ˆ'~ߟ“M™@¹Ë‘TgÝ•¬z¥x"k¼H= Œ]ÞÍ„±Þ°³†‡£qfqÚ·k®F”2Û/¶«‹÷b‡ãÙàP‡]Iäu2éAµ-’©¹þ1KÃ÷#ãEÞš± #’HeVüECÕˆh3fòVUöº) s—ž¼hŒtKN0æ gæÀþŠ€èÏ£G¯_Ì”žÉ'ÓQ`öH ;iH'•¦ânßM ‡óv$AH(éý;GÙ݈¸Õú\Ü%`rQÏpÕ´uì½”âx쫞—¾úÐ[ü½ö¿?O¹/F@¶SËåêÙýɲ8[™xÒ2÷¼ÝïÈÝ…+ªR?ë-:ÞØK‡Q3BÇ™è×jéܼq)àÍ»~jzÈ…ðgu8”ûuجºøˆ/t‹ÈÄ@ ³Ep.û¿§m™–"“`­Ùq”õ ¾®U;JiFÕêè®YéçµÂŒùª¯¼ à{}A•È›ë™ô¦Éõ†bn_çGh'f)ÿºßËNž7„þ…ÐÁÀàh@HonÆ8Ý:5oEÑ#yýšÖLãV±¢pÿùøÛ+{åÊFá[±b™€FôêTP.ÇR‘C-% 1„œÂЀҲ"3šËMr⿠Π:š™˜žŒÇb¹™ñHÊbÂæën!‘¶Æ¦¢íCŠ <éÿDf¦ÛuÈ­§×vÛs2W,7Ÿ­ç—g¸Í'G©èÑ;ÖqÁ¥ï¸voây—™¹ù›oÌ1L|þú½Ù¯{‚™À;}(Ïn%ÆöŽ.hxba‚7ŸCâÂù#H[AÄÈÌÎE’qK0I³Us“o £½z$f‚báG%¡§“²38¼Ù}|kä—{™$ôí®&cçó=36¶öþ͘Ýó!¢4Œ‘Éx’¹YðâágmG¹žÇ¾:Üpü—Iƒ<½” ì_Üàù%XVD ØÏ·» 塸‡Ÿ)6R‰RƒÏw¸X,Kó$RH² #‰ŒÁ¨´à¾«SQ&ª <Õ²¨ÐNŠÍ‚ #ó/oŽUseÕ!NóÀ@FË‘”Y~Ô½v úlDë5ÊÛþQ3ùûSú•\ƒQ#jáv.gŽšîmµ§4:Õw‹­‘gëžs+oÿ]iözá¤^K.MQl·B ê¹*v «rÛàVBõÏÿy)œxø,ña7""Aðç,ßXwîåñ32?)PCd=!b…´­{¶ç1ÄÝ^B}Qí <Í8è9HˆÐŸ‹œèµLñÈ ™ƒ¬‚[…¯öé\£ôASÄf¨»©Ñ?P3kd +¤JKÙlÙýå$lºÃÒ©s9Ñ—ÈpÞ4Õ ;ÆsYéE#xêö+À@R&è°N¦>~n÷¯û¿±xÒÕD,uòF¹ë&R‰]OJiœ`‡º iF"fÔ’DĈ‰­Ãè‘*Œ c…¸Jå &„ÌTD©BŽ_ö´Xˆ¾„ÿ雓É^ ÝÚÕÔFbD޼°z¥O‹«—F;ª±ÉáYW—k¨abê¤ 1|CB­š}»42 iŒN™°f&juÀHº¹Ï±ßë{ ˜ÕPòD@AD$ÍÈ??ÜŠ•³÷e¯æÍ‰rÔPÎ.$¹1÷9vû&môãõTl$}mûc5ùú|êF0œ”¬ÇÆ‹ÖÃܺÃÀå·;GKQÎu¶¾e”Ϻ_öÜh•çöг‰ãŠ`F¡‰:i.7`fU¬káã‚Ï­žþlžÏ±€ÁõØ1êÐ8û„3a&oÁÜÆ©hX ôp®Ì(Y8ýÈÌ$k×mu=¥T®ÕÊ»Ÿ6µ‹ªÕAœš‹#ùýC¼’]¯*?ê÷ ,‘KœÿÚ㉜¹^WÌ4ê`€ ¬ÈæLAŒ~©;+éØK×£‚äÇR¬’˜¼"j»&¤fM¿:v» ¥Áƈ:ê‘ôì½ûdå×'×[GOo¼¯÷=Œ‚P¯1šmöêF*½Ð¨Ä¢† ámú\ûö—.A†a–ø×ølnqëõËǯw¿I™z÷ó—˜C-$**̯¬Yn6R5 ÿ/ÐæÔ ½=;±!¦!Úb`…Ý'Ïò×Þk9*Üä;ñƒŽž?¬\;Û%VÜûà´z™ëÅòb/”o>©|û¤U½kä¿h¡oä@> ÎFxî *~ašø‘ÜR$7ž–HÍ2”žlvâIÃJɳdVÆO^aRWJm;:h÷[+gÛïD| A»ƒVGäón§7à˜wðážÈe¯üæ]«ÓS@ÂÖÈbV#Gé¤?‚­ÍškkÏ·wP(ÚûF§`²C`Í@# l¡é ¯~Õ†À¶ˆ^w>¬x(³ÖiBH0½ î= @@Ò0ÀÌO¤Ò£€‡žŽ4=)âB>‡N¯§´šÃÁ*$È”+¿Ã_t:0}Y5«™Q·1^s#›“QI¹RkæƒèñKo[‰Ì„ý7ú…}îhÖÈPCÀ^pÜU8­M^?+»È ãÁ3gpîQ‹ÞŽ6v©ó¨zõAäçã³ã=¦ÖäV&d­e/¬&^:„È_¬ Là„€š† „08ÆÃ¥#äés¨Ehã^Ø/ò%¬iyAANŽêÓxÍ)´>´Í~§áÉðË^ÉO¥¼³áìÿÐŒ¦I‘³’j=â]’ö†ë¨ ¼ €(üHV®›Ù£S'²9:a ʉƒÃÊP/ @j¿gzë½xt2C€Î‘,w˜\±œ³ç°.CùóØ·oT‹Í'Ö&wû.1 Pýº5Ñiw8žœ±‹™¸Ÿ¯×aËEþ^ðæˆ¥ý'Ͼ>ÚÝ?9)7gŽ~ùY¹ÙÒìÇ=ØW/ƒDÉeíábL>í©Jæ»BI¢vlòƒú¥´X·yeÒá*IH X³öË‘ØhÁW}O©ÙÑJ¡ˆ¦Ú‡}’}Gi€î“ú{{ÇÍÞ[W+UAÀ(X·Y(/)D{Q‹†°UÓt0=ÿLj€"¤“#§§<šüÖÃæ_ýìñ³s¨G. Æþ‡ÏÖ"µõ:˜ÒÐë¼ùBæócV¢Üț铺š¤»þ¢p}Â4wâ9З«g##GÕ+S›ebVôÞºœÅÄÓÖÞƒéÇ6iÐè•ßéµoš…ge 9©CíëÜ#A5ôPÔ*È!@ HXùåÌÈXÖ@¯r&TËÆ(6«hxÒ@18h»ÆhÈ@&P œÊhäõZöéó^@hBÜíuT‚åãí ,}i5¯ÆöN­D$­ãNê7ºÿî˜AùB5q‹'âÁŠuÖÔ”ïåìußÛâ 2oªÙ+æf {ªº=:¯îŽî%ït‹¶Àà5òÑj;2²†›aì2låve5 ÃP_8.äp1ðk68´7h ¿'»4PÅ ãækȷƘËו†RŸ.;ã_4»}áØ_˜/Î+çrÎݰµШ‚™"‘}͈Tt¡?8ÕZ†BO›@!;Ëñ„·¡¬Ål鈴Ÿ9¾à]"$d&a\Úot<:'€½SQï(ÈHfGI{à)ÔÚ~spùƒävkwÿÁ½VYù4nCZtû ãɘŒàû’/¸é‡’ƒxX‹fÙ‡E¥¼øïg?ú³M¯±½øàöJ«QéüóíùäáÇ/6ËhÄü¨ËèW?96s21:€¤)m)52²ª?é\Y¦–½éå-•½n—£½Zò¶ý‚™±vv®Sv§ØlÿVuÛïökgîm”3 q÷…wÞý a ̰!úïQáϧÃp^ñHŸ™3 #1@·èŠVC£”¬úëƒ Å§âÞh2@ ;˜Š";õ¹zõŠûѱM€¤@ Pý¶cÆÒªßé T{[ÇVbäÒ½›Ik~<&]tt;.#Ÿwîk0Ö==±h8æÄRâG_ßøÂìz†ÜF²éz£r¶vi¯¡‘™ZkÙ7#£:ÝôÞÃRQ¹Žhì§ÇFk±ÎÏòoÙ§Á·+¼f<]nõV¼‰‡åÇ!†þœˆá%vH%>·àð‰ª½(T_ƒQ©¡á|ÐwD!Alõªæ®{Ô`©é²3UÿIO(¦[Š(kÉôzmdÖ|ÚÕ¬5ª I5`ŠÜÉ °^,™üX±ÿ¾`bäžX–£oší¥‘Ì“>óp™þ…Á@Bàͨ±ÑMѪÉèCm <e2[?Ô(º¶fÔõñÓ‰oOžÖŠ›“ߎî+FŪkg¢ƒþ nI¿OJiÍÌC9p8ôÏSWôÔkA¼WS8ý½µ¿ú»ê@;hÎ_Žý»Ÿä ù¬¹:^©Ö¶ovãiÑɼyþÙA2‰ &KUŠ I ³½1s5SìVÇ£l]N·Íã껹/û€Úžºòx6‹¸Ñ=¼sùqY»¥;xV¾U’n?Óßk ^1=AÃ…˜7Yùµ||Ú$9".­´|õFƒFb5íǸ¼^«k¦ãÂtÑè•9nJÍ(M,êÌÔFP?SŽú»E@ìWJ#ˆX&ÎŒæ''gDzã&" $C„"ŒÓ4l`dí9ZÞŠ|z걕ˆWê†ôƒ ¤u@¿Ýƒ÷ˆ )ÉLe  ®„ Œµ]a${¡_ÖúžÒZ»€}䦔rõ·Ü­ê`ö6”ì\ÜÞžJ{^­¼Ò³–þ¸4“2éàHD§îô×kÑv¾èAðè3 PL —9HéKn¥2se¿¡µ,OÍ®GÆÈ»¹i¹Ó6êˆhÛ·9—~~°1ò~tG£ˆÀn#iŸ¤ ×kÇ.ún^Ô~ºõü,î«°8|әؿEÓyµ\À&ù«80ú^¡à.Ï€ˆ]¾¦¹­šHFt¡ØYªþÊCÔOȈ‚¼K©Ä“Îâ(¾v\föyq~±oU")xaD8;nt>²[RÁ?o¨_ùF2ryÍÙ©´gó±­¶ Œ„ ZøµÆþi&rKØ»”œ‰#öšºÖd2âÑâ êzJ¡ÖHÌÝgí[oÁAóE÷×.Uª$”swÝd•Ž>TÑ?²Öþ%ËO6kÍâaòRÜó êŸäïÏoüèWu,üîFüÿ~zo®z´»$qÊú(·˜.õ ³i<•Óî‘ëí6nx@ÖØï*òt÷IñöšêwßDFQ›ê¾#Ÿ*FÕ¸c½¹jDÜÎéÔí#êÓ©Ýãûñ‘7Çzˆ¤‹¹ë ¹F)‘0ü|VÄ„æÈr:Uȵ2xÍ>³Dd^|2ñø«ÛüÓ—n&<^&¨q§ôbÜŽ˜Ølwì0ÂB j@ö ×Ì%°Ópéîv' ɇÛ{µ[Ý F¾(Åþùœ}(X$=þî~í;¿ÿOÿññû¿óÃï}ë­«¦?ŠˆÐ_ï; ™\-ò·vu\´rºÜÆõAfì‚É!ô—Ž~ƒ ^Mæ3 ^•”ɃD¿ƒ· ɯÎl¥A+ÿ¸À¾¨NRß[Ý=Nõݩީ5NÇ¥«ÒUû¼ºS¹Å¿Ü_ê*e7;±øÍÌÏJ±ùfpÓ+-|å5ë¢ç䦋կ[ù—D†Áɯ•k“ N{—­*v4õo¾Ž¤³¯ª/2ïd¶=ç”N;m•OaöZùHøJØÐ«Ã4ï k‚•¯úCàðâ°lØ'„ªÇ)¼÷Ópe$d "ˆ/_×ÜÒ§M±øbÅY¨~âjýÛN0B'êÅW¢•m^ÍlV­‡Ž…¹I^Õé WLzá(Öì{ZÃÓ—?³ªå¦­ôÓ¾µ4ÒÞñüÔ!<¸± ”Ý»ñÈÖ ;ž$dìµÜ²M¬ÑHÄNÏ€d× ðÈ 67¯~ÜoîßÐ(*!üh·×9¶QVžã*fR^PLÂÀÌZ+å‰÷²+†RàØ*þä/×vtìÿÝýçÿ¯_Öo_ªm\²cÓƒ§““^Ù̃ÓÕhx Z™kV½â(¿5xÒ¨´P3³@¤÷žÍÜÊœ ¶a’gœg«3/ê¤Ø3ï>ÏN€yPt~+ñØ"ìÁwË|=j<êQŒºý`HÄAòð|^—s‘+ôø|d,ŸÀàºßî)ƒ´e.9¿š¾ràÖO†?<©h£Ü\ú‰=EÓ7ÆÈvØo„$Í€$ç”î5[*›3]í8…\&ÈÓºº×5dÔ<aµ5’*ÃüµWŸ¹kkÝFbz°adÎWÁ‚º"¤¼ªT#÷ËE­‰e+zýUl†ÍØÆ%«q䪲Ћ_,ÌOn´^¹ß›Þq‰‘´[ÏdÊ-cùzñ@ _N®1$ƒãL<, ùÁ8œrã…ìHP ü1 €@ä÷{‘¹zUGŸ6É0Ò‹µþÂÙg.¨rH¨+ïZ‰GÎjÖ{ì¯?ÃV"D`!È»œ0;;b&}Òñü>CܾMYèúÕH¾|ÚϽ(Z<†íÈLˆˆÇæ¬z-1‘0ˆiÐQåÖ$Ìlä¨L‚û®Ç¬ƒè“,>Éwq»qºyý;^Ñ󓈈^G̨e+ÛQZ z®öU_gcå¹âÝܲtIèHtë/US ¬ù?ú÷¿ûã3A|tðöÚÙžZhÆ/µ¾Z™©–•AP«-GYy8+×èÞöd>‹3jßO"6>–÷fZÝãö¤ÉƲ{vÃ}&ÂÙoŸö.¡¬×Ûã»{'þ©®65·sº–ß;P!ž|Ýš1ØðÃ^_ "Äýa úî44ó+éÔDÖ@®–Q5z`˜Êuegj'Íw3ýè^7—ô-dr§”<ºùþçö¥÷oä½^˜Û#ÿƒ$D‰º_©Èé»=cÅÒž/7¯¦Õh/)úÏÉC&ÁŒ”ûÞ÷ÿÕÿö{WæãÈn·Q9ÝÛ\ÿüÅóë¯OÚ`à@&G'ÒÐîzZ©èíÖ£¢‡f*Zjùu¸ R¸µ ]1Ìþ\Œ¤!¥1>:’.€µ¾çÅÈMBÓhaÞŽ‰£Mvyžï(Bd‚ )n¿[Þ)ìõ—×tÉL‰ÎæBšÞÉh#*&]ÏËâÑØÄõÊ¡_Aˈtƒ¼­z8Ä ›‘|„$AØZ¼<@††a ‰x ¾‹Û؈¬^Ñ^O4ID²ó%{¶ø©‡n HphQîÜxôø49Ÿ|ÒÕš9Ȭø‡B$@f|â_¢5©î°wXNAÁ ;±„£Omg-Y>±Ãb@ O"  ›ŽÄ\ÌB¦~׫õ™´¹[†ê9£ïH$ÐÜúÂûàAí´üu⇹-‡„öqŠ‘Ï›& :m&Ð(Ùs5(Wk?ñöôzR ý«_6µ«óßû_MÿâÿóÈfÐÅê­©úËè\%µp´³:uRíbm°b(¥€Ù\¸Ú/EW¾n-H¹+µ‚gVx¯n¯Ù½jµUrYÄ2_õ‘Ù¾}y-‚\¯¸ÇïÍ<  ÝþvítpËÌ>î„äõ¿4œ]°3¯BP²@h$˜S3‘±Ñ„@çÄÁnÇ!ŒÊŽ]µO•öäŠ}zÄci3” œÜ¯Ý­ÿøøÅ/¾²î¾³Fý²~s#ù“é_Î6lfTaŸþ]DBònÈÄI#ðÂö üÿø".VVRñÞo¢[oó9PùC-Dd- ÷Z6zÚ_Ž™ètíú€ÀL‹ÝHî*HíC¨É{uxÿ=ç¨öJ¼¿r\\ %FS†¿õjÊ h÷¦óÌEø• ÈÌ×§ÅkKëmF­¡x%z42¢¬nÊ,ÕÕÀ#ïjgùõÓ›×ëǧ¥‡k§-T(5ÓK¥zlfu¯"@0£³O:LAc@Œþÿò0Úp7€aúþ|*Ìt!W8Œƒ–;ò …ÂZ¹®¡¥O놈ÄJ½ÅêÇôÏ(˜‰Pt¦&2/Ë…YóyÇgþùmíçD‚ñ1àuËÇ^4Ýa~chQFÙ+Fa½‚Ë9çÌun=¯DÁ“‹dÏ' t»’‡€ÉÈ­öÀSJxÃP«8ØXøNö°¾Q|û~¹âcß™LÈd#ŒÀ(­NCæ çx®7p”ò\íÃÄ÷–rš ÄÆ†ÝÓc¿õñ¿ùãç.‚fÖHäžx÷GŽÞ,xí±ñ§Æ¼¹ï)UMMjÑGPmoå§æÅäÞÎÕhïÔ[²J¶áSy1u=ÞmvÇ F–â™Àö»õê5¨ÛPêܹò¼€ˆní×*¥Þ-#÷¤ ‹"Ã˲Ÿâ#Àw”Ÿ!#ÊäÄLll4-Ð>ò¸Õ²¥DÔjÀ¿ÞøéQÁ¬â•Ü“²M" BUf:{}—‰û;Ÿ|ݽüöµ˜×e"òƒÖäW¥JàÜH+-H¥ŒÖëÞÑ„+S©‡ÿäû7ÓÂiîïlmT«õF£^ïõ:}-¤OQa%â:o–ô3¥vßvµ4²s3ÙA«îЖ:~0ƒ}ߪ†s ä°#Ï· CH’é|!:n15Ô‘"‚2jWº½)ˆHï‘íh­5Û‘…4~¥².êú¢*gâXÙ]M³çåGŸæ–ÕMý¬”xÔ»2ІQr¾ûËg}o´ˆÓ¸åùIœ ÀŽ`ErÇG‹ÍæÝÈkÒÀ0÷_Ú+‚"$½Žì"’3•{“ÿÑîݛݣÓ‡kûuáÇüÜn.Zlæ–·k(ôHþй¸«†àÐóv†  –‡àd¸ˆM óÃ,¾±>>Â\¾¡¹©Š ŒÜâYoñìslÿ²É¾ 5dqÍô^éµôIÑf áߪwÄ@ñ*Æ7Ú‰EqºçÖ´ó²# {ë³£QzÓÍLfžu•ìG €„A!¡0ᦀF6m"°´ë˜u4Eo: \O£ ñºü4ó­¥ÓÒáöò;p ’#bŽd〠 Tm¶D¿«¼AÏv=Ïs×UеøGóqv%ÒyûßÚýï~^óG ˜ÜCý~býìr¹?Ø-Œw‹ŒíÒlÁ&ûëåT4^8j͉“›¼4Ö¨y„~bL´_ȇùr‡3HçN¨=>õõ}CíŒVêýò÷à•FôÚéÛoN¦fâÝuÏ‚° ó7bw®“™ÉNe"€@µ2zõ®’4»ÂìôÓǃÌhWŒOÕ· ‰ ´ÁÞAì´8jLÝH{]G3ºµçŸ­n¿µ®£exa$’€’„ˆeÞ–®2{&Ù­•¤ë¤X€9v}9ƒƒÖÉ鯛ÝâI½ß¬wÆ —–ffg³ÙD,•ÉäÑùÆŒ!,@y ^·\÷„a­>¼‘¢Zu…Äøœ`ƒÃÛn€e4% «Ë¤F%‹¢ëö Šs÷ûÝISX‘WuW{¾'Å׉H¢ÌýóQ»Ù,ÜwÛ¯×:Ý“Ex¶:²?7Rý$W:>+LÒ™½š›}þ¡ç œì^jlº¶ÏˆÀuàG ò· =oÑ:nŒÞ>+2ˆâ•ôîH^ÈÆz=ÚDNÜxF7Ÿ­ï^àíŸo^>«š†cpíli|b¯JçœP bG俉|î%øÿ/öEè‹r87fΠ߈H„Œ„Y¸©¹£š‚¬ôÂYo±úé@ †`ºL €­å|òMyqœ^4€R>ÊÏ3(„¦³–4ÚG´lÁsW£?. Ϭz…W¿#GvJ¼”éo»¨Y6 æ,‘…0`-K)€õ Ñò4ƒˆeííža¸¶§ÑO:“:Ïn4Šg¯>ˆî9ˆ ¤eåFÓþPPZilô,ÝîitÇu]Çv×s=ñÍ¢ªÆ?ìÌýúoÑŸÿ»m­µE¤˜‰ÜýøCµå­îØ«òÍÄxµEÀªÙ[޲ëE¬ñ/~úf:“›iÅâÿ Í̬:E×où"ÀÎ ¼>ݨ',$0§w ‰ÏÇ òQÂ*ö‹ ·6ª¾‘³ôœ½g¤Ÿ5ð¼:6¨‘fºhò‡*¾íÓgÝ! €ŒÍÇrSqB·hc»æ$l„·[?;Qz./«ùÉW®Ìä› ©ŸéÙGµñ›ï,Ë®í ÄÞéG_vWÞ™ë÷ß2‚„ˆdÆ—n{.A)ÇÊŽX;Må’DÖZiíUž¼>9®wº"²07;–¤ÎéÁÆÆÖë×»»›[[{™4hï÷[í]{à*-á6¼ÄôÇ3åz‘A /¹¡6ÌCŸ[z !D4?›P{FK!Ec4ï¶:ù‚“Àg§ìiåwl-aãÞûG©Zõ2VÌz_,ØõâÕ³£;ÜYÀÏ›ñgÎ*Õ7'Ç;ÿù„ÑqÙ‹bØw䤆táy:d…ð ìÚBZ³·5÷ø¤&E$;_î.–?ÓlŸ ˆ„[ žÓ•øë¶ã3ßý’…`V!Hê‘y0_©±ù¢­5* ç„y™DkbÒ2ž7gFs[MB_‡­‚|÷È¢6i˜À­6%Ȉ4RضË^püð—Fî«Ö·õ~ýeä[“û-­h.Ÿaf5°]4’V©R÷•kÛN¯ï8ƒ¾3ÿGÕé(èÕß]|ño~Ñ%å)ù  ƒýä·œ±Å肪OǶ] ’Êz•h9y½ýQo5=Â,|ýËí+c—³' äÔÔFéÞÂY/…H\Ø«€h¿[o^‘¯®ÕjÊïX_û–¾¿³]I÷žyÀ Ãs`ã`†‹éÀа#…•™MLæ"€€å¨z„I ]4;ûÅרÑðeéýÚ©Hä3®‹žEs_7þüO?:M^zûÁt»ßgÜzù7o¼û/§ºŽ’†Ýžô<«¦rN£ÅY·Ò¶§“ÀZ“ÙÉxÏ3òSY?x½¹sX¬·;{(HúœBò<§×êv;‘ôàÕÏ· ™˜üà¶Yëx§" å/‚ó²Ç…$¤‰F"?žšŒ¶ëÔÐLñh/‰»-•™läxwZãp!‘°þ`bóÔ©FÞqË£äÕ6¯g5ô«ƒK{zUDöže7ªR\‡œÂDý—Z±héœLL¶›È¬&"†@;f}É8¬Í\=¨0¡†ÚÔÔúhQˆFÅu=à^S¯çÌu·ùtùÝèV©xõf©œöAžûã‹ÙW)1­ÓÙ'êk¸ˆ÷¼ ã 8ˆûÓ.Ìý ,ý)¢‘ùÛšÛÞqÃ$+;_î.”¾ðؾ ¹·AýÉÔãêµ\wÇœÁB+!a.ñb519ÝSA»Œ2Ëè“\…Û¹Ý-ꥌ»=8ÇÝÝ/€ €P ¼jZ–F®ÕµFV¼s` 9(´ö…¡¯W¿Ù¹ñnb¯òÒùö¥“¦a-d€‘AÛ3"©@µìºõ¦ã¡çõ¶=èõz↕q{# &nª?û·»HZû¶Á@;FÂÎÎÂíÁ“…ܣ鉎;­Š¬YóÙx¨oÀ¸·ß{µ{+*Pçìõý+ ó•º&¿îEðáѵUÏ%ÏÎ.î—uuâÙŠüÝÌèQ¯:úÞ›3@p7c{åÖø×åá—Àïù.^$ {œÂ¶‹øØ\|d2%€Ø=éQ·é‘$ÒÚõȼÛÿñ™F=ú ûåÁ·G¾ÂX6¯Ž1ÕÓ·J?í4^üÝ£Ö¥kß¾‘lv]Aȧ~\ÿàE興P"Š§ÞŠ¸Ú<3Ú^e¢_¹u;‡Œ ìþYË4S·dO×7vN:6ƒ0 I )¥FÌM‡•û"$Œ¦T»‘Šì),n¹2žë7Gëu)ÀÚ@°àùÉ—‘Im¦Ò…Ô¤ÁXꚆ#Q³ök™.NÂÙ¶S{àGƒÄÌðçñJôj©œM[í»ÄÊÛÍM<ÏÌiÞ¯PŽÿöÖg3“171xÃLØ÷âvm~ÚÚ´µ ´^@ØâBÌÕ³æñí•×]ÔLÞàA©?'5±<î;D¤éé/rÓoº²õÕêÑõíw÷ªÁKêØ“íš=³}’õyEÀ€ú×Cäù™HÇó"©pÙMÙ~š Œ!ïˆÄdÌÞQØr›™ÉÅJw©õ¡ 3²¦ «¡´3+fõ0µ[o)€^:.ûI~!œÂ4º/h9‚5rÐ$A›0û¬8IíädŸtF'£›M­Ñ¯êŽ<¾_˜@JsaQJ@,ži…€±dgÏØ·½ð‚Cf.àÙó‰o¯lVß¾÷ବ,ËMk ®í&J‹9Í:{Õf­ÓvX lÏqÅÚ•TRL‰õû‘ÃŽf¥Cçÿ± ê쮬՟-ZŸ^«3å¢T àp&']%pºtæœuntãLÓG¥Ú§Ç«³×Õ‘íëBëÓgk‹’˵4@öÒ~YÇßy46ÿúè’]îî¯ð̤Ž÷öáYt)æ½²ÏÙ ¡ŽزÃÅÇãœíƒÍÌä3“ÙP­jèJGDÀžMÆìħlVa¹²ÞUï4O’…t¬éf´Br¼¹Ç](=úógòêÃ_Ÿ“U‡Ñ ÁöÏŒ ß~gV·4’0#d%'n³'u{|ðÓ•Ñ‘™I©€T½årwЦ¿±`4mFÓ@(¡ ’ÒLÄr£‰ðÄ’°Üv³IÙÌ„ûÕ‹³œ5ý¢ZH^ùÝËêÔÖÁ³:½ ÿ{àê†Va<—CVGºêZv$j‘Œí—´5VœC牶ý”3 $)„üÁõ“ƒªº?ïÕâ².¿.\bÑw·—éÉå ÁÞÖÌ«&F~;ú×/ã³úÓÒ["#Ú®ŠµZ K¼ç3…eç-åŒçÊUýPm!pklùIv 4šmY'`“î>áµÃ Cÿ«Ü»cë¥W«oŸ•‚3´Ý›ì6ª—Wô†_äø0lâ†ó‚;ŸµÌäcw"apRàa¡S°$|ƒ8îü95`túžÖ=ç´.ÑÌ.Vz O„/8s8bF¢ö½Hü«æÊèÞ‘§9øT*!£DåÞÓ±WîL.ñe_q@† ¾î!Κ°²–Jµº73¼¡uqÕý@ЖÉÖ0‰ZPF³åSWŠž­|wÄPóËÊYý2ùð~ùøðùåïÒ>&¬‘Bš[mtœ' iµI¶{Ö ×lµº® ®ß½KݘIü7?:ékŬýt»?ñ×0j¬­‹—í/³Dá`àÙ={&†=!£…M×+ÎïÎbdf»íí~17)±Û÷G$¨ùjiŠÔ™άì4oWÜKØø||¤Üj¹?8=@ͺô ±sv'6¶q2Ä$cXþJ Ãd_°tû" Œ/Æò…Œdû Ç­ !„VžC©•úߘ™t÷”[õ©W‘l!¢ÚYVb\}tÒ×ÎÉÇUJ>xûíB¯3&=xòóGtù½ÛùžG&G"ÖÚœö¬z$y°ÍùdÚ058¨©Çº•ý'ëƒh¬pýÛ—£}%„’}\±iŠt!MÁ3ÏÚ¿ø‘c×Ë'f¡ÙI@c­–¬î—o¬ÌÜûïg}ÿ1¦¡ä~±%HHAF¬N§YôKÔðØÅXÒðbg{Ò-ˆ¤…_ÙþE™ˆ|\úcŸP§Ïòºù¾înÞN+ÑíÖ/5‹W¢ì~!:¯Þ½ÿéc¸´$ù‹Äýã1yž6ª07Û:ñ†Â[ÐfLdw×ڕ浉7mF ºñv­=×$Ë%ÝՌڹwz¼Ö8pí§©÷ÆvÏv¯ß-Ö‚E‡GÚM˜[ì†J>O_0ò6qqŒ Ž×á¥ÿ‚øĮ́âÏÏŒ€™¹«±­ë%2"É…Jw¾ù‘Ÿ}…ÙÄáÁÄ|ì+WL$ð•Ä@%Ã+ «º?2+‹'~8\¢ ÄèŸK4^²²O[…ñÜ›¦ŒA_¸ß"¢I£‰frňÀ ¨êjˆgNN”EM×gŸGd|Á’:Oëßqʯ&ßÙçØøh’‘íN?¢&ÃÈtì9ŽÛë ú^£Ñê´ÄwnPÔ$¬ýyÍóO³V:0¡ÌBbÂúÉ…wåðÍZÊI‰ã.I­±q ƒ€s¼ç©ÎõŸï^§ôÌiÓ­†——g+5äãcšÓãf¿ž7˜Ss•åÑ7 ããúõ^¥òé¯lÒ€àÚßY¯—-úÚ Û]Bs7\;]À‡#Å­ÌüHlbÌBdlV…×´ d­\3S_?±eÁ܆ñf#q÷¸ˆWb)Ý’DóguÛW{¯>üDO=xçn¤kkì¿úø0wóÎ’åyKÝK¸HÕ¬ñªœZœ6˜u{oõL0{go6‹¶­íŽÇǯ?œævÏñÙï>8†€FÆ’"4¸sx}v]ÛÍãG_6ã™ùÄîQ]£³ÿØÌŽÝ{ת¶õuï+bt^Zˆdd¤ó#é‰c½é5•‚H<é$Ú‡æ —I~^õ<í¯5äB¤\ý^ï¹Uëß\Ó}:J¼éÞÓ„ƒŠ·¸§V‰ŸGõÅØï6þ¼»ú•½ùQáúnÀh)ªÑř⩢áÑ,ôh2’¦|ᬎ÷[EPš¡•¾ö*1ŒpÖ÷ú€¨âÏæ“/";›â[Ó;Å•;Õ¢_"Ë6çÅÄÌZù€uP„熃ó:8ÿp 1éf†‡ÃÌ|þüØ—)Qkê>ëŽ[.š`$ëý¹îGô¿ÉÑD!yp=ù|pµð¢m#sIòBD™E0žX‹Vïµ JëÐцÃr7"ܘÏÇû[ý•dÓe_èô ökÅI’‘É,3!î{ÀÚLÄΊʀ¶ç¸á ¡šè¾9¸ñ0µS}ygö´3•ÏhÄ~£yêf¡§Íˆ5¡ŠŽëzŒ¨œãöº¶øó$©ô¹íÚžÇ:Ì;HÕŠó[ñÑÓ5SõΘ<°Û™<9$x²xìu.¥¾ÐË0²Ü­{Ýçg—æ»E—™‘¸½¿T0ÏÜæ§¶Ëï=žÍYOwSsÍZ¯ÿýæ6iâêòØNåF2·U è“pNû  Iå\@¼ ‰Øè|,7ž€À‡¶:. ðeY—›?-z 2£ý=¹èÔkï[Ÿ5ŒQiHîX’ðô“¾Òì‰èž}úñ³ÑÅ·îOÈfŸRgÿó'öÌý+“9r…´ð¼lmsê~Šªíõº7Ëœ'-aQ¿ãˆèàd«Œ±äìÍë£æÀ†%%”„æøX‚àï»Ñ\[G¦:_4ϼÙxOv-W8gëNzüÎ}ë´ç1âÅGqh†$) 4ó…ln\ ÝnmŠš±h9 ÛܵæÛ#´~¤VLH@$¥ü­ÅÍCï8þnZ·ª’üjæRË‚ÞY|j}b š_ûgd¼µô7{ò÷òú7ã7ºŸÝš}=`` r455~X ŒŠŒ¾Ê‹!¤ø2œV®lµëÚý^i6ª(R©c‘ttíitùUC€"ç¥ñÖìÎÉ›w*¾¿C÷ÄH§”_9>ÓšX‡ ø|§Bz~'ðÅÖ³ Þ.8HyX42ô™ sâÖm§T’h¦—­…æG|óšÉˆ$Ù›˜J­W–GÕf?ìb LÈÄ(€hÍHlÕfÒòUK³–úвN¾tc;71û¬™›É¯·††WV„¤ý ƒD#–X ç²ÔÓD¤xªˆûž”•ìÃð¡``PG¯Þ;*n©Û+®=–à~»QjrµdŽÑnW¹šµ«X‹ÿs z,àð+ÇíÐS ‡P4´Ýêrû^¬<–xÔ½Ì4rÖFÏÑc a"˜ÓÇÅžýîÙ«é‚Ê\2«½Á…}äù%ÄíÃ+Y«\`E0:ýòfÕ[¢Ö“Æ qÖ/^½ò¢AÀ€Néû'EuÃ0Ÿ¾‰ò ü­†xعBff®Ÿ"ÖŽe¿a3J&å9fÇ>{:@ŒŽÅŠE˜NUË“76*‡Íev#ÒTzÛêåÆîÞÂZßÇOÃEr.I)12šOŽŽ ªcjôÈR$c͸µÝuœ«Åi:Ø@ B)Â?4¿Ööü=NZ½7wcí”×-MÅ6/ÅðÍQ|ÓÁùßxõ¡ZûõÑÚ™»yöên|‹Y`ŸÈ8YÏm·C}ÈOÍ…Enr¦TïÜϼöX ¬ÛÛ0F`tjX× ßÛjÜ8.#hµïÌîœn­ÞªW|IAõ"¹b/=»¸Ñôa`ã×ïÒ=ÇÂjà­|n,~£æiØ„ox~SüL¡(2ö¡íTÊBD’ËÕöBó#œó&l`FÄ@(´¸bÒsºÙÖš|ý’„& B§ ¢·?:Ù>s!¬òÏê‚Ï£ì‰É˜~Ýu'¸á„~ø QŠG— DVBºg4%â'§@Ü÷¼a û-ë:Ü4bùUöÕ³³íþõUޤpÐî¶¹ãE"Ò®YÑ1yØõ³§+ÖJüŸØÙ%Úxázžľ1 í„¥L€B{ƒNA‘™S‰è`ËDP§²[õòÔ•W•[¤¢+™FK=_Z5OzH„H¤:0·”¬¡É…Q%¶¯ÑÖ¥z­ÓÿMï™`dæöÌ¥—Gw3é#¿’ñ|ŒÒq/¬ að›bùÅD~"-AïõÌvÃ)<8z­õ‹3æ ÍC‡Œy»ì>ûؽ~ªßŒ¿h»Zs0´EB4¸ôì'[Îê÷V³í>0Iïè³½ì8)Dˆb2OšÝÞ nE¸ÜI bÔ;óŽÛO£RÂJŠÆAII3»rm.ÆbÉT<š˜˜Í˜"ì4öV({”õ6lÆåÓz¹OE:ÍЧ[nzêÁÕAцoyþs¡a HrÑÉcçHw<¥%PÆìCî¨ÞïÜhMPïkvýؘïe0ï½SúLÖáÞ¬vYnOo8·[Nº×+.õK—Dçã\ù˜¬ßýŸÉ®þøŒÛ7/?.½;ÈR»@N}iFnØ~GŒÿèúeÎ@¤¼9qÖœ¹²SÕŒ¬‹Uy"Æ`î©^Àrîô¶/Á®bÖ@jÓ~aûxýöµÓ¶_î¡;Éh­=23ýªG m!ü‚}+0q8÷ T¾ðò‡˜ 7ûá¬rÈ"¥CƒYx›uË©I!ÒKÕÞ\÷—6¸˜Ö¯zჳP8‹ÙÔëÊr¡³ãøiÀ Ç<`Q&„è%07ŒE£³éê 0†ü$3¸ÞUsôE9?‘xÙS€š‡y§p/BP$3dð&ÈcÑÃ"J¸npª8/¹Â ä¸ö#xë¶}pÐ^š“ín×ÝA"Ó?î˜ñéÈëžÖJk þ…¡ög^RÚG• £Cø“ÚÍ]µ!ßùr>ïåœ3rÚM äô^ÿìaczÂÝ5.MµkNûóÈêÊÔvW dIN$ž7°û:ÑùdäùBÜ|RiÍY•Îɵ_·¥Û|ÿ¬Ö¹3¾k ¥Hí/Úþià‚•Ž|ˆÌl656@jÁmö´ŒèºBLO=z:Ћ–‘Œ|ü¬²pù‹[kg»cÍæ(F‡†¹aR—Ôþ'??J^{ðö<4l"½âö| =¨8B›¸¹×ó½Ð³ô:*71UOEF£ 0 —n^¿~íêååùÉéB‡À à òO 0^ßj¹h伆§Õ ÙŒ˜ýzWàî™~g®Uó®›ÐíÎHBZ$òùÑô¤ tÖUíiVþÔÙI§ur†ý…ç)í7›"’A2ò&6*^-û®žYoå¾[ÛËÄ{íæÒQ¶ëMëµMkï~òˆxã¯>AàRûîìWöûÇe`¡lŠV£3“½]W€¦aK£o—íÅÆ›þ­ÔkAƒÍ÷7ÍV§n·Ç r/¾Êoo©÷wζo]=hjBBVý$û3³™g® çEP|‘‡p>d„o´k¾5 L‡Ei›>T˜ƒ. BcümàŽÛÙ·„‘Yl4»¿°ÁÎZžª¿ª“X´Ÿ&/[Ïû ÎÙÅþ]N"€ «ñÈae1…¯» Ð2Ô‡}V>œ`0:mòkçrÚ~ã)­=„ž¢‚ÌäÌ#€²MažuŒ,TÐà¾ãù-í¡Ë‰‡ëœŒµ7Zwï8Ç'åò Óï8¤9§•n::•yÖV¬5{Ì⇣ve–áÉçyžfòÿjàŠ„/¤ôƯ4c™£§wâ0±WŽëȦˆˆ¹ƒrßݬ܊Öÿýȵn¹×Ö¹?>³ßB¿ôHǼÁÊýƈŠáît#k³Aíî:‚Ö­ü¥Íêâèøú‘ÿ²k8/åF8¼íQèàX~112•# P{lv=2A» ‰ëퟲ’Ù|w ÅKª|hз²¥æ™Qæ3ÇÓŠP²F&Í×?ýª½rõÝ[­®2#bü-8JUõu3™°ŽûJNh ­¢’–J÷[‘‰±‰‰™©ÉéBÔ@€¦'²£ù2Ñp¾îNDòdÓU/Ô›L„0¨6Ì‘H³Ñ5èÍ‘•_z?uØ?¤@ )ÁÌg²é)@ÚÅ^ßsÁ+‰²2ÓzÙ¬&̸øØs4‚Ç>ÐûðwTµ¯]Ó¨Ì͑֡éÍy²K4·¿l:Ob{gœþMüϥ߫üm…Gîc?M~°ÛD trkjr¶xDÃfbÉAÔV;3ñb1{ç°€­ëÆëÙ8KóØn+@4>òn¯7Âíz]¿»²qøæ›=ÿ,çô³²Ô[]/1èà+×~eü¹A‡" ѰoÜ÷‹ $iÚcÓØÞ˜¼)»¬}Ž¢QñMÿ?®þë[¶,;ïÄæœk›ð>âÄñþœë½Io eP@Á4²É»Ñ¤H5ÕÝ$$=ôß¡' iôhQl‘D“B5@@±ª*³Ò^oŽ÷Þ„÷±ÍZS{ï87•cäC޼™÷܈½×šæû~ŸB"!ÛWÂùƒýüDúUKú*7öƒž[Y0"ãÁˆ®MB·J õ4T@sÛÒ?L;0ÆûU¥?jsçæÛÅ­r¨h0‚Õîv%RÄéŸ5«"=9²ÒPR*v”Tâ§ë­ ÏŽ\ÇQ %HåïW ‰ +­µ9=ieÅÆæ S${®Î.„ÃïVÖ&÷ÎOn%žEæ’§ÿ¯ÐõÛ‰jÛ^}}cæJéÌD 2{%‹aw­2®±][ ñØ*ÍFKÝó‡k È®½ß9lÝ7C/û<uPðÝy#??õ< êÉÑñèh. ÄØ<Ô ê°Ð•+lpdäׯz¨"¹è^™:Ú|øìüÊܪý-ãÀqÃìh±ÕŠ’’=M&* öÈ#¨©Òãÿ¸)®]ùö[æË~R ‚dÌnX©nEƒhÆ6‰]‘TblñÒäD17­³Óン•ݪÜxöÓŸm¡fº%}H ‘»{h3¤“ç" te1™pZµ°»ººþ¾sl3z¡'@„† ‰LÐÙ§–#%¬ ÖkcêKKf§ú)íó®#•·q!4¡÷ÆéV¬d|+BRëlνRo—Ïæ”»[HÈŒØ;kï(¸ûo—Íÿl”£Pm‡$~6uõ•Í,úÀ¡õé‰Ãsô¥ ¬ä˜I¡\h×L½´QYpo›†ˆF³ÕB¼Z>¾SÙ#åÅjËÕúG——ÎWïÜÞiyìz×ÍС_¤e…oê=|Ù½¯™T̃ÞÏGß°ÑE€Œÿ”ø†Ü‹p¬@S!PϼKªÝoí¨%gëõ™î¯z캨 p"{ëyéÕOΕé1µÚó©`~!„‰t¢#¾Š³ÚÉ¶Ë ¤R…eÔSúP;6«Ç^Ö¯&*û.#(x?ÐËA#IO§LFp$ í¹ºŒÃnIv¥/ïa` `R€>4Ž¿œ½1u¦²I°;ÝŽ èár+Ù¯œ´†ÆVR‚î#ÅŸ8í*~qÌÚJ)ÿÃDb@Ì <9uŽfòv^¾¨Ü„,Û.K×4RB#C¢°^¯x¸r;6ºôãý;‹™ó†{ºtu|¾¿¤˜&"Ob£f£ÜÉiœMhºö¢Ös®µݽßK`Û¨‘ùÝÔç­Vµø¶e(}×þzrþExܲ÷&͉úV“³¿sò#ëòo½øO¶«˜Q8{÷zŸßÉ­K@´• G‹ÙÜJG…9^?TœÍwénk—˜Žòû£!@QntP¡õÉðªC¬“$Úi¾½¸v¸õîÜŠÅ€HÒíæìƒ\qº´/ÞëûÓ-Áƒ— ‡;fŠñqãGr`*£ÁôHO¾GÐìww5‰¹V}Êþe-×`ü&"jß ‡_öSKM'èHqZ …¨§3Úny!ÚmK`©Þ´1_ÌM­¹dbï$>}ÝUàÓ/B±€„==– 1²Ûg¥ëåºF1ÚoMµÅäO ߈Šþs`í•ì­Ë.åÁmöÚ˜ÉævsÒ9­T‹£—Εd¥\WüóØ©b÷Ù‰r”dVÞˆ´±GI­—¯DE²úšDḺtA„ Ϧ‘Û•áñ%ëj4þxiuñÊd£æTžä.ÍtmF˜>®\B­Þ.2Ú8ìwdz•V+úáÆ™G/¿Ý?«Ý Ç¿êñ€ÈÈì;~‚¯U½ ÇG¦Í¡¡!`㜹ÚU‚…’¨M=yÑS"š‹œ" ¦I:ïßÊŠ©z{tCÞY™ÑRzÊ•N² 2)Fª¿ùÕcÌLÌg"ÕíôÛký\:ZÇŽêy(¢ÅÉñ\¸òúÇý“_=Þ¬”ªm3²Ój¹!{íéžK†i0U‘ƒu•íX.%cçu?vƒ‰ YåL¢_íEZKýቇ©£^`deë¡"ÙB27¤žôì¶´ˆXÄ7îFÒ_4É~«6åer¼Û i`NýÀ~®ÕÜ·‹ŽAÖ˱ÎÚ}ãéLÆî”æM"·t´íÒcÿñ$òßâ¿>PìQçz;—®¯¼^eS¤iMÅ–íÞé"´x¼[oÜ^ë3öñþ.ކZÍ+€ÌìKsáU'*`Þi¾?³w¸ûpá Åˆ€Žt²­Ó\qáè xÕÕ`ßþFÇdE¢¤Å ¨aAðFÀ4ùW>&! @LFâ[ýö>‘Ÿí”§­_·Ñ–þÌG {eŠþݹq8=ÚÙµ˜AyDöV„BP|NÈÍBV6°@J]` ¼F]sA7_u®fK{²ò ƒQ‘&Hä"Œèö”Œ :F-®vZH²ëºÊs?ø:=ÚWPþyŒ‚ZkñùñºÑmH@ÝÌÕϪýH¯Z?+Œ^9(IfV,þ…qͳýUEºÒw(_Ä']€—Q–[w¢!óôuzŠÒǶ`C̈ú[αúvõamc*?t¸wð|îÚœôÛ/¦fÜ}[GsÂÝ+Äc¥c‘#¨×_q¿{»SµJïŸYÄØŽÜ^/ާNvüÈh ÀxȾ-È’ ¦Ÿ$ŒÌ¥d®˜Ò@í·Ñ)KDÀ}©™7ú?9a¦ÔP{Û"DB‰É±f9r;£—eîùL¦ò:• Uv<®'q\-‰t“ê/Ÿ—²1…h/5¦š_®B*Lhj!Š…)v¾øÙ¯?ß­tFpûíJÃÑcäXͶë­ìêaB"rÆÊ–¾ MâCn½$€‰ØAv¬FÙIa­aÉucèúö™#½Ü[D!tA‘b>•Í È=jXl¡& ³Õ‡ÜâÒ™Þ¿=DÇÊf¯i"!ˆ¾}emßnÄ?!ÒÎö®¾pß9Ú¼kZM{»Û«m}ü7^}&?º÷³_1¸Þ–O«ß\\.}Ø8, /c‡ñ‘ k[llŒ$ç å2ÝWkˆ °u9±;CU}P$¬vnì—=# Þî½7½¹öÁèŠë¡-‘­4RcÓ¯:ä š_vÏpO×ãO«<"{˜q&å÷kI›mŸ2HzüZN_žëÏZŸtÀU^u0± ~g$—®FBˉÇGi>b(øÉ‘„º¡‡WhÚÜ¡3›uV5Q…FWr‹KõÛzj¥Yy¿1§NÛ½gâÚ‚sì 0MˆSºd'µZ™òˆÀ¡/,·•™(5ëÚG' ìVÞꜗÞ5CÏ: ýr˜ÐKìð¤@øS ÃÐâÃÓÑB.†Ð>¬µ% dv- á‘lÀP>vP"FDÖf¬^©ŠZ½-ÅRo“/;R)Hoxs–HÐ…fµS3þïkn®6ú0öÍp*55°^=ùõÒYW"+×Q¨éz8–*Ì̇òãÓ1—Ä ò‘•+€â㩘S³ »à¢ ¡E2Ùl*jæ' Ép*SrS…‡ÃJ) ì™5„FÑ|>‘#vŒ†# »õ~2Ù>Ù¢þuÕ¬/ÙQ>[ þoÂ_S¹}}±šzmf¿˜yѺËöy¤íÕŒ¼—ùa}ü*ÿ¶©\¾ù·zúîèWêý“3aKŠ¥‡Ç÷Ê*H(€7Ë&á¬:}i³Å è4ß;ˆgèÖIƒÙ7›‡“î¦oODR;­÷Ç×÷û÷‹[61Ën4tƹ±Âr¢t@PoÅâ›r~3]0¯òÁ=@9 XJs=ñ^›Vo—„žïO;¿j£#}"K'ÂCCuG‡S/J×rǧÒÅÀ®‰o „fMeõóÓÅðÙ:¸ ”"ÊçÝÖˆ ŠsA‹>é_ÍŸŸ÷Õ7ƒH$4ŸÌGY9n#ÖÛ5#Û=lX}›‘\oHêçaðNq@O¢«“±<1ˆ¶› UZªyÚ…nÕÔêõJtâJ렇̚ŽÁ`ÛÌÆû¿þb$áü|ô·Â×NŸÿë1tùdÙelGÊcFYøÃõÉwãùÓ·f?>§Êÿíôþaö?”ÿ•úý߉üMW`¯^ÙnÂþ¬|±š’ŒÃ£uÍ^*Ì4N~üƒo?í"²Ð›¿|w}ïŽ+~ä ååþI¿ƒò¾Bòã)˜< $˜‰±p2æ²½®òÌ"®c¤ùªÑD³ìS&„[©OV÷º*SЇ—ãã{g#ÅÙsû‰/3b—€ B‹ŽÎ3£Ðf:ýšc ÛQ+lp(Ìîѹ«+GÙŒ¡H8>>7±¸)p0ž’nÐô{“|r¥+/B—¦©hÕ\ÍŒ£¦¦ ÍŒ›š Á$]©ç7N*}Én{óȲ@ª1¤ íZŽk¹¦­Õ—®Öu2BÁñH+OTt×çé3…³Ùú\Ï$¶öîœvfûgI³ëvÆIw]göÒg§ÚñKé °brŸýïï{ÿ)ûû•sR¦U'ùãlñïuÖ…‡ ö噬„u42vPþôOîŸ:È(—–¯lO ŽMdJ.£u6ýÕéhX¹àMZ¹ûíýÃ?û¤ÿ~÷‡6ÊÝI,»¿}ûÿµ%\èå­U´˜ÀøbÛï7ªþOBH‚︴þoHŒ™@J —˜ Aƒò´  ƒ+tÕ|qÃxð×kï¼õÊrÙ#føn-…,QJw}ž¶J±¹°CJw ýöŽIˆŠ]ÍÕ^Üž[¸ùzóö{/[¬ˆ¼õ¨MÅ \ÑŠHuÛ)(l R(P°òT$ìA…/ôÄ‹0+%@¡û:;¨š‘q^.‹0ÉPTõšít¢¶Ö——þqþ?4ÄŸÂæP_v”íJF/ÖȇxR,b…À,Dï`l,©ïœÞ‹Fû®PvRPÌwåÉ¥þƒÕÓ›Ñü‹u_UßžI´œ%ûά¾ÛÓ04-÷GG¾t®ôªª@ˆZw]ºÍÄd¥ÞÕ¾}º'€Tû†{V½J}ÝñÅ‹‡}º-!¨‹Ì=>2ÊE‰:‡äTzŠ5²,¢‘‰¥§àP!´_bð5Iˆ³vmlBÖ2»Ùìϯ¾ OQè±r¼MÀ}÷w¬B!4A¢ðý9 +ÝèôÝ+‰®+"™XØ@RG%D©Á®Ò"™ðƒïtsr¤4A:V§Ùj÷ÅàçÉ 2ŽI*¥#‰Ã×»v*3{ë­wÞ¾sf|¤XÈeRaM°R2‰"Cdhlxzjáá÷¾ÿ;?øèî½+“…sܯuÙ©µT&4ŒO7=aÅjI9ÞC$ˆŒÌ®œ¨ó‘‡‡£wNn¾î~Tz6=i;góB",o÷sß²ÿÚžüíÃ?ë Tþ뀸™x¿XœÚ°É³cEV{˜Ýýû ¡?&«ÍÅ™­&3ãýr&Âm¹8~íkóÚf]‘ï€E"Ø—w­Ã»ƒr­–šW¦›; UPß{Ò ø*• òeü¦ßÔ·?y*Þ]BÀd†Þ‹@§å¬FÂÓt8§>m€åúÀ¹Éê«ùHÓ¸}5Þ¹”جÈÿ??$¡g×i!bΘÏ[³gV|±úõÙäl]É'íÅôÞ™dé'Ky˜k𡇧†£ €ŽÝæ„0ÊNÌÞoÔ·TÍãC(@ž¨@ü …Ðô\n„Ôù¾;Y,YéWl×u»5c¨Z©âÔ}ÛEñ§rs<ŒÇ,Õ— †^$JƒP~`ƒj^JöN÷Ååî²B›#ZH÷ºt1±ûúJêyx1Ì/@“«ë÷¯ í7íÕÆ½¹È–F!vÜ¿]ûO…ëÝÓ±ä·O”ݾ¤Wûûï,~m¡RÀ­ð­ÍÒÈDv×_³?¹ ôÎÊWø| #u=žŽëÈåšèÕlI‚¥t"—íŸ(Æt¾¿gû‹ Ò$fGÏ'&Y†žÞv±önãpÁL,UY*ïA¡@UFŒ¤ $¡iÚÐïÜAV`›•?ûùãJ~höÞt43šÐÁzùéW<$Ab"wëÁo}ïæäPDt—^½zþ³¿úá¿ÿáŸÿÅüë¿úÛ¿¨w;†o@΀tMˆ µÉûwFtVˆìºŽtûíæùÉÉÞÎÆæÒÊÒÒÒæÞY»²uÒïv¤ª½ß±PA8“NFC,âé´¤‹–¦Ÿu¬t²”Ê!*ÏÄŒ¸]]].×jïD_±dÀÚØX£ @è-pÑ}¸_¿vº‡ ØrWÌs›[ô‘ÚFI€hÛiužžÛ9÷G¥¸åßÄ‘ÜQ*€$*$zå·ÝM2À÷^4y¨GÞr§í.£09<˜‘Ÿ6Ø H}H¡ÏëBaEæÃµùag£çx rF=B¸+Šru>²tæ*)É› @Âä[ìTm.›¨¯Œ‡^:R±ä7Œ¤!鱩B»އµn'Þ>l vº¶¦¨eˆ<0C´Rtù±"3š¸½âLMؽx·l£ìa¿®†z廚XîŠÿ³µ9«ÓÞ [u+yñÑùg&DFò=\;¾^(Ö7‡Ç‡j%ÀŠ„´æÁæäÚË"Ckg¤»»+W®ŽÔάó Ú¦…é|ûìAôñË©Ë'Ý7 œÝ‚~èJ¥Ö©ün} P0ñéÐaõ¡‘|Öò2üÉyg{í ‰èÈ¢ž+F{‡Šë])4–Ê…üÄóç}VÑ\ìètàÇÌk­™‚жN¯žÚÖ¯½ˆMiöŠãJ¢«|Mi$i:Åûm©˜I«Klm}¶îF†Æ ºr¥û×;ÒB%‰záÒå±\NV_ýüÿóÃOž¾\=ªÙRèša:…ñD\gðÀŒHBó×Rà"ö[G§ÝPˆº'çíZ¥Ýku]É€$·Õ ¥±Õ%!ÁííµåÏ¿ZÛ:±Pzðr=44wýúÌhÚèì·T2iñÄê9ñ½Æž½É€¤?x÷ü‰¨i77¾ºÛzýžþk¾“èwQ×2N¾ÂÐwúÓ»õÑW¥¤ô‚ÈüÇ@ôWîl|[î²2lÌ:Ïô÷,*à`&/‰œÖ2·NO‰ÚƒVBÕSecïŠX›Ö×e|òƬkîwbKkÉßèîK%@A×.ânzúòr•ÀŽá€zs1à÷ ûÀ1XDyâÚƒa`Á9€ç…þ0-»]Þa³Úþ ü²Ž®?¥èM31"¡s3~Ö¿{Ýq1ðñx¯œ BA*1bc&Ò[‘ X² >žÁéåK÷¤{ÍÈ<©ÜÉ”]ˆüriFj¼e@Æn´ê5£zÜaY¬ÀÇy•âS;ô*uÂÔs㣌€‰Ðöºœ“n»¦te»([<Ô«œ·ç.­‹ÿKggQÃÊu¼-°º(¸xnTþÍH\)ÝK&ÎO·o%²Õ‚ëF5#â½ 2ý"5µÜ¸ =s‘ÔÑÓù£§mwûôúbf×JŽvJcÅ£ÕƒÙÙFÂ&‚Bx££Z3fµwvëúãŽPÀØ=Ø(ç'SÕ5‰çñ –AÜúˆ#7—N' D zMë–%ÈRaìRû×ÇR*×ÛDD gÓ‹šgÚèëe§zÿüø®J-×]å³`[$ˆ4!"ßþ˜]`p¾lj,¨sdL@¡ ´ZwøfÌôÃ;ÎüÓÏ^)¡ëš&„Ò 1„ i‘Iè_Zg¶×Á¹nymso{¿rP×Ó™¸ÝhÛv§Õª5ÛíV©U«–÷«n¿Zî¹ML沑3m#†ä­N¥‹R‰hfdzñæÄˆ©ÛíË[»Â^à¬Öz ^…È¿?ö²Ñ«]º¾=aÂÚá[KÖƒ³§™›†+SÔÁð«#yëêßn„ÿ±ýoO•Я½¡»èm¿=óºô­Æ¾®H:d”c#çg'Kp/ ¥´ézÛº•Øé#+¬N)“Y®ô%‹Øü³Ôì«N} @J w=þ­äÊjêƒú©Pˆ¶©œÎ -·hðRúöÁ• |¬øB1 G{Ãvïæ¥]öNœXÓæU·«6„6çô­ú´J®ô`PGýâÁsòÅç#ûë7rÕ=‡½¡¤xb¨Ã\LßNè¹7Td ø• ùÊ%AÝâh¸ûrlD-¹Êÿ°²ç×….Ãa…ÀÔm*7¥™%Ñ*w4ì;¶òê` @I^pQB‘0ŒÜÄ(0X”V+ù±H¹ÂšÓ“¸ã™ÕJm|nVüËÖÁÁÚºô2.•§Â¼°SŠo„ó2 :ç|%Ù9iÞHˆJÏU]3iGQó¾„á³µ[­Í‘âðѶ‹ÈÕ' ׆ª%{ïàÝÉȶUèrµ~tyDÚ®8Öß°{t£Vé×¾ÛÝ``U¾N§•;ÑÔE|ì¯çá"5€bùËñl!Œ`8\ïF:HÇ%­8²ü²Ã`b‡%Œ^äWäJ¡ßŠÔ¢ÑÏÏÜvzøuq(|¼¥(¿àóÍG‚’‚¾ý}Ó•H¢k¶_8¶„ÐÔ{wcÇ/ëÑ¨à‰¡âá4Ÿ~ºa-Nfz] 4 ÁŠ™ˆI‹ '²ù¨L‚é튗C„•ÃZµS>X~¹íäsqUª´¾ëØ6k³Û¯—u\ê´âñ¢Z?mµ8o]#`GÚ-«Û•H‘‘Ù™‘±xªõÚV#ádØ~,m”¬iZæO°ÖùØ8ùuvò³‰Ë÷'.£K&4âگˉoþÌ~ëþ'¿`–þç=0ücãü­±Gp«…HJ£GµAîgõ0¸˜Mž–G®œ1@ç&™>è¸Ì¡ûk›Ûe"ÉAx-ûޱ´>õ༈€nò¥úÜXhÅ!¸ßˆj`öao.ðíñ"¦Ëúú!Op‘:ˆ ™w‹lW`ƒ…ž oÍiOÎ”ë ¬¦ü¦>ß[öï†ä˽Õ2 xíš3<"ÊõiíuÆ@Uä‚€íª¡Û¿e¦^u¯ewKŽðd们QGÝHÌäĄ̃í‚LF5¶ú¥Ž€®í*ö[ f!þÀN ïè#ABרPGÀór¼˜:;ìä³ú‘Å=ÉÜé„´f©5<+þ´q6G°º¡\KIFŸÆ‘‹$óøŸšû,3Ÿ³÷÷£‹ëɈŽ1¸¦ÄäKçêrõv(ñ² (°ñ$û`¼Zvk7§ÅQt¨Öº¦¯uëÕÅhߎ³çGVw:Ô/OÝyU%†¾óÞjyx2t¶ëŒ¡A4ûA!þAOzjr$šI™Œ¥2Ù- 5d–#-Ê/vb¢ÐÛézy–äÁDèf¶Þއ½/«ŽÓ{{ǽJ©Ï ’h@$!„†ú½¿í4ÃÄ};¶¿ 6¦ï~k¦þ³?~qŒýD|l~T0-ýÅÖ‹Ïݸ¿ï·4$‰P7Ó…T1 „è&†æUK§zçÕŽ"a—ÛÑ\a"ŸˆrÅÜPq¨XÈ ¥2³3ÉȈáêѱl¿Õ G =¤#(GÚJõÙëu›- D"#w¯¦’)=þºç‚b$èÞ»å Õˆ~t†ÆÓ;­åñOúSó’u°ÊÙÞçêöÂO‡ÿaíßUXJ_áa ™ èÌy;ñiñæf‰,©ÃùÔDè émÔ/l;ÈHs½Rívñ)+TÐÎÏ!"k|Ô“Ü»[Þ¾Ü;Ì*°°"Zkco©õ­ùëMddÅv,tDc3í70ø›ô‹\Ò/Ðÿß\[{Ûcð7ËÇ(xR‚ÀégÜ•v V”®‡¦¢ÓÆWg.8ØÍ¿y\’ÀîäH|ýl!wV²<,1~#´ŠPÃÔ¼nïΙ{HRƒ\nu#íÂh¸»4>*^°T~×éi‚Iš‘šÊ…¼ ½d)3!¨ß8ï!ÛŽd`5Ø&ì,d ö£RI¡.2ÓÔÜ.ELJkåz!Ÿ8oK×a€n/kUªñ§•Æ òÊ–kyFé£Uýè"—qÀ^ èŸ\Êž­_Ïf[%澃N±/|E®Æ’ý%f n½Èß«Ÿ;{§·é< 'S¹í ö¯š}¡‡ÆwλbÆ*wË?°—¼^­vG;ª½J¼h\¨óˆAä«aI‹g¯E²¹¨@>qE«e1³Tš–Þ|ÜF0‹áÓsO7Màgch×3%3¡ë»¯;¶j.š›SÉäFI)Å>ˆ½à$"M¿ô'éÞauU/¤¿.;Úô;÷µ/ÿâUÉ#,2II拞ëTV?}ѺwsÒh[IÓ)’J ' *¿™e À(²s—g” ‘³÷ôµ/†ëk§•Óõ•½ÝƒÝíµí†ªtí– /¥ÃSC±)€;­nÃ]aµÎ{®K˜»:™ i´}h+ ‚X‹üÞÈ“j×Zœ]Y»/Ë÷_ôß=ÿ"´8î F]J>Ï|´ýKú…ÿð”•ôÛÁûCèdîõ¿¼]\’¤@²){3“înWƒ@|ëÕšËù“JâfíP‚[»e •ê®r'ó/† Ë]båÛ½ˆçþúÌ[í嵇—6Z@èt³ÚFtrfÿœ}¦ç }‹ÚÅ›9 ‡ò Gí©¿ïó z¬Ù½ —5ãæ”’ mU¢ŠmL™_+°ÐÔ\Ôíìop1_÷_MŽÒs)ü”Tå/ a1®­åÒý—R¹š”¨˜%!¼d@DìÚ‹±Ìçý+©'-×<*ïÏ© 4ÌøT!äõ὆À¤.¬³ã°e»¬|L"~cCâS£!éZ¼8ƒ¬ìêÞN|t¤UÒŒ‘B¥iÛ.€²íˆY+Ÿˆ?=ïM2¼Þ“¶”Š™$Pˆà*o$´!‘jU¯g#çµ›ÑÜAÏvP©¤ò .¶·on—®FŠ/šÀ aëeâþh¥Þ߯ޙpÈQt¡~(a7?ŬËÌÈz£SHÕZ•™;»ÈÀh[l–rSÉê²|ýÃä ªÞÈÑR“3úp:¨¨^Ò»õŽ#A±0õqøüP¤³Ýã–Çx%D(4¢;ÒCýÕzße—î¾ÐQ{d)öuz¾bƒ4ÔÿÙ°u´]Ì(pÂýWíÈÝ÷&ÿã¯Nû Ò¼3mpãW«FÂ`0ê'ŽMÂ9~ñw›¡+/Ñr%°†BKå³Åá^$^O®øZ˜Ù(Ìk;{'¥êáóWýÉ©¬Ó¶\ÁÀ ز¥¬Öê•d4枺=L iRõêNWºçÇÒmŽNš`š±ú=W¡0†Ÿ¿„ºú¸wz ú‡¦9qíë½ìÕ,#B#^?|Pøasö7wÿ¼¥äÀ 7ðÐ g{ìniõ]±ÃLl»±Š>6î쨋!¼_Ó s¹UëÜzå0¢ìŽ3Gð°ëj¡Û/äõ•ºBItV¯<¨lž<œØé0ƒee¬óÜääË“Ÿl€ƒ¬?žè"›Ã/UI}#BÄÇÿ]Èpé .¡i×gØiКKzl<±>úúX±}‘ÁôšÈäÇ« g&—xÔ¿œ|Þq|&%û^MB"nqL?…Q~츬ä È@Z?$@$ ¢v~"Ò]Z(ضgu@T€(L->Y0™¸¢ËDñü¨¯»–í°òH, =µdÀ"$M©ÑЯ¶Oö¢£nå¤6;}^u¤"Æn;‘lÖÄ¿<”Ï¥e³b/Ï`®â=§8À´z…˜S·îæäÎat>bì»Ð‡˜Ð®îõc¯rÉçæ%—ûšT½gé‡c²µ×»7òD^¯{èœß ¢«U}Ϊ٥ßr–X)Ù½Ú«ß '¾èú›‡È“}iÎÎÇù˜`@>v¹ÒpI'B‡%¦&vŸ5QÙèù¹BŸ‰Á(!e¾m ±kF×¶%Õù½Þáu#±ZS,}e+@!„Fñ?¾îî=7/kÊuãíìÛøè‡ë;2ïþƒ{Ù1wþÃÒ—Öœ´8§=‡œýÏþî8{ç­«a»ë CÄŠ —&âä;š”Â`˜Á¨ü;A²Ž’iäá\¬a¡Îõ•§¡KW‡-›C$„`ÃhV]ÏQC¨3==’G¢âºeS(–M‚PµêY«V—†®"ËË¥vÚùཅ\ÓQâ­û'ëz¹p5;&Ï_ÞpŸ¿ùu'y+ÄÈn#¤½0Þ~ýµù­‘¿X–‚3Jÿ%£Þú›¯Ï>nï¢ìqd¤8\:•ä;ux›RñéÓRôfõX·¯‡cû W87NNo6ö<¾¯ÿ8ScëÞ­Ó×­ó«}F$na¾RšÉ¼êƒ{¥@Fåó€x|Ó%ÀPÏ­Ç$HÐvaý#Œ«óJVqÍÑõØPn³}r Ù ”oÈà¿·ìC„@i\ŽŸ¯\É7ö,~ÃìœCI„®}6+^×%ƒTì9š\?«•Hö¯é'Î|æiW‚òš"åéÏ5]¤gr!vD©oˆ8ÑѱEÒr“”µ›ßLEg¿Ð…¦k‰ÉiØ=i¶›ûÉÂhdç‰5={vîaˆ:--Ýÿr_eø¢Ô·å¯ñ¬oü¿ñY»Ç#3C½Ý;Ñ´:@vd'L[ÌìãÛÛ[w£…½CfÒ:/ãoî¦}+:>¹š[n’Ùš’\%x¼½^,œvϋェ  žýáN97<ÜQ8È¢öˆN¾YÏóå‹ÔØ„VȆPõh1»àÂläÓ}0™µ{ ^xS=ú–˸=j-ÛJ)½ü25®w—•RHèg¾ÒI§ßûŽ{ú”& ÄŽ¦ªwÇkùóJÏÁÅüƒ¬Ú|ö³ñì—¶Sž?,*‘¿ó^Ñ­(Tµ·>ùEsôý·ç}zð;7Óúd&¥—î H¨\rÀÎq%B¶1{ãB³Å½ç¯Ã×ç£UI"„º¡ $ªiç#=7YsRÑ„2ÜR¿Z/Uê‡Íh:i—mƒ{C½^³}A¶cDÆï|ïNÁø(ÿ¸[ëÜ{r5ÎK•¯[ïUž@æ¦ÎȲ·ž]MýM{á·–ÿ÷+ï±V¾ÚÂ7…!ŠÖÉÝù/µwv‚ÉBŠï.f†·K‚|+@db՟磓‡ãË–b†nq b˜ö;ÔŸÖ_͇^K÷Ô ¢¶ùîõíe~‹6 H[zì¬?6+x'‚:0½`ò9€ÕÐ{yQQ V·0teA©¬õ….l%Ÿ(î£/fß^ã³g°u%!žEg"Ë]„“d?{ … —"úêLho_J?ʈè¯÷c{ŒfDÑõ_̬M%½u¡7SÑH×µìLÖdT¶@j×"0¨ºo‘e¹.³'×ñSÏýlPY FH:&Ægt¦ÞY§ÙQ»<–áÎÕ+=ôب`õô¼øÓÍhQñ×Ë‹’„Iú·Gðª{'‹¬ƒÅÑÄþyÿº>ÜØÓ\W78Ý {?KÚ©½j_…[è2õžïN•+Õ÷2£g¶¤v³cÄ4íÒúq{N–»{^1"·v-²S}häž6H òA–î øCÙÙx|8#@ô UqI#&e±“œÞ}ÔQÊ&ÏN¤¯þ"$š6óN±6Šñ¥šR¨N¾wR»¦%ŸtKDVÞ¼„†:½ý'xúU{XŽ‚r„Ô¯$_üp£ÓS#ü'ÃÖÿÏÏ Ó]Ü>ö Šš× W>z'ßnKVݵÿ¼Ÿùàw¿=ê ÈRjäK-Án)˃í¬¸ét•1ùá´ÓÖ¤Öxµ:té²ÑS7(¤‘б_O¸®NB×Bô{ÊvÛ-·Ûéom,·’‰‘BÖhæϪµtœôîgGGn(”½ò^Þ)9gâ£ÓÒ=è~ž›ùtìÚ“usøƒb»–¯Ÿ½óõ ó>,Œ—måê#?.Þßj =‰Xž)V: îÅÛ† †fO«x×9tY)eÝ4Eœ:¯»2qõYäʳy®÷AIÌ µý·¯n¾6¾;Œ¤@µcúqwaáøD`ÈA—?`€ kþ–ÏÇxû™ÑÀ@^ʲŸÐã^5¡³W¥[…ôá¡õ|úåŽÃÒ{ðýP cØ ÔìÂd¼¼3—oìÛÀìe‘£ô‚45S‰æ²ãz„w x› fö/SD!7b‰gx9ýªgCÆ BC]d&³&#w5TAÝŒ~Ù É®íy™ì²¼!¬"B„D¨i˜›Ö­r»®ÏÜábfsmöÚ’ÞðV¸-ÿã‹lQ©/ê¶ãJ`öL ¾ð*ðß1ӳƈ¢[zKî¬&1Wj¹ÜËÊ„î˜^ÍT¨ª[“Ù¡ý},DY{¿P®¸ÛéÙd«>­6]àæ½FXǃjɵóØP£ÙÎ|ð²J ,íáz©0?ÞPþˆ8ü­!2êéÂtt8AFêV@Vš&°ß†ð|談µx®Ü$ÿ CDDÞ_<Ž;(4¶¤Ë`ÅÇ^B'.xü doisÿ4Zþõù•ýì„Rlh øÕOΛNôÃ~Éþüÿñ“¶-ž^ï¿RoåéÑ_þtË^¸öÑ]£×GM#ÕÛjŒäL”*pl)¿øóYìÖí¸×äpǰÖûz\(ÅÅ[cý6»XùêlìòX¿ÚsY!(%Ø­ë£ØG4¨@5¤mK‰†%D­_nU6WŽÌ¼›ÒŽõ~*mz¿ßXY9u„P<6—[—§¯o«ç÷Ò׌ÎΰëjõN®\eÝ~øø'ÒQì¥ÕûÜlOñAì׋“k6ö@—ýé!Þî¿H3BÑè`4-“B,7CVÏU •º`¤ñ€ß9Ó D¡"11i2Øçf[ ì¦b#Å£Ý×£}ÛŠsWü¯‡†Øùu»oû‘'žZa º¬QÏï -däÖνH$yÜ‘*—C5S³#Œhgt©|[O¿j£‡¥ï­DÞ.ÖªÎáôhþ4“XïI°¯b+òq$ éä³Ú¼¬ZåoiKŒ¬H–¯…êw©§-án~ƒ LH¡Ôt>>’ÐÏÛZ¿íjB Je‰âÔÑWu—ŒLü¬,/B\‘PÂïæO ½„õ«|þ©ÅÀÜûgö-/méÑ– IBKý“©Æó£âYëzZ)Ô´ÚϵxêÿøQxíÿþŸNÑ@.œÏfžÙØ¿_Cxl¯þú—{úüÃæcŠüÓï¡tù:É„ "/: ,;¢!+@­Þì‘v¸q€Ñ¸8|kÒîÚŒÇÏ`r1ÝS^ ]ë6rG<)”¥ú®#5Q®ôº¤Õ››•dx3Ng­(®œµô¢:?+j ‰‘GCýÕê½óo—¾¦Äå!¥\qf&[C_­›¿ ÿîœ]ô«ÞЋaõ8:j7{¯õô^jÛb›cGéÂXo‡£xB@$Å‘éÓ3¾/×Qb|"Æ›®¼ên-⪷Džxïæ‘ûN~íÕäýƒ:èÈÔWI·”^ȽìGû¯m ¦öÃ{ñ¢Š MÊOíò€ ƒ7Ûßž“1s“UvÛ„fnj3“}µcSuõâ$$D&!ºcÑ­ÒµÄvÕ`ÿïÁ< ¼6vÇÅr•Y±w¡n+˜aãv8¹¤ÍË}?r Yiš®k™‰¼©ûRد2KÚQU³:®T(FŒ7RŸ "¡SrtÊdpÎZ݆á@ÍNn-ÅßÏ­u @ ƒ+þûWÓiîþ]ǵX2(ÉÌÞ…žøÿbúÍ^ŒÝÓ‰©ÌÙN÷:¦è@J³C‰n\W7œH{%7–ê/³VˆÂZI<:hõ+÷bqŠŸU ¸0½2¡Ý³l ‡ûë4ÜlÖSï¯T„g€xo÷tx*VÙp ”ð¦€ü,Þ6H$ŠsÑL.ŠÐ)ƒªZ€ˆàZ®4¦C¶º(¢9û¨¢„†BhĵüÑPó“æÝÃf†Îhxçz8±y&Y! Ýøƒw¬•µh¯¹«+¢ö“ÕJ/òƒ0Zÿáÿºîè’ RœY-A÷6$ðçÙµ_=ª'¯½uÿ­~÷Ãõvë冩#‚¯ÞNÐ  tu¥@ز*7.Ow¤£Â¡›3ì Z›±Ë“ZKéBC%!$°cŒÆ5!€ ÇbÅi¡~£«H¶ÃdmWôÙvœZ§V­Õ£Ñahu»˜4Ù>Ì=Îßx¶m¦¯ÆÙ‘b{Ô[ÝþðÎO?u¤—jíÏ[½¥5ˆAP£½uùÚÁö‡½á¸lNåFΔð=ûÊ7è¨ ýìtæêrK( ÷fȵLi‡ŒdWzÄê¢h÷d½Ä›úG±¥µ»—·º.’roV‡yUúN_ áËÔ€üÌo~#IAð t0ÄBŸìEðÍl Ò'î0T𸦉paæ š_]·õ. ´À "["@&ˆ­;fsùR¶±Û»h—ȳG#!Áäv’‰l(©@ùC‚ ¤Ýûå€(‰P³ãÓ±öÚÕÜÁ‰ëÉ›˜AÓHÓrÓy,G…N LÔÛÃ~ÏÉÞ(9È@P„ò‡BÔµøøDD¡:iöz$HÏž>OLÍ·V—B÷ÇÏêLÄÈ(þO¯\ÿ¤¯,Å R)_mËoßø!FeÝÍÅO6Ɔe®QQRE¡Ð'“ÛBD9½y|)–QG¯_ÁîJúnî´Õ5'’öוâðõÕ ]ØL„¦öFõZïü7£O$#WoG·KçM¬yaàóf‘ät!•˘€Õ6wë.²R®¥Åf+Ÿ4˜™xõHúD8"DÔ5ŠþÁ¹:œ¨]½‘xé([A OøÆÈÜkµ'ïÔñ´,D(;·k×–$ØA…ƒlJ_TèA u3~ê,„W[.c 5༠Ž/Цž>Y—®bVȃT3O‚àGZrw1™ÿUb2òÔö3Q˜‘P&rSyƒz¶Ò5½ã’§ðŠc÷–२òEê7»!!¢®‡'&¢Lò¬Õi³†Zª¹¿™»ÔÚZ²ßŸÜiøŒÿîÕ¥(4¿pܾ” ßTó÷ÝsÀ@`ò‰í  q5ëg÷H/œ×² G»!@rjQ¡“|›‹À’ƒÌŠ€¨·’;|hÙ¡TX/-”έ––ÂÄù^gRDFŸr¡Ñhd?xZ×úö‡Õ‘±äÉf°‘f …>S€Q‹¦CÙ|‚Ð>Qn­¥˜Ø‘2>_Z鱈§åQË÷¢Ç$$1ùñI¸o•ÖOBw7K(YV6ËWÌ×É 5õhê¹–>{Ñg=óÒ¸"ÆÓ_ÔÜûÿhªñ—ÿë® ŠêÚXùRäsàþ[•"¶WÀL¹nÅ Ô Ú´“él*D€¬P ° Väo4Oo®NKh¤€Æ z½©i (wi&Æ»çúøh:‰gS‰d, '‡Óº©{9cºîvY—4;–I–ƒz8•.-–öÉž aýçcN§g"絊¥¦®3š$&†;OšÚ⺶ÞnãɧÍw®þô»J¡ï^aŸ13PÔ3(Q)=ÿ"~k¿=0ë½é±Ó&f_‹ ‚¥;M¥òüÜVM( æ êÉ0ö!X׫‡7š;<è fz ÉÞ~×~^ý0¼©IrœpøÔ½6¹^ñõs¼ˆϼ§$"Ÿ¹‹o,ü@$ðÆÈÐ/´éÃ÷×ùô1œ^ØÓ‡WVmч7è\^%ùpZD*²;Þ»R(XÌ(½ßGW‘¡_ލfÞzî8 #(R.±JÁ&KÆgÃåµ›¹ÝsG*ïÅ& ÊMæ FÕ±úE(FD˜G5«ëHéIÖ¥SÀ PÀH…Fѱñ8#”:¦"”°Ï»ÖÌu{kµõðòiI!ˆº|-¥O¥²ü€7Ö|CªîK©=³†ÈD@²VœÈ5V32šÜë(2Rè„D gv6î…‡6ˆQy1ãËswEÉ1j™¸~XÕÞµðé$ëùÖn¤¨rƳx¨ÞÛÿNâ…bÁêÓ±ýƃPòË.ƒò†Ä¤å¡‘Ÿås@­AýŠƒ`²R®Rá©Ògç F&^>,² „ ðö•Jn'™>¨U>‚W¨ì¡™¥üp¨´¡*ADšþ¯¯uš¥Z8% Ji+/Ì|?¶ý¿ü¼… @) ЩÐJͼ®Açí^µç–bV¹?ù§÷âÜ=y½ÏÎ]ž¢np¿f ?–Îß¶¢Úíqâ ‹ÔäìÄØP¶8œ7…NÄŸ\¼výêd\ÓÅâèðP>WÈç2™L&ly‹Fˆ¥PºÝh+Íí8L‘xþlÎZ–0š£û´}vTK]‡.—±v;In[…)”v‹¶À¬¨!|±”ÿ~åÏÒ• À®Ó›÷2(áqLŽÕ;ñ_\ž)•æJ? O”\Èï½u™¸\:¯} /+…zÿmÍjLJvºéÈ«©Ðš*¾@$2R{óÚƒ³§¡÷­}ÅB¡kGð8;—_j_L¥I½aV‡ ?à@ŽÏ^EA¾qô MÛÀ¤ 62ïÔÔÙ©¦‡S »0vðÜEg 6òJ %×84žÜÖ3د‰ð¹bèúlZé‡ùxóÇÎûs?ýZJw@„ò:Ë`àNÞ öR÷ð³ûÙ׬4‡ÝÈQzxr÷…âAt3!;#éýúÜÂj“ÝËiý b õŽcîe|áiËã… z3Ž™:;÷®ï|‘üøôIHîA²S*\3^9ÒƒD_0ëØWÃ^hÅ‚ä__™ÏÂû— ¦÷æ(&d0Rï nt[û$(}ùОÚ]ê’Å^apú¡„yo UœŒo_ʯ5%½rIb°6@A‚³SZ#yTW®’J½zPƒ°Ÿ z¹Éxuk1»Úbf×4“F!HÏ5Õs{Œ¦õê5s½Ý‘®%Ùß½IÜÓÌ @ÒµÐÐtŠQUë][  rÏÆÞÆñܽÔÊÞöÍ­C%”øãÝ«:ž>–~,€bï¨)üT&_CìѹŽWRæÎÉ}‡ËUv*®÷ÃC½ãœ…ƒåÉÜðÁ¡d&•µ»—]ÇÜSYñò³¥±ôá~ü«/?Û>¯õ$ òŒ„ LaS3ر‘ú}‰¨'ò2ž}îblÁJˆ£®’ñ2Í­ýK¢?bXÍÃQ·––ç®Ì\Ë…VV“?8úßú>&°] ‡íìø~,0ɵùk§/?Ö·I‚Í„§ù‰ÑÍ&ÂÀ€.Òl£jÝ×Ö]&N,€ÛŠè2s\i¿³Sºyz¨àÂà^škϽ~¾ø`£í"¢rd¦Ô¼vrÀPŽÞ7‚Òiå¾Òë®aJŒ¾šŒxHb¯ÿ`d͈¿o`³×ßÕIO_*Y“¥gÚÏ6¤¿Oð^"MõnFøñô½ÞSˆ}€" Â×L£[ÇŽDðÌ»èö|"‘àÆõXäéDÞÞ°”BRÌD‚4MägòwmKIàzœEȬô©ÈK$Åg"ú6)D¨éá‘™”Qm¶:2Ì”ë8,åî×ó÷Ç7v__ý¸·/Yüƒ£«:­”%™½h@_¯¹Ã¾Š½),B0Àn«0–èo§G«æèIU†u®™:rxÃH²V|ܼnä^´=Ø. „ÆöÃù¤[9½­7•ýVEdðïðfk³5-™D§ÙÃﮕH!€Óµ6>;Øö÷º>°‡¢©K¡Ôp\G@ula§ê@–Ž1T|ù² Íñi3øº ûÿÌoZ}·¾øhÕÐ+•[Åç=PJµs™æ…|é¡™H#ó¿Y¬~æöÏZFüò]*%´ÉLéÿý‹{“_.k£Ñ‘§ ßëfsÿÕƒ°ÛØûêïÖz\œ4Ê{­VUØô1€R3HõQAú«˜‘•£4<ÿÉêÚiÃr{¦•Jèv·csåu%ž¹sKotÏwß]hÖÝÚÞq_JÔˆØQ.i¤ÀˆFPA,⛡p$+Ôð’Mâz; C…‡¼,ª±ÅÕó)ÑïhÅ­Þhkÿ¨@#PixV}wäo—Ø•Šƒû ÉöÖ/Šú0ìo-\Û<ïì •ÒåéÜpd³Ežf€±Ì¯­U$Ü&QQˆðQÁ]š -{‰?Þ­U+0pýäãñ¥W×o¬t,GKžªù¹õsÀ …ºOªR3_†‘OÜd9<ˆã@ð‚UüŸ‘é‘ÂØì9»DFj±QŸª}ni–Û O§ÍDØÓûš@êOŒ„_÷âu=ýÀn€Àhj! ýXmÍaÅJ±”Þ¤ÓcÜ‘÷?ó†Ýä|äüìRìy×öØjDš0Ò“9;vÏÖ(š&öÆ\j¹¬@ú¹â¾0°W1 @Aº.N%a£ÖêHf¦_¶]»ò,ùöÂæÞ‹¡ßo9âïŸÞ¸ûZº–dö‚I,%O>áÉ©%Q°KA«µ˜ŒV·¯ãy1µÛ•)-®7“ŒšÚ A²º\NöVø•ãw ÂÚÊÒPµf]U½a:øln²´WihA½W}?ûB ‰(×C»½Ûáèã®òòâ}" h©Ü¬YÈG Ûgd×[d"*ÇQÍö~u€ÙLù´ç+9ýc—ˆt1þQ#TŠ~~$¦š~ïà€¸v?¾w)œZ­3‘®ÁÃß—ËN½-¾SSïü/ÏmR)¥Pxëq]DLuùä@ô/i!=;Q½ƒgOVk¡Â¨½»]sS™l:›2ÍHÄ0uì-$ˆØul¡¤”Äkm? Èi—›NǶÝÊþ±‘L]}+Ѫm®¿=\–áx¡˜ŠDud«e9í–¥ÓÃù˜& SÓó¦=Zª ßì&ÁÚ×ù¹f£svyèil *'™Ôy6¾U‹'¢Þ5ÑzÏãíýeÇ‘ÞÊ 9 /sÇ€ìA!µÞš}wë„`±nUfÆû½Q#€œí´ßʼ`žOi½RZ“‘£VlþëôÌË6(¼èt¼Xœç72_<]r¥åÈåÜr=¼6]”½Þ): -u _d˜è"IL’²ù9b€B{?Æí¾»Ml$æûåÙÚW–ë²ïÜõq ^þ—€÷Å…#îòålm×V^|€B$BhjbÒíFÕ#K)f—Q?=³JIHܼÓÏgÛ;®O@A!„©é¼¨ÚV¿ qS¸ŽQG£/k¶båµëÁ @]X ýkE#DC„ ³جµZ®¦QÂ=¶PY.7V#w®î¾J|ÞÔ¸"`wI:ŽbVJñ7–ýZ•üÓÕÛ`*LùÀ]=› g4êwŒ†Á?®Œä7ùçuO­H(ϺwÓæ¦¾ÐI&÷‰é“QèÿjÿÃäÚI1 )«Ýnµcïoœ!"(Ûþpý|j8¾·­ð›QˆJÏf"#É:e*MÖu ]W .ޝ=ï)ˆdµ“º,â‰# Q(¡]½[ŽnOÒOk*E¥£¢Ï»xÿ«Ì„ÖXS iZæŸeÖWºÕ#=6ùqÚb0iå߬²#•RÒŸ’’&bÕÛêqHÆn³!•Ó\þ|©²·wÚL‘x1QÌ&€ê¸$t 2ËV0H {†Ð:ÜsÇu”kuE<"P²U²ÂFøÒ\wï…{kÎjˆL&iÍv¿Oª+%°ý²CñéÙK“#Q‘Œ¨¬ÚÕÕ"B*õNâÀªÉ›ÖÎb¾s´=eÍài 'L&V€•œÏýņ”RÞ5Â\LØ‚GëûÉG ˲r™úÎÜôAÅF "ÖåPú¼2vm½Î(‹ÓŠÎCY%çêzýÞþ¹$fþ¦1Úû–Õnæm~Zûˆ6%pßÍ´ÏGÝ [ @äñ? /ÏëJ\pí.þæàö÷:©…ÞO(·%WQñyy4×ú²R²/‚à  <¯/ "‚î\Î|žÆ¥Žƒ‡<ˆ³—ÁºFŽ®½jJɬ¼Ú:øÍ Q"@!Í…èioB[é¹¾!@hhhÉÙ‚Ž ºV§ fÐÆ‘ÓlÉ $yô^/=qpx»R u]OMä¡Wîô\!ÂIqì’㸎ÛY£›×ÊKú‡£âw—vŸ*×ñ‚^D(]„±’¯^òû Aö²p;c±ŒÜ‹¿(ŒVNUTD£Õ8±] g9j>Â…8.Û[›Ÿ†®ÆÛõ«Çµ)ýHÝ=.hâ«#õÐØ«L›fTöÊí“ïE^HF@¬= ƒÆ[¦ö¢¯<0à‚b¹Yc¨'ì–Ù­Z¤ b%¥¾d}~è2¥2­³>"2³ÿ8‘ï-œ$VO~m±™¯vc—+ ‘;j·EôeX Ôÿàaåé©:zê{Å]ÓpÉ€•?Ûcב \_+GHÀ!m¬6Ÿ|Ö ]¾ªªãç/Žql¢µ¾Ó&M£Hz4UÈD¸WíX,È+Ù¸ôt©5 "MivB™‘ɹ…·>þÖÇ}ðÞ[÷Þ~ûáýë7oÎ¥t8²pÿÖLËœ˜.Dr©¨&ĶÝi3[®¡éý_|òôëf¼pi6‹†ðX‹æÂBhGº‰g\Ï.t¯˜õjïÊjm±zÊ …¬ôb¶òW]ézDdôØ>s´ÌÈ(Ü#ãmzr+½å ¢ƒ¢œž,ì×U`u@daÍ·Ê;‰¨@Þ­o%4Lœu&;Û7»›| «7fðaw¦Öž»7NÁuÓÞä¥Óƒ‹x°€†{‘ŽßÀ-3 Dc¦Ý¾áAÔ°Ó|˜SVU®›‰y4×ÿu‡Ùa_¨ÅÁÀÖ»ý…?´'¶9ܾ:8–àix½ • F$ˆ7"Š´¥²«XJ‰¾Ò—!Š$Ô•xüÑT~ÿÔñçB#Aù©‚†ý~£Ef†ÐUþ°/» X+~3²#@#zb#B"¡kZzrû¥VÇ%%ââ°Ž#]%÷ökã¿+¾m]\_‘®+=Í@È+Æ+ö=ìÈHƒÄž6¬òµÊbcº¸Û1=SÇcä|g„ÌöÆHzï¥ÿθGW‡cgcýOƦÜòâI"ª½ªnT÷Õ4†ãv¥ÚJ~k©LÈŒ®|{åôR>½qxèƒÙ¹0ãÅÐHÞ >oA§¡H ±ã¸0:ºñuKp,oW%¯TÝBãïNÂûן½rÊaµüžzÍÀ`¥¦_̧¢»`ÀÂÃë s¯‰þöâæÖ ˆÓs$¥#AI¾t aâ¡OìÓï¼K Á~ºËÅa÷ÅzW˜„ˆ‰ìH2Ÿ0ئX<¬av ŽvjN6IÌQZ‚ðøõ»÷îݹ½89RÌ%"…n t¥–š¸”f}hf$Ñ;PoUk¡h—œN¤8Q^9Üþì—wÎ2±š™XHO±‰U˜iW{͹ÔZ~R–bÏLJŸ?§K1…ì Ù@7«ug9‹ÄÄñ"y^f îÎÈòëq“%¹é,?ßn{Êï !†ÜðþùÐãcDq=¬Œ“PÌîQzh9•}m úæ`kÏ€„Ì­Í»W¾œ|¸]u…× …KÚâôó:]¸ê/f€þ*ñ‚ÉÃCÂ<ˆ|Á ýÁ0î +«â®„‹¸;ç~Ñ`vÚ°ßWû>bFˆ rÿzB¼+47m¥ƒá¯ØÔ„˜.*0¶¥”„Œ Æ~ƒBpl&¶ “Æs›Q±bÒ ==]Ðd»×é˜Z$ŠÜ¯·‹¡Ðë*#»"r°àd„„3! (4-;S»Òhöõ¤vlƒë¸R2¸Ûg7ïv–+âc÷&ãò†t\×ÛW^°Óàñ½ÊGÅÎVFÙHô0?þÚ í·#áh¢œFàð^cŒÂëæ¥hø™ô¸Ñ€L`·®ç„ÈÿxÿÖèYTã,uÖïÌ,es ÕO:§ßŠ>UÌ ªvN:÷ÂÚ#¼07o C(â‰ñD~(N`ŸI®t˜P°ê;™â¯öm¦T¶qÚô\~9ƒB¦ÿ®Þwú3¿Úç>„3ÕÆøåWT í7ÄŒz¤5ãŸMì=5KgFòƒ‡»_efºôä‰k9’AIÿ«c š®årõKùwI <Ò'œ•µ&jˆ€ÊçÒ™£‹ §ÙUm"²ªíöPNøK B¨îÑÒó§}õÉ_ÿåþú¯þæ¯ÿö§Ÿ~ñë¿ûåç[¥h¥R¬Ú]RÞUf²0š‹é¦í6OëF~º|ªôövž×JÆF&Ò& ry2Tsš°Ø<šõjG‹¼vŸÕ³—ÐÑØ DvˆŒù;æ™í»L/Ð5ï_Þ`­/Ü\©¿{zN@ ž^šè÷h“f­·hWÊ咽ÃиĆešÝp/¯Û××®PVóâiòøæñÃÉ ó[]D@éDá$»[¶ë¿AÅÏþžÂŸNó…VQ\LÊ£fyò0^+N†~o”íºZS,èÛÓðYÓF›ü«Ÿ½5­ a¯,¨Ëâx|ãðjüuÛeöµ@Ì~\CÌ,°2*«¶RÌ2Èå½8Ð ¢²n›¸4ŸYj:J’B ‘ž.jªcµ;Œ C·QK¥ÌÃ}©¼ö‹'¿.öª?Ø—„®eçŠ Ë–…d&³K×e©Ü­Ýkïjëâí*ãÒ:[Ž }y€á ÕßÐy¿Wˆ®;c'µÞ:9ÕÝ…X(Û‘€Xo#RpSÝç³©âæ 3²"D {ÉÙÄÊ¿0¯ŒÈðÑn¹Ýó·Ã{ûS17F'¥fæãµ*´BÖK‹é¡ç§”‘ ©¡‰x1B@nÔ°_vP‚ꑟ8üºBn$kž•=˜Oø"¨aö-ãØÌüìœÐFܲõ­Ò&Ëúco*žyÖ¤¾ßû¥ênSäòwJŸv¯æ°ÿ×gRº€,]™ªœöu–áŧŽKã‹5¢—U+V1âuOçÎÎæ;;Ž§ç„ õ•ÉGp"s¥ú½ÉG[§W•"FËNuKÓW:›. ¢@}}âk;X­1Êåü/Ø—+Aà û¿^7'Ánò–"36Ù™ÂÏj6Ú0¼þÑŸ0Öã(Pg¸Ã‹…ÃCéNý²™¼`»¢+½óÒ’J¢%aðk«KO΂°[œí™E{ÝbÉ(QÒ(7[И±kµ[Œá4iò¸ÒûO]ÅŽGKäÁ¨†Ä {ç"! S¤Æ‡£¬ÖZ¶©é©ønO)Gº^èñÊâÛÙ ñNø*ã‹uv< «ªúbŠr¦t‘ÎâÑ"Q;±H3ÛŽŒ._+ž$ŒHú$®¡ˆ–÷‡c<¶vt]˾l‘b`BAzs$kŠþ³ÍÑ)ö'4{Å‘ÇîwʇýA¹êIkç·2½s½üÀÙïß7´çv°0öT3‘Ä\*9”ÖÙ=ìq½Í$Áe Ÿïô€ÒCÍÓî›ZqdB‚hú£Rbc²û«ŽR.§Êٕɯ]fæè§™I!×€²œü¤ÖYqôÅßãUrw åÒÙÏ{Òq•Õã {PP{øPWª¾µR ¿¬;(5¡E†§’ŬAª²z¸vJD S«• a¦t1äÉÖ”µÃ˜`$³Â=Šš¨ë$t]¤ ¡s»cEbÐ_y=R v-1Ó€P5ªû;ÇՖæJòÄúÝh¥iõ„‘Év®.?[Ù•!ÐcèN\?ÈdãTŸZ*ŽmŸèu +[€bÔš¯Vd<ýàNó\j€~Pÿ8;AÍ­륇#?¿±dsŸ´.NìÖƒá4##“›³åûC¯]¶o…ûB•Ó:D¢¡LbÉñîã‹Ö<àg£$ÜS„¾>ûìºÀ6䪫 ›§ ÐÑ ÜaþXip "(?Dƶeæoâipä2hÆÌepJ¸®8šŽoLê_Ÿ2Ùý%x’@ ‚5VŒ}é,¤ŸXRyùÞûS!¢…ç“’ôÇ=<2¾ÙƒC@„äu“&£K5ÂJ:èzf¢ ¹iuZD¡X´]KËFÍg]W v~8ë`ê;Ùȱ‰aÉ­V[}µdt·ÇÊRŽÃÌÌníuþƒñVüŠâ'hI ìE±\8x €¼c–€™ ˜ÈéOÖ‘f:ý).¦wj©pÊê% >jLÓ\ŠŒ¤Úkž¾Y#CAZ‹n¯ÝJãÉF/ZìîMÞÙ>Ê@KžuB- &€~ìþòéÕlfåT1{_¹B3–Ÿ ÁÍ’Î%WÓ4dÙW?û¼é’‘7Î+®wl!" ¸¾pç4¾uiÿ ×4RíDßY? ,½_«^É¥¾úîÛÛÛã^$ÿ»ÙmFßf¶BÏ^JËRRªA21 ýþÍÅîÏwì™@ä• .’ÐÍPjj~bÈ t×ëò\z(ÖÍ¡ áÚ± Ù"wÝJtB"3aZýhƒ…H€Óè©Pý«Ælº»Šˆ²+%Ø{åÓõ“ÍCÛŰŽ4÷ÁÝb^¢“ì_k¾&wBz×Ò1K%kØT­ê„¶»`.5/wšQ]JÝí,VŸ¹‘“—”-<œ*5` —»/RY¼º˜ø\¾þêf~ÃQKäf'©y\jÉÑÉóRêæ~IñLÁ­åNúy0ªùÆÌfrPJõM2ù0/Ï»€H‚„ŽññÑ—›mWcu™û®£$ac9õ¶x]”üìÜé³ À.óW0ø°1èàƒƒC3*'1´/²0ä|61)¬h,[ Œáæböts>œ{QGéC¡T­7aòFãäzdD[ª(°Žïf·§ã2aovª¥_JF…xþÀ>Ò¯jÚc—‘=ý$"…’S…ðHÆ@yni­ GE‡cÏ—»$â¹N©ËƒHñ…„Bè÷gëúñü³×R2K­@õÒ[á— „ÎØÔÊHÖ(ïeÿ ¯´OkJüî¥gÏàáuT®kþb×q\–Œ2hU‰PGùÇï»ZûElȈ5¢¢vªl$¡ken¿=—T øèœ†#Ò…¼ F‘àéþä•‚!¦Õ÷§šqTÆä•œ&[RCá«„½±»eÌãõÌT¾i "ddpvÍq¸±òüxçÑJOEµÌå»ï<œÏký)cYݰHìö쨎©8íÖLµ3×ÛˆÞ 7í˜Æ(zNL´÷d÷¬Úß6³S÷µ#û$ÿKè…^^#"¤îu^¾%¶˜…k£y01ÃgM_–Æ „4I·Ôx]" _¦“¨V)j”8=,_-í³`Ũ¼»½HO‚Àˆîæü[‡fï®wÜ^O ƲM>'Ü/¢ßÄÆxþÜ[¾ý^yÍyç z™sHÆÈ=%O";=ÒŒñá‘Ø£c –?  A‚Àß1° ´çRÑG‰)¹nIŸèÉŒI ›»¢X_;p]%¥Â±Ø{yØÏUC@¤¬ë«:i.wX1°D˜š,èÜí·Û¤kF EcƒŒa£ÿJyÜæ!—/ì‹ÌÄ@„Dº 3r­ÑèP8tÞaÕ÷B¦‰™±³,ÄýáY¥¾.ɾT¬X½1G<$ßÀªÀ`‡éׄH®;&F#¡±§[7Ç+G!cÈif›úi=“¤ôk˜Ž¸«r°ˆfrhy,;¬”Õµ¸kÇ®Äzû;½­Î‚ Üéa-þÖf‰@1õ¢7×ϯ¥’Oj˜õHêj4[H’Bl—Ð.wI +i;zv¼ôÕ¹D3+;8Xyð ABú¨ êíÑG;J*ň©fµpÿu‹ùä·¶)зþpj¹\é†oÿÆúßö>0’ÌS“®ãù:™ˆP`íÆÿõ²’ö1¦œØÁÁåVy€4ÍHæo~ûn²¾ßé¼fCK›¹µ˜Ñ%pKæ¿]îAu5žB!Pô²¶‚§OcÓ·f£KjPïSSN«©B¸mfÉÿóhì°K‚…Yí´,Cn®í÷Fáü´34<4b„Åé 7. ¹½÷,–jGP¹SsøxolÚ.‡BˆˆmÃÄOžs:UGœ$r7®ZeEƒd ä Þœá2;{³×ê÷ê'ŠÙÐ*WÇê¥Và DÄTú¬š½»s&à¶Þ¨é •"îæ´X·¤oÏ¡‹¤qÿ™ãþέ˫Ë×g×,Ì=Ht[Ó‹gû¬a<ˆ"H Pð†Û‡÷}@ß åk›x`"ôÖ¸Úð[Jž†ö¨ë㣫…ä×;0˜u!L<þáâýÉ4+=ª\Î,5-TÌ~@ª'K@0rÅ@q´å(¥ØóïG:‚¢´I( ³5׆’Ûç’Yh`vº`@Ëjwt#f¹#(“0žv8Pl v"({Ì)AD¦*NE Y¯[(?k+¶¥—9Jw—Åí©)v?­HËUˆ–ߨš ñҰGXx…0ùÆ`Ëœ)• f\}©Íå·Û‘dªd„bíóΨ¯g£ÙºžNYKŒ×îèîiûðRNgÑ^rʃáÛ‰‰­ÖN3üÔEp*—Ïè†n-YÁÜÈH …GÒaF ³6t›}ÒA*×p!õlµ‹Ëðq[yIŸÞZÈW“0¿¯‹RÈü´¬fQTõãïõ—‘{7Œ½ùP8|Ã~Ö8mh¿ßýÛêБpûfù§Ž V:Œ @!Tô·ÿY^–Z=ÊÖ¾:©ÞPQÒ·œšÙâƒïÜ o=]¶³Ihí˜#3Wç3K¥µ6ÓñIÓLÚewA¨®NŒq‹$ö~ùÙgìÎÍ‚Ûv $Fᕳ¨ìEkxknº¦"uÊ [u¥ÑµNy4òì߽؈™Y¼v%Ÿ  Ùª÷®–~]ˆ¢ˆ%¥›ŠnÈ«ñN/B&ÕJŠÖOÊç§fZo՜α½.µ½ Z ô3ƒï=· 0`÷øþÌ#íæa Q¸¬uy¾X=wÉ/º€€œ©~½z£ðŠKI:(Z' ¡V|•œxÙU$=!ô 3#¸Æ˜»¿:þÈ\UÙœ:ÌLl–( gˆ¸Á¾è6ŒÑÚÖ±r@•ßã‹áôŠ«j¯„F¤8±’νܔà2³§!dxSFp*Fˆ¸—Ú£Ébm×òr33¡Ô‰ŒËI…—HO ä ¦¸à•p¯6©Ö{Ò3èTœÈ@ªÙo¶PéºH¡¾ïÚ‘\t÷ÐE6¨|É.ú ¸ÀBRˆ"Ãc lך6s8ž-Õ:ŽTÊ“a( WÜ›žPî'ui¹’A±òH@¾Ãƒã@y 7¤AÞ=à;Ê‹lá”™?ý|b:´‰‘¼:Îbªr òÐññt\nƒòL¦Ñ¼Zÿ £ó*Þd$ç‰ËŒ½­+³çãI•nlµ ャhLèÕ£÷ÂéWå„Z$9—H“öÉ©5Y'–€Éñæç%Éf:Q=u}ôl€¶ $ˆ2¿íh[cÖ'=W²BI‰D­veák ¥üàE¶¨ ‡WÏnì¿ÈÿÕ~ìã5+$ÝðÒ×ʱ${éiˆˆ¤,üþ0Ü=úr9T±ê#¢Ô°ÅNÃ4 ?ZèþòoVZ‘ñb„QYù¹‘´a—öκrºIði-¦7:¸‡³NJ>–JZ!Jž?ùê8ãδ^·˜<Æ– áÙQÈj¹z4&È„uCÒ5ûÕ†R½²ëv«éùäó½úymì 9MB³{š¾ö²{ ­ÝjBO„ÕYx € ­8­,w­öy)œv[-ÕÝ gotÏ•êKö÷`Î`Ÿ}…X­ß+~>rõ•…štdø$5Ÿ>-KáYÊ82s^Î\ß­AtNßSÃéĪ£[ýk;§>€þÍ4o¾°!™ú6°ê"Ê‘|ؾ/Y Pº0 !þ{ìøÉŒý¨ªuV ¡üÔN¢°¶"1XZc?E‚ǃy’+7Zn^7^X.3a'„@:¡˜SØ}Þ—J²?¹|sTÁƒ*ÉÛ5Ög‹ñ¥ñøjÃ…DdPf¬` pËn¶”0t3¡c£ý‘oºŽòéF^Þ³ß @j@¨_©©AÀJ8âfm»˜‹ÄŸ¯¼5Ü2ʇÊ-èÔúš&€•T˜O­.uã9÷¬æ=€>Š€¼¿´¡oµÂ«³_XàÙ4iت·><; ê>è”®"uwú;=|÷áç_òwoÕ>Š¢£}¶£\×S|‚ˆ‚Çþ§·¹½òÓýØbø(_u"t¥%®ï¼?ÝùÑŸ=îeB¹±´@€pRëî¾þjíH…‹ é‹vÚ-Ù84¦œrF(%M- (ìe°:[¿Üêߺ{9Ó깨‘7úˆ¤‘.íH"dhÈ Ò£ºëR½Ñs±ßmp¢ÏõÒÂÌèN¤P]üÅ¿_® ›ÄJÈáÄW£ó\Þ[™ÛëÇD~XoÕ5# À.†Ü/«=Gq§ÚLœVŽj™Ââv‡„ô)ðt±ôÈ(É=tß =º’ܰHfswvOÞ‹H ¬ÐžÀRýÝèk¶oëÖæd³Ë@ˆX f‘Æ£|¸Ÿ˜ú…1¼¯"¨…X )EZóUßr™Éíž[ã©^õ_ÓÈÜÝÎQŠÜoàÁ «âí‘;­W8;¨Hº‚Ž®Œ¹GOa왥B3‡óáAYŸ‡7#ÙÝd ŒnìEzä¹%=Ö ¿l#^з~­Ýx°úõÝË/Ì]•-©+“ÛÇ Ì³@ì z“A¢··ð>1D’B…pÏÑо«É¦ÕÞ%a¦alç¥ÍRGm`ò]J4hüm³ ÕŸŠ?ÌØë]€Ù#ƒ7žºˆ_'A¯Ê`à|¸˜f‚ð4ö$°}5;˜L<í1ƒ "3ž7 ÕoôX¢nÆChnu]š ox /ç@» S’@Òu33RT½FÙ"Rf²uÌʲ”RÞ‹À n]âþu¶\ ÞóíYw‚ôÁ"ˆ=±Q@Kô½R€ äÚó¸Ó¼ff¶_ůFW1ž9±32}v¢ËÜ6åÓÕ OJ €šY¬öÞz||+¶7Lµ45lVLîÞ•Ù³ñŒîoþ¡ñˆUûý“ÓÈB¢²&‘X`<}CÏ Ek§ášÍˆ‚i9z1¿ÿ¬©04$Ëu@™žó’PÐÛsvÿ|ô‹=¶¤÷Ä…òíZäíõ2(€ÎG'鬢½ƒŠþ_™^žÿóןŽÜTU?éHKJF$Bcã7þeÖ*ÿÍWj&ùz?•êM¹{:g“éÉÒ/ÿÍÓºâx"}åNЉððëýó’0晈R«šøœ3‡¥97BJ6Ò ¬õÕñN˜Û7ÝS‹uÙ]þérüÁÛWõrYhÈÈšDÑ|^KFT¿Ï@˜1lÔtè÷AuܤÝWë׊£vcØx-p~X·ºCa1S\©ÌãËûðcQ”2Ld¡ÓѦݓ€¬4N¬ñÐqMž•â£R‡]Ф’ÈèÏ!˜Ø)ßO#Ü©;û»ß*1)K…Û½ëcCˆzS¹s;¹„ÉiÜoΜÑ‹Pl£q{½¤3#¿‰ó OÈÀÒÙ~çò‹Õ÷â› €Áñì|þe÷M´R œTƒ; X°ƒeqàdõ„!¦öívký=ÒÔ|Ý?zâ()‘É_(x’ ¿}¸j ®y-rºq+·^u‚pVÞ¶š„P¡«q©¯(åzb`ÅAªR üãJ@'2ªðØN¥'êZj²`s»×©r8Ò5½Ww:³aùÒöPdŒ>Ø+{Ô@°G ! ÍH “"Y¯ö%s$Þ9‘Rö•¯]BfqÿrQö>éJ×a`VL ¼$4ˆŒ|lCÐñó…ÇBéèì„ç*;ùñd{swf¦u˜*è» PÇçãaÝ\ŸµH1 j‘ u+Zæ'Uåyß™iˆªõÕkëÃC!Ð7K½îüêuêïg—ÿ²oJ9áµ/l×eåaŸ‰4úoÿ8ì¬ýhI›­¾nš™B{<´ z~7þ·å3•žï;WB.:/Û²Þ! iFé ÂĈr*ÉñÑq2ÕH+ˆßz/×lY,œÃ/~­î]O4{J°@Bf¶ gCŠuêw\M#I¹!Óíö-Ùê' cœ¤óu-ýÊÒ'f‘´ý§áä²n€È g˽[›ïÅÖkJ˜~Þîáëú͸’9*–³Í…Å»ÇUIHH ½´ ~#ŸÝSeY{7//÷ïoµÑvãçéÉ|íXj¾¢ˆô©³FêÖÁ©¼Kîv¦¸œ1CgwÑZS® 2=ÈW² *Ø:ÿöÐççßëîJ$Pý,NË-ß°õ1ôE³J~Ó¼eþÖA¿Ë* ý[1nUì ]ÓRóõîÄùcÛãb‚¯/&‰"’‡–DM9 ™äg…‰Ó=Ûs)ø¡$LHšàÈ\A‰Ý\¥$(Êé+v/X澦„®F¹^€U[i"1Y0 Ûk¶˜4ÓŒé&k;ýnºzÖö½ûðbºÏF¤Z¼8Nv£å*IÑ´}¢”ëºÒ`PÀ î]Ωî—=Û’Ê‚1 J1ß6ë›?¾w6²rgb''WãŵãÚÍüa+“o¹I@'Ù«´'E¢R-ÆíeßFCÂÌG·/g¿^»‘ïîMP¤³Ë’™ÕiæáéîpFåš;Õoã’Qé¼{rR˜ŠÖW\DÍ]7…"bç ­Z_¢ V®éáÒ³ª3'Î*–wòKòx‘Qü½¸»?äü¼çJŬ¢©fmüÚó.Aìý0öVf¿¿û#üÞ•ÓÛÐ>J»ŽþhÍ•®RàE†¡ÊüÓßÍW?ÚÍìJ3ÕÂÙs÷úLX}Ý–J¦¿õ_ßI*›ˆ±¶Œýª­kˆ ©8œÎm[½Ó>ë_dh‰¸rÏO¬Ë;£TÿĺòÖ%Q±˜ öü‹êÐÛw3º£éš¤Gó…x<­·û¦¶»k84–«¸(zvšÜŽ“‰¦0¹ÑÙ9:o\©|RHCOKèɱðvè–½ZÛn‘· Ú:U^.,3’°Ëídª_•õã¡âÝÈ–E¨Âî`âŒßT½rwøqáò’ÍJE÷&G³GåAð9 »€'µû¹Uu%LûÖâ6ç—óCOúô>n:ßëË~½q¬è|}o«(9Þj-ΪÁ ÜתA,ˆ¿! „¶x‘ÇçizÙO¸ñçed褨SU€Äåv}ªý‰ÍR._$˜ ‚ñ¼V@!¹±K‘êõÔó¶ J1ãQ¤PfARó¹£$³—·ªñ „F¢JoPX‰9­I­Õ]¤%'‡tìt[-F õ8išyTriÞÜ= $¼™8êiÙ›Þ“@"Í äð$«V­m±ˆ¤ä©+[*—Ƀ ‰;×2Ðù¢­léG^\ðÁ7ófòú@pÉ€pFvÂãíÃÎõ¬ë·Ì-QÔŽRH™:?Ž0½‘‰e–Ë^‹&Ø ¥ŽÓ—_¯Ú·ñ“T„r{5ÉÌèÝ+l6guÊmíî,Õ˜Tc.µÝ¹eƾì@Ô#c‘¡Œ‰ÈPêP·ij$m¥´±Èóí>‹Tº]êµ uàþµ?Þ9þÌu¥ܪ@±šÖmHâ-èj`ž|+üçgo}ÐÿË×"ñmÝEúé™tň@DÈ#ÿâ}h|ý“ó¡Èæ9ê¤ëc •LΛvGhÆë–;ôñ?y7ÑÝ; ‡y­Bí6˜P&A›•Ë„gåj˜È¼f@¯‘!U;o΄Œ¶üÃGµÔå{w’ížTÜYûr#uçþ¤VuPºÎåñ‚,7ÛzØd§¦…ɉp»+™ÙîçØ.D ã¤d†/@ۙߨ¾e¸OvÝD!]µd74¦1#:­86’ô†ëLÜ©i ­mõöáË#'mDƒ˜`„î‡!À™õnìË©ÅÂu4>](†w›‹Y£‰r=ys³ZÑ*§¹äшÁÞ²ç×K>gj@áE_¥ã]Š w‡ß;~|uz·Ï¤T׌Òµ¡•ºB¸èÈ/ü˃v‚/ì÷…±ñt¨Lí^:5\&/÷ÏfºŸôZ¼íÁ»@ Ã×8iž)XSýÛíùâðʹ#Xù1H~ ý]øBJåzyã*˜Gx=€òÆŒ~á#›o›Vk¤³k)A,Dj´„N»ÕA2”RN\¨u¬/$¬—ŠQùŒá‹òÇwmg}G¡s¼8¥+Äv­#A7òÈr]WJ©”§Cb7ï$Uûó¾t”/<<ð…nù ö¸®œ8¾/NYө㽩áLùhçê”uÏžÈ4B/9> …Œ½‘¸zeû³3ríÊ'3w#6~Þ}r`oq,"î¯ÒìæKÅøRLœ,j›Ï ¦•ô¿Ãøë:Çv™ÎªwÏ€ãíÇÅÝáë?YöÅg Qñ&ÀÊÑŸÜ™¹íU7Cf¶Š$¥ }ÚE|·Í¡‰+€„VJýGȾa ELÌRm8u³iÐÜÜDZ›và b¦Ä›#*}%hì˜ñ>lƒôË ¾0Ç´B"¥Unt.Ã(õjËp‡èq QhÁ/ñÛ¡NžÍqûíž €Ø6{¼ R²ª%š#ܦŽ»;Xß8YÌݯ•N­u&² iàõ™æ†™ÅÂ&çgnW™Håv´*χï†+ó3行ԟXüøò®“ ˳E™¾ùpç‰K-A@Ó8œ¹ß9ï©K]'?rX gZun7º.!ŠD¬gÒwïtY†F:å‚•][ï‚eD#9Ó‹‚Ê®÷îIÄñG‚¬wúåÌ3OÖ´“þÂ8¶[YU¨¾B?ºóîWëŸæÐ]üA„œä¿Îÿß÷ËÒw.¨]õÛ=­­R¹±]c¾ó­‡£kSzæü1çÞ_½¹îŸ-Ðæ’жD“R(º0•†«åÛµÀ)žšÇ è Sw±cŽvFTávC: ¯^oï<|~¯éö˜£µ÷.†§Nï)tºé±±¡lÁì5TÐ]ƒ¢ë˜ÞÚf!íoê±¥VÓG º…œäsä¤+­ñ½ iÿÎáaØÜj>}¥}øN{XÒ¥ÑâX RDµsG¾ÚŒã* 4ùe3æ5¤¶1:uÂyÒSɃ{í¹Il MŸ~Xyf}“ˆYrù]c¥ˆ$ÞÍ+Ü»º5|jmë`׳ze4+¤oç¯uÅJN·HÀç ´6ž›ºXþX}Q€È‡Ûõ}ó ã¸OúÇm¦ÿ¾b‡~hº˜ Glˆ™ *­ìc)u[Èq¸‹»øÕ6c”äáöõac/Ä4ddwÝlÄNj±Q Ò 2‡†Ø¹P8i6­™>V' ^¬hEHÊœp»áØÒš€.ew¥¡ÕmÕSEÞ*朅Uñ¦-‰#`ÃŽ’à¤d'…„ÚQÙÂî‚´ªž€WÔ0AdŒIà߬ΞÍ`û¶ "»«HÔ…qÀ@5è ’Ÿ@`›‚ƒ$Ý\ñŽëOÖèxñfn¢È«6æ–W¦†8ÿ`¸ ¯ú`…Ô© µ~*ýF¬~$¥d¥0}«Î† ò“gÇoû»ÈË\¯~¬~@X…á³w¶Ž ÝYeíçç²ãEÌzÖº‘¡ÉÍׯ­ÎlV#…*Ö¯$XH"Rêðé ã—^]7†YDQ ;’*¯|ܽkôÞO¶°¶0­äƒ‡gÏUþè±rÔÙ=Qä]»(&NÌSæØ?Ÿm/íJfÇÒƒÈUžÒ:=wb‡õÕëÒ81œ¦¬³ø‡_]IçÆ]a¼]qšu¥5!€WØáÈ­ÎqG­_o…)s }î”0XkÖÆAeÕæ=ŠWß{ecöÀGO«]ƒ\½ò^ûèÉý¹^©”É¥˜vÔÜRÅ44;µÞPº¼…¹Ãº Šº¥Œ*†:=ŽL ‚J=hsèázjßû&¯î(\ );ê ö:Ù·¾ÓšÛ¿? Û¨Ð" £ŠêíT.hvž¨¹ÃS[Š„)¾E¡?m’X2¢ü{§¼›;y¯(»K³S“Ëëva(Š1ÚãW·žU7'ÇõfgÓ£"™»<o++ö3H¤ßAÚàOàk¥g• Å„zh«{lçM”XÝŸ¤ln3î)ˆãân%î\û£‰Ø:àèý‡!Z÷îŠãd÷gæôëMy›ø¹ÿ{SÜRÄnpF„½]S™÷Çf›÷»Oã‘€”’Ìü´qo­Db)’ bS—,µGi1z»'¼F1¸×CWewŽg±Ñm5„4eŠ\‘) ®ƒ:˜­]1ýC¥o~©ˆŠH+-Î H¯Ú ˜õPfµË‘1Ä ¨³g³Ò|»Fâ¿)„Û‚F“³¹? ˆá«ÉùH±; 'ó°~ÿÜPq©º°gWgôã1OÜ»»Òjû”‹ìäÊ‚XE¡—™~8?w¡&É=HúÁêþÒ*í—K£<±õáÞƒ—š¸y,µÔ=éê dÇg ãyÀv{•.¡°Ï8ž½s»!˜ ¶öiI˜6Ò”Ög˜­|¯e$2Ö¨R;êµ]‡o7S?>v±;qo$Ï[æsøõ÷"Ôò©!1ú{O„™ Žþóéðá7® ßBÚÑ UúÔÇwúË·¦Ã›Qîè,0þåï?ä¸3¶c…:·³¡E@îÐ âÍÖ —Ö®tÃPwc¼4mnø™Cõ1Ì] B¢îíoßt|~¼Þ5µn¿Þ8pâHÉ¥lÁÔÉ7:íÊPžE¸©vªëk¥¡û«e£¢öÈdŠ]•Þ1ìEˆÝÏíT²ôø Ü~¦×=Ò¸°zùáHZ©do]¾ô^´çÔ¨B"Mµê4Ùj‚ß}|©l˜(Õuþ!´–Ÿ™~óÐÜmÉ„JÖ÷N =ª)Œ—J woÔ§-t«ò¦?’z2–·³¶¯òÀúµÑc”Ço”wÏ §=¶¡ À¤6¡ÂнðIjfâÉ5=1²Òu³kˆ1iÏTâ?8P‚æÚú3wÚO/çFÞe©µd€\×\|l:Wß C'÷´ËF#)A͵ÖN]s*S“gK¬Pú¼È>¡-é?i³ñ’ûö¹Ô4¾ÛmïŸ ÛJlPñ”T*g‡®QîŠ{ 3ÀÃñÔ•Ñô7Ø(ÈV…šDü2¨àîñ§®ÝüXîN¨Ø‰¶vÞ\è£õ¬(YK N(HVÙÉž …û–£x'¢Ý‘0/Óã¶Ö©Ù‘GSù·6C݃A\QÆÁA"¡Db­¤}&¯ßÞ7ýx-4,I¦(Ù!dN ­Ýîq(l@PX`?B"ÖÀ¯ ‡K–÷}$ÂÂŽ±¬ˆ´;ª*=d*½©´»²¤dî- ‹@ÔOFˆSs¬’šˆÇÍÌM‰`X­u"t ™Õ…¡¥¿ŠŠÕÓO{X{§…ÌŒVç–ÜìýXÀ¾b{[O È·†fgÞ]_ž›+m”+x"»‘ZÉf!õ~qç“ÊØEÕÒPýùr½évðÔêMÁà©,’óÚò3“O¶T°öÑÔu=ÅÞGö¾ß&Œêgƒ}ÌëÜróG3™ñ"B¸ÅAµ ŽÖÈAÈ£cK7›ùQÞlÄÖU’Äɥ쑌J½\ V&ï_ˆ"ÛØù«©5L<úÈŽ¥ò-}2kÈÉ´þò‰0Añ³èWˆOü¥ò½o.NÓ­fÚ!E’Ûÿ ‡|åÃÍgf>Uj³º{…Ó£ùѹ DîTSíŠå~2æç=vït§qåZ7²ë‘}RW&¯üµvmïçTp|Ž$BÔÒùð;«…“çŽe¶ñ¢åÇj(­€¤ís$,±º£vÌWnµ6yn¬µð(?¼ó¨_EèH÷Š V ¬°¹v@ÑÆRïØå©½k{£›PéÌž‰PP“[møÐ»ú¶:|jܯ’Š# ¨»•¯VÃGéÙ“™‡]²¡<É ¨Ï—sÏ4n¼Øy„€†Sužß!÷CŠK\MãõêÔ¾¥’^í¶Jéê8Bv)˜½Ñ4`ñ–±?¥?e¶Dq:?>õv÷ÅÚ2+ŽF7ùðÜ­š Óf;°ædØo’™?JÂãÂL 6÷yÃϬÉVUkojêÑpéíõ@(Û7ƒwÅ‚Ëî Bbï`æVpÀ¹ÞµkôD'„Їg)x¿k˜… ǽ:#X(I®8#!˜ìAh§‹7Ú ÚÉNOg°ÙiÔ Q¥†¸ÜÇî]C‡òæ m`/+j³9‰$Œk3³Sd*ÕV„*S¬—Å„!GFXР¨óg¬¿Ûã0âÍÐ?æ’ðö$~¤¿•¾-j€7CAÃc­ÍÊù¬^®?Ü7tG6ƒaLûžô´v¹^ƒ³Ã7k…2#jå¼y©·k´¾}yôPþfkîs‹k;r8~ëÉK;(‚Ð>}cídfè¦_:ŽgP lÔ ¹ Md0»Ã»´ÜeUªovû™1oe Vh:úÓ™pköòÝÀDvn „ 1µË¯zgÓGÛ·j5u¼¹2ôæ»=R»Ÿ Âô•K† ‰œûû#Ý^ÙœˆúZ;„ªôÂR_ûÆãJ»Çr™öžÒ™¾ÏÅ©ÌäD ;W6{®J±ÐôŽ.çî5Ž¥áÉU#PäžPMßMkXª³Ù÷h !»­Vª{çÍ«écgϺm£ÓZT†@"ãG’fW•owvÍuî­¶2Ó#­ê??z´TØ™ÒÙ^”ж¢Y£×ÇF><é´§¬Ôë©ç¼fš¡·’÷&vªAغv¥pò¨Wo£F¤8²cƒ'¨Ê›Ù‘SÚz½i)ù}r, ñ“™3jÏn­!J NelftySIDƒD3P ΪǻÎzÐ9xOµ·ö.-G2°ê$«}Ä~ÈbD€²ù(¾9sú~Í(‘òËãûÒ·š´m et‘mwtÿ›*°­líûzã†F»Ã%µÉÕ-—œÉ] ű‹‹‘ã–"V3¢$ ö8þX€PÈŽB͉<_=:t³Å.ý¸PJCzï(Ëû‘HŒ‰Çf ¶¿,²‡© ‘RÔ9‘3fx}µ‡¨sSÓYÕê¶ëš…Ü¡h«švÜ F¦¦²¯…ÖbLÛöôvìjh" Ç¡üäPjõŽåŠõ2D~qdy€ Îq únùl‡€ý9‚$ðX!}š¢lƒ1`b£ýéÕÉ]¹ÖZkùx±žM/3è}(G·žG)×pG¢«¼BnùôÐû¾D“ó"®Ý[8²«÷(dŒ–ÎM_5óÓïšºè‹ šò µ•Òîlsqç¤ÞQrÐlFQ¹‰Jƒ #¡ÂèÆåJ Ùبp_ÇE1¿ß®[8Ã×½ÚÔ™#†Õˆ(0íluÏO»›ÕÅÆ¾½k+SJ¾½i~d Þ÷D„AÔÉ¿7Y½òòÎÞÃÐSÚgï~dñ.5|Μ=_‚æy½’ÙÓñj¥’71‘QWt´ .‘‚3» ›ªx¿q, 7#‰˜”œÌukíêEi‚N?Þ“ dEa°øîEœêTÉ—Ò0åŠèxK Ð¤ƒ†ÿ 3·‡.ߣ=ãÕV{• ;÷AÝ“‚"m…2º¼¶q¤¼ü\8NWÜfgç‰ÕtÆ`ëÞìÚ­‘ý§&›-?¨^¾?{êP·&0´“éz{³97¿g¹œ¸«@]t_ÚY>¹ÿ½ÂáÅ:(Œ7öŒ ­”•åegÖÖçß›öp9ìì€Æ´ÂÔÂÝê°X2K_Ô7¶Xú4.Ž=»üáñ‰;‘(…[ûw—lŽnX¿­Þ§þ±¿] Ù¶)“AÔ¤£ /(ªôjk¥¦ö,fǯ>Àp¢.¤D¨X€5ð *æùÌÊZé@ªW©®Îídñ*é4^jœà‡¸Ù@ƽî "Svºæ{tW‰úÈÝyÉ-¬.OíÏß xkøäÃî<é¡×ŽM½Ç"„fóÓwîÈæŒWqÊ-l´ )Q&2œ™è\_Äö*Õh›ñ³Ÿq†„¤•Ús.j*ù~“ƒ$¬EY‘ðnjîžê,Ýo=;õÆÌ„‹ºˆ¨ôËùHµ¾2 ðÁ4Ùºújc¦ñ@i­‡^ü1ýµoW‚Ð;ñß ¯/X½ÃÑnrÜ¥Bª45$€õä7B­@@ML¯U‡Ç«Ç\¿#€ˆzø.cÞƒÔVN”ÇÁ»Õ c¾„½ŠQQõÊõöΙ]é!Uy+ôrE—™T¹ÞPzåîðÙñåêã'{v‡›a{†ÆgT/“Â(eüú²ìyoÿ„qoÖ»å‰s«åyä°*³Þ­^ý°7{øT¾Ü6;—½S‡±Zb(¿,“ª^®MOÙ\µS!Šwá6–N,ÍŸp=|V®=MD(dex׎ڢMƒÅÞlysÏÌæ¨nWaåpX×`6æWŒ‘˜•Ýß;ok8ã!75+Ͻ‘záá&’H'÷›û½d)iÇ=„Ô—Öl§€Øï¨ ÖI:‡x™óyiVù¾K^æðF4óäº/ÌvY?ÀÅ¿œû’ëÆ'MèÑïÏM=Y Á€p$¥1•>EðèK$?¨¸mØÛ‹Iaœè©z;v d;OÚdwMdÅo·«¢•Ö#°Þp)/}) 禼:ô…Å–ŠOyÝÍBNQ°€QjW«t#†x“ˆJ)ÒXUš¤*ÕUF§‡òS;¦GG&&F…ó{Ÿz'fµvkž›Ò~¥ QÖ{;O¡¾ÿ WIŸ¯ÜÙ=ÊÝÔj)ûýrȶ®¿AGN3ëÝ`åýè™Ój#$ŠƒgU½<<´ÒìdÆŽô%lå=HÀacÛ8?œ?}­÷̃¢Dˆ[;¦Fï¶‘ ((L­ÔöMø)UmÂê¾fw´ F>lbm4?Œ„æ/v’Ÿ»ùá§ó7BBŽ8[k=µãB“ØÎz„8ùw­ÿ›ûÏ©mÛûYºqv¡Í>$t½§Æ¡ÛÖwISúh£>[½Ðˆú¹c’€pàZr@QûDIp¤p§Ö¶¢a‹¯ÒÞ±!ö?"fcwlÜ1Š}ŠH§¤(BÂî‘ìJÃ÷R;ÇÓèwÚe”Ò%X”îíñà’Òrí«%^=ô›]è‚@¨*NM‚€©×BæTQ­¡oB‹¶CFuî,Ñæ»a0ÆE±Ý  Æ3Ÿm…SÜ3Ç\%BDŠs˜â v£÷ö¶VŸÊ³ªÖï ¼°9Ys½÷LtÏÙ*ÀÉÊ@·8üøÜÈ;- Î4§"Îlm.MÒw#~|bîÆÐ¸ݬŸºµEÀÅÒNÈSÖÆh+€Z]9ˆ‚aà •V¯U dG¸ÚˆDE÷³Í¬v™”" xq\¶Æ/Þ°{¢rÐÛsN¯Bsþâµí‘;8™}W:’¼¶$ ÿ£í ÓÚýx9å*DïÜ/ýÍŸÖºAúÇÿîØ{ÿöµÐ…<„{—UûXwTãÚèPQ€*·Áo…Œ"™Ì䎥Ü5̤֫pãÃØ€0’ž›‚‡™’ïf Í3!•½Ù Y$^ÅAòZç†s’IQqtfÿ®ˆ°‰B¿ÓôMÄb"vÜéý»ÇŠ ® ø—„^½¾÷òÄ<8רUÝøBpÆãvfaš^é†Q¤ñÁ›úé§÷w¶‚ÞÍ›ÓÏîY«Y¹›ÐþÆðp³QÍwîšb••pŸ’m7ñÜ}òÔ÷FNÜo#²S90™¾Ûµä)mv‡[щH;Ý-XËì¾;‘ÂÝ©­Õ^ÒUÇ Þ¸@fûõŒkf£ƒ»§^Üüxm€ €ôbñ¸w#².e‰IœñhM€±`/²r[ûÇËx:5Ý@Ê*s­wz ¡u&ÄQ’°Qe[ð"SÚ—¾šÚÝ÷ÅjK1N¢×”Þ;Åê°‰-ÉEúóTIbm*8EÙc¤ÌVÓê£V«&¢µ3Œ«W‚é|úý^8>ë½Ý['b7p`Íoš¹™ñZÐ4ÊAˆ©¢Zô†ÂÆ®5@H{ñúh^‚ý+A.K’­" ( íƒ ·ÔvçÖ_QCÓó½?o¹0Üé)>0~ùþ‘Ò¥ rR >1‡Dâ7ujQ‹¨•ÜÒÂЋcð'gO ˆnþÑìîÛm‚À§P ±wíÄØR`Ø@2h6YNi­iè³/¬üþõNÎü³Ó·þõ_×LÕ Vö #>ÝBg4ç²PØÔ¡R •„ílv:‘P7@Tñw[ ŸD*ßn!¨ý™G£e…»=­‰*"!Q&*¥-ÖQ¢Àï5Y;)êuë~oeK—zÕ®ØcD@Êj[¸:Ó-wZp%ßkNï¸ÕÛM‘a·é6€`Hnþ¿£òÂÿô¹¡¨ù¿¾öÉ/Í“ã*ÒŽ"mîO¸w>¼ ?òó%ÒJiŒß:û0€ ³†÷¿>säÂüÇdµ»^r>y(…€Ax?[j_Câ|Ñ”ÖÍ?(S4äï(¸ºß•Çá±+=Î#¶SÐåýï<õmóã)G™º[}UýÔ4¡Ö “6Ú®ÁÉJ‹“ 7!Zƒ Iä³öËÁF!7tJ"üG^Š”RÉt+‰aÞ³u"ÂlL¸tO®/MžH¢ØÞE„ƒšAgH¡JÆÒ7%%F>0Éõk"ÃP¾N`¼ƒÅ\ 1 K(í‡;]uXóƒ¦{ÈÁl@ Ì}î`Æ ‡MHka0Fe]ß,Òᘨoë›c$‰ëK’é¥= 8‰9´ÝV?Ùɦp“0tïôö·¾§³…“òí»šŠQðèèÒ{;gn?VZ!=¿S( iBiY7hhè³ûðû×w½”Rˆè˜¯Óá»]æsõ Ž¢ê^?5ÝŒlâCØÔ¦ËF€!ZoDJ§Üv'L^´ÄQé‹­DÀ)˜@·«‰ cƒ€NÍ·ú¤×[˜Þ[}ïÑù…:ìžÎäJÊj#Ô?ý¼û{«£[ë)Eˆã?ý‘›ÿùJØÍýä?™ü«ó¡¯%ˆ¢¨S“…‘IC à <€µ&š@#zÂY/G4-$l¯=Y«ë©öï*‘~DM#;gбɶ‰4‹@¥KûNí1Æ “)ª--Ü]ò3é­>¼t'*fšKåPA¼”&"²B¶‘Éʈ íÕ ûÛw³“F´Ó4`׿À@÷¯ÿ¢ñ£Þ_ÿæì—>’GT¨4¡CK·‡Ò‹ïÜ?ó¥<:ŽÆøFíSh˜ ð·ßÚ7üÁÇN£V6kï?ýüWiî”×wª[›$Þ°Òx«€›€Ywx'Ùú-Õ&i3)‰ øû'&øó…— ßÚû¬ƒZ‹ßðnÞœý±¢V´í{È`ƒX S<ÐÉôÇ[I}`=ú-íŠ84]GüL– Ä^C`ØËŸÐ ð@2Õg6¦ýn4µï²>œs"ÅšY4CTã1L3ëY€0%šG»çH0ÝbØ¿Ðuö;nB_CQ ˜ ¼ûòQo‰g¡¢¤r’DÔ2À‹ˆ‰Ú>hW[¾!E I‘­ÄÙÇ~óLã]ªl³=Ä03Á~r¨}]†Ul?‚~è ³)ßÝ¥__+DSGFÚÝQ¹lÍèzwë\èA0ü™,’ [Åz0çV‚R‡f_-œíýqýùCˆà<~õ`ðX °wùÔNAAåÞòvu|Û6µÛ]ÐH DÈɵWÛÌnž›«‡ŒW?bâ¾…±˜Î7êö3%$-¨,41(8zâ¼sõvpu—¹ÙÓÙ©¼¯u³_xn{eGcÃqÂäÏŸxów7ýÞÌßûÙöïýÎ"©(0¿â-¤ç+/ PíJ‚Í®P™ ÿqKAz>Ç',0GÍUé­Däwº¼¾«@ö*… ôY)Âì³?z~D!ˆ #¿]k°ò<é”[­Š;âЈç©å 5]Z¾ò «ó  Svi]üÎðÞ;=Ùê:R¶ƒf0‘ÀúïþË‹GÿÉÏN@ùþcç'|Xk­Èq…Tù®ã.¾y^ü™"j6k)±ÙY¹-h}åÞ)óðsû4­ï¯z¹¤Mø`h¬ñŽ M¤¡ðde璯ɅýÚUŸØ‹³¡?&)€l¤üõçøéÝŠ šWÊÏŸqÅ~’Û¢°…˜šÓArPÎg“Æ‘˜¹- ]I1Óõ0L¥x v•ä€ù‡ÎËÖgF0ŸèË{v¦A‘Õ^±ÖÛ C11aÀÐ&‹¬Ã$vÛ@FŒy|ÇE÷üa!Ò…aÔ¼e†ö²ÍÌÌ¢,Q1ÿTã¾]`˜VW@(å¥d¡¬G:N°;f2ñBñ5oÁ Éðê”a» 8n0ŽŒƒ`ìÇh¢îýÚŽÑﻦ}rVßzS9Ù0<;QýÞØ‘ë‚$á¹cHÀÝœ_O3u[…&‡o-=–¹õõÂ'sD"(¯´Î\í ­¥ŸQL¨ÜÚjIÛãMZ5|#H ¹ÃÞúj× —îvC‰Oþd¸.„`HIàÕ;ɉŸæB¤Ï‡›Þqâ³óµxЙ¼ÂÉìðFêÅÏêÇï=žn­î_Úó?Ùló‘ÿþܽûm-#‡AËÛì$V•lˆ”B35"—„E„2¥Õ€‚H±vˆ„k’ãšìN;æa±rÜu ’²;L­ôì/ÿÔNŒ¢°S¯l®×CLí8r¨Øºó½o»|&§PB¿½úƒð™ã$++st³¢¤”²áõE†4ì-¢ƒbâF6™èÙø!`°{Baxô‡ó/~¿õ…œAÍAÕ]}#ócšÅÂADËK0`Û œ¿?Œÿº"È`<Ö]‘Ê!s½% z@ú Àø°a6sã²Ù‘¾{:‹*’‰€D& «c*A—Ƶ" 3’­@…mÞ7ah¿#©Ãùx$¤5q$&DôÃèV›NQëQ3sbUVñ‘AlW";ö›‚^F)=“u˜€ãŠ„Qbè#@¿üU6A)® °EA±í[C0&Ÿ˜­›ccôjmfEŸão¬QÎéA4q:sõòÉüÕŠ"%™ÏdE¢˜µÜ¨ n¥ë”w›¯ÀùòõGûÎ9¤ÐÆßìqîJäMÔÏ—4‚“Òu¯h5Aˆ@ r§xµn@ܦ€€H±ôPýC$È NÃÄcd˽EÓû×7:ûwݸ—;ý»Ç×6hdfšò+‡¿à.½wk¼öÈ`šÿåò7~€/ü³]¯ý¯bŽ$^—w ™Ô–klëÖly¤ MÄP‚åºsÈ.Y+‹æhA2ùv…¤7—SÞÀ˜""Òjø—ÿå³n p/uqz:\Z©›ôˆ·xñÂ÷¿ü_䮾ÿþ_½ÚÛ}fŽj¡Æ„«cl¥¤Õ0 }`ysz|#¤^Út„1®òPDL`Ðÿæ¿xsï?ý™ÑèñúÊÌ/=ç)r\ÇARÍ[âÕ_½ÄŸù™‚¸š,|3¶03šïþ™{êÂŽÏh$ :­…×ÝÙ© ¢ÞÉ©údoÌM{KÑÜF*5¾TjÛ^­?¤¾ŽK„1o¼ûüä×v¼ä*ôk©×ïÍ¢/£¨¯úŠ7ö0ÈΊŸ÷Ü»MÀP IÒ€@=JE4dY2ñ“,i lÈ0'cGŽ wn7œ“wüEωWD š*ª1È&ÇÙ;ˆd‰›‡¢Æë6aÈæÖ†‹Ñ®1Ï&ò!6(‚`uIíž ËKtÌQ„ã@%¡ö ˜~E aЋDyJ@"öÄfdÙ"Vl#v9{8©Iú€„…dt¶8¹xI B {9ê<¬ï)Öÿ¦è>Ü®TûKvKÍ¢;¯Gçê—‘ÍÑÓd$pܵô„¬¤·05$—ߘ{¾Ôý ¼4)"@úÍÛgVkÃÒi ¥Ýá¨=¤Q°c¸ÛCbeŠ[kadÜL·Ó± ²S—~F¼ýNˆH‰tÅâ)á3‘B9W|¸z9Ó½ØÃæEa¢2é{€§ÆU9ý³^ó‡xÂBŽwìW‡þËA‡¾økÞ×ÿýcDa6"‚,aXÉÝÍîG¯" Á‡ADÈ„â³3ÓZ #L) Bd$ˆ[z&Üìwn-¦ªàâ(ÒŠQk^þWŸÉõ:QhÄP*ëÔo_¹ýhåÝ¿y”Úÿ¹°÷øÿR}ì§÷Hxý[í .|ö¼"À Ö¸}}æ S $(7v8ï×HÍ¥R^í½•²íM+²5¤}SìÝ/H?·À Í?hüXù­— 9dõGõ—hÒ ûY`¯èãºÔl¶NDÌq×j¡"aP鬠DIûTÔ ¤—h~‹qÀ·ý',hÃ4M$fé.ïï>9–µo5&2 ¶Pòi4ŠÙ4B«¡³Mˆ°ˆ-+`¯cü÷$=›³ëF¥”RÊ.æ52sïdöcû6ÏË þX, A)Š'zõš:žçRÄ⸎¢˜ô  ê™3 ×ßç(`kÌL´¿‰íc›;û¬×8‘ 6ƒo &SÄ€‘»§[ÙÙú?mjfY‘¤"å¨Éêask¬4Y@Àð„DÝÌø•K ò¦öüfwšî{ c®ž‚“ÅöcwÙÔ¥žn?½5ÆÞeã £‹4÷w"t蚢 ½¶¶@·®/K»ªr OÞãGÆ›Qg}r‡^ØpK*Æì#&ØXr›‹ê4¾6òråòQê¤ì ^k˜HŒM¯‰¦"ˆ¾5uâ#ùûíÕ·æÏíY­*anä²ëëÎì~};o/6{mhÈÝ=G–ÊÏ®l a÷ÉÎ=øÄ·Wï¾rudŽÕj›Í}\›À̰ÊT“dðˆL?ŸT»üñìwçÞ „Œo²úÓ#×:ÀB` ’Œ¦11Ê$ Þ$ò&¹ùcQ )7õÑ4´Úæ¡§´w'Ý YLüÆÅðÎDs»­0¦x†HŠ$:žé¬íön´B4Ö…J¨”3vBàB۱wjܧX;%ð ‚ŒP*EØy*Íà•SÃB–_Y¹XHoVÑ4žJãe1ÇsË#a›Úý‡:nÒ•BP®NOîH @·Ñ‡`Ç^dÂd,ÉdD0D`ˆ6Ú=?rL0Mb¡ذPœ´ h­EöPe1í¥Í…Ê+cïçŽw¾Ót2àÝã}xÿ„ûf‡4˜ùôzù²LÂZÖaØÉaåxf"üóÆùÃJ!-¼q|¥ÉPrfO¨Ô„ôb «°íÛ¹Œa7Û\é:9¿ë "`.¶|²Ù¬ T’LÙþðÜ'‘Ú7s#¨ìuÖLra> $óîîÆ€#³s|ïmÇ[ AøR÷·®Ñè?xú᯿ÒE»‹÷AaØìšêܘCUAÀ–/A„<="+U#ÚQFs4†á(ê.b1ª÷nÍŒqø$tB'ˆSŸúŸ?5«[! µZ­ ©lÚ+BÓ¨Íï|{iès¿vÞ!zç·ïÏödqåõÖÞç kþØ[’/­¨];Ü;¾ÇˆaªÛ8gËv¥l„uóý_ªŸûG‡±þ6ó+ç2BˆZ+-hºòý«æs?žF­!õ'ã±6„Az¿ûè©­úN)å¿Õü^ëÙ3)‰Ìze¯ºÒoÜuÓ•[sÝŽBÙZaL¤Nxèd!É÷#~ãÌñ¯½D¨ŒîÍ+G^L³R¨☇x£f÷ñÓÅIàP’†1ŽEÄo’¯ƒ /T«êK‡bÕ" Xí‹ ŠE,ÂE>\p÷ßݜ˸” ^Ø0³Î’. "²»䄯DÝäL”(2Æ„µ»ˆ˜ö’¦ž iˆŒš÷`z²ûÃXÔÏD[$ .«ˆŽÉhåH`œò”ü:`Nú›X˜t'Ò¹ba‘úe36ù0}ÀÓ P[c¾ˆTV#‰VW¹%V¤‚ýSF¬W˜ sóš ¨1ÏŠ±I„¦'¬Ä¿fŠû1x(»†QÇÝU@‚?²)¶ÆDQ§‰àe…¼ %EŒmhìøDõßpûUx‰dykŒÿÁÎ'_ìWkt>‚í…ÞîÜÖ[c{Þ7'vÒ«‹)ŒÈÞ]ÞwO”®× IF_Òau½˜g앱+—¤ýÝÆÓ³øí;ûÎ!"(µøý½õ&£Ë»z™qí¥â LJš‘§Š¦Gº¡¡¼jölfŒ ˆXX{²Gt bœN#v™“€ R€zäÌJ½¾?ûŽÉn~ûöÞQ%¤Û×w­·P@)(¿Y]h#"ù¹Ö—†þºçµÿôÈ€aK8[‰ {©ûîRFDà°§L›]Å8”[^3n¶JEqÖ³d^ì¦JÍMt+½})…7¼&à®\:§Ÿý—ÏQgéò͆ Ð)íúLŠ.ýÖ·ZîÅ!©¼õÇ·‡_~.UGv§Ûo‰gV€RœnG‡în¸ÈÆWTñãUtâìOöqŒ¸ðë¿åþʯLßû·Õÿä(9¤¥¨û0(­¼wÙù¹—5)M }O€…Á’ênüEúðÅ£/º_«Ý¼8õ…ib £µÞdp+Âá¼.buyÇjPíÇ8Rw •í¡ñEcÙ?,ÌÕßQŸ¸µð¹ †°©¿=ôù1"EHŠú—í×:8È௠¿ŒK0"Â5­<…ÂA˜ö¥¨”ØÙ|4€`HÊm£ã¨O»ù2ÑÕ-ïè•àø¤§b·0 ñÛ g 8Á§P|JõUý¨"›S!l˜ÍíUbÍÛ1¢B‚0`BR ȃš>£ðv«tP%h„D–ËÜ_T Š©7 ¸™”£Œ¡¬c³m0.…ˆ!>{±Ÿ :°W%ò¿äÐþ´â‡¤Â‚(6Y<–^nÞ-N«ï•Ï×Þ94Qý öT’9;©^Ý:½vO!|þ wSîFaX7sÈ9Jxù;ÃçJµ?Ö/O")$þ^§Pë²ÒÎs¥¡’x)BaHS؀ʤ‹>P&Óõ’¾^ƒcEù Ÿ!@/#Æ«öì/gY+šË­t;g,Ìãâæ;îIA¹1çT°wuaj­&¢ÕÁ_îýÑmæ3ÿ ø­ÿtIL?ÏDX8ˆšºÛݙю€ú¡¾FBdš“Ç t©cz "Â$,,‘©·h¸·N®*L°±%™Ú¥]ÌýÄßßáW/¿w«´Ç­¶PºVûFŒÒ C"ðA7¾û;—½ç~òtžj¯}«²÷\ú~Ó‰i:™\Û™röÐÑð¾vtÏÅŠmwe01çd¡'ÔûÓÿÏÒ‹ï(<ø÷מýÉi"PžF= õÆ›ò?õ ‘CëEcà5*`1¯¿ºkúæó'„‡ÍðÝG?6$‚Ð}0SXzŒÞˆrÝàjVo"òÈ~WH®Ý~*À`i'Р7þòàñï}:æ|pÿ©àC!sô`À…ŠÌ¢Ð“¡žd‡„H*ß’§§ÍŸ´ÎïÖˆðÚÖd3ÁÌÉ])q8dÉeŽ€#Q©bëI'„T6ìô8¾Pã#*ÉN±b`¬F­ª`l¤l2»¢Âž­ÖÖ¹µÇçS×ËùæÅÙ½@ätïL+B¢ÎýB÷±!v÷ýÿî5_>öS¿÷ge"1,6Û6Ö®ˆˆ‰Z¹²šÎ¦4 ‚çI€Š‚Ôpj}“ ÝT)G(‚DfáHj³G™r´sHøV®­xvböŸ~[w^¿ÍíY¿°¬ÓDX»^:•É8£3{çwíÙ;»cnzjªý7º;?ÿéYóþ¥îì ! ìÐýfMª”)1b7gZÉ4˜ã¯¼R—OÔÚ¿ù²÷+?]¬üö_Ï|éRÊÑŠ°³Ü+ÜûÞúŽ¿=c]ˆ”Œ†E @ýOʧœŸRÜ­o¼­?·ÃaöneîT 0x`.wÛ°gB©”ŽËlD8pžÄ[†¤Õbcê}þÖ“Ö*…aݹóþìËi… ˆQcñ·86ʰåÃõµ†ýȆ VAª‡^d¼¼fI2€ 9Þ8î{E˜)„‹$›@ë÷ñHeíàî< °DÕPJĸ]ŽQ1•{°`‹M l8Š$Z\VnÊ–W¤1¸Ú&aà{[xJGWÂáy­ ¦Ä§¸'ˆ%ü² L­-˜Êh‚®¤*"ÕJPÏœV´t9`[é`_HˆIªÞ _c†  -‰þ(Y«Y“A¤Æ½ryöÐêÜþÞæÒŽYBHU—ƒÊ¹èúÈzÅGŽW9Q¹XøèÖ¸õHŒp£p¬½ºž?C× RËaƒ\4†ùa% Jõz"(½@FÖnVB](ul«c÷+ý ¦^ZZŒÆ=OûÝôûB iJ½pâ½ ùÌ÷;ŸÛøK¡rã£rQ <§ó¼±ÖXj©ù_Š~ë#Ïýªüþ×[q‡µ ‰ H!¢—>Ì’ ¥°Sß … 0v¯<1&•/t½ýÎûùÃÜ~¯%ÛjP‘«Ï뻕#Õ™\YsüCA‹ùŽ™Þ»7jÙ£òÎÃâäH&í€ø€B•N§2n¦X˜Û³Ͼ½ûç'Agt.]1Z:CÒä& ŽSŸUjOnd(¤µBú­5cÀĶ7 {°ù’‚ £›÷Ž=µûá֭ʹ£µ-$Š%g+ššš¾×ÀØÇ‡1S?‰±V9?üö‘á;"¡ª;GJ÷@0»Ý¥¡ÔÝt;öN§3Ž˜Z\bc"$\ C“63^¼! ªjðéðͧÓw JÈ*ýèÀá ‚1Ïšì•+¨ÿnijßxÏÚ-<ƒ°ŠÛŽ—Ù1º0ë\\T˜øG¶‡âÄÏmM0!(E$r"w¯s¨ö¸™!9îðQÀ7ÛÆ0LjÙnULÈZ‚ btMùƒ vPO¾_k‚X,n”ˆü(ÂÞÞéë›Ý£c•[¾•*É@l(d7wDDDŽëfwÐ4‘è‚Úl›^h_I|Z&9ï+’WgãÛì»iŒvãxÕûý)3K´µ0=m¾ÉÏeÞ®œØm¾×F@õÔ¤÷ðµSc{€í=ÛÀÈuZ*24À"½7ÖNÌ«¯/wña¹Xܸud T«:f@Hs¥Ëd&~Uý—…¨÷É_­ý‡¯uÙ‰â 8Š 3ˆ‰º©L';ä ˆÊ¬H!‹7U] E©T·ÖÄY 13Kô¤§†¢M‘é%}0«ƒ…É&à‰5_Tœ9öùwÃBh[}þ£^dD™óG§Ei“5u›É›Ü˜±-@@ ‹a1¢èÃÿáƒÃÿýI|ã·à—ŸÑˆÊ!”ί¾Þ:ù·ÆXÙýP|…ÙKÍ„FÌ_+í¿pâe`DSó¿ÿèÄË%6Ü~0]|ª”Õy ®ÏÕd}$¯b‡~¼íç X `\ÓZ›óƒ·Ÿ/üÙ‹Ç´ã7ºþwÌÏN#Æ»?Ž·ëœl6ú%šu0Å Gl­vÒˆD{NÉ`Øk(lbˆ@„„Ðl+ˆ!ù9Ù€X2‹0H„¦ws•ž¹_?™ÏY ‡0›È´™<!)f1qʺµÑ A²å 3£1×ÊÉM,DšBÖ@B6W{éÃÀWàp!a ó€¡†1£S@Œñk-N!D‘ëé”FB‹'­$“âû~‰>ͪýú™a[f1p’‡Ú—ÛÙÆ‘´V«SÙGWço|Ó=7¹p[ ˜‰¤äÕÆ©ê}B:¾^ý‰YD…½úÖúGf3Fj›Ãîct†$v*·f6Lö@–H'Y’3°màÄ"¬J2>ùÊ®³?ÐO³¢¨×ãjOŸÉ’²}u×6ý8`ìG ŵ[ pª[ôÀ¥bkL\È1´Ãþ ¤$5H°/…6‘ ¯VÝý7{'ó);d Aá  8 J%ŸE,JŒ…ɱ':1[ãVdLïfSâü"D…#ÒÀDh@Lë6LÏøÕõô!eßÉÀòþ…cB¨ø( S)í(CY"­©Ïs&cúäDà‰æ¢x.ØlµøŠG­’pSŽK+߀ÖJ8›ºqûÀžÞ»õó÷îhD@“=—SžWw!”ñ¹¡Š;…è—¹‹M€„¦þkUl »ß´1Hàj!S¼v™ehR7Ý^ïp3~·;4Oò û ÎD 3,¬Û>Arc)DR©S«ë½ã þÙú…6÷™‘Ε};Ý|þÌäòG??ûõ‹¡óâO4¾üFh+5‰•|ƒ-±`V‘q"´öUÔ‡‰£(Uª­öDtª…‰aEÙ/‘²£(| £ª8aa ޤ•Ë‚Š*³“Wo˜L*•ʦӞƒè¦2^ïñ;ßùæ×›¢8 ý0ˆüÈ0¥Rš›ïýïÿµB"`~è~‰ökœ¸[§©Í¤0©ïð‡—ÝöûÉFP÷þêÿWûÌ/ =ú?ï¿ü99ÚÁÊ¢¾²œúÑ3¤4YàRÜ2‹€°ˆ‰*_í»Vø\¹Û»þþÔF”>Ð…û=Ü‘uF Xðz-D5ͨiÀ¯·—½®Æ ÀXnɧ ¦âH–$4]ÉøW éÕ­½p5$}G¼ý ´J‘µ›jmm÷\ÎÞ 6:‹;-„¢ê¯¥09êâ8å[’W.Â"þú†Ž]Š´&T„hLd‚k‘wX­ÞT'²Z¶)QâÔ{û¢Áò¿{>"‚ãyZ3¤\åiRŠ4 ¢¬À€¶'(Ç_“¾-à¿Éb¶ÃUíáýƒ „[k¥‘è5ýœZþÁÔéÔ»VM`J7¿>´óz@ØÝ1¾FcDae(¤¢ïï_Ùw$uã½™çŠú —þ÷ˆ_}Úb8I‡FSߨöb¬¡ԙÓÜ}'0ÌÂl•<ˆ8Àïôk’x½Ž@äeö§˜A¢^«ˆ3ÚZn:¡6“»S7*ᩑŇ‹|Æ,¼dPAD62£ã€fÀ[ »~ † ‚¨gÎ:¸þn…Ì,£°-*\¶» ÏëpûširvÖ*æ¹èjÐ9’yèò;å°útêÒž¬ cêñ¾àަVÇåƒMc¥Å=÷„YÜ:)7X@aåд!«áSç =Ò 3ŽÛXçüpóþz²£JÇGŽKé?6%Qˆ”£µû&Jp×ÃÈDÊKÿ,.Ô>v½ü¹Õ¯¶DÔÓRÏóÍöŒb€œüÁ[_«ò™_~÷>Å][ò¦Ð ˜Üìøøx^ƒ ¯z“[é˜0Êí_¹Z‹0WZâMÈ_¡Ü}·Na¬À¢ÒpxruqÇì2äS³±ªÕn¨u:_œšvøËµr7ŒØ£‰‘Ýç_|ùùgŽØ9;====³cçžÃg_|éùS'æuþL:Ô2bbÝpÒíhB¯4ȱú =W¸‚@Ä0Pb¿D ˆØüpêèþÕ‡Wv=­À€ò;…ÔrzzBÝ (Qð#SÓ…æÉô‘Α{5@ Ñ)œyÐdžÚÚ­½µFXSÝ]ž—åÜj†&S9ŠÛÍa*Ƹ-.Oœ»¹ùÂúêÂt3uؽ ê®¶åå°ÍðÀ¤ìNì-(LH޳óe¹kÈM‚•ùöûH|è[’âì¾Á¼O OÒþ$¾d$<‘Lsk›mÑK¨Ss»Mðn/bc„yµ1 ŽÇÊE…¢ D£‹J͌ڌ£n½ƒ@Þd÷qSqF†HéS™ê Þ9^IøÒn•$ ‹H+JL9hOE¯Þe?Œ 0 ßÄÉ,lA¬qóÓAKpKvÌ%1Á,Iq—¾%“?Ý®X¸¶ŠSúíÆé1xøÎô¾'[-ÉÖÂgFôÊw޾á ”æƒQT“"ĬÕë‡WVö퉾Y=?Š@…¯‚ޝv ì<©—Â6ÈhZ¥ÌÚF(Ê£®‰âž¯51;aí€%E‘ÀV¬ B"™¿ÝNp?Ü ™9jÕÇr·ÃöúµqݵWj0û%üòëAb%³sêS£ãÞÕ)°Ëö Ûº ”BÂqÞ( 9®Ó @Œ‰}»Ák¹· 3²¡s]òºÚD•EF€ñ¢^!“›Ù5šR€Íz=¤ž=ð©—_xîЄ P~õ÷ûwþóoþæüÍßúò½ïc~ï™Oýƒ_çvHÓvNŒã™ ˜iÜi¿ëÛ‹P?û·ÇÁq”¦mYê\<>a#mýÛ¿™ûµþïÜýôgI‘Ö”ê.yû¾|ì%Š1ډϾã•?nZLÿHMµüàâìrܹW —HgÆSÔ½4´‰Àã{\¥Ü~2µí¬™9¹SLÒ…Ûû¿¬¿|ûÉg ž ªøæ“sç¤>ùCú…0(baÜîîG‰Ì±¸ X;!Gì§ J§QdzŒDßg3 &KöX0v2™Þ“²sø"Ÿ,eQY7ªp%“æífqs"ÂbÇú}[‘a0±i¯„}%‹RÊAŒDÙô1=ØÄ#)s3Ø]ÒHqEkV '“…x‹ÊAÃ'@ð\‡ÐèŒ%Ì*M ꩳ.®¿kL%‡'ÆÝT¢ Âd¾Gq¤ â6t|l  ±ãNn63íÛAyÿØ*Ï÷\¤^u‡y,Ùy[fr*s¡I©ó³æö#0Ö}Õ•³ò¸ì¾0²Oä,v¥`e½8S‰ è•£xk5ˆÒ£¦Úì #X‚^B[Dœ"i¢É—ƒ_/÷NDà™Ïì»±ñüê½Ïµÿlƒ(=uæG¸¹VÈ2vW‡™¿w'Øÿ÷Ý?þn ÛAíËÛHP9™‘ñÒDNqÝw²¡&.÷¢ ÒG»—6H I£åêÑ£¹ËæwÞêŸL߈ÌŸÁÓ'ý'Þ\ŽxãN ôV-í¥s³§]4nõ:&·ÿùãÓi æÅËßüÍÿò•×.]»zùæÍëW¯^¹ðÝ?ú¯_°UqŒx®êÁ“*À„ywi¡¥Ò® ˆÍfvDZ¥ DÃÙDŸ¡óC‹DÁ%uúøæÃËÏ›Ö,ß F:›CS»ïVÔ HÆ<ŠÚ«çsκ·P‚üÚèa^îFãÚßEÙ• ¹{"(¢8ò Í&”ÙÛmAKüb°·«Ÿ6oŸ¾ F®Q­ãs7«ƒñu¿9³AmSka=Û"B‘§ô<Ã:¬7)•ž+=š¡‹F…¼=]n[?ýÉW¢å¶ÿLé ¸oôÒèôÃJDŒÍ¢Ñã'™.o˜#úCŒ"Ú&}ŠßlBRŽF'?•·dØj€ìõ–.ö8Ýݱ'ûA N”<ŽÀ$†/ìg"Xš !jMNf¦((Ül†è¥Ã†ôZ&ŠEÛvщÐ*VaÄÿØ”-g¬öýÌœTC óNãA’­¸±¡v:ïÔÏŽ™Æ¥ ½nˆ2¶Ò>¹Çé¾1:µPGÉkEhø½Hb¢°¹~gïœ~åÉ¡ã@¨4-&­vÄÊïfšQº˜šËuË&‚t¦é–F»˜“2=NuDP½vì D γk›ÑŽË†?XBAËáT1¼ÐÊ y„ŠÕÞ/þú;~Ä6>P¤–ž >Ry幸-½.‰=% rù­U#䤺‘!0U¼îR1nX–ƒBºd±0¬€W0S‡Ôd¡X?t|Œ‚­.€„íüì3/Ë¢¿öö¿ÿýÎ×ouÁI§R©”«Ý´çf³iÕ|ó·ÿ·þ*…©´¢8&#þÔ1í™f6S[éÚÕ?òê£öôßÿi׉å\’° qLO82ÆpôÿÑûï>âÿÁÅÏ|–=í8›ËÅê¥Í¡ŸŸd ¨MÄ·1±ùÊ_ŒÏ^xêY ÑFçÕÍޤ[‹#­6d&¢pçÆH[€wy¤]•€âY™Øo^ÂÒ°Wˆ©ï¿ú|é•3ÇQ»ªÛöï>ÿô[‚úÀ> ™GúÅpr '¦!( jÅiTÜk¦¸“JÛÝîäGwÚª‰úo$`a`a1™ö‡-µÿbúô˜ƒÉà@ÄpFâÕþýôB=0kŠØ r‹ ·Ö’¤O¥ÄDÊ!6ZäßÓ'¹úXŸLëdXhg'ÙKN˜… sT¯3:¹lšBÌ;¬´RŠH‰ù‘ˆ£³ †ùýn ï(µ+™xr™Ì4‘û–ØmÝû[kc…õ·'ߺ»7ÿ„ÖÕÄ¥Ò )}ñÆéÆCdQ8FØl‰¡¡ ÅFêoêó#Íoež+ (Ïå® R:t·:5cƦq½‚›–vI?"¶+ƒZÖÔÃ` ×1,ÉÌ v•–£“µµ“½Ë3‚øÉM wÇ(HÍâ¾ÙŸ(~ë¯k‰Î 6ð$`õò‚Ús1å*Áˆ{u‡Å-*ÅÎ(¯µCOuC2` êØfÉœl¶„¡QwJa-3>ŠA~ní²D …üøáC#¸¹T5 çöìRþò÷¿òí×´)D$,,b@ ˆrÓÝɘ¾uI|°:láJWœTo³Ç(0_Z¹]ùÒOd´ë%y˜L:û @#"}ã7Í/=ÛüÝÅO¼J‘S]r_iübVŒ'X‚±³È0›ð•·ÒâËû… jU˯¤>=ãVüha&•Uàß:(\:”sÉ!ì§Ä›[ûõ"ìËpX˜Á„þÕÖ'Ö–?™#ÐúüjçÌAw»Û7¶Y0rŽÚ_ÞY#C#ð8Í„Ð!ê¹®&C ´úˆ‚)h¼ÄˆñÀ&2‹7ä`móÀXJÆâÀ  F‚í ƒü9ñ ³­“aÃa{Õ·å’BR…±a‡YàÞ:Mw/ã¾\ŒE¶K` Ín) ²iú S M'ÐŽv5*‹3 NĬýý¿„bŽ}F’̓‚ä™g‰·¹™H ¬`˜%¬,Ó¤¼ çrQëÞÌZf£‡2Y^;|4ÕýVfÿÍM…¨Æ5D½ŒÁ‚+ªc]ÝyÀy{a×a­]o8UOÚ;䮨¨¬ÝF³ãõÍN(ÙT7 K‚–ê²$3 RŒXd  ×w;) ‚çühßÍüü£‡`éU'räùÅÕþôì»_¯#33Yz.Å&®"BTÚsSY@¥T{ À(¸Ž¯oô"q2~/€ÀˆÕ4G (`Aİô¶Ôì:»r,¾3±ôp­­šš95Ÿ^½t¿ªSDèä5>øÎ7¯·S¤Cç9$rW,ÌúõÅ^õƒ ÑÒÄG¡ÒºùBÚáÐ~÷ôÔäú­µÔ}1+ä(ì¦SìÀï“´"Ãæ[ÿŽêYÿË?ÿ¢6Êõ<Þ¬ª 7áüsž¨x„ “Ûž#¦ûgNn™O–4O>˜þD¡¶1´D42êÔçDPN]íÄË„˜6®âúr1¼þ_'N½9ú‚ƒJEmYþ ÿbQ+…ñ]ÝŸ}rÂþ°÷AÌù@0¦×LSIÄ`œ@å#ŠçÝ} l|2ôñ£vámÃV8½‹~qüA~fD"‹iÄÅmC²Äéˆ",ýF+±ÑHüñpXkØcTDÂÌ~JyÖe8àò]ž1OÚ#;Jµ$Ð'VOÅ!DtË> `*í¹Ì^Q+¥(‰$Ï&êk§úÿßÏR%}TKBŽSN„öËÉúy0½Z{6óðÚÞýhV.Ž¥º…'‚Ùñ«ê…QwårÇXgRí¡ž]?¯wºGŠþŸ;/””ÊÎrË¢ÉÉqÃ.8ºÒ(U†B£bØM;-ßgIlãøÃ ˜øÀƒ®ûSì•>P®–²·ŽòûmF&;Guê ‘s{MÔ胿ÚPÄÒgÉÚ|É~cjw"Ž—öŠYsÜ«t ‹ì å6*Œè¦ÚZ!D¨(ÁÍ Š0…›0âש Q×½ŒP×âæÚ7î^Ö¥k¿q•Ri8Æ7VÜ/VÀnkÕñ‘ŠÓߪ¨ ‘LlËB¤ó™tÆs,ÒZÐÙ9»õÎRêG¾4J;*VsC¿å³¡8¯GÌ[ÿÎÿ™gÖþ`ëó§"Í«ÝèâzêsûÈqµõŒÇ€Z“Æ­ýaxìŅ̃<Žª½N|ëv‡œYwXTëºt óÌ„gÓgëQRw÷Ñ£ÛT€,æÂ{çðí—÷)‰*ðΣSϤØ>ÕIBÌŽ3Š1¿ÛX5Q©È5Ì=?Êt¨do¢X;ˆ± 0NѰٟbAj±êÆŠ stë±spÁ?9œVÉí*]0ëXø$ëÌ$ÆcÛú|»ç@X8 »H"!ͨ@P$2 —üôA³yÏ=èZÿrŒ¦bŒ™Xv`ÂvmÀLÖq•¨Œëh›ˆÄÁ'DZA¤Ó¯앇ÉÌs›Š)QnØ’†“Åb2… ªË4~?âQðAexsb£0¿¶¼k?Áëí£ žWÔòZ÷0–_‹‘¥ S‡ÕÅ{Nƒ.NÅ st…RA9¥«=pݦAÇ5(Š¿ªÛM’ÑŠ‰×SŒ#ëˆð+A;§—šs«“«× €D9[ð·t³Ã  +Wh~mQ˜-õ¤?ù´zËÖ®›Ò…Œæ,aS‡Í ËfÙMc¯#ÌÆÞndýX¶l6²ÆCÇ`ÔàT”.*½dTÑ­û›Ýl.—Gé.|ø   ×톈Q$Ȧo|E ¢ oµçŽ­dÜF•b>ÇvàìÄx6—óâéƒÒÞ]Ýk÷àå_›Crbùy¬í þ Fm6½ñòÅÓ«_n~ñ"j¥Ú¡ò~cúÇFÄÒ¹#r±¢î~55yéÌÓ¨ù«åW/í¬l¥VEfÝ¢£ÕzÊ*tU|ÏÅQ’,ãcÝ–ÕxÙ–Àø^ÿäÝö§ò†¿Wm|·õÙÝhÓàNˆ„1;£0ŽÄ~–pA)èõL¾‹Ãý•Ç%1Ç£±$ '¡¬&ì„$¥ÕÔ߯Yžžé†1ŒJJì û†ÒŸ—"ö 1R˳Da£bì|Q»ŠP g¬óLñÝ-}DuîÀÁ4ØqŸÏQ‚uˆ?u6~mË €Îzõ8¥Y%ã{Ð*ÇšÄ쬈b؇`ˆŠ9F’i–ˆ¡p°{§¸B@@äWZãék‹ÇöTÞÉ`Æ[Dœ˜y]bTm¾¶×½)…ƒŽ4ÝzNDvwÂ4®¬›ê¾ªž›.Œ0•(Î:h¤Ó7Pº†ƒñj,¬àÖ‰ÐZ1s€Øb¶Joä³Îª³ïÖŽâµuc[…GŸ2aèV³ÓÐ}çÁ\Ö´‘#Â~Í3X¶ˆ öRY7Ÿ‡;º‹>è’“ ·ü¯ëæ0‹aŠw¬ (€$¸ ÛÁÜ[`MϲªP¶ÞºÚqS£ã.t=^ J$Ð6Œh}{IÆ,fžãV­ 6Ǥ¼ „G$é¡™bÖs¬^¿‚:tº~ùªœù;;Ii'I÷£¶d[¸ˆêÁ[ÿ»ùùÓK¿ï}q§FrÐmnzWo§>í´¥(œ¢"ƈáw¾·;³ø©CÀ ~¥ò¶ú‰ÙGÐIMpÉ¡ÖM¶0:2šUð-ƒ}¯Öú³f;×[þÓ™ã¯ÍžIW…õÉc(Çx¼FÔ_hrV.D’n K !£3.¢¢´Ïy-¢¶ÿlß‹ TÂ*‹M ÂÆ˜Ø@xµ’Ú}5}<ï(D`Æ^0”8~?Ú“„b”¤Û©PAجV  µ4QDž?è†ë×`~2zÜž™vúÄÁþL(‘¿2Gµ+!`Ú% 1•v\­’Ò(¤Q"0É Ç‚†âpJILZ‰Œ’FD#v@Ð?qѪøÕÕ©ÑÞòÏóíûéîôr›èPíÖØyÄªÇ ø‘Q©¸-IgË`ë†å>¼1w®Pr´C}Èu]M¨ÚË£ÒfžË —sze[qH>ÿD“<¨_t–|Tvú‡BéHycî>߽ʊ­à£ðE·¾‘„JD¯?~81K’=J˜pjâ-•ÄðµDò"BNFeÝ Šˆ1˜îHM0’YͬoF¤t»k]ænÈ ìăâ ´‚ÜY²GíŠÙ•s±°¶˜‰s)€v‚„ÆQ=6ˆ!ÂdY3 @€ G‚z8ÓhOöÖ3Âq—‘€r˜³³b|F#³÷©ÆÅk­cÿ|?j­T›°3°ïY±Ý”zûKéÔ­ÿ:ôSŽƒ´QI½¹JŸ8£)Ή¿ƒ,"l€9ê~íÆÙJå''Q8ªUï\Ÿ~¶ü˜ý©<¼]#ÍX8ž!TBØ_äÚà4‰ÍÖ,ljÓ@@Œð[ží\üä-aè_mœ=é°F"ŠÅðw4ñÿ¸¿å”Á^^šÂ)'£#¥[¾×3YTqëÑŸÓQZÇI0‹lL[a¥½«”á˜ËÅÑ9}L©ý-¨¯Y’~*³€F‰ Ó­4ˆrUà(ÚZˆ GÑeI„•Õü~ÈwméÍ×_ Ì lÀDu)•NCRžãjí R!¢Ä"R?^»·QË9]1Ø[™?ï´^¯ËìN‹ü‰³0ã7öHÚ£J¥ÓÙbA°ÇæóˆU Å™ +º ?"°=J Edy•‚D …\#œN]ze;´{ßþ´„"ÅñS/d! kT× §å4}ŽB“ˆÊ¬E„AíÒkâ ¯¥V%kÁ˜~ãfM„`³ã:À†¤"¬"ð®—ñþ»åÙp†ÀÑ#ª‘bËc_[Ë€ \ú õ ¿÷­]_È@DJu–iùÙùBûs#kþŠ£ŒÍâ8Goîû˜b€h³óýÞ³ùNMg³9ú׺N23›RÚ‹‡oqÜ%ƒM.²—¥mïŸ;ƒ*e÷Áw?¯€0èêî{Ú"‚ø‹s1ú[¯„i_ìækCD»P’Ð=üœF“äŠZX|βåîX†¾uÝö¹ÀE™¥[êÈðÔ® " ATCvŠ*áŒ"àÀ/}‹=“ ƒE‘³0„ÆF]’"¥&EPŒ1­K27\ vU¢PD“ãûÊAØ`ÐÚŒ@@y®v×ñ¥m]Llñ( YGÜn!TÉNÅ®-j‡ ihÛÌ>)91’1sc³3åý uv„‰¯<ŽæÍCä±·Ží÷üïg—F£Ï18FÄ2æ€P„{w÷ÏñÛ²3¸:ù¢›S.ÁMÏ]má¡ù ·£'=V<Õèë—ƒ JiÁ°'`‘Povv„[‡ë×™­7¸ø έ뼵6<¦„°¦ÏWTtÒtŒ„E‰†$ItA@ÇUÙLL-À®3Ì~"€½º^5ˆiÕéEV>Í6«ž‰YIbÅÎ /·h³ív%ê Ïgª[a ù—Ž9½•%„J*„Œ£[½ÐpbS±ß DÔ¤”> åf V'hiØ1ÐiÆþ¥µ·ÕPèPm£kuäpÇóÞ·ÖvüÝ8¨”J¬óv«·mè) !‹1æßsiïwßyêSžKZ;í%ï[ÎÓ”±©T‰3ÅpüŸË^š¼ú‰3¢Zëkoèów&²CbuÁU!¨ã%%}Ir_¹+6øÏ6#}ì{oL$ï^}ª}ýc³ <šá+½ÏÌ Â‚ãĪÍ} éKüPA#íš¼¶\Ý¡¨ºô¶?´`¤²MvÈ–ïdž¥ûForèþxjRÅ{bn`66JK¢,¶¬臎p#vþ)F„CŸ­UL“µE»u|ˆ1³\ô‡öÈR-³ÇÅD_”Œ_l_j ¶7»¨s¹¬ê7å8 3EJ©må$Ÿ¾üa!ŽD¶V‰aÌŒ8Œ`ßß Ô¥¡õ+ÓGI¤þn-»ó^ÎÉè}õ|îß™‹z€pl¦b*€T¶a„êÅÒÌí'ª8¤X‰33¤3J3a³ë­Ý—ô©\¯1Çg2ÆØ¢>øœ…„‘ ®`Øîsq|ßf¸gadüÖ:ƒmÊ?¾oùf3|²‘™É ˆÙ±ñÇ·§Dxº¨±°]¬\7§3y%€Í@ÕL²Ô#)R¥-èd¼0@ŽW@Š-P*ÖÝ!€:eSgôSÔ—É-¿w sŠj7Ö´1eò]ðm"ªä0kKL%(pWÔêÍ6šS½JAB@`)7U’ì.HÅB;BP zfÓT[(Ñì'³ß®Ž}éY”ë R¢¦Gæ8j#‘÷‰° ¿ñGÿ0ñµ{Ï? J) õ}wuÇKã`+ËØÇË1Q€YؼúÚ>çñgç Š©UoÜ>gG:Åл¹Mâ}Cž]ÏJßÌ­ú0$Tý4Ž¥gîý?ó¾ú¸ ¤ÃN°ñvéS›GÂKâNHR3b£ $-H$퉛J!˜ é8==Œ:N»4îDqÌíÀ¸à´óF°)‘þÃuµ÷¡wl(%€¤Ø©"R’Z:ˆïí¿/%ù",È"b¢ Å(€àºŽb‡ ¥…B{¿ H$ +Î1Õ~€O¥”ÚÆDŽy~ÌÌ" a£ à¹Êe)x©t TIð/H= ¯ÇØ«oÖI’Ä°Ä ,¸ •nG–¥À­JiƼ¥Îe ò«f{SÉÌžkOvŸÖòj°£g §iˆ¨ï¹!¾¿¸ç {²9·Ÿy†¢óiꤢ‹M<7Ö“ ùh‰I$%;˜$Iˆ,i-äwméBeoö>ßÞ‡ïw™ ‰ÔþO†ïëjÐå‰4 ”vt¾ëÊlk¦&”Vƒ%tÿté9T:—Η (U1QRUɶ€T: BF`@mßYQ¨Ž2àæDefÉ8Ðycq­£PñÊÉä Ÿ¹‡$ÆëuŽ¿Û(‰@Ä›lžÚÊŒVºÃ‘A$4u£€²þ–\QB–×z~«îC³3órþÞ+Ëã¿ò¬tu|”Ú,¬dÿQl@ØÿÚ_Ž}qè+kŸ=† ‰‚Mëþ©£râ+Zú{b+l‘æŸß=¹ŸB@Øê\X›.õ"áÙ±¯n¥ÅðоŒF…4¸Á0©fã(÷`Àz|ø7»fÞ?v ¿Ó»¶öôÑ*~Ùgñ÷ÑÞ(Û4ÂdݯqÐq£4‹p[§Ê#¡‚„€ °b¼¶ IËœ´ &Œ*DsÝùÒ0!K‚™9³ÿÊe­9!ÇZ6@‰"ßm¶ƒë°èØsËÀ&ªÝÂ=CáÍh>ï2'¡ÄÓO[Db‚n«&ˆðÿç꿃-Ë®ôNl­µ÷1×?ÿ^¾ôÞ»Êò@Á£ÚÑ ›œ!G#N”4 1Ô3¤F#Nˆ‘’šfÁÙ$»ÙÝìf4 SªPÞeee¥÷ù¼×³÷ZúcïsïÃD™÷ÝwÎÞË|ßï ′,‚0”[¸’üÉ`‡+Ãpm/vÝà/…§«ÊÏÄ#€§© 2†dµ½«zýÎÑà Ð{{sdöF.ê½>7Ü¿2FXŽ6T.S þ³¾[¿°k; J¡÷Ë€‘FE¥RÛŒ5oâèÑÌ&B¤€¹` |­$q{Æ ‡]0ý™æöñå‡ä¶ Õ_©_¤»Û’sŒÑ;Ÿd·tpËç•öÄŠ®·Ž*ªR¯B²&½„²ÒòZ#©m’@ënæ 7’æà™”qHHD4ór`Ã9,ëœtHd·Z€!ˆ]ïÆHÓ¤©ÍÊËJùK±@§œn¬·eüa½¼DÜ*ìtyЏðV7ÓËÜX@5jf£¹µÙáÊv{ï—'î¾±8ýמ P+*RaПô(¿4®ˆ%qacó$Ex06#¢Í›ˆ¡©XìCÜñ"7K <)AøÅžy`+ b9Çüj«>{³q¼¡À Î; T÷7j¡– Ú‹Áä G)İ œg™B@… ‘™eõÀðÈlodc'òÛ­‰=Zœý×uòìic. Ñ2v[k)èR¬8¥jZ;c£€ ýÙá%¿R }¼Úu9îs²¿p|\b¡“äÂçþ„cI; •IûVütÀ soÙ£Í&ªÙãwoÎ^ ø½¼‘³p¥¦ŒT}ÿé(¥öÁÂþãëV+@‡še+—PÂr°òxWp9áãqÇBòvâ¢]cn B‹XE¡N"@ŠHV»GîN޲i$$Pøù³Ëw×i ¢ÉÝ. áîOSX›?z»‹O–ˆ´×\ïh*ýd )Œ*QµJÐêÛVõa”Ív ÔFÍiâѶ@š€q€½WH~~O¶Üƒþ‚D¥ÒX²¤Ü¨½0 jWÍr,å&ÅÊôó\$±\¬%eðt!ѾÒVVÑ+³v¾^Í„@$U5öOÿÃ|X†;ëÅ}>zjWoݬ/µ©¶¾1õÝs?]ùëOJkoËǯtxN—éDfÆvþÝg~nåÛŸo(ÑZ5ûðîܯ€&"_ûl_ ÈnýÁèÁ‡/?¡5JóÞC!ž©V äN·ÖÞ½§„ІÝ6"³Û,¢ 9—ƒTr,Òû-õÜÛcŸB ½$ûðöù'b$EäÚ¡Á| †ŒTnIì°“À]H5EÔ‘rGB¤\¹JÅÅêK b7s.|=n°Ã†YV®ª“S‡+NÃ]¬B8¤ŠH±?¦O6¼²E€KŒr X U€"ÂAÈŽUäf”öÎ2×[ Ñ©DRÄúU.³X1½õ.P)ÖÒ“(B"M€@ÆMZµ 8å,Îãçbw Øà[;ðª>šv¨ƒ„[«½¥÷×ÎîUù;«SSK‚Áéêëé3ÔÚõwZÇ"•Ћt 4¯Ç‡¦6SW‹&I®DÔh„º®}¨Ê›[¸kVœ‹€„ÁÈaÙ¼ôBè™A†Éþòj<úètç3)µçìÍ#ËF—ÏUZˆý·zVð“ÃÍ9œÚ§½‹Úå9!x#Šã T¯ lƒMº*áQ1Ͷbˆ‰Ã lr&×7‰±aï°""<þÞºÞGJ³°t`O:›tñ §”îUêáHhûÔg£ó¾±hs ,êYèè´û¨#³ýÞtwsB§€ ا~,ЀûÿòcýhP¬‘±'Ø6Ý_êTG¯oN}yìîÌþ­ç”i·Õ÷9°âÿç5‚(Òú—w_øÊÕ×ξ¢ˆÉf¾ñ‰9ÿb€¡¢ÁGÎÓ#ÖŠ5ù«?Ú«V¾¹ %çæÒ•…`t´B™]½_æ ð™XSH^QRÀ²½Lb‚W¼›…çïþÌ|üÌQȦ=û½ì S;w¼KÁ{^âg]0¬0š €5I€½¼”òh€¬ ¤¤+Ä9H¤÷(ØóÂþN÷é^`¥ýši”U&”BÄ×"†ÅŸ8ÀVï8 õƒk.@¬±þ/ÊJ!Z#¸$ddË´uŽ4z7édx‡2zF8ƒB7é°†µ’vZABªê‘ H‘[TX@’@9Tîà´ukS)òý‹‹À ￱…Ó²OW0[s“æ»cO¨|ñ'ÁáÕ>ÚÝ'–?š~6â·Ë©J¥H£pG›^_ÙÛP¹Ṳ́V!‹„¥ Ò¦{cñd¶ˆô$jr"K7@Af(Ä Ž0‹‚$p_|ðdºr°»qèñ#BQú/U篫µ®¦s‡>]@³bàOìô-QÏB;‚D‚‰ `U‚Z½ˆý5î÷Z¬ÒjÍf„Ò˜‚8Œ“ÌiˆÉ½JNtD däWƒþuSÂFDÓGªÛwº›ùÁÃpç>dT‚š ô vAÑÆY?§Ùò@ó4ð¶Àîþz>½Vžiu¦%W 8³°¨bÃkÿüU>pñê em•ž9ÖíÄ›õC7§~áÀãÍÿÍgÝ&Àr±çv ét6ÆÕ¼ù™'¾{ÿ³! ’Þš¾¾þŒ%…h0 fk%·½ß¿yvEýÅ’Òb·W>l{'ƒ ”Ûy¥ƒrdD# ðœ1@ºç‘\”­kðÑù(­I¿3÷ì£Í/WHTž&ËoìýfÕíù’e1º#ÌÊM…ÅÚem!DÈÓ¼”˜Q*Æ`>DŠDÃîx í¶0{ Ï Yˆ-#Ä Õ€¸>L<–¼âA¶Ö:ç€èJ€¤Ø øl±Æòdì´½ží™‰IœHQŠ©©¥â¼c—]¿•#¢.G”¥A¬Ã@J‘5A`Ì!­à —.ÂF}¡0ãúáM[ІCC$4,Ö„…Û+²?ø_¨!€yc}ª¾^¨°uá,ÎÊQ:Ã@âÉ«š] &Ÿ†#57`1’w;ŽîQSAœuº—Œ­¥rfDQa ñ‚"§®I IH:žf‚ÛnMßÙU¹Ñ`Òò¹‹ÍÚɺÈÞÏÝ{‡ÁÄûÚ·O>Ꙇ&Uø­¹[ˆÈa©¤Fëͮ궒 »jTd­»0ˆ¹ßóF[`öf{!%H€Štøõ=æÞâîÛP«¦´«Þ|÷n§bÞûömÊ€Êq(›&ÏØˆ"­œÉX…÷Ã=H*³“MÍVû» G€Â£ÕÇ™Ôb€ì·'y™rBÕÿä<ñìvn>]N§gÞYûÂÔúWFÿê%­ÕP÷À¡5€öºf»øëݯÿ½ío´µ¶ÌOÒé'F°ˆÀöJtav‰ßØ>{}ÏW•XN–]-hÆfJ¥€ç·ê–ÑKÄDƒÞàV°Ì\è]=áÄ©òØ´~¯táƒ/i mÞåæ^8¯Ey³:ú´"<È3$aËM à Xæn%3•ŠR–†z§ütﮋ”rP¡äwÏ:ù£ú¯šÝÉêÞò \€ƒˆ˜2ôœ—9¨~æ'â,g,JiäHBB ˜Ù¸¿œÅ¥•ø¸ÆÂ à5â²ë‘¼³Ö!@*—BL±‘ÒÊ“±0`öKþé"E0¢k-‹ hq¸û¹SlÈâu¬,Y²íÅ=#Wv]Ô°ñý`z%™~²ûQô\In%e÷“’ ¥ÝÐÙy?4¯'ª²‘¼¹é”JR¦-{½±yÇÏ‹;­È "Ñï+Š/¤.`Û- ÒÈx3ªÞ¹\7 aæ«ôÑn[ýÒú¤„, c%ÀîÉïãÄI…@ºˆy†¢Ãp}w×+µ: âB¿%F¥vÜrn,Ñ8ˆSkŠQ`°‚–I‘B$Øÿ-]]zdu)‡ ýѽ5Ü­yí‡[ËF,ű‘V˜k±Bêvn³{Š €áÞZËTÊË3v®2š`À\OVK(ÅJ”ùÉïuFi½;¼ñqzìå\ãý9{¤ñÞêÌ—&ï½úhæ¯>A µ¦Âã…Eaæ~ž±fä“]ú‹áW~i”(F³ž>x;xr¿Båº#ñžúÂDcþŽ>qû¹çzËçEôžQNóÖÍP·„ÎT rç)/@¡…²w¸îéùÚëÇ£«/ï¥YgóúÌ®ˆ|ÐëwÀîq0Jp"Cl ê’ ,sÖ*«¼V'PuýHœ‡n=@÷.È€?Tèà-[Éï­FoVNìÒ(( pTõ{ÀR<ÞÑ]×ä!0ŒrÛ·þç¯T4)”@ÈýÅNg½~“7’êdE¡·,`qrzAž[HÓ¥m@Á¨c•8 ɳ—­*ˆÌ Š<õbàÿñ{‚A–Ù`^Xì6ÎyÑš} ebÀ½P%A ‡ÃÂ[}OìÀ)ÅÜÍ­ÜYØZؾŒG·{{Æjˆ’ä:’t8”7…[yXñ 1d¾’†¨¦ch‘ÙÍEØZsÙŽã;éžF„¤¨PÒ;,’Ö­±YkÀ.G:ã¨\ª¨ˆ0#Ô ûè¡R_‹T¤ÿ £sÄ Œ_ÅV}Hkî¯mLVî=òS ì®Oˆ}[Q!!õrFDà ›Y ¶Öú™”oDÝ–÷Ùm»»“ÍÞ„äˆñRµÎm…ÓD̽óK`DFÎï_~cyÿ‹c·êçà§k“_m̽º½ÿWÏ ê€ôÊ»7ž¿(ŠBîmtÞë=ù *Ÿ^tn>†ÌÉ_>Ò2_›Pfy~Îri¦k^yXîgœ‹QÙVC°×ÏDúz &ùå$Šˆ,ÿéÌÁwÏ>V%yžþ~~2¤ÂC ÃùöN&þ1envD)ža¤ J‚ /*Ċʰr„áÙl`^@ö’c;wJ#¦Gg¢(ÉAÂPv`ÎÅ·I莃"½ †Sf#Öô½´ŽJ©`€>»Ðò­è´ÌmMí ‹cK@À2»©¢éöÖz¨Ka˜eº)­µB¤¾ÁÀaŒýTÝþ·H0ðÍ4AàôÈE_E« 윰C:™wWF÷t^¯× ,oµÆà‘ý7œ£æ6iîò & œÕ "uXªoçƒÐ&êe†AGi—󸵹§ýVžÝZDŠ/wŽ!€Td!söC‚X=½Ôj~ŒÈ¥¿Rº{Soæ8ñ¥õïö÷bFá¹æñÙOöÓŸÐBUžµ¨m‡#²·.£6ÆÁ™Z ?ƒpA¤é>ÎvëË­ cˆ÷®V*¹Ôž¬¿aÏ–·;©d›îW»‡h(%¨gÆ" RlûÐÆ‚”À¢„xm¶v­IÆÄm«eÀ‘/fªEÕF¨0Š óž_ÖʾúÒnÓÛ=·(DD_Þ»qYom ~~ôû«ÏEV`çÆä.Q ó{ßãð¸FÐ^ýàkwˆÖeU­Å,Ð[ÓIÄ&‰ô³éšš[ R Ö*· ž9bn¯ÇwL€)`ÇFÁ³'äúº[ý!÷í@-MRÎt,çF@ìuœÖ'ÛT›âåÒDÈF˜9Þ“­ROÆÐEgw•IòLŸ¿”¿úiù̉pîNóб­õ÷ýÜÌõ·š'ÿÊa_‡cá[Ç&Ï5L&›ÿbëËãßûù°â,³ï¥3ê¨I¹@·òb+ÈbÙËw~'>üéóO"ŠlÝÛ4<²'ÔÖG6-N.+­Ü˜­8ß{/Lç8>¸&Óv~/|R}9ÀmWÞYúÌ™@ 1œÓâÁ`Æ¡+XÌr K”Ó¶# Ž(„ ˜ka,‚(HnªéV‚8HOÀ5“-3n¿ŸŒ‹32MLœÀ Šn‡´#º§ÈߨÉ1wAVˆ ìH ¥X1¨0"§¾qÓ$¶ùûvboÿ.œ µGzÁDyuBÎM«e@(¬ÆaNå8Œ´RˆD@Õõ KbËE¥#þ¬H¨<ÂÀÝÿþäST%AœÉÉF€€¡¿½P_¿2yH}Û–­EȾÿÉÌ9è­J¸ÒBcDÇ„" Ô¡ŒQÅïÛTÀÐt¬’\$úëðÕcÙeÜ{†œ{½SÈúÈN ¨C “°ãÖáI³´ëñLíF&0ûåüòv¾"ñÙ§Þ¼~vO"»eù¤|J¬PÿÚñµžŸr¥ì$TP×KõŠF í®¤‰µÆ$YÚ)M™¹›•4ÆI<$Ò¥ k° µÖÕ/ÊúÕɵ–ã2Úû½ø¹3Áµß^Üš™ ¢¶#;åm ‘UNIf¬q h7µ¾y·}þWg‰”{ CE,,"‚6æö¿¾µúú™çP‡:ëØ¥Ëf•Ò¤ÅSô‹Aƒ0Ã;492÷̓"Æ<º™" îš@Eë’>*¥Ü^ÉÇÝ ùdàú攜óÌ=k ¾}`샗‹y¾Õ|§öò¸$yòÍŽA   ïˆv¶Ë‚± ŠéÙ¨ƒS4Ø~xò³kdpØ8σے 7ºTR›[3·Í<ª]œ@°)V\^ù`·60Xîˆ×+„aÞ, ™ßÎ!U­ˆ%,…ÊK­…ÅZV÷šå³æ^{z6röç / EX˜Y¬á<ïnDЕX±¨(ŽHk$ P™“¶°CW¯€@`ñ’Sñ(vÙ/(àÇlþ[¥Â58hã¼ïº÷(Ø£ÞÌ^,ƒ0z¯bYÃscï·ÎÛŽ‰hÁ‚~Z+ÒäIQyªO€„JE,yujÈ4ˆu¬–/Uï'ú3%væS“$BË.æH¬?]ƒˆ±oÑM±H“mªß;Ðþ ¿>q÷>¬ ŒýƒWÕ¹§×¯!ȲYxt.FDüd²zÇij°Xvqô‚ˆTª©°Qžç0Mc¼—讚n7¯cËâLdýöBB-¬R¤àsó›Iù±…øÈ¸`§_žÁ;ÿn{s>\ˆNë¨é²)RÈ0Tæ¨ÒM  ±BèX‚ˆ¸Q§2ûhqcf#›n-…y€Q ì oÞŽ@*U¥ ý ×ë[»[¸çó{Þú~ÿô aûÓø¥©›?ÞÜ÷‹êã×ñ©¿>Mš4ùp=¿PÅBb/Â$Ì?ýÁÄ—>º÷•Ê"ê¬Ó«'_*y®ÿPµê@¿Æ°µöß:ÞÍÿ|™­í^_@žœªiÄycUì©ÑªV>›…­BQ¡+ Ïôâ‚@á!¯=xv±÷µ jÉ­ýôÎÇ*ˆ Ë-ÚÁŒöC£Â ¢»ˆÚF+è&¥LFŠ·yúÏ‚(èuÅÑMÂÀA¼- ¸T °¼ò>J¶÷UF3d[SŠD¸<ÄbK庆A¨N­ŠN˜ôŸ r-²TÑnqç±&·Kwà\8¿¤.Á`Šè’E,³3s·÷hA8ާñh‰¢ÈX±^ì)àŸ)ö €@ˆèVŽ "vA ó§­¸t‚;–l{~ÿÈ{‡ŽB•ýˆÃföhóvx4ì5µÒVHÏj¤  ª€é³ŠCNZ&P 43b£(1×Õî…tlVc1\u 뇗àÔŠ$‡ˆ™ñV.Òc»Æ“î¾Ç[ $;û|ëÓíí6¨/—КþbòV¡½˜«'IÏ/í½iðÙHiȾ ˆÐ–U£`Ö^GBÊÒ4£ÌDí~{3˜T¡›3S‘VÍB¨´žüœš¿»û~W—ÆE–Ð">üœ£±—öÝ{µ¿ï¢šÜx¶~ûµæÑ¯„·?”'©†¡VÎë¤õT\N†³ß¾rüÉ$_/ ¤»Ñü^º H),êâ‚.$’Ûîo.žz¼ûWbÙ굌Dè( „kËMý”F¥I˜yè¶”Açp5  ƒ0€Íß.¾qà© (™<ïþ0ýæ¢Pa¶.ĶƒØ_/pwÕ¦ŠÕY–§ýRÊ¥r( €Xp¶½YÎÏFÜœ‘>‰¹ÞbyÐÝ.þ†9t÷™²üÖcéýÂô¦ŽZ`ÏÆ.ÒÈ{B¨¸âP‚ÂlìM‚",†Í·‡7_™´t»öч>S'¥½êke%<œ ¢³–‹"š$‘¼Wb¡u ; ji(¨À2ÂLóþÕacÄš•Oiÿ"¬Ç^H]Á*|s=ô6zòŽÀ1ð…@žôCÌ Œ`´ˆBí®XgC¾Ù ÏóÝd×*—3 4Øø¾-£éu·z€µ2å6,Ç‘ÖJSž @d…ÀºšYF·Átà€ð9K…‡ãþbB0ÌrÀ$„°·ÙÜ¿×=·ËP÷]• P7›<½qG‚ž…ƒ)¢ˆ~q´ þ;PYk*ML©¦”âîk1(gÇKh$ýp÷ȵu¸8¦|È€[‡ÒuaË¢I¤cý‰äRªÇçöµï  úÌñ•›Y«­Æ¾8÷†}á©Ç?JÇY¶Vë‘ÅÇÇGPë[4zÅ©ŽŠD'R¥R©R«/¦ºoÐ2JÒê‡BºÇc#µCHÁ`gñ½’Û3ÕŸ³–âýž?´ñþ:ì­ÈkšëñãÒL€@¬@¬´ˆlÏ寂w³Jñ"bcj³W×˳¼ÖR L¶•âÒvo‹ Œ¢° bº¥7­ìÛóæM¨¼|qþÕÖÁó|59ö„zðfvâóÚüæ# ¥‰ÜàÚ£™°Ì ÖÚÿ^¿²rë3'4†˜%ðÙ;„iƒS˜EØŠ°…ldþ«G“;L(ÑÉ1µ­±wpqˆ'¾f?j§Ÿ¯ÿéÆÞ/uÿl‰j,ÝÍvk‚ß=ÂB²¼pünçµ"¦ÁðV‚ .•jŒ€½õÐô‘ÄŠI»ý˜¡a©•X‹‡r×0PàD¥îÏPŸ=Ôû4η¸Äϧ¨ÒœY8ÛWù` "‚ ™-ˆÛ†IrÃÖà*!$Øôû^ofsm´ !$¢0/‰]N67¬•z  %7fÒws}rêõÛ¿ðÌÆ÷îªN ¯¼Ó?õ\ÿÝëµ_xºäž6ײ ¨Ö…?̹Màμô^òåªVaÚK®ÞßûʈGtÍ;Š7³kļöö>camÿá:1òì¤&˵<õd ”*ŒáÈ"þ­(ì^f"€Hâ^´VÿhzÏõ'&ïo¼?òÌ´•md0à€°8aÿv)ìÅ‚’7uØU£Š¼ëѵ2®hp€iržRvn‡ñ×l‹µl>= ƒ˜¢„êWèÓaçÌwR6ýjYÁ¦yA–jE”jv_ªef+Ì’^å½»6î裊|²Â &—AæíÍ@‚J‰¬Žã0Öˆ$DnÚŠDvT8\éºz7ûóºPÔaX@–y%:Hu?Oo±3­_7çëLs÷±ÏRZ°c'í}˜ÕZïT’‰È‹Ó^Iª4cX)9QB`6úaDlÚÕ윚`ÉVOê+it!(öòÅŽ~à’q#*@i ÂØøÆØš®Ýî ¨¯6nßãM+‡žënøÍÆ›W Ql¦íùZã²=¯•ýøàÆ’šŒ5‘ÕžÇFQT« n%˜eHll–Ž­ÌF6Y39.QàTCPŒ}E‘B ÇŸãûó“wÂpü¥òí›&^3e+F¶’¨;:æéS(PÜ2L:Ë³Ž¾‡pµú4½56ÍXˆ(™Û)…`#ÜŽ-).dZÒï_=Ýýa=3ñ½OlðÜs[?^>pvëQåøLv÷~áÅ­+w'þ“´rÚ…ІžÚó”Y÷ÿî¹éwž©Ù”ËrúÉØª|?Y8(DlnÙšíß}|daækå«-‰Äô¯SyàÔxHJ©a7Hy“ás½#¼p÷Y~ÿƹ­¯T˜(K³–ž=P¡ÿ…k Aoð‘´ 6² ”>–Ûº*¡‚åæ`ÂÅ\}FY¡;4À0¶>â™nûX<¢tŽ@‘v£ñ!Ÿ½PÞSq6yÇA¡b1©;è@TU@´g**Tº6·zå£ù8iD¢A(ªÇD3;p‰µ y»Ù,G` T)GZ±aíü[®‰d`0X÷ö &oft£Êâ„)Nä‚P5P\  ˜n­ŽŽ<¾½ÿ(@ïÃÒš`Tz¤Žî¹×Ž+ؼ>Za`;þJ¨”B­õ.Q¥ 1AÐ݆zE±‚¾„vÑÈÌÞ®ÉÍÌuâÎR¬ÄÂóœ.‡3Ý'ǽ;^ýÆÎ8eŠw¿~U*«R½°¬l_H1 ç†)kM2´t&v‰&ï‘+Lh$ §wuî—nå‹û×ßÙ¬ÏJ~¥Y lfÛëÕ­hŒ”… Q“VÊt-1ÆúÍ+{#3QÑîe»V¥Uœ<Õ”l— ÂL¯–:0°&p!!ö~kþ³[¿ß¬~fôÕ×{rúsô^sòÂzgêÂÞöõ÷éüéõ·7üùà •.Ö:E>È€T 9nþV륭{/+Œ¹½½ºRÞ?A^H8¨"ÝNÚ‘xÍüÿ‚ï_zÆÚöý‰àñéˆèÑöDßrùd¤Ô ‘Ä2ØÁ4~8€|JQt—Ï¿sâ&°é|?úzMQ˜€BÇ\Œ0¿ÁÅš Û±”‘EÚ\mÓ8¢èâ`quÈ@BˆžQ®v@œ´Ï'󰱆ÓÛ[zßÒøîE (±rÝ# 3×þ`×€….XürÓ¤0FT E‡$z ƒrbs‹tV]kM쉠Hõþ?r7÷Öš Q™â¸jMD´Nj/¯žp¿ŽœS\€Œ‡9P~ÖW <@ÄñCpàubÓY.ï²oTÎ#šË=³M¸ÿ£Ví¸<†Ê·—jD‚ÂùKGE)"TAP“(&à­T£^7Ä6}©-tLh­iõî…ä#l<­\þÕÀìE…Z” Da,=¯Å <ÓɃ¹#ËèŸ/ßmöVûòÕ©ïlO}}ûÛë„u@ضyks4z«tŽÅBïÁÞ‡‰: !¶˜BO®£ŠªÖÊ­SÞ1 Ìb¬Q&¬nSS‚#jDB!….ÅKGÂ#_áåùì!ñ¾'Íç«/×[Øp“õ ±%lÇ´‚°ÜO0Npa¡pbº8ìNÛQmqJi\9h¥2VsÜ’j#@Ìâfú ÛÿfóëKÜüÅW& äð/}!”± ‘:üõ_ùÊHW=ÿäÚ÷[~u? jíÒ ;@°ÌÆâõ?i<ñþRDgë«o™'޲fyi ’–X!¾ö;õ±…oÉû"WÎ ä7+Y à‰R¨aw(ÅA;äÕylCS2 ßþîÁàêçfTPêõùÞǧž‹@ÚtÛRð(Ò>Ey‰ThKd¬é¦õÆ”K˜s#'* IžŒ Öø¥ó@áëë bË&_º*S|",A‚a\H(`p[‚Ø:êSÖaÿÚ}[¸…°¬5e­ɯWPD¬t®á‘™Í¹ÒÁ pëšK[÷.z‰‚ÉúÛ¹ F ¢*•(ÔŠ¤/ÀÚ+‡œä‚½’pˆØé€@,(惙Œœv\ûà—¢èè¤ýå‘Ú•''-"®Þ¿žq½tf÷vú„Öm  ,×¾X²¤HkSº¤Ý¬Ô’–”Ū·ÒQZØ5‘[TòÎÑÊ{©~aV)¯Æ~²"ÌM°b ÓD&¨ìo5Zªq¿ùsç6>iw:xì™7o??öƒ[dp ]Ï%Y*•no=+üê‰å:=šÈÛ¥€‘T)ŠƒJU‹àzW²¦fFUêô›¥ðÑb’«#XhËÅ¥_0cœžê~ÒÈÛªv©rã#sñˆ˜°‘”s˹Ý4ÚF5- :$1l·­%H+ÃÈKÅ‘DªÑÑn/¦æt§3ŠÍÉ.IзÓh;™!QŠ(€¬¥$¯ôÞiüׯ¨,ºödòE¸¼@¸•I¬ÍúåTU”»`ÊJS¨”J¬e“Yqº:Á’Í@Ïlw+5FhǺ½1¡×“‰jºÞn2i±¤ @•âÚŸûÿè—‚p—b“µ{‚ÌÆ0 Û¬ßÍŒÉJjÀOÿý¿òô¤RÀÎm\Ïn NinUþoןZœÿü„EÕmç÷²©}%B †rÙbuÊ,lMó?>>sgô›”=\ÓÄ Gö‡¦µ4¾AtI+]Ì’vÜ3è^%÷<ú@m°l-Kû£Ão_<*€œ´V®O<7N‚äµ .¿¾ˆQTƒ;›ãº %VÂY¯Ô3Õ*(F‹0 ”Í ÁÇ{úSÅBÂÂîƒÉÝûáôº:6ZBQ ¨¢ –•;NAC…ŠD„Y寏PlfÀÒ¡RˆHÐɘÍÃ5}Vßîí ]à'Až¬TðAÍû[mF¬†V‚z=ŠbcI+TÄìeJƒ;tÀQ ÊÏŒÚ|S….1U~6žSü·Ü\USú­þ¥A¥nnÌûõ­ïl MZÜìq–6›³ÁGÕ³Hl~zøZ^ ‹jÏmƒ2Ve!HVUÒQ!²Ma––ÕÜÈ¡°wÍ®ccŸ„‘ÖˆìÜr AÀGOdíº &ž_ßûùpîûw¨Ú ÇIИL!îš“’bE*ËŒÖrÑt,/xš;éÄF¥¶‘ÍȶÝÐËÙ¯7+u0ÝP`ÅV'¬ª”çÆ£|¹Å̉ô !¡ÍEÓæF'ef3ý+¿öÿù»ß8TF“sÁ[öÌM‡½ËþcõÒ»á×Qº·>ÿxò\5y” M¾+Yýw“ËO¾h6o¢ðÄùI4b›‚\,)Ò¤``»ócû¡)PxEÿ"9/.ÃÇï±ë_ªa€™É¾ßz~·“È{« ³à9áñ9 h—rÔAÖ° ¦«¤TÇ60ˆ¹ÈGrŸˆ|–¹ßº ³s™­´ßçQÓ>VXƒ*,ôõŽ3DCÜx!-(’ A„sÃÅ ¦JSY‘&RÊr…ÅîÝ„Ãã +c{ùôcße¸ ‡XwR2Û¼×Úî –"U"¥ "è5Ä#f‹]—G!æ²Né§€~ÖŽàƒ¤Š=maq *HÞ\­?¼whJòÎî;-ªx-QÛT‹ÈB¡IO<%€ªèrŒ ·MsuØLk#Zw›wçË»ûÆŽ ?Ùugžq—×2ŒZ%?é% @±¶‚ õ¡^ xìþ¦L}±']Kìø—n\U_ýá5‚ÊÒzœ/Vª÷×.(¶"wwáÈŒò&ÿdèRTÑ•J "ë)ôSr°Ú ë>Z–Ôé=ì±Á³‚„DN&‹¨êE=×ÛVêÉ=?U/ìïýd~™ÆSª¹¥3§¾e5‚ÔX ÜXagLÀ!Yd/¬ÓøÂ­Ê$€p¿Â‹õZ;m…áV%ÅQÅáÌ‹ùe»úñëo}t7™Ú³´DAܹ»Ž¨¨ß6¨ (OØv׃_ùÛÿÿþO”p8ˆã<Ê©à÷ŽÕ®?¤m{ó½äé 1(õ3aò"…ӕŲýø·ªÅ/îÝk"†™ã#ÁãÖäÈø‘’;¨aGŒ.¢ï |Œˆ ¡°ÏÆaáä“ó×÷>@¹µÉê_GE…eÕ%’Áûlbè÷XÅ<ÊY+Ðò!cK炃AÝá§8Äû æwØ b­µÙ =±>º¯b„Ú \ƒ¢}ÁBŒÃ¡÷Ô¤-¯Àb(…9D¡r{Y(DÈÌæ“|â`ónx†ŠÝ—è…gÕ2[+mÖmoµâ21–ª•(póÝÀø„ùr̃چ–…‹Ä€¢a¬üP‡ä=EìÖ­e= o–ž€·kñ¤cÛ—).%öUd2&úÒ¤ÒZO„q© €˜æÒko§•R¿«g*Ðk-šN%À§k€sOµ/Óø¥ý/ˆù½`Ìl"›² èxÿÆøòH|#U_«?\Í›£ûÝþÅ'î¼™Š”*@[‰µ’®¥céÇ»gEÞÄÚ¨%ò ]oÔŽÊq¥Z\&ӷĹeÀ .o­/åý탽¤»õäxYh€(CDBU g/æ‹8×Q‡.fïµ?‡ï¾›o@¥•T#R ØZãx6 ‚:T tÐÉA“±,;äÈBÊ;DÃÝfK•·ÆóM=.")Éü¤Zâ^Ø»­»05õäßø?ýµƒZ„Ån¥Y{ûÚ›íéîëWóxlý£e¡@µ[L Ðnµ7Z¢J&cIzãÏüíøk¯ìÓÖÛà§ ÷Gëϯõ¾aÞ[_)±Þ;';êNOdÙZÎßþÉ4Ê×Ç——kñÈž¸µ0ÝÊ.•C58fÑלÎ{5Œ½"(!£b¶þp6¼õÙÆ ßí_¿û䥒# vÀ;vjàÐä-Pê9ƒiKØ×£1‡Ÿ¸HÈAD !BeîþX¶ÌÖZî|SÛ|´1— ýÌL BŽÙ#Žà]T—E|[iï•’…(ô› ¯*°,,s[ôß·'À{êýꔡ ¦03sÚ^ßN@•••ÚH\&èÀX æõ ú‡ÆZGƒ ÷ýà¨,Š­Ÿ@ñs¹[Ï=%Éöòdü^ra’€pãöìíLÆ]nërÙÈ̱$ > n™ýÏ„¤¢ÝyPD·À$y§…¥îj>>’õ:½{͈[Ù}* ÔùõCøq^* œ_Co23»jJ!„ló Q€v×VÆ7g{ùÈ¥Ö~;áKOüh~æ›­ï¯1CoˆˆMÚ«³ÑGêPûÎÉÛIx!ðöx¿ÑQ™ã±†¦ëÆv…ÀZ`15œowzQ+.§|­¼…£ãJ#!õÉË,kk«v%¨^ªúiéåòÜ÷R\µ Ì«ä¯ÊÌñúBe¢Pé4g0ƈxÓ†ÃZ¹È!¤êtj*ª¹/oSV‚^‰Ö²­›ØÒSV¯¹Ýõ×ÿúÓ Ûí ‚ØõÅ{ÝyãÇöBc¾©OÞn+ªL ƒ.U­¤ËévËÆÑíï¾ú 7ñÙÿîþ­K#XFA9ÍŠXkíƒ?«¾½ïe­íOáÌ®X¹†tHŒ‘!\CºÿñÎÞõ™Ïš»–”¬v¦®ïÉè*Èñ‘‰ÐE'Enç»oê¥ 2Á[÷/ÜŒ>Ù$í~¤>7¡zÔî°3-À‚Èlyž$25”¼¿·i\ƒKåaæ¡È ¨pëí2ÁƒÛ¥@.€ÂVXú—[Q£½{*F¨“(Ï8ð ß¹º¤qŒ,,’§È“ H5ÄRHÚäüMÌœËÆ}:ÞÚØ59$®=/Xc¿®á@sP¦ T¨<5Åe¿'7y|÷ÖbxR‹ÛÅ«~#(,VÀfÛ›Û†tE ǵjH*É#„bý ¿g¿ ï%p“â¾)†;þ$𠡺Caƒ‘l#Ö?Å‹1ÈýÞØ €C3¶(TÐ9V([ Ü˧?WVõ *‡(‚½ ûô7:z V¹®úÆfóéheAËìŒR¤·žãO±þRaÕß¡«&@$* u2Ÿvz8™jÙÚíüäëwôJ.Ÿ«¿wø¹ùïõ‰­!˜H{’[ÛîïÉ?Ü·‡‰Ô ³û64Î+5ô@2D¡ŠÇë(Ä hs+ÌÖrN##››}Hk’í!h7ÜÇZiÒ®H}v²·–¬Jü\ùÝùÙ/ªËïKÖBîŒêA $!…À¹a‰k*(·sKh<ŠN å³x Oê&Œm4‚¥|‚¸_Kö©IÊ­ÉÒÏŽÄÈíõå­fÛXŠ>ûôH烟¾öë?™Øý÷uý¹ä{7A¢ñþ| ¼¿¾ð°Eñ¬£c‹Í½û›ßYŒŸþ¿ü£ÿl7Y!wúy(bç÷òN~A'ýôSÞ·/Ô>—›}ÿïh>ø‚¯ÿny|ñ³cw• 7“£‡ìÝ*%DOT#—óæÊ{pÛ8vr`v³vñî D …­|üÖ9³ö¥€5Ý7ÓŸ'åôq4ðß Ë@ø."¹ÅE€Ha`YuÓjj§œ·Ž­ûkEp§ðµH-ñw K€c3Ûº’×£ä`…ÁÚÜk0Sb9ïtÔß0…9ï§þaæ\@•¬Ö‚‘c¶;5!³X¾ÕÕO¦·íé8Öè“ üÝì*¶>ÇÌäíµ‚`5°¬Ë¥ €H»÷…`0¯¼Þƒ,‹Ë-p^è¡’Y|†úᔂ>&®k¦Û‹µÚÃÛGöÄ`ùÃ#W»P;Ù»§´‚Û½#ªÌw@%Mzé8ª•¡-œ Ùd#)W×Úw3ˆÖ–Õ‘û-,¿h äûJlÏ4\Ö„ÆÁvÀЍ  Œ GlO,NwïÖ¿A·ó­N¶çÅOn5~‰ÿp…¬0NŠl÷ Y8í?¬ÇoÄ—…’GnôøR¨ ¯‚RºL•RI“eLºÖ‚0Ðh¾ÒÊm¦zÛ»G­}?Þ”}uÑ0ô}#¨Ê ^lus9yzó}øÒÄÊ&Ö²*­HÈ"Y ’ZƒP â87F¤çô¡EvÝŽˆ™Ý²Šµõ1i–§A8£¨iŽvïu{åþäßü»—˜du{áÑÂ6©ôÆ÷¿ûêOoå½ß»òò™í?ØPS_™~ó–Ò•)»’«‘ÓÙröàú]=Y]î…§fWç“0ýÁ¿ù 9ð×ÿÅß8^Pn$ìƒªðæ«“û¯=uˆ˜:›+ {•°àÛ[ç?Þý"Ýϲûïîùzˆüv»˜J¢Œ¹Øn #-a·3®‰@ ª b£’Áiº`°Žp¹ ¶ÈÙí_+)(Œ)`!$poΰa&„CÁÞñÿg½žu)6b¨¢ƒ@‡qÑ ;©1üð‘œ*ÝMŒhD ¢"›‘­ û€n `9O··šQ¤(¬Ô«Ì:daËEêBa¼$dnûìw±…†• w›>Eªh¼˜moAM˜wOE(ÀW&ë7Á^¬ßê(PÍ¥2 Œvo¢š^Êë/OaTÑLÀÕM‰m¶u#ìðT(„ëÛÓ0‡x`Aáüæ‰Û°ëLKë×bˆbéHÀ„3µv¼5³±vzÏ­~×ÊW’ï¤_ÙÿÆ»lP‘Þƒª™ÓߠѵGçB„Ë{Í<îU—©€( [zøØZ“n.w *l°:“X *„À"í¨¢>ñL´¢æÃæ^üd×ùdƒæ¡f¼ÈMJ›Éîèrë|CˆôÝ̓7ê‡Û‹‚Ô¸ÞAB©îZÛÂReEÎ>SQ¥ ËM’ sÒn™ñ‰ÄŒìÏUؽ¶½ŸÁÈi­10w!>«}&]1.*&@@¨ ÔS€–|ä‘ú¼ùж7àüùïoí~iùO»î·ˆAUpË X¶6o·§é™ý"wñ{0r†"9ºÅå¨ÑΪé­íòºšVP<9Ýø¨Ù¿ùW7j_ùïÿ·Gª1zE [h~›Ü?{ˆ¸¹´>>^e¥©ò€aº¦ÛnÿÆö®Å=a†AŽÞÙÚ½g#âðér „Ùç€,7žš3Ú.¶]ÎÔ#Ì©}óö¥üJ¬“´’OâKŠÈ)ª‹'º°tK!iEè¶*¶¡¥„‰'eAÄ"¹Ù˜KÇÝÁðà!z²(q¬£±°0§wšAØ  „à †iò€µ1Ùz°-z §5Ì™õSy›¨HÇ*E„HLnám™ñÓn|¤û@ŸÒŠwZ °Ð‰Yks$MÚý^O±éR¬MuLJǬÀP´!>ˆ¹ ¸3ùÓ«£Á;E±@¢ø(áSJXXòÎbyrãÓ݇Y€Ò«‡·–IΔ—31s‡ÙïßœXNK/VU9èX›0Y¶½µfTéÏÓ!¥Ê¼r§³¯» êâ¤RD·*“Vñü.÷ñÜLÌ!™YI@Hô¬û NõãfCæ.Î>Zí¯Cå›7? ~<§übM—Ä.§ŠâîZ¥z==‡J©ôʾ{]}NûlAÒZÛ¨QÁþ §=Q"b Ø,7··×[§bé>Œ<»£Ÿ,€ÈèIjêvkìyýfvvwögM›ç ¸jF6‚"bE C›&$TÑ0XSÐê™Ù"BTL²FW›I½Ä I#íÚZ}ñ/+ýÇVÑH¥¶yùƒ{[ ¢ÃR¤Â€Há[ßÝýB~ùeõ'Ê—*]ïu98:“cÍkÛõ³íë<µëÁƒæÈlØ\O¶nÿðÇÛ#_û¿²?*é"‘š™™?¸²û_ªƒ2[Í;á c…Ú÷ÿR¤t²{ØÚ{¿LlŒƒ„–f·îÚ¶9ÞÙµ/Bò±ó"Â4`èàpÆì®,`·ð„_áî…G®>}L@çIëù'ŽkÇvø?Èö,N7½cæd¥,£$†[A©£fÂNC>θãÁ8 …4ˆ°fž»¡j=)E0üáððú_i†Çšˆ0çI'³B’ ‚‚H’r„aß©[kVô ¾…‡K‘—Ãï1¡0 ³e‹–ûÛÍÕPtE!”6@;€ÐÈîu´þ½/Ä(&žƒi ò#¥pYÀ ó¼‹í­¤Sú]ûdLÀø^0ryú@·)<6s¯§P¶âÃó›PÚäÊt5R€]°„Ìh7ÖmÅÜßܽ'*%½;KÕ]s {k ½|÷”yfN¢’BÉ~Nç7H"*ar[óÍxmW»ÿ\v«¿’É #?è¿xòêk™aça‰%ßÌEòl+/Ô>>¾±@§&É9Š@…µ¸Ñ`#!ÉÝrÖR0ÕYì±`´´ŒF÷ƒ½WkÃÔ.ŸêÖwzW£×Yß Z¼9õrxùšX ‚´•UúX UX ´SÀªdÖŠ§€G¡V·óñí±hS×B‘¸MÉg~—±9d +mN1XºÕF]!…q °@0¯]>ó\ïm»1ût|ù1B<ÒìJéx­_™i-¶'NmÎÅÏŸë\ÿðVZ*w7[íÛ¯}°9ù«ïkcZMbÛïYØuíÊÍ­#ËèÔ7îÙÁ&xÈ¿ÎÞ|u$ìhQ*iT¶æ¢ƒ[µ–}Q“r¶V¹LÞk"o dþë?=ÖÞürÙ*ë7ßÐ_SH3ç‚¶h(Xó¡GÌù*J¬ª65ÒÂR§€reÂŽ4p ìˆäÄ/‡/XÒ²Š¶‚¡/B°6î 8„¨»cÒ$­¤íÔˆ»ÉA" ÃH¹ˆ*¯|+Í›xdôfwv_HEð¹§bx@‡÷€3¥ywc¥…XB¦òéÜC…|Ò•7ÿ0óŽdÿf`¿vBp!QÞ€âuVRèć*‰Ó㉘î|½þéü‰]B¢–ÖÍ%Jï+5ûX·…¸±r0¿cy¢Ýçñ±%ïPšl¶½­4ŠçîÄO603ósæðÜ&§b¥1¿~\_éGÏDŒ E6Ð Ï AT§ ÞWÁxkjõèԣŬO¼tõîØ+öO×|ƒƒ4‰’t˜Y˜Óvw >Üuõ|6rK¢#E¢`©^«ŒÔ[èä¸]q­±ºjXt©½=ÔÇlô~*­WjíÕÝn3+ŸU¯·ŸÞ½õ½¾0 tû%’j¨´Ò!"P–%ØÈºÂ¹å‚Ë#¡È91Çu'›ØœÔË4‰Ài Í™pädÐi¦}«M%T¥¤P‰ˆ±™$ÅL$ß^~æèÚ{ K¥+«qµßç±½v­<ÚZKv|¸VùòÉ0y|ýn+läË[›·¾{%9ø7ÿÏËaè<`–ñÑOåôåQÓê<¬« Q‘'«Ã4YF›uþøÆtÖGŒzzïÖ£å™FÓQÈjAÀn%è'>bÕûP\¡î¯)N¿Ÿœ¾ºÿ¤I~ëÆá—*è€,PãTÜÖó„X…!Zî™Jbë~Û㙤Å"Ò ^‹€øaTùðÚ|Xk-ÛGu)A«CØ‘|.;uô< cZ0í±¿Y (FQég2ŠYÒË\>Ö~ å4.ž•# ÂM¿×m­Y ËBºJ`S ,ÀRÅ>ÿ¡žî‹r¾ÛĈ;<€™½ßÝ¿XxŒÜG±ÉššÎ?nœPÒ{ã`²‚0µ+oª`ºÚgAs½´o~›‚JõHŒe0œr'Á8}·yúˆé©öµ•‰Ê*ȱi"…Ÿòîå{p|R+ß îÄ. ’› j*gWÅ ,ér£"€½ ”€™e¥Õ^j)J[›ùFr"æ6ÇÓP\$ª"›í^N{N.]xNÞ¿)"ÂÀœlÇ`*„ªRŠÂD(–4EˆEÚ¯WÀ§’ ðtˆ<‹}[nØ&07¤z9ߘ_ongõ½úv·+8Q®PÈ€(&WA¥Dq¥:2>¾¡¾xvóáHÚšzqäÓ¦P­–[œ=˜mvyAÌÞëL|þP\‚îÃÛ«ñÍ=J?ùá5>÷ßþÙ@ÑÀ—½º2µ´çôîdOî!7Çó¥È`}ät¶Ëÿ¿t¼o!D;eÚÛSÜX³Z"¿õwË@ï)E$ïøÊ:mR~g=ЀH:Dúc2üÌa€ˆ–ÿsÐZîgy¡ôH@Å5—R ¾K[7è@ívwÏX¨ RÁB+9X0Ú¬ÝÛZeŒB†˜Èä,Z@± ¶#ªbÜÊV  ´~þï?$ßÉ æ~ž©(Ѝ˜“²$ݵúôÊ̓µ(ݽqên ®sioY&èíú±‡k”bp³> €dòöªš1›=mÌöíù"Ùs¼3S¾¾ /–]Oäšc¿Éd&±nUÜ@†`&­oŽòdç~w9¾µñzô-õ's#‹0+­GDÚ]öêÎ;ÍIýÑä DPײ±`ì¸R  Œ+5FP–’\kQÊ&-¬eHq9Ï“íò½Ê±÷TW*Ó*JƒŽz½Nÿ‰åËO˜?B¶ˆí:•zuA­””kDÊ%ÛcR&/€îÚàîNú46x²f-šH²»W¶¢J²è ´[©2F¡€Dµzcjæì3ŸÿÆŸûsá[ßú…ý¶rôT%,© rðP,€±f ÷ï¶¶®ç×Ô1^ÎÎ~y& MéÂÇ÷*“f~ié^kïú»ÿÍé(ˆEØüôÎæèóˆ`·ãScè´oäL¹ÅnÈU®hraû“–KÂ~kih¬ùá©ÈE”ÃÏ‚wše€\ì˜ ˆ€1ߪ¹ò™ýIò?ë½r t/½rV¼Á[„-®uËÐdµU¡´1Š ¬÷á„?€Ï£Hñ'xI†&„ùÇæcH‚ *äBCÍ_1o”6èÌÀKDPl§g´BN†Vš4‘BwW³±Âç“»WçGö†gûpáSrŠ-v;§ÝVo¡ TV$¦oª¾>âbCZI©A>Œßqa…1Ö‹$üþA¨X¸ÉaA²ÉFoJ½®Ÿ$˯Ï« £j‰ VÊF¸º{añDºä›fRéšY›Û(]ZYœ+…ìýœ}heü´Æ@=jžÚ¾‡3Š÷ª¼„ á„5ÍÔMVuxk«×6¦þ¨ùÜÑkïgÙÉÉ*›ìR8ë®Æñ•îYB þÃ7úú MD@Q…ƒj™’MÍ £v·ÕH¾ÖJ"i÷Í6,ãYmfuL‰-‘ ÉºkÁÅê'ÏŽ,¾‘åîÍ`°8j•¸\ tŒÆ0Shr#ÀÇÖð€À€;ÉO€ÕF+ŸØ®Æj„T pñZ3ØWz¼¸A¤>¦\©”Gë±rõÔó_û…¿øµ—ÎÙUKï¾÷êßž‡Ån1Ï%Z‘"J¼w´Ýã•^°;mªKg&ËZ‡‘JÞ¼R™¡ÍìþúÐ>ýkßEíÒM÷Õl¼ÿÄ”X»tþØþ**tÎ>ø0ÈŸgáþwnW”*Ÿ™L[«-k‹¥Ó¥ÈEk1?äãŸi·ÀÆÞ.¼žEØÞýé©n÷•˜)Ï’þk_Båêtve»x6¯ûc¬M›€¡šaÙ t64 ”–,î‰ça’‹— Æfþr±V¤¿çžÉJy[ ü –GÇ©’ ¯ 3‹Nº^f¤Øæ” (‘ò_°°eƒ6+'ú£“DìÉ->½[{k¹Ÿ7ûÝu X–Th ƒp½a<:³STÈ@Rþ<&bÞ`F ù_)]Ë–mm7j7[gÆXî·§® V$éG‘ÔçÔ»•ã+ Bྦ¹GÊb€PéÎßÇI5oOWÍú\ûèæ&©§+¹r˜>È*OÊ—Œâ‚˜¥(;!TH‰‡–ƒ h.dÍ|âK “_Üø“& [j$¥Èz.ì<” ½Žmß;Sc"øøPï1+;KW5±‰¶zÒí¤l-ÑìêJšEy–p¿“n*So>LðP µ"%ˆY»oëÛNŸà7— ­³P›PkÖÊq9ŽÊ䌢*À=)U¸L@a¡öô”:…ŒcaÏV7²͈(DHo™Ýû½·´±ÜV£±j­VÒ4séÈ®jû“·þÍßû[ÿåßúïþÑÿ÷ŸýÓÿy¥õ‡ÿü{éÛ¿½.÷~÷= ÀT>rz¼mϧÕÑn¯òÜžj5 TR¾úÎýêXo©ùÉOëéÂ0@Dc?ºVoO?'Œ¸y+>UÂ"´dgöY±lrYû½¦ª¥ñlÒÞXèëЀœ‹c¯j‘·[ t\×Ì,ÂÖ•¦ì9ù`$ûîö‘›g/0¨^Þ»³|æH©È‚ „ý…ˆM·ˆB©g¹ín@ÐSÓ¤ÉEñùÄzÄáë/.î¹!ŸÝKd˜…™1Ÿ{¤!R H‘Ô ã; nzÁ *‚nýB=í²gï€d «±Ïç)ü•Öä²yNÉM{¼ìpûf—ÌÀÖ°d¯õ•ˆŽ E-ªÐõ K‡B:åFFnbÊ;„~ÜïÊvÓO`òtò Ü "`“ ßzê$¢ÂÖµ =XÒÉ\(>xèÞƒÃÉ“b@DÉ$K\RªXgë76MÞ^ž:fú‹ËÑy]€4½=9vgU_j€_î ’Š@d¥ ¦ª=¢p!éõù3•ßï¾2ù“ëäj$!¬DbW}§)b’ö¨~wæ(Ò-¹ ã§A!Q— © / Ø<Ð +£Í-ËGIžÛlKÆfE>ª´ejRˆÊ®¦µ!gF>n_ª¯ý4wú6`Ù´õžŽâZX*i@é6RV¶ˆj‚â =f»ÐŒ)P~£5}Uݜʚ#£Œ"¶yoç§×š}Ìx\â^ ÆÇwí)3"Êò[ÿìïÿÚ?üý§+–6; ½ýof¿ߟ{aù[ûÇúþFÎôȾ=ÇOã¶mT»ùì³»êµrhRؽÿÎB5n®ÝþáÇòÄó:)èü-·žSÈë7/NGâ$¸ÅÕ7€bJ‘Zcóü柂»Ou6W68 €Ù=a¸±xºÁ?Š ‹É`awº]àÜöËò—몴»ñ~åŪ"pËR¢¡çÆïö„y %â²fæf^ÛR3ªp³x÷q±¦/2J­ÏÄÙû.¹îÁc¶¼u×(¤Jàìò…Ä‹±pî…àE (i"¾T©iR¨y.?3÷nÉÁ±ùöîéÐáG‹”\e"Æ0°µ‚i²¾¹¹Î@š, j7Îô• s±ãð:sU˜2‡T?Šf†þR ß|©äXnD(¶¿•LèËÁ逸êøè¢ î´ Lp‘>nìÞÈÝwœA–{·…Üë¬\Ÿ8´þ“àb‰–WÒã‹mŒžˆôÖÃÝ+´û*ÈÅÌFDb "`i§ÜQ­Ç­Õtö©¯ïyöñk}ãIqD³±ðºqŦ °ímDåËæêþ£Cs:"é¨JõF•ÓU5‘B›ËˆÝhQ%èôÙæ­ð¡:+pŸsѧC¥ˆ§²Têg{7&ÏñkËÂÆ+åD¶³JŠa¥T ¢ ïå†mÙ®ÀM– ¯'¡°  ºÔ‡¤WVÉDÏÌÄë*ÐoÜxÅŠ!êVJÚÓîǧ#–wþßÿê­Û¬µ–<³&ÏúÉû|þyûŸì×þ°ùÂùO^ˤ•s¿•SGG«ºŸ»4>R-Z‘ލ{çZg"ߨþèեɿüŸï$È󇌩ѧH 7w·~¨æW²ƒ¬(†8»;œmž¼õ)†vb7÷·—:š‚SQ@:"æÑ‡Ô¼[ë¤~ÏÍ¿:ú9´Qšõ.ßâXL ÁEjø17™k^W"(WT/ktpŠŠ4°Á›!C^†« 5½Oú¬Þ\ê`¶sëŠÔ.ÿª3*¢¢ ¿À, UÀ w{ HJqf ‡•H)ò7 €X´öV»|vã±>nÔLÅÇ.¦.(`­03§­ÖöZ€A„Ü·¨*8,çwðV}&×xÉÅ0hÕieGŠ_‹Ÿ  `>T€ÓÖF£zgñô ÀöîÛ $\½AØZÛwúÞêQ0\è«•FÌÓéöï'¢+½‡duyc¶NìR¨òOè9º¤ŠVý„Â'¢Ù(˜˜4dkp¿¹Ù†—ÓŸF¯„¯-ÐÀŠM„“L_ ?³ÍÚÉHzóL•…েÖåh]#Ž*7hvÙôÀÚܚܪ]íõž]NÓÌf¶6ÛGJ˜Í)æcZº@Y¤Þî±û‹§G–ß²`¹ ;³ˆ(ßÑXºão˜g#V,mþqeÏ­÷‚€é÷”ÿâ.Tn‰Å@Ëó¼°]2 µ.ƒ@Ò©¤2"T$Üú¨"/CŠ.†|¢¡!PŠ&€-³p AÆB…èC•gåÀ©9–xa-³µ,,ØËœõX‘ÍR‰Êa©¢Iã ïXŒÅ9eoÈÉ tèÆÚÊG4; =ƒ€äy3]ßf[¤ ¨Ü±U,—ÝFÀÏn|BpAB±\E`Ÿ°’„c}!¤·~ü»" ›¬ß±ŽøÊÿîÿ÷þ‡_ÿÿüŸýÓò÷§«¿ôk?|é¯=ŸG/~í–ň½ìÆïýÑG‹6Ò%Ì£'w•ãJ-ŽC…jžÿàñd¼ºùñOÖþ~a#æÖ›¥ÞÄEÔ»»´{w•]€¡ø÷˜ û‰-!6Ëî¿ÆjÚö–R”éýe"r¡okÝׄâWo"è ý挬ec>¸rz+øŒfý…«ŸªŠßáBHˆèõ„`d%A yLl ½²1##„HEÔ-zœ™Û· &lE†ÿ‚Bl]´1ô1Øxœ;¬ÃB¡·îî€ØNßx#æ¹  REæBÑQ‰5Ò½'·ú»*Ú†;ã\<³C&pÚköZ )!F1•È `Uëå倳?BajÆb-¹(nmWð{»—Š;} zó)AÓܨWßî]Š@.WJ«€ÑÈÂ"* o=ž½ô°3ÆÆÕ:6y±fŒ íæ6»göU^ïžßeÄÎ%Ûû·z¤ž­(mÞ<ÏoÃÌI!ò±•E¼½&BÀ0·J(8œ+iàFs)³_k½~+ÿá¦&_뚥€í¤h\L¿ÕhÌ%‰úŸ¹›çAXÇe¬4Ê(Ès!Т(Pã´Ú6 #ì%–Áä›Á£ê!¦qG—J9šzÑ[«Ç¦ÚodÂEö"[ÌZ lµ…¡FÊÛ¥Fl©,³‚£(€vÇZ½hÛ`d6ïÄ­]0v¶RÐû6(Œ£FÀçžÚií¼ÕTM<ýÒ_û?þ“õOÿη¾üâ©ÑR@H¤B¨©C#]øåãT=}:¸úáëß¾kP‘L=34JQ©ZŽ""&÷>–‘ÞâïÞ~ùo¶¤Tþj¯!/UÈróVåTµ0@·¾ò=.ïÌy’½û˜Ip¬…-…Á…(ÖNºãŽcgzÄ¡"Ø/ÜjZŸm-ˆ" ÉïÀþ/žÂ,é¾eŸšÔÖe_aQd ªBä­6b˜ä–m/ ’hEi¨Ýq`'ÜR<€xÐ8 {r&É—RT•q'ö=ùÐû?œ F䩹ÍSëþc, 4bTÊ  Øæöj2rxqsr_ œ€ªøt¾çf±ÂlŒH–n¤‹« ‚UÒœZZ¹P¨QÌHÂì’,ÅŠPq‚€u·óP¡]˜…˜} !ï r °Óz˜€iÏ5Æ–æ!}sõàCA"=k#J½É'+÷)(~€(¤c´¹UÚvz†hþÑÄØÚûãOj Ý;ëÁÔ6»‰h¹~¨ñI»ôdäKTÊ%X ³ƒW%–5ÉÁ$†J6×iöÎüÓöË3|”²ñÑ'ˆá$ÈX(ÀOØk&õ­OO5‰ß>¶²Šg%ÒQ=+7BØèjNYÀ¥¦[;¥y"`ÙÎÛ$Û«9ãA¤@)‘ÛêXøqrÎ^^6"Ö%2Ø&…v¢^‰J$ÐOLšdÖª²j÷”ÀDHʹð~I AtµÔÕõõŒ— 3Ú;@¨u¤5ÄMŒæÛ’cŪ˨õ×ÿïÿè¿þ¹çvi¾ùÝßûíñ_~ñ3/>ÿâ /õ7ÍoþÿÓÚÖ›o/ ((ˆÁD/Ÿol¯­¿önª˜ùÀCTt(… !­_]œP›?ùavñ¿ýl¨Âàñ[a6ssY½×;7QaD!àÁðÚ%Mù/ØZk6~Ø'{¢fìööd£¦­ÀåtúÒ™ÎÄ«ôfnçDCðÑ·ô·¿^‘ÀôZ ïí:.è¯Xw¿¸ˆ@P1so°b¦t]—¶õ;ø/3‚ÿ–Ì·ñC²˜øŠb˜”‹Žz’[±ýˆHm2v)‡ ­Âp^8ܘ±Ç€ºþÈ€mçnH¨› A¥ PDjp˜y[èýÕàDÿnp6ˆu16œ5" b˜ón'éleˆ¬ˆ$±"ëÑ‹,-,"œ<‘+ÿ( B>yÑÓ÷D¶cNANØ( YŸ'õëµ§@Ò«{Ó.¢ðøxJÓÛ×GÏöX# ‚XF(ÐP*0i–Ú £tœš?Y»[['ç-ògªˆÁÝíÝ«7àì´ ‡´y­ "£ !Û‘ên4»µŸ»ucâs‹ßí"»‚Òù8‚’ðz†ì`ÓÀ œ&Û5ødü°U.èúm;‚Tjµ±¢yNZ=ak,Õ›[}†¨œ$F˜Ùf’mhØÎcJy_Ô&]È{j6½·wïíÌ‚ˆeË""jKJP‹£°©¶iš#c-ìtP¤–üœÃŒÉA£a*î—C;æêË ÒÙ VÇwMŒV¤÷ö?û³vÊ0µO€drD:þðÿÅoýWÿÃ?þõ÷iŸA…!öûò§>ü}sù7þÇïRví† 4‘DŸýÆakõµ0F&¿òõYa¥Uc…*4÷.›‰öÖ­Ÿ¬Œüç¿:j ²ö^¨)ä…cÇj>ÐÓs¼aÌ 6Ín\Q€0ºGò`nC£HùHHJ+圥®pw¡Ž€$äjP¼Jn7âq”œÿøá‘ž€œå¥/%¡¡¿ˆ·÷×oDTHå[PëÓqX¤p‹á€&{O Ù‰Èæ¦cWÖQ(””¢À©çÄ[RüÚ“ 2ø±žìd‚x wÄëìIâYU…¦i8OtX’¤¹1½—Ÿ©k&ø QÝ@@©LZ–ɱÚG&zTæ26Ê` $בí¤èÞíÕ½ãÌœ¤Õå­ježäà,)ß:š_–ñ Z 'ÂBÞ3%¸x-jÕl6í¹ñŸô¾<þúC$ñ±hHa¥Ê¸Æ®Å,H´i³R¹š%AÚ¾µï¶„§©—¡>Zá´­¤kµ)Îe$Xo ª@:}‘Ü&Ûµ;¥=ßéÐØ8Ge=$³c›ÇÃûw0Û¸-¨šRMË„·l’qÊÂõp{›Eâ1"’WÛàí¡¬¦÷ÖÄú‰5«å.•jµÚ襧w+‹ëßYÞ4âÓ_ý¹Ó‚˯ÿ_ÿö?ø~gµOQ…VJ *ÕûŸû¿8öîÕ_Ü×üã×"õƒß\S(ÂêØÏÿ¹'¦*÷nYIžø¥¯D¢0(—©öÍù†Ù¸óÆÝðKÿÅQÁ¥÷ãpßQÌacQN7&(Ä®"EvÁDfÉLçz†€t¬ôûó†Aä‰ZDŠÜ¨ w—ë”Áj±Ð®XaËlpí»{J·¿8aµMúÝ×FŸ¯ ’o h…su0 ›9” ¯Ô)±íl4‘™€„p@>.¤ú¢H†–X(º`€ÙžŽ $ÖÚ¼‡ ³µÐ! +„ÁvApyó¶ñÎC“´û"¨4ÚÔ2Ø Ö¤(¸…–Í ™Úu­³gR‘‡™xj‡‰‹µ(†È´7Ms½Ï‚£µ¤‹ÄE/—*2|•¦,H‹d@„G8TlÖóÚóWo~êÑ[éqŽÕª˜MæûÅHšàhçú…†Ee®ÙlÁ¹Õ¸: âö&b¢•Rše¼ÕLÂržå ÖäÛåtJárÚµ/$PF‚9îQ÷Æñ»m÷ø‰0‚ o™(×¥¨¤l_Ò,ígÈZZÍ€öQ(ªXîúCƒ©hÆvëá±ñç­‚û¶RF|îÜH¾öÁZ ²Ž-1œ?]C@±ßþW·[Æ¥¨¨ëÀÂÜ¿=þeó{üµJï/ŸüÚòwÛ ÄZƒ{ž}åçŽ>^Õª—å}á—¿²·’ÒFDJ™Ç·ƒéÎã7?È.ýWÏ’y³Ћ¡%¾¾|`¢„¤ý4<±†Àb%7ÉÍÇ„lf÷„Ë=eÑîÙWV:(Ì64ä\ˆ·é°øˆ‚Á^ÚÑ9!®y÷“3kµ—4è´ßz¼üôtHW¤Ç;&âPRÙÓM*}ž(›¨âepZ`„кZ³)ºz\áÀêG~Vi@98U÷ Ò€¹³cm0\Âíà^æHJJ‘e¤ÑB¥‚BŸTLBøn3>Þ[.× ˆ ?‡abÎlÖÛê/4„ªh@GÂèm~âA‹À‚~ê:Hx‡Â³äfäÙˆ®+µâ’èé ûTu’H²ÝšŒ_‹žŒ1{o:I0›bFŠÇKwÛ5eŠ„3±ããŠXH¶Ó±Vé^çÞæò‡‹GŽòâöÚÛ8Ó@¹ìðæ596+„dä·á¤A,òq£‰ÒÅÍÞÓµŸÒgð‡+ÂÖæÅd€tZ‚î‡A±Âi§Y§Æ3Ý®Ä7a|&jTÂÆ(â|ŸRÌÖZ+å‘ÖzÊ6*uR+" Öt¤Û>U‘•%<†r bJ3í[§ÊëŸ8îeÁ–b¤® DGA•{r›&²f£¥Dö‡ Q€PœÉ–À³)ž02ŽŠ“ÀÕ§[åjåÄ _9’½÷¯®lq4[©‚Poî&@ªC¥[Ø“!"ï|ÿÅ‹­ß:ô2nþ‡[G¿´ø£ÌÛå6ã©?_f»þ“Oô‹áb½¦‘tX ‰×®,RwëÚûÍÝÿ›/W–>¢üäAmec~ìäH‘) ;ƒÝek%5­ñÒH–n¯°ÄçÇhW»óÁ[3ؤ´ðb1‚èÒû˜½÷Â!V:ë-¿^ýR… h®=:Ê-‹s JY-g•t*}SQªX©¹“qPo‰ÙCín¡yÃNWD„Mš€ på@…ˆ<é wÐ@†™~¸ãµf1`·;. š”²yµªGþ+Äùb2³~_ŸÁkêX¬ÝùXðɳŒœÛXÌ,çÝ-³½šPˆ–Tɳ–_¢˜¬³ØYDˆ2zYóÀÐTl5p¸pý‰BCF¹é®Ç•û›‡gH}4:H°œ×Q•k³v^ªä»D1¬öUŒÒ¤éeFbègì:Ø}»üŒÙÚXÍ'ç'N„$—OªOlõ*µ3 Ò·›Xñ,kÄö"7žøôÁ±'n|[+ ¤à»6Û]qgY‘Óbûú­þ… ×íûÊçËõ`tª* ¼Æ¶ÉšÙMéíMR7÷6LIš¥Ç“6TêàžZXFQGjsú¼µb¹È_b@áԨ Æ-–Ìš<± Õ¸¿-,£F£¸[Ìså]¯§ÃŠ©‹Ø¾§¸Þ²qùôgN«ëÿü7n®ýò3¿ú+5XýÝ?¹£ØP, .ÈTœ6˜Q ý~qï'¯î”lýû_¹ö2Pó»p¹_™Ô:œ*ç_ߨ~õ?;U¦PkÆ4õï¬Öò•O^_ùó߬½ÝÖása.7’³a >¡·—@zÅ[`€Mzsyì"@ë+{h Úe:а |ö”æ¡ne©tL]Ë·ß<´}6m |ãé³±Ÿjy^l1¶s—öVT”L‚p¾š,®#ò°éwS2ÁÁØmÃLP§oôO°+‡3dA¶'jeÇI–˜q˜<°óˆDW#‰•~ÇÝ•bkD0«E¤\Ô¤_P²€Hú Ï6næJ »%,xÞþ6³†ÁZ6½V‹Ö©ýƒ¦¸h`öRŃɋ{¸`²ûZiçBS†¾ òÿÆg¨"ˆéoéÉ­Ë#{Q¯-Œw±¿Šˆ”J“,ƒbªÚËmuZP‘¦´kRe9÷îÂñÒOÒÓ³–Ó3¿ÃJx±D¼³oòÞVp¡äsA¡ØMÚˆE{j [ý§¢×áËù6ýøÏÿVâ¸À¦svm–MÓ4Öï©€Ü:º¹ÏLÔU½ŠÈv¯”õt’H8Ó[J°—gÞj²¥x©z\øaÐáê +—¤ v™ë§ZºéŸ³O#ˆ2‰Ž Œ5w°o²,ÏRkki‘h7X g½F…´BTUšV†9 ¶Ôzxà•—'¶~ûŸ|ÒÉ’j%úÂù’¥þ¶µ@ˆ ‹|L œró©£ô'ëߨãݼxñ½»ˆrèÜ­ßþ—ô´Ö‘ÏÜÿõÿ°0û‹iwJ¥€´æ7±´uÿ­ùàk!¿¦ÍÙ]hìÃÕƒûK¨~}5 Žð×3[“/Šh^p±ƒŒP?6…RáÁ2 ‰)”·fa g¦1ýÿd^{â´ õRó£è¥ í.`?§£"ÚÙ&+È%i°oc¹M ‚뎺xÿŽbr‡ì¼‚.0Œø±ìŽF;3[SƒÔŽŸ †²c'ÁAƒy+s«ÒlsÑz@Ê¿šèsV˜Enµë{V·F§,r° —‰H‘nàôצ¿ÁÍåŽP– 0-°ó²0@ÿ|! )¬˜;¢PÁ€Åj³Ðo‘ ER.ºÓ¦‰™P—õs’í\e2¾lC¡ruw¹Ï®¬Ô6Q8; ‚1v{†C±ôÚ÷ff;>£,˜ÅPo*9¼G“n/Þº‰‡‰ "±Ÿ< è$·{Í] _ú`þÂñO?1.Ý–}—B@£¬Ö'¶·E”˜ÞæDøÞÞc‚¢®Äê!ÌìJ£UT)%}wÜ «ÛM#üÿ'ëσ%;®ôNðœã~ï=Þ¾ä¾'rA‰}%Á­Šd©J”ZU2MwõÌXkÚd63f­±ÙÚºÇ4-©GR¦5Ò”Zê’T‹¤b±ª¸³H€Ab_‰Ü÷÷ò­/ö»¸Ÿ3¸ß¶ÿ!“–ù^Äu¿îçû¾ßVbkØG¬Ù¡õì8Ê> í3J“°ÎöZGéÖ+Ö»-"êxD(TB$á¾É’$ËD‚Š9¢5:|cñ A" JÓ%"k«¡ ’Þñ§öÑëÿ{]‘ðøÃ‡…Û¯½´½#Så@1€d“½})àžw¾ðozjôÇ‹Ÿ×êÆïÇÏžùÉí€@øÄãÍÕÿo_ZÓa(¥‡N«ÿà“ã¿û\”!a¥‚¨‚Í÷FKÙŸ~À}ùfGšhƒë7ðT•˜<¯Š®Ìçån ÅÙàJLh…Ï,@rOíoJ…ª˜ç¤)÷u1³b Ý[°ð»©l|k·í¾X3M†«×N¨Ž+Ë ²Wɬ¬ ”p¦Œ÷x*Q ¤å6Q?¹óLÒˆE]¢äw(÷d‰›XS9ZŽHÈwpåK¢`çc9ÒV‰!ë§,H@J£1‚ õH‡¤#_2–3n®D´¯WN’’üÒN^+Í£cŽ bE$é÷ív7£& E–]H.ßÁxÃë¡ OÌ܃Þ9@0(Êw&ñÝÜ“uN¶¿]Ÿ¹´qlÄâÇAu„´¸¾¥â¬®j•A‚ÊÍ!¨šdRÚY)Èâ8­‡™‰·Ï%÷ßOï›Â ¾>º³g•xêž¼~^ƒÚ}¿äå2 ç¹ù0€# ½Õø‹ñϪ/î|¿ç\i†‚$Q°k¬û¹1Ïdi7j¼aïU pmpðÒµZ½"‚é-•"×Öªçt»gµÜbB›ÚÁ0kí­ÃèN0äå0T R+ݨ²¯˜˜‘=. …“h"dYÆdI¬˜ì° 6Û[Q…5 ©õ!ásȾ—…=ÜØù·ÿüš³ïoýzM`óïýÁ¥²P¤3aDTì¶(ñbvRPòß~ýÔ•ÿø¹3?ø}y!úA+@-æÑ#ÍÒê»ôý!)YøÍG©ûý¿û“ò ÿ›3DZ¡.i¡ ýðZ%Y;÷Fïáǧ‰ÌǽûQ ïÚÉŸ÷αU&ýä‰TªÐŠAƒvú³{BÑèƒÖR”]ùFà¢3/év*ºäµAbíKWO\9úc)‰û?°_¬ˆˆ¤1o¶sÂXnD¨"Ny;mvi)TÎR©ÀwšæÑßvéäÉ¢@ÛŸ¡؉hîÌb2#Ä£“‹‘UWxæÃ¢É*gìçÀ#Gò”´{»w€Ö¤ Xª– )ÞYa•ѹ'¼gË¢B.l½y$ØZkF-ÛYïS‰ÄX Ú˜LBÅÆh,;{¡¸¶Ý J¢ãlcQuÂ>+ ECŸ‡ä‡4oònóaõ ¢Òwï6…e:º+ ›—ÂRX#+–A¢Òޅņ ì—UÁT²•Ë«—wÝ&[•›3Ã!âýuMúzi÷-ýà´«)ð?‚ß I5öZ±t··tæ•Ïìýå!°B˜3kUyx;¯±ô08ËïÄÓÙų%PZÞÞ»Ó—å QA ×xjQåyÓê±D¥4ÍØÃbÀ¤õk3‡Ð~Žpn‰B¾y8hàöH¼Š( It €]a†l˜AÊû ÐXÀP(—[ÝûŸPðÀIËlR5ÌòPSy?ú9™ùÿÓý:¹ÜM‡ªÇ kd­è¢: ¤ŽÛò,&ÿºõ×f_ùø×EÞûcùz饖°êÙyŒ»êâ}fSþæo/;¿ÿßœßû·~mB#"_¾Ð¨­œ{svÓÙKÆÞZ›;TQÑwÜ1/ã’,,ãþ» Ð.œ­t×5ØN¡Ö˜—{˜)ñ±Zô”±P l}‰ŸX+Ìíï7ÃÍÏͶ©¹ñö‰§kìÇÃã’0È¿©;"e#›qgTÊRè8Bù"õÓt7!÷OÌ„ é§.‚ÎõÆ"`­ëûKš¼—¸@‰ŒóÆ“” aɘ3Ó¯õh0@T­¬µB%y—²K@¦çÒ©#G 3JùFtrotåMíÂàvËÂéV7]Û¦e$€•üoÊuÊÜïìqtÏ(`ß|T“&ÁŇŠºÏ8*Âi¯»X~39]EÉÕZ ö‘?MU1Tî *"T2Ê{J!ñȰÒqj `÷¼Ú“½>\»A­îüe»‘ Û¥ïó¡î·bOtÍÍ ãTSуÎ2PD™€Àt5¡B %Eé²0¬´ô‰í;åá*f Â3ÂÆºb5l´“v×)À  ¢V˜3Î=vHi21æ/¬ÜÅÌò(N‘,œ` ˆØtt³´x}õà#Ãu£ ð~ÎÕÖzbIyQ× DQÇòžù ëÅ•X¶lû·7÷7?¼yd(¾Wv­ÄGª@É…Ã¥mõtÞo”;·D+ Ã=0%7wŸxgôøÜ/®°õ×oÎ;ZXGwmÞ€"žfñÌËT]•, ¦ß]ýÚâ‡on…øÛïìúyRÙcÇCŠGýwn 6܉þîß:7ÿÇ3|ì·O7B•Ôàüõ©ôâG-€ð‰Àíµ™cA%ˆHäU™½¼#ØféG1dõ“Ù¡ ØÓ×”VàB–™ã3° £ò8¯“S)Ђ \xu÷¨üt$”f£WÚ/ìÒ({9µšYFwÉÖÕ ËvPêMŒãŽ›‘IǯŠ'PAɵD´b2Öœ´ âXöÿTÛVNÜó¯W#£nâÆŸJy«i¥4²ˆBGñ¶ÌÉ9³{îŠ9\ ´>pBxT(,b˜E8¶%£ÍPD"p1:O$ñÖjpeŽ2q_sJ ø¯‚ǽæ~î>¦/æ»`>+pÒl6Ã7åþ*VRY¶"ÕùÛmTä6z#"ºÜ±23OI :²™°e‘áµáþÒ/[÷ÍŠ´ÚñÕë•ûB z+§úç`÷a È÷ç9e«A,×–YXÝœ=üËöS_\ë$¾ Â^Œ<®:öÛf2NÓ‡ó‡@ße ¦@Öc11!eVÊÓ­­Ô@TM2뙎VL²£n郀7‚X‚¦A‘¸;çûìïX’?Ü$¨|pVv(±’äN’™m¡ÈTC"_“‡„ N|­œaFÐÒæìʵü§_žÛüýÿͼÄx7Ja6‚÷è¹n>–@µþUõk•?~¹b¹÷·Nýø¡UŸÙS6½¸ýI‡@º?yOžú;/Luþò}°ï›ÏΕbPÑñÚ¥¦\ûx쑳A^Ç#MRĽ)ØÉŽãSeNÓHÒôÎ%R"ˆfáØf2²Oªhw'?¬tÏÞ8Òç!3 ¢+¶ÉOÅlyôíÑò…G÷³¦‘iÿt×ó R…¿ÏSm\ûÛ;(‘Ž4lc¥‡ËZy*N4¸ÉcDž¨ÑA(ž·A0™æÑF “ã³dWR>Ãàs+ŸZ©ù^ã™qwèl**TŽ»3µÐ•äô fkáR¯|Ïù]JyóïDd1¿}ÁÙ ÕR x€Õ‡÷1ïo‚œ˜«8nFÊ+× Âr^”„ùÒ‡ŒP`‚6È£haóÖÂQ! o¡FÁe좉ܥ1bi2 %ÌlÙ¦ÛçöÍ­]˜»OTº©.”“älY+õÑAúД q<—pMapÿ´AÈî>Úyö©Û¯$ÖÁó&­p ±ç×›üˆˆ`mÚª6ÏÓ´ŒÛÉÞ!h"¼Úaf•IR)C§k#ÆFÀç=„-ïè6TÐ銉š.R1¨M›w­s£cáD`Ðîñ†t 2k2Fc’ÖÈ$õJ²9@ÔG!ÐxÄè¢rÓ¿6›¶­ ²¡²%¿Ió…!=õ¿{~ùÿøV Å@*Ãt^¸§)+Ëäú‘*Ìm­ˆB†?øÖcÏþí©g°ý¯×ï?òÖiÝ›y¶Ø‘¹ýa?RË{ÿüÿ»:óÛû$]ûÿü‘}î7–µ&T¥,¬}T ?^Ö_=Ft>9±ˆƒâ"MÀg\“ŒƒJ±1éè+$$1ÇJ]QöÆÂg# íØ¼(þÛÊË*„ƃœMë™›~aÀÆŸ/ö“gKV™aöQëÔ¾*äu6èOζ»*ê¨&˜¶Óʈ—KZ1ŽQæã…^ @E=X1êvÂûeb arC3u( M¤&Æ€8®ÝɃ6è‹=}ñWoäÓꊼ Zµ'ƒ!€± „Â67èÈÎZtŒœS'.pÊÂÌl%ÌF;–ÊôlÝß°òCIÎð£I§’»±ßà°È?¹0ÇŠõfL@PŠÜ)ÂÜè#ÖdÛ;èµÒ½Á´RªÒSá@¹7)Ë%½“át9ɰL±{c£í_,Ý£~¬ž¬{7ìl4[Ë' õØ}sUî­³+‚ñ6@°TE¨|ÁØ^sÿëÃé'ëBä!%9ž™‘§·E¼5'æ3¤-¨®_9R|gaË-Ùáú Á¦¨PÍgÛƒTtÅÄYEr®¸›´,›þjÙ’¶˜2¥‹j}Å8òXþÖT„ A”l2BŠAÖíáölotˆaY;ž0!‚"Ô_9•®®‡iµ²ÖB€b`´ÒøÍß™íýá?¼B` [ä,mÞXyÿ‘wÔAÑò `ÿôÃ/¹ö£Ï¡ÿÒÜ?óÞèxj†’¾œ»”½÷Ì¥ÿËNÿÿF³ÿƒxýÄï>VÖ¤(*)Áõ÷‚Òû›Šg~c9lmL/Ö}­DîâçboÍ®e°6>¿Aœ¢ànÃ\¬z`*@BEÞ)\ ·‹4¾Ç€ÜIƒ‚–-3üìö‰Ñ£gYaÖ¾Þ¼¿!äOñÞD€PŒld:°4ƒ©´Gõ˜g#/}÷²öÞTü!Ÿ¦ŒOÁ^‰´. ŒÌ$+;ÚÄO–ÊäR¶yK€ä|W,*ÇŠ_ʽU¯k]Î@‰’”¸´[+­8Ä! €°Ë‹x¸ö¾ÞS ˆ¼8±„ —[±Ö $í.é€w(ÑNJ_aŠQ혊à“ήñù'6bçú.` žäF’ ZÍÚùäHC„“º¾'à™#º›O\‰ˆ ÍÁÈ)mu¤VQ†­K{jW.ï:Ô•ßšÒý„þõûÒs°÷$£Ewve~fî‹¡þ‰õŽßå]kyHîò$”`·Ø-?0)¦:ˆÇíÅà£]GHÝnZÀnhF¤1XZl0@TŽãLåͨ"`Ò¤[¾äfĈ 3!†yþh@9YÉ»Í@Â)rÞÉ“TP—C¡Þp#SfÙÞáýó6r"‘VêÉç忥€bN”qޱ¼¾ðŸ}F]þ¿þûL2ËÂvÔ¢x¦dZPQ„0öžâ¼&‹ î= ˆþ‹þ_ùáí¯W-¨KÿŸÀ_¤R•ÁÙ#5´øÜuQò™‡ìŸþW¯–¾ð_=h/ýwß­ýæoÌ: °¤­n¿™6?άÝû[ïFL)Ôží3AΗ«;œŠ$ñö'H º- 5@Ä`ê|硦5¨¼Òíî¼d XÄ2çÙ"LõÒŽC,qûOg«ÏײÀfýwn?¤ÌÊM½cMD€Y6wP×p6ɬlW³d¦>aŽ@Ì/.î±V¹hÊ2Áæñ#åÃ#—KfDŽÚïêšÙ½§Šì>uB³3ó«3äx!É!è’eýŽa­‹e$¥f+*Ð }Cš× g蘆ƒWìF˜¿½übš¸£3 ƒ³nQ¨¡ÇŒJ#Ë—|ñ""ñD28Dïž›D!kÞ'ÅE³ÜÏ’[k&9\ ön]ZØOвá„A’`wØ5€b]>—t=‰yñ¨Èd’y“tïbxXý´to€ÙÚÔZ3€ã»H©7÷W?Žƒ‡’ïrr8@¨œ* ¡6ÿ‹øéàÇ[ bس w`PÓ˜m[”N屓mÕë§§ÂršF@6”C¤…ÕLi»“ •‚aÆ@¹Ä,™i[p@ÁŽÃW[A)Õ³‹–Ų£XPQY;M«O@eµ†½Ä¤³Ms'ClÌIˆDšH)¤}_SwÏfÄ”ÒÈ©¿Ö6ŸßcÿâïÝ$kÀdð;5¯$¹ÌBH®Ï'Ì4,ŠÜІéúøBú'ÓO³eõö_TžŠ? ]Êgæ«Awžoii>z \ù'ÿÆÁ¿ó; Ý?ú½­‡ÿæ±¥€õàíÛA?°ñ¡ß>ºÝÞ×,9û3£*ÖýXþc³ÞÕ¡ŠVcß¼³É;¥¯-ÕPì¸l¥E*ÇONXÙÅÂÀüæ{{®/=ª€˜{? >» ظ3²xžK¾r¼… gX oF0¬,¢8~ßXÝ+&k\a&‘Aý%ž "€†­ÊÞÎåñPë"ÀQüÕ‚P¼¸F„Ý -îŒÜ$MkkDf\: »¹! [Cë[ÁÑ­ù=†8¶ì‰Þ [ëiùvD¥H ­XY¡œ3(“+&LËîƒÎ©J<¾{Aaƒ.Ê×Ü(sÆÓrÌ;sÚÙžçwJ÷¡“9 ˆ”Äõª‰¬É<ï¸ ¯‡:A+`…%^Û8T;¿þÀâUÔ§úÀõ{•¢úÀ5uo3Ç":! BHªت©»=uù}±6w–“Â\ À2§=ñKãñ©Ȩ+Û«§+DЙcád‡%…(Æ(=3ÚeF&É07JûŠ˜¾éu7±Ó` «´µî|YœKYHD¤”ÖÎOÒÃ`‘!4;q6ÈFÑbzw$ì‰""$EŠ¥ô›‹í·—§3,™š»= jj¦ý¯þ]—3_ ¥lÆ­Ò‚‘-e¡©>9`Ë„ékÌìzå¥gN\å3ÇŒó½W+n\”0ê4Ÿ«+Øî¯~´Cpääb‰Þúo¾/ü—gä•tq÷7”B,…€ñGç¶x4õ•©õéƒÓHž…cY?Ï« ¢ˆ16½|Ix#s±v(7î¼»ïss%A¥\bQ8œ9>7ä¸`ç’œ íþКä/paåé…L›Ø¬\?±8:¯ "»V²Û(5¨k´é6FÃpO sðÄËcs£É¸©H&ZB‹9 [d@e•ݹéìä´RÞÒ<Ø—O…»õç*:E„û±›z*%ޱÕfY“R9GýÕzà¨:rš‹ÿáó³…ø-—ÙZ¶Ù‚šI­ *“×RåYÚ±[\ò“q'ËCÇ'þüÍé‹°¡ ¶ç‰‡[å¹óýu$‰Ó ßF$iÝŠê‘g"%F+™0¨j¯ow Uâ‹W™ÅtnN/·ß™>ÍÔoÍ_T+xv TúáÁøÍÜçJ’sF U,î®Xk”–7ô“ü³1.ò$l­€ÒSÆ}eÝl¸à.Š€‰·éÝ=û´®àvH@Ý,&š˜­I25ßn§ÂÒ05cÕS„9³£aucf·«0Ñx}gL–%ŠC¨ ±h ®ôÍhÔÏÚ|Jz[Šñ8Bà#¥ZëÏÉÎ]O +2%ã~c"Žîþ³Ÿ ²µ"€h-ô MUÆu•q%pMé€lÅuúÃ_(ª« !þ£;ߘ}yãËÓÖ*ó'ç—Iè~°RÆìƵD‚Ïì4mÿÞ?¾sä¿øZõæÿøãúW¿4ÃBª!?>?"µ¾±ü\N6QSî‘´N*öØy¿¤XLšµ>2$j~ýŠ›I³ZÄ+W;3£Ÿ»°¨9·­u‰ßRÇ¢µ¦2³ÀÅÙi<™~ë õTS+Ï»B@b‡û`¾ÁXÖå Úd'«Ä¸; EX¸iïhÌÏ» "0#£Eˆ¯Þ)#>X*#x,Hqçÿ|¶¸zZb›õúÖŸ¢IÄ2ŠÀ|•*D$…ÇŸ­Io·«Go·÷.‘ã%;š¹_»"ˆ`ÁZ挨Œ&P5'’ÆÚ¦äÍ P„‹™u~pô‘!‚w*E«—׋~‚ÖÇ£îÖ.ý ž‰,BŒ•- *P5@aRÝ¢’±ºz ÷=‰Fåc$ÓZÙ5uëÒîSD[qùÃÒ@,>\¢ðîààÍ5ur}­ B@Njønö¬ýe«8Šä> a€&H(‚¹?=ñADlÜMfÖ7î*SÀ ˆFiF„ P,&[ýT(×e2ž#¥¶E›Éñ;q bçVáñY "b Ë¡#‰ÉXÀî$Y¶ÕJz³óxÛ¢TwY$" 4Jí³w>€Æ:†pÕÍqD¡Þù÷·Ù¸‹°ˆNíòN¤  !2{X³#UzJ¦¿¸øÙ­üà»=xã{ßcAèÆïwî ?2ÑÔVù³ J÷¶ÛW7ïº"X VÿÉ?]èo?¥~òÏnø' „Z¯Æº6ü¨Â܉iÇÄrKÃð8?º‡…m–n_'”J)y{HL¶º?n½:ýë3atÍ—Nž@Çv§u¶¼þý¥,z"@•ÅñËôð’Êá>vçµí†5š1ŒÃN£'se¥DKòã=s®áåþö<“'æŠ4#l3 yû=,—öTyÉÝ¿Oq¢,øÓ¯lk˜ 󰓸d­RÈÆOMU‚@).¢ÊÀl±{“Îv×ê‹«PÆO]àÇ=ÇÌ®®‹ ë”ÅTò’>½ÎÅad<~-ÎI!ÿSöñÊüîì½Òκ yÌø¦4¼³0}¾ud(ªf$=Ì´r×BE½Œ°”@[©¿×¥ûgE¬aˆdƒË•ð>Iº½p­_±hNì=øðþãxÆÊ.èï]aç“Ãû®½™ˆµþ¶HÎ}…°‹±3øb1²†tÔ]PoØßˆÂ²EGó LÊóƒöˆ!h )„f‡C`Ëi'ØØÓà¬ï[i@ÖÛ(l S¹“PU²R€Â±€U’a<4½vÖ g›t4¢ KOî¸Ö\ïÍ¢€ ø¸-Ìl];€ˆd Él±Í@W­’¼˜Î¿ús=0oS`FøÖå/-½vëÅ+HçþƒÜß½Î5èòf{õréé3Ä JüÃÿúýù¿õWjþñ»{û±H‘¢Pn\"=wûÂÔ齤µÊ–ÞÑ[püç×›´÷a Ów?ð'ÆC•ôÆ[§Ÿi”­ïáDG5>ÜqkäÙÕÂcÈüÓ{®>r˜GƒÕ«‡.a^é¼0e õœ>±ÖË"@DU>‚L£÷f§ùEŠè–I~`qv,™0úº/ÑóˆsÑëäqC¹'HDD†³·ucz· (c=ÝCÕ& › „0bÄì¨y›÷""ô1ãøîƉæ·í1v³ÊWtX»_Þ:4ýnRy@k*óD(Q–% ñ¼}2ùYGYaG™AE„j¥åO£XÄOY­é÷›ÑGúl5ŠBP5ÊŒV65u[# r0L¬Ä7T³YºÝ-ílÑìÛÖˆäs`³G°\Ö Ù°­kÙ¦m›àÚ¹ƒÖî‰"QŠp×—Íù«eéM!EÎ§Ž€Ìk)û~÷Pq–YÕiØ´ ìŽ{:€1DCòøÔWEÌí?œÿ²ùÖÒ³„¢èç?¬ž¹½%³£ÑÇtÀ«ñæJ&Ï/’€ÒêÊûÇêKÿÅÞµòÃÒo=§™A*{+…}¥Ë7‡¼ïsut€ŠÜ€Ir¾—øoÜGhMr}E¡,ÕKïÞQ€k‚ Ç S‘ñò!UI:¥~v,P ù»XvË2 Û|”Œ€„šu9ÄÈž –Ì0Äíî Ù3•Ý”ùY[!…JEßœ½y>«ß” )Z#€0!cz73–YØõ;€ØmS6hº  "W£á..?…3o¸ÃOþ㣯þÙ“û™쟽¹|äJ'˜ZןÙUІw:·ng|äù2JÆAØýŸÿÞÚé¿û´üÑ¿°/~½ªÄ2­¬Rõ8\¹ ôÀçB ”3©NÄ` ÇDakMÚ¿j¢ÙZúz[YTêÙÖø›s¥ˆ&R€y IĈs>‚‡°rÆW+¯}|æÒ‘“ íõ×î¹Öû¯œ (~óá[„©TÄš ™Ù æsê¯[¥˜;áÑ…‘=ýs\ò1–ŽØy—ÁŠK©HüöâæÙj,²ülNùÄÐ{Bss›™¤×so ­ÞB€f A)´n|">ê'xw ¬nÎÏ’#÷F«‚Wઠ¬ƒ a ³‘¨«zä¯3Î8˜wmc1)B¿?y;T~¸pÊ Í©æùâÊ y Hà‘¡žM0X¯Í~Ô;²Š¸Ý +P¯ ÷$º2ÚU¶‰`°rÏñÌg#A•ã~qtëîègé™il-wn–ØÊÒqÒéÊÉøØuD)ßáŒB‘n ‘—·Œñ…¾PÆO§‘j`·}8 0¬¢S˲a&þdiku'ÕU$  [+µ…îVL†*ÃÌLÚ#rjëNoÔÛ[IüÐ eÐf!°îy"D`%T+ºD"B `R£”)tw’^m–7Hm"¥ÂçÎ ?^™¹#årEˆŒ*"€õq­‰Ç+I7êÒœM;`±êE-¡³y¨Æ%ŒÇ}DAþÞ{_Zxóò_mX«iø?ÝÚ?{ÝV›‹ÏL« ¿¶½Ò²ðØ}š4jû³ÿý›õÿì·Ã_ü·žþßîJÎ#×ÌhµÏÑ—?£U òˆšCrˆ#ã0²IûÖI`& n¼m”ù™rïÚ+‡¾:U""B•Ã3@Ø+©3,ì ä{š2¿£ë­ê¢lš}8|xº2îÖ"&¶ ·¢²šåÄîÄSm\*3)òD|ñ1ÂüW˜˜²ã*0w¢ËÆ‚"Äb¯\‹"~€ÊŠüNXÀz8O4º¶¿10€5ÊôS÷|j%Öýéì”RJêü²ÊÂFÚ—à Ý(*)B$Ê/y¹e7{f¶Ö&)ÇB**È0Yå ˆ`¹XÓyrt ä^Ì“X×¢¦ü1×=_„9J\Àn§K|±¹‡ðnÖdÀJD~Œ*Ë¢z£Š2 õáƒ+wàñ#訪À÷¯N-?˜=-f5j¾N¢¬Û]LÔ£!Qžm"T•„PÞÞ·÷òEf¶\Œž ¶ƒpµ¶cdlûöc$f‰ï–ë7ÃeŠBwÚ.¡UüFõÚF+³a)çõ)¿[ÃɬO-QÙŸ¤Ô _Í|·R©ªÐ¦,©t˜ ¶Ù`U:´ ÛÛÁ :øU¼|¹:ê*lVE¸Ç¹¯„ZCG¥ò0maÛÕC˜Ù-TABòsÎy®^4C_QãÆÐÔÿƒæ×ôŸÌ~‘4*ÕÿŸZÇ*[<=Ü9voµ„›ý»ë}i|f¯Ò7þŸŸÿÏ—Îÿ¿/þæ> ¹6¤éžê¯CVÿúãJ‡ó¸ó1x6ÇñêU0ݘÂË—Q¸~¸öÞ;÷èMm¼ è}N?ý´-ubBè½zÂŒ Þ8´qàa+`ú«Ÿì?6k]Cr’8¯ ë<£~­o:@åÏú‚ èç ¾Ð«ˆùˆÍ㽊]€ü6Lb³Ák@ñ®URJ‘š(‡ñm]Æ]C9À‡Ø]r”Vb,HmF••VäS¿®µË2Û ÉÒþË|8 ó.ÂÉèSA+°Ö¡ B’Ž h t¨ðïDw°I¡qú6°|ù8Xnc,àfy%L1é$ÌÓ_Yw³^~Ÿ¡!Ú^kJ‘B°)<àjÖb¬@†Á®OG¯÷›Ÿ¯äo4ÄáZº—^¢GËÐîׯuEŽ,‚º68¼~[ÎL9y×ë峡S$²Þó‹m¶àzÎÄ—€:hB)dÛwqF_ÿä$ a±œmÓüZºkºP ‚°žÊ6{œéŠcË'ÆÜp˜ÁZT6ô œëm[qqœÌ?qTe…ºÖkª5`@›eý,‘ƒáÎ ìI_˜Ùz×Ôîˆ æJ"Ýè‰Xë²~þSÂM”¡2 k,ò¿þNóà wo8§ÞÕoÝ÷øæ÷>ÎÌ@×þ£9ØÑ®m{ßR¤‡7{wv†xü)QŒ;ÿöŸn<ô·ïÙüç¯îýONi ê­bsæšmÖ[ø­Óš1(x†ã§ÂÙw˜Åš´{³Rš*Þo#ÐÞÄÎK¿±¯ªÐ÷Îúû1æ—·Òp昜9›mümnÞý\CÈšÑËÛ_Ýy¯{[éî U`Ž…ÓíªÍæf”*¦â>ºDŔΟî È M”åå›”Û\¬$ÌÖ²ùpC3œB,X „æŸIlºÿ2Ùʰ›äl…N¦KZ)$.èç8VnôÂÃ7š¤p2sù)1ˆek%©¶¬pYó84è÷VU”þÊXÙÀñz/öÈ yõ¹÷Nˆ³ÄútDŽRÍíÆf´]š»Ñ:\Èn‘BPõÈy{qXç$Œ†# õÈâ¾­£W.Ò™3ªîþ²xûæróÆÍÃû Ù˜2Ÿ(˜ºOáèòñÑUX<Šª8Øá=J`XÛ{å_[Îùã|¤Ã†Ÿð.`çùºŠãÑBÐnNUJ_ ¡4¢R,4ÝÞégB•4Ír”Ÿw€M¶¸gö‡‘õŸAÇ™7\™UUÂ( *kýaP†ÊÝÄ0¦i6ìÃh¹ž­)€é)!~ ~÷ÖÂVE%%’а Än û¶#—ˆ³,Þpœ²D¡*ƒÎ‰K…ÛÜÑ…ó|,SP~|ñs{ßXý|Ý€ ÿòµh~'‹×瞨U£þJg¥••ž<¢#Aböƒÿúæß}¢ýï^jþµÇ"•ÆWmp¦ýqÛ¨Vþ›÷„DÚ5iÉDDŽï®[”ÝLî^™%ÍÕŸT¿Ö¨ :+ 0µãÞÁˆcÌ©C¸/ƒ-[³òòÞþÜ%kï-žÜ5Içwc+#É5Ä*T-A²¥Ê½Ê # *p;ßnónnÿz+Q¡:žXÅ ³íþB…ññ…†»ûk áSKµpc±eaÃ`w†îË$­¬ ÌÔµÒš„|è'þmÞVÛës»T›,ðÓ‰>gŸË–H*ÎnW¦BÂÌmðâZ9ç®ç¸ÇÊaLtÚ@^âêÊÕòË‚JxT¹d6ÝN§GW{C‘à¶A  HÒ‘­«Xê´ÎPö¹zχ s¯ª/N“ó‚ €¤ƒ•ÆžÑ뵇”¹]­| ˆB÷—”zoùB¬Ò:ðYO¤™}Mz¾¾íZØU&8wŠ Í„ÒÍmlñÈm  YÜ_žî¨…ˆ$V–«D–¡VõY‚JÐϬô¼sÒÅlúlO/EÀ ˆ@‘ãŠg—+ +卸X‚XKÙH€¬µ6ÝJûõåt%Eœš§©¨úõpåÂìh³¤áø eh[&¾ À ä+!œjúÔkTãíT@” 6ŸŸ_åV¢& ¡ºÿ®öûçû? ¢D²o2]Ù±ÕZçø‰JYm´w6[féùYTJ¡²¹ðiöw^À?þvéëÏÄ·»x ¶ýA«d®µÿõ#j­É¯¡I¿I±Í&ñúÚd¶ÖŒÒQZxðñ›§ž«…HŠHé Ï)Lj)9q(¯íqÖf1?Ý^Üþü"Pšeoœk@ÈÃ\ôµ°‚B½"d6L½Î’F£q}|‹Þñ‚Ê‹OÆp•1+Ü:ÅB‹ˆð=ŵû£€ò‚o(T´ 7pþ7;ÑÃÆfØI”ò©\ UHHî _p‰™ãpýJxw— öW;Ë•wúÖ°3XZ½‰Ì²ûH Vì¾›êD Ü IÑ= _"©çn‰›iøA ‹™+@˜SÒ±V ˦GxmÏ-ß5S¤P›UîQ˜×ݾeÈ0a˜GQ>Kà¸Ü ÷ž¡(©ã=±‚Ha¹¤Jþ„¥•¢`§oAeYjÒ­aW‚nDíç |úhç½8¼Ö%uð¸fUIºZ n[ ÌÖMÄY˜9kU‡åŒ†P[RE¨E¼ÍÛY‚q<¨uù?<|ß•W>»¶þUwNF2•¤Oî*^ílµFrïçj®þ]áÎÿmõ[ÿIø _|aç.•ï WÏñÌê¹õã¿}P)Uàtÿo'a›nnY¤ÝàÍUfY8*ñkW^…ž°¹çß¶¹‰ø ‡d¡ˆ°B%+çBeî¯×Q©¢½« ýJ{‚ËZkG¡øz òYýú ‘"qwvº¶e{%­8OC­JŽ¡ t±#ˆ0[C6¬HÆ •²ÿÔ&("R$6€|G;a=+´C÷ê(œž-ê¸3~˜PÀ•@ÐfJãb®ñ¶›Ök,'-iàÈVJ[Œn¢½?ŸÞû“õò抙"‹í^Ú·¸þþÜŒo,ÉGÄbƒÇLÏê_Å{Ä! ±tÚy¥bßè9ŒÈŽIP¹FÐóL3˜È »ŒÓa¸§3Ò(I ™öjÐDˆSÝ;= :JÓÌÔ l* ‹5lZÑæƒü‹5i@ðépD*—BUòÒ©°‘rb,¡µÂ¶3؃”mÀB3Úó¼º~}z½é¥G ¢uÒSš ¥7dÃÞ/“Wñ°é†ý°Y‡5 B4¾,çÛ¡ÛúmÁ$úñûeþ{«_«ZT¤Vþ ž LµfŸœ©…É'ÝõMŸygKE‚áÿï°Oþ§ ¯ü^ÿó_®d˜NT²»S|óõö©¿¹ózã‰Ñxýsß\ ,™\ÉFo’ 7ÿrô×g*€J¡Ðø9rŸ7ޱã#M‘ãccÁÚW×v_zOVÒŸm>s²*Hwa^¡²Y@ÓéWÙ¢òÁ:,ÈĹö‡Ó¯ðíÁ‚DÀŒÂ¨ˆÙZ“¼ÅÁpáx5ðÌŽ yÚQþVã€É¶ÓG€$F@Œ–k¡Rš©èaf +«úðZ¼^ñf˜'†ö 씦4(á0³Ö|ÙŒ{ßù™°ôµî9<&Ÿx,5{6XQ¢5±"XfAa?“EôX8Iïš%s+œLu‚ €%çãy¥4»#ª&}®Â –“›Ÿ<Ñÿ±=õL(¿Õ‹¬¤ûÃW³ÇB³VZ~¯1óñ¥?:X}CJ÷†JùÃÙÁýÛC— VÞ³Âl‹Wˆˆu`ni´­kHõœC÷µ!³…V£6DÍ»åÈn­À0Î.mïê°ÒϬ·yãØ *l¥•á°j-»×WZÒ9lÑïóBBUÄšv.„’IY@s˲Å©@–nñpyz´*"»¢ògæ{‡éfPž:¹«GD!@ÚU "jkà‘’cßÍÌÈl3ŒqÙ@Àj"€ TÞ »†ÓÐâQý:üëÃOX~ëeÕIØì<Õ£Ö•®m>·B…bÄ¢ùþÿyý¿sàý¶ùÔW*«¼o¶:º¬wËŸ›{ÿæ>­­Ç½çˉˆu;Ÿ5­Bc®toc û—€zW¾_ûFÙ)ˆ”“¨sBzÁƒÜ¼Q¼E}xEÚ>[ÕÏEIjÞœ:´Û¹VÈW‰•Á:”™²kÚ5M×´ó¶9Ö%*ß)\¸`Ä?:.×0Öö]Ý’3’Å"HÀHváFÂ}QHN#•ƒÎ\ó  Ë;"œX1‰IZ-vÚ»"ôŒ¾=¥R)]«€ ÙZcl÷8$—kû# ·;¸¯º8¯(·Ñ’Í ¥ª,!¤ªRÞšÿJ0^Þ%H㪠qJŽhÄ"å,yçç£Îzæ¯^bâÞLtƒ![œhÉR]˶©N#[ª½´Ý“Æ=¿Ž~p‡¾¸Pi¯&›×ö-\^9¸GúëK;+bžº_éÞ•m8;EŠ”"Pᓼ ‚…Pýr'³â4@Ιi–A5@ZN»W®àÄé -ªyçßÝÃ(¨EÁŒÙêgV—a”æ[b>Ù!"–ÁŽî!Y~±¤,¸—„×*¨•J×hS 6ÈbÁlf³ôƒcr× ”ç–ïK?Ùî€nÞsÒ¼—¨€HÐÚ² 2w2ñÓ…‰ÍSánõ “´òM;ùó_Ì~düföW@Øø£{Þþé³{Øéø;•ª«SMHJ ƒåwþo—öþîÉÿâö½Ÿ‹nCétwL­ž}ôæèá@¡R® ãÊ!aNzW7z@KfOigÓvIn"Aòá+g¾PÜÇ%}Æý^õºRKòT&0ÛÍo>–} óûœúJ¸ÿžÎŽ`‹ÁÝ÷S+^öÍkæÉ{:ƒ)6­¢, 5¢Bš6I%îei´…z‘ŒMa®»3²¬ª‰1y¾+g^qžöKwJý‚’ €Î É€ˆªJ„U@L=X•¨ÞfÆdlmÚtx¯l÷PƒOÕWÎ/Ä]©,ß_}ëJ4£¬Ì [bÅ;yÆv6Mm²„¼‰)Þž¹â36-ykt~`d@`xù–ºþÕ YÕþöõP[.sõñF¤í•íU£9®U¨ˆ+ÿíÏvÿî÷þÅ¥û^ÜÈá*­ô­éò/ÞJ¾üÜkÔä];`s¨,*rƽ4Yïv”Ì7ê:¾ZÞÞs<°ñO¯=ºn ‡ø)§Ð| ^ œ§DX¬í«Ìæ3‘`Ò»ûêôWw ;QÏ9ú,3Ûk„‘*UÍ6Te‡ö+bQ¾Yf\Ÿ9.¿·|õ„Åݲø·Ú¸C=[îïtÝ%\‘gKm:Ð)p:@~odÁÛíêñëé=ud”O7‘{,°¥V)°`SŠX ¸BÐÉØÏ˜:™ .2WŽŸ]ø $oºt £8Žh»œóÉW²-Œv‚Ô8,gFM™ h¤;6²·;¥Ý½ vy#|ðí‹ÁÓGPå†l6­;ûêoŒîŸ¥v¶teC+‘ýGH.ì«~d*÷*R$DðDù†M˜”}kG˜Æ^«‚|Ž„Ö$î𤓳 Ù‚P F£J°‡fgzÄv_¤¦›ííT0* RpA»|ÀE „AH¸ Ì^P# 8Ï\‚ŽÂ¨ Ø‘EŒA°“Z‘,áΖ¶ËïÈ©=ÉMnáÔCK—ß+€¶/&…PÀn{¦‰·‰²ˆ±É Ô•tl, AH¹d²Ú¨lcÞCé‚©÷‡å/¦ß=ðj–?ÚT(TJ÷ªªs±ÝîÈÒ³‹Šˆ$¿®ü£VþúóíseïÙŒçæõpk^6Bùä5ûkÏ5‰Æ´Hœ8I ³5i·½ÑÇꌚ7«ÜK$|r)îüEòµ¥#ùˆ®ûéÙ×+ ²æ-’ChÄð…7—×OžkÞ½{tïT®u:/žXcoXTH¥,ã´>½%åà6k}¾jìý…qØ÷¿;Ì<ùCTˆ¡B+vãíP¥g+ušt| ­——ëäÓgÉ2kzCö¿"daÜS ”ÈYqþ¾ö <ÝÚXZŒ*’<¼ ú °eêCI¥)L {0ÐÍÆY`B¶‡ÿ…”˜{|ðb‚¡W„„É[îÝÜ>wP±´Á –ò¦:ÀN¯‡Ml™j5I Ò½„K•–„%?=Yû‘™û|rŸdý¥]Ãw¦NC·3o)Ap"„f÷­–º¯,ŠUó̰—(Õ¾À^Ê÷­¢N°\…ÁH\ MBÚrsõ²¨Œ¸©ãLe:€°Õµ6(É(f ŸùKÑ›¶« J¨œ‹Ä.¬HQ•„;®ºÒˆ;„&e±& Ìpvqx‡DêØ^­ßÌ*µ“G[/ñl$`,rª4ˆH²aÑúø¥›ôÕ°ÁpB!Z™xÖ<¿©¨®³Þâ €W~zö¾«ï?·h ’OÞ(@"¸oW-Ôw¯vïÆpßÃ!)"dc…m÷ŸÿIð;¿ÿábUÂ=%Ø*ïÞº©»ߨå‰)B/ÓûQlŽÃb›öWû+ ó<§[›•Úå‡*hmvëÕ}¿Q©‚kÌŸhw O—so€ˆXg„ÙJú]ž‚ÏV$°£Á»Ó‡ç‚Ü*™wÃÉPÙÌg£N#3óT@R\hÑ)ã…ÆÝàÇ)×YF¹Ï }=®£¾±Èà—™Îfî¯jM9°“r÷ÂDæø$Á€6‘¸“¹œÖŽZ8¯4ê@ƒÂbaxÞV÷„¯Op ½I›¯Ë‰0°&iÛ¢””…"CŽòñaµOÃÎ`ìÎw*d)¾COë:ÞŠî§Ýc¢³?µ%ÛµF l),†Æd´Zî·ô‚tmظt7ÚµÊÑ¥óí¯~¨9J9ës¼6ؼʕ‡kÍÙsC"‘ûv©ÑÊñþ'°o*Њ¨­ b—½º½á8Àã2‡݃€T-a?ñnމŸ?×d1ÔMVZˆíÚô®”;Xš¥gûë#‹A9µrݘªàŽPÖÚ¾BT†Ws`WÔÂê•F¸xPá…Á'R>«DÊŸ‹¯ m @hÏ%ÖúÊçï/Ö> 44ö *fËŸú¬Üv¡q¿ÞÈâ ÕjvgØ–§wºÖBP$Ù¤ßQØÕ&»-³!*rêõ¸Œ¤´ŒÑol³«ežA‘xSq8?—Ïmñ8®ópƉ¼í+‡c`žäw``$—?þÜbvä@S£""ðËÎóΊ<€ŸD±ÖfÉp§-€BHŠ|_O}>Œ"hÐ^j°feïYIWHa±0?Í`DË4ÀŠâ¾hø^ÏXŒa–‰÷vqDÉãþyþ‹’äÔw½k&Täó~%ÈÒV{*è –h ¤J€·7“r¥×Ñ»T¿Kó7Öƒ=—|ªññê#w_ÆûÏ`ÑHÄñ5Y¾V}Ú[óúÐ Ð}‘:»×väLU'·ãÔ0:—3°Ì EöÁG'¥0LDñã+¥À…fÑR– W«Ã æ£p&h2ÆŠŠ#~7ÇÉ{! #pšR1æàiÊ“è-$¬„aT.h€®•@gFÄ€Xuc»»jv0S0K'îYÿi6{mÌ™QZŒÖR)êDP¬ ºØ„b»¨h›, …¾Czâ`Vo%/àà¶påÏ?ùî¹/N[&Rƒ¯­i´øèžJ)Ú¾9\ñ©§K¤\’ÚŠyùµžüfú½»Pº§œl4ç›fe­yë7ÿÖ^‡5HÐÁ,Ά[»„û›\Yo×[„ÀfßóµP ný ú«³HšŠ¨£eÏ0‘Ü™—Pòª¶"Ö^{yÏÖG1µß=¹4m}%¶–­Èm†ˆ+e¶¼jË}0 H(oQWnüŒ‚ÄXxfü‘ØO}/– .šV|a; 0({~-”ðÞ@“‡Ãä¾Â¢,sg°D6)w¶ñávdAŒf¡Ršµò|r¶Ø;LJF«Í=ãKÆ8â'`Ç7wIY©,Ciº³¿»‡ç¾¢âHÆ»©»=Œy€’‡‘ü%ÎÛ~%Û 4q·ñ(*âd³:“ †¾áE0;Úéëft+™ª´¶ÒùêÇé®ò&/œ•—,¿Ö*yΩ¯ bFk­Ýå·ͧëÓSçÚ%ÛãÓÐß<³}ì…è1õÁ°ßT ·wŒäÈóO98A@Ñ`—-§ Ë·C6²r 0„e›÷`ª, [I&A)ͬ€äY´ðÕzMPÝÆÏ( ä£ç<‘åšÂlöÃÍ=ƒçgY²~÷õŇ€RxòEàN Q¨fÅÚö¨Ñ¥Å©Ãüæä䩊Û{–\Û³°õÎô¸5ZìW¥!ÕÎDøæ’¾Âå€p×}Ûý¤´D׬µÄãfrIø†HÅb‘Œñ– ?Ì ©ISU…\ª¥)¤ýFƒÙÊôN75•úI<É„È?¼Ãá#áöëþR=jMŠÙšî…}³ço>_Ÿ[¼±V‰FfïaÝ=Ò^S{w©™Gº×zö°0ôÖÙ1—ñ&†‚¨DÂiÈZ,>F& ÑôTPËÍŠ˜¶m$¬Óõr:„Ý»ãv*¨Kiœ¹;3æ ®?#¹<'¹µf÷T¸Ù‚R½\ª—L[ÇPƒ T;³„Y –F#cæŽ6 –õÂýú—ëÍg*+¿@Fck 0Äd[&ªw‹P£eÛçîÔT–¥.¿ºË/€‡]ûÿ7¹3œ;%Ò$ V²ï¬}%úÞâãB’µ{/¯*±SÔ£PÖ®·7¡ôùCÙ‚.aÏFäÆÿëúî½Òù3RmÔUP®Rxî•ò¯?TFBT΋ë§+iÑÄw1ýDpJÁ¥Ê¶H44’œ|¶ŒFun¾Týúl™ý¢÷†BÇõΉƒ ˆ<æºújì¬÷íº{†@—VY¨1b¡Ý°1ÙE‚Úh6H³äŽ*w£åÈ*U/yÚx<Gt¶—ñôÏó1 ‹ï4ÃÉÏ•î]¨ä)—ø)7sR~°Öy|­ÞDm H4_ B"­‰Êg–¤Ë~\™>T üCö)¿A>°°BF!Ç™¬±+ËS?8†¬âdZQ&´)eTÿÇâšø¢ÄÂAUà…‹p p²É%’`–Š])°‚·úát¶Í{ËÙzÜÈÞàYìâ©ü–ÜûöZð̾b×·Ã;ÑnûAéXOÓ·U©ƒ¥û#úÅa}‚3xïÂ:v§÷måœk}@#—‡ÐwƒYPº fH“>H)òe"5Ýl„œv“(Nûqi›+»ƒÔBTILŸª{ã]…•r2»iÖÙùÉ"ÉMeÅý¤€[çªGá¹ölV‘qš~¢ëdÕ,ž Ï}£P`!çò †bìN[ÍÖZq}±7ØéM__f®?n¾õ@ù[éî§Cñw[N[ëÇÊ?KO5{ë‹•·²F/†“Kx«¶|5ÕÇfžN.ÇÃC¦¢àêYÀÏ…‹£‘‡J‰âjÅf1ƒÖNL§ÝñPE• 9õÞ;OìúÑðK­l¶.…`ÕÙ¥r·n¶×býЉ *¥]ñˆgT\ü½µÔûw÷Õ*‘Ò¥Ö­Jòƒû¿¹7 ­Èß(ÙÆ7gZ«ÔóÃöªwSI£_[$†Q÷åÏk(Ê]ùÖ7Ö±HÑYÇãͧ˜A˜[ß/ç>£ÄÚôã[§æ¦ÀS_„ ËêUf­µƒþBö”¥(L[FÐ-ùq©¸Œ@Ñ8à/ hDa~,af迉ÚÜ?¢BP€4Žêx}Zrò%æItîv¶3OËcä³a%TJiňb%ÇþvÖƒ×x%ð™(÷û¸Ò C°Šì)ú㯠¸áB~%Ì‹>¼Ê4!áL´¨ºÆâj““’œ¦è­^åàÁ@‘HM¡Rj”¤5,5»w‚#bo®M•_ç)kÔ}‹øzÿþO>QÏTŠ\·ã¨s£¶»}~êlv·>»y+ÂÍV­Û‡Z-Š*‰:¸•-¯4wb©Å}°d†‰¸ûág1*qÇK‚’ÛÑñŠòïJ$E¥°\­!b¬@T»JŒsµ)IGÌ ƒ¶(i^]™úLíöO†ÒdM½)!`´bf×8è_ƒl‘mb™2Y3‰݌[\_LôMð^}Nâ?}Uþüðb@µw^[ÕÀ»Ï6ƒòpíÖö–4Ÿ]ˆ´F‡«vÔÚ«ÿ²«ks/ÝÅå¥B†kÛÍooŸüÍ]…Ê]„ ·¹5w¯7X»ÙÜTÐ䮂øÀWJh¥»ö½àkKuEÚyÝÇÔyqz¨ã=b¬K_¿2¿ö¹=6Èüêô½M"R ÖZ;¸ Am°¤²d¸]˜…å±Å4Qå+.\\Y& ×yGP­$VÀHb,sün'äêéR œ0&‰å–¿8Š? r–˜Q§#c# "ri®R ê0ð' —r30º‡;;»fµ&D.*éS  ,–­Œ¬PÓ_[òµé&*Hš žö^I€"Ξc˜Ç (€H‚V&¼Þyá(º5qÐÆQ)‚*D¶[›4c¯fûaóR2}u-l»ûžpôƽÁ÷³ùç+@¤”°`¼šì~FgK­tÞÂÙ ‹gkéå#r ê_ ;ÁèPtµ €vÕxoŽ#Aú¹dN;(‡ÔYrŽ$L6Y#ºjkõHSí¤{(ɲU)í@d‡JÂÒ(Ë&L¥!,1n?Pew°`F±»ËnXî¶ €Êå°‚d@‚¨x'â̰¯ŠczCè@ÕL/‡÷ïí¯-X"æÁ̬Ú,‚|–9Gnƒ•Q–eÓ’uňTÝã@Ÿ× r¢Ž»+ÝdÙÒoÝûøGoq0  w¾Ó ÈŠ=µ? Ë•ÞÖÈœx´‰Êu1yw¯IÓ+’ὕ_§v‹hQúv§qã/vž~qVP¡C«{zšK/³IƒÙ•Š–±´ÞÐó뉢ìñg¶Ð¾óó£ÏUJ@jܰ헑{{IžN%þÆü¥*Fú?ˆtéYÅ”¶¯\no8.б&½FXë5ˆ%ÞЕAc& ¤…À¤ãwÒ3åY¥ì|…-ˆ¬BÆ$lÁÛõÍÚûHÙ}µ2ù£D^ ,~Q3tèc޼WK ¥JI‘Ò¡ÓïH˜ÅZøB6?s=< ÉyMQ娾ü‰w®K 醂!ÎøÜhÁÒËwd•3r®Ÿÿ›üÀ²€Ž£’Çh¼æ$':M”Q; mÖÌZÂ…YQB$PÜ]åFùîGåû+fc¥¡>&>[Âw·»ñ¾|ö~'ZÛdëê®Å 7ÚÚÙ]}ogf(xhܘš¿–Ábg{hήæÐì0±aÌ“@ùÄIDˆQJˆ]pµç“m ^›£z8=OB´—»Í9« ÓYnMYTAi¹Šâr!Uâ*ÚQUü=•l S‹ 1·‚)‚ ¨ƒ@/ÎbÉ¥%ÃÌHbŒ0£¸Öµ4ÑI#ˆœß:ö˜~í# ªÊ"bfƒ‚Q¶eœßÙ:³XëLÖÆÃd4q¢,BÕÇ‹µ‚yD­À?ù7¹–DüËó_šÿIõEP,äÎ+*0úé©R‰×>謡þÂáˆùÊe`¶‚†ß»êÙðÏ?3£t¤*rmX9ÿRúÕÇfPkrhGø‡«2éèFsçðîf¨FÐC^ìï$bì—è ìÆ/Ï?w_ÙYµiL£÷'ºÂÇ…)Р3[óæ‡ ýÇÁxëç³'÷¡o® k® ÔÊÕÈbºi¦ºÑRà<>’GHü¹8GF7‡ƒÜ &ˆâjÈÙ¥Ž…E¬±ÙÏFdö®+‡¬ËßB4áÖ-’ÌlØtÝ­aÁot¨¡†" B BG +Ì×¶+‡.Ó¡ ¡7 ÿ ÔO€’v0 v”L~•2˯ÀÁÒGèú¶ÝâáÂ<Å„_ [^›J Ö·ªú»‘7 ç…–%I¶Øµo °ÈLE´qÞˆï]‚´µÝ¸Ñ ­•CÇTú½Ó‹ßiמ«±cú Å—ÃýñÛͳµ©¥õóapªgKký}Û]‘ »stêÃ…’ ÙZëÇâ»á$7ç25{bòX·%¿Ü®‚Ó%›1é;j.2”Ýž‘]ŒAÓT€ŠîGOýbàË ‘0±z?(Ò„Z°T Ë3"°mÅè$”ú ƒÅ2»ð6äÐÌ`@âõÇ£õWL ­e Š3·ÝõKÈQ6Ý&`M—w¦*6@™œ?•ʽûÔ sGh>[.°Ræß©/vþòì1f$öô‡·€²ù'Ë¥0^ûäÎŽ­|e™¹ØƒÍ3ûïN=YŠÍ±ÏÖ2 °Ìwýá«òSë‰ÞµàoÚL²—/ †MÔkµ-½k6ÁÔk®b¤·õýߨ×P¨T±…yœÚ,ê­½2ÙÊèÏë/(æ$»på©rŹžµro¸+C,E4•¥v'­µér÷t—Ïïú E„È=É…ù¨¸ÝæWAÏfAfNV?Ñ¢Žë€ˆPAîÇÌ9žrê‡j–ÁZɆYÖïØ¢bY‘§çƒ€©\ Pœg€E¬áÁ-:qgx|6ðÄ ‚Ž$Ÿòè!q‚5â©û J?7Ää y+Já‰òçßn\¸Ió[Cn’2 ¬|ÄN“M2$_¨ë&ç¥iR ºÓ1õÊÖù™{ ëÞ­á5FõxD·?zjí]:û‘;ØdíÍ]÷û§kweY>}«Œ'kÃë'yS¡fnl ŒÀN†û‹“ Š(Âà^¾¯¨™ssW Âé`º^”~fu;]"­øj¥‘ñRUJ•˜³ÜK‹¾ñ*Gr!‘¬[·¦"+ Lj´_Y¤T)ŒÊe@P’™Ô„Å:¡ (­*ahõÊÇæ’o"H…H $µÄŽJý_jäbèžÅ<¬öƒiö”Hè;.¬)¢\8js! 7ÊJAð½ö݇ξ²ñ¥R@Њû¯'ìñ{Âzi´¹³–òÑ/4•VZ)çaffóñíÔ~=ê?õ\3B]MÖ­ýøÜâ7Žç³k‹³)#Kg»v{ˆt¸Lfjƒg‡=º]J½¨)ÅÎú÷ç¾>Uå¼}X¼}#%ã\Ï6—^ŸI<(ŠÃ_L?7SÀ€™¹½%8…ˆa­]ÙCURÀ˜×(¦x?$@f×?’“ X £ «Æ0bAƒñ>"B£·%0g—+ÊÞÖùbšáÅYæbf¶É0ëôbž@òJµj@M¹éÁEúçy‰×§g†?¿þÉÜÑõFýÂöL¯#KGõåéJ¤ÙÙµç£ò3`ÂbEs­58ûá3ñ d[‚Â`‰¼pP €Da%šžV€¸ÇqÉvše¥`+-õa~áÐd9zÃßÑØ_ÜADÊÆmê!R2YªCDˆ¨ˆ¨R.Ï„qO›¬HÄ ÙØXD6.÷º J`0<´__ù€E¤ŠÄ¦~YpPއèÃñE|‹DXQ§ì ‹ ‘""ÎKaó2 ñxm÷…ãÄÄÈ™¨Ñü¸õBéÏ=ÅL¤Ì¦œ IK÷ÍaÚº½Þ|䞺F×íîBÖÚõ;Ø] 0ygðÌã+Ma]mýòʉ/îAPJy<†xɺ½Y¼\[4HcÀÚâFýöRü™G w®½uïcÕÈ‘ 'À>RŒÑ¼Ë8Y2£e~/õbÙ>¼~ßRÑñ,XŒØþM‚Êhû[• i*5YùW9 'šû| ÏRÖ~!_'æîÎŒ‚,Â̆mj[?QVäTEÄɶqÊÕ$ïg`+2ÌzE[ªÕ¨(ÂÀ%€ó[gׇõÙ¥ƒe•›:ŠynÑ,BÜç2ñÀ(5&¯ >ѯ”ü"ŹŕàSnº‰‰H¯ ƒNÐܰ»Øˆî”{1î ÊIb0ÏB啉CÊMëkk‘†=Ìäß”HJ…U]Žê"ÐSœ³%ÁžIE¥Yƾ©Cí [KKS`@Êêâ5Á¨ˆÀ¡n)a(µcBÍñv 7ö°fff6äNÈ @1—ñTy†‰î7ö'k ¼‚…Þ}õ™Ã/ _™³6÷_ë€@÷î «ÁÖµ›±÷Þ[D­È1OÕÅt ¾7 ïÝþQôÅã@6;•k/ó—îEHʨ•o,·›ðnez1íLß̨~ëHø²±¯Î Ö~¨¿1Õ@!¢"hî7ò}ã—?û°¬€±2ú^ ô¥ˆu_Z{v®Äèh,|Õ`%›qÌ+\jã1íd W€‘šPM|úÇÜ@ÌMÕÀ,F¨(Å`±bÞïfyO¥°0ç;@ñÖ•"`زeN¶×0ŒMÂÕ©jµ(¤ о8X„Uç*ïßî,–´ƒŒÇï8égânZÖÐPeòg/uË5;ôÞv/™hè›uryâSõ?þ*In¾‹Ã«%.oJZ¡-çј!˜dÐAëz¶»öIëØaäþzo#퀅SB[o<4ú©=ø™29Љí^R{{4Înß™¯\jM…=©ŸÖ×Ê)DçŽ7 •ÌŽÅ­¢ÔYEU ²DŠ—–•ú')P3ºÑT€¸5°m®Ó$PnбÙÊÈH.uŒ×ÞµåJäj ÄžF¯™ì­¸^¥ªõòTY@¶U’KÀ#k€­€°¿Å‘ªÞ“´ŒÅ…E%Ðû­€ŠjB60V'Ô6b¡ÈIÞçÊ é@’1†¡¹aÖd”ך‘LÎAd #ûçæÅÑO'T„ÃŽZ¹Ì`jÕ°Ìí[×c^Ø_wF(‡Eϲ•­`ùý·`æ™ëß­ýæ~ÂP—éF[üFôWî AirìM.\&l³ÍfwU 솭ª1 Ò+rèê/Krú3¤Duoýhÿ a¥TB¡LÉDÍ¿}òN;?Þæ•×–z'ŽÆaç'³÷Íhµ6[mAÉ, ´Í] ‰üµ€§`þ·z\ொÁmù˜<óè9e‹™Íí‹$ÁaQÎ"½ïæé¹gƲˆa;Lâí¶— @Ðl6*‘&­¢@!¹w«áøŠY˜ºÓØ“o~ù¼’$q9„Ä2ª&»¢;çÕ/¢9_ ó×|ÁýÉ›“ ÏìŒýSh¢³](ÿ‘ –0jÖIÁö-$¢j™Éô®®ÎOõ?¨<„6ÛÙu+k ¥GKJ^ N¿s?¿‡I,ðhseù'pFîì_Ú¼Õnƒ:QÛ†tÈ2³Ò¾ÏãØÇ^ËBß Ë’ŽØ³±]¿Ÿx3„ £é Òl l wZq)Ûª7*< nIù8Œ S~âÄÂ-é!Ž"_Öù½np3˜Û-š”ÒI—jÑT ¯›‘¸,bƒ!ZADux¦ßë§<ÝŒYî¬hk!„¦ :‰MmW³µN>Ô~ó’|:ÒƒFEº‰EdU jhþÆqÎ4¿Ô•Hå~@?|¶²öNÜÿáÊWË Zé­,~«¥…Äœ8¥tåÒm1‹Ï/”µ3#Jfû7éPúŠ¥CϾ÷Óå¿ÙD u`nbòòÕ}ß8¨µ"šxæÅØ• ^FƒóÓ èu+³WN¿z7ȾtŸ¶–;o¼ñ¥û*!ª¼]Uå€n_߃ãú‹üƒaÿ §ðó%cmvñîÓ5Èù<Ì2ºT3ó©åt£™Å‹3‚¨‚Ž%èÀ#”7+åFx˜ˆÍù^q·јåñ¤Ö ~*;5_Ñk€¿ÒsŠÅIÌÁÁÅš¬Ÿ¶;£1³Uuª^)E I¡F ‹ˆE—{á®›t*RäáÀ„“U~ …„¬Šƒ‹aÐ3B Á§Ê ÇõßãXov ¼ÜYi|üuð@´¶HÞú㦟‹qÞV.Š õ¢"ÚØ1@³†HÚ¤烃ðêèÞi’ÑNçN4LÄ=$zðí‡ËßOvEHÚ¹=»gëêòÑUÞ«ÞÀ½k#<¸¿®L;skÿ|×y*}"ÔK©ˆ ˆ-J5‚QŒ†}h's®+Í*ƒŒ¶Ûûº¼.{¡4Û¹±ç:gÀ·ðe24áôT $HU± Z€Öz†£{0&"MÕ Ô±…”±ˆ±()ÈÐb­u'ägôµ~b„âOdj%!Õ„D@oÕUÞ4îõÐj6ò¥¼-íJ`{‰Ó=ÀÃòû/#M´"RÑx=ñå;¬¿|á×g¾·ø$e‚*ÝH®ýˆÁ'ö–Bîm]iKúÐó*P¤Š‹ŸØ·danµöì3ï¼¶ëwVA)¹¤¾uâ˨óz”¼¨À§­öÂ!ƒµé-Áhãž«pvð»þÎ>H0Ûùο±·ª@yôQÔI$9‹«èô(`fa¶7~2Û={Ö‚ôz¿ÜóÔ¬ÊhbE>˜…™njXߥ41åS^G,0—ŒÉþ`àC».rBd½à À–YÌG·µF‘[oªh ͆àÅ;D°l¬€5;ÃQkÇŒ©G€TnÔêÕ’VJQˆ(¤@Ä+[·Õ;£ý¥] sÎâñÞV cGaMÒ‘Í‚h;ò EÑ‘‹ˆžIE –L³0ç“»38ãH¾ƒë®#…À \ó ÛD3K©AªT¶I|Ëkn¼ÛxØöÖ×ÍU’ƃa Ï øø’zü4!Ë`%>ü$z4Ùš­]ê6+[žºõp‹$<;\ …”å ll~ÏGת ªŠúÓä´—rût)œÂ©)íDÝÑÖšƒ«•lGöè_9‚8áË›Ei4fޱ„*¹² 1tí QÖ«,°Ac A„ ÀZG€% T‹zíQË nܨ¤QJ+¸3-˜T³Môr!“»‹¨BÛ ºASLB!rH¹Bã-(âJ³=?5WL|›!dÿnú…[¯<»K ¢öì{´(°Ç*Q·Vn+”ö×µö~x W“`?_N?Hž<ý“wîýõª JÐ[»ßzfÆÔ %Âýg´23\¡.NÍÞž¬m×fVí»ðC±S߬k#£á·ð›Se"T”/aL¨È>nspN·À¬ù‹V>[b´ƒ·n=1]É_^ÂÆ\Í ¢ÊM1ñ¦­õ‚ýŽ’èçÌX\‡pÒè!Ř—+K¾HÑ XGípp!à,{UÈž­”P»R–1k#—ÚÑ÷o³1–Ó 8ëvv†…b† ¨+Õ †Zé Tn è"AéUÚ›líš ¼ã‡Æ¬{ú%!¶R]²>ŠÌ‘»££gªT&ÆýE• Œa*îŠ 9Z‘Q¬÷8M†€'üµœOK|$5} 2 FÌÒ,\kì±/§÷Õ¦›kÛ³[}´gkÎ~ptö;Ùô ugOâdýÆüÌÅ#³í©©Ñ'ÑÜÀ=2ôî]ÞÎÀˆ°–ü4!¢o@  Hß0ú0¼È,«e’MäQߌâZÚšš.óÎÅíê 6*쇋lÇ5ìÎYé©Y«\åX\W#Ø3eÃ0 U/•§B€¬ƒ1ˆµ‰±ÖSÚHª^ëm¬!WË2[–H«@—]pRe‰Ãa¯ `ä4¬\¸f¶‚Nû!ÐŽmÐRðϘ}²='ì‰<ɯ'D€K?|ðij/jTÒ o ” Øc'T ×.¯Ó¨öœFENßæÞŠÞwôµ—èsG~xû‰çJ Ë:ÜÜ¢K¯–_<]"¥´¢¹P³1kº®îŽ‚}1…=ª˜Íc7ðõ‹JéÉ/†ÆBçÎŽ>Fèéwk~y*”±SDX™™ÅÊÖO¢øÔ1°2ì¾>w¨VÐS¬ÈZt”Íg€­þÔ–Ú["E&ù â(â$y_ £-L”®20°k?vvPËo+ž?V ”ý—†ŸæÂ92³°ØlºÝlÂLA¹Ñ¨W+V¤Ê%­@0 cúIRž½SÛøÁˆ÷:ŠŒW ¡& „jJb™Ryõ™KÉâ§:Ke2`šËýìÕò¢Hót+h?T±ª ÅÁYïÜkJk›ßšŒJC‘ù ĤIrs¸\½siï “¬Þ ×V¨.®>rëCõÐY""d‘ÁµêÁÎÛ³Ç6`_ð.ïÞ`½z;nΈL•.„ c=&÷YNv2#ˆÈ|‚‚nö‘¢H•=‡IB•= ” ©¨\«4ŠÑd"V€„¬õ¨BBu:ݲ8®ï ¥ÑL"TA]РdÕŽ%˨­§¶Ã¸†Zld·Â¡²PÑHŠP$7Ìçeð€<®áö%‘¾ñ]‘Û~¸ùbøí“§QÖQ×ΓÚèì|fý›ŸÄQ|ï#ÓÚMèA,‹pú>©ÞäèåïD_Þó§í/=N µÂ­!½öÉì_9)¥H+÷ 3ÓïO]‹Ã6-6¶§úÕó Õ»§÷þÃͲyþŒ²"ÝwÞúò‰(@íPó>.Ÿ¸ÙÝ T­Kü9Ë›—o…òåš¡,ýpí‹ ¥B»uô´Z`–ak*6»¦I!*Ÿ— ±m'ž\øR&üðþ1w­+y.È9©ÜÉJl¼ò¡ýL¥BŠU1¶À‚l>I1ˆØÌ¤ýNodÇý#¨£r³T¯… ‰t(RJ9ÒíhßUu°¢•BDfûFö¥µ"Âsdl‚ m‡ R sc¬‚û†&úòPDÁ·ÌGƒE/kÑó ãöK,Ù<¶:K® ȹ$\꽿S2ŒÕºÒfl:+•¥ìµÒ“ØáÎåÖ¾•ʃ¡ Ó¿Ü¿ïû©/M³B@”dus>xÏ$ƒ©Ò­fmCDZƒ}Ód°2+Ès/¸ð+3{}IgÄöe¢¨ˆhA¦›»-”$ ýpjö×G£ôÆâ¶¡–ˆÜ_šÅ‹'(ù!%Aa` e»+–ŽDˆH5*GUÙ¶6+Ê‹-dÜÎÈH€Hû­·;ðRÝ# PšQA¤¥ªY¨["‘¬ÜJÆå¬ùi¾p£HjãÑa—GÚ«´ ÅÓ+E<¿€¼ÉÄr¶ÜÝ?ÝýøåŸ« @+é¿Ù€ Û{_=¢A÷æíäù#µ@)Ïídcñ¢jlŽÒwþ¢ùµà;ÉWO¡QZîfö«Gž_òh€bêÌÂ6^ivÖëWD/fûl—×:‡ïØê«šªêo,ÚìÎK›m©ìتèÛ*@Ü8 Oçã7ÈsB ¬þ°Ú?uÊ2¥;/￯YÔ!›]G™‚]a’ŽÖK8šZ@vL‘üt5àÄa'ztœî¢Àì{·ØcFoŒ´9°\ÖZœ‰}$;ÏEåP±–ÙŠMFÃn«—¿†åz½\ 5 Q*TÌF×ðp;9V â§rËc·ýÛ•:Úk±\EòøCɈãlrŽF†qº_|™B~y)С^„¦±ž¯&‚|ÐkóP~M 3Œ¶‰2 YPœËÙy»½ëôQ$é­\©7.ƒ=t]¹òèÝ×àÌÚ]ÕÓþ­¹ù«·TîN7{×Õ-FÖ7ªú.ª6-{-‚½~#Þ­,¾”Qd dŸzs~! ŠéJ3¨M!n01ƒv¿Üë/U{]{^«Ù[Ö>Žå³ÅyÏ…#I ˜ˆ‰¬Ô¡'Á‘&h¥ËA­Z€MT‰Së › YÁéàvo쪫ª¶ ›Ò(%GkWx¨ºÂõ?éçf@dISÔÒd€å‹^žñš ç[@Îó˜è¼lÇ"€yãÜóÍí~Ôýl]uí—ÈL"î)E0Ú¸””Ó™È1k‘ØÊF·6?Øœ¥ä{o4¿²þà·)ŒtÔ[çï¦O=6MŠHÑ„’Ç6ݼ8µsç ÅzåâBr÷ø~ô—û¿1C™MÖ¾·üWªQn>%ÄO]Îsã ãoÊ6æÍµš2ÀÏÍó» Ëc…òì )Q­– GÉx¼WÈÝÃVÚíN»ækTJû" Ba67ûáü¥ð@ˆ9HZI¹@xý$¤¶¦q ^+÷ç@u÷d¹Ë²˜ ~“öMF¨”  â,+V~NTN…ÄÔ¡ R+ESms:òâ¹@²È°Àäk¿zwï‰EFž\¿»^CytýpãƒWúïÈÉokÔ`’Ý›ÇÛ ψ]T7£pIÖÛ:nTö±¨‰²ÆæD¥"•±ä£’®÷DÊwI„‘oŽ›­£Àf€ÚÆCjo‹72`o­ÞcÿœREªšLñÿyê3""øQ43eLÒöä^bMu¿B&]¯4j XŽÅ0(í¸níáê¾3š;0ÚA€ÏÀŽö+žöA õª€&„Oƒ2r˜¹¥ŒéבIìRàR¹Á¼kÍOq,”mEJPáôÈGuóÏžü¹ù_3úe™ÛOÔ|orÿóíΖ~u¥‚n )"`£+xHÖƒšÏýÿûíǾ÷ÁGÿ|QiOë^üöÒ¡?XV¤”ÖåàXDx¼×Øìº¹C-Û“½kvýü2 ÿûƒp*`+ã·nüù‰J€ô °Nñ jÌînW+ˆÀlß\¯È÷ëyøaïù9ßÙ¶3ÜGÕ‰÷±ÅhgnÓ®µÑ-Ó¨ÌÊ’zéÖI¥|Fʹ!¸jε$ÅV…YÙ¦_mùÐ9\s‰÷îÌšÉiƒBW† l¬ËÖ¤£Áx˜rÑ` W©¶µZÕ÷5’VED$¶×ñØ:œ4褲w!iü±"«lVóh˜ ¨%$@v˜äÂG]ÖÂSÁØÔ¸_€¿Š!KÙä´Ð¢9 뀅B3߉0)®†AôŒ˜¾ ÈÖŠ&÷zG:¿˜{R@ÛÍàÈ>Í=I ààÜÛ÷¼ï¯:á‚\è,?¼Ô].µÞÆUh?ƒ(áq¶~8oÏmQQÞµ0ЀߔlèføùoEàAR³‰pW`* •ìÙÖÈ´’TèËúnNhP˜A¹ÌK§2 1ô2±)­ØJ’õZ†g=ÐU¯RmÀ¶2Ä.<Œ5‰eD"qgæKf'Úõë+±rw¡´jR *û>¢ “-U®b€]:y1—Œa@ût!T€ÜØ¿ˆ¿‘rS$‚ÀÓðm)>6ö†íßíü÷Ó'O2BÁ…ÛzC(³Ï$Þø ïî­ãk¥…™í5ÓmÞ Ž{ ƒÿ}óé×ýù³¯xžÊdöï6Ÿzu‰P• v¹q~·Ýº1@X1ÆÚ.^Ù={S=ê™ÿ_¤*ÿf‘,˜þ?Øÿ­í»¤Ó²ѼTG˜«³ˆ‘ÞßÖ³S› ’¿;±¿ëÂ@Ì×(íl3Š7*8Yé’F¦RÈ3³h€’ÿ1Í’¢’Þ-¼YÌWËÐ\`±ÖÚ­wáÕJÅͱg¡PæŽ8A‡µÖXÉÒl·7¦Vʲ[UëõFµÞ¬zž§H)í+@†èk<0îojº7ÌwÛˆ ^>!$Ù8 ˆ3Aì ÊVEn Eë7³A/"È¥6‹µ9”ӥᶠnœ6“¹qм,»@ !ôÅ#-Û”-(NG_¶VàçúÙ:°Ä—îÂBOv€tÿ×ÏÀ›°ôíŠdéÞÖqý¾÷èv0oo²̺}Û4…ºÍ¼-‹ì¡3úæ+–ÜÓé ¿"iìls…*Ë-OÉóç±Ö¨‰oTMlذ¤£I­6© Tv½Ú9ÐQŽ-ª˜58 ·G_eŠ-¤JS|I ìÑù ªaP©K¤Æb\eAi°Ö•^DDªz®·+¦zhëJAUû`¾âùAA‡Z4@f)¬¤ìBYA² EÏtlV ŽP@BO»t'“aà2ªäé‘cçN=7Ø$€ÉÞ÷­ÏoÿA…D#îñà§Zïj´ÕW;L_?hf_<×R‚R„Àï +û·Ç˳Üý¿õ_:ñ¯ëß{Î¥Bó÷þaü½gn#–kòѤۓÆUµïó]zœ)}¨qÉ>x|Õ7_þ£¢cRµ±éßøÉò_WJÊÀú\ÒŠëh&±¾×¢5ŸÝ àõ¶å4»ýIÝG'+_[l¨FSb»açúÕeMD4õáIá*f<¤ò«ܲ×ñ Èá\hÈùk™“÷‡˜­ío¸8µbFŸC³Ê[¡˜ck,Ç£Þ(±å5¨+N«=שi"¥txŠ â¯ãzw½µPvgŒ“ÈÍ?W@&5q½*f,"‹hÝ2U¾ðÂéèãÑžE’θ‡KÕ¨‚Ì’«„¿iØpj­«„’¸þœ=(5™„c憱b…8no o^Z}L€¹÷¡>z/“}lj´úpûì‡7½owäÂxpy~éâÞÁ [¨n¤d@¹ÉöÀjÞbamsfi®Ù€i\ªh Q"‚ÌìJÇÖY$C q8è烼üÎÉ5Ì"ÀœDYÖJp¤‚Š {—o¢“‚Ò7”çÈIº Xúìãçÿeù9F"4CÚx{iwì£9ødµBÃí«IwÝþÑ‚Š”£“ÐÞ&²;]!ÎäâJ°ü¯ÉŸžå)/êù·Þn|û@Z‘Rââ™DŒMFÁæàTò9UR–cöúî±{íG±¿ùÄã—žóµUæ³÷ž{!ôÑŽg¯,ߟÑ꺠N3ù|âQ=ÚüðØ±–9©¹9b¯¦­µ;ñ¶>Zqüæ"6 r’á×PäK½;OÛ¥‘r£,oG°¼õ©x.H+TârÏ‹>À ÆØ¼úØÛN¬-ÑÕ@Õz}¾jEJ!)ÔAè)¡Í:v38ê¢k!˜fá‚<õÜ%±!Ĉ:ïY ÇN ýS–h^Ó2ÌpœÊM²šž2D³¢"W…¡ jT\ðÀË H¯b ú5 ŠSîÝê°oO…2ùôÁ¡l‚çIï¼w¾ñÓdõµI+âhÃî—kÛ ­ÝujˆWêÉõD㞈¯ruƒ;Rs)°›·`èÈóæQJ ¢¯+ºY!z˜Å‰Qš9Wkö€²-ßÕ‰¿ EèXNÎI®5™Ð00IšÎ7íî8*¯aF(ˆE^*›Š¸tWç¼ËÑPŸ™\Ú_5‘,`„»öµà´n=*·€3°"ùӈӖ΀žVùÖ—¦©ñäÓÔ],:·üÈÏ;Ofœü£÷Ú½^êŠEÄØÊç{íëˆÌÏE´Ñ•»­öÕ…ï¶s=0Ûì†,ÃN;Þú¯?LþuîÏV•ÂÑÞºxôÕU•tœP°`ØlÔ’•úï7µöᮟ\8˜l<ÞÖ2ù/w ÿôd6þìÞ_©¢¢ÂT i øµðôË£YX$ýìR“_n$l³O†Ï··…`k÷îÔa§Òß«§ö¨ïi™‰ËÈÅ­S(n¡rŸEö9•0»ý?°•ÂïÄV„Ù¼Ÿž«¢t%D¡£-÷yjª°µV¬°UÉ^”ÚbG€T©5[Ív»Vñ”RJû~¨†·`ùazÖ×C¦.w„ê_Ţ$hc¿…f/n(R30É-ý¥‹ 9Oú(ù,%'¡T‘æÀ" ›ƒY‘LEó(žÆ8Šu åMÐ PÇZPÊD·²£áëìg¹¡qø+ gV•Òú³Þ“_Nß:‚&í=\«ï‡ hEÆ#Pû«z¸Ë€^(PQ™¦{P*/ÑP÷dbÊè´™ÿ´_×ÕvSd“ÒÔ±b›ŒUðp÷`èüÕüd€Çtkž:$©AŠјõ‚cb¿ôÆr$4T«ÕŠ ô”Éü†ÿ ¤Cظ¸°}_KÖz²M&í}’ì‡íçÏÕ4¸ð¸aƒõ°M€ Ù¿ürîOîpðÏç ðÐÀ¿>xõéy€œ$âÂø¬ÙàFõÀægˆ0·ºöëþ‰;³á;ÿ=U >F²½¤¿lW…å[„™fgcR¦É b{o`zî4Xl]zâx5's1F_)lØ%h¸zÑbGMcÕK@¾³tì/ÉÍ—8ÅDç¯-†*l­˜äÖUOšg+þŒ¤ÎÍbs£: Î,æ$å½ía”; ÝŽF×êÍf½Ù®»€”§H+J®e‹áæþ0›î!EÏ=#[×ÈŠDzí.37<(Å<8«n˜‚?K¬¸+N¦›…)¨ÜQäDš‚1ùM­„bJ!g“KMPC†þ¤:l± ‰µ6Û¸»¶¸÷^çœ"ÁÉÇ£#“m¨¾öÇ¿:ÑþUÔùAÚñÍÚòÃK ™;\® ¶<7HüÞDòÄX§f-Y&âö·P'ð†]¼ Jw¤Ù®ˆ@ÜWI,ÈÂl“ĪáµîŠòááƒÖ\)î|@ä<½±Ì¥äá Qöø¸’;þº‹^˪uv( å«AXvZeT¸´x ‡|Þ|±pÐÜÅípg Ь`ú"ŒÆóÙzÆjeîàs…¾[1‰ך00( B°ŒÓ*X9ы՛y!̪9‹Æî'Û?0o?½&„ˆÃ({÷ÔWc éɧ•7nùó•ﮞƒ¿àíqkñ^ Œ•èÿøìàw~óõùïÔ%[éîú‡knñêì+‚Ö&ýÖ½É9ü²G:0è-¥ýÏñæ³Ë(øÑhOÿ jÒ4½ñë3ß­Ó%”LÉ6%§{Ú¸! ûá ÅÐ0*îýR½ÜQBN œ~ÅR—° 6^÷ªýÊQ­ PcYbî×Á"Bejp-…9©@¡‹c'PTã X#ÒŸEžŸ¯’&rVlD.‚¶¥\'ˆ°Xc Û ›½Þdæ7$òë­N«Ùò«µÀ¥ ‘Â[cy£v´ZÜÙ„årT*èËcƒC¬ì"C½ …ƒóeµHwQ Ê¥F¹ò.löR¢yÆá(0³'(Tª¤•'8Fšé&p6Ú¬ŒAÚÊ’O‰;¼ågÖÚìúÅÎâuNŸš³@táîó÷.ðSgÅ#P­gûìïƒ#ã¹G}ÆFFw¢ z±g…©IJÃ?SeÏ©òK£Ah¿#Õ `/Òb0ˆ5F{V®ê“Zgƒ/—o>J%ymFïàþPPAˆ˜AìØ¬ÔÌÞnf‚£Õj«æW$a,Ö°e#ƒH†”FMÊ=ŽVÞ¾u¢¶ùÑ(­°C^ =?Aˆ+l´ X·ä&vam¹Ö2ãïùóÆÄÈJbžäê2@á¸S®°ÁÒõÊùÉ"°ý7ÇŸù°÷zIFxïW áuBÀ§VÍ(¾6îîl9×BWÖ‹àn_í$K"2óÞ¸sö‰7v^ÆBèò»Kß[ ɱòEY8‹6&–ƒ@…̰ðzïèå…³>ŠýçÏxõIe9KÞùò‡gjKêýlÇÅ€e»ˆ¸3ü©—;cÇ¿|dˆ™ïŒ0¨¨E{ic$ǵ³LLCðfêŒ;E5"!()³£ùÜk.nj™?ØTš”µOɨN9ãj3`k- Ø4áñƒ½¡™ºU€TИï¶Û­Z½žÒžçy ÕÎZ¼g µ…eþ"Ò™eû’"Hmš{ÌXiyå31E\¦qÉ@(ɧßÈœQ>ç˜M]*e’Gï(PÊo„`œQmb›Hlûl ÞLmt³w¼}çÓÕ3J%ï$‡wÆØyYi­ÒŸœ\úÕ¨ñ‡u €`úw[WÇûug%ŽIA oÌ*ØeFO•IQâæäù¦“€¡ŠYv@ïsê…U/l×7Ç™"'ŠÑ“QýnÿXÀ1Þ<~/õjrf(NÍ’Q‡ÈˆJRÅ`Ãíð ìݪ[:6«u¿J‚=2)‹Œ8HR`ã,Å`½G‡ã({´q­~ ¿Øšš‹{(ªë©J€hZFP€·{®T¢çÄÓ|ZÍÖŽqLs ‘„|ò¤0­¢ä@HÇç.gEÂRŽlò{Nr[«|ôå«•¿â£BŠ2ï«çî Øö·šŒî\ ¿}{­¡•Ò$Àß×ûÆÑ²&RÀÿÞ·—ÿ%ý“ƒèi¢½>ýúÒS/Î!)…ª˜6°Ù®ÒÖZtqS¡,„øð£ƒêþ“«ÀÔÿ»¾ªþ/ÈØÉøwÿÍJÍD*‘ S¥J‘Xíô™ÅœV„-|v­F¯42eâ÷Õ«-…lao©j³Œ{;íˆ44Y¡ÒÏR ­\ \TMåÓëôåä4•®@[¦jq[lv?B€'+•Üw‘‡ª@f,³¼rsDfmb$ÛÛ&%È«6ççkóÀ*""­QÒuµ?šì¯„¨gDJH„L1Ç—3&îcWãÄ¥æ-ä¯¦@ ’' sá0ãBkB¥`¦í²Ö1ñÑC7™Q ‹0¹¿Î@žGF¹)Nm#­F¶‘ˆ¿0`Ftøum¼Ã/yb.ÞXzv•´O·Þíî[êÌ 8‰n´÷ï\l-´k›³=–Ê€÷)A™¤ Z¹àKœa£ä|@’òžQ9µè»€ÅóZY½[€xÛ‹{™cá×éõõÎúñ}:ãë*ëá#Rš ÞaÁw+¼X ÌÊÆ XзÕq/»Lpß¼¯½ ÊH;ÚŠˆ ‚A6Q®C± HÓò±ÛYÏløñ±ùþGã³Kššþ_› €¶»l]·I%§Ê>ØqšJǦC¤¶r ˆ‹”ÀÜL³Ò¹øEf“’°È±ÿ¥òú½ (eûþàýJçàÓOÖ0^î¾»øý9¥´ ¨ä+´/tÞŠ¢8[ªì¦hç«AW3+5B´ž™ pžÖÄ\8²Ä2‹³=CœfY‡yR—‹:6"çʼ. *â_œ´¨ W¾öë'þ¬ù< €— ¼‹·ÛøÚG›=»â‰í]’ãKçÎ7„”" »¦3¿5W ­exëïª?Ø}gõßµÀÓô³í ÿlµ^ä’ °owz;ƒì½û2àAô’÷–‚gøðÞÏ(=û£*‰I®ý˹ïU*H¹ŠÊ»R·–;Õ‰\$SŽˆ¹p±¦_«¥`ãOZ/Ö")`–«~§‰ß…`FÒXD©”ù|y©7ËèÉås%L„ÀrnÁ‚X\Ø6¿ð°úLÃ'EÎ9èD83Ûr7¸k 3‹I¬Ä·ã© õvw®Óí6[ÍЫ‡•Pm÷‚µÊÑ%G¼ç~I¨üU ¿´’éÛº†,ŽBRTØÉÝÄŸfœO8-þ 5aQb•Ž’>ý?hä犫N]é Ê'í¼3˜hÎ7?ð KâTØZ0ý¯íK߯½Š@Z.lwýħ÷¡B\ëiùW>þm‰À ¯woît*)¨ Üj+ªP&À$#~*qÈæLLSãX9Áó*ªÖE€6S“’ï 36²û·“ÎeÚ7f†c7¸ºìˆÍlí7D’³®+€Œ6EvzÞÞüM2«ã­F­†‚C#ck, Á$#ñA!!€b"8ßßÒ£Ù§ûÞ1iºûüw&¬²ˆ U« E^ ȾO§>Y÷_ÛOÈÈÉôÐä†FËŠ`fdŽ,ZÁ/¥srÔ¬hIØeIAP‡t’GèÌ }ÀÓ-]«Wî«4fZ!šŸ<ÜÝ©†ó\ìî&úÑ òº6ŽË€PDdÂ0% 0ùª'$^'¼ÜÐUOú’¥h­RÔH&6ðY@œ+Ÿ*‡ï«aë‘­‡ç½kwLÒ1Îö°‰£ˆxÆhNÕÀäùr¶°9¹¶ùîÕdoÔìd‘*UæPÝ"6’¥   "@U4yX„ËWXÙüɉãïÒó¤(âÍÏŽŸƒsàñŠŽ¶¿ÂãÙåå—[Šˆ÷êùMÝÔeNÏèo®?÷áÎë x$ã8ùøþë·H)GzA6CÓúšN²¹ö4ðr“°ÿÁJuóÜJ€Àÿæ5ÿx‰úÿ¹TÃB¶8Óåpp)‚9òÇWDDLvé’’ï5 %{¿ Ÿh)@ ²w°a–Åà^¯9ƒM¥8§~æŸišN½¦Ì´\ètÿ, ¤}ã%ÆyìÙ:g»Á~vó®â橦VèÄÃHîgÌ_£Â] ˆÌƘÌpœ˜4íp¹Ðv¿¤ß˜ëεææµj­Rñ}R¡Yç®\lû>9¯! ‰úQ®L,øÄÌjâ×Ù ˜±MB&Ýä({–>FÇ!š’‘qvG?ÝÓ¨T²¸7ÆÇ»r“Èó³G€`c¨Äq¥ ƒ8ÜuBe¹$/Ù¹q°µûþÜ"òþ Å À3ûDÚ}ïiü¥Ý÷² ÈìÝ]m À|Ð…Ã1+ ÀQ•ª|ëåPªЫâ$³×ÛiÑ‘$ˆ‚JüJÊQÆè< N{¸²ÎɱÖçðHúû˜y8Èhvl§ ‚Î2Sé›bØË0{æG´6“Ê@WM#`-Ð1Ncá¡ ¹VXN¼d6ó÷‘ß¾ô}|ë©e°š(BsÑžùlSÊS‡$‰oltŽ­o>yºJJ˜;x`, Kf¾÷6ŸX| ÿlÀ‡´gwÞ“oP¾ÃãÝÖftÌî§H"Á Ðö³ÝÓ·ב¯þÆ?ª[Ñú?ïû£FHD*ß{—z.f¡ÂšVί™D¬íÿ øÑœÑøËgæjŽìñWÁ¼8Þ¨IÜ9¢”*iöXDxÌhw¦5‚äS2+b”WDÐäŸ?a¶Ìfô x±UED8í4 \8:· °Í2k­$ã,õmþÑ-ƒîýæ|·Óév[ÕZ5ðýj¥BÓpn»½Î<Òù»)(_ÃäBeàõ‰­Q=Uû£àtí7z””ùÖ3ÔBúŸÿ¼‚0cV,N©ü™+¢ Šu* ž`gJ†ÐVˆv¯2²rºQ`vLÿvõ zÎ×-Ü¿ÐÈ&Ö6^©“Gðnúø'Wð•C–9º¨Üíš-C]`YldÓyDñ`êW@òê0a ‘i¤ “T ÑF`Ü1<‰Ä ˆ4j{½xÏëÜÑ©?ÕâI €¾¯sÖ°#°c}¬fÉ­RÔìzC`FD˜üýç>~øÝ€GÞ• GÛŸ ·žiH´÷qz¸ú‘ÿê²3úŠÜâÅ8n9ãž³d|ùÿU¯ŒÞYû³*e¢>ùÕê-h­H)bm¶dýðRf>ÙB9Q÷$}¯«îœ_U@½õ;•½úRŦvüù»¯<zŽ®!%ÔgÝ 2mÝÝüWÀ~üµö¾]aˆÇﭽ؅À,ö¢åšWccnAm/Øï9ºu±Rä©&¶œÙ—ÁP(Ó]$*'¶’"}Ë‘*ƒ°.l+»º¿Bˆä&åÙ:(CQÍ [c¬±ÌQ’%Cë¦ó\j³@U;ݹù¥…¹z¾R¨&}:¸I=¯Z <­Ý±èýù¼ÜÞ³‰Ú#Q{ÐÔkÀz%—™2ÍÑ.Š@õ„Rt-3,¤T™n ß-\J‹p:Pˆ*$QŠ 1)ú 7¢ÞópÂË åe¨lè@Ô 3³HO ’€@Å ´¬æÞÛ=g?ß–¸—dõ0f¡0$T2x-3HÇB} c5Á6ØA´§s¡ :B•ÖnqÏ9¹áÕ,²ÈÚqÓ\¶rù­—çÿéì#(JÌ$Ê~ÕûÖ+Z‰9õ¨`Ô¿Ý<ðà““g[„JôSÅa“‹›ƒ-óÿP{eýʹïxè“DcûÞî™Û‘²›mqíª>h²í«ÀË˾å/ï=v«ñt Uôß/{ø§'0ÆdôÓÍ?=:Û'–'Ÿëñ¤ì©%ת¸R  Ùùs™¥Ñ…­ÇkU&¸µ‡á¼,$™lN°¦Ê£ {Ò[üS. `€€ Rb, ÂÂÙÁE:" Ûl÷âà¹zÝXÝ–å³”êÚr%ÀÖäÄÔd¡ëôÊÚQÕW»Ý•µn»QõµV^´ ó{Ùþù¦¯tX =„^ó…D8 Ó€w-CuH’p.5,sr´9N…Á(SþZžŽTþ 0Í#Ã"ì$¿ ÅyÏÜ+塪 h2È"¨ö¸Vc ÷AoBpœÅ:c›éÝœÛ7y·ñ |v§3ŠÀV~T#øùÖ³¿ÖÏG@âÝí•“Œ^e²S‡¸Ž—Ìké´µŠ\˜SáD8ï`ÎãIÆ%çL„‘´Ös¦5ç`ò ‘&¤,h ûÛQ’ÉÚÖÆ¾6½ÛîMð4êb`’ øÊùù¤D† 2…0öî§»|ÒžA]ó€iÇŽ˜€1Œ¢IÊâkv„n¢Îòó?_X¿Ç† ÷­©ÔãYÏ’ð¤&Æèû’›ñèèˆB”«O$’±Y¥´Oª¢B ¢œs˜rºk­»ï™ÿ§°X˜®REÄü+<ÿëW²ðyï»Ë¡“¢l ªÝÞ>ÏçÜAk-gÿãí#O¿Õûîc@›žÙú¾s<$E@Àbí ×¼G+—cÀ£‚Ýßwk7ÏÖŒ–6þãþj^%0ÿ]ø §åWY—‰pÎ癯Ö- dÙ‡W‚à[uëe£÷<Þ@¥ÈZá‹ ZñBf³ñnsd÷wµFÐ0¼ùŸ¹Ù¹âPØù±\À" ©‚ÔPÿ„ÙZ›}1&{j5DªôHŽkËëgdv"5›¦‰Iâ8µjM /ô :«Öò¾î\³ø¾–mÑõÑÊb»V´„ÚWZß_áÍ-ŒªÛ†¬58ÄJ_RÐm‹`ű-¨Ø¤äikE½ÓUh!è+„X€qÉÖ¥&åÂ,»¯)e©¢ Auf¢ !òç,ÒæNýÈ‚åŽWÚ½fûïnŸï22&ov¢‰ {ùæN­þ÷dîuðìÝnçnOéÑ|[ìÞÜ ôƲb*šPœ¸Šäú-„U’«µóQ‹0hÕ1õ* ÂN:J‡’di¥¶;ʬ±Ëé¥î~+Þý õ@Ô K°û Mw'¨P)àD%äQ2JGãCu¹ÃUEò„ Ÿw(ŠAk߇«×S9>¼q¾úÕMa¶Y´—y‹Ñ@WE„Ì(Ôœ˜">wð€(,Tš (ÑHÅóAˆÔ䚀(` "ˆ"ýK„‘‡/ä㙥©0À~áèϺ/2"bœøŸïžßý”HGÍWt:|xÏ?¾]ÿaG¡”ÁCZÞm>¸°<ù·=ökù‹K!sÞ»ÔýÞš+FÌ8Ì­Pvcƒ@puãìÂ'¯Ñ“mÐà×kåôÆH|ã_Î}·â‹ÎƒiâKŠš• “³«†Š™5ÇÿøÜ1c²­Ïw_[ X¬67:²TÉ’ñMDÝe­(Î×+3ôÑÅßäue>ö~»päÃ!²y‚#ùj²ÔÞº~îñ¦ÌÖéÀ®Zpj@æ 6ÿŸ{/Ô>Yü‹:(‰&{þowΟkS$!b³uOîtº‰\C˜[šGü®ºvë‘c }÷×Ú|ÿ%Ÿm6~ÿã¬užJij·U±ÜÌC\J3ÛË_éêw‚ÄKþ~ÿ¾–  öò„«Z°ÙänVïÕŽ)…lU^"¡Ûe—Îr¡àŽ{Uì ‘…Ñá´lûΉ­ˆµˆïò‹df”07á¦`î6a6rño‚gï_9ÿº‚PEãáàÍ쇫BJ! Ûݨq=<Æh®F,¯U•½ôõ‰‡ôtÝShdôWCïÏNªŒãÁ¿öþú Cì8~FÉóöJDþ+XAaý쇄1þ*ýA# "ay°NÔáýIJ=j äp… …ç|À©U²œ²ÈÔ $¤À·™(…ÈeP#–„=aË6½ò€dáP5 ‚+Rà˜gŒ%ŒMfµi’’IÉ¥(<”WmÌ-­®,Í·kµÊ@ê·æÛµZà{~Á±oÝ­eÊ ”GÖdIl«Ò! -2ä*¥)g3Íf³…Ë( „"qg¢Ñr¹#Ì©¶UÎQ$Ò¾ã!&ÆôÇ¦Ž“°å1ìnuz诸FXhrïHóÖõC'„²_ÖhS á×» ˆ7/>¿ûœ Qó|`@ÂÊí ìíè1 Å^ Áºšþ"ä«H@BÕ;bk‹}®‚òTêm_G¤@ Uç¢AšÆW[“ë« u{µ?¦£ªLLÆœ@yº‹°' 6 !%‰Ò$íóŽ x((B}Ì{ž§¶VhS ,! (ÄÎò­X‹.?¢¾îIf-Ûl4áZ8±…å]"Ö˜ªtX¤s®Õ`.áÒˆÖÙ¥_Çq Èu’\ú€Ž—^nEÉ¿ €d!‡ÃË=ƒ øáåïêwž^E 0‘¼×xô³{Š<[ÿ¶?ê]ŠOÜûìÀ …(öaÖLL¨µ;n„¬áì7otÏ}Ú{õ¸Òe»æòGKßY ¹Ù…5“­î`p$}0`¯±ÒU0þm­{ëäá@PY»ù7{´üçmL1Úú‡µ?hÖ¸à™ÎÞ¨¯/·¥­Œ°±Ÿ_Rõ©Þ»pêhâ°ÁèA'[óØîÞ¯Ùôp[)ȳ€]n»nizŹ·\fÉá$`VŒË€…€­S#1‹Ýz‡„ž« IXBS€öó¹[“eYǦ$FɲÌ0Oå¸ÚköÂÂBg¾´ÆÁ|³Õ©TB¥tPû“e B¿; š€mlÆaU²‰͹pÂY‡Ïì­_ÀbgŠ)}à¬Ôùä^©#f‚ˆ@^#÷ªB$Éx4ÑÒ‡yÌðÎjô‘€r''óðrc-{+xZ‰B¸soq=½³ò’¯@̯š§ûÀû^HNš±ÔÅ[»{ÝÝZȺ9’RQË–&·pQ^œ`6‘bJ\ðÉ 0lW·|ŽSbYup<¶ ßÿJë £ÞÕ¶èX¨s»¨LÈ ªDÐÆ¬ ŽM2ŒÌà`'ˆ³üVÖ}F”@Šœf¹M™ð¨ÝÆpå®w,z?5VXØN&V/ÅI1™§ú©,Ë%‡K LN` dILmHh†žçô€DèÚ»\Aìö]\¿x&$&ïE¬°0ÿóÂKŸ ¾ã!(ÉÒàúú9y/#ÒæøIL‡×•Ƈ»Ï¨!ôÆ~=›sß|\.’ÿzéø‘Â?Yí'“}xï±§æœ)€9[oðƒ} æÁõQ‚ÐÒ«áúÅS›Ùs­@ ^þ ýA©í_ýÕ³ÏWkˆZåöW)3n$Èú¸È«kMÿMLŸ8f¬íÿ>~®á3°¹Èܬ6*`³[ž?jí'­¤°R»-P©—áà˜g‚ŸYdÄ’¤'X¬áô“ÙcË>z<”ëe¸œ.ÎXm˜M–²MÓxÂh´Q”Ù6‰FÇÂOÎ=øŠ˜™m¥²E…ä‚vU(è’|²1}L¥9»|~¥ž¿~Œ}i~”\™÷Þj¾\W€j0„ùÁZNABaóð?õŸàŽÿ@ƒÖ¦¿“þ.~}ÍÁ=DØl£ºV;l`r$­öÒKöž¸zòTM+Bž¼ùáwžVF²ñ»WÿèpèSžÎYZU\ó¿+E3Èîcíï¯yÍ—«ã7άgrg@•-@fnÙÚž:éiÎ-XÐ¥±d]!ºxƒX†ˆ (k‹ˆf(¬6î¤u´Ïtû3mõË­ Q¹œŠbYˆ²J-® 5Ƙ$ê3rã4c˜‰ RAXovº‹]?–¹½VÓ­F-u啺$±VÕÔï4;ÌLC¿)v”X©5¥Péç£(Ã}ò„s)Òu§iæøÇ Á]Ù9%€LkœºäÑåݨ0 £’‚AÒjÚ,½™uv°³ÂG-Âd÷úÜBünói@ülÔ¼&ªr©û¡öàMýÈ»7‚—ÖðØüÅ{ì_Öäª ·FmQ•Ÿë<³“òTB¢šØŒm‘“W8µ±¹À¸¯&§êU™ßô2ÚŸÄ» ;'}+öÆ›èÂÐY¸iò©YR`)«€-s¶ç?Ä!$$˜Ä6òF“Œg1’OÌHDÕ£›<2º}†¾ØsÚË“qj›Ù¨€PðŽÖØ70EÍ„þ¢-–m:”xΤ‘ (/Ô$† ÍÔX—åÖ­M!7Áå@›âݖ܈Ù/ÌK7nþÐTböäÂ…'çÞ‰H©½Õç`·µþXýÚ¥ÇÏU‘TÔƒîp®âåFW×V•ÿž½u÷ŧ}L{ëÎÿ°«9‹¶º÷ÒGàîðêG ÛŸgϵ”°ìýëºö—‡ÐàxçÇú¯›¡Î1¦0ãp :)K4)wÖŽÞ ~f5µöáojO·* vpT5ÝŸ ô·æ#{¸ª5 Í Äg¥î) p-f¾¾Ïx7Y¥ü&ËÌÌÂãw':;»V!Ê'1WŸ2[púo¶&1ÖšÈ*HвVéx%†‹ü÷̨ R©5º]_´Ÿ‹Zv§Ýjœ~Rd3É,í5›µ1Û †þœ²»Š1¬ ŠË:(ÀE7RÔ8Åp°È.ÅòS!lÁ!Ô‹©œ.S¸Üdƒó¼{•*:ÄjšX#ãqŽwõpº³±º•ã9½„qt{¿KŸ¨"=øìÐ1vî®? pð‹—*¿–}¯…ÏñÆýÀd!C×߈–ÖÄ[ÞJÄ+z×bÄÁyÆ:éPÒ AL9ÍD¥ý ˜k n3"¥ˆÙkÀîØ°ö1žlÖÍíýót·½éƒ9ÌÄ Ô‹±¶žhæt “øÀ‚—ÈDgm†¨½-ÃÄ©I„ȱ»´#ÕƒåTüEJ`ELÜK¸­'6•ã‘d½ ç‘nî/Øt,…½”A8`T3d¯jEP;â<ç%g„X*†5ˆyË[¸JY½8åøÆ;ÏîûåêT21ü¦~üÆç$ôή¥ÑÍÑ~Uýxôê’g1Û–©Då~‚5æ7¿^yú£èŽ‚RœŒ³·Ÿ|²†…d0¾ßöýt„Ò ç’w’“_8¡0Þÿ1øãyHaøà_þa-Që /S …€‹Ë‹rØž[“e\ÇÆk^J“Ë7Ÿ™«2@z  a'“*$«« 8Kp›„¼Z7å¾.¿Ü@Ö=Ô¶¨ò$0÷d–øÞuµ£ ¥ \ÄÌlÖxÅ).êÙ°5™1Öfˆ)àx¥Ij9íÍ#É”ï~#ô…êËË­f»Uë¾Ø´ƒ‚`' +¡OÂle¢æ”<” 躨<ÏÇ À@€ÊQRé4“)낦G/€H™Ó*’'[”My–)ªy×’ÙÔr–Nt°‹ÍqŒñF÷ŽÓ!y…µ;{po­µþå¡`ìïÛê2'~ü°¦å“ûÏ]½ê=uúñ»ã¨›h³n׳Û݉‹™Ï†DRU¨@Q‘cŒ¥>DX †qBœ×‹ùr@yuÔª" ë2«I«æÍhƒ8‹Æ^åóÆ +t³çoÐñF®ß• ™7ÔÊiÀ¦ÈÆÛz§9‡œg8åU†Ì™™ BF!\ 6'ûË*ýkb‘­@2L¹Ò Ñy €Å£.TžuÅ ¤AäWìEtÓó‹è7¶e·P¤šƒ34QÉNÇRLÇ…ZB€ÒïþáÆ§?¬i4“Êý/[»¶§qnȯ׆ý«•£aï³µ§ëtßVMXó‹&YÜ#d8ú›'VßîþIE´JFÇO~xÂwÀ6kx(xwuÑÂîZ¥¶/X Œ¹ÿÁ>³óüЧ=d›^þ±àKß©ÚÌì]øÕžñ*ŽmšŸ¹ôYˆÍ="6D;øe Ÿ;Š(É{Wê ‘Ù\™H³Rmg6»•Aã¨ò‰IMS@󛬑ã”T†g &Ù(—؆€ìÆ y4Cï}|¡¨,lóÃxÚ?;’™H’eé$•l `%ÞK“þ 1©™ éD¥µë+±²¸ÔY™[]:J$ÖBW«•jPÀr»@ƒ,oNÑÔ„@yâ:Ô%³%Õ458ÿŸˆ¥(ç"ìüõ¢™LU÷T($oNççU YÆŽ¸¾kꈷ4ïÈ¡9!–d¸î¯doW_¤K÷}É#ý«O<.ŠÔè·G~/üoÁ½¸­ú]u›ºKp»ÖpvÍ9xˆ"5¿ •BAýÏ]!¨tM&†Áæ37RÁ¼ßš0Ù¥”' Ö dáÜ`'1ø£,—.ã Å*»wø t9g`–6­Âeƒˆ=°“-›í`+اÝ×h#ÌŒHj0NY“EHÚ)fí‰È˜}vý´ýj¬a b’ÌP-Í/m£/,8`—!—_N4:“è("ÀÙ z v’"`K<…ˆÊ‘‘°¿“ôn<Ànôœ#*g 1NѦû?9vôÚÓ¨í(Ÿ&Ïßú…Ú÷>7ܹ²ûØRõãÝV« ;i˜è€È¥’ £eÆÁÿ«~ríäwb°1·a<¥œÂ¥ `Ìe‚X©@”Ò¹‚$ééfИӰ%é( Ø6–þÎÀ"úAO¢ñÊøá± Ý<¸ajûAò4 ®àr! `"$H‹– ÆvÑS)A…DýÔh0b  Ï<´æØnv ý¤Ô®;šdØ0yÒ¡Œ¤Æ¬ e¶Žy‡0û¡§I›(á › Ú.~‰H9·Èˆ-3ìx:G,nëœ{,ÀnÆÀ"Þ¾ü£äÂË-ÐvO¾õÈògIÂJÿéµxt³¶?п _Y `”x>Ö°ävå7%~ýßü—>Ûyù4“‰}gçØùN޽µñp~'9€ìnì­èå:àýß,ëÍgW=­ÅŽÿþÛ}ñxïÇÉ_5}åþv©iÙ8[™q°‹³÷se_ífÂ;ï¯<^GÀÑe„…Ѳf3xМÈ&)òç[`&$3·Ç—¸l)†ìÚ_¶ÈÀ€BSÐ.æ¡ ÆØlô¡õ|Ë#,ðçåÖ«)߈ÙZ¶Y:NÈNcò¶ïí!Fƒ8M¬7•$j¯¬\;¹b%Óa£©—–çëMa+ã´ª Žƹ™\(ÐÌXpcÊÈ)GÍepaÈm…¤¾Ì”€Âi¥‰JQ5Wãs"©eN†iè Ô|šyÑýå Îøè& "’ ®Ï/L>è>-(«¹«Â§×¿8ù èô7û÷³Á`í ¥Çë×q¥²Û›G  VvRDòMAÇ%¥€´‡Q‘ŽŽ‰¨+ĵŠÈLÆIˆ56“'™UMR÷=º¼´Â‚—½‘w˛ͭsò•#‘°Œ­„[–hDºR"€ž  o Æ,‚YÆ â U—Xï\Zêl\v{wÎìdh¹É6o©"¥DÈŽ”cüUÊ'Êå5(l“(³36R 8«|éÙÈÊn‹ÈnYS¦žÌR•Ý…'b%þ§}¾í½„HD™Õ_$ßzð!ˆjõô‹ÞðæðPà]ûòÜ#Õ¨:wUnΕXÙXóæïOÖúá"‘g&£½·Ô·„B$6Ù Óõã Ë››•—¼PæÃ»g®‡Ï5QˆØ[;ÂýÑT÷îýâôƒ*)¢BT/ÿgB-…<ƒdïßU /x©\Ý}½Zfk?jâ\3ãìn 'óG•¦’€WìW%÷R–‘ð®Kb<„’2!af,…EÃ,y?ÝÓ|l¡E¸A~ˆÈ9¶šY˜í$"›H1H×oï¥Ñ`4IS—(/Ó|')œ9~s~aß*1£ÖT­»¸¸¸¼FÂV²8nTÁô@xÉË¿\ÁÌ©œCÌð¦©èÍ2XÉ%jÎj†JTÂL„¸€Ra-çdc­e”h=žóͧ‹Ã i(*PB2¼MÇ‚¢Çë€[_ÙxˆóÇÞL^[`Dï믞ßÞÊü¹ºÂC}]–ìºBA°–Q´so;öM1$ –PÃò±–K^ôƒ‡ÝP¢m–H”b+¸íM¼ê82’îpó+}Hî'­{rÌWSì9O{i>’`jbÁš~eBM-ˆ(¾J•Öµ“±f0@>z ûiw´&÷Žê{,–I¬‰ÀÔkÅqŸ¡&æè¿Ô$9²ÎIvò&ÀŽ'ÖÔí8F€SŽŠ™¦¶¶ï\BP,3€‹w2ÏVv‚afà/>yûò#¡âßüìŽæJ°yüd2ºÚ>IÞçÑË‹a²•lQ³¸a0[¶–'ÿíæ©ÚǾ]%¢hh¿üøÈ‹‚pºi‚õCb†wç6Eoìk0Œ~]k?8{ÀC"±ÿøÙo{"ªá£ï=é{Êq J‘ZiC+8…¹%ão#{Ñ*sÿÓµ#U‹ÂxsA[: d7ìüN刯LݱÎv5í+]|DË"Ä P™¨ÁˆEJ=pŽ^·ßÿš õXµ¢œ£´”I?9–(–™LÐ&©—R £í[»6GQ’d†sÁOk, ¥+õ¶b/ÃÚBw®;×]$f¶VEAS¸G ]=Õ"–žJ,¼‚zyî÷Ô‰X¸‚DD¨´_+±Â>9µá"BÅwQ$b,ƒ(4“±´Fñ|Ã~欬Žû÷—kׯ9eQ$ýÍøÕ3·?=ö"AúËåZèä÷ôòÀÌßèczO@p¼ Ð (º–ׂ,3YOúY>ñ.š9/hHcÎg”ímª\”jÛÃTt ÆÆ;Îæng§5©äþ;¸ÐÉ×£eƃˆ"D0ä¤%”5* xšXkòkÉ™R+0 …AND=<¾7<`?É#?m6JÀk讣H`œÀÜiw]Æ2“É"ˆb0É0jV`,(ÕÑmoËÓ¾¸ArÃon~,toÅ• O€ŠÅô+/}˜¼¢ ’þjë5þÐ,öìKõ½›{v¼Þ—KOÎÓ¦í)BÇÉsNaÁÿQNo<|áQ5F»æ½‡/Ÿnº¼ ì6×á¨(¾l‚Ìñ÷ Ãk§6Âo5*ÃÉ?®ý?ŒL–î¼±ñ׫&RÊIš(×UÏ",¡ôˆµoo¾ç…eøþÞëõXdø¥¢s²l«×êÑñ:ùä8ÿe›·WpÀ÷ï8±3 òEp¦~.ž°nÄÇ–AöÞ2ÏTMä\®Ù@®bÂÇÖ‚µ4i¬cð«v¼»Ñ³&ã$5 Jq¦/¶Þ„¨tPm-,Ìuææ»,Ìi/¬¢ÙÃUßM9Ýâ1ÿ X ƒ¤ò°+2‡yš´'à°îyçœ#E%o²t: ‚®ʽ"±5VL6ŠÂd·¶Šz[ó›X9ì‚Ó]å;¸6·/ýuåi…šðëᑯ†xhÿ?e¯­e¤¼O^Zî.}uÈ»<94¹ÇÂí @ªý…ÎI7uðb Jvœ[ Õ•çùA³!ô$33Ã0gvÆ,TÁ(³d³ñüÞƒÃ5@øª³!õ£¨TÕ+Y)@ÄB‚™Ö¢QŒ Ø”€ß=O _y=aaŠ@­ŽìÆzq½¶°sÅ!"¬Ã’ïZÚ½!6¢’0‘¦3GPað"€&’IµbúVQå‘–T  Ýv®|”p÷)Þ¦n¸™¡îµ·žŸÿéÙC¨4ɘ“÷÷Ÿ¸¸®Aí»Ùz:êݪD¾øðÉ¥JjÜ1ÎfZNIA ×ÿ8wò3úÑ*•†Ñï²u¥XìVcwïL`ávš¤ÈŒÃFGlïgþþ›'O†ˆ ÙÒøoïCã¯×²”âÝ®ÿ»šç@àÚH7Ž&w”á ÛÀZÙ|—ðõ¹‰J¶?}ì@=ìs …p±nÌä^ â• pË‹2aƒÀygKçW”- _˜½ AéÜ“‰åuÎÂÀœ»’3I¯ß ^x¤Ng8:Ssyý»f€ ¦ÙHew®>Œ‡Ãñ$IScyFú0}‹rºÒ~Øh·ÛÍV³AÈV¬ôý9ždÖí´ZrÑ)@W¦ZW$S>Ë $èŒOºÔSáÁ*¼ÀÊ¡‰¼šïf˜¤6³™ˆîÐ-œ^8øÐÐIEZÆèáæh-üýè\A(ùõ™«>3úåò+žïizh0IžÞ}g}yÕ ëŒÆÀû#ƒªQÜ÷9ß ÏïTDXAÉ€¦î@Ò^Û ºuȶ|0²ˆðÚý^”‘Ä&a1“­–wq~%Cõqg8¤G5»;Í5Öʉ1e ]Ø£åÔ%r˜fà1“àZ„S@O ªìQX»½¤îî10p iÆ µ|Oci4F¶¹oöM/vùn%vÈqÐ-¶È¥w p>s_† ˆùTÔUuîBÉ'…2¥ìæÂIaä_â·¯ÝA²¡½>üHªáúã‡zëýG+AïÃæóÕíLQ u®Éû$¶¿øèh÷ƒÕï¨Å†W/üQÝ%ÈžÒ‹s‚½^{‡lƒÞQmÓÛŸí§/¬¸LÁ”¯ÿ±Gþ² 1õîüôÑï„ äòLwíré,¸{yÇ¿ÞÅÕ§ˆ©ÿ>=íû"nƶZ W ñmÛì·Ö4iaÊ7£Ž‹à àTÎÁAÁO-XáLQ ÅÊ#Éë++leü ¿Tñ”Ëö-ÀÔ3ãÊâ!²€ˆ–íÀF41ÌÉxóÆíÝÁp4N’$³2;àü´Ï=‚Z+Ï÷}"!±±`‡ù¡JÑ[TRf¡{ÑJªêLªZÉ@É%#3 í)‚É™‰±ˆ$-ÌÒ9“‘‘;~Ó2¢”•±Ö¦QP»“¬(e¿\œD|ªV¨«­\î¶'ï´ž0`.‡>ylå/G%ª›õ»â¿8óÖ XÜØ 7H™Û;$ÍÌŠž'D*Œ[S¨EfDjˆ‰±2ƒEò;i£åâÎ ‹@@F^k<Ì*þ á,Ù3[Õc °Ô6á@UÙ-å0d! 1J£ñ°/ñòBK¤†¦…ØV{©(+"Y¨ ífŸ÷ñÍ£üIÞ݃c³¡(ß…ø€pV‘”&™ å* †Ò’É¥^X@R“MÔ@7²(C± äaöÂìVÏ.FP@MßèÌ ~±¨À…ã ;Ç- ˆá[?}jù×' kÅ >üÙþ—¾þ̳°°\¯½ ½[ŸŸ>+±²~ÕE’—_l- g†÷þÓÖã“k/<£E¥é^òûíž©;õË ó®5ö ÊåVý=¬5V'¿»uðtC‘"Nßû…²/~/°©ÝþäÃ?=h¥ÜA_âõKtmÉäœRÃëï½ÞIp²õñËk­ÞÐÒUkÖd·¢æ6®h…Hù§ºÐ´ç”¦Ø|@î†@ì±(ËùÛQ sÔŒ`ÃŠØøËuÅGÕP)À"0g+pi×·¤c3ôP”7¶’ñýÛÙdoÐ%ij¹ŸI9­œ~Ê¥€$ Æàž,hs‚j sÅJa›)‡û2M;È­3gJþ'à]4”á2XžD¤0¨ä…˜MLÅf‰îͯHLÛcÚÖÍÃä˜5 ,føêßÁóMˆ_œ¼õ瞈1ÿÝPˆ:ºs×Òùr´3\Ênª}m´jc{mÃ`}.F™÷]ù¹"ÃÝõŠ©Å6á<ÐȽO* j~»‰ˆ°˜QXš´7N}•™Œìhܾ•œPÙåîmY®añ"”+SDadĔРؑ¸1CfÀ ‚_‹€cÒÖf̱ˆ"@ŽžYÝÃý{×Q8Ï´! N&™£bvÓæqáO+ÇåOP­ŒLŒmŽSDjúž£~YÉ1me<:pfaóžA…Ii-¢ "ÈüËû/ß¾ö]ˆl<¢ןª½="¬.=˜;7¹;ØW³ñåäéöˆ|¥•Pà´#’”íÆßñÓׇ°¬ü 5ÃÝÔ+‹F°&wš³ ²KÁ6(¸Þ#••eû·K°÷âB¨Q#ˆdÿpAÁ?î[´ÛoìüûÅP9›SޝÂ2Ηð›ªáäŸÇpì¼Iqçm|¾¢S4Ñ„ fÉ'½õ&˜c-ÑD ÀŒe$®©‰¥$‘@‘)$bMŒnö„n†Eqž«i-g»ŸÒ™JH®‰›âAafÔžo®-‹å 9€ž¨À¤1®^™ð¸?ÇibLy¼Éÿ9¦?+[chu4MFF¤“Ëœ#JÜ`ÎP’W6åÿÃ47RŠÜô\bY¶"e4i9‘bDÐaS¹Ž,±œŠxJÈŒ£š¹ÀLí¬ï€ÞQÐäÊ+žlÞ_»séàðH'Ÿ¬}JüTë÷מ9i•œöwº‡ATt×ô¯·º7mç‹ß»2gû ç"€¹”ó.çñ˜G"Õ1Mœ5s½Ô3®)"ö²#KšÀ²…ùÉNdAWÒ,"´“íÎøÖ¡ª!úbiôc"å¶©z‘T‘UF.m#Èïdl°  Bì±(Î fžTrØl¤Ë‹•ë.ÀÄ],Ìé(sͨ€x(¤"+¥N áh¹¹¥É"62‰,à$C޲ óñU~‚n.h“Ž–K=Ç´ÅT¹EÕðÇOœúÍÁ3‚<Öã¹ó©oín?ÙÞ¹Ò<]µƒ;‹FúÕ<_CQa3@f`óö»Ý×Z’¦8¶®?ßðP‹¤wëã‡ÇµÀ&é˜ÃßoÓÂjg ìø½‡Gïv_ª ’ðýŸ¶¡ñWs(mÿsã/+UE¨(_øæ+z’²Ár°&’ÉÖ›Z·f•½ûÕS­º€ðå ƒJs‘mzÓ׃ùT>¢‚™a9Û+‚GŠªÍ¤Z¬0Q!§¼¬.–éèÔ[–£ú _qæû”CÙ™°pwHs†dÆè ЋG‰M%í­ß¼?èúýQ”d¶¸¯ÐmJˆ.Üù¹ñÏŠ±YV%Nv Ã<•Z8džc˜ñ:ü棘íbÁû)…´PÈP§Ý¿¸ÄJåN UeØ ±a±éDWndÇëÉõÕ; †$åÓÊý{µnö^ã)@ù":þu—Ï™7½o7D=;º0>x«A&·yåÖÀ_þçï ´Ap®K4k Ï“´Àdùö$—kÕ¥FÛ€Q_ÙQĤÀ^s{Þ85" Æî6ü›Ý}êÞ¾aDGÉ5ƒîÀ£òeCÄÄ#V`’|ü ÀSa¬ù*ðaBf€íŸxsáõ“ri’£8œ^™ÓqÂEì=kŸ1v:0ž.¼Ë-å[]Ž8±&i‘1 ܨÊg"  È!Óe6TÄmû‹‹ÓыޟEØm]tÕïï~gûÒ÷:@Z%™úbûEýöÀCš[o>žÝ=º¬G—Ⳛ®)VŠrn†cÆ 3`ô_·Žª›çž'¢4M~}{¡!ŠÄî)ÿîÜCt§¶ -õ™ñWVæ-o¿Qo>xâ´¯ ãí¿Iá🷲”önüìÙ×”TºØËë\ØPÖÆ(Ö²ùÝOžeÀñ— OÔÀˆÜÚBÕð÷!á iô½Gë>!jš)°Ê µ\w“sI !iëòŠŒM(¥èeº.³0ëêgB_9ÔPîf’oDNA;™èlzˆ56&M,ÃpýúÆ`<ìFã(µ<ë=Dœ ÷žrŸÅdIR¯ŽŒå¹Ðõ&ùÌt6Z¥ ¬OóæJI "ý.¾ŠP€éÎhF(„DŠvê¬Fak-Û~Ôº?Zk‹ÈוAÌ].»ÛÄÙrøéð©–ÀðËGzw_ºðÅùÇÕÒÁ»wï⃄õ ¡ÝÙ[®Ü$‘°woyÛ`µ*¬(§‡ò˜³HDГP¹iAD¥Â–?ß&DÜÉ`bH¬E•I‡úc‹zIælr<äÎ×ê0²Úžè:à¹Y.yÃè:äÌq¬×Jp¨ ²$°µŽõBŽ X+ Q pµÛ÷¢‡³–ó¡°61çûFa  D0M”.³Üf™‚,€ 9j…ñP|¿ôž –©™³Ã£¢gv!j‹¸¾Cf†el³ÿJ0‘þ§÷_©V˜íäKPl ²tw«3ÌŽÖŠÕ(°“åóœyïv ìüà(à[,,ÚYƒ|¡f›ÚdòûTäÉN¨U®üƪÊïí°"G¶ºƒ!§I”ĆdôàæÝíѨ?ŽÇqj,áˆÓpîéó_¼bÆãz íY©…âÞÅ)õ &Q‘UÌ…ÔÈ)ͱ †b©Wp±¥lˆÔ "H¤I×Â|–’gØŠH´›´¢ú‚}ÃÌ­ã\7_á @Ò¿³ÖÚþdå )@ón§ú9óÚÉà§Þë§Ô½¡Ç:¢9b¢{ÕÅ;‚¥¶|Ýä* HKŠ iL¡qvE´ M1ïã\ÑäÕÈk7XוM­šI?Ê2?´£ÌÉò’IîÎ𠯵õ)oŠ ‹(°Æ€BåWI!"JšeF@wCÏ‹'B˜°°±è¡Ì··q­_iî]sxÕ2“E²têðaP0ÂbÎÍ’ÇzˆƒæœR !6“pTÒ±èU™e“‹—ÊS~ rœaUŠ(»½øøºÚ-}rñ~ïÕ(…Yä_Ùx¾ñö–²¯?~Ú¿Õ?]ñùΔªyTÊ\¨˜Å¸‹Â¾÷»Ö±«Í?j’OqÄŸ_}î|M8ÝëìLN"ÈÍj,°¼óãñù梇ãßÐþÇ΄ˆ`­ô|M©?<¢ŒØ½_ ÿjÁW9Èp扚á 8±ÑJü‹ Ÿ=fA­=Xb¸d¥‹Í áV'Ë«¤58Y Ù ™¸<Á"Ž©@‚ *Kb‘Ëärž Êdqí2˜+7”¬¯i"3Aò`&‹§‹8 VEŒ!à,³&ÍØ;Þ¼³¥Ã½ÁpgÆÊ7œ; µdx2dé Þ$»© ¶š¨ÝÂJÙ,‹MÄ|Ä93Uââ%ÇÁ’œ;®€$W=»hv)†pˆæÃɲ8ËP(0{»ZÝõöÆÉ£7°²ßÇÚø†ðÞ2Ïh! «[OÞêaãxçÞÇG^|b8Æ¥kðnRýn}tË,úˆ( •«YëûU†yÏYêWPˆ€-’#Rd:ˆx~;«wBȶT 3 ‡õá0Î$¬3ã>AÙd§5ܳ¿‚HHVlöË_“ýÖsžX»÷Î…¿>¤ò£;¡0”ŸU0’«2þôK]ýŽ›ágðZ„íÇ Íl_‡$ºßs`Ñó½6˜/»Åuµ¹û¿¬·˜… X)+€ªdiåM(–Óqp@LvGà?ÙôaQà,P…òù«/KR/eßç,&™5YjÓ ²ÞË›{£þ^o4Žãe[>ò`—š bemÃcc—Šì·B3“drS>Ñ/²b$_ˆX™ZÆJk´S^ á4oÛ‘å‘‚Šr_”ZËH†q2Þ©Á­àƒ¬W@k?)RLÖJ2¬Òo“³5 ,»WNÝ\§J§Ù¼ÙÄî»tœ6N ß–cçíd¹N 7ÓÞÉ;LèRž*“?Š%. „Œ¬ÌÒãUÝVÚUAIwm¨@ÀkŽÆã„}56&7jR6‰ê·Ó£­·ïÀÁ†¢\ž§±º¤>ÒŒc°*ô=Ï!L&™ÎyýÔ cD,“"Aoe”®LüöæC¶EEnm"k5« í9!‹«C¥p!Ö@DÁñئ‹:5ЬZ*Ô `Ëø'.:,:ç<@ów .`ù¡Q·~ùBóÍ»Œˆi‚÷6ÎT®¬#ÚZ{ãÀòÃá㫜ôR¤ QlŒË£X¬e›ýýÕ%ÿú#ß l¥ÉÖ{áksKö°Ö[¦]áN?¹‰ó'iØ|ôÕ©ÞKó¤ 9“蟮*õ—Ç!5¼óÏÃS¯hÌsÜ/a§æ`D!78±ÿðÙƒ©†{_=Þ©0Ëå±Ýú"Øè Õ†õc@ryHb™îsáU‘¬ ˆŠ€DЙ§,—´å¶àîek$ý²§ìùÕ€òã¿éª!vC@D?õDGs¶cÍý£m€»IÏÊŠÏÞLÔÉŹèg¸¶~ö|‘\ºöÿÏ..þû`Ž·²ògEDŒE˜/•‘¡å<0G병//a÷•ààC|©Öî^׺™I£äÞdnWŸª©rªZÌ?Ý‹M¥ (% Q¬BB)óâ J“_¡”cpQËɃ´N×¼"Ö,‡Ì6X€_Å U”鈳4žÄ™1l²,?¸u}}gw·?Œæ©zJÀŸ `Np+›¯JºÃ,KŠM÷?…üGr<– ÀYÞ`¾B#œ†Fä[ü·fvS\ê!H×BA8å4ךÈ$õ¼µõøh“¾èö œ¬¨RaŒ`‡›² oêg<‚+ƒS—œ מ sàüÃêÚÝ/ß{’ÞËÖ^È®©€½‡ø"¬í‚ðþªRù†°¸ÀPqĈ*a±BAX¥V a ldÀ ³±Ò¢‡±e 0Ίõ˜lÖ.vW™à«…ûi°ì:Z)S£Q‘E`DÀPD [ÐaÕ Q@ 7¼dBoLÊ›çðÐJh.ØUáö2\ÍòPÃ|‹,h¹¦J·h@J™‹»¹–îàBùÊ eàC/ê#H5]X> D±Ë/v‰£R0!Ëé‚P¶laûçO¶~þÜ~$ÌX.Þxañ³¯=4þÚ­úÑk“cMêEÞb Õ4<¥X6pŽéÂ/ÿ©ròrãz0ßÝ~íHe,õ›á!¦û­4Ú|ü9„gë+UÎ6ÞlFéóKžÊ|å§±œø£X^}ó[Ïûa®>qc*V—RT9Îû&b³øç–^^L ºzçé–o˜?˜Kt*Ùz53—P«r¸•ŸPª/K‰±:e™ÆR7³%ëÇ!$A˜ÙØèÃñ\³¢H¦¼æ’Ã'âÅ=þ±cbJSˆe¶6‹£(5YfLœZ3¼ãúÆÎÖNó”U\à ÝMR„“4*ŠÇ`¤]*USÉ‚K šI÷ûŸþÌ}ÖEÝ"e€D^PÌä#‚_ ܹ!)gyÙªmœ%ƒ¸þp½»Àš~4Ýc…íæÖZõ惓ËD¨v.žßWa½r*yÌ]9 _N~—>þÉmÿ¹…™ù-8J׫[ Ò˜STÁqjhPm”l&Û•nqج‹0oë,s¯ µì8MSL’¬0ΤQV¿¬ZV×Ìxè?âzÛÂ’óT,"zlI2Bßóü ˆ°•°šØù© äN.¤}Zñ -ý•ä†5ÌÅ’]`-Wi " dØ ý[áÎ4y¶­;ÔÇÐ÷+qÂ^]QoÃ¥kp¦8…ÙDÇsP¡sǦ‡Y ‚L¨r H1e‡’«Ìl™­$w®(^;YSN¿e>ãÌê®Y£0äÏ7lEÄfI<Eqj²,5&›ôÜÜØzØ‹ì쯉h€@H,s¢z•óžJ¤ÖÆ|x„EšêŒð¿ |#^‹…`©QÆÓÉTwíj%’B€ÅÊ÷”cKEq E13©Iu}»v”Aõí h°ÅJJD$>h,Œ~ß=o4jûûn÷ ²Zïò˜l_ƒÑÏŽïÚ¥o™‘2ÀËíSÃ[óƒ Ù?B¤ Ï‰³¼ª –MÎ &/hÅ^§ÂˆÑ.&cpIp\mlORQžÛÔægª›FÍø “µu9êçu`®ú(Š<!¬¦aFDåù5AH…UÃFJ°fÀkò?MÀ‹i2™Nï¡”[ER ¹-ŇL«YMÈizSÕ\ HØdéˆG~g<Õ_åvñrÈ#%úJ¾¤³ë±Ûé©EHÀLp¬àƒ7Ùÿ›³-(‰ÇÞW7žë^¼©Ø˜…±=ð09ÐŒû‚rp¹&#Ÿ/”‹±˜[òàï÷ޤƒ?^&å‡ã+_{¶žq¿ŽëÁžÀ!{û¿¤þÙF«æþ»ÍpûÉc¡G,2ü7¨ò'û!aÞýÇôßÎûÝö £ü¬¸ÎÕÅîØ~Cðõv,Ù…ïùÚðÖu Ù!6ñú¤©S!8iq±NÊC¦°TJ̈‚RCô™Yxf‹¹jÆIÂ8—_0H:ú}†ê©†Öj<ScÞ0£2Z#†h¢šÂlØš,žÄq–diœÄãX¢‡÷n튗£Â¡º‚ i&€ÌmzËÂ{!ÕUäÌpeÈ}9!šJù‹Þ¥ÈJ'š1çƒç¼ÛÎ \XS\Ý£Uµê¹_϶Ì6c’ Ól/¨\Sg4 ùª{ôITHÊå² K´a×ÔûòT…ñòî©[}8´ Ù^BO/ßÜCú|÷ÙÏ®«§VbÀZ°Ýíà…&õà8Mµ,nÖŠ‰ä°’ïU¼¹&"àVЉQ¤ZÃÊxœŠçcbsþ.¡H–*“ÃU¥í݃»¸ÒÈ£¨ej/Œ„!_ ‚@ H$ªp£j 2F´ È™ˆXYùÝÝJxwRº8ϺQÊ÷¸ ¯)TˆgEPÝô­`)šÅüIØÒ vÓQ ÒD¤p*OA(×dù2Ù§qF&…n&*ÛE0ð›ƒW¯Ý{=PdÑ¿tŸßD©7¿½Ü\o­z;¤yn^k*É:¹U7¯g¬µxù'áÒzëϪâc´]}~ÞSL+éÆêáÒ¿_”„Ó{ÿtêGÏ¡v@T„žBªŠ‰†°µïnðñ'Ò‡Û_3º„ÐQ«ËîvubŽ·RîsÅ\õíüyE#œ4…1@ë;êr¾,wzáR0“1³Xɾx@æØþ*9ð€ÆiiY°äDAaHcÐlˆa¶–AŒMãxÇ)Û4‹†$ƒ­0(šÛ™–ËÕ¯"Ì$‘ÚÁy»&&Y°HèL1XMçQ9¥¤¸È9œqÿ—ö¿ÂP–ÏóÜtGª)ºBíVjžÛã`<FIbvãú½ñj•Q>]¤|$@„"´ÃBÜÛY¬ÝºxtMxɧ§Ì ¬eoË4Ô¥1ðèWçßLÛϬØÈÊvs™nFË}%Âvè$Ö… ƒÄ*nïå)Q×+µù¦ Ȧ⌑Bà Ê£If½Ð&ÆW…­ §ýÀ»ÖîZKŸ5îBe…´rGg¾ í‚ô”Qu¿4I ˆµ­€"\]eÏaDd‹¼Êò ¨oÍóMÇ+Ä©pÕr5°ÅÀž4BTܤ”2–N'J"3b³êE†€•\Ê(  Xp£ÃüÜÈÃK†j))w¢'fGp¢ÄþÏ]xÿÌA!àl ÷nŸo^ºê!MÚÑøÐ89¿”eæD7+œä ©Dv c~qeUÝ;÷)/Ž£ë_/>>ý¤y·¹T·9‘¹&’~Õ§“‡‹böþVîœ;‚BrFý/~ÌöÑ…Šetõï<åŽèMXÚ´ÝKZðëÝzÌšlðkð_«LTô~ÿ5_±|2€°RYŠÍàš§“Î1ŸÝ\˺äÊiÜ}ÙÇ”6x %Ul0£Ü7_~Ù4sQ?GØŠé¿¥Tõl]C.™-fñßÈ+¦°R£Â}%6e¶bM–D“h§&‹‡ýÑh,­ˆ1¹ÈÖZ(~HÉ8¥´I¢$Fµ¨Q©¼â›&Ë"å'Vp”  Öw.IÉ]ö¥hÊ*‚ÚÉオ¯ĤƳeN⌹¿Û4wæÀd}u èðX ÖŒnÐ<~Py‘ ¼[ÙwKÀã£ãMÚc!ï‹;ß¾ù;Èq¶/¢²_.'Ùî yX|Ìrå,4"'°ca/ìªj=€¸¯&‰ÃŒ47Ø5LAelS9ÍÐÔn4ލËÁX?ês 1“3 1"•@¨UEÀIšfYfà í×2ãÚBBP^¥97ñ‚ájt57¬‰—ˆBMeŠdR"€“\ÉÌ6cÉ/ô2ÜË;˜-r„ã&G‘ Ì7Áséà¨Mœ§WâqÎ(18…+©(I)ÿL¹á…üõµï^»ó}$òxÌÑ›sç“72­³´»Uio7–yl[çª@XÎЧr7`þÍÞ‘]øÁ £øÃÞKû[ãÝîF1w;èï3ðÕ_på|s±eåú/VíÖwöU …­pö³· ¾÷eŒƒß}ýïŽ(÷SK Á|šs|Ùüb ŽŸ³Û—ž<\7²{—hÈSÛÓg«®”˜Ï§Uqbæw&RE¬ˆ…Œ¹Üì È| å~,À2z‚ò\³I ‰È²ãÈ7\9€@`m˜¡—b‘H2ÃÌ ÂYEãq’Ç™w8›dÖ]6#[a&w`™l —4‡‰¨%…¹é»X— @™¢[ mfœ½Å~ÉÓÝš˜Äbn8!ɽ îë­Û–„žrµäØW%@¨³Ì ÛͪÕ?®ÐÛ¸×z¨j§ó3)¿Ó’íÉà³gç‘HoÜ}ôá.ÊÞ°±ÝWÞYÍ Ù/æ÷½5Ömf$/Ûð§^Í‚°xG v‹»Ó)Sp¤|U“fƒ@p/Vш­Íl6v“L8Г'2;Ê£1ãú=óˆG0‚æÖN‡} Z·½óÅÈ ¼ ÆHI3C]¿?VKM¥Äi¤ÈŽª¦ãâ…½-²€bZD+lAjŠB®˜€Í•9¬ij'Í(V„‘l:”qí„+(¨”ʯ/âò/IeON„ž»À¹à>‹”'’{{@ØLþîÄ#¿;qŠ•W.|õÊÒ•‹¾Ò›ÊÖBŸ¨&ǓDžH˜+ñEòŒÜW láêO‚}—^÷ÁçhÜ{‹^ëV4âÁIÔtà ŸAá7®ªîãõ¥Úw¿>¼Þ}¡¡‘ˆeü·×ÈûËØ²Ù{þ×¶FPybh^pPq„ºÁ¸[› ~ õïÖR쿯ŸTÚDŸŠt¨ Ãts£•¤*^ÞN̸ %Ÿˆ¸Øifq8@œhˆA»°h§™Yº °ÂTŒßW\}6ô•&Ò¥ØxÆÇW \Ù°ÊT”A˜! [k 3›d2‰â(NÒ,];"gƒÀ€6' lÊ $#§èfÁÔ´NGÚðR…Üu€¥ hZÛଗ¢˜õçI‚¹ ´$86('tÙhåé‹~Ã÷Ü7J%+Ld`­MÖ¥y39]šÜ9põ>‚B~. `ú7»Þ¥ÅÇPÙwHé±NŽˆœ]c%Þ­O_Ú»( £T­Ü_iù;Ûõ€P. ¸ªPp U€ujdQ¾W æZ òÿçê?Ÿ,I®+_tïíâÈÔ¢²*Kë®Ö ­Šb’3C1äÐæÚ}÷Ùû£®]³ûærÞ I H!ªÙhn´Õ¥µÈJGG„»ïý>¸GœÓc$¿U¨Ìs"Ü·Xë·h‹Í¨ DÈzÚí rKÚæF*ô¹ˆ5ùîT÷Î1Bå.M¯ãBM)òËÔ("l ŠL’´ÖŒ@Ì.çìÜbj‡ÌÜn33ŨŒaE¢¹¼H÷ö¬„Ž›Aˆ-Ðò8…•„¾ Sjü€½rd—$jgr%ÓÙ€R¿‹­À¿Uþ„”Ã_œ˜ö 8PÕ—8¯Ep âÀ}ºöÜí¯Æäò̽5ýÄèõµÝÚBÎ3ÙÂ1ÊoÅÏÍj`sy䀿ø|¡vçÙǪLvéÓÓÏ´ºF¯/µ„nG²¬€{ßËáÌ‘Å){¿ˆ–î>~²ûXqçìÆ?Ôþ?Ÿ‡Š?:øÝZªˆI•:7©¬ìãøZë쯻xúhnùê•g—bãn U½ÖÞgMïF„Å EàK²rÜ7†0ÃWd0,¬,“zf'à¬r³R=_É2~×Wüh+U¤é+ƒÀIEh´ÎZQ#˜"³c¶ ìØf£ÑÐØAô\£Þ`3Š€t3͹e \¿¡]R Z5â®62=…jœªHþTÇŠ"AQ*c“ aøßÒé$!2D@œõ¢Ho+gª‘bÝH`å…e'Î9°Æ2 é g6»¦éêܺÕ'R7‘sÁ2zÀ+ðý˜&"|3:ÔsXŸâäðíw_&QÈ¿˜:óÑ€9Êòù~mQ†W§¼#ñHLD-î®Ű|Tòë“g˜AtíÚ3kG0w×N÷j¹Âƃ«g‰Ê8¢r§ÎÌÖ?Å£ìíßãïN1Qg×|ÞjYïÖ֚ǑºÛñÐ-̰°ä_üâga¹nÍ…ßÌð…åÐ{—Å}úOFžü£†œ}ùÆ·^Ht ¬'œ4Ic™yèWbï¿-3/Ez_¤§S‘Û7HµñØÁÕ¼ÝKÏF~xáK÷ÐPÍ×á[‡úØg6†sCs!W@Øa¾q‰Ü³u…D¢üîœ&d|>ÈÀkI™j9$¥…KØ:cœˆ3EžGÅcØöGÃÑQ%*µws„P 9!a‘BL–m×ëZötItà‘… Åžÿ ØkÌTP›‡Å¾®Si°ÂrÍ.à¤Ä/U‚$DÄX…Àk™YPPŒaà|kix¯½*¨®õäÀ¬ ÔoIÏ{›Z—¶>`©sùhËImuMⵯ?sDDh÷­gÌ@4‘+Ò\v|• ŠÌí+cC"%˜X†9b¤æ¤5•b¯cóQš fL¦;c)Irg«à@¶£Qëzí(Ý?¼ÇÇÊó³$Qå"˜*0 õfTKê"Ø¡|£brÅx(Ò‚>(hiP4v÷Û;¡/æjBDJç\éÔG]C@8ø_=0a›jÏÎ]ŸíÈ `b‚Ò7U@¹ÿ r÷IEª_h•Ôʸ^ÒB>úâ¥Î¥?Ô@ †®øMû%y½M}»•ÛÆ¨Q ¸ Ï´5!Qi•@Ž',âäÒOkûï.~«±Íº[—ZOµ‹æ†9š¯E]œ>d”ó.ÐÜÍýþm}ÿ½#µµRþg.†¯¿ðÍÇ•eÙûÕ¿\M ˆÈÓϪ™5Tà#¿d¶öõ=xaÅ@öþýç§âbô Âl¾’ÚèÁz»§f@{Z¹uañ™4fà•1}”0 »Ê¦é7jeo9Õõ-%;±böÞu¨nG¤üë…T=l‡=l—˜¤€Ô€VÄUÒˆeçœ;Sd³Ï  ·÷ºÃ=å¸íìÆ½M½ÛwÖwýPغ<î'Ó€;£šBQU¹'AÌ7T¹×2†NŒ7 c²L9<)1ù ² üiµfìåH¹Xf&qˆè˜ÄŽº:=¯OЍíýk4µ¬‘¨4(ð`«¶$ï6ŸPˆ"oî;,¬“‹-,ú?m|+|sxz„€F¸gÅþmí¤ö}˜ˆÊMIe%-«F( ’8Áfà¨~âÄ pKî '00èÿv-° ·‡§Øâ¦!¬†õ—Ô‹"J@ÃHiDiÝ¡¬»Á0çVên ,&V‘'Â" FÉl¡¢½EsÏÏ`ÆîUAhÕrS­Ràœq‚u¾*­"Tm,ÌXäÆ4F "³¢«eVùú—2nžDè‹ zk!W|hà` …À އ¯-~cáa`³'W®?5u÷ªÆÃ7G³Mª)LйwàLÝŸ‘cy{·–Û"ÿéŹh󅳌:ëv/l>jÕ¨{$FºÞì*:(Š™ û½>v`zÑÉýŸÏ¨î3R$pbvþéµÿò äÖìþÌþ§ÙšªH5!&ðæ~€ìÜwpákÊÊö•ƒÇêÂ_Œ°™4— 7¸³™?„:ò‘RT)ü7aa†ˆŒtÊ YAfo³Çj9KR¥¶ú¨ì^ÙPrê@3QD‚‚'æ¤eV˜€FcuαÁdÌqÖ‚kŒv깃Ìwwº½µu +NE7îõ¦¦Ü•/nÞ¾F€ÄÎÁžžgØ6ô¾PÍ1ciœ¦Šï—'à°j‚|;-O¤sH¥](Å#~ô¦@µš5ˆyÁ,¡°–Ùbwoö ©7—nsz²òF{,M¾^ˆÞ6µ‰HÝMˆË¦F<óáŧΠl¿u¶Å„š1˸4]ë_÷7™Z!…a(!¥p1ŽdälIŒVq3­MÕ@¶‰3Ñþ`ÅéAÏXˆ¢Â>qJ¹³;´µ{$Öº{/Þ¡Ã±ÏØABWZhH¡h­£´Ù˜Ö¦çŽÝ”6wD¤Ñ¶ˆŒ à\!5š<Í{რ¤do¾$Î…J%@ ÎaH¢— ,†81‚€ä›´Q&fJò Ifê±*U+PÒßKtN˜ò—Ó«Ò«4¥øV•?ú>»üÊÞåk„†ów–ÏÙ_äÐ^¼˜&#ňiþ$ûz;Qeÿ,HÃáTqŽ€óÿÑ_ÞHþpNE’ 7?Ñ©Þ[šy 2¦yMÂι ¿°µÇ[›XüþÃãѳ35T#¶¸ÿÿëÀþ¿œ+æê¿žþÃzJJ‡÷ö+wãQç¯gòêâ(¼›½ cÙX#X€ã®Èo³{É™ºÖP^æå,A„ƒð•à €„\g§D8wXEONðóEƽƒ€8qÎì¾ ®q¶©‚WŠÆI|e2€ ¦gЀ¶ uéfò¿Í€µÖÁÊĸ~o˜?Ø[7ÚU_Ú{o}p€®~´¶~íº_à8.Šx–ÆUª‚B—ˆ€±(gKdY)N 3‚‰"Ò{ŽýöqÂÛ$Dqâ—2Y°ì€(²YâÐäÝbêÁî¾F¸4»ÎêdäÆäò¹¹µ«ûO’Þ¹!ÃèTz{¸oôóæ5(ü 8†ê‘æ>B}ÚÚ›~уÇk Q$ô"€H©ëÊé¤Jh§g@ìbVh%¬½s*ªu œ3 +$kG±ºs`Ä\[ØÂ}3ˆ IÅ l‰¼sãK:ð´vpã“3ûR.ÞEX åšµk›s»pb•ÖåúNÆš¸°côÀ!= éråå“ÞH0™œQ! }¨«°ˆë}°§ø‰é””ߢÑD ¹Û€8@ ,”ƒÒ„¥!˜±L☾¾Â£KÃÍÞæÆ`w@‘õ»{öØÔÎëwwîÝ»OáªgÚ†)ryf–•òê#*·<jiW²4Tàtá¸W˜4-øâšÅ‰ £ v€2^^!ÕcåÛ„Ü:&l±0 è¬uf¢Kñ1¤è2Õwá@›ÊÊQet»±bÞj=«4!XéwPËß¾57ûÉïþéáëªS•^Aº³§e߬VŠªA8Vš­%F@¥¦óFp/§" ya–š‡\³ „*+ÿŠLô·þÛ ¬ÿÒP`s;h¶ò\Dš‰ñòñc žóV½×ž~ÀZ‰ààñÒrƒQ@¬c‡ß{µ{ý…ˆòÑ6û ÿÛHÕ¾¯b«‡™¹½öÊL*TÉH*]åÌ“â_/­ìî½r4åƒÞgggg6åSv?òþEK–­£Îßè©ùó¨oÿh.ýá¡DˆÁ±3ÅÏÞHèŸã û«ó{8QéXÝ­VxÎŽ~•E_o*.Àó ç;ØHê‹ ›˜öB¤ÀΛˆÁƒ¯„ñ•ª˜¨0˜3ùé©c¯\ e±n3;f4÷?вôp=FE%ÌŒ&N ÿ h2 HDཎX9ÅZøÜ·ÜõGæ~§Û½Gº€h÷ÂÀžà·Î¯olînzˆ³¡~>¡é8ævä·Èè­ò2vô•›ÅsP÷„&.Tå*ÐGK ÷M…X0.ã*P#ÕgR €Ör.ŠXe".̶Ì]ŽNh¤íÅu™Y"*£+8Û¶+õ/ûO±Æú~Š-n\zÀgÒŸd¯Ì ]ÉÐLb= Sª³á¿åtI4A6€¨T=ÂLœõº0ŠZi«Ý`ØZdA§M'Ë@'Æ•’0hfÈu;Ëê+u‹vZÖ\B]ÑûY„!Ot½ž6@Ù°…É󡵦9,n"ºÅ¶!Â!£šV£ÚhÆ=p‚òXIô¢íÇ.Pú°°ˆ@* ò=ëC‚ÛDŽ—‡…Û¼›Î»!è:¤2./}&4Aò-á\ÀñÂaB¨^r¦¸øáüS¯ï•Âý;O6¯¿«åÑÝk5kEkXŒ®M?“j$†r#3æä‚°ëdøýÞ©õæwRˆóA¿wN›|5{s¦KñŸhÌ…7°þT}_èónÖ¾¹«ÒAŽÃï_ýŸŽAaÜÎkø·Ó5¯’(…ã„ÐÊÀêÃ<,r?Z°ýøÆ J6/“LËWG3{ÍÓ)êX]VS¿Š—> ˜UŒÎÉÄIQÎÈlj(^'ì¹x³@xº‰ Q¢¥Ä>,iYH:S°ÖT²aÎÃ̵ï.‚½4¤[["ù£¶pÇÏÍß|«Ûíz{aKet3±À†2Ò˜ ÙÍ8öKgÉ¢½Ä§-1 #‹¸rƒ ~2ã¨),÷ň(HD„µz! €),‹sŽAÐÇB\°Ý*Z7ìÉ:ƒ¹<ÿ@Òc@äùî €ÎšÁõé¥õÏgÎÐÅ¢Ýv¢:ýí›­¹›oU¬Dö\%zMÁ|lÕºÿ¦ãÓB8³‚€@ª¤fI4µ¦j‚`·´"±Žg·SwlQ¹îÙ¸B1šÞìR[;С#± H®JNÉ( DáŽÑº¦ê€g­Þºvò9=è¬ßÛ®-µv–Ö©G²_)qâŠÞ€}g[û"þj÷ÀöÉGZ^uƒÂÌ÷¾·«;ï ÉoýðàwÓ¤œ­Û÷±”©rÿ§|½e±ÿîì¹{ ÌèÕzáîn¥…;ÝV¤ÃeÇ㻹4W‘,‚‰CpD@ÁWc]µ£á á½m\Tî౺V ( JKi‹´XO™Ýf9Vâ%¿¡EËc5Óx›êÁ ïk?¡[ÐN]¸©“ÆÔ†ƒÆBk¡X;+c>° Æ }'Œâ)×juGÚÚH ÐHº]ÔF¹µþ "&±Ý®l8ev>€# Ïoc(ç( DÈ(¨§iZ.Ha²Q‘ãl‘=@‘3ä7$‚LåmÉÓ½ûèØ„çÅ×¢j3£D&—s6g@*¡Tcˆ£¯ÍË •€-s. Íbàa!" û)? ¯ö5Råk£p…M.Ç4Y˜VŠ5f±?¥§ß8ø83gê³;ϧ7ÏGrrxµ¦…§0Ï:oµ^‰”€"(=Ä1טYØòOî¬@ÿ2Ê »y•Û‹»ÑA¦íá€ùp€;Ãkÿ3LJ,,qvå§3ºxá`yþ«0äŸ}¿€sßiƒ•Á…7_~)‰‚¹””ƱwŠË¥ž8¶îÝ»øÐYCîüæSµÄ]Ú¥Ötm•óÎå8î/Š"“ÌTá!U²è‚…‰ 1ŠáRéèGÿ<ñ&K•ÀdGoTϵTDJû®ÿÃTž³Ä Ù&«…%ä "E³Ó„õ+0Š×û„£¬»GB³ñÄÔûŸŒÀåù(ó zv´W›EXÓiŸE]º»JßE‹‚¥»Ç™ ãöÀ $˜åÒ4=f"„ò!It¸¹ Œàǘ9± ìÈf‰¾\?h^«E{²Ò`¨ìׄ y§¿¯}~ûÔaÑOô®ôåðò\Ñ_Ÿ:°ó³ù—"Á9B%ïuܦ=£‰yàf^n‘R¨Å ˆyhRPé(u&‚Àza3Žˆ”VL38È “fã|}àAú,"ìújêZz‰ì» S3äí@\NXœD™jÔë­šî 5À6Ë­ƒgoɈWë–|‘m¢™|–¨¾ÙõÓV–RŠ%Èõ©V£¨Tm#€¨`èãÿ…í_’Kƒ#°ËLîfòžá™ô8E`Â+_©ô&\¤áá Vò,3¨!$Þ³ÈÕ÷žÖ¼’ Ë­ùpñ4¿Õ¡ö‰/z± @³m‡fãâ£Ç#PT¡Ó$ýúÙ8f·÷÷fegúOjQl»7ï%+Njê=¨å²Ü¦H@Dœyÿ’<¹´Ò’âƒÏöwg^œI¼D0ý—€ßzNÌ{ïÜü‹Ã‰""œr‡`r)“–ÄÙáëÐ~Ee°ù»Õ3)î]œ‘ƒ„îzÑFO$¤tI]Å*÷H£D d€M•¬^6 *æ›maç,®ÝCwê`fqXªŽKå ‚† ` ˜ %D0¡É$üÁÃ6¿¤;Ùî= â`¸é¤à}Gêþf§pÆä£‘_ 1»;ñ2r Á¼ö[B„*:h?Êj€+)ËDpe…èÐò?”ÒpáyÍZäŸ.c-ó¬XçÐrÞq›ñQèíÎlâò ‘Ú)pÃKS‹{[G3îíX©‹ÔOºáæÆ¾ÆÏ˜C'v/#&­ûÈ+‰Î¯ê ‚ªÄ$; E:*E­Z»ÝÞQ.‹^¹Awd%®lÁ%¸"0N„…û£™›t˜A]œZ³ñRD:Àiü— Ö2¢F"ÈU¬UL®ï†Äå™#»Ð’ÛÎñÜAŠA€,ˆŠ‡‰SjË”»ñjéªÔŒ*ÍU”ñ„q, H÷V\Á%lÍgq˜J3M¤T©éG˜Zx{VLñ2Bʧ!tvã4²ûëúSïN?ÂŒ˜gøþƒ?j]ûLñ‰á—JX$YN‡£ìcõB«Ž0± a /dv…ýäßÚµÞ¹§HEÃnïÊh!ÍL¬Ï÷°1+%uÎþ˘;›¨CÿµÁìƒG®kR Å9îýÓõ¨öWµuùökü—³u P`"Ù ÐËʬ¶öwðñeÃËùÓ5ÕÿØÂ¬^jYÞ¸Ó0|lž4Œ@Õ@ˆŒ¡%$T$* ° aôÐJ Sš«Daavbv? ©?ÒФÆrÏ^üº7d–œQ1âDîŽ"DûÿCŒ›ëà ý ×€q$¹“Á`ééúW²"˲šPOX.¨£‰Fá‘yòI*U¼”< © Ne€—˜¥‰,s?¡ÊŽ^õHa¨t3‰EÐö­õkThs&Ãìò.´oçGcPùgí ˆŽG" àÉØ œ÷o™cɯñ¡Æ9ÜT5µ‰m-Ý¿óó…o§´óûÉá÷†Ïlç²kk}W ¼©‘…P¨0 BÇs£dJ âh;±C­¸0F i »yÁi-s®Â£•蜢¶·‹£êž³YzŒƒ›Š¼Ó^"¬Dp;Š’&CÊÙZ¶¹•A²wî:ŸÖ¾üB RkŽj¦MëÂ6h <$NÑ>7jÑôlú Á‡{Y¬Ÿvç?¾?·ß^°h‡ýÍmY6sS ïÕ÷Pïóø*°À{ÿµgN/,ˆÜþ圽| N>òÄñößm⾿ž²F7ÿù¡ï¤‘BR¤ ôW” ˆ÷'üÚ›0ýMÍríË“s5w­CÉtû€Hÿv„½ÅS¨‰WäHuç‡I©ÿ$ èh@ñH!ÚjÑQñq`ÂoïUÖÚ–ì“m‚Ó³) IÁå÷)ArKÄ ‹eA@\ˆñ+Qñ×ÿxŸ5—²MØÛg i%’d€ÍÑïz‹°sŽœ°°qÉf±ÁpGœÌ¦Þ%E4q™–Ÿ§føO‹TȆzf¬¯&Œ†ÂH„Dµ8‰Q±Ù 7° ™EZëL‘íÍuï-.‚Vç÷­ÑáH…KDq@Êöož½µ¹rô‰ÁÎŒîÆù€|°³Ò~ûöS5ÚŽ>ýýãƒ/"˜ö°¾OI/ gŽ+@&Šb-€€Vq3žn*رܱc›KKv† :…¡sU˜êÌ^Úp´Åª;XÚÃà +í“o›Íˆ‘GI× eϰ˶¯ãàrdðD=MV ¤Úênìn ª ¸-%ìNæ9‹F±Êx|ƒ‰ß;‡­ji± …*a†mÔÈFÕ)BÇåî'h|Êê>À,Ë €°í÷k-”»ê±`\F}´ø£;¤Ï/'w¾ˆäQó9*µ0俟¿Ú¨é’S)ìÊ_£z/œÝø¡Z¸wàU%µb«»‘5£d™á~Ñ:­‚u ÖÚ›ÿ ôÔÒ¾¼ýåÑݹWöÕ|¥/ ÀŸÿ½ã§¿›sïâo¾ý|‘ÏoÔ=ÿÐzqÐR;[¼ÛÇ—FzðAýYÔ›!Îö)ÆëÃz'=—‚RJˆCêR¸)´$"‚Z‰ #(Æ„e—ÊÀáÁ*¦˜†k畬œkèÞU¥Bs§H8d¤pB‹å“-Ò3ßA}ùî(‹o+J84ÔhE¯ÝÊ‘€-åÀ¹ÝÊæêhïk ³ í¿~;‘ PŽñÃäÓOO©DAi°`,éÈŽ ,sÇ„iÀ°„Ü䎙AT»‚ETn€÷ZñÍö YO¥‡‡’жqÐN¸þU9*¿¯½´¯¿zï:Þúk¢ôïFì¿F/h™¨ÿëÑCîa²ôÔŠŠ{þFt+°w6Wq)ƒöv<­©Yg\#;bf@‚³ÙVnA§™5ÞÖÄPØq'¢+3‹Nìæô}Ymzø² $b ìT’Ä‘íP!lY¤ úæ`=»fG´o*'5í’A+¿ÇÌ¨Õ B‚€z¶°qG¹ž­@±@Ðlúï"¼Ã,%µƒ¥ô¾‹Ýuœ)¨æ0°"ªâÀbun”ŽÀ*‚°ú¾K³7£I)ê`{ûo¼š0D'ýŸ9ga퉫÷4ï[nHžeï?—„ÓÒË\•‹"l¿ù»y½ùê)+¸¹½µK„Çzw·näpR‚Ù¬“×KÇÖyø½íÕçjD¨ ‘DØ7ß"úÎ‹Ê uß8ÿ7'â¨\“NÅs¡!„Ä:¾ö>Ì}  ¸pûéfÓ]œI–§ŠÑÚ½ikì×ZˆFqUéT1(Š€Pi ÚÆR —‹?’É÷Áü$Ù~ôà…ÖËÊ®ZHr`:Žò+{ߘJˆ¼- ¬s” pþ{Ë{ùwÛ¢d{mÇÒÛ­!O×IrVØ9“ÿà<·¸Ô´÷Ôhž;Ô$âxôß>Uñ_žfcŠ­_Ùÿ²Pˆ”“ûË€p,xBg³_ö“¯·ºûÞôSœ]¹Cz_t¤pùEJ†³§4"•š+oä)'ù>þJØCã”èÄE“Ù^!w«ú†d¢µ÷ãìö§Ä'N4´¢ ñìU4H¨„‰"6”‰ìÔÕ·§ô¨3Ÿš¾5% 8|dñË÷6(V°§r(þÈrl»Ó-„{0duH”6*×É%ñ*Ûø¤s÷½2n×¯ÇÆZK¤+#9©YK}۰ H\€# †Ð8a6ùh0w»·Zg^_¸ƒéQ"òåDI¥è­Í-¯_ÓùÚB¼qfìm8x0Û5‡éÇú)äbÇ}°õä…>Ö’\¨‹Aqé1"R~(ˆBØr¼Ë~—£õTT›ÓŒØcŒ"%â,ãtsc˜³J\ßNäá@¹Y±Åöüm¸øÃî¦\A"fUÓqDC×gç„E¹õ(‹Vm÷FËÀ±Œ,Ò0±èh#+C%Ê-€Ä~¤ò¦Í\U£™(0@6VÊÜF@8L‰DØwKÅÐ Ê´ÖºêƒK’ó˜è¿ê‰¼Ó 2^Ù»9„Ám±À¢Öö¬\x¹‚vÈÃÏW÷ßÊiê±µ-%,«ó5,ö|xèÙ!!“ŸþUû'Ëìxý‡4ß;ömÄh´Ýɦ0Þ©o£Þ'‰òâH6Åý¨ãGÍGö“—ó©o-§(ˆHÀŽeýÿ»ŽK9#¹+nýäÀ¿Ob&x äNå» ÖŸ×.ÁÊ3ÂæBç‰Z4üBxIŠmq»?Û‰Ž·tT6óṇ²"ÄrÊÌi,D….0>SÉK+¨¢Ý—¼ÔXÄÎ ÉS RÊ—ãI|Énç´0ÄäwL¾Ò¬üy”þ µ-·ß-â8ÅÙDz_wÖ´ba;, “å̈È#é& ‚}²@˺ÂÊWBÏ1›Xˆ„*öa%+c5°õ‘<Ñ—TYŠþhQ©ÖþwÊ,°q,Ö9&±žÜší¶º;ËK€îöâ&êÃDH~6ÚÃ[zQ]C*–6]k}zê iô׿–®Ö`èwÑþô@ô%êCC®ÍÅE˜rÑ­Tik DgStÆ#ÓA×µnÖA6•ËX¡—ÀLeý‘á¸Î…‘Š}RV{ Îl7‡ÛõN£ÖÁãîDF…óùP.Mëi D],ˆH¼·í†ö(óMÜ£ ˆ„@ÙÄm8/À–jHH3i‡l–dW,:_k!ÀdYJû,‘ 9 3²sf!é[DlDqX÷ NÆ:IñìÿÐWTö*H¥ô€…Äœð°ˆ{žýÕÂiA¢¢ÀwFߪ]ºªqµþ eîØô´vüÁÚ«su$B¨ ûI‚Çòúg³”½tÈvÖ k“3µèˆçtèb™™Ýgo`íìüR¿¼·²wêé鮋–ñÎ?Œè‘×áá篽üR¬•BBTåècL»õjIþJê/6 ¹ùÉá³Éà£!é¤6ëìÞíšËï•PP·#»R_†‡å¾S” [ŽÏÊf_þ¦c殈8çX„‹·Ÿš‹¢ÀÛ¨¶káÏRÊ…w#—*a (þ“U.¾4=ê®Ç$ÎÈÔ×fwёȀ×jâ+CÍ,[—ÃF´fgóÒN±zè*+  ˆ—/UðC*$ï AAýWN®*c* Põ4F@›'ŒÎŠ(g¬O+atE?¡Í£ÂxMwt´†àë[ñC|0k»‡ë Ù…»§û?ë¬^Ò“©ÈðþÖjãuGº›|qõôùÌÂHïÇa9ª]ªR©%@Të|0`¤ë”N7„À¬“)P+B`ަ¢•gÄG÷¢”ú ±¦£áîr›Á>hîâj¤*g[kýÛc¢˜`+) 3’ÛÙÙÑ\]®åÆN-±m‰ãLÉ=fÇ•œ AÏGY½ ½›.Ïf†ñ_J7K…o*ìƒ>Í6 ÓtP`³á@…(Á þLØê¡L˜@Ëÿ\Æñª$¬j¢@ vpãõ'âO¿]C¥yäv>96oW@ãø¦aXI9+ õþô×™bŸ~éä>1Üìþhжþ %¸÷`h ŸXŒ·r°¢É¯$+úÿzAÍŸ]XNùÖÏ Ý}æ¡VB<„Ù¼óšÀ?ŸXqÝ÷.üùq¥|R™¹7r<;ûÑzè¤åüw걈îßYLÏ¡ô®ºVîTèÀcM©/¹š#Q¤2VB¾ü-Ù¼2„ ŒêE ¶Qff°6ë|„Òzj*ØJ'ò½ƒq“tË Í˜+N¥¾MN}‹ðËõQFwMŒ€JŸxäί0Ú/Ðß\¯•Œ= »cÇ–¶p!R½-k`YyÂ<|E{(·NªÕeù`x}©çþ•ÇÂè_fß»NL I7ÒŠQ^XÏǬ@ä‚„m6´SÕIBºÓ]Ø„åy¡2.IÐ .Í.­¯­ÝüìâÙþu8|P ï­5{}Jº%û·åöЂƒE%ìKqY™!!. •B‘{üMDó:jÅ0èY— ³-l\ëôsŽj4°®z x2¼ìÒ;íC‚pµµÎÓ Íä‘G¤Å†‡ÄEQ)×AÃŒì¹;ܤa|Lzw&z(&‰b@Z^ˈøG€ü._!Î36ú„{…­ÊNËa]›yŒe)‹¹`›oëAš˜ ´êçø¥‹pqO¾ÈeÇ¥iσ' 2N¹Í‹Ø_ègߟ9ËŒåêwùóµK—OE‰yþ@‹Lçúí–jŽh2íkÌv,_¼G‡ž%Ûkœ¹åƒÑh/10WÓˆ°cçìÖ¶ÕáÓ¢ü£÷¦]ôÊÁ˜‚¡FD?üBšuR1Û?þç‰ WY `W!¸Îý׸ù‚¼zåìR½÷9Ò4h_Ùieøp”&?ZáÊàXŒL³U¬s!GŽË+ÔÕ¨B¯ËW ÿ€H¾å}±Iîé…4RŠ©|ƒJ 5Ù9‹~Æ#%y@¥s;…k\']ïˆÅÚì³ÑÏî©gö‰ªo'ûkDèÝ RŠM´-Ë‘‘•é)$¦qsRÙý(/ÀóÆH@¯ù#UmŒ€0«V"%D–uGˆâ2)<.¨°‚J±ˆ¶»Ùò w,f•ß]¾ µe¯ÔÅ*–w‹Ã§Ä-öeúúî‡ÆyNž€áÖèH8#T—.?~+Çz$Ë °@ºŠ4Þq"“†ÜGò!EmnO)Ø10²d­ˆX©ÑÎ0Jæd¬.uÒ("ÎåÙô-8ÂŒ—çvavÉçÈ{ò¤†<'DTh“$J °'…ñÇ);Ý-ìóq4Ÿ¦9Ÿ‰1öáµl`»š‘| ¡"„gâaÝv¡(e.סþ r¼²¥•‰™³R9f¥Yg}ŽjTE0¡æªòËÿ‡|%W»’íø'¡šAäâî½ûlþé×ê(ÞÿðÙÕþï„êûHòðR¹Øùíô‹Í”Âô­z/ª½3;È|eº¯Ì ÝÍs›­G·©ÏÓA‚°X{ág.:upe²ßÜ^êí¦û×_3ïþ?8ÿ—ó6·ÙÚÿY£®8DO0:C-#L–¿ŽÏ-g8|½öd½¸<Äx¦½ÏÊÞíóCû¢Ý#\5Èt!C—b(UߨpõgK4]©¥õG¨sଠÞÿyé\]‘B¿‰šPt£BjH#xÂeIÞ 8ýÆsbÏFEï$Z£RçñŽY|Éݲ #ÇÓ8ÈÂ(¸öX é™…Dì^”£ž.ݬJìW P.˜üÖ7&‘0²šQ…©Šˆ+»V _4+ÀF3ò®µÌzݘc±ÀbTlYÅffczŸ(¸=w›kGT‰Åó:$f·»yx~7§»«ÑusyïìÍ<8¸U,ˆÈÀejy8Djj¤ÒýYÙZ'hî¥ÁdÞRk L€õÿ3ØÊÓŸ:í ï«÷ô)uãÁˆss‹õTÄ]ÿò…Åš¨‰(l ŒÉðK8Øü1Ì=XzEÄìå.—“‡¦¯6»P;$°uâÄd¿ºís‡NÖäþOyvðä¹4FR¤Ų¹òw9<ò:ê]~íå—£„ ´ÛÔê„gxãCœ~,Þ꜋ê·/+iÛ#®à«Ü6Î5ISxÒÃTh,™¨ÎÝX† ùzY›Møaâò/C?ØæÒÿp@ôhS+ D‹ãã5t‚³‰X#Ç^œ8$/ÿ­’{÷x»vg@„µçž2?Ì¢oÏÞýÅ ‰¶ŽÔ[HTö°"Ö²³ƒv‹ì.õV$*ã³}+I(ˆ,DÕìB*ÛR[ÀJÒ  ‚Ñœ?ÈÉ'ŽR«ùŸwÀ†È!b‚ì `Ã,âD\¶Ô®ÖŽ‹Èù¦©3^\ Dä‘oìŠKËÑÍ.Õï\£áÇóKxè0ØÍcÚ¹'AÝÿí¡#ˆ:FpG±M#TŒ_N\Œ9“"Ч¥Ù®3âèŒ2@¥I·öº…`”d`¸<¾Ë| òϾ±ÝßZ®nîÑVýr–ü¹WÒã4dFÆ:av8°fÐéo¯rÝ­ÜFO… Q+JCÎwøèË,'¤—w“¤ßõ³‚+s„Ê+…Bý5qø2­ ¥ApÆå¶àܵ(8ñØõWþE&XÔáÚ¡q›‰%â™+Sýرx¢NèÞ¯Ÿ1!”"ÇÍÏŸ_ÎÞ4؈9}l!UùH~«_®iAå«¿Bäpž8ÂÂ>~»Ùè¼rš¡».…ÔŸŸÉÅ0î‹c KÇÎæ{ÿãÎ?2w(5ŸÿªÁ©EB>’‘ÿ †?~sãvßùàoŠ#BòCÒ Ö©/æÅ¹_õðåùL6Þ=p*~f±ïoqqe³ž¹GgQÅ„¤J±nЖ‡ˆdR°(.å"|%ÞrU´XÕÝW™ Âì3÷ïžG>r¤®´'Yy^7‡/T§…P­~e"5ÿ±¡ív2Å´òóÏà±'Ý>¿¡¦ÌÏÖØ×òTIàXñv¼ è P-•ÄC’ñ>¹Lt.5ý>)”<ìÆtT Že>ÿÝ¥Œƒ4‰Q».GÄ$ʬ‹ÐY ìܶi]ÔGê;£©m9Ðôñ$cÁ1»SvPð±Õ;"¿Y\ùÂ&Ï’8—­5ÁÑËm´¿¶rä}Ê`tßAr`&øÀü¶#IÀº Ò —¶·‡ª°Ù9œ“­~f!Å̘ʯÕVTAØô°ö`ßÐÞýx—VµB!BDõ~)‡¥)˜¡ÎÙ®a¯pÙV~7:…öÃÔÈáT cåŒÚøÊ’Cš5=ÛÜËsç…A"Úˤ°”¨cx=ƒ^½Ò›ª|1b3 ÃA¦šPJ¶kh‚õk¬UGär땆 «W l«rS?Kž~oõ„€cá—ørrñ¶& ŽIdÿaM.Ï7?{þpݧár\Ø­CÈ,faÉ¿ÿ`†õw›dîÛ.Øg£me%í9§Ììœãÿ8¢§ö­jûëg³éoï«é0†v…ýà#¥ÿòa]Xéüx÷oöÕc¿'”Š[þq ±ööG°ü8pññè¤ó÷•žŠX›_Ö8Z>G./e.ZeŒ’r .©“˜ -9 XHY*Fî85­ýÂõß·mš‚Šbpì#J;n”fŽPÁ躔âB@Š¢—žg¸´™uå†b­Ÿ»ýciýAòæ»—yn„gTI!q9«çÐ’£NQ ì£2ã”|ŽW¢)ã |*¢” Ðp*TJ®À¤‘ÊbU]ºG`…a1 h2A.Ø×ÔÎæùÔõìpKh´5{fp@*ÀRÓŒ].:Ä­»ÇïïÒÙ dÛh{ûôc̈½ŸO@«‘¡ k9Jk¶$ @­Ó†n5PD6„Œp†£f¶“ RÎ,TØ3Ÿ-åÕ‚èì ß¾™¬ˆ2·vq_SWòHßܱ¢‚BëGÎ'@Zk3È]±9¸åÎFæªʾéX‘FP–dEÈyoPÏS¡ C{C¶0Ý•ÊüIÖ\ÏÑÄ6|xÖî°E}­ˆ*//1 ÐÏ}A¾€ Zª¼âÒ XþQ ætÞüéÓæÊ+ B2½bûêÙÙì¼o ÑÈ™ÙH9g~ƒÞJÁÿ¥Å¼|Öüj ¬¹ÿ¯›ƒ/ñ`hvçë]•óüœÒ¨ID˜˜ü÷¿’èøÑ}ûLï—;óýÃÏÍ5”Úµ²õw÷pî¯÷åaï‡3Þˆ"ÐRJË“¨L²æì·Yüºåë—O-Ä›Ÿ´ðˆfwaÐ,j4Qi¬†b ìPJûtè†1‚"BY‡aŽn¼>«Vä¥Ã†=N`pãž–3sZ’öÿ2D0JFƹ8HÚ0 b@×–ÿ¢›_t÷š÷»J¡ŠÔÔ+ðƒNôô™¿ìŽnÓhø®c¸M@3 ›aº­µtŒ“Õº·°Jœ\ÞÝ,8¶QBßí1Â~>U~`FBR7Ó2ã R à ĀoPPLÑmõ×ççÜùÙ˜œ@¢ RÒvŠÙÚô®‹ûΉì-Ÿfè+Ðë?’WçŒ{-¶ €Ë€½Òƒ¨Uè{}-ï„Ä¡RM]kµÐlÓ¨ÏÖ)1jvÔµI­oíX¤>™--àŠ^û*Àµ•l/øË—Ä Ã׬HÊdB‰´–eoÏlí߇kçÚÇt¤$² w–î ‘Äy晾¦¾ qA?’˜ÊÀòç’ʺÏR t„Åô£"ÕÝ¢´Ã¾‚`ÒqæaeèWÐtU6Àq>ô$4.HÖ=òž…­“ߺÇß8}Ì ±)òOgùÂ}Euo ºÕˆò"{kõ`¢¿B2ëÌêvΘâ7盹{r¥èdyN;3':­[³+Eþ_¶Rä?þœçV—¦åÚϸ•?yºG^gHîÎ÷ztê/fÅJ÷ÚkO~+NE”¢RÌŠ_„ 3Ë×èèC†ŸÑ×´ýdíZë$g[ZŸÚ‡¨”¥û„@úÊmŽ ˆ VF¶•®Í!š+g Mä+ 0;)¶0óXC+64)Œâ DdYù%­"ÔIúgÇ%ÿ4Ë0ÛPŽ>zäÃweæßË¿ÝÌÌÚ†žÙ\iÖ|ýF¥²ÌqŽ[0OÎuâ¶§‰Ukñç§OT ,±'P!+‘£Ï¯öòB,k0Þ""iĸæÍÀ8²\R¦¤`ሀCí)¶ØVt¥}МŸ|:òñ½*¼ ŒpŠ‹Ywd@ô™^úÒ‡ÛØatþÃcOhÕy=RDV‘)¹G*:‹J…SLj„Æ9!ŠÕ ·g"dÔjdlÕ†Cã ®»Ö” U˜Œhl‹F§8 ¢6ÕÐÊxL œö‚Ò(bT8q€¨£(‘þ¶º¤W¥{AYu6ŠÈÕòo†’ýß@$µRØÚîoÙ¢M£¥Š5UEvŒ·/R|wïF<ÔÓ£$-Œ&VW¥’§òVPÚ±ÖolgúUÏþ¸Þ^{ï¾øJª@Ù\>¾ñ|ºû‰@¸ØO ~t…”ÉÌgýWºZ¦Ë˜4ÌnôÏzoî0éžÞì<ÞŒ‡¨”¢Š`ÉÎ9·÷ýuš;·EŸü¾¡Ò—Vë)BBfûöO^úƒÈ2ï~üñwOÅ)áx¿V¡TJè¡uƒßHýù¨ Oï=ÜŒï]S8‡GÁ ®A4œ~¨¦TYXy•#I ýóo|Ë!‚‹ÄY)¥rÞdÍe¶dµ9¡)°,Ù[OÍDÞFʳžÂ kÉÈ‹/I‰ý@ŒãG¿ påvžg7 M¢½<ü~Oÿû¥óÿÖ³Ô¹ˆÓ{щØC=ýÙ…ÂÎZÝ)fS²;µ>¤S@ÞéUiþJûüʉ/VBÆŠLA¥ âíi2F­„UR3¹€Cg:…ŽÙ±ˆ5»4s5>†Dw½çV[^Âë|‚êø ›î¦ ¢×®žºÝÑÌ:X ÷kžù÷÷´õ:ãÔZ¯>$wÀŽ}oB)‚D•´qvŽp+ç!GZØ.š3»£‘Du“{Á·¿ü² îÑÙ~SÝ[i‚zЌԢ Ëå|'óE¦Â”í@rf$ÄXmç,f´màCŠïÔ†rxŠ5‘¢%»g…&Ø dßÈ$۳Ŷçʆ„(ªj|ŸôY&“–2þr #à€Ù싾 ÄIŽ_é奈AƒÅÆÈ™ñ£,¥þ¸Šö¨Ž o6#}ì·‡Ž!)åö£æi¼²«“/ÍÌ©Ñöö>~äTJªÄ‚Kyz< °ûâW5µûða'ú¾Š.5;pXGJa´3;¶Ååï÷ÕÒ™ËÉðg—§Š•gæµö2RdË£yŸôw&ÃÅÎk÷þ˾8Uáz1Ä9xÉ[k¿…+`ëÝ¥G¢Ñç,í¸ÕìÂÞÌ™UJ©*„¡2SOƲ´rˆ€c;u)vž)7VŒ-óâÅ&2Ü~eélC«ÒÚ5ÖeÔt–#‡Ø‰ÎÔgÿ÷ié\ä¾ÞÞS*¦æ+‹?¾œ<ñbç§kCæâ nÚìœön(’ J&’§gЬa†j¶ªñ%$\r™ÏX>ÂQ8ûÀrZ9„Ãâ#ܺ¡É˯‡ì…¿QÌV„”©n!6Cžº]X n-¬ÃÒx»úm+ÁÂþ;´·,ÉÃâDòÏÏÞä•c€’¦Î¾ÛozY`ïC@)@º·‘æfI'¨xf.ŠˆVÍ8i4îeE¡b-h¥©î¶e‰£‚mð\Q%Ǭ¨r`ÍÖ uµqP¨·>µ«j >ð\Gˆ­À°àŒQdG,Q6Ü ·µøÊˆajÅʼnc@„t´+"% K ÚBž«^«8©¤h LyyœëŸ$¢*¾Ë(l7Ì ÏâˆTK‡àÚ2ƒyEÁTǤD?b ðÄ?A9Z^>Ë]û…áP[Cçï?Wï]Cá™ÞàéyRàF ¿UI+¢àY*Grþ¡rÎü£ÛSlÿ(]wÌÒ½û³5*xE €EbÅ'‹½ó:ÇÇΟv›?ß)ž|r:Š‚tÛ9îÿ·»Ôú߉åÑö¿Ìü§F] x— M¸<Â(Ë9Ùû7˜V‰ý`ôá [í¢;÷´÷k¥P—\\ñüJ)ÑР€*»èê­ÀñÕ0a·‘°qΊŒ>ï¾8ëGï$(X’Œ)†"B p‚¤ý½˜DrVär–çÙº(Ñ:NŸxüòO¹ùï›o|4(²[{zzx°Ñ¤2ðEF¹l¦mTj‹¢#¾FŸ VÊx„¤‚”"ñ8!Ëÿ0åï(+Vòý)­ Ñªû¶kÂŽ5‚Ë3 G~øÔÝbkj¸¶¼ÄÀWg¶©~˜JÁvh5©_Bjïm@€uëuW{&&ÕŽ`xovæ§›_?hAä½Ý˜ !Åkg?‚¤óÖ2!öDjÆ6¦RÌhgD1…F·“‰¥tÈF°mTÖyòžpŰvW¹s|ÕIU%%¢X?-Í”Ž £ «$LxÝ2£¹£oϬÊÎkõz¬‹0¨NŸ|å?I_ª7‡,£öNæL–û@“8¿ôtÁŸ_Ú|¥´l0ˆ1™Q®1êYÕ©BE¥i€&ŒQQŠJ{ù‡#€HP ŸúpUz £ûizöƒã«Ž‘sÛÿÕê¹ì¢C™ªí~R |,!)¸óö± @Jˆ`Œ& ãF¯ËÑ?¸ö`õÙn$ÝvãÚH· ÌÎ"l2;Ç.7?ø„’ÓG×Í•…„^x¤® …1íÿ–ã‘¿jƒƒõ>ûª¦”¢*¡R³ ;A`çÞìà‹íœ6>8±¿±sIñ­u¿È¦úµ'bò™µˆa æøAQ@‘ä Fq&è¸lËØç«qeÞ©Öê^#Ä~~RÜüT»ýûãH£_6ú=2JKz¹ÑuÊ–5ÕÓGþÈúõb;Ý6¤€”šû:ýݶúÖ©û?ïeÈbú穽±°+ Úžâɬ·jK ›¹1rœÊ­/è”LJ0”*¸Ô@pÉ…òhÊR_í'íá¶(‘–q‹@^€°õCl¶`lèvXŠ|=Õ7¦öÉùåC§½Ô±.œÛ»QÏæ¢ß_Y:M(xÿÊ™-y´niUеÕí_.ýa$ˆëŸEjd„PêxÅNõQNz  I A"’jóT[!àž"ËÀ ΪQflRƒÌØRŸöU~ØIàœ+f¶ø 0Þœ¾'­)ò,—r gü]©C*„¤Qlj“Û^ÿvía*®·ž²ZXµ€Â^O€„@­z1SÚ1®°NÂn5…^‹¡òºchÛÆÃÜ¡Á¢›gSn×)àzÌÊ#ÒªD—Êß…cboéõ¨0´lÏD+ñ Ýÿ·oìl|‘´â—ÃsÑÖ:Q¼R\¿‰{e–”î‹ÎN5³^pPÏ…ýüÍš¶¶·çzq±³­jÂÍÙ¤F2VI[›õÿÛMÝ8wöètÿ­·[Péxš("M€â,ÿþŸ<ûÝ&»ûåëú¸ª UÎ`˜$9‹÷ÞÆ¥—¬soã2z?§zmv1£õݹi51$ÕÀÇq\g$vÁÄfC;†^õ(ek(:¸n3³Íofºù\“@Q‰çõï-OÃê˜G>Zãxêÿ5m³wGkµ½{*å0ùÃåŸFgþÔþàæÐ9ç¤øÂMèD“7—û1²j=šGèwj ³DŠÆ0ÂjФ¨ÌAr!ØÄ³(8"ìDʉžŽ—’$œ¦µE2”‚Å:k ˆ„Ðb;;ÒíÛêmÕ¡X‚% =ÎÿÔFܾÅ•Oà ~r„/ÀìQÇûXÖ¯m­´qÿ©Ìœ¿Ÿ)b$”Fú ×Ș´ ’°å¶XÕ’ÚTø®¸b–x6ßÉ §aa8„„+Q|‹¸¢ÛÚîL@Ý‘ ›ÎQuž…õõKY&™ãXÇzW€Ä›™Ñîñ„oº//hÒÞT²Ã.| ~(HÓõáÌ(–-&ÒzE@£&ÁÊ—ZE;VXï1ÓÛÿŸ±±mÕ»˜jcµ^-G£‚TލJ‚vÐúMUy€ó¸t.3,¹T¶°°ùIý¡ZADS8xÿÐ ì ðÃzç÷FIó9húŸž~¼ ±BÌ–~Ô°fcvÙÏ·êyrFpWÍlÝh½$%÷Øû‡˜YòßÛ¥é3GÔ蛼òü¾$"òO³µæ'¿GúÎ3`˜{¿»üŸ—¤ýØ%Daøä b]þæ_j™âÆÇfôÍ{JMO³ýÁpþáX)]а$%ù°ëa!bØ%¹Ás}¥¢V(­‰œ@.X\¿L|zB ìAˆ BÓ[‘ŒRr#@QõúŸŸfø¸Ó¾aXD×øá§®ß$ÿaêwo `f,níÅq÷á¸FÁ åÿ-ëfÄŠ×õë-šH•*¥]å ¸J†/“KÃÄ'Ì3É¿¥Õ¶¸$H†?¬H%õzŒˆ ÃÌ„ãÐPn˜œ“ÊÝv´7}½$ÜzPëòâ4¢§F œœ½>ßJMÿóîÙY’OÜ‘ÏY=ËŠÀöÎ8,ÿÔþã“lÜQqÎ’Ne› 8œ_Õ¡Ïü€Ñª)Š“”yÃɈQ2Pj~¯W8¨'¹s>H{œýRÆ5úwÊíiZ›mÝÍã"Z‚= €$Jœ§éD 0D[°cvàúÆ!™¼°Å.Þ?°"w÷”ĵFÄv5I)º$­P,àý¸_ç®3£"[!ÑÁ|T†p™ÇÌRZ—+¶„s’Ͱ¾ìzˆ&Dz’<‡PùÜ¡Šˆ€’’b»•JUÆuV‚¡ï<oãBE¦ßÝ;o‹¸ƒ‹Ã»WHÜ“G@YàËw¾Ù®!¨‰ø¹jìHâŠ?G58<Ë#^áTp2ŽÉït(p9¬åü‹ŸÑÒCÇWÔæwÛî±çfj*ü‚âxï¿Þ¢æ_ Œº?·ÕNÊ»ŸpŒ¸6öúy<ø£áû Ç’î{VZz$æÒ°]ÈãÓU kµèª lˆXËE±h‡ìÛ&5ÉO µÊã[=ùå¹^äXž~¢–öÂõ*ܶ™Ghc`Ë€õøì·ˆïÞ²™ÜDDI½¾ÿëê_6â—ŸÞüÉfæDÄA¾{“f׎4„¼Í+𠸀n¾ ¬QGš+H8!Ž@„03öúŸ1NÉ @ʆ_Jæy‰càˆÍéD ˆ`߉cJSÃÀ¤\èwQD\žo·Ö÷L£d÷Vv1>®Â6Ôÿ@§³õ¥M®ÍÍ ‹'‘HíÜ:³µ)ͨEË»£»Ks}òèãÌÒ½>JÑgšÐ-•æ.>J¡G‰ØuÀZÍq}6Þ@Y!X‹âÚñn7s*Æ1RÁòq‚™‰ H„­öjw‹@£þÌ.%l“‚ÂÊ€"À-g-"a”¤kË vÅo§Ñèz”áI-N]$»¾#&F²`é`®Øgƒ-S5\r J.T¸Ê¹älã8µÀ‰ÛÑš8™!EåPoÒä–Ö%н[&êüR˰ Šúrà˜ÿ¦qú7O¯ D’÷úwŽÌô =‡£zZ¦žòLý~áÑØa)Ä1F>ôÇ\0ÿöBñpÛfòb-'à-¯• w0€unôÆoY;vl¯ÿ<‹ù‰G± Šu÷ÿû.ïÿëE,¤¿ñƒ“ß®§ÚiòßjU‘{Ç·cãò7‹ÚËÊñçÝg$þ|›t»½âòÝÛ‘˜+Z+~(×]Hâ8H™U##£”(›ð]ठ0LQ±úÅQœsÌùëŠYTH„¤U !QsXH©   ¦ñÌ_/Èðb·/ùºŽµ®¿rð·øð_ÙŸœ7E¸éûŸãb®&ZqÙ†³ÅA·Y'YO Vý ¦Ç¥oBÿáeÕW4±~õÄeqX&U–£€PDجÇÞC6[vNÙ‚Tð„ÔØAM­Í`t7æ×!ZU Èø‘Tüp]kËÚLô®~Ñ ÿö º,K§SbûÃîš;ȯÅßl.îïIÄ5¢À"*T©ˆc (nãT“Ppƒãq®p­|'³¬.¬x¯Wð`NXAàl1³V_‚sxÀSv¼ƒÇw[ ìPr眀Jê]”‚™í0ßžN‹/Ò‚—J±€DÜe â²r@HK.»íá^nˆËI†‡'óºÆŒž€h÷â$°Eß ©™uœM“e©¾Ïê/OÖ|aÂ(NÆMU%Ž7B¥98¨@®¾ÿÌöîsVZÇ社 ÈéÅâþ'üð1Ò˜o¬½²0EcG^8D ¢ò¶³®ÿ³¼•ë¹¨×æn‡@¦ë¤Ë¢°$–Šðî>C}âè±Zöþ›1¦/jDš•¨|ð¯€}'eæÎ­Ÿ¿òL¢´W!VëoF`g>º§ÞoéÁ…cû£íONÁ锇WM=k=VÓaÉïð[GD¦Z×id°WÃIiår1_Ùú.ÚúnfÐy_óÊñ†oR‚'Ü[k¦³Öx„ÈŒˆi£ö'9÷ŃQ&÷@“äÓÏnüϼù+Ÿüº3qìTvs¤ex*ª!z<¡0 sÎZ»WŸ¾O#äU¿rzA ®€2¨°J ûÄüõv‰í920Éyñlº(Q‡Û‡œý`@¡7}Ø’  EÇÖ®D‡Ñ­xÏ©#^„@—Ü2é•Í«+õO»/ )¸¾bã³3u‹Û®Ø½7?{þ£³›[¹B¡éxsZáÕEÖÊçaP °@Vª×gZ"À÷Gïx¶³W0¥Ñ°p~ɉeòÁD0 ˆX³ÛÜàãÌt9}3±‡ðI ÷eŸB€ÂBn™‘F™€&'âl¶[ìl¹\}9J¢¼[V“ã¼,ÔKƒ ½ÂYcmøH1ÉAás,j tY¬à³ý¡…¶0!LûM¹RΕ|BóXí¡+JdiNBf)ýD Uˆ„0¿™;üÖ“ Bš Ùºx ±ÀÒ>+ÃÏvIšÏÇ.ßýíÊ3iäS¦ÊÚÓÃîD²³Ö~ö–Ö®5»Ííö‡$.E©V>@ÇßqbÝþÞ ¬Ÿ£8_z4ÖDT)¨¹ŒTSð8Bd ä’qQª• ©j ¼ÄÆ÷傃Î'ŠOLaØö{aðÔÀ*›$2ª¡aÁZ´ï›æÁÛs{kˆÀO}ãðû¿Æ•?£}1y[çºe¶7½š*”ÊÄËb]!ÛjVÈnªœç›Á 8N™ “OÅDÂqIQ™Ð6øª—C™ª"Út³€Pf­ˆ8ëØ:çÀ1P‰EÉ‹ljgth ©we §æyv2ÉSyçÈ­)ütmï`ü¦>§ùý ÞÄ…§#êœÍ»w¦®¾uì%â|k”À|oªÔ"VD>L)qCŽã¨¥Zu =}«P¥p‰ëg…¥ØËÁ#¤£ Ë8ÛRºî2¥ïO7€6Û‰I)òë â÷("=²BBRÑ®C$#Âìì€oÑcè>¯9^m"‚ *l¨©üC…ˆ¤¨]ϧ Ä›CvƺDÁDi¨Ub‘2εrp9µd±¶0Å\c/G¦*û¨Ø²2Á‚2馜ë T"o‚q¶!2#Mîø‰ã¿..öÄæ¹»{kU£ˆÌ>^'žz9ÒÊŒøüⳠžP©–^áŸô¾Dvë¯I:göa÷¾EáÕš®˜Âš@˜;æ‚¿üž£}'Z‚[?¦öñ'gãD…ÊܽÿÚWûþßû\¡‡;ß;ð­z¬”gE—;¼r‚ÅÎÚ­7qÿ“š–ŽªáF¦p5uÃKƒÚ >Ó&ÿ÷8´¼åPØ'ài4’dJzØK^Æ9¤AÕ+PþOyB# s,,Ž‘Í»™ÄϤ¨4*­9Ô&:F@;£ÁZH“öß6öÖÀÝÉ£H%H'^ÜøïýøÏŽ~ò›~á+uËâ\ÿBæ¬Kiìúf.pÍ.EJÖ£>Î.2U!ÑcÃË„6Ô;| F•íT™±UkPNH)lÕãÆ6Î’²"¬ÁxZ ²€ˆÉ·§ájkAœ»¿¼‰µC ¨ ~ø–ž¾}tãzw=ºùàØ"ˆŽ/æ'>}JÜnŽb:Ûk[?~sŸØm›Hóp´éR#p| 52¥hsQºÝJ§Û 9)vN·û½‘…4æÎ…zM¹Êü-QìLnë¦ç™ŠÝdV}GDJýL ؃ìëÈaÎ÷:{'æžË¹½€Ô€=×/Øù¼ýj‰vÓnM­ƒe[äÁˆ) Â 4?ÞÞ„èœ8Ïý%ÅEŸ²¤9@}µ/ϼ¹¥Jr’ñP'lóX vÔËÒ¡:¤„¡Ê¥ë¯~ÉO3"ç#wÛás¼÷±B÷ð1QÑÿòê·Z)&ä¹,Á4Ã%9ßÙâ­ó1ICæÙƒ#Ì®Dà…â ÍŽœ³…}ýב:~ôÄœ»ü[——ÏM'q¤I‘8{þÿÉàðšc»ëÿðÍ—R­ªq•ˆ{gÌ›£øÕØÚ:OÜÞTzº~\pçbLù™JGŠÕxÉJáã!äM\“ÚJc]Z ´ÛOTYUqÀˆÈh†w¯iyx)ÒÁSŠÂ›zhŒ`*.i¢¿ýª£½›ÃÝúýŽÖ )Zøwé¿©ŸùƒÍïß”ÛÂbomƳ½3qZ1…êåóÃí´ñ~-ä¥ËA@V™ÄKã†\ùzgq(5YÊÇU¤ôw„O—PG>ÿ‡â5£Ò…eŠ}Â3 b1j_HN ©+­MŽN•‰õ¤qÿÔíEØ;zc£;9Ø{wñ¬C¤íKÇ7º”Ù-ˆ9ï>hêÿ`îßÅù^·7ÀÓ‹;C"‹D{Ǿ«ZBlqÔ¬# í*Ƀ}^¢v·k¬$ñ0·åp‚XT(ÌCƒ5Ýú: D—Ó9 C›‡„ä©þ 6†°cÖI¾ÇH£Â²°3Ãat³q¶×#P‡ü§ÜaƒÇ•“B汫»Óî^.¢ÇÆyŒÞÆZJF»KPâgý¢ŸX\ûªivB<]ùpq|ù…KØ…áZ5ÌV¡7€rÑëÃì™C W¤mÌÿåèê'ÏM *;̯÷èÓ¡ì?eò7$_¯XÓÿMë…(&/÷ª°&ãu33;éÿx )¡Æ¢ì›jaHq&€Yè[„8µY,û-òYß4·ïR 6Šæ¾}ðÍwdå?Ã/?æÂ^ýå³Ý½BõÎì±)ª@ÈÈ’Q0×b»¡û€+èµG¥¦¸T*NDÏVèˆ`qÂ*›Ë‹CÂL¥B×@@ûäK"g2Ç@hüHBÂD…sÓ¯ÝÁZè*둊)8; ¿–o/?¨7ÎìÖp&ù\=£þló¢ÐÈ"°m®ï›}çÖSÇÜ^ÏdNíÌcÅ&(€ÚC¨”¯–#`¥flÚT"ÐÝŽ%d¥°zU-‰ñ}8•r1ߌÓÏØm7·†5Ë•ú.Ì4üL‰A¢Hë2Ai„™eÇÐŽX‰Íaagz´¦NGƒ›‘£Åû¢ÛƒÆúñE‹µnkÔ'"ŽÃ!®c¿c äeW&üÀ,7Ä)³ƒ ÔŠ"RÉôCÆÔà XSBïŽÂq{X™@ÂãÂÀŸ\zî|ãœpaŠ[ˆúÖ ’§ëýÁ§öì9!4fûÒ×j;áÙà¥dláʇ …Õ> w@ŽÌÕYK™H/Î9cóÿó¦ŠÏœ9\½ñQƒ—¿¾?&9N†?üõ=«ôoÜúGâ’k5á¢d6®÷[—¾ª˜?‘§µû¤ƒélc±àÛ÷ÓŒ›Sèéã~PÖYþìj‚¥¨ ¶>‡·ì Æ\å1g±ŒYfSOC„ÞÛ Ï, !y5¬2:5E }íÿßÛ.l8È®XdÀ8yøéµôšsðó׺… údv,ÌÃO¹aøñš ¹€‹Ì‹ÞîÌ¢@ÏŽµÂ‰½OhÊp"¨¤'ãÄ’ˆËõ_¹Ù¬òÊH#êf+€¢p†…Ù!ÅÄ"Ö1LÚRÑæÝöVï@ƒq{onf#ò¶gPt†³Wg×ÄïMO_¿{rÒ—vù’è=6ý;|°óéWÒáÐö-o­£¡Ó‰(MˆZ%ÀŽ¢Úl4ÓFAܲ®°ˆJDµ²NaŽ c]P( –¼Êð~a)êt®WõæVK™nÒ˜•@S@éÉ€2¶VH+Ú圠€¹~~¦aï …Ú 2æX Â)K@ó6IûÍNNÎZ›—=~DŠÊ°†çÃ!Åur–Ïâ!NÂ<´4TÇ`K+UiÃÇ« ¬F²aôWÁ³<³A bùB(èÚ+N¶ß{±ˆä?=4ûÁËM"”Üí°]9±jÌ[$ñKu„b˜š¾œ¨1W˜1„í@HÂΚ_vìµfðÀr PyÝ5s0Ô0³-Š»ÿ¸«§Ïž9˜~~¥É'Ÿ›Mã8ø~ŒÝþ‡ÛÐþOG•¬óÓúŸ.Ä*w–jäRAÍÌï߇§–¹zýÑ8¾{q.^EØýB¥ùÜC5¥t`*+,k¢°.mŠs˜!<³h¬rOʼn˜ œ`-‚ ³sEçs…‹gI!é94gà MŒ¤À”þÉCNÝ¿åºööIÅ‘Û÷jô“ëÑ·_ì|ÿ~^ŒiÂ"öÊVRMjž"ìeüÀ¶H¶¢y‚aÇ8¤¹dœiÞålÆM¥‘Qy:W@Zß6p™ _ÞˆHXk×H g” ÖdQ”[Ë:Ãýfñ`fAȬ·6°µXv!4µ²Vœ½³!®“‹§$Ø»uvwQ±%@(®¿»±Ðúðü3g³mÈ ™:½ÃÄàV§*ÐbÑ´N¦š"ˆ›Ú ¬+Æ9™ö­ãZ<0&`òp"1u¢`Ûwzk±ԩ禽„\I™€¸ôâæX°sVT‹væÎ± 36ë«ÍÅE{¯CR›€=ÅÞSçÁ^ ˆ¤gM‚Ýæv^€X——§eB¶zoÊ‘ Òø.Æ X:U8fAú Ì%DHˆj"d.,«Æ[*‘`•QRÀÆ™Ð{n¬Ì òù­>Þ÷8#Ù|oàP'—ïQüTTl}Ž*;ú)(zw¾|n¹X­8 økHØ×FÖß$Þ_‹º}i<:ëż³ èÕ(̆?ý»jæá“Kt÷'{uzê™ÅD)B$…ÂÅå¿Àê_αå|ã'§¿Ñ ðqÒ¶¯kÅî½Ç ϰ꟟9šdoTZŸŸ“âf7ÍäñY­t§Ø1Ë{`cQ1æ>G«ŠL¬YÆ–YõK°˜ˆc;|·ƒÑcsޱ裻q%ï°…DT[ò蹯ô®f#÷`=ÖJ“j¿ºòû_¸ÓßÅŸŸ‚6*,ÎYáî%Õì/,MùÏÕølÙÈ=µ,:ßV#5;#Xi°àŸ'hSøU¢©g‚-Ž\È«¥T(Ia­]@`hмÌÚ.³ 3Œ3VüÞIéZó0¡»0ÕÅø´)P ðäÔÚþL9uû éÇù£)¸ÈPÜG.ú÷Ìú1~«±m²Ü«`­ ‚Ô"ÏÀÒ:ÁhÎÕ ˜] i@`à´‘õF#ê³op*¹L2Ĺl¯uoz©³ í÷q³bª³ä®°à-©¬¤ó”af³ÅwëG°³‰Œ3 ò6{Óx˜(Áx¡Ynvr_¾¹€ãŠc&…ÕPWpÒ§-Õæ¶$ ;ÉwÑÎc1¤™6éŠm“«ÿj'(_ñèàøò‡ÊVæPån©†ÎoN}ù‚„ad€f1œ] ÎïÒ¯ÎRäŒù}üLœP¤dÌš˜h[@Ø BQ¼u'h!×F{æä´òÂâ˜ÉÍïë}çŽÏÁåÉãèëO¶ãȯ£‰¡øèGŒÏüYC\‘ŸÿÍ7_HP‘¦òª+[Ya¶¯ïF/¤lß{Iá­;¤f˜âîÅ‹GI‘"ô{)1 ¨cAupø¹åü¿ülh‚º0©ì˜þpÍî_ÔîÔIT!¾”âùbÔu®k0:ùש¸«»’+N%µH7^|rí‡Ó»ÿóŸïæ–C$™?‰Ù™ Òcµ’ÌìœÅ÷dU»Ÿ PïW~e¥‘à++ÀÒuR*OH5höÍ(3Tù´Jcÿ1t‘3ǦpÇÌ,αßL”À=WŒLëNr@}2e Š yØÞY¾Œ/aÛ»µ0uíîÉEGQü¹;ÑGz–l¶scföÂ'ÇÏî í€]ó`>x8V„H¢µˆSzZ¦Û¶GªpŠ ‚žÕƒâu ι;Ÿã‘sn^;ÖÒ{o ´¢#íÈž%yúäL„s9Pc@k®–UV—œApœ)VÊ3üÖ{LÚ-ËkvÈàzŸ4kš âÄÓƒ\ÐR•:ú‹ý¯¯ÆžÏMˆÉ¡¯Ó?ÞHÿè±Í¼›ç ã/ X²{ilÎHÊy.²s®›ÄtëÀ•RrÂ.ÌóB¾,†™rypYpB…Ã傇C³LDi”zìÄP,‚8¥±0ÎQe9 ;a1y'½›I7A x±Ž ”V§·õÔý3·o;g%¿¯WÌûSu׎’`R÷D\Éû›½UøýÍVÞ˜ïö%Cà#mP„(Jƒ¨7Óz`=¥§ìK£èe qœ9b±²<†¦/üv^o†-XFõ.)Ÿ¡¨)®¥®‡ ò‚©Dé]g¹0…qlfë«Sùça¿#‚š¸›Úé°ÞMyÝ!8'¦ í¥("Þò6žeçxüa§ÈÂìl/ï§IgœÄõª™»Tì¹ñX KA³Ÿx†íNy×c˜|©Íå†Û?'̲÷ÛG³[/FˆäFLn9ÚzáÉe—ß#‹ÐBâîÞƚ”ÿ!¤Ì°­BôÙ2pñÑ}D†1q. œÃ îŸ,ÑÖ¿¡`¦qJ¢V¤³©ÚÜcX †Ü°C2\Á•Bàç½ÙÁæì¼ÈðZ{S–gÁëwö¼½Â»‹×ºŠw6ö%oª'j¿;8Ë.Y$…èpÔÙnͯÿòà™=è €%ºÁ™‚HÌq ’êSkÇâî£äbÅX ³ë;¹`-éKnübBaµ¼q¥ß •²Æ{ƒƒÈ°}¼Oû ØW›`u“×Êqî  iÛC«Â'ÖåÝÚÖÔ ý`«‚ì ……:¡‰ Ìk=³Óìïi `òaæ7æB1(-ì"¬ÞƨŒÔ9È7E\7Íã©áHÆKW(Œ0ôóë8¿Ñ™ÿ–_uRȪqÕéPJéQž…á—ý?=rÌÙ®!ž]RŸtpîŒ)î}®#³ïiq£ëï?³P÷#MÈ P€Ë³‹˜…m÷s@¦—Óž-:æå™‘®LìÀΉ°á¬ÈþþSyè\}ðã/›úø ûR­5‘Bãîþ_¸ø_V\áÌÆæþC;R¤A‘RöKÅÍ‹øèjÎï>TS;ŸîƒczŸs£˜z¨iR*Ì-Êz…gŠLS9ËP‚BÆ´&þJ5™æC÷(@¸Lç=ÄÙ'4¡"¥<³5µ™;1mh ot²dë¶FGZÕ^:uù¿ÛÕÿcêýŸ [Þ©ARƲó1ÌôâS’ŠåAdó½æŠ`§ ¬¦ªÊL’‰ø4†XYCEÁyua%?G•õŠ [5-(ndD’RèNå®Ôa– ÖÂõÛêîÌQ!¾8ÛÅÚ1P1¢‡Ô­C뇒‹3"LÍoÝ?¶Â¨ñÓh™O*ð9£n°¶»ÚxmókS8 @„k¨›§OGŠDǨÅ%ɬkÔ5eÅ^©ÐN†¹1NcáB(8¯TsNËãÕ1°å©m®¤Bëz [ûDŸŽ†(òazP2 *%#ŒÈ.x Åæ;Ù–= Ù-rhs‚qODÇ `U¿÷D¥ä‚C~E2iâw“¶,D"@ò¼Vf}Z„ŽE€vª)¬Áèk0hø-2 ="c„z‚?¸Ô<ŒeI›´÷o÷n¿¨rækg±ÿÁ×ê…ýt[¡{uµÍÔGͯS$¨¨ŒÏ©v~ÎÌœßÞ”™ÇFC!=º{à¹fD@,ÕŸ$oÌaqnøw·TóÌ׎Lïþýåºzøé¹TQPý€;ÿ÷NÎýõ”q.»óÓÇ¿ÑÒT½ÈÞø(ì`ôK™VxðÞ“‘ùxiqjUÁÚVlåÜ~­"=ž—–¿1€jöuÛ‚*4VùÂOd,…nºJ›õ/Ždvb7Ÿ›FET†ŠO§™Å‚fyg*%@¸½eht •$I„O?;üÛÍ?=¸û½ÙÈ#ÚÇ‚JÙ­,w:¡°^Dç2u÷ d;ÁìTH´A™è«‚oL8ÅñÆvl<Þg”Ó½pÒjyÕzV°S!LRr–ü&Ç>#.zܸ©)EWgrÆ#"BŠè䀮è\vâl±aæðíÚ9 îíÏ´‚2Ûå;÷¦öï¼>{F\`ên)8D:¢ˆ”Vè¨ÞJ-”M‚Q \mî[‡qÍVÆ´.G_gß®7j]K÷ nÙÓ)"PÕ‚.nlÅû/¶3'QîÊu °Œ:£áÁ{Ï¿H”y5eÐÛ{÷θ8ÞkŒ D¦(¥×ª:8a‚Þ åù.c[‚±6n¿Ú-°ÝªæÿÕVÆáîRnÇÿõ8éh ŸˆHõ‰”•‚ 0€1¿G?;{ØB-ËÅÇføã]XyÂÙÍ›ó…c†|w÷½g×Iáœ]ŽšP²36ߺŸ#ó™Æ6Önž]޽_¦Â”8vlÙYwÿÿÞÄÚ‰'уÿy»=õÌl¢}·O£w~Âôò«‰µ0úòWßy µ ¼¯Lyœ“Oïë–?2‘º™`~êrçsÑÙ¡c *¥ˆJ€‚ˆ8ÀÚžB]¤Ö#Â$5\¾š»TÃÀ;q2|p‰ÜþžÜD€2£vŠpJ†ËÖÖzƒüËm…bAzUýäSúÆ7²ï]ÈFÆæoduÌÙú­(Þ=£”ÖPý¶U‹¤’’FÆR[…JÂ’ô:ñÄ—×eÆ„vôÁPjϧD*€ô ﱑæŒKžÒB{ý_߈Pû—Þÿ1Ÿþ«ø7FÖµ"@ÂŽº—yz8s Ä(€ VoÉŠ¹o@´ŸÂ°”(Å„QÂß!åOûR°)å†>ÌÃÆÂaŸ§‡I3ꛂc –Hluz”÷ìlgz«»Ò‚¨ÓQCXj+Âåù; Û­™‹C`fÓ_‹gÖoî_ADÜ q=ùŸ‚Ùt×ìÊð Z­u •[ŠHÒGRLÂQ›šÍH\ú)Цö2#E9Ø*“%ÐσYd—.@ì:õM·ßì,÷q!ÕÓÈFœ³™ˆ#éxˆ¢ŒóW3 8»ë6ãÃ’¯“~"H|>Šd¹9WßÎ@ˆ•<\ò6% ãoãï(©4ñU àÁ5ç:’M‹ÉA¤^OÀ#ø+«p)ovd)›ûIC‹ŒcAÇñ£ãš`b­ Bæm<õá# $Èߨ~ªÞÿpGNgîú »ÖS©R†‡çÞ§ôbÂÐTŽå¥pÀ½~ŸM9¶wŸ>#1(*g™~Å,ÖXøâû}U?õÌJrþ'Ãzí…‡‘ÖˆJ‰lþ·[8÷׫œc¶óÿù›—#´'W­´ ü,b‚(ÍEs‘¹o­&Be"e3Lÿ¨T{1†X4`aǃ[×5Ÿ>BUš­Ú>¡šiÙ'N81w÷†¸w #Š¢xöÅ3ëÿØ]ü/³·ÿéA>’±¢¡â»!`~1«år–Æsb±#îögRàûzÔaÂ4ïÊX_™œ Oƒ`L§ÅU»Âg„ˆ¤êÍØ7u}ôp B$v,$…Fž(:EL_Ùé%€ÞÍé´öK¤":F;Ë7gûWœ8.6ìbñÑô9Ô1Ð(£sÓeÆ”Œv7¦fß»3µØ€[Äk ȉˆQ¢€’6ë {#q‚¹UJ£š’þÐJ`Î °ŒG—JX=þãu¶£úÃÕˆek¶‹« R7•¿Ã Ø‚EI÷ûŽ”ÉYÊý[;M{<núÛ‚€óÅ5©éATî0ƒØ²( ”Œ UXÍîaœ[=ÑNEL†Y½^ô$n&èÝ„4!†­8—U’”aùQ¥˸™E(#ÃeÌ fËï=þ€^Ö Uqyq¿ºyã§ oäîÉ9­d8ø8~9‰(¨iËiTBdËfÓ¬;dœ'':Y»ÚüF#ñ¹4f9v,¶p~ˆ­c-F½FµùŽOGšˆH€»úß÷èðß,ºÝÚkÇ¿ÛôüÀ*÷&¬Ü?/gWÝÞy2Iw?6Ô˜Úß6ÅÅQÃÆO·Q“ ©,¥ PâZᛸ0RöqT’ô…K%àD¤^øÊ |RD ûŸZh=š(¥}‘^ÈN·õ1béïöet5jc´r·G„ t`Ž$f×SÀ]t¹`FÅÒuŒdƸ àâ‰ÿQPÅê`—÷Àm/7‰î¶À|Qi@§a'ZˆX¶ÂN×v &å¬ßW‰kG½bgai°cÅ$‚ÁnŽÄ(@­º©õë°>xærVV#k¡Œæàj?±äJãf­ùgÆçþ]Ë^zý¥£|¶òç °y½˜~aãƒû´ûüA«yÜýÚ¸³•7ëRu¯#@RKO|UÛT‚€ÄyŠP(¯ÆHBçSGyôå:ÑãsÞC‚za/kMP °×µæò^¬I/|£õÓwÔ·¾¯½=ÈlSæ={“ ‹Û»¢ÚƒE Ë6pà\´™,‚ »ñ[„ ã´´ñ /, DÞù-Á€ÀìûN»Qƒ4-àÄ€(M¦4 ä#ÊM᜵ l¬ :D,™~ 8sQFÄip¥vúöŒé¯\Û – ùÿ³õß_–d×}/¸÷>'"®Ë›>³\–ír]Ý]ÕÞÃ6‚ù(’¢(q$j4OKOkf¤™5µÞûiæ=I”ž )ÑÉ‘@h´CûîòÕeÓg^gï=?œsâÞÒ’0 6ª²î8g›ï÷ó-:w[ë7ެɲ*µ‡ã.GtØÝÉÚo­6‚RÂas PeîjT§’¬–oZ*¥T–å(™ ËÓúHJŸw c¨F¨ƒø\.¯uT΋ìöô ٻɷ§¾ 50N¦œŠ€A°='Äe/.VkéiÜÜ5…A ~psÎ6¶Ý* "磰L‚„L”üÃjÈF%P ´"^ª*«äE—e[ìL– Úµ­tÞ8> |¤@H°Çj?1!4ö!L¦ÆV U¸xéÙ;ð¸!ÂONîK?»‰Í—œt>ãDGÏîCÒ>Ô—RCЦêE€!¬ÙÄ3³óŽtÑÏ÷õBÿù–‡{Olª †¤Y)ùÏ_E;÷Âã3ýï¼ejÇ¿p¬$üÅÏ(ùÖSÖ¹²ÿþû¿z*ñFqSeݨ€HIïÝ6O¶œ¼mžWÝù!kŸ˜)¶>*³rî™6Ykâì!ÞšXKê<2y)>7Q—­Ú´TŸœVy$Ñ Eà“·U™Fç xÜ£TooçmÛ^ª+(Âz¯ÝOl–Pkù—>ù³Ñ#3ûðO¶¸¨Ö1Aý%  ,ÊÊç¹–kÄ£)]¿v/ÝÃÂw³Ž6—‰‚2<ß«d3Py ÆQ+9(VÚOœœD‡1"!‚™®ûÊj”çEÁì¸$«#a",8>x•ˆH…G»­ër¸póÒÈÌÑÖöÂZ ¯çâÄO0òÏyÉ}Ô:‰ˆ‹Œµ»¹y¼  ®s°’ý¨Ž09¾æÀ>l‰ â6šFAóŒŠ@Í–´19Å& X|³$Zù8½®@½JEÂPËA{³¾PêNÉœ´É "’ÁVÍ?NÌΉ82®eÎJä6"å.nÉáZgFxK¾G@‹RÔ:Ó£dp‚E,S@b` ¿{4„cßYœÎAØzQ­ò ÈÝ"w Y¨g„&î}©²‰á8h0NUŒNì°Q%Üjˆ*ÊJ†~Áãÿû¢À¬†ÿb¦qᙺS€’?ÑS2| ð±…¼÷é=H°þÕºb9Üúà‹G[ÑV¶ðÝ  ºRJn™5T´ÓƒÁîÅgk 4AàUѬŠ€ó‚™—ži޾ÿQjá`ÝZð˜]èÿîûÔøíÓX@¹ùýÕ°”š@Ÿ®rÐ@¥,¯âÞgï\>Õ´ƒ·Ö(š:*zç~õÔJbl‡5“»ÉÀš]ÀT=ZÜÏaP[(@¥Î‹ªªj‘¿ÓÇä™&Ù018]Õ¶ý”@u[²zMSÛhùÔêÿ±;÷÷—oÿñràªäV¬¨|ȬT^[MÒ‚&=ŸÌÉí·¦¼Ÿv!}ȆYHùWq'„ULwUÈø53N %Ü<þ‹2Ù\ÍŸC( Å)Z1±€:©.»€™*xÐÆÝ©%0ë»SXhÁc£áòúÉÑ%Ó©*ð`mOãýÑcu1s"íþMÀ0bû”u0,]›»¹ÉÒÊñZ1 $lg5¾ç0Îõ¾'¨Îíj7X¥Ç"ªÀù[O¶ðXfHÕÝ»þä¾pæžé\!’ѣǸ×yžÎj¾i4XÍ‘«rEÇÛv€]Gˆ­zt¹÷•C>Þ(Ìœ}Ï#""eY–2ø :ûÜ3³»ß¹Ø´=»¿aj " ]û·ŸãòßÝ ç½ï§¯mã'÷**Ì?é§Ï§2zoîL†ýw³Æá)Þø@M¾ôxËk1Ê–P¥Ww†ÂaI†Q €t:îÂãfu"s‡Ø‰ˆhçþÇF:Œ¤Àd‡M‰¦öüqUfÈeëb™bŠÖ<òŒüûë­ß:¶óG܈ÇÖMÕ‰¼Uá²wÅd½Šèeî6ó•åv³kô0yןçЩV2'¬–³Å‹¯O«1cLv˜‘%hMgþèØEJ 8P" ¡ŒHËAòZz#YAàûs0½—Èœ^Ïíí#wïRt©to.Ìݺ{øˆfm)ê‹´ù0¢!Ténò>ý›€¦Èîßñ½Ïâ’!ÓTÍ’¤•! ­™²ï]1‚É|¿“b“¡s@€ÄH¼‹ñÈTÞ6;ùÀb£Ý¡£†Ð ’©7lx:ǬhØr€Ê,â}Ï[Ôb'Ýž>Ü›½/ò€Œ.•JÝöv.êãn9˜®-(A€¶‡áK5¢‹¨J Í;à¦Mw Ùtf¨ Èöéá™!D2b|,dXhã 0Z~E`0ÑÛi$ˆúß;Ú¼þ„ŠrùÖô‰tóħ׿Þ#”ÚÐÒm½÷Ô Å”Áè†VòæÀ9/wÜÐ ï[P€¬¶;ºûÞü‹mëWl„ÑM*ì“âànqá+O6oÿéÆÔ“Oï«Ù$!"¥Ï¿£þæ°lÝúî‰o5  ‰í„÷aвn¾ 'Êå½Ý'¬^Ø4vjn?柬×ß—XkÈÅú  CmŒjõÜÅWÆìu{5ð=Åy`ÌáaÑrø^õ—3²†ÐÚ©}ä+†y£ö®v“„КS¯$ÿíóõ—ʼÞu£±-;tNqo¥â„/º:Wªˆ²Œ¸³9?ðINyÉÚñIUxLϺ eP-²rk¿ºÑØÖ “Ö ¯Vᜊ ê3ñ¨„ØzÚE¾¥[p¬Üù.(.kI†ªE¶Íâ騾×W4ŒH%/7K•âT]2Ñ‘B"ZÀ¨=Uì"¨.%BXeAFcJ5Òñ<9pHƪ¡ :J_¯þñ"<ƒòóû¶ÿ à®|¾þD?êàòceyë*‘áÓ§ bîΧ_¬§êßãŠ=£!*HDU\Þôɇ%"(>¤EyáÊÓÇëD6¸XÇU?n/™wÿÝ%kæ_:·¸þ_ïÙÆ Ïî«'Ög‚¾ý'D_øZV u.þô+O5R¿ñ¯²z…»å³Ï¡Ùºpb9-®¾¡0]¨AƒÏÀ‹g²6'žNˆ4%#® ­2ŠŽ*>î„18¾eã“@EQųø×o`ùèkŒ%¢¥¢ß:óå6CÙE^ëÕ 0¾1÷öÜã¿Rã»[E_tò Që>=E@»×7S¡I€œª8¢ÖÀ^ú°4mq¬ã¨†Ã•íC«ÀS@@Á Z¤`„á-x+$(ªÍZ¾r¹8æ2wl(Aÿ©.ÓêQ-‡Ý¹;r¨Žr)(JñÀÔÆÞÕý|¹p¡€7\­7ÞÅ£ÓË kïíËïÁ±=ê›YP–áÆÚ¢½Wàô–˜[m  ê©¡U5I»ap0ÂÒ ˆ€”nÊìJg2±ˆ •jr[¦_ܰ–lÌÕT¯f[0k• ´Ìøÿ?!ûª<áŽ*Bî¼`Õÿ)@D¶ûýÁJ½" L*4Mˆ†7Ó#*Àl«_MIYº¸ŸQB0hÀ§º5‰ÊØr^-›PEXTJî5¦dt!µ¾Ú6•vãA  ªx³6N<¢ìÇ¬êˆ §M„ªjF?<ÁOeH:¸×÷Iî|lðå”»Ÿ¹D]íź׿óÁû3ˆÕ|H8ªôת œrì´·®[T}uÉÅú“>tœl#™EÊRºÿúC‚¥©]ÿ“ͤùìãûê6±†€K.¿û3°¿ôœ±ë¾ñÁ¯·†Ð2þÄc¿ ËWà©vá^Ké_Ø dfaÑ•Ÿì&Î>;ƒÖ31(ûû{f”‹rªˆRiâU*ñDõùL~;1—$ gE€eÐùaái"²I6³¯èínÞ ¸ž¡›·T(Ñtñë‡oüÁÖáߘ¾ú_n»cãU¶£¿.T˜‹¦FãÁ¨¬¦ å6õ ½ U2úðÅê$¯<áÑ7í‹N .1ñËM®g Á45Ë@XÕ(;VÆ”+m±V& ,]§±ÛYj+}Þ›áCdÏ™õ£ë×TÂTyx¿>scýÀÊ’¢{wzñª´öZ]UõîÈ|·‹ IÇÍÜ$½xÿ4™ @’F ¸m¨_’!aâaY@’ä¥ó–¡—ãf*´ËÞé-¨ ,Û°ÚX$s+ëƒ' ˆR»aüÓ›°VDÈJ@ªÖÇ"¢ù&lÏ-ÀH`º–ú¸lÿð(ÔZ®9œ’U ¶RWö½·)e50Î-güŒW³“Ê}u®ËCÛ– @ÐfÛÆ8n¬¢uÜÂ…W&äÿc᪯ËcÄ6( ’_.{Ž`нŠ½×9ñ龦•C¾Ú=›é;==p¬(oÜ2 £3Ç h‘¿Y"©#R¥"‹ç— w¯ ŽvÒzí>¡j‹ ×Ù¸òüÑÔ:& ÇW¦"Ì|ûw/‚,~ññÙkßÞHš/Ÿ]Nµ !æx¦ÿöI*hØÿáè×öU"ÿᣪ‚”®ósÝÿd)ŸÞ;[Oyí&Jkê¨ܾd·rºfLÈÜt€é]–¦«›pØ– Fèp5õ *:–ê5×ÿ¸Côü ™tyy·ñ¬ÀÞÀèm 0 µ_>³õï>Ÿþ­ã›ÿéÊ0i˜ÕF¹Æÿa¥á'Òxb/ŠâœKîë "¯NuÐCî‘j^IP}Æ&Ä"¨ª`'g•­Ü©-Ô‰…8Ö$5DÊ¥‚%®ÄŒ„0Qá‚7ºÖÞ§ØëOoëR3;Þ©™îÒmÃçLyÇ.ã»ÍÓûEû76ú¬kÎY"kP@e´{¯n{@j¶šíó( Ó‡ê€jj©ȦºœŒÓ¬ÝíæŽ’t Ê€…ˆ¸1Ü9’“´ì,l$²y4H&±I„nz8¸±;ªG<Ñ¥)(ˆs;IN+(,¦&bn¢…¼U/šƒ·é»-q%‰€ Ú°¬‡ {.Lˆ2@Ç)´ ªàzyfµë´=ß $KcK[œèªTzŸH E¬DÕ Š¡Yãt0Sö*Àƒ°çVJ‰4¼“ÁO"¬!³;°h}˜Alà4/ XÔAY«éÉõž]ãF ü‘WÝúóI±V‹É¼•†Å#̼ !X&•¼—PX~lŽ^AEE—'ÃÙ´ÿó‚N/–ÅýNM¬{ô! óŸ×¾dX-ö½ø èÐAD@ó^¶+ £7z¤Z;P³ƒ+oŸz¶N8™g¤†ã–ûÿò~S/ŸÍ>ý³a2ÿü£RëOI‘‹ÿ9dz¿ÖÊ‹¢wçÛO}µm€ŒÏá‰IU‚÷ÞÕKüÀ=ŽÔ¹v‘tjêt7.,Ÿ&õ«þ¥ˆ3#ÕÆ(…šPASuyúo/ÖT~>ØùT¥ã…‘ƒH1xoDö\ÓfYc)ÝÏÈ}!÷€›G¿”üð§ôÅWàµïïðˆ)DôÆk5tËÑ,=º÷¹OŸ©¾ceq¯»8°[:ÆÃ阋ˆ¶r2)E|ŒO~ yоÒ»ã¸Ó¡ 5Ú>T:*eÉ¥8V'ŒÆ){=“¢E·œúÜ3BWZ9&GNÚ»‹wö®VØDÕíoÌ/ß¾d x>lÍ7í'‚aYD”óÍëI½dä™îð_kãQáh³> ʵ:ÀÐÕ¸4þÊ0ÓÜ:ɦ\áij´IÇ©·ßç± JP$×þ½Ž[´ÁšV-¥Ð{õ° í+Zdöð·µ"n{GÓó%"€5)zA¨(ëŒ-’nc{W„U•ó"ÜÎL©pp­SÙÚýÌ©âÓû«‘Ä·Q» JsÓÖúµš1M,Œ«'´¢n·KÚY'7Äú¡_™{ó?çç~£ñá\uƒQ#ú¬–± ­Š*«0 >Ò๖È“33HÛ<Äù¢j­[U}þ‰õ1èž÷#cÔqplÕ(!º Úé°”ÜF§Ä˜—,EŸUÁ‹ÿüÑá°¢ \vÚ÷˽5ŸÕÀéñS£Qcuïê}ˆ¬|DU-ó»f)¿’Õ éñ½ÓW]r2õûXOtèßêM×P]zõÙk4S /ìÃ:¨Ök@IÙ7ˆ€4G²(É¥ ¬W®0'‘” ãxlA"P)KÐát èz­ Ö"¬×j¡³QJ@ÚÊM>ô¸[Šg+²“rˬg{rUQ9F6¤È3/]Ó«÷re#€À»ÁgIÉb ²Òx**RŠªI”2—2_H¥cuª•‰1^ÉGãK0¬:!:^0\ê÷‚Q ˆåÆ>UYœ¼žî€4±œç¯5·Û¯<³ÈîÂ@n'ý“gSôÍÆW ‘ø‰†É™Ä §-Ó™móåA,S õí…/¤ñý{‹ˆ%ª,Î9'›ÿû%«³_~ÞûA?™}þñYk!Ep£?þÄÚ_yÚ2èýìü¯Ÿ1ªHdMÄfˆzñŠyrª(^Ÿ>A2¼õ¦Áfý¨ÑíFøàÙÌXc©‚ ƒ™²ÃVé02]½07HlÿF©§F÷³"…Øß°¾ôßR˜~>kN%§@}JÊÛ†}Êjû¿¶çÒïmøíé¿w«( ˜àUjeéQ-ClJy­O4^é!‚p!ÉjcÌh£>€ìU‡)†FÏTv¿HW êÜŸ 9L˜FBDcÓåiÿ70KQ8R*X˜`$Q7äÜX‰+ïÏ»…y2kL¹<º=ŸÓü§]‹á ÅöîBãDʇ:øèøÎ}<5¯D†€@ Ø¾ÁU[­58²;¨[¤ìP+A°‰ÙáQÏ °¢µö¨ï„êv nLÆÅ0±{Àê>=Ÿ‘¤Z`²¾Ô¼]ïÉTf!›Ê²°Gt˜&6«m²F¡½‘b»Âr ûRò˜: Œšç\­ã@ D€âÙK©c‡–4(;aÊQ½Ñcw¿*Šr¹£½F6Ì5=z:²CÇüwª’,Ç¥Ý$+~pì{Ž„wð„‘|‡ Ë7&ˆ —£Û÷Î&zq–—åå[ó%›ô¥Œõþìb=@ü;Î4Uñ6_í4:f~´¹‰Í Cƒ+«_:V7HfâôókbevìØ¹Íÿðy"³Ï?=õö]²øücû3$›ª"uþýlýÖÃPb>øNÿ7Ykˆ‚€¥½ ‹«^í±dBH¨i ÀR¿Iepû{Te"=3ú^ãÄ~¬ºs˜ýAæŠk›FŸ›MšÏ/)bÑÏ·Öšš»Ôμ|ôÞ¬ø»+[ÿùrÁA.cªÃxžã§ù¢ åÆj`¿’ç[9.k7Ì+|»ÑEsÌF Eò͘€Q†ÇDZ`¬”ÁD"éRêŠ|ŽA’!õ3@Ô1”ÞïÕ»u¼;u˜`¸šv`q~ui³ÍJ¥ (òèÆÒü.Òpdô“Vó"ì9>öÞ›ú—)(š¥Íâ l‰À£3 šd¤Š£ŒrB0„mÓë—šÔuÈR£cibůp'þZ•áNk½½¤¸»\êt† ÔlÖ’(À1¨dk»ŠVkÅA RáÎn1šm ¢Èô’ š#Q²XäR¶æ¼ì¸ fU¨‘jH˜|ûqÌòïB€¸]웩|Spz*A@c¢``ÜT¶ŸÊ¸1­Ã=Ǹ”é™ÒŠ:‘H‚¡«åÑêFÅh^Ž^=r·^#û2ðè]÷³ÑÉ 2¾¥Ïã0²Hð¿ ƒº­d‡æyk•@å‘=¹¿ùó™¯Î`LÏŠÞ-ßy{$lYpëÿÔÊÔŸÀ÷˜'{¿pr¹nüþVþÞ~î~¿ñ7æ7{.šŠ°ÊÛ»Ùó)orxÁòèæ%õöÓ[½e@:š`bñï ¡&Ù@êÐÏd$“«­íD`N,Ïel¨ ó?ÌQÈû¢L?Ò~ôETàAߥ¸YNãH þÒ?¸0ÿ·éýáë»åȉ—íå‡*ñ·ù )LBžy`î郰šî"î£*¨&ˆ¿cÚAµrõ’“0ë€1.Çß&ds!BmÐD&U@ ¬àdË~@duÃAÙX3+zsz€5;j¯غ‹,!€=@²¸%{ä.RoðéÎáóÚã„„Æ—\–×WQQuAû³Ó[E G–-€©!v‡ÒeòÐ$lw‹\’däX̤SïBô—’Tk2Uµn›=ŠÃ¢äö<J굚ñÃ\„$³Œˆ£.–…V[v­ôù:êàN2£ öƒêÝi(`q¦lÆlÄPR :@@²HãðæjŒ¯“³åÐÑ‘*ˆ¡ ©rGÔ̶)û£ö&DÇ@Ôk¢_âíõÀ¶$þLa¼U¥‚(ðÅ]˜2ˆZâÇÝs‰}w[qrqmߪ½ÒV(ŠÝ‹/Ígc«9ˆT LU ·a¶ô ô×€›_®)¸Á'Ÿ<ñPf°ÚL g«+0³+Åêï]´8õÒZoÿ4·{¿tzofµÂï~»¤S¿1çTú—¿óè+ Bámà^ž¿ñž:Æå[欕²óZ—ê³+ófôþ(åÖ³³Æò©»¨ Ó×i‘ëX2BqˆÍ~Ú]å° ŒÓ·TÕ©‚²(ù•>ès}±É"y¿Ç©vÒºîÚÖ‹/ŽþäÝÚ/=S~ÿ'»šÆKôÆO@ˆQÇáG¤ãÛ+Fi§ÜÛ¸­»ŠKMÿÒD¨é8Öh&Mñ7B¨8ƒ!&¨Òe1¶5o|iÐe߉¨ÁBDI…'©ó:¾´T‡Ýé{î`ªziz¤T¤õÞ¾µ ŒQ}±ØË;Û+Íj!`×OonàÙ†ï¢A¥tÝ«`4[ÜN÷íÀ:¡·YQ“¨l%: Šw´í¼S:IÒ¡Þ[aH€(ˆ/6‚ ™ˆ¢Jž­Ë¢Âp »Ÿ’všŒ¶ˆ©)9j÷œ uy“Uׂ*ç›6‡¦Oœ]NMBä“ëIƒF¿kHv>)°X=E ~”ågcõvØ¡8I®3R:å™YÏmà|ªÂ«µµV;Õ V@å Ž(Ÿˆ›£Xˆ Œá':çò÷N.ÈêyL^@é]˜*®ÕÊaîÞi¼˜Yÿ+¡§F+‚0$´¼ÊàŽ>ŠTËwÜ MMÕaäÕ~XÌRä·ÿí%£ž¯¿ýÓÂì}áÔÞf’©hùÝו¾üÍt(Ü¿ôî+ç,zèñŠ0¿6š~ôÒíÇ2Ëù½÷gÚ‡êîÒgVäÌÁ”¬5úw3¯}—é0uL±º‹µ¸œ¬º&ñMa>, b†;kVö¿2ù+ /$¯Õt7=óRí¯^…¯|Åþü»›e1Ò‰üî ש¾¯ŒUe-Ö)ªB$,LC¹;3f§—ä:7kML´À‰ , ýx'.h!:Aã4@ÂØ €¡Æl8 ;ÄN 2(`^¨Bê88g(,½1šoÀ嫵Ábq½ÆEc0¬Ý‚p`òJ8)Gwgæ,€sðþbz÷ Ÿ­ <¼ïG!Ÿ‰ãbn‰ÜhvšÑ"Ïw ;ÏP9Œ±"&ï«Í–× (Ƹ+A¬€Á †‘T€ïÊì~¹äMsËŸ—|v™ËOú‡/+%_¯ ÈàÞ'O7,’1¤Ö]­—X”]Þ¯wšúF‰žŸ&tÖ?~✠¨… 1(³ˆ»R\q÷w> ¬=óBퟲ]ùÒ™åš!2(8ø7~éqë»¯ßøÓÖÄA|gâå«ôbÓ .YÉÜhóÃ&³{ký­÷ÊëÏÏ$ÆZcBá0ËCæ< q‚ޝÍXDŸV[Œ^ÀêÃF!«ýÏ(cU( Ý60œnòèÔ/ÔÞýóáK¿Öüô?#öùlUÆË8ȧÂó¨ƒr‡| DÓº‚ÍÍd¯ÑâÞÜ6 HüÂ?U@‰ €¡‰y€V!Ça",R R6ßÔÚ¡e§ÊÂh3WZ!ßÍ‹@ðDGƒ™ã~{Л§ds`ØÅµCÅ'ªLɸWTÌ?·ç¨$HÎŽ|,õ'ƒ•´y}GAÚ­Ñ2bÙA„ÅxÑZ¿¤3 ªLÒ0Û£²TsÕ„P¿gözïp}Ç]‰·/ëPìàpføžéã¬5ÉTšÿÊ©"Z 6-û â@Æg}àÏ9áήŒÂú¢~À*Xò£yl¶òÆ 9ê zÒ¶ªe¸\mJ(Ü+Õ2&²AÈì >DDVî*/'Ý>!ÂT+1h¼­*á4{ú_#tÉg½a@`óšÿ÷¢A:¬1`؃šÅm±Š}ÌqQn]~ªÍ—®âôÙ¢üü“åÁ-;8ù°‚æúæì“™ (¦@ÊŽne7¼›vS»;…âÈYN¨·þÆèWö$d0:zÕÃ|!íTÙ‰s«ÿüb¢æé¯ÖöW…]úâ™ù4MÓÄîþ«ûfêWÙþ¾û;‹D&6w*NzoËÞǔ߄Gˆ°¼ù!Q{îð[äÑ“Æcf‘€gCn–EƒKåŠËí¿ªH:4m3s™Ða”RRb´¼×ó’zç s«h]kóú×ç/ü‡þٿݾòï®!—  ùØÆC0M Á0¬] jc/³@•Qýš9dAïM­¡}ÈOýíjtI»^‚Jõ·Æ+¤|G"X²Ë™Wªº‘sP²P’Â"pÜ&b€ÍŒ9DÌNî4ªvî׆`›Gº7¼ Οžl$ùîÆžiÁùTv¯œ¸»gkÞŨÂêú7}ۺ಩áÜ:¨ÖÖFh  ™zo5wj²\Yâb Æ"˜€Æ )2?—»ôv{VpmoIÓë3µZb@YD)µ”֥˖¤dD¤JÞªH¨£ûIÒépÓZÅxÒâ,vÒîÔp(a¢Œ¨eéŸqÊÂZ¤²z­Ž<ˆ"Ò€b@Eîñ°U+wPkSu@Tñ1Ô¡±C©Ð¼''ÔþßŰBH’‚ ù­E(ŠÙ(ÝC¸‘ülþ4 ^gzqŠúç͉7K‹_iºÞýK_YÊ*‡¢×ÎÅ`´•nÔö¸Î**ã7fÊáîO^jyŠ"ÑSB‘3ÁNœq£ÿ醙摯.¾÷#Gû^yl_#±ÆÒ•ÿ8„ÿhÙ•E¾þÝ™¿3m‘,E΀Ãk;择ܹñt£Vpÿû;˜-<´O‡?ω§ž1ÆB%ÄÆ¥1p­<è $®QØôBI¨H’ƒ¼©’‰"¥ÆÖd&ñ“ˆݕξ¬LÛ{õßnžý?/¬ýÞ§åN'ü:6äFWX`Š2$~Ñ>-fÔ¸«GSÒ›¸x¼Z)WšìÈ1š]Ïÿ£ N6LX)hX k(="Ê…øá±aUE,£GºXkŒբߙ»F‡…øþ<‚q»³7úþQõ叢Џþ­éLunIQõµ•ìšÞn -‹»¥(gF†­MAÏÜCÝ”!ƒJŒHÚîNlš \áèc‚Ü9F …£!¸Õï'{u}Xhm4)!H©@j’^©H9c8¼&Š‚âŠµ¡¿Ü‘åÀl ýE„¶Ž¨_ëæ~/Â¥„ì `$@ ¢*ÒÍ 'ð`QÀï׺¢,ÛnXK‡=T»ÑP”âv'«›\gÐÎßüÃ݇ÿÎòÎ}Ô*a¬X€¸kHìfUda wUP`7¤~>W¸W¦¬KMCjÂÉ!€R}”Uµ2æÒUNýïú¨|¢¬½~œQ‰ ¨R (±ˆ°TÒ…±¼&À(\ÞoÞà àV8œ¥ËŽ™Ú7ª Zæ÷kV8{ÐØÏ’å+Ò:£^€í¯D·;@µ:7h†8^¼BÙ5#F1Òjwûyn8GÞÞ„8&¨z:ÝûÄ3BüŒÇ¹ÝÚ}\@Ù¦>L/4ëIbý.Ïå š6k6ÙuJ‰g°b•«T×€¼œ·a¨€¤3bÀ57œªˆ€ŠŠ(ÇëÙf#GCL0aÓ¬BÇ…ËM™4‡P]ª‚ ŒjŒ_m”ª·ñ–]Q)˜J)Ĺ*û­ç‘†1J8P"A~ãñ) -FÅÛ§öÂîÛÆ<Ðî§­•J¡/'ìÊrëÒKÄ‹H)†Skh±–ý‹½…n±gH΄{ù¥Å/×*h5z·! °cOÅt.gù³ïÁñ//^üq—f_zt_;1†@˾ð…¿Ñ€Þå7_z¼FJAM‡¤Âðê`úy€‹ƒ³dŠ2íÔeížw 7Ïβ‰°§ùr³ÀzÏU¢ÞJy;v[Çð“êl [õ‰te›62ÉÒ/d¯ív¶²FÝt3lüÉÕ£û`þÇ?Ù,‹¾DØÈ;Ç*É+T¢*À䛃𵊪ˆ$ƒÕö"P§×ìêì’Úi"‘Ö_1&ÅŸÑ ^3ø9Eƒ@„†h®ºõCé©(T 5Þÿøºá Ý+–šL÷M8ZίûóD² t´´'R!Óýôèõ®}$ñ` ï„,·;†PótZšÚï¹:šŽF‚,¥¨mÉNžCÒpÎ1Œ³öôèø]j fKáQÖÓe€Ý²f*mÔ²ÔxWɵ4«Á¶ –%G³»¯ñ(ŠV¤Üqª@ƒHz$Uƒ'k32åLºÅ¹7©!H> KQ/ó'(Š<Þ"~@à+iv®_2ÍËÀ€L73B4'×Õ>–à„Æ»‚NSÀÙ@ ¹%óCµß@1YD™ºÓ>ŽhõýÁ¹^Û¡ãû ù¤óØÝ«µâÔ9$¸7—ž­‡‡×‰T*&a·¶¿€¼áJ,·3n%cìßÿìÎKGj–Í8ù²Y‡(ܲ( 7üÓßí9ö ‡.ÿå.ͼüÄB+³‘zÿé%¿üR"(·>ûކû<<Î}|Ë<[ǵONϦ¢åÕŸÎ-iñõKøÑ“)0—×Ú¤àªS˜ŒW $™J÷Ry¨ãÎÐ&5 “ü;ÇÅk ÜÖNn²&Œê PüàÚò¯+¾ó£-†OÊ¿ÆbÿkúßMƒ™Câüaìè+XJ¼]?HPÜÊ6°v ™bÉvý:ÆKÄ%øO¸"‘NÃŽ“ˆÌRÍG¤Ã®sN‚ÆÜ9aIüߦ¡Ò„±ÚŠm ›Í=h¶ mì[_÷ ª•Ó/û¤ë€îôŽ.(JùÖñÞm<±¨õ䥃- -l“š=Ÿ-ëU8Ï œê G¶1`V®Ð¨ z@_çªJ:jJ±×˜Ñ¦³”N¥ÍÌ (—!0½ž uEÐÑD}5Ç• VsQÐÑç–å!DþC„Ù2) n¨©np·ñÌ·4ücë/‚P•Ûã•y¨c*#؇ƒµ1׎P÷ÊÔ¦U­ã3°²y„ ½úõO¨ÛLÀéùq4…IM\#¦ :U[}Î*pYö?}|¶Þ€Ösâî\ß7óV¯–~¹.Èý[—žofVÇ81ÈQP(¶`·=';…BúI×”O<,ˆýŸÓW¦m(b' †ì%³23;)˜_û£Ý÷|íðÕlÀÌ‹Ohe†´óXÿ[Ø‚‡»?å_ß“Úpò“ˆŒÞÀÅÇJ~¯½bûÝÏVMº¸OÑ}ghdæÙECÆZcÈB} ÔŒ‚+R¢õR3èAþ©Ò0zŸ'%™%¡tßo>Ì*Ž°èŒ –µ…iÃíç~ã4ÿô;k¥ŒN»Žq=:ñ—þycÎöÃm£"ys-9 ÀW;¤G4C¢l•0ƒ[ƒˆ(°W¼.0zÿ'»¨¤$»dƒ$`—9ä®Ë˜¤ŠØ˜\¶AˆHw²«Í;É4ý!€ÎLÝìz]HÔЄgÒ奚ÕÛ3GÀ\Í–>Æöé˜å-‚âz=¥„ ÅimôªâT:I¿Egk;=ÇT3}uþ# kT`å4ÖBDâ›hß¹= -¶ mR£V³¾fuÌŠYbM§d0Ì<ŽŠWè¨RŽºAÖÀÁò¼5„ˆ„dдGIAnI$ØH8/C™nÒ4¥ ò¾3/ÁŠ_V‡ñÚB`4t<§½@öL} êê&¬?PÁ¾ÇY|T½fIel›Š².õÈ7BÔUèà•ƒ Rð—ÓQùÞŸhCÿ|rîî§vxü4¨ä£·÷žL*JIÆ*QAÖi;9R®ï"f;X1¿¸ ë=qÄçÈSH ˜´\z¢˜8‘²p¯þΣ _;}÷¯×°õâs‡æj©%r—þh¨{~k‰õ·¿×øÚ¬ _q 3ËÏFµg‘/í¾YÉù­AkKG§†w>·('OÔ²Ô&Ö¥¡ÓfipÀ6_œ ÆÉŽ *O@Kù,,%B›úÛ'49`›™<¨p5ý¥³òÑß*¤(Çoû8¥ DZ:Ví‰ˆŠ„ýN¸Â¤¥p€.Ö†RŸè‹8_ßSp/iŒÈðASñˆ¯~oˆl@?LÚ‡¼Ï¡9 ‚4`E eÉÕORyÈC龜ùÔ-sPˆ‰®ºHzcÄ`Š˜Ÿ¯FE¸wûäå¢y6E?SE”QÔ¤£\3nô8xFq4Â’\Ìvú9§M—«_ÓcV€‘ˆQ(Õl*äVs9‚ÕÖŒÊÎü§jI-µqU°@šÁ†!ÒR<íI*M¸¨°(;×A@ЮáúŠ%_Íq½›æC-Ù/ D1.`“¨.‹÷oÄÀb„-zHùØ›ÃNe£ÍHo@ˆÊ{k`‘°‚DDC½¨NÐe«7pŒñQéS£, c(©©ÌPÀŠL€º±oÔyÖ@¢N·¯=i“Ï/âÜ\|ºvºõóÜ&_OÁðèÞo´3@“!!Ì—#ÊA¶«ûeÐMkïn¤å‘¯!ñ`ð~­2a…«kÔcE´tœçüñ¿¸g]ë•gÖ¾wÏ?·o¦a yç/…þ­E£Ø»÷×§_œ… µ“‹xz¿Û}ïDðrç»¶>»÷ Þ-4ßkСÁVs[­Í§LÉAÕ¿R¥ÊãÄ=Råšõ! Ù¬n(Iêûÿá*:Øê–ŠRk+R;…& ÷¿y–>ú÷·r)s©ŒŸZ©j'ji?Še °=G¡R0Aé¤ÊœË½þl±¯4ä¥)Ÿ9‹Z•R‘4I&Ð&â° ª-Ã$Õ,VNm²0ÌNåHJE ƒÆ){y½?žýYä]©>Ëb£¶æö×q¶… XÞRÓ­‰ÐGBhC±ÿéèÔ” ><1¼Ï!?²Šº Q@ƒÜ¡,ÍËj.‚£TF…5Æ `­•÷K§hr—k•ŒH€$ €HJ\X=Þ°C¨\ºÆnmZtÇiyºY³¡àÒ)j#KŠ\mYˆŽgB•ºH¥×GUwðžL“$ô˜¶ò´ß,º^JL ,ýH)œÕÆ1 ¿q,Ë‹ú\Aueóf2ꢢ‘¹©b‹Q‰Z•@‘‚aM9 Æ0;Ÿd¢á Àx±1DhJ4º!Q¡ »Ç>yd6Aä¼øÙÁãåð…§Ó»Ö\¹!ãS«P1|ãСČgqræg yWÉ-@qÚx_XqèÖ×_?óŒ  êWaç\©:’Ïÿßï¥jŸúBú—70yö gj ¡ò÷>Lè¥_¨#ÀðÊ_x¤f½ž”$ÿQ¹t–åýì LÙå›ßWhOhç×>³¤gÎÔ2)m'›’¥½†cTŒÑ—4nÚâ©ÚÕ ±‰2dOüã㎱·¹£…SLæ’$›!À5*‚ný‡«#ç†Á¢‚³*Eø„'ÇóT$ä{Gb¨ªˆæˆóò;é¦i¯xNbà¢/8˜ä%ní1:€T˜þx¿1Xi•þft˜ ;tÎ +~Û3>²ƒ ‹Ûiwûs³nÙ u7 +yæ”*yM *`Ö5ëW—(~ØœùT—òøÏ(¼>P ´ÛAjºÁØÚßÍdä+דZg§dÓ¤¡ü7\m†â—(‡c$¡;àÆF6§´ÓØùÅVÓ_9±”°ž9(3Ç©V|—Œ rÑ+ù&‰<´ Jh€ «õmfÐ‘ŠÆÄTºøC€ÊZuîZõßc]ÈØN¡$-p”´[ÚœoT‰|X]èJ.ñ@÷ ¡#8Ñh†ŠÖ÷¾EªGÇ7nh‘’ûï]³;ÂBìåûO$ðî-<~¤¾Õ†~ÜúZ]™ËË7¾Y³!xbT‚вv»n°”˜›È:ç~~9-g_Iú›Wv¾¶/Ek M 0D¼MØ9a.(ÝÚJÎ|±þÃO{å¡yƒD:úýß|Þ(•ƒ÷ÞåaÅàòCÆó«æ¹Œ¯ßª(E)aìJ &E+ÅÄV%ìôª|CAQÖB 3¥ˆ*š…ºš«·Œd¨ Á8ÆUR¶” q©Q ÆàoPA®© ¼?~Ö*hžÏ?²ŒùÛš<´~kqnû,?sNQ‡òÆÃçÒ¨²ˆÁs H(0Ü){KSnK¦óêÝÓ'Uuxëõ½§ê)N"ýÄÜúÈPQQ) Ç%þõ¿qF÷¿²òÚOØåÜÁ™š±´ñ«˜üÆYd”â_:Õ "ºõ†ž<ê†ï\¶ È»o(¦{MËÚeCzì±zbÉœÁ‘Ö“TFâÁU„4aÑš$7Žÿ2–ÔHˆ˜$ÆXkèù¼T"®_í¦ùåkªµ©ÖÁ)Þº0ƒÆ¬þë{ e‰ãвâV*V ›j_GXé3hlÚC_8)œÜÇý@z½ÖÝÀˆD8D_þ •{âc”}Œ!>”LsŸß6®[u%+XÔ”¥dˆ"œÈx„©Pô¡v¯>Û8T0¤Tµš¡ñðu¯if0̦/ôÔ°¼xfý®yª•BªPîö‰æz%¤õAd/õ²Ä„ÈmgÝ‘SJuäœ`Ú#E…@ô¿«øæ ܸªàмÖ+öìqêÒy¼ºº¼Ç µÚ.*H)`=)NÒD )H>`mØþ1·Æ#!r3±É ±[J©âÏf“s¨ÂÅÇ¡q¨‚>CZ.ú’Cp€ 7:Ýë"Š ³ KÕT7LÛ«g2L|<DÃü¤šÿFÁ—Ãx`ˆcg! hCñó‹§®7c0\ÊëxÖÀÛ;xnºè¾X¾3LíË E—_¾õR-5UU B€žt,"ÒÇNkÛ, 7ÅÅW3Î~¹8,.¯}£aÃz5z”Ãú c@ž°+Kfçø§ÿjÝòì‹çn¼94ûŸ{le¡ž^ý~¡ó¿q•òáæ{Éø— ;~s”~õgxF‘ >þÄRkéXkç½]+µÇWµf K—«—Ú}2áºHõ+Ñž¡0õÔ’I³Æ7þÇEºz?ÏÊÏîpCpåÑYÅûõE±ëôa‡y8 Ї0ò¨D 0ޱqžµ.η+ Q‘Qv7?RSÜäÂá‘,Bk£Óÿ:2VgÊĶ¸â€—dÁ4l-ÎÎÅàÔŽp©( @$"Ö…‚¢J¤¦@Ü Ò‘2ÌnÐÅå- Yª"@~¨ZLUD˜2¸cVï¯Dú`®Áþ%¥ø =ŠEÞ4=Ô…2ÔcDf:-=l’›åN)šÔ†E“΃Ê1îr<µ«¼0­N,Tfr»K‡Å”˜ÙF-AUqι\Ϧüp¼4 ’,ÑÀ‚ޮׄŽ6 ©ïËÛ„Z˜20IA]™sÈ*0Æx].U ›¸ú6ˆ¨• •A/çYî0!(,6­ŸC‡“Ç4‰ª”ÈY‚16섃…  „Çr ã ÔDм|ufþÆ“)‘Ú¹ôB"kç±ù”Œ®o³7?´ÅéÓª»7NI ÅãØ'Ь½´köÐh€h2ú«û Ÿz ¶wßÝó冢O¤lrŒž«@‰aW:W:zóŸ_·Øxüéoíš}/?¼¼f)ÿü'¨GþÎ~(7^=ôÕ6Ùhµ¸~]YäíkÏ-KáíŸvM2{l±û# >r¦•54]°Ô%o¹Æª6\4–SLzë&úkD²Y-%´©iþÆÿiš¡øü³^cëÃûÒHDçf…žk ÿÉÏ"¥‹ëšjViépò/`BØ%‘¸ZÍìÕñ€ú½Å¶âÎ tvoPúF´p ü—WÕ“†_4F„÷M—á–‘–žÖˆ‚CW:/Ä °êx±¤¨ŠÅZk[W4ú¨µiõ~v¬‚/@Tnnp6E¼8:t‘§®r¦U¨\Pm3³ ºH•fš£P¿j£ÑÝ9ª'=`Yyc9EåéT8håwó Vš²Ý™L‹nÆÐÊŒ‡Ë3‹p@ZB‚ÊÌŠ@XiAAJU,†9¤sðùÀñÂ>Bã÷ó bh7 xüÄ…M(Ñ8¥Æ5euËTpáðʪy§äY·=0ª 3ó50aˆ=@ *T ©ò­=èÊO DÆÁ¡qST5Š !,ø³›|~x?(9½³p Ükjž™‚õOç¥WûD_n"F7׿Q·h(¼Ì=ÙªÜvaQøžS]Yû"}e¾D·sñê—§Œ”Žâÿ¨ »²te©Wþ??A‚S_*~z ç^~zßL†IùÃHÏýêL¡ZÞ{ï©§ê†Ð›cU‹·xᑲ|cßJJ"2øìc23û7;îXIŸ@lÇI›ÆØoH6±‰L“tß?ø¥¦wûódjûâ6eÓèÊRö,‰¹ò怹,ªä÷*¤%4€a´6Ž1aZƒLUZ4Fù1sÁÅvk/âðncÍÑø¹i¥Ô:æxÓÇÝ7 <@e­f„T;„{Ž»R0Ò Z™Ü*V蔨‹RåíúNþ!.M÷“¡(AÀÐŒíwçþ\ö6=RGÐþµ³·wð\ÅIHZ¬±@ÙX+æ ÁlŽcñ"vZ,",¹ë›é8®lbn©G"@”£ƒB¬·!NTDvÓÍæÐnZh#K 8š D¤–\ &r‚Çsôpu³(¨ÝÏ›÷³2=• !̉);à³¶ü!À#"i\û# Úé¤yê`7YŽ ˜¢~‘íl›°ÏK¥ö@—q-¨ãIHxٵʫ2c¦8b”¸‹*)dªZèàG{ʳQ wmí‰T®]ǃwûgìççë|æ”c3ÜzãÄ$Ε<‡¢ÐØõÜH–€oÅ}Êúó+Æü² w^m¾Ð |Ð D5}WáÐDIYêÚ¿ÿÞˆpåù™wo¹©§^85“eÔû΄—^ª³J÷“Ëßz$±ˆ†…YßÚNžKôr~­:ÉwßéN]‘ûÐðÞÇ—2C4•[žÊ‡µ¢¨42Ž–×üê÷(MKƦÍÚÑüË8ºt-§»¯_-•f°`P-†d¦àÝí!çЬa•3 ±üÃñX(~Â4– P0;W8\MW”ÜÝ©ûD‡ ™±²¿ÊþÂhï£n¼k ¿O(—Q‰¦V¼ 4wÀh€¡BI žHU†ž÷éSˆT¥t¦Ýö‰®a 5ÐxˆÏ¬¦=¼dŒWUaÍGQ M6Z³´Úú(h ÄME\`q½ÂµÚ<@d9ÐR g¸Æz#Q%"^+иB ÀD‰Ã:_TÊØ‘Bˆ†´ˆä½þé«OaQ ß|tG?Ñìtwï9dþÒaöR‚"ùÕÑË™A2Ù ճ£‘ŽQ±J"³‰êæõËE]ïóó/ΑÆñÕ"èýp"ŽÅ9W(ÿÁ¿èn>sú³Ë.9ó…siºùím¤ÿáQ`•Þë;¿rÈû²™ñÞED”ÆÑ¬ .ÚëfUù<ÍÁ®cŒýV 3ý¸Ê Rvo2 ©0ªc©˜×zªšIgg´48-UØ©J+)b` Wþ-'H¬ZäP[Of:(ÀòX¬‘7°‡óû›ù"¼W?p¾¹|Q—Ozœ‚ËÎÈ #ØCEÊujO‘²EÉš£c¶¶/e\%‹Š—Þ…¬ôª÷ ³\‰ˆÓ.ì·t7)ÕÚ@AcaWd( ¥ßKU}ÿd=_Q% èb‹¯‹ÈÞ)›D0ØâdÔ–]TqZ¹±ó2\óÖå4VT”„W_û8b+ø¿Y‡RfsnÐÈÞV=ðt<ŒW$þÉojªhÄõN€nB2¶ì(ñf‹B•LTY©ÿýëô*J|ÓžKÌ…UxlI{ï7VðÆ;iyî´S){¿°’©§¨’°0—=ÓmÏÀ60´ëúÎi9û‹©è`ð1m:¥êQT|@y!¬"\掽ý¿~jÑ<ôøê#³òÒ“‡§À^þ±¸éß>F¢E÷gð+ËY‚D@À %­³š¸w…@ŠÑ«kÛ‹KÙðc¹xvoË4§{ ­’²Q®ÑuJf©ì“5ZPi’MRC&Ik͹¯ý£V~t³6séµ{lœdm±Vm©»»÷s'±RKûC"dœVmþ8* ôÑÕ ú¯‡3ŸÃC5ÁÏy4ÒÅYTí¾ãs$• ' «k§’’‡7—Sj÷Ï((uG~™¢Ö‚–àXœÄ•`Q,°wœ;3[€ev] ³5 ð›±÷hËîÎÖþö[ôHBJ‹ÇoôèqëÉ%*,º=B,Ë™õQDþ­v GŽ“R³ÞíÎ4Ó\Ê¥VÑå PbŒˆDqûRVAµI·XNí®M•ÒÔš áR\Ðj$¶tÒ3* ŠÇ‹ÏIMOâ•uËS+ÆXƒp¾kz³Å)úûAØùÍ@î[½ÇA}AÍ¡€ÆŸ´¢ª¤Ž]!}Z(7@ÉM՛ѱ¥aETu*a´WTðê‹%¥_ûÇxÙ0AUU“ÉUß¾òR"(¥ Þ{¾ÛïQó% ½§æì ̾^+u°ýóáó™©”@âÇÇâã”·’u»Çl;å©z©<ú³Ýž> È;ï=v:!ß1­0,0Ï^|j˜cç\YØëÿË_©…ÙçÓvdþ¹³'ö}ÿ-#Ëo/(äëoûÖ¬µÆ¤Dòéª}~J/¸GỤ̏îú˜{·v?\MPOo›z}ݘvßÖGªóׄ'?‡h˜ð¾Å³Ñ€I“ÔØ4IÓlÏ?ù‡ ´õÁêRûý×õV½^ÛW3¶Ì,RñN7ÙB>RŒ¯¿?õ'Žã8ù„Ö\e{„5à¤IÀ/–çõÎlÌpµ¹­}Ñäy €¼‰QbŒÊŒ´¸ˆ £@4ˆ¶¾b¸@Péç&౬QV#ç#s½²@'ÂLB?!®ß82š'eWfÚ ÑjDiw;ùlîöÚ‘9 ’w®ÞONÕ4²åÁºD\¶6w'uÄJÐg:ÒÂL˜jº5`ÉR±F·¿V_ÑX²¯ ê4ªŠ0Ñ¢6.¨ †¬çœ2”µY'[8àQIÔA@ü\ÍË^SÞKœóZ>2Ó9ö§w‘Ø)ªÊ\–¡²E•J+S]*e»c`{üHµŸ`Z¶ È–  ±ñuÆq“2a0 õC…ñˆ‘k¸Øã‘iŸ-¯Id¤¢kçOÜÚ{L”\.¯OÑòµ®<9•ï^X^©Ý~++O?¬ˆEï­g÷5BæA´ ½+×ae¸©Ø˜Czý'ÖÕ~%ËÑí¼ß{¾n­ :zpÊݬª¢NJÇåPÜïýî¶Q:sèóu—=õÜÅÄýôSä“kÊ oÞxõÜ3Í$5Ʋö~¢+Gxë“§lF,Æ Ï_²0}äï~è¬ÔYȦM¿fgú¶V0þþ`&gªŽŸD“¤µ$!4I–˜‡ÿñ³È ÷?Û9ýìí œ=‚0Øìª*ðµ+3x¯8™Äx€'D5Õ2{œ ãÇvå¾5eÉo×&ª«óëS‡£rüJ”A&ùp 1Ê$šƒù’ÂZšÚ^QÌ-¨j×8I“\ŸÆ¡ZL¯QÆÔËC£gGØÜãHc÷µs†v†ùV>;øxæ„!k3 Ÿà¾#R!Ù(ï)ÚáÌîFŒ˜ðŽ™´×׿Ы‹šZÑ)KLÓ;Ž›Úq!ò†ÛÞ U&PÀd¨ô¨Ø TX¨öê.ï;7g‹AÕ¸“™ÊB"U‰"U·!%°›‰4z¤²€J´˜M¤Å‘1˜X€2üôósŸ_€Ü Þ:º¬å¥}ŠŠÛwד«ç›î‘“,ÔÙ}ïù©D̸ËPÁ°wÈ ÎQ¾Š „ °óm%úÆ’èhðIÿkKFMLe 4_û ª7 2çì P2Þûÿ20Ø:RßÉÌ3OZèÿx‹àkϦ&q»ï}þ‹%I’ÕÈ€ýü*>5¥WúOª²rÿüÛh[ËÇÛƒ‹]”Úã4—,ëgf$ãlð˜ÇWuç~pK–LRK !Skd{þîoïqj†—n¤K·¿ý©© ÁÔ‘çV Üâù€¹VoQ‘7¹ï¡hœŒf0ÆpÒ 7A’ÊNëår^Éõût8¼’ë¡z` 9Œg€±×`ÉÁjå{PDDCƦGë \XDt¹¸U$R0€5.‡TL¨ª}Ê,¹ÙkFóë¹ ÎSU<úG\€b§€ÑçÍÙÏzgŠIïüÉí­ô±F4C òmÔ¤_›ÞêkY…'!¹ù²í3†LV+sfLeä'KÙ*92H)0Б%ă…sÉÍAkeßHDv"L r³‘ãDÂºŠŒÏlOÑI¬:ª»W­â † Î*ƒ³ý0SDaççìh¬ó Ìôˆt™”cc u–=v‹)÷@)Ÿžn‚Å1³¦ 䘰w‚@HÌ™ ?a$Hú $àÉ, èÃh r¸p,·ßŸ}¨VüÕ€šÏ§ EñNú…Œ€l¸Ð+\!ïh®&ëVaŒ ˬù‚vîýôÔc3>U)$òÄ-³†ù¨ª*³‚²p™—Εùöwÿ·kDv¦é ­?ñÔ±ÅÏ_@í—¶l†;ïä¿° LbË÷dñŒ.œi¤ì”™G¯¯‘>¸/]$#{].E[I¯¥½ŠžS½“‹ÿ É!›X“X›$IšÔŸøg߬—€»nOÍžÿËõ,­S:}ò++¥ŒÌJË€`£m·¬¥(”~@P8QD2ÃØÐ­â›ýì¬Ú©*H1Hî÷÷O nï¶¶¥uЋ)h<´7ß2VšWl‘ˆõëbE$JÚÇpT$8-TP‘´-U‚àdÙw\áÓåæÇº²z•;ŠéŽ™ÝèP9aóðÒNŽG¦¦lî&¶,E ‚ϧ«61r4X$Hx*)¼r9¬m¥‹˜ŒHcsà ’r 8_/Ep éÁ‰/,è§XP‡r¨V~nK99 ¶Ë’¶ük¥"J&õ`ƒ¦@Ç}àñ‡ËC„¦ƒ¶ÂĉßÙ9ríÉE(Êá¥ç¸ó6ž!wmðt’^<ŸäOWæÝÍÏžMqâœôôQ.·mojŠ·H¡e„¤äÎ_Œ¿´Â‹ë/×ÓI0NÈn´âÍ8Qu슑s\JyáŸÿ¤´¦–IYÀñ—θóŽ“ù_]É”xëµÙ_\‚‰PíûÛøRÊ??tÌ"ˆ° ₩ÐÜ»2ݽÐ#УG¹0³¶×ÖW×fLI…ˆPòƒU2d’$M¬±6ÍjéÒ·þÉÃêï}Ô=XûÙw§Z–LëÅ/Íuo9šŸF·Õ„ý˲±Ë‚^ãžÙ5ñG­"ºãÁ¯Š¢»÷ÊÔ‰„va´6½@:¼Õ\µÉiƒ4‘ Œ·5€ WÇ¢qÚYaˆAÁ,,©Âˆ @‡"ÌÂ""K¿‘”É<™J19Aɇ-iȧ;É—kÔÁûhBE%ZVè°ö»ƒE{>}Í¥üà_¬‚}L5ëwœƒZ6ÇÁ2É÷ÍMl©c¯N

?kAË¡|¾öt¢ãÜié~T{!µ·?Hä©*2\»ó•)= a ¨E§µíµ£¾êT;A"ÕÑwv÷ÂIrãÊç_Ûc™Ð7úQsh„PTØKªØ•%KY¸äÂÿö“ÒZƒ"lN¼´òÙ-‘³ß˜A’ÞݾølBdXßu3cyñÉZEÅñhó¯ÁÙS‹£ë÷,K¶Í2 #Ä“m+pÀ$£Ij‘A$LÓÌÌ|óÿù8•jºW.Ïï¿üŸn&i’`öØ/=‚Wÿº¿—Д¯þÕ¦ jcFV)ÚðEebSê¿ ªþ S_R5%_Öþ§å|hn¥GÌåš8ÝWóŒ©À ‹ï9D€_`«*aÈ"÷ï! @ ›{²T *jW9W@C” (‘w´+’NPçÃÛÉêƒ!±3Ûkf„ÉÖjº-âÉãÍ&ä;(8Ú´ûÖ>?qÝùC½kxv*þă.P»3gzE¤ *¤îÎÜìý²ynޤpBÖå,žœ­Uuª¡!ðÇ•SèzÂKÌýÝuK¦Êøyƒ8VB¢¼«@-@cÀ‚¨Ò4#„ZRYvåøÔÎMËp¬…‰Õ¥ó– Z²„¤,Geä#’¨R•ƒ¤þÞó–%m”èY´*Ê<€!¶Ì*ÎögöµÈxÛpL®ATBB¿¾šHßô«½PýïGͪÁ1@0èqZÀê ñÛœ»öÐ~!SºüÇg–Œ¾Êé _Ø:™Øâ/rm½’3¾½÷tŒÃgaVä"×cÜé WÈíïjÿͬ°ƒõ×–o{#hJˆ&ðþîeQW N¤èu×ÿð_|n,Uѹ—ήvÔ=ÿÍY6°óá¥o=iŒ5teÃ>?eÞ›:UóÓU×ýèMƒÍ…£û -H²·Ù’Ñ<ô‰0Aô#ìÊ cSëišÕ“<úÏþþBQsãgŸJ¿û§ZÖH)ùêßÜç^ûë™—êˆÝwÞëçhÕðj•¾\={1 ˜0Ðû䂆¿š:ø‡‚UGc ´R.ûnQÙêšm\ÜKÕ;`g?º ñ·s81ÆPvbûˆöG (jß P‹TJ,XbÜÆë6_L «Î@Ęûù–ˆó6ñ¯ U• M5¥3ÖáÖÖ2Ÿ:¥ ô±.}¨Ë‡ÐC —›„ ë33]NDªÂ,­­wtwaï S-Ë fVœp%{F~U4ŒW‚“‹ÈrdWKó¹t"íE\!h¬ÝY/Õ ‹ŸàdE"Uõþ¹bPö––Ê«"°w 4-qØöĉG9;)%¸ïÈXíq<™ÀÃQì ÃcÀ®Üíê2wYòDu©eŒçDS§Ë’¿hìj ÆPÈxà›Å;@ü .˜ØçŸ6,þjV·ž@eüžD¼yŽ®Àî§Ngtý¼-žÚïÔu>»öRb©  [Eî¸bäëVÌ2pi¤üÞ=â‡C4ÛW_ig0‘g"ãdÿÈ)(«ÏYbfÇåp”ŸÿçÒK!`gŽ=Ô¨¾xn¾f±÷Þ½_z¤†€ãþ#ågLDP¥ìþô¶¥™ƒøÆm0@ûggËbÞb”„D».…¸›X›XcˆLb›%É¿û?ŸåÍ𣋠¯ýá{¦…xà·¾Ü\ÿîÅC/Ï0®½w¡ç¤ŠH¼Fdˆ&0ºU T°¬á¹ã>AÂ|«r¢DÞežôv¦Ñ”×››Z;žT¸—§ÕÜ£¦NcvhÙÁíS,F~Û¨‚XTѤ×eÞãmcœ{ÚÌ –7F÷G¹âRA3ž*:õ/ß…„Ô êô2ÛWNbš™Þ‡É7÷&FÈðÛeë¬í_;1ÝBÏò®ÿ´ tù@;ÿ´K„³Ë3ާ‹ÒF°!$CÖ&Iš$ÆA²iÖ¨5j³_üüÒ+éÝ7×–gÞý“ÕF¶ÖzêïžÁ+ß]{úÅ&ãàÍË7|hmØ ?•*X`üvN¦ÃUb±\½¥>–*qŒ´¼3µ"W¦î“Bc'd«aˆ0Þ'JªÂ;4é8fûVƒËrG­Fo[Õt4íìYh±'©†H¼q›w— PX%D+ œP!*‰²Àd&‰÷K7Q1w¾ô¦Þ;‡ûÉcBè$}¯qBäã<:Ã7ï=¼'->ý,ËŸÞÇÈÝ›·_ÌÒjr.~«(,¼­Ýfû¢Ð´@N•K}çĿʻW?}y¥à‘žûÖ¨Ãx1‹°ˆ*;ç ÇZ½þõ?þý[ƈbš¸ù_8bm{Ÿ.¿²·Õ´Ióþsv¶¸4}(óèY(‡W.¶ï¥ûWÀÕ,ËˤfB@"’1hŒMÒ4K€Ð&ÖZ›¤iR›}ø·ÿþq*Å Ïdæßûë¼i“ç¿úÍ¥á?©é‘T•?¹*›l³†ÜARS‹F/À NÌ›®Ìfc8à¤E»ÑDzˆË5»[;B€÷š£$‰!_ kÐßEÄ17Ö_(cÅ(Fˆ"bÚ<„Jý‘IUa866Il’¤uE,8þœ‚ªž»*PŒÉfDEu€ÅV³£ËSXm·Ã€ö öY¤ØÜ9€ï7O¨"}°oú²Ýå Ж”ó]Õã’BÍèµdÏÍ!©‹$ :qãG¥rM%¶ª œaLFnÔCm[ `--LW°ÿ„ VöªHíxz+x$2ç+h§È¬*õ@rEQ .=>²NR•õƒ“–$Ôv‹•U-ÉýF³³ƒêM¨phÝ(‹Ýþlíä\ªH÷н—yæ8‘wƒ‰n;­—¹iuã©BZÃÍ;ûp“‚&Iî˜}Š NÐÕ}ÜÜ$œ¶Â†P<OÒA½g–²$Šð„²&é¶+»"Í& ˆc˜„©`Ü4€÷Dº^W:3‡øúÐÈô1©uX¦C`›äâükiý:FcO¦8¡ ©R)‘+ ÂfSyߨÕQâÊ=ÍèF¯ü\w„åR•jj/-«(ÑX¡ƒ|½0>T¢8’ƒ¤[<~iù˜[æ£7Z@~¿´O$î³ül#“ 7Ryn?€ÜÝy¥aƒÕ¯îXÄÔ5‡yÍ!,ÌkY|ô•_@ÖÞê'/®X24N3Š„ðHs@7 ´|W:vì¸èî–÷¾÷;o -…“¿<ú…ýI#Þ¸óä s ‰¹Ú¯=‡ƒ[§5D"ÅáÝOÍþã3½]ÈŒ¶C“¤©%cmb“4IŒ5 "k ™,Mkþêÿý[óÎ>|ö¿÷ý4µÆîùæ¯+ßûÁÖ“ÏÎâö_£»wÍÈñh&]½×W¤3!Ö6?Ê~Ã8̦x׊*EO`ù†3ƒ¹—®v÷µÀöîÖ7Ôœðõ‚¥ñ´ F™`lâó¡W%h4³ûfÊ^™ õUÊÀc3¹@ÉÆ#Á}j †‡5ˆ‚iöG éÈ­´é´'×àXÚ¦³Z¬ú-ÏàÍÜÙ>> „ùûßܶg¬™V€^NTïLÏU£ª@ ›\œŽø©C&µ…aï8ÃÉø1‰+u©þ;Œ[w ¢=è´Ÿ¦+p©À`ÌV‘o2&‡4ºwµšŸ"¡Db'ùOÜíê.œ¥Í{ÄÉCõ´a „dGƨ^•0 ÷#yKd"¹%~o™¬4>ª¨+òa2•¯J̆© ÍÖ¼ó-ÆD Œîÿ*)@å!“N8ÐC 7¶!ùKD)eÆB£u~”5ï4•ôÄÅŽS·i·/.µôщòœD"e…nh¦Sß—+àD„Ú4ÚÏê«2óåv3‚Œ—]¨Uï_~¤ ½Äø0Ú¢DD –F–DÌ›8A²&ïKÑaÔý ê¯1äk© `˜Ýîýü`³ÿ™8ÕHæD´[ìË|Ŧ Æ8Ï&ÓR$ߊÙGè)™HùÃêZVÉË’öh”ì&4vgks‚!í•Â%räb­KaÖ'„¹È‡7ýÑåÉtYM”†èÇ¥ |ýÚc7N/JÁ[ž"ì}HÉÒÿ qš?¼oõå 蟗猈·8ÇüRôÄ-a¯o!©[ëg=Nîþ áů1;w/=r¤é·Ç4†Å_-ƒcfqÌ"ƒíÑðÓñ/oÛÔøAç‘çNµê¦wiðÒ‰z½™_—öx+4ÉHBð}±Ó+Ó)3 5ŽËRk¬µ6MmbÐ2†Œ±I-µib{¾ôý­ÃZ(âÆ«ŸÔêýñO†™©¥õƒóWWàÿÚ}æëû(ÿÉï¾·upwmTÛaNó›CFÕé£d¼&ª‰Ô„ñ1¸ *5Æ»¿Ñ‹îŒ¬"e0ÞN÷«À­uCGZ‰_¿RÌ2’ #1Û•µ£"’E4iÚxH7GPí¨S´D¥@¹˜;¦!&EÑ©‚qG P$< °>0’² HÆï“ýŒyúC†²×_LϷ΢²Þìù–NxݬAí"ÌtÒ©>UhÕŒù|wñêzæ\Væ,Dê Ñ 6_Í—Õì—IŠ“4†dÒœ6U†¸cU4£b€¼`1N8£Œ6“°Z‡ðî¦ë/‘+Œ2¿`š©ÔVÙÑ*ˆB¬,Á DF•EpœÍP…EiD¹Œ³[‚ÊŸ¡ì3/ÙaZß,Óš2¾Ù’Áh/‰ ­ ªñÓ×X‰VÞP‰ci™¢’!$ÛÌ@q€ êDÅýÅÑ<ŠËÜ|´ô0Èk…}r†/m?bÒrðÔÅg­Ðˆ¯=µ·a&­m*RôL1…E_ÕL‹ 2°Ë¿{7‘/ž`ᵟÓ3 «tè墊‚C®›¨`vι҉0C¸õ¯þÍc¡Üûü3ËÓš_I¾º·^O7ût®6¸ÿðl+³ŠJÈÃÁÝíâáv±‹4ƒdÒ$±µ416M1–Œ¥$I²$³VVÛ÷Íÿù“ .\˜z´öÝ߿ը’ö‹ÿð©æ½?{ÿ¡WiàµñGW:ÉÑõí,ßh/ö·]CU²Ç_Påù~` 8c7Ñyg°TÄÕª{IEʲL/ã xkjÐÇ…%0¾—“ù‰$CÆÛ¾ñþ>ö~#`íÜ w'/S@tý‚HÀ±S˜ÿa3 ß“€õ*ôôPiF°¤ÚÔ Z "AãØlÂv €JÙÿÜ4ÏçÇ3½åØÇZ;E€@¤*Å:èÔPe"hVWÂõzëÇÖ/- ¬ÂÜ>¨]tÌïÇŒë'ïȯ^ÁY‘Ö’0ŸÐ²T@“uK†îÈb[)jRÿ»[ÏVg@U(Š]ÞÌŽÚû[Èö(5¹®`ñòUd ÉYÉ€©6“^­Ž±±cÈ'¯‹ZïƒÖ¶ú©Ég ½‚-ŒÏ4W£OÇÊm Û áwÙ8»CP@ÒHXdȂѪôqÿðÍÇ€’Ëù{§°ñ,?Ì›çÈß½iôË3Ne÷æ [9ØCÉUx8Ûàm\J( ª]9ø#‘ìk%uî~ö̉dÒ•?†q½Z!ÐT™=+ÌEY²*º»½þg¿û·À”ÆÃ_~æ@ÒÿdñË{Óv÷¾Ý“^]<1W#?¿vEùÁ µýÍ|«c5S,Ml-1Æúõ_š$i–$µZ=Iÿæÿü뇸T€üòÛƒ•öÿåCn¤6›~êïýÂ\ïõ?½üܾ¤ÿÃßys8:о±ƒ÷ ‹Ë­õ ÛV9± Š†0Нƒ7[«ýlµ•—ʯ{A YÏã49`7lÜÒ£uÒîpþŽ6V\ÌŠÇ1vÔ»Ø"æ €'·ÿÁ…®d, 9VêŒÊ¤¦ Ã!0!*ë‚Ñ£w1Ò+à.îm2´Z,4µÜh”²œzÍ ¡ Ñw{RÜ)‚ k¹•îÙ½rpÉ).®ÓÃ-$ŸëäÖAÚeQ³ÇñɪfŠ©ÙÛ:á~ÌG^f"ËÃ5¶+4‘¿<éŒ tPD(]#§$p’TGm²Z®¶÷zëß8e¼Kq>0|7ßÑãµá% r¬ÞBàŒ»¼QºÍEáÄø$v‹Qå&ÇE_¼÷µ2Ôª:vÛZ´aƒ¦ƒµ¤±±Ôh°Æ©¡O†ó^§±#Lƒù*®i¥ŠÀØ7©OÄ«˜Äˆ¬ªªè0 º?|huñ(#9ðè”o9zÞºOÜ)c`÷Ç$+ÏXQþñ ó䕎•­UY†Ewzo’À  )ö®xç|ªçÎèÚgòÅEK&8x2?7š&T0~.ÂÎë‚+GeÁ↽n¯{á÷ÿô:'*Ò~è…§—ÝÍ}M5ø:×ϘU9•¦µš%“d6/òs¢:ÂàÎdj±]3™µYbLbc“ÖÒ¬^¯g Oýöÿë[û¡TD¾óiwïÜ•ßýÑf«¡Ø<ók¿~¬üø;×N|íx“¯ü«ÿzc§,àÔpc`v@Ì>º:¨×DçN¡µ) Qu2¯öídî»!ªƒVÑ™[`,¯Ï߯ô”1!4VÅ«™°ò—#ªy¬éC\Khš4NêÝBRÀA29‡â­m±SE­š× BFŽª8ÅÍasJá¶íS»¦>46¤uÎès¯”ÝÁ\œ=)Šxifö2¬¬(‘ÇhvZT& ŽkIU†Rmô1ÿàŽ}b†µRTÖ™*€àd^Q„«„ >öþדٰãcÇló ä«ŒÉ‚G‡ ˜¹{?éïöÊÁÞE¸Â{Z5—Jn‚&;œÌ F5R_wSÝGE(ŽgóURE°·€H‰.³E` nÓÔ¶Ù3ƒ–«\4©®‰€ ¥ØðÿiÈ¥ò5aÀ§ØFPÿøûšõç8³ö‚‚œ–žµöÊM8¾O®Þ{d:eyãáKMÖbôÎÔ“ "ãÝ&qsìzn˜,Ñ&€Î‚ñÇ•+ßιñÍzŽùõ9” Á*‘S'| qlVÅZ«¨03k…ˆ+úâØ}ÿO¿}½ôæÛúþ'ÎÍ Oœ«5¶:rªVn™igõÌ ± q¹y0Kv»€ ó{g¦Ò¤^˲4IjY–¥Y£–6êS‡_þ¿ü_™—‚Áº;ŸÜ¨Ï®ÿ·ïm ¦ñз~ýlv÷¯Þ­¿ôÜ<­ÿÙ¿|û^¿?’Ö#[Û]W¶{ä^>gó5{:£°üïÍÀúÀþ:ÐÔpü7*hLÖ8 l:WE®dèòô:ëñ©7 ÖÀU"< (æ‚EP˜>ZÚ£X®;7E(¸KÈ, `Lbœ‚2Ý€Ž1.«ƒ ÏȉG™ëïÖ@®¥nM)¾+‚l«ÜgÿG7¸;[ÿ¨|,QÄ݃uê„* l"¦-¶N„1(Àl R¼óÑ)óšÎ|¡®ظ„½ì& qôè#?*²G¥›éÕX›Y|+Ø9ÅÚî¨pÃÝÂU9jã…G5p%« vÄÑٴ%«;õ5ÑÂŒr Éžâï[$rž¿’ aEUWœÃ#sWñß ¢æƒ^m¦èÔ›ëe“‹m‹“¹"1 ¸²6`Lƒ ˆÀ¿LqIÜQa™hžT Ì#©æ!h]Eo_8~éÌ2”Ò»ò„…±ñ硡ó:Ê¡s*Øßüø™”Ô Xc¨šÊ árÙ-Iç¬Rô9:÷Ñ Ÿx ¯}¨_jÛ0ÅD뇈Uºˆ?º(ÌÄK‚@TØ9Wˆó°³Ùt.ÿÅ«÷Ô“eÌôÞvöØã{Êm\X¦{ ‡¦¦Ó¬Þ¨7Ò†Õüöšy(ƒ{ff§šZ³Q«7kµZ½a[SsgýýöÙ¦sJ”ßüàníp÷/ÿËÕrªÖhþ…ß|fjçWáÙ¯L‹·ÿõŸ_Ýí÷YµyàÚMT&ÛÚ_^—Z½ePŽÍ(’A0ÁÊãw}bO¥“$¼ $=N .@ÙÃä³bÁÜÖ¬‹‹Hc‪ïí« sç€ü9úò‰Œ=<#¸3D[G@Ü)9gÀÐXUUƒ¢@c‹úØB1&‚dŽaǸþ.®Þª Õ–'Ø„4£nË–U4_ÃöõµS 4ºvòV?=•’÷+é†S;¯Ø°´òÎfS®û£­§®ßÆŽ‚1¾É @ 4nTi[ÂOKU^­ú€n@LTSŠ_Fé˜ëÔË G½Í-€}iD'Ž=b JÖ/?Q£õaØõ[†éP Lž _ PU‘Ô{ޤ–CžÆ™ãï+î8ëÃgDŠÈhTâ>ÞÀ©ÝTw–²)¾ҬƄÌï¸uÒê»ÇÈé®*é‰ Ùq2¡"‚1:¥„\ÐøYÔâ­¥îð ”#}mé$ð[=}jJ>–“Ö8x}͘¯·Jwqî\Ë×/Pq§eT:Ø£;Ä©)0Â%$~w—èsLƒÏ¯žy¤åã=éYؘ¢Û1UDPçP…Ù±”¥ˆp1ØÝÙîl^øÑ§ûÞ œzútîìiØpGÚµZ­–%ÆØŠÝ»B@3ó$H‡Íí]hLµfæÛSõV=­×–ù[ÿôŸ|mÅ– ýçï·7ÿü?âV›¦ýÂoqfxþÕµG^>Õäëø.n ó‚ÌÞôüN6°û¦W×ëGåúÇdö  ÖÙ hc´„E7ðD+PÍ©r£Æažw²Èpæ>NvîϬió8Z?BSŒœÕÊ[ê]²aŸZ- âdÒÔ¥*wŽ3mB °SÔ³’‰Äšh9å«° Ö¼³.éá®îGØTTÜgÆ4P]†Q— "¨æýáâúâQ@ÕóKÃ[prJ Uy·Äd±Ô,r¢e}±V+ÜÚ·;p~°ðÍ&?Ø$LƆ÷ ˆUˆ†wèKÄ#XÏ_fT Y/ؘr÷Áþy©ö·cø i"Åİlí †çGWÂþi5®V8˜Ð"+ˆ8ç|]¯{OiD™ûtÆ–D¯†¦CœÃR—lG€ÚÅ]šÙœ[˜ Á@¼èùñÆJS_ÙI}øU”™Øv è8§„¶2JáªR…?^;qýùT 3ÝØx éþg°ÿD¹{õñv°ýc+ÇÎ*Kwõòó­”È.>®]ÎÊËœ;€l ­Ï¸DQ… ?³pìI-yõíþsíZe"ÒJ÷i:ÜÊ¢\zipéʲtŽ¥ÌwÖ×6VߺLX)êÒã‡DŽ,»‡[õZ£–“±¨åƺ¥‹µ²ŠÓGVfêí™Ù™v+Ës}ñïýÓÿéë‡.ݽqi{nqý»úI™mžú¿ýÒtþÙë·~ùt6ÿúwþêöVo+ÈÙÑfžtYô°¹’×—óë× x2K‘b’ê„ß7¨ÂÆ¢Üà’—Ø„±;aV¨ZÃt{kß‚Bùiû.š3‰·qD˜T¥ƒ*„4žsüOeÓtö ‚»á(i¡¢ë&HD(`’ŒKeä²¢E†1›ï€ýÂ-ºRö·t”ÊÆV1—j±8ÝG±Ïô_]ÖÁ0òµ¹lÎ×~–œ6 zÞ,\‚Ńaª…y°ž‹ Fè ö»¸ìx —ÏñîÇtîÑø~1a=šª£P~ ×SŒÅ‚! ‡ +í1–î@s–<Ê„ªUJxzß® XWv»°3µ_Ö‡­Fª•ÎSå$ˆ6PØ…?†¡¨r^€ø¿ÑZQ‹}®_—ržã-'šÉm™ë¦šÆ›Ðù×bÀFýÿ¸ú¯'K’+Í<稚٥ÎIð,9H P¼º«§{dfzzGdgeEv_öeÿ‰}_™‡ÝÙÙ&³ÒÕ¤ª‹…P–@ÈD²ˆ Î=ˆG8÷ËÍLUÏÙUµ{³ñR•@Fºßk¦zÈ÷ý>A¡*âBÆæÂ §Ð-›ù'R³ÖP”Ž‹8ì~xîùôYvXäÝ›—çÀ~dÒ—1ÿUýTŠÆ~ÐAý»u†r룃‡0 b¼! ÌVn²bé™hØXó·{ÿ¤U {pëü¡L+"-&ÐX\}@•!äÎ:vÎ9Ë>CT\1ÜÛXñËgZ‰3¢§›_%›={d&m¤YV«iÔ”¯ ÐTEGpñÌòÔÜt}jjÿùoüËÿÛÿý_}ã¶Æ2$寭ûý)}ï¿üÍ]=3•¶_ùïÿÇ×ÚöÎOïÏýbÊþ—ÿð`«ÛYçLyòñP’2ÑÉ1÷À-5Ìêêž{zi „¿_¡ÃOD;N¢a´Õœˆ*eBqô¸÷ê¡§¾ýTìJ6@rÞ5?ú….8‰"bD`"Ñúà~¦­­–HÆÆÊØ)ÅP0³³>#ð =rS±B€D”ðYqÃVÿî>SÎOÝÚÌ ;è+oâ0s¨·i´‹âBìÑpgyúš½ÔhÙÞ8{ÏÕ^ºÆÄbó9ÖùµZ¬1 îÔc,õÆâO_šúg÷×Hˆ‘ɹhp_§qÏ)ó³p! üm=¤Ù"¸Â²ÓioÀ)ŒØ½°¬æˆ‰”ŒfJ/Wˆh0X칃ç®<]?À”–)$;A€@ìј(`ˆµÏäƒÊÚÄž^ìµ9äã M,l‰ÙÚ©rÄŠ›fÝ4÷ÊcÍ´TÎFY±—õó8ÐÚï9þ••¯6üƒ$õc·ø 4B"Z(«r@Ÿ†òÑ?]zòµ«¢l¡ûÍóÊõ…Ëû×tÞ¾:r÷GÿœY¹‰hww¿ýÈ8qÄŽe¨ú3ó½­߯$Ad)Ôæwÿüƒÿb¨ûååß8$&$¦ ý‹ƒ˜@•`ÏtHÌHÐ9…ltb µ í¨ÃºlàÅÆÁ¥„Cß›í~÷å§[Û»ƒAA£¸"OQ²iG(¸àjCJgfæDÄ+Z¸»½§j3Û×ïtYƒ ç.Hxðä!?ZCäkß»ßÉ˲´ˆšÙÚc‡ÿ±£ «hz_þОÁÍgôxA`敇cÞ•—wbePlj†¾b ]%• ¢C ³]k §ß=ü±ÀFÝé¥å.# ! {Ï@pÊK0ÀEK >5ª$9‘9xìˆê‰ ŒØ2²P’B‰B$LÂì+g™Ìq _aêYß^1½™Ù5y¶/çf­ð>s@—ps:CâéíV¹°yçè‘Û¨ÍÇï}¶¹ÿÒ÷~jnÚšÌ/”Q‚Øl–9'/n\øäÿââ·þS©"F[MØj„$|Æ<]ðEUXŠVú°4BJïYvéˆÝóae­ˆxb1pà¯G•†ˆA«v»lŽ©|í¨%PØC¨ÐCæ©è(ºŽ<‘®Š¡±K#—¤ @ f7nÕ£)šNvÖ,<ß7Óî¡ Ôœ 4DºX\GWúKÆ²Š‘ ¥ £ =E ­ŽG £ðƵs¿shÍAY[_}÷Cé~úGíËßß¹vy¶ Ì¿üÖ þáýBŸÿÞBo@.Ò†EH_4¿·-(ËÚ1"Yç~öÊKü­e£Çw.uT‰@ÎKÃÉ4¹Æ ¡A #@+ZiF4C\ý/ÿ|‰—‡ŸÌ\j†_V¤yV¸(#W%&3©*”:€dG¢BF^cZæ»=›d»w_lìR2e§W^=ÖÖ¼»ºF'§„ÅÝ_ÞÞŽÊBœ´¾*›ƒú—§Ÿm¨“üpT»öªbuñL(H^B:æêÀ˜Ûíß‹ñïŒâÇN2~°#՛ŨÝÚs8½g­ ¬ñï!PhòiÒgPAçbB¸$ò¼³ú €y(@ €{¹3Ž‘ÌÈ!Q⯭@©ì A{âŸ3…G =ÊíUO/0>h—25â9<ú’ ä!¶ÄÙQgFX;‡øéb²Ê‡ç"•¶+Haæ¨r/hŸO‡è_Ë+ÝOÿPTÐóä 5ŒÖ+VNÀTD嘴ä#c S²kÊÒ¹ÅÇÒ˜U]m"Öýw‚ ‘íp[õçö™‡È)èÇA¯7±£€óÆ´A>‡ÔØ [¢B?ŠAÉ«}AŒéŒFÓ~—x*Ë×iÿšž^PaŽ\‰ÿ&è¥/T±ÇÅOd(rT xŸ8 cÈzlZ‡.¯Ô¸"â¸üþ²”—,(6òÉ¡Â_õJ»ü¢ýz–ˆlÿŠÜå³ Ò¿Ñy5&JJ»Ø‚G¸`×¥¥E¡WdƒkwþžeþÆÝߎ¾USÄ¢€Ã© •¯xLì”h–àiaf–"^–ÆZS ºwþn&+ËO®|¶ºçÜ-ccæÀ©³_{ûÍËÇjž%§Þ@Ø:gAP“Ý{þäiû>úÕoïvµný“ÿëÿxyFÖýñà¥÷NÖÔàæŸýÛ߬îõòÒ9'€®p¢ÎmlºŠŽÕŒšËö–u÷G„|â@Jae¡gsWðy‰8ï mÖWև؂"àlÙO·vÍ8eïÎoœSŠ„Ç[«‡DF\5XA#ˆH%‹‡X6×P¬ìZÇÀÎ "#,`Íô§ˆ3Pu6ÍÎ¥´:̳MÚ‡²‘XlÏSHð–Üfâº~Ï,ŠÑv£u_Χ‚°VzèfÏøDI³JÃ"€XXn/3$ÉÓžOÿ¾8ô¶(o…3”q1F¡cµ¹/•É>Õ•R=keÇ”V(ß@™uÚ[Çü¼ì8Ì(A.Í.n«‹juO kìY$äH âÃSP0i(­REÆ¡ðR-xª4šw@œ;Ó˜ ’ÕíãrnÛšÑ +k±ŒÐX…!‚¿oÇr: à Ãý声–°…¼ðœ—H“À‡ë§ž¼^)K¹eÞÑöÙ9vÄ=}q‰2kíÏzªþ»Š!Ïûµ•Ô±wNëšM,ÎsGD¦I¼“EÀóémâ·O•¦xòÅ¥³™GÊä&«>¥RrŒÙ™"l» pÆË6ýÃH¥çw¶n?Xë»8KDaëœqìï~Œ~Ñ"Çì—æewsc»»³~ã׿üÍ­ nxãŸþÏÿê½CIïáÇ·f^~í` ºŸý»ý‹GÛý^^”Ì@Ê,âôÉÕ¾‚ =·Ë¥Ùâ‘•Ïm뼆q~~,c 0ÂÄÒ+ ²iŠŽ8F­0›Z¹:{@ƒ<šî:Þˆñòâ3²‚×4Žüý¾Kb|(…âTz²ÍêYÏ×@DúèS…aiÃ(8üy,ˆ$•}QÃQízYï‰ê-ÚOÔ‰è%DfLESè6mœÉ²ÙjÌo>?¶ˆˆåµ•Õ\]P¢H€Ôˆ´xüÕ–¹RNϺ45¿YûÖ—ø»ç´V!†<Æ_FSpHò¯+bB¢§bÝ£³„Q,#ªfwh‘ Ç"[KI€1Æ3›&fŠ˜ú,°RvF{"ë?öÆ1{3R¸sÙY. ¨º uzˆ¡Ëøƒq«Éç8/Ú9,숸‡’6Š­^:·q¤9­ãxq©Œfh`$ÀT& WA|‘++B\ÙÌjk’ÂH ù?Ö ¿äÅâIÇbG;·^kÿRêoÈàÁÁ)Š{úâóG­`÷йéÊß"ÂÃ~.û±4Âó)ò'aËÅrlþQ‹iûfùÞ”V Qy4GŒ®Ž<†E™ÈŒëD¬c￵֕yïã_0¶_k<}´úèyÏÄL+ .m‰ÆK‰3G¿°pìòîîöÖóG·?ýôó«»°ïÌ{ÿíÿñ¿ýöÉÆhõË«ÛG^9½òÆÏÿíÿï£ÕíÁ¨0¥açÄä#!ÄCó[{IɈÓó;öxm}ƒÍè¾f¢ „ÆÀŸJèû•˜œˆE­þÃTm }O„1÷Ä–:}’®¨M™9¦}Ê4Œ@ÇÙQþYá£0I³ |·t !8Tš™UÉî&µª!h¤âð#'5˜ÚÛ.ûz–´ö ¤EßeS°1/‚Ýf®Üâ2³ùÍ™Ã(Š>_nቖŸåÓƒV<‰DH Ê…·­mñ§þÃÞâŸN!!cl\à„pzBžŠS/̼*’@„ôŽTÖ ÛGˆµƒÁX\*ã¼AŒä !Å,eo§./º{’ð(P×¼’sÛ¯‰ÊTàŽáUÙ"d€!rãý/ÌfØ58çÖ¨žõ7iééôÜW*¯ŒÆÈ_ŸËÄAIÂÕl Ö2!¶¯ê3¨œ2Þd!"pÍLo¿š2Ž~¹t"µ·¶ñâTq.ª:0ý²­÷²RÊòÚSÞ^‘ÙËÛ…Ô @ê©…p@–Ò~òi"O—’ß¿õÒáŒQGåâXˆÀ8ö<Ç0ÑЀ°cÇl­5Ζκ²ØüÁGsï${›k÷tÑ“ÊÂÿJqÁá%):›ëë®_¿qíÆ£^|ùþ‡õøoÞ>åë׿XŸzéòÁ¦ÊoïÿËÏÖºÝaž—ÖÿsÆo†/žŽêC\šÙÜU§ÔÓ°<^YVñQ˜ TU¾´ŠEüÕu€ŠkXÅ¢°Çº±vn8ÔìŠ&ØZoï‘>Ž:š?«ÀQµ+cͬ7Žù‰€(5s¤Äî=Q”6ЖÊå&¼îËLP Æp)©H–ñ„ ›;9Âj0û¬;è¨~¹ÐÄþ&Žh¢öX /»¼'8Æ ÛÑÖBrµv 呚¿§ö$`Á‘‹Ð¬À"’ZŸ‘Qnæ¯Ò`åÞÇß|ôzùmB’À·óëª8õŒû¾ÊUïÆð`­žBØp!ŠXÆÄvYa6âž•ˆ+©GwUšM‰ï#¢ˆATŠ9ßv;vÝ’ -i"™<\9ᔵ³dÂ2¾~ª ¥ Ì‰£$BàÜIÓì@MuÊÔ 9ÔÒ¤Ô„•+õPŒšŠ#ª|§RíHd‚• ʧÈŒhƒC?8qÖyºçÚ—§o^Zd`SÜÛ|•që3\>gl\jh¹ÿYŠoîCàânúJC€<;‚D\—Š©FÙEHZâ‰XíÌè»¶þ8+±ûÅè;­ˆ*dGÆYt|Ä{¤σ8ÇΜµÎcÊ|÷{·•;öìÿ¨Ç?ê 0°TU“T´ çÔ“[7n¬õŠtÿÅ÷þé¿üŸþù·_>Ø4;¯_yÖ|éå•Yewùoþßß¿òt·;ŽFþÙ7ò‚‰äÍç¥(¤ÃÙmS?Î× pöþÅÍŸUJëø0fXM,þ*_ü%–üÁá5á‹"ï0nÐzÑ92#8z8ûé…Ønà EœIW¡ó@•ó:Þ&¼ÛW¨Ò ûŠKÌ©àX)ndïfªòòüýÁ@*=^L î¹dÍCù$˜×°Œ´LEdz]0ª|žÎÜÉ/Ôáùã÷¤~†=èκ 1dcý™Sd®­_›þö¼X4?ÍοÓþ£}@Hþ!«j™Ü´R¬E½6•Y•"Àz]"  Z"îYàÑÐXp½5ämdý‰¢-jƒ…Itd´iGxN ·$ìˆr•! 賕40úÞ½¬c|+„ÍÉd¸_$28a[ð´íÈ È“ÑôÔîQ5­©eÿpI<é|¡V aÅËIoW Eã6¥å´U¾uæ—¶Ÿ,ºôˆ”~}yùW%¾®‡7ŽNÐYþAé–ßG+½gŸ¿^÷g" ЏQ_µún1›¡ÄúV„ĹG*ûò+ŽÜã;gN4CUŽ1# ^ôTÁS}]ÈQ‚&>?Œ3[ç¬1ƘòùÚÈìÅwŠÍaÿźÅt÷¶é?xÞ³iͱŒ<¼‡”Nï?}ñí¯}ó÷þøŸþñû—µ±n?½¿®¿üòñéDúWþìÿùŸ»¶ÝÍGÃÜ:ÿ¡˜¼C¢Åcsm Àô˜½ÊK £ÛNXÖו ½¢´W3û´œ´«ND×LZ_B ˆLøØbˆ«÷uº¢¨—› ‡™ùéTGàøœb$¬ãxí«è1‘‰øhw²”&‹ˆæKƒÈi†ý^ÁŠÄŠ` €Ìb]ÔÐø?¿2´FD"r‹ûmÙtïåÙŽÚ/¸Û40Ÿá¸‡C:Êù(Ôàþ%²];Û¿}ð"·N½è©  ¡V*ª%ËÀ"ƒÄˆX›ýpóÕ³Czú‹¯¥ÿÅÿ–†D)Dï{p41”µÐ°H„#Õ0Q(L!‘OeBŒ3È f›a 5Á> ÂAïÔ¦š¶–¹×wùá¹ÑMЩ$òá}â\HØâ0Ó5ÿIf𬎨àªÂTeâ)@dçÊ®Øý´aœÚÚ®Í?]Zlq(Òãƒ_u ªµùHÏ$!²!wÒ.,ìãE€¨mÉ©=q=è~Rà>Û<|㌌\u—¹Î*?¦WtÌO®&üµYVR<^¸( ”CÇR¤&mÛ-5«Ñ1zÄ—-ò¿ÝCøÓ™7?§7uæë‘“½s:à§Ç-‡Î–Ù/<)DØ”£¢xôo62yçÕb{w{µµéGƒì·?øà‹µ+MP‰dBŠ– êÆÒácû—fêPäƒ^g{cËM=yx:…áó_üëÿÇÿöÁƒgÛý|”Î9Ç ¦ô«\…ê’{2l椡}¬ÿNgÝg ֎;9ðÕA¤W±?Ç °qaûîM´j1›Ç«ËÑÝ«­( 6éáÌŸÎJÜÆ;QeHžõ£Âu6w„aû «Ì5 QFdX+¥ œÏòVb¬­:¨¼Â ‰¦º7×y"<*iK/ m«Í6C¿Œ„4½aeVca6ÃÎ~u=; @|w®ùÏ;DPØàð b‚A‚#Àíï¦ÂH?Ëß¼ò@ÿÁñ8Ø¿jo×Õh0Z‚@€P'*S ÖLZwŒCrÂN ¼KÐ:¬c¨’7ÎWÇ8nfv<ܶýìî9E®@$…ñ-…âõÃIÓ#(®t‚˜ÆR¼‰YPå–E{º4­ºÏhæ©o{E Ž_PeÉSh€ Zßxè{ë NzfJ$Ì-GºúœaýæôÚ¡‚`íÎêk)›/¥qÑ®®_ª§(Ì?4°ï-)dø|íº"BòAG®“çzN¶Â,»$bÙC>×~®`åuçøÑÍ׎(¬DqN¦FÑÈ]5\+ø"űO4·ÖXg¬)F×þ²‡ÉwΚáΓǎŽ.¬fÔyqç“üý_<ìY‰)|q3 ÂÖ˜2Ïó¢, dÓû,LÕ5wïüäÿû¿üÇ߬mwzE™ò²4–¶¹a/Ö` ww¶†IG -Í?Ýàcx«윻/yê4†vXdܧGÖQo ‰Û?în¨ÔÆÀK`oä|4ƒN(ÀíÍ™5¨QZU /ªœòa<.†Q=¨HaJGfì:…: `OÀ8¤D'`¸Ên®VƱ±DÏ e$%‡÷¦^ôÈÚ¼¾©–‰7Á@}ÁŸ?„ˆõTzÃ0×DDq£µ©éë£K)£¾=\ºÓ Iõ\îŸi—‹µ‚ ±niîÊÓåË$@ÝŸ«}¯8ð'Ó@'¥ì%OTEž|œaúJÓ4Í´ç¨FN7ï \8ÇòØW‚ b’Zuøb”[Q攈Íwò=u»#@Bg1Æs z  5}âÁÙ‚q W©4ÆH¬VF¾HF ¶EîÔ´-kàžÌvO×ÃrC6¾XaE0êi1°È"q 1F’wû塞/Q ÷]¡Š ÿ —ž|]¡³…ýüØr‚ŸîéWjîj{%Ó"róKÅï/){: åÂ(‚n4(ð0wEp^Gœ9 2!ŠýhÕïOYé\u_›Ë0êØ}ñ›Î±Xz¬iP•}Þ;ØÅEy0[[–¿ùGKõo/¸îàÖ§f)çÝÞ³ýêãÛà¬u1>uÂ"H€:«5šõ ÝpóæOþìÿõ¿þåO6wvÃþ`Tg™Ä”6Þ‹DÓ§îôÁ9@},ù2¯Ÿà›9°=Y|=ó×OºãŠsüûUËæ˜Bcæ)ÊF¼Õ ЕE¿þ4?4 àV—ÖÎ'H „”!"®š6ÌÈØ „ „´~I£»UbBÜé9ÎmÉlphI,Ƕ¿Z±Wq:¾@3®,²%¸²ÓØ–åšl; jÙ;ŽD„f•ôLà–`TÞQó϶N.!aïáÊÓ²~V!jUo=ÆzŠZÚl§«ök3%)õñ“÷ï&_™üû˜xUàÒW¡«ÁðMÍf=Óáòbж[’2¥°›[âŽd\óÇ“õ`ÎÒ(Ô`Ag]gT”Ç›£ q˜êGúŽY¼pDÒZªBx²^)˜B7Ó`eœ'ìdP4]nËÍÃn³ýl±1KÁUT`UrÑ„Ë|TÔØ×¬"Õ£ŽNÀ´iÄqqx…õ+§[d‹7ÊWHÖnãá£|Ã^RÈì†?q|ìe%X®o½ÓÒÕ‰Éeéä€ô ð´rI`¬ù§È±¼ø©Àá÷ùÁí7æê„DŠ&—NA7éÃ1Æ:¬†Òë˜Á9+ ì¬uùÄrèÓAgë)ÈÌry Q:×éô;OÜÇÝǶјŠÂ‘#Ji\vV?ÿÉ÷þã¿û÷ûáíõÝÝî¨(ò¢,±–YPØîx…p®}·›XA¤“öŽ[<й-ÌbìÚ¦³ìNÍ)¬4 ÕL>ºé«ÛÐ_Ýk4a+“öÉTvXðÚÔ~Px¯Þ)áÈlÀ¼»°8Žå”ñaQÈ‚ÀJͯï=æT„À´âÀ±5 …eç<×E*Re54©0¡“¥­ËñÝÂÒLÕe°ÇæÂ„÷ƒÙ±×ÃŒ ìLw°¯¼?s ùî½uýJ 0­‹ Q%)KƒJhßÉÇ÷÷3%ÒÅ_?ú“½™ßVÊgdT¤E`æø9…•EVò`O¢Œš™ 7@5d*œqÈÝUåöO+ Ç-„Ö"QD50 @`v¨?»,¥€¡èG®òxTdÁÖRÍ1½´*`'°Å‘U \pNˆƒ ì$MÀ½UuèQãÄ‚öÏŸW;ŽoüñF`| ¢ ÏÓræ+Ãp@ç•Y[ÄâÀgSLj`g?Ø'|˜b÷îurrí2?yta¦F,tí.©÷[Ë·//&¾%tbFÎÌÒ`RW^€†U~%ÿ³5RßœËi÷õõ’¯a,e?⨣ _ÞyßupúäŸ T wÿê·È§wvØ»mÐÔÔl³,»…õó!';OmêÍ®”}‹ ÂþI³ý|õΕ?øÑ÷¿ÿƒðùõG/6:½~^£Ü”V|Ÿ!`óëñ@&úFg£Ÿ ±vªwÏi¬­¢0[7zF%º¹#ZyĬ‡vOl'ƒ`¤’ y±*†¸ˆRtöœ™&×Ò£(ò líJû8*òùo”ãÅ×84#bçDi}`‘éþžQd©-(E'5ˆB‚ža™Ãd=YH&Ö\¾7KÁ Ù» Â0(u¯9+åvÓÒ”¬@ç³`vœL@ûÛÑælíS}NÉ—­ô>î›u¨(‚ \ÛÂ;;µ 'ëß/¿vdí“÷ž ^}ÛgbÆéD¬l«JQDx¼ºôa†­z–h±J¤pÃj!çXIJ3kJ¦—c¨ÃÁQ<]•- ¢¤¾^Ë×yžvþ.NÉ/p½„À_à3'[s*€K1â/Ç-8CEÄ©ð ÁÎô,ÍJ_Z%Ù;r`»<®RU¡ÅBbùø–!ÏbçïËøÛN νp*Ú6 j 1$p Å„ ürûÐú[56ê׳ljnïâËs£Û³‡-,ƒŸ²=y …GOz¯% ¼§ AJÞÓ†~ÔDD1Ñì£nÍ‹ï“;ú&›üɃ×÷§DºšZÉxMGþ<  ÓW8AœcfcØ9cm1ø³»$¯ýí®nêôiQŸ­CQšÂØQâvú=‹†jûáºS(2Ø –ëw®~òù×ÏI`™³aB@¥œA6tÐΊ`/c–3Éç^ìj1Θ|«±È¼™åzNû!- ô°Úv{Pq±[Ÿ¿m.fôZåÌ¥’“„Ã_[æÍšQ ¦>ÿÇ™ï4 û½ü“íÆ?9 ¤¢¢ cò–WÛ‡Wl"óÙ–u­tq~Ž û+gJaaA÷AŒ¯ ÜJðï b ’ùôN³3´¼’i€ dñdÁT‡—S²–ÖP­R}N0‘±.S'¾5¶£Ò.á€,2“|*{|pfÁ‡XîÐ/†õ] )]…J0€ç¥E¤€—Ú¢ É|ê¬2ÉS"&«Éð—Ç×fàÜ=ظŒ8úXö,®»7•&vøÉjZ{¿™ƒ1Ÿ¾1Ÿ )TˆåHi6 ´›Sì|uÁÌÖþz]ÑÌݹV¿\'…ãUް O¥v09¨ÄJâìè+éª~`™ÅZS®ÿÇ-¢·ÞmtV±Ù„Ä@™úƒaf:;í¶Ö×<3J©lðdDŠê32*‹ÞÞÖÆN¿ƒa>ÊóÜötl¬C1¹›Ü«’¦sK‡ÚZRxo–µóåíD<ÔÎ6Y‘wŸOè'¯âârÇÇ&m#¡ºõÏ–íÞ¡)ƒ|{jƒx¥ŽU`ÕèžÐùju2{Vpk­̸–@7wh­&‚€¶¡?a¿O«ð%vÀNƒ6Ÿõ-¤¹][ÞNrYð‰lD„„Äl±v 5(rÑ,÷ì?¢G¯õ%BÝlqêªÊgÔJ£–ƒLÊÅÙ½sõóŸ¿UÿK>óÍ„ ‰«•DªëÐß!u’ãïŸR½žzmZÐ8$ƒb€Eð¸D8‘UئXC !°ó“*¬“°áÝõ^on&©g>èØ a ¸RáebÎ|¦ŸïZ`Òü!€¡ºª²z¼fÚ[°Cëf’=°¨¬Ûx–žº­—çÄ–]gÇb"¨}0&xoWz_w8 £JˆÈsq"R-YÙq<îcX¬5¿¡zÿUDt¥ùäÜ4ÙFÉÛ¼þàd-î—ܹ“àÜÞƒò¼"€p9µeÙUœÌqZI*ÄŠ ãÞ_“9ð–CwåÁ›û”òRÂP­LrÒþ¥‚¿SH•¿d±ÖÇÚXS–·þ÷>·Όîôüj÷À¾t”[¶®˜mooÖŠ](ŸolÜ]Eâl¦ÿ¸¡éYr¦ òᨴV|‰qÖ±—s8cg5D)2ã¥áz·>d„ätqC×Å'ÀfY:°Ë&hà1¹Æ+z™ØVM?Ud·êÄ ùÖ,lÜ@•æÏ"«O§ò¾;º¨b•”Qn@]?´ñKÕŽnwYéz­àÀ‚,˜„j¥a@c9äïÊDò»ß4CÔ{ñIk!}P8kM¹›l«%:—…6 X@`T4 ƒ] L.d–²³1“|Ùøš"’_¥§rj:Á™TQ·[a‡ˆ¤/®€™u9ÙÿóÆ?Ÿv)¹z_ÿòºúÃ“Š‚b/"´Ækñð^Å”ie^K›iW"€D#g]–â„ÀYÙx‘˜c5_ÈWÌÜŽD Ð'ŸfÊ1ƒ¸rƒûµ£Z`jA+ j·°?³#“õfU.!OP(Ä–Uø§jl! ÄÙ’¡‘h@ ý»pâ‘=ߪc ŒP±¨Ž±ç<梑MûYÌ8S("·`¶¤2e3)ó'DýèóÓ«oN pIWæ^ýü>½´0úræB Ö^}ŠÍo×™¸wëë ŠXˆ7GŒ‹Åµ‰ˆ¼•ÄC«ÄÙÂ~t3ã?\Êíàãé‹ÓĈ@¯Žϧ¦jH‚•Â1Œ¹O,ÂlëŒ1Ÿþ™SqàÁYÚ|Jß-yüŒ^Ò«ÏØ²°µfðTuÐÖ/$*hg%âå¾2ü¯Œ§cË&R|ê4üÇ_,lKª=ÌŽe„{ÃÚ¶ÏAEsž("+Ó^Ü8)B•ê—–«+5€iÀ.ˆAtV°œ€‹YF"ŒèS<ܘA©.÷Œ‘ˆy‹º°¤e› h¶(!$ÔM(s‰²P Ú¼hµ®» d³«rp‘ô²Ô30¤F1jN%ýÐÜ~<»xçã3ï‹þÕéÙ¿.þ73â³2c§âŽ+±ÉÃÀw‘Zg”5ÒhvAJõú°thÁyŸ#ç«„­CJSibŒ2£0#á)D ›ïØž;‚A’žnK(â¡bDš„ˆ©ÙHüÚ­ Šõt’YYvÂAí 5ÀÜ/† ÈÈS P>2³ôà@2ã_¦q{U˜‰Äàߨª«$4ÁbFˆ"‘¾‰ÀH„Èûª¨íq•U4îÇÙæŸÌï¶Î0ˆ)Öï^&îü–›¯–·úç)þŒäÕ%óàNóL=Ü3ÄÖI¯Àýº`‘9Åãí„12»þw-.}ÛÊèöÆ×³4ñSÝàšÑ@åż â*ºU•_"0†Å™2/ò]‹?~ ‹é»ï%0l\Ù\ï妾Q6w6w¶¶6q_,Ú\¢©³suÿÅz3 ‹co€5ÖùB‹ªnžN[ëPn@g+í‡CwÉ|Ù ìVÛ=x¶á«:±‡vÜÃ$Í:p€8*Y'1ÂU¢+‹-Šd@~ky[Ãy_3…4¾¯ˆ!öÕ®I¥T?ÉÚc ˜´¶ë”BÒÚ1€VŽ#¿6Ž¥(<1Ö¤9nfg]Ä1›^³(—jz« ¶¢Pes½Á]s"è…¡ØIg_l.,°èîƒå‡®q޲Ã0“ p õI ÷j›ÅÝáAý×½?<¤Õ­Ûß^û Þ|E¡Š­aœM,Ø«ö€²Z£–MD’b™láB*Êä`cL(F|_O d Âb­íí@9¥e%‹ø7ò3W.€€dµJš1Þ-bÌp'CuA‚0’ˆ3ºfºu)W·õ©»SGçÄ(.Œ¹M)c™A §¤ñÏâqã•(=xMA—GI™îY€@C“è#ülgáù×P ~²²OÉõ=x­¶¹zj&A°¿Þ ö×ÒFÏW_m’ ‚ sY™å]Fœ%«`œ|ì@\Y^»ôõ¥»Ÿ-\NTYˆ~¤~®° 9-”½~ZîDØ“çùwŽ|èýn?=rw³\|{¶°lš3CW¸¬§ký=;ØÞìýdC¡:tdõ±€^xi_»žF 2ù‘±ó£ß«E"ž³ëƒ´DêUõ…i­˜+;pvµÞGv‡—•}+26ˆM(`b0à7ªà¡Â¾%šX+;ÍÍî¡D{söE §[AU¼JT—ÆýýDú(<´ÌrcÀˆ °%(®K–½9ι¡u Î{)e"#'x»þï/ÎŽ:Ív,àFv4hÕ¸?L8i  ´ênÃŒ /áw(6òýƒ»ÓÇDÈ}qâyGKZ5Û$@.E\ðaÿy­”Z²öpéÀÚ/Ž|G‰Ò毖ÎüpcêO÷ õxœÑXT;&b *R ³f­UŸŠ‚Ù‘4¦pޤ“‰'uˆ €öy¼J$õ¿ ópÓŒ2-"ÀËSLqnþºg`ë›n*…1t«pˆ±- fcWm¢8q£Âêé¼’%ÄÐ}GÖ†t“`УŠ&ı„€`&õ7ŽU3A¦åafÔ¨dñb`Â ç² ®¾ôð貈Xs§õæM8º2¸2w"UBèÖî½£,Ö\?yªÉ€èA8OîÉ”T{>ÿ£°3ƒŽ`á="¾ùüýYí’ýG#vQlÅ8ÖÕWKCñ_£cç wþóä ‡Ÿã±á=µºòî´L5ºfØÖÛ¤ºÝa¯7êìþxWcr¬ygH­œif©òêpµˆu¥ yoçö$&o?~aë9£d'·ùà‹Ç,AŸ Ϥ,ÅÍñ+¼Ê‘ËUÌÏW,À“F(è«JÏ :aq¦,[ÃÇÓ§艖¡ÌžT¤üh$Ò1ªÃ3 íC]Ѝ´Ö/iܰ ©8›  *çDØ 8a /žÄD’zg É!ålëÙÀI ºWŸÓÏL:GQ ¬¦RÞsQ¢(–Ìf´±¬¿l\ ¼»L/hefÙQš„‰V*ý51ŒÍáã­Síïn~ã âÓ¿Ñý@Î|3SÊ—b‚sNùŠç:à$QêY#˜ãMܬgÇâF_ñJ<š ”„ Õ’Ô’0›*º®ïó¥q óÙ?®JÂÌ¥Ýj„:ŒÂŒbŠHØóÄã&lOÃTÏÁpXêÃ]M"XÜ(÷Á“#í…@c{6NœyÁ0þâÂÍ‚ª2Û£Œ‡ížv‚¤¦ –8dfŽ#èñºJÌÏÓdø: Þ¹ýfÍ&{•ïÚ—TŠ,À?ëòÒ×Èbÿñ‹·RZ#0 }q-ݳˆ3 ¼¼"&å Š°åÏ>Wô͹ÛüüȹÄüÀ…”‡éÄß‘¾ Q°Åðj±cqlK»ùïî%x¡m÷ÏÜTÃ[gÞi ž¦Ëmz–©Ñp˜w¶¼­%97wmƒ Y9µÐlÕ (HIªsЧO°‰ã”EöŸ~Ôa%Çæïî© µ(ÌÂÀÖmwl?1éKAxVMlh"´Y¿’¿yëDýKi×ÞåŠ\­¦ÇHèÅæÌ6ª³¤|ì—ÄLèq20W]¬o[µj¼Ä´±V°¥„j™Œ¶ôJJ´BtU6D‰GL¦àÀ'AÄZ³ÍÛµ}ä6Ȩ}J–Ãsìˆ[¬§Ó7‹3 |ÖY~ŒÓG—°•iQ¬µF¤b'GK ÅöãìXñ·³“^ßU®vöÄ\-««„*B‚±·~ÒGºqJ^·«ÃÚ€$'õUçèÓ8ff”Îzm];>Ýòú‰œð K@øÿÐã[b€w•M‡ˆ¤B‰blúùÜÃòh qø`î¡¢Ó åc'¢n"U<<¤áȲðÍ. R¦ {†K D°9¢u1aÈÿþ/.—‡„tmZ¬YÇÂlÍ ÙSK ‰ð!`ò§-’ÛqÁ—JªZ~vù@çé¾ Ø»¿r›ë§¶^ ¹h†jÕ"šL£f±fçÙÊôG7ßxÕó|cö»æØwê¬0¬@*:F•,ш ‘€t–ÔÒà7@ß8qŽAdp`(jóRþIC`4 H’°ø^s°gK$f>Ú"Š©Ã~¤G¬Âý*¨§T°-Dà-âÄ(p"-¤Œ3;±=ÃÓÐLcÚx”{0ØßL+ÇØ8]€Ç5{<ªÅO¢£†â²&=hÜAÂ~¨Ô°rÝ„\•üGûwN ‚Ã{ýבvïÐÂs§y<ñA€?îÉÒ»d)ßÍßj‡>ÃumÙšv}”ºžÈp Ï·a“ß»Iðþœ³Ý_9ZÁ<c|éápdùŠnzœ°"ÌÂŽÝèþŸ ί=ÿ°›îu [/»©Ý3¦ z½ÝÁݿϵk]Ln ˆ§/œ˜©Sª´"a§Èç9 D£r–ùVÓ÷6Ö‹v›§‡7ÌìéÞ5-ììÆô–³4„cù§L(€&-{±ò Ïe˜N®ó¼”‘­3罃3Œr«ùÜÁÁ9û}9xCqÌÈŒq—¾cL“—›X^wI¢¡©qSkÐZj[ ÙŠQ¢™0t>±$uÜv½-ßc²5z°(2«² ‘üsh·cfTÃI)GÝe¸9u íƒc{]}¾Á­"h( AÎùï9±ý&À´*wÐñòo²?˜'ÒêÃoÞ¸®~ïx¢=7c<\ø¨Á8¾@$"J(Íjˆ~J~½ÜYçÂÐÇ‚¸ éÁTÈçHä3 ƒ¡FUgPÈ®»k ³/,+Òcù€€ ±w (²8­±Z¤zÍ ÷Ûù{:2S+iPxÄ=ã¦`È‚SJ·ápþìì|[€4cH ‡f¤pŠ„yU5C ½ãxÌtD K¹“D69®(j‚EÄÉ\î¿‚‚¶,¯]ÖJ~ é›tµÿJBJàÁо>e¤|ö‹‹MåµM .·6-s„LƒbaŽ@dBa6®øó>-þ®…òÎðÝšô§h˜»²—6ùð0!P^Ñ]Ýøcðºþþg cÙüêoD¡;>}m®¶}3ÿƒz…Q‹£á|±mœµ¶õ¶;7~èRž¹<ø‚•Z¼tbz*%fA•¤J)ŸZäñÃPöºÓÌ‘p~eã¹\œ{¸&œ¨Œn«Ù1™iS*Ôÿ>'8Þ+cB â¤é$Ùb·Áþû‰Sï~îa¹6s n»FgކX›‰ÄƒÙ DÑd ¡¡œˆ‹B6‰dvâÜH×n$gÓî‹w =Ÿ(5j—MR©Ë‚Pˆˆ\Ç÷±»>`?Š©€°ea Öä–¥’Ð`à¸ad¢ ú€C ›ôáЃøœ+©(gëî:i¶c<5¤_€“*<0S¸ØL§rD»V1kÖëÁü@CNØ· :å²Ëö£ô÷ŽÕ¾»ý{G‰n\yëüê;~úQJQñ(t‡¨žÔPJÿÉ¥uÀ¾,Ç{»ÈæÂÒÿ‘ìï+q³PÄ12t;,ˆJ@pE "ؤ ãOµFSÆ’Rà À„É1 øÃx:2.mö-¶ns-YùÂo¦*VÈÕéìÿ+3 1ûÉgLhâjZ1ˆ‘xÖê"-G‘Å)цëÆèÌÇ-«_BAgž¯]&É?™3Å­éS " ËÃiúÌPÿé—§5"±3§]AÕP%‘o+ >™Üè§CšOÊü¶z3Qªš=4  ´[Àq¨ŽŒ¯¡€SgY„]Yš¿ºF$—³çÇhgýÓ©ö4¶zfºè[fc cÌ`Ï]ù‰%Y¼´yÓ!/¾vt¡]WY’h@Щ¢`¼¨FM±ä•ëyÖB9ëîpý¥Á—ŽEØ‹_Hý….í±vlÔ¨:u'L¾é·.í1Ìq©¿lXL1ªßv§Û€pgù±À¹ZõôO ‡'ËŠ¨äJÔJ†wŒcPµ„š‚` ¶bCB9‚£pJÉD`óħևȡza¼Ó×¹‘uÅLŠP¢šAw¨ÓEìüv–¥z´DÄôwôž-ÄüÉÉçf[©w©3XNXÈoÔ0C)‘–ìàÁ‘íüã Ê¿=ÿ³µÆíê°òú ŒS.¨"‘D'õ¬Šˆ…àKŸòEbW†m¤ü–ÖQÅÑ€ "N‚õÈN‰”syGu }ó ˆ œ÷è” %ó²lʇE­¸2æs‡93И ìOJöY-”C8]…nõÌTKx³¿?b±L&Ž †lÔ`möŠIIˆûúmÓô0¸“']Õ>¥êÎýko¤V k{yŽøÆP½KwŠ—*$´å÷¼tZX÷nΜMÂÔŠón)3ÐÁ61‰ BˆXôÚ=·?"üÆãۗ÷¥~ÜZñª@€à1d@‡0IA `Ü8jØÚÒ¾ø³Ç$ûÞê®Cg}MÍÕ°ÖÜ¡Ù~nŒeçJkŠîvþó°â¹S÷øÈ;+‹ÍLk¥´BR™Vþ'檹CDÂý§W‡ ‡aádï¦=tðÅ£8Š;ÝéM°åÂ%xø áßUu<{½w¨˜½Ü@À9;¨mììÛ§@nÖòœPTÙ8„':Ñàê"ôН,©Ÿe|þ£ÒZO1`1kIe5af±&rÌÇ!}±³ô§ŠÒxÊ„_øº…ÍnØšUå®H²Šɦh·¨69UDŠmÍêëÙiÅ ®ís˜okoÚÅN%1  ú¹šáîÆúÑæ¿sEéµüºù‘¬üQCTt·Ä²C¢Œ¤Z‘ÊÒz«6ñ±ûç\«€Q ³W´Âc5ˆ¬Ì00g p‚:*I¦µ×£ˆ-û EãÆ&HëD‚©òO8¢U^5´”%a£0+Zg…1ßÍUE®•´œ÷465[Ç|m¸¼ÿ·õÓÓ¨<{g‚.;F¡†â˜ÃÚ9ØW£˜tbëD^¨Ô¾afk{ô |1 !èWDº¿=¶vzI@ÊòÓÆ)§áÄÂöê©zâÄ7obúí¬„|só­éÌ"!—#s°-ç‘HñAô"(aSšÜÃ…¯³ôS»Ec)à$9b¥-õóÂÁüQ ý/ îbÃþsG¹Ë‹­9(wö`ÿ=ÛÜLšÛÖkœµ& {[Ňß//¼´y ޽¶²4[ÏÒD'I':ZìÆÙ=Jékúñ 6² ’“S·vø|ýÁó*b‘áöÒvY5N*‰9çcçßäŽÇ+ü Q‚ëÐÂj¸({µìvzŸîî{Ùå„üEñ•ïŒªÌ ÿh$êÈ ãõ¾ ¤¨2Y´Ap©³ ¶–ÇÓœˆ“ §.!±:£öðˆs,ÎåY'ÝOnO .EÇp;];axŠi(Ìùn}ês¼˜é»õùÖÛ:Œ)•ºVe~N§˜OU]í$ „˜L›dH…q5›1Î&X@Å},Éèu(¤wçAÿK¨]Þž:­|¹Ðÿ)È«G»Î§ûUâ5Y’»¤· À Jˆ#®H¢³T˜?üHé÷,?~øÊ¬VÁTuÛ8v7pµŒ¹Çã¤%ˆ—^xý*ÀX¹õs½¿q¨LÍÎ¥—Ñö”ÞuÎ:fcÙîùÕ÷ M :OEèÄë‡fjZ–V$Z'ÚÏ%8اüO”\|ñlTëBí4Üýн9(Lb[õÞ^cˆ‡)àW¥òkÁøW›Œ Œ/P°k†­-P<bÓ`Gи¥Î*¡Þ£Å'ˆ—3æ2®ïp=çÉXˆJã… >+Ád­¤‘"@Ç¡EY~Πtã8ÎÆoqüEí}vÔ\ïÆÉ‹u£t—Àn§óÚ÷LÉ¢–Ž­€Zá—f´£]3û¢sl…6;G@u ì«tU/ë´_ÂR‰ò­íåÅkŸ_þšBQ{?~éÐwóýÜUÕûqt!ÕÐó¥PÕt­®A$÷[k„A¨´<¡É`ÙÚ#·2O4åHÑd¥X†(Ùø@î:@bÕŠmÅq‰ˆ¨$ñ{O1Âv6I£;?rƒ<«Ê#OCÄû0;±¥åi27è¨s .lß;¾4E*ì‰üÃâ‡EÕŠ/:²cQééð+K~ad€z¶×24âè, âM‰á"ÀîÙís^MA‰¥ß¼´_øó.¼Zû¢ÿræaüùœúvÂjô¨ÿîTª[.ZõÝRÉ,85~ èÝ"œÿýH¾É´ó˃¯5Ha´xŒ×¯ïBééi%Þá@j+ÁY%°–‡¿z®P©sS¤ç†w;¯¡Á>é[ñw€öù7ß+¦On¯d'_;>ת%I¢µ"RIšh *š¨¢B:púÙ.ë!.^ìQ´_ê]±aNî¡îy½Ü©õðd=¡*ú˜p !ݺŒ·®Rù¢1–Í.å v¦ìN=(ŽN ¸/æö¬™Fò~£qàøH §$ˆˆ™®½*ts[Yi5j$ ÐÍb gIÐ;F^*¨‹*¨zäã¢åìQ®‚RÓòPmà<ËZÍò¼BB €Eâ{]s±ÝÁœ|Ù8âdm%aÉD@ “¨¤””Ã.Jæ?I»05#ÂygÕâ¿Ã?ÞÏ à׿uïcxçÛµ÷+”wö—lò//ÍeHÈ n LóÂMÍZQ´V4 ±-ÜÓ_"|§éðÎÞ;m¥°‚;„ LUs‘j7—q ®Oûö/Qœ€ˆ3¦´ë7XØ:›@³óø^ÿšØaÇbJk¥èÀoþª¯dæÈö¦0žyíì\­VK´RŠ)ÕJ!F芠‚K͇{™1Dxhþñ38ßxü¼pÐÈûZš=O­Ý7‹2SÇ$Àx¡FFT¤5Ĩö ô/]ŒèñÃAa`W kýÕ…C‚úN ·dqˆÄï•Ã?k˪7…ÀGÄ^-A ºÐañk4…ÌLä|@íxÍ"_‰/S æÇ´jʼn0 ³3µ—î(‡Ó©0u Ê~ ·P•) vÔ™kªÏQ¢øæ¬2€(À# u‹… Lµè¡c¨Ïhnߟ]¸ûÁá?ÔTüå‰wjÿݲ‹b'sW#ÄØ‡‚62•ÔÀ9 B'ˆ ´Lá×cqΚUB{@CäÇú Ì | dÀÐÈXÈ¿Î3{;dÇIiZ„(b% o‘%t …4AÆÈ,o -³ñ¦®ç¤®·àŒ?ž Ebžpt‹ë¹®,¥°MÌÍ$48 P ¬T‰Ý1@ìèÅôÌS{:-8}蜹o)+ óê#i.×Ö ' †`°Þ9Õø›­¯ŸcD½úÑ×;?æsßÐèãmªÙׄðHRØLÛ­Lrã˜ÙFµyMšóÇ ’{R+O¦0ž¬!» ¥dM$}o*b @õò!Š»äC.9äÙkR VMN û[¤íUÞÛÎã1+{Žx,Ù±0¸|hfÚ'4£¤{]Îw—k³‰wgC\{¢pœáÇçe’Œè×}aAÊT !Axß(«Öý i\MÄ Ä1t>;ùâÔ´±|íÀ>Å×vÕ«Ù >­Ñ!ˆ¸ÝŸk|s_‰<¸úƼöK3(ivPšuPâ&ôôÂàìê¿Ótƒ+»ß˜'ÜGŸ7†×ªú^‚·Y&ê!S†c>œ0;@Ãwž)7ó''Û]ÕÛæôò9×÷¡H"Ž…Ë²Ù®…Û–'Ô8ÜÛ¡³_;>?•¥I’$:!•èÄWvàUeHsçol[êaí|ù[n+?-9n¤E€:ùRw0·ž¬¨PïàØÔ‡ãš0†U‚aŠÓ 0„ñŸDuWöél‚h>ÙÿÂâKY”úDRà>÷{ð×Ö’Ù³Ìw6 0%*m ç D'â\ÊžIÍU2v,W!íE:†>*E¶·­âúBx`sÓ¬ñˆØÕëè—S3PôC9£]ã×3Ú,ìÉþð({±yŠW¸¢bË{01ÍZͺñé&-‰²¾û&݃Aà Žû`ì ƒqá~É©FvŒNSö†9>KÊ“ÿtZCÒ@h¦uØ$óXí>N2äJî—Á( ÂPŒŠæTnDjÂÀNìÍÑâòýêÔx>æOfÁXõû¾¿‚%q¢'B@>&IùnóàhÊdÒ µc€–`ÜøzW„ýþ´ªpßï_$Ù»‡l®¾ÔJÙÉϺxøaîÜdz °³¹uÐÔ]`ÝÀtÌ·Ã .;[ücG޾ÅòâË£óMŸø gqëNQËKò*Hx.+Ï#GýsØÈàs²âcÐØaî&ÛsF#$$afçX¤4¥…þPÝùßž)¨)Ö­Ðñ·NNOÕë‰BTŠ„t=U*Ìi Þéß&¥SP;°ïÉc:·øô~\¸ŠC…b¥4F{í-KÈÁ|ÒßN ;lú~o8¨ ³@ªG®h73¯rV0ˆËì Ý€c¡0ç9ëé~Ÿ ë€o×N=èkµ¨‘51!Ê)Ä2Hè¸"Ó½2ÿ†™&‘OyC‚ö¨ajnàXÆèGä Qã§[W÷o¼¦+î\Ô‰ý\Òs|cî’€Bëö~!øÍ–AódõµiE€Ö8™3høULl÷˜Ä•víTß©Y{…¾™* •ãEØÅs1š=Ïe"·¡ ­wÓCÇÖ^7úö.Êþ¤,‡ n>…4Rì3³sÖ º÷ð??W”.©ž88ýÆÊ\³ÙªÕRh@B­=·Üç‰}}m«h E©ìbýjî^K¯ïøtZŸÉg¸|1­§ s`‘AMzâ¥jùƒæ10&ìÀ1Ø—ÇóoÓGSäÓ£‡3'…Ô‹½úsLÏù›ª’ˆ!ŽPE*®¨ä¥¶ïâ€4M5`T¤aàDJF–ÙKcBÍN" läV¤1Y¶¥~RP̶E²Gs8¢¤s@ ˜Ô¦$Å|2’JÒÈ€`óVífv‰æºº†(Y&IT©•¯@£o¥]žOD`Ô[¬À_èï, þæÑ[÷¾Ðï_" Pé*Œ¤2""%õ¬žeJFÄ-PËz D˜Ì**9®}¶A¨¿‚©ˆ•°À“¶çÉP‰Ìssýbø•*ô°r$JëR„tĉm,5½–]¢£rLqò¯\åóö«°1S”Ð.†„‹ ƒƒÞu}¦ÿÐñ6ætü½«@Ä(õ•ñ€¼²à„…ÃIAjv­'£]%ý ò„¡øù¡î±Y(ÜKîmãËí[rÂÇ­!óχrøf>\>š"€ˆY†Î(©¬-A×ç·õÌîG]<üªð“ûççCÎ ‘O´±RÍ9ª'Ø.Õ_iÌÙA?éwòb­NŸ*0îLÃM«Ç»Ø:ÓÐ!ZNœs`mYÚ²ÛqOþýU…j^ ÑʧgkY#M´ª)ÒŠ”"ïï?´rgàTÒóÅNŸçÏG0nT™_Ôí¥½Ù9¿’õ‹ÞèÎà øˆ\‹ ™3B‚ Æ0‹î%Ùƒä Ú¹³ï!ª‹5E4^ÙãøS 2^B¥ëzþ„ÈÕ5D!0§¤0eÉÄ’¤\2;bÇc¡¨¢±bÕ7‰2[·¢›÷%"ì†j—±è&¢g½˜)mC¯T<ŽÖ‰U¨ 8³)ó§Z*9¸)šÄå4²( T¾÷c:áà ¡Ý@`l({Hû  WÐÔšnd²¡Q–æê^ªV©\­(ÐÈàÁ`a){̸ÊB I‰“òSwhîSµ<­ý¼è¿Â WÎò`$?ö¿QT› "psjg¶ŸöúÁ¡=¡*ŸO@\µ Σƒ²¼¿ûºÀÎ-ÙøùÆ¥¶FdgW¯*ýÍF Ý;/^…ˆìFÌ3Ù&‹,‘Ä ú ÛZa'«‘z¿)Å•Öå #@½š’ÇÈpoø¸?᫟XeBø„µ ý›pôá.i9} Z´Ë4|ù”@RâX,;cŒ1£<ÿó[¤± #ãôÉ×5ëZ’h­4‘RIªiE¤è|4¨å†–o<‚ãG¶¯¤âür½áÖ‹æ^í Óz`{C,¥Ap–u~ƒñÁ+[‰ l¼Ì lݬòý}Ï­¬, "SôÄMÂ{¢>±$æÊ€QH׸AØEg€­µ€adëµdÕÐÁ/ÓVx-Du 2›.dÞ‹å"í%3Pî’ÃF…$͆۵£^#ö"Ý‹m³0¸·|ˆš¶­µRBƒ) °EHH¯i-Y aF×}>:Š]~û+¢7¾ùâÇòÆ+¾¿Æ¯„àaÔ@*"j©Z=~„}):*…Çô0ñ©w*_šªà-A«éDRtPgÃ’„ <‘¬u@æŽ& ü)DDr¢‡#ż”*©Òï*Çzïdtl˜y;fËvP@‹{Âõ4ý<~^¿t«ÿÊLc¢ä©FÈÈ.4ሀ^øº <„(Œ8«Êt˜ŽŠZí}aì*»zmñÉ[™[÷ùÙ:¸OËôòðÆþyE ‚Î?-Ý…³Æ©á½ÓS…ndl­Öa‚© ïóàŽèÕôþ}cÌßçrò‚q·Ÿ}mA‡÷Ÿ(Bßc§ÜmEmòº£J×àw¡$"♾æ~9ŸÝýú™y×­ÑÍGï­‡˜E;gío•ýÿð GTO­spø½³æT½žh$ PQ¢I)BÌÞº·“×¢@½4uu_É¾Ü ÿbAdqlín£¾7˜ÚÕgÒµ>~hA㤠l—ç¸Vní8 ˆ¤Daf“—{S›»‡ À=¬ïÒÌŠ …- „oqÒf„Yr9Áµ'FU¢ýÝÜ ™•@ EÐR† …+ûÑ_p(<$®6ØaÒ. 6Oû´@v—¦AM¥Ðc"j¿’úÀ ¶ÜžÓ÷š'q¡U–ˆ(’ô @T#Ht•ˆÔe'·œîóRVÎwÎíñ£Åßo;÷½Ú…ײ?Ù'UúÊD7(Iº¡ì8øü Ï¡FO' ë[ Ö÷+ÒPvÃÖ4 ˆuoDPÎ僭½ÇÙ‡Ü@J§€nXh×Eìïk5B{à}È2þPx";>ÂX  OÑ6BZá/ýkꜻÚZœO|”¼HE‘îê¬òhœ•ìÅåmR@ö ªQ½c½x˜}E„ñb î{óÉ¡íÃÀÀÇŽ>ÚPgáZz4!ðMâ—TíRƒý‡ö|PvÄ$‰a€QJá©f`ÓôSxñeßVvûãÃG2¥`¼Ð *ŸïІ¸§±UÇAJÐ ûŸþáVcßšXqõß[îµáÁ•½7*T¨µBñÃÆZk‹=6ýc«(Ó–~ëÂòt£ÑÈ’D«„H¥šHљ÷ûHC¥TvÎ\1Ù+ö³a¼(¥bN¬«F±×Àá°T1ZGÆî±ÊËÚÊ&:ùûÄq;€°±m¶N RkOï¡>¯Â»‰c|41 V*Ñ §…®`³£Z’¶@†È€ÀÎ:L}žpÅŽÚÍøùÏYsEºÕ IY¨‘ÌeÒW( % -ྠL¸Þ*Â8‹)·Z×íYÝÆºW®”`‡$F2Á="‘dÖØ=eà0±wä 6·.Ì~÷ñû¯­ýø½äûæôûiØ1û?Ÿ'ªaDAPI½Ñküý( ¶Ë„`BñvüÂÂP>¦ N""© ® JÀCÀš®Ç„€lÛSÅcxTS¢‘€…ë)‹1ƒ’]ÕÈÛ³)hß´«×8¥ðZÿôàדD\Ϲù¤C´5‚÷yq`߯ñµ¦ƒéPø†ï‹Æ2è’Ï`&€Tè‰Ó@‹e‚y¶Ç"coM5ô RaO‡­þË RØõ³ÛŸË“ƒó‰f;ü)»—O9múÊ4hU K3g¦ú©ÁŸc¢¸ÜþC/yد¦PtE7¨ª¨PI0èŠ(=™AÆ dǸùϼ0Š5ï;S–3¼ºyß_å‡ÌŽ}€år«GüÝH“ÒÄî{íÜáÙ©FË ´RJ§IªÕÛƒí²žMzéÌÞ5wäÄÆu79]…ØsÍd¯VŽ[*QˆB “f½xUWi1Uph³õ5Œ_ ¸§_¨³äï»çäò4Nœ'•Ÿ ¢ð¹pfŽGŸ -¢V Ñ ØVâPÐ2 ñPèI"~™†qí$HêÉ£<ÒgĺÁ°´³uÙUBSŠˆPÍ£ÙqR ô#ï6xŸF5ÿxûÄ;Eá¸3EŽ5Í5…]&œvü8íÀAŽÿ|ïQýTù­ßis‚îÇ[oúeíN’ŽZxTè¹ÑE€™JZuÈ­8Ôª8`Í– ÀÈç”ôN×”O3 pY2B(ep*°¨@%ˆNd”´wGÀG÷‘"?j+3!@}‡“!n&1.+A0x#’BæPá¯3aé•n6ÝTMŸÈ"ød­yñÙÚ‘f;œDäJRîÿ+–¯¼ô(ˆY •^Þk™2ÙuÞû‹cã²cOâv»Ÿ_zôJ]KùõÛ m¿,ôçZ™öbOüdM%ßH =¸×~©Flr£¦Ê.J;#M1¡˜bÏ,, κ;¡ú¹Ç_œßßÐ, "²8„|ò„?e"T³Øx[EuKé†×ù€Ù /7È9Ý®áúo[ßšS)ŠBf+âLiÊÒñn7ÿåÚÒD©0ðÜ;¯n4jµ4Muš(E:I“dáµ{¥ê)ºTûbàÎ7WW‘Ã)" àp4švÏ”ÞÞÏ,Tm“&h@“Zà1 ‰$h÷É7B“B<ü¹2MÝ)ÎΠ¬ܹ# Å[îe¬*öƒ"•f/ÞÞ)‰”¨Œ° "e_Aé„H'ÈCBAÍa;%DÈa¹=â!p®5͈[yxh™ °e«Á{XÊT @„ó\t|ÊŒOòÙ,†ýóbáÔ´«ûEEB6/ 1&Un×¡Í ¯Ö,Ì$$âØu6ïZüôó ßQ¢uþ÷g÷ÿÍhñO¦™È§`ÉXˆØD€¤­3€ô(A]FJÑFô‡Û@„oÛ/ÍràbùOQ˜I@ 8³Ç’¥ž¬/˜‚°s{–ž>WÒ<¢¢&A§u-Ê䃩ݤb4ƒ©¼B¼Nf°‡õ¢"©@x"NØ–#N²RhDÄ9–î¼$¿™¾Ô$o±§gW 8c:ß+¿Ÿ‚‘‚[Üžv Þ°Ì*žðÌ)Š9ÿ÷~žÙö9ÇdážVjõ!œmÞj_D€ºhxe_If÷áë ¸ÑÀ¨i3@[O,"Š9V…NØZKiTºKÇ™¯o¥¤%ø¦%–ÉñœÃ*éJ&SwebPû(,^ƒŽ»õƒ\ÿùFBíïìëåf°÷ñ»3~¶‡¾‹6¦È‹¼7ÿæšÒˆ"ಗß^™­5ꩯˆ}qéÑ’e—ÜV½å>ëÇsVÀQ¸ØiØg8×ѧªøzüÊš7˜q˜À@Œ_Ið•œÈøn[Úa½|Ü>ŠOºK0» cTfõ²UIψH*¡Å3b?ê3³XVJKªÑ8r"”a),i@¾ŒSÛʵSMv]#x10°ÂAÖ ´2‡€°åȱ×þy (JE._Ìè[ÙK©¤„ARÌÅ2€v%jÈ €)M›M+­LJ¿ì¬vŽ'i¾}”QÓߨú ¼ù2ù›7’졾 i•éfD¤H£)‡¦D©y0W¾ 8‡MÙaŠcÛñ®Y4ƒµ}µ$Lp¤@$E¹´P>%¡•Œêä(õrùò¬öʶ8 ‰¦€H|˜[Ìÿa¶yŽSÃašÀ syutpÿ]{q¶$¦è»é(ˤSK /ùŽÊëP=Ýk°Ø¢ê‘‘1l#èÄ?X_Þ:¯EŒÙ}ryp“çŽ<êžh(@dSþ¼˯“ƒþýé @ΰÈ9 t¡o•ƒPÙ~ìŒyô¥n¼/æÙãË )Q»‰ÿdŽ®Gpe”ÊÌõ•ŸB¤«€Ãu8aU¶þÓ.¹Åþ]ïÅ͕ךìc5ʼnsÂì¬3Ît÷Fù § §§ß8s Uo$i¢¥%Jm°^Ôr$Ò‡=¿æöŸí}a+eÅ+e·Ws=žéÈÑAô€â8qgœZƒ_Ex7òrÕ-"L6å‚bËmI¯¦'ÅáðÁÁgÀ›a=6ÅS„UŠê°ûذ×imJƒ`€E–µ#Å싘X鯡Ê^ò:ÙW]lC4v X6‡zö˜°^GD%,‡H)¨‚^å\±­¦îÒ LJ2ÕrB`]9@™MeÏ·žÈpïÉÔÑÿxè;)‹*~Ø>û‹3ÿdÑãÊÀзŠìª¦§šr)–ÿV÷F#-H‚èÕóH̾!½…4:•"é*Î2Loš"Œ…V3ô3\p`d”žä[FàdÈ߸¤[€<ÂAÈhÒ©vÆD›Ð˜’ü·~RËÑ9 Ì2,a Ê¢yø$¹üüîÁå–‡}#†ÿøz‘ þJ”4Kœ“‚ˆx¡ €èv{Øîªr@àü%î¿"‡W ~ydëâ¼gÍ3-àëÃôÂÞãã¤.Ȳù„÷§«ë¯’€pÁ²ßŽ)E’`B– páà93ög9¼²Ïu¿˜9©Æ(L4úöÓŸ!z«˜å®LÕ@ ‰„ÅšÎ]ØWǶ½w8e'¦ûèÎÑs^ž‰(βcv¦4Ö•ù^o÷ûßë'ŠPÀ©“ïžÝ7Õ¨gI’è,Õˆ3¯?íJ{¨µVg¦oîÊ«µû÷b.K(Á„™žg¦ìNwÝR=ú2'hÇÿ ¦¢°Äºà_DE­·¯o› V"­[(€ƒ„ˆs:qÆBÉUÒxÐÕË$i Ó#ÜÝðIXžÃfG8Jç`T $þ4š†QßO¶°2¾#·$ïšÙçùt­^÷ÿÅ9[ Ê CÙQ07Kƒ¾’æ~¡XjºócÙ·¾~Pèñ§o—ß·ßKƒâi’ˆ¢tRk4q`„‚׊€ß_q¸SBpƒZ•Mî¤Ì¶lµ ´F „i8Èå4¬öˆ|ˆ T ÃÑP¤ÛœÉr T€V`Œè¯aò܆¨ú¨î>`°}‹‰Ì)g- nÈy¼®Îµ3 ŸÒþDœ ¤˜8ëU‚Ž'Y´±x šmš½v>ôλ*¯¤ð7„€ýECÑI°îzvŒèÉ3u1»¶|0pÀ`?È‘ ÌvóÎÉ$h¬å6÷@j§À'—ÇÀÊYâ%/ÌWïªö{ßÚ{»Ð„÷¼bc4ýǯ×s¦`†W‡ ‹”7‹ÙEžCÛCÙwVq½Ç7Ͻ”z˜Œ8a瘭±ÎšáÈüúÏ×’Äß·Ëo¼r|vªÕȲš¦$Qo$«£Zj4¨Úeø•Ñï¸+=ßFV#WÿÕmÔÉl×òby¶Š6ŒÙ X»QTM41> ~@cô¹ù›@XÄÛz¾uøÜåä´ÎàØ‹•º !’JáðW|:rÞǮ҄ë€=kG–TRZ`B®ÇéX^}ÿï XÛØí¨ðRûøº®^†¢¢¦Qu[z¥Ïv ^eP-Gýez¦§j‰÷§²Â@©Iº!2C2 ýÄÒ¡°íEÁÞƒæá½´þdPãÏìå+7ñ†ó˜°à!æ¨(Ijõ„ÅuXjŸi6"*a`ßÇoäaÑì˜ó72UúI…œí 1­cøYRd¦ÎÞ¨82;XSP[I iÕn²@?Ïû(i¶WfÖ­ÔSô‚Ò˜’S™Z$¶uLâ{11CC‹nCx %ÀCÜÑÒÑÏvÏÎ5MôÀqx„|w!¯SA"OR…\›CÓNõö€#¨ Ôéñ-exÄŒÛ׿v/kë¶¿#<¸óÇîËé{LÏ>Ñô­z £Çåk5B3°ÜRD-R¯'Œ0>PE¸(Íèß]âÞµ“ËI0QE3qEš$ÂäöÄO@Ù1¯u“Ô̶žßr˜üË3`9ßÛ~vñX¢("ö¦0[Æ:ÓÊ­ÿt¡8áù·ß:9_k6ÓZ¢’´ùþæfÞî£Vêð‰Í›n߉᧶RòN>¨¼^S›J‹!–£z¡¢×~0±r«¶„ch€Œ}w"Â¥Ù«™;3§±wÿÈ}€³Š@S•<èß@Ò¢’äÕºl=µÌBHœhv- Mr‚Z#€@îÉEb` SXÿû J„PæYðyé',ˆ¨PÐAž ašL˜fPê) 8J‰þ>‰MK1Ø7»F µÄgÁ@M $‚  Êl…ý(ªå`°þâÄüOn¿þ"âî_½¾ðÃ2Q#â¡?‚,¨RÚ̲¦@£PûB„ `‚‚ì&"(€Åáæ‹”Ô *M !Elzˆmÿñ*N…„ú];š=&·@ð¬M¨u£.Â¥õI(éôTÚß—e²J±"ÄIÕrÜàKŒÆ72¼Ÿº³Ÿq±<\K/m>\>ÛÐ$¤(ÆùŽZªf‚¾:ð›™è¨CŽÉ¡=N†Í~ÁŽ!‚ðŠ-rþcñ•­ù͑ΉY)ñË“S$¿-“Ó›'ë A4óðW–ÏŸ¶Rn<8Ù`æB¤‘p3~ÆM×" –å‹5\xY̧Å;S• Q0Êåp¬¢a\€c;ŒÑ@2A]Š]v^t¦™êþxÊåÿÓA[ºáÞ³¯÷ºPB`vÌÎ9kGθnž¬ýÛŸ;…„"NyóÜr=«×kiš]¹7RížÒYû\ãê.Í>¸ˆdì¯ù(YWµ^z”¢ú+ âWÆ|2kGÑTÈãÁ¿ÿÃ=ZY„вï²ëúbš®XáÅyBEઇ§&œ>ruP0Š0(¥IÕ€‡Âb’ cÄàÄ„Pæ »%+ᙩ¤ŒÞV]¨̦f ÚŒ ÷Œ‹Á”ìA|XáOÙŽ¶‹Ž§¦PPpèd®R ‚¶ (¢Ghhy»QPšUM–mÝ®¶žýé ÑGïÞ¹ªß½‚ «÷¡‚’N%™D;Ä‘$ ÀEo4gï{’ wÀþ-\œTAÉB®€Ö ­ L'ÞÖC‚ª³™÷étyW@N¶H‰ d”Ö€Œ”ýc­9Ú¡v¿ÕÌXù!˜Ã*öÇΰÄ,  FÁ9v]ÃsÍB¤ÝPþ‘vºó…:_û%žj%àEþlŽ<ô±µHP0JâŒJ¹h?õ߆۷Q“~cÓ‚hˆ€RA8HñÎbÇ×G*9ÇÂÆÜ€—´{¾*—¦¯¯,gƒcíç·)ûmtq£y&Q*76©÷XdJ‡‹DDØ×H@ÞÀ¹Ëð~æ6^jÕ‰BèS”a±wdGÀC•£ñÕ¿ V«ÁHå¢-·/k÷w‡Jñ±ÿË!±”wV{——µ"¯ vŽsÎ[°±{›&ÿÑ¿ßI}š‹>õú…ýíV³±Po|M?6J›èdú¢ý”Ó¯«ÏvÙïøÃ]DX\Gjzš=Úç7 R±KÆA(=•1œÂÃ8f|bÄ&³8›gn /8gîs¶ƒ­KZEv@,#}PP’ž9ù§#k|ä»J – ZlJÈ  VPË#›Â0¬@TÜšF‚È^rAËžƒ“Ùº bÄá r?:¼Jgç$b‹\P6mzoCÒF“3`ªE„11Ì r@óVVÈL€€ùÖ}Gïþãá?ÒB8ú»ƒ/ýeoöŸíW:ô±I(‚,)Ô¦j"2ÌKˤ˜A´s Xùsˆ €™ÞÇéÍS5ô ‘þ” (» XÕgXÀšr+ÙóM-ã)‘&Äd.)-ê%LÊçTï%gš¤…=&v ²÷ó­ªá@¿¨ãß2—FÖÄšß43;þØ,ž¿Ñ9·R×¾-#ˆcΔ7²TÙø¥J€ß;!©£{³(ø"ÆA ¢@H ó«ƒ~ðÅ•7jÈ®ì¬^$m>§Åƒ_­î‹XõòñÌîê+GÓƒœhm§0ÒŠ{>fF6îÃ'°ÿUWüjᢎ%b5ø ùv‘ž 2&qò èR%4ù/Ê>25“ªOm»zw=±ÿ§–-xÐ}hÞ:‘°cv–ËÜ”e¯goü®èD”ˆØÃï]:ÜΚµÆÜ›ÛÃ|º/¨’¥•÷Ôò™áoÊЂþGÁÂȰk¦ž©CYÐkM—Æ€ÖI]X0kG~ØD]WadÃܽ,õÑêìa"µ¹ºtõiU&ÂÕI!i  î½0@"bk€02q2¯•X ÆUWÓÄ¡[AîOMRl€‹ãKaÇ¥pYײ‹†2…(³À]ÿ“·}M2ŠE€ŒÉú:p‰aµD’3BVÆÄ”Î.¶aö5ØkR™YL÷IïdíûÛß8Å€Éê/ßå¿ãsßÐB@á–ð°R )­µgë4H”V "Œ©H8DGµÈݲ5j,1ÃÕe¬œð¦Â†öƒ+“ º[ƒrßáü88ã1RÌÀ°°Ò7ÀMÜâFYj&ˆJT˜™ ì‚*ª<¡ÌΘ”¶X Íá2dzq/½¬>LÏQÔ—ëwT.{°?GÒ4V4­ð> "‚^êN º.Š¿ý×ï&¼vA•ÂåçóOï7$ ŸžA¾ÞÏÎoìž«Ó3|þ›ï¤ìº¿=x ¥,çòRpQWô1)±šŒ±8è|¤ä›©¹÷âÕZMìÚ8¹ZKp4©(åè*2ü+["ÀìäÅHåùdUµ×þ|5åwþÅTYp·÷ÏΦD\ÌNŒ[”Æäý]èþÅßõ2"'h›ï¾·ÒjÕZçg—µ64²dêtãjGÞšzôPQ•È<îÖF£ÔS봜Ȅ@sìû¨4‹“f.©¢éǺŸð釶E¸,GR»U;§@^¼4“¨ÈpÀÉô'Ìôò9‡WGÖZ+¨Ózšj,¬vBd=F•Á!; ½FtÇ~@µ Á>²ØÝõŒ‚ŠfâXë"mrÔˆfÅu£M=XÆ5nh/7—h׋!¬²,3$9 (²DJFb›-Ør õ¿ëBp\nßNn}wá÷ZHÚýƒ»üÛ[µ?<&ÞYðúó*m´šÄÂPšÀ9p˜©Â1ˆ%Á‚É,b™Ùm­A+?[S2…2 @âÀ°ô€fë¾ÒÀ„dÔݶ»ú$ÜdäãMTJ©¤>%£¡c3i×¶F ‹M¸¨ÚXPôÁL¼²ÝY3*3ªM âÛ_Ãéù+ær+U„º²•P؇} ûÀq™Pz‘AõR Lg½v?•îäAªNU r® €ÀÕþ4_bq£òFã¼Ð‹'x^=9:£R"ÝŸ½±T‚íì^N²¼p4ëHK©€u^ëD!ó&´ÂÖýjGN^äâ“#µÒUÈbdœ‡|]ï`DP¡ñ˜ª]a0&ø˜„,ÊÌÖÂaµÝªí\û_Ÿ‘û“Þä‚»»«ÍWæ”V¤4°uŽÙk­)™{›ƒâƒ¿xŒ¤€Ó3ß~wßtûµ2WKÆ&Y#»\^“é·äó~¢ˆ"l5 晋¼Ée·É¶µˆÀ¥í5¯ÜC ª¢T¤DÞ™ÏQQC¤°;ÅN¦›á™yˆ”ÕÚÐaÇù±Qën«Vwn¾c‚w”é„Õ_Ô)•ž ½CÉæL™sKÂÈÂÂöÆÞìÊÚýýûfƒD[ÆJÑè¹ö䌠‰­_LJˆÊûT ÊéÞ¼ÛöûŸ¸Qð¢ À0–þÕã_­:Û¿‰ {ænMlø5t?Øão:[îÜ>²ßI.23*A”ÏZñPH÷ôÖRafv¹{þÕÞIønþn8ø‹«íšÄ)W(×àtÀ¯ k£(HPP\&­N}Åöz»w÷?î©Ú?ùš³E¯ûdîü©*UHDÀcKcEòN·¼óï#ÚÛ¡½ñú‘GöFµyWŸªÕŽY¿ƒŽ÷>)¢a¬‚1áÍ jPî5!Wû'öèRyÆ;øÝSœßb%mœXÉÅD±fžo?¬îÌÜÅÚå#z³ÊÊDEDªñ6Âõ=`p¨¥¡@°cY! V„Hª¨˜HFŽF.Ä}âÔ³2d݊dz3›œ«ê2A+¥§Ðô£÷9ÀºÇâM´VÕ” Ø.¸!&MD T*ȆۺL§1ï×P-DL§cq\öWé˜û.üñ²ÀÏ·ß»û9|ó2"ú3cœ9a†ÙLså RJhÙ9N`À)‚ó¨­ä€îšk[ìW ,èw~¨Þp³¶T)2sîú{yqpvëIã„V ”´§@NF#‚,<“övv°MãÔ1ߤwCÌ–&nÁÕMÈ#«f†C‘)6yŽaó¾~Ãþ6{§¡?ÅÂÁâ9…D X!&8šÃ)XŽÄùRáÐÞ°Ù™íB•_Ëã·‰%*·BÖ"XÎr(¥ºrtI%·úÉ+‹c©¢R,»¿ õn±|’Ÿ¯ 4ܰ¦\ˆF¥‰©‚¸0îFvlÜ}¸°R®Ý>ÝÖè ü°áÑ©Â1mRýéOŠ*§¢.€Ô5$YqÀtçaÇÊoþl€ÿþÝš$¦»·:{¶F Bñ(,Ìâ¬3ùȘ|¯ÝïýíŽVˆ®yáíwù SÔl4›/©›¸0½z?ÑJ“V!þC‚ªD¸(jÛ*éèyÑ•JÏ?o4&:# "{hztµÑ8á¼–“A€K»W³×§N2èá³S7.´ÆR]¼œ!!¥jù¸”W‡N@¼3\)ht” ©$S(LÂc”m8D) ¬êeÙàЗ ³+¤OóÔ3Äõ(™’aÏøÖp,†ÂK‚œÖY°:5œu0B$Ì3³‘äê ¹NÓ’OØöO#‰éí>:²|í×§¿¥iôç§Oü¬3û'ó¢üG-Îce(ÕÙL*]• e °•ÒIbº.gXŠY؉8y8Ì ;DaÀÝNi@Ç2,1«C…Ö$ÉËÞ–µÚû ÕI¥%4ÛAÉå¨Ð¨Ñ nwåP“‘(v~Ì# MÄ@–=ôû6}£™=‚)ís„ÁɯÊñÖÍÎJ£=–~û×>&»y¯MØá ƒ í`ÔÃ?wHmMÊG.;fˆÅå‚Àƒõ…þëâøŽ9 üü™œ==•dš|#îÜÏúxâ¼AyñôD­s-ÚCi4]‹…!è7øÌ@œ3üè*5¾Fƒ+‹çÓ± `"H! “p°^C)ÕõR5äá8cXâ.Ío6s³Ä]ëÊŸýy‰KÿóEJÙÛ]?s¶F‚¤ý¸×S¬3¥uÎõ×ûù/ÿÃ]Q"œ9hl½mt³Þš?en`ö®|¶GDZ“"ªDl3kwpv=9DÑ»0þ‘Ã0„±ê8LaiLNò¶ß%A,hBgó7>S—B÷ÙB¿'V(䯹aˆQ‰~£†OŸ8çœ/Œ’D×(#t•bV*± *(^db%í9•SI4ç2ëNÄù‘O”ºghXg)36¤_P Ýs>–u`"IQkHGÍ¡£© Q‡ ¨ÈöÈ8ÃÚn%Îi‰pn‘b÷I~Tý'ó­#@H~û­Ÿá¥÷2­@+ !­ÒZ­¥¸G–‰4°+Ê@4 ª*1š¬l­§Ó£“^ 8fnéLĈ}Ñu$@!äÒë®G—qµ92£ QM+Ó;ÚcH²ls”%ý­&úüP çz•ÛGþU †¸e7´²_†"SÈAE*Ö\í7_ݺ2w±VùâôªÛFEP¬ßÅ’¿Ñ9LÓ=£Pé#fÖo®—Ì1r#x€'€;ˆ/ƒo^j;tvóÞÅšôoÈÒþ‡GÚ‰v€VV?§äÛ™ÁîýÚ)è9®g#Z¦¼J‚Ã'Lô(¸§AÄ:þ¡W–íƒíˉB‡slTœ¸0eŒ ÇJâÊ¡pCYƒUÜ¿·Tn@nÍ÷ÿÂÉâÿù”Îw·WϬd ¡×´:fëÀ9kmY–Æ ·ûéóÿðóŽöiG ‡gN£‹ëéбÁˆ"¨´VD:€šÑgöê ÷pvõ;S݆ø•°S‰¨0ñâ.‰!H2±Ó¯A ®(ÊöÃÑʬ¼7Z^…ôuM¤VÖ«à…Õx ÜÕ½2/…‘Ai5És,Ø ³N%2²`Ñ:¿ùõÈ#Ëx,ÈíiV­P)úÔY@—S STZÝ$i4¸(p,ªìI!b\€pª‡€ËÕ0E+ÍZ‘  ÀhÀ¹™#ØF‹óÚ‡|øÝ¤ãÑîê⡽¿\ú½šð?$ç~ø¼öG‡y¬¤F$BJRÕj €)- ¤Â\:¨C@CCâ‰8Ç P<À™þJME^—ARK»KI=$8PÜ7ån§Ç'“õuÀé#šDÉ %;õœ`ݾØVÓ»SÓµ€æŠÆÿJçÉ!,dïi· \äܶr“‚ΉÙé­ðZúyùJ«¨”’Hƒ PˆˆÐsø£Ý·Öc'½ÒSƒ†ƒÚŽåøQp¹ÇüŽÈKeŸ»÷aÛL­8+·ŽL'psT;u?9‘i da.~låâJÁåúöy+µÄüÿ¹úÓ'K’캼÷ªšÙ[}÷ˆðØ÷ŒˆÜ³2kE(¢P@@#d7„ݤp8ÝÓó§Ì§™‘nv {Dšœ!,à€ÚQKVeVîkì‹G„ïîo53Õ{ï|PU{/;% +<Üý™©Þåœß1í$­Ò6CCVƒ* øº¾s —¿@Õ‡WOA ,L!dÆ(øŒBÓRhbaéLè2QõÜþ}í“àêt ŒVåükðçÿoÈC}ôôñõ«-™£!&NXØyçÙûúð‰«ÿâßof6`n¯l¬öÚ­î…üî4%tÏ’1dl–gÁ]H„ª¬,0í’ÝçåCYhÓ°Ù±#âœ×²Ùf¦aÓØ&ë 5QÃrÃÕG÷Éâ3¤fxóô'è.wÇ4ªx£J]?£Ó7¦^EQ mfl€u ^Tò¬°.Å0é\믨g¨E°´P°Ý`|q(Rv…ŲôÉU†òÙ^!Cj7Š1N+µAÆØ¥2³ S»¾[J{ÉWŒ Þ J@€…6î€ÀJ;jRÃ='2¹÷àìÒ÷n~í91hûW–þ¬ºð61nn[YÖï(à”… R§®fŸñÐèþÔ“&USý:-•ÇW9±Ù¿†2€JU·Éô)òÂäÞW[®\9YÞËØž¡¼Õê,#àÐ3‚TÚëM¶pý9Ýi I?ü@ʇMq÷!pAØ{nûjÞ2±MeöÕÛþ•ÛO_êeQ $Ô„ù¦ìѸËM‹72i»Ÿ:‚¥ÖÖJmáHqîî„Y”h3_݄խ;çªë\Ã't…åÑ–¹rtp­%Riœ=¾û)ô͈ٿâd]sž•X¤fg»(|=á‹W.ôå\~™_iÙÐxBD³Î­ÏTÀÄåRÀlÌÉÍûΠb6Çv&p–]·;)E™ýÞÿþ¶Ñgÿ» õ0oí_>c,¡ reç™Y™kW{áÑæÎôÖÿ÷{e¸;_º¼Ö;q>Éžß® Õf™ ¾ŒˆàÂI¦nT- eyÅÌK›"Å<]çÚ¬hQb¢gr;Ä Í‹X¥‰¨Š;¢ÖÙsdÞÚMôâ…ÜbÐ5)†t+2ÆØZðÑn-Há/ 2¾S`Y{°yQä–*Ñ …£• g›Š9A" "®’fO+àHß²Ç\)û…ÜÈ(´­ÖIÐþYöa(v»ÖƒQ@¨„;cÅzÐÌOÁ€ãƒ‰q­%»ãÙ/¬I ƨ›™ÞË.Mÿcû÷–À üøð˽A¿}(,â1†‚¶Ýk)à@x y¡ZKUj9©fsÛhȽ[·=ÉMTŸ§afE¨ß8nCt=!ƒH}Xòërˉ^ìe-Û^a¤iåeR´ø1,í¸KK¹‰­-¦v/Ue–Eš–/Ê RzíÐ6 mÅŸ²°¾·]<7ùEñR'&0 I%‚ Rjôu̘ñ© ØýµÉ¢ìFXŸÎÝ¢ôǺ‚ûñÊÁ‹m%7Þ¿óbfЩþýók3BDÇå÷E¿°îÕÝ=|Fj_, pQ!§ Ôl³šhlÜQŸÜ‡S¯Ô[·¿ØE4ÆÆ YàS:ŠPtŽ‚€)ìxŽ·¡Ú`’´³ôtwˬA±ÒÞ*IT˜þßo}å—] ÓáÎôÅS!YL*öÂì¼su-ZŽÇÃïü‹»ñïÉO¿xýô…ÞîÎÒõS÷Ñd™5dȠɲ"$‰‚ATÔÉ´;rí>Ï0sòåÙ\#m1(1]ÂV1öÏ1u€$ pU¸šúîíòÊÞ¢Þ*^Fƒ©rkfÀd`ãy©ßªkv´;&'ÓÎðÐaU‰«€Œ@­MlË / :a¬xFwªk‰kr#RާÜÍy`2‚E¸¹4êY*‚Áò  QvCrƒƒ…`Ù97¤F#[!Çõhj X(¶J(Ñê`óø±wqã«ÖMÿôʱ¿tÿ`-¬KÃg&³¦Ý¶ 2ö˜Œc'@Ž03’h§a¾Ë];¹‹KÃë™™°«1$Xªò‰€±DÞ‹òÎpÊ×ò‡£Ç­µí.Ž*®K<š,?žÝÃcÝ6¤t°8¸6Aù-sd™Ý D Zض&¨­¬I1ѽè¥Þ/FWµ¢¸ 1Ð…-ªò\˃DSÕ„|v:í­Ô»ü>å ¶5O®Q@õþG+çA±†wÎ/«{¿j_þøÄ©–’ õ‚˜Ÿ=Äů(ëþƒ =´ü«s¿U(AùŸŸûÁfûë§ ¡¡øÐJV´ûŠXV05ÜÎÔédÊdä*‚,Âã¨á¯£‚0}ìûËÇÑĶMU *yDØwгa“kúzRöÏWÕ«y»X* ׈Ó#Å¢íâÒsnÁ!„J@ Q—²5y òÖcG'ÊJÍ’ñ3ÃÝÇÙ+æM¾¶Ø ‘2—6ð"”Ì4s k“ù&æÄv«=ì‚Q(€g™nó:tÔúíû7–•”«û72| §pçš±(HH,ò“œyѱìïœÉZ•€ä(6¶å©’Ÿ9øHDÄ×°÷.´¿Œ£wž_Î11ÀÖŽ¢~¦§11;©u–d)Œ€ð\9©·ÇTÛ ¼MaÃá˜ù?m›ìw~½íÙG›ë+ˆ‚°Êföâ]U9ñ“ÁþäŒlޙؔÇ~ùÆÅòCÛjwò<Ë2›Y ÚØ"3Ö`Ê@†¦hŽQJ7›%AÍf@;0*þÒí‹Ú¤ÉK2‡RT®‡“ÞÇôrI?F» ù«h€"M0t–„™9}EÊ_Ž} K5D–ú îÃ:ß–HÀá‡Ó&B I¶Ã ââÑa„LY/**³h-ó€ûªòG^ÓD>;ØD>ZÛÏòN xôqªÃéⵯ ¨yFÀ˾)êú}`sÜ$PEì”ÇÛç{ß~úkÏdÅÖw¿dÿ’/³«d Q«Ó_h#àŒÍTÆ£Ò¨Á¶%åèMÄRÁÍí^¯ºÜŒm(S¤¬â'¥¶ @ VWm‡æªÞfÔ+¬s\ܨªX¹Þ'ÈsòyÙ•WÑ "Eðr2oa¬ñâ´^ LëBYÏê<ÃÊ´RX 3 f˜þ®¿y÷âÉ.mRSIsôƃذ¦Ã«Õ^ÚZ(ªÞAM’]ñqMÍ$Îh³ ÊþÑÖ¨Ü[WV¥ú¤îm|t¹•'ÿ¨zÙù)_Ívïu—E[µG(Œ×dƒh¦‹Òä¡aœxÊÆøò1ÿAëYCñ­‰çäÜù6#ËQxERÎP0,è\㊪*'÷öHø„;„€ âôƒ1ÄÎ?ø¢uâ‡ÃËÏ-ÚX„1 ˆˆˆxÇìe"gFOß~çQmIÀ®}îØuЬhEÑÊó<·®~2ÆÑ”tˆý]\A‚Wçú ø³-tRÚÿ $%jº™M|N ÅûjÔòäăn>:y‹ðå~òO¤)·/¶ñæf " "H¦È²ò”„=€ zQ5luû’TÀ ³/Üê*¨¨hŒä à g*»b BÍ”#g‰i©Ù0ÎÐà’ÉZEû:t“£b¬¸ž9èy…÷¬S••ŽìdÇ1µx‰ú¬Õð‰œqÿ2ÿÛËÿæð«ï¼c~í† 3; ksbìdªxhU²vŽàý`T‰#!R>¹Î—FðÃOéäãK9c“EP òD&GÐꆣ̀’s¬êµã«K;û( +¦½ª@Õ¸ö,Z‚š¶Å‡“îÒÓµ^;e—¦Óœ""ˆSTï ¥€pÉØ-bbš*‹—÷†+/ŒÞj=ß-Œi?M @¸k“–¤1HH3O'T"\i=]¢i{Ë…¹$žÎåV¥YejSwooì¿lE<œ]Í̽óì=8Û"‚€ív=†‹N7ûª7l4”ŒªÉ4_ öôéǸø%ÿdûÕ.Q4aÑœr6PS9̓ah$ë!ÑNíUn|„:²åH¼ˆ€2—ßûÿÔ°ú})+Ù {±™0• yPÞ‹úÚ{_;ö,»÷žƒ¿ùÁUè¾>¶ˆHy«ÓÊ-eYfÉ„oÅcM…¹Â¾,ÀºEÖdØœkYÐkÚÅñ0ŠÌÓ‘L¬E¼›tùã…çmùñéGgΫM£ßðkPkzŸWyÝy ·5TlgЀj ¬*W‚Ö¤ªa€Ô¼´Ú¨€QHVH²Ã1ªHˆÙоy©Š à–M¾,u¾™€¥ô ª@Áå¬hÓKQÖ¹ä™×ÅžS€.)HVã‚"w:ðÈ88FÑ+—€²¢<Þ=8±òΛÏYhð_.]ø‹êØïôö­XÛíõ@µRʨø‘‚m1+X$Ô°ŸŒM¯ {‘ú&œ~rz1t황°G¿‹ÙA`h)«(N¶¦Óå wÓ\° -(+VöŠSìY»32ݭňÆœGìÁü«ÎO®kîp Ú Côyø±yÕ¾¾ûZ« ˆ6IŸÄÖ8R²tTñæØ¤§Ü`¡*òNBãX§ß*DÂ7-Õ/—Ÿ>ÛáñðÑó€ñÒht†Œ‰c-a½û6v¾B"G;«ÝzŠÐ.¢ÿ?Ý I´ÊûÈ q¾þØ—;‡ïž=‘¢ÆŽ23O¥Z\‹E‡#ab7â (ª€ˆ…Gü ÖÉ”U”T´öå_} àøÿMeºÿôÁ™»`ˆ¢¨B<3({ÇÌ\ã—ÊÇÛG£‡ß{sb‚6†6~õúF¿U˜¼Õ* ‹YN&ä‡ “ƒ)º4…~Ž:Ç©j·†àÏl²h˜„gP%à2PAëzýðj,~Ôæ§Ð¿n0ü¡<" ¯¬ÃöÝ‘÷’†<@äÛ… Xœ¯EÔjAµBNȪ^AñÌ´ŒÁ6 tTzUõš\è*Êâ­ÃBÆÊ²€Ð2STE"@£iŽ}Y¾È‹=PvVM&GÒZ©k€VDàÌ¡óc î mYÐ…€¥<<—\ޫϘ?õ¿wZ ÌÛþê“oë¿”!¡!  V/o/©àDa€;¨^¦®V…LØõÉ’ ”禅ˆ0U`ïEØ#2‹Îž Œà¡øëŒá ŠH@ÇDý^cÒ9Çxéj(¨K™Éû:bN_D’(0ÀP§],dŠ“Êô¬ó‡u§$Ó®kÔ"P#0® &0Çi V‹"R“#\›@Õ»£G«k[ß=þÛ±èþcë¥=´p,PFT˜öR PGÀ@˜°Œ=i…(SÔœšD‘Fª&.üà­o_ ¼àÏ”ž¢wŠà÷P[„ `P=«È`Rã5»U’¬[Ïpâ¼WULPWü]X’ቾ 9 H¬#'¤‰ ŸËwUÈh%Ï¢<„A@Þß1_É~<¸Þma”=Ìg€c4o5äi&M=©öÜN¶±Û+wC XJàˆO«Rd &# *}tlçU£â«»åe”[‡øÌ“c‹­T†«°¾sËô>/ {G™v‹5'¶˜FZ1,jB8©¸¿ÖÖ¯ÒÖã[&íLjûRªz|˜ã“Hk3’)D>¦(Âw(¶Ûà‚ 9‚¬DGÿæ/@Îþw— b Ÿ¸ÑÃðñDn[¨¿<ùô€üæÞ^ÝédnOTV¾ú·_;Ó±Y§·Ðn癵Ö²„d2ƒT´;µïŒ¤ÝA4±˜FÚ sÛõF|‡qÁѧ’À!Ò ñ†ºžö¦7WŸaȪÎÞõpê™Ø#*Ùüì©~>`ö’ˆðH ]DÔ¡UP°Xz£Ž#}U’ b u¯ƒžT(·9ð‰YfžõSWA×LjŽ*µ Ÿñ¿ÇwfV©×3ŠåT—EitØ ´ŽöQó6+š‚Êi·BÄe¨KÐvâŒ%ÙC°>Ü?¼Ðùóͯ¼@ æñ·¿Tüeuî›Í,BÊLk1SÕCôl¨m€å°VòPdÈaWœ@üa%ªà>†­3=NbLQÍ@Å«"îƒ,ä&Fâˆz?ÚvÓ“«‡Û¤­+(ƒR•EttÐWr·ëvçéúÉnTO!ÁÌ´¹˜q›X&í#ÐÎ,Þ€k¿ÿ¶\[zðèü3½ cÅм‰ 9ìý0ºL"¿:±Þìê¶zƒƒä4K€¢ƒ%vÈÌ@£Zÿx]..‹²ßy¥0àľ9aÐ( "*Ô?ûÅnM‡G¨E>FÈ[móQbHZ#7p@¯oíÂskî½s'))ZEU•£8‘" 5ºK `à‚iRœ"œ<±Ë—™ ˜&LU• ÿÅŒ<ÿAåFƒÃëÏ­h TEfæ°ì?wÿÑ$ß÷<=ªŽewþÃÆDâàä×~󥋽A ftHL¹3‡6f8éI\GUve«xÃ>×R”7º­-ì?ocÑDÆføù¾ÞzÌnAR%²´€ª01YfÈ$¯ª ^+•&ÚÎùB [W˜&œ 5Ÿ*ºrŠ}ªBa ŒÅDoR–Š&P­1v ‹ž‰˂ږìµÔkkx€`r£¹Ê°ðª² 2ò’·BRŸF!mèyïÁʙóü·{lÁÿhôÕw>°¿þ"ƒ&k唡U6T€zºiíÆ`iŠœQP Ì⚢OP>á¥éÒi"TU$°€¹“¦ßa]Ì…P3@Gˆê}ýØ.”· ñxGø¨ðÛFsƒ²»•»—Ÿlr!¨ *"©H|GY£±bþ~`P_N|«íÚ @¤Q ª*?Ÿ®¾\þ 1/B8"Q*„Ógxгa@²Cd×·mk¼r4ViÜ)1,=º”ÂßÅÚ¤ܸþ+Y3ù—6þK½ôÍu4Æ[ØV·OJåÄÖ–òBÁ—S–!¯LpRâÈG¬Šxùt°Ð™^ŠI_ÔãDAå ÂNUÐšŠ‚ÔûÃ’®óS9¶ª€2FUÑêÕæÖNŸêé=Øhe6aß h}in-{·èDÏ®Xž öZ1”<¤^ ܺ—½T¼³ÿ̉6“d%éí­Yý*&uTÔÆ)¼®tŽA·ë!HêT C sölBª*:xkéèeªzNCu«ÌŽí<ÆÆêL„yççdµ­~«BèMm‹ÐÎY g±:TöoLáµÞöÝ{&Üsˆ8+Pb´ 4Q–³DˆÙΰ}ìÉD¤ßºsDn¡%ÈC/*žká'ÿó‡¨_ÿû«žezôdçÆI›È…á’…/nîÉà šz³ÑyøÉ¤×ç×_ ʺòòßúʳ§»¹¡¬Ýoy^Ø"£6j=-hŒ ”KJq]3ØC“ç£é³#mt¸êçÜt¡ðMàøÀ~¨ËjÕÝ\ºnÕNß?û¸’+'ÑD68*¢Å+gd÷ã ¼€ ô 2ÔÚ++¢õ `0h²-µ†ç?qì¡Õót8NL{hº3aòÒ³R!í.€SxØÓà,A‰zV»¹Ó Ë8©[@8p·e¼Õ£¼Ð¥–ÛµŒË˜^ÇT—«¨ðx³¾”ýkÿ[' ½÷ö¯îþ^ùªA²„¹mu Q©¯ŒÉsPLÕ“’2å8ß‹pšøN4A(»ÌÊö•\lÒ×i&â±@w5ýjÀ© «¸ñAéÎâÞ0ϵœŠSTVw(hŽ[)ïkß\\Ï ÒxR€y’ñ#Pã‘k¼åˆªn*ÔzÈ[3¨ˆLß ‹†?[x©eB(Bìƒ?Sk\# ¡¤P¢cu¹<•ΖoÂ4bñÌÁꡳVš ¢*ÿ¢(/-*sõt÷5Íw¶Íéý•^ÖÜÂÊ ß«ñò©Ú*ÀE`:Ú¦ÚPÌçŒ0±ÐgÆÛ7ùìê³gm># Û5ŒŠ€ÊEµ1ÔA²§€¡1ZXÙa‘E³="ì.eh 6PÁ{½ó?ßóÛ¸è=OW/œk™ð7BDP={ñÃQgŸËRÛçýOöw/¶·ð£o½31„騫¿ñåËk½®©µÕít c-DY»e};à2Y›åYøÂsø™ÈæPQÚKk”pI$¨C²wGµ¸‚øúÀæo/ ÿéoQÿ9CPކlþ…Â|¸í9Èd =ES ñ¥y!uꃧg;û™• ßaÚ™¦Ôo™­öÀ³ßêÁÀÚ6ÈT”e&?Ÿq›0‡u×ïe Àµñû°ŠÓ£^XL ì½¾Ù!Öu°é~Tmìt2=Ø<¶~ï‡ç~È¡òÛ+/|ûIû›§Éµv{1SÔ#SyÅ"GåQéqz8…6WšŽÒøPHw Ûs”íéÇÇ¢ ¡ ¨^´@±D€‚Š.®AÊi¹rlô$B]'eïË®S=!¬÷ÊöêÝîBã%¥vªP:ò0 ¡1öpÉØ°šÅ™„GıןÚŸ§7Ư¬t1"mBžb=ÒøÀççÆ@´“†Ø¥W>~0nU @—óÍíêù•É÷vF“»ÿþŸÊj¿ñk¿ÿê©K=AkÛívQt°ÕAËæ¸Ó‹„h5&X‡Œ1)*>êµA#á<ÿPbBOcyJ$ QU.ë•íÛëWYqò³³k¹t:„«"baž_ÃNYERÄ#(H'‚ÔȤ¯$Bß„•55UÐ$ž0ÈÛŒ¦B§QA*ªmKEì.k5fM–†vTP ;cŠõÛ €U©fR-!Ú§ÌëR~—C"th•pF¸Œ‚‚¤`b¸%‚³ŽF›ýÓ»ßêüaÇ‘áïW_ëmýÆË ”µ»Ý@˜V$b²Ô••ãzꥡ €S@4d`á{­¥£«v¦Ué8U¯[«… ( Ì2˜x9 Oë0£qå½ î ôÀÀðÛ›\nD4‘Í¡êÍCËi¯x"ê”Ë Ûe°·Å!ñ‚™ù»õÆ5ÿc}5kazžˆeæ0‹1 M™DB°žÙµ­ÝÕÉ)†³?½P³~;hç£@^UDU˜ßì^_A¿µsèÞ~¶þôtΞPÏK}ë®~Ê‘è8"4„‘mM3=žñ¢E˜E¼øÁØ}QÞ\¼T@ÌZŒ«¯ðíDsÅt˜Ó?Æ•ML@B <÷dHœ­ŒŒ’=“q¬ µŠ*{÷Îÿ:0ùÿãë­šýxS_]Ï¡,$$å'î\y*ºðÂôÏZÏÐ/ž–‡[»5=üÖ¿øD3Càõä×þί\ÚXï·r2y‘b–Q=}‹ÆXDCdÉ •úœ¦ASv&Í>ºÄÿHÿKÓgˆÀªâ]5èè»ÝçAú`wmñkÈ„‰pf‹¯¨§fÏÜ$+™Â,@)³0€cc½ rìšqxtLž#³J*‡,èQÉgj¦Z~€€­.VbU…ãÖnÖº£.e­…Ȱò…eK ²í¬ƒ^vJûLÑ”j< ,SÉ"í<'J³Ñ¨W%TåáþÃsë?ÿèů{ø§ÏŸüÞdñw–‘–[E·¥ ¥ñÞÚv@&SàÇÍ´D@›èQ]aüª¬*ü¾we‘(Æ£A ‘DÉo3®‰/U¸¡Þw&þØâxê±Tj@t|„ÚÉIý#Xjß[í÷ „ec²ý‡a³‚šäé‹ "¢ð¸†ÎtBЋ)` ¨,ìj¹ó0û2}z÷ʵ~H2L yHàÅh-Ɔ젔çD°ØÙÊ:£•ñQ˜Œ%ÀC¸Nå³Áuà_Cþx¯“=à ß}¦oñØÁÆZX "Ê8þê« “‰ƒî’èhó¬ †&4ÆLIE¬?¬Ìk݇ƒç‹Ü`Ôû7žJ*Á$©ŸÂ$–M¡Úte߉ÏVÚ6ÇZ†b•ªˆ"Š:®¾÷¿VØÿG_ë–â§{Z¯¬“¥p€ "aû›wï2Wªª¹Ô¿÷i½x©úY uµÿ`KüæŸýów+kAœ?ö•?øÚ•ÓÇWZd;­žiu:ÖaVI'ÏL° ‘±¶ñ Æ-¹6‚ ÓçrÂ3¢™ð»)¬}"7Ú`õþÖÉ÷€žo[,èâݹ[3+{fQE$km†}P„¡*{#ÈŒDè]$ÖÆùd”ÿ¦Â‘ˆÇûqìE²M9^Ö%vtJ€¶Ö¥¢(¤›NšÂB,.k¯ewkgì!®Y©&‡±ý‘’ ‚5« Õ؇²,ˆ£›¤+T,êýóÍÓb‰Þ}ç뛯ӯv©h-æ€0Ê|6/P到ö^s`D4Ii¨y8£Ë ð/õô“µsˆ&¾’-†Z„t‡aµ$´@çyütT.œ®F@I&^â_ï!ôÖÄóÝ‘9{·u¾DÍt¥±ð†¹Fº§W?¢O=ôaLÜÓ 4XX*WÎLn^ë´”ÒœÓÕ®H“ô@7‚‰änàìp²ˆG+#ÑH™/3£ fT…50úøÄÞkFÕ¹wW¯àøSYñ­Ó& ~ZUvúó§xò;³!ëVMHÚ &³ù¹] h׌0?~Ï]Ú¹{½ŸeªDdÎ]JVƒEEýÌ0ÌÈCe¨E:kOEd¥ûX³öqÔP;`ÀX1;?ýþ·jYø‡_n9_íŒïåÏ®˜ ƒ1‘ðâ¥w'u1ò˜}Žÿfâ_X¸÷±øšeº·}4lþùŸürœYT/Ç^ûƒß|îôJ·e‹ 0kõ‹R;k5;ÐcLf­5%B ¸4ö™Ïõi¬ `æ®P©ËºÿäÁ‰‹¬xðÁÙG çΑ b&cì—¾ÿÔ+Kã0@+ÚÜ· jPɈq l” hQQ-ê,½$„,éŠØñ8ÅEÆo#•«zhÑ{™VNâÀWšO-§ZÀ^A¡èHu٠´5ð¸1UT´9©˜1‚Y2ãHV`é‰ÚéˆÎWÖÉþýõõ»½ñ\Èøo/¼ðí½Ö7.YSôT„kʬïw+µ®ö-e"N¶lJ‰:‘›£w‡ ½ý+4ØÔvP*¨ §¸°€Ô‰ Ë ¬è¢!B]Õ.Pø´ÞDÈ× †Í§pæ‰\ ·ÏðÞ„à3Q€* "¨Zײdk…¸Ás…˜$xý¨ýeüɃ+§úYh+©ÁL§ ™4èݦ¸ øJ_Þ“SµëîWJö>‰j‰ µ,!£uäçÅàjXªƒ­k ·FÙòÑCФÝüéÕ|ÌàW3…ÛŒâÆ•p&0‰v%UPöÊ?pí/û—Ï)¡A’Ñ16C¦{äj³þ'!šõ|‡YãíÖR…ÆžÊ! ž¢-ITœŸþÙ¿AYû×,£Û߸öü’±&J1ûõ½GCãÇHdΜyò:Û/ðëOK§^¤níËòáwÿÝ»ck@Y—žý_}þÜb73ª‚¹‡¶“nÚÖZk-!""$kŒÍB’Tr crþ5{šY…æMf]`W´ý'íÏ0ðA—¶°÷¼!†Àä¸ñ,”o¼ã9Ö¯@Þ¡.ÀXÁûš u=+04©…„³%¦8" –ý‰*5µH¤£*:ja‰ ‹-;Ð2ÎrE#/³Ý¶éu†*#¿PÖ­6RîM5†Ó®@U[€òÀ” ºR”#EaÂh÷ÿ¦â‡O®v¾½ý¥ÀÜúî«í¿ô'óx»½ØWžzþT^ZÞ^þb?ª0f!3TÓÖ-æìE<'^Ú÷ËG|ì“ç"Í“ 1*¢‰ÜTùxw]®j]½{­•mmÓêÎ¥–! vR€Z9ÆKëG¤0 ]«#ʧ±Áj#Y HO·6õ¹þ'å³YÔ Çö¦ÙÊ¥€Œô§EØÅ,ƒ& ®NN‡¢x\vû½©Å³&:sS擈°Š?üÖ¿G<óß?‹%úáÁ£¥g{„Ö¢žøÒ­qÕÔj^è½»ë/ž?úIÉ®ª«ÚÕõÑΓñhóÛúö$T½ë¿ù·^8»X@ÞÊ,a[¤µ’å™±Æc Q°«" Ó@jVƒá”¶€š¦9quJ8÷̵³«&í…·«gࣃsï¾Úµd­±øüŠÜy\ú¨˜Ìá<³VÚRO˜ áXEÕ{4RÚÈ¡¡«‚"*B{…åIIA’šX@ JÊŽ§¸€Œªë-ÝsHA÷)y7¼Df¥ßig ¤‡™;6Oòò’ïÁZoL¤ÑnKUµß*Ǥ®‡FÜÓAR¸«Œwî¬^Øû7ë¿ßÓŒä¯ë_ùä6}ñµV§ÝVű³eF¶+"cGÞÕã¡2µRs”¢Pýˆ¢ˆBõ>žß\;™ò\ÁT" ˆã1Â*‰DP(¬¢ÂÕpè–׊âj—ÆnR.¢ ßvýå{‹g;^©»–¼zé8Õ…ëÊÛöŠ¥ð„—‚½÷ü“úØõ»Õ³ý®Äx Ð „œúis‰.ƒªÔ>þ˜ÖvÖø©r”å)(k¤mÁgø¡œ ‰áGïö&/[ñw{ðè&®Ï,‰ÁJ wn™ö³N§ŠÚ$CI(0ËŸ E®ÎKJD÷Þ‡ÅïÞèYDD£Íþ!½i2âfUa:P!°äÊàP¼9Q­çö¬Y·iǪÓ`¹ôN†ÿÇU®ü“ PK9Ø}rìù%DC6³„_37‡ÖŒIEzÏÖß)éWñƒ{ÂuåjQvÃ'»ÃÉã¿þׯ‹Â¾¸øë¿öüYÛ͉[Fóå¶íd6³6ËlÚàX%"›[k)ž Mvf ÑÖD虉Ó€PD•}=¿óôì)44¹}å®Ó `ŒA°¶ýŠqoyö Kˆ2ÊZŠX9¨¼„9ã”A Y"cN€a¸m²‹mÄ}ê5Y5¡~X{¦Ô¶…RQ­p£T@DK‹Ðî[@ô# kkè˜rkZOµsl  FøQ‹¡Ýá#‚l1Æ GºZŠQVìn_êÿôÃg¿h²É·Ÿ;ñ7Uö+ËE€Ë5˜,CðãÊ©ØÕ#'á˜4GÎ õ?àU__´d!}@CË.šõŽQB¤8QQ.÷ØÙµ”’€DÊ { ¤ w³³ä¹®(µÀ(þŠÂpœ‹ºNy“*Âì:G ËÆÒL?§ ÞÓ{ÛÙ¯·Ÿ|¸öÅ%IõQ¤c6lM9I‘ @@ˆJz©¿½î7¹Ô©w‚Î#›dl¬U™ù‡Ýúêºû{{LýiÝ)t#ÌÃè@TËï\éL‡˜$‡Y Û6Dô8ÝŽÿ–—×§ðzu# ¿þƑԀ“R¯3?/Kp0À¤ñ_¤ ¥4. 3:aº}TÐéT'ÑíÊ:Úöt¿{èèØ¨¢f uU²>ÓÎÁ*1íÂüÜ ?Ì.Ó¿«~ÿ\ ˆ?}ÿ+ÛÉÊçzèÀ8±Y–×{•G`†69UÌ4ò×c‡BÌ *r7?û蹬!-H ö€7Ñ,ªAEdM‘u:;·ÒкªjŽåpˆz,W½-<}ÿðT×L Æé%ˆ÷XrôEtD¸¥t:èNQ[™F¡˜b¬güO•ßçÏŸ\™¹ââ‘Û|˜š¢Á’ä„î/´¶O ÷LL"ITÍ6Þ$;pX!ÇÉ»*ÞÛ^h]7½óRËláry:,Fãªjxç ,š°yТ§ŸYVs±‡ EƒÜ{çNÞw7Zj‚>:\”ŽhœM«oP°<¤IJ¨©¸XÛT㻫'ÇëÛ”w— ÎYSDEÄ;÷ôÿõŽ•—þÑ1e(·vÏ^ËL†„øÊòí d#B´íçô{cÿÂñG¿ô^¼gï\í]í¼¯Æ{››Gòô;ßúÎÊÄIÆýç.Ÿép¦¬ PÞî¶ Yž›øOfÐý¦þbHlXÚ`úc¹™© „¹ªGÒÿ}¾­@·žž¹mô•>a–Û×rüÉv­"*Q8I„åZNs D ¢T¸qŘ5̦ê,E-¤³W` Ѐ(°ÄÀ¿9’OkíZ/íB$A)ƒL@b ¢5Ù¢é¶QGõäÈ÷Gu×dw§CXŠZªŠ#V°}80Š+š˜] ¯4ZËYÆïœßøè‡gþv òŸœzåÍ)9ÕEPA%™É­jµ/Ê~âDµ@JÌÀàMmЍ?½)gXC`ÂxÃêU™uàdÏØŽi¾Py<~RœúŠÎÇ[¨ «:½‰ù£x°7Õ]à|Ì ²f¯?ª’ ¼ö§ íÜ’!D»|ùÁ´õ+ÙÍOWWÉ hÌ Ñ ÁUD $õÈdèÊ>ãÉÚAœ¡ô“@›ÃWi’ƒ  ‰Íô' åç,H]}¼ºžÜÇîäê"ÌRðÄ«÷ß3xC=MkÛ&æù8³„áGJ3" Ð ¨}ùcî¿6xô,¡‰©YMß0‡ KÜoE·Ù$]£¡ý[N\oñç»Z§r¨ªkUUqîþÿó–ñ¯ý㵪‚z¸»y깓õ}çéÀN*"4gžò³š¾f¾¿¥" Þ{ïcffW•îÉá›úoy›‘"Rûô.úÎ"ãR§°yFhZ½V;/²¢Õ²ÆfDÖZcŒ5åG”eÔCAÂÕ 1`3º¦ !ÞPAÙÕS¿tïàø9$3yÿü“±œ½–熈7ËH €~´Øu»F!c_[[6 24²'<ƒñz1=¤Á~ô ˆÄ°ÓÔ–y¬¹C, V}‰í+“Þ.ÂãT,äŒJ{èÇZÕíz˜¯fÖÝ#» =ï E晨:@Ó )-àŒó0êÝ"¼Ðû³Á«Ï«R¶ÿ—ÏÁ`wh¨¦¶‹y0¨ñõ”Usð@ ÁZ–"Ç"p@DPÞ““Óì )€Aí!#ê·QºFP”CK¬È^ËAŦ«ŠˆyiÀ,~OŬƒÞuÅéOò3mKˆ@&ˆzbzª!l¤w¢Hag ^¸ž˜ÖT0ëD#½6³ÀJoà³ë£7Šß^Z 2žlŽ8•ÀçÍ9Îwic»ZSöx¢é±J™ 4;‡wjò„6ÔûI/õUUîÕ/Øê¶ty­'AíWzì?8Ôö   -kú 4^Ðaö˜ü‘ SÞ; çÌÏ.œi#BòÐè (X }¬2M „Nñ!Š®e[ÙÆdo{€ÙØR¤ß‘Š*°ðîÿx×ʯý“5_óô`°{ârŸyî×-Õ"ÙÏw¾¥×®þ°vž•ûºòÎy_:7|¼¹3ž<øÁ_|pDòŽö^Ìp£ßîµ²,o¹1…Í‹VžgÆX2™%¢`à ÛÀÄp¡䊱ÕS«y5£VÐM+ù[Å«… üd¹xH­×Íì ‹úÑN)¢!0. / Yh@•Îy ˆ¢àXÀŽŸqc‹£ä¿@ÀL×X÷FiÀšNÑÆER‹9+BNÌæ4™¢ƒŒ]×nÇ  Ÿ`=a_g­ ­öûȨBÅž€Ž+u ´ŠSh‡a‚¡´ï *rPuãÑíöÅÉÿ±ø»Kh |ïà‹O‡ÐBZ®!³™ªL˜Y*@¡H\OKáÙž%âgUU?uWö®Y²HH=)UhÏAg™€ 2v*‰TÇ¡¾¤^F ™ÂíbÛ¨˜Ûù¹»òÜb§þH“æ œË‚EžäCO¶hò.âËÈÂõ÷ëõWõGg׿‘y>êÇN? »bàùúÍÖò¨­EcÌž¦lÍdÑ©Ùs¶ï¸«Ð; u™DëÑ­«ªw¦z‹yŽÍ dëƒÌô€Ì:DJ)à ¡0‹¢eAPñÎÉÖ»¸qí._0&&©5œ_еMÜWG¢kSRJC‹}Æ¥ªBgdg±³5ß1挡xh4ª¨«°óŸþÓ‡¾úדéþÎî‰+<ÿµƒGe&c$c^ýÀ™ßè¼u—=3«óÂìØ¹ºªC!à'‡›[{÷ßüÑû»."šiÑêÙ—N¯÷ÚyF9µŠ¢hµò<Ïò,ïäÖæbÅ"…n&ý‘0¶MÆÌˆ?ŽVGQPWîuúoÀ³¡}¼}î–ÀsKˆ™)¾ ÕÏJMY?)ƒLnÚŠªL œˆš¼ô ÂY ‹FWI”†#*{ é`Ѝ03–6k„±BÖR`+žËÔÆk`m¶àº]ÀÉX'µ¸Ró=]+Üxxkm$Yw„@Ë XNŒCÐãtärKs)‘vÃáMðÃÎ{óÃç¿Fˆvÿ¯ÎŸÝ$EÛÚ‘m nÈ ê”TئÈ•˜5KÿÄdQÙzœm<½Ô º£8Iáã1µVIØEˆ;ÈxêC–t22žAÕ=u=«¬ƒ»xÆ?9±ÖRc $ò °™‹i”ƒDÝtØá³êÐÉRY#113¹*êåö­ì ùÑÏð« í@ñâXÖfc<ŸHˆ1X‘ú û­µÍãò¤á¬†æ3‰À‰f»6hP>¿-¾×“—¬°ø7Vðñ¶íÓåÂ`y(×ZþÜ™–ÑüúÊÔ¨5e$G [zŠ4Æ™‰ÿ ÏOï?o1 *™Þª8SÂiƒ H@tMëfQD4xr·oΕ»æ‰Ã;ÇÚF4ŒKdh$œûyJæ¼èœ§§/g§?oTw*o-ÙÏŸxÿެ¿2ýÑHU˜½*ˆˆ«w®föžëéhr¸õxkûþoßoDÕ*«_ÿ_{þ챎…¬•gyFY«Ýë¶[­v;3y;3dà ÎgþϨœâ§!ÍXT|9¯Ürò4(”?;»3‚•²Ìd×N냻UˆQæ ÈFßVÀú©4ä¥TQuœ€¡!œ1LCœ#YšÔ’¶%#¸ |)ÞfìPê2md>³óF2­~Ño)Ø”"åXz“zq¥tãOÖÅc{ˆ€‹‚èÇV`‘Æ5Hžà]#ÅD½HÐÕé஽Rý;ÿ“@Dï>¸\M¼³JY‘[årω:ï<°dAß–0±Ii ÂSe…ê]<¿½t&ž”Wßñ´Ô·áÀN‡Ebª2;÷Æ?þÖï-9¡éèààìÕßqŸŒ0Ÿd¨¶ó9÷Ý)¼xòÞÏ„9ˆ±¨0‹Ô¥cvÎûz:nïíníÂp¯’ø¶Ï}þ÷ÿè7¿ðü©n‘í<Ëò¼È[­¢Ýn™ÍlÌ3d(:t£Ú¾œ4Ь&©!ÞÕÃe÷ÎÂk¤¤ï›¥d^l›Üþ:é{»>¢þÒE(W¥6ÔCCΩQ5ƒE/ÊA[+Úè¿´9w¤½¬°Ë¢ª”¶ƒQ“€"Îx²®RòÁ^Ðl×g:fy/ou ð®õétXuebW*_?¶Å¦Š€Ð6¨õak ½l:èêLâÖèf骨¢ÕÎíµxò·Ú€¦~#?åD@#1¹¶¬Âdìk(x%F¬ÔDíÅ(§Dù Y(F×s ɤ „‚MĹÍÀÄÓGUØû)ÅD:»¨! Diht½‹øé¤uæ}n!Ç€øžekãu Y©TV™bÛ:E¶Û±G ®ù­=ûkvë­Þ¥vSi‰6ê:Å¥¸œ¥sÃA'-ïí¥º>+mÕ™Qgã÷À-akúgE±>z|ÉLo£Õ¬ ´Ud¼€{!Xëå1±-|‘`i¼Ò%Ê"ì§ïèâ™[þBK)^éÜÆ Iœé—SnFò5˜åZï‹+›zº~ļ}„ÝÓ6TÃÖHE”gÿú? ù{¿Ý÷µNÆã¯ãéÁ´7f„pùʃw9ÿ&üdKÂ3"ž™Å³wµvŽ…kW×U9=ÜÞzº¯{·ÞÄ€ÆÞÅ/ÿþßýÆ—¯è´:-€¼SdÖZ“¹ÍÛEfó,§Ì†ø'màÍQ¯˜ˆb 3~hœ»jØê@ÏdÍç>¹²Q´®>#GïN9,U$YÀU3K&WçŒwjU‹\T$*éõ`Y†Ð"u;ÂO%sˆêl[„(ìÈQ‹ дˆ‘§©ÐE4¸¢YË‚¢Àd‚ª*×Cê€÷;»‹ì«GéXƒ~Ð*B^he ®ml$¤qc†€*"ÕáýÃË¿Øûê ´ï/f€ ^òVÖEqY«zda$‡Q ÛHÞ© ØQa|¸×Y¿mú€Í[+™d©~ cN¬)=Ëb¢.GÍäµÝ"PØÛ¤«ûgVZÕ€”€à1—fmªËU*ͨF0@M}$^Ÿ¾%Ïwß+¿pfÁÆêDQK“B.Œr/Š6×+4ìç€Vùø™p–¸—± èï._Báªú啾ޞ-õ£'1ŠèÍ ‚æA— ˆB jt¡Ÿ1¶hÂÿ‰xÏð³±}u¸{#î›MŸ6ei“3 0`P+GÀ.ž…!{XioÛÓm„Á¢<µRsXr†Î£*¿÷§Ûÿõ×Z<×{CùÔ’Eû¥Þõôó‡?r*À¨*Âι²òÞqUùªœÖ“C<¾·…P…×;ížÿÊßý¿üÞW¯žìõr­-’µy»•gyQdyÑ-¬¥f|›ÂZSmÚÈ !Q‘@•§‡“•Û[çÏŠRùþ飭^ËàÕžÜ|â•5š<%$´‹í–*޽AV‹Âu‰Ì(’´â‰!-á“'C¢ˆ ‹mò‡’ÀY‚3ñ(9ÛòaT™H8Ÿ™DQ(ËhU»]€ÒCY+ð´4­CiÉÐOwÖ°eY@µßÎŽºcÍl=Eh·” ÎBқȨŽn-žÛù÷Ëw l[ß«[AM»VÀV¡èögäY€ ¢ –jóŒFMN9ñX¿KWîžXFK‹ ZEN²ß]ìZTPeƒÍ?%7àÛ“Edø hù¡h#(ºà¤Þ^:Õ&™‰ÒCÔ3Í+1ª—Dë‰ÏÛ#„®U Ä þ¯?. Ÿ¼·üê’r`QŠÔäpÐ8¸I:­Ç´qXt{”tîG,‚¦"$ ô¢/‡UP~ÜöÏwYԽݿXlíYêœ%5rŠATüƒbΨ¼~ÜRt²ÆÇºÉ*Õ™ü=Ø•D=€ËÙÇ—zíðìÇø @aîIâª(:!E„³Ã#®á,ö*Ý~÷ØËK1ØÜ²i›œ\‘dÁ®f»°²³ÀOY´Án…O5. ¢Ì#˜HpÎȪ“–&Ïg¢•ÿÙÕL?eÒ“-êÁ#Ê<¢žÏ jLØM¹]MM€U<;þð^<=Ÿe h£%í›pì‹Í˜û7ð¢à lß,‘áôÞp#߬˜«û×û«ÈÆdœâÊU<ÃèOþjö¿Ú®»_Øúð6_[²Yf_©~Xëk'>}‹›: ”$$‰zfea/Þ{WÖÕd\ד‰ÊæˆÊ7ô½×ïµ Êìêî¹W~û~ÿ7_{îÜr¯0Æ€µYÇÚ¢°4cš&׸Êg‚CÁ#ñûWïëádýÓ'ç®(YùåZuÅ—ŸzïœI²ëÀ2´€z"@ h5SA%eÐF/¤3©F“ùøIÄÁ0å°0ælµÄF°*@H40óiaÀ-B¿MŠà8¨-@]Ê.V˜¤»K}T-ŒCž‚cêc‰‚0ÀÙ^kæSñƒÝÍ…“wþæäoö “‰¯v„l‡€A*k*–ÁA¬ÀgM¸ÁMO6‘½[æÒÃãBhZ@â#ŠFûhW ëô0RRA¢e£à‡€p.3¤‘ò~PŸÈ'÷ô<ß]:×m~!Í\ R,PƒTWy“OQûDiʨ Ê¨¢ ,?Í^î~¬Ÿë/ÅE²`2…}»4›|PDT=»é—º{‹ã­˜ß*)¥Iƒ$oRÞŒgFe-TÀõ³ðfë´}:2°º‘º`(È•ËñDìNÊSË–ˆ•°!%Y»ŠbH› L¡GwäÔúƒ‹ÖIù@3…ʼe~æ Ô9‡5Àòò‹oßž„-Çà÷Øß0ÜplRèe8GXA•k?ù“¿XþGŸï\¸xóþÑÎø…³Æd×.~ú±Øo˜ï¤a\d˜¨ ‹Ä“À3 ;ö~âÜ` 8­pòàþû¯ÿå_übsj² 'g†å+_ýÝ?úݯ}î¹~N ÔÎm+§þ1ûÓìon)F\UuZïtë;¯¾çŽß!yé’îPjh(\1¤Ò,((ïˆV´•¨(CÐ iòþ…–=VÙA}¡ÇvKPam¨!j"AT„Ù)t3@D­8Išg§2 Y³^·ºÓ©qÖ¨Œ'Ôòhv4XÛÁŒA³EK:Pð¨ºDèªbJ,UL®àxª¸ÑíƒkïíîÅ^·] €²dÇ3Í[¬ÚTàG­ñÈd  ØÄÉ+P虨Y´a%áÀ³]`ø>X¡oí^9ñ£;'Ÿé­p€yÚX̬‚;œzeÐ5–ïsåm# (QÖÇ÷õÂãs'À˜Œ=€¢•¨€¦ª¤XìªêhZª©½¨Õ`²tô¨ \ua €>ÓOðÜ!ž1HFAUb î ÷:„¤ ¤Dùy« ]óDQ® azH|¨˜ÏA„üûpvõƒâJ'‹8ÈØÓJ£µ‹ªóAuâ ïÛHH”»8¤ˆ°xv¿w¿b¿k^Zìøw,˜5‘4f"Yƒ§F{fíißoú$Äå$Dà 3yŒáRe¹µËë"ìî¹K¸3@8ÞkßT¹>D€ üõQj{šwUñ:‹¿bPeDñõëœÝøð|;7&´ ©¡Œø¼¦ýK’IJŒÆ'“Ÿ{Z«×3ÓÕöãZI,?šÒÉ–M4Þļ×9s™ªŠ÷þéÿvÓ"\:»r0¬vÆ{—§¿óÚ‰OßêjHÁ®ÍhD@9ÎD¹¨ªª®„+ôÂu9©œ¯§{w>|ë­·¿ó_~~óÀ¡5K"â¼vN¾ò·ÿ›?N¢”ȇ34ë¬SŒo(! ‹‚+÷ìÂ;üâ ~xFp÷EI1Á.T(ËM×*ÂÔPF›ñÄ+x$3ÿ?1wB¦7UN²I¹?€@€ªj‘;B€I‚kê, ]A0ËV³^€0õ<©ƒlŒ3ylÏ´ÈoWw1P†zÆC=Y(‘´“W^¥“’FÊB¤3ó„ªV[Ÿ;ûàaçä" p‰æÐÃRQ&bJÑxYk0%/‡ > ž /(èíz©µÉb+óÖù$Aö»eë†ÄEOŠjf‡|ÎŒyâÓá¢D•{²‘Tá\ëÒGtv9Oü¾¸Õ“¹XÀPÅR’<*ˆƒ¶ªé5Vа± RV¹ù¾¼îßܽtc1åÆ&coÊ»MÐ]×ëïž>–äƒLÞ˜€AÁ†Øl¤gßaø…?þ ›Ý Ȫ铗tk‹ôô"ÅùtªÉÅUá¾ÈŽ_lG…b¤¢Ìe%›£ó/7÷éú£¥31ˆ`.;Yg‘áÐÐaTR€ª"v×rvâ óNÁÜ 7€KâäA•ß·£—zN}ùþñ~ùµµ–Y ð@«(ªòdÆz™{Ô½n¨P|®TÓ I9è'>‚õþöµHÅh2 #'#ŠœgbÀæ•€”§a›UÝs§ªG‚ à«m0gò””h»³¤‘ÐR© ;¯ ëOü S ï/Òþ¥•Oî|_ æM)LUg'€{ïEŒ«ìÔyu%ƒv@]yç½S…éþÓÛ¿øÏßú×þÆÃbËU™™dF6›ÁR²6~Æ”N®ª,Ê/%³uÐG•Óˆ!))Äœjkq‚ÂB¤ Ð"$ð’„Õqм²)2䄪§*+þ›H˜Ûy's…ÂÕË &&<“¹]@ìä GˆcÂ]ÈUS»9<±–ÕúáÒ¤ :¹®Í æSiå^óø±E¤~ÊNáI!Ûï}rü¹ÉC²€ ÃA½^êa­ZÅ®(V½Ú EÓÚ,â¢8FpÒ亴Ù:¯+™€!D¬P—DA ¡QD `ÌÅEQò°Qm*vÎF3ŽŒ,¶¬ŠÊè=¸¶øV±ÑY+Pý)Ž-|f1Ý5ê@ë©Þ)äs«ø˜¥ ìYÞ@_Xãî\:Ó3‹ÿ@­>ÙÒ@  ¡½r›ÏNeu÷h–$šF„qÃ…8{=C^Ã!‚¾;vç߃«rÇ!ÏÔblB컪‚ÁÏÂ`øL†ÔPà U±‰•VÆaÃÍÌþç®}éÓç2›þK8Ÿ™Ó?SÒ ¤\©ß;Ñ⮹pô$Îêo¢]‹ÖæÛˆÐÚèzÿø˜-¯ÿ·× µåý¿Ê~õ¿‚¿9 U¤¨˜žg$L Ѝv¹²¢5(;ÀÚ{ïœ÷u]Uåd4¥8HÜ«êîôÑò¹i ï/tF`T»eSAÍÚ•#ìçñINS&*/’®QDëñ­ +ÛS€R§;¶ëXAË#¨=‡PdsŠĆ3Ó/â,ŠÙ¿­k­Ýg³Â*ÕŒ¢¨Jõ4«Y Ü‡f’. ‚7¼ÂO ð¬¡Hý§ÉÑ~× °Ð'~iùS}a5O5Á¼-5Lã“´j¾âœ*„.JhÉfÈHUõ2ü>{…¿Þþ­……Ï1إɤ‘•NÑ.ßiµ–sšÎÖ@ðè‘ ÐH‚ƒJC.¨n²`®[ÁÉ`ï¹lgjÌ©Lj#X¸RÄÛ§³PþÏ$»Aý0㎇ÓWD”nÓ VÖ Z ú¡¹Õ˜Î\q ¨$0k IŸ{䍯Óò¨·>Ü'ep·ND*˜\ Ñ¶ÆÁoP¥ûÅû?ü³)/ý·©÷þðéÑÕ‹£_A]ŠudY3¨°²ˆ‡NÉ¥o´ò¾vÎ9/®šTìÆ“ª®\5ÜÛúôoþòßþ«?ûÁû;•kSúm¢sBƒ“â]pæÆF-UÉë;·W/kž/ôà‹í¦ÊÍù”“é€È J0€NE½ð ·§3EÌ1^R–>|Õ™ä2²~•Õ+`–xèb#Da ûmÀiÅã˜"U#ã6Û§Ye‡Û»¡´î¨t`„‹e®z߇W‹Éy§X}Š—: heê§=#ˆXKFF@Y€ØÓjHbÖeýÌì3$ü)à‡£üÔÝËý–ÊQ2†~°Ýn.2`aaCBn«íí’`ã4aºc±s‚*û{ŵͭãË­(CG¤0Ø ½´äÏÄŽ ê½€µPÿ ‘‘° âE¶k¾¼êÞØ¿zaÁB KÌÏŽB<«ž™Ö¸öpYŸˆÎeîi£q‘¹ìZÕ¹d‡¦ý~»U^C%­ß?WîƒlôÑè,¥}åÃnÑ”O¦cÝÐ8>CõK¡Oa ^÷>‚ÕV} ic„ )Õ”dð)Ñ"äVäOjðæüôpqyëHDÐ?Úè! 銚‚²1%ê+'>}ðæ÷¦…¿øG7ΞÜúáÁø íf‘Ý3{Læ@E© VaA“Õ¬ê 9Fð"žE½cöµ+«z:LëªäɸâÃÇýôÏ¿õ¯þíwß¾w(ÉìEsQïÍl&•ü4' Pž–» æóRÚ«Ç”w@Nœ¦´¬@Œc{¡ÜÒ(¸1×5«":É=«P"ŽêŒ¦ò‘! 9®¼_S#O Ûx‹Š(#d†´*5¹´¢ºE µ—°ßBšö P/PŒ÷­U åV®æX†@›,FhH¼a—ŸÂ oÊ Úf«æ¹U~R’íKŒôPc,š³¹( L§Néc’Þ9µáE¿#K!îZ>áõÊË}K‰Lj# ‡zRzªG?²pÁÚ9‚¤ÖKjaøÑAñ•®ûîÓçžígÁŠÆu)hfÖB»q ÏÂÞ¥éÃF—ØDsˆ-ÅY‘ð©ªsמÈÞ½n놲úƒƒ«þQw‘€RŒ%‚ø´!Ø6Ž´ÎÇŸ9(ªfÃÜÆ£¤DUåö–žÛ»´d)òÌ“ÈaƈW¥Ì‚AT‘ô"ïy‘¥Õ§£³î±`XÒW·±·š™ðßhV† e-laôÅsoïOuë;ÿ¿ ɹ«þõR®wö¾ßº°H¦‰òšm`nKÆQâွ„±­XÄGdzˆ««Ê²®ËªžVÓÑd29|øÉ/¿óŸ#òLñ¥6ù 3íd¨É¢†AE«ÑèøÎƒ¥«½•ë"ho ¼°S-£Ö3²yË(Wáí!k=‘°Îá©DJl%UÌÕ½jHü”Ùû ‚ˆ¥ f}`T§™H|?­É¨èXu»f\†ŠÚç§qºþ‰{±&²›RЀDÖ×UÏ/в¿w¼wxt± 62Å0ˆëZaŒ‹–Ž6O,g4¿DkP¤”ÚEinRÏì>ñù‚;—™Tœ$dAphZUmÒuã‰'‡Çó'tvú@"ëUž³!YÓ¸>#¸E}æòû£IwXYø›¿P‚îïÿÜùG?<[Ϭ"²Ô„y5 €¹ÔP'gbX˜ÅKøùh fföλº¬¦ÓÚM*_W•cG©JFÑ®( °E1ÈÒÂx:À¥ÊSϾ¨ôñíc4_+2£dâaMh²œ RÀ#P%ÇdhZÏ’¢¾ã35£ËÇ31+ÀïëüÔ¤Ï"Ä”8@<ºóðC„/d,™U^ìNY˜Š^yx´“-îãÐìà uŠž¬ên­(K4´VQ`.·.Ì„¦ª"šötĈ Tô9,4ÓÞ«ÚÇ+ŸZTÔJÂÆ}ÎO‚•$fuÉä—xa´™ÅÔã'ŠPo#u‚ÓÉ"’½Øö$ã½ÝJÌúÞ®3K )€é.Áê² ¨SO/}ì.öìü`mÆE0’B<űiÚd•DcøŸBØôªª°‡;¿ÄÏ×ÿ¥õÅn`ÿ"Is½ÆÝ.¡ž;ª²ÕÍKrŸ5l=âŒIP“S¢:ë#Ã3ÉS·7Û‹DÉ?œ^®’^̉ ‘ŨçqLTÀ3¦ªïóEõÚ ¾1¥áFÂcj DBÄá'ûöøà%JÕ¿6Xôe1&‚ž™€o(¢Cb &!&L¸¦Å®±EJÃ#¾ðLm‘TP@1ÄU%0jÞsR~P.¢ÀTU €Aù.‚1hb¢£}V• yw°;©áT½Kº¼ÜXoÐbÒè>ž¶n|²»q¼•R×gSpšo¢Á»I¥Ù´ƒB h>ËŒUQïåõ²û«¹{ûÆ KdÈ`âhàÌí@O”¾ãº‹wϹûÒñD$âùt ¨€0/šk‚@TÝ2zTÜøá3z¨°Tp³ÙQvÑyÔ…¾×½­+k Yýk"ÍV{ˆ(a×È ºu'§‹ 4i"%¡Üt¼±Pâ4—Î÷öjáüäÁþ)|Xa=Ö‡Gx¢C4§;hFy¡3€rõÊ[eoâ‘•[ý̨áôô§%¸ýÁavmÅ4† †zâœX·ñéhîk´*mt êEØs€Ž¨Š¨óÂÞ{P_M*慠ÒQ­´)*âÇÁuØh¡Ó•{­•`•äÑîÁëgŸìPöªÁ,eC†öÊš|Ia”¡’ABcp*, ZËY†/¢â\+(Ú¾¡rÈìÅÑsš(DRO1ÒBT©‘’‡êÎXX©ó®Uछ„–NÆÓ‰®ï×Û ¼¹z¨ ØË êÄLA±kJ“AÄ™âY¨ˆ¢i …±”)€K±b±EÀ8|ìí 'ØDV±a®Q 4Q­Ø„r†Å’€Í{re›É€Ó¦DÞœÃR!Yè\b˜fäv¦ƒA '»wPóu²„ äödÕ0Ü}jž›<\z¦›+ÎÆZ1cµT ñÚ®Ú&:,foa#_¯üÛ÷ÍËçëýï¯ôº³tA L„ÕQÔ¥M=‘Nï> ò5TÄÀœœé£f«Öyy`ó±ª"ó‡‚×["Þ=:“?em/fA~Ž,îÉ{µäìu|ýX–r.›êö³•FJ•WPÿö³þÆL¹7Ò î,h“†‚¨ ÏVöØ>yÏ]–Íi°xñ`[{=;“¸'%¯6‡aö·öo=2 øËǶ~¤èY¹’é`<î\]6¢‰o:¾“@)Êö:<%S€/·ñÌÞ³Šˆw¡`aÇÌÞ;çëš=Íöo1¬#Á4œ“…¸Ë€€êT]ydŽïW¨ÕÇGþ-=þ)šW,( IJü´°»ÊIôÖL,ÍÂufµœwD]$8JJy˜%JF˜;¤Vˆs×t2Ìn¬]/º]„J`ÄE ¸àŽJ_ 6ŽvN àÂ+íðxT” ˜™fªá×$×…´3Áà8µ¶ÓÉ@Ê1[`‹€°r¸¥«_°B"(Aâ*Œ É`ç‹Q’C¤ @«¾‰0 .-{DUwj«3Ë&ÒÅ®j™C¹79Ú+]÷äf…pÃM#»¬f­a˜Ü¡“«¿°»mšvhü”c–jhÅ‘=kÛ köò¨­ãÑŸë ~ãésWûDÖ¤K1n’ÒÀ ¬.=å³ÃÑÒÖH’¹]c ÎÒ!(‰jaæLÑÙ›ª ¢žÐò F?È×÷&hOgA„ ª†A®.@õøèZ¡AÚO†RZ°û7¶M€ª¾?ÍÚt,†’¦!ÎD8q`ÕàÏ ¢žÝ="­»Ëäœ{ AÌ¢õS,NI$•4…²ê…—>:ª³ñÈXƒë/ãwþùŸˆÖï­jÕþè°{y­È0ä05–)•DT ~Yƒ"´ Â6™]´ Kà‰«0‹wžÙ;ç8ô4Ë?ÂÏ8ó`ŽÍܘ˜‰¤2ê[#=yXÑÃ×n×zòyµD&rÍŠß³t£¢ó¾ƒ9>Æÿ°°îÝÂåò|f¢=È”›‰ÁüñFQÙAAéß:½9AgÎÃm:w´ 1üœl"³iûŠŸ!BE^ŠùMwg賡G tñÊ㟠~°…‚¿ý»‹¾”éÁx]ì‹d¶sãQ„8=ƒlÅ9ð@xÈÁ…)ˆÄ$"`fe‘Ð{vŽâTªq½éì‹]aœ Îß­ÈÓáòõ Ìý‰‡ÉÃ5}ùW2šYÌ m· ® 2«k2[²f­Ç,2$‡ñPX>b?„ˆåÁðKЀƒ Ž#1)ÒTÐPÛB«¥ºï݈­a¯ÖÔSacoÒEPÜÝ^ B»M, B;s©¶ƒÙê‘æ>¾°à&Dk©è€rÛ?ñýµ6 ß¾{¦s˯½‡L0Ùæ”Qݪª @1 ‚!QųƒG[ÅE” +=§ª ÕÅZ˜ Ølý,Ã$W·;š–GœÓû¤ }D ´7²ºÜ"0¨¬7ö²ÿ°¾ešO”tÍO“TÂGãƒæ`LX 'é)‘Jp°‰÷Õ÷eõó¦þùÓó7úÓ15ÜQ%‹ˆ ×H~òá©ö¦ @Ë#‰ò®I;{ææ©;T•w€Ÿ)DÝèÑ·…z"ÊÒ Zׂʪj_BÐÙY%4`"º/ (’d (h}”ê÷µ[Ÿì€¥ÙÐ|é†ój‚p4­ê¤ÆgÊíþÚ֮ƖP6EÏæfÎPÐfPO}éÃaÙšLsP»òùüo6«ÞX´ø‡«ìµNÚ—-¦åd³Ç‰Û.@ÈÖ@3Ϧ«^-Ô1O4n˜EE|DpĽcÏšòOõ:„tKÃO‰åª‰–‡tpr}˜_Ë•±2 ß_{äÚ)4´(ˆHd2c­¸šj!Pql|mÔ¥´Åxô‘ªBÿK´P1¨Š sÈ´Jbñ%cA ê8´øTaKoq±Õé)iÚ75m8œºZªªwŸOªõÞòTAmŽbͨ­‚Ï ô3€tœ ˆ Bkòv»Õ@©³þÁ¡]0øä]wéã»ð…—IQÉ("¥GÓ}‹®-™¡¤nÖ&ˆSLE§«ÈXÕPø•6‹ø`Ú 4}Çú³ö‹KxðÃì‹ý^,¬ÑD_°,¨ÁüÆc8ÞÝ<]?`á WVÕ`ã' ~‰møE§=E8òãS‘÷ýÅUUÑ[Ëö)H¿@4á~GFq^•@ù̲òþÃ6"( é«Ä°:L–hñî“ÒÀñ g ɤ<•YÅ . J“Yå{@œ}ztüÿOÖ=[–\ižØ·–ûÞG]­"nh‘:‘:™Ðªª Uèéj696cÆiò|ä#ÿƒ1>4m¬»ÙÝÚpØÍ](…*TAg&H­uh}õ=zïí¾Ü}Ÿ Ì3DFÞsÏÞîK|ßï›»>„WRïE §‹ÚΩLTÛK˜ì7Š+ƒ²5""áÃì¾P¸‡ç6^T²øûsÕ¸Øë£ùÓ󖉘IO5J pmWOÈᨃ*žnÑÇ­¹›â\hœñÞ;ŽöBMð¶DcN!}AOâc)ÌDªe{N‰A¡›ïŸ¾¶Ms϶‰ Ëȶ-ÃÂyΉò^+ˆ29ÊI%öU8p™àaLGÐU#Q•‰3õÜ€ˆØ;ÁŒW°„Z5TØá;6†y¹1³@ʾ +Cp{¸3pÞî_ëŒî,­)ñ•…°Õœ!ã÷óÊ‹˜™1!j~•“Q׫ hm͈¢×“ÎÌö0SÕþèÎû‹ /ídxÈCI˜”,‘T©¡JÁ\X´~HjO•W]«I¹s “$rŒ‚87ÌÛ{ œoúþíbXŽ7®5÷™?”EÙ;W×™²…\IE@ïÉü©‹{ÇV2ÑPX'¬D5c­üŠ%JspÆ*‚´E#ÖØ. D\Um¾ kÏŠÿÍÍsÍ«±œœ7škŒÑlë*V«íµ-‰Q¡éô2ƒé1(q ;%)Дþðè}4Ó8«"ƒ›85¬h怇ÔFPCÒfAê¥ý8ùêæÂjÓD¦éTÑSÛ$*®U Ûv.;a5àР0Õ“P†½ ËKb:6Üd¡Ù7FGÍåR2¡åþž.ÎKò7PL#©;nöǾúúæ0˜Tù™Æ׫…ÏËÿ§?WÊþø眧ÁÆþÎÌ©9k%™9²Rc9Î&ŸéUVÁ¹îS• X«‚ˆZÔÇߺwÞK°¦‡*Às .K£ÿtéðòRd‰©Î܉¶ÑU–Â>è•ñBãðÇìŸZ0=' ¶¹á¸hæ^E!P V Ct­_ÿ:ƒ ŸˆVÔm¸ôïäÚ¨LuC(®ZAKO ‘Ðf#˜öÉ4ò¹4¬ÜHID DÖJ5Ùàö}Ú8Ð5æ Ü6Bý,wÄÈ(2™°ú%šXÓ|˜˜ÜÌ;3DÛÝÍéX@اâõ[ö_‘Cßj+{2a¬*^Ün¡MÕ4¯¹âA×GA9l±¢ª7« ;'K ÷F9ÑN5ì÷ûý"?=Ü 9a£þ!?bY óѶ}dðÑâá6DÒþIc`»uMž…7ÖŠ ©P>ä¨W-^Úà/,£ûcûõˈ2#bHEã¬L¤÷ìnWço ß醟HV %Vá¹>’ð÷R?4_OKâÞdw?WïoœÞícæLÚ?Šª€ÄBÖAG"0äöàl¼8ƒœ)žßÓ䄃ÖTxÿcn»ãMb¶†R(ÕýjhàÖwµ2?p³O­,}R—˜L –ƒMš=Ä4Y>L滣OšíVÈl~ò¡ÞOFúÄÙ˯vÿËŸ òÿÍ¿XtNG»ýAûü²i UZ 2ÌüŽ3N©¥ÕñSiz.Þ‹÷Ñ]æ\ˆšDöJTÙ¦ôíðÛô÷Uq$ÀÉóM‰,/}z£sBsùòù C=ü˜£ˆ‚Éæ-Û6 Ý·Þ‰˜ ©"rªàà©sZc¬ †S70ÌqqK‰+ä/I!Hˆ '8g¶1£\•°G:ö¾ª*UX;ø1‘ÛÈ.Ú3žøÆ°å wŒ˜¡É…€l¬D° ÛZ†„´C‡9`›¶± ‚ï–½QgÆ  £"ý2äõkôìÃÊÑŽBä|MÏŒÛoªrÀuxœÓá'là™8$‡…ZsgŒOgË'æU·çÄm•cõU·_ÈIÞ`oÙø¼ê± ÿ¯{è´yÝ<ÙnXK5f#¿ód­®1êÛ”Êù:LIž ­tç9øŒ¸7?>zÏ‚‘äxW2¬˜¨¶Þr8¶17µ e>",ˆ%5üª"±ÃdÆ´ó»þF¥¢òC>5¥âã#¼Ct°a(,ÃåZ +˜’h{Oß#Ô¿~r&åÎÓ”“wY1ªÍcü~eÌé–&›ÜßÓú蜑UGóôu¡ŠŽ›æÄÞ-Q~X%ñ7­ œ ½k )`ã?öNw”iaYÕ>ºøÊGÚþ~}u<øÓ¿ áïožÆûãñ܉Î’³1½ŒåT&köÄ8nÌHßäR¢ÎØ­¶øD뙀÷â|Dqm÷¬5jD¡z ”d‹ú8 6ÆšóMÅ×ès-eŒ^\ÇU“}%Ë8f çh(=#B†À¦A#Zq1~0Œ„S¹  V“µ Itwðw˜òd2(s”ykr{Ç?“q§Ñhç¨ _†ŠÆKCûc”Låæxþ²?ºÝÅÐÇÍd•°¨Q(«›µš%#9•¡( Û4ffŠB}¿ëfPT{ªöêÏÍý\f¿±âÀ[ÀGO˜ Gj"Õ)u)XT^ÄóL˜„Ç®a¸Í 3Û¼sTz-éߎ}Y v 9௰αá²#»Y’,03AJçÞÓ¹³WvO´fL2^Õz ªcº’QWDe茩€F˜ÀÊd÷‘DEªJ^ÜÊž›•þOÝ—Ö–‚ –'@`CÙÉ«4³zuÍ_v5;˜Ó™¤^ðF,B_jŸ>ycUTtç“ÆÌi"ª>j¯lr€5™fðjLI<¼@Ùcðå•™Ã&dÑDÇ“½ó”sI¡®º¼»º Ë×2%$1bªs…âÙaè`~Ë‹£½ÛÍõ[Ý0ÑQõLÁ³I4ÛäïS!ÿfñÙ@lW™ÁŸ.þ±çÏß³ùOcïzÿå/Tí?ÿAÛ9?¸ÝÛÍOÎ4,³5l¢½!I¥AÚà‘g%jûç: ÏédŠZ3ãEDÅ‹ˆK´[èDÕ(s*7Ò¹Lc²Åû‰öÇïï8M¤Õ›îÄÇNÏŸ´–À¬LcHš*Ð3¤lK"U7勤:Vž¼^&3—IÙ÷É9%e$ûTÌjq¥PfU‰+!Uޤ;1³¡•*Ÿ3P¸ÍlPæD^´“uËR­ïìd{{ËsŽÝíVøþpfªÒŒEuÁ:¢¦´‰úP áBåÇ0Y–Ï4=¸[ÊþþдˆÕZU;|áê—n¾†¾Ð ä3®¢ OÓ>Y9²â¸UáEÅëå]"o—b«^ÐñvøsMÍÌÂYÅ ™ao³òÞ—£Û=?7ÍÁžR\1Õæ.é1‚Žöòž} ÿÉìùVdâFäåDHBÉ'UÀ—#EÃ+KÝ¥ç—E€Ô‹s·^ÀúóT¼ÿÑús³yX⤿²N>_˜¿àÖWŽô61Ê…&¼'¥‰ Î„V%VñÕ{%ŸêxWõ?:6t˜]Þ¦$ñõÝJ Tqõ2Í=.:¼ph5Zê5Å‘'JìñÃîAUÔVWAö@ìÆ!L±iëñAÓƒ[ûðÚ<|­8jo~ »C^mË':°†#’É|¥üt¿²Ca¬=;þiŸÎ>´ûÄ9¿óÿþ kþÏ¿?+^úûŸur%[޲«TµÑ’/´tÆ6]e3_b =\›ø&ñ"i©*RãµÞ8…m{]t…G3Å¿L䙳_$Þ¸Öè¼RÞ»äÁx½}ðc£ÏÌó(61l$k‚,‰ Î0ö‚,‹¿ÀzLãáëŸÉÓöH&,Ð4B‰¼(Ëd¶ xôÔ‘-iL«‘w^Aû¦º¨ähÐpèœäÙÀmÌ5?묋ò‡&â[†½¼$Àz6‚ÖK}ñ.£tœŠ³É¨=oHË=*|1rL*rp‰ªÊø›gø—Åú·g• ¨-â žÁÇÎÐzÅøØ”Gç4dn1ˆ 7„<³™}È@îÌiykØwNÕõ¶Gztx“u¹IJ̣׌ÉU†€Š÷ýê™w·N,·˜‚Ÿ þA”P3I% ø *Aîµ&üDžÍdl“U©w~‚#O¾ùþÒ³Ëme¦ö=iÙˆÎîþä¯ÝÞ“”Ú¨¤ªnŠŒëÌI¨ÔÓáIŒBb ì\ÏÖÖI|õÙb>¢|=QÊPèØ“qÖ×À6Å]Ó“1á'Ø¡xÑpÍ@¼Óñ»c«gÚ0&LÛkÍÂü6íÖê×CAÈ_,¹¢õ™KrbtÓ…}Q8䫽.æ–-"0.»R«{äK¶† ôÁÌ­¿÷ŽÇwf^ÿ@Ä‹wnï?ýSóo¾”j°;¶Ïd´Å"2dæ½21Q™eÕ8N 05ÂH²ÊZÓ•)ñæðù(]CÛ+“¹§Ô‡%CtÏ)_¾ô‘¬^¹²þ‚ôÂÅs¯Žqðs (à ÛD謮 br¢ð2V|÷p%a`1Ñ’™ü䘈d¢z_E¬â„«ÆQ ªSÝÉšÙF>“Àv†R 1såˆúc_ئŒŠn¾pÅž…Ò~?tí³ß–ð>õZSéÅIð¢bš­ö,„ËžwΕCË¡}p΋ê? žÿð}}êqÓô"9´HÉ)”†éá9gN3ê5ñ‚ÝkŸ \ik¯T7²f¾rB0à&º›¥s"â†wn=¿ÅX^3fU¸Ë :*r'ôÞ~v÷£Åš¦vì¦Lä Ñ(X9²l$®è“q7¾ÁA蕜{aß<;#å_Ÿ\H›ê¤  ’ç#¨yèæZ늋Ró°8c¥bÂL%+Õ¡´Ði§ÆëWµxÍd÷BÙwG3»Ä‡>V4# ¬Wäta—Nw]?5—Ë ’”V£%:Ý&DÄa<+r}—°Þ™°ŸÐü9>aS&Šô.Ì_“ËOéõüðö-á8²@«b­Cà)Jê§ùï÷? µëŒa³ü÷³m>úTñ£®z‚Œ‹bó?übÿÕï/Š—ý~‘Ë3ŠIØØ‡÷f®W‘sj²QÙÊ|5é7t¢®­ Q¨(”ÅĂԘ–º (FLQ[(NسìùŒ®¿}mF~?ÚLï7‡Z){&·1)k´,€à l ¤ÞA•UÃ: ªL<ü%“<˜€`ä©Fkªù´ õ•Â4ª&¦G¥S&k—²æŒU Úá‚rU ;魫ű ê6Óߘ7Èö­’çŒEa#ƒXÓÚƒ›çd;!êyŒ|(AÊ Ý÷©WÞùóÓë/ôÛ¿·î•Ð1¥B2ÊILŠ}P€&ŠŠáÈÛû÷Yd¤Ä*P‡AŸjØŸkŠÜZ¥j«?ªP­vvea}Ëi~MxƒýM.Z£!àÆUs¦ývvO›ÙÂ=À\“W¨ÏÞyÌSÞ4ñÔ…è´§>^ â+½ñK:þ$äæ³Ÿ_ê0™ M‘]š=xE—f/.û.q4•”² ‰ ^Óz"\K’ŸÖSUuªÞÇžªÝGºDk˜-mE«Ä\?¦ö“êÂÁ¥0ùšê)Ýz©æ”Ø­¤Ø¹Á˜Y·àq ah2"«×á4c">Ã[ G[³‡67'ð?Uˆ^…]aÕÚú•ÙDtü¹×wÊl4 2ÄçN]x¹äï.½òNȉ"õ~ïßÿSÎñ½ÀƒîÞ¨srÞäY eŽã\¯X¼Óc'Ôj®iª±n×»¹5ЦC*€_ª ÔGÈYXúJÒ†%[ŒBa:ó9q¯n?Ñå7¶Ï¾<ºçuñgŽålÃ측œYz•Žm½–@ucÌ´ÿG"§"bW#8„µ‚é¡í­¤ubksyùÎ~üg¸TüM2«L!6µ»`‚ý^ÿrÏeÍH0û5÷wûæäó½ŸuáÅC ¾(wÿÓ¯HíŸüq§(0Þsc{rÁS'6áâÀgÂv6¹†-WIiÖ˜æˆ"¹!Óm æ˜ä¢˜QSËSÐV #’’јö·˜®½5í»ƒ·;ç­Ú~ãþë7©óÕÌá)h˜–T2Ì*‚Œ¥b¡˜ :EÚæ´cM›VC<#ºë¡7å NS(l$ô([*¯Ä¬`A¼€ ›;Ó[H?.Âì…ZÍrà=r3¢ªØ˜ÃÍùCJz+ö:+­Ì òµ›Á€J»©eÜÁ”gÔjÍ/‚ï‰s0Í ¼øñöì£Mªþ–Ÿyá?x`ZD“†#!6üÇ+±e¢V+TÑ¡…+3Çj+PF=,=àd _ÞxñâÆýí!ÚÝaiƒØª€ÛÆ­tȈz§ïÍû‹wZÇg2CfR¦kÊË [Šw£x㈬€‘hBM·ˆ()©¨/åúËzø*.ýÂ|eiÖ0ןl ÙëºÝîé­-?±?¥¥8ÂäŸêãUt”¦ŠÂS÷cjœVï‹ël¼./eV0¨Wœ1Ä9½ù~~|ù̬å PTu&b ¥òBrqL|:«R‚/×âï©ÜŠ´Qj>sâVŸ=-¸9>¢·|­”PbxÝÖ e2Ì ºï¹wö‹†“ÝwòÃß:ýÂÚû¿U…/âU½ný›_Z¶ÿÍï/±Êx·[ѱ¥<³!]9hÑ@Ôšé•yIܰ…4̰œFO¸úõâøPÓ>àÓú\k p ?¥¡züôlØÛ8ù ø×6u<¼9Ûz³xrÕ1ûì±wHž<@l 3g¦…\,&ð^aGDÄ"„SŠ\”ºiŠŒ ÈZR„°°z;šaJ#DUdYüáÆáºÅœ™ÁL lѸ¯êÜñÝ»¼é*»Í¬q1?§Ð-"Q(æLF{Mï Y0&¤=RÖ‰R@Aå´Éò¼9EUh¥LÍêe™ßŸ?Ï`såGŸ;ø³²uªI&WA‹„4aRDXêCa.-çtutë~ CÄP¯¤E@Ún6ηˆïdÙÚ¨œ÷ õZnwéP¾YŸãØJuo±v÷†n_¢ó³oãáY«†‘|íñsÔˆÊpgH)Äd„`jÿ›¢ ‰p¥«üßog_9àåç7N<²ýjàú…=~ÅÙc×höÊ(pã#÷;ΉÒnŽé.~ŒŒ$ËX0©**y?ÇýM¡ñ­ÁR_[+Jb“ÐNà+aU´Œú×?ÊÐtÜš¤w&LùJ w ÁITUno2޵`86¼Á°¦iR£¸&[½™¥ëJ³6{gŠ+>dÖÈÇ[K3¨£×&ãæ?Û¼ÐwÙžgbšÿFãïw°ü­á?l‡ö*(ðDzûïFdÿä;¾”AXåÇ,3©bì™ý’J˜ŽíË,÷‹ÉçÔoˆI2í$’(ì¥TI½¦¹b0]D솄\-…$b“åÏÏaãí‘·ÜÁ¯9 "\¼üÀ§=¬JM ájdívK =G•*·u›ëw>j?¿$0ò³[_¸ôžÎ4= ´ŒZêÀÄÑ„¾TˆH ÆjIæN,¥å‡ÒUd™câ«y_î–•¨¨Š8×ëskW³ e°ÞfÐrQ¼?~U×]¼ud¹©õÏ»q©15*ðA-æ*dŽ'uŸPë°|`?•þæotåóÖíýF¿thdL²“tîÐ5™_¹x”¯»4¨"F5¹Öê•s¬'¹uõ¦WÿÁPÎÍz*†w{”4µF ªJ/ȳ²ºx÷ÚÞ=—a*}4)‚'®üp&„èP ®³.ÌfìJ„êEZ]û§T&Ó±|‹­³ët '× Šøh&H_çæA¦&G±ƒÜûð;Û]«#6@vß鋯ôÍŸ½ìþVâ½¯Š›ÿé$ïÿ7sêe´]ŒÍú|f™Ì$^ŠZvìŒnÐ:4r“€/¥)êöTv;M,®w;1&¡#©è›2jÔØ¬?!òÚm_ôv–/7žmìðŽu>#óüŒ çSn¨£`Œ5}J¦ Ï¡åH’Ÿ»0ÁÊ¢¤ÜjÓ¸ç(Å•Æí&@b‚Dcºi4}“5v•šmRÒ²ÄXØ¨Š e¾_Vj¤tâÜx¸r»{ EÔ-®k~I"Y §’Õ€õ2™A¢&(3“ɬé¨ò¶¸ÊK6K Ý;Ãó¿¹rîI«„á×οÓ#µA(hþ)¦Þüä4R’¬Ü‡½ç³ö¹Z%pÏLÞ8²æy?Ÿuƒ½‘—H{Ùíysè¦RcÖZ&È݆ñŒ‰ÿ.ú`Ðxdðîì=í±a’)~j”ahM«S[ŒÐB®\^3±<ˆÃNN“ìfϬ‰¼vkýK‹†2ì*ñÕY[¸­KÍÛçŠO]PLd5a$XóÖ'¨»dDÇÄû6yHÅï}fV±ÐàÆŒ £âpéz%ã½ß{KgŸTòW–ÙPb§c,DÅ&4S¤¢ˆHqI¨¹b‘ÕÈXWj݉Lô\JÌæÜ`ÏxGLJ×ZG¶v%ñ5ƒïAŠ›4·^°~BLÚüÞðÓ¡iv3óÂùï·uùãØ9kð(UN6þïIìþñ¼)6úEv|©a,9:3³ÎWNâYÚÃ,9W# eº¾©³k/tLuRƒSHL ™åhý ˆ‘8dËÆ>¿${¯«BŠrØîü¦:J”ôµý{Þë‰G™±†Éˆä øÊ(Y0ef,ÁWœ^Ö0 ‰y‚“ 5; )lŒëvê\¥  Q¶µL™ê'6†ò¹&42(%dÐQ£Sv«‚›4‚÷®ì-ôwW—¼Žá ´óD¥gO°¶23µ¨LÓâX;1“’ͲΒ!ÐHÅ¡Ñn*ÜöõÛ­õýŸŽ¾~VHñÞKÏú‹ÌÈÛ*–a¢æ¶Vg)¢ì¼~‰•¾Ãi½~n™H vZæ+6׬ì_/B%å¸áö˜×¶ ðzÜOª»V,‡óÜWŠ[øÁü¹/o„_w€‹¢.€Ã[9Eê=Y'ÔœØ4&°îžE ð¥ßzQÖŸg¹óòЩÅÕ CǶ÷ü1çTw#Ø5A–)Ì ý!1˧“Á¦fX©7c¸êÝ\΢Bu -Å1&cPpT¸KÈ,_Ø'›¾¼aNrìSî0}Oï ñ°÷d0&òÅd=¨±ÓÄ xâÚž»æÙ+ƒ#íkÀ 3:‹šˆe¢T#äÇz«;nT=%Îìé{.¾\ñç^x©J?"¾*ïüÛgÈ~ðÇËÞé¸Ûw|h©Á1܈˜V÷G€3v–öužF˜°ÂbcUÓhÓ G’V;tàAõnýÝ‹É=á)Á²ÄÌÊöÀóbß¹)äªb´µ ÷Nû!ÃÄÅÏÏv7({²iµÆÐLGã½) UCU‚s©£ŒA_*ÁÇpÖÔq!A,XïΩ†tÔK²ˆšDTµÚY§©uU•˜ašäD„ •âÄW[œ]שׂwcºÊ¬1¥WµÖ)Ê0Ê­1$± UV€aͼ³ hÕ§¶3kU‹kû˫アú{-o矼: sbê£þ*‚h¦jË„1 º{q¶¥déÄÛGׄ4HÑØV@gæ¸P±wPŠÍa©âE ð~¼Ý×#v‡ä(C„(ÛÞµþX‹CÐJ…ñ[X>~åú‰Ã˜K^dÒ$³F‰!ª¢Þ©e ›†ÙJ=I —‡çÓýb_^)ÝÎ=±Ö¨TN‚€{.ß¾å—oì$Ç ˜ëò4ZBÓR’´æDÖj{LÀ€’t‚ú^)fÀøön»ò«í¸! Rð}¨6T×>ÆÚyÇÃÝSM’ÚÛ¦ñ/ÔšîsÚ…ªnwz¸°I÷â(p· ž;~glªléàu=-W< )M6¼O7A‹¡!ç4a#Fû{w>T¼/–¯5~yó¿ŸýíFʉ )î*ΗÅÍÿø VóG´(…ŽwûeãèJn s<Ìá^Éâs¾‹y °"Vƒ é3ɰ#‰'h9ÀÏ$Ô91 ‹ò„?^?-ÆåÊO.Éð—}çTªÑ ¤ñsó¹y¦×³S¯±†éîÔé;¯Ätxq§Ì<­™ z¶ºê¢gLâäu t°AÆ„£ÇDÕÕ“÷¾Ò-r7RËÈ|àÆOÇö™S—^¬0Q´D¿oY¹ÿRæóüÑ" å~¿Âá•ܱaí—B¶íw¨©}ϱ"¥ÉPu:å°_ŠŒŠš×P¤¨D`_‚¨&í;ybmÎ}üÞ ç*çü¨¿‘þäúÑ{àÒ{|¸Çó_°Ö25æ²T¶Êd‰â ¬.‘5b›È“ø¥ø3s :(„H\±±üBÔP”f) nC©V‘’ÉxѶÚ jÛJCRéL »£Êe çáÕ»nµ|•N’1Ã(x^j“S6\Ô‘/JqülÒžˆaL«•/´ ´S˜1ƒ–²ß—þGæOöþׯª ðÂ'÷·DVzõµ¸2šÉ¢S#(Á`fÆ5ûŸñùâÊ},Ûð]Œ¤s÷hcËñqéZy8ßëJ{n27«vªn"—£ ¨ºŠn]ĽÍw÷,6Œ©­$ÐZˆÅÑF *¨ü2Ku™<5‡MÃ8zqòË zìh%ŸüºõÅY2–™ˆ-«`ÝÞäÅ™kÇùS… Qïk.>s²¡+”‰LSÈ©A°éúg@F4òs¤Ôý,#ÊVˆÁ† ‰ŠŠ–ÌÆ“±*j?¹‰{XÝìk¤Ä©Àù–z ‚D‘ Ï=„Æ× +ªáz„ÄðN ÖZ00r²¸BU™ß;ºÖ8¶s[Sö")1T½îVz EtÓÒdþO.]hcOˆ˜:ßâ¿ß¢Ùoà/ïˆÈ$Œ !aÞ—îæÿøc#üƒµ\t¼·?Ò£«Ö23±!2‹ee¼1ÍÙªkg±á#?)X·§W옄‡Ú†£s¢m Ÿ*¡&p×X°m~uYº/t½÷^áËݕы­çs"*_˜=þés‡,‰Í@-0ÏÆ@Édfèœ(\LK#žØSš+Ô!êúÀOk(âtŠE©²Vê ˜IÒ Ô;oó†<ö4ã¡FYQ–’5dHâAE5jï 5Ëj̤J¤sL{¤0¥ؤ …â˜` JÄÆäÜœg@G™€²¹†Âï+¿ûúµs‡^ÿíɯ6`²êï²9€›@€[K±´ð¹U`2u÷ʵsŸ>f™¢GnÄéü,l Å ‹;3K¯Î'¿yíüÛ»ºú„1Y–[´ Ð:‰[vPÏ,.xƒ?Jë4ÕlJ3¤{¢c44*Á5ÂÅ“bK¤ª>iÆ Jd8[ò3 è³ë+…¢3CÙ¯<ºg)z³Øœ]ñäb52·hÝ8\ U|2Õ1:¡a†±<¿¤€ïÚ&ŸµŠáv!"wÞòçåï_¾GAüÙÛmaBøwµù$%ÑÓ!i"°pâ.Þáû¯T&"CÑ3 «ØÊg¥¸:®¼x~•â‹Í¡'IÀ U£0t"NîE”>ìf ßÌε,Çr4,«Hëèóp+€ªÐwEŽ^=£ŸHHßw¢/Ý4Ÿ{Pª›?+?¿6—BÚ™™î½áü¹ÛýÃ[Û%ñ,j;DÄkÔà¡¶“h}twF¿ª¨øÏöÄAº{ =˜Ð!‚\8ì ‚x¼50O³ú›ó£Õ„cÆe­E“ðÕ^³ªxq›»ÄG3Ï– Å4ŽÚã\c‹9zn9?u£äŠçÝí\Sab`Dû4»TË‚µîà7/]H£§ âÙ/6þî¦o~qÝI"PFá…@EÕ¹êÖ¿ý ÿ६FÛ½±?²šÙ̲álŽjKÊóN™7;nB­Iè=_ÛýAÓQÇ\0ÑD:s-Iûܨ9„1ùS‡1þ힯œu£¾Y¿õîÂãJàÁ‹'õ#öϯšLa9‡ _VÎ9!ª4¨M>Äð4„­G­ TfÁ dGCk*I…â Ç£œ…¨F=±Ål«ÕÉ¡Jû<,â¹FÞqVÕ©z©v²æåüÔÅ^×Ìz©š*Fʱ?V¹;„J&T•9(оLÛ@FÛeé‹þí÷Žž¼þO3ß[U}³dé ÈX;13'ßÅ]Ü™@D"1"ÆoH§ÌųÐ6 Ã—/7\t5¶æ{#·àî5òÃ~kÀÕáù…åõúE>?÷–?½Ö&Ò Ĥ⪓ÚÃ.¬ õú¤¯±¼1$‡lsWîýƒÎ~sFª×>=ðÜR“Œ5Á8{ì"5NÜžY¹> PQKþ%ÑVºïiJ©Þ×fÚh“ºë$ øÑfþ˜zڻƃ-Nü Õ 7¤L•D¯¾CçNQµyãÃÁ¬d(…ÅPLë"TU}ƒõ`“`bu2Ñ®sà2¬« ×Ec}æ‹%©D¡GÌתÊ4×&éw† è+‹ï÷ÊF¯OLœ?ôÀå_WÙç/ý¤¤z&œJ€ïUÉöø1`ÿ_®j…²ßuº¶’‡ÃüúҮضón™7ª®$Å‚N Ï¿¸®8°‚à ÎÀ(©‹˜Ú>n."cìò×H/èªÊ‰÷*®èß<ÐzÙ=¼¨DôjyîR=BjLNs èŒp˜H˜¡³w’ħ‰9³ª ÀF…iQQ%KÙä~ªs ƒ„5cÍЊP9ƒ*|YÓ(Èï™Òç e#>×QéµÉ¥’¸žv.Ø£FËXŠóÊŒ-2G!Æ!†&æ©è"ÖvÞži hä…öÄkVý‹ç;ÿxé¡ç­1|뺑 è3ñpµ Oq¦kr½´àò²zg¼rê£ÅÃÈëW›±7WÄoõ+ïƒ}DTýþžv·H–6xÝÍö¾¥vÛ†bË«–¯cùäæÅÙc-JÖÊšS#“x0…é, 6)ð6*‚h‚hHM¹wEùâ½çQÁÎÏÝ3Ì18p0¿¤‹ ›+DÅkÈm¯Gj2!tJ,¸ö¸Nb Pÿš‚bH oIë ¼Žîxò  È ½‚UáLˆœñ€–¯Hë ëŠëG’ý‰¦¼Êé˜ æÚ)„†T×瘙µ¶ö×*ÅÐ(‡°z@§‡w‚“tQNoûÚz+f›®º ^ËÂÎ3*nŽ|Cåžg¶fæÙìŸî`öüO¯É]qh¡ð 1=λÿøK¥ü{²‡Ñ~”^ɳŒˆWË‘·¢:—Ý4í¸ëÓ«ÎuðÖDû™ )Û0!4Ò72•Àãâ5éÈ0«}t]Ê—ösD(ÅþF¾öÖÍS)s¶ù›û˜žnr³Õ°ddÉG£x^88ëSiÀËÖU%a"A2feÏ…ºXQÛ77ƒ9N‚ŒMÕG7MXY37æ‘5 r ã!“!¦öª dÆ!îÚ»¡kÝôÇs$„ýB‹*ë€ðÒ‘€ïöêShB˜8˳֌U¥=+`3ÛPøñÈ‹ÓáÞ»‹÷þ³ùÒQe’ o†#åû—À!ˆê_x½ÀÙðÛyTyß]ØÌ¸=xÀ€™˜`²ð3ò­•Ž/n‡^E\À‰Hé†ûží27ç-“B=w ¶ ™Šâ­Q~Ÿ5ûÜbµ£ú-Ö¥¡†öyœ”%FåЄ OÜ„þVš_šõÕGïuž[i1“ÁùAÏ7 /Eå$‚Bc2ftÖÁgJJ¡`«%€šòÂÃÃ*¤¢Ÿ•ö´U©¶Æ„ÎBlëøÊƒÈPá6ñø¬b·8käI'EðtÆf\èxÑêz¡ÄØðqL=C”SÀ9ñ#;=ª<Žö®7Žmn¥‹—‰ LÝ"=EÙ®*öÛþÞ¸1.˜ ÙGøì…R¿ïÖ¯ª$Õ»XEªªê*¿ýï~F0ßýWØëx·[¹CšÆ]–T’f ¼%sf4ª[uñ¤õž9íµ4MàÅwg(K\Š„Ü˜Ž$0óâW`/¿á½¨Åpoÿ`õëær%Wýýüñ÷•Ï˲&g9H«•hk&’wJ1 2(‘q5QN ˜ƒ×鬔Ô?é± ‹ññfG¾KÜWZÎæÐn„ѱ í»m™rè„s;RñDʾ,W{Ý•y Ò q.ó½\¶ù©øÕtiÖ!fc³ö,ùm[)7æ,tÔp•sÝK—Ïûè·‡¾ÕèÐ7ŽYÈÉlj ³%Ö”àŽ-%s"8*TgU²Òí½Å÷çïß?( Z`!o¬ªl>R„Ux7Þ.tmßKçpœ™k†íQŽÕ­÷عJ÷-|Ú?~ ÍT§rÖ÷~œl‡ÖUž2Õ|B±L‚¹¤ÍL¯‹ªB\¥/¿sO:?üñιǖ3¢` þÈ•Ÿæ‹Ýøù8ênf[ZƒèE‰Ä»J{ÿñùÖÿaÝ;q;ƒ‘9°’›™eõ™SÊfÝm^D¯šJÛ“ÉÛŸæªS4MæD Båœ$àĉ,±aÎæ¾Ã¸ø¶ó•‹:.1¾Ø“ÃýwÏelLñÓµ£±Üsh¶™w2…"Wˆ"×RÁä˜t¢B BãZ\¦b`NÊŸôÅQ!0¹éQœOú¾±Ï6mn´,TeO ŸÃif…æeT:góa… ê¾Ü s«u̇›M ùB£b(BŒ”L‚!/[B1ÛŽÚ-3×R`‡´·›€*‚sNªáÖ[‹÷oý°õGëÆ€ö¯Q]ÿf‹˜I*L — aKZ*È4¥ ³7oçîï<™³!¢ÌÚP : u;ÃK+T¨ør»« Ù&°F†™Iào{Æz–“Bâí7ž¬^£Ú Óˆè÷H+>â8{ó¾pUSõë$P{¢,Cäp¨x/ï|È¿Âê^ùôÈS+–˜ éqÚÁÂògkÍφ!¼/_§‹Šˆ’šp; “¸ä‰ $‰Õ >UºÇªßÛòÀJèž ‘’*2±±VUèâeóÐAÁ­Á‰XµÇûÓcñ@d’€{_a98c3‹ÔDy_2ÌF86±Òýr®ÒÓö‚¯.;šPxImÈBët~>øƒ@æ©§_ê•ð=e2ù—ÜßméÜwì_]‘`IJŸ Œ»ÿÓõV¾ú?BéýphüCíùÙžk9“Ñ\Õçîø©´MªDêÉÓd¼ ‘|¬S‰Gµ)0,h„¢—ˆAlmöìu¿ÞçÕ‹s¤ª†ûÛ+³?+=(Äüá§÷¾9Äâ—ZlrRÐXB*‰1D½RT¡ 6–ÌèÆŽ")‘m“€êHU³,™Dº‰Ñˆ±‘ŠÔ#Ö€P¶¼È­Œ•©ñ¸°pàmÇ+§ ÙûBQލy›N棤x0s¶ä@³®ŸÔ ’´1Q0À¦™7ç-”ÇŠ|¾¡ìö‡•ÒX<àz7¯Ÿ<üÊ{‡¾eÕbÿÇÕ®ò =)á,­Ck¥±--L_¼üZ/½qx‘¬!cY=ˆH›«*ããJƒgTU<¼ ú»U~pÏHÛ‰žêî>ùÙ†åò­pç=œ¿°uü@ÃÆ)À$키æ.B!c¥x†™1qðhº…ïÂj«Åø‡C~ú\©Û/ôž½!#6§]wš.ž“k¢)~b²ôàMÃÊã®6ÉUÒ;®}¢2±eŠût_NÎyïÊ LÄ¡P• DŽØ²S‚jõ3n?¥<¾}bΤAS¸Ä“y—İâ0(o+V–®ÎaÒÚ!¤ dæì‘Š6NŒnæÇ÷®‡Â˜âü>èëÝpÇ6æB`±ÁÌw®_ê•Í~iˆÑxúø§¿.ùñ‡/¼à¢n“j>4(×ýŠ/\ÿÿõ§Êþùÿþ¨:-ön:â@c_æ4'š+‡f »^IïÞ¢ÖÍÀïæ¯‡,ž +1ˆs™¦‹Ø˜Î· ×Þ/II"R{·³µO?;ø(fÿ…³ï“>¼ØÊÚP_PÅ©#J W¥Ôñz9'›bImFãb²„"MA"ÚN;g‘a L†²%4f@ÀÀ»q¥d¯lо«² >ì$ *…®ÜT„Þ‚ˆV2É!û¿­Szb"Û0y(ÉÀ ™Ö ã]GŒÂyÑj¸ÿa~ŽÿfðÄy€øNÅÃwû3ß^W©e1›.˜I¦ç/¢ª/Ù®Wyc8wÿEy8³±­eÚýÍ=£OY˜5 dê½ó*œåC/ ïk[Š5¨?""ƒ‡µI»øòSÄi)ÕÚø$ÝRÒêPÈ ¢fÓÎ4Š=© eVV/-CWåb¬Uü—úb£åoÏA%€Ì´ /±u“FW§’¤‚dy3Ÿm:¹BM§¡êûòçœxw/l<¾ðW'žòІѹã¿ÞʾxØ€9åëÕ¦àXå†aó’¨y¡ñ86ÿáÚ°š<#«Zërw\’@ÃA&"^EÜξ® ²‹Äl bq ,GÂ)©ª$²ý1έ||ûàáV0’q\§,N–yr>ô9C“\°I¢XŠŽOÛW_•îê¯ÑþÆÌX¯¼L›±ÀZë/­~z¨q©QÑ»²¶5p]¢)„! øÉȪ¾!"±dª  N{}¿t笺Ý!4[‘‰”,¬vƒÎPÔ½Z¶Ÿ")ß?8 Þ k‘Ô$׿ùD¥ªò6ã¨104͘‡¤]ɛӲì\ô§üÕrŠˆÅÂx‹°`!JÌj¾=ÿê^‘õ0Ltä«Å·uñûþ'71-¬ÒÌ%mÒ_ Àùý¿þÏ##Oýë3ìD‡;Åj6¿ÐÊÈ´ݲÕ.öb¤q’:Ó´žbj>K¬˜²QóÕ` bJ ub2Ld=©úƆ÷Þ‰ÔP¤êßvë½ß6ŸÈ¢_T§ßw:{$o+˜v,2cÄx¯Üó ò^ÔkÄI$by² M†Û¤£äÖÉA1ɱ+UI$7)ÈÀÌÓd"r#h3t y›‹JÕ pµ¹Hu¯eîä‡ÔñØ8(I«ã †’¥8šl‹‰büp 0䜯d L%J3ÞPÈ2Úú¨õÿ+}à°Vóù‹C¿7OÌ&ˆ\âÓ˜žë°î+¬fTzUùxÜ|èŠÜÛ´yfí–†ÔVÜ«WñµÙCUDwöu6ë*Ú&îIýF™û¥fÌ®)Iߨfïë½Ûº¿Õ ,\Tµb2 ˆ÷ÀS ªÕâ4ËN¡Jð#÷ãÜÿ„)‹—>8ø…åœèÔV¯\o]9)—]°+©„$¸$8“zøëqÃ;é4 †PM²Xz½u;;´D(FZ3ÎxãÇš{¥†@<x‰ž\¹9´ÖþÕt~šjk(DÅëžÈá¶²2ÑT>tºµ&Q|zsßT°Çå–ž^ð¡<‰àÑj ¡[žW3CÄløè×Þ½1VÛóF™³'¿ûššçÎ_úqEÓ«HM¯nrº¥½«xï»ö¿V†>÷¼×zÕn¿YµNÏÊæì–ÎwFÔ8¹^êOHÓ;5$ÒÙO ¯Ã­‰1„²Xü&pó¥QUÉ$[L‘Ñ`ãÔÜ ½Y½ùþ½û·‡3£)*§ò”¤ÔøèÃÝɉ6[…À³¤£àP¤‰ÀÄ‘86VAYh™ŒÌ €­YÔF‡*Kª*õ›·ªÝª¤Ü!ÙJUÕW=4néQ_ðÐÀDËä3%X&ŠþÔ£XÕ #‰[ÙL‹ ­0wfYµØëUP'UõTõ®];qü½f+ÌWܳŸ¼MÏrÏš¥oVî¤Ü97úË4Ñ<û K ñDSa6u'KIzëñÇYë•ñ¦g>dL³dÁå¸ÞtØÿ -=ŽjtåT–H¦rΦ’ÂÉJª\Üð˜YDí·Å±0m„ ´Ï\ï³HãžÑ…üL÷z¡—”^¤P/»K ˆ2Ãþž»ïZã‚ÈfÙÁçËoÉÂgsƒDë×^c¦qœˆàuïªrðÃÿ4”êÑÿó\Šûrt~©-Ð6æšãnúEe«cœÒ=Õ(Fæ¤I_uŠkD%fà'ν}³Œò3­c}5Üñ«W?]|†•ŒûñʱwóëVA±xïD P†Q›„%G§~…¦&'": ÖsÁú¹L4K‚FºTÑú®V6dZ.k*=OÃ*t¶Aý/©eÇê*…xQñå¨wpc¼ª ^ci8%c•…6²KiŠÐ5YfgçEÕH¸1ÛRB±_9ç+çEœ•bÿ]û@ó—…¶X/þèÔ=?Û´ß=Öµ’¬PQ(ÐÊ‘iIªp¿•C‡?X\7ðjד…Z6ÆC'ÁÎqÞ /£­‚W6IÖ- íÜ6z`ÅÄ[EHtÿcsòÐKËg[Ä) ¤ûÀ 1¾Mòu.á.z¡‚‚GZE“¢úÅMù²Õñ'oe_Y™i½mé¾kzèÖMpœeƒ•اärVSTœêTÅ_X¦ÈÓ/œÛú[o¾rŸ£áËWO<½pntÕÌüluáÖлPxk\=Ô'»DI] Ç/m(“·õÌ2âd>.ø|[iàH–: C`¨w?Á:½ñî;YéÖà¸5ÄÑòÑšOä ê5Z ¼ ¶ G ÊÁ+—DkœÂé#-ŠNÈ-OŽt>•{éR¯6US^†j,ƒÑÙ?ºñÁ¨ÊG%3±žx¦ÿ{Xûžüå­¨7Ii?:™yÔ1IÕ ˆ/¤øñè6гÿ—ÇØïl ìⱕeÝ¡Þj SIÕÓd”‰ö_¡çñ°¯™G¸ ±8 ¶OòþWWÕùtw«ˆÕʸß5>¸~àq6 ÷“••k@Ë2´(HÔ2«¹qªP'Ií •ªÅr* fEú•¯ãtkš¼Ö à gs¬ kL̦§YÊ[V ÚµƒŠ *áYÓ+*ŸÛq%ÂИRéón¯³P±J^‰Î玄ÔpMŽueXQ34$'“´©±˜+andM“ ÕnEJÞ—ÁU""nÿ£Ë§×?*xq†ŒÿŸ÷óØ3†˜ØÄ/5®a¦zQ´ LY¨W‘Íè>|pê(7ZgÓÃE1Š6¥h'&VQçö2ï”ffByç ·ˆÝ² ©â$P§ŸÝÁ©Î;ûgÖ[ÄÆ÷°©nTf¡œ4êRR¢%MA±g†’xbñ®|õjs®Âµ—ÝS=³5ÆÑüæñÆG¥Mÿœ¤pÍpâp:‡9(¡Gü› ÞDªÄ»"ΊEzŸØåÂE47C& L,ųšDDÅýÚµž`Ü8ÕJF`24ÉfI^LUU/!\b_åPƒ)ò§ÁAê”ìxHÝss“Eì=øD,>¸;•;èŠá+ RýÒ™7v{}e2&ûÚêËïzúò‰÷~é)M´%%•F·$'™j<3UœHU”÷oör¿ú¯Ÿž_óƒî¶[G°?cìâ·•6ßz§‰ŒŸþv•²·mÏÐ?dÏ-‘5ôáõöªÐ+™€Œa4TŒ*ÐÀkûÅdCEd0«RA¨Ö ÆõšÒ˜dY¡ T«L”‰æ³æœ!+PI,cÙÝÂÁ 0)áMäwßÊ×K&1DÒl—V€ŒG–°¨G¤œ–g¶a³âa^²yVTƒrH)‘pF¢¾ûfëAÛá3^KÞÿË{üõ ó#†™5Æ0r:ŸãÄXçá3_©8%÷*-Ý÷^óT£qhE¢•*WAÅ E²Qøq-7„mY†CpÛò‹î›ó^Çoci}ëÃù³ÍÌ3'1 ÊDn &"G9…î^kA(ÕVÒ´~­—ˆªˆ”¾÷%Ý÷$Ľûnûënµª{·NŸÅ(ìèjV$|{¨ARàžÔ½¨Ò§˜Y«<‚ðYÂ&™ªO©u\ë3+†‰Ù$⪴¤‚ª÷ïmòS³ð[íS[j¡q¬2%Þ•.†«¬k9Y‹š|PÇ•ÆWˆˆŸ»1Î ÉïÝ¿Ú<Þ½÷h:q)1Èû=â…œ,­~÷ÒÍ15{­½çÉáßwqðûÅ?ÞÅĪɫqK‘å± UˆTÅ ÿn—Ýúÿþ‹Çööªýëã¼=+¾¹,ûZÏ)k&@¸ð¦ràjk;³a¾k5Pg€‡a[€cÌS'o]s^üTà…Ѭuoµ—^¿}æŒ'¦½—×òýðí‰UQdè ¨^<Ô ÎÉüy2œ0s„i½&¨Ì'{ À†Úa\%˜ËÀd²4[¢ÀÀ¹aä«úŒËa)¦‰R½‹SQWýÒ5^(H•¼$[, €ÜB+‰‘`Q"nˆ×›g­Ö‚¾ÇJÚšé`·,¡8Ð¥T•0¼ýÙâ V³&Ñ×>üZõc9ÿÍN ,ÄJÖM6<á“ÍVcã*…ÂÓ{{ÙCÃ;çgíÍzFŠQåTÃ̬ޖy_ ÷%oî;ÖÄ9ÕVÑ”ãmKêƒÊÕy}¹l?P¾îk7BÞS”%Mð<€ÂWÊD0)»W'e! þ±­)>ìæ]Y}ø*5¿ºàeÿåKÃÌœ¹5>ºw'=‚S¯]½ýr À~‹žÈÉ<õb<=›\KÈ+ÿna0eÑÌ¢ #hUTêpÂèëeÿ:pŸ+oW§LÀ™MÙÌkß]ƒ«PTÛªK+ã鄱[«è €®Ì]vT¢uìúîÊêÆžW©5EAÆQ‚Çx5Ë`¾Ñ~coØö=ÀX]üjç§ïHþûkÿÂG¿ MøÐ±ž‹jé â˪|áÿ±›ûÅï?T:ïí ¹ÏÚ«Õ¶ þ)Ó/ 1¦£In"sm“k MW´±Î›u÷¥>9ñ*ê'xNJÕàæ`mÿ¥Î¬°¡WöOm–LÁÎ+ œe¦òœÄ©•¤öNÓ:8íüTUÚ¡&ÛlZD«&ax T™H4ôaTœeKÙ\KÚ÷RŠ:ñ"Ü²åØ•Ü¬ÆŽžl_UãåmZfò>ôØ0–âà‹ ÅnRO37¨9ßQ`4VéX?ì:eçœrúâ¤,ºïu×28C(™G?l>ñÊGö[ÃÌ&멞ÆðòŒ/¨ô _9¾c+—W,¬‹&ÇT[Äy„t¡0ö§ñhËñúÌ¡û« MHk%3Q´§âéÆ-ºæÂÆáŠÎºÄÇÕúÞ Y%µRWëéÐ$^*œ0!SQõÁ°Vø¿ÝÖ#_ÍÅÝx¥ÂJ{eíÖêÒå.Cbfh`]Ç#Ej=Bo}ÍÑïnçêP˜úè;zr¦í3ñª™œ_!>NÔ„ÜRñþ§>{ÚêèÖÁVf ‰¦#óRøo¼.Ô‹ß-¨qXPQm¤:Z'éØžmzTfmùRqºýq¯ÎغQU…°O´BsßxóNžë˜Ùd=|çG}:þõÑ_nÒÝ™”˜×Ñ d¸…øÊ~þ6­o/Ìì~1¸íLwuí€ìS̵¦Z?1•HõA|$$•&oEZ¹S !f1Ïyåª÷Þ«–-IÈY•ªßí­¶~3~è¤Ø~g93’8/b²‘* .úAÓ@5iŽ&ž ⶺ¾‡LIÂ'jMÒ˜Ýö *Ùi­01°sy+'(vYFªl k£i÷J‘Ü:%7ؙݯÖrÒŠ€.)„TꦪQL›‚¶•ç³M(íÞÚÊ~Y1KQ‰ødµl^²Mwé” \ùñ#óÓÿƒ5I#®T`#1¶Xu$FS¹þÆ-ž¾åOß× k>‹@®$£ 7ƒ‡ß)ôÐ>ḫ·Èû•Œ':+é¿/Ïî¼c±¦ŠTBš á(cõ1=c"®ª˜±§é²Ô9óE¢çO‰v¯ üÙå£Í+§ùB)`" ¨­Ý”gIh­"iiZ÷}5ÒS¬ûxaûþž?IÞW=å &S¸³HRwùèÝ· ½³žVß’BR¢’Äò*¬åþ€ø4%ˆs]±„ÒJ1‰^ßËÄ›3­Oõ:¦:I:­ ó[D³-mü~ñÑ 2å šûRûgŸ"ÿõ߾ì"§wÒo’ÒÄ«Xƒ¤RH âËjü˳kD=µ0Т ìç‡;Ò5“ËeRáLÙjw€à‡sJÆ”< ±ÀãÐÝ»ö-Ðþ }ï&”Ö¤6€Š×AÓ¬]{éé –ñn¹Ò€´´dòPäñ€IÌçË®4…@ ?µaÎP)Ä&&líHå@J9{hÐiâ9ÊVéa4V£JL¶…A)šqá‚ß)ª¾|ÙoŽw[,¨Èz"’1CÙ•FEMÊ®˜ŠPb6™mΰz-òÜž%ÐhT)¨ôiHΤñýK]C;}¢†Ñ/¯~aû%ß7›Nu…]ÇN(°—u%Zð®mñ£îÆ©{H#Ÿš-B}ŒDŽ)[ÎUû=ÌõDsffRU½Á¹¬Y áÖ‘·*zÔ¾3<·Ð"†©çÃ4qá ¤R ^ÀˆÄ›~óS’ÌTczQU?®~rS–¿×)ezðÁ‡Ýõ“Å%’¸ú¡>yCÂH7A´–³wm®Uëz˜«‰Os5(I›ðá÷)¢U4÷¸$UtZüŒVuÇë6 ¦ž_LpÙ’@Ým¦EŽ’šU£uRQx[Ç.m sn|‘O ®‰Ö{âI P/w”:øâCoî–0Cdl}ìü­¿ó}_+ÿz'DgÆMÃ]Ù…“ÃvB’Q ÎoþÛ-«ôì·š†›3þš[3nh +EÌ?Õ!@¿ãJ{¾¿c˜LLXŸúñDe2L†)ö˜ç·®{qNU…( c&ÁQ2ÜÛ?ÞüYñìºó­ÛóFøŠŒ1ïÙ¨€Eê@Æ‚:p-þÎ 2 etßM! ëày]iLÕ­Jƒ¤¹bCËÈg ”Š‚Ç. 5fXxÑÜŒh•c´…ø.ÛkŽ ’ FÓ€”šVµ*ÃÉÈpaJÉD–M«=ËDn€‘§¹àËÝQ)Þ‹â%À«B¸¼µ v%ѱÌ£?=ýäO?i|ã<)Ø@)Ô©dR ›‚±(E¶6 *ƒ·t}õ³V˃ö|,=W"µ]$ÍÃó>è¢UzšÏ82ÜMièɆ'Š»_釗éüâgVÏ´`„”c⨌¸>MמQJèΧÈQµ-@´®vDÕÕÖßAîyBýš½ÃŸ;·«‡·®ƒÔ ±1TGþHä«Ämzpú…S<ÉKÿ“¦Âê’ 1ÜÀ"îâg¸ê{Å|&@Cªô01A%Ïï ìçãÏŽÍž¶_MÐÀ‰Ô(PKq°Ú ïrL´NáèIÔOtpöº§Š['ooι};½dQÏ’NÞ÷Ún¯}çö§U‘Älùè·ü_ßôïÌüæÊCjßóÔÀ$ä'ýÑ#íE¼z÷Ûÿy à±o.ƒåZw–¥ÕÎŒ‰&¿ºлÁ€“æŠO­°1œ€,“é†jX0mf ´÷Ë‚|(8E’h4þ#BÅþí™ï~¶þ¥\ñŸê, gÔ{Q¶†«‚râ!±~PÕ»¾‡°çõ"h60®l*åÌr°"íŒYÉ@ Ã*~)`"cW¨1KFjJ²É „aQTÆ–…øPx†Ïëü./]2m؈üFÞ„@­ º[ 6Ñ d‡O†¼ÕšY„b<¦RÍ’Q-ŠžïË*%»¦‘]µUbÖ2¹ˆÍ•¿|:û‹ÑÚ??hrPî#¦I6T©1¬ò"9:‹×=7^‰ú»‡1ZA¬Ù9à¾]­ÔÁŽØÙ‘¶² ?q„ËC¯Ï4Mœ@½{Kæ*^7Ÿkäi´Ÿ”=wåe;¡Z7CÁ*¤5O>4Kÿ›™¾tÚ­ï¿{ǶG·v8êy…Ÿ ØâI~õ$ ‘§_o±´žÄ$2]ÿ‹ŠnßÂá•jäIÚsÆZV2Ã…öD,…Ÿªzù-:sÜW7;G,q]kí5Ÿ<€`†DDz*+ó)~WÒ¼’'è0é푯ppíƒêìÌ…žÖw”Üžá’«ÊšÅï-¿Ñë5dȆ¬m=wôßTæ‰/îýe7^Ç¡ÿ‰Î°4@¸Nˆ¯ZGIq¾rÞýâ˜NyuƒQ˜åNn(8bD‹Nþõ.8(ñâY€½ÔµYZuÄ“W`Œa¶ßX~ýúØ…µêÄ eÑ¢2ìî­øŸš§—2µÙ­~ƒ¢…\%²&tÖ¦Ö(~‡UË&ˆËZ‰jÐ Åi¤N6!SCaÂk< °ÕgQîÌr3í±sƤBÞÖþ^5n4ª ZO°U¡n0žßñåðaYA¹0`8ö„Œor¬‘m¶ˆ’mÎRF…ÓB$b²B~‘V]5+ÑÎ—ç• /^ûÆæ‹xìkÖC¢ ™™<Çd²±ÇX¥¨Wܼ­GN夺e2†Î¸ù™±aB:#ðÃ}Oó}2sŠàJ¥Ýž•vÇ·MXŠá•½ì‰üÝî‰õ¦2Û:œ/¬ØÂ¤.üTÜS_Љ”ž"¶&ëy%øñ-èè³Kk7/½3„yØÞ›Ÿ ¡uNvÔ$aØÄ}NuS: Nˆ³Àhþ†øâSê7Î종fC,[TØk,*¤òåK¾õ Iy넉~î´ Óz) fUU­v+jŒ¡åÀ¬±˜“y2dÎ\Páù„ùXNʧ…©Ë"ÀyU¾Gæ©/¾wc(^iÔsèý/›<û'í_¼û\I‰1Vg½,MCM—…x&@«²¬nú̹g¾w¬=ìaFîTÍùvžYºªt®ÓÝÁèõ9Àô@;Ä@ë]ã—˜dY†}Åcãå]uΩh*Ë5¾Œa&1ì,Í¿zëÀ#JjªÍðÊÔd¸áGæ¯þdd¡z晪"j5d®1Ž‹à„˜V"ÆfÐ8 ;=†›¦1—¤;¶”L êŠÌ:ç§Ø~T•{јÅz/SÓ›þ¯lXE—†b5²ù\á÷\¡®ÓBÕõ®2UŠvs„ÉéPÔgR”<ÊÄv÷oN~îg7óv†-cR~ÖàUeÆ£G†•„òSnŸTÒþm ;c =G©HŽáu "'Å^Es=àhU&Ýb˜E“š\Qq¸ù>Ðæ&c(hAã¸E †‰T©"+×ÓÊ);„Lâ !õG¢ª^¡ªüè%Ö§[¹Xmõåè9wAÉâw6S‘ ÉàEI‰ ÓÛîTÞ5ª%ÃB1Å€U†TdÄiQx Uf;Ô·6ñ¹Yß\ž³ô;­ðô¸¬nh|ÏQ¶Jdã´)‘Óâ@žйõ+…ŸŸî_oœé]œÒ<3îYT}­/ö?î–ý!@LÍ/®þöuǼó·ûë>¦Æta7{Ã:¿9ž[)h”0“¿óÛM#}w¶7Êü¥’ÚKÜ„Þ.ì^H' ßwù¦˜Tkü  BÉgKdŒUúòÁk+_ù›ˆA‰”’•Iå`ctDþ>ªeLn¶Ç (-Í4Ö®’€¸‹@3%“„ ¥i1ð±" €©A4êÇ5,δïÂ"ˆ­ám ¢²‹ªraIÝhºžólh¤>]ìÑQtçýƒÇTÓ‡ETR•S+“ÚœBOf¦9¿ÒªoÄ7æ2ÀÝñ˜Œ«„k“ -­åjŸhû—ù7V• ½÷òçÍ_×ÿð€akƒø6Ý‹†€Fƒ­éùpxà“‘mPj†nØ™¼®Ñ•C* ÞõÆ~¦¬sdçBn™Ÿ5Y{¨Š÷ο¢íǪ_®¶ã¬G)b/(^Bñ´‹Ç:r‚™¼)1AITÅU•ÿÅmn}caÃŽrØv±«D&Á÷V\'`¼Õ *µ{4•a£`%µ1›˜4°ÅŸöùtSº=Ø@T z Ž^â¯Ñ{Sœ“rstÌò”§™¦aäÖÖ¤;CâeKR{j)¸)àGÍi³ãŒçùÓ·7ŽïÞ d•ä^æ”fC*ª»Äö“íÊf0[Ö³OmÿמYúú“%-Á&¦‹‰W_ÓŽˆRÜ_ôÄCFWÊÍ×~|Û8Yà¡PG.íùlöÀlfBMïÒ,u*á”±tœB–k½ÃäÐ¥`=øÅî¯{ähÀ²«ÄQWD—CÕ ÷÷Ö[olžy´‘Ï6Š @v°Á™ªW2€z{]¤ûoJ‹šŒ×`T ?˜Þ«¤L6UqdmXßT"éä7Y¶ÚlÍU‰Â‹Êlóq¿,Ù¢ÔIî´*T\µ×Â*¸`U€-G»^åÓ)E”0ÁX²µf½Â• ñÍÊQw$ä* ´“Hº S+Ýb’ß~|ä«™€Ë¿Ùûüg¿öÏ|9‡‰(>‘ˆ»…¢ÓP¡± ðÙtw ªTµÚ pï6·Ç‡P JEQÝïjË©.°Y þ2eˆÓ<ïðöžyhîÚå£'g"÷–¦x•Æš&|¤ÉKÉ0Œß¡×G_¸ªz¹þ •9”Cmï ISœ2Ñt¸®5¦N²¡w¬3-âx@j¯JÛ‡†ëݰGVG=…¬ZF-ܧY•Šx}qœ=E4èžÊˆ5…]$eAm„£ õÒ߇7çµdÉ´À¤çw¶á½]Y½0XY¾¾<Z«:ÃL2ÜwûDrgX¶3—¿2ÿ“wD¾xîÒFu9•” —ö’ô™Zs†'±ÉéÙ\ïî—þ—‹ òþÀ=‹M·Õï |¾0×Ê ›pdq-»¤ÉF5Œ'Éb…% â:É[’x%´¨ Êæf”0•òY%TE¯$v^´Ö4h@ˆrÆÅ¶)~>xþ~U“oÿéýg~r§óSÁ†¥õð=~ܦ!%J1šØ"(I{)#@û7µ!ë1Ð' âTªî®6²Ð´á¡U¹"¶ZU½ª’x_iÿM>׫ùµP0±NÁÊDJêU‰¨HÈG ‹€ôð×ÞÒ:8; TDÅ/\ÈdîPïywGó³Ëg“Å>Ŧ?ÎV“7ëÕBÊ¢ª1õ¡­“ñôöÕ{Ü:êJ:Û² aT h˜ˆ5¦¼s_7Ÿ[”êNcÁÄ\$šc¡¾Í"ØU¢µÙúçК¨9IÄÍs›=.ÅÍ/ùSæò8bnê¨GÔ¡7¤˜÷F-ß%˙͟xøæGtìí½”$µc_µÑ¥«Š¦Öîµ$FE fqc¯¯ïþÇO,ñÂ?Þ¬öܰ7¢æò|#3Ì)׌'ýÓ5ôÎ[²4Í ‰¬`cˆÈXcÏ}M°ýrl@qŒ[ÿxuãâ«Áþp)axþDÃä@Ò8iY¦„]§0<lD_OfiK* „AÚ„Ä©È V£ 9²¥bŽLÔ7i®"íY.UñðÔpƒRµiÆ?Qµ…IR¯œß2bDw|º C¼!Ò0†$Ò¨_7„FÖéX€w•ÊÖ\Cµ ºÎ¡ð> Ý„ƒ}dÚìœRëðû¿\ø½ybæÞü:þAÖ¿3/lMŒEMW*3gÊ™«Â¼Í«iø9Ú›_”h¼1°ù\ $à3¥õ(zš›’šÖ‡Ù™Íüüœ!°RD쩾îл»ççÛIê•^Ɉ '"RŒ˜(XkßVMå ·âtw *€ˆ“á?ŽÐøÜÒrq)ÿüé¹È> U=p£z«BU/Ìq.©˜ÂÕ×h€‰Á¿íù´é2¿ !†ƒ ‰­‚‡쑪øá«˜{Xýê° šáz|I4ÀAApwós0ñk$­m §MX;xm{•sÕzhüAYwµ'5bæ ä¸ÑuÌdxéyó£KšÿáÑ5‚L²J¢5*MÏom ä×?:7ö‡Rõ¯üù'îø—mw_eÜpsn¾aÂì24„Tÿ<Õe(÷èðQ;‰?Œá7Rk3Éjþ9o^»Tª8(àÓQ=…¨’”ƒ›|ðê›ÏÙFÓf‘úr`±ÁÖXæR¡R„V/lí¹–ƒPTƒ23j ­#¤hš!{FV´³¾òÄê&cÌ\;ofªÐ~.Eî‰X!™íYVúG À‡"ê]~·"®¬— :Ù0ÔV!†(.Y§óŒ;+ •A&šÍ3´t½²"ò.уÉEAª Œ±9ÝùÑö½_3ʦüKùüo›/>øÜTqƬȬVp£P¾YÛÂÚ ®‘ 9 EÏY“úÅEÐVÃÃK¹í}{„fKå§¼iµu*2ž½ˆ*œ|zîïÜúdññާ‡)/X”™”%è-üÒ2•“|˜Xé Û£*îKìO?|ôV9¯ƒãl@\žû0Hã¸C¨õêuò_0 æsf§~*¢SDq}ŸŽ6P²ò”% >ÚÈ=×@'È ãüé†îË@”Óƒiìdi®RíA›Ë–c4jm— ©t€â¤Þô¦ æ¹;·²³Ý+“8ãÐŒ¨„ÖÌ“bîQQEcoH¬–í—Î|üÓ§¿:ü³TuHMð›4ĵõ2Ä4†®%qÚÃaÕjíòžÓË/ìË…HU÷‡ÚZZjæhþ)S§ö×Xð§4óx¦ÑóZË‘8ù˜ NÌÎK=ç*IÕýIë5£@¼lµ^,=Ûd5ª*N1s:Ï™ÙR¦0*–iÊ|RV@D ``9…1ÐÔü31£ÓdCE¥qLÄfÎ7š ß3}ÏÄ«·(U©YVú`]O&*wg®èq.†…) \é5Ýþw­È¹ims U—½Úy€JìŽÄy¯1òFe5<Ê ‹÷ñÿ,_?¯JöÚŸÞúÏ6Út”ØfŽp| ;žE’|< O¡a“?Ü!*C DnxÍâˆñnë†$¸lÅ—[cjÐX´XUà?±Æ·!—˜^ÄÉÞ«´ò°{³x¤Õ&CQ(øyÁñªðž¨"ÄKãD+ÎÓ¦yÓ¡ ©)¯¢ªRUåØ?»v}¾}ó·ƒ'îŸg ê›Ø‹P4cbÚE€¤Ê’Y§ÈÒ8 úxÂ`?Br?¡¹cUÕ“AÖ¨¢!õ%à£â®‚ Š«âÜQò×f–r€^ã™5¥ðWˆ¨ˆ×#²# ‚)fµa(˜ÚÚg'fåð'ű…‹Ûñø£)ß)€ÿÙŒWZÖž3Ćïû"þóÊ~°üÊ ždjOI9UÄÐî0ªH¬(E$]4Ýq{˜ ÄHN*kd^¥Øëû|éÀLn ×+ý4B˜B)ñkÀ}™¡tƒ°BI l¬•æ÷­è‹WJ?NÙ&ˆ¬®:À­íÝ^\ùà³¥[ÔÌ@@áTNwÚd2ëBSïtJ–-Xµh2ºQ-Ònbŧº/Š%¥¥hXµ—ÈTcgMÞ (FŽvœ@*©Ð°ã±#Û,FAPK¯y‚JµÙ6{d•ª^Íɇ!¸* 8ë³)1%oµgÚBè•â¹ÙRõC·[:xçÔÇÔÖ:mŽÿöÒ©ãÿtí[óJd^ýàëå?úc0 KlR\SÜ/‹£aU)ƼWAh®Ä=ßÑŽ?`‚Q:LV¸î€›¥Úy£DªNà7(/V!CY¤Þy÷Z5Þ¿qìHË€R‚C kZŽm¾„©ÈDš31ƒ¦èÊøðF •¨š…ë*Ä{ò÷^y7ûú©öDž.pbؤh„U›Ô³ïú‰Õi˜%Mí„Hops½PGÈ„+SC@L 9åÊ"êÕýLæžPßÏP¸ÓÔAL„ªB·1NÕk‰XrrÙu¸1âð:}äÐG*“ @|:,‰ñð³×…Ìz¿4ÆX^ýÒòKoTüØ—7ÿboB$ Y툹: 3âAB=<ÑŒÇßìY_YÚù ÚùïŸi¹ªèwÊ͹ffaÈvXÓ‘!±èѱ¥ØkH¤%k̲'&zü© ·^Iåãô¿6eÔ@¹$výýݳÙéôSC”¨¬T;g$ƒ±ê<…ùL½Ì¼k¯WÚ†TÙä*Nƒ Li2fF å QÈV ]ï 1L‹¹m íjèÕ 2]¶ûê`Æ•úZs•Ò*«m—ï!óB# sy5A2nÒœH>mJ³&ò¥°»ÆHcÍ*;·?pªÎy_D¡÷dÊš9-®¾'÷ÏüõÕ'Ÿ5 .þkó¹·>ÄWž·ž ÌqÐFX:~`Ç ›µÌ-¨9Ä¢Pe«›cK‹Úì³,AåÆCîx2kj9&¯]©0:3MÂ6ÅÑË8}¤÷JóÁK Ñôª ³l!OQ‰WO‡'Ãð5&ñ¦IØ­ºÚøÇK ]=à?»óægë__±Yf ibq…¥Ax˜Â–%n\'’š¸@§hvS—˜ª¨\ñ=UÂê*+ ò•†,et@ "žß¿ek¢¸¶Ú4±-fžðû¦ýF¤¤nÈaÖZ¦r×ûcˆf—жûPï"ßW|T¹¤þŒüʤg`ÿ~ù±xm a 3=üÈæ_ ±ø/ì¯ÞöÓf·Ú`ßýhiÖ”ÀTwÁ5¥øXwPi!jæô¿zÙšbõ_¥­"ãÝ®Ì-œÍ˜LT†ðGl€ÓЙqYæž`";A 6DÄÆ2f¾ÝR}ýJ0ñ%R)~7v0«{½ÖÚGÛ G™$Ô)*èÉj4›€*Œ×‰¥S$x {A2ápÍI¼r˜P‹Bi  e’z/qÁ”YÓhs'W­LÉ…2.¼W›y Y/õÎK¡N†EsD¹QîN#Ä;‚ [âIvv˜Ò±™'€ºÆû|V•*Ù¯¼áÒ!ˆÚ(¥Ãf¹hÃoß~géäè/åÛ§=Ã^ûóÇÿÍÎÌwO1sšy…¬ Ѧ¸Fá3 P¹ã{eõHó3’­~£C3Ʀ<±ôðPÁhO-@¹ "³ÛkU+‹YЄªWQõêëÚéÛå£fcTFPTÄ^S'ò¥ÓvÙ”<-¹jŒ@rr ˜àì}òæÐðÙ£{×¾Ò{èùE ¤.˧b*HïV»×þúùš #â3N¶6ÌrsÌ*æ`f‚ô5 Ñ<¯A¬äE7Þ¢ã'E6[K†ÒÕ:ÝÏL¹TX¤fD3è¦þñýÃM§Âíû®oÏÛ¾† µˆ¿Ã†CÄd¾{äÓîÈ’†»ö|ëŸ(õáK?ì×5pÝ3¦*ô €€@µG’¢fÚ© ªÆ¢^Ý~WÅ”Kÿí×çÝ=ßj/Í7-Å»<®pè®){›øþæ´7=™‰™ØdÆ<ñPe6~3„wùp17$}s“±‰ør°QžÌ^ £C´Jç|‹M#œÊ^ë\íðâzÓ@ˆªÒ€jt›NK„k$‚0ˆ¬!ØÁ¤]ÓlÖœËð}•Ò{!ªˆsT•Ëd\ã–RÈD|9XˆeßêEGè8½dðZÀ& f“Ï-(Ôõ¬˜™6ȪB”cboìÿ¹k-äP×ûôƒ{¼õÛõoÏ ^üøk;¿”3¿·ÀƘh¼Œ'r&e>"BfOÍ pu²ÂúÞ†™£UŽã—Dç ÑhCY³¿Ã¢Ú½a‘ʙðPƒãí]ûpûÎGË÷5@D¦’iÃE>O“>wëÉ4™ÖÃß*µ”ŽOÝ”‹Ÿ.´îtyôñ+Õ—Î/pIÇ3DÒý“ðàõlZ”^ï jnDT>† ª ‹ <Š×“°XÀ)=)ö–þå²ñ¹ÁhÁÿVßéœà*þ¢åcf>þ)®eq)`ìc×÷³Ò›ùµFë‹Ww”¢˜ ¢=’yqÿ×n´7fj@‰9öôµ¿ÈÊwó~Æ5ádâ©?;MÅøNä¡Dã¶8³UäC2š­VUfHr¿ð¿ýîœTZìm ˳ÍàûgQM·­¼§.•zd%ÐyB3ŒV/ó¿gE^¹Z•.í}EÿÿâEê*@†{½…å·÷[ëm"åQ9Ó«œXÉ­†RˆŸ2vß8ÿÛp“dÌ^|¬†ê5uý•‘r\m(ÆeDÁ†—p ò0¶:¡\ céiJPX£öÀ±ÕÙR|U`Èy­‡[`$ë-qn²VG•Cx3ÛTø‘ëž}%B¾†ªÆßqfhÜ‚÷ÞÃÃÍÿïÎSO’‚G?l>ùâüÜLa0–Š_¥yªò!@ÌÆÚ¹Ï hûýúÞk[w…géXòîi $U·ë‰<š†#«MFרY2Q]¯!`Qö>¢ÕsÅkxx¾™üvPŽæ ÄD™òu»>/¥¨³ë„-%jüLö‡PCEUaÿå—¿½ÒF8)æL¡ŸjŠ^NÌouXV„}„ÀtÈ'Èx%¸ÓÍ8e(Æ`C¨Q$Ž%çù£«xbÁ·· %FýzzW½*Û„æÁ¤³œ¢0·öÙÈTÂçšùs­÷G“if8 jÁKãòæÎ¨™ËÙp~ö¹ê¯®Sã{'ÞÿiY#LtzK¯­6IM|!(êq¬ˆB±Zí­‘W;·Üß.ZtùÙÎýŸ|^ýÞÞȶç9ÃXÆ„kR¾|zx‡N†+k:ý&|W0OßWñÆëcçCe²}$™LR–‚,¿·EÊ ´ÐQ…övÙ¦Hû¸µZ:ÀÈÅ<öQOC¯ÜѪPŸáÂù\kâæØdî{¨÷ª üÖ2 4ð¦Èr&!PÛŽ /ܨFp¡ÉŸvFªß2cošUbÊWFC6E1QKÓʲÙÄm–ZŽF{"T8'Þ§ˆkŠ)œé¸‰¡£áÎ[ó'{?l|ï˜Ð…Ÿ=uäo÷~ ±á…KfÅJ>VØZznN”/ïH݈m@. %KY´ÐFˆ#"^]·bãµÙ†\AáîP6:Hv çs¿Ôæ£Ù{×No4â ¶žsð µUŠd®›§©J\'å:qͲ?aoUÅ’”ä®:ÜþÅͳ_\kšà§ X‡lÇ?×nø:¡§öèM¿^G x¹4ÒƒB9?Ç1B^|¸g|€3p쬾¡‡ïU¿“-ç&¼þ˜6×íñR Hi->)¬XîSè©ü†o”lî\À=ŧN'/HXŃãéó^{é4˜sÏx÷gÎßÿ½ÁŸo¨cïZk¢%êÛ1›õﻣkŸl×"IŠiÛ±âÎþÛÆ‹û—× ­ÅÌøâü?} æé§·ÿl3†``b2”H…‹ÛÄȤœÄ(EdSÀ4[º1€xˆÂ%×\,.Wþÿë;Yå¾û:Õhs×ÌÏ.63k ƒÓdŠêN†öÀµm¬M€äø £lËú=¯åÏ7ÔGZù„IÓËDý›Zlïnn /7ÊÕAîÀ<—ÁÏ‹»šúš¹ !«ÉšT¹h3Ô˜ÿ«õ0˜ÎWÊlx:"'†y¡a3Vv1*Þ9ÏÜ ¬Ð0cõN§L`‘aᇣ¼¢†XQ)µ„;mu¢èÄd˜›Æü¬*F•*-©¢º½‘ñU4ÇDå¼é+C}'¢ƒkﮞ½ùùŽT`ó鞟ûÇáÌŽ&®ei:BsLÖf†çžQ¡Ý÷²Sª¢ÍF€%ßђ ²‘dR­º`Çy'ø¥¼Æ7!Õš cF 2Q}«ÇÏfw>™°“/–þ]½ç¯e×™æ÷¼ïZ{ŸtÏU·rd‹•˜I5)µD±ƒ¨ÄV+x„î±ái{Ð6fàÀð†ÓØÀ†a»ÝÒtKIVËj…–Ä$Ф(CåœëÖM'î½×z_Xkísª!€ÄëÜ{ö^ë Ïó{¥«Ê(aâJ#5÷Y‚UÀZ³¶±¼ý†ÒþÁµ-d_Ø#R®þâý­//·ƒCUS"|ýúI²àÔžX0©*¼N:L8¾Iy"`ñçÕ´0k³Pœdá­#ˆ Aú-ÞŠîãNîé6–pP'í·N¸¤¤ê÷#KF)ª’ª0Ô{Û7Ь>âÞ×£87Ö(’£˜ :B¿ÿÄ[÷6}~w°ÝV÷c‡.Œ¥?ñß{ÿøŸ5é5ú)¹™’Cu2*%ÓöùµªUiv»¿nFwªÂ]ýßÌ>ÿÏkˆ×rsÝÏ-.v3“RWb4j‚>ßÞ¸ÈùSyœÐ&P Yc ÙÏïsí£ž¯¤FcJ¸ŠuâSâ´ÁUUÑjpg~ÑI³~c&¿é>ÒœY« ™ô²Ó4rc.¤ÍÔ9p ‹™ ŽÓ¶ëX¦˜,¶4Ûä&)ÔUÄp¸Œ¸ÊÃjå“í®NxSüxÐðÚPCÔÕXêÂCcüÕ͈*¬Í[M…nXÖöœ‚n´Y©ñÎK°ðJÃ1ö¶Á¢îx@]ïÌÊÉ­?ÿíáÏuˆŒÿÿî¼té5>üù‚;%|Ù³†a†Jl3ûñE:wçβôj—z d¢ææªÖ†)CÍ·ñøe j…BŽv×1Sí6 5œpOÞ»ïaÏêêùùƦ0Xn¨Q«&H¹É{ǵtk†ŒØßXÎîv·ûWV .+-ÿ^×a°ùÊÇ?»Ü6Li L¾Â?8ºÄ”‚¸Þ9³Nâye ­*ta‘(ë³fy0Çf¢T˜ ÞÙ´Ïän0ØÚ°1hÂOw|šSÕ‘W?×fL†g1à쑲ï¥D~¼Çé—§6¡ ÆèÁ/9_Uùx}¬bæ°çãúÝËb¾|äÜÇTë5Š›Â)% !3¥NöôQo™ÕBDvߨ­¾R>»½º*K­á}_Vréø¥Š{â?9’‰sõ5ל]ìd–&„óz§©|íÖÑ·IŸ˜MŠ‘µJ̺ïãP÷ó땯œ—zу ÃäIbjývÄ—÷ªÅfBwv°µ7b¿£¥A[‹:hŠ7š¥F °°!¯Œ(ØŸ^ŒêT°yÔdË0ÔõÌLfɘhä‡ñVÁše~à‹Ì8_bÂâTõåFNhZÀÙÖ8Uä$ri+Æ6YcÎ*ÑZfd¡©*}3*ƪã*¡Ò¢s‹¡PjÀ‘•›JâühímsÂsü 6µå¹¿»b_|&–àÁá6G°2 Î;?á•Wëµ®(=vôǤí Åí¢[µ›QÅ’”JĬ"ź*@3™Íªã+ÈÇrËLIÕ®âP½*­Çíé;÷wMdÜQG«6Ê_"} D3Å“n˜qäj)ÝÝgeéÖ¿½lðü\鯥Ÿ•Ÿ:>GjãΑ™ êëlCEb…Å27ºjô€M^'q7¡2‘Ûw, šõÍþÈá øaVN9¡!¢Ç‹×õ·øÐ)oͶ(å^×MM˜òA‚ˆ¢ƒ’ÐYˆï&×5ì#7î[õ´xðÖÝù‡ïÞÐzêŸ&l 0w¾ÜxãÞ¦å QÍ,|ª{úcsâsøæ!<€[ÚªD¼ÖÚâzØ£ M"À¸?*l™‘É7Wi¹· T…»ù?ý­1ÕÃÿâù¦x?Þ\/gg–fZÝgIWÈ›½> =»Â”0L2Ò~iÉ™«oɇ‘M:~ë­üÄWXëyÉëí¼ €Vàþ¥¹æ íè¨!ë%}&Ãtz„S{<7 <´†€Õ‹xM8dA[V%À‡ÒQ„9oQ»©6Yú¢J°„6G¢&«<Ò6Œé˜$8?ïqFjˆFhðh>61Ä.©P›yÖÞ  Z‡­ Tý|­¨H«Àk¯í@!y MS´mµ.Þ{_nÞ9³gï•ïvþhÈØ÷üìÂwû‹_ÙA&gÄhc+cClÌ'zêöî=¾Ò•ûÜž/€\Œë¯ä6_Œ}pØ}‘¦_ŒÙ*:a¬ ª›e£Ú2cÔH-ÔSqræ¦>6·ö^ód§¡J –õyÌ!5LQP¯Ó#¹ˆô¢š¦5GŽûÐoŸ½°-¿xö»ŽZ/ïçW?ü•}ù@78T™yŠñU‹&XBSkœb⢺} !Z TW˜AœWƒCáÉðaC&žÃÄ |Û¨ˆ{Õ-<Ùhl¥x jýß㉈;F6;‘#¦ä &ð–}×{yÁvÇÂÅÎ-×W)e©Ö~R}áñ×V6}cu„ÂCOÝø·fî奷Þ,Å× šÂdz(efE,@ JYIÁ”²ón -f©u¹àݸÖqêü½ÿí›eæþó[¢2ÞXæùNÛÆYÏ„kpyfGã"µO4˜LëCtøEÏÕ뛕 ѯ˜ÚãÖ¢þXUÝäNoöF»z=ÕÝ»ZMÏÿ§ š6Z`(Ä´e !L$@I­M*¡Ïb“™ ësi¶¦Óâ٠֬̆Á 镞 †qMÅõȃˆ3+±áR[›õ¶¡PNyqµ šˆscºóêWfœ-<.±Q1kU ¼N"lC¯ÂM[tÈ=^ÇgWÏÿäÃcŸ°žlõÃ;/\EþrGêA vªÂV#Vk÷ü®¯âß±£¢¸pÞÙ mv€þUÞ^-G’Ní’AÔ÷‡† #à@&§;½çó •øóxQWùÍw°ãˆc|b{'¹Å5yäCð+drpJÓ™º!OÞàè&ˆd·½IÕÃþÊÉê£òÔäw¾<+~xçõ÷~aÇ¢Æ23ŒÌâ=O1Ö)Ü¢"à)RZmOcâ ¡=†BŸ!à ƒ›Ëy 'Ä XVά0e¬3׳§š:ZßÞŽ¯×ÅÄ~~ ?.¼•xJX#Œxo~»2¥ÐA>-ÓÙ¡N»v5å^úò™3•k 7„Øõ;­¿Wé¹ßûæ}RôPšC2á3OËuƒ~“„jŸza¾?Ê´]¯zZ./½øª’¿üÆØ;ÿì ñ¾Þe¹™NÆ6mŽ&y4§ü®w•Ÿ˜‹Š4b"6ÖPók]1¾>PW›~BÍ”âúÂÏä«Ûƒ¬£ u^¼½¹3whëØ˜m8IW¬ÏuM[°¶É…‹¯©Nf?é“+eFـȗj˜g2Û4J¤™/ApUf´ô^38„,ŠÔHìÁDÆC@a¸D£_³gKOÉžØõDÌY«ÓmyÈ&P´Z€öQŒ±¯B‡;7QÏLË”MÀ‘  î¾;s¸ü†ÿâ&ÍÖ¾uàÑŸ^6/>iØkˆÀÜõ®U8ÊùlË+ÿêÎò?´÷o_¼oÚVµÙ5¬·t÷x; l’ªBÊ¢ã³ÀZ‘@Ihs•ayrªau"x{˜=“ÝyîD'Sc(AØÃŠm*ÎTP Èâq¦“²œSÈ3Áð±;=OG/õm^vÅ÷®YyæcFitïG÷žx±Û4–£¶‹@$‰I¦A\‹ÆÓÖõ_›°¤RUÁéµbN’–èKkõž×Þчöª¿½ÐÍbжâÁ>„8<¤¢‚Ò|zT¹v 1]¿EÞ[{lã²9^œu5à$I™‰Y;_ÏßÞH±éX‡´c÷ÝïXú“ÆOßñBSÂ皌ÆDaÛLõÌ P¨‡òDU&“ñß+ÚcÏhî•Kèî)®8O*êËêþ_üŸ½†ÛòO¾¼(NŠþưÙí´š¦^$þ o\>za,–ˆAƨPJä¤Oz-r¿ª\%ÑCƒx%Ö¢Ñ4 ͽ 8M·P£¾È¯ôvöF¬‡£†#Д50j@´Iùˆuˆ¨øû FëpHg¤€º¢ò5!±g¤ÐRÜfI*ÎÛl ‡ÞÁº±:|¨”ÄáÉÒñ}Q"“W”«Dæb„Qâ‘FRžÙæ‚hdÕncE¹n{½± tZ“«‰ÈÛ&Úðe¬c«Ñí³ÇvŸÿ»…´Å3eïý쓳;˜ûú΀A €MÕ•Ä´ï1ñfå-<9ãd|mõÞm¶Tó­Yn¯ëìpKÆlH l˜ Ñë†#2Ê̆e«x*/šÜ""£¾œR/çÏò‘må«x¬ÝIªÞ ˜HŽ&ë ¢fRï…7kò¤r o€Ù¿àªÎŽÓsÛ®Þ-Ýõï{j|qoUÊêíŒ^<¾”±5¤DVÉ6ár¨³B©ž/Æ#;>!i%œð î@l¶ÒÙ¥, ¤J}¸,9,1TUDª_•çáïÛ%ˆ?jec~ ±Âf<0D[RÓ­S,ÎŽ_ëg•£™#gGÝcw¯h=¤‹·”‚`^8òÚZU6ú%UÎ:#F¾{‹³Ïí½ú­ÑÄQ7â×ñÌ¡åŒMöžZ ÈvnK3™ÅÌ´Ç×÷ÀU~ðí5È}ëOÿ½­ä+7X]“ÆL7ب›kmwêÀà wË8¤Lê~ÝŠ=õÑØU©‡ŠŽªG§õÇà!ðê뢬c(3·?h/ß)Õ>;CÎQJ†˜½Ó[Ç¡Óf*½e‘`6HÉ´{ä°Æ0©g‰$n“q6븥¤4„/ ©B=¬ JÉr޹-à”: ϲì器fã4pèI²ÖH%f¶Öf ªÖšœoÂ÷óÕ µTTž£Ùë$U5³÷£¨ÃÕ ý§—¾}îøg-S}cðÒ¹WðÐ:†-å9‘ÙUßÈ/µ•øÕ]'ݪܾV– ²½%†ײ%Óe3ÁÈ‘yõ^Æ}H7KÓR&Ž;å^cƒå( JåËWÐþÎ]Ú{¸Û0̃b…@^`ë]™„±NÃtej"UúAo>?s)ÃÃæôᙾ¬Þ|UÜòW·‰øµ~Ðø÷÷ÍÁ]êá¢U±$JOäîPâ~E©ƒ&2¥œXåð$ðèCÃÌöz‘"lcPúÀ¡(R>}FŸèúâÞËŠÄDNÓ¨ø·xe_yÅHAKœv㓤=ðÎùse6Vìk~Píl]'”Ú:N Ã_:wfPäeO ›¦Û~êñØ þòªÔˆ^ֿШïHáÔÉ"49#„:°9V[Y¶³ ·WpÈ¬ß U'ÞëøGÿåͬjü£?Û ñåæú¦éÎÍv†ØX®g ¼ew½Ox´i˜(™Ù€?vLxóÕMçêZ¥¬*¥ ñø™tÒµ¹þ˜‰ ù¡òÜæÖQ_ô¡G2f‰c’$¬Dâ|!>Dr£…J *¦yÌ:µÈZâ:6L‘¨?GÍ&ôœVAc]Qæ{#W2•’ ñN‘H(wCÀì@q²&¹D#" ZUbYæÆ’ãUÍ!Ù¬hÕÅ·*Q$à´…ÔXÓDoAË‚¡ª^Ä V~ÓÝ?þ×xá¸@íð/w<ùã›ö3Ï’€@¶c‹¶r†GŸTÉ®¿›kùŠ®Üôo^0Jêw,ªû´eu9¬pähŠ3KÙ'"k°( TĹ«žûË fuâðÛU~l©÷NãÙV®LJ±ò J¶:*õ”’8-í&¦ÎðÎP,Ûåpµyâîí£zÖÃËðo.Yÿè'ZB~ヷ濶F-§È ®í^œ<ê0´%Œ{X®Yé’@$ UÜÞo@ÄìU¡°bâ Yâw£Þ9)ÞÕ]‡}ygnÖêjÁ‡ÉPMeQ‘¢P‘ù,„ü¢N…HWÔ{“?Sœ§Ç݇.H„ë7YA¤Ý?Õ7û#˜ž1%öï ÍÜŸ,¾ùº2MåôFþNÅsDëÁÀ¼…PÄÏ/­Œ8ægîŽe§\ÆÇPÔÝè×ÿíå†èKÿéþÌ{o®ÉL·Óʳ‚Œt]&¾sçøÅ‚íÆÔX¹ê~!ó8õ~)"©ò’Úëõägr'ÔûhÆ(ô»žDòñ¹|i ’z‰ÁÆ`Zt<ñú!¹¨@bqt¾;Ômfè ˜Y±K"q4»­°èƒÆAU¨¶¥ãÒQ¦cG„ð ˜XOýP` âÖ(~¼qiH•“+"È$È4ò¼ÕV`SU,›ÍᦀʢŒéÆ ¸œ'"UÛÔ~k¥¦T#ß»zöÈ¡‹?Þòå­jHßùùïÎ|¿˜ýê®`5DÞ‚³c¦ù—²JýÏW·=J›tÿz¿y†¨jÍóêªló;mbrƒ˜‚Ë–´ØðÌÚÌã¿R0ÝÚl¸Ö_¢ÀVïeãW´ëpõ›Õ£Û»DÆÔבÆ4$T•W§)ƒÓd¤¶OªRŽ]Ÿ=|ÕX¹îE*wç%›Ï‡«ë?ûðè·µÁ)‹*i˜Dî&1·0ADуÉ6^'©"¢ªëCKÓ]Û>gD.ì”È?ù‰`‡ÆëëÙïX Æ;B¾Wø1$Žm™“ðÁ0WŽØw›Ì·4i\){þjœ˜öñ«×õÏU¢˘8Êh|áð›÷ÇeÖ/™`[ wË›—Ž­}s5à3jû_RÓÓÄ)›fÛ„‰n/-¤ƒ]g—Y·JÏ<³'»¤­CîB¥ê½q¯•VoýWïd OüçOåPWû£™îL»ÑˆöÀPÀ _;°vK–NpP ‡SæÅ#%÷_[u* ‰3 ɬ?ñäO§À~ÆGe%kó‹kË£uö»YŽ(fª¨)¬½¦LB‰FE‰iJS† ;1¨å ² ºIft¬æ …læ}eäœcà…s[ÑÄ„”Fa½é¥ïB³RßDÐýX­h-}U¯Ä â¬9·Ý*°fD·Znêz¿$î|dW×Ï®mk/ÃÕqàÃ‘Š–÷Ïû#3?¸øè 9™Ü}¯xéòxè‹]µ†˜-åFiÍÓû½·×O鳋ƒu¾°RŒ£ëwY‰ÊýKŠ‹n¡¹`Ù°†±Ž*àÅ£*e9Qø IMq3ËuxÃÓ ÕׯgòÛ§;O5³`W¦(ð K0#‰éFñN3ÿ´Éœ¢ß×Y¾`ª­‹§vn=»& ï܇?£jþåêdíÞOWžü½E¬¬õÚ1Ø’¢<ѪÄ5þ¡ˆM¨á*Àê ©ÐŒÜ‘–´bÄÁ%*’š¨èÕ3扮¬îÉ ±  J¹[!v3æ›JÁîîx6¼eçùa£R³mëÅáüîë·ÃUÂ5½Ìüèçß>7®nfµÙLŠÜ~‰¾û‘KahQ3¢SÑ£õ†½–Zʼn§¤Y|(Ùìo@}zÍ­þ¼O-IÖ¢äÐ ¿s…mµê8߸D g†Œç·Hð½ÕÃM©A(`¨„ãA¹Aä“(‘¦"Ž1sf9ߛטÖlºyð% ]\j5lQxb‹"î˜iâŠAê‡CµQ‰kÄ·^+'I{­éËWʬµKù5öÍYUv8®ˆG¥F&8ITx1YÛòeKÖƒÂ[ÞUƒîxtý[ú¹Ãž™ïÿ?{ÿâ6¿øTÎlLÖÎì0ÓÜ'ÿVoë£´ÑØ¸Ø«ró<ùµ¥ƒÆÞgMÛaÄD±ž$nP‚`²À°`RÀ§ÆhÙd)¹Z"ô—NÓ±åk£GçÚŒ0ž¥°X›g‘8¢ç—Ê4 vNOk­dRÒCÙ.º3ùâˆD¤(úÿzø 3 ß¿úíò÷ŸYȈC‘jØœÆÙséø)d䃠QŠ}©¬º4ØÜ@„£i)’Ö¨¶ªz'îu,œÐr¥=ôn“Û „™ ¯Q!€­ÁåAJbœä{eVïùƒÝs½X úôþ2c˰þÛÑHx³P¨áÎá¶TÔì|~Ç™–uÛdåfToÿ'‚¤|ªKæÐú¡±g}ì²±7¶ .ø¥…Þ Ã8s¾ºö?ÿذÛÿÏ^hçýp£È;Ýv3ês&%f¶+·¾4Ö“Û³àÕR"†}i¯ã{¿Ø²r¬ÀIÁ§ ë­cÖB˜®®<´—©*¿²²T\RÙñL#\Zµ09;8¦Cœ)•Áó¥uݵ˜D VeÊsJ!,5ÌY[²6@Ô7Tˆ!UÍ͸t7¼õH0ƒ©¤%rÃ!; !Re&ý– LOºi4²î‚€Š‘ÑÅ\ µBƒ Hât<Ô'á™i4iJ?¦O‹¨÷ºùÑ•}[ß{ué‹ žˆßúÙ æÅ——…1 ¥ÂŒßëÔ\ø­}z¡™3÷†ýһѹŠ@wF‡xuÍ.b1ÞÙ"õž„Tûl#ä˜AÕ‹^Ðvo»ÀÛDU½T¾|C:OÓ¥sÛO¶ƒ,Ô„À2%9lžÔ-f=;`vZÝôzâÖà‘ÞG^DÅ;믌çžË½mÞøIû+‡æ[6T›!šâÚ/µÃÌaÌĹV”Éþ(¡c×ñ}&FËW5,@f¡!Ù4á‡Â7é½ÕËžmÈšÛM$:“$‡H6d€Xµy^ˆr‹Z“@ 7×Ô9¦£ã x\Oˆð¿ÉT¯õµÅ_ŒGÞô b˜†ÙuŒŸ?óÉþ¿»^¯µS@jÈ`Œ—l ¡ŸŠShÂqZÄLèì¹í˜+Ï-Þ_ÓåöÍ{*Pñ*âU½ˆ¯ªKÿêo=ûÿãß›5^Ý`m”µfç[¹abŽ2/S¼sâò-;Öd0±1LŒŸ÷Ðׯ:ï$˜¼£8.L©NÐÚFÄ baAWFÙ¶5šU—éÀ¥>áwvZ˜â°–UÒZa%š¨ Œ<éTLúZ”ÓnÈšØÁ Œ‚®§¦*00Îy6FHmËn޼FY("­! 6Cô«–#òB™¸’9ðÅÔ»Ú£L“ì¾<ËçgxÃÛT¹ºcÜ*À⤎®Ð¤Ð»äyÕ0¹¾Þ½ñê):ÑüÖÍ'?ÍbH¿S}úÜ+xäå6³å¤i˃/¨Âÿýæ®gý îï¼8çnßÅõå]ÍÑu³\m§@Ê50CU¤0m­}ª7‡ÕÝ]‚!"á›UñxwO,ô^·ÏÎ4Ku~ +TÇ.0‘T¹ÖÉ…Ò”§eA ¢ø›$ÛÜsÅTóζ^½D*Þ©÷î½ï“ÚÏQï6ï½þÊÖ—÷6È0žÐÇ4 ˆ¾ •¸ÖñT„$#""/kû7—£ÃYÏÑò›–ü]{“O,£ØØÞLÍ(O{ò‚ÚADÅ ð\0)RÜñzÍ™b»\^mÛ8/ ‘ E2 O|úW·7‹aˆ³|á¹¹‘*~™_{ÅëT@×SQ&ìîI`i )'¶À4ˆÇìÅʸӫ µ÷u®©>d®÷·¶Aâ¢â¥Zù_¾)y¹åŸ~}‰¼/†›hÍtÛ¹‰0:f…¾½µyÝàDË0“1ÌZ_k;¾ûæ¦+½ˆ2‰ÄZk2ÿTÇ2¥Ì$AÏí 7¿Çs&¼¶ºÇžS,½˜±‰è%ªõ])ÿ„C–¢X•sí;1¹# €ó´ƒ÷JL¦É†’jâ…ÈúJs3®àEjýQ,7Âéý@ÅIÓWpyäÆ1Ø&Ì^C†¹‘Ïe¬äÚ™WÕq‘VJ˜ÒùÐåǞï‡MÓ–ºÁ‘èøjtûÌžGÖ¿ÙüâÃDLëõð±ŸÜ¶/>«di†¸éÆÏ.:åkgÇÏ,ÃÖ鵑‚/Öo°Rëªìoø³4‡-lØ„QQ¢9xHÈdkd5;ÁëÚZÎÍ9!’œ˜”Eœ®½‡ûÓ÷÷ïkƒ%£@ùcèM Ëñ)@£\¥TU‰6¿¼åän_¸ÚSQO¤®*ønŽ_Y ?úåù'¿º£kC`M°NFHÓw¾Ö±)$ŒÀS\‰« c‹ûÍ%U¯UÌÁr3ù‰w¿ðK'+¹9?g™ÈLëq•dÚ{딈fˆ¬¤F"$æîÜöÆiµoáÃryùÂZÄ(€X&=ðOΟ$k1Û8vdôÛxbßíïl†àæ)–Æ÷Ù¦$ÇñÕe2œÅ¯V ¶È3n1ü¦oŠ2‘¢a¥ðªFœ!_'#©5$hÉ}æŠsêgešrdSÉ,¡ŒxÞ¨úÍ–ÌfDº)¦WŒ• ÑJÓ½îïÈP7wm¥5lM¼³ÅÊ·O.¿ýÆ–?^ð¢æ­Ÿ~rËws_Úæ9£y±õ1@F7^|Ú¬Ú•ÓkΫ¸ÊÉ]°.®Ü<ºË\ÃL>Û4&’JJ Qñ®$© “QQônÙöð`¤Í#ä;B ÷³aãÙüþ«­ßmR¸À²MY„E(ñi¦a‰ŸÒ!,4çÆ«JGú7»ÓÄ{%W­ý_k¦8ú™–°ï­}kýÉ/mo³a’â;š¤¥ÁÆŽh‚ 2Ïxê6U¡ž©z2ã×ÜaC&©ˆ¼÷qA! ˜…ˆ¹pÕ>Ÿc]wgV‘x§Â2¢¨\8šgÀ˜°‰[È“«7KàǪ÷q²qº `ñ©ò ZøóὡØ^‘p£}ð3øû_áÿàB ¹‘éw_“š¾¦ë4¥7…އg ´Ž¯” ™ÆžÁ‡ÜØã.HÒO/T¡c×ÿ›ÙË$ûÊŸàJ\¹¾:jµf:¹)ˆ›†iýÔc×W°xˆ 3Ãvæ«­*»üÆÐU1 $ÖdÁ צÃÕ(K*08‡Úò·üÂvcÔØ‹lŸ;/ØúÅŒÀÑ?¦SnÐTÝ) 0mhiSv(§w àJ¤ÐVNI¡ÂÌ »¥Ûê@I«1ÕxñPmlVÞæRz'Sßrì]"Æ­CXxê5]âB“ÚPÚUn¶l{ÄeÉ´¯² ^6•‹²â)‚9ƒX¸ÅnåfIaK‹âî»úXã/n=õbže,ß½xñU9òÙ®±[+ž¡Ç¼6Þûˆ^˜Ýjºß/E¼óUqs,ê‡í#­{ëYW¡ds÷ ¢BÙ&h2CUV\¤ÙÕ=IR¯¤âù+´ÿ°¼³vdKÓØ)Ø Âô†<ÁTÏû§òôĬ*˜Ù¹âµyèúÆÃs ˆzxïoüßÎÈ>Ç¢EïÎw{Ÿüäbƒ “šzÓ§5 ÉþQª·PR‰ÀœT/‹ú¡’’mK¯À’4lü aF4e¹U¯«ïÐÃ;ÝøÆî&ñD”Œu/t¤DX æX %*³fÝ£Wï;sxåº=::S…Ê;%ö0ìŸûéú¨ÌË! ‘Á̧–ÞÿwëhûÞª¨äIJdz‘üÆéøÁ´ûj²bê=Ù¥Jë*ÒÖüöÁ ïXÞ¸ÈþÁ]¢¤"ð2üÑ}#¯ªOý‹“MöE±Ùæv;´Ü!ÿÛ¹åÓlŸÎ˜aŒQóÂ1Ïã_^§©ŽD´8éK-q]ÃS˜²Ï•3Þ¶VïÛ½ÃrõzïÄÒçÅ`ÕØ;DÝ'ØeÉ¡eÂF P´ªpêÛ‰¹™5ixö™ò9ʺ€òPPø˜uÁ|¿ª*bçR‡9aLÖŽF .5g±ͺ“÷€¤Õ>13ÙfcqF@ëbÛ]%÷YV½7ð^d’ã‚:‹‘›î|Lýõ…f­GuDXܹ‰RéÉtŠPJd°{þâ¸]oÛu~cþнk‰SœRŒùc/¾~cXeÒW1¦yòhï¯îÂ3»¿ë‘(à•cÌé_§¦*µÞ6¦‚ µÉÇ´G6 +B”-,ÞÛðš+ëÓÊ¢¨a/Þ•oüg›T=úŸýN‹}U û£¼3ßiç™aÞ&`óañÐ;^-c 3-‘9÷뉗8_–©Œ†ˆ) §ï_ð)³Ýòr1»Ý4ÖÝùÍŽ½¿*Ðxyž(3f:òg²ø %U²1…S£’xIP$‡Ü0áhb…Šaæ–pCØôe_<ˆŒáv³/™Ž!¾^XCi2ˆUUÈHŒcÙ°És숢aTšÒZj-e Y#šk€°¹™UP¹ œ“?¯mŒ2ÜI‘Qó³à6Þ[?¾ôë×·¼<cø7o|ªýãÞÜwå³N; zÿ*?¹PnÌ\\ÐÏ äåüÌþü¶Ë&Z7#ýJ”n$DÈ)Ð=Â_ysØqmv2| ¯‚wôö=¶½ÿëêÉ™6‡·1вMÒ²I2í4§¯q•”Nœt˜2³Á®ê6¹CùÙCöô( UD\U­}ç´åÝ´UÈ ï¾ÑüÒñ9…áàžAv€H™I¹ylŸ†%¹ŸD ãE4¿ÞšËPøÈ'!Wx^%âõÂEz´Uõ{Ë91áîfÌ(%6{¯h5(m:ˆ‡û·œ)€Cí3Õ¾mçïÄ}Úäɾ|ýÔh(¶?&À˜|ßóöû§}nƒ›n Iý¸bI.è`šÔ$‹ªO„pñÛÀ¸µ pcK~zló¹á$"e" Rç}qî¿y;ãêà?ÿt›Õ»þúfÞm·[ÖŸÌ-Ñæ™‡n­úmg6c†ùÌo?ZõΉ$ÂeLåâôÍ#Eú!4èP—ÛXÙ\Þ½µBûš¤Æ~¹úðêoX¼abËÔ0.™g‰A¤&‡ˆÓÉq˜& ‡H ƒ¡.|×ÌÚÈL+Wõ2v“!¥Œy8ô”µœ¯SƒŸ8Ü[ap竱7^²¶ÏJÃá˜mdáwÊL0‘²™±Í­ª›Í@¡j7úŽy\8‰ebP¶Å3ÃRe[7‡Šút0‹øÞúÛ­ÇòïÝzâEˆ±Õߌ?}ýÚ÷‡Ë3ÆÌ4[{ÝoùÝ¢÷Î{ïEt8VÐC Ç:Wý¬Ÿë…ºi½AäÆ`Ö&¾D±~y±;: ³.xÑ[´õ¤^¾´ëDËRÚ©’’m0”$ì³z0qnÔ–œš7 ¡Ç®U‚c+W/O; x'**rï¯×úšß_ÿŻۿzx)‹Ü4¤öùç S$îÇáî™èº¼zÇDÍBîš}Au ‚+i)B¼­O£·äЭnn '˜' ·ôd “¯Ðv3·8,(Í“wû,žùDuVãÜÐK½t±™ûg^Y:;gÙÜ'÷¼óƒ’ºVUœ—£Ka,iŽI¸h2þèdÊ*¡âN`>¢ÆÎëß(Qv@.A÷û .Rû¥†Š*¾ªŠþå+dËÿôó[Xõ6ªÙÅn'Ïø‰Yû·w·/döxf¬±´÷¡æÝÆ•sÁÿ¾Á´ù«­@iâ­’`} LfLCÁXëë|~¹\ÚeÕ{{÷í¥oßFë ˉ Y;ˆÒ! ”&#)À)ly2•MÊp6OÃ辞kpÓ‚Tz4òá¦%j›Îkƒ‡uÒ¢êÄQeH¢ÃŠXLWLUfá0ïÌs°©0“ŒeY«»BUeí9…–ƒ¼qß9'1"•Š1ÕÍ6æµhhá¹mG –ôνsàø­¿i|f›•³ÿÉ×ïÚçžšáV®PûÆe|j®w{þ£{cç½õä}¹ÁÐ-6Îï|¸¿Þž§¥Œ˜LÔsÄGÅ „+)ýÞ¤™ñ¡ÜÖ9Á´àà—¥}º1|Õ|¶EaE®ŽPbë°kªs,¦¤ 5dóƒ ݇›¾u9)†Ã—ëG§¾MðŒõ2Þ\ùÛ«ÿxוּÖÀÆ@S[c©!u$—Ö8ЃԨ‘ƒ fhá*Uj©¬õ5An^ÊtÐBÀi¬Vßìuž&w¯³6‰IˆduX i´Å˜Ä¼–ö]7B3ǯܴONO´ÉP%;úä÷úeK6œ!‚í<ùÔÆ7î ùtîÄXÑš*uo?A«ÖÆ£ºU­óXêõ[8î·/õF–*&íðW0¿­Éǯ"ÞY¢ñ¢ª®ªÜ…ÿæÿìëK,Rý^a›3MÃ{w*³}¯Ú÷êã;Y‰gþqÛgƒŸôœ÷"‘B1»}Jú¯FB¸üƒ‰‹ g0-UÈúF9³|ï:öwLƒ4{ýÖ ýèÞ?hZk!`(˜°ßµª.61‰ûÀ½ äUm›^˜ÍÒ´­cãMß 8!²v}èKcªRá"е†ÕatÐA¥äh¦4Õ0ÿgÖl0#ÈÎbgÌ 5YQ œÌäz=Ë+¥@]üEMÛhg¼ohß#Å^r\¨Hµ~¶rùõßlûòœ€Í¯ùìü‹öK³j ‰½ýk¿íq¹93<Ó)<ª~ŸTÌcöbñ®›ý%%c£©Ua â}Ù«Ê %I˜ˆèEínè˜Èœ”@,¤ôWÏáàáêÃ{{÷´j<¸0a²¢á|I[ªiPÄÖÕÙÖ’=t‹Ç;fÎïÛzzU%LgDœ¨x-~ôšñùWŽ³×ªßûë[O|n¹I† ³ RJƒn™H&»iÝA`+0+ N¼ ¥0 ?ºº·Q+¹HÔ½{àš@!â=]»hžíøþpO«¾X¸vßQ’;“ŠB²V€Àœ\›±˜½ógŠîÛ—cלŸüÚ/ÏŒª k>#ØFc× üý'SuÈ9þYè4åTuRF¥„šb¥ 3†j0“9¦÷‹l¬¦»mã¦Û¹´ysr€ª†¯?™EÕ‹Þý?þMÙ,š_þ³ýLêÆ½q»=ÓåÅ`íò±Û«²}O3·üôs^õ7çG"^‘uJØš¼ÕÉVT…m£›Û–<*t,¡ˆ³íÆÐUlŒçh±NT•Pµ¤Ä,—d=5=d`búãŒ5©0×"7¶«bÅÚ9‚Ò°Áš§ð†”ËI>xÃW­°N#”TÅûѽ×ùÙæ77žûCË€ûÞæs—Þ’™ÎlF^éíûùÇ—†›ÝS+…zQ2œ‚ ûwÞ¹°cî–=0€“Š`ìhdV¢»Ò{È•jvs~>˜=âØKEDœßü9²çÌúígšè½`&ÊTx«*DÝi­ëTãâ87àäNŒï;}jíü#Ù©"¼tW<Þ½o^nº_YUýû÷¿½ñ ;Ú†Œ ÄIûØQ#¤Ó)i¦–í’X€…Ìȵí[šQ àIØFoQýžIøßèUì:"ãû í4QJפæë(¯c"ÛŒyi&¶¶ýìµMæŠíqyOµ§7’¿T¡Ä´÷?º|j0òfm&¶fþ3»O}·”å/uJŒ8g¥I¾]ºhBFX®ÕœMèÔ¬6s‚̾;£q«ïÁmÍó%íiܺ§N¹ƒÖ>~U¥kñ¿Ž[>÷ç®,G=×]èüÿlƒ+‘©ÖIEND®B`‚compiz-0.9.11+14.04.20140409/plugins/reflex/CMakeLists.txt0000644000015301777760000000015312321343002023177 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (reflex PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/reflex/src/0000755000015301777760000000000012321344021021231 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/reflex/src/reflex.h0000644000015301777760000000450312321343002022667 0ustar pbusernogroup00000000000000/* * Compiz reflection effect plugin * * reflex.h * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include "reflex_options.h" class ReflexFunction { public: GLFragment::FunctionId handle; int target; int param; int unit; }; class ReflexScreen : public PluginClassHandler , public ScreenInterface, public ReflexOptions { public: ReflexScreen (CompScreen *); ~ReflexScreen (); CompositeScreen *cScreen; GLScreen *gScreen; bool imageLoaded; GLTexture::List image; unsigned int width; unsigned int height; std::list reflexFunctions; void matchExpHandlerChanged (); void matchPropertyChanged (CompWindow *window); GLFragment::FunctionId getReflexFragmentFunction (GLTexture *texture, int param, int unit); void optionChanged (CompOption *opt, ReflexOptions::Options num); void destroyFragmentFunctions (); }; #define REFLEX_SCREEN(s) \ ReflexScreen *rs = ReflexScreen::get (s) class ReflexWindow : public PluginClassHandler , public GLWindowInterface { public: ReflexWindow (CompWindow *); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool active; void glDrawTexture (GLTexture *texture, GLFragment::Attrib &, unsigned int); void updateMatch (); }; #define REFLEX_WINDOW(w) \ ReflexWindow *rw = ReflexWindow::get (w) class ReflexPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/reflex/src/reflex.cpp0000644000015301777760000002016012321343002023217 0ustar pbusernogroup00000000000000/* * Compiz reflection effect plugin * * reflex.cpp * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "reflex.h" COMPIZ_PLUGIN_20090315 (reflex, ReflexPluginVTable); GLFragment::FunctionId ReflexScreen::getReflexFragmentFunction (GLTexture *texture, int param, int unit) { GLFragment::FunctionData *data; int target; ReflexFunction *function; CompString targetString; if (texture->target () == GL_TEXTURE_2D) target = COMP_FETCH_TARGET_2D; else target = COMP_FETCH_TARGET_RECT; foreach (GLTexture *tex, image) { if (tex->target () == GL_TEXTURE_2D) targetString = CompString ("2D"); else targetString = CompString ("RECT"); } /* Do we already have a function for this? */ foreach (ReflexFunction *f, reflexFunctions) { if (f->param == param && f->target == target && f->unit == unit) return f->handle; } data = new GLFragment::FunctionData (); if (data) { GLFragment::FunctionId handle = 0; char str[1024]; data->addTempHeaderOp ("image"); data->addTempHeaderOp ("tmp"); data->addFetchOp ("output", NULL, target); data->addColorOp ("output", "output"); snprintf (str, 1024, "MAD tmp, fragment.position, program.env[%d]," " program.env[%d];", param, param + 1); data->addDataOp (str); snprintf (str, 1024, "TEX image, tmp, texture[%d], %s;", unit, targetString.c_str ()); data->addDataOp (str); snprintf (str, 1024, "MUL_SAT tmp, output.a, program.env[%d].b;" "MAD image, -output.a, image, image;" "MAD output, image, tmp.a, output;", param + 1); data->addDataOp (str); if (!data->status ()) { delete data; return 0; } function = new ReflexFunction (); if (function) { handle = data->createFragmentFunction ("reflex"); function->handle = handle; function->target = target; function->param = param; function->unit = unit; reflexFunctions.push_back (function); } delete data; return handle; } return 0; } void ReflexWindow::updateMatch () { bool f_active; REFLEX_SCREEN (screen); f_active = rs->optionGetMatch ().evaluate (window); if (f_active != active) { active = f_active; if (active) gWindow->glDrawTextureSetEnabled (this, true); else gWindow->glDrawTextureSetEnabled (this, false); cWindow->addDamage (); } } void ReflexScreen::optionChanged (CompOption *opt, ReflexOptions::Options num) { CompString pname ("reflex"); switch (num) { case ReflexOptions::File: { CompSize size; CompString string (optionGetFile ()); if (imageLoaded) { image.clear (); } image = GLTexture::readImageToTexture (string, pname, size); imageLoaded = image.size (); width = size.width (); height = size.height (); cScreen->damageScreen (); } break; case ReflexOptions::Match: foreach (CompWindow *w, screen->windows ()) { REFLEX_WINDOW (w); rw->updateMatch (); } cScreen->damageScreen (); break; case ReflexOptions::Window: case ReflexOptions::Decoration: { bool shouldEnable = (optionGetWindow () || optionGetDecoration ()); foreach (CompWindow *w, screen->windows ()) { REFLEX_WINDOW (w); shouldEnable |= optionGetMatch ().evaluate (w); rw->gWindow->glDrawTextureSetEnabled (rw, shouldEnable); } cScreen->damageScreen (); } default: /* FIXME: this isn't right.... */ cScreen->damageScreen (); break; } } void ReflexWindow::glDrawTexture (GLTexture *texture, GLFragment::Attrib &attrib, unsigned int mask) { REFLEX_SCREEN (screen); bool enabled; bool windowTexture = false; foreach (GLTexture *tex, gWindow->textures ()) { if (tex == texture) windowTexture = true; } enabled = windowTexture ? rs->optionGetWindow () : rs->optionGetDecoration (); if (enabled && active && rs->imageLoaded && GL::fragmentProgram) { GLFragment::Attrib fa = attrib; int function; int unit = 0; int param; float tx = 0.0f, ty = 0.0f, dx = 0.0f, mx = 0.0f; if (rs->optionGetMoving ()) { mx = window->x () + (window->width () / 2); mx /= screen->width () / 2.0; mx -= 1.0; mx *= -0.065; } else mx = 0.0; foreach (GLTexture *tex, rs->image) { if (tex->target () == GL_TEXTURE_2D) { tx = 1.0 / screen->width (); ty = 1.0 / screen->height (); dx = mx; } else { tx = 1.0f / screen->width () * rs->width; ty = 1.0f / screen->height () * rs->height; dx = mx * rs->width; } } unit = fa.allocTextureUnits (1); param = fa.allocParameters (2); function = rs->getReflexFragmentFunction (texture, param, unit); if (function) { fa.addFunction (function); GL::activeTexture (GL_TEXTURE0_ARB + unit); foreach (GLTexture *tex, rs->image) { tex->enable (GLTexture::Good); GL::activeTexture (GL_TEXTURE0_ARB); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, param, tx, ty, 0.0f, 0.0f); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, param + 1, dx, 0.0f, rs->optionGetThreshold (), 0.0f); tex->disable (); } } gWindow->glDrawTexture (texture, fa, mask); if (unit) { GL::activeTexture (GL_TEXTURE0_ARB + unit); foreach (GLTexture *tex, rs->image) tex->disable (); GL::activeTexture (GL_TEXTURE0_ARB); } } else { gWindow->glDrawTexture (texture, attrib, mask); } } void ReflexScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); foreach (CompWindow *w, screen->windows ()) { REFLEX_WINDOW (w); rw->updateMatch (); } } void ReflexScreen::matchPropertyChanged (CompWindow *w) { REFLEX_WINDOW (w); rw->updateMatch (); screen->matchPropertyChanged (w); } void ReflexScreen::destroyFragmentFunctions () { while (!reflexFunctions.empty ()) { ReflexFunction *func = reflexFunctions.front (); GLFragment::destroyFragmentFunction (func->handle); reflexFunctions.remove (func); } } ReflexScreen::ReflexScreen (CompScreen *) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), imageLoaded (false), width (0), height (0) { CompSize size; CompString string (optionGetFile ()); CompString pname ("reflex"); image = GLTexture::readImageToTexture (string, pname, size); imageLoaded = image.size (); width = size.width (); height = size.height (); optionSetFileNotify (boost::bind (&ReflexScreen::optionChanged, this, _1, _2)); optionSetMatchNotify (boost::bind (&ReflexScreen::optionChanged, this, _1, _2)); } ReflexScreen::~ReflexScreen () { if (reflexFunctions.size ()) destroyFragmentFunctions (); } ReflexWindow::ReflexWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), active (false) { REFLEX_SCREEN (screen); GLWindowInterface::setHandler (gWindow, false); if (rs->optionGetWindow () || rs->optionGetDecoration ()) gWindow->glDrawTextureSetEnabled (this, true); updateMatch (); } bool ReflexPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/kde/0000755000015301777760000000000012321344021017720 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/kde/kde.xml.in0000644000015301777760000000055612321343002021616 0ustar pbusernogroup00000000000000 <_short>KDE/Qt Event Loop <_long>Integrates the KDE/Qt event loop into Compiz General composite opengl decor compiz-0.9.11+14.04.20140409/plugins/kde/CMakeLists.txt0000644000015301777760000000123012321343002022452 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) find_package (KDE4 4.2) include (CompizPlugin) if (KDE4_FOUND) include(KDE4Defaults) include(MacroLibrary) string (REGEX REPLACE "-fvisibility=hidden" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) string (REGEX REPLACE "-fno-exceptions" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) string (REGEX REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) QT4_AUTOMOC (src/dispatcher.cpp) compiz_plugin (kde LIBRARIES ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBS} LIBDIRS ${KDE4_LIB_DIR} INCDIRS ${KDE4_INCLUDES} ) endif () compiz-0.9.11+14.04.20140409/plugins/kde/src/0000755000015301777760000000000012321344021020507 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/kde/src/dispatcher.h0000644000015301777760000000421512321343002023006 0ustar pbusernogroup00000000000000/* * Copyright (c) 2010 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef DISPATCHER_H_ #define DISPATCHER_H_ #include #include #include #include class TimerObject; class SocketObject; class EventDispatcherCompiz : public QAbstractEventDispatcher { Q_OBJECT public: EventDispatcherCompiz (QObject *parent = 0); virtual ~EventDispatcherCompiz (); virtual void flush (); virtual bool hasPendingEvents (); virtual void interrupt (); virtual bool processEvents (QEventLoop::ProcessEventsFlags flags); virtual void registerSocketNotifier (QSocketNotifier *notifier); virtual void registerTimer (int timerId, int interval, QObject *object); virtual QList registeredTimers (QObject *object) const; virtual void unregisterSocketNotifier (QSocketNotifier *notifier); virtual bool unregisterTimer (int timerId); virtual bool unregisterTimers (QObject *object); virtual void wakeUp (); void startingUp (); void closingDown (); private: void wakeUpEvent (); private: QList mTimers; QList mSockets; QList mDeleteTimers; QList mDeleteSockets; CompWatchFdHandle mX11Handle; CompWatchFdHandle mWakeUpHandle; QList mQueuedEvents; int mWakeUpPipe[2]; CompTimer mEventTimer; }; #endif compiz-0.9.11+14.04.20140409/plugins/kde/src/timer.cpp0000644000015301777760000000312712321343002022334 0ustar pbusernogroup00000000000000/* * Copyright (c) 2010 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "timer.h" #include "boost/bind.hpp" #include #include TimerObject::TimerObject (int timerId, int interval, QObject *object) : mTimerInfo (QAbstractEventDispatcher::TimerInfo (timerId, interval)), mObject (object) { mTimer.start (boost::bind (&TimerObject::execute, this), interval); mEnabled = true; } TimerObject::~TimerObject () { mTimer.stop (); } QAbstractEventDispatcher::TimerInfo TimerObject::timerInfo () const { return mTimerInfo; } QObject * TimerObject::object () const { return mObject; } bool TimerObject::execute () { if (!mEnabled) return false; QTimerEvent event (mTimerInfo.first); QApplication::sendEvent (mObject, &event); return mEnabled; } void TimerObject::disable () { mEnabled = false; mTimer.stop(); };compiz-0.9.11+14.04.20140409/plugins/kde/src/kde.cpp0000644000015301777760000000347012321343002021760 0ustar pbusernogroup00000000000000/* * Copyright (c) 2009 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "kde.h" #include COMPIZ_PLUGIN_20090315 (kde, KdePluginVTable); typedef int (*X11ErrorHandlerProc)(Display *, XErrorEvent *); KdeScreen::KdeScreen (CompScreen *screen) : PluginClassHandler (screen) { mEventDispatcher = new EventDispatcherCompiz (); argv[0] = strdup ("compiz"); argc = 1; KCmdLineArgs::init (argc, argv, "compiz", "compiz", ki18n ("Compiz KDE event loop plugin"), "0.0.1"); // Save the compiz error handler X11ErrorHandlerProc er = XSetErrorHandler(NULL); mApp = new KApplication (); // Restore our error handler XSetErrorHandler(er); } KdeScreen::~KdeScreen () { // Save the compiz error handler X11ErrorHandlerProc er = XSetErrorHandler(NULL); delete mApp; delete mEventDispatcher; // Restore our error handler XSetErrorHandler(er); free (argv[0]); } bool KdePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/kde/src/socket.h0000644000015301777760000000215612321343002022152 0ustar pbusernogroup00000000000000/* * Copyright (c) 2010 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SOCKET_H_ #define SOCKET_H_ #include class QSocketNotifier; class SocketObject { public: SocketObject (QSocketNotifier *notifier); ~SocketObject (); QSocketNotifier *notifier () const; private: void callback (); private: QSocketNotifier *mNotifier; CompWatchFdHandle mHandle; }; #endif compiz-0.9.11+14.04.20140409/plugins/kde/src/socket.cpp0000644000015301777760000000321112321343002022476 0ustar pbusernogroup00000000000000/* * Copyright (c) 2010 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "socket.h" #include #include #include #include SocketObject::SocketObject (QSocketNotifier *notifier) : mNotifier (notifier) { short int mask; switch (notifier->type()) { case QSocketNotifier::Read: mask = POLLIN | POLLPRI | POLLHUP | POLLERR; break; case QSocketNotifier::Write: mask = POLLOUT; break; case QSocketNotifier::Exception: mask = 0; break; default: return; } mHandle = screen->addWatchFd (notifier->socket (), mask, boost::bind (&SocketObject::callback, this)); } SocketObject::~SocketObject () { screen->removeWatchFd (mHandle); } QSocketNotifier * SocketObject::notifier () const { return mNotifier; } void SocketObject::callback () { QEvent event(QEvent::SockAct); QApplication::sendEvent(mNotifier, &event); } compiz-0.9.11+14.04.20140409/plugins/kde/src/kde.h0000644000015301777760000000253612321343002021427 0ustar pbusernogroup00000000000000/* * Copyright (c) 2009 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KDE_H_ #define KDE_H_ #include "dispatcher.h" #include #include #include #include class KdeScreen : public PluginClassHandler { public: KdeScreen (CompScreen *); virtual ~KdeScreen (); void sendGlibNotify (); private: KApplication *mApp; EventDispatcherCompiz *mEventDispatcher; char *argv[1]; int argc; }; class KdePluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; #endif compiz-0.9.11+14.04.20140409/plugins/kde/src/timer.h0000644000015301777760000000252612321343002022003 0ustar pbusernogroup00000000000000/* * Copyright (c) 2010 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef TIMER_H_ #define TIMER_H_ #include #include #include #include class TimerObject { public: TimerObject (int timerId, int interval, QObject *object); ~TimerObject (); QAbstractEventDispatcher::TimerInfo timerInfo () const; QObject *object () const; void disable (); private: bool execute (); private: QAbstractEventDispatcher::TimerInfo mTimerInfo; CompTimer mTimer; QObject *mObject; bool mEnabled; }; #endif compiz-0.9.11+14.04.20140409/plugins/kde/src/dispatcher.cpp0000644000015301777760000001311612321343002023341 0ustar pbusernogroup00000000000000/* * Copyright (c) 2010 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include "dispatcher.h" #include "timer.h" #include "socket.h" #include #include #include "dispatcher.moc" EventDispatcherCompiz::EventDispatcherCompiz (QObject *) { mWakeUpPipe[0] = 0; mWakeUpPipe[1] = 0; mEventTimer.start (boost::bind (&EventDispatcherCompiz::processEvents, this, QEventLoop::AllEvents), 1, MAXSHORT); } EventDispatcherCompiz::~EventDispatcherCompiz () { foreach (TimerObject *timer, mTimers) delete timer; foreach (SocketObject *socket, mSockets) delete socket; } void EventDispatcherCompiz::flush () { XFlush (QX11Info::display()); } bool EventDispatcherCompiz::hasPendingEvents () { extern Q_CORE_EXPORT uint qGlobalPostedEventsCount(); return qGlobalPostedEventsCount() != 0; } void EventDispatcherCompiz::interrupt () { wakeUp (); } bool EventDispatcherCompiz::processEvents (QEventLoop::ProcessEventsFlags flags) { emit awake (); Display *dpy = QX11Info::display(); while (!(flags & QEventLoop::ExcludeUserInputEvents) && !mQueuedEvents.isEmpty()) { // process a pending user input event XEvent event = mQueuedEvents.takeFirst(); // send through event filter if (filterEvent(&event)) continue; if (qApp->x11ProcessEvent(&event) == 1) return true; } while (XPending (dpy)) { XEvent event; // process events from the X server XNextEvent(dpy, &event); if (flags & QEventLoop::ExcludeUserInputEvents) { // queue user input events switch (event.type) { case ButtonPress: case ButtonRelease: case MotionNotify: case XKeyPress: case XKeyRelease: case EnterNotify: case LeaveNotify: mQueuedEvents.append(event); continue; case ClientMessage: // only keep the wm_take_focus // client messages if (event.xclient.format == 32) { if (event.xclient.message_type == Atoms::wmProtocols || (Atom) event.xclient.data.l[0] == Atoms::wmTakeFocus) { break; } } mQueuedEvents.append(event); continue; default: break; } } // send through event filter if (filterEvent(&event)) continue; if (qApp->x11ProcessEvent(&event) == 1) return true; } QApplication::sendPostedEvents(); while (!mDeleteTimers.isEmpty ()) delete mDeleteTimers.takeFirst (); while (!mDeleteSockets.isEmpty ()) delete mDeleteSockets.takeFirst (); return true; } void EventDispatcherCompiz::registerSocketNotifier (QSocketNotifier *notifier) { mSockets.append (new SocketObject (notifier)); } void EventDispatcherCompiz::registerTimer (int timerId, int interval, QObject *object) { TimerObject *timer = new TimerObject (timerId, interval, object); mTimers.append (timer); } QList EventDispatcherCompiz::registeredTimers (QObject *object) const { QList list; foreach (TimerObject *timer, mTimers) if (timer->object () == object) { list.append (timer->timerInfo ()); } return list; } void EventDispatcherCompiz::unregisterSocketNotifier (QSocketNotifier *notifier) { SocketObject *sock = NULL; foreach (SocketObject *socket, mSockets) if (socket->notifier () == notifier) { sock = socket; break; } if (sock) { mSockets.removeAll (sock); mDeleteSockets.append (sock); } } bool EventDispatcherCompiz::unregisterTimer (int timerId) { TimerObject *time = NULL; foreach (TimerObject *timer, mTimers) if (timer->timerInfo ().first == timerId) { time = timer; break; } if (time) { mTimers.removeAll (time); time->disable (); mDeleteTimers.append (time); return true; } return false; } bool EventDispatcherCompiz::unregisterTimers (QObject *object) { QList list; foreach (TimerObject *timer, mTimers) if (timer->object () == object) { list.append (timer); } if (!list.isEmpty ()) { foreach (TimerObject *timer, list) { mTimers.removeAll (timer); timer->disable (); mDeleteTimers.append (timer); } return true; } return false; } void EventDispatcherCompiz::wakeUp () { if (mWakeUpPipe[1]) if (write (mWakeUpPipe[1], "w", 1) <= 0) return; } void EventDispatcherCompiz::startingUp () { if (pipe (mWakeUpPipe) < 0) return; mWakeUpHandle = screen->addWatchFd (mWakeUpPipe [0],POLLIN, boost::bind (&EventDispatcherCompiz::wakeUpEvent, this)); mX11Handle = screen->addWatchFd (ConnectionNumber (QX11Info::display()), POLLIN | POLLHUP | POLLERR, NULL); } void EventDispatcherCompiz::closingDown () { screen->removeWatchFd (mX11Handle); screen->removeWatchFd (mWakeUpPipe[0]); } void EventDispatcherCompiz::wakeUpEvent () { char buf[256]; if (read (mWakeUpPipe[0], buf, 256) <= 0) return; } compiz-0.9.11+14.04.20140409/plugins/scale/0000755000015301777760000000000012321344021020244 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/scale/CMakeLists.txt0000644000015301777760000000015112321343002022777 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(scale PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/scale/src/0000755000015301777760000000000012321344021021033 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/scale/src/privates.h0000644000015301777760000001065312321343002023044 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _SCALE_PRIVATES_H #define _SCALE_PRIVATES_H #include #include "scale_options.h" class SlotArea { public: int nWindows; CompRect workArea; typedef std::vector vector; }; class PrivateScaleScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public ScaleOptions { public: PrivateScaleScreen (CompScreen *); ~PrivateScaleScreen (); void handleEvent (XEvent *event); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void activateEvent (bool activating); void layoutSlotsForArea (const CompRect&, int); void layoutSlots (); void findBestSlots (); bool fillInWindows (); bool layoutThumbs (); bool layoutThumbsAll (); bool layoutThumbsSingle (); SlotArea::vector getSlotAreas (); ScaleWindow * checkForWindowAt (int x, int y); void sendDndStatusMessage (Window); bool actionShouldToggle (CompAction *action, CompAction::State state); static bool scaleTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool scaleInitiate (CompAction *action, CompAction::State state, CompOption::Vector &options, ScaleType type); bool scaleInitiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &options); bool ensureDndRedirectWindow (); bool selectWindowAt (int x, int y, bool moveInputFocus); bool selectWindowAt (int x, int y); void moveFocusWindow (int dx, int dy); void windowRemove (CompWindow *); bool hoverTimeout (); void updateOpacity (); int getMultioutputMode (); public: CompositeScreen *cScreen; GLScreen *gScreen; unsigned int lastActiveNum; Window lastActiveWindow; Window selectedWindow; Window hoveredWindow; Window previousActiveWindow; KeyCode leftKeyCode, rightKeyCode, upKeyCode, downKeyCode; bool grab; CompScreen::GrabHandle grabIndex; Window dndTarget; CompTimer hover; ScaleScreen::State state; int moreAdjust; Cursor cursor; std::vector slots; int nSlots; ScaleScreen::WindowList windows; GLushort opacity; ScaleType type; Window clientLeader; CompMatch match; CompMatch currentMatch; }; class PrivateScaleWindow : public CompositeWindowInterface, public GLWindowInterface { public: PrivateScaleWindow (CompWindow *); ~PrivateScaleWindow (); bool damageRect (bool, const CompRect &); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); bool isNeverScaleWin () const; bool isScaleWin () const; bool adjustScaleVelocity (); static bool compareWindowsDistance (ScaleWindow *, ScaleWindow *); public: CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; ScaleWindow *sWindow; ScaleSlot *slot; int sid; int distance; GLfloat xVelocity, yVelocity, scaleVelocity; GLfloat scale; GLfloat lastTargetScale, lastTargetX, lastTargetY; GLfloat tx, ty; float delta; bool adjust; float lastThumbOpacity; }; #endif compiz-0.9.11+14.04.20140409/plugins/scale/src/scale.cpp0000644000015301777760000013316312321343002022633 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include #include "privates.h" #define EDGE_STATE (CompAction::StateInitEdge) class ScalePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (scale, ScalePluginVTable) static ScaleScreen *sScreen = NULL; static PrivateScaleScreen *spScreen = NULL; bool PrivateScaleWindow::isNeverScaleWin () const { if (window->overrideRedirect ()) return true; if (window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return true; return false; } bool PrivateScaleWindow::isScaleWin () const { if (isNeverScaleWin ()) return false; if (!spScreen->type || spScreen->type == ScaleTypeOutput) { if (!window->focus ()) return false; } if (window->state () & CompWindowStateSkipPagerMask) return false; if (window->state () & CompWindowStateShadedMask) return false; if (!window->mapNum () || !window->isViewable ()) return false; switch (sScreen->priv->type) { case ScaleTypeGroup: if (spScreen->clientLeader != window->clientLeader () && spScreen->clientLeader != window->id ()) return false; break; case ScaleTypeOutput: if ((unsigned int) window->outputDevice () != (unsigned int) screen->currentOutputDev ().id ()) return false; default: break; } if (!spScreen->currentMatch.evaluate (window)) return false; return true; } void PrivateScaleScreen::activateEvent (bool activating) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("active", CompOption::TypeBool)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (activating); screen->handleCompizEvent ("scale", "activate", o); } void ScaleWindowInterface::scalePaintDecoration (const GLWindowPaintAttrib& attrib, const GLMatrix& transform, const CompRegion& region, unsigned int mask) WRAPABLE_DEF (scalePaintDecoration, attrib, transform, region, mask) void ScaleWindow::scalePaintDecoration (const GLWindowPaintAttrib& attrib, const GLMatrix& transform, const CompRegion& region, unsigned int mask) { WRAPABLE_HND_FUNCTN (scalePaintDecoration, attrib, transform, region, mask) if (spScreen->optionGetOverlayIcon () != ScaleOptions::OverlayIconNone) { GLWindowPaintAttrib sAttrib (attrib); GLTexture *icon; icon = priv->gWindow->getIcon (512, 512); if (!icon) icon = spScreen->gScreen->defaultIcon (); if (icon) { float scale; float x, y; int width, height; int scaledWinWidth, scaledWinHeight; scaledWinWidth = priv->window->width () * priv->scale; scaledWinHeight = priv->window->height () * priv->scale; switch (spScreen->optionGetOverlayIcon ()) { case ScaleOptions::OverlayIconNone: case ScaleOptions::OverlayIconEmblem: scale = 1.0f; break; case ScaleOptions::OverlayIconBig: default: sAttrib.opacity /= 3; scale = MIN (((float) scaledWinWidth / icon->width ()), ((float) scaledWinHeight / icon->height ())); break; } width = icon->width () * scale; height = icon->height () * scale; switch (spScreen->optionGetOverlayIcon ()) { case ScaleOptions::OverlayIconNone: case ScaleOptions::OverlayIconEmblem: x = priv->window->x () + scaledWinWidth - icon->width (); y = priv->window->y () + scaledWinHeight - icon->height (); break; case ScaleOptions::OverlayIconBig: default: x = priv->window->x () + scaledWinWidth / 2 - width / 2; y = priv->window->y () + scaledWinHeight / 2 - height / 2; break; } x += priv->tx; y += priv->ty; if (priv->slot) { priv->delta = fabs (priv->slot->x1 () - priv->window->x ()) + fabs (priv->slot->y1 () - priv->window->y ()) + fabs (1.0f - priv->slot->scale) * 500.0f; } if (priv->delta) { float o; float ds; ds = fabs (priv->tx) + fabs (priv->ty) + fabs (1.0f - priv->scale) * 500.0f; if (ds > priv->delta) ds = priv->delta; o = ds / priv->delta; if (priv->slot) { if (o < priv->lastThumbOpacity) o = priv->lastThumbOpacity; } else { if (o > priv->lastThumbOpacity) o = 0.0f; } priv->lastThumbOpacity = o; sAttrib.opacity = sAttrib.opacity * o; } mask |= PAINT_WINDOW_BLEND_MASK; CompRegion iconReg (0, 0, width, height); GLTexture::MatrixList ml (1); ml[0] = icon->matrix (); priv->gWindow->vertexBuffer ()->begin (); if (width && height) priv->gWindow->glAddGeometry (ml, iconReg, iconReg); if (priv->gWindow->vertexBuffer ()->end ()) { GLMatrix wTransform (transform); wTransform.scale (scale, scale, 1.0f); wTransform.translate (x / scale, y / scale, 0.0f); priv->gWindow->glDrawTexture (icon, wTransform, sAttrib, mask); } } } } bool ScaleWindowInterface::setScaledPaintAttributes (GLWindowPaintAttrib& attrib) WRAPABLE_DEF (setScaledPaintAttributes, attrib) bool ScaleWindow::setScaledPaintAttributes (GLWindowPaintAttrib& attrib) { WRAPABLE_HND_FUNCTN_RETURN (bool, setScaledPaintAttributes, attrib) bool drawScaled = false; /* Windows that wouldn't be visible before and after entering * scale mode (because some plugin modified CompWindow::focus) * should be faded in and out */ if (window->state () & CompWindowStateHiddenMask && !window->inShowDesktopMode ()) { GLfloat factor = 0; GLfloat targetX, targetY, targetScale; GLfloat scaleFactor, xFactor, yFactor, divFactor = 3.0f; if (priv->slot) { targetX = priv->slot->x (); targetY = priv->slot->y (); targetScale = priv->slot->scale; } else { targetX = priv->lastTargetX; targetY = priv->lastTargetY; targetScale = priv->lastTargetScale; } /* Don't FDIV0 */ if (targetScale - priv->scale == 0.0f) { divFactor -= 1.0f; scaleFactor = 1.0f; } else scaleFactor = (1.0f - priv->scale) / (1.0f - targetScale); if (targetX - ((float) window->x () + priv->tx) == 0.0f) { divFactor -= 1.0f; xFactor = 1.0f; } else { float distActual = fabsf (window->x () - ((float) window->x () + priv->tx)); float distTarget = fabsf (window->x () - targetX); xFactor = distActual / distTarget; } if (targetY - ((float) window->y () + priv->ty) == 0.0f) { divFactor -= 1.0f; yFactor = 1.0f; } else { float distActual = fabsf (window->y () - ((float) window->y () + priv->ty)); float distTarget = fabsf (window->y () - targetY); yFactor = distActual / distTarget; } if (divFactor) factor = (scaleFactor + xFactor + yFactor) / divFactor; else factor = 1.0f; attrib.opacity *= factor; } if ((priv->adjust || priv->slot) && priv->isScaleWin()) { if (priv->window->id () != spScreen->selectedWindow && spScreen->opacity != OPAQUE && spScreen->state != ScaleScreen::In) { /* modify opacity of windows that are not active */ attrib.opacity = (attrib.opacity * spScreen->opacity) >> 16; } drawScaled = true; } else if (spScreen->state != ScaleScreen::In) { if (spScreen->optionGetDarkenBack ()) { /* modify brightness of the other windows */ attrib.brightness = attrib.brightness / 2; } /* hide windows on the outputs used for scaling that are not in scale mode */ if (!priv->isNeverScaleWin ()) { int moMode, output; moMode = spScreen->getMultioutputMode (); switch (moMode) { case ScaleOptions::MultioutputModeOnCurrentOutputDevice: output = screen->currentOutputDev ().id (); if (priv->window->outputDevice () == output) attrib.opacity = 0; break; default: attrib.opacity = 0; break; } } if (priv->window->id() == spScreen->selectedWindow) spScreen->selectedWindow = 0; if (priv->window->id() == spScreen->hoveredWindow) spScreen->hoveredWindow = 0; } return drawScaled; } bool PrivateScaleWindow::glPaint (const GLWindowPaintAttrib& attrib, const GLMatrix& transform, const CompRegion& region, unsigned int mask) { bool status; if (spScreen->state != ScaleScreen::Idle) { GLWindowPaintAttrib sAttrib (attrib); bool scaled; scaled = sWindow->setScaledPaintAttributes (sAttrib); if (adjust || slot) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; status = gWindow->glPaint (sAttrib, transform, region, mask); if (scaled) { GLWindowPaintAttrib lastAttrib (gWindow->lastPaintAttrib ()); GLMatrix wTransform (transform); if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) return false; if (window->alpha () || lastAttrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.translate (window->x (), window->y (), 0.0f); wTransform.scale (scale, scale, 1.0f); wTransform.translate (tx / scale - window->x (), ty / scale - window->y (), 0.0f); gWindow->glDraw (wTransform, lastAttrib, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); sWindow->scalePaintDecoration (sAttrib, transform, region, mask); } } else { status = gWindow->glPaint (attrib, transform, region, mask); } return status; } bool PrivateScaleWindow::compareWindowsDistance (ScaleWindow *w1, ScaleWindow *w2) { return w1->priv->distance < w2->priv->distance; } void PrivateScaleScreen::layoutSlotsForArea (const CompRect& workArea, int nWindows) { if (!nWindows) return; int x, y, width, height; int n; int lines = sqrt (nWindows + 1); int spacing = optionGetSpacing (); int nSlots = 0; y = optionGetYOffset() + workArea.y () + spacing; height = (workArea.height () - optionGetYOffset() - (lines + 1) * spacing) / lines; for (int i = 0; i < lines; i++) { n = MIN (nWindows - nSlots, ceilf ((float) nWindows / lines)); x = optionGetXOffset() + workArea.x () + spacing; width = (workArea.width () - optionGetXOffset() - (n + 1) * spacing) / n; for (int j = 0; j < n; j++) { slots[this->nSlots].setGeometry (x, y, width, height); slots[this->nSlots].filled = false; x += width + spacing; this->nSlots++; nSlots++; } y += height + spacing; } } SlotArea::vector PrivateScaleScreen::getSlotAreas () { SlotArea::vector slotAreas; slotAreas.resize (screen->outputDevs ().size ()); unsigned int i = 0; foreach (CompOutput &o, screen->outputDevs ()) { slotAreas[i].nWindows = 0; foreach (ScaleWindow *window, windows) { CompWindow *cw = window->priv->window; if (cw->outputDevice () == (int) o.id ()) slotAreas[i].nWindows++; } slotAreas[i++].workArea = o.workArea (); } return slotAreas; } void PrivateScaleScreen::layoutSlots () { int moMode; moMode = getMultioutputMode (); /* if we have only one head, we don't need the additional effort of the all outputs mode */ if (screen->outputDevs ().size () == 1) moMode = ScaleOptions::MultioutputModeOnCurrentOutputDevice; nSlots = 0; switch (moMode) { case ScaleOptions::MultioutputModeOnAllOutputDevices: { SlotArea::vector slotAreas = getSlotAreas (); if (!slotAreas.empty ()) { foreach (SlotArea &sa, slotAreas) layoutSlotsForArea (sa.workArea, sa.nWindows); } } break; case ScaleOptions::MultioutputModeOnCurrentOutputDevice: default: { CompRect workArea (screen->currentOutputDev ().workArea ()); layoutSlotsForArea (workArea, windows.size ()); } break; } } void PrivateScaleScreen::findBestSlots () { CompWindow *w; int i, d, d0 = 0; float sx, sy, cx, cy; foreach (ScaleWindow *sw, windows) { w = sw->priv->window; if (sw->priv->slot) continue; sw->priv->sid = 0; sw->priv->distance = MAXSHORT; for (i = 0; i < nSlots; i++) { if (!slots[i].filled) { sx = (slots[i].x2 () + slots[i].x1 ()) / 2; sy = (slots[i].y2 () + slots[i].y1 ()) / 2; cx = (w->serverX () - (w->defaultViewport ().x () - screen->vp ().x ()) * screen->width ()) + w->width () / 2; cy = (w->serverY () - (w->defaultViewport ().y () - screen->vp ().y ()) * screen->height ()) + w->height () / 2; cx -= sx; cy -= sy; d = sqrt (cx * cx + cy * cy); if (d0 + d < sw->priv->distance) { sw->priv->sid = i; sw->priv->distance = d0 + d; } } } d0 += sw->priv->distance; } } bool PrivateScaleScreen::fillInWindows () { CompWindow *w; int width, height; float sx, sy, cx, cy; foreach (ScaleWindow *sw, windows) { w = sw->priv->window; if (!sw->priv->slot) { if (slots[sw->priv->sid].filled) return true; sw->priv->slot = &slots[sw->priv->sid]; /* Auxilary items reparented into windows are clickable so we want to care about * them when calculating the slot size */ width = w->width () + w->input ().left + w->input ().right; height = w->height () + w->input ().top + w->input ().bottom; sx = (float) (sw->priv->slot->x2 () - sw->priv->slot->x1 ()) / width; sy = (float) (sw->priv->slot->y2 () - sw->priv->slot->y1 ()) / height; sw->priv->slot->scale = MIN (MIN (sx, sy), 1.0f); sx = width * sw->priv->slot->scale; sy = height * sw->priv->slot->scale; cx = (sw->priv->slot->x1 () + sw->priv->slot->x2 ()) / 2; cy = (sw->priv->slot->y1 () + sw->priv->slot->y2 ()) / 2; cx += w->input ().left * sw->priv->slot->scale; cy += w->input ().top * sw->priv->slot->scale; sw->priv->slot->setGeometry (cx - sx / 2, cy - sy / 2, sx, sy); sw->priv->slot->filled = true; sw->priv->lastThumbOpacity = 0.0f; sw->priv->adjust = true; } } return false; } bool ScaleScreenInterface::layoutSlotsAndAssignWindows () WRAPABLE_DEF (layoutSlotsAndAssignWindows) bool ScaleScreen::layoutSlotsAndAssignWindows () { WRAPABLE_HND_FUNCTN_RETURN (bool, layoutSlotsAndAssignWindows) /* create a grid of slots */ priv->layoutSlots (); do { /* find most appropriate slots for windows */ priv->findBestSlots (); /* sort windows, window with closest distance to a slot first */ priv->windows.sort (PrivateScaleWindow::compareWindowsDistance); } while (priv->fillInWindows ()); return true; } bool ScaleScreen::hasGrab () const { return priv->grab; } ScaleScreen::State ScaleScreen::getState () const { return priv->state; } ScaleType ScaleScreen::getType () const { return priv->type; } const CompMatch& ScaleScreen::getCustomMatch () const { return priv->match; } const ScaleScreen::WindowList& ScaleScreen::getWindows () const { return priv->windows; } bool PrivateScaleScreen::layoutThumbs () { switch (type) { case ScaleTypeAll: return layoutThumbsAll (); case ScaleTypeNormal: default: return layoutThumbsSingle (); } } bool PrivateScaleScreen::layoutThumbsAll () { windows.clear (); /* add windows scale list, top most window first */ foreach (CompWindow *w, screen->windows ()) { SCALE_WINDOW (w); if (sw->priv->slot) sw->priv->adjust = true; sw->priv->slot = NULL; if (!sw->priv->isScaleWin ()) continue; windows.push_back (sw); } if (windows.empty ()) return false; slots.resize (windows.size ()); return sScreen->layoutSlotsAndAssignWindows (); } bool PrivateScaleScreen::layoutThumbsSingle () { bool ret = false; std::map slotWindows; CompWindowList allWindows; for (int i = 0; i < screen->vpSize ().height (); i++) { for (int j = 0; j < screen->vpSize ().width (); j++) { windows.clear (); slots.clear (); /* add windows scale list, top most window first */ foreach (CompWindow *w, screen->windows ()) { SCALE_WINDOW (w); if (w->defaultViewport () != CompPoint (j, i)) continue; if (sw->priv->slot) sw->priv->adjust = true; sw->priv->slot = NULL; if (!sw->priv->isScaleWin ()) continue; windows.push_back (sw); } if (!windows.empty ()) { slots.resize (windows.size ()); ret |= sScreen->layoutSlotsAndAssignWindows (); foreach (ScaleWindow *sw, windows) slotWindows[sw] = *sw->priv->slot; } } } slots.clear (); windows.clear (); for (std::map::iterator it = slotWindows.begin (); it != slotWindows.end (); ++it) { slots.push_back (it->second); windows.push_back (it->first); it->first->priv->slot = &slots.back (); it->first->priv->slot->setX (it->first->priv->slot->x () + (it->first->priv->window->defaultViewport ().x () - screen->vp ().x ()) * screen->width ()); it->first->priv->slot->setY (it->first->priv->slot->y () + (it->first->priv->window->defaultViewport ().y () - screen->vp ().y ()) * screen->height ()); } return ret; } bool PrivateScaleWindow::adjustScaleVelocity () { float dx, dy, ds, adjust, amount; float x1, y1, scale; if (slot) { x1 = slot->x1 (); y1 = slot->y1 (); scale = slot->scale; } else { x1 = window->x (); y1 = window->y (); scale = 1.0f; } dx = x1 - (window->x () + tx); adjust = dx * 0.15f; amount = fabs (dx) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; xVelocity = (amount * xVelocity + adjust) / (amount + 1.0f); dy = y1 - (window->y () + ty); adjust = dy * 0.15f; amount = fabs (dy) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; yVelocity = (amount * yVelocity + adjust) / (amount + 1.0f); ds = scale - this->scale; adjust = ds * 0.1f; amount = fabs (ds) * 7.0f; if (amount < 0.01f) amount = 0.01f; else if (amount > 0.15f) amount = 0.15f; scaleVelocity = (amount * scaleVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (xVelocity) < 0.2f && fabs (dy) < 0.1f && fabs (yVelocity) < 0.2f && fabs (ds) < 0.001f && fabs (scaleVelocity) < 0.002f) { xVelocity = yVelocity = scaleVelocity = 0.0f; tx = x1 - window->x (); ty = y1 - window->y (); this->scale = scale; return false; } return true; } bool PrivateScaleScreen::glPaintOutput (const GLScreenPaintAttrib& sAttrib, const GLMatrix& transform, const CompRegion& region, CompOutput *output, unsigned int mask) { if (state != ScaleScreen::Idle) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } void PrivateScaleScreen::preparePaint (int msSinceLastPaint) { #ifndef LP1026986_FIXED_PROPERLY if (state != ScaleScreen::Idle) cScreen->damageScreen (); #endif if (state != ScaleScreen::Idle && state != ScaleScreen::Wait) { int steps; float amount, chunk; amount = msSinceLastPaint * 0.05f * optionGetSpeed (); steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float) steps; while (steps--) { moreAdjust = 0; foreach (CompWindow *w, screen->windows ()) { SCALE_WINDOW (w); if (sw->priv->adjust) { sw->priv->adjust = sw->priv->adjustScaleVelocity (); moreAdjust |= sw->priv->adjust; sw->priv->tx += sw->priv->xVelocity * chunk; sw->priv->ty += sw->priv->yVelocity * chunk; sw->priv->scale += sw->priv->scaleVelocity * chunk; } } if (!moreAdjust) break; } } cScreen->preparePaint (msSinceLastPaint); } void PrivateScaleScreen::donePaint () { if (state != ScaleScreen::Idle) { if (moreAdjust) { cScreen->damageScreen (); } else { if (state == ScaleScreen::In) { /* The false activate event is sent when scale state goes back to normal, to avoid animation conflicts with other plugins. */ activateEvent (false); state = ScaleScreen::Idle; cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); foreach (CompWindow *w, screen->windows ()) { SCALE_WINDOW (w); sw->priv->cWindow->damageRectSetEnabled (sw->priv, false); sw->priv->gWindow->glPaintSetEnabled (sw->priv, false); } } else if (state == ScaleScreen::Out) { state = ScaleScreen::Wait; // When the animation is completed, select the window under mouse selectWindowAt (pointerX, pointerY); } } } cScreen->donePaint (); } ScaleWindow * PrivateScaleScreen::checkForWindowAt (int x, int y) { int x1, y1, x2, y2; CompWindowList::reverse_iterator rit = screen->windows ().rbegin (); for (; rit != screen->windows ().rend (); ++rit) { CompWindow *w = *rit; SCALE_WINDOW (w); if (sw->priv->slot) { x1 = w->x () - w->input ().left * sw->priv->scale; y1 = w->y () - w->input ().top * sw->priv->scale; x2 = w->x () + (w->width () + w->input ().right) * sw->priv->scale; y2 = w->y () + (w->height () + w->input ().bottom) * sw->priv->scale; x1 += sw->priv->tx; y1 += sw->priv->ty; x2 += sw->priv->tx; y2 += sw->priv->ty; if (x1 <= x && y1 <= y && x2 > x && y2 > y) return sw; } } return NULL; } void PrivateScaleScreen::sendDndStatusMessage (Window source) { XEvent xev; xev.xclient.type = ClientMessage; xev.xclient.display = screen->dpy (); xev.xclient.format = 32; xev.xclient.message_type = Atoms::xdndStatus; xev.xclient.window = source; xev.xclient.data.l[0] = dndTarget; xev.xclient.data.l[1] = 2; xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = None; XSendEvent (screen->dpy (), source, false, 0, &xev); } bool PrivateScaleScreen::scaleTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { SCALE_SCREEN (screen); Window xid; int selectX = CompOption::getIntOptionNamed (options, "select_x", -1); int selectY = CompOption::getIntOptionNamed (options, "select_y", -1); if (ss->priv->actionShouldToggle (action, state)) return false; xid = CompOption::getIntOptionNamed (options, "root"); if (xid && ::screen->root () != xid) return false; if (!ss->priv->grab) return false; if (selectX != -1 && selectY != -1) { if (!ss->priv->selectWindowAt (selectX, selectY, true)) return false; } if (ss->priv->grabIndex) { ::screen->removeGrab (ss->priv->grabIndex, 0); ss->priv->grabIndex = 0; } if (ss->priv->dndTarget) XUnmapWindow (::screen->dpy (), ss->priv->dndTarget); ss->priv->grab = false; if (ss->priv->state != ScaleScreen::Idle) { foreach (CompWindow *w, ::screen->windows ()) { SCALE_WINDOW (w); if (sw->priv->slot) { sw->priv->lastTargetScale = sw->priv->slot->scale; sw->priv->lastTargetX = sw->priv->slot->x (); sw->priv->lastTargetY = sw->priv->slot->y (); sw->priv->slot = NULL; sw->priv->adjust = true; } else { sw->priv->lastTargetScale = 1.0f; sw->priv->lastTargetX = w->x (); sw->priv->lastTargetY = w->y (); } } if (state & CompAction::StateCancel) { if (::screen->activeWindow () != ss->priv->previousActiveWindow) { CompWindow *w; w = ::screen->findWindow (ss->priv->previousActiveWindow); if (w) w->moveInputFocusTo (); } } else if (ss->priv->state != ScaleScreen::In) { CompWindow *w = ::screen->findWindow (ss->priv->selectedWindow); if (w) w->activate (); } ss->priv->state = ScaleScreen::In; ss->priv->cScreen->damageScreen (); } if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); ss->priv->lastActiveNum = 0; if (selectX != -1 && selectY != -1) return true; return false; } bool PrivateScaleScreen::ensureDndRedirectWindow () { if (!dndTarget) { XSetWindowAttributes attr; long xdndVersion = 3; attr.override_redirect = true; dndTarget = XCreateWindow (screen->dpy (), screen->root (), 0, 0, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect, &attr); XChangeProperty (screen->dpy (), dndTarget, Atoms::xdndAware, XA_ATOM, 32, PropModeReplace, (unsigned char *) &xdndVersion, 1); } XMoveResizeWindow (screen->dpy (), dndTarget, 0, 0, screen->width (), screen->height ()); XMapRaised (screen->dpy (), dndTarget); return true; } bool PrivateScaleScreen::actionShouldToggle (CompAction *action, CompAction::State state) { if (state & EDGE_STATE) return TRUE; if (state & (CompAction::StateInitKey | CompAction::StateTermKey)) { if (optionGetKeyBindingsToggle ()) return TRUE; else if (!action->key ().modifiers ()) return TRUE; } if (state & (CompAction::StateInitButton | CompAction::StateTermButton)) if (optionGetButtonBindingsToggle ()) return TRUE; return FALSE; } bool PrivateScaleScreen::scaleInitiate (CompAction *action, CompAction::State state, CompOption::Vector &options, ScaleType type) { Window xid; xid = CompOption::getIntOptionNamed (options, "root"); if (::screen->root () == xid) { SCALE_SCREEN (::screen); if (ss->priv->actionShouldToggle (action, state) && (ss->priv->state == ScaleScreen::Wait || ss->priv->state == ScaleScreen::Out)) { if (ss->priv->type == type) return scaleTerminate (action, CompAction::StateCancel, options); } else { ss->priv->type = type; return ss->priv->scaleInitiateCommon (action, state, options); } } return false; } bool PrivateScaleScreen::scaleInitiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &options) { int noAutoGrab = CompOption::getIntOptionNamed (options, "no_auto_grab", 0); if (screen->otherGrabExist ("scale", NULL) && !noAutoGrab) return false; match = CompOption::getMatchOptionNamed (options, "match", CompMatch::emptyMatch); if (match.isEmpty ()) match = optionGetWindowMatch (); currentMatch = match; if (!layoutThumbs ()) return false; /* Another plugin may be using us externally */ grab = noAutoGrab; if (!grab) { if (state & CompAction::StateInitEdgeDnd) { if (ensureDndRedirectWindow ()) grab = true; } else if (!grabIndex) { grabIndex = screen->pushGrab (cursor, "scale"); if (grabIndex) grab = true; } } if (grab) { if (!lastActiveNum) lastActiveNum = screen->activeNum () - 1; Window active_window = screen->activeWindow (); bool found_active = false; foreach (ScaleWindow *sw, windows) { if (sw->window->id() == active_window) { found_active = true; break; } } if (!found_active) active_window = None; previousActiveWindow = active_window; lastActiveWindow = active_window; selectedWindow = active_window; hoveredWindow = None; this->state = ScaleScreen::Out; activateEvent (true); cScreen->damageScreen (); cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); foreach (CompWindow *w, screen->windows ()) { SCALE_WINDOW (w); sw->priv->cWindow->damageRectSetEnabled (sw->priv, true); sw->priv->gWindow->glPaintSetEnabled (sw->priv, true); } } if ((state & (CompAction::StateInitButton | EDGE_STATE)) == CompAction::StateInitButton) { action->setState (action->state () | CompAction::StateTermButton); } if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); return false; } void ScaleWindowInterface::scaleSelectWindow () WRAPABLE_DEF (scaleSelectWindow) void ScaleWindow::scaleSelectWindow () { WRAPABLE_HND_FUNCTN (scaleSelectWindow) if (spScreen->selectedWindow != priv->window->id ()) { CompWindow *oldW, *newW; oldW = screen->findWindow (spScreen->selectedWindow); newW = screen->findWindow (priv->window->id ()); spScreen->selectedWindow = priv->window->id (); if (oldW) CompositeWindow::get (oldW)->addDamage (); if (newW) CompositeWindow::get (newW)->addDamage (); } } bool ScaleWindow::hasSlot () const { return priv->slot != NULL; } ScaleSlot ScaleWindow::getSlot () const { if (!priv->slot) { ScaleSlot empty; return empty; } return *priv->slot; } void ScaleWindow::setSlot (const ScaleSlot &newSlot) { SCALE_SCREEN (screen); priv->adjust = true; if (!priv->slot) priv->slot = new ScaleSlot (); *priv->slot = newSlot; /* Trigger the animation to this point */ if (ss->priv->state == ScaleScreen::Wait) ss->priv->state = ScaleScreen::Out; else if (ss->priv->state == ScaleScreen::Idle) ss->priv->state = ScaleScreen::In; priv->cWindow->addDamage (); } ScalePosition ScaleWindow::getCurrentPosition () const { ScalePosition pos; pos.setX (priv->tx); pos.setY (priv->ty); pos.scale = priv->scale; return pos; } void ScaleWindow::setCurrentPosition (const ScalePosition &newPos) { SCALE_SCREEN (screen); priv->tx = newPos.x (); priv->ty = newPos.y (); priv->scale = newPos.scale; /* Trigger the animation to this point */ if (ss->priv->state == ScaleScreen::Wait) ss->priv->state = ScaleScreen::Out; else if (ss->priv->state == ScaleScreen::Idle) ss->priv->state = ScaleScreen::In; priv->cWindow->addDamage (); priv->adjust = true; } const Window & ScaleScreen::getHoveredWindow () const { return priv->hoveredWindow; } const Window & ScaleScreen::getSelectedWindow () const { return priv->selectedWindow; } bool PrivateScaleScreen::selectWindowAt (int x, int y, bool moveInputFocus) { ScaleWindow *w = checkForWindowAt (x, y); if (w && w->priv->isScaleWin ()) { w->scaleSelectWindow (); if (moveInputFocus) { lastActiveNum = w->priv->window->activeNum (); lastActiveWindow = w->priv->window->id (); w->priv->window->moveInputFocusTo (); } hoveredWindow = w->priv->window->id (); return true; } hoveredWindow = None; return false; } bool PrivateScaleScreen::selectWindowAt (int x, int y) { CompOption *o = screen->getOption ("click_to_focus"); bool focus = (o && !o->value ().b ()); return selectWindowAt (x, y, focus); } void PrivateScaleScreen::moveFocusWindow (int dx, int dy) { CompWindow *active; CompWindow *focus = NULL; active = screen->findWindow (screen->activeWindow ()); if (active) { SCALE_WINDOW (active); if (sw->priv->slot) { ScaleSlot *slot; int x, y, cx, cy, d, min = MAXSHORT; cx = (sw->priv->slot->x1 () + sw->priv->slot->x2 ()) / 2; cy = (sw->priv->slot->y1 () + sw->priv->slot->y2 ()) / 2; foreach (CompWindow *w, screen->windows ()) { slot = ScaleWindow::get (w)->priv->slot; if (!slot) continue; x = (slot->x1 () + slot->x2 ()) / 2; y = (slot->y1 () + slot->y2 ()) / 2; d = abs (x - cx) + abs (y - cy); if (d < min) { if ((dx > 0 && slot->x1 () < sw->priv->slot->x2 ()) || (dx < 0 && slot->x2 () > sw->priv->slot->x1 ()) || (dy > 0 && slot->y1 () < sw->priv->slot->y2 ()) || (dy < 0 && slot->y2 () > sw->priv->slot->y1 ())) continue; min = d; focus = w; } } } } /* move focus to the last focused window if no slot window is currently focused */ if (!focus) { foreach (CompWindow *w, screen->windows ()) { if (!ScaleWindow::get (w)->priv->slot) continue; if (!focus || focus->activeNum () < w->activeNum ()) focus = w; } } if (focus) { ScaleWindow::get (focus)->scaleSelectWindow (); lastActiveNum = focus->activeNum (); lastActiveWindow = focus->id (); if (!focus->focused ()) focus->moveInputFocusTo (); } } void ScaleScreen::relayoutSlots (const CompMatch& match) { if (match.isEmpty ()) priv->currentMatch = priv->match; else priv->currentMatch = match; if (priv->state == ScaleScreen::Idle || priv->state == ScaleScreen::In) return; if (priv->layoutThumbs ()) { priv->state = ScaleScreen::Out; priv->moveFocusWindow (0, 0); } priv->cScreen->damageScreen (); } void PrivateScaleScreen::windowRemove (CompWindow *w) { if (!w || state == ScaleScreen::Idle || state == ScaleScreen::In) return; foreach (ScaleWindow *lw, windows) { if (lw->priv->window == w) { if (layoutThumbs ()) { state = ScaleScreen::Out; cScreen->damageScreen (); break; } else { CompOption::Vector o (0); CompAction *action; /* terminate scale mode if the recently closed * window was the last scaled window */ o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); action = &optionGetInitiateEdge (); scaleTerminate (action, CompAction::StateCancel, o); action = &optionGetInitiateKey (); scaleTerminate (action, CompAction::StateCancel, o); break; } } } } bool PrivateScaleScreen::hoverTimeout () { if (grab && state != ScaleScreen::In) { CompWindow *w; CompOption::Vector o (0); w = screen->findWindow (selectedWindow); if (w) { lastActiveNum = w->activeNum (); lastActiveWindow = w->id (); w->moveInputFocusTo (); } o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); scaleTerminate (&optionGetInitiateEdge (), 0, o); scaleTerminate (&optionGetInitiateKey (), 0, o); } return false; } void PrivateScaleScreen::handleEvent (XEvent *event) { CompWindow *w = NULL; switch (event->type) { case KeyPress: if (screen->root () == event->xkey.root) { if (grabIndex) { if (event->xkey.keycode == leftKeyCode) moveFocusWindow (-1, 0); else if (event->xkey.keycode == rightKeyCode) moveFocusWindow (1, 0); else if (event->xkey.keycode == upKeyCode) moveFocusWindow (0, -1); else if (event->xkey.keycode == downKeyCode) moveFocusWindow (0, 1); } } break; case ButtonPress: if (screen->root () == event->xbutton.root && grabIndex && state != ScaleScreen::In) { XButtonEvent *button = &event->xbutton; CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); /* Button1 terminates scale mode, other buttons can select * windows */ if (selectWindowAt (button->x_root, button->y_root, true) && event->xbutton.button == Button1) { scaleTerminate (&optionGetInitiateEdge (), 0, o); scaleTerminate (&optionGetInitiateKey (), 0, o); } else if (optionGetClickOnDesktop () == 1 && event->xbutton.button == Button1) { CompPoint pointer (button->x_root, button->y_root); CompRect workArea (screen->workArea ()); workArea.setX (workArea.x() + optionGetXOffset ()); workArea.setY (workArea.y() + optionGetYOffset ()); if (workArea.contains (pointer)) { scaleTerminate (&optionGetInitiateEdge (), 0, o); scaleTerminate (&optionGetInitiateKey (), 0, o); screen->enterShowDesktopMode (); } } else if (optionGetClickOnDesktop () == 2 && event->xbutton.button == Button1) { CompPoint pointer (button->x_root, button->y_root); CompRect workArea (screen->workArea ()); workArea.setX (workArea.x() + optionGetXOffset ()); workArea.setY (workArea.y() + optionGetYOffset ()); if (workArea.contains (pointer)) { scaleTerminate (&optionGetInitiateEdge (), 0, o); scaleTerminate (&optionGetInitiateKey (), 0, o); } } } break; case MotionNotify: if (screen->root () == event->xmotion.root && grabIndex && state != ScaleScreen::In) { selectWindowAt (event->xmotion.x_root, event->xmotion.y_root); } break; case DestroyNotify: /* We need to get the CompWindow * for event->xdestroywindow.window * here because in the ::handleEvent call below that CompWindow's * id will become "1" so CompScreen::findWindow won't * be able to find teh window after that */ w = screen->findWindow (event->xdestroywindow.window); break; case UnmapNotify: w = screen->findWindow (event->xunmap.window); break; case ClientMessage: if (event->xclient.message_type == Atoms::xdndPosition) { w = screen->findWindow (event->xclient.window); if (w) { if (w->id () == dndTarget) sendDndStatusMessage (event->xclient.data.l[0]); if (grab && state != ScaleScreen::In && w->id () == dndTarget) { ScaleWindow *sw = checkForWindowAt (pointerX, pointerY); if (sw && sw->priv->isScaleWin ()) { int time; time = optionGetHoverTime (); if (hover.active ()) { int lastMotion = sqrt (pow (pointerX - lastPointerX, 2) + pow (pointerY - lastPointerY, 2)); if (sw->window->id () != selectedWindow || lastMotion > optionGetDndDistance ()) hover.stop (); } if (!hover.active ()) { hover.start (time, (float) time * 1.2); } selectWindowAt (pointerX, pointerY); } else { if (hover.active ()) hover.stop (); } } } } else if (event->xclient.message_type == Atoms::xdndDrop || event->xclient.message_type == Atoms::xdndLeave) { w = screen->findWindow (event->xclient.window); if (w) { if (grab && state != ScaleScreen::In && w->id () == dndTarget) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); scaleTerminate (&optionGetInitiateEdge (), 0, o); scaleTerminate (&optionGetInitiateKey (), 0, o); } } } default: break; } screen->handleEvent (event); /* Only safe to remove the window after all events have been * handled, so that we don't get race conditions on calls * to scale functions */ switch (event->type) { case UnmapNotify: if (w) windowRemove (w); break; case DestroyNotify: if (w) windowRemove (w); break; } } bool PrivateScaleWindow::damageRect (bool initial, const CompRect& rect) { bool status = false; if (initial) { if (spScreen->grab && isScaleWin ()) { if (spScreen->layoutThumbs ()) { spScreen->state = ScaleScreen::Out; spScreen->cScreen->damageScreen (); } } } else if (spScreen->state == ScaleScreen::Wait) { if (slot) { cWindow->damageTransformedRect (scale, scale, tx, ty, rect); status = true; } } status |= cWindow->damageRect (initial, rect); return status; } template class PluginClassHandler; ScaleScreen::ScaleScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateScaleScreen (s)) { sScreen = this; spScreen = priv; } ScaleScreen::~ScaleScreen () { delete priv; sScreen = NULL; spScreen = NULL; } template class PluginClassHandler; ScaleWindow::ScaleWindow (CompWindow *w) : PluginClassHandler (w), window (w), priv (new PrivateScaleWindow (w)) { } ScaleWindow::~ScaleWindow () { delete priv; } PrivateScaleScreen::PrivateScaleScreen (CompScreen *s) : cScreen (CompositeScreen::get (s)), gScreen (GLScreen::get (s)), lastActiveNum (0), lastActiveWindow (None), selectedWindow (None), hoveredWindow (None), previousActiveWindow (None), grab (false), grabIndex (0), dndTarget (None), state (ScaleScreen::Idle), moreAdjust (false), cursor (0), nSlots (0) { leftKeyCode = XKeysymToKeycode (screen->dpy (), XStringToKeysym ("Left")); rightKeyCode = XKeysymToKeycode (screen->dpy (), XStringToKeysym ("Right")); upKeyCode = XKeysymToKeycode (screen->dpy (), XStringToKeysym ("Up")); downKeyCode = XKeysymToKeycode (screen->dpy (), XStringToKeysym ("Down")); cursor = XCreateFontCursor (screen->dpy (), XC_left_ptr); opacity = (OPAQUE * optionGetOpacity ()) / 100; hover.setCallback (boost::bind (&PrivateScaleScreen::hoverTimeout, this)); optionSetOpacityNotify (boost::bind (&PrivateScaleScreen::updateOpacity, this)); #define SCALEBIND(a) \ boost::bind (PrivateScaleScreen::scaleInitiate, _1, _2, _3, a) optionSetInitiateEdgeInitiate (SCALEBIND (ScaleTypeNormal)); optionSetInitiateEdgeTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateButtonInitiate (SCALEBIND (ScaleTypeNormal)); optionSetInitiateButtonTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateKeyInitiate (SCALEBIND (ScaleTypeNormal)); optionSetInitiateKeyTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateAllEdgeInitiate (SCALEBIND (ScaleTypeAll)); optionSetInitiateAllEdgeTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateAllButtonInitiate (SCALEBIND (ScaleTypeAll)); optionSetInitiateAllButtonTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateAllKeyInitiate (SCALEBIND (ScaleTypeAll)); optionSetInitiateAllKeyTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateGroupEdgeInitiate (SCALEBIND (ScaleTypeGroup)); optionSetInitiateGroupEdgeTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateGroupButtonInitiate (SCALEBIND (ScaleTypeGroup)); optionSetInitiateGroupButtonTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateGroupKeyInitiate (SCALEBIND (ScaleTypeGroup)); optionSetInitiateGroupKeyTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateOutputEdgeInitiate (SCALEBIND (ScaleTypeOutput)); optionSetInitiateOutputEdgeTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateOutputButtonInitiate (SCALEBIND (ScaleTypeOutput)); optionSetInitiateOutputButtonTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateOutputKeyInitiate (SCALEBIND (ScaleTypeOutput)); optionSetInitiateOutputKeyTerminate (PrivateScaleScreen::scaleTerminate); #undef SCALEBIND ScreenInterface::setHandler (s); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } PrivateScaleScreen::~PrivateScaleScreen () { if (cursor) XFreeCursor (screen->dpy (), cursor); } void PrivateScaleScreen::updateOpacity () { opacity = (OPAQUE * optionGetOpacity ()) / 100; } /* When we are only scaling windows on the current output, over-ride the * multioutput mode so that windows will only be displayed on the current * output, regardless of the setting. */ int PrivateScaleScreen::getMultioutputMode () { if (type == ScaleTypeOutput) return MultioutputModeOnCurrentOutputDevice; return optionGetMultioutputMode (); } PrivateScaleWindow::PrivateScaleWindow (CompWindow *w) : window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), sWindow (ScaleWindow::get (w)), slot (NULL), sid (0), distance (0.0), xVelocity (0.0), yVelocity (0.0), scaleVelocity (0.0), scale (1.0), lastTargetScale (1.0f), lastTargetX (w->x ()), lastTargetY (w->y ()), tx (0.0), ty (0.0), delta (1.0), adjust (false), lastThumbOpacity (0.0) { CompositeWindowInterface::setHandler (cWindow, spScreen->state != ScaleScreen::Idle); GLWindowInterface::setHandler (gWindow, spScreen->state != ScaleScreen::Idle); } PrivateScaleWindow::~PrivateScaleWindow () { } CompOption::Vector & ScaleScreen::getOptions () { return priv->getOptions (); } bool ScaleScreen::setOption (const CompString &name, CompOption::Value &value) { return priv->setOption (name, value); } bool ScalePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) { CompPrivate p; p.uval = COMPIZ_SCALE_ABI; screen->storeValue ("scale_ABI", p); return true; } return false; } void ScalePluginVTable::fini () { screen->eraseValue ("scale_ABI"); } compiz-0.9.11+14.04.20140409/plugins/scale/include/0000755000015301777760000000000012321344021021667 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/scale/include/scale/0000755000015301777760000000000012321344021022756 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/scale/include/scale/scale.h0000644000015301777760000001101312321343002024210 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_SCALE_H #define _COMPIZ_SCALE_H #include #include #include #define COMPIZ_SCALE_ABI 3 class ScaleScreen; class PrivateScaleScreen; class ScaleWindow; class PrivateScaleWindow; class ScaleSlot : public CompRect { public: ScaleSlot () {} ScaleSlot (const CompRect &r) : CompRect (r) {} public: bool filled; float scale; }; class ScalePosition : public CompPoint { public: float scale; }; enum ScaleType { ScaleTypeNormal = 0, ScaleTypeOutput, ScaleTypeGroup, ScaleTypeAll }; class ScaleScreenInterface : public WrapableInterface { public: virtual bool layoutSlotsAndAssignWindows (); }; extern template class PluginClassHandler; class ScaleScreen : public WrapableHandler, public PluginClassHandler, public CompOption::Class { public: typedef enum { Idle, Out, Wait, In } State; typedef std::list WindowList; ScaleScreen (CompScreen *s); ~ScaleScreen (); bool hasGrab () const; State getState () const; ScaleType getType () const; const Window & getHoveredWindow () const; const Window & getSelectedWindow () const; const CompMatch & getCustomMatch () const; const WindowList& getWindows () const; void relayoutSlots (const CompMatch& match); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); WRAPABLE_HND (0, ScaleScreenInterface, bool, layoutSlotsAndAssignWindows) friend class ScaleWindow; friend class PrivateScaleScreen; friend class PrivateScaleWindow; private: PrivateScaleScreen *priv; }; class ScaleWindowInterface : public WrapableInterface { public: virtual void scalePaintDecoration (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); virtual bool setScaledPaintAttributes (GLWindowPaintAttrib &); virtual void scaleSelectWindow (); }; extern template class PluginClassHandler; class ScaleWindow : public WrapableHandler, public PluginClassHandler { public: ScaleWindow (CompWindow *w); ~ScaleWindow (); CompWindow *window; bool hasSlot () const; /* Scaled window target position (slot) */ ScaleSlot getSlot () const; void setSlot (const ScaleSlot &); /* Scaled window current position (animation) */ ScalePosition getCurrentPosition () const; void setCurrentPosition (const ScalePosition &); WRAPABLE_HND (0, ScaleWindowInterface, void, scalePaintDecoration, const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int) WRAPABLE_HND (1, ScaleWindowInterface, bool, setScaledPaintAttributes, GLWindowPaintAttrib &) WRAPABLE_HND (2, ScaleWindowInterface, void, scaleSelectWindow) friend class ScaleScreen; friend class PrivateScaleScreen; friend class PrivateScaleWindow; private: PrivateScaleWindow *priv; }; #define SCALE_SCREEN(s) \ ScaleScreen *ss = ScaleScreen::get (s) #define SCALE_WINDOW(w) \ ScaleWindow *sw = ScaleWindow::get (w) #endif compiz-0.9.11+14.04.20140409/plugins/scale/scale.xml.in0000644000015301777760000001547612321343002022475 0ustar pbusernogroup00000000000000 <_short>Scale <_long>Scale windows Window Management opengl fade decor <_short>Appearance <_short>Behaviour <_short>Bindings compiz-0.9.11+14.04.20140409/plugins/scale/compiz-scale.pc.in0000644000015301777760000000042712321343002023564 0ustar pbusernogroup00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-scale Description: Scale plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite compiz-opengl Libs: -L${libdir} -lscale Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compizcompiz-0.9.11+14.04.20140409/plugins/bench/0000755000015301777760000000000012321344021020234 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/bench/bench.xml.in0000644000015301777760000000464212321343002022446 0ustar pbusernogroup00000000000000 <_short>Benchmark <_long>A simple benchmark plugin Extras opengl composite opengl <_short>Main <_short>Screen Output <_short>Console Output compiz-0.9.11+14.04.20140409/plugins/bench/CMakeLists.txt0000644000015301777760000000015312321343002022771 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (bench PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/bench/src/0000755000015301777760000000000012321344021021023 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/bench/src/bench.h0000644000015301777760000000566212321343002022262 0ustar pbusernogroup00000000000000/** * * Compiz benchmark plugin * * bench.c * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * New frame rate measurement algorithm: * Copyright (c) 2011 Daniel van Vugt * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include #include #include #include #include #include #include "bench_tex.h" #include "bench_options.h" #define TIMEVALDIFFU(tv1, tv2) \ (((tv1)->tv_sec == (tv2)->tv_sec || (tv1)->tv_usec >= (tv2)->tv_usec) ? \ ((((tv1)->tv_sec - (tv2)->tv_sec) * 1000000) + \ ((tv1)->tv_usec - (tv2)->tv_usec)): \ ((((tv1)->tv_sec - 1 - (tv2)->tv_sec) * 1000000) + \ (1000000 + (tv1)->tv_usec - (tv2)->tv_usec))) #ifdef GL_DEBUG static GLenum gl_error; #define GLERR gl_error=glGetError(); if (gl_error != GL_NO_ERROR) { fprintf (stderr,"GL error 0x%X has occured at %s:%d\n",gl_error,__FILE__,__LINE__); } #else #define GLERR #endif class BenchScreen : public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler, public BenchOptions { public: BenchScreen (CompScreen *screen); ~BenchScreen (); CompositeScreen *cScreen; GLScreen *gScreen; GLuint mDList; float mAlpha; enum { MAX_FPS = 500, FADE_FPS = 50, SECONDS_PER_AVERAGE = 2, MAX_SAMPLES = MAX_FPS * SECONDS_PER_AVERAGE, MIN_MS_PER_UPDATE = 1000 }; bool mFakedDamage; CompRect mRect; CompTimer mTimer; int mSample[MAX_SAMPLES]; int mFrames; int mLastPrintFrames; struct timeval mLastPrint; struct timeval mLastRedraw; GLuint mNumTex[10]; GLuint mBackTex; bool mActive; CompositeFPSLimiterMode mOldLimiterMode; void damageSelf (); bool timedOut (); float averageFramerate () const; void postLoad (); template void serialize (Archive & ar, const unsigned int count) { ar & mActive; } bool initiate (CompOption::Vector &options); void limiterModeChanged (CompOption *opt); void preparePaint (int msSinceLastPaint); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); }; class BenchPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/bench/src/bench_tex.h0000644000015301777760000631226612321343002023151 0ustar pbusernogroup00000000000000/** * * Compiz benchmark plugin * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.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. * **/ unsigned char number_data[10][2049] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\35\0\0\0\212\0\0\0\304\0\0\0\317\0" "\0\0\260\0\0\0Z\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0>\0\0\0\362\0\0\0\377\0\0\0\215\0\0\0Z\0\0\0\327\0\0" "\0\377\0\0\0\260\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\20\0\0\0\353\0\0\0\377\0\0\0\316\0\0\0\0\0\0\0\0\0\0\0E\0\0\0\377" "\0\0\0\377\0\0\0\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0y\0\0\0\377\0\0\0\377\0\0\0\232\0\0\0\0\0\0\0\0\0\0\0\21\0\0\0\377\0\0" "\0\377\0\0\0\363\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\312" "\0\0\0\377\0\0\0\377\0\0\0\204\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\371\0\0\0\377" "\0\0\0\377\0\0\0Q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\370\0\0\0" "\377\0\0\0\377\0\0\0x\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\356\0\0\0\377\0\0\0\377" "\0\0\0\202\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\30\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\347\0\0\0\377\0\0\0\377\0\0" "\0\237\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0$\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\344\0\0\0\377\0\0\0\377\0\0\0\253\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\36\0\0\0\377\0\0\0\377\0\0\0\377\0\0" "\0p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\345\0\0\0\377\0\0\0\377\0\0\0\245\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0t" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\352\0\0\0\377\0\0\0\377\0\0\0\223\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\343\0\0\0\377\0\0\0\377\0\0\0}\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\364\0\0\0\377\0\0\0\377\0\0\0j\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\241\0\0\0\377\0\0\0\377\0\0\0\217\0\0\0\0" "\0\0\0\0\0\0\0\5\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0&\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0<\0\0\0\377\0\0\0\377\0\0\0\260\0\0\0\0\0\0\0\0" "\0\0\0&\0\0\0\377\0\0\0\377\0\0\0\300\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\232\0\0\0\377\0\0\0\364\0\0\0$\0\0\0\0\0\0\0\215" "\0\0\0\377\0\0\0\361\0\0\0,\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\3\0\0\0\201\0\0\0\363\0\0\0\371\0\0\0\350\0\0\0\377\0\0" "\0\314\0\0\0""2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0""5\0\0\0@\0\0\0!\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""3\0\0\0\303\0\0\0\330\0\0" "\0\330\0\0\0""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\5\0\0\0\203\0\0\0\373\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\263\0\0\0\345\0\0\0]\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0p\0\0\0\20\0\0\0\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0" "\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0" "\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\31\0\0\0""0\0\0\0=\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0g\0\0\0""0\0\0\0#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\210\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\274\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0'\0\0\0t\0\0\0\250\0\0\0\311\0\0\0\324\0\0\0\307\0" "\0\0\234\0\0\0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\260\0\0\0\377\0\0\0\273\0\0\0W\0\0\0i\0\0\0\343\0\0\0\377\0" "\0\0\377\0\0\0\240\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\260\0\0\0\324\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0""0\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0h\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\260" "\0\0\0z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\327\0\0\0\377\0\0\0\377\0\0" "\0\301\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\274\0\0\0\377\0\0\0\377\0\0\0\332\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\306\0\0\0\377\0\0\0\377\0\0\0\277\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\5\0\0\0\361\0\0\0\377\0\0\0\377\0\0\0e\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "Y\0\0\0\377\0\0\0\377\0\0\0\271\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\32\0\0\0\347\0\0\0\377" "\0\0\0\264\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\33\0\0\0\326\0\0\0\375\0\0\0\204\0\0\0\3" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0""2\0\0\0\341\0\0\0\345\0\0\0C\0\0\0\0\0\0\0\0\0\0\0\25\0\0" "\0A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0b\0\0\0" "\367\0\0\0\262\0\0\0\24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0L\0\0\0\350\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\216\0\0\0\377\0\0\0\347\0" "\0\0\220\0\0\0\220\0\0\0\220\0\0\0\220\0\0\0\220\0\0\0\261\0\0\0\350\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\314\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\350\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\314\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\350" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\30\0\0\0g\0\0\0\234\0\0\0\301\0\0\0\323\0\0\0\317" "\0\0\0\262\0\0\0n\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0t\0\0\0\377\0\0\0\312\0\0\0\\\0\0\0[\0\0\0\303\0\0\0\377" "\0\0\0\377\0\0\0\332\0\0\0\30\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0t\0\0\0\354\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\11\0\0\0\347\0\0\0\377" "\0\0\0\377\0\0\0\230\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0X\0\0\0\204\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\260\0\0\0\377\0\0\0\377" "\0\0\0\317\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\271\0\0\0\377\0\0\0\377\0\0\0\303" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0!\0\0\0\366\0\0\0\377\0\0\0\377\0\0\0d\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Z\0\0\0" "\225\0\0\0\353\0\0\0\377\0\0\0\343\0\0\0k\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\0\0\0\276\0\0\0\371" "\0\0\0\377\0\0\0\322\0\0\0n\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&\0\0\0\350\0\0\0" "\377\0\0\0\377\0\0\0\235\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0q\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0=\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0T\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\204\0\0\0C\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0T\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\274\0\0\0\225\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0z\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0!\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\274\0\0\0\370\0\0\0K\0\0\0\0\0\0\0\0\0\0" "\0B\0\0\0\361\0\0\0\377\0\0\0\377\0\0\0\224\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0r\0\0\0\331\0\0\0\377\0\0\0\352\0\0\0\351\0\0\0\377" "\0\0\0\377\0\0\0\341\0\0\0r\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\0\0\0""5\0\0\0D\0\0\0>\0\0\0\40\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\0\0\0\313\0\0\0" "\330\0\0\0\330\0\0\0r\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\203\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\33\0\0\0\366\0\0\0\375\0\0\0\377\0\0\0\377\0" "\0\0\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\240\0\0\0\325\0\0\0\313\0\0\0\377\0\0\0\377\0\0\0" "\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0/\0\0\0\375\0\0\0K\0\0\0\310\0\0\0\377\0\0\0\377\0\0\0\210\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\273\0\0\0\276\0\0\0\0\0\0\0\310\0\0\0\377\0\0\0\377\0\0\0\210\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0J\0\0\0\376" "\0\0\0""2\0\0\0\0\0\0\0\310\0\0\0\377\0\0\0\377\0\0\0\210\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\325\0\0\0\243\0\0" "\0\0\0\0\0\0\0\0\0\310\0\0\0\377\0\0\0\377\0\0\0\210\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0g\0\0\0\367\0\0\0\36\0\0\0\0\0" "\0\0\0\0\0\0\310\0\0\0\377\0\0\0\377\0\0\0\210\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\0\0\0\350\0\0\0\232\0\0\0\30\0\0\0\30\0\0" "\0\30\0\0\0\315\0\0\0\377\0\0\0\377\0\0\0\223\0\0\0\30\0\0\0\22\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\310\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\0\0\0(\0\0\0(\0\0\0(\0\0\0(\0\0\0(\0" "\0\0\320\0\0\0\377\0\0\0\377\0\0\0\232\0\0\0(\0\0\0\37\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310" "\0\0\0\377\0\0\0\377\0\0\0\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0#\0\0\0""0\0\0\0\322\0\0\0\377" "\0\0\0\377\0\0\0\236\0\0\0""0\0\0\0\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\274\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0|\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\210\0\0\0\224\0\0\0\224\0\0\0\224\0\0\0\224" "\0\0\0\224\0\0\0\224\0\0\0\224\0\0\0\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\354\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\354\0\0\0\374\0\0\0\374\0\0\0\374\0\0\0\374\0" "\0\0\374\0\0\0\374\0\0\0\374\0\0\0'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\354\0\0\0\40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\354\0\0\0\40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\354" "\0\0\0?\0\0\0\221\0\0\0\311\0\0\0\310\0\0\0\241\0\0\0I\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\354\0\0\0\342" "\0\0\0|\0\0\0m\0\0\0\320\0\0\0\377\0\0\0\377\0\0\0\241\0\0\0\2\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\226\0\0\0$\0\0\0\0\0" "\0\0\0\0\0\0\17\0\0\0\352\0\0\0\377\0\0\0\377\0\0\0u\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\232\0\0\0\377\0\0\0\377\0\0\0\344\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0u\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0o\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0!\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "_\0\0\0e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\202\0\0\0\377\0\0\0\377\0" "\0\0\373\0\0\0\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\210\0\0\0" "\273\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\277\0\0\0\377\0\0\0\377\0\0\0" "\267\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\210\0\0\0\376" "\0\0\0Y\0\0\0\0\0\0\0\0\0\0\0_\0\0\0\377\0\0\0\377\0\0\0\363\0\0\0,\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0M\0\0\0\315\0\0\0\375\0\0" "\0\353\0\0\0\352\0\0\0\377\0\0\0\377\0\0\0\300\0\0\0-\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\0\0\0""2\0" "\0\0D\0\0\0<\0\0\0\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0G\0\0\0\241\0\0\0\314\0\0\0" "\323\0\0\0\276\0\0\0\224\0\0\0S\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\4\0\0\0\245\0\0\0\377\0\0\0\351\0\0\0s\0\0\0R\0\0\0" "\213\0\0\0\375\0\0\0\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\202\0\0\0\377\0\0\0\375\0\0\0""0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\207\0\0\0\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\24\0\0\0\370\0\0\0\377\0\0\0\301\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23" "\0\0\0F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0f\0\0\0\377" "\0\0\0\377\0\0\0\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\237\0\0\0\377\0\0\0\377" "\0\0\0x\0\0\0L\0\0\0\224\0\0\0\241\0\0\0{\0\0\0\34\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\304\0\0\0\377\0\0\0\377\0\0\0\352" "\0\0\0\317\0\0\0\212\0\0\0\347\0\0\0\377\0\0\0\364\0\0\0A\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\323\0\0\0\377\0\0\0\377\0\0\0\373" "\0\0\0\26\0\0\0\0\0\0\0L\0\0\0\377\0\0\0\377\0\0\0\350\0\0\0\11\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\327\0\0\0\377\0\0\0\377\0\0\0\323\0" "\0\0\0\0\0\0\0\0\0\0\15\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0U\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\312\0\0\0\377\0\0\0\377\0\0\0\275\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\367\0\0\0\377\0\0\0\377\0\0\0\202\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\247\0\0\0\377\0\0\0\377\0\0\0\271\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\362\0\0\0\377\0\0\0\377\0\0\0\212\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0l\0\0\0\377\0\0\0\377\0\0\0\302\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\373\0\0\0\377\0\0\0\377\0\0\0p\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\26\0\0\0\365\0\0\0\377\0\0\0\341\0\0\0\0\0\0\0" "\0\0\0\0\34\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0+\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0l\0\0\0\377\0\0\0\377\0\0\0B\0\0\0\0\0\0\0" "}\0\0\0\377\0\0\0\377\0\0\0\237\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0a\0\0\0\346\0\0\0\374\0\0\0\345\0\0\0\377\0\0" "\0\365\0\0\0\210\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0,\0\0\0B\0\0\0""5\0\0\0\10\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0U\0\0\0\224\0\0\0\224\0\0\0\224\0\0\0\224\0\0\0\224" "\0\0\0\224\0\0\0\224\0\0\0\224\0\0\0\224\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\224\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\10\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\224\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\7\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\224\0\0\0\262\0\0\0""0\0\0\0""0\0\0\0""0\0" "\0\0""0\0\0\0""0\0\0\0B\0\0\0\374\0\0\0\303\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\224\0\0\0\240\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0z\0\0\0\377\0\0\0P\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\27\0\0\0\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\346" "\0\0\0\333\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\0\0\0\377\0\0\0k\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\321\0\0\0\355\0\0\0\12\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0D\0\0\0\377\0\0\0\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\267" "\0\0\0\371\0\0\0\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0*\0\0\0\376\0\0\0\240\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\234\0\0\0\377\0\0\0.\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\26\0\0\0\367\0\0\0\272\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\201\0\0\0\377\0\0\0G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\352\0\0\0\324" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0W\0\0\0\250\0\0\0\314\0\0\0\323\0\0" "\0\277\0\0\0\207\0\0\0\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\2\0\0\0\263\0\0\0\377\0\0\0\377\0\0\0\215\0\0\0X\0\0\0\334" "\0\0\0\377\0\0\0\365\0\0\0@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0Y\0\0\0\377\0\0\0\377\0\0\0\351\0\0\0\0\0\0\0\0\0\0\0k\0\0\0\377" "\0\0\0\377\0\0\0\330\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\224\0\0\0\377\0\0\0\377\0\0\0\314\0\0\0\0\0\0\0\0\0\0\0M\0\0\0\377\0\0" "\0\377\0\0\0\377\0\0\0\24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\222" "\0\0\0\377\0\0\0\377\0\0\0\314\0\0\0\0\0\0\0\0\0\0\0M\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\22\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0E\0\0\0" "\377\0\0\0\377\0\0\0\351\0\0\0\1\0\0\0\0\0\0\0k\0\0\0\377\0\0\0\377\0\0\0" "\305\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\0\0\0" "\366\0\0\0\377\0\0\0\222\0\0\0_\0\0\0\336\0\0\0\377\0\0\0\311\0\0\0\37\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0)\0\0\0\247\0" "\0\0\376\0\0\0\361\0\0\0\335\0\0\0\377\0\0\0\343\0\0\0g\0\0\0\3\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0=\0\0\0\367\0\0\0\377\0\0\0\330" "\0\0\0\14\0\0\0\0\0\0\0h\0\0\0\377\0\0\0\377\0\0\0\260\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\313\0\0\0\377\0\0\0\377\0\0\0\212\0" "\0\0\0\0\0\0\0\0\0\0\14\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0G\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0s\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\364\0\0\0\377\0\0\0\377\0\0\0\202\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\13\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0t\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\365\0\0\0\377\0\0\0\377\0\0\0\206\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\333\0\0\0\377\0\0\0\377\0\0\0\216\0\0\0\0" "\0\0\0\0\0\0\0\17\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0W\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0Z\0\0\0\377\0\0\0\377\0\0\0\336\0\0\0\21\0\0" "\0\0\0\0\0p\0\0\0\377\0\0\0\377\0\0\0\317\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0T\0\0\0\327\0\0\0\377\0\0\0\366\0\0\0\345\0" "\0\0\377\0\0\0\367\0\0\0\236\0\0\0\23\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\36\0\0\0=\0\0\0C\0\0\0""1\0\0" "\0\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0[\0\0\0\256\0\0\0\317\0\0\0\312\0\0" "\0\240\0\0\0?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\3\0\0\0\262\0\0\0\377\0\0\0\377\0\0\0~\0\0\0a\0\0\0\354\0\0\0" "\377\0\0\0\207\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0o\0\0\0\377\0\0\0\377\0\0\0\276\0\0\0\0\0\0\0\0\0\0\0y\0\0\0\377\0\0" "\0\377\0\0\0Q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\316\0" "\0\0\377\0\0\0\377\0\0\0\215\0\0\0\0\0\0\0\0\0\0\0F\0\0\0\377\0\0\0\377\0" "\0\0\313\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\370\0\0\0" "\377\0\0\0\377\0\0\0{\0\0\0\0\0\0\0\0\0\0\0""4\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\30\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\375\0\0\0\377" "\0\0\0\377\0\0\0z\0\0\0\0\0\0\0\0\0\0\0""3\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\343\0\0\0\377\0\0\0" "\377\0\0\0\207\0\0\0\0\0\0\0\0\0\0\0@\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\235\0\0\0\377\0\0\0\377\0" "\0\0\256\0\0\0\0\0\0\0\0\0\0\0i\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0_\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\"\0\0\0\361\0\0\0\377\0\0\0\367" "\0\0\0B\0\0\0$\0\0\0\324\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0R\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0/\0\0\0\276\0\0\0\375\0\0\0\377" "\0\0\0\352\0\0\0y\0\0\0\356\0\0\0\377\0\0\0\377\0\0\0""9\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\22\0\0\0\1" "\0\0\0\1\0\0\0\371\0\0\0\377\0\0\0\375\0\0\0\15\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\37\0" "\0\0\377\0\0\0\377\0\0\0\275\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0M\0\0\0\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0j\0\0\0\377\0" "\0\0\377\0\0\0K\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0X\0" "\0\0\377\0\0\0}\0\0\0\2\0\0\0\0\0\0\0""7\0\0\0\353\0\0\0\377\0\0\0\237\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0A\0\0\0\350\0" "\0\0\377\0\0\0\357\0\0\0\346\0\0\0\377\0\0\0\353\0\0\0w\0\0\0\2\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\35\0" "\0\0=\0\0\0E\0\0\0.\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" }; static unsigned char image_data[512 * 256 * 4 + 1] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2" "\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2" "\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5" "\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\11\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0" "\0\0\12\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\11\0\0\0\10\0" "\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\1\0\0\0\2\0\0\0\3\0\0\0\5\0\0\0\7\0\0\0\11\0\0\0\14\0\0\0\17\0\0\0\22" "\0\0\0\24\0\0\0\27\0\0\0\31\0\0\0\33\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34" "\0\0\0\34\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\34" "\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\33\0\0\0\31\0\0\0\27\0\0\0\24" "\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\11\0\0\0\7\0\0\0\5\0\0\0\3\0\0\0\2\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0" "\0\4\0\0\0\7\0\0\0\12\0\0\0\16\0\0\0\23\0\0\0\30\0\0\0\35\0\0\0\"\0\0\0(" "\0\0\0-\0\0\0""1\0\0\0""5\0\0\0""7\0\0\0""9\0\0\0:\0\0\0:\0\0\0:\0\0\0:\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0:\0\0\0:\0\0\0:\0\0\0:\0\0\0""9\0\0\0""7\0\0\0""5\0\0\0""1\0\0" "\0-\0\0\0(\0\0\0\"\0\0\0\35\0\0\0\30\0\0\0\23\0\0\0\16\0\0\0\12\0\0\0\7\0" "\0\0\4\0\0\0\2\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\10\0" "\0\0\14\0\0\0\22\0\0\0\31\0\0\0!\0\0\0)\0\0\0""2\0\0\0:\0\0\0B\0\0\0I\0\0" "\0P\0\0\0V\0\0\0[\0\0\0^\0\0\0`\0\0\0b\0\0\0b\0\0\0b\0\0\0b\0\0\0c\0\0\0" "c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0" "\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0" "\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0" "c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0c\0\0\0c\0\0\0c\0\0\0" "b\0\0\0b\0\0\0b\0\0\0b\0\0\0`\0\0\0^\0\0\0[\0\0\0V\0\0\0P\0\0\0I\0\0\0B\0" "\0\0:\0\0\0""2\0\0\0)\0\0\0!\0\0\0\31\0\0\0\22\0\0\0\14\0\0\0\10\0\0\0\4" "\0\0\0\2\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\2\0\0\0\4\0\0\0\7\0\0\0\14\0\0\0\23\0\0\0\34\0\0\0&\0\0\0" """2\0\0\0?\0\0\0K\0\0\0W\0\0\0a\0\0\0j\0\0\0r\0\0\0x\0\0\0~\0\0\0\203\0\0" "\0\206\0\0\0\210\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\212\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\210\0\0\0\206\0\0\0\203\0\0\0" "~\0\0\0x\0\0\0r\0\0\0j\0\0\0a\0\0\0W\0\0\0K\0\0\0?\0\0\0""2\0\0\0&\0\0\0" "\34\0\0\0\23\0\0\0\14\0\0\0\7\0\0\0\4\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\5\0\0\0\12\0\0\0\22\0\0\0\33\0\0\0(\0" "\0\0""6\0\0\0E\0\0\0V\0\0\0e\0\0\0s\0\0\0\177\0\0\0\210\0\0\0\217\0\0\0\224" "\0\0\0\230\0\0\0\233\0\0\0\236\0\0\0\241\0\0\0\243\0\0\0\244\0\0\0\244\0" "\0\0\244\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\244\0\0\0\244\0\0\0\244\0" "\0\0\243\0\0\0\241\0\0\0\236\0\0\0\233\0\0\0\230\0\0\0\224\0\0\0\217\0\0" "\0\210\0\0\0\177\0\0\0s\0\0\0e\0\0\0V\0\0\0E\0\0\0""6\0\0\0(\0\0\0\33\0\0" "\0\22\0\0\0\12\0\0\0\5\0\0\0\2\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0" "\0\0\7\0\0\0\15\0\0\0\27\0\0\0$\0\0\0""4\0\0\0F\0\0\0Y\0\0\0l\0\0\0}\0\0" "\0\214\0\0\0\227\0\0\0\237\0\0\0\244\0\0\0\245\0\0\0\245\0\0\0\244\0\0\0" "\243\0\0\0\242\0\0\0\243\0\0\0\243\0\0\0\244\0\0\0\244\0\0\0\244\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\244\0\0\0\244\0\0\0\244\0\0\0\243\0\0\0\243" "\0\0\0\242\0\0\0\243\0\0\0\244\0\0\0\245\0\0\0\245\0\0\0\244\0\0\0\237\0" "\0\0\227\0\0\0\214\0\0\0~\0\0\0m\0\0\0Z\0\0\0G\0\0\0""5\0\0\0%\0\0\0\30\0" "\0\0\16\0\0\0\10\0\0\0\4\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\11\0\0\0\20\0\0\0" "\34\0\0\0,\0\0\0?\0\0\0T\0\0\0j\0\0\0\177\0\0\0\221\0\0\0\237\0\0\0\250\0" "\0\0\255\0\0\0\255\0\0\0\252\0\0\0\244\0\0\0\235\0\0\0\226\0\0\0\220\0\0" "\0\214\0\0\0\213\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\213\0\0\0\213\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\213\0\0\0" "\214\0\0\0\220\0\0\0\226\0\0\0\235\0\0\0\244\0\0\0\252\0\0\0\255\0\0\0\255" "\0\0\0\250\0\0\0\237\0\0\0\221\0\0\0\200\0\0\0k\0\0\0U\0\0\0@\0\0\0-\0\0" "\0\35\0\0\0\21\0\0\0\12\0\0\0\5\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\11\0\0\0\22\0\0\0\40\0\0\0""3" "\0\0\0I\0\0\0a\0\0\0y\0\0\0\216\0\0\0\237\0\0\0\253\0\0\0\261\0\0\0\261\0" "\0\0\254\0\0\0\243\0\0\0\230\0\0\0\213\0\0\0\177\10\10\10x&&&\177HHH\220" "ccc\244uuu\267\200\200\200\307\206\206\206\320\206\206\206\320\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\320\206\206\206\320\200\200\200\307uuu\267" "ccc\244HHH\220&&&\177\10\10\10x\0\0\0\200\0\0\0\214\0\0\0\231\0\0\0\244\0" "\0\0\255\0\0\0\262\0\0\0\262\0\0\0\254\0\0\0\240\0\0\0\217\0\0\0z\0\0\0b" "\0\0\0J\0\0\0""5\0\0\0\"\0\0\0\24\0\0\0\13\0\0\0\6\0\0\0\2\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\12\0\0\0\24\0\0\0#\0\0\0" """7\0\0\0P\0\0\0k\0\0\0\204\0\0\0\231\0\0\0\250\0\0\0\260\0\0\0\262\0\0\0" "\255\0\0\0\242\0\0\0\225\0\0\0\205\20\20\20}JJJ\217\206\206\206\272\235\235" "\235\312\247\247\247\307\255\255\255\306\261\261\261\305\262\262\262\305" "\262\262\262\305\263\263\263\304\263\263\263\304\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\263\263\263\304\263\263\263\304\262\262\262\305\262\262\262\305" "\261\261\261\305\255\255\255\306\247\247\247\307\235\235\235\312\206\206" "\206\272JJJ\217\20\20\20}\0\0\0\206\0\0\0\226\0\0\0\243\0\0\0\256\0\0\0\263" "\0\0\0\261\0\0\0\251\0\0\0\232\0\0\0\205\0\0\0m\0\0\0R\0\0\0""9\0\0\0&\0" "\0\0\27\0\0\0\14\0\0\0\6\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4" "\0\0\0\12\0\0\0\24\0\0\0$\0\0\0:\0\0\0T\0\0\0q\0\0\0\214\0\0\0\241\0\0\0" "\256\0\0\0\262\0\0\0\256\0\0\0\244\0\0\0\225\0\0\0\204###\203uuu\256\234" "\234\234\312\255\255\255\306\272\272\272\302\307\307\307\300\316\316\316" "\276\323\323\323\275\326\326\326\274\327\327\327\274\327\327\327\274\327" "\327\327\274\330\330\330\273\330\330\330\273\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\330\330\330\273\330\330\330" "\273\327\327\327\274\327\327\327\274\327\327\327\274\326\326\326\274\323" "\323\323\275\316\316\316\276\307\307\307\300\272\272\272\302\255\255\255" "\306\234\234\234\312uuu\256###\203\0\0\0\206\0\0\0\227\0\0\0\245\0\0\0\257" "\0\0\0\263\0\0\0\257\0\0\0\242\0\0\0\216\0\0\0s\0\0\0W\0\0\0=\0\0\0'\0\0" "\0\30\0\0\0\16\0\0\0\7\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\12\0\0\0\24" "\0\0\0$\0\0\0;\0\0\0V\0\0\0t\0\0\0\220\0\0\0\246\0\0\0\261\0\0\0\261\0\0" "\0\251\0\0\0\231\0\0\0\206\37\37\37\201{{{\265\241\241\241\311\263\263\263" "\304\304\304\304\300\321\321\321\275\334\334\334\272\344\344\344\271\352" "\352\352\267\354\354\354\267\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\360\360\360\266\360\360\360\266\360" "\360\360\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\360\360\360\266\360\360\360\266\360\360\360\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\354\354\354\267\352\352\352\267\344\344\344\271\334\334\334\272\321" "\321\321\275\304\304\304\300\263\263\263\304\241\241\241\311{{{\265\37\37" "\37\201\0\0\0\211\0\0\0\233\0\0\0\253\0\0\0\263\0\0\0\263\0\0\0\250\0\0\0" "\222\0\0\0w\0\0\0Y\0\0\0?\0\0\0(\0\0\0\30\0\0\0\16\0\0\0\10\0\0\0\5\0\0\0" "\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0" "\3\0\0\0\11\0\0\0\23\0\0\0#\0\0\0:\0\0\0V\0\0\0v\0\0\0\222\0\0\0\250\0\0" "\0\263\0\0\0\261\0\0\0\245\0\0\0\220\6\6\6{```\234\237\237\237\311\264\264" "\264\304\307\307\307\300\326\326\326\274\342\342\342\271\353\353\353\267" "\360\360\360\266\365\365\365\265\367\367\367\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\374\374\374\264" "\374\374\374\264\374\374\374\264\374\374\374\264\374\374\374\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\374\374\374\264\374\374\374\264" "\374\374\374\264\374\374\374\264\374\374\374\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\367\367\367\264" "\365\365\365\265\360\360\360\266\353\353\353\267\342\342\342\271\326\326" "\326\274\307\307\307\300\264\264\264\304\237\237\237\311```\234\6\6\6{\0" "\0\0\223\0\0\0\250\0\0\0\263\0\0\0\265\0\0\0\252\0\0\0\225\0\0\0z\0\0\0Z" "\0\0\0?\0\0\0(\0\0\0\31\0\0\0\17\0\0\0\10\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\4" "\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\7\0\0\0\21\0\0\0\40\0\0\0" """7\0\0\0T\0\0\0t\0\0\0\222\0\0\0\251\0\0\0\264\0\0\0\262\0\0\0\243\0\0\0" "\213\37\37\37\200\223\223\223\312\256\256\256\305\304\304\304\300\326\326" "\326\274\343\343\343\271\354\354\354\267\363\363\363\265\367\367\367\264" "\372\372\372\264\374\374\374\264\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\374\374\374\264\372\372\372\264\367\367\367\264\363\363\363\265\354\354" "\354\267\343\343\343\271\326\326\326\274\304\304\304\300\256\256\256\305" "\223\223\223\312\37\37\37\200\0\0\0\220\0\0\0\246\0\0\0\265\0\0\0\267\0\0" "\0\254\0\0\0\225\0\0\0x\0\0\0Y\0\0\0=\0\0\0'\0\0\0\30\0\0\0\15\0\0\0\11\0" "\0\0\7\0\0\0\6\0\0\0\5\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\6\0\0\0\16\0" "\0\0\34\0\0\0""3\0\0\0P\0\0\0q\0\0\0\220\0\0\0\250\0\0\0\264\0\0\0\262\0" "\0\0\243\0\0\0\212888\213\233\233\233\313\270\270\270\303\317\317\317\275" "\340\340\340\272\353\353\353\267\363\363\363\265\367\367\367\264\374\374" "\374\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\374\374\374\264\367\367\367\264\363\363\363\265\353\353\353\267\340\340" "\340\272\317\317\317\275\270\270\270\303\233\233\233\313888\213\0\0\0\217" "\0\0\0\247\0\0\0\265\0\0\0\267\0\0\0\254\0\0\0\224\0\0\0w\0\0\0W\0\0\0:\0" "\0\0#\0\0\0\26\0\0\0\16\0\0\0\12\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\5" "\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1" "\0\0\0\4\0\0\0\12\0\0\0\27\0\0\0,\0\0\0I\0\0\0k\0\0\0\214\0\0\0\245\0\0\0" "\263\0\0\0\261\0\0\0\242\0\0\0\211EEE\223\237\237\237\312\275\275\275\302" "\324\324\324\274\346\346\346\270\360\360\360\266\367\367\367\264\374\374" "\374\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\374\374" "\374\264\367\367\367\264\360\360\360\266\346\346\346\270\324\324\324\274" "\275\275\275\302\237\237\237\312EEE\223\0\0\0\217\0\0\0\247\0\0\0\265\0\0" "\0\267\0\0\0\252\0\0\0\221\0\0\0r\0\0\0Q\0\0\0""5\0\0\0!\0\0\0\24\0\0\0\15" "\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\5\0\0\0" "\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\7\0\0\0\22\0\0\0$\0\0\0" "?\0\0\0a\0\0\0\204\0\0\0\241\0\0\0\261\0\0\0\261\0\0\0\243\0\0\0\212EEE\223" "\237\237\237\312\275\275\275\302\326\326\326\274\350\350\350\270\363\363" "\363\265\371\371\371\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\371\371\371\264\363\363\363\265\350\350\350\270\326\326\326\274\275\275" "\275\302\237\237\237\312EEE\223\0\0\0\222\0\0\0\251\0\0\0\266\0\0\0\266\0" "\0\0\247\0\0\0\213\0\0\0j\0\0\0I\0\0\0/\0\0\0\35\0\0\0\22\0\0\0\15\0\0\0" "\12\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\14\0\0\0\33\0\0\0""4\0\0\0T\0\0\0y\0" "\0\0\231\0\0\0\256\0\0\0\261\0\0\0\245\0\0\0\213888\213\235\235\235\312\275" "\275\275\302\327\327\327\274\350\350\350\270\365\365\365\265\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\376\376\376\263\376\376\376\264\376\376\377\270\377\377\377\302\377" "\377\377\305\377\377\377\275\377\377\377\265\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\365\365\365\265\350\350\350\270\327\327\327" "\274\275\275\275\302\235\235\235\312888\213\0\0\0\224\0\0\0\254\0\0\0\267" "\0\0\0\264\0\0\0\240\0\0\0\202\0\0\0_\0\0\0A\0\0\0(\0\0\0\31\0\0\0\21\0\0" "\0\16\0\0\0\14\0\0\0\13\0\0\0\12\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0" "\6\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\10\0\0\0\23\0\0\0(\0\0\0F\0\0\0j\0\0\0\216" "\0\0\0\250\0\0\0\262\0\0\0\250\0\0\0\220\37\37\37\200\233\233\233\313\273" "\273\273\302\326\326\326\274\350\350\350\270\365\365\365\265\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\264\376\376\377\264\376\376\376\265\374\375\376\266\373\375\376" "\267\372\374\376\272\371\374\376\274\370\373\376\301\371\374\376\316\375" "\376\377\342\377\377\377\347\374\375\376\325\373\374\376\276\376\376\376" "\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\365\365\365" "\265\350\350\350\270\326\326\326\274\273\273\273\302\233\233\233\313\37\37" "\37\200\0\0\0\232\0\0\0\260\0\0\0\271\0\0\0\260\0\0\0\227\0\0\0v\0\0\0T\0" "\0\0""7\0\0\0$\0\0\0\27\0\0\0\21\0\0\0\16\0\0\0\15\0\0\0\14\0\0\0\13\0\0" "\0\13\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4" "\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\14\0\0\0\34" "\0\0\0""6\0\0\0Y\0\0\0\177\0\0\0\237\0\0\0\261\0\0\0\256\0\0\0\231\6\6\6" "|\223\223\223\312\270\270\270\303\324\324\324\274\350\350\350\270\365\365" "\365\265\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\264\376\376\377\264\376\376\376\265\374\375\376\267" "\372\374\376\272\367\373\376\274\365\372\376\300\363\371\376\303\360\367" "\375\310\353\365\375\316\345\362\374\325\336\357\374\335\331\355\374\343" "\327\355\374\352\342\362\375\362\365\374\376\373\373\375\376\375\351\362" "\371\360\333\350\366\326\347\360\371\300\373\374\376\265\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\375\375\375\263\372\372\372\264\365\365\365\265\350\350\350\270" "\324\324\324\274\270\270\270\303\223\223\223\312\6\6\6|\0\0\0\244\0\0\0\267" "\0\0\0\271\0\0\0\250\0\0\0\213\0\0\0h\0\0\0G\0\0\0.\0\0\0\37\0\0\0\26\0\0" "\0\23\0\0\0\20\0\0\0\17\0\0\0\15\0\0\0\15\0\0\0\13\0\0\0\13\0\0\0\11\0\0" "\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\2\0\0\0\7\0\0\0\22\0\0\0'\0\0\0F\0\0\0l\0\0\0\221\0\0\0\253\0" "\0\0\262\0\0\0\244\0\0\0\206```\234\256\256\256\305\317\317\317\275\346\346" "\346\270\363\363\363\265\372\372\372\264\375\375\375\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\264\377\377\377\264\377\377\377\264\376\376\376\265\375\376" "\376\267\371\374\376\272\365\372\376\276\362\370\375\303\357\366\375\307" "\354\365\375\315\347\363\374\323\342\360\374\333\333\355\374\342\322\352" "\373\351\313\351\373\360\307\347\373\364\304\347\374\367\277\346\374\371" "\267\343\374\373\257\342\373\375\253\342\373\376\266\347\374\377\332\363" "\375\377\336\357\370\377\260\324\353\376\226\301\345\367\250\311\352\347" "\316\337\363\313\352\361\372\274\374\375\376\264\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\363\363\363\265\346\346\346\270\317\317\317\275\256\256" "\256\305```\234\0\0\0\225\0\0\0\257\0\0\0\273\0\0\0\265\0\0\0\235\0\0\0|" "\0\0\0Y\0\0\0<\0\0\0'\0\0\0\34\0\0\0\26\0\0\0\23\0\0\0\22\0\0\0\20\0\0\0" "\17\0\0\0\15\0\0\0\15\0\0\0\13\0\0\0\12\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6" "\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\12\0\0\0\31\0\0\0" """2\0\0\0V\0\0\0}\0\0\0\237\0\0\0\261\0\0\0\255\0\0\0\225\37\37\37\201\237" "\237\237\311\304\304\304\300\340\340\340\272\360\360\360\266\371\371\371" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\376\376\264\373\375\376" "\267\372\374\376\271\371\374\376\273\367\372\376\276\360\367\375\305\352" "\364\375\313\345\362\374\321\340\360\374\326\334\356\374\335\330\355\374" "\344\322\352\373\352\312\351\373\360\302\345\373\365\271\343\373\373\264" "\342\373\375\260\342\373\375\253\341\373\376\245\340\373\376\237\337\373" "\377\231\336\373\377\223\335\373\377\216\334\373\377\216\333\373\377\216" "\333\373\377\216\333\373\377\224\335\373\377\263\345\372\377\220\311\345" "\377:\233\315\3771\225\314\377T\243\324\376\177\263\337\370\241\305\350\346" "\301\330\357\321\343\355\370\277\370\372\375\266\376\376\376\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\375\375\375\263\371\371\371\264" "\360\360\360\266\340\340\340\272\304\304\304\300\237\237\237\311\37\37\37" "\201\0\0\0\244\0\0\0\270\0\0\0\273\0\0\0\253\0\0\0\215\0\0\0j\0\0\0I\0\0" "\0""1\0\0\0\"\0\0\0\33\0\0\0\27\0\0\0\25\0\0\0\24\0\0\0\22\0\0\0\20\0\0\0" "\17\0\0\0\15\0\0\0\14\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\5" "\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\5\0\0\0\17\0\0\0!\0\0\0?\0\0\0e\0\0\0\214" "\0\0\0\250\0\0\0\260\0\0\0\243\0\0\0\203{{{\265\264\264\264\304\326\326\326" "\274\353\353\353\267\367\367\367\264\374\374\374\264\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\376\376\264\352\364\375\305\331\355\374\327\325\354\373\336\320" "\351\373\345\314\350\373\352\306\347\372\360\277\345\372\364\270\343\372" "\370\260\341\372\373\251\337\372\376\243\336\372\377\237\336\372\377\234" "\336\372\377\230\335\372\377\223\334\372\377\217\333\372\377\213\332\372" "\377\212\332\372\377\212\332\372\377\212\332\372\377\212\332\372\377\212" "\332\372\377\212\332\372\377\212\332\372\377\212\332\372\377\212\332\372" "\377\213\332\372\377\240\336\370\377g\265\333\377\21\207\303\377\0~\276\377" "\10\201\300\377+\220\311\377P\237\321\376u\257\333\367\223\275\344\347\271" "\323\355\320\356\364\372\271\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\374\374\374\264\367\367\367\264\353\353\353\267\326" "\326\326\274\264\264\264\304{{{\265\0\0\0\227\0\0\0\261\0\0\0\274\0\0\0\265" "\0\0\0\235\0\0\0z\0\0\0X\0\0\0=\0\0\0*\0\0\0\40\0\0\0\33\0\0\0\31\0\0\0\26" "\0\0\0\25\0\0\0\23\0\0\0\22\0\0\0\17\0\0\0\16\0\0\0\15\0\0\0\13\0\0\0\12" "\0\0\0\10\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0" "\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\7\0\0\0\23\0\0\0" "*\0\0\0K\0\0\0s\0\0\0\227\0\0\0\255\0\0\0\253\0\0\0\225###\203\241\241\241" "\311\307\307\307\300\342\342\342\271\363\363\363\265\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\373\375\376\266\325\352\374\332\261" "\337\371\371\247\336\370\373\241\334\370\375\233\333\370\376\225\332\370" "\377\222\331\370\377\220\331\370\377\216\331\370\377\213\330\370\377\211" "\327\370\377\210\330\370\377\207\327\370\377\210\327\370\377\210\330\370" "\377\210\330\370\377\210\330\370\377\210\330\370\377\210\330\370\377\210" "\327\370\377\210\330\370\377\207\327\370\377\210\327\370\377\210\330\370" "\377\210\330\370\377\210\330\370\377\210\330\370\377\232\333\366\377_\261" "\332\377\16\204\301\377\0}\275\377\0}\274\377\2}\275\377\16\203\300\377%" "\214\306\377H\232\317\375v\253\335\357\317\340\363\304\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\363\363\363\265\342\342\342\271\307\307\307\300\241\241\241\311###\203" "\0\0\0\250\0\0\0\272\0\0\0\273\0\0\0\250\0\0\0\211\0\0\0g\0\0\0I\0\0\0""2" "\0\0\0&\0\0\0!\0\0\0\35\0\0\0\33\0\0\0\31\0\0\0\26\0\0\0\24\0\0\0\22\0\0" "\0\21\0\0\0\17\0\0\0\15\0\0\0\14\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0" "\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\3\0\0\0\12\0\0\0\30\0\0\0""2\0\0\0W\0\0\0\177\0\0\0\240\0\0\0\255" "\0\0\0\243\0\0\0\205uuu\256\263\263\263\304\326\326\326\274\353\353\353\267" "\367\367\367\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\372\374\376\267\321\351\373\337\233\331\370\377\211\326\366\377\206\325" "\366\377\205\325\366\377\204\325\366\377\204\325\366\377\204\325\366\377" "\204\325\366\377\204\325\366\377\204\325\366\377\204\325\366\377\204\325" "\366\377\204\325\366\377\204\325\366\377\204\325\366\377\204\325\366\377" "\204\325\366\377\204\325\366\377\204\325\366\377\204\325\366\377\204\325" "\366\377\204\325\366\377\204\325\366\377\204\325\366\377\204\325\366\377" "\204\325\366\377\226\330\364\377\\\256\330\377\15\203\300\377\0|\274\377" "\0|\273\377\0|\273\377\0|\273\377\3|\273\377\35\207\303\377^\240\326\366" "\307\333\361\307\376\376\376\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\375\375\375\263\367\367\367\264\353\353\353\267" "\326\326\326\274\263\263\263\304uuu\256\0\0\0\236\0\0\0\265\0\0\0\275\0\0" "\0\262\0\0\0\226\0\0\0t\0\0\0S\0\0\0;\0\0\0.\0\0\0&\0\0\0!\0\0\0\37\0\0\0" "\34\0\0\0\32\0\0\0\30\0\0\0\26\0\0\0\24\0\0\0\22\0\0\0\17\0\0\0\16\0\0\0" "\14\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0" "\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\14\0\0\0\36\0\0\0;\0" "\0\0a\0\0\0\211\0\0\0\244\0\0\0\252\0\0\0\230\20\20\20}\234\234\234\312\304" "\304\304\300\342\342\342\271\362\362\362\266\372\372\372\264\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\372\374\376\267\321\351\373" "\337\226\327\367\377\201\323\365\377\177\312\352\377\200\311\350\377\200" "\322\364\377\200\322\365\377\200\322\365\377\200\322\365\377\200\322\365" "\377\200\322\365\377\200\322\365\377\200\322\365\377\200\322\365\377\200" "\322\365\377\200\322\365\377\200\322\365\377\200\322\365\377\200\322\365" "\377\200\322\365\377\200\322\365\377\200\322\365\377\200\322\365\377\200" "\322\365\377\200\322\365\377\200\322\365\377\200\322\365\377\222\326\363" "\377X\254\326\377\15\202\276\377\0{\273\377\0{\272\377\0{\272\377\0{\272" "\377\0{\272\377\27\204\301\377]\237\325\366\310\334\361\307\376\376\376\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\372\372\372\264\362\362\362\266\342\342\342\271\304\304\304\300" "\234\234\234\312\20\20\20}\0\0\0\257\0\0\0\274\0\0\0\267\0\0\0\241\0\0\0" "\200\0\0\0_\0\0\0F\0\0\0""5\0\0\0+\0\0\0&\0\0\0#\0\0\0\40\0\0\0\36\0\0\0" "\33\0\0\0\31\0\0\0\26\0\0\0\24\0\0\0\22\0\0\0\20\0\0\0\16\0\0\0\15\0\0\0" "\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\1\0\0\0\5\0\0\0\17\0\0\0#\0\0\0C\0\0\0j\0\0\0\217\0\0" "\0\246\0\0\0\244\0\0\0\213III\217\255\255\255\306\321\321\321\275\352\352" "\352\267\367\367\367\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\372\374\376\270\320\350\372\340\224\325\365\377" "~\317\362\377\202\301\335\377\233\265\303\377\217\310\341\377\201\314\356" "\377}\316\362\377}\316\362\377}\317\363\377}\316\362\377}\317\362\377|\316" "\362\377|\316\362\377|\316\362\377|\316\362\377|\316\362\377|\316\362\377" "|\317\363\377|\316\362\377|\317\362\377|\316\362\377|\316\362\377|\316\362" "\377|\316\362\377|\316\362\377|\316\362\377\214\322\360\377T\251\324\377" "\14\201\275\377\0{\272\377\0{\272\377\0{\271\377\0z\271\377\0z\271\377\27" "\203\300\377]\237\325\366\310\334\361\307\376\376\376\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\203\203\203\321\10\10\10\373EEE\344\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263ppp\327\7\7\7\374aaa\334\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\371\371\371\264fff\332\15\15\15\372TTT\340\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\367\367\367\264\352\352\352\267\321\321\321\275\255" "\255\255\306III\217\0\0\0\250\0\0\0\272\0\0\0\273\0\0\0\250\0\0\0\212\0\0" "\0j\0\0\0O\0\0\0<\0\0\0""2\0\0\0,\0\0\0(\0\0\0%\0\0\0\"\0\0\0\40\0\0\0\35" "\0\0\0\32\0\0\0\27\0\0\0\25\0\0\0\22\0\0\0\20\0\0\0\16\0\0\0\15\0\0\0\13" "\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\2\0\0\0\7\0\0\0\22\0\0\0(\0\0\0J\0\0\0r\0\0\0\225\0\0\0\245\0\0" "\0\235\0\0\0\177\206\206\206\272\272\272\272\302\333\333\333\273\360\360" "\360\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\371\374\376\270\317\350\372\341\220\323\363\377" "z\314\361\377\202\302\337\377\271\314\326\377\313\330\341\377\242\313\336" "\377\205\311\347\377z\313\356\377x\314\360\377y\314\361\377y\314\361\377" "y\314\361\377y\314\361\377y\314\361\377y\314\361\377y\314\361\377y\314\361" "\377y\314\361\377y\314\361\377y\314\361\377y\314\361\377y\314\361\377y\314" "\361\377y\314\361\377x\314\361\377x\314\361\377\207\317\357\377P\247\323" "\377\13\200\274\377\0z\271\377\0z\271\377\0z\270\377\0z\270\377\0z\270\377" "\27\203\277\377]\237\324\366\310\334\361\307\376\376\376\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\13\13\13\373\0\0\0\377\1\1\1\377\374\374\374\264\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263EEE\345\7\7\7\374555\352\363\363\363\265\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\11\11\11\373\0\0\0\377\10\10\10\374\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\353\353\353\267333\353\0\0\0\377\0\0\0\377\5\5\5\375\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375" "\263\372\372\372\264\360\360\360\266\333\333\333\273\272\272\272\302\206" "\206\206\272\0\0\0\243\0\0\0\270\0\0\0\275\0\0\0\260\0\0\0\224\0\0\0u\0\0" "\0X\0\0\0D\0\0\0""9\0\0\0""2\0\0\0-\0\0\0)\0\0\0'\0\0\0$\0\0\0\40\0\0\0\35" "\0\0\0\33\0\0\0\30\0\0\0\25\0\0\0\23\0\0\0\21\0\0\0\17\0\0\0\15\0\0\0\13" "\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\2\0\0\0\10\0\0\0\25\0\0\0-\0\0\0P\0\0\0x\0\0\0\230\0\0\0\244\0\0\0\226\10" "\10\10x\235\235\235\312\305\305\305\300\343\343\343\271\365\365\365\265\374" "\374\374\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\371\374\376\270\317\347\372\341\215\321\363\377u\312\357\377" "\177\301\336\377\276\320\333\377\351\360\367\377\327\343\353\377\263\320" "\337\377\215\310\342\377x\310\353\377u\311\357\377u\312\357\377t\312\357" "\377t\312\357\377t\312\357\377t\312\357\377t\312\357\377u\312\357\377u\312" "\357\377t\311\357\377u\311\357\377t\311\357\377t\311\357\377t\311\357\377" "t\311\357\377t\311\357\377t\311\357\377\202\314\355\377L\244\321\377\12\177" "\273\377\0y\270\377\0y\267\377\0y\267\377\0y\267\377\0y\266\377\27\202\276" "\377]\237\324\366\310\334\361\307\376\376\376\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\362\362\362\266ppp\327\35\35\35\363\4\4\4\376111\353\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\343\343\343\271>>>\347\7\7\7\374\\\\" "\\\335\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\256\256\256\305```\334...\355\17\17\17\370\3" "\3\3\376\6\6\6\375\24\24\24\366:::\351\203\203\203\321\362\362\362\266\377" "\377\377\263\377\377\377\263\377\377\377\263vvv\325\10\10\10\374aaa\334\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\372\372\372" "\264\264\264\264\304ooo\327>>>\347\36\36\36\363\11\11\11\373\2\2\2\376\10" "\10\10\373(((\357\227\227\227\313\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\360\360\360\266\243\243" "\243\310aaa\334...\355\14\14\14\372\2\2\2\376...\355\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\362\362\362\266ppp\327\35\35\35\363\4\4\4\376111\353\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "hhh\331\11\11\11\373\217\217\217\316\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\5\5\5\375\0\0\0\377\0\0\0\377" "\344\344\344\271\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263333\353\0\0\0\377\0\0\0\377" "UUU\337\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263]]]\334\4\4\4\376\13\13\13\372" "\27\27\27\365\36\36\36\363!!!\361\"\"\"\361###\361&&&\360***\356888\351i" "ii\331\353\353\353\267\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\4\4\4\376\0\0\0\377\2\2\2\376\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\333\333\333\273\"\"\"\361" "\0\0\0\377\0\0\0\377\0\0\0\377333\353\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\374\374\374" "\264\365\365\365\265\343\343\343\271\305\305\305\300\235\235\235\312\10\10" "\10x\0\0\0\265\0\0\0\276\0\0\0\265\0\0\0\235\0\0\0}\0\0\0`\0\0\0L\0\0\0?" "\0\0\0""7\0\0\0""2\0\0\0.\0\0\0,\0\0\0(\0\0\0%\0\0\0\"\0\0\0\36\0\0\0\33" "\0\0\0\31\0\0\0\26\0\0\0\23\0\0\0\21\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\11" "\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\11\0\0\0\27" "\0\0\0""1\0\0\0V\0\0\0~\0\0\0\234\0\0\0\243\0\0\0\220&&&\177\247\247\247" "\307\316\316\316\276\350\350\350\270\367\367\367\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\370" "\373\376\271\316\347\372\341\213\317\362\377r\307\356\377}\277\336\377\276" "\320\333\377\355\365\374\377\355\365\374\377\342\352\362\377\304\327\342" "\377\226\307\336\377y\305\350\377q\306\355\377q\307\356\377q\307\356\377" "q\307\356\377q\307\356\377q\307\356\377p\307\356\377p\307\356\377p\306\356" "\377p\306\356\377p\306\356\377p\306\356\377p\306\356\377p\306\356\377p\306" "\356\377p\306\356\377}\310\354\377H\242\317\377\11~\272\377\0y\267\377\0" "y\266\377\0x\266\377\0x\266\377\0x\266\377\27\201\274\377]\237\324\366\310" "\334\361\307\376\376\376\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\304\304\304\300\34\34" "\34\364\0\0\0\377\0\0\0\377\0\0\0\377\34\34\34\363\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\357\357\357\266\"\"\"\361\0\0\0\377\0\0\0\377\7\7\7\374***\356\11\11\11" "\373777\352\254\254\254\306\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\360\360" "\360\266///\355\26\26\26\365\340\340\340\272\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\366\366\366\265JJJ\343\10\10" "\10\373\226\226\226\314\377\377\377\263\377\377\377\263\353\353\353\267m" "mm\330\26\26\26\365\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\32\32\32\364\316\316\316\276\377\377" "\377\263\377\377\377\263\16\16\16\371\0\0\0\377\5\5\5\375\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\344\344" "\344\271\271\271\271\303\215\215\215\316```\334555\352\26\26\26\366\4\4\4" "\375\5\5\5\375888\351\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\374\374\374\264\237\237\237\311GGG\344\13\13" "\13\372\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377\10\10\10\373\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\357\357" "\357\266\206\206\206\320666\352\5\5\5\375\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\10\10\10\373\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263```\334\10\10\10\373bbb\333\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\304\304\304\300\34\34\34\364\0\0\0\377\0\0\0\377\0\0" "\0\377\34\34\34\363\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\6\6\6\374\0\0\0\377\26\26\26\365\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\25\25\25" "\366\0\0\0\377\0\0\0\377\302\302\302\301\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\360\360\360\266///\355\26" "\26\26\365\340\340\340\272\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\366\366\366\265JJJ\343\10\10\10\373\226\226\226" "\314\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263TTT\337\6\6\6\374&&&\360\3\3\3\376\1\1\1\377" "\264\264\264\304\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\12\12\12\373\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377&&&\360\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\15\15\15\371\0\0\0\377\10\10\10\374\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\262\262\262\305\23\23\23\367" "\0\0\0\377\0\0\0\377\0\0\0\377III\343\352\352\352\267\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\367\367\367\264\350\350\350\270\316\316\316\276\247" "\247\247\307&&&\177\0\0\0\264\0\0\0\300\0\0\0\272\0\0\0\244\0\0\0\206\0\0" "\0i\0\0\0S\0\0\0E\0\0\0=\0\0\0""7\0\0\0""4\0\0\0""0\0\0\0,\0\0\0)\0\0\0%" "\0\0\0\"\0\0\0\37\0\0\0\33\0\0\0\31\0\0\0\26\0\0\0\23\0\0\0\20\0\0\0\16\0" "\0\0\14\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2" "\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3" "\0\0\0\12\0\0\0\31\0\0\0""5\0\0\0[\0\0\0\203\0\0\0\237\0\0\0\243\0\0\0\215" "HHH\220\255\255\255\306\323\323\323\275\354\354\354\267\371\371\371\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\370\373\376\271\316\347\372\342\210\315\360\377l\304\354\377" "y\275\334\377\275\320\333\377\355\365\374\377\357\367\376\377\357\367\376" "\377\353\363\371\377\327\342\351\377\254\315\336\377\205\304\342\377q\303" "\351\377l\303\353\377k\303\354\377k\303\354\377k\303\354\377k\303\354\377" "k\303\354\377k\303\354\377k\303\354\377k\303\354\377k\303\354\377k\303\354" "\377k\303\354\377k\303\354\377k\302\354\377w\305\352\377E\237\315\377\11" "}\270\377\0x\266\377\0x\266\377\0x\265\377\0x\265\377\0w\264\377\27\201\274" "\377]\237\324\366\310\334\361\307\376\376\376\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\267\267\267\303" "\12\12\12\373\0\0\0\377\0\0\0\377\0\0\0\377\"\"\"\361\314\314\314\276\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\\\\\\\335\0\0\0\377\0\0\0\377\0\0\0\377GGG\344\4\4\4" "\375\0\0\0\377\0\0\0\377\0\0\0\377]]]\334\375\375\375\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263777\351\0" "\0\0\377\0\0\0\377MMM\342\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263www\325\0\0\0\377\0\0\0\377+++\356\377\377\377\263" "\214\214\214\317\15\15\15\371\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377###" "\361\271\271\271\303\366\366\366\265\352\352\352\267\234\234\234\312\34\34" "\34\364\0\0\0\377\0\0\0\377///\354\377\377\377\263\377\377\377\263\1\1\1" "\377\0\0\0\377\15\15\15\371\377\377\377\263\377\377\377\263\377\377\377\263" "@@@\347\4\4\4\376\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0\377\34\34\34\364\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263444\353\0\0\0\377\0\0\0\377\0" "\0\0\377\10\10\10\374EEE\345\214\214\214\317\322\322\322\275\371\371\371" "\264\277\277\277\301\0\0\0\377\0\0\0\377***\356\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\217" "\217\217\316\15\15\15\372\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377YYY\336\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\4\4\4\375\0\0\0\377\1\1\1\376\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\267\267\267\303\12\12\12\373\0\0\0\377\0\0\0\377\0\0\0\377" "\"\"\"\361\314\314\314\276\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\10\10\10\373\0\0\0\377\1\1\1\377\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "---\355\0\0\0\377\0\0\0\377\235\235\235\312\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263777\351\0\0\0\377\0\0\0\377" "MMM\342\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263www\325\0\0\0\377\0\0\0\377+++\356\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\4\4\4\376\0" "\0\0\377\6\6\6\374jjj\331\0\0\0\377(((\357\375\375\375\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263;;;\350\0" "\0\0\377\0\0\0\377\0\0\0\377\360\360\360\266\374\374\374\264\375\375\375" "\263\365\365\365\265\323\323\323\275ttt\326\0\0\0\377\0\0\0\377\15\15\15" "\371\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\32\32" "\32\364\0\0\0\377\16\16\16\371\377\377\377\263\377\377\377\263\375\375\375" "\263uuu\325\3\3\3\376\0\0\0\377\0\0\0\377\22\22\22\370\234\234\234\312\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\371" "\371\371\264\354\354\354\267\323\323\323\275\255\255\255\306HHH\220\0\0\0" "\265\0\0\0\303\0\0\0\277\0\0\0\253\0\0\0\216\0\0\0q\0\0\0Z\0\0\0L\0\0\0C" "\0\0\0=\0\0\0:\0\0\0""5\0\0\0""1\0\0\0.\0\0\0)\0\0\0&\0\0\0\"\0\0\0\37\0" "\0\0\33\0\0\0\31\0\0\0\25\0\0\0\23\0\0\0\20\0\0\0\16\0\0\0\14\0\0\0\12\0" "\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\12\0\0\0\33\0\0\0""7" "\0\0\0^\0\0\0\206\0\0\0\241\0\0\0\243\0\0\0\213ccc\244\261\261\261\305\326" "\326\326\274\356\356\356\267\371\371\371\264\375\375\375\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\370\373\376" "\271\316\347\372\342\205\313\357\377h\301\352\377v\272\333\377\275\317\333" "\377\355\365\374\377\357\367\376\377\357\367\376\377\357\367\376\377\354" "\364\373\377\335\347\357\377\274\325\342\377\222\306\337\377s\300\344\377" "h\300\352\377h\300\352\377h\300\352\377h\300\352\377h\300\352\377h\300\352" "\377h\300\352\377g\300\352\377g\300\352\377f\300\352\377f\300\352\377f\300" "\352\377g\277\352\377r\302\350\377A\235\314\377\11|\267\377\0x\265\377\0" "w\264\377\0w\264\377\0w\263\377\0w\263\377\27\200\273\377]\237\323\366\310" "\334\361\307\376\376\376\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\311\311\311\277\13\13\13\372\0\0\0\377\0\0\0\377\22" "\22\22\367\213\213\213\317\374\374\374\264\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\342\342" "\342\271\5\5\5\375\0\0\0\377...\355\375\375\375\263\377\377\377\263777\352" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377YYY\336\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\16\16\16\371\0\0\0\377" "\0\0\0\377\1\1\1\376\275\275\275\302\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\367\367\367\264\24\24\24\366\0\0\0\377\0\0\0\377\11\11\11\373\377\377" "\377\263\10\10\10\373\0\0\0\377\0\0\0\377\32\32\32\364\0\0\0\377\0\0\0\377" "***\356\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\307" "\307\307\300\0\0\0\377\0\0\0\377\5\5\5\375\377\377\377\263\377\377\377\263" "\3\3\3\376\0\0\0\377\36\36\36\363\377\377\377\263\377\377\377\263\377\377" "\377\263\37\37\37\362\10\10\10\374!!!\362EEE\345nnn\327\231\231\231\313\300" "\300\300\301\237\237\237\312\0\0\0\377\0\0\0\377ooo\327\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263OOO\341\0\0\0" "\377\0\0\0\377\0\0\0\377\340\340\340\272\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\211\211\211\317\0\0\0\377\5\5\5\375\272" "\272\272\302\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\26\26\26\366\22\22\22\370000\354PPP" "\341sss\326\227\227\227\313\275\275\275\302\326\326\326\274\354\354\354\267" "\374\374\374\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\202\202\202\321\6\6\6\374)))\356\304\304\304\300" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\0\0\0\377\0\0\0\377\1\1\1\377\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\311\311\311\277\13\13" "\13\372\0\0\0\377\0\0\0\377\22\22\22\367\213\213\213\317\374\374\374\264" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\34\34\34\364\0\0\0\377\0\0\0\377\374\374\374\264" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263KKK\343\0" "\0\0\377\0\0\0\377zzz\324\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\16\16\16\371\0\0\0\377\0\0\0\377\1\1\1\376" "\275\275\275\302\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\367\367\367\264" "\24\24\24\366\0\0\0\377\0\0\0\377\11\11\11\373\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\10\10" "\10\373\0\0\0\377\14\14\14\372\366\366\366\265\34\34\34\364\0\0\0\377\227" "\227\227\314\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263zzz\324\0\0\0\377\0\0\0\377\0\0\0\377\367\367\367\264" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\277\277" "\277\301\0\0\0\377\0\0\0\377TTT\337\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263)))\357\0\0\0\377\22\22\22\367\377\377\377\263\342" "\342\342\271:::\351\0\0\0\377\0\0\0\377\0\0\0\377KKK\343\350\350\350\270" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\375\375\375\263\371\371\371\264\356\356\356\267\326\326\326\274\261\261" "\261\305ccc\244\0\0\0\267\0\0\0\305\0\0\0\303\0\0\0\260\0\0\0\224\0\0\0w" "\0\0\0b\0\0\0Q\0\0\0I\0\0\0C\0\0\0>\0\0\0:\0\0\0""6\0\0\0""2\0\0\0.\0\0\0" "*\0\0\0&\0\0\0\"\0\0\0\37\0\0\0\33\0\0\0\30\0\0\0\25\0\0\0\22\0\0\0\17\0" "\0\0\15\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0" "\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0" "\13\0\0\0\34\0\0\0""9\0\0\0a\0\0\0\211\0\0\0\243\0\0\0\244\0\0\0\213uuu\267" "\262\262\262\305\327\327\327\274\356\356\356\267\371\371\371\264\375\375" "\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\367\373\376\272\314\346\372\343\202\311\356\377d\276\350\377r\270" "\332\377\274\317\333\377\355\365\374\377\357\367\376\377\357\367\376\377" "\357\367\376\377\357\367\376\377\355\365\374\377\344\355\365\377\315\335" "\350\377\243\312\335\377t\275\340\377d\275\347\377c\275\350\377c\275\350" "\377c\275\350\377c\275\350\377c\275\350\377c\275\350\377b\275\350\377b\275" "\350\377b\275\350\377b\275\350\377b\275\350\377m\276\346\377=\233\312\377" "\10{\266\377\0v\263\377\0v\263\377\0v\262\377\0u\262\377\0u\262\377\27\200" "\272\377]\236\323\366\310\334\361\307\376\376\376\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\362\362\362\266\36\36\36\363\0\0\0\377\0\0\0" "\377777\351\352\352\352\267\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263|||\323\0\0\0\377\0\0\0\377www\325\377\377\377\263\377\377\377\263" "\366\366\366\265|||\323\10\10\10\373\0\0\0\377\0\0\0\377\0\0\0\377\233\233" "\233\313\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "666\352\0\0\0\377\0\0\0\377\0\0\0\377///\355\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\211\211\211\317\0\0\0\377\0\0\0\377\0\0\0\377\1\1\1\377\377" "\377\377\263\220\220\220\316```\334\256\256\256\305\375\375\375\263\3\3\3" "\376\0\0\0\377\16\16\16\371\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\365\365\365\265\0\0\0\377\0\0\0\377\22\22\22\367\377\377" "\377\263\377\377\377\263\6\6\6\375\0\0\0\377...\355\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263;;;\350\0" "\0\0\377\14\14\14\372\352\352\352\267\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\13\13\13\373" "\0\0\0\377\0\0\0\377\334\334\334\272\377\377\377\263\377\377\377\263\377" "\377\377\263\217\217\217\316\4\4\4\375\6\6\6\374\237\237\237\312\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263TTT\340\7\7\7\374%%%\360\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\30\30\30\365\0\0\0\377\0\0\0\377\11\11\11" "\373\244\244\244\310\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\0\0\0\377\0\0\0\377\2\2\2\376\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\362\362\362\266\36\36\36\363\0\0" "\0\377\0\0\0\377777\351\352\352\352\267\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263666\352\0\0\0\377\0\0\0\377\363\363\363\265\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263mmm\330\0\0\0\377\0\0" "\0\377YYY\336\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263666\352\0\0\0\377\0\0\0\377\0\0\0\377///\355\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\211\211\211\317\0\0\0\377\0\0\0\377\0\0" "\0\377\1\1\1\377\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\353\353\353\267\0\0\0\377\0\0\0\377+++\356\377\377" "\377\263\234\234\234\312\0\0\0\377!!!\361\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\243\243\243\310\0\0\0\377" "\0\0\0\377\0\0\0\377\356\356\356\267\377\377\377\263\377\377\377\263\377" "\377\377\263\353\353\353\267\35\35\35\363\0\0\0\377\21\21\21\370\343\343" "\343\271\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" ":::\351\0\0\0\377\25\25\25\366\220\220\220\316\17\17\17\370\0\0\0\377\0\0" "\0\377\24\24\24\366\243\243\243\310\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375" "\375\263\371\371\371\264\356\356\356\267\327\327\327\274\262\262\262\305" "uuu\267\0\0\0\272\0\0\0\310\0\0\0\306\0\0\0\265\0\0\0\232\0\0\0}\0\0\0h\0" "\0\0Y\0\0\0O\0\0\0I\0\0\0D\0\0\0@\0\0\0<\0\0\0""7\0\0\0""3\0\0\0.\0\0\0*" "\0\0\0&\0\0\0\"\0\0\0\36\0\0\0\33\0\0\0\27\0\0\0\24\0\0\0\22\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0" "\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\34" "\0\0\0:\0\0\0b\0\0\0\212\0\0\0\244\0\0\0\245\0\0\0\213\200\200\200\307\262" "\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\367\373\376\272\313\346\371\343\177\306\354\377`\273\346\377o\266\330" "\377\273\317\332\377\355\365\374\377\357\367\376\377\357\367\376\377\357" "\367\376\377\357\367\376\377\357\367\376\377\356\366\375\377\352\363\372" "\377\334\347\356\377\257\315\335\377\177\276\334\377d\272\344\377_\272\346" "\377_\272\346\377^\272\346\377^\272\346\377^\272\346\377^\272\346\377^\272" "\346\377^\272\346\377^\272\346\377^\272\346\377h\273\344\3779\230\311\377" "\7z\265\377\0v\262\377\0u\261\377\0u\261\377\0u\261\377\0u\261\377\27\177" "\271\377]\236\323\366\310\334\361\307\376\376\376\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263ddd\333\0\0\0\377\0\0\0\377888\351\371\371\371" "\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263<<<\347\0\0\0\377\0\0\0\377\254\254\254\306\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\300\300\300\301\15\15\15\371\0\0\0\377" "\0\0\0\377\30\30\30\365\371\371\371\264\377\377\377\263\377\377\377\263\377" "\377\377\263<<<\347\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\221\221\221\315" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\374\374\374\264\35\35\35\363\1\1\1\377\0\0\0\377\0\0\0\377\0\0\0" "\377\366\366\366\265\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\15\15\15\371\0\0\0\377\1\1\1\377\372\372\372\264\377\377\377" "\263\377\377\377\263\377\377\377\263\266\266\266\304\0\0\0\377\0\0\0\377" "QQQ\340\377\377\377\263\377\377\377\263\12\12\12\373\0\0\0\377<<<\350\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\267" "\267\267\303\0\0\0\377\0\0\0\377ooo\327\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263+++\356\0\0\0\377\0\0\0\377\266\266\266\304\377\377\377\263\344\344\344" "\271KKK\343\0\0\0\377$$$\360\302\302\302\301\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\2\2\2\376\0\0\0\377\0\0\0\377\0\0\0\377" "\3\3\3\376\211\211\211\320\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\0\0\0\377" "\0\0\0\377\3\3\3\376\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263ddd\333\0\0\0\377\0\0\0\377888\351\371\371\371" "\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263VVV\337\0\0\0\377\0\0\0\377\346\346\346\270\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\221\221\221\315\0\0\0\377\0\0\0\377" "\1\1\1\376FFF\344\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263<<<\347\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\221\221\221\315\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\374\374\374\264\35\35\35\363\1\1\1\377\0\0\0\377\0\0\0\377\0\0\0\377" "\366\366\366\265\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\252\252\252\307\0\0\0\377\0\0\0\377\\\\\\\335\377\377\377\263\377" "\377\377\263)))\357\0\0\0\377\247\247\247\307\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\316\316\316\276\0\0\0\377\0\0\0\377" "\0\0\0\377\343\343\343\271\377\377\377\263\377\377\377\263\367\367\367\264" "444\352\0\0\0\377\7\7\7\374\267\267\267\303\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263KKK\342\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\1\1\1\377QQQ\340\354\354\354\267\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\200\200\200\307\0\0\0\275\0\0\0\313" "\0\0\0\311\0\0\0\271\0\0\0\237\0\0\0\203\0\0\0m\0\0\0^\0\0\0U\0\0\0P\0\0" "\0J\0\0\0E\0\0\0A\0\0\0<\0\0\0""7\0\0\0""3\0\0\0.\0\0\0)\0\0\0%\0\0\0\"\0" "\0\0\35\0\0\0\32\0\0\0\26\0\0\0\24\0\0\0\21\0\0\0\16\0\0\0\14\0\0\0\12\0" "\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\34\0\0\0:\0\0\0c\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\366\372\376\272\313" "\345\370\344{\304\352\377[\267\344\377k\263\327\377\273\316\332\377\355\365" "\374\377\357\367\376\377\357\367\376\377\357\367\376\377\357\367\376\377" "\357\367\376\377\357\367\376\377\357\367\376\377\356\366\375\377\343\355" "\364\377\306\331\344\377\225\303\333\377j\270\337\377[\266\343\377Z\266\344" "\377Z\266\344\377Z\266\344\377Z\266\344\377Z\266\344\377Z\266\344\377Z\266" "\344\377Z\266\344\377b\270\342\3776\226\306\377\7y\263\377\0u\261\377\0u" "\261\377\0u\260\377\0t\260\377\0t\260\377\27\177\271\377]\236\323\366\310" "\334\361\307\376\376\376\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\332\332\332" "\273\5\5\5\375\0\0\0\377\23\23\23\367\353\353\353\267\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\30\30" "\30\365\0\0\0\377\0\0\0\377\323\323\323\275\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\252\252\252\307\1\1\1\377" "\0\0\0\377\0\0\0\377\226\226\226\314\377\377\377\263\377\377\377\263\377" "\377\377\263EEE\345\0\0\0\377\4\4\4\376\12\12\12\373\0\0\0\377\23\23\23\367" "\356\356\356\267\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\227\227\227\314\0\0\0\377<<<\347\27\27\27\365\0\0\0\377\0\0\0\377" "\343\343\343\271\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\34\34\34\363\0\0\0\377\0\0\0\377\352\352\352\267\377\377\377\263" "\377\377\377\263\377\377\377\263AAA\346\0\0\0\377\10\10\10\374\324\324\324" "\274\377\377\377\263\377\377\377\263\22\22\22\370\0\0\0\377EEE\344\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263666\352\0" "\0\0\377\14\14\14\372\354\354\354\267\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263VVV\337\0\0\0\377\0\0\0\377uuu\325ttt\326\15\15\15\372\0\0\0\377\1\1" "\1\376\34\34\34\364\15\15\15\371\6\6\6\375\1\1\1\376\6\6\6\374\40\40\40\362" "ggg\331\360\360\360\266\377\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377" "\0\0\0\377\342\342\342\271\244\244\244\310jjj\331888\351\21\21\21\370'''" "\360\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377\15\15\15\372XXX\337\0\0" "\0\377\0\0\0\377ooo\327\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377\4\4\4\376" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\332\332" "\332\273\5\5\5\375\0\0\0\377\23\23\23\367\353\353\353\267\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "}}}\323\0\0\0\377\0\0\0\377\322\322\322\275\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\263\263\263\304\0\0\0\377\0\0\0\377\0\0" "\0\377\11\11\11\373\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263EEE\345\0\0\0\377\4\4\4\376\12\12\12\373\0\0\0\377\23\23\23\367\356" "\356\356\267\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\227\227\227\314\0\0\0\377<<<\347\27\27\27\365\0\0\0\377\0\0\0\377\343" "\343\343\271\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263fff\332\0\0\0\377\0\0\0\377\243\243\243\310\377\377\377\263\377\377\377" "\263\226\226\226\314\0\0\0\377%%%\360\233\233\233\313\377\377\377\263\377" "\377\377\263\377\377\377\263\367\367\367\264\1\1\1\376\0\0\0\377\0\0\0\377" "\327\327\327\274\377\377\377\263\374\374\374\264FFF\344\0\0\0\377\6\6\6\374" "\251\251\251\307\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263===\347\0\0\0\377\0\0\0\377\0\0\0" "\377\26\26\26\365\251\251\251\307\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264" "\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\300" "\0\0\0\316\0\0\0\315\0\0\0\275\0\0\0\243\0\0\0\211\0\0\0s\0\0\0d\0\0\0[\0" "\0\0U\0\0\0O\0\0\0K\0\0\0F\0\0\0A\0\0\0<\0\0\0""7\0\0\0""3\0\0\0.\0\0\0)" "\0\0\0%\0\0\0\40\0\0\0\35\0\0\0\31\0\0\0\26\0\0\0\23\0\0\0\20\0\0\0\15\0" "\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0:\0\0\0c" "\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305" "\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\366\372" "\376\273\313\345\370\344x\301\351\377V\264\342\377h\261\325\377\272\316\331" "\377\355\365\374\377\357\367\376\377\357\367\376\377\357\367\376\377\357" "\367\376\377\352\364\375\377\340\360\372\377\335\356\371\377\334\355\370" "\377\332\354\370\377\323\347\363\377\276\327\345\377\223\300\330\377d\264" "\334\377U\263\341\377U\263\342\377U\263\342\377U\263\342\377U\263\342\377" "U\263\342\377U\263\342\377U\263\342\377\\\264\337\3772\223\304\377\6x\262" "\377\0t\260\377\0t\260\377\0t\260\377\0t\257\377\0t\257\377\27~\267\377]" "\236\322\366\310\334\361\307\376\376\376\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\\\\\\\335\0\0\0\377\0\0\0\377\217\217\217\316\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\6\6\6\374\0\0\0\377\0\0\0\377\356\356\356\267\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263GGG\344\0\0\0\377\0\0\0\377BBB\346\377\377\377\263\377\377\377\263\377" "\377\377\263OOO\341\0\0\0\377\2\2\2\376\201\201\201\322\0\0\0\377\0\0\0\377" "[[[\335\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263&" "&&\360\0\0\0\377\267\267\267\303666\352\0\0\0\377\0\0\0\377\312\312\312\277" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263000\354\0" "\0\0\377\0\0\0\377\332\332\332\273\377\377\377\263\377\377\377\263~~~\323" "\0\0\0\377\1\1\1\377\217\217\217\316\377\377\377\263\377\377\377\263\377" "\377\377\263\33\33\33\364\0\0\0\377CCC\345\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\273\273\273\302\0\0\0\377\0\0\0\377eee\332\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\200\200\200\322\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377<<<\350\377\377" "\377\263\377\377\377\263\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\27\27\27\365ppp\327\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\0\0\0\377" "\0\0\0\377\17\17\17\370\374\374\374\264EEE\344\0\0\0\377\0\0\0\377YYY\336" "\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\0\0\0\377\0\0\0\377\4\4\4\375\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\\\\\\\335\0\0\0\377\0\0\0\377\217\217\217\316" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263PPP\341\0\0\0\377\0\0\0\377\253\253\253\306" "\315\315\315\276\242\242\242\311ttt\326CCC\345\20\20\20\370\0\0\0\377\0\0" "\0\377\0\0\0\377QQQ\341\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263OOO\341\0\0\0\377\2\2\2\376\201\201\201\322\0\0\0\377\0\0\0\377" "[[[\335\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263&" "&&\360\0\0\0\377\267\267\267\303666\352\0\0\0\377\0\0\0\377\312\312\312\277" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\37\37\37" "\362\0\0\0\377\10\10\10\373\365\365\365\265\377\377\377\263\312\312\312\277" "///\355\0\0\0\377\0\0\0\377\6\6\6\375\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\23\23\23\367\0\0\0\377\0\0\0\377\314\314\314" "\276\374\374\374\264MMM\342\0\0\0\377\11\11\11\373\254\254\254\306\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\6\6\6\374\0\0\0\377\0\0\0\377SSS\340\356" "\356\356\267\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357" "\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\303\0" "\0\0\320\0\0\0\317\0\0\0\277\0\0\0\250\0\0\0\215\0\0\0x\0\0\0j\0\0\0a\0\0" "\0[\0\0\0U\0\0\0P\0\0\0K\0\0\0F\0\0\0A\0\0\0<\0\0\0""7\0\0\0""1\0\0\0-\0" "\0\0(\0\0\0$\0\0\0\40\0\0\0\33\0\0\0\30\0\0\0\24\0\0\0\22\0\0\0\17\0\0\0" "\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0:\0\0\0c\0\0" "\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327" "\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\366\372\376" "\273\312\344\371\344u\277\350\377R\261\340\377d\256\324\377\271\315\331\377" "\355\365\374\377\357\367\376\377\356\366\375\377\352\364\374\377\355\366" "\375\377\333\354\370\377\244\323\355\377\210\307\350\377\202\305\347\377" "\177\303\347\377|\301\346\377v\276\343\377l\267\336\377[\261\334\377Q\260" "\340\377O\257\340\377N\257\340\377M\257\340\377K\255\337\377J\255\337\377" "I\254\337\377H\254\337\377Q\256\334\377.\220\302\377\6w\261\377\0s\257\377" "\0s\256\377\0s\256\377\0s\256\377\0s\256\377\27}\266\377]\235\322\366\310" "\334\361\307\376\376\376\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\367\367\367\264\16\16\16\371" "\0\0\0\377\24\24\24\366\371\371\371\264\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\1\1" "\1\377\0\0\0\377\0\0\0\377\372\372\372\264\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\254\254" "\254\306\0\0\0\377\0\0\0\377\25\25\25\366\377\377\377\263\377\377\377\263" "\377\377\377\263]]]\335\0\0\0\377\0\0\0\377\354\354\354\267333\353\0\0\0" "\377\2\2\2\376\271\271\271\303\377\377\377\263\377\377\377\263\251\251\251" "\307\0\0\0\377)))\356\377\377\377\263OOO\341\0\0\0\377\0\0\0\377\256\256" "\256\305\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "FFF\344\0\0\0\377\0\0\0\377\303\303\303\300\372\372\372\264eee\332\0\0\0" "\377\1\1\1\376\202\202\202\321\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263%%%\360\0\0\0\377<<<\347\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263@@@\346\0\0\0\377\6\6\6\375\340\340\340\272\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263111\354\0\0\0\377\0\0" "\0\377\0\0\0\377\23\23\23\367@@@\347nnn\327\233\233\233\313\303\303\303\300" "\346\346\346\270\367\367\367\264\363\363\363\265\211\211\211\317\0\0\0\377" "\0\0\0\377\5\5\5\375\377\377\377\263ddd\333\0\0\0\377\0\0\0\377\0\0\0\377" "\22\22\22\370<<<\350www\325\305\305\305\300\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\0\0\0\377\0\0\0\377\13\13\13\372\377\377\377\263" "\372\372\372\264III\343\0\0\0\377\0\0\0\377JJJ\343\372\372\372\264\377\377" "\377\263\377\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377\5\5\5\375\377" "\377\377\263\377\377\377\263\377\377\377\263\367\367\367\264\16\16\16\371" "\0\0\0\377\24\24\24\366\371\371\371\264\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\6\6" "\6\374\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\243\243\243\310\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263]]]\335\0\0\0\377\0\0" "\0\377\354\354\354\267333\353\0\0\0\377\2\2\2\376\271\271\271\303\377\377" "\377\263\377\377\377\263\251\251\251\307\0\0\0\377)))\356\377\377\377\263" "OOO\341\0\0\0\377\0\0\0\377\256\256\256\305\377\377\377\263\377\377\377\263" "\377\377\377\263\267\267\267\303\0\0\0\377\0\0\0\377CCC\345\367\367\367\264" "lll\330\5\5\5\375\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\343\343\343\271" "\377\377\377\263\377\377\377\263\377\377\377\263%%%\360\0\0\0\377\0\0\0\377" "\263\263\263\304@@@\346\0\0\0\377\17\17\17\371\272\272\272\302\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263$$$\360\0\0\0\377\0\0\0\377)" "))\357\213\213\213\317\366\366\366\265\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\306\0\0\0\322\0\0\0\321\0\0\0\302\0\0\0\253\0\0\0\222\0\0\0~\0\0\0o\0" "\0\0f\0\0\0`\0\0\0[\0\0\0V\0\0\0P\0\0\0K\0\0\0E\0\0\0@\0\0\0;\0\0\0""5\0" "\0\0""0\0\0\0,\0\0\0'\0\0\0\"\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\24\0\0\0\20" "\0\0\0\16\0\0\0\13\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0" "\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305" "\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\365\372" "\376\273\312\344\370\345r\275\346\377M\256\336\377`\254\322\377\270\315\331" "\377\355\365\374\377\356\366\376\377\333\355\371\377\270\333\357\377\331" "\350\362\377\340\354\365\377\237\315\346\377\\\262\337\377K\254\336\377H" "\254\335\377F\253\335\377E\253\335\377D\251\335\377B\251\334\377A\250\334" "\377@\250\334\377?\250\334\377>\247\334\377=\247\334\377=\246\334\377<\246" "\334\377;\246\333\377F\250\331\377)\215\301\377\5v\260\377\0s\256\377\0r" "\255\377\0r\255\377\0r\255\377\0r\255\377\27|\265\377]\235\321\366\310\334" "\361\307\376\376\376\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\245\245\245\310\0\0\0\377\0\0\0" "\377XXX\336\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\3\3\3\376\0\0\0" "\377\0\0\0\377\374\374\374\264\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\353\353\353\267\0\0" "\0\377\0\0\0\377\4\4\4\375\377\377\377\263\377\377\377\263\377\377\377\263" "mmm\330\0\0\0\377\0\0\0\377\330\330\330\273\322\322\322\275\10\10\10\374" "\0\0\0\377\36\36\36\362\363\363\363\265\377\377\377\263666\352\0\0\0\377" "\206\206\206\321\377\377\377\263ggg\331\0\0\0\377\0\0\0\377\222\222\222\315" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263[[[\335\0" "\0\0\377\0\0\0\377\177\177\177\322)))\356\0\0\0\377\13\13\13\372\234\234" "\234\312\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263444\353\0\0\0\377///\354\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\316\316\316\276\1\1\1\376\0\0\0\377QQQ\340\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263///\355\0\0\0\377\0\0\0\377" "\0\0\0\377\334\334\334\272\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\354\354" "\354\267\0\0\0\377\0\0\0\377\36\36\36\363\377\377\377\263\5\5\5\375\0\0\0" "\377\0\0\0\377\0\0\0\377\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\0\0\0\377\0\0\0\377\7\7\7\374\377\377\377\263\377\377\377\263\375\375\375" "\263XXX\336\0\0\0\377\0\0\0\377===\347\365\365\365\265\377\377\377\263\377" "\377\377\263\0\0\0\377\0\0\0\377\5\5\5\375\377\377\377\263\377\377\377\263" "\377\377\377\263\245\245\245\310\0\0\0\377\0\0\0\377XXX\336\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263OOO\341\0\0\0\377\0\0\0\377\7\7\7\374***" "\356TTT\337\201\201\201\322\260\260\260\305\336\336\336\272'''\360\0\0\0" "\377\0\0\0\377\220\220\220\316\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263mmm\330\0\0\0\377\0\0\0\377\330\330\330\273\322\322\322" "\275\10\10\10\374\0\0\0\377\36\36\36\362\363\363\363\265\377\377\377\263" "666\352\0\0\0\377\206\206\206\321\377\377\377\263ggg\331\0\0\0\377\0\0\0" "\377\222\222\222\315\377\377\377\263\377\377\377\263\377\377\377\263]]]\334" "\0\0\0\377\0\0\0\377]]]\334\40\40\40\362\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377KKK\342\377\377\377\263\377\377\377\263\377\377" "\377\263666\352\0\0\0\377\0\0\0\377\13\13\13\373\0\0\0\377\0\0\0\377\231" "\231\231\313\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\235\235\235\312\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\22\22" "\22\370sss\326\354\354\354\267\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262" "\262\262\305\206\206\206\321\0\0\0\310\0\0\0\324\0\0\0\323\0\0\0\304\0\0" "\0\256\0\0\0\226\0\0\0\203\0\0\0u\0\0\0l\0\0\0f\0\0\0`\0\0\0[\0\0\0U\0\0" "\0O\0\0\0J\0\0\0D\0\0\0>\0\0\0:\0\0\0""4\0\0\0/\0\0\0)\0\0\0%\0\0\0\40\0" "\0\0\34\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0" "\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0" "\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0" "\0\213\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\365\372\376\274\312\344\370\345n\273\345\377" "G\252\334\377[\250\320\377\267\314\331\377\355\365\374\377\343\361\372\377" "\242\322\355\377g\264\335\377\253\316\341\377\344\355\364\377\312\340\355" "\377r\271\336\377>\245\332\3778\243\331\3777\243\331\3777\243\331\3777\242" "\331\3777\242\331\3776\242\331\3776\242\331\3776\242\331\3776\242\331\377" "6\242\331\3776\242\331\3776\242\331\3776\242\331\377A\244\327\377&\213\277" "\377\5u\257\377\0r\255\377\0r\255\377\0r\254\377\0r\254\377\0q\254\377\26" "|\265\377\\\235\321\366\310\334\361\307\376\376\376\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263aaa\334" "\0\0\0\377\0\0\0\377\232\232\232\313\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\13\13\13\372\0\0\0\377\0\0\0\377\362\362\362\266\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\362\362\362\266\0\0\0\377\0\0\0\377\15\15\15\372\377\377\377" "\263\377\377\377\263\377\377\377\263\177\177\177\322\0\0\0\377\0\0\0\377" "\302\302\302\301\377\377\377\263|||\323\0\0\0\377\0\0\0\377MMM\342\312\312" "\312\277\1\1\1\377\10\10\10\374\356\356\356\267\377\377\377\263~~~\323\0" "\0\0\377\0\0\0\377uuu\325\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263ddd\333\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377777\352\324" "\324\324\274\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263EEE\345\0\0\0\377\33\33\33\364\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263TTT\340\0\0\0\377\1\1\1\376\314\314\314\276" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\33\33\33\364\0\0\0\377\0\0\0\377\247\247\247\307\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263qqq\326\0\0\0\377\0\0\0\377\200\200\200\322" "\377\377\377\263\241\241\241\311\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377\2\2\2\376\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263ooo\327\0\0\0\377" "\0\0\0\377111\354\354\354\354\267\377\377\377\263\0\0\0\377\0\0\0\377\5\5" "\5\375\377\377\377\263\377\377\377\263\377\377\377\263aaa\334\0\0\0\377\0" "\0\0\377\232\232\232\313\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\235\235\235\312\0\0\0\377\0\0\0\377\202\202\202\321\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263BBB\345\0\0\0" "\377\0\0\0\377qqq\326\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\177\177\177\322\0\0\0\377\0\0\0\377\302\302\302\301\377\377" "\377\263|||\323\0\0\0\377\0\0\0\377MMM\342\312\312\312\277\1\1\1\377\10\10" "\10\374\356\356\356\267\377\377\377\263~~~\323\0\0\0\377\0\0\0\377uuu\325" "\377\377\377\263\377\377\377\263\377\377\377\263\36\36\36\362\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1\1\1\376>>>\347\263\263\263\304<" "<<\347\0\0\0\377\0\0\0\377\247\247\247\307\377\377\377\263\377\377\377\263" "KKK\342\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1\1\1\376:::\351" "\202\202\202\321\277\277\277\301\366\366\366\265\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\272\272\272\302" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\15\15\15\372" "jjj\331\352\352\352\267\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357" "\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\313\0" "\0\0\326\0\0\0\325\0\0\0\307\0\0\0\261\0\0\0\232\0\0\0\207\0\0\0z\0\0\0q" "\0\0\0k\0\0\0e\0\0\0_\0\0\0Z\0\0\0T\0\0\0O\0\0\0I\0\0\0C\0\0\0=\0\0\0""7" "\0\0\0""2\0\0\0-\0\0\0(\0\0\0#\0\0\0\37\0\0\0\33\0\0\0\27\0\0\0\24\0\0\0" "\21\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0" "\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0" "\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327" "\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\365\371\376" "\274\310\343\370\345f\266\343\3778\242\330\377O\242\315\377\265\313\330\377" "\350\363\373\377\267\333\360\377Y\260\336\377;\242\330\377z\266\327\377\323" "\340\352\377\346\357\366\377\257\322\347\377N\251\331\3772\236\327\3772\236" "\327\3772\236\327\3772\236\327\3772\237\327\3772\236\327\3772\236\327\377" "2\236\327\3772\236\327\3772\236\327\3772\236\327\3772\236\327\3772\236\327" "\377<\240\325\377#\210\275\377\4t\255\377\0r\254\377\0q\254\377\0q\254\377" "\0q\253\377\0q\253\377\26{\263\377[\233\321\366\307\333\361\307\376\376\376" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263444\353\0\0\0\377\0\0\0\377\314\314\314\276\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\33\33\33\364\0\0\0\377\0\0\0\377\327" "\327\327\274\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\303\303\303\300\0\0\0\377\0\0\0\377" ":::\350\377\377\377\263\377\377\377\263\377\377\377\263\224\224\224\314\0" "\0\0\377\0\0\0\377\247\247\247\307\377\377\377\263\375\375\375\263000\354" "\0\0\0\377\0\0\0\377\32\32\32\364\0\0\0\377EEE\344\377\377\377\263\377\377" "\377\263\226\226\226\314\0\0\0\377\0\0\0\377YYY\336\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\37\37\37\362\0\0\0\377\0\0\0\377" "!!!\361\234\234\234\312\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263VVV\337\0\0\0\377\7\7\7\374\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\346\346\346\270\7\7" "\7\374\0\0\0\377<<<\347\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263888\351\0\0\0\377\0\0" "\0\377zzz\324\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\215\215\215\316\2\2\2\376\0\0\0\377" "<<<\347\375\375\375\263\377\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377" "\0\0\0\377\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263hhh\331\33\33\33\364\377\377\377\263\0\0\0\377\0\0\0\377\0\0\0\377" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\216\216\216\316\4\4\4\376\0\0\0\377%%%\360\337\337\337\272\0\0\0" "\377\0\0\0\377\5\5\5\375\377\377\377\263\377\377\377\263\377\377\377\263" "444\353\0\0\0\377\0\0\0\377\314\314\314\276\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\256\256\256\305\0\0\0\377\0\0\0\377iii\331\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263aaa\333\0" "\0\0\377\0\0\0\377QQQ\341\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\224\224\224\314\0\0\0\377\0\0\0\377\247\247\247\307\377" "\377\377\263\375\375\375\263000\354\0\0\0\377\0\0\0\377\32\32\32\364\0\0" "\0\377EEE\344\377\377\377\263\377\377\377\263\226\226\226\314\0\0\0\377\0" "\0\0\377YYY\336\377\377\377\263\377\377\377\263\330\330\330\273\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\7\7\7\374TTT\337\317\317\317\275\377\377\377" "\263\377\377\377\263\321\321\321\275\5\5\5\375\0\0\0\377\26\26\26\366\354" "\354\354\267\377\377\377\263bbb\333\0\0\0\377\0\0\0\377bbb\333\26\26\26\365" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\5\5\5\375///\355kkk\330" "\254\254\254\306\343\343\343\271\377\377\377\263\304\304\304\300\0\0\0\377" "\1\1\1\377\266\266\266\304EEE\344\1\1\1\376\0\0\0\377\0\0\0\377\0\0\0\377" "\13\13\13\372mmm\330\356\356\356\267\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327" "\327\327\274\262\262\262\305\206\206\206\321\0\0\0\315\0\0\0\327\0\0\0\326" "\0\0\0\311\0\0\0\264\0\0\0\236\0\0\0\214\0\0\0\177\0\0\0w\0\0\0p\0\0\0j\0" "\0\0d\0\0\0_\0\0\0Y\0\0\0S\0\0\0M\0\0\0G\0\0\0A\0\0\0;\0\0\0""5\0\0\0""0" "\0\0\0+\0\0\0&\0\0\0!\0\0\0\35\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0" "\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\2\0\0\0\2\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\364\371\376\274\307\342\367" "\346`\263\340\3770\234\325\377J\237\314\377\263\311\330\377\316\346\365\377" "p\271\341\3775\236\326\3770\234\325\377R\247\323\377\261\315\336\377\343" "\354\365\377\333\351\363\377\205\277\337\3771\235\325\377/\234\325\377/\234" "\325\377/\234\325\377/\234\325\377/\234\325\377/\234\325\377/\234\325\377" "/\234\325\377/\234\325\377/\234\325\377/\234\325\377/\234\325\3778\235\322" "\377\40\206\273\377\4s\254\377\0q\253\377\0q\253\377\0q\252\377\0p\252\377" "\0p\252\377\25z\262\377X\231\320\366\307\333\361\307\376\376\376\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\26\26\26\366\0\0\0\377\0\0\0\377\353\353\353\267\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\356\356\356\267qqq\326\20\20\20\370777\352\377" "\377\377\263555\352\0\0\0\377\0\0\0\377\256\256\256\305\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263fff\332\0\0\0\377\0\0\0\377\235\235\235\312\377\377\377\263\377\377\377" "\263\377\377\377\263\255\255\255\306\0\0\0\377\0\0\0\377\213\213\213\317" "\377\377\377\263\377\377\377\263\326\326\326\274\13\13\13\372\0\0\0\377\0" "\0\0\377\0\0\0\377\227\227\227\314\377\377\377\263\377\377\377\263\255\255" "\255\306\0\0\0\377\0\0\0\377===\347\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263!!!\361\0\0\0\377\0\0\0\377\272\272\272\302\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263mmm\330\0" "\0\0\377\0\0\0\377\324\324\324\274\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263ooo\327\0\0\0\377\0\0\0\377\255\255" "\255\306\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263YYY\336\0\0\0\377\0\0\0\377SSS\340" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\362\362" "\362\266ZZZ\336\0\0\0\377\0\0\0\377BBB\346\365\365\365\265\377\377\377\263" "\377\377\377\263\377\377\377\263\5\5\5\375\0\0\0\377\0\0\0\377\356\356\356" "\267\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\302\302\302\301\2\2\2\376\12" "\12\12\373\377\377\377\263\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\242\242\242\311\6\6\6\374\0\0\0\377\30\30\30\365\0\0\0\377\0\0\0" "\377\4\4\4\376\377\377\377\263\377\377\377\263\377\377\377\263\26\26\26\366" "\0\0\0\377\0\0\0\377\353\353\353\267\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\356\356\356\267qqq\326\20\20\20\370777\352\377\377\377\263\304\304\304" "\300\0\0\0\377\0\0\0\377PPP\341\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\203\203\203\321\0\0\0\377\0\0\0\377" "111\353\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\255" "\255\255\306\0\0\0\377\0\0\0\377\213\213\213\317\377\377\377\263\377\377" "\377\263\326\326\326\274\13\13\13\372\0\0\0\377\0\0\0\377\0\0\0\377\227\227" "\227\314\377\377\377\263\377\377\377\263\255\255\255\306\0\0\0\377\0\0\0" "\377===\347\377\377\377\263\377\377\377\263\214\214\214\317\0\0\0\377\0\0" "\0\377\20\20\20\370lll\330\344\344\344\271\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263aaa\334\0\0\0\377\0\0\0\377" "FFF\344\377\377\377\263zzz\324\0\0\0\377\0\0\0\377\213\213\213\317\362\362" "\362\266vvv\325\33\33\33\364\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" "\0\377\0\0\0\377\0\0\0\377\1\1\1\377rrr\326\316\316\316\276\0\0\0\377\0\0" "\0\377\323\323\323\275\377\377\377\263\302\302\302\301444\353\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\20\20\20\370\204\204\204\321\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266" "\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\317\0\0\0\331\0\0" "\0\330\0\0\0\313\0\0\0\267\0\0\0\242\0\0\0\220\0\0\0\204\0\0\0{\0\0\0u\0" "\0\0o\0\0\0i\0\0\0d\0\0\0]\0\0\0W\0\0\0Q\0\0\0K\0\0\0E\0\0\0>\0\0\0""9\0" "\0\0""3\0\0\0.\0\0\0(\0\0\0#\0\0\0\37\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\20" "\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0" "\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0" "\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327\274" "\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\364\371\376\274\306\341" "\367\346]\260\337\377,\232\323\377F\234\312\377\254\305\325\377\211\303\344" "\3778\236\325\377+\231\323\377*\231\323\3777\235\323\377\205\267\324\377" "\320\340\354\377\342\356\371\377\306\335\355\377K\245\326\377+\231\323\377" "*\231\323\377*\231\323\377*\231\323\377*\231\323\377*\231\323\377*\231\323" "\377*\231\323\377*\231\323\377*\231\323\377*\231\323\377*\231\323\3773\232" "\320\377\35\204\271\377\3r\253\377\0p\252\377\0o\251\377\0o\251\377\0o\250" "\377\0o\250\377\24y\261\377W\231\320\366\307\333\361\307\376\376\376\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\10\10\10\374\0\0\0\377\0\0\0\377\371\371\371\264\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\263\263\263\304SSS\340\12\12\12\373\0\0\0\377\0\0\0\377\13\13\13\372\377" "\377\377\263aaa\334\0\0\0\377\0\0\0\377rrr\326\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\323\323\323\275\12\12" "\12\373\0\0\0\377///\354\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\311\311\311\277\0\0\0\377\0\0\0\377ggg\331\377\377\377\263" "\377\377\377\263\377\377\377\263\232\232\232\313\0\0\0\377\0\0\0\377\1\1" "\1\377\350\350\350\270\377\377\377\263\377\377\377\263\312\312\312\277\0" "\0\0\377\0\0\0\377&&&\360\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\213\213\213\317\0\0\0\377\0\0\0\377\216\216\216\316\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\211" "\211\211\317\0\0\0\377\0\0\0\377\242\242\242\311\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\371\371\371\264\24\24\24\367\0\0" "\0\377!!!\361\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263~~~\323\0\0\0" "\377\0\0\0\377///\354\377\377\377\263\377\377\377\263\347\347\347\270}}}" "\323\25\25\25\366\0\0\0\377\5\5\5\375uuu\325\375\375\375\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\24\24\24\366\0\0\0\377" "\0\0\0\377\307\307\307\300\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\343\343\343\271\40\40\40" "\362\0\0\0\377MMM\342\377\377\377\263\0\0\0\377\0\0\0\377\0\0\0\377\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\253\253\253\306\10\10\10\374\0\0\0\377\0" "\0\0\377\0\0\0\377\2\2\2\376\377\377\377\263\377\377\377\263\377\377\377" "\263\10\10\10\374\0\0\0\377\0\0\0\377\371\371\371\264\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\263\263\263" "\304SSS\340\12\12\12\373\0\0\0\377\0\0\0\377\13\13\13\372\377\377\377\263" "\332\332\332\273\0\0\0\377\0\0\0\377777\352\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\247\247\247\307\0\0\0\377" "\0\0\0\377\30\30\30\365\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\311\311\311\277\0\0\0\377\0\0\0\377ggg\331\377\377\377\263\377" "\377\377\263\377\377\377\263\232\232\232\313\0\0\0\377\0\0\0\377\1\1\1\377" "\350\350\350\270\377\377\377\263\377\377\377\263\312\312\312\277\0\0\0\377" "\0\0\0\377&&&\360\377\377\377\263\377\377\377\263QQQ\341\0\0\0\377\0\0\0" "\377\273\273\273\302\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\353\353\353" "\267\20\20\20\370\0\0\0\377\0\0\0\377rrr\326\224\224\224\315\0\0\0\377\0" "\0\0\377xxx\324\377\377\377\263\377\377\377\263\377\377\377\263\315\315\315" "\276\221\221\221\315bbb\333111\353\6\6\6\374\0\0\0\377\0\0\0\377\0\0\0\377" "\12\12\12\373\327\327\327\274\0\0\0\377\0\0\0\377\256\256\256\305\377\377" "\377\263\377\377\377\263\377\377\377\263\231\231\231\313\26\26\26\365\0\0" "\0\377\0\0\0\377\0\0\0\377\0\0\0\377XXX\336\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375" "\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305" "\206\206\206\321\0\0\0\320\0\0\0\332\0\0\0\331\0\0\0\315\0\0\0\272\0\0\0" "\245\0\0\0\224\0\0\0\207\0\0\0\177\0\0\0y\0\0\0s\0\0\0n\0\0\0h\0\0\0b\0\0" "\0[\0\0\0U\0\0\0O\0\0\0H\0\0\0B\0\0\0<\0\0\0""6\0\0\0""0\0\0\0+\0\0\0%\0" "\0\0!\0\0\0\34\0\0\0\31\0\0\0\24\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0" "\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0" "\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206" "\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\363\371\375\275\304\341\367\347Y\256\336\377(\227\322" "\377B\231\310\377\204\262\316\377<\237\325\377'\226\321\377'\226\321\377" "'\226\321\377*\227\321\377X\245\317\377\261\314\337\377\331\350\367\377\332" "\352\371\377\216\302\341\3774\233\322\377'\226\321\377'\226\321\377'\226" "\321\377'\226\321\377'\226\321\377'\226\321\377'\226\321\377'\226\321\377" "'\226\321\377'\226\321\377'\226\321\377.\227\316\377\32\202\267\377\3q\251" "\377\0o\250\377\0o\250\377\0n\247\377\0n\247\377\0n\247\377\23x\261\377U" "\227\317\366\306\333\361\307\376\376\376\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\2\2\2\376\0" "\0\0\377\0\0\0\377\237\237\237\312\371\371\371\264\350\350\350\270\244\244" "\244\310YYY\336\24\24\24\366\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\4\4" "\4\376\213\213\213\317\377\377\377\263\254\254\254\306\0\0\0\377\0\0\0\377" "!!!\361\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\333" "\333\333\273\40\40\40\362\0\0\0\377\16\16\16\371\324\324\324\274\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\352\352\352\267" "\0\0\0\377\0\0\0\377@@@\346\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263@@@\346\3\3\3\376@@@\347\377\377\377\263\377\377\377\263" "\377\377\377\263\356\356\356\267\0\0\0\377\0\0\0\377\22\22\22\370\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\254\254\254\306" "\0\0\0\377\0\0\0\377]]]\335\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\252\252\252\307\0\0\0\377\0\0\0\377iii\331\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\227\227\227\313" "\0\0\0\377\0\0\0\377~~~\323\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\356\356\356\267\237\237\237\312NNN\341\17" "\17\17\370BBB\346\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\247\247\247\307\0\0\0\377" "\0\0\0\377\17\17\17\370\234\234\234\312444\352\4\4\4\376\0\0\0\377\0\0\0" "\377444\352\312\312\312\277\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263666\352\0\0\0\377\0\0\0\377" "\200\200\200\322\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\362\362\362\266{{{\323\17\17\17\370\0\0\0\377\"\"\"\361\347\347" "\347\270\377\377\377\263\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\263\263\263\304\12\12\12\373\0\0\0\377" "\0\0\0\377\0\0\0\377\377\377\377\263\377\377\377\263\377\377\377\263\2\2" "\2\376\0\0\0\377\0\0\0\377\237\237\237\312\371\371\371\264\350\350\350\270" "\244\244\244\310YYY\336\24\24\24\366\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\4\4\4\376\213\213\213\317\377\377\377\263\357\357\357\266\0\0\0\377" "\0\0\0\377\35\35\35\363\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\315\315\315\276\0\0\0\377\0\0\0\377\16\16\16" "\371\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\352" "\352\352\267\0\0\0\377\0\0\0\377@@@\346\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263@@@\346\3\3\3\376@@@\347\377\377\377\263\377" "\377\377\263\377\377\377\263\356\356\356\267\0\0\0\377\0\0\0\377\22\22\22" "\370\377\377\377\263\377\377\377\263%%%\360\0\0\0\377\7\7\7\374\375\375\375" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\214\214\214" "\317\0\0\0\377\0\0\0\377\12\12\12\373\255\255\255\306\0\0\0\377\0\0\0\377" "```\334\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\363\363\363\265\237\237\237" "\311KKK\343\15\15\15\371NNN\341\337\337\337\272\0\0\0\377\0\0\0\377\214\214" "\214\317\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\365\365\365\265vvv\325\17\17\17\371\0\0\0\377\0\0\0\377\6\6\6\374\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327" "\327\274\262\262\262\305\206\206\206\321\0\0\0\322\0\0\0\333\0\0\0\332\0" "\0\0\316\0\0\0\274\0\0\0\250\0\0\0\227\0\0\0\213\0\0\0\202\0\0\0}\0\0\0w" "\0\0\0r\0\0\0k\0\0\0f\0\0\0_\0\0\0X\0\0\0R\0\0\0L\0\0\0E\0\0\0?\0\0\0""9" "\0\0\0""3\0\0\0-\0\0\0(\0\0\0\"\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0" "\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\2\0" "\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\363\370\375\275\301\337\367" "\347U\253\335\377%\223\320\3771\223\312\3776\227\313\377#\222\317\377#\222" "\317\377#\222\317\377#\222\317\377#\223\317\3774\227\316\377\201\263\321" "\377\305\333\355\377\325\350\372\377\301\334\362\377j\261\333\377)\225\320" "\377#\222\317\377#\222\317\377#\222\317\377#\222\317\377#\222\317\377#\222" "\317\377#\222\317\377#\222\317\377#\222\317\377#\222\317\377)\223\314\377" "\27\177\265\377\3p\250\377\0n\247\377\0n\247\377\0n\247\377\0n\246\377\0" "n\246\377\22v\257\377S\226\316\366\306\332\361\307\376\376\376\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\33\33\33\364\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\10\10\10\373444\352ttt\326\327\327" "\327\274\377\377\377\263\377\377\377\263\375\375\375\263\40\40\40\362\0\0" "\0\377\0\0\0\377ddd\332\360\360\360\266\327\327\327\274{{{\323\17\17\17\371" "\0\0\0\377\15\15\15\371\272\272\272\302\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\7\7\7\374\0" "\0\0\377\35\35\35\363\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\22\22\22\370\0\0\0\377" "\4\4\4\376\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\317\317\317\275\0\0\0\377\0\0\0\377,,,\355\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\315\315\315\276\0\0\0\377\0\0\0" "\377777\352\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "888\351\0\0\0\377\0\0\0\377\316\316\316\276\312\312\312\277\241\241\241\311" "xxx\324OOO\341%%%\360\3\3\3\376\0\0\0\377\0\0\0\377\0\0\0\377\6\6\6\374\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\322\322\322\275\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377***\356\245\245\245\310\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263www\325\0\0\0\377\0\0\0\377\24\24\24" "\366\300\300\300\301\363\363\363\265\264\264\264\304ZZZ\336\15\15\15\372" "\0\0\0\377\1\1\1\377MMM\342\356\356\356\267\377\377\377\263\377\377\377\263" "\5\5\5\375\0\0\0\377\2\2\2\376\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\270\270\270\303\14\14\14\372\0\0\0\377\0\0\0" "\377\377\377\377\263\377\377\377\263\377\377\377\263\33\33\33\364\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\10\10\10\373444\352ttt\326\327\327\327\274\377\377\377\263\377\377" "\377\263\377\377\377\263\2\2\2\376\0\0\0\377\6\6\6\375\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\357\357\357" "\266\0\0\0\377\0\0\0\377\7\7\7\374\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\7\7\7\374\0\0\0\377\35\35\35\363" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\22\22\22\370\0\0\0\377\4\4\4\376\377\377" "\377\263\377\377\377\263\10\10\10\373\0\0\0\377\15\15\15\371\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263iii\331\10\10\10\374BBB\346\310\310\310\277\0\0\0\377\0\0\0\377FFF\344" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\352\352\352\267\0\0\0\377" "\0\0\0\377kkk\330\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\357\357\357\266zzz\324\35\35\35" "\363@@@\347\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357" "\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\323\0\0\0" "\334\0\0\0\333\0\0\0\320\0\0\0\276\0\0\0\252\0\0\0\233\0\0\0\217\0\0\0\206" "\0\0\0\200\0\0\0{\0\0\0u\0\0\0p\0\0\0i\0\0\0c\0\0\0]\0\0\0V\0\0\0O\0\0\0" "H\0\0\0B\0\0\0<\0\0\0""5\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27" "\0\0\0\24\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\4\0\0" "\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0" "\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327" "\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\362\370\375" "\275\275\335\366\347R\250\333\377\"\221\315\377\"\217\314\377!\220\314\377" "\37\217\315\377\37\217\315\377\37\217\315\377\37\217\315\377\37\217\315\377" "$\221\314\377V\237\312\377\252\310\337\377\313\342\370\377\311\342\370\377" "\236\312\351\377E\240\324\377!\220\315\377\37\217\315\377\37\217\315\377" "\37\217\315\377\37\217\315\377\37\217\315\377\37\217\315\377\37\217\315\377" "\37\217\315\377\37\217\315\377%\217\312\377\24}\263\377\2o\247\377\0n\246" "\377\0n\246\377\0m\246\377\0m\245\377\0m\245\377\21u\256\377Q\224\315\366" "\304\331\360\307\375\376\376\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\263\263\263\304...\355\12" "\12\12\373\1\1\1\376\7\7\7\374\32\32\32\365444\353XXX\336\206\206\206\320" "\300\300\300\301\372\372\372\264\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\272\272\272\302" "\10\10\10\373\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" "...\355\321\321\321\275\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\37\37\37\362" "\0\0\0\377\6\6\6\375\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\201\201\201\322\11\11" "\11\373:::\350\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\366\366\366\265\2\2\2\376\0\0\0\377\10\10\10\373\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\365\365\365\265\2\2" "\2\376\0\0\0\377\13\13\13\372\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\6\6\6\374\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\14\14" "\14\372fff\332\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\366\366\366\265\0\0\0\377\0" "\0\0\377\0\0\0\377\3\3\3\376@@@\347\260\260\260\305\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\352\352" "\352\267\22\22\22\367\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\6\6\6\374GGG\344\277\277\277\301\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263bbb\333\10\10\10\374YYY\336\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\310\310\310\277'''\357\34\34\34\364\377\377\377\263\377\377\377\263\377" "\377\377\263\263\263\263\304...\355\12\12\12\373\1\1\1\376\7\7\7\374\32\32" "\32\365444\353XXX\336\206\206\206\320\300\300\300\301\372\372\372\264\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\32\32\32\364\0\0\0\377\10\10\10\373\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\12\12\12\373\0\0\0\377\2\2\2\376\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\37\37\37\362\0\0\0\377\6" "\6\6\375\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\201\201\201\322\11\11\11\373:::" "\350\377\377\377\263\377\377\377\263\10\10\10\374\0\0\0\377\3\3\3\376\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\342\342\342" "\271\0\0\0\377\0\0\0\377+++\356\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\366\366\366\265\0\0\0\377\0\0\0\377JJJ\343\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\324\0\0\0\335\0\0\0\334\0\0\0" "\321\0\0\0\300\0\0\0\256\0\0\0\236\0\0\0\222\0\0\0\211\0\0\0\203\0\0\0~\0" "\0\0y\0\0\0s\0\0\0m\0\0\0f\0\0\0_\0\0\0Y\0\0\0R\0\0\0K\0\0\0E\0\0\0>\0\0" "\0""8\0\0\0""2\0\0\0,\0\0\0'\0\0\0\"\0\0\0\35\0\0\0\31\0\0\0\25\0\0\0\22" "\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\360\366\374\275\273\333\365" "\347P\247\332\377#\220\315\377!\217\314\377\40\217\314\377\40\217\314\377" "\37\216\314\377\37\216\314\377\37\216\314\377\36\216\314\377\37\216\314\377" "6\223\307\377\205\262\320\377\276\331\360\377\305\341\372\377\270\331\364" "\377w\267\340\377*\223\316\377\33\214\313\377\33\214\313\377\33\214\313\377" "\33\214\313\377\33\214\313\377\33\214\313\377\33\214\313\377\33\214\313\377" "\33\214\313\377\40\214\310\377\22{\262\377\2n\246\377\0m\245\377\0m\245\377" "\0m\245\377\1n\245\377\2n\246\377\23v\257\377Q\224\315\366\303\330\356\310" "\374\374\374\264\375\375\375\263\375\375\375\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\310\310\310\277BBB\346\15\15\15\372\3\3" "\3\376\22\22\22\367AAA\346\237\237\237\311\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263|||\323\6\6\6\374CCC\345\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263HHH\344\13\13\13\372}}}\323\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263aaa\334\10\10\10\374UUU\337" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263<<<\350\6" "\6\6\374\24\24\24\366\35\35\35\363(((\357777\351III\343___\334vvv\325\221" "\221\221\315\260\260\260\305\330\330\330\273\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263PPP\341\7\7\7\374XXX" "\337\334\334\334\272\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\304\304\304\300---\355\4\4\4\375\11\11\11\373\"\"\"\361OOO\341" "\222\222\222\315\353\353\353\267\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\177\177\177\322" "\12\12\12\373\220\220\220\316\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263ooo\327\6\6\6\374EEE" "\344\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263|||\323\6\6\6\374CCC\345\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263ddd\333\6\6\6\374FFF\344\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\367\367\367\264\0\0\0\377\0\0\0\377\24\24\24\367\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\3\3\3\376\0" "\0\0\377)))\356\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372" "\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206" "\321\0\0\0\326\0\0\0\336\0\0\0\335\0\0\0\322\0\0\0\301\0\0\0\260\0\0\0\237" "\0\0\0\225\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0|\0\0\0v\0\0\0p\0\0\0i\0\0" "\0c\0\0\0\\\0\0\0U\0\0\0N\0\0\0H\0\0\0A\0\0\0:\0\0\0""4\0\0\0.\0\0\0(\0\0" "\0#\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0" "\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0" "\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321" "\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375" "\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372" "\372\264\352\361\367\276\267\331\363\350T\250\332\377*\223\316\377)\222\315" "\377)\222\315\377(\221\315\377'\221\315\377&\221\315\377%\220\315\377%\220" "\315\377$\220\315\377'\217\313\377^\236\305\377\250\310\342\377\276\336\371" "\377\274\335\370\377\242\315\356\377R\245\326\377\37\215\313\377\34\214\312" "\377\33\213\312\377\33\213\312\377\32\212\312\377\31\212\312\377\30\211\312" "\377\30\211\311\377\30\212\311\377\34\211\306\377\20y\261\377\2n\246\377" "\1n\245\377\3n\246\377\6p\247\377\7q\247\377\11s\250\377\32z\261\377T\226" "\316\367\277\323\351\311\365\365\365\265\367\367\367\264\372\372\372\264" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\13\13\13\372\0\0\0\377\5\5\5\375\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\17\17\17\371\0\0\0\377\17\17\17\370\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357" "\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\327\0" "\0\0\337\0\0\0\336\0\0\0\323\0\0\0\303\0\0\0\261\0\0\0\242\0\0\0\230\0\0" "\0\217\0\0\0\212\0\0\0\205\0\0\0\177\0\0\0y\0\0\0s\0\0\0l\0\0\0f\0\0\0_\0" "\0\0X\0\0\0Q\0\0\0J\0\0\0C\0\0\0<\0\0\0""6\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0" "\0\0\6\0\0\0\4\0\0\0\4\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\372\372\372\264\366\366\366\265\356\356\356\267\333" "\342\351\302\260\322\356\352]\254\335\3778\231\321\3775\227\320\3774\227" "\320\3773\227\317\3773\226\317\3772\225\316\3771\225\316\3770\225\316\377" "0\225\316\377.\224\316\377@\224\305\377\210\260\317\377\263\327\365\377\266" "\331\371\377\262\326\367\377\213\300\350\377:\231\321\377&\220\313\377%\220" "\313\377$\217\313\377#\216\313\377\"\215\312\377\40\215\312\377\37\214\312" "\377\35\213\311\377\36\211\306\377\23z\262\377\12r\250\377\12s\250\377\14" "t\251\377\17v\252\377\22x\254\377\25y\254\377%\200\265\377W\226\314\367\260" "\304\331\315\342\342\342\271\353\353\353\267\363\363\363\265\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\177" "\177\177\322\10\10\10\373NNN\341\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263:::\351\0\0\0\377\4\4\4\376\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327" "\327\274\262\262\262\305\206\206\206\321\0\0\0\327\0\0\0\340\0\0\0\337\0" "\0\0\324\0\0\0\304\0\0\0\263\0\0\0\244\0\0\0\232\0\0\0\222\0\0\0\214\0\0" "\0\207\0\0\0\202\0\0\0|\0\0\0u\0\0\0o\0\0\0i\0\0\0b\0\0\0[\0\0\0T\0\0\0L" "\0\0\0E\0\0\0>\0\0\0""7\0\0\0""2\0\0\0,\0\0\0&\0\0\0!\0\0\0\34\0\0\0\30\0" "\0\0\24\0\0\0\21\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0" "\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0" "\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327\274" "\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\366\366\366\265\353\353\353\267\332\332\332\273\301\311\316\307\245\306" "\342\353\204\275\347\376o\262\340\376f\256\336\377^\253\334\377V\247\330" "\377O\243\326\377H\240\324\377B\235\322\377?\234\321\377>\233\321\377;\232" "\320\3777\226\314\377h\236\303\377\247\314\355\377\256\325\370\377\255\325" "\370\377\245\317\364\377k\260\336\3777\227\317\3773\225\316\3774\226\316" "\3773\225\316\3772\225\315\3771\224\315\377/\223\315\377-\222\314\377)\216" "\307\377\35\200\264\377\24x\254\377\25y\255\377\27z\255\377\33|\256\377\40" "\177\261\377*\203\266\377?\214\302\377]\225\313\370\223\245\271\324\304\304" "\304\300\336\336\336\272\356\356\356\267\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\271\271\271\303\15\15\15\372GGG\344\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327" "\327\327\274\262\262\262\305\206\206\206\321\0\0\0\327\0\0\0\340\0\0\0\340" "\0\0\0\325\0\0\0\305\0\0\0\264\0\0\0\245\0\0\0\233\0\0\0\224\0\0\0\216\0" "\0\0\212\0\0\0\204\0\0\0~\0\0\0x\0\0\0r\0\0\0k\0\0\0d\0\0\0]\0\0\0V\0\0\0" "N\0\0\0G\0\0\0@\0\0\0:\0\0\0""3\0\0\0-\0\0\0'\0\0\0\"\0\0\0\35\0\0\0\31\0" "\0\0\25\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0" "\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0" "\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\365\365\365\265\344\344\344\271\317\317\317\275\265\270\274\310\234" "\260\302\337\230\265\317\356\230\270\325\362\230\273\334\366\222\274\336" "\370\213\272\336\373\204\271\337\374\200\270\341\376z\267\342\376s\264\341" "\377j\260\337\377a\253\333\377V\246\327\377_\243\320\377\240\310\354\377" "\246\321\367\377\246\321\370\377\246\321\367\377\220\304\355\377T\244\327" "\377=\232\320\377>\232\320\377?\233\320\377>\233\320\377>\232\317\377=\232" "\317\377<\231\317\3775\223\311\377'\205\270\377\36~\260\377\37~\260\377$" "\201\263\3771\207\271\377B\216\303\377T\225\312\376d\230\312\371p\225\274" "\354\221\233\247\322\276\276\276\302\334\334\334\272\357\357\357\266\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375" "\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206" "\206\206\321\0\0\0\330\0\0\0\340\0\0\0\340\0\0\0\326\0\0\0\306\0\0\0\265" "\0\0\0\250\0\0\0\235\0\0\0\226\0\0\0\220\0\0\0\213\0\0\0\206\0\0\0\200\0" "\0\0z\0\0\0t\0\0\0m\0\0\0f\0\0\0_\0\0\0X\0\0\0P\0\0\0I\0\0\0B\0\0\0;\0\0" "\0""5\0\0\0.\0\0\0)\0\0\0#\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0" "\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3" "\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213" "\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372" "\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\366\366\366\265\354\354" "\354\267\336\336\336\272\314\315\316\277\272\276\301\306\255\263\271\314" "\243\253\263\321\232\245\256\326\225\243\260\333\222\245\266\341\222\251" "\275\347\222\255\305\353\223\261\314\360\220\263\321\364\215\265\326\367" "\214\266\332\372\212\271\337\374\213\275\344\376\240\314\362\377\242\317" "\367\377\242\317\367\377\242\317\367\377\236\314\365\377{\271\346\377T\245" "\327\377L\241\323\377I\237\322\377E\235\321\377C\234\320\377D\234\320\377" "C\234\320\377<\226\313\3770\212\272\377,\205\265\3775\212\273\377F\221\305" "\377Z\231\317\376f\230\311\371r\227\275\357\201\227\257\340\233\245\256\320" "\274\276\300\303\327\327\327\274\352\352\352\267\365\365\365\265\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\331\0\0\0\341\0\0\0\340\0\0\0\327\0\0\0\307\0\0\0\267\0\0" "\0\251\0\0\0\236\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\210\0\0\0\202\0\0\0" "|\0\0\0u\0\0\0o\0\0\0h\0\0\0a\0\0\0Y\0\0\0R\0\0\0J\0\0\0C\0\0\0<\0\0\0""6" "\0\0\0""0\0\0\0)\0\0\0%\0\0\0\37\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0" "\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206" "\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\372\372\372\264\367\367\367" "\264\362\362\362\266\354\354\354\267\346\346\346\270\337\337\337\272\330" "\330\330\273\320\320\320\275\311\312\312\300\300\301\302\302\266\270\272" "\305\254\257\262\311\242\246\252\315\233\242\250\321\226\241\253\327\223" "\242\257\334\220\242\263\341\216\245\270\346\215\250\277\354\216\254\310" "\360\220\262\320\364\223\271\332\370\231\301\346\373\227\305\354\375\207" "\275\346\376\177\270\343\376x\265\341\376q\263\337\377k\260\335\377e\254" "\333\377]\250\330\377P\240\321\377I\226\306\377Q\226\311\377_\234\321\376" "j\234\316\373r\223\267\355\202\225\252\336\231\240\250\320\264\265\270\305" "\314\314\314\276\337\337\337\272\354\354\354\267\366\366\366\265\372\372" "\372\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262" "\262\305\206\206\206\321\0\0\0\331\0\0\0\341\0\0\0\341\0\0\0\327\0\0\0\310" "\0\0\0\270\0\0\0\252\0\0\0\240\0\0\0\231\0\0\0\223\0\0\0\216\0\0\0\212\0" "\0\0\204\0\0\0~\0\0\0w\0\0\0p\0\0\0i\0\0\0b\0\0\0[\0\0\0T\0\0\0M\0\0\0E\0" "\0\0>\0\0\0""7\0\0\0""0\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245" "\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266" "\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\375\375\375\263\374\374\374\264\372\372\372\264\367\367\367\264\366\366" "\366\265\363\363\363\265\360\360\360\266\356\356\356\267\352\352\352\267" "\346\346\346\270\340\340\340\272\333\333\333\273\324\324\324\274\315\315" "\315\276\305\305\305\300\273\273\273\302\262\262\262\305\250\252\254\311" "\242\246\252\315\234\244\252\321\226\240\251\326\220\235\250\333\214\234" "\253\340\213\237\261\345\214\245\271\352\216\252\304\360\223\264\321\364" "\224\272\332\370\221\273\336\372\216\273\340\373\205\267\337\375v\250\326" "\374q\236\313\370u\225\267\355\201\222\246\336\234\240\245\315\263\263\264" "\305\310\310\310\277\330\330\330\273\347\347\347\270\362\362\362\266\367" "\367\367\264\374\374\374\264\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357" "\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\332\0" "\0\0\341\0\0\0\341\0\0\0\327\0\0\0\311\0\0\0\270\0\0\0\253\0\0\0\241\0\0" "\0\232\0\0\0\225\0\0\0\220\0\0\0\213\0\0\0\205\0\0\0\177\0\0\0y\0\0\0r\0" "\0\0k\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0F\0\0\0?\0\0\0""8\0\0\0""2\0\0\0," "\0\0\0&\0\0\0!\0\0\0\34\0\0\0\30\0\0\0\24\0\0\0\20\0\0\0\15\0\0\0\13\0\0" "\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0" "\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262" "\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\375\375\375\263\375\375\375\263\374\374\374\264\374" "\374\374\264\372\372\372\264\367\367\367\264\366\366\366\265\363\363\363" "\265\362\362\362\266\357\357\357\266\353\353\353\267\347\347\347\270\343" "\343\343\271\337\337\337\272\332\332\332\273\323\323\323\275\315\315\315" "\276\304\304\304\300\274\274\274\302\263\264\264\305\255\257\261\310\246" "\253\256\313\237\245\252\317\226\235\245\323\217\231\242\330\215\232\246" "\335\214\235\255\342\213\240\265\347\203\233\264\347\205\226\247\334\227" "\235\244\320\253\254\256\307\302\302\302\301\322\322\322\275\340\340\340" "\272\353\353\353\267\365\365\365\265\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327" "\327\327\274\262\262\262\305\206\206\206\321\0\0\0\332\0\0\0\342\0\0\0\341" "\0\0\0\327\0\0\0\311\0\0\0\271\0\0\0\254\0\0\0\242\0\0\0\233\0\0\0\226\0" "\0\0\221\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0l\0\0\0e\0\0\0" "]\0\0\0V\0\0\0O\0\0\0H\0\0\0A\0\0\0:\0\0\0""3\0\0\0,\0\0\0'\0\0\0\"\0\0\0" "\35\0\0\0\30\0\0\0\24\0\0\0\21\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6" "\0\0\0\4\0\0\0\4\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\375\375\375\263\374\374\374\264\374\374\374\264\372" "\372\372\264\371\371\371\264\366\366\366\265\365\365\365\265\362\362\362" "\266\360\360\360\266\354\354\354\267\352\352\352\267\344\344\344\271\340" "\340\340\272\334\334\334\272\327\327\327\274\322\322\322\275\314\314\314" "\276\303\303\303\300\274\275\275\302\265\266\267\305\257\261\262\307\250" "\253\255\312\246\251\255\312\256\260\261\306\274\274\274\302\311\311\311" "\277\332\332\332\273\346\346\346\270\357\357\357\266\366\366\366\265\374" "\374\374\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\332\0\0\0\342\0\0\0\341\0\0\0\330\0\0\0\311\0" "\0\0\272\0\0\0\255\0\0\0\243\0\0\0\234\0\0\0\227\0\0\0\222\0\0\0\215\0\0" "\0\207\0\0\0\202\0\0\0|\0\0\0u\0\0\0n\0\0\0f\0\0\0_\0\0\0W\0\0\0P\0\0\0H" "\0\0\0A\0\0\0:\0\0\0""3\0\0\0-\0\0\0'\0\0\0\"\0\0\0\35\0\0\0\31\0\0\0\24" "\0\0\0\21\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0" "\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245" "\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266" "\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\375\375\375\263\374\374\374\264\374\374\374\264\372\372\372\264" "\371\371\371\264\367\367\367\264\366\366\366\265\363\363\363\265\360\360" "\360\266\356\356\356\267\352\352\352\267\347\347\347\270\343\343\343\271" "\337\337\337\272\332\332\332\273\324\324\324\274\321\321\321\275\316\316" "\316\276\317\317\317\275\324\324\324\274\336\336\336\272\353\353\353\267" "\363\363\363\265\371\371\371\264\374\374\374\264\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372" "\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321" "\0\0\0\332\0\0\0\342\0\0\0\341\0\0\0\330\0\0\0\312\0\0\0\272\0\0\0\255\0" "\0\0\243\0\0\0\235\0\0\0\230\0\0\0\223\0\0\0\216\0\0\0\211\0\0\0\203\0\0" "\0|\0\0\0u\0\0\0n\0\0\0g\0\0\0_\0\0\0X\0\0\0Q\0\0\0I\0\0\0B\0\0\0;\0\0\0" """4\0\0\0.\0\0\0(\0\0\0\"\0\0\0\35\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\16\0" "\0\0\14\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13" "\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\332\0\0\0\342" "\0\0\0\341\0\0\0\330\0\0\0\312\0\0\0\273\0\0\0\255\0\0\0\244\0\0\0\236\0" "\0\0\230\0\0\0\224\0\0\0\216\0\0\0\212\0\0\0\203\0\0\0}\0\0\0w\0\0\0p\0\0" "\0h\0\0\0a\0\0\0Y\0\0\0Q\0\0\0J\0\0\0C\0\0\0<\0\0\0""5\0\0\0.\0\0\0)\0\0" "\0#\0\0\0\36\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0" "\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0" "c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305" "\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274" "\262\262\262\305\206\206\206\321\0\0\0\332\0\0\0\342\0\0\0\342\0\0\0\331" "\0\0\0\312\0\0\0\273\0\0\0\256\0\0\0\244\0\0\0\236\0\0\0\231\0\0\0\224\0" "\0\0\217\0\0\0\212\0\0\0\204\0\0\0~\0\0\0w\0\0\0p\0\0\0i\0\0\0b\0\0\0Z\0" "\0\0R\0\0\0J\0\0\0C\0\0\0<\0\0\0""5\0\0\0/\0\0\0)\0\0\0#\0\0\0\36\0\0\0\32" "\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375" "\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206" "\206\206\321\0\0\0\332\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\312\0\0\0\273" "\0\0\0\256\0\0\0\245\0\0\0\236\0\0\0\231\0\0\0\225\0\0\0\220\0\0\0\212\0" "\0\0\205\0\0\0~\0\0\0w\0\0\0p\0\0\0i\0\0\0b\0\0\0[\0\0\0S\0\0\0K\0\0\0D\0" "\0\0<\0\0\0""6\0\0\0/\0\0\0)\0\0\0$\0\0\0\37\0\0\0\32\0\0\0\26\0\0\0\22\0" "\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0" "\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0" "\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214" "\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372" "\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264" "\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333" "\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\312\0\0\0\273\0\0\0\256\0\0\0\245\0" "\0\0\236\0\0\0\232\0\0\0\226\0\0\0\221\0\0\0\213\0\0\0\205\0\0\0\177\0\0" "\0x\0\0\0q\0\0\0j\0\0\0b\0\0\0[\0\0\0T\0\0\0L\0\0\0D\0\0\0=\0\0\0""6\0\0" "\0""0\0\0\0)\0\0\0$\0\0\0\37\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\14" "\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0" "\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321" "\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375" "\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266" "\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\342\0\0" "\0\342\0\0\0\331\0\0\0\312\0\0\0\273\0\0\0\256\0\0\0\245\0\0\0\237\0\0\0" "\232\0\0\0\226\0\0\0\221\0\0\0\214\0\0\0\205\0\0\0\177\0\0\0y\0\0\0r\0\0" "\0j\0\0\0c\0\0\0[\0\0\0T\0\0\0L\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0" "\0\0%\0\0\0\37\0\0\0\33\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\12\0\0" "\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0" "\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305" "\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274" "\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\342\0\0\0\342\0\0\0\331" "\0\0\0\312\0\0\0\273\0\0\0\257\0\0\0\245\0\0\0\237\0\0\0\232\0\0\0\226\0" "\0\0\221\0\0\0\214\0\0\0\206\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0c\0\0\0" "[\0\0\0T\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\37\0" "\0\0\33\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0" "\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0" "\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\273\0\0\0\257\0\0\0\246\0\0\0\240\0\0\0\232\0\0\0\226\0\0\0\221\0\0" "\0\214\0\0\0\206\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0\\\0\0\0T\0\0" "\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\257\0\0\0\246\0\0\0\240\0\0\0\233\0\0\0\226\0\0\0\221\0\0\0\214\0\0\0" "\206\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0\\\0\0\0T\0\0\0M\0\0\0E\0" "\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\257\0\0\0" "\246\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\214\0\0\0\207\0\0\0\200" "\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0\\\0\0\0U\0\0\0M\0\0\0E\0\0\0>\0\0\0""7" "\0\0\0""0\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\342" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\257\0\0\0\246\0\0\0\240\0" "\0\0\233\0\0\0\227\0\0\0\222\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0s" "\0\0\0k\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\342\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\257\0\0\0\246\0\0\0\240\0\0\0\233\0\0\0\227" "\0\0\0\222\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0k\0\0\0d\0\0" "\0]\0\0\0U\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\246\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0" "\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0" "\0M\0\0\0F\0\0\0>\0\0\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\246\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0" "\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0F\0" "\0\0>\0\0\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0F\0\0\0>\0\0\0""7" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0F\0\0\0>\0\0\0""7\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227" "\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0>\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227" "\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\337\337\337\272UUU\337" "UUU\337UUU\337UUU\337UUU\337UUU\337UUU\337UUU\337UUU\337UUU\337UUU\337\232" "\232\232\313\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\251\251\251\307UUU\337\242\242\242\311\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\337" "\337\337\272QQQ\340'''\357\0\0\0\377\0\0\0\377\3\3\3\376///\354///\354//" "/\354///\354///\354\17\17\17\371]]]\335\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263>>>\347\0\0\0\377\247\247\247" "\310\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262" "\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0" "\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0" "\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0" "\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33" "\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263lll\330\0\0\0\377\0\0\0\377\15" "\15\15\371\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263CCC\345]]]\335\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\371\371\371\264\12\12\12\373\7\7\7\374\365\365\365\265" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262" "\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313" "\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0" "\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0" "\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0" "\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0" "\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0" "\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263lll\330\0\0\0\377\0\0\0\377\15\15" "\15\371\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263YYY\336ppp\327\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\256\256\256\305\0\0\0\377888\351\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375" "\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305" "\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0" "\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215" "\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0" "\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0" "\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3" "\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1" "\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0" "\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266" "\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263lll\330\0\0\0\377\0\0\0\377\15\15\15\371" "\377\377\377\263\377\377\377\263\377\377\377\263\233\233\233\313\277\277" "\277\301\377\377\377\263\377\377\377\263\302\302\302\301\211\211\211\320" "\211\211\211\320\211\211\211\320\211\211\211\320\366\366\366\265\252\252" "\252\307OOO\341FFF\344\213\213\213\317\377\377\377\263\356\356\356\267\226" "\226\226\314___\334FFF\344FFF\344\\\\\\\335\234\234\234\312\372\372\372\264" "\377\377\377\263\377\377\377\263\315\315\315\276\211\211\211\320\211\211" "\211\320\211\211\211\320\211\211\211\320\366\366\366\265\232\232\232\313" "MMM\342NNN\341\227\227\227\313\377\377\377\263\377\377\377\263\255\255\255" "\306TTT\340III\343\210\210\210\320\374\374\374\264\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\270\270\270\303bbb\333GGG\344PPP\341\211\211\211\317\366\366\366\265\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\270\270\270\303ddd\332HHH\344EEE\344[[[\335\206\206\206\320\314\314" "\314\276\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263bbb\333\0\0\0\377{{{\323\377\377\377\263\377\377\377\263" "\377\377\377\263\270\270\270\303ddd\332HHH\344EEE\344[[[\335\206\206\206" "\320\314\314\314\276\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\270\270\270\303bbb\333GGG\344PPP\341\211\211" "\211\317\366\366\366\265\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\276\276\276\302eee\332G" "GG\344JJJ\343hhh\331\245\245\245\310\366\366\366\265\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263lll\330" "\0\0\0\377\0\0\0\377\15\15\15\371\377\377\377\263\377\377\377\263\377\377" "\377\263333\353ttt\326\377\377\377\263\377\377\377\263\206\206\206\320##" "#\361\0\0\0\377\0\0\0\377\0\0\0\377{{{\323\1\1\1\377\2\2\2\376\0\0\0\377" "@@@\346\377\377\377\263]]]\335\0\0\0\377<<<\347uuu\325VVV\337\4\4\4\376\0" "\0\0\377,,,\355\356\356\356\267\377\377\377\263\233\233\233\313###\361\0" "\0\0\377\0\0\0\377\0\0\0\377[[[\335\3\3\3\376\0\0\0\377\0\0\0\377\0\0\0\377" "rrr\326vvv\325\2\2\2\376\1\1\1\377\0\0\0\377\0\0\0\377XXX\336\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263SSS\340" "\0\0\0\377\12\12\12\373iii\331///\355\0\0\0\377\40\40\40\362\336\336\336" "\272\377\377\377\263\377\377\377\263\377\377\377\263kkk\330\0\0\0\377\1\1" "\1\376MMM\342sss\326QQQ\341\4\4\4\376\15\15\15\371\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263$$$\360\0\0\0\377" "\316\316\316\276\377\377\377\263\377\377\377\263kkk\330\0\0\0\377\1\1\1\376" "MMM\342sss\326QQQ\341\4\4\4\376\15\15\15\371\377\377\377\263\377\377\377" "\263\377\377\377\263\375\375\375\263SSS\340\0\0\0\377\12\12\12\373iii\331" "///\355\0\0\0\377\40\40\40\362\336\336\336\272\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263ZZZ\336\0\0\0\377\0\0\0\377444\352rr" "r\326HHH\344\0\0\0\377$$$\360\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262" "\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0" "\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0" "\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0" "\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33" "\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263lll\330\0\0\0\377\0\0\0\377\6" "\6\6\375YYY\336YYY\336YYY\336\24\24\24\366ttt\326\377\377\377\263\377\377" "\377\263\377\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\35" "\35\35\363\307\307\307\300\366\366\366\265;;;\350@@@\346\377\377\377\263" "]]]\335666\352\377\377\377\263\377\377\377\263\377\377\377\263qqq\326\0\0" "\0\377\0\0\0\377ggg\331\377\377\377\263\377\377\377\263\350\350\350\270\0" "\0\0\377\0\0\0\377\0\0\0\377@@@\347\363\363\363\265\245\245\245\310\0\0\0" "\377\0\0\0\377\10\10\10\374---\355\352\352\352\267\314\314\314\276\1\1\1" "\376\0\0\0\377\4\4\4\376\350\350\350\270\377\377\377\263\377\377\377\263" "\377\377\377\263zzz\324\0\0\0\377\0\0\0\377nnn\327\377\377\377\263\343\343" "\343\271\1\1\1\376\0\0\0\377777\352\377\377\377\263\377\377\377\263\346\346" "\346\270\3\3\3\376\0\0\0\377EEE\345\377\377\377\263\377\377\377\263\377\377" "\377\263\201\201\201\322\15\15\15\371\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\337\337\337\272\1\1\1\377\32\32\32\365\377\377" "\377\263\377\377\377\263\346\346\346\270\3\3\3\376\0\0\0\377EEE\345\377\377" "\377\263\377\377\377\263\377\377\377\263\201\201\201\322\15\15\15\371\377" "\377\377\263\377\377\377\263\377\377\377\263zzz\324\0\0\0\377\0\0\0\377n" "nn\327\377\377\377\263\343\343\343\271\1\1\1\376\0\0\0\377777\352\377\377" "\377\263\377\377\377\263\377\377\377\263~~~\323\0\0\0\377\0\0\0\377111\354" "\377\377\377\263\377\377\377\263\377\377\377\263TTT\340\34\34\34\363\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263lll\330\0\0\0\377\0\0\0\377\3\3\3\376,,,\355,,,\355,,,\355\13" "\13\13\373ttt\326\377\377\377\263\377\377\377\263\377\377\377\263\350\350" "\350\270\0\0\0\377\0\0\0\377\0\0\0\377\200\200\200\322\377\377\377\263\377" "\377\377\263\264\264\264\304\202\202\202\321\377\377\377\263\323\323\323" "\275\327\327\327\274\377\377\377\263\377\377\377\263\377\377\377\263\267" "\267\267\303\0\0\0\377\0\0\0\377'''\360\377\377\377\263\377\377\377\263\350" "\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\273\273\273\302\377\377\377\263" "\372\372\372\264\1\1\1\376\0\0\0\377\0\0\0\377\227\227\227\314\377\377\377" "\263\377\377\377\263\26\26\26\365\0\0\0\377\0\0\0\377\261\261\261\305\377" "\377\377\263\377\377\377\263\377\377\377\263\23\23\23\367\0\0\0\377\0\0\0" "\377\244\244\244\310\377\377\377\263\377\377\377\263\30\30\30\365\0\0\0\377" "\0\0\0\377\305\305\305\300\377\377\377\263\270\270\270\303\0\0\0\377\0\0" "\0\377!!!\361\342\342\342\271\377\377\377\263\377\377\377\263\346\346\346" "\270aaa\334\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\213\213\213\317\0\0\0\377UUU\337\377\377\377\263\377\377\377\263\270\270" "\270\303\0\0\0\377\0\0\0\377!!!\361\342\342\342\271\377\377\377\263\377\377" "\377\263\346\346\346\270aaa\334\377\377\377\263\377\377\377\263\377\377\377" "\263\23\23\23\367\0\0\0\377\0\0\0\377\244\244\244\310\377\377\377\263\377" "\377\377\263\30\30\30\365\0\0\0\377\0\0\0\377\305\305\305\300\377\377\377" "\263\377\377\377\263\24\24\24\366\0\0\0\377\0\0\0\377\203\203\203\321\377" "\377\377\263\377\377\377\263\377\377\377\263\261\261\261\305\34\34\34\363" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372" "\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321" "\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0" "\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0" "\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0" "\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17" "\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0" "\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206" "\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264" "\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263lll\330\0\0\0\377\0\0\0\377\15\15\15\371\377\377\377\263" "\377\377\377\263\377\377\377\263333\353ttt\326\377\377\377\263\377\377\377" "\263\377\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\311\311" "\311\277\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\354\354\354\267\227\227\227\313rrr\326i" "ii\331QQQ\340\0\0\0\377\0\0\0\377\23\23\23\367\377\377\377\263\377\377\377" "\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\346\346\346\270\377\377" "\377\263\377\377\377\263\11\11\11\373\0\0\0\377\0\0\0\377\275\275\275\302" "\377\377\377\263\377\377\377\263!!!\362\0\0\0\377\0\0\0\377\241\241\241\311" "\377\377\377\263\377\377\377\263\321\321\321\275\0\0\0\377\0\0\0\377\0\0" "\0\377\270\270\270\303\377\377\377\263\377\377\377\263&&&\360\0\0\0\377\0" "\0\0\377yyy\324\377\377\377\263\321\321\321\275\0\0\0\377\0\0\0\377\0\0\0" "\377\4\4\4\375444\353yyy\324\340\340\340\272\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263EEE\344\0\0\0\377\237" "\237\237\312\377\377\377\263\377\377\377\263\321\321\321\275\0\0\0\377\0" "\0\0\377\0\0\0\377\4\4\4\375444\353yyy\324\340\340\340\272\377\377\377\263" "\377\377\377\263\377\377\377\263\321\321\321\275\0\0\0\377\0\0\0\377\0\0" "\0\377\270\270\270\303\377\377\377\263\377\377\377\263&&&\360\0\0\0\377\0" "\0\0\377yyy\324\377\377\377\263\321\321\321\275\0\0\0\377\0\0\0\377\0\0\0" "\377\252\252\252\307\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\366\366\366\265\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262" "\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0" "\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0" "\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0" "\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33" "\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0:\0\0\0d\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263lll\330\0\0\0\377\0\0\0\377\15" "\15\15\371\377\377\377\263\377\377\377\263\377\377\377\263sss\326\243\243" "\243\310\377\377\377\263\377\377\377\263\377\377\377\263\350\350\350\270" "\0\0\0\377\0\0\0\377\0\0\0\377\346\346\346\270\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\237\237\237\311\13\13" "\13\372\0\0\0\377\15\15\15\372@@@\347666\352\0\0\0\377\0\0\0\377\20\20\20" "\370\377\377\377\263\377\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377" "\0\0\0\377\350\350\350\270\377\377\377\263\377\377\377\263\13\13\13\373\0" "\0\0\377\0\0\0\377\277\277\277\301\377\377\377\263\377\377\377\263\"\"\"" "\361\0\0\0\377\0\0\0\377\237\237\237\312\377\377\377\263\377\377\377\263" "\263\263\263\304\0\0\0\377\0\0\0\377\0\0\0\377\24\24\24\367\32\32\32\365" "\32\32\32\365\5\5\5\375\0\0\0\377\0\0\0\377XXX\337\377\377\377\263\377\377" "\377\263===\347\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\6\6\6\374" "\201\201\201\322\377\377\377\263\377\377\377\263\377\377\377\263\374\374" "\374\264\16\16\16\371\5\5\5\375\357\357\357\266\377\377\377\263\377\377\377" "\263\377\377\377\263===\347\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\6\6\6\374\201\201\201\322\377\377\377\263\377\377\377\263\263\263\263" "\304\0\0\0\377\0\0\0\377\0\0\0\377\24\24\24\367\32\32\32\365\32\32\32\365" "\5\5\5\375\0\0\0\377\0\0\0\377XXX\337\377\377\377\263\263\263\263\304\0\0" "\0\377\0\0\0\377\0\0\0\377\270\270\270\303\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266" "\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0" "\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0" "\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0" "\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0" "\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0" "\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0:\0\0" "\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305" "\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263lll\330\0" "\0\0\377\0\0\0\377\15\15\15\371\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\350\350\350\270" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\363\363" "\363\265\15\15\15\372\0\0\0\377\2\2\2\376\311\311\311\277\377\377\377\263" "\277\277\277\301\0\0\0\377\0\0\0\377\20\20\20\370\377\377\377\263\377\377" "\377\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\350\350\350\270\377" "\377\377\263\377\377\377\263\13\13\13\373\0\0\0\377\0\0\0\377\277\277\277" "\301\377\377\377\263\377\377\377\263\"\"\"\361\0\0\0\377\0\0\0\377\237\237" "\237\312\377\377\377\263\377\377\377\263\271\271\271\303\0\0\0\377\0\0\0" "\377\0\0\0\377vvv\325\237\237\237\312\237\237\237\312\237\237\237\312\237" "\237\237\312\237\237\237\312\300\300\300\301\377\377\377\263\377\377\377" "\263\367\367\367\264vvv\325\37\37\37\362\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\1\1\1\376\317\317\317\275\377\377\377\263\377\377\377\263\270\270" "\270\303\0\0\0\377444\353\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\367\367\367\264vvv\325\37\37\37\362\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\1\1\1\376\317\317\317\275\377\377\377\263\271\271\271" "\303\0\0\0\377\0\0\0\377\0\0\0\377vvv\325\237\237\237\312\237\237\237\312" "\237\237\237\312\237\237\237\312\237\237\237\312\300\300\300\301\377\377" "\377\263\272\272\272\302\0\0\0\377\0\0\0\377\0\0\0\377\266\266\266\304\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372" "\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206" "\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260" "\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0" "\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0" "\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0" "\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0" "\0\0\13\0\0\0\34\0\0\0:\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206" "\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\251\251\251\307\216\216\216" "\316\371\371\371\264\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263lll\330\0\0\0\377\0\0\0\377\15\15\15\371\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\350\350\350\270\0\0\0\377\0" "\0\0\377\0\0\0\377\350\350\350\270\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\271\271\271\303\0\0\0\377\0\0\0\377\32\32\32\365" "\377\377\377\263\377\377\377\263\276\276\276\302\0\0\0\377\0\0\0\377\20\20" "\20\370\377\377\377\263\377\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377" "\0\0\0\377\350\350\350\270\377\377\377\263\377\377\377\263\13\13\13\373\0" "\0\0\377\0\0\0\377\277\277\277\301\377\377\377\263\377\377\377\263\"\"\"" "\361\0\0\0\377\0\0\0\377\237\237\237\312\377\377\377\263\377\377\377\263" "\344\344\344\271\0\0\0\377\0\0\0\377\0\0\0\377\251\251\251\307\377\377\377" "\263\377\377\377\263\377\377\377\263\374\374\374\264\316\316\316\276\354" "\354\354\267\377\377\377\263\363\363\363\265\304\304\304\300\377\377\377" "\263\377\377\377\263\326\326\326\274rrr\326\4\4\4\376\0\0\0\377\0\0\0\377" "\216\216\216\316\377\377\377\263\377\377\377\263jjj\331\0\0\0\377uuu\325" "\377\377\377\263\377\377\377\263\377\377\377\263\363\363\363\265\304\304" "\304\300\377\377\377\263\377\377\377\263\326\326\326\274rrr\326\4\4\4\376" "\0\0\0\377\0\0\0\377\216\216\216\316\377\377\377\263\344\344\344\271\0\0" "\0\377\0\0\0\377\0\0\0\377\251\251\251\307\377\377\377\263\377\377\377\263" "\377\377\377\263\374\374\374\264\316\316\316\276\354\354\354\267\377\377" "\377\263\350\350\350\270\1\1\1\376\0\0\0\377\0\0\0\377\237\237\237\312\377" "\377\377\263\377\377\377\263\377\377\377\263\342\342\342\271\254\254\254" "\306\365\365\365\265\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372" "\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206" "\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260" "\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0" "\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0" "\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0" "\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0" "\0\0\13\0\0\0\34\0\0\0:\0\0\0c\0\0\0\212\0\0\0\244\0\0\0\245\0\0\0\214\200" "\200\200\307\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\244\244\244\310\0\0\0\377\0\0\0\377]]]\335\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263lll\330" "\0\0\0\377\0\0\0\377\15\15\15\371\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\350\350\350" "\270\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\270" "\270\270\303\0\0\0\377\0\0\0\377\17\17\17\371\375\375\375\263\377\377\377" "\263\221\221\221\315\0\0\0\377\0\0\0\377\20\20\20\370\377\377\377\263\377" "\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\350\350\350\270" "\377\377\377\263\377\377\377\263\13\13\13\373\0\0\0\377\0\0\0\377\277\277" "\277\301\377\377\377\263\377\377\377\263\"\"\"\361\0\0\0\377\0\0\0\377\237" "\237\237\312\377\377\377\263\377\377\377\263\377\377\377\263***\356\0\0\0" "\377\0\0\0\377vvv\325\377\377\377\263\377\377\377\263\377\377\377\263\264" "\264\264\304\0\0\0\377\270\270\270\303\377\377\377\263\311\311\311\277\6" "\6\6\374\360\360\360\266\377\377\377\263\377\377\377\263\377\377\377\263" ">>>\347\0\0\0\377\0\0\0\377\227\227\227\313\377\377\377\263\377\377\377\263" "***\356\0\0\0\377\307\307\307\300\377\377\377\263\377\377\377\263\377\377" "\377\263\311\311\311\277\6\6\6\374\360\360\360\266\377\377\377\263\377\377" "\377\263\377\377\377\263>>>\347\0\0\0\377\0\0\0\377\227\227\227\313\377\377" "\377\263\377\377\377\263***\356\0\0\0\377\0\0\0\377vvv\325\377\377\377\263" "\377\377\377\263\377\377\377\263\264\264\264\304\0\0\0\377\270\270\270\303" "\377\377\377\263\377\377\377\263333\353\0\0\0\377\0\0\0\377iii\331\377\377" "\377\263\377\377\377\263\377\377\377\263qqq\326\14\14\14\372\371\371\371" "\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357" "\357\357\266\327\327\327\274\262\262\262\305\200\200\200\307\0\0\0\333\0" "\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0" "\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0" "z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0" """1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0" "\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\34" "\0\0\0""9\0\0\0b\0\0\0\211\0\0\0\243\0\0\0\244\0\0\0\214uuu\267\262\262\262" "\305\327\327\327\274\356\356\356\267\371\371\371\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263hhh\331\0\0\0\377\0\0\0\377(((\357\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\365\365\365\265\277\277\277\301UUU\337\0\0\0\377\0\0\0\377\13\13\13" "\372\277\277\277\301\300\300\300\301\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\346\346\346\270\260\260\260" "\305\0\0\0\377\0\0\0\377\0\0\0\377\260\260\260\305\316\316\316\276\377\377" "\377\263\377\377\377\263\377\377\377\263\357\357\357\266\10\10\10\374\0\0" "\0\377\0\0\0\377NNN\341\201\201\201\322\36\36\36\363\0\0\0\377\0\0\0\377" "\15\15\15\371\277\277\277\301\326\326\326\274\260\260\260\305\0\0\0\377\0" "\0\0\377\0\0\0\377\260\260\260\305\360\360\360\266\277\277\277\301\10\10" "\10\373\0\0\0\377\0\0\0\377\222\222\222\315\353\353\353\267\303\303\303\300" "\34\34\34\364\0\0\0\377\0\0\0\377{{{\323\326\326\326\274\377\377\377\263" "\377\377\377\263\261\261\261\305\3\3\3\376\0\0\0\377\26\26\26\365\333\333" "\333\273\377\377\377\263\346\346\346\270***\356111\354\377\377\377\263\377" "\377\377\263\311\311\311\277\0\0\0\377PPP\341\365\365\365\265\377\377\377" "\263\344\344\344\271\34\34\34\363\0\0\0\377\12\12\12\373\346\346\346\270" "\377\377\377\263\346\346\346\270\2\2\2\376\25\25\25\366\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\311\311\311\277\0\0\0\377PP" "P\341\365\365\365\265\377\377\377\263\344\344\344\271\34\34\34\363\0\0\0" "\377\12\12\12\373\346\346\346\270\377\377\377\263\377\377\377\263\261\261" "\261\305\3\3\3\376\0\0\0\377\26\26\26\365\333\333\333\273\377\377\377\263" "\346\346\346\270***\356111\354\377\377\377\263\377\377\377\263\377\377\377" "\263\300\300\300\301\7\7\7\374\0\0\0\377\22\22\22\370\324\324\324\274\377" "\377\377\263\323\323\323\275\23\23\23\367ggg\331\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\375\375\375\263\371\371\371\264\356\356\356\267" "\327\327\327\274\262\262\262\305uuu\267\0\0\0\333\0\0\0\342\0\0\0\341\0\0" "\0\331\0\0\0\312\0\0\0\273\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0" "\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d" "\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0" "\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0" "\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\12\0\0\0\33\0\0\0""7\0\0\0_\0\0" "\0\206\0\0\0\241\0\0\0\243\0\0\0\214ccc\244\261\261\261\305\326\326\326\274" "\356\356\356\267\371\371\371\264\375\375\375\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\272\272\272\302" "\4\4\4\376\0\0\0\377uuu\325\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\311\311" "\311\277\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\2\2" "\2\376\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\204\204\204\321\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" "\0\377///\354\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\206\206\206\320\4\4\4\375\0\0\0\377\0\0\0\377$$$\360\227\227\227\314" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377GGG\344\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0\377\266\266\266\304\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\237\237\237\312\13\13\13\373\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377GGG\344\377\377\377\263\377\377\377\263\377\377\377\263\247" "\247\247\310\34\34\34\364\0\0\0\377\4\4\4\375\34\34\34\364\10\10\10\374>" ">>\347\346\346\346\270\377\377\377\263\377\377\377\263\330\330\330\273\32" "\32\32\364\0\0\0\377\12\12\12\373\34\34\34\364\6\6\6\375\0\0\0\377\36\36" "\36\363\256\256\256\305\377\377\377\263\377\377\377\263\222\222\222\315\0" "\0\0\377PPP\341\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\330\330\330\273\32\32\32\364\0\0\0\377\12\12\12\373\34\34\34\364\6\6" "\6\375\0\0\0\377\36\36\36\363\256\256\256\305\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\247\247\247\310\34\34\34\364\0\0\0\377" "\4\4\4\375\34\34\34\364\10\10\10\374>>>\347\346\346\346\270\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\273\273\273\302)))\357\0" "\0\0\377\4\4\4\376\33\33\33\364\7\7\7\374TTT\337\372\372\372\264\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\375\375\375\263\371\371\371\264" "\356\356\356\267\326\326\326\274\261\261\261\305ccc\244\0\0\0\333\0\0\0\342" "\0\0\0\341\0\0\0\330\0\0\0\311\0\0\0\273\0\0\0\257\0\0\0\247\0\0\0\240\0" "\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0>\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\12\0\0\0\31\0\0\0""5" "\0\0\0\\\0\0\0\203\0\0\0\237\0\0\0\243\0\0\0\216HHH\220\255\255\255\306\323" "\323\323\275\354\354\354\267\371\371\371\264\375\375\375\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\322\322\322\275\273\273\273\302\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\342" "\342\342\271\252\252\252\307\303\303\303\300\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\314\314\314\276\252\252\252\307\261\261\261\305\343" "\343\343\271\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\347\347\347\270\272\272\272\302\247" "\247\247\310\255\255\255\306\323\323\323\275\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263KKK\342\0\0\0\377\227\227\227\313\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\347\347\347\270\272\272\272\302\247\247\247\310\255" "\255\255\306\323\323\323\275\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\314\314\314\276\252\252\252\307\261\261\261\305\343\343\343" "\271\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\330\330\330" "\273\256\256\256\305\256\256\256\305\344\344\344\271\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375" "\263\371\371\371\264\354\354\354\267\323\323\323\275\255\255\255\306HHH\220" "\0\0\0\333\0\0\0\342\0\0\0\340\0\0\0\327\0\0\0\310\0\0\0\272\0\0\0\257\0" "\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0" "\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0F\0\0\0>\0\0" "\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17" "\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0" "\11\0\0\0\27\0\0\0""1\0\0\0W\0\0\0\177\0\0\0\234\0\0\0\243\0\0\0\221&&&\177" "\247\247\247\307\316\316\316\276\350\350\350\270\367\367\367\264\375\375" "\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263///\355\33\33\33" "\364\353\353\353\267\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\367\367\367\264\350\350\350\270\316\316\316" "\276\247\247\247\307&&&\177\0\0\0\334\0\0\0\342\0\0\0\337\0\0\0\325\0\0\0" "\307\0\0\0\271\0\0\0\256\0\0\0\246\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222" "\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U" "\0\0\0M\0\0\0F\0\0\0>\0\0\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0" "\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0" "\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\2\0\0\0\10\0\0\0\25\0\0\0-\0\0\0Q\0\0\0y\0\0\0\230\0\0" "\0\244\0\0\0\227\10\10\10x\235\235\235\312\305\305\305\300\343\343\343\271" "\365\365\365\265\374\374\374\264\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\374\374\374\264\365\365" "\365\265\343\343\343\271\305\305\305\300\235\235\235\312\10\10\10x\0\0\0" "\336\0\0\0\342\0\0\0\336\0\0\0\323\0\0\0\305\0\0\0\267\0\0\0\255\0\0\0\245" "\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\200\0" "\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0F\0\0\0>\0\0\0""7\0" "\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0" "\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\7\0\0" "\0\22\0\0\0(\0\0\0K\0\0\0s\0\0\0\225\0\0\0\245\0\0\0\236\0\0\0\201\206\206" "\206\272\272\272\272\302\333\333\333\273\360\360\360\266\372\372\372\264" "\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\375\375\375\263\372\372\372\264\360\360\360\266\333\333\333\273\272\272" "\272\302\206\206\206\272\0\0\0\327\0\0\0\340\0\0\0\342\0\0\0\335\0\0\0\321" "\0\0\0\303\0\0\0\266\0\0\0\254\0\0\0\245\0\0\0\240\0\0\0\233\0\0\0\227\0" "\0\0\222\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0" "]\0\0\0U\0\0\0M\0\0\0F\0\0\0>\0\0\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0" "\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0" "\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\5\0\0\0\17\0\0\0#\0\0\0D\0\0\0k\0\0\0" "\217\0\0\0\246\0\0\0\245\0\0\0\214III\217\255\255\255\306\321\321\321\275" "\352\352\352\267\367\367\367\264\375\375\375\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\375\375\375\263\367\367\367\264\352\352" "\352\267\321\321\321\275\255\255\255\306III\217\0\0\0\333\0\0\0\342\0\0\0" "\343\0\0\0\333\0\0\0\317\0\0\0\300\0\0\0\264\0\0\0\252\0\0\0\244\0\0\0\237" "\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0" "s\0\0\0k\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""1\0\0" "\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13" "\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\14\0\0\0\36" "\0\0\0<\0\0\0b\0\0\0\211\0\0\0\244\0\0\0\253\0\0\0\231\20\20\20}\234\234" "\234\312\304\304\304\300\342\342\342\271\362\362\362\266\372\372\372\264" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\372\372\372\264" "\362\362\362\266\342\342\342\271\304\304\304\300\234\234\234\312\20\20\20" "}\0\0\0\337\0\0\0\344\0\0\0\342\0\0\0\331\0\0\0\314\0\0\0\276\0\0\0\262\0" "\0\0\251\0\0\0\243\0\0\0\237\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\214\0\0" "\0\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0k\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0E" "\0\0\0>\0\0\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0" "\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0" "\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\3\0\0\0\12\0\0\0\30\0\0\0""3\0\0\0X\0\0\0\200\0\0\0\240\0\0" "\0\256\0\0\0\244\0\0\0\207uuu\256\263\263\263\304\326\326\326\274\353\353" "\353\267\367\367\367\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375" "\375\263\367\367\367\264\353\353\353\267\326\326\326\274\263\263\263\304" "uuu\256\0\0\0\332\0\0\0\342\0\0\0\345\0\0\0\341\0\0\0\326\0\0\0\310\0\0\0" "\273\0\0\0\260\0\0\0\251\0\0\0\243\0\0\0\237\0\0\0\233\0\0\0\227\0\0\0\222" "\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0\\\0\0\0" "U\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33" "\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\7\0\0\0\23\0\0\0+\0\0\0L\0\0\0t\0\0" "\0\227\0\0\0\256\0\0\0\254\0\0\0\227###\203\241\241\241\311\307\307\307\300" "\342\342\342\271\363\363\363\265\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\363\363\363\265\342\342\342\271\307\307\307\300\241\241" "\241\311###\203\0\0\0\337\0\0\0\345\0\0\0\345\0\0\0\336\0\0\0\322\0\0\0\304" "\0\0\0\270\0\0\0\256\0\0\0\247\0\0\0\243\0\0\0\237\0\0\0\233\0\0\0\226\0" "\0\0\221\0\0\0\214\0\0\0\206\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0" "\\\0\0\0T\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40\0" "\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0" "\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\5\0\0\0\17\0\0\0\"\0\0\0@\0\0" "\0f\0\0\0\214\0\0\0\251\0\0\0\261\0\0\0\244\0\0\0\205{{{\265\264\264\264" "\304\326\326\326\274\353\353\353\267\367\367\367\264\374\374\374\264\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\374\374\374" "\264\367\367\367\264\353\353\353\267\326\326\326\274\264\264\264\304{{{\265" "\0\0\0\331\0\0\0\343\0\0\0\347\0\0\0\344\0\0\0\332\0\0\0\315\0\0\0\300\0" "\0\0\265\0\0\0\254\0\0\0\247\0\0\0\242\0\0\0\237\0\0\0\232\0\0\0\226\0\0" "\0\221\0\0\0\214\0\0\0\206\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0\\" "\0\0\0T\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40\0\0" "\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0" "\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\12\0\0\0\32\0\0\0""3\0\0" "\0W\0\0\0~\0\0\0\240\0\0\0\262\0\0\0\256\0\0\0\227\37\37\37\201\237\237\237" "\311\304\304\304\300\340\340\340\272\360\360\360\266\371\371\371\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\371\371\371" "\264\360\360\360\266\340\340\340\272\304\304\304\300\237\237\237\311\37\37" "\37\201\0\0\0\337\0\0\0\346\0\0\0\347\0\0\0\341\0\0\0\326\0\0\0\311\0\0\0" "\273\0\0\0\261\0\0\0\252\0\0\0\246\0\0\0\241\0\0\0\236\0\0\0\232\0\0\0\226" "\0\0\0\221\0\0\0\214\0\0\0\206\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0c\0\0" "\0[\0\0\0T\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\37" "\0\0\0\33\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\7\0\0\0\23\0\0\0(\0" "\0\0G\0\0\0m\0\0\0\222\0\0\0\254\0\0\0\263\0\0\0\246\0\0\0\211```\234\256" "\256\256\305\317\317\317\275\346\346\346\270\363\363\363\265\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\375\375\375\263\372\372\372\264\363\363\363\265\346" "\346\346\270\317\317\317\275\256\256\256\305```\234\0\0\0\332\0\0\0\343\0" "\0\0\347\0\0\0\345\0\0\0\334\0\0\0\320\0\0\0\304\0\0\0\270\0\0\0\257\0\0" "\0\251\0\0\0\245\0\0\0\241\0\0\0\236\0\0\0\232\0\0\0\226\0\0\0\221\0\0\0" "\214\0\0\0\205\0\0\0\177\0\0\0y\0\0\0r\0\0\0j\0\0\0c\0\0\0[\0\0\0T\0\0\0" "L\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\37\0\0\0\33\0\0\0\26" "\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0" "\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\15\0\0\0\35\0\0\0""7\0\0\0Z\0" "\0\0\200\0\0\0\240\0\0\0\262\0\0\0\260\0\0\0\233\6\6\6|\223\223\223\312\270" "\270\270\303\324\324\324\274\350\350\350\270\365\365\365\265\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375" "\263\372\372\372\264\365\365\365\265\350\350\350\270\324\324\324\274\270" "\270\270\303\223\223\223\312\6\6\6|\0\0\0\340\0\0\0\346\0\0\0\347\0\0\0\341" "\0\0\0\327\0\0\0\312\0\0\0\276\0\0\0\264\0\0\0\254\0\0\0\247\0\0\0\244\0" "\0\0\241\0\0\0\235\0\0\0\232\0\0\0\226\0\0\0\221\0\0\0\213\0\0\0\205\0\0" "\0\177\0\0\0x\0\0\0q\0\0\0j\0\0\0b\0\0\0[\0\0\0T\0\0\0L\0\0\0D\0\0\0=\0\0" "\0""6\0\0\0""0\0\0\0)\0\0\0$\0\0\0\37\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17" "\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\2\0\0\0\10\0\0\0\24\0\0\0)\0\0\0G\0\0\0k\0\0\0\217\0\0\0" "\251\0\0\0\264\0\0\0\252\0\0\0\223\37\37\37\200\233\233\233\313\273\273\273" "\302\326\326\326\274\350\350\350\270\365\365\365\265\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\375\375\375\263\372\372\372\264\365\365\365\265\350" "\350\350\270\326\326\326\274\273\273\273\302\233\233\233\313\37\37\37\200" "\0\0\0\335\0\0\0\344\0\0\0\347\0\0\0\344\0\0\0\334\0\0\0\320\0\0\0\304\0" "\0\0\271\0\0\0\261\0\0\0\253\0\0\0\247\0\0\0\244\0\0\0\241\0\0\0\235\0\0" "\0\231\0\0\0\225\0\0\0\220\0\0\0\212\0\0\0\205\0\0\0~\0\0\0w\0\0\0p\0\0\0" "i\0\0\0b\0\0\0[\0\0\0S\0\0\0K\0\0\0D\0\0\0<\0\0\0""6\0\0\0/\0\0\0)\0\0\0" "$\0\0\0\37\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10" "\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4" "\0\0\0\15\0\0\0\34\0\0\0""5\0\0\0U\0\0\0{\0\0\0\233\0\0\0\260\0\0\0\263\0" "\0\0\250\0\0\0\220888\213\235\235\235\312\275\275\275\302\327\327\327\274" "\350\350\350\270\365\365\365\265\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264" "\365\365\365\265\350\350\350\270\327\327\327\274\275\275\275\302\235\235" "\235\312888\213\0\0\0\334\0\0\0\343\0\0\0\347\0\0\0\346\0\0\0\337\0\0\0\325" "\0\0\0\311\0\0\0\276\0\0\0\265\0\0\0\257\0\0\0\251\0\0\0\246\0\0\0\244\0" "\0\0\240\0\0\0\235\0\0\0\231\0\0\0\224\0\0\0\217\0\0\0\212\0\0\0\204\0\0" "\0~\0\0\0w\0\0\0p\0\0\0i\0\0\0b\0\0\0Z\0\0\0R\0\0\0J\0\0\0C\0\0\0<\0\0\0" """5\0\0\0/\0\0\0)\0\0\0#\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0\0" "\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\2\0\0\0\10\0\0\0\23\0\0\0%\0\0\0A\0\0\0c\0\0\0\206\0" "\0\0\243\0\0\0\263\0\0\0\263\0\0\0\247\0\0\0\220EEE\223\237\237\237\312\275" "\275\275\302\326\326\326\274\350\350\350\270\363\363\363\265\371\371\371" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\371\371\371\264\363" "\363\363\265\350\350\350\270\326\326\326\274\275\275\275\302\237\237\237" "\312EEE\223\0\0\0\334\0\0\0\343\0\0\0\347\0\0\0\347\0\0\0\342\0\0\0\330\0" "\0\0\315\0\0\0\302\0\0\0\271\0\0\0\261\0\0\0\254\0\0\0\251\0\0\0\246\0\0" "\0\243\0\0\0\240\0\0\0\235\0\0\0\230\0\0\0\224\0\0\0\216\0\0\0\212\0\0\0" "\203\0\0\0}\0\0\0w\0\0\0p\0\0\0h\0\0\0a\0\0\0Y\0\0\0Q\0\0\0J\0\0\0C\0\0\0" "<\0\0\0""5\0\0\0.\0\0\0)\0\0\0#\0\0\0\36\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0" "\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\5\0\0\0\13\0\0\0\30\0\0\0.\0\0\0K\0" "\0\0m\0\0\0\216\0\0\0\247\0\0\0\265\0\0\0\264\0\0\0\246\0\0\0\217EEE\223" "\237\237\237\312\275\275\275\302\324\324\324\274\346\346\346\270\360\360" "\360\266\367\367\367\264\374\374\374\264\375\375\375\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\375\375\375\263\374\374\374\264\367\367\367\264\360\360\360\266" "\346\346\346\270\324\324\324\274\275\275\275\302\237\237\237\312EEE\223\0" "\0\0\333\0\0\0\343\0\0\0\347\0\0\0\350\0\0\0\343\0\0\0\333\0\0\0\321\0\0" "\0\306\0\0\0\274\0\0\0\264\0\0\0\256\0\0\0\253\0\0\0\250\0\0\0\245\0\0\0" "\243\0\0\0\237\0\0\0\234\0\0\0\230\0\0\0\223\0\0\0\216\0\0\0\211\0\0\0\203" "\0\0\0|\0\0\0u\0\0\0n\0\0\0g\0\0\0_\0\0\0X\0\0\0Q\0\0\0I\0\0\0B\0\0\0;\0" "\0\0""4\0\0\0.\0\0\0(\0\0\0\"\0\0\0\35\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\16" "\0\0\0\14\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\7\0\0\0\17\0\0\0\36\0\0\0""5\0\0" "\0S\0\0\0s\0\0\0\223\0\0\0\252\0\0\0\267\0\0\0\265\0\0\0\250\0\0\0\22288" "8\213\233\233\233\313\270\270\270\303\317\317\317\275\340\340\340\272\353" "\353\353\267\363\363\363\265\367\367\367\264\374\374\374\264\375\375\375" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\374\374\374\264\367" "\367\367\264\363\363\363\265\353\353\353\267\340\340\340\272\317\317\317" "\275\270\270\270\303\233\233\233\313888\213\0\0\0\334\0\0\0\343\0\0\0\350" "\0\0\0\350\0\0\0\344\0\0\0\335\0\0\0\323\0\0\0\310\0\0\0\277\0\0\0\266\0" "\0\0\262\0\0\0\255\0\0\0\252\0\0\0\247\0\0\0\245\0\0\0\242\0\0\0\237\0\0" "\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\202\0\0\0|\0\0\0u\0" "\0\0n\0\0\0f\0\0\0_\0\0\0W\0\0\0P\0\0\0H\0\0\0A\0\0\0:\0\0\0""3\0\0\0-\0" "\0\0'\0\0\0\"\0\0\0\35\0\0\0\31\0\0\0\24\0\0\0\21\0\0\0\16\0\0\0\13\0\0\0" "\11\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\2\0\0\0\4\0\0\0\10\0\0\0\22\0\0\0\"\0\0\0:\0\0\0W\0\0\0" "w\0\0\0\225\0\0\0\254\0\0\0\267\0\0\0\266\0\0\0\251\0\0\0\224\37\37\37\200" "\223\223\223\312\256\256\256\305\304\304\304\300\326\326\326\274\343\343" "\343\271\354\354\354\267\363\363\363\265\367\367\367\264\372\372\372\264" "\374\374\374\264\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\374\374\374\264" "\372\372\372\264\367\367\367\264\363\363\363\265\354\354\354\267\343\343" "\343\271\326\326\326\274\304\304\304\300\256\256\256\305\223\223\223\312" "\37\37\37\200\0\0\0\334\0\0\0\343\0\0\0\350\0\0\0\350\0\0\0\345\0\0\0\336" "\0\0\0\324\0\0\0\311\0\0\0\300\0\0\0\270\0\0\0\262\0\0\0\256\0\0\0\254\0" "\0\0\250\0\0\0\246\0\0\0\244\0\0\0\241\0\0\0\236\0\0\0\232\0\0\0\226\0\0" "\0\221\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0l\0\0\0e\0\0\0]\0" "\0\0V\0\0\0O\0\0\0H\0\0\0A\0\0\0:\0\0\0""3\0\0\0,\0\0\0'\0\0\0\"\0\0\0\35" "\0\0\0\30\0\0\0\24\0\0\0\21\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0" "\0\0\4\0\0\0\4\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0" "\0\0\2\0\0\0\4\0\0\0\12\0\0\0\25\0\0\0&\0\0\0=\0\0\0Z\0\0\0z\0\0\0\225\0" "\0\0\254\0\0\0\267\0\0\0\266\0\0\0\254\0\0\0\232\6\6\6{```\234\237\237\237" "\311\264\264\264\304\307\307\307\300\326\326\326\274\342\342\342\271\353" "\353\353\267\360\360\360\266\365\365\365\265\367\367\367\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\374" "\374\374\264\374\374\374\264\374\374\374\264\374\374\374\264\374\374\374" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\374\374\374\264\374" "\374\374\264\374\374\374\264\374\374\374\264\374\374\374\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\367" "\367\367\264\365\365\365\265\360\360\360\266\353\353\353\267\342\342\342" "\271\326\326\326\274\307\307\307\300\264\264\264\304\237\237\237\311```\234" "\6\6\6{\0\0\0\335\0\0\0\344\0\0\0\347\0\0\0\350\0\0\0\344\0\0\0\336\0\0\0" "\325\0\0\0\313\0\0\0\301\0\0\0\272\0\0\0\263\0\0\0\260\0\0\0\254\0\0\0\252" "\0\0\0\250\0\0\0\246\0\0\0\243\0\0\0\240\0\0\0\235\0\0\0\231\0\0\0\225\0" "\0\0\220\0\0\0\213\0\0\0\205\0\0\0\177\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0" "]\0\0\0U\0\0\0M\0\0\0F\0\0\0?\0\0\0""8\0\0\0""2\0\0\0,\0\0\0&\0\0\0!\0\0" "\0\34\0\0\0\30\0\0\0\24\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0" "\6\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\1\0\0\0\1\0\0\0\2\0\0\0\5\0\0\0\14\0\0\0\27\0\0\0'\0\0\0?\0\0\0[\0\0\0x" "\0\0\0\225\0\0\0\253\0\0\0\266\0\0\0\267\0\0\0\261\0\0\0\244\0\0\0\225\37" "\37\37\201{{{\265\241\241\241\311\263\263\263\304\304\304\304\300\321\321" "\321\275\334\334\334\272\344\344\344\271\352\352\352\267\354\354\354\267" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\360\360\360\266\360\360\360\266\360\360\360\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\360\360" "\360\266\360\360\360\266\360\360\360\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\354\354\354\267\352\352" "\352\267\344\344\344\271\334\334\334\272\321\321\321\275\304\304\304\300" "\263\263\263\304\241\241\241\311{{{\265\37\37\37\201\0\0\0\332\0\0\0\340" "\0\0\0\345\0\0\0\347\0\0\0\347\0\0\0\344\0\0\0\335\0\0\0\324\0\0\0\312\0" "\0\0\302\0\0\0\272\0\0\0\264\0\0\0\260\0\0\0\255\0\0\0\253\0\0\0\251\0\0" "\0\247\0\0\0\245\0\0\0\242\0\0\0\237\0\0\0\234\0\0\0\230\0\0\0\223\0\0\0" "\216\0\0\0\212\0\0\0\204\0\0\0~\0\0\0w\0\0\0p\0\0\0i\0\0\0b\0\0\0[\0\0\0" "T\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33" "\0\0\0\27\0\0\0\23\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\5\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\2\0\0\0\6\0\0\0\15\0\0\0\30\0\0\0(\0\0\0?\0\0\0Y\0\0" "\0w\0\0\0\222\0\0\0\247\0\0\0\264\0\0\0\271\0\0\0\267\0\0\0\257\0\0\0\244" "\0\0\0\230###\203uuu\256\234\234\234\312\255\255\255\306\272\272\272\302" "\307\307\307\300\316\316\316\276\323\323\323\275\326\326\326\274\327\327" "\327\274\327\327\327\274\327\327\327\274\330\330\330\273\330\330\330\273" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\330\330\330\273\330\330\330\273\327\327\327\274\327\327\327\274\327\327" "\327\274\326\326\326\274\323\323\323\275\316\316\316\276\307\307\307\300" "\272\272\272\302\255\255\255\306\234\234\234\312uuu\256###\203\0\0\0\331" "\0\0\0\337\0\0\0\343\0\0\0\346\0\0\0\347\0\0\0\346\0\0\0\342\0\0\0\333\0" "\0\0\323\0\0\0\311\0\0\0\301\0\0\0\272\0\0\0\264\0\0\0\260\0\0\0\255\0\0" "\0\253\0\0\0\252\0\0\0\250\0\0\0\246\0\0\0\244\0\0\0\241\0\0\0\236\0\0\0" "\232\0\0\0\226\0\0\0\222\0\0\0\215\0\0\0\210\0\0\0\202\0\0\0|\0\0\0u\0\0" "\0o\0\0\0h\0\0\0a\0\0\0Y\0\0\0R\0\0\0J\0\0\0C\0\0\0<\0\0\0""6\0\0\0""0\0" "\0\0)\0\0\0%\0\0\0\37\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0" "\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\3\0\0\0\7\0\0" "\0\16\0\0\0\31\0\0\0(\0\0\0=\0\0\0W\0\0\0r\0\0\0\213\0\0\0\240\0\0\0\260" "\0\0\0\270\0\0\0\273\0\0\0\270\0\0\0\261\0\0\0\250\0\0\0\236\20\20\20}JJ" "J\217\206\206\206\272\235\235\235\312\247\247\247\307\255\255\255\306\261" "\261\261\305\262\262\262\305\262\262\262\305\263\263\263\304\263\263\263" "\304\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\263\263\263\304\263\263\263\304\262" "\262\262\305\262\262\262\305\261\261\261\305\255\255\255\306\247\247\247" "\307\235\235\235\312\206\206\206\272JJJ\217\20\20\20}\0\0\0\331\0\0\0\336" "\0\0\0\342\0\0\0\346\0\0\0\347\0\0\0\347\0\0\0\344\0\0\0\337\0\0\0\330\0" "\0\0\321\0\0\0\310\0\0\0\300\0\0\0\271\0\0\0\264\0\0\0\260\0\0\0\255\0\0" "\0\253\0\0\0\252\0\0\0\250\0\0\0\247\0\0\0\245\0\0\0\242\0\0\0\237\0\0\0" "\235\0\0\0\231\0\0\0\225\0\0\0\220\0\0\0\213\0\0\0\206\0\0\0\200\0\0\0z\0" "\0\0t\0\0\0m\0\0\0f\0\0\0_\0\0\0X\0\0\0P\0\0\0I\0\0\0B\0\0\0;\0\0\0""5\0" "\0\0.\0\0\0)\0\0\0#\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\14" "\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0" "\4\0\0\0\10\0\0\0\16\0\0\0\30\0\0\0'\0\0\0;\0\0\0R\0\0\0j\0\0\0\202\0\0\0" "\227\0\0\0\250\0\0\0\265\0\0\0\273\0\0\0\275\0\0\0\273\0\0\0\265\0\0\0\257" "\0\0\0\250\0\0\0\243\10\10\10x&&&\177HHH\220ccc\244uuu\267\200\200\200\307" "\206\206\206\320\206\206\206\320\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\320\206\206\206\320\200\200\200\307uuu\267ccc\244HHH\220&&&\177\10\10" "\10x\0\0\0\327\0\0\0\333\0\0\0\337\0\0\0\342\0\0\0\345\0\0\0\347\0\0\0\347" "\0\0\0\345\0\0\0\341\0\0\0\334\0\0\0\325\0\0\0\315\0\0\0\306\0\0\0\276\0" "\0\0\270\0\0\0\263\0\0\0\260\0\0\0\255\0\0\0\253\0\0\0\252\0\0\0\250\0\0" "\0\247\0\0\0\246\0\0\0\243\0\0\0\241\0\0\0\236\0\0\0\232\0\0\0\227\0\0\0" "\223\0\0\0\216\0\0\0\212\0\0\0\204\0\0\0~\0\0\0x\0\0\0r\0\0\0k\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0G\0\0\0@\0\0\0:\0\0\0""3\0\0\0-\0\0\0'\0\0\0\"\0\0" "\0\35\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0" "\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\5\0\0\0\10\0\0" "\0\17\0\0\0\27\0\0\0$\0\0\0""5\0\0\0J\0\0\0_\0\0\0v\0\0\0\213\0\0\0\235\0" "\0\0\253\0\0\0\265\0\0\0\273\0\0\0\275\0\0\0\274\0\0\0\272\0\0\0\270\0\0" "\0\265\0\0\0\265\0\0\0\265\0\0\0\270\0\0\0\272\0\0\0\275\0\0\0\300\0\0\0" "\303\0\0\0\306\0\0\0\310\0\0\0\313\0\0\0\315\0\0\0\317\0\0\0\320\0\0\0\322" "\0\0\0\323\0\0\0\324\0\0\0\326\0\0\0\327\0\0\0\327\0\0\0\327\0\0\0\330\0" "\0\0\331\0\0\0\331\0\0\0\332\0\0\0\332\0\0\0\332\0\0\0\332\0\0\0\332\0\0" "\0\332\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\332\0\0\0\332\0\0\0\332\0\0\0" "\332\0\0\0\333\0\0\0\333\0\0\0\334\0\0\0\336\0\0\0\340\0\0\0\342\0\0\0\344" "\0\0\0\345\0\0\0\345\0\0\0\344\0\0\0\341\0\0\0\334\0\0\0\327\0\0\0\320\0" "\0\0\311\0\0\0\302\0\0\0\274\0\0\0\266\0\0\0\262\0\0\0\260\0\0\0\255\0\0" "\0\253\0\0\0\252\0\0\0\250\0\0\0\247\0\0\0\246\0\0\0\244\0\0\0\241\0\0\0" "\237\0\0\0\234\0\0\0\230\0\0\0\225\0\0\0\221\0\0\0\214\0\0\0\207\0\0\0\202" "\0\0\0|\0\0\0u\0\0\0o\0\0\0i\0\0\0b\0\0\0[\0\0\0T\0\0\0L\0\0\0E\0\0\0>\0" "\0\0""7\0\0\0""2\0\0\0,\0\0\0&\0\0\0!\0\0\0\34\0\0\0\30\0\0\0\24\0\0\0\21" "\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0" "\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\5\0\0\0\11\0\0\0\16\0\0\0\25\0\0\0!\0\0" "\0/\0\0\0A\0\0\0T\0\0\0h\0\0\0|\0\0\0\215\0\0\0\235\0\0\0\250\0\0\0\261\0" "\0\0\267\0\0\0\272\0\0\0\275\0\0\0\276\0\0\0\300\0\0\0\302\0\0\0\305\0\0" "\0\310\0\0\0\313\0\0\0\315\0\0\0\317\0\0\0\322\0\0\0\324\0\0\0\326\0\0\0" "\327\0\0\0\331\0\0\0\332\0\0\0\333\0\0\0\334\0\0\0\335\0\0\0\336\0\0\0\337" "\0\0\0\340\0\0\0\340\0\0\0\340\0\0\0\341\0\0\0\341\0\0\0\341\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\341\0\0\0\336\0\0\0\332\0\0\0\326" "\0\0\0\320\0\0\0\312\0\0\0\304\0\0\0\276\0\0\0\271\0\0\0\264\0\0\0\261\0" "\0\0\256\0\0\0\254\0\0\0\253\0\0\0\252\0\0\0\250\0\0\0\247\0\0\0\246\0\0" "\0\244\0\0\0\242\0\0\0\237\0\0\0\235\0\0\0\232\0\0\0\226\0\0\0\223\0\0\0" "\216\0\0\0\212\0\0\0\205\0\0\0\177\0\0\0y\0\0\0s\0\0\0l\0\0\0f\0\0\0_\0\0" "\0X\0\0\0Q\0\0\0J\0\0\0C\0\0\0<\0\0\0""6\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0" "\0\0\6\0\0\0\4\0\0\0\4\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0" "\0\0\6\0\0\0\10\0\0\0\15\0\0\0\25\0\0\0\36\0\0\0(\0\0\0""7\0\0\0G\0\0\0X" "\0\0\0j\0\0\0z\0\0\0\211\0\0\0\226\0\0\0\240\0\0\0\250\0\0\0\257\0\0\0\265" "\0\0\0\272\0\0\0\276\0\0\0\303\0\0\0\307\0\0\0\311\0\0\0\314\0\0\0\316\0" "\0\0\321\0\0\0\323\0\0\0\325\0\0\0\326\0\0\0\330\0\0\0\331\0\0\0\333\0\0" "\0\333\0\0\0\334\0\0\0\335\0\0\0\336\0\0\0\337\0\0\0\340\0\0\0\340\0\0\0" "\340\0\0\0\341\0\0\0\341\0\0\0\341\0\0\0\341\0\0\0\341\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\341\0" "\0\0\341\0\0\0\340\0\0\0\337\0\0\0\336\0\0\0\335\0\0\0\333\0\0\0\331\0\0" "\0\326\0\0\0\322\0\0\0\315\0\0\0\311\0\0\0\303\0\0\0\276\0\0\0\271\0\0\0" "\265\0\0\0\262\0\0\0\256\0\0\0\255\0\0\0\254\0\0\0\252\0\0\0\251\0\0\0\250" "\0\0\0\247\0\0\0\246\0\0\0\244\0\0\0\242\0\0\0\240\0\0\0\235\0\0\0\232\0" "\0\0\230\0\0\0\223\0\0\0\220\0\0\0\214\0\0\0\207\0\0\0\201\0\0\0|\0\0\0v" "\0\0\0p\0\0\0i\0\0\0c\0\0\0\\\0\0\0U\0\0\0N\0\0\0H\0\0\0A\0\0\0:\0\0\0""4" "\0\0\0.\0\0\0(\0\0\0#\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0" "\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\12\0\0\0\16\0\0\0\23\0" "\0\0\32\0\0\0$\0\0\0/\0\0\0;\0\0\0I\0\0\0Y\0\0\0g\0\0\0t\0\0\0\200\0\0\0" "\213\0\0\0\224\0\0\0\235\0\0\0\244\0\0\0\253\0\0\0\260\0\0\0\264\0\0\0\271" "\0\0\0\274\0\0\0\277\0\0\0\302\0\0\0\304\0\0\0\307\0\0\0\311\0\0\0\313\0" "\0\0\315\0\0\0\317\0\0\0\320\0\0\0\321\0\0\0\322\0\0\0\323\0\0\0\324\0\0" "\0\325\0\0\0\326\0\0\0\327\0\0\0\327\0\0\0\327\0\0\0\327\0\0\0\330\0\0\0" "\330\0\0\0\330\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\330\0\0\0\330\0\0\0\327\0\0\0\325\0\0\0\323\0\0\0\321\0" "\0\0\316\0\0\0\313\0\0\0\310\0\0\0\304\0\0\0\300\0\0\0\273\0\0\0\270\0\0" "\0\264\0\0\0\261\0\0\0\257\0\0\0\254\0\0\0\253\0\0\0\252\0\0\0\250\0\0\0" "\250\0\0\0\247\0\0\0\246\0\0\0\245\0\0\0\243\0\0\0\241\0\0\0\237\0\0\0\235" "\0\0\0\232\0\0\0\230\0\0\0\225\0\0\0\221\0\0\0\215\0\0\0\210\0\0\0\203\0" "\0\0~\0\0\0y\0\0\0s\0\0\0m\0\0\0f\0\0\0_\0\0\0Y\0\0\0R\0\0\0K\0\0\0E\0\0" "\0>\0\0\0""8\0\0\0""2\0\0\0,\0\0\0'\0\0\0\"\0\0\0\35\0\0\0\31\0\0\0\25\0" "\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0" "\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\6\0\0\0" "\7\0\0\0\12\0\0\0\15\0\0\0\21\0\0\0\27\0\0\0\37\0\0\0'\0\0\0""1\0\0\0=\0" "\0\0H\0\0\0T\0\0\0_\0\0\0i\0\0\0t\0\0\0}\0\0\0\206\0\0\0\216\0\0\0\224\0" "\0\0\232\0\0\0\237\0\0\0\243\0\0\0\247\0\0\0\252\0\0\0\256\0\0\0\261\0\0" "\0\264\0\0\0\267\0\0\0\272\0\0\0\274\0\0\0\276\0\0\0\300\0\0\0\301\0\0\0" "\303\0\0\0\304\0\0\0\305\0\0\0\306\0\0\0\307\0\0\0\307\0\0\0\311\0\0\0\311" "\0\0\0\311\0\0\0\311\0\0\0\312\0\0\0\312\0\0\0\312\0\0\0\312\0\0\0\312\0" "\0\0\312\0\0\0\312\0\0\0\312\0\0\0\312\0\0\0\312\0\0\0\312\0\0\0\312\0\0" "\0\312\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\312\0\0\0\311\0\0\0\310\0\0\0\307\0\0" "\0\304\0\0\0\302\0\0\0\277\0\0\0\275\0\0\0\272\0\0\0\267\0\0\0\264\0\0\0" "\261\0\0\0\257\0\0\0\254\0\0\0\253\0\0\0\251\0\0\0\251\0\0\0\247\0\0\0\247" "\0\0\0\246\0\0\0\246\0\0\0\244\0\0\0\244\0\0\0\242\0\0\0\241\0\0\0\237\0" "\0\0\235\0\0\0\232\0\0\0\230\0\0\0\225\0\0\0\221\0\0\0\216\0\0\0\212\0\0" "\0\205\0\0\0\200\0\0\0{\0\0\0u\0\0\0p\0\0\0i\0\0\0c\0\0\0]\0\0\0V\0\0\0O" "\0\0\0H\0\0\0B\0\0\0<\0\0\0""5\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40\0\0\0\33\0" "\0\0\27\0\0\0\24\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0" "\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\4\0\0" "\0\4\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\13\0\0\0\16\0\0\0\21\0\0\0\26\0\0\0\34" "\0\0\0#\0\0\0*\0\0\0""2\0\0\0<\0\0\0E\0\0\0N\0\0\0X\0\0\0a\0\0\0i\0\0\0q" "\0\0\0w\0\0\0}\0\0\0\203\0\0\0\211\0\0\0\215\0\0\0\222\0\0\0\226\0\0\0\232" "\0\0\0\236\0\0\0\242\0\0\0\245\0\0\0\250\0\0\0\252\0\0\0\255\0\0\0\257\0" "\0\0\261\0\0\0\263\0\0\0\264\0\0\0\265\0\0\0\267\0\0\0\270\0\0\0\270\0\0" "\0\271\0\0\0\271\0\0\0\272\0\0\0\273\0\0\0\273\0\0\0\273\0\0\0\273\0\0\0" "\273\0\0\0\273\0\0\0\273\0\0\0\273\0\0\0\273\0\0\0\273\0\0\0\273\0\0\0\273" "\0\0\0\273\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\273\0\0\0\273\0\0\0\272\0\0\0\271" "\0\0\0\267\0\0\0\265\0\0\0\263\0\0\0\261\0\0\0\257\0\0\0\256\0\0\0\254\0" "\0\0\252\0\0\0\251\0\0\0\247\0\0\0\247\0\0\0\246\0\0\0\246\0\0\0\245\0\0" "\0\244\0\0\0\244\0\0\0\243\0\0\0\242\0\0\0\241\0\0\0\237\0\0\0\236\0\0\0" "\234\0\0\0\232\0\0\0\227\0\0\0\224\0\0\0\221\0\0\0\216\0\0\0\212\0\0\0\206" "\0\0\0\201\0\0\0|\0\0\0w\0\0\0r\0\0\0k\0\0\0f\0\0\0_\0\0\0X\0\0\0R\0\0\0" "L\0\0\0E\0\0\0?\0\0\0""9\0\0\0""3\0\0\0-\0\0\0(\0\0\0\"\0\0\0\36\0\0\0\32" "\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\6\0" "\0\0\4\0\0\0\4\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0" "\0\0\4\0\0\0\5\0\0\0\6\0\0\0\10\0\0\0\12\0\0\0\14\0\0\0\17\0\0\0\23\0\0\0" "\26\0\0\0\34\0\0\0\40\0\0\0'\0\0\0-\0\0\0""5\0\0\0<\0\0\0D\0\0\0K\0\0\0S" "\0\0\0Z\0\0\0b\0\0\0h\0\0\0m\0\0\0s\0\0\0y\0\0\0~\0\0\0\203\0\0\0\207\0\0" "\0\214\0\0\0\220\0\0\0\224\0\0\0\227\0\0\0\233\0\0\0\236\0\0\0\240\0\0\0" "\242\0\0\0\244\0\0\0\245\0\0\0\250\0\0\0\251\0\0\0\252\0\0\0\253\0\0\0\254" "\0\0\0\255\0\0\0\255\0\0\0\255\0\0\0\256\0\0\0\256\0\0\0\256\0\0\0\256\0" "\0\0\257\0\0\0\257\0\0\0\257\0\0\0\257\0\0\0\257\0\0\0\257\0\0\0\257\0\0" "\0\257\0\0\0\257\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\257\0\0\0\257\0\0\0\255\0\0" "\0\254\0\0\0\253\0\0\0\252\0\0\0\251\0\0\0\250\0\0\0\247\0\0\0\247\0\0\0" "\246\0\0\0\245\0\0\0\244\0\0\0\244\0\0\0\244\0\0\0\243\0\0\0\243\0\0\0\242" "\0\0\0\241\0\0\0\240\0\0\0\237\0\0\0\236\0\0\0\235\0\0\0\232\0\0\0\230\0" "\0\0\226\0\0\0\224\0\0\0\221\0\0\0\216\0\0\0\212\0\0\0\206\0\0\0\202\0\0" "\0}\0\0\0x\0\0\0s\0\0\0n\0\0\0h\0\0\0b\0\0\0[\0\0\0U\0\0\0O\0\0\0H\0\0\0" "B\0\0\0<\0\0\0""6\0\0\0""0\0\0\0+\0\0\0%\0\0\0!\0\0\0\34\0\0\0\31\0\0\0\24" "\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0" "\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0" "\0\5\0\0\0\6\0\0\0\7\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\20\0\0\0\23\0\0\0\26" "\0\0\0\34\0\0\0!\0\0\0&\0\0\0+\0\0\0""2\0\0\0""8\0\0\0>\0\0\0D\0\0\0L\0\0" "\0R\0\0\0X\0\0\0^\0\0\0c\0\0\0j\0\0\0o\0\0\0u\0\0\0z\0\0\0\177\0\0\0\204" "\0\0\0\207\0\0\0\213\0\0\0\217\0\0\0\222\0\0\0\225\0\0\0\230\0\0\0\232\0" "\0\0\233\0\0\0\235\0\0\0\236\0\0\0\240\0\0\0\241\0\0\0\242\0\0\0\243\0\0" "\0\243\0\0\0\244\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\246\0\0\0\246\0\0\0\246\0\0\0\246\0\0\0\246\0\0\0\246\0\0\0\246\0\0\0\246" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\246\0\0\0\245\0\0\0\245\0\0\0\244" "\0\0\0\244\0\0\0\243\0\0\0\243\0\0\0\243\0\0\0\242\0\0\0\241\0\0\0\241\0" "\0\0\241\0\0\0\241\0\0\0\241\0\0\0\240\0\0\0\237\0\0\0\237\0\0\0\236\0\0" "\0\235\0\0\0\234\0\0\0\232\0\0\0\231\0\0\0\227\0\0\0\225\0\0\0\223\0\0\0" "\220\0\0\0\215\0\0\0\212\0\0\0\206\0\0\0\202\0\0\0~\0\0\0y\0\0\0t\0\0\0o" "\0\0\0i\0\0\0d\0\0\0]\0\0\0W\0\0\0Q\0\0\0K\0\0\0E\0\0\0>\0\0\0""9\0\0\0""3" "\0\0\0.\0\0\0(\0\0\0#\0\0\0\37\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\20\0\0\0" "\15\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\4\0\0\0\4\0\0\0\6\0\0" "\0\7\0\0\0\10\0\0\0\13\0\0\0\15\0\0\0\17\0\0\0\22\0\0\0\25\0\0\0\31\0\0\0" "\35\0\0\0!\0\0\0&\0\0\0,\0\0\0""1\0\0\0""7\0\0\0=\0\0\0B\0\0\0H\0\0\0N\0" "\0\0T\0\0\0Z\0\0\0`\0\0\0f\0\0\0l\0\0\0q\0\0\0w\0\0\0{\0\0\0\177\0\0\0\202" "\0\0\0\206\0\0\0\211\0\0\0\215\0\0\0\217\0\0\0\222\0\0\0\224\0\0\0\226\0" "\0\0\227\0\0\0\231\0\0\0\232\0\0\0\233\0\0\0\234\0\0\0\235\0\0\0\236\0\0" "\0\236\0\0\0\236\0\0\0\237\0\0\0\237\0\0\0\237\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\237\0\0\0\237\0\0\0\237" "\0\0\0\237\0\0\0\237\0\0\0\237\0\0\0\236\0\0\0\236\0\0\0\236\0\0\0\235\0" "\0\0\235\0\0\0\235\0\0\0\234\0\0\0\233\0\0\0\232\0\0\0\231\0\0\0\230\0\0" "\0\226\0\0\0\225\0\0\0\223\0\0\0\221\0\0\0\216\0\0\0\214\0\0\0\210\0\0\0" "\205\0\0\0\201\0\0\0}\0\0\0y\0\0\0u\0\0\0o\0\0\0j\0\0\0d\0\0\0_\0\0\0Y\0" "\0\0S\0\0\0M\0\0\0G\0\0\0A\0\0\0;\0\0\0""5\0\0\0""0\0\0\0+\0\0\0&\0\0\0!" "\0\0\0\35\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10" "\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\10\0\0\0\11" "\0\0\0\13\0\0\0\16\0\0\0\21\0\0\0\24\0\0\0\27\0\0\0\33\0\0\0\37\0\0\0#\0" "\0\0(\0\0\0-\0\0\0""2\0\0\0""7\0\0\0=\0\0\0C\0\0\0I\0\0\0O\0\0\0T\0\0\0Z" "\0\0\0_\0\0\0e\0\0\0k\0\0\0p\0\0\0u\0\0\0y\0\0\0}\0\0\0\200\0\0\0\203\0\0" "\0\207\0\0\0\212\0\0\0\214\0\0\0\216\0\0\0\221\0\0\0\222\0\0\0\223\0\0\0" "\225\0\0\0\226\0\0\0\227\0\0\0\230\0\0\0\230\0\0\0\231\0\0\0\232\0\0\0\232" "\0\0\0\232\0\0\0\232\0\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0" "\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\233\0" "\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0\0" "\0\233\0\0\0\232\0\0\0\232\0\0\0\232\0\0\0\232\0\0\0\231\0\0\0\230\0\0\0" "\230\0\0\0\227\0\0\0\226\0\0\0\225\0\0\0\223\0\0\0\222\0\0\0\221\0\0\0\216" "\0\0\0\214\0\0\0\212\0\0\0\207\0\0\0\203\0\0\0\200\0\0\0|\0\0\0x\0\0\0t\0" "\0\0o\0\0\0j\0\0\0e\0\0\0_\0\0\0Z\0\0\0T\0\0\0O\0\0\0I\0\0\0C\0\0\0=\0\0" "\0""7\0\0\0""2\0\0\0-\0\0\0(\0\0\0#\0\0\0\37\0\0\0\33\0\0\0\27\0\0\0\24\0" "\0\0\21\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0" "\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0" "\3\0\0\0\4\0\0\0\4\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\13\0\0\0\15\0\0\0\17\0" "\0\0\22\0\0\0\25\0\0\0\31\0\0\0\34\0\0\0\40\0\0\0%\0\0\0)\0\0\0/\0\0\0""4" "\0\0\0:\0\0\0>\0\0\0D\0\0\0J\0\0\0O\0\0\0U\0\0\0[\0\0\0`\0\0\0e\0\0\0j\0" "\0\0o\0\0\0s\0\0\0w\0\0\0{\0\0\0~\0\0\0\201\0\0\0\204\0\0\0\207\0\0\0\211" "\0\0\0\213\0\0\0\215\0\0\0\216\0\0\0\220\0\0\0\221\0\0\0\222\0\0\0\223\0" "\0\0\223\0\0\0\224\0\0\0\225\0\0\0\225\0\0\0\226\0\0\0\226\0\0\0\226\0\0" "\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0" "\226\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0" "\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\225" "\0\0\0\225\0\0\0\224\0\0\0\223\0\0\0\223\0\0\0\222\0\0\0\221\0\0\0\220\0" "\0\0\216\0\0\0\215\0\0\0\213\0\0\0\211\0\0\0\207\0\0\0\204\0\0\0\201\0\0" "\0~\0\0\0{\0\0\0w\0\0\0s\0\0\0o\0\0\0j\0\0\0e\0\0\0`\0\0\0[\0\0\0U\0\0\0" "O\0\0\0J\0\0\0D\0\0\0>\0\0\0:\0\0\0""4\0\0\0/\0\0\0)\0\0\0%\0\0\0\40\0\0" "\0\34\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0" "\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6\0\0" "\0\10\0\0\0\12\0\0\0\13\0\0\0\16\0\0\0\20\0\0\0\24\0\0\0\26\0\0\0\32\0\0" "\0\36\0\0\0\"\0\0\0'\0\0\0,\0\0\0""0\0\0\0""5\0\0\0;\0\0\0@\0\0\0E\0\0\0" "K\0\0\0P\0\0\0V\0\0\0[\0\0\0_\0\0\0d\0\0\0i\0\0\0n\0\0\0r\0\0\0u\0\0\0y\0" "\0\0|\0\0\0\177\0\0\0\202\0\0\0\204\0\0\0\206\0\0\0\210\0\0\0\212\0\0\0\213" "\0\0\0\214\0\0\0\215\0\0\0\216\0\0\0\217\0\0\0\220\0\0\0\220\0\0\0\221\0" "\0\0\221\0\0\0\221\0\0\0\221\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0" "\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\222\0\0\0\222\0\0" "\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0" "\221\0\0\0\221\0\0\0\221\0\0\0\221\0\0\0\220\0\0\0\220\0\0\0\217\0\0\0\216" "\0\0\0\215\0\0\0\214\0\0\0\213\0\0\0\212\0\0\0\210\0\0\0\206\0\0\0\204\0" "\0\0\202\0\0\0\177\0\0\0|\0\0\0y\0\0\0u\0\0\0r\0\0\0n\0\0\0i\0\0\0d\0\0\0" "_\0\0\0[\0\0\0V\0\0\0P\0\0\0K\0\0\0E\0\0\0@\0\0\0;\0\0\0""5\0\0\0""0\0\0" "\0,\0\0\0'\0\0\0\"\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\24\0\0\0\20\0\0\0\16" "\0\0\0\13\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0" "\3\0\0\0\4\0\0\0\4\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\13\0\0\0\15\0\0\0\17\0" "\0\0\22\0\0\0\24\0\0\0\30\0\0\0\33\0\0\0\40\0\0\0$\0\0\0(\0\0\0-\0\0\0""1" "\0\0\0""7\0\0\0<\0\0\0A\0\0\0F\0\0\0K\0\0\0P\0\0\0U\0\0\0Z\0\0\0_\0\0\0c" "\0\0\0g\0\0\0k\0\0\0p\0\0\0s\0\0\0v\0\0\0y\0\0\0|\0\0\0~\0\0\0\200\0\0\0" "\202\0\0\0\204\0\0\0\205\0\0\0\207\0\0\0\207\0\0\0\210\0\0\0\212\0\0\0\212" "\0\0\0\212\0\0\0\213\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\213\0\0\0\212\0\0\0" "\212\0\0\0\212\0\0\0\210\0\0\0\207\0\0\0\207\0\0\0\205\0\0\0\204\0\0\0\202" "\0\0\0\200\0\0\0~\0\0\0|\0\0\0y\0\0\0v\0\0\0s\0\0\0p\0\0\0k\0\0\0g\0\0\0" "c\0\0\0_\0\0\0Z\0\0\0U\0\0\0P\0\0\0K\0\0\0F\0\0\0A\0\0\0<\0\0\0""7\0\0\0" """1\0\0\0-\0\0\0(\0\0\0$\0\0\0\40\0\0\0\33\0\0\0\30\0\0\0\24\0\0\0\22\0\0" "\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3" "\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0" "\13\0\0\0\15\0\0\0\20\0\0\0\23\0\0\0\26\0\0\0\31\0\0\0\35\0\0\0\40\0\0\0" "%\0\0\0)\0\0\0.\0\0\0""3\0\0\0""7\0\0\0<\0\0\0A\0\0\0F\0\0\0K\0\0\0O\0\0" "\0T\0\0\0Y\0\0\0]\0\0\0b\0\0\0f\0\0\0i\0\0\0m\0\0\0p\0\0\0s\0\0\0u\0\0\0" "x\0\0\0z\0\0\0|\0\0\0~\0\0\0\177\0\0\0\200\0\0\0\202\0\0\0\203\0\0\0\203" "\0\0\0\204\0\0\0\205\0\0\0\205\0\0\0\205\0\0\0\206\0\0\0\206\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\206\0\0\0\206\0\0\0\205\0\0\0\205\0\0\0" "\205\0\0\0\204\0\0\0\203\0\0\0\203\0\0\0\202\0\0\0\200\0\0\0\177\0\0\0~\0" "\0\0|\0\0\0z\0\0\0x\0\0\0u\0\0\0s\0\0\0p\0\0\0m\0\0\0i\0\0\0f\0\0\0b\0\0" "\0]\0\0\0Y\0\0\0T\0\0\0O\0\0\0K\0\0\0F\0\0\0A\0\0\0<\0\0\0""7\0\0\0""3\0" "\0\0.\0\0\0)\0\0\0%\0\0\0\40\0\0\0\35\0\0\0\31\0\0\0\26\0\0\0\23\0\0\0\20" "\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\6\0\0\0\7\0\0\0\10\0\0" "\0\12\0\0\0\14\0\0\0\16\0\0\0\21\0\0\0\24\0\0\0\26\0\0\0\32\0\0\0\35\0\0" "\0\"\0\0\0%\0\0\0)\0\0\0.\0\0\0""3\0\0\0""7\0\0\0<\0\0\0A\0\0\0E\0\0\0J\0" "\0\0O\0\0\0S\0\0\0W\0\0\0[\0\0\0_\0\0\0c\0\0\0f\0\0\0i\0\0\0l\0\0\0o\0\0" "\0q\0\0\0t\0\0\0u\0\0\0w\0\0\0y\0\0\0z\0\0\0{\0\0\0|\0\0\0}\0\0\0~\0\0\0" "~\0\0\0\177\0\0\0\177\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0" "\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\200\0\0\0\200\0" "\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0" "\0\200\0\0\0\200\0\0\0\200\0\0\0\177\0\0\0\177\0\0\0~\0\0\0~\0\0\0}\0\0\0" "|\0\0\0{\0\0\0z\0\0\0y\0\0\0w\0\0\0u\0\0\0t\0\0\0q\0\0\0o\0\0\0l\0\0\0i\0" "\0\0f\0\0\0c\0\0\0_\0\0\0[\0\0\0W\0\0\0S\0\0\0O\0\0\0J\0\0\0E\0\0\0A\0\0" "\0<\0\0\0""7\0\0\0""3\0\0\0.\0\0\0)\0\0\0%\0\0\0\"\0\0\0\35\0\0\0\32\0\0" "\0\26\0\0\0\24\0\0\0\21\0\0\0\16\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\7\0\0\0" "\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0" "\4\0\0\0\5\0\0\0\6\0\0\0\7\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\17\0\0\0\22\0" "\0\0\24\0\0\0\27\0\0\0\33\0\0\0\36\0\0\0\"\0\0\0&\0\0\0*\0\0\0.\0\0\0""3" "\0\0\0""7\0\0\0<\0\0\0@\0\0\0D\0\0\0H\0\0\0M\0\0\0Q\0\0\0U\0\0\0X\0\0\0\\" "\0\0\0_\0\0\0b\0\0\0e\0\0\0h\0\0\0j\0\0\0m\0\0\0n\0\0\0p\0\0\0r\0\0\0s\0" "\0\0t\0\0\0u\0\0\0v\0\0\0w\0\0\0w\0\0\0x\0\0\0x\0\0\0y\0\0\0y\0\0\0y\0\0" "\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0y\0\0\0" "y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0" "\0\0x\0\0\0x\0\0\0w\0\0\0w\0\0\0v\0\0\0u\0\0\0t\0\0\0s\0\0\0r\0\0\0p\0\0" "\0n\0\0\0m\0\0\0j\0\0\0h\0\0\0e\0\0\0b\0\0\0_\0\0\0\\\0\0\0X\0\0\0U\0\0\0" "Q\0\0\0M\0\0\0H\0\0\0D\0\0\0@\0\0\0<\0\0\0""7\0\0\0""3\0\0\0.\0\0\0*\0\0" "\0&\0\0\0\"\0\0\0\36\0\0\0\33\0\0\0\27\0\0\0\24\0\0\0\22\0\0\0\17\0\0\0\15" "\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0" "\10\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\17\0\0\0\22\0\0\0\25\0\0\0\30\0\0\0" "\33\0\0\0\37\0\0\0\"\0\0\0&\0\0\0*\0\0\0.\0\0\0""2\0\0\0""6\0\0\0:\0\0\0" ">\0\0\0C\0\0\0G\0\0\0J\0\0\0O\0\0\0R\0\0\0V\0\0\0X\0\0\0\\\0\0\0_\0\0\0a" "\0\0\0d\0\0\0f\0\0\0g\0\0\0i\0\0\0k\0\0\0l\0\0\0m\0\0\0n\0\0\0o\0\0\0p\0" "\0\0p\0\0\0q\0\0\0q\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0" "\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0" "r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0q\0\0\0q\0\0\0p\0\0\0p\0" "\0\0o\0\0\0n\0\0\0m\0\0\0l\0\0\0k\0\0\0i\0\0\0g\0\0\0f\0\0\0d\0\0\0a\0\0" "\0_\0\0\0\\\0\0\0X\0\0\0V\0\0\0R\0\0\0O\0\0\0J\0\0\0G\0\0\0C\0\0\0>\0\0\0" ":\0\0\0""6\0\0\0""2\0\0\0.\0\0\0*\0\0\0&\0\0\0\"\0\0\0\37\0\0\0\33\0\0\0" "\30\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0" "\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\12\0\0" "\0\14\0\0\0\16\0\0\0\20\0\0\0\23\0\0\0\25\0\0\0\31\0\0\0\33\0\0\0\37\0\0" "\0\"\0\0\0&\0\0\0)\0\0\0.\0\0\0""1\0\0\0""5\0\0\0:\0\0\0=\0\0\0A\0\0\0E\0" "\0\0H\0\0\0L\0\0\0O\0\0\0R\0\0\0U\0\0\0X\0\0\0Z\0\0\0]\0\0\0_\0\0\0`\0\0" "\0b\0\0\0d\0\0\0e\0\0\0f\0\0\0g\0\0\0h\0\0\0i\0\0\0i\0\0\0j\0\0\0j\0\0\0" "k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0" "\0\0k\0\0\0k\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0" "\0k\0\0\0k\0\0\0k\0\0\0j\0\0\0j\0\0\0i\0\0\0i\0\0\0h\0\0\0g\0\0\0f\0\0\0" "e\0\0\0d\0\0\0b\0\0\0`\0\0\0_\0\0\0]\0\0\0Z\0\0\0X\0\0\0U\0\0\0R\0\0\0O\0" "\0\0L\0\0\0H\0\0\0E\0\0\0A\0\0\0=\0\0\0:\0\0\0""5\0\0\0""1\0\0\0.\0\0\0)" "\0\0\0&\0\0\0\"\0\0\0\37\0\0\0\33\0\0\0\31\0\0\0\25\0\0\0\23\0\0\0\20\0\0" "\0\16\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3" "\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3" "\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\13\0\0\0\14\0\0\0\16\0\0" "\0\20\0\0\0\23\0\0\0\26\0\0\0\31\0\0\0\33\0\0\0\37\0\0\0\"\0\0\0%\0\0\0)" "\0\0\0,\0\0\0""0\0\0\0""4\0\0\0""7\0\0\0;\0\0\0>\0\0\0B\0\0\0E\0\0\0H\0\0" "\0K\0\0\0N\0\0\0Q\0\0\0S\0\0\0U\0\0\0W\0\0\0Y\0\0\0[\0\0\0\\\0\0\0]\0\0\0" "^\0\0\0_\0\0\0`\0\0\0a\0\0\0b\0\0\0b\0\0\0b\0\0\0c\0\0\0c\0\0\0c\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0c\0\0\0c\0\0\0c\0\0\0" "b\0\0\0b\0\0\0b\0\0\0a\0\0\0`\0\0\0_\0\0\0^\0\0\0]\0\0\0\\\0\0\0[\0\0\0Y" "\0\0\0W\0\0\0U\0\0\0S\0\0\0Q\0\0\0N\0\0\0K\0\0\0H\0\0\0E\0\0\0B\0\0\0>\0" "\0\0;\0\0\0""7\0\0\0""4\0\0\0""0\0\0\0,\0\0\0)\0\0\0%\0\0\0\"\0\0\0\37\0" "\0\0\33\0\0\0\31\0\0\0\26\0\0\0\23\0\0\0\20\0\0\0\16\0\0\0\14\0\0\0\13\0" "\0\0\10\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0" "\0\0\5\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\17\0\0\0\21\0\0" "\0\23\0\0\0\26\0\0\0\31\0\0\0\33\0\0\0\36\0\0\0\"\0\0\0%\0\0\0(\0\0\0,\0" "\0\0.\0\0\0""2\0\0\0""5\0\0\0""9\0\0\0<\0\0\0>\0\0\0B\0\0\0E\0\0\0G\0\0\0" "J\0\0\0L\0\0\0N\0\0\0P\0\0\0Q\0\0\0S\0\0\0T\0\0\0V\0\0\0W\0\0\0X\0\0\0X\0" "\0\0Y\0\0\0Z\0\0\0[\0\0\0[\0\0\0[\0\0\0[\0\0\0[\0\0\0\\\0\0\0\\\0\0\0\\\0" "\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\" "\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0[\0\0\0[\0\0\0[\0\0" "\0[\0\0\0[\0\0\0Z\0\0\0Y\0\0\0X\0\0\0X\0\0\0W\0\0\0V\0\0\0T\0\0\0S\0\0\0" "Q\0\0\0P\0\0\0N\0\0\0L\0\0\0J\0\0\0G\0\0\0E\0\0\0B\0\0\0>\0\0\0<\0\0\0""9" "\0\0\0""5\0\0\0""2\0\0\0.\0\0\0,\0\0\0(\0\0\0%\0\0\0\"\0\0\0\36\0\0\0\33" "\0\0\0\31\0\0\0\26\0\0\0\23\0\0\0\21\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\11" "\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4" "\0\0\0\4\0\0\0\6\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\17\0\0" "\0\21\0\0\0\23\0\0\0\25\0\0\0\30\0\0\0\33\0\0\0\35\0\0\0\40\0\0\0$\0\0\0" "'\0\0\0)\0\0\0-\0\0\0""0\0\0\0""3\0\0\0""6\0\0\0""9\0\0\0<\0\0\0>\0\0\0A" "\0\0\0C\0\0\0E\0\0\0G\0\0\0I\0\0\0J\0\0\0M\0\0\0N\0\0\0O\0\0\0P\0\0\0Q\0" "\0\0Q\0\0\0R\0\0\0S\0\0\0T\0\0\0T\0\0\0T\0\0\0T\0\0\0T\0\0\0U\0\0\0U\0\0" "\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0" "U\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0T\0\0\0T\0\0\0T\0\0\0T\0\0\0T\0" "\0\0S\0\0\0R\0\0\0Q\0\0\0Q\0\0\0P\0\0\0O\0\0\0N\0\0\0M\0\0\0J\0\0\0I\0\0" "\0G\0\0\0E\0\0\0C\0\0\0A\0\0\0>\0\0\0<\0\0\0""9\0\0\0""6\0\0\0""3\0\0\0""0" "\0\0\0-\0\0\0)\0\0\0'\0\0\0$\0\0\0\40\0\0\0\35\0\0\0\33\0\0\0\30\0\0\0\25" "\0\0\0\23\0\0\0\21\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0" "\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\4\0" "\0\0\4\0\0\0\6\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\16\0\0\0" "\20\0\0\0\22\0\0\0\25\0\0\0\27\0\0\0\32\0\0\0\35\0\0\0\40\0\0\0\"\0\0\0%" "\0\0\0(\0\0\0+\0\0\0.\0\0\0""0\0\0\0""3\0\0\0""5\0\0\0""7\0\0\0:\0\0\0<\0" "\0\0>\0\0\0@\0\0\0B\0\0\0C\0\0\0E\0\0\0F\0\0\0H\0\0\0H\0\0\0I\0\0\0J\0\0" "\0J\0\0\0K\0\0\0L\0\0\0L\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0" "M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0" "\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0L\0\0\0L\0\0\0K\0\0" "\0J\0\0\0J\0\0\0I\0\0\0H\0\0\0H\0\0\0F\0\0\0E\0\0\0C\0\0\0B\0\0\0@\0\0\0" ">\0\0\0<\0\0\0:\0\0\0""7\0\0\0""5\0\0\0""3\0\0\0""0\0\0\0.\0\0\0+\0\0\0(" "\0\0\0%\0\0\0\"\0\0\0\40\0\0\0\35\0\0\0\32\0\0\0\27\0\0\0\25\0\0\0\22\0\0" "\0\20\0\0\0\16\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0" "\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0" "\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\16\0" "\0\0\20\0\0\0\22\0\0\0\24\0\0\0\26\0\0\0\31\0\0\0\33\0\0\0\36\0\0\0\40\0" "\0\0#\0\0\0%\0\0\0(\0\0\0+\0\0\0-\0\0\0/\0\0\0""2\0\0\0""4\0\0\0""5\0\0\0" """7\0\0\0:\0\0\0;\0\0\0<\0\0\0>\0\0\0?\0\0\0@\0\0\0A\0\0\0B\0\0\0C\0\0\0" "C\0\0\0C\0\0\0D\0\0\0D\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0" "\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0" "\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0D\0\0\0D\0\0\0C\0\0\0" "C\0\0\0C\0\0\0B\0\0\0A\0\0\0@\0\0\0?\0\0\0>\0\0\0<\0\0\0;\0\0\0:\0\0\0""7" "\0\0\0""5\0\0\0""4\0\0\0""2\0\0\0/\0\0\0-\0\0\0+\0\0\0(\0\0\0%\0\0\0#\0\0" "\0\40\0\0\0\36\0\0\0\33\0\0\0\31\0\0\0\26\0\0\0\24\0\0\0\22\0\0\0\20\0\0" "\0\16\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\3" "\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\14\0\0" "\0\16\0\0\0\17\0\0\0\22\0\0\0\24\0\0\0\26\0\0\0\30\0\0\0\32\0\0\0\34\0\0" "\0\37\0\0\0!\0\0\0#\0\0\0%\0\0\0'\0\0\0)\0\0\0,\0\0\0.\0\0\0""0\0\0\0""1" "\0\0\0""3\0\0\0""5\0\0\0""6\0\0\0""7\0\0\0""8\0\0\0:\0\0\0:\0\0\0;\0\0\0" "<\0\0\0<\0\0\0<\0\0\0=\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0" "\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0" "\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0=\0\0\0" "<\0\0\0<\0\0\0<\0\0\0;\0\0\0:\0\0\0:\0\0\0""8\0\0\0""7\0\0\0""6\0\0\0""5" "\0\0\0""3\0\0\0""1\0\0\0""0\0\0\0.\0\0\0,\0\0\0)\0\0\0'\0\0\0%\0\0\0#\0\0" "\0!\0\0\0\37\0\0\0\34\0\0\0\32\0\0\0\30\0\0\0\26\0\0\0\24\0\0\0\22\0\0\0" "\17\0\0\0\16\0\0\0\14\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5" "\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\10\0\0\0\11" "\0\0\0\13\0\0\0\14\0\0\0\15\0\0\0\17\0\0\0\21\0\0\0\22\0\0\0\24\0\0\0\26" "\0\0\0\31\0\0\0\33\0\0\0\35\0\0\0\37\0\0\0\40\0\0\0\"\0\0\0%\0\0\0'\0\0\0" "(\0\0\0*\0\0\0,\0\0\0-\0\0\0.\0\0\0""0\0\0\0""0\0\0\0""2\0\0\0""3\0\0\0""3" "\0\0\0""4\0\0\0""5\0\0\0""5\0\0\0""6\0\0\0""6\0\0\0""7\0\0\0""7\0\0\0""7" "\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7" "\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""7\0\0\0""7" "\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7" "\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""6\0\0\0""6\0\0\0""5" "\0\0\0""5\0\0\0""4\0\0\0""3\0\0\0""3\0\0\0""2\0\0\0""0\0\0\0""0\0\0\0.\0" "\0\0-\0\0\0,\0\0\0*\0\0\0(\0\0\0'\0\0\0%\0\0\0\"\0\0\0\40\0\0\0\37\0\0\0" "\35\0\0\0\33\0\0\0\31\0\0\0\26\0\0\0\24\0\0\0\22\0\0\0\21\0\0\0\17\0\0\0" "\15\0\0\0\14\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0" "\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\6\0\0\0\6\0\0\0\10\0" "\0\0\10\0\0\0\12\0\0\0\13\0\0\0\15\0\0\0\16\0\0\0\17\0\0\0\22\0\0\0\23\0" "\0\0\25\0\0\0\26\0\0\0\31\0\0\0\32\0\0\0\34\0\0\0\35\0\0\0\40\0\0\0!\0\0" "\0#\0\0\0%\0\0\0&\0\0\0'\0\0\0(\0\0\0)\0\0\0*\0\0\0,\0\0\0,\0\0\0-\0\0\0" ".\0\0\0.\0\0\0.\0\0\0/\0\0\0/\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0" "\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0" "\0\0\0""0\0\0\0""0\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0" "\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0" "\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0/\0\0\0/\0\0\0.\0\0\0.\0\0\0.\0\0\0-\0\0" "\0,\0\0\0,\0\0\0*\0\0\0)\0\0\0(\0\0\0'\0\0\0&\0\0\0%\0\0\0#\0\0\0!\0\0\0" "\40\0\0\0\35\0\0\0\34\0\0\0\32\0\0\0\31\0\0\0\26\0\0\0\25\0\0\0\23\0\0\0" "\22\0\0\0\17\0\0\0\16\0\0\0\15\0\0\0\13\0\0\0\12\0\0\0\10\0\0\0\10\0\0\0" "\6\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0" "\3\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\11\0\0\0\13\0\0" "\0\14\0\0\0\15\0\0\0\17\0\0\0\20\0\0\0\22\0\0\0\24\0\0\0\25\0\0\0\26\0\0" "\0\30\0\0\0\31\0\0\0\33\0\0\0\35\0\0\0\36\0\0\0\40\0\0\0\40\0\0\0\"\0\0\0" "#\0\0\0$\0\0\0%\0\0\0%\0\0\0'\0\0\0'\0\0\0'\0\0\0(\0\0\0)\0\0\0)\0\0\0)\0" "\0\0)\0\0\0)\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0" "\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0" "*\0\0\0*\0\0\0*\0\0\0*\0\0\0)\0\0\0)\0\0\0)\0\0\0)\0\0\0)\0\0\0(\0\0\0'\0" "\0\0'\0\0\0'\0\0\0%\0\0\0%\0\0\0$\0\0\0#\0\0\0\"\0\0\0\40\0\0\0\40\0\0\0" "\36\0\0\0\35\0\0\0\33\0\0\0\31\0\0\0\30\0\0\0\26\0\0\0\25\0\0\0\24\0\0\0" "\22\0\0\0\20\0\0\0\17\0\0\0\15\0\0\0\14\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0" "\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\7\0\0\0" "\10\0\0\0\10\0\0\0\12\0\0\0\13\0\0\0\15\0\0\0\15\0\0\0\17\0\0\0\20\0\0\0" "\22\0\0\0\23\0\0\0\24\0\0\0\26\0\0\0\27\0\0\0\31\0\0\0\32\0\0\0\33\0\0\0" "\34\0\0\0\35\0\0\0\36\0\0\0\37\0\0\0\40\0\0\0\40\0\0\0!\0\0\0\"\0\0\0\"\0" "\0\0\"\0\0\0#\0\0\0#\0\0\0$\0\0\0$\0\0\0$\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0$\0\0\0$\0\0\0$\0" "\0\0#\0\0\0#\0\0\0\"\0\0\0\"\0\0\0\"\0\0\0!\0\0\0\40\0\0\0\40\0\0\0\37\0" "\0\0\36\0\0\0\35\0\0\0\34\0\0\0\33\0\0\0\32\0\0\0\31\0\0\0\27\0\0\0\26\0" "\0\0\24\0\0\0\23\0\0\0\22\0\0\0\20\0\0\0\17\0\0\0\15\0\0\0\15\0\0\0\13\0" "\0\0\12\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3" "\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3" "\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\11\0\0\0" "\13\0\0\0\13\0\0\0\15\0\0\0\15\0\0\0\17\0\0\0\20\0\0\0\22\0\0\0\22\0\0\0" "\24\0\0\0\24\0\0\0\26\0\0\0\27\0\0\0\30\0\0\0\31\0\0\0\32\0\0\0\33\0\0\0" "\33\0\0\0\34\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\36\0\0\0\36\0\0\0\37\0\0\0" "\37\0\0\0\37\0\0\0\37\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\37\0\0\0" "\37\0\0\0\37\0\0\0\37\0\0\0\36\0\0\0\36\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0" "\34\0\0\0\33\0\0\0\33\0\0\0\32\0\0\0\31\0\0\0\30\0\0\0\27\0\0\0\26\0\0\0" "\24\0\0\0\24\0\0\0\22\0\0\0\22\0\0\0\20\0\0\0\17\0\0\0\15\0\0\0\15\0\0\0" "\13\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0" "\0\0\6\0\0\0\10\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\13\0\0\0\14\0\0\0\15\0\0" "\0\16\0\0\0\17\0\0\0\20\0\0\0\22\0\0\0\22\0\0\0\23\0\0\0\24\0\0\0\25\0\0" "\0\26\0\0\0\26\0\0\0\27\0\0\0\27\0\0\0\30\0\0\0\31\0\0\0\31\0\0\0\31\0\0" "\0\31\0\0\0\32\0\0\0\32\0\0\0\32\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\32\0\0\0\32\0\0\0\32\0\0\0\31\0\0\0\31\0\0\0\31\0\0" "\0\31\0\0\0\30\0\0\0\27\0\0\0\27\0\0\0\26\0\0\0\26\0\0\0\25\0\0\0\24\0\0" "\0\23\0\0\0\22\0\0\0\22\0\0\0\20\0\0\0\17\0\0\0\16\0\0\0\15\0\0\0\14\0\0" "\0\13\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\4" "\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\10\0\0\0\11\0\0\0" "\12\0\0\0\13\0\0\0\14\0\0\0\15\0\0\0\15\0\0\0\16\0\0\0\17\0\0\0\20\0\0\0" "\21\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\23\0\0\0\24\0\0\0\24\0\0\0\24\0\0\0" "\25\0\0\0\25\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0" "\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0" "\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0" "\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0" "\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0" "\25\0\0\0\25\0\0\0\24\0\0\0\24\0\0\0\24\0\0\0\23\0\0\0\22\0\0\0\22\0\0\0" "\22\0\0\0\21\0\0\0\20\0\0\0\17\0\0\0\16\0\0\0\15\0\0\0\15\0\0\0\14\0\0\0" "\13\0\0\0\12\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0" "\0\0\2\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\7\0\0\0\10\0\0\0\10\0\0\0\11\0\0\0\12\0\0\0\13\0\0\0\13\0\0\0\14\0\0" "\0\15\0\0\0\15\0\0\0\16\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\20\0\0\0\20\0\0" "\0\21\0\0\0\21\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0" "\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0" "\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\22\0\0\0\22\0\0" "\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0" "\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0" "\0\22\0\0\0\22\0\0\0\21\0\0\0\21\0\0\0\20\0\0\0\20\0\0\0\17\0\0\0\17\0\0" "\0\17\0\0\0\16\0\0\0\15\0\0\0\15\0\0\0\14\0\0\0\13\0\0\0\13\0\0\0\12\0\0" "\0\11\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0" "\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\5\0" "\0\0\5\0\0\0\6\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\11\0\0\0" "\12\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\14\0\0\0\14\0\0\0\15\0\0\0\15\0\0\0" "\15\0\0\0\15\0\0\0\16\0\0\0\16\0\0\0\16\0\0\0\16\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\16\0\0\0\16\0\0\0\16\0\0\0\16\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0" "\14\0\0\0\14\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\12\0\0\0\11\0\0\0\10\0\0\0" "\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\5\0\0\0\4\0\0\0\4\0\0" "\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\4\0\0" "\0\4\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\7\0\0\0\10\0\0" "\0\10\0\0\0\10\0\0\0\10\0\0\0\11\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\13\0\0" "\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\14\0\0\0\14\0\0\0\14\0\0" "\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0" "\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\14\0\0" "\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0" "\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0" "\0\14\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\12\0\0" "\0\12\0\0\0\12\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0" "\6\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0" "\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0" "\3\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0" "\6\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\11" "\0\0\0\11\0\0\0\11\0\0\0\11\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12" "\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12" "\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\12\0\0\0\12" "\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12" "\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12" "\0\0\0\12\0\0\0\11\0\0\0\11\0\0\0\11\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0" "\5\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0" "\2\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0" "\5\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\7\0\0\0\7\0\0\0\7\0\0\0" "\7\0\0\0\7\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\7\0" "\0\0\7\0\0\0\7\0\0\0\7\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\5\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" }; compiz-0.9.11+14.04.20140409/plugins/bench/src/bench.cpp0000644000015301777760000002705512321343002022615 0ustar pbusernogroup00000000000000/** * * Compiz benchmark plugin * * bench.cpp * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * New frame rate measurement algorithm: * Copyright (c) 2011 Daniel van Vugt * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "bench.h" using namespace compiz::core; COMPIZ_PLUGIN_20090315 (bench, BenchPluginVTable) static const unsigned int TEX_WIDTH = 512; static const unsigned short TEX_HEIGHT = 256; void BenchScreen::preparePaint (int msSinceLastPaint) { struct timeval now; gettimeofday (&now, 0); int timediff = TIMEVALDIFFU (&now, &mLastRedraw); mSample[mFrames % MAX_SAMPLES] = timediff; timediff /= 1000; mFrames++; mLastRedraw = now; if (optionGetOutputConsole () && mActive) { int dTime = timer::timeval_diff (&now, &mLastPrint); if (dTime > optionGetConsoleUpdateTime () * 1000) { int dFrames = mFrames - mLastPrintFrames; mLastPrintFrames = mFrames; g_print ("[BENCH] : %d frames in %d.%01d seconds = %d.%03d FPS\n", dFrames, dTime / 1000, (dTime % 1000) / 100, dFrames * 1000 / dTime, ((dFrames * 1000) % dTime) / 10); mLastPrint = now; } } if (mActive) { mAlpha += timediff / 1000.0; if (mAlpha >= 1.0f) { mAlpha = 1.0f; /* * If we're only creating "fake" damage to update the benchmark * and no other damage is pending, then do it progressively * less often so the framerate can steadily decrease toward zero. */ if (mFakedDamage) mTimer.setTimes (mTimer.minTime () * 2); else { /* * Piggyback on damage events other than our own, so the * benchmark updates at least as often as the rest * of the screen. */ damageSelf (); if (mTimer.minTime () != MIN_MS_PER_UPDATE) mTimer.setTimes (MIN_MS_PER_UPDATE); } } } else { if (mAlpha <= 0.0) { cScreen->preparePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); mTimer.stop (); } mAlpha -= timediff / 1000.0; if (mAlpha < 0.0f) mAlpha = 0.0f; } mFakedDamage = false; cScreen->preparePaint (msSinceLastPaint); } float BenchScreen::averageFramerate () const /* * Returns the average frame rate of the last SECONDS_PER_AVERAGE seconds. * This calculation is accurate no matter how often/seldom the screen * gets painted. No timers required. Calculus rocks :) */ { const int usPerAverage = SECONDS_PER_AVERAGE * 1000000; int i = (mFrames + MAX_SAMPLES - 1) % MAX_SAMPLES; int lastSample = 0; int timeSum = 0; int count = 0; int maxCount = MIN (MAX_SAMPLES, mFrames); while (timeSum < usPerAverage && count < maxCount) { lastSample = mSample[i]; timeSum += lastSample; i = (i + MAX_SAMPLES - 1) % MAX_SAMPLES; count++; } float fps = 0.0f; if (timeSum < usPerAverage) { if (timeSum > 0) fps = (float)(count * 1000000) / timeSum; } else { fps = (float)(count - 1); if (lastSample > 0) fps += (float)(usPerAverage - (timeSum - lastSample)) / lastSample; fps /= SECONDS_PER_AVERAGE; } return fps; } bool BenchScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; bool isSet; unsigned int fps; GLMatrix sTransform (transform); status = gScreen->glPaintOutput (sAttrib, transform, region, output, mask); if (mAlpha <= 0.0 || !optionGetOutputScreen ()) return status; glGetError(); glPushAttrib (GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT); GLERR; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glPushMatrix (); glLoadMatrixf (sTransform.getMatrix ()); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f (1.0, 1.0, 1.0, mAlpha); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); mRect.setX (optionGetPositionX ()); mRect.setY (optionGetPositionY ()); glTranslatef (mRect.x (), mRect.y (), 0); glEnable (GL_TEXTURE_2D); glBindTexture (GL_TEXTURE_2D, mBackTex); glBegin (GL_QUADS); glTexCoord2f (0, 0); glVertex2f (0, 0); glTexCoord2f (0, 1); glVertex2f (0, TEX_HEIGHT); glTexCoord2f (1, 1); glVertex2f (TEX_WIDTH, TEX_HEIGHT); glTexCoord2f (1, 0); glVertex2f (TEX_WIDTH, 0); glEnd(); glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_TEXTURE_2D); glTranslatef (53, 83, 0); float avgFps = averageFramerate (); float rrVal = avgFps * cScreen->optimalRedrawTime () / 1000.0; /* * rrVal is slightly inaccurate and can be off by a couple of FPS. * This means the graph for a 60 FPS config goes up to 62.5 FPS. * This is because cScreen->optimalRedrawTime only has millisec precision * and can't be avoided without improving the precision of the composite * plugin. */ rrVal = MIN (1.0, MAX (0.0, rrVal) ); if (rrVal < 0.5) { glBegin (GL_QUADS); glColor4f (0.0, 1.0, 0.0, mAlpha); glVertex2f (0.0, 0.0); glVertex2f (0.0, 25.0); glColor4f (rrVal * 2.0, 1.0, 0.0, mAlpha); glVertex2f (330.0 * rrVal, 25.0); glVertex2f (330.0 * rrVal, 0.0); glEnd(); } else { glBegin (GL_QUADS); glColor4f (0.0, 1.0, 0.0, mAlpha); glVertex2f (0.0, 0.0); glVertex2f (0.0, 25.0); glColor4f (1.0, 1.0, 0.0, mAlpha); glVertex2f (165.0, 25.0); glVertex2f (165.0, 0.0); glEnd(); glBegin (GL_QUADS); glColor4f (1.0, 1.0, 0.0, mAlpha); glVertex2f (165.0, 0.0); glVertex2f (165.0, 25.0); glColor4f (1.0, 1.0 - ( (rrVal - 0.5) * 2.0), 0.0, mAlpha); glVertex2f (165.0 + 330.0 * (rrVal - 0.5), 25.0); glVertex2f (165.0 + 330.0 * (rrVal - 0.5), 0.0); glEnd(); } glColor4f (0.0, 0.0, 0.0, mAlpha); glCallList (mDList); glTranslatef (72, 45, 0); glEnable (GL_TEXTURE_2D); isSet = false; fps = (avgFps * 100.0); fps = MIN (999999, fps); for (unsigned int pos = 100000; pos >= 1; pos /= 10) { if (fps >= pos || isSet || pos <= 100) { unsigned int digit = fps / pos; glBindTexture (GL_TEXTURE_2D, mNumTex[digit]); glCallList (mDList + 1); isSet = true; fps %= pos; } glTranslatef ((pos == 100) ? 19 : 12, 0, 0); } glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_TEXTURE_2D); glPopMatrix(); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glColor4f (1.0, 1.0, 1.0, 1.0); glPopAttrib(); glGetError(); return status; } void BenchScreen::limiterModeChanged (CompOption *opt) { if (mActive) cScreen->setFPSLimiterMode ((CompositeFPSLimiterMode) opt->value ().i ()); } BenchScreen::BenchScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mAlpha (0), mFakedDamage (false), mFrames (0), mLastPrintFrames (0), mActive (false), mOldLimiterMode ((CompositeFPSLimiterMode) BenchOptions::FpsLimiterModeDefaultLimiter) { optionSetInitiateKeyInitiate (boost::bind (&BenchScreen::initiate, this, _3)); optionSetFpsLimiterModeNotify (boost::bind (&BenchScreen::limiterModeChanged, this, _1)); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); mRect.setGeometry (optionGetPositionX (), optionGetPositionY (), TEX_WIDTH, TEX_HEIGHT); mTimer.setCallback (boost::bind (&BenchScreen::timedOut, this)); glGenTextures (10, mNumTex); glGenTextures (1, &mBackTex); glGetError(); glEnable (GL_TEXTURE_2D); for (int i = 0; i < 10; i++) { //Bind the texture glBindTexture (GL_TEXTURE_2D, mNumTex[i]); //Load the parameters glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, 16, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, number_data[i]); GLERR; } glBindTexture (GL_TEXTURE_2D, mBackTex); //Load the parameters glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexImage2D (GL_TEXTURE_2D, 0, 4, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data); GLERR; glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_TEXTURE_2D); mDList = glGenLists (2); glNewList (mDList, GL_COMPILE); glLineWidth (2.0); glBegin (GL_LINE_LOOP); glVertex2f (0, 0); glVertex2f (0, 25); glVertex2f (330, 25); glVertex2f (330, 0); glEnd(); glLineWidth (1.0); glBegin (GL_LINES); for (int i = 33; i < 330; i += 33) { glVertex2f (i, 15); glVertex2f (i, 25); } for (int i = 16; i < 330; i += 33) { glVertex2f (i, 20); glVertex2f (i, 25); } glEnd(); glEndList(); glNewList (mDList + 1, GL_COMPILE); glBegin (GL_QUADS); glTexCoord2f (0, 0); glVertex2f (0, 0); glTexCoord2f (0, 1); glVertex2f (0, 32); glTexCoord2f (1, 1); glVertex2f (16, 32); glTexCoord2f (1, 0); glVertex2f (16, 0); glEnd(); glEndList(); } BenchScreen::~BenchScreen () { if (mActive) { // Restore FPS limiter mode cScreen->setFPSLimiterMode (mOldLimiterMode); } glDeleteLists (mDList, 2); glDeleteTextures (10, mNumTex); glDeleteTextures (1, &mBackTex); } void BenchScreen::damageSelf () { CompRegion self (mRect); cScreen->damageRegion (self); } bool BenchScreen::timedOut () { mFakedDamage = (cScreen->damageMask () == 0); damageSelf (); return true; } bool BenchScreen::initiate (CompOption::Vector &options) { mActive = !mActive; mActive &= optionGetOutputScreen () || optionGetOutputConsole (); Window xid; xid = (Window) CompOption::getIntOptionNamed (options, "root"); if (xid != ::screen->root ()) return false; if (mActive) { // Store current FPS limiter mode mOldLimiterMode = cScreen->FPSLimiterMode (); cScreen->setFPSLimiterMode ((CompositeFPSLimiterMode) optionGetFpsLimiterMode ()); cScreen->preparePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); for (int t = 0; t < MAX_SAMPLES; t++) mSample[t] = 0; } else { // Restore FPS limiter mode cScreen->setFPSLimiterMode (mOldLimiterMode); mTimer.stop (); } mTimer.start (1000 / FADE_FPS); mFrames = 0; mLastPrintFrames = 0; gettimeofday (&mLastRedraw, 0); mLastPrint = mLastRedraw; return true; } bool BenchPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/group/0000755000015301777760000000000012321344021020311 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/group/CMakeLists.txt0000644000015301777760000000023212321343002023044 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (group PLUGINDEPS opengl composite text mousepoll PKGDEPS cairo cairo-xlib-xrender) compiz-0.9.11+14.04.20140409/plugins/group/src/0000755000015301777760000000000012321344021021100 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/group/src/paint.cpp0000644000015301777760000010657412321343002022732 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * paint.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" /* * GroupTabBarSlot::setTargetOpacity * * Convenience function to set the target opacity for the tab bar */ void GroupTabBarSlot::setTargetOpacity (int tOpacity) { mOpacity = tOpacity; } /* * TextureLayer::setPaintWindow * * Convenience function to set the window we are painting on top of * for a texture for the tab bar */ void TextureLayer::setPaintWindow (CompWindow *w) { mPaintWindow = w; } /* * GroupTabBarSlot::List::paint * * Paint all tabs in a list * */ void GroupTabBarSlot::List::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, const CompRegion &clipRegion, int mask) { GROUP_SCREEN (screen); foreach (GroupTabBarSlot *slot, *this) { if (slot != gs->mDraggedSlot || !gs->mDragged) { slot->setTargetOpacity (attrib.opacity); slot->paint (attrib, transform, clipRegion, clipRegion, mask); } } } /* * GroupTabBarSlot::paint - taken from switcher and modified for tab bar * * We need to scale down the window to a small thumbnail, skip the * geometry modification stage (so we don't get wobbly uglyness) * and paint it directly to the screen for a second time. * * Also fade in and out. * */ void GroupTabBarSlot::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, const CompRegion &clipRegion, int mask) { CompWindow *w = mWindow; unsigned int oldGlAddGeometryIndex; GLWindowPaintAttrib wAttrib (GLWindow::get (mWindow)->paintAttrib ()); int tw, th; GROUP_WINDOW (w); GROUP_SCREEN (screen); tw = mRegion.boundingRect ().width (); th = mRegion.boundingRect ().height (); /* Wrap glDrawGeometry to make sure the general glDrawGeometry function is used */ oldGlAddGeometryIndex = gw->gWindow->glAddGeometryGetCurrentIndex (); gw->gWindow->glAddGeometrySetCurrentIndex (MAXSHORT); /* animate fade */ if (mTabBar->mState == PaintFadeIn) { wAttrib.opacity -= wAttrib.opacity * mTabBar->mAnimationTime / (gs->optionGetFadeTime () * 1000); } else if (mTabBar->mState == PaintFadeOut) { wAttrib.opacity = wAttrib.opacity * mTabBar->mAnimationTime / (gs->optionGetFadeTime () * 1000); } wAttrib.opacity = wAttrib.opacity * mOpacity / OPAQUE; if (w->mapNum ()) { GLFragment::Attrib fragment (wAttrib); GLMatrix wTransform (transform); int width, height; int vx, vy; unsigned int oldGlDrawIndex; width = w->width () + w->output ().left + w->output ().right; height = w->height () + w->output ().top + w->output ().bottom; if (width > tw) wAttrib.xScale = (float) tw / width; else wAttrib.xScale = 1.0f; if (height > th) wAttrib.yScale = (float) tw / height; else wAttrib.yScale = 1.0f; if (wAttrib.xScale < wAttrib.yScale) wAttrib.yScale = wAttrib.xScale; else wAttrib.xScale = wAttrib.yScale; /* FIXME: do some more work on the highlight on hover feature // Highlight on hover if (group && group->mTabBar && group->mTabBar->hoveredSlot == slot) { wAttrib.saturation = 0; wAttrib.brightness /= 1.25f; }*/ getDrawOffset (vx, vy); wAttrib.xTranslate = (mRegion.boundingRect ().x1 () + mRegion.boundingRect ().x2 ()) / 2 + vx; wAttrib.yTranslate = mRegion.boundingRect ().y1 () + vy; /* Translate matrix to the first point in the drawn region * and then scale (scales to the top right corner) to our * desired size */ wTransform.translate (wAttrib.xTranslate, wAttrib.yTranslate, 0.0f); wTransform.scale (wAttrib.xScale, wAttrib.yScale, 1.0f); wTransform.translate (-(WIN_X (w) + WIN_WIDTH (w) / 2), -(WIN_Y (w) - w->output ().top), 0.0f); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); /* Skip to the end of glDraw, so we don't end up with wobbly * and all that (we also loaded with a simple matrix, so we * miss the one in glPaint) */ oldGlDrawIndex = gw->gWindow->glDrawGetCurrentIndex (); gw->gWindow->glDraw (wTransform, fragment, clipRegion, mask | PAINT_WINDOW_TRANSFORMED_MASK | PAINT_WINDOW_TRANSLUCENT_MASK); gw->gWindow->glDrawSetCurrentIndex (oldGlDrawIndex); glPopMatrix (); } gw->gWindow->glAddGeometrySetCurrentIndex (oldGlAddGeometryIndex); } /* * TextureLayer::paint * * Paint some texture on with a window's geometry. This involves * putting the texture in the right place, adding it's geometry to the * window geometry (so it can be modified by wobbly and friends), * adding it, setting the texture layer opacity and then painting it * with the window geometry * */ void TextureLayer::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask) { GroupWindow *gwTopTab = GroupWindow::get (mPaintWindow); const CompRect &box = paintRegion.boundingRect (); /* Handle tiled textures */ foreach (GLTexture *tex, mTexture) { GLTexture::Matrix matrix = tex->matrix (); GLTexture::MatrixList matl; CompRegion reg; int x1 = box.x1 (); int y1 = box.y1 (); int x2 = box.x2 (); int y2 = box.y2 (); /* remove the old x1 and y1 so we have a relative value */ x2 -= x1; y2 -= y1; x1 = (x1 - mPaintWindow->x ()) / attrib.xScale + mPaintWindow->x (); y1 = (y1 - mPaintWindow->y ()) / attrib.yScale + mPaintWindow->y (); /* now add the new x1 and y1 so we have a absolute value again, also we don't want to stretch the texture... */ if (x2 * attrib.xScale < width ()) x2 += x1; else x2 = x1 + width (); if (y2 * attrib.yScale < height ()) y2 += y1; else y2 = y1 + height (); /* Set the x-position to our x1 minus the scale factor */ matrix.x0 -= x1 * matrix.xx; matrix.y0 -= y1 * matrix.yy; matl.push_back (matrix); reg = CompRegion (x1, y1, x2 - x1, y2 - y1); /* Reset current window geometry and re-add it with this * new geometry for the tab bar */ gwTopTab->gWindow->geometry ().reset (); gwTopTab->gWindow->glAddGeometry (matl, reg, clipRegion); if (gwTopTab->gWindow->geometry ().vertices) { GLFragment::Attrib fragment (attrib); GLMatrix wTransform (transform); /* Translate to where we want to paint, and scale * (via a 3x3 matrix) */ wTransform.translate (WIN_X (mPaintWindow), WIN_Y (mPaintWindow), 0.0f); wTransform.scale (attrib.xScale, attrib.yScale, 1.0f); wTransform.translate ( attrib.xTranslate / attrib.xScale - WIN_X (mPaintWindow), attrib.yTranslate / attrib.yScale - WIN_Y (mPaintWindow), 0.0f); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); fragment.setOpacity (attrib.opacity); gwTopTab->glDrawTexture (tex, fragment, mask | PAINT_WINDOW_BLEND_MASK | PAINT_WINDOW_TRANSFORMED_MASK | PAINT_WINDOW_TRANSLUCENT_MASK); glPopMatrix (); } } } /* * BackgroundLayer::paint * * Paint the backgroud layer. It might need to be scaled a bit * if it is expanding */ void BackgroundLayer::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask) { int newWidth; GLWindowPaintAttrib wAttrib (attrib); CompRect box = paintRegion.boundingRect (); /* handle the repaint of the background */ newWidth = mGroup->mTabBar->mRegion.boundingRect ().width (); if (newWidth > width ()) newWidth = width (); /* if the region expanded and we haven't re-rended ,just scale * the tab bar up slightly */ wAttrib.xScale = (double) (mGroup->mTabBar->mRegion.boundingRect ().width () / (double) newWidth); /* FIXME: maybe move this over to groupResizeTabBarRegion - * the only problem is that we would have 2 redraws if * here is an animation */ if (newWidth != mGroup->mTabBar->mOldWidth || mGroup->mTabBar->mBgLayer->mBgAnimation) render (); mGroup->mTabBar->mOldWidth = newWidth; box = mGroup->mTabBar->mRegion.boundingRect (); TextureLayer::paint (wAttrib, transform, box, clipRegion, mask); } /* * SelectionLayer::paint * * Paint the selection background behind the selection tab. This is * just a regular texture to paint that normally * */ void SelectionLayer::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask) { TextureLayer::paint (attrib, transform, mGroup->mTabBar->mTopTab->mRegion, clipRegion, mask); } /* * TextLayer::paint * * Paint the text layer on top of the selection layer, * * We need to adjust the region here and paint faded in or out (then * just paint like a normal texture here) */ void TextLayer::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask) { /* add a slight buffer around the clipping region * to account for the text */ CompRect box; int alpha = OPAQUE; GLWindowPaintAttrib wAttrib (attrib); GROUP_SCREEN (screen); int x1 = mGroup->mTabBar->mRegion.boundingRect ().x1 () + 5; int x2 = mGroup->mTabBar->mRegion.boundingRect ().x1 () + width () + 5; int y1 = mGroup->mTabBar->mRegion.boundingRect ().y2 () - height () - 5; int y2 = mGroup->mTabBar->mRegion.boundingRect ().y2 () - 5; if (x2 > mGroup->mTabBar->mRegion.boundingRect ().x2 ()) x2 = mGroup->mTabBar->mRegion.boundingRect ().x2 (); box = CompRect (x1, y1, x2 - x1, y2 - y1); /* recalculate the alpha again for text fade... */ if (mState == PaintFadeIn) alpha -= alpha * mAnimationTime / (gs->optionGetFadeTextTime () * 1000); else if (mState == PaintFadeOut) alpha = alpha * mAnimationTime / (gs->optionGetFadeTextTime () * 1000); wAttrib.opacity = alpha * ((float) wAttrib.opacity / OPAQUE); TextureLayer::paint (wAttrib, transform, box, clipRegion, mask); } /* * GroupTabBar::paint * * Paint the tab bar. This involves determining the window we want to * paint with geometry (the top tab usually, unless animating). All * of the other layers have paint functions, so add those to a list * and batch-paint them * */ void GroupTabBar::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, CompRegion clipRegion) { CompWindow *topTab; std::vector paintList; CompRect box; GROUP_SCREEN (screen); if (HAS_TOP_WIN (mGroup)) topTab = TOP_TAB (mGroup); else topTab = PREV_TOP_TAB (mGroup); /* Set the windows we want to paint with */ mBgLayer->setPaintWindow (topTab); mSelectionLayer->setPaintWindow (topTab); /* Paint background, then selection, then slots and then * if we can, the text */ paintList.push_back (mBgLayer); paintList.push_back (mSelectionLayer); paintList.push_back (&mSlots); if (mTextLayer && (mTextLayer->mState != PaintOff)) { mTextLayer->setPaintWindow (topTab); paintList.push_back (mTextLayer); } /* On each layer, set up texture filtering, fade in and out and * paint the layer */ foreach (GLLayer *layer, paintList) { GLWindowPaintAttrib wAttrib (attrib); GLenum oldTextureFilter; int alpha = OPAQUE; wAttrib.xScale = 1.0f; wAttrib.yScale = 1.0f; oldTextureFilter = gs->gScreen->textureFilter (); if (gs->optionGetMipmaps ()) gs->gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); if (mState == PaintFadeIn) alpha -= alpha * mAnimationTime / (gs->optionGetFadeTime () * 1000); else if (mState == PaintFadeOut) alpha = alpha * mAnimationTime / (gs->optionGetFadeTime () * 1000); wAttrib.opacity = alpha * ((float) wAttrib.opacity / OPAQUE); layer->paint (wAttrib, transform, clipRegion, clipRegion, mask); gs->gScreen->setTextureFilter (oldTextureFilter); } } /* * Selection::paint * * Paint the selection outline here, basically just draw a basic outline * shape with opengl and paint with the right transformation matrix * */ void Selection::paint (const GLScreenPaintAttrib sa, const GLMatrix transform, CompOutput *output, bool transformed) { GROUP_SCREEN (screen); int x1, x2, y1, y2; x1 = MIN (mX1, mX2); y1 = MIN (mY1, mY2); x2 = MAX (mX1, mX2); y2 = MAX (mY1, mY2); if (gs->mGrabState == GroupScreen::ScreenGrabSelect) { GLMatrix sTransform (transform); if (transformed) { gs->gScreen->glApplyTransform (sa, output, &sTransform); sTransform.toScreenSpace (output, -sa.zTranslate); } else sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glPushMatrix (); glLoadMatrixf (sTransform.getMatrix ()); glDisableClientState (GL_TEXTURE_COORD_ARRAY); glEnable (GL_BLEND); glColor4usv (gs->optionGetFillColor ()); glRecti (x1, y2, x2, y1); glColor4usv (gs->optionGetLineColor ()); glBegin (GL_LINE_LOOP); glVertex2i (x1, y1); glVertex2i (x2, y1); glVertex2i (x2, y2); glVertex2i (x1, y2); glEnd (); glColor4usv (defaultColor); glDisable (GL_BLEND); glEnableClientState (GL_TEXTURE_COORD_ARRAY); glPopMatrix (); } } /* * GroupScreen::preparePaint * * Called before ::glPaint, this tells us how long it has been * since the last screen paint cycle, so we can handle animation. * * Go through the groups, handle the switch, tabbing, and fade * animations * */ void GroupScreen::preparePaint (int msSinceLastPaint) { GroupSelection *group; GroupSelection::List::iterator it = mGroups.begin (); bool keepPainting = false; cScreen->preparePaint (msSinceLastPaint); while (it != mGroups.end ()) { group = *it; GroupTabBar *bar = group->mTabBar; if (bar) { keepPainting |= bar->applyForces ((mDragged) ? mDraggedSlot : NULL); bar->applySpeeds (msSinceLastPaint); if (bar->mState == PaintFadeIn || bar->mState == PaintFadeOut) keepPainting |= bar->handleTabBarFade (msSinceLastPaint); if (bar->mTextLayer) keepPainting |= bar->handleTextFade (msSinceLastPaint); if (bar->mBgLayer && bar->mBgLayer->mBgAnimation) keepPainting |= bar->mBgLayer->handleAnimation (msSinceLastPaint); } if (group->mTabBar && group->mTabBar->mChangeState != GroupTabBar::NoTabChange) { /* Only change to the new tab once the animation is done */ group->mTabBar->mChangeAnimationTime -= msSinceLastPaint; if (group->mTabBar->mChangeAnimationTime <= 0) keepPainting |= group->handleAnimation (); else keepPainting = true; } /* groupDrawTabAnimation may delete the group, so better save the pointer to the next chain element */ ++it; if (group->mTabbingState != GroupSelection::NoTabbing) keepPainting |= group->drawTabAnimation (msSinceLastPaint); } /* We just need to disable preparePaint here directly, since * checkFunctions will enable it again if there are groups with * animations or groups with tab bars with a dragged slot */ if (!keepPainting) cScreen->preparePaintSetEnabled (this, false); /* Always enable donePaint here (since there might be some * damage or whatever) */ cScreen->donePaintSetEnabled (this, true); } /* * GroupScreen::glPaintOutput * * The base output-paint function. Here we just need to paint the * selection layer and the dragged slot on top of everything else * */ bool GroupScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { GroupSelection *group; bool status; /* Keep track of viewports */ mTmpSel.mPainted = false; mTmpSel.mVpX = screen->vp ().x (); mTmpSel.mVpY = screen->vp ().y (); /* Allow us to paint windows transformed */ foreach (group, mGroups) { if (group->mResizeInfo || (group->mTabBar && (group->mTabBar->mChangeState != GroupTabBar::NoTabChange || group->mTabBar->mState != PaintOff)) || group->mTabbingState != GroupSelection::NoTabbing) { mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; break; } } status = gScreen->glPaintOutput (attrib, transform, region, output, mask); /* Just double check that we haven't painted our dragged tab * and selection rect on a transformed screen */ if (status && !mTmpSel.mPainted) { if ((mGrabState == ScreenGrabTabDrag) && mDraggedSlot) { GLMatrix wTransform (transform); GLWindow *gWindow = GLWindow::get (mDraggedSlot->mWindow); PaintState state; wTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); /* prevent tab bar drawing.. */ state = mDraggedSlot->mTabBar->mState; mDraggedSlot->mTabBar->mState = PaintOff; mDraggedSlot->setTargetOpacity (OPAQUE); mDraggedSlot->paint (gWindow->paintAttrib (), wTransform, region, region, 0); mDraggedSlot->mTabBar->mState = state; glPopMatrix (); } else if (mGrabState == ScreenGrabSelect) { mTmpSel.paint (attrib, transform, output, false); } } return status; } /* * GroupScreen::glPaintTransformedOutput * * This gets called if the screen is transformed, since there are * are different conditions here, we want to ensure that our * tab drag animation is still painted correctly * */ void GroupScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { gScreen->glPaintTransformedOutput (attrib, transform, region, output, mask); /* If we are on the same viewport here, then we are OK to paint */ if ((mTmpSel.mVpX == screen->vp ().x ()) && (mTmpSel.mVpY == screen->vp ().y ())) { mTmpSel.mPainted = true; if ((mGrabState == ScreenGrabTabDrag) && mDraggedSlot && mDragged) { PaintState state; GLMatrix wTransform (transform); GLWindow *gWindow = GLWindow::get (mDraggedSlot->mWindow); gScreen->glApplyTransform (attrib, output, &wTransform); wTransform.toScreenSpace (output, -attrib.zTranslate); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); /* prevent tab bar drawing.. */ state = mDraggedSlot->mTabBar->mState; mDraggedSlot->mTabBar->mState = PaintOff; mDraggedSlot->setTargetOpacity (OPAQUE); mDraggedSlot->paint (gWindow->paintAttrib (), wTransform, region, region, 0); mDraggedSlot->mTabBar->mState = state; glPopMatrix (); } else if (mGrabState == ScreenGrabSelect) { mTmpSel.paint (attrib, transform, output, true); } } } /* * GroupScreen::donePaint * * Damage everything that needs to be damaged (usually the screen * for animations [FIXME] or tab bar / text regions if they are * currently animating * */ void GroupScreen::donePaint () { GroupSelection *group; bool damaged = false; cScreen->donePaint (); foreach (group, mGroups) { /* Animations are a special case, damage the whole screen */ if (group->mTabbingState != GroupSelection::NoTabbing) { cScreen->damageScreen (); damaged = true; } else if (group->mTabBar && group->mTabBar->mChangeState != GroupTabBar::NoTabChange) { cScreen->damageScreen (); damaged = true; } else if (group->mTabBar) { bool needDamage = false; if ((group->mTabBar->mState == PaintFadeIn) || (group->mTabBar->mState == PaintFadeOut)) { needDamage = true; } if (group->mTabBar->mTextLayer) { if ((group->mTabBar->mTextLayer->mState == PaintFadeIn) || (group->mTabBar->mTextLayer->mState == PaintFadeOut)) { needDamage = true; } } if (group->mTabBar->mBgLayer && group->mTabBar->mBgLayer->mBgAnimation) needDamage = true; if (mDraggedSlot) needDamage = true; /* If we needed damage, then damage the whole tab bar * region */ if (needDamage) group->mTabBar->damageRegion (); damaged |= needDamage; } } /* If nothing needed damaging we can disable donePaint for now: * it will come back again when we call preparePaint anyways */ if (!damaged) cScreen->donePaintSetEnabled (this, false); } /* * GroupWindow::glDraw * * Our matrix is initialized here, so we can paint the glow here * (since we are free to paint with geometry) * */ bool GroupWindow::glDraw (const GLMatrix &transform, GLFragment::Attrib &attrib, const CompRegion ®ion, unsigned int mask) { bool status; CompRegion paintRegion (region); /* Don't bother if we don't need to paint glow */ if (mGroup && (mGroup->mWindows.size () > 1) && mGlowQuads) { if (mask & PAINT_WINDOW_TRANSFORMED_MASK) paintRegion = CompRegion (infiniteRegion); if (paintRegion.numRects ()) { /* reset geometry and paint */ gWindow->geometry ().reset (); paintGlow (attrib, paintRegion, mask); } } status = gWindow->glDraw (transform, attrib, region, mask); return status; } /* * GroupWindow::getStretchRectangle * * Return how much to scale on the X and Y axis for some box * provided compared to the window geometry */ void GroupWindow::getStretchRectangle (CompRect &box, float &xScaleRet, float &yScaleRet) { int x1, x2, y1, y2; int width, height; float xScale, yScale; x1 = mResizeGeometry.x () - window->border ().left; y1 = mResizeGeometry.y () - window->border ().top; x2 = mResizeGeometry.x () + mResizeGeometry.width () + window->serverGeometry ().border () * 2 + window->border ().right; if (window->shaded ()) { y2 = mResizeGeometry.y () + window->height () + window->border ().bottom; } else { y2 = mResizeGeometry.y () + mResizeGeometry.height () + window->serverGeometry ().border () * 2 + window->border ().bottom; } width = window->width () + window->border ().left + window->border ().right; height = window->height () + window->border ().top + window->border ().bottom; xScale = (width) ? (x2 - x1) / (float) width : 1.0f; yScale = (height) ? (y2 - y1) / (float) height : 1.0f; x1 = x1 - (window->output ().left - window->border ().left) * xScale; y1 = y1 - (window->output ().top - window->border ().top) * yScale; x2 = x2 + window->output ().right * xScale; y2 = y2 + window->output ().bottom * yScale; box = CompRect (x1, y1, x2 - x1, y2 - y1); xScaleRet = xScale; yScaleRet = yScale; } /* * GroupScreen::damagePaintRectangle * * Damage some region, with 1px padding */ void GroupScreen::damagePaintRectangle (const CompRect &box) { CompRegion reg (box); reg.translate (-1, -1); reg.shrink (1, 1); cScreen->damageRegion (reg); } /* * GroupWindow::checkTabbing * * Check if this window should be tabbing * */ bool GroupWindow::checkTabbing () { /* Do the tabbing animation if we are currently in an animated * state and the following check fails * -> We have a tab bar AND * -> This is the top tab for the window AND * -> We are in a tabbing state * * In essence, we want to animate all windows in this group * in the tabbing animation, except where the current window * is the "prinicpal" window (ignoring a situation where * we are ungrouping a single window, in which case we animate * all windows) */ if (!mGroup || !mGroup->mTabBar) return false; return (mAnimateState & (IS_ANIMATED | FINISHED_ANIMATION)) && !(mGroup->mTabBar && IS_TOP_TAB (window, mGroup) && (mGroup->mTabbingState == GroupSelection::Tabbing)); } /* * GroupWindow::checkRotating * * Check if this window should be rotating * */ bool GroupWindow::checkRotating () { /* Rotate the window if we are changing tabs, and if the window * passes the following safety checks: * -> It has a top tab (and associated window) AND * -> It has a previous top tab (the window that we are * switching from) AND * Either * -> It is a top tab (and associated window) or OR * -> It is a previous top tab (and associated window) OR * * In essense, we can only do the rotate animation if there is * a window we are switching to or from (since the animation * has a "from" stage and a "to" stage) */ if (!mGroup) return false; return (mGroup->mTabBar && mGroup->mTabBar->mChangeState != GroupTabBar::NoTabChange) && HAS_TOP_WIN (mGroup) && HAS_PREV_TOP_WIN (mGroup) && (IS_TOP_TAB (window , mGroup) || IS_PREV_TOP_TAB (window, mGroup)); } /* * GroupWindow::checkShowTabBar * * Check if this window should show it's tab bar * */ bool GroupWindow::checkShowTabBar () { /* Show the tab bar if it exists, and is set to be painted and * the following checks pass: * Either: * -> This window is the top tab for the group AND * Either: * -> We aren't changing tabs OR * -> We are changing to this tab * OR: * -> This window is the previous top tab AND * -> We are changing away from this window * * The tab bar should be visible during the rotate animation. * All other times it should be invisible, except when hovering * over it * */ if (!mGroup) return false; return mGroup->mTabBar && (mGroup->mTabBar->mState != PaintOff) && (((IS_TOP_TAB (window, mGroup)) && ((mGroup->mTabBar->mChangeState == GroupTabBar::NoTabChange) || (mGroup->mTabBar->mChangeState == GroupTabBar::TabChangeNewIn))) || (IS_PREV_TOP_TAB (window, mGroup) && (mGroup->mTabBar->mChangeState == GroupTabBar::TabChangeOldOut))); } inline void perspectiveDistortAndResetZ (GLMatrix &transform) { float v = -1.0 / screen->width (); /* This does transform = M * transform, where M is 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, v, 0, 0, 0, 1 */ transform[8] = v * transform[12]; transform[9] = v * transform[13]; transform[10] = v * transform[14]; transform[11] = v * transform[15]; } /* * GroupWindow::glPaint * * This is different to GLDraw, since we can still modify the compiz * matrix. * * In this function, we handle painting of the tabbing/untabbing * stretched windows for resize and rotation of windows when switching * tabs * */ bool GroupWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; bool doRotate = checkRotating (); bool doTabbing = checkTabbing (); bool showTabbar = checkShowTabBar (); CompWindow *w = window; GROUP_SCREEN (screen); /* If this window is hidden, then don't draw it on screen */ if (mWindowHideInfo) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; /* If the window is being: * -> Selected * -> Group Resized * -> Rotated * -> Tabbed * -> Has a tab bar */ if (mInSelection || !mResizeGeometry.isEmpty () || doRotate || doTabbing || showTabbar) { GLWindowPaintAttrib wAttrib (attrib); GLMatrix wTransform (transform); float animProgress = 0.0f; int drawnPosX = 0, drawnPosY = 0; /* If it's selected, show that by changing it's paint * attributes (such as brightness, opacity, saturation */ if (mInSelection) { wAttrib.opacity = OPAQUE * gs->optionGetSelectOpacity () / 100; wAttrib.saturation = COLOR * gs->optionGetSelectSaturation () / 100; wAttrib.brightness = BRIGHT * gs->optionGetSelectBrightness () / 100; } if (doTabbing) { /* fade the window out */ float progress; int distanceX, distanceY; float origDistance, distance; /* If we are finished the animation, draw in the destination * not at the translation speed */ if (mAnimateState & FINISHED_ANIMATION) { drawnPosX = mDestination.x (); drawnPosY = mDestination.y (); } else { /* Add new translation points to drawn position */ drawnPosX = mOrgPos.x () + mTx; drawnPosY = mOrgPos.y () + mTy; } /* Determine progress as distance towards the destination */ distanceX = drawnPosX - mDestination.x (); distanceY = drawnPosY - mDestination.y (); distance = sqrt (pow (distanceX, 2) + pow (distanceY, 2)); distanceX = (mOrgPos.x () - mDestination.x ()); distanceY = (mOrgPos.y () - mDestination.y ()); origDistance = sqrt (pow (distanceX, 2) + pow (distanceY, 2)); /* Avoid div0 */ if (!distanceX && !distanceY) progress = 1.0f; else /* Fading progress is 1 - the distance on the ratio * of current difference to original distance */ progress = 1.0f - (distance / origDistance); animProgress = progress; /* If we are tabbing the group, invert that (since we are * fading out here) */ progress = MAX (progress, 0.0f); if (mGroup->mTabbingState == GroupSelection::Tabbing) progress = 1.0f - progress; /* Paint with a progressional opacity */ wAttrib.opacity = (float)wAttrib.opacity * progress; } if (doRotate) { /* Determine animation progress for rotation, here, * "2" is the maximum point, so at "1" the window switching * should have reached a half-way point, and we will no * longer paint that window and instead paint the new * incoming window */ float timeLeft = mGroup->mTabBar->mChangeAnimationTime; int animTime = gs->optionGetChangeAnimationTime () * 500; if (mGroup->mTabBar->mChangeState == GroupTabBar::TabChangeOldOut) timeLeft += animTime; /* 0 at the beginning, 1 at the end */ animProgress = 1 - (timeLeft / (2 * animTime)); } /* Determine resize geometry scale (window stretch on group * resize) */ if (!mResizeGeometry.isEmpty ()) { int xOrigin, yOrigin; float xScale, yScale; CompRect box; /* Get the scale amount for the resize box */ getStretchRectangle (box, xScale, yScale); xOrigin = window->x () - w->border ().left; yOrigin = window->y () - w->border ().top; wTransform.translate (xOrigin, yOrigin, 0.0f); wTransform.scale (xScale, yScale, 1.0f); wTransform.translate ((mResizeGeometry.x () - window->x ()) / xScale - xOrigin, (mResizeGeometry.y () - window->y ()) / yScale - yOrigin, 0.0f); mask |= PAINT_WINDOW_TRANSFORMED_MASK; } else if (doRotate || doTabbing) { float animWidth, animHeight; float animScaleX, animScaleY; CompWindow *morphBase, *morphTarget; /* morphBase and morphTarget here are for both animations, * since during the course of the animation, they scale * the window to the size of the new relevant window * the user will see. * * In the tabbing animation, the windows morph into the * size of the top tab of the window group, or if untabbing * then they morph from the size of the top tab, and morph * to their original size. * * In the rotate animation, the outgoing window morphs into * the same size as the incoming window */ if (doTabbing) { if (mGroup->mTabbingState == GroupSelection::Tabbing) { morphBase = w; morphTarget = TOP_TAB (mGroup); } else { morphTarget = w; if (HAS_TOP_WIN (mGroup)) morphBase = TOP_TAB (mGroup); else morphBase = mGroup->mTabBar->mLastTopTab; } } else /* doRotate */ { morphBase = PREV_TOP_TAB (mGroup); morphTarget = TOP_TAB (mGroup); } /* Morph progressively based on the animation progress */ animWidth = (1 - animProgress) * WIN_REAL_WIDTH (morphBase) + animProgress * WIN_REAL_WIDTH (morphTarget); animHeight = (1 - animProgress) * WIN_REAL_HEIGHT (morphBase) + animProgress * WIN_REAL_HEIGHT (morphTarget); /* Don't allow absurdly small values or div0 */ animWidth = MAX (1.0f, animWidth); animHeight = MAX (1.0f, animHeight); animScaleX = animWidth / WIN_REAL_WIDTH (w); animScaleY = animHeight / WIN_REAL_HEIGHT (w); /* If we are rotating, we need to scale on z by 1 / z */ if (doRotate) wTransform.scale (1.0f, 1.0f, 1.0f / screen->width ()); /* Translate to the window center so we can paint windows * translated and rotated */ wTransform.translate (WIN_REAL_X (w) + WIN_REAL_WIDTH (w) / 2.0f, WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) / 2.0f, 0.0f); /* Rotate the window based on the animation progress in the * rotating case. If this is the top window, then invert * the rotation start point. If the change direction * is left, then invert the rotating direction */ if (doRotate) { float rotateAngle = animProgress * 180.0f; if (IS_TOP_TAB (w, mGroup)) rotateAngle += 180.0f; if (mGroup->mTabBar->mChangeAnimationDirection < 0) rotateAngle *= -1.0f; perspectiveDistortAndResetZ (wTransform); wTransform.rotate (rotateAngle, 0.0f, 1.0f, 0.0f); } /* Draw the window translated depending on position */ if (doTabbing) wTransform.translate (drawnPosX - WIN_X (w), drawnPosY - WIN_Y (w), 0.0f); /* Since we are still centered, we can scale directly to * our morphing targets */ wTransform.scale (animScaleX, animScaleY, 1.0f); /* Recorrect translation matrix for next plugin */ wTransform.translate (-(WIN_REAL_X (w) + WIN_REAL_WIDTH (w) / 2.0f), -(WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) / 2.0f), 0.0f); mask |= PAINT_WINDOW_TRANSFORMED_MASK; } status = gWindow->glPaint (wAttrib, wTransform, region, mask); if (showTabbar) { /* Paint the tab bar (only gets the geometry it got from * glPaint so far, so it doesn't wobbly or anything strange * like that, though maybe FIXME this should be changed) * * Disable our glPaint function here to avoid recursive * calls within GroupTabBar::paint, since we need to paint * this window geometry a few more times */ gWindow->glPaintSetEnabled (this, false); mGroup->mTabBar->paint (wAttrib, wTransform, mask, region); gWindow->glPaintSetEnabled (this, true); } } else { status = gWindow->glPaint (attrib, transform, region, mask); } return status; } compiz-0.9.11+14.04.20140409/plugins/group/src/group.h0000644000015301777760000003553212321343002022413 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * group.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Some terminology used in this plugin: * * 1. The "top tab" means the currently selected visible tab in the * group. All other windows in the tabbed group are invisible. * * 2. There are two animations, "Tabbing/Untabbing" and the "Change" * animation. The "Tabbing/Untabbing" one is probably the most complex. * This is where we center windows to some central top tab and then * animate them to appear to be morphing into this window. We also * do a similar animation when animating out (which is why we need * to save their relevant distance from the main window initially). * There is also the "change" animation, which is where we switch * between a number of top tabs * * 3. The glow around windows is actually in fact a small texture which * is strectched according to some gloq quads and then painted. * * 4. Each "layer" here is a GUI object which is painted on screen * (such as the tab bar, the text, the selection highlight, etc) * **/ #ifndef _GROUP_H #define _GROUP_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class GroupSelection; class GroupWindow; class GroupScreen; #include "layers.h" #include "tabbar.h" #include "glow.h" #include "group_options.h" /* * Used to check if we can use the text plugin * */ extern bool gTextAvailable; /* * Constants * */ extern const double PI; /* * Helpers * */ #define WIN_X(w) (w->x ()) #define WIN_Y(w) (w->y ()) #define WIN_WIDTH(w) (w->width ()) #define WIN_HEIGHT(w) (w->height ()) #define WIN_CENTER_X(w) (WIN_X (w) + (WIN_WIDTH (w) / 2)) #define WIN_CENTER_Y(w) (WIN_Y (w) + (WIN_HEIGHT (w) / 2)) /* definitions used for glow painting */ #define WIN_REAL_X(w) (w->x () - w->border ().left) #define WIN_REAL_Y(w) (w->y () - w->border ().top) #define WIN_REAL_WIDTH(w) (w->width () + 2 * w->geometry ().border () + \ w->border ().left + w->border ().right) #define WIN_REAL_HEIGHT(w) (w->height () + 2 * w->geometry ().border () + \ w->border ().top + w->border ().bottom) #define TOP_TAB(g) ((g)->mTabBar->mTopTab->mWindow) #define PREV_TOP_TAB(g) ((g)->mTabBar->mPrevTopTab->mWindow) #define NEXT_TOP_TAB(g) ((g)->mTabBar->mNextTopTab->mWindow) #define HAS_TOP_WIN(group) (((group)->mTabBar && (group)->mTabBar->mTopTab) && ((group)->mTabBar->mTopTab->mWindow)) #define HAS_PREV_TOP_WIN(group) (((group)->mTabBar->mPrevTopTab) && \ ((group)->mTabBar->mPrevTopTab->mWindow)) #define IS_TOP_TAB(w, group) (HAS_TOP_WIN (group) && \ ((TOP_TAB (group)->id ()) == (w)->id ())) #define IS_PREV_TOP_TAB(w, group) (HAS_PREV_TOP_WIN (group) && \ ((PREV_TOP_TAB (group)->id ()) == (w)->id ())) /* * Selection */ class Selection : public CompWindowList { public: Selection () : mPainted (false), mVpX (0), mVpY (0), mX1 (0), mY1 (0), mX2 (0), mY2 (0) {}; void checkWindow (CompWindow *w); void deselect (CompWindow *w); void deselect (GroupSelection *group); void select (CompWindow *w); void select (GroupSelection *g); void selectRegion (); GroupSelection * toGroup (); void damage (int, int); void paint (const GLScreenPaintAttrib sa, const GLMatrix transform, CompOutput *output, bool transformed); /* For selection */ bool mPainted; int mVpX, mVpY; int mX1, mY1, mX2, mY2; }; /* * GroupSelection */ class GroupSelection { public: class ResizeInfo { public: CompWindow *mResizedWindow; CompRect mOrigGeometry; }; public: /* * Ungrouping states */ typedef enum { UngroupNone = 0, UngroupAll, UngroupSingle } UngroupState; typedef enum { NoTabbing = 0, Tabbing, Untabbing } TabbingState; public: typedef std::list List; GroupSelection (); ~GroupSelection (); public: void tabGroup (CompWindow *main); void untabGroup (); void raiseWindows (CompWindow *top); void minimizeWindows (CompWindow *top, bool minimize); void shadeWindows (CompWindow *top, bool shade); void moveWindows (CompWindow *top, int dx, int dy, bool immediate, bool viewportChange = false); void prepareResizeWindows (CompRect &resizeRect); void resizeWindows (CompWindow *top); void maximizeWindows (CompWindow *top); void changeColor (); void applyConstraining (CompRegion constrainRegion, Window constrainedWindow, int dx, int dy); bool tabBarTimeout (); bool showDelayTimeout (); void tabSetVisibility (bool visible, unsigned int mask); void handleHoverDetection (const CompPoint &); bool handleAnimation (); void finishTabbing (); bool drawTabAnimation (int msSinceLastPaint); void startTabbingAnimation (bool tab); void fini (); public: CompScreen *mScreen; CompWindowList mWindows; MousePoller mPoller; GroupTabBar *mTabBar; GroupSelection::TabbingState mTabbingState; UngroupState mUngroupState; Window mGrabWindow; unsigned int mGrabMask; GLushort mColor[4]; ResizeInfo *mResizeInfo; /* It's easier to keep track of these things, serialize them * and rebuild what the group would have looked like later */ std::list mWindowIds; Window mTopId; }; /* * GroupWindow structure */ class GroupWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: /* * Window states */ typedef enum { WindowNormal = 0, WindowMinimized, WindowShaded } State; class HideInfo { public: Window mShapeWindow; unsigned long mSkipState; unsigned long mShapeMask; XRectangle *mInputRects; int mNInputRects; int mInputRectOrdering; }; /* * Structs for pending callbacks */ class PendingMoves { public: CompWindow *w; int dx; int dy; bool immediate; bool sync; GroupWindow::PendingMoves *next; }; class PendingGrabs { public: CompWindow *w; int x; int y; unsigned int state; unsigned int mask; PendingGrabs *next; }; class PendingUngrabs { public: CompWindow *w; PendingUngrabs *next; }; class PendingSyncs { public: CompWindow *w; PendingSyncs *next; }; public: GroupWindow (CompWindow *); ~GroupWindow (); public: CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; public: void moveNotify (int, int, bool); void resizeNotify (int, int, int, int); void grabNotify (int, int, unsigned int, unsigned int); void ungrabNotify (); void windowNotify (CompWindowNotify n); void stateChangeNotify (unsigned int); void activate (); void getOutputExtents (CompWindowExtents &); bool glDraw (const GLMatrix &, GLFragment::Attrib &, const CompRegion &, unsigned int); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool damageRect (bool, const CompRect &); public: /* glow.cpp */ bool checkTabbing (); bool checkRotating (); bool checkShowTabBar (); void paintGlow (GLFragment::Attrib &attrib, const CompRegion &paintRegion, unsigned int mask); void computeGlowQuads (GLTexture::Matrix *matrix); /* paint.cpp */ void getStretchRectangle (CompRect &box, float &xScaleRet, float &yScaleRet); /* queues.cpp */ void enqueueMoveNotify (int dx, int dy, bool immediate, bool sync); void enqueueGrabNotify (int x, int y, unsigned int state, unsigned int mask); void enqueueUngrabNotify (); /* selection.cpp */ bool windowInRegion (CompRegion src, float precision); /* group.cpp */ bool isGroupWindow (); bool dragHoverTimeout (); unsigned int updateResizeRectangle (CompRect masterGeometry, bool damage); void deleteGroupWindow (); void removeWindowFromGroup (); void addWindowToGroup (GroupSelection *group); /* tab.cpp */ CompRegion getClippingRegion (); void clearWindowInputShape (GroupWindow::HideInfo *hideInfo); void setWindowVisibility (bool visible); int adjustTabVelocity (); bool constrainMovement (CompRegion constrainRegion, int dx, int dy, int &new_dx, int &new_dy); /* init.cpp */ void checkFunctions (); public: GroupSelection *mGroup; bool mInSelection; /* For the tab bar */ GroupTabBarSlot *mSlot; bool mNeedsPosSync; GlowQuad *mGlowQuads; GroupWindow::State mWindowState; GroupWindow::HideInfo *mWindowHideInfo; CompRect mResizeGeometry; /* For tab animation */ int mAnimateState; CompPoint mMainTabOffset; CompPoint mDestination; CompPoint mOrgPos; float mTx,mTy; float mXVelocity, mYVelocity; }; /* * GroupScreen structure */ class GroupScreen : public PluginClassHandler , public GroupOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: /* * Screengrab states */ typedef enum { ScreenGrabNone = 0, ScreenGrabSelect, ScreenGrabTabDrag } GrabState; public: GroupScreen (CompScreen *); ~GroupScreen (); public: CompositeScreen *cScreen; GLScreen *gScreen; public: void handleEvent (XEvent *); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); CompMatch::Expression * matchInitExp (const CompString &str); void matchExpHandlerChanged (); public: void checkFunctions (); void optionChanged (CompOption *opt, Options num); bool applyInitialActions (); /* cairo.cpp */ void damagePaintRectangle (const CompRect &box); /* queues.cpp */ void dequeueSyncs (GroupWindow::PendingSyncs *); void dequeueMoveNotifies (); void dequeueGrabNotifies (); void dequeueUngrabNotifies (); bool dequeueTimer (); /* selection.cpp */ bool selectSingle (CompAction *action, CompAction::State state, CompOption::Vector options); bool select (CompAction *action, CompAction::State state, CompOption::Vector options); bool selectTerminate (CompAction *action, CompAction::State state, CompOption::Vector options); /* group.cpp */ void grabScreen (GroupScreen::GrabState newState); bool groupWindows (CompAction *action, CompAction::State state, CompOption::Vector options); bool ungroupWindows (CompAction *action, CompAction::State state, CompOption::Vector options); bool removeWindow (CompAction *action, CompAction::State state, CompOption::Vector options); bool closeWindows (CompAction *action, CompAction::State state, CompOption::Vector options); bool changeColor (CompAction *action, CompAction::State state, CompOption::Vector options); bool setIgnore (CompAction *action, CompAction::State state, CompOption::Vector options); bool unsetIgnore (CompAction *action, CompAction::State state, CompOption::Vector options); void handleButtonPressEvent (XEvent *event); void handleButtonReleaseEvent (XEvent *event); void handleMotionEvent (int xRoot, int yRoot); /* tab.cpp */ bool getCurrentMousePosition (int &x, int &y); void tabChangeActivateEvent (bool activating); void updateTabBars (Window enteredWin); CompRegion getConstrainRegion (); bool changeTab (GroupTabBarSlot *topTab, GroupTabBar::ChangeAnimationDirection direction); void recalcSlotPos (GroupTabBarSlot *slot, int slotPos); bool initTab (CompAction *aciton, CompAction::State state, CompOption::Vector options); bool changeTabLeft (CompAction *action, CompAction::State state, CompOption::Vector options); bool changeTabRight (CompAction *action, CompAction::State state, CompOption::Vector options); void switchTopTabInput (GroupSelection *group, bool enable); public: bool mIgnoreMode; GlowTextureProperties *mGlowTextureProperties; GroupSelection *mLastRestackedGroup; Atom mResizeNotifyAtom; CompText mText; GroupWindow::PendingMoves *mPendingMoves; GroupWindow::PendingGrabs *mPendingGrabs; GroupWindow::PendingUngrabs *mPendingUngrabs; CompTimer mDequeueTimeoutHandle; GroupSelection::List mGroups; Selection mTmpSel; bool mQueued; GroupScreen::GrabState mGrabState; CompScreen::GrabHandle mGrabIndex; GroupSelection *mLastHoveredGroup; CompTimer mShowDelayTimeoutHandle; /* For d&d */ GroupTabBarSlot *mDraggedSlot; CompTimer mDragHoverTimeoutHandle; bool mDragged; int mPrevX, mPrevY; /* Buffer for mouse coordinates */ CompTimer mInitialActionsTimeoutHandle; GLTexture::List mGlowTexture; Window mLastGrabbedWindow; }; #define GROUP_SCREEN(s) \ GroupScreen *gs = GroupScreen::get (s); #define GROUP_WINDOW(w) \ GroupWindow *gw = GroupWindow::get (w); class GroupPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; /* * Pre-Definitions * */ #endif compiz-0.9.11+14.04.20140409/plugins/group/src/cairo.cpp0000644000015301777760000006023712321343002022707 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * cairo.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" /* * SelectionLayer::rebuild * * This function takes an existing SelectionLayer (CairoLayer), * saves it's properties into a buffer, deletes it and re-creates * it with those properties. This is generally less error-prone * than only deleting the bits of the layer we need (since there is * a lot of sensitive cairo code in there) * */ SelectionLayer* SelectionLayer::rebuild (SelectionLayer *layer, CompSize size) { int timeBuf = layer->mAnimationTime; PaintState stateBuf = layer->mState; GroupSelection *gBuf = layer->mGroup; delete layer; layer = SelectionLayer::create (size, gBuf); if (!layer) return NULL; layer->mAnimationTime = timeBuf; layer->mState = stateBuf; return layer; } /* * BackgroundLayer::rebuild * * This function takes an existing BackgroundLayer (CairoLayer), * saves it's properties into a buffer, deletes it and re-creates * it with those properties. This is generally less error-prone * than only deleting the bits of the layer we need (since there is * a lot of sensitive cairo code in there) * */ BackgroundLayer* BackgroundLayer::rebuild (BackgroundLayer *layer, CompSize size) { int timeBuf = layer->mAnimationTime; PaintState stateBuf = layer->mState; GroupSelection *gBuf = layer->mGroup; delete layer; layer = BackgroundLayer::create (size, gBuf); if (!layer) return NULL; layer->mAnimationTime = timeBuf; layer->mState = stateBuf; return layer; } /* * CairoLayer::clear * * This function clears any drawing on a cairo layer * */ void CairoLayer::clear () { cairo_t *cr = mCairo; cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); } /* * CairoLayer::~CairoLayer () * */ CairoLayer::~CairoLayer () { if (mCairo) cairo_destroy (mCairo); if (mSurface) cairo_surface_destroy (mSurface); if (mBuffer) delete[] mBuffer; } /* * CairoLayer::CairoLayer * * Constructor for CairoLayer, * * Since there is no ability to return a NULL object, we have * to set a validity state and continue to construct the * layer based on the success of cairo object construction * */ CairoLayer::CairoLayer (const CompSize &size, GroupSelection *g) : TextureLayer::TextureLayer (size, g), mBuffer (NULL), mSurface (NULL), mCairo (NULL), mFailed (true) { unsigned int bufSize = 4 * width () * height (); mAnimationTime = 0; mState = PaintOff; mBuffer = new unsigned char[bufSize]; if (mBuffer) { mSurface = cairo_image_surface_create_for_data (mBuffer, CAIRO_FORMAT_ARGB32, width (), height (), 4 * width ()); if (cairo_surface_status (mSurface) == CAIRO_STATUS_SUCCESS) { mCairo = cairo_create (mSurface); if (cairo_status (mCairo) == CAIRO_STATUS_SUCCESS) { clear (); mFailed = false; } else { compLogMessage ("group", CompLogLevelError, "Failed to create cairo layer context."); cairo_surface_destroy (mSurface); delete[] mBuffer; } } else { compLogMessage ("group", CompLogLevelError, "Failed to create cairo layer surface"); delete[] mBuffer; } } else { compLogMessage ("group", CompLogLevelError, "Failed to allocate cairo layer buffer."); } } BackgroundLayer::BackgroundLayer (const CompSize &size, GroupSelection *g) : CairoLayer::CairoLayer (size, g), mBgAnimationTime (0), mBgAnimation (BackgroundLayer::AnimationNone) { } /* * BackgroundLayer::create * * Factory method for BackgroundLayer. Automatically checks * for failure to create cairo objects * */ BackgroundLayer* BackgroundLayer::create (CompSize size, GroupSelection *g) { BackgroundLayer *layer; layer = new BackgroundLayer (size, g); if (!layer || layer->mFailed) return NULL; return layer; } /* * SelectionLayer::create * * Factory method for SelectionLayer. Automatically checks * for failure to create cairo objects * */ SelectionLayer* SelectionLayer::create (CompSize size, GroupSelection *g) { SelectionLayer *layer; layer = new SelectionLayer (size, g); if (!layer || layer->mFailed) return NULL; return layer; } /* * SelectionLayer::render * * Renders the group color highlight behind the active tab using cairo * */ void SelectionLayer::render () { cairo_t *cr; if (!HAS_TOP_WIN (mGroup) || !mCairo) return; cr = mCairo; /* fill */ cairo_set_line_width (cr, 2); cairo_set_source_rgba (cr, (mGroup->mColor[0] / 65535.0f), (mGroup->mColor[1] / 65535.0f), (mGroup->mColor[2] / 65535.0f), (mGroup->mColor[3] / (65535.0f * 2))); cairo_move_to (cr, 0, 0); cairo_rectangle (cr, 0, 0, width (), height ()); cairo_fill_preserve (cr); /* outline */ cairo_set_source_rgba (cr, (mGroup->mColor[0] / 65535.0f), (mGroup->mColor[1] / 65535.0f), (mGroup->mColor[2] / 65535.0f), (mGroup->mColor[3] / 65535.0f)); cairo_stroke (cr); mTexture = GLTexture::imageBufferToTexture ((char*) mBuffer, (CompSize &) *this); } /* * BackgroundLayer::render * * Render the background to the tab bar, also render the tab bar animation * */ void BackgroundLayer::render () { cairo_t *cr; int twidth, theight, radius; int borderWidth; float r, g, b, a; double x0, y0, x1, y1; GROUP_SCREEN (screen); if (!HAS_TOP_WIN (mGroup) || !mCairo) return; /* Dimensions are the tab bar's region */ twidth = mGroup->mTabBar->mRegion.boundingRect ().width (); theight = mGroup->mTabBar->mRegion.boundingRect ().height (); radius = gs->optionGetBorderRadius (); /* Do not draw more than the tab bar width */ if (twidth > width ()) twidth = width (); /* Border radius should not exceed * half of the tab bar height */ if (radius > twidth / 2) radius = twidth / 2; cr = mCairo; /* Clear the layer */ clear (); /* Draw the border around the tab bar */ borderWidth = gs->optionGetBorderWidth (); cairo_set_line_width (cr, borderWidth); cairo_save (cr); /* Move to the center of where we want to draw the line */ x0 = borderWidth / 2.0f; y0 = borderWidth / 2.0f; /* The center of where we want to draw the opposite line */ x1 = twidth - borderWidth / 2.0f; y1 = theight - borderWidth / 2.0f; cairo_move_to (cr, x0 + radius, y0); /* Arc the top right corner */ cairo_arc (cr, x1 - radius, y0 + radius, radius, M_PI * 1.5, M_PI * 2.0); /* Arc the bottom right corner */ cairo_arc (cr, x1 - radius, y1 - radius, radius, 0.0, M_PI * 0.5); /* Arc the bottom left corner */ cairo_arc (cr, x0 + radius, y1 - radius, radius, M_PI * 0.5, M_PI); /* Arc the top left corner */ cairo_arc (cr, x0 + radius, y0 + radius, radius, M_PI, M_PI * 1.5); cairo_close_path (cr); /* There are 5 different tab styles here: * Simple: draws a simple filled rect * Gradient: left to right gradient between base and highlight * Glass: left to right gradient, stopping at 60% and drawing a shadow * Metal: base -> highlight -> base gradient * Murrina: draws an arc between the two corners blending base and highlight */ switch (gs->optionGetTabStyle ()) { case GroupOptions::TabStyleSimple: { /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_set_source_rgba (cr, r, g, b, a); cairo_fill_preserve (cr); break; } case GroupOptions::TabStyleGradient: { /* fill */ cairo_pattern_t *pattern; pattern = cairo_pattern_create_linear (0, 0, twidth, theight); /* highlight color */ r = gs->optionGetTabHighlightColorRed () / 65535.0f; g = gs->optionGetTabHighlightColorGreen () / 65535.0f; b = gs->optionGetTabHighlightColorBlue () / 65535.0f; a = gs->optionGetTabHighlightColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill_preserve (cr); cairo_pattern_destroy (pattern); break; } case GroupOptions::TabStyleGlass: { cairo_pattern_t *pattern; cairo_save (cr); /* clip width rounded rectangle */ cairo_clip (cr); /* ===== HIGHLIGHT ===== */ /* make draw the shape for the highlight and create a pattern for it */ cairo_rectangle (cr, 0, 0, twidth, theight / 2); pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* highlight color */ r = gs->optionGetTabHighlightColorRed () / 65535.0f; g = gs->optionGetTabHighlightColorGreen () / 65535.0f; b = gs->optionGetTabHighlightColorBlue () / 65535.0f; a = gs->optionGetTabHighlightColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.6f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); /* ==== SHADOW ===== */ /* make draw the shape for the show and create a pattern for it */ cairo_rectangle (cr, 0, theight / 2, twidth, theight); pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* we don't want to use a full highlight here so we mix the colors */ r = (gs->optionGetTabHighlightColorRed () + gs->optionGetTabBaseColorRed ()) / (2 * 65535.0f); g = (gs->optionGetTabHighlightColorGreen () + gs->optionGetTabBaseColorGreen ()) / (2 * 65535.0f); b = (gs->optionGetTabHighlightColorBlue () + gs->optionGetTabBaseColorBlue ()) / (2 * 65535.0f); a = (gs->optionGetTabHighlightColorAlpha () + gs->optionGetTabBaseColorAlpha ()) / (2 * 65535.0f); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.5f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); cairo_restore (cr); /* draw shape again for the outline */ cairo_move_to (cr, x0 + radius, y0); cairo_arc (cr, x1 - radius, y0 + radius, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius, y1 - radius, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius, y1 - radius, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius, y0 + radius, radius, M_PI, M_PI * 1.5); break; } case GroupOptions::TabStyleMetal: { /* fill */ cairo_pattern_t *pattern; pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* base color #1 */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* highlight color */ r = gs->optionGetTabHighlightColorRed () / 65535.0f; g = gs->optionGetTabHighlightColorGreen () / 65535.0f; b = gs->optionGetTabHighlightColorBlue () / 65535.0f; a = gs->optionGetTabHighlightColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.55f, r, g, b, a); /* base color #2 */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill_preserve (cr); cairo_pattern_destroy (pattern); break; } case GroupOptions::TabStyleMurrina: { double ratio, transX; cairo_pattern_t *pattern; cairo_save (cr); /* clip width rounded rectangle */ cairo_clip_preserve (cr); /* ==== TOP ==== */ x0 = borderWidth / 2.0; y0 = borderWidth / 2.0; x1 = twidth - borderWidth / 2.0; y1 = theight - borderWidth / 2.0; radius = (y1 - y0) / 2; /* setup pattern */ pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* we don't want to use a full highlight here so we mix the colors */ r = (gs->optionGetTabHighlightColorRed () + gs->optionGetTabBaseColorRed ()) / (2 * 65535.0f); g = (gs->optionGetTabHighlightColorGreen () + gs->optionGetTabBaseColorGreen ()) / (2 * 65535.0f); b = (gs->optionGetTabHighlightColorBlue () + gs->optionGetTabBaseColorBlue ()) / (2 * 65535.0f); a = (gs->optionGetTabHighlightColorAlpha () + gs->optionGetTabBaseColorAlpha ()) / (2 * 65535.0f); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* highlight color */ r = gs->optionGetTabHighlightColorRed () / 65535.0f; g = gs->optionGetTabHighlightColorGreen () / 65535.0f; b = gs->optionGetTabHighlightColorBlue () / 65535.0f; a = gs->optionGetTabHighlightColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); /* ==== BOTTOM ===== */ x0 = borderWidth / 2.0; y0 = borderWidth / 2.0; x1 = twidth - borderWidth / 2.0; y1 = theight - borderWidth / 2.0; radius = (y1 - y0) / 2; ratio = (double)twidth / (double)theight; transX = twidth - (twidth * ratio); cairo_move_to (cr, x1, y1); cairo_line_to (cr, x1, y0); if (twidth < theight) { cairo_translate (cr, transX, 0); cairo_scale (cr, ratio, 1.0); } cairo_arc (cr, x1 - radius, y0, radius, 0.0, M_PI * 0.5); if (twidth < theight) { cairo_scale (cr, 1.0 / ratio, 1.0); cairo_translate (cr, -transX, 0); cairo_scale (cr, ratio, 1.0); } cairo_arc_negative (cr, x0 + radius, y1, radius, M_PI * 1.5, M_PI); cairo_close_path (cr); /* setup pattern */ pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* we don't want to use a full highlight here so we mix the colors */ r = (gs->optionGetTabHighlightColorRed () + gs->optionGetTabBaseColorRed ()) / (2 * 65535.0f); g = (gs->optionGetTabHighlightColorGreen () + gs->optionGetTabBaseColorGreen ()) / (2 * 65535.0f); b = (gs->optionGetTabHighlightColorBlue () + gs->optionGetTabBaseColorBlue ()) / (2 * 65535.0f); a = (gs->optionGetTabHighlightColorAlpha () + gs->optionGetTabBaseColorAlpha ()) / (2 * 65535.0f); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_restore (cr); /* draw shape again for the outline */ x0 = borderWidth / 2.0; y0 = borderWidth / 2.0; x1 = twidth - borderWidth / 2.0; y1 = theight - borderWidth / 2.0; radius = gs->optionGetBorderRadius (); cairo_move_to (cr, x0 + radius, y0); cairo_arc (cr, x1 - radius, y0 + radius, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius, y1 - radius, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius, y1 - radius, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius, y0 + radius, radius, M_PI, M_PI * 1.5); break; } default: break; } /* outline */ r = gs->optionGetTabBorderColorRed () / 65535.0f; g = gs->optionGetTabBorderColorGreen () / 65535.0f; b = gs->optionGetTabBorderColorBlue () / 65535.0f; a = gs->optionGetTabBorderColorAlpha () / 65535.0f; cairo_set_source_rgba (cr, r, g, b, a); /* If there is an animation running, stroke preserved * so that we can paint directly on top (and blend!) * the new animation with the existing tab bar. * Otherwise just stroke normally, this is less expensive */ if (mBgAnimation != AnimationNone) cairo_stroke_preserve (cr); else cairo_stroke (cr); /* There are two animations here: * Pulse: Highlight tab bar in and out (used for tab hover) * Reflex: Paint a diagonal gradient moving from right to left * on the tab bar when it appears */ switch (mBgAnimation) { case AnimationPulse: { double animationProgress; double alpha; /* Progress here is measured in the current time */ animationProgress = mBgAnimationTime / (gs->optionGetPulseTime () * 1000.0); /* The highlight pulsates in and out, so the alpha here should run * on a sine wave */ alpha = sin ((2 * PI * animationProgress) - 1.55)*0.5 + 0.5; /* If the alpha of the animation is < 0, don't bother painting */ if (alpha <= 0) break; cairo_save (cr); cairo_clip (cr); /* Paint highlight over the tab bar */ cairo_set_operator (cr, CAIRO_OPERATOR_XOR); cairo_rectangle (cr, 0.0, 0.0, twidth, theight); cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, alpha); cairo_fill (cr); cairo_restore (cr); break; } case AnimationReflex: { double animationProgress; double reflexWidth; double posX, alpha; cairo_pattern_t *pattern; /* Progress is measured in current time */ animationProgress = mBgAnimationTime / (gs->optionGetReflexTime () * 1000.0); /* Position here is the tab bar width plus the reflection width * 2 */ reflexWidth = (mGroup->mTabBar->mSlots.size () / 2.0) * 30; posX = (twidth + reflexWidth * 2.0) * animationProgress; alpha = sin (PI * animationProgress) * 0.55; if (alpha <= 0) break; cairo_save (cr); cairo_clip (cr); pattern = cairo_pattern_create_linear (posX - reflexWidth, 0.0, posX, theight); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, 1.0, 1.0, 1.0, 0.0); cairo_pattern_add_color_stop_rgba (pattern, 0.5f, 1.0, 1.0, 1.0, alpha); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, 1.0, 1.0, 1.0, 0.0); cairo_rectangle (cr, 0.0, 0.0, twidth, theight); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_restore (cr); cairo_pattern_destroy (pattern); break; } case AnimationNone: default: break; } /* draw inner outline */ cairo_move_to (cr, x0 + radius + 1.0, y0 + 1.0); cairo_arc (cr, x1 - radius - 1.0, y0 + radius + 1.0, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius - 1.0, y1 - radius - 1.0, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius + 1.0, y1 - radius - 1.0, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius + 1.0, y0 + radius + 1.0, radius, M_PI, M_PI * 1.5); cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.3); cairo_stroke(cr); cairo_restore (cr); mTexture = GLTexture::imageBufferToTexture ((char*) mBuffer, (CompSize &) *this); } /* * TextLayer::create * * Factory method of text layer. Returns nothing * if the text is not valid * */ TextLayer * TextLayer::create (CompSize &size, GroupSelection *group) { TextLayer *layer = new TextLayer (size, group); if (!layer) return NULL; return layer; } /* * TextLayer::rebuild * * Take a text layer, save it's properties into a buffer * and re-create it with those properties * */ TextLayer * TextLayer::rebuild (TextLayer *layer) { /* general cleanup func ... for now */ if (layer) { if (layer->mPixmap) XFreePixmap (screen->dpy (), layer->mPixmap); PaintState pStateBuf = layer->mState; int aTimeBuf = layer->mAnimationTime; CompSize sBuf = (CompSize ) *layer; GroupSelection *gBuf = layer->mGroup; delete layer; layer = new TextLayer (sBuf, gBuf); if (!layer) return NULL; layer->mState = pStateBuf; layer->mAnimationTime = aTimeBuf; } return layer; } /* * TextLayer::render * * Renders some text without a background, without automatically * binding the text pixmap to a texture (since we need to bind it later) * */ void TextLayer::render () { int twidth, theight; Pixmap pixmap = None; GROUP_SCREEN (screen); if (!HAS_TOP_WIN (mGroup)) return; /* Maximum text width is the tab bar width */ twidth = mGroup->mTabBar->mRegion.boundingRect ().width (); theight = mGroup->mTabBar->mRegion.boundingRect ().height (); if (mGroup->mTabBar->mTextSlot && mGroup->mTabBar->mTextSlot->mWindow && gTextAvailable) { CompText::Attrib textAttrib; textAttrib.family = "Sans"; textAttrib.size = gs->optionGetTabbarFontSize (); /* Bold text, ellipsize if there is not enough room and do not * automatically bind pixmap to texture */ textAttrib.flags = CompText::StyleBold | CompText::Ellipsized | CompText::NoAutoBinding; textAttrib.color[0] = gs->optionGetTabbarFontColorRed (); textAttrib.color[1] = gs->optionGetTabbarFontColorGreen (); textAttrib.color[2] = gs->optionGetTabbarFontColorBlue (); textAttrib.color[3] = gs->optionGetTabbarFontColorAlpha (); textAttrib.maxWidth = twidth; textAttrib.maxHeight = theight; /* Render title of the top window */ if (gs->mText.renderWindowTitle ( mGroup->mTabBar->mTextSlot->mWindow->id (), false, textAttrib)) { pixmap = gs->mText.getPixmap (); twidth = gs->mText.getWidth (); theight = gs->mText.getHeight (); } } if (!pixmap) { /* getting the pixmap failed, so create an empty one */ pixmap = XCreatePixmap (screen->dpy (), screen->root (), twidth, theight, 32); if (pixmap) { XGCValues gcv; GC gc; gcv.foreground = 0x00000000; gcv.plane_mask = 0xffffffff; gc = XCreateGC (screen->dpy (), pixmap, GCForeground, &gcv); XFillRectangle (screen->dpy (), pixmap, gc, 0, 0, twidth, theight); XFreeGC (screen->dpy (), gc); } } setWidth (twidth); setHeight (theight); if (pixmap) { mTexture.clear (); mPixmap = pixmap; /* Text layer's texture is bound here, this can be re used * in TextureLayer::paint */ mTexture = GLTexture::bindPixmapToTexture (mPixmap, width (), height (), 32); } } compiz-0.9.11+14.04.20140409/plugins/group/src/queues.cpp0000644000015301777760000001072012321343002023111 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * queues.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" /* * functions enqueuing pending notifies * */ /* forward declaration */ void GroupWindow::enqueueMoveNotify (int dx, int dy, bool immediate, bool sync) { GroupWindow::PendingMoves *move; GROUP_SCREEN (screen); move = new GroupWindow::PendingMoves; if (!move) return; move->w = window; move->dx = dx; move->dy = dy; move->immediate = immediate; move->sync = sync; move->next = NULL; if (gs->mPendingMoves) { GroupWindow::PendingMoves *temp; for (temp = gs->mPendingMoves; temp->next; temp = temp->next); temp->next = move; } else gs->mPendingMoves = move; if (!gs->mDequeueTimeoutHandle.active ()) { gs->mDequeueTimeoutHandle.start (); } } void GroupScreen::dequeueSyncs (GroupWindow::PendingSyncs *syncs) { GroupWindow::PendingSyncs *sync; while (syncs) { sync = syncs; syncs = sync->next; GROUP_WINDOW (sync->w); if (gw->mNeedsPosSync) { gw->mNeedsPosSync = false; } delete sync; } } void GroupScreen::dequeueMoveNotifies () { GroupWindow::PendingMoves *move; GroupWindow::PendingSyncs *syncs = NULL, *sync; mQueued = true; while (mPendingMoves) { move = mPendingMoves; mPendingMoves = move->next; move->w->move (move->dx, move->dy, move->immediate); if (move->sync) { sync = new GroupWindow::PendingSyncs; if (sync) { GROUP_WINDOW (move->w); gw->mNeedsPosSync = true; sync->w = move->w; sync->next = syncs; syncs = sync; } } delete move; } if (syncs) { dequeueSyncs (syncs); } mQueued = false; } void GroupWindow::enqueueGrabNotify (int x, int y, unsigned int state, unsigned int mask) { GroupWindow::PendingGrabs *grab; GROUP_SCREEN (screen); grab = new GroupWindow::PendingGrabs; if (!grab) return; grab->w = window; grab->x = x; grab->y = y; grab->state = state; grab->mask = mask; grab->next = NULL; if (gs->mPendingGrabs) { GroupWindow::PendingGrabs *temp; for (temp = gs->mPendingGrabs; temp->next; temp = temp->next); temp->next = grab; } else gs->mPendingGrabs = grab; if (!gs->mDequeueTimeoutHandle.active ()) { gs->mDequeueTimeoutHandle.start (); } } void GroupScreen::dequeueGrabNotifies () { GroupWindow::PendingGrabs *grab; mQueued = true; while (mPendingGrabs) { grab = mPendingGrabs; mPendingGrabs = mPendingGrabs->next; grab->w->grabNotify (grab->x, grab->y, grab->state, grab->mask); delete grab; } mQueued = false; } void GroupWindow::enqueueUngrabNotify () { GroupWindow::PendingUngrabs *ungrab; GROUP_SCREEN (screen); ungrab = new GroupWindow::PendingUngrabs; if (!ungrab) return; ungrab->w = window; ungrab->next = NULL; if (gs->mPendingUngrabs) { GroupWindow::PendingUngrabs *temp; for (temp = gs->mPendingUngrabs; temp->next; temp = temp->next); temp->next = ungrab; } else gs->mPendingUngrabs = ungrab; if (!gs->mDequeueTimeoutHandle.active ()) { gs->mDequeueTimeoutHandle.start (); } } void GroupScreen::dequeueUngrabNotifies () { GroupWindow::PendingUngrabs *ungrab; mQueued = true; while (mPendingUngrabs) { ungrab = mPendingUngrabs; mPendingUngrabs = mPendingUngrabs->next; ungrab->w->ungrabNotify (); delete ungrab; } mQueued = false; } bool GroupScreen::dequeueTimer () { dequeueMoveNotifies (); dequeueGrabNotifies (); dequeueUngrabNotifies (); return false; } compiz-0.9.11+14.04.20140409/plugins/group/src/group_glow.h0000644000015301777760000007107412321343002023444 0ustar pbusernogroup00000000000000#ifndef _GROUP_GLOWTEX_H #define _GROUP_GLOWTEX_H /** * * Compiz group plugin * * group_glow.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ /* * glowTex */ static char glowTexRect[4097] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\14\377\377\377\14\377\377\377\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\14" "\377\377\377\14\377\377\377\22\377\377\377\22\377\377\377\22\377\377\377" "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377" "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377" "\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377" "\35\377\377\377\35\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\6\377\377\377\6\377\377\377\14\377\377\377\22\377\377\377\27\377\377" "\377\27\377\377\377\35\377\377\377#\377\377\377'\377\377\377'\377\377\377" "+\377\377\377+\377\377\377+\377\377\377+\377\377\377+\377\377\377+\377\377" "\377+\377\377\377+\377\377\377+\377\377\3771\377\377\3771\377\377\3771\377" "\377\3771\377\377\3771\377\377\3771\377\377\3771\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\22\377\377\377" "\27\377\377\377\35\377\377\377#\377\377\377+\377\377\3771\377\377\3776\377" "\377\377<\377\377\377>\377\377\377C\377\377\377I\377\377\377I\377\377\377" "I\377\377\377I\377\377\377I\377\377\377I\377\377\377I\377\377\377I\377\377" "\377L\377\377\377L\377\377\377L\377\377\377L\377\377\377L\377\377\377L\377" "\377\377L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\22\377\377\377\27\377\377\377#\377\377\377+\377\377\3776\377\377" "\377C\377\377\377L\377\377\377U\377\377\377]\377\377\377`\377\377\377d\377" "\377\377h\377\377\377k\377\377\377k\377\377\377k\377\377\377k\377\377\377" "k\377\377\377k\377\377\377k\377\377\377p\377\377\377p\377\377\377p\377\377" "\377p\377\377\377p\377\377\377p\377\377\377p\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\6\377\377\377\14\377\377\377\22\314\314\314\35\377\377\377'\377" "\377\3771\377\377\377>\357\357\357P\377\377\377]\363\363\363k\365\365\365" "v\365\365\365|\377\377\377\202\367\367\367\210\367\367\367\214\367\367\367" "\216\367\367\367\221\367\367\367\221\367\367\367\221\367\367\367\221\367" "\367\367\221\367\367\367\221\367\367\367\224\367\367\367\224\367\367\367" "\224\367\367\367\224\367\367\367\224\367\367\367\224\367\367\367\224\0\0" "\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\22\377\377\377\27\377" "\377\377'\377\377\3776\377\377\377I\377\377\377Y\377\377\377k\376\376\376" "y\377\377\377\210\377\377\377\224\377\377\377\235\377\377\377\245\377\377" "\377\253\377\377\377\255\377\377\377\262\377\377\377\262\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\266\377\377\377\266\377\377\377\266\377\377\377\266\377\377\377\266" "\377\377\377\266\377\377\377\266\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377" "\14\377\377\377\27\377\377\377#\377\377\3771\377\377\377I\377\377\377]\377" "\377\377r\377\377\377\205\377\377\377\231\377\377\377\247\377\377\377\263" "\377\377\377\275\377\377\377\304\377\377\377\310\377\377\377\313\377\377" "\377\316\377\377\377\320\377\377\377\320\377\377\377\320\377\377\377\320" "\377\377\377\320\377\377\377\320\377\377\377\322\377\377\377\322\377\377" "\377\322\377\377\377\322\377\377\377\322\377\377\377\322\377\377\377\322" "\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\22\377\377\377\35\377\377" "\377+\377\377\377>\377\377\377Y\377\377\377r\377\377\377\210\376\376\376" "\237\377\377\377\262\377\377\377\302\377\377\377\313\377\377\377\324\377" "\377\377\332\376\376\376\336\377\377\377\341\377\377\377\342\377\377\377" "\344\377\377\377\344\377\377\377\344\377\377\377\344\377\377\377\344\377" "\377\377\344\377\377\377\345\377\377\377\345\377\377\377\345\377\377\377" "\345\377\377\377\345\377\377\377\345\377\377\377\345\0\0\0\0\377\377\377" "\6\377\377\377\14\377\377\377\27\377\377\377#\377\377\3776\377\377\377P\377" "\377\377k\377\377\377\205\376\376\376\237\372\372\372\266\377\377\377\307" "\373\373\373\325\373\373\373\337\374\374\374\345\374\374\374\352\374\374" "\374\355\374\374\374\357\374\374\374\360\374\374\374\361\374\374\374\361" "\374\374\374\362\374\374\374\362\374\374\374\362\374\374\374\362\374\374" "\374\362\374\374\374\362\374\374\374\362\374\374\374\362\374\374\374\362" "\374\374\374\362\374\374\374\362\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\35\377\377\377+\377\377\377C\377\377\377]\377\377\377|\377\377\377" "\231\377\377\377\263\377\377\377\307\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\6\377\377\377\22\324\324\324#\377\377\3771\377\377\377L\363\363" "\363k\377\377\377\210\377\377\377\247\377\377\377\302\377\377\377\325\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\22\377\377" "\377#\377\377\377<\377\377\377U\377\377\377v\377\377\377\226\377\377\377" "\263\377\377\377\315\377\377\377\337\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\6\377\377\377\14\377\377\377\27\377\377\377'\377\377\377>\377\377\377]\377" "\377\377|\370\370\370\237\377\377\377\275\373\373\373\325\377\377\377\345" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\27\377" "\377\377+\377\377\377C\377\377\377`\377\377\377\202\377\377\377\247\377\377" "\377\304\377\377\377\332\377\377\377\352\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\6\377\377\377\14\377\377\377\27\377\377\377+\377\377\377C\377\377\377" "d\377\377\377\210\377\377\377\253\377\377\377\310\376\376\376\336\374\374" "\374\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377" "\35\377\377\377+\377\377\377I\377\377\377h\377\377\377\214\377\377\377\260" "\377\377\377\313\374\374\374\342\374\374\374\357\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\6\377\377\377\14\377\377\377\35\342\342\3421\377\377\377I\377" "\377\377k\377\377\377\216\377\377\377\262\377\377\377\316\374\374\374\344" "\377\377\377\360\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\35\377\377\3771\377\377\377L\377\377\377k\377\377\377\221\377\377" "\377\263\377\377\377\320\377\377\377\344\377\377\377\361\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377" "\377L\377\377\377k\377\377\377\221\377\377\377\263\377\377\377\320\377\377" "\377\344\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377" "\14\377\377\377\35\377\377\3771\377\377\377L\364\364\364p\377\377\377\221" "\372\372\372\266\377\377\377\320\374\374\374\345\377\377\377\362\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\377" "1\377\377\377L\377\377\377p\377\377\377\221\377\377\377\266\373\373\373\322" "\377\377\377\345\377\377\377\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377" "\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377p\377\377" "\377\221\377\377\377\266\373\373\373\322\377\377\377\345\377\377\377\362" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377" "\377\3771\377\377\377L\377\377\377p\377\377\377\221\377\377\377\266\373\373" "\373\322\377\377\377\345\377\377\377\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377" "p\367\367\367\224\377\377\377\266\377\377\377\322\377\377\377\345\374\374" "\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377" "\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224\377\377\377\266" "\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377" "\377\377p\367\367\367\224\377\377\377\266\377\377\377\322\377\377\377\345" "\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224\377\377" "\377\266\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377" "\377L\377\377\377p\367\367\367\224\377\377\377\266\377\377\377\322\377\377" "\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377" "\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224" "\377\377\377\266\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\377" "1\377\377\377L\377\377\377p\367\367\367\224\377\377\377\266\377\377\377\322" "\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", }; static char glowTexRing [4097]= { "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\201\202\202\1\205\205\205\2\206" "\206\206\4\210\210\210\6\211\211\211\10\212\212\212\13\213\213\213\14\213" "\213\213\15\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\204" "\203\203\0\206\206\206\1\207\207\207\3\210\211\211\10\213\213\213\16\216" "\216\216\25\220\220\220\33\222\223\222\40\224\224\224%\225\226\225(\227\227" "\227*\227\227\227+\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\202\203\203\0\206\206" "\205\3\211\211\211\10\214\214\214\22\220\220\220\34\225\225\225&\230\231" "\230.\234\234\2347\237\237\237=\242\242\242C\244\244\244G\245\245\246J\246" "\246\246L\247\247\247M\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\205\205\204\0\207\207\207\3\213\213\213\14\217" "\217\217\27\224\224\224$\232\232\2310\236\236\236:\244\244\244E\247\250\250" "M\254\253\254V\257\256\257\\\261\261\261b\264\264\264g\265\265\265j\266\266" "\266l\267\267\267m\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\205\205\205\1\212\212\212\12\217\217\217\30\225\225\225'\233\234" "\2335\242\242\242B\250\250\250O\255\255\255Z\263\263\263d\267\267\267m\273" "\273\273u\276\276\276|\301\301\301\203\304\304\304\207\305\305\305\213\307" "\307\307\215\307\307\307\217\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\205\205\205" "\1\211\211\211\7\215\215\216\24\225\225\225&\234\234\2345\243\243\243F\253" "\252\252S\261\261\261a\267\270\267n\275\275\275y\303\303\303\204\307\307" "\307\216\314\313\313\226\317\317\317\235\322\322\322\244\324\324\324\251" "\326\326\326\254\330\330\330\257\330\330\330\260\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\205" "\205\205\1\211\211\211\13\221\221\221\35\230\230\230.\241\241\241A\251\251" "\251P\261\260\261a\270\270\270p\277\277\277~\306\306\305\213\313\313\313" "\226\321\321\321\242\325\325\325\253\332\332\332\264\336\336\336\273\341" "\341\341\302\344\344\344\310\346\345\345\313\347\347\347\316\347\347\350" "\317\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\205\204\204\0\207\207\207\4\215\215\215\22\224\224\224%\236\236\236:\246" "\246\246K\260\260\260_\270\267\270o\300\300\300\200\310\310\310\217\317\317" "\317\236\326\326\326\254\334\334\334\267\342\342\342\304\346\346\346\315" "\353\353\353\327\357\357\357\336\362\362\362\345\365\365\365\352\367\367" "\366\355\370\367\367\357\367\370\367\360\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\206\205\205\0\210\207\210\4\215\215\215\24\227\226\226" ")\237\237\237=\252\251\252R\262\262\262d\274\274\274x\305\305\305\211\315" "\315\315\232\325\325\325\252\334\334\334\271\344\343\343\310\351\352\351" "\323\360\360\360\340\364\364\364\351\371\371\371\361\372\372\372\364\372" "\372\373\364\372\371\371\362\371\371\371\357\371\370\370\355\370\370\370" "\354\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\205\205\205\0\210\210\210\5" "\217\217\217\27\230\230\230.\243\243\243D\255\255\255X\267\267\267n\300\300" "\300\200\313\313\313\226\323\323\323\247\334\334\334\271\344\345\344\311" "\354\354\354\331\363\363\363\347\370\370\370\361\372\373\373\364\372\372" "\372\361\366\367\367\350\364\364\364\340\361\361\361\331\357\357\357\323" "\355\355\355\316\354\354\354\313\353\353\354\312\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\204\204\204\0\210\210\207\4\217\217\217\27\230\230\230-\243\243\243D\256" "\256\256[\271\271\271p\303\303\304\206\315\315\315\231\330\330\327\257\340" "\340\340\301\352\352\352\324\362\362\362\343\370\370\370\361\372\372\372" "\363\370\370\370\354\364\364\363\340\360\360\360\325\353\354\354\312\351" "\351\351\302\346\346\345\272\343\343\343\264\342\342\342\260\341\340\341" "\255\340\340\340\254\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\207\207\207\3\215\215\215\24" "\230\230\230-\243\243\243D\257\257\257\\\272\272\272t\305\305\305\212\320" "\320\320\240\332\332\332\263\345\345\345\312\356\356\356\334\367\367\367" "\356\372\372\372\364\370\370\370\354\362\362\362\334\355\355\355\317\350" "\350\350\301\344\344\344\266\337\340\337\252\335\334\335\242\331\331\331" "\231\327\327\327\223\325\325\325\217\324\324\324\213\323\323\323\212\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\205\205\205\1\214\214\214\21\226\226\226(\242\242\242C\256\256\256" "[\272\272\272t\306\306\306\213\321\321\321\241\334\334\334\271\346\346\346" "\315\362\362\362\343\371\371\371\361\371\371\371\360\364\364\364\341\356" "\356\356\320\350\350\350\300\343\342\342\262\335\335\335\243\331\331\331" "\227\324\324\324\213\321\321\321\202\316\315\316z\313\313\313s\312\312\312" "n\310\310\310k\310\310\310i\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\205\205\205\1\211\211\211\12\224\224\224$\237\237" "\237<\254\254\254X\270\270\270o\304\305\304\211\321\321\321\241\334\334\334" "\270\350\350\350\320\362\362\362\345\372\372\373\364\370\370\370\355\361" "\361\361\332\352\352\353\307\344\344\343\265\335\335\335\244\330\330\330" "\225\322\322\322\206\315\316\315z\311\311\311m\305\305\305d\302\302\302Z" "\300\300\277T\276\275\276O\274\274\274K\274\274\274I\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\211\211\211\6\220\220\220" "\34\235\235\2358\251\251\251Q\267\267\266m\303\303\303\206\320\320\320\240" "\334\334\334\270\350\350\350\320\364\364\364\350\372\373\372\365\366\366" "\366\347\357\357\357\323\347\347\347\276\340\340\340\253\331\331\331\230" "\322\322\322\206\315\315\314w\306\307\307g\302\302\302Z\275\275\275L\271" "\272\271C\266\266\266:\264\264\2632\262\262\262,\260\260\260)\260\260\260" "'\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\204\204\204\1\215" "\215\215\22\227\230\230,\245\245\245J\262\262\262c\300\300\300\177\314\314" "\314\230\332\332\331\263\346\346\346\314\362\362\362\344\372\372\372\364" "\367\367\367\352\356\356\356\321\347\346\346\275\336\336\336\247\327\327" "\327\223\320\320\320\177\311\311\311m\303\303\303]\275\274\275L\270\270\270" ">\263\263\2630\257\257\257&\254\254\254\34\252\252\252\25\250\250\250\20" "\250\247\250\14\250\247\250\12\377\377\377\0\377\377\377\0\377\377\377\0" "\204\204\204\0\211\211\211\11\224\224\224$\240\240\240?\257\257\257]\274" "\274\274w\312\312\312\224\327\327\327\256\344\344\344\311\362\361\362\343" "\372\373\372\364\366\366\367\347\356\357\356\321\344\344\344\267\335\335" "\335\242\324\324\324\213\314\314\314v\305\305\305b\276\276\276O\270\270\270" ">\261\261\261,\255\254\255\36\251\251\251\20\246\246\246\7\243\243\243\2" "\241\241\241\1\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\207\206\207\3\216\215\216\25\233\233\2333\247\247" "\250N\267\267\267m\303\304\304\207\323\323\323\245\337\340\337\277\355\355" "\355\333\371\371\371\361\371\370\371\355\357\357\357\324\347\347\346\275" "\335\335\335\242\325\325\325\215\313\314\313u\304\304\304_\274\274\274K\265" "\265\2656\257\257\257$\251\252\251\22\246\246\246\7\245\244\244\1\243\243" "\243\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\202\203\202\0\212\212\212\12\224\224\224%" "\242\242\242C\260\260\260_\277\277\277~\314\314\314\230\334\334\333\267\351" "\351\351\322\366\366\366\355\372\372\372\361\362\362\362\332\350\347\347" "\277\336\336\336\247\324\324\324\214\314\314\314u\303\303\303\\\272\272\273" "F\263\263\2630\254\254\254\33\247\247\247\12\243\243\243\1\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\206\205\205\2\216\216" "\216\25\232\232\2322\252\251\251Q\267\267\267m\307\307\307\215\324\324\324" "\250\344\344\343\307\361\361\361\342\372\372\372\364\365\365\365\343\353" "\353\353\310\340\340\340\254\327\327\327\224\314\314\315w\304\304\304`\273" "\272\273F\263\263\263/\253\253\253\31\247\247\247\7\244\244\244\1\242\242" "\242\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\203\202\202\0" "\210\210\210\7\223\223\223!\240\240\240?\260\260\260^\276\275\276{\316\315" "\316\233\333\333\333\267\353\353\353\326\367\367\370\357\370\370\370\356" "\357\357\357\322\344\344\344\267\332\331\331\232\320\320\320\201\305\305" "\305c\274\274\274L\263\263\2631\254\253\254\31\246\246\246\6\243\243\243" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\206\206\206\1\214\214\214\17\230\230\230-\247\246\246K\266\266" "\266k\304\304\304\210\325\324\324\251\342\342\342\305\362\362\362\345\372" "\372\372\364\363\363\363\337\351\351\351\302\336\336\336\246\323\323\323" "\210\311\311\311n\276\276\276P\266\266\2658\254\254\254\34\247\247\247\7" "\243\243\243\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\206\207\207\2\217\217\217\30\235\235\235" "7\254\254\254V\273\273\273v\312\312\312\223\332\332\332\264\350\350\350\321" "\367\370\370\360\371\371\370\356\356\356\356\321\343\343\343\264\331\331" "\331\227\315\315\315y\304\304\304^\270\270\270@\257\257\257&\247\247\247" "\13\244\244\244\1\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\210\210\210\6\223\223" "\223#\242\242\242B\261\261\261a\301\301\301\201\317\317\317\237\340\340\340" "\300\356\356\356\335\372\372\372\365\365\365\365\343\351\351\351\304\336" "\336\336\245\323\323\323\210\307\307\307i\275\276\276N\262\262\262.\252\252" "\252\24\244\243\244\1\242\242\242\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\202\202\202\0\212" "\212\212\13\226\226\227*\246\246\246J\265\265\265i\305\305\305\212\324\324" "\324\247\345\345\345\312\363\363\363\346\372\372\372\363\361\361\361\331" "\345\345\345\271\332\332\332\232\316\316\316}\303\303\303]\271\271\271A\255" "\255\255\40\247\247\247\10\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\203\203\203\1\214\214\214\21\232\232\2322\252\251\252R\271\271\271r\311" "\311\312\222\330\330\331\261\351\351\351\323\367\367\367\357\370\370\370" "\354\355\355\355\316\341\341\341\256\325\325\325\217\312\312\312p\276\276" "\276P\264\264\2643\251\251\251\22\245\245\245\2\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\205\205\205\2\217\217\217\26\235\235\2359\255\255" "\255X\274\274\274x\315\315\315\231\334\334\334\270\355\355\355\332\372\371" "\372\363\365\365\365\344\352\352\352\306\336\336\336\245\322\322\322\206" "\306\307\307g\273\273\273F\260\260\260)\246\246\246\12\242\242\243\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\207\207\207\4\221\221\220\33" "\240\240\237>\257\257\257^\277\277\277~\320\320\320\240\337\337\337\276\360" "\360\360\341\372\372\372\364\363\363\363\335\347\347\347\276\333\333\333" "\236\317\317\317}\303\304\304^\267\267\267=\255\255\255\40\244\244\244\4" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\211\210\210" "\5\222\222\222\40\242\242\242B\262\262\262b\302\301\302\203\322\322\322\244" "\341\341\341\303\363\363\363\346\372\372\372\363\360\360\360\327\345\345" "\345\271\330\330\330\227\314\315\315w\301\301\301X\265\265\2657\253\253\253" "\31\242\242\242\1\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\210\211\210\10\224\223\223#\243\243\243E\263\263\263e\303\303\303" "\206\324\323\324\250\343\343\343\307\365\364\364\351\372\372\372\362\357" "\357\357\323\344\344\343\264\327\327\327\223\313\313\313r\277\277\277S\263" "\263\2631\252\252\252\23\241\241\241\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\211\211\211\11\225\224\224%\244\244\244G\264" "\264\264g\304\304\304\210\325\325\325\252\345\344\344\311\366\366\366\353" "\372\372\372\361\356\356\356\320\342\342\343\261\326\326\326\220\312\312" "\312p\276\276\276P\262\262\262-\251\251\251\17\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\211\211\211\11\225\225" "\225&\244\245\244H\265\265\265i\305\305\305\211\325\326\325\253\345\345\345" "\312\366\366\366\354\371\371\371\360\355\355\355\317\342\342\342\260\325" "\325\325\217\312\311\312n\276\276\276N\262\262\262,\250\250\250\16\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" }; #endif compiz-0.9.11+14.04.20140409/plugins/group/src/init.cpp0000644000015301777760000004352512321343002022556 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * init.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" COMPIZ_PLUGIN_20090315 (group, GroupPluginVTable); /* If this is false, then there is no point in trying to render text * since it will fail */ bool gTextAvailable; /* * GroupScreen::optionChanged * * An option was just changed. Since we aren't constantly re-rendering * things like glow, the tab bar, the font, etc, we need to re-render * applicable things */ void GroupScreen::optionChanged (CompOption *opt, Options num) { GroupSelection *group; switch (num) { case GroupOptions::TabBaseColor: case GroupOptions::TabHighlightColor: case GroupOptions::TabBorderColor: case GroupOptions::TabStyle: case GroupOptions::BorderRadius: case GroupOptions::BorderWidth: foreach (group, mGroups) if (group->mTabBar) group->mTabBar->mBgLayer->render (); break; case GroupOptions::TabbarFontSize: case GroupOptions::TabbarFontColor: foreach (group, mGroups) if (group->mTabBar) { group->mTabBar->mTextLayer = TextLayer::rebuild (group->mTabBar->mTextLayer); if (group->mTabBar->mTextLayer) group->mTabBar->mTextLayer->render (); } break; case GroupOptions::ThumbSize: case GroupOptions::ThumbSpace: foreach (group, mGroups) if (group->mTabBar) { CompRect box = group->mTabBar->mRegion.boundingRect (); group->mTabBar->recalcTabBarPos ( (box.x1 () + box.x2 ()) / 2, box.x1 (), box.x2 ()); } break; case GroupOptions::Glow: case GroupOptions::GlowSize: { /* We have new output extents, so update them * and damage them */ foreach (CompWindow *w, screen->windows ()) { GROUP_WINDOW (w); GLTexture::Matrix tMat = mGlowTexture.at (0)->matrix (); gw->computeGlowQuads (&tMat); if (gw->mGlowQuads) { gw->cWindow->damageOutputExtents (); gw->window->updateWindowOutputExtents (); gw->cWindow->damageOutputExtents (); } } break; } case GroupOptions::GlowType: { int glowType; GlowTextureProperties *glowProperty; /* Since we have a new glow texture, we have to rebind * it and recalculate it */ glowType = optionGetGlowType (); glowProperty = &mGlowTextureProperties[glowType]; mGlowTexture = GLTexture::imageDataToTexture ( glowProperty->textureData, CompSize (glowProperty->textureSize, glowProperty->textureSize), GL_RGBA, GL_UNSIGNED_BYTE); if (optionGetGlow () && !mGroups.empty ()) { foreach (CompWindow *w, screen->windows ()) { GLTexture::Matrix tMat = mGlowTexture.at (0)->matrix (); GroupWindow::get (w)->computeGlowQuads (&tMat); } cScreen->damageScreen (); } break; } case GroupOptions::MoveAll: case GroupOptions::ResizeAll: case GroupOptions::MinimizeAll: case GroupOptions::ShadeAll: case GroupOptions::MaximizeUnmaximizeAll: case GroupOptions::RaiseAll: foreach (GroupSelection *group, mGroups) foreach (CompWindow *w, group->mWindows) GroupWindow::get (w)->checkFunctions (); break; default: break; } } /* * GroupScreen::applyInitialActions * * timer callback for stuff that needs to be called after all * screens and windows are initialized * */ bool GroupScreen::applyInitialActions () { CompWindowList::reverse_iterator rit = screen->windows ().rbegin (); /* we need to do it from top to buttom of the stack to avoid problems with a reload of Compiz and tabbed static groups. (topTab will always be above the other windows in the group) */ while (rit != screen->windows ().rend ()) { CompWindow *w = *rit; GROUP_WINDOW (w); /* Otherwise, add this window to a group on it's own if we are * auto-tabbing */ if (optionGetAutotabCreate () && gw->isGroupWindow ()) { if (!gw->mGroup && (gw->mWindowState == GroupWindow::WindowNormal)) { GroupSelection *g; mTmpSel.clear (); mTmpSel.select (w); g = mTmpSel.toGroup (); if (g) g->tabGroup (w); } } ++rit; } return false; } /* * GroupScreen::checkFunctions * * Checks to enable and disable interfaced functions in GroupScreen * if we do or don't need them. Keeping them enabled costs CPU usage * so do this only when needed * */ #define HANDLE_EVENT (1 << 0) #define GL_PAINT_OUTPUT (1 << 1) #define GL_PAINT_TRANSFORMED_OUTPUT (1 << 2) #define PREPARE_PAINT (1 << 3) #define DONE_PAINT (1 << 4) void GroupScreen::checkFunctions () { unsigned long functionsMask = 0; /* We need to enable our output paint hook if we are * -> Painting a selection rect * -> Painting a dragged tab * -> We have some groups AND * -> There is a "stretched window" OR * -> We are doing the tab change animation OR * -> We are doing the tabbing/untabbing animation OR * -> We are painting the tab bar * (Since we need to enable the * PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK which * allows for matrix transformation of windows) */ if (mGrabState == GroupScreen::ScreenGrabSelect || mGrabState == GroupScreen::ScreenGrabTabDrag) functionsMask |= (GL_PAINT_OUTPUT | GL_PAINT_TRANSFORMED_OUTPUT); else if (!mGroups.empty ()) { foreach (GroupSelection *group, mGroups) { if ((group->mTabbingState != GroupSelection::NoTabbing) || (group->mTabBar && (group->mTabBar->mChangeState == GroupTabBar::NoTabChange || group->mTabBar->mState != PaintOff)) || group->mResizeInfo) { functionsMask |= (GL_PAINT_OUTPUT | GL_PAINT_TRANSFORMED_OUTPUT); break; } } } /* We need to enable preparePaint if: * -> There is an animation going on * -> There is a tab bar with slots visible and a dragged slot * (since this creates forces on the other slots) * * enabling preparePaint implicitly enabled donePaint * */ foreach (GroupSelection *group, mGroups) { if ((group->mTabbingState != GroupSelection::NoTabbing) || (group->mTabBar && (group->mTabBar->mChangeState != GroupTabBar::NoTabChange || (group->mTabBar->mState == PaintFadeIn || group->mTabBar->mState == PaintFadeOut) || (group->mTabBar->mTextLayer && (group->mTabBar->mTextLayer->mState == PaintFadeIn || group->mTabBar->mTextLayer->mState == PaintFadeOut)) || (group->mTabBar->mBgLayer && group->mTabBar->mBgLayer->mBgAnimation) || (group->mTabBar->mSlots.size () && mDraggedSlot)))) { functionsMask |= (PREPARE_PAINT | DONE_PAINT); break; } } cScreen->preparePaintSetEnabled (this, functionsMask & PREPARE_PAINT); cScreen->donePaintSetEnabled (this, functionsMask & DONE_PAINT); gScreen->glPaintOutputSetEnabled (this, functionsMask & GL_PAINT_OUTPUT); gScreen->glPaintTransformedOutputSetEnabled (this, functionsMask & GL_PAINT_TRANSFORMED_OUTPUT); } /* * GroupScreen::GroupScreen * * Constructor for GroupScreen. Set up atoms, glow texture, queues, etc * */ GroupScreen::GroupScreen (CompScreen *s) : PluginClassHandler (s), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mIgnoreMode (false), mGlowTextureProperties ((GlowTextureProperties *) glowTextureProperties), mLastRestackedGroup (NULL), mResizeNotifyAtom (XInternAtom (screen->dpy (), "_COMPIZ_RESIZE_NOTIFY", 0)), mPendingMoves (NULL), mPendingGrabs (NULL), mPendingUngrabs (NULL), mQueued (false), mGrabState (ScreenGrabNone), mGrabIndex (0), mLastHoveredGroup (NULL), mDraggedSlot (NULL), mDragged (false), mPrevX (0), mPrevY (0), mLastGrabbedWindow (None) { ScreenInterface::setHandler (screen); GLScreenInterface::setHandler (gScreen, false); CompositeScreenInterface::setHandler (cScreen); int glowType = optionGetGlowType (); boost::function oSetCb = boost::bind (&GroupScreen::optionChanged, this, _1, _2); /* one-shot timeout for stuff that needs to be initialized after all screens and windows are initialized */ mInitialActionsTimeoutHandle.start (boost::bind ( &GroupScreen::applyInitialActions, this), 0, 0); mDequeueTimeoutHandle.setCallback (boost::bind ( &GroupScreen::dequeueTimer, this)); mDequeueTimeoutHandle.setTimes (0, 0); /* Bind the glow texture now */ mGlowTexture = GLTexture::imageDataToTexture (mGlowTextureProperties[glowType].textureData, CompSize (mGlowTextureProperties[glowType].textureSize, mGlowTextureProperties[glowType].textureSize), GL_RGBA, GL_UNSIGNED_BYTE); /* Set option callback code */ optionSetTabHighlightColorNotify (oSetCb); optionSetTabBaseColorNotify (oSetCb); optionSetTabBorderColorNotify (oSetCb); optionSetTabbarFontSizeNotify (oSetCb); optionSetTabbarFontColorNotify (oSetCb); optionSetGlowNotify (oSetCb); optionSetGlowTypeNotify (oSetCb); optionSetGlowSizeNotify (oSetCb); optionSetTabStyleNotify (oSetCb); optionSetThumbSizeNotify (oSetCb); optionSetThumbSpaceNotify (oSetCb); optionSetBorderWidthNotify (oSetCb); optionSetBorderRadiusNotify (oSetCb); optionSetSelectButtonInitiate (boost::bind (&GroupScreen::select, this, _1, _2, _3)); optionSetSelectButtonTerminate (boost::bind (&GroupScreen::selectTerminate, this, _1, _2, _3)); optionSetSelectSingleKeyInitiate (boost::bind (&GroupScreen::selectSingle, this, _1, _2, _3)); optionSetGroupKeyInitiate (boost::bind (&GroupScreen::groupWindows, this, _1, _2, _3)); optionSetUngroupKeyInitiate (boost::bind (&GroupScreen::ungroupWindows, this, _1, _2, _3)); optionSetTabmodeKeyInitiate (boost::bind (&GroupScreen::initTab, this, _1, _2, _3)); optionSetChangeTabLeftKeyInitiate (boost::bind (&GroupScreen::changeTabLeft, this, _1, _2, _3)); optionSetChangeTabRightKeyInitiate (boost::bind (&GroupScreen::changeTabRight, this, _1, _2, _3)); optionSetRemoveKeyInitiate (boost::bind (&GroupScreen::removeWindow, this, _1, _2, _3)); optionSetCloseKeyInitiate (boost::bind (&GroupScreen::closeWindows, this, _1, _2, _3)); optionSetIgnoreKeyInitiate (boost::bind (&GroupScreen::setIgnore, this, _1, _2, _3)); optionSetIgnoreKeyTerminate (boost::bind (&GroupScreen::unsetIgnore, this, _1, _2, _3)); optionSetChangeColorKeyInitiate (boost::bind (&GroupScreen::changeColor, this, _1, _2, _3)); } /* * GroupScreen::~GroupScreen * * Screen properties tear-down, delete all the groups, destroy IPWs * etc * */ GroupScreen::~GroupScreen () { if (mGroups.size ()) { GroupSelection *group; GroupSelection::List::reverse_iterator rit = mGroups.rbegin (); while (rit != mGroups.rend ()) { group = *rit; group->mWindows.clear (); group->mWindowIds.clear (); if (group->mTabBar) { std::list ::reverse_iterator rit = group->mTabBar->mSlots.rbegin (); /* We need to delete the slots first since otherwise * the tab bar will automatically try to change to * the next slot after the one that was deleted, but * it can't since we have already deleted all of our * window structures */ while (rit != group->mTabBar->mSlots.rend ()) { GroupTabBarSlot *slot = *rit; delete slot; --rit; } group->mTabBar->mSlots.clear (); delete group->mTabBar; } delete group; ++rit; } } mTmpSel.clear (); if (mGrabIndex) grabScreen (ScreenGrabNone); if (mDragHoverTimeoutHandle.active ()) mDragHoverTimeoutHandle.stop (); if (mShowDelayTimeoutHandle.active ()) mShowDelayTimeoutHandle.stop (); if (mDequeueTimeoutHandle.active ()) mDequeueTimeoutHandle.stop (); if (mInitialActionsTimeoutHandle.active ()) mInitialActionsTimeoutHandle.stop (); } /* * GroupWindow::checkFunctions * * Function to check if we need to enable any of our wrapped * functions. * */ #define GL_PAINT (1 << 0) #define GL_DRAW (1 << 1) #define DAMAGE_RECT (1 << 2) #define GET_OUTPUT_EXTENTS (1 << 3) #define MOVE_NOTIFY (1 << 4) #define RESIZE_NOTIFY (1 << 5) #define GRAB_NOTIFY (1 << 6) #define WINDOW_NOTIFY (1 << 7) #define STATECHANGE_NOTIFY (1 << 8) #define ACTIVATE_NOTIFY (1 << 9) void GroupWindow::checkFunctions () { unsigned long functionsMask = 0; GROUP_SCREEN (screen); /* For glPaint, the window must either be: * -> In an animation (eg rotating, tabbing, etc) * -> Having its tab bar shown * -> "Selected" (but not yet grouped) * -> Being Stretched * -> Have a hide info struct (since we need to hide the window) */ if (checkRotating () || checkTabbing () || checkShowTabBar () || !mResizeGeometry.isEmpty () || mWindowHideInfo || mInSelection) functionsMask |= GL_PAINT; /* For glDraw, the window must be: * -> Window must be in a group * -> Window must have glow quads */ if (mGroup && (mGroup->mWindows.size () > 1) && mGlowQuads) functionsMask |= (GL_DRAW | GET_OUTPUT_EXTENTS); /* For damageRect, the window must be: * -> Non empty resize rectangle (we need to update the resize * rect region of this window) * -> Have a slot (we need to damage the slot area) * Strictly speaking, we also use damageRect to check for initial * damages (for when a window was first painted on screen), but * since we don't start checking functions until after that happens * we dont need to worry about this case here) */ if (mSlot || !mResizeGeometry.isEmpty ()) functionsMask |= DAMAGE_RECT; /* For the various notification functions, the window * needs to be in a group, but we should disable them * if the options say we don't need to handle that particular * funciton */ if (mGroup) { /* Even if we are not resizing all windows we still need * to recalc the tab bar position anyways, so do that */ if (gs->optionGetResizeAll () || (mGroup->mTabBar && IS_TOP_TAB (window, mGroup))) functionsMask |= RESIZE_NOTIFY; if (mGlowQuads || gs->optionGetMoveAll () || (mGroup->mTabBar && IS_TOP_TAB (window, mGroup))) functionsMask |= MOVE_NOTIFY; if (gs->optionGetMaximizeUnmaximizeAll ()) functionsMask |= STATECHANGE_NOTIFY; if (gs->optionGetRaiseAll ()) functionsMask |= ACTIVATE_NOTIFY; functionsMask |= WINDOW_NOTIFY; } gWindow->glPaintSetEnabled (this, functionsMask & GL_PAINT); gWindow->glDrawSetEnabled (this, functionsMask & GL_DRAW); cWindow->damageRectSetEnabled (this, functionsMask & DAMAGE_RECT); window->getOutputExtentsSetEnabled (this, functionsMask & GET_OUTPUT_EXTENTS); window->resizeNotifySetEnabled (this, functionsMask & RESIZE_NOTIFY); window->moveNotifySetEnabled (this, functionsMask & MOVE_NOTIFY); window->stateChangeNotifySetEnabled (this, functionsMask & STATECHANGE_NOTIFY); window->activateSetEnabled (this, functionsMask & ACTIVATE_NOTIFY); window->windowNotifySetEnabled (this, functionsMask & WINDOW_NOTIFY); } /* * GroupWindow::GroupWindow * * Constructor for GroupWindow, set up the hide info, animation state * resize geometry, glow quads etc * */ GroupWindow::GroupWindow (CompWindow *w) : PluginClassHandler (w), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), mGroup (NULL), mInSelection (false), mSlot (NULL), mNeedsPosSync (false), mGlowQuads (NULL), mWindowHideInfo (NULL), mResizeGeometry (CompRect (0, 0, 0, 0)), mAnimateState (0), mTx (0.0f), mTy (0.0f), mXVelocity (0.0f), mYVelocity (0.0f) { GLTexture::Matrix mat; GROUP_SCREEN (screen); mat = gs->mGlowTexture.front ()->matrix (); WindowInterface::setHandler (window, false); CompositeWindowInterface::setHandler (cWindow, true); GLWindowInterface::setHandler (gWindow, false); window->grabNotifySetEnabled (this, true); window->ungrabNotifySetEnabled (this, true); mOrgPos = CompPoint (0, 0); mMainTabOffset = CompPoint (0, 0); mDestination = CompPoint (0, 0); if (w->minimized ()) mWindowState = WindowMinimized; else if (w->shaded ()) mWindowState = WindowShaded; else mWindowState = WindowNormal; computeGlowQuads (&mat); } /* * GroupWindow::~GroupWindow * * Tear down for when we don't need group data on a window anymore * */ GroupWindow::~GroupWindow () { if (mWindowHideInfo) setWindowVisibility (true); if (mGlowQuads) delete[] mGlowQuads; } bool GroupPluginVTable::init () { if (CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) gTextAvailable = true; else gTextAvailable = false; if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("mousepoll", COMPIZ_MOUSEPOLL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/group/src/tabbar.h0000644000015301777760000001220712321343002022504 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * tabbar.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef GROUP_TABBAR_H #define GROUP_TABBAR_H #include "group.h" /* Mask values for groupTabSetVisibility */ #define SHOW_BAR_INSTANTLY_MASK (1 << 0) #define PERMANENT (1 << 1) /* Mask values for tabbing animation */ #define IS_ANIMATED (1 << 0) #define FINISHED_ANIMATION (1 << 1) #define CONSTRAINED_X (1 << 2) #define CONSTRAINED_Y (1 << 3) #define DONT_CONSTRAIN (1 << 4) #define IS_UNGROUPING (1 << 5) class GroupTabBar; /* * GroupTabBarSlot */ class GroupTabBarSlot : public GLLayer { public: class List : public std::list , public GLLayer { public: List (const CompSize &size, GroupSelection *g) : GLLayer::GLLayer (size, g) {}; void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, const CompRegion &clipRegion, int mask); }; public: virtual ~GroupTabBarSlot (); void getDrawOffset (int &hoffset, int &voffset); void setTargetOpacity (int); void paint (const GLWindowPaintAttrib &sa, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask); public: GroupTabBarSlot *mPrev; GroupTabBarSlot *mNext; CompRegion mRegion; CompWindow *mWindow; GroupTabBar *mTabBar; /* For DnD animations */ int mSpringX; int mSpeed; float mMsSinceLastMove; int mOpacity; private: GroupTabBarSlot (CompWindow *, GroupTabBar *); friend class GroupTabBar; }; /* * GroupTabBar */ class GroupTabBar { public: typedef enum { NoTabChange = 0, TabChangeOldOut, TabChangeNewIn } TabChangeState; /* * Rotation direction for change tab animation */ typedef enum { RotateUncertain = 0, RotateLeft, RotateRight } ChangeAnimationDirection; public: GroupTabBar (GroupSelection *, CompWindow *); ~GroupTabBar (); public: /* Input Prevention */ void createInputPreventionWindow (); void destroyInputPreventionWindow (); /* Drawing */ void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, CompRegion clipRegion); void damageRegion (); /* Animation */ bool handleTabBarFade (int msSinceLastPaint); bool handleTextFade (int msSinceLastPaint); /* Region and position management */ void moveTabBarRegion (int dx, int dy, bool syncIPW); void resizeTabBarRegion (CompRect &box, bool syncIPW); void recalcTabBarPos (int middleX, int minX1, int maxX2); /* Slot management */ void insertTabBarSlotBefore (GroupTabBarSlot *slot, GroupTabBarSlot *nextSlot); void insertTabBarSlotAfter (GroupTabBarSlot *slot, GroupTabBarSlot *prevSlot); void insertTabBarSlot (GroupTabBarSlot *slot); void unhookTabBarSlot (GroupTabBarSlot *slot, bool temporary); void deleteTabBarSlot (GroupTabBarSlot *slot); void createSlot (CompWindow *w); bool applyForces (GroupTabBarSlot *); void applySpeeds (int msSinceLastRepaint); public: GroupTabBarSlot::List mSlots; GroupSelection *mGroup; GroupTabBarSlot* mTopTab; GroupTabBarSlot* mPrevTopTab; /* needed for untabbing animation */ CompWindow *mLastTopTab; /* Those two are only for the change-tab animation, when the tab was changed again during animation. Another animation should be started again, switching for this window. */ GroupTabBar::ChangeAnimationDirection mNextDirection; GroupTabBarSlot *mNextTopTab; /* check focus stealing prevention after changing tabs */ bool mCheckFocusAfterTabChange; int mChangeAnimationTime; int mChangeAnimationDirection; GroupTabBar::TabChangeState mChangeState; GroupTabBarSlot *mHoveredSlot; GroupTabBarSlot *mTextSlot; TextLayer *mTextLayer; BackgroundLayer *mBgLayer; SelectionLayer *mSelectionLayer; PaintState mState; int mAnimationTime; CompRegion mRegion; int mOldWidth; CompTimer mTimeoutHandle; /* For DnD animations */ int mLeftSpringX, mRightSpringX; int mLeftSpeed, mRightSpeed; float mLeftMsSinceLastMove, mRightMsSinceLastMove; Window mInputPrevention; bool mIpwMapped; }; #endif compiz-0.9.11+14.04.20140409/plugins/group/src/tab.cpp0000644000015301777760000024700712321343002022362 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * tab.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" /* * getCurrentMousePosition * * Description: * Return the current function of the pointer at the given screen. * The position is queried trough XQueryPointer directly from the xserver. * * TODO: Depricate this function and use mousepoll directly * */ bool GroupScreen::getCurrentMousePosition (int &x, int &y) { MousePoller poller; CompPoint pos = poller.getCurrentPosition (); x = pos.x (); y = pos.y (); return (x != 0 && y != 0); } /* * GroupWindow::getClippingRegion * * Description: * This function returns a clipping region which is used to clip * several events involving window stack such as hover detection * in the tab bar or Drag'n'Drop. It creates the clipping region * with getting the region of every window above the given window * and then adds this region to the clipping region using * CompRegion::united (). w->region won't work since it doesn't include * the window decoration. * */ CompRegion GroupWindow::getClippingRegion () { CompWindow *cw; CompRegion clip; for (cw = window->next; cw; cw = cw->next) { /* Ignore small invidible windows or hidden ones in our clipping * region */ if (!cw->invisible () && !(cw->state () & CompWindowStateHiddenMask)) { CompRect rect; CompRegion buf; rect = CompRect (WIN_REAL_X (cw), WIN_REAL_Y (cw), WIN_REAL_WIDTH (cw), WIN_REAL_HEIGHT (cw)); buf = buf.united (rect); clip = buf.united (clip); } } return clip; } /* * GroupWindow::clearWindowInputShape * * We are not painting this window, so we don't want to interact with * it using X11. We can use XShape to read the input shape rects and * save the. We then combine the shape rects with NULL, so that the * window has no input shape (so it cannot recieve input, all clicks * fall through). * */ void GroupWindow::clearWindowInputShape (GroupWindow::HideInfo *hideInfo) { XRectangle *rects; int count = 0, ordering; /* Get the shape rects */ rects = XShapeGetRectangles (screen->dpy (), window->id (), ShapeInput, &count, &ordering); if (count == 0) return; /* check if the returned shape exactly matches the window shape - * if that is true, the window currently has no set input shape * (so the shape will be the default rectangular shape) */ if ((count == 1) && (rects[0].x == -window->serverGeometry ().border ()) && (rects[0].y == -window->serverGeometry ().border ()) && (rects[0].width == (window->serverWidth () + window->serverGeometry ().border ())) && (rects[0].height == (window->serverHeight () + window->serverGeometry ().border ()))) { count = 0; } /* if this window already has saved input rects in the plugin, get * rid of them. now */ if (hideInfo->mInputRects) XFree (hideInfo->mInputRects); /* Save input shape */ hideInfo->mInputRects = rects; hideInfo->mNInputRects = count; hideInfo->mInputRectOrdering = ordering; /* Don't get XShape events (we are currently registered for them, * if we get them then we will recursively clear the input shape */ XShapeSelectInput (screen->dpy (), hideInfo->mShapeWindow, NoEventMask); /* In ShapeInput, combine NULL with the input shape */ XShapeCombineRectangles (screen->dpy (), hideInfo->mShapeWindow, ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); /* Get XShape events again */ XShapeSelectInput (screen->dpy (), hideInfo->mShapeWindow, ShapeNotify); } /* * GroupWindow::setWindowVisibility * * Set the window to be painted or not (visible) and clear and restore * the input shape as necessary. Set the window to skip the taskbar * and pager as necessary. * */ void GroupWindow::setWindowVisibility (bool visible) { if (!visible && !mWindowHideInfo) { GroupWindow::HideInfo *info; /* Allocate a hide info structure */ mWindowHideInfo = info = new GroupWindow::HideInfo; if (!mWindowHideInfo) return; /* ensure the input rects are NULL and get the shape mask */ info->mInputRects = NULL; info->mNInputRects = 0; info->mShapeMask = XShapeInputSelected (screen->dpy (), window->id ()); /* We are a reparenting window manager now, * which means that we either shape the frame window, * or if it does not exist, shape the window */ if (window->frame ()) { info->mShapeWindow = window->frame (); } else info->mShapeWindow = window->id (); clearWindowInputShape (info); /* Do not allow the window to be displated on the taskbar or * pager */ info->mSkipState = window->state () & (CompWindowStateSkipPagerMask | CompWindowStateSkipTaskbarMask); window->changeState (window->state () | CompWindowStateSkipPagerMask | CompWindowStateSkipTaskbarMask); } else if (visible && mWindowHideInfo) { GroupWindow::HideInfo *info = mWindowHideInfo; /* If there are saved input rects, restore them */ if (info->mNInputRects) { XShapeCombineRectangles (screen->dpy (), info->mShapeWindow, ShapeInput, 0, 0, info->mInputRects, info->mNInputRects, ShapeSet, info->mInputRectOrdering); } /* Otherwise combine with a null mask (automatically restores * single rect input shape) */ else { XShapeCombineMask (screen->dpy (), info->mShapeWindow, ShapeInput, 0, 0, None, ShapeSet); } if (info->mInputRects) XFree (info->mInputRects); /* Recieve shape events again */ XShapeSelectInput (screen->dpy (), info->mShapeWindow, info->mShapeMask); /* Put the window back on the taskbar and pager */ window->changeState ((window->state () & ~(CompWindowStateSkipPagerMask | CompWindowStateSkipTaskbarMask)) | info->mSkipState); delete info; mWindowHideInfo = NULL; } } /* * GroupSelection::tabBarTimeout * * Description: * This function is called when the time expired (== timeout). * We use this to realize a delay with the bar hiding after tab change. * handleAnimation sets up a timer after the animation has finished. * This function itself basically just sets the tab bar to a PaintOff status * through calling groupSetTabBarVisibility. * The PERMANENT mask allows you to force hiding even of * PaintPermanentOn tab bars. * */ bool GroupSelection::tabBarTimeout () { tabSetVisibility (false, PERMANENT); return false; /* This will free the timer. */ } /* * GroupSelection::showDelayTimeout * * Show the tab bar at the mouse position after a timeout * */ bool GroupSelection::showDelayTimeout () { int mouseX, mouseY; CompWindow *topTab; GROUP_SCREEN (screen); /* If this isn't the top window of the group, then don't bother * to show the tab bar (it really shouldn't be shown in this case * but it could be a corner case where the window shape is restored * and we hover over it */ if (!HAS_TOP_WIN (this)) { gs->mShowDelayTimeoutHandle.stop (); return false; /* This will free the timer. */ } topTab = TOP_TAB (this); GROUP_WINDOW (topTab); gs->getCurrentMousePosition (mouseX, mouseY); /* Recalc tab bar pos based on mouse pos */ mTabBar->recalcTabBarPos (mouseX, WIN_REAL_X (topTab), WIN_REAL_X (topTab) + WIN_REAL_WIDTH (topTab)); tabSetVisibility (true, 0); gw->checkFunctions (); gs->checkFunctions (); gs->mShowDelayTimeoutHandle.stop (); return false; /* This will free the timer. */ } /* * GroupSelection::tabSetVisibility * * Description: * This function is used to set the visibility of the tab bar. * The "visibility" is indicated through the PaintState, which * can be PaintOn, PaintOff, PaintFadeIn, PaintFadeOut * and PaintPermantOn. * Currently the mask paramater is mostely used for the PERMANENT mask. * This mask affects how the visible parameter is handled, for example if * visibule is set to true and the mask to PERMANENT state it will set * PaintPermanentOn state for the tab bar. When visibile is false, mask 0 * and the current state of the tab bar is PaintPermanentOn it won't do * anything because its not strong enough to disable a * Permanent-State, for those you need the mask. * * Determine the cases where we want to show the tab bar. Set up the * render and the animation. * */ void GroupSelection::tabSetVisibility (bool visible, unsigned int mask) { GroupTabBar *bar; CompWindow *topTab; PaintState oldState; GROUP_SCREEN (screen); /* Don't bother if this isn't the top window or there is no tab bar */ if (!mWindows.size () || !mTabBar || !HAS_TOP_WIN (this)) return; bar = mTabBar; topTab = TOP_TAB (this); oldState = bar->mState; /* Start polling the mouse inside the tab bar */ if (visible) mPoller.start (); else mPoller.stop (); /* hide tab bars for invisible top windows */ if ((topTab->state () & CompWindowStateHiddenMask) || topTab->invisible ()) { bar->mState = PaintOff; gs->switchTopTabInput (this, true); } /* Make the tab bar painted permanently in the case that we specify * a permanent mask */ else if (visible && bar->mState != PaintPermanentOn && (mask & PERMANENT)) { bar->mState = PaintPermanentOn; gs->switchTopTabInput (this, false); } /* If there is no longer an need to paint permanently, then just * paint this normally */ else if (visible && bar->mState == PaintPermanentOn && !(mask & PERMANENT)) { bar->mState = PaintOn; } /* If we're visible and need to fade in or out, re-render the tab * bar animations */ else if (visible && (bar->mState == PaintOff || bar->mState == PaintFadeOut)) { /* Set up the tab bar animations */ if (gs->optionGetBarAnimations () && bar->mBgLayer) { bar->mBgLayer->mBgAnimation = BackgroundLayer::AnimationReflex; bar->mBgLayer->mBgAnimationTime = gs->optionGetReflexTime () * 1000.0; } bar->mState = PaintFadeIn; gs->switchTopTabInput (this, false); } /* Otherwise if we're not visible, and haven't used the PERMANENT * strength mask for permenancy, then fade out */ else if (!visible && (bar->mState != PaintPermanentOn || (mask & PERMANENT)) && (bar->mState == PaintOn || bar->mState == PaintPermanentOn || bar->mState == PaintFadeIn)) { bar->mState = PaintFadeOut; gs->switchTopTabInput (this, true); } /* If we're fading in or out set up the animation and damage */ if (bar->mState == PaintFadeIn || bar->mState == PaintFadeOut) bar->mAnimationTime = (gs->optionGetFadeTime () * 1000) - bar->mAnimationTime; if (bar->mState != oldState) bar->damageRegion (); } /* * GroupTabBarSlot::getDrawOffset () * * Description: * Its used when the draggedSlot is dragged to another viewport. * It calculates a correct offset to the real slot position. * */ void GroupTabBarSlot::getDrawOffset (int &hoffset, int &voffset) { CompWindow *w, *topTab; int x, y, vx, vy; CompPoint vp; CompWindow::Geometry winGeometry; if (!mWindow) return; w = mWindow; GROUP_WINDOW (w); GROUP_SCREEN (screen); /* If this isn't the dragged slot, don't bother */ if (this != gs->mDraggedSlot || !gw->mGroup) { hoffset = 0; voffset = 0; return; } /* Figure out the top tab */ if (HAS_TOP_WIN (gw->mGroup)) topTab = TOP_TAB (gw->mGroup); else if (HAS_PREV_TOP_WIN (gw->mGroup)) topTab = PREV_TOP_TAB (gw->mGroup); else { hoffset = 0; voffset = 0; return; } x = WIN_CENTER_X (topTab) - WIN_WIDTH (w) / 2; y = WIN_CENTER_Y (topTab) - WIN_HEIGHT (w) / 2; /* Determine the viewport offset */ winGeometry = CompWindow::Geometry (x, y, w->serverWidth (), w->serverHeight (), w->serverGeometry ().border ()); screen->viewportForGeometry (winGeometry, vp); vx = vp.x (); vy = vp.y (); /* the offset is the distance from the left edge of the initial viewport */ hoffset = ((screen->vp ().x () - vx) % screen->vpSize ().width ()) * screen->width (); voffset = ((screen->vp ().y () - vy) % screen->vpSize ().height ()) * screen->height (); } /* * GroupSelection::handleHoverDetection * * Description: * This function is called on the mousepoll update to handle whether a * new tab has been hovered on the bar (and then it updates the text * accordingly) */ void GroupSelection::handleHoverDetection (const CompPoint &p) { GroupTabBar *bar = mTabBar; CompWindow *topTab = TOP_TAB (this); bool inLastSlot; GROUP_SCREEN (screen); if ((bar->mState != PaintOff) && !HAS_TOP_WIN (this)) return; /* then check if the mouse is in the last hovered slot -- this saves a lot of CPU usage */ inLastSlot = bar->mHoveredSlot && bar->mHoveredSlot->mRegion.contains (p); if (!inLastSlot) { CompRegion clip; GroupTabBarSlot *slot; bar->mHoveredSlot = NULL; clip = GroupWindow::get (topTab)->getClippingRegion (); foreach (slot, bar->mSlots) { /* We need to clip the slot region with the clip region first. This is needed to respect the window stack, so if a window covers a port of that slot, this part won't be used for in-slot-detection. */ CompRegion reg = slot->mRegion.subtracted (clip); if (reg.contains (p)) { bar->mHoveredSlot = slot; break; } } if (bar->mTextLayer) { /* trigger a FadeOut of the text */ if ((bar->mHoveredSlot != bar->mTextSlot) && (bar->mTextLayer->mState == PaintFadeIn || bar->mTextLayer->mState == PaintOn)) { bar->mTextLayer->mAnimationTime = (gs->optionGetFadeTextTime () * 1000) - bar->mTextLayer->mAnimationTime; bar->mTextLayer->mState = PaintFadeOut; } /* or trigger a FadeIn of the text */ else if ((bar->mTextLayer->mState == PaintFadeOut || bar->mTextLayer->mState == PaintOff) && bar->mHoveredSlot == bar->mTextSlot && bar->mHoveredSlot) { bar->mTextLayer->mAnimationTime = (gs->optionGetFadeTextTime () * 1000) - bar->mTextLayer->mAnimationTime; bar->mTextLayer->mState = PaintFadeIn; } bar->damageRegion (); GroupWindow::get (topTab)->checkFunctions (); } gs->checkFunctions (); } return; } /* * GroupTabBar::handleTabBarFade * * Description: * This function is called from preparePaint * to handle the tab bar fade. It checks the animationTime and updates it, * so we can calculate the alpha of the tab bar in the painting code with it. * * Returns true if there is animation still remaining * */ bool GroupTabBar::handleTabBarFade (int msSinceLastPaint) { mAnimationTime -= msSinceLastPaint; if (mAnimationTime > 0) return true; else mAnimationTime = 0; /* Fade finished */ if (mAnimationTime == 0) { if (mState == PaintFadeIn) { mState = PaintOn; } else if (mState == PaintFadeOut) { mState = PaintOff; if (mTextLayer) { /* Tab-bar is no longer painted, clean up text animation variables. */ mTextLayer->mAnimationTime = 0; mTextLayer->mState = PaintOff; mTextSlot = mHoveredSlot = NULL; mTextLayer = TextLayer::rebuild (mTextLayer); if (mTextLayer) mTextLayer->render (); } } } return false; } /* * GroupTabBar::handleTextFade * * Description: * This function is called from groupPreparePaintScreen * to handle the text fade. It checks the animationTime and updates it, * so we can calculate the alpha of the text in the painting code with it. * * Returns true if there is still animation remaining * */ bool GroupTabBar::handleTextFade (int msSinceLastPaint) { TextLayer *textLayer = mTextLayer; bool continuePainting = false; /* Fade in progress... */ if ((textLayer->mState == PaintFadeIn || textLayer->mState == PaintFadeOut) && textLayer->mAnimationTime > 0) { textLayer->mAnimationTime -= msSinceLastPaint; if (textLayer->mAnimationTime < 0) textLayer->mAnimationTime = 0; /* Fade has finished. */ if (textLayer->mAnimationTime == 0) { if (textLayer->mState == PaintFadeIn) textLayer->mState = PaintOn; else if (textLayer->mState == PaintFadeOut) textLayer->mState = PaintOff; } else continuePainting = true; } if (textLayer->mState == PaintOff && mHoveredSlot && mHoveredSlot != mTextSlot) { /* Start text animation for the new hovered slot. */ mTextSlot = mHoveredSlot; textLayer->mState = PaintFadeIn; textLayer->mAnimationTime = (GroupScreen::get (screen)->optionGetFadeTextTime () * 1000); mTextLayer = textLayer = TextLayer::rebuild (textLayer); if (textLayer) mTextLayer->render (); continuePainting = true; } else if (textLayer->mState == PaintOff && mTextSlot) { /* Clean Up. */ mTextSlot = NULL; mTextLayer = textLayer = TextLayer::rebuild (textLayer); if (textLayer) mTextLayer->render (); } return continuePainting; } /* * BackgroundLayer::handleAnimation * * Description: Handles the different animations for the tab bar defined in * BackgroundLayer::AnimationType. Basically that means this function updates * tabBar->animation->time as well as checking if the animation is already * finished. * * Returns true if more animation needed * */ bool BackgroundLayer::handleAnimation (int msSinceLastPaint) { mBgAnimationTime -= msSinceLastPaint; if (mBgAnimationTime <= 0) { mBgAnimationTime = 0; mBgAnimation = AnimationNone; render (); return false; } return true; } /* * tabChangeActivateEvent * * Description: Creates a compiz event to let other plugins know about * the starting and ending point of the tab changing animation */ void GroupScreen::tabChangeActivateEvent (bool activating) { CompOption::Vector o; CompOption opt ("root", CompOption::TypeInt); opt.value ().set ((int) screen->root ()); o.push_back (opt); CompOption opt2 ("active", CompOption::TypeBool); opt2.value ().set (activating); o.push_back (opt2); screen->handleCompizEvent ("group", "tabChangeActivate", o); } /* * GroupSelection::handleAnimation * * Description: * This function handles the change animation. It's called * from handleChanges. Don't let the changeState * confuse you, PaintFadeIn equals with the start of the * rotate animation and PaintFadeOut is the end of these * animation. * * This gets called when a window has finished rotating to 90 degrees to * the viewer (so it is just invisible). Handle setting up the tab * state and focussing the new windows and such. * */ bool GroupSelection::handleAnimation () { bool newAnim = false; GROUP_SCREEN (screen); /* This was an outgoing tab */ if (mTabBar->mChangeState == GroupTabBar::TabChangeOldOut) { CompWindow *top = TOP_TAB (this); bool activate; /* recalc here is needed (for y value)! */ mTabBar->recalcTabBarPos ( mTabBar->mRegion.boundingRect ().centerX (), WIN_REAL_X (top), WIN_REAL_X (top) + WIN_REAL_WIDTH (top)); /* Add time progress to the animation again. Don't * have a negative value */ mTabBar->mChangeAnimationTime += gs->optionGetChangeAnimationTime () * 500; if (mTabBar->mChangeAnimationTime <= 0) mTabBar->mChangeAnimationTime = 0; /* We need to put the new tab in */ mTabBar->mChangeState = GroupTabBar::TabChangeNewIn; /* Activate the new tab which just rotated in */ activate = !mTabBar->mCheckFocusAfterTabChange; if (!activate) { /* CompFocusResult focus; focus = allowWindowFocus (top, NO_FOCUS_MASK, s->x, s->y, 0); activate = focus == CompFocusAllowed; */ } /* Activate the top tab */ if (activate) top->activate (); mTabBar->mCheckFocusAfterTabChange = false; newAnim = true; } /* This was an incoming tab (animation reversed) */ if (mTabBar->mChangeState == GroupTabBar::TabChangeNewIn && mTabBar->mChangeAnimationTime <= 0) { int oldChangeAnimationTime = mTabBar->mChangeAnimationTime; gs->tabChangeActivateEvent (false); /* Set the previous top tab visibility to false since we can't * see it yet! */ if (mTabBar->mPrevTopTab) GroupWindow::get (PREV_TOP_TAB (this))->setWindowVisibility (false); /* Now the new previous top tab is the current one */ GroupWindow::get (PREV_TOP_TAB (this))->checkFunctions (); GroupWindow::get (TOP_TAB (this))->checkFunctions (); mTabBar->mPrevTopTab = mTabBar->mTopTab; mTabBar->mChangeState = GroupTabBar::NoTabChange; /* If we were heading towards a new top tab, then change * this next one to the new one we want to change to */ if (mTabBar->mNextTopTab) { GroupTabBarSlot *next = mTabBar->mNextTopTab; mTabBar->mNextTopTab = NULL; gs->changeTab (next, mTabBar->mNextDirection); if (mTabBar->mChangeState == GroupTabBar::TabChangeOldOut) { /* If a new animation was started. */ mTabBar->mChangeAnimationTime += oldChangeAnimationTime; } } /* Don't use a negative value */ if (mTabBar->mChangeAnimationTime <= 0) { mTabBar->mChangeAnimationTime = 0; } /* If we can't show the tab bar immediately, then show it now * and set the fade out timeout */ else if (gs->optionGetVisibilityTime () != 0.0f && mTabBar->mChangeState == GroupTabBar::NoTabChange) { tabSetVisibility (true, PERMANENT | SHOW_BAR_INSTANTLY_MASK); if (mTabBar->mTimeoutHandle.active ()) mTabBar->mTimeoutHandle.stop (); mTabBar->mTimeoutHandle.setTimes (gs->optionGetVisibilityTime () * 1000, gs->optionGetVisibilityTime () * 1200); mTabBar->mTimeoutHandle.setCallback ( boost::bind (&GroupSelection::tabBarTimeout, this)); mTabBar->mTimeoutHandle.start (); } newAnim = true; } gs->checkFunctions (); return newAnim; } /* * GroupWindow::adjustTabVelocity * * adjust velocity for each animation step (adapted from the scale plugin) */ int GroupWindow::adjustTabVelocity () { float dx, dy, adjust, amount; float x1, y1; x1 = mDestination.x (); y1 = mDestination.y (); /* dx is how much movement we currently have remaining * in this case finalPos - (orgPos + mTx) */ dx = x1 - (mOrgPos.x () + mTx); /* multiply this distance (gets smaller every time) * by 0.15 to get our adjust amount */ adjust = dx * 0.15f; /* get the absolute value of the distance * and multiply by 1.5 to get our velcoty adjust amount */ amount = fabs (dx) * 1.5f; /* Ensure that we are not too fast or slow */ if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; /* velocity is scaled down slightly and adjusted by 1/10th of the * distance remaining */ mXVelocity = (amount * mXVelocity + adjust) / (amount + 1.0f); /* dy is how much movement we currently have remaining * in this case finalPos - (orgPos + mTx) */ dy = y1 - (mOrgPos.y () + mTy); /* multiply this distance (gets smaller every time) * by 0.15 to get our adjust amount */ adjust = dy * 0.15f; /* get the absolute value of the distance * and multiply by 1.5 to get our velcoty adjust amount */ amount = fabs (dy) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; /* Ensure that we are not too fast or slow */ mYVelocity = (amount * mYVelocity + adjust) / (amount + 1.0f); /* If the distance is particularly short and we are travelling slowly, * then just round-down to zero and lock window in place */ if (fabs (dx) < 0.1f && fabs (mXVelocity) < 0.2f && fabs (dy) < 0.1f && fabs (mYVelocity) < 0.2f) { mXVelocity = mYVelocity = 0.0f; mTx = x1 - window->serverX (); mTy = y1 - window->serverY (); return 0; } return 1; } /* * GroupSelection::finishTabbing * * Cleans up the tab bar related things - called from * donePaint after the tabbing animation. In the case of * tabbing, then set appropriate window visibilities * and move windows to just behind the tab bar. Otherwise * if we are untabbing then we can get rid of the tab bar, and * if ungrouping, get rid of the whole group * */ void GroupSelection::finishTabbing () { GROUP_SCREEN (screen); /* Complete untabbing (but not ungrouping) * case, delete the tab bar */ if (mTabbingState == Untabbing && mUngroupState != UngroupSingle) { delete mTabBar; mTabBar = NULL; mTopId = None; } /* We are finished tabbing now */ mTabbingState = NoTabbing; gs->tabChangeActivateEvent (false); if (mTabBar) { /* tabbing case - hide all non-toptab windows */ GroupTabBarSlot *slot; foreach (slot, mTabBar->mSlots) { CompWindow *w = slot->mWindow; if (!w) continue; GROUP_WINDOW (w); /* Don't hide this window if we are ungrouping or if * this is the top tab */ if (slot == mTabBar->mTopTab || (gw->mAnimateState & IS_UNGROUPING)) continue; gw->setWindowVisibility (false); } /* The last top tab (for change animation purposes) is now * this current top tab */ mTabBar->mPrevTopTab = mTabBar->mTopTab; } /* Move all windows to their animation target position */ for (CompWindowList::iterator it = mWindows.begin (); it != mWindows.end (); ++it) { CompWindow *w = *it; GROUP_WINDOW (w); /* move window to target position */ gs->mQueued = true; w->move (gw->mDestination.x () - WIN_X (w), gw->mDestination.y () - WIN_Y (w), true); gs->mQueued = false; if (mUngroupState == UngroupSingle && (gw->mAnimateState & IS_UNGROUPING)) { /* Possibility of stack breakage here, stop here */ gw->removeWindowFromGroup (); it = mWindows.end (); } gw->mAnimateState = 0; gw->mTx = gw->mTy = gw->mXVelocity = gw->mYVelocity = 0.0f; gw->checkFunctions (); } gs->checkFunctions (); /* Kill the group if we just ungrouped the whole thing */ if (mUngroupState == UngroupAll) fini (); else mUngroupState = UngroupNone; } /* * GroupSelection::drawTabAnimation * * Description: * This function is called from GroupScreen::preparePaint, to move * all the animated windows, with the required animation step. * The function goes through all grouped animated windows, calculates * the required step using adjustTabVelocity, moves the window, * and then checks if the animation is finished for that window. * */ bool GroupSelection::drawTabAnimation (int msSinceLastPaint) { int steps; float amount, chunk; bool doTabbing; GROUP_SCREEN (screen); /* a higher amount here means that more steps are calculated in the velocity, * but also that the velocity is a higher scale up factor, so the animation * happens quicker */ amount = msSinceLastPaint * 0.05f * gs->optionGetTabbingSpeed (); /* more steps means that the velocity is recalculated more times, which increases the chance * for "overshoot" */ steps = amount / (0.5f * gs->optionGetTabbingTimestep ()); if (!steps) steps = 1; chunk = amount / (float)steps; /* Do this for each calculated animation step */ while (steps--) { doTabbing = false; foreach (CompWindow *cw, mWindows) { if (!cw) continue; GROUP_WINDOW (cw); if (!(gw->mAnimateState & IS_ANIMATED)) continue; /* adjustTabVelocity will adjust the speed of the window * movement. At the end of the animation it will return 0, * so that means that this window has finished animating */ if (!gw->adjustTabVelocity ()) { gw->mAnimateState |= FINISHED_ANIMATION; gw->mAnimateState &= ~IS_ANIMATED; } /* Move translation amount to the window */ gw->mTx += gw->mXVelocity * chunk; gw->mTy += gw->mYVelocity * chunk; /* Keep doing the tabbing animation if this window is * still animated */ doTabbing |= (gw->mAnimateState & IS_ANIMATED); } if (!doTabbing) { /* tabbing animation finished */ finishTabbing (); break; } } return doTabbing; } /* * GroupScreen::updateTabBars * * Description: * This function is responsible for showing / unshowing the tab-bars, * when the title-bars / tab-bars are hovered. * The function is called whenever a new window is entered, * checks if the entered window is a window frame (and if the title * bar part of that frame was hovered) or if it was the input * prevention window of a tab bar, and sets tab-bar visibility * according to that. * */ void GroupScreen::updateTabBars (Window enteredWin) { CompWindow *w = NULL; GroupSelection *hoveredGroup = NULL; /* do nothing if the screen is grabbed, as the frame might be drawn transformed */ if (!screen->otherGrabExist ("group", "group-drag", NULL)) { /* first check if the entered window is a frame */ foreach (w, screen->windows ()) { if (w->frame () == enteredWin) break; } } if (w) { /* is the window the entered frame belongs to inside a tabbed group? if no, it's not interesting for us */ GROUP_WINDOW (w); if (gw->mGroup && gw->mGroup->mTabBar) { int mouseX, mouseY; /* it is grouped and tabbed, so now we have to check if we hovered the title bar or the frame */ if (getCurrentMousePosition (mouseX, mouseY)) { CompRect rect; CompRegion reg; /* titlebar of the window */ rect = CompRect (WIN_X (w) - w->border ().left, WIN_Y (w) - w->border ().top, WIN_WIDTH (w) + w->border ().right, WIN_Y (w) - (WIN_Y (w) - w->border ().top)); reg = reg.united (rect); /* this is a hovered group if the mouse is inside the * titlebar region */ if (reg.contains (CompPoint (mouseX, mouseY))) { hoveredGroup = gw->mGroup; } } } } /* if we didn't hover a title bar, check if we hovered a tab bar (means: input prevention window) */ if (!hoveredGroup) { GroupSelection *group; foreach (group, mGroups) { if (group->mTabBar && group->mTabBar->mInputPrevention == enteredWin) { /* only accept it if the IPW is mapped */ if (group->mTabBar->mIpwMapped) { hoveredGroup = group; break; } } } } /* if we found a hovered tab bar different than the last one (or left a tab bar), hide the old one */ if (mLastHoveredGroup && (hoveredGroup != mLastHoveredGroup)) mLastHoveredGroup->tabSetVisibility (false, 0); /* if we entered a tab bar (or title bar), show the tab bar */ if (hoveredGroup && HAS_TOP_WIN (hoveredGroup) && !TOP_TAB (hoveredGroup)->grabbed ()) { GroupTabBar *bar = hoveredGroup->mTabBar; /* If the tab bar isn't painting or is fading out, set up * the show delay time and make the tab bar appear (don't * delay on fade out though) */ if (bar && ((bar->mState == PaintOff) || (bar->mState == PaintFadeOut))) { int showDelayTime = optionGetTabbarShowDelay () * 1000; /* Show the tab-bar after a delay, only if the tab-bar wasn't fading out. */ if (showDelayTime > 0 && (bar->mState == PaintOff)) { if (mShowDelayTimeoutHandle.active ()) mShowDelayTimeoutHandle.stop (); mShowDelayTimeoutHandle.setTimes (showDelayTime, showDelayTime * 1.2); mShowDelayTimeoutHandle.setCallback ( boost::bind (&GroupSelection::showDelayTimeout, hoveredGroup)); mShowDelayTimeoutHandle.start (); } else hoveredGroup->showDelayTimeout (); } } else checkFunctions (); mLastHoveredGroup = hoveredGroup; } /* * GroupScreen::getConstrainRegion * * Description: Get the region on screen where windows are allowed to * move to during the untabbing animation * */ CompRegion GroupScreen::getConstrainRegion () { CompRegion region; CompRect r; /* Get the region for each united output device. We cannot just * use screen->width () * screen->height () since that doesn't * account for weird multihead configs, where there are gaps * or different screen sizes and the like. */ for (unsigned int i = 0;i < screen->outputDevs ().size (); i++) region = CompRegion (screen->outputDevs ()[i]).united (region); foreach (CompWindow *w, screen->windows ()) { if (!w->mapNum ()) continue; /* Don't place windows underneath any panels */ if (w->struts ()) { r = CompRect (w->struts ()->top.x, w->struts ()->top.y, w->struts ()->top.width, w->struts ()->top.height); region = region.subtracted (r); r = CompRect (w->struts ()->bottom.x, w->struts ()->bottom.y, w->struts ()->bottom.width, w->struts ()->bottom.height); region = region.subtracted (r); r = CompRect (w->struts ()->left.x, w->struts ()->left.y, w->struts ()->left.width, w->struts ()->left.height); region = region.subtracted (r); r = CompRect (w->struts ()->right.x, w->struts ()->right.y, w->struts ()->right.width, w->struts ()->right.height); region = region.subtracted (r); } } return region; } /* * GroupWindow::constrainMovement * */ bool GroupWindow::constrainMovement (CompRegion constrainRegion, int dx, int dy, int &new_dx, int &new_dy) { int status, xStatus; int origDx = dx, origDy = dy; int x, y, width, height; CompWindow *w = window; if (!mGroup) return false; if (!dx && !dy) return false; x = mOrgPos.x () - w->border ().left + dx; y = mOrgPos.y ()- w->border ().top + dy; width = WIN_REAL_WIDTH (w); height = WIN_REAL_HEIGHT (w); /* Check if, with the movement, the constrainRegion does not * contain the window rect */ status = constrainRegion.contains (CompRect (x, y, width, height)); /* Adjust dx */ xStatus = status; while (dx && (xStatus != RectangleIn)) { /* check if, with dy taken out (so the rect will only be * outside the region by some x amount) if the rect is still * outside the reigon */ xStatus = constrainRegion.contains (CompRect (x, y - dy, width, height)); /* If it is, then move it slightly left or right based * on which direction it was moving on */ if (xStatus != RectangleIn) dx += (dx < 0) ? 1 : -1; /* new x value is based on our new dx value */ x = mOrgPos.x () - w->border ().left + dx; } /* Adjust dx */ while (dy && (status != RectangleIn)) { /* check if, with dy taken out (so the rect will only be * outside the region by some x amount) if the rect is still * outside the reigon */ status = constrainRegion.contains (CompRect (x, y, width, height)); /* If it is, then move it slightly left or right based * on which direction it was moving on */ if (status != RectangleIn) dy += (dy < 0) ? 1 : -1; /* new x value is based on our new dx value */ y = mOrgPos.y () - w->border ().top + dy; } new_dx = dx; new_dy = dy; /* return changed */ return ((dx != origDx) || (dy != origDy)); } /* * GroupSelection::groupApplyConstraining * */ void GroupSelection::applyConstraining (CompRegion constrainRegion, Window constrainedWindow, int dx, int dy) { if (!dx && !dy) return; foreach (CompWindow *w, mWindows) { GROUP_WINDOW (w); /* ignore certain windows: we don't want to apply the constraining results on the constrained window itself, nor do we want to change the target position of unamimated windows and of windows which already are constrained */ if (w->id () == constrainedWindow) continue; /* Do not bother if we are not animated or not constraining */ if (!(gw->mAnimateState & IS_ANIMATED)) continue; if (gw->mAnimateState & DONT_CONSTRAIN) continue; if (!(gw->mAnimateState & CONSTRAINED_X)) { int dummy; gw->mAnimateState |= IS_ANIMATED; /* applying the constraining result of another window might move the window offscreen, too, so check if this is not the case */ if (gw->constrainMovement (constrainRegion, dx, 0, dx, dummy)) gw->mAnimateState |= CONSTRAINED_X; gw->mDestination.setX (gw->mDestination.x () + dx); } if (!(gw->mAnimateState & CONSTRAINED_Y)) { int dummy; gw->mAnimateState |= IS_ANIMATED; /* analog to X case */ if (gw->constrainMovement (constrainRegion, 0, dy, dummy, dy)) gw->mAnimateState |= CONSTRAINED_Y; gw->mDestination.setY (gw->mDestination.y () + dy); } } } /* * GroupSelection::startTabbingAnimation * * Set up the tabbing animation, which will eventually set up * the tab structures too. "tab" here indicates whether we are * tabbing or untabbing (and takes appropriate action) * */ void GroupSelection::startTabbingAnimation (bool tab) { GROUP_SCREEN (screen); if ((mTabbingState != NoTabbing)) return; mTabbingState = (tab) ? Tabbing : Untabbing; gs->tabChangeActivateEvent (true); if (!tab) { /* we need to set up the X/Y constraining on untabbing */ CompRegion constrainRegion = gs->getConstrainRegion (); bool constrainedWindows = true; /* reset all flags */ foreach (CompWindow *cw, mWindows) { GROUP_WINDOW (cw); gw->mAnimateState &= ~(CONSTRAINED_X | CONSTRAINED_Y | DONT_CONSTRAIN); } /* as we apply the constraining in a flat loop, we may need to run multiple times through this loop until all constraining dependencies are met */ while (constrainedWindows) { constrainedWindows = false; /* loop through all windows and try to constrain their animation path (going from gw->mOrgPos to gw->mDestination) to the active screen area */ foreach (CompWindow *w, mWindows) { int dx, dy;\ int constrainStatus; GroupWindow *gw = GroupWindow::get (w); CompRect statusRect (gw->mOrgPos.x () - w->border ().left, gw->mOrgPos.y () - w->border ().top, WIN_REAL_WIDTH (w), WIN_REAL_HEIGHT (w)); /* ignore windows which aren't animated and/or already are at the edge of the screen area */ if (!(gw->mAnimateState & IS_ANIMATED)) continue; if (gw->mAnimateState & DONT_CONSTRAIN) continue; /* is the original position inside the screen area? */ constrainStatus = constrainRegion.contains (statusRect); /* constrain the movement */ if (gw->constrainMovement (constrainRegion, gw->mDestination.x () - gw->mOrgPos.x (), gw->mDestination.y () - gw->mOrgPos.y (), dx, dy)) { /* handle the case where the window is outside the screen area on its whole animation path */ if (constrainStatus != RectangleIn && !dx && !dy) { gw->mAnimateState |= DONT_CONSTRAIN; gw->mAnimateState |= CONSTRAINED_X | CONSTRAINED_Y; /* use the original position as last resort */ gw->mDestination = gw->mMainTabOffset; } else { /* if we found a valid target position, apply the change also to other windows to retain the distance between the windows */ gw->mGroup->applyConstraining (constrainRegion, w->id (), dx - gw->mDestination.x () + gw->mOrgPos.x (), dy - gw->mDestination.y () + gw->mOrgPos.y ()); /* if we hit constraints, adjust the mask and the target position accordingly */ if (dx != (gw->mDestination.x () - gw->mOrgPos.x ())) { gw->mAnimateState |= CONSTRAINED_X; gw->mDestination.setX (gw->mOrgPos.x () + dx); } if (dy != (gw->mDestination.y () - gw->mOrgPos.y ())) { gw->mAnimateState |= CONSTRAINED_Y; gw->mDestination.setY (gw->mOrgPos.y () + dy); } constrainedWindows = true; } } gw->checkFunctions (); } } } else { foreach (CompWindow *w, mWindows) { GROUP_WINDOW (w); gw->checkFunctions (); } } gs->checkFunctions (); } /* * GroupSelection::tabGroup * * Set up the tab bar structures in this group, render layers * and set up the original positions and destinations in the tabbing * animation * */ void GroupSelection::tabGroup (CompWindow *main) { GroupTabBarSlot *slot; CompSize layerSize; int space, thumbSize; GROUP_WINDOW (main); GROUP_SCREEN (screen); if (mTabBar) return; /* Since we are clearing the input shape of the window, we need * access to the XShape extension. If we don't have it, it is * not safe to continue doing so, so just abort here */ if (!screen->XShape ()) { compLogMessage ("group", CompLogLevelError, "No X shape extension! Tabbing disabled."); return; } mTabBar = new GroupTabBar (this, main); if (!mTabBar) return; /* We are not tabbing in yet (this is necessary so we can * "change" to our top tab) */ mTabbingState = NoTabbing; /* Slot is initialized after GroupTabBar is created */ gs->changeTab (gw->mSlot, GroupTabBar::RotateUncertain); /* Set up tab bar dimensions */ mTabBar->recalcTabBarPos (WIN_CENTER_X (main), WIN_X (main), WIN_X (main) + WIN_WIDTH (main)); layerSize = CompSize (mTabBar->mRegion.boundingRect ().width (), mTabBar->mRegion.boundingRect ().height ()); /* set up the text layer */ mTabBar->mTextLayer = TextLayer::create (layerSize, this); if (mTabBar->mTextLayer) { TextLayer *layer; layer = mTabBar->mTextLayer; layer->mState = PaintFadeIn; layer->mAnimationTime = gs->optionGetFadeTextTime () * 1000; layer->render (); } /* we need a buffer for DnD here */ space = gs->optionGetThumbSpace (); thumbSize = gs->optionGetThumbSize (); layerSize = CompSize (layerSize.width () + space + thumbSize, layerSize.height ()); /* create background layer */ mTabBar->mBgLayer = BackgroundLayer::create (layerSize, this); if (mTabBar->mBgLayer) { mTabBar->mBgLayer->mState = PaintOn; mTabBar->mBgLayer->mAnimationTime = 0; mTabBar->mBgLayer->render (); } layerSize = CompSize (mTabBar->mTopTab->mRegion.boundingRect ().width (), mTabBar->mTopTab->mRegion.boundingRect ().height ()); /* create selection layer */ mTabBar->mSelectionLayer = SelectionLayer::create (layerSize, this); if (mTabBar->mSelectionLayer) { CompSize size = CompSize (mTabBar->mTopTab->mRegion.boundingRect ().width (), mTabBar->mTopTab->mRegion.boundingRect ().height ()); mTabBar->mSelectionLayer->mState = PaintOn; mTabBar->mSelectionLayer->mAnimationTime = 0; mTabBar->mSelectionLayer = SelectionLayer::rebuild (mTabBar->mSelectionLayer, size); if (mTabBar->mSelectionLayer) mTabBar->mSelectionLayer->render (); } if (!HAS_TOP_WIN (this)) return; /* for each of the windows in the tabbed group, we need to set up * the tabbing animation original positions, tab offsets and * destinations (as well as initial translation) for each of * the windows */ foreach (slot, mTabBar->mSlots) { CompWindow *cw = slot->mWindow; GROUP_WINDOW (cw); /* In the case where we are still animating out or have finished * the animation but not yet moved the windows, move the windows * to their old target position */ if (gw->mAnimateState & (IS_ANIMATED | FINISHED_ANIMATION)) cw->move (gw->mDestination.x () - WIN_X (cw), gw->mDestination.y () - WIN_Y (cw), true); /* new target position is centered to the main window */ gw->mDestination = CompPoint (WIN_CENTER_X (main) - (WIN_WIDTH (cw) / 2), WIN_CENTER_Y (main) - (WIN_HEIGHT (cw) / 2)); /* This is required for determining how much we want to animate * back out again once we are untabbing */ gw->mMainTabOffset = CompPoint (WIN_X (cw), WIN_Y (cw)) - gw->mDestination; /* Initial translation is negative the window position minus * the last original position */ if (gw->mTx || gw->mTy) { gw->mTx -= (WIN_X (cw) - gw->mOrgPos.x ()); gw->mTy -= (WIN_Y (cw) - gw->mOrgPos.y ()); } /* Now the original position is the current position */ gw->mOrgPos = CompPoint (WIN_X (cw), WIN_Y (cw)); gw->mAnimateState = IS_ANIMATED; gw->mXVelocity = gw->mYVelocity = 0.0f; } /* Start the animation */ startTabbingAnimation (true); } /* * GroupSelection::untabGroup * * Set up the group untabbing. If we are in the middle of a change * animation, then use the last top tab for this group as the window * where other windows will base the animation. (If the animation is * complete, then mPrevTopTab is going to be the same as mTopTab * anyways, so using it is always safe). */ void GroupSelection::untabGroup () { int oldX, oldY; CompWindow *prevTopTab; GroupTabBarSlot *slot; GROUP_SCREEN (screen); if (!HAS_TOP_WIN (this)) return; /* Sometimes mPrevTopTab might not be set, so use mTopTab instead */ if (mTabBar->mPrevTopTab) prevTopTab = PREV_TOP_TAB (this); else { /* If prevTopTab isn't set, we have no choice but using topTab. It happens when there is still animation, which means the tab wasn't changed anyway. */ prevTopTab = TOP_TAB (this); } /* Save the top tab into mLastTopTab - we will be using this one * to base our animation off of (since we are now setting mTopTab * to NULL). */ mTabBar->mLastTopTab = TOP_TAB (this); mTabBar->mTopTab = NULL; mTabBar->mChangeState = GroupTabBar::NoTabChange; foreach (slot, mTabBar->mSlots) { CompWindow *cw = slot->mWindow; GROUP_WINDOW (cw); /* If there is currently an animation happening and windows * haven't been moved yet, move them into their destination * positions */ if (gw->mAnimateState & (IS_ANIMATED | FINISHED_ANIMATION)) { gs->mQueued = true; cw->move(gw->mDestination.x () - WIN_X (cw), gw->mDestination.y () - WIN_Y (cw), true); gs->mQueued = false; } /* All windows are now visible */ gw->setWindowVisibility (true); /* save the old original position - we might need it if constraining fails */ oldX = gw->mOrgPos.x (); oldY = gw->mOrgPos.y (); /* The original position or animation starting point here is * centered to the top tab which we are animating *out* of */ gw->mOrgPos = CompPoint (WIN_CENTER_X (prevTopTab) - WIN_WIDTH (cw) / 2, WIN_CENTER_Y (prevTopTab) - WIN_HEIGHT (cw) / 2); /* Destination is whatever the original position is plus the * offsets we saved when tabbing */ gw->mDestination = gw->mOrgPos + gw->mMainTabOffset; /* Set initial translation to the old new centered position * minus the old "original position" */ if (gw->mTx || gw->mTy) { gw->mTx -= (gw->mOrgPos.x () - oldX); gw->mTy -= (gw->mOrgPos.y () - oldY); } /* now the offset is just our old orig pos */ gw->mMainTabOffset = CompPoint (oldX, oldY); gw->mAnimateState = IS_ANIMATED; gw->mXVelocity = gw->mYVelocity = 0.0f; } /* set up the animation */ mTabbingState = NoTabbing; startTabbingAnimation (false); gs->cScreen->damageScreen (); } /* * GroupScreen::changeTab * * Change the tab to a new topTab by some direction. Passing * DirectionUncertain will cause this function to calculate the most * appropriate direction for this tab * */ bool GroupScreen::changeTab (GroupTabBarSlot *topTab, GroupTabBar::ChangeAnimationDirection direction) { CompWindow *w, *oldTopTab; GroupSelection *group; if (!topTab) return true; w = topTab->mWindow; GROUP_WINDOW (w); group = gw->mGroup; /* Don't change if we are still constructing the tab bar */ if (!group || !group->mTabBar || group->mTabbingState != GroupSelection::NoTabbing) return true; /* Don't change if we are not currently changing and the requested * top tab is the requested top tab. We will still change back * in the case we are in the middle of a change animation and we * want to change back */ if (group->mTabBar->mChangeState == GroupTabBar::NoTabChange && group->mTabBar->mTopTab == topTab) return true; /* If the tab we are currently changing to is the requested top * tab, then don't bother starting the animation again */ if (group->mTabBar->mChangeState != GroupTabBar::NoTabChange && group->mTabBar->mNextTopTab == topTab) return true; /* We need this for movement and damage purposes */ oldTopTab = group->mTabBar->mTopTab ? group->mTabBar->mTopTab->mWindow : NULL; /* If we are currently changing, set the next direction so that * the animation will start again there */ if (group->mTabBar->mChangeState != GroupTabBar::NoTabChange) group->mTabBar->mNextDirection = direction; /* Set left or right respectively */ else if (direction == GroupTabBar::RotateLeft) group->mTabBar->mChangeAnimationDirection = 1; else if (direction == GroupTabBar::RotateRight) group->mTabBar->mChangeAnimationDirection = -1; /* The requested change direction is RotateUncertain, so work * out the best way to rotate */ else { int distanceOld = 0, distanceNew = 0; GroupTabBarSlot::List::iterator it = group->mTabBar->mSlots.begin (); /* Count from left to the current top tab */ if (group->mTabBar->mTopTab) for (; (*it) && ((*it) != group->mTabBar->mTopTab); ++it, distanceOld++); /* Count from left to the requested top tab */ for (it = group->mTabBar->mSlots.begin (); (*it) && ((*it) != topTab); ++it, distanceNew++); if (distanceNew < distanceOld) group->mTabBar->mChangeAnimationDirection = 1; /*left */ else group->mTabBar->mChangeAnimationDirection = -1; /* right */ /* check if the opposite direction is shorter */ if (abs (distanceNew - distanceOld) > ((int) group->mTabBar->mSlots.size () / 2)) group->mTabBar->mChangeAnimationDirection *= -1; } /* If we are currently in the middle of an animation, we need to * handle this case */ if (group->mTabBar->mChangeState != GroupTabBar::NoTabChange) { /* If we need to go back to the last top tab, then rotate * backwards */ if (group->mTabBar->mPrevTopTab == topTab) { /* Reverse animation. */ GroupTabBarSlot *tmp = group->mTabBar->mTopTab; bool changeOldOut = (group->mTabBar->mChangeState == GroupTabBar::TabChangeOldOut); group->mTabBar->mTopTab = group->mTabBar->mPrevTopTab; group->mTopId = group->mTabBar->mTopTab->mWindow->id (); group->mTabBar->mPrevTopTab = tmp; group->mTabBar->mChangeAnimationDirection *= -1; group->mTabBar->mChangeAnimationTime = optionGetChangeAnimationTime () * 500 - group->mTabBar->mChangeAnimationTime; group->mTabBar->mChangeState = changeOldOut ? GroupTabBar::TabChangeNewIn : GroupTabBar::TabChangeOldOut; group->mTabBar->mNextTopTab = NULL; } /* Otherwise the next one we want to go to is this one * (rotate past a few tabs first) */ else group->mTabBar->mNextTopTab = topTab; } /* Otherwise we need to set up the change animation and the tab bar */ else { group->mTabBar->mTopTab = topTab; group->mTopId = topTab->mWindow->id (); CompSize size (group->mTabBar->mTopTab->mRegion.boundingRect ().width (), group->mTabBar->mTopTab->mRegion.boundingRect ().height ()); /* Rebuild layers and render */ group->mTabBar->mTextLayer = TextLayer::rebuild (group->mTabBar->mTextLayer); if (group->mTabBar->mTextLayer) group->mTabBar->mTextLayer->render (); group->mTabBar->mSelectionLayer = SelectionLayer::rebuild (group->mTabBar->mSelectionLayer, size); if (group->mTabBar->mSelectionLayer) group->mTabBar->mSelectionLayer->render (); if (oldTopTab) CompositeWindow::get (oldTopTab)->addDamage (); CompositeWindow::get (w)->addDamage (); } /* If we are not changing to another top tab */ if (topTab != group->mTabBar->mNextTopTab) { /* Make this window visible */ gw->setWindowVisibility (true); /* Center windows around the old top tab */ if (oldTopTab) { int dx, dy; dx = WIN_CENTER_X (oldTopTab) - WIN_CENTER_X (w); dy = WIN_CENTER_Y (oldTopTab) - WIN_CENTER_Y (w); mQueued = true; w->move (dx, dy, false); mQueued = false; } /* If there is a previous window, change in the new tab */ if (HAS_PREV_TOP_WIN (group)) { /* we use only the half time here - the second half will be PaintFadeOut */ group->mTabBar->mChangeAnimationTime = optionGetChangeAnimationTime () * 500; tabChangeActivateEvent (true); group->mTabBar->mChangeState = GroupTabBar::TabChangeOldOut; } /* Otherwise activate the window */ else { bool activate; /* No window to do animation with. */ if (HAS_TOP_WIN (group)) group->mTabBar->mPrevTopTab = group->mTabBar->mTopTab; else group->mTabBar->mPrevTopTab = NULL; activate = !group->mTabBar->mCheckFocusAfterTabChange; if (!activate) { /* CompFocusResult focus; focus = allowWindowFocus (w, NO_FOCUS_MASK, s->x, s->y, 0); activate = focus == CompFocusAllowed; */ } if (activate) w->activate (); group->mTabBar->mCheckFocusAfterTabChange = false; } } if (group->mTabBar->mPrevTopTab) { CompWindow *pw = group->mTabBar->mPrevTopTab->mWindow; GroupWindow::get (pw)->checkFunctions (); } if (group->mTabBar->mTopTab) { CompWindow *tw = group->mTabBar->mTopTab->mWindow; GroupWindow::get (tw)->checkFunctions (); } GroupScreen::get (screen)->checkFunctions (); return true; } /* * GroupScreen::recalcSlotPos * * Recalculate the slot region. */ void GroupScreen::recalcSlotPos (GroupTabBarSlot *slot, int slotPos) { GroupSelection *group; CompRect box; int space, thumbSize; GROUP_WINDOW (slot->mWindow); group = gw->mGroup; if (!HAS_TOP_WIN (group) || !group->mTabBar) return; space = optionGetThumbSpace (); thumbSize = optionGetThumbSize (); slot->mRegion = emptyRegion; /* Padding between slots, account for this */ box.setX (space + ((thumbSize + space) * slotPos)); box.setY (space); box.setWidth (thumbSize); box.setHeight (thumbSize); slot->mRegion = CompRegion (box); } /* * GroupSelection::recalcTabBarPos * * Recalculate the tab bar region (size and position) given a maximum * size and a central position * */ void GroupTabBar::recalcTabBarPos (int middleX, int minX1, int maxX2) { GroupTabBarSlot *slot; CompWindow *topTab; bool isDraggedSlotGroup = false; int space, barWidth; int thumbSize; int tabsWidth = 0, tabsHeight = 0; int currentSlot; CompRect box; GROUP_SCREEN (screen); if (!HAS_TOP_WIN (mGroup)) return; topTab = TOP_TAB (mGroup); space = gs->optionGetThumbSpace (); /* calculate the space which the tabs need * Note that we aren't going to get any size * if we haven't calculated slot regions yet */ foreach (slot, mSlots) { if (slot == gs->mDraggedSlot && gs->mDragged) { /* if this is a dragged slot group, then we will be * calculating the space this slot would have taken * through the spring values */ isDraggedSlotGroup = true; continue; } /* Add the slot region to our current tabs width */ tabsWidth += (slot->mRegion.boundingRect ().width ()); if ((slot->mRegion.boundingRect ().height ()) > tabsHeight) tabsHeight = slot->mRegion.boundingRect ().height (); } /* just a little work-a-round for first call FIXME: remove this! */ thumbSize = gs->optionGetThumbSize (); if (mSlots.size () && tabsWidth <= 0) { /* first call */ tabsWidth = thumbSize * mSlots.size (); if (mSlots.size () && tabsHeight < thumbSize) { /* we need to do the standard height too */ tabsHeight = thumbSize; } /* Get rid of an extra space on this group */ if (isDraggedSlotGroup) tabsWidth -= thumbSize; } barWidth = space * (mSlots.size () + 1) + tabsWidth; if (isDraggedSlotGroup) { /* 1 tab is missing, so we have 1 less border */ barWidth -= space; } /* If the maximum width is less than the bar width, set the x * position of the bar to the centered average of the maximum width * and the bar width */ if (maxX2 - minX1 < barWidth) box.setX ((maxX2 + minX1) / 2 - barWidth / 2); /* If the middle point minus half the calculated bar width is less * than the minimum x1 point, constrain to the x1 point */ else if (middleX - barWidth / 2 < minX1) box.setX (minX1); /* if the middle point plus half the bar width is more than the * maximum x point, then adjust the x point accordingly */ else if (middleX + barWidth / 2 > maxX2) box.setX (maxX2 - barWidth); /* Otherwise the x point should be set to the middle point minus * the bar width (no constraining) */ else box.setX (middleX - barWidth / 2); /* Y position is always the y position of the top tab */ box.setY (WIN_Y (topTab)); /* Width is the calculated bar width */ box.setWidth (barWidth); /* Height is twice the padding plus the tabs height */ box.setHeight (space * 2 + tabsHeight); /* Resize the reigon of the tab bar based on the calcuated box */ resizeTabBarRegion (box, true); /* recalc every slot region */ currentSlot = 0; foreach (slot, mSlots) { /* We calculate the dragged slot region later so don't * recalculate it now */ if (slot == gs->mDraggedSlot && gs->mDragged) continue; /* Recalculate individual slot position */ gs->recalcSlotPos (slot, currentSlot); /* Reposition slot */ slot->mRegion.translate (mRegion.boundingRect ().x1 (), mRegion.boundingRect ().y1 ()); /* Set spring area to the center of the slot */ slot->mSpringX = (slot->mRegion.boundingRect ().centerX ()); slot->mSpeed = 0; slot->mMsSinceLastMove = 0; currentSlot++; } /* Left and right spring points are the left and right parts * of the bar */ mLeftSpringX = box.x (); mRightSpringX = box.x () + box.width (); mRightSpeed = 0; mLeftSpeed = 0; mRightMsSinceLastMove = 0; mLeftMsSinceLastMove = 0; } /* * GroupTabBar::damageRegion * * Damage the tab bar region */ void GroupTabBar::damageRegion () { CompRegion reg (mRegion); int x1 = reg.boundingRect ().x1 (); int x2 = reg.boundingRect ().x2 (); int y1 = reg.boundingRect ().y1 (); int y2 = reg.boundingRect ().y2 (); /* we use 15 pixels as damage buffer here, as there is a 10 pixel wide border around the selected slot which also needs to be damaged properly - however the best way would be if slot->mRegion was sized including the border */ static const unsigned short DAMAGE_BUFFER = 20; /* If there is a front slot in this bar, then we need to damage * areas just outside where the slot might be sitting */ if (mSlots.size ()) { const CompRect &bnd = mSlots.front ()->mRegion.boundingRect (); x1 = MIN (x1, bnd.x1 ()); y1 = MIN (y1, bnd.y1 ()); x2 = MAX (x2, bnd.x2 ()); y2 = MAX (y2, bnd.y2 ()); } x1 -= DAMAGE_BUFFER; y1 -= DAMAGE_BUFFER; x2 += DAMAGE_BUFFER; y2 += DAMAGE_BUFFER; reg = CompRegion (x1, y1, x2 - x1, y2 - y1); GroupScreen::get (screen)->cScreen->damageRegion (reg); } /* * GroupTabBar::moveTabBarRegion * * Move the reigon of the tab bar (which moves the drawn texture * and tabs). syncIPW is whether or not to move the X11 input prevention * window - usually false if we are just animating the tab bar around * */ void GroupTabBar::moveTabBarRegion (int dx, int dy, bool syncIPW) { damageRegion (); mRegion.translate (dx, dy); if (syncIPW) XMoveWindow (screen->dpy (), mInputPrevention, mLeftSpringX, mRegion.boundingRect ().y1 ()); damageRegion (); } /* * GroupTabBar::resizeTabBarRegion * * Resize the region that the tab bar covers by some CompRect. * syncIPW is whether or not to XConfigure the input prevention * window (don't use this unless the tab bar position is being set * like that permanently). * */ void GroupTabBar::resizeTabBarRegion (CompRect &box, bool syncIPW) { int oldWidth; GROUP_SCREEN (screen); damageRegion (); oldWidth = mRegion.boundingRect ().width (); /* If the old width is not the same as the new one and we are * syncing the IPW, rebuild the background layer */ if (mBgLayer && oldWidth != box.width () && syncIPW) { mBgLayer = BackgroundLayer::rebuild (mBgLayer, CompSize (box.width () + gs->optionGetThumbSpace () + gs->optionGetThumbSize (), box.height ())); if (mBgLayer) mBgLayer->render (); /* invalidate old width */ mOldWidth = 0; } mRegion = CompRegion (box); /* Configure the IPW */ if (syncIPW) { XWindowChanges xwc; xwc.x = box.x (); xwc.y = box.y (); xwc.width = box.width (); xwc.height = box.height (); if (!mIpwMapped) XMapWindow (screen->dpy (), mInputPrevention); XMoveResizeWindow (screen->dpy (), mInputPrevention, xwc.x, xwc.y, xwc.width, xwc.height); if (!mIpwMapped) XUnmapWindow (screen->dpy (), mInputPrevention); } damageRegion (); } /* * GroupTabBar::insertTabBarSlotBefore * * Insert a tab bar slot before some other slot and relink stack * */ void GroupTabBar::insertTabBarSlotBefore (GroupTabBarSlot *slot, GroupTabBarSlot *nextSlot) { GroupTabBarSlot *prev = nextSlot->mPrev; GroupTabBarSlot::List::iterator pos = std::find (mSlots.begin (), mSlots.end (), nextSlot); mSlots.insert (pos, slot); slot->mTabBar = this; if (prev) { slot->mPrev = prev; prev->mNext = slot; } else { slot->mPrev = NULL; } slot->mNext = nextSlot; nextSlot->mPrev = slot; /* Moving bar->mRegion.boundingRect ().x1 () / x2 as minX1 / maxX2 will work, because the tab-bar got wider now, so it will put it in the average between them, which is (bar->mRegion.boundingRect ().centerX ()) anyway. */ recalcTabBarPos (mRegion.boundingRect ().centerX (), mRegion.boundingRect ().x1 (), mRegion.boundingRect ().x2 ()); } /* * GroupSelection::insertTabBarSlotAfter * * Insert a tab bar slot after some previous slot and relink the * stack * */ void GroupTabBar::insertTabBarSlotAfter (GroupTabBarSlot *slot, GroupTabBarSlot *prevSlot) { GroupTabBarSlot *next = prevSlot->mNext; GroupTabBarSlot::List::iterator pos = std::find (mSlots.begin (), mSlots.end (), next); mSlots.insert (pos, slot); slot->mTabBar = this; if (next) { slot->mNext = next; next->mPrev = slot; } else { slot->mNext = NULL; } slot->mPrev = prevSlot; prevSlot->mNext = slot; /* Moving bar->mRegion.boundingRect ().x1 () / x2 as minX1 / maxX2 will work, because the tab-bar got wider now, so it will put it in the average between them, which is (bar->mRegion.boundingRect ().x1 () + bar->mRegion.boundingRect ().x2 ()) / 2 anyway. */ recalcTabBarPos (mRegion.boundingRect ().centerX (), mRegion.boundingRect ().x1 (), mRegion.boundingRect ().x2 ()); } /* * GroupSelection::insertTabBarSlot * * Insert a tab bar slot into the tab bar. This inserts it directly * into the end of the tab bar * */ void GroupTabBar::insertTabBarSlot (GroupTabBarSlot *slot) { if (mSlots.size ()) { mSlots.back ()->mNext = slot; slot->mPrev = mSlots.back (); slot->mNext = NULL; } else { slot->mPrev = NULL; slot->mNext = NULL; } mSlots.push_back (slot); slot->mTabBar = this; /* Moving bar->mRegion.boundingRect ().x1 () / x2 as minX1 / maxX2 will work, because the tab-bar got wider now, so it will put it in the average between them, which is (bar->mRegion.boundingRect ().x1 () + bar->mRegion.boundingRect ().x2 ()) / 2 anyway. */ recalcTabBarPos ((mRegion.boundingRect ().centerX ()), mRegion.boundingRect ().x1 (), mRegion.boundingRect ().x2 ()); } /* * GroupTabBar::unhookTabBarSlot * * Take out a tab bar slot from the tab bar and make it a dragged * slot. If temporary is false, then remove this window from the * group * */ void GroupTabBar::unhookTabBarSlot (GroupTabBarSlot *slot, bool temporary) { GroupTabBarSlot *tempSlot = NULL; /* query for next and previous in linked list */ GroupTabBarSlot *prev = slot->mPrev; GroupTabBarSlot *next = slot->mNext; CompWindow *w = slot->mWindow; GroupSelection *group = mGroup; GROUP_SCREEN (screen); /* check if slot is not already unhooked */ foreach (tempSlot, mSlots) if (tempSlot == slot) break; if (!tempSlot) return; /* relink stack */ if (prev) prev->mNext = next; if (next) next->mPrev = prev; /* This slot's previous and next slots are now NULL */ slot->mPrev = NULL; slot->mNext = NULL; slot->mTabBar = NULL; mSlots.remove (slot); /* If it isn't temporary. Change to another tab */ if (!temporary) { /* If this was the previous top tab, set that to null */ if (IS_PREV_TOP_TAB (w, group)) group->mTabBar->mPrevTopTab = NULL; if (IS_TOP_TAB (w, group)) { group->mTabBar->mTopTab = NULL; group->mTopId = None; /* Change to the next tab first, otherwise the previous one */ if (next) gs->changeTab (next, RotateRight); else if (prev) gs->changeTab (prev, RotateLeft); if (gs->optionGetUntabOnClose ()) group->untabGroup (); } } /* set slot points to NULL so we don't use them again */ if (slot == mHoveredSlot) mHoveredSlot = NULL; if (slot == mTextSlot) { mTextSlot = NULL; /* Fade out text */ if (mTextLayer) { if (mTextLayer->mState == PaintFadeIn || mTextLayer->mState == PaintOn) { mTextLayer->mAnimationTime = (gs->optionGetFadeTextTime () * 1000) - mTextLayer->mAnimationTime; mTextLayer->mState = PaintFadeOut; } } } /* Moving bar->mRegion.boundingRect ().x1 () / x2 as minX1 / maxX2 will work, because the tab-bar got thiner now, so (bar->mRegion.boundingRect ().x1 () + bar->mRegion.boundingRect ().x2 ()) / 2 Won't cause the new x1 / x2 to be outside the original region. */ recalcTabBarPos (mRegion.boundingRect ().centerX (), mRegion.boundingRect ().x1 (), mRegion.boundingRect ().x2 ()); } /* * GroupSelection::deleteTabBarSlot * * Destroys a tab bar slot structure * */ void GroupTabBar::deleteTabBarSlot (GroupTabBarSlot *slot) { CompWindow *w = slot->mWindow; GROUP_WINDOW (w); GROUP_SCREEN (screen); /* It can't be part of any tab bar */ unhookTabBarSlot (slot, false); /* New region is just a blank region */ slot->mRegion = CompRegion (); /* If this is the dragged slot, set the pointers for that to * null, and remove grabs */ if (slot == gs->mDraggedSlot) { gs->mDraggedSlot = NULL; gs->mDragged = false; if (gs->mGrabState == GroupScreen::ScreenGrabTabDrag) gs->grabScreen (GroupScreen::ScreenGrabNone); } /* This window now has no slot */ gw->mSlot = NULL; gs->writeSerializedData (); delete slot; } GroupTabBarSlot::GroupTabBarSlot (CompWindow *w, GroupTabBar *bar) : GLLayer (CompSize (0,0), bar->mGroup), // FIXME: make this the size? mWindow (w), mTabBar (bar) { } /* * GroupTabBar::groupCreateSlot * * Factory function to create a new tab bar slot for some window * (automatically inserts it into the tab bar) * */ void GroupTabBar::createSlot (CompWindow *w) { GroupTabBarSlot *slot; GROUP_WINDOW (w); GROUP_SCREEN (screen); slot = new GroupTabBarSlot (w, this); if (!slot) return; insertTabBarSlot (slot); gw->mSlot = slot; gs->writeSerializedData (); } #define SPRING_K GroupScreen::get (screen)->optionGetDragSpringK() #define FRICTION GroupScreen::get (screen)->optionGetDragFriction() #define SIZE GroupScreen::get (screen)->optionGetThumbSize() #define BORDER GroupScreen::get (screen)->optionGetBorderRadius() #define Y_START_MOVE GroupScreen::get (screen)->optionGetDragYDistance() #define SPEED_LIMIT GroupScreen::get (screen)->optionGetDragSpeedLimit() /* * groupSpringForce * */ static inline int groupSpringForce (CompScreen *s, int centerX, int springX) { /* Each slot has a spring attached to it, starting at springX, and ending at the center of the slot (centerX). The spring will cause the slot to move, using the well-known physical formula F = k * dl... */ return -SPRING_K * (centerX - springX); } /* * groupDraggedSlotForce * */ static int groupDraggedSlotForce (CompScreen *s, int distanceX, int distanceY) { /* The dragged slot will make the slot move, to get DnD animations (slots will make room for the newly inserted slot). As the dragged slot is closer to the slot, it will put more force on the slot, causing it to make room for the dragged slot... But if the dragged slot gets too close to the slot, they are going to be reordered soon, so the force will get lower. If the dragged slot is in the other side of the slot, it will have to make force in the opposite direction. So we the needed funtion is an odd function that goes up at first, and down after that. Sinus is a function like that... :) The maximum is got when x = (x1 + x2) / 2, in this case: x = SIZE + BORDER. Because of that, for x = SIZE + BORDER, we get a force of SPRING_K * (SIZE + BORDER) / 2. That equals to the force we get from the the spring. This way, the slot won't move when its distance from the dragged slot is SIZE + BORDER (which is the default distance between slots). */ /* The maximum value */ float a = SPRING_K * (SIZE + BORDER) / 2; /* This will make distanceX == 2 * (SIZE + BORDER) to get 0, and distanceX == (SIZE + BORDER) to get the maximum. */ float b = PI / (2 * SIZE + 2 * BORDER); /* If there is some distance between the slots in the y axis, the slot should get less force... For this, we change max to a lower value, using a simple linear function. */ if (distanceY < Y_START_MOVE) a *= 1.0f - (float)distanceY / Y_START_MOVE; else a = 0; if (abs (distanceX) < 2 * (SIZE + BORDER)) return a * sin (b * distanceX); else return 0; } /* * groupApplyFriction * */ static inline void groupApplyFriction (CompScreen *s, int *speed) { if (abs (*speed) < FRICTION) *speed = 0; else if (*speed > 0) *speed -= FRICTION; else if (*speed < 0) *speed += FRICTION; } /* * groupApplySpeedLimit * */ static inline void groupApplySpeedLimit (CompScreen *s, int *speed) { if (*speed > SPEED_LIMIT) *speed = SPEED_LIMIT; else if (*speed < -SPEED_LIMIT) *speed = -SPEED_LIMIT; } /* * GroupTabBar::applyForces * * Apply forces to slots, move them around accordingly * */ bool GroupTabBar::applyForces (GroupTabBarSlot *draggedSlot) { GroupTabBarSlot *slot, *slot2; int centerX, centerY; int draggedCenterX, draggedCenterY; bool forces = false; /* Calculate the dragged slot center to calculate forces on the * other tabs */ if (draggedSlot) { int vx, vy; draggedSlot->getDrawOffset (vx, vy); draggedCenterX = draggedSlot->mRegion.boundingRect ().centerX () + vx; draggedCenterY = draggedSlot->mRegion.boundingRect ().centerY () + vy; } else { draggedCenterX = 0; draggedCenterY = 0; } /* mLeft/RightSpeed describe the stretching of the tab bar * during animations. This is basically just adding the new * adding the spring factor times the distance between the * anchor point and spring point */ mLeftSpeed += groupSpringForce(screen, mRegion.boundingRect ().x1 (), mLeftSpringX); mRightSpeed += groupSpringForce(screen, mRegion.boundingRect ().x2 (), mRightSpringX); /* Apply forces on the tab bar for this dragged slot */ if (draggedSlot) { int leftForce, rightForce; /* Forces here are basically the center point of tab minus the * dragged center point and the center y point of the tab bar * minus the dragged y center */ leftForce = groupDraggedSlotForce(screen, mRegion.boundingRect ().x1 () - SIZE / 2 - draggedCenterX, abs ((mRegion.boundingRect ().centerY ()) / 2 - draggedCenterY)); rightForce = groupDraggedSlotForce (screen, mRegion.boundingRect ().x2 () + SIZE / 2 - draggedCenterX, abs ((mRegion.boundingRect ().centerY ()) / 2 - draggedCenterY)); if (leftForce < 0) mLeftSpeed += leftForce; if (rightForce > 0) mRightSpeed += rightForce; } /* Now apply the spring force on each slot */ foreach (slot, mSlots) { centerX = slot->mRegion.boundingRect ().centerX (); centerY = slot->mRegion.boundingRect ().centerY (); /* Slot gets faster or slower for difference in calculated center * X and precalculated spring x */ slot->mSpeed += groupSpringForce (screen, centerX, slot->mSpringX); /* Apply dragged slot force on the other slots */ if (draggedSlot && draggedSlot != slot) { int draggedSlotForce; draggedSlotForce = groupDraggedSlotForce(screen, centerX - draggedCenterX, abs (centerY - draggedCenterY)); slot->mSpeed += draggedSlotForce; slot2 = NULL; /* If applying a negative force, the other slot to apply * force on is the left slot, otherwise the right one. * Then recursively calculate slot positions until we have * reached a NULL point on the tab bar (too far left or * right) */ if (draggedSlotForce < 0) { slot2 = slot->mPrev; mLeftSpeed += draggedSlotForce; } else if (draggedSlotForce > 0) { slot2 = slot->mNext; mRightSpeed += draggedSlotForce; } while (slot2) { if (slot2 != draggedSlot) slot2->mSpeed += draggedSlotForce; slot2 = (draggedSlotForce < 0) ? slot2->mPrev : slot2->mNext; } } } /* Apply frictions and speed limits to the tab motions */ foreach (slot, mSlots) { groupApplyFriction (screen, &slot->mSpeed); groupApplySpeedLimit (screen, &slot->mSpeed); forces |= (slot->mSpeed != 0); } /* Apply frictions and speed limits to the left and right sides */ groupApplyFriction (screen, &mLeftSpeed); groupApplySpeedLimit (screen, &mLeftSpeed); groupApplyFriction (screen, &mRightSpeed); groupApplySpeedLimit (screen, &mRightSpeed); forces |= (mLeftSpeed != 0 || mRightSpeed != 0); return forces; } /* * GroupTabBar::applySpeeds * */ void GroupTabBar::applySpeeds (int msSinceLastRepaint) { GroupTabBarSlot *slot; int move; CompRect box = mRegion.boundingRect (); bool updateTabBar = false; /* For animation purposes we need to know how many ms there have * been since the last movement */ mLeftMsSinceLastMove += msSinceLastRepaint; mRightMsSinceLastMove += msSinceLastRepaint; /* Left - x position of the region is just the calculated * speed times how many ms there have been since the last move * (/1000) */ move = mLeftSpeed * mLeftMsSinceLastMove / 1000; if (move) { box.setX (box.x () + move); box.setWidth (box.width () - move); mLeftMsSinceLastMove = 0; updateTabBar = true; } /* Otherwise if the left speed is zero and the region point is * still not the same as the left spring point, it might be * friction preventing us from getting to the position, so temp * overcome this */ else if (mLeftSpeed == 0 && mRegion.boundingRect ().x1 () != mLeftSpringX && (SPRING_K * abs (mRegion.boundingRect ().x1 () - mLeftSpringX) < FRICTION)) { /* Friction is preventing from the left border to get to its original position. */ box.setX (box.x () + mLeftSpringX - mRegion.boundingRect ().x1 ()); box.setWidth (box.width () - mLeftSpringX - mRegion.boundingRect ().x1 ()); mLeftMsSinceLastMove = 0; updateTabBar = true; } else if (mLeftSpeed == 0) mLeftMsSinceLastMove = 0; /* Right */ move = mRightSpeed * mRightMsSinceLastMove / 1000; if (move) { box.setWidth (box.width () + move); mRightMsSinceLastMove = 0; updateTabBar = true; } else if (mRightSpeed == 0 && mRegion.boundingRect ().x2 () != mRightSpringX && (SPRING_K * abs (mRegion.boundingRect ().x2 () - mRightSpringX) < FRICTION)) { /* Friction is preventing from the right border to get to its original position. */ box.setWidth (box.width () + mLeftSpringX - mRegion.boundingRect ().x1 ()); mLeftMsSinceLastMove = 0; updateTabBar = true; } else if (mRightSpeed == 0) mRightMsSinceLastMove = 0; /* If we need to update the bar, then resize the actual region */ if (updateTabBar) resizeTabBarRegion (box, false); /* Apply movement to slots */ foreach (slot, mSlots) { int slotCenter; /* Move slots by precalculated speeds */ slot->mMsSinceLastMove += msSinceLastRepaint; move = slot->mSpeed * slot->mMsSinceLastMove / 1000; slotCenter = slot->mRegion.boundingRect ().centerX (); if (move) { slot->mRegion.translate (move, 0); slot->mMsSinceLastMove = 0; } else if (slot->mSpeed == 0 && slotCenter != slot->mSpringX && SPRING_K * abs (slotCenter - slot->mSpringX) < FRICTION) { /* Friction is preventing from the slot to get to its original position. */ slot->mRegion.translate (slot->mSpringX - slotCenter, 0); slot->mMsSinceLastMove = 0; } else if (slot->mSpeed == 0) slot->mMsSinceLastMove = 0; } } /* * GroupTabBar::GroupTabBar * * Constructor for the tab bar - initialize it based on a parent group * and a top tab. Make sure that X windows are created and create * slots for this tab bar * */ GroupTabBar::GroupTabBar (GroupSelection *group, CompWindow *topTab) : mSlots (CompSize (0,0), group), mGroup (group), mTopTab (NULL), mPrevTopTab (NULL), mLastTopTab (NULL), mNextTopTab (NULL), mCheckFocusAfterTabChange (false), mChangeAnimationTime (0), mChangeAnimationDirection (0), mChangeState (NoTabChange), mHoveredSlot (NULL), mTextSlot (NULL), mTextLayer (NULL), mBgLayer (NULL), mSelectionLayer (NULL), mState (PaintOff), mAnimationTime (0), mOldWidth (0), mLeftSpringX (0), mRightSpringX (0), mLeftSpeed (0), mRightSpeed (0), mLeftMsSinceLastMove (0), mRightMsSinceLastMove (0), mInputPrevention (None), mIpwMapped (false) { mGroup->mTabBar = this; /* only need to do this because * GroupTabBar::createSlot checks * for mTabBar */ mGroup->mTopId = topTab->id (); mSlots.clear (); foreach (CompWindow *cw, mGroup->mWindows) createSlot (cw); createInputPreventionWindow (); mTopTab = GroupWindow::get (topTab)->mSlot; group->mTopId = topTab->id (); recalcTabBarPos (WIN_CENTER_X (topTab), WIN_X (topTab), WIN_X (topTab) + WIN_WIDTH (topTab)); } /* * GroupTabBar::~GroupTabBar * * Destructor for GroupTabBar, kill the cairo layers and kill the * input prevention window * */ GroupTabBar::~GroupTabBar () { while (mSlots.size ()) deleteTabBarSlot (mSlots.front ()); if (mTextLayer->mPixmap) XFreePixmap (screen->dpy (), mTextLayer->mPixmap); delete mTextLayer; delete mBgLayer; delete mSelectionLayer; mGroup->mTabBar->destroyInputPreventionWindow (); if (mTimeoutHandle.active ()) mTimeoutHandle.stop (); } /* * GroupScreen::initTab * * Action to tab the windows in a group * */ bool GroupScreen::initTab (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w; bool allowUntab = true; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); if (!w) return true; GROUP_WINDOW (w); /* If the windows are selected, we can skip the "group" phase * and go straight on to tabbing */ if (gw->mInSelection) { groupWindows (action, state, options); /* If the window was selected, we don't want to untab the group, because the user probably wanted to tab the selected windows. */ allowUntab = false; } if (!gw->mGroup) return true; /* Tab the group if there is no tab bar */ if (!gw->mGroup->mTabBar) gw->mGroup->tabGroup (w); else if (allowUntab) gw->mGroup->untabGroup (); cScreen->damageScreen (); return true; } /* * GroupScreen::changeTabLeft * * Action to change the top tab of the group to the tab to the left * of the top tab * */ bool GroupScreen::changeTabLeft (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w, *topTab; xid = CompOption::getIntOptionNamed (options, "window", 0); w = topTab = screen->findWindow (xid); if (!w) return true; GROUP_WINDOW (w); if (!gw->mSlot || !gw->mGroup || !gw->mGroup->mTabBar || !gw->mGroup->mTabBar->mTopTab) return true; if (gw->mGroup->mTabBar->mNextTopTab) topTab = NEXT_TOP_TAB (gw->mGroup); else if (gw->mGroup->mTabBar->mTopTab) { /* If there are no tabbing animations, topTab is never NULL. */ topTab = TOP_TAB (gw->mGroup); } gw = GroupWindow::get (topTab); if (gw->mSlot->mPrev) return changeTab (gw->mSlot->mPrev, GroupTabBar::RotateLeft); else return changeTab (gw->mGroup->mTabBar->mSlots.back (), GroupTabBar::RotateLeft); } /* * changeTabRight * */ bool GroupScreen::changeTabRight (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w, *topTab; xid = CompOption::getIntOptionNamed (options, "window", 0); w = topTab = screen->findWindow (xid); if (!w) return true; GROUP_WINDOW (w); if (!gw->mSlot || !gw->mGroup || !gw->mGroup->mTabBar) return true; if (gw->mGroup->mTabBar->mNextTopTab) topTab = NEXT_TOP_TAB (gw->mGroup); else if (gw->mGroup->mTabBar->mTopTab) { /* If there are no tabbing animations, topTab is never NULL. */ topTab = TOP_TAB (gw->mGroup); } gw = GroupWindow::get (topTab); if (gw->mSlot->mNext) return changeTab (gw->mSlot->mNext, GroupTabBar::RotateRight); else return changeTab (gw->mGroup->mTabBar->mSlots.front (), GroupTabBar::RotateRight); } /* * switchTopTabInput * * If the IPW is created, then map it accordingly * */ void GroupScreen::switchTopTabInput (GroupSelection *group, bool enable) { if (!group->mTabBar || !HAS_TOP_WIN (group)) return; if (!group->mTabBar->mInputPrevention) group->mTabBar->createInputPreventionWindow (); if (!enable) { XMapWindow (screen->dpy (), group->mTabBar->mInputPrevention); } else { XUnmapWindow (screen->dpy (), group->mTabBar->mInputPrevention); } group->mTabBar->mIpwMapped = !enable; } /* * GroupTabBar::createInputPreventionWindow * */ void GroupTabBar::createInputPreventionWindow () { if (!mInputPrevention) { XSetWindowAttributes attrib; attrib.override_redirect = true; mInputPrevention = XCreateWindow (screen->dpy (), screen->root (), -100, -100, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect, &attrib); mIpwMapped = false; } } /* * GroupTabBar::destroyInputPreventionWindow * */ void GroupTabBar::destroyInputPreventionWindow () { if (mInputPrevention) { XDestroyWindow (screen->dpy (), mInputPrevention); mInputPrevention = None; mIpwMapped = true; } } compiz-0.9.11+14.04.20140409/plugins/group/src/group.cpp0000644000015301777760000015664512321343002022757 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * group.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" const double PI = 3.14159265359f; /* * GroupExp class * * A custom subclass of CompMatch::Expression which we can create * on matchInitExp to evaluate whether or not a window is actually * grouped. * */ class GroupExp : public CompMatch::Expression { public: GroupExp (const CompString &str); bool evaluate (const CompWindow *w) const; bool value; }; /* * GroupExp::GroupExp * * Internal value here is the "1" or "0" of group= * (eg we pass str.substr (6) to get that). Compare whether * the window is actually in a group against this value when * evaluating the match * */ GroupExp::GroupExp (const CompString &str) : value (strtol (str.c_str (), NULL, 0)) { } /* * GroupExp::evaluate * * Compare if we wanted a window to be grouped and whether or not * the window is actually in fact grouped */ bool GroupExp::evaluate (const CompWindow *w) const { GROUP_WINDOW (w); return ((value && gw->mGroup) || (!value && !gw->mGroup)); } /* * GroupScreen::matchInitExp * * Every time a match option is initialized, this wrapped function gets * called so that we can create an expression if we need to. * * Note here that core parses each match string and tokenizes them * based on spaces, so we only need to worry about matching * "group=" and nothing else. * */ CompMatch::Expression * GroupScreen::matchInitExp (const CompString &str) { /* Create a new match object */ if (str.find ("group=") == 0) return new GroupExp (str.substr (6)); return screen->matchInitExp (str); } /* * GroupScreen::matchExpHandlerChanged * * This gets called whenever some plugin needs to check all windows * again to see if they still match, so go ahead and update match * properties for windows if they are relevant here */ void GroupScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); foreach (CompWindow *w, screen->windows ()) { if (GroupWindow::get (w)->mGroup) screen->matchPropertyChanged (w); } } /* * GroupWindow::isGroupWindow * * Simple set of condensed checks on the window to check if it * makes sense to handle this window with the group plugin * */ bool GroupWindow::isGroupWindow () { GROUP_SCREEN (screen); if (window->overrideRedirect ()) return false; if (window->type () & CompWindowTypeDesktopMask) return false; if (window->invisible ()) return false; if (!gs->optionGetWindowMatch ().evaluate (window)) return false; return true; } /* * GroupWindow::dragHoverTimeout * * Description: * Activates a window after a certain time a slot has been dragged over it. * */ bool GroupWindow::dragHoverTimeout () { GROUP_SCREEN (screen); if (gs->optionGetBarAnimations () && mGroup->mTabBar && mGroup->mTabBar->mBgLayer) { BackgroundLayer *bg = mGroup->mTabBar->mBgLayer; bg->mBgAnimation = BackgroundLayer::AnimationPulse; bg->mBgAnimationTime = gs->optionGetPulseTime () * 1000; } window->activate (); return false; } /* * GroupWindow::updateResizeRectangle * * Updates the new resize rect of grouped windows of a group * which is currently being resized. This checks the difference * of the "master geometry" and the original geometry of the grabbed * window of the group and applies it to this window. Obviously, * we can't do anything like resize past boundaries so constrain the * window size if this happens. * Also set the relevant configure masks */ unsigned int GroupWindow::updateResizeRectangle (CompRect masterGeometry, bool damage) { CompRect newGeometry; CompRect &origGeometry = mGroup->mResizeInfo->mOrigGeometry; unsigned int mask = 0; int newWidth, newHeight; int widthDiff, heightDiff; if (mResizeGeometry.isEmpty () || !mGroup->mResizeInfo) return 0; /* New geometry //position// is the difference between the master geometry * and the original geometry */ newGeometry.setX (WIN_X (window) + (masterGeometry.x () - mGroup->mResizeInfo->mOrigGeometry.x ())); newGeometry.setY (WIN_Y (window) + (masterGeometry.y () - mGroup->mResizeInfo->mOrigGeometry.y ())); /* New geometry //size// is the difference in sizes between the master and original * geometry, plus the size of this window (obviously check for negative values) */ widthDiff = masterGeometry.width () - origGeometry.width (); newGeometry.setWidth (MAX (1, WIN_WIDTH (window) + widthDiff)); heightDiff = masterGeometry.height () - origGeometry.height (); newGeometry.setHeight (MAX (1, WIN_HEIGHT (window) + heightDiff)); if (window->constrainNewWindowSize (newGeometry.width (), newGeometry.height (), &newWidth, &newHeight)) { newGeometry.setSize (CompSize (newWidth, newHeight)); } if (damage) { if (mResizeGeometry != newGeometry) { cWindow->addDamage (); } } /* Set appropriate XConfigure masks */ if (newGeometry.x () != mResizeGeometry.x ()) { mResizeGeometry.setX (newGeometry.x ()); mask |= CWX; } if (newGeometry.y () != mResizeGeometry.y ()) { mResizeGeometry.setY (newGeometry.y ()); mask |= CWY; } if (newGeometry.width () != mResizeGeometry.width ()) { mResizeGeometry.setWidth (newGeometry.width ()); mask |= CWWidth; } if (newGeometry.height () != mResizeGeometry.height ()) { mResizeGeometry.setHeight (newGeometry.height ()); mask |= CWHeight; } return mask; } /* * GroupScreen::grabScreen * * Convenience function to grab the screen with different grab * masks, etc * */ void GroupScreen::grabScreen (GroupScreen::GrabState newState) { if ((mGrabState != newState) && mGrabIndex) { screen->removeGrab (mGrabIndex, NULL); mGrabIndex = 0; } if (newState == ScreenGrabSelect) { mGrabIndex = screen->pushGrab (None, "group"); } else if (newState == ScreenGrabTabDrag) { mGrabIndex = screen->pushGrab (None, "group-drag"); } mGrabState = newState; checkFunctions (); } /* * GroupSelection::raiseWindows * * Raises all windows in a group * * Creates a list of all windows that need to be raised * and then raises them all in one go (restacks them below the top * window). * * Doesn't appear to work with 0.9, perhaps because of the changes * in the restacking code * */ void GroupSelection::raiseWindows (CompWindow *top) { CompWindowList stack; CompWindowList::iterator it; if (mWindows.size () == 1) return; stack.resize (mWindows.size () - 1); it = stack.begin (); foreach (CompWindow *w, screen->windows ()) { GROUP_WINDOW (w); if ((w->id () != top->id ()) && (gw->mGroup == this)) { (*it) = w; ++it; } } foreach (CompWindow *cw, stack) cw->restackBelow (top); } /* * GroupSelection::minimizeWindows * * Minimizes all windows in a group. Don't minimize the principal * window twice, obviously * */ void GroupSelection::minimizeWindows (CompWindow *top, bool minimize) { foreach (CompWindow *w, mWindows) { if (w->id () == top->id ()) continue; if (minimize) w->minimize (); else w->unminimize (); } } /* * GroupSelection::shadeWindows * * Shade all windows in a group * * After shading we need to update the window attributes * */ void GroupSelection::shadeWindows (CompWindow *top, bool shade) { unsigned int state; foreach (CompWindow *w, mWindows) { if (w->id () == top->id ()) continue; if (shade) state = w->state () | CompWindowStateShadedMask; else state = w->state () & ~CompWindowStateShadedMask; w->changeState (state); w->updateAttributes (CompStackingUpdateModeNone); } } /* * GroupSelection::moveWindows * * Move all windows in a group * * This does not move all windows straight away, rather it enqueues a * a w->move () into the window structure itself, to be batch-dequeued * at before the next handleEvent () call. This is because calling * wrapped functions half way through the wrap chain is just going * to be problematic for us. * * Also if a window is maximized and there was a viewport change, * move the window backwards. Otherwise ignore viewport changes. */ void GroupSelection::moveWindows (CompWindow *top, int dx, int dy, bool immediate, bool viewportChange) { foreach (CompWindow *cw, mWindows) { if (!cw) continue; if (cw->id () == top->id ()) continue; GROUP_WINDOW (cw); if (cw->state () & MAXIMIZE_STATE) { if (viewportChange) gw->enqueueMoveNotify (-dx, -dy, immediate, true); } else if (!viewportChange) { gw->mNeedsPosSync = true; gw->enqueueMoveNotify (dx, dy, immediate, true); } } } /* * GroupSelection::prepareResizeWindows * * Description: Sets the resize geometry of this group * and makes windows appear "stretched". * * Use it for animation or something. Currently used to * paint windows as stretched while the primary window * is resizing (eg through rectangle, outline or stretch mode) * */ void GroupSelection::prepareResizeWindows (CompRect &rect) { foreach (CompWindow *cw, mWindows) { GroupWindow *gcw; gcw = GroupWindow::get (cw); if (!gcw->mResizeGeometry.isEmpty ()) { if (gcw->updateResizeRectangle (rect, true)) { gcw->cWindow->addDamage (); } } } } /* * GroupSelection::resizeWindows * * Description: Configures windows according to set resize geometry * in prepareResizeWindows * */ void GroupSelection::resizeWindows (CompWindow *top) { CompRect rect; GROUP_SCREEN (screen); gs->dequeueMoveNotifies (); if (mResizeInfo) { rect = CompRect (WIN_X (top), WIN_Y (top), WIN_WIDTH (top), WIN_HEIGHT (top)); } foreach (CompWindow *cw, mWindows) { if (!cw) continue; if (cw->id () != top->id ()) { GROUP_WINDOW (cw); GroupWindow *gwtt = GroupWindow::get (top); if (!gw->mResizeGeometry.isEmpty ()) { unsigned int mask; gw->mResizeGeometry = CompRect (WIN_X (cw), WIN_Y (cw), WIN_WIDTH (cw), WIN_HEIGHT (cw)); mask = gw->updateResizeRectangle (rect, false); if (mask) { XWindowChanges xwc; xwc.x = gw->mResizeGeometry.x (); xwc.y = gw->mResizeGeometry.y (); xwc.width = gw->mResizeGeometry.width (); xwc.height = gw->mResizeGeometry.height (); if (top->mapNum () && (mask & (CWWidth | CWHeight))) top->sendSyncRequest (); cw->configureXWindow (mask, &xwc); } else { gwtt->mResizeGeometry = CompRect (0, 0, 0, 0); } } if (GroupWindow::get (top)->mNeedsPosSync) { gwtt->mNeedsPosSync = false; } gwtt->enqueueUngrabNotify (); } } if (mResizeInfo) { delete mResizeInfo; mResizeInfo = NULL; } mGrabWindow = None; mGrabMask = 0; } /* * GroupSelection::maximizeWindows * * Maximizes every window in a group, simply changing it's state * */ void GroupSelection::maximizeWindows (CompWindow *top) { foreach (CompWindow *cw, mWindows) { if (!cw) continue; if (cw->id () == top->id ()) continue; cw->maximize (top->state () & MAXIMIZE_STATE); } } /* * GroupWindow::deleteGroupWindow () * * Finitializes any remaining group related bits on a window * structure after we have detached from a group. * */ void GroupWindow::deleteGroupWindow () { GroupSelection *group; GROUP_SCREEN (screen); if (!mGroup) return; group = mGroup; /* If this is the dragged slot in the group, unhook it * from the tab bar. Otherwise get rid of it */ if (group->mTabBar && mSlot) { if (gs->mDraggedSlot && gs->mDragged && gs->mDraggedSlot->mWindow->id () == window->id ()) { group->mTabBar->unhookTabBarSlot (mSlot, false); } else group->mTabBar->deleteTabBarSlot (mSlot); } /* If the group has any windows left ... */ if (group->mWindows.size ()) { /* If the group has more than one window left, and, if * after removing the window, there is only one window left, * then there makes no sense to paint glow on the "group" * with just one window left, (the window *is* grouped, but * for the purposes of what the user can see, the window is just * like any other window, and when we add it to another group, * it will just re-use some of the structures we have already */ if (group->mWindows.size () > 1) { group->mWindows.remove (window); group->mWindowIds.remove (window->id ()); if (group->mWindows.size () == 1) { /* Glow was removed from this window, too. * Since there is only one window left here, * it is safe to use front () */ GROUP_WINDOW (group->mWindows.front ()); gw->cWindow->damageOutputExtents (); gw->window->updateWindowOutputExtents (); if (gs->optionGetAutoUngroup ()) { if (group->mTabBar->mChangeState != GroupTabBar::NoTabChange) { /* a change animation is pending: this most likely means that a window must be moved back onscreen, so we do that here */ GroupWindow *glw = GroupWindow::get (group->mWindows.front ()); glw->setWindowVisibility (true); } if (!gs->optionGetAutotabCreate ()) group->fini (); } } } else { group->mWindows.clear (); group->mWindowIds.clear (); group->fini (); } mGroup = NULL; screen->matchPropertyChanged (window); cWindow->damageOutputExtents (); window->updateWindowOutputExtents (); gs->writeSerializedData (); } } /* * GroupWindow::removeWindowFromGroup * * Takes a window out of a group, there might be a tab bar, so this * is really just a wrapper function to handle the untabbing of * the single window //first// before going ahead and getting rid * of the window from the group. * */ void GroupWindow::removeWindowFromGroup () { GROUP_SCREEN (screen); if (!mGroup) return; if (mGroup->mTabBar && !(mAnimateState & IS_UNGROUPING) && (mGroup->mWindows.size () > 1)) { GroupSelection *group = mGroup; /* if the group is tabbed, setup untabbing animation. The window will be deleted from the group at the end of the untabbing. */ if (HAS_TOP_WIN (group)) { CompWindow *tw = TOP_TAB (group); int oldX = mOrgPos.x (); int oldY = mOrgPos.y (); /* The "original position" of the window for the purposes * of the untabbing animation is centered to the top tab */ mOrgPos = CompPoint (WIN_CENTER_X (tw) - (WIN_WIDTH (window) / 2), WIN_CENTER_Y (tw) - (WIN_HEIGHT (window) / 2)); /* Destination is here is the "original" position of the window * relative to how far away it was from the main tab */ mDestination = mOrgPos + mMainTabOffset; /* The new "main tab offset" is now the original position */ mMainTabOffset = CompPoint (oldX, oldY); /* Kick off the animation */ if (mTx || mTy) { mTx -= (mOrgPos.x () - oldX); mTy -= (mOrgPos.y () - oldY); } mAnimateState = IS_ANIMATED; mXVelocity = mYVelocity = 0.0f; } /* Although when there is no top-tab, it will never really animate anything, if we don't start the animation, the window will never get removed. */ group->startTabbingAnimation (false); setWindowVisibility (true); group->mUngroupState = GroupSelection::UngroupSingle; mAnimateState |= IS_UNGROUPING; } else { /* no tab bar - delete immediately */ deleteGroupWindow (); if (gs->optionGetAutotabCreate () && isGroupWindow ()) { GroupSelection *g; gs->mTmpSel.clear (); gs->mTmpSel.select (window); g = gs->mTmpSel.toGroup (); if (g) g->tabGroup (window); } } checkFunctions (); } GroupSelection::~GroupSelection () { } /* * GroupSelection::fini * * This is //essentially// like a destructor, although it handles * setting up the untabbing animation before the group is freed. * * We cannot put this code in the destructor, since there is no way * to prevent the object from being freed if we need to do things * like trigger animations */ void GroupSelection::fini () { GROUP_SCREEN (screen); if (mWindows.size ()) { if (mTabBar) { /* set up untabbing animation and delete the group at the end of the animation */ untabGroup (); mUngroupState = UngroupAll; return; } /* For every window in the group, we need to do a few * tear down related things (faster than calling * removeWindowFromGroup on every single one) * which includes damaging the current glow region * (output extents), updating the X11 window property * reflect that this window is now gone from the group * and creating new autotabbed groups from the windows * when they are removed */ foreach (CompWindow *cw, mWindows) { GROUP_WINDOW (cw); CompositeWindow::get (cw)->damageOutputExtents (); gw->mGroup = NULL; screen->matchPropertyChanged (cw); cw->updateWindowOutputExtents (); gs->writeSerializedData (); if (gs->optionGetAutotabCreate () && gw->isGroupWindow ()) { GroupSelection *g; gs->mTmpSel.clear (); gs->mTmpSel.select (cw); g = gs->mTmpSel.toGroup (); if (g) g->tabGroup (cw); } gw->checkFunctions (); } mWindows.clear (); } else if (mTabBar) { delete mTabBar; mTabBar = NULL; mTopId = None; } /* Pop this group from the groups list */ gs->mGroups.remove (this); /* Make sure there are no dangling pointers to this in GroupScreen */ if (this == gs->mLastHoveredGroup) gs->mLastHoveredGroup = NULL; if (this == gs->mLastRestackedGroup) gs->mLastRestackedGroup = NULL; /* This is slightly evil, but necessary, since it is not possible * to make the destructor private (since the object would be * non-instantiatable). Also, we don't use the class at all * after this, so we can let it's memory go, really */ delete this; } void GroupSelection::changeColor () { GROUP_SCREEN (screen); /* Generate new color */ float factor = ((float)RAND_MAX + 1) / 0xffff; mColor[0] = (int)(rand () / factor); mColor[1] = (int)(rand () / factor); mColor[2] = (int)(rand () / factor); mColor[3] = 0xffff; /* Re-render the selection layer, if it is there */ if (mTabBar && mTabBar->mSelectionLayer) { const CompRect &bRect = mTabBar->mTopTab->mRegion.boundingRect (); CompSize size (bRect.width (), bRect.height ()); SelectionLayer *sl = mTabBar->mSelectionLayer; SelectionLayer::rebuild (sl, size); if (mTabBar->mSelectionLayer) mTabBar->mSelectionLayer->render (); gs->cScreen->damageScreen (); } } /* * GroupSelection::GroupSelection * * Constructor for GroupSelection. Creates an empty group, sets up * the color and determines a new ID number. * */ GroupSelection::GroupSelection () : mScreen (screen), mTabBar (NULL), mTabbingState (NoTabbing), mUngroupState (UngroupNone), mGrabWindow (None), mGrabMask (0), mResizeInfo (NULL), mTopId (None) { boost::function cb = boost::bind (&GroupSelection::handleHoverDetection, this, _1); mPoller.setCallback (cb); /* glow color */ changeColor (); } /* * GroupWindow::addWindowToGroup * * Adds a window to a group. * * Note that if NULL is passed, a new group is created. "initialIdent" * is there for restoring from window properties, otherwise you can just * pass 0. * */ void GroupWindow::addWindowToGroup (GroupSelection *group) { GROUP_SCREEN (screen); if (mGroup) return; if (group) { /* If a group was specified, just add this window to it */ CompWindow *topTab = NULL; mGroup = group; group->mWindows.push_back (window); group->mWindowIds.push_back (window->id ()); /* Update glow regions and X11 property */ checkFunctions (); window->updateWindowOutputExtents (); cWindow->damageOutputExtents (); gs->writeSerializedData (); /* If we have more than one window in this group just recently, * then update the first window too, */ if (group->mWindows.size () == 2) { /* first window in the group got its glow, too */ GroupWindow::get (group->mWindows.front ())->checkFunctions (); group->mWindows.front ()->updateWindowOutputExtents (); CompositeWindow::get (group->mWindows.front ())->damageOutputExtents (); } /* If there is a tab bar for this group, then we need to set up * the tabbing animation */ if (group->mTabBar) { /* If a window is being dragged out of a group, then * that group will have no top-tab, so we need to get * the last known top-tab for that group and untab it */ if (HAS_TOP_WIN (group)) topTab = TOP_TAB (group); else if (HAS_PREV_TOP_WIN (group)) { topTab = PREV_TOP_TAB (group); group->mTabBar->mTopTab = group->mTabBar->mPrevTopTab; group->mTopId = group->mTabBar->mTopTab->mWindow->id (); group->mTabBar->mPrevTopTab = NULL; } if (topTab) { if (!mSlot) group->mTabBar->createSlot (window); /* Set up the tabbing animation */ mDestination = CompPoint (WIN_CENTER_X (topTab) - (WIN_WIDTH (window) / 2), WIN_CENTER_Y (topTab) - (WIN_HEIGHT (window) / 2)); mMainTabOffset = CompPoint (WIN_X (window), WIN_Y (window)) - mDestination; mOrgPos = CompPoint (WIN_X (window), WIN_Y (window)); mXVelocity = mYVelocity = 0.0f; mAnimateState = IS_ANIMATED; group->startTabbingAnimation (true); cWindow->addDamage (); } } screen->matchPropertyChanged (window); } gs->writeSerializedData (); checkFunctions (); } /* * GroupScreen::groupWindows * * Triggerable action to group windows, just adds all the * windows in the current selection to a group, or creates a new * one and adds them to that. * */ bool GroupScreen::groupWindows (CompAction *action, CompAction::State state, CompOption::Vector options) { mTmpSel.toGroup (); return false; } /* * GroupScreen::ungroupWindows * * Actions to ungroup the windows * */ bool GroupScreen::ungroupWindows (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); if (w) { GROUP_WINDOW (w); /* Find the group of the selected window, kill it */ if (gw->mGroup) gw->mGroup->fini (); } return false; } /* * GroupScreen::removeWindow * * Triggerable action to remove a single window from a group * */ bool GroupScreen::removeWindow (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); if (w) { GROUP_WINDOW (w); if (gw->mGroup) gw->removeWindowFromGroup (); } return false; } /* * GroupScreen::closeWindows * * Action to close all windows in a group * */ bool GroupScreen::closeWindows (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); if (w) { GROUP_WINDOW (w); if (gw->mGroup) { foreach (CompWindow *cw, gw->mGroup->mWindows) cw->close (screen->getCurrentTime ()); } } return false; } /* * GroupScreen::changeColor * * Action to change the color of a group * */ bool GroupScreen::changeColor (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); if (w) { GROUP_WINDOW (w); if (gw->mGroup) gw->mGroup->changeColor (); } return false; } /* * GroupScreen::setIgnore * * Triggerable action to make this group not behave like a group * for a short amount of time * */ bool GroupScreen::setIgnore (CompAction *action, CompAction::State state, CompOption::Vector options) { mIgnoreMode = true; if (state & CompAction::StateInitKey) action->setState (state | CompAction::StateTermKey); return false; } /* * GroupScreen::unsetIgnore * * Triggerable action to make this group behave like a group * */ bool GroupScreen::unsetIgnore (CompAction *action, CompAction::State state, CompOption::Vector options) { mIgnoreMode = false; action->setState (state & ~CompAction::StateTermKey); return false; } /* * GroupScreen::handleButtonPressEvent * * Generally delegated from GroupScreen::handleEvent, * do things like handling clicks on tab thumbnails, * scrolling on the tab bar etc * */ void GroupScreen::handleButtonPressEvent (XEvent *event) { GroupSelection *group; int xRoot, yRoot, button; xRoot = event->xbutton.x_root; yRoot = event->xbutton.y_root; button = event->xbutton.button; foreach (group, mGroups) { if (!group->mTabBar) continue; /* if we didn't click on a tab bar, we don't care*/ if (group->mTabBar->mInputPrevention != event->xbutton.window) continue; switch (button) { /* Left mouse button on the tab bar, did we click on a slot? */ case Button1: { GroupTabBarSlot *slot; foreach (slot, group->mTabBar->mSlots) { if (slot->mRegion.contains (CompPoint (xRoot, yRoot))) { /* Set the draggedSlot to this one, * don't select the tab yet, we are supposed to * do that in ::handleButtonReleaseEvent */ mDraggedSlot = slot; /* The slot isn't dragged yet */ mDragged = false; mPrevX = xRoot; mPrevY = yRoot; if (!screen->otherGrabExist ("group", "group-drag", NULL)) grabScreen (ScreenGrabTabDrag); } } } break; /* Scroll up or down on the bar */ case Button4: case Button5: { CompWindow *topTab = NULL; GroupWindow *gw; /* If a tab animation is already in progress, * mTopTab will not be set to the top tab we have * already switched to, instead it will be the new * mTopTab when the animation finishes. Obviously, we * don't want to just trigger the same animation again * for another scroll, so set the "topTab" in this case * to the next one after the animation finishes (so we * change to the one before or after that one) */ if (group->mTabBar->mNextTopTab) topTab = NEXT_TOP_TAB (group); else if (group->mTabBar->mTopTab) { /* If there are no tabbing animations, topTab is never NULL. */ topTab = TOP_TAB (group); } if (!topTab) return; gw = GroupWindow::get (topTab); /* Change tab left */ if (button == Button4) { GroupTabBarSlot *prev = gw->mSlot->mPrev; if (prev) changeTab (prev, GroupTabBar::RotateLeft); else changeTab (gw->mGroup->mTabBar->mSlots.back (), GroupTabBar::RotateLeft); } /* Change tab right */ else { GroupTabBarSlot *next = gw->mSlot->mNext; if (next) changeTab (next, GroupTabBar::RotateRight); else changeTab (gw->mGroup->mTabBar->mSlots.front (), GroupTabBar::RotateRight); } break; } } break; } } /* * GroupScreen::handleButtonReleaseEvent * * Delegated from ::handleEvent, this handles any button release * event on the tab bar, so we need to "deposit" dragged slots * as well as changing tabs * */ void GroupScreen::handleButtonReleaseEvent (XEvent *event) { GroupSelection *group; int vx, vy; CompRegion newRegion; bool inserted = false; bool wasInTabBar = false; if (event->xbutton.button != 1) return; /* If there is no dragged slot, return * Note that this doesn't necessarily mean that * we are not //dragging// a slot (since a slot gets picked * as mDraggedSlot as soon as it is clicked, not dragged */ if (!mDraggedSlot) return; /* If we were not dragged, then we were simply just selecting * this tab! Just change to this tab */ if (!mDragged) { changeTab (mDraggedSlot, GroupTabBar::RotateUncertain); mDraggedSlot = NULL; if (mGrabState == ScreenGrabTabDrag) grabScreen (ScreenGrabNone); return; } GROUP_WINDOW (mDraggedSlot->mWindow); newRegion = mDraggedSlot->mRegion; /* newRegion is the region which we are dragging the tab into, * which has draw offset corrections applied */ mDraggedSlot->getDrawOffset (vx, vy); newRegion.translate (vx, vy); foreach (group, mGroups) { bool inTabBar; CompRegion clip, buf; GroupTabBarSlot *slot; if (!group->mTabBar || !HAS_TOP_WIN (group)) continue; /* create clipping region */ clip = GroupWindow::get (TOP_TAB (group))->getClippingRegion (); /* if our tab region doesn't intersect the tabbar at all, * then we aren't in the tab bar, so just check the next group */ buf = newRegion.intersected (group->mTabBar->mRegion); buf = buf.subtracted (clip); inTabBar = !buf.isEmpty (); if (!inTabBar) continue; /* wasInTabBar has a higher scope than here - if it is false * then the window is removed from the parent group */ wasInTabBar = true; foreach (slot, group->mTabBar->mSlots) { GroupTabBarSlot *tmpDraggedSlot; GroupSelection *tmpGroup; CompRegion slotRegion; CompRect rect; bool inSlot; if (slot == mDraggedSlot) continue; /* Construct a rectangle of "acceptable drop area" * for the tab, which is usually in the spring-created space * between the two tabs which we want to drop this one * * It should be this one : * * |-------------------------------| * | |-------| | | |-------|| * | | TAB | | REGION | | TAB || * | |-------| | | |-------|| * |-------------------------------| * ^ * |---------| * | DRAGGED | * |---------| * */ /* If there is a slot to the left, then set the leftmost * point of the insertion region at the rightmost point * of the left slot */ if (slot->mPrev && slot->mPrev != mDraggedSlot) { rect.setX (slot->mPrev->mRegion.boundingRect ().x2 ()); } /* Otherwise if the dragged slot is the previous slot to * this one, then set the leftmost insertion point to * the previous slot to the dragged one (this is so that * the leftmost point isn't set to the rightmost point * on the dragged slot, which obviously results in a * zero-width region) */ else if (slot->mPrev && slot->mPrev == mDraggedSlot && mDraggedSlot->mPrev) { rect.setX (mDraggedSlot->mPrev->mRegion.boundingRect ().x2 ()); } /* Otherwise, this is the left edge of the tab bar, so set * the leftmost point to the leftmost point of the tab bar * region */ else rect.setX (group->mTabBar->mRegion.boundingRect ().x1 ()); /* The Y point of the insertion region is obviously the top * of the tab bar */ rect.setY (slot->mRegion.boundingRect ().y1 ()); /* If there is a slot to the right of this one, and it isn't * the dragged slot, set the width of the region to the * leftmost point of the right slot (minus the x point * of the rect to get a relative width) */ if (slot->mNext && slot->mNext != mDraggedSlot) { const CompRect &r = slot->mNext->mRegion.boundingRect (); rect.setWidth (r.x1 () - rect.x ()); } /* Otherwise, if the slot to the right of this one is the * dragged slot, then check the same thing on the slot * to the right of this one */ else if (slot->mNext && slot->mNext == mDraggedSlot && mDraggedSlot->mNext) { const CompRegion &r = mDraggedSlot->mNext->mRegion; rect.setWidth (r.boundingRect ().x1 () - rect.x ()); } /* Otherwise, this is the rightmost edge of the tab bar, so * set the width to the edge of the tab bar minus the * x-point of insertion region */ else { const CompRect &r = group->mTabBar->mRegion.boundingRect (); rect.setWidth (r.x2 ()); // FIXME: wrong ? } rect.setY (slot->mRegion.boundingRect ().y1 ()); // FIXME: redundant? rect.setHeight (slot->mRegion.boundingRect ().height ()); slotRegion = CompRegion (rect); /* We are ok to insert this slot into the tab bar at this * position if the slot region (newRegion) intersects the * calculated insertion region (slotRegion) */ inSlot = slotRegion.intersects (newRegion); /* If we failed that, try the next slot, and so on */ if (!inSlot) continue; tmpDraggedSlot = mDraggedSlot; /* The window is now in a new group */ if (group != gw->mGroup) { CompWindow *w = mDraggedSlot->mWindow; GroupWindow *gdw = GroupWindow::get (w); GroupSelection *tmpGroup = gw->mGroup; int oldPosX = WIN_CENTER_X (w); int oldPosY = WIN_CENTER_Y (w); /* if the dragged window is not the top tab, move it onscreen */ if (tmpGroup->mTabBar->mTopTab && !IS_TOP_TAB (w, tmpGroup)) { CompWindow *tw = TOP_TAB (tmpGroup); oldPosX = WIN_CENTER_X (tw) + gw->mMainTabOffset.x (); oldPosY = WIN_CENTER_Y (tw) + gw->mMainTabOffset.y (); GroupWindow::get (w)->setWindowVisibility (true); } /* Change the group. */ gdw->deleteGroupWindow (); gdw->addWindowToGroup (group); /* we saved the original center position in oldPosX/Y before - now we should apply that to the new main tab offset */ if (HAS_TOP_WIN (group)) { CompWindow *tw = TOP_TAB (group); gw->mMainTabOffset.setX (oldPosX - WIN_CENTER_X (tw)); gw->mMainTabOffset.setY (oldPosY - WIN_CENTER_Y (tw)); } } else group->mTabBar->unhookTabBarSlot (mDraggedSlot, true); /* reset dragged state */ mDraggedSlot = NULL; mDragged = false; inserted = true; /* Insert the slot before or after depending on the position */ if ((tmpDraggedSlot->mRegion.boundingRect ().x1 () + tmpDraggedSlot->mRegion.boundingRect ().x2 () + (2 * vx)) / 2 > (slot->mRegion.boundingRect ().x1 () + slot->mRegion.boundingRect ().x2 ()) / 2) { group->mTabBar->insertTabBarSlotAfter (tmpDraggedSlot, slot); } else group->mTabBar->insertTabBarSlotBefore (tmpDraggedSlot, slot); group->mTabBar->damageRegion (); /* Hide tab-bars. */ foreach (tmpGroup, mGroups) { if (group == tmpGroup) tmpGroup->tabSetVisibility (true, 0); else tmpGroup->tabSetVisibility (false, PERMANENT); } break; } if (inserted) break; } /* If there was no successful inseration, then remove the * dragged slot from it's original group */ if (!inserted) { CompWindow *draggedSlotWindow = mDraggedSlot->mWindow; GroupWindow *gdsw = GroupWindow::get (draggedSlotWindow); GroupSelection *tmpGroup; foreach (tmpGroup, mGroups) tmpGroup->tabSetVisibility (false, PERMANENT); mDraggedSlot = NULL; mDragged = false; if (optionGetDndUngroupWindow () && !wasInTabBar) { gdsw->removeWindowFromGroup (); } else if (gw->mGroup && gw->mGroup->mTabBar->mTopTab) { gw->mGroup->mTabBar->recalcTabBarPos ( (gw->mGroup->mTabBar->mRegion.boundingRect ().x1 () + gw->mGroup->mTabBar->mRegion.boundingRect ().x2 ()) / 2, gw->mGroup->mTabBar->mRegion.boundingRect ().x1 (), gw->mGroup->mTabBar->mRegion.boundingRect ().x2 ()); } /* to remove the painted slot */ cScreen->damageScreen (); } if (mGrabState == ScreenGrabTabDrag) grabScreen (ScreenGrabNone); if (mDragHoverTimeoutHandle.active ()) { mDragHoverTimeoutHandle.stop (); } } /* * GroupScreen::handleMotionEvent * * When dragging tabs, make sure that we are damaging the screen region around the tab. * Also, if we have "dragged" a "non-dragged" tab enough (>5px) then mark it as "dragged" * and make it's parent tab bar always visible * */ /* the radius to determine if it was a click or a drag */ static const unsigned short RADIUS = 5; void GroupScreen::handleMotionEvent (int xRoot, int yRoot) { /* We are dragging a tab here */ if (mGrabState == ScreenGrabTabDrag) { int dx, dy; CompRegion &draggedRegion = mDraggedSlot->mRegion; dx = xRoot - mPrevX; dy = yRoot - mPrevY; /* Don't want to start dragging the slot unless we have moved * the mouse more than 5px. Don't need to do this calculation * either if we have already set mDragged */ if (mDragged || abs (dx) > RADIUS || abs (dy) > RADIUS) { CompRegion cReg; int vx, vy; int x1, x2, y1, y2; mPrevX = xRoot; mPrevY = yRoot; /* mDragged is not marked, start dragging the slot */ if (!mDragged) { GroupSelection *group; GROUP_WINDOW (mDraggedSlot->mWindow); mDragged = true; foreach (group, mGroups) group->tabSetVisibility (true, PERMANENT); const CompRect &box = gw->mGroup->mTabBar->mRegion.boundingRect (); gw->mGroup->mTabBar->recalcTabBarPos ( (box.x1 () + box.x2 ()) / 2, box.x1 (), box.x2 ()); checkFunctions (); } /* Damage slot region */ mDraggedSlot->getDrawOffset (vx, vy); x1 = draggedRegion.boundingRect ().x1 () + vx; y1 = draggedRegion.boundingRect ().y1 () + vy; x2 = draggedRegion.boundingRect ().x2 () + vx; y2 = draggedRegion.boundingRect ().y2 () + vy; cReg = CompRegion (x1, y1, x2 - x1, y2 - y1); cScreen->damageRegion (cReg); /* Move the slot, adjust the spring */ mDraggedSlot->mRegion.translate (dx, dy); mDraggedSlot->mSpringX = (mDraggedSlot->mRegion.boundingRect ().x1 () + mDraggedSlot->mRegion.boundingRect ().x2 ()) / 2; x1 = draggedRegion.boundingRect ().x1 () + vx; y1 = draggedRegion.boundingRect ().y1 () + vy; x2 = draggedRegion.boundingRect ().x2 () + vx; y2 = draggedRegion.boundingRect ().y2 () + vy; cReg = CompRegion (x1, y1, x2 - x1, y2 - y1); cScreen->damageRegion (cReg); } } else if (mGrabState == ScreenGrabSelect) { mTmpSel.damage (xRoot, yRoot); } } /* * GroupWindow::windowNotify * * Function called on window events - on these events do * certain grouped actions, such as Shade/Unshade, * Minimize/Unminimize etc * */ void GroupWindow::windowNotify (CompWindowNotify n) { GROUP_SCREEN (screen); bool visible = false; if (!mGroup) return window->windowNotify (n); switch (n) { /* Minimize or shade all windows if this window has just * been minimized or shaded */ case CompWindowNotifyShade: mWindowState = GroupWindow::WindowShaded; visible = false; if (mGroup && gs->optionGetShadeAll ()) mGroup->shadeWindows (window, true); break; case CompWindowNotifyMinimize: mWindowState = GroupWindow::WindowMinimized; visible = false; if (mGroup && gs->optionGetMinimizeAll ()) mGroup->minimizeWindows (window, true); break; /* Unminimize/Unshade */ case CompWindowNotifyUnminimize: if (gs->optionGetMinimizeAll ()) mGroup->minimizeWindows (window, false); visible = true; break; case CompWindowNotifyUnshade: if (gs->optionGetShadeAll ()) mGroup->shadeWindows (window, false); visible = true; break; case CompWindowNotifyClose: /* The window was closed. In this case delete the, if * the group is not already ungrouping, then delete * this window from the group */ /* close event */ if (!(mAnimateState & IS_UNGROUPING)) { /* mGroup is going to be set to NULL here, so better * just return early */ deleteGroupWindow (); gs->cScreen->damageScreen (); return window->windowNotify (n); } break; case CompWindowNotifyRestack: /* If there are other windows in this group, then raise * all the windows (but ignore if this group was just * restacked then) */ if (mGroup && !mGroup->mTabBar && (mGroup != gs->mLastRestackedGroup)) { if (gs->optionGetRaiseAll ()) mGroup->raiseWindows (window); } if (window->managed () && !window->overrideRedirect ()) gs->mLastRestackedGroup = mGroup; return window->windowNotify (n); break; default: return window->windowNotify (n); break; } if (visible) mWindowState = WindowNormal; else { /* Since the group is not visible, we can do some * tear-down, for now */ if (mGroup->mTabBar && IS_TOP_TAB (window, mGroup)) { /* on unmap of the top tab, hide the tab bar and the input prevention window */ mGroup->tabSetVisibility (false, PERMANENT); } } return window->windowNotify (n); } /* * GroupScreen::handleEvent * * Wrappable function to handle X11 Events. * * Handle group minimize, unmap, close etc. * */ void GroupScreen::handleEvent (XEvent *event) { CompWindow *w; switch (event->type) { case MotionNotify: handleMotionEvent (pointerX, pointerY); break; case ButtonPress: handleButtonPressEvent (event); break; case ButtonRelease: handleButtonReleaseEvent (event); break; case MapNotify: w = screen->findWindow (event->xmap.window); if (w) { foreach (CompWindow *cw, screen->windows ()) { if (w->id () == cw->frame ()) { /* Should not unmap frame window here */ //if (gw->mWindowHideInfo) //XUnmapWindow (screen->dpy (), cw->frame ()); } } } break; case ClientMessage: /* New active window */ if (event->xclient.message_type == Atoms::winActive) { w = screen->findWindow (event->xclient.window); if (w) { GROUP_WINDOW (w); /* If this window is not the top tab, then change * the top tab to this one */ if (gw->mGroup && gw->mGroup->mTabBar && !IS_TOP_TAB (w, gw->mGroup)) { GroupTabBar *bar = gw->mGroup->mTabBar; bar->mCheckFocusAfterTabChange = true; changeTab (gw->mSlot, GroupTabBar::RotateUncertain); } } } /* The window has a new resize geometry. Note that this isn't * a configureNotify as such, since for some resize modes * (stretch, outline, etc) we don't send them until the window * has been ungrabbed. However, we still need to know the * current resize geometry of the window, so the resize plugin * will tell us this */ else if (event->xclient.message_type == mResizeNotifyAtom) { CompWindow *w; w = screen->findWindow (event->xclient.window); if (!w) break; foreach (GroupSelection *group, mGroups) { /* Don't bother handling this window if the group isn't * being resized or if this is the currently primary * window */ if (!(group->mResizeInfo && w == group->mResizeInfo->mResizedWindow)) continue; if (group) { CompRect rect (event->xclient.data.l[0], event->xclient.data.l[1], event->xclient.data.l[2], event->xclient.data.l[3]); group->prepareResizeWindows (rect); } } } break; default: /* Shape Notify events can mess up our cleared input shape, * so just handle them and save/clear the shape again */ if (event->type == screen->shapeEvent () + ShapeNotify) { XShapeEvent *se = (XShapeEvent *) event; if (se->kind == ShapeInput) { CompWindow *w; w = screen->findWindow (se->window); if (w) { GROUP_WINDOW (w); if (gw->mWindowHideInfo) gw->clearWindowInputShape (gw->mWindowHideInfo); } } } break; } screen->handleEvent (event); switch (event->type) { /* Window got a new name, update the tab bar text */ case PropertyNotify: if (event->xproperty.atom == Atoms::wmName) { CompWindow *w; w = screen->findWindow (event->xproperty.window); if (w) { GROUP_WINDOW (w); if (gw->mGroup && gw->mGroup->mTabBar && gw->mGroup->mTabBar->mTextSlot && gw->mGroup->mTabBar->mTextSlot->mWindow == w) { /* make sure we are using the updated name */ TextLayer *l = gw->mGroup->mTabBar->mTextLayer; gw->mGroup->mTabBar->mTextLayer = TextLayer::rebuild (l); if (gw->mGroup->mTabBar->mTextLayer) gw->mGroup->mTabBar->mTextLayer->render (); gw->mGroup->mTabBar->damageRegion (); } } } break; case EnterNotify: { CompWindow *w; w = screen->findWindow (event->xcrossing.window); /* Whenever we enter a new window, we must update the screen * to only show relevant tab bars */ updateTabBars (event->xcrossing.window); if (w) { GROUP_WINDOW (w); if (mShowDelayTimeoutHandle.active ()) mShowDelayTimeoutHandle.stop (); if (gw->mGroup) { /* If we are dragging a slot over this window, then * set a timer to raise the window after a certain * amount of time */ if (mDraggedSlot && mDragged && IS_TOP_TAB (w, gw->mGroup)) { int hoverTime; hoverTime = optionGetDragHoverTime () * 1000; if (mDragHoverTimeoutHandle.active ()) mDragHoverTimeoutHandle.stop (); if (hoverTime > 0) { mDragHoverTimeoutHandle.setCallback ( boost::bind ( &GroupWindow::dragHoverTimeout, gw)); mDragHoverTimeoutHandle.setTimes (hoverTime, hoverTime * 1.2); mDragHoverTimeoutHandle.start (); } } } } } break; case ConfigureNotify: { CompWindow *w; w = screen->findWindow (event->xconfigure.window); if (w) { GROUP_WINDOW (w); /* Window with tab bar restacked, restack the IPW */ if (gw->mGroup && gw->mGroup->mTabBar && IS_TOP_TAB (w, gw->mGroup) && gw->mGroup->mTabBar->mInputPrevention && gw->mGroup->mTabBar->mIpwMapped) { XWindowChanges xwc; xwc.stack_mode = Above; xwc.sibling = w->id (); XConfigureWindow (screen->dpy (), gw->mGroup->mTabBar->mInputPrevention, CWSibling | CWStackMode, &xwc); } } } break; default: break; } } /* * GroupWindow::resizeNotify * * Description: We get resizeNotify once the window is actually * configured (note the difference between the COMPIZ_RESIZE_NOTIFY) * ClientMessage above. * * If this window had a resize geometry, set it to zero-size. If * the window had glow quads, we need to recalculate them. We also * need to recalculate the tab bar position. * * Note that we don't handle grouped resize here, since that would * mean that we have to handle queuing (since the function is wrapped). * Instead we handle that in ConfigureNotify in * GroupScreen::handleEvent above. * */ void GroupWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { GROUP_SCREEN (screen); if (!mResizeGeometry.isEmpty ()) { mResizeGeometry = CompRect (0, 0, 0, 0); } window->resizeNotify (dx, dy, dwidth, dheight); if (mGlowQuads) { /* FIXME: we need to find a more multitexture friendly way * of doing this */ GLTexture::Matrix tMat = gs->mGlowTexture.at (0)->matrix (); computeGlowQuads (&tMat); } /* If this was the top tab, then re-center the tab bar */ if (mGroup && mGroup->mTabBar && IS_TOP_TAB (window, mGroup)) { if (mGroup->mTabBar->mState != PaintOff) { mGroup->mTabBar->recalcTabBarPos (pointerX, WIN_X (window), WIN_X (window) + WIN_WIDTH (window)); } } } /* * GroupWindow::moveNotify * * We need to recalculate the glow quads here (since the position * changed, and they are contained in the quads). We also need to * update the tab bar positon and move windows in the group (queued). * */ void GroupWindow::moveNotify (int dx, int dy, bool immediate) { bool viewportChange; GROUP_SCREEN (screen); window->moveNotify (dx, dy, immediate); /* mGlowQuads contains positional info, so we need to recalc that */ if (mGlowQuads) { /* FIXME: we need to find a more multitexture friendly way * of doing this */ GLTexture::Matrix tMat = gs->mGlowTexture.at (0)->matrix (); computeGlowQuads (&tMat); } /* Don't bother if the window is not grouped */ if (!mGroup || gs->mQueued) return; /* FIXME: we need a reliable, 100% safe way to detect window moves caused by viewport changes here */ viewportChange = ((dx && !(dx % screen->width ())) || (dy && !(dy % screen->height ()))); /* If the viewport changes and the tab bar is tabbing or untabbing * then add the viewport change distance to the animation (since * we are overriding where the window is painted) */ if (viewportChange && (mAnimateState & IS_ANIMATED)) { mDestination += CompPoint (dx, dy); } /* If we are moving a window with a tab bar, then make the tab * bar springy and move it too */ if (mGroup->mTabBar && IS_TOP_TAB (window, mGroup)) { GroupTabBarSlot *slot; GroupTabBar *bar = mGroup->mTabBar; bar->mRightSpringX += dx; bar->mLeftSpringX += dx; bar->moveTabBarRegion (dx, dy, true); foreach (slot, bar->mSlots) { slot->mRegion.translate (dx, dy); slot->mSpringX += dx; } } /* Don't bother moving all group windows if we are not moving all * ignoring group actions, or if we are currently in a tabbing * animation or if the grabbed window isn't this one (can be caused * by moveNotifies when moving other group windows) * or if we aren't grabbed this window for a move */ if (!gs->optionGetMoveAll () || gs->mIgnoreMode || (mGroup->mTabbingState != GroupSelection::NoTabbing) || (mGroup->mGrabWindow != window->id ()) || !(mGroup->mGrabMask & CompWindowGrabMoveMask)) { return; } mGroup->moveWindows (window, dx, dy, immediate, viewportChange); } /* * GroupWindow::grabNotify * * Description: when the window is grabbed, it might be grabbed * for a resize, in which case we need to set up the resize-all bits * (including resize geometry) */ void GroupWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { GROUP_SCREEN (screen); gs->mLastGrabbedWindow = window->id (); if (mGroup && !gs->mIgnoreMode && !gs->mQueued) { bool doResizeAll; doResizeAll = gs->optionGetResizeAll () && (mask & CompWindowGrabResizeMask); /* Make the tab bar invisible for now */ if (mGroup->mTabBar) mGroup->tabSetVisibility (false, 0); foreach (CompWindow *cw, mGroup->mWindows) { if (!cw) continue; if (cw->id () != window->id ()) { GroupWindow *gcw = GroupWindow::get (cw); /* Enqueue a grabNotify (since this function is * wrapped) */ gcw->enqueueGrabNotify (x, y, state, mask); if (doResizeAll && !(cw->state () & MAXIMIZE_STATE)) { if (gcw->mResizeGeometry.isEmpty ()) { gcw->mResizeGeometry = CompRect (WIN_X (cw), WIN_Y (cw), WIN_WIDTH (cw), WIN_HEIGHT (cw)); gcw->checkFunctions (); } } } } /* Set up a new master resize info with this window as the * master window and the current geometry as the master geometry */ if (doResizeAll) { if (!mGroup->mResizeInfo) mGroup->mResizeInfo = new GroupSelection::ResizeInfo; if (mGroup->mResizeInfo) { mGroup->mResizeInfo->mResizedWindow = window; mGroup->mResizeInfo->mOrigGeometry = CompRect (WIN_X (window), WIN_Y (window), WIN_WIDTH (window), WIN_HEIGHT (window)); } } mGroup->mGrabWindow = window->id (); mGroup->mGrabMask = mask; } gs->checkFunctions (); window->grabNotify (x, y, state, mask); } /* * GroupWindow::ungrabNotify * * When the window is ungrabbed, resize them according to our set * resizeGeometry (handled in mGroup->resizeWindows) */ void GroupWindow::ungrabNotify () { GROUP_SCREEN (screen); gs->mLastGrabbedWindow = None; if (mGroup && !gs->mIgnoreMode && !gs->mQueued) { mGroup->resizeWindows (window); // should really include the size info here } gs->checkFunctions (); window->ungrabNotify (); } /* * GroupWindow::damageRect * * A request was made to damage everything in this window. * * If this window just appeared (initial) then add it to an autotabbed * group if we are doing that. Or it might be the case that the window * was just unshaded or unminimzied (initial as well) so apply * those actions to the group too * * Otherwise, damage the stretch rectangle for the window, damage * the slot (since the group was just updated) */ bool GroupWindow::damageRect (bool initial, const CompRect &rect) { bool status; GROUP_SCREEN (screen); status = cWindow->damageRect (initial, rect); /* Window just appeared */ if (initial) { if ((gs->optionGetAutotabWindows ().size () || gs->optionGetAutotabCreate ()) && !mGroup && mWindowState == WindowNormal) { GroupSelection *g = NULL; /* First check if this window should be added to an * existing group */ foreach (CompOption::Value &v, gs->optionGetAutotabWindows ()) { if (v.match ().evaluate (window)) { bool foundGroup = false; foreach (GroupSelection *lg, gs->mGroups) { foreach (CompWindow *w, lg->mWindows) { if (v.match ().evaluate (w)) { foundGroup = true; g = lg; break; } } if (foundGroup) break; } if (foundGroup) break; } } if (!g) { gs->mTmpSel.clear (); gs->mTmpSel.select (window); g = gs->mTmpSel.toGroup (); } else { addWindowToGroup (g); } /* If 'g' is NULL here then a new group will be created * so better use mGroup here instead */ if (g) g->tabGroup (window); } checkFunctions (); // we don't need damageRect after this } /* Damage resize rectangle */ if (!mResizeGeometry.isEmpty ()) { CompRect box; float dummy = 1; getStretchRectangle (box, dummy, dummy); gs->damagePaintRectangle (box); } /* Damage slot */ if (mSlot) { int vx, vy; CompRegion reg; mSlot->getDrawOffset (vx, vy); if (vx || vy) { reg = reg.united (mSlot->mRegion); reg.translate (vx, vy); } else reg = mSlot->mRegion; gs->cScreen->damageRegion (reg); } return status; } /* * GroupWindow::stateChangeNotify * * A change to the window state was detected (could be maximization) * so if it was, then apply that to the group (if applicable) */ void GroupWindow::stateChangeNotify (unsigned int lastState) { GROUP_SCREEN (screen); if (mGroup && !gs->mIgnoreMode) { if (((lastState & MAXIMIZE_STATE) != (window->state () & MAXIMIZE_STATE)) && gs->optionGetMaximizeUnmaximizeAll ()) { mGroup->maximizeWindows (window); } } window->stateChangeNotify (lastState); } /* * GroupWindow::activate * * Window got activated, change the tab to the new active window */ void GroupWindow::activate () { GROUP_SCREEN (screen); if (mGroup && mGroup->mTabBar && !IS_TOP_TAB (window, mGroup)) gs->changeTab (mSlot, GroupTabBar::RotateUncertain); window->activate (); } compiz-0.9.11+14.04.20140409/plugins/group/src/glow.cpp0000644000015301777760000004117412321343002022561 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * glow.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" #include "group_glow.h" const unsigned short GLOWQUAD_TOPLEFT = 0; const unsigned short GLOWQUAD_TOPRIGHT = 1; const unsigned short GLOWQUAD_BOTTOMLEFT = 2; const unsigned short GLOWQUAD_BOTTOMRIGHT = 3; const unsigned short GLOWQUAD_TOP = 4; const unsigned short GLOWQUAD_BOTTOM = 5; const unsigned short GLOWQUAD_LEFT = 6; const unsigned short GLOWQUAD_RIGHT = 7; const unsigned short NUM_GLOWQUADS = 8; const GlowTextureProperties glowTextureProperties[2] = { /* GlowTextureRectangular */ {glowTexRect, 32, 21}, /* GlowTextureRing */ {glowTexRing, 32, 16} }; /* * GroupWindow::getOutputExtents * * Wrappable function, return the extents of how much we expect to be painting * on the window including the glow (since the glow goes outside the default * clip region, so we need to let core know that the clip region needs to be * /slightly/ larger * */ void GroupWindow::getOutputExtents (CompWindowExtents &output) { GROUP_SCREEN (screen); window->getOutputExtents (output); /* Only bother if this window would have glow */ if (mGroup && mGroup->mWindows.size () > 1) { int glowSize = gs->optionGetGlowSize (); int glowType = gs->optionGetGlowType (); int glowTextureSize = gs->mGlowTextureProperties[glowType].textureSize; int glowOffset = gs->mGlowTextureProperties[glowType].glowOffset; glowSize = glowSize * (glowTextureSize - glowOffset) / glowTextureSize; /* glowSize is the size of the glow outside the window decoration * (w->border), while w->output includes the size of w->border * this is why we have to add w->input here */ output.left = MAX (output.left, glowSize + window->border ().left); output.right = MAX (output.right, glowSize + window->border ().right); output.top = MAX (output.top, glowSize + window->border ().top); output.bottom = MAX (output.bottom, glowSize + window->border ().bottom); } } /* * GroupWindow::paintGlow * * Takes our glow texture, stretches the appropriate positions in the glow texture, * adds those geometries (so plugins like wobby and deform this texture correctly) * and then draws the glow texture with this geometry (plugins like wobbly and friends * will automatically deform the texture based on our set geometry) */ void GroupWindow::paintGlow (GLFragment::Attrib &attrib, const CompRegion &paintRegion, unsigned int mask) { CompRegion reg; int i; GROUP_SCREEN (screen); /* There are 8 glow parts of the glow texture which we wish to paint * separately with different transformations */ for (i = 0; i < NUM_GLOWQUADS; i++) { /* Using precalculated quads here */ reg = CompRegion (mGlowQuads[i].mBox); if (reg.boundingRect ().x1 () < reg.boundingRect ().x2 () && reg.boundingRect ().y1 () < reg.boundingRect ().y2 ()) { GLTexture::MatrixList matl; reg = CompRegion (reg.boundingRect ().x1 (), reg.boundingRect ().y1 (), reg.boundingRect ().width (), reg.boundingRect ().height ()); matl.push_back (mGlowQuads[i].mMatrix); gWindow->glAddGeometry (matl, reg, paintRegion); } } /* If the geometry add succeeded */ if (gWindow->geometry ().vertices) { GLFragment::Attrib fAttrib (attrib); GLushort average; GLushort color[3] = {mGroup->mColor[0], mGroup->mColor[1], mGroup->mColor[2]}; /* Apply brightness to color. */ color[0] *= (float)attrib.getBrightness () / BRIGHT; color[1] *= (float)attrib.getBrightness () / BRIGHT; color[2] *= (float)attrib.getBrightness () / BRIGHT; /* Apply saturation to color. */ average = (color[0] + color[1] + color[2]) / 3; color[0] = average + (color[0] - average) * attrib.getSaturation () / COLOR; color[1] = average + (color[1] - average) * attrib.getSaturation () / COLOR; color[2] = average + (color[2] - average) * attrib.getSaturation () / COLOR; fAttrib.setOpacity (OPAQUE); fAttrib.setSaturation (COLOR); fAttrib.setBrightness (BRIGHT); gs->gScreen->setTexEnvMode (GL_MODULATE); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4us (color[0], color[1], color[2], attrib.getOpacity ()); /* we use PAINT_WINDOW_TRANSFORMED_MASK here to force the usage of a good texture filter */ foreach (GLTexture *tex, gs->mGlowTexture) { gWindow->glDrawTexture (tex, fAttrib, mask | PAINT_WINDOW_BLEND_MASK | PAINT_WINDOW_TRANSLUCENT_MASK | PAINT_WINDOW_TRANSFORMED_MASK); } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); gs->gScreen->setTexEnvMode (GL_REPLACE); glColor4usv (defaultColor); } } /* * GroupWindow::computeGlowQuads * * This function computures the matrix transformation required for each * part of the glow texture which we wish to stretch to some rectangular * dimensions * * There are eight quads different parts of the texture which we wish to * paint here, the 4 sides and four corners, eg: * * ------------------ * | 1 | 4 | 6 | * ------------- ------------------ * | 1 | 4 | 6 | | | | | * ------------- | | | | * | 2 | n | 7 | -> | 2 | n | 7 | * ------------- | | | | * | 3 | 5 | 8 | | | | | * ------------- ------------------ * | 3 | 5 | 8 | * ------------------ * * In this example here, 2, 4, 5 and 7 are stretched, and the matrices for * each quad rect adjusted accordingly for it's size compared to the original * texture size. * * When we are adjusting the matrices here, the initial size of each corner has * a size of of "1.0f", so according to 2x2 matrix rules, * the scale factor is the inverse of the size of the glow (which explains * while you will see here that matrix->xx is (1 / glowSize) * where glowSize is the size the user specifies they want their glow to extend. * (likewise, matrix->yy is adjusted similarly for corners and for top/bottom) * * matrix->x0 and matrix->y0 here are set to be the top left edge of the rect * adjusted by the matrix scale factor (matrix->xx and matrix->yy) * */ void GroupWindow::computeGlowQuads (GLTexture::Matrix *matrix) { CompRect *box; int x1, x2, y1, y2; GLTexture::Matrix *quadMatrix; int glowSize, glowOffset; int glowType; CompWindow *w = window; GROUP_SCREEN (screen); /* Passing NULL to this function frees the glow quads * (so the window is not painted with glow) */ if (gs->optionGetGlow () && matrix) { if (!mGlowQuads) mGlowQuads = new GlowQuad[NUM_GLOWQUADS]; if (!mGlowQuads) return; } else { if (mGlowQuads) { delete[] mGlowQuads; mGlowQuads = NULL; } return; } glowSize = gs->optionGetGlowSize (); glowType = gs->optionGetGlowType (); glowOffset = (glowSize * gs->mGlowTextureProperties[glowType].glowOffset / gs->mGlowTextureProperties[glowType].textureSize) + 1; /* Top left corner */ box = &mGlowQuads[GLOWQUAD_TOPLEFT].mBox; mGlowQuads[GLOWQUAD_TOPLEFT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_TOPLEFT].mMatrix; /* Set the desired rect dimensions * for the part of the glow we are painting */ x1 = WIN_REAL_X (w) - glowSize + glowOffset; y1 = WIN_REAL_Y (w) - glowSize + glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling both parts of the texture in a positive direction * here (left to right top to bottom) * * The base position (x0 and y0) here requires us to move backwards * on the x and y dimensions by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = 1.0f / glowSize; quadMatrix->yy = 1.0f / (glowSize); quadMatrix->x0 = -(x1 * quadMatrix->xx); quadMatrix->y0 = -(y1 * quadMatrix->yy); x2 = MIN (WIN_REAL_X (w) + glowOffset, WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2)); y2 = MIN (WIN_REAL_Y (w) + glowOffset, WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2)); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Top right corner */ box = &mGlowQuads[GLOWQUAD_TOPRIGHT].mBox; mGlowQuads[GLOWQUAD_TOPRIGHT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_TOPRIGHT].mMatrix; /* Set the desired rect dimensions * for the part of the glow we are painting */ x1 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset; y1 = WIN_REAL_Y (w) - glowSize + glowOffset; x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) + glowSize - glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling the y part of the texture in a positive direction * and the x part in a negative direction here * (right to left top to bottom) * * The base position (x0 and y0) here requires us to move backwards * on the y dimension and forwards on x by the calculated rect dimensions * multiplied by the scale factors (since we are moving forward on x we * need the inverse of that which is 1 - x1 * xx */ quadMatrix->xx = -1.0f / glowSize; quadMatrix->yy = 1.0f / glowSize; quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx); quadMatrix->y0 = -(y1 * quadMatrix->yy); x1 = MAX (WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset, WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2)); y2 = MIN (WIN_REAL_Y (w) + glowOffset, WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2)); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Bottom left corner */ box = &mGlowQuads[GLOWQUAD_BOTTOMLEFT].mBox; mGlowQuads[GLOWQUAD_BOTTOMLEFT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOMLEFT].mMatrix; x1 = WIN_REAL_X (w) - glowSize + glowOffset; y1 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset; x2 = WIN_REAL_X (w) + glowOffset; y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) + glowSize - glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling the x part of the texture in a positive direction * and the y part in a negative direction here * (left to right bottom to top) * * The base position (x0 and y0) here requires us to move backwards * on the x dimension and forwards on y by the calculated rect dimensions * multiplied by the scale factors (since we are moving forward on x we * need the inverse of that which is 1 - y1 * yy */ quadMatrix->xx = 1.0f / glowSize; quadMatrix->yy = -1.0f / glowSize; quadMatrix->x0 = -(x1 * quadMatrix->xx); quadMatrix->y0 = 1.0f - (y1 * quadMatrix->yy); y1 = MAX (WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset, WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2)); x2 = MIN (WIN_REAL_X (w) + glowOffset, WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2)); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Bottom right corner */ box = &mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mBox; mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mMatrix; x1 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset; y1 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset; x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) + glowSize - glowOffset; y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) + glowSize - glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling the both parts of the texture in a negative direction * (right to left bottom to top) * * The base position (x0 and y0) here requires us to move forwards * on both dimensions by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = -1.0f / glowSize; quadMatrix->yy = -1.0f / glowSize; quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx); quadMatrix->y0 = 1.0 - (y1 * quadMatrix->yy); x1 = MAX (WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset, WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2)); y1 = MAX (WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset, WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2)); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Top edge */ box = &mGlowQuads[GLOWQUAD_TOP].mBox; mGlowQuads[GLOWQUAD_TOP].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_TOP].mMatrix; x1 = WIN_REAL_X (w) + glowOffset; y1 = WIN_REAL_Y (w) - glowSize + glowOffset; x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset; y2 = WIN_REAL_Y (w) + glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the x part of the texture here, but we * are scaling on the y part in a positive direciton * * The base position (y0) here requires us to move backwards * on the x dimension and forwards on y by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = 0.0f; quadMatrix->yy = 1.0f / glowSize; quadMatrix->x0 = 1.0; quadMatrix->y0 = -(y1 * quadMatrix->yy); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Bottom edge */ box = &mGlowQuads[GLOWQUAD_BOTTOM].mBox; mGlowQuads[GLOWQUAD_BOTTOM].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOM].mMatrix; x1 = WIN_REAL_X (w) + glowOffset; y1 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset; x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset; y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) + glowSize - glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the x part of the texture here, but we * are scaling on the y part in a negative direciton * * The base position (y0) here requires us to move forwards * on y by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = 0.0f; quadMatrix->yy = -1.0f / glowSize; quadMatrix->x0 = 1.0; quadMatrix->y0 = 1.0 - (y1 * quadMatrix->yy); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Left edge */ box = &mGlowQuads[GLOWQUAD_LEFT].mBox; mGlowQuads[GLOWQUAD_LEFT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_LEFT].mMatrix; x1 = WIN_REAL_X (w) - glowSize + glowOffset; y1 = WIN_REAL_Y (w) + glowOffset; x2 = WIN_REAL_X (w) + glowOffset; y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the y part of the texture here, but we * are scaling on the x part in a positive direciton * * The base position (x0) here requires us to move backwards * on x by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = 1.0f / glowSize; quadMatrix->yy = 0.0f; quadMatrix->x0 = -(x1 * quadMatrix->xx); quadMatrix->y0 = 1.0; *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Right edge */ box = &mGlowQuads[GLOWQUAD_RIGHT].mBox; mGlowQuads[GLOWQUAD_RIGHT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_RIGHT].mMatrix; x1 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset; y1 = WIN_REAL_Y (w) + glowOffset; x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) + glowSize - glowOffset; y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the y part of the texture here, but we * are scaling on the x part in a negative direciton * * The base position (x0) here requires us to move forwards * on x by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = -1.0f / glowSize; quadMatrix->yy = 0.0f; quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx); quadMatrix->y0 = 1.0; *box = CompRect (x1, y1, x2 - x1, y2 - y1); } compiz-0.9.11+14.04.20140409/plugins/group/src/glow.h0000644000015301777760000000375112321343002022225 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * glow.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef _GROUP_GLOW_H #define _GROUP_GLOW_H #include "group.h" extern const unsigned short GLOWQUAD_TOPLEFT; extern const unsigned short GLOWQUAD_TOPRIGHT; extern const unsigned short GLOWQUAD_BOTTOMLEFT; extern const unsigned short GLOWQUAD_BOTTOMRIGHT; extern const unsigned short GLOWQUAD_TOP; extern const unsigned short GLOWQUAD_BOTTOM; extern const unsigned short GLOWQUAD_LEFT; extern const unsigned short GLOWQUAD_RIGHT; extern const unsigned short NUM_GLOWQUADS; /* Represents a particular glow texture, so here * we have hardcoded in the texture data, the offset * and the size of the texture */ typedef struct _GlowTextureProperties { char *textureData; int textureSize; int glowOffset; } GlowTextureProperties; /* Each glow quad contains a 2x2 scale + positional matrix * (the 3rd column is not used since that is for matrix skew * operations which we do not care about) * and also a CompRect which describes the size and position of * the quad on the glow */ class GlowQuad { public: CompRect mBox; GLTexture::Matrix mMatrix; }; extern const GlowTextureProperties glowTextureProperties[2]; #endif compiz-0.9.11+14.04.20140409/plugins/group/src/layers.h0000644000015301777760000001150612321343002022551 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * layers.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef _GROUP_LAYERS_H #define _GROUP_LAYERS_H #include "group.h" typedef enum { PaintOff = 0, PaintFadeIn, PaintFadeOut, PaintOn, PaintPermanentOn } PaintState; class Layer : public CompSize { public: Layer (const CompSize &size, GroupSelection *g) : CompSize::CompSize (size), mGroup (g), mState (PaintOff), mAnimationTime (0) {}; virtual ~Layer () {} virtual void damage () {}; GroupSelection *mGroup; PaintState mState; int mAnimationTime; }; class GLLayer : public Layer { public: GLLayer (const CompSize &size, GroupSelection *g) : Layer::Layer (size, g) {} public: virtual ~GLLayer () {} virtual void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask) = 0; }; class TextureLayer : public GLLayer { public: TextureLayer (const CompSize &size, GroupSelection *g) : GLLayer::GLLayer (size, g), mPaintWindow (NULL) {} public: void setPaintWindow (CompWindow *); virtual void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask); public: GLTexture::List mTexture; CompWindow *mPaintWindow; /* the window we are going to * paint with geometry */ }; class CairoLayer : public TextureLayer { public: virtual ~CairoLayer (); public: void clear (); virtual void render () = 0; virtual void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask) = 0; public: /* used if layer is used for cairo drawing */ unsigned char *mBuffer; cairo_surface_t *mSurface; cairo_t *mCairo; bool mFailed; protected: CairoLayer (const CompSize &size, GroupSelection *group); }; class BackgroundLayer : public CairoLayer { public: typedef enum { AnimationNone = 0, AnimationPulse, AnimationReflex } AnimationType; public: virtual ~BackgroundLayer () {} static BackgroundLayer * create (CompSize, GroupSelection *); static BackgroundLayer * rebuild (BackgroundLayer *, CompSize); void render (); void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask); bool handleAnimation (int msSinceLastPaint); public: /* For animations */ int mBgAnimationTime; AnimationType mBgAnimation; private: BackgroundLayer (const CompSize &size, GroupSelection *group); }; class SelectionLayer : public CairoLayer { public: virtual ~SelectionLayer () {} static SelectionLayer * create (CompSize, GroupSelection *); static SelectionLayer * rebuild (SelectionLayer *, CompSize); void render (); void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask); private: SelectionLayer (const CompSize &size, GroupSelection *group) : CairoLayer::CairoLayer (size, group) {} }; class TextLayer : public TextureLayer { public: virtual ~TextLayer () {} static TextLayer * create (CompSize &, GroupSelection *); static TextLayer * rebuild (TextLayer *); void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask); void render (); private: TextLayer (const CompSize &size, GroupSelection *g) : TextureLayer::TextureLayer (size, g), mPixmap (None) {} public: /* used if layer is used for text drawing */ Pixmap mPixmap; }; #endif compiz-0.9.11+14.04.20140409/plugins/group/src/selection.cpp0000644000015301777760000002235412321343002023575 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * selection.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" /* * GroupWindow::windowInRegion * * Determine if a prescribed region intersects a window and determine * if the region intersects an adequate percentage of that window * (specified by precision) intersects the window * */ bool GroupWindow::windowInRegion (CompRegion src, float precision) { int area = 0; CompRegion buf; /* Intersecting region */ buf = window->region ().intersected (src); /* buf area */ for (int i = 0; i < buf.numRects (); i++) { CompRect box = buf.rects ().at (i); area += (box.width ()) * (box.height ()); /* width * height */ } if (area >= WIN_WIDTH (window) * WIN_HEIGHT (window) * precision) { src = window->region ().subtracted (src); return true; } return false; } /* * groupFindGroupInWindows * * Inline utility function, returns true if a group is in a list * of windows * */ static inline bool groupFindGroupInWindows (GroupSelection *group, CompWindowList &windows) { foreach (CompWindow *cw, windows) { GROUP_WINDOW (cw); if (gw->mGroup == group) return true; } return false; } /* * groupFindWindowsInRegion * * Utility function, finds all the windows in a region and returns * a list of them. * */ static CompWindowList * groupFindWindowsInRegion (CompRegion reg) { GROUP_SCREEN (screen); float precision = gs->optionGetSelectPrecision () / 100.0f; CompWindowList *ret; CompWindowList::reverse_iterator rit = screen->windows ().rbegin (); ret = new CompWindowList (); if (!ret) return NULL; /* Go back-to-front with selection */ while (rit != screen->windows ().rend ()) { CompWindow *w = *rit; GROUP_WINDOW (w); /* If the window is groupable and in our region */ if (gw->isGroupWindow () && gw->windowInRegion (reg, precision)) { /* Don't bother if this window has a group and there are * windows from this group in the selection (all windows * from the group get added to the selection automatically) */ if (gw->mGroup && groupFindGroupInWindows (gw->mGroup, *ret)) { ++rit; continue; } ret->push_back (w); } ++rit; } return ret; } /* * Selection::deselect (CompWindow variant) * * Remove a window from selection * */ void Selection::deselect (CompWindow *w) { if (size ()) { GroupWindow::get (w)->checkFunctions (); CompositeWindow::get (w)->addDamage (); remove (w); } GroupWindow::get (w)->mInSelection = false; } /* * Selection::deselect (GroupSelection variant) * * Deselect all windows in a group, but don't just call * deselect on all windows in the group since that is slow, instead * compare lists and pop matching windows */ void Selection::deselect (GroupSelection *group) { /* unselect group */ CompWindowList copy = (CompWindowList) *this; CompWindowList::iterator it = begin (); int nsize = size () - group->mWindows.size (); unsigned int num = MAX (0, nsize); /* Faster than doing groupDeleteSelectionWindow for each window in this group. */ resize (num); foreach (CompWindow *cw, copy) { GROUP_WINDOW (cw); if (gw->mGroup == group) { gw->mInSelection = false; gw->checkFunctions (); gw->cWindow->addDamage (); continue; } (*it) = cw; ++it; } } /* * Selection::select * * Add a CompWindow to this selection (animate its fade too) * */ void Selection::select (CompWindow *w) { GROUP_WINDOW (w); /* filter out windows we don't want to be groupable */ if (!gw->isGroupWindow ()) return; push_back (w); gw->mInSelection = true; gw->checkFunctions (); gw->cWindow->addDamage (); } /* * Selection::select * * Add a group to this selection (select every window in the group) * */ void Selection::select (GroupSelection *g) { foreach (CompWindow *cw, g->mWindows) select (cw); } /* * Selection::selectRegion * * Selects all windows in the mouse selection region * */ void Selection::selectRegion () { GROUP_SCREEN (screen); CompRegion reg; CompRect rect; CompWindowList *ws; int x = MIN (mX1, mX2) - 2; int y = MIN (mY1, mY2) - 2; int width = MAX (mX1, mX2) - MIN (mX1, mX2) + 4; int height = MAX (mY1, mY2) - MIN (mY1, mY2) + 4; rect = CompRect (x, y, width, height); reg = emptyRegion.united (rect); gs->cScreen->damageRegion (reg); ws = groupFindWindowsInRegion (reg); if (ws->size ()) { /* (un)select windows */ foreach (CompWindow *w, *ws) checkWindow (w); if (gs->optionGetAutoGroup ()) { toGroup (); } } delete ws; } /* * Selection::toGroup * * Create a new group from this selection. Also "unselect" all of these * windows since they are grouped now! * */ GroupSelection * Selection::toGroup () { if (!empty ()) { CompWindowList::iterator it = begin (); CompWindow *cw; GroupSelection *group = NULL; bool tabbed = false; /* Try to find existing groups in this selection and * add windows to that rather than going and creating new * groups */ foreach (cw, *this) { GROUP_WINDOW (cw); if (gw->mGroup) { if (!tabbed || group->mTabBar) group = gw->mGroup; if (group->mTabBar) tabbed = true; } } if (!group) { /* create new group */ group = new GroupSelection (); if (!group) return NULL; GroupScreen::get (screen)->mGroups.push_front (group); } for (; it != end (); ++it) { cw = *it; GROUP_WINDOW (cw); if (gw->mGroup && (group != gw->mGroup)) gw->deleteGroupWindow (); gw->addWindowToGroup (group); gw->cWindow->addDamage (); gw->mInSelection = false; } /* exit selection */ clear (); return group; } return NULL; } /* * Selection::checkWindow * * Select or deselect a window or group if this window has one. * */ void Selection::checkWindow (CompWindow *w) { GROUP_WINDOW (w); if (gw->mInSelection) { if (gw->mGroup) { deselect (gw->mGroup); } else { /* unselect single window */ deselect (w); } } else { if (gw->mGroup) { /* select group */ select (gw->mGroup); } else { /* select single window */ select (w); } } } /* * GroupScreen::selectSingle * * Action to select a single window * */ bool GroupScreen::selectSingle (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); if (w) mTmpSel.checkWindow (w); return true; } /* * GroupScreen::select * * Action to initiate the dragging of the selection rect * */ bool GroupScreen::select (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mGrabState == ScreenGrabNone) { grabScreen (ScreenGrabSelect); if (state & CompAction::StateInitButton) { action->setState (state | CompAction::StateTermButton); } mTmpSel.mX1 = mTmpSel.mX2 = pointerX; mTmpSel.mY1 = mTmpSel.mY2 = pointerY; } return true; } /* * GroupSelection::selectTerminate * * Action to terminate selection rect and select all windows in that * rect. * */ bool GroupScreen::selectTerminate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mGrabState == ScreenGrabSelect) { grabScreen (ScreenGrabNone); if (mTmpSel.mX1 != mTmpSel.mX2 && mTmpSel.mY1 != mTmpSel.mY2) { mTmpSel.selectRegion (); } } action->setState (action->state () & ~(CompAction::StateTermButton | CompAction::StateTermKey)); return false; } /* * Selection::damage * * Damage the selection rect * */ void Selection::damage (int xRoot, int yRoot) { GROUP_SCREEN (screen); CompRegion reg = CompRegion (MIN (mX1, mX2) - 5, MIN (mY1, mY2) - 5, MAX (mX1, mX2) - MIN (mX1, mX2) + 10, MAX (mY1, mY2) - MIN (mY1, mY2) + 10); gs->cScreen->damageRegion (reg); mX2 = xRoot; mY2 = yRoot; reg = CompRegion (MIN (mX1, mX2) - 5, MIN (mY1, mY2) - 5, MAX (mX1, mX2) - MIN (mX1, mX2) + 10, MAX (mY1, mY2) - MIN (mY1, mY2) + 10); gs->cScreen->damageRegion (reg); } compiz-0.9.11+14.04.20140409/plugins/group/group.xml.in0000644000015301777760000004534312321343002022603 0ustar pbusernogroup00000000000000 <_short>Group and Tab Windows <_long>With this plugin you can group and tab windows Window Management opengl mousepoll fade place text <_short>Selection <_short>Key bindings <_short>Grouping <_short>Key bindings <_short>Tabbing <_short>Key bindings <_short>Glow <_short>Key bindings <_short>General <_short>Selection <_short>Options <_short>Colors <_short>Tabbing <_short>Misc. Options <_short>Animation Options <_short>Appearance <_short>Window Title Font <_short>Slot Dragging <_short>Glow compiz-0.9.11+14.04.20140409/plugins/opacify/0000755000015301777760000000000012321344021020607 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opacify/opacify.xml.in0000644000015301777760000001014012321343002023362 0ustar pbusernogroup00000000000000 <_short>Opacify <_long>Make windows easily visible by hovering the mouse over them Accessibility opengl composite opengl fade decor <_short>Bindings <_short>Misc. Options <_short>Misc. Options <_short>Opacity Levels compiz-0.9.11+14.04.20140409/plugins/opacify/CMakeLists.txt0000644000015301777760000000015412321343002023345 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (opacify PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/opacify/src/0000755000015301777760000000000012321344021021376 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/opacify/src/opacify.cpp0000644000015301777760000002417712321343002023545 0ustar pbusernogroup00000000000000/** * Compiz Opacify * * opacify.cpp * * Copyright (c) 2006 Kristian Lyngstøl * Ported to Compiz and BCOP usage by Danny Baumann * Ported to Compiz 0.9 by Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * * Opacify increases opacity on targeted windows and reduces it on * blocking windows, making whatever window you are targeting easily * visible. * */ #include "opacify.h" COMPIZ_PLUGIN_20090315 (opacify, OpacifyPluginVTable); const unsigned short MAX_WINDOWS = 64; void setFunctions (bool enabled) { OpacifyScreen *os = OpacifyScreen::get (screen); screen->handleEventSetEnabled (os, os->isToggle); foreach (CompWindow *w, screen->windows ()) { OpacifyWindow *ow = OpacifyWindow::get (w); ow->gWindow->glPaintSetEnabled (ow, enabled); } } /* Core opacify functions. These do the real work. ---------------------*/ /* Sets the real opacity and damages the window if actual opacity and * requested opacity differs. */ void OpacifyWindow::setOpacity (int fOpacity) { if (!opacified || (gWindow->paintAttrib ().opacity != opacity)) cWindow->addDamage (); opacified = true; opacity = fOpacity; } /* Resets the Window to the original opacity if it still exists. */ void OpacifyScreen::resetWindowOpacity (Window id) { CompWindow *w = screen->findWindow (id); if (!w) return; OpacifyWindow *ow = OpacifyWindow::get (w); ow->opacified = false; ow->cWindow->addDamage (); } /* Resets all the windows on the screen to the original opacity * if necessary. Then reset active. */ void OpacifyScreen::resetScreenOpacity () { if (active) { clearPassive(); resetWindowOpacity(active); active = 0; } } /* Resets the opacity of windows on the passive list. */ void OpacifyScreen::clearPassive () { CompWindow *win; int activeOpacity = optionGetActiveOpacity (); GLushort targetOpacity = OPAQUE * activeOpacity / 100; foreach (Window xid, passive) { win = screen->findWindow (xid); if (!win) continue; OpacifyWindow *ow = OpacifyWindow::get (win); ow->setOpacity (std::max (targetOpacity, ow->gWindow->paintAttrib ().opacity)); resetWindowOpacity (xid); } passive.clear (); } /* Dim an (inactive) window. Place it on the passive list and * update passiveNum. Then change the opacity. */ void OpacifyWindow::dim () { OpacifyScreen *os = OpacifyScreen::get (screen); os->passive.push_back (window->id ()); setOpacity (MIN (OPAQUE * os->optionGetPassiveOpacity () / 100, gWindow->paintAttrib ().opacity)); } /* Walk through all windows, skip until we've passed the active * window, skip if it's invisible, hidden or minimized, skip if * it's not a window type we're looking for. * Dim it if it intersects. * * Returns number of changed windows. */ int OpacifyScreen::passiveWindows (CompRegion fRegion) { bool flag = false; int i = 0; /* Clear the list first to prevent memleaks */ clearPassive (); foreach (CompWindow *w, screen->windows ()) { if (w->id () == active) { flag = true; continue; } if (!flag || !optionGetWindowMatch ().evaluate (w) || !w->isViewable () || w->minimized ()) continue; intersect = w->region ().intersected (fRegion); if (!intersect.isEmpty ()) { OpacifyWindow::get (w)->dim (); ++i; } } return i; } /* Check if we switched active window, reset the old passive windows * if we did. If we have an active window and switched: reset that too. * If we have a window (w is true), update the active id and * passive list. justMoved is to make sure we recalculate opacity after * moving. We can't reset before moving because if we're using a delay * and the window being moved is not the active but overlapping, it will * be reset, which would conflict with move's opacity change. */ void OpacifyWindow::handleEnter () { OpacifyScreen *os = OpacifyScreen::get (screen); if (screen->otherGrabExist (NULL)) { if (!screen->otherGrabExist ("move", NULL)) { os->justMoved = true; return; } os->resetScreenOpacity (); return; } if (!window || os->active != window->id () || os->justMoved) { os->justMoved = false; os->resetWindowOpacity (os->active); os->active = 0; } if (!window) return; if (window->id () != os->active && !window->shaded () && os->optionGetWindowMatch ().evaluate (window)) { os->active = window->id (); int num = os->passiveWindows (window->region ()); if (num || os->optionGetOnlyIfBlock ()) setOpacity (MAX (OPAQUE * os->optionGetActiveOpacity () / 100, gWindow->paintAttrib ().opacity)); } } /* Timeout-time! Unset the timeout handler, make sure we're on the same * screen, handle the event. */ bool OpacifyScreen::handleTimeout () { if (newActive) OpacifyWindow::get (newActive)->handleEnter (); return false; } /* Checks whether we should delay or not. * Returns true if immediate execution. */ bool OpacifyScreen::checkDelay () { if (optionGetFocusInstant () && newActive && newActive->id () == screen->activeWindow ()) return true; if (!optionGetTimeout ()) return true; if (!newActive || newActive->id () == screen->root () || newActive->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) return false; if (optionGetNoDelayChange () && !passive.empty ()) return true; return false; } bool OpacifyWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (opacified) { GLWindowPaintAttrib wAttrib = attrib; wAttrib.opacity = opacity; return gWindow->glPaint (wAttrib, transform, region, mask); } else return gWindow->glPaint (attrib, transform, region, mask); return false; } /* Takes the inital event. * If we were configured, recalculate the opacify-windows if * it was our window. * If a window was entered: call upon handle_timeout after od->timeout * micro seconds, or directly if od->timeout is 0 (no delay). * */ void OpacifyScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (!isToggle) return; switch (event->type) { case EnterNotify: Window id; id = event->xcrossing.window; newActive = screen->findTopLevelWindow (id); if (timeoutHandle.active ()) timeoutHandle.stop (); if (checkDelay ()) handleTimeout (); else timeoutHandle.start (); break; case FocusIn: resetScreenOpacity(); break; case ConfigureNotify: if (active != event->xconfigure.window) break; clearPassive (); if (active) { CompWindow *w = screen->findWindow (active); if (w) passiveWindows (w->region ()); } break; default: break; } } /* Toggle opacify on/off. We are in Display-context, make sure we handle all * screens. */ bool OpacifyScreen::toggle (CompAction *action, CompAction::State state, CompOption::Vector options) { isToggle = !isToggle; if (!isToggle && optionGetToggleReset ()) resetScreenOpacity(); setFunctions (isToggle); return true; } /* Configuration, initialization, boring stuff. ----------------------- */ /** This is called when an option changes. The only option we are looking for * here is 'init_toggle' so when that changes, we adjust our internal values * appropriately */ void OpacifyScreen::optionChanged (CompOption *option, OpacifyOptions::Options num) { switch (num) { case OpacifyOptions::InitToggle: isToggle = option->value ().b (); setFunctions (isToggle); resetScreenOpacity(); break; case OpacifyOptions::Timeout: timeoutHandle.setTimes (optionGetTimeout (), optionGetTimeout () * 1.2); break; default: break; } } /** Constructor for OpacifyWindow. This is called whenever a new window * is created and we set our custom variables to it and also register to * paint this window */ OpacifyWindow::OpacifyWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), opacified (false), opacity (100) { GLWindowInterface::setHandler (gWindow, false); gWindow->glPaintSetEnabled (this, true); } /** Constructor for OpacifyScreen. This is called whenever a new screen * is created and we set our custom variables to it and also register to * handle X.org events when they come through */ OpacifyScreen::OpacifyScreen (CompScreen *screen) : PluginClassHandler (screen), isToggle (optionGetInitToggle ()), newActive (NULL), active (screen->activeWindow ()), intersect (emptyRegion), justMoved (false) { ScreenInterface::setHandler (screen, false); timeoutHandle.setTimes (optionGetTimeout (), optionGetTimeout () * 1.2); timeoutHandle.setCallback (boost::bind (&OpacifyScreen::handleTimeout, this)); optionSetToggleKeyInitiate (boost::bind (&OpacifyScreen::toggle, this, _1, _2, _3)); optionSetInitToggleNotify (boost::bind (&OpacifyScreen::optionChanged, this, _1, _2)); optionSetTimeoutNotify (boost::bind (&OpacifyScreen::optionChanged, this, _1, _2)); setFunctions (isToggle); } bool OpacifyPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/opacify/src/opacify.h0000644000015301777760000000530412321343002023201 0ustar pbusernogroup00000000000000/** * Compiz Opacify * * opacify.h * * Copyright (c) 2006 Kristian Lyngstøl * Ported to Compiz and BCOP usage by Danny Baumann * Ported to Compiz 0.9 by Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * * Opacify increases opacity on targeted windows and reduces it on * blocking windows, making whatever window you are targeting easily * visible. * */ #include #include #include #include "opacify_options.h" /* Size of the Window array storing passive windows. */ extern const unsigned short MAX_WINDOWS; class OpacifyScreen : public PluginClassHandler , public OpacifyOptions, public ScreenInterface { public: OpacifyScreen (CompScreen *); CompositeScreen *cScreen; GLScreen *gScreen; bool isToggle; CompTimer timeoutHandle; CompWindow *newActive; Window active; std::vector passive; CompRegion intersect; unsigned short int passiveNum; bool justMoved; void handleEvent (XEvent *); void resetWindowOpacity (Window id); void resetScreenOpacity (); void clearPassive (); int passiveWindows (CompRegion fRegion); bool handleTimeout (); bool checkDelay (); bool toggle (CompAction *action, CompAction::State state, CompOption::Vector options); void optionChanged (CompOption *option, OpacifyOptions::Options num); bool checkStateTimeout (); }; class OpacifyWindow : public PluginClassHandler , public GLWindowInterface { public: OpacifyWindow (CompWindow *); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool opacified; int opacity; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); void setOpacity (int fOpacity); void dim (); void handleEnter (); }; class OpacifyPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/scalefilter/0000755000015301777760000000000012321344021021452 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/scalefilter/scalefilter.xml.in0000644000015301777760000000463512321343002025104 0ustar pbusernogroup00000000000000 <_short>Scale Window Title Filter <_long>Window title filter facility for the scale plugin Utility composite opengl scale text opengl scale regex <_short>Behaviour <_short>Appearance compiz-0.9.11+14.04.20140409/plugins/scalefilter/CMakeLists.txt0000644000015301777760000000017312321343002024211 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (scalefilter PLUGINDEPS composite opengl scale text) compiz-0.9.11+14.04.20140409/plugins/scalefilter/src/0000755000015301777760000000000012321344021022241 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/scalefilter/src/scalefilter.h0000644000015301777760000000650112321343002024707 0ustar pbusernogroup00000000000000/* * Copyright (c) 2006 Darryll Truchan * * Pixel shader negating by Dennis Kasprzyk * Usage of matches by Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include "scalefilter_options.h" /* forward declaration */ class ScalefilterScreen; class FilterInfo { public: FilterInfo (ScalefilterScreen *, const CompOutput&); void update (); bool hasText () const; void renderText (); void drawText (const CompOutput *, const GLMatrix&) const; void damageTextRect () const; bool handleInput (const wchar_t input); bool handleBackspace (); const CompMatch& getMatch () const; private: static const unsigned int maxFilterSize = 32; static const unsigned int maxFilterStringLength = maxFilterSize + 1; bool timeout (); const CompOutput& outputDevice; wchar_t filterString[maxFilterStringLength]; unsigned int stringLength; CompMatch filterMatch; bool textValid; CompText text; CompTimer timer; ScalefilterScreen *fScreen; }; class ScalefilterScreen : public PluginClassHandler , public ScreenInterface, public ScaleScreenInterface, public GLScreenInterface, public ScalefilterOptions { public: ScalefilterScreen (CompScreen *); ~ScalefilterScreen (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void handleCompizEvent (const char *, const char *, CompOption::Vector &); void handleEvent (XEvent *); bool removeFilter (); bool hasFilter () const; private: bool handleSpecialKeyPress (XKeyEvent *, bool &); void handleTextKeyPress (XKeyEvent *); void handleWindowRemove (Window); bool filterTimeout (); void doRelayout (); void relayout (); void optionChanged (CompOption *, Options); XIM xim; XIC xic; FilterInfo *filterInfo; bool matchApplied; CompMatch persistentMatch; public: GLScreen *gScreen; CompositeScreen *cScreen; ScaleScreen *sScreen; }; class ScalefilterWindow : public PluginClassHandler , public ScaleWindowInterface { public: ScalefilterWindow (CompWindow *); CompWindow *window; ScaleWindow *sWindow; bool setScaledPaintAttributes (GLWindowPaintAttrib &); }; class ScalefilterPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/scalefilter/src/scalefilter.cpp0000644000015301777760000003135512321343002025247 0ustar pbusernogroup00000000000000/* * * Compiz scale window title filter plugin * * scalefilter.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Copyright : (C) 2006 Diogo Ferreira * E-mail : diogo@underdev.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. * * */ #include #include #include #include #include #include #include "scalefilter.h" COMPIZ_PLUGIN_20090315 (scalefilter, ScalefilterPluginVTable); FilterInfo::FilterInfo (ScalefilterScreen *fs, const CompOutput& output) : outputDevice (output), stringLength (0), textValid (false), fScreen (fs) { memset (filterString, 0, sizeof (filterString)); timer.setCallback (boost::bind (&FilterInfo::timeout, this)); } void FilterInfo::damageTextRect () const { int x, y, width, height; if (!fScreen->cScreen) return; x = outputDevice.x () + outputDevice.width () / 2 - text.getWidth () / 2 - 1; y = outputDevice.y () + outputDevice.height () / 2 - text.getHeight () / 2 - 1; width = text.getWidth () + 2; height = text.getHeight () + 2; CompRegion region (x, y, width, height); fScreen->cScreen->damageRegion (region); } bool FilterInfo::hasText () const { return stringLength > 0; } void FilterInfo::renderText () { CompText::Attrib attrib; char buffer[2 * maxFilterStringLength]; /* damage the old draw rectangle */ if (textValid) damageTextRect (); text.clear (); textValid = false; if (!fScreen->optionGetFilterDisplay ()) return; if (stringLength == 0) return; attrib.maxWidth = outputDevice.width (); attrib.maxHeight = outputDevice.height (); attrib.family = "Sans"; attrib.size = fScreen->optionGetFontSize (); attrib.color[0] = fScreen->optionGetFontColorRed (); attrib.color[1] = fScreen->optionGetFontColorGreen (); attrib.color[2] = fScreen->optionGetFontColorBlue (); attrib.color[3] = fScreen->optionGetFontColorAlpha (); attrib.flags = CompText::WithBackground | CompText::Ellipsized; if (fScreen->optionGetFontBold ()) attrib.flags |= CompText::StyleBold; attrib.bgHMargin = fScreen->optionGetBorderSize (); attrib.bgVMargin = fScreen->optionGetBorderSize (); attrib.bgColor[0] = fScreen->optionGetBackColorRed (); attrib.bgColor[1] = fScreen->optionGetBackColorGreen (); attrib.bgColor[2] = fScreen->optionGetBackColorBlue (); attrib.bgColor[3] = fScreen->optionGetBackColorAlpha (); wcstombs (buffer, filterString, maxFilterStringLength); textValid = text.renderText (buffer, attrib); /* damage the new draw rectangle */ if (textValid) damageTextRect (); } void FilterInfo::update () { CompString filterText; char matchText[2 * maxFilterStringLength]; if (fScreen->optionGetFilterCaseInsensitive ()) filterText = "ititle="; else filterText = "title="; wcstombs (matchText, filterString, maxFilterStringLength); filterText += matchText; filterMatch = fScreen->sScreen->getCustomMatch (); filterMatch &= filterText; } const CompMatch& FilterInfo::getMatch () const { if (stringLength) return filterMatch; return CompMatch::emptyMatch; } void ScalefilterScreen::relayout () { if (filterInfo) sScreen->relayoutSlots (filterInfo->getMatch ()); else if (matchApplied) sScreen->relayoutSlots (persistentMatch); else sScreen->relayoutSlots (CompMatch::emptyMatch); } bool FilterInfo::timeout () { fScreen->removeFilter (); return false; } bool ScalefilterScreen::removeFilter () { bool retval = false; if (filterInfo) { /* in input mode: drop current filter */ delete filterInfo; filterInfo = NULL; retval = true; } else if (matchApplied) { /* remove filter applied previously if currently not in input mode */ matchApplied = false; retval = true; } if (retval) doRelayout (); return retval; } void ScalefilterScreen::handleWindowRemove (Window id) { CompWindow *w; w = screen->findWindow (id); if (w) { ScaleScreen::State state; SCALE_SCREEN (screen); SCALE_WINDOW (w); state = ss->getState (); if (state != ScaleScreen::Idle && state != ScaleScreen::In) { const ScaleScreen::WindowList& windows = ss->getWindows (); if (windows.size () == 1 && windows.front () == sw) removeFilter (); } } } void ScalefilterScreen::doRelayout () { if (filterInfo) { filterInfo->renderText (); filterInfo->update (); } relayout (); } bool ScalefilterScreen::handleSpecialKeyPress (XKeyEvent *event, bool& drop) { KeySym ks; bool retval = false; bool needRelayout = false; ks = XKeycodeToKeysym (screen->dpy (), event->keycode, 0); if (ks == XK_Escape) { /* Escape key - drop current filter or remove filter applied previously if currently not in input mode */ if (removeFilter ()) drop = true; retval = true; } else if (ks == XK_Return) { if (filterInfo && filterInfo->hasText ()) { /* Return key - apply current filter persistently */ unsigned int count = 0; persistentMatch = filterInfo->getMatch (); matchApplied = true; drop = false; needRelayout = false; /* Check whether there is just one window remaining on * this match, if so, no need to relayout */ foreach (ScaleWindow *sw, sScreen->getWindows ()) { if (persistentMatch.evaluate (sw->window)) count++; if (count > 1) { needRelayout = true; drop = true; break; } } delete filterInfo; filterInfo = NULL; } retval = true; } else if (ks == XK_BackSpace) { if (filterInfo) needRelayout = filterInfo->handleBackspace (); retval = true; } if (needRelayout) doRelayout (); return retval; } bool FilterInfo::handleBackspace () { if (!stringLength) return false; /* remove last character in string */ filterString[--stringLength] = '\0'; return true; } bool FilterInfo::handleInput (const wchar_t input) { int timeout = fScreen->optionGetTimeout (); timer.stop (); if (timeout > 0) { timer.setTimes (timeout, (float) timeout * 1.2); timer.start (); } if (stringLength < maxFilterSize) { filterString[stringLength++] = input; filterString[stringLength] = '\0'; return true; } return false; } void ScalefilterScreen::handleTextKeyPress (XKeyEvent *event) { bool needRelayout = false; int count; char buffer[10]; wchar_t wbuffer[10]; KeySym ks; #if 0 /* needs modHandler patch */ unsigned int mods; /* ignore key presses with modifiers (except Shift and ModeSwitch AKA AltGr) */ mods = event->state & ~modHandler->ignoredModMask (); mods &= ~modHandler->modMask (CompModModeSwitch); if (mods & ~ShiftMask) return; #endif memset (buffer, 0, sizeof (buffer)); memset (wbuffer, 0, sizeof (wbuffer)); if (xic) { Status status; XSetICFocus (xic); count = Xutf8LookupString (xic, event, buffer, 9, &ks, &status); XUnsetICFocus (xic); } else { count = XLookupString (event, buffer, 9, &ks, NULL); } mbstowcs (wbuffer, buffer, 9); if (count > 0) { if (!filterInfo) filterInfo = new FilterInfo (this, screen->currentOutputDev ()); needRelayout = filterInfo->handleInput (wbuffer[0]); } if (needRelayout) doRelayout (); } void ScalefilterScreen::handleEvent (XEvent *event) { bool grabbed = false, dropEvent = false; switch (event->type) { case KeyPress: { SCALE_SCREEN (screen); grabbed = ss->hasGrab (); if (grabbed && handleSpecialKeyPress (&event->xkey, dropEvent)) { /* don't attempt to process text input later on if the input was a special key */ grabbed = false; } } break; case UnmapNotify: handleWindowRemove (event->xunmap.window); break; case DestroyNotify: handleWindowRemove (event->xdestroywindow.window); break; default: break; } if (!dropEvent) screen->handleEvent (event); switch (event->type) { case KeyPress: if (grabbed && !dropEvent) handleTextKeyPress (&event->xkey); break; } } void ScalefilterScreen::handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector& options) { bool activated; screen->handleCompizEvent (pluginName, eventName, options); if (strcmp (pluginName, "scale") || strcmp (eventName, "activate")) return; activated = CompOption::getBoolOptionNamed (options, "active", false); if (!activated && filterInfo) { delete filterInfo; filterInfo = NULL; } if (gScreen) gScreen->glPaintOutputSetEnabled (this, activated); screen->handleEventSetEnabled (this, activated); matchApplied = false; } void FilterInfo::drawText (const CompOutput *output, const GLMatrix& transform) const { if (!textValid) return; if (output->id () == (unsigned int) ~0 || output == &outputDevice) { GLMatrix sTransform (transform); float x, y, width, height; width = text.getWidth (); height = text.getHeight (); x = floor (output->x1 () + (output->width () / 2) - (width / 2)); y = floor (output->y1 () + (output->height () / 2) + (height / 2)); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); text.draw (sTransform, x, y, 1.0f); } } bool ScalefilterScreen::glPaintOutput (const GLScreenPaintAttrib& attrib, const GLMatrix& transform, const CompRegion& region, CompOutput *output, unsigned int mask) { bool status; status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (status && filterInfo) filterInfo->drawText (output, transform); return status; } bool ScalefilterScreen::hasFilter () const { if (matchApplied) return true; if (filterInfo && filterInfo->hasText ()) return true; return false; } bool ScalefilterWindow::setScaledPaintAttributes (GLWindowPaintAttrib& attrib) { bool ret = sWindow->setScaledPaintAttributes (attrib); if (ScalefilterScreen::get (screen)->hasFilter ()) { SCALE_SCREEN (screen); if (ret && !sWindow->hasSlot () && ss->getState () != ScaleScreen::In) { ret = false; attrib.opacity = 0; } } return ret; } void ScalefilterScreen::optionChanged (CompOption *opt, Options num) { switch (num) { case FontBold: case FontSize: case FontColor: case BackColor: if (filterInfo) filterInfo->renderText (); break; default: break; } } ScalefilterScreen::ScalefilterScreen (CompScreen *s) : PluginClassHandler (s), ScalefilterOptions (), xic (NULL), filterInfo (NULL), matchApplied (false), gScreen (GLScreen::get (s)), cScreen (CompositeScreen::get (s)), sScreen (ScaleScreen::get (s)) { xim = XOpenIM (s->dpy (), NULL, NULL, NULL); //if (xim) //xic = XCreateIC (xim, XNClientWindow, s->root (), XNInputStyle, // XIMPreeditNothing | XIMStatusNothing, NULL); if (xic) setlocale (LC_CTYPE, ""); optionSetFontBoldNotify (boost::bind (&ScalefilterScreen::optionChanged, this, _1, _2)); optionSetFontSizeNotify (boost::bind (&ScalefilterScreen::optionChanged, this, _1, _2)); optionSetFontColorNotify (boost::bind (&ScalefilterScreen::optionChanged, this, _1, _2)); optionSetBackColorNotify (boost::bind (&ScalefilterScreen::optionChanged, this, _1, _2)); ScreenInterface::setHandler (screen); GLScreenInterface::setHandler (gScreen); ScaleScreenInterface::setHandler (sScreen); screen->handleEventSetEnabled (this, false); if (gScreen) gScreen->glPaintOutputSetEnabled (this, false); } ScalefilterScreen::~ScalefilterScreen () { if (filterInfo) delete filterInfo; if (xic) XDestroyIC (xic); if (xim) XCloseIM (xim); } ScalefilterWindow::ScalefilterWindow (CompWindow *w) : PluginClassHandler (w), window (w), sWindow (ScaleWindow::get (w)) { ScaleWindowInterface::setHandler (sWindow); } bool ScalefilterPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("scale", COMPIZ_SCALE_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/mousepoll/0000755000015301777760000000000012321344021021174 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/mousepoll/mousepoll.xml.in0000644000015301777760000000132112321343002024335 0ustar pbusernogroup00000000000000 <_short>Mouse position polling <_long>Updates the mouse pointer position from the xserver Utility opengl composite decor <_short>Misc compiz-0.9.11+14.04.20140409/plugins/mousepoll/compiz-mousepoll.pc.in0000644000015301777760000000041412321343002025440 0ustar pbusernogroup00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-mousepoll Description: Mousepoll plugin for compiz Version: @VERSION@ Requires: compiz Libs: -L${libdir}/compiz -lmousepoll Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compiz compiz-0.9.11+14.04.20140409/plugins/mousepoll/CMakeLists.txt0000644000015301777760000000012212321343002023725 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (mousepoll) compiz-0.9.11+14.04.20140409/plugins/mousepoll/src/0000755000015301777760000000000012321344021021763 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/mousepoll/src/private.h0000644000015301777760000000345112321343002023607 0ustar pbusernogroup00000000000000/* * * Compiz mouse position polling plugin * * mousepoll.c * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * */ #include #include #include #include #include "mousepoll_options.h" typedef enum _MousepollOptions { MP_DISPLAY_OPTION_MOUSE_POLL_INTERVAL, MP_DISPLAY_OPTION_NUM } MousepollDisplayOptions; class MousepollScreen; extern template class PluginClassHandler ; class MousepollScreen : public PluginClassHandler , public MousepollOptions { public: MousepollScreen (CompScreen *screen); std::list pollers; CompTimer timer; CompPoint pos; bool updatePosition (); bool getMousePosition (); bool addTimer (MousePoller *poller); void removeTimer (MousePoller *poller); void updateTimer (); }; #define MOUSEPOLL_SCREEN(s) \ MousepollScreen *ms = MousepollScreen::get (s) #define NUM_OPTIONS(s) (sizeof ((s)->opt) / sizeof (CompOption)) class MousepollPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); void fini (); }; compiz-0.9.11+14.04.20140409/plugins/mousepoll/src/mousepoll.cpp0000644000015301777760000001103012321343002024477 0ustar pbusernogroup00000000000000/* * * Compiz mouse position polling plugin * * mousepoll.cpp * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * */ #include "private.h" COMPIZ_PLUGIN_20090315 (mousepoll, MousepollPluginVTable); bool MousepollScreen::getMousePosition () { Window root, child; int rootX, rootY; int winX, winY; int w = screen->width (), h = screen->height (); unsigned int maskReturn; bool status = XQueryPointer (screen->dpy (), screen->root (), &root, &child, &rootX, &rootY, &winX, &winY, &maskReturn); if (!status || rootX > w || rootY > h || screen->root () != root) return false; if (rootX != pos.x () || rootY != pos.y ()) { pos.set (rootX, rootY); return true; } return false; } bool MousepollScreen::updatePosition () { if (getMousePosition ()) { for (std::list::iterator it = pollers.begin (); it != pollers.end ();) { MousePoller *poller = *it; ++it; poller->mPoint = pos; poller->mCallback (pos); } } return true; } bool MousepollScreen::addTimer (MousePoller *poller) { bool start = pollers.empty (); std::list::iterator it = std::find (pollers.begin (), pollers.end (), poller); if (it != pollers.end ()) return false; pollers.insert (it, poller); if (start) { getMousePosition (); timer.start (); } return true; } void MousepollScreen::removeTimer (MousePoller *poller) { std::list::iterator it = std::find (pollers.begin(), pollers.end (), poller); if (it == pollers.end ()) return; pollers.erase (it); if (pollers.empty ()) timer.stop (); } void MousePoller::setCallback (MousePoller::CallBack callback) { bool wasActive = mActive; if (mActive) stop (); mCallback = callback; if (wasActive) start (); } void MousePoller::start () { MOUSEPOLL_SCREEN (screen); if (!ms) { compLogMessage ("mousepoll", CompLogLevelWarn, "Plugin version mismatch, can't start mouse poller."); return; } if (mCallback.empty ()) { compLogMessage ("mousepoll", CompLogLevelWarn, "Can't start mouse poller without callback."); return; } ms->addTimer (this); mActive = true; } void MousePoller::stop () { MOUSEPOLL_SCREEN (screen); /* Prevent broken plugins from calling stop () twice */ if (!mActive) return; if (!ms) { compLogMessage ("mousepoll", CompLogLevelWarn, "Plugin version mismatch, can't stop mouse poller."); return; } mActive = false; ms->removeTimer (this); } bool MousePoller::active () { return mActive; } CompPoint MousePoller::getCurrentPosition () { CompPoint p; MOUSEPOLL_SCREEN (screen); if (!ms) compLogMessage ("mousepoll", CompLogLevelWarn, "Plugin version mismatch, can't get mouse position."); else { ms->getMousePosition (); p = ms->pos; } return p; } CompPoint MousePoller::getPosition () { return mPoint; } MousePoller::MousePoller () : mActive (false), mPoint (0, 0), mCallback (NULL) { } MousePoller::~MousePoller () { if (mActive) stop (); } void MousepollScreen::updateTimer () { float timeout = optionGetMousePollInterval (); timer.setTimes (timeout, timeout * 1.5); } template class PluginClassHandler ; MousepollScreen::MousepollScreen (CompScreen *screen) : PluginClassHandler (screen) { updateTimer (); timer.setCallback (boost::bind (&MousepollScreen::updatePosition, this)); optionSetMousePollIntervalNotify (boost::bind (&MousepollScreen::updateTimer, this)); } bool MousepollPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) { CompPrivate p; p.uval = COMPIZ_MOUSEPOLL_ABI; screen->storeValue ("mousepoll_ABI", p); return true; } return false; } void MousepollPluginVTable::fini () { screen->eraseValue ("mousepoll_ABI"); } compiz-0.9.11+14.04.20140409/plugins/mousepoll/include/0000755000015301777760000000000012321344021022617 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/mousepoll/include/mousepoll/0000755000015301777760000000000012321344021024636 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/mousepoll/include/mousepoll/mousepoll.h0000644000015301777760000000220512321343002027023 0ustar pbusernogroup00000000000000/* * * Compiz mouse position polling plugin * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * */ #ifndef _COMPIZ_MOUSEPOLL_H #define _COMPIZ_MOUSEPOLL_H #define COMPIZ_MOUSEPOLL_ABI 1 class MousePoller { public: typedef boost::function CallBack; MousePoller (); ~MousePoller (); void setCallback (CallBack callback); void start (); void stop (); bool active (); CompPoint getPosition (); static CompPoint getCurrentPosition (); private: bool mActive; CompPoint mPoint; CallBack mCallback; friend class MousepollScreen; }; #endif compiz-0.9.11+14.04.20140409/plugins/kdecompat/0000755000015301777760000000000012321344021021124 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/kdecompat/CMakeLists.txt0000644000015301777760000000015612321343002023664 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (kdecompat PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/kdecompat/src/0000755000015301777760000000000012321344021021713 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/kdecompat/src/kdecompat.cpp0000644000015301777760000005526612321343002024402 0ustar pbusernogroup00000000000000/* * * Compiz KDE compatibility plugin * * kdecompat.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "kdecompat.h" #include COMPIZ_PLUGIN_20090315 (kdecompat, KDECompatPluginVTable); inline void KDECompatScreen::checkPaintFunctions () { bool enabled = false; foreach (CompWindow *w, screen->windows ()) { KDECompatWindow *kcw = KDECompatWindow::get (w); bool wEnabled = (kcw->mPreviews.size () || kcw->mIsPreview || (kcw->mSlideData && kcw->mSlideData->remaining > 0.0)); enabled |= wEnabled; kcw->gWindow->glPaintSetEnabled (kcw, wEnabled); kcw->cWindow->damageRectSetEnabled (kcw, wEnabled); } KDECOMPAT_SCREEN (screen); gScreen->glPaintOutputSetEnabled (ks, enabled); cScreen->donePaintSetEnabled (ks, enabled); cScreen->preparePaintSetEnabled (ks, enabled); } void KDECompatWindow::stopCloseAnimation () { while (mUnmapCnt) { window->unmap (); mUnmapCnt--; } while (mDestroyCnt) { window->destroy (); mDestroyCnt--; } } void KDECompatWindow::sendSlideEvent (bool start) { CompOption::Vector o (2); o[0] = CompOption ("window", CompOption::TypeInt); o[0].value ().set ((int) window->id ()); o[1] = CompOption ("active", CompOption::TypeBool); o[1].value ().set (start); screen->handleCompizEvent ("kdecompat", "slide", o); } void KDECompatWindow::startSlideAnimation (bool appearing) { if (!mSlideData) return; KDECOMPAT_SCREEN (screen); if (appearing) mSlideData->duration = ks->optionGetSlideInDuration (); else mSlideData->duration = ks->optionGetSlideOutDuration (); if (mSlideData->remaining > mSlideData->duration) mSlideData->remaining = mSlideData->duration; else mSlideData->remaining = mSlideData->duration - mSlideData->remaining; mSlideData->appearing = appearing; ks->mHasSlidingPopups = true; ks->checkPaintFunctions (); cWindow->addDamage (); sendSlideEvent (true); } void KDECompatWindow::endSlideAnimation () { if (mSlideData) { mSlideData->remaining = 0; stopCloseAnimation (); sendSlideEvent (false); } KDECompatScreen::get (screen)->checkPaintFunctions (); } void KDECompatScreen::preparePaint (int msSinceLastPaint) { if (mHasSlidingPopups) { foreach (CompWindow *w, screen->windows ()) { KDECOMPAT_WINDOW (w); if (!kw->mSlideData) continue; kw->mSlideData->remaining -= msSinceLastPaint; if (kw->mSlideData->remaining <= 0) kw->endSlideAnimation (); } } cScreen->preparePaint (msSinceLastPaint); } bool KDECompatScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; if (mHasSlidingPopups) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; status = gScreen->glPaintOutput (attrib, transform, region, output, mask); return status; } void KDECompatScreen::donePaint () { if (mHasSlidingPopups) { mHasSlidingPopups = false; foreach (CompWindow *w, screen->windows ()) { KDECOMPAT_WINDOW (w); if (kw->mSlideData && kw->mSlideData->remaining) { kw->cWindow->addDamage (); mHasSlidingPopups = true; } } } cScreen->donePaint (); } bool KDECompatWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status = false; KDECOMPAT_SCREEN (screen); if ((!(ks->optionGetPlasmaThumbnails () || mPreviews.empty ()) && !(mSlideData || mSlideData->remaining)) || !window->mapNum () || (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK)) { status = gWindow->glPaint (attrib, transform, region, mask); return status; } if (mSlideData && mSlideData->remaining) { GLMatrix wTransform = transform; SlideData *data = mSlideData; float xTranslate = 0, yTranslate = 0, remainder; CompRect clipBox (window->x (), window->y (), window->width (), window->height ()); if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) return false; remainder = (float) data->remaining / data->duration; if (!data->appearing) remainder = 1.0 - remainder; switch (data->position) { case East: xTranslate = (data->start - window->x ()) * remainder; clipBox.setWidth (data->start - clipBox.x ()); break; case West: xTranslate = (data->start - window->width ()) * remainder; clipBox.setX (data->start); break; case North: yTranslate = (data->start - window->height ()) * remainder; clipBox.setY (data->start); break; case South: default: yTranslate = (data->start - window->y ()) * remainder; clipBox.setHeight (data->start - clipBox.y1 ()); break; } status = gWindow->glPaint (attrib, transform, region, mask | PAINT_WINDOW_NO_CORE_INSTANCE_MASK); if (window->alpha () || attrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.translate (xTranslate, yTranslate, 0.0f); glEnable (GL_SCISSOR_TEST); glScissor (clipBox.x1 (), screen->height () - clipBox.y2 (), clipBox.width (), clipBox.height ()); status = gWindow->glDraw (wTransform, attrib, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); glDisable (GL_SCISSOR_TEST); } foreach (const Thumb& thumb, mPreviews) { CompWindow *tw = screen->findWindow (thumb.id); GLWindow *gtw; const CompRect &rect = thumb.thumb; unsigned int paintMask = mask | PAINT_WINDOW_TRANSFORMED_MASK; float xScale = 1.0f, yScale = 1.0f, xTranslate, yTranslate; GLTexture *icon = NULL; if (!tw) continue; gtw = GLWindow::get (tw); xTranslate = rect.x () + window->x () - tw->x (); yTranslate = rect.y () + window->y () - tw->y (); if (!gtw->textures ().empty ()) { unsigned int width, height; width = tw->width () - tw->input ().left + tw->input ().right; height = tw->height () - tw->input ().top + tw->input ().bottom; xScale = (float) rect.width () / width; yScale = (float) rect.height () / height; xTranslate += tw->input ().left * xScale; yTranslate += tw->input ().top * yScale; } else { icon = gWindow->getIcon (512, 512); if (!icon) icon = ks->gScreen->defaultIcon (); if (icon && !icon->name ()) icon = NULL; if (icon) { GLTexture::MatrixList matrices (1); paintMask |= PAINT_WINDOW_BLEND_MASK; if (icon->width () >= rect.width () || icon->height () >= rect.height ()) { xScale = (float) rect.width () / icon->width (); yScale = (float) rect.height () / icon->height (); if (xScale < yScale) yScale = xScale; else xScale = yScale; } xTranslate += rect.width () / 2 - (icon->width () * xScale / 2); yTranslate += rect.height () / 2 - (icon->height () * yScale / 2); matrices[0] = icon->matrix (); matrices[0].x0 -= (tw->x () * icon->matrix ().xx); matrices[0].y0 -= (tw->y () * icon->matrix ().yy); gtw->vertexBuffer ()->begin (); gtw->glAddGeometry (matrices, tw->geometry (), infiniteRegion); gtw->vertexBuffer ()->end (); } } if (!gtw->textures ().empty () || icon) { GLMatrix wTransform (transform); if (tw->alpha () || attrib.opacity != OPAQUE) paintMask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.translate (tw->x (), tw->y (), 0.0f); wTransform.scale (xScale, yScale, 1.0f); wTransform.translate (xTranslate / xScale - tw->x (), yTranslate / yScale - tw->y (), 0.0f); if (!gtw->textures ().empty ()) gtw->glDraw (wTransform, attrib, infiniteRegion, paintMask); else if (icon) gtw->glDrawTexture (icon, wTransform, attrib, paintMask); } } if (!status) status = gWindow->glPaint (attrib, transform, region, mask); return status; } void KDECompatWindow::updatePreviews () { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; unsigned int oldPreviewsSize; KDECOMPAT_SCREEN (screen); oldPreviewsSize = mPreviews.size (); mPreviews.clear (); result = XGetWindowProperty (screen->dpy (), window->id (), ks->mKdePreviewAtom, 0, 32768, false, AnyPropertyType, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (format == 32 && actual == ks->mKdePreviewAtom) { long *data = (long *) propData; unsigned int nPreview = *data++; if (n == (6 * nPreview + 1)) { while (mPreviews.size () < nPreview) { Thumb t; if (*data++ != 5) break; t.id = *data++; t.thumb.setX (*data++); t.thumb.setY (*data++); t.thumb.setWidth (*data++); t.thumb.setHeight (*data++); mPreviews.push_back (t); } } } XFree (propData); } if (oldPreviewsSize != mPreviews.size ()) cWindow->damageOutputExtents (); foreach (CompWindow *cw, screen->windows ()) { CompWindow *rw; KDECompatWindow *kcw = KDECompatWindow::get (cw); kcw->mIsPreview = false; foreach (rw, screen->windows ()) { KDECompatWindow *krw = KDECompatWindow::get (rw); foreach (const Thumb& t, krw->mPreviews) { if (t.id == cw->id ()) { kcw->mIsPreview = true; break; } } if (kcw->mIsPreview) break; } ks->checkPaintFunctions (); } } void KDECompatWindow::updateSlidePosition () { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; KDECOMPAT_SCREEN (screen); if (mSlideData) { delete mSlideData; mSlideData = NULL; } result = XGetWindowProperty (screen->dpy (), window->id (), ks->mKdeSlideAtom, 0, 32768, false, AnyPropertyType, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (format == 32 && actual == ks->mKdeSlideAtom && n == 2) { long *data = (long *) propData; mSlideData = new SlideData; if (mSlideData) { mSlideData->remaining = 0; mSlideData->start = data[0]; mSlideData->position = (KDECompatWindow::SlidePosition) data[1]; } } window->windowNotifySetEnabled (this, true); XFree (propData); } else window->windowNotifySetEnabled (this, false); ks->checkPaintFunctions (); } void KDECompatWindow::handleClose (bool destroy) { KDECOMPAT_SCREEN (screen); if (mSlideData && ks->optionGetSlidingPopups ()) { if (destroy) { mDestroyCnt++; window->incrementDestroyReference (); } else { mUnmapCnt++; window->incrementUnmapReference (); } if (mSlideData->appearing || !mSlideData->remaining) startSlideAnimation (false); } } CompAction * KDECompatScreen::getScaleAction (const char *name) { CompPlugin *p = mScaleHandle; if (!p) return NULL; foreach (CompOption &option, p->vTable->getOptions ()) { if (option.type () == CompOption::TypeAction || option.type () == CompOption::TypeButton || option.type () == CompOption::TypeKey) { if (option.name () == name) return &option.value ().action (); } } return NULL; } bool KDECompatScreen::scaleActivate () { if (mPresentWindow && !mScaleActive) { CompOption::Vector options (2); CompAction *action; options[0] = CompOption ("root", CompOption::TypeInt); options[0].value ().set ((int) screen->root ()); options[1] = CompOption ("match", CompOption::TypeMatch); options[1].value ().set (CompMatch ()); CompMatch& windowMatch = options[1].value ().match (); foreach (Window win, mPresentWindowList) { std::ostringstream exp; exp << "xid=" << win; windowMatch |= exp.str (); } windowMatch.update (); action = getScaleAction ("initiate_all_key"); if (action && action->initiate ()) action->initiate () (action, 0, options); } return false; } void KDECompatWindow::presentGroup () { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; KDECOMPAT_SCREEN (screen); if (!ks->optionGetPresentWindows ()) return; if (!ks->mScaleHandle) { compLogMessage ("kdecompat", CompLogLevelWarn, "Scale plugin not loaded, present windows " "effect not available!"); return; } result = XGetWindowProperty (screen->dpy (), window->id (), ks->mKdePresentGroupAtom, 0, 32768, false, AnyPropertyType, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (format == 32 && actual == ks->mKdePresentGroupAtom) { long *property = (long *) propData; if (!n || !property[0]) { CompOption::Vector o (1); CompAction *action; /* end scale */ o[0] = CompOption ("root", CompOption::TypeInt); o[0].value ().set ((int) screen->root ()); action = ks->getScaleAction ("initiate_all_key"); if (action && action->terminate ()) action->terminate () (action, CompAction::StateCancel, o); ks->mPresentWindow = NULL; } else { /* Activate scale using a timeout - Rationale: * At the time we get the property notify event, Plasma * most likely holds a pointer grab due to the action being * initiated by a button click. As scale also wants to get * a pointer grab, we need to delay the activation a bit so * Plasma can release its grab. */ ks->mPresentWindow = window; ks->mPresentWindowList.clear (); for (unsigned int i = 0; i < n; i++) ks->mPresentWindowList.push_back (property[i]); ks->mScaleTimeout.setCallback ( boost::bind (&KDECompatScreen::scaleActivate, ks)); ks->mScaleTimeout.start (); } } XFree (propData); } } void KDECompatScreen::handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &options) { screen->handleCompizEvent (pluginName, eventName, options); if (mScaleHandle && strcmp (pluginName, "scale") == 0 && strcmp (eventName, "activate") == 0) { mScaleActive = CompOption::getBoolOptionNamed (options, "active", false); if (!mScaleActive && mPresentWindow) XDeleteProperty (screen->dpy (), mPresentWindow->id (), mKdePresentGroupAtom); } } void KDECompatWindow::updateBlurProperty (bool enabled) { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; bool validProperty = false; KDECOMPAT_SCREEN (screen); if (!ks->mBlurLoaded || !ks->optionGetWindowBlur ()) return; if (!enabled) { if (mBlurPropertySet) XDeleteProperty (screen->dpy (), window->id (), KDECompatScreen::get (screen)->mCompizWindowBlurAtom); return; } if (!mBlurPropertySet) { result = XGetWindowProperty (screen->dpy (), window->id (), ks->mCompizWindowBlurAtom, 0, 32768, false, AnyPropertyType, &actual, &format, &n, &left, &propData); if (result == Success && propData) { /* somebody else besides us already set a property, * don't touch that property */ XFree (propData); return; } } result = XGetWindowProperty (screen->dpy (), window->id (), ks->mKdeBlurBehindRegionAtom, 0, 32768, false, AnyPropertyType, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (format == 32 && actual == XA_CARDINAL && n > 0 && (n % 4 == 0)) { long *data = (long *) propData; unsigned int nBox = n / 4; long compizProp[nBox * 6 + 2]; unsigned int i = 2; compizProp[0] = 2; /* threshold */ compizProp[1] = 0; /* filter */ while (nBox--) { int x, y, w, h; x = *data++; y = *data++; w = *data++; h = *data++; compizProp[i++] = GRAVITY_NORTH | GRAVITY_WEST; /* P1 gravity */ compizProp[i++] = x; /* P1 X */ compizProp[i++] = y; /* P1 Y */ compizProp[i++] = GRAVITY_NORTH | GRAVITY_WEST; /* P2 gravity */ compizProp[i++] = x + w; /* P2 X */ compizProp[i++] = y + h; /* P2 Y */ } XChangeProperty (screen->dpy (), window->id (), ks->mCompizWindowBlurAtom, XA_INTEGER, 32, PropModeReplace, (unsigned char *) compizProp, i); mBlurPropertySet = true; validProperty = TRUE; } XFree (propData); } if (mBlurPropertySet && !validProperty) { mBlurPropertySet = FALSE; XDeleteProperty (screen->dpy (), window->id (), ks->mKdeBlurBehindRegionAtom); } } void KDECompatWindow::windowNotify (CompWindowNotify n) { if (!KDECompatScreen::get (screen)->optionGetSlidingPopups ()) return window->windowNotify (n); switch (n) { case CompWindowNotifyClose: handleClose (false); break; case CompWindowNotifyBeforeDestroy: handleClose (true); break; case CompWindowNotifyBeforeMap: startSlideAnimation (true); break; default: break; } } void KDECompatScreen::handleEvent (XEvent *event) { CompWindow *w; screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == mKdePreviewAtom) { w = screen->findWindow (event->xproperty.window); if (w) KDECompatWindow::get (w)->updatePreviews (); } else if (event->xproperty.atom == mKdeSlideAtom) { w = screen->findWindow (event->xproperty.window); if (w) KDECompatWindow::get (w)->updateSlidePosition (); } else if (event->xproperty.atom == mKdePresentGroupAtom) { w = screen->findWindow (event->xproperty.window); if (w) KDECompatWindow::get (w)->presentGroup (); } else if (event->xproperty.atom == mKdeBlurBehindRegionAtom) { w = screen->findWindow (event->xproperty.window); if (w) KDECompatWindow::get (w)->updateBlurProperty (true); } break; } } bool KDECompatWindow::damageRect (bool initial, const CompRect &rect) { bool status; KDECOMPAT_SCREEN (screen); if (mIsPreview && ks->optionGetPlasmaThumbnails ()) { foreach (CompWindow *cw, screen->windows ()) { KDECompatWindow *kdw = KDECompatWindow::get (cw); foreach (const Thumb& thumb, kdw->mPreviews) { if (thumb.id != window->id ()) continue; CompRect rect (thumb.thumb.x () + cw->x (), thumb.thumb.y () + cw->y (), thumb.thumb.width (), thumb.thumb.height ()); ks->cScreen->damageRegion (rect); } } } status = cWindow->damageRect (initial, rect); return status; } void KDECompatScreen::advertiseSupport (Atom atom, bool enable) { if (enable) { unsigned char value = 0; XChangeProperty (screen->dpy (), screen->root (), atom, mKdePreviewAtom, 8, PropModeReplace, &value, 1); } else { XDeleteProperty (screen->dpy (), screen->root (), atom); } } void KDECompatScreen::optionChanged (CompOption *option, KdecompatOptions::Options num) { if (num == KdecompatOptions::PlasmaThumbnails) advertiseSupport (mKdePreviewAtom, option->value ().b ()); else if (num == KdecompatOptions::SlidingPopups) advertiseSupport (mKdeSlideAtom, option->value (). b ()); else if (num == KdecompatOptions::PresentWindows) advertiseSupport (mKdePresentGroupAtom, option->value ().b () && mScaleHandle); else if (num == KdecompatOptions::WindowBlur) { advertiseSupport (mKdeBlurBehindRegionAtom, option->value ().b () && mBlurLoaded); foreach (CompWindow *w, screen->windows ()) KDECompatWindow::get (w)->updateBlurProperty (option->value ().b ()); } } KDECompatScreen::KDECompatScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mKdePreviewAtom (XInternAtom (screen->dpy (), "_KDE_WINDOW_PREVIEW", 0)), mKdeSlideAtom (XInternAtom (screen->dpy (), "_KDE_SLIDE", 0)), mKdePresentGroupAtom (XInternAtom (screen->dpy (), "_KDE_PRESENT_WINDOWS_GROUP", 0)), mKdeBlurBehindRegionAtom (XInternAtom (screen->dpy (), "_KDE_NET_WM_BLUR_BEHIND_REGION", 0)), mCompizWindowBlurAtom (XInternAtom (screen->dpy (), "_COMPIZ_WM_WINDOW_BLUR", 0)), mHasSlidingPopups (false), mDestroyCnt (0), mUnmapCnt (0), mScaleHandle (CompPlugin::find ("scale")), mScaleActive (false), mBlurLoaded ((CompPlugin::find ("blur") != NULL)), mPresentWindow (NULL) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); mScaleTimeout.setTimes (100, 200); advertiseSupport (mKdePreviewAtom, optionGetPlasmaThumbnails ()); advertiseSupport (mKdeSlideAtom, optionGetSlidingPopups ()); advertiseSupport (mKdePresentGroupAtom, optionGetPresentWindows () && mScaleHandle); optionSetPlasmaThumbnailsNotify ( boost::bind (&KDECompatScreen::optionChanged, this, _1, _2)); } KDECompatScreen::~KDECompatScreen () { advertiseSupport (mKdePreviewAtom, false); advertiseSupport (mKdeSlideAtom, false); advertiseSupport (mKdePresentGroupAtom, false); } KDECompatWindow::KDECompatWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), mIsPreview (false), mSlideData (NULL), mDestroyCnt (0), mUnmapCnt (0), mBlurPropertySet (false) { WindowInterface::setHandler (window, false); CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); updateBlurProperty (KDECompatScreen::get (screen)->optionGetWindowBlur ()); } KDECompatWindow::~KDECompatWindow () { stopCloseAnimation (); if (mSlideData) delete mSlideData; if (KDECompatScreen::get (screen)->mPresentWindow == window) KDECompatScreen::get (screen)->mPresentWindow = NULL; updateBlurProperty (false); } bool KDECompatPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/kdecompat/src/kdecompat.h0000644000015301777760000001004512321343002024031 0ustar pbusernogroup00000000000000/* * * Compiz KDE compatibility plugin * * kdecompat.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include #include "kdecompat_options.h" #include class KDECompatScreen : public PluginClassHandler , public CompositeScreenInterface, public GLScreenInterface, public ScreenInterface, public KdecompatOptions { public: KDECompatScreen (CompScreen *); ~KDECompatScreen (); public: void handleEvent (XEvent *); void advertiseSupport (Atom atom, bool enable); void optionChanged (CompOption *option, KdecompatOptions::Options num); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void donePaint (); void handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &options); CompAction * getScaleAction (const char *name); bool scaleActivate (); void freeScaleTimeout (); inline void checkPaintFunctions (); CompositeScreen *cScreen; GLScreen *gScreen; Atom mKdePreviewAtom; Atom mKdeSlideAtom; Atom mKdePresentGroupAtom; Atom mKdeBlurBehindRegionAtom; Atom mCompizWindowBlurAtom; bool mHasSlidingPopups; int mDestroyCnt; int mUnmapCnt; CompPlugin *mScaleHandle; bool mScaleActive; CompTimer mScaleTimeout; bool mBlurLoaded; CompWindow *mPresentWindow; std::vector mPresentWindowList; }; #define KDECOMPAT_SCREEN(s) \ KDECompatScreen *ks = KDECompatScreen::get (s) class KDECompatWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: KDECompatWindow (CompWindow *); ~KDECompatWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; public: typedef struct { Window id; CompRect thumb; } Thumb; typedef enum { West = 0, North = 1, East = 2, South = 3 } SlidePosition; typedef struct { SlidePosition position; int start; bool appearing; int remaining; int duration; } SlideData; std::list mPreviews; bool mIsPreview; SlideData *mSlideData; int mDestroyCnt; int mUnmapCnt; bool mBlurPropertySet; public: bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); bool damageRect (bool, const CompRect &); void updatePreviews (); void stopCloseAnimation (); void sendSlideEvent (bool start); void startSlideAnimation (bool appearing); void endSlideAnimation (); void updateSlidePosition (); void updateBlurProperty (bool enabled); void handleClose (bool); void presentGroup (); void windowNotify (CompWindowNotify n); }; #define KDECOMPAT_WINDOW(w) \ KDECompatWindow *kw = KDECompatWindow::get(w) class KDECompatPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/kdecompat/kdecompat.xml.in0000644000015301777760000000347312321343002024227 0ustar pbusernogroup00000000000000 General <_short>KDE Compatibility <_long>KDE compatibility plugin animation composite opengl decor opengl <_short>Popup Slide Effect compiz-0.9.11+14.04.20140409/plugins/inotify/0000755000015301777760000000000012321344021020636 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/inotify/inotify.xml.in0000644000015301777760000000054012321343002023443 0ustar pbusernogroup00000000000000 <_short>File Watcher <_long>File change notification plugin Utility composite opengl decor compiz-0.9.11+14.04.20140409/plugins/inotify/CMakeLists.txt0000644000015301777760000000027112321343002023374 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) include (CheckIncludeFile) check_include_file ("sys/inotify.h" HAS_INOTIFY) if (HAS_INOTIFY) compiz_plugin(inotify) endif ()compiz-0.9.11+14.04.20140409/plugins/inotify/src/0000755000015301777760000000000012321344021021425 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/inotify/src/inotify.h0000644000015301777760000000372412321343002023263 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef COMPIZ_INOTIFY_H #define COMPIZ_INOTIFY_H #include #include #include class InotifyScreen : public ScreenInterface, public PluginClassHandler { public: InotifyScreen (CompScreen *screen); ~InotifyScreen (); void fileWatchAdded (CompFileWatch *fileWatch); void fileWatchRemoved (CompFileWatch *fileWatch); private: typedef struct { CompFileWatchHandle handle; int wd; } InotifyWatch; typedef std::list WatchList; void processEvents (); WatchList watches; int fd; CompWatchFdHandle fdHandle; }; class InotifyPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; #endif compiz-0.9.11+14.04.20140409/plugins/inotify/src/inotify.cpp0000644000015301777760000001040612321343002023611 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "inotify.h" #include #include #include #include COMPIZ_PLUGIN_20090315 (inotify, InotifyPluginVTable) InotifyScreen::InotifyScreen (CompScreen *screen) : PluginClassHandler (screen) { fd = inotify_init (); fdHandle = screen->addWatchFd (fd, POLLIN | POLLPRI | POLLHUP | POLLERR, boost::bind (&InotifyScreen::processEvents, this)); ScreenInterface::setHandler (screen, true); const CompFileWatchList &watchList = screen->getFileWatches (); CompFileWatchList::const_iterator iter; for (iter = watchList.begin (); iter != watchList.end (); ++iter) fileWatchAdded (*iter); } InotifyScreen::~InotifyScreen () { const CompFileWatchList &watchList = screen->getFileWatches (); CompFileWatchList::const_iterator iter; for (iter = watchList.begin (); iter != watchList.end (); ++iter) fileWatchRemoved (*iter); screen->removeWatchFd (fdHandle); close (fd); } void InotifyScreen::processEvents () { char buf[256 * (sizeof (struct inotify_event) + 16)]; int len; len = read (fd, buf, sizeof (buf)); if (len < 0) { perror ("read"); } else { struct inotify_event *event; int i = 0; WatchList::iterator iter; const CompFileWatchList &list = screen->getFileWatches (); CompFileWatchList::const_iterator wIter; while (i < len) { event = (struct inotify_event *) &buf[i]; for (iter = watches.begin (); iter != watches.end (); ++iter) if ((*iter).wd == event->wd) break; if (iter != watches.end ()) { for (wIter = list.begin (); wIter != list.end (); ++wIter) if ((*iter).handle == (*wIter)->handle) break; if (wIter != list.end ()) { const char *name = (event->len) ? event->name : NULL; (*wIter)->callBack (name); } } i += sizeof (*event) + event->len; } } } static unsigned int inotifyMask (CompFileWatch *watch) { unsigned int mask = 0; if (watch->mask & NOTIFY_CREATE_MASK) mask |= IN_CREATE; if (watch->mask & NOTIFY_DELETE_MASK) mask |= IN_DELETE; if (watch->mask & NOTIFY_MOVE_MASK) mask |= IN_MOVE; if (watch->mask & NOTIFY_MODIFY_MASK) mask |= IN_MODIFY; return mask; } void InotifyScreen::fileWatchAdded (CompFileWatch *fileWatch) { InotifyWatch iw; iw.handle = fileWatch->handle; iw.wd = inotify_add_watch (fd, fileWatch->path.c_str (), inotifyMask (fileWatch)); if (iw.wd < 0) { perror ("inotify_add_watch"); return; } watches.push_back (iw); } void InotifyScreen::fileWatchRemoved (CompFileWatch *fileWatch) { WatchList::iterator iter; for (iter = watches.begin (); iter != watches.end (); ++iter) { if ((*iter).handle == fileWatch->handle) { if (inotify_rm_watch (fd, (*iter).wd)) perror ("inotify_rm_watch"); watches.erase (iter); break; } } } bool InotifyPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/shift/0000755000015301777760000000000012321344021020272 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/shift/shift.xml.in0000644000015301777760000003436212321343002022544 0ustar pbusernogroup00000000000000 <_short>Shift Switcher <_long>Shift between open windows using a cover or flip mode Window Management fade obs composite opengl text decor opengl <_short>Bindings <_short>General Options <_short>Mouse Settings <_short>Appearance Reflection Settings <_short>Shift Mode <_short>Flip Mode <_short>Cover Mode <_short>Window Title Display compiz-0.9.11+14.04.20140409/plugins/shift/CMakeLists.txt0000644000015301777760000000015712321343002023033 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (shift PLUGINDEPS composite opengl text) compiz-0.9.11+14.04.20140409/plugins/shift/src/0000755000015301777760000000000012321344021021061 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/shift/src/shift.h0000644000015301777760000001401512321343002022346 0ustar pbusernogroup00000000000000/* * * Compiz shift switcher plugin * * shift.h * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * Based on ring.c: * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * Rounded corner drawing taken from wall.c: * Copyright : (C) 2007 Robert Carr * E-mail : racarr@beryl-project.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. * */ #include #include #include #include #include #include #include #include #include #include "shift_options.h" typedef enum { ShiftStateNone = 0, ShiftStateOut, ShiftStateSwitching, ShiftStateFinish, ShiftStateIn } ShiftState; typedef enum { ShiftTypeNormal = 0, ShiftTypeGroup, ShiftTypeAll } ShiftType; typedef struct _ShiftSlot { int x, y; /* thumb center coordinates */ float z; float scale; /* size scale (fits to maximal thumb size) */ float opacity; float rotation; GLfloat tx; GLfloat ty; bool primary; } ShiftSlot; typedef struct _ShiftDrawSlot { CompWindow *w; ShiftSlot *slot; float distance; } ShiftDrawSlot; class ShiftScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public ShiftOptions { public: ShiftScreen (CompScreen *); ~ShiftScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CompText text; public: void handleEvent (XEvent *); void preparePaint (int); void paint (CompOutput::ptrList &, unsigned int ); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); public: KeyCode mLeftKey; KeyCode mRightKey; KeyCode mUpKey; KeyCode mDownKey; CompScreen::GrabHandle mGrabIndex; ShiftState mState; ShiftType mType; bool mMoreAdjust; bool mMoveAdjust; float mMvTarget; float mMvAdjust; float mMvVelocity; bool mInvert; Cursor mCursor; /* only used for sorting */ CompWindow **mWindows; int mNWindows; int mWindowsSize; ShiftDrawSlot *mDrawSlots; int mNSlots; int mSlotsSize; ShiftDrawSlot *mActiveSlot; Window mClientLeader; Window mSelectedWindow; CompMatch mMatch; CompMatch *mCurrentMatch; CompOutput *mOutput; int mUsedOutput; float mReflectBrightness; bool mReflectActive; float mAnim; float mAnimVelocity; int mButtonPressTime; bool mButtonPressed; int mStartX; int mStartY; float mStartTarget; float mLastTitle; bool mPaintingAbove; bool mCancelled; public: void activateEvent (bool activating); void freeWindowTitle (); void renderWindowTitle (); void drawWindowTitle (const GLMatrix &transform); bool layoutThumbsCover (); bool layoutThumbsFlip (); bool layoutThumbs (); void addWindowToList (CompWindow *w); bool updateWindowList (); bool createWindowList (); void switchToWindow (bool toNext); int countWindows (); int adjustShiftMovement (float chunk); bool adjustShiftAnimationAttribs (float chunk); void term (bool cancel); bool terminate (CompAction *action, CompAction::State aState, CompOption::Vector &options); bool initiateScreen (CompAction *action, CompAction::State aState, CompOption::Vector &options); bool doSwitch (CompAction *action, CompAction::State aState, CompOption::Vector &options, bool nextWindow, ShiftType type); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector &options); bool initiateAll (CompAction *action, CompAction::State aState, CompOption::Vector &options); void windowRemove (Window id); }; class ShiftWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: ShiftWindow (CompWindow *); ~ShiftWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; public: bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool damageRect (bool initial, const CompRect &rect); public: ShiftSlot mSlots[2]; float mOpacity; float mBrightness; float mOpacityVelocity; float mBrightnessVelocity; bool mActive; public: bool adjustShiftAttribs (float chunk); bool canStackRelativeTo (); bool isShiftable (); }; extern const double PI; #define SHIFT_WINDOW(w) \ ShiftWindow *sw = ShiftWindow::get (w) #define SHIFT_SCREEN(s) \ ShiftScreen *ss = ShiftScreen::get (s) class ShiftPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/shift/src/shift.cpp0000644000015301777760000013771112321343002022712 0ustar pbusernogroup00000000000000/* * * Compiz shift switcher plugin * * shift.cpp * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * Based on ring.c: * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * Rounded corner drawing taken from wall.c: * Copyright : (C) 2007 Robert Carr * E-mail : racarr@beryl-project.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. * */ #include "shift.h" COMPIZ_PLUGIN_20090315 (shift, ShiftPluginVTable); const double PI = 3.14159265359f; bool textAvailable = false; void setFunctions (bool enabled) { SHIFT_SCREEN (screen); screen->handleEventSetEnabled (ss, enabled); ss->cScreen->preparePaintSetEnabled (ss, enabled); ss->cScreen->paintSetEnabled (ss, enabled); ss->gScreen->glPaintOutputSetEnabled (ss, enabled); ss->cScreen->donePaintSetEnabled (ss, enabled); foreach (CompWindow *w, screen->windows ()) { SHIFT_WINDOW (w); sw->gWindow->glPaintSetEnabled (sw, enabled); sw->cWindow->damageRectSetEnabled (sw, enabled); } } void ShiftScreen::activateEvent (bool activating) { CompOption::Vector o; o.resize (2); o[0] = CompOption ("root", CompOption::TypeInt); o[0].value ().set ((int) screen->root ()); o[1] = CompOption ("active", CompOption::TypeBool); o[1].value ().set (activating); screen->handleCompizEvent ("shift", "activate", o); } bool ShiftWindow::isShiftable () { SHIFT_SCREEN (screen); if (window->overrideRedirect () || (window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask))) return false; if (!window->mapNum () || !window->isViewable ()) { if (ss->optionGetMinimized ()) { if (!window->minimized () && !window->inShowDesktopMode () && !window->shaded ()) return false; } else return false; } if (ss->mType == ShiftTypeNormal) { if (!window->mapNum () || !window->isViewable ()) { if (window->serverGeometry ().x () + window->serverGeometry ().width () <= 0 || window->serverGeometry ().y () + window->serverGeometry ().height () <= 0 || window->serverGeometry ().x () >= screen->width () || window->serverGeometry ().y () >= screen->height ()) return false; } else if (!window->focus ()) return false; } else if (ss->mType == ShiftTypeGroup && ss->mClientLeader != window->clientLeader () && ss->mClientLeader != window->id ()) return false; if (window->state () & CompWindowStateSkipTaskbarMask || (ss->mCurrentMatch && !ss->mCurrentMatch->evaluate (window))) return false; return true; } void ShiftScreen::freeWindowTitle () { } void ShiftScreen::renderWindowTitle () { if (!textAvailable || !optionGetWindowTitle ()) return; CompText::Attrib tA; CompRect oe; freeWindowTitle (); if (optionGetMultioutputMode () == ShiftOptions::MultioutputModeOneBigSwitcher) oe.setGeometry (0, 0, screen->width (), screen->height ()); else oe = screen->getCurrentOutputExtents (); /* 75% of the output device as maximum width */ tA.maxWidth = oe.width () * 3 / 4; tA.maxHeight = 100; tA.family = "Sans"; tA.size = optionGetTitleFontSize (); tA.color[0] = optionGetTitleFontColorRed (); tA.color[1] = optionGetTitleFontColorGreen (); tA.color[2] = optionGetTitleFontColorBlue (); tA.color[3] = optionGetTitleFontColorAlpha (); tA.flags = CompText::WithBackground | CompText::Ellipsized; if (optionGetTitleFontBold ()) tA.flags |= CompText::StyleBold; tA.bgHMargin = 15; tA.bgVMargin = 15; tA.bgColor[0] = optionGetTitleBackColorRed (); tA.bgColor[1] = optionGetTitleBackColorGreen (); tA.bgColor[2] = optionGetTitleBackColorBlue (); tA.bgColor[3] = optionGetTitleBackColorAlpha (); text.renderWindowTitle (mSelectedWindow ? mSelectedWindow : None, mType == ShiftTypeAll, tA); } void ShiftScreen::drawWindowTitle (const GLMatrix &transform) { if (!textAvailable || !optionGetWindowTitle ()) return; CompRect oe; float width = text.getWidth (); float height = text.getHeight (); if (optionGetMultioutputMode () == MultioutputModeOneBigSwitcher) oe.setGeometry (0, 0, screen->width (), screen->height ()); else oe = (CompRect) screen->outputDevs ()[mUsedOutput]; float x = oe.centerX () - width / 2; float y; unsigned short verticalOffset = optionGetVerticalOffset (); /* assign y (for the lower corner!) according to the setting */ switch (optionGetTitleTextPlacement ()) { case TitleTextPlacementCenteredOnScreen: y = oe.centerY () + height / 2; break; case TitleTextPlacementTopOfScreenMinusOffset: case TitleTextPlacementBottomOfScreenPlusOffset: { CompRect workArea = screen->currentOutputDev ().workArea (); if (optionGetTitleTextPlacement () == TitleTextPlacementTopOfScreenMinusOffset) y = oe.y1 () + workArea.y1 () + height + verticalOffset; else /* TitleTextPlacementBottomOfScreenPlusOffset */ y = oe.y1 () + workArea.y2 () - verticalOffset; } break; default: return; } text.draw (transform, floor (x), floor (y), 1.0f); } bool ShiftWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; SHIFT_SCREEN (screen); if (ss->mState != ShiftStateNone && !ss->mPaintingAbove && !(window->wmType () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) { GLWindowPaintAttrib sAttrib = attrib; bool scaled = false; if (window->mapNum () && gWindow->textures ().empty ()) gWindow->bind (); if (mActive) scaled = (ss->mActiveSlot != NULL); if (mOpacity > 0.01 && (ss->mActiveSlot == NULL)) { sAttrib.brightness = sAttrib.brightness * mBrightness; sAttrib.opacity = sAttrib.opacity * mOpacity; } else mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; if (mActive && ((unsigned int) ss->mOutput->id () == (unsigned int) ss->mUsedOutput || (unsigned int) ss->mOutput->id () == (unsigned int) ~0)) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; status = gWindow->glPaint (sAttrib, transform, region, mask); if (scaled && !gWindow->textures ().empty ()) { GLWindowPaintAttrib wAttrib (attrib); GLMatrix wTransform = transform; ShiftSlot *slot = ss->mActiveSlot->slot; float sx = ss->mAnim * slot->tx; float sy = ss->mAnim * slot->ty; float sz = ss->mAnim * slot->z; float srot = (ss->mAnim * slot->rotation); float anim = MIN (1.0, MAX (0.0, ss->mAnim)); float sscale; float sopacity; if (slot->primary) sscale = (ss->mAnim * slot->scale) + (1 - ss->mAnim); else sscale = ss->mAnim * slot->scale; if (slot->primary && !ss->mReflectActive) sopacity = (ss->mAnim * slot->opacity) + (1 - ss->mAnim); else sopacity = anim * anim * slot->opacity; if (sopacity <= 0.05) return status; /*if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) return false;*/ wAttrib.opacity = (float)wAttrib.opacity * sopacity; wAttrib.brightness = (float)wAttrib.brightness * ss->mReflectBrightness; if (window->alpha () || wAttrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.translate (sx, sy, sz); wTransform.translate (window->x () + (window->width () * sscale / 2), window->y () + (window->height () * sscale / 2), 0.0f); wTransform.scale (ss->mOutput->width (), -ss->mOutput->height (), 1.0f); wTransform.rotate (srot, 0.0, 1.0, 0.0); wTransform.scale (1.0f / ss->mOutput->width (), -1.0f / ss->mOutput->height (), 1.0f); wTransform.scale (sscale, sscale, 1.0f); wTransform.translate (-window->x () - (window->width () / 2), -window->y () - (window->height () / 2), 0.0f); gWindow->glDraw (wTransform, wAttrib, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); } if (scaled && ((ss->optionGetOverlayIcon () != ShiftOptions::OverlayIconNone) || gWindow->textures ().empty ())) { GLTexture *icon; icon = gWindow->getIcon (512, 512); if (!icon) icon = ss->gScreen->defaultIcon (); if (icon && (icon->name ())) { float scale; float x, y; int iconOverlay = ss->optionGetOverlayIcon (); ShiftSlot *slot = ss->mActiveSlot->slot; GLTexture::MatrixList matl; float sx = ss->mAnim * slot->tx; float sy = ss->mAnim * slot->ty; float sz = ss->mAnim * slot->z; float srot = ss->mAnim * slot->rotation; float sopacity = ss->mAnim * slot->opacity; float sscale; if (slot->primary) sscale = (ss->mAnim * slot->scale) + (1 - ss->mAnim); else sscale = ss->mAnim * ss->mAnim * slot->scale; int scaledWinWidth = window->width () * sscale; int scaledWinHeight = window->height () * sscale; if (gWindow->textures ().empty ()) iconOverlay = ShiftOptions::OverlayIconBig; switch (iconOverlay) { case ShiftOptions::OverlayIconNone: case ShiftOptions::OverlayIconEmblem: scale = 1.0f; break; case ShiftOptions::OverlayIconBig: default: /* only change opacity if not painting an icon for a minimized window */ if (!gWindow->textures ().empty ()) sAttrib.opacity /= 3; scale = MIN (((float) scaledWinWidth / icon->width ()), ((float) scaledWinHeight / icon->height ())); break; } int width = icon->width () * scale; int height = icon->height () * scale; switch (iconOverlay) { case ShiftOptions::OverlayIconNone: case ShiftOptions::OverlayIconEmblem: x = scaledWinWidth - width; y = scaledWinHeight - height; break; case ShiftOptions::OverlayIconBig: default: x = scaledWinWidth / 2 - width / 2; y = scaledWinHeight / 2 - height / 2; break; } mask |= PAINT_WINDOW_BLEND_MASK; /* if we paint the icon for a minimized window, we need to force the usage of a good texture filter */ if (gWindow->textures ().empty ()) mask |= PAINT_WINDOW_TRANSFORMED_MASK; CompRegion iconReg = CompRegion (0, 0, icon->width (), icon->height ()); gWindow->vertexBuffer ()->begin (); matl.push_back (icon->matrix ()); gWindow->glAddGeometry (matl, iconReg, iconReg); if (gWindow->vertexBuffer ()->end ()) { GLWindowPaintAttrib wAttrib (sAttrib); GLMatrix wTransform (transform); if (gWindow->textures ().empty ()) sAttrib.opacity = gWindow->paintAttrib ().opacity; wAttrib = GLWindowPaintAttrib (sAttrib); wAttrib.opacity = (float)wAttrib.opacity * sopacity; wAttrib.brightness = (float)wAttrib.brightness * ss->mReflectBrightness; wTransform.translate (sx, sy, sz); wTransform.translate (window->x () + (window->width () * sscale / 2), window->y () + (window->height () * sscale / 2), 0.0f); wTransform.scale (ss->mOutput->width (), -ss->mOutput->height (), 1.0f); wTransform.rotate (srot, 0.0, 1.0, 0.0); wTransform.scale (1.0f / ss->mOutput->width (), -1.0f / ss->mOutput->height (), 1.0f); wTransform.translate (x - (window->width () * sscale / 2), y - (window->height () * sscale / 2), 0.0f); wTransform.scale (scale, scale, 1.0f); gWindow->glDrawTexture (icon, wTransform, wAttrib, mask); } } } } else { GLWindowPaintAttrib sAttrib = attrib; if (ss->mPaintingAbove) { sAttrib.opacity = sAttrib.opacity * (1.0 - ss->mAnim); if (ss->mAnim > 0.99) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; } status = gWindow->glPaint (sAttrib, transform, region, mask); } return status; } static int compareWindows (const void *elem1, const void *elem2) { CompWindow *w1 = *((CompWindow **) elem1); CompWindow *w2 = *((CompWindow **) elem2); CompWindow *w = w1; if (w1 == w2) return 0; if (!w1->shaded () && !w1->isViewable () && (w2->shaded () || w2->isViewable ())) return 1; if (!w2->shaded () && !w2->isViewable () && (w1->shaded () || w1->isViewable ())) return -1; while (w) { if (w == w2) return 1; w = w->next; } return -1; } static int compareShiftWindowDistance (const void *elem1, const void *elem2) { float a1 = ((ShiftDrawSlot *) elem1)->distance; float a2 = ((ShiftDrawSlot *) elem2)->distance; float ab = fabs (a1 - a2); if (ab > 0.3 && a1 > a2) return -1; else if (ab > 0.3 && a1 < a2) return 1; else return compareWindows (&((ShiftDrawSlot *) elem2)->w, &((ShiftDrawSlot *) elem1)->w); } bool ShiftScreen::layoutThumbsCover () { CompWindow *w; int ww, wh; float xScale, yScale; float distance; CompRect oe; if (optionGetMultioutputMode () == ShiftScreen::MultioutputModeOneBigSwitcher) oe.setGeometry (0, 0, screen->width (), screen->height ()); else oe = screen->outputDevs ()[mUsedOutput]; /* the center of the ellipse is in the middle of the used output device */ int centerX = oe.centerX (); int centerY = oe.centerY (); int maxThumbWidth = oe.width () * optionGetSize () / 100; int maxThumbHeight = oe.height () * optionGetSize () / 100; for (int index = 0; index < mNWindows; ++index) { w = mWindows[index]; SHIFT_WINDOW (w); ww = w->width () + w->border ().left + w->border ().right; wh = w->height () + w->border ().top + w->border ().bottom; if (ww > maxThumbWidth) xScale = (float)(maxThumbWidth) / (float)ww; else xScale = 1.0f; if (wh > maxThumbHeight) yScale = (float)(maxThumbHeight) / (float)wh; else yScale = 1.0f; float val1 = floor((float) MIN (mNWindows, optionGetCoverMaxVisibleWindows ()) / 2.0); float pos; float space = (maxThumbWidth / 2); space *= cos (sin (PI / 4) * PI / 3); space *= 2; //space += (space / sin (PI / 4)) - space; for (int i = 0; i < 2; ++i) { if (mInvert ^ (i == 0)) { distance = mMvTarget - index; distance += optionGetCoverOffset (); } else { distance = mMvTarget - index + mNWindows; distance += optionGetCoverOffset (); if (distance > mNWindows) distance -= mNWindows * 2; } pos = MIN (1.0, MAX (-1.0, distance)); sw->mSlots[i].opacity = 1.0 - MIN (1.0, MAX (0.0, fabs(distance) - val1)); sw->mSlots[i].scale = MIN (xScale, yScale); sw->mSlots[i].y = centerY + (maxThumbHeight / 2.0) - (((w->height () / 2.0) + w->border ().bottom) * sw->mSlots[i].scale); if (fabs(distance) < 1.0) { sw->mSlots[i].x = centerX + (sin(pos * PI * 0.5) * space * optionGetCoverExtraSpace ()); sw->mSlots[i].z = fabs (distance); sw->mSlots[i].z *= -(maxThumbWidth / (2.0 * oe.width ())); sw->mSlots[i].rotation = sin(pos * PI * 0.5) * -optionGetCoverAngle (); } else { float rad = (space / oe.width ()) / sin(PI / 6.0); float ang = (PI / MAX(72.0, mNWindows * 2)) * (distance - pos) + (pos * (PI / 6.0)); sw->mSlots[i].x = centerX; sw->mSlots[i].x += sin(ang) * rad * oe.width () * optionGetCoverExtraSpace (); sw->mSlots[i].rotation = optionGetCoverAngle () + 30; sw->mSlots[i].rotation -= fabs(ang) * 180.0 / PI; sw->mSlots[i].rotation *= -pos; sw->mSlots[i].z = -(maxThumbWidth / (2.0 * oe.width ())); sw->mSlots[i].z += -(cos(PI / 6.0) * rad); sw->mSlots[i].z += (cos(ang) * rad); } mDrawSlots[index * 2 + i].w = w; mDrawSlots[index * 2 + i].slot = &sw->mSlots[i]; mDrawSlots[index * 2 + i].distance = fabs(distance); } if (mDrawSlots[index * 2].distance > mDrawSlots[index * 2 + 1].distance) { mDrawSlots[index * 2].slot->primary = false; mDrawSlots[index * 2 + 1].slot->primary = true; } else { mDrawSlots[index * 2].slot->primary = true; mDrawSlots[index * 2 + 1].slot->primary = false; } } mNSlots = mNWindows * 2; qsort (mDrawSlots, mNSlots, sizeof (ShiftDrawSlot), compareShiftWindowDistance); return true; } bool ShiftScreen::layoutThumbsFlip () { CompWindow *w; int ww, wh; float xScale, yScale; float distance; float angle; CompRect oe; if (optionGetMultioutputMode () == ShiftOptions::MultioutputModeOneBigSwitcher) oe.setGeometry (0, 0, screen->width (), screen->height ()); else oe = screen->outputDevs ()[mUsedOutput]; /* the center of the ellipse is in the middle of the used output device */ int centerX = oe.centerX (); int centerY = oe.centerY (); int maxThumbWidth = oe.width () * optionGetSize () / 100; int maxThumbHeight = oe.height () * optionGetSize () / 100; int slotNum = 0; for (int index = 0; index < mNWindows; ++index) { w = mWindows[index]; SHIFT_WINDOW (w); ww = w->width () + w->border ().left + w->border ().right; wh = w->height () + w->border ().top + w->border ().bottom; if (ww > maxThumbWidth) xScale = (float)(maxThumbWidth) / (float)ww; else xScale = 1.0f; if (wh > maxThumbHeight) yScale = (float)(maxThumbHeight) / (float)wh; else yScale = 1.0f; angle = optionGetFlipRotation () * PI / 180.0; for (int i = 0; i < 2; ++i) { if (mInvert ^ (i == 0)) distance = mMvTarget - index; else { distance = mMvTarget - index + mNWindows; if (distance > 1.0) distance -= mNWindows * 2; } if (distance > 0.0) sw->mSlots[i].opacity = MAX (0.0, 1.0 - (distance * 1.0)); else { if (distance < -(mNWindows - 1)) sw->mSlots[i].opacity = MAX (0.0, mNWindows + distance); else sw->mSlots[i].opacity = 1.0; } if (distance > 0.0 && w->id () != mSelectedWindow) sw->mSlots[i].primary = false; else sw->mSlots[i].primary = true; sw->mSlots[i].scale = MIN (xScale, yScale); sw->mSlots[i].y = centerY + (maxThumbHeight / 2.0) - (((w->height () / 2.0) + w->border ().bottom) * sw->mSlots[i].scale); sw->mSlots[i].x = sin(angle) * distance * (maxThumbWidth / 2); if (distance > 0 && false) sw->mSlots[i].x *= 1.5; sw->mSlots[i].x += centerX; sw->mSlots[i].z = cos(angle) * distance; if (distance > 0) sw->mSlots[i].z *= 1.5; sw->mSlots[i].z *= (maxThumbWidth / (2.0 * oe.width ())); sw->mSlots[i].rotation = optionGetFlipRotation (); if (sw->mSlots[i].opacity > 0.0) { mDrawSlots[slotNum].w = w; mDrawSlots[slotNum].slot = &sw->mSlots[i]; mDrawSlots[slotNum].distance = -distance; ++slotNum; } } } mNSlots = slotNum; qsort (mDrawSlots, mNSlots, sizeof (ShiftDrawSlot), compareShiftWindowDistance); return true; } bool ShiftScreen::layoutThumbs () { bool result = false; if (mState == ShiftStateNone) return false; switch (optionGetMode ()) { case ShiftScreen::ModeCover: result = layoutThumbsCover (); break; case ShiftScreen::ModeFlip: result = layoutThumbsFlip (); break; } if (mState == ShiftStateIn) return false; return result; } void ShiftScreen::addWindowToList (CompWindow *w) { if (mWindowsSize <= mNWindows) { mWindows = (CompWindow **) realloc (mWindows, sizeof (CompWindow *) * (mNWindows + 32)); if (!mWindows) return; mWindowsSize = mNWindows + 32; } if (mSlotsSize <= mNWindows * 2) { mDrawSlots = (ShiftDrawSlot *) realloc (mDrawSlots, sizeof (ShiftDrawSlot) * ((mNWindows * 2) + 64)); if (!mDrawSlots) { free (mDrawSlots); return; } mSlotsSize = (mNWindows * 2) + 64; } mWindows[mNWindows++] = w; } bool ShiftScreen::updateWindowList () { CompWindow **wins; qsort (mWindows, mNWindows, sizeof (CompWindow *), compareWindows); mMvTarget = 0; mMvAdjust = 0; mMvVelocity = 0; for (int i = 0; i < mNWindows; ++i) { if (mWindows[i]->id () == mSelectedWindow) break; ++mMvTarget; } if (mMvTarget == mNWindows) mMvTarget = 0; /* create special window order to create a good animation * A,B,C,D,E --> A,B,D,E,C to get B,D,E,C,(A),B,D,E,C as initial state */ if (optionGetMode () == ShiftScreen::ModeCover) { int idx; wins = (CompWindow **) malloc(mNWindows * sizeof (CompWindow *)); if (!wins) return false; memcpy(wins, mWindows, mNWindows * sizeof (CompWindow *)); for (int i = 0; i < mNWindows; ++i) { idx = ceil (i * 0.5); idx *= (i & 1) ? 1 : -1; if (idx < 0) idx += mNWindows; mWindows[idx] = wins[i]; } free (wins); } return layoutThumbs (); } bool ShiftScreen::createWindowList () { mNWindows = 0; foreach (CompWindow *w, screen->windows ()) { SHIFT_WINDOW (w); if (sw->isShiftable ()) { addWindowToList (w); sw->mActive = true; } } return updateWindowList (); } void ShiftScreen::switchToWindow (bool toNext) { CompWindow *w; int cur; if (!mGrabIndex) return; for (cur = 0; cur < mNWindows; ++cur) { if (mWindows[cur]->id () == mSelectedWindow) break; } if (cur == mNWindows) return; if (toNext) w = mWindows[(cur + 1) % mNWindows]; else w = mWindows[(cur + mNWindows - 1) % mNWindows]; if (w) { Window old = mSelectedWindow; mSelectedWindow = w->id (); if (old != w->id ()) { if (toNext) mMvAdjust += 1; else mMvAdjust -= 1; mMoveAdjust = true; cScreen->damageScreen (); renderWindowTitle (); } } } int ShiftScreen::countWindows () { int count = 0; foreach (CompWindow *w, screen->windows ()) { if (ShiftWindow::get (w)->isShiftable ()) ++count; } return count; } int ShiftScreen::adjustShiftMovement (float chunk) { float dx = mMvAdjust; float adjust = dx * 0.15f; float amount = fabs(dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; mMvVelocity = (amount * mMvVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.002f && fabs (mMvVelocity) < 0.004f) { mMvVelocity = 0.0f; mMvTarget = mMvTarget + mMvAdjust; mMvAdjust = 0; layoutThumbs (); return false; } float change = mMvVelocity * chunk; if (!change && mMvVelocity) change = (mMvAdjust > 0) ? 0.01 : -0.01; mMvAdjust -= change; mMvTarget += change; while (mMvTarget >= mNWindows) { mMvTarget -= mNWindows; mInvert = !mInvert; } while (mMvTarget < 0) { mMvTarget += mNWindows; mInvert = !mInvert; } if (!layoutThumbs ()) return false; return true; } bool ShiftWindow::adjustShiftAttribs (float chunk) { float opacity, brightness; SHIFT_SCREEN (screen); if ((mActive && ss->mState != ShiftStateIn && ss->mState != ShiftStateNone) || (ss->optionGetHideAll () && !(window->type () & CompWindowTypeDesktopMask) && (ss->mState == ShiftStateOut || ss->mState == ShiftStateSwitching || ss->mState == ShiftStateFinish))) opacity = 0.0; else opacity = 1.0; if (ss->mState == ShiftStateIn || ss->mState == ShiftStateNone) brightness = 1.0; else brightness = ss->optionGetBackgroundIntensity (); float dp = opacity - mOpacity; float adjust = dp * 0.1f; float amount = fabs (dp) * 7.0f; if (amount < 0.01f) amount = 0.01f; else if (amount > 0.15f) amount = 0.15f; mOpacityVelocity = (amount * mOpacityVelocity + adjust) / (amount + 1.0f); float db = brightness - mBrightness; adjust = db * 0.1f; amount = fabs (db) * 7.0f; if (amount < 0.01f) amount = 0.01f; else if (amount > 0.15f) amount = 0.15f; mBrightnessVelocity = (amount * mBrightnessVelocity + adjust) / (amount + 1.0f); /* FIXME: There is a possible floating point overflow here, * can be worked-around but not particularly nice */ if ((fabs (dp) < 0.1f && fabs (mOpacityVelocity) < 0.2f && fabs (db) < 0.1f && fabs (mBrightnessVelocity) < 0.2f) || (fabs(db) != fabs (db) || fabs (mOpacityVelocity) != fabs (mOpacityVelocity) || fabs (dp) != fabs (dp) || fabs (mBrightnessVelocity) != fabs (mBrightnessVelocity))) { mBrightness = brightness; mOpacity = opacity; return false; } mBrightness += mBrightnessVelocity * chunk; mOpacity += mOpacityVelocity * chunk; return true; } bool ShiftScreen::adjustShiftAnimationAttribs (float chunk) { float anim; if (mState != ShiftStateIn && mState != ShiftStateNone) anim = 1.0; else anim = 0.0; float dr = anim - mAnim; float adjust = dr * 0.1f; float amount = fabs (dr) * 7.0f; if (amount < 0.002f) amount = 0.002f; else if (amount > 0.15f) amount = 0.15f; mAnimVelocity = (amount * mAnimVelocity + adjust) / (amount + 1.0f); if (fabs (dr) < 0.002f && fabs (mAnimVelocity) < 0.004f) { mAnim = anim; return false; } mAnim += mAnimVelocity * chunk; return true; } bool ShiftScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (mState != ShiftStateNone) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; mPaintingAbove = false; mOutput = output; bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (mState != ShiftStateNone && ((unsigned int) output->id () == (unsigned int) mUsedOutput || ((unsigned int) output->id () == (unsigned int) ~0))) { CompWindow *w; GLMatrix sTransform (transform); int oy1 = screen->outputDevs ()[mUsedOutput].region ()->extents.y1; int oy2 = screen->outputDevs ()[mUsedOutput].region ()->extents.y2; int maxThumbHeight = (oy2 - oy1) * optionGetSize () / 100; int oldFilter = gScreen->textureFilter (); int i; if (optionGetMultioutputMode () == ShiftOptions::MultioutputModeOneBigSwitcher) { oy1 = 0; oy2 = screen->height (); } sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); /* Reflection drawing */ if (optionGetReflection ()) { GLMatrix rTransform = sTransform; GLMatrix r2Transform; GLushort colorData[4]; GLfloat vertexData[12]; int cull; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); glGetIntegerv (GL_CULL_FACE_MODE, &cull); int cullInv = (cull == GL_BACK)? GL_FRONT : GL_BACK; rTransform.translate (0.0, oy1 + oy2 + maxThumbHeight, 0.0); rTransform.scale (1.0, -1.0, 1.0); glCullFace (cullInv); if (optionGetMipmaps ()) gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); mReflectActive = true; mReflectBrightness = optionGetIntensity (); for (i = 0; i < mNSlots; ++i) { w = mDrawSlots[i].w; SHIFT_WINDOW (w); mActiveSlot = &mDrawSlots[i]; { sw->gWindow->glPaint (sw->gWindow->paintAttrib (), rTransform, infiniteRegion, 0); } } glCullFace (cull); glEnable(GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); r2Transform.translate (0.0, 0.0, -DEFAULT_Z_CAMERA); streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = 0; colorData[1] = 0; colorData[2] = 0; colorData[3] = 0; streamingBuffer->addColors (1, colorData); streamingBuffer->addColors (1, colorData); colorData[3] = MIN (1.0, 1.0 - optionGetIntensity ()) * 2.0 * mAnim; streamingBuffer->addColors (1, colorData); streamingBuffer->addColors (1, colorData); vertexData[0] = 0.5; vertexData[1] = 0; vertexData[2] = 0; vertexData[3] = -0.5; vertexData[4] = 0; vertexData[5] = 0; vertexData[6] = 0.5; vertexData[7] = -0.5; vertexData[8] = 0; vertexData[9] = -0.5; vertexData[10] = -0.5; vertexData[11] = 0; streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (r2Transform); if (optionGetGroundSize () > 0.0) { streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = optionGetGroundColor1 ()[0]; colorData[1] = optionGetGroundColor1 ()[1]; colorData[2] = optionGetGroundColor1 ()[2]; colorData[3] = (float)optionGetGroundColor1 ()[3] * mAnim; streamingBuffer->addColors (1, colorData); streamingBuffer->addColors (1, colorData); colorData[3] = (float)optionGetGroundColor2 ()[3] * mAnim; streamingBuffer->addColors (1, colorData); streamingBuffer->addColors (1, colorData); vertexData[0] = -0.5; vertexData[1] = -0.5; vertexData[2] = 0; vertexData[3] = 0.5; vertexData[4] = -0.5; vertexData[5] = 0; vertexData[6] = -0.5; vertexData[7] = -0.5 + optionGetGroundSize (); vertexData[8] = 0; vertexData[9] = 0.5; vertexData[10] = -0.5 + optionGetGroundSize (); vertexData[11] = 0; streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (r2Transform); } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_BLEND); } /* Drawing normal windows */ mReflectBrightness = 1.0; mReflectActive = false; for (i = 0; i < mNSlots; ++i) { w = mDrawSlots[i].w; SHIFT_WINDOW (w); mActiveSlot = &mDrawSlots[i]; { sw->gWindow->glPaint (sw->gWindow->paintAttrib (), sTransform, infiniteRegion, 0); } } mActiveSlot = NULL; gScreen->setTextureFilter (oldFilter); if (textAvailable && (mState != ShiftStateIn)) drawWindowTitle (sTransform); if (mState == ShiftStateIn || mState == ShiftStateOut) { bool found; mPaintingAbove = true; w = screen->findWindow (mSelectedWindow); for (; w; w = w->next) { if (w->destroyed () || (!w->shaded () && (!w->isViewable () || !CompositeWindow::get (w)->damaged ()))) continue; found = false; for (i = 0; i < mNWindows; ++i) { if (mWindows[i] == w) found = true; } if (found) continue; SHIFT_WINDOW (w); sw->gWindow->glPaint (sw->gWindow->paintAttrib (), sTransform, infiniteRegion, 0); } mPaintingAbove = false; } } return status; } void ShiftScreen::paint (CompOutput::ptrList &outputs, unsigned int mask) { if (mState != ShiftStateNone && outputs.size () > 0 && optionGetMultioutputMode () == ShiftOptions::MultioutputModeOneBigSwitcher) { CompOutput::ptrList newOutputs; newOutputs.push_back (&screen->fullscreenOutput ()); cScreen->paint (newOutputs, mask); return; } cScreen->paint (outputs, mask); return; } void ShiftScreen::preparePaint (int msSinceLastPaint) { if (mState != ShiftStateNone && (mMoreAdjust || mMoveAdjust)) { float amount = msSinceLastPaint * 0.05f * optionGetShiftSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; while (steps--) { mMoveAdjust = adjustShiftMovement (chunk); if (!mMoveAdjust) break; } amount = msSinceLastPaint * 0.05f * optionGetSpeed (); steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float) steps; while (steps--) { mMoreAdjust = adjustShiftAnimationAttribs (chunk); foreach (CompWindow *w, screen->windows ()) { SHIFT_WINDOW (w); mMoreAdjust |= sw->adjustShiftAttribs (chunk); for (int i = 0; i < 2; ++i) { ShiftSlot *slot = &sw->mSlots[i]; slot->tx = slot->x - w->x () - (w->width () * slot->scale) / 2; slot->ty = slot->y - w->y () - (w->height () * slot->scale) / 2; } } if (!mMoreAdjust) break; } } cScreen->preparePaint (msSinceLastPaint); } bool ShiftWindow::canStackRelativeTo () { if (window->overrideRedirect () || (!window->shaded () && !window->pendingMaps () && (!window->isViewable () || window->mapNum () == 0))) return false; return true; } void ShiftScreen::donePaint () { if (mState != ShiftStateNone) { if (mMoreAdjust) cScreen->damageScreen (); else { if (mState == ShiftStateIn) { mState = ShiftStateNone; activateEvent (false); foreach (CompWindow *w, screen->windows ()) { SHIFT_WINDOW (w); sw->mActive = false; } setFunctions (false); cScreen->damageScreen (); } else if (mState == ShiftStateOut) mState = ShiftStateSwitching; if (mMoveAdjust) cScreen->damageScreen (); else if (mState == ShiftStateFinish) { CompWindow *w; mState = ShiftStateIn; mMoreAdjust = true; cScreen->damageScreen (); if (!mCancelled && mMvTarget != 0) { CompWindow *pw = NULL; for (int i = 0; i < mNSlots; ++i) { w = mDrawSlots[i].w; SHIFT_WINDOW (w); if (mDrawSlots[i].slot->primary && sw->canStackRelativeTo ()) { if (pw) w->restackAbove (pw); pw = w; } } } if (!mCancelled && mSelectedWindow) { w = screen->findWindow (mSelectedWindow); if (w) screen->sendWindowActivationRequest (mSelectedWindow); } } cScreen->damageScreen (); } } cScreen->donePaint (); } void ShiftScreen::term (bool cancel) { if (mGrabIndex) { screen->removeGrab (mGrabIndex, 0); mGrabIndex = 0; } if (mState != ShiftStateNone) { if (cancel && mMvTarget != 0) { if (mNWindows - mMvTarget > mMvTarget) mMvAdjust = -mMvTarget; else mMvAdjust = mNWindows - mMvTarget; mMoveAdjust = true; } mMoreAdjust = false; mMoveAdjust = false; mState = ShiftStateFinish; mCancelled = cancel; cScreen->damageScreen (); } } bool ShiftScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root", 0); if (!(xid && screen->root () != xid)) { term ((state & CompAction::StateCancel)); if (action->state () & CompAction::StateTermButton) action->setState (action->state () & ~CompAction::StateTermButton); if (action->state () & CompAction::StateTermKey) action->setState (action->state () & ~CompAction::StateTermKey); } return false; } bool ShiftScreen::initiateScreen (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist ("shift", NULL)) return false; mCurrentMatch = &(optionGetWindowMatch ()); CompMatch match = CompOption::getMatchOptionNamed ( options, "match", CompMatch::emptyMatch); if (match != CompMatch::emptyMatch) { mMatch = match; mMatch.update (); mCurrentMatch = &mMatch; } int count = countWindows (); if (count < 1) return false; if (!mGrabIndex) mGrabIndex = screen->pushGrab (screen->invisibleCursor (), "shift"); if (mGrabIndex) { mState = ShiftStateOut; activateEvent (true); if (!createWindowList ()) return false; mSelectedWindow = mWindows[0]->id (); renderWindowTitle (); mMvTarget = 0; mMvAdjust = 0; mMvVelocity = 0; mMoreAdjust = true; cScreen->damageScreen (); } mUsedOutput = screen->currentOutputDev ().id (); setFunctions (true); return true; } bool ShiftScreen::doSwitch (CompAction *action, CompAction::State state, CompOption::Vector &options, bool nextWindow, ShiftType type) { bool ret = true; bool initial = false; if ((mState == ShiftStateNone) || (mState == ShiftStateIn)) { if (type == ShiftTypeGroup) { CompWindow *w; w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) { mType = ShiftTypeGroup; mClientLeader = (w->clientLeader ()) ? w->clientLeader () : w->id (); ret = initiateScreen (action, state, options); } } else { mType = type; ret = initiateScreen (action, state, options); } if (state & CompAction::StateInitKey) action->setState (state | CompAction::StateTermKey); if (state & CompAction::StateInitButton) action->setState (state | CompAction::StateTermButton); if (state & CompAction::StateInitEdge) action->setState (state | CompAction::StateTermEdge); initial = true; } if (ret) { switchToWindow (nextWindow); if (initial && false) { mMvTarget += mMvAdjust; mMvAdjust = 0.0; } } return ret; } bool ShiftScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector &options) { bool ret = true; mType = ShiftTypeNormal; if ((mState == ShiftStateNone) || (mState == ShiftStateIn) || (mState == ShiftStateFinish)) ret = initiateScreen (action, state, options); else ret = terminate (action, state, options); if (state & CompAction::StateTermButton) action->setState (state & ~CompAction::StateTermButton); if (state & CompAction::StateTermKey) action->setState (state & ~CompAction::StateTermKey); return ret; } bool ShiftScreen::initiateAll (CompAction *action, CompAction::State state, CompOption::Vector &options) { bool ret = true; mType = ShiftTypeAll; if ((mState == ShiftStateNone) || (mState == ShiftStateIn) || (mState == ShiftStateFinish)) ret = initiateScreen (action, state, options); else ret = terminate (action, state, options); if (state & CompAction::StateTermButton) action->setState (state & ~CompAction::StateTermButton); if (state & CompAction::StateTermKey) action->setState (state & ~CompAction::StateTermKey); return ret; } void ShiftScreen::windowRemove (Window id) { CompWindow *w = screen->findWindow (id); if (w) { bool inList = false; int j, i = 0; SHIFT_WINDOW (w); if (mState == ShiftStateNone || sw->isShiftable ()) return; Window selected = mSelectedWindow; while (i < mNWindows) { if (w->id () == mWindows[i]->id ()) { inList = true; if (w->id () == selected) { if (i < (mNWindows - 1)) selected = mWindows[i + 1]->id (); else selected = mWindows[0]->id (); mSelectedWindow = selected; } --mNWindows; for (j = i; j < mNWindows; ++j) mWindows[j] = mWindows[j + 1]; } else ++i; } if (!inList) return; if (mNWindows == 0) { CompOption o; CompOption::Vector opts; o = CompOption ("root", CompOption::TypeInt); o.value ().set ((int) screen->root ()); opts.push_back (o); terminate (NULL, 0, opts); return; } // Let the window list be updated to avoid crash // when a window is closed while ending shift (ShiftStateIn). if (!mGrabIndex && mState != ShiftStateIn) return; if (updateWindowList ()) { mMoreAdjust = true; mState = ShiftStateOut; cScreen->damageScreen (); } } } void ShiftScreen::handleEvent (XEvent *event) { screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == XA_WM_NAME) { CompWindow *w; w = screen->findWindow (event->xproperty.window); if (w) if (mGrabIndex && (w->id () == mSelectedWindow)) { renderWindowTitle (); cScreen->damageScreen (); } } break; case UnmapNotify: windowRemove (event->xunmap.window); break; case DestroyNotify: windowRemove (event->xdestroywindow.window); break; case KeyPress: if (mState == ShiftStateSwitching) { if (event->xkey.keycode == mLeftKey) switchToWindow (false); else if (event->xkey.keycode == mRightKey) switchToWindow (true); else if (event->xkey.keycode == mUpKey) switchToWindow (false); else if (event->xkey.keycode == mDownKey) switchToWindow (true); } break; case ButtonPress: if (mState == ShiftStateSwitching || mState == ShiftStateOut) { if (event->xbutton.button == Button5) switchToWindow (false); else if (event->xbutton.button == Button4) switchToWindow (true); if (event->xbutton.button == Button1) { mButtonPressTime = event->xbutton.time; mButtonPressed = true; mStartX = event->xbutton.x_root; mStartY = event->xbutton.y_root; mStartTarget = mMvTarget + mMvAdjust; } } break; case ButtonRelease: if ((mState == ShiftStateSwitching || mState == ShiftStateOut) && event->xbutton.button == Button1 && mButtonPressed) { int iNew; if ((int)(event->xbutton.time - mButtonPressTime) < optionGetClickDuration ()) term (false); mButtonPressTime = 0; mButtonPressed = false; if (mMvTarget - floor (mMvTarget) >= 0.5) { mMvAdjust = ceil(mMvTarget) - mMvTarget; iNew = ceil(mMvTarget); } else { mMvAdjust = floor(mMvTarget) - mMvTarget; iNew = floor(mMvTarget); } while (iNew < 0) iNew += mNWindows; iNew = iNew % mNWindows; mSelectedWindow = mWindows[iNew]->id (); renderWindowTitle (); mMoveAdjust = true; cScreen->damageScreen (); } break; case MotionNotify: if ((mState == ShiftStateSwitching || mState == ShiftStateOut) && mButtonPressed) { CompRect oe = screen->outputDevs ()[mUsedOutput]; float div = 0; int wx = 0; int wy = 0; int iNew; switch (optionGetMode ()) { case ShiftOptions::ModeCover: div = event->xmotion.x_root - mStartX; div /= oe.width () / optionGetMouseSpeed (); break; case ShiftOptions::ModeFlip: div = event->xmotion.y_root - mStartY; div /= oe.height () / optionGetMouseSpeed (); break; } mMvTarget = mStartTarget + div - mMvAdjust; mMoveAdjust = true; while (mMvTarget >= mNWindows) { mMvTarget -= mNWindows; mInvert = !mInvert; } while (mMvTarget < 0) { mMvTarget += mNWindows; mInvert = !mInvert; } if (mMvTarget - floor (mMvTarget) >= 0.5) iNew = ceil(mMvTarget); else iNew = floor(mMvTarget); while (iNew < 0) iNew += mNWindows; iNew = iNew % mNWindows; if (mSelectedWindow != mWindows[iNew]->id ()) { mSelectedWindow = mWindows[iNew]->id (); renderWindowTitle (); } if (event->xmotion.x_root < 50) wx = 50; if (screen->width () - event->xmotion.x_root < 50) wx = -50; if (event->xmotion.y_root < 50) wy = 50; if (screen->height () - event->xmotion.y_root < 50) wy = -50; if (wx != 0 || wy != 0) { screen->warpPointer (wx, wy); mStartX += wx; mStartY += wy; } cScreen->damageScreen (); } break; } } bool ShiftWindow::damageRect (bool initial, const CompRect &rect) { bool status = false; SHIFT_SCREEN (screen); if (initial) { if (ss->mGrabIndex && isShiftable ()) { ss->addWindowToList (window); if (ss->updateWindowList ()) { mActive = true; ss->mMoreAdjust = true; ss->mState = ShiftStateOut; ss->cScreen->damageScreen (); } } } else if (ss->mState == ShiftStateSwitching && mActive) { ss->cScreen->damageScreen (); status = true; } status |= cWindow->damageRect (initial, rect); return status; } ShiftScreen::ShiftScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mLeftKey (XKeysymToKeycode (screen->dpy (), XStringToKeysym ("Left"))), mRightKey (XKeysymToKeycode (screen->dpy (), XStringToKeysym ("Right"))), mUpKey (XKeysymToKeycode (screen->dpy (), XStringToKeysym ("Up"))), mDownKey (XKeysymToKeycode (screen->dpy (), XStringToKeysym ("Down"))), mGrabIndex (0), mState (ShiftStateNone), mMoreAdjust (false), mMvTarget (0), mMvVelocity (0), mInvert (false), mCursor (XCreateFontCursor (screen->dpy (), XC_left_ptr)), mWindows (NULL), mNWindows (0), mWindowsSize (0), mDrawSlots (NULL), mNSlots (0), mSlotsSize (0), mActiveSlot (NULL), mSelectedWindow (0), mCurrentMatch (NULL), mUsedOutput (0), mAnim (0.0), mAnimVelocity (0.0), mButtonPressTime (0), mButtonPressed (false), mStartX (0), mStartY (0), mStartTarget (0.0f) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); #define SHIFTINITBIND(opt, func) \ optionSet##opt##Initiate (boost::bind (&ShiftScreen::func, \ this, _1, _2, _3)); #define SHIFTTERMBIND(opt, func) \ optionSet##opt##Terminate (boost::bind (&ShiftScreen::func, \ this, _1, _2, _3)); #define SHIFTSWITCHBIND(opt, func, next, type) \ optionSet##opt##Initiate (boost::bind (&ShiftScreen::func, \ this, _1, _2, _3, \ next, type)); /* Key actions */ SHIFTINITBIND (InitiateKey, initiate); SHIFTINITBIND (InitiateAllKey, initiateAll); SHIFTSWITCHBIND (NextKey, doSwitch, true, ShiftTypeNormal); SHIFTSWITCHBIND (PrevKey, doSwitch, false, ShiftTypeNormal); SHIFTSWITCHBIND (NextAllKey, doSwitch, true, ShiftTypeAll); SHIFTSWITCHBIND (PrevAllKey, doSwitch, false, ShiftTypeAll); SHIFTSWITCHBIND (NextGroupKey, doSwitch, true, ShiftTypeGroup); SHIFTSWITCHBIND (PrevGroupKey, doSwitch, false, ShiftTypeGroup); SHIFTTERMBIND (NextKey, terminate); SHIFTTERMBIND (PrevKey, terminate); SHIFTTERMBIND (NextAllKey, terminate); SHIFTTERMBIND (PrevAllKey, terminate); SHIFTTERMBIND (NextGroupKey, terminate); SHIFTTERMBIND (PrevGroupKey, terminate); SHIFTTERMBIND (InitiateKey, terminate); SHIFTTERMBIND (InitiateAllKey, terminate); /* Button Actions */ SHIFTINITBIND (InitiateButton, initiate); SHIFTINITBIND (InitiateAllButton, initiateAll); SHIFTSWITCHBIND (NextButton, doSwitch, true, ShiftTypeNormal); SHIFTSWITCHBIND (PrevButton, doSwitch, false, ShiftTypeNormal); SHIFTSWITCHBIND (NextAllButton, doSwitch, true, ShiftTypeAll); SHIFTSWITCHBIND (PrevAllButton, doSwitch, false, ShiftTypeAll); SHIFTSWITCHBIND (NextGroupButton, doSwitch, true, ShiftTypeGroup); SHIFTSWITCHBIND (PrevGroupButton, doSwitch, false, ShiftTypeGroup); SHIFTTERMBIND (NextButton, terminate); SHIFTTERMBIND (PrevButton, terminate); SHIFTTERMBIND (NextAllButton, terminate); SHIFTTERMBIND (PrevAllButton, terminate); SHIFTTERMBIND (NextGroupButton, terminate); SHIFTTERMBIND (PrevGroupButton, terminate); SHIFTTERMBIND (InitiateButton, terminate); SHIFTTERMBIND (InitiateAllButton, terminate); /* Edge Actions */ SHIFTINITBIND (InitiateEdge, initiate); SHIFTINITBIND (InitiateAllEdge, initiateAll); SHIFTTERMBIND (InitiateEdge, terminate); SHIFTTERMBIND (InitiateAllEdge, terminate); } ShiftScreen::~ShiftScreen () { freeWindowTitle (); XFreeCursor (screen->dpy (), mCursor); if (mWindows) free (mWindows); if (mDrawSlots) free (mDrawSlots); } ShiftWindow::ShiftWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), mOpacity (1.0), mBrightness (1.0), mOpacityVelocity (0.0f), mBrightnessVelocity (0.0f), mActive (false) { CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); mSlots[0].scale = 1.0; mSlots[1].scale = 1.0; } ShiftWindow::~ShiftWindow () { } bool ShiftPluginVTable::init () { if (CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) textAvailable = true; else { compLogMessage ("shift", CompLogLevelWarn, "No compatible text plugin"\ " loaded"); textAvailable = false; } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/splash/0000755000015301777760000000000012321344021020447 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/splash/images/0000755000015301777760000000000012321344021021714 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/splash/images/splash_logo.png0000644000015301777760000000724512321343002024742 0ustar pbusernogroup00000000000000‰PNG  IHDRñ1 #O½lIDATxÚíytEÇ‹Ó+nÄHn”EE/ðXVTÔ è" *"aEQ×uÅuÅ tŸ+{ñž·ñX“ÌL&C’É9$ G@b8C’éªêê­Ÿoç½ÚzÝ$Òs$l}ÞûþùUýê×Ý¿žîšªß …B¡P( …B¡P( …B¡P( …B¡P( …Â’x—qÎÙ<þ¬tí¾³mÇ¥—s­ˆsŸ“žŽÏj† EøˆËÔÆ&d’5‰N\“œ¥±H ü …BaŸ¸-ƒ:ñ†.Ì¢,ŒŠÿÒ'³í–AÙ8gh®åªLv’w¾gñHqbÎÍ Ží!—åbm]è&éH¡àôùÎHãÅ­ò52Ì…?@ kº½¯ô’m×oÂLÖ8iº(—|1Ì¥­à ÎNÌjûMR&ž˜”o ‡2´qÝ\F/¤Pp’ø:³ëðr/®@ k†dkÜVˆ™¨[ qÌ] ŽŠ(‘ø ;ç¦B|T¾GçÒ …5ã}ä«?a¢FæàH¡ˆIÙÚ5ã|ø³ ù$ÿ†|’}±[{±{šq:RXó›"Rô`a!Í)#´{±qêìF·~nãœó2YrÂF£{»Œ³¡]D_O^4z$}Ãú$d³~ pùìî`gôýÞHú)·Ñ7¯!à|ÏŽl£}íÀ±ßÑœO8¿¨³‘RB* i~% ¢NFw·Ñ{DvðÞ tý4?)}¨œþ¸ ’PaÜÖc•?PN÷ß]D6÷ikäh×¢“>!Fy´n, O÷“ʇËé¡ÇD—}.2§Œ˜RLŠnȧë†çàÉ'Jìó²šõâ•·o&™3ËhÝü Òj˼ rì¾R²mR!þfŒ/Iþ–‹Nðyy.~þ¶ÍÄñÛRºc^%9>NF0ÞÙ¥tÏ]ÅÄ ÇxX¶617O~Ü?ÑÔÜ zx”K›ƒ:³ËH`y5e!=QE;MwûÜè9ÞKV- Ѓ0¶ ž>ª/à‰õsn*×oÒV/ÚBœ¬Ïù•t?Ÿ‰]"^Üçe·Œà7—Œ§ª)íh?ò¹»µˆ~Ôï[–€:H_gë¨)~â|ºšê‘<ÆVнWzñ²Ž$3·{†ßóøM }„OB@¼Ðw´Åý¶õw}Pgßq«þ¸²VÖP uú¥³¾ü®W cІ^ÚNõ_çk«Q;$g‰Vêpùåk&ܬFºÉäg·Òæpô¹´ŠœƒÚa”‹¤¬ØJ[¡M´Ä?¡ó{8Ø™–­NíÑމÕ#ìâ-´lb¡Äô–á(vȂԼµ“!ýyG쓸›atçŸT~¬Õµ”,ÝBv\A}ü­Y[n¿á•í´Eþÿ×k)åŸ{© …÷—ïïËP³Ëh¿ˆ·¾²ƒ¶™õùÜVúC¯4ö dARNëH«¶ü"=qÎ,#éÜßÒ±´T(^~ó-xf+mxs'efýÏ*%™È‚K<Á²ýaúš0Ô{g^¾Ã­™¥$Ãêá¯M›PgbùVº}Ý.ÝéÝzŠQŒ¹,/8Æ"jmT, oÌbayŒIÊ`Cg•Ò ’¸€€dE&\å Γí_Ý¡âße>ÛÓÁÎBíÐÃoœ~™'øà’*Zm­ôûm´á:^.Åjõ^Þ Æõ‡mtŸÜÏ…ø]dÁ¬2ºQ¶_QCëF{HŠ¿íc<Í?üë.Je_ò´ñÈ„K=ÁY’-$qŠ"Wû´Ô×kõcò8 Ž)Åx=¼N¡Î?ù;?iÐÖïÑcžÄ|ÒÊ-Žéã]ê%SQà“0Nð!j„K»™°(@}‚œØÖäìãÃOæI#Å×Ë~A<Á7÷pÿüÞAYìÜ·ëôƒb_«¶Ó=È‚·wê‡D[~Ñ6öró™ôpK~IŽsJ^‡Lë ΑmzŒóPèŸÁ’¨Çì¼¼V«ïç_½NBþX¿á€n„”¶O'(ƼUGÄ1ý¹V¯Câ /™>DM,ÀÏ"Þ­×v<áˆÇÎ+Ãû»ôƒb_ÿ ëýrþ'=IYŠ?ûûj¿N­>UÁ—h;³„"Ü”d z¦ÅÓÎCÒùˆJ_í Îý×ý˜ìû›tÆ¿ ù¢gšq&ꬼSOwç4éFHŽÆØ'18$ŽéùZŒ"ÄE¹xøÅgˆ_G&|ºOoíôï‘ ^¨¡%bìÕ Ì(ÑÖɱôö¦ïÅÙM:í -Š èXô·¬Z÷ ÆåçÊ1 ò}Q„²Ñè³´JÏ?²à:ë%SPgçï»õ†¢#Ì)÷ NQŒáOG„1Á{j Š—xñíàCTJ1yËâBl힬Ò3 .±?ˆÙà2ü)Ë$.<̘hmQq5éDô·¢FÏC&\çÓæI1D,‰Çå‘Yü á˜ìŽÍUzz/‹C]ôýUÍÌÉ”é(¶@²Ç´ºV/GâR/¾|ˆšQBÖšz±VÑî™­ºÙâûƒ¸‘ æ–ãõr,§yŒxdBàc¢´E„'ý½´]ÏG&üj“–*Ç08×HDa¤w:;Î] ™1ÙWz#k¾ÖKf£®Ä—ûõ»[™ÒÖã±Oâœ&Ö,ŽimˆÜL8ž >DÍ.%¦³º‡YP´{a›îB6€¸Äþ ndƒÔ ü‹e×µ2&ÚA[A¶43*ú{µVßlº +_[ Ç0$ŒI<΋§gK×h¿±äþ냺ß7êM‡°a„´·1[ YZ„1Á,p5Šcóð]àCÔCeä=dBÅ1¦‰v«vè¹È—ØÄl°(€?–b±Lâµÿµƒ¶(‚ð$ÑE|&ÝL¸©@[(Å–$îå7Î\QC25fÈý—eÁ‰ù$uU<‰ó@BjèI\È/faLObð!êá2òWdB%ObÑ×n‹ý†!‰¥X,“¸I좔Ă?Ë$¾¹@[$Å`;‰ùšðÉžƒú1èKÖ[|C¬/’PÓêqZ=Nw‚ÇéiFïÅòem crŸp.'j‹P;¨‰-5±¥&¶b4±u‘;ø«ÏöéÐ^_âZ4hKBD}Ť¾bR_1Eñ+¦î/=g–â¿{2*÷ãhdm7åk‹Ñ©7©¿à†E=ýÆÿ/‹=.váÛ~Æbãá\ìÁ×*É‹ NÕÅßEa±Ç…ž¶ËÅëYëþ¹Æt*ÂwÉl–—šÝ¸ /ée'Ý'Œ&jQ„¸Þ§-ãçužV äeyó*éd¾o¸@ìï½z½ ٠ů½'Çbµ–ŠvÐEˆÞi,^ö7?@¿³³ìR^ÂzgYýù~Ëm?lÐ[ù#úRt*ëG¼ ¼å…ý—zb·Üláš'o€ã!Ó#QJ‡ï§­–ã¿À£M0_¢ªíø¶Æ¯‘ ä oìÔ‘ î.ÒÞ•b“Xž a¢´Ebr!Y#ë¶üZ86@ôs¶Œä{Ž·Xl&)LÎbÑ)l¾O\SG[ÿ¶[7D­Û­³Ç´p\ž¶D´·‚ÉãùK=Å÷ã&»Ç~å‹=ä¾Ç7 ûyy;=7ß,¢mg”Ò/‘ xµ‹\Ù·­zi›µ5R<–Iüþ.ª‹vÐ…™d‡Ñ ßï+ûâÿ¦Ié- ÆägI1XnE¼Á‡Ÿã×n›lÏŸäZ®õiO¢ÿ'®öj‹yàÆ ÛÚšyi’½|çNÍÂݼҮøÆÿ’+½ZªY’-Ð «±¬ÜF›xûl¶çµ«ÜÕ\¾™ûwZ ±Xõ}…7ø²€ïó=$ÚNóÓÏ‘ `LB°‘¿½-Úr<=ÝF2oØ×E»eU´ÆcWPa~-†kEô!·´¸_²7- 0µ˜~fu ÐrK$5qY-ÝìcÏ^ü/ÍäŸ,šz®†6[–Á©¤UÑŸ)Ö¯÷‘Uí¼ÃÛÜYD?A6à=œbKx¹d(/$Çe•Ä/ü=ÚâÅ|'ªˆ9ʼOn#'ñàF¼d‚W¼ÎFߌ–‘“7“G³Ù“ÕT;Q¡<>[ù ÿTnŠäî/¥e#\øÔ©z@lwófúOd^î;±?þ¤P‡l0ÎG^–c³J¡0^Tçðª\¼²½ByºÈT¹-܈äë‚Ï'†¿ÅR£=Ú|ÔYéù9;ÊrNȧÿº§˜ðzN»¡„©TŽÕ¶ ¿ b"X'óp7¾‡—{}Ÿý“Ï‹­íåÅêZNÆß#ä(OÚZ^oÛy ¿A Èn»u8¡¾R+‰v¾ ߌlðKWp¦Xzw|ž¶Ù`@fÛñ¸ð[7² ÜçR.{ %z§?³îàt8‡‹ÅCÛP_üFçC& sâIPZlb!ðä` ¨«wQ((Î+5œA_vǵŸ;ê ìíú럥]w~vpzB:€Â@Bæñó¡¿~YÚ5( @yÞ_Êžx¢Bçð#âð Ç9m/Y;šÈC³ƒ÷ áåpÚëž4Ào4…ü‘Bk¦ù º‡O(½€ E×áÖBLÅ-é ®@ …¢ëÀËìR.Ò°œà3H¡Pt.÷bÊÅBä >… E×áÆ\,¤Ä ¼)Š®Cb––—œ¥±ŸäÔhœC»)Š®C<¯·çÀ©qŽàÓñX%p”ø§¾žK¡«PIEND®B`‚compiz-0.9.11+14.04.20140409/plugins/splash/images/splash_background.png0000644000015301777760000004631612321343002026123 0ustar pbusernogroup00000000000000‰PNG  IHDRö=;‰ëL•IDATxÚí}€dWuåý©BWèÜ=Ý3Ó“³4Š3$À"X‚µòÊ‹6X^X kÀ‰uÉf×``K¶X,°0È&H"*`…Qš É¦sªÎ•þûî{ÿUÿª®ª®êª®Ðõ®ô¦bWýªúï¼sï=÷>iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I³M‘_´Z0BˆbŸï©ç¼¥( ‘@ MÚúšìhªcÒ+öm6èsTvâãì'Ä¢Wãôjœ^šøµ ¤­§ÉC£CÇKú^×èä×u¼.þŽšI/#ô&ôvÌ„šc ¤­ºöÄlj.zÛE¯»ñ’Þ6è¥a„êt lXÄAŸ¿hCAA¡VA—§“´õ°˜Ù”_G0°W~þŽàA@Àaš`¼t:Üðó_œÞñòËÏo~ÓkÇm·öÓÇÂôù 60Dèí(10а$#&­Âp úû§]_x0¼ñÈ‹Ï_>6têÐâÜðþèÂÈ–ðÌ…¶Èü…:Å ©.€ß€Ñ±1ظíª#ŸÿìGï¹þúW꺾h¼Í"ö{ÄÖ+C@ ­Jí_4Øß±Q‹»ÂŠœyÄ'.†ØÄv5:Ô©Y£~>­Ö¹[ X_õÁ:øëèä÷ƒ¦ilÔÕÕAww7yþe˜œœ û/{Ó“ÿôµ¿üìþ=;&( ÌÓI?Kßh†μÍ„Ë @š´®ù*|z DŽ] áó‡!:vD§¶+±¡ƒŒø½ú¬âu«t²7C}C^:|l‚Ó‰Ì&;¸_ÝãñÀðð0ÌÍÍÁìì,œ9× ³3sÖÞKßüýù§OýUWWë}δiÒÖÚ®ÿ¹³þ-0ûÂaˆuÓ1qÂãt²´»`ÌçÕæ¯W§«z+ƒtex `Ov±²g›ìÙÌ â5¦¦¦àÌÙ^X ›ñÎí7Ýû­û>y÷Wt…$H“V¨]ñœе掼 Â=‡ :¹¢ãÛT6Ùǽ^®ì^:Áë›édB½ßC/ýl¢æ²²¯ÖÒ°±±1 }Žéa­þUýðïÿÌ 7Ü]¯C ÒŠcû¹À7µ æ^¸ ÂWB||]Ù·ªÑ67ìm|t÷ÓÉ^O'yÐïe+;NFœè8á×ôDO$n·FFF–óúÐÐuú jÖÏZu—ÿ©5ñ/£Ï"@Z Óøn„ûwÃ싯†pß•teßKýö­J¤¿Å«Ly<Ú£ìúº¢ûèÊŽ“ÝÏ&œ ñ™&e9LÁÂÂBZЗ„¸paΞë…8tLÄ=—ß S|S´õko¨ƒÐ©}0ù«!2t9õÙ÷Bxt‹löªn¶>_€®ìMÔ_÷Ù+»\.WÒd/Ù \¨ä âÒ4Mèë€sç»Á4v šÆe¿S÷=,@ZuÚë‡|>}&ž¹¢C—Ñ•}îR£ƒMtew¹U:Ùõ“=àei7Ã0…WUu]| £££i œÅb1èîé‡ÞÞ^ —œ3Kß S_zJ´Ê³›Çƒzúb˜=z DÆ.…Øøn%2¼Y _hôªÓ†G ƒ?Ø Nv̱{Ødlj^ŒÉ^)ô% À àüüüŠl Ýã‘H„¹ s>J‚‡î€ Ÿ>*@ZiíÖî9z Ÿìã—@db—ܬÅ<Ò½zŒ®ìt¢×Ó OWuœð>Ÿ/1Ù«a²®å1¦cÙ€ Óc‹‹‹pêLŒŽŒBÔ}Ý/Iýµw@ßGÎK V<{ë…fî2˜<~5ÄÆÒÕ}—²8¸I ×{”)ÍkXà4C ÞÔPŸ]jŠ=Ù«8ò9þL@)ƒ°[Àìé3½0>>EbžJ‚7½úþpH´Œ(ð¶s­0úì0}æj_ ÑñJx°S ½Ò<°{ Xσst8Wöõ0)Ëé ÈÇ-È¡PNžî©é0‰zo~|oø]è»cJœìt²÷n€Á'ÁÜÙ«èD¿Ât²tñ!ºŽÏ¨— †Jáƒte÷@ÀW^¯·ªh|µJ>@z}%@›˜˜`€03§ZѺ7~Ún/œx휂õ>Ùo=» †qæÏ¿Š®ìÑ ¿C _èpÅÆü^eFñ¸u–c0õœ›®ì¾5WÏIËãããI@°Z· x Ý“§»a>ˆGëÞüe¾÷ƒpvwDAµÚ]D…_žì‚‰'®‚žÃtU?ѱíÊâ… nsÜÇ&»ÇÍÔs@èd÷ÓÉŽ'Üj&»†ÒA!nA.,Á²,¦RÙ¥?¾¾€`5nA&ð@QÒ…8}ú<,¾…¸ïW?CÛÿàí¦‚RÛõD÷S;aò¹«aNöèø>Xߪ.^h÷ ¯[™ƒº:]Ù[èd÷A ŽOvTÏ:Ù«yR®7@Áßýø\ · õþÔÇâñ8ôô^€óç) (‡¦Mÿ-†Á;¿BŸmI (¦½›ÐýØþ_Q&•ݪ.\hõ*“·²u>?/‚¡“<àKžìÕ ž“ R\ X+· ÛkF£Q ýÐÛ× úuãVà–÷Cßïþ3}‘@«Ý|ÚMéû>={ DF.‡V¼ oÑÂCÍeÒíQÂL*‹ º ¿ŽMv¤õ餲µLŸkPð<@ ‡Ã«^Ù‹(J:{®.\è§€pó ¼õ½Ðÿöï• *ÿ øõ>/Œ°Y0]¼G·(…o?V½Ù“5Hß*!Ç.eý}v‚ÉÉIFË‹±²¯<²=ÎDI§z`"‡EÏíÏ@ã­¿§_ýr¥¾^+ìøÃÛèÕ×ÒÉŽê¹MF|¤ÞÓº¹ )¼˜ìùæØå¤”Ç_,F€@àdk•6Ì4Ñs}MT@¾òÊ9˜š¯ƒðüÜ[Áìÿ·J‚‹è8DÇ.zÐÝn÷^úÅnôx1%¨”÷w[Ë•}%mA9¿§‚€… ùüðµ}–¶>~·BXB%Nô’ºëyRJ@Y€²Úß´PAP¥Ä*Æ5ÀÚk,:B¥T>¾Z­*á$¨ÿ·Èì®$5a..FÙ€`µYt)°a¶yž…={ö°F’ض ËŽKy‚K–R»€’éû«d5aU0‚\OLìäŠRwÕAØ¡ç^„ûö@Sc}¢$‹˜¤O+YJ¥Y¥¨ +  >ñð_÷Ö›:ѧî‚í­Ó°es'ûàÓÓÓ‰Æ$µtbVû¤\/,¥ÚÔ„…~_ja¿ùê IÐ5H\§XdÕmã¦{áŒv-<ÿâˬcL0då¡Îç¯Ö¬µâ¥jÿì¥>öZT‹¬:k€®¸n):Ä7Eýà{!4q-<ýËÞí £­™ÖŒ£«€ˆåJ'Ýžb{¡b¢jW¬v¥vþ8¦ qði¾Ì7>GCàø+§h455±KÜ•Šr¥“%ÖåtŠ9Y‹ÉÊÊVó£F€J@ãîE…Þ£`ÃÒk> ƒ½Cèù¿†ý{wBscìîŠe—¸·`¡Û‹I¼¶YŠxjWãxÕÕ‰«×$1Æ 4æ"à0U7˜@Ùâeë[ |Ó·áÈùœ9ßÃ>ps3w°™#êdCÉRŠ(µ¦&,#Xõ¯žìRP€m0ÀÛ Å'EUÁ"*¨þM ¿ñëÐ}ì^˜zéë°wÏlÆŠ333l»ªúúzÆÖ»O+YJùl=ª Ëæˆ–ô7xŸ¢ï£j_G`P-HZLH|7Ìm¼ž{òO`WW#t¶·BKK Ë*ˆ`"fй³‘œ”µwìÕ¦&,ÖoSP°pµT+áø1T6ÿ) CÑT60v@è¤&u¨»€Ci»´[¾'·Á±ã'Ỷ/@!º óóóë:P&½¸Ç^i+{¹˜PÁã‚]›°…œEøœhŒ!0éÀØŠ«<7Ü“Ý?†gŸùìݽ Zš™k€D§»°’I¦ò¤ÛSÈD¯5a¹;Y…ž<ËAÀRÀ¾n_an2‹Åö¦”1P—ÁØþ€ áåŸ~6‡z`ëæ,ˆDd¸Uîè÷û3º ²mXm»=©¯Q ½ ×Ä5Xí±üà` 0 q›±¼B™@ݼN4Xš Ð ¾[ÿ[ÞʉÓ3³ÌM@wS‹È P{€EIŸåg/ÅD+¥š°Bª‰UÈI“+T¸‡@„‹ Hº‰ë*Ë'0´ ¼¹¡ÌÀ¢lÁ{ùï€Õu5<ÿ£÷ÃÎóйÑM@À€¢-c/x¹RËÏ^ÿ¿’·’פcN ªËï×M¡„@‚ì@¥Z3èudPÛ@ðöïÂ9ØG¿’ˆ4440׋è.íA-˜d)«ÿlÕ¢&¬„¬Áªj {(<ùS`é¶ØŽg@ã.Ñm@ ®‚åBðÆ»!|åÇáÈK'atl‚‘`¿|?!U–&e-݃Rª Ë^}X0ý³ÝeFàd(6b@L5ŠØÝCÁ î]7‚ïö‡àø˜§Îv³IÌãhñxœ±ƒB+¥•PŠ*ù¾ÎzS)FÀuù~™Xgà<)”% Ñ’¦(p\wÄaÜ€Ýiñë;PðÀ(P: é¶€ÉçÿB/}öîÞ õÁc˜fŒÅbÌ}@ýö>¨%|=€J¹XÂzÔ”TP”6F`Ol5°‡ªá‘`*‹0!’b3Ì.P7AAv`¸;^ñßÀ}ëýðâÙ1è»0ÄÞÓŒ˜Vdþ eÈ ¦¦¦ %ésmY¥« ×òx‹«:±ÓºÊò` Ë@QØX„d—©uƒÝ–á£m/´þÖw¡ß{¼|ì‹`o‘fÄcr*e´JZÙ+½U±ƒJ> À,tRœÌXZ@n@HØ©Äe.‚¿(qû¨èrèÀRŒªµ$[n~ýŸC¸ûzxþ‘À®m› ­¥)I„„Ç$RŽ˜q(fªQÖT—{Q j¢ÆŠñå‹ MõGK“==¤Þ'A%¼n í ØÒEŠ4u»®OǿÙÿS˜ uÃö-›XŒcè" {€ñ &"kÀQŒ/]Jƒ«PªMMXéÃÕô$H«#°'¿êtìB¤L1‚Ôû„2QÕû1Î@Ǹ*ÖàÐÝ Û ã_†…}¿ Ï¿t&§BlõGWAtO©F„L]‘ªÙunOeº ¥ˆ¬#ÈÿGIÕ$†ŽJdP”¤˜A²‹%“êF°k„3¼.Ü‹§ß±í‡àØ·ß›êgaSg;s  ‹€Ç‡©F,su ÎBn´RÝ,%×} ÊÑÁ¨ÔVÖ¬cÞ/>ä¢!çªï\ù³1‚ô™ûº$ê*Ï(С.Ê<ànÛ ›Þý Œµ\ GŸ`±d(Br6;ÁT£`r¥__Ç^Š ]%w0.F°pÅ0õ —=_]b$MaYV!'Fàü;ŇÀÊEÂÁ!Á8KØpó‡`a÷kà…‡>;º6°@"vBBÀݘÐ0~€iÆtì `µ‹Èõø—´,JÑÞ¯šÔ„%e©¨ŸNb¬Àrš>\ŠdI-ªKÏI­SÀØctÒ«:×`Ü@Ñ Péʯº<àßy5lþ£ïCO´Nž>Dz(4r¦q kÈ·£rµYµûóÅ:¶jQ–Qb¬¬Ê=HnS–"(J]ý³BŠ‹½NÁ¾NÁ@Síì‚DTtê&`šÁí=Ð[~ó‹`z¼xôL…B 0Í(öUìcÈr9¡dPu|öZRÉ5PŠWkÁ-Èè¤sÒÈ’—ß¶ù‡({fbä¥@¢J°5šI¿Zÿ:Ôo¿^yà}°az6u´3 À¸H3âë¡ë€ÌKœ Ýžm½SÿJþ쵨&,¦kw)²(òI ¼’Þ%HRfqò©\Lz\µ u^Ú¬È tv©2và÷†í°ãÎavãëX Ó‰8Ù‘ Ë >êdj¯^‰+½Üh…”µè¨Ò:•¥yªƒ¡¤ÜHÙX@&6#A6†`3Ä$}©ù Š‘Hœ^Rbã›?óû¯‡—ølÝØ Z[iF÷@ ÀýWÓEù*wãÓõª&,#(†kºò+Ù†š¾\yys“%®ÁÉ2Æ€±ÖôÄfºbt»Ø®KH ì8»þäû0¤vÁÉSgX Ù^ ì]éWK©U5aQ]ƒB€ÀYo fpÔ,¡¦%çŽGIÙY"th"²K½¤ `aço}\¯ý¼t쟘bï‡"$”);÷mÀ "‚sÃW™5¨¬ã/„ÍTŠš°X Pk°šƒHÍÛ:‚öÃJLÁ™Ý„ìDv]UltTì=l’­DTM,Mƒ¶C·@ÃöËàÜ?½¦gû`sg‹` ]d‚  ABH—e¯2?{-ª ‹ê:È’2LqÔŒn’‘-dcËz$\…Ô@¢F]t ÐÝ”xÜàißûÞÿÄv½^>vœÀ,K3¢É™fB²\ËÔ¿Ò>ûjtåZÙ×4J¾ÁI:%—" IÍuõÏde9°QÕv A%¢…-Õ1Õ¨A×›ÿfö_ '(;ØÜ¶í­\o ‰X«€†ý!”*ÍXªUºYJ¡nÁJ+{5î‡XòÁòOžÙ%ÈRWüLÁÄœ„GŽ×`ADÅf:$b&Aus† QÊß°ër8ø‘À„œ:}– 1k€ìÀÙMH”+u[6ÉRJïÿW —´Ö m/pö \]< —‘d»-Øb£žšØŸMãâ# 2€PaÏ»>ãÏ? /ëc°c[475&zˆ4#!¡;!­¼,¥ÚÕ„eoU–ïj‘®¹L _X‰,g¼zQÓx÷d;P@74Ð\:èÈ PžìqÆÃo„‹>ú=èÓá\OÓ +€õ ¢¥:±Ïº ²åXùXJ±¦šÔ„E  ½óU]yäâ2¤ .=ÇN':Ÿ—$bóTÕ, QgD7øÚ7ÂeúgP/ýu¦Hœ¦l_ ¦iF”+¯T¯ û®7a-5…‚D®•WÀй‡@R;slÈVÃrU#f *.¹ Ÿ˜C¦×MÌõÔ¢'H½ä°Òf Šbãë-X1:ß ;¾G¿ôõôAׯæ*`š™¦Å ÈVã*È2å⹕®&¬EVN:‚\haúÉ·6L ÈdÔ8û!:¡dPŠ@¢FÝ-‘UÐÁð¸ÀðºÁßÞ ‡?|?Ô½úH Ùû/bû3çÄû3bü@RÿòË(%—\Y˜Î-H'È–QÈFÝ‹•‚ÌÖ13+àŠÞM¸Ù î§@ìÝ›ÑU G ×w¼å]ÐrÑÕpôïï„öÙØÐÞÂҌȰœYÄ 0£€nC±z$Ê2åµYÙ qã q9*"X˜ª È¥)IÒJ‘èY˜:ñó ì/äÆ4ÔtŒ åvÆ:‘f´‰šÁët—ÁÓŒ^Êê¨K°k\ý—߃p×!xåÔéD ãÈØŽÏÀåÉ…îÍX앾šYŠÓ„¼Õ„Å̧9IžUƒ…25Ë^©G¢ª.ßTEI¹\Ê*Ø}p£V‘Y@@@0ðÌUp×ûá’ß¹ ¶ýö§áø™nŸ`€‰ADd¢¥º'c Qf Šs켩ßg-© ‹ ÅC:HÎ㧈•&~öÇ•¬éGP²WA¦‚‚š +q :uè†ÊbÃd‡^WßóCUáìùÆ„)uçf!@’U……}vìD].)r%¨ ‹ùþ8Ùö=Ìuò;]LìaùýÙ] ÈÒ%0dűc³jquPV˜›° ¢a° ¢Ž`àõ€¯­ ®úÓ¯AãM¿Ç^9 ¡i^ºŒ½ ˆªE ";p ´Öõ/% dcWµ¢&,Z°0ß@Ñòdyl wÁy; ä€\Û¤eÙ~͹#ó²à¡3 Kšœš‹wD…K&ŠoºZ†þÏCÓÌ,lìhgÕŒ ,ň”}[<™1žàÜ‘©Ò|•äK  xk-¯Ô„•åd˜ÐÙn+¶«H;.Ø«~jŒ u3uy½‚‚qt\j¢x ‰È·ïëîy`ÏõL‘(Ü!! `šã¡P(±¥»Ü-7Kx­55aÑm«ZeR\gÇá•!SH¾OÉ1du…˜,ÿûtÙŒÔëüóSW¥^À~#b÷NäUŽ&+jRáà»> £—]/郰¹£Z›“Ø“!ä¢F¬õnɘšÅ‘î\k7¡Ö°Ö KJÊ2ï>›;#Xéyù02쥘k 2Í^ ™ê2e+x ‘‚øºKãb$7e,vàe—_×}úa˜ro€3ç{˜o‹Ç€;ÀûÐUé0™5Xn¨Ç-9…_÷éÃbÿˆ©Ÿ1Óí\ž—¶AjRŠb…USîw‚@º`bÎ…Ji]%Qø„™¡J4X:êÜP×ÜWýÏ/Cë›îdĉ©›D‚ TA]…JI1V’뀧 °–re¯ÔxŠ^)@mr¯”1È÷v"Q‘ª„•À@ɹ»r&6#6SYúÅ–o ¿ŽJDtì¶ê,A]¶­;*ßðvhÝŽüï;)Å„ŽöV–MAC¤½˜bDɲ³‰jµø u ¬ +MM¸¿•Z ? JVÈßÈogQ:@PÒݧäÕb=Óê¿¢Û 9ÄHL€Ä·cÓíZ£Îõ[vµýÐ.zCB‘ˆ& ˜0v0m×1Ô õÏdè2‰­í«qe/…¶ "¶<ËÆ r|˜EZÈp;55˜m˵tB¥l1Ž$6@’Yú*áe]Œ €hà¢ó“@åÛ»ø¯„±K®‡—þþ}ÐÙÚí-ML–Œ"$$!@à$pnÁVkµb£™µš´•¢9(k°Pd еZ¬8‰WŠœþ>ÒÞ^1ä’…È%V°R“!BR4{wÖ=™·DÊĶƒ‡Y q®~+œ9×(VBÆDƒRùã•K@H æ R¥ô•KMX¶¬AÑ] eu­+F^™‰\†¥Ï\§À‚”˜QPí`"nÃæá SÝÍpåû¿Þú!8~ê e!v,˜M@0@íNŠb¶Q¯t×?ëJ PÈÊ^.ÍÁZFA®¨&\ $Í÷Ï‹ 9F^É èTw@¸ ÎÛ‰c·Û©«v="¼¥ºÂaQ5ˆQ€èºþVhÚ}9¼øù?†é¹ °qC; $bàã˜Y@W¡’‚Åv°ãÖ”~aª.5aIA¥’”|+À%ÉKÈ5Ö‘`#l©çíÕ1ˆ(–8ãVlþ[àUwŒKoI(âÛiFd ˜b,•Þ Ô€‚P,¨5a¹³dmÔâ=?Ýc$ßFŠóÞ©,`5TIqD, è¸c3l§nPW`÷¯¿öÞùU8Ý? ƒÃ£LR‹‡•Œ˜VD€]”׃áçC²J^é‹L¬VeåR !)†äöØJÜ90ƒ—&I b‰aKí©³ëN&…/”R3Lg€]” »ºÑ€¦½WÀUñC˜kÚ§ÏœKÄÐM@v€DL3V»¡vâÂ… «në¶½˜Ý¤JáÆ­yóÒt¾`ÒI2™Hï7;Sm+¥ã²=ƶ" |òÁøÓÜ&b¢9c³[ñ£¶L°k0ºOXºo‰ò“åÚÇîNü˜¨Ïo‘dàHÜVp°c±¿'þ¸xÌâ @aÙ¹FÓbÇKlPP4†/ýî§aè™Gàä¿Ü [6m„¦Æ†;@0@v€,¡Ô"–B %ÃåÚK²R4,\ V +MøtA¶•K€¤Lxûv*8ðI'ŸÊþˆÛ_ù}û«`A=’¡2I8ú ð$üJ ðÉÎnŸãü1Åfüy ½mRd¬‚³ìï‘}UƒöË_®ðʽ„é™ °©³1!a@™fD{´RøVs2£€)Ñbm5ŸÏ1­'5aÑ€ ߬A¦ƒ'vü;—ɜۄ'ŽmÅR‚oY@Ü».%&[eékšøºÄ¹4Sߊƒ€¥,a£’hH°Šñ˜}`lâÞ]¬ú`9ØÂa‰Øóœ,Þ!îcÏ£ÿp÷ÂJ0 4w}+\üž¯@ßOï‡ÿ|ô¾mv€…7TÄ€"ÛãÑâ6^âÀçóDÌu2#@7Ìj“ù®ìÙ>']q8ûqŠ¿ã[æ%ox)Ì”+°&®A>?îÒ6gʲ¬A.nÁJ`àœðÙn¯Ä`(âs °Wg¤ßè£ô (Ä-{Ö‡%-aùÖ Uuħüˆ=ûL@¼'Q–\''0Ø€bÙX” ,â5€ÇÀâ߯‰ÇÇa1ùlºî7 ¸õ2x冹ÁahknL(ñ¤Æ¿[‰8On<±q à Q¬'úþåjížjèN‰Ík³ÿ¢aoj†¿çw†c5 ¤ª:åüsBº‰îžç NÀY),`é>…M|…p`€`Æía±KKDÁrüýòh¢!Œ NùŇ%Y°Wxà“žý½å˜ð68ˆ·Kc$x$Œ!ØÇJÁ¢—¾–-pé| ºý"ô¿ü(´µ4%⹜`HÏq¤fðoÅÉ-Nv¹nÔ‚¯‰+-N4øú¥N3gd®vÃÓBS¯b7l¢sµpÓpP.¥•4XèDJÈ#H˜Dí!× Ï'[: IÓUI“%¯£ØsœH1:â1z‰‹B\€]u‰ Šó½H‚¢c5!Ø“—Øbï³ÄD€Pq°Âb$)ØÊÁ‚3;ÂɎ'&Pì8Ù±âí(½ŒÐAŸ°Q¿õ‡¡—~@OF7lÚ´1ç8A¦ßWÌÔJ?|Mçk ÐÁÉ“Ëdß_µ%Yè8›èUü0ù;C @‰8†Š/:*ä;Yîel #µÏÁ%p>7‹ÈJêZn¿óéd·è*5zìiˆ‡!¾°&½4#8©è$ÃÉE' ƒeò H¬¸½óû“ˆã¤Œ$žƒ“7ñ7öãâ¹–=øë˜öu31,séúòÛ._¶»¨ðÛ ¿´£˜"³áòø žgq‚¦¦¦‚À ůÄ> ¹œÄk é AQtRB&…A\¡]+7¡ ° &‹X‰˜’êd£öJ®>‘ä^¹eS}…8”~ö ­*éýl³lÚ®hðÂWSG`Û®=ÐÒÒÂ*úÕth‰ÕÚâ@¤åvM\›ë‹KáG:§–j±¸Ñ૦ÆYœÑèt·¥Î J é@H€2táŠÝ°vM\¤â'½ð%qàŠ ¾TLW NBKA6VØìWYÒéX_µƒ Þo7±Ã K€S,¥ôðö«?ü5x䯦ЅÝÛ·&¢ÀΑ ¹â{÷eºžé¹â»s>/[¶FZñ¡Ü Ž)`Ƈ¨!AP(FL¡ ÀBÝzê ›é‹ ‘5p2€Ô€áŠÔ^I@\öÖŠUé= $N–ر#‡ ØÄâ`°Ô›„ÞOû’ƒ§©üƇáÔƒŸ…3gÎÀÞ½{“V‘6ß ~f‘jÂKá‹´“¸tNöjÞ_`=0±XUêo€çj)pˆ‚²r¾9)–ª‹ˆÒ°‚Œ“|`i0ÅÄñ˜;‚÷±ÅÝâmÀÒl‚b, N ßSA¨¶þÊ;¡ç'߀ó绡¹¹™ œüxò?~<‘†“V] ÇbiÖÚDö¡+i­Aæ´LrYnªV?Ó}N°H}œðåÛÖê[ú5ˆ„ÆYŽ mli.qªˆ…´—U ÄP³·*2+ØsÛ‡ ô÷÷ÃÄßÉO¬Í›7ËVe† P¥¨« ŠÅ~ÓOv²â„O;Di/ÓÚ# 0¹KP ô=Þÿ;h ú .Ð}“>=—ìðï—@… ‡Y1JIV`eŸ`è`øêáà»îñ©ôöö&\ì&,v1–VÙ“_°ôµ«%.PQ@;1eEH$?6äØTc©G¿/†™s/ròpÕ¡Ë¡!P½ü_Îlu ‹دcYK¬€ ˆEÀPì{ެÀ0 íò×CóÞWÃÈØ8cÂEØ´i“ÌçW‰!¬§F-UÉ ëdÏpÍ=W ]‚H”±ka.|÷cpé%³ÕzÆ Ÿ›„‰c¿à€Átø–Í&HB×o9\‹Å (+P1N è öÿÖ_Áüü"ŒŒŒ$Rª˜ÖAÁ‘´Ê·•Šˆ$dŸ¾E‚Ì+~``×â‹"!¿µúúô=úØ¿¥ƒ 1ð5ÛÛÛ!à÷BÿO¾Êƒˆ6˜,§Ï A²º";`ˆÁCd„Å tæ&x›7®_ûŒM†X·¡hkkË©ìTZyÙ@­e Ê,ÌèˆWËÃMÈê`Àv D#0sþEðý:6´&Þýøæ¦&ʃÈä0ö·V¢ù‡µ €)Yû «œàèºñànÚ““088˜X!óV¹V‹Y‚²A®ÁŒٻAGZ—Àâe¼)‡É@€Ä¸K`ÎÏÁè#÷À¾}{YZÏ BVPçÀÀØÕ„6“`ÃÙùg 0È] ,;‹€n‚ârÃEïú L…fX;è   T+Ó„ÊSA‰`+HjÈ‘Ë IÍ@.*LTú1½@„‚A~üyØM]Ÿí /$¼­­­ôyaðñûYFÀdº®Aà’ß”¤¶ž€·!A‚ ²ê"ø·] ›¯¿Æ©‹€ï#"Ñø>Å®è“V¸¡ '­RE«á˜‰~}„EüY \Ê0e8sö¨›xÚ[›Ù„ÄÝoÎ;Ç´Ùø:ÐC?žÄ#ÔEø™­@´8ر@$$É]XRÚ± /Õ€m·~⪋ ÇÆÆ˜`9)º"Ò*/> ­²Ä°òÑ $—€ˆ!qÎâóÓ0õ³¿íÛ¶°‰ˆúñîînö¶CCC V€uAŸ~v¯#à®igL'°Ù‡h†ìÀbòcžNÄXj öý·OÂÄ/ AÐA0À†dàPÚº‚Õ¤ÈÓ !9úŸ›pˆY Í€-Â&(%¦cèG [7µ3)àÙ³g+6àyãúúzV0}îYXíåî€iÙ®Y#—ˆC¢SñZƒ¦‹_ Mû®ƒÉÐ4‹ˆ"$i•c²&¤BAZwÀJË„Â%0‰]GÀãçBæœz|Ó' ¹±ž(Ö8£Ãxº âC`¾ßÂÐ÷síAŒ7ü䱋ía'pÆ(X£Q+@(\~¼ówÃÜo¼‰`€ƒ®“4ië(FP88k²‰„R' ëÒëì(Œ @Ùºñ¹ ˜~üs°ic's 2m…%üw4ô߃þ:yê[`FéýqÖØŠÛqb%§­mˆ`“N:ˆj€»i#l¿õOa|r𕉢k‚ï‡ D¥Õt°0­ä6]ÅŸ³xh™KÀ'&Ϙ,.À\‚(oÌ9ü£ÏÀ¦ŽV¶ò"dÚ'%®Ôh軳^} ñçæl n%dÇ–©ð½RuÖR=gÏ"h8\ÐyÝàjî‚uÄæ£ø`¼@š´š‚tŒ —JÂ¥€ø d4$´Ù3¯ü¼3§¡©¡ž¹(ìÉf¸s®pp¥Æ áÐcÿÀ^7¡I°ãé\ƒ0˜Ž´"f@c¢»a÷o~¦¦g˜Œ Á{ÏÉÀ¡´õ«²e-¡ sl ý°%ÄHéà€éÂøÌÌ<ñwб¡½öÀÀ@‚úg2 Œì#4œ|æNòà£e%Hš,+âPI”*c¼ÀR5°4^®\·ñt¾æL~Œe®x\ø~Ò¤IF " 9f L!bù<bTe.Ø|óûÁÔ<‰æ“È D«jiå5™9¨€Aªvˆ{ð-í]†À΀…‚@èèÁ5sžº¶ÂçÓà Ÿ+ªÏ‚~Œ=÷ˆ/Ìr=A|)•hf`DT&Zœ[[€;³,‚7;ÞqSŠ=üä³ñ¨4i듬Ôc Õ%0­„f€ ‡˜1ˆ…aæ?>OÙ@3›d”Ë×PW ‚†È 0Í7qäßXÐÄ–a„Ø›‹’̱±³1ÓP÷€±t\P¿÷hØ![A·ã’H«j „Üu#¡LH’ÛYVÌ™c±0Œ<ò¿ µ¹‘M^œÐ«¡z‚®ãßb Gž¼×Ñô³dYÆ€ô€`bœ€¹ôRÑ l}ÛÝ0¿f±È °Jö8”nAM»F6œìð'ñnC&(è 0#0ýÒwÁ˜ïƒ†ú c+³‚Ià ¬ 2Ù }/ðŠD&.ý ²³á"°¦§¢B‘¥ ЂÐõ«eCžiØYr ˜´Ïä ²t¢†žú"c(Ö)´’L” £aÀ1ðQVpOQbë x?ônAж€ØB#``ÀYj Zß®æm¬ºØôD@I“VÛŒÀJ-5¶ìž!à g  P0PLꬰtaœ»t¨t„žûG°f.@0à[³î2νï0šU‰ãOÝÇkXÑd•‰ÄZ9F°”E[l„Út zi€oûµÜ{ŒS0@»"K0VSŒ€U[õ Å™Ÿe1v= ãÿùUhki\sÊDÁÌœy â¡a®hd@e%Ø@º aºû„¶€ dª¦ê‚Ž7}#,ó!W)iUÅëL²¼1—ÀŠJ(#ˆÍÃðÃa.A)Òl¢0݃:_&|“Nþ¸=,»§!I4-Im¦’N[`Zv“p0PmÐñÆ?K¥I«9F°Ôt„Õ–|„˜íDØ=ý€Å &*•ïˆb+¨÷{aê™ûy?ÄDi²]•˜Z¢LÒw2âÙžE`›¤ïh¼ô6pµìd­Í¤I[÷@ ¼{1Ûl;@(˜€B( .Atø(L=ÿÿ¨KÐPRßc8ÑQþËÚ‹ÅÃ0{æç¼è)Ñ'ÑbžÉ4Ì -0 ¯E°ÀEÁÀ·~¦mm4ië’W^GƱãtò#ÄYpP‰ÍÁ装¦Æú’+ïœcb~÷?ýò^»èÉÞE켜#,eñ ZË.h¾ú÷™‹ MZm1Æ,–!€„f€€„aú?¿Z|–ºõeù‚„NY çûž…øTK#rƒ•,&"¹eˆÝ·Ó‰l`ðº×¼LÝ—¶Ç¢4i•lN :cl€˜è” î€ÆXAbƒG`úØ·¡­¹¡l_Ø Õ†~¦Ÿý†]üÄ ¡ˆ ™+°+°Ú–Nƒ‚DóCû[>•ÐH“V®eoFèä'F+¢Û/ßÿÇãM!0òa;ÅÉ3 –:gfÎ2kªNäB#“º8šnü,†c m4i뚀Í4Œ ˜Ô%x æNý ¬.Aª ¥!c~Ì<{¯ϰw`¶ÈŠŽ—Åìè¦Éõ˜Eˆ2ºhyýÇalBj $¨p Xm‡"'#P1.” ÐÕŸ±Ø4LþôcÐJA ’ºöV€†õ‘‘W :zŠ#1)´i»ÖRÌ ©è(S1±·Nst4B‚wÿÛ@oÝ “S2‹ m»,nÎØ@t¡.Á§À­“Šlõ-¤¿¨6ôÓã›{þ~Î L3Ñ@…¤-G†•™ðàaÜⱓ]Ð|ó=0=#µÒÖ¹kÀO{Ѿ'`áüÏ*Ê%HrbENõÌûð(V<Ñ;¯ôVžéD…g€³<´³jÃN¨?ü0:!‡ÒÖ-# v| jt&ÿKÖv¬šs`ý œNþ›-„²}øM²¬þ ë°+^‡€@§Ãè=`õLu(MZ%AA1…@œ2‚8Lþâ³àuk¬ƒpµ çž¿gìÀ¡h¬Â (s%1g:Ѳ]Õ oàÚ´”&m]Å4º .vÿ .<ÃØ@5‚V<ÔñáµÈÌlíËV‹U]Øî…I‹g´Î« n÷ÙÎÊÒŠ÷‘V1+<ÃO~ÚZšª®EÛÕ8à‡ùþ‘UK±AC^U©ä <¦ ê0h2¾d0Þ¸îÏ`1Ïk'i ª"F0òô½à¯ó°þ€ÕhõA?,œyÈbˆwY^–>„U±î"(Gmeq‹º®¨¿á.V”´VÝ™¤I (YŒ@ØüÌ»lnj¨Ú/åÏo„_ù6ߘÕ,+FZ hvM‚ƇÄ}ç[Ao= ûH[?®îÐÑÑQõ]{1h¸ðÒ}ô‰'ö`Hh ÌU‚ÐX<ˆŠÃ¸EÜpÌÌ̱~ Ò¤• E‚ÆÆFÞð£Ê ? O‚ÙÿK‡[…HÌ][[À‚…¬ÀV`;ø®xŒNHV ­A› Vk\ ]Ì£ÞO݃£÷ñ4"â"Kô`]%+àÁF+°ÔD-BŒ²×%–«m/MZU»ëɰiI¤÷1€ùQÆ Dù¡ØÈµ X j Dà0^ðÝði©-& ’ ¤°Óqô•–º-ñÖ̉]žób·'[yÈ ˜H+ê,¨´^ ž·ÈÖfÒÊ ÒR¬>à…ÈñûYw%¬ªÄ7+íÙ“š¬0[E‹€Œjß´»8ôþ0„£–Ô²¢IAìt´Ž c¸K³uá1&VI<Ñt%Í–Ïy þmctÑì”Ë 0Fð]sŒM„¤¶@št *‰DÞ˺,©Ø”â|'–scÇÕÜ6Åt»ù©ÚÖ7ÖzPö-& R,@tèYPf{)Ę‹€#‘l%ÙÆ "ÖÀwUfŠl¸¡îš¿„™Y©-nt *°„ÚçBôä?ƒÆ@ÀîÉV®A€HÄøõÄS5 Ä¿ê.û#É“[šd•âDN~Tk‘±L¾w3úŸ-p¨Øñ‘ZÔ8+0upíÿ]°Üͬ£‘4i’”ÙP:­Óo6ÞóˆÍ øž ïXº23€•ƒ‡„õVydKT)ºÁwÝ'arRj ¤IFP¬Àïè‰ûXæ@M€½£“™KúpB`‰hƒÎb@Ó¥àÙu+ë~,MZI€@º¢™ ›¯Æ&N Z¦ +>ä0Vr!„ðˆ«-x.ûLjÔH+# Ò5ÈôŪ*ü N~5heš‚¤XAîú´Ã„!@@ãÅI8ôFð]ukx*µ+¯frE“®ÁÚºADÎý(±Y&0RìXä4Ìɰ·Oc%ËX©h€¶éõ ·^Êj¤I[k Œ ‹a§cÃpA¼÷{ˆž¼Ÿ§›î&¬NG@Ò…ü˜74±Ë•‰¾«þŠÕ!àöîÒ¤I (“aËóHï@‰†@µâ¼)i?´|u)Ì‚ ’XãTÕf¼B/ÏηIm4 å4Ü ;Ç»²c&Ó*I®ä¯#HË$xGÁÔÀ}ð}‰+077'iÊe¨4Œœ¢îV$ ]+F‚, ² e $b–Ň–ÿáɾÒŠÒò0Öé82dì™%q‘Â+!§ÊD’¡”9ÍsPÂl&Ú&ò=‰ Ô 7ÑvLÈÖfK«™‡,,,È—Œu:ÔAôô×y÷"à­ÌØîd…¸@ÖøA¶¤-pÆ 4ð^þ1˜›—ÚiI¦ð·Qzr?=<<ÜiY¤w1Óu=b¸\ªÛåò†¡à.@èWÃ6ç¥0ìt<Õ÷$¸Ã£ º:)`—!‹MÖ¥•¾ÀÕI”*‹ÕNQ˜ˆÑRxAõtBÝÁ;aôÄ—aóÆö¤ i¥I X…é‰vùøÇÕMθC=ßߛ޵Ì=ÑplÄüדØL›õ*ŠF wâ2tpé„m&F-„ètëùWÐö¼—¹ª6ä` æ}!+FlXÐßEÕØ.Í ýÉ]Û~"ÝAh: rH+† ˆži·=¨îмS,†Ó]ÄÔ\ ¸X|´nòÔÏ·Ìí‰GÍKÌØâ>+2¹ÅŠL7YÑ—ª¹Áp{)(hàÒc$ª}+´t†®ÔÈTüoú)ÄHßöœŒ¾c´V»B§evßczúMƒÎFÔ™c0óó߆͛:Øw]«æñx ¹¹™ÉÁ«Õ°=Ýã?ŽW;è. Ý¥Âm”+§ÔñˆK«75͈,ê‹AUsYª¦F]zÌ šn)šF-N( ÃüØ…ºéóÿ±e>4±'%—˜Ñ¹ÝVt²Ë OÕ[±yCÕ=àBÐÊ$®^V3¥íéïáOi»‘‹Ûð”1%¿Ÿ…d¹S¸*¶0!0ˆ¡E zô“ƒ@ç† U¸ËUwwwdllL£óáQ˲ގkM@¼Ö] Œ¶*ûÛÆÔùºyµe"ª.zc êUŸWctxµ:5¦šª>«h¦F/=Šc $øedâ|`òÜ/·Òtl1z±›Ým…';­ÈTЊ/R¤©ÃE‚r—¡&¹•SS!˜3v€ûê€iðÚdL¸­džéù†øî(¼Ÿ‘B¡F¥` P P£ “i˜ùñ-ÐZï¿ß/  ã>### óóóô&ù{:þŽ>4Pf× ÛëR`¸‹^œààpÅžÓÊt_XµˆXƒW‰¸¢ª_7Õèœ_iqÕ…Œ‚ƒ[s«Q : sá⡘¦?W?ÛýüöÅ…ù‹âáè~32³‹„'7˜‘)?1£ªîòQp10t5Á"ÐG¯0MzzûÁÿ†ïƒéÞʶ0Ãvâ _]…°S°ègGÎAß…‚NÀТ@Æ~óÏ|¶lî\—®Øz”‡_¸pôööFLÓ¥§À'­ÆúÿsPMO9fï¾y×Ý ˆã :•Å©F„9_§4y"j<èQ¢Ó›EÔ©.kŽÂ„W5Ƚt«©nF,nê³/4Ï Ù¶0·x0‰ì3£“;H8Ôj†'}@LE£ ár,a`ðÒ¥´áÑ ˆw¼ ´=dîi ‘„{ +ß…åÏ,a²ô¥¦™”Ä,>ó>p-‡¶–& fØeŠNþØàà ÐeñPÜŸÚöºßþÑÙÀuqxð6J÷R¤IYIKüLwÛîÅ@Dg‡”°?®¶7ùéíüÝ EEÐô‰¾§ÛgOïˆDâã‹ó{©«±ÕŠL¶X‘ß™Ïl áj¬H,..ÂÐØ xßð–>æXöNFiã¹þÜÙ¿ELXë j"V¥(:Ó?þ/,V€£–  Ò>÷ÄÄÒÿðT(¤j†û_\žÎϵ¾õÏO´‹šGÞ2hÂ'>A ˆêÞjˆ¸ìfx‰,Ý —²Lòñè¢kºû¹ŽÙÑÞ]‘pôâXdnžØB¢ÑŒL»EÃ]ÇËl'ýÙ{aÔwløUî$€ ÀŸ†d‹/ðX2] ãˆ÷?Ñ“µ§-¨$ @é7®üÝÝ=‹Ñh4 ºûóÁ—-xå¸)L5ZÅdÕeq3Tz]Õ,D®Ñî_nZÚG.6ó»(@l¢£ÞŒ`úÓà ¡k „p7Vò¹1ê;ev‚vÕƒÌ-°l S”3-XéÔH0ÞãšJ2%J.³OÞAm $”Ð0ý×××gõõ÷Çé¢sNñø>ÛñšwWiÙ³¸Ö°^€ 7cu3† s34âB¦¡›ÓãÞÉÞº¦F÷EÑýñÅé<³14£³:¦?Q#ár¤? \º{úA¿æ{`yw%v.Êë§ÉU‰˜Äw î"èz Ôù0ýä» kSgÍh Ê 333Hÿ£££cHÿ¢ùÛ?·ãöO?5??/¬w (››¡Z¦®¨ª›òO]x©knjê@$¼°Ï ‡¶™‹ã¬ÈTÀŠÍ'ÒŸáùIP[_péWí= òÒ ÀC–AHh 4/ˆžú[ C?„­ÖÀ0ý7:: ç»»ççæAsÕÝçï¼èK7ÿžr@­AÁn„q+ù¸𢫖b±¥^1-2?rÂ3qîÙM ³‘‹¢ó¡W¥®A½âë/Y`ì ¦²ƒ>më’_Aò˜ü¹²;pˆx ÚÚ º23ý´5ÖfMAq ó0ý×ÓÓ¡Lp\ÁÿÝ~èmÔxC¨œ  ÄnF\E ðÒ×YÝR­ˆ©YW4N,5FL-¶ÐØ?û²×„dzàæ; X4¶Ñº›¾÷nê/ì¢K7½´è¥º1g—€d¹Ã¾J]®-ÐL&?6¨‹@&Ÿ€ù#†®Íë¾d­%å===q j†çy­®õs]7ÿñOôÆ®p%€‚R¸nêf,p7YD½ÏmÿÍLÏ×WtÚš!­fPQÌ£­Ü@A`¥´Ðë‡|_ÜIçîn Ê.z»ØmZrf DÄ € .‚ÉÀ üâ‡Àµð2´µ6I X…MNN"ý„¦¦TÝí{ÈÕ¾÷ ]7¾û¸ë£•ÊàfàÈ$øSŽƒ·±“95H íÓ?(07|mo#(ñ]ôŽÝŽKå ‘8ä.gš5 ³O¼ :ڛئ®V6 þ aú/¡¦{¾Ú¸ëÆ{›.¿i¤R@Ae}çk|B^u¾ 4  bQ6A/Ut;`'E \[ iÜMÀa >±³Ÿ‡®MëW[€©^‚BÀÓýýýV___T½Ïð·ý]çu¿ÿ»eÃ|¥€i$T¸þd—fé{²°_UÕÝ”ìV4k‡jÆ7E^|§¦,œ‡@À——F¢€€¥ÿzz¢£££ªáö=ámÞõ…7þñ‚V H –|\—¶eëVÝ£™†_÷ºÃQÕ«ÅcõÃgξzîÂ^gÍö·˜±Ù-Vlqƒ4Mé†Ëtºî¢ÿTk‰x¾@ ÒHÿçæçÀåm| ¸ëÚ¯¶¼µ»@´»‹2P | >‚Ó.êq›QÝmhq·©˜nêa¸èèôH`ºÿÅÍóý]±ù±Í±ÅéíVt®ËŒ†Û-3V§éFÔ0\–$*µDH¤u™â׃$bI á¬ü4)P8ûG°X!°T3¹Ì{rØ}¼£~ÓeýuûCjŒ"€F¢Ê"‰š1#VK @Z•œ›Î¢.'Hø)H¼²$´˜ê™Ã¸„GZ š›U~ºUwœz®({ÍpÔ$XJý†¸{aÖ„@clqjÔœ¯óÕH ¶>âi@Bd6Ú›¼ôv ^ý¹ÀÎw¬üÔÜ⎺¬É°ÛòÌ [gšÐ6Fj $H«-˜ëTàŠ¥'9µ›°‰Òÿ÷^ù)Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“¶ÎìÿÉMUjè:IEND®B`‚compiz-0.9.11+14.04.20140409/plugins/splash/CMakeLists.txt0000644000015301777760000000015312321343002023204 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (splash PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/splash/src/0000755000015301777760000000000012321344021021236 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/splash/src/splash.h0000644000015301777760000000470012321343002022700 0ustar pbusernogroup00000000000000/* * Compiz splash plugin * * splash.h * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.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. * */ #include #include #include #include #include #include #include "splash_options.h" #define MESH_W 16 #define MESH_H 16 extern const std::string SPLASH_BACKGROUND_DEFAULT; extern const std::string SPLASH_LOGO_DEFAULT; class SplashScreen : public PluginClassHandler , public SplashOptions, public CompositeScreenInterface, public GLScreenInterface { public: SplashScreen (CompScreen *); CompositeScreen *cScreen; GLScreen *gScreen; Atom splashAtom; int fade_in; int fade_out; int time; GLTexture::List back_img, logo_img; CompSize backSize, logoSize; bool hasInit, hasLogo, hasBack; float mesh[MESH_W][MESH_H][2]; float mMove; float brightness; float saturation; bool initiate; bool active; void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void donePaint (); bool initiateSplash (CompAction *, CompAction::State, CompOption::Vector); }; #define SPLASH_SCREEN(s) \ SplashScreen *ss = SplashScreen::get (s) class SplashWindow : public PluginClassHandler , public GLWindowInterface { public: SplashWindow (CompWindow *); CompWindow *window; GLWindow *gWindow; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); }; #define SPLASH_WINDOW(w) \ SplashWindow *sw = SplashWindow::get (w) class SplashPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/splash/src/splash.cpp0000644000015301777760000003326512321343002023243 0ustar pbusernogroup00000000000000/* * Compiz splash plugin * * splash.cpp * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.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. * */ #include "splash.h" COMPIZ_PLUGIN_20090315 (splash, SplashPluginVTable); const std::string SPLASH_BACKGROUND_DEFAULT(""); const std::string SPLASH_LOGO_DEFAULT(""); void SplashScreen::preparePaint (int ms) { bool lastShot = false; fade_in -= ms; if (fade_in < 0) { time += fade_in; fade_in = 0; if (time < 0) { if (fade_out > 0 && fade_out <= ms) lastShot = true; fade_out += time; time = 0; if (fade_out < 0) fade_out = 0; } } if (initiate) { fade_in = fade_out = optionGetFadeTime () * 1000.0; time = optionGetDisplayTime () * 1000.0; initiate = false; } if (fade_in || fade_out || time || lastShot) { active = true; mMove += ms / 500.0; if (!hasInit) { hasInit = true; mMove = 0.0; CompString back_s (optionGetBackground ()); CompString logo_s (optionGetLogo ()); CompString pname ("splash"); back_img = GLTexture::readImageToTexture (back_s, pname, backSize); logo_img = GLTexture::readImageToTexture (logo_s, pname, logoSize); if (!back_img.size ()) { CompString defaultBack (SPLASH_BACKGROUND_DEFAULT); back_img = GLTexture::readImageToTexture (defaultBack, pname, backSize); if (back_img.size ()) { compLogMessage ("splash", CompLogLevelWarn, "Could not load splash background image " "\"%s\" using default!", back_s.c_str () ); } } if (!logo_img.size ()) { CompString defaultLogo (SPLASH_LOGO_DEFAULT); logo_img = GLTexture::readImageToTexture (defaultLogo, pname, logoSize); if (logo_img.size ()) { compLogMessage ("splash", CompLogLevelWarn, "Could not load splash logo image " "\"%s\" using default!", logo_s.c_str () ); } } if (!back_img.size ()) compLogMessage ("splash", CompLogLevelWarn, "Could not load splash background image " "\"%s\" !", back_s.c_str () ); if (!logo_img.size ()) compLogMessage ("splash", CompLogLevelWarn, "Could not load splash logo image \"%s\" !", logo_s.c_str () ); } } else { active = false; if (hasInit) hasInit = false; cScreen->preparePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); foreach (CompWindow *w, screen->windows ()) { SPLASH_WINDOW (w); sw->gWindow->glPaintSetEnabled (sw, false); } } cScreen->preparePaint (ms); } void SplashScreen::donePaint () { if (fade_in || fade_out || time) cScreen->damageScreen (); cScreen->donePaint (); } static CompRect splashGetCurrentOutputRect () { int root_x = 0, root_y = 0; int ignore_i; unsigned int ignore_ui; int output; Window ignore_w; if (screen->outputDevs ().size () == 1) output = 0; else { XQueryPointer (screen->dpy (), screen->root (), &ignore_w, &ignore_w, &root_x, &root_y, &ignore_i, &ignore_i, &ignore_ui); output = screen->outputDeviceForPoint (root_x, root_y); } CompRect rect (screen->outputDevs ()[output]); return rect; } bool SplashScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { GLMatrix sTransform = transform; GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); bool status = true; float alpha = 0.0; if (active) { alpha = (1.0 - (fade_in / (optionGetFadeTime () * 1000.0) ) ) * (fade_out / (optionGetFadeTime () * 1000.0) ); saturation = 1.0 - ((1.0 - (optionGetSaturation () / 100.0) ) * alpha); brightness = 1.0 - ((1.0 - (optionGetBrightness () / 100.0) ) * alpha); } status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (!active) return status; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (back_img.size ()) { int x, y; for (x = 0; x < MESH_W; x++) { for (y = 0; y < MESH_H; y++) { mesh[x][y][0] = (x / (MESH_W - 1.0) ) + (0.02 * sin ( (y / (MESH_H - 1.0) * 8) + mMove) ); mesh[x][y][1] = (y / (MESH_H - 1.0) ) + (0.02 * sin ( (mesh[x][y][0] * 8) + mMove) ); } } foreach (GLTexture* tex, back_img) { tex->enable (GLTexture::Good); if (!screen->outputDevs ().size () > 1) { CompRect headOutputRect = splashGetCurrentOutputRect (); x = (headOutputRect.width () - backSize.width ()) / 2; y = (headOutputRect.height () - backSize.height ()) / 2; x += headOutputRect.x (); y += headOutputRect.y (); } else { x = (screen->width () - backSize.width ()) / 2; y = (screen->height () - backSize.height ()) / 2; } GLTexture::Matrix mat = tex->matrix (); sTransform.translate (x, y, 0); float cx1, cx2, cy1, cy2; std::vector coords; std::vector vertices; coords.reserve (12 * (MESH_W - 1) * (MESH_H - 1)); vertices.reserve (18 * (MESH_W - 1) * (MESH_H - 1)); for (x = 0; x < MESH_W - 1; x++) { for (y = 0; y < MESH_H - 1; y++) { cx1 = (x / (MESH_W - 1.0) ) * backSize.width (); cx2 = ( (x + 1) / (MESH_W - 1.0) ) * backSize.width (); cy1 = (y / (MESH_H - 1.0) ) * backSize.height (); cy2 = ( (y + 1) / (MESH_H - 1.0) ) * backSize.height (); coords.push_back (COMP_TEX_COORD_X (mat, cx1)); coords.push_back (COMP_TEX_COORD_Y (mat, cy1)); coords.push_back (COMP_TEX_COORD_X (mat, cx1)); coords.push_back (COMP_TEX_COORD_Y (mat, cy2)); coords.push_back (COMP_TEX_COORD_X (mat, cx2)); coords.push_back (COMP_TEX_COORD_Y (mat, cy2)); coords.push_back (COMP_TEX_COORD_X (mat, cx2)); coords.push_back (COMP_TEX_COORD_Y (mat, cy2)); coords.push_back (COMP_TEX_COORD_X (mat, cx2)); coords.push_back (COMP_TEX_COORD_Y (mat, cy1)); coords.push_back (COMP_TEX_COORD_X (mat, cx1)); coords.push_back (COMP_TEX_COORD_Y (mat, cy1)); vertices.push_back (mesh[x][y][0] * backSize.width ()); vertices.push_back (mesh[x][y][1] * backSize.height ()); vertices.push_back (0.0f); vertices.push_back (mesh[x][y + 1][0] * backSize.width ()); vertices.push_back (mesh[x][y + 1][1] * backSize.height ()); vertices.push_back (0.0f); vertices.push_back (mesh[x + 1][y + 1][0] * backSize.width ()); vertices.push_back (mesh[x + 1][y + 1][1] * backSize.height ()); vertices.push_back (0.0f); vertices.push_back (mesh[x + 1][y + 1][0] * backSize.width ()); vertices.push_back (mesh[x + 1][y + 1][1] * backSize.height ()); vertices.push_back (0.0f); vertices.push_back (mesh[x + 1][y][0] * backSize.width ()); vertices.push_back (mesh[x + 1][y][1] * backSize.height ()); vertices.push_back (0.0f); vertices.push_back (mesh[x][y][0] * backSize.width ()); vertices.push_back (mesh[x][y][1] * backSize.height ()); vertices.push_back (0.0f); } } stream->begin (GL_TRIANGLES); stream->color4f (1.0, 1.0, 1.0, alpha); stream->addVertices (vertices.size () / 3, &vertices[0]); stream->addTexCoords (0, coords.size () / 2, &coords[0]); if (stream->end ()) stream->render (sTransform); if (screen->outputDevs ().size () > 1) { CompRect headOutputRect = splashGetCurrentOutputRect (); x = (headOutputRect.width () - backSize.width ()) / 2; y = (headOutputRect.height () - backSize.height ()) / 2; x += headOutputRect.x (); y += headOutputRect.y (); } else { x = (screen->width () - backSize.width ()) / 2; y = (screen->height () - backSize.height ()) / 2; } sTransform.translate (-x, -y, 0); tex->disable (); } } if (logo_img.size ()) { foreach (GLTexture* tex, logo_img) { tex->enable (GLTexture::Good); int x, y; if (screen->outputDevs ().size () > 1) { CompRect headOutputRect = splashGetCurrentOutputRect (); x = (headOutputRect.width () - logoSize.width ()) / 2; y = (headOutputRect.height () - logoSize.height ()) / 2; x += headOutputRect.x (); y += headOutputRect.y (); } else { x = (screen->width () - logoSize.width ()) / 2; y = (screen->height () - logoSize.height ()) / 2; } GLTexture::Matrix mat = tex->matrix (); sTransform.translate (x, y, 0); GLfloat coords[12]; GLfloat vertices[18]; coords[0] = COMP_TEX_COORD_X (mat, 0); coords[1] = COMP_TEX_COORD_Y (mat, 0); coords[2] = COMP_TEX_COORD_X (mat, 0); coords[3] = COMP_TEX_COORD_Y (mat, logoSize.height ()); coords[4] = COMP_TEX_COORD_X (mat, logoSize.width ()); coords[5] = COMP_TEX_COORD_Y (mat, logoSize.height ()); coords[6] = COMP_TEX_COORD_X (mat, logoSize.width ()); coords[7] = COMP_TEX_COORD_Y (mat, logoSize.height ()); coords[8] = COMP_TEX_COORD_X (mat, logoSize.width ()); coords[9] = COMP_TEX_COORD_Y (mat, 0); coords[10] = COMP_TEX_COORD_X (mat, 0); coords[11] = COMP_TEX_COORD_Y (mat, 0); vertices[0] = 0; vertices[1] = 0; vertices[2] = 0; vertices[3] = 0; vertices[4] = logoSize.height (); vertices[5] = 0; vertices[6] = logoSize.width (); vertices[7] = logoSize.height (); vertices[8] = 0; vertices[9] = logoSize.width (); vertices[10] = logoSize.height (); vertices[11] = 0; vertices[12] = logoSize.width (); vertices[13] = 0; vertices[14] = 0; vertices[15] = 0; vertices[16] = 0; vertices[17] = 0; stream->begin (GL_TRIANGLES); stream->color4f (1.0, 1.0, 1.0, alpha); stream->addVertices (6, vertices); stream->addTexCoords (0, 6, coords); if (stream->end ()) stream->render (sTransform); sTransform.translate (-x, -y, 0); tex->disable (); } } glDisable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); return status; } bool SplashWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; SPLASH_SCREEN (screen); if (ss->active) { GLWindowPaintAttrib pA = attrib; pA.brightness = (attrib.brightness * ss->brightness); pA.saturation = (attrib.saturation * ss->saturation); status = gWindow->glPaint (pA, transform, region, mask); } else { status = gWindow->glPaint (attrib, transform, region, mask); } return status; } bool SplashScreen::initiateSplash (CompAction *action, CompAction::State state, CompOption::Vector options) { initiate = true; cScreen->preparePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); foreach (CompWindow *w, screen->windows ()) { SPLASH_WINDOW (w); sw->gWindow->glPaintSetEnabled (sw, true); } return false; } /* replace with ctor, dtor, init etc */ SplashScreen::SplashScreen (CompScreen *screen) : PluginClassHandler (screen), SplashOptions (), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), splashAtom (XInternAtom (screen->dpy (), "_COMPIZ_WM_SPLASH", 0)), fade_in (0), fade_out (0), time (0), backSize (0, 0), logoSize (0, 0), hasInit (false), hasLogo (false), hasBack (false), mMove (0.0), brightness (0), saturation (0), initiate (false), active (false) { CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); if (optionGetFirststart () ) { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; result = XGetWindowProperty (screen->dpy (), screen->root (), splashAtom, 0L, 8192L, false, XA_INTEGER, &actual, &format, &n, &left, &propData); if (result == Success && n && propData) { XFree (propData); } else { int value = 1; XChangeProperty (screen->dpy (), screen->root (), splashAtom, XA_INTEGER, 32, PropModeReplace, (unsigned char *) &value, 1); } initiate = true; // should fix later if (initiate) { cScreen->preparePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); } } optionSetInitiateKeyInitiate (boost::bind (&SplashScreen::initiateSplash, this, _1, _2, _3)); } SplashWindow::SplashWindow (CompWindow *window) : PluginClassHandler (window), window (window), gWindow (GLWindow::get (window)) { GLWindowInterface::setHandler (gWindow, false); SPLASH_SCREEN (screen); if (ss->initiate) { gWindow->glPaintSetEnabled (this, true); } } bool SplashPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/splash/splash.xml.in0000644000015301777760000000523612321343002023074 0ustar pbusernogroup00000000000000 <_short>Splash <_long>A simple splash plugin Extras opengl composite opengl imgsvg imgpng imgjpeg decor <_short>Main <_short>Images <_short>Appearance compiz-0.9.11+14.04.20140409/plugins/resize/0000755000015301777760000000000012321344021020456 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/resize/resize.xml.in0000644000015301777760000001310012321343002023077 0ustar pbusernogroup00000000000000 <_short>Resize Window <_long>Resize window Window Management composite opengl decor <_short>Bindings <_short>Specific Window Matches <_short>Additional Modifier Keys <_short>Outline Modifier <_short>Rectangle Modifier <_short>Stretch Modifier <_short>Centered Modifier compiz-0.9.11+14.04.20140409/plugins/resize/CMakeLists.txt0000644000015301777760000000030712321343002023214 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) add_subdirectory (src/logic) include_directories (src/logic/include) compiz_plugin(resize PLUGINDEPS composite opengl LIBRARIES resize_logic) compiz-0.9.11+14.04.20140409/plugins/resize/src/0000755000015301777760000000000012321344021021245 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/resize/src/resize.h0000644000015301777760000000566112321343002022725 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _RESIZE_H #define _RESIZE_H #include #include #include #include #include "resize_options.h" #include "resize-logic.h" #include "resize-defs.h" class ResizeScreen : public PluginClassHandler, public GLScreenInterface, public ScreenInterface, public ResizeOptions { public: ResizeScreen (CompScreen *s); ~ResizeScreen (); void handleEvent (XEvent *event); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void optionChanged (CompOption *o, Options); void resizeMaskValueToKeyMask (int valueMask, int *mask); void glPaintRectangle (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, unsigned short *borderColor, unsigned short *fillColor); public: ResizeLogic logic; GLScreen *gScreen; }; class ResizeWindow : public WindowInterface, public CompositeWindowInterface, public GLWindowInterface, public PluginClassHandler { public: ResizeWindow (CompWindow *w); ~ResizeWindow (); bool damageRect (bool, const CompRect &); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void getStretchScale (BoxPtr pBox, float *xScale, float *yScale); public: CompWindow *window; GLWindow *gWindow; CompositeWindow *cWindow; ResizeScreen *rScreen; }; class ResizePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #endif compiz-0.9.11+14.04.20140409/plugins/resize/src/gl-window-impl.h0000644000015301777760000000343212321343002024264 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_GL_WINDOW_IMPL_H #define RESIZE_GL_WINDOW_IMPL_H #include "gl-window-interface.h" namespace resize { class GLWindowImpl : public GLWindowInterface { public: GLWindowImpl (GLWindow *impl) : mImpl (impl) { } static GLWindowImpl *wrap (GLWindow *impl) { if (impl) return new GLWindowImpl (impl); else return NULL; } virtual void glPaintSetEnabled (bool enable) { mImpl->glPaintSetEnabled (resizeWindow, enable); } ResizeWindow *resizeWindow; private: GLWindow *mImpl; }; } /* namespace resize */ #endif /* RESIZE_GL_WINDOW_IMPL_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/composite-window-impl.h0000644000015301777760000000356512321343002025673 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_COMPOSITE_WINDOW_IMPL_H #define RESIZE_COMPOSITE_WINDOW_IMPL_H #include "composite-window-interface.h" namespace resize { class CompositeWindowImpl : public CompositeWindowInterface { public: CompositeWindowImpl (CompositeWindow *impl) : mImpl (impl) { } static CompositeWindowImpl *wrap (CompositeWindow *impl) { if (impl) return new CompositeWindowImpl (impl); else return NULL; } virtual void damageRectSetEnabled (bool enable) { mImpl->damageRectSetEnabled (resizeWindow, enable); } ResizeWindow *resizeWindow; private: CompositeWindow *mImpl; }; } /* namespace resize */ #endif /* RESIZE_COMPOSITE_WINDOW_IMPL_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/0000755000015301777760000000000012321344021022342 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/tests/0000755000015301777760000000000012321344021023504 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/tests/mock-screen.h0000644000015301777760000000511612321343002026064 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_MOCK_SCREEN_H #define RESIZE_MOCK_SCREEN_H #include #include "screen-interface.h" #include "gl-screen-interface.h" #include "composite-screen-interface.h" namespace resize { class MockScreen : public CompScreenInterface, public GLScreenInterface, public CompositeScreenInterface { public: MOCK_METHOD0(root, Window()); MOCK_METHOD1(findWindow, CompWindowInterface*(Window id)); MOCK_METHOD0(xkbEvent, int()); MOCK_METHOD1(handleEvent, void(XEvent *event)); MOCK_METHOD0(syncEvent, int()); MOCK_METHOD0(dpy, Display*()); MOCK_METHOD2(warpPointer, void(int dx, int dy)); MOCK_METHOD0(outputDevs, CompOutput::vector&()); MOCK_METHOD2(otherGrabExist, bool(const char *, void *)); MOCK_METHOD2(updateGrab, void(CompScreen::GrabHandle handle, Cursor cursor)); MOCK_METHOD2(pushGrab, CompScreen::GrabHandle(Cursor cursor, const char *name)); MOCK_METHOD2(removeGrab, void(CompScreen::GrabHandle handle, CompPoint *restorePointer)); MOCK_METHOD1(getOption, CompOption*(const CompString &name)); MOCK_CONST_METHOD0(width, int()); MOCK_CONST_METHOD0(height, int()); /* from GLSCreenInterface */ MOCK_METHOD1(glPaintOutputSetEnabled, void(bool enable)); /* from CompositeScreenInterface */ MOCK_METHOD0(compositingActive, bool()); MOCK_METHOD1(damageRegion, void(const CompRegion &r)); }; } /* namespace resize */ #endif /* RESIZE_MOCK_SCREEN_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/tests/test-logic.cpp0000644000015301777760000002477512321343002026277 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #include #include "mock-screen.h" #include "mock-window.h" #include "fake-property-writer.h" #include #include "resize-logic.h" #include "resize_options.h" using namespace resize; using ::testing::AnyNumber; using ::testing::Return; using ::testing::ReturnPointee; using ::testing::ReturnRef; using ::testing::SaveArg; using ::testing::StrEq; using ::testing::_; class ResizeLogicTest : public ::testing::Test { public: virtual void SetUp () { SetUpMockWindow (); SetUpMockScreenExpectations (); SetUpFakePropertyWriter (); InjectMocksAndFakesIntoTestSubject (); } void SetUpMockWindow () { EXPECT_CALL (mockWindow, id ()) .WillRepeatedly (Return (123)); EXPECT_CALL (mockWindow, actions ()) .WillRepeatedly (Return (CompWindowActionResizeMask)); mockWindowServerGeometry.set (100 /* x */, 100 /* y */, 100 /* w */, 100 /* h */, 2 /* border */); EXPECT_CALL (mockWindow, serverGeometry ()) .WillRepeatedly (ReturnRef (mockWindowServerGeometry)); EXPECT_CALL (mockWindow, serverSize ()) .WillRepeatedly (Invoke (this, &ResizeLogicTest::GetMockWindowServerSize)); EXPECT_CALL (mockWindow, outputDevice ()) .WillRepeatedly (Return (0)); EXPECT_CALL (mockWindow, evaluate (_)) .WillRepeatedly (Return (false)); EXPECT_CALL (mockWindow, type ()) .WillRepeatedly (Return (0)); EXPECT_CALL (mockWindow, overrideRedirect ()) .WillRepeatedly (Return (false)); EXPECT_CALL (mockWindow, shaded ()) .WillRepeatedly (Return (false)); mockWindowState = 0; EXPECT_CALL (mockWindow, state ()) .WillRepeatedly (ReturnPointee (&mockWindowState)); mockWindowBorder.left = 1; mockWindowBorder.right = 2; mockWindowBorder.top = 3; mockWindowBorder.bottom = 4; EXPECT_CALL (mockWindow, border ()) .WillRepeatedly (ReturnRef (mockWindowBorder)); mockSaveWc.x = 1; mockSaveWc.y = 2; mockSaveWc.width = 3; mockSaveWc.height = 4; EXPECT_CALL (mockWindow, saveWc ()) .WillRepeatedly (ReturnRef (mockSaveWc)); mockSaveMask = 1; EXPECT_CALL (mockWindow, saveMask ()) .WillRepeatedly (ReturnRef (mockSaveMask)); EXPECT_CALL (mockWindow, grabNotify (_,_,_,_)) .Times(AnyNumber()); EXPECT_CALL (mockWindow, ungrabNotify ()) .Times(AnyNumber()); EXPECT_CALL (mockWindow, sendSyncRequest ()) .Times(AnyNumber()); EXPECT_CALL (mockWindow, syncWait ()) .WillRepeatedly (Return (false)); EXPECT_CALL (mockWindow, constrainNewWindowSize (_,_,_,_)) .WillRepeatedly (Return (false)); EXPECT_CALL (mockWindow, configureXWindow (_,_)) .Times(AnyNumber()); EXPECT_CALL (mockWindow, getGLInterface ()) .WillRepeatedly (Return (&mockWindow)); EXPECT_CALL (mockWindow, getCompositeInterface ()) .WillRepeatedly (Return (&mockWindow)); EXPECT_CALL (mockWindow, glPaintSetEnabled(_)) .Times(AnyNumber()); EXPECT_CALL (mockWindow, damageRectSetEnabled(_)) .Times(AnyNumber()); } void SetUpMockScreenExpectations () { optionRaiseOnClick.setName ("raise_on_click", CompOption::TypeBool); optionRaiseOnClick.value ().set ((bool) false); EXPECT_CALL (mockScreen, getOption (StrEq ("raise_on_click"))) .WillRepeatedly (Return (&optionRaiseOnClick)); outputDevices.push_back (CompOutput ()); outputDevices[0].setGeometry(0, 0, 1280, 1024); EXPECT_CALL (mockScreen, outputDevs ()) .WillRepeatedly (ReturnRef (outputDevices)); EXPECT_CALL (mockScreen, findWindow (123)) .WillRepeatedly (Return (&mockWindow)); EXPECT_CALL (mockScreen, compositingActive ()) .WillRepeatedly (Return (true)); EXPECT_CALL (mockScreen, syncEvent ()) .WillRepeatedly (Return (-XSyncAlarmNotify)); EXPECT_CALL (mockScreen, handleEvent (_)); EXPECT_CALL (mockScreen, dpy ()) .WillRepeatedly (Return ((Display*)NULL)); EXPECT_CALL (mockScreen, xkbEvent ()) .WillRepeatedly (Return (0)); EXPECT_CALL (mockScreen, glPaintOutputSetEnabled (_)) .Times(AnyNumber()); } void SetUpFakePropertyWriter () { fakePropWriter.mPropertyValues.resize(4); for (int i = 0; i < 4; i++) { char buf[4]; snprintf (buf, 4, "%i", i); CompString tmpName (buf); fakePropWriter.mPropertyValues.at (i).setName (tmpName, CompOption::TypeInt); } } void InjectMocksAndFakesIntoTestSubject () { logic.resizeInformationAtom = &fakePropWriter; logic.mScreen = &mockScreen; logic.cScreen = NULL; // avoid entering CompositeScreen during tests logic.gScreen = &mockScreen; logic.options = &resizeOptions; } CompSize GetMockWindowServerSize () { CompSize size (mockWindowServerGeometry.width(), mockWindowServerGeometry.height()); return size; } ResizeLogic logic; MockWindow mockWindow; MockScreen mockScreen; FakePropertyWriter fakePropWriter; ResizeOptions resizeOptions; CompOption optionRaiseOnClick; CompOutput::vector outputDevices; CompWindow::Geometry mockWindowServerGeometry; unsigned int mockWindowState; CompWindowExtents mockWindowBorder; XWindowChanges mockSaveWc; int mockSaveMask; }; TEST_F (ResizeLogicTest, MaximizeVerticallyWhenResizedTopEdgeScreen) { CompAction action; CompAction::State state = 0; CompOption::Vector options; options.push_back (CompOption ("window", CompOption::TypeInt)); options[0].value ().set ((int) 123); options.push_back (CompOption ("external", CompOption::TypeBool)); options[1].value ().set (true); EXPECT_CALL (mockScreen, otherGrabExist (StrEq ("resize"), _)) .WillOnce (Return (false)); EXPECT_CALL (mockScreen, pushGrab (_, StrEq ("resize"))) .WillOnce (Return ((CompScreen::GrabHandle)1)); /* hit the middle of the top edge of the window */ pointerX = mockWindowServerGeometry.centerX (); pointerY = mockWindowServerGeometry.top(); logic.initiateResizeDefaultMode(&action, state, options); /* move the pointer to the top of the screen */ pointerY = 1; XEvent event; event.type = MotionNotify; event.xmotion.root = 345; EXPECT_CALL (mockScreen, root ()) .WillRepeatedly (Return (event.xmotion.root)); logic.handleEvent(&event); EXPECT_CALL (mockScreen, removeGrab (_, _)); EXPECT_CALL (mockWindow, maximize (CompWindowStateMaximizedVertMask)) .Times(1) .WillRepeatedly(SaveArg<0>(&mockWindowState)); logic.terminateResize(&action, state, options); } TEST_F (ResizeLogicTest, DontMaximizeVerticallyIfFarFromTopEdge) { CompAction action; CompAction::State state = 0; CompOption::Vector options; options.push_back (CompOption ("window", CompOption::TypeInt)); options[0].value ().set ((int) 123); options.push_back (CompOption ("external", CompOption::TypeBool)); options[1].value ().set (true); EXPECT_CALL (mockScreen, otherGrabExist (StrEq ("resize"), _)) .WillOnce (Return (false)); EXPECT_CALL (mockScreen, pushGrab (_, StrEq ("resize"))) .WillOnce (Return ((CompScreen::GrabHandle)1)); /* hit the middle of the top edge of the window */ pointerX = mockWindowServerGeometry.centerX (); pointerY = mockWindowServerGeometry.top(); logic.initiateResizeDefaultMode(&action, state, options); /* move the pointer just a bit upwards. Still far away from the top edge of * the screen */ pointerY -= 10; XEvent event; event.type = MotionNotify; event.xmotion.root = 345; EXPECT_CALL (mockScreen, root ()) .WillRepeatedly (Return (event.xmotion.root)); logic.handleEvent(&event); EXPECT_CALL (mockScreen, removeGrab (_, _)); EXPECT_CALL (mockWindow, maximize (_)) .Times(0); logic.terminateResize(&action, state, options); } /* Simulate a resize that is initiated by the "resize" compiz plugin himself * instead of externally. E.g.: user presses Alt + middle mouse button (the * default button assignment for resizing) * * Regression test for bug lp1045191 * https://bugs.launchpad.net/ubuntu/+source/compiz/+bug/1045191 * This bug would cause a crash in this situation. */ TEST_F (ResizeLogicTest, DontCrashIfSourceNotExternalApp) { CompAction action; CompAction::State state = 0; CompOption::Vector options; options.push_back (CompOption ("window", CompOption::TypeInt)); options[0].value ().set ((int) 123); options.push_back (CompOption ("external", CompOption::TypeBool)); options[1].value ().set (false); /* source is not an external app */ EXPECT_CALL (mockScreen, otherGrabExist (StrEq ("resize"), _)) .WillOnce (Return (false)); EXPECT_CALL (mockScreen, pushGrab (_, StrEq ("resize"))) .WillOnce (Return ((CompScreen::GrabHandle)1)); /* hit a point near but not directly over the top window edge. * You don't have to hit the window border if the resize is * initiated by the initiate_button compiz action */ pointerX = mockWindowServerGeometry.centerX (); pointerY = mockWindowServerGeometry.top() + (mockWindowServerGeometry.height() / 4); logic.initiateResizeDefaultMode(&action, state, options); /* move the pointer to the top of the screen */ pointerY = 1; XEvent event; event.type = MotionNotify; event.xmotion.root = 345; EXPECT_CALL (mockScreen, root ()) .WillRepeatedly (Return (event.xmotion.root)); logic.handleEvent(&event); EXPECT_CALL (mockScreen, removeGrab (_, _)); logic.terminateResize(&action, state, options); } compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/tests/resize-options-mock.cpp0000644000015301777760000000321512321343002030130 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #include "resize_options.h" ResizeOptions::ResizeOptions (bool init /* = true */) : mOptions (ResizeOptions::OptionNum), mNotify (ResizeOptions::OptionNum) { mOptions[ResizeOptions::MaximizeVertically].value ().set (true); } ResizeOptions::~ResizeOptions () { } CompOption::Vector & ResizeOptions::getOptions () { return mOptions; } bool ResizeOptions::setOption (const CompString &name, CompOption::Value &value) { return true; } compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/tests/x11-mocks.cpp0000644000015301777760000000264212321343002025735 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #include #include Status XSendEvent(Display* /* display */, Window /* w */, Bool /* propagate */, long /* event_mask */, XEvent* /* event_send */) { return Success; } compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/tests/fake-property-writer.h0000644000015301777760000000367612321343002027771 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_FAKE_PROPERTY_WRITER_H #define RESIZE_FAKE_PROPERTY_WRITER_H #include "property-writer-interface.h" namespace resize { class FakePropertyWriter : public PropertyWriterInterface { public: virtual bool updateProperty (Window, CompOption::Vector &, int) { return true; } virtual void deleteProperty (Window) { } virtual const CompOption::Vector & readProperty (Window) { return mPropertyValues; } virtual void setReadTemplate (const CompOption::Vector &v) { mPropertyValues = v; } virtual const CompOption::Vector & getReadTemplate () { return mPropertyValues; } CompOption::Vector mPropertyValues; }; } /* namespace resize */ #endif /* RESIZE_FAKE_PROPERTY_WRITER_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/tests/CMakeLists.txt0000644000015301777760000000067012321343002026245 0ustar pbusernogroup00000000000000add_executable (compiz_test_resize_logic test-logic.cpp resize-options-mock.cpp x11-mocks.cpp) target_link_libraries (compiz_test_resize_logic resize_logic compiz_core ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_resize_logic COVERAGE resize_logic) compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/tests/mock-window.h0000644000015301777760000000652612321343002026122 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_MOCK_WINDOW_H #define RESIZE_MOCK_WINDOW_H #include #include "window-interface.h" #include "gl-window-interface.h" #include "composite-window-interface.h" namespace resize { class MockWindow : public CompWindowInterface, public GLWindowInterface, public CompositeWindowInterface { public: MOCK_METHOD0(id, Window()); MOCK_CONST_METHOD0(outputRect, CompRect()); MOCK_METHOD0(syncAlarm, XSyncAlarm()); MOCK_CONST_METHOD0(sizeHints, XSizeHints&()); MOCK_CONST_METHOD0(serverGeometry, CompWindow::Geometry &()); MOCK_CONST_METHOD0(border, CompWindowExtents&()); MOCK_CONST_METHOD0(output, CompWindowExtents&()); MOCK_METHOD4(constrainNewWindowSize, bool (int width, int height, int *newWidth, int *newHeight)); MOCK_METHOD0(syncWait, bool()); MOCK_METHOD0(sendSyncRequest, void()); MOCK_METHOD2(configureXWindow, void(unsigned int valueMask, XWindowChanges *xwc)); MOCK_METHOD4(grabNotify, void (int x, int y, unsigned int state, unsigned int mask)); MOCK_METHOD0(ungrabNotify, void()); MOCK_METHOD0(shaded, bool()); MOCK_CONST_METHOD0(size, CompSize()); MOCK_METHOD0(actions, unsigned int()); MOCK_METHOD0(type, unsigned int()); MOCK_METHOD0(state, unsigned int &()); MOCK_METHOD0(overrideRedirect, bool()); MOCK_METHOD1(updateAttributes, void(CompStackingUpdateMode stackingMode)); MOCK_METHOD0(outputDevice, int()); MOCK_CONST_METHOD0(serverSize, const CompSize()); MOCK_METHOD1(maximize, void(unsigned int state)); MOCK_METHOD0(saveWc, XWindowChanges &()); MOCK_METHOD0(saveMask, int &()); MOCK_METHOD1(evaluate, bool(CompMatch &match)); MOCK_METHOD0(getResizeInterface, ResizeWindowInterface*()); MOCK_METHOD0(getGLInterface, GLWindowInterface*()); MOCK_METHOD0(getCompositeInterface, CompositeWindowInterface*()); /* from GLWindowInterface */ MOCK_METHOD1(glPaintSetEnabled, void(bool enable)); /* from CompositeWindowInterface */ MOCK_METHOD1(damageRectSetEnabled, void(bool enable)); }; } /* namespace resize */ #endif /* RESIZE_MOCK_WINDOW_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/CMakeLists.txt0000644000015301777760000000177312321343002025110 0ustar pbusernogroup00000000000000INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_BINARY_DIR}/generated ${COMPIZ_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS} ${COMPIZ_LIBRARY_DIRS}) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/composite-screen-interface.h ${CMAKE_CURRENT_SOURCE_DIR}/include/gl-screen-interface.h ${CMAKE_CURRENT_SOURCE_DIR}/include/resize-logic.h ${CMAKE_CURRENT_SOURCE_DIR}/include/resize-window-interface.h ${CMAKE_CURRENT_SOURCE_DIR}/include/screen-interface.h ${CMAKE_CURRENT_SOURCE_DIR}/include/window-interface.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/resize-logic.cpp ) ADD_LIBRARY( resize_logic STATIC ${SRCS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) TARGET_LINK_LIBRARIES( resize_logic compiz_rect compiz_region ) ADD_DEPENDENCIES (resize_logic resize-options) compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/src/0000755000015301777760000000000012321344021023131 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/src/resize-logic.cpp0000644000015301777760000012203712321343002026234 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: David Reveman * Daniel d'Andrada */ #include #include #include "resize-logic.h" #include "resize_options.h" #include "screen-interface.h" #include "gl-screen-interface.h" #include "composite-screen-interface.h" #include "window-interface.h" #include "composite-window-interface.h" #include "gl-window-interface.h" #include "resize-window-interface.h" #include "property-writer-interface.h" #define XWINDOWCHANGES_INIT {0, 0, 0, 0, 0, None, 0} static const unsigned short TOUCH_LEFT = 1; static const unsigned short TOUCH_RIGHT = 2; static const unsigned short TOUCH_TOP = 3; static const unsigned short TOUCH_BOTTOM = 4; using namespace resize; ResizeLogic::ResizeLogic() : mScreen (NULL), w (NULL), centered (false), maximized_vertically (false), outlineMask (0), rectangleMask (0), stretchMask (0), centeredMask (0), releaseButton (0), grabIndex (0), isConstrained (false), offWorkAreaConstrained (true), options (NULL), cScreen (NULL), gScreen (NULL) { rKeys[0].name = "Left"; rKeys[0].dx = -1; rKeys[0].dy = 0; rKeys[0].warpMask = ResizeLeftMask | ResizeRightMask; rKeys[0].resizeMask = ResizeLeftMask; rKeys[1].name = "Right"; rKeys[1].dx = 1; rKeys[1].dy = 0; rKeys[1].warpMask = ResizeLeftMask | ResizeRightMask; rKeys[1].resizeMask = ResizeRightMask; rKeys[2].name = "Up"; rKeys[2].dx = 0; rKeys[2].dy = -1; rKeys[2].warpMask = ResizeUpMask | ResizeDownMask; rKeys[2].resizeMask = ResizeUpMask; rKeys[3].name = "Down"; rKeys[3].dx = 0; rKeys[3].dy = 1; rKeys[3].warpMask = ResizeUpMask | ResizeDownMask; rKeys[3].resizeMask = ResizeDownMask; } ResizeLogic::~ResizeLogic() { } void ResizeLogic::handleEvent (XEvent *event) { switch (event->type) { case KeyPress: if (event->xkey.root == mScreen->root ()) handleKeyEvent (event->xkey.keycode); break; case ButtonRelease: if (event->xbutton.root == mScreen->root ()) { if (grabIndex) { if (releaseButton == -1 || (int) event->xbutton.button == releaseButton) { CompAction *action = &options->optionGetInitiateButton (); terminateResize (action, CompAction::StateTermButton, noOptions ()); } } } break; case MotionNotify: if (event->xmotion.root == mScreen->root ()) handleMotionEvent (pointerX, pointerY); break; case EnterNotify: case LeaveNotify: if (event->xcrossing.root == mScreen->root ()) handleMotionEvent (pointerX, pointerY); break; case ClientMessage: if (event->xclient.message_type == Atoms::wmMoveResize) { unsigned long type = event->xclient.data.l[2]; if (type <= WmMoveResizeSizeLeft || type == WmMoveResizeSizeKeyboard) { CompWindowInterface *w; w = mScreen->findWindow (event->xclient.window); if (w) { mScreen->freeWindowInterface (w); w = NULL; CompOption::Vector o (0); o.push_back (CompOption ("window", CompOption::TypeInt)); o[0].value ().set ((int) event->xclient.window); o.push_back (CompOption ("external", CompOption::TypeBool)); o[1].value ().set (true); if (event->xclient.data.l[2] == WmMoveResizeSizeKeyboard) { initiateResizeDefaultMode (&options->optionGetInitiateKey (), CompAction::StateInitKey, o); } else { /* TODO: not only button 1 */ if (pointerMods & Button1Mask) { static unsigned int mask[] = { ResizeUpMask | ResizeLeftMask, ResizeUpMask, ResizeUpMask | ResizeRightMask, ResizeRightMask, ResizeDownMask | ResizeRightMask, ResizeDownMask, ResizeDownMask | ResizeLeftMask, ResizeLeftMask, }; o.push_back (CompOption ("modifiers", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o.push_back (CompOption ("direction", CompOption::TypeInt)); o.push_back (CompOption ("button", CompOption::TypeInt)); o[2].value ().set ((int) pointerMods); o[3].value ().set ((int) event->xclient.data.l[0]); o[4].value ().set ((int) event->xclient.data.l[1]); o[5].value ().set ((int) mask[event->xclient.data.l[2]]); o[6].value ().set ((int) (event->xclient.data.l[3] ? event->xclient.data.l[3] : -1)); initiateResizeDefaultMode ( &options->optionGetInitiateButton (), CompAction::StateInitButton, o); handleMotionEvent (pointerX, pointerY); } } } } else if (this->w && type == WmMoveResizeCancel) { if (this->w->id () == event->xclient.window) { terminateResize (&options->optionGetInitiateButton (), CompAction::StateCancel, noOptions ()); terminateResize (&options->optionGetInitiateKey (), CompAction::StateCancel, noOptions ()); } } } break; case DestroyNotify: if (w && w->id () == event->xdestroywindow.window) { terminateResize (&options->optionGetInitiateButton (), 0, noOptions ()); terminateResize (&options->optionGetInitiateKey (), 0, noOptions ()); } break; case UnmapNotify: if (w && w->id () == event->xunmap.window) { terminateResize (&options->optionGetInitiateButton (), 0, noOptions ()); terminateResize (&options->optionGetInitiateKey (), 0, noOptions ()); } break; default: break; } if (event->type == mScreen->xkbEvent ()) { XkbAnyEvent *xkbEvent = (XkbAnyEvent *) event; if (xkbEvent->xkb_type == XkbStateNotify) { XkbStateNotifyEvent *stateEvent = (XkbStateNotifyEvent *) event; /* Check if we need to change to outline mode */ unsigned int mods = 0xffffffff; bool modifierMode = false; int oldMode = mode; if (outlineMask) mods = outlineMask; if ((stateEvent->mods & mods) == mods) { modifierMode = true; mode = ResizeOptions::ModeOutline; } mods = 0xffffffff; if (rectangleMask) mods = rectangleMask; if ((stateEvent->mods & mods) == mods) { modifierMode = true; mode = ResizeOptions::ModeRectangle; } mods = 0xffffffff; if (stretchMask) mods = stretchMask; if ((stateEvent->mods & mods) == mods) { modifierMode = true; mode = ResizeOptions::ModeStretch; } mods = 0xffffffff; if (centeredMask) mods = centeredMask; /* No modifier mode set, check match options */ if (w) { if (w->evaluate (options->optionGetNormalMatch ())) { modifierMode = true; mode = ResizeOptions::ModeNormal; } if (w->evaluate (options->optionGetOutlineMatch ())) { modifierMode = true; mode = ResizeOptions::ModeOutline; } if (w->evaluate (options->optionGetRectangleMatch ())) { modifierMode = true; mode = ResizeOptions::ModeRectangle; } if (w->evaluate (options->optionGetStretchMatch ())) { modifierMode = true; mode = ResizeOptions::ModeStretch; } } if (!modifierMode) mode = options->optionGetMode (); if (w && oldMode != mode) { Box box; getStretchRectangle (&box); damageRectangle (&box); getPaintRectangle (&box); damageRectangle (&box); box.x1 = w->outputRect ().x (); box.y1 = w->outputRect ().y (); box.x2 = box.x1 + w->outputRect ().width (); box.y2 = box.y1 + w->outputRect ().height (); damageRectangle (&box); } if ((stateEvent->mods & mods) == mods) { centered = true; } else if (w) { if (!w->evaluate (options->optionGetResizeFromCenterMatch ())) centered = false; else centered = true; } else centered = false; } } mScreen->handleEvent (event); if (event->type == mScreen->syncEvent () + XSyncAlarmNotify) { if (w) { XSyncAlarmNotifyEvent *sa; sa = (XSyncAlarmNotifyEvent *) event; if (w->syncAlarm () == sa->alarm) updateWindowSize (); } } } void ResizeLogic::handleKeyEvent (KeyCode keycode) { if (grabIndex && w) { int widthInc = w->sizeHints ().width_inc; int heightInc = w->sizeHints ().height_inc; if (widthInc < MIN_KEY_WIDTH_INC) widthInc = MIN_KEY_WIDTH_INC; if (heightInc < MIN_KEY_HEIGHT_INC) heightInc = MIN_KEY_HEIGHT_INC; for (unsigned int i = 0; i < NUM_KEYS; i++) { if (keycode != key[i]) continue; if (mask & rKeys[i].warpMask) XWarpPointer (mScreen->dpy (), None, None, 0, 0, 0, 0, rKeys[i].dx * widthInc, rKeys[i].dy * heightInc); else { CompWindow::Geometry server = w->serverGeometry (); const CompWindowExtents &border = w->border (); int left = server.x () - border.left; int top = server.y () - border.top; int width = border.left + server.width () + border.right; int height = border.top + server.height () + border.bottom; int x = left + width * (rKeys[i].dx + 1) / 2; int y = top + height * (rKeys[i].dy + 1) / 2; mScreen->warpPointer (x - pointerX, y - pointerY); mask = rKeys[i].resizeMask; mScreen->updateGrab (grabIndex, cursor[i]); } break; } } } void ResizeLogic::handleMotionEvent (int xRoot, int yRoot) { if (grabIndex) { BoxRec box; int wi, he, cwi, che; /* size of window contents (c prefix for constrained)*/ int wX, wY, wWidth, wHeight; /* rect. for window contents+borders */ wi = savedGeometry.width; he = savedGeometry.height; if (!mask) { setUpMask (xRoot, yRoot); } else { accumulatePointerMotion (xRoot, yRoot); } if (mask & ResizeLeftMask) wi -= pointerDx; else if (mask & ResizeRightMask) wi += pointerDx; if (mask & ResizeUpMask) he -= pointerDy; else if (mask & ResizeDownMask) he += pointerDy; if (w->state () & CompWindowStateMaximizedVertMask) he = w->serverGeometry ().height (); if (w->state () & CompWindowStateMaximizedHorzMask) wi = w->serverGeometry ().width (); cwi = wi; che = he; if (w->constrainNewWindowSize (wi, he, &cwi, &che) && mode != ResizeOptions::ModeNormal) { Box box; /* Also, damage relevant paint rectangles */ if (mode == ResizeOptions::ModeRectangle || mode == ResizeOptions::ModeOutline) getPaintRectangle (&box); else if (mode == ResizeOptions::ModeStretch) getStretchRectangle (&box); damageRectangle (&box); } if (offWorkAreaConstrained) constrainToWorkArea (che, cwi); wi = cwi; he = che; /* compute rect. for window + borders */ computeWindowPlusBordersRect (wX, wY, wWidth, wHeight, /*out*/ wi, he); /*in*/ snapWindowToWorkAreaBoundaries (wi, he, wX, wY, wWidth, wHeight); if (isConstrained) limitMovementToConstraintRegion (wi, he, /*in/out*/ xRoot, yRoot, wX, wY, wWidth, wHeight); /*in*/ if (mode != ResizeOptions::ModeNormal) { if (mode == ResizeOptions::ModeStretch) getStretchRectangle (&box); else getPaintRectangle (&box); damageRectangle (&box); } enableOrDisableVerticalMaximization (yRoot); computeGeometry (wi, he); if (mode != ResizeOptions::ModeNormal) { if (mode == ResizeOptions::ModeStretch) getStretchRectangle (&box); else getPaintRectangle (&box); damageRectangle (&box); } else { updateWindowSize (); } updateWindowProperty (); sendResizeNotify (); } } void ResizeLogic::updateWindowSize () { if (w->syncWait ()) return; if (w->serverGeometry ().width () != geometry.width || w->serverGeometry ().height () != geometry.height) { XWindowChanges xwc = XWINDOWCHANGES_INIT; xwc.x = geometry.x; xwc.y = geometry.y; xwc.width = geometry.width; xwc.height = geometry.height; w->sendSyncRequest (); w->configureXWindow (CWX | CWY | CWWidth | CWHeight, &xwc); } } void ResizeLogic::updateWindowProperty () { CompOption::Vector data = resizeInformationAtom->getReadTemplate ();; CompOption::Value v; if (data.size () != 4) return; v = geometry.x; data.at (0).set (v); v = geometry.y; data.at (1).set (v); v = geometry.width; data.at (2).set (v); v = geometry.height; data.at (3).set (v); resizeInformationAtom->updateProperty (w->id (), data, XA_CARDINAL); } void ResizeLogic::sendResizeNotify () { XEvent xev; xev.xclient.type = ClientMessage; xev.xclient.display = mScreen->dpy (); xev.xclient.format = 32; xev.xclient.message_type = resizeNotifyAtom; xev.xclient.window = w->id (); xev.xclient.data.l[0] = geometry.x; xev.xclient.data.l[1] = geometry.y; xev.xclient.data.l[2] = geometry.width; xev.xclient.data.l[3] = geometry.height; xev.xclient.data.l[4] = 0; XSendEvent (mScreen->dpy (), mScreen->root (), false, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } void ResizeLogic::finishResizing () { w->ungrabNotify (); resizeInformationAtom->deleteProperty (w->id ()); mScreen->freeWindowInterface (w); w = NULL; } void ResizeLogic::getPaintRectangle (BoxPtr pBox) { pBox->x1 = geometry.x - w->border ().left; pBox->y1 = geometry.y - w->border ().top; pBox->x2 = geometry.x + geometry.width + w->serverGeometry ().border () * 2 + w->border ().right; if (w->shaded ()) pBox->y2 = geometry.y + w->size ().height () + w->border ().bottom; else pBox->y2 = geometry.y + geometry.height + w->serverGeometry ().border () * 2 + w->border ().bottom; } void ResizeLogic::getStretchRectangle (BoxPtr pBox) { BoxRec box; float xScale, yScale; getPaintRectangle (&box); w->getResizeInterface ()->getStretchScale (&box, &xScale, &yScale); pBox->x1 = (int) (box.x1 - (w->output ().left - w->border ().left) * xScale); pBox->y1 = (int) (box.y1 - (w->output ().top - w->border ().top) * yScale); pBox->x2 = (int) (box.x2 + w->output ().right * xScale); pBox->y2 = (int) (box.y2 + w->output ().bottom * yScale); } Cursor ResizeLogic::cursorFromResizeMask (unsigned int mask) { Cursor cursor; if (mask & ResizeLeftMask) { if (mask & ResizeDownMask) cursor = downLeftCursor; else if (mask & ResizeUpMask) cursor = upLeftCursor; else cursor = leftCursor; } else if (mask & ResizeRightMask) { if (mask & ResizeDownMask) cursor = downRightCursor; else if (mask & ResizeUpMask) cursor = upRightCursor; else cursor = rightCursor; } else if (mask & ResizeUpMask) { cursor = upCursor; } else { cursor = downCursor; } return cursor; } void ResizeLogic::snapWindowToWorkAreaBoundaries (int &wi, int &he, int &wX, int &wY, int &wWidth, int &wHeight) { int workAreaSnapDistance = 15; /* Check if resized edge(s) are near output work-area boundaries */ foreach (CompOutput &output, mScreen->outputDevs ()) { const CompRect &workArea = output.workArea (); /* if window and work-area intersect in x axis */ if (wX + wWidth > workArea.x () && wX < workArea.x2 ()) { if (mask & ResizeLeftMask) { int dw = workArea.x () - wX; if (0 < dw && dw < workAreaSnapDistance) { wi -= dw; wWidth -= dw; wX += dw; } } else if (mask & ResizeRightMask) { int dw = wX + wWidth - workArea.x2 (); if (0 < dw && dw < workAreaSnapDistance) { wi -= dw; wWidth -= dw; } } } /* if window and work-area intersect in y axis */ if (wY + wHeight > workArea.y () && wY < workArea.y2 ()) { if (mask & ResizeUpMask) { int dh = workArea.y () - wY; if (0 < dh && dh < workAreaSnapDistance) { he -= dh; wHeight -= dh; wY += dh; } } else if (mask & ResizeDownMask) { int dh = wY + wHeight - workArea.y2 (); if (0 < dh && dh < workAreaSnapDistance) { he -= dh; wHeight -= dh; } } } } } void ResizeLogic::setUpMask (int xRoot, int yRoot) { int xDist, yDist; int minPointerOffsetX, minPointerOffsetY; CompWindow::Geometry server = w->serverGeometry (); xDist = xRoot - (server.x () + (server.width () / 2)); yDist = yRoot - (server.y () + (server.height () / 2)); /* decision threshold is 10% of window size */ minPointerOffsetX = MIN (20, server.width () / 10); minPointerOffsetY = MIN (20, server.height () / 10); /* if we reached the threshold in one direction, make the threshold in the other direction smaller so there is a chance that this threshold also can be reached (by diagonal movement) */ if (abs (xDist) > minPointerOffsetX) minPointerOffsetY /= 2; else if (abs (yDist) > minPointerOffsetY) minPointerOffsetX /= 2; if (abs (xDist) > minPointerOffsetX) { if (xDist > 0) mask |= ResizeRightMask; else mask |= ResizeLeftMask; } if (abs (yDist) > minPointerOffsetY) { if (yDist > 0) mask |= ResizeDownMask; else mask |= ResizeUpMask; } /* if the pointer movement was enough to determine a direction, warp the pointer to the appropriate edge and set the right cursor */ if (mask) { Cursor cursor; CompAction *action; int pointerAdjustX = 0; int pointerAdjustY = 0; action = &options->optionGetInitiateKey (); action->setState (action->state () | CompAction::StateTermButton); if (mask & ResizeRightMask) pointerAdjustX = server.x () + server.width () + w->border ().right - xRoot; else if (mask & ResizeLeftMask) pointerAdjustX = server.x () - w->border ().left - xRoot; if (mask & ResizeDownMask) pointerAdjustY = server.y () + server.height () + w->border ().bottom - yRoot; else if (mask & ResizeUpMask) pointerAdjustY = server.y () - w->border ().top - yRoot; mScreen->warpPointer (pointerAdjustX, pointerAdjustY); cursor = cursorFromResizeMask (mask); mScreen->updateGrab (grabIndex, cursor); } } void ResizeLogic::accumulatePointerMotion (int xRoot, int yRoot) { /* only accumulate pointer movement if a mask is already set as we don't have a use for the difference information otherwise */ if (centered || options->optionGetResizeFromCenter ()) { pointerDx += (xRoot - lastPointerX) * 2; pointerDy += (yRoot - lastPointerY) * 2; } else { pointerDx += xRoot - lastPointerX; pointerDy += yRoot - lastPointerY; } /* If we hit the edge of the screen while resizing * the window and the adjacent window edge has not hit * the edge of the screen, then accumulate pointer motion * in the opposite direction. (So the apparant x / y * mixup here is intentional) */ if (isConstrained) { if (mask == ResizeLeftMask) { if (xRoot == 0 && geometry.x - w->border ().left > grabWindowWorkArea->left ()) pointerDx += abs (yRoot - lastPointerY) * -1; } else if (mask == ResizeRightMask) { if (xRoot == mScreen->width () -1 && geometry.x + geometry.width + w->border ().right < grabWindowWorkArea->right ()) pointerDx += abs (yRoot - lastPointerY); } if (mask == ResizeUpMask) { if (yRoot == 0 && geometry.y - w->border ().top > grabWindowWorkArea->top ()) pointerDy += abs (xRoot - lastPointerX) * -1; } else if (mask == ResizeDownMask) { if (yRoot == mScreen->height () -1 && geometry.y + geometry.height + w->border ().bottom < grabWindowWorkArea->bottom ()) pointerDx += abs (yRoot - lastPointerY); } } } void ResizeLogic::constrainToWorkArea (int &che, int &cwi) { if (mask & ResizeUpMask) { int decorTop = savedGeometry.y + savedGeometry.height - (che + w->border ().top); if (grabWindowWorkArea->y () > decorTop) che -= grabWindowWorkArea->y () - decorTop; } if (mask & ResizeDownMask) { int decorBottom = savedGeometry.y + che + w->border ().bottom; if (decorBottom > grabWindowWorkArea->y () + grabWindowWorkArea->height ()) che -= decorBottom - (grabWindowWorkArea->y () + grabWindowWorkArea->height ()); } if (mask & ResizeLeftMask) { int decorLeft = savedGeometry.x + savedGeometry.width - (cwi + w->border ().left); if (grabWindowWorkArea->x () > decorLeft) cwi -= grabWindowWorkArea->x () - decorLeft; } if (mask & ResizeRightMask) { int decorRight = savedGeometry.x + cwi + w->border ().right; if (decorRight > grabWindowWorkArea->x () + grabWindowWorkArea->width ()) cwi -= decorRight - (grabWindowWorkArea->x () + grabWindowWorkArea->width ()); } } void ResizeLogic::limitMovementToConstraintRegion (int &wi, int &he, int xRoot, int yRoot, int wX, int wY, int wWidth, int wHeight) { int minHeight = 50; /* rect. for a minimal height window + borders (used for the constraining in X axis) */ int minimalInputHeight = minHeight + w->border ().top + w->border ().bottom; /* small hot-spot square (on window's corner or edge) that is to be constrained to the combined output work-area region */ int x, y; int width = w->border ().top; /* square size = title bar height */ int height = width; bool status; /* whether or not hot-spot is in the region */ /* compute x & y for constrained hot-spot rect */ if (mask & ResizeLeftMask) x = wX; else if (mask & ResizeRightMask) x = wX + wWidth - width; else x = MIN (MAX (xRoot, wX), wX + wWidth - width); if (mask & ResizeUpMask) y = wY; else if (mask & ResizeDownMask) y = wY + wHeight - height; else y = MIN (MAX (yRoot, wY), wY + wHeight - height); status = constraintRegion.contains (x, y, width, height); /* only constrain movement if previous position was valid */ if (inRegionStatus) { bool xStatus = false; int yForXResize = y; int nx = x; int nw = wi; int nh = he; int minWidth = 50; if (mask & (ResizeLeftMask | ResizeRightMask)) { xStatus = status; if (mask & ResizeUpMask) yForXResize = wY + wHeight - minimalInputHeight; else if (mask & ResizeDownMask) yForXResize = wY + minimalInputHeight - height; else yForXResize = y; if (!constraintRegion.contains (x, yForXResize, width, height)) { if (lastGoodHotSpotY >= 0) yForXResize = lastGoodHotSpotY; else yForXResize = y; } } if (mask & ResizeLeftMask) { while ((nw > minWidth) && !xStatus) { xStatus = constraintRegion.contains (nx, yForXResize, width, height); if (!xStatus) { nw--; nx++; } } if (nw > minWidth) { x = nx; wi = nw; } } else if (mask & ResizeRightMask) { while ((nw > minWidth) && !xStatus) { xStatus = constraintRegion.contains (nx, yForXResize, width, height); if (!xStatus) { nw--; nx--; } } if (nw > minWidth) { x = nx; wi = nw; } } if (mask & ResizeUpMask) { while ((nh > minHeight) && !status) { status = constraintRegion.contains (x, y, width, height); if (!status) { nh--; y++; } } if (nh > minHeight) he = nh; } else if (mask & ResizeDownMask) { while ((nh > minHeight) && !status) { status = constraintRegion.contains (x, y, width, height); if (!status) { nh--; y--; } } if (nh > minHeight) he = nh; } if (((mask & (ResizeLeftMask | ResizeRightMask)) && xStatus) || ((mask & (ResizeUpMask | ResizeDownMask)) && status)) { /* hot-spot inside work-area region, store good values */ lastGoodHotSpotY = y; lastGoodSize = CompSize (wi, he); } else { /* failed to find a good hot-spot position, restore size */ wi = lastGoodSize.width (); he = lastGoodSize.height (); } } else { inRegionStatus = status; } } void ResizeLogic::computeWindowPlusBordersRect (int &wX, int &wY, int &wWidth, int &wHeight, int wi, int he) { wWidth = wi + w->border ().left + w->border ().right; wHeight = he + w->border ().top + w->border ().bottom; if (centered || options->optionGetResizeFromCenter ()) { if (mask & ResizeLeftMask) wX = geometry.x + geometry.width - (wi + w->border ().left); else wX = geometry.x - w->border ().left; if (mask & ResizeUpMask) wY = geometry.y + geometry.height - (he + w->border ().top); else wY = geometry.y - w->border ().top; } else { if (mask & ResizeLeftMask) wX = savedGeometry.x + savedGeometry.width - (wi + w->border ().left); else wX = savedGeometry.x - w->border ().left; if (mask & ResizeUpMask) wY = savedGeometry.y + savedGeometry.height - (he + w->border ().top); else wY = savedGeometry.y - w->border ().top; } } void ResizeLogic::enableOrDisableVerticalMaximization (int yRoot) { /* maximum distance between the pointer and a work area edge (top or bottom) for a vertical maximization */ const int max_edge_distance = 5; if (!options->optionGetMaximizeVertically()) return; if (!offWorkAreaConstrained) return; if (centered || options->optionGetResizeFromCenter ()) { if (maximized_vertically) { geometry = geometryWithoutVertMax; maximized_vertically = false; } } else if (mask & ResizeUpMask) { if (yRoot - grabWindowWorkArea->top() <= max_edge_distance && !maximized_vertically) { maximized_vertically = true; geometryWithoutVertMax = geometry; } else if (yRoot - grabWindowWorkArea->top() > max_edge_distance && maximized_vertically) { geometry = geometryWithoutVertMax; maximized_vertically = false; } } else if (mask & ResizeDownMask) { if (grabWindowWorkArea->bottom() - yRoot <= max_edge_distance && !maximized_vertically) { maximized_vertically = true; geometryWithoutVertMax = geometry; } else if (grabWindowWorkArea->bottom() - yRoot > max_edge_distance && maximized_vertically) { geometry = geometryWithoutVertMax; maximized_vertically = false; } } } void ResizeLogic::computeGeometry(int wi, int he) { XRectangle *regular_geometry; if (maximized_vertically) regular_geometry = &geometryWithoutVertMax; else regular_geometry = &geometry; if (centered || options->optionGetResizeFromCenter ()) { if ((mask & ResizeLeftMask) || (mask & ResizeRightMask)) regular_geometry->x -= ((wi - regular_geometry->width) / 2); if ((mask & ResizeUpMask) || (mask & ResizeDownMask)) regular_geometry->y -= ((he - regular_geometry->height) / 2); } else { if (mask & ResizeLeftMask) regular_geometry->x -= wi - regular_geometry->width; if (mask & ResizeUpMask) regular_geometry->y -= he - regular_geometry->height; } regular_geometry->width = wi; regular_geometry->height = he; if (maximized_vertically) { geometry.x = geometryWithoutVertMax.x; geometry.width = geometryWithoutVertMax.width; geometry.y = grabWindowWorkArea->y() + w->border().top; geometry.height = grabWindowWorkArea->height() - w->border().top - w->border().bottom; } } bool ResizeLogic::initiateResize (CompAction *action, CompAction::State state, CompOption::Vector &options, unsigned int initMode) { CompWindowInterface *w; Window xid; xid = CompOption::getIntOptionNamed (options, "window"); w = mScreen->findWindow (xid); if (w && (w->actions () & CompWindowActionResizeMask)) { int x, y; int button; CompWindow::Geometry server = w->serverGeometry (); x = CompOption::getIntOptionNamed (options, "x", pointerX); y = CompOption::getIntOptionNamed (options, "y", pointerY); button = CompOption::getIntOptionNamed (options, "button", -1); mask = CompOption::getIntOptionNamed (options, "direction"); /* Initiate the resize in the direction suggested by the * sector of the window the mouse is in, eg drag in top left * will resize up and to the left. Keyboard resize starts out * with the cursor in the middle of the window and then starts * resizing the edge corresponding to the next key press. */ if (state & CompAction::StateInitKey) { mask = 0; } else if (!mask) { int sectorSizeX = server.width () / 3; int sectorSizeY = server.height () / 3; int posX = x - server.x (); int posY = y - server.y (); if (posX < sectorSizeX) mask |= ResizeLeftMask; else if (posX > (2 * sectorSizeX)) mask |= ResizeRightMask; if (posY < sectorSizeY) mask |= ResizeUpMask; else if (posY > (2 * sectorSizeY)) mask |= ResizeDownMask; /* if the pointer was in the middle of the window, just prevent input to the window */ if (!mask) { mScreen->freeWindowInterface (w); return true; } } if (mScreen->otherGrabExist ("resize", NULL) || this->w || (w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask | CompWindowTypeFullscreenMask)) || w->overrideRedirect ()) { mScreen->freeWindowInterface (w); return false; } if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (w->shaded ()) mask &= ~(ResizeUpMask | ResizeDownMask); this->w = w; savedGeometry.x = server.x (); savedGeometry.y = server.y (); savedGeometry.width = server.width (); savedGeometry.height = server.height (); geometry = savedGeometry; pointerDx = x - pointerX; pointerDy = y - pointerY; centered |= w->evaluate (this->options->optionGetResizeFromCenterMatch ()); if ((w->state () & MAXIMIZE_STATE) == MAXIMIZE_STATE) { /* if the window is fully maximized, showing the outline or rectangle would be visually distracting as the window can't be resized anyway; so we better don't use them in this case */ mode = ResizeOptions::ModeNormal; } else if (!gScreen || !cScreen || !cScreen->compositingActive ()) { mode = ResizeOptions::ModeNormal; } else { mode = initMode; } if (mode != ResizeOptions::ModeNormal) { if (w->getGLInterface () && mode == ResizeOptions::ModeStretch) w->getGLInterface ()->glPaintSetEnabled (true); if (w->getCompositeInterface () && mode == ResizeOptions::ModeStretch) w->getCompositeInterface ()->damageRectSetEnabled (true); gScreen->glPaintOutputSetEnabled (true); } if (!grabIndex) { Cursor cursor; if (state & CompAction::StateInitKey) cursor = middleCursor; else cursor = cursorFromResizeMask (mask); grabIndex = mScreen->pushGrab (cursor, "resize"); } if (grabIndex) { BoxRec box; unsigned int grabMask = CompWindowGrabResizeMask | CompWindowGrabButtonMask; bool sourceExternalApp = CompOption::getBoolOptionNamed (options, "external", false); if (sourceExternalApp) grabMask |= CompWindowGrabExternalAppMask; releaseButton = button; w->grabNotify (x, y, state, grabMask); /* Click raise happens implicitly on buttons 1, 2 and 3 so don't * restack this window again if the action buttonbinding was from * one of those buttons */ if (mScreen->getOption ("raise_on_click")->value ().b () && button != Button1 && button != Button2 && button != Button3) w->updateAttributes (CompStackingUpdateModeAboveFullscreen); /* using the paint rectangle is enough here as we don't have any stretch yet */ getPaintRectangle (&box); damageRectangle (&box); if (state & CompAction::StateInitKey) { int xRoot, yRoot; xRoot = server.x () + (server.width () / 2); yRoot = server.y () + (server.height () / 2); mScreen->warpPointer (xRoot - pointerX, yRoot - pointerY); } isConstrained = sourceExternalApp; /* Update offWorkAreaConstrained and workArea at grab time */ offWorkAreaConstrained = false; if (sourceExternalApp) { int output = w->outputDevice (); bool sl = mScreen->outputDevs ().at (output).workArea ().left () > w->serverGeometry ().left (); bool sr = mScreen->outputDevs ().at (output).workArea ().right () < w->serverGeometry ().right (); bool st = mScreen->outputDevs ().at (output).workArea ().top () > w->serverGeometry ().top (); bool sb = mScreen->outputDevs ().at (output).workArea ().bottom () < w->serverGeometry ().bottom (); /* Prevent resizing beyond work area edges when resize is initiated externally (e.g. with window frame or menu) and not with a key (e.g. alt+button) */ offWorkAreaConstrained = true; int lco = getOutputForEdge (output, TOUCH_RIGHT, sl); int rco = getOutputForEdge (output, TOUCH_LEFT, sr); int tco = getOutputForEdge (output, TOUCH_BOTTOM, st); int bco = getOutputForEdge (output, TOUCH_TOP, sb); /* Now we need to form one big rect which describes * the available workarea */ int left = mScreen->outputDevs ().at (lco).workArea ().left (); int right = mScreen->outputDevs ().at (rco).workArea ().right (); int top = mScreen->outputDevs ().at (tco).workArea ().top (); int bottom = mScreen->outputDevs ().at (bco).workArea ().bottom (); grabWindowWorkArea.reset (new CompRect (0, 0, 0, 0)); { grabWindowWorkArea->setLeft (left); grabWindowWorkArea->setRight (right); grabWindowWorkArea->setTop (top); grabWindowWorkArea->setBottom (bottom); } inRegionStatus = false; lastGoodHotSpotY = -1; lastGoodSize = w->serverSize (); /* Combine the work areas of all outputs */ constraintRegion = emptyRegion; foreach (CompOutput &output, mScreen->outputDevs ()) constraintRegion += output.workArea (); } } maximized_vertically = false; } else if (w) mScreen->freeWindowInterface (w); return false; } bool ResizeLogic::terminateResize (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (w) { XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int mask = 0; if (mode == ResizeOptions::ModeNormal) { if (state & CompAction::StateCancel) { xwc.x = savedGeometry.x; xwc.y = savedGeometry.y; xwc.width = savedGeometry.width; xwc.height = savedGeometry.height; mask = CWX | CWY | CWWidth | CWHeight; } else if (maximized_vertically) { w->maximize (CompWindowStateMaximizedVertMask); xwc.x = geometry.x; xwc.y = geometry.y; xwc.width = geometry.width; xwc.height = geometry.height; mask = CWX | CWY | CWWidth | CWHeight; /* Once vertically maximized, save the original window y & height * geometry, so restoring the window will result in the correct size */ w->saveWc ().y = savedGeometry.y; w->saveWc ().height = savedGeometry.height + (w->border ().top + w->border ().bottom); w->saveMask () = CWY | CWHeight; } } else { XRectangle finalGeometry; if (state & CompAction::StateCancel) finalGeometry = savedGeometry; else finalGeometry = geometry; if (memcmp (&finalGeometry, &savedGeometry, sizeof (finalGeometry)) == 0) { BoxRec box; if (mode == ResizeOptions::ModeStretch) getStretchRectangle (&box); else getPaintRectangle (&box); damageRectangle (&box); } else { if (maximized_vertically) { w->maximize(CompWindowStateMaximizedVertMask); xwc.x = finalGeometry.x; xwc.width = finalGeometry.width; mask = CWX | CWWidth ; } else { xwc.x = finalGeometry.x; xwc.y = finalGeometry.y; xwc.width = finalGeometry.width; xwc.height = finalGeometry.height; mask = CWX | CWY | CWWidth | CWHeight; } } if (mode != ResizeOptions::ModeNormal) { if (w->getGLInterface () && mode == ResizeOptions::ModeStretch) w->getGLInterface ()->glPaintSetEnabled (false); if (w->getCompositeInterface () && mode == ResizeOptions::ModeStretch) w->getCompositeInterface ()->damageRectSetEnabled (false); gScreen->glPaintOutputSetEnabled (false); } } if ((mask & CWWidth) && xwc.width == (int) w->serverGeometry ().width ()) mask &= ~CWWidth; if ((mask & CWHeight) && xwc.height == (int) w->serverGeometry ().height ()) mask &= ~CWHeight; if (mask) { if (mask & (CWWidth | CWHeight)) w->sendSyncRequest (); w->configureXWindow (mask, &xwc); } finishResizing (); if (grabIndex) { mScreen->removeGrab (grabIndex, NULL); grabIndex = 0; } releaseButton = 0; } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } bool ResizeLogic::initiateResizeDefaultMode (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindowInterface *w; unsigned int mode; w = mScreen->findWindow (CompOption::getIntOptionNamed (options, "window")); if (!w) return false; mode = this->options->optionGetMode (); if (w->evaluate (this->options->optionGetNormalMatch ())) mode = ResizeOptions::ModeNormal; if (w->evaluate (this->options->optionGetOutlineMatch ())) mode = ResizeOptions::ModeOutline; if (w->evaluate (this->options->optionGetRectangleMatch ())) mode = ResizeOptions::ModeRectangle; if (w->evaluate (this->options->optionGetStretchMatch ())) mode = ResizeOptions::ModeStretch; mScreen->freeWindowInterface (w); return initiateResize (action, state, options, mode); } void ResizeLogic::damageRectangle (BoxPtr pBox) { int x1, x2, y1, y2; x1 = pBox->x1 - 1; y1 = pBox->y1 - 1; x2 = pBox->x2 + 1; y2 = pBox->y2 + 1; if (cScreen) cScreen->damageRegion (CompRect (x1, y1, x2 - x1, y2 - y1)); } /* Be a little bit intelligent about how we calculate * the workarea. Basically we want to be enclosed in * any area that is obstructed by panels, but not * where two outputs meet * * Also, it does not make sense to resize over * non-touching outputs, so detect that case too * */ int ResizeLogic::getOutputForEdge (int windowOutput, unsigned int touch, bool skipFirst) { int op, wap; int ret = windowOutput; getPointForTp (touch, windowOutput, op, wap); if ((op == wap) || skipFirst) { int co = windowOutput; do { int oco = co; co = findTouchingOutput (op, touch); /* Could not find a leftmost output from here * so we must have hit the edge of the universe */ if (co == -1) { ret = oco; co = -1; break; } getPointForTp (touch, co, op, wap); /* There is something in the way here.... */ if (op != wap) { ret = co; co = -1; } } while (co != -1); } return ret; } unsigned int ResizeLogic::findTouchingOutput (int touchPoint, unsigned int side) { for (unsigned int i = 0; i < mScreen->outputDevs ().size (); i++) { CompOutput &o = mScreen->outputDevs ().at (i); if (side == TOUCH_LEFT) { if (o.left () == touchPoint) return i; } if (side == TOUCH_RIGHT) { if (o.right () == touchPoint) return i; } if (side == TOUCH_TOP) { if (o.top () == touchPoint) return i; } if (side == TOUCH_BOTTOM) { if (o.bottom () == touchPoint) return i; } } return -1; } void ResizeLogic::getPointForTp (unsigned int tp, unsigned int output, int &op, int &wap) { CompRect og = CompRect (mScreen->outputDevs ().at (output)); CompRect wag = mScreen->outputDevs ().at (output).workArea (); switch (tp) { case TOUCH_LEFT: op = og.right (); wap = wag.right (); break; case TOUCH_RIGHT: op = og.left (); wap = wag.left (); break; case TOUCH_TOP: op = og.bottom (); wap = wag.bottom (); break; case TOUCH_BOTTOM: op = og.top (); wap = wag.top (); break; default: return; } } compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/include/0000755000015301777760000000000012321344021023765 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/include/gl-window-interface.h0000644000015301777760000000275012321343002030005 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_GL_WINDOW_INTERFACE_H #define RESIZE_GL_WINDOW_INTERFACE_H namespace resize { class GLWindowInterface { public: virtual ~GLWindowInterface () {} virtual void glPaintSetEnabled (bool enable) = 0; }; } /* namespace resize */ #endif /* RESIZE_GL_WINDOW_INTERFACE_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/include/gl-screen-interface.h0000644000015301777760000000275012321343002027755 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_GL_SCREEN_INTERFACE #define RESIZE_GL_SCREEN_INTERFACE namespace resize { class GLScreenInterface { public: virtual ~GLScreenInterface () {} virtual void glPaintOutputSetEnabled (bool enable) = 0; }; } /* namespace resize */ #endif /* RESIZE_GL_SCREEN_INTERFACE */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/include/resize-window-interface.h0000644000015301777760000000303012321343002030674 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_RESIZE_WINDOW_INTERFACE_H #define RESIZE_RESIZE_WINDOW_INTERFACE_H namespace resize { class ResizeWindowInterface { public: virtual ~ResizeWindowInterface () {} virtual void getStretchScale (BoxPtr pBox, float *xScale, float *yScale) = 0; }; } /* namespace resize */ #endif /* RESIZE_RESIZE_WINDOW_INTERFACE_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/include/composite-screen-interface.h0000644000015301777760000000306012321343002031350 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_COMPOSITE_SCREEN_INTERFACE #define RESIZE_COMPOSITE_SCREEN_INTERFACE namespace resize { class CompositeScreenInterface { public: virtual ~CompositeScreenInterface () {} virtual bool compositingActive () = 0; virtual void damageRegion (const CompRegion &r) = 0; }; } /* namespace resize */ #endif /* RESIZE_COMPOSITE_SCREEN_INTERFACE */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/include/resize-defs.h0000644000015301777760000000313112321343002026352 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef RESIZEDEFS_H #define RESIZEDEFS_H #define RESIZE_SCREEN(s) ResizeScreen *rs = ResizeScreen::get(s) #define RESIZE_WINDOW(w) ResizeWindow *rw = ResizeWindow::get(w) #define ResizeUpMask (1L << 0) #define ResizeDownMask (1L << 1) #define ResizeLeftMask (1L << 2) #define ResizeRightMask (1L << 3) #define NUM_KEYS 4 #define MIN_KEY_WIDTH_INC 24 #define MIN_KEY_HEIGHT_INC 24 #endif /* RESIZEDEFS_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/include/screen-interface.h0000644000015301777760000000467312321343002027363 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_SCREEN_INTERFACE_H #define RESIZE_SCREEN_INTERFACE_H #include namespace resize { class CompWindowInterface; /* * Interface between a concrete CompScreen * and ResizeLogic. * * An enabler for having ResizeLogic testable. */ class CompScreenInterface { public: virtual ~CompScreenInterface () {} virtual Window root () = 0; virtual CompWindowInterface * findWindow (Window id) = 0; virtual void freeWindowInterface (CompWindowInterface *) {} virtual int xkbEvent () = 0; virtual void handleEvent (XEvent *event) = 0; virtual int syncEvent () = 0; virtual Display * dpy () = 0; virtual void warpPointer (int dx, int dy) = 0; virtual CompOutput::vector & outputDevs () = 0; virtual bool otherGrabExist (const char *, void *) = 0; virtual void updateGrab (CompScreen::GrabHandle handle, Cursor cursor) = 0; virtual CompScreen::GrabHandle pushGrab (Cursor cursor, const char *name) = 0; virtual void removeGrab (CompScreen::GrabHandle handle, CompPoint *restorePointer) = 0; /* CompOption::Class */ virtual CompOption * getOption (const CompString &name) = 0; /* CompSize */ virtual int width () const = 0; virtual int height () const = 0; }; } /* namespace resize */ #endif /* RESIZE_SCREEN_INTERFACE_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/include/resize-logic.h0000644000015301777760000001163712321343002026540 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: David Reveman * Daniel d'Andrada */ #ifndef RESIZELOGIC_H #define RESIZELOGIC_H #include #include #include #include #include "resize-defs.h" class ResizeOptions; class CompositeScreen; class GLScreen; namespace resize { class CompWindowInterface; class CompScreenInterface; class CompositeScreenInterface; class GLScreenInterface; class PropertyWriterInterface; } class ResizeLogic { public: ResizeLogic(); virtual ~ResizeLogic(); void handleEvent (XEvent *event); void getPaintRectangle (BoxPtr pBox); void getStretchRectangle (BoxPtr pBox); void finishResizing (); Cursor cursorFromResizeMask (unsigned int mask); void damageRectangle (BoxPtr pBox); bool initiateResize (CompAction *action, CompAction::State state, CompOption::Vector &options, unsigned int mode); bool terminateResize (CompAction *action, CompAction::State state, CompOption::Vector &options); bool initiateResizeDefaultMode (CompAction *action, CompAction::State state, CompOption::Vector &options); resize::CompScreenInterface *mScreen; struct _ResizeKeys { const char *name; int dx; int dy; unsigned int warpMask; unsigned int resizeMask; } rKeys[NUM_KEYS]; Atom resizeNotifyAtom; resize::PropertyWriterInterface *resizeInformationAtom; resize::CompWindowInterface *w; int mode; bool centered; XRectangle savedGeometry; XRectangle geometry; /* geometry without the vertical maximization. Its value is undefined when maximized_vertically == false */ XRectangle geometryWithoutVertMax; bool maximized_vertically; int outlineMask; int rectangleMask; int stretchMask; int centeredMask; int releaseButton; unsigned int mask; int pointerDx; int pointerDy; KeyCode key[NUM_KEYS]; CompScreen::GrabHandle grabIndex; Cursor leftCursor; Cursor rightCursor; Cursor upCursor; Cursor upLeftCursor; Cursor upRightCursor; Cursor downCursor; Cursor downLeftCursor; Cursor downRightCursor; Cursor middleCursor; Cursor cursor[NUM_KEYS]; bool isConstrained; CompRegion constraintRegion; bool inRegionStatus; int lastGoodHotSpotY; CompSize lastGoodSize; bool offWorkAreaConstrained; boost::shared_ptr grabWindowWorkArea; ResizeOptions *options; resize::CompositeScreenInterface *cScreen; resize::GLScreenInterface *gScreen; private: void handleKeyEvent (KeyCode keycode); void handleMotionEvent (int xRoot, int yRoot); void sendResizeNotify (); void updateWindowSize (); void updateWindowProperty (); /* Helper functions for handleMotionEvent() */ void snapWindowToWorkAreaBoundaries (int &wi, int &he, int &wX, int &wY, int &wWidth, int &wHeight); void setUpMask (int xRoot, int yRoot); void accumulatePointerMotion (int xRoot, int yRoot); void constrainToWorkArea (int &che, int &cwi); void limitMovementToConstraintRegion (int &wi, int &he, int xRoot, int yRoot, int wX, int wY, int wWidth, int wHeight); void computeWindowPlusBordersRect (int &wX, int &wY, int &wWidth, int &wHeight, int wi, int he); void enableOrDisableVerticalMaximization (int yRoot); void computeGeometry (int wi, int he); int getOutputForEdge (int windowOutput, unsigned int touch, bool skipFirst); unsigned int findTouchingOutput (int touchPoint, unsigned int side); void getPointForTp (unsigned int tp, unsigned int output, int &op, int &wap); }; #endif /* RESIZELOGIC_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/include/property-writer-interface.h0000644000015301777760000000341512321343002031273 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_PROPERTY_WRITER_INTERFACE_H #define RESIZE_PROPERTY_WRITER_INTERFACE_H namespace resize { class PropertyWriterInterface { public: virtual ~PropertyWriterInterface() {} virtual bool updateProperty (Window, CompOption::Vector &, int) = 0; virtual void deleteProperty (Window) = 0; virtual const CompOption::Vector & readProperty (Window) = 0; virtual void setReadTemplate (const CompOption::Vector &) = 0; virtual const CompOption::Vector & getReadTemplate () = 0; }; } /* namespace resize */ #endif /* RESIZE_PROPERTY_WRITER_INTERFACE_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/include/window-interface.h0000644000015301777760000000617312321343002027410 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_WINDOW_INTERFACE #define RESIZE_WINDOW_INTERFACE #include namespace resize { class ResizeWindowInterface; class GLWindowInterface; class CompositeWindowInterface; /* * Interface between a concrete CompWindow * and ResizeLogic. * * An enabler for having ResizeLogic testable. */ class CompWindowInterface { public: virtual ~CompWindowInterface () {} virtual Window id () = 0; virtual CompRect outputRect () const = 0; virtual XSyncAlarm syncAlarm () = 0; virtual XSizeHints & sizeHints () const = 0; virtual const CompWindow::Geometry & serverGeometry () const = 0; virtual const CompWindowExtents & border () const = 0; virtual const CompWindowExtents & output () const = 0; virtual bool constrainNewWindowSize (int width, int height, int *newWidth, int *newHeight) = 0; virtual bool syncWait () = 0; virtual void sendSyncRequest () = 0; virtual void configureXWindow (unsigned int valueMask, XWindowChanges *xwc) = 0; virtual void grabNotify (int x, int y, unsigned int state, unsigned int mask) = 0; virtual void ungrabNotify () = 0; virtual bool shaded () = 0; virtual CompSize size () const = 0; virtual unsigned int actions () = 0; virtual unsigned int type () = 0; virtual unsigned int & state () = 0; virtual bool overrideRedirect () = 0; virtual void updateAttributes (CompStackingUpdateMode stackingMode) = 0; virtual int outputDevice () = 0; virtual const CompSize serverSize () const = 0; virtual void maximize (unsigned int state = 0) = 0; virtual XWindowChanges & saveWc () = 0; virtual int & saveMask () = 0; /* equivalent of CompMatch::evaluate */ virtual bool evaluate (CompMatch &match) = 0; virtual ResizeWindowInterface *getResizeInterface () = 0; virtual GLWindowInterface *getGLInterface () = 0; virtual CompositeWindowInterface *getCompositeInterface () = 0; }; } /* namespace resize */ #endif /* RESIZE_WINDOW_INTERFACE */ compiz-0.9.11+14.04.20140409/plugins/resize/src/logic/include/composite-window-interface.h0000644000015301777760000000301612321343002031401 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_COMPOSITE_WINDOW_INTERFACE_H #define RESIZE_COMPOSITE_WINDOW_INTERFACE_H namespace resize { class CompositeWindowInterface { public: virtual ~CompositeWindowInterface () {} virtual void damageRectSetEnabled (bool enable) = 0; }; } /* namespace resize */ #endif /* RESIZE_COMPOSITE_WINDOW_INTERFACE_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/resize.cpp0000644000015301777760000003502112321343002023251 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include "resize.h" #include "window-impl.h" #include "property-writer-impl.h" #include "resize-window-impl.h" #include "screen-impl.h" #include "gl-screen-impl.h" #include "composite-screen-impl.h" COMPIZ_PLUGIN_20090315 (resize, ResizePluginVTable) void ResizeScreen::handleEvent (XEvent *event) { logic.handleEvent(event); } void ResizeWindow::getStretchScale (BoxPtr pBox, float *xScale, float *yScale) { CompRect rect (window->borderRect ()); *xScale = (rect.width ()) ? (pBox->x2 - pBox->x1) / (float) rect.width () : 1.0f; *yScale = (rect.height ()) ? (pBox->y2 - pBox->y1) / (float) rect.height () : 1.0f; } static bool resizeInitiateDefaultMode (CompAction *action, CompAction::State state, CompOption::Vector &options) { RESIZE_SCREEN (screen); return rs->logic.initiateResizeDefaultMode(action, state, options); } static bool resizeTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { RESIZE_SCREEN (screen); return rs->logic.terminateResize(action, state, options); } void ResizeScreen::glPaintRectangle (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, unsigned short *borderColor, unsigned short *fillColor) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); BoxRec box; GLMatrix sTransform (transform); GLfloat vertexData [12]; GLfloat vertexData2[24]; GLint origSrc, origDst; GLushort fc[4], bc[4]; #ifdef USE_GLES GLint origSrcAlpha, origDstAlpha; glGetIntegerv (GL_BLEND_SRC_RGB, &origSrc); glGetIntegerv (GL_BLEND_DST_RGB, &origDst); glGetIntegerv (GL_BLEND_SRC_ALPHA, &origSrcAlpha); glGetIntegerv (GL_BLEND_DST_ALPHA, &origDstAlpha); #else glGetIntegerv (GL_BLEND_SRC, &origSrc); glGetIntegerv (GL_BLEND_DST, &origDst); #endif /* Premultiply the alpha values */ bc[3] = (float) borderColor[3] / (float) 65535.0f; bc[0] = ((float) borderColor[0] / 65535.0f) * bc[3]; bc[1] = ((float) borderColor[1] / 65535.0f) * bc[3]; bc[2] = ((float) borderColor[2] / 65535.0f) * bc[3]; logic.getPaintRectangle (&box); vertexData[0] = box.x1; vertexData[1] = box.y1; vertexData[2] = 0.0f; vertexData[3] = box.x1; vertexData[4] = box.y2; vertexData[5] = 0.0f; vertexData[6] = box.x2; vertexData[7] = box.y1; vertexData[8] = 0.0f; vertexData[9] = box.x2; vertexData[10] = box.y2; vertexData[11] = 0.0f; // FIXME: this is a quick work-around. // GL_LINE_LOOP and GL_LINE_STRIP primitive types in the SGX Pvr X11 driver // take special number of vertices (and reorder them). Thus, usage of // those line primitive is currently not supported by our GLVertexBuffer // implementation. This is a quick workaround to make it all work until // we come up with a better GLVertexBuffer::render(...) function. vertexData2[0] = box.x1; vertexData2[1] = box.y1; vertexData2[2] = 0.0f; vertexData2[3] = box.x1; vertexData2[4] = box.y2; vertexData2[5] = 0.0f; vertexData2[6] = box.x1; vertexData2[7] = box.y2; vertexData2[8] = 0.0f; vertexData2[9] = box.x2; vertexData2[10] = box.y2; vertexData2[11] = 0.0f; vertexData2[12] = box.x2; vertexData2[13] = box.y2; vertexData2[14] = 0.0f; vertexData2[15] = box.x2; vertexData2[16] = box.y1; vertexData2[17] = 0.0f; vertexData2[18] = box.x2; vertexData2[19] = box.y1; vertexData2[20] = 0.0f; vertexData2[21] = box.x1; vertexData2[22] = box.y1; vertexData2[23] = 0.0f; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glEnable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); /* fill rectangle */ if (fillColor) { fc[3] = fillColor[3]; fc[0] = fillColor[0] * (unsigned long)fc[3] / 65535; fc[1] = fillColor[1] * (unsigned long)fc[3] / 65535; fc[2] = fillColor[2] * (unsigned long)fc[3] / 65535; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, fc); streamingBuffer->addVertices (4, &vertexData[0]); streamingBuffer->end (); streamingBuffer->render (sTransform); } /* draw outline */ static const int borderWidth = 2; glLineWidth (borderWidth); streamingBuffer->begin (GL_LINES); streamingBuffer->addColors (1, borderColor); streamingBuffer->addVertices (8, &vertexData2[0]); streamingBuffer->end (); streamingBuffer->render (sTransform); glDisable (GL_BLEND); #ifdef USE_GLES glBlendFuncSeparate (origSrc, origDst, origSrcAlpha, origDstAlpha); #else glBlendFunc (origSrc, origDst); #endif CompositeScreen *cScreen = CompositeScreen::get (screen); CompRect damage (box.x1 - borderWidth, box.y1 - borderWidth, box.x2 - box.x1 + 2 * borderWidth, box.y2 - box.y1 + 2 * borderWidth); cScreen->damageRegion (damage); } bool ResizeScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (logic.w && logic.mode == ResizeOptions::ModeStretch) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; bool status = gScreen->glPaintOutput (sAttrib, transform, region, output, mask); if (status && logic.w) { unsigned short *border, *fill; border = optionGetBorderColor (); fill = optionGetFillColor (); switch (logic.mode) { case ResizeOptions::ModeOutline: glPaintRectangle (sAttrib, transform, output, border, NULL); break; case ResizeOptions::ModeRectangle: glPaintRectangle (sAttrib, transform, output, border, fill); break; default: break; } } return status; } bool ResizeWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; if (window == static_cast(rScreen->logic.w)->impl () && rScreen->logic.mode == ResizeOptions::ModeStretch) { GLMatrix wTransform (transform); BoxRec box; float xScale, yScale; if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) return false; status = gWindow->glPaint (attrib, transform, region, mask | PAINT_WINDOW_NO_CORE_INSTANCE_MASK); GLWindowPaintAttrib lastAttrib (gWindow->lastPaintAttrib ()); if (window->alpha () || lastAttrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; rScreen->logic.getPaintRectangle (&box); getStretchScale (&box, &xScale, &yScale); int x = window->geometry (). x (); int y = window->geometry (). y (); float xOrigin = x - window->border ().left; float yOrigin = y - window->border ().top; wTransform.translate (xOrigin, yOrigin, 0.0f); wTransform.scale (xScale, yScale, 1.0f); wTransform.translate ((rScreen->logic.geometry.x - x) / xScale - xOrigin, (rScreen->logic.geometry.y - y) / yScale - yOrigin, 0.0f); gWindow->glDraw (wTransform, lastAttrib, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); } else status = gWindow->glPaint (attrib, transform, region, mask); return status; } bool ResizeWindow::damageRect (bool initial, const CompRect &rect) { bool status = false; if (window == static_cast(rScreen->logic.w)->impl () && rScreen->logic.mode == ResizeOptions::ModeStretch) { BoxRec box; rScreen->logic.getStretchRectangle (&box); rScreen->logic.damageRectangle (&box); status = true; } status |= cWindow->damageRect (initial, rect); return status; } /* We have to make some assumptions here in order to do this neatly, * see build/generated/resize_options.h for more info */ #define ResizeModeShiftMask (1 << 0) #define ResizeModeAltMask (1 << 1) #define ResizeModeControlMask (1 << 2) #define ResizeModeMetaMask (1 << 3) void ResizeScreen::resizeMaskValueToKeyMask (int valueMask, int *mask) { if (valueMask & ResizeModeShiftMask) *mask |= ShiftMask; if (valueMask & ResizeModeAltMask) *mask |= CompAltMask; if (valueMask & ResizeModeControlMask) *mask |= ControlMask; if (valueMask & ResizeModeMetaMask) *mask |= CompMetaMask; } void ResizeScreen::optionChanged (CompOption *option, ResizeOptions::Options num) { int *mask = NULL; int valueMask = 0; switch (num) { case ResizeOptions::OutlineModifier: mask = &logic.outlineMask; valueMask = optionGetOutlineModifierMask (); break; case ResizeOptions::RectangleModifier: mask = &logic.rectangleMask; valueMask = optionGetRectangleModifierMask (); break; case ResizeOptions::StretchModifier: mask = &logic.stretchMask; valueMask = optionGetStretchModifierMask (); break; case ResizeOptions::CenteredModifier: mask = &logic.centeredMask; valueMask = optionGetCenteredModifierMask (); break; default: break; } if (mask) resizeMaskValueToKeyMask (valueMask, mask); } ResizeScreen::ResizeScreen (CompScreen *s) : PluginClassHandler (s), gScreen (GLScreen::get (s)) { logic.mScreen = new resize::CompScreenImpl (screen); logic.cScreen = resize::CompositeScreenImpl::wrap (CompositeScreen::get (s)); logic.gScreen = resize::GLScreenImpl::wrap (gScreen); logic.options = this; CompOption::Vector atomTemplate; Display *dpy = s->dpy (); ResizeOptions::ChangeNotify notify = boost::bind (&ResizeScreen::optionChanged, this, _1, _2); atomTemplate.resize (4); for (int i = 0; i < 4; i++) { char buf[4]; snprintf (buf, 4, "%i", i); CompString tmpName (buf); atomTemplate.at (i).setName (tmpName, CompOption::TypeInt); } logic.resizeNotifyAtom = XInternAtom (s->dpy (), "_COMPIZ_RESIZE_NOTIFY", 0); logic.resizeInformationAtom = new resize::PropertyWriterImpl ( new PropertyWriter ("_COMPIZ_RESIZE_INFORMATION", atomTemplate)); for (unsigned int i = 0; i < NUM_KEYS; i++) logic.key[i] = XKeysymToKeycode (s->dpy (), XStringToKeysym (logic.rKeys[i].name)); logic.leftCursor = XCreateFontCursor (dpy, XC_left_side); logic.rightCursor = XCreateFontCursor (dpy, XC_right_side); logic.upCursor = XCreateFontCursor (dpy, XC_top_side); logic.upLeftCursor = XCreateFontCursor (dpy, XC_top_left_corner); logic.upRightCursor = XCreateFontCursor (dpy, XC_top_right_corner); logic.downCursor = XCreateFontCursor (dpy, XC_bottom_side); logic.downLeftCursor = XCreateFontCursor (dpy, XC_bottom_left_corner); logic.downRightCursor = XCreateFontCursor (dpy, XC_bottom_right_corner); logic.middleCursor = XCreateFontCursor (dpy, XC_fleur); logic.cursor[0] = logic.leftCursor; logic.cursor[1] = logic.rightCursor; logic.cursor[2] = logic.upCursor; logic.cursor[3] = logic.downCursor; optionSetInitiateKeyInitiate (resizeInitiateDefaultMode); optionSetInitiateKeyTerminate (resizeTerminate); optionSetInitiateButtonInitiate (resizeInitiateDefaultMode); optionSetInitiateButtonTerminate (resizeTerminate); optionSetOutlineModifierNotify (notify); optionSetRectangleModifierNotify (notify); optionSetStretchModifierNotify (notify); optionSetCenteredModifierNotify (notify); resizeMaskValueToKeyMask (optionGetOutlineModifierMask (), &logic.outlineMask); resizeMaskValueToKeyMask (optionGetRectangleModifierMask (), &logic.rectangleMask); resizeMaskValueToKeyMask (optionGetStretchModifierMask (), &logic.stretchMask); resizeMaskValueToKeyMask (optionGetCenteredModifierMask (), &logic.centeredMask); ScreenInterface::setHandler (s); if (gScreen) GLScreenInterface::setHandler (gScreen, false); } ResizeScreen::~ResizeScreen () { Display *dpy = screen->dpy (); if (logic.leftCursor) XFreeCursor (dpy, logic.leftCursor); if (logic.rightCursor) XFreeCursor (dpy, logic.rightCursor); if (logic.upCursor) XFreeCursor (dpy, logic.upCursor); if (logic.downCursor) XFreeCursor (dpy, logic.downCursor); if (logic.middleCursor) XFreeCursor (dpy, logic.middleCursor); if (logic.upLeftCursor) XFreeCursor (dpy, logic.upLeftCursor); if (logic.upRightCursor) XFreeCursor (dpy, logic.upRightCursor); if (logic.downLeftCursor) XFreeCursor (dpy, logic.downLeftCursor); if (logic.downRightCursor) XFreeCursor (dpy, logic.downRightCursor); delete logic.mScreen; delete logic.cScreen; delete logic.gScreen; delete logic.resizeInformationAtom; } ResizeWindow::ResizeWindow (CompWindow *w) : PluginClassHandler (w), window (w), gWindow (GLWindow::get (w)), cWindow (CompositeWindow::get (w)), rScreen (ResizeScreen::get (screen)) { WindowInterface::setHandler (window); if (cWindow) CompositeWindowInterface::setHandler (cWindow, false); if (gWindow) GLWindowInterface::setHandler (gWindow, false); } ResizeWindow::~ResizeWindow () { } bool ResizePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/resize/src/property-writer-impl.h0000644000015301777760000000423712321343002025557 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_PROPERTY_WRITER_IMPL_H #define RESIZE_PROPERTY_WRITER_IMPL_H #include "core/propertywriter.h" #include "property-writer-interface.h" namespace resize { class PropertyWriterImpl : public PropertyWriterInterface { public: PropertyWriterImpl (PropertyWriter *impl) : mImpl (impl) {} virtual ~PropertyWriterImpl() {delete mImpl;} virtual bool updateProperty (Window w, CompOption::Vector &v, int i) { return mImpl->updateProperty (w, v, i); } virtual void deleteProperty (Window w) { mImpl->deleteProperty (w); } virtual const CompOption::Vector & readProperty (Window w) { return mImpl->readProperty (w); } virtual void setReadTemplate (const CompOption::Vector &v) { mImpl->setReadTemplate (v); } virtual const CompOption::Vector & getReadTemplate () { return mImpl->getReadTemplate (); } PropertyWriter* mImpl; }; } /* namespace resize */ #endif /* RESIZE_PROPERTY_WRITER_IMPL_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/screen-impl.h0000644000015301777760000000601012321343002023627 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_SCREEN_IMPL #define RESIZE_SCREEN_IMPL #include "screen-interface.h" #include "window-impl.h" #include namespace resize { class CompScreenImpl : public CompScreenInterface { public: CompScreenImpl (CompScreen *impl) : mImpl (impl) { } virtual Window root () { return mImpl->root (); } virtual CompWindowInterface * findWindow (Window id) { return CompWindowImpl::wrap (mImpl->findWindow (id)); } virtual void freeWindowInterface (CompWindowInterface *i) { CompWindowImpl::unwrap (i); } virtual int xkbEvent () { return mImpl->xkbEvent (); } virtual void handleEvent (XEvent *event) { mImpl->handleEvent (event); } virtual int syncEvent () { return mImpl->syncEvent (); } virtual Display * dpy () { return mImpl->dpy (); } virtual void warpPointer (int dx, int dy) { mImpl->warpPointer (dx, dy); } virtual CompOutput::vector & outputDevs () { return mImpl->outputDevs (); } virtual bool otherGrabExist (const char *n, void *o) { return mImpl->otherGrabExist (n, o); } virtual void updateGrab (CompScreen::GrabHandle handle, Cursor cursor) { mImpl->updateGrab (handle, cursor); } virtual CompScreen::GrabHandle pushGrab (Cursor cursor, const char *name) { return mImpl->pushGrab (cursor, name); } virtual void removeGrab (CompScreen::GrabHandle handle, CompPoint *restorePointer) { mImpl->removeGrab (handle, restorePointer); } /* CompOption::Class */ virtual CompOption * getOption (const CompString &name) { return mImpl->getOption (name); } /* CompSize */ virtual int width () const { return mImpl->width (); } virtual int height () const { return mImpl->height (); } private: CompScreen *mImpl; }; } /* namespace resize */ #endif /* RESIZE_SCREEN_IMPL */ compiz-0.9.11+14.04.20140409/plugins/resize/src/gl-screen-impl.h0000644000015301777760000000351512321343002024236 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_GL_SCREEN_IMPL #define RESIZE_GL_SCREEN_IMPL #include "gl-screen-interface.h" #include namespace resize { class GLScreenImpl : public GLScreenInterface { public: GLScreenImpl (GLScreen *impl) : mImpl (impl) { } virtual ~GLScreenImpl() {} virtual void glPaintOutputSetEnabled (bool enable) { mImpl->glPaintOutputSetEnabled(ResizeScreen::get(screen), enable); } static GLScreenImpl *wrap (GLScreen *impl) { if (impl) return new GLScreenImpl (impl); else return NULL; } private: GLScreen *mImpl; }; } /* namespace resize */ #endif /* RESIZE_GL_SCREEN_INTERFACE */ compiz-0.9.11+14.04.20140409/plugins/resize/src/composite-screen-impl.h0000644000015301777760000000372512321343002025641 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_COMPOSITE_SCREEN_IMPL_H #define RESIZE_COMPOSITE_SCREEN_IMPL_H #include "composite-screen-interface.h" #include namespace resize { class CompositeScreenImpl : public CompositeScreenInterface { public: CompositeScreenImpl (CompositeScreen *impl) : mImpl (impl) { } virtual ~CompositeScreenImpl() {} virtual bool compositingActive () { return mImpl->compositingActive (); } virtual void damageRegion (const CompRegion &r) { mImpl->damageRegion (r); } static CompositeScreenImpl *wrap (CompositeScreen *impl) { if (impl) return new CompositeScreenImpl (impl); else return NULL; } private: CompositeScreen *mImpl; }; } /* namespace resize */ #endif /* RESIZE_COMPOSITE_SCREEN_IMPL_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/window-impl.h0000644000015301777760000001163412321343002023667 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_WINDOW_IMPL_H #define RESIZE_WINDOW_IMPL_H #include #include "window-interface.h" #include "resize-window-impl.h" #include "gl-window-impl.h" #include "composite-window-impl.h" namespace resize { class CompWindowImpl : public CompWindowInterface { public: CompWindowImpl (CompWindow *impl) : mImpl (impl) { mResizeImpl = ResizeWindowImpl::wrap(ResizeWindow::get (impl)); mGLImpl = GLWindowImpl::wrap(GLWindow::get (impl)); if (mGLImpl) mGLImpl->resizeWindow = ResizeWindow::get (impl); mCompositeImpl = CompositeWindowImpl::wrap(CompositeWindow::get (impl)); if (mCompositeImpl) mCompositeImpl->resizeWindow = ResizeWindow::get (impl); } virtual ~CompWindowImpl () { delete mResizeImpl; delete mGLImpl; delete mCompositeImpl; } CompWindow *impl() { return mImpl; } static CompWindowImpl *wrap (CompWindow *impl) { if (impl) return new CompWindowImpl (impl); else return NULL; } static void unwrap (CompWindowInterface *i) { delete i; } virtual Window id () { return mImpl->id (); } virtual CompRect outputRect () const { return mImpl->outputRect (); } virtual XSyncAlarm syncAlarm () { return mImpl->syncAlarm (); } virtual XSizeHints & sizeHints () const { return mImpl->sizeHints (); } virtual const CompWindow::Geometry & serverGeometry () const { return mImpl->serverGeometry (); } virtual const CompWindowExtents & border () const { return mImpl->border (); } virtual const CompWindowExtents & output () const { return mImpl->output (); } virtual bool constrainNewWindowSize (int width, int height, int *newWidth, int *newHeight) { return mImpl->constrainNewWindowSize (width, height, newWidth, newHeight); } virtual bool syncWait () { return mImpl->syncWait (); } virtual void sendSyncRequest () { mImpl->sendSyncRequest (); } virtual void configureXWindow (unsigned int valueMask, XWindowChanges *xwc) { mImpl->configureXWindow (valueMask, xwc); } virtual void grabNotify (int x, int y, unsigned int state, unsigned int mask) { mImpl->grabNotify (x, y, state, mask); } virtual void ungrabNotify () { mImpl->ungrabNotify (); } virtual bool shaded () { return mImpl->shaded (); } virtual CompSize size () const { return mImpl->size (); } virtual unsigned int actions () { return mImpl->actions (); } virtual unsigned int type () { return mImpl->type (); } virtual unsigned int & state () { return mImpl->state (); } virtual bool overrideRedirect () { return mImpl->overrideRedirect (); } virtual void updateAttributes (CompStackingUpdateMode stackingMode) { mImpl->updateAttributes (stackingMode); } virtual int outputDevice () { return mImpl->outputDevice (); } virtual const CompSize serverSize () const { return mImpl->serverSize (); } virtual void maximize (unsigned int state = 0) { mImpl->maximize (state); } virtual XWindowChanges & saveWc () { return mImpl->saveWc (); } virtual int & saveMask () { return mImpl->saveMask (); } virtual bool evaluate (CompMatch &match) { return match.evaluate (mImpl); } virtual ResizeWindowInterface *getResizeInterface () { return mResizeImpl; } virtual GLWindowInterface *getGLInterface () { return mGLImpl; } virtual CompositeWindowInterface *getCompositeInterface () { return mCompositeImpl; } private: CompWindow *mImpl; ResizeWindowImpl *mResizeImpl; GLWindowImpl *mGLImpl; CompositeWindowImpl *mCompositeImpl; }; } /* namespace resize */ #endif /* RESIZE_WINDOW_IMPL_H */ compiz-0.9.11+14.04.20140409/plugins/resize/src/resize-window-impl.h0000644000015301777760000000357512321343002025173 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_RESIZE_WINDOW_IMPL_H #define RESIZE_RESIZE_WINDOW_IMPL_H #include "resize-window-interface.h" namespace resize { class ResizeWindowImpl : public ResizeWindowInterface { public: ResizeWindowImpl (ResizeWindow *impl) : mImpl (impl) { } ResizeWindow *impl() { return mImpl; } static ResizeWindowImpl *wrap (ResizeWindow *impl) { if (impl) return new ResizeWindowImpl (impl); else return NULL; } virtual void getStretchScale (BoxPtr pBox, float *xScale, float *yScale) { return mImpl->getStretchScale(pBox, xScale, yScale); } private: ResizeWindow *mImpl; }; } /* namespace resize */ #endif /* RESIZE_RESIZE_WINDOW_IMPL_H */ compiz-0.9.11+14.04.20140409/plugins/CMakeLists.txt0000644000015301777760000000224612321343002021717 0ustar pbusernogroup00000000000000set (COMPIZ_CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${COMPIZ_CMAKE_MODULE_PATH}) include (CompizDefaults) include (CompizCommon) set (COMPIZ_FOUND "true") add_definitions ( -DHAVE_CONFIG_H) include_directories (${COMPIZ_INTERNAL_INCLUDES}) # temporarily disable plugins that aren't ported yet set (COMPIZ_DISABLE_PLUGIN_ANIMATIONADDON ON) set (COMPIZ_DISABLE_PLUGIN_BICUBIC ON) set (COMPIZ_DISABLE_PLUGIN_BLUR ON) set (COMPIZ_DISABLE_PLUGIN_COLORFILTER ON) set (COMPIZ_DISABLE_PLUGIN_GROUP ON) set (COMPIZ_DISABLE_PLUGIN_LOGINOUT ON) set (COMPIZ_DISABLE_PLUGIN_REFLEX ON) set (COMPIZ_DISABLE_PLUGIN_STACKSWITCH ON) set (COMPIZ_DISABLE_PLUGIN_TRIP ON) # disable plugins which won't work on ES2 builds if (BUILD_GLES) set (COMPIZ_DISABLE_PLUGIN_FREEWINS ON) set (COMPIZ_DISABLE_PLUGIN_GEARS ON) set (COMPIZ_DISABLE_PLUGIN_TD ON) set (COMPIZ_DISABLE_PLUGIN_COLORFILTER ON) set (COMPIZ_DISABLE_PLUGIN_MBLUR ON) set (COMPIZ_DISABLE_PLUGIN_BENCH ON) set (COMPIZ_DISABLE_PLUGIN_WIDGET ON) set (COMPIZ_DISABLE_PLUGIN_THUMBNAIL ON) endif (BUILD_GLES) compiz_add_plugins_in_folder (${CMAKE_CURRENT_SOURCE_DIR}) compiz-0.9.11+14.04.20140409/plugins/fadedesktop/0000755000015301777760000000000012321344021021446 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/fadedesktop/fadedesktop.xml.in0000644000015301777760000000173612321343002025073 0ustar pbusernogroup00000000000000 <_short>Fade to Desktop <_long>Easily access your desktop Desktop opengl fade composite opengl decor showdesktop fadetodesktop compiz-0.9.11+14.04.20140409/plugins/fadedesktop/CMakeLists.txt0000644000015301777760000000016012321343002024201 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (fadedesktop PLUGINDEPS opengl composite) compiz-0.9.11+14.04.20140409/plugins/fadedesktop/src/0000755000015301777760000000000012321344021022235 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/fadedesktop/src/fadedesktop.cpp0000644000015301777760000001261512321343002025235 0ustar pbusernogroup00000000000000/** * * Compiz fade to desktop plugin * * fadedesktop.cpp * * Copyright (c) 2006 Robert Carr * 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "fadedesktop.h" COMPIZ_PLUGIN_20090315 (fadedesktop, FadedesktopPluginVTable); void FadedesktopScreen::activateEvent (bool activating) { CompOption::Vector o; o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("active", CompOption::TypeBool)); o[0].value (). set ((int) screen->root ()); o[1].value (). set (activating); screen->handleCompizEvent ("fadedesktop", "activate", o); } bool FadedesktopWindow::isFadedesktopWindow () { FD_SCREEN (screen); if (!window->managed ()) return false; if (window->grabbed ()) return false; if (window->wmType () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) return false; if (window->state () & CompWindowStateSkipPagerMask) return false; if (!fs->optionGetWindowMatch ().evaluate (window)) return false; return true; } void FadedesktopScreen::preparePaint (int msSinceLastPaint) { fadeTime -= msSinceLastPaint; if (fadeTime < 0) fadeTime = 0; if (state == Out || state == In) { foreach (CompWindow *w, screen->windows ()) { bool doFade; FD_WINDOW (w); if (state == Out) doFade = fw->fading && w->inShowDesktopMode (); else doFade = fw->fading && !w->inShowDesktopMode (); if (doFade) { float windowFadeTime; if (state == Out) windowFadeTime = fadeTime; else windowFadeTime = optionGetFadetime () - fadeTime; fw->opacity = fw->cWindow->opacity () * (windowFadeTime / optionGetFadetime ()); } } } cScreen->preparePaint (msSinceLastPaint); } void FadedesktopScreen::donePaint () { if (state == Out || state == In) { if (fadeTime <= 0) { bool isStillSD = false; foreach (CompWindow *w, screen->windows ()) { FD_WINDOW (w); if (fw->fading) { if (state == Out) { w->hide (); fw->isHidden = true; } fw->fading = false; } if (w->inShowDesktopMode ()) isStillSD = true; } if (state == Out || isStillSD) state = On; else state = Off; activateEvent (false); } else { cScreen->damageScreen (); } } cScreen->donePaint (); } bool FadedesktopWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (fading || isHidden) { GLWindowPaintAttrib wAttrib = attrib; wAttrib.opacity = opacity; return gWindow->glPaint (wAttrib, transform, region, mask); } return gWindow->glPaint (attrib, transform, region, mask); } void FadedesktopScreen::enterShowDesktopMode () { if (state == Off || state == In) { if (state == Off) activateEvent (true); state = Out; fadeTime = optionGetFadetime() - fadeTime; foreach (CompWindow *w, screen->windows ()) { FD_WINDOW (w); if (fw->isFadedesktopWindow ()) { fw->fading = true; w->setShowDesktopMode (true); fw->opacity = fw->cWindow->opacity (); } } cScreen->damageScreen (); } screen->enterShowDesktopMode (); } void FadedesktopScreen::leaveShowDesktopMode (CompWindow *w) { if (state != Off) { if (state != In) { if (state == On) activateEvent (true); state = In; fadeTime = optionGetFadetime() - fadeTime; } foreach (CompWindow *cw, screen->windows ()) { if (w && (w->id () != cw->id ())) continue; FD_WINDOW (cw); if (fw->isHidden) { cw->setShowDesktopMode (false); cw->show (); fw->isHidden = false; fw->fading = true; } else if (fw->fading) { cw->setShowDesktopMode (false); } } cScreen->damageScreen (); } screen->leaveShowDesktopMode (w); } FadedesktopScreen::FadedesktopScreen (CompScreen *screen) : PluginClassHandler (screen), FadedesktopOptions (), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), state (Off), fadeTime (0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); } FadedesktopWindow::FadedesktopWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), fading (false), isHidden (false), opacity (OPAQUE) { WindowInterface::setHandler (window); GLWindowInterface::setHandler (gWindow); } bool FadedesktopPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/fadedesktop/src/fadedesktop.h0000644000015301777760000000427212321343002024702 0ustar pbusernogroup00000000000000/** * * Compiz fade to desktop plugin * * fadedesktop.c * * Copyright (c) 2006 Robert Carr * 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include #include #include #include #include "fadedesktop_options.h" class FadedesktopScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public FadedesktopOptions { public: typedef enum { Off, Out, On, In } State; public: FadedesktopScreen (CompScreen *); void activateEvent (bool); void preparePaint (int); void donePaint (); void enterShowDesktopMode (); void leaveShowDesktopMode (CompWindow *w); CompositeScreen *cScreen; GLScreen *gScreen; State state; int fadeTime; }; class FadedesktopWindow : public PluginClassHandler , public WindowInterface, public GLWindowInterface { public: FadedesktopWindow (CompWindow *); bool isFadedesktopWindow (); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool fading; bool isHidden; GLushort opacity; }; #define FD_SCREEN(s) \ FadedesktopScreen *fs = FadedesktopScreen::get (s); #define FD_WINDOW(w) \ FadedesktopWindow *fw = FadedesktopWindow::get (w); class FadedesktopPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/blur/0000755000015301777760000000000012321344021020121 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/blur/blur.xml.in0000644000015301777760000000623712321343002022222 0ustar pbusernogroup00000000000000 <_short>Blur Windows <_long>Blur windows Effects blur video decor opengl compiz-0.9.11+14.04.20140409/plugins/blur/CMakeLists.txt0000644000015301777760000000073012321343002022657 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) #find_package (OpenGL) #if (OPENGL_GLU_FOUND) # compiz_plugin(blur PLUGINDEPS composite opengl LIBRARIES decoration ${OPENGL_glu_LIBRARY} INCDIRS ${OPENGL_INCLUDE_DIR}) # if (COMPIZ_BUILD_WITH_RPATH AND NOT COMPIZ_DISABLE_PLUGIN_BLUR) # set_target_properties ( # blur PROPERTIES # INSTALL_RPATH "${COMPIZ_LIBDIR}" # ) # endif (COMPIZ_BUILD_WITH_RPATH AND NOT COMPIZ_DISABLE_PLUGIN_BLUR) #endif () compiz-0.9.11+14.04.20140409/plugins/blur/src/0000755000015301777760000000000012321344021020710 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/blur/src/blur.cpp0000644000015301777760000015015412321343002022364 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include COMPIZ_PLUGIN_20090315 (blur, BlurPluginVTable) const unsigned short BLUR_GAUSSIAN_RADIUS_MAX = 15; const unsigned short BLUR_STATE_CLIENT = 0; const unsigned short BLUR_STATE_DECOR = 1; const unsigned short BLUR_STATE_NUM = 2; /* pascal triangle based kernel generator */ static int blurCreateGaussianLinearKernel (int radius, float strength, float *amp, float *pos, int *optSize) { float factor = 0.5f + (strength / 2.0f); float buffer1[BLUR_GAUSSIAN_RADIUS_MAX * 3]; float buffer2[BLUR_GAUSSIAN_RADIUS_MAX * 3]; float *ar1 = buffer1; float *ar2 = buffer2; float *tmp; float sum = 0; int size = (radius * 2) + 1; int mySize = ceil (radius / 2.0f); int i, j; ar1[0] = 1.0; ar1[1] = 1.0; for (i = 3; i <= size; i++) { ar2[0] = 1; for (j = 1; j < i - 1; j++) ar2[j] = (ar1[j - 1] + ar1[j]) * factor; ar2[i - 1] = 1; tmp = ar1; ar1 = ar2; ar2 = tmp; } /* normalize */ for (i = 0; i < size; i++) sum += ar1[i]; if (sum != 0.0f) sum = 1.0f / sum; for (i = 0; i < size; i++) ar1[i] *= sum; i = 0; j = 0; if (radius & 1) { pos[i] = radius; amp[i] = ar1[i]; i = 1; j = 1; } for (; i < mySize; i++) { pos[i] = radius - j; pos[i] -= ar1[j + 1] / (ar1[j] + ar1[j + 1]); amp[i] = ar1[j] + ar1[j + 1]; j += 2; } pos[mySize] = 0.0; amp[mySize] = ar1[radius]; *optSize = mySize; return radius; } void BlurScreen::updateFilterRadius () { switch (optionGetFilter ()) { case BlurOptions::Filter4xbilinear: filterRadius = 2; break; case BlurOptions::FilterGaussian: { int radius = optionGetGaussianRadius (); float strength = optionGetGaussianStrength (); blurCreateGaussianLinearKernel (radius, strength, amp, pos, &numTexop); filterRadius = radius; } break; case BlurOptions::FilterMipmap: { float lod = optionGetMipmapLod (); filterRadius = powf (2.0f, ceilf (lod)); } break; } } void BlurScreen::blurReset () { updateFilterRadius (); foreach (BlurFunction &bf, srcBlurFunctions) GLFragment::destroyFragmentFunction (bf.id); srcBlurFunctions.clear (); foreach (BlurFunction &bf, dstBlurFunctions) GLFragment::destroyFragmentFunction (bf.id); dstBlurFunctions.clear (); width = height = 0; if (program) { GL::deletePrograms (1, &program); program = 0; } } static CompRegion regionFromBoxes (std::vector boxes, int width, int height) { CompRegion region; int x1, x2, y1, y2; foreach (BlurBox &box, boxes) { decor_apply_gravity (box.p1.gravity, box.p1.x, box.p1.y, width, height, &x1, &y1); decor_apply_gravity (box.p2.gravity, box.p2.x, box.p2.y, width, height, &x2, &y2); if (x2 > x1 && y2 > y1) region += CompRect (x1, y1, x2 - x1, y2 - y1); } return region; } void BlurWindow::updateRegion () { CompRegion region; if (state[BLUR_STATE_DECOR].threshold) { region += CompRect (-window->output ().left, -window->output ().top, window->width () + window->output ().right, window->height () + window->output ().bottom); region -= CompRect (0, 0, window->width (), window->height ()); state[BLUR_STATE_DECOR].clipped = false; if (!state[BLUR_STATE_DECOR].box.empty ()) { CompRegion q = regionFromBoxes (state[BLUR_STATE_DECOR].box, window->width (), window->height ()); if (!q.isEmpty ()) { q &= region; if (q != region) { region = q; state[BLUR_STATE_DECOR].clipped = true; } } } } if (state[BLUR_STATE_CLIENT].threshold) { CompRegion r (0, 0, window->width (), window->height ()); state[BLUR_STATE_CLIENT].clipped = false; if (!state[BLUR_STATE_CLIENT].box.empty ()) { CompRegion q = regionFromBoxes (state[BLUR_STATE_CLIENT].box, window->width (), window->height ()); if (!q.isEmpty ()) { q &= r; if (q != r) state[BLUR_STATE_CLIENT].clipped = true; region += q; } } else { region += r; } } this->region = region; if (!region.isEmpty ()) this->region.translate (window->x (), window->y ()); } void BlurWindow::setBlur (int state, int threshold, std::vector box) { this->state[state].threshold = threshold; this->state[state].box = box; updateRegion (); cWindow->addDamage (); } void BlurWindow::updateAlphaMatch () { if (!propSet[BLUR_STATE_CLIENT]) { CompMatch *match; match = &bScreen->optionGetAlphaBlurMatch (); if (match->evaluate (window)) { if (!state[BLUR_STATE_CLIENT].threshold) setBlur (BLUR_STATE_CLIENT, 4, std::vector ()); } else { if (state[BLUR_STATE_CLIENT].threshold) setBlur (BLUR_STATE_CLIENT, 0, std::vector ()); } } } void BlurWindow::updateMatch () { CompMatch *match; bool focus; updateAlphaMatch (); match = &bScreen->optionGetFocusBlurMatch (); focus = GL::fragmentProgram && match->evaluate (window); if (focus != focusBlur) { focusBlur = focus; cWindow->addDamage (); } } void BlurWindow::update (int state) { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; int threshold = 0; std::vector boxes; result = XGetWindowProperty (screen->dpy (), window->id (), bScreen->blurAtom[state], 0L, 8192L, false, XA_INTEGER, &actual, &format, &n, &left, &propData); if (result == Success && n && propData) { propSet[state] = true; if (n >= 2) { long *data = (long *) propData; BlurBox box; threshold = data[0]; if ((n - 2) / 6) { unsigned int i; data += 2; for (i = 0; i < (n - 2) / 6; i++) { box.p1.gravity = *data++; box.p1.x = *data++; box.p1.y = *data++; box.p2.gravity = *data++; box.p2.x = *data++; box.p2.y = *data++; boxes.push_back (box); } } } XFree (propData); } else { propSet[state] = false; } setBlur (state, threshold, boxes); updateAlphaMatch (); } void BlurScreen::preparePaint (int msSinceLastPaint) { if (moreBlur) { int steps; bool focus = optionGetFocusBlur (); bool focusBlur; steps = (msSinceLastPaint * 0xffff) / blurTime; if (steps < 12) steps = 12; moreBlur = false; foreach (CompWindow *w, screen->windows ()) { BLUR_WINDOW (w); focusBlur = bw->focusBlur && focus; if (!bw->pulse && (!focusBlur || w->id () == screen->activeWindow ())) { if (bw->blur) { bw->blur -= steps; if (bw->blur > 0) moreBlur = true; else bw->blur = 0; } } else { if (bw->blur < 0xffff) { if (bw->pulse) { bw->blur += steps * 2; if (bw->blur >= 0xffff) { bw->blur = 0xffff - 1; bw->pulse = false; } moreBlur = true; } else { bw->blur += steps; if (bw->blur < 0xffff) moreBlur = true; else bw->blur = 0xffff; } } } } } cScreen->preparePaint (msSinceLastPaint); if (cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_REGION_MASK) { /* walk from bottom to top and expand damage */ if (alphaBlur) { int x1, y1, x2, y2; int count = 0; CompRegion damage (cScreen->currentDamage ()); foreach (CompWindow *w, screen->windows ()) { BLUR_WINDOW (w); if (!w->isViewable () || !CompositeWindow::get (w)->damaged ()) continue; if (!bw->region.isEmpty ()) { CompRect r = bw->region.boundingRect (); CompRect d = damage.boundingRect (); x1 = r.x1 () - filterRadius; y1 = r.y1 () - filterRadius; x2 = r.x2 () + filterRadius; y2 = r.y2 () + filterRadius; if (x1 < d.x2 () && y1 < d.y2 () && x2 > d.x1 () && y2 > d.y1 ()) { damage.shrink (-filterRadius, -filterRadius); count++; } } } if (count) cScreen->damageRegion (damage); this->count = count; } } } bool BlurScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; if (alphaBlur) { stencilBox = region.boundingRect (); this->region = region; if (mask & PAINT_SCREEN_REGION_MASK) { /* we need to redraw more than the screen region being updated */ if (count) { this->region.shrink (-filterRadius * 2, -filterRadius * 2); this->region &= screen->region (); } } } if (!blurOcclusion) { occlusion = CompRegion (); foreach (CompWindow *w, screen->windows ()) BlurWindow::get (w)->clip = CompRegion (); } this->output = output; if (alphaBlur) status = gScreen->glPaintOutput (sAttrib, transform, this->region, output, mask); else status = gScreen->glPaintOutput (sAttrib, transform, region, output, mask); return status; } void BlurScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (!blurOcclusion) { occlusion = CompRegion (); foreach (CompWindow *w, screen->windows ()) BlurWindow::get (w)->clip = CompRegion (); } gScreen->glPaintTransformedOutput (sAttrib, transform, region, output, mask); } void BlurScreen::donePaint () { if (moreBlur) { foreach (CompWindow *w, screen->windows ()) { BLUR_WINDOW (w); if (bw->blur > 0 && bw->blur < 0xffff) bw->cWindow->addDamage (); } } cScreen->donePaint (); } bool BlurWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status = gWindow->glPaint (attrib, transform, region, mask); if (!bScreen->blurOcclusion && (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK)) { clip = bScreen->occlusion; if (!(gWindow->lastMask () & PAINT_WINDOW_NO_CORE_INSTANCE_MASK) && !(gWindow->lastMask () & PAINT_WINDOW_TRANSFORMED_MASK) && !this->region.isEmpty ()) bScreen->occlusion += this->region; } return status; } GLFragment::FunctionId BlurScreen::getSrcBlurFragmentFunction (GLTexture *texture, int param) { GLFragment::FunctionData data; BlurFunction function; int target; if (texture->target () == GL_TEXTURE_2D) target = COMP_FETCH_TARGET_2D; else target = COMP_FETCH_TARGET_RECT; foreach (BlurFunction &bf, srcBlurFunctions) if (bf.param == param && bf.target == target) return bf.id; if (data.status ()) { static const char *temp[] = { "offset0", "offset1", "sum" }; unsigned int i; for (i = 0; i < sizeof (temp) / sizeof (temp[0]); i++) data.addTempHeaderOp (temp[i]); data.addDataOp ( "MUL offset0, program.env[%d].xyzw, { 1.0, 1.0, 0.0, 0.0 };" "MUL offset1, program.env[%d].zwww, { 1.0, 1.0, 0.0, 0.0 };", param, param); switch (optionGetFilter ()) { case BlurOptions::Filter4xbilinear: default: data.addFetchOp ("output", "offset0", target); data.addDataOp ("MUL sum, output, 0.25;"); data.addFetchOp ("output", "-offset0", target); data.addDataOp ("MAD sum, output, 0.25, sum;"); data.addFetchOp ("output", "offset1", target); data.addDataOp ("MAD sum, output, 0.25, sum;"); data.addFetchOp ("output", "-offset1", target); data.addDataOp ("MAD output, output, 0.25, sum;"); break; } if (!data.status ()) return 0; function.id = data.createFragmentFunction ("blur"); function.target = target; function.param = param; function.unit = 0; srcBlurFunctions.push_back (function); return function.id; } return 0; } GLFragment::FunctionId BlurScreen::getDstBlurFragmentFunction (GLTexture *texture, int param, int unit, int numITC, int startTC) { BlurFunction function; GLFragment::FunctionData data; int target; char *targetString; if (texture->target () == GL_TEXTURE_2D) { target = COMP_FETCH_TARGET_2D; targetString = (char *) "2D"; } else { target = COMP_FETCH_TARGET_RECT; targetString = (char *) "RECT"; } foreach (BlurFunction &function, dstBlurFunctions) if (function.param == param && function.target == target && function.unit == unit && function.numITC == numITC && function.startTC == startTC) return function.id; if (data.status ()) { static const char *temp[] = { "fCoord", "mask", "sum", "dst" }; int i, j; char str[1024]; int saturation = optionGetSaturation (); int numIndirect; int numIndirectOp; int base, end, ITCbase; for (i = 0; (unsigned int) i < sizeof (temp) / sizeof (temp[0]); i++) data.addTempHeaderOp (temp[i]); if (saturation < 100) data.addTempHeaderOp ("sat"); switch (optionGetFilter ()) { case BlurOptions::Filter4xbilinear: { static const char *filterTemp[] = { "t0", "t1", "t2", "t3", "s0", "s1", "s2", "s3" }; for (i = 0; (unsigned int) i < sizeof (filterTemp) / sizeof (filterTemp[0]); i++) data.addTempHeaderOp (filterTemp[i]); data.addFetchOp ("output", NULL, target); data.addColorOp ("output", "output"); data.addDataOp ( "MUL fCoord, fragment.position, program.env[%d];", param); data.addDataOp ( "ADD t0, fCoord, program.env[%d];" "TEX s0, t0, texture[%d], %s;" "SUB t1, fCoord, program.env[%d];" "TEX s1, t1, texture[%d], %s;" "MAD t2, program.env[%d], { -1.0, 1.0, 0.0, 0.0 }, fCoord;" "TEX s2, t2, texture[%d], %s;" "MAD t3, program.env[%d], { 1.0, -1.0, 0.0, 0.0 }, fCoord;" "TEX s3, t3, texture[%d], %s;" "MUL_SAT mask, output.a, program.env[%d];" "MUL sum, s0, 0.25;" "MAD sum, s1, 0.25, sum;" "MAD sum, s2, 0.25, sum;" "MAD sum, s3, 0.25, sum;", param + 2, unit, targetString, param + 2, unit, targetString, param + 2, unit, targetString, param + 2, unit, targetString, param + 1); } break; case BlurOptions::FilterGaussian: { /* try to use only half of the available temporaries to keep other plugins working */ if ((maxTemp / 2) - 4 > (numTexop + (numTexop - numITC)) * 2) { numIndirect = 1; numIndirectOp = numTexop; } else { i = MAX (((maxTemp / 2) - 4) / 4, 1); numIndirect = ceil ((float)numTexop / (float)i); numIndirectOp = ceil ((float)numTexop / (float)numIndirect); } /* we need to define all coordinate temporaries if we have multiple indirection steps */ j = (numIndirect > 1) ? 0 : numITC; for (i = 0; i < numIndirectOp * 2; i++) { snprintf (str, 1024, "pix_%d", i); data.addTempHeaderOp (str); } for (i = j * 2; i < numIndirectOp * 2; i++) { snprintf (str, 1024, "coord_%d", i); data.addTempHeaderOp (str); } data.addFetchOp ("output", NULL, target); data.addColorOp ("output", "output"); data.addDataOp ( "MUL fCoord, fragment.position, program.env[%d];", param); data.addDataOp ("TEX sum, fCoord, texture[%d], %s;", unit + 1, targetString); data.addDataOp ("MUL_SAT mask, output.a, program.env[%d];" "MUL sum, sum, %f;", param + 1, amp[numTexop]); for (j = 0; j < numIndirect; j++) { base = j * numIndirectOp; end = MIN ((j + 1) * numIndirectOp, numTexop) - base; ITCbase = MAX (numITC - base, 0); for (i = ITCbase; i < end; i++) { data.addDataOp ( "ADD coord_%d, fCoord, {0.0, %g, 0.0, 0.0};" "SUB coord_%d, fCoord, {0.0, %g, 0.0, 0.0};", i * 2, pos[base + i] * ty, (i * 2) + 1, pos[base + i] * ty); } for (i = 0; i < ITCbase; i++) { data.addDataOp ( "TXP pix_%d, fragment.texcoord[%d], texture[%d], %s;" "TXP pix_%d, fragment.texcoord[%d], texture[%d], %s;", i * 2, startTC + ((i + base) * 2), unit + 1, targetString, (i * 2) + 1, startTC + 1 + ((i + base) * 2), unit + 1, targetString); } for (i = ITCbase; i < end; i++) { data.addDataOp ( "TEX pix_%d, coord_%d, texture[%d], %s;" "TEX pix_%d, coord_%d, texture[%d], %s;", i * 2, i * 2, unit + 1, targetString, (i * 2) + 1, (i * 2) + 1, unit + 1, targetString); } for (i = 0; i < end * 2; i++) { data.addDataOp ( "MAD sum, pix_%d, %f, sum;", i, amp[base + (i / 2)]); } } } break; case BlurOptions::FilterMipmap: data.addFetchOp ("output", NULL, target); data.addColorOp ("output", "output"); data.addDataOp ( "MUL fCoord, fragment.position, program.env[%d].xyzz;" "MOV fCoord.w, program.env[%d].w;" "TXB sum, fCoord, texture[%d], %s;" "MUL_SAT mask, output.a, program.env[%d];", param, param, unit, targetString, param + 1); break; } if (saturation < 100) { data.addDataOp ( "MUL sat, sum, { 1.0, 1.0, 1.0, 0.0 };" "DP3 sat, sat, { %f, %f, %f, %f };" "LRP sum.xyz, %f, sum, sat;", RED_SATURATION_WEIGHT, GREEN_SATURATION_WEIGHT, BLUE_SATURATION_WEIGHT, 0.0f, saturation / 100.0f); } data.addDataOp ( "MAD dst, mask, -output.a, mask;" "MAD output.rgb, sum, dst.a, output;" "ADD output.a, output.a, dst.a;"); if (!data.status ()) { return 0; } function.id = data.createFragmentFunction ("blur"); function.target = target; function.param = param; function.unit = unit; function.numITC = numITC; function.startTC = startTC; dstBlurFunctions.push_back (function); return function.id; } return 0; } bool BlurScreen::projectVertices (CompOutput *output, const GLMatrix &transform, const float *object, float *scr, int n) { GLdouble dProjection[16]; GLdouble dModel[16]; GLint viewport[4]; double x, y, z; int i; viewport[0] = output->x1 (); viewport[1] = screen->height () - output->y2 (); viewport[2] = output->width (); viewport[3] = output->height (); for (i = 0; i < 16; i++) { dModel[i] = transform.getMatrix ()[i]; dProjection[i] = gScreen->projectionMatrix ()[i]; } while (n--) { if (!gluProject (object[0], object[1], object[2], dModel, dProjection, viewport, &x, &y, &z)) return false; scr[0] = x; scr[1] = y; object += 3; scr += 2; } return true; } bool BlurScreen::loadFragmentProgram (GLuint *program, const char *string) { GLint errorPos; /* clear errors */ glGetError (); if (!*program) (*GL::genPrograms) (1, program); (*GL::bindProgram) (GL_FRAGMENT_PROGRAM_ARB, *program); (*GL::programString) (GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen (string), string); glGetIntegerv (GL_PROGRAM_ERROR_POSITION_ARB, &errorPos); if (glGetError () != GL_NO_ERROR || errorPos != -1) { compLogMessage ("blur", CompLogLevelError, "Failed to load blur program %s", string); (*GL::deletePrograms) (1, program); *program = 0; return false; } return true; } bool BlurScreen::loadFilterProgram (int numITC) { char buffer[4096]; char *targetString; char *str = buffer; int i, j; int numIndirect; int numIndirectOp; int base, end, ITCbase; if (target == GL_TEXTURE_2D) targetString = (char *) "2D"; else targetString = (char *) "RECT"; str += sprintf (str, "!!ARBfp1.0" "ATTRIB texcoord = fragment.texcoord[0];" "TEMP sum;"); if (maxTemp - 1 > (numTexop + (numTexop - numITC)) * 2) { numIndirect = 1; numIndirectOp = numTexop; } else { i = (maxTemp - 1) / 4; numIndirect = ceil ((float)numTexop / (float)i); numIndirectOp = ceil ((float)numTexop / (float)numIndirect); } /* we need to define all coordinate temporaries if we have multiple indirection steps */ j = (numIndirect > 1) ? 0 : numITC; for (i = 0; i < numIndirectOp; i++) str += sprintf (str,"TEMP pix_%d, pix_%d;", i * 2, (i * 2) + 1); for (i = j; i < numIndirectOp; i++) str += sprintf (str,"TEMP coord_%d, coord_%d;", i * 2, (i * 2) + 1); str += sprintf (str, "TEX sum, texcoord, texture[0], %s;", targetString); str += sprintf (str, "MUL sum, sum, %f;", amp[numTexop]); for (j = 0; j < numIndirect; j++) { base = j * numIndirectOp; end = MIN ((j + 1) * numIndirectOp, numTexop) - base; ITCbase = MAX (numITC - base, 0); for (i = ITCbase; i < end; i++) str += sprintf (str, "ADD coord_%d, texcoord, {%g, 0.0, 0.0, 0.0};" "SUB coord_%d, texcoord, {%g, 0.0, 0.0, 0.0};", i * 2, pos[base + i] * tx, (i * 2) + 1, pos[base + i] * tx); for (i = 0; i < ITCbase; i++) str += sprintf (str, "TEX pix_%d, fragment.texcoord[%d], texture[0], %s;" "TEX pix_%d, fragment.texcoord[%d], texture[0], %s;", i * 2, ((i + base) * 2) + 1, targetString, (i * 2) + 1, ((i + base) * 2) + 2, targetString); for (i = ITCbase; i < end; i++) str += sprintf (str, "TEX pix_%d, coord_%d, texture[0], %s;" "TEX pix_%d, coord_%d, texture[0], %s;", i * 2, i * 2, targetString, (i * 2) + 1, (i * 2) + 1, targetString); for (i = 0; i < end * 2; i++) str += sprintf (str, "MAD sum, pix_%d, %f, sum;", i, amp[base + (i / 2)]); } str += sprintf (str, "MOV result.color, sum;" "END"); return loadFragmentProgram (&program, buffer); } bool BlurScreen::fboPrologue () { if (!fbo) return false; (*GL::bindFramebuffer) (GL_FRAMEBUFFER_EXT, fbo); /* bind texture and check status the first time */ if (!fboStatus) { (*GL::framebufferTexture2D) (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, target, texture[1], 0); int currStatus = (*GL::checkFramebufferStatus) (GL_FRAMEBUFFER_EXT); if (currStatus != GL_FRAMEBUFFER_COMPLETE_EXT) { compLogMessage ("blur", CompLogLevelError, "Framebuffer incomplete"); (*GL::bindFramebuffer) (GL_FRAMEBUFFER_EXT, 0); (*GL::deleteFramebuffers) (1, &fbo); fbo = 0; return false; } else fboStatus = true; } glPushAttrib (GL_VIEWPORT_BIT | GL_ENABLE_BIT); glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT); glReadBuffer (GL_COLOR_ATTACHMENT0_EXT); glDisable (GL_CLIP_PLANE0); glDisable (GL_CLIP_PLANE1); glDisable (GL_CLIP_PLANE2); glDisable (GL_CLIP_PLANE3); glViewport (0, 0, width, height); glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glOrtho (0.0, width, 0.0, height, -1.0, 1.0); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); return true; } void BlurScreen::fboEpilogue () { (*GL::bindFramebuffer) (GL_FRAMEBUFFER_EXT, 0); glMatrixMode (GL_PROJECTION); glLoadIdentity (); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glDepthRange (0, 1); glViewport (-1, -1, 2, 2); glRasterPos2f (0, 0); gScreen->resetRasterPos (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glPopMatrix (); glDrawBuffer (GL_BACK); glReadBuffer (GL_BACK); glPopAttrib (); } bool BlurScreen::fboUpdate (BoxPtr pBox, int nBox) { int i, y, iTC = 0; bool wasCulled = glIsEnabled (GL_CULL_FACE); if (GL::maxTextureUnits && optionGetIndependentTex ()) iTC = MIN ((GL::maxTextureUnits - 1) / 2, numTexop); if (!program) if (!loadFilterProgram (iTC)) return false; if (!fboPrologue ()) return false; glDisable (GL_CULL_FACE); glDisableClientState (GL_TEXTURE_COORD_ARRAY); glBindTexture (target, texture[0]); glEnable (GL_FRAGMENT_PROGRAM_ARB); (*GL::bindProgram) (GL_FRAGMENT_PROGRAM_ARB, program); glBegin (GL_QUADS); while (nBox--) { y = screen->height () - pBox->y2; for (i = 0; i < iTC; i++) { (*GL::multiTexCoord2f) (GL_TEXTURE1_ARB + (i * 2), tx * (pBox->x1 + pos[i]), ty * y); (*GL::multiTexCoord2f) (GL_TEXTURE1_ARB + (i * 2) + 1, tx * (pBox->x1 - pos[i]), ty * y); } glTexCoord2f (tx * pBox->x1, ty * y); glVertex2i (pBox->x1, y); for (i = 0; i < iTC; i++) { (*GL::multiTexCoord2f) (GL_TEXTURE1_ARB + (i * 2), tx * (pBox->x2 + pos[i]), ty * y); (*GL::multiTexCoord2f) (GL_TEXTURE1_ARB + (i * 2) + 1, tx * (pBox->x2 - pos[i]), ty * y); } glTexCoord2f (tx * pBox->x2, ty * y); glVertex2i (pBox->x2, y); y = screen->height () - pBox->y1; for (i = 0; i < iTC; i++) { (*GL::multiTexCoord2f) (GL_TEXTURE1_ARB + (i * 2), tx * (pBox->x2 + pos[i]), ty * y); (*GL::multiTexCoord2f) (GL_TEXTURE1_ARB + (i * 2) + 1, tx * (pBox->x2 - pos[i]), ty * y); } glTexCoord2f (tx * pBox->x2, ty * y); glVertex2i (pBox->x2, y); for (i = 0; i < iTC; i++) { (*GL::multiTexCoord2f) (GL_TEXTURE1_ARB + (i * 2), tx * (pBox->x1 + pos[i]), ty * y); (*GL::multiTexCoord2f) (GL_TEXTURE1_ARB + (i * 2) + 1, tx * (pBox->x1 - pos[i]), ty * y); } glTexCoord2f (tx * pBox->x1, ty * y); glVertex2i (pBox->x1, y); pBox++; } glEnd (); glDisable (GL_FRAGMENT_PROGRAM_ARB); glEnableClientState (GL_TEXTURE_COORD_ARRAY); if (wasCulled) glEnable (GL_CULL_FACE); fboEpilogue (); return true; } static const unsigned short MAX_VERTEX_PROJECT_COUNT = 20; void BlurWindow::projectRegion (CompOutput *output, const GLMatrix &transform) { float scrv[MAX_VERTEX_PROJECT_COUNT * 2]; float vertices[MAX_VERTEX_PROJECT_COUNT * 3]; int nVertices, nQuadCombine; int i, j, stride; float *v, *vert; float minX, maxX, minY, maxY, minZ, maxZ; float *scr; GLTexture::MatrixList ml; GLWindow::Geometry *gm; gWindow->geometry ().reset (); gWindow->glAddGeometry (ml, bScreen->tmpRegion2, infiniteRegion); if (!gWindow->geometry ().vCount) return; gm = &gWindow->geometry (); nVertices = (gm->indexCount) ? gm->indexCount: gm->vCount; nQuadCombine = 1; stride = gm->vertexStride; vert = gm->vertices + (stride - 3); /* we need to find the best value here */ if (nVertices <= MAX_VERTEX_PROJECT_COUNT) { for (i = 0; i < nVertices; i++) { if (gm->indexCount) { v = vert + (stride * gm->indices[i]); } else { v = vert + (stride * i); } vertices[i * 3] = v[0]; vertices[(i * 3) + 1] = v[1]; vertices[(i * 3) + 2] = v[2]; } } else { minX = screen->width (); maxX = 0; minY = screen->height (); maxY = 0; minZ = 1000000; maxZ = -1000000; for (i = 0; i < gm->vCount; i++) { v = vert + (stride * i); if (v[0] < minX) minX = v[0]; if (v[0] > maxX) maxX = v[0]; if (v[1] < minY) minY = v[1]; if (v[1] > maxY) maxY = v[1]; if (v[2] < minZ) minZ = v[2]; if (v[2] > maxZ) maxZ = v[2]; } vertices[0] = vertices[9] = minX; vertices[1] = vertices[4] = minY; vertices[3] = vertices[6] = maxX; vertices[7] = vertices[10] = maxY; vertices[2] = vertices[5] = maxZ; vertices[8] = vertices[11] = maxZ; nVertices = 4; if (maxZ != minZ) { vertices[12] = vertices[21] = minX; vertices[13] = vertices[16] = minY; vertices[15] = vertices[18] = maxX; vertices[19] = vertices[22] = maxY; vertices[14] = vertices[17] = minZ; vertices[20] = vertices[23] = minZ; nQuadCombine = 2; } } if (!bScreen->projectVertices (output, transform, vertices, scrv, nVertices * nQuadCombine)) return; for (i = 0; i < nVertices / 4; i++) { scr = scrv + (i * 4 * 2); minX = screen->width (); maxX = 0; minY = screen->height (); maxY = 0; for (j = 0; j < 8 * nQuadCombine; j += 2) { if (scr[j] < minX) minX = scr[j]; if (scr[j] > maxX) maxX = scr[j]; if (scr[j + 1] < minY) minY = scr[j + 1]; if (scr[j + 1] > maxY) maxY = scr[j + 1]; } int x1, y1, x2, y2; x1 = minX - bScreen->filterRadius; y1 = screen->height () - maxY - bScreen->filterRadius; x2 = maxX + bScreen->filterRadius + 0.5f; y2 = screen->height () - minY + bScreen->filterRadius + 0.5f; bScreen->tmpRegion3 += CompRect (x1, y1, x2 - x1, y2 - y1); } } bool BlurWindow::updateDstTexture (const GLMatrix &transform, CompRect *pExtents, int clientThreshold) { int y; int filter; filter = bScreen->optionGetFilter (); bScreen->tmpRegion3 = CompRegion (); if (filter == BlurOptions::FilterGaussian) { if (state[BLUR_STATE_DECOR].threshold) { int xx, yy, ww, hh; // top xx = window->x () - window->output ().left; yy = window->y () - window->output ().top; ww = window->width () + window->output ().left + window->output ().right; hh = window->output ().top; bScreen->tmpRegion2 = bScreen->tmpRegion.intersected ( CompRect (xx, yy, ww, hh)); if (!bScreen->tmpRegion2.isEmpty ()) projectRegion (bScreen->output, transform); // bottom xx = window->x () - window->output ().left; yy = window->y () + window->height (); ww = window->width () + window->output ().left + window->output ().right; hh = window->output ().bottom; bScreen->tmpRegion2 = bScreen->tmpRegion.intersected ( CompRect (xx, yy, ww, hh)); if (!bScreen->tmpRegion2.isEmpty ()) projectRegion (bScreen->output, transform); // left xx = window->x () - window->output ().left; yy = window->y (); ww = window->output ().left; hh = window->height (); bScreen->tmpRegion2 = bScreen->tmpRegion.intersected ( CompRect (xx, yy, ww, hh)); if (!bScreen->tmpRegion2.isEmpty ()) projectRegion (bScreen->output, transform); // right xx = window->x () + window->width (); yy = window->y (); ww = window->output ().right; hh = window->height (); bScreen->tmpRegion2 = bScreen->tmpRegion.intersected ( CompRect (xx, yy, ww, hh)); if (!bScreen->tmpRegion2.isEmpty ()) projectRegion (bScreen->output, transform); } if (clientThreshold) { // center bScreen->tmpRegion2 = bScreen->tmpRegion.intersected ( CompRect (window->x (), window->y (), window->width (), window->height ())); if (!bScreen->tmpRegion2.isEmpty ()) projectRegion (bScreen->output, transform); } } else { // center bScreen->tmpRegion2 = bScreen->tmpRegion; if (!bScreen->tmpRegion2.isEmpty ()) projectRegion (bScreen->output, transform); } bScreen->tmpRegion = bScreen->region.intersected (bScreen->tmpRegion3); if (bScreen->tmpRegion.isEmpty ()) return false; *pExtents = bScreen->tmpRegion.boundingRect (); if (!bScreen->texture[0] || bScreen->width != screen->width () || bScreen->height != screen->height ()) { int i, textures = 1; bScreen->width = screen->width (); bScreen->height = screen->height (); if (GL::textureNonPowerOfTwo || (POWER_OF_TWO (bScreen->width) && POWER_OF_TWO (bScreen->height))) { bScreen->target = GL_TEXTURE_2D; bScreen->tx = 1.0f / bScreen->width; bScreen->ty = 1.0f / bScreen->height; } else { bScreen->target = GL_TEXTURE_RECTANGLE_NV; bScreen->tx = 1; bScreen->ty = 1; } if (filter == BlurOptions::FilterGaussian) { if (GL::fbo && !bScreen->fbo) (*GL::genFramebuffers) (1, &bScreen->fbo); if (!bScreen->fbo) compLogMessage ("blur", CompLogLevelError, "Failed to create framebuffer object"); textures = 2; } bScreen->fboStatus = false; for (i = 0; i < textures; i++) { if (!bScreen->texture[i]) glGenTextures (1, &bScreen->texture[i]); glBindTexture (bScreen->target, bScreen->texture[i]); glTexImage2D (bScreen->target, 0, GL_RGB, bScreen->width, bScreen->height, 0, GL_BGRA, #if IMAGE_BYTE_ORDER == MSBFirst GL_UNSIGNED_INT_8_8_8_8_REV, #else GL_UNSIGNED_BYTE, #endif NULL); glTexParameteri (bScreen->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (bScreen->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); if (filter == BlurOptions::FilterMipmap) { if (!GL::fbo) { compLogMessage ("blur", CompLogLevelWarn, "GL_EXT_framebuffer_object extension " "is required for mipmap filter"); } else if (bScreen->target != GL_TEXTURE_2D) { compLogMessage ("blur", CompLogLevelWarn, "GL_ARB_texture_non_power_of_two " "extension is required for mipmap filter"); } else { glTexParameteri (bScreen->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri (bScreen->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); } } glTexParameteri (bScreen->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (bScreen->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glCopyTexSubImage2D (bScreen->target, 0, 0, 0, 0, 0, bScreen->width, bScreen->height); } } else { glBindTexture (bScreen->target, bScreen->texture[0]); CompRect br = bScreen->tmpRegion.boundingRect (); y = screen->height () - br.y2 (); glCopyTexSubImage2D (bScreen->target, 0, br.x1 (), y, br.x1 (), y, br.width (), br.height ()); } switch (filter) { case BlurOptions::FilterGaussian: return bScreen->fboUpdate (bScreen->tmpRegion.handle ()->rects, bScreen->tmpRegion.numRects ()); case BlurOptions::FilterMipmap: if (GL::generateMipmap) (*GL::generateMipmap) (bScreen->target); break; case BlurOptions::Filter4xbilinear: break; } glBindTexture (bScreen->target, 0); return true; } bool BlurWindow::glDraw (const GLMatrix &transform, GLFragment::Attrib &attrib, const CompRegion ®ion, unsigned int mask) { bool status; if (bScreen->alphaBlur && !region.isEmpty ()) { int clientThreshold; /* only care about client window blurring when it's translucent */ if (mask & PAINT_WINDOW_TRANSLUCENT_MASK) clientThreshold = state[BLUR_STATE_CLIENT].threshold; else clientThreshold = 0; if (state[BLUR_STATE_DECOR].threshold || clientThreshold) { bool clipped = false; CompRect box (0, 0, 0, 0); CompRegion reg; bScreen->mvp = GLMatrix (bScreen->gScreen->projectionMatrix ()); bScreen->mvp *= transform; if (mask & PAINT_WINDOW_TRANSFORMED_MASK) reg = infiniteRegion; else reg = region; bScreen->tmpRegion = this->region.intersected (reg); if (!bScreen->blurOcclusion && !(mask & PAINT_WINDOW_TRANSFORMED_MASK)) bScreen->tmpRegion -= clip; if (updateDstTexture (transform, &box, clientThreshold)) { if (clientThreshold) { if (state[BLUR_STATE_CLIENT].clipped) { if (bScreen->stencilBits) { state[BLUR_STATE_CLIENT].active = true; clipped = true; } } else { state[BLUR_STATE_CLIENT].active = true; } } if (state[BLUR_STATE_DECOR].threshold) { if (state[BLUR_STATE_DECOR].clipped) { if (bScreen->stencilBits) { state[BLUR_STATE_DECOR].active = true; clipped = true; } } else { state[BLUR_STATE_DECOR].active = true; } } if (!bScreen->blurOcclusion && !clip.isEmpty ()) clipped = true; } if (!bScreen->blurOcclusion) bScreen->tmpRegion = this->region - clip; else bScreen->tmpRegion = this->region; if (!clientThreshold) { bScreen->tmpRegion -= CompRect (window->x (), window->x () + window->width (), window->y (), window->y () + window->height ()); } if (clipped) { GLTexture::MatrixList ml; gWindow->geometry ().reset (); gWindow->glAddGeometry (ml, bScreen->tmpRegion, reg); if (gWindow->geometry ().vCount) { CompRect clearBox = bScreen->stencilBox; bScreen->stencilBox = box; glEnable (GL_STENCIL_TEST); glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); if (clearBox.x2 () > clearBox.x1 () && clearBox.y2 () > clearBox.y1 ()) { glPushAttrib (GL_SCISSOR_BIT); glEnable (GL_SCISSOR_TEST); glScissor (clearBox.x1 (), screen->height () - clearBox.y2 (), clearBox.width (), clearBox.height ()); glClear (GL_STENCIL_BUFFER_BIT); glPopAttrib (); } glStencilFunc (GL_ALWAYS, 0x1, ~0); glStencilOp (GL_KEEP, GL_KEEP, GL_REPLACE); glDisableClientState (GL_TEXTURE_COORD_ARRAY); gWindow->glDrawGeometry (); glEnableClientState (GL_TEXTURE_COORD_ARRAY); glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glDisable (GL_STENCIL_TEST); } } } } status = gWindow->glDraw (transform, attrib, region, mask); state[BLUR_STATE_CLIENT].active = false; state[BLUR_STATE_DECOR].active = false; return status; } void BlurWindow::glDrawTexture (GLTexture *texture, GLFragment::Attrib &attrib, unsigned int mask) { int state = BLUR_STATE_DECOR; foreach (GLTexture *tex, gWindow->textures ()) if (texture == tex) state = BLUR_STATE_CLIENT; if (blur || this->state[state].active) { GLFragment::Attrib fa (attrib); int param, function; int unit = 0; GLfloat dx, dy; int iTC = 0; if (blur) { param = fa.allocParameters (1); function = bScreen->getSrcBlurFragmentFunction (texture, param); if (function) { fa.addFunction (function); dx = ((texture->matrix ().xx / 2.1f) * blur) / 65535.0f; dy = ((texture->matrix ().yy / 2.1f) * blur) / 65535.0f; (*GL::programEnvParameter4f) (GL_FRAGMENT_PROGRAM_ARB, param, dx, dy, dx, -dy); /* bi-linear filtering is required */ mask |= PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK; } } if (this->state[state].active) { GLFragment::Attrib dstFa (fa); float threshold = (float) this->state[state].threshold; switch (bScreen->optionGetFilter ()) { case BlurOptions::Filter4xbilinear: dx = bScreen->tx / 2.1f; dy = bScreen->ty / 2.1f; param = dstFa.allocParameters (3); unit = dstFa.allocTextureUnits (1); function = bScreen->getDstBlurFragmentFunction ( texture, param, unit, 0, 0); if (function) { dstFa.addFunction (function); (*GL::activeTexture) (GL_TEXTURE0_ARB + unit); glBindTexture (bScreen->target, bScreen->texture[0]); (*GL::activeTexture) (GL_TEXTURE0_ARB); (*GL::programEnvParameter4f) (GL_FRAGMENT_PROGRAM_ARB, param, bScreen->tx, bScreen->ty, 0.0f, 0.0f); (*GL::programEnvParameter4f) (GL_FRAGMENT_PROGRAM_ARB, param + 1, threshold, threshold, threshold, threshold); (*GL::programEnvParameter4f) (GL_FRAGMENT_PROGRAM_ARB, param + 2, dx, dy, 0.0f, 0.0f); } break; case BlurOptions::FilterGaussian: if (bScreen->optionGetIndependentTex ()) { /* leave one free texture unit for fragment position */ iTC = MAX (0, GL::maxTextureUnits - (gWindow->geometry ().texUnits + 1)); if (iTC) iTC = MIN (iTC / 2, bScreen->numTexop); } param = dstFa.allocParameters (2); unit = dstFa.allocTextureUnits (2); function = bScreen->getDstBlurFragmentFunction ( texture, param, unit, iTC, gWindow->geometry ().texUnits); if (function) { dstFa.addFunction (function); (*GL::activeTexture) (GL_TEXTURE0_ARB + unit); glBindTexture (bScreen->target, bScreen->texture[0]); (*GL::activeTexture) (GL_TEXTURE0_ARB + unit + 1); glBindTexture (bScreen->target, bScreen->texture[1]); (*GL::activeTexture) (GL_TEXTURE0_ARB); (*GL::programEnvParameter4f) (GL_FRAGMENT_PROGRAM_ARB, param, bScreen->tx, bScreen->ty, 0.0f, 0.0f); (*GL::programEnvParameter4f) (GL_FRAGMENT_PROGRAM_ARB, param + 1, threshold, threshold, threshold, threshold); if (iTC) { GLMatrix tm, rm; float s_gen[4], t_gen[4], q_gen[4]; for (unsigned int i = 0; i < 16; i++) tm[i] = 0; tm[0] = (bScreen->output->width () / 2.0) * bScreen->tx; tm[5] = (bScreen->output->height () / 2.0) * bScreen->ty; tm[10] = 1; tm[12] = (bScreen->output->width () / 2.0 + bScreen->output->x1 ()) * bScreen->tx; tm[13] = (bScreen->output->height () / 2.0 + screen->height () - bScreen->output->y2 ()) * bScreen->ty; tm[14] = 1; tm[15] = 1; tm *= bScreen->mvp; for (int i = 0; i < iTC; i++) { (*GL::activeTexture) (GL_TEXTURE0_ARB + gWindow->geometry ().texUnits + (i * 2)); rm.reset (); rm[13] = bScreen->ty * bScreen->pos[i]; rm *= tm; s_gen[0] = rm[0]; s_gen[1] = rm[4]; s_gen[2] = rm[8]; s_gen[3] = rm[12]; t_gen[0] = rm[1]; t_gen[1] = rm[5]; t_gen[2] = rm[9]; t_gen[3] = rm[13]; q_gen[0] = rm[3]; q_gen[1] = rm[7]; q_gen[2] = rm[11]; q_gen[3] = rm[15]; glTexGenfv (GL_T, GL_OBJECT_PLANE, t_gen); glTexGenfv (GL_S, GL_OBJECT_PLANE, s_gen); glTexGenfv (GL_Q, GL_OBJECT_PLANE, q_gen); glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni (GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glEnable (GL_TEXTURE_GEN_S); glEnable (GL_TEXTURE_GEN_T); glEnable (GL_TEXTURE_GEN_Q); (*GL::activeTexture) (GL_TEXTURE0_ARB + gWindow->geometry ().texUnits + 1 + (i * 2)); rm.reset (); rm[13] = -bScreen->ty * bScreen->pos[i]; rm *= tm; s_gen[0] = rm[0]; s_gen[1] = rm[4]; s_gen[2] = rm[8]; s_gen[3] = rm[12]; t_gen[0] = rm[1]; t_gen[1] = rm[5]; t_gen[2] = rm[9]; t_gen[3] = rm[13]; q_gen[0] = rm[3]; q_gen[1] = rm[7]; q_gen[2] = rm[11]; q_gen[3] = rm[15]; glTexGenfv (GL_T, GL_OBJECT_PLANE, t_gen); glTexGenfv (GL_S, GL_OBJECT_PLANE, s_gen); glTexGenfv (GL_Q, GL_OBJECT_PLANE, q_gen); glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni (GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glEnable (GL_TEXTURE_GEN_S); glEnable (GL_TEXTURE_GEN_T); glEnable (GL_TEXTURE_GEN_Q); } (*GL::activeTexture) (GL_TEXTURE0_ARB); } } break; case BlurOptions::FilterMipmap: param = dstFa.allocParameters (2); unit = dstFa.allocTextureUnits (1); function = bScreen->getDstBlurFragmentFunction (texture, param, unit, 0, 0); if (function) { float lod = bScreen->optionGetMipmapLod (); dstFa.addFunction (function); (*GL::activeTexture) (GL_TEXTURE0_ARB + unit); glBindTexture (bScreen->target, bScreen->texture[0]); (*GL::activeTexture) (GL_TEXTURE0_ARB); (*GL::programEnvParameter4f) (GL_FRAGMENT_PROGRAM_ARB, param, bScreen->tx, bScreen->ty, 0.0f, lod); (*GL::programEnvParameter4f) (GL_FRAGMENT_PROGRAM_ARB, param + 1, threshold, threshold, threshold, threshold); } break; } if (this->state[state].clipped || (!bScreen->blurOcclusion && !clip.isEmpty ())) { glEnable (GL_STENCIL_TEST); glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP); glStencilFunc (GL_EQUAL, 0x1, ~0); /* draw region with destination blur */ gWindow->glDrawTexture (texture, dstFa, mask); glStencilFunc (GL_EQUAL, 0, ~0); /* draw region without destination blur */ gWindow->glDrawTexture (texture, fa, mask); glDisable (GL_STENCIL_TEST); } else { /* draw with destination blur */ gWindow->glDrawTexture (texture, dstFa, mask); } } else { gWindow->glDrawTexture (texture, fa, mask); } if (unit) { (*GL::activeTexture) (GL_TEXTURE0_ARB + unit); glBindTexture (bScreen->target, 0); (*GL::activeTexture) (GL_TEXTURE0_ARB + unit + 1); glBindTexture (bScreen->target, 0); (*GL::activeTexture) (GL_TEXTURE0_ARB); } if (iTC) { int i; for (i = gWindow->geometry ().texUnits; i < gWindow->geometry ().texUnits + (2 * iTC); i++) { (*GL::activeTexture) (GL_TEXTURE0_ARB + i); glDisable (GL_TEXTURE_GEN_S); glDisable (GL_TEXTURE_GEN_T); glDisable (GL_TEXTURE_GEN_Q); } (*GL::activeTexture) (GL_TEXTURE0_ARB); } } else { gWindow->glDrawTexture (texture, attrib, mask); } } void BlurScreen::handleEvent (XEvent *event) { Window activeWindow = screen->activeWindow (); screen->handleEvent (event); if (screen->activeWindow () != activeWindow) { CompWindow *w; w = screen->findWindow (activeWindow); if (w) { if (optionGetFocusBlur ()) { CompositeWindow::get (w)->addDamage (); moreBlur = true; } } w = screen->findWindow (screen->activeWindow ()); if (w) { if (optionGetFocusBlur ()) { CompositeWindow::get (w)->addDamage (); moreBlur = true; } } } if (event->type == PropertyNotify) { int i; for (i = 0; i < BLUR_STATE_NUM; i++) { if (event->xproperty.atom == blurAtom[i]) { CompWindow *w; w = screen->findWindow (event->xproperty.window); if (w) BlurWindow::get (w)->update (i); } } } } void BlurWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { if (bScreen->alphaBlur) { if (state[BLUR_STATE_CLIENT].threshold || state[BLUR_STATE_DECOR].threshold) updateRegion (); } window->resizeNotify (dx, dy, dwidth, dheight); } void BlurWindow::moveNotify (int dx, int dy, bool immediate) { if (!region.isEmpty ()) region.translate (dx, dy); window->moveNotify (dx, dy, immediate); } static bool blurPulse (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; int xid; xid = CompOption::getIntOptionNamed (options, "window", screen->activeWindow ()); w = screen->findWindow (xid); if (w && GL::fragmentProgram) { BLUR_SCREEN (screen); BLUR_WINDOW (w); bw->pulse = true; bs->moreBlur = true; bw->cWindow->addDamage (); } return false; } void BlurScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); /* match options are up to date after the call to matchExpHandlerChanged */ foreach (CompWindow *w, screen->windows ()) BlurWindow::get (w)->updateMatch (); } void BlurScreen::matchPropertyChanged (CompWindow *w) { BlurWindow::get (w)->updateMatch (); screen->matchPropertyChanged (w); } bool BlurScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = BlurOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case BlurOptions::BlurSpeed: blurTime = 1000.0f / optionGetBlurSpeed (); break; case BlurOptions::FocusBlurMatch: case BlurOptions::AlphaBlurMatch: foreach (CompWindow *w, screen->windows ()) BlurWindow::get (w)->updateMatch (); moreBlur = true; cScreen->damageScreen (); break; case BlurOptions::FocusBlur: moreBlur = true; cScreen->damageScreen (); break; case BlurOptions::AlphaBlur: if (GL::fragmentProgram && optionGetAlphaBlur ()) alphaBlur = true; else alphaBlur = false; cScreen->damageScreen (); break; case BlurOptions::Filter: blurReset (); cScreen->damageScreen (); break; case BlurOptions::GaussianRadius: case BlurOptions::GaussianStrength: case BlurOptions::IndependentTex: if (optionGetFilter () == BlurOptions::FilterGaussian) { blurReset (); cScreen->damageScreen (); } break; case BlurOptions::MipmapLod: if (optionGetFilter () == BlurOptions::FilterMipmap) { blurReset (); cScreen->damageScreen (); } break; case BlurOptions::Saturation: blurReset (); cScreen->damageScreen (); break; case BlurOptions::Occlusion: blurOcclusion = optionGetOcclusion (); blurReset (); cScreen->damageScreen (); break; default: break; } return rv; } BlurScreen::BlurScreen (CompScreen *screen) : PluginClassHandler (screen), gScreen (GLScreen::get (screen)), cScreen (CompositeScreen::get (screen)), moreBlur (false), filterRadius (0), srcBlurFunctions (0), dstBlurFunctions (0), output (NULL), count (0), program (0), maxTemp (32), fbo (0), fboStatus (0) { blurAtom[BLUR_STATE_CLIENT] = XInternAtom (screen->dpy (), "_COMPIZ_WM_WINDOW_BLUR", 0); blurAtom[BLUR_STATE_DECOR] = XInternAtom (screen->dpy (), DECOR_BLUR_ATOM_NAME, 0); blurTime = 1000.0f / optionGetBlurSpeed (); blurOcclusion = optionGetOcclusion (); for (int i = 0; i < 2; i++) texture[i] = 0; glGetIntegerv (GL_STENCIL_BITS, &stencilBits); if (!stencilBits) compLogMessage ("blur", CompLogLevelWarn, "No stencil buffer. Region based blur disabled"); /* We need GL_ARB_fragment_program for blur */ if (GL::fragmentProgram) alphaBlur = optionGetAlphaBlur (); else alphaBlur = false; if (GL::fragmentProgram) { int tmp[4]; GL::getProgramiv (GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, tmp); maxTemp = tmp[0]; } updateFilterRadius (); optionSetPulseInitiate (blurPulse); ScreenInterface::setHandler (screen, true); CompositeScreenInterface::setHandler (cScreen, true); GLScreenInterface::setHandler (gScreen, true); } BlurScreen::~BlurScreen () { foreach (BlurFunction &bf, srcBlurFunctions) GLFragment::destroyFragmentFunction (bf.id); foreach (BlurFunction &bf, dstBlurFunctions) GLFragment::destroyFragmentFunction (bf.id); cScreen->damageScreen (); if (fbo) (*GL::deleteFramebuffers) (1, &fbo); for (int i = 0; i < 2; i++) if (texture[i]) glDeleteTextures (1, &texture[i]); } BlurWindow::BlurWindow (CompWindow *w) : PluginClassHandler (w), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), bScreen (BlurScreen::get (screen)), blur (0), pulse (false), focusBlur (false) { for (int i = 0; i < BLUR_STATE_NUM; i++) { state[i].threshold = 0; state[i].clipped = false; state[i].active = false; propSet[i] = false; } update (BLUR_STATE_CLIENT); update (BLUR_STATE_DECOR); updateMatch (); WindowInterface::setHandler (window, true); GLWindowInterface::setHandler (gWindow, true); } BlurWindow::~BlurWindow () { } bool BlurPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/blur/src/blur.h0000644000015301777760000001322312321343002022024 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "blur_options.h" #include #include #include #include #include #include #include #include extern const unsigned short BLUR_GAUSSIAN_RADIUS_MAX; struct BlurFunction { GLFragment::FunctionId id; int target; int param; int unit; int startTC; int numITC; }; struct BlurBox { decor_point_t p1; decor_point_t p2; }; extern const unsigned short BLUR_STATE_CLIENT; extern const unsigned short BLUR_STATE_DECOR; extern const unsigned short BLUR_STATE_NUM; struct BlurState { int threshold; std::vector box; bool active; bool clipped; }; class BlurScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler, public BlurOptions { public: BlurScreen (CompScreen *screen); ~BlurScreen (); bool setOption (const CompString &name, CompOption::Value &value); void handleEvent (XEvent *); virtual void matchExpHandlerChanged (); virtual void matchPropertyChanged (CompWindow *window); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void updateFilterRadius (); void blurReset (); GLFragment::FunctionId getSrcBlurFragmentFunction (GLTexture *, int); GLFragment::FunctionId getDstBlurFragmentFunction (GLTexture *texture, int param, int unit, int numITC, int startTC); bool projectVertices (CompOutput *output, const GLMatrix &transform, const float *object, float *scr, int n); bool loadFragmentProgram (GLuint *program, const char *string); bool loadFilterProgram (int numITC); bool fboPrologue (); void fboEpilogue (); bool fboUpdate (BoxPtr pBox, int nBox); public: GLScreen *gScreen; CompositeScreen *cScreen; Atom blurAtom[BLUR_STATE_NUM]; bool alphaBlur; int blurTime; bool moreBlur; bool blurOcclusion; int filterRadius; std::vector srcBlurFunctions; std::vector dstBlurFunctions; CompRegion region; CompRegion tmpRegion; CompRegion tmpRegion2; CompRegion tmpRegion3; CompRegion occlusion; CompRect stencilBox; GLint stencilBits; CompOutput *output; int count; GLuint texture[2]; GLenum target; float tx; float ty; int width; int height; GLuint program; int maxTemp; GLuint fbo; bool fboStatus; float amp[BLUR_GAUSSIAN_RADIUS_MAX]; float pos[BLUR_GAUSSIAN_RADIUS_MAX]; int numTexop; GLMatrix mvp; }; class BlurWindow : public WindowInterface, public GLWindowInterface, public PluginClassHandler { public: BlurWindow (CompWindow *window); ~BlurWindow (); void resizeNotify (int dx, int dy, int dwidth, int dheight); void moveNotify (int dx, int dy, bool immediate); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); bool glDraw (const GLMatrix &, GLFragment::Attrib &, const CompRegion &, unsigned int); void glDrawTexture (GLTexture *texture, GLFragment::Attrib &, unsigned int); void updateRegion (); void setBlur (int state, int threshold, std::vector box); void updateAlphaMatch (); void updateMatch (); void update (int state); void projectRegion (CompOutput *output, const GLMatrix &transform); bool updateDstTexture (const GLMatrix &transform, CompRect *pExtents, int clientThreshold); public: CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; BlurScreen *bScreen; int blur; bool pulse; bool focusBlur; BlurState state[BLUR_STATE_NUM]; bool propSet[BLUR_STATE_NUM]; CompRegion region; CompRegion clip; }; #define BLUR_SCREEN(s) \ BlurScreen *bs = BlurScreen::get (s) #define BLUR_WINDOW(w) \ BlurWindow *bw = BlurWindow::get (w) class BlurPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/rotate/0000755000015301777760000000000012321344021020453 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/rotate/rotate.xml.in0000644000015301777760000002237012321343002023102 0ustar pbusernogroup00000000000000 <_short>Rotate Cube <_long>Rotate desktop cube Desktop cube cube decor <_short>Additional Settings <_short>Bindings <_short>Rotate cube <_short>Rotate to cube face <_short>Rotate to cube face with window compiz-0.9.11+14.04.20140409/plugins/rotate/CMakeLists.txt0000644000015301777760000000015612321343002023213 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(rotate PLUGINDEPS composite opengl cube)compiz-0.9.11+14.04.20140409/plugins/rotate/src/0000755000015301777760000000000012321344021021242 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/rotate/src/rotate.h0000644000015301777760000001143212321343002022710 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _ROTATE_H #define _ROTATE_H #include #include #include #include #include #include "rotate_options.h" #define ROTATE_SCREEN(s) RotateScreen *rs = RotateScreen::get(s) #define ROTATE_WINDOW(w) RotateWindow *rw = RotateWindow::get(w) class RotateScreen : public PluginClassHandler, public GLScreenInterface, public CompositeScreenInterface, public CubeScreenInterface, public ScreenInterface, public RotateOptions { public: RotateScreen (CompScreen *s); ~RotateScreen () {}; bool setOption (const CompString &name, CompOption::Value &value); void handleEvent (XEvent *event); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void cubeGetRotation (float &x, float &v, float &progress); bool adjustVelocity (int size, int invert); void releaseMoveWindow (); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector &options); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector &options); bool rotate (CompAction *action, CompAction::State state, CompOption::Vector &options, int direction); bool rotateWithWindow (CompAction *action, CompAction::State state, CompOption::Vector &options, int direction); bool rotateFlip (int direction); bool rotateEdgeFlip (CompAction *action, CompAction::State state, CompOption::Vector &options, int direction); bool flipTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options); int rotateToDirection (int face); bool rotateTo (CompAction *action, CompAction::State state, CompOption::Vector &options, int face, bool withWindow); public: GLScreen *gScreen; CompositeScreen *cScreen; CubeScreen *cubeScreen; float mPointerSensitivity; bool mSnapTop; bool mSnapBottom; CompScreen::GrabHandle mGrabIndex; GLfloat mXrot, mXVelocity; GLfloat mYrot, mYVelocity; GLfloat mBaseXrot; bool mMoving; GLfloat mMoveTo; Window mMoveWindow; int mMoveWindowX; CompPoint mSavedPointer; bool mGrabbed; CompTimer mRotateTimer; bool mSlow; unsigned int mGrabMask; CompWindow *mGrabWindow; float mProgress; float mProgressVelocity; GLfloat mZoomTranslate; }; class RotateWindow : public PluginClassHandler, public WindowInterface { public: RotateWindow (CompWindow *w); ~RotateWindow () {}; void grabNotify (int x, int y, unsigned int state, unsigned int mask); void ungrabNotify (); void activate (); public: CompWindow *window; RotateScreen *rScreen; }; class RotatePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #endif compiz-0.9.11+14.04.20140409/plugins/rotate/src/rotate.cpp0000644000015301777760000006464212321343002023256 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "rotate.h" #include #include static const float ROTATE_POINTER_SENSITIVITY_FACTOR = 0.05f; COMPIZ_PLUGIN_20090315 (rotate, RotatePluginVTable) bool RotateScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = RotateOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case RotateOptions::Sensitivity: mPointerSensitivity = optionGetSensitivity () * ROTATE_POINTER_SENSITIVITY_FACTOR; break; default: break; } return rv; } bool RotateScreen::adjustVelocity (int size, int invert) { float xrot; if (mMoving) xrot = mMoveTo + (mXrot + mBaseXrot); else { xrot = mXrot; if (mXrot < -180.0f / size) xrot = 360.0f / size + mXrot; else if (mXrot > 180.0f / size) xrot = mXrot - 360.0f / size; } float adjust = -xrot * 0.05f * optionGetAcceleration (); float amount = fabs (xrot); if (amount < 10.0f) amount = 10.0f; else if (amount > 30.0f) amount = 30.0f; if (mSlow) adjust *= 0.05f; mXVelocity = (amount * mXVelocity + adjust) / (amount + 2.0f); float yrot = mYrot; /* Only snap if more than 2 viewports */ if (size > 2) { if (mYrot > 50.0f && ((mSnapTop && invert == 1) || (mSnapBottom && invert != 1))) yrot -= 90.f; else if (mYrot < -50.0f && ((mSnapTop && invert != 1) || (mSnapBottom && invert == 1))) yrot += 90.f; } adjust = -yrot * 0.05f * optionGetAcceleration (); amount = fabs (mYrot); if (amount < 10.0f) amount = 10.0f; else if (amount > 30.0f) amount = 30.0f; mYVelocity = (amount * mYVelocity + adjust) / (amount + 2.0f); return (fabs (xrot) < 0.1f && fabs (mXVelocity) < 0.2f && fabs (yrot) < 0.1f && fabs (mYVelocity) < 0.2f); } void RotateScreen::releaseMoveWindow () { mMoveWindow = None; } void RotateScreen::preparePaint (int msSinceLastPaint) { float oldXrot = mXrot + mBaseXrot; if (mGrabIndex || mMoving) { float amount = msSinceLastPaint * 0.05f * optionGetSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; while (steps--) { mXrot += mXVelocity * chunk; mYrot += mYVelocity * chunk; if (mXrot > 360.0f / screen->vpSize ().width ()) { mBaseXrot += 360.0f / screen->vpSize ().width (); mXrot -= 360.0f / screen->vpSize ().width (); } else if (mXrot < 0.0f) { mBaseXrot -= 360.0f / screen->vpSize ().width (); mXrot += 360.0f / screen->vpSize ().width (); } if (cubeScreen->invert () == -1) { if (mYrot > 45.0f) { mYVelocity = 0.0f; mYrot = 45.0f; } else if (mYrot < -45.0f) { mYVelocity = 0.0f; mYrot = -45.0f; } } else { if (mYrot > 100.0f) { mYVelocity = 0.0f; mYrot = 100.0f; } else if (mYrot < -100.0f) { mYVelocity = 0.0f; mYrot = -100.0f; } } if (mGrabbed) { mXVelocity /= 1.25f; mYVelocity /= 1.25f; if (fabs (mXVelocity) < 0.01f) mXVelocity = 0.0f; if (fabs (mYVelocity) < 0.01f) mYVelocity = 0.0f; } else if (adjustVelocity (screen->vpSize ().width (), cubeScreen->invert ())) { mXVelocity = 0.0f; mYVelocity = 0.0f; if (fabs (mYrot) < 0.1f) { CompOption::Vector o (0); int tx; float xrot = mBaseXrot + mXrot; if (xrot < 0.0f) tx = (screen->vpSize ().width () * xrot / 360.0f) - 0.5f; else tx = (screen->vpSize ().width () * xrot / 360.0f) + 0.5f; /* flag end of rotation */ cubeScreen->rotationState (CubeScreen::RotationNone); screen->moveViewport (tx, 0, true); mBaseXrot = mMoveTo = mXrot = mYrot = 0.0f; mMoving = false; if (mGrabIndex) { screen->removeGrab (mGrabIndex, &mSavedPointer); mGrabIndex = 0; } if (mMoveWindow) { CompWindow *w = screen->findWindow (mMoveWindow); if (w) w->move (mMoveWindowX - w->x (), 0); } /* only focus default window if switcher isn't active */ else if (!screen->grabExist ("switcher")) screen->focusDefaultWindow (); mMoveWindow = 0; screen->handleCompizEvent ("rotate", "end_viewport_switch", o); } break; } } if (mMoveWindow) { CompWindow *w = screen->findWindow (mMoveWindow); if (w) { float xrot = (screen->vpSize ().width () * (mBaseXrot + mXrot)) / 360.0f; w->moveToViewportPosition (mMoveWindowX - xrot * screen->width (), w->y (), false); } } } if (mMoving) { if (fabs (mXrot + mBaseXrot + mMoveTo) <= 180 / screen->vpSize ().width ()) mProgress = fabs (mXrot + mBaseXrot + mMoveTo) / 180 / screen->vpSize ().width (); else if (fabs (mXrot + mBaseXrot) <= 180 / screen->vpSize ().width ()) mProgress = fabs (mXrot + mBaseXrot) / 180 / screen->vpSize ().width (); else { mProgress += fabs (mXrot + mBaseXrot - oldXrot) / 180 / (screen->vpSize ().width ()); mProgress = MIN (mProgress, 1.0); } } else if (mProgress != 0.0f || mGrabbed) { float amount = msSinceLastPaint * 0.05f * optionGetSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; while (steps--) { float dt; if (mGrabbed) dt = 1.0 - mProgress; else dt = 0.0f - mProgress; float adjust = dt * 0.15f; float tamount = fabs (dt) * 1.5f; if (tamount < 0.2f) tamount = 0.2f; else if (tamount > 2.0f) tamount = 2.0f; mProgressVelocity = (tamount * mProgressVelocity + adjust) / (tamount + 1.0f); mProgress += mProgressVelocity * chunk; if (fabs (dt) < 0.01f && fabs (mProgressVelocity) < 0.0001f) { if (mGrabbed) mProgress = 1.0f; else mProgress = 0.0f; break; } } } if (cubeScreen->invert () == 1 && !cubeScreen->unfolded ()) mZoomTranslate = optionGetZoom () * mProgress; else mZoomTranslate = 0.0; cScreen->preparePaint (msSinceLastPaint); } void RotateScreen::donePaint () { if ((mGrabIndex || mMoving || (mProgress != 0.0 && mProgress != 1.0)) && ((!mGrabbed && !mSnapTop && !mSnapBottom) || mXVelocity || mYVelocity || mProgressVelocity)) cScreen->damageScreen (); cScreen->donePaint (); } void RotateScreen::cubeGetRotation (float &x, float &v, float &progress) { cubeScreen->cubeGetRotation (x, v, progress); x += mBaseXrot + mXrot; v += mYrot; progress = MAX (progress, mProgress); } bool RotateScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (mGrabIndex || mMoving || mProgress != 0.0f) { GLMatrix sTransform = transform; sTransform.translate (0.0f, 0.0f, -mZoomTranslate); mask &= ~PAINT_SCREEN_REGION_MASK; mask |= PAINT_SCREEN_TRANSFORMED_MASK; return gScreen->glPaintOutput (sAttrib, sTransform, region, output, mask); } return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } bool RotateScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompOption::Vector o (0); if (screen->vpSize ().width () < 2) return false; if (mRotateTimer.active () && mGrabWindow) { if (screen->otherGrabExist ("rotate", "move", NULL)) return false; } else if (screen->otherGrabExist ("rotate", "switcher", "cube", NULL)) return false; mMoving = false; mSlow = false; /* Set the rotation state for cube - if action is non-NULL, * we set it to manual (as we were called from the 'Initiate * Rotation' binding. Otherwise, we set it to Change. */ if (action) cubeScreen->rotationState (CubeScreen::RotationManual); else cubeScreen->rotationState (CubeScreen::RotationChange); screen->handleCompizEvent ("rotate", "start_viewport_switch", o); if (!mGrabIndex) { mGrabIndex = screen->pushGrab (screen->invisibleCursor (), "rotate"); if (mGrabIndex) { int x = CompOption::getIntOptionNamed (options, "x"); int y = CompOption::getIntOptionNamed (options, "y"); mSavedPointer.set (x, y); } } if (mGrabIndex) { mMoveTo = 0.0f; mGrabbed = true; mSnapTop = optionGetSnapTop (); mSnapBottom = optionGetSnapBottom (); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); } return true; } bool RotateScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root"); if ((!xid || screen->root () == xid) && mGrabIndex) { if (!xid) { mSnapTop = false; mSnapBottom = false; } mGrabbed = false; cScreen->damageScreen (); } action->setState (action->state () & ~(CompAction::StateTermButton | CompAction::StateTermKey)); return false; } bool RotateScreen::rotate (CompAction *action, CompAction::State state, CompOption::Vector &options, int direction) { if (screen->vpSize ().width () < 2 || !direction || screen->otherGrabExist ("rotate", "move", "switcher", "group-drag", "cube", NULL)) return false; if (mMoveWindow) releaseMoveWindow (); /* we allow the grab to fail here so that we can rotate on drag-and-drop */ if (!mGrabIndex) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (CompOption::getIntOptionNamed (options, "x", 0)); o[2].value ().set (CompOption::getIntOptionNamed (options, "y", 0)); initiate (NULL, 0, o); } mMoving = true; mMoveTo += 360.0f / screen->vpSize ().width () * direction; mGrabbed = false; cScreen->damageScreen (); return false; } bool RotateScreen::rotateWithWindow (CompAction *action, CompAction::State state, CompOption::Vector &options, int direction) { if (screen->vpSize ().width () < 2 || !direction) return false; Window xid = CompOption::getIntOptionNamed (options, "window"); if (mMoveWindow != xid) { releaseMoveWindow (); if (!mGrabIndex && !mMoving) { CompWindow *w = screen->findWindow (xid); if (w && !(w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) && !(w->state () & CompWindowStateStickyMask)) { mMoveWindow = w->id (); mMoveWindowX = w->x (); if (optionGetRaiseOnRotate ()) w->raise (); } } } if (!mGrabIndex) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (CompOption::getIntOptionNamed (options, "x", 0)); o[2].value ().set (CompOption::getIntOptionNamed (options, "y", 0)); initiate (NULL, 0, o); } if (mGrabIndex) { mMoving = true; mMoveTo += 360.0f / screen->vpSize ().width () * direction; mGrabbed = false; cScreen->damageScreen (); } return false; } bool RotateScreen::rotateFlip (int direction) { if (screen->otherGrabExist ("rotate", "move", "group-drag", NULL)) return false; CompOption::Vector o (0); mMoveTo = 0.0f; mSlow = false; int warpX = pointerX - (screen->width () * direction); if (direction == -1) screen->warpPointer (screen->width () - 10, 0); else screen->warpPointer (10 - screen->width (), 0); lastPointerX = warpX; o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (0); o[2].value ().set (pointerY); rotate (NULL, 0, o, direction); XWarpPointer (screen->dpy (), None, None, 0, 0, 0, 0, direction, 0); mSavedPointer.setX (lastPointerX + (9 * direction)); return false; } bool RotateScreen::rotateEdgeFlip (CompAction *action, CompAction::State state, CompOption::Vector &options, int direction) { CompOption::Vector o (0); if (screen->vpSize ().width () < 2 || screen->otherGrabExist ("rotate", "move", "group-drag", NULL)) return false; if (state & CompAction::StateInitEdgeDnd) { if (!optionGetEdgeFlipDnd ()) return false; } else if (screen->otherGrabExist ("rotate", "group-drag", NULL)) { if (!optionGetEdgeFlipWindow () || !mGrabWindow || /* bail out if window is horizontally maximized, fullscreen * or sticky */ mGrabWindow->state () & (CompWindowStateMaximizedHorzMask | CompWindowStateFullscreenMask | CompWindowStateStickyMask)) return false; } else if (screen->otherGrabExist ("rotate", NULL)) { /* in that case, 'group-drag' must be the active screen grab */ if (!optionGetEdgeFlipWindow ()) return false; } else if (!optionGetEdgeFlipPointer ()) return false; o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (CompOption::getIntOptionNamed (options, "x", 0)); o[2].value ().set (CompOption::getIntOptionNamed (options, "y", 0)); if (optionGetFlipTime () == 0 || (mMoving && !mSlow)) { int pointerDx = pointerX - lastPointerX; int warpX; /* TODO: Eliminate those magic numbers here */ if (direction == -1) { warpX = pointerX + screen->width (); screen->warpPointer (screen->width () - 10, 0); lastPointerX = warpX - pointerDx; rotate (NULL, 0, o, direction); XWarpPointer (screen->dpy (), None, None, 0, 0, 0, 0, -1, 0); mSavedPointer.setX (lastPointerX - 9); } else { warpX = pointerX - screen->width (); screen->warpPointer (10 - screen->width (), 0); lastPointerX = warpX - pointerDx; rotate (NULL, 0, o, direction); XWarpPointer (screen->dpy (), None, None, 0, 0, 0, 0, 1, 0); mSavedPointer.setX (lastPointerX + 9); } } else { if (!mRotateTimer.active ()) mRotateTimer.start (boost::bind (&RotateScreen::rotateFlip, this, direction), optionGetFlipTime (), (float) optionGetFlipTime () * 1.2); mMoving = true; mMoveTo += 360.0f / screen->vpSize ().width () * direction; mSlow = true; if (state & CompAction::StateInitEdge) action->setState (action->state () | CompAction::StateTermEdge); if (state & CompAction::StateInitEdgeDnd) action->setState (action->state () | CompAction::StateTermEdgeDnd); cScreen->damageScreen (); } return false; } bool RotateScreen::flipTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root", 0); if (xid && screen->root () != xid) return false; if (mRotateTimer.active ()) { mRotateTimer.stop (); if (mSlow) { mMoveTo = 0.0f; mSlow = false; } cScreen->damageScreen (); } action->setState (action->state () & ~(CompAction::StateTermEdge | CompAction::StateTermEdgeDnd)); return false; } int RotateScreen::rotateToDirection (int face) { int delta = face - screen->vp ().x () - (mMoveTo / (360.0f / screen->vpSize ().width ())); if (delta > screen->vpSize ().width () / 2) delta -= screen->vpSize ().width (); else if (delta < -(screen->vpSize ().width () / 2)) delta += screen->vpSize ().width (); return delta; } bool RotateScreen::rotateTo (CompAction *action, CompAction::State state, CompOption::Vector &options, int face, bool withWindow) { CompOption::Vector o (0); if (face < 0) face = CompOption::getIntOptionNamed (options, "face", screen->vp ().x ()); if (face > screen->vpSize ().width ()) return false; o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (CompOption::getIntOptionNamed (options, "x", pointerX)); o[2].value ().set (CompOption::getIntOptionNamed (options, "y", pointerY)); if (withWindow) { o.push_back (CompOption ("window", CompOption::TypeInt)); o[3].value ().set (CompOption::getIntOptionNamed (options, "window", 0)); rotateWithWindow (NULL, 0, o, rotateToDirection (face)); } else rotate (NULL, 0, o, rotateToDirection (face)); return false; } void RotateScreen::handleEvent (XEvent *event) { switch (event->type) { case MotionNotify: if (screen->root () == event->xmotion.root && mGrabIndex) { if (mGrabbed) { GLfloat pointerDx = pointerX - lastPointerX; GLfloat pointerDy = pointerY - lastPointerY; // TODO: Eliminate magic numbers here if (event->xmotion.x_root < 50 || event->xmotion.y_root < 50 || event->xmotion.x_root > screen->width () - 50 || event->xmotion.y_root > screen->height () - 50) screen->warpPointer ((screen->width () / 2) - pointerX, (screen->height () / 2) - pointerY); if (optionGetInvertY ()) pointerDy = -pointerDy; mXVelocity += pointerDx * mPointerSensitivity * cubeScreen->invert (); mYVelocity += pointerDy * mPointerSensitivity; cScreen->damageScreen (); } else { mSavedPointer.setX (mSavedPointer.x () + pointerX - lastPointerX); mSavedPointer.setY (mSavedPointer.y () + pointerY - lastPointerY); } } break; case ClientMessage: if (event->xclient.message_type == Atoms::desktopViewport) { if (screen->root () == event->xclient.window) { if (screen->otherGrabExist ("rotate", "switcher", "cube", NULL)) break; /* reset movement */ mMoveTo = 0.0f; int dx = (event->xclient.data.l[0] / screen->width ()) - screen->vp ().x (); if (dx) { Window win; int i, x, y; unsigned int ui; CompOption::Vector o (0); XQueryPointer (screen->dpy (), screen->root (), &win, &win, &x, &y, &i, &i, &ui); if (dx * 2 > screen->vpSize ().width ()) dx -= screen->vpSize ().width (); else if (dx * 2 < -screen->vpSize ().width ()) dx += screen->vpSize ().width (); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (x); o[2].value ().set (y); rotate (NULL, 0, o, dx); } } } break; default: break; } screen->handleEvent (event); } void RotateWindow::activate () { if (window->placed () && !screen->otherGrabExist ("rotate", "switcher", "cube", NULL)) { /* reset movement */ rScreen->mMoveTo = 0.0f; int dx = window->defaultViewport ().x (); dx -= screen->vp ().x (); if (dx) { Window win; int i, x, y; unsigned int ui; CompOption::Vector o (0); XQueryPointer (screen->dpy (), screen->root (), &win, &win, &x, &y, &i, &i, &ui); if (dx * 2 > screen->vpSize ().width ()) dx -= screen->vpSize ().width (); else if (dx * 2 < -screen->vpSize ().width ()) dx += screen->vpSize ().width (); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (x); o[2].value ().set (y); rScreen->rotate (NULL, 0, o, dx); } } window->activate (); } void RotateWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { if (!rScreen->mGrabWindow) { rScreen->mGrabMask = mask; rScreen->mGrabWindow = window; } window->grabNotify (x, y, state, mask); } void RotateWindow::ungrabNotify () { if (window == rScreen->mGrabWindow) { rScreen->mGrabMask = 0; rScreen->mGrabWindow = NULL; } window->ungrabNotify (); } RotateScreen::RotateScreen (CompScreen *s) : PluginClassHandler (s), gScreen (GLScreen::get (s)), cScreen (CompositeScreen::get (s)), cubeScreen (CubeScreen::get (s)), mSnapTop (false), mSnapBottom (false), mGrabIndex (0), mXrot (0.0f), mXVelocity (0.0f), mYrot (0.0f), mYVelocity (0.0f), mBaseXrot (0.0f), mMoving (false), mMoveTo (0.0f), mMoveWindow (0), mMoveWindowX (0), mSavedPointer (0,0), mGrabbed (false), mSlow (false), mGrabMask (0), mGrabWindow (0), mProgress (0.0f), mProgressVelocity (0.0f), mZoomTranslate (0.0f) { mPointerSensitivity = optionGetSensitivity () * ROTATE_POINTER_SENSITIVITY_FACTOR; #define ROTATEBIND(name) boost::bind (&RotateScreen::name, this, _1, _2, _3) #define ROTATEBINDOPT(name, ...) boost::bind (&RotateScreen::name, this, _1, _2, _3, __VA_ARGS__) optionSetInitiateButtonInitiate (ROTATEBIND (initiate)); optionSetInitiateButtonTerminate (ROTATEBIND (terminate)); optionSetRotateLeftKeyInitiate (ROTATEBINDOPT (rotate, -1)); optionSetRotateLeftButtonInitiate (ROTATEBINDOPT (rotate, -1)); optionSetRotateRightKeyInitiate (ROTATEBINDOPT (rotate, 1)); optionSetRotateRightButtonInitiate (ROTATEBINDOPT (rotate, 1)); optionSetRotateLeftWindowKeyInitiate (ROTATEBINDOPT (rotateWithWindow, -1)); optionSetRotateLeftWindowButtonInitiate (ROTATEBINDOPT (rotateWithWindow, -1)); optionSetRotateRightWindowKeyInitiate (ROTATEBINDOPT (rotateWithWindow, 1)); optionSetRotateRightWindowButtonInitiate (ROTATEBINDOPT (rotateWithWindow, 1)); optionSetRotateTo1KeyInitiate (ROTATEBINDOPT(rotateTo, 0, false)); optionSetRotateTo2KeyInitiate (ROTATEBINDOPT(rotateTo, 1, false)); optionSetRotateTo3KeyInitiate (ROTATEBINDOPT(rotateTo, 2, false)); optionSetRotateTo4KeyInitiate (ROTATEBINDOPT(rotateTo, 3, false)); optionSetRotateTo5KeyInitiate (ROTATEBINDOPT(rotateTo, 4, false)); optionSetRotateTo6KeyInitiate (ROTATEBINDOPT(rotateTo, 5, false)); optionSetRotateTo7KeyInitiate (ROTATEBINDOPT(rotateTo, 6, false)); optionSetRotateTo8KeyInitiate (ROTATEBINDOPT(rotateTo, 7, false)); optionSetRotateTo9KeyInitiate (ROTATEBINDOPT(rotateTo, 8, false)); optionSetRotateTo10KeyInitiate (ROTATEBINDOPT(rotateTo, 9, false)); optionSetRotateTo11KeyInitiate (ROTATEBINDOPT(rotateTo, 10, false)); optionSetRotateTo12KeyInitiate (ROTATEBINDOPT(rotateTo, 11, false)); optionSetRotateTo1WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 0, true)); optionSetRotateTo2WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 1, true)); optionSetRotateTo3WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 2, true)); optionSetRotateTo4WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 3, true)); optionSetRotateTo5WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 4, true)); optionSetRotateTo6WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 5, true)); optionSetRotateTo7WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 6, true)); optionSetRotateTo8WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 7, true)); optionSetRotateTo9WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 8, true)); optionSetRotateTo10WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 9, true)); optionSetRotateTo11WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 10, true)); optionSetRotateTo12WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 11, true)); optionSetRotateToKeyInitiate (ROTATEBINDOPT(rotateTo, -1, false)); optionSetRotateWindowKeyInitiate (ROTATEBINDOPT(rotateTo, -1, true)); optionSetRotateFlipLeftEdgeInitiate (ROTATEBINDOPT(rotateEdgeFlip, -1)); optionSetRotateFlipLeftEdgeTerminate (ROTATEBIND (flipTerminate)); optionSetRotateFlipRightEdgeInitiate (ROTATEBINDOPT(rotateEdgeFlip, 1)); optionSetRotateFlipRightEdgeTerminate (ROTATEBIND (flipTerminate)); #undef ROTATEBIND #undef ROTATEBINDOPT ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); CubeScreenInterface::setHandler (cubeScreen); } RotateWindow::RotateWindow (CompWindow *w) : PluginClassHandler (w), window (w), rScreen (RotateScreen::get (screen)) { WindowInterface::setHandler (window); } bool RotatePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("cube", COMPIZ_CUBE_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/snap/0000755000015301777760000000000012321344021020116 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/snap/snap.xml.in0000644000015301777760000000462612321343002022214 0ustar pbusernogroup00000000000000 <_short>Snapping Windows <_long>Enables windows edges resistance Window Management edgeresistance opengl composite decor <_short>Bindings <_short>Behaviour compiz-0.9.11+14.04.20140409/plugins/snap/CMakeLists.txt0000644000015301777760000000011512321343002022651 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (snap) compiz-0.9.11+14.04.20140409/plugins/snap/src/0000755000015301777760000000000012321344021020705 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/snap/src/snap.h0000644000015301777760000001042312321343002022015 0ustar pbusernogroup00000000000000/* * Compiz snap plugin * Author : Guillaume "iXce" Seguin * Email : ixce@beryl-project.org * * Ported to compiz by : Patrick "marex" Niklaus * Email : marex@beryl-project.org * * Ported to C++ by : Travis Watkins * Email : amaranth@ubuntu.com * * Copyright (C) 2009 Guillaume Seguin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include "snap_options.h" /* * The window we should snap too if snapping to windows */ #define SNAP_WINDOW_TYPE (CompWindowTypeNormalMask | \ CompWindowTypeToolbarMask | \ CompWindowTypeMenuMask | \ CompWindowTypeUtilMask) #define VerticalSnap (1L << 0) #define HorizontalSnap (1L << 1) #define MoveGrab (1L << 0) #define ResizeGrab (1L << 1) typedef enum { LeftEdge = 0, RightEdge, TopEdge, BottomEdge } EdgeType; /* Custom Edge struct * Position, start, end meanings are specific to type : * - LeftEdge/RightEdge : position : x, start/end : y1/y2 * - TopEdge/BottomEdge : position : y, start/end : x1/x2 * id/passed are used during visibility detection when adding edges * snapped is straight forward */ typedef struct { int position; int start; int end; EdgeType type; bool screenEdge; Window id; bool passed; bool snapped; } Edge; class SnapScreen : public ScreenInterface, public PluginClassHandler , public SnapOptions { public: bool snapping; SnapScreen (CompScreen *s); void handleEvent (XEvent *event); bool enableSnapping (CompAction *action, CompAction::State state, CompOption::Vector &options); bool disableSnapping (CompAction *action, CompAction::State state, CompOption::Vector &options); void optionChanged (CompOption *opt, SnapOptions::Options num); private: // used to allow moving windows without snapping int avoidSnapMask; }; class SnapWindow : public WindowInterface, public PluginClassHandler { public: SnapWindow (CompWindow *window); ~SnapWindow (); void resizeNotify (int dx, int dy, int dwidth, int dheight); void moveNotify (int dx, int dy, bool immediate); void grabNotify (int x, int y, unsigned int state, unsigned int mask); void stateChangeNotify (unsigned int lastState); void ungrabNotify (); private: CompWindow *window; // linked lists std::list edges; // bitfield int snapDirection; // dx/dy/dw/dh when a window is resisting to user int m_dx; int m_dy; int m_dwidth; int m_dheight; // internals CompWindow::Geometry snapGeometry; int grabbed; // internal, avoids infinite notify loops bool skipNotify; void move (int dx, int dy, bool sync); void resize (int dx, int dy, int dwidth, int dheight); void addEdge (Window id, int position, int start, int end, EdgeType type, bool screenEdge); void addRegionEdges (Edge *parent, CompRegion region); void updateWindowsEdges (); void updateScreenEdges (); void updateEdges (); void moveCheckNearestEdge (int position, int start, int end, bool before, EdgeType type, int snapDirection); void moveCheckEdges (int snapDirection); void resizeCheckNearestEdge (int position, int start, int end, bool before, EdgeType type, int snapDirection); void resizeCheckEdges (int dx, int dy, int dwidth, int dheight); }; #define SNAP_SCREEN(s) \ SnapScreen *ss = SnapScreen::get (s) #define SNAP_WINDOW(w) \ SnapWindow *sw = SnapWindow::get (w) class SnapPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/snap/src/snap.cpp0000644000015301777760000004571112321343002022360 0ustar pbusernogroup00000000000000/* * Compiz snap plugin * Author : Guillaume "iXce" Seguin * Email : ixce@beryl-project.org * * Ported to compiz by : Patrick "marex" Niklaus * Email : marex@beryl-project.org * * Ported to C++ by : Travis Watkins * Email : amaranth@ubuntu.com * * Copyright (C) 2009 Guillaume Seguin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * TODO * - Apply Edge Resistance to resize */ #include #include #include #include "snap.h" COMPIZ_PLUGIN_20090315 (snap, SnapPluginVTable); // helper functions /* * Wrapper functions to avoid infinite notify loops */ void SnapWindow::move (int dx, int dy, bool sync) { skipNotify = true; window->move (dx, dy, true); /* warp the pointer in the case of * snap release */ skipNotify = false; } void SnapWindow::resize (int dx, int dy, int dwidth, int dheight) { const CompWindow::Geometry &geometry = window->serverGeometry (); skipNotify = true; window->resize (geometry.x () + dx, geometry.y () + dy, geometry.width () + dwidth, geometry.height () + dheight, geometry.border ()); skipNotify = false; } void SnapWindow::addEdge (Window id, int position, int start, int end, EdgeType type, bool screenEdge) { Edge edge; edge.position = position; edge.start = start; edge.end = end; edge.type = type; edge.screenEdge = screenEdge; edge.snapped = false; edge.passed = false; edge.id = id; edges.push_back (edge); } /* * Add an edge for each rectangle of the region */ void SnapWindow::addRegionEdges (Edge *parent, CompRegion region) { int position, start, end; foreach (const CompRect &r, region.rects ()) { switch (parent->type) { case LeftEdge: case RightEdge: position = r.x1 (); start = r.y1 (); end = r.y2 (); break; case TopEdge: case BottomEdge: default: position = r.y1 (); start = r.x1 (); end = r.x2 (); } addEdge (parent->id, position, start, end, parent->type, parent->screenEdge); edges.back ().passed = parent->passed; } } /* Checks if a window is considered a snap window. If it's * not visible, returns false. If it's a panel and we're * snapping to screen edges, it's considered a snap-window. */ #define UNLIKELY(x) __builtin_expect(!!(x),0) static inline bool isSnapWindow (CompWindow *w) { SNAP_SCREEN (screen); if (UNLIKELY(!w)) return false; if (!w->isViewable ()) return false; if ((w->type () & SNAP_WINDOW_TYPE) && (ss->optionGetEdgesCategoriesMask () & EdgesCategoriesWindowEdgesMask)) return true; if (w->struts () && (ss->optionGetEdgesCategoriesMask () & EdgesCategoriesScreenEdgesMask)) return true; return false; } // Edges update functions ------------------------------------------------------ /* * Detect visible windows edges */ void SnapWindow::updateWindowsEdges () { CompRegion edgeRegion, resultRegion; CompRect input; bool remove = false; // First add all the windows foreach (CompWindow *w, screen->windows ()) { // Just check that we're not trying to snap to current window, // that the window is not invisible and of a valid type if (w == window || !isSnapWindow (w)) { continue; } input = w->serverBorderRect (); addEdge (w->id (), input.top (), input.left (), input.right (), TopEdge, false); addEdge (w->id (), input.bottom (), input.left (), input.right (), BottomEdge, false); addEdge (w->id (), input.left (), input.top (), input.bottom (), LeftEdge, false); addEdge (w->id (), input.right (), input.top (), input.bottom (), RightEdge, false); } // Now strip invisible edges // Loop through all the windows stack, and through all the edges // If an edge has been passed, check if it's in the region window, // if the edge is fully under the window, drop it, or if it's only // partly covered, cut it/split it in one/two smaller visible edges foreach (CompWindow *w, screen->windows ()) { if (w == window || !isSnapWindow (w)) continue; // can't use foreach here because we need the iterator for erase() for (std::list::iterator it = edges.begin (); it != edges.end (); ) { Edge *e = &*it; CompRect rect; if (!e->passed) { if (e->id == w->id ()) e->passed = true; ++it; continue; } switch (e->type) { case LeftEdge: case RightEdge: rect.setGeometry (e->position, e->start, 1, e->end - e->start); break; case TopEdge: case BottomEdge: default: rect.setGeometry (e->start, e->position, e->end - e->start, 1); } // If the edge is in the window region, remove it, // if it's partly in the region, split it edgeRegion = CompRegion (rect); resultRegion = edgeRegion - w->region (); if (resultRegion.isEmpty ()) { remove = true; } else if (edgeRegion != resultRegion) { addRegionEdges (e, resultRegion); remove = true; } if (remove) { it = edges.erase (it); remove = false; } else { ++it; } } } } /* * Loop on outputDevs and add the extents as edges * Note that left side is a right edge, right side a left edge, * top side a bottom edge and bottom side a top edge, * since they will be snapped as the right/left/bottom/top edge of a window */ void SnapWindow::updateScreenEdges () { CompRegion edgeRegion, resultRegion; bool remove = false; foreach (CompOutput output, screen->outputDevs ()) { const CompRect& area = output.workArea (); addEdge (0, area.top (), area.left (), area.right () - 1, BottomEdge, true); addEdge (0, area.bottom (), area.left (), area.right () - 1, TopEdge, true); addEdge (0, area.left (), area.top (), area.bottom () - 1, RightEdge, true); addEdge (0, area.right (), area.top (), area.bottom () - 1, LeftEdge, true); } // Drop screen edges parts that are under struts, basically apply the // same strategy than for windows edges visibility foreach (CompWindow *w, screen->windows ()) { if (w == window || !w->struts ()) continue; for (std::list::iterator it = edges.begin (); it != edges.end ();) { Edge *e = &*it; CompRect rect; if (!e->screenEdge) { ++it; continue; } switch (e->type) { case LeftEdge: case RightEdge: rect.setGeometry (e->position, e->start, 1, e->end - e->start); break; case TopEdge: case BottomEdge: default: rect.setGeometry (e->start, e->position, e->end - e->start, 1); } edgeRegion = CompRegion (rect); resultRegion = edgeRegion - w->region (); if (resultRegion.isEmpty ()) { remove = true; } else if (edgeRegion != resultRegion) { addRegionEdges (e, resultRegion); remove = true; } if (remove) { it = edges.erase (it); remove = false; } else { ++it; } } } } /* * Clean edges and fill it again with appropriate edges */ void SnapWindow::updateEdges () { SNAP_SCREEN (screen); edges.clear (); updateWindowsEdges (); if (ss->optionGetEdgesCategoriesMask () & EdgesCategoriesScreenEdgesMask) updateScreenEdges (); } // Edges checking functions (move) --------------------------------------------- /* * Find nearest edge in the direction set by "type", * w is the grabbed window, position/start/end are the window edges coordinates * before : if true the window has to be before the edge (top/left being origin) * snapDirection : just an helper, related to type */ void SnapWindow::moveCheckNearestEdge (int position, int start, int end, bool before, EdgeType type, int snapDirection) { SNAP_SCREEN (screen); Edge *edge = &edges.front (); int dist, min = 65535; foreach (Edge ¤t, edges) { // Skip wrong type or outbound edges if (current.type != type || current.end < start || current.start > end) continue; // Compute distance dist = before ? position - current.position : current.position - position; // Update minimum distance if needed if (dist < min && dist >= 0) { min = dist; edge = ¤t; } // 0-dist edge, just break if (dist == 0) break; // Unsnap edges that aren't snapped anymore if (current.snapped && dist > ss->optionGetResistanceDistance ()) current.snapped = false; } // We found a 0-dist edge, or we have a snapping candidate if (min == 0 || (min <= ss->optionGetAttractionDistance () && ss->optionGetSnapTypeMask () & SnapTypeEdgeAttractionMask)) { // Update snapping data if (ss->optionGetSnapTypeMask () & SnapTypeEdgeResistanceMask) { snapGeometry = window->serverGeometry (); this->snapDirection |= snapDirection; } // Attract the window if needed, moving it of the correct dist if (min != 0 && !edge->snapped) { edge->snapped = true; switch (type) { case LeftEdge: move (min, 0, false); break; case RightEdge: move (-min, 0, false); break; case TopEdge: move (0, min, false); break; case BottomEdge: move (0, -min, false); break; default: break; } } } } /* * Call the previous function for each of the 4 sides of the window */ void SnapWindow::moveCheckEdges (int snapDirection) { CompRect input (window->serverBorderRect ()); moveCheckNearestEdge (input.left (), input.top (), input.bottom (), true, RightEdge, HorizontalSnap & snapDirection); moveCheckNearestEdge (input.right (), input.top (), input.bottom (), false, LeftEdge, HorizontalSnap & snapDirection); moveCheckNearestEdge (input.top (), input.left (), input.right (), true, BottomEdge, VerticalSnap & snapDirection); moveCheckNearestEdge (input.bottom (), input.left (), input.right (), false, TopEdge, VerticalSnap & snapDirection); } // Edges checking functions (resize) ------------------------------------------- /* * Similar function for Snap on Resize */ void SnapWindow::resizeCheckNearestEdge (int position, int start, int end, bool before, EdgeType type, int snapDirection) { SNAP_SCREEN (screen); Edge *edge = &edges.front (); int dist, min = 65535; foreach (Edge ¤t, edges) { // Skip wrong type or outbound edges if (current.type != type || current.end < start || current.start > end) continue; // Compute distance dist = before ? position - current.position : current.position - position; // Update minimum distance if needed if (dist < min && dist >= 0) { min = dist; edge = ¤t; } // 0-dist edge, just break if (dist == 0) break; // Unsnap edges that aren't snapped anymore if (current.snapped && dist > ss->optionGetResistanceDistance ()) current.snapped = false; } // We found a 0-dist edge, or we have a snapping candidate if (min == 0 || (min <= ss->optionGetAttractionDistance () && ss->optionGetSnapTypeMask () & SnapTypeEdgeAttractionMask)) { // Update snapping data if (ss->optionGetSnapTypeMask () & SnapTypeEdgeResistanceMask) { snapGeometry = window->serverGeometry (); this->snapDirection |= snapDirection; } // FIXME : this needs resize-specific code. // Attract the window if needed, moving it of the correct dist if (min != 0 && !edge->snapped) { edge->snapped = true; switch (type) { case LeftEdge: resize (min, 0, 0, 0); break; case RightEdge: resize (-min, 0, 0, 0); break; case TopEdge: resize (0, min, 0, 0); break; case BottomEdge: resize (0, -min, 0, 0); break; default: break; } } } } /* * Call the previous function for each of the 4 sides of the window */ void SnapWindow::resizeCheckEdges (int dx, int dy, int dwidth, int dheight) { CompRect input (window->serverBorderRect ()); resizeCheckNearestEdge (input.left (), input.top (), input.bottom (), true, RightEdge, HorizontalSnap); resizeCheckNearestEdge (input.right (), input.top (), input.bottom (), false, LeftEdge, HorizontalSnap); resizeCheckNearestEdge (input.top (), input.left (), input.right (), true, BottomEdge, VerticalSnap); resizeCheckNearestEdge (input.bottom (), input.left (), input.right (), false, TopEdge, VerticalSnap); } // Check if avoidSnap is matched, and enable/disable snap consequently void SnapScreen::handleEvent (XEvent *event) { if (event->type == screen->xkbEvent ()) { XkbAnyEvent *xkbEvent = (XkbAnyEvent *) event; if (xkbEvent->xkb_type == XkbStateNotify) { XkbStateNotifyEvent *stateEvent = (XkbStateNotifyEvent *) event; unsigned int mods = 0xffffffff; if (avoidSnapMask) mods = avoidSnapMask; if ((stateEvent->mods & mods) == mods) snapping = false; else snapping = true; } } screen->handleEvent (event); } // Events notifications -------------------------------------------------------- void SnapWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { SNAP_SCREEN (screen); window->resizeNotify (dx, dy, dwidth, dheight); // avoid-infinite-notify-loop mode/not grabbed if (skipNotify || !(grabbed & ResizeGrab)) return; // we have to avoid snapping but there's still some buffered moving if (!ss->snapping && (m_dx || m_dy || m_dwidth || m_dheight)) { resize (m_dx, m_dy, m_dwidth, m_dheight); m_dx = m_dy = m_dwidth = m_dheight = 0; return; } // avoiding snap, nothing buffered if (!ss->snapping) return; // If we don't already snap vertically and horizontally, // check edges status if (snapDirection != (VerticalSnap | HorizontalSnap)) resizeCheckEdges (dx, dy, dwidth, dheight); } void SnapWindow::stateChangeNotify (unsigned int lastState) { if (window->state () & CompWindowStateMaximizedHorzMask) { snapGeometry.setWidth (0); snapGeometry.setX (0); snapDirection &= VerticalSnap; } if (window->state () & CompWindowStateMaximizedVertMask) { snapGeometry.setHeight (0); snapGeometry.setY (0); snapDirection &= HorizontalSnap; } window->stateChangeNotify (lastState); } void SnapWindow::moveNotify (int dx, int dy, bool immediate) { unsigned int allowedSnapDirection = VerticalSnap | HorizontalSnap; SNAP_SCREEN (screen); window->moveNotify (dx, dy, immediate); // avoid-infinite-notify-loop mode/not grabbed if (skipNotify || !(grabbed & MoveGrab)) return; // we have to avoid snapping but there's still some buffered moving if (!ss->snapping && (m_dx || m_dy)) { move (m_dx, m_dy, false); m_dx = m_dy = 0; return; } dx = window->serverGeometry ().x () - snapGeometry.x (); dy = window->serverGeometry ().y () - snapGeometry.y (); // don't snap maximized windows if (window->state () & CompWindowStateMaximizedHorzMask) { allowedSnapDirection &= ~(VerticalSnap); dx = 0; } if (window->state () & CompWindowStateMaximizedVertMask) { allowedSnapDirection &= ~(HorizontalSnap); dy = 0; } // avoiding snap, nothing buffered if (!ss->snapping) return; // apply edge resistance if (ss->optionGetSnapTypeMask () & SnapTypeEdgeResistanceMask) { // If there's horizontal snapping, add dx to current buffered // dx and resist (move by -dx) or release the window and move // by buffered dx - dx if (!snapGeometry.isEmpty () && snapDirection & HorizontalSnap) { m_dx += dx; if (m_dx < ss->optionGetResistanceDistance () && m_dx > -ss->optionGetResistanceDistance ()) { move (-dx, 0, false); } else { move (m_dx - dx, 0, true); m_dx = 0; snapDirection &= VerticalSnap; } } // Same for vertical snapping and dy if (!snapGeometry.isEmpty () && snapDirection & VerticalSnap) { m_dy += dy; if (m_dy < ss->optionGetResistanceDistance () && m_dy > -ss->optionGetResistanceDistance ()) { move (0, -dy, false); } else { move (0, m_dy - dy, true); m_dy = 0; snapDirection &= HorizontalSnap; } } // If we are no longer snapping in any direction, reset snapped if (!snapGeometry.isEmpty () && !snapDirection) snapGeometry = CompWindow::Geometry (); } // If we don't already snap vertically and horizontally, // check edges status if (snapDirection != (VerticalSnap | HorizontalSnap)) moveCheckEdges (allowedSnapDirection); } /* * Initiate snap, get edges */ void SnapWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { grabbed = (mask & CompWindowGrabResizeMask) ? ResizeGrab : MoveGrab; updateEdges (); window->grabNotify (x, y, state, mask); } /* * Clean edges data, reset dx/dy to avoid buggy moves * when snap will be triggered again. */ void SnapWindow::ungrabNotify () { edges.clear (); snapGeometry = CompWindow::Geometry (); snapDirection = 0; grabbed = 0; m_dx = m_dy = m_dwidth = m_dheight = 0; window->ungrabNotify (); } // Internal stuff -------------------------------------------------------------- void SnapScreen::optionChanged (CompOption *opt, SnapOptions::Options num) { switch (num) { case SnapOptions::AvoidSnap: { unsigned int mask = optionGetAvoidSnapMask (); avoidSnapMask = 0; if (mask & AvoidSnapShiftMask) avoidSnapMask |= ShiftMask; if (mask & AvoidSnapAltMask) avoidSnapMask |= CompAltMask; if (mask & AvoidSnapControlMask) avoidSnapMask |= ControlMask; if (mask & AvoidSnapMetaMask) avoidSnapMask |= CompMetaMask; } default: break; } } SnapScreen::SnapScreen (CompScreen *screen) : PluginClassHandler (screen), SnapOptions (), snapping (true), avoidSnapMask (0) { ScreenInterface::setHandler (screen); #define setNotify(func) \ optionSet##func##Notify (boost::bind (&SnapScreen::optionChanged, this, _1, _2)) setNotify (AvoidSnap); } SnapWindow::SnapWindow (CompWindow *window) : PluginClassHandler (window), window (window), snapDirection (0), m_dx (0), m_dy (0), m_dwidth (0), m_dheight (0), snapGeometry (0, 0, 0, 0, 0), grabbed (0), skipNotify (false) { WindowInterface::setHandler (window); } SnapWindow::~SnapWindow () { } bool SnapPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/wall/0000755000015301777760000000000012321344021020114 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wall/wall.xml.in0000644000015301777760000003013312321343002022200 0ustar pbusernogroup00000000000000 <_short>Desktop Wall <_long>Desktop Wall Plugin Desktop largedesktop composite opengl decor wobbly fade opengl <_short>Viewport Switch Preview <_short>Background Gradient <_short>Thumb Gradient <_short>Highlight Gradient <_short>Arrow Colors <_short>Viewport Switching <_short>Bindings <_short>Move within wall <_short>Move with window within wall <_short>Edge flipping <_short>Viewport Switching <_short>Edge Flipping compiz-0.9.11+14.04.20140409/plugins/wall/CMakeLists.txt0000644000015301777760000000060312321343002022651 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) include (CompizDefaults) if (NOT COMPIZ_DISABLE_PLUGIN_WALL) add_subdirectory (src/offset_movement) include_directories (src/offset_movement/include) endif (NOT COMPIZ_DISABLE_PLUGIN_WALL) compiz_plugin (wall PLUGINDEPS composite opengl mousepoll PKGDEPS cairo cairo-xlib-xrender LIBRARIES compiz_wall_offset_movement dl) compiz-0.9.11+14.04.20140409/plugins/wall/src/0000755000015301777760000000000012321344021020703 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wall/src/wall.h0000644000015301777760000001135212321343002022013 0ustar pbusernogroup00000000000000/** * * Compiz wall plugin * * wall.h * * Copyright (c) 2006 Robert Carr * * Authors: * Robert Carr * Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include #include #include #include #include #include #include #include "offset-movement.h" #include "wall_options.h" /* enums */ typedef enum { NoTransformation, MiniScreen, Sliding } ScreenTransformation; /* FIXME: put into own class? */ typedef struct _WallCairoContext { Pixmap pixmap; GLTexture::List texture; cairo_surface_t *surface; cairo_t *cr; int width; int height; } WallCairoContext; /* classes */ class WallScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler , public WallOptions { public: enum Direction { Up = 0, Left, Down, Right, Next, Prev }; WallScreen (CompScreen *s); ~WallScreen (); void preparePaint (int); void paint (CompOutput::ptrList &, unsigned int); void donePaint (); void handleEvent (XEvent *event); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); bool setOptionForPlugin (const char *, const char *, CompOption::Value&); void matchExpHandlerChanged (); void matchPropertyChanged (CompWindow *); void createCairoContexts (bool); void setupCairoContext (WallCairoContext &); void destroyCairoContext (WallCairoContext &); void clearCairoLayer (cairo_t *); void drawSwitcherBackground (); void drawThumb (); void drawHighlight (); void drawArrow (); void drawCairoTextureOnScreen (const GLMatrix &transform); void releaseMoveWindow (); void computeTranslation (float &, float &); void determineMovementAngle (); bool checkDestination (unsigned int, unsigned int); void checkAmount (int, int, int &, int &); bool initiate (CompAction *, CompAction::State, CompOption::Vector &, Direction, bool); bool terminate (CompAction *, CompAction::State, CompOption::Vector &); bool initiateFlip (Direction, CompAction::State); bool moveViewport (int, int, Window); void optionChanged (CompOption *opt, WallOptions::Options num); void toggleEdges (bool); void positionUpdate (const CompPoint &pos); CompositeScreen *cScreen; GLScreen *glScreen; bool moving; /* Used to track miniview movement */ bool showPreview; float curPosX; float curPosY; unsigned int gotoX; unsigned int gotoY; int direction; /* >= 0 : direction arrow angle, < 0 : no direction */ int boxTimeout; unsigned int boxOutputDevice; CompScreen::GrabHandle grabIndex; int timer; Window moveWindow; bool focusDefault; ScreenTransformation transform; CompOutput *currOutput; GLWindowPaintAttrib mSAttribs; float mSzCamera; int firstViewportX; int firstViewportY; int viewportWidth; int viewportHeight; int viewportBorder; int moveWindowX; int moveWindowY; WallCairoContext switcherContext; WallCairoContext thumbContext; WallCairoContext highlightContext; WallCairoContext arrowContext; bool windowIsDragMoved; }; class WallWindow : public WindowInterface, public GLWindowInterface, public PluginClassHandler { public: WallWindow (CompWindow *); virtual void activate (); void grabNotify (int, int, unsigned int, unsigned int); void ungrabNotify (); void windowNotify (CompWindowNotify); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); CompWindow *window; GLWindow *glWindow; bool isSliding; }; #define WALL_SCREEN(s) \ WallScreen *ws = WallScreen::get (s) #define WALL_WINDOW(w) \ WallWindow *ww = WallWindow::get (w) class WallPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/wall/src/offset_movement/0000755000015301777760000000000012321344021024103 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wall/src/offset_movement/tests/0000755000015301777760000000000012321344021025245 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wall/src/offset_movement/tests/test-wall-offset-movement.cpp0000644000015301777760000000435012321343002033001 0ustar pbusernogroup00000000000000#include #include #include "offset-movement.h" class WallOffsetMovementTest : public ::testing::Test { }; TEST(WallOffsetMovementTest, TestOffsetRight) { CompRect sbr (750, 0, 500, 500); CompRegion sr (0, 0, 1000, 1000); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (-250, 0)); } TEST(WallOffsetMovementTest, TestOffsetLeft) { CompRect sbr (-250, 0, 500, 500); CompRegion sr (0, 0, 1000, 1000); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (250, 0)); } TEST(WallOffsetMovementTest, TestOffsetTop) { CompRect sbr (0, -250, 500, 500); CompRegion sr (0, 0, 1000, 1000); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (0, 250)); } TEST(WallOffsetMovementTest, TestOffsetBottom) { CompRect sbr (0, 750, 500, 500); CompRegion sr (0, 0, 1000, 1000); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (0, -250)); } TEST(WallOffsetMovementTest, TestOffsetRightMMSlice) { CompRect sbr (750, 0, 500, 500); CompRegion sr (0, 0, 1000, 1000); sr -= CompRegion (400, 0, 200, 0); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (-250, 0)); } TEST(WallOffsetMovementTest, TestOffsetLeftMMSlice) { CompRect sbr (-250, 0, 500, 500); CompRegion sr (0, 0, 1000, 1000); sr -= CompRegion (400, 0, 200, 0); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (250, 0)); } TEST(WallOffsetMovementTest, TestOffsetTopMMSlice) { CompRect sbr (0, -250, 500, 500); CompRegion sr (0, 0, 1000, 1000); sr -= CompRegion (400, 0, 200, 0); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (0, 250)); } TEST(WallOffsetMovementTest, TestOffsetBottomMMSlice) { CompRect sbr (0, 750, 500, 500); CompRegion sr (0, 0, 1000, 1000); sr -= CompRegion (400, 0, 200, 0); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (0, -250)); } compiz-0.9.11+14.04.20140409/plugins/wall/src/offset_movement/tests/CMakeLists.txt0000644000015301777760000000066012321343002030005 0ustar pbusernogroup00000000000000add_executable (compiz_test_wall_offset_movement ${CMAKE_CURRENT_SOURCE_DIR}/test-wall-offset-movement.cpp) target_link_libraries (compiz_test_wall_offset_movement compiz_wall_offset_movement ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_wall_offset_movement COVERAGE compiz_wall_offset_movement) compiz-0.9.11+14.04.20140409/plugins/wall/src/offset_movement/CMakeLists.txt0000644000015301777760000000123112321343002026636 0ustar pbusernogroup00000000000000INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS} ${COMPIZ_LIBRARY_DIRS}) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/offset-movement.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/offset-movement.cpp ) ADD_LIBRARY( compiz_wall_offset_movement STATIC ${SRCS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) TARGET_LINK_LIBRARIES( compiz_wall_offset_movement compiz_rect compiz_region ) compiz-0.9.11+14.04.20140409/plugins/wall/src/offset_movement/src/0000755000015301777760000000000012321344021024672 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wall/src/offset_movement/src/offset-movement.cpp0000644000015301777760000000352212321343002030514 0ustar pbusernogroup00000000000000/** * * Compiz wall plugin * * offset-movement.cpp * * Copyright (c) 2006 Robert Carr * * Authors: * Robert Carr * Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "offset-movement.h" CompPoint compiz::wall::movementWindowOnScreen (const CompRect &serverBorderRect, const CompRegion &screenRegion) { CompRegion sbrRegion (serverBorderRect); /* If the window would be partially offscreen * after it was moved then we should move it back * so that it is completely onscreen, since we moved * from mostly offscreen on B to mostly onscreen on A, * the user should be able to see their selected window */ CompRegion inter = sbrRegion.intersected (screenRegion); CompRegion rem = sbrRegion - screenRegion; int dx = 0; int dy = 0; const CompRect::vector &rects (rem.rects ()); for (std::vector ::const_iterator it = rects.begin (); it != rects.end (); ++it) { const CompRect &r = *it; if (r.x1 () >= inter.boundingRect ().x2 ()) dx -= r.width (); else if (r.x2 () <= inter.boundingRect ().x1 ()) dx += r.width (); if (r.y1 () >= inter.boundingRect ().y2 ()) dy -= r.height (); else if (r.y2 () <= inter.boundingRect ().y1 ()) dy += r.height (); } return CompPoint (dx, dy); } compiz-0.9.11+14.04.20140409/plugins/wall/src/offset_movement/include/0000755000015301777760000000000012321344021025526 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/wall/src/offset_movement/include/offset-movement.h0000644000015301777760000000204212321343002031011 0ustar pbusernogroup00000000000000/** * * Compiz wall plugin * * offset-movement.h * * Copyright (c) 2006 Robert Carr * * Authors: * Robert Carr * Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef _COMPIZ_WALL_OFFSET_MOVEMENT_H #define _COMPIZ_WALL_OFFSET_MOVEMENT_H #include #include #include namespace compiz { namespace wall { CompPoint movementWindowOnScreen (const CompRect &serverBorderRect, const CompRegion &screenRegion); } } #endif compiz-0.9.11+14.04.20140409/plugins/wall/src/wall.cpp0000644000015301777760000012375512321343002022361 0ustar pbusernogroup00000000000000/** * * Compiz wall plugin * * wall.cpp * * Copyright (c) 2006 Robert Carr * 2011 Linaro Limited * * Authors: * Robert Carr * Dennis Kasprzyk * Travis Watkins * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include #include #include #include #include #include #include #include #include #include "wall.h" static const double PI = 3.14159265359f; static const unsigned short VIEWPORT_SWITCHER_SIZE = 100; static const unsigned short ARROW_SIZE = 33; #define getColorRGBA(name) \ r = optionGet##name##Red() / 65535.0f;\ g = optionGet##name##Green() / 65535.0f; \ b = optionGet##name##Blue() / 65535.0f; \ a = optionGet##name##Alpha() / 65535.0f #define sigmoid(x) (1.0f / (1.0f + exp (-5.5f * 2 * ((x) - 0.5)))) #define sigmoidProgress(x) ((sigmoid (x) - sigmoid (0)) / \ (sigmoid (1) - sigmoid (0))) COMPIZ_PLUGIN_20090315 (wall, WallPluginVTable); void WallScreen::clearCairoLayer (cairo_t *cr) { cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); } void WallScreen::drawSwitcherBackground () { cairo_t *cr; cairo_pattern_t *pattern; float outline = 2.0f; int width, height, radius; float r, g, b, a; destroyCairoContext (switcherContext); setupCairoContext (switcherContext); cr = switcherContext.cr; clearCairoLayer (cr); width = switcherContext.width - outline; height = switcherContext.height - outline; cairo_save (cr); cairo_translate (cr, outline / 2.0f, outline / 2.0f); /* set the pattern for the switcher's background */ pattern = cairo_pattern_create_linear (0, 0, width, height); getColorRGBA (BackgroundGradientBaseColor); cairo_pattern_add_color_stop_rgba (pattern, 0.00f, r, g, b, a); getColorRGBA (BackgroundGradientHighlightColor); cairo_pattern_add_color_stop_rgba (pattern, 0.65f, r, g, b, a); getColorRGBA (BackgroundGradientShadowColor); cairo_pattern_add_color_stop_rgba (pattern, 0.85f, r, g, b, a); cairo_set_source (cr, pattern); /* draw the border's shape */ radius = optionGetEdgeRadius (); if (radius) { cairo_arc (cr, radius, radius, radius, PI, 1.5f * PI); cairo_arc (cr, radius + width - 2 * radius, radius, radius, 1.5f * PI, 2.0 * PI); cairo_arc (cr, width - radius, height - radius, radius, 0, PI / 2.0f); cairo_arc (cr, radius, height - radius, radius, PI / 2.0f, PI); } else { cairo_rectangle (cr, 0, 0, width, height); } cairo_close_path (cr); /* apply pattern to background... */ cairo_fill_preserve (cr); /* ... and draw an outline */ cairo_set_line_width (cr, outline); getColorRGBA (OutlineColor); cairo_set_source_rgba (cr, r, g, b, a); cairo_stroke (cr); cairo_pattern_destroy (pattern); cairo_restore (cr); cairo_save (cr); for (unsigned int i = 0; i < (unsigned int) screen->vpSize ().height (); i++) { cairo_translate (cr, 0.0, viewportBorder); cairo_save (cr); for (unsigned int j = 0; j < (unsigned int) screen->vpSize ().width (); j++) { cairo_translate (cr, viewportBorder, 0.0); /* this cuts a hole into our background */ cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0); cairo_rectangle (cr, 0, 0, viewportWidth, viewportHeight); cairo_fill_preserve (cr); cairo_set_operator (cr, CAIRO_OPERATOR_XOR); cairo_fill (cr); cairo_translate (cr, viewportWidth, 0.0); } cairo_restore(cr); cairo_translate (cr, 0.0, viewportHeight); } cairo_restore (cr); } void WallScreen::drawThumb () { cairo_t *cr; cairo_pattern_t *pattern; float r, g, b, a; float outline = 2.0f; int width, height; destroyCairoContext (thumbContext); setupCairoContext (thumbContext); cr = thumbContext.cr; clearCairoLayer (cr); width = thumbContext.width - outline; height = thumbContext.height - outline; cairo_translate (cr, outline / 2.0f, outline / 2.0f); pattern = cairo_pattern_create_linear (0, 0, width, height); getColorRGBA (ThumbGradientBaseColor); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); getColorRGBA (ThumbGradientHighlightColor); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); /* apply the pattern for thumb background */ cairo_set_source (cr, pattern); cairo_rectangle (cr, 0, 0, width, height); cairo_fill_preserve (cr); cairo_set_line_width (cr, outline); getColorRGBA (OutlineColor); cairo_set_source_rgba (cr, r, g, b, a); cairo_stroke (cr); cairo_pattern_destroy (pattern); cairo_restore (cr); } void WallScreen::drawHighlight () { cairo_t *cr; cairo_pattern_t *pattern; int width, height; float r, g, b, a; float outline = 2.0f; destroyCairoContext (highlightContext); setupCairoContext (highlightContext); cr = highlightContext.cr; clearCairoLayer (cr); width = highlightContext.width - outline; height = highlightContext.height - outline; cairo_translate (cr, outline / 2.0f, outline / 2.0f); pattern = cairo_pattern_create_linear (0, 0, width, height); getColorRGBA (ThumbHighlightGradientBaseColor); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); getColorRGBA (ThumbHighlightGradientShadowColor); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); /* apply the pattern for thumb background */ cairo_set_source (cr, pattern); cairo_rectangle (cr, 0, 0, width, height); cairo_fill_preserve (cr); cairo_set_line_width (cr, outline); getColorRGBA (OutlineColor); cairo_set_source_rgba (cr, r, g, b, a); cairo_stroke (cr); cairo_pattern_destroy (pattern); cairo_restore (cr); } void WallScreen::drawArrow () { cairo_t *cr; float outline = 2.0f; float r, g, b, a; destroyCairoContext (arrowContext); setupCairoContext (arrowContext); cr = arrowContext.cr; clearCairoLayer (cr); cairo_translate (cr, outline / 2.0f, outline / 2.0f); /* apply the pattern for thumb background */ cairo_set_line_width (cr, outline); /* draw top part of the arrow */ getColorRGBA (ArrowBaseColor); cairo_set_source_rgba (cr, r, g, b, a); cairo_move_to (cr, 15, 0); cairo_line_to (cr, 30, 30); cairo_line_to (cr, 15, 24.5); cairo_line_to (cr, 15, 0); cairo_fill (cr); /* draw bottom part of the arrow */ getColorRGBA (ArrowShadowColor); cairo_set_source_rgba (cr, r, g, b, a); cairo_move_to (cr, 15, 0); cairo_line_to (cr, 0, 30); cairo_line_to (cr, 15, 24.5); cairo_line_to (cr, 15, 0); cairo_fill (cr); /* draw the arrow outline */ getColorRGBA (OutlineColor); cairo_set_source_rgba (cr, r, g, b, a); cairo_move_to (cr, 15, 0); cairo_line_to (cr, 30, 30); cairo_line_to (cr, 15, 24.5); cairo_line_to (cr, 0, 30); cairo_line_to (cr, 15, 0); cairo_stroke (cr); cairo_restore (cr); } void WallScreen::setupCairoContext (WallCairoContext &context) { XRenderPictFormat *format; Screen *xScreen; int width, height; xScreen = ScreenOfDisplay (screen->dpy (), screen->screenNum ()); width = context.width; height = context.height; format = XRenderFindStandardFormat (screen->dpy (), PictStandardARGB32); context.pixmap = XCreatePixmap (screen->dpy (), screen->root (), width, height, 32); context.texture = GLTexture::bindPixmapToTexture (context.pixmap, width, height, 32); if (context.texture.empty ()) { screen->logMessage ("wall", CompLogLevelError, "Couldn't create cairo context for switcher"); } context.surface = cairo_xlib_surface_create_with_xrender_format (screen->dpy (), context.pixmap, xScreen, format, width, height); context.cr = cairo_create (context.surface); clearCairoLayer (context.cr); } void WallScreen::destroyCairoContext (WallCairoContext &context) { if (context.cr) cairo_destroy (context.cr); if (context.surface) cairo_surface_destroy (context.surface); context.texture.clear (); if (context.pixmap) XFreePixmap (screen->dpy (), context.pixmap); } bool WallScreen::checkDestination (unsigned int destX, unsigned int destY) { CompPoint point; CompSize size; point = screen->vp (); size = screen->vpSize (); if (point.x () - destX >= (unsigned int) size.width ()) return false; if (point.y () - destY >= (unsigned int) size.height ()) return false; return true; } void WallScreen::releaseMoveWindow () { moveWindow = 0; } void WallScreen::computeTranslation (float &x, float &y) { float elapsed, duration; duration = optionGetSlideDuration () * 1000.0; if (duration != 0.0) elapsed = 1.0 - (timer / duration); else elapsed = 1.0; if (elapsed < 0.0) elapsed = 0.0; if (elapsed > 1.0) elapsed = 1.0; /* Use temporary variables to you can pass in &ps->cur_x */ x = (gotoX - curPosX) * elapsed + curPosX; y = (gotoY - curPosY) * elapsed + curPosY; } /* movement remainder that gets ignored for direction calculation */ static const float IGNORE_REMAINDER = 0.05f; void WallScreen::determineMovementAngle () { int angle; float dx, dy; dx = gotoX - curPosX; dy = gotoY - curPosY; if (dy > IGNORE_REMAINDER) angle = (dx > IGNORE_REMAINDER) ? 135 : (dx < -IGNORE_REMAINDER) ? 225 : 180; else if (dy < -IGNORE_REMAINDER) angle = (dx > IGNORE_REMAINDER) ? 45 : (dx < -IGNORE_REMAINDER) ? 315 : 0; else angle = (dx > IGNORE_REMAINDER) ? 90 : (dx < -IGNORE_REMAINDER) ? 270 : -1; direction = angle; } bool WallScreen::moveViewport (int x, int y, Window moveWin) { CompOption::Vector o(0); if (!x && !y) return false; if (screen->otherGrabExist ("move", "switcher", "group-drag", "wall", 0)) return false; if (!checkDestination (x, y)) return false; if (moveWindow != moveWin) { CompWindow *w; releaseMoveWindow (); w = screen->findWindow (moveWin); if (w) { if (!(w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) { if (!(w->state () & CompWindowStateStickyMask)) { moveWindow = w->id (); moveWindowX = w->x (); moveWindowY = w->y (); w->raise (); } } } } if (!moving) { curPosX = screen->vp ().x (); curPosY = screen->vp ().y (); } gotoX = screen->vp ().x () - x; gotoY = screen->vp ().y () - y; determineMovementAngle (); screen->handleCompizEvent ("wall", "start_viewport_switch", o); if (!grabIndex) grabIndex = screen->pushGrab (screen->invisibleCursor (), "wall"); screen->moveViewport (x, y, true); moving = true; focusDefault = true; boxOutputDevice = screen->outputDeviceForPoint (pointerX, pointerY); if (optionGetShowSwitcher ()) boxTimeout = optionGetPreviewTimeout () * 1000; else boxTimeout = 0; timer = optionGetSlideDuration () * 1000; cScreen->damageScreen (); return true; } void WallScreen::handleEvent (XEvent *event) { switch (event->type) { case ClientMessage: if (event->xclient.message_type == Atoms::desktopViewport) { int dx, dy; if (screen->otherGrabExist ("switcher", "wall", 0)) break; dx = event->xclient.data.l[0] / screen->width(); dx -= screen->vp ().x (); dy = event->xclient.data.l[1] / screen->height(); dy -= screen->vp ().y (); if (!dx && !dy) break; moveViewport (-dx, -dy, None); } break; case FocusIn: case FocusOut: /* Edges on when grabbed */ if (!optionGetEdgeflipPointer ()) { if (event->xfocus.mode == NotifyGrab) toggleEdges (true); else if (event->xfocus.mode == NotifyUngrab) toggleEdges (false); } case ConfigureNotify: break; default: break; } screen->handleEvent (event); } /* * When a dnd type window is mapped toggle edge flip dnd windows back on * _NET_WM_WINDOW_TYPE_DND windows. This will not detect all dnd windows * but it will detect the EWMH-compliant ones without resorting to * hacks involving selection stealing. */ void WallWindow::windowNotify (CompWindowNotify n) { WallScreen *ws = WallScreen::get (screen); bool toggleOnDnd = ws->optionGetEdgeflipDnd (); switch (n) { case CompWindowNotifyMap: if (window->type () & CompWindowTypeDndMask && toggleOnDnd) ws->toggleEdges (true); break; case CompWindowNotifyUnmap: if (window->type () & CompWindowTypeDndMask && toggleOnDnd) ws->toggleEdges (false); break; default: break; } window->windowNotify (n); } void WallWindow::activate () { WALL_SCREEN (screen); if (window->placed () && !screen->otherGrabExist ("wall", "switcher", 0)) { int dx, dy; CompPoint viewport = screen->vp (); if (ws->optionGetAutoSwitchVpAndWindow () || window->defaultViewport () != viewport) screen->viewportForGeometry (window->geometry (), viewport); dx = viewport.x (); dy = viewport.y (); /* Handle negative value */ dx = (unsigned int) dx % screen->vpSize ().width (); dy = (unsigned int) dy % screen->vpSize ().height (); dx -= screen->vp ().x (); dy -= screen->vp ().y (); if (dx || dy) { XWindowChanges xwc; unsigned int mask = 0; /* If changing viewports fails we should not * move the client window */ if (!ws->moveViewport (-dx, -dy, false)) { window->activate (); return; } if (ws->optionGetAutoSwitchVpAndWindow ()) { ws->focusDefault = false; CompRegion screenRegion; foreach (const CompOutput &o, screen->outputDevs ()) screenRegion += o.workArea (); CompPoint d = compiz::wall::movementWindowOnScreen (window->serverBorderRect (), screenRegion); mask |= d.x () !=0 ? CWX : 0; mask |= d.y () !=0 ? CWY : 0; xwc.x = window->serverGeometry ().x () + d.x (); xwc.y = window->serverGeometry ().y () + d.y (); window->configureXWindow (mask, &xwc); } } } window->activate (); } void WallWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { if (mask & (CompWindowGrabMoveMask | CompWindowGrabButtonMask)) WallScreen::get (screen)->windowIsDragMoved = true; window->grabNotify (x, y, state, mask); } void WallWindow::ungrabNotify () { WallScreen::get (screen)->windowIsDragMoved = false; window->ungrabNotify (); } void WallScreen::checkAmount (int dx, int dy, int &amountX, int &amountY) { CompPoint point; CompSize size; point = screen->vp (); size = screen->vpSize (); amountX = -dx; amountY = -dy; if (optionGetAllowWraparound ()) { if ((point.x () + dx) < 0) amountX = -(size.width () + dx); else if ((point.x () + dx) >= size.width ()) amountX = size.width () - dx; if ((point.y () + dy) < 0) amountY = -(size.height () + dy); else if ((point.y () + dy) >= size.height ()) amountY = size.height () - dy; } } bool WallScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector &options, Direction dir, bool withWin) { int dx = 0, dy = 0, amountX, amountY; unsigned int vpX, vpY; CompSize size; Window win = None; vpX = screen->vp ().x (); vpY = screen->vp ().y (); size = screen->vpSize (); switch (dir) { case Up: dy = -1; checkAmount (dx, dy, amountX, amountY); break; case Down: dy = 1; checkAmount (dx, dy, amountX, amountY); break; case Left: dx = -1; checkAmount (dx, dy, amountX, amountY); break; case Right: dx = 1; checkAmount (dx, dy, amountX, amountY); break; case Next: if ((vpX == (unsigned int) size.width () - 1) && (vpY == (unsigned int) size.height () - 1)) { amountX = size.width () - 1; amountY = size.height () - 1; } else if (vpX == (unsigned int) size.width () - 1) { amountX = size.width () - 1; amountY = -1; } else { amountX = -1; amountY = 0; } break; case Prev: if (vpX == 0 && vpY == 0) { amountX = -(size.width () - 1); amountY = -(size.height () - 1); } else if (vpX == 0) { amountX = -(size.width () - 1); amountY = 1; } else { amountX = 1; amountY = 0; } break; } if (withWin) win = CompOption::getIntOptionNamed (options, "window", 0); if (!moveViewport (amountX, amountY, win)) return true; if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); showPreview = optionGetShowSwitcher (); return true; } bool WallScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (showPreview) { showPreview = false; cScreen->damageScreen (); } if (action) action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } bool WallScreen::initiateFlip (Direction direction, CompAction::State state) { CompOption::Vector o (0); int dx, dy; int amountX, amountY; const bool allowFlipDnd = (state & CompAction::StateInitEdgeDnd) && optionGetEdgeflipDnd (); const bool allowFlipMove = (windowIsDragMoved && optionGetEdgeflipMove ()); const bool allowFlipPointer = optionGetEdgeflipPointer (); if (!allowFlipDnd && !allowFlipMove && !allowFlipPointer) return false; switch (direction) { case Left: dx = -1; dy = 0; break; case Right: dx = 1; dy = 0; break; case Up: dx = 0; dy = -1; break; case Down: dx = 0; dy = 1; break; default: dx = 0; dy = 0; break; } checkAmount (dx, dy, amountX, amountY); if (moveViewport (amountX, amountY, None)) { int offsetX, offsetY; int warpX, warpY; if (dx < 0) { offsetX = screen->width () - 1; warpX = pointerX + screen->width (); } else if (dx > 0) { offsetX = 1- screen->width (); warpX = pointerX - screen->width (); } else { offsetX = 0; warpX = lastPointerX; } if (dy < 0) { offsetY = screen->height () - 1; warpY = pointerY + screen->height (); } else if (dy > 0) { offsetY = 1- screen->height (); warpY = pointerY - screen->height (); } else { offsetY = 0; warpY = lastPointerY; } screen->warpPointer (offsetX, offsetY); lastPointerX = warpX; lastPointerY = warpY; } return true; } inline void wallDrawQuad (const GLMatrix &transform, GLTexture::Matrix *matrix, BOX *box) { GLfloat textureData[8]; GLfloat vertexData[12]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = COMP_TEX_COORD_X (*matrix, box->x1); textureData[1] = COMP_TEX_COORD_Y (*matrix, box->y2); textureData[2] = COMP_TEX_COORD_X (*matrix, box->x2); textureData[3] = COMP_TEX_COORD_Y (*matrix, box->y2); textureData[4] = COMP_TEX_COORD_X (*matrix, box->x1); textureData[5] = COMP_TEX_COORD_Y (*matrix, box->y1); textureData[6] = COMP_TEX_COORD_X (*matrix, box->x2); textureData[7] = COMP_TEX_COORD_Y (*matrix, box->y1); vertexData[0] = box->x1; vertexData[1] = box->y2; vertexData[2] = 0; vertexData[3] = box->x2; vertexData[4] = box->y2; vertexData[5] = 0; vertexData[6] = box->x1; vertexData[7] = box->y1; vertexData[8] = 0; vertexData[9] = box->x2; vertexData[10] = box->y1; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (transform); } void WallScreen::drawCairoTextureOnScreen (const GLMatrix &transform) { float centerX, centerY; float width, height; float topLeftX, topLeftY; float border; GLTexture::Matrix matrix; BOX box; GLMatrix wTransform (transform); GLVertexBuffer *gl = GLVertexBuffer::streamingBuffer (); CompOutput::vector &outputDevs = screen->outputDevs (); CompOutput output = outputDevs[boxOutputDevice]; glEnable (GL_BLEND); centerX = output.x1 () + (output.width () / 2.0f); centerY = output.y1 () + (output.height () / 2.0f); border = (float) viewportBorder; width = (float) switcherContext.width; height = (float) switcherContext.height; topLeftX = centerX - floor (width / 2.0f); topLeftY = centerY - floor (height / 2.0f); firstViewportX = topLeftX + border; firstViewportY = topLeftY + border; if (!moving) { double left, timeout; timeout = optionGetPreviewTimeout () * 1000.0f; left = (timeout > 0) ? (float) boxTimeout / timeout : 1.0f; if (left < 0) left = 0.0f; else if (left > 0.5) left = 1.0f; else left = 2 * left; #ifndef USE_GLES glScreen->setTexEnvMode (GL_MODULATE); #endif gl->color4f (left, left, left, left); wTransform.translate (0.0f, 0.0f, -(1 - left)); mSzCamera = -(1 - left); } else { mSzCamera = 0.0f; } /* draw background */ matrix = switcherContext.texture[0]->matrix (); matrix.x0 -= topLeftX * matrix.xx; matrix.y0 -= topLeftY * matrix.yy; box.x1 = topLeftX; box.x2 = box.x1 + width; box.y1 = topLeftY; box.y2 = box.y1 + height; switcherContext.texture[0]->enable (GLTexture::Fast); wallDrawQuad (wTransform, &matrix, &box); switcherContext.texture[0]->disable (); /* draw thumb */ width = (float) thumbContext.width; height = (float) thumbContext.height; thumbContext.texture[0]->enable (GLTexture::Fast); for (unsigned int i = 0; i < (unsigned int) screen->vpSize ().width (); i++) { for (unsigned int j = 0; j < (unsigned int) screen->vpSize ().height (); j++) { if (i == gotoX && j == gotoY && moving) continue; box.x1 = i * (width + border); box.x1 += topLeftX + border; box.x2 = box.x1 + width; box.y1 = j * (height + border); box.y1 += topLeftY + border; box.y2 = box.y1 + height; matrix = thumbContext.texture[0]->matrix (); matrix.x0 -= box.x1 * matrix.xx; matrix.y0 -= box.y1 * matrix.yy; wallDrawQuad (wTransform, &matrix, &box); } } thumbContext.texture[0]->disable (); if (moving || showPreview) { /* draw highlight */ box.x1 = screen->vp ().x () * (width + border) + topLeftX + border; box.x2 = box.x1 + width; box.y1 = screen->vp ().y () * (height + border) + topLeftY + border; box.y2 = box.y1 + height; matrix = highlightContext.texture[0]->matrix (); matrix.x0 -= box.x1 * matrix.xx; matrix.y0 -= box.y1 * matrix.yy; highlightContext.texture[0]->enable (GLTexture::Fast); wallDrawQuad (wTransform, &matrix, &box); highlightContext.texture[0]->disable (); /* draw arrow */ if (direction >= 0) { arrowContext.texture[0]->enable (GLTexture::Fast); int aW = arrowContext.width; int aH = arrowContext.height; /* if we have a viewport preview we just paint the arrow outside the switcher */ if (optionGetMiniscreen ()) { width = (float) switcherContext.width; height = (float) switcherContext.height; switch (direction) { /* top left */ case 315: box.x1 = topLeftX - aW - border; box.y1 = topLeftY - aH - border; break; /* up */ case 0: box.x1 = topLeftX + width / 2.0f - aW / 2.0f; box.y1 = topLeftY - aH - border; break; /* top right */ case 45: box.x1 = topLeftX + width + border; box.y1 = topLeftY - aH - border; break; /* right */ case 90: box.x1 = topLeftX + width + border; box.y1 = topLeftY + height / 2.0f - aH / 2.0f; break; /* bottom right */ case 135: box.x1 = topLeftX + width + border; box.y1 = topLeftY + height + border; break; /* down */ case 180: box.x1 = topLeftX + width / 2.0f - aW / 2.0f; box.y1 = topLeftY + height + border; break; /* bottom left */ case 225: box.x1 = topLeftX - aW - border; box.y1 = topLeftY + height + border; break; /* left */ case 270: box.x1 = topLeftX - aW - border; box.y1 = topLeftY + height / 2.0f - aH / 2.0f; break; default: break; } } else { /* arrow is visible (no preview is painted over it) */ box.x1 = screen->vp().x() * (width + border) + topLeftX + border; box.x1 += width / 2 - aW / 2; box.y1 = screen->vp().y() * (height + border) + topLeftY + border; box.y1 += height / 2 - aH / 2; } box.x2 = box.x1 + aW; box.y2 = box.y1 + aH; wTransform.translate (box.x1 + aW / 2, box.y1 + aH / 2, 0.0f); wTransform.rotate (direction, 0.0f, 0.0f, 1.0f); wTransform.translate (-box.x1 - aW / 2, -box.y1 - aH / 2, 0.0f); matrix = arrowContext.texture[0]->matrix (); matrix.x0 -= box.x1 * matrix.xx; matrix.y0 -= box.y1 * matrix.yy; wallDrawQuad (wTransform, &matrix, &box); arrowContext.texture[0]->disable (); } } glDisable (GL_BLEND); #ifndef USE_GLES glScreen->setTexEnvMode (GL_REPLACE); #endif gl->colorDefault (); } void WallScreen::paint (CompOutput::ptrList& outputs, unsigned int mask) { if (moving && outputs.size () > 1 && optionGetMmmode() == MmmodeSwitchAll) { outputs.clear (); outputs.push_back (&screen->fullscreenOutput ()); } cScreen->paint (outputs, mask); } bool WallScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; transform = NoTransformation; if (moving) mask |= PAINT_SCREEN_TRANSFORMED_MASK | PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; status = glScreen->glPaintOutput (attrib, matrix, region, output, mask); if (optionGetShowSwitcher () && (moving || showPreview || boxTimeout) && (output->id () == boxOutputDevice || output == &screen->fullscreenOutput ())) { GLMatrix sMatrix (matrix); sMatrix.toScreenSpace (output, -DEFAULT_Z_CAMERA); drawCairoTextureOnScreen (sMatrix); if (optionGetMiniscreen ()) { float mw, mh; mw = viewportWidth; mh = viewportHeight; transform = MiniScreen; mSAttribs.xScale = mw / screen->width (); mSAttribs.yScale = mh / screen->height (); mSAttribs.opacity = OPAQUE * (1.0 + mSzCamera); mSAttribs.saturation = COLOR; for (unsigned int j = 0; j < (unsigned int) screen->vpSize ().height (); j++) { for (unsigned int i = 0; i < (unsigned int) screen->vpSize ().width (); i++) { float mx, my; unsigned int msMask; CompPoint vp (i, j); mx = firstViewportX + (i * (viewportWidth + viewportBorder)); my = firstViewportY + (j * (viewportHeight + viewportBorder)); mSAttribs.xTranslate = mx / output->width (); mSAttribs.yTranslate = -my / output->height (); mSAttribs.brightness = 0.4f * BRIGHT; if (vp == screen->vp () && (moving || boxTimeout || showPreview)) { mSAttribs.brightness = BRIGHT; } cScreen->setWindowPaintOffset ((screen->vp ().x () - i) * screen->width (), (screen->vp ().y () - j) * screen->height ()); msMask = mask | PAINT_SCREEN_TRANSFORMED_MASK; glScreen->glPaintTransformedOutput (attrib, matrix, region, output, msMask); } } transform = NoTransformation; cScreen->setWindowPaintOffset (0, 0); } } return status; } void WallScreen::preparePaint (int msSinceLastPaint) { if (!moving && !showPreview && boxTimeout) boxTimeout -= msSinceLastPaint; if (timer) timer -= msSinceLastPaint; if (moving) { computeTranslation (curPosX, curPosY); if (moveWindow) { CompWindow *window; window = screen->findWindow (moveWindow); if (window) { float dx, dy; dx = (gotoX - curPosX) * screen->width (); dy = (gotoY - curPosY) * screen->height (); window->moveToViewportPosition (moveWindowX - dx, moveWindowY - dy, true); } } } if (moving && curPosX == gotoX && curPosY == gotoY) { CompOption::Vector o (0); moving = false; timer = 0; if (moveWindow) releaseMoveWindow (); else if (focusDefault) { /* only focus default window if switcher is not active */ if (!screen->grabExist ("switcher")) screen->focusDefaultWindow (); } screen->handleCompizEvent ("wall", "end_viewport_switch", o); } cScreen->preparePaint (msSinceLastPaint); } void WallScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool clear = (mask & PAINT_SCREEN_CLEAR_MASK); if (transform == MiniScreen) { GLMatrix sMatrix (matrix); mask &= ~PAINT_SCREEN_CLEAR_MASK; /* move each screen to the correct output position */ sMatrix.translate (-(float) output->x1 () / (float) output->width (), (float) output->y1 () / (float) output->height (), 0.0f); sMatrix.translate (0.0f, 0.0f, -DEFAULT_Z_CAMERA); sMatrix.translate (mSAttribs.xTranslate, mSAttribs.yTranslate, mSzCamera); /* move origin to top left */ sMatrix.translate (-0.5f, 0.5f, 0.0f); sMatrix.scale (mSAttribs.xScale, mSAttribs.yScale, 1.0); /* revert prepareXCoords region shift. Now all screens display the same */ sMatrix.translate (0.5f, 0.5f, DEFAULT_Z_CAMERA); sMatrix.translate ((float) output->x1 () / (float) output->width (), -(float) output->y2 () / (float) output->height (), 0.0f); glScreen->glPaintTransformedOutput (attrib, sMatrix, screen->region (), output, mask); return; } if (!moving) glScreen->glPaintTransformedOutput (attrib, matrix, region, output, mask); mask &= ~PAINT_SCREEN_CLEAR_MASK; if (moving) { ScreenTransformation oldTransform = transform; GLMatrix sMatrix (matrix); float xTranslate, yTranslate; float px, py; bool movingX, movingY; CompPoint point (screen->vp ()); CompRegion outputRegion (*output); if (clear) glScreen->clearTargetOutput (GL_COLOR_BUFFER_BIT); transform = Sliding; currOutput = output; px = curPosX; py = curPosY; movingX = ((int) floor (px)) != ((int) ceil (px)); movingY = ((int) floor (py)) != ((int) ceil (py)); if (movingY) { yTranslate = fmod (py, 1) - 1; sMatrix.translate (0.0f, yTranslate, 0.0f); if (movingX) { xTranslate = 1 - fmod (px, 1); cScreen->setWindowPaintOffset ((point.x () - ceil (px)) * screen->width (), (point.y () - ceil (py)) * screen->height ()); sMatrix.translate (xTranslate, 0.0f, 0.0f); glScreen->glPaintTransformedOutput (attrib, sMatrix, outputRegion, output, mask); sMatrix.translate (-xTranslate, 0.0f, 0.0f); } xTranslate = -fmod (px, 1); cScreen->setWindowPaintOffset ((point.x () - floor (px)) * screen->width (), (point.y () - ceil (py)) * screen->height ()); sMatrix.translate (xTranslate, 0.0f, 0.0f); glScreen->glPaintTransformedOutput (attrib, sMatrix, outputRegion, output, mask); sMatrix.translate (-xTranslate, -yTranslate, 0.0f); } yTranslate = fmod (py, 1); sMatrix.translate (0.0f, yTranslate, 0.0f); if (movingX) { xTranslate = 1 - fmod (px, 1); cScreen->setWindowPaintOffset ((point.x () - ceil (px)) * screen->width (), (point.y () - floor (py)) * screen->height ()); sMatrix.translate (xTranslate, 0.0f, 0.0f); glScreen->glPaintTransformedOutput (attrib, sMatrix, outputRegion, output, mask); sMatrix.translate (-xTranslate, 0.0f, 0.0f); } xTranslate = -fmod (px, 1); cScreen->setWindowPaintOffset ((point.x () - floor (px)) * screen->width (), (point.y () - floor (py)) * screen->height ()); sMatrix.translate (xTranslate, 0.0f, 0.0f); glScreen->glPaintTransformedOutput (attrib, sMatrix, outputRegion, output, mask); cScreen->setWindowPaintOffset (0, 0); transform = oldTransform; } } bool WallWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, unsigned int mask) { bool status; WALL_SCREEN (screen); if (ws->transform == MiniScreen) { GLWindowPaintAttrib pA (attrib); pA.opacity = attrib.opacity * ((float) ws->mSAttribs.opacity / OPAQUE); pA.brightness = attrib.brightness * ((float) ws->mSAttribs.brightness / BRIGHT); pA.saturation = attrib.saturation * ((float) ws->mSAttribs.saturation / COLOR); if (!pA.opacity || !pA.brightness) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; status = glWindow->glPaint (pA, matrix, region, mask); } else if (ws->transform == Sliding && !isSliding) { GLMatrix wMatrix; /* Don't paint nonsliding windows multiple times */ wMatrix.toScreenSpace (ws->currOutput, -DEFAULT_Z_CAMERA); status = glWindow->glPaint (attrib, wMatrix, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); } else { status = glWindow->glPaint (attrib, matrix, region, mask); } return status; } void WallScreen::donePaint () { if (moving || showPreview || boxTimeout) { boxTimeout = MAX (0, boxTimeout); cScreen->damageScreen (); } if (!moving && !showPreview && grabIndex) { screen->removeGrab (static_cast (grabIndex), NULL); grabIndex = 0; } cScreen->donePaint (); } void WallScreen::createCairoContexts (bool initial) { int width, height; viewportWidth = VIEWPORT_SWITCHER_SIZE * (float) optionGetPreviewScale () / 100.0f; viewportHeight = viewportWidth * (float) screen->height () / (float) screen->width (); viewportBorder = optionGetBorderWidth (); width = screen->vpSize ().width () * (viewportWidth + viewportBorder) + viewportBorder; height = screen->vpSize ().height () * (viewportHeight + viewportBorder) + viewportBorder; destroyCairoContext (switcherContext); switcherContext.width = width; switcherContext.height = height; setupCairoContext (switcherContext); drawSwitcherBackground (); destroyCairoContext (thumbContext); thumbContext.width = viewportWidth; thumbContext.height = viewportHeight; setupCairoContext (thumbContext); drawThumb (); destroyCairoContext (highlightContext); highlightContext.width = viewportWidth; highlightContext.height = viewportHeight; setupCairoContext (highlightContext); drawHighlight (); if (initial) { arrowContext.width = ARROW_SIZE; arrowContext.height = ARROW_SIZE; setupCairoContext (arrowContext); drawArrow (); } } void WallScreen::toggleEdges (bool enabled) { WALL_SCREEN (screen); if (!enabled) { screen->removeAction (&ws->optionGetFlipLeftEdge ()); screen->removeAction (&ws->optionGetFlipUpEdge ()); screen->removeAction (&ws->optionGetFlipRightEdge ()); screen->removeAction (&ws->optionGetFlipDownEdge ()); } else { screen->addAction (&ws->optionGetFlipLeftEdge ()); screen->addAction (&ws->optionGetFlipUpEdge ()); screen->addAction (&ws->optionGetFlipRightEdge ()); screen->addAction (&ws->optionGetFlipDownEdge ()); } } void WallScreen::optionChanged (CompOption *opt, WallOptions::Options num) { switch(num) { case WallOptions::OutlineColor: drawSwitcherBackground (); drawHighlight (); drawThumb (); break; case WallOptions::EdgeRadius: case WallOptions::BackgroundGradientBaseColor: case WallOptions::BackgroundGradientHighlightColor: case WallOptions::BackgroundGradientShadowColor: drawSwitcherBackground (); break; case WallOptions::BorderWidth: case WallOptions::PreviewScale: createCairoContexts (false); break; case WallOptions::ThumbGradientBaseColor: case WallOptions::ThumbGradientHighlightColor: drawThumb (); break; case WallOptions::ThumbHighlightGradientBaseColor: case WallOptions::ThumbHighlightGradientShadowColor: drawHighlight (); break; case WallOptions::ArrowBaseColor: case WallOptions::ArrowShadowColor: drawArrow (); break; case WallOptions::NoSlideMatch: foreach (CompWindow *w, screen->windows ()) { WALL_WINDOW (w); ww->isSliding = !optionGetNoSlideMatch ().evaluate (w); } break; case WallOptions::EdgeflipPointer: toggleEdges (optionGetEdgeflipPointer ()); break; default: break; } } bool WallScreen::setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &value) { bool status = screen->setOptionForPlugin (plugin, name, value); if (strcmp (plugin, "core") == 0) { if (strcmp (name, "hsize") == 0 || strcmp (name, "vsize") == 0) { createCairoContexts (false); } } return status; } void WallScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); foreach (CompWindow *w, screen->windows ()) { WALL_WINDOW (w); ww->isSliding = !optionGetNoSlideMatch ().evaluate (w); } } void WallScreen::matchPropertyChanged (CompWindow *window) { WALL_WINDOW (window); screen->matchPropertyChanged (window); ww->isSliding = !optionGetNoSlideMatch ().evaluate (window); } WallScreen::WallScreen (CompScreen *screen) : PluginClassHandler (screen), WallOptions (), cScreen (CompositeScreen::get (screen)), glScreen (GLScreen::get (screen)), moving (false), showPreview (false), direction (-1), boxTimeout (0), grabIndex (0), timer (0), moveWindow (None), focusDefault (true), transform (NoTransformation), windowIsDragMoved (false) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (glScreen); // HACK: we have to keep libcairo loaded even if wall gets unloaded // to prevent crashes in XCloseDisplay dlopen ("libcairo.so.2", RTLD_LAZY); memset (&switcherContext, 0, sizeof (WallCairoContext)); memset (&thumbContext, 0, sizeof (WallCairoContext)); memset (&highlightContext, 0, sizeof (WallCairoContext)); memset (&arrowContext, 0, sizeof (WallCairoContext)); createCairoContexts (true); #define setAction(action, dir, win) \ optionSet##action##Initiate (boost::bind (&WallScreen::initiate, this, \ _1, _2, _3, dir, win)); \ optionSet##action##Terminate (boost::bind (&WallScreen::terminate, this, \ _1, _2, _3)) #define setFlipAction(action, dir) \ optionSet##action##Initiate (boost::bind (&WallScreen::initiateFlip, \ this, dir, _2)) setAction (LeftKey, Left, false); setAction (RightKey, Right, false); setAction (UpKey, Up, false); setAction (DownKey, Down, false); setAction (NextKey, Next, false); setAction (PrevKey, Prev, false); setAction (LeftButton, Left, false); setAction (RightButton, Right, false); setAction (UpButton, Up, false); setAction (DownButton, Down, false); setAction (NextButton, Next, false); setAction (PrevButton, Prev, false); setAction (LeftWindowKey, Left, true); setAction (RightWindowKey, Right, true); setAction (UpWindowKey, Up, true); setAction (DownWindowKey, Down, true); setFlipAction (FlipLeftEdge, Left); setFlipAction (FlipRightEdge, Right); setFlipAction (FlipUpEdge, Up); setFlipAction (FlipDownEdge, Down); #define setNotify(func) \ optionSet##func##Notify (boost::bind (&WallScreen::optionChanged, \ this, _1, _2)) setNotify (EdgeRadius); setNotify (BorderWidth); setNotify (PreviewScale); setNotify (OutlineColor); setNotify (BackgroundGradientBaseColor); setNotify (BackgroundGradientHighlightColor); setNotify (BackgroundGradientShadowColor); setNotify (ThumbGradientBaseColor); setNotify (ThumbGradientHighlightColor); setNotify (ThumbHighlightGradientBaseColor); setNotify (ThumbHighlightGradientShadowColor); setNotify (ArrowBaseColor); setNotify (ArrowShadowColor); setNotify (NoSlideMatch); setNotify (EdgeflipPointer); } WallScreen::~WallScreen () { destroyCairoContext (switcherContext); destroyCairoContext (thumbContext); destroyCairoContext (highlightContext); destroyCairoContext (arrowContext); } WallWindow::WallWindow (CompWindow *window) : PluginClassHandler (window), window (window), glWindow (GLWindow::get (window)) { WALL_SCREEN (screen); isSliding = !ws->optionGetNoSlideMatch ().evaluate (window); GLWindowInterface::setHandler (glWindow); WindowInterface::setHandler (window); } bool WallPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/cubeaddon/0000755000015301777760000000000012321344021021101 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/cubeaddon/images/0000755000015301777760000000000012321344021022346 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/cubeaddon/images/cubecap_release.png0000644000015301777760000172002312321343002026161 0ustar pbusernogroup00000000000000‰PNG  IHDR@°,cÀŸÚIDATxÚì½Ù–$»®c­»¿AR«[·ÕZúÿÿ+¢|"‰àà‘Yu*¯ÎVV¤‡‡‡;‰Á`0à¿þë_DDD ïâ¿ÝÖ~gã?˜µ#ùøÏño>_fæóO ~.Ÿ‹·1múQ(%`sÿ¿ø}¶Þò|®8Ïý A^0üõb7Š›ËÏÍžQq†\?>®/[þ•´¿Rç¯çedgý0Sy‘ì}Iv—îôŸF?…Æ÷à÷ž‡÷]ÔE>u†?øgîVç,§?ïÇ7õëËõÙà ë£JH¿KýPÇÁÚ¡ÒñšôEÅïia‡ªv†KgÀÆ[³ýv‡ u€Áõ[¼j}cˆ‘àMYZ@±ZŒˆ,Å·M.÷î'‹c¸Œ å_s.#FžP»î]-×+­~cû’F­[{<¾ÝÞ þ=N×q| Œáðƒà÷¯áïÏŠm>ð¹øÖ XÜüÙËø3²ü‚ø¯ÿú—¿>ÒòêÅ”Ão±Î  Ö Ë8f€u†ïzeÀC°w&ì´ÇA¯äŸpÿïŠFAžæ&=›U„ùÁ˜‰¹„„XªªÓB„\ì½·,2[™9—YM wFl/~aÿ>Èà—φåýø÷çßÌ›w6Jµë’0X.R¢£Äb| €ûS¬O¯=obHûèû÷ôÀÁš k‚Æe°?4gƒa~óˆùI#Io ¬Þ"lÀñàʰ!Ž0bm‘fÎq$«|.ÍÃ-}Qr»Bª‚“p¨ru?>iC°2VáMÖl4sxÉõD"™?ÑèÂÐ?£?2¢ÃOÚ » † ~;˜õ»,Ź›yüþ¯¡’ÝÄeAûE… Y{cs$Ä‘ÿ¼ßu6 2ßqX}ª#Âfbb`úCó®OB XGØÏyèõ;håš¡D¸£Š2è,S“:®ŒD|]M™À€® ­ùûýJªÃˆÕ•ŒH¢²ŠßÜî@|}¶WÚÞξOÞ.ü¼Ûþ“c2ëjyð{a$ÇX¿3øøˆçxóÑ`¤a6ùV0ìA !€¶²­„®`(|dßn……C<ÖA8b:t˜ˆP@]³ã&ØÐ‚“do _Æ¥ˆA`(©Z‚’E}«ák)rá[ ~—0²œWש‰H|-X&NL™@ÄDêWfã2 ùß&°I®-…VÒÛës1rž‰i.䀋cÓwÿp`°Ø]û63Î{¿÷°þ–-—ûv\3>{yáTŽÑæã¥È g+o#þÛ¥uÿ|>lÑ{YˆÚb;!×ñ(…¸]L™ÕBVð¶¦;d?ÿå¡ ñ…éÔhBÉ*gHA±uéû¥Š7AÉŠzt²È“¥¸²þõÅý›ËÏ Ðòy|ûI˜oâ ¯>¦O~:¿o‚zÇoÎÛnÌ©~~4†Þw_©¢éô}îÕÕØÞt‘+À“^E ­óOé&—^‘KMh!h¥Ã¢Ç ÜM…,EˆÔªŽê?ß[x)`‚`‘ˆRªâj„xPOWËZE» K„¤ïôr*²˜W7×!Á}d¶éN¶$k§Ï¢©VÖÞ\³íÀu"ÞØ<¼-¤õ[вâÕèŸï _¢õýÕ·ú7ùÁËJ ¿×Öø»)¶¸ –Vr+N‹W×¹v;Çz {JF Ì™\À‹ºÁ"ˆnY\è2C"VñןM‰´©lÜø@¿÷Á `±¦M¢f]Þ~ÆAç%€¥Å¦ì­XÝvïQôyëƒûkR‡"N¼¹•†ÄŸÚú;X‹¡Åxõ]q÷›Pótµ?ZGz%×êy¨ó]·ÌÖ ‹'‚UEÖê(œI  œ@ã«bQØCíZu>q¾=àaXáþý¬Áž;D<éE3ß«†1µ×Õª[ûº&îîtR¯:¿Èf‰žÿuq« 7ñhòä#î¾WãŸíàÚŠý_nxöþ7iÿûL‡óÀ¤ÛÇÿ›oŠÈ×ÿ—…kðH íbãOj3 zéоL¤—°j4kº˜Ÿ+ÄÑG¨)‡Øß¶ïAŸ¯D ª¦+W š\ú™€ò¾¼lytuj€@œ‹NB”gÈu,ÕtJTK]uj‡)®kùèk<åFIì–wGy-|½€ÎÔB'èß(軥•¶&1þm¬*–CÏWñX‰Í¾e0Oðwß? ]{Éõ#gmå`åÖˆRr?¥¨y""!_^*Æ7àÜ ŒT “ÿ4ú™üü£Ð`b0ñ­=@äÔ<`„@+íÝÑ“ÃÜž†ÔFºç" §H„Eš3d7¶dc±åzåÈןNCV•E³™4þWí7¬_‘I¿Bù"êoªÒÁõAsÚsýŒ‘àj®Kèi›Ÿi~#ñÆøyȪþæð h_~êðÁõ6‘+Á¨{áß{Dî$þû%â¾Q20ˆ²[g:šÜ(‡#aP©ÓÉæ8—g%áñí(Q°” ‰ôö~À%R‘ý'ÆS+`‘RWj;îÄL6îüùzÎì>èFÜ=8 0÷.[áíÇr?oѦ®››7Àø÷T]ùÏ2”åyãçèæ´Tþ=0b«Ñõ —38=ƒF–lWE¯Jxе.¦[¶†ô,œÔù§Òmq5û%Vаse@l8«%5=Ü«d<2ôäÔ»° þCĈÀ€©7™ÅãèÞíŠ<%F¸È…íÌJ!NÞ˜ìÐL =ܽV^oÜÔuEbØâ.×ïÀgsÛðUò¯½}£ÉÚnâ>à@ù#ïúKÑúMƒ–ø‚Ä›+?"Œø]YÕFÆâ¿óF` ÀÒÕ¸Ã1täβ»¶"“\ht¼K'Và;%f±ÑSJ5êÉ Sï£~ ‘„ÄçX W$Ô2 æü¤ñÅ„AA%6Òƒç¯EbPâCNGaW«?ïRL›ê†YU#†].Z±Eë¥.³`ø»˜×L«(Üþ·”~Ãu8¤×®‡wHTwŠï…ü¥ž3ªüÚ-Ö~|¢€B|P L+Œ¯ðˆãV¥±ö ÌQƒ³ëp(CÄ˳³«¡Yñµq¥ŠWDÅÚÚèD2ÅÿÐü˜±jüü—¹ãܳíýƒ… VÅWÕê^¹×ôçTR#^^?l“â*Ú5oìJÁ£Z ‹QÊ./–§ÒãïŘðÚ§¼DŒúÛoøG†+ô+¬[6ȆÁŸ*ü÷a ÿ׿þ…ñå £~V¬ Fú½†=q` ùÇx«­° J@ÊIôJ›ô‡Dð€hýÀ‘4@%^¥Øݨ«ÊáÚпú+sU5ÄÝ9¦=Z0u55–íðÓ[¨½Ý [?fO· f@œáÐ~ûO¶à[ÖÉ߈ð»çDç Ñ»W ’#àKó_ªWr¸Wäc"€u‹^{ÐRìæp¯ÆËSÓÜ»{!+Žhr+':ˆC¤½Wu:ëyˆL [@éè+-ÀGíáv“–~x#K0ã¥c–Û*÷0  ³†ý0sCÄ+#É,¢ºº}‡îŽ'ZçègÈ9¾ÅxØÚå¡~Ž#{uP ¶~ÖbÔú*˜Q7ûQÑËKÓ±~;Ðjã­Xì"z;ç}‹ü¼û—|ùb a7Š?ØÐb›!ß<’Üóv°õ¶;‹¬ÒlÍ’®mE]8âê ØR ½4.qê× Spõ‹p|¢^Ié?©°^ñY³fXðšÅãwò,iß+¸ç4áå HëYú?Á’®÷þvMm76ÿE²¾5´›Î湕{U×5¶¨¶?g¸zÐPð¼ÖÑ«.(èwº%®KQx“q¸žNØ^&æú‹Äš®£ŠëßaBºxW0ãTGV–BVòm/ê>Áûs ß 44ó1•Š]‚")Õ+‘f3*'Ï”c”­+2¡‘RÛVÐË/Ús%DËåú¨Ö.ñÛîì=jÕÛÕ–c¨´Îüâïx¾ü‘ô±×óꎈ±ùiAø÷‚Y4X ùáIÊË$ò<óŒüm *y×âI/R±ºó‰©G½¡’u‹ußÇ¥ÔÙœª'¡+Ù—/ÖüœGâÌVü“óù®ÁuWÝè‡ ±*¾´±Ô³±›÷Úë!ÛÉÃÐ\g; ÈdàOܱYô&QŸ?Õ€‘þÇ VoéßfÃÏ£WÓVr¢º Ž8Û…çò(9Úá@WtÏ5<}P„üÛuLi+؇üò˜cº™¹Ö@ì–LòËÖFúo B²…2“±Þhº‚†—•¡b C­P*Ï·„Œ˜Õ.9 ÆâXâ‘Å£WÎs (Tª ŒEá2ÛP¤aêtnOÕªgˆpbW´×=}`ªÉÊ9Èè˜]©ûç!˜ûˆ¯Èðó«´pZ[ßË7‡ç–Ô–Z>¿¼ü!3Û—ÜK JÀRÆ]1òÀ7µå¥äÆ€Žjº÷1¬"(l`>$pÙ®x«¡XBâ^•!®9å¥j;¹=ƒXíÈV:‹àÍ‘+ `‹8 f>‰z¸ÚQH=6VÉ2Ñ}U ŒI~·Áý¿/úÜÒr8w1ùý´íF*X{RŸŒäþ6Øo|Ð,Ö'Ö 4þg”‡èÛ‚áb†TÛ[RÏ¥Ùþ $.ºÁvŠ7õ,Ø^Û]C;CI³9Çä² c‘pRyÊPø‚îÕ=¬0ª‡jÕ6~Úg\¿wµ<ø˜&ZRó°ë2ó5ÈØò˜gô )Xe³l{®†GÄÕ`]ËÀgTuÕuÔ&(ŒbIƒ¾ãêôŒç3îeüI…–ààר‰€ æó/žyûoÁžûûóá˜6„0,~:è­Pb,{‹Z°ÏŒGøá?+ƒËLëK?4j3ky)„0˜°ä‘l¹ÌÀ‚¿ì1áÔ°RøõÔ¼^kå6èÕh¿bÈZÐQuŸBÆÒÖÉC¹…*[J}âsM…åiY)üî™nS\Ì¥SKà^ôÀáàクðç[R¼ÎïR=x¯ÍáãÿF™þÓc¹ „À`Q~òq1ÕµG¦t¡WUE #úß4˺ÂÔjä?×ríz { .! -äe Ù¸ÀÊ6ѳq¯nëLD…²¦gÐZU;à3ñRÄG\àg»s‰"TƒVåbbæl+hM…ÜQŪ¥S› ¥ÐõoÎÆZdÛ•â¢Ý#‰yjÎ’~ O}¨šíëfP’Ÿã˜"qFN‡àáh3™Þ}‚óLYþ‹W×Û·°çþþü„(zBÐ ¡#0‰d¡¶9<¾&w cý‹d¢:&€ÕÆ”¨ {±hD8­, ¡ƒ)À8ŒGæ"÷oŠ`õA:ñפ|j2©{•Na“çøâ©—ùøÐUÚ´æ"0–emN¶> ðú… Òþ\¢7T;¾[ذYy÷vd#|2Ö Uk½töÇè§:'ÄkÑýÉ»oþ^ŠÖÛËàgûçæÄ¿Kr-yápôñ5P\-v|AánPNL—–EY®-ŪcŽQC-4eÀ}±$î¿·-.0U“ñ˜IMÔã]ÐÜ™<&‰°ä Òîx ÉðûꪰÐ+}«³)± „Ž3£Œ×6TCgbb@ >3‹¦ÔÆb+$k© ßzÿÌT«bQF›õÃý¬‰šÛG¼ åCÉ«U7ƒ%ÿˆŸ6¢#–‘Œ#š® õ’­±h o9£*C¢fþãø<åüçßQ¿Bct˜¯Âø( cë[€yxÔë;`Í¿¶¼9€¥óÿ óÁˆäâÎd#/÷â†HÁjˆÄEàò‘¿ÉÝ0Ž"]¨sðŒCÕ턪lTðrÁ³œl<Ûún­Ë«»fœäü»& bªµÂÏúiY­~T”³±¼ùážP~óa}8‚\ì ìž¹»öNg‘ ¤­j{„lk‘nÎË([Ì)(9õظÕ\Ð׿g7³r6W¦ÊäÊñ#·½Í†áͱõ&åÐÍïÇtëë¦LmLÆzP ÏB¶ÿþ/®ïŽnn×%ðMâÍÚ¦ ^l—J6NÒWÅ¢‡uÕŽiÞ"þw½E2ü]5ü‰Ð¥Åt*åw»Ù0‘¿ÂÁ ܘà Áª9úˆÕP#Å`>¯?h^ZNâý÷§›–Ž­Õ2{*È®ÀÏfZé}2ôCz.­ŒQÍ&ä'6Ò´1Ov<€ƒgX³þºÕ3X´"+¢O<§}JgŽ^U=Rhz4ËjD)NÅ¢ëÓ¥B¥@¾%Ïóƒï…¢ªvÆcÚ¡•C³ÅŒŸ¾*Ó^”ºPg˜5q—º*±“‚>†„\7MßëÇæWÖÓ8õ¿¬-¹¿`Öïõ§Y…–èÁ)ŒòoMŒ»îy0犥{ÈOÜP·$' À*¢"ò…Ûû¬ï¶@¥»ˆ¬{WЦºØ k ½¢Á±ƒd#†JÍüë+ÅD¯­ß®Ê»Z%œŠÎ}‹¢Qaï•ëüä˜øc:ƒKAàBøbü«Å†"Ë êX4 Y؉î?&ÚXœÔû÷¹~/EkèíäèŸéÙ‘ÅY5÷•­ýº” ÛŽX7Yyþ§°?Øqm]ô$¨pE "iŒ“üS|ÒK|>ióp%÷‡kÑÆ·°Ý²¦•Šˆ¿«Í¯>,ñIÓˆëqt• Ò›DoÛ•ŸJïz°qDb‘plX¶: ™Õ«*†)ËÉ3¤u‰Æ¦­µñH3ÏÍÑ„Gú¡{ø[¯ãVA;?H°jµ®0ô¹3:Ö},Ÿ¤ÝƒIû_$ëwüIC¡³þѼ8 õ¾ÔMË­ˆòÄ¢ewî딇¬®è•“$w9YÕÁ_éˆJƒÉÀPðêõºw€Ÿ;©°(-Üp®ÖźdÕˆò©[8W§ZHh$Ïß+¹ç¼7[ÀÓ®«ïÒt,H¿'ë=»aÙ3…ëÿ ÿä­éÇ:ÎmcÎ>øqªCAà`ÜFé˜MK.×)Ƚ‚Ž%ש£“ r¡»k€éâDzÉ8ã|Å©£dÛòT±Z›Ê€E›}˜kï‘£¢³T5×Wg(Ì­ØŽf2F^Z‹pbOEæHè¡Å}ó ëú%s& /Z§²_Í0bÖƒ–òcØù+“©1ë,ª7ð,_Ü3ô– ϲã1þQÎ N6ÑR®@Cªø–Š«x";–X†”ƒB­>‚ö“søoœ@ý±//w +´> qÅ·$àvH¯Ô’Íʃÿˆ0+èæð_•qcaëšâc€JTH­F6¾ßÐ=U1¬à\B y1 ‘mŒ©»i|½ku›KéëkºBOlZwa³÷†Ë]W$UfàÖùóY ŽQŽ=ýn}~KŸGvf¯mz“¬U1?kΪþp$ëuÐj*”ÄÒÍái0+ï~LüÁ‡øGþ`p•–C[ r7¾GõýÅ1Cˆ}Ê *–ŒQ,IÑVtöÖY„ütUS"“"£e.ÁÊ£Y510”pÛXYÏëY´{HÊ•ÇÌ72½Ñ£VQm¬C6ÖÜëáÃÁk;v4p„±÷>úYú­˜Sµøˆ p!—â?8*†BÌØÓe×¥±ß[1ýŒ¶?þ÷ä&–kg^U±ÎnL¡R>ª#œ‘ÓNX¹¡”é«M蕾Cʯ 3ö Œ{?Fáµ:€­qógZ*ï6– OÅ'^ì®5wÕÙ)_÷m¹b6ÈFÓ$€ªŠuU•9u­änó´c㫵® ´™œ#̶ĻJÊsT±HSä< ßÙ]3A¯=g­äB³¬:0ëTfÄÖ}W^ÏŠ2EjšIg®qLÀä{SG+÷`¦zÌÅ\Ò>·ìyöfn_¸ÿ{‘hŸå@[î€6‚@ô]³w/<O¸Ôà IXÝJüÎ*bƒšóÆmü€t2þç¥u)ÀÍ ”IͽKT~âAñË Æ<ÄøL\ô2“d¼X<"¯/y AYGÊ:n¥¸XT[Mß±ñR›OÎï”»¯·ko©ÃD[UMåÙ‘]“§ "î дÄݬm½Í(¯À'Q¹¸}ÅתA$Ý—d¶ë'[ñ¢ïçF¼ Ìãߟ ¹,fØ1_j¥ˆøV9…aùUE¯ˆ(¥„‡Îßí„ë€Pbq—²U5½n0‹#'AJNÁÕ%»hB@ +ÇnVÆJR}–_‚ß5=`ßÕ=J¡žAÒP*2˜S(:Î.ý‹.¢¨ê:ÐÕ7i`i Òñ:3Ž¦ÂªÁóz¡Ž<ãâîíõÔÍ#æ4›ºêf-HyÂŽú¼Iéú OõÁl À›Wa#f.ëc)·¨;m†Kl÷øÜíI0«ÈÿVèÿÝÈ6ứAsÚ£¯€D ãÎm{—3ŽCÖ2ÖÝÕɹÚY=ýwæ?!çáÛ:þç¿þ…¼µµ„åš+U’jj®v4—Ç C$¾É#uõ>zu åâè 0ÞëlY ô†Áj´! o9²øÊIqÇ…J¾sSêum´|½K1×S‹/z È¥b"/Ÿ$ç?‘½¸!f[™m+ºdTÇÕ½¨¼^°šefø dÓS²ç7W~yõþÙà”j[ˆ´´¥0Ÿãx‹˜Îã ˜³:Å,tú„”¾ê]МŠ%¬VœÜ/xœ½ ‚å[ƒ $«XÜÙrŒ°jc= ËKŒÛˆåH¼ó¦˜‰î¡¦/€uD FÖ —{UE÷ò+>ÝB$aGA ,ÐͺÞdˆÔôÝoüHP_Ù˜ ÄS[MëƒQÈ«*äa‘=y†¬P§˜Tب¼Ã=0˜t½ïUíÊÌ 1¬ÞÂ+SPl«íº‚ Õ„ƒÀøV|_ðž ÷ÝãͦÿrüÀ/4Ë;‘Õì£8¯È5àg`Žñä‘z®¬ÊZêF9ïáïoM7?á?ÂT ·£)ÄÅ4ÌQ‹lèRgu”ê.?ù¼ã‚îÓ–"¸Í`WH,=, `ù]%Þä$j()K¸©g_Ú=Ó[ˆ2ïÄc¥;©˜jÜ`AÖkÒï¶ ªyÐ8iÌŠ|{=™¿ †P­–«_Ô9½iž?ÊѶÒ~ÏK˜‹,÷ê^ÕÛ(¾ét°‰Y§eÍV5óGVìgÂÄ—®„cVQÅÙ,¸(> ÆÒhoÏP#¾î•…^uº¯1yªW’WŽ®eîVõïQÑ`ß±‚]vIâz•5`OdË £-å•ÆÝ¾k樑³î€ËdlŸ–¾âѬQVó``™r9¦Phc9@XÉbÀ¢†«Õ€cÍXÜ’'_mÏî‚hZ‡Î‹Eß#¡÷@¦@O„œ2„[MK%¼dŽ£ËÈ'åÈ}2ðø™,-þQß÷`ˆBÞ©07ãÇ€Vsv¯Ç ÀŸÉìqólx'£øíäÛ»¹6þó¿ü—'‚,ÖVÒ–ÙlÝ̱YBTU£pKo„ž {/rW<¾«Gu¯ôÜ„xj½"­Cé.,ÛR$·Æñ'!³™3[ƒHcìS/LÌÌdƈ•ÂkG:K† ฑß·Ÿ—Óʃ¥r1Íð¾gïµpcôè”dâGánüo h¦¥úUfþ:9ëÃs|`Ã6>µþuPô;ïòUÛÕîrka‰_¡€±Èå;˜ˆî}îÚ‚/Ó1« HùE€‹n£²hf!ÙÎÓ‚*ֵŠÔá-õÝš–þ§šxD?ÒâÈÄÉMî 6°¨ºæìêc6ê\ì!ª¸J ã¢Äõš ¨äK­9oÇHì±%Yl†à>˜5Œè±ÃŒ8ú¹O\|z4ƒXô€oŸ1 ?ú`wa‘Z$:\÷mcd<”†?Œ(ðK_ÿðéõ”®ed/¬;ŽŒãŒ®yŽa#ƒ8ÎÇ—`ÿXŒjWß:+V=H+UàÉžŠ™fŒŒà)’œ#k™¶*`i=ì ɉ.Üdÿµ_±¼ê9_DT©¶sÕÎAGv¤Tq +G>ÃRXt¢YT½LJ̱£b õ+ªE²¸$üqhú!»ÖP¦%0ë⦻ŒB ɧë*ªëÊâ“>Iïç»1ªŸSÍK·Ç#ÉCß ÖÓON·çäÒ¯À§îá÷þÌ]*¥Ž > øÕ²ÿþLÀªgìë+¹óé¸QË*¨çÛÖÛíªIÚ^S—ËF¼ø|­»ì‘æ³òàäÜHDÛ§“hü;ô9®×^­P>¸z…Þ8‚ž¶ÕJ­™;›¡º`êÃZ‹ù&ƒ“&šYþÓÂ%#C*[Xµ"yé ”›Õ{q Û¥‰Þ……!3{‘¬ ùÛ°‚Ûþt/΢ù`¶É=0«r»À¬ýÍ{?/wœäoù °ÈG?öS§Š”zªI-#Ú;øI[`;òb#Y³ƒ¶šmÀfKî†@–gÑ wÅòìÍäÀÂÙ¯ºMüÅ»Ð6Ëm/Ž3 À]þיǣvs-E ýP„{Bú¢¦®íj©‹¯Fñ„¤(ÄàÝê7… àÇÅäî¾jâ(ƒ£³áº&†,‰—GXÈzJ£ÖêýŽ\¶b—¿¢Šµ± ‘#ÑÆ’¥ 0b³[ÐÁ­f•)œ##ƒ™·<ÐI}ú¡°9]bvµÛ?`=΢¬j«:¹¢W]«® R‚ˆ¬ÎA§-•aëƳ?t×™Â÷Ç×ùî¬Óþ 炘/#: WT±š‹AW½‹¤†J©´5Ð⌕FûˆèšýI xP'XPòzHØ .Ù¦£äfr# .´§/tKÅ:(y¢9#S%´Y†ì‡â±Z"Ò¦3wÈPB•667,JkÅåA§›£œ,ªóÿ7bìi üùž:~„Šâ¥Ü~Än×<(c‰áŽº ?öšIgp÷ÖFdÚ×ܘߦ˴kF:ä†bY†hVÑ8Ö–:¿°#ƳBî®ýÄÐ=®Ø¸‡øÏÿøbá!-§p!â€1i•KK°räw@ÀŠ—+èÅ4tK+îÝ~õ‹¤ZW&~é[71µòˆE¶Zo6f[nSd PÆè ý2’#Ê“k—ÆÎ¥r-./p4GÇHÉ.X®_¹ÿ‹§ ‘³b m†ÑëaUù[þ²;¬z¨êúÅ7‚˼øôÝ–ø*æë“ãþ$ k[ì'®”@op1°œ˜Ï‚„{±ò&)Åu¯œ¶ÁFG‰jR Ÿ°=qdëv[k>±ÇÉ.!!b@¶¦ÁÜàÚÈRŒ‡ãpsã&*¨:ÿ‚wa]±S÷ª rEt zn‰(»³-ôl´*ÍŒB:¥ÖY` sÂ#h|0Èc:‡…v©­³¯8°5-› tˆƒ&{·š [-ÖÒ¶£TÓ¼‰A$‹|wî‰T´Ñ%Ò†ûØòPq;÷¦yÉz„¨lÆ¢n'ø¬ÊPšš¶ù\µ%½¢ñ®ê°ñäÁAªÑëáo¶*|‚I=;~ÌGî¶æ³5ô€èãþ^Thgù&”FªVQÁÀ’c}¬Õˆx!}Ó g\ô«ÊA$Û£yÒW@;<·®šø#ó&DÜ9 °À4Eñªjð|ÈqUþT'vF T_tq«^o~c[øðî .A€J¬!M%˜yöÜT¬Bp]kº^€±4)+×=`Ú^R[ › ùOM¼ ¶+¾ó¬'{ñ¦Ÿ0‚0˜½ÓŽéöþ…‡Ýì°:ÒýŠÚFï)Cí VλF3П/vCS¸èŸzƒDg®ì‚ ôâ?ÿã?JUï[ðˆ)QXŽªªD]þYv©0jV¶ïƸÆ“[¿™Èª{·ÅWJwÄ?½ҧ Ä+‰]Ü|D®Q›`” ¥ì¦Âv¼k sj/r¾'=Y˜fBåÀ: .W5E©ý¬2:scó‡yü’µ’¾$×Ð…–ÖÛ£~hõÞí¥é PŽÈa „î.¹ÏÂòô½Çà=Üi½Ï€§éVsÇ QÚ‡OçY½ËÅ/?Ö|H•ÖéWýYXÿüA ¤!¥$v«ö†ŸA„²Y‰{šøÜ ñ]IqSxäùÑ»‘D‡ìBóÔÚ¥~îWÌY¦‘½J1-’l̤r TMÒ—ûE%]åjoÅ­/ Œíuµì.eã8í°¢,“ɪ6¦]K/ÏÝ/¥ôÊóãÖñ0‚wÕœǙrظ刅‹1mYµ›¼q0 i5…•,îD÷:ïáV˜ú¸Å„(l¬œáódºûõw+^¸êäÁSwrT¿Ÿzj¼0tk¥Ÿ&‚œ|ï¾Øcu\ÃqÌ¥¡\Kþßþ‰`ÓJIñD÷¡ÞÔc+%ΰ`ÙXA>dHúêx%%„Û;ªzåÀËßÓò&ï¶Žª*dáJ¤På}=‹aë ÚÄšé"d ÀîŒ/5P€)¥Ì!Ò¸A®÷@m³hD$(Q™kf}”50wà LûŠ0ÿTm<øÚõs«ÈO :D~nãCNy¯T®µzUÒûÖDÖH\•üßj¤‚v1>tÕµ{0(Àèe;>I*×–];1ŽÙáÉ&žqÁ«®ìlŒ›½zƒb7[­ƒ Dõc2ži>‡Y+ÏÚÂ`ú«§0âîÓw§Ù&SEkG^TâNÖYyŒôBb:OÇòòxª¶žŽÞÀE¬î1»üÈÛð*7§À@êßì9ƒ‹ ìC vø‘í?±®½øÌCå¢!¢–&/£;7†µÈ/H¦@ ê¨;÷nÍöŠG=y~%+¸ã x© Àˆ™Šà\PlNU©(3Ûó‚¤[gغOÔØV¾ÙyR³5cFü{ר ÎÖ[˜‡0- î"Y£·…_8–Vø€9 FXDFx*ù^~ûögM/Ü|ú4AÁÊàës½Ó;w~qóì2­Xóo¸fìëdw ©¸É¿~UqãÿúçŸzµË,v,0·¥Î:Rs®'ÀZa¹®îŽÓá^ñdJIž®ZèUû\¾ª ²fÞ y»†•”ù˜kv£·,TZïx1;ø‘)þrwKv#B²éQfa²°öê,ðàê.I#ã®×ƒž¢¹.êßûNnï|Ÿï-ÖåM‹-ÒöoQQsˆod'0‚ºcPK¤ ÓÉZ ½üÄÂ,’ñ¢À¯—{ÕUíË’qÍxyg±f Ê•ò–»[–‹§Ã•Dç•tÜ·k`Á 9„âÕ¥sà܆°¤Ùa¬"Ù(ŠRI‹ÚYT©gÒG5°ú܈ .GÍÎã&nTuTs 3>ß¶¨hWdwBQDX 0ç•­ø SÂí]îéès,#Y–ÍýQèÆwîÐÙFKé/åœÓb,¯nûäÇÂØ`} ZQ=„ø5t‡1%üêÖf£3}¢}ðîïou»e•Äÿhëÿ_ÿüƒqE§Å«ä^ÁŸKh@‰[¹52™\ÖÕÆ¥ì°Ø’ÌL@ $€’)>BZd™TkRŽ-ƒŸ’†¦ñ/Žšï ùåŒU?k3€¨Î1š ÆReþ«ˆðúVù ‚‰áƒÞô«rÌ:Wg ‹Mö° >É{#Þ³°Ó´áõÊç.ä‚w˜ÓÅnS}‰_Õbø?4lDrÊ»Ÿ/P/ÌøþÕŒ)»o]¾hê^5¸•¨ÄXýhT»ì÷Fbs Q+jYs.Ê€6M—Ó}ãñ20[RvùT¸z=H¼R×ÛqÊtAY¤‘øØ­vqC: ¾BŽ;u š0ÚRÝacë—úîu¿ŽÕKe{§Xöä 8>¼\ßABÔk¡ÕÀ_Ä’ÃHü³½Ëv(êÀÚy†¾ ¦öà ’µ~š(ñÎÝŠ -ůù3p-¶ÎÓœÖÆê6'®´äóò¦ö7E^ÞP‹Kè'@W¼å`EñˆÿßÕB8±t&¾ \°Õe›,hÌÎDÂnöµkáú%écËOU$Ð5° .ÆU%¿Nßx íŒÃXlÃRTbUEîÐåŒ o”Sg©Œ¨_ ˜§5D°ìŽè欔 F·ävÑGì³ ³râKrª‹ñMïKnò'ÃW¼|y5MòµYó*%"J‚í• ¿ã•ó¿)‘ üªüæòX¢-a¬p4e Lé´Í5·DÁM®‚JWpSåañÂFðe Ôq.ö¤4ú*Z½*õàI(l²†¦a“Å€†4™FÌÐÙ<„«ü¸1kÏKw§£Ìf)ÑV¨øJCŒï¼ÕpÅBbŽ—$DÐu¶N8ÁŽÅIû@îöY×lzÏgmáXÅÍÝ®©…Vøñ·P˜-¾>Êßǽú  À"b»Èï‹,õÑ ¹›¨òÈ©öÒ~VEãÜáW‘¬WƒØé%:žP´ñØé&þ÷?ÿø^ûbܰZELæ6t§BïS|«‡ñV&'© µ“” ‘-¯.áª/-.¤½`à_ˆe »}"x–£ ÁÄ™ ˜æ¸[Õ$‚ºÎíù}Ý¡jOÙµ:5 (žÆ”} N©D¨Rßþ”åAm”ÓÜâ_¤‘ã}ÈoK3¯½=3ýûüDÚÉu%V®âP¨n¸âð8¥–,œ°Æ·‚¡ºèWMTü‚LÅõtAsÌ|e#1ÎÁùtwÈqõœ»’åØL¸~3¨åÿ V)i°ÑIùÄY«¨Ê}¦«9Ñb]¥qÜ*®õŽú±ê7V€#\¢“™}w– ö\SVo}w!Ž.²6¸íÁpüYP†£ŽÆSLPéŠäŠ…òËi°ˆNÍ*{¾k`êøQÐj]E(èÊ9Cvïs/¿•Kýûóá0&r@QJa_à«‚\³¯÷¥þ8œUQ0ÑïòÇì‚8mB™%ŸÏXä—% ”ªÕÛffãTD+šqÝ<¸Wáî(e[¦ôET6&‘Ü~ÕÛk àŒVí´A­Šslç¯dàÎCQJýê û“¡È–P%W¸w2¾afQ³Ýeqroë6÷Dù@ž„êxÜà~¾h°ËËÒ&Y÷íâêÛr¶Eë:ÔÏ“ùÉN´ü¨# ÌBç‹a•uŽ$ §ná$Xnÿ¥ iI5%îaçê†{–$+’ùÝFu23ÉhÛœ“k}ƒÆÝ#³8¤«ƒV­‡|GRÍÂ.¶Á³g°™.yd 3µ£ü¹yÇݾl³Gó9læÈüK¢Ô…jüðˈª™ˆK>æ2RõåuaƒÞØp˜ÎÙ ‚Æ5†eê%º˜ã+è^G­ýtÑ+]ñl°À¨“"”e÷ñ*÷ù/’õ½ã7Å­0» ºÕŽ ñœh»ú„’RE2 ôŽ\gfý1ØVC]ÍCÑ,¼neoM·žýUMÞ[6¢‘!ÌäG­“7–w¼>áXxÿZ½ 5e&.\‹C ©UTUpg€~•RjfAõÐ+ØÅÒSF«ŽS»Ü++‘›MÖxÙƒû‡m+w‡[KÛqR´¸‰tüáP$TÞç‡ãªÐ¼ž¡Mn Ò«ªOdé#Y0âþø&â÷ÇÄŒê^M+qŽ‚V/ºÉëuÎ9Úà·ÄRÃ$“ó^ÛØ([kÑF’:¬ö¤ÏÜ+AÏ!ÍѤÒÑbg"ÁêX%^UÐF‚3ž2 •˕݃GxX†UîèËëB­›:ÉfÃE¦ ¢hmZ µÄö©ØÅ1w!ÚÖÂQÜfŠùG¥C4ÄÝK‡ËÚ5¨BWR‹lθĹ”+ßê}xí‰4§Ên²§‡vµ–¨1jM—Vf¸ˆd½á¤â‡ì ÛÕYC}6gïÅxãï¬dãY£Ïh]¼˜¾ut76mÀÏ_Pµs^`;Nð"yYß ’°P„o5KtàÎGꮨßPÍ¿Ã^ Ý ôÖï €õôŠbbX\5ùª~Eœa”„5±u“›ô¦&¸<¬bÛ €^©Ôª;IÚ ‹~Åv>¯ªù®èOû4œloik†à/aV m¬b,`•b¡&Iw¯ï AÏ=Õè$ 3|¼ïDfõSº<…-ª<Îëù˜g¸ØîIxùš· BÊ 7{‡àhµà{Á©u¶]‘-²ü’KȪI4Ñéy÷JE¯°Å<»›{•4?ˆžx”$åk'ó^‡í‚ qkHù,kGHÍ\Ý ‹ê¦3¥ÝÑàÙ£Lú+ðªK¢V+]ÝÏOG"1—œq °®RoØÓôîFošdŠÅ'±¯xJY¬œlD’ÙÀ°HSL;Çú¡o­íÚ5¿9¼„>?\Å E؆ 5žZ}XK삱ÞC²â’²+¸š„üÑ¡SN£t¦ ,„I3Ýg€ñàp%` ›RW ªTþ¤>ú[Ç;×ÏÎ!ëqG3«]6UJ¶¢>Oº‚>í–ÃiS¼"Ï‹d€wÏaP²Æ¢$µ`Õª+èóœ5”¯¥åzÁlóÀµNHÙQ¥©EÍdöN ̬%¦zÿ_ `xócûÜÅûѵå † ÞË»c¨ðb«f| ?KIy˜»'Ø&Ü ÐDUã·Bµ&8b­i,Ì®ã]’]z´!c ËG.@7¡Á¢<])xPJ²cB-ƒ P©D /—DEâ½ñªás‘–Q< Éã$«þ;¸þLŽ’$#²T#Ùû™í·°MMçK6…X‘%áØL=L ã{#l²ð6l±cÚ‘L²ZÜÓÉê2ö¿ËÔ"€Ìñ­æùɪD Á¿Û{Kü·‹pë+ùœè‡04 F3"4¾¡Ï½ºˆ¾ç™“x—¤ÞÀP¯¸Å¿©áˆÝÁ1]wåOÅàZ c‘!ñn1kîmV>°ø]¿†*û”»»³0î'"5º€m¾*a~º «f’ïMÚI,¤µm„ºÿYÒŠ(J²’RÚd¹©  ˆ~hþqÒ«ýÕ€gìµxXQeö³q~Êk–T–~[zòçÓ8Ô"÷vH‡8ÁX’ÅZfèO­š‡2ŠXuuã5Úð:ǪýßTèÍܰ%?KSÿÈœñ%$ë°ÔO@£>vÜ€F‰‚T%«¢Þ•aeÛFÒØiÔÜRšÊŒ˜©ßÒšŒ^uÚIkN•–5Ügè›t”çKü2·Å­®ÊÛãÕÈh-l‚òÈM(q(JéЃ,ívezÑvQ .,~W¹WlǬÏ#4±­¹ý|ïj÷”íEiice# Ì=a&vÉö\ŸmÔ‹ä©MHo£ö’z#j_M1‡TE½ð…C[Ýgª€¨¥E L¨› PL<§ "¸m·écÝ¥Š½t£CRdý^•´ˆê`VJîn[k§î§È¬ É÷ Îõ»µÄvœûðñ•.ûÖF¥Û÷:d·„•ÓCTãߨëû^±ÎÉ#-4_‘œÆ12§Ót¬“ a9à‰z Š^BÖö`ÙF‡ +§A½¹´l5 ÷¢C¿‚Rö‹É=z"@5ZDv ·SõÝóEï‹[Yã}nà©bAœ“œ†PÍä&íÚŽ#¾”@JWa~g²á}}‰ˆ¿À”|–Ù¨µçŠ-Ì”[SÃ2„±˜øy…IÍdŠŽ«¦Ï—þÌÔ1æ&:VÒ÷0È/ÓÞ=Ž8ˆUèp¤ãƒF9YJU„çDL´À>ÞgºÑC¯ž_êPYQù†?â_Õ½2ÒqOõ™`È¢c_-^sâ‘ÇŠMfê¥0éó\›ûvŸ*øÄU,mM6 ˼.²³#<÷:fëx…->жóàŽøá¨ ­ ÀŠÓ¯F;KGëBÝé•lX½)çß»Êa O )9uoù z*$‰ªXÖB¯œ>éGSñJg²¯a­Ì „Yš³_÷ÙÄð-ÚX$¹Zvó ‹°Õ ˜PCZ‹ûpègÿóx‹"׺Öe´l¬¶ “…uVÎ3Šd‘}ŸŸ4DÔ+Ôÿ$hõE¡~¨ð¢‘Z8N±Ôýwü! ÷ú¨º+¡[ÂÁâ^53Éâ^ÝpÕ‰Bu:›Ë.ð‘‡,|ˆ’¶ü,}I¿½†¡„ÜAwi̵To«‰U²;ëÖˆø¹á>K°J]^i%ÉeŸFª»6`cRpÑFIÝ:ÛÁ´dÁ¼+jF1¡ÉdŒÙ=øY\«Ü§ìƒ&ÏÓ¿éÝ—ËÓô Jö"t4௢8‚‰rU?+E°ÖÝ€É#1€FTºÏÚ½lÑ4 &ÿ+ÒfKàÉ”°¡+ôÒõáVÁTÎ#G¸Ãµ¸Å°Îʘ˃ßô“ ?Ø^Žey”?^ˆ”NÃ:ÒŠŽð3A_ ÎÅO“¥Ú«š"àDæ_' ’#/¯yÞq÷âfYÉ  ƒírß `q>çÀ²a8vvïÒO:z…£ÐjlÞNÝæÁ{ª” u%»s°JZΚ.JQ^ ºÂ ¹šÔÊ;XDíÆØH<"ÚX]ŸµØEÊIBCùH¼.F–!¸ëÈôNí|žÚás¨–Ö6¨›ã‚\Õ¶veð‚Äì†5Ï£óºä)ÔwY4ÿ{ñC¢p½ûÁý]fõ¦x¿:ÜzÆú9HÖÛ ^ÃtgJ …í¦‘R3š–ìV/ÕãPÙÙ÷œɆ®,_ss·îÓ0ש¤jR Üyï°Vr6J6úÐYSWe#æs”ÝeÂÌM\>ÄE ¬äúk«¿¯Ä(¬³PÉeã<èÁ[ç ¬ŸTiURØb -ý *ê°{Ä,8ãÎDÂæõ|阀ÛPGUêIíÆ5}t0¨Wí·—k±ûIë3ãO-æ—‚jGŠ, ½°Vú‡ ´øÁ,ðˆ3 Ég/€_&åñí7dt”ûvf)‰b8„Œ®œ¨ü•H”Á%˜ÅùR­ÉÙÚ+Ÿ^´Oó]¹)†O·hq!{ФX ËÔtBZì³+ïJ+£næ@y¶«ÚYÏXÙ•äóˆ}Ü…dÕrÆb}̆`9ÁÍ{A\ÜÊëÌ:†““(’[­UGYÛG‘¼¥±Ø«Eédu×ÒJü´e|ÀgƒàéÀ"br“UMHwy¿ìÛêÕKª*H©ÑŽjì R¤v7¤Å¶cqÏ=º7áR¢Q‚™¥·oe7Ìrk'%ûŠ#蕃KRxEuwg%ø¯q·ÖÎBsà´–åʱLñ×Bv7ê^YmžëL \B²©Pâ›’¥tjnæ<4~× rœ½…ß›KßÒ ¾–œlt¿lu×~m„±ŒûÀrXhJ£óèü‰dÁš¥z%ocÛN¸9¬í¬¹ƒ»ú-V6®k­Ú YS"û–`ß}¶·Ã0î1Ä“ñ· õEßä^˜ÎF'¸Z‹.Yý¯NUÐ|f¶z¼/c6•ßµvë#!1¦nuij“:…ðm+¸,¸Ž;•ïYX¥c{áÊ€Õû€¾DÉ%iÑyyÀ—v<ˆèë«É¥¿ê›ÿ%hƒÒ¸ÇJIôʧ\ñÔÆP%r›ÈR\Êöâa×ãL­öä]Ýb£ª™õ¼‘Y ÓAغèâYs–ÎÀra,Öú×xÄ0­{}ôpG\ 4Ìwa±Bøkú.sh¾¯EΪ#ý*X÷×É\èKä,l:fûEúC§H “‹Š&”äLB> Ûp‡ÚTƒ^%ͧ¡®øLÝ-âÔ¦¾’ìo dÉmϸ=©UŠÝ«?«,ú¨úY}™pê¨1.j9'­µzEIm¾¸€‹²1[ŠWôêÊÉŸäHõ#h(Wo؇í{‚P „¡äR±¤¸;)4pÎZÁ€íX…„<ÂtÀÝ Šñ "í˜þN'î¹xM„”wÂXJ":0ÜŠŽÿ[ñ˜(³&T×îA·CtWÐ.šÞf`£µ,´sÀ™U`qpN\4ôÚ „½Á¥ BHŸÿ?ïïVŒ%e6ˆ42íû«Q3úÆnŠXƒ¶H–0¤[®óó«%’ãð†5 `Ms8ynx–ù€;"M³¡©H·w¨ÙW ̓‡gL_¥ø2NëüóèC<~Kç0ï¶%=KŠ˜`?¹ £äJ$.MV dQl^!©óª ãÒyñÑÆ8å6.ƒÝƫ׿¥†}eæï•˜›¤ØÅï)<¸ÀÅOdp¡è=5LC–uÁ»1Ê·/·è¥V§\u…×}§o6ýÚŽtœu¶Á—> ¯0öy$äÚËäÇ ähÞ‘0ª¥ÃÕ¤HGYâZÀV¢3*¤A¯nu$½RÛÊŽÑ»…d š¼ MJÁ ‹ñÑU¶¡"6ªÚâݽgJOYP‹¦(±<¢†FÆÔsa1üñzä-^oM1ÖUÒÒ©†BïÒÏ"†š¡âÓˆTòõ)ŹB#˜øÄÏg M…SQ˪=ZA1gcì]ƒR¡‡®r@g=â8œ±¶C–Ыá÷ƒ}”Å=̽4aŒ®EqªèÌæL¯›a/òž¸ÕDüðÞ•Č‹V¢ÃXek!?C£Æf#jn—_hÇ ÷>ze1³d„Ý[⫹w6ÄÔ;BWnk!ÇШn-4BwÂ@Vϱ䞉;ÀSÝu ªÃÉrDÏš¶¹~̇X¬™H$df?«ü˜$“UèfÆ"­LÝìtd›o¸L|ö>EójÅ;Ö†£×^~gûÖUáЇÁi¨´)·%…Š%§[,¹¢°ˆW¬¹?Ú$ b‰¬û0Vi<,rÕ#0'¡éhSgÄèEJ‚uÛA ]¢(ÖÞõ_ðHJƒzåÐà ´d*pQª|.G B8;Öà'‘6ð9!Vh ²ÝmGFáͱº=¨.]ªîIY N $dUS­É–6;Ç}.Ïê*4ÙÑO‘\„kºú¼‚û\Åá•Æ•¯šZà z#{R…æëXñì9§q®N‰¢”0¨(Vz· ã€>ƒ[aù¦Ñ â°‚gõôgLËH¯ü¬ðÇBZdT>H°¬ÿ ©æRÖ½ —)Y<9fŽ·>Eh OÖô«º‚­¦ ¢­ƒ®Q†ªŒ®^µ ¶³D]QU‚SR26ò¼`Ã@}ÏMºŒ2 )Š0t n×€Md×I ºsµ©œhn,< €cÞ!óÛRf\¬Á‡¨BL4û'»áx¸7Y‚ag×ñŽ¡0î‘k)æùóz-ÜêGI$f^iùªâOë{8ãÜ”9ßö“Õ(-³¶þSNÛPâ¶f—¸“†^I¥ERÅ+üª?vP!æÜq* £Ùf8 T+.1 Qµà€,b U4[¢hnÏV/¡ô5¾ôÕÆlŠ´âûs!ñ°­¸l4ø}N\Ñ(gqÂMbRÁ©›lô&ø3¦Õ„¹Ànœ%×ÀŒÈ·*–Âñ¹Ö n“ ”scºUߌI|[ZsðlZ*+HV TQS2¬©è>'«-¨-ŸNI¦Ú¼g,@¼LÔHdÚˆÙ1¸ñ#wi›4˜åN7îÑ ¥€ÍÕ¥’âÿg’s¬¼aá'Êß½¯ÅAh?*¦/©¸AÖÕu¦[lV±‹x;μ;Ô]¨vŽ“Þ“…mY$%‡ømáØg5ÇgÀB€4HãÜïéÇLµT[ Õ2y öXÅ¡+²_D”RÙßÄ”i¼ô%ÊГ„ôU2r‰óœ(ZA ‰í Ù¬íù á0…iDFÄ&TX÷OʘˆÜ¬¸N4ú 2îÌ(¸N\ëõÌrP"²®¼ÆêNªP«¡uñNŠ-Çj¬àñ_eÿÚ”«Ÿ‰[9~N¸8¨½ºã,%åKß…7ñG>+>Rp—ŽF ?5Ùo>3€£Ïún$C®Èr¢KEçàóÙj»Ò3Xè7c©®»¢€JÆv¤¹™9€*fWô‡5×ÃD¸Æt°-Öî0-D`šbÖµE ËŽÖùbù ’㵟{5!rJG2ŒÙ‚SŒ'¬®‚¾éÍ RªCÅŠc‘Ñ!XVt¸§ã ¡Ùj-iµQû¼âP”à‚íH£©Ïd¶CyûtC»!?È /o ºÎBè–Œ}¨ý°K¦^®4=˜2º´Dã…þ\Äò™¾ùGUô‡j±ü:‰Æb.<¾Øà|oÁ¯*û‡,Ð*‚áFömÓn¶~o“Q|£ßckï‚,í°Atøö¬$h[ºÊÈìbX3Ö®~'€¥éósÀšƒf’»7Nu*à„¾b;¹Þ<ø0ô¡Ùíæ¨£$ŒôB½5jtºA×äYòêm[‡•oÓC'öÛ-ŸçÖäQàÉUÔ£$>huÒVu•j˜Æç€†k·Úé÷Gh;=S&2z¿·"š8šg͸BWgL-\ñ»£ÞPâáÃöY6Ôš$uzÉA{¾ž¸ò¬ŠçKn8ŽU i]é©~9Q°…’Xæ‘ÉtdÌ®½¢LTT,êjYWE‘æ äÔƒwa§XɸŸÓS‡²á`ÀjsVƒaÕ=Ѭq»ÆŸ ”Á3ê&ºÝ!Õ+ k:`•@¤B=ö§hmƒ÷JS¥¥•Ä­Žh£ìÕÀ‚ýô-9¿_Ta¹_ÂX¿´dÉRóÌrï_U7 ¿Pg²,ºpßlFŠXñÜÌGH¦C6ëÎÁöDlu‹0ÅJAÑ–¹Ñ.)Wñ¶îø†8Û`,±$Ìé[‘,} $&ž7ÿÛ¯PúÇà_Ýwk*W4N—q®!}S#mœºÈáíÀ6’åd¹j³ÕøÈìÊ2dÏPøF­»tX)¶j‡ø+ÔSÇc1WšýöéúuŒ8roI½é¶8ôÑÓ³Ÿ“‘7{*€uÄ 5 µ¯Eò¿OòÔKë¼"iñ}êáz÷}è>>G ð—û)Üò$Ûü"è ÂXd.T!?4d7¹¶»ûxn aû] 9ÕFEÖ³¸)Á”Výªø>7€;AðØÏál`f€j¬éôÉNϼÛëM×UT ã©,Ñ£­,±Ñ ~Øgy°:­~J7Yt Ê'Xê?$vDŽqÁ¹kPHô$Z{¾¥@³«˜Û)P{¾Æ±”„,¶¥•o°=¬¦€çª,#wEΜGŒ¶WÓÁ 0+7éLÖÒ-¶NˆÓÔÉq‚ã¾YÒ:tåTÐßó†qAåé¼=ðÉjwP·Çj&Âp“øætëËq7®(¬ÔàÖ ÍvU ÚéJ±}ŒCø®+ F¶ƒ)ùm,c6]Þ¥þ;.)eà£+†½\!œ °+‡Qkzþ Ÿ™ÇÍÜc͸I½jšUý:zÅØ•ó.÷ 8Á&*h“ɨ<7@’Zð¤bÄ5 øìË•¾JôˆL¦½röü—qgà~kÖªÊdß^r‚ž2I.¤aKot·§!³t Ì!…W2j›–jF¤âÌ`CžÞ™ ƒY\ŒcÕÜüü,ç.öñœªEÙ¿[\wä&´ J_ä'Q® 9“GRÇoñsŽÖJ®²16p£îMóàÅOÄÜ£3yëÝŽcRÓWÞÖ- è B¸Ð‰á`ìY€yæ â(G¤»uìàqøYö¸¸Â JÒTJ Í$¸¶ëyew;pçŧ¡‰HáógÃ|åØªàZËIm®¤¼¥îÎ/­š.lôJåa¥:ihª éD†Á¤eâáúò2¹‡aÕ&®}- õŠâÞ=² ãèB*£›#ëKÅEŽ,ä®T|Wð>žV1ʻʧÁoD õãÞÂ芢A••bµ2¦žîPwu™\WÊʽꮟî3íNÇ®PdõÝÃU5xiïnŠJOª»3"i7úãfÔ¡Š"‹H¬2W¯º,­:îÝð‰xcŽŸ¨y«Î%Ø{ðÔáµG¿mm×^–Òl”dšŽÂ×,Äl\›,›ê•G.èÊê%e %dgð“ã$@ éÆŒ¬íÚÓM½¢z˜`‰^‘VT¿SyN©D²¤l÷f „&¤ä"#ä¶u°Áð׋obˆ5¡Reî¡c굕eý|š¼°.¤Å$‹¸ Uûš²>+®_f€=#Îò cÍhE÷“išzúVoãVˆõšÍá/yÄëÄm=´fVÒ¶x¸6„XaËéØ¿æù {W׌ º'ÏÖ¢T>.pvI¨©@(<ãèH´ 6ŽÉ¤ú%ÖtÁ*VÒp«hP[š#Œ¶}çuán ìfòqˆ3²êüÜ8]«†Šl¢„Ëûœ ëT5™ÞÈÝ6hOÆt «÷4°üä™ Ž"%®½ø°®˜©'ŒeÂX—<–O9¿…ò¸ý'šœ‰7b¦É¸ÌîZß3æL™Þb'FvÜèJFûç"teÃÑË6ûº¢x½½~@$«YC³AãQJ'yçFØÐÃí7¸Ýw’…©@Ãy"Ç•"œnÕdÿ`­]åA´âHŒ{ÄvS\¥KÎNµWvî­£2Þu[6kØV÷ŸôM÷¼ÚÞFulT•¿G¬Eø4Ë´y¢V¦˜]® ¥þ8¼,ò—°nm ®ßÅ  &gø5©D,ê21ƒu‚c¥ 4Õ%xúÂ騔zL„!óG»F i÷泘cÍÝhÒ¸Ê7TÞ:ã7¹úÖ§€k)Ã.öª¢WÔr{Â4«®Òâå§Î¢ ÕbXTÀU–b®EŸãéX/s DX·Ù6Ô¦$¢>2µ}ìNàç’ë"»ü¦pâ«w0'iôª`Ì+LÕº¸ÚC.§a]Y%®¨4Oq{“µ‹G?”ËÀîzÀ-ŒUÇ—YY¸È¦GÕqÓ$u²X |¬QÂr—a÷1”æË„ìÂ…™'Œõ¤1FŒQ¥g¿Fò½wŸR2!t¡«P  ;—ÆwIXv=¥£\6qç«:xùµØañJÿ±ûc nêSæÝàõZS‚V¥vxlÄ.ª‘JLC¸„OisŒ£wIT#˜ .fǽÑië§á‹a9Óäì>ãñ™¶sè‹«EA°Òü¾Ü`‘(”=Hâ•­Ë#cDïR¹ìð 7+F/Éýœ4°‰jÕª'£ÐšᎠlð/ÒZHê/BW ªªÞ8OÅA©Ôt¢ù«3ʇ‰À¹˜$ô”øÖA,€æ ã7¼ †fUX¯dÉb- xvDÍ/PÙþ¼ ¥ŸwǧÿlD¬ºÅ¥u5ÿw Ïìñ¦—½›;X/æQƒ°H"þìB°Tä §ëZJ©  ް¯*ßi‡¡žhM¶•¿¤t|¹î ËP§…_ô”]ê>èTkÚ{¦L¹³;²¦—D‚iýêMÀ|WGroóZ,cô„ç»`P*ÅÐ >ª;¦fJ˜ñˆ!ÀÒ̈}>‹k®0‡¶< ¿Þ˜ÆÊÖ?E«~¾·£ì²( >ðÕëSà¦,WÖy‡ÁÐ:âzü¦oîÉ«s»¡XÑÀ*Cc[9ã次¤nÅËwªH}ÿûƦ«esA¬¼“ÙÞ\^ƒaD(ÇÍËgÊŒ=Ä·€ªm‹Ýd®ç“gÀŠä<3åêñàQqsæ +vb;H0¡+EŒLb¸Âç¹ÃÉ0È¿æ ø¼ ‰¢ºo5“–¡ æ×1ߢj*d¹ðÕ²F¬u ÎÑÞÌɵ|øº×¼³:-o$yØ>ª•Jî•ð.$!ªbgêÚíDE;âYêC dz]Lj&gkö…‡L†PÁ`ÛsèƒóŠx˱HÙÊ£6§ùæàqÖv×ä,^èÛâ©gT+x<+x¶}6)+v%`*BáH´ŽÊcu·í^K¾—¸Bl×Óà<ì?y$ò »"Yú9«<Š)Ülè‹Ëq¨ÍŸ"ëî\´ÛÊ&ÊÀ‚00Þ裠ˆp“K¼"­E½ec]d«†{Õ@]Ðv Ê~yª¤ß\, ‡Òè|'Ë™^Ä.¦³mK ½Žf¦œVϵE½éð°“iÙϘd¼™%b‚R¹ÈkôªáIùmƒµjûyÆ“Óø=ƒájFÕ ;éœV2k«²]ÊVù>‚9rÜ^9öÄdƒ/³ÃWïÜ2Ž-dOe¨I´`UÎÝÈNk¡ÑWèw}ú=;ŸJGeÿ®Æîmi+¯×ÛM»JhŠ‹äÒêx–ʧë‚ûCcþìC|é-#³G±±¥…Æ.ÛÁAŸ1-“ ƒ+Еɤ¹â¥Ú_Í< ­ˆURw8oÀXdðU'ò¦Ï"² è—ŸÕ[鑫׌€µQ‰sZ ‹µ™¸lìafëïe! ¥9Ö¡F7¾<û;RŽ"­y0Y½~5„|$.d7Zeö„B°U¤%I‹hIë´‡fÅJÌ=AŸŽR¾@Iün»l¤jí_U¹ÐƉ@=} ÇÍ ÙïꎩŠ{5•g6ÃèUÌeã¼ÊÆÊ½;:&ÖQÈš;Öq+ k©RDfb6¦m/êªÀL< ±®LÏm§d­Ý”ÆHAùF{üÏàéûŽ qJ»°CykãëÒ¼‡ HÒщhNé"¨¥ê¨c [Žp9÷’Fj4\“’Á:.#•meh*ÒÂ¥ÂL EüÏB¬~i¦û—½fÐæáæ‘uŶ8›u@EoK=2û!’¡ñ_ <î`±þ­ÈLt8ଠ:2Š|kS%™ TÛ†N† ¸ZS[4D›kpCþ€?ÍY£/ 2œ-pc„x,ŒunÒ vã:µO"eIÒótm,ڧɸºŠK\}ßõß“™Š%‘H£Oš(â>ÃäêQ@f–UÖ—Ê:'ËY«‹¬Ã¹ˆîAÕ|åï¼}á"x‹‚Ô_výò0'šJHK¶B:o†·K ¡gŽØm£ý+ïS‹£p£Æýa0k“OZ…¯Ãúßÿü“Iß`©É•nÈr&—Ôw7>@0Ãf+å˜ÂTû‘çiÔ¯¾ôêâê§ ç‚ÆØB`Ñ¼Š™ƒþ´ E ZÍÿìËãk¸AÛL÷ÀêÅçeÖ‡L7Ÿ—]ZNîØ7J¥µ7ž_€·â‰ÇÜ.è&öìbU>ÁöÖÜ‚Y]ÜRÈÚUðäž“f> ²ƒ2Œu å S²Y4«ø>TQ§.jŒ5$Ù®==À"ÛׂoYôP†j¸sCØ™ç„àòH ©Jm|©ì¾îUÝŸ.§JÊÕW­t¿±œOÇÚI`c%5 WagU²U5˜aN¾ WüšE£–šôZ…d´Bßg€hʦ‘±Dñ„˜SŽãÜQkä;Òh×­2ÚùÁ Y¯'d¦¬ê;šjž^jôÖtWØ1 óã³Nr80ƨ 2Š×9×IÉ}%¿ÄN/çÒøÊ¶šd@„êÁtøz^ kÔ2›ÓÖá¶ ð>’•mKåŒä38ÀXÅIî)ú,¯ ÃR ¹²ñz«$Ë>ðÓŸ‹84cÑ7ô. Rû¡ÙÖ°S-‘—Sw œÇ æ€*Œ/€-©qü€m¢ë'8É%çz-‡U8§Cðh å™¨; cu±±±RÚtDf7¶¥WC'Ü’¼ÞÆN†Ë·OøÅª%á.€µ(ß4=SÖSˆkÅ2r6×Î}žÀ ¥»µØÇ1+ÊqK zEý*]z$ÔÒ¯ÔAæmíôÈèŠbx3CŠ î•æVƒADÈJAðºáM'fÝzäŸÏÈ­¢+±±š=5ûÒlc°Òpª®OFÈØavcs¥„XÎqÐ*J?f.‚BC]‹×YAÀKÕ?^™û3_R€l‘ª‰]:Á‡šîëõiMÑ‘ÃÖ¼çÉã VðMš R):w·9´»„›±UNÑd>´ué——’ᦗQN¶½ñ#U¸,ðë&váà^µÐUð±Ê½ªÑ4¦Sw݃ëBn7\;`,>`Ò¹¥rdGÖt³&S[°Ã… \†Yjì®Û««W†È6Ôå±áŽ•’…L9“%znZߊ_¯jßÄk‘-TJ÷¦²`¬àè:µ©…L¤Tñ`¹ ñèý9B<”`„ǺwÓô x3£°ë…TMˆ6+ñóËÀ+¹ ê˜ËY"Î(ÉÈü7‚Y>ÇÊW¹‚È/`uÇ—ʈ×0Õ›[HV{{ë§cEy+Œ„uöN!üXü14`±N³_ñœ†A'kn½L»Ð¿—ôËÌΔÍÎÕnÑ«¶>ŒÕ5þsÆ*HtØhñ† fÿVëežãî̤`ÑHó'Š-|ëy3W-`…:)€ GÃôÓ×—k’V?6ª¦Ý~APMžPœüËj<¯$I­ ˆ©Cr·§v³£Ýø‚ùlFûEÇr\éåk;±…­E¶ó£ž ¼Dm`­+å~¤d‹ˆ–Y ñòÚFè‚pa—zcu² pi)4M™õ¾Â!0k"Πž×ìBWñ#ù}Ð|P…­â‘2áó¨¹^—8[¸cŸ7i…-ŒdçC›‰˜S¾ù’hE!ÈMmŠDAEëmG¥ÈA%É¥ç¤"ìD•¡ä ÜÁ.OUÿ¬¡ã¨©%²¤¡R±Ô^3%Ò°´-3[/?€‚Y”ÊðýV4ãú]~z…JšªiT%ÔPG©~—9F" -BϬàøùìŸO ­²mÉnf £ÑèQ,nÕbÏÜÜ¥.ŒEb Ô™ƒ› l$™1à­vØ·©Ð!p=oâÐâ,žãC/vr[É&X Üÿ•9¹fUΤÄ_6¢13ÈÔÏÞ…¶ô–Ê w°•œvªà3ZnÛM~ûOPÀw®s6Ò†E#Í Ýñ)Ûr$¢Mj¨·±Ú£T©‘…Ó„–cvÙX¼cyG€]¬-Žy¤ 2‘äÀjXغŸ§É½2Â@Ù}ZèØU×hà{'ˆ‰'ݘ A—.1Ûd¡Ñjg‡lô8DXÏ©ƒÈˆ&ƒE¢6~žðëK™eO¼ÖÔ4P…­=@ ÝL¥Ö 3å_r,v5ŒØNE¨s«²F;µ9Cïáæ`\X·0§fúùj!>ZÄŒÉ1eÑÎþûˆ =‡-ý èJ&ÂpÑM<}+@‡ƒwƒ¶eÓ0—BÇSò¾É\È®Õý“P]€‘“\{¹p¿€¥æKúj8Èf…»·_zçe £§èUj„®¸‰üÈ‚&} !]ìhÉîéh™Y 7”Vf2l×Ã%÷êˆhùÑŠê ¦|Ç*|d³ø@² ªÈþÿê…¶Nk½äç[ˆ\ÖOJæ:¶ØÑBÈÅÿB°‚jÃØ&ìΉW9Y­¦ØE(°´±¨7è3HV¼OÐoãïÌë½6ïóïBe ÂòÐâêè(«rqWVfNÊë’ö'ȰD3SCÀ VCÝ ˜>+‡ac¹FFù$#4L*„T€N-û¦vRÒÑßzí÷¼B¾à ç]ºŠ<dƒ[˜ã! wŸ>Ûµ“ ŒbäÌlеsÃ*Œ§9(æfé^ì/¢‚Ñš )mþĬ@WT‹ ÀÒk/tÐŽè(B¹÷Lï¤úZV|ñÈŸPBÅaÃÛUPXÃ+™.¤22Í<á®Stë#Ô¢½„.7ªþ“qµ˜I‡XÞo¥rV|µ|J˜›‘…1´ÐCÖ´±r¹Ê4U”*Ú´#¢Å» ’ÑîÊ*c‰s‹¡ûqï1‘#Ý|ê¼…F’âñ,‡FÈ Væ6È«pÕ{AÈ®“;"³+Q7z±´B¼B-Í~ ˆkšhfz?DÔep´8 ,c ›Æ–Ù¢& ©YýŽ`–üâFaþ±-¹¬a0€µŽauffåÜ|Ì&?˜ (Õ¯Îå…:dº''‰ ;úsj.~…$ö¡Zß– '¾ÊWJ`¨ìMÄ«TÈ]I¯¹ËêLïÚ6)Ï´ Œ:d«.ä²Þyª¼ålöb@8-»?Èâ6NH-UͶ.’Å®kóæ,‰÷³3WØÜ8†õ’…AAЏˆ{ `•;¥^À/yÐÜ6x’#¸#Wô„öDžÚæo‹P|—&»;¦TT†Æp½ }èêY§OÒ„T{.Kc‘Ä_S9ó”Öœ;È*(Jú§å µî•ug¸'Y; {‹ù`¡_³³ÂZñ#kô“l (ìÂÁ^ãmQVB…™£Á=›ûÏÆÜa%ö8g¦#I!V½B)/€ú‚ qœ¯íQ„Àþ¤N“ÔojR‘¦eϧbé‰}I1)²ªrþF«&YÕÊT@óYÛªgçw¬\(TÅ…ìMñX ½ÊŸ_v>#CÇ68±ôݵô0¬`XÐÔj"ä%qÿã"´ñiÀ…{°ƒ1r£i׸=ØáøQê mèo·†¾2dÝȆ–j—D$õjpÚÐFWQž!}üës;¿ÅÖ¢-ôûØáÛòX6P¿5'«7¢÷¹{§ƒ¾(Jø?ÿüC?À¢Y @ g^þb%ºæÔ Xs8œŸÊQ,IŒ€¥J_¥@mü %‹ú¶D¯¬_’Ñ<ès¯Rsß &,BÏôBO‡õ°Ê§¥Z;9OŒþ)ôH‰"í<’]65¢9§.K êŒÍˤ””+`ÁvV‘9@Ūµ±f©X»P`®Kôª®®ÇŇ8ÍÎGc:¼ñÄ#sãÈU²æÈ0]Þ:(þdÕ"Ž»%,]–q´K/H4ÿ½Ñ« l•tà÷ŠˆnÂrQhA—Þ‹ºyìlÁGÙ6ÈÆ—šsž¥û:X|ø¿2ˆÌ¶Ô´ÄŒ”²¡í#²ð¾%á:›•¤o«R{š$ b#gö<—zö*î¸B0Ä;qã}ÃM®t]{ž·æø††`¨lè¤öÝ~\Ñ* Œ~²ìN›nuV’#$¯|’ ¡b‘­UéÎP+€E*3ȃ¶½õÉü(yø½Ê†\MŒÚš¨ôê[‚¢lÖ‹¹“”1q%w¨„‘F”¢£^Áw~‹Àã»pЏž,õ(WÏb/Ò;´–ƒ d2 œà.þxàj1X½&åsp𡳠Z¦NeŸ­g©ætÃñ;`[Ž(M+}ÈNþþùgãôÔyº‡…eÄÀ\ËO\ãÉùªuTV¥S~±lR’r6TÔUé+ `}Y)ÇÕ?H£ÍƒwÔ˜’: Fj€;. iOB¯¡£ÛCá “ÕÜýÂ:& ™áš=µ°« å&ر‹Ó·¼Ë£È¸ ‘»woå.\(¶Œ×Gc"Y¤xÇî’ÕÕ_¹€ÈÆ £Õ9NX‚„å&$eagJ][íHÙIɶ°±þþPbý0ze (çX‘”8¥z™~ÙPEª!°[]¸ì=tê+WªF¨XÛ‘èÕÞ£K¯P SOƒ WGfmóf!Ÿ¤À[Ý9Üô‹§012%P{I ¢hfÂUÒV†#“­×ÞJ\‹ìÖî”·: B·˜ÍÓ¬‰õÀºö˜là/UÉՠ峺qÝæJ+­7Õq¨2ó·3ï¢7ØTöænÆÕs¯¹¥ŸâŒÕî¾¶Ö/öNØpÍTm¬LŠv2?·\áâÙk£“¯ШâûYWÁ>U ƒ¤igBW» ã<’¯e÷0®Gƒ¿‹ßzv`º®¨o†xÞÚ> fùUuG$÷”Ûã2Sh´7¡õt•lwî©ÍZôÏ»µ–å_ª¨C§%Z`îOƤV=–ù£åµ»Ö« 2ë<,«û˜w¹GˆéO¥ €(}YÛÕóáO¬|L:ÚŸsª‚YÍž,e,PsÁ|úU©¢Ž%JÒ:t =iyÖ«è¾_Ë[L^/­ËƇÂV"»ËRe5pwOeì‰ÝÀlìÁ\ìZ=K8ŒG`,ÖfZ“hräÁ@çè!ÅR&}\}*´]˜»ˆz`ÙDƒ¢ô{ÞÖ¥©cÇörÌ ÿð2jª#~ON5ÜL ’H(zÁH£_©“@ êé:<þ›"ÐU=å.öV™·%µ¼Zä0ŒÅ7‰†¹ (¹¦–X²ÐÍx\R+10‚¼4ÊÂé[  œ,ºŠiœ6x£Wå¥tâaT;Ak2ºB$ƒÛ2”µö0,b[ðUósêõLõuvÊ~P}'Õ…§]Ì[L ‡¿‰FKµ·=W õ‰|v[ùc5þ2žò)¢Ýsqì—a‹– UmºšªVw[[‘IW{ ‰k>ȧ·ºu$s²ú³1¬ÂÁÉg@œõ7.N &Ñ{¿2_­;Iì‹‹Ø-[  ÌeŽ@·ïè~iEk§°fà[•w[?‘¬@ÂÀ=~‹(wh¡¶ÓN4ã¿À¢µ‘æ ªyÅŽ„2j¬EÜŸ€[gëî/m'ëÌü«;Ã%‘!iºv=Ó#/C‘„T2×ÝGP¢0~܉žÆ9ÕÚ[Cb™¬á¬÷zÅ)Yn6ƒk¡‡gGV) Ò>Ù”´ñT¶•T«ý¬:ÅK\ÀC"0VÛl¨Î´.â.”/œÇÍ…Wq+rÉYt©Ã<˾‚®B¸ÕK©¸5ʺ½½5†E’ɼC!‹~Ø4_„_¤Oµ!¬ ÃR¦–)žBµšb ,g~=oKdWHø¦/cTŠÐjÏ2ôÔ`÷2«Ô pAéÍJã^$÷®Ö™ä { °xš¬aˆ÷2Zm‘óBW‰¿Ôø»žfªÇ¥©¬.Ë,7T‡œµE¯SzšîjÈ‘5¼2÷’j«…$$J &É8«¥õàÅ·@–#O¡Äk¸ ¶SÏ‚?4ÑbôÀXm¬lز ÞÚÉFS!©¡æ¢ÑT!>ÐR¹-ÊU—½"­n7ê¶´S¯ØÀêJ4„,Ú/¸Ú ü°œÝOߎL EwX‹%8öežú:þ+¾ÖAûû5µ¬º§½¸Õœn}$‹aE²@Ïay¬È.ø½¤ÜãH–¨¶4ù `Ѱîu¹bJúQÁŸç'f­”°ž?.GS4‡Ú¤Þ\s½³£°¬æÁê„éiì€ x‘ªÀU¶ƒhUqØO11³zÖ ÁMu÷¬_›9Ai3š¼Œ~¦C“@èØ­$é}ô†DÖ¼Õ}Ãxµ³[™Ù¸kÚ=lÊO´7÷Wèp.ÇÑgKØÑíE’Û³M#šrP™Â 4?3#H–löla¸ãBâ0éýg *zÐ'K»ˆ­ð¤¾ë°„®¶*Í®ÿr‘sžï=gN|å=Ú[gxz«TV¸!)‹,βտb @W]….*‰¶hÕ6ÂVËRÅïK…I8Ü%6‚ ØP=¯¸'?hì¼nÛàƒÝ߈äMÅȺ"‰Ì¡ùÎe£Äê|:³ìX?,0µGµãf-{·­Z¿_?ŽdeÃ#ˆ© ÀGL"ÛqK®ÖùùP~­ñYÆŠcXIü¸ 6³ •þ0ì’j…AÖ„tÛ’˜Ö-ˆ^Dì%d;zU7ç0’5cQ3[¹Þ³íÔÂH‹Ã.aŠnâóáiÈ!°þ#ÀMpMZÁvéBšVABWè©¿§‘ïè«ß@“§ìî²ËMe™Kȯîl±uO«ŠOô°°b÷"Y’àÙÐÓ¾À¢5Õ•+Ö Ï²ZX ½•° áºòwK2ì mE\.íî“×e«y)ñÕWß 21/‰^‘R—Ã#^ú‰ŒŽbupáºA[Ð\팬Ú‡0Пí)q/ ˜…fYND.•\ BVû¹Å€<Á¢GöÙ‚€t§ÔY|+®&%P;ÌÈâM‚Ýnš¹ÌæÆQèO½±ÖúÒ"è©ø}Ëk€Â4öʽÕë °æOW²í’pê"TL-LÅï\ ·“ÑHÏ\‘Ë{Äœj~‚1¯ˆ¸w‡¯ÃŽ2µf@Fæ¬2ÿí1(Å8AkÀ$•|#¾H¤Õ´¬VË©ìæH©gy=Ovi ¤Žè$ØylàYRæEˆX=Vl# çH=$ËÂIM”¡`UbTY²‚W•_]oÙ3h§I”–´ª‡Êõ?^ÿe÷F¬l0ª$‹%çu QÅðÃÂg7Þ«;^=ÒŠ]5€2/pRTo5c9M…—Ä„±˜2«l‹ø•G¶Ço1L¦kd¾«}2]µPo¥‰YAW]pÊ÷/Ü‹Õ_÷º0«Þª0Y¸Ù£)ë>nÆŠøþȲZŸAÙä§?À¢Y÷Ö]ií?ž|@íi’›‡$Í!Y̓T rèW2cyNx2°@®ô•¢Àueå¬U‡"ÍÚ892BÃiÉ™d‰ ”¹…®#ÀhD"G§ì>Oíó~—-IK–dRo"Ôý'ºU‡R—X‰:f;VçÌá[Š‘;Ÿü žž–HÙ*h‘ükë"kÝ•°„gI IC—»çT¸½úÖú\¡+ó&¯‰µ·/ºÜàC—jYc8kò˜ËLöÌAÇe<åâañÕ„è·6ýƒg×áA˜½ÎÐK‡T,ŠX |0°B6d,›œcëd4{D—ªaÆ“@RÝǦ ‚© s=G9s­´Áç;Ãusèµ[0–Ž62[¶Ž ÔÒêéËË0Ö}A0Ä7ÑD•D|áþ¹ pâKT£,÷Qµ,b`+YVõ ŽLMÈjš U+k@Lv&Ϩ‘ 5|dú«FUD‘©¾¥Õ¿•™«Ïó…ˆ*T oÅ Éö5ê`‡iŸèL ÎFÏ=ëêw9ÙÌ8¾Ÿ(´xư@¼úá?Üì6âY]X.ÆTý”L«'h1BŒCWLVB LÁX,wAín* «ì~®)Ÿ5¿¹"Âó‹Vs£Ög˜“XMX®Œê°/_'o#ؤr¯¾ìˆtÉŠhè•,k—ç<ñ²¯¯àg5ÓÏLmÓY™˜Î\Ç0üë¯ÀI²À”j6§‚—.?ƒ{óžxÇjúÿ©{·ôhrIFåCoeÎìw-bÜIˆ APV}3ÕJqu'AÀ`0 æGê`Ÿ4šÜì"gë!ëíŽøÕ©X=È'n*,/šâõ Øâ_œ»ÎеÙ*éuVQ›L¬[\×Jjîaý¬P|VÊe<óùùF ÌÖš oôoÝSúw™üÿ¦ËO’&F½M 9‰åϸW‚ºÕTwc¯ø¾ª¶Qk /-Ðu¢¿48N8YÉÔá2‘ÅY Œ}Ä¿è‹Æt(–ƒ›xÜNƒ˜j -x—ÿ©FDÅØ ©NÍA¶(çAadiËd¯Ü¾h“ö`ÛúnÜ^ ã æ½® Œ•[I•ðaoñ$Á„÷saý9–l`¬HöÔu’RöZñÀ-ù¶ÂX«VÝ¢€çÒPŒü-ñª†TÜ ´S¡%¶…®6êB‡ÇÍQÃÆ®1N“®aÍVþÏh¨%ô:sàæˆp4‹°9îçᨌãùVs6ÈÂF̳èÈÆ„>fØ |kÈóC°ÔË0–cŠ*`¬±–¶Ê¥G³ ý_«{utbVo¶ë¿`¡¿%š—§âxiÍlN]èךävÿ4ï72+lâ¿\ív§¿=º Œ†À¬0“¾š½ñù!‚HT™jAí&b¸6Ó;”åñ|ã¹ÉÁ ÇBŽ¥Î…I¹¼8mÜ<%-ó«Ï»z€Sù‰¥š‚À’~~+æí«èû;Ç •Ú¾„’ýþç×uÜý2 DíçyäêÚ{0‡ïÖc ©½Ï½‡iïƒ cÉtÐ8'p᪔_„r>L1?Ü›*‰UQE Òj†KëÅCwÀ¬ÙM¾‹í`3¼õâÊ[ô+ °º«ç3^I½âíã îf¢PØ/ãÛsCõT±˜®Ñ ÏãiæVû6®ÈX ’„#Û£RÀñ‚´7—½ üylìA _ÁY‚q騗ãøÃT$䋵÷ñøŒ(ó‚êc•ü=Åfìé¢Uá•„{ "óFkº^çñ¼ÁÚ‹^žVv– V39¶õºBЙ»ÎÀ—ùT'ëÑ:‰Éwa¬‰ U gÏkµ oƒYÛ}ØòúVd‘KÖ½˜‡®yê{:8“²³½ŠxØÝ}ÚA½½¢oõlK^@L¤–^G §(ðçþf{r9¦­jÇŸ¤ÈHýÇ,"Áz~ðÇ;ʆ/E-ÒW^ ÎõøãÞçº]ùnÍÄ.¬ŒÂ,ƒïAÜ÷BÝOqÞMœcöËuN³dŽE'“µ‡h¶B#êB×Ƥ"½RVƒSî J¬=r@PÁ–˜V—гEIÒÔk›.rAòÏéG•@¤eo}Ñꓤÿ¥UÇo5}cCwO ‹™Õ1”Ǻziòa½Ñÿzg½æ¿iÅèÞV–«Œ³Áù]˜n2X‘·7]67Å>òCà]h¯7”OȇŸÆœ#Y[y ‚ÖΩVŸSµsc2Ý‘dg݆/A=<ÅÔã Íœ‚¯#Fî§äæÌulÔMŒÕ/—ä„VÛÎDXÖ=D¸LÜ® Oä?¿'4Nãp÷v‡»4ñp+$GÙ0Ä·QÝ¿ƒ±(8¯·'þ“ÚEÖk†¿ŒeÍÜ›:˜õ9€•ï[ÞŽAQr®iß#”n‘¨¼k4ÊXV»Ýë 1fÒÒý§R 9J¹*S$;{æ>a@dÏM0%¢ô×X׉¾;jçJ//æ\½˜½)kœâÞyïiÍqÚÑ}ãŒEzI˜Å)cå¨@-±³P¶ ä"Sùl?òlfwÆo7HQÝú!w=Ø g|“àŽèGòŸ©AýØä^W€é¨¼¬XDgÓ9PMÊsdÑYw¾šÜ ºSÒpíGgî’…ÕÞr¯¤‚x•—¢3¼(˜pö¨4Uñ³=õfᴣ𡠉œë7? &Üav,…íØ ·A)2€öˆï³·¶èU‹+‰¦Ô£œiUñ8Èýú‚e©r@ÞVS‡-,²(÷¡‘‹ÿ;ñs´qý"ŽËRƒ]gÕÜ]€'éÆ%ü¦‰¨{‘6Vl¹ ÉȤì'¨jS™K[P–Þ¢õÅq@{A¹¢š´™S b‘°$x@‘žÓq ÜsØX÷ÎÎ"v´N–n‡â lºÒ– n ‚»Žß¶ß™mœAù8û$™9Mº*s9RtE;âq· "a=—Íg²¿ä›¾rÃüœœ&9ªËñYÆ7döàZ-ä—aX&Âù^ó Ÿ§Üâ3ÛëìþûËÖ’}Â;Œù|bËžëÿ>²˜ØEg¤ýɸ5]E/Wˆã^J¬G[œ•þ,ï–¾jQ¼ˆþøbrÁõ3yQB–œDñº™™¯Æ”ó°½÷™ ˜Ð'yg?I|¹Pž%0–¤îó2hoÒ¤#=Pjg•&Þ…Ÿ òÛý˜Q÷†¡&=€¶¤ª\;„â‹–\@ûޱèðDäŽHå±Õ_~3ÐýE? /‚/¡lÑ—z×ìªòóX=ýdI·F(à^Q€^APƒ)•¾Ztßz/R«DJ”°ì|{ZÔ㧆<¸'»—f,…“<Õc žw+w_±í°ïg¢óÚ¶P*# Ô¾jWéË>›å ÷ÊöäZ|Xï «»ê_¸s÷1´©Û zúa(”aG7wwùGËíÆ.ü¢¦ ðŸÅåw±Ý)°Ý˲Ø‚|«›ä„ÅoffÒ âîôi\m» â³bò”Û½AyQ‹Kãù ­+.dSѵrÛ'ßåÐ:ÛÃ}Ì+€é~FB1÷ˆùŠx®ªÝ2ÿ¸-˹xÅÝçf`{ü. 'HVÝþOIèß*´î«íø¹¥†ðŽ`A¾OZ|WQ–)crÝÞ{!xrYk¹wkÀ¨¼s@˜‰ Ê 0âµô•äœç"“ÁÍ©ýu«Å<׳#oÔ/V ï¶q¾_ ssÙâvÙ+~.ìIGŠóà:c¸œ{Ûy,‹j ÐKëÈNeK9)bCközåÏÐÉíÆÑsGBXzpŒá~7Œ¿È3ê\9¨zÀëM)ôå‘Ìݶ^…±(6ê^Ø¥‡Å²ÅáËëÆ–L”¸V¹¹Ã"÷ç[ëÒŸZŸ¸±.çñõʹj¯°ÈŒ%`YåÅàbµóç„¿€À¾òÕ8ÍvÙ%u$k®jŒãb&Œ0ÌüæÏ^wfJz/ølÈÈÇc2IÚ„(u©„(Ü¿)˜[‡·L¼e&àâPId9I-¶Ž13Ž1Ýwöc¦õ¥UêM¸WS X«¬ÁâáŽU˜TgA/aXb„Ð#tD?]¸þÍ×,Nè·‘œóÍņM"ôj½—Ä> ?b4*oºq®}ÆI½ÁR^R۳ݘäY©"™|®ˆõy¹] Ë¢æë&ÿdf¯¿²˜\ù°÷ù)fP›¤9³º7³tκ'¾>Úf|c¿q²±õ(, é”$ÃdÞ±å÷6‘{Šcèj e5Š#gÝ´W3 ü„8…õæ0ï6cá";Þm|îú¨DGçúº '»w©÷äYH÷ò‡Üð|%” ±6õ6WôÝÝ z´õ˜lŸ@9ü§Š0~¸ ¼»ò|8TH±˜ãsöíÌtaþEQx¤U{ÝJwFšÀ`mŒ³…wzÃʬ"zÕÞnã^Þc_±ýº¢j;-Ãí^_ ýªP´Óën–¹B%i©¡µ¹¹Eè £™¸5óÔÙÀÖQªD…©cÔX§§ èïOU¯,LXèW+©µ§¹»›+Ì2'C…D}ä&næQ¡îsÜX¢[€™‰“,ÒÒr;¤Â£×Q:‹‹ÿ¯ó„á-™™R¤;î'Ççzß?vó5ËÜÁõƒí`ÇOXÊÛäû`­:¼ˆÃ“»xêl&‘Þs¯(Q/£ÃÈÏ"r‹["úÑ%Ú5MÏ=k<åãeÃbý%ÌqŸ¬Ô)¢U8nAï”j}¿'¦©âÍ)‚¿…JÌ>,0 …XWE¯®Ë>†FIα¸ûËk^æë¢W0¨ë¬¹y?®—:1[e«ã°’YÜOÜ÷cêKÞЏóDP¹Ölc¯Œùÿ¼!ÌQÝG*ŽƒìÂjc…ƒð kÀXÝ;³8`cñ~‡fö»%†n쪆¨z¯P®„†.à}ªöÙ¸Ã>Bû?º§ª …(@XÜFBô®Õò.\òg Q:å¸à.YFrº±Ÿ,$¾K–•áŒÛÁ¦wSŒ:·]ÛÖæÞÉx`Qy6ÙbºA‹7fÐÀ¿‹R¸„´×Ž?§ëy cñ®‚‹{Ï7êË—r ~jˆX¶Î˜y/¨Gq×aVެ"2…ÏÆgêC…/È;BW É"â^=—¢=% zõ\p `ñ¨ÑíSì"=NÉÜG+±¹¶.yQ)Üÿ&ʳµ›C¯0ÊDFä÷³îßIOy7BiË­””­ûR$s<“S±x4Ø\!ƒŠ¸»[´ZG?ô:²Ëìj„NôJW›#ªÝVμ"t…o(aq™“ø!ŒÅ<ˆiiW¸=ñ5';Š<%Ç–@˜P ½„Æ"Y\« ë7:—ßF|öæ&8Žò\«À?w»w÷§H`"á•_ÞZT«-t¼­ L÷ò¤Hw¦§ ë¶u#cvÏË­E“ÃtbÔÒ´¦â´}‘õã +o±t`årù3‹ 2ÿ¥ƒ×èÓ‚3nF¾¼ø,%¢¼1´Ø‡ó¸´×ÃÞVås¾è¸XØB  ï•ŠièÇŽþ˜å÷cô€!Ú*,ãqNEã‡+/xØÕÝȈ‘~Ïþw‘’™¦^neõWQ4$ä>õÛn¥î0{ym4QXäqÌ5t…cLx%PÛqê)J%_¿­Cxͼ`ÛáYŠì6oú _‚t‚4ëÊè ²5•7±\ÔÞÚ(b÷Y¾Þ¯(ƒT3QXWÅŠsý»a 3IMæèÌ£^ /×êt’ƒ°&r¶í?®Ýe]Ä_“&ý.Ù“? F£ŠuÊÃ*VM[°£¨³^O0¦Ú:).¸Þë¼æ;oMcØ[ó63´ YÝ;õ’5 ¹µa»ß¶‘;Qö/ÂUuÌh f¹…0É1q¥È©h÷ Ã;ÜB¨xjLx/v¹·{Ä$¡ÙTP0Лøýë©É5°ƒÀÛCŠW“#Su&*ïËŸzº’G€¿ÒâQÍþ\ÛiÆÛÌ*ûßOG[”ßÉ%Q¬.ýþ.jlY¸{Ý+RSÁMçp–cÅ^…ðè’ …‘h6dõ4”c¢ I²Ûðžbø {sbç†x…d‘7ÏpOx§þçØEiXÁ–M3˜më1;@aÙX‹Ma÷Òw7}‰vn¤ïžì_"í”I+‰£OEÞ¥•UØK¨T¼IŒ–I=«¾õšÍ‘,:!*Û&ÉÚÞ‘Uú*jÍÛ,ꟲzy vW:Ý8?8ØUñ|¤:¸ÕÒô­âÚ$¦´<Õ‰¶Ã„Š $ÅÏ"ï •Öj¸ˆ[vÁVËr¯ÄsM­òÔjc%pd&`#õSNGt+Ò†PÜ’ ´ FÒÐ| ‘,ë¶£—.£šÔxAcƒ|gÓ «x·¹%wâ:­Éí3جí¯z{`{ìÖ¹áÕÝ»S¬'¼tžpÃR¿!5øRâî÷o¬*Ö¯‡pÁ&è¨d@¡@p kAƒ8ÙÀÛ2ª[@)wÉ’‰4ÕQ¥Æâ<òAÃÞí‹G0ÖV‹a¬jÖñ%ˆê‹ó6{‰”òùRþâ/}±9“:Hm–‘vM£»ˆ•…¨('R¥Õ¨ÊÒáÀeK6È…d)Š´Ãý•ý‘Í–çÙ”3=9/ë;ø)Ñøxb^FGô£UmΗ>kÂÜÒ”I¬{ ¸V½:3.(ÔiE 1zÍæD©œLî•YˆT“ß⹫ݾ þü¬³)ýФúh°VÜ|mg•,Qó$jó¶€|îÁÃ3HV…ˆäÚŸÿ7ÿðÉê­ ³‚`ÏZU<2ûPlÂæ‹†½ÿ˜yä)«ŠÕ+6±'LïMœM7ln_G¹ÊsaÊqÚyZ—éýÏ o:¯×JëŠyl6‡²ì½±™¥^]š*|šæí$röõÕTžÈ>„Å/ß+s´œ¼›@ Ëfx÷Š h%1|­Ä•{44Å é.ŒB†ÙHZšÂ;|^qRH‹mST ÕÆ Wˆ?-¨ÖËԸ³p;Qúe©¾mê¥ -Jòp®ŠZˆuú9º§|k¦5¨ Çiåü­ãR1Sï9?¦ W6±Ë%©hND!õv´ðQѾuƒ'Fÿõ™Ir²ÁXÖ$ˈ™›äx`& E‘ÃC€•˜]Ø+"8lÁè$Ѫ×8Æ7o¡+áéæÉ#>[.¢‰½ÃÚ:3ºE¤ˆÏr²›³°‰CU m#áë˜ÔçŠ/ÂÝv 5AÒeøœü–÷]kïâdƒ•æäžÕ4|+eŸ&G„w;±~“V±­”}e=aSÜSÐq^Q1å\Õ9Yßʈûwk^,çËCÂZ™† ëS ±ÝÆ×PçèþG9[vV±äöŒïaçkî^Õ‘Ô- ^Oò¸WÉä 2èê)ÍÏND€iîœúØÅ`Kñ^£6-Ïß`HÁ;zd<Ê.ÕNâüÀ£s7Ûž¹ëü#ÒÆê _Õ%< ëH‹œyïŠx°ºÒÕØvðÅUÖìDŸçEl¤@gGÔïk³E£¾.ñ¾Ü}¬ŸÖoO¹°#¶áWT€nJÿu!JŠíÈ3žsƒØG§OÌæÅˆ:ÊíâlvòKN ƒZ2ñ–xE‚¢uÁÍN¥¸WÐïxóóÜ*Ô­°E ŒKyí3UâµÄ:ÆÂÑÚÒ­açDs•Ÿ÷Í„ bèŠÚ3tÔ,© ±‘tÓùúƒ‚Ñ=áÈÁ'yM,:Ë™ j9;ÈÈOÕ|DÔÜÍû¥çjs%ÿ’ÜFÎ0ñx…i‰CÖù$ë@œä }åíI´}JâÅið”¢ìãê=ùÓÁðZÞÞS(è«Ñ9Œõa½àæÛ¼kE`È×ú¯)Z¤%ß:s5@ÄqoeÒÂX¼Ã°èDtWb*äo‘{°¹Í¤ØzU%øžÆ‚‡ÝôjZ¦þ ³!QÊÿDé^€¬§—üðÇ…(hÁˆéÃö6‚´áQ`Ÿ=´¼²Ë¶Ù5Fþ~üÑ"–$ô•«U%› €Õâb¯òMpÎXN‚¾wñŽ£”c@h ‚GઓüxÌüç‘P3€dfÉuÔÝq &A²[ìÍ "Î¥zH‘0ÒOßRg´âW;s¡òý9ëë/› õ ·Ö)/àVë×,þ_—•éuïÈ]¹ò„½Ð:0ßZ [‰µ!){1b•¤ ƒqfII7I[Ÿ= ½¸Ç!%Úm¡<cò¨`¬­ˆu%×ï,S ÎmwP^ù0!å_ë±9_ÜHõŒ‰Vó§õOký‡gåCÞ¨é.ˆÕ-’JU t7†¯<âÍêšj4œü“Hîɹ¢=ó¶$›ÞòÍtñ[&ò¶1«¾è³;ž%íA@s­­Ëä™VèJ–Ð=r„êÕ8¥´'ˆ ¼ ‡£ZbæSÒÜÙ U%†hH„<(´,” í‚ Æ¼ {Ã,÷Š)^q™ÎeF›¸2sB›É(Ë‘4×jP–:JÙ}$$½¦ŠE5^ÃëÐ]M‰ûœÎöºar˜ƒã̄ΙV(kSr0ËBÞ.R± ‹ 3ƒÛ_žª¹£|¯ÿµÜ#æ2«½NX@å:˜@þ «ìúTa{G•+ýîˆAȰ) ÛÜþs(Ç6LÜZœ¹ÂÀ¬0šawãR¯Åðdü·AZ<ÖÞúÊæL.Ô§v,†×µzÆÂ7N Ú}MÚq¯Ö_6•/ZçÁWj¢T˜Úí¶&q‰]JãñörÚBQlTt'¾ŽÞp:ÒËÕOULJ¸ž(d±ØØ4Û~ƒÂ)‰ÕÇ˺ï{„D—ô­õ=Š2‡’ÜÕl0HLŸVWPvlð ‹Œ¡ˆK…BIÌá&bx%ý¢ïR„ÿéá¦Â/#È®Ín°X› +Ë]‰^¹×$()ž¤øsßL¦-­‡þˆErØ…îõyáçjüYgÑA“P±¼®@ ý"Nòul‡…˜æ%á¦tpâ ÍžX•6B>nýú £¤2¢Éåu,*ŰÄÐÞ¢ÍC©8 î7±c›–~çÈÑ\Ö˜ìJ -ÂÝ¡ŠÄtg©!…n¿AŽ„VÛ}ÖDò—³h7Xý&Ù)‡á*˜‡ä§v5õ¤{“åù*‚Ów…yør׿L.xÌÆZ¯_±ÕãÜN~èÈYÁF^'ÒE¬¦ï¬™™ð¤bIƒa­“%.€µòñUôŠâc|éHÑï¸ú“`‹œ˜ Àæ‚|£LÓDÈ„Û5z5ã9{…áÁvM¨ÉiDò’¶Lj=Ç™•²fŽä‹ à¤O¹k²Kêæá:/¡w™±´šê誰®òëêºË ¯û)^9Е?l-zb±Uð$+œ ›¹Çœ°^\MjÍb$DËÀ¸0Z?ìýƒ´@ÒâLK óFƒüË÷ÉJœ[B®÷<Ât‚1ÊÈ[8ÆÇ°´Ì"ßIì£5ÓO0¬hHž„ œ Lcµ'ÊjîU¢uuŠ[¡FK9Ò“rKqoXÛih©Öº{…!þu,Øýùzå{ú]øèÒ©ÌµÌ 3îè,ˆ†¦kj„ÄFà ·¨÷ØíÍ|·Òf"³Ô#Zœ#PšX‰_AßAEý4MýwªèrDÞ©—zÌ kÕßXío2ΆÍl"…,Š3ƒ­lÍÆJ€VröÃn'OˆžÉâö³ÐûÛV»ý‡î9¨Õä zEŽGiàwï!˜üM&×â”Éú‘Žgó¿°ÈÓ4jJ¢ð;hIM†’é(FÉóhx°¶½YT â4ÔZEp=Z<¡Fa+“dÚžôŒÖÓ¯×ðéŒõ*ªT°¯ÎÐ<œ¤V l— ‘ó5¶’K¡ÒáÍÂÅ ÿ›´ïµÒmO—âWRƿưNe5*®‘Q¥@œìDÏ@å 鯩O©“¾¿ËF7üP 5h5{©‰l„\ŸÁÙ¢ïä=1©U8ÝžyW q!ÑKT,žˆñÔ˜¸LÅÊ; ›áÇE¾ƒí‘ÓñÚà +GñÉ „=¶W†]|«‡¨±·ýÇ0ñ-c¿¨bu¢v=ÿÞ5\úB¸×sü1°+·¶"úT‰’CÆU™ b7–HA7®½ÍE·`ÖNå­BŲúî״ЙGa’i|BÈ*¶B·— o¶ÜG`²+JÁOÒ4ÛV \H’›Ê€ÀíN¹]—Rþo+—Db\KZmÙ½òæ6=š€LRäJ†ÿ"T‹ãéË‹¥Á›{ÁËÙ”¹¶táþýê +aÀË/# ¹müò7^ƒš)òúØTœlMöÆÝ·£~õó#?O4Ö©¶‹:‡´›"=öƒ9€e£žyT ù#¡.éÅ!ïKI°2˜ù“W‡â?!Óh*«|c9`„tyt¯Šeì6ž®Bçß8eD-Ú~KÀ®yjÉ!JÉø½ ôCú$¤ ¼cyÆÀ;seŽ=­çxER#þÓV²šþ]гqRùîˆî‹H ¹òù*ØÏ%èÅÚíM+kÁãç®'ξÀŒáŠˆ½‚á)ý,a8ȇvj9•õ½[ îÀ×MR_Mp"*í,5(À³$Å»k(ÿiQ{æ AöñáÝáPlÑ«›Ö «Ôž×ôª–‹.c”#Œ¬Í*MXÜ–åT ÆfÝ M÷]VXÂM“Âl…½õ‡D˜9,‰9Љ‹èŠÝÉ1nL±ëqˇŠ%( ‘âÁ°g`–;ÀÂñDê·°ž¤ñ` +L9BÒq2/=¬N]z»”øˆ• oýgm[Ï«d47&Úѹ‘ÿ]‚Úõüë”ãtÆp§'ûŒðêRŽ+öÐä%z…@ n+Ù>ÚéEÊU8~©/f¤wâ70–×ÚWÆZƘ‚Ò z>¹ûÿåF„ldjHOS±°Ñæ,ŸXŸÓ¯Š¶¾øx<ωֈ]×½ XÄj&÷ ©ò'’&‘ù%nÇ l¡ææTC…~Úl,&cQžJ‹Ö ‡)"¢ÖÔÄŸîë²}ºØ·<´çgi8vNÆõçê<ÖkŸXÿÁÔRáû?îXÒ‹N& y£¡DÀÆç‘¡µ4‚cÕ©ß̬Xöbµ¥’8)ö¶öÕë9Úî#”„6‚Ü7™šá ~RY…A5ã¿n²èK¼oïÑ;´ñH ÷[ b]$ëE«¶(œÉû×À§ª7‰¼5¥–äGåp¢Wã?–áÁy6ùþ¶€[¿TªôjùœÉqÓþ¼4F½" M'D¤%{Þ¯6Ëøá&:÷Nµ<^iìQ±èdÚåõzFººñ¦¦&šÍ¶èÕš$̆î€ÇæNqªoÂß(ð“< ±©Ý ÒI1P:»•~|zU4ÊæB]*[­Áµ2ˆxx΀JP;K-A2¤²çW¿;¸*Űî…×õ Yæƒð¼-†uÍå<º„Ì\˜;{ÇÔˆ*‘h\Cß&“3‹ÝÍ R=×A+”÷]$ƒ•§”Û?¹l,–³=© Äöݨû­`µ}<¿ï.ãb¯Aœ| ßËǘšHW¦@eC#kâž8¶ÅR¼¿¨­´¡“B÷ †5¹§]›«@VþÒÀ[ø¥¸ÜrFñ°¦,€§‡•&Ø'^]6N[\è`ÐI¯õ»Á+Û‡#Ë£EI=(8Húd… ­Íh½KÈlèþ&΃+")Ñ+RŒª&OV…€ßËÆ-Êxæ«³É Ã­(1V©DUÒ |,(–¢þÌpû3Ÿ<Úãó¢h¨Õêñü7Š/¨,:æÓó7Ft‰ƒÙl TÁ¥Eð…3ÅFÙÖ-ì‡Îžfнj£‹›0™#!UÊ䮀E'RÒæ¬+Nö Oª2û +KÎWbb}TfW=MèùK'b1û PõuˆŠvö.öJráõ;0bw eÜ+]Ýq[Ë·#x"iëR£hãKÃó°›Ü"ðCÙQ¹S\˜ ìwâ«;˜‘æŒUÙòØÎke¾fDȪ㛕%ý?²Üêq3£éN*¥x…‹ÀxÏ*Þ#¤IùVhŒ‚Ê!DÛMý0Y?Ž Fz׊Ž.˜ÕÅeô®3¡ÅÃk‹)äW‡ïsB2­&u.DØã“=dNé&<ÍÍ)ëþkÖïQÔê C¿ztî0©¤œã]¿€TЪ¼ Zñ)ðºúÜ žw»5:ì"ýf»1uz9¨t9øUγ+É _äëBÅß2Ý^ÀõŒ )0JAÁA2³à¹¸Ê,±O®Ò“ '±y ÀÀGP#`¿îR‘GÉȻÈÍy„Ç—j}±d£ô~½S|ëôýÔÔñ*ë3*!äkXª$|°r¬†„¼s½Õ®"V7·Ò*–Ôq†2!¤iÿçn9ò0)ùFhŸ¦ƒy)µ,‰= Ù o´ùj¾cÂݳ"˜¦ªÐ¾÷ÿ4Ôe¥œƒÆžP÷ÀódÔ; ñã÷Ýà] } ²&|1 `‰õ`#D5eQ€{6œ°†Ý‹›#E²v °àF{•ÈñÕVÁð*ÍÆT+L«bu- ÞMøëFHµ+Oá_Õ…ÚãC#ÑeD,€5÷¡*áp¬Qèj¶”¿ q=~zؾÐGâÌþ—‚¼9b>[Áoùí_ï+¼Æ°^èJ$9g³³ÓT@¯(˜° ª¢k Ô…¿<‚îׇ:eÚa2QêWûáA,èÕÃ_d£ŸE»a´w?‘ªôãF] n‘¶b¨0aÚ_uø’§´µs#²ÿëŠ^òúâÞ-/»W¼šñ¸ñÖŸ;~.ZD²Âùõu|ó™W éõ×?ÿÚ uèÒúw¡+¶Ýz=Ýžâ?FRóÅ*% ZÉü$²š Š%c¢ŽÔ‚Ÿ&Jþ™5F¢ì!Žé­‘jq"E¯¶ÐÕ»ó1ZíH{öò.U½‹aÉ2uÏáúÌCíèRàÛû‘߾ݙv{š§qáKá$C½r²¡÷°†ŽûÄ\Ërèͯê¤)' Dˆí’v?CW¶Z³Î•Nñ•]ù_õ“ˆV,¿ýsOv+ƒ¥, +œ/ Wƒxs¤}tþÖ5#‘Å $±}uç£ïèL aýЀ=¢„ÞÌw(.Õ@°Xj”ÄÚíÍ›Y,x•Ók"?4º¸[ÎÓ›°CøŽð™Üº’ê²tÕ-¼>BWǾyÍÎ|!÷uâëú1·"F˜m¬j´&ŠÛ+4¤¼5„øDB1 ¬™÷øî=†±z co0,qí·…vtY ò &W"mP'£Zƒ›ô<(±ÈâV÷¿š*=Œ©àK Z4ŸÔ'‘ª:*çĘ­ÀrrêÑÑôL&,úf‹|— ~(CÆ@ZÅ÷ŠŠN+Ò…›&BM W4IU±‚kAØÚÓY惑Æâ£Ý¾ ¯ …×H·•hÁaû=7âäáw椭ÏÀ:¤ƒ¹{v·%hŸÁ¢H‡ ]ÑP¨|4¯FÆÏø˜‚¼_âmr¸†¦gó˜}[“Äï¦Â[Ož4ä-†5“1º»Ìæ'> ßÐ(F3®UÑ‘Ü 6{•hØH ~õ‡ñ ŽÝókŒ²ö@ì†EÆgfõéƒ#ò5»qBâÏ Š–˜è‘¢y÷·È½¥ß*åê=Š„©/ÊJ…ª˜xr€/»Ìeö á—jœÑ½ÃIœÉŸ‚÷oq—!µHR¯Sþ8^ØŸ¤g§Ü+ Ý’@¬š6x¡š›¡ýlí=nµ&D{+°(´v’8ËSD-×w§XÔï¿ É¢Ä«1¶AgañL܇ìøÊ €…$($¤shµ9E²b¥Â·<\èJ^Þvdìåë{½v‘ ÌâºñÍ nË`Ñ“ ÚEÎÃâåuB MÉè‰[Óºí~ÿ|—‹_¶6¿U·pSÖý¯õ@‰Ê•žÖ*Rñ¢‘FhõìSŸ‡¥ NÅ0sI縗oÐv¨jqyb‘]·D*€X…Óÿ xª ù»a1èÀ6×N8Y_½îí©Ävæ1c¦²P]Cð=øwH‹P ¦oCeýxJ°ò$9q+· l²,$ ˜y)®[ü¾Ñ®l^øÊ-âõ+ýWóÄÓGÕJ{š{»{ῠɢ²ËGtLL î}‘Ïó¬dºu+| R+rlV 7 ™ðiçéº /ö_¼A”).eY¬g…WØæ„ÜÎ ðƒloq?wl‰°î£ªKh­itTuµÞÖ M!ÁÑdªG¥ÔÿÚèqÆ.¶ÁOý ”¦•Îæ£i©MrHRØõxʆ¾c!Gòv¥Ô³“0Q†À¾::¿©pîæG‘ûøž†¾H+4Œ¹êܩ×ÄæïÊZ}Å[ªW}¼+¦Œðʘ…žIf÷kiP=Ôà먻¦ÌôûJÅ–dE09± å;»}Üz)IÁ3‹Ù8Ïyvv6”*äÙãÃnÁ‚´Wú䤙Ä#‡š·Ž‹Xû}7Çìaef°;þÓ㢔Íçêò24ƒ[³€Uœ€Ï“þ,íÉÆ¿x© Hww(“¾›=ª~½·ÓD­ûéÐÉk/Ñ%Yµ´àãÍèŽýþ˜¨ô]"ÍY,,^Fˆ {‹;'òzþ§-×V„Ná}„µ…,Â^T¥s ¯¤ °Å^AÕñL_–ÁWöÕ>Ÿ€q5Â/ãédØuÃÁÉLdMà¨À(dõ Çê(É SYí´ÃJ„=#d-ê^áÙ0—]®ºçævkà/…˜ò ›еneæ«F~³=¾`U¦IÅ US׆…&wÊܽ\*jT…$‚ûäj.®›…]ÕïUòV¦’Ée')mõÔ¯Ù Iž"W$K[´Ð¯¤†–Á›ü´u‡¤¢½zíúцéÏÂÐ%ŠR¿úB'’=ŒkJ«¶ÊÚÛMS§|n5?Yœ‡Ÿ]ª«cOèSüÛ1˜®¥d¸Wݨ¨’†±–µëÕzêü¨BÁ@ü…CM´lmŠ+m^ŸvÇí‹fE„o&Õ{rFz“SÏÊIH=øvß5b{‘Sò $ä.¡U±øð¥^_„扡¬õÒ ûb°ýêpÞ-“E^ÝŽ õ«zÌéà>…&ýj€­Û‡É$©û+ç|"9ù\”¾œ›ÍTl 6èùËû\™±Åøj5ˆ!Ypñã„jATHoU~ ¦í‚¿Ú€l䌠¼&—ýkÜ ßÅ1>Ùé¼SE¬¼×ÖλòÁæ`Ñs‰™µ¯;:§=ewäºôL5«k™ö®ýaҷ̪XÖ…ßQG¦­@ÁCe}þØ e¹\•±ÁuW‚¨ý$!t …(I÷ Á-áUm…±œ‹¯ÆQÂkÎÅ_{¿þõ_t¼NŸò9ŒU4èhA6^Á˜®­ÁB1:F;@ßE¯"§òè;æ×-ÆO¹³ŸR,eÅO/¼&jQ:ˆ÷ùáõ-¶èëjЏWÏJÃÔÞà rsŽ„@©HâsÊ´Ñ"å'´ý΃ÊÐÍRÓkD’7†ßm ˆEU6×Ïy"[ÄÄ9(Ây'šcóJ$]Mø/S3Vײ%_TÔE!•@Ý,a-µËR»3RŲ¦É=˜%dMôîÆoù<ël£q=‚±J(zN‚Eo¸Å˜ š¿5M–‘ù‘^8w}1ðæ×·Ðú]R¬÷:ªÒWÝ+«ïnž®*Ée•^ý¨¾8Tþ&t–‡Û”þ6M¦5?„±S=¶×¡ÅÙÔF÷jôÒ¤HK$ôŽ·è<Ÿ¬%ß``•™0âËèg€êõ, ¢çö 9W»Àh‚ó æþ‚¢øÉÑÆ'§$ÇœVR¼&àsæ~Ó,+³ºÜ¡W˜ÚC†Ý´#žT±¼çp½ªk挗€Q%DŽÞÙ›1”îcö¦Â³R"=9H;ôŠˆèçf®0‘¾"ÙÙö†2"çÁÉ nòæà¶M¼ K‰”ž:­GÅ¡”Öª|*ØèÑêÏ(²g‘ƒAB.$èêWNÁs”ä‰Lõ˜sW~¡1,±¯o*­ ‡ ¸\Õ¿.Ë8 Ö-°ÕÓ0Ú?¸ìHo‡[´[ô*?§#(á¥eoù'q™¥à<[† #qwÙf¨Eÿ"Œ• V%¥Âs¤ƒv°2Òei'7?Âèw‹–’ÉÁ…Ÿ3W ôQìÀ; öÑD3ãr¾SM3¨Nzx†¼H_µ =u¼¾%ë“s²ü¡B1£D ¸ Œ­&«|.6ذæ(jê°¯®4tⱬºs6‘×\ѯ"Y¯‰WÍãBVฬÖaXÛÁ„˜9'Ël_»šþ]4{õêÂáŸì*€¿îþ]ªt5ö¥h;†Õƒ®†šü}`X b…À™µ8É–ÑïµÚ)ÃÎXºó*BÁüëä¬O¤þÕ !KîØKd¿çp cå² NDIž|§w¢Åt®¥úUÍÖ‹ð˜ŠÅìÏí[MR*òíuë«„ „Z‰øu˳ÉB9QøŒ•è²³‹õx¤` + ‰G­R¿’®…h5Œ›EÇ® þ2ôñÄ’à½o%ñ­t#êqµ­!ãë¯8CÍóÀKIÌÎæõÖ>GðØÂlg(H"M±hŽe]‘!^ÉûKbhºL$ÑåIjK“iÑô®’9L{aûä’X‰°:Çøbl¿–E¼ï¢Tî•çÀEþ¢¢ÛGp VËSÊ_0¬€V‹ŽÕD©®(æiº1ÔÏ%r#—Ó³·ìH.5+· ˆ 3ïR³HÜZUÇ]Û8XpD°úá ¤@ƒ…¤Æ¯¹¯ˆðš½$äoßãE2»7ñøXü+Âßl4÷¤ø–òf„&¼ÃgQHÒjè1ífx·m( À©w-”®U›‡¬nM€r“Ûå>rÜKfO˪>-M°à–)§äzéô/ÿÔibQÓׄô+ž3o¬­ùàt_&Ý0|ûuY2¨Úâ°ö€£,ñQß‘P~aOR¿}î¦EÍ] `E Ñ’,º-2y>Éa=H8ô¥¯Z£\¬}ù«¤_ èëÀ'¢i_¤Ç6- ÞW‘ñ¾®ý¾øãN‰~rVáäú$›Ÿuhóþªæp9ž(䀕ªEº ©X}3ŠÈ“u5GƒYëq~wT;±l#¢<â¤kÓ˜Î;¢TðFÙ'LF„Î5€ÏYln#=fê^³„¡XÌ%fDÿ¸šÚÎ þ›;|$” é?™›nžrôÊX@CH›Ò çHú@ãÇÛÀJÈ7©Ý>gÓ†Ò8fíïSÁ­ ûˆâRy[›çEëÇ¿·ÌVÞ]/"£Ä ‡¡$eÚï1ÿ\Õ!”­œÂ—ãÊ𘵊W-RÝÝÝ‚1ÉÁºþ¾ÜB–¯Þvx}²Ñ¢I%—©šä˜œñ.·{y1¿†÷û-rý­Pj>ž î 6Í_3|#‹´Ðû“o0;zX‚Aog ­ŸIÊÄŸöšz`$3øªé¯G ;D¿*š@µÓ½SÛ11ÞÇbÙˆâYð\1 xX®pA€pÐã-zõÎ…p¯ùý~®(8äØ?ƒ¾ˆdE™!ï.Ê¡&É›<ƒ†Ð&¥cLTã^Áùà†±!;ù1Œµ’¤Üßã3+ãú–Åÿg çí¹É»ƒÆ¢.*Ç1HHÜ»`ÕéW³§ç-Ń‚S,VÆÉyöC»9’ya‚V˜ý—bÜX|« 3ë fÀV³QyLžÔ¼Ç¬ôþz[JvU}ŒÅå?¿SfEºç¢+0g”œù;_ßaXŪ$cþ5³„”².ö1r0±ðß]47š]ç%뼤%›ßszŽ&Ÿ ^QqGƒx…{æ?áÛÖäþS\E ݬvQ³wR§÷±þ0üeÊ+O>ù%v¿¡˜¢ Wªò¬Þ9-¿ü‘Ê Ÿó¢¹'‹P¿z4¶FËÒ¯rôªÕ +Ô’ïHj³§ ¦ÇõOEoaI)¥ð®% `pz2, Ãí ¶@üÞE¯ît¡5Â^{qfž‹Oœ6ÓÏšö¥aÎÓ j©Ê6r¼ åD¼¬¨ê‹x¾wìѬ>9‘¼I Ñùè¼ë"pLft•_sš,…\À³äÉ¢‡u btÑ{îù,¡VEP«ÇÐ Á•5&¡¶°œa2âÕ.Û °ìO:¯Ðð;ÃÜž–·uaEqLÅZðÓè")—ÁG‘9G"=A’±sæŒ.éÜ“¢nqQò8ÊIòæ®Ô:`IÖöIô žq’¾Ü!ª…@éª^|‘¡»i‚!ÇûÀ¦»0ÿE ÿÆ¢ «kÐ|Ša=–K½i9‘ufÈ5îUûƯ#Ú&…Â69fq,EhâZ×U-Á",b| %“ß”ªòp„x[zEB¤¤57kÜ(ýe@ç”àðÚ+׿‹¬áÂ寧²Á¼ƒQä?zÐŒ­˜gyÕÀùüµ‡èÍÌôÃÂPÄr} aþSgjpS *ÏéßÎ.LÀѰÍ)[pÆ£,¿µ–B·(jkëú.–õ<)ö+áÜÐZ4Ts¥‰§ÕS×8ÿG«èÂr°lŽ<Œ+»>¤@²´æ¼_§\ýjâ¹xÌefµÛiÌÞÇåxÅî‹âºµ§J´õò»Ã)’E;BÖorû̘¢ äpºd¡ÝÙᔄuµF¡yî_Ãhz‘6Çh0ÚÎr¶ÀsÞòU]kÚ•­O‚a%9€;R½1•Ÿe60]&-¤ó$$ü²äŸÂËP˜ y¦(¬ê¸¸`΋ÆÂîLù¥U:õi’$$ë,ájxuƒù_æ¥ì…lÄúüDœ¼Œ¤„¬ÝÛª¶s\®“«~ýô&Ôˆ`¯z†™X}csï‰L Ë… ºw&6G ¤uvîOó±wûq\ôëØz¸œ—,TçqÀ?JÃ’…”dÂ?¶™4ƒ¶˜ëó…eot…Ý”jÜ‚R:òdбÏbv—š*–7[êÄk½#¾"|ö!Z|dÚ/ô RVg÷ÐÀ:¥_A°gMáß¾y©øìa«/‡ÿRÖg»ÆxÞ$!±Íî ÓðX˜‹¶jUújnÔÇဋ¬7\îU`MúTPB»ÃƒÐš±£Lid&HñÇÙ4: "Å´,—Z?z/hyû÷×ÁfHó#ˆbMO+ÛElŸ‚Ѧ‚GT¬.–S×ÚRë×;k»Þ°‚p¢0ïÐýoU¾™!-Ù¹ËV="^%=ϧâ'ÝÄn«Tl´YŸ#Ыj.ƒbªš*ÖZàIms+ßoJ¾ƒ´‚_ Õžè©NûÞ<,ï$2{ûÑÿÍBǽ¢~uW\×sï#ư¬|;-§ÀB¼S|K¨K{×ôCW‡œÛBT¬#mß!Pá1ñœS18WÊýg­àüàV$À0RbôŠS¹˜U ‹˜à:mYð-KŸM‘yc=¿pÔÐ(*`Xä "±„55xj•¤§NçàÅ×p+Ç—?§[Ô¥ãrÚâØ¬ßBw¤‹üã ªÒîÓ{¢3bµ‹½Ìt=ö2ù:ËqÉä0KWÑ’Þ˜ ¹’í[èÊÌ»ÐTÓ«Ðú¾¢ßJ…¹³i:ɿݟ² æÂ^îqÍå±Ä ýÆ&9˜(ÈèÓÆÙ¢‡_©¼9‰?‚±Pˆ9Ѹ+ù®e,f3CšV¸½Å0™ƒjÁ7‘×¶@c †)¼)¢eh}QjçàhƒG`ôîÀвø.lÀ/ÖéÏùN”ô~\Z„aY¼™àÿüÏÿD`g8C7 JÍ- K¸•¹äó.$²Ž¬ãk6`ÎûQÏMO\V6ÐÚÌÄŸŽ(*ô+"´F¸²DDÚí™ô•¸k7÷J_¤èÕºª!šavõ.B%.`Ç(Õ‹ccñ.ÐañŸf¨ìNÈcîoØûâ}™;ËœÏJN,*ªlð5š¨VgªÛE!¯"Î S`5?kîU~f'ƒ]Üž|;#î»h;Ø?ðÛi®‰»Gņ\JV‹×®sþL«˜sc·gRÙŠ¨Ãᜮ{ ³]Šø„²ÏÂîB… LV5KßE °ÈóˆƒÁó§)@wM ÀwBQ_A+¨b+}µ WþïÅQå5ùÁ„;ߊ˜æÒuOž&ÚE§ÂÂ2¶0ËÝìÊö¾z˜¸ç2»ÐÕ‚^5ÜMT„Å*¥ž,Çe… w§òXØ‘n¥Zîm1)9ðÑÜ\ †~U›Q¼±Äï2gãfTEÙôú8izÐNè^ÒS±žKï7º+\½Jb‰rô‰W7òxXÝXä™EàÅcTÔ÷ënl"ª Xc70¯ƒköhñg ™k¸Çq1ˆjäAÈ;îÕu}3òlø…{5[òƒT,òèÄLð§°L·ëùCÒ¿†Š¡ÏNìú#Äjqç´¿áhëhªH{–“(p}Tf*ñ°†Õû2˜kºëмt>;1"â~Þæt/+A±wêÜ+Ji#-Gn“q™À8?°ÕœÚÚÞÐ¥#iÓ<ƒ´k;t!d?oü–v»Q/Ði¿¬ŠQЯӺÚx‹9Yɳð6„æ™â"šæØ2`;02ò÷BLjü`Y>ýй‘~Ì@¯+ Ù,jËèŠ šÔI’¯Ñ4#{üo_P*L¬êWÇ•<Kýgk¢ 2ž%å3øC,d3$*Øek®‡ÀbïÓîË¢Ò¥àÞ™˜m0‰¸9¾¼•ަŔðŠÖ).•W‚anîµ@| ååÌÆRMJÜIW-"“LÃVê;+$·ÎJ|{™ˆïÁKõ%ÖjJH‹³›oá·p‚3neX²>t°z=¡pœ-ùC¢aç—`w!ÑFCžÝׯh¹º¨ô¦ˆ ¹BæÎb>RÅŠf{´•ü#ØŒ:qáPØñ¶Ïô­b^NÅžžy„ßÊ}o®°‚Âx^õæÃÔöNŸfî>¯$grÖæ}$O ˜ý%Á ¼>fQØÚt.Å鮩ïÔQ †—FÀ—Ø“Tú¬+CY}\é“KmÿÝMôVÕÍÅÀr«w_æi®”Vå^}è`ÊfäÞé…è¾ Žâp£F½Ê¤´x.š(_ À›]Õ¼­‘1#§€&µÛ}é+RÉôUEôê“1™ÒJ ŃÙ@±·ÏâsÜ:©“rR—]î³{œ¬‘R7ké(´sfó3r³ŽyX²Ra>_f›f…w0ÐÎZ:à)ýgâw¢ÑCM…Yü¾î¾ùöÐêûÔ; 0¯ÊÊPŽÇ ©âQhQ+ñ+#LÍ#àà[U¸YÎfðVÈh£ô ¿Hg)…{¢Åß–Oѯ[êJ4Á´¨¿¯Oô+x*š! GH I+C}3±;0úTºÀênv+ðu?9 ²O˜¹Â½F{²ej …Óv~NÇKgQÎ"¢F#`¸‹kÓŽuÀ¨BÆÈ2-Xw%‰.è/?#zŠóÉ^h‹a¹Jð3ke$3¼’ÍÅ®õ²xl¨ù»3ÄÊDÌ#ô|SN ÒÓú¡W°4Òºy®Ï¦.Ï)Ýlî»TdAÁ$X=ržR’œù«VN{¹F„”ÔMë¿-€åNR\exèÕÕ2ÎE'µÅû¥rü¹•g[—µ'Lä6 LqŒ«"…³Ý³.˜L¢¼¯MÏ}Y¦%¤Ú³`Q@öù:ŒU—Ž&ÓÁ`Vi+}å¨åÌHÚÖuÝNîNeGô2’Å"¥áÁõn«Zó®Ô£í@'³8Ëù¯É·ŸÂY}SP8´e¨Éÿ÷Or@zw{äªØc:õ] O*Éæ©˜ÓYyƒ2¨±A¯€hÏÓŽ-©·¨ck½ÿ.º¡¥ÌNÖÉ·k»»ìé©GõÃ_CWv3£î<tº6f.p—!×¼È!ÔŒÒq.Ñ®WšÂpâ®ß³SEýN—0ü#ÇçeÇXÊôMnÚ–¨iÔæ¥äþêó=…ŒîAf€g¯‘S6¡~Ðr¼¯)f¤Ê*Bv™–¥Âoà°é‹GÎÕ6`îóv[©ÆiÇZ•‚q}ÉbÇ·1Õ#½æy.ã*ò\YOân}8gÊÛßÙ•S³gÊÝ+iŠßåRÛ5W¬ªâƒ·gÔ¨äóv‘‚¡ šÚñpë1äI°’„sY¦Rkƒù$à D??kœeܨ–>ewT*dÁk~"è|ÐN[÷Ý9ÛEvSÕ&ÀZ5ßÚ"c7²´A¯æ8 œ §ÕôáO›æØW8Qûƒ=õ†|Cq\?0ü¨`q&á‘ ¤áùÂÀš½ã¯¥ó˜Îðþí 8`=5 'åí^à@pi]êF=×ûÿäϤò0ÿ˜.…ÛÚÈàO2ðÿ ¬ï$ ÍXî*K-ȹÿ“׳¶?¹ C ¹›¡Eu×,ŠÜ ú€¥XkK¸&¾.ýŠ”·ö|h`B®…ÑNú3§ÅdÂ@ù&s±°üö¸•QTÙ–åÙYiŸá>LqŸ—±»µìŒ<­»QîpèýƒuÒ†UÒÚ2b à×ôÓ‚¶Ó R ñ¬i0Ú’`¹Õ ôŠÆ8 ž÷_\ÏɌ×kþyqlÒŽ+ïªëÙ["¡@…T£VÐ’ð0«&…/"CüËa8`D(èD$kÉìiWcSAK…ˆ~¬–¶ø ÀèÙ¢ÀnžÍ^òíù MúôÖKà`H8þ¹Õ ½ZÛ­5È3À’æMô ÂV!«ˆ µ 8צ”ZWhr{éDèUóÒ˜¤œf×Pu°Þj;òu¤ëJsÑh¸¯ÔȺ4ÕHX ŽÉ¼°1a4£ÀÚÂÜ{Ü<©Ò÷òB¦ºÜ¬¦ ¹ˆD©ÿnË‚âæZÞt`[ËîøM%±ú3Ž©•ÈtÓ%²Hf­x%g ùyñƒN©XF•W ©£^?wZvS}r°éX[ë„}=!­èÇñ¾sá‹æ¼È°’§uÀÁqÉ»·£J‹P°×#fŸû sŠaÑZjéMâÙ ðî*Õë# àÊ€ÓàÙxiIX·¦–g/~IÂ-êU.äët±BHTìΡïn£ UíÌ»ÛTà b¯§Cü^ñ¾Š|±´7ïñp…h¬Ö?Çõ²5±½þ V‘¡l#Ÿâ´ìä-0,k¾“¼ùâa_Á·ÁB°ƒÿ\é+ZØþcÄ£ÅÌ£ ÷Ê^Øfº£×¹ÕÆÿ²1˜à[å?ØTíô¤aÁN²Õ·¬€°r#ã°‘Ã>c<Ä’4 Î2uL¿ØJ¤Q$iˆÒMÇ€…G¸ þ\ocoÝ ù`Ž>ª¼§=(Ñõ•_špÂa—àÒ*ˆÒ—l—ʇwx`Ã/çP\ød1û$ ‘Zk{ 3°§íi3Ë|S¯mêàv½”ÆbVqçÁ^zƒïœ®_ËRó< Lés"ô±#œÛˆ÷ɬ}+|ÍÜin!1Ͳ=?Ö/ÆáëC–õU¢WPÁa,(AAŽ+·&w7ì/A,k]Ž óÖ©§µ›â˜«Bçé²{X„Ùˆ2@»9i0aLä*ý¹*-Lúðt[B"ð]RV͈O©áíAÅbU¥Ü½Ï†[„ obÑOÑd:ô!õ¢ ¢AwM½ï§ m®Gc0é¶=ó<…¦J¼nq;»Ç¯™ï Q.?oà‘º¤‚EˆzcLÝTžÄ¨UQR½Z:-™ùëâcÖœÊéÿ Š{»¦ÚöTsƒË oyµ%øÑÆògç’Ö·<~£¦©Ró-pž¤*ñu6õG–ˆT°â‚ÕW³) 3úTÿ^É1׈¨¯ÝùÆ«$:-è¿´,„¹é}C£À¸G­«{»!òNm;hÞæH+í÷µ “Au¹ŒÕRZ‹z æÒfKqboë¹(Œ«0Bæux®zB'• ‡õ*lg&Ú;#VOÛ£ÚÛ[82º·FÆ?„'ƒU]ÚLÇ«©!Ù¡W´‘{\MÇÜX‹˜&DÌã)2ñ¸7ï%'jr䑚›é@’Eç]¹X¡Æád?¸/Û /WNg3-—g:Z©{øl‘¾Z“Í Ù]~‹HÕ¨|Ðc©cÖYNöUUšÝG¯ÂaXNõAŠLr[x0.HÖÑt•¤›{Ü2¸þÌ¿ ¤0ø÷²M÷W›èXÊiÁçDíÇDë^ò é&Ƥ兌ÌúDZÂîLÌéó\0Œ* ˆ'“\H¢´Ã5 L(aÞëÖAà¹w˜Å]j†´ø·.Ÿ&ÑOÒ Iw_ Ô´q] Îõ‚á#^P­H™Ÿ\ä*Ò„ ‚¿±<Êxƒ€ïzX1¨¢ÈÑú˜a§ÕâfÃrʘ‰Ï.mã@¡Wªd£›Øu]åðë³—DÒlÅØ—Ñ"+’G)ýÐl›VÈ’ZïÚ˜ßñ'~_®»‰ä"æ¸Iür…Ð+;­sw)-ÊŒgÔ›´ÒÖ»ÌØ•Qw0•Ž’oœ?‰G–Ÿ|€fqºÇÙcî¶«-òes•fPÝ[4]øx0‚Æh›X9V²$uÝD‹añ&¹º{92“„þx´°šNg'‚:‘Óm+xÆŒ– õò ”Kß"˜(ï'*™âòäìNåæ>xFyGJû ¬SŒöX´œè†çÃs+½m€ôRÁF¾à¡Î‹ì-ÿ±rX “ªí ,HN 8ò¡%¼mk{-Í)Ý’éqQE[à¼×¹ç6%`}ÄóÎæ‘¡ªÂ§I b(M´Ð™ØqtJ^“ÏÁ5˜Ä£"~Z¥vïu„èåSW …j¬[tîX;~ ¥²¸É‡ÃIƒžÀMİl1#’½Cœï‚[=UnxuJÑ}Ñ<‹¨è\Ë䈴µô…x‚Û@:C*–»›¬ÀVQ:…-*`÷Ö-±B>â]´40"øÉ°˜8©¬tö½jÑwÇÜÝÎúl5úuÜAËâ<Ú*vù+‰¤&Ó¦‰âö˜UF=ìV¥ÞßíÙ—E³Ð•+´j™==˜púNó¥œÀ‡M ÑWŸ3à‹çŒŽž{Ùÿ)å[ðk’z¬Ä¸Õç—;R·ˆCºÒ;©yÁ¨Å`™Î]Ó[z.)Éu"ÛÁYìó¤“êšb›ÞâÁPÏíPH¾ëAÖÏó 6¹»ôCÓ"ÆX>ÛÏ9fg4W(äZº?÷R?Ó…Ü„cáŨÿÑ0–œïȦs­]¯Öû¥£ÔG™´xþ3 -RÓ‚¸Ü¬ÙË9B£D´š$VÒ´ó|»X´M(£¦e+D$Ðz2/kƒwÂës"iŠR*¨à‰qfÊ"ÁMzŠ‚¿Ú/Ø?C¬ê-ŠOì·ú¦.ÝÌËP'n3‡rŸ;€T~‡*ÓYJ9m{éþµÂÉM3п s4¯¶±ÃƒëÛë^NqÉze؃›ÎáµÅïøˆ’_j®0Ž”•¨Ï/³Ä¶è[y  ƒ (çbÖ”Il›ãrß_jz?À¹Ãí+ÆhY–÷,¼ñ]J”Š„Ë[yö£fù.·s\l®Iïón/¼ëSAXîOR \:V}ìŸy¾KÖ¯îéNwùê<ÇЇ€¿þ¦r&‹˜Ã8Ë-ÃÃr «xO±9,ö“'5×fÝ»Å(O[> GÆŽ ÀF†ŒIˆkü·p“¡CÐê½*¼€cÉ»êàs—óS»ËQu8^Bf}Šôƒ…¡@µ¨úR/£%EÒ«;J¶Î³&YlV&êÜ3 ÖÞÙæÔ±¥&`\Šæ$¦ZåýBüL‚ØpPØ3fañÉ»pWwWõ»»÷.âã%?Ç,Uv¹ÎMÀsLôO&( ¶ƒÁ…rá÷_‹ÓX•(³‡®ôFm&£‚7‘äØ9¹˜”BÌ{ïÈ‹H þèìtÖ3V/Öý'*W§›*‚®¶Í¨'>bHüÐ:NˆC–¯’åȸ-Æ­3ûèY‰B U,v´Pg^ yzú6A"±1eA¢`pW¯"‹‡b…-m'÷Û9ÚX@2‹RÍŠL M~à.¾&Ë‘¨ñ†‹V÷¯¼v|ó(!Æä)à¤`hÅUœ¤4tØæw‹K¸ßbîZ»åç˜É,³Ì…<=F9¶¥â`²Á…¢"]N×FÐ÷Q§Àœ&äu×ÃS¶ÎÑð#c–/Tá($rªÊÊkN2@"({ÞvÔòÚ§e°s;¨Ì%âÎE;¬íÝù9L)vš†×ôå0h`º?‰â@s£Éæ¬Dœxp%xW†ÐÛªœãК¨×‘œ[@ÖŒ’„6ËŠÐaO¨õZYfû5GäÊMÚ"V›°%ˆR,H!0c‰ëªí:3H ’6òi´p|ºKá/²#åzE‘Ä÷΃­õ䛺ÔóÄíRé$šºL }Rß@Ýîp+yˆ:ݲ“‡¡ì3jÇ^IsfÁðpÕ(’ì XÎé-Fªâù: º ×"ux ­®»W÷ÿji1œ8a;!ôéñƒ:ýS¯$i›°9<Ø;úîÛqmó~¢œšl·­H¢]nçÍuä0 ¼bàaŽÏ„æx‹~^¯èr üè§êß‘0lzÝ‘Í[óã:°pXÃJo ˜ªÊX(iD?Ó=CÚ|ŠZYî£ëÙ-¦s°wÙŸ?©±L¬Ã®ê¶›†NÀt³ ¼,™Ð¬+Åw¡+Úñ4“¢‚y¬ª(L‚cüæôhjª[3êÍ@ôªn³7¿W¿t¨OI2³H”bàGžn–@ìî¥}´Œ™¼ÆŒ½ƒB k>\Úrª±Z^“o%[€!ýïœ{$OiiŸ#9QHIV§s‚¨b¥L·»S*†twDÁ[­bèüa¯ë»Ñ/!ë±—ä³WTö»¾ÀèËÔ.ló»”i‹ÛF5þÚõ_¬aLzÀiàr ðE£Q‹¦H}¿l1ëÈÂÅbX¼=U„úþ(µ82ÌèØ›é.ÞÍoÁ²îs{ é¥ód3ù \©§$Y"ý³Ç 5ézÕ^I“ägÊWÿH~+W¾ÙžÞuh#ê5^|:Ø<´\@jéÂýä¹ j¡NŠÎƒ߸¿Ha?7ý ×s±u`jŒÛæšÔ‹`Dl˜«Ö–*˜_¢yÓuB0†;ÀO^<¡¬$±Š1M…Ñð=‘ 6]µYë1,Ügƒ!QDkQÖ%œ-*ì–Å{-yéODš¢ÓFÔ¬+â¶@'í²ˆj‘Ùü‚ݸ鼤xjÖ¯L«âW/•ôH(QûÓ?K‡å‘÷þð骇Äá2D©2I£ç#aŽ*÷ x£® Ãù¯³Ï•O’‡e[ýp£ÎC )pEEø‰üQÍU’V$`xèilbÄ­Žè*ùŒqºyãï«´W&v™ç©ñ ƒØÕwóY$ëz1Aˆéï[Iý°-0¤jüú®ÉßíC¸›¨$6ú¡º"¨Òy‘˘P´0®ŠE€´³žÜ"@Ó–[ÈŠrº`n_Ö9âÎúP´Ú3§LáDïÏš¼{8wºÁ‘~°övÃ…D…k[üû<ÐIšë‘‡EpÀW@«?E¬*q" Pzf"“Çèbk_–ƒïÅ^â~žPóÎñá:to…ºâ% µ7œk›í|2ò1+á šðÎûH¢ê´’Ëëõ…ÌÈ^¿ª{õ2ù»òX¤¢ìñ()6+˜qÞ¡Saq_“«€~•¢8‡®P°-ø£À‘ºÈ÷ l“< ñ®)!X.3ٽ Ázô!ª^tíþµ€þ‚Å/@wvy»ˆí«ùmžá>«ï ¶˦¦À(±Àwòvíð+gR‘](G\,3þM1ºÀé °(ø‡èEvO 0¸}¥ Û|‘S!ƒ•D^E5¾°sÁë<…ˆ¥¸ÄCšØfÚ;*ŠÊGÍ`hYµµq1‚ÃFËfš©M/Ë€ãöÃ9fëôó\°ŽXñÉs·»žÓä•Tq5ê3Ež#o¯£¾ÿÀ;ãµ((ÌJ¾—Wo‡wgëí¶Xa$ï¡÷6 ·þ£ó!€Æ~ãúM‡‹;̮ߤk$hÜ©0æUï1-æ†n…`M&ÆÕ~~Ý»iºçå9ELXLˆKÐË)Ì|í¨ô&\-¼ßV5wúlËï!lìÞmÃàU»¾yù5íˆW£“u×]ÍEž=¨Ñ¸Ú?OœæKÆþPÅ‚ðué‚þÓuÉç’¡ÐAÔoZ΄3"¸`f×Ff¾²šÉ@á!ºÄ̈çz’Œ1ª¾(ÿئëªxÚØ~u´m©.”9W Í$Ùî|b‰wºuT™xuÓK°K>O½¥ñõyÃÍéíååà0µ¸ÔT†Px_A_Rî3¥ó7Ön¥×'yø(UžSî±½»ÑÛÑ{wZ:QB±“BÏÍOȨ»l¨Å6’Ê::¿S… 'Çs—kf{33}ºôòûbJ€J“ƒI°Nÿ¯£W9õã'À¶ó¥ªŽ(€¼¹‰åžµ8c6[ôôÛöZ”,Ƀ_nl.ã’ÿE°UŒ^å€Û»pI? ­«Ê’®$@ïþŸ4ˆá j`º™6;„ïÉ4V¸N Fìö ~tâø«C‰ÓR»¯¡0Ö6)`Òlo±¡ÞéÕ{ǽB‚æß\Iä0e4çÚ@×öi‹ÇKI]ÏFí>/ŸëÌl'ê#7_‹ÝDzçôA³+ñá¦5÷úQÑt'Ͱ[˜mtê$ÌVêØÐRjÞ„ó 8»­ï šOt–µ°=€ÛÝ,Ã1¬vtÚt'¡ÖK!<Š‘,oœs‚‰Ð˜å[]÷ZN^È1)_1O+Þ?‚®zuµp©!7‡ÚTPѺ2Q`‹xr6=-•C¾™nÃgŽWY…p©IñJø­ðE«½1îLüh›múóº {)¡ýÛµêãé¾25Äh¡<³Øaž†÷`%†Çq}Yò”éQ¿1’ŒWËq=¿öàt3n³…á3ÚÌ,Q˜½´ô ZÉGÊw™™ÑÎì³c\=øSG^X‰ÚÀ9õʤ‚iæß ý}øÜʤ&8ÇUÆuÜ×—Éîbæ¿øvlpOWœ*ò­ûŒ1ÞUðÉݽT.3Â[ÇŒôI’3˜×CEEÀF\Øâ›æÓá9ø¡jhîE7XI¥K^­Tó¶n‹¼y(åº5 zœ WØYœò«:g+úËQz'UO#ÚØ@"AtWôçY8ª¸q„ð[ÙXšä¢3á'ó€W–G@ NПBxãgñÌnÏ_XLqøØ Wí¶œSì9A&¬þ/NAn‘,‹ÇóšAâšãÎ*zX~ ^ß CFt\Œ(yêSe`Œ4N‹ÌÄÄ\è¨ê@­Ð:šûS‘P\‡-ü”T&§Œ¤sn)ñÈZ—Pòí˰ê0ÓÐÝû^ýƒÅC;<öx÷Îͺ{û:Ò‹]¨:"écã,ãs(X_g{K£:v·¾Åð2¹áX¤¥WäÙ¼XæëEž»­„ñU3QNA.2HÇÈ,‹Îè˜Ö«Â€Â)¼ô‰wRèŠvZWË`8$j‰™kðÕ½Hh¹^'²W…_BKS+‡ñÂÓó<½äw‘Ë[?äƒî[ü¤ùÕˆW’†ßõJáóØø (¸SÁ@ì!§DT놯PW{è³”QIqà£ÖÊP©ëNÞ~Û˜ðǧIŽJÀô?¨t7A´ SF'`âëÒ¶ÐU­2Yl’G™¨€Û)€rÉäÑ׆­6R.þ³íÿ:©H<s¥ù­¯e"ÁGz6ü²èÿâÈÕñó ’†p -ÄrŠ9±TðÐ3¹„ÌÅeǶ‡‡8æß© x/ïB‹ÝuáãSãQ Ä]F¹g©ANÙˆ‰êÿ'I GFñ*C6:ˆbxDì &.Qåÿ‹a¨Oœºò@\.HòèHÆÉœ]¡ž5›äKÂ-XÞ³ŸúèæcÉñÊA¦@¬Ñ«1 r<<ˆ s îô ~ƒX%øb•Gÿ¶…®n)þF¸°.©àëôºª°Ž£×üÓ¯xÊÏÍÕ¼§]îxqelÌ—ÆÚÿêi¾>×㌭Q¿ÆÑ”ãõŠaýêbüªTšØ2„ÕíÁ¨Z¥(àØ· ­£±¢ÂÙ$õ™jic¤erz5r ‹ þñøÐÝ[éÁ0]#!ÞÉÌG®U(\H¦épITj†„ë×gë¨Ï¶\ZÄð7d$6±CãGtï=ÊAæQ7†ßl%˜s'¿#Æ+$éŒ~XËG;_d`¼Sås× {-„|m3N÷sºd+¦ýNž|‰$ªŽŒ²9¿ò[“Þª¹/c†9ËÝh’Mhu¿O%v\ƒcÛȾH'ÅbKŸvèä6C¾°B.@º‘˜ åJ¯Š^Á@§ØhÑÅìþ•ap,ñVâý†Ä/Ɇþ/8ÜàÉÈçÝŠñóÌBþÒK&<¢Œå½‚0E Ö ß´úpoFžj§û{Ö;¨ÅẘBübuªxÕtÂþBÔc=d|÷àï æN8SŒ›ðX`áw„T<Ì4ö$G_H²Ú6Fš¬¿w”ÃÐâ2F­²{)‚û®"6+aìNúÕHï©c9Ry?Ê®OÇfµ»×#wå†ë#Ã}ͼS.˜º]®í7Ÿ¬¶hëR â~}¼íuÕCwÍ<˜g€Î$½w¤¤}™V2T;ºZ"áÎôÄÆÚjk'‘™Uõ_»N!ùË0_S4›u¿¯ðع߅fÒF{‡O“TN-]–;ÞÍ7ú1”¢_€8Ñ@Ÿøøt Cy•KaŸhaÃq ³Ý'6Ö„äEö§ÔH=•)Šüî´Û´ŠFÑN¥¶Z’ §›eÉÆÒZG5C׿nm#¨?ðü#Ã߯ NTÛs[ƒ-Á娾=}¹ð¬¨»kS“„XÝ[¢òd!ÀKÓ|Àâ5a§6H7–v¨ûÁ¹IT•Ë)þ(m¨,3~R $û·>bp _r0Ë?ÿŒÏó»ãÜp€ä—½ö sÇël4fÉÒLtE»¡ú‘÷$$éñíN2…ÎðGÁøðGìV^ôýy_žRP—Ü€ÜS­Ì+ì>\]¨+ù÷v!= (³‚©é~ÛŽQZÖ†0Ýn@ wrà'Äúóü5E#<Òz`{b‘¸õ¾TJzÔî—½C0Nï Ìt%¦B¡" ‹Œ€0-Œƒ=n/fŽa±¥6ÿüpï—bªýœüzŸ~ãp䓤Ū…Vh>þå’U:1– ð6v^ý6± ¸p†!v¤`€©–9€šKÏÈî çµ[*l¯Ë G †u!´Ø  H#$ßbzXWÐQ÷ºÅTî¢Pf±/UÔqÛò£Yéô¡Ý¶4z”X °þÍ„4¶f¶ô+¤µ‚èŸÇP9ÉŽØ §„)·ÚñÐqEÜ#ew‡YªÏ¹n^®)…ѥŗdhŠ ’J‘+7èφ ‹tG,or»‚·…ð÷R…¥‹ýð-p£Xv\»&p˺7pçÕ]ÎÀ?‹öœ,cþ5ƒ„!?å&â=‚n@Ó,è÷Ã+ðG~§~âS§Eu2®ãy☘[ó+v^ÒiƲgg2¨2K˜®"An†Œclm§8>¸F.¨d‡Û|î+A̽¼®¾ÅIêr‹û2EÑÞæà{ANÿ/pãN‘»¨¡B;¦0{Cm“9­gEž·Z<+Ž«ß>³¹Ç 7»3†ïŽN7­<‚®È³F’°D[¹ÝûȇóQûö5×ïü½Ò6Ûüä1I^o2ÆÍ_Û ¼o Å:spR°Ü¤N™kSó «‡º<Ï8B7‹ðGUô4·”Íœ1ú*^ü´[lùgLi DHÑk 6¬ð– „qP§¥5E¶6Öš ûO5jž¿T ›ƒÖ¶7tUjDÙÄt–Ó(Z?‘¬Šã©ÚµŽ¨5¢~.mØA$ßú‹C…xõ›z!åóùÀ)tKžˆçþMWñûW‘('\p›ƒ¯ƒk=§_Tx£›š7MxP‡Ã¶èð3µ¸bçRjÙ]ÿ¹®Kg‹<øÜÊ.ª·l©í˜*¥šXð´í"¤O“gÑÁÃz÷˜õ¶ƒ„òàø63z±„0†æèUE%}Åk®y.)ÃDNΩ¿ÛM=iÝlÞch&ðIy Ÿ6,ÿêÊì5W Šb^¡»ÒWÏo„K•Ä*îj®E„jn*߂ٖy¦¾ @†Tt€=0´[?G¯sž#D ÇÕihŰæ»&s~[q‘Àâj/B.cV'ÓW™ÂuQö–ÊU¾}*:8?á+" €Û„Zù‘|ìp–žNÈ&|s×ÿ¯x –G9R˜Õ]½ï¾þ)ï'´çdA&Ä~×jb¹êŽ`Î Þ.vþÙÓ6k¬[ɹ i¥yÕ|‘„,›0GQéfù:n•Ôÿ¶LÍG_1t(¯Äjƒã;…x»ëùŠw':ÜóæNáoCòÔg¿Œ<ý×ü |ýÚÎÓ³xaØÇ®¦T¶«ÀÀ‘„Š+âÑ<,øÞMjŽoò¿žóëÇWD2£tìØ(Îܹ?iÏ¢„%¥V˜žwIÅ)*à•ÏßTIÛPVé[ø¯'àMŒâ‹§n«èçÂXˆÕ‚a‘G;Z[°zDµ"}VW¾€U}xîSáPÔòˆ©ñ§¾ÃO` ø×ðrúçOø¨uJš;tã?ÇÕÒl+Ãî¼¹¥yqMã)ˆÎ.~ª(Ž KB'‹ó`¤-øôfw(SÂé`“ñà’/¼\‘.’ ñŠR·Í¨P¦“&™-|xW«#I/ëÔMgVî`“ð×ul:äî¢ut[}í$½ <”‡ÒyÏw‰ýqT X~¡Ph¡Yš§löTÕ6ÞȆþèÉ ›„Çö*½˜¯¥  ³šø… ^ ]øXó[«½ÂÆâ8cG`ß¹¬Oñù‡¦‹‰XnóØ¥ÇÒ¡èÕ‡?‰#yFÞKô¨É"‘µ~l3j3ójüc›5ƒ×J±JÅÚ+uÅMšR4t }:È¥¸“qB»4]½övEüK2||Ç–N:ŸÓ£S³ƒ>{©×‹Fž}uæýÞÈA+æü¦ÿÅÞ“eÂbõð€'þ`•.pdÎÊ&3øXö´ÆÜ'Qs^öà×fB ÆB¸–\¨å O¦ê’oL]`Xv ¹H7ÄWaÊB¾Ò2!-,Ö«­†R• Qw#›¯,Œ#BjR[=“ð“ü¢Ô‰ZgŸ™C2IB«j¥Q**SÅäæu Eu2¨\Äê²s„V/d‰)XÎó}J‘HV«ÐÊÈj( J®ù|v¦§ÖÜQ|'ÜâÓ¡<.˜¥ˆ KFïƒãz£²‹‡¼sý¾îÇÌäí+—Ç/@ÃRòðŸ`SY;°oæ;⛼4¾¶R»Ðò®¥Ð>¾V$Ý„‡Æ°g)¨;fÞÿGÝ•-HŽã8BYÿÿÅ[Æ>Ø’Iñìˆìî©Ý™©ÊŒÓ–( Ožo"¸H=G¤j ôlSEËI&9³ÿ¦ÜVˆçóõgÖ‰)œÎæñ<ñ+ö‚ JV¡%"ОÕùŽ¢€ŠxÖ{‘ýrî¶K-ĕӡ µDŒ*÷÷S½"ã˜À ®BžŸ#_hŸ Qƒéžè[dÉ[-“„î$1Ÿ[]A=òÆò8®d¦uÕlÑN ¶@¯0ÑÝ5¿Åñ{L¹?âfqÔô(æ 5HÑg]ݧãH”µn+ÝÍÇlgaTdò9Û ›3õ©—DþøOÐyK¤¯P2†2‘6dPÑŒ[™Ù’.â½(Îz…˜ Ü<\¡¹â@«ª‹•;:Íç4†Ð%qs[tódr_§]®b‘¼â²ÞþJYøOü)Q°ÂƒÒÓ¯Î[ÒJÔ£­”È×ñä gN@úïÌ7š¾U.Úv웊.EŠëT»Õ®d¹`7$¢Zhåð§87ŠÌŒäÿ(ªâ ÿ_,¾PW×-G ³Þ§;QÓ³Vä¼ÜD¾dB ¯¸t´>Nx¥Ó£‡ ZšÆ‘ì‹Ïúd0ðëÁ*äé{zäÉA‹¾TsÙ$+’Q_]rìÔÚ½m¢bµu‘Y%‹aj-“¦CyP6•ê5ë T”¡Ik=°âg-—r?bn¦Ü8_ø™.ÛþòžÑŠÜ0ú¦èœ AÕˆ`ôÛí‘M1Yð_L:>ƒÈ7ñ©bmÄ ´äíT0£=Y;ë²usG&ñ¸VãP?°¤å?5½Ëá“cJn\a×£6Žb\€¯1¬bhº_ûûgZ㼑bÐ1D‘^› ¾;ÚBmš{‡ÒÂg§¾BKKÿ˜û £ËZ(¹ 1òL5,îaÖdLÿúl¹>ýS$kg„¨:žC<¢Eå ˦ŠW$¹DPpKkÕS‡zÕëÞ¦¿¤ª¶§àNóíÙÍ›“@Q¸ãtìòÈ0qÆÍ@žÐ¼¥j¶†\’Úàªeº„©Pç M^š›ðš1 žþ!Ös]MbXã³ý sºkµ±Ps—Eò2’h…ö÷È[P6Ú¡å󱯹"T 9ûBRaȈÑnz¿ d¯)Z\RíŽ^k£.]åãHòT òØZÉY ÐÌ×Þ);‚¥À«À»]>AoëÅË›{#ŧàï,¸3qöX¢T~é2ÏìëhËßö™âÔH?h㾡“×$Ô %Ùz(o€VËš„\>¿¼KÛG<¹G¶8û-µ.ìøÓ§dÜÕ¼›B{WìúÆvIu±6‚ɆýâH¥…ˆPÃGRN`eœ õ`‡å‚©ü#?P¸]¥?¸æxíÓ·N„Pz8Àíçyk]Ù£ž°ìÇ´ÄZì–SeJ©þš{!BëdÒ®®*fƒ2l4'^d¬Ÿ¼û>ƒÉˆˆòT¤ Œ.Δ-{ò£á¸Ý7£S»>ÜÅk«”ad3- P!hµ¬€_8l_ýD©K‚c@ž­$wêô¦èò‘@×J„g!Å›:´Ø‹5‹9ân3GÜlˆ&ËWMŠSžæ‹ÃŒ *úÊ™I©[K Š ½º*.FRlÁµ¬úÛËe[É?Í8[Ô=ΔÎÓÁ¨¡a5ŽÔ¶gÖÕÆEGç”${×AžÀ^ïσËOM$¿ó™0¯1–—¨Ö¨Îرj—Vè¢^ͯ½CÝ©#Z‡=áþÞs…8®ÃŸ“åß܃J¨ òw„γì„l䡚aŽ¢Ý¬/¯1^B°_ÐPI÷‚£¬:Û­¬ Ê‘@ƒ·'ë¼F¯ðÁžòÚ1­ÄûâgØÖ”ÈÂΆ ?ŸÛ˜ã#QɧˆÕëIÃ-–AòX:NÎÍ,Õ¾\Œ¸Õ£/ŽèZ×~u… ‡V¸ý^Ü«-~D˜Tm¦¹OTùü˜š`ÓYð“Ö§è¢T;¾KôÄ l3 @0ËEXÁX´%Óâ‰G„¥.Ú¿;¿ŠBûÂ/’Ò—¬É¬lyM×2FÍha¯K“˜¾ÆÎ ŽA 6õ~)f¨5|åÝ0äˆj›ä83¨âIØ¢~%!*çô‡é4Gf ë±L—ò†ºŸ#; 7Ce«£‚ÖFÇ  nÆ´A¼¹¯ÛÅ; `ÆEÌ’±#gà.Ç §“ôdAôœäzËÚsã“(½×ÚÇmT¿ÅG±²lc>KXPA¼µánä0 t¶pK‰ëW»ö<¶ Õ »ÀG!rk5ÉñÜ/†n|ƒÕ&ŒŽ×_C²äq±†Ï”¤Î p¡¨Ø¹T‰õªìÓ·ŒQŸ‘Øšiæ9ÇÊãÀ _h ˪<ŽÐy§“jûßäܲŸD“΃P~q>_­Á©5#`2t ¿ém#éÌ +l/ݸ•M*®Lתö1 9J§"ìP©VZITxB3>‰<›Ñcs{rõ ;ƒ`ŒòL+$ícÏÏîÃèÚVß*ëêïÔ•ZË*I²ž´KYÆbL{GhùÝFZÍ—ÅáÇwÐßÇ,E,¸nç8ïÁu™O誽ÚM;Oùœ3µqŸ¨ã>»ã«¹•žÒ¨öê·-{gÈO©t$Ö$¤¥³•Ñ:js—ˆ½h4’D5Vÿö'jhIž?‡åv5€‚khÆñr£ýØ7ò Áâ=~ï#ï^,YŸUú‡i"¨H£$5‚Š pÍ ,‚·¢_ãJWC ¨¢hDŹ»¨@˜—fÓ¶¥Æû‚“Xß›Óûô#ÂcFZÄ'1Gƒ²ž]¸T©o‘A!J–œËçȺRD!j~K‰Ói RxN Gœ«<¸m\é^ÉÚvð# Ëø’Íò°²Ì¥ˆC—Ù=nŠމr¾7±}÷€Œ;Æ•oW @¼9/Z ̼lg`ýüè³ e7‰–¦ß•ÞÍYE±v%Ò„zmÁèà—~¤IîüÊr¶.e3žÛ¹›r ½Œ5͵*$:_Æ6Y9Ý–l‘âOM­¾;>Ù¤ã4ߟ{ªIØh¼à)WÕ¸<© ††ž,Z k4ByÄÙR±L&:9^c.||”ˆ ‹f$ÿÊBöÚ\í¹™ý|¶=_¡1gäùØà¥¥ã{Æ’Ä­9 9Ý'‰Å!BÑ®rî9 vYû:ÖŸàé-ÈÐ1ŸC«”ãFZ%íõ‘ĸ`2÷ŽT¹Þ‡3Źð½œH?ÂÚ;XõçlñúZEOBb!ö÷½Ú'”?‡‹Ÿ5ÛëÃÃlG]kh/ÈÑŽŒYè ;w!LÊßɺJÃ(ˆ<9 ëìõh2â˰ګùH1-Úœ­~+ÜÊAo9/‹â1È•¤óE¿aPEÓB ¡ýEø÷Ivæž@%Ø!£*Ÿ ×“OÞÒNKý ›NdPtÕ~Æ5F‘rØÞ:v¿rS|)¾,ÓuõÀ+h×)´g|Gc8™“G<ýÌŒHÔ‚xVëF]I 8t.»4lÅ´øÈ©Î^tàÝ92i¼Ý÷”åW@òF+6ùí%jÕ‰=˜ÒߘÖZ$ì9§ßò-îª\}_m+ÛA$˜À²ˆ`MCVV²±‚IÅ`¶sZy‹Á ‡þÓâ’ˆ*Ž¢ïi²aYÅÛ?:`¡L7í‡DÛøjtŠ¢zXËá€w³ˆ‡C#‡%zmy´¨i]аuµv‡—Õ¨sð«™¾1hõ&Åð lÜÚ«%@DTæ·ØñºÚ{<êc«ƒh×ð$ˆ“¸Ú2]mÓ‡\ÌÆE-ÌY³ ˜lþ$eìzõÄC‚ÃÊŽ°‰ü_¢ˆG1¶5þ{·ƒ:Tz’(3Þ/!Úz5¥ñP¶Ý @asÁB¥h8ÝÅ6ÄøÕQÉòt0NxëºÞS«‡>¸¤øÍRíA×í¦°£bÎΔ`t˜Ù0‡Z$#¤©¹¹@w4à#MCŸ5¯ÅݼþœhS¦°ÀY2<±ø(-Re‰C]Šc'L¿)Àî6äYDMF‡]eGº¹Õ—YNþ*ÿæMHKÜøf>ºŒàÇæ“µÉ5z£ÒÞ¨úº¿'>ƒ™:–ò>ÑÀ£[Ƶ¬ÀȽe3áKyýë,^’܇¾6f¼Tš5ó"ÒÕ©Lqž•Z=Gãct»šEiýàßþ -±Ñ’Uá…Q˜+jQ]»i\E>[·²ƒFyÿH<>ø¶6/ ¢}Ïõ[òÃ}‹„}F«ã?cg7SaX¹ôúB]J FúŒXx¼ŒÈ(rÀ7˜ˆ ¸RvÌ™|_‚Ò½rFìy²¼†þŸ™$VxžÚ2¢DvÝ3CÈu£(c™U yåer#§¨JÿÛ]‚‘MaX²gM8ì­à4)·Bàyè©Õ`‘”"¡Sx*둪èecÆ®åp!ôwNB.ú3³1æ1eùÅõB¹D2Ät§±¯"Ü\$­|*:aHä誻%Òù£ûøäê-ó¡ß³æD¨ƒÑ·þlޏëvÃþq…|Ö·Ö¨›\W†u¿ %ý€àôVT^ˆ=Ó¥%è~v($/‘£aE§‘ÊíŒ[¢M˜%‚ƒ–ç}d<@À’±¡c²•ίÜ%5Ø«}œ´5É»$ã¢'ª¡kff¾b€¢}Awž1j艗Ă‘ST½#Ía@¨òùÞ Â‰Rbì³Q Ü%$ÙÆ„àpà—ríepêòz•ÒaX-_ÃhêE£æ„ºbfZ‹æ=6RS—,ª)7F² N£ï¸ØkzW¹ùsÅÆÁàX,>ûú_Ä"ÏØöD:šv‹´®ÎÒ})wÅWå;´_x$ß×ޢ㻅Ÿêxtg]¤ûüû"o˜Q/—¾“~ŠDQ¤Ü(]R¡†³´ý™?´„Þ;áûžùÛ\õËËV¬®“/Μ€ìÛMöí(+®Æ÷£‚"¼/=ì—· #Ðôº=ñ¢(•¹ßŠ€­7Wy¢¿7+¤§”:Ko؜ԎØ4”öy~ÀOZãt Áç†U 8/Ç çO‡¸í Ï„_¨yp½3âm.9‘0ì= ]bÒt,Χÿ‘H­É³û¼µ³gZ¡kæÃÊîøl&cf~ÕȳIÙÓ!¢«.dÅ£ÑÿþQwäÒR;µ®D_=†ýùº—"åä FÆ•HYŸá)ß#™÷1Ìkóÿhõ¼lÀ@]li¼Õ¨ãW…^m]qü$’…‡©ºéX¢ñYÉat¸óÂKKB ø’?ÀÿEPµVõ¼Å4Q|JM´Êûaï‘W&!x§{³³~¶ð-ì7 â3ÛZƒ/* îÏÈûÍ©oõ=ôÔ/t7>6×ë#`­¶á#-Ù ·‚ë5Hà@7Vî®óôèțʭôÖô»ßåÕüC®ÒQÓQ §©&+€ If –ù(‰‡f&†¸ãa´Ãø[“ Æ}ûÛÎg–WÛùœ¤U¿œ™rmõ(æààÃ:’n› C&JŽÈ|Äh÷K@æÃ £þ&q‹ô˜íÆ [ÈfQ>·‚ú•#{[‹PŨzT“‹£?‚ë ß².Ìù†Hã<¬ <¿îl탼t¯hBßÉg¥pA(8ÕÏ/R}^ÞzÅʙԬ&ñ :´úßÎN‚r¿;ÈP`Hö( ËÏö d¢Ù;]øn!ÉNOAˆJÖô«'‹'uMz=õÌ `4„ýd "¾€ß‰pCý¾¬Sî@ÓB-Mò=F;®›þâ%]s§Ÿ©àA?ÍÇxÊ2Ùéz*VèUÍW ­ZÚÇ­ð=Å›¦CY‚?L:^ðÐÕˆSì=Óv-åëg7¼e\P“ž%x§M—˪XkBßû¡Ê[l|ÎF4¡ÈÁžµ°‚¨ip†]åM{Ë2N‰ZÒõiig"H¹ñp!b6¤Cº%\ÍÊ›zu½zÐ4\/žÛ!‡xÛŽ1º`!íÀ#;#¼”Õàž‘]—â 7² B¨1Ø·gZ‚V!´ r9šòÑ—‹ÂÈog~p,°¿ù×ç}Dº¨e„ ©ýï6A«â‹¿ë¥?? ê8}qÄ-+ÐÌ.Ý3zógІ22\edÒ˜]Yî³` Ø“Š0ôý(µ, “1Á2ŽÕJãdC¹TÓÇöq3é=·ì6â’Ìš²Â éòD$ÐKø:K"¶¬6,+˜ËÈhCü_‹iI,¬xX\åÛAU ¨¥{~’gòœV]Ë B™ÑÝ Qð-¯eÍ.27IL¥³;•)II1Ù4ÞyüÎÚŽ›+Ø¥Vl¼b„ÒpL7ÙôS‡åæ%âÑnry†a•ÔGHáÏÜ9ÃX4•W2¤·ÚqhRò<|+5M´¶_ YS¿6T'lNô‹e¢ÞóGýJœôUË–Ú˜gƒdèÕ&t%––ŽÍ"MÛ&I7•Ó¿Îm!Œ»Ÿ˜„cÃOˆt.}D\Êš#ÏÇߥMÿ£ø½¯ƒú„ÛÀ(gŒUQŽ×ïìfT`(*·ÀÆŠ9aÛÒº2Ý“ãjÛ°ZÍ},¾&gVr¥‘¦žq IÂÿ¿ž{$þƒ(ýƒ-×}|y§ZxaZ ]ݘd 3NÞ9”öˆìz†R¦ Ò[ÙGäN¨Uÿ%;-"©,‰¸·c12;g޳“·3múKE0Î7°}…ù6”)ê;h“¦ñœnÝ ë/ÆZÅês"/ dÛÕ$ž¶˜§°»»s<»GÓï¹÷•wð¾–¤‰‚Ö/}Ó4U•¾÷Ü©ç;Úss÷³L~P»Utd~†[)ýD0jÁe…ñ^\™¬cdÌA­tùVþ0aAu¾ìBZúÏ‘å›H-K k™¼ˆQ´ð¿oÈÆy§Oí–ßb*pÄÐî. ÆÑ`˜ˆ68ÈÄ›u‹÷©µö·DþvQÎ#¬…²lNŽÐ:Û'Ò„ŸÒ–$3È‹‘\‰oà†½”#ÛΡúUFÏÜÌùQ†âböǽüPÁ½a•V§ß­”¨C.X^4Qh*SºßM@Õkéªp_å‘TФڅ©-Ý™'!;<,ŸCzªx½fÚ*ên·“×y>Ÿ ]é@º¯Á H‡y¡˜˜¯*øbîdéœ^€>¢åã¡r÷\*ÓìÓ´Ï™|ðNQçÕIn5ž1·:ÆKý)†àƈH¶›vg‹ÀõPq6­˜*Ÿ‰¦0tjÍô¡ý…†oEzsz9­eÉ䨀Ë-Ì`†Õüà–Óâþãÿ†‡¶,s_< yx2A¶“‚\iZR]¦ôÝ€¶e!‡@PÏcÚ)µ£ïÑ$¬IÍ.ç«í5u ² ‚åa†_˜â^Z‹îì/>D¯î¿´b¸Ë’Ó‚H¤•YkNÊ™A䦶¡A¤D‚»‡9×/9.·ñT“bjÉöº¼ç^QZ„ƒé¸A¢@7×±è›=¤üæ žÒ—NSnÆP•>/z˜E—…®×…RH~ù¦t9F±'öâ=$ÈA;?‚ "­%åìW…Uvo»µSKupQ²„˜S­IÜJÀ^§ ²°Œ0,7ÃôóÅ“ßÅwÑ+îU€þYYXø[=¥WÖ•ç œC’“ï÷³ %^íî67e:cךëFŸÊœdlv* kâayl ó8˜Ç„ó­;DõÑ\.¶fÏý®§G¤kaûUÚ? Ï"ðæVB²jßíýÓIšA:8‰¥öeA|/çñ¥šØ×wãlæWÉÖ¹ø%â¼L5™ät0vÉ ®k&r/¹Ö[Ë…8èò>é$Ɇjûòïö}S{N$Ÿ3ŒÃÍl9~à_ ŠXÒN½IMX›Æi}Ñ”!;-ï¡ÎÛ3„·4öó‰#„\Oƒ÷›Öç…o¦\ívPÄ7..Kӯ®Bù·ËjP—º1ë*£)†À–DÀÖ‹x÷ ƒ.?/Kj¸˜=”{»h{U&è’^ N¯8ʬtœ(…áy7à_üà ÛÇåÆàR^˜ï×Rý$ ©-LDQF± ,øjÆR9X|ú`¡„7 êMÝ y—¦T´X;hC­®ÉPx‹g‰ ä™A›ìM·íMMýý• ÛŽ'ˆîæ{i¾ÞGõXo¤h4Í>‡ª¦<Ÿœ¹$V†|ùC4éûa+æ`S<î„¿nÐÅÉD9•+0F"D—ì’Š;PÞµðs¿ðMŸrÛœ¹©ø¤ šÞ+‹«X}_LW&;lÅ9ëš Íe0ÁË…“ U^ŸÚ‚Ý=6P‘EH4B9òÜ@\éØVùÉÐ<ž€àVTT ÜÿìÒ'æÝÎ ýI TË#ÈÔõ!¼%žÅí­ú•©†¬jÄúH¬EP΋Í'Å+qq±nNÕ›@¡IÆ}jŠüíÌ“[W“sf˜Û;5BD(Á2jØù0" G•ôL´í±8év­Ì©œ‘Õš¯@uïq)ªX*&*¨rÑúô^ÇL™#ƒ>!YÂ",9˜ê“ÃÊ^r`ú¢tÝÞç¼9]N”™duÝ&? K”ܲC°i#€íeìÓ9¬“lH#xn§ŠcsU*f&t ‹Âíg]6[.AøcL;äaµš×Cõ•#•º±8»òˆ×ÆwÂ÷.‰ç$bŒš»L¬ùÔoTæU/Â@ ¢‹Q·<zß%/â^(a?êÏXާÀØòŠ•M+ñJìu*ê¦ÖÒ |*}æ"€¦^0Ë^@?¿—u=MË^ YYbŠoX‡†ñšë[õ ]@j•á̉sÝ~Çžq¼Aä²O»¤ïØG78ݬ“t»Å°ðÓpœÉ<»Úw,˜+Ìãºü‘¯všrŠÍ†§0t½pë‰dII¡ß¹yO±A†²72V”ÛÔnÇ ¿NF¸yºýfÐ~¦0¨Jÿ9ûÍÙ_Fã—Í$ÙÓÐEø0U ÃÎmì°'²“4ÁùÁ„àòî3z£iÄŠ¶ýÏéš„8r˜\†xMm½´‰³GÙ .À¹N:mÅ‹„\ž!›‡æ² ¬ýw¯§Ù"2E¬š`")*vì{z„½]®ø©·vÁ™ÿ],D×¼önCr›²ºC6ñ/»D¯Ö¯Š5™‘ËJ1˜¯x 0"˜*NÒ%!Qý¦Ãü€An…t@šŠÕ”—Ⱦ\V•¢8åníVâ‘¥ë¼EÖ÷N‹Tgì¾—°3’Yý‘ÈpУWóaWúÅ› …-¿m‡»x'Žl2Ú\Ò@½S:Ç/¬ŒArçy]Ɇ ¡ï¥Deuêé…çñåßB¯ ¿-æ”ÂÚ¢Il÷Ëo‹­oЇÑ|²º˜wY2L0´-y+V‡d ‹FÝ´Ø[ò±ÿׄa‰­|Þ¦ë&Q …Þùuú+†ä«ðŠéH¼]\ÜHZcq/‚?ñU¸÷~ÛHî3ùž^†ôèQ{áò§ä]Æ¢Mš;sŒBt‰nд‘·€ªÝnˆ$óY¢a"2a=šP¢a¸,hÉ^ãÃLq?…õ°-”Þ¹MƒÔb÷@Þ¤/CŠ-ÑðýB}“Uº@âÁ…ýôxHç¦ë®Q¹@Óá‹AâcÒáç–T/Ì™ž]yS‰«ÍCjWÝϹ£~Q)ò“FÑRòÜ&×3¢­Ÿul¯Ö3˜~A½ÙœžýÌá—/oš."¼ól¯nzZ†YèÊU^©©^ø+Daˬf ^ÆŒy#áüè rhlª?~¾Þ2ÂZ¢ ¶¸’ˆXVAô+¸’áþ$ Ð3ÖH£nÛÛ&(qÜ©ë£~?™r_Þ9°#·Ìå·ü•Ù!m¥ý_èá}°}÷ éÉùAWéþwdª6Ô¢„ù(s n"¯ìÙàJ:ø…ú‰&3,Åàæ'ÎÞÌpÇ¢Kv»çU½MnèüZÜŒJþ#‰xÔÓµ‘¦û´ZÞ²‘†õ,gX¥w]ŽÚÁÆ%ƒµd¶Nâ19à";Bêå>‰8ý k$ 7ŒñƒSþ5_-â†-‰×yÖ —¸é56s H¢5Œc`%Ù³à´ÖeBÏÿ$ã‡w%(÷Ì·«åWÓŠ ¥hÚBþÊ„I˜Bªùº¨l„8`1GÌ<÷2X9ßÏpÉ£öÛ>ßêú@ífÜÒm‚F9>=:ÓS~ƒÒºuû°}pÄ7×ê^å²7¼ÝyÛðõsN‹zÜŽ×l µ(벦PHx-—³¨ŒVË£“wèï†ëòp]͆UeÂÝZ„† A–ˆbÀPJý˜|æaÒzÍ•©xˆKŒ$–+žÛðØ-hmˆÂU-ó-\ù„šÊKÁ‹*×DJl°B=,®0,‘@<û¬¯.…liØ­?LF$<2ŠÄ¥ßrÊù».Ú‹K‡ ‚ìÍ ÿý·S],³ÆZº°¡iw&õDÑe®*ßNCSȇoÚÇiCD’«µÇ'Xä²ÙoünQ;ÿá\8 ½FxÄ êä]óÝ|¡qG¢Â~ÆÈSÿ…Π˪ïòÀV%Ý£àj<¾šOÞ$ÝH…‹§YæR°¥[™uýÄ´i±<É>8’HA×Ùž&lYf«… ›$ÿTË -ùÔ’æbÛ© e•êí¬©“PzHägÉîááŽy#b…^8;1¬â¨3?ïMÉ{D U]gà~ì)ê>yÄf_w³Bº\1$¨¢¶u:÷<Ô,^ŒG”ep(óS„;+Q€ì©ÎãÑø¹/Q; «<ôi*†^u„mºÃéÔf}QŸh¾¿¯õ¾’`…ÙçAuZ&ÿ.ú›®'{{9ÃÈ‚ò/ºG‚½D4àbø=ú¿; º\ãm» y¦"t¾´¥Ìq·M‚w«ßXáŸo&´wß©¨§GÒ¯8ÐÓåÜ8š3ôê ~«ÙáÛãÎ+¬žÇ‰MAGÞ3ºsë:†–’lç3‘gÏæ“õIÛØ6Åö•“-whEßðÑqôɦjüoCt÷KòTG2QK =+}“û<¦k5æ²<î[n>Øt W“Ï““ñNÕð.FqE(Æ@±Îªæ8Ð'?O„³Ž4©êø7R…/^Dua“1}AUr^¥†Õ6:.ŸL:ã¡ËÙ$]m$ÕW×¶½¹(ÂeÈC"Tnþ ñÃMQ2¼QEüt³ç1Œ+¥ð“-Éï®üÑùŽ]†!=57¬úÃEÚ2b. Íeû#Y Û Iú ÷¬°aÏl7àú/Q~½ºÎ;o‚«ácÛ«.ÛKß8ð"î„Àt·æñ~ ½*¦„ô_ŽhÇêðw¨¿L+2ôÅ,m;·€%_@õ¸“`m~ww<¾ÎJ¯¨x|èˆíZÎ ÝfœV¬ÂhwŒ–LSgYŰ o?‹5ˆè©^LNVå’w½é{\ïi±'˜î"ö"Ì#wTŨ„@4ÅÿëuHÕí ã˜8“{–𚥵 &Bw_deä/ ÷ð£ûõÝ´»ø µeŒ~ SJXK†Õ=(±-ÁV:BJ‰®†™p³8‘gØÀ¡ŠBÂéc«ÙÕ²4DCb5‡ƒäÑ;CïvÖ¿ûçHpn{*K´@ft“F¬Kt¡°ø® )˜ð+æ¹Áò£‚Ç2ô®zç˜yB2¼ÂTVÁÐÔ’ýØþÆRA\ŽS±òÜÌg'ƒþ¤Ô ºòëe@gÉ›´ZõºPŸño¾Zû¸™¢Úç&/šõ–ãèN'lÌÁýø#½–íß7gÈÌÄýú<”Bj7¦òÛâtþ½Ù ¼ÚûYŸžÖòhLlaè…3U2ò³ –"ï}$‹;ËýüWˆ¸ÅcûÖ™$´]ææKm|dä /°ŸºBámm¡ÀDAˆëŸxf^Œ>þö§VÈ™ÐÐÿªÌhÔe SÔ:hüiÉ¢Ì&ìÇgmÑêÙD¯NÑ Ñ)Ò>ƒ„›2 )ÈO+äM;Wûª'œl˜ ì…ˆ´æ9ßí¢æšÜIþòßîãŒKÔ/°'Œ5j”gˆ²¶þÅ& \7e“/Æ?U/jKZüL"O$ ¹¤#°£i„Ã!ò#òÓÄ5ЄÿÇ>®ˆ[¢Bð>á‘7ð²¿Ç' LG•žÏo1Æ…hEŒ«|Kb  ƒž Ö¼¢Ÿ²(¼l}À*-þ$Wþ Ð ”j¾ûrä)BOVš€IQT3ÔèºGKõQ]ôygU"D©<\Þ¯…p²~J9Ì.øL_ùÚ 7ú¢RR’ŸîiZjoNp¨è“CÝM5Q òטá\,x+Ÿ§×-§_Ý,ò˜É£+¥›ó·£PI‘ÃØçqðÛ.H‡á5uSš5³æoW <^Wáïüëp{0¶.ä¸]óÌNÇãÂ"pœpŸ…²ñý NQ×DÙà-§6ónN›)‹ù%¨{ !¥ì”ôóNkäb=;GªW‘g„},k|n–(~̼•t,þÐ øëâM/«ýzO0¯§F,bà]Ù@÷Z¢i «D4|p{xõ~Ö‡ÛIq p7ùœ¯®Ôù°º<øx©Ðh˜Vc²( ³.Õ)O ¹p…ZàcŒõÁ0ð9á´®x;VCæˆ[èÛ˜)â)Mà.â.™ª:€»i«,*l,5ŠKø¬y¼Þ·gnÑæÄCšt¶Ú ­N¥Äñ.t~Ë$â]æTàñžký{þÜ™zìÔ«þÂp𕋃¨¬ChÕ®(—øì:˜—­*küz÷ƒ)ÖkÚPMš|LÎkyƒë—³j¼5º†ùešxþ@Ÿ—uÓµ×KªnqpçVšŽÉw!.œýÐ{{->pÉ>Ü‹„›ß«¤Dá,× !¦6ˆü?'Þ:#ì¶µå¸AÏp×l5 ÷Ã3GÑßI7å!¡+*Öä—:ævÏáݾ]ѱX”ôº4;»Ò[µú1»$qz.v£hAuÄ”ušÈJløW¯`õrã¸ßv³üƒ5¬®ê x—ú¢6v@‰¦Çgµç8¯ëÌ[lù69òwÔÏ:ìûê¬CnG³†Yë\ãiŸÒ‡¹8yô^Ÿ·?J¥!ûâ?+}aÕ CêÈ©á¤y!‚Öä §ä":7»+:»Ñ®F¢@Ö{FâF"IÖáAc:ÔGæälsÎ.=¬Õâ‘¶+êÆCµZšáÜ_÷i»=;Úv<ôˉÑF(ŠbXR‘¿8ß?I$ö«åu¦[~:Á"gʬ¥³u~” 6¤9¦Â_º¶±v» æ„iÆàÞŽþF•*súþòšëÓXòLã*Ç ÷åøv°”åÕX¸Ä£+orB âòå)ÓŠV:Qµ–:€åO‚î,-Œ̘ò1±©¼Çq EûÜ®•Ý$| GÄj9 îǵˆÂ ·¦0É9!ܤ_áa^’dƒªÆJpDg„íÉ'¹7ÕàýÿÚ§ /¤ãÅuˆ©X€ ›9•2RÍÍ/ÓŽi"`Lœ-y±'¢^¼Mø·ÈBÐ*RV2ZN\™»½Y?Íøå%Y»¥”õäE¥” ½zÙùYºbSÀζ×ß„êNco`ëã„ÅIŒrEëlì»_?I¶^gÙÈòÆŽp^?çêí“Æ’’kÛ´UÀ'…nÝi§qH,<¹VH<ÅÝŸT2ÛÛAîi0Ó¼…NI`s×#•µÓÙW¼5±ê3WQ=‘A;Ï Cr˜T“Å o0´Ã}ô겫ƒæèäJý ÜÏÝèÕ¥a+åU`¥ ™®«%€0íö ûÑÖdホ‹›DïÍ-“uÊ àyÖÉŠ«x 4È¡fPxVø›$Ù £µ˜±!̃žÓZñ[)›"l¥@pμ‹BqûZÀî÷ZúªNo²6öçÕÑÈù·îýv\´ÆÐ7Ù~e5QXô~µÁϸßP†`Ъ«~fïúÂÚªbž@ ü&ê·ÙeüÔRìî-cZ]1"펜Ž|w©Äf¦¢žy5Üyù¼Å°$W­ýçå^…-éaB»†Pw0Ãñô?ÁÊÏCëHTÙZ’­ê%z(-ð’üÉyõZÉÿûa#^š\.˜ô5¡©ý%aüúÝÏÞGjŸÅhºùÿåÙö¯ü9b0t\'Ïä×_€+žµL/’q±÷˗䨞*bpk´ë\ƒÓY€ý¿rz mø¼øNq¡ZÙ6 f4¢Dó–)¦^Ä\•P¢Å¶ öÎÑåÖçq³ÃÊñ&Ö&ÿî*c“5a§Ü–W ýõ^„ÐouðŠ[ƒ ×-)u1³‹_œÍ:…Á*e” 9î§âŽàt4µïßzÝòá4îÜ» ¦ùzß³O…´dÓqÜ4B?wVÇ«ÖmåáŽ~X꼘 Q7Üø¤éÇðäußÁ•ïa©W×yf_±Ž~›]„z)"¯­©ŽC:Ì~«háB€nB7lë±¶Z.ìçÅ) ÖºÂúÓC"˜hc+Z N2/¦%V¾Öå„’‘˜‰k'›·¯ÒÎõOÅÂp5»Œ“v¾øã|€›“Ì$䟂JØÉ«—`µ}€"¥—r=‹ãÂ÷žèÖ„ø]ÈÚvã3TО]ï´Ž~¶.,Pjg›"«î³$¹íáWK™lκìsÔ½¯<0nÚ)71—®Vkqöð±’X…Ãõ#$ëõàmù¦çÞ¶fÑåc¢T.Îy6ÙZæ8ù³¬Ðà€L$k¾Ÿ…@AÛ)€ÚTþö·'’rbÑø5´%”‘« s—&û'ÕÛÄ̲ÃFIöô ¿ðÈßþ†àªâü´¯¨©NéÌ=£˜ÉÄ Ì7 KDizǰÐ!‹3çÃ!Û ä@‚& ø§cXSVö#òWAæ¢/héòÏ>Äè¯N݃ætI2‹ë[àð,P9»É†y¶˜ï”7eeð¾G`VC™Ñû—Î0úÀô²«¯˜„´ÎoØVìµ5WtR˜UÂçŸÐÂUñcú0ùÁC¬O“‡9\dóÒW½¢ÚJ!öƒäS,60,™µÆÇ¨F‚wœ5]úßï8ÏZßžÈF÷ó´qˆ>pV Áx¹Añ@’9ЍÖ2c ¥ZßV¦¤‡!œ‹¼\ÿš‰2êZ#©=9U¸»vöm–»HžY¶}íðF´·Lÿ|O‚IlÙÇì8¡±n‚•×Êk[Ø#¼NÕvêÖéFR¤¡zqæXUuã®Ö>°ÃèUñãtñ§1‹CÁtB¨óÆ1"íaºå✩zîYzd@$Þ¯ ¶n Ùvø¾“½»ÇƒÛšPÉ£ÖŸÜ3 ºuËÚ»ov¢\9ügG¯ÆUoÛU<ÕÀzÊáñ§M[½¤\Í™;"͹ ¢k·h?Zˆ^áƒhòô‰ÿ[þMó¢Ÿzei&ÊïXa•8²e.ƒø>̪(=†%Vö’ÚÄ·#a-…®fìnwŸ ¿°JX*hŒÕŒ|‡rì•#ìýùo‰Œ""D¡Ãj#]8ø&ØÊኞwMŸÛÙ•|Š­Ô(2³donx\i7a]ÜÓÉZØA+•V^³„ì£é,ñ¦xmU”~·j«±ùRá8$¢ÚIÊÅ&aúòèrŒ•)³½ÏÏ®X‘Jë†|(y†T}wO7'u˜¡¥N2qßC™é>•4/š7õ4”0[Ê?‹6 #?=v¡ž)QÓb£ˆÍê¸ñ¶ºb8”>›Prùò gè×/Ëè 9ú‚1×ã$^Å_Õ1Êë0bæys)NCíêÛò÷ùìµöÅ;&,cKVOϼ ª.Ô(VÍ}†™z¡µ'âð¤4Â[¸j.rº2!DuÑ`kÑÞ:ÆP_×¾IÞ’ÌN¸z†v¦Ûô« ©,ŒÈÂiKbŸÌµøOµô&ÎŽ9^jÿǤЊ•pÏr%â…mNä킉…ÞÖ98t«"$‹É€dL?0¤=ÚLøð/’¬ðâ¼Kb—X- âëtg¹s†Åá®añ8Ñ=Ÿùöíñó–*†iª`à ' ±ò—|”§!B¦vx^ËíïÌÆ &›Q®Ò„E2nKüä`@ ~Öò(Œ¡Ô~'÷¥¾½V}$åà_$i‡>lvJÝ”ÒÝÉi~K~ÐMžÏ|Eùëé”4Å|úâ¾è*jÚ[»Ú‘ü-ª§î®ú#¿uãBé¥9†öèfJ$¢™+CO8©òNäôÆ ]›La„GÜi•ÎD •VAâ¸Uqõ9.ŒÄ®oÞ¥Ú÷ª¢×ˆÉ¤‰H»L³n¾ÞݼNDEÅbÂ;¢ób³uó±Ú‘óÖgvá(DÈÀW¤È“'ÄÙ˜P¤‘,•ÚŸæSΣ9@g¢”æ>å"‡¬æDÂûqMCQßqÖ"¸z`|6 7µØŠµ=Yçy[³*—ÀÆ,“Ò*-_L >™/;`)xDŒk÷18µh·Šx0GŽÄqkà’2õÜI!e^qï{ÁŽfË$n…›„ŇŒÚÏå\¿ø”úþ&¶d”ÀqÚ0ɘ¿œçÔŒb\ ˜¿g÷e"ǩԄqL6$—`ÛfJ{GÛ‹†WO t›÷wç½ÞiЄB™’gˆ”˜)"­¨-|æHIŽ@Ù¾Fi³©šoí)FŠÌÂ|óƒC/£[Ãü³Aäà‘­ð vôà ßò•~ pÙª„d‹´Wþ ‹áÁf7Eæú7)~(]]Ó³”@Yï†%Ÿ©¬ì/ì$Ë vÜ#“YÀ0ÇC “pê'€%žòƒîر'D…b(ÜnY´`ƒžü ‹VÆby¢aj`©NêÝ˧,‹w ;:ezRFÑŸ¿á–Ü>¤ô$%Lן“ü‹2ƒ­IðÂïO¾ýF³ªîU¶qö—é×ýžÀÏ nž^Rü#·fÊÚ¤PkWã™¶«W3iOƒG Š(^ÕP¸hˆUT5R˜eu¤e¸œZ¾'†% 1Äa‚cï&¼Vå\QY¼Öô–‰µîˆ†¢N,+:añº˜D‚Ixwû¸u`hè£|$Wþ5 &ëm|(ªµ4’c4°t,1ÑZYtúMmbž±¦ècú Î+¹ñÈt(C„«™è)„:»êy›gÁÖMœÌ¶Ž†ï­Š¨B´Ýð/©:âÉO©æ® €@ÀŇ@aºöˆÂÞíñVO6XCwbˆ©mß ÌÊæ6A7®Lbá*qã„çc½’ãM³‚–®:BWÌ?XAè6¼ÞšXÓŸã^ùô¨Êo,¨ecà[–ÄbX—¢Z%j•ÌÒÇÅ ÓP£¾§†ú%G?ÎÚuÂÓY"z’£öÎÛáû,³‘$æÏpÇ÷틯vµ+º•#Üø;IVeüx”ÜíZKxûtø=Ô˜å«Pyä[FÙ4‰ ¤h^š©+ÍVmƒäˆÂ%)ú±Ë©f?íkfU® aÀO¦EÜœ¨­¸¶ÃÍ´Gkàq@#ÿºFý‚ ò4ÈÁë½Ùó %Õ¢S!wºJƒîLEF©Øtåg›I˜ó±8¡±“J&ª3ju·à€b­Dê±Rw:ò©÷f¸¢#wóÃÊ~‡mÀXx’„>|üKÑð;‰²GQÌVÑÔ,d PzÁ ‚– AwìѸ!€:Ág’ùÍpFI=îZGûˆ¤2XeA€Ê€Ø¿mï÷áîW,þ1(ðØûÜѪ‡¤ÇYÐ×D&Ñú$%æze÷íÁÙ‡{k>ÓýëvÖaÀ«ë,:NÓÁf Z–3Ðum'ün,Ñóo`BîÚÕ™IˇKæü¬LîÒè¡Ø.(‹:F'"+Åô›&ì©° {‡R”'C e䂿ÐJ7=&½uEºk–Ã%Uª¤Õj>x˜á|˜ù£Ä¶òzB7Y‘d‰è,ô-ÜêÑ\b»E†3¡ÍÕð+ª $PàLïTá)üŽŽW ˆ³”1Áž »M êÔ»¯ˆÀ>›Jʼn¯åâ§­Û†ßhx² ×L4÷ŽüPø,d«è >dÝÑÿ᥋IqßÝ'Ò|dâëÓð òÕ¦Ù콀Ơ #ÒÿC¹v÷Ç —êq{²ÝM–vÞ ÃZl×·í¨Ú [¡Lõâ9´ÿ ÐJ>òŬ^ŸùñÏr~»á;æƒõ¯ìk<Œ u§¢>¹ømøBÀY†Ñ¦ß1ô*’½±8;Y˜¾ F¨Xwq¯ G^üö¸dåvË®<°—¬cXì„ÿÞH¡Š$-ê0ï¤#s™à/nO0í WqQt-aÊàS‹CÓ¡ú|ŸÌ fJXWŠ­”ãŽ=.§:E•ÛŸº» ÒÖê-™H5~ÞQH3#ÌwiŒ»ô©u0¹«"Ÿ(ß—^ÁCeèl†.¶“Xú—‡äJͬ ì~Wó}þsYMŠÉ¶ÄGTC^4Æù^êáS&äu7b´ª»õ’»À=Ía8gÿ 0—Û>ZE]ÆDNnÔ<ô ¹%y²»0iÛd¨" ÝÎÜ`ŸU÷yÁžé)Ó\†düg:€òL‡g`ݱï†Qà‰W÷êr B»>/H(h‰Ñs}›‚¹yŠoÃ>‹M}A2¦=F~½ f±ï!ˆÛ5!A1r7ÐŒ@ý-[°ŽBCw0ö¿’yO€=_mlŸ1Ç*¨Ñe““×uxà~îžç„[Çðæ ÊUÔËúHXCý¢D!°d,öL’<×ã´ÓèWGUG‚8òÓ:4}㤓[Ã8ZOmY ¯[”èWfDs:9zõ-?OÒ°x;M=[Ëòಘ”Q‘­²™EÎ^ãV說ԶԲ¡™î@Ñ^G —PTjÆ…s†!²nëëi …]Äð”AúhØ òL ¼çh®ºC•‹ßûøú ‚ªR\ä ¡«`ÿÊÇ›m‡P2LÕ7TÂSÚúaêCö¤×M9½ônævAû®*ÜÇCLQíä½P}åàЖŽU“riÏd<3x”Èž¢BЇ¥XAçp•$b/ on@ü; Í@Vëz£¹“@Y}:k´Å-’Q#x¿‹»s_ä&8(ÑK N±og‰è¨“ÚÀY„>ÒBÀÒ“9€¾2…Gd+OH”4ËõŒ¨†G¹û–ÛQÛ)WéyŒçp©`áþ»æWøìÄ’PO«lÓ3·4Öÿl§ØÆÑ¥þtSç;QD^ˆÛ¼ËKT WÀÈ—À(Ÿ+¦ÿÒ ‘Ö›è“;«KÔC"l~¾z½f1<¬…CûÝ}KÞúíÓ¸P f‡;9yÌ)Õ¦XÖ'“Œ(ŒeM÷¸­Æ4¤¼ò¡¾ÅIÆowhuxŒšàÇÐ…J#TÝ|_#cChÓ·nêÏgòª¼ŠA8©Çç¯_ã)pÙj± 1I>•¡RLؼÊ;%Ь€[ÞM¼Ìx¿Ü³–§}ò½j®ŸìÞâÎ>‡´*‘Å[?ë$ìël Õº¼©Ýõ “ðÒñr%"`a,;ƒ¸•J>Èà ØDd­Èð-º˜!·=Ž£t²…’[3-¬LîyÐ!#H«~P_-~õIJZ¶Û†æàŸ-Ð$Òd‘UˆE,(Q2ó…u‰Êö¬D¹,Qd‘KÊØÇ’ÛD+>]Hb¥¿`— öˆ­K¤ù`SBäe¡0§4:_hóËî3WqjRV:îû(Ì*¼ì WGôª©'Ë{:§ Ž¿=8•½&·ÔÈcñä^ÝÚ"âk~VúŠê½›{Úu© Ú|½òò Øþ¾DG¾QZ:À ·œ’†# 8úŽþQƒa×D4ÈqduÁ }ëc'€Ì„H̃Õ|m(à°\„ƒ‡7q?Á†½/WÁ¤$eÄ í™á 9³¥Ë!¶½ó¾u¡Þ=ld¸!@).ËP¿2‘ûo%K6(áïþ¹yepÕÆÈ´½ÚßYMd2IÓ³}–„ûí¡E'• RáP``ÂÚ¥ ׳ñ@s2–ö—‰3‘Œn"¿ÙùŽ=2Jð0CžB=ëZÁUÝV/ðgN(ÑýQ*µkf–©"ÎcƒËÑ› oðD]¯Í#ðWÑp'“Ôé“’è éMMºñ·jê Àe¬¼²î„4Âhˆ²ý÷ЫPˆOòׯ|†Ý”1ìõža¹%øk—y=ð‰¿ ó#|2n¿=˜HiÂÃpŒk¤¿éÙFê‘ä n4xh‡+6,DØÈ£§³šçÆG+n5ÇðI€w*²Ûx>±–Eõx‰YnéUàhÛßZfUËP”ì«Í­2†é@¼æy¯©¢‰÷iÉ´Í·z‘ÊÇ9´*̇ÕYë›Ì‡Zƒ´À+Ú»¬¾/èfL)¶.)Þ :“Ý2«"%Z.Ã,îPe )†¥ žpô:˜W‰K!mDÕÆ*HfÕû탷;á3Ë|Üí ŸõŸ‚ò®šÞ‹eÃãpÑïè÷ò—²» :îÃë?=œjPÎSÇ5÷›‰çlad¾€뎷í0»œt:ÓGbôiÇiÒ:˜6ÉÄÍ…=-ÝÚÌ k¼Ð.•Ù«bý?W(BrÀñÑØE‰Àsu œ)ýê)Ïh§Gr¬ŠØA¼~†E…X-“Ÿï¸Ƈ%¾Î}ÓÒj°€œ†Å'Æ]ïiûFð(yŽR¡áÚ+Žþ­»c„¯ðõ{Z_ÏäîSð˱ªÉÀÌ8a.á—åÞak64Lõ"$O‘¬e}ly +Å &-ÿ+ã¿y&–tu纪 k‰L‰A¯ZÇÌb>ÔR¥Ä ZmÆôÉ>5q‰;±¢éö½ŽÄ8׸6óUâѪìY:3:¥ðÕMõyæ‡ë‘i~üFX}~–p}†µy•X¾×¾ªôï‘5+xªÉu@h8:SSÈðÉ}“öWj­ ²¡´ž1RÕy©u¿ÞQL#õœ×ÅQ¹äÏcé(Ð+hM ;€üTÝ4MÏL©%ÇÅ$¡ÔQ],vÕ¾þ?× ´®[¢'¡Ï`Ì®…Üúé8©Je_¤ðRyŠU½Ã³ê=ºéÂÐØù,a^q¥Ïä*wTÞ_§Ý; %v3q–Jâ•äÎÆ=4‰°&,Ð+lÌ®Î×DY»´Oå“×{¹BòÎÔ}æôëͨóÈÈüÖD0ŸÝÝ ããC‡õ}‹¤ÙŒѯ¨ºªœQ¡°ZF¤ZÅÉgñït=ò›'õœÌt ‹Õ¨2'4ò,…_Lòž—ŒMãïX@®³øÉu14Id:h³Oâ'ØÇô4ÊÕqC<¼vÏ¢6â觺6¸-Ú?è© *ég&©D*œY¨Å6zµïï‘…¦f+… QBRbÌ ×™’ºÒ WWÅóç ~yGœT+«•¾„·ÜõÓC¬â-7–å·.àV¨ Áà[ÖÏÞ÷ÆZeûOÝV‹$u3_V+·g›P–¼ë‰Âø“DH–ßõGrâ|2oèjºùë<9=ñFÚY w¸œÐ+ø±Á»pÑž±U¨ ω"O+QœBù–Ñ =¥ë9²Uw‡Ð]? ÌÜÒéBíñâ<¸S;Âù¦#<àbâÖõÊøëÜ»èîWê ½˜¼u4m[Ël.{Yì ¯I˜® Å‚¥¤ìy”0”Ģޭ ƒªxÕͯr¯¾ˆmþEuÉ£a¬¢Ñ+3ÄßNÝèÁÃB ,ÊêݧòídÁÁKÙhÂCôªKI"€yz»C‘>î±ØXê÷£ƒŽW0d¬XÞ¶¼+C¿©“r²­žþœá–®g!‘¹8%øõÇEBó=CÒªÓ´‚23…‹"Å, «©m@µ³M}Ù ‰Þ‹ O Å[µÖ$°.ýæ~aÐð]ô*Û¨KÌH> Hæ˜`dˆÚØØBz9¹5¡D|~5qrŽ„F·À50e£x:” Å.H$\P®Tî^jîC µC·–Õ¬Ûãßè+áåFþ퀓‡\f@}ˆ—Šù¯Ç–( %wLBû¬ó¦¶p£®Z§Ѷz:<ØÙÓÐÝyòåcÞbXá+ .ºt"Õ®ÒÍC&že_ø¹=içfcÚ‹,㆘³ÚÜ¥hì€u¤1†STÍ$KnqÅ20Ø_ØP ž¶·’1m&ûØæÒÇ;ËÏÄÄioßœ¾, ›1 lð 3{’J…Ùß ;äDlè1gÑ*¾ÂX h0šT{<.üê†Å“½éñà­+"r‡Cxw¬}öüÈGu—ûû$®Â$,.gú?Å _d˜kz¦×,é¿h°iÕ’,5õ ­p'…_íPÞšl5–%ƒ—LPÀý…¨ZEOq«àew9Š…U&¼õ©–'¸*ƒQ¢ðRÞkI˜¢¼Æze …¿P§þàªúö k’4ÆŽ¸Ñ{µýP-KsIìM‡½@¯ W 5H_ßK_ùhœ ¸âŽ{ÛðÂ"Î~vúŸ‘3^µ ½Éô‘¢Xð¡«5Á¦ÑŒ\9‹‰Â5ž[äè@ø„–…´ú€Æ`¦sA¢YÚMýG¬»HÌBuJ Eнm…°"®d 4Ð2°N!ÀðÈœìOÚ¤7åM£«Ó±9™ž9ðØðè÷xªÜøç#ÛÍwd‚aaµ$Úömu$IrÉü$à?%Ë໹ÿŸ\>Ö%Ͳ “"h'†…Rþ}í¡%X3»ƒ3aM—Üï‚pß[exˆsÙc8;iÌlÈÍ/çŸ;'s¿ÏÎc”ÖlÁ+@‘Fªv5—j[âMÿ©¥ÃQØÇ¦­¹ÃöhFu0&F¸¶­áÛX÷ººg»ãÌdL¬˜ÑV™\ÓX„ŽÒf7è(mq+ù´™¹`ŸtÎë–ÀM¬‡~gã–»ñ°”ÜUl²ÑÞGëc;[Œ!Àí1ó;ŠèØÏÝMÊTn¢*{u&¯?úå öæÇ"ˆÉá¦Â9-Q¢U4í¾c‚ÆÆÈ3¯Sçp‘y ]yã¿ÔÎÔ¹.Å!rœU¥âb"M•æEß~“xþ"ßHŠìRîôÖûšmJˆ¦XÆûE˘Mø—vØ WˆíÃá©3W %L[‰…lÞ'ðùºPáÄæm‰‚ÉR1­íãVÉúJ…YR*V~tY—`€Çí–¥÷;Ü%ɱƒ¾@ -’°-ïÅpÛ*½N¤^Ç‹ZØSâÿÃzq¹2’W­Ÿ3µyv7ôµll¨ê+(/cc§Ðyæú[3‡ð¥õØÿ A×p´íBN#coÁ,s…”ÀH.Á¬}úKn4o®Ëí:Ýû×ÿÓú5=g@¨¬¦ü¸ýh~SKâ#JôjŽÑãÝ-1¡„ã­Ì,e§…Üî-Y÷@Ðåo ŒòÏCWÜö®–/ÉZ1ÊJŸböY;¶'ó±}qìO8üêŸO:¥pÊVÅ–†L3‚Ãi!“ f¾®†T’ 7ÇËŒDz|½­ª ÇF¹«$Û—TÈöàxÖ-Yq`•å›ÏÓÊgq{i†‚ÒhˆúMówïö ½ÌÊcÜ«¤?½Jz&=±T­37·'ÂA`‹ÚJ§`HSúD¤$EC4Wú©ü–¬Ý•Í `N0cq?5™FÙå=“xiÍç0SÌÛi¢'ò‹Š\®qp¸h4ÿps>íD@ I`êÆ›R-SŒ˜Á9O±écªx.æõ>-9Ë™s3p5EÂû›Ã…ÂÀÄäRºï] Þ}–†0Ÿä<ËyU‹£KïuN%i"Fþi¾ó½\åÒ±ƒ„ÈØsp§Ë$—Ðÿ«„e¯*®›®U¾™µ_@gAô nQNÏÈÆË£R¿mÔó’Ò`íR”ô«eë%z5¯_d`«¾\YuÀ(-¡8Huô1žC¬Ó üÒŽxô. ´¥È“©‹ì‹5±vާ¹1#©}T¾Ô*)nDÙ[(ãý&{Ä…'ÙžAœCš‘ÜþƒÒf8ŸÎ<,H®oâ¾V@¼’yÃG ]zòï:؆þ‰8XmLÁ8Vs‹ïúÿ†s„GVÞØÁ;ÖºŠ"Pë ãé²Äöƒ¿enÿO!VY6†,†”þÕ×ýÛÎzKSðÁö0£mb«qùâôµ+Pô”%%¿w77äœfôÇQ±6‡*²råâHfGØ™n Z©Û†<»pPô$´C¸óÈ(Ó[y]^QgÑ©:,73y{Å¥(…Ýá^á!¾YK‰ËƽQÖNb’ÿSO¿@œvuôéå×q%&…ìWð¤ aî”&áͶGIì÷³*yú»ŒÀ¦ð“ÌV7z8j¡À‰š¤òX†X­›îYÍÅ *+9˜Ëjjм còÙò½£vmrÔ‚»©lÇ#Ú8O+ƒSந—}k ðäPAòé²Oõ2¥­üC\»6ÉžŽ~ný8L?è¹»=æöÆQÖÀæ·×1ƱŽqµ÷¸W;¿ÂÛÈ}ÚrR¬ÚRú°‹k#†@?÷K?Ïa²jgê½µ„£·9)H0A, K¬pDT@]›{ÃòèV`>ìÀ€’‘/Éþ¡/üòE.Fùþî[6“±Á$󳼦§»ÝŒÁ¼¹¯_,¹½W)D™èÍèýY̲"›»7D1ªÖ#ωJŸ«=v °<íèñèœját(?D¯¦î”Æ"ðöN´%œôÁv¸ §$˜¤ÛØÍÞ7È1µºLl ·|µXv/ý¾C‰÷ ,‹P–•Eþ8-Ó(ÍÖbdê‡ôÊ¦Ë ½êÀ¶Dáv÷ïþy¡÷«`ÖßÏ_0¡­ªÁ–‘ÌkˆŠúðáõï£çr^ñH8 I¸GH‰KhæáÁÀVfÕÌÍãÆC÷™&ExÝŒ2“;Is÷ÅŸ4ZžÆswû1€²ñÖH[@)a‰µ:®3gÐÁïÑE*ÙÓýõ!d¼ÔûhÉ5O·†’jÏQ§‘Íù| ÆeI tn 5ÙHÃDêþïo“§\Evá36&‹Û%I÷ÐsœË:t&†rLk€ç[e ©¡Ýçdn§²óÈnS2ªc¸g,’3=S¿B¹Þ^§ó;q¯wËZh}Æ _Å,[0WfåôŽÚØÃPŽî›1ã“¥ßokûÈá¶pÿ\zûr™(ƒNó(—zŽ÷ ¼ù3¤&è0Wæb.ó:jpz¯äËíLCÔJXKŸ5ß!ÃÉ»ìV!À¾â˜Oú”îúĵp$¼ïxÆ%¹²’Y/ù’»7¾0;åp±ºŸ-¬Æ‡^aÅ´ù«Éï%+ž—êWû·u.åø ƒìA¥„ÿ¤™¸XôüãúéÅM™`,¼2í}‹ÕÒ 6DjâÊ’ßOòx²«­K™`Àɺ‹ÈÁ í€ðœäí¢j*´M¤oçG´tiÇZ÷~¢ìþAñ÷]³ÂÇq®ãó£ãÐ늞.hÔSä9 T0ñR÷@‡Ç>qݱÈ_[Ѫ>]„âðhTã–åúCJÐ}5ØÙKâU þT©ºU¨É w/#Ÿâ×g÷”«£³oœÖMÞ)˜u€’ð·‚4œ ¬ïô t7†3 h©%(m&ÄaÄ"ì"k²u}˜e³¢Ý›…S ERñµ29G”±N3(–ëWOÜ;âY„‘—n Œ.îo£Ø‡ ãñ…l,Y• ²ppÚ va‚±¸³ô%ÐÄøž i׋üñ¢Nˆ «®Š¥˜RäúC"à2i]A¯PC‹ӕ𦃆s70mœ™Ê:6K‰ñßMhÿ3Еlkî$ÍœT[c3šq‰àï³`„ÆYš‰)žeDº¢jfúÃW•ž|]”âQ4顤9%Z„~=Wà¸ôTiu(Z9à6+ZYV…¾cÈÀ0Órö–L,Ѻß@¯ W©nÿ ¬ZFµB\6ˆNQnVêïCÁJŒi:öªҶƒ0ó‚p×ãyÇu´Þ`(rÂ|85<"ÇD¦g¸ÞÕJ€ü€<`©7LꙎÏHMvôòö¾KF&FÏÖb2'4“o§Ì ’œe Iõ>å-“Çž“«¨*¥¤HÆ"}7½„¶ÚÂ5«k²g2‚˜÷á4VŠ tñFî_Ir7AÝÏÞöó‰S &¾EÁ G¦’C µûŽÅÀ΢V£W’£Wë&ÜÞ¥cd &†5‡îÑz-… BVD|c2¿=RB7L‡‹å‚º¥yßt£qd¼,0#àÓˆ5g/+²‰üUÐÉèLXÍÇŰÚCí˜GˆCûÊg- ‚7} ­ÞÔ+·Ôõá´È3(Š5†Õ¡äìLd9³2ÛO_&{"d~%&Sr´ÓÃN'M¿ªNäÊøÉòC<¬ ,^¢“²„|ƒîPæÞ3e¾@ŽÚ1< 2(“ÿ"/úîŸ+öÀÂÈM‚7XÍ9+ báïùNOt²‚]âÊìY40«_,?49þÜíI`áäÕ1'Qèòl8'ì)ö„9s¬D”ÛÆšk5*ž/b>‘ ÿŸûÃè°9\’¢4òÑ.ËǹKMg¥šïÄ kM7†Š©ºd`ÂÐa^ÛÌ™+ èQö̬@ÊcÿÉïd™qÄtºb!‘)@Óå(ð²î·‰,ýô2£AB™Ü:x«ƒObXµ£ÙënÛŽä<]_ìõ\ꨄÀÓöZ""Lõa8}°Hk:äXeêÚ\enÉ×ÄÕØŸ¥I¯g Iw™\ýiüÛ3“ ýÊk &»eâÆwšÔ1¡ü4%[ʃ,Á° %2eà)‡²º—"òîK ›’¯ t'¡‡5Óù•Þµ…hqd·éYXUbZoË-r8ô :çP%²ö¬öBÓ u°?Gð»ý ìe¨Ü>Åö“ÅŒîÊðT ÀiD»’3w\»þI¤¹)8ƒ~fî f*òK§c"rum@!NØã룼 §ªßYxÌïõb!Y‡™à#ÁA!ÐWŸYu¯‹j«O˜•Þî'?ËxÙSËÞß³¡ûÇæ Sªÿ˜t_Œ† ºªi‡c"Ða2=f&ß…·Ó–Ì*߉°£¶(";ÞݘŒÑøp\€‹Eó¯H9™Tñdæ1ûœòÙã ¦À¾rY­õ™ûP}%ÒÈ0?/Äë¶=hýêÉÝm?>Ïtýqc¦WÏ ‡°ªµµPê`ȇŠ4—Ör€ù©{ÆIä®Òé2Ý«Iôj̼¶‹¼?÷Ú (} |…&›IHd õþãЕ8Ì$+Ñ9Ü.¿èSià yÁ\'3ƒ×TÈõ(^Ãì7“¶ÞI)Ú8¥Ô5â/İ&ÖùÙÒ”eË’é®o–Øçs×L° údúª‘ÏA°!iuÏOÑq˜e.ËÆv\fítßÈá§ ÎÂDsÊ›I`CHµ¬eCÖ½¾AûîÓ$â^­P³@`>*`ZÂÒ¯·"TŒ»rqòÁqíý¹b«”78ïMÐäåÝqL4S Â¦Æ7¿ ·ëÁTmç·Àû<.øÊ !ÕsWÙšíå.0’tp­Û‚iZ¬\<Ìc¾C*¤_y¡ŠÂŸ[&q’n sŠßWy©]× †¡ô£i¬Y[Î? þQ»¢À¶ðÃò¯Ê $‘v;ï(Gò˜z-7ê¯}äA xFóÅ»>]˜0ñ4”¾Ÿ.òm%/Äé}9o†øÐT¶AãPä©)¥É¶˜´Bmü<ãe¹âè"ƒ§„†)q"z/ÃZ@Óó#šÖJâðÊRãgÏbðï›3»ž…îUÁøö!%0þ`ä^‰^';ÔöÁ "ùŠYï±`/”†>¥CN7ï+ý¬aÄ/’;;›(L㎃Ì[°Ô{š0Ö'0"«AÆÃƒ‘v;öî L¹ºžŠÀËHøààF'ÊõäaÓ=!¼È<ÕPù"@pàc<·r—•ÜRŠksk‡T¬Ú `Š¡’ÃËibý2ýñë€nÐ(¿$14X½ºòÈ©$aÔ‘Ð/²Ze9"ò¯ ÍÕ$ÈÐw J¿ˆ[Msyt¹*Q—%7Ætä8ÈŠC­¿H ‰³™pÀ:e}w^¹ÈlËT3ðÕ W¬»™L®¾‘~x"‚Êðqço`*ÜîÅàúÑØ®ñ‘£Ÿ§Nëjî·Öi‰|æ‰hàq^õóæ·^è¬å^®«2y"ßîe‘txp~këÁ&©RZ/¼k5 =êÚ ,5u]ê)ƒ<—ÔÁ Á’]H´£W®¼Ñ–ê&ŠÔàVOFÇкiŽNCcˆ¸÷´êrK «†·06¤˜²1\È)Ä6œÇquq€„ë” ¿Ü×ÑæÊ>Ì„'Üôå9%j<Æä·ü¢»X“ † ΊöÂÞZýVãIí÷ÈÕa Ñ`´ ˬ†—“9 ì~ò×ã\Š:€†çà‘CTÓŸ£Lô3žQè¹<ÑÕéÌ7¨Ÿ×ê™L™·Ýòïx”~$¾ºÏ³S¤ò¦½Šå{GFyɨ¶&N ƒA! Ã:CÞ<Ô.0]Z]…Lî«{÷£?m“|*ÿÝF˱¤-pdbÉ">Y‘ä;èÕŽxv&Ì´™â²6s­fu«µ3•‰L9òaòOòŠ÷©¾SÖò…F˵n‚ÀÃ"“л a¬G‘¡-Ã)n¶ÊôXçÁJ»£RLOä‘·´·ÐÕ´Dwìhõ Ý\&©¸Ï›´£]ô‘SDQrûï¥7}ñ5ÃwlÂXÃ*IX $ò!ŒÑ›ùa®šýÓzTlŽó¯ªk¹'µˆˆW!÷ª ì±]iñT&µ(Pb5æŒD½x'ú|BÑBÞù’6Ñ+qêݦ6V‰7qfOEU&ɨÝEƹmûLÉ«é6KS¾=BâTu„Á°‚"Ísû‡áȤ"& ó@Y¬G«è› CÍZ/»4ú0™B÷„¨{ú8ð©h tçÞDÙ ˜ÃQÑoyêõ»c_Þ¤&¯~Õÿüh5<˜çŽºÃo;¥’ éïtK"˜½-‡ÅúHJä" x L+Ã(ÎÃP`ò3"Ã1=IöÃ$DJôãdáÁ£Y¥¤ÇdS˜Ñ¯ü`ËмòpU^1G¯²^—“±ëÍf<ÑÝM¨^`%¬JÖd™=2þgÚ×o¦Ž)¨‘´Ó7ëõvÅ¥ø,cÎÆœ\÷Öå ú7 éäæ]÷¨X²Q¡ÐUhüš3º‚ÎÉH˜öÑ«iµÏ²)l\YwâÛC÷yì¬úºb»êȳ{tKÖÞaö ³a¼É4f~†w¾×íÔE–d4›«^…v'?{Éê|.¥CD8¶(¢b!“Ë8é@Bô*¤_=ZŽÍ~–•Ì:¸…æQYG{3à´±Å{•t|„ÃO ï þì¶XæÏÜ _Ç7ÐÛ)ÿÚ‡ží"Ÿ‡*ÿH~ÌTkˆ‹–gÞëùaØ8j#ÑÒ¯öSNǼÀq>Ç#²d=øç ý'áÈÏx×`óʺ\´r´ªÏ¢öJÇ0¶Ûù îé#¿b.úÀ«0 %^Ï>xz¾Aº§ò€Nˆ€M-ù19¥w¥©e^»‡KîÝÕo;ÃÍ2íhM!ò¤BÞ²ïÛ `ŠÜÁ.ͶpFò¸‚Ëý¬Ö×ù¨í¹ìÉEY~¿#š8N÷€Í&f¢Yúœ ¶ u |Z*’ì_¹žæøÛ¸Ög÷fžî£oÊ¢4’ýˆ»É®çOv)»\@&‹ÞåØòr¢ß^[2aÝÆw)ü\`ú9SÝ’=+;YKh´BuÈaL5Þhî<­nÇY¶CmZm(RØqšËÁ°…’õ˜ÃÜɸ¤‹¥©²(ŸDt½°›†Á-Ôµ©[•;ƒœ›ôj WK{ЧfôÀ]TÇZ0=Wû€·Þ0Ñzü—š4‚r¬Uà63eæ¢éª`gä‘}±Áš‰ªâ‚’˜ø€@±îuOÃJrÆbXéɪ›¡×829­M”ýÅÂØ¹ƒx¸æ§tp–Êã% AËãD>lÏ©K€rrtu—gÜäÒ/¸p¯B5ú¡IJ‘ñd3zîUfávÍ%ã÷SnóêWÜRÏÉÀôÝÜàf9NÐQÂ-y‰d/` I˜Ï“µŠÎÆ_ïŽ7€(l޹ט"*^0¡¿¡>õŸÓ ß©“¶R~E¢¼³p\¢i[Ÿ zZßôÂÌ?Ç3ú¡þvÈÙßÅžêni¾áŠÖɰt“›P²¦nÄéj½7‘ÆÍz~õa.÷+IåņÊwj²v«Ð«áâï[È€ÖÄÕ¯£Wá­4rð°P¸½UµS\<ú.YÿÇS±Z^7N­§cu’EÔJ¡$‚w˜ÔXd¹ñËo¤ö¨”ùN%,2ÄÛÄépbY32ø’UQýˆ‘p–éø¾ÿƒÎ…D€fð €ëE¡HI½)ÑÐYlåžõè@ÀB:¤ÕòÒ),6¥MQöÍW@yRxF`6Í^#¾e«çûö>á=ÝMXÉnÇ<) 9Ù°sY3Q".RAlî)œ?\Ô]_çš|ì¢ÁÁ¤ØÉ ‘‘§ÚXð8­RóØÅd’ÛÖºñ­æƒË•e“£|d ‘ÅLr×Ͱ2“’•&Ãb6.¼HÁôjÖÂ0ëjÓyPå×a]mT7°0Êœ´,,—“ƒò›iþ]XbX£dXbý;(]\uEÁárþR‹ÝOäC†%Èæëès“0¢ûâðhÇXl7ÔhÂàòRÐa(:á<›ÊGì ŽK¼ŸÀM`*G/W›(0A¬¼Œ^á i§ŒÜ¼˜iÂo8‰ Õº*ü¢~¥]âž#aåÚ=~ø&NŽ—ôÎû5«¦É1Õ‰ë¿usgóþðv±}I_å:÷Q‰¶‡M/]?ð˜Ú>š(ô@÷† §\bLËY.Ø×$¬GYi½kª³féÂÑ‹äžøÕú@G'‹)€ìúïCWÙ “Eß76]…¢­ .‰ª¬ìòj6¢¹)‡ç¯ÓùÇ<ªYqv>_o Ï‘'–d(y£xrìÀXO0,);ö¦8“^­60½aQiĉ·•¸äÂí°f‚sÓ5k;ÈèÃpþÓÆ¼¿$78¼:a4¨PŸ%ä5ê1_ó0°óâr2m¡ò?ª[½ÃnêgÉ=J0cXÓ‹îCàefn„½Ä£O‘¿×=H•°QðŒ­™ðÐ:ý›Ðö:ßP.sJE)/°?Ë‚²ÀÞ…wSNO²)Ü‡Íæ´é –ÀؽoÁÙãüÚ2êýÛõnhü9äPnè–Š¥Ë®Ì7æ6Ýs4ûõ¨Z—¥euU}Ϲ¡ÙDSØbô*Ô½ ËÿÄÜ HêSB`]}ÀÚ(¾ ”ŒÝ p¤9á©é> θ_-ç(—Ѿ•^!K¨$ÌàþÈ‚?xÑ|ˆNRÍ í<º‰^ŪtÕVûa$ ÍqéH}/èûÄã+`–N Žéä 6Ñ V,ç<ö8_¢4ë¼­|ò ½kO•¬‡r<½ŸÕ…ìnE; Çt¹"U!_¿jKjàåŒÕ´[ØÞždG6Pk*¿Ë÷+®êÕ) úüÌÀäÝ•Q"Q=½×¦b€'Å’üÛ'þG±1ô/`ŸÛ‡"édsmc>œnzQ’1·Ífˆ¬ÈüÕëÜ`6Mñ`Ñ¥låCK"+œ(”Þ½-û_UJï@«åáÍUv޹J!GR ×üW¡Õäs%\Ë[¦¸d˜'->¸ú!+ª 5³L…ÃúhqéI«¶WT[ø"ÉÇ$?¤¶É+ ÎBnŒÛŸp32ð5&®¢mâI»€{üð ðšú㩨Ö3£|ý°að¸šX‡Ut¯jèÊ(mñ†žOr•Ñ{f‡ªÍùbTÛïsm'@™4ÿBûc1Ò]'­ÅxDLÎb u¨¥.7¿Y7,zxìFÓ¹Øãý?s×¶e·ŠUtþÿC̓ t{ïΙ^kÎ$}µAH¥R•jDz™y$ô&Kâaij¢&MgŽ»› ³gVÈÙo~`£†ó‚YÉljò㉧D'žgcƒH…ºŸ¼Š»³Ãé#]¾ ×óÇ]ºˆV³†€#V™ä‹zµKf­ÔiðÛñ§â»»'Zb€EMdFçraõÑ/Q /‚·Sºjû¡&zQ¸nbÊ„4{ü%6"‚ÊWL«²ÊÄî”Eô ½¢÷túP.#Neoû&ÉaÐÏ3× ðPNמ‡ã„V ùæÕs}²2Ô!O8!x¡­––Jvr›ÀݽÚzÌ?qg"-ïÁX#(ùÆèªqÜß.šúÕ­ÂyÙyÙ°%°SºÔ%ÇîÉâòh1²½î€61‚ß4T?߯nÀ³Äè6yl#ZùŠjJ6½ µWþÑÏf¸z—šŒÛ~ɰóÖÃ*Æe<’Ãçh—j†uá)¿úûkX%×Ò¤O\*°æD}?bøãdx°eþn‡Ëû<¨ó±fÇTne#:ŸRZ¼}ÐÐÍ?Œc‡CøxŽþŸŠÁ¬f}NhÏÓˆ`4æÛ2½²R–¦D1©Ð@À4ŸŠ‹rš‰²|a ‰Ú¡KEÒìsÿMgÔdùt8ËþÿußÁ²¹hÚ·óŠ& j== çCÌj¾’~=žm—=gSy8Vú:¥iZ:ߺ³¾¹Žò༶-&-cÉWW›±˜ú–Sƒá¸Æ¢X4I¤-œ””"úPìܾ•…Èå_Ÿ@`ȳòéDýµ–Ñ„!¶74š.\hêuNß—ªTÕ\Ì^Ô‚â'&»¯kcqÙ#!ʽҡ\<À‹» [‹køV¼I L5€%5 Ku&¬1yõš ±**ý!z•»Ïð,àðí»‹w+¡êÊw=rH?ÓôHºéÒ²bëóãL²®JÀ›.Av5ž_ñJŒ' êlÅò0á9ŽÒž·è•– tgL–nÓ×ÜâAò:³•qùª·,ò±b¾/ò£Mx`Æv‡þ,"Ö…ÛAÒ´Í’‘˜áØJpG-è\‹u¿+І°7XȦ†¼¿ø:ý¸šˆ]‡fa]e’ÕØáûÒåU-4¶F1r2‘ŠŠmsݺ‰á"S(º®ÃܶUÆÚªNŸÎÄúy-†»…‡"'N‹‡H"€ÜÃô´çIXZw>(ÊÜ‘À‚ÄùÊ Î;ï‚Ü eÁ[‘ž›ôìe¾îÔÄÉêøÑ=¦²ÊŒò»7h¹PÅDªu _@ìµØý­Øqz:2°~õPYµDmÒR‚›[žŽS=»ëÀýƒ£ßŰbXî¦ÄdX9RäÕ·øÎ£Ï™Ûÿ‡¹PÌ,åŸ%ÛÈ®˜Ÿ±ì*V“¾¢Bk-z"¯ó8ÆSgôÝ:š[etº‹ð95ýˆâòarùù®0«Š%ÅäIF®]„Roûš‹Y°ÐZ²Õ‰)@Ý}rîòlšBK«è¾q“n'ï/tz ®#Þ*Ù(5‚£.MÓ¯ïüò¤šíŦ蚎#„ÊéëõDP:2c)îšÍ}"ô¶ôu/rÀ­=O¢aädúêÉåìe£žž,bÀuuYLŠm†F[~Ð5.4riËÇ«æû&éé!ùˆ?ú£¬iS×C$o7+b*qõr5’€€ýa†„™ú” WÑ¢,Š"GLûaŸAL&ÅùxéšÉæZïc‡ƒ-PB1q`k¥8é¯äX߸¿< ;ç›ÂZ¶“l¯óÁm2 鉕{&¢Þü«¿^†`Û0œ7)²øÐ‰1¡q¤3MÆ{(½·›^€]§ 5šN5pÿËê.“aŒãÁå3uwÌf Ω–å¹8üó ¹¬1]Rò–yöJè'ƒ„n_Mnj[ Ò^·¬*—Ô€1L´;ë5ú͗኉gÇ\Ÿ‡åÇX9¦äó'•¦ÕZp¯óºj¢9Æ3W)uOúÃ1mxÍT_綾Ûò* †:ÇlhèXš'=h¸»RÓ0E8E“säœç×™µA6¶Y÷7®Õm8ë@ÄæÌ·rWKÒò#>êæÛ?ú‚A{u®I~ pðsô "ÇSsá÷á,ë8-&[¡õ.4²n"ÆŽ~–<Ÿ0vq¦‡%;Už6æ?VuÒN kýƒš7£èuŸÛ @¯Bè*·œt¡) PBߺ 3øšŒ–,¯œ —ücÁ`µÝ€ݸãG‹oåL)~·3AvkšpnéjNú• ¢T±´)âMfmä)ÍuO„ÉuÚA6ñºV|ŒWr@àiÓ«"š½ü/F}֞Ź8År.þmÕâí%$RºWY€ªî©N,½æižÚº'‹ù°¡"1µ,yxmcAÙ)ÝðŠf­,œFU  +w üä@0€ð›p›…ò ^÷ïì*[m8 ÒàËS½¡Í˜ç7âjB ·ù;½b®$z©CÜ©vQîìL=¸»ò“K¡‚ê? ßZ•I»•ºô»O£ŸÉ.õ°Â¾ñ,ÒFߢ”£ÇÌ‘ò¨õ SœLëÈ[ªòá½þRâqQ ž"œc—J¹áÍê%$×Q¢±°N=è>ãô"'½ÉAQÓ‚\3JA%ƒÕéæ]Já¦êHŒÖ0E™¤ p \S=+Á‚YÿJ)]É=,dPkÐ|®ê tPÿÙ‚þ«æÉYþ_EXM äIðY¤£Ù¦M¹œªB0¶&X‘YÍpŠóý½VüÆ•è•ØùÇÉFøKåû^|«J½zj:é·òbS‡k8ŽÊ/TÛ7h{òÄys÷õ]‚0Îsòœ*'A6&áµ&í^½µ!™œqÓÄyF» ÂX$ûPB4Tè^È.´×ûÝ+eí zå.éz’ÈaØ ëL R?8×½ZtñÅëŸ=ÍT]`!ºŒ¥«ŽUͲeSÛŽ´»–ì;D–fQX]È‘þñ¬[”øü‘¹s [F*YèDÊJ (¥×~‹î9í%?F$äÔû¥ˆTíÚ1{´· zGŒ]¶¤}ÅÖE¢=°|α7ÌDá¿D¯æ4Žä¶ÊU棻a¥û$ߨÂYÇ3ª>gaÐ`’é½·w£È Œå»®Cëù8¡)æÍz å‘ᣓ1眻줟šÅ“ŽŽˆúnø®sšD%n¬¡‚YÑ ÌgêH4[^Ò»mE uZKš¦o/—6­¼´#¼5·nèÕøØîA]´Ñê^•ƒÓhÞë¥ùRýO‰&𕿼Æ5'‹­¤â݈ßî ØØÁ™#w‹×8ùnô„]¤ÙÉå1@ùåÃ,ãqnWiÜ, VØp}âTdöî{šêád熒vCR߬â=tµ,þrºqMFnbŸ˜IHŒ_Wc]’'v‘ßô+NzðÖ^Ðý:%SE%}å \/B5è»íáäF£é]¦eÐÿlÝ×SI‘û.žP§iá=,\‚õ,šß‚™U㊋j¦à‹àÕb&žä§™ð,ïCß®tz S¯nøÁ²õ®‘Pš¼ÎÄM×Ú "É˯§Êdà¥âÉ5ÀŽÒû ´Ò(A ‰ñMÑÑØø" w˜qDG;ðäsµZÛpã C¡¦~Ô‡p¼‡Í¶ZOU俘c®R¿8'4–XÓEQ+@|×Ñ…µÒý´.Aæ&$Z2ŸÞèe·±ŒPÐ^‚^!¦2 :¾1mU¯—ÉÀš_ãŒFÜ`ÈQ¡õ^4|¬—kë2Iï§Ü/5 ÊmÔšYïv òÒð¯{;Âܬõç±Õq\`½£ã77  wáfô ž‘Nú£- t÷$z©P¦³úB+ÕØmQãÌz  :FŒXŒBíáÇV4ÂXÛEù•tSæ&ãŒFA\m…“Ÿ¼Úç'¬+ñÿ5--¾rœ$Óï‘ì×V†óÂYÕ% {Û2C©`|ë"œ(Ì”è¢PLxw¼ª°'òBjgpAüY~˽Òv3ìÔ-­"#ªË‚Qª÷ÌܦX¼˜¨žLͤÛ4·¦gq=ò¶«ZR[¨ÎC­a¾¾óU}DmÛ~ž…Ý;ŽuR=™¤L=¤rNzftVß…ÁFš ZW¬ÚdÇæ¦'H‡­¬"¨û0§9©.ˆ—Cû'Ê4 u]*ýœM{ë²k©j•룒{î~âãsî ¶åDYt޼ºëÖ¶¨ ž[fp W×_‹HÕ†Ö2¸ê:²4м¨kO…]µßQBÊÉöÏùv¥%á®É)$Q@Šg +_y é•Ù:â-é§H(÷±l®Õ´A5â"©×°õç:¸Ÿì/›ÙÓ3‚¤  V ¥ê… u¡™&—ÔÿÁß›¯ÃLës5v`>#å8çÅ@Ä$¸‰QO6Èœ¿›â>ôJg.”ÛÃaˆ ñx9µY¤ú_ô!òv.¾³hšX·L >å¦. z5T‡M!DOúJ†#/àŠ zE3xHCÂR·‰ßµoÉøLwò$=”“ –z¤æÞ1¬ \˜ûãèQ>ÉâÍŸ¿÷J5*æ:pQ³FLãp•®Eå}Ž{U4ù}3~(žÓòÝË4䜰³$o¸Æ/籪¼±“½QùµŠàcHaså À/  # Ú7d²rfa,z‡k Ì[åÀ™áEZð½þv¸ƒÄ» tÙüÌLé‡/ÝNÏõlŠ„Œõ웪Ñ<:˜ Zñewÿ{žô—¡}?gÇ[uB¯ÔxÄ{:1¶ÝÃg¼€™"tß‚«’ƒ¦îª…_³ ¶“¶²{jù$“:{“© ½Jt¯l®r!p`í0ZU£a¥1ùRKÙfe•¥MýõA®?måNŠ×Pò¬è­â; 3žƒ–=ðÅ:Yä]¤îC(Çudðú P¬JJ¼E úϦ)NÏ-—Ve58"XSßY÷ÝF¤@TCš`2ß”»NÏþU‚$ïxèÕ ÷j®Ú¼\ÐÚv¨—Ž2š<™ˆ¼éý²_}ýú üµÊ÷¿$zpHàÒ‚}Õ„ªk‰ºÔì¼ Q±x¦,æ,'òñuV¯_Ò±¤)‡ù‚@œü0ÍOΡ7³4’çÚC?Ñ×wnJm“[Ou Ö‰XŠuãij‘¸Ï'ð(ç±z·iqc¹OÈŸ²¬ÔR$¥Á/³~PúTœ•\%qoµî<ÕÙòÚ6Üî‚)[õßmz">’EaKšwåÏþ•Ÿæ€“žžHZ§›¯’Âò€:ÿ™óÈ!ã(×£/ᛕ¿Á9ëZä*ܼ ‘[8ee­ÕQO€Yšy=ÆÕEW›§öâš¿¥‡^–y¥ÁTÅuK{CšnI~ʾQ"ˆ®™âW€ %ø¹JÌ Á(O±ðî2£uƒ§èy«¨.Kië¾öY¢Â$º·D8ö˜,³°ö:™8ÄqB¼0Õt_–ÙœZ@®)îÜIçdpŒºÚwAtåÁ)Â<\äy9ôuÁã›ýS ~s¨ïë¨pºÁD P‚Ú¿gÍ×ëù³°ÿ”ëmâ%.-˜Èzl,®g=ƒÄFc74)„•içÌIŸ¯ÌMþ‚R‹©óÀ`þ1ùEkµ1`¬{˜mÐU8Às8õBÁœ¿x2XGJ=ãx¸ÂãoY®&„'ü,Y|‡ÞîZ£ÖY²}FÝÙ‘ˆë¥´L§e.w #bSTûvNnŠ6+Ø“)N4<éšeÙ–ßG‰ “˳8ŒÄ½ jðÎ{H×^û ¶H–ÁwÆöé~Gs¡$Œñç.ÏcòS9¡mÊ úÊ"pÔ!è‘B˜bX¶Þñr¾}ð-ï¹xWï_—õOL›;3œD2iÔñ¸{z(CîÖçݲÆês@[$Ë”4&·I «úäË*Ç+çÑÒzôà?Ëç+Vµi=€bxfp6€!ÃÚÃ}Øç±±†È8ïû Ü”ÿéù÷Y¤&šàý–ƪ,ìPÛ¨o^Ê·ÇÎúýk‚ 3%¾Eü@î’fñøYô†™×aé‘;éü¯Õíó´|â:µ’ÅPO÷ü->úÕÒBH<«p`„º-„w/@È"¨6á)Å "U š}“޼4h|p—ö »1!CÐê›F~°ML%øÕo”Z=AÌÔU§ò0ö>ê*EÝ¥—š̤¬ÚɃꂃŠ?ÌűYÌЀ½Âs̉üñ÷è!Êðü=Ŷ°±hàž|Š~LßÐl ùýÀX0 |¾°ó7“ë NÉ-}¥²¢I‘*ĸzàîΣ\ °%žñnаhövìbæ/¡W „“vz”?ª$À “'&Ü%N¨é¥Vv}ú< ôúÜcc ?Ý‚ìŠæ÷Ïßy`AÖ‘ëÜ%xœ4UÑ Usa3Kx»U þšígpr7AOªêcXv;îÍCd\φUc—%N­ &éÝ6—z¼bk–°˜b©"S«¸{cø<#h`ÄÑd~o ãè}­‘rÜrÝ!ž€e˜mV­yfQrñ9ƒx•Œ,Dß.Û­}O:ü ì'Ÿ§˜|ã&r^x6/”óæaIu=:«4÷NXo¯%JZ¥Äü=,[M}”1^;é^-W/Ï-%Ë}!ޱ’uCårÓ­¼W/„v˜s¹h¯É¡‚ šmúF|ŠÏ;"¢"ŒÿöGfÜÊÖ½úZ[K}ä£4¡WÒ”ªÚ‹lõ%½| ¨=±çaæbô|èY¬y5Ænöü÷¦Úœ4ÐwIFò›d¨ð»9½DU‰}ì…@qÊã0·C)°ÈkÈ>ŸŸ"°€—Ìöˆ˜oV‘÷ƒcpÔ[^B6i©ß„êX¦¨ÑƒZZ+NïÙw.Æ«¨ ¾‚’t»Ä,ëñqÞ–™7Èø—‚ò­É5¦g'Uô1‚F[hÆËP_ê1ñ ²eo”ÉÅ€5L¡óT¼8»xšY@:xÑ?˜Õë] ¤êU‘Ę’ÃâHˆ]§N#ƒ‘‹Åö¢ecqXj&AÁÑ«!­°“o+ÎHƒi éWL>Ûþj»ƒÏ^0÷ÜXíÎn²ª^•ãOi{¢(b*åáÎUéä8“8UKàÛfS‹Á½jfm ’`³,§JP¤•3‰r6SAE}Ze·”±]!Å¿šrã´9Œ7ò¯öÜ›Áʹ҂ìð¬Ãr·ãøWIÞ'õŸN&‡,vxÕ‰ä6«]ÄC§ù"?vé4â¥õHŒø0naµ×0Òí ž¬J9-P×Pì!Dx¢G/bŸ£'rouNª7ŸDåç}ÒÖE¯ä€{õ²'ýðlÆÙªvQo÷NÄîî#µ»e0j#IÓ¤GûWÚjãÄ}>g'¿ÄñðÐþªSXã9¥dÞˆVÖQ¹tCy a-ö`¸xBÝ“•¸J£#å¬m¢‡È&³SÖÞÏ* c—GöŪ> ¦\ç9ÄÁÛ_©¥Ù.½R³}]~ôçêídBڲē‘Cýç õ æeÕ”½HÍ>™Ù(ç{/þ’2+P<9±øo'QŽ ';Hèæè2²hÿÉÙ}¿p~ÞÒìÎh÷…a9|fèqÿ{(ë¶Èæ H‚ë ný4!éÏóp•I%3Õv£{=ž 0 tƪ‹z%NžPíÔã.»zÂ^Î;]ÿû4{(‰8š.AŽû{üÈXÁJŠ>BÏD9zP¯~äZo Ž®úÁ]ïRÀZ;ŸQRC–UoVö_bgëºD%Ëm#¨—¶'¬ÀØ$(³Kºe$í@:ÈY7ÞºwË1õædù¹Tÿ:•xÁŠñoeÞMiÂLºQ«öÑ˃ÍLtclHAq4Ï޳›KP ÂÜ63œ<‘7ÀÔg$µîÉTåJÒ™¨¤,sßîd·!m<âA¢ÖßEÐ?ã'“€tóù< hy_ÓYÀ4öv´s-úm54ŠЩ¡aq©%‡%¥ü+fuö ˆ+Éöa¾Ü§V–y½ÑÉè§r[óºeWÀz¸ÿ¤æ®\¥Ö¯´$ZbF­¨Ýpæà »Íè¾òarE=JäKsˆ‡$A&VX¯áçzUjBÅ:i´,Fºç‡l®†Î ¦Ç}ÑÛçj*BÜ ž}’$Áƒ-@¥õ–ЇpŒm½\è5MÅ3é ²FbÓÎ ÑG¸2[9!‡íNª=úù³,•¥Žà‚œº ÊŒ¿®èÕ̽b‡‘QÓù¶BÈv²—“·ž ñ!-”É6÷2~À8Ïø6>Ê  …fáú¥x¬" ;:³®"P‰¦ÈwgÍêAò-ÊpPb›³æH¥qŠÜ§\:±,h¨ËE™\|HÕ·ù’÷ï²ú=|üW°þ—ASÌb{&ªe"à#¢ˆTprí)ZΟ,@מ/½á ¶¸±Î7.|408ÿº ¶k; 'ð_–<ï}Q¥³¸=‡èÇà$3ÔujÁTqÏlŒŠ¸øqjItÎpP™Œ¯ÿÒžûßäI瓌# ‹ç‹:æ`“0Æ]>ß±´à®õ9‘õÚxd)hë¹Ñê—2/-zôjxüüõ+cl˜%%EX„7 …›—¸Æ^?ØUÉ~КˆçµJ5~È" ;˜•@™¯µHÌ‚¤É)„"¬<”ò™Á ŽÝ2kÈfFê·õú=€L=~i2Ý­t‚†¸­1ç0«žƒöŠàkÿ8UA= œë\C˸¢‹)-bûDÐÛxñSC–lœ5=qX§/“ V›3 Z°8L]dTVÀÊYЭ#¹3ï¥Å²I½“H;X^õŽ¢­cÊFÂâ?°…A iÉŠ¬é,f*éb2ßE"«Š³ã©®èë¢ìüÔøüg[ง&$b³¯!ÔÙcZfÖÈv`0i˜}Ee‘i·è¤“`ÌèÕ4<¦Éä`2[¶É¬K§ïèèª ƒýÂv±6×åÃeú·i`XŽä¿R¿½õ9Q±È³5™Ëü‡Ä ºVÑ_H|…Ê”*øHS1ÛoA¯n}|]Ñô ¶nyPp›™A™gô ûáCi9› Œ‘¯¨ŒDÜÓ‰Ü`ÿ 5õ]èÉê¡¢WSAãJE뜒e)…<öÝX¥ïxÓØJ$ÜwñâJ® ûÊ,‹•”{Kª T‘2ú©ì¸üÉM‰è>GàxÍ!…z…³mT /¬¶{¦h3÷aókƒdà~2gTAÅu“ø¸¥T˜s*ðËÇ ÷“ïˆøB•®‹ä Nùx™³ÌfZ<{Z慨 lùOÛ]¥#„«Ç df9-ëœzšê}ž§n]ݹ0^ ì¢Ge§}¤-á‹–zºÂb¹´Y¹ç[½¹\°µÔð»ÂdÙ|ëô=ûêr‡Q,uQ }—b€31R¬þ^àÄ,æD0üuî‰qR‡¿³’ wf=Ï^§~¤‚ûÜAIկƲ¿éW£jêúS Pµ »¬ì-}Å¡á’K_M¸òã;‰ÄG$b>¹kVÄ`DbXÄ#Æ÷ºÁ\‰®Ž?’wFGKÂ0úår"[¼ˆU~¦|ƒ$]dï—"#„bP¦NN¹Ä±]Ä1øµÁµ±fÿŒ)3ÄWâ‚ ÃB´vƒò·ÞŒ÷˜r^]¼J>"sXòCï$µúV 1,Ò(ÈžÄ9W;E¯4žC'¸•ÌR4÷Ö÷"î¿¡B½ wÛUÍÃUA”QñõniV) ¾aÙç6”­$ö†øÜ.ÄÉú´=É:¨î¤ÚÕvGͽ? €ZDþzÃ#B–Ö`¦Š$?ª[Þç”ÛÑU;SÚOCÍ8‘磷§Ô'¾4ÝAR…9ÏQ'1ÎË߬( 5Äè ¸Ã¦¥*!ˆ•dr­'ñ¦Ói¦·^‰¬&_¿³Ó‡Ç°ñ3¡‡ƒWˆv UïãlæS³rÐÓ/‹øŽ;èUHÁ.‚EÊb GQ9-fmOXèi—ŒвÓÝWq¦ž§hÉçgêX$Áyšìü‘<Öak”öà-Ö·ôÜ9Å« Zõ>¸Ì}]%ŽZÕ e êªàtèðwwžUE'åÓg®âXÖ Yò´âåNò ª)5+=žï¯Ìb-¹Ÿö| þßÔqÊF ë¥ §qöÓÜd¯ëj±nojIÑìÏAÒcòÿÐÌ“O¸Ép° CæÎ’gÁÜH‰‹Ãå¤þÖ [âl©fz´(+¹mÉod½TÖ^…÷n7z5ìQÜóR¢ôÊaÎF«* ÂsL‹ÆœËÁF\pn/<§ø4¥àéH¼HÛ&÷£êsM4î¤Ó­»"îñÓÕŽ4UÞ¼`ɯw ˆïÉl©ÙU/NªZÒbýÕäOœ±|ô ƒ•¨Ôß|Ïw£…Qm`©<ì]d#¼ 9øe.)ðÚà×b²Ì°®Pó>.ຉ=„®¥^ó ¼™]:Ëeßå?ÞÞ t \óÁ#@‡²› (Qä¥<¬' JÜÉAÞ½µÒA½úº’4ËýgøÜ ¼ Î×Õcþv_/-p¼~zAÁæàÄ|o¨­”Á‚”ݰi \©,z¿›iv*V'v‰R|‹žëeOº®…Å#ÜWк.•p œÇÛÔ§%ÕôŽkk†1åUj^}f6µ¼ù¾EK¥œM«¸÷¢|¼tÿÍF`Ú˜ÑH\%æùMîôjó ›°±r2NRG$‚¾â•]´˜™¤œ¦$Ÿ,ïn<°ö ä{ø{¦ä4ð¨%À9M ° ‚ò äêyJxîÚ_oå´ÞTÊóš ! Tcß¡Wµ¾}‹æcŽf“ŒÌ¸?«ã,ðåWË~âSËt§¹ÈýÌ[Öº‹ü Óêôñ·‚¸.šx«²­¼Å‚Ð3Ì/ʼn!Œöú ÕÚ‚(·h˜¶nQ=ÓES¦‘AZë±ÖnX½IVì2È iÝË»Ïw1˜$›kß;÷Evíí~/5\îòGð®\M4F[vhn£Ö;Æ4Ž„²ˆa)áU Ì8æ·ŽiêÑÝúDOú zºüÏŠ@Àmã¸|‚ß%Ðùô]3¨µ ·m±ýY‚IJÙ"Yk–3åô@S…ˆX7Óø[ÛŒüáàåOA”¼{µ47 &btcjp™5à #œy¯yÌYG„l"#ŽMï"ŽÉßuºZp®¼Ž€FŽ)¡ll×öjÅËÅk‡Z Úçs‹ÁÐiâáËAXË+Øï–.'ÙˆÄ&Sç;å­°RêÝézÕ{ˆÕÇŸörÁª^6åçN\GË-¬Sƒ „"—BGª¹ã®®\ýìžÒ ¡Kˆî,*ŠžW_„˜‰Ýý³•øÅ·+}¬_[ò:·ÿ!7œÛ2Aˆà&ÁÛ¨ç÷µåÌItÉTSŽ4Œÿ¦  -˜ÊÐ 9Q€ô€pâB¯žöÆìïábAäBvÐÀ6  NÏhdYÅ–M äQ:ÁãG~ë§œá€ùÊ_P‚ãc$º†Åº`ʽnŠJó™¢T[ùöÑä-ÁÙÍ%u¬ð—ÿ8ÛçºfPÊtØîþþav¦GàN¤zÄà +b­Š%«Û âS³1¾9ô÷[?–õZ‚CKRlZ¸ÛÅKÎ6N+ñ6RœŽ%kD®í§º[Ü!bvglW“~3ê_“yCÙHΟû¸éLUdô.©K h²9ÙOÖÍo?„›æx5c¥ÕԷ•Ñ2gfŸ«= ¬JÐtÕ/kA .Ô*ò³ì^` lê_j­Í‹ å©Ðq­²lŸïˆ9œ•s³$[8#â1«ÒYW"Á_ ȪíÙþj–ê7Þ„o?M”5ñ•Æxw€}Ï÷NzçŒ&zvrù‰¾°¼Æˆ:OÔÇq”®-~±òF\K ÃœÊõ‡¥VÄ=Èux–(<ƒ_-§ò(Y\þ\ÏÚØ©×÷é9ƒ$¥ŠµHˆˆ”ܸÖIݧR_%ÌòÐŒùÂðQ¤åqÜ©³ûäh¬È˜Ì!:B9âf.Õú››)ë^Ú"GÑ8q¿ý.žu’³Êî@ùPS+vF¿ä]TÃë˜M kC*—ú¤zuWU„» „‚zM«uµþ™l¹§iV¦«^–U2œíÕ;š"”y°§½–à"¸îŤ„5u.[³ð¾¤,劢™ÇÂfßΰo£Ä“/Á˜ =ø©/åcøúÀêú7J'?fs!Á°¤ z‚Y2r.ÅÑ>Y7ïéÊæ*Lm!•ÅA6‚ãc §ºRL=^„ÍÞhíËÊ+¿×÷IUÿÆú7@Õ' ¤|`šÕ'ò ´îÑäU^Lf(Ü¡ÂäÄ|÷­£L¬¬ç; :C¯J,w´* ™ú8ÿ¦f‰b‹æKJP²¨æé1ÆÕßzå;~™œêMÞû¤É—VÕê-#žäe¢ÂqrU8˜#˜ÿ‘Ömn÷ÑÒ)Ó‘=¬±÷ÖÉ æ¾Ç%ØNˆ¿Ly,¸ëó$ªö8ÅgzInãlZ }*ohæBÇVµÝ>¦`m7ýK7—h‰,£Û(«ó Õ“®ì¾¬õbÒܦ ƒ;ÝM{ðx¢p}}ŽÄ1"ßµCö3ü™˜ük–x’ß=Í!ñÁÒBUçå77XA)¨äž¤LU1º¿É5Ö± XùiÚ½vô¸E´Ï3QG7c㪪š@Q®ç` N IbzBquÉq?´<‹ñ¬ûÎ5eãXÔ ïv‚ÄÓ DDN+ï»'Ð,àˆ“›k[XÔpËá¡æãFÈ„¿À_Ó…uªس¤Û\¢E9 xý´¤0YK “É‘ÀLs^£ÀRòx} [ó0X¤H‰à³,O%C¹;/'>D¯¾N½ªíegDýa²ÁXçqQJ´Û±*XÝ­'¦úèv©dÑ+YR^^ý‘sﯹ€/ +¥¦ËÀòkNcJH•»_ I×?az£FB/*oBöé^}Úâ÷ײÄ+|l¦—,½ÜO¼ÙXú g ë¼{eæñ]V¿‘Ö¨ê†%eÈ<-ÀçèJø¢™‡Ð¼®Xn¯¦ÿü㞃ؠWqÐ;)^jÈK" XSvÈ'!Vþ#È?°#¯©° v­Nz8—€,›É¯¢caR·–8 ~ò}·’ájô–㽊FóJz©—½ÂÉdð“\@a" b.¦Ê¯¼xî„ß–¦r¹Ô^gÀYÊ[¹ê×–øø°¡>ðþ\ŽŸûZ(ªuBïm˜Ë-³Ü;áHF¶—¹÷·c U™û^KÁ½® +ÎG¦ºÈÿˆ‡\ÄÚÝO^ƒöEÂí·É.u¦Áµz±¤nS?òžkœw­‚ÝðÖn8I.Š“t7@ÕßêÕwÄÜŠt·n—øá-Ü‚)‚J)òî^ñ0ا •![}3EäÛõ}b5ð¨? óÜ_§P&å]§#:µ4bn§#K;x¼©ýSÑž^˜ê^nÑ+xU6 «¶]]´ØDž´z’šv„=Bw¦È£g?9<#bÖ¯d‹K.}U¬¾Çô®ÜÅ2nnõ–òø*‡ŒÏÜ&¶Zôý¶RL¿ó½Ò6EÑLœ¬âMìFóû}ùbP  ŽãÎvÁ(•ú•¤ô+ŒÁFH€/l…ÛOšüûwXuÅ#Ÿ‘QÔ cgÙ…‹þÜ)²qÑd‘áú:ÛúfmfU’'R.ÃC½r»Óõà1•Ï·9=ãß»á×Ïبæ‚ÈFÝ| ,­rœ.’¬ëý,šoq_õVˆàü™û¹t)fœ|Hˆ ­µéº‡a9|$4©òÛ 1hY¤­ƒ"FÌ^ôj>4#©IEÄ·=)’ ö:|ëÚr鵽݋V0Kâ@˜þ4AèÀ¯½)ãñóÞÓ­ÞÚƒÿLäVúJv‘ü0 .&6ƒ{ Ú œ¡Wr&“/éjÆ—šGj d½~'\ìÃÚæ.3wJS' «Í@‰2àUÆHüÅ“Ä#úgý˜?K±·ÉÇ ÞóRÄ›¡ìH¿Šv3>{ìD½Ëîq±E©¢ß×éïÊœ¯ò^>zaÅrW®.Rκbðtq´bj/µ¦ôa>d¢9“O¶s¦Ò±ëÈóH©Avæ`…}õ®æ® *(‘± |£×v-¬Ù Äðñý¥Sð$ÌMKYE´ÔÓVšmGéŸwÇÅÃçFɯxÒ'¶55÷öÐø6kà¸%½J~+bä¥á¹VÁÖ0îIërÖ\åÄ—'âMF6fs5îñ/iÿö{6Å ìhF‡§GºúÚe-0ÔêCĸwõgާŽ*Å,ã‘ô—nz°$.àzЬƒ0~&×/[é¨%ॼ GQ®[¢Ð67³D’\JÙi·'⯢Œsfb9_%HŽB´–6•9øŒ7­øHVÒT`l©þòLÆBX’ 9GP¦æƒ4%œ\ņ#ZwçÝTÝS«Ý¾ ֥ޫ>êävì"ôŠ~lîݸ—v§8£±¨òL@½æðeîÿ²‘#ø@ýýaIѺÍ`ȉ ;¼C1Î+I·(ÂÆFY“ŠÃù5‡ÕjâñQä<ÒdØ1‰ßÆøb÷:_Y-óelþpT²xÐÈÓº£Ï–‡rlßñ¨b=l:ºÌ—j²·Ñ˶ò{tUÚ‘$Ëžˆÿ-ÎhMþ‘äéZJÓowîÆ6ž‰^Á@±ùòDµÙÙå¨y©• ÃÀ­•)ˆÉÔg愇å'+†%‘CÝpËþ“ýª:üùe∩³ù$í|«C™Á¯±4Ï/åW„ÊxL&¿›!è&”«8ƉÚ!dc:)êe-ä!zJ…¡há%z:å’¨“O/«8.Ô²ï¬q5âjZ­ûâ˜y9B_!Gl…ðf<è‹ñà™–²Ýñƒ,Dˆ’—±´ï±ªOŽ1 Hþþ‚$@ê§9AÌ}i<Ðjl#ÈÔaV„4žò¾ïºéÔÁšâ„³È _Üýrõ:< †hk˜w–">WQÅä€áìI»r0j¦Õ®9Ô¶j;%f¬ÌxšYÜ(£tœÁ*Z­_#¨¦lœ,;o¹k‰šÕ¼æ¡Ù?A$D¬Ð¾, wÔ+©)Ñõüq_³+È"ƒ®ä…~Á°FËÍ€Õ7Q‘Z†»A—:´M>1:üüúlßÚ&Õ4!ªƒ¿Þj¹.{%ï|„’1=‡±ÄÍŠ¿t,ÇI™‹?kUrǧñæf0·h×½÷0ç§LOïæ z¶Ù40`1¬Ã1:¢€è¨ð@<Á¦šÛ ñ_¶ÇÊü˜º‚A€^KŸÁÒõ¼iØh¨õ\kâ5~ô•€Åã¶ÿFXýV*‡EES-’§k›bÿP×dŽç„Xð%‚žçBˆµ¡¤¥Km–vUÙ3b±´à©wGfWAª¾DŸŠ#•ÇÛìv*,ýÀ³…ô :&®œ•?Oa.õOÍ6µšzæŽ Ë.0nƒs¿d|ðËÆ´œPl«p-£IáfŠÉÀ ¿ª†púûÜShbWÜò¶’íš_ŸÍ¬å­×Þ㺠µ;¾áÊojeQ^HV×øEV ÓɪÊÑ2rµ•š2¼Ò_|qEepˆ—…È„Ä*K£Ò&k=#.è"AÂuÃÂc ¼ I>¸ó'–¤ö6<w°$™bÛâ°4±_èh‰=ðX†óªËÜÔ ‚ Dª±«)tŠÄÌ’Àwp«¼™¡)Ý¥£>à „\™žÐ;íµc&—VdäGÁXëb(úÜoV¸z§¥¿D zÕOs Æ]œ3Ï߯¬` Ôì¡ô”~µ ÈE£z÷7/AûžE”íÒôÁÎÉÛw‰_w5ñÁ\ {V1‹[Ýóƒœ@,ý—ZÖf {°ªw° g²=£kf-YÊ2ýWû´¬zËûtVÌÜ WÖÓpU‹^íýi|êîݰ](Šœ44Õáf "Å¥rˆQ*³puOªŽÖ¼Uæ¸l2“/`X >’xæ¡ 4 Üi_ÂM!“1QÞT¸ïÆ@¢@×ò[gFÆ,Iýr2Zµ}ðV= ‚®:reS¹J¶¦ãK2óÝYtæ×вBŒL‘Yü|búúi—^çéÓ·´,ÆÎw'΄:fãéýùù@w€æ\°¨–‹PbèJ"å/è#b–cGa²ùÙÐr¿?2Ëôܧ7a-¦zÝ΄ÁðD ¨7ˆ'ï}š®ü+úÕôþ0xë¢âS­ ¸™tšCG¨-f%™ÜÊü[~øðp[Ÿ9tåÿ=ù¹ò:VIuÙw6Cû¢ýJjlj~ëJÜ”v^Íí)M ¡«GZõç gù*p |*3‚ï¼ÐíóÙÁ0Ã3øU"’‡~ôå~Î}ôg=H¦.òKFz+GÌ–=rŠî½ÆŽ„l³‡à-nÝFkøcÔU@ܨXùÂK:ZöS媋ÜUg{Fo è¿iž&L|%¦,Š([rZùÀ8Írß„Êa|ž4š×ÜCÿ½Úr]†×ÑÈ+xw:ºñâÂÆº•ŸÉ”PK’ÿ‘åÚ»v\™š ‰)¹¿îÑ]s1¡>†}_h”6†<—÷v®(gµ‹íŠEZ†K<¤#á1¦5êb3/“ôÏø`ïÓôë‚I‚´ ,tyZ%sT#Þ“þð=¡© 3Ó'KÇÊŽmí¸[V œ³¬jÚr–i>mÃ&ùµ^CŠëš§Â¤2LGêß“~£?&Êçy@BŸ)Wê½Îë<¦…G»vÒï‹ äáâ)ÎE%X¬ž‰˜ÚÜ{Q‰"»JãqSðÌ4í4¡Y¿E)]R¥Ž®›e]Ùßh¼¦è žœM'CjyØä\«›Sù‰YÎp«©È±âÁ¸ƒÚ“7wâA\Ä}ÎòøgˆÕá%Ý&ê‘SÄîeÑͼïRSº$f#+)Ç‹öèj=L±K'’pW<ü—Û„ѦXiý#NŒfÈNcª¬¢pÃÆzÁ# 㟇Uˆ*È ~úÔHŠI\|( ‹y¬¶?Ö´³kåœÃe}\ø*pZ`„ÀáÊ]dNî÷Úûÿ]„Цf¼w§d¬4 @D™kòÕª]]vZEøN‘$vÔ!t•—”|¢ìÃÌO}‚ÚqMŒeP:Û­ç­Ò^ ¹ÝCâÊ7á:\O‹púü8ôG‹iÞk¡ÎJÞŸà¶ÆŽóö1×Y*ÛèMüjxÚ'2\:E8´Þà!Vð­¢ÂÞ½øC~’À·Æ?N:çEL`¤’î®aZé£J}\%RaÞJõÒ&Ø X›;õ¢âÚï,h°Ê™6ójԓĹ2a½ý\Æ×ZÑ`Ë冄ôŒxeq"ÙÉ…äƒ ÜŒÜ4,ŸNE 'uÅàö!›ßE€ŸnpÃá¬>ÿÛÖ`ô ëóô4bû/ñx™$´Êî>DÕâ8 jÕ”}«óÉ:I;ÖóÕƒ®Ên„Ù=ä‹U¨ÿ1€—ø NÊËȾ*ÉêŠ_wÄyRß³"IŠd•WöÝ Š¹VɱàÈ9Gf¹t¥ OU™Kè1yˆ¢ØÊ¤ºHF`VÌLÃ$$’¢ƒzœ?¿ÜÉAUᆠÝß—.s_” j%¦¦NI’öFÄÝ Óª%Àsm8:„®ðY@þ÷2"ûÎ <ºí û³”úÖ5H?švû0ð¤ÙÎbp¨Ž‘­QÙ¨>%²G8Õf‡húZ9Ó 1ݬBE0t ãKúižÌí¥8詬FÅ"GI‹ì­(sÏ~©°h€‡n%žˆ®ÕÏX$ óê>µJzc #‹fS5±ˆ&¶Oþ¯%`­FCâ/ q\‰0-šfÏ“ÍF2¶îc¤èŠW0½ 0Ë Ó¡›öÝbÎð'ž¬Ã¯¤Ö_|ú!Ðp>Z˜8V¹<ývLJ:̨uà]Ðâ#æAž˜§#IJšrv‘[ÂD.»-tv#:…ŒÇ„Öâ…ú3•}rËT_qègxeBBÜÒÕÅÔ$ȈzvÅ–ϼ÷/_gªþ0)¹Ÿþ¤gã®Ý`µ1¾mرéÜ!£×ý;vÜ៵(ƒacOlùí .Ž~¶Ö]äK±ŽæSâ´ÚúñH=gÒÂØOjaØ]ÅdÁõ\tL®4K,¬øS“+ê(Ä×Ëáfv—L ^{ÈÈ¡}úZ6וç`Rÿ‡‘eõÅÊqó—ÉGx³W iH#Y'ÛÇ¡sK,ö+É è»$#4'óþΨÛäÁêõÏ?¨¹]ÀÂÜ0©™vC þî²Æí28¬4ʬ„íù]RD ‘¡·HëÅÉ¢2~åñîþ-­–¯_òʪO;*u¤Ê©£ê½ÊŠZ2Î5×¹€nª¥¶W –ÒÝjm¾Xüle†á8 ošmˆ…ÉS”³û~:†Ðl•µJ—¹[6δ+Þ¨bÕÁ'‘M*¡Ã ýM*V’–Þ0ë^y©Ô4Z8fC‰¡¤ýzeÛ1ÖA¼N# ¹òÀƒ˜"õÜYK3ÔUœ“ŸMe† rŽ/"¦8ÚŒ±ªhý`KŒ†?C/é'éŒÂKP{ é\Lš˜Éçú$y¸@šo èQxzíV{‘€ÀO¾ÏBß^GFÒõ7uN(GÃqÿ%bõnñnp·Œ»f°+»æ óBo@ YæIïãaSBx˜™Sõ¬=n)²ÑÃ*)eÂXÖ¿IÔiP6-ó®ò ­z³-â/+~RÍÏEÙÝ8AØe§é.©tÀÍcX/—¢tìäYÔ`žðGzg¡Ún‰A IÇ\y€^¹àëa˜@€y½8—O~›ï$¿÷ÆóxþÄÈ…L&jæå–"`Ï‹¼ƒ‡é€IFåŒ0’l'âèôö-D*5IzT—˜™ü¶Hc7?ÚYŽ7œ„vzJ’Å-PÛ›ýü§Àˆ´æ I›(Á”Óp$œ×/Uq•C®Ö"y^&/öK›õv{¬ýþ¹Ÿ*W"·»'£Çs‚'¿tFª1ºZ«<ð†·¯‘¦>ÛðÄëD@aÉ4Á»ù½0±É&t°X*§¦È¯›Qò]ÏÞ(å]«wçŒK´Q;'‹—¨ð)Œ€n©–{;5T©ùWN:Ä;²ˆçãßP§÷=ö}ˆá½Â/Ô5v/Ÿ/H …'µrÕBñZÆÞu<&à&])‰_JëH®¢é‘¿sæ­>$E¨ÙWu6±©Aæ£?ظѤ4Ý÷»ZÙ¥Ëk¯t¸.!סó1dM·:]¤ÜGŠÝý ¼3«S_謁üž,»H\Àa€}‚^±%‘íûÒ?bà¹õAµiŨPiˆ Ñ4Ž„÷Ûka, ýFÚ±øÆ8%:´^‡¹> ÑI£]r«ÿHø’‘%XØŒ–ú+oAÙU°È_c"1›ÊFÞõ¬gðuèêßó¼_Xî .W^v¦ŒL:¨ˆ•éæ;G!ÔèZ‰7µÕÏÄŽ­’@W‰ž@°[ÁÆó"Á혢qå•„=".½©=piáNžÁF[1¬“ù3úßâ;ü,†ÈÇñLáüô?S Ú¯è’“M ž›l; pXÂ!|xvÑŸÝ ~|Ïœ»¸äž·¨ç z%1ªUõß:÷ ·Ôô¿3èÊ>¬~‰gÈY„ÅbX å'; ÷s+ª*9Ujx@TQgÜŠØk¸­-V~µÏQ)žhÿˆþ/´TßG/Š¥ƒÙõÆô\–=ºšd{#­ÜÝõ2ÉëþÆõö^…퀕jñÊüÖ?ûÚÐå=ûû G›$œ28Ìâd]‘Q‡íè„ãûø@ `»DcåQ¦¸‹0¹)ã«<ϹȪ¥\ã–̶©õ#ʉ8ŸIéð¾ïæ*A&ØjVZu×UÔaƼ6¶êW«v;††<ƒ‰À¸sÄß.SbªùÁ«åv ¯rÆ%ùwýßÊìô+ †9g52ÖìÛ6ãÔwaüÝí>ú;d¥¦£¹&'*øô ÓðNƒÉ; {¼‡w"ObQEˆOǰ¸›ãDô£½tÿü´ê°Û9ºÅbšÊ IÄ\q»9–GÕYºZî ÃZFæû…®rã¶6—ÝͶp®~µ®ŒcâƒÞõÜ(ߦJL*‰St»”s4Ù_”>?F”ëþ6Ò”<i4;܉[™$¤¥Ì3 sÝ ÁêÆÛu)k’?þ!w…îYŸ»œ›ª:8,9—뼜”KÓtG».¸{ay¿ªsÀ'FáÜ€GÏ—Òìççìô ׿J¾r~(;7‹°7·ˆª;%"x@½Ëûu_‚ÿÜKôóŠy­´ÙuzªžÎó;M ‡c.w à·™áÂŒûUàé©Ä{˜‚k\žÖ’Âô²“¾’”‰¼xOE–âlÔQE£¶9N¦±H]w÷)êš àz3KÑç»ÃžyÂ>¨ÈÂý›ÆrsV—s·±¢™\¥H£`!%äóDB·^¸;忘ռ@ðßKŠÓÁ%þX¢ñ‰_G¨JGj¬v™0b¾ÐçÈý M²ñšÁ¸G:fx+¡ZSÀšÂFPY xèØ¬[Ñó:+U:%”ò·JŠ*ᜩxIF¯‹÷­áMzsJ 'v:k‘‚¾zz7ïè-¾±Òn¦?ï†éÊÊ.]Sí1äÉ»ji¯<7ãIÂ*-«ŽT±;?h罇SåÒAdëE‹©­kµŽªu÷ìý¹ô?9ªX.´ôÔó0‡ g¬ÀZ=ßF¯^ˆ>à!Œ•:ï®``‚~þ}ûD¥ëü†žà\Ö†/Ðÿ)-²Ry‡”„Ž˜1¼ÆßË\.Z9¸n‹±¦n;îlàÊàƒAuËeÙ°+ù6Ãíãc~ ‹чtvKeàu`œ€ ׈/ï—²½í#»zÕ2¢M•µÇ¢R2R#u m¦á©´&t•º¦^Àb9'}fV‘GZ¢2«L[S)ÊøÈŒÏ¾\!Á þŒš˜m»Öû¬14¹ :È%Æ99eg>)ÁÛµ'O9wŸu‚£¹¹LD1C8MkjÍ\Ùâ^ÃêÉI eÎög,‘“ìcèÊøfõëù:À-ëÎï>žg ‘vç² ÆwÁ`á/§ ûZ›ïÝoü<냟ÚÐ+2!tî¤Y‹ÀKÌ™­çµ—fdC<Êu• ñ2Ö1*lGIrÙæŠW×äM÷’^¾Q*“\IþÅâA³]o³# Ü^‚aI zccìÖK!'Kž¤:x%Ü1Ñ£ùÀò>×7}ŒdÇb€÷H9°½Äï¦O%Çøø_lãQ'ƒë}…o‚`oõòN°/p ®©5bñ€EŸ#¸ðnâNÉ{Gp‹«êeU%ÕM©3m,hþuMóD»}s’¶¡æaíæ¿è·I~ó—T—ˆà¢ÝEú;<ØÍ3ðZ"êt%ð…«I¨öë)ÆŠá¤ÎðhÖXOP*¼q‡ƒ( ‡ùàh¢—W9b’)"N ÙÈO`¬ï}dÍ7õecq…>¼B!Ÿ&.Ô¢ýª°‚™‹$ç:ó€T_O<Õ‰Oú7n~‚úEm*‹^ÉN?«£¥W›•öèâë¼!!h¢œV¶Õã‡Âîðóü„ÞöahGèÏR&%,jx)Ò7€Hm $R«¿ßá}A¯¦d†ÂZm5µd䆊Å:ŽeÊZú:)Ík±¼õ¸ìÞÄMÓr–ûÉ[¢Þ«.¤ìbXS{ìj¶É\t ›ñˉ5îÃb_¯ó‘nLÚ£…kì#ªó]< õ`iv‹mŒqùÅ®ª……è©Ñ‚aM­ˆöYÁpëÖ³‰¤Ž«‡ÐÕüNî1:NjdT¡Wßj§á8F!†NœÎVß¹oÄ3w_­Ô!8Åtw»Æ¦dIj‡YÖj~brdôž<­ºÕº? '¸•mJáàZE¨B± ù®{‘îvtšlO0Ö¼n.úbü#·AîtH釟?Ÿù/âw!eæ’×ÎÀ‚õoãšÍ/1c]si—Ì”r ޏéñ«·*E¹­|˜&‰•¦Ã½Òƒ·—WXƒ´å53¹Äp¹ªÜÕÏÜÝ‘ªs-ív&9ò²– 7=<®Tf·/,žàQŸŒ¾ñ·ì Ý¥£g[üDá»qÓàØ7öW(56rž‹"BÈßaœÜ’X2éñ ý)º½G7æÚ3몿ÎaÎzøR;‰ñ Æ’ B>ÐkÀÙ=ÀSÄ ßåwÝŽ>ßñ£úó#ocÍ•w<“‚Ð ÍR‚‚Ì£rŒ†„,@s7&>:Ð;Ÿ¥NÓŠ%EigÀ ³¹ÕœˆvÔ©Î7‰ƒÊ|Dj]`;;:ÏW<ÇÄ×i*´Y ?™è@×Jš4£…q&@“ùló‡•ye/~-Ê®,éÖ1>»Ê ÅL«D´t2 Æœ¬{ïÊõHó¬&(EVvaQtâI¢)˜Æú(99ô1'׊Ž(ö+#äÞ~÷ŽŸPkƒYª©÷³¸´bY³Bš‰<¯Ôðê«aNFñäU'1¯‡ç8=Pža, ±Ë³k»Dæ¾Q›&h¿<èÊXQ¯î¤®:i'‚qe¾tâ!jÑ^m[fà:N¿š{´ë÷T‰8×Ñ3V/»¿~} €9Žßü+Ò(‰¤¿c/ÒkTÏXJ·‚à Ôûà|ˆ^wÁn˜k])˜‰=I¯³#$ Fˆªz ¢óF#õ#êmußd–×ÉA«™åÓòwWÂeõ?º–Œ»Ùð.5=Q|‡‘‚w§üà¬ÞšZõ’dîÿËr‰ŒÅÖ”ãÐ@u¡ù î™û  R€zýv¬sö¹l?×,8Fè¸4›y¥÷×¢c}ŸRV¶Ýêèê¤;š“~%ž=Éé*QB³MO?ï‚"}Yù5Bî;d“]a}Žù.¡0LÉc·+ó5¥©MûÂ?oÄ«°wºˆß ,茿¤·5»ãešW(Þð ˜fµ…®v¥&¶ÛÂø ÚøaÔ 1ÙU­›ú¹ô‰µ0—˜îðà”i4оi÷œ,±Ñm*«6%V6b`²qô¡O¤4xñ€N˜ë"må¿ÂÜÙŠû\‡Ç‹ÌÿøaGð³l$ ;5-4†åˆa9˜V„v­ÄðLë(¶ûÌcÙ,&mÜŸ_¯wô–ú=_p‘V køì†Ê.»$…›»ÒFáU›éÈ_Fåâ†ÜaU1†%ƒš­åÉ–‘Ïüà®fámŸ+s½ìV‚n –¤‘C÷}EöœÏŒƒeSÎöB9Koª÷B+‘ß\9Q*K•f K´)Ð;)÷¼cTä‘á/¢RÏ6”øÖöáp÷É€ÀÑóQ!w-[½CÆÂfßòË[_pçwîX\ÿån*ÐéP¹ÔªAÆÎºŠñ¦èžÖäW“ŒùS@“) n0}ËLtÀcñ©xé9t}Í"ÒLTÅ¿è#‡ÆágJ£‹Ìo1£CµZ$¹ÛPFö eã +~„™„%ñ b{+4DÕÕÃrÉ¢\Õ»Y¥°Ó‡¡Îiž®ÃsÐj:ãÔ’©ÒÚ&UœSÜûå"’âM<)¼•–€J¹<ÖIud‹ä-¢÷yJŠ5wÝ +ž_5ÍE·ƒ±_¯ímÍXlê¼Û4G<ÞG.Táj·Ï%dn\%—¢<½b8ºØÁÄ’¦’_×ß\Ï.تý æ…ª{3‘ýËm>8Ún¡L9>HçA÷q°¿îð`w·ªé+KÉá­éÅqË¡«œ ”$¨ " Ø­¤ŠåðRé÷Hï²;?Œ1°®Åæô}©%‰yN|Ÿ„|àÙŽ0Ó4+…='¡¯i͂֓êr3{Ú°ç5³Ï”5˜bÃ+žìP sÅÙ°{Ò]tz Ûwù–2êyÙYOBÙi{Kâž&?òð9Åañb|RfÏrôŽŽÜöŠc%?90†'Êtøx1ø$ï8ãðà6ÜQ¼nœ§î\cùü{Ýr–›–{)»úÎÉYP½…¹<èäÂg|‹s¸àäÚVíTZ áÛ…L†ïV´uN@Ë’!ØÕç°ëO”9‹Äã 9>æùôrÇy­/Í#· Ö HÍ"MJ/ŽA·¼~ ¾8R¿‡ÿlBv Ù„f–0™øc¥”86MyäÈ ‡3L¦è¾C~N®ßÊ/F³qyx¤„’„9?–ƒYÂŽaY1,éúë½™@°Ìóö?"ƒöew5¥˜×1¯">ÝKôÍÎtk qåù‰Ž‚/OFÅèqH|ƒ“u­Nó#­ÄØÓy®“¥¯ïæ'3|ž£è BˆÐfæ~)lÊ “||E3oq¤ûºÝwO +Ñ+â­ ,…ÃÝá‚3z%éË{íׯÊ/Ç‹9Òoü08zúUƒµ’¼b¶Ýš#Î\=S]í:9È\( ÜænZÔÊ„e;Xݦúm¨²Ì‘ºÓlÅ5\çÌ@ ®ðMêzżDëmê"©2}îD繓väýî‡-s‹'ò_9j±Ã8 ­€¢‚goZ±¡t2íʰOE¨o¿\W2s‘ëë gõËuÍWgŸö½ÐÔÁ(–ðrã X£â¡?ï¯b”'…·˜Éöô+ˆá]x©˜°ð­9ÍdÎ| ºº'§Ägó9—µ²ßôÇð^¿x–1E£N†úËA†éi„ Ì×¢WÀiW+Jeùp/h9Ýõ¿ØP’bç–øƒD0òdç~tÛ÷"VxÃ[Õ¬maï5ÿ4 öÏi¥¢Ã!û¢è‚ŒÓ„ûÌÎàIú%³Ü²÷(¢Ý×wÏo¯’<¦ù Í>ôJSñJVî +ž\z×Þßz›Œ‡Ï c%N^†åaÉN¬˜¦ëj¯>áWî°æaŠ–ým<‚L>‰ï6=Ÿ¼RYÌáa©óaéÃ’@ rÉ~Üj[Ö|PÖ”tZoýªu¾uynùV!å«*žs¢hçœÓ¢ìŒôp äÛ#r®àý¶A-)#=ïàÉ«$²|)™þºŠÇ#f—ˆö•½RÔ¢<¡nß5KŸ%»¸Çaœe„ê1¦~`{¸<|Ê9ÙÅŽ3‚)ÝLÁB;ƒxXab bb²»ŽžøA>ÿµ5L‹ŠDijú•>ÐJNRÙá°¡ »i²}AVÅ¢š€rÒÎú©Y¼IÌ[¦ÆI°È•n¨ÇXÕá¶Ú;uÅe¶k±ô¬Ò{"S¨«e$YûM(Nzî'™øXéëcëÔ*¾uËL!7ÌêÔUñVfR’ì”°1ìîDº£$å~»Óñëy䢇Af)@zi¶Ûß­¶Q(W H„±zrÍþúD磣3l¥ÀA–'ñ8¦?Ò…ØÎyq'®"žÉã#KŒÝ!ÂæÓúú¤­•ç™Ñ¥óRPåÎ 8ðáÇ»ø\ƒÛì—Ê5㉇ÉüèÞ>=J. pº ÇcXoüÙ>d9krùÊã$oZ¾ø8†ŠÊ¥—ÅÒ–”9aÒÕuw´]ô"=Æyü½¢×H¤:æ¯ü”s£•Þg@ ™%hWðgÊêA1¦ÂÊ.燸¾ûß¿¸¼̬+„Òº_Q"ë+ª¬Ž»©®û½J’Œ:ï—[=+·ôÕØu Àa7A¦‘/!--RpÝ(E ìÒ}‘ ü ô2Іöjš =ˆ„öþäÃAPsŽO¡+y~„ÇÔàšã #áñå-osÇÿèêÅQ’Þ\¬••b @pÍÆÞæ4S.ÃPsë–WmÔ€}µ"Æg:VmwÿZî‚P’U.’Õ›d ïiÔP)BLvyµ-ZšTÔp¥XrÁ7¼¹ vpNC> ÃzxÂuáfæÑìSê}æãµlÖ´øhéÆ¯Ô…šÛBJÂèú`䌯EH™În/à *çÁQÒ²IŽOÔ…ÃJ’jHÁIÛ^s#Q­O IO/ér¨x˜Wð?“|Ð|oªÉ,ÙšÈ àuò‘âÁ~/³2\ë6‚ ¿E;±Q‰^EmfAȺúºúpè>¢{óAn£ «û†y1$þ3çùâopâLõv°®!rK\ˆéW$´ n’4¬.YÖ!;ŸáÉV®„‹ LhŸN‡55 ßëqÞšIÕóiCTøl‚ï]L«O.ãáç©Ámúƒ%…ö½ˆ*±y<<š—ÚêöŽ^^»×”ky† 7Ñšúj¥¹À& ªÁ.¥ªæ©&&=½{¼l0zYvs‚†µ-SîÈ(¡Ušu¼UFxDý›@K´Ž3±”»ó ³èr"u«»©ƒ±«&\On˜ç9À'“ã¯¤Ž‹ýA·/PLŒü'Ï€­’a«Ížè^k– ˜%×µ¶ï~ÿ®´1þ:—Pg?—à xõ×üY39F^ªJWÝß}™Øs%Åôï4A!“°83ÄW ·¾të(•#ºã„ „!m|,RõVÃoÇCU¯ð3/lsÄ޳Ǻjý;jü;ÁÔô8 íOXši<äüÔ,âðÔ¶yŽS“P‡9(Îâb.º¤•ç­ÔÿèêÄýà‹¥—~ÌG›ÓõÑ0–Kµ¯]4ÌöC3ÁjE¯ÖT§8ÄDZ<Ë'nk-„sŒ^E8w¦/× ¿³ãÄa „V}ÉõxYgydî¬Ö뢖EE¿r´Þo£B½b„:ukÃ@ثƓ/_sA¬—|‰$ÝýS8Á;tC õfÆpø#íŸ\žæˣѮ.EB<9P¼~]|*¦EûÓ¢ Ç<¬>ËIe¨íè3Ã1ö9'MGià¿Â­ÒÏØ}Œéy5ô(»¶åƒÑ“׶„KÖ‡À@!0Æõ»Áy}Å…ì$˜GBéa9rþ%ž«ÞNOÚo¿o `ùá˜kÛ>˜^šçÂ&zœ„3;PœB²°®æž2¥_ +LŠ îô°Æ:w‡‘ß~›S²k«¶,É>«IÄØL0_"&Q¸a3® ±ïõ,u«V U1ófL¥žË¡X:ÂÖG6Èl$z àõ*¦æßXŒ'Ù¼ÈÖ“»¹yÕDLLˆª)¶Ý¿ë™›¬ã®J~ÿ ã€VÿÞ:ÌüJÐW`”E¡Iºr8é0oòy÷¬ÒbC£k!8ùtšï&¯¿üÜS¹%@¯`Ī\íöζ/ˆ+ý‚¯&ó9Íd“žÌâc¨*:âÍoÖ䄚G‹‚«?P=r"Y'«·¥%a­+:cÑ«B „¬ŒÒ¡:Ã=SªAݸ¶¾„!’—[)1-Ýk«ë§Î‚St5k&a*ŽåŒ#…õ3…M—¶õÀFS¾­'‹'¾„˜mg¶çÚ=º V™t¹ã§hýûÁìXzcI%L:qæ--Ý{¬UÌöwp‚ç!aêóã2—ó?¶x:ÒiZ­'›á G!CO|„>òÜ]Þ};sq€ÊŽó ¦—fÚ¼ñ‚ϱ‡ÿ*¯{ý•…Ö l­jÞ’|îR|”"Z­›}šeh6Û_ç€Ô èC#‡ÿƒ†Gå7Zvöóÿ‘]º Që£ÞæzÝìªvׇ»ÈÿéÏDnìuVËVVZVŸ ]QS—/Ô µ¤Ä0°ªAs†—Md¥ãÁªÕyT1ðDÈG3ú› ­nåïVÛ‚ª3›5(ñAÔη:…8£’äÑf™È°…_«ì§$i¾fJ S»ÿè_¼YTz¹Èô›k~w5þÃ’`P‚!½>êçé5UÅ mZMæÆ‘‡“8Ø#†¸4æ©zê]BN"š ÏÚ³[¥Õä°üí,¿°ðäD<\WÛ‡©a©«nપÖJVÞÖD&ƒåB‚šÑÖ²;>Õ(À¦‰]ë6ˆ8SÑ«‚^Ù!¾ÒY&CÓ¾ìͱNJ^EÃ4†ålÜö‹Áš×”Mb…‰rñÝOúg'а¢q«Å³…š„ëòM¸³Ã\UÏúËúgI5³(•‘Võ‡å—ŠF=Þ¨ßåoœ$èfZ8–èek)r÷ìÆm!-êÔÍŠð>HpK(YÜvІ•Õï–a5ãWÓÕãú…åú"¶G|ÞäŸD fÚ³oöl×áRúˈ­†%H{;8.ӸȴP0SH97ÄD:ýbE T¨£i+”Ä?<—]ŽQ•- ÇÞÄ'*œ÷nì(¾Êô:ïz“gäéÍvþݹ0øÐèëš+}üŒÁ2EœÅ¹‘-Ò'µ[oÛÎù@Uôn’+üqHàúµýTOQàÄg6c™ú=âÆŒ$lFE™‹Þœ _R”“^ó›zQ©æÀd$Ò¹ÛÖ$•4‡’†*ÇB*¶ zª$òò“@7yàW¼¶b´Ö‘p è'Ž\ rI(-šC¯XJ'N”U9)†Õ«Ðe0A—1Hm×ÛV#‰E›,˜Ÿ`ìåEÏÁF0LR(ÔžÃC‰Ö½ÓÅ{èI¯¢®xÑŽRc"Ð"¹gGgùÖ÷úT8Ÿ<àÅÓÀ%ƒ£÷’•J¥©unp™ÆM„“”Q u+E…m’€Ù¬ÊÓÿàY¾ŽøzÂVv/ Ê;@¯Êóå‘P¿qV"&´¦¯«_Ç+VTÓQú%óï1ŸóUaÕdäêY;…¤V«¼®éWý_ëE «ƒ}E•4vôÊŠ„Ö«g÷dr°ž]õMwÆHÇÒ“¸Ñç[Wá²Y)V–#¾d/”Ô\ðÍ âÕz‚+àèuJóe*Úuù~ý$‰7‘È$îç‘‘.gÍ,Wqm_š¹¤ÄC p0¬1QEò{$sí Yb§+Møºr!ª’ž\ÉrŠÎYœIç…p¨Tìk=¨8€ýñ𤓃xxš“I]¤!jø019UC™Lx²6Û²ë$ësÏîâP~ÊqT)P‰ºB«7È£v棴ó(”©d½¡ã IçóØ˜Ê .|Ô¥þ^ºoå)ß½8cð¡ÿ„.„À„C¼ç_Èþý—ˆUä0¼»¬N6yw'š?Sº;"l’ƒÈl °«÷ôú ºÒ-¦=}Ù5‰ÝÆ £z‹RÉr‰ÓWéã#‘•õ†áÅ¡`î((÷åiØ9 jd*úFHqBõÿ­1ç|(Ò¦kH™¬9cXQí%aÖ ˜n#V[ßÙ•ÄZ”ÝÝh;ô¯È$Ázg’~懸Õ#ŸŠ±W]$Ï\éÑÐû}²™–`ƒàYÎñÁßó`z÷°Åq7.¹ »˜(z®aŸOܸ-¦SÁœ#6;³«sBJ>“/ãñ’ç©8»¤ºJ¯¹eŸ«ÕÖƒü 8å\mC¿Ú&šÀ´M§ÿƒ¹òÇ[ÃöEìF´ŽYÜ©_­y Wív1ä&NðkuRö†‘Í´sÞ㱜>°–¾‚— 5õJ<˜¯^@W<ÁC mË:ØæaÄ6EöõØL" ÛG-‚ïÉ|ĹàãëU½ÈË.ì]F@H¿˜_N´³€‹q"m]”R$VÞ0 ‹ù´i À’ÆJÈé-Ø•ú‰P‘œq4N„üµÌ•}÷¼ë&Móž9&âwy"!ÑhŒ“h¨/rûërgË´½;H IxÈÁÿåùSÏâ%GÐÌ… "Þ ³Û¤‘gjÚѳp€(!ªxNõ1|qpQÍ„ñì°¶y@ÿÛä9³™ÄÎ×G‘Мqš[¾}•q†¹—³ïßtÉâ™üù–Ôø¢Â3ñ^ýÓ59ès¯Ü=‘ÿ/ª‰¤G&Ѓ©é™­-‡óê9.z'Æ:JÅ:¹ÌÜ"Þ˜ŽŒq²îí‘tQÙÜÿàgÚÅ B †eŸý78/+R–‹Ñ׺H0ã„Ò²L—Æ/sc¿›¶qíWÊsNÉ(íÀ»cû5teMPœyâ #š@rlf½ $ÀØ+#R{—€~·Âóßã L=ù«(ÆŸmTœXtsó!_®ÆàB…¹QÎI:MÞ¾f¯ã½*3¬ÄÙ?Ôaãô‹JWXèŸÑ«wܽïÊ>’o?|'éÖ\ëŸÛüonŠj[dæ“,óBu¶CUx0¶š0AD¯Ž`VKEšŠö‰·`=C©$¤×$ÃᢞI ˜Ö¡ŸàÌ·S„^‡ŒvGç>KºëæâgÿXÎÙJSGJùSÚÖìiZ¼qW÷D+¼FâÛ‹ bdØ2x‹s<˜’¦‡ë}Å&8éæRâîÝÇ.eü%T0¤Úɬ6ßÖy›šQMÙ¹ë$ˆ«-ü¼oZ'ÃtiR<Ã"ÛB-UÉñ…Ö¹VÁr†)žÌ1ðw¶ÿÓS¸D™€.în‚‰Ù /¼0äÍîMœKR)ññ rF¿ÌØ0²›oëU?¬®hrâþ¿6–w/ç]Œ<¢a|“ºîa!þ+¨äÒÚv§ðöuë‚_YçÁjÀ=3Ø+mõ—RF÷t…ZÖ¥À sË!ùvAGä©nY ¥,.?[Ë…°[0@ÓÄŠ2Q›‹FV &Ž­‰ë–´Õßâ÷ü­W†YOØ;ÏîÂXø \±ð8*ц2·¿ª¡®‚[?¾7)±œ.ܹ‰˜ÜhñVŒÄ/¾Ž^I ÛÕBü'‹ ©öSðå­¬¯…Q«O†¥zIê1¥€Up¡¹ý¦wÖ•¾û?ó2~Ûzip|â^ŠT!é̘ Ý©ß"â‘¢@jŽï«f?Ê{9Sµ87üŠàzg¼rly‡)À¢ÏÓt¿"Rw…†EF®á8¢wÙ¢WöCÞGMþIL´™½¤û¢lï¸%wËsçb|9-‰G` þëp¡Œ*gŸ`VmÏT~, G©·Tæ’Ú*LŠ­_ÚûoSÓYç^ÇÒÈÚC–µ¸©AÆ’°´xh0Ê’·'&†K¬ˆhãÔ]ø”u^ZLêZƸ°Nž —l¢öX~ jðnˆáC<+Á¶†€7 áea1©…=àt,@ ÇÈŽÐ+Þ+AW<¼ XŠÎ–XçD2„q¾âÙ6Ç®æýUÐJܱ8Jw"(gK²{WEDÒψía.Ê´9QÂr3äzòÆæ7XT 㵎֗…[÷g÷ý"¤Ë³¹®É `l¶[» ߉ۇ‡e¡ûˆ.ÈͽòÇû-· Çù_N53dŠËzÑýÆ 0ê2ê·NÃFè¼VjºuZU›’ɋͮޑzýA£;·’vå VâÓŠ3çeôd†ýå:(J‡ òi"ÉL…¾›–8 W5É×&˜ ø»L­M¨Q«¸@®É‡öQZrAÜ(ý¥4ëJwáQ ÏEÇ?A¬ppaó¾+‚{¡ìÔ»;òåB'gp«‡j²ð\â•„úVšò"™8Ί_D#ÊÆÐQ.â°ò(“.'RÔì„{%z‰›O“ S#L!룜|Z_¾ð pÅóëLã7רòu—ꉱÜItOiõ²è4ÆÖÛtIS*GšõÃ(íöax%sÆQçϳ WNæ¸ÜFxJ’«Ôýt¿èãë*]®T.v©óöD‡'²¦ üżØBFðøÌ¸f¿5.äœ_öÑžâ/,rû…BwTñ±œ,¢m| ‰Z !ý‹YfßU„Z óÝ#¼SX Û“6)Bñäæm?¾¯õ„ð.‰ºsT™°ü[óùÏÕÓøèº`F™.\„ÿïyŠoG-¼ížZSBÎ*zü,þFBò>gæÑ2;´†¦h‹ /œ™ÀY™ÆC¦ñ½ê$ÎÇÚ×A‹×ƒ>ë.[š2?;•g˜)Œ1È;¯ ÿàj°žj‚_uTWoR¾„ÿEënå2®yÐâ™`Í™@©Nïü³ÅÕ•ÁéBèé¼.ùAœAW|¾l#Õz££¼œ‡E™¶(B"-Ã’X «•Ø\µÞÐÄ¥u×Ç[üÌNRˆÐx¥I€¾Ë@ðºÚš®úyÒt 7é{u‰@J]æ1í¥a@Z¹!q…€N"è©òýŸ§-âh œFq°sñ<è1XÎÜ–í÷]{«ÛNxÈæÒÉqŽ[CWeºP6C²½’Èd¥ÀÝ ôjÛ0?ßòÛ:¤Ñçdo 9¥+4¹Ëò<8©½²º •³BÞCï¿lµ^Ä·9×Ð+÷cÐËR¢šûÛ6513 ÙêíÄªæ €oÎYFñkaœ$4Mïé$ëãux‚Ûý³Ÿ­ég>á–|¤d$NZ…n»²ñ%lO22é‚LÄ¥Ê)$ûŒb÷Ä´èE‡/x%áå@8r§Â ”¡ÊáŒþ©úüFlž‹ÎÍøôAbMÔÇé4߀¬Ò‡Eœ¥¸pOQ¯KIFM_ÿQÊm |u°/>9å%(‚,×gÇüÔLßëZmÓçáysN2œ×†xâêü¼+]›Çq‚“÷ãû£|Pâ!J¶«û›ÍÎÎ$Ý.—‰! ùœ7û×Ä©Þí#\z[šêÆÐšð<À6º¥Ñô)Õ¶Ê/?kz΂ÔÎsçc´B[Óª´µ04dYr6²°>’y85ç^1tÁ€øvxZªäxÖÉÙ]Å+Ô7öµÈž›zmëbÑ2X§Ñ¡@™¶Úëažc졹ák„5­Ø°9 ZQ#'ªÊW5ÅaÁ‚õíhÙ¥=ˆfÏtk ׋"Г£®,w†¬zFêbAÊ]HÛè–ñäÆÏ ·öb¨|¡+ƒÿðåÒú»Øž®:Aú·X­ÂËì Pá'8ëhf5ÙZ;äåñGÙçwC©{Œ¿ÁÐá‘¡kuQFC1vclH {]]!ž®¬CñcIžŸñ.7çÆIÍœÕíÖ;¼È×OÔÝœªW4¨†Wº¾¬TËÊ?±̓{i7þÏPÿ•¥ÝW“ìÕ·’GºÌÂUàåo…ž$¡/\e—/YZñù‚ë¦ü* ¼ÌkP^‡–¹uÜ·x+æ0ƒÃòÛnP°‘Ä‘ÚãB×fwçÆ¢ÁfMÊàdÎ Q Èƒ™¨us½F"ÁÖ¯é™ …`ºæñ@ fó¤­¶â§!Ë3EV~œ™®»ÅEƒ÷ÑëQ°áŠD~úì„0Ã9´©CGÿ(°`fn×FËú·ÁæåµylUsô‘wÄ1VP‹¸LØ6ë†dœ„nñ>M ,íÅIÁrYƒE4 PÌQ‚Ó]«|äŠn¹N.€Èbet´û÷$·d)×­{ }­>6†-y”¤ŸªG‹æ"r 7Ù:¥ IBv3§àCq—*¥AMÄÒˆÎøêìaëu±žÞ6YÒ·Ÿ&©sž>hØDtPž&õä°Dúá‰h $M• ^þ)Ø>…€èE[þXœlWÛ2`÷—à¡ô÷T“‚ðóŸOÇJgõ,,aPX„ÖQœeoI |@O’ÿÅ%Âîb) áéåÍ1M ièæ½ýMœ¼ŠA™‘Ÿ(V5>]ßÏ9äðFØ1˜ ’½*(([`Õ¥0°Yõ•fÈ-ž7_Í^e¶FYÙpšŒG(’"à§—K«3p=Ü=tÐT[îÔÌT(ÏcêIxTV}…bWïº$°võ]l…Ûû©qX×À1¥éÖ¯ê g¨A¹´÷- ¸Z«½Œ4pÝ ü1¸÷Ômo¢ÒB% jávtÒ*ÉA*.D"ê6P|àÈPl&="JkE:|f`¥pµÓ4ØñÆU7ׄ¯ãÆÏà…ŽÆ e¤¼Ç,ÎÂRf23â*uõ”aYM¤Ï:¬š{&±q›æ°<Ž&ɤ„5í¿’øšªÏ‚|*î¯\eø Ùw².(E:öx)X°è¿Ág ‡>Z¦m‡V>òß’c#³#ÿÙ«¢ÊH¤Ê)€ú5À® Z¤GùE q S–„ïÎw_Ë)­Ê§÷Ž+a‚wÖ¾0°«hcáÆ=#«*ÐÃòÀ2×§:Z2 £ðZÂN( ztèlÆüÛÚ­NKkÊvl#—]…ˆgÐ*l\3d¢Ôš5òþTaÁv\zÂ7±N@I¤Ö{´ Õªö£Õ £±aN³‚“O }X 1¼óš ƒ ³ö*&ÃéC†µõQZ ‹œÐ4Á(Eñª¼¬Œ‘z‡ +£ø ¢ƒ™´†%„I“·«ÊZ‡×Öú{ òüg –kíê§l«ÄRª³5™œ>Žˆ'½çÇ+†Vݘá¿6®§dC J1r,@%“uÒ’ÐÅtuàÒñS -ý%ά&Y°5Lå…\ o ÀQó}ʦHSø"Äui\/¹0÷gíP¼CãÂGkŽì0mS9,L­,¯æ-âÌ ŠÐjœ­ºbÈ’(ò¨-ëDç--Bûl]nq2À«£w ŸkÃ. ¼sƒýÓ‡õÈÆu eÄß _CµÜ¸5„¾³¶X“w†øµÜãyÒ‰’ÝìW丱Tx{ëþ_X´”µN ¾‰9.±iŽX÷ÿ4ñ|µÔ‘nì ô^SR/ŽZzíöÚô®t«£Š ›:«ë·Ò]h=]Tâ§ø+HTcu¯>ãÍ1`Q…ù²ú}MŠHå4ÔÄ Ðç… ¢•RgóõGhÌÍÔìí_4I@§|ôVµ¶¿RN_ˆ¹Lç Y–åÏ× öªLõ b´â<Ì‹mÛÜV*ÒõÕ¡;;×ÚqXC‡£Y¼¸öFL‹½¬ýS¯ñ)7>:U(‘ï|ŒÖáà$Õc÷!ùÅ̓S‚Ë*Ðx Ñ+ÀŸ×?½Í­î[¶²á à]Ù„K dêiUä*§<äWw"Üžµa`HZ¤Lšbnª–Èô¹rŸK ±°:X ­÷ MDQ-€»o²V7‹ðdà#öª#=ÉöÙá¼PœTãÁ1^˜cBûÚzí ƒÛmHtµ¢[ýö)^‰Ó¬ëòÖZi ”êüÇé, ¢ë(>ù”b­zØñû=š ø\Y«C7šåð¹Â$Qe&k×[M½©áÛH#rT†¼2çÚ5ú³P¡Ì0ƒœ)—ÛÂÈÀ¢EìO†Gwièíè•Õ]ƒ1ŒõG7z,Jã¥Ë÷ቡ¿üäP©Co°Q1YÃ¥?6 Ì÷: µ\X›/ñ_ŽÕ1Á›„ ²âüó÷öMnÃA?¯ ¼ÏL1Tq¦y‘ÿ̰f®¬×ûy-Än·Ãb³é×®£®½âå5MOÖJÓ[°E¯xÙþ´:å±y¢&¤[z$œÇ…Ö!ð‹·÷¿Ô‡k!ìø^áwósò£‘%XžB„•^˜ð…ÉÓfH먧¡ØlÅSHŠ©š^ž•lB>ƒP2¹8Ô)«-â~†{ï1—†øêq>œšhy¬šÚ BÀ5ÄÂEc’ަ™Z­wbØÜódšàÃÓEæÅ©ÌÏ·Ÿá^#|‚Na£æåù›&JÌ%k²f2.ìÕfM·m´çÙH:´ªj)\’›5µ7cþ|éûÉ‘™,6N RË$z:MI±uR®úÕ±PVq0„/ ×9HE®¿Ó½HyXµ¬Ž?›yº¦›‡Øû?kW€ 7{M}>Ì*c(;(V_õï—ê·¨tPEÙÞ2=Þ!£ÝX·uò#ˆf™©Ë9®?ï³90k¹xY4©æ²»Òv'ìjÖŸ ²]Pˆv.x1Ü[? $80ßšäÑ. šVݳ•Ÿü§ ¤IzÂÀÐA^ªÎº[BÒgÌÊ$­]‰Ú¾>©fKlé΋kK»š<”I¸Œ•@Uý# h¡XÄÞ*<›ô·NöðƶBC5w¯¥,hÔ2_Ƚ±,]+eÍáÿâˆz‹'PöŠ#D´w7)QÒ)ÿNk{dþÓÞ¿ÌÏä³Z2_%»•VQ{}Í$,·¸µNMÚ¨;;ÉvŒü ¹iËÔŠPbT_0¬²ÞQm…l÷®Ž¬ì”Mõ…!Ìlö0BBjèžAhOl˜Æôgp1žp*‘¶¼³êì|`-ç>%áH<4¥X¥¯îõ¶1eEÆg‹{[)¥lG¨Lév¥‚1œ™ÂùÆþÙM'h~½gRıÛy™ Œš3õ.P”ëv+aeÓ1–;ê¿nŠÃ*íB#]ډĻ0D‰ÊS¿öqÿÂìÓIeՉЬ x\¾d°W0Úú¼&Ü®ÓÇ#//'ÌqÇHÀ ¤Ó‰aÁʱ8æÖbg4Psv5¸Z²Ï%è~oûÏ=íà'zX"Î.ZÁÎHð`—N*Mâ™ãÂj)'÷î°xî¼ ²5RàgJ§íBi[ùxäs¶žúDw‹-ò¾NR-‹ŽM›–³ .¯ýagHãªØãÆ”ÁhòæéàMäTA7Ïöû£Äû¤«. [@MO¥`Ë*ðÌ™%S0 P^éGÁ<&†ž5ùÄ ¹“ô%œê9}+¢÷cË͈¼NÙ=¬TYJyz‹“ÛW •‹VO‹Ý–ƒPNW½À¶ÊÞ.ÕB¢šR°›`³,^j–´ÂŒ§¨¢8ûôI0 G»yå>Kw4 %D,^ñµ¼Úýe7*].VGß²W“ÔJEeôEÒ¦V ‹Dp,á;Ÿsàüþa, $–±£¶8W·,ߣ½Ka­Ä®ÒÊ ØžJ «YÑY;«ÁbµbÅÚð™¾*%ø¤okíE­…Ÿßå6‡Hn¬~çah<¥2 sÃë¶î¥Vë“áxž[[°7ÜXÀ!R[|½j Döâ~9{‚:àÈAŠnd¾Ô¿VÒ¦9èž ãÊÚÒKýGf)žn„[GGs eØŒBF3—Î"­· ×h¬@l+¦ÎðVX윮?¡|,\‡ZÿeÕôÓØ&ó‡m^Av(ƒ¥/ãø!¬š~öCþ˜¿:Ê™œx LÏò«n„üñ²Ã,Ü*(šêò±ÐÊQiêñR„ô©¨=¬R«¶Ç*§<^=|cÁR­µýGŽ]ŠåœÓ6ü M3}SfدûšbÐ|¤F„?Ììê¿À^1¡)£BW]5†Rgb‰Ή573Hæ¦r°¦ï3{Kþ3ñÏ«\vk…MÏ8´)Pm’û5¡7Ó\C ^n¼ùu[S´üÅûNƒ¤§rÕwÃÍSïXvA1Û”7Ù§–ï4BÚ×{øpµÂÁAÒÙçãî³eX}ò'†hu@“éŠ)‡#E¦‹ƒÑsS²%àøBÀ£ÄÓ]±Cí>Œ’@B«8¤&t _IF¥ªì.·YÁRÈn|ï Æ 0µ”?‡ïò¦:ÐB@V5ê«s‡äNc|÷ P;ÞëØé´·(:ΆVQí„íiì[槃Žb! ‰«GcyÃŒ÷8¬ Jk—S”¨LCî UóØ&ÃñDý$g„«9¤ïë> mö7]‡}qÒÅP$Y§d¯PNæs‚8+ s3— H¹¬ÓÓŠÉQǰOó)°2Tp§E]µ?‡ìy5Ú ­dC1 pFúªX•ªcö*,wŒÍ¨®nBÚ2g@hîûS½öš¨Qå.¬oMÒÝg´)tjÞ“% üV–ºï1Ðܺ«WQÕNUòÃ^±kh˯dó K©µšTWQÒW4Åà•»Â~påùp)ñåiMáŠqìÏBÌYî6dPXÝk3”²ÃB§õó9®ª3°´F„©Xv~çÏ–^¾‡’ˆ‡Û`Cü¡‹“ÕF[ z“ Ö¡S•³Íœ+Òï{˜ªÍÉ;5%žË{|eùzí•Qò?*½Š©+L/!·_{íHá4&l½­‰…QŠå'«£ ÿl·ùoÚ”ÙBIÚU'ž6Bd«yÛ «ôj•°•½‘¶û¡úßîpÒ™Ãݾö¡¹u¹jk¤ÝŒA¥y«7DÔj óŸ1R”üý×D„sC¬uƒ-À‚/IàNˆvÁ…rÓíÓ<ÿîâU õÙLÜÐ퓤pôÚ1sa²½ßteÌvú˜«ÃòIþIÅ^µü65¶Ñ«Ž½ r ¯gv¨lƒêIM™Ìî÷@¯ýÆÂÉÑYÕ¿ Ý4u×H[åÖƒU‡u|m¯Cú÷²î@÷‘¦ ëXO7ƒÀi¬û šõ»ö:å G§“ÂßwVÎ%ý³‘€–ë4ZÅæ”ùÛ) mdö €µ`£¿hà±¢û k‚‰E^˜*«úÊõޑš¢ˆn¯ÂD›²Á‚4ñ˜Ùœ;­é[FÛÄP”&}Y•OòÇÊXò¥ÇhbÇr½Éƒ/³bX7¿(ÿäùÑ3ËÊkæÎ‰Þ'¶¾ÌÅÇ{Ïp†µ˜ø[b”bõÚ‹•¼CIO–<‘¶#œ}öÁTÎi :ŠÕIŽLV×Ö‰xxžs$ «6µ+š¦˜X¡#bç¯Íن͗œdÅhd5 (¯¹‚Ã)v²ùå¨è¡î<1…Yœb?ùsÄC'±8•0§ &O è^’̓t$Xžâ/¯~ÄjëýÕª«±ŸOǨ©NÆ%³Ð­ Õ#° ;(žÙjõ*ï$€Šfi–eS*Âeäëqg¹ò! Ø ºÿ?UfZ ²oxýBÍJaž;q8¥õÆ@Ž'&-Ò,uU ¶s0 ùÁ–ª»¶;bð’ ”Vj°UI0‚Ü~Aýª# á†elÅ0ûJ¶6*&=à·k¸ì[›bÌËÛæ9Ê’ëµF»½Íð i™hWÈ´Ûj%]oi4³ýêçôË´&6Ò8 q§9®§žUO#JP^ ¨“Z\T}¤«û?~…a`1¶ÄdïŒÂÃý“Xp´UÖ¶…P4løÙ‘cc-È` RŠ5ý­èOüŸ…Røç3.6°Òå°ôB.{߆n²Í¨ 7côŠ•Êo©ùöSÓ¼÷”Ufé´8ÙR ŸGËgbO=PŽr¥±ý… Ëíe¦÷“å>äa¸ÃLCèÜa/”`!TñϬ­yêÖ3¬Üæ‡.Ðc„R÷νfì+2Yû%P×âð¤MÁ5—Â2…èyM¥Ÿe¦zq­••Ê<ºÜl•]ÓñA Aç]aêãñOºÊ*§øE9þ×9Þ.ªË§t.„ÁpIbLdPã±âë™C†÷D 3{t:cTSŒq°¬¬«EE³œ§8Bý'uÕï…VêaäíÊÂáPת½L0ÿó¡›Oµj4ÀJ!má9^Á-î­øl®BJa¹#vVË㥱ÇAÚLpÊ‹pQ^>QwÎ5C`C‘– °šv6†´âîò/Õï’Ï·]I¯EtU½ÆM(Ã̦ͮP>¹÷š¡uQ…#ësù…SŠ\8ÍËE8[‰¹’fnÓB0LPP ±õÏ` cLn‘|špE)5?¼9®Û7þx6Þ[áÁ6èçÙÈ\#—VyT^ŠWÉÒ…ý?‰ŠýI^á=-›]imjXl2ꢚõT°¨BS¤*Ýêÿyî¥Eû­šU‡…êù¬ÉZø"=!t¸å¬¼bauâó?ŸÿÜQ­ET;îjî@Ym»Àyw$:½Ë½~ª•qùÜ1P%2"D*\Å0À æ–˜KºÕâT—ôÈ­¤*–ç®µŽ“öj„åMÑ©Hc‰›igrÇ1£[Ï`ȵP¬–¦(;;‚kâYyÈôTbô“Ô¶ejW)PÝn\9rlSÉ96óKÐJ7^‡Wù~(ÜŽ¹à<á!qŸ¡«6‡ã."åÌô!²Õ‰÷Š°à—†Ë'ÂE>m§‰Y­YçК0WéödöfZ ›ÚÜ]wÚ§ž»û ö\‹¸gtµ½|v?ø§¦¶8åII#1dýŽŸSê’.Ule¨¨:ÂíÞÀꎬ“¼5Oá0ŠÐhiD¥%ËP’¦ƒý[¥¬ ð±I´_©m! gÿqÕ•äÜéwŠG›½©éö!® ˆFqχ#«Î,« ÔvÿÄɵ앓®ßšGÝŠ4ô,•;²i<{%v/„¢á¹ ¥-oi@ÇeMBv¾Ou%™eXд3²¨{Y8~¶X–›5aÍk{PÍݤó0ÿp˜oAž¦‚- G²ç©Ãüê“__Ò^xt¦À8™}pa°Â¦Aa¯d‘¨FbÞj¡,‘ªÝ6Šb3­]tûd­=Ÿ‰¾Q ÉrP‘ t £5ÚxJlJó»^„¥œÛ[ùÄáo<&6‡¥*¾;Õl¤ÏgO5¾ñìz}Çoô¨–3i&Zñr¸¡)öiÉcEõ,Â|:ðÀâ(72g*¦9kÒ¢€rFŽ·¤ÃGj9QÞí0±åFµU·Ùhº“‘³WÓÖF2ÿÜ4 sÈP™f5Ûüùú+¬‘Ò|ÍŽ:Aôüå.û„xq…uÙ%-oý„—>Õ6©íu"$僤™É¸m-É^5¼)fQ}8"d`ÒÆƒ›ZÂâÓ¶«ü ã$Ó››”bkNà2Xë¯L·f0“÷ì \\ûÖðÎFå-,7רä#æ.æÂ®LüaIl–jÿïjòMÐ;“¸t Ž›ªZÜ  S)åܰ`q¤6¥{Ì.œP ­– C/’Ž K$0_¤FmêѰTx5õÊ0B œ”<¬Ù8p{IHw‘½Af1cØQhn¡ÉÔ”~PÝœ:¬*@‚9 tQ¦4ž2qâlP«ŒÄìžÂbñ Ê,‚8ËyIæŸ 0¼€¶0ž¬T*‰üA4œ/*¥åÒ»Œ·nr6aïVlÀ4Y;¡?#ö Ö; Éç_¹öÎ ¦†oåL‰ .ö]¼Ê¡˜¥3 ZÁµùª=hêñ†$¼PJ­Å±?>¯â¤ÄH—$eWQ.ïÎÙu®™Õþ¤©ÃàLIÖî‰ý$^³¡ ³F2~¹vx¼(”2“Ú.Ýøf7 ê¿G,œWc5úz‡Ëtzø“‚C¿d|`8µÁ2„¥R,öXûâ/ßù$È\=9áy–þ.¦¾\µ¡Œ)§‰wb&?1Þ¶É‹Üf¨«2%]–Å™çá¸å´Àø éïÚ ó5äî(/Fœ_håtI+#êʈ{æ @ÆÚÑ©l°Mÿ51D ¾«þ#moDúœ×ßÌüή)ñÅpÄ[¯Óù¡Ä‹}j­?.ë×"àÍÓ§GÀuHTFÿº3eԊ玲¡gbXýGá»,%Œ¥Ð< xMÂØ}c«²S1;ÛÌÑ‹Ûs©èœéÖF‰hÚ×o´šªXº£Ð\-[rîäÒešÒbƒ7!Õ¬ ¡Û•Ç. ·‹BAˆt/]㦑̌ª‘À0ŽZý†½šrɈ ¯&Ø+/vö"Lçža‹ÙÞêì÷«hå¥äR+§çÙ¯M)ÇîûøèE¼~Ä"$Ø—[4ï‹Gó`iWð³y°Ú[µZÜ}öêXì‡^/ 4켫åGaØhb‰Eß©ìŽ6x±ëÍo©‹ؾxÝÇbÑO^ËfãÒ§véÍ 0ÚÖò>êAà°ÊÏ£±º¹³ù>ÍÄvN)ڈDŽ‚øì˜b`(ÜÓéÌÊpXð;›BÞ…æ·l#âyyû«áçÌÁ{7ïZÒZ–ú;Go>ö(*Ûš9ùh¥áF­ůëÌÖ+p©;'s5ÝãæÁ:úIéÕ¯øOP©¤†±Ž'T`[(v¾ ¥-.¿åïM~µŒ¤ž 2«Ëg˜i0–â7ÜÛbøëUY¥ì×±{M) X=zý©:8)zÅsOï9‹BS¢Ö‚­é"‘K…’ªÊÕ9Ï]zÕõ'äÃlÛNi½¹\>çô_`g«ÉI´…²têó!ºá£Ï&?¥¾=³9°{óìaÙMÿ³´–ü;ÖqÞ ÓߪT+ùF6+é’¹%hG„µå&«û®÷™¡$–iË«ý£J±·¸*6` æ@@s˜\Ìð·Íêï2A½CFõæ3eüÐÈ¥ûìÕ®HbZek™ÎAÙñ)l{öJ«°kƒ2˽V—ºZf[äÉÙ={¨°_ˆMp\c`ÃVOËaÒ/öʺ©6°¨æA“N’ßB¦F¯%Šñ vB¸]Uõ:l ½jÇã¶}‰lxÝcJyέC²)V]ïÿRY6Pmxßh§kß ´ÆˆíJ#L€lœy‘Ã’opXŠÕuvÝë8\oê^úÊ Ã/a-RI¤¹ôÇ;7JhÏ¥ý&^rO[ºÇó!ÅòÐPääCò-éÔm=r_IyxïP¨´3çÄUˆÄôõ%â‘BÖG-ÛêŒè¨ÎìÁn‰g˜©tË/«5q t^äô€ÔÍíÁƒyg×[ñvýÔhú®*Bôöc[ºòœ–j÷¬bM\;í×ðÐ=e¤)ž©-˜ìÉ)-«<*£Ún0P[¯MFrø^H=d¯–kÙЃË̀˶°Û5넪¨  Þè’vuMùU[ÅèÒy=DVŽ´¨öæA²Òm `¿/ÝëÁŠïáÃåG«ý©˜Üž–ƒ¹ÿ)ÁöVˆAQ”¿ô¨³ñ) —~‘RTÃYlE-t¾´PÁƒU¬¢6Æx¬†YzPeZü^%)JŽI™QMb¡é˜fj†à.?5X=KkÏz³*éË{ê[¶§ßû™µÜa-I)¡rya÷ÖpL?K]ŹÃÍAҭ覨èìkò¬º_›=øIív=_ª fSÕG²·°0IK9ðoù¡?¼ùûyúÐ#wh¡Š oã¶×ɯª0Šæ:›\Ou̓Ôþ¾»Kuó[]rgp0Ãju\=’OþìèT8S£ƒž+$7h·.8Vtkír<ˆ²$œ<»È>mÑþIxƆNjù«š[¨˜…½ìæØAî­,é>LDËp © 4ëØE×ðH"$×Ä•ÞøÔcf޹¹C˜Ü³5ôÂH:>}ŒoæpÎî8¬¯a™Šx_닽B@]•„yqjÓÌ4вn½Á÷ R˜ô|æ i‡½‚ìßcF7 ŽlÎŒ€Ï^•]öjƒè#>ßΚôU)ã–Fõ÷TˆÍåWJÂùÛ R8BÓª[ÐÑ Þí¦|Wñ MEÓs°œfÕâS†¬ðp£ ÈJë¡|:^®/çqµzâ‰Õ‡j‡„Bí®>~‘ÕO#‹Z34¡zTúl<­E )¶eTÐ\ÞÉ:#`ŸˆÚ°¦À[qhñSÓäâëIg%5Ï6¬ì{›ºB*X­…݃ò$¨=ÛYè;¡¹Äks² "Žð¶6JØ{„Öû}ö ,AÁ˜À½õÖÅȶd<5ð(üéàãýv42ùSŽÊ`9ø »L¿S¿š¥œŠ®o%‹(ëJjç«ëã¡*Þ¯æš 46ðxXOqùøÊY˜Ãï‰<§QUJE•ÉÄe…cgž$­@“ÊQÛ‡‘οְ(OE^ÍvâR9Mh;Pýp?¬‡Y &…ŸÝhS‘eg¥<ñTYaL¸@¹¯Æ:¡! 7À OŠW=¬`k–‹bÓÂ'bŒm7”Âí3Q\wB3Üoí¨k¯ô,MsP€jU~ J"Ñâ-½_(P‚ÚŽˆ Óh»+ÂÒHÂ%ÁÄü*þ’PqGé[b¢ Mæ¾½£¾©‰[ÛÑÔôeAòlâíb’Œ97ý?xqú(b+"Á0"f¯Õz´9v™ŸÈ1{õ°FFŒ-8ý!ªýëc—;:ás_…ýÜfÓ¥äl7Õú-:Qf]"žKàH²Vå™ë©«_T«ócáö‹½ §Ì–I]1÷ê=5t#1>–í"ÑC‰Zö×dΩÇϯ•€\"m•¦ÏT›4Æ¡S±ÂÚNÙ1xûr9UŠUÃóJC¶ Uÿà&–Y½%z¤±zÙ{‡ÃšòuÉ÷NN)Û Ñ2œ)Ì#ñxÅŸz š®Êˆ£Ñ¿;X×SË·ÿÄÓä—VæèâêM-qY.WEÅyiþµZ"FC–ªºö)ý7ž·ü¯îÔ´€¼©M&ú Äþ;Kýh`ÁѸu$ ¸ƒ/*wE²ø“/T0›Æœ¯ª2ÊlkÿW“¿øÒìÍ^§õþ¼þü„%A#Áž[Q.׿SÇØy­þ6S¯~ø}(ÒÌ©ê¡E x+ø é¶q{_Xñ¾]®AS'¨ ½×tüe[r’@ënƒŽÔDëA«Uü=%ø|÷UÃã øµÙ™¯©ñ_GEkaì’UI±ó\f¶L_eèf‹fOœ-Z›é,÷6χw½5,÷)Š¥:Ý )‚×3ø‰âm;f£OאּX?¤DÝTØ,܆/%·f5J ß57Aß*”ÃV)¡67ÔnË·æ¦ô•…•¶¦ö„Á!ÿ¡®>ù¨¨{rUOC^¾É2¶± kQ¥^CÕv½ {ÿÌ~]1μ¡e3 )»r†­ÇbàÁ÷t/ ò´hÐéº(°³¯õÂZ 38jCHÅœKúLq¼>băàö £ åJ~í\a,a-\Û|Ó–=ËùÜeš,Ì{µÝkP­“õdÙ:]¼ö0Æb ¯iÒ¿=¤¿6qòÛhº©9è Såª[ŠU•)Ï_Ùém6‡yìUi+µ y‚£~¼ÛŸSýƒn a¶Zµí>Àd €›3±ØÀì.™Úžó4›nØJùgâ³C.¿9'PZâ âõ˜r’ÅÙIkÈú*”0ä_è—eUÝçNºØV¤P8ëÀ è!Ò¼€ÏÿäËK1º#8T¦™ûõ¾±ŽSí¿°Õ?^&gý} n‚q)ð:jC £H#ªa¥‡p‚èD÷qEϸB'~Î5471ÕmëÝ{®ë L–{ܧˆ^AÊ_Ò Ó¦C°îµKkhã‹"L6›•Wâ´ÙQÃ[m#*Ö”Añâ̾|!ž³÷NpШ ŸA˜;^.­“æ·Ír¹`Ôm…²¦œ‰Rê)<¡öÙÆ4¥¯ú3tµ]lÀksBhlÄ I«¶DhWbe¶j@c*°¸ ¡:”¨·Ó07 È‚išË$Ëv1=fóG‡Ï^³¹çh"ˆ³ˆÜå˜÷â¤NÛj(Õ_|3ó#¼j]'è›§Âïx¯ENúj `[€³ŽÆj{xBnF˜L³1S¼fñ¸y£wy†#ÁùЀÅ7½©tÂÄɤhõoc¬àãä;)CLÑÎõ~qºW,xÞ ÓDÚP’RHk±Z_ÙîšÏåž¡x·µdïÒj5r9¬~xÓœ9ƒz+uÖÖ_ÈŠz‚Ŷ5¤:Qãêå«·Ø­“SWÇð•õƒtm¶®Åf?öž#I‡éZŽÌÅRÅüäÔÀ™¶öˆúq' IlhЫëË¿ÚA¢²‚,(rYÀèߦ­jõM=7®ªÊ$ÚɃIcÕë+½X%”>s4LNÌ… ‰Å Œ2ü§þlNlñXc˜S,7Úc/•o6‰L-ä˜yðk%WÁf#—®ùùÓQ½Â©OX¼òµ‹ºÚfVgŠñ9`¯JÁ†³Ç“#žw»Ç^¥UÛ9ãÄÕ^§‡ÐA÷ÃV¡¢¤“~Â#mvF”_mçvÚ±yö9›¹CPÛr×Ö|EOµŸº¶âj-b‘×W°°|l¾ÉQ”íT»²V4«“ózÍž¢¥vý÷D¨váÉÜ-vwÎv¦H4´t{Ès•VünCЖèE2Is‡sÙËakH¬ÿoÿAˆ¾pã„Ó¨Ÿé#eJmq lÉùš(‘1Ûf÷÷ÇX^Úåû<žÂ°˜©¡Ð­îÑ©M“ù¿bXœ•½ë(< —Ð6ñ@.ÙQì?‹Rð4½\Šá9Ó~×±=fF˜Ztâ˜Ý9Yîˆ\ž€7Ç÷ÔanLÿ´æ¶]!½ÀC–½¥pû®eí[ à†2ò¬Œ4;„Ìüúó‡…|®ê­Q(YdX‹©õ÷ƒë˜1,,{Ý}zºE±Ð1Us&ss×ê_TÚ®=³Í# }W ŠB|-œ OwøªXÝnË ¥D~ÎA„úÁ†&#Ø”WÎŒ Õ1Œd]®Fqu)ÞD‡XZ5o€Ñéeнòʯ0Ÿ„ Ù$XžI9Np祒Ô6¹”š†°Ú²4{Uï‡;]JjØHH—(æ å=ôpÐv·¼†T¿úàTÝfeëO‘:§NOsLÿo]’ÄÄlòGz›j{Õé-Ôr´)²%׬˜ùo)zp­ãÉ"zò¦„ùH«hÍØì’{œìWÔ•„úµoaî#€lZøiKv:ÖÉö^ÜdÌ;(› PÇ» XZ,Ÿ“Cȇ.¬ÚHÏÞ>ÏṡhLF&˜œÁÛáä‹ð`Æï1LHB —Òù¡áR°g¼ÐòE%Ôû½?LͬÆ:MN•³GŠºÝß}OSc{®W[Þ ªUµ:a¶u¨«åÖUîøî€Êfüýþô˜HøÀÀ°j©vq³Ëi5äKã š0Ùæ(“©Av˜Ò” TÛ­a:ð;è²>O^!Åa=‡_FÊ)A¦ dœÄ,wþÃ÷ ˜ öZOCO¿#¦Ì>LæE¬h¬R °¡”º5©ŒQÕªN˜C ÚÌÂÏZO…¬à½-Ò”}†wpYvv©jë ˆàEÀÂ×£Âh$TCò›Æ‚Ï>[Üf¯xcŽ ‡Ý!(†<¾·²~×Óä ©«2ïeðƒ—­½ÛÁÜW ´šFÔZÄ­úNëóŒ^»w ZImsÌžûð|úÚY\’ß_ý´/¿RXe†³¢ø(§ò´Û‰ )çjo…´§e¡áó dõû)‡!,2M¶ˆ$øÏ²Æ+LžýJó"µß’7¦¯« ¶³Z3Q=0¤415K…bPN´àG±”d{]„ýþχSZFžr=b)Î5Âì½›Xò«$œF?/_„\ÝE›Ï˜®âø{ÑB W±YÔÿO•}L ÀŒgôƒñgŠÛ}âe t‰iËþÒ"†–…>±a¯$½EÅšµLÓðüÒ2¹ª;e œjwIü‘ë#Xÿq’’é‹q;9[(ÏvðxgìL¢dw€-be‰L™{ª”زuÂ.–>….€ôRi©iÐOùâ¾­Iuuަòd)V¢Š9iªÒΕGÚÙ‚:¸œ‹ó‚FAÖEÅB-»aµrdÒ0W¦³THž«f’ä£J>´¡¶ÈZEÒ\ùwWZ5 Ü¡íœTm³0(zÔ˜³ä}Ïã¯ù-fØ«Xúª{håF%|fPy‚Ö%É­8s8JMsÏKZ_ö©¶ö±ÄÃÒ\ß}ª=5Îþ€“Ät¿×Á²˜Gõ>å:™=cbH^v¿™åw|7½3q·3'cZpóÑ¡yLªRæÌ'x!ª–ûRj—{›Ò= =Ët‡ú“ 9Yê_Sß>67÷™ã¥m ª.ótsïz²ã\¶ÜÀ ¯6ç#FëßvŽ_h2Ñ#™™h+OÌ!Kt¾bWÕ0ó†…!YÓ’b§P…‡ÞäêO"Žö>›½Råú×·{ŠœÅ‚§£è¸ ûO‰LR7'Õ0h´-TÚ-ÆÁÏñMY@bíŸÍåö¾({3¡ëA׺ƶV¤P’l»èÀ£Ò¨'L©Ê½—~g˜øôwU•øº*ÍSç MÕµM+>ÄÍÌEaÔ-æÕF÷UÿÍäãÅ(Sx…à‡…Îy6Z0 š›ãùþÜyIC󿺣´Ö¢xs,Ä‚ ž ø“C™pÈêÄÚÔÍG§ ëQÂ@æGböªS[Ç¥_ÉÒöVÓ!ChÊIWc Ú2:ÒòGû`šÀ² ð¥Yw|wû$—ÆíôÄêTBœõô'&Y…Õ6B]fI”§½pDªWΆ7%3¼ÕòC6r:öõðDÐ|`h¥÷61BŠ.…ä?6ßžºvßZª‘ð,þçŒpæu£€8<yjn€gê#±‘·ÉYÚ R8åx™Å1炎õƒå#cöýýì§ ‰*ùíGúùŸ†S3Š£™;?äÏkàÀ½Í=(ln#M–½Nðõ½Y^¥;ÇõsÆv0n€ NûAsˆ ¡ÄŽ …©$­**›#wQãâ7^¢ìe—“'OÞK>$«yðº1úÞÛ5ʬ…©æÁGØ«õÒò' Z=¤a¬€BBQûöl=Hè[T¯|[ñ_®(;åL1‹ºb,äÅ#Š R¸øªCæ¯ôö˜)ƒ×Á§âtËmþ×yu+«iKo#¸Ðlñ]—´úGäß<øÏ$Ëêæ·ŒÓçO•ß×üeözÕ^>)x”%­h!üÜ]ÓOüŸuŠºèÃ7:Õºjß ²]{% ÄHÖ“_ë¶Ùl[˜¶Ü‡¥ÿN|KkÎÈÇ6%ý] ¡“&µWiRšã1Áºä4(ó,Ø÷Gm¬›PºvÂ]Áv|ù½ ´›ò–ÒøÊõ1#áRGRÄ'†„r#{/XÀ©‹ôÜÁ»›ÇÒèœ;O¡–OÚi°®°€#Zp©·IË •«±ÕûÔÌÔv®}§m¾¤A§^o ·LGI—ÕôKu§’b¯2@ÿ=‹ò;þ3c-ËÃ.m›ÒL •¡Ê»ò5ÿTä~žöjÜ-.âòÙ!²?Ķ ŸKbíC’E8Û^_rîÄš% rP:zƨ{%5 ô®¬ñ—]Iýã…×oG—¯ÎqïÛéïð›hLøÇw0CŸöá.øÀ~Õ}¼ì £"í“¿ˆÍJ±tÊ$éú|«>ƒ–O*|Øãë­!Š…5nT¼Ì‘-í໾ÌÒR4s¯^)¾®XàMÍ”µž;|=¦ý'õõ¢V#}Uã§ðJp¦td“ „Ø7þkX¸ª×t·WLèùíŠ=³b®jW`ýÖ¿?¦±”ÔGÏŠ}T•ýƒ¥/ç.kÌ(ퟛ>,Õ<̵»r ú¦›ÉÕ…S"ćm: ÿ±}Äc>…ùPÍ 1Ö4½n¥nØJ¢ÓogˆN;kÅ¥vÕþ ­äVdyÚ°(,@«Æ«c³çúX\¾ô5p&>åSÃJ#ÔÊÕ”§¯±Z,Îëg—F3ÍÀÒÇ÷P›³'³ìÇýŽyгëȰ$È >òEþ¿§^Øé;f÷޶{{¹Ã~/‘ÞÄ”„bµ4u…0™´/ï2IÐMhÅ™NU@Úe=ì¼§iWUÛ²W¡+ö]Löë;,¥­Ë…ZRÝ×]æƒ~`!%íª4Ÿ9þ¯:0´šu[Ey%Ün/ò?ÕÆÏ”n€QÂ=/ðòoµ›V`&¶BLøƒ“é¶ÒX°˜&O‹ÎDKj½gÚT´h©+ÐîA†p1âÇ5Ÿåm€½ÚEÈÙ¹RÍ3°‰Þ7D”› ÝÆ[©™Ü'ïb$ü¾Pö{ÀÒØ)k†ÆZVÜ}ªMîgV²ªþÙeC§%J)¥ÖRôz:Å^5?Y¸Wxµá5´Ž©¥‘àŒ@Žè”¿º2wöÜuD`¥ Yù˜ìÍIÅì€ çÔŽ•Ÿ ÎÌk£?b^¿Ö•Å/ê«vöìds S|F¶€ÓÚf­žóÉì+v`Qõ’ØoRº ÿL…”ëôGK/­°PLÖn!ýqx!UŠÝTXœSSÉ¢¤L’o-´ öÊb÷È3H)»ãFúj~81ã~Õ¬>ó›’".á(žñvPØnIxYnOŒ·)5÷ ¨P³Wy¸¥¬3ì~ͰD1Â]—}±ë fÃ錸W‰XNÒȉµ·z] òd¯*«¯Åyª±âÚñµ›©ªÔ[‹$UíuÝý07µDceDj¸ ZÙrTEõí?¬,›QEUÅnßM»zÏ/)q¦¹%ø¥%R@§ÑoHcÅ,’“>×þ1Lxt\º·xÈmo›µ±I†ÂÇ釃ó69lï¸ZÿuZŒí ï «KìOe òe‡ÊŸÂr»ðÜTZx7÷¿ˆŸ*ª_*•¼ïŠÞÕîÄ£hí£ÒÙU»[$Ö‰QJ…"Ë«O\!Ž«šPìÕI~ï¢Ö½ƒ°ãàþq³Ö¯EqŠxJ,ØRŒÞ®lШIÕ ŠðH3hÓt·7µhû؆“N£i÷÷© 7£,ÓÛ.z&–MH3hôéaQÉŒ‚†˜¾ñÔßôrˆJnê¶¿±Dåm@©ŒÖÙúT­§ÄôÁ_î°KxìL/kK&FJ|† ÖüÚþ^áÆÐ©I9Ò)y˜òHà7m¶·öGü·½éí‹y=ˆ†‡6ÿÕlÒ½: Ñs¬^ t˯¬c(“,¸Ãs5^ÿ_OÌ*ô7cESjPõÊÓQh¸Ú¬÷¥þÇb5^9èØ˜[»n(-óë,BkïÍÔnço$°òUΈu¶—j„IبXÛÖBi7&R ?„` ç{á½ Œ˜¬)^ÆlÔÜ™`‚&u™\æÆ•S0Yp.˜7öÆV=T3¦õÈá­òL–(0,B‹Pm Ž™CŸ@ÜQI÷VÉ圗~.Yréá0Sñ!plJÏ åØ0TÕÀ –±l‘ƒÚ?ÿF¥6h´ÍÑUØ×¦·ïÔ݈µ=9Ô·Kía^LVd@gNÀ*äC»´¿Sk˸ÿê½4¦ÞøŠë… Ô½•ËÇ…‡¬£åêc¦Ã kô”–f¯>[•Z·¹Zɶû•™‰QÈE'k¥e\2C5FëÎSàÆggÇôVg·‹Zà Ð\?áÐLöÊÄ‘püKö&¤:k0ýHdËH5Íš¯yr3“å ä…ü£Ç“%ÿByÍA®Þæùe&Ï¿Ÿ¾%,ã' ÑBpÀæ°Ø‰@­Ÿë9ïöêíxˆoÜ¥—˜ñæ³ß&K¼£yŒ~Ã… e^ÛPŽÌIb‘F?ÏæA}÷fó–÷(lÙ«žLÖí2UQ2”í•YgS# âE7vw E„Uõÿ&GXsó!U˧æm¡ªq2W¢¿V¡àn¬=8S›+5 de‡GâƒZc;‡ÃÅD?cL'c6º±ÖÌ¿¯‘žã ;Y|k♇TªÓè âü§ÐÅ*¥õÉÕðU*ܧÉÁŽB=Æ)ôu±3'…=_C„žÃÚÿ¿ß0ƒñÍ‚GŒú0 ^Þ½wÔ÷ÇdV“Ç‘zæ³&rõ`ã*ö ~*s2$ 4^“Sý^u™½êXª8-4q e$oÿ|´…ÖÑ…I±3Î ]Þó=YHˆÙ¬Ëµ±¤:Ûrúk]Q ¤6^Ú†FÄÐTf'¿Uå~)Z…Í©•ÃV¨Œ¨1=ù¶&Õ@ö7&ËÍxÒ-¬ §ãSÐ#Ò¾tª°/óL³£ &uR&ÅX<ÌÙþ}ÿhìUò¼7)ŒUæ-€‹ÕWXFLV0`àüìSM·•&¹@Î6üépXE”bYéÉœžžy¥ZúŠvè˜}&‡U”t»¡o…/ðvùçùYŒr{ø¹4ÓÀDâ”Ü0ª`©…‚™_Tyc|Rûòl®ÓüJ_±ã*Xþ" j¯èè^IÒŸ{)7‹UÞÕSX³X ‰ÿ.½M£|ìïýØóå\f§ž¯'—ûR>ìÛë¢k#ã$¶²Á(,-« 1P|âáOÛRI‚¾–>⇢iJYB!¿÷/ê ¬;–Ij䂄цôêôÃÆ þÛ½t’œGÎI[µX°,‘Y1«µ ?p»¶k*åñâ:ˆ»Í€šh j;ÅB}Å28†umñý”LéKŽ#Ãö+Fy>m\¾Hd™½ÂÁ¼»ØLD±}lµß6_’䨿çBfD Éî qÏÄ—~¡q8iØe5ˆ:£o“h#>EÏ|°P¿¸šÀ¥ñx$ÜØ–Õ$¨‘`¦lBiS|N­… •ÖV;]‹S†ôÝ÷ǃ^eh–è©®“oÿr9Qí&þrùAÓa=Ï‘DÉŸúàÏ\A/· öQ>˜¿Cõ¶"¹˜«¸sNæôá}kÁ¡¼=J~ý³¡‰óOÍß¶íÖ.ÎÖJPd1»dô“lS8“@Æû6÷ɬ›Y 8w°²Å E(¤ª¦oÔoýd$¹ûâ†BàW¾÷›é›q³VXÔ•”‡y ûß¶áS…Ï^eP¯ÎÜøÝ!•,úVèJh¡Rb9·DBîˆ*ÉÒ«°ÃrW¹1 f_„eVv—½ªÚ‹ÆH{5õÙµÀ„°o'?¥ç¦«à€ì—±ÅÜÐ}Æ¥ÙÓÂ2NçÐTð‘ðæ T¶úÅê§Ú| S,Õ#É=Ÿ‹™L:ØÉt•WÍŒ¡ê^½HJ”PXà ÑÕôJÇkPÃë%´mûNñ^qYG³!~äÑ™Q«ùû±vléƒ{…/aiŽt–ó›vn2%úg_Ý5±äÚ™Q Í<äzœ þY½ô¤jV¤•c«~U­2º°³y°$&Q¬1)ÁY{U­ ¨÷[_À·F•/„ÆÉ3³„%‘– 9jñe!®Þ?×ÆÂ¬á¢Â©Iþîw°WÏŒ'<88?îþqÔ3hƒ~Ïê;e©è$Z\(¨InÇ«>×ÃL7Ù])Õ$wPÌ4"§ãÃ[S|“!'J±ZAh¦™¬’¶z|8"§Åâvv˜.³ë¾Ôi‹“·3àïÅ…É÷¾ Šèù ¤Õ#Ø¡[Yw˜WtðÇN7PÂUró’§Cpø¾~PUG§AMk—·kæS8L^@õ¯‡W«Ÿ›Ÿ³K I¯ÓRëÜäµ»Ö &| -ÊÙpö^X)7úz…¯uçÁÇMµe®*÷?LçVv÷ æ_E¨íNÃl°”R*Ë™˜wßS[ÎËo×õû XÌårX’¶ö<·¹¤í@&h¾gKT½Ž:LéM«‡÷H7Oùãt¯™3BÅ*êïöÛh/%¿$ãLÎOðlâ@"¬B}FK¬ÞWã}Ëõx'ìýÚõô:UwV³G>{ÅÏtÍšªÖöñÖ£Zªì€ââÖj(Ü.Çä¿îvên?Xë)ÅÇúÙá3³„ÙéQ{- ¿úÿ0ˆ´ö{xA–V{‚ÎøóÜ.ÙàšÔèÿöŸù}O—òx¬LÅ— iõc¨#Ò“°YmÝ\(pˆ€‘‡¬9øìðàD¼7fn(¸›íZ¦bk°ˆâF%ÂXïçl ¹2y¯ú龯<ãö7â·p®Én-ZyK;]ŠJïñØÃLpx¼d_híbûÕ3X‹¯qN«Kº^m=Gã,]ßv@¹Ð“»*Z—D…í]-9»«¬9œ¡’×å†è$Oõ^äéÐyªY&=Ù‘›ÂùAçüº‘’F\í7æUÕöÛì™±ôÓ¼ª¶§=[?z)ÉÆªµ9È7çi™ÆòÂéÓ*Ôh[2ú%}6¤dQëÊÍD.åGGˆ…s©Zú)‚îñ¼l<™ä*?(Å[ýÏçzÈ‘í®%KØNxÆíˆ€:ËfdbŽ×8 ŵWT]MRø[CÓ ¦¢»h»Ðnmá#6ÔËñØqñºøTlÐá°îƒ¹=2Ö˜d±´s|ðOŸÈÀˆÃrñüõ-¢ïL®8 ñî1#Ú 9þÿ¤­ÆXnr¾­Ã9ï‹e gC sÚ¸ vˆ–rV0œ8ù8ý5#©*d ɶÀêCÜN(ÍoŒ;J;VÃÖÿpy7RœáÔpUVÌ,C±öµ=Rs=ø©¡eJhþ"#§µ‚&íþÿ Ô)SÜK6’,Ìi…{¿Ï[å©«ÎjIêÀ!l€Ã^•„« ü‰ó,‘q¿~¹¶±ülDõWî]Hõ«"v/?"÷úD¥=¥ÜÕ)ßNv0Ô„.§ë …,ÉÄ +Òº‹³= c8»€[øŠÂÉ/JmN|îØ;:] —¦Æ:@>/sýFö &û»Û2þûÚ`_V±œu\‹À\¹¢ÛÀyøH³ÃL·ž`PúM§5»dØ«â-ä8¬s·Ë×Iê£Ül0Dú0²E¼îþ·I¯T·0õΆ”fÛÌoš îçVÕ˧Ñ}[{ušžîéíe¥ÐUËk?D]é¬Ù«ýš”‹qÐÄJ'H‚¬ê Þ“ÿ›š|fTÁ‡€ÛÌd[Ýç!uZ`úÖÙ÷Ä/²ÌH<6¿­©#ÿ‹*í3u_¾½ MÅV¢¢¡¡¨`bU,´ÚÕºèZÊv”óÃ×D³ $ºŽwã陼Ø[»¥û- €‡ùiûE(›[÷ŸìǽP´ùpgsü–¡0rGâ!1¬sSƒÁoÁ¶ qéµãÅA|§sðÒ`×Ç»ª?Ža\Š½Ú•¤]ü·…ìUÆ™þ) ûØKh Ý1œv{×=Ãa‘LÀb#$×Ds_Ã^1$•ØöjŒX¡Ö–ƒÑÄÇŪI—ÌO-Ö0úÔ™ìúû–hcø#¨„ÎgltíUûsEKMÌó™®;ØVú[›³ìz60ÁàÌ÷þléÖ}‰÷ä°Yo9|ˆÃЧÌKjîÕ뙵aà¹1e×^%©«!žYб©“kºðå×,ôþ'ù¯{»9÷‘s©svÍ"3žï[ZðΓžAMïÆÑÐ báÅïœþ)öÊ—¾Úñȹ:×7è|çºî–‚3aýü¿[-AE÷½µ}‰•‡¼:LÕ¿ß\Y~‚UÊ´Q× O¯ë÷×0KÔ+·]½åkÈæƒ2¶óÍMéüŠx?Ì!÷)x6Îf¼>×ô”ŒÒjn='z¯Kµaú±Ÿ‹«‹=œé¸F7Ïv¯6-•‚.£T¡Î¯:³Ùþv{ Ž55²]I•+³´µêl~cÓWÙ«…õ†u7KxpuB÷l—BҩdziRìa§lVAP÷F6þxúVôh/±c¼M>Û\é2,›Wy–∂‘º§g WÕùa^O±–’UHÎ}qÐ ‘%dÞMŸ ½ªtŸ-î:=`A¸ÊYcX7Ѝ‚ÝtÑ€ô;¡db°<,¥¸•êm÷þ[ l §æ‰ôûú‘=סŒ×{¾¥Œ¹ï˜ð[æ¶’•ÝXò¿rXÑJ`\#MX¢ùµ÷6éýmOß•¾X j)Û«z¬›b¯JbÛïu_‹C„w¾(Y •I³>t†Ê³&K…6†³)‰aeQÆÄ6]Å`’GrÆ*hŒQ 嘜]h4´ÞöêXzèQÇàöØ+=ñÿ#æŒÃL ¯h½ç{©Êй@ì×KÙ pþ¤é°{°ŸÖ2ö»¦Æ l‚Ÿõ¼7•S‘þ ðóyæ÷wÕ’åë+zØ,ÀY%…ŽJSãVü×g_ëò'P²«Û?ôôÐvöežöPƒ©öÒÛàÑÊ"îë¯ãâÆÀÁú ”ysàuŽ“Cö ˆ|bÿUÕ$³tìÕ/¯Ö4J[%¬D5°«Ï›FaÁŽS>å4˜@b˱c‡M4¾…ìÕ>7‘e¯Øg™«äTÞÙ8½p˜ˆ63W„ó /U"WID·Â6­ÆË¾Ð>&µ¤2Æ™j§ûÚëûLƒê?z¥Ta'S‹Ç‡ðFOí=®C‚â»Ä¸ÏÞÝ ƒ\ûÝ/ea5)àxÞ/°²ƒ§ä2áóG3Ywæ·^ó U~År¢–DÙ Óìžu¸ç?Îa’gé½SÂuÍÁ83S¶26?)™Œø éÇ“A‡XI„â°®.ó§FÜ»ñ  ¦N%]Î"îT;U%õ¹ ×¶{Ö+Ôò:»Õ„­vûÅ=©ë©!o#;|ÿé“khÕ^Õßg™ƒ§ô ‚ûŸ£h§ù&?Æì€üâ…}Õ¯5x1EÛW[êòqGèýú&0LQð­ÈHŸ$2ÙLjoeð^¤ÖÙÅ£÷pYÂVrÿ}MW‘=üz™{Ö!øš 8oï .„cûfáã÷ ‰zA ©„grêôY—˯8Ê|’31½iŸ°Ãeÿ{õ5zŽ´örnVf­E,Ù¬OŸì<"#-gû,{Å¥75”B‡¿XžssËTИ•¼s¡§ú"IcñáÕ^Œx5J‘ :;ýl–žI%/0˜*ŠÓ*ÌÊê;x¶ GÌL‡;-Æë;MvÙÉ›‹EèÇ7>¹Uý0}éªd>Œï­h9/Mxá‰Þ>Â9{P¡5ÛDñ†½«ä™2„ÌÅ99ßÕqˆr|pºÅ@luVQ3E’æbÔ}/‚¯QNïÍ2j'Ì44pzÂÈÌÏÚiBO†~¥ãjPÛA´mÕ¶r°†+ò?õ[¶²‰òj*/OÓv°DᥠW}™8Uñu²ÎŸü}‡À#Ÿ©÷.bb÷ûêé£WHÇfؤ¢òϸêÏ aüÑhÌ<úù$ù~ ŽA}ëîZÊœû”瑞`jEÍBX·Ï(¸*Ë¶Ëæ²À³ËÖÕaÀ會aDrþ¥ó+S£äŽðÇ44úeð l”Ǫ“z`÷É`q0B˜hÅk^à­f]2Ïÿœ9f¯ ʦ4ßÎ7XìÕ°:Œw^Ù éZ¼²8dïýް`>ØÊ¢ÚÍÒ?é2´öDNÎÚ‡Jhöê¼ÄçéËxYÜÓÅ^Õ2Tå1jKÌ@&̨Æó7˜ ,‰#§Ç•ÑÚ"SÔOå{ôDµÕ~†zýU$à­¥¹ë&/7éå÷T`„o7{Æ‚AøåWWêë‘2¬é¿¡V(§gc­f©8{9fùꂟæ  =ö¹³`š¹‰'³ ø£ ž|ndÞ/Þ#¸íC&ùÙV?]öôÞ|ïD©ªÒœ’?W‰£X‘;m)ˆo¶çÙ®Rjb’M[u€[Ñ$Š3ïV2Â!Æk,ÖÏ·G^^LÐ@ž†.}1s7eK÷kTú/ÂŽl!†jùÕ{®ÊHç·Ð›påÌ^ãø|¼Þ#ƒç^¬UÙY¥™øl¶·Ëò"5)»o`“¯ã•°Þ¯áŸoÙ ~„éˆ#¤n“ñ á^â‚òfÜžné~TùÖA"•'™òYŠêC†öŒ4tº¯HÆ©«BH-ñ¡Á³µÕLô{i_g¯Ê¡M~“õÛBöjØ<”_ñ^}1oÉÌ€o„\RsDÿHëx>î€Å®rbÛ<صÓ¡¢J_úÁáâe,p—Ý7‡KŸhuÁÒ\^ËŽÕ\ªdOÖÄæ ¼“¢Ïñ•e¨æqEE¨hŒ6&W¡ÞòHÊ*ÁÆöF¡ôðS .Bf“šÜ’×Ú„Þ®,mîe¶ÒPŠSGåWHLUy>Z ýàÆp¢:—Àòx'ÌPÿ—#Á $`Àƒ˜ý\£‚ÞÕ!ƒÜÇÎÙØì -:ý'®Ø;4b;zjñûè!”=ÂRÖOÔÜä矎_¯†Œ·ÎäÂfw”dž|ëL²”£ ‰ì“ûE\ÅÍœœPÖÊþÞ›ß ”íúˆ¾ìeá‚6+®=2˜t DøÄ§[!f[÷Ÿ–¡™Åh5WV©÷?G¡BÖeiüÀ"b2ìÕòc ú¦‡L÷Í=(#Ý‚WsÜóŸrz @sÔxn.yep[ªÝKÁ öFšj±J_/*³xª sû^A“zîtWU…šGELÚ?»8•ù(0*Ó¿U` †Ð¿G¼ iív¿)ɰœ˜•ìë£éƒÌpVcÕÆj—Û ì‘pÃy>?Þ´iªá9Ȩã¿)M…gGªóí¥-ç̤WkåH³¡¸G"_ª2;ù%Ã*ÜXcÌšnŽç¸ÿLj)`zO}aâ­Iña¯ðÄX]@­ei`?Û™8BLßHiåÊc%‡ºZID§Ó–F°•ôtéB­€V7àô†P{Qž$‚Ôb¿:jŽ•Maç9ø!1\¬¦ó²¥½Ÿ¸òtÔ~f`RÄ=“»’~lmblEauœ+ÐÕņtw´”ß++ª4H±êäsîHÓm>,ÚˆÐü9gÀ(‡Ñ@sm»u¹µÂå)u–‚R?©ß>X€2LÎöúªž†VÅļ²øŽùÇ× 9NÌ0ôÚ!z$Ñ7ÞYõ·Gó%¯AŒ3gxµ’Ù3â ÌŒ“Tî=Ï äqv^|‰„ß„CZ­Õÿ'‹ þäFןóíADœ¿- ó'Ã&|ç-Þ€;^òÓ³4ÐOh9ö•[FµWOmE9©×Žáj%VÃÝ‚2€ª2,y¨]±üN§U³b9Pu¸£ÈÙš—ò m㎟Œw§¢™u´ò·H}o`ãxùÿÙëzM±n……À¨]1ñjØeé Sïq^0Jþ:8ek|({Ÿ%2Ãþ <$,Ðý’½JD†Núê&œ3Q7€2ê«@Œ9®Y(Žs_~àCµB$¨ëAÔTž ÌV†Ìíg®öƒÓ2 Ðþ²Þî&[ 8¯Ðé:Ywrˆ]`¯-É`ÉN]—&¦ªÃ ¡Å a4e%5ϊ݆ÐH²WÍ’$yíü‘ê<Í,ù«¿·Ø«§W„ÙjØ8g/#Þ'Å¥KÙã¹ü\eëÕ—È*‚¬Î? ýúß¶ SA¤¥0 ‹¯Ï…ÒµÐrK!V{ה׉V`£‡“S@mãÃy•)F€]ã%Œ®E¸D“’ÎaÀVpR±8¯ä‚î80®Öm´KÐÂö&ü®æi.#æ°p¹æƒáõÞiof›E¹¥ã- ïœ!£æ†G¿Ë[b°´Ý"*›‘<,òêu¿¤`'’o·ºª<ñu­iµäýel5 ½ÏãøLƒ CÇR‘šˆdØrè¡ú(ŽLϵrË ü “Ój]@¶¡×¤ôCâBK™{iÇ:;›>”Üë)cœødXe‹ƒ6ÏçŒB8C°ÄÄí¯˜ÍNZµx ƒj¦¯“Y´m=’52àK- ŶPcþÃÏoÚ@ÒÝÏamy-‡xú)¹Ãlˆ[¨“Z3„¹ Šà0ŒOyÏÃ:¨]Ì©L» ®âÒ”b ‚÷ePìQß¹UÛ§Q­Æ½ÏªQ[å,Jó:%I"9ŠÝFÝ& »¼‹½2]ìØjrÉþí}»(ø)%‘`¹B€røq¨t]imG±zk”àó6—|íöÍ—*0z]ñ~r~m´a´nQgJôunÙ+»>{lép&§ÄÝÔóEÇ[™¼ïÎEŠbñ( cóY‹Íí$ÔÜœ Æc¬ÞKóL-_©Á_ìQµqdÂ;#Óö ‡»"˜€AhÛÒSEœs»1Š8sp’±ºÕk0I]!Ç^5$ ’£gÿg4¾iæ˜ä3&°dKó0}¨i'4Ó `ÚGM–ÙÙy^òtÝbx¿Wº(@/3%™M7#óS­II’(“vgÞFôD_®¾'­ý¬åÍá˜o~Ø·y&ÔÜe-qØ6ØWÈ6}x6c4_V¢Œ˜qXHø>`Rfú kz„L5´ÀyÈÚ.M¢/M¤m ˆìR?÷#ÀY~UË—þx-ƒÑÛ/HõöÔ¨G®n.óä㪫ûö)O‘V ¦Êm}:³ãñˆä?Næ°º‡½Ï̱²ÚÇTq³†2T³­µã(aq¶'éÜç6c.ŸÚU{°ÐÅ­±ÀQÛX[÷œï`¯ŠEu•póÌm!¤š¾noó;нzÊœ(˃RQýÕH.BcݺØÐ†»gë‚É®¦QxÄ4\þAÕ÷ùHXëPÌPmc&c:n¸ì“ $}ÐÐ"|£Á9ßx Üv½õèžo#Èt½Å0/‚Á²âAöÊ `‹Y®:»Ïˆ©”F"JÜo«´àÝóÓùßAHÌ—Ìð•Áà>(ŽX?bÜMhãAÅÜ‘t*ìÁˆË8õOúuoW†»•²7Pw³a¸ø3zhfÓÖÛ…W fVåòÈ —Óë5:[@ô\b¡ƒÒÈÐñ:lèMdº ÇPVÎIpø(žEXýà0ÌO4³ë·G)làmPfp>bâöê:¦zc;#>Ê%¹ûÍUKµ˜¦OÚ™Á‰ÌÞ<’ºçÆBF…4 j/å|rªÒZU›.«6o PJ}!n“ %”žÏvH»ÿžhÇS˜„¹ˆ´œÁb>s…k5b‹û6uÛ ns„(dJ^Ž–ºó¯Uì1‡^jË4É_×bO7ÝamP­ö޾¿”c[ºW EU+?™k+V?«b©+ü Óv܈/ò$L Ç[*W­ÀT‡-ÁZXÐ9 =q×y'S½¢<÷’à`‹NâPË$™;Ÿû„°¢ü,h°u6˜ž8êx¸å«É >Û”g‹ £ôÄ]ò<Œô½’Ÿ½³§uhúþÒØòc™l½Í/+þYq<é­ n¥­?#&Kö…MTH/ÛtfÔp£òg1;_c¯Š¿%€Iaã/¯>æ¼Æ£’g˜×hï(§ä­]_ÔºÚßh-¸r#ç%Õöµ×šö¥(ŽûCÆÚ>=êú©î„$YA÷+jëÿÅcgî“¡U©·µK–_U¹wýþ¤ oô¾—û>NΣbÃŒ§ÚºëILº[›c¡`A1\´vâšJ³§0âäDö|,i|Æ«#ëÊK²—I¢jA¦IÝq€gÙ™7j¯ÂaipUÉ.Â3Ìš5žXzØðóØx°áñ@:úL. 3jöjÀˆÙF Â$ðmÆjdÌ×ãWfóÌpV²ŽJJ?›'•)êM?Âé1¨ÿlбŠè¥»1ÙóÂ×fD>'¤?Gb»8¿ã¹r•PsáѸ Ö}/ja`Ÿ`C‘ƒ5Q°¹Wi}úA6^Û×Fžž¡wÈšøÌ³Æ÷ׂͦ±ÚX’6±•ßÕÊGÍÐzáÔ¿×B/áçðœŸò«÷†ÍTå„95¼ ŽäIϘƒ‡ËÝžª+RWQ£âƒûÛ–Å|ÜG€0±Ï&êwk³8åW q5õzËd—æ"N«w¥¶«¶.tjl(X[öª Ù«nÿƒMÚ^Ÿ†½Á–æeÓOCh°ZÿNÍG{uoÊo»<:Íi©Y™Y +m‡WÈ6 eýã¥X—®ÝáEºC3±©:oó{;p·ZéŠ>¡ù“Ù“L-cfÎìŒãs5jjô±‰3snCX)N¼Ø¥Gwä*5F ö°’ñi .Ê‘³ð›{È¢¾8Ư°&ã–¸YænsÙTåIPûŸûB%?Ó턾ƒç§ª¥×R}ý1¥sgÏ?ËXMQQCªkKÜòŸk)´Ïü'g*„oΑQ{HÉ™ü6’ƒ-y—Ñß©lÇå&¦ëðÅúròQ5(™¬¢³Làê,Vëƒìò8[ næ)5:ÉqùÕÓ¬Äý Läɰ4DCõM[s¹ pfÖ×)IP–ì¦ÁœéCoÓ(™uak'û‘,|w.’OXêþaJs‡Qiç{•A/È=É“„]( ·À|]©¡NæãÆ6OÔy«³XµüìŸnËAÔíâ»5_(ƒ¸Ë’ËhÍ„‘ªµ;î­h‡Â[p{µb®#yVn_µ¾kæY6¸¢j'‡æïô…Ûõ‘' ÃZË ftüÎg²)[¶†‰†DmðuŽÆ–M¶*hÉ›ãmeú¤žåKÊÁW.„c驾ۯåÆ2³Îlßx,ãdZ0HÏZãÑ©/þhÈý~gXÐÞ[Å.œMýsåÌ“cMzWöbh¸¾%çµ x4½ß”L|ew“™ï¯ÄyBü)ïêÙKò®3ê¹àðß͈–½™Ùª”Ñ«{eŽíM³WXa¯’ý€_ßÓZ};€©UõZÈŒ½|{ŸJÂ@eSËÝKËrýãø*­i¼ÝÎã?Ç.ieR-¸ÉË ;íöµ wFõÍ"g½GÑL…O΃7Þ¿#·»sêéÑéÌJ¸m²µ%àÔW+˜QxÞÈûá"ß™µÝK¦6+Ü».¸°DfièO2+}U¼žÉ—…ÖwIÏŒŒL_øÇ¿DåÏÊ\ÀiÞg"ÿúY> $Èm> äÄø9?µw©(úµØÕ’lœM€kƒŠ,#náŸÃ^I«„j­õŸ?ÿÄ?ëÑ¥¸•ÂÂ$Y?Àáhý;ÿno°0©¶LV=¤³>P‡’¬¥üsºK[FU,öO0µðïc“ÿÞ> —Dàò‡p8v³Ücð‘¼J¦Q oÄëaUíTÿÒåWºýjgiëwó(<=œ¼“t@ZyÉKÞ ožûÿšM¦r|¯Î*<*ô—ri–IîµÅηÃs Ä ñÞÝ®«÷«ì[? 0úw‹˜xŒ'‘2¹„'tëD ‚å:yé$öZNÆx/ =CSÓ!pÉ”&{…Õç6§>ùmé#ÑïˆIû¯|ËaèïseRñÞj¼tÅh, c-Wq¨±îX°SiuÎ’.•8Õb„r¨oHíC¦¸¡šÍÁy¾É^}®rÍ;¯¬{9v!ƒ r ¯]â}šŠF¿ý—fáZi~˜Ë»à¥¼YŠÕEh2W%ßDzh×t±Xª–½o2Ú³­…÷ë‘™$›c¿ë«0c%‰Ê™­þ\lYŽáæâ’)lL*Ù5 ØÕ3²àï¼±×õàȇSKûøs<׸L/E•®Ê°–p;/ž˜bkJñ Õ¡³WG˜¹ …–½bëH1 ¤LUpÂÒRWç›3î…£b+Zªí•Ì Aý}öÝ^mÉ–ò©†:nP`_‘8Xw\–g|P¯eî)>Ë<§²}4\“ј9äÑ•kaÙ`m¡ú$}t¨%ÛܧÎd½³Î>~ØO-ÞºÁËÞMM‚õoSíN)qk2îé!fë`]ÕúD™1‹áË÷2­`-“¿¢ªùt;Ù÷3£DRh SõÃnS{ÂKÀ‚¾˜â4ÙŠîš'…ª˜ã˜òéÇ”Çý¹95`` 3[Ý/Èé"s}nÿžP¬k¤ LAgKR¾*tÕÜŒú ”â.°Ø3Ýì±±´œWD)ßi&ÿ„ S¼±—‹47Õ ‰“@=t–aHQ`Í‘µ”íRqï Ù šTݱ5–(Ný ‰ Ù=ÿG¥?  [ÅNÝp«)ÞÔìpÎK4…çÆJË6Ád@ãò+®F½ÏäYEø‘zlSi†”„ÊX;¿&r×Çm7ÔÞ…º:¯y÷ŒÀ×Ũ^ÖEÑÊà€ØhW¿A)Ÿ¦8+£ÔjëÝI=m¢Ž½2e°¶OC^ËyìU QAÓOp2}]˜»t^ª¥Ï\¥y"Yžk!LU@¿hhÓWs8šŽR•WO÷x—’îÛ >X‹m¹öX…©m¦šˆÙ,܆‹búà«r5Ó?h€Bq5qÆ;´ó«©ù™vùݧY&t½ƒ—ªË¥°„ 6#D0ÿŽÖVsŸlVFBŸ‚AâXž¿úÉ7†T,½ó;ìU]=,î¿^ÒGLf°™/œ{­˜ÔÚ£U´…™š#ŽM!GͰ›wÚ-â¹2d¥÷gû¡Ü5†J =QC™æ²Žp÷‹V%Tõù/A4¬¤Ý¨Ø)[Õ=]üH°ö¥øEÙ{Ÿb{F0ªƒh"Ú…ljR‡•H.‘kªšxk`¶P#Hã—Êgü½¹Eºæ–ÑY3ÑTø›y®.>§–`7€oË~ùTé±!Kj¯*²f”Å Âa<Áè?^îm&bE"S¨âi|\d™c™AXÒ=:PõVŸŽ¼ÿ{ÕÜÂÒ°>Ú©X£´Y-ëÞÏ2Ê&ZºÕÔW£g„”çé#ܲW(@UâÑÙŽuÚ²V„Vµ”æq°kçnaãÊKþút¸¹rÂ=‡Ã‡õÏ3WõP@1]´¶‘ÒÊTf’ðÇÙsí‰þÁc " ;È*¤LS´¸å{*99ÂÏÿõ;íw«C爫ä3Weã"Õ2l9¯ec«©9 ±hýgÑvËWvjóÎòDÖÈ×±Ê09ÁO¹pÀ¶ü±ÅRþ¨ò«.»Ûoêú‘øËrȲu*S¡¦—¯ÊkSôɉØ8Õï“ &+|Ù,¿{â§EBßXS°ø¹D’ñ8QHËk1¡¼.<”Žn%Æ -´¾9î”{]ðß%­4‡5¢±fÿø^.Ë9à½ê§z$«0@á! Õøh§4}];Ïp5å}.¦²SŒªb¿ª¶èâßÙ­pìÊíBWä¿Z‹#¯þOIqu¥aõ£põ‘ÑÄ.™CáˆLK„Oo°Q%Yû×ÊÿJ­ç½oåÁ@ö­Ä`´¢3³è-.%ákj1J-÷qì37%¬å‘€7 dî­è%ÜpI8Ïàxr8É[¤´…Om 0ÐÙsXÙd†ýK†úïóa8ÆUƒÆ“£)Œ‰/åR¢ÈVp8Óxw¢,ÙCU´ýK¯½S¿Û‚–!º¼PWùò¶fº98T¨ó°ñG ¶@VóJ]ÕÉšr(«N(Ž%öÛoZ(‘|q¡3ˬJ®äÙ¶%ÿlÌTBm“Ò°ÿ#ظCʤ¿Ô÷«¹]ÀÅ‹~ò4éôˆ¬–@'Ãò{ Tヶ-IÀ}h' óˆúþܙ̥ 2ˆ{Åênöb&Xè^´‚Fá­ªÔÔ ¶Æ†v÷BÏQÁT] Mp|$U× Ï‹ý’¬“ÈäAûš£;æúG´.Úƒ7`ÂóÓÓÿ¯Ì÷ Ñ – ÞéPjƒ£‹¡S¹ÏÁ˜®-®Ä\žîùßX¬‘“œçí)Ù‘XBa–ÃDL7Jù¡J3³3„Eí³(¶:ƒÀ°*Bw‚¥Š‚¦ÚÊÈT®§¹Mc#C¢’m£*§¢:s QÇaŒh(ÜoSo0>äký¨á e¯`|ã[fJ³ŒU%ŸKàÕþå! TÜØ,¤+ÖŸnq€K¢ÿŒd<Åšý|2~EŸ58ŒÞÌ`'/³²!ÀÌβŠã/JúÄ<½ü”ÖÁ0wøÔ¹Ý—/wàA5W׃d2{O¢e~f&¦…YD·ÓBË>/YCTGE‹fOV×܇êa{ÿìî`ŽY„4Ö,u%Cú”&ñ9ݘ(¼šryþî7‘Sîܯö‹ ¼cmà3ÕÃU+_•ôj9û9cûa² óÝJLú}úy€MX‰ñóðù1tÌ4zYæ°<-È2¯FÇ78qˆ*,ÔÚ”šØÒCºZŽBƒ¡²‰®CÀíõ3öºÊVJÝý. ¬Sܦ:ûslm{vŒµ(ºªú\pà3Ø1YCŸðo.²M>Ä—Fškçœ;~½…‘|^ý KÁä¯:lIœbòJ»•©M0¦W¬ä°H!Úàc0'ªšÛt|˜œÏÞ”·¼Ê<ßÜ]FÁW¿f’ [kê6©xO©šVS*£#m iÒª[{"Øí{~íß-98K†VÍcÌ»Zÿ|Š&)©iÊ « ¡«a»Û£- ¶‡zÐ#Ã6<ñÐ5 0ÜÚhÃò@6ÄW‘”T÷V±,Öƒ¬“ñy¹V®GÄzdæ>÷”äCòòÞ}öεbE|ë‹ïã^yt|4 mîG¦ÞÒý&º>©ž{gN28Ý¢•{¹)+ò•­ëe„‚Sv÷¨¶ô§¸‹tÙôœÝT÷ÖämK4~PPWgªÀ¶´îXÉœ¦ï\È_ðaq„²ÆA…[d`5°¬…VÓøjÌ⸌_K`á;X•°lÖ6ãÔ,ç{Ÿ˜ö ¤ö“׆®™JŒõê§×ÇFKÐz(-„ZѧlXÿ‰þþAx1u`—ñ‰&DD @Ô:ˆj".+‚^¨·]Eç¢Sa¯[ÞjÊqe¦¼P§DòF³ÈÈvƒd;4[->tRTÞ¬ÞÛW^DG‹iw›z •¦[}°0/Æ­ËógÉÉ,î•eñ”á\’ú̪"V–«L™¥Då-hšJBO|2g«A£dZt[ºò«[¡¶ƒ¶d¦W[”ÞIÊÇT—CmÌÃk0µÑ6¿@¯˜gþ•)ªÊbuó:ÂÅUtÕ~C­ãµ}w´Î&xî1ÂþQ½ÊzäE/T½õÏhvš÷ZýægÏ…4ÎPâ}©‡•&RŸ´ÓQßE#û‰Ø1IÇ‚Ì]øÎöŸ[™@$ÐÖ?‘ŽÇuDs8æ¶Ì¹6ö¬¼;î©“}ž·h1§šdÌÍb(GÑ`¯ü‚yñÉmVG,LJΩ NÅÑÓÄ‹‹îÚxE¨…â˜2ÿ!‘IvqæáK§èüT×bNii£ S¡mé%Ýÿ:±îÙ`i r­èÇZiÔ õ®oÐò‘WÆ%™”ú£ٗí‘rpR`kÅ18´^þU+ugVÏœŠˆ>o½„•a€j¨œWÚ¹Õ>è>Ò¶œSt-D°’£ˆ!s^j®[¸DÌÈ#?CINyÖA/i s  €L« ë·ªwÍõí ÖeÊèWôd,›÷·Ðýæ=ìÊ ‘÷)CT•™DÂÖñؘÊ1#Éb‘)EýJ‡ò‰I²înE΃°U,½‹1Ñy”g<êŠô»¤}ßɤ€Ä@EraÌýR¥+zŸx].TDrÏýCü,0БÈO¸êÆeÚ²\És~˜A8w¶Ãtô&GšG{yd× aж„ã¼!i$°ö„f‹ÒÉ‚•)|‘†S1uƒÂäb,ý`FÚˆg”ª)ˆö5¹ •ŽÍ±=½PWG—ž5inÒ„KØÆ†®6‘ǘ0xy¶ãüÕ…F^–Ѱ¨dy,ˆ˜Üò^>ϘuWåäG&ºˆ Y}»#»½Ú¼¶¾ÚÎÁ~ ÿ·ŠáïÅ:ƺ¡ºdX%‡´ÒXéÝ"EæIê’JEµÕlÕ‘«ÚtÙ’uäEÌ´Y¥¢Ëd;V„ãŸì*×ÏKSsg‹we‘è¸Û07>‘t‚R-$¯T~ƒ$­z¤m=-ÙRPÞzUúÔ>¨V=X|È[æ VŒ»N£úI:Î6(]àØŒ™:êþÌu܈ÇzôgkW¸3á#qɌƸÞÓáïì/‘x÷éI{T4³Lï©æ¶Téd¢ üe6×ët52°˜ ôJRÚWPjòí«LÀ+QΊbBê *¤—ESìoQi_4Ÿ$À^c¾B+S¬ÎÝæ¦øô½ƒZD"ÖàÁˆÏ¹JÒAëü¸ãýlì½è®ˆýÊU¡1ÿO®¿aÔ#l¼†¯wròÇDÑjçžÉ•(\˜À÷Ájú¯¢ oàW<Ý ¹úCSMå¾õn¯ÝIý-PâQ…«ÏF¥]çºg¢þÅWô¸d PEPú@ŽÓ+ñÃÞÜ–‡=­¬¬%ö×SÆÚÄQxl¤5CÁ|ôÇ]ªêÃCX^gL«¼Žú†RŸahâg’«Ú<­û|©&DÙáõË+óQ¢3‚¹7‚çm“¯ hE'—š ÔºÆP‰O¡oX6Š7 èÿø.=ï…+bëLnnš‹ð‰e¶æKüi€™ãͶ3›žx(ÿzààLcô#•Øîªzá;“ 7ÃnÜS–ôBô½k$(¯0·²w¾†ÁѨ}›”–©EÀjYË13vcXT#Íó¶ ³Y©^iµåë̬Q6á½T©ù ”m%.䜬e7zºhb(¨|Éê¼µæÁòBœ§}59M z•ª¶¯Û×A…nÞúH‹4nE-ÚLD$¶#aÖœxî\‡Ð‡ÎÞCIËzË?:#)6Ïê¢b46Z1ì^щuÿè ÞW˜;%=íNïÀìR‡•~©¬z7¤ôM£pm$tÝsBG\BYj 9oÙÅáJþÏ[R{"Çê«ï‡_ݼèÉÒí.9¦q‡û´'“6yKú6Hi,бÌ)¬w§ZpQ,aîlÀ¥––šŒ¶¯íùFâL“z=ÖÕ¶ŽÅùÖHyàÂ7£WجÊkÑ}R¨"bÐP-S¬=§P3õd†57nýSñ ¤*F—õªìÀ²¶X*Æb.mäî‰ÐϽ¢ ƒ2IAxeìòXp8di¨¹À zõý62-l‘æN¶º-Ç»„ÅHzzHi[K’ñßì \ gr¸ÂCªl¶1iȰçDÈ®€ÓÁÕÌÁ’.Ž »ÁöI¨‰G<Øp¸´vŸP!1ã)WXäù+«Ða¦„C6¥ |åYYn«ôoÝ#ÙseslŠ ZsP”õë¾/ ¨åxÊØ‹'a¢Ðþ N¶m\Y>ƒÖ‚žAzñÖCØš‰«[Ù6ÞD ÉD¯Hãs¹]Ï»ö:†>²ãë@™Þ馣aß\E×=€É†J÷ýრ:UŒ^q+Ïc"vŽ G¶“–ƒrª2x*Î'×ÕJñ+×JGö ÐÔ+rb+Ô s’¬å0®5[óVTÊ»·¿wã Qþ^ö©¼J V¢GM 8겤õ¨OU݃¡¬±™ ªø`û¼™Kn¥^ ÅW‰£b‡Al Å}5^e°mNÈ6„»ùQœ²T å/®Òí¸WGE‚)o‰û ¬V¯x-‡xÇ«òÎ$t@H¤²A«Z̧*F¸@¡¨Jk [;¾”øTǤڬû²9cê¬4/HÌ@i/W_ä:j¶òçdðÊë G{sé =¼C˜Ë_Ö¡Y¬…¥º»ýšºÝùqÐ;wꎫa™[o°†èéÊæPÖŽ¨Ç«Y£6h`™úbn=5˜uöÎ3ÒY* Bn¿Çßm41[s‘>{„ýÉÉh®kÕ†TÛÿí?íJîÝž‰^ªÐzœ13¥i±GJ`b}/Ù]f!E´©¨âsèì“è|b”jÞt•æ¢`)g bÇ·)¢_ XÑ+™ûû°\ÓT,ß“Öú—aOŠÓ"bÕÔÑ®±•w‹íí}¨-ï-­¤Û K«lwY‹ëTôÇį:z•óª˜]±ùìÔo¨•LÄÿHèô#cÄîz7~Õuh4“¼ÐCù“7Ëie0 $±KRÔ.unÑÅÂÑ· ‘o`l)ÛZ"ÀXè|Â6÷ñ¹#ºÂú@Èžšý÷²æ0²sî0X’.ÅÑû\7ê˜Î+ ¹í¨öü7 W#å7% ¼»‘¡™ì±pB}•Gc6IÇe•)W–8&Ø$8c5£ô6—CŽ¢²Øï̉–ð ‚#çÎl  ³"ç¬ìŸ!VlX««kT¸lq ó"=ÁHE fæÊìhÒÆ;ðˆV¡`’¹a§€¥Îô\Iüeªæ™Ö'’›IUÛB×át˜ø,:bëvº#Ï¢;éq'l<Ê_óÐýØ7K+¼'äö-Ÿ‘ÒÙ„|…” ¾§\E…Htôd+BÒMjIGå9æÜu`Ð?tG“û3ÀŠçòæ±ÄGS°#´ª½íÉFLöŠïkÏ•zPË‚¡Á¯1ø%Ú¦ÚrV‚¬÷?rï4ª$ä²2-fÙÒ:æòœ¥€®¦"q’t LD"‰œB“Ë@ºðϳú>/Ò‰ a#~5\+ßWÅÃ÷õU•µÕ|ëÔ}Jé+NEXõ÷$§ÁÎ1ó+ì[­|+xdÆ Ýäá\¼"ƒ‡¯hûØŠ]{î¢YÆEݤ¶1jêbxs÷½‚b1z¥èš)è~Êý0Œ¬iÜSù8:Ð\];ƒIG ~ôí ¯¾iðua¤é¶2µ(v5,-º˜òi ³83<>õ™8 ”lKw*÷¢WØ’öm1 ;Daý~qEXàV"†½ê¬ß|)NÓަ*U»í*ßΑ7‘ÝW÷]¾ï©N$‹ ƒДl¯´ R˦¦of-ÝÏÎÖMàƒ°á–Œ~QËИªæW¤£Æ¦ OA K³œq^Ë×!ø¾qðnß6t€D£f²‡„}®"­1®‚nqwnuRhÇï*McŠMø T!KMýÊm1~Wë.î“§ƒb}pP•aNØ(yçã¾®27“¯·RC›˜Û,³7†W㤃 Ûƒ…£±ìº•´S -ÍRR°_ý,Éy´U03jbK…ê•+©§Ü«€'q² Ôb 64ÃA kê•iª¯×Y—|§±«ñÜŽ&²ÖգРjùÛ%+Í7.eÉzË%õã Ê“SU¸½¤´è Lì\¬ÊÉ}\híX.×®.RÃÖj¦çÐ{½VYûTõÐíÙ«ÓžP7XÿFrâ d#=zw,H7ûzÖÞúaK¸:xŠMO©:­ý^^-ËwÀg»`,ÄN¾(‹æš=vLa%ÿoXPû*¶ž@PPZ¨ªlXœÊ’¸‘h"Ó–ý3–å¾'„£¹2f4åµx`@LeZž+ÊC(™D é¡\fÈ ¼yו‰VÊiÕÃc88’$åmb=Ÿ‡ž‡æk›§Š}1¥äë[šh¤èœW¨þªç ;+.´$JèŠ zTªdÊW¿L=¹hT°R€Ÿ\žÇž4`È¢q5«‘ÎçbÌA(ŸU¸È‰‡L82­V¯µî î'E4¥Ž­­ÓŽp¶~½+Ú¿ ÅG¬ÁõYY|pЮçÑ:O?s®þU—L‹Äja••¶îÀPN퉇šè‘iCÉ•µ‡Ñ+-Fòþ¾±ñIG½²òÛfÃç,Ù° ɘ½™¯µrç:2A‹*S©p|E7ÙsÞz}Ïšhqv^0/´Ëõ&]‘-wN'rÉFlÎn®Æ $ÁF ¡mIø`îãݸñ¡g`[\*#1è²`9ZwšlM/w÷þBÓå©Ï})n£êW…"<šÊÉ£-{!76^MgˆÁš›A›ȶ‡²^d È û±^oÙ}µžH%+ãEÙÞÑ^(·ÇÞÚ>ÉŸïR În}ëÞX¹¦€Áü;Åé`K’ ¬Ð(þK²Ö« Vtli ¶ƒþÒVuDUŒ È <7kxJbt_Ñä"íå®0Cp¯G ë)-\kÆ\¥ô“ ôŠßª\ú•sËj¦—~<]ø\síá ³º{X»´J>Áã&†- ËZ­R&Û³¬ÜšÓ ­áŠcÇÒ²Û#•jiÐU¡Åã¬Èyöe4<ÂOÙ6 ;mæF·Ú¶ÀèöìæÁø‘¡4AëlPÂf>]ÄàÓ†.Tª®v{nﱡ»Ù}¶½âŽG3ËÓúÈáÕŽ2²Ÿd=B¬C¿‘qkVb(h¬Ì~ô~0ÊKA{þ!›E«Ý¦…Qh3àˆg@—ŽF—†ël#ÊÚ%|[^ ò&Á ½¢YмW ¢T¥®þ.†úsxÍ­‰²vJ)Ú¦š¤dó#¬ÃÆÔ«‹Ôè&åâj“S•q©ÿ¸AÝ“XÁÔªº½!é ôŠ;i¶ÀU¸]=rvp•#pÒà¶C2˜a:P‘FYè–ŒÛQ-Nqº‰=ǯ²«qMpQßõ(½™7¡–Ge´{.š«ul˜²×.åV ‰°$ÍöR_Ð"ó—Yfy„hÇ'èE§C ÔC¥…fÁVÃËÚÍ…~Ý£ !;¼UgêÚÃø¨÷—}¨¸A~Û1˜H–.×@ÅȾ z”¡ã¾ºÿX'©!­‰±¤´ˆŽ,ëH±á:jh`—ŸEG^ѹFW °b «~iØf„-cÞŒx †êJÕ£è ‰ÁF.`qòß–ÍŠIOÅ77t¶”ªADŒ0–¢Öyl o8DÕàör/™;ˆ«‘ìª$q®ç#k7¶Ë!¶¥Í ö–5ž‘.Ëi°c›>}_ª4ŽÍöèü<<ôJ=Þp¶#¡Qûöx­µa”ÎZWûg<$^¤…ˆ8!Åæ ÃÃÚzg+¯÷•gIVí4O›5[, ‚S¢cLJ]€å4W-ë(Ã>R]-™$Ÿ8PÐ(©äú€È$˜°nU£˜Y=ƒ±2J†µàÇ’ŸCF÷¾]ÁÜ*xx°Û)æöÓâ­K&(k¿ª£]lï5ͯŸò½ú'oË ¢-†Ùu€É³Ú¥•Vvp1èW\ cÞÞûtør‚H¿mÙjU%’úC©Qr½ä­{n0âiׂ†¤Å½Ñèˈ=D GIÓõ50¬ýGCò…AhL¥_ålÂVÏΊ!|a™WE¯ v¬KúêwaØñ\½šº’²i÷ó«Ý:>¨OÇ]Z¹†ûV‘Úzûy½ !”4 æm2uu/zÄÄWHíAˆ  pz¨f„ ø"’`ƒª@.4ÖëU–¨°Ñ![agsµsmaPš÷՘չσS•û×±Á¦­Øp ÆRg–’ó,ÛÁࢣ…‘û[XwFÝãa¬ecn+Š€‘¤jÜ{: Ç UØHÍZ²>²%>A øìÒ‚¶«\$ß^d#‡HDÖ‘ãº~ ×Éý øéÜòÌY‡‚ÜEÈ>Z&€Þ+¤d™(‹S™øÎó¦J€¤,ª™ÄzáÕ«2Âàd Y1z5_ƒ+ŸG£¬p¥ÔòEî\¨6þ½ØJ¸DKn³‡‹Ž™ì–ä”´žÙN`±í†Qì'Á@Fa+âm#Õ ­Wz¥U`賨úÊohkbxòÆîÃ+¤0W¦kÃÎÍývi‰€²´Ò­+€Kò-ˆù/–€wY'Z%\}o6¹°CSWt¯ƒ_j8âjÛû}5W=¸r!Ì´–›—“58t `% 42P½KšƒdñÀÏMIê®ä‹‘ém–¦îùà±®êys_Â9asïöý`Xn‡*Öôf¿ùyòvÞ3Ó’ä9±ömåìH€Wù³üE(™Ï6 NkAlëÀ]žÙÚ×>jS¸Î,É¥jOíCŸ˳¡Ãv=Tg#«Ilõ³‚¨útéæ‚hG‹Šb¶ iËRú*CD$õµÑ0 @MŠW––F ’íœXë—´ômQiäm&*P™ölìœ hïòÍncŒ¦k{DyšmƒiÛ™– i1WA®e¥O³suc3Ù`fbG섌©àÁ§ê^B;ÇIïªeéÅ6:Á&c%F?²pX:£|ó.»oHŠ&Ö]唆›®ñÀDôêˆJ-ÌIRW|^6ý‚^éZ`sÇ–µì«;åTaw8bÑö]·¡8QòiO®NÙ‹r— ZÚzM™¥'˜[Õûhr¶™·åHãm ±tòƒ˜A»vкÍ1€'*) b/Ù|sUAU±¶Ó6&iîAØEPÕªÌ1Pró0Cßøw­¾¿¦9 ¤LÑ2Í®š]ô7vÝ"´Û²dÔŠ3«[Ö „+TDµºÐ«nu²_íÏ¡–µ5“Ô—.ìE¯l4îìó‘ ‡‹úsŠMÿ ÄÑ™¯]tÆrÙƒ[5!-Òt¬ë,oD;ÉÏÖ¾./&Ôæüæ’s(ð>dúîù€éPdMø¬’c$­ 0»k³Ý©t통òÆLŒ2POØŽ1ýJÖ†>”hTåŸÐð¬²0EÄ"·ÄdÌ_k¸:n…³íC W]egn,;ôIé»2ÞæY¬Õ±§Øæ–)·ˆW*]+ìUª4®uÑb¶TÛ+Œ°À½âò|Øô4DUE•FŠÀÑĈ۳V^›#S]îzá=i"™×VÍdT³M3¿øõŸ¬Z®SßòJ=_û9;=›=´¡œÕ^—нS±[Ї°¡c¨7Kp”d–úv,úÊEÞ²Ù¶µT+H¯÷V;¹ñgÀ¨S–¡ÎµW…^Uû^詘^5†·Ú)°"ã‘ÅIªç@ê÷ÔhzU„ˆ*­ßóDáÖ‚¢ìè.{¸{·G•òЂ®êmŒÜ±«ç:²)%ª0YIüêÏG÷,h­ÄÚ¡Ì;û:­Œ½Árö©(›žxD:õ+N^)ÍЮ*š^žçS…Q Õ+¥¼@U¸Þu‹iër*Ö1Ý+‹Üé>iCë’Ñž•ÇŒxY¨U´Ús¯ŸQ|1¬¶@÷&?Š4VŸ„gêÝ €™²ÓBn…žá§¹=¶3î|3üjÅ©AÐ, Õ§“øÊBÚO’u˜3q*&xSëÜ"ûáÙã^ÜëŽ{ÄM±½ÄÒs»:˜RßÏwÆñW¹Y&fW lQ^Q!¡2#výŠ5ÐMMp©Oüï@Mw`,³Ä«€§L¶‡e.úˆ+hŸ(’3eüjÆE#ïž íÙTnÃeÏAÓ^r4³]ÛµOÇü”Qö$bWèâc(úðÁV¾UålcèªOß§}!õÍ̺¹j¬ºÅÕgXœkjÀ@Ê-'‹ÚC\}Êå虿¨2zâI¥©yˆ{µm¤m®±™ªï!¡W­él¯Li +Ùå¡,€¹)€åsÍhíÕ#æH‘@çì-ÐÚÕ%vÝUŒy!Œ£ W©yè \ÇðæÖzfV™#¹8È0W¦d™¢pçäRáfjO@}ù”•; 5x5®(ͯi1/d;äöŒ#ÔGÞtZÈ}lÞè ­i÷^?5¾NÖUQ-.D;¶zØþhЉ- í2¶ÆWÙX+èÈáƒË{Ñ×fÎÝÙu2Þý?®÷è?wŠW¼O}¬'Ñ]“#«‘Ö”d5!Îlí*böë.òä<õ5^!3H4Y!)ØÊªÜœ–õ\ƒƒ!`CW%ZG k–¶ZU´$`t–Hªp3ÅMú\¯ÎÈ#¯`n€áÐvõ‚ÇgÈÔ¹’Ì5e;*lü¦(é‚^«òð\ W®8‡ –*D+˜4I×ÊÕ9ãEõÒöSHô‰'T†€îj6Jn´«¾AZNØ îs èz_NvÈÂVS×18£½Þ3 7Ä5#ÏØÓÞæÝVå)ZôC-òÊ¢¶9ìZ)BSK‹£ Ué"ìÑq·Ì:…fƒDè;W  3¡¢Ðœü¼(xP¬úAýl"•æâ•£Wcâ;}2 õð–N1ì´Y 8ñt–¼‚Ƽ.2·– ™©L·ŠÏ””ͳMÍ¥A¦™öŒþ¶‚^Űsœ•˜ÓH3Á¶¶YêrÝ•kO:êFØB’Jѵ0±ŠZãĄ̈°a“éªÁƒ{6­l1yß\ñ>¥¤½n6Jm³œ™Êžæ ”Ý]Ç iÜ£î6hOJ<æº{Äú…k#PÇiÅ£ý߇s¶õÂFUíÑÅ­°>ÿs*؇D@ý~)bQBŒ¢-1)>’m_ÉÒ;…Õj³ªl…¢ƒRo-H$åO¡Ž^YŽ÷úÕ…×Èâßv’ÒŸðèwŽltLÎë%ý@!ï[ÐR+‹Ê¤³œŠWµ&/Ôí3R%ˆØ¬¿¢WNÜ—AòÑ îèL( ¬šº§ú¡(tt\IšZ›±Ž5ù¯â½> *jÆ‚/ÿØ‘££n©3Ú6°U$¾´ZFC)™R®ïÖ® EÊ'›1ÐæjÊâ´IÓNFÆ`ß^ƒèWèà°\eÓ5qêÁµ…¶M´…À.ä9^ÿP9a±Í To†ìÅ<]ÍÂ?[)ü.h„b¹•(¼í™îo®oÜ–*e²áªiCÝóÁQ´MçÍk¸Ð@ذLpÇÔòØ~0g°òÅÖò ±Ecõv¦÷y×ä•LÛáþ(Ä}¸ÉÎAνìàs·ƒ¹¥€ÍJ謎)¡Ï½ò|èh† BT¢õnàDUÌH.C†üRïúd°´³ì•½G¬§[õ¿ùU¬þ#ó­¦/k-P®"¤ALP‘ŠÊz—"¼kp’¾"í?ˆ§$fð ñL„Z;uº„ù Pr¶pѪ ­Ó˜_9“ïÀà‘\4ðèpg>hÚ´Ç«º­äÙŸÛ+üùè¯Õ÷ÙHƒ6ËâZe§¥Î®ìýw’ÍIæXÊ}ÉçÏ[Wì`»\B+R…Èù¥ÍPÓ{´y0ÄGèvç½PÜlR§Ÿié|c†öT̽«Sˆ‘ö¦ó¢¬Òv†Æ 5&Ѱ¦4?D– ÔÙSeÌaÒØyÍÍžºésoMئ¢=¤ratÔ¢lä áŲ¦å¨/†[ј÷ÅáûÌÛxêÊæ/bRÄ^#¢"U¸Ï™Ã N”ziµõúüÊg¥¦0U™GþMaËu^IÅøTPPç4bœÕ’‘òÌ[\ûQ-ØÖ4m¯š!”›Âlçv]³sª\ò I9=²ÒXÿl¿†¸±. ”N+ó“¯47·­SH¡ÊRðl(GÛ„^¶XÆ(@¨õž´°ËX”=4 Ò ®&#YŒó”4ÉêÔk,‘k`yh¦GSŸ+(µÀèó´òÈ”x൯£Ñ£á¼O'‹ŒÐ‰V¾Xª0•"ųrôªl/Y%±‹3OCæ –ÊE~P°\zuÔ(ԃŔ‰yQªä ?Éú¥]:¬½ök#!'¾Ý ¿¾²*9mÔ:ê³õ†[£ˆ÷Ü7˜ÓDÇDP\ —W\¾±Èº¸íoŒ–’EË¢þ`”¡ržŽ©À÷Ð{A`Œ++%M‡²¹âr êã\BÄó6‹#GÑÄ)÷É]9\R·ShvSšªéoÿ#}%¥ØU¿úS½ï 5 "4ÔVv—ˆX,8EÚ’Tòš2•Îç-m©ìÕåGa…æI¤U°JÇžÕiOñÐØã𹫾“G,‰+›|Ìžô²]¹Õ¯"ݦA÷}]S¯¥H`3åëU¤Š¡ü†ÛªI)YN$í“þ³!«À‹ho¹Ž>Q–¹l7„Ýæ˜ÑÓ Ù{ph¯˜~`´æ² ¤qSg£ÃÚS q/,«½g–»EÒJŒÕËm†ÞÖC@¯Ø¾½èÙ·¸&’µRº‘úà‘žçͬè’±¸¾‚œê8ù»Tn\-oöàUÈù39– o"Y‘H[¹ƒŠd»ê9¸JhEZ®V ¢%0R-d²Pàú²Àý;„j(Ãæ‰ˆ¾¯Ý·^ÔI`M§RO%л*ze%^Á'¼cac±ŽeE)·n§@Øümjƒ!º_›¼6_ÃÖEª_ZŒ˜@YvåŸé!Ra„°³l;°œNÜ0#ã›*¨‚×F57™_‡EåÅeߦÓåµ ¶L„[ŸÅýƒ¬a Ö—C©lŦW ³¬ e̶Ä2¯ëRÌ5Öž%‚æf‘>€K¥†Ä~iXËCôCȽšOÁí®\ÿblR™º§tÛo¥Ê@x¨\((§vW™ŒéYH¦“,}LŠ”Û1Ä,®·ŸØ“¾½âÖn–ë°#¬l¥„~AŸèx–x1ý7«Î¹Nš›@é®·¿ÙB$iiŸ ûnSixÙwëJ]‡1šxäË”Ÿ-IëâØ‚‹#Ff=£"¡µ%AI†¯‰uÜ%U‚ fµYÙˆ‚^. +@Mƒ£.j¦m—Ð]+®Á”éi¶ºöjy•¸/Xéõã=‚PØv—°fÈ%û¸_ BŒè;¯N°3€lÌËP«\%Gz³D1À µe´à*½‚R\ˆqbå‹“" ßà“º1hd+zìÎQŸçFˆaãü>ŽïŃo®ìZÍ2å‚LéVbfççá5޽<Qh9]'C(ùêÎdk›KY ‘¦Äü[ˆÛlü“öT‡Q­a¸AYçXÂé¨áŽ#}^+YÆ0”‘ B?^ÝàŒMޱÝk-Ó¸æ,>‘}NÒz¹±r°Ð7Ô냣·±Žy±]—f™?„H„ *É"†®N>4‘‡«Ö.áfýïúOSúfÜeA¡•]µ¶§­ôÓVÝI*|ckƒDÙ?¹vÀ¨ÜäH›cË ‰kÆ:4¼µ4…þÁv$G;þKñ1¶“ió2Ç ‚k/'xöJ§LÛ<¤ÝÖ“áêjα‹WÜ*ÞÁ«q¯âßZg¸å̳jùö8,mÚZ±­aBB¥yUйY".!¤2ó¸·ŸŽÓ¦½|P«¯w·4R¦^ã-&ÒmõÎ+ÍŠ!H€¬ ·(ÃΨëÝ„ ²]ºŒŸÂZÏ”i>Ó±¼p÷ÑWÊ&zå?›´«za¬£µ±FSÓ4½¬Í24rPQh©mR¦±©˜§–´Q"}ɰ·J‰Zzz˜)á^5å¨LÁô®IŠ^©8š3½¬¸yγìSSÉ¡M˜ì*µŽª«¢J×[Ì,é%…ÔàYÖdYJÛ=ÆJUA×T[š›VXÀT®T-å¢7G}]~ÑÛ‚ÕÂÖwÅh® WÎÞAµR&tø3n‡0R{d¢r°yËë£L)øáhÈ#,Æ~ü±ãR_2 ¶áœkÙónp`<™A¥ ¸?emÕ¬´rÈTŸÌ%$•Ë`E=ƒ¢Ñ¦ É"ç›pÌ«ôUJwN؈$Õæ³fX*^VÏ‚ Ò9<®å~]cÉÜQ‰éN†hÔhͨ}ÂÒU³LàèÉÒ•ºÖ&á}O•œo½±¾É ¤FmÌ+JÖèK×?ÜÒôÀÔ^YÜ+j)_\‘ ›…`V“/u»ÑW•Ô•„…‰zl4MÑ®ý+JSÉK!6ª-‡l{]yž7‰TlèòYihÝØu·7"{Àx¥0´|HúfœjD­ª¤;­XR+O †³ rŒÙuŪDä¢óp™ZÖ•hz<>ÝxÜ–ÐÈãéÊF30ºW¶Zº¾*œ‹Y 5'×ÈÅnVH6y¹ W-ëˆöe–VVô°ìVOï@§ö¦[(õdna[{¾NçǬÐ-›‡k|šw•›S \@µŠš´-·%¿˜½Õ ær—nöGCBôfoê¾qÂÕ$ÊóÌ܃à L¹-ÍÖºeb˜ð¶ÞÂ5 Óc€¡UÅ®æºiÙSÀX¯óh\t*ØÇZ í{ý?SÊ+ÐÒ<˜“§ìøPï$X_™$¾®º1X'Ù3‘Õs8wÔ‚Ô±¥ïÏòé CùcÛbôJk]WÙXHqÔxQWw-6;–³íE¸&@Ig—]Šðf\³•|вdMP0çÖ“çf7nf„… î¶/ÝCv8¤ÚÛiß«ï#’>3÷à_LËEž; @q5Dæþ®ëÃRWu“Ù`Xá]I ©ôš÷vH6¡BË*MÜ8m´ Ý4+ÏxÄ<ŽP"ÀB`/3ƒÀÌ ³ÊB7ô™g=:v¡™Ø¹ù÷¼˜™!¡Sf¡À@p"²4"t-^.žÎA¢ëÁÀXט›[–ÚXس,yЪãVÑŸ¸—8ÚÁì; dTãy1Sy¿+µV´!_ ÀÐ ¥¸OA¶"‡Wæâê{$M.ÙBår«¶@4Å ŽÂ­z6á¨êª\‡œl«b¦>ôªùuqÁÉ{§(T`gjƒlFúAíIÔ¿†°6fs¹{Ã{ôLSü 'J¯aZÑÓý ¸Ÿ¸Öy{ôEϰÕÃQª…¾¹S'n'û._ þÔ*ÔËÕÜ¿Óc´ð-ÌÃølÏ,Àå&øIß#zµ oÚ3-;ºûÃî.šY·E âWÒñš¼K@oo%ÿ™5ý9!p!-)kEØ ·WIX%z•‰©#õö$2SèÊOu„¦úÜ_oˆLç® ÁGäáQ3aç Å5¢ÍÿÜU…ö¨?PU»êþý +èYÙ|aë^•è•j8¨¡WÞœ!ïgJëU¶“ÚzÊ;p‹x¿ª¹èÌrÐåÚìZ±Õ£æ3ð´VoaLJ0çÔ–/ªÈAJû,¼+š2Ü=Ë® iuâwL{­¨fW=|† V°º5u¡ÙÆ@‘½õ"ÍÿähÍöe^Ô=t¦42…ó¡"Ž ‹'àæ]¥EHÕ!ïsŽ`‚cfçæÓ`ç33»9Ñœ·üáC‘WÑ03‚€ˆLB'™ "Ëôd, lŒe¡W‡h:ŒÒo·}#Ó¡ÓV)j€€µ¥~ n°ñ2çQÏìH1:+½p;DÀZ!§Ãwø»Úº§X»×µ~.[‚ = b÷&ŒÝlTƒR]ñŠ*žËšèˆëT屿¦ß˜OjÅÝJñ†#F«)O]¼p¾#Ü~ÊÅë‚&Že7­…ƒR­éøÞ¢…­¶•›ËhSK‘ÊÇß%_çÜò|lhÖXÇËö²»!ÝéÓvV]†Ô(†:çã"ÆÉ9 <Çv.WŠöνëg¼J ó¯çõµ_^¼fê(^ÊØ¾ü]@Ìb|D98”‰ éàLçZlß óÑ„ÀN7³É%)•%*ê MÒÜ>œ´¥å_…‚^a‚ˆÎ|å°¨8£¥€zŒ– clÜWýíÉYX¿×6Ô‚‡~œílZð,˜4‡ €^e©¿3z Uœ=aç¿&çMôª"ÐÞTûÚó(7èΪ熑ɃÐD¸lù,³§~ÅÌg6ö…ú!ªG¯heÅáEøέ4EªCeFQ‡$‘¨C3!šnñúÁÚVL\§Iz&Š•ÖI-r YžŽõ´Ò²¢ÈÆ9pZ‹êv´Xx„]æNA&bfGÌαcG䘇®f8‹™É1“cǧ™Ê윓¹n]ï f·‘IN`š¦‰çd™@nY™°²eç1ßTX*ßm€±®íuˆW5T¦U½¶ÒØ÷sCfwÊÉZªRâÇK0Aç5FÛ¡µâ°uÃóõ¸WÜzCŸå*-´òA»¾µƒ —g T·ž!§lùäÕ*úXb­UÛCW^Ø*óÕãÄjå … ¥Ñ€–B8Oï ‘4֔ǠÆv\ª=Úü&=*ßXÈyv北¯ò_†€· Þ´ÎŒ{¢ ¾³r4Ñ–9(£ã–ñE¼•ÜÅÍgOoªÜxÃuì‰jÂ^õØëHÃóþôÀäät&q†?©‹¸D»ÑPû¸w¯Â–ÿI(.Ϧd‰qÞ‰¢Æ#›5UÃHÒšó Bî™>ÔäÈtXyø –yï¼/:H¿œZƒ¨tNS-êíM?W(°'­÷„µ8Ž4‡;8/(!­  ÙRµÝRÂ*³FŽ^*̪×Ï®¬0ÞtÎ>D«S7=2ò¤‘ÖãPã^†õB#Ne¹Õcsµäo­>%ŒRêåT¢Î¢ìq°pQ³æôëU­Ÿˆš]47‘R2ãžAç‡tP8^™VXLìgÛ¿SR1²›‹­O_š¦1Ÿ˜fôêäN4XÎ1óÉ9fÏÊ:-/ÏçËÎÑÜPè á‚™!-$2É$Ó$§Óüš„œL$"Äw¼°³‰È ¯äð(¡å}‰èh»Ö•ÀåƒEë[3Ä׉v$ê®ÍÊ$‰‡N0^üíz³Q¢xÓ}*+I1oFcUª=>L„픣,î[¬+ŠW•QÚƒL-Ä5ÞÈ*jŸàD]…wÌV²ñ´}°cL7eß³˜¾ÏJ楓ñ¯F"A/Yw|Ëv©p|IR§Ö=+æM~ ŠKClÏ— =hÆÎøŒd„¦¥Yë‰ñu\4¹Néo§¢lÎnѤ„Q誉hfc€4ÑÞ,5’TÐ@Éß‚5§ç ¢E·¬'Þ\ÎÎH„fâ¤}|Ù¶aeèjÛÑywÌl!ˆf<“…ÌÅ},d­b¯ì@"s{»œY᫤HµJHÕ¨Ê £ø!€âKØÄa¤ûE²¼õ¢øuè˜gìlá_[Ö›¶úlÿý¥ šËº6.Ñ2Ùét^rY›…Ùß]5°ZE³¡¢¾ëÙäÓ¥µ+Ô-)Ë™_Ž3+G™w’½×JÝ)ï• 2ksOà彪ÉÛk—“.j´¯×´™Þj¡°inÞŽXo‚°ŒíøT?¦€}£«ç¬X‘!É7¡5è±á(”í}9"Yz¡ÏÃÜH±ªô|VRƒã£ÀXƒ]˜¤‘_„ Ÿ|Ÿàbh7ë²{ýub#°Ð¬ˆÎì|:9çÍ0Õò?w:ÜÉ‘ã´rÎ9w¢¥·ÐÅÓÈ/dz†ÜÉ4M"“ÀMîîp’“L2¹I„e"YxXB`G“cfˆ cmÈÞpd¸:rn^ë :2Aì˜×èk¾0ìå•Ind-³ôJ÷ÀyhH~VÄü¬ P?XIŽ ›»›T¦žL€ì­/®<©•,ÄìF­ê¯q( ¾ÁPÓ°VÕ•u5š«C-Ý,1„ØÙpáÌ£¥)©…L¿`HG r•ÀV<**S•a•UeăNÁ¿jŒ†®öׯ ûçã0#^½DÔ‚!·ˆbñewöÈlmd肱êŠT\­×ud¶'Nn«ê·=ÀÊ{"[K˜úoìOç¶ßȼˆ¼¹‹]›º"›NjÔ%sy*µõ޵!if-u[ÖîWN¨ØèЋ[¢ÔnGzŠè‡Z×ðŠÒ“ˆøIŽ0=Ûm–úΩYÆÑ¦¶ ŠDó*Éí“Ä‘Ø0Ò´ÜP®skbóH®¡WìºâÅȤ02Ð+u‹rV«Éί¢¨Ú/¡º½ÚÅ4䬠é0!/ñSnIu?•·ý‚™VµÖ“¡ %=Ž~RýÉ“<ýQ’ìš_”̘͗j¡ýiÛ©œZ–dé‰qÄB(bŽŒf/?‰Ø ¬áVóÿ9ÿ¯à*8g|kÄ÷΀Aè ³»ªNéð˜ßéV!-Z±-çäL|b»‘;¹Ó‚^ÜÉ1»óéÄ'çNÎñÉNØbçNó{Œ÷@ïBÞùù$ïÊôÁ4MÀ·Üé>~üw=:Or7Mrw‡Óéîî“»sâ rçxn3œ„ç%ûÄ Îd†`ÀX{û >ÿKáõN±©ÚÓÕ’) o:A¥[¡!€••-S² NFï°í–ï7à¾5Úu¯ê·™¬Éý$*ð™r´…£§ WÍÎÁ’,FDX?ç“óš†tOõ΋˜³^óUSÎMš6 ]õĽÓÌT„4¶(¯jdyX=9PŒNt¤0i¡Tév°¶j³=WÑGEø•o¤·ÞS¢†bW¿ªRýØ·Ð%uo’ëM s•ꮇ)!-ÔH}4Ö­æÞxúÌöPAª»¶¥Ñ/D›luE9áhrD˜[Ý8åw¶ˆjøš 6QÜŠ–7O ‹)ÆMÕvا:’yMø çî¨][P†ÍÖ}ÕMo¢>2ÆÆY1¸Õæ<ûîP2z«ê‹1jF¯¸è|qvÆ 'Ê6}§wžg}ǵ,q‡Ñ+€˜·ùÝŽ¿}¥<^Jç‘Alµ)€¥f½™É ¬®ýÏ{Ý»éya÷è¤÷CK–눶KÍžYßÀ„h.Á17C—®ø4³Ý@P0…G—HÙo_BÅÉW\Š23¥ÀÞâ/ÒÞâ{â¥g0®ôbZ¾#Ľ‡n¦ozDÌ-ÁŠ˜ÀÄŽ˜‰O ?‹˜èÄŽØ9fG ëäÜgìÞ†¼w‡w!ï1¿GôÓG¼ô>zôèær¹¹¹ù§O¿öôéÓ§OÿìÏþì¿ûì×ß9þÃGOþóé³óÓäÜ 2¹i’iºs''“ܱ8Èt7‰œfHÀ1!çïÆz…6…¸—\õäqµû n´²Íž¨>»)6­|0¤>ÜQJ'¥]«—²á\>T©uàP “«4îC¯0èJ¼òÙ5o/õVS¦»ÚÌíµ\‹wãì•h „ãÔ¨¢ÂN¥LU<|‘o–i*Æ7Y•ã®!ëÃÒY¢CeP”°¿£@“øâyƒ±Ò½?Žך |Y³eçWèÍ€óÎjµq6Uyª’Gù+ ±¸xæ²ò6thÝöp||§,ÓÀq®Ìg(V›Ç™‘Bû:ª\‡å\Q¹À6ê_2]5E*3t@ 91`*åg¥öŒPKŠàǤ‰nk¦ŠEk-oÁÈÐ+‡E[C5&ÔÚEÔX{¯Ä›¾/ÎŒz¡UÏkQúM€+AÎ÷í ˆýóyh_ÑзJzůO.kCÀÊn€–#–¯o#(qÐ}§‹°’ÄÌÀ ^c%la6 ±‹úPªÊöÝ|+:Ñ+¶n¶t¤nI+¶®7̱Íq®}Á#½~!áÓvW•t©g}zU»7Û o¾öƒn%azˆñÛ(¨çÙò†ªP´Ï<4ÔÉoV³—”’PÒ}áÙÞ¥*F¥A öF.³œa–:|Ñ\g¢E)ØÅÿ4˰{ŠÖ¬Aåü9±§\ñ‰‰I,bv8Ž; g ŒÎ b7ëd}ü|º{çï½#òs¦w‰~É|:N§ÓÍÍÍííí³gÏ~ãÙ³oÜÞ¾öÚkÏž=»¹¹9ŸÏ§Óé|>;ç¼õÖ[ï½÷Þïî~ð«O¾w:ýûŸ¼v~t:ÝMÓÝiš¦éÎÝMÓÄÂNdšˆØašî„܉Hæ=0f’9Úƒç•Q›Ñ®4‰¬ÃQ¯EÔx%æK£lAG”ÄÕú&¥÷ =g ³ê÷6OXl4gä6¢¹ò&N–E^àq|ÇUÕ-©½²èØÌ¸ º²(¸žÛ9§¢î ¾GŸF 2n’åTË%6«àz³tõ;n¥Svýë°%dvÓ/¹l/Ót¯=$¡\×ëzÁiýJÆæ¼†¹`³”¦iPŸýJFj9ch«­C¬36iZ9†:ò$AYÉ¢Õ"® ZŒƒ(Éø>½ºÏ*ພãè|Õ1¹Î}id)*ß+ÃaâmicÞ)I‡Ø“”Ö¥³%o¼P¬r)+¤ü-mƒ¼œËÍR¨NHÒ ^j·XÇ×E <«ÕGîo6 ¾wŸÉXÎ×÷nî~o=ðy3bítö„‹$«öäˆRåªTŠïÒ}©E¹\Mô ¯¢Û53DzÔXkùqj t¥°¯Þ^~±¶ÍÓØ™‰\9úq%”CíQծ؃M÷ý¨º˜~rY計dÃ|0ۉ 2~ ±Dúè’Zãe„ësà<Órž7¼´ª0ØðÈéÒ»©ûdöm%¡I‡iÅÆ½ÄÞ#ææD$hÁ­˜(°´x†­/暎™ú˜ñÎÝÝËizòxx[äC¢«º\.Ïž={öìÙ—ž=ûöó篽öÚk¯½vssó(ú™å±8ú™ÏàK_úÒoþæo¾ûî»o¿ýöŸOÓŸÿêÓ¿w:ÿÑ£GOÏg¹»»›NŽïätšîîdâ;ç¦Ïî§3äB‰'ÏÀðT,òÚaˆL!_ëó5}6Oº,7ê•È\DPQ–d(·¢\p©gÐH”%-cß½8T²CY¾ã-ÏXŠÍnuó°ÈØ‘êW4wEžÐ¹$9íSÐK†–*†ÀyÄnjÛЫÍ~£åHç2]òGz>Ç=ÌbÞÎ\9™d—.o,@eà&èoÖÂC花¥ÑµÀ©æjò@ÎîãÈß ÈÞq‚'ˆ¬~4”Ï\×À âqZØYzaZÊúLFÊa,Ôó¼7µÓø•oð(±fî!‹À=|ôrDÅ[cM—àjC†L>Ž¡#­‡tØ“Ÿ$5®öñ¸.€Ï  ajj_F ZaÿNY_+½„ýL7”Ôˆ ÀÚÖRD;T’Íœ9¤øÒVÐ>2ƾóZ3®W¢Âák]S™œßQ¨t_sw e%š¤É<äSêbF†á Ü+.Ï'Õ·VΆ®¨ÚJ„ûQw®ÝÉSÀ›wÆ9¹Õ%ÙXì4®Jt¡!±Bòg‹–¬ V@Ǧåá+6…Ž žõrÿ5Ú%ʺ¥Àóý×$õ9µð‹o×LäDÚd*´ˆù …š“ÇJ$bOd°‘™tÉŽV;t?ß`^#¼}7½˜î^NÓËI^LÓ‹iú%„™Ïçóår¹}öìööökÏž=þüõ×_öìÙ“'O?~üèÑ£óù|>Ÿ™yƪN§ÓìN("ìÕ—çWq>Ÿ=zôÍo~ó7ÞøéOúÎ;ïüëiú¿~õÉß?ÿþãǦ“s§éî3fçø³Ïܙعé³Ï΂éäDàdN –kp ‰`,½º*°{íæÁk‹vá^®IZ„z²eeÛ™º ÷’ê?gÔn Ûï Ìu¤Eºœ*ÄÆ¶.rýh´IôÊõ³®ÊV^fbr…!û¤«ykiLÏhÜ¥Jå¹§a«Ex¼¿µ Þb]œ– fg¹F©y~Ç£oúi*ŽÀ»D!Kõœ>Él€™bÛ=ÿ=ÛâEó ¶Çâí¡/ÃÜPø¡502i†Ón-zË€Š.*ŽãhÓk:ñÈFÑzqaj„¶rÎÁö½ÙOrEÌ£ZÛmN¸Ç»Æç}« ñ҄Iú³Ž0-LÃÄßkW6ÄCç#ú@1^>XÓ'ɤ²Êw†ƒ îBÉŠ@íF™í]ºuÑN^¹C7ÿû<8’NÜí(=Œ³Ñp=*ƒ¢¤ƒ¥ü*¢gû–éðžåŸ¬e9 §¦ïá9^ËÚR²³×#¥äL¿ "¼e%ˆeÛ¹•˜v¢Wé¯Áx@ñ8ì$׃ íÀ2tsM:\òüpPé`XͼÉl* O*$[Hf·+)Wêì«•Uݧ¢8-k*NÉV³g:ùàN@ÔÂ=,Èãûú¨ÎFªìr¢\ÂK«c(Gë>SMD¹…²Œ^un­ËΨ µˆ¦J¡ÛO¤Zˆ¦‚æý)år*—ѱ’Y;i8|Þ'!‘™§ßGÚ¼ºy a±%ìã˜iž‡¯˜ìºüMbp­a[Çêa%¢ü}ˆéÊûcÄ`‚ ¨\¨á …ŽÇ4ߦ¢C+>ˆÁöE¯(F¯ ³æÂ‹ç±€˜öCõHßuDe„æl"Qw­(È÷Úa°ð(@¥FEΓânùvÏÀr9ms‹ÍØÜ¸Ë·ãX°”žú}¢Ø¸Ê*Ç ‚Óz ããå’í+DÇ­l¤ž\ÉuïRÖº ï½j JgÈ +\¿%̃$UWÛÎËiÊ•µ³ë8ýrì{Ã1ÐÆ\“ª¤QÔâ.ìæ˜}ãy¿WÅëN1ó)k€ÑÔÍ#W`r÷¥/û(ñ Å#a1ELâ§?buЉàd©d8 \~ñ̽òåÀò_ocºª¢èã°4.úë`"ú…àm¹{ûnz9ݽ”éå4½œ¦O"zúôéÅÿü[··3VõôéÓ€RÍDªpA´šÅ&çNÓ3­Dd†¥N§S˜#á ÙÜ €gÏž}÷»ßýàƒÞ|óÍ>øàO~ý«?¦ÿàÑãß?ŸÂg|&‰ô™ 8a&°ñ +ŒÅ¾Ã,tXãçÀ)ö¯¡3Á¾ÓFw.5§dAÁеxy…šÍ qý8>/²¦– õ^Zö%õë·°øjÛ:ë:òõçd¼ ƒTŠÓ’(j%¼t¯Ê×d ¯¨Å§"ã%_%ÂT4 Äü`׸kSΛ8—ªñÙ=âⲌiU§Zgòø€Ï±`ú:ø†÷°ÜPä!Zy=]c ûDO?UO%P`xN“ë2”-iAÚ³ å7^!i¡²ì(}i–…«L‡÷2è ÑuËÃZYé¬üû1"¼^Êî€fmùä–D½BßìÖY õ«R‹]®V¿FX¥ií¤ÆŸ\[–íebr1‘b]dìGMØ®ÓO¶Ã{Üžÿ)Æ‘e°ÆuÙ©K6Wà¾-ÁðhMʱՄn÷@ûuŒ Ë“]‹ÍÜ“èdàX‰n.ÎࢤͥçBÄ‹DMC¯Òïs ímd´bº2÷l5irÝÉ5·FZ_“Ý"Ú€Œæ–¾"é­V‰{ðÒ9-_ÔrQÉ×·•lͬFæfæ5‹RNóªÅÝÀˆOBÝÝ÷ÜÍÆ:\ÑÐJÍô×Ñʈôv„Þ7‹5º¥…PØgˆ'N—…®Å±{lѦ0[1-×Åž¤ ޱé¹í†W¬Ê1% †ð`’À;&azòÎÝôr’·ez[¦Óôrš~ 0óår¹<»½\.·—Ë÷.—gÏž=þüÉ“'« T)#¦"`¾Å¤¡À¨šÑ+$ ô ~Í¿*á°Š1ók¯½ö½ï}ïç?ÿù›o¾ùþûïÿô¿ŠüGçÇßc{GDr a‘å¬ x >Í]„ó}¥¼²Rý Gšø|}Ÿp„ÞëSuÊBwžöU¿ñÞðÔ¨£d¼ã•tq“¦_m 5õPem«É’‹1*R,^'?(mD70×ÃCÕÉ‘÷¹ò¥h‰nîVÛ¢²ÐsC1¡¯(9ÓŒŒÕKEbãïèFÀ»˜@P@¢ûIrTï3%èÐii!æØOäAÑᘇPl<,'Éz°mWË%°–l/²UNE¾z¨4µ©‘=™0Öõ +²Äò ÑIÚü]Ì»S­A^¿ÿR”pžm—àmP`%š«y®Û/¡\j*¾7þ¬øBhè•TA·àÀÈ/A4¿ÂŠ.§q‰ªfˆ+zµt.g ¶! ЏW•{v”ˆñD,È‘cn ›µl¬Ïa‰1B–ñOÕ³F6"ˆ†yå¤×˜|±Fv ™² ¢zÅIZÊF{`½:UϤrJ zÕw¨ka«LþSÜ$ßcÓ»ûPä¦n©ƒ¦K{{«£G‡r[ÖÂFrÉ#Úuý;™ÜWo³ýO6¡P5I:ç<Š0à2vÑ‚ç{ÊX˜NÌ1á¼}&!̬s¼7zlºd¿ÏX•óGœõ§¼få,A+ap~T2a1¤Ÿà™GDïazûNÞž¦™TõbšÞ¹faõ˳ç—ËåõËå«—ËóçÏŸ={wÿ^ÕØp²ÓèKÖétZý€™s"2“°æ_e`™w^~¾ð…/<{öìåË—?üá_|øáûñÇ_þñ£'wiØžÇ;†™˜™àæl€‰Áìek¼‘cc±±¡÷¹èÎÃ9l?K^õ ¨œBE±#kéà"õ`¨fÁ7v—:ZqØ€]ŽÅ°¸ª‰Y_µ¹šöœ¬C`í¿Žuq*s‹µ¿Tº#;k¹ÿY·¿(Ší(¶ã²£0nú[ÖæJRQ¤:K²(³êR U½•™ ”#ŠV;7o]椱¯²€ ]; ÎȆJI¯‹øP+{ÔÐ+¥d­œ$ØGÎŒK£±çþÔ|yyþõ«¼•$¿“Y;Àe¿‘Ãê#üád جñÇ<:ø{Æóð™ç“=󟳡‹þxäéÑtÒZ$ ±)Ô Z92ÓÜ#ºL@¿¹a#íT%{'‘^•€×yãú/?úè·Ùýñ“'ÿ&»Ïgb&º#:ÍtÎ ¢°Ü,™å£˜ÀãÚ‘6•ÞUgÇ!ëé+¤_õíêSÇý­#pÎÙ‚ZÅxŽTZ+€×ýüð=2õØ¡:/ÜÙ™SVy^Q{çZb(e»Õ08ª}±‚Ñ;ã´nÐd ŠÏö6Î\¡R1¬ÊÑúÍŽãò¶HŠJ7B®d2âÕF¯Ð€®¤¢ÁVÐNZIDAœ&s+$¢f‘†y‹:ÚcISÉaR*U^¬ÑCí’V"£V=²y÷HkàY¬« ÔkÆ×x“™$ŒÎùÕ‘3Ao¯¾XÞJØÍ®•0 §÷JC…@(äð¢U€FZt-]Xj)¨•ÔV˜zCÒ°s¬¤ŠJ‡7s5>H÷“’ä^Ä‚w]ÐäùØ4qO¦%¾S¹€†&3j;³zŠcqÆ­«r• ΃ó¾;VMœ OS µBÏ›³g‘zÿy’D¶Á…ÄUœ"z%{Ðe‹ß² ¸µÓ¨Þ6XF@l¤H:¤ùãîk0ÛÀ RD¯7UAÀG˜rÚ"+A5Q޳¾¦’]ŸåÊ÷¦GW¬&¯Êr8®ãκÐ]ÆÑßS9öe{f;N뢙™_yD‹(ƒcN!]žß—FH¸ÅpµXZà²(c[‰¤àTŽGW<›‘2Ÿ±ù/ ¨Jïb¨^Nòrš^Êôóiæ§OŸÞÜÜÌbU_½½ý­››×^{-kœíÿ¶áP£¹1»*€P‘Q½ €ÔÌÌ*5ƒVÓ4Íéîînò?_úÒ—^ýõ7ß|óG?üáŸÿêÓÿû£_þ;çóßÜ|…O¼HöcÉ“rN¼HÎû²ÏžåÒ.ãmÂXÛææ6ñøxgïT)‡ÖâÁ«Àà‘õÏŠ‰m4û–x,’iµ6,#q×fÞ– œö0Xbí®‚sñqRY¨¦ñ—¸¸ƒ(’“ì‡É¬š÷xù]…mzà¡E¼7H„v,Q6ã›6*|ŒÄ·äŒ°öú¤‰;wq²¸×Ö+ßQÒøìrŒE¹95¾ÚR}Ödª]¡ŠJzÈ {ƒáåA1ô]¸Øuõ­A쟌 WQª²-¸Õþư«<#tÈ•Tj ljB¤MÁtÀˆ=P+餫J‰5^\áPAsZx~Œ"`í5ÕË~=3 ‘ÙyÒ‘  ¼cé\cf2›¦S¥° ðRbUbLÉ Vè¿Ñ›4` ôØúå}Ð=îŠa¡Ø|Ä΃ªœèeçkßµ hnÜY»ËHò^LŽ Évõ•,ýʉW.œê\E×ЫJÏ`à w?YG×úi²“bb?æö¡8õb3PÑÄ%:îä“~ÈÎ*S¨øm\h·f®ýýÂzQ*YR¼<ˆÈû=VUvÈò2˜™‹©åÂÖt*âžîN3˜YGÁ3ò˜HæN½€ÂÌ,*`îâã蹂g[†`¸\%¾ÿtáRE‚ÓÌÀg„wfˆ*âUý\„ @ÕårùÆåòÝÛÛÛÛÛÇÏ@Õ£GN§ÓVuU<ËÚà tªù§$[Åï èÕŒXÍèUÀ°æ7¼ñÆ_þò—ô£½ùæ›ÿǧŸþ«>ú£'OÿÉÍÍoœNBpÌwÑÞ21ËŒ]γx'“[`,d.I膱ŽjïÝ|Cü› €ý¾{•PS”"m=5‡‹Ú§iä$„>HQ=ƒþÝÙ"=íÍh* ŽØZÁ«%hÀ³¤F^e ‘Õ2LJWW [{;nudÆx%Ó1Z.1SiïþV"Ö³¶££)´ó+JP©¨Ò­Õ¦c †+%*`c|»Vnšý 01—¾Ç‘U¹1½¤éZر+ »Sðµzm¬nü$ƒÊ#µ•QÒ)š¡M‡œEÕÝø4ï{¼ù?í[L±¯Ìp¼X]±õÚë§Ö•6ÁZwŒÆBD,PgPáTý3d­ÚD‹?(T½œ˜H8ˆÕÈ…<µú- Xœ»3±»Ît¦ÏÛ†‡Ý16¡˜µmNÖ 9nžŒ­u¦¢ÁÑÿ²Ó.í] ýq&£Ê-Òâ¼~Š;²7î«v\úTûoû'o7Å«ïØÉBȵòmদ&§b,†µ¡Æc´wj›úc+s­ó¢š=€¨ŒÄÈ)j½õ¼%vEÒ×QÁ)Ñq°¬*‘`°¤Nóó¹$›ä¹+yæ=ñÒâ·$ZáëÎÞ4·‚ç¦3FÚ4ã(40.¥Cø¿Ùs˜~z9ݽð¤ªÓÝËizOät>_.—ËkÏg¬êÛ77¿w{{{{èTó_œs*œ«¡¿l³2Z–ú£žL¼ èÕü—ùõù ιoûÛ_ûÚ×~øÃþô'?ùß>ýäO?ýä=yúÇ—Ëåtb‚0$ìÕ æÓ šØ+ú/TYÂBòK: 1cÝS™d|´­‘ K<¶~Ð:«Ö1ds¿@žÒYØtÚˆcKŽdõß«í#‚Ý 3T¨)²IU•3¾×5“#—aªÀX|è$ª½|剘âÆ¥Så){áªLïº/Ô ,ž(>N™ÆÖ¾Ò7mUŒ¦ %µ¡Ú£ƒÂ•ARüTÈTÀšžÊ°ëH0! µØA5ÝC*®MW¨‰CoŒ(Á÷Xó$3I -Ð7Ú³¦Ÿ l)²ã££êh¾æ5–P[»Ý6Ë+ /ÁÀ=¤¡¸ûÆB?=•ÍbÊ &ÛI`Ì/ùNZ¶ÕG㻆¢DÊö©NUxÀj°.çå'-|7§ª÷“Pc$e,Òç±vt‹i¯‹Xéò"¾é"¼t•DzÐĶ*'ãÒDŽ(lVž8›GPêöx›Ïp¶à²Ñ« ˆs­-Ù=ÐÕæñzcVF9ÁÍ¡YYùØgˆsMìË;dµ«ú@›z½Û°ª5wñÍ‘#•¾AÍ‘£¥=€a•Ÿ¿óï¼ñÆ?øÁþê¯þêþô“ùé'ÿøæòßÞ>ž™tLš˜ÁìÖщ D$y–9Ë…± ¥Ge«Û„fa W{òWìˆ-Í÷ˆõ¹©·Æ°,2$W©æ§Óë'ˆî«ìÕ™Ll¬ð[[–bõÑ‚v¢Wž'»Zë=[VîXüg6s¯”c4(KÆ´åÁF]® ’¢¯/ËTÐg;³åz{³ fÏ­žO9?5…I‰û×Ú>lAPòzíØr&)3"ü'YrÅ^¤Z`zµj 54QºêÙ]Vc”®f5¯“eÑüu+”2O„E ‹šûÜÛÆÞñÁM0ŽŽîÍ?jôâà µcÆBÅC‡ù²†äJdw˜/yèHsAƒhZV€NŠÔÛkÐê!O¾%~D£Oÿ¼5±ä±nÛk®ÖWšwœ¦¤=@@…cÏ)Ý=f|¬F‡Ì¡gaËÛ·«(ëó¯å´-zm@ŒÐ•±âªÐ§èg•¢[èWNk`m!éÉ9,#¸ÕΔ”wfQ}ùS ûæÖ'ÌP®:"ä;Ê¥þšÕ«o}¡q³˜:x%¨úV°*2°ª¹PìáZ¢ 3Ù•Wµ©µ¯0Bl J ?¬sÛƒÑsžð,,<)`ec-þ€is"xÅ‹n/šILŽx†ÝlsGøx1MoOÓ[wÓ‹iz!Ó‹iú¸¹¹¹¹¹¹¼öÚ Q}ïr™3^U)õJ¦k| 4ÍÖ¬sÒC"Š;c+†®DÖôàr¹üÞïýÞ7¿ùÍïÿûo¿ýöÿøÉÇòé'|¹ý‡OoÎðh#HÀ¹“cÁãV<‹¦ùÿy‹ dáÙzÈL­E½Y`_#cîΊ¤$Õu ƒl™-ýºD†µZ±5-GàR®¨ªX®¿èàÀfa—bÜ«9ar–Å o]ëG‹.ÎWÛWËÔ¸Êuê(QÖ-Õï˜*œm.Á æM1g _˵ÛIo„EÊÈ‚Wïàˆ±‘ˆuón7<ªGb;¦¼Aüîcjk{zº¤ËK†Òº+6£‚¯‰*–‚âíO ÈÕö7Üy "'°¢9;´ì¶yˆQ¥§ÚV•¨NWŒ;wÁ»ÕE0¨x•`Õù²X «lSÎÀ‹NRÏdA9‘솮¼q¾èœàP2ÔæÑR ‡U›^•ËloçÁÙb²¯ÉX‰”w¶€ÌšìÊ™€—æxœ'È:ù*jÖ*š99”ÿ4†Áe ¶óȸùD’ãTÝzÍ`6W9œBÛYWµdÁÍØ\æU𣘱e˜RvéѲâ¨w?Qr§mÀSøxd¤¤G•»•@Økê¬*ðªJÖ¡+xØ‹>úêý“‹°*Îññ ¬s·ZxU¡¤÷È‘óBé³ü[DXÌ–¾_^Ç ÑbM¸´9ÎXÕ‡"/E^LòbšÞšîÞšä­éîÓH¬êæææµËå+—ËÍÍͬQg½ª‡‰4ÝžUò°â_ ¬¬…0tfÐUüÏŸ?ÿƒ?øƒ÷ßÿ/þâ/Þ{ï½ÿþ£_þOüOooÿÁÓbž·ÇkHMD'&S0¡gÚÀ¢ÌÏvœÛIË:doÖ‚æ{4¼öd´?gY\œ·ãóÿ³Œ‰©úÚõu›RüV:ÜÓ¨æ9\mÐãA芴_ÁÎF–LgÜ\€q}íß÷Ǿms¤K…"¨®ôÔ 1Í™›ÑOÄ·ÏoÐÝ šç—ް%”B9©q#*$I9¾¤¸ÇÎnÅÓ ÛÎ8ÜOƒT¢6‡róÜŠ:Ö’ÐÚÉÍá&*OäNu±v.všU쀳޾aÈŠzZˆóŠË2]O®úǯy%0h„8Ùcµz@” ™Vg_¹–#d€…7‹IȲu²ò¿KÚ"â Wªr›2`>$v•"Yñ ºBOŠ€è Œj&Ô9ÏcÃÚ ðîöóÞ4QæÏݯ÷†—Xk‰ ³¥ÁNéVW®] Ö’£:^ÇE od²…QM—k+ Š–„Î-fÓŽ±?‹ÜP¶mØ¢‰IŒHí9 Γ° žüÜœÆj‘`í ÕðíÛÀïퟃ‡èU銳}XUz„TÜJê\ôŠ©Aj}÷ˆæ0ß 8s²`ÑPÀÓi9á¥os&dÍôKçÙìLýƒ z’wÓ‹izK¦ww=MoMÓÝù|¹\nnaõ߸¹yãryúôiŒR½ªC0 +M÷ƒgU¾Ñ"a1sÜ3£Wtÿ|á _øÃ?üÃwÞyçûßÿþû¿øÅýËÿÅÇÿ³ÛÛ?|ò”A¼ˆ¸Ã/¯n=ÌÌ=ai0–\Ó¹¢¿$ƒÁÔèß­7 ó1ç<“÷± K’CÙtè=Ï(½äcŸ45Ì:¤Õo¢Wïh«ô Zùè•ó2õeL᫽yèPÆø%ÜaqàúfS¶}lÊ‹oÌꅕͽðÿ™“Lƒ+¹Æeæ©ÿ«Ã6|-6Ù}¦ñÞT?“Dº°ö)ñ©Jÿ %â3ÿÿÔÝ’…ã„VÑF²Ú‹ç¸Qí ;Õ…ÚÆŠÅøCZ†ÌV'Itø@aøº“uš›ìl´Í íqî¼@ ­é¬ŸóÜŒöy¢ã#Ãðùj¬‹8òDÔó9½o\¤¡±æ~æ°ç¢€\l-™Ëª¯AÂðêtHGZM⣠eåsÉÑZ¤§)ËŽ“wÆšÕ±5›:°±IËN e~ܰ÷à zÇæµ¥|•¿Ý~¥YmÄË"å‹WÁ:¯Ðƒ ™'o—Â5”º²Â«*æ¬ÇªV,XŪ8ŪVÐ+TÜŒ1­—Àn¥àVæÚâ*ê¼0Ö™i‘ˆfÈ2øv2Èa!Z:f!0Ñ»ÓôbšÞ𦷦»wwoMÓ_O=º\.7ϰê7/—o].j`Àª>¿ä©{óTú}…±^{‰^¡µâ|éK_úò—¿ü×ý×?øÁ^~üñ?ÿðßúøãÿìöÙ¿ýøñÚH‰„Á‹dY¼[ /hÆâMIÿf‹’Î.’ѽL¹6Œ€Ö¹ÍÑXzŽÃæ¾(€Ž |¹tæjɰk€¡0Á›Æpr°Íúå.3`-V d- }Ý‚|å÷o>¦ß°Y‰÷¤AIj0Tš*<ŒbøêßÇ1âöWÿ{f6˜‡Ë Nhcâ‡Jµ¾HŠ2¤sÊ …^•¨+&3Õåj1ßçM‹yµ²HÉnÐfðÍÐËwìˆ(Ð_AÏ]ý¥ÍNЏžÝfU)47¥Õ¯°>›†RMüÁGcq0Ï%‚ÛbW vò«›¾¦?àkùè“Ï•ü–N¢¼}p†G+!a™¸•÷¸Jr>Ë(þU©„Up¯Ö‚rѽJá6Ö²O¶½®—Gp+Ö=Ndú7‰ó¼¹gT[;0McÃÓ7ݧl?8^•…UET)½Q`†U­í¾c/´žG:˜ÎðL+ÿNÞ:p>¦‹ì8g%õy•r`.”àçësDÑ¿øø£ÿå“O^L=zt¹\.ÏnçNÀ¿s¹|ûryüøqÜ8ÿÔ‘¿1̀DzÀ:A«ð3ÃUá/CÐU|¶_ýêW¿ò•¯üìg?ûÑ~ô“O?ý/~ñþïžý§··¿õè1ÏŽ–ÀÜ?ʽša,!0í~·,ü¢j×±¡V»½êIp›è•z&câèÝgŽîúº|ÍàÐwLR³OAÅjŽ,΂NUҒϰÖeSK0ì×{tŽØXMØÆËØÖ¬˜i°e®ÍÄ«‡€[m(ö’Ǿh1òöóï‹#Фš\®×y=¤ÒÇÑ^íê-à3àf1>ôÏ4¢¡'[^ia\©©~µP\jSP% OÐŽ;"­7³±³¢µh¬~Ò›‡¨hgRÉÛBˆîpm *ôÔ¸ 6©nÍ) ¶ŒRÑLÙ:µ¶¦B@]á1y~RLi”¢k/rŠœ;M48ûÏDõÁ3IzplÀLÕ×ÏCãÌtÿ6ý°&ÍÞh ì@ÁØcXö{Úª‰È®†õh@•úJ©ÚÎé‘ñéôتè•3Nƒ#ܪcÒî ÷‚GS5·#øŽ½Ç{ß„ä2âiëtx%9Kxø9ìl£ ºeÄ„öÿiÉ„¥ÛàúrnbU³KÔQX3(ÁªüXðÞ‚ñ`ã„rå”Ëaf¢s¤œÍaØózÓÂ=:Í_@8„é±Í’ §…„µh<ÿ‹ÿßÏ~ýÏ?øàÃ×_ÿ­ï~÷·ooŸfã8ésލÖ+TN N#éÖPÓémúŠZÿ‘-Q!š>ôf€š{çgŠ´p¯`^¸BO[_ÕË!Ú›ç*ìÒjbd¹ç¢¶è|®ªóg.ˆ P±jã½MÒ<(6øÅ± š,4N’ZÞÇõ#+2UAö/˜,õ++"Á˜³Ë/1Ã+q,‚‘ÈËt Pü¦ÏÉaÖŽÁ-Š,¯&b°À¬ ªÅ‘¶w5ålRåºX•ŽM… Ú{Ê£Ô¡e¥õäu·êT¶&‹×|™[ˆŠ7›O“<5Ò×ÔÄÀ ²gk|Àpb\ˆa•†’å¯U… 2„U媽Ìñ|q Ó92;qœûǸ•;-ûtËd8aYC¯ò³²•oT±c Pæ¿3»§»ÿæÃÿ¥ÈßýÝßýî׿þúë¯?yò¤‚üm@šîá[šðS©Š5Y"×á~è*þ9NßúÖ·ÞxãÿøÇ?ùÉOþÏÏ>û×ï½ûž>ýg—Û/žÎ “ȱø^WNž`+Aëf¦ÁÎÛ„~qé|ܬ›~Ô*+é™Þ.´1ñ a·áW·“ìtÜLì~¨ƒS°•mË%zVð‚û\¢W%ëÙ­PUÂYçînA~ ÊëGcX ~Å3Tà6 } –¤fMä>òm°TYé€ÂüóZ PBZF„*©г²^„E9>’…ùÈ”Ö*—Œ¹qýÈE{²Ô}®¹$Ô€˜…à2ƒÊ3åjm¸H­Æ[–-îy=uaâ?#v5À°›c…Ž_@R¨Q«0•†µˆ R‚q0榎L ¨{߮ijÌÛ"¢d8¶[‹¿|ñ¼}l u<ítõÖ«òÖÝŽ\yóJ‡-¹ú~kTsO«å¤ò:íø芫/²Â\eסêÞØD]­°®Ë¶p!Я›ý3Èlñuòâ(ÙY|l%±Q9Q],žicU¼ «r‘AL~OxŒ¼4y•‹¾ÎÍ'ã<¶Å‹ /þƒË^9vŽg!ö¹lyqÑæöD®ùßn¾SÀŸ|üÑõË_¾þõ¯ÿ{¿ýÛ_øâoooÕp÷ÿ3§ÿ– •-:¥Öûè*þ9ŸÏ¿ó;¿óo|ãG?úÑÏ~ö³?ýõ¯ÿ÷_ýê=½ù'··ÏÉM3&fïô:ÃX‹¼ÿüË9×frËTJo‹ð)m³“òPÉ*z8RúŽñÕûû½.öHJAM¤;3³Þ¼ÑÊוã+c¾øª÷ n~FÍ›Ã-µã :Ãüº¾Î)|:¿‚¥NÕ·=mŽa#1ïKVúê3Ó©‘«WÔ”ÓPÐÛsÚ”>ì>Æ`E›®Óà‡b•\äëu--£±K}Û‚½¤:¬5ÞO ^â ¿b^A2ËÔrø}­‚I¯tÑ6A%¹þn‰²,d;çxvq•îUÓ74©¥Œ+S8jØ8ÇÁd£ØUt£[’s98ܕ󀂎œõ©¦3 ìÂÖÅì¤÷ÙIaÛŠ`…Úσ‹'¸uCÎÆY¥×é-0C:º.PGŒÐ‡R•@øû$!†¹€Ezê®ÚªÍŽ|±6–"}êu O¡Bã5k$#+Í•¢°\G¸ji]×nD31äAyW>R÷˜z®u¶É±¨ïß"UÌ¥²É+Û.4 ^Geóu±*naUk‰Ã9V尪РÈîÿcï]c5ËÒ³°÷]ßwêœSU=uë®ê{Ï¥=Óž¾LÛ3B‚Qlq‰1‚‘8,E"!HAB „äGDQ$ B JP" –-a¢$†¶ƒḫ»§{º«/SÕUÕU]·ó­'?Öe¯µ×í]{ïïÔ©ê:öÌœúÎþöeíuyßg=ï󰻙Ȩ`ø:³£M±Ñ!R¦Ü’lÍ ¥_¹Á©lý 6H\Á ­˜Þ<8ø/®]{gÿ¥o}ëñÇ?uêÔz½–¿ùGxÖä«dÁ©c•þ“zDº{aww÷¥—^úâ¿xñâÅK—.ýìÛ?ûÖìÿWŸØeÚ!Ú@ÃH¸;BŸ“o' hE³fn{c™œM!Ëæ4´ŠÂÉÜ*«ª$ûš*T‚î%ùçoOëik‡›öj!Zô t;Ò¨…(Yi#M—³©ÞWÌ+À 5;{@ªc@L^`PÈTš‰[ÉjÛC¯zº-SÙ$F’Ñe¼aj¼‹1­J !›Ä顺*-!saAJß:Y,¯Þâ¸Èl©:·W¶74å•ûCkboj”£N€_m ĪÁ4RÈÆGæNëä}á3B6 ŒXÖ3e6îšJ ;\:€t¼ š&+‰?b„lô†tâIÇcZgWB£ôÌ SAKš@PæÒܧ¬ÜÏZ8xŽÎ‚q¤¨Â\hýzY‘Aåtâ.åL>Mv©x ]5Ñ«,¹©‰^Ù+ þ ñj,¼T‚³ iBAÕ¢I+VþOÓ>¡ÒBåUK£yäò¬ –2ˆŒ•‰LP)Ä•T-`U>ï`U>Tõålb1Vj±G 3;(Ê|®â³Ù“8@9=xå=—ÖÊù*(0)RîWF°l,c5hïGã6ðW?½þ?ݹó¥_üuÏ?êÔ©ýýýGHÓ¡]¥Äêõ Õè¯Ûƒ®Â/îïï¿òÊ+/¼ðÂÅ‹?þøãÿåö­Ÿ½}ëwîŸø¡ýý5“&bhmúÀDÚõam4Ö ©œÍø0½Újc!cÉc¾«+;½ººÙ³\<³NžµÔ‘ewhóOf‡%Iæ‘FG)8©,Ðõ€RÉúO}ÓHAåï­ÈºjJ\uËd¦ËÙvÂT®FhÒ;qÅ{³âù¢ÌUwß \ £Âm˜>XÉ ¨àÀ$·µ÷™`SûpT²ëìa9­ºuË2çÒíráü\ŽŠ“ãàĨjuYH«.Û!ñülÄuIR(”O80i(ïÿ#Fc‡*ò˜Mi[Ñ`FŠFqáëÖó8<Æ5NöB>ˆ¢ZÝ3- W:à„!ˆ³ ˜n]¥„S¯'®߉$zc%Àœe =e€ÙÏYÀ·âÖ$[7bÇÉ¡0%\¬ÂJ?É¡WËfà£TA¨Q ¨ªÑ¡ÚþÈD`RÄ÷Ž­„oÂx.xSV<(Õ‡&^å‚x.d œÒžMÍ€:c¬ŠG]‹™ÊòüÓ±*ëùWÀªÿ°„U ŸÇX;Q06d1‡U1sc#8•òùÛò-ņqÅŠ µ=F™ "°e͵wRÀÏß¹ýŸ_»¦ÎŸÿu/¾xæìÙÇ{l¾4{¢C±|°ð¬z‘àdjtþó±Ç{ýõׯ^½úÆo|òÉ'ÿí›ïÖÍ=qò7ïí+uvcKÈ ÐÌš°i3€•1•1'µq lmaÆê­Ê™™+êBe-m“„rvHZgÌ»&>Mÿ­“L¾Ñ»Êd2aÔbîÙ •¦ ÑšAªÚaÑ«: ׋gM\ßgŒšR¼„Y}UÑ"†}‡LGZP>BFイs~ަ€f.MÕ¡ oYO4ÄL "†rB:òþm¹ÄÖÐ+Tr9”<ÒŽ -¿ÇÂl@ðޱgÛ†¹ J‡CÁñY_jXÐ n† )[!‹ø‹"ö¾xÂ^G·N[¦nÁH_q™±Õߘ¨I艰®·¶^¢ïñöºé¡@\=Å}¼)ÊÔ)ZÙð.ÝúRñ?¹p~aÙ` B«tB¶<Š™¸{– .]õд†ú<Œn¸ß˜§z ¼q¨;qmÒ“1?[È¥næÃÆ/ˆ*¦Øå6M±ªÅ!p`U$ðc¬ÊQ¬Ã#öŸ3_Œ3ÿg‘©¡_¹O8¨C°0ZØû‰Ñ+v9  ž×ÂT@T–üÅÄ–ièY’mcâkzóŸ]½ú0¿ôo\¸páÔ©S;;;T®n{°À¦ÏJ«ÓKŒJ ·]…?§OŸþÖ·¾uùòå7ÞxãúõëÿÝOÿîg7üÄÉoíîQ ¼ÉÖ…”]Ešq$di6x=yÉ,J`¬Ñ"ÕE 9ßaé"¬Q9¡.F©SЋܠÿ‹ƒ1ºžO(Š)ŽL*Ûi©z&õÈW•.§̦ìjŹe[qf3 å{›¼jû›×âf¯Ä õ@‘—´¥Yrp±x˜ U%Î0‹Hò=ˆSç‘\E— 'ÇäÛ@ # 2³ƒ™‘à ý nåO›|ÞÔâÉÊHqÎŒ‹)4Œ&BÀ"`¦²X•Œ-•ºAûe Ñ‹ô”:È.øñb²¥5±kÒÀxP͉!L;FN»¨`HíiÙožy\MŽ˜¤:YcñnÐÜÔ\ÏìfBh´ÒóýXuØs.ž›¬ã=̺ú)ÉÔRS#êÒ~B3šAá0U’T.Í(9ÜÁÉWÊ@.ÏèNJ5ƒÜãaÄåà›Û…ÇÆÉ?<»‹æsExQ'ø6§œv~ë´$© ”wÜ×ë‹ï"HÈ¡WQ‘²usй¯O#¬Š#ôm2V5˜¦X•Á£¬ø”°ÆP”-Ü@4€• Á8ÈâfåÿÊVdÅÖ'Ú’@˨"°r¦5Šœ„–ÃÅ(ÿÏ;·ÿô'Ÿì=ýô¯ÿ¾ï;sæÌñãÇ2¨~‰£‰šv„Ó³5k ·^ùŸsçÎ;wîÃ?¼xñâÇ7nüן^á³Ï~âä‰WŽí*¢ ˆÙæÕ Ú0¯yZi»Ý`{«-œKŠyP¶ çB`q˜é\w8XxèJ7öBG`ë§I–x¢Ø7ŵp´^ T–9ÉR B¤Ê«*ùä™3gV«ÕÑAšbÔ¬t ¡ÊU½®pÄÌZº ~òÉ'/\¸ðÞ{ï½ùæ›ß½uëÏ_»öÒzç÷ž<ñ•݆,hiCDÌvÛ è¢›ÆŠ„±Ð‚±Éd§z5IU õ@ˆ_ ŸË-—² FiäÃ.¬¼]ÙoºªWŽ˜ã3d‹Ócô Õ •6Uù)*µ+úky”¤õ*l? <|ûp..&“O8b™ 4î"t‡éÔ}€äz—š³¸oò@óE”>D©¯A”ž¤ª1’”¯‘ù…ûM$JM‡ªÝ*'Ð.,qÑ$9Ï`L«Ð±^—XêûG1Lkÿ&“=¡3wI-3ŒsøWY摳8b îRcv»£4Œ ‘°)!€¨êu7ŒÄZ!ºeŸBfþr(#$Sÿ‹Þ/NÞ¾÷sY‰­^œ¨cØ¡«úŸÆ!`pjåш*SR¼­"«rÿðksvÛ–ë@`p„¥Îl-”iŠhT¶IsÚê£íH„´•ÍØà­qoyó»Á¢R¹· yÁa—ÊE®ÊÝŽ‘ïw¬£½"÷q± tN5±ª0бª6%t¾ X•¿+e‰><Û¾l™àŽ_ã4ƒM¹•¡´8"•;aºêH0¥DÊil™±o™n̬ñ+÷îþ—/ßzüñ_÷µ¯={öäÉ“¦û…gQÁ° ·¢Á`ëÐUøû³Ï>ûôÓO¿ûî»o¿ýö¯Ý¾ý_½ú;Ç~âä‰gÖ;èb K9ËãÊìÃýT ícgZ‚±0/‘8´4¯uošt%Kc("ÉŒ)JÈ E 4Ad5úÜø{Ô³!^SB$°µ¯˜óàŽŠ7ÑJƒ,CÓºdÔ²»ë͈™{¢_9z5c¨ .GÝ—ƒ²š¢uù »»?ºâñõJ)¥@kf`€±4‘bkZ£ ŠÙn=YO¨ ŒÕô/¿ïpUý®Ò“¶!æ4ÁXîãÖ´Y.Sâ=T¦ ‚b):0A T“”¾¨rb[4ÒO-ô.é®8YU·M¨Bär¼G2"fÜ•°7×GS ùD«>«zð¶2é#ÈÃÂÜcМ¥ê鮘æ†>“Z·Zeu~í×î[(QEŽz²çE6GC¹‹f& ØlfíóÌB šË¬ø "FÞÞw$žŸèÐÑ5è?} èšHœ…›Z[fDÏnÝgÉb¯SŒ™N}"è:C`ë-4Æá¼bÁÏ:?\¸‚`È.²œLQÅ?ŒáÓFgÓøRR9(×ä–ºɤÓSôÊJÀ8ÙB•‹AÂUÚSÕòo5€þ¿Â}=gסâVa U…C¿U9$’“§ôGžtd:ªB:’[G‚úÈ@6}h”1VaRF®Ê#4WÈ"8ƒb¤ŠMTðfzTPø©<ÓÊ•áyŠ9îy_?r%‡díüT«âVЦؕŒxe®›3•zþË0Pìo`ç:it®UŒ8ævù»u*Zä5³L¡ßUa‚²²Ùİ{ŠFH[ëËwþÄ÷¾÷ÝÇûæ·¿}îܹ/|á áºøi:"W ¯UÃ:Lôªyðz½~ñÅŸ{î¹·Þzë½÷Þû…ƒƒ_¸zå_ÙÛÿÇOœd½ÃÔý2}¯5óf`c±±É±#*ÆŠ¯Í2-Ï#’¶3# ÝsÂFŒ±9—´}:ë¹Â¬ˆ׳`ÖèŸ©æ‹ Âe¡¼fsár²Ý Ë*^Ç#Ã4 ñ°Äâ^9•NN(‘£óGZ›3DCž6²x{¡ÏB§¿3„ÇRO9áCVHتšBÇüÓ‘Ë@¸ J 5P#m.u½¸YÒgòÿë 8!“âq¹ëŽœ SQª.«„%žü¡(M’7†Î–ìøÚê x­±òT†ØñGò[%=õ(ÓšbI,.CK(ŒÄÒs•à*a Mn Ek;¨/‘Sª…H<âMB¹ù`ý„)†•µþ‘H'TÌ3ÿé^©h’ ˜&ÌT’Ƥ¡¤lÐ|¾ªBWy]ªá>x``çÇËÇqùµð"=ZÞÔ©Y$ç6½‡(NQP­æ±|¨DbŒF8,x}°@Ëi¨õc5¾%¨à „)Ž5¤ÈaBö„`VLƒf–EÐî©…2ÅN”ÁªÔðÉ«b&XOC«ÏEBç|-­øzfù›[A*›ªÃ*³³Ï†`œÙV”*bÃJVŒöµó>„$}™&ýŸ^ÿsׯ?ýå/ÿà /œ>}zww÷ÒtÔ®’Ê`Ý4jòÁ»»»/½ôÒ¿øÅ‹/~ðÁ?w÷ÎÏß¾õÃûÇäø‰=`c$ïˆÀ¬ÍÌì𬠓 a,;å 0Z0Ö­$À¡WKÅOÂhsî>µ’™€”åÂt/ …¡+aÙ6µÊ ³è• ¾?H-V‹)Þ š¼ Ë¿Ø´’´€·ª tùƒ5 ½xFutOçR’ï2ÓfR§ÃGE÷PºSܪÝÛƒ•v£'É‚(7lŸóï°Œ›õ˜¸¢þ’õefÆ›å1uUÙn‰†–D»=‹ó“­jLóƒ1ˆ&ªXröT”‘jëgB¬tFf@°{K2‰è^ «tZŒ@1^.ÀËXݸç XÂÄmB[p©¬ÄvšªÔú.²Ut¡ª;as«SµÐ«Tæpä+W À˜pÒ脪ܪÌYñ‡Ÿ(ÎO쨰5lÍ"jƒæ‘ï¤ÅæA£OT’6¸ö·ú&wT†¤¡xб î8fZ ˜£§A‘kS×§,ÜÄlêâ‚7®|àA윀ƒ ±«Àv-Áɪk©°°´€U©«r%{OÊbUÍʱ°˜ÌÁNöçè)c*öõo[…æ‰J mè :[-èú§rå’ üý·œŽ{@`q¼ á¦Öòò忯ÔËßüæã?~êÔ)¥ÚŠ„aßÃz•.â•üBÛƒ®ÂŸýýýW^yå‹_üâo¼ññÇÿí;·îÖ­ßqüøoÝ?¾fÒ¬@v†Ñ<ó`e ¯rŽQBZ2+¼ï¬¬ÞÊ WzB\!’E˜òÇC‚+ûm铪$Ú®Èôb@Y¨¥`Iœã^™ÝƒHÕ°A¶j†gÛhmaŽ*¢‡åzLN7½ÝCÚ§Ì—ýIK ëN9~°I}ÐrÌ’€V=ò`ï×[ZȬí¤)䒠̱º@ƒ›[9E„re’v,ô$æ€ñÇAèh(ÅSGhÀÃÊ'2X´×4Q ï¼+‰”»Œ_1qHdFtÞ·Bî ÊS¸ë÷d÷¶J>Ñ¡'èGWRbׂ¯[‹Oµî½*§ÿ„vCGcýh!‚•P¯D2ÅqàÌ ¢ Vf'³r0Åx ʦ ¬b&­Ê{w‰ž·- KeÔU\6˜Š+!>&sc‰K`4G1ªŠA«Ìjîhr3 ],x͆†*HP]u »'lOS=¡ˆA´ þ¼™É)•S£€gdàE¤˜ühd"bv0“A¸`YBž!e¤TP8ÀÊ)”;™-+¯ÑÎ¾îƒ X•aU`UzUŒUù ák j‘"Wfh¨YÊwÚ¡§øÇ!EÊ·›ÿ܉ªyr™µ¥°‘NÛ+²+§æ%= «E™¼Ÿùí»wÿÈGßxüño}íkgÏžÝßß?Ê0Ð#<‹ÊŃ“ùY‡]…_ûñ'¾½»ODšX6>´rϯóC`S¨À.Z* !³Ç=¯¶ÃØJ #î7íj ™¦v…Ä]§xgµÞ _# ™/f5Ôë8ÔÈRD¡u —Ïß¼mžúDT&L ›«§èu™Èd|?¾§º›ý±kF¸gú‹úß¹óQܱµÓ²¸ª§œ ^êF‰! õ¿D"‰kù‹u >)¥NYܪ誹êk°4\‹¥PŽäh¨ ÌÍѱáÀÙ!ý6ˆQ馕Áº´ï&è± »ïhl¦“U£T‡˜‹#†NÕã!G-iåé©/‹'–N_E7v4ð/L󢞀@¡åݳ¥…­‚^e#ÈôÀ+§Ë”;‰¡(¤‚Y0‹B@'HÅxç£íRWÆy‘&†éáV³å*ç>÷øŠ¼úÐ Llø;Љa(Tƒ6¹¡D©@pÐpø/*fåòL)¥,°åÑ(‡y¶¥*,äH©}²rø“:¡˜yпcU#ñàÈ<Àd«I\)pܘ·Ë£«¾þ‰Â;w'y±›²CWéîØ6¾Éê¡á <=ÍJ)ÖD+ fÚ€­S#Ó™j¬?å“ÿæöí—_ý‰'ž8sæŒG•é=(`l=ƒÐê”›÷vøÄ«ìϹsçÎ;÷á‡^¼xñêÍ›éÆ¿óÙg?qüä«{»šˆ™4ìæ¶ád™ç4cm+åF®¢Ð³yˋ״œ°à³FlÄ[Î\ÒÌs3Mªb›¹= ¾ºÙØ”ŸT¢—.AñfP”¥\‰Ð+Ž˜P’€Ü«&t5 ƒëÿÒ …—s +A½ I­eŠÍÞé#cWT[ˆBq–ôâ=úî] SGó§Sˆõüv‚ÐJ«‘õ`¡Òëœ'+0}³3dÉ/è|h‰Ã@nTÊr§äÛ“§îd„Kœ¤Òzá<†¾šUæùšùàì©ëI.LÛñ×Þ’td%]·,ð¶±®@øé<ø´8.ð±\ÊmeÖÕß)o+©¹g•°(®#Ç#¬ —@…M:>óŠšØ%±xR;”ƒ›îm îŒ#U&8Á)O’¢U1+e2GXqÃZ‘¡„è•ÞX¹Š9å˜hkw-+=Ææ•³<ÔeX…bêLL¼r'b&#ó8–‹dyd‘zzŠU9ÌáP¬g@ÃCÐÈJÚ§ÅŒA ÉÀÉ:M Xå¥ÁöµØ¡Ñ–s‚hÅ ,ßÚÞ “6Hî 00Óÿ̈_Óôƒ~eoï›ßúÖ¹sçNž<ùP"Môp±ÀJ§Më tUÁ¶Žtþ\¸páÂ… ï½÷Þ[o½ué³Ïþ§׾vkç÷ž8ñ¥c;k"ÍÄÀ†Y9%e Ò!†­ÊyÂÍ-|xXÕV¨4vÒ3®UÉûÐ+,qýê¶™ØRó`–‡Õõ€#DL ÖÇŠu71„EÅ+a„ dÑ‚0¢h^ -í­EÆŽä¡x”´dÅ,Œò;Ï™ÑÂͽˆ÷û-@q]m«CÈÌ—R/†«KÎ?]„¦ : ÐbòEN­ià–ÀÓz½õ7SܬçÞ½‚ÓèÈúzÔ`âSEW딢ʢËsÇYç¸S3ÌB³M p¡pÖª_“ºÛ×’±¯kkz¥ ‰+:$¤/÷ÒîO0hšk]D“Ji¹ÔŸEbAÑÜ“aQ¡ÒžPVoOþÄ¥ƒ7Àä)§‚Úý 7ïãvæz™ù±Ìãº/+z Í>¬ðè=.EËoFJle}#½*¦ |—C.‡ÎŒ®Ö Æ­EëAÿÛ"ÑfcR¿r )ãYW¾(ÏÈ®¯AŠÝ?ÄÕ*~YŠÈ8Öy¬Š}wf¹Ï=¯ÊŸÐžœmÁ“£P9*uÖ•×–"¥\ᇖÕkrè› vÈíí±«"ïë纇X•áI…XUT«8T“ú~é–ðb zY˜¼òz\œBtˆqð&#øº:˜v˜ åŠì6;ð7®_ÿSW®~套ž~úé³gÏ®V«GHÓtO³š¦„uå®ä_TJ½ð Ï<óÌw¾ówÞyçWîÜùå«WÿÅc»¿ûĉÇ×+MÄКH;GN´ã…jGÅbWNHF;,'#rŸð,Dë5R£žE³Yl1^C±ì a)ôHÿ”>z!„\'$BëþÑÓÁP0[¯t9ÔÐjWôç¼2˜ðÞr×ß^×Eò‹^XÑoþ­¢…^QO±0DÃó-BüŠÅ£ñåQíº8¢¹r rõ:O¿:š’¦õÀÆ×xY sM‘˜Ûæ*2 j›þ6›fÕ©F`…¨/ÜcviɈÙ2ÀR…¢óxîÕh1PÕè-:¨,}íåñBý~£4‹^†Ž p"O¹ZYu*^™ÂL êWÓÊþƒ.™B6ö'4ņæ´Jù7² à˜»D;VÁ}P=WĬ²+”¤8ô dRP ÅCÇP‰¶zÄÞbp Æn{˜UTHè6ØáÕ¸àåÜá~ñXSÄ— }4°„ñâbÐ×€‡=ìûά›mGü îHrŽ6JÑÄ~—Рÿè£ÿû»÷^ýxâ‰'N:µ^óiº¿WI +Øöº_ÐUø³^¯¿ò•¯<÷Üso¿ýöw¿ûÝt÷î?üäÊoÙÛû]ÇOœRjä 7Ä m¦x€4Ó ´qT,†3ÞŒ1,>Z3ðü¦QÉ”/&4˜Ÿ™0DÅò42«ÑŽÂ?ÉéTì …‘|G [µœÐ/úãø!A¯šåüÓ «‹¡¢FIøDÕ’nÉår@Ek]ûpÉUB¬Ž‚†¬d [®‹rÖèðTCà¯Êlj‡ŸÞzÒ1 ½BçüS¨Úëk)dP§6ᥠþrXQéN«²œŒa-°‚HkR+–• 6>A¶,eJËÌ7(DÊÖDè˜Å·r²›y•f‘Z6mCcIŸBqúúH_¢Fe2J«èpQ Äv»žáíK»¨Ë¢å &p«›¦^,!œ„¡FqìÑâX»$§¤×÷R‚ úÜ [ îJ «Áå@3ûšK3’z½&¼Å…ΔÆC¬ØF*"ÄfÑ+%ð{΄Y&&U CU8ª,@»÷ëßåн,¾cgHg¬™W<™¯D‰ñŠ DåÊ ‰Ñ D¬CŠÍ·B‡>"úDë>:8øh³ù`³1¿üÁS§~èÄ å€›•1 TÌ8º"6•À#¾+Fp§¤Î±¶:Y…ó¡튉 ‹‘x_BcUÕØÑ;8`\E¿•Í^xÞaq®‚ReøRC__é^Ÿ¢ˆKÂŽÌ–xEö^]\ÍŠ í×o?õþ¿°sìðüñãÇ?€Ü«ÀýÈO­Aõ%ü@WáϱcǾúÕ¯>ÿüóo¾ùæ¥K—þþÝ»ÿàÊåÞßÿ‘'öÉÂW¦•“Dz˜¶±¿afËp⼘³ Ãƒ:¼Êê‚Þ*‡dŇ쎗®Ä®JÔŠùHÀÃ* oS'19ýpi);³ó¸S æÒó «Ì=è›®nògEÄRK‹°éä(‡Xš¤v¦¾—` ž6ê*ðWÑ4±Ç«Ž†5ᤣ=¢Eœ©yx!Bc›¦V$/;=JÑ”g3ªÒ²PH—|?´rÇ6œ.³–¶À3eꆮܛ ½º‡ºÇ6àÊé\8Ôò,ROÂCO>4# 4ÆØGy 'ûâ–yVÛ(/ã,“³¦êž ü6kn\BPófíXŒE‹ŸÛ¶Êî[r!‚áò/!’C©þEŸA>r!ã”)êÊLj҉%쌦°Ø*³r,ú(”ä±";…þ‚ÌlB¸³S̱á`ñÙ*MMNÝWü™6T†Íļvµ~kF1¯e+þ˜)weõÚº¹·Ø£ïm6ßsÕ‡m6o6¼³³ç~ö÷÷÷´ÞóÍßvüø.Ç®‚Ê–Z ‹@f·È•õ±ËOíÃs·h…HÊ,S þöÈKS)2Â^¦ÚÈ’šúè§ïÞý¹[·~ûñã¿mMÄà m+ִؤj¿j"Öluü|l{h$,á¦Ézõ´(MçîZL‰4ÐíÃj%r'Áæ¦e–„U¯°P¹XW"—Î9:Re…åñlLÞLðË@ µ©]•öÿx^5—CàJ%¦ššS‰WÑaÈéÙ: jù´¹`â(,€À—=L¤i[øÕ–ïóo>PåדհëÅ}èï•“µ¢¤×ÒðsP/:Ø|´Ù|´Ù|ïà`½»k`*Wßß~oo½^ïìì¬×ëÕjuóæÍþÏÿùžÊT2»j€PÖdp]h61T†½"´€ˆœÕÕèÅýˆ“¡§ˆHkÿ{ ¡É¾DÊTK)92 †ûÖÝ»¿ÿÝ÷6O>õÊ÷}ßÙ³gwvvî#@ó5›s•ôÂU^roG½òŸ°’%Æs2ÕXålJL9]qÚRAôªtõLâL$7N¢–ÙÇ6,&Z’ö+båÙUÌ;D+fE¬k"¥ÔʸÝW6C­úxc±ªO´^;¶···ü„ÁªžÚÛûÒÞžªÂŸÕje„Þ‰èÎ;}ôÑ­+W~ì©§v­‚º -ÇŠ[2”Rè¸3+'…p¬QXw1nÈòæˆN–+¨/$—Y)*o…õz^â ì5¼‚rA€ÖÐä<0³xgÞP< #¨O*(v‘ˆ²)9i£‚å3Xé+úÅÛ·ÿÀ;ïŸýò—¿òüóçÎë’lh` ‡ÌyÐÆtrLƉè*ü9}úô7¿ùÍ+W®¼ñÆ×®]ûë·>ûé[Ÿýøþ‰aowM8жÒy£Y)&ͪ2g)žZ£ƒ–bn¦Z¡rª|_¢t¨ìTöyÎV;m4³ ȰD'4ôÅ9Ÿ£6BÁëŠãŠÈÌ|-%^©j[…ÑH´¢¦+b®‹†ž#þr̬J)SöBÎÆe$KqxÏù¼c´ 0¤-lj‡j]eÏÍi[ž[Êügª#ç«{ÈÂÌ+Ö©âRz*ØVˆê¥uU­Î¦—~S<£/…ÏÊ,‘ðîíº‡„MAôF[Ç£´ÊŽkS™²ûX¼ÄYm;äP8Ì«Yì–B×[àiØÜ¤v;ä}@9=¨"2N9 ýµ\ÁPî Ûu“OÔä$|Þ«{_ 2’YE‰™M£Ê‘Yû2g²}Ew%ªC èW¥åŸ“{Hqªxà¥gh®N|¼è(õô+rÒWk"E½Z3¯ˆVÌÀu½¹ªõ•ƒÍe½¹¼Ù|¼Ù\Óú˜áUýôÓ÷ßÿÇNž8µZ)&‚Õ‰<­ï¡©ú³µ?RÞÚÏ;"PÚhPŠýÂÁUN³ÝxùyéuÓÚJÕ°ªA¯*q f‹))úGéçÞ=ç¶)8(øU¾pl½rûh±¸Iµ MËœôï}zó§.}øEg8è1ÄÏ9 ô@³ÀÆŠŠoÍ`óà³gÏ~ûÛßþðÃß|óÍëŸ~ú—?»ñwnöcûÇ_=v쀘A+ƒa¤f‹ô5`Þ&ž†{›t(IŒ–JX P¶Å)eóææ.ýœxµ²,«NޝÇg$¢mW¦±J:Ñm #Žœ#}vûÎðrƒBæ6VB¯µ³³³Z­ ¯ª”a¦ÙûÁÁÁz½¾{÷îõëׯ}üñï{ê©cƵP±Qãg«ôd%°¼š”òŒ(ƒ+¹ÞUô±b¯”î°+ •¬ØWóì ƒe¡uvö}þ„ˆâýÉR\˲9GµâìRÀ!%3䇩c¡dG´2šHVªšh°Wú«—¯þ™ËŸ¼ôÊ«O>ùäéÓ§n‰[ÔlÄÞöˆCWòã/\¸pþüùK—.½ùæ›}öÙuóÆWn­~÷‰ã_^Û0­ˆ¬àEä ¶Ä`«ÏE§ЃØ/k£¯2'ŸìÊ”‘đͨ&÷»£˜!甄“8–ɺ f‰ÃÊZóÙÔMøÎ¸õ'ŽçnÎÈ3P¸äp0Ù7ų(‡…6²Ãy}IN=ö ;()Ç$ºÈæ~( TMŸ¦îü$˜ÇT‚úqv(Pˆ-Þy=“?œ*Á¥Ëú¶š.Bˆ+aÖ¹Mž”1u_ÝOQ¼j_æ Ì÷-îEhî”qo·Ôt]ø¹Ï5–¾šÖ·ÑXãßžEÓÄäQ…Õ«†´ö·&6§½ª²5òÐà-ÑO!B²žÐß·Gmœ¼Ìôrð² ÃÞ÷!ܽ¤€‹[© *¿ˆ"½Ÿc4J1'Â%C  šëš\Üôñ VÅSÞàR³¶ñžSoß»w]kóÿW7›;Ì{Áω½½s{{»»»ëÜÏœ'ÒZ›º§O?ýôÒ¥K¿ëĉó;kkbèá(ËŠ²Jg¦8Ðø=®ØË¬+&—µyÿÉ@D×Z+Œ,‹ <,ÓUy‹ÙõKtÚ9bPñ8Ñô|WÌukNÕ®H Y‹‡GxÏnW°H·"÷ßf&€“Æú³—>þooÞzõ¯Ÿ?þ±Ç;àæžuÈWIë³è•ä“mCW´(ñ*{üÓO?ýÔSO½ûî»ßùÎwÞùì³?wýú«;;ÿÚñãO®Ö+ÃL„-›Ð&òTƒ5/ ã+f‹Î³Ó0¢¥˜)c9µ¡íý´xšgé 9À÷:æ|€öv[Å&¢zñ°;IûãÒ «‡…~¡P¹ÃÉ$ÒhcBÍ ï[ˆQuý,¿1UMFþ6:nÙòL.[:rÿí•î‡I½“Ã…²¯¹|÷f)8ÖKÂZ*í@7< Ö4À@È–âZªáU ÌÉ!B0Œƒ›súkÑËF° 9åån à”Ù³Ÿ†–bëXëa·ðåÌUëu¸oc\ržìÝB°Ï”¤<ζCn©€ýh¨&ÎUòÁ[·¦¬®ñ¯‰V[T,WeC;ÔCnc°Ù-X°W†`+/$]Mµì–3×â‘ÛŸUÙQ…¨Vr²ÌáÖê½Z¾Ü¨ܣ爈4røï<Ý@ «Ò]ÍN%%Þ±„P4²H*ÁºJÊRý¸ý•¸3º" GMq›óN÷:,Šj ‹0±=QTNŸÊsD—márs dÉì¶–‚5%ƒuJÐÀÀŠ—U÷•¥àR?ëÝùéyË$ŸO¹% ˜=88ÛÀÝhîjŽ 0ÿß:G×o– ruo0‚8â^±*€¹„Ô\9½RL#ª ç„Û³ah6°«ÃsXhüT¬RŒ¨‚ÀZ)ÕÅÊ™Ÿ½ß»wowww³ÙܸqãƒK—þÈ“O®ÝËu¦ƒ@2ë®^ƈвxxaÌÃþT:±ûOŠ/e“ú Ê0Ì?9ê%9Qma@¤ cl‘a1¸W”r¯|˜ «ðçØ±c_ýêWŸþù·ÞzëÒ¥KÿèÎtõêoÞÝû—ïï΢xW¼ÃÝx>Õ£U í”e!÷ÌÊfA­­ÖÚF:lX0¢Géj`€ A1˜SŽ‚äÃòÆæàCößwIÂV‘D»Q$£âÈ ”¨ ðÈ\«P-H1³¾þ²¸lC&Üâ.xƒ)¡É¶™¹@Åj&]»ÙòžŸ–UMÓÍð„ÊùÂe\ÝÕ`mLdGB4r8×m øÒ‚XlÒ~»Ä’’n-W•îÔŸFt@ ÿ±Ð×uÜ'÷g„&FVw?ŒþªçQB$Ý`Aün È/úHC ZaÊEõp$%aÈ”gpVÔ²ZôzÊâÖc”TZ¹gÕ(fâÔ,ÃÀŠ[¶DÒšR* ¨œ´Ø÷ñß ²s<¦ë£³T­ˆ„${¹ãÈÒœ/å Ñ«lÕ 'kY©£|ÝWrIVŠAÓ s²¤\ ß,¡Åä„r3{?8805‰7nÜøðÃÿ¥cǾzlǔʺB±ò¸Ûò> =-¤Jµ V W5’¥J ™3‚Ô5ö”úÅ TŽW•ó(YH¸WTD¯Lg°Â3ÿÎÛïý¬æW_}õüùóÇŽ„œ‹­A°¯TWèé-Á³*SNzëÂ"¨°…Y®´R ¨XjR.®Šñ¨p~(àoBùÒøÜ”wZ˜ ˜»µ¤:Ÿu¨6cñùKzßËÈsgD®ËÎN]Ó¦–c5fÑŠ#{?Yý`GOŒ©çrQ w;,#_`!x·Ôs„12Ý`z¤€Ý~v”¯#З®ÎE¶±lŒÄ±Ž÷“þ¬¿®[Ý!â.3F@oŸGÏø­ÀÃí¡–6%š` aìIȳ‹À墤>ä@µ(ÞŽ+9ÞÕä$¼ã IÑ+Ž…hiof(9ÏÊÆÖLõ‡–½ß»wo_kýé§Ÿ¾ÿþûñ‰Çw\a m"+v;7Öj4îØ’°…bº©Ð•ß° °'[_À#‰)u%fˆU¥š#DŠ o¤ÚÔ¡D±‰Ëm+`ˆlpm%ÛÍVù`ñÂ=à¾ýÞ?€zå•— zõ@7ð¬ú +' QKfÖzJõ௲ŸþøãTê÷÷\[nñ„µ˜´bíʽv%'ÊJ³Ãy  ŒœT*i¦‰{àN´*°ªJâêÆ…·Á…ÒJ×êRôÊ쀬÷ ÿÐÅw×/¿üõ½z€›E„Ø>< ÁÏbÓÑÃ]…ÿY¦® ƒ-ˆ¦Eiëˆ Y‚OeŠ¿…¬+cEB0¨9Ñr惥edŠ[6…ˆÃlºATÙZcHÓÕŠèFF‰kydŽÔ¦ÝÒF'È› g;PQ§žK "r­Vj‡îÊJØ¢€¥ëYÀÆ1ÈhG]hë8ÄÜë¤*ßÚZ˜nÀ›Œð4 'M=†Š¼ˆº Kòɲ ž>tjɇ  äöŸ¥»mmÛ OÁžmÒ0E¬N, >[7 ¿f×#šNžb¯³Oâa(†&VÂVˆGɰ¬”ve–™úÊAܱ…;ý^RÉvIÏàIXMä+£QU¨Í¢WÙ_TRt}…‹òÚ,~(!HTRQ•¼ ^ѱl²Ø2rBÁÑ4€àÎ;†~uãÆ÷ßÿ/œ9­¬4ÁÒ©˜)bÃHgew€Ø×ŒrPééM?±â8Ïà$í°µ!qmp$ˆ•8Ò>sÑÚ|’~½»/"ý€­ÔEx™&˜ULûK‡‡Î.q×H¤¦«`èŒ(“Þ&ã˜ðŽü}¬Ò¦ ÚS´¦Xô å[Õ2÷ùÂhˆÆçlò§Ô`e’S%NPH]¹þÕ* «ÊpÑ$öÂpt(ßšƒ^M<=„³€ôŠè9ír0Si~^ýw7’A»&ˆùôö±5Õ¡%$Šå§å(JñËo±Ç[aÝ"‘š›Š]¤P—]«Cqå21 #Ö¿Ó-{µõ{NKÝÕ}Ù UÅAmU¨„•¢W¡–bÁT.iœ…jà²øIµÀ¸fèòà\&ÑJ¬ë¶šºo6ó§;wî\»víÌíÛ?òälwÈ häŒ^»|]!¬G!“*Üt¯V<§rˆ3g`©LžÁ匤Žz–%8F¯ÂÔ Ú€Õi…!¼aèéú­KÿëÍ«¯¾úÄOôêsÜ|nñ¬ðB%ÿÁôº¥;ùBWŦØN‰ßa«ÀÙXªwùpÚíðT:Òd×å@©c¨Èò­âc(«pRU[(Q1§3uTVrÌnŽHÞÑUÙ ràs›áF©ÂTe¸Š{ «ôŠM‹½° ;a,UN¡Qw4Îv‰QH›¨€Ñ’èUÆMpz›í^ m&;Ê ëdÞ#qvš@§ÈQ­Ên n¿žàŒEÕ±@{gÿ  Ö㿆 5aŠñW„a+€kì^¨C¢ÓË5s'Îè½ øšô€Îãɦ•UÍŽ˜IìÂqWob©½c¤c™±ÚMªà•„Ú‡•ÚÊÞ¨ -²NxÚ6×`¢ÿ·¼Ý’0LhÝÉÈE÷9$7¦UÓS‹½&z5–Hˆb0‚F„ÕU•Ð9ÂÐ+®ôs".Œô }á>yo×VÓżÔýÎ;»»»DtóæÍ?þø_ì$14)e•ÈŒìÛ‚>#ÑNÆf•)(4ö+ìSæHy %åð¬¢, V¸*#ýž\¥8ïŒ31›…O;Ó#âȉ‰4<Ö‡ÐïÁø‚ý—ï}ô×®ÝüÆ7¾Q©|äå÷yÀ³HVEø°BW“/îž©…Pî†ÕÒoåÜãgÏëbI€X§€#JëFÉ%áÖ(©"C^]+œ¥U~Nޕ߽Gªš8©ÜÜ_‡®T T2=4# P˜ãËÚŽª$JÖ=ܺL9„î¤ZT•Ù-.4,XnœçJE0‡SžÆÕ‚\wîËT6ÎÂàJ&>¤&Z‰ÞzÞÏ€¶à75—ŠMfºç ½egaH«; ž˜ô,ávBA³5¢Ehl° £& °¿øWÔ7Æ*!Jv¥Cžuöœ¨°îZü$jv,«×Â2^$Xl‚©õ†|Àš¹’žúQ¹jOrÍ'‰^åc>ΤÿÜš£9¹sŽeT®£¨ê -ü3Y‘*<¾À¶lKô­õÁÁÁþþ¾Öú³Ï>»rùòïyúÉ€ ç0)å¶»•¯êHX̤‰IYRâÊRVÁ?3hW+cR^sa®áÒÔƒ¤HÕ§†9 :°u‘€¥r[ÏA¿³ b¢¿þÁ÷þ‡Ÿ¼öê«O<ñ„A ?oÀÍ#<+{Z3´³"Yþº<‰†ù€Ê] ,lAÐýP¡+¿úcnÀräŠBÔˆr"¢¸Œ|唪y¤²QWŸL/ÆI‘s4Ks+äðÅq¥‡ªNIX`‚C ’ã<rÀYI+½Uäê KiÀœÁ(“4Í‹õp\ú$¬ï‹^%Ç”éÄÓ S÷ä+{ ÏÉædDà2ÿDÿЯOh,Ì%¥ÚùÇø.Wð lsÊÅ„W"B,òY®.<ƒýÍi9(ÚÙqèG¹à2¨+)Ôbj<Û^]…‹ï´G]˜ÿ螢Êä®gÁ2¯²Éùì‘lo %åµRˆj­+Aü4¬Éí“ÀÓ£oørvŽë*ãÆ1¨#zÂ÷Ç#Q1î«Ä=#]®‘òfVW&©,ý*kñS¸Ñ°jksb ú%1ŒñΧ'7®rï6òê;wî;vŒˆnݺuåÊ•X¯^ØYIv3˜ð«"emÅ õ%dMªå¶§9Á¡FúV\D¬²]!¤f•àª:VåY GªñH •£ê¯€lÑ«°4Œ¿ýñ'ò;¾òÚkç/\Øßßÿ|7Ÿg<+['X:á"÷ÿ@Ë]e¾ 0GÂOp‹õjÚÛ\"‘X"'™ªœ:Žtó…ÓwK]`àÕ‘Ö¸W(/gñ”Š.t¹4Ù3rTið–jUáòsÕõæÝ Ç8Q‰DºYÒ¹¯Ä$H‚Eb¡îúA$»W²X¨zÂØ¦2qvZ Ì&¿It¥ ï„£=r¶d±šË’†r<¹2 ¿ 0 Ε˜Ô¼O @V‘p^P÷ío@«X­yêz1îjXÌ10ÐZ)uŸ‹¨–Eom@MŸ ®l=ËH²¿ç‘1| ‹Lsr¸¤"™ÄHIIRoX/ ƒøÆÒvÈ÷–ábRqºô…BºÊR,ͺÙ³,y/”Û´ô01<èæã¡ôÒÓ!N 3 %caå åx[#rÖHÐAŹN>2‰6Ï+lXUí]rÛA´h’/–nøÓÜ«X${p÷îÝ/|á DtóæÍï}ï{øä &)«9vELl6@5±RVâÝl’›_àÉi»GºeeÐJˆX•àªÜ¶>Jhh*°ÆãÁë{‹âÁ‹È¦Ô`ö¶h@´ïí¢8 üoŸ|úSo|÷û_~åÂ… 'Nœø<#Mð¬ìw)2»]å¾”¤Mµ„¿S˜Ÿ…\¡!Œd3¨š çbß\tÕNeSU‘Ð& ±Õ`(A¸w¢ˆ…˜R‹Šü¹ý NHKœ­Á‘ˆµ Ñ+³–¸d\‹vÜèsZŒ±À‘Zèa cÍÜ'ÂW:x¸ å5áªòÈÌÌ –·•lâ óo4Ç‘j¿˜û§?ˆ„5€^tm#Ñ…¥[ðÂ_|Ѥw8J^÷ ꪎº\/ž‰,£WÏeØ~“ 0 ùë˺ÁP«q„÷dI!ár©s«$;ÂFÇ×Z€®À Ý/t«Æïd~$(úwÉ"×jÏÆ°8Ñ¡W6ãà?ñ3r¹T .<œI°ŒÉÉ WC®ìXBNµ>t+®Õò)€“ëÎìÖÂìýîÝ»¦´íæÍ›—/_þmÇ÷O*+åÛþì^:+fVDL° –73wF”a‘ *­r"îEšUÚD±äHcq>å·ü`;È ¿× ïdLÇ#¡AexûÖíßÿÏ.>ûâ÷=ùä“§Nz„4}>ñ¬lñ` Ì:¹«#®Ô>úb@Â2{ÃøÕUèdÛõ½“³Ø¤h;ùv9P€.”º°OCŽ> ™dÝ Í3ëq0Iü+f˜€ÊWQ-àÑ~ÅeÏA†¤QÆM(œ†/T¨%È¡“@˜Ú kÒø¨fXN9~§ŒšhVIb"‹‚Ù<Ÿ€§û’‹¯Q¥¡pÇü稀q]¿ïìVAÉžy܆5 3 „¨sç.×HûÇö6Õ¨î‹ÅJÃs2œðÎH4q&žÂÕ­ÅÙ“SÛÁìr…«8±â'»N!‡ÁÉñ£l¯“†ãåljZçá¥g¯lö¾Ùl´ÖÆÏÔþžÇN JßAb&(K¶3ü*#Ùn‰xìêHM¹«éÛœ­8ÎN‹ˆ•=e+¯—6ª8M**}˅àWCŸÁk±ÓtêváÓÍæü³‹_xæÙgžyæÌ™3áóÖEÍhk:ýð,I(»Õ{Χ<9…¬£ *ݯ«d)EÍ]»Ê>„|¯hñ(~Áó£#BðPYÆ– c @iæt¥+y6 éÆ^¿†˜þ—v²c­·fP%²ýè·%q¸áó€Ö¢.Ï圱ÕjMôIÚL¥ÏÕÄAÀ•D K»=pï¡ãB5NPa@cúœ€íLXãûÓÑÕX\©ÝúëàܯzAë14ˆv3²à%·‹ì°!VR:õs,×ßE«ˆç–’˜”˜Ö†„…–ëû}ûÁd–&(’I®„^Ì“¤*3(×–‘¯Q»Iš£nj\_Ruï À$Ä4ЭJWJ'@­jwäúÀ÷wDM@%=˜i0_!Ûš ‹¡DÚIå¢ÏŒ—¤~?­Ž^quò¶Ü¦÷F¹<FPDºJÅ\çTÕM¬¹*\º¦$Nœ¶ÔVû*@DwîÜY¯×îÝ»wóæÍý[·~ó…sd¡«áµƒ#OAVL̤ÐÊ¢›ÌÞ9Ò‰¥…°QÅ‹Ð6Ô¸00#‰•ÄòœC®¦úÚE ºÑHdØ-dŒÊ Ã4ÏÆHÿöÿóÖÕ“§^zþù3gÎ8¼»ÞË#<ë¾\åpîyt¡,¼Õ¼ôÃ)wU9 fT­4¨ÀBŠ´ 3–¹´Õ¼DH¢ªF÷Ô*@3W"NÎ¥Ð\É÷¼*"GZï¡66'S¹ª(” ² }¸º*…rr(½®h`Jm³Àw,¾{ÈJ(X+µEõväy¢ÇD·U` X¹Ðm"ok®YøÈT¾qN6wØÉYr·X¢éjÝ0lm³”r¯|Õ`tè¢Õ9vf ÊÖ-{g† í‰%^Sï ŒPN$àgDÌšŒ±‚:'æ~xÒWêT&T¿ÂUü´‡ØÿÍn2•~çN@­¬gNp,}9 «ß«A*䎖 X±{h ®Â“ù?º·›ùkÓƒFå¨Ú¡µ3—í¥ÍÊ‚‘b õ‘ôUø(Ы Al.„#k‰ ¯JVÇ^A;ö ÍëEIs~îÝ»·»»KD·oßþä“O~èø¾Jwo˜™I1[ú•A¯|·0¯Šc0Ë“­x¸ç@&£.Y÷kÃUU,¢Qñ A¨Lùä`+hÿ _èÅÖOkš  ÿäâwÿá=zåk/ž;wN)eß|iBØáãYP³mœ-|û˜ç$ý¹ƒ®æ¥a¥b+šíÀ3Q}¤3òÑÍPí“´öºPbQÄÚCÝwÊ…Œ•ÄcÿÄEVã9ZÉ p(5Ù©J GnÅ™ÿ•;ÃH´2‰VoŸR…l¼”þ±8ñ–p¯PmØXë {G–Âsž:a5ZŽˆ%æ(ÌÂÝžÇØÉÄãa!$¢È4™ ås9o]Äü‘i!å–^µ tUêZ…þÉþÏê×èÿj46=4VîHèíÛ]-;mÔSPp2R lZ:?7ñ;,Ó ˜ñun–‘åž‹cZr,T!§ÊÂWÛ¸¬>‘.¬ëÅû_qÇÅŽº“äAÃý\Áì…Bà®éѬ ¥*ÄÈ‚û¡ÄI†y¬ðP ëÒVF£h$䚢W[…®*ñ“¸lªÛÖû†Ø’gÙ"ÙãÁÁ¯¼uëÖÕ«Wèľ› õJÑ teiYN¸_ –QtG€g™gPa‘ gOLñ"L+™úU]Á¤;yOì1qöšX~vlÕE ¿ùþå¿òáÕ×^{íñÇ_¯í¼§”š†^=0ÐCƒšM;[¥H0ýS½“<ÄrWõé7Œ6tšdÃDQØw¿#é­®Y(WŽöüQøbš±‡j #[%iC¹@8ÅZW\€¥X‹ŒîSõAW@“©L õYÐ %1FI_ŸEÏÚž½ßå\˜ªz¢©¸ßzÛÿù¶ø@ˬã£ß JÑ`Ž^ÖÕÔ‡ÑЙ«.·OĘd£@üÇZÔú•Ôd“ÅÙŠÑ`Ç¿¢¥ý78¾¢˜Vmæ]y3÷ TlåÑáÏŽŽ¡½P›/×° ú’@*ñêiBuÅ÷’`‚ð®Öò‘=Ù°3`sÆñ|3#Î⑨OÔyŠV] ‹X4Êöy\úQÐD( \ z5¸j‹Z‹sP«*ÏËLcÀâ>¢WÙÁ)§ßתʨ“.“³ô{÷î­V+¥”ÖúÖ­[÷nÜø çN9ìɶ:,ÅPneU±,³ Š™¼–¯Ã㱦{$âÞ Z%²)u¸ª‚UåäÛ}ô @y‚˜C¯àh†0Öƒ 'æ>L^ý“k7þýÿïÝ—^~ù‰'ž8vì˜y/«Õj)ôê!Ƴ謔œÍ@T½æƒé©>WrWõu¶¹uy&ub™¬KŸž²¡}#ììL}êàY¥ÆaÆ‘z±ö Â….ôj!’Êeª¥ Â@|ší`½ *á0@už‘{"þ™cL ôÂŽ@%rãäX®~0/P¥k߇ìËà¬O:½¸âµ0>Êl¬-ÀñÙrH‹¥3F”Ož§É@ °ÍÊ#G ÞRûÚ¢,D­‘–Oï68ª-Qì[š²¸NH®^Òº­øZ0èFÁÉz©E‹š Á³ö.?ÛR,!àÕõ³J;{*~q§¤*0ÄÊ‹uÛ‰˜[Ü+N¶ÐÇgæq1ÙˆxE±ruBWÜÿúšƒ„{N¡6VeC¾–¡H÷ŽŸBë0M^n‚Z iL¿3ð—–N›WÀÜyXò ÐÓùg”þå,P»0¿ •‚ª&X…XA‰ç’ë, :Ïò,E´0$ \ã®G¸S£?È£Êà~G8’ìðHM¸t9W S_þ¨€auIt…C`MóGQ÷—Á¯æRî<+÷ƲLŒ 8"ïm nù `«ø\¤"Õ™ %C4 ‰”å¯KiðÚ䨫jåæhŠD'â O„å-\>žbäkäÝ£blÅN.³™;¥¼úàà€©¼}ûöÕ«Wëñ=¯»1Xºò@Ål<”ÑwWÌÌÊb† Z”“æe®€”Á q~j¯ò¬«"V•ò¶¹Ä«{j¯­ÄÀl·ztèÖfóñ×öž|úÉ'ŸW±õM\1¡móò¼zÚ纊VÎ`o-›C¢ƒÒ‚9†bᵂ-D¤VVÍ-ÅÓfÀnlÚå¯ü:¸ÿ G¥jsÙsry·OUß5i½ÅȇÅà÷ôØŠrSEÈcZ›Ïi{*Óa"=¬è,lQ:G7¤‰Thªö<ˆÔ’mO‰ƒi ¦œ £)ZgKýzr{Øm›èUðÇtô{V†8ŒÀDµß-Mw»alñ½,ƒ^•ÏY#‘—ð‡Tû»aȇÒÎkÖólÂþJ…Y<ŽX\ïÓÄD¤\MqS`+û^T!Ù§²üZ0Zj« æÙé^²Ÿƒ…9C§)ÒÉ­“r×$B§¶¤)ÃÉgY0„Æ”HqD‚¥,øTaÏW)¡Qì~:𕉙|2ا¡Î,}ka½ü[HK ºb\\`îó‡°”§Y•bÍ¢âiŽŠU‰jºÄZư¥iUZÍU᮸UØÈ”ÛÊ[ni–°ì+ÑT¾¤-—Íf&¹Z]îZâY¢<`XSF-¶6ÎäÓuÿ=s‘K3|·Âw®Q:?:¾5_ « Ö,š{îÅ:#×; cv õýÇæ$‡ —´b܇°Àtkªòg`­|ný`—ä·„#Ì5±ªÆ"Æ9J–ê…DÑ( c‚ aáoÝäØ'+'ZœÚfÎeÕXk/IDú0Hk6GÚAW¬Ir* ‘xn½ ´xâb@. ©rúõ½¢\§âŽVpÌI–…zVòV‚qáëf¯rEL„uT:³ðšqïÞ½·oß¾~ýúK+u~½ò™´—»‚²•ƒÄŠ˜‰„†„EV!+>=kĽâ JÕÒê VLYœ‹š’Xˆo'Ï0)bG¤!=TŽÊ¿öÎG÷Úm#ÜîmMñ Öúh:>ºÊa^ÁÏèlž¨ž­W3ë@¥Ã‡®|›p@nEÙ˜ïТ^Ýy¼0V”û·pîÌ]v öÑ<².Ð)gÆI :n•ÑU)1¶²Ä«qE!·¼*.C2 ZÊ¡NìPЇA=. ¸T¢ÄÂç“.Q¤„™‹´ûö"'kakòêÓ.—Og«³Ï~nòCl.0uFmΓ³W˜Rç°æ­’÷:Nt½¦à`]¸§›¶A1*id õ‹\XBÈHÝ…Õ‡<^¦õJ ~zÕ|¤–œ­BN(ž¦äClá ŒÁÉJºô–½#^£!–ùÒáËN y;-îBØ}#"¹áWaœ-´“I9¿$É­GœãV¯–‚Åýò0†o^`ÅCöªJ_¥2öœÛ> ôèü·Ëx8×°\ 8…ŸëXÞµ¹ä#7+wgº•–"r]>˜¯ˆàõ,Ht—JÑïÝ»ÀØä™úÁßw|ˆ H5`X«RDÉòÀ)&RŒÁ¨RE¿òÕynÅœG©Ú Õ°Þs^«Wq1ñE°ãâAǽr‹îP-hïƒÓÑ?»vã?üÕï~í•WΞ=k@+f6…™›ÍFB¿z„}®®"Tô—°±bè*û¡FqM<´·´Ç^6PG3í5Ÿ¶P ŠFW¬bf7W%RSÛä„¥ɦ&RÉòA2Œ‰zXW\&^Õ¡«tÁ”–ò 4§‰þ^îî ‹–/(ïqBð98WéÏ»i„™öùÛö¡®ÉPבè:-1°P+—iÞš·ÖYû’Gi#Ä Újûo¬-&%’yê·«œJMb2î¶(z%i€†O%Ò…Ü1Xj*±“ Š.©ÌªTf¤mÍ9X´±P;Ë26´8òñ žQc4\Ñ*òX%`7[š¶½M±ÿ`gF•e[âfÂ/ݢϕÈ;á;Èè…'èðä,4¹~P¯¹Ë~‡Çm>ªKéW%áö ‚‡ .ŽŠÊ¦ŸŠ¡+î™Ùfш:f’²T¢ŠÙ ›ïäU9¹â½{÷ˆÈ `]¿~ý7ž>éĪBèjø±Ÿ˜²Á•ó¢dbWlèK­~× öŸàVe=¬,hUãm‘Јp\Nè7j˜›·zÁf†df0`ËÅÍoLÐ6š®ü[ÿôמýÒ—Î;·¿¿oÞ‹µÖG_züÒ´í«Èé“òû\AW°;0Õëƒî•<¤'„èð*«ÉP1g­¦OÁC ØT£Pqé‰RrLUÈ¢‡ªz3,·ÕË™ÛUÆæeÚ’ƒ´@ëea«S0$ÚÂ@íÓµçw-ÿÉq}(ØÖ-Á‰'Iuv*YON•âmâ}ȶ“[¾…œÆC c(´¢ËF­9 eȬI§ÁB(E½ [îNóiPÙPTÆzѦƗ{eÊ9-÷ d@7*vE® 4["ʉZ­Er§!sj´ŽÈŒd;Tñê¼MçÝ Ÿ?ÈÏ‘¾lȪ8?ååaûr!°ãBœÄ¥Ð319e+ó¹E¯,neê —ºªp¯F Õ$# 9+ø-–¾2%[ –úó 3i‹iáýÒÅ[~öÂ/ܾ^¯Máf³¡G†}ð¬Üù…$¬ºÚÒ&úåG‘|8šúçaX™ØwvP‘Ær ðæþ§0øáê²Hb9öº8—ïPå¾Ã¹bœr鞀°>¦‚4¼£kTHÞ°­xÛ©œXªT‹²•›è\ ÈÕjaùË,7#-¥§žcyè@õ9£$%òj ¡À®¬‹L‘Û{aÆ­ý<ª´)0Ÿ³Xûƒ­Nîòã`ñúÍ*ä7L…¨4êr+¯ä<Ø~Sñ–/Ð6¶Ù8²¤ÐW•ºU–ò,SéA´æjoC9íçùsÅäó@„PÖ9äö[’2&¥ïFrg¶Dµ^ï j7•|…sg£½œxĨÙU96ã ܱ±Æ!&—ã!ñª‹\š©ÈuR5B¿jÎ –¼*BØ$=fq%ã?hˆBwïÞ½qãÆËÇÖÇ”òoN9q+ƒXyÏARäµ±,°EÖ£ÐV˜:ÜʲR *ϽªƒVwNM+9óÖÝ-H•6â]% ´-2´[ ð¾ þÊ›üÜõÛ¯¾ú}çÎ3-¬”2¢ø¥âÁG´¦Ï-ž5Êyˆ•Úë_<:èU=Ê™7ùä˜EjJ¶ƒB¿'žŽ‚ôŸ›*š(Sœ¦­ÎrèŠç¯œºÇhñ˜ZHb .{qÒ8ëáò+÷1Š÷¨+ eôA•™Yi,® –n ƒÀ.+lÂB¯õ> óЫιc#¿­\ #¶ ƒ¨¡ :|’®”ˆ4hõ­™(x²K r³te,dD6Æ!†eþÈÔÜ™ÁýVYÀJïIºÑô*×K‡ ©ÙåˆÓ ckòó%‰ž±2jxȨ¤·˜lUã“‘vvN£Ýeޱ|A‰€ŒŒSúÓº«}yÖëä…ú:XJJ»‚ê?¹æ€û)dTã—œD•Áìk¨RªÁT®OTÀ&|÷ž¹³.R1äP1?šË;K¢ª"Uj¯Ø\"Æ’LõýžÚXT.ã_j®¥è¦~ÐXwîܹqãÆoÙÛ5Å€V¯]™ª@EŠÀ¬,tep+Ô2)&be|Mßà?˜+Œë ¹NÑ¢Í*‹X%µ„9ÿ(òl:SÛ5H¿Ø2f¸¢¦ ˜Ô[˜€îŸ^½ñg~õÝ—^~åìÙ³¦%™ùرcæ´Ÿ7€æ ìð!­Å¿xÔ +ÿFæÈ;.ŽXÉ®y·wQœ8·ŽkljS,Œ;ß¹¬j$j™û©˜"ñDùOÃzÁ ·Á¶ÛbUbVª&!"¡ºÝªš²ý<éë¥JF®ît.˜ p8["/ÀƒP²\ºsžª†Ì„ž )¹ìôÜ–åÊ«Ÿ•çYeŸÒK’¡PƒÂü†»åG0u Knï+ ` © ªÅ#k¥„M1†:)¢9¡]¤¥`õeEåvÝ\>‰,èÁÃÛ²qd¼bfˆ¢YùN”ëÉ" ,>„¾—·ü¼YG'l'Aµêõ¢¥®3©p[vÔ*£p-Q(«H_euÜK6q³ºB’`·¹e—­€å,òésª@ ¼ò®U „IØ|Û뻆¥”`¬oßµ®ˆ¡R«bŬÂ¥¼–¯tZÌ# *¤xäö¨&â^B¬¸.‰EQ¹<ÖæŒî GŽN»~'tõîÁú¿~õù/}ùܹsÇ7çÞÙÙ1“­Á?ÏH=bNåÏÖë38†ù@W‘mé–2ÎŒ2¶$Š*oRuÕŒdê^½BK æÝä©òKƒ9…Gñ´ðV‘Ù$üé¨ —™³Zv[¨\`ÅåÚÀÉk¨b^U¬ññ+•1*>+!4J˜•Š‹çºõ=ÔÃTZêmµ D!Ñ1ý)0³Õ Kìë42ôÌZsóT^¾'ô¡ª£WüŠÎO G_KÚ–µé‚þ˜”æÃ(k666^—zÊÒ+c*ݣމ݄‚Õ8XE_a'õ.jT¡µx˜+Fˆì…ý =¬Њó"îœ „ÇP—ãt°ÙI²ÒíC[[Žï`Žÿø/]¼û…3/\¸púôiójÖëµ)4öŽ0 Ï žEbQºÂvvõèŠÊùù}ÜB,Í(U²ì„Edôш‹úQþ°‡q ÛêµDì­H&¯™â8µ !¡¯sõÒ/­TÏøŸ5Õs9ñgÐF_Ìž; ª R¯¤郞éžiyÇÊ–{¨V'œªêAÂ{uÜép3ôÌHAÈÍ$õ˜·{vϘ6%ztƒWµl¾v„#À¡°~šS:¥ûª®‚Ð¥½ dŽawß’3 ˆí˜ Kê`á>šÕ¯ÝÜ8ÌébÂ{íb'è¥Ë_Ô’Yü•Jìs—³d JåöÖ²MW°aÁPI¥!§¼ö™Šàè9`W+ƒa•Ì„„]0p‘ã¯Ð_Gð¨joÿ3*ô"D4ÆÙ³IÐ+^h-U˜7ÚÕÅhY‹: ¼Á(4Î…–JÎMu›©z»wïÞÍ›7ŸS|ng Væ+"VlX+û)KÎ"ŰrY¡ÿ Á`^ܪO+=Œå"îI¬P}AU†›.Á̤‡Ð‡‰`…Û-à§ßÿÞÏ\¹ùÚk¯={Ö¿‹S9¸%çÁGHÓz8í¼ªÕĦ»èWºÜÕœ%5 µçç–Ýqì(Zš!®‹†gR#ê”wR‰ACÃ\S#® a%’Å=U¨Ä¤ÍÕR("±ðã*òUòÆN¾h«Ñ]Iê QÅݨr;5åü­nÌ•ú®OaÙW1ý¶Ñ˜[Îk7ßó\èE?ó)gÏE{{u‚Áe@HäÅj\”SD­Þ*Ç8XË‘¹°¬¯§½ïÙ}E*åxȳô®Ã‚4$¿J7¯rå5 G¸ç¶Ó`T¹QgµÔ›ÈuÐñ¦¢ºbñ‹¨Û÷Ô§r”Y–)¨dP±ûP¹ÿ/–MNÎ €µZ­È `}{ŽV5ˆµ+S?H¬”-dv6…ÃÕ2ú•¿®UuîUI‹r Yy+a]‘Wp‡aÂw,©•5ˆd Æ;×îü‰_zóK_~ñôéÓ^újww×ø9šâÁGÐÿÏÞ»ôX–eçakí{ã•‘‘™UÕ¯"ÕMºIu7Ù`›€þ€=ÐLì‘O ï¡'‚l¶†´‚50ᇘ€-y`ʤ$Â’%Z$Ñ|4›MvUwW£»ª»*++_•ûó`ŸÇ>{¯µ÷Úçœ{#23B­bä{^ûìÇZßþÖ÷Ý^%¿Ê0óáœ|ߨîЫ]qMЍºä‹Æ¯»¤KdIôГw¢T".޾Hï§Z5}¾²ûi0 Å8xuÍSq«•Ëÿ$<µšAQ3Cß)Ù,~c]ÁÄ+ cmPF;ôVÝ{ׄxÛwGN¾ø6›€N=ßcš+˜½·à§ç‡ý[ zµ+K?Ÿºða­†Á~ÞÂMÅ>Ç5fy7–Õ!SÅ ªê®vÓ¨Ð3ûß!|/zB¬s{’­Ö:¹[жØ*q‚øè¹­·Áauå,fò0©E,É@<<ÂûH—x'Å)ˆsk‡(¬„r7‚²Ú¿:ú°r'«`œ$‘°,Ò¡z8‚„©®{Åzì•7ãNà3Np‹Dª(Ûn•Ð+.4Fe} nHÒ+¨~ ¬ nqËŽƒ?×Ú“óÀ „ÿêÉQ$ÜÎä:^³cÇ` ŠW¼at…„=Ôé¨G¬¸wµìÿCH¬U<}…ã?Ù.â."VšaW<ÈkÛDAW“£RР3ýþÓßûSº¸ÿÆoœ…?9çBcZ Fº5ì{®b¿EKÆ« ]Q;OäÚ’–Ú>/l)ŒHƱ?du1&Uù.hc®‘ís½qýKÃføÄkNÄZxãlHƼ˜Ð'[Îp')¸‹Z&<9ÙP¤Ž‰¶6eÅ+V27gê¤ ¸”¶AF7YL¹Ä²oÈŠàWd”–¥ÁÍø—ièïZDi—“R5ÝOY»bñŠ{|),†£šîOÛóÔŽa㙦:< Eç4¿ŒAB¶¯žŽ­gývDSÿRj´‰9ƒ p¦º»ÌÊUw rQÍ"†Ì^·¹'r™ˆ“ËìP_[†I–×ë~£„Ÿ&g®•|r"⾌2ö~IK sú’†Y¨ÇÁÓ L´t¬Á‡ˆµFo¼9®¡*ZŒÂ „ÄÒ?Åq5Ò¹W³ã­K4 ב® ó)fñ% ̰ŽQi WWW1€õøñãùóo rW½@û xå‚|;±CO³bÇÄA£ËÅõƒŽºßÑ€[q ’@×"›ˆ»ˆXEbñèKVûßS~ ?Ÿô©GÏ ïñ›?üðWðÑ׿þõ¡xðàà`¾ {C “[¤é&_eELó“»’k-ovî‡å^ØíaɸVƒ–Ä÷bÑK6=b{BÒM§FÊLŽT¡«Ân*é›@(ktj‡ú $ß`$ºŽ¤“Ãü¼™rY´%Ý’`ÛCÍ*tem1)©K5íŸÕ“cºñž¾&ž&3r 3zµ²ûÌÛЫ¾m¼¨æ0ÿŽüÔíb®’»ÏOuŽÚÁƒÔ;€h 5Þ³bGØÊîŽ÷ý8-¨Bµ}ðÁåèÕµÿÞ5„jY¬ßZÝš¾Õ ®Ð”!µP  ¬AJ !–²¾#ÒãVã[¬ÏÊÿ#|KÙK`¦QŸGÞì)ÜçÖô¦Wœû‹•XÚå€j‰ŸåÅç@ðrükà×5±~º¾àM ½Rϵ•“TH#Û¾Þ­:U½â|‡Ô¸bäZ€®Äâˆê–‹Ñ­€j×Űá7×Ãx-÷!aãÛívPp¿üôùÏtbí.®‹Ê±côŠW¼!0ó&T—v…„`‚ã¾ãð€^±È½Jp«D‹}¦¡€Xe;Ý>pÀËÁ^sþW¯¹DÑ«…ój× Þ¼¯*» j"jL£^w¿¢Xj;Iß RÆ ’}™cçåáDm3h@ Qã>ûnYù¯\»J´š–¬.þµ@$j߸i4o…êûЈc“bDâXZ"~ŽóÈ*¼ t⣱RO0öUŠéï`ðÚ h'6©Xå r¦>-ØUÓV(¬ RÂp´s0EÌ8òº¿¹ØDò6ëNØ«U'«xr"‘µÈNtµ šÂò,¿tÅ\ÿ •Á¢µ6¦ˆ„ö ƒ€9sT™íIÖ¥òE¥’CáC­yÅŠ8Öõã»âĶ&Y¹²97q!\kx΂¸–…É˦Ç]¬jyÁQœÛûr~ù¤~kx¡ôŠ”ð¢ ¾Î5éœm~rzBNÏôÊ-Ø#e³•R¶ƒ‚(ûi¢S@²`ØÐ›—QÇõƒ———ÏŸ?ÿòÑcS ^q/ßÎ]a w<,žàY6ZÆ_úþÆí¸U£!qÖ‡8K1¦Ì,Ž„Û ×<ÔïiØFŒ«3‰#ü¿<ü;ïüè¿>:n6›€úÕ-áè¢f7íA–·ÐÕêÅâ˜`¾Á|“Uq‚ª”AƺŠ…Bø˜ð¹D‹kª1‘s&´cR¤¨}¡‚׃Y¦t‡¤å…É¡D—åMë QSawf¢¦†QCÊ.÷3*.v— ]ù`˜Â4U‚vÅáÉJÞ":bLALYYáf 8˜mî´. ;Ì‘Ï'£N‘ßÏ| )Ã_еé.wΝ˜WO~3=,ÞišÝÕôF>££Ò šdQã¤4Š¢JP }½ú>MS[Ÿ ‚v…ÅŒL3ÓU0 £w¡B°~o¤ËhÆÛi~O‚!/‚CQ¡‹0,’d4‡ mgÏs­=Ià wئÛTúù0s¦Rù;hö åY›9S“ÈRÀXE*ŽU£ÉÈ~Ê#˜|ŸMŠE¸wjžƒÔH¼²+•²åU‡+K]Ðw´H‰‘»È¨€DÇ_¼xñôéÓéð€‚Ï #0³cf;vL¼qtåÜ “Õ;rgõ€’c(Ô*·’ë 3W‹¬{trD’虨Ã.81£¯lE’çõo‰ Ï/¯þƒöÇî‹_ºÿþÁÁAhÀãããÐìÏŸ?¿Eš^3{øášNëo úh(Ôys¦Æ” jSê1o9,QÙ²OAh¿…û<妨ŽâÍÌŸ­I·CIÝÑØp(gu=šZ¸ÄÌh¼H­%o%Dµá¢ÈõÁªˆYO]%oMì úh‡±PÏí±|0Še9,@n88ÓH´lq\þÍc*×´J'gŽ ZäR0qùf[õzŸÉ†Ü1%ÜMÚ6(Äy”âËX¾_ÔF` À‚ÎB_?5ŠÙa~Ä }/”­/µÀv#r ?fúƒ¼P˜SÀcÌ€)<0µÙaÅQÛIpU|c.Ùø@(&bG½”¶*ÜŽÞs•UM´µU´ lq4—i½:`ò6ûý€a\­%âÀ{XÏž=ûòCf"*|Šà˜#&l˜'õƒLÌ轇úAsF¹jÇ­¦Ì©6=,Jª 1¥÷ŃHve;pÜm†# <<ð7ÿݶÇ_yë­óóópæ;wî„éôùóçÚÛ¹EšnQ³µÎ¿7ZÓë@¼"C4¬+¿Fz%¸éòFÕÕíÏ•” &­S»èΊÃGâJˆD  &¬ÞtÃ[CRvìYY²Åˆ‹uÀ‰£@…2œ¨gq}C훉<×0¬üC§\ŠeA¯¸ØáY‘VÀ¨]=Œ(níð\› 1Å#ÊÂ|¼á¤Þ O¿p¼›Ñ+”¿…9çl½aÕOhV¤³zñˆk1¿›…Äl“g«gÍC¬ë;áW2>ØpŸe -€8¨©Q_Ä‘k+q]Þ ãQBŒ˜&m3V\Lð·òDÆ! á°™D|Ì—f÷Òr0c4!¥0ÐèŠÖô,ÓUoàOL<|ío­-Õ­j<û}ìhÞÚQ `UÇÝNâXÛ“™âRס,9>ß,1IPQò-§Ï8¬{ Í4}‰‹Áµ§zåÒX•Ð{<{8U¨($qËßr²Ÿ<O«dÔ———E`=þüË÷ïŠGj• <¬H퇫\³²ÍìDÎõvK„¥Z J¸U™lÕ.âž¼ $CŃƒ“0ЯÛÁC¤ßÿð“_þ“|åk¿pÿþýðxGGG¡óêêÊ®Ý~‹½ÎWÑ®¨™&·dŸ^ÚÁUbØ~…‰ïÒ‚Ëe2X¶cQEÁÄ<‡2-öéÒLÐUe"Hë#$€ µ»ÊÕµHÁAX‡« G‘Íd§¸•Œ… Ë™æÒ¿B¦d bº(õù[ŠX¦pROÅ"…R§fJR Yî`­Uß<'u‘¸1½ÅÌçM¾æ'ã´»0”°ÑfŸ+‡áæAeh*Mû š&ö!IÛåMÇŒÔ!MÄE±#¨¤¿àõ„ÄoàmÎqsçý(HìúQ©ü¶ÍŠ2Ã}t@b@92Óº]¯I#˜žQT_Ò*QÙ6XÚKŒC+'E”1NÔÇwД¶Ä¢E·›7± Œ´&”“ ̬.ì㈒¶ž:ø àRâËËËgÏž}ùøŽ1,0±sÌŽ;LŠ)”n˜™È1ÔE V :…9€ËX%ÜŠ!v³ˆ;eÇŽ]3Tä1Òï [C<°ÚC<@À¥÷ÿþ?ýæçßþ©ÃÁ¸xðéÓ§·èÌíUfœ6A¯¸·e½ùä©k®ºSµr°‰,.Ÿ×hºQ5µ ¤òUnºy˜CTâçZ:i+²P_ˆJ«oÓ[Æu4'rºJ>š,-Ñý¹ßnhkïþïT¹M(*tÔŽBxuo‘y© †aɸÕ¨š SÓ‚W…xÅ£Tk‡©GŃ<—û*a õ‚}Ÿgò>Ô[â—ÿð»ßñ›¯}îsáqñ`¨Ç¼Egn¯ÒzNÍZtfœñª³®°Ra] †ÕíKq'®½»”€ûH˜Ñ¦[Q s%qc¼¬í˜kdP-]'‘Y º*¯67IØÔ­)âîbõa#vÕ”ß%4 ÂXÜXÊAÙÎvü×ò œµº4àæÕFªšš¨¶çï² û,œëîñ—½‚²õ  ÞÍ›}‡Héõü¨Y.»q‚Ì}±èP$¸PàÌt”è5GwL*lÚ…MïQ]¹µ‡¢BÄž ËàÙÄ ¡ÒýlËÞ€K»ìŠAʲ³(ãJEü¨ÇÅuŠõ€6P#o^XRì*Å3<œ,¹Ûmk3§<‹ù‹ ´ëòËA“¤w†¹Ô{׬ëªXÉ´OHZêí¢1¡NnÊÒW G)CKR;.OW‡6³Â½b]0¾ú:XòwúlÇ5 <."¸…€Xœúa›Öʨs÷/¢+d8Þ„¢AÇì˜q°tã«ƒã±¸Ñ hüP†«„ߣž—UÙJÒÃH[qމNW>Ó¹è÷ÐË2sW>> €ð'?ù›ðÝ/å«÷ïßg=::Ún·®®®ž={¶;èäÚ¥Ço¯²âUbwíl‰lVøç@–|I¡«õ.3s~9‚„Â’a挱¹¾¡5–8““b)|íG ‹)Pô}1~-+µ'‘_ÒU®òcn’4µ«¡*IÛÕ/Á“=$ ¹a÷ \‰õ5rk48ìºHÀ·ìª²!æi­ªjëâèJ}ƒ‹Çq-ØnLy%C¼Ñ7Í(ß¿ü¢=¶Êú|Oæ¼díì;R¿ZòìÙ#cùmY¾àu[ªU_wó¡¨à]dRÕJ"–¹é3)äi¦£Û˜‹*Š;pŸ­¯+"uAâ£( ,#^«ÿ„øŠlüü¹«‚b,Å ÅaÓÍû2U–u/—š%€T˜éÄ:#Râ !ÝFñÞH)+¾¼Íà ™ãM ”FºÆ÷?olltªÆ"l“^²E.nÐÿ)£WdF¯&§ïmݦüf•¶8F¯X …YQ¢j´*ݶS:.Š †Ö8d( ¤¢„?gP‹~¯—c´dÔ±‚ûåååóçÏ¿xx «Žx嘘1¸ LÊ9rú1uî„.P®ºÂC…¢Â†eÁ­t²U ZÉ"î±^dT xÐMˆî+{øŠ@Þã?ü§ôÖç¿Þ¹s'õäÉ“W ¹EÍvq•½ŠY¥.øU%^ÅÆ¿ûJ,'Ú²±9,(|0sÛÓ‚VˆJX¢¾/QZe½P+n CPÑÑS“sUà,¿Î†GhÒJÕòu³»@[…À†§M·²`±˜’}´¡Ü¯'ô½&«|`Å«UwÏòÃ^4Û ã’l‚½ªM-†ØÎ€Bß°¬ e@¹ÐÕ–>bžÚma×Ó¢ÈQ¾‰%õkƒ´Î½›çú×V?ˆ5•j÷ð=þßá%¹ÛYt]ˆbN!˸킌y…=?æ‚É©Nzô!jŸ¼ $JéP!¬&¸3ßÞ°ô"ÇÒ–‘¹0ïe$d»è•P`ú{ÌUObV6Zò¿4ªò”ÜÃ!\éŒ|‘“\çÕ5Á(„ 9NÑS VhÍÍ Wµ}IA©£3íÏÆ˜ÚÉä,à˜ æ/®ĸZ‹Ná‹4xJ”ØHBÇP‹†«ñ®ñ襅Õ6%<2Hhi±§»…Œz(\ ^]]]^^¾u° zíÔAWÄ=ŒE‘ç`¨D÷' E†] a@ÅÙaˆê% ‹åNÀ *¦VÉL+EÖ½廬¬›ç”å]ÂÆ§¡Ï5äÉþÎÿOý×~æsáÜgggóé§Ÿ.Û-@sû ö«Fq r ¿¼¼Ä«õ¯ÍŸ9ÄC©øµ¸Õ'OÛÈЪy ×ìº *ïÝIç·y–³vh¿› ½‹§åvmW;>Âå¬Ì¼Ü´á!îq®Ò‰é •¶ Ï}ó!]©´.1ÉHÙ²·Û§nÊH±8ÎÆ§Êy]yËÍIµ‚<)(%g•x¬0Uªˆ€4àлuó|‚ŠSA³…Ù‚1凩36XFmr^zÿ>È/îÝÌÎÃJ¸@mDÙıæl[/Ô1/à}`œ\&Û¿sfæÕpÆx9 ê#žFô Dì»ù”sÊw0Vô§ ¿ÍSÀjFÅ*h¦1bås¬Ô=ÚÏ3—:¤Ÿç—Í›b P"(е¸¦áR +Á²˜…iaÌÙ{VC<=¸éL˜€Å[+<¬"žÉ™­ ë.B’SnËbRvÕ@Êaz5Ê{çï8çü—Ww#˜B !Ÿ$îU÷¡ÈŽ:wñ#ÎAY±••“ÛgÒ%³­XëgŸª¸]k§“ æÞ„÷þòòòã-¨§Vuˆ ÐÕø‰c0o6ßz0‹ˆƒˆY)W¹6–þ•®Eªó ú ¬N“kÉvÔ)]õ׸CŽ~·ÄðÿÞ'ÏþÚ¿øÓ/þù¯Ü¿?ÖŽؤÝ~‹g-¹Ä+€ši'¯¢Òâ¯t5ͳ‚Ò2Ä|MQ’A®Ötþ¤¼vÍœ,Íe ô±l{ʇ¹ú;×0,ªÉcÍXàŒÐˆWTäò_þ‘VîI›– ›i(`·¬þˆtK¹¦ˆšè-`,¢—µäºË<8{•¼ ºÄZqÑð$Úܪ‡y>ãi‡E‹8Ò)‹nfGU5 ®t?•xËúJ èÜž=Fé/w‹È,ué¡A5)& ÆK׸¡$&dH‘!$¨fC·\uäÎ×]+*Ò¬AÛ×ñ¦BbÉÊ}-‹š¶lUoÃ…¾Ó­… ÈÕ‰&±:wqd›yÝjœÜÖŠ|%uþa&ƒn›ºϯŠ)ŠÅ‹õPµU2MT¨ˆ¸çÇ`dÄdÑC8óFB@óæÒWi$Ç©&Ç|{7«èUU,ƒãOgJ L`e9ڶ约P /ZøN``½±= Å€Ô+¸ó†{‰+•ƒäBAaÇÃòúU´êýÆ9BŸ–âV)µJ×Ãê»ñØ©£4P ÆÒˆzÅ?nýv¹1è¿ø?={ó­û÷œÐ´xðéÓ§K^Ç-žuóQ³=ÈÂüÚÈ]UB]…/‹oÖ²ŒŠ€1âìoÆ‚bWÂâ¾4¬pxç=Ñ©Kv  ëU„b,È1>cßs$"RåXñz˜ˆ¶¾CY-•õšÅ!¤/ðT"‘(SG( ,=r*ÇNRª@6ï¼É.ÚQOâOŽ+!,qŽA3ºÏPKMhü¹³}¶Ór ê‚ä\¤êaMÝ+CNk&Ò~œ¿àÉ.)´þS³x6æ¶×<}GhÎ, „sÜ"Çά9"âÖ%Q¥àñªí“­‰â˜‡\Þ¦pW›x‚hïnªÇ#âhë y€à Dó£SÏQj¡Gå+Š ›þüz­ð¬U®;&Wë×úyù‰W:¤!ëWÙRÝmN'@u9Ì‹[r1Ô¬YÁP( ík.t¤F<E9NH‚W.ÉÇL@ Ne¢9¿Ö_)(ÒîRc–@Qà?–è>×SXéyV¿7î½Xü<Åú»´¦an-ç?c#‰Ü“îO“©du©£(€ýl²¨ù´d°Ê$Ū³¡¢á=̳¼Ó³/;7·|5C§2 $¹{®‰¼jc[[+ 2섬¸«¾D4… ÊÁJ#;é²hŸˆ’m-ퟹµˆè&I\É'¤l)¿À½ü$äðG9ŠÝãÓÀtÂÃÚÎ"+ ¹up0)Õáª$šêË7ˆˆgxœÕ$s©¦‘Á†œÇ"/r.ÈW·ïê Q/ÁÅÃ6ƒ!LLUU26O$¬@®"Ô%QÕXøf§ÓÃׂ*ùÕÕ•ïXŸ±sä" ù ÂXÙªÌ]SèJǰZp+Á¯çÁ.Õ˜£ªgî13B]!†.Ìvïý_ûçßþ¾p~~>h·€'Ož_Ñ­aßíUšÔà;zõŠÈ]’IÎ*).ƒ¦ „¸G!Úo¯ðc‘ èoPM½”N”° oZŠ\ž©Ä}QV (›Ah§Ó:-\^E ‹+v"mS"rÚܺH€˜¦‹8JwšŒP;O1œ`—¯R#›~,fÐlÜ%æ¥ñp5¾EŠóDÔï&Ä<›ÔÒ´k³ ¢½A%+ßÞ"Œ°ÊpÌx­ØË#ì¿Ñ¤̶>L÷j*ôh¿ÅÝaI7 )¶ÊYaŠZÚ[Ú/”ï=}Š™µbÿ,­DÙÄožyƒmZ.íMŠù›ŸaÁð143½ixí”·íŒÑnñ#{XÔ¹ þÀ85,{—ÅzðZ2Ù&}åôûL±'®4TÞ}¡y¹XÍe¥¨EÓ_‡>ÚíÞáUBVÉ>œÝ*˜20°¨§_ÝßnB± 8TŽåpL<‚Yý»ïp'zY’H¿âè…õ©« Q)šî$©Â“ä<~sƒ”›à°Ð7À10ºýŸï¾ÿû_üâϼèWÌ|vv.øìÙ³ÁÆñ†@'·¨ÙË{•*åjoؽ5ƒÊ²ØŒžì=¶Û°´ CÕXAy×[ð(w:îìT]„HQ¸(/¯ÕPªÊÍ1ŠÂ¸òZÌ㣠W"=5hcŒQk7ÊÄ­´Ä ÜÚ°Å{âçNI¾’ÀÌ5vug~/(ƒzÑâÜÉs:n8†CÀÔ¤ v3ìN!8Aøß^ ZáÛp¦µ&×ë¦_Ýpœ¥ß+aãÙx÷¶"ˆëy­ˆ…ÞÖíõUŸº:² "Åím5¸½h”%ü`]žŠõƒeõÎÙ™×%5Ìã—3²R\Šžukì»™#<±ÛÁ(ÏöQ¸ž,.ÍM^¤…ÌO†~@ú¦½ÀÕCO~\*ÅâAVÎm䊋_¨¢Wœy YÂ#Mü¾|l“è鼺B^cú ô"êéW.//ß8ØÄŠ#XªÃŠïÃ;î‰Wª ͬޢ©L¿ŠJ{a·ÊèZt5¨¼KЕD¿âÕ*²´J¸UI«ãùsð ’í î E;†( Òè`+ô>Óððä=~åßûß|íÁƒÓÓSwîÜ ×òä VÕÚ¸5ì{­š+‡¨Ö* |…¡«¦í›1óBˆ*Õh^(¯Z¢W)Pè&ƒš»ZÁqN”ì{¬"\¤ YZ lŰØ6”ËH)v¤ì«|_تî·åuMV ÷lÈOªoAUf\+ÊÙÔæÎ|Ú¹R Z±^^Å«[ÎÄÆŠøÓÝæó)æ…jzV©~šYƒ ƒ ¿t¡ýÄÛË÷3úÚx.poТ´•㟽º-2q:ý~0¯Ež :|Š×ÂZjnm4Rž[²šƒ³¡16T¡‰p &?*§Âs]žÈÈHḬ́¸ •¹£ Ö̱ƒéwáTÝ µT–ÿZ&çaX(n—±‚ Å㊠¦åx”ôRSî,ÄdMQ¦’³þî´½¬&a¬rœWò 5n¼Dˆ`òÞ{Ç¡€0ˆ²» qÅ. ÆëÊ9ê¡+v„î›+“âÂúj×tOq+I¸2¬0¿tE ç LŒ^튘ɇ ™ÎT°ˆÈ?»¼ü¯~çÏÞþs?sqqî~(¼¼¼|òäÉŽ@“W Ï¢[˜ÃZ ½áÐÕ>a/˜1¦¡Z«]çº(â ûxj,‰aQ¶? ÝÍ:ºÆh€1Z%¨EÃ,ª°Kû`óBIÊÕ-W)GàÉòRåŽÁÊpWÄ^ˆà›—Ø !¢™FèZht0¿…!†ÌG«3‡ ãçXÊJà:2%L$CÍ#®GUi:Q€–Üv;Ýu«ÜDöQLç°·é{G=€¯ûÎÙ<¬xÕöY‡L½ß?Ñ"BSÙ–Ùûe=%±A4ÃÅÒ?¡¢¦Š"ΰHBÄ%»º8r­ä0¤—¾pbV„ätpn,=œjÛÖS1ÝDÜïbÁš—…xŽ.–Hƒ­Wo°¸Fö6‹”Ù$×äBTZ 蕦Ì5ó5ëc œ&9*IUÂа<}R—KT¬á}gÑ.Ô 1q§‡ÕUÜ•bvZWÐ;1»Q‹q÷ð-™iUݸQkòϾe1¸OçGÄ…;À€e1ÁcD°<¼Çßúƻώî|ñÞ½““":>>>:: öÉ'Ÿì 4¹Å³–_↣fšú•ý„¯ªR{õ@Ôb´½… ;’É r3UIòϹ4µŽa‘ªm‘ 1JCV×D®á’F1,!Æàx9éš‘_—Ë ›³>Ž0‡JèÁT³Z*¨YVÁ¬¦>Ìf/HÖ=7™ˆ3¿2£ìà  ¡ st£±¤ôot(_„H@M‹Ù•üý¤Z3+OË€åº/ïV,~E½wïü—Söä=bXKLÞV 0ßÐ$;ºûðœtV¦~U^}+ K\•4t¢JÔ¢–rBËI(r,œŸGEÐɶó§*æMƒ»TœÉþkM¬iž•àU’ur#+¬ûrà(|¨HÊML ¹™jTÍ¡FkbWÑSx:-$nŒ(>B“á·ÓXM p.¾À1¡SjŸ”¢ce9ŠeÚ™Àck0d"×`9•ª{¤«HÈ’p«±W1ÀÎuKG‡U TРъn§@ÈQà;ßAÀ‡Ï>ýo¾ñîOùçïÝ»Zòüü<\åÓO?}þüùu¡?·xÖ댚‰'|ÝjW\µs˜½Åh’]Ó&^½VHh‰PóÒ¶V¬j†žfBK¬RÍ TÊ9Çp/D dúH)¶LqJJ’XÚÛ1'Ú³»*‘Í¿!Õ¢ª·9Kà/™“ó»©YùPË•Ž˜[±”ÊGïJo˜|Gò,XƒÙ›-^F%ì T.PAíuOõ¬ËUˆVšíç­2©kf@µ¥!OA1w¢`,¾1 ¾î!héõ«Âb¤ ö˜#ª¸w9l°/"I~µ€¬@/Ç…;‰x>øô2Oñ™ø†s“åÀj‹C9:l¸ôuüp¬Ôµ|\N A3Uå^U1,Q!‹¤Ãµež è ‰òU˜XLjêWƒ++‚TCßr3à³)ïÉ0s/1ŒNá^V:="{2x6 oÇ6[•“v±ji3”º Ä+ÇÌ.ªb Š‰ƒ¦{ôI]ubS%èª\*X2(œ|™SY5¡/_æP!ÇcõDì˜|pòƒÇ4:wïxü׿ógGwïÝ»wïè興ÎÎζÛmh±GÝ\æizI¯"Öÿj…„Úí½æÐ•=â]ÛXÉ.v4Ûuˆ¦j?DÚ~jwÆ ‘gø4A\'«d¢äˆ…Ñ:ë`›±y¡S„05LÄ Ï{4 ÃqYz•t´Qk²Õ<ÎÀ"¹þ¶ÜEö óÌ‚:,,=”#b^I‘“¬‹æ(*mË-¦]˜¢S˜7m–àþ½Š¼$W‚y¥,³+õ`:÷„GU5¼³_sIX»žV¤k<¶Õofnu°# º RÈ,ºŠvéÆ|åšmnÏKÎXcEß(,Ûkú«žŠõ7!ýÔúEvÎÇÒ^ªqO¬|”PPMŽ]ØÑeäbÛñŒm^),ÅèEÁ#f–$Ka1tÏïáso»ydS –ÅTWtŽ:^U‡*1;É´O¡«±êb{7-¬WrF¹¢ýJíxÒø½êµÛšèðÆ»íuÏľÏ]ôÜÙã»?ùÛß|ïç¾òÕ‹‹ ι âNDÏŸ?¿¼¼¼±ˆÉ-Òô²\Ũà>˜î‰¾„3bôWºZ*=–íU£í›xá8‘›3.F†e´²Î1£8Ú-ƒ¨ SÚA ͯ ´Ò¾Ì‘ª¢P„ó@gp-YõÕ´Ãr[%‘ŠeÉXÊ„}qGÓ/~( ÂåôÄϵ€bnÕ8#©F:lPÂ&IíèƒzvCmàøKF¿JŠ B ŸÒísäkÌ$4Ü*©+ìŒ;‹C+{^ ±ì Vm÷€÷ðÁ£ÿí÷¿ö ¿xqqAD›Íæôô4|÷Ù³g1ýjE˜ãÏz ¯’ª4¹ðøšèW¯›ÜÕòHpÿ1±«LïÅ[£y-èlRŽgb ‹]9j$8³•Z͇®œ=aqÉžø%³1²O®ÞZøPˆÎE «)þ,È…@{©¦'‚PÔøZQCÊsè¼€ŸfÊ-ÅÖO‡™§0¢rP´/Ož˜BoÀ,gÒÒÛÌ8â€9°Ê—coE’%Y1¸m˜€<“›ƒaí¡Üoõ׺JýàT”n—O‹úª]{4Tœ¥ÔÎU¦Y¾´—-Ö‘ÔP­jÁ#G»V„ŠQÛ€dm—‘ôW@ˆça=lÓ3²ž ãü‚N'k¬qN„DŽwUëj!tE¢ÂTT]†«¦ØSuA?Dû“%¢MÞ‚3ƒr¿ç¥vCèEf$µtH^NÓHÇè'Ú½˜Ó²Aš@ZA« ù…2à >ÕS´²jA]ÓRm,·wË v]m‡a[á™èiX£ÿ þóþ­Ï|öswïÞÝl6Dt÷îÝ,æƒ{€9öc¢·ÏkÝâY+þ0³÷ÞþåWºZ4¦öX/ ˆ' ß$*ôlÐSO—°NU‡ ›+Ð×,.ê^U]JòÎV@· ŠZŸi°Ë©–3'Ô\{Rž BiÞ2kž²;Õ\ ›j†¬*ßA’I þz"G­ð²2®dâë%Â~ÎåB ëju7@Èu‚XôP×ÊSkéL½îI«n]ý*Bmâš8nü*\mõŠèä–¼îPÄÌYFúů=xn·Û;wî„ &ô«=ïEëÏ*ŸM#^Ý@lhoî(Üó&5jO´*®‚$A’Ö©¤^;™@kŽ´°š . }qˆÚÿAìŠ/D«V«’Ý&QA¿Æ¡r@qÌ,4 jòå·S…Û0ôáÚ%š´Ì ábõ®œ¡‹6â{£„–ÞZÐë9•-?dU(Ç„^µ•Sy´>ïX&I{Çk]t©jCÒ«V³ÍzÉ1)㛪s™=3Vm§Ö\¡I”€ Œ©Q´ ˆ¦sR2=üÛIþu"@FÙÖŽXÜ' c•}xIaºL’;éK šàsdmÛ:& "iæbÝ}‚ëUÞ>—oªÏ`ÐN§êýlŒ ñ@.œ'ápÆU£yc¤’轕ã9»œg0lj º,œ >ó™÷DËr[3êøûŽC(Ï‘Ég*Ùq©$q÷AÓ½$Œ5…®T;BA+ÿ½›r‡ÚÄaî×á@m‚˜;†…è0¬^Ëÿ·¿÷Λo½uvv6Я†–1šÞâYË/ñ: f–úAíË7ºùÄ+cysøY°ޏ WÙ|ëò¸3UËŠ°+‹} €Yv¦¦K3×™âuÎÒít 0¬Fù*-ýF­xÓ"5£„sɵPÜÉêí#T3»ÍÜDÀlOlÓÊËsr^v23G&=±dûÒ4þÚKÿÖÂnV9R3Ë’8þÓºA£ ¼{%Ðð­ å óoÍhš8 Á‹n0M˜Fšž£‚¡EÜò×ïú2Z%‘ '©!åá»"жmdF*V«ågKÇœy¬# <¼É|OŠ{TBÝ2v#Ëû\kL©·pÂZblâ ˆSØ|®~¢Åµl~: yR®G¨…¡l5ÏNßN‚F7ûÔ2ê €5Þ;ŠXWCÍ`WÜ!YˆURBh®„jÁؙҦéÞÆL 0óè@=Z÷\s&ï;AQtÒWáÇ“¼ÿàñó¿û§?üù¯|õìì ÀÁÁÁÉÉI¸H+ýêϺEÍÖzÖ3¼F5ƒ*¸OLsB tUP¼â¡ÎprÈ@ cÀäräܨ×v›I‰` è¼ÿÿðûþøÎùùùáá!Ý»wohŸ?þøUSnñ¬r•²†ˆj-dê-¹ç—Nîj­ìîúÂtÄ 2±*›ãм4²êûÃ+N·ÜVo¥&ª¸=cR³¼ê.îàƒr²d“­‘²pTÜååì¶>‹3· ·ì\Æ÷*Æ»†<ë½2y8nÂà åõd|áµ°³¸Ø˘X­y†èöÔlppÞ_Ó¢ªÁp‰IÖÖÆ™¿ áâ¼VQǤ1‰¿Kü'Q: RFL5KƒŸ’5ÙMèÆ"Uˆ•dÜOO²`K^6ÆýÞå81ºVO¡%¹~ÊXJ\ïYZ`f_»âê“,C"-ÊÌ« “¿ºÚU؞敃³ÂåÍ•KTÀ¸„À5Ï*%æn,QrÎu ¬žåÄÝ=÷̪¾ÞÏqdGH`þ+@W4©:4AWS ‹õ¢Âp6ôj¯àAO°› ˜‰¸#Ë€ïêÙãêÊÿ­o¼û™ÏþTPm?<< êWž>}Ó¯^=0åϺ!¯ Ç­âòÞåXÏë£Ô¾ daÝu¶†ê™TPƒ1–”#§šÓf/c%ùEI yÁK±ì·qm#ŠäС«Uz›1,ᅵ„Ãv?¹w·`ÜÙÞl¤Q p£3£˜Ø¼¹ô~æ½ù§–œå#Z yw&€»oó qX]û•³Šà”åí^Š1…%‡BêØ³ÐÞjø€è3Q®$kÖÃê}²fBfS Ë¿TÝNH‘7…áÌS¿nç.þ|kìå\˜%™oæXá¢S/K¡jÁ‰ &fQ­ºYW&o'Ü+±â WIÄEP,¿½ºâH€Ü²½îtÆ’û5ju…öŠÑäÎòç…ÔŒ@qÎ}|@þn{¶.%wõzDÛɱ¤‡5H¶'¥ÙçtÅ¢Saô5 n)¡xÐõR‚½ḚÄã ýÿëÜõ¿ÿÙÞ¿r_¹{7àVvúÕ-žu‹g­r•|8óàã)ó5Rjo všÅ­Ì~ÍúHÝç,x*ïÖ°âZ-‚ŽW+‚tã帯ȎT-’6I¾?nÖËvR¶Å 㲉͗âõ7VÓFˆï46ÊyHß‹yÂBt’Û%Õo–=ÇÛÝþ,ëÒs=¯a—k|<^Øó׬¸ *bÓkŽßOÅ|cz8fhÌ`úÚÙ:•pð ²õzŽ` ±láË„F~·æ1’Ã!r ,á¬ÙÅ¿R ±ââþŠ7¬-¬Ù磦{|•XkWRt«/WÜÈ2åhõ-ï³åðvŒJœÔ«šÆH¦>¤[ÿp1¸)¸kss È-çâ9Ù ‡Jfâúl=ˆX¯=„^Š­9{|æþ[ͨãOl6"zÆÎƒ5v póR÷é»´rœ·sö˱²@W…¢ÂÌ :îÃRÂ}Øi00±ïqôÀÆò€÷A»Wž€_þÝï¼õÖ[çççŽŽŽŽÃ´ÛJ¿ºÅ³nñ,ãU:ƒ@;d•Ÿ×™uõ üôÁЮ¤®•ƒAq'íb¦K?Gz¥ðƒçš“´~M¼ŠËÁ ¶lÕª·ÜZB³Ð:½`ãÈæÌ¼°W'j£‘)^³ £ä¬§B9p‰SÞE¯pSoÌ~÷ƒHúNÜøÖwQ‡Ác ÷M"Mø‹¤'Ç.º$_w³UïAÅyrPi}Ç‚Eˆ0‹ n4à Z"å®­²œEPJù´};QÉ‘3DO*z¸üóYcÇ4ÊÒÄ Þì ¿Zw:«Dryˆ€Z&®±z±µSjÜ+’`WBAs}ð²`5ÂcÏ*L\ljŸÛã@jžÛIÙ[RLV`· /”›3ÞrF~Þm6Ÿø«{´!ˆÝp-‚ë. °Û„Cf¸‘o³´"û ¢*CW6M÷AZ¸/0 u„Ôé¸÷—‡‚ª^盛_ùPYˆòý¿ñðÙ×Þ¾zzJD÷ïß§¾<óáÇCËÜB6·xÖ~®²Ê-Ý*µï(@hÝÆR}„j(]ânkd!f˜bX"ß]ÉxJƒÐôg?8Ïú+‹û[-&i%®\h¡—ŸÎc?è[â©~±¢°p3­Mõ,–DщxHˆCôKo ÁØ L¹«Œûå|7Úñ±bú´¹iµp‡| 7[)«ßéh¤–îíBÃDFÎU#(w²”"»•×Ò—¶n7·×IJZÄuÜ3Ð ç_Ò¥²{ňµ¥*W›‚TNj˜´¸ âZÍ`ᜃR ¶IØ®µ>Öv2¦œ­uND‘é-’ÿ¹O¦ ‹4Y¬ F–@W,Iý³ôý*ýʵ¼½rÓÑζÐpá΄›KȲTzé½ö¡sDLì¨S‚XÈ×HìÏÂ/›Íf»Ý>|quÿ8ŒF;/ "bî,Ôʰx23cZKÈ5)w3t•ÿ‰ý« 48]ñýNY ~’÷4Q&ŠÉ{xüòï~çÍ7ß<;;cæ@¿ òüùóO?ýô5SšNµSTâ{ƒ¨Q¬=¾¥ê]½ªÄ+ȶܬ9þ†5Þ,üŠ•0£¼³•ÛŒ¨„ÿ À<]ÂFÀÊn޼»`Œ K|Âbæö;ä–ÏÅètIãäþ< Ë.ëkQÈZ}(ÙÉïöä{?w¾Ó©Ã~o³©/¸–'Ãή•¹¢¶E–ÇÄ`¬©îÌ‚ö†Ì`ª#>W ’Êž´ÖBƒüç `y[b¸·!‰ É™#°Žf€Fkn¾âPê‰H°ŽˆÌ¤¸áRqÿ¬û+OÈÛeœˆ2I¬\€õóä÷SÀ°,µ„Ê”Â[z=~ $YÙæPQÓWŠhÙ •*„:z•R\“ŸHæ;V¨U¬„û<’Œà”Hhš·êÏ&d‰•¢…æ}À*2¸Â™”†¤z»Ý~ty9Z£:~U„= kø ö³ˆWnÊÚêX +¡rp¢¥Õ±:¹ƒÕ† ]P¯Ë ·~ïo€®<äJ¿ýá'¿þÞG_ùêWÏÎΈ(ˆ¸‡ŸG½&`ÊŠWÙEk?ØÙžgyáë]ñÔ­Yã’ì!Ãj<¬IÌã"<ù¼]U÷Ë<æ÷äF¹KаŠ26Z•oùÅ%%MåÎy­g)ÓÌQd¤¯*·ÄsÊÎ [³á-Ë ˆû½31‚â]ÞÛ¼VWnm:Ê:â(¡W+Ùâ:áHgZìªÙMF« Ɖuoq!á ô©ë-ÅD½cgiÙ HÕ¡™;µ ÃxÑFq7öÇd9ɾÏ5m)*–%f4!>ƒãŒLÒïNÝE(g2]C"—5°œ‚±Z0,-XЬyHl¤ u·Y:…iXÔÜÉ<äSè1Ų&Î*?µU_ƒ®húFó°Iä^iû,9"}×°'Ò%NË¡í¼+.Îã®ÆJÞ$ý Á^œˆ—¯šëzï©g`ýðùe·XMG×Wr÷„±:*`X_s½Ü•Ká§øŸuèjŠa1MK>¸ÿè'‚¦ ŒŽ:3ˆ Þ÷õƒOðøï~÷ûœm6›Ífszz”‰.//Ÿr/±J¼Š{²Ó‡Œ›ÞfǺ›1ÌF(®÷Šk| ÅÔðÍ"帆vÎeÿ`*†mîz‹ûjoõÁ“Á²¶/!&Û¯ÊêoeÚÉñLðäÇ?T‘)²$æ¹¼‘¬]Å¿ …¹”= Å;aeù+hºä«Á…Ј&PIbißëTYsÊî«X&av-}ÛIöF:7„‹õȲ ¾î¦_*’B¿)l\Q¼’Z¿Ö¶­3Œ£ù ú½øºyê;;¥ Öv»Ýl6ï>}ŽQµl(ìçožŽfv @¿ ,Žœ %d*öVãFèª7ä\èW£5÷<ﮥÀ ÇäÑ˸û®~Ð{üøÉóÿå[?ø™ŸÿóçççDtqq1´I~õJ‚)·xÖÍ"íü¯°ÜÕË¢òŽEê§hæ!´_…5˜º 2²+”È­¸m©2ƒ‚Çi1Œ|âaÍàÝâVMÑcþMM¿Ÿd æ«·B`3G­=½¾YˆôšÔ]-û—¼¯ÉaÅóðÎl?\IÒ²fÓiÍBl‡ëE¹7fµï¨2Ûï>åyÝ}µ^‚©-·¶„ˆq\#hýèÝ2jǾÆ>°»ám(”›,C¬¨ž1Šª¸¨³Î’TOË]!ÊQ PӖβ/áp‰íË ®e pM5“ ÆåCYŸŸB!c=¶NÅŠ6µA‚bü¡m—q›³ápÍq)ƒ´Gv¶à&ùŒ³‹räij$Þ¹îuZ»a} ¤)vÎ%V``½óôy>~e1Ì‘7!¸Š|A‘;áâ*b¥CW“lƒ¹—éê‰SÃθËšWp{@¯÷ÿÃ7Þ=¹{q~~¾Ýn‰èüü|`Ä|òÉ'·`Ê-žµÏ«$Ç)–·Ä«dž¼ \슟fvPP Àk¸Æ(Ïd–²â(aá=·.« P³A„B© )Â"êöUf‡¤ã[m·¹Ýè3ÂzF±ÃÒzѼqälƒ”•×”¦7‘ë ñÍÀ§öƒ^íQ/ íù°»Ç5žëž³äU‹õ™–×j"ðÔ¶¢>a!Q¸L„‹s&`ðÖµti>Ë}S@!‘ ©AÁºw"£¾˜iD(Å–>¿qqíe|,k $ *ÔÖ;Ñu7W¸¨´± ›^âyÄïÄÔ«áËÛ$bmž»‹¨3 Ì×ÑÆÂ¨…ÈÉý.i€÷:zEJ_bƒZé߈vE´~W¬|ÎiYÎ̽*(vÞ—lÝ*(æŠáZ+’å$†=§Ó @k»Ý~÷“ɉˆy !y0Óí)W vJÅÌýç£zÉ÷¾ƒ«d«²¦;ÆÓÜÙÀôƒÄA†¸û䉙<,QÀ°ÈÃ{üÊ7¿ÿà³?èWçççι€^=zôèêêŠnÅ­/A·‡æ«@‘24V.¹íWºº!™*¾ÆBâ—& –¹º1Æ:†E†Z Œ… ÚÃJ(¼<¾÷Q“,× LÓâ§jêh9~T)«\;õI«Ë€ÁÚ©¢m3|Æ[+t€¼6¤Üh\à Æ&ØË„³‡K£˜8LØ*‘èhÛæÍÍmézlV¼7™á^¦ÖÕƒò¤Xl]z `þ]6ãCŸmÖÁã0ß ÅF1A¥;Û SÊ´<Â:P4±'ð#MÙ*_÷¡`P€0¢r¾¦:Û(g¬(¤cãx6—"»å·®U„–7i¬ŠØVQ«´ü(Fü=G¯XÙÿLwx¤nÙ]iH²kᢤ‚S3ÚANMéCÃQ «‘·ïZ·Ê`‰pC¬JßyúiÐnãxÀr˜PGU°©@„hôLI©YÐUL¿‡pƒMVϼ0€ŽÇU惿õÝÞA_»{÷èèˆúúÁpÜÇüŠ!Môò[¾bx–`¨—é¸óH?x™$Þ_7èjfÈ}Ú‡ ¨b[XbÔ4€ÆÂñ1ºï—3m/G 6bYsá68ýͯ”ƒè!ôÒ<{›Ë I2L$HD¥å‚O4j_ë«q«8~32Ü»7-IúpMÔœw?À¡Ðwýãg‰î­Ýˆ²a•½Â§Uÿ° ÍjIvÅ5Њڨ ËîJÉ×üÙãz@+©÷N>öºaÁÌ 2g8'ˆtß\­æŒDÔ,ú¤gXñ|¥‹¥`þ²Љ (Šž{ >³M Ožç‹a+ ×ÒÇx®LÕð>Dá‰ÁB¯cXH vm™@– d †Û(|'©V͸T¬Á[v–\Af« ö·‰K¢¾P•ƒ]n_¿Ù,Á[@£¦ÖWWWëÙ§4F¹›H:ò€UõšîaXRàTÊÆV„±zk×MÂeGº­gQ¦‘~Õ³Zà=<ðWž¼ÿ•?úþƒîܹCDwîÜ9<< gyúôé‹/n‘¦[HÀÃg/þÞwÞÿÒÏýüÙÙÝ»woh“~u‹4ÝâY;½ÖPg‘ÀXñãki¿ïQ¢I¼âqNI£«R›Pw¡]c4+·Pr,ÙõbxWÐ@%‰U ¨-¯©P¡˜ÜæpÅtc.}­ºD6±®æåWŠ»SRÔ‡ò›EVŠZ0ÖR»ž—¼H"Ã*÷jôYfAž”¯BºÞ+–{&vö€ˆÿ³¶è•Žà@çÇTW‘‹ÄsM0ò[àH›D-G¶aX«õ^S¦õªukEd¯=9’ûëdݯÆÂØy+È+¨·4¯ ^}xŽøU{JöÓŽª‚Sù“Ã7ê›Be€®•nX e7Þr!<¾òÅ1§ÖŠW‰WÛ-j‰z}½¼×|M qÆ´ˆa‰ï€gEðe³˜²®§SDt•Õ4?ê*7WA8CŒŸ”î„ä´Þ0NYzS$¤ß‰ÉrY°ë©pZ–;;utÜONN¾ûäÓÏÜ9Ž¡ªh£©So'¯Â?‰]¨%tÌä:zÖ„N%H¶[¡+ ZXšrÄa“ŒŽ°«n÷½w¸•u%„øµoýàðôìììl³Ùžœœ„G{ñâÅ“'On‘¦[íx•ã@¼êbÀ@ÐÄ X¡ðWþèû÷ï?8==p÷îÝá©ìô«[¤éÏÚݵÊjY¯tE/§<–Ï3íº¦JCàaäÉkKÁsG^‰Æ5±Aài:Ù -Ê9¥7°XˆgŒÓ4n/ö¸f%õƒF*¢<”Ù晪™™¨~85ÄŠôÀ’mµŠ.IºH„ „­!1v¶fœ=§T ö0­˜W[¯¡:L×/3Žý=>‰4,žpž¬™é޽Å`ÛýŸ!‰È2¤ç‡¹¾pc¥«/e°Ïd°wCulíݘþgÍfÀ {£jÀÅQœ2I,– ¼`P|G Æ"…(ƒ¢HV¹$Åm´ÅåÉe“Y~ßfI€b=f¥"6Äj}½Ò^þ24#jcQŠå¬x.ª³s†¶ÖЫ¶Ÿñijf®øðœ‰S é| LJOç\`œœœ|ãÑ“þñ¢[wÔÛç¢ Ån´„+€ƒëv8.dáPoc”E†UM#òC.úôÔ.ÂmôÞ‘»M§Ä E¥Í.î:)¸ kç×D>Oíç†vhýÆ#LŒç`íK\8å‚—Û|ºFVé,Ýä‡rÊP‰ÕVÊw6üÛÏß30uKTÍféà¦õt‹[„¸6ÿó@Â3ˆ ô»©¨)}û 5&µX>¯-£”ÙŽÚJíÅí¯5«m↑¾°kX,®y:ÕÞúòK¼m§ðËœòŒPtÖ¡+µƒzϺ"ôS€Ìôà?¶aFmuÄ0ÁÆÑó‚3³VÂ0q?isGÕ*h:YͨEk»Ýþáãç´ :Ó‚9BKÞ„½ŒcPÅ©UãFüÄ‘P©Ì¡«ô @À«ú“ r1ì|¿M8èŒúÆòà*¬ðâòêï~ë÷úK§§§Ì|qq´´<|øðÕ†ö¦¼ŒÍµÿ’ÃD¾j´…xu“A¥Õ¯rƒ‰WÈQÖ¿Ù•A£áј¥CQ!eH_‚<²€&—}´‡lŽY©Fí*{Þó•Ý—EY(D(†|e©~–S¬ŸÅØo]¬G Ò*‡ ÄUd€Ž\R¯t“ ˜ûÉg1ë´Å9* +ÏÀ¸qó{›‘pÏ,…ð{KëUbwlEhu¨“ [Î%‰e™7¿qÈçÃ^__±çÃPx!´È•Úy*O4û»&ÍIJ’M0‹)W„Ä"-Boa,_CQHÒð¢:/²û×–m“WÉ&@eçnÓ#×B‡Âºžð¹&Ñ_xdzQ- ½be·–t] øÄ 8.0›‚K®¶¤~7• Aé²}ÆIQ1£oÙÆd)î¤á5o‡åÅPιø$WWW›ÍæààÀýÉ'O~þþG¼}DÆSÀÔCR<èµwÉ'•õA+S¼Ê‰W1?+‚®0ˆÁó˜Þ†{ò̽Θ’=& öÜ+OÞÿƒwÞÿ„·oŸž†ÂÐ’OŸ>}ñâÅ« ÐÜÔìϚά]ZÝâ¼nÐÕÍN\5ÂMAFTC+ –1ê(k?Á°ëf0*¯ƒÆd q›c]²½T£=g´/ß«8nï•k¹°ëÙwÔ1,Rtm9_3’e,›Û¨ñ1„^¾¿é¡È—^}U †×>áq1dUd_Ö\Èd”?Z¿)ÐÒWãùš{ò¾yöMÆF¼š+mÆŠDÃQ£±/U#U QØí°ÔÎNrÂ%®©Z÷æ°—¤5ã-†:e²“>w³$!+Û´ÒÃqNù&Z¢6H'hzL¬ š…y¥P‡³È\ÐÇ+­do(²¼iÇwPºôÈäŠTm\‹LFA™Ëµô4¬íÏ̱ ÖÕÕ€ ƒõ»Ÿp¯0ØÏ¤icx¿`Ńèä°"¯&ÿd] Œ¾&‘@äúšEbwB’Ö6ßñ®¨nïèWþ§?zo¨ ÿ ?=š CÜÊN;ÄK¡¶ÓÎ+û%n¸ÜUë­W¹†õÞrGõ9ñ7-rÈlN6Z¥ÊN…ëÀÓMTË*):´äǸ¤³¸ËrTóVÿ©ƒ9F8FÊøeˆm7F6×fËÓÍΣ\ûáØ¨x‹„ |kžèþæ0oï) &x!Å¢WÔÄ]{®®)t­Õ@6sÜâ/lÉ×}«0`,(=Pþ»¬ “ß~84òP`ß €Œ3e,¸6ùòÊòNî×éK1/Pì?¸êØÆì‘VЇ*ü^„JÙ¨ÀŠT+²Ô‚Q.*´€$B#0w(D ‚L_aû¬w=¡¬X´9ÛÚ†¥S‘$è$„õÿ‰ñ"GBéņÆM+àÄŽëÄÇih’H¨ª€ +à½B&À„aÅ5‰ƒZ­‹ÔjÞÒÈVMz?iÏ΀oq^XDtttt||ü»=£j W¡Â”¨Ùi]¡Ï?Á QúJƒ¥äöJí÷ñ—p&fvA ‹{*Ž–¿¾zÐûc1@?yüüÿúÞ/..Býà;w†f|òäÉ-Òt‹š]× 'èUõ´7Tšw`+ 6ŰJÞžcBÔåŒqµ&9Ø<#ÔâË* $â0›‹sÏþE1Flø1‰ A×–ìÐ×Bs}íNdùA:Ø)þ1.c[5ìgCWœÍ*ÞMÏÞ. =ìÇõ»ç]óè *r­í‰õ”°Pƒ€Ú“`²à ¼z¼o)ʱ¨#Í…«7ìDû~ª‚q [tõ¡•y‚ïo »Îå˜d*WƒÕÆR4+Æt Öá…òÚ!..^ùܵà\x¤-I0#kUùœjÝüت/€—Üú‚ºGõ«ý›k|<'aÁÕbNí@ËÝŠ{n¨!šÆ'uz¢¦]W,QLÊhÒ졦ŽÍž³#¼t‡¥¯ÂÜnÙE‚o=inÝÓf³¹¼¼Œ¬ÃÃÃãããßùÑOºÒItdäN¹á冧žø.„¿pm‘cƒƒ¡nR-˜*^ÉzX¡üº£_!zÒ@õêzS‡[sPvïÖ„ð{Pp¿€ÿõ›ïÝ9;?==uΜœ 1ô“'O‚Ø. “Uà€ËËËív»ë«ìçY^±«Ì>ÕPB8a zµú³¿Ô5ƒrFI±‚´ž,WܰE¡Æ‚rÔ¿ÄúJ¡•žYhüdàíS¶gV8œ¤°µ©~Ǹ¡ñ„Ýräí"0Ls·ůA{ãè+•˜£VEå ©ó·Ÿ÷i—éa-İÊ]Ô-K\¤á£€^%9 ÉÈ\±¶ëC»žé ¼CECÔ•÷♹4/“3‡)‹ÁÜ«#^GªweæuÉSñò¨«îç­ŽU„d)$ds„CMÝ[j‡)&•´ã݌ĉÂL] ûªKÏÊ’Üìó¼¢H+z¢Ù+x‚ØaÊb\C0¨vfQŸ«Ú{¡ˆÐ÷ºÏ¼îOêÓsÇíÎg‹øñ¼ÄLStPàûT«RË()̸Ñ+­?iî’N"VjѺŠÏÉ’ûµÝó{óFú𢄠n!ÙÿT÷nx¬Ä\žWç ¬ƒƒƒívû­g/.MȨ};b,ˆ:dŠCIĨ`5þ>h‡F‘,Á‘X@¸h"zþ'D8V÷ëG‡xy°ïy2äñ?ó½û÷ß:;;£iýàãÇo2nruuõÝï~÷àààèè(À‹‡‡‡…co‘¦›gÅè•åYHõzµ «é¬8†éRšãžFÁÑr@Ԭ‘kö´‚«9[K aù&$l+ú –D¨)ÃD÷ÊÔ>,µ4Ë[«ê½p1~%]¿ƒ-p¡àœ‰€ÖEÓdÝÕBœ¶Š ÕºPŒÐ³{%ǨÈ_v§[\€×®£4/ÍÙ¯÷¢ÈUͪÐUáAPó&jx°jWñÏCu>D5ÕW4ï9Íg‹S!ïè}ó¢ÁŽe—âá}Æ»üȲ¢ëûeøxÞ+ÇŠm¿×QoýÚ´vuµ);|Z.–à-4Ï-Ä*¤ØB¿C£fVÞC‚mÁiÜ:ž‘!H•±Ëë½È¸½rÒPÖ_'¼*–t( âa…( E41G¬ªdB–°³zEC’!`µñÔ½Xë²-¢ZâJÜÊ”3p³`,’âQ7ÄòHKA[Z-¯Ž,ŠtÜÝáÑoÿä“¿ôÙ{D‚±²ŸÜ!¥ ¶ƒÌŒˆTÅ>5ЏˆWã—)”.òóǤ«`tÈàNŸ, £ÐË`]€ï>|üÇ?ûêÛgÇÇÇ5øæõƒ7ʰïÅ‹›Íæ'?ùÉ“'OŽÏÎÎŽŽŽŽŽŽNNNNNN ̬[¤éeÁ³šŸ&<ëBW«]i&+— ßà Êñƒh[Â#¿®yFד¨Q]“_ 7AE;êê'ù>*fQ“Ê7ßZâÇ$ÀŒÜ’Âq±"›Æ‡f9V å‡p¡¸ÕÏÒK$]§‚opý¢êÌ s=›¦­¸º¢úþ2Û=ß‘ŸNDˆùWØëãØ·ù×¼L·?ä\´:{DpÕäˆ0,a>â–tºùáÐLòŠÙÝ«D6²ðïhn-á´ñÜë󤨟GìØÖi€>¹³•„Óš-Ë ùƒÀàœ[å}W1,íp–la„ ²+¢Eca8vK+3‡ùel6¡·êã€ržBNTÔ½/’¤ýdT]-ÿ)w¦.ä$ ²Š^åôòlÏ·EE5Ùî&<5P~ÆÙåvá‰I¬‰QÖ«$بș-É«ƒá°Âëøøøäää7Þø—>stø'¸øý3Ç£ ÌŽy¤\ ä©ÄyËÄ« ÎŽ¡±#y…:ÁnC'x#0Äúqßé·ûŽxåƒ&–÷¿þÎÎÎŽ‰èäädà¿ë¯Ñ°ïøøøí·ß¾¸¸xøðáûï¿ÿío›™ÏúŸð²îܹS¦eÝ"M7 ÏO2CÇýÆJû½Š(íªb’e6Çä¥ôV´Í:?ŠFˆ1û‚K¶Y³„€”­{aˆÞ Ø€Ñ/ 4›Xy§\m…èÿ¸‘/?lΣ[‘fìœFN”°úñú…8l™›®ªµÊRáCžÒ^ ¸Ãþ% QV6Nºˆ#$5iuÒíO”ŽŠ$Ê:D䦮»`M^ð®AÅy¨”“%õ¬Y)ß°I±Z¯ý K¿,Œ@ˆs7Çôdá*y0K W”p4¹}bÙQõj¾¾ºeÝ>ÁD.ÔÌÀôåB)na@½9 $r5Õ£ø\«|/˜†7 gAÊÄàªÀœÝ®9VcÌjY aµ [º™cMm“-þ‰{Ìç·?¬ˆ^‘Ž^YÚ¡¸Ò¤¹ CÝÔ ½âö·ÉfçˆÖ {E²Â«LLékZI@Ú97 8———ÇÇÇÇÇÇ¿ùþÿ "¥CDFa‰ö€‹Y‡ìâ‚Abb ”òø!÷øÔZÅÄ+ ᆳ| íaDøN‹£ÊÁ`Dø¾ûÁùùy¾ òíá†?~|3¡“øι»wïžÝ»wï­·Þzÿý÷ßÿý?ü‰Ž’u~~>àY ±îiºÉx–6«{§7Tº–«`á{„imy#èªêEÅ5±ËÕ‚¼2¶5;;USnóalB '=޳е|ôhH_¼¯È;0*á{žä¯Uä×COø(lûí^’'gFj;pU,µƒøÀÂî¿âähý½¢„P„Ñ_:F^úÆÜqg¹ŒR[Ü‹ÀÒ{A_¶ÑœâåYë7|…4uQ `š¦²D˜—½¬y‡ØRqD“+Ð ÀEEƒE³PËðÔP1yõi[nÖØÀBãµ€ ¬¯V\Ü³È 柳Ž$Äõmy|'bº…®$$køÓV¹uÓ‡ÎgÚí&S9ô´ˆh¡a¾MÚDï_"a¥rÐ8¥:%þ E»kØjrlU~¢‰b"¼ ¸_Ó¸»Œ5QdZѯm³Ù Ö`Dxçää÷¿÷ô'Ï_¼¹Ý0€›z¯„’=Unô2ëÌ p¤‡;’T6¯&BZá—a`HVnÛ˃VW9Ø9û§—W¿õƒêg¿<ÔR¤àþ²@'ι€Á½ñÆ?þñ~ðÁ_ ÿ3Ïÿ³?úýK~~~qqq÷îÝ;wî o‘¦›ym€WÏÿ:@WÌ\Í‹š›w½´MJ¿0Ï@¾\æÆèúbZ†«®«0m)À$‘:H*÷#S¾QÐÏ‚×ÙDØØŒÆ;Õ\Q«Ô hw-Jmw°C)<`G¯ºÈÄ04ÁÓwç“HÔGnè9/;N•ý³“‚HåÇ 4WÜz…ÛN/ë#š[$Bï:‡"m<²»é:¡1,^é³¹=êE8øF÷Ö® j!`±“ðDÛJfbͲS°¶êÒÇö«vðÊ Ê»P<«)Â0ñÅ t «_u'!³0–¸U#²ÀÊŒ3H_.¬ÎÛ"܈Y®ƒžQ”_ ^‚°ALPª¦B\ôª[#BRž*rML½;áÅzutME¯¸åU–£(oØ µk×MFÑ‹w™<Çlï}`ŸœÜ9=ûGïüWN¸@g‚ãÞòÕM†joV˜SÌi!³4ÝUGB´àÿÁ±@»­VãŒ4µ€ ƒBå yø+xÿçûâà( W¡Š0<ÆÓ§OW„÷l·Û‹‹‹³³³ÓÓÓO<øÖøí‡ý»w~éøð=ýô7>øáoÿ{'gççççuzzzpp° ŒrZ`¯öU46–ý ¯˜R{½*‡§hDg¼ßéN´‰€i,Sƒ“ŒˆÛ̹¸†¥U=Þ!¢Å þZÙÚœ¶:×OãNÙ¤$«§±Øƒ:´XITVE%Öän¦õ¨â"tEJÄHVóÎÂ…”z‹¡™Pn€¹—¦nïiW¡H¼HS^…†‰5Xè{2KŒà|ÅIJùP“ ]ÿÈ\Q8CEÞ¸þŠ ×vi¯ßÅ‹—Ú¨éF†ÎQ• «ÞLÃâ<†š5:sÁ “‹¥¶\ŽG wRe]Íhœþ6©e ½„²µl~¶îX²ôÑ:î¡Ní¾ûø¾`1¤ØŒNlÊLnY «/ LŠ Iv$Œj ‡f Ð?@ìzávöÔi½A"ƒªCÃêÔ¯:¬·¾0°<}úÔØ\WWW—ýO.úîœsÎm6›Íf~)¨P­033o6›Ï|æ3AýêG?úÑ¿óÃþçÇÿñ[ùâô/ß;»búO>ýû>úû=’u÷îÝÓÓÓÓÓÓAÆþe‡^^˜fÞXPiÿÙõ†ëÑ›‚9ÞŒ¬fpÃ_1lP¨M˾1/ûB£m8}M²P’oXl#˜*R%Vƒ²¾‘‡E’p*eUe°ô‹·ÙªÐ0·X­q°–?¾êö…qŸ-ÒÆ `bÕ`©´+rzd(.´'“A£ÔZuµÒÕ+p²ñÐÐL£ï^ãJ½Ö[˜ ›©²ï¬g¯µ.{‹©^†õtÙWú¹Ú;˜±Î£µ–ài¿Ûñ£\ó-ß/¨@²Ä¨Ê5¼ÊHÙ¶0‹,(Æ ô ¶ …Š<¬Ù¶TÁ&ÒÔJÅk X›xÅäqœþÙÍ^.ÌŸ¥ðK¦iW[õDBVè(¿JÛægŒ…Ï ˆÙo_b÷ÃÃÃív{xxøäàè÷>|ô?slô îÐ"Œ»ÎÖÔYD©(Å€UGÂáîš°óËé}]‚»ÐŠ]{€ÈB‚y"ï}üäݧ—?wttttHXá§Z?àÅ‹OžüÉ?üþ÷OÎÏu+²ŽŽŽ^jˆ^fXr­Ö>öº)µï?z¶¦ ¶ÂœrT`Ô´2Ê©êi¬,¾iÄ#êŽ+‹-Ô¾\ßr›˜¸qy7Ъ`UØ\˜»¢æ1]µ2…4ÀìDȵ÷Š&ÚÓƒqˆ¿1¯=Ch¤|ÔÌÜS¼,ŒÛ Õ˜º¶£WX0ÇV®Vd]h?\©-[ˆ^5Oò¹Þl´ÉçEo†µž‚aµN)õÓ+KÛ잦PB“±ÉŽÐ«¥Å}X4šÖýaÅظXä."T¬p/φd«,F&rðS ±Q•%G¹TBÙ7½àÑTwÜÿJ¿k´Ï˱½¥ÙP˜. r¹}-„ÿ¦Ž[ ø¸¡Ñ+»+WŸ  FôÊ­4ÈÓÍ2¯•3ºÚ…@ÈJ÷ˆWÒ‚fçÜÕÕUÈ!///;¬ããóóó_ýÞÿ›w;|hØ(ë*ù:5w9ؘ ¥®Ã¤:/¼ls=¬¨löÅÉí"nÅx× C9!@¿þÎûggg©9<<Œ¬Bã\^^>~üøÓO?×¶WWWWWWÏŸ?σYe‹ÀVt&hð_^^†r“““?üðß~ï½óîñ¿÷ÙûŽ™ùù_»wö¯?8xuõ|øø×~ôƒ?|ï½Ü¿ÿ¨71´¾†xÖ>¯b±¸c&šB©×º*g_Àº~Õ“Is…k Ù¯‹³•ˆ+Ú”S£ò•ïÁøB-õ\±J>R·¹âF‡n,6ŒÓr¼1b#0«k½a×½¢vóÇ\úyøõ·0gD,}Æ%ˆªÎ±*Œ©âÍY +´àWÍÈÏí3ÿ?{ïoIvÕ÷­µö®ºï÷£{ºg4š‘4ÒHÌ 'Œ$>D!!„ÆäD lGæÃÃ!ØñÙqb Ÿ$²Ed;$F¤A@Œ, Iè1š™îéé÷ûuûö½÷œS{嵫N½k×ëÜÛ=sæ~îœ>÷œSU»öÞµ×·~ë·8MŽ .h\c)Óhä5qÍzHM„Œ2]•ˆœj­¯\1E:ÿAoܤ.ß,r´t¯wÁíØPobãòÕ•sr ÿJ—-áß_ä€äØÖšF+9 05p–•äb´r¹àVz`å ¹Né™pfD®BÎì6YÔÒ´Ý@Ž÷?N]éMë³ÞÕ"«Ö‹ŽSSVë%æ÷XÉטã¯Wâ 3G¹ÌÀ`˜‰Cô ÿ&ñ· ]ØCswÈÉ%Ã;{ØÈbÄмÊʲB]V´b[PtX†ÙðÇO^^XX˜–|Mœbæ›7o:¢«(sP)%i}æ÷I[‰/>3KâíÛ·‰Hn.Æê.ÜD4tƒÁ@k}èС™™™¹ÙÙÿpùò;÷^´ñðì´õC\VôžÃ+ï¹gåÄîð7/ßøÍcÏìÌέ®®ÎÍÍÍÎÎ.,,È.½@š&¼•"÷ýbC33±“årЪkóc†Õ@ËS7ss–­¹Ô ?5[89^©±Á «VbqY³ÒšsÁr¬)Þ¯K²ªœÔì)s7 éJº+¶Ú59$K”e7ω¬..‡å‹}ÎîB­O·i|—Ïs¬44ýÆü“¶Úæ¦8ŒÛî!'èjÔ®µKŠÅCƒ†WÅŠM7¸°rÓ6`£Xˆ*v‰ëׯoßµÀ&öé1QQqɵìŸJˆÄj×b˜a7^±r1!*·¸ª\6pñ+%ïǼU™ Ââ"{)D£ û–[Ç¢žÉ)#¤ÏÜ¢7Ô]^”Шô‚¾¼¿EF%½ÊB¥¸I›‹ ’¢¡JY)ÌÚ.ë!¬³ ® 4k}-´çè:ÏMÈ‘¾¨‹ 0eƒ%K o{Srñú7]åÐqJ\Ò¥ a¦(¨±MÏ€>ƒHA– Ä´éU,mp,Ñ;ºÃؾ…“±T}¯ ]ɺԄâ+ÙÛá(øÓs×^ôÒu±¾ÒZ ½2Æ ‡ÃÜÖ¸qãFÑŸ¤µ}ß—Æh5¾@ઠ]!bD¸D‡³´sWÜÄ÷ýÁ` ”ZZZšžžö|ÿæüü{Nœþo׿äž5EVÍ&¿˜›þsÓíŇ>vuë_Ÿ;ÿ¹³fuuuyyY¼Ïö½@šúÞJ±Ê}ý»«b^”Ö”H¨Í&Ì‘J¢Ùæ—L¦<ôаN2—ËJÁ²•“Ù\`£ÁârLèðJƒM—Ý',¹B-Øæµ†@ñ-kÇõ@v!^œdÁEYÙ¨Ë!7¸ƒˆ5éåºòCŠE–’¬üýãü–Êt’Ü|nMË|fÚrD_± ÜvÚé väMà}ïsìta–>V ØæôŠË R"ôV’xí­ç9ëp§ «YWáúÛ*IênÙc;ip,þz6Ðq-Wl,¶SÄ¢û9Ik9,¨í’”çrÔnwÚÊ®¶%“0BµU%ÖõÀJ°,æÚ=&«Ìt´l·ò«ûÁììYéÚÞÌB‡UcvQ‡Åä(úT¾§øêã4ȱuÞPÍREró]Z€{ѳ6Xòdnnnaaá7O_þÆ#+`ذ!2¡–dåijö€cä8ưÆNX b7ÀŠÊ†ˆ‹c¡ƒ¸’ ;1†%íÎDfXÀðÉ3׌ö|ß'¢HñÄÌ»»»¹nÙ[[[¹ôŠˆ¦¦¦D65Þ æ½½½ÝÝݽ½½½½½Á` Ë#OÄg]’EèÇuéUå©÷}8c¦¦¦><==íûþ¿:{öž<ù—ypv漎ҿNƒ"|ÇæÊ·Zyfgïßœ¾ü›O?å-,®­­‰=Ö‚ä¾@šúØJT ³â‰Ä}ÏOtUðÙëh•¯^É^û†©©¿õþÀ†K†‚<û΢ëúà¸{vÀ­Š6YB¥¢À¢Ê„-Xa‡ç®ðf{1ñhѽ7m»cÙ·X£ç1ëœÐ$®ÙBìÄ\} õ}X’ïÊPT^³F%…ý}êEøÉ“ÎÜThP@K·Âí§rL÷DNϲoõ’ù XU$¡¬‰‰kÆöóm»G¹ƒ;7šÍB\Ó+ç}Ý.t+•Y÷ÛŠ8NÖrX’b*‡R¥áTã«a33Ðr{/,ðƒÊý”®ÛöMÆÜ6çßzåbXã^Á1 doõq¼Qò… ”¬LYÒ¾®6Šf¨l¥Â\zÅyü óv’ò+·B×\ÈŠ6×á2~¨µæ΃_¹»ê˜Š=„èb¥d/ÆcˆH*Ö}ôä¥0M)EF2ÅÊÝ0“-MhýeØö_«ÊŠDUÌ@:a¡¨°XeQ—ô4±¹’3*Ž„WloqXïvAZ†?{áÚÔԔȯ`eó£ÛÙÙÙÙÙɶX¶lßÎÎÎÖÖÖîîîíð±³³³>¥W§üß[ô½…i½èO ¹º;¸¶»}ewpqgpc8šžžž™™™žž–'ò˜žžN‰às­u»»»SSS¢¨šššºtéÒw~éÄû_´ùÞ#k€„€DbT/ŸùÛ¿è'2¿qîꯜ:ù êÕÕÕ¥¥%É+Œ‡½À³ºÝJ‘ƒ;7*´ü*NiLº‘\DÏØd/ Ð] Œ€]¿¾FÀÐ^Ó×XÿÞÉäËùË¥R¬‚sÂté:ܪ g‡½àÂ׺ÍÒsdsNJd›‹TÚ´{`ñ½sÌ—Þ•=í ýB[Œç56u '²½I\ìæî~¥À:» ÊâbÇ›WB+÷·UAcã"Œêµ`bç[vvy‡ÒÒ„àv¥®C.$ºcUU—¢¤{]Õë+ü׫FÆ-½‡Ø¤ñ=´¸¯QÉ)/ZV¦ôçÜtçK¦È,VËETœ\ÙÕLŠ€Ö(”G¯¸]vg› .•(È!h4Ñɱ»•\­]l°¢J-BQ þôãçn|Ûýë`H”WÆb MÜ ÉV˜8t­$D`¶’ršXaž m¶ ŽRŒ5ÚˆŒR¡fl.ù_3Æž¹¶===-è*1¢œJµÀh4ºuëVªÅ¦¦¦"!’üi{{ûæÍ›[[[W¯^ݹuëU+ ßrhå ‡î{ýáÕCó³@fJbØ1JG¿|{ïK—®}éò/_¾ñ—/>ykg~~~aaa~nnfvvfffnn®=É’tEaX"Å’ò‹ÿäÔ©ß¿ºõ—ßwtÆGD´»:–ÈÍ)úû7àþÍ'®Ýú•ç.>þä¹¥••ÕÕÕ………¥¥¥Æ*A-( xð¬"YV³¸»í®âŸÍùžì½?Œ ža#ƒFNßÞJy!q“¹ò¦ôý}`“RƒV.`Òw2¹³Åwz1–0¯¹+[¬Î®e1±6{)µ[XTÔ .¨…Å^Pl2’s´\Võœo¤U>¨]Ÿ¯T[TV¢,åQUq7»~oýY¡J@À\¿õ+æ¨ W„¨]/™Ò×ÞÆ“o8ƒŸ{V£åUóÌàTŽq¥úfÝw˜19ÛzEϦ]A-“ÉÍçÉöa®Ó‰7³©‹C]À—¬~`V‰ñ9;E «ÊªaýÝÑa[¹?«ª4çJ½¨Kz;ØÂ×é–¹j¡2º„Îç ‡=¢Mä<œTk¹YcUñÁ‚U¿Hy”-·¯—­_ófÏÊI¸sèãº"j1d«N6¸†¹GÈY,’Jö§.½ó¾5´ôŠEŠf¬ƒ`2ÌÉÔB¯äf:‰+´uÏ¡W¡ BÆeë0DÝ!4ƒ7IèNk³m™D ‹±ÛÓs+’¬çy^”·•õh¿}ûvªe–––"ÑܺuëÆ7oÞ¼råÊ*š¿ùª¿÷÷ÏMyLˆJ""*©º@¶ZœM‡Þ˜òß²¼ð–—2fæ“×·>vâÜï?{öÏž>ëÏÌ,...-- Ò’š‰’ð( ‹ˆVWWggggffž>}ú]Ÿyꟾòþ·m,C’a1 oxlcé±¥ó»ƒ={þß>óôôâÒúúºìžËŽM=*ºlôù—3ΞE978¾Ë66ÏMÒŠœK&7¹ ¶+œÕ/“jÖ‹Š… SàÜ$«¥´ªôÐäªÏ–9åó¸Iâ09{µjXРݳ‡À¹¢N­=i`_…)ŒÖ½¢œ^aAàPþ-a•t°ZOB¥lŽ=‹ØijÀÜ¥l3qC¶Þ@o“·èØœ‹Švc2öíy/Eî{Glq¢ÔƒØëf1­Aíµö`ÛÉeè¼gpwŸåŒz´“ƒÆS/Å|ªáFl\ÇG VU“,’_•W7Cp)æ-KhWJãœÝU]v†Ä†°Ýpá<ßCΘ½».°ÜµmÑÄ]âæNÉ.v›r©ïÓ†^Õ­rZnk…IèR·8Q Ÿ: Æ"¹+éÆ÷Ÿ+M1åí%Yx™¸Ç} ÄÚ\¾m4 ë‘,Â={áÒî`S+6Œa9BÆ ‰(Š"íS´Ðg ‹¤ (…‚‘•8‡~W1z•ðÌ’ýŠn™#³a@K´¬ÚXteÓ mñÁ°`$»¾}dõ°WEžS£Ñ(Ê—”‡1&®ÉŠÓ+ùëÕ«W¯^½zöìÙ‡æ§~ê ½ë%÷*­P+$BEH Q€¬P‡uàXÆ#ÃÄüÀ!ÿ}ë+ï{ÝÃ[;ƒ?OÑUåäq:ÀŽDDÓ¾{6Á臅c÷gÎ.냼Ë:V­Ó1g9e¯XuÑ9ŒÇâSˆ˜³ÄŠLÔ°¸öN9t«ì6Ù´¢69†Èm;‰ãÛuòNòOëkƒnœ”Ãå9Àõ³]%ÝFãÜý¡D3 ×­©Ý²VcÞpñIcîôlåVTƘê c¹»=L…¤ñ¯¯U4­ô´Ð¬W”Vwcî%ÚZà·î¹XO^ŠPá:ß\ž6èî«S^3±Á­dϳWg=¡žZD²Ðé"ŠUMƹþãxÕÆêå +w†Âr­ÆgJðSžïUn_Áâ¦Kef8NµÖÜalN^{Õùâ„ê?&ºÞâj­õ`0ˆ¾m8zž§µžž›ÿð3Þÿèýl˜Å Ë„Ú+h¬AX%ÃûnÈDa¡­'ý cô*dq4j8Ä ÖœÝ&y˜ØÚ C¸Y{gÀ03óùí½=$I©‹Ì×™9+¿ÚÝÝÿsqq1¢WƒÁàòåË/^Ü»~í—ÞüÈ;<ÊJ¡&Ô‘R H0 Eâ2Œj-2 –V2ÌÆ³2ÌÆ,ùÞ»_õ’oŧolýë/<ó}éÙsH«««+++¢Éj|ŠgffÄ`^¤Xëëë¾ïÏÌÌü³S§ž¾½û¿æAŸ!›Q(-¿¡ÕÏ|í?úŠû>ôô™ÿãØ± só›››KKKu1Ö$yܱ*°\5VnµÆ[¼ËÑU£5kÖÏ¥¼Ê\ݸ®ï3º2w½×F|˜Ê¶á²¥QG–M¹”e6‘›Z}hØI#sÎv놔ÜO7N‹G9Pc)æ«t˜îƒaA©A[ã¸k2,.?Tî|ºêɆ©¯¥¬C_åIg6VŸÈüfp´øišæ6v×ìœÍk¯ÚÈôžmÄZ| õÙn߃…÷Ñë Z2U+“ËC~}e‰¹\ ÇÃÝË…Fíf¨ ŠŽÈíK¢'ꕞ—R—ćHB²Íú¬§^I*€˜;ñ©LÖq9ŽÒ&ÀâΜ°¸/ÚÇÈÅrù)ùòòçèœ<µî¸]jÓ˜ž«sÛßŨkߧŨ¸‹ïIwo´„C¡Ìgö<¿°´´äRÆÎ=dæ¨þ |P ŽRj8~úÔ¹÷½ì°ÖVs„@„J!"P˜’FH$ÖWÚB¡À"$ñÀ²ñÆô*´Á §uÌâH¬e+¢½.¦ò£ayÎ#æQÀá‘ùܹk¿sæÚúúº¸°G.NÛÛÛ©Rƒ[[[&X\\Œå¶¶¶.\¸púôéÿê;ßøº£›à{äy4å‘ç‘ï‘ï¡ï‘ç¡g£§å‡< Z£ç¡V¨=Ô ´BO£V¨*5~þ,ÍNÃý÷¼ï5/p~æK§Î>}îÂh4‡DTdAUyеÖÂì´Öˆ(~XÓÓÓ_¸zóñ³ÞvhuÆÓ€rNIÎ#سIHŠ€pÆÓo>¼üƒ/¹‡ƒ?>~êÊÍ›Ãáp4)¥"Ò×ÍPÂIŒæ}ß Žù&‘Š=äŸD4 ¤}úÆoñ}‘8ü ¯}_CcoßæMÊ–7Ì™¢{ º„=´æîr˜bž^6aìwõ×­ëþ”ï0º¬¹b©“Yɕ߃]tTt¶1mÖ*»Vl‚\“VWrÛ|ÄÝÌ$ÜóÄU¡Ñ mL9Ѱ Vw:Ë8SWîã\RI¨…Ñm[[©›S¯¤Æoxk?÷7ÇPé¯Âd8Œ˜;¨±xƒš“@î§öf6îrÙ·âv`äzG阮Ä9ÉÚœÎxÎûx‘“W-7Hå,‘s1ÅÂK@I—Ž–  ª.$ rãÔ+=/wº,ÌÛ|.ÀÔÔ¼I$tXUòuÎ톘YaWöêܺ~XPÉ®ÁôŠ¥“Ëi./8˜æ†±ÅÆ/jÉÓ€ÉËœûŠpߨé*!ACÀƒhѧ÷fn~yyÙ`¹Ç‡3Ç_h¢µÞÛÛ»¼uë>Ÿ^ž" é*Ë­ä Çís $²  IRÔP,—d”#€å¼ã†'ؽ5k`cSŒ%UåIÀ lFFž?þì…ÿt}weeevvvnn.ammmÁØ|8Þ¾}[þ4===;;+¯ßºuëÂ… 'Ÿ{î½/¹ç¿ù Ëó3 |J¸•磯-±ò5É>ñ4yš´F­Pk?Q i…Ê>¥Héˆa‘Öú+?ðèË^¶4÷©c'O\¼Áp8”dÀ§8²u—ðPæ@(Ú%Lœ„¼›^$“«gá¢Ö>B ìèãñSL€ˆL š'D„Oï x¾!À*ªÅú*<¬µŽ ðF£¯œ¿ôž#¡a)"E!W³ÊTÈH¨P•Í$DBF+,°ÿBB@ŽºÇè•Õm1‡R¤š°à ± p`Ø1F~`d8~ýÉSÏjyyyjjj~~>2ª¿qãF¼ööö"AÖâ⢴ÉíÛ·/]ºtúÔ©ðuÿøk_ASZÉ•OSú>ùš<Ÿñ¤Dî`aršÓƒâ„÷©ÌEùÑkÁÆŠk ù¸)k†:IÊ 5 £¹0ћ݇9× ‡]FÖiöT?sQõb1KBÁ`IæFCÞ,(ÂRa0 y+!W€_¿‡0+`a‹™ +û{X’­¨ÌºÍƒPÜÍn?V ¯â ŠóV!½Jµ9f”V€%ÖWX«¡Ûì00{X!ÔÐnÛ¦šŽVº¡˜ãÒ¤ÈøÜ÷ýãW®¿ymöÈÜ´E¢·R½BRDˆ’8æÚ¼ÂPEQ2d„©Ç¾QÀÑ]¨q¢©}Ç8wJ °Y„‘Ë0†G†G惟?~ËŸ;öùùyÁ+Aܺu+~Ô;;;rÔ’[ƒÁàâÅ‹gÏžýï^õâ¿òèË,¢ò=šŠTW%3Éר=ò4yh-0KÐÉ%SVx…JÁ8—P£•bYtEJ!!B¥^¹¹úW^ýò9ä~ñ«·w÷Œ1Rd°îɲ»»+ ‹ˆæææ´Ö¬Ô¯>ùìýsÓ/_ž¹•²˜Òʯ0ζ$ÙÐ×êu›Ëï}èÈpo÷ñ§NlïîIÊŽ=O2[Ò«8Ê+°äÅÑh$2ÆÊ–c ádr'†®äͧOŸÎ,(X.:å®npÏ×—òoãúW(´žažŒadïÛ³kM|q±…?'›)!Éÿàĸ•û…û?ÝÐ?½r‰c;ïî+·NV“ÁŒ£»ÑÙ>AjQ£ñD6W0^5‘ã’§\‰J3»¥C)v9-\³ˆ…H%º„Dð…ccutX¹ƒ yY `%aBü~v2+ŠÝÛ*Už‚÷[Ì.µö NnÉÐG›"•@°î.ÕXœ_ד]wђ͆LJÒê.ÅJ ".ÈÆsНë ÚøéÖn½¥E…µd­…â7M¨˜(.t’Àb¶ gØQ)k¬‚)èF¯Rfó™›„X¹’¨…¥zBWÝt¾¾'_îe­äy^¼ß`0˜šš’¸q~~~uuõCO{ÝÆÃEl cÀ E2•T&D`&°Æîl]ÛåÎÅ|¯ ž9ˆvñƒ€€‘ó•ýœÉ\/xÜíÂLCd†ã7nM²ÅQ¯²qþBDIdæ+W®\ºté»ï]ÿ±×¼||±µòbºª±›¨¨Ä:J”g” ¯-i1)Gl80(¶îaHþ#k…bæ¥Òú‡ßøµßöòÿÌÇþìŸyæž{îY^^^[[«ë?%8òÖ­[sss‚óÖÖÖ´ÖZëŸøüñ!Àw?p5¥Ð³,:–¨&°œZf`žÑôþ×¾ôû:ú÷?ýÌG¾úÕÍÍÍõõuÉÙœiºküà!V‹°Žv÷9µ÷+kYÌöëìÛzÉn7Ãx̪l‰ ŸOKk×tÞøPPM)U kb`¨î ÊÅÑŸ;jÒØ™ äÿ½ž/œÈײÛâ­Á"[" .Ø¿ý›Ú äšïq~?ç l†[­AžºÀ–ëè©%s:a:-2éæŽ¦”?G.w‚ã®—9•éK ÆÀ&bc¦¦ÕCƒø4c¬ÞdÙPÉÎÒVîÉQC11»}!@ªÂqáUµòfdåµµœb»4B¶¹ªr7S[õðj„‚³EŽ]tªX: aÖ„Œ [³µB­Ú‹%ô JÕ­PŒ<¡>ŽÁÆ} Qls0)/çN&J‘\ŭ܃8a-,,lݼù±ÓWNníÜïͳ1ÈÌÆp@¨ØƒÄ„Ìl€TX  Š‡#ŒBµ‘‘™ƒ‘Y/"›P^a˜E„‘ªmèÆ\ÌlßͰ; Noí¼ü¨õ^“’˜Å_‰Ró®_¿~åÊ••`ïgßô(X»+ž&ß­Ð÷`‘§A)ÔQÞ¡õ#´µ)¹ütÅÀ̆1dXgX£… t£ÃzÄ#sßúꇿç¿ý•cëcOܸqcooOüéë2¬™™™íííÙÙY¥3/..Jûü­/þË—EB9)‚®)Jó©)‰!,dcŽ,ÍýÒ7=ò__¸þ³O<õäW¯:tH0Vd<÷‘¦·RbÊž}]8ìAC£WÝ”wtÓ,¸p+îâZÃýˆ°Ð•aq¶Ð{âFÆ@Rç.Ë•k›x„Ù2`«05r^é¶<¿Ü%Í,\½¤<˜èª= hÁ’Ã`9P¨ºrÇ8y€ÍÎwsàì2«rÍ’;>MÜëÁzóEq†N½(™æ–©X ÉU^dHÑ­>Ç8gÁL‡30w´÷ìVz/oë\nè.¯©{µÍ%SEÙ”\ú‘Z§ËŒ=°Š<ºlî”C]j)–Æ(ñ’x€˜ ˜Ñ* “{\“1T˜J€Ö¸4u¹cQã”[RÁVa/N¶|˜ – &+”Ô->ˆ•º©àãþÁòÂÏî ‚¹ùò*„mâÒ8ÀbfÁ’Ó4ž»|í]÷®……Ç)„¡q;!‚ÍDb •€EácŠm6õÃHbÙ7Å*Ãcw˜ƒ€›B9võ懿rêСC’<( ƒA\e6åŸsssJ©ÑhtéÒ¥sgÎü«·?vïêùxš|1½˜å¡¯Ñó1Jô<ïv%Õc–íqwvEÖ¬]+É ´¿!IR¡X§+$QÊž" …¡±: >´±úžG:~ñÒÇOŠ8nzzºÖéŽûa ³›ššÒZ{žÿ_}vÅÓ®-¡ÅpJN¢TŸDR’`Ö(Œ² ÌÏ|ÿËÖŸxæÔùk×%åÍѱkÉ€*ß0JËz`EY„ÙÂÈÁ½ˆaÝevW¹o®›BØköSËkM=Ëö4v!æÔU5§$WÑRl_S{}’ö˨6oÀªÒ-9#îÃùíÝ_iÂ65 …ãÇÁ §ku‚\Ãf®“ÔÃÝuÇñ°ìÙ ^5®O•­_`¡¼I Ô ¹©8„t a¡rºæUª·sU/p³ÊŠý•£@#oš­˜¥sŸ°³wîÓØq9›Eï,àrï8¶áSyMÄu®P.צrm—ËZó˜óï*a£*P0. ¾e%€Ómf .ÍNl·&i»j¬Ës§$a–NúÍŠÝ`UŸÎíX”lÜÜïìyˆªëºÓ«^Ó;é4}š!Ô¹£ÓT'’‚b<‹ýùòòòöööïœ8ñ¹Ë7_sϲ Ƙ ‚À "4ˆ˜·óIdGÄáÂ…B²) (Q¨ÔN·¶î¶ †ÃQÙUf$ÃIŽÅ_ °=¤úž`ɽUÔ8QF¡Ô怭­­›7o¾ëþÃ_{d= Z“ïIñAдGž[mЦJ!j…Öê ‘¢dIŒ¤aÕ©g¶% KR!f ˜ƒAAQj‘2L#TÊŒF‹D¿ôßüØg¾ü³jwwW¤XµÒ åÍÛÛÛ‚í`aaAÚçoþØá}¯z12Zìf¢d}"0ÛóÇÖTŸ¡€¿çáûÞõàáþ¹ãüòñë×W777———åËûè®}l%[FÐE…º/ †]5Zç{ÈMgò—Î<©ËŠûb óî¯æ,Å9%ß6ÑEE[YµëãªV±h‰nocaûõá‘ßàŠß›Ï On9»h†'2|¸¨0ÖB¯êQ¤‰LhA6·ÈKk[Æ&¹B¹–2Ftì´FÜ£4ì¶cÎL§Ü#zß÷|n´'\Á¶¬[¤µ¾jÔÑëÉg`g¹X°çÙCyúWò¯ÌÕï©×©y8;-s1—àZÓBÁ¦³¿!cÎÚŠÀÊh*[Œ,ŽÃ÷B¦ÒúZVGŒWư0“VÚÛp£WEop¼™“»ÂÌMì°†4·>5.ó vÔ Zœ¦ÚmV+z÷vòöíáp¸¾¾.§ÉxžgŒ¹}û¶äÀüü¼üéïáØøÇy0ÒMrXT2ôà·wNDùÎÀhØ€2hhN©Ÿúú—ÿÃ÷þ½'žú½§Ÿ>räÈÒÒÒêêªäØ”›7IžÅþqºZμîJtU÷ýû²>€NX%Žjù›œmJ¬J™ì– •¼âx?'rÒ¡¦C­;Ã*íN\ÞÝït†ÅMÝ0ÚÄ®Ñv©éܲ_Í^©¿àN7Ñ×pg“ Ob;)oî€ËsýƦЬe4~p§/®õF{+wÿv–+Xdü΋”#·­dXµZ2×+—%aÞ¹ò9WU¥dÚ5dÒ!SÇ«û‰¥ß‘¢±#åL}æf¨[Ž7Ëšj1¬®f[*¾MÇâ‚Ã0ë]È]ª¸ïp}õ‰‰7`K÷r@X£Ñ( ž———?uüøïŸºòöo¢! ”õq7ÆA4† qÌ[IXGèæ·rç0Q2Ê7‹°$?ˆCv;ÁYqG—ðÖ|t`Cc(Iñ,¶”–ð,©·³³sóæÍ榿îÞC 9€:²o÷¤È zž¼:ôÀ²u H1’²GCiý¸8xY˜e„´â~%+0ÀŒJ™ @e @)¢“)­x82HHôè}÷üþûþò_ÿíO|üøñáp¸±±±°°à΀¦¦¦„aEžîÃúÀŽÏùú‡~1Ž?ŽaBW³?,fPŒV‹Ç¨ ô¢•žý5ŸùÕ×®íîî./////»dNžgM˜š•(³ríÚ£+¸[„W 8Y$Á}bÞ×⡳`¶ñpü÷ürò¦ eqÝšëì¼*œLü“*\Uo‡_xtºÊog?Þ,̘pìÍU`®Ö~ºûIÕœ'¹D¯…b= OÈ3Æ~¥ÐÕוÕ½Ù{ñ`ÿ„åÖ%€&^tƒÀÉÇ­²± fiáöSXù:Œòš“ò.rXæÁÙQn¼ µI®²Ú(D·VíR»ÍÜù•-º‹ O\©4#'¬•••ååå¿÷ùo½oM¤”acІ•ƒl˜ÃŠ{ 22’¨íÂ(€Ñ7ŒØÎøÊ-",ÎQs†ÿ@[,KÒÜ8)¨2™ÜÂTB9vI©ùÕ¼îå‚®@+ô4hÆR,u”K¨PiÔ ¤!‘aYy’M$„óÄ(žd°1È`åWÆ ÒÀ†¥Œ1£MÀ£‚P¡¥`4""ÅŠ@qî—¿çÿËÿ÷™òÉÏ‹MÒÒÒ’;CwaXòâüü¼4ÔßùôS÷/οåE‡"›Øí !£¼*§™Ás`P ôÆû6~÷ž•ù…ç>ðçÇn®oìì쬭­¹K±înž•ÚJj‹a¹,â8îûnuj+):YŒbñ ·ž–éERùf µäžç—”*É(,*fD-ÁÝÊ ÞÙä±´uò·ð¹>÷l%ñ")w.ùªŒ[,êäM“^U¥§Œ®òËé¹S³Ž›ŠócZì:{£(‚s²¾‘….šÄ¼ËÜïb)úÞëf÷x\Î Hi&6ˆºHîãÄÙá¾ûÇpÜ*뱪x¨M.aQøWùpÁ† ³óœç‰„íbÿè¡;¿$å4¾¸@³ÉYAºCb*gh™N?;ÇeO0` ¾ÑUÉ,œ;×P¦?å~s®N›kîR3Jt;Ò–QGï”Eq̈²'ˆÖ:r:ãó¨¢ÜüüüÚÚÚ±c×ÿíSç~ð•÷šÀ``L`”B¥!1Sˆ±€)^‚PêŠáŠ¥Æám qlg‘„T™½‘ÁqE_ëżÅ `€!³TÙK…Ç)€eŒ«ì nÞ¸ÁÃÁ÷¼òA †Eɲ6í´&Ï­P{bÁJK B@¥Äþ‰ê«XoäÐfF¬¯„gc@)0acˆ›(À ` ̈ˆ&¥€†Hd‰‰þú7¾as~ö'ïOƒ ‚`uuÕ›ÌÌÌܾ}[ü°¤¡æææ666F£ÑþÁgëÝo~hcIRAÚÙªÌ0´)3¡²Ì"TÒ1P+úÑ×¾ä­/Úø«Ÿø‹§Ÿ¾¾½½½±±±¼¼ÜU×½ÓyV–Cc$© ´–µ|ÐïJtÕÓÒ3¿ï”8’Ü ãkêtl”sx˜±U`·ëi›ýÇ:E™X'„²7‡±ûóËN¡ÆÝ ¤&?âŒóu_X¡K›˜Ž¶Ò¶ö;W6wU„ öç@ûÐ~¢ÎØw‘Ô`*‹fo–N™¢Ö$S#噣uxE/Oøu'Âû"`äößÁñžÌ\s–®åȵ§„†Ççb·-^%j¬\Q6½ŽaA*ñ§Ã¼œÁJZ×lÖÎ]9ë2—ŸÇ诸HØZ™0—åNV ŠZÞUœYaiu–C1[ë‡Ýè•#íJ5‘dŠ…ú6.Q5(úãΉ±J%¸/QÔ<Þ(¬•ȶ§¸:°d[Ãá0òw_]]½qãÆ?þâÉïzé¡yE0eÌ(@dÃŒh ±2À³vË—„°\¤)²l·ôÊBÌŸ,óÐJXáUUfÁ `´_È’¶&¼/•B(´¶¶¶vvwßý’ûggPk$ER.PÛÚ‚ hž¶Î EV„E„¤@Ê2"†&î±t9Œ ãXm*ŽÒ ÁfFcÀ(°Éƒ ÁHñ(@ H)¦*2£$DR ¿ÿu_³6;ó£ÿáqaXëëëîñD‡µ½½=;;+¶´´4‡Ãá{ÿßO}仾q}~"72^IqI ÿ d½Ç˜€™È°1¬ AÀAðÐæÒGþÒc¿ð™gþÙ矽uëÖáÇ×××#*zG¦þ¶RRXp2i_ÐU›mñ,ïÀå%G‰éåw¡\l={¥.:\¾ÎÉ5!Â΃j.ò¸çLÆ^LJiªÜÛ¾qUînèÎû0’û¥W“"†œg¸×Í)®4Ëk i&Ô U8GKš©Ût\Ô±-‚8±y`bfXuCf.{5©wFÅj-ë}EvrãÒkdÞ™¸öqmÖQ’ùT+Ÿ)wç³²,(p{(Ñ‹aËnˆ¸Ó“Ëõz1»­Üjï¨Þ±é®Fn \\ šÞót™X‹´WñÞFyŸÅâŽ[™XYªÍì†}N‹“]¾”]^8ùh¼]"Š4 òˆxÌÎή­­m£þ¥¿8Å1&ÃÆ6̆Á0æ |bBV4ðxìY5ÆÉ¤mò è}ت~ÂFðñ§Â Àö=Ö`h <Ä©]òS ,# ;;;ïz鋈)…ŠPiÒH£"P¡%)TÊò,%KÒ Fy¾” 4DÌ˺ky 5(m¿Äæ'z¨5ˆå–çƒç‘ïcø=}í+S4å¡ïƒ/õÑ÷ÞñÊ—þê÷¾sëòÅóçÏ_¾|¹Öéž ‚`gg'êE«««»3sÿÕGŸØ™Øø+¢uÅBR µÍ©D­ÐÓèiò4y}=MSÚ›òÞÿõ}ä?ÃÒÞ­§Ÿ~úÔ©Sׯ_oßW]ØÐÁÜJ–AGÏK<æ+¡"Þ«ÎÙâ-Uá.Z¿v°IÊ9àø(½Ìá¼=Áªú-u—í?Î1Û\æô~–ÿt{F¸Uçä‚&?ˆ@”Þ.uµWœ4¥­+ä®§ Ê>Áá>›ž§·CK.í0б;æ}¢8Jâ–;V>‡P›/Eä¦`ójUçxÁЯh8†Õ »è£qÂ;ê~êС?7ÐôÅÆ—#¨Y©°ˆ¬U&gtÝÿ²7SáÔDz5ÏÏO® Ìœœº¹`‚©Ø¼ ˆÉ]]Å•r&üÉúLQì§èK0ïÍ€XpaH9ÍSÒÐóÞƒUE^ NlÐ5²GšmŠþf—ƒ h½‹¯yô0ÆÄÝ…n|ð«gÏßÚå‘áQÀ#Ã#á€!`6† £ ³ ³Á[av 2Ãx¤…hŪÝ/aX€b¼„;‡ˆ’—¶¼¡Õ ƒ1«Êº ÅÛDX£Ñhww÷þåE iV¨%IP£åSJìÛjÍD@•R¨Ct¥4RHUøC HÉŸPy¨¬ŒK`i”Fí…Ë#Ï#Ïí¡ç£ç¡ï£ï“ïc쇦¦hÊGߣ)ù“÷õ¾è·~à;v¯]½páÂÕ«WÝO·RjzzZ!B ‡>¶gþÚÇ?m›1ôïBD´…ÅŒj²K+K¯Æ Ë#ß#ß{ôÈÚï}÷›Þû’g;yòäùóç¥_dÒÔùVên}2vW“ùlã ¹|ï|ŒÕtymÂÄd†ìâ…S ‚+CdÎû™0˜CçÀÑySXç ÷xª¹åVyB»:‰Mp‹pw«A¿íŠ×°óv;ç‰ÜóˆŽ{sw{…íx÷Y(׊¤$¸£›#æL‡0åöó] `%Îs&ïzEÔ}ͳM%ü´‰SZ.ßaîz²Ó|SØI\@pƒúuŽ ¨ü³è<¥`®âà»;€cC€ÕÓ͕ѧçBλ|”¢üò›~œa@•T…cwŠÊqUiaì΀c*86*mQ¦SbrñÌ¥ýÛeYé83¦‡K-ưÃ~5‘¥6Í9ª½+¥¢œAyìííEŸò}yyÙŸ_øÇŸ;ÁÆ$~‚À˜ìs©²¦ÈE¨Š£ó`ÿ`õË(îì¶"!"Œ Šð'ö~LÜú¡£ 7ð£4ÃÑh´··wti•Bs+D¨4†Õ-ŸŠDX¨H{ÑÛ@fT *¥Ãk QfÉOôå •FåAh Ú ²ÐóX{ 5z>ùz¾È¬À÷åyH²<ôb<Ë÷Ñ÷^qdóß|ï;¯]¼xþüùëׯ»wß÷µÖƒÁ "•D´±±qôèÑŸ»öóŸübÔm¬Þ-TÆaäa¯¤eDb&—¡Ë×äkô5MyÓ3SÿÃ7<üï¾íµúæÕgŸ}öÌ™3[[[“4Mr+-w W0tðÑÕ]ƒ±¸öÛ9gåš~9qùÀ¶Nîͼr‚†éºfìˆ0³ôr<#EçÔ³$@ìŠNjÒwÀ9É1•]‡rsŽ{ŒÝ’^q1ýä†ÍÈÀ¢'pž—_¯=‹ïŽ—w¬y–ZÖͨ1¢9ªÉ3¹9§¿)¥µ§[øc’g’÷er¿¢ºÖ:”Í­ÄX’ÿ‹ìÚå2Á5gyEîÖ í¡à;ÝẵUöãÞšë¤/¤ ,†¸ý®–óBÌ›"SZ“³°øLÇÄqëÙºÑT<c$J¥°býfä7´™Í¹‡ŽÔëÅ;ÛG»ÒvUÆÕ)3ƒèŸËËËkkk¿~êÊ“—·D~e†@Ò i±’Å Uí}¸ÔQD=ˆ ÈŒ¡¬*ŠZ1V9A¯ÆO8¶†±Â\¿°8Ï2Æììì,øÞÂô’xZEþV H’¥WÊb,P -½R€ Iɧ¬&+^ PÉ?•è¹¢ß ¼Ld\}´J“öÄo ´g‹!z==žžFÏ'Ï’ å yúÞkï¿÷ƒémçΞ9þüÖÖ–; ™™™AÄÈ)Ìó¼{ï½÷—>÷ôï<}Z.çl¢rá‰" •kò>…žÍ%D_~{’N(ëëïÛxü¿xówY8vìØ™3g.^¼8²Ø":ƒ€MãY.Ð*Ù½øºº õCS3F!f¼ÞÎÔ“á<¤ué8ÀœÂ|ÀDžGí£’aq+ïÜäuäcÝwo,:jn­k(êÍ-÷¶“%–)n‡NRJ›ËžÚ|R}ï §¥µ4-i\' Í•¹ÖêX„ÕÝéj cì»»€«H†–óa>8ãŽ16}4K lcA»Ls 5`0b7õ%æ½ÙEŸX”‹VË£©Ž‹yb݂˖“\¶Òä† ‹“>aîh0ºÜšLš!d^äºÂªù·(‘ë¸çæ[¾1ÔÃÕÐøe{çþzmvµõ‰EoÙèˆ<Ï‹¿g0D!·Özqqqumýï~öYŒý …W<26‘00`Ä K¢,1Æf™£žÂ,9ã¡Ó»¥Zá<•i"oqD¢è¹a[p0#²u%BF£ÑèèÂ,(bB báPB¯¡¥3J”S€h«b˜ldù”ý‰þIÑ+`áWøWyna– 5YX-aR!„ÞXäù(?¾O¾éÔBaX>ùÞÛ~éÞñ§N:wî\”X hÄÐvvv¢7LOO¯­­ÝsÏ=?õŸ½ºªð8œÆ ‘ :@­HiôBï0O£§B)–ÅXs³þÏ¿åUþ–Gö.;yòd|Wã§)aÜ5<«ˆmX0T÷³Ýr½Àî^’eœ.8¦h)›ï$-»Ý}­q1æzd{1ðf—›ä B;îf÷á}Útê$¥VÎŽ]”KU]Wú<.~Ò¨y™ÝHq¯ø*v‹Ý)"ë ˆ1¼£{N¥ü ùO®±(¢Û¿KG‡ÁÜ`Ʋ'³*fn9dZ 7;¹Ü]÷(’¡¸®Ç˜‹˜CãH?—C¹gÚVî9彜ÏUOÑIbR(+ÒlòT÷œœšª:5SžÆ*÷­t$͵~/yêEÊÛŸ ÆUûÎ…}½–µj­üù;4©”»G¬ ä=yž—ÚJÜÍ}qqqa~þ‰{¿óìE¬Ë„<+ôq7pˆ·BVeLdÁ+‰„a‘ÂPMe=Ú#)VBr%/cR6ª±6çf$1‚ (ÂÀbæ{æ…‚ ·B ¡…d)Ú‚61Ç&P·BE"×T IªøS˜u!­È*K…>YV¥Q)ò¬7x¡%Vhô.š,s Eåžž÷ž7<ò7¿áu°âÒ¹r@£µö}_$iñ½¾¾>ššùéO| ƒ±3¿%‘`=Ýq¬8-…”ÄXš|…¾%Yä{ÿÙ‹7?ñ=ozý,?~üìÙ³’N˜-óWÎA&ϳÚl¥Ä¬=WŸå®Æê•(Á¤œÚŸWÂ+g†^ÛÙÈÌFØñ»_ÛÜáž¼­Ý*ÙÝ1©1Ãâô:SYƒÀÀ<¼OŸð>sñÒ·Û¸’OA?GӃ×˟ªé•W;á{‹KV¯»“ŽcŒU;éZš0\ §Ãß ¥ŒÙ®|C3ÅRƒœÖÊé¾A>¾M×€<¡·»¸ÝÇ+Ž˜k_Ëj\d¹z¼”ŒŒ¿Ä\­R ËÝ‹‹÷§–Ï—cßÖ‚>Ø´i¬Øõ(£"‹X³Ë•`ÅÜŠŽÍÚUm>¬Ÿ›õh¯¨LÌ9)Xu©àšD¶Ã‰¾vWêb2*ØsNåÅÀÝ~Däû~\x5 <Ï“Ê}J©å••½Áà'>õÌ«7®„AÀ#dE@a­:[£Ð€ADbÈl…QbÁÎB XbqlâC@´9†âò.ÿd›]ˆQô{ta6X‚¢–ɶ˜¼íèâÅKì ¤ ’ˆ­ÐÊ©ÂÇPZ… -ÌBFB@@Š’â§—¢}@»?l˜I€³1ˆ d8 @cõeA`&¢”;FBF20`´ êÌ2Kaxÿ[;wsûמ<®µ¾çž{R¦fEèdjjJ$i»»»ÓÓÓòâêêêîîîGÿÈS§ÞýŠû‘IDÖJÞä”…]%5AdP!2!‰„P€á"â/¿ó5xâé_üâñÁ`°¹¹¹²²y¥÷±Q¯ƒ¢«­¤údvDgÕ‚mAÀÑÕä÷ð.«œd↾ȉxÚíBı…÷‡±õ"OÛ o‹N¼ ÔbüƒÜWy¿·ŽûñÙ¢oàý£}ûsŸç”{ì(áòŸ›WúãbRéØbœ¿ÎüÜbß°4Dj8Å$#SY×E×F—ð[F‹ã aR†“ûÜt‚n&•å4­â¶C%~ÚÚŽ3.¿y‚±,+vè½\:Ê’oæø?³ýŸ‹)æM¡«T€Åô rÅ¿œ“>E\üÎ;ì~µ¤¼¨wjnÚ›[^¹à;¸VR(×Ùáø)1M%š@Gz…y3KÖåŠK‡µ râ}J u¾͉k%ïgÞx%†U‹ïZË­ü8}ÓÖ=ÒleˆÂuîM֊̹þ"jî ¶;­ýA(ÎxK Î[pÖýZnÑÎ}£ÎŽ»‘¬¼SiCYæ w4:êít&¯ÛK:˜ã”Q—a!枺IÍâ‰8¤i8mBëBÜdp„«°To9(a'WØ·· ,¹t\`^Ãb©ª¦üXËÊöŠVÉEl ¸`‡³nàu(&s›Ìm¤rõ7›tîa]å0Vå–uQ»±ˆ^q}zEÅ™«EB>l±ò»ë¹UÉ:Ao˼'Dô}?þJq¿íµµµµµµO_½ýÏ?ÿDfX#›QˆÆ˜À@"‹Ðˆ±ÇbfFï€0F÷È‘ã5 “ɃÊšD~…ˆRJ q}v™£äÁ¢8Y˜ÀåÛ»~‡>ñˆ„D€Š‘8¬¸gGV~%`‹ä båÎ äKRí| %MâíŸl¦!I‚!†ïò¡¹;jMž¤Cgw´ëìî‹gzžd‚çißÿßþò;^67}éÒ¥«W¯:žt" ÿÝÝÝÈJl~~~yyæ~úãŸl˜ƒXyǨ„´à? ÛJJ.j’b‹b†…žO‘¯Ð“ꄞ½ç+îý­w¿žo\yî¹çÎ;'ä4 †ä|µ!Mû^|°¼a²àcΜ€:ì·ÝÕóûakÆzËFÈ/´Nî%œ•«#h]5¸NìŘŸ4ævöu¥‚íNPɉg{ò.ºþ>¯Ä ´Ô wáßsýI' MíŠëÔ1ëœÚc2™m™Îcªl<–vPÎ.NXPP)«d²Cûì™3g¶··1ƘèÄ™ãHÓ$·½¯;öê Ý¡vWÜTy²pGÆ’6`Œu! s]/;áb¹Ì$: žK €²k›fà ûiñ’uÛxA·úq±éî…0±*]Ù&É:`/=oˆßÆo".æÜ`Š‚"–º‡èŠ'Ü*{v˜(ãwÓ SöaÜ{Œ“†w6{!:ÅvÁWËÐ[ a.0¡+*_Vo¥À&ã×ÎãÚ¾í@pWå ±]q´H(ß.Wuòâ‹,—確S!w†U)ñá®û[ƒSs_ª¡ç&ÒÉ^—¼ÒË—ãô—:+ ŠGR fa}øò[ E½-®ãŒYdî„`þ€`è®îO-Ÿ6¨Ó浦ÏKv÷è\âjD=Îø0‰»¹OOO:thieåÇÿè+7w<2<4`uX0,32,u uy‡ÀÈuжS±aÑdÉVí’­+U:¢±iz _‰* ŽÌχCER¬T´¬”bf"BÄ Û;㋘@²‘‹üXf™Tø"†£Ðb5ʲ¬8‹Ç*-Y  Ç% ­‹ ^¦j…ÚÚ½ƒ¬P~EžÚz½£§Q{ä‡vïÚ»wmåçÞúƳgÏ^¾|YÒ*]b€5†Ã¡¼¢µ^^^ÞÜÜü©ý§+Û;lLxK–yœç)B)$B…R`‘´BE¨zÚúÓ{Š| Zƒ§Ð×hmÝõá•Ùÿ¯ÿ¶{Ž;væÌ™7n0³0xG•Ã}!Ml¥KI§m…¹'%¼:˜Ní[±›]™‡¾ìM–ù nt¾ÅX¦’Øá ts³Â¥]já0¨²ª s¢óB¨.®Áîécî^Hmd5åªîq•—yûuÔÈ ''ªšì4È¥á'‚ÿcõvðè| b1ŠyïqÌäÙ¸\…·N^Ç`¤¡h‹ÃÈ-ʲsÀ“}Tè¨[qÈÆÐU³zì¶Òk|-(G¥kÆøñ3Ûr‡-I €•ßr_Ì•Ô8ÒáJ•6í“5îŸóÄn[p½™ «F=W¹©AiqÀJ±=º éÜ"פWPà{•ÂXX ãÍ_îˆ^¨ä“¾¥³•sbOÑ{dÜ=†Ãa<‘piiiss󲡟üã¯rp`Ì0à 0ÃÀ¦Ч»<1R P Fîí0†zU¶ 9º¦ÄuXbG€$€‹0r^xDH°$ -B0©£‘‘RÊ󼋷nËíͦ0Do%!aÓx̹bË"-bû­ê U2—ÐR­$ƲBB˰¬I<¢R–d Þ «¢ç1–Öèyä{èéd¥Bûó¯äÍ÷>þüÕ«WÖZ´i»»»Ñ;VVVÚÿ;8vúLì^PÜßb, uXJ¡&ðk…:,Gèiò4ú }žššöá›ýé×Üò¹§OŸ¾|ùr\‡õU!û®œêüaŒ‰ÜÙ"Üóºª.Fy0¬d®Ç V2ª‚o;x‡ŠuÐUã :7Ú±ƒÜ-*{rOîW¹!";¿¿ˆ|µ9;¦‰ãžï&ÞL­Ù`I„AÌÅNÖœ£[ÙrÈå¹mrÍšÜz:‹¶î}Q4Îà8IÈË1'RIÇO]ýÚgrŸ#œº;ÌÞç‰-„ÿuE¢È{CÑä¾§ˆÃ`é1Re;æ0¬FÝÂÔïœ78s¡`é)L §e\Ý»èðS°|®G¯²g.ëó¥ßÌÉ †¯•ßšp½Øj8Xô*‡4gJL8ïijj*=FI[®¯¯:tè#§®þÚWÏ «2CH± Œ æ€!`DB6¢âá 4Áb–+6Yˆ¡Ë8…0D$¶D`Œ[Y1”%MGfƒŽ¢DB!Vq.€ˆJ)ß÷¯íî‚ 4\·ŒŒÇÅA\¼5i\gpü;þbäæ®"ª'\·Ja¬0£€•FÒ6‹C†…°”‡J‘§IkI'DíòÀ†åÒè‰ÐÉ:gýÏïþæ`çö¥K—nß¾íhD„•J$\[[ÛÜÜü÷_9qâÊ 6Æ2¬0—0šxl­F²~XH„JÒ ]yš=BO¡VäiômΣò=ò5úêÇ^ûàÿù¶Gn\8òäÉ‹/AgXÒ‰HÒ N&`­oËEÒq•\|Е㛻ÛîªÁÀ¢9O½“t-0nÉyZ“ˆq»þl¹Ø§ÙËäì,÷oÂ-4_•±ñA8 ,rÞOzåj%†õèÚÇܩԪ.ú)ÐË0&6[w´«i ü³ÊCë:D,×ÿˆ÷§KÅ„Wœ6Þ¹SF"—qžèTãÞjÉ$§.²Äß |¬°iKtf»˜ÄU¶ae½v#*.¤çÓ_p}­ù!ÆâazÒÉ,¹K¥ˆ˜‹Ê”»ë¯ÙíVî ¼Y;öœsi d¦~îaùÛ Ùœì·å³x—Šx'½‘ïû© ʆÖZÖÏüÙ3ǯÞ2£€ƒÀŒL( „Xqèõæ¡3²X¼s̶#I/ÆÑUtž£l> ­—$Ñ,79º0ÉÄ"±X¤ÀŠ·•ˆ°´ç]º½ƘåÆ Ñb[ÑVd±Å9ÂU1 ؘUÅ`VŒdY˜•ÁXq?,Ct HH1†¥’E¨= É% eYž&ë%Ü*J*ô@룫ËÿãÛÞ|þüù’DÂÔù•“¢e‹Nôòòòâòò/üé-s´ðQŒÍ,ldkRÖgÔJ<éQ)¥µ¤’Ö 4x}Z§Ð—Qf©·>pè?~Çëç÷n:uêܹsƒÁ@VgQ¶º"gg•¸\5H!¼‹í® >蔽d&šŽ”·KQý—HoS^1»g¤ å„2‚+®†ÓÕÍûÂ%c'4jÂ9\“!VÜçs;öÄ-аÝ7ä.õ︄Ä>N®#ºâ²‘“[ÌEßÎ:.n_ЫâäxÑÆrq”úˆ7ñÕæqJ[Ê«µ³k‘ ¶é„ñtQÿDhše™Ôš€ãi°Í4§¦ÿ¡Ì‰ úØh¥½Y;W¥[]ès×X³L£ KW5ŽÕç/Ð`Mžáæ".ï®ÙCât£s½P9-BÕÜZhBZfew5þ¢Ê0ÔÜr„Ùï s[!±ã8Áù¬oÞÔÓ·¹4QO¡»çy’Sme4I~™le~~~uuuzqéÇþàKƒÁˆùƒÆ ™ñ+R—00¡§;‡E ÃeTDŽì•<¶SçròRN÷ˆ~’›ó('û=…x•,d`SkBÌýQÞ>”3Ü¿V~ ˜WI=·¢Qƒ¥õÙ¹Ã7+‚ ™M“ãùã¼!Áͺîs–nœ_»ÚcÕ=Ì[:6V9®*ÉÅLEhòÝÆw-Èõ¿Ã¥vå_ëFà†îÓÓÓ©2JÓ“/_]]]]]}f×ü£OãQø ØŒ¹•,4F^Ãl ²ØæïE£Íî9¢•DŽóÔÄ )Ê(D zõáµáp(fóâ^û¾ïûþŸ<SÇÛ­[wyH”þHû_è“E€ÈŒ˜Õ^å0¬y%3 “é„Êê°$—Ä‹€ÄÓÝR $…PÛ'Z£öAkŠtXÊ:gýÓo«Ùݹzõj<‘°"ˆ…ݘYk=¿°°´²ò‹O|ÉJêä”Y;3ËÇYŸˆ"”BE µ¥”&ÔJÄ&+þ£ÉSè©¥¹©ë«ß° N:uáÂ…,ʪIºW'Üß”ÃòçƒÁ úÄk2>ïЕËÔ¿3 ñ²ï•ÉgEê8UX7y÷¹hiÂiqX^èWn‘œ›@R×a +\Õæ;‹–“TK(ÁíÞÃn¨ü#}´|›ŒÂ܈½®Ž27;òù ÃâzÈ ÅÅËÙ|X~®Ø¦}–‘8îp6àâÞÅýÍ9Pû˜v¸f+Ä®ª¦¸°Ç~=ÌxܧÏ÷Ýi¹ 앳èc×Ð>WžâXÓÝû¼\ý„U„«®Y%ÖTE{R²õ¢öÁ¢AV|ú¨ÙÌQ÷’_)JB‡ë@²ŒcæMX%¢«œ 9ƒ÷¨~¡W¢Yz…Ž–oy©eÃ`?\h¦õ—vîêµ ÝQ|‘â¸6G̰666þÅ“gÿèä3 ä‡G†GŒ ‹+À0¶4¡ØcqH¯ìzÉp2BÄ,"NáS?" n.̾xqv0ˆž%›EÌÌÌø¾ÿñã§ä ÁccsâB¥LÔˆƧVÅa*–%Y‘@,-ÅJ1,Êc‰y à ۺ‹| Q)$ J*P„J£H±$‘0–N(©… "W,ïÈÊÒÏ}Óc—/_¾víšãI÷}_-ªê‹‹‹ËËËÿ÷—O\ܺ rÖ CdÌïä¡pH©ºˆ¨Bù˜"R =ëŠ^†aùzzjÚûз<òõ‹^œa 9“¥T‘Èî@ñ¬ò÷DÙšPàã~wì¸:av™­2WÖÅås¿SKb§ÖBÎJ6NsQ|Ä\qJîi5kâÆ'k´ò½ús?ßÏÝý©®Bd’ê$n­%i³ŸF´w7½rn±dþWÙÛŒ,ÅjKéz_6s‘ ¦äÅZŽºXº71@RžoEïÕ¥I¸Lvr±¬m€ö6™j$̵ Cö~Ïd&›tÅã;P‡mÎx/}ϬA}ÄZÑzÝK<:}I$A/$¯)K¢N!îE ߇£ Ì{ØÉ(H8ldîã&Ó߯lˆn-kJ‘¬–‡ƒ)‹v#BWªXÈJ¥ô*1-2p²û&Ñ)wú&B¯Œ3Õv_Ûu[‘ºnè^y%ÓZKZYüâfXSSS+++›‡ýÈ'¾ôä¥-<2fð00cA–‘}l]BÆ y8e“½éÀŒ± ­¡ºu¿Š¸Í$ûOÀ7=´³³#ûV°¦§§§§§Ÿ8unkoÀ†‘ +’ƒ¡dE ÇZLÉ+ ³z+H%¦«ÆY¶(a¨Ã"@aX¤”ä2’B«ÃR ”`,[¯Pk MÜC?,EžF­Pëï{í×lxêÆÛÛÛî Kžˆ¢ <Ï››››ž›ÿ_ÿì‹,ê9ffF9[ Àùl³ØDB…¨ÄÍ]ž‰K)Ô„ŠH²% ÒסŻ"_ûSþ‡ÞþècKþsÏ=wþüùˆa¥z,Å]'y[>ƒAO[¼#œÚ]>Ëí¦k“ZD³ÛOø^ŒeRdôUÕ7dL´ªS>AUb‹¢¡XµTÀ.4\XP¶øÀfuqoovù`ΧP,Ì™LÝäx§ØÊ­+[®»‘^A©1xˆh˜Ý§£É޾-C^`ÜМÄõ»Ôw|?ÖjîÞÏ7Q¢>ɇvÿ9š¸®²–MÞO*»1yK)iR]K3ÑüGNî|UaüÚJ;Y#IŒ+:s¹ª+2¨$ûO.ÆLå:l4¸*‡y‰/5˜È¸@‚Õa÷âš;”; VC3È;ÇÔºÌÈ\œƒÛÂåÚ«Ðç/ Ç#óÇã¤æ†ž4SÍÊ šÒ}ËæYÄ«Nieß055•ÊÕFq㞥¥¥ååe5¿ø}ýó37oó0°~Xb€5202,:¬À˜‘Àp`L yXÔXŒÌ¶çðØZ„ç[5pÔ*ú’èUÞû9…â÷’ä‡T5ÌK£³lúR³¤ªÓ¯»Ò$9gædlâ¾v9Îmê´¼#^ߌóË…H+u7ߔݻ‰«ãâ¾òÐSÛäèUº}L'Õ>Ù­[Ö]0@&,[Ê0[¡ *Èa)Æ*Ù‡"/£ZË›òM$Æž(S›»h; òô¨}«åаhW©à¾(VÝ;-Ï̯j±2..‘ò„& îúNwú Ù‰6RÇÞãj—è}ff&pîííE*'DÂÛzêûþãg¯nïZzeÓ ‰Ëp`„aY¥À°1@„±B~„¢è‰„öWQ§f´Ê,&²–Xoº7¡ÀŠ*ëå6×ÌÌÌüüüÇŸ9aâÄTÞÚ“³è°D–ņ8eŒa™B` fˆ ÝóV¶.a(µŒ*BX¤!"YŒ…$",$TÖ •ÆPZYÓ«èGiÔb•¥@«ï}õ+—´º|ùräÁ_Þ‘ˆ(bXqÖÂÂNMð‰/³1¡…™4ZÔuBˆ&(BF3/TDB߬–E¬ÐÐ]—è°yãể'Ξ=;#:uHyÞ,—py–<¤»F.W-QÜ]vWñw¶owÓ$†O-Ê ª‡î¡d?0ÕuivÝ{ž?:¯ZèØÂUÂ+.-îÉ™¸‘‹×2‰¢›u"vs»ß‹«M¯8QŽ ’ìSYùŒ?]›e¤:w»†ç" ä}ݺŠ!Т~G­_Í%<9“GFÀœPM&&I©âã•Ó×Ïb•—¿ïÖi÷ÿBPZÁÅI¦¤°¦»äñH®O|e_ M+1ÆrLì°ÿ%ùgŽNâ ròÇÞ©Ü ÿqG³Ly>‚%û@±Ÿ†…:Ø­T9³Ea!ƒô\´ õ´\¢øå®f Þ©suì„áª!¼…Ï2IÔ\sͱX{5Iž…ˆžç¥¶²»»+¶Djnnn>|ø\@?ø»¾³34ƒ„§;Œ Hj¡dÊoñÆ2†m:¡a½±8’é!D …â3E„h«Ý…?„‡çÎMïííIº™ðµH›“j®™™™¹¹¹ÇŸyN•1µ~ žBM–…Yl8Zç… sãë&FÙsQQÂTu”ßÝØ* C2”!±h²H…K£(°!† ,Ò Ô˜d‘Š,±ä hJMMù?úu^½zõÆŽ)Ê"ÌŠ°þåg¾2ŒÀ0@dÀo! Zðhñ"Ø‘H¤,gE`¡V¨ˆ<«Ô%–&ò´ïû¿ü-¼im6bX LA7­õ>:µW~ bcYžA°³³ãHpžWè*yìq× nãX•‹—›}¨^ä8Û›ÜËQw]òä\ºFºƒ@R›ê.ÑHvõÛÉÊ–«%]ìÎcl_7QòmlаqÑP8€“&˹ ß;‹r½éÅÎbv©É&•cÕ%Úˆu¦~ OYÔXQ$½4ÎjÓaÆø…kzæ'Œµ©A[§|–ËÛ*$zœº~&.£©à&œ^¢ƥߞ®ÂR;¿¿K@» åMž±cØt–pÁ£Ù’‚.*-¬k%ù€%ÎΘ#?¬fX؈²R{D}pWý×|Ez(HJãú{4ëßEéŠ\,5§’­§ŠmŽØ.†0·ä<›Ž•ºNK“YÁ›—áä­úpòŽOÚ¥…°b÷ÉZ£gž%•ûâ›0ÆìììDtƒˆ677:ôå­ÁÿþçF£‘f02ƒGf42£X)V1AÀA$Âb0Æö6ˆ®!š¸‡,ˆ¬›»H{HÌÂéGíîEÜ…¤\]öp´ÖÓÓÓ×GÁÏ^´™ƒa=D6BÖ 0sü*kÁbl¨ µ—WÖ¯‹#2•ÆX©çc"*{ŒB¬P,Þ…¡Í”$PÂ,+kc,Ô*D]Š”B­Hë÷¾îÑÂk×®esÖr;‰x b",ß÷———@xü æ \­„¸5Öï0lŠÔd(?ÖK ÃK²Hê‚V¨)¬T¨QyÊŸò~ùm¾y}.Ê%ÌeX‚Y÷…ð–o%÷uf.r%CÄZ;|GØ]5>œLzñ,çÜùÍ»Oæ´e»GDLËÉÅÒ”Öyœd™ùI'‹‡ò¥H ‰€u²±Z-S›• l/åÕÀ,(o™Ñì g:Ç–A‰uZùþ°û²­’{6ÓaõŠTö±—¦ë¥º®—»OàƒÓLÎáRWîÑ.ïoà*(7¹+5Y|ÐÎQF²œ)}’Û¥}ò9ëp– bw›¶l§çÖu`»oÉ\ÈßtE,‰ èWõ[(€GY£€J•–"ˆrW¹{\¼«å¬ª’ÇEõ°çA^E¼Üyãçr#¢@1Ÿb”Á‚Öwt­§ªåZå_ñÀÈéK¬×r»By™E,'ãÓ!gÎÄNäÅ$âT¸4™-‡7Üí”^5XlE szlpÞXÂPcd‘†5zBBüÊpxÓŸZZZJ9©O,òLAcLD¬$ÿÿÙ{ó Y²ë¼ïœ{3«»z{û2o™˜Á  –ÁNp"@Ê$eB¤H‹´$†vˆ¶([f¶Â’éÑ”CŽ0h‰°L" € r€ÄB@ ±Ì‚ÁìóæÍ{ý–Þ·ÊÌ{?ÿq2³rÏ›UÕýú=LÅ›žêꪬ̛÷Þ¼ç—ßùNE)!ÒZK²áƒ®œ[ÞxÇ­ÇcgF¼Réþ$8*n æÔG‰3!_‚E¬¤J’8xhV•&`u{pÿ“ÏÍÍÍÍÎÎZk¥„¢ìdùpÂ0ÜÙÙ™Wü¦ÛnNkä%eþ¼˜‰{ºRÌZà‹ Í—p%PâÕh©bK,¥ò)„\ü7¬®˜Îq'#Ê“”q:JÞ"8u ˜ Žu|6nÇÒ6KÆúLÛ;;ŸæüÌÌÌìì¬cŸ‘v3Æø¾/§ÌZ»³³CAðŽ—œ•dͬ)–'Ìò$¦‰kØÝS8Á±QÖ°Ôäpî»ÃPzç)þ¡›>pqùáKKZë™™ák’9È™‡R*ÛEwuD¸KºoJ)IxÔZKiHÏófggµÖÌl3Gr}#Ù]ÞüÜsÏ---}¯ïûhsR0€SHŠf祬îµtM)ÏΨ)`…*˜FLõÚð½ ìêœê”“êúìæ)³¯¢ÚÑâÒ1åW­ït¡Wh_Ág:d»‡s•µ_h€Š…t®Û”­¼8ß`¹UoŠkãYæ± ö7om¶ñÁh›±^"sÍ$ÞÐcá€×©Ô¿òon,ØÝ ¤[ëïô7Û—&‹Áá29Ueš˜£¹æj ‘<×$ˆp£¢¹qSw(9€qÇù´{üÛõzÑ „ÞÔn\ípÃ׿¯âìÐo%Q܆¥¶Æ¶2˜mYܸ~h%3ÍC©+±rœr+†¶+æìÎYwwjvžì 'òVáÁ®Ñ«†à*V`ÙŒvf_ØåZŒòäÐÞg&[mg$Ô¤îz¢Æ@ûT\i?‘i‚IˆG&¥Fé÷û³!Ña¥R¾ï?~üä‰~êòÿþ…GmhlÙ J̰,ˆ"ñÆŠ3 ac`¬MtX°é aNVÀ)ëáÌÅ<ñ;WŠ•"¥Þtödêã.Eë(“EXxÊù¯~cg’µd Œ¥XRí.½í“Ø`!qvG²oñIÆ0OìŒâ'ùÂü¿¡J+W`1æI³Sswyά4Iúd 4{^ÂàÄâ]³Ÿ)OÅU õ?xí½ëëëYþ†‡ïû©y*Âê÷û Ÿxü¹¸!YØaRlêÜ™ö±äþCò/>SqQBÖLJ‘§ØSRšPyZùÞ0‘’'ÓÓþÿûÖ{^w ÷üóÏ/..ŠÂNÔX¹/÷±K­ò–Ó_S¹‘¿ú³»êþ-R¯´<÷oòË ùzèå/ Õ•²ÿ†w3j* yþ€V¯>~0I¬½M,SJ¡¥by¡ØX<¬r—.ËR·u+Kd1®¢ùž÷É'ž]ŽìÌÌL¯×“œ2¥TeÞœçyƒÁàÊêÚážÿê³§HHÖ,©y€Äzœ•ø71+Ö:–YÅÕÓ´F5t³J$A1b#®_q2€²J£ätâSOC2bNo^cè='",ØœK!­eka,Y kúJ_^ÛøÚâ•ÙÙYѦµžýöÔZomm-.¯|ÏÙã§Ì‘ˆ¦Y“0DÖLŠ•PªôT˹U©ì,^r¢Ä-KñZPÆ1 Oñ»n>úåç.?¹ºÅÌý~_ôV"kÊ‘Ö:5hÛƒAáBgR–ȯ6771òëüü¼BVÕ€Õn\»«ÜCXßíû½8ÀåÊ|ë {”ºTôä5.ønXRq-¹†èÊýÛÇïÜׯM{׌žfK”æ9ÆŽ ª–Žñ©Fyc(¯jFá©­¨¹cWm$U§v>E“b_&ITÿÅ%#³òæ?\{o×€œ+úÙ„X;€"hÖ¡p÷^ížoÈ?⺯pQB•£§B¸”Æ¿œ¹^vR`QGA.7†´íáSIÂS½ñÉɬ\x“Ko·ÎÐÓ}1ƒ\ÎPV¸=\®0ZÆ]«Õz[ÈéúÖtªÖèm}²îÅÖ8ò–*Ý:Qƒƒ\רt1g"z<ä°Z/Š#$-³Ã¹wiAÏ¿­n¸4çVˬk;G¯êG ¸jëºêä8 iž àÖF\žÂœèš–D”­\µU}8ð%ûJ?œ¬íAêS‹–Ù÷ýÃ’x;Õ:ù¾/;ü'>óâùþ‡çIŒ«âr‚…Œ²¡‰‡à:#×ZuÄ‘'¬ZŠ%òòˆBó©§Ï‹G;€©©©,ˆ)’u­ƒ øë'Ÿþ¹×¿JI ¡ä ŠÄIéø‰Ôþ‹Í§b•Á3‰‰UœQ(B*‘!²R™¹²‹2êêaª]Âû(Æ9¹“zrY²àá t›˜y%®ê±'½…5d,Y;§Õo>ðàæççÏ~*qÔBDQmoo÷aÞò¢S,¤Ï‹9öºJ2)‰åð9®Ð˜n[ªz s¼y ¤3!2ëlf"ÍüCg~ñÙÅg·sssÂ} Â@aX.¹„{À³R “,f^YYhåyÞÜÜœ#Àêʆ¬µaQ&nooommmmmɯƒÁ`0„ÉÃcŒ±Ö kÛƒ†j>Xßãû¾,+ó‹Š!}gЍXÞh!ñ)¾dœ7s—”sfZ™Wùî=WÔ“*L¸àÿ”³†ªûsý{š¬8xÒ½…÷KGö$Y—p]ܹõÀVøÅ5ËéJ€ÕuÈP ˆÍÜÝ*;Ob.“[]®éUkôÞ°(cž“X•G¡ªÊ ®b|â’î'?o=0÷¾/}}ºßF#º¡4׬p,¾ïApqiùôÜÌËO$­HéXI¤ô09QkbÅ:®H ›‰udŠs$.e[,fX<<¾Ü†+”’C@Ü0üÿ‡´Q’Blz…Ô?&Y"¼2–`ɲ€1'fúïÿÊ×ÙïÒi5DF›éUŠïñq.pÊü׬d©ƒÍ3¹ ÀrD^“Ŕؾ¹|cÝí„f€U!K¬XÕJX´ï[CËΗ›Ö“Åm³„£{8go8;{T9vàVžÃcw›Êçú.ßç6‘7ð).¹ÙíÀÚ¥ÅÙÞ¯öš¤ #¡Á½±¯OíF\„f©¾Z<Þ6Å4SÔaó%ï¶Ì‹É=:®*–JÉ3;¬½çYið©µ.0¬‚ç”ä©àÃ=ýºã §çút‘¹"ÇýQìKñ‰äTx•xj08aÅY„±ËNiýÈÅ«O®oMOOOOO `æÊ,B9 ¾þô³ÿµ¯RZsìÚ®c÷80.zÈJgìÛ™˜+ŠÕrÉqʤü=ùšâ$4ÄXÅÂŒÚ8I$Lü2§×&xOH–€*K²–Œ@ÖPbâ×U4öÁ —_^›ŸŸmš ÀJ‘‡çyÂ_¶··Ÿ¸°øã/»íàÌtF¶Æq¢¥äªÄÁ?®™NãZ¹§ÎfÉÌÒr¡ò˜ßvÓÁÿøÍ'C¥•Rý~_j¥k—–û¸+xÌA°¾¾.‰„)ÀJíç+Xîlh{{{ccc{{»\¥±Ûµ0Ƥ꭭­­ êôY»”ÒXX¨*ø1¼©É“I‹kR)nßÕx„TÈ`M°…Ù^aÔfl…k°¬›:F¯v£Ø"ƳÝ`nëZœ9âb Z2‰žô¡e–ÑO¢",Ì/R]Që]ª†«TmƒÕÏN¤ AÝüÞ°FMް(Àj(‘Änù9PjŽöUÛ±´fùµ¬Œq{`q Àâk°\>v~ØšIGêó]X•«AWç½bùn—]à.££Ítê\5£:.9ÆTcÕ=ô]¾—M¢N)„D‰i óx‹ê½»Z]ô;uŽVíh™âó„l)¸f^S5à©ÐìãÐ+rΔŠF‚£4Á›Þ\¿Ztíî°•n‹Ü\’=öýÉvröv±W¢GÂhÙï-,,¸à†=æYÇ–V6—pff†™Càw¾þÄKνøà¬Ø|e\±(cy.¹s©Î"ÍLºœ¥ÔŠ­h¯$Ô¶,¹„Xšñô‡~¢ßïÏÏÏ[k{½žR*1…G¯× ç._½óÈÁ;NK) ±¤ 2ÅÏãB„k¯b±¢Œj.C£8®EÈCl“ÇXùqS¾õFq©Á´¬rA™zLsjÚ*:,c€¨®íYƒÈ²µ[;ƒ?yôɃ:Ö"£í$‹0 ÃõõõãÓþ}7Ÿˆ‹3*ÅZ)-Y„œ¤T*!{iÆd,Ec!É+2<HÇ—”\úAÍzÞëÎàO*ß÷}_HZ—°0Ò\Â=.>XxE¸Ï•+WDØXå*„°:©®ÖÖÖƒÁ.Ò²¥Ie·wiF*¬ªi´%±ˆotÔ2‘“ݽÐû Òª­‘<Únñ4eŠb–>_0%€Ãºõxe’3žs‹51¬Â˜eÒ\±Þ›ƒêi­X(“ .žáª3†IÒGìکϬ‘Š ò0S¡TEC5š,vèlä¬q>’rá2.¨Y…Œ ô0Eƒ(ûkÕŽ+C3€>EmvÎÔ]ï6h.`¬V¨Ñ\š€Kµ#¸­'W,4)Ña µÅcN î’¨†¶e®—ñH §\bXcfv}ˆ‹¹Þ|½` s€™ëaM]½O¸!O`‘ÛÌHèm„b®­Ë­UB]èUóÁ¶ææ†LcÞ5çñÏP¦V`Û{‘û@2Kff·¬ Ý~«ÑÖ4®]÷h-û½Œ°v›gIÞSAáRðÆe‰?ôÍ'ošî½üèBbëDœ­œöVdÀ&†·›R’…lmÄÇ]Œ±Ø7/Ì~à‡¨7533“ê\$¯k–0 zöü߻°bJ%)rJAÌÚ‰};%#ŠŒþ–.-²)„q2`aqs¿3‰¡{\ËIRS%yÐ £1ŒeÇ+Ll}e-#¹„0{¢?õñ™™™ƒºô‡Ê,B"ÚÜÜ\ZY{ϽwdX ½Ò™$X·‰R*^¬3S )™ˆ ŠS ‰“ûÐ¥žÒïÉývèû·Îô~ïágü^ozzÚ÷}yCA¤”ª3DßKÅ¢þôR-,,¤•šeÚn|ßõÐÆÆÆ#çžÿ'o~Eœw˯«¤q’ÉR‹9}çøgH%s|t1¢Ê/›ü•€-èÎ3Q}úÜ%ß÷gggËE ÓĽÔþi/ o`…a¸¼¼,Pµ¬ÀÇ.—*„–´¾¾^™!»7kmb›%y‹YÖÈÕ €åù’<ã,ýn0’…ü=áÝÃ×iÃîÑkX>u*ÐÎ ««ZzULªje—×È’Yy~mRaILÄ.-Ëmì(ͱ^qËYvu±'w<‡(\ 9jÃMª“îO¦O£û˜ÅøÛlœê«¢Óäš³ÒªÛ£F@ão·VÜè?íX ‹+¯áÈ,Õ¶5r°En õÇ÷´âñ\ö›á1ÚàE+ÿªûx‡I•¹rÞÿ’Åã_´;¦Q Ôrk2)7AîÒ ÈÍ´Žº=·MúuÌD¿Ôód [ Ò*¿©`1]s€ÕµÜ6;L-6~nÓMàuAËÊ^5÷î8…QN%Î «§íŒ€µM\¸Q""Sš£:a‰\ßà¼B8ñÀRÌFÑ3Û;ÌEÑÆÆÆÆÆÆúúúÆÆÆæææVòØÜÜ”_ÓÊbâ¾ Éïϒ̲Ã’Ô³¬–°û;·±¼åôQβz&ÿLJe²–d#9ƒÃjdvH²b)–NÎNÿúW¾Ùï÷ˆH`A]-B °­µñз~ê¾Wø¾ÇJqÊ­TêlE1YL´Wq!s¾ÔàЖ‡U y†ÕpyC%ÀJ  óJ\pP¬¯ ©”VÜÉZk"te-ƒÈÀ˜‹«k_¹xevvV¬£ZO}ÊIÓsÍÌ›››+kk?ñò[ÌL³§Ênî”tåaŠeJ²¹•!7! ›;™í<´¾@ê‡õ¦ã¾´üèê3‹™TêžÅX#˜aMŠg¥Gùòea¾ŽË…^­­­¥¹kÌ€(ŠƒÁÖÖ–ìR*~­Å¤ ¡(°l)…ÐÝv‡o¬|7ìþMÖBbÒ+G v&­¯¹™ÕšD…®} k1õ‰·:§q':é‘21Çë]Ì(_C7͸¡knŒ¬Ì;§“B¦¼È(t ãvÜQ¿ {2¬²k88ÀB´Ó»òûÑu06'%3CÂ!ô«¼ 5ÛQU,bæ´&u%ÀrÁaî@ªTñxvä7ƒªÇ'pé’Új]ýÙ–åý貫•&?¶ÝRGÙ‰rtí.–í\“äXÌÍe+µWÙ[:©¸¡áƒ­¨{d€Õµ²l§wr ³Sõ­û »›©»ô'7zÕÚ)Q7Y#Y1T5<ÜÆÒ8]Öæ×&¹‰aóФ’jƒåÅ¢;º*jjŸ3‘ä®Å˜äÛQt.ûý~šÕ=¦5ÅR«[)Ïr¬&6Bô.\£R†%›ššššžžfæÏ=}á饵·ÝrB ““J²±+–q¢çä:#È+°@ˆËròÊáéé/<}þù­ééi¯IÆVƒ+ Ã+ëë—VVßvç‹cûqÅÈI®)FìÌÎ)´Š¥CÌJ|Ë)“e´©ñS¤ 1Vu 2ë¡T„e“¨fÙ?n¨Û]MU­wq¯îWݙٕ|¹¸§µ^J:ý:ÂëÆNv„‘òð'{=p7þ!—8rŸöì@¯\jûø º«a×dûˆ$€ö9 …K± ]ÙBß`}rìöX; Ò # žýä‘*¤*‰X§Ð]ØÁöövöƒÖÚííí~¿/Ÿ™™9yò$3ÿáÓ‹ËûOÿþ¯ë÷É)@JÚÈ&å‘" °ÖÄ)E b•˜—§KžXáCŠ!™˜ŠYñ?{Ó«þÎG?¹0????d #¨ôØ>räÈ`0øí¾ùî—Ýù–—ÞA&‚Qi¨ˆµF‰K±"cä[ˆ˜Øa"#>_±•»±¤‰Hää«8éU¬ÃŠuTI’$(ÃLK6ñH2 ·XâÅé å¤)’¬Æ•%X%ðŒéìÂÂ`0¨D9a®®®N¢$…ÍÍÍyž'`EMžç[^ƒÈ,‘ÊFi‚Ìz«tábbRDÄdŠ 0+€”"E¤À)(/–Ÿ)ÀZd{š€Ùiÿ×¾ë®ù䃽^ojjjffFŽ¥P»S)Õëõê ¦ÓôÑqP¤ŸºråÊææfv¸¥µËv­5 …0®®®î™éÕÈ0 Åòßó<) Ú0çtæƒØÅåľâ2é“-`ض€Ý&—šèˆR7Õ“G8¸w‡DÀ¦µDgÜ8Í<Ë<Ë<Çìw裿s Ø6€ÍäJZ÷F3Oõ™g˜ûmRå_ QDD"¢‰"’cœeö«îÚÖ´.‚/®'FD 2?]æ&’cï3÷‰¦»ÜÚå*½$…DO³Ì0Ï2b^`n@I!Ñk7º§¨Qú7‚”L¦‰AÏ3Ï3÷+Œå« K%î)_Ä„¾ã¹þwD½mDÄ#7VhÝCc·–âÙ"!‘*°«]@x­ÕxÕý:[ÖS×¥GޤàÖ8Jyfèm5öÀX£USëduû¡j® \s3n¬ZYl¡\õ#—ó²;T½H%ƒÄ®#´áýÞd°Tr@97u׿b—p•<œ·3©³â¢½V:sà¯<‘öÍã¬ÚTqÎT‰-ÂÐ.©ÛüÞ•^¡´î¬‹Ðö,úÚ4†gæ,Ìj0Er Ý•R• kkk«ßï‹£ßïŸ:uJ)õW‹‹?ñŸÿ­w¿áÀ\ß‚dEVƒX䯀%V`­`Á¬,NÐ#gïÇ%†Y)K̯;{ò7}dccuuõàÁƒAHc6!.{,½^ïСC;;;¿ðÑ?ýì-g攂ä¶–ôAb¶J©ØôJ |‰W’SjbÈFV~*b"eE<²L±9‹"H5G™[òå…¹9C²˜ˆ8¿š-ÀÌ69®rek[›!`gg'ÛQ-//oooWž}q8’”LQÕÉãÙÕÍ´bÜG2UÛ©üT‡TaÍ©ë.âdC Ê_Ñ*Þ²ßzËZ‘%ö @V*QZÍî>:ÿÞWœýW,zž×ëõ<Ï‹¢H캲ÝUkíûþ¤rî\€¥¥¥ ,UŒ•C6yƒpF\Wê£4 Úó¼~¿?==5}wGWhT ÜH DÏ[ûX·6…V{,o×ú?ŸžVnK&ZŽ¢ÇY6€`ì^êÍ%0ë¬Öwh}d¤¼ÔìŠÿ¼1sÕÚÍ„[96ì<ó­O+uZ듉ª°ÐñÀk/Xû¼1B^\¶<Å8Ëóp½Ük¹ ¹<EEÑó“V†DËÀ2@Dß2æD‡•zçÝçûºã"d ø|>E#‘uà‘(z„ˆˆæ˜_ëû÷z^ŸcÉÍEk¿†ßŠ¢¶>DK=dŒ&ºUë7{Þq¥àH¤Â«g­ýJ>o­Ùι l'ÁÊ·Œ!¢滵¾Wë…ÆŽìêCÆf^Côù(º;3 dGñgÇ8Y“}\0Æ#z™Cå“}B¯FŽÒ;%jÑȆ`U!o£Í=šóVërPõWv #cr(÷×]Ä“;MìBÇãõºV71žê rv²vôÂÆâ¤°X‡sÏ£åF Nó1¹)η-×˵ÆäPì|×§ù¡ïò~ß™›n9|0-58ÌÎSiAT&Vi½kΘÏÇ¢*.ÔøH€dRDO$X¢T’ÃÄ^‰|ÉÆÅ¥·#ÓÃSZd“„Æ2 îWÓ«HŒÛÉ„ä×(úÈÃo:tHk½¶¶võêÕ ’õÀ’œÐééi¥Ôúú:vÞsïí¬{ŠujâN¬ã:š*îÍ Žà‚ÅcœD™–#EiG~±Ë‰Î+µD70ýßsâÀ‡yf ý¬VêÂ6¼ iâíRñÁ .\¸0 Ò*„’ÄZ6qŸŸŸ•–M…'¾Wû?sÐqª ‚`ss3›…qþüù«W¯Š‰;ˆÀ\ª96ù‚Ü×<ýj}h0xܘ`ßìÕ¥^”‡ŒÙ¶]>2´U“å`/.ZƒÀV‘xxe¦zfF3j¬Ô+-™”>²–s&YHKdE<›= CUW†˜é_Ú D˳ººÚµK\¾|ùðáÞç[^ÖfBÆ«"S艫¸©;?bO0–F†eŠñc5)V UJ“µŠ,È‚­bÊ*k¡™ÙÙÙ=S`9>ÒŠ‡|†ùGEQ¥õÔ ÝÌZ«”AÊüü¼µvk{ç“Ï,>»¼ñ=gùJ ÜàLz(RùUÊElÌM$-%ФÄá àÄlÿ›¯|óùÅ™™™™™k­äE6P€©©©•••ç¯\½°²öλïˆs9k‘ÎY•¡àì¯I]ºÏ’OGIyñD'h `FBâ†ïOÝKŠŠÛ”eY kq BXKR‚0JªF¢‘!cä ¢Qø¹§Î?¾¾åyÞÖÖ–Çô¶Ó›Ðµ a..-ÿ›ïÑžfO‘–Tläá“a9ÂLhNug) †ópì‹‘Ô D.Ñnø$ź"œœîyÖüÅsW|ߟŸŸ$>ôeJå"eêʳ¶¶¶766²[hV`ÍÍÍɈȖ LXéÀY[[ Ãn܇Ô.ÜÜܔüxñâÒÒR¥k2‘À>‹B÷'½"¢{<ïT)h·D ¾†×V xÁÚ+ÀÝUŽHÈÈoî윻žE‹ÛDß6æ.­{Ì•wU¯Xû‘ ìƒ] ‰¾mÌi¥¸ÂóÜ}¥æÊûJÏ›®ši·öš¤V*°<¢J-ŒdÁ¶7a<ò‘Þø:”2kßH£«!žlQ`¡‚°Œ ^Ù¥ÓÑPÂÞEÅ51N1ÂJ½2²­<üCKx¥â8rÎ[bxÇÝ;ó˜ÉO)Õ·yÎßÊûJ»”?uQ`Ÿ;î(ƒ+§Ìm\q­_ê"Xk8ŠˆÈ6Ö vÝo8âSŒñE4ÞøÙoèjdzµK—Økr±·Î†“ÕyyAÐÐËMaÝ«¸æÊ×d?íän ]ó‡Öº×ë€o¥ ‰ÇŽ;qâ„Rê÷¿ýÜ}èÓO,.Û Â ²Aˆ0D!Œâ'Qd£¡Ada Œ% XK6 õÓº~™‹ÿ?{ýA<ñÄ’ EQƒ·—ì’…ßûÚCÿúþÏ …C„ˆÂAˆ(DÚ0DPQ! „ ÁD˜Q„("c`#XC°0YÃVè’%k †`9æn†ÖÖÊ“¬3:ÁŠ ’¤ É4´ °H×`E±•²|%M˜ÞÜÜ\\\t4e“&kíåË—-ñ󫛀% .Ì»ÃRÁ@a2ê¤x¶äÊa8~D• Ã„…)R Ť+Eqꢎs=ÍžfOýã»ÏÞîcqqQ4Pâx•²ª'5wƒìñrúêA\¼xqqqqÌT·'éëãÔO¼ŽvvvVVVž~úi÷dI8ϱû$ø,$¸?fÌþ¤W‡•º·äû¢? ¾µ?vø‘(ú›Òž¤'úÓApñúO¹Ýþ2Ÿ|—}~î쥒%úX®]­zç=Oí§1}íòQßžé걓N¡~a¢û\ÿ Ú–âp”rŒƒ3x'Å‘^µ~);EݨjÈ‚ÓÊ(91uùqŽ|­ïiŽR9_¥#]²U[h;-Þì€_Øk½ÁäBuvØ1èxŒ}ØÙÙË\¡ÔÈm”É/çu¨„í¹ñ D{ ÷Û zÕ ³ ôjœ>Ä]F 7ž… ^oºÎ¨¿ŠsÍ’«bŽîŽ®ÒHnÕ¦'_‡Y²ö ±h†"B!¢ùùù©©©‹/~kií¿÷éóý¯z×73Àʽ•‚C³¤¤ÈŸd¨%)W6•â Ï+~é±Ã?y÷í¿óðã?üð=÷ܳ³³3;;ëû~¢“'O^¸páW?ýù›ÌÿÌï#I”„¶Ì,gÂ*òã¡d‰}ØP³¶¬5  `e ŠXÅ&ô —A\+ÐÆçœi¸ìÏ:aQ¢ÏŠeY¶À)Vœd˜€­¤ÅŽø1áøE1ä¢Á`0;;KDJ©®YiDÙEѹÕõ›=Ž2°€$WZ&]Ù’/˜ž·lsp\Z’IêB1ÒbeA° ²`òÀV‘µä)XÅZkÿÇëïxÇý_ûúÊÊ]wÝuäÈ‘^¯'‰„²ÛiÉ¿©©©Bz¬Ë±º·1fsssccc0EÑì>&ÝÙÙ麟7Ém‰ÖUw°«“,Üé@'{ÌG™§åÑÔ.ÇÒšè Rw{^Ù¶ú¯ÃðAzÅDG•šgî3÷™{Î-Ûâ,ƒ¶žðçƒÁKµžÎ ”ˆhÑZ—ä¾£J`žfžbžJ6LòÝ,Ñ6°¬—»³0&šežgžc–rŠrù€Ñ0 ZZͳ¾mÌË­•ì¼ìa>cŒË^ùD‡•š"ê1ËOÇD¸ˆ(B¢0y² ¬5ž‘à«Qô½¾Ÿ†”p>õ…[ë/Rê§§¦ž1f«¤ÐÁ„†°%zȘm‡Ùæ°RGö<ÐÑçÚ&vy?‡¿¡Ë7N4 ãÉ¥ î#Ë…N™bÎÄbÞqÞ3fƒ ÑølüSà j¹O ÜõèQU<µ±'™«¬ÍÜOD§ÂeŸ;±d³6s7úN>÷Î+[jäœóœÙÝËÆu \ÄœÅ`¬ûÆ÷s+!˜Æ©JÉõϽ‡êc¢4,ÑEÖx=>|ßõSneE©Çv¯×;sæÌ¥K—666þÑý_ùG—þ§ïz…ßX°§IƒRŠ”&ÅÌÄñÿäÚaA”JÈBLDï}ó«>ùôùK««?þøm·Ý& L-•º,//ÑÌÌÌñãÇÿ‡?ºÿäÂÜÛ_þR&¶$†L2û ©†;²!ÖOYOÚyHY¥5¬"-ÜNN¬Ë9qªJ’—%ß)½²D kcn«±À° «Ub÷÷XØeÓ¬Cy‘‰ž[ß“"Ë…B––|p!o\ôª§µgSo½a…Â|aÒÝ,9FZÄĤ@`†"X(Å ¤J¼Ò`¥!Y°VìÁZu×á¹ÿêÎÓÿ×#Ï=þøãƒÁ`jjjvvvaaA˜]:ïIBßh®RQ ƒ­­­­­­L“˦Wæ[Û“MH|á1)’E5‘0ª|R¸û·“óÂë’µ âók|ÿ­oRj?\"¢/6R¡ók=ï6­O)ÕËŠ7Gº¢Y¢çyÊÚoFÑRM+…DóªR"áƒ_æy/Ñúf­gëí¥ Ýix(Š>­Äè„R¯ó¼³JͶù¯Ë¯ÛÀ9kŸ0æáúéè‘(º¹×ËôUÑߘ¨y7^¢õi¥Ž5Nô­R‚Báì‹Ö~=Š«Ÿ:¿eÌ›{½‘Í8«¢ûøÑaæÃžÇ5ëÏô1ZRyEnMÿtÑ‹±[ÇܲŽg*·üEŠ®vgh`ÜN*Y˜5Û]µ`¦| ÂO«:†P6Ss¬(Êp*¿×‹÷ÒéñFx:JkHXƒÌj´9ý:%•®l™‚'K1v—ë±c‘Zræô¶RŸÅì¸ýÉ]¯§‡Öš™ ÙURôÐó<±:yòäêêê•+WþýןøÚâò¿ûÁ7œ80£<Ÿ,ØŒ%­I[b¥8Q3Y"¶±ú Hª¦·ù˜¦§~ù»ïûö¹K—.õûýƒ;vÌ÷ý¬dF>²¾¾ž¾8??EÑÕ«Wÿáÿà#ÿåÌkn»E²Ùlâq¨²×+ß²äúżÉ#€µ&(kÁž˜”b¥b;-¥ žå""#b&XéDH,Î÷¯$g)©9h\E&qÂt•øa¥ÄŠÛÞ[ ØçÖ7‰HСêîè‘õì×ÌU·Ø¼ÊòpîÉÜ€MYV5ž^Å ‹I²AL& ’ÔBÅÐL6†YÊ’õ@–X[°VJ«_¸çìÇŸ»úøúöòòòáǃ XYY™ššê%föóK´¾Cë—Z{lTµð“ÖšxÖ´¥+uÌå¾ÿêFæâbµÁUãâ„Roïõ¾øxvìX–V„a¸¶¶VÈ;tèPE«««?õ›¿ÿ'?ÿ3/>yÇ>bL…w‰èF{¬Õ‹f™xjj¿­[ÎÕ MôÓýþé ¯¬xšUr«Çmù‡§¦Vgªv ,aÛVj.oëõ²ôÊÑL'GîÐú•¾÷Õ°šŽd~gB¯:1ùõ¥¾ß÷ÿ¨*¥t¬X{D c–¨Îãü>Ï{M•·}%PCÇ”™b~g¯÷þÔõj)GÈܺŒá6LPY挫B&8ܯ=oíýa¸Ô¶²ò‰^çûwH©åúI ÌA¸qêgµ¾a4ß+rvÑF½‚Æ}·.ïDÎÿ _ÇõNð\ê3­AøÈssã)¡¨œsV¢ŒúŽVñ…±…B}¼ÜðíÍL§JOßbUÎc¸˜å;Ñ+‡8õ±®QßžÐLh îdªüÎÖ0ŠÇáP>È]M@]*SÖ^h‘ÛÔ ·§ÓÓ\4©ª0i|&‚îïl=ÅÙ£`ç «€léž9·¡®JlT^-Ù<½î's]ÐUv DÍ¿ê*$7sól¯´°6ÆA ÝrzzúìÙ³333W¶ïùã/üÊlDbOwFi}=D&²ÆXcÄJ’é˜R5VL€~ù-÷-ô|±+iÕêêêâââ¥K—.\¸pùòåJ£cÇŽÍÍÍ-mm¿ç7>xyeA€ D Øp€Áa€A`ƒÂÀÂÀ†ââþ’‰ÈDˆíÞCDòŠ%c`LüWÁF ›˜¾†a² +/²5YzVRm–ÄÞX2†lü‘! ±Š¤Å@E—¶v(ÑĹ(°¦‹8˜Bn­9IÌ ƒ#Š­ Ó3BiQEfŠíÅô$¥vˆ õ8ÙšÔ4T¬âç‚Y)ÖŠ³–JˆZœÝ_òàß{Ñ —/_NYUTexžçû¾àª(ŠÂ0 ;;;Riq|zå2(*_¢hssó…ëÚh×"6‘‹ìø:AÓ]{•²Ôé±\ƒÛ^ãû§«&“¬´ì¥Ò{êB‹»jLˆ¶˪ô±QÓª>QJ¯àÄn@¥»é§¹vÚ|eï8œ9Ñ­Zû5oÛ¤¡0ˆÄ™w•.²‹Ï1+ÆÈ§˜ÕL_ë%»À"U*ÝDU“riXwP!ѧÂðwƒ •^Ý¢ÔOMÝ‘t•Ö‘hKÍæÿ!_®§\ºÇ¶Áú†Õò÷h[é:„.žÖ“Ø'›Èm«ô áø©8M9§ÔüéU¼8¡¶E[cgT‰Ù¸ÞóžºzÝørŸÍÒQÌ-‘,ïÅêEû¦jHƧÐΪÑʦar`8&ÊœYžÄHqÑŽŽÓÆIúÏ>-Ó+jfäÚ±˜È¸ßO=µÕ÷jRçxœ+Jõ;¢+”nµÒ«ºગCÏ2dª[âÒš<¤:aHuBáZëS§N>|ØÿçWýÁ}êçmÙ ®NhCCQ„P0–ð#¢$)Þg­¸D eAÇúÓï}ý½Dtùòå”—i­£(jæ¹'Nœè÷ûÏ,¯þä>´¾±aƒ‚ÁXä• @") ’_2aбdBDaбEd"²‘!cÈX؈Œ!‰¢J¨VŒ«xÙHª’Èš ®Š†-`" [0Æ 2q³s~mÃ’?ÈÌzTWÚL ¡Œ—Œd0-›#[Ù»H‡ŽdPÆ—OÎ:%2+X± KHÇ‹I©„X1+Vž`,%ÔŠµú¥{o=:åooo§6R‚)9ÿ÷½£0™̺Àúúú sEW02ÉêZ«{‚$«Îüf_¶¬é¬ oU\ƒ®²'èXý·´Huk!qæB{¯@’¬‡ÂÞŸÒµ»q(“kÖۣ⹘*Bæj¦£M+&ñG¢úYë senùοf*´êõ{‹¶ô¢šËHå;Ž…Ã|ÊÚÿo0ø›¶{}æôýw&™°$ ¨!¶ä,ƒšÔºÝ]3…‘’+/{nÆíÈ©Œ0™Cë”¶ÆnçÚ%&ß­Uò®K…ïÁ„yß8µÜÁ=ò›ãE¶|Ç.·ÄЙ}+ÂÛ3×$V;_s—áÀÃ~{}I—¶mJu2®æêŸc·?(§²šŽc÷dPõMæzcЫrý—‰$£ñ¤§†ÉÆ!ä_Ó•;8ÌÙº¾ZeÎj'qÝÀI¯uR,‘ÀÈóÇŸ9s¦×ë}kyýÝùìÿö¹¯ïìì Œ(4Ä^¤j,c­MsëósØ4íïÞõ¢7Ÿ:nŒY\\–!ö[­»zÓM7õz½¯?¿øÃ¿þŸ¿²„ ´ÁƒT˜ì@¤XaªÉBP’¨±¢(ÅX”h²ÈFd ¢‘8‹Hø”H«L̹Lü â?ˆt+ŠbJe"!VÅÜŠ¬% ØDíeís«ë”qp!µ-›â+ÎÅÃá‡Ì‡2WtP¶( JÓD̰ҵYì ÉR“0¾ÀÅR,EŠY+f­(‹®<¥b°¥¦ý_|ÙY"ºzõªìµ¶,µ†µ7ÜÊñ±¹¹9z{cMjkTgº“¬ï›‚¨#Èp9ƒè¢zp\¿…#-ö*” (ëÐ0YL•Š!º)SœJ­‡¹2ìx€cŠ­&µ0¡X‡±P/2’cß>†‚µ¶Iø.­¶×»k¼jƒ<ҿʦC¾8#w¡ç¨¿“Zù'®?­é¨g”‰Bçëå®±{6·¢.žôwUµxý¸AC¾Síäîfk¯@÷©#šêYð8Sœևк»Ñ%Ú{š+Ü·bnÛ}Œ±ó» ø "RyŠdºx‡Ž"³'~yÞçH«îJÆUš@Ô¯î4i åuÒ1ylç¶Nu×x®^¡qúî4ľsc+¥XÖÚ Ä'KÒ :¢÷}ý±·}ð“_zö¢ B!ÂA(ôŠ$—0Š¥FdS;óØÓ=Ñáß~÷kö§¶¶¶–––䋦¦¦Z÷S)uêÔ©^¯÷ÐÅËïø>ðõgžEØ °1ÀMÖÀv„jQ`0@P³-ˆB«±’\BÚ(G‘0¬aŽ!rB-ƒHÔXlD «DÕ(¹` bqV†î‰P˘ϻ@D½^ˆ<ÏsQ`UN¢•;:3MœYµÆŽ^ à§zÎY ë•HÂ`,ÎbÄjd$ÎW‚®b7÷Ä)ŒUb€E‰þQè–Rœ&ʯ ÃúÉŸ¼}~Z<ÎdÓÞ• ¿}_ïy‰ôÚ05 ···_ T­³(v9,G^i–Q\ëfŸ6ìÑM<1s$ÍHET0¦.aCƒ"‰ÑQ .6Û("+œqàËDN‹Š§“Å»uޏˆèÛÆüF<Ü&¼šcþÛ½Þ»|f÷Õ¸îj#ŸŒ:aŽ0ÀùÛkždÓ±&iíN ßB ZÅ Ê™^Ub5L"Ú°ŽC¡^%äB³åŽmÃOc&è8#…J™¶Oœâ Lx£¼#oq?-2Ø­=Gx×Ì$»=Y«ìײuj—b@K§m× žk\/n\«&9–¾Ú“%sÃj ²“ !25·à8s)¯{¬Cæ`¥Ò¾!ÁÁÖÜLn>A­‹˜ï„ûù•R,qvÃPܯ9ræÌ™©©©'W7ô?÷ÞÏ<°¹µcƒ"Å ¢cÅ–RÆcMjd‚EB²Ž÷§Þ÷=¯SÌKKK"r1ƈ©ùáyÞ™3gfff×7äý¿û§ßx˜‚€‚¤ÿ„ / v0\Bj‘ȲÂA˲JeM€($Bò³ùƒ&"ÉŒL,ÚŠm³Œ “ׇ +B’\iCIHL^76 £~ëI"šŸŸŒ5BÂ`1щù¾^ÌùµT.¡ÈJÞ‘W7$~W1þ Ê ˆ(6Ã’[¼I"!Å:,ÅŠ’çL© K)ÖJ{ê—ˆYÊUâ!”9îõ¾²²r&£PlV_H성è…ív&U¾ÂØzûºÛÛ×Ówe(„{¯P™1u¦WÈãªÄD%¶»ª˜‘¤:ú{ŽC¬x ¤eKK£Ö÷»¯~mMìšýuøÃ øXnµ-€ïÑúg§¦nõj8±í¤Ésªtì]o*;© Ñ83â@t'‰¸;û–ú…Ó¡êìF…¦WÑpª@õè¸N^¹¹Þz±iæ_c u+…mkФžwµÖ²%—Æ[“`¢o+3 ŒÔ-ó2s”É,œ?Þu€Œ\rgRëÕ@siÔʯãq2'~?£+åª ½â]`ã_&+—Þ­×k#]>‹DÒU} Ìh¯P’å;ÞڲΠµïº™Ô(Å¥ÏÔÔÔ™3g>LÌÿá¡§Þú{ŸúÜÓÄÖÝF¡ "D&Q6¥KÊó¥:,+–Xo8q䟿ê¥Dtiq1 à ”R.ê¥ÔM7Ý´°°°†?ûÁ?|ß§¿`Ä?¢º²ƒ%9†6ˆ_G0°©[VPÙ8»0 Ô'+Œ†+Ɇ1±2v(Ú2âœ…È ÉF#˜aD&¢0֣Şñ±Œ+yÑšO<ñìå­^¯'s.ä®N~àpª'^0±`JÌ!AÌÄ©™È°@Œa1¾l> k001P%vfÐо=vv ¯´’\B¥)Vz˜KøŽ3G^dÞ³²²’îÙÝQ6Y’UnÞ k-½ðè~õÙ5Öõ¶Làa Yb'Ü*{c>wñ E’øƒÌš“ +®A?¥Ç›'M”[yt’ÚeíÖ+,]Ñ¥ù¶²ã*ßfîZ‡#0ÛEï¾:ª+Â#øMc>0<Ñ6—`þ;½ÞÛ}¿wCL˜ÜÄèî%ß}>.ºaè”3ØwZN;š^uúö|Cû©ÚÈ}jÝ?Ž8ÕPý`WKMä8l;ÔNòNgû`~p!.£ÃÅ¿²ëxä½ÍÌuì^æ%®s»GU–5Ob¦(” åÒÏÖ=ÙWkt— }â¾W.ûÌmÈÊ*ìÐòœYÜ4·•K!n^5ðŒ°Üvï„|)Þã3xíã-fß÷¥\öS‘3>|xnnîÒ¥KÏ®o½çã_ø»/¹ù~ÃËæ§¦H)R Ì`bV|³a Bˆ‹ ‚,üüK_üÕËK÷Ÿ»xñâÅ3gÎAÐëõ¬µ­MÍÌÇ÷}ÿêÕ«ÿâÏ?óäÕå_~÷Û|kÙZe,A¬©´5–fc`"öVÊ ‰’I:,–ññqköÔ!+Œ‰†Kd\‰Ï}Ú(²at~eí3Ï-2s6°uŠh0À:1×'"bpabâáý¼Ä—HœØ‹åPÿWÊQBªˆ9`rZÅÀ”l))dÈl¬+ke-XY(VZYka”RêUGÞ}úð_ZZZ:~ü¸ "kmAôçû¾Rê  677_€V ñj*Ù¹øGðä€JWÏ—Êרy_eÿ¨ˆ2R£PF†Õ þ¾ë8KT³”«<‘p®y/šbЬü‘s±~]xÖÅÑ ¨šßZ<Ž Ï®»Ñ¾Ø¡ñ;9[u[Ù2—¯5Ö“q~Bø›(ú‚Cý‹#Ìo÷ý›”¢*tu½Déè~Š]KëÐ+ÚJË![– ë#ï=¾ûªŽ¥îùÞÄÏjŒÉ݃Sdn@î?pk<[ˆqcrQPÇ÷\«!ÓR¦ ß+Q;Ï×^i°?[`¢Ý½<¾vûxùZ¯Ô¥áÞé”Y•l^Ô–¹×xÚ]wô ¬èÛŸÊ´¬¼;¿^¸ùÖÀ¤ΩikÒzûɦ~H´U_{Üå硵VJò¼Œ1ÖZ©xðàÁÙÙÙK—.]ÝÞþ¥/>øGžù_^{÷[Nc¥Àœp– zA‡%?ç<ýko|åöÿi}}Ýó¼#GŽˆÎËQ‘477çyÞ… >óä³ïúõßyß¾óe§obc”g` {†aÏѤ5C&"¥ÉÓ¤5˜YkÖŠ”"f$5õRV² ABr°RNƬ0,+Ú+qmO “TÄÂC†‘‰~ûÁÇ,077'‰r333£,f–V:=?“é£qmIìã¸Á±Ê€U[ƒÄÍ=Ö]q°@vxüßc¤Ä(Š-%fX–ÔBŠÓ J±V°`£”†Õеúç/¿åO/,¯¯¯>|8aõûýÂÑMMMíªzm1 fIh}Z¶eçwŽ?µòä>:†±×p~hdHi¥u.·C¦À%¨9Ë×Щg“ßÂí]¹Ãå r0-‰¾PÁ³±Dƒ¥„Í+õlín"¿΋§?8‰­F«`Ã#AŠÊE Ý}'^4[ß¶Ðæ­R,]>†Ûn?(¢×zÞ}zssóÊ•+®¬ÿä'¾ôý§½÷5/}ñÁù¤n]’Іxžˆcœ„aݵ0÷ïÞðÊŸûÂËËËZëƒ ;3måŠä1==}æÌ™ .þ­Çõ]o}Ý­gÙó¬1¬5<­|ßšˆ= ±§)X¬5+ÁX‰hˆ3NXL ÀJvÝÚØ Xò¤ì ‰Ýů]j¡0,CDá/}ö¯—vý~_4G¾ï÷z=J’;,"€uωCD1™Jto$^U*–½1¥ÎU bR¢sOµ EcÌ„v¬˜eLÙDÂ$Œff V|‹­;s°¤U­´-+É1üù—Üô{Ï^^[[;tèÖZRSËŧ¦¦vvvv1©BA8$¾|'b)êX™k‚Þ%é.Kå’.ý«rÞléx3Ë9tm¿’¹U^ Å”¿ ò­-k½ú[¸ÈµÍpkœ0,®ã_ÈEnUõ:W ¬î6¨‰±]NÀnЫN‘0ö$@bçÁÛ¼?¶Ö*^U…eŒuÑÚO„áÕ6®ê½Áó^ãyîAZe{r— î"ÍîêmÖf€`–¨Ì3D>°É¼Á¼Áü ­µlbeë6¢ÑÉWŽT|r˜h8K…K^ÏHqÖõ”QTd´©>êg<îø)8÷ó‘i&1_5uàÒ«­ÚgjÊpÞ ”ïÔÖ;ÍUþ•ëW .tLsŸôÞSÞ×°(].Uj¯*)j”®JVb®R0'ãšÓ€ªÕpÝ{ö{„­'L†åw¸T5x®—Ï »®–ív¤BÂÍÜ ™Pþ誖…üBix¢Ä«ci­µÖ‡ZXXXZZZ[]ýo?ûѧ/ü“»_ô_Üq³§9Ѩšb®"–XÞ}Ó±+/»ý_>ôø¥K—´Ö3333=zt~~~qqñ±«Ëû7?üs¯¹ç|ë›çú}xš#m#ÞGZ±§9Ò¬µ8a¥¹„qú³øÐ „±”ÑèÊåÒZ&,ÁÂÖ±°w©6Ù DÚA $ˆá<òÔÇž:¯”:qâ„ìöÜÜœØ?5ç¬UæʧóËâØºkø§TÕ‘’¥Ô«ó÷SÛ¿Kšá°ØKv ‰üð.@àarÖl-±b(Êȯ,EJ±ÅÊÞy`ö­'~rqeuuõðáÃr SSSÙ–z½Þ`0ØãìäW —Ê h&ä‘ëíŽsÏÌÂA ¨Qª»/™_÷p6ž©œ#¿ Þ³©c¬Ž% sšâr¹?ÎÛc!¹ÒòŸCÂÝàêÎŽœ[å˜+×:ÅèÊV­jö’^Ñ.”c§úðÕ•¡:—ÊÌ W,©-×õˆè Qôµ(jÝÓJ½Í÷%‚Ãê¡7'oÖA=Û%ôÒD·[û2c^bLCIÄ)à0@Dwóz½ç»3¬ÊžfGåȉog/ãÔRoDÂ<Þ·8ndäZ¢¥“˜qÀBv±å¬±[ºnkž5ïB{Ž&j i ³¹[ÒÎMÒg¸µu>®Ü~ºŒ vHîc\ÃcAÇcB¿ò ^•@n5_H`²Tcª±ô.giíg2Õ|ÖÛ¢ËeÇ›b ;3¾K.»ÅÜ–™ÏݹU]¹¨®ºÛLÆyQ¨žüb‰I2úAÀ üªc‰–¼(>Y’lxìØ±\¹reukëýÚ£¿õø¹~Ïíï8}¼xk Èb,Xüì­§®ì ~í‰s/^¶1CŽ©Õ]b³¬ (GMõ;ÁùÄ©?”ï'Yª¸e8—zåô 0I¯šƒÞqÖ3pÎ 2sÇ훂¥iU:¡üéYkÿ" ×ÚæÌÑ›|ÿZ·–um­9w#WÇ€7GÑ]ÆLu9›šèEÖvX•Çh»Ì]ÅÔeäüË ß‚†6@·Ùr„zñ×êj:‘ô÷ƒY&ÜúWŒdý†.ün7rùÛ3¨1~l†°î,ÉÅ õ8fE×8¸|¼Ð¶á¶…ÇWÿpcìß›OV®åÕ Žb¦nýZ"Ýx„œ»aWÌüuìÍ'’Ò¾[w vépê2l'òÊwÃìH[®€1–$_Wâ$ €š)®]ûBX[ÀX"Êb¬(ŠŒ1Zë^¯wêÔ)1Æzjcëç¿ø—˜ûoî¼åO§¸v†¥ Œào¿ùÊÎà÷Ï_zþüù“7Ý$矙><77wéÒ¥s«ëïùàÿÄË_ò‹oyýÙ#)Òäi„*&YZ[-Ê MZ‘T!Œ›:I‰=Y åù`-K-Ek!îÖ"Š(26.DQÙ$‹ðá‹WþþýŸß1æÀ ²«RE‘ˆEuXJ)Ñ ½âÄЋE÷D •„ CL5qœU0 QŒXcû4‘pxÕdf1Éb&² &VŠDÔÅ̬4KµGRŠ”}ÃÑ…Wš}`ysmmMìÀƒA`¥DrWVÜ —†{A~Õ|1©Ô Œ¼NBéâ¾çFNA.£ÓŽ¡âê›Ïl¸tU²¡ìµpÌìi>¨øÈHg¹ÅÌ's_“³¨=»®œVÕŽaåɶ™€-ç`©ÓžL$%‡Ü$Šî5ëVHYgwÙÚø«(zØÁªò¥¾ß÷çó^ܦ1é´%‡ŒæÍ¾1о/ŠôHçâ(À]ÎWv8¨RÄT¼ [¿üÿì½ieÉuv¾¼·ªº«ª÷eºÓ³c˜áÌp° ‚¸¤ˆ E(H)2ƒV˜KØÖÙ¡+,› ÙR„,Q”mI´HS)Ó¶,B-$h‚"Ì 0ƒÙ—ž™î®îêZß»ùùGÞ%ïÍåæ}Kuƒ|==¯«î»KÞÌ“ç|ùï8“šé]ÚÛ{8(žø(_(î&ýDV„uÖ‚g T± ªö ®*áJ2ÛQ—¢v„™v~Bt¤è4³—–šÂtÂy;*átÂÖ\F8òÀpð ÎúngØòî°& ¦(]—§ê¬¯y[+¤8Ζ›ÅÊ S®½M~ôáâ˜Û|»y îÄx–7Os®˜¨ ¸q˜Èuƒƒ^¡Ï¢¥×k×MD[é§-3Â&]‚5§EԸꃱHÖïæ³aca¬k×®]¹råKW¯ÿäg¿ÿÈÓ?sßíßsþ4¬¡@Ò@ ü;o¸;£üꋯ¼ôÒKgÏž=räÈP KD–——o»í¶Ë—/ÿÚc_ùõ/~õƒo¸÷'¿éÑÎA…a‰Ê)ÉT†L!SUa.&¯¤`i“]Â7’…¦hѬDܵ‹1Ç…Å”#,yXãÏ<ÿòOüö§®íÖ××Ïœ9cî0˲S§NÙRVÅ«à^X'¤RªÝòÀ* k «R*K,&F[ÙѳtšØÑJ$´ç—‘ÛªÈ)bWR”ø–!aeŠ…e4°´dJ2õŸ½þÖŸøÌW766 €UÅx<6Ü4{€-//LMÀýý}­5€Å¼ D)¹xhé(¡ýŸ`iî,[:!¨˜tum9óô:Üò*ƒ½ø‰NLÎГtN˜`)шå0VÚÙÍÒ^!-`Û ö7™]† §}ÿÓŽþéʼnêœ&³RäkEñ{ãñVߢ|ø¶<c–I ÎøÐËäñ?Hàÿ{F£·¤ñ¶+}«Fˆ’;Z(·F¤×ð4ªgŒifÍÈPMnÌ0ž†cʼn2„ºW¤·Èm0‹0Ef‡É7€4| s°3Íß²ÔDªŠFlzu¸^}±Ð‘6«fÊüÓÀœïsºü*úŒOœH…¹MÉ Ì}îzsâ›U¨ †3H½âVÍÒ¬„›‘Èd8á³^ên*1¬™s¦¦Oƒ^‰È—¬ÔÈn5´Œ&|înõþ ì[ÛÅGKeI.v6Ž‚ð9Åe3ÁzõƒâPK–U±1|¦Sf¡“§¯XT)u0zGæ]:䷴;¤"¹]Ž!Ó†"§B˜‘gòð dJµª«ÐAîR$·Rl =´/³j†…8éñ¹¶f‚½+!J%Ñ RË‘Ê ò® Ĥ¨ÉÆ ‡Wg¸Y0¬YD>¡òIS†73{'[hX'ÞXäü¨u¯ˆ-8Ÿ45¾¡0Ñ.S[r@Ë=åLÊ´þ¹±ŒV cÙe =zäÈc}õúöþ¹¯üÃ'žý©»nûÀÙ“¦"^9kHÑ‘ÿâÂùSYö³_{þµ×^+ŠÂ•&À–––n¹å–S§Nmll\»ví£O=÷ѧž{ôÜ™Ÿ~Û#ß}ÿ]*3¸•‚ùPÖÎ(€RUÌz>Ò°@êÂdjê‚¥ VÁqÁñø¥Í¿ý©?ù§^‘'Nœ:uª¾+CŪ™eW¯^ `µ¦së‡<{¼„Û”QŸ(ˆ€¦”")¨n¿"‘A¡·Ø%m4¢¦_U—JWó†£ TòæÌÏ2ÊRˆF_šòŽ™f¡ •F¦²Lýµ{ÎÿןúêÕ«ÀF$U%&b^÷ -ÿd8†îçŽ×¢¥„îAô¦‘n©l‚Q#`ë1(XêU÷°@É¿Zï]Z²OM\pæíàå¿<«õýY6ïx&0s‘µö:Qº ícé¨[_KüFºj° ½JÁz]2ž"9b8F5®’W‹ãjÛ{× pØò—‹âã£Ñ^ßB¼ ¼'ÏïÉ2„ñ©ÞHþ`ÚaòÝÃËÎj‘±Èð”R_̲׀¸Â@Ÿ9 öãù½b<úN»†£ë)ͦ¹/ðý#|<¢G†~å^ M.¡ ‰Q¯pΊvLMGºNMÚÉ)¦iš H`%XK¤œJâMíg,€à^óA$;ÎŒŠBɃ·ãXREßkoÝb1UšÝ.YÆ-&$ ˜È[žáŒvkÂz&L5„%,FáÞr.Á#GZ©«T¥­ŒµTZêXáb“Þ!8 6º©0¬)@Ðé1Ë”{F²þˆ»ôNP'…ˆ Ú!»À¡bO‡±%TëÁÝùŒcjË”)´a¬'·vÿúcOüÜê¡¿zÛ-á–“‡¡DH]½^Ê_>{ê¸RÿÕ“Ï]¹re<Ÿ={Ö¤+NpWyžŸ>}úäÉ“W¯^ýã—_ýñû‘»ý‘o¸ï½÷\xÃÙÓ’)ô*S„HÉ’ªšŸÉˆÑ†¤…"…ÖÔ¢m«B³oïìýÓÏýé?úÜŸîŒ ¥ÔÙ³g @S:÷««·ß~{–e¦»._¾\„·ÝüA±°Þsç-¢`îVÄ E‚ªak7 ”B3È˺‚4âÑhk·;ÂÍ´ð¬Rà %èL@J¨ h%Ô(s€¡b©¬²o>xáÔ÷ø³Û;;£ÑÈÈF£•••z,™ËËËq’Ú¢nÕù#áÂÒ½áPשP_}l‰>HÈûó+ä‹ñƒYæõNâsâä‹È àEßÏÿ¨(îɲ»•šß`xBëÏbþcÉÉwÞþÑi’®üøAâÄ @¦5ñÊݬÞ+‹(ìºê$Ê ÷‡£Qèȵ´b8Þž±?o’¿»¿ÿlÂFÂYö®<_"‘›ô™ &à3io‰–,DžUê+Yö´R{"#‘10vÞ£#–iD'û‹>6b¦s°žf@ð9apø˜ÿúu”9¤júJ—¢MÔS¡ËÆA"ZYo‚ÈtN²Ë¾«x)Ò([aˆYÆŒ†ëLÄ:B–ìT]›*:£çO¹[$Ÿ‡ø3i9"+j š8¨µ` OQ[>Û…—%à,ÚP±Ä&xÑކ0N ÷ycm0 Ë[956¥Ì7¤ ¸¸ö[hd z‹†ÚÂ3 «&-s@ZÒV讬—Kˆj`«ú….Úp+ÏscÕÙ…J©ŒõµíÝÿæ+Ïü½¯=ÿ¡s§~ô–Óç——JN Iòý'Ž{ýí?óÄs›››ZësçÎM#Q¤”:yòä‰'®]»¶±±ñµk?û‰Ïþì'>{Û‘µ÷ÞuÛûî¾ý[î¸õÐÒRÉ2Én•º“®F69tÔ¢I­…¬tÜõÎþè£O=ÿO<û‘ç^Þ"räÈ‘S§NÙiq‡ºóÎ;ÍO̳\ºt)rÏ.ze¯ À:×`©ª¬j`73 IQ•¯B]“MB6¸a %nÁ•XmãŰå‹?'DÍ•S€6™Œ TB¥)S‘X_ο÷ü‰_þÒæææÉ“'Ed¿°ê¶´´4sk‘!8œˆSpÂ9еêõD\hÛ½†ˆÛ–ÿgôL¦ß»´´Äa]”ÎkÚnUêqð­E~uÿ¥¾5ÏÏÏƪoò¢Ö¿3?F1Î+•¤ˆš»ñ¼Në7DÇF'α‰W*Nš^Sˆ9Øí’ÖŸ^ ¼‘Lä–,›àuÛ)‡Zä±ñøS£0HVµ#Àû––no:7XŸÀ›õzž3qËî tE~7Ïÿ0Ï÷e’)ωbÝp)4ö†ù£×”Ñv|àHL×à LÄHÄMæMA¸Iää}iç'‰¥mÏ"”vT·‡Äœ6<Îé]¤YÕü½7}gNBo3lÊU>€]U£d¿Ÿæq1N4Rv4_e ÀòBBUz§„v •º/T¥tä«l hP²*\ÂЉÇ®îÙsF´gœr /[ÎèôH”$Óa@7qtöãËoîoyÄÖ’–F¸D,všsÀl´g”EáTͯêb…¦xëèÑ£GÝÚÚÚØØ¸º³ó¿>ÿÊ?{áÕleœ#…R>ƒtEXY^$ÙJlOªaiÒËJ Ô†„e*!–%åJ (  M‹„…LI¡>táô¯?éÚµkÀÇN]\Éó|†Y„ •«É&=œ{;1¤•†§Ð»f¤_Õ"bþ»K©L$D†ü“¢x¬(^§ÔíJ]Pê°,_ôuÔM÷2ɲß«h?©õ“ûûw*u‹RG£"G£Àê -²A^&/k}‰¼D>×7ß”eþêÓ5¤â›šé㪳ʻr q%]Š{“ôzDLêþ{"{ä¾ðÍg‹".£~g–­Lü×w¸/òï÷öžï{ïy8ËÞ¹´´ÍÓqL1i˜$>¶ÅÐɨDÎíòüyîÆ ìƒœ&†]è¡êì¡>öÂ3‡Íã\@[™O¿…îs»ÿõ+oFQCÅj(XGÛܧp!^%Fs½3FM`ÞYOÀ^#Éô‹Æ!=d‰Ñ¾³ÉÒ*ãÚ.G¢3[¶Vc6et"ÓÊM¥dô™àxLFÀœÕ¼ËÅZœÐš8Д¬M8ëO…Øò¾Ú , JEÅòM.ÄÐ +Þ<¥[ejÝ.ïsu0¬‰YO:'Øc—6¨fs(i_7ü*­OsBÒ'mGݸI°D«:ÃÀšI3Å cY£Ñ@–ekkkkkk{{{ׯ_ÿ­ËWëòÕWýØ™“ßu|}òáC+ÿòîÛ~ü©^ÞÝ5ÖR)I3U3—>sæÌþþ¾³vwv>úô }úsÀ‘å¥ó뫯[_½u}õÖõÕó뫇óüÕíW·w_ÛÞyu{÷•íÝ×vv_ÝÙUNð¡C‡Ö×××××;bäKKKçÎ;qâ¬&"/^Œ£W€Rjss“ä›o=uìð2DÑt¡2úWB¥*!¬ªh”ÑÀ²µª2‚ •<ØÆ­ÚxV©æ^•# µ‘ÁªµÞË|6‹ ¤Æ³XJb•Rîï8{ì¶ÃËÏïìïìì>|X¬,BûÙç”E¸À°&XDô´Š”Á¢W£pîð`–}>œÏ;yFëŽüÓ²ÈÊçÌ¡I7p‚–C"¹Èa‘•êƒ÷'YõaÅùíJužCՇΩ¼íá¢xÀg &0}{"/*õ;y¾Ù.|A뇊â<¹+²lϲ •'X¡:n ÛÈ1ØÕh}¯Ö‡E“xø‚R›@úc9F'Oˆ#WEr2iý!s‘-àqàã1îÞ¶,òV­ß¤õ­ä–ȶȫÀÿçÛ½µuò¹.r„<*r”<"²Nª´a<¹\¹\6­Ò©õÜ݈io-úïÜDʇDŽ“«ä¹&²f>‹¬‘Ë’¤ÂL`Gd ØÙÌŸm‘ëÀ Žq ß´Cã·ËO¬ßÊ„.cø礦À×ù'!ŒÁ q¾•»`Rã,µ8¸ëذ¢ieÍÌép­áÃ^°ÉO•²È–HV˜Š•ˆq¸ÆùÁaX,¡‡¡ïÎãÁ9£“ôžGûw´,m+öLƒú ˆ?ïT÷A„n—Öt³n6;UgÖ !Ëdj­Çãñx<βlyyÙH­_»víêÕ«oïþg^üÙçÕ÷;òýǼéðÊ]Kù¿ºóÖö¥¯íí?÷ÜsgΜ9räÈÌ ååååå'Nh­ 'k<oî6/_ýÊ嫽gXYY9r䈋[ðîôéÓFÀËàVËðòË/ÇåÛ]ú•aŸmnnŠÈ¾ñvQ Äp¯JPL JI¬Ú¢‹(s!Êè^‰©×l’-p <ØTa´P­†„%VÃo†‚è ,«î%'KJ)- Tø¡ÛNýƒ¯¾tíÚ5`ÕY„M^9,BÆZ Y½«’[Hkþ]ÆI*úqÝÞžç_,ŠA’Îû"ûs¯µšÃMš¶ <­ÔSJ}Q©-_IÖÔIÍè!}HÆ Ò03¸{ô­âpÕdþ^âb¾½×°ìX]UÃf£^Ó&,3 àÏ0xDŸ‰¬®!Õ6ù•SÿZ’‹ˆÏ­‘¯Â»Õ ÜR&ÔY9ïÆ9?½j°Q{­—Üž(’ݽ ?:?^²(¢Å2+`âÎh€è1©…¦lËhTmnn^»víÚîî¯]¾úk—¯^XÊ¿ïèú_8¶þ«Îý·/ÿææÖÅ‹···ëB~³jJ)ߪq ±F#óAkm$ê;ͽ sª#GŽ9rÄÔ¶3ÐUM¿ºråÊ /¼Ãyµv‡œRj<ooo¯dêƒo¸`8MæÄ¥VºéfUá¼€Á¬Œ~Íf' ªˆÀNåÁNò`·²WfJ™Y)å"ÊLDQ] Š)Eh©ï¶¼ðÃNÿO_}iëúu}æŒy@¬ å¢ÍveC{C‹ŽŠ9fw­yÃUn; |pyùÿÚß/n¾ÞFëÓmòD¾gi‰"7ø~Z^>>5áì¼HÁ™ WƒÎŒ›o÷´Óîɲ·æ¹%ñF ÷¹X´Üi¼X²h3jgÉ[µ~N)óRôõíiò4ùJxus Œk{7q)ò¼…;“Uì­{§‡„¢mIä Z¿AëïùÃ,û˜R×j=‡V¶gU2ºö¥yDï·ˆÿ³J>PÅw‰|>Ë~?Ï_Å=tF×ã ¸7 âÞr~)ªXq 6m‹Þò#š˜BL)þŠ Å †Bý–$ªV-žË[—ÑÞ¶Bo QJ©u±@”*Cz$ñà›E åCcxºrÇ©‚ó™s{XN4âð°Ç¾´Êœu7­èféè»v~¥` ¾?‹6ÖI-´UÞ=:677777Ÿ~þÒÆÏ_ÚøÆC+ßdõåüç._ÛÜÜÜÛÛ»å–[\Íïi5£µd€KKKKKK†ÔÛ •̰±ÖÖÖ²,«S;èÕöööSO=?›—~ÀЯ¾÷Þ[^‚22S½*ňFÐ<•a„–õxÍGU²ŒJ_U?¡-èÞò¶ªó DÒØtš©¥F§V:¡@Q¥n_?ü¶“럾|ýúõëG5¸a‡Ëf0¬áE›Ïrƺ†_³‡Ÿ¡N“fgx­ ûóÛ´±ÚÝJ}ÿÒÒoŒFã›ì<]ov?ˆ¼iév¥þ¿°Ö¼ÛÝJ}ÇÒÒq(’Q­ŽÂiƒÍ‡h¨ÏðÛYWýEåâ#ø¦jyKž¿)ÏÜšïìu)º¡~ð¤‚, ¬ÙµcäóÕK¹#@m;ÛX]÷Ÿ ÃqP4{6`1î´,û´ß\ß[Sú[k"‡EfȦ¾=ð§É­@6\i¸ÈϬÙÌD¾©(ÞRÎóÏ(EéÈ갳ܢüÅÑèÖaÛs‘7Å#EñÑ<ÿý*¹"¤°ÏbÚ‚jùHãõ¤ÔÐdò{íùp=rzü¡‹ÉPSóa#¨KЄ֔ D.aŸ°ñRÛµ„% _ÊÔ•R¸[¸,EˆVÒ'|9 =9‰ ˜âÍ Õqß»Nåµ?«yÖ˜HÍ:ü•Þ,€FªÊYš»A‘-q•fqÜxG§uën4ºÅ ÖÇÜõ*µÐäl+Ïó“'Ož}ìØ±YEé†cešÂ&V¢™FeY–çùÒÒÒòò²¡b¡¯]¹råÙgŸK’µ{·—¤ÊüKÞ.F=“’‡ÕHM TEp„ÅC§AÔ ivã›]ÖCl¬6 ËJ-DY°Ò™lŠšäA &íQª~2rïºíô§/_ßÜÜÍvl“T_íøÃ7M‘öû²ì?UêããñcEqóÿˆ°ÅÃYö†,ûÔxü¹¢Ø9ÀPç$ð®<¿?Ë$Àq¦È©À„:†® ªÝP†=ÏÎR~Hä(àMŠ< ¿ÀœëjŸGa>UêŠ)sÊ*¶xóŒˆÜ£Ô›òü¸£`a¿ƒ%‘‘=çë+"k¨©æð.•}ÅÞ‚÷:£v]‹°Ð DŠRquâ°á_EÜ`åÛe<~xuTöDF}Üd¡Vzü¬DþâxüŽé³§À†~`<>›eÿÎdSÒÿ*ï¡þÑÑxùÆ:ç"ß9ßFýkub©š¸i„e¶Qå¡ÒÅìMêš¿ßÁÙ Ï—1) eâg@€…WDØm…#¥°7Ê0+l¥'8NL·h…U–à aèÅÝï ¢ª9ìð Ö噫­kXh†ªx—¡Óx‚õ@«£$P.!žý¿àP®cjëð‚M3(Ë,FŽE«Ãô&×jáyŒÿ x‘¬Ã‡>|øÌ™3ׯ_ßÜÜÜÙÞ~²¢G|õÕWM:¡ yLaŒF#”dY¶´´”çùòò²Á³l|Ê|6 ²úç‘G‘_|1^vÐ47ÎЯvww÷÷÷o]?ü­wž5¹xF÷Š ¥ôJãZÕ!H1òí¨K–p¤2à¤ËºêJ_…ð,éÕo  0Y„ ÐP„–R­K‰I' ä»ÎȾðÌîî®ÖÚd–q¦µ¾,--¥tÝ¢Í)6†Í€ ÷€Æl—[Êh.ŠÅº-¯ªÀ-äf”: ¼iémyþxQ<«õ˳*9E»7Z}uYäÛòü]yþ‚ÖOhýDQ\šîp¸?Ëîϲ3mQj/Æt8¸7s¡fX_ñrÕCè*´ñ³Žµ<i—ˆitë롲6µÂÆ¥žq¬Uà¬B»°Ô¾Jä¼R·+Ü¡ÔK™!â ߪÔSΈ¾+SJ³þ Ö!ß³”ÿæþha§n›À J±±ŠKËPUå”õÆ5ZOjŠè´süÛµ~xF&ðóJo¨S ‘¿<¿ùÆ[tygQ\ùx ¡ò8ù¡^ÕíB¿ãdyÔá…E;p*~%ÆMäs2ßœýjæ3‚³>O…œ˜FŸwð&vx‹hþ¢O¹É¦V)çnà£u.Ô°4!,s^(‚ÖÉ;èU(E›Éû“ȨE™ÌÚ6µöØ-¢Éè¾ÓP¹B ú0» ÊqXÃ,½wæóSƒUWAWæàÂ9Fú§~#ÌXUo4’%"6’e$¥Æã±I-ܯ4P·¶¶vvvNŸ>mø;³j&«±!cäó¾spxwžSd$òœÖÏj}™Ü'÷Eöª¿çÔ ‘£À£YöhÀª¾ Ô¥¾=ϯOj}Eëm‘mr‹ÜÙ"#‘ÃÀšÈ*°¬ŠîɲS€ø\ÕÐrùŒFWI%rXy}–½ÝšÎ: ŒÀ°çSøÆ,{YëµÖ"+ÀšÈ àÝ–~3N‚Ä<¶ÛùpžEž(Šr‡Ô"kÀ;—rñ)­xÛù‰TC;©+"«ÃP‡ÍÁ*ä0E\,«ªYýËwçy6_"wÈ]%rxDeuý°ò SÎ?º¼ü¹¢xZë«ä"¡p‚¦E.ÎóQÊäã`@Ô;ªÑϧ^Oß?žAFõŽÈãJ}$ÁŽÍuñúÐÍ^™öEñ„R/îdÿ¢X½™†ñ»ÆÅc*kå–z“cVtcù^’ tš˜ ¨Ýûo™D&Ì&Ö;¹žÛ`Ob$†ÁL‘‹ƒßçä½xB1¤,K+œˆf,"2hÜ1aîK¡-¡E D‹¨ªƒ¶"/FËðI fÜ ˆÀRŒb„CøM]`°ô!œ²¡‘YŠÀTIyÈàfV _'s !°‡¯[ZZæðq;ãþ±W„Ï«¡}½Š´Š‹v£Z­“ehYÊ9qâĉ'ööö¶¶¶¶¶¶ööö´Öœ§S¢µÞÛÛÛÛÛ3|&sÐ4ÃÒªk š{6Çïìììîî¥pCô«ñx|ýúõLá¯<|§(HQFNJÄB¯ì¡ü©´±*PÀdD¢®AhATÍ?é­óTá\´~MýœªôD4! Т+e.ãT1((ýž³Ç>}åúÖÖÖúúºQ÷Ï,O×tlžçãñx1)nPF-¢Ãù~uä…RíÒ¶ð“ìE‚Z†žЮc.r—RwùÀoMV^ å¶—M1†áíð–,“v¸H‘ý´»°¾çíßûD÷(uÏÊÊX$ »bSüúÆ€}•#À-/›#•³Ð£m@ha ÞÁæºæù£ynªEõlȆXïkpJ¡¹O§CCéP=»ž¹È·—ïåÕUGÉÔ⼯ˆ¼-ËÞšeÃï¦ZýÜbg*OøÖOAЏÔ^¹Ò:ÞÙ¯G¬hï£×_?Iþ'û~zÙ/./¿ˆšƒO¯ólåNûTª+8@IŒC*Ó»è•ëúN `Õí~2º<®Ô— ‹UÕÈÎlº Ãy¶ívò}ŽâŽÈ³J=\¶Ev€Ý¾¥°VŠU‘Ãäa‘uònòn­#ª™È»Šâ_çygœŸ&ï‰Þç Àç3µlûViΞU¥ª mX#Š¢Dr‘£äqòA­o^ô­ÅøÃY>tùkh$JBþÓâeïItô[ Ã@ÉU;X $`È )ÊO­5Áñœ5Á%ô´ö¢%âtœ÷Þ"IX0ÛËC½Öª€Pk}7ک醤+ë­AòQä]¦$ýÅs CžSÊ‚ßSàÐœÈÆJ‡ê¿‚€`_‡Dº´†¤@Û^´Ðða±)Ä·Pž‚)´,}HŸž„Œ¶²nŠææè2ÔÉ“'‹¢0ÀÇÝŒ!gíííÍüÌ^€Æ666H~ðþÛn;¾Š PPJA¡Ê%”ªº_JØa¿ªl®É dM¤j¬XæÐzÝœ "¦Ž¡hÚI…f7"`åRVQ¥t—I~$ð¾³ÇþP“ÔÆãqælÕÎÀª3C-äÔüepbW`i[ÕNÞ7æoLy _ ­ÑË2@ª|"èÐ`¢»]‰Þmz1´«³hý™ÄR€n)ødF;‚¶d»wKOn£SŠ5³¦-K©‡¤Ìhï9Þ-˜ô¼{$|EœH2^XÁ¶Ì¾ªÍU‡)e]ÑLh­K Hnz9l×ÂÔÞ`בõ{Od­}VH€×cJ}"Ë^T~Í×ĦV•ûo°Ú?ȲSÔo)ô;ŠÂ{õ ýálðXuó1p¢Dd’àÓ.Œ@à ÈPæÓ”✉ë&¦Ybo´75V I!I»$§ýó<~54º¾@iáYU¡½zo*.ƒ݇†(kè8ÆHc-õ”‡ŽÔgs["ôûä%Y« &ÍgDC› 78£ª˜º=ã}bíA»@çW*ltÄÉKÕNͺj€…”éÍÚLáÂ?b˜G^ôª(Šk×®‰ÈO½ù^T¸•d(¬RÁ½¢a• îb6QꫳF´HU1^ùvö ºW²öåyÚghT°LU+Š6Z]%h…Æb¥Ó%÷]½õÐÒ‹»£½½½••/m-›QöAg./¦ö ß@³­·Â~gèÀ¬¡†ý&qõ]+ÝÑÅ{.7ÌÐQ—,ĖA"Û`@<,qvƒi‘l«]<9mË“¾fGtHÜ‚¾Lõ¹:$«×t=®P,ªuå«áþwSºúS0lCà;/`ù£hù¦ˆªÔÔÉD7ĬL.í »˜&,ámþ~] —>©ÔÓÒ Ž †ÎÉ&G®r„ü†·%òá<ÿ¬RE`. ïðýÜüý ðsKK?4?â»ú²ÈÝZ¥Mï=èó¯)eèZn" áU@'¢ÛÆï5à·²l_äÝ>lUd¹"9n%‘øýá¾0?1ñPÂÅ‘ã6|xÙ>ŠSÂŽ˜8”Ax;¡‰ÃIç©D³úº–¶Ðnد U£•ƒ#ÀgÝv†'ʯSjQH“uÀîŽéÛnjÿ}™‚µ¸8,(ªõÍЧ¦rÔŒû“o½¢D“™€ÄÍd: óu;[²ŠîÝ6è&xÞÓÙy®" ëJ»¢ÆÍ^p1í ›K/RJÕêWZë÷Üqö[Ž!ƒ((eòï Êʃ•x»±ö¹+Eív‰=ÃÀ—{ÕF¯Xtð,&èª4a]·Q€gZ*³®Qª)CA—wÞsúØ/?ÿÚÖÖ–°\÷lnò «×ƒa4YLû øP‡õfp˾®nŽçí…®d tåÝfG¢Ç& ,X4-€µ jË´ÁÒ4:u ^ØÎ¤¤íM¦lÝ{uîUߨоDDÕxLè)uã2²D´‚Ž ã.4# ¶ *ÛÁU ×sðf'•@>Î4™ƒSÊ€ÛœˆÈy£:"gÂürž¹‚àˆ½ Še„dyìoDþC–=€ÏŽ;éxÀ!ù Ý Û–ùïÈÞ5ÓôßhÍ0¬Îð¥Þ ª!_zq $€•½°HH£*½°›´ß ›´ÂM¼°F|XΤ×Jsè EŸ©w&nœ‡CŸ=A؈¹+ˆŽX‡ìf•SÐJ¶¾Öü/ÇØ»¦–$¡² v˜.»Aèô ÃOb‰wØÎ…‰ò†_£3ŠVF Åüj½J”zW'‚ic=ðŽ\Ö¼;ÔvºFËrøºöÒJHꅮܕC‡=Î3¸u sz-BKÌZÈ@}ÌE[´y W.ŒbèW$|ûϼõ^Q YÉÀR†‡¥ŒVMªmEeH‰j®”sœ;ÅÎŒ£WËF¯Œ–*)wTßDeʽw«)CÈŠ'¦P&”÷œ-,“ZÙýÆÊæ©ÿºÀ°×5¯0Z¢¢DÊjµh_w£‘ps‰‹›xÏð@uë‹îÃÀ…´³aÞõßh\Yê0|ÐgUR£,qP`I&ªxTÝI¦$—é¶ßî^޾ⱞ–.‘*!ŽMd-0ØðFN%Îîà‘¸AÜÀ^l4t¤J^1ys«­iør»(ª;1ÕÃÚDäð pÖwÇØU» ‰ŽíÀ£W°E1‰çQ[?ŒÊ|à‚J0YÓ$âE<”ùQOŽO¢ùö–åA×àG0šÙ Wš•ÝëÍž@ÉKY¥]ÌÏs³¨“Œ¨$ÒÃBŠÝG\ê‚𹠤èfÃL„v€îa—‹dëÅÚçc ¾ê™ôlˆÆöaðm”!ɈYéÿIvÀ5KСU–^ÀJþ)uqÿ¦{-!Êú.ÑÙÉ»²U]Jdõ»*ByïÙM ŒÛÛNâg‘6[È¿…µ'±³íÀZ(yЄa×®]+ŠâM·ç…Ó•è•Á°D”0´YUbX ˆªÂ/S@>•S¹¤£Wl£W­ìÂ6è[2k+cÏÊFD•9(P€†¢h(%J ð-§Ž,+ìííÕô«fbVêø°Šº.p«kªMÖ@سL×d•„¬¥?ϨÐ×^†41f8hT:%$Öx_˜ÇN¨Qí˜Ö;™ºcFñÔÞ™xH¤TR„ J`êõªy' TE*u²clÝÛNKÿíV¾e[]aB2¦{ qMéóg«ÍÙýEZ<ɉnc+pÌCä'fa!yPÆêh`­¿4·»¢SdÀÛOᄸ уÒ39|©™¾_„®RÜΑuJÏà)Ú1»s­Ð)8ëÑÏúBH~Aƒ~;(ï’¡r|ìÞan{Ÿˆ¡W&Ù¤Ù-qó µ%ÉY&¶“ˆÔí_:« ªKŸ”tŠ­'o0­h/"¡Ï }¸HßÌ÷­1·Í@è*Huˆ %áËYŠ"Ût3ã “áè©~ØÆûJ¨.<ç:`  ‚­wA?)¬­ø,e_QÃÀR}¶Ò­;Ü?‹¶hsmnò C8"yåÊùé·Ü ¥T® `²ëüA©ÉœÆ€¨fùD;lƒÔ(–4ûÕ WÕ\ªeàÍæEæh›†F¼œ­(¡jm_¬æÙ;OùØ¥k;;;¦¡j C˜>Y"¼! <ßøNiïúÌ„ýº°Æ %Ó„Ê6à*†©Þ†é¡+I.a½b@—ÝÞ{«P ¸ßº·¬ƒƒ01®à¬õÅ\€I…ûÊÖQ¦7¡wÈ úÐ'JËJÏ¡·Â¥›$¨™ôÅD O†œ^òÆ‚/½|²ÞÞÉúÊælÀ_góõZ_Q|$˶‡w2gd3g«™E垎 ÓÄü£A{9Œë¤ö‹¹õê”õ@⹄‰½Ê´ó \R@(NÚ-7Äm@”Ÿ{0æŽ0«›b.QÐJ*ejRJI’³ 7¨>Íu*S×ÕÄUUœãàTèëÜD¼C†šóš»ðÂF¢U§ Ò<`¥Œ+mžU³ùW…ž%ï´=±rqx%³ñÑp¶c}:tˆm¨ÞŽ·ž ´wó:;u’0U¤¯öD?ˆø:æó }ÍE[´^ô*”<("—/_Çoºåø÷Þw¹BV¢W5Œ ÀB]/žÆ:4¬%»Äo«ì %¬0z%Mâa]÷£: žX"4Ú Æž¡¬§Ô'•úªRÛL¤1\Ц_dá… }ô@ô½¦b(i:V2<8Pk&ˇ\…ÑçÊš´ã¸Pg꾎r«XHˆ…@Ùè,‹Ö1ý³p2@0¾8ˆRÚûÖ´‹Ð g¹Æ-óï:BÏk„>ðL,¤°Îþ€‰DÊ‚63†mb—j£Úì!0 C RR/ÇD• Kk»Äab¡ª(ÈXêa»;XÝ< )[0Uý‡¦rMX]¼ªÌÅÀ€AuYëõ ao³ ÕÁËì.³ìŒB6å…ËŠaÞ‡·bÍÖP¬$®Œôr/t‰m¼+®@Ý  NôäàÌ{EíxØÞ=Ã2ÇBÃ}ѽŠ$nmmmmm]Îÿæ;ß RAWbèWûéh`U ©ŒQ1ÙªŠÖ@šœB ½bSá<N…Ñ«3E uùãnRÖÅ QÚÔYÑ0ÿ`})»wõÐW¶v÷÷÷WVVlPÏœv¶ ¬ªÁ¹MÚfÓýƒ¨Ç9H’#Ý—ât__´ z,®Oîó:«¿G$œìÓ*@ü{æì2¶ØPìÉ ÓÜN±êÛ8~¢×Ü­ÔÝJ½¤õ®ÈŠÈ °,‡q+=y}½ˆû—àI7MFU: š³¶RÕ/åùÇã·êƒÕ8K~°(Þ@þBžïìùPµñø¬ Áµ’&”É%d22ÍïUÅJC-ØÌ§ÉPÜ*„E¤@Wâl¨Èt&~”ßN€"“ëÉá»”S_+¾L3rò¸«-’”rÀ3”*%FÑ®ž*m}pU\æ ³(ªöITx€º`¼÷~W^p$%e=¢,A[RÏ\åÝØë½ÚJru{÷.=´‹×¨­‹†BDÛ^èJ¶^ÎÊf˜hÊ(‘¾—#Æ€ðž=äQì¢Í£yÅÈk€fccc4½ñäú_}äNd ™’ÌnW%ý 5v…Ì·äÑI6Öe¶p +PÄÎtc蕇–#‘‚µù ‰&=Z›/ÁpÇš[~ôØÚ¿~éÊîînáËY ”ÒÃÝè…¾Õá)Ó;a²PF"[66Öî™GÃð#g¥N2Á­"\Å¥!y ¸ àbÇÉJIîºìÌŽ Zlªö-ð†ÁˆAúÙ2ç‘G²è€Vnª`árßNç0:Ù½¢x)™‰C!­DzÖTr¦Fc2kNšÙÝKû"¿šçkýƒ<à¥ôZÿÄxü£9¹S6¨€ ¦«$b#G¦`m½ŒK~]e×rŠïÚÄÒñŠ ëfH›ÉÙ¬£„yôB µû,µ#‰2¶&ã+…d­ÜÒ÷«øêÆ>÷,TòN{ê¡÷?vÌܪR?LѦ°T‰c5Q‘- ¤-\Iú˜–ˆV$ŸÜ}‡„¬œ¥4´€ÍÉHw.]z!âYü®ÐÒ¯GÌŠž3P'Á \¡^‚ Þ\š|¨ÃñIHþS~ëu:µ•ñJGnƒ² `-ÚìÛh4ò&š‰8¯\¹,"ç[È󬄮”BHˆ*Ó QÒRF—:Y¼Êìjùö––´X5e§&¡W°Ž‡€¢ˆ{£u\Š_iËäH¥6_­3%kUDöööD¤(Š<Ï;•çùþþþÌ\¨Íjøú8+‹ˆ‰èu€\¶xÜýâtZÊSO™9óü©¡Ñx ;&ô-öE5¬íF[muvZ3;TcG:•¯ªÙ˜‹l’¥ˆvyý¢ fM/ûÃë2àAe¾0¯öÊT˜s'ÒL)9ƒö©ÔÔÃuŠNˆieˆ°±Ì'÷g2èJ¦Y MÞ/(õ¥Ž‘hýZß~€HÖ}Z¿«(~o" iÐRLô[†s {×Ö êHrS1SÒ¸"¬+wAÑ}¯/RH—¾LÀbeŤVЂ^MéJy¡˜ ¨‘ûdB¥]ö¹¡ƒs›Ä„ð«µK€ µ"Фª[ýª…UÒ¶h.u\…§¢Kød›‡¥}9Œâ°œ!+;„I¥€Y^úúxÅ=7_éºc² Ht²áS)9ƒâSôg€Æ©Ã• ½‚Áô]+â)Ú÷ãnÔ(ËoËdÑm–­( —C¤”ªž.^¼¨5àÞsß|Çid@¦YÜ«2y°úÛܦÐ`5¬açýUi5¬$«¬_yê 2 lEÈY– EÊ¢„5zÕÎFl Cu×U‰ÈŽ>¤Ôîþ¾I±¬A½ê¸Ç‘,šnZ´ðÒ¦}¦{&‹ì<£ƒ¼ôÁŒN…h«š2º„t7oQ9§n{ ƒDÚ9lV¸USSQ¿—a”ÐþbÑÞÆë|¥hÇñòÐ``õ¿îú`³Õ“E}zj¬gNj\½ÛçsÜB© ‰OTÞ~/Ë>–eÇɇ´>.²N®‹¬“k"ëäÊ|Þ×{µþX–¥ç`ê!D*HX½9¶˜j†!…P0õ Ÿ1™ÆjMÜ´¯o#DÏù~Ä_¬J- ¥¼X煉i´ëI_Yœ«…ð†*‡i7è¶I*>W¼[`%ä†@)™úו” E[©…þª%ˆ®m‰‰ÁZ*‘ »(“NøAc+qSÑÕ(}“Äow¦K™yÕÉ6ËE—謲—žØuP‰CØðÙØBW¬”Ä,æ<¼Y‹¶h“¯ÁZ{+.-•…ª/_¾¼³³s~íÐÿðmšäA(UÌ2(”a^Œ»TÅþú•U»”4õ8¤-}%.254µ°·`8V¬ªE4¸Ðü£Üa]ÐÜuyëXRêÁõCtm{ooÏÎ"¬D¼æ`õ[ Ü*ô'%ÖºIv€q°=vðÏÅ×™ìsl$êF&*Ó&®©×÷ël’³«×N`À@%:Û¨ˆF›èƒü8ëWÀ4ØÈKWï(fØÚµ¯hGÔeÌ!,e«’ñF‘¬ƒÛ7ÖdM£2šóÎñ«ÀÇÛ˱9`Id•Ì Rgp.‰¬‰¬’çÈ7’wkZà“÷’O TT|B ÃáV X9ˆ•~˜ ÜÀÀDc`JûŸâ$º¡¹ ê­‰\£:Í•ÿ¢Ÿ•‰ú×ÝÜtvwZÂiCƒ–ïY©æ{%¤]Æ.À,–TéK‰Myd|{¹*¨à*Šˆ¥´ˆòíì¤Â ‹>n0Š}öŠü‹•ü%CC¦xÚ{ÅúçjÒ¡‰„$Dö9¸“ ^ê¾ÓÎ<·¯v\.8¹„pì‘÷~¼äž™>R}M©f)jÄ|‘@¸h³DC¼ÒW5zµ³³såòå ø'ï{øäúJ `ÕjÊú[U-BAÃÌD‹~h£c(l ½¤§ Zl,ç9‹ì–84¬,T éšÑ榵0“´4¹guå®mF£Ž –¡b0€µhb®ÊñfôÀB^q£:jb5ƒyë[MvHÞºëuEàC=¢'g5íщœ ”VŸæÛ:z«îš8Å1Y[ãCµޘП¼k/¯<ã­’d·¢]CÜ'Û{~~÷R…£ÍºPì;x8Iß ©¡«^Àeúó÷Ô‘ÈUß¶zLYx\ä£"·‘?1ìݦõ“™J™+ðÕhê5Ú‘bpñµw]CrÒŸLqØ )E½ãg~jî ,(qʇP ‡¡W) $µ ^Á»ö9Z=ÒW€ÃS˜‡Nv&स7½C) gö.‘.µNZ+kwïŒ A€ ]Oê=õ˛և€U¥SÇ$lòŽíXýVcøö{¤D£„Å5¥fš`u™Ì®ÁŠÝ{Ói]§€É‹^uÜGX""p:¼@¥ •#[ »zHIQ%ze¢öÅoAÄX´©Ûx<ŽH_EqñâEŠü—o¾ûNA•¸•ÊUÕ¨Ê|Áº6,Ú«µ@¡U•,ù³é+±£ é…Í9môªJ ”JŒ¦\Ò;| ®ôeälPˆÜ¹º""£Ñh<×Ä«º™*“¡‡÷ d[LíI`IÐ-ºÍ[Ýé`0 yÈXL 0Í~X( œB®‚ݰ†â…x¨“3ÈfÏÕ.¿ìwö¤%\"ÙÛ ˆFS) 1ƒNº$@?:í·nÄÞAý”ïNÜíIqjŽªÏÀ¿7¥)˜÷™Æb&‹f%\‹ w)â–˜•ù<ð+Yö“¾}>9j{ÉÕ7˜f]Ñ®#úEL1æ§TÅ›fÜ&.šqË0±R{zŒLeu5‰é ß·j²ù°fìyDî)?M#ôþ6ä hßbа‹º¨r8kæŠyk†Tav2ÿÑá ›üÑ(3 k••žÈ˧›lJG[„;d8"Fª!b0‹zñ™‰äɉð@™kLÒšo ÖJd,¢­ÔîžAû¦ÃJ¨Ò—_©|Ë3ï¶Ök¤CªM^Q¬v! (–mÑf‚^¹ÒWY–Õ”¢W^ye<Óùý­÷¨L‰A¯”¥¤Ê,‹ªúsiíþU XUÇ šä™>•–6(52%–YÂ+¾•ÝF²PîPQy6{T5ö¸rçáe`™îê`XX.žÕ‹p-Z‘²†õ“êóN_ùÀüû¡÷6 Ç*žT¤Pë@ŒÎE¢Èq<¾m€¨Ú?mj/»’½¤;“)¬ðpGÅkPzSb@àlã#a¸†ôÝÓG”‹=!úQí>ŒGè€M*8EŠ5×%ž&¨ø6šfdˆ&°Z]Ñ'ÒŸîH»cfb‘,ïô)’‡:…_Q‰,ù~{˜Bv‹ÎÇÍO¯”MoL2Z©-Æb‚h` 3ù•›ÛM§^L9e5bôà\Ö&ßT°¥0C[hÑÿhÞè^%¬ñ¦ÀÓÊÅpÈ€døeaÈŒjDže޹žÑË õÿÊrF Îr%}8QGx«²DDØÏßæ[ï«ÒíÌ4 ½bí.ðÚ9 —'*ú"‘A¢½Ljk ,™¤xHYŽl+à9œðE I˜wÀ9¸¿íá.MɺғìCµHó.é!}ª¦ë7µ¡TïPï”)‘HM¥áÁ>:Dè û,† ™›)/Κ.?W÷(é9›°-âª(¾ y˜`ÄDIZ4¨©(NðU]Ï9P–Ë!íµ-2æ$lD¼pÒúW’ Š)<ù‰«Bôž<]Ù ¾êHpæ"¸U¯Y¡Ï˜šDÖÚ7bs" ý—ièN‰¢{§š ͇³ëûJCÉhn£¤~,(X‹6ݺNŽF#÷çµôÕÞÞÞ¥K—Dä¼û[®ª\!SÈ•dª†®L¡*¹WRýmÊø«lQr  Ø$ñjPÚ`í¢xtÜKîU™>¨K¬Šæ Ÿ W{¹«ÍÀ²ñ>’³b`µ'}¥&¶h‘Àˆ¾Òé¡]™¸âßOýÂß>ð ‡ÌˆäÌ6àKµÃJƒ¶îú_v"‡~µÕì‹·öy"!±Úx½v=ç¡n»…_Ü3%¸œ‘ˆë‹¶V(¸‚y…ƒ õÖL¤Üú£sµQ×€[|fà‘¢øC¥Õ¦BÐU'5ßz£Ö!„èJ4 NG‘µÐ=Ïqòpàr;>À(üœ´—ùמ"ïÕú …Ò ”ÔŒ„¢LȰ¹_ëcÃi¸ç@,9½ÌVïu‘ªzí-£9סAb•®¯zôg¶¶ıX‹-Š/ÈF¯»tXÙ{|@a3‰À[ñÛ`€_‚@á_ófk:ãbDÜa_ÃÕº³™ßIñM*Ÿ= ñ3ÝŽV˜ßÝŠ§ÖsÖ“yúS¡Ï÷J_<&–Ö %å…n8 CZ²À"‰·í¶×¢åziÿì,„¥ s¨ŽaÌÚZØÔj-ÚŸÏB¯Ìø×Z¿üòË$üÁ ß}÷9•+Q ¹‚‚2ô+˜´Á hé( š ]¥­®Âºp(Õ¯ˆWÎéÀ^.ÚEç‹´Ñ+»da£´U&ÒZ¸`É-®åÙ©¥üÒh\E'­¯„Âa¬™ãY‹æº­è“I’„5—aÛË?d×ùDæÞ ·(7@3«§ü!H­ÙÚÚt5ÇÓ¯Ðl†FBG6º¼Ü(¯„°7Žb ˜”(W%~3Þ5‰ q´Aoÿ¤(îKCF±›µ#ñ‰¾GhYqAoÐ{“£W"²øùäÛ‹âÓY¦â[Æ[T‚Èiò}Eˆ&¯Öe`ú¦|ï…Úï…±ÎFÛ­ï¾]ŸÛhÃ3a#ÒUÿx-|ðã+ÙTJ‡m'M—ÎD¾©(¾#Üá—'Àƒtµ8£yÁäŸcм`8S’‚ãÙ?Ò†¤$X.z%¼ìVú€³@¨¾{Ž×9‰<ŽN³ç:mõéŒp½zhT -³*‚lä°Êö¡TÈ$|y˜l"© FC$Ö´ ŸwuˆìŠ„štw]àƒë^ÆzmG¼0¤2ó'¨òà€¦Ñ“Tt ôóDéµ™Ãyõ uàmÚð°… €÷ÑcUÐlž}‹+¤ƒ\1à~‰‹²×;2‹¶hS W.,’eYÍ$zùå—G£Ñƒ'×ÿÖ;ï“\1S*W’Y& J)ó¨²ô ‚ªÕÚШ]•E`KˬM¦·•<'^ùÓ½W¥”ì|±uŒ¥ìn’¦3g5Ø4Ùĵ¥´"€Û-] Ë-;8=€åÀZŒÕ¸Ûª­?ô "L¼rÅ—­tŒlêÇìÛx±Æãà½WÌæ^8°3<ÞC. øª»jwá4}n7 BnsÅÚÒt^-ÞĨÃKré-˜˜Â÷ìÞ§ˆœ³WðAŽ·w½L:ýæ%|õ¢{H€´&ž‰ó“¯2žRê­ÚÏ“ø¾¢x‹Ö¿“eO+µ•|“LHàR"çÈG´þÖ¢å¾\z “õj wii²*3èj¤‚|WQ|Gd¼f6ðªÕzÐk½< Üã[èP~t\|'ôogêO”ÕPô°¼¸•y®ãäëÉï(ŠaïbxºâÜ1±&¢3ì$S~þÓBð gq΄*{–µcÂ/2Øáè[C3RR¾ìƒurç„dãˆRDÄP¢I¯|PÊ¢iny䦵¸ëvêšÀ¤Ü w2[ $à•Lò¢•½d¿8úgÒ"¡‚ÌdËž·ÌMèë3ÄŒÝG ¡c0ª„ÓnÅ’opcu¦Û,­V´Úúyóš(XXU1…oÌZÕ•0Ëdu͘ ºKhûE[´‰ZQ®p»-}õꫯnooŸ:´ôÏ¿ó‘CË92¥2eþ”XP¥  hÏlC2êçD‡š€JW5£JBÙ‚)Õ»?ô©¿;_4pU©NêæÌÃèÎt¯<ç;¯üñæŽÁþl,Ó”RZëÅè:8«Ò4œ2,Œ/X‰²£é‹ã*UõrÅÚûAlµYጛH]É&®¥Õ]Ö-æ$®2êðÕ½ ƒ›OHˆÛ½r³.C8+…Ÿmi'I«ï/* çÞ8é[† …%::Y ÇÞÒþVȉe4³==Õ¾gb76Á@Ýk ñí%m™ó©ûù˜RïY üö<ù£ã±ˆ\ž.{"ûÀ¾ÈžÈ8mð,‹¬ˆ¬+"‡E^G^Ðz¹ïÆ~7Ëè ÇɳUJMÊcöÖ+¯ÇÃarUdMä^­ï!³ð9·E¾¬”Xš˜h 3Ë~&PßPDÎ?2.~DŠ-‘ËÀà2äŠ`ù0,wà9Kž!Ï’§É•„Žú¸RE»W‹¡~øº<ñ„YU2µ&`z …vù.ß/é²qéû?k‚pǰÛåê^ul¦N°l‰T˜M4{Ü>kÙkUâ5 B Œ!^s«÷ªL‘PÂ~î™{ºäýN«_Uކtâ`wï+‚P¦ÀÒ§¢'}5h'° é>7fšÆ8½œ²ÎdQ‰Èdöz*Œ¢iV’*ÆØ™µšUƒd®ÍÑÒOëGðývãçE[´”¦µû¼¥ZújccãêÕ«+™úÅïzäÎkÈ2dJ”‘oWvæ`£z£q,+F¬¤ ­lY/t%|ŠLD¸7ÀýõÀŸ(õ}»_k"kä…ù÷üðé,KQÔI·3Yzo eQŠ-Îðqœ&S§é·ùèJZ9  –Æá$&LeJrÝ úØB K1@· o¢“N‡BÛ¢4ݱ\‡gH'iYùúQY_…› D Bì-cft•)VSuTà±ÅGÈBŸ|û ZÂ'™¸–ç. æ¹›=o8¢’Ð+Ý¥}¿íìªÅ#Õ«„þ¤—®.)ý’¹õÕµãwbÁ¿Z´ÉæQX¸Ý8^ׯ_íµ× ò¿í·œ?aTÛUfÔ¯TEÅ*µÛE‰&g•Z”¡0AU"RdÍ®GÅ$\*KyA+‡Õ›6B¨ëÌÁò‡š±U+¿ƒ%Š…JUìÜJ."ãñØfZÕÖ¬tÜ›‰‹–°(Ø…\½8ÅÍY´;ˆˆL€Ý¬ð⠼ʠ—ÞÈšø„s#‰ × ¼É^Qáί”“šàú3H‹4j‚ÑX’\,ˆ}Þ¯ô‰ »¢ïY»‘À¯zYWP¶«+:P— „X)cošpŽÓ }Lÿ­ßϲ äÃ7 •øEàŸ--¹˜ï1òf@¯.ÿ®ÂzÒí•{üÿže¹È7Üݾ%òÏó|o¸1ŸwzìL°§x8§­ ‡]cÃàþvùMº" KXé?%E:ÝÜõê^¹ZœDZ¡:ìÚÎI´µ€†6¢/!¸5"µˆ;}÷‡Sí¢­Qj@U»èZD U•_ç +aÔ•&m¹GÕ·4ªpçzÙÎCý°–"Ÿ…´&£'BrŒb|C±ªÄü·æN¨‚¯[ø&¢û@Ÿâ#CqŽ©¶x[Þ—¢ÛÚ„üZ*NQfYólÑþÜ£W|ÙÝÝ}åâEù›o¹çûï=‡L!Ï)É2 LµÁòoeÊ Ö£¼gQï*é*a%Ƥ+úU “êæJC¼ò‚V6>%zI¬ÉVíÂÚÄ=°r3{ Í3ÑZwÐ¥ZÄ}Nomg» ©EŒiu6åºÙwHƒAÎTšQ3n•®*sö8¶<-‹Ù ë¦^tv³fhj¤¶ÖÜ^Lé­ùíu_¥ÂGt )ƒ¾2Ç^Ç]ùø8ìóË{Y}“•îAB4˶{/>oÖÀX* B««Þ‹ð­Bœ^±7FÒ TD¨+c5Íd§Èÿ™ç2ß Ö”ú?òÜ+¹ußM° îˆü‹<ßh÷µ/’‹üB–ý%‘·ÝÐnßþ·<¿8Ð(ë´„;ødÂg2ø™ps.ƒp·þ¶O‹(:¼&p!îÐáR ½DŽéÄÑéºWLè·ø*,m Ç>ƒòYi:1~t5$B•ÑÂÜÛÝ ) *º¤­*`‚OÖÀ»§j|¡®(>åËÎÏ ßâç%EJ«$&"“y“Ë´$QXÔë¯pŽ‘ ¢ë4ü;”^«÷ŽíBœ ˜í{ëT~¨qn’­°“Ý2ä=€‹^-2”mJôÊÅAò<7èÕh4z饗4ù#÷ÿéGïTy¦ò̤ ªL™À2%Q¯Ê} Ä²õä)‹(n-ó(t$^‰¯"¡áêæVÐ`sSg¡úa —¡âTÒò!Ì(r,Ï$  &3b`-€ªAKƒm!-a vu%?ÝT¨¡›ê6òÀÖ«“Öƒ©å€%‰[ƒë™·ÓÏ„ŸòENz~î:Ëá ³¦¯±×ßp´Q3¯S‡ð­ºOÝ¡f‡DmS¢…)íNÜ¥ %â¹…a±ÎUàüE¨ÄM »v陬[Œ(’W˜õŽ"„Q¿"ÜÃã4dadæzìû"ÿ*Ï¿¬õÆãÕdÛ_þM–•ÚR¾1|Û^(_þ—<¿±ŠVblîûVÑ ™eŸRê‹âàŸN‹ü~–ý‡,Û ŸL×hˆ‰˜ŸÛý½ÇWîMŠjGšdÚ´Ôž@•Ž M·®WǪ9¾:!½ìªx%Ü LkäÒ^‚œ¥Ê+:Ù+)ØÂg¬è#rï ËÉ^ÜJ[üa¶“¹êrÇT¦N:BB])mA÷På8Œø>¨À{_¦ð‡Ök`2pÆá7“~‡3É.UÛñ>£ö]Ú› (>‘T© Pm‘¦GAףɠZšA4Ò]‘ªð‘¤ßE[´Þ*;hªéi­_z饢(Þuë‰ÿñ[ÞX¦ –d ¢@ˆ’R´B2UA-P–9gYV—,CÅò#V5ÞäÆòª(QZ–l‘–HVGH«ÔÆ*¡H]¡’š/@9—U ,­µ+â>K.ÉÆJ[Z{hµ‚¿ Ûê¡ô‰P¶t%:@•Íï²ÊpèöÖG§öt.ò ˜·Íd-’É®ªxÄ©D/ '0g#¥‡õ—èÈ«£]Ïë“ÐG÷~H¨]•ä˜qŠ”˜žé‚V‘CùÞuáÀ¶¨ãuâÃÁ¤“܇RaDr‹žRTË´+À¶È1ççÏ»Q -bÀì{HdFüG¥¾°¼ü¨Öï(ŠóµD¾ Ôg•zB)„ùÍÏŸ¾å-:_Rø”R_¨dνãáàn·¦°È%¥àp&ìÏO?ÏÒú!òZ¯Ïÿ‰®+õ¥^òªG[wø"à*pi‘'•:€Íõ]‘+€[9ñ piÖì÷H)†¡ñop½`ìHtûV ‹ÜCÏNL7‰Ï—6(}¦ 1uºsu<ñz»ÞDx ¤^z; âuò®è`Xn?ÔQ‚´}7ë&µ‰rñí†ÙOUãV®–¸laÖ±‡µe˜sÚÃr‡Ú<,oÑ «;å=Ax@š'ð-KéˆXʃLŒ¯Í ð’@1Yµ|ÛYàu÷'­ðj?Ÿ´~AçbÁ¼ú'Ú;8}e(ãQŠM1SNE[´iÐ+¥”);Hò¥—^Úßß¿ÿøÚ?}ÏCKK™Ê3ä5€¥ÄdB•k¡‚!V•îÕ€”©¡A]óÚ@\4•ˆö ··UâÉôèµK¨Ú •ZئhUôHAÅÁ²ßÍöG©ÙE6Ó™ €e ·×Ÿg¥µhƒWŠìÚüaËqÁ,.ÒØ{Ò[çEE°‡@@›¸oÄÖ³ƒ×ë»ÕÞòÐq sû•z=(­`Bvž«_îí¢xŠ}Ûº^O¦7ÿ"²ÙÞ‹2z?H{;½ê`ð3ºˆ!,ÿßÝêCTEù0)qV!pv&ž0ÉÄéü‰,ûÞ¢è\î•*vcc$òà3y~†¼‡¼‡¼ƒ\¯ªþͪm‹<«ÔsÀ³ÀSJíEMMýÃ/)µ.˜8{xø´R\üjÛÖHùd–Ý9w:êJm×é UÌçÏ+õydÙäZ?@Μ“uø‚R)õ,ISä³Yö°Ö‡Û?ÿŠRÛõ>¡Ô|óbN«Þó=ÐÍø Úá¦Á=®Y§È¨iê²w}è•jP±àD‹Øyoö’$Äæ¤rK ¡-TíÄ¥My!°:Ë^ú$Nª£Ðž†.Î¥’"‘6\¥TUloƒtnº³SŸZ4t-,¬M´åÀL6+ôHè{Ó^¥È;‹Mí1NàÔ†’"ãvoJº[ân·} È(„g¬ÛµGmæ6U›™é™Œ-±¢©Ÿ¤¨¶p4ig.Ò mP눎×hK]vðâÅ‹;;;g-ÿòw<||myVW”LAeFôJL¡@L%Âj¬CA˜r}&™»¬äep !‚ºñaRnšañJÄN ì¢WÍßl«¿—,­ ©*–®+Û DäHæI!œ¹ˆ»7æiÅ? ~V¯Ç4dÏ£/ 7oŸþušþXw¨»|ðoSüö"hq¨%^ayÐu=¥‹é»^Æ-ÈË…‰¨\y m)qP1Ù yP•ÑôsT;/*®üª×D_ºCgÛ¶b%›=—SŽ÷Ÿý÷ìðžê“J½œ%WE“›ÀcÀàFí\^>]Ýð!‘UrUd\1Yǯˆ,‰äU· ìˆìˆìÛÕ‡‘íêƒÛá½cu$ò·—–î#ï×:bESŽ‹l×D®×D6E6¢e â^ÉóÛª^º|x­J÷‘4þEžžÎ²ßY9B­ÿ1HbÊP,D¶€-‘ë"×Í`»Ýç)DŠgEþQžßCY#µÈ•zÎÚÛ÷ÂñI¥žΓ«"«äðXÕ«ƒ_ú,8[‰å#¬+ݶ`ª;¸ZåËšB• èY/"’í!þ2£Ýgq`ã=йz(Ë2ĽB_á¯úU(ß¿G)2.oXëb­;¶0¬¦Ø7Uõk–y,0{êí1Ê%”h^}ç»*:‚[F¥8 ˜¼q$ ;fqÒ™ñ*¼½Ùˆí¹‡Pæ4“­„SdÑ¥ æÉ±¹kü´ÙV"c¢ZŒº’‘­ ðçBfÂ…«ÜrÔ‹PvÑz|—¢(œb=lôêúõëëKÙ/½ï¡ Ç×`@«\Q)•«2yJ©R»]A±‘m/7K³Æ ajý™à¿*<Ø¥_u «€Vä ÖA¸ºšî­ÔÂ*‹ÐÜ(HÝdš”y`eÉÚc¤J!ìô§LB¸˜ËÄ~Sú>ÄZŸ»ò†©úœœxΨӦ<Û—ÔiÎIzéh‡x6ý>gU’ÅSƒˆƒG‘L¯¦'Ú‘‰×)*¢Û¢)±Ý)Ð9JK+ljj U½Zy|–c ¦!Y.!m?°îåÓ´eÿêÿõNGÛ¤ÄGW„d7«9þ5àkÀͲAfgWd¸Ô‡0:Ò"ð"àfç°±È/e™°ãÈD˜²’c ÷ðà™vÿôRœ¼)“¨0µ+ÀËÏ@€öF—H~´Ð“^.Ó¬SŽéç€çYÃI.:ÄÝ¢¯—¦H.‚£líÎöNe“+my% g¾”ë‘O¬]¢› (ÞÃè, »g)‹‘—a“Z´1€^…î\| nû‹ŒÃ ö‡¼L9q4ðÄ©¬œ*6 §Ûá=­äFU…V•B¼¸ÛD,Æ›œ_›ïks¯…s oJ¯9¨†xɽÅVè †´¯ÂŽÀ­t·1«ov¥mãꤽÐÈØr»Jíµ+enÂ×r,Å‘T˜¸N債h)èÕx<Ž W¯¼òÊæææjžýÊû~ôÜqdJLæ RÈ  åªdcP ˆ@ÁVm/K–øP¢HÕÆ«Œ«áЕ„‰W^½öW$dM¼*÷´¨›ó‹%§T³Œ<–‚ZËÔV¡Ý^Šwm…¼ÀÂrȦ!·ñ«î\ÇéMKœUqîD¾2»^5Ï 0 ÙâhñêÔs…öB’—nLQ? ¹aMÌYMXíù!?Ñ7Õ+Ù‘…M­´÷±èûv»üħ‡ZÎ>3;OWÇí²ôîÛÑÁ›\ øÿŸ½wíµ-;Ï„Þg¬uNÇ®¸}‹Ûq;vçÒÝ ¤/†Nè5B-¤| )BtéHñ5wM5$€º¡Õ ?%á'ÐHÐáªS—Ë•rËÞk<|˜cŒ9.ï;Ƙs­½Ï9å5uTµ÷^kÍ5ç˜ãò¾ÏxÞç©`¬vþlƒð–Ø…¹ÛoP+MÜ^W!®×IßzⵠųXHEŽ—iˆF×BšÑfBôùq:3F¸ý<ý ]n™mæ/›±I{ØÄ Ú2:Ö5pÕ/ȃdŒ–bÌù»l¼ïÌ-°Ä°0‘¸±QÅ¡´©S±ƒ¾Õ„Ûgé}6÷/äàö޽¯5JÜŠX •¦”¾˜¡¬®Õ?]â•Ø¿ŠŸÕyp›jÒ«^Ý¡tUå0úy (çÆ¾“PCþ,\KÂ2,_b™Ì],EÁ=¢REŸ-]ËÏëÊ¥v]†œ„‡øúÉËL¼)F*4RoŠ\*äëà„ä9¦—™—i”³&·g˜\E½³£toÎm+r¦«å”.‚’ù/Øìtz±JŽ)uEoÜV«:ƒr¾°êŠÕ ãY —“ØÕ9¼¯ÇõÈÆ(onn:èÕ»ï¾û£ý赃ûŸþê¯~ï+ŸÃÁáè¢pû!0°œ°üW° Ra_ aþb5"L ÇRš‹è<¸º£f0_Þ¥!^ UúTB¯HXB.µŽ\™Y1žõÙÇwÄ>}to<—T•‰RâRÏ®™u®Ç¶Ñ;j½Ù6ŸÄ¯“êËYʬ0L<†ë/ ÷nÕ5 ]݃ sÙØ®Ë£•in“Só•ëóh|}ÖW#ë‹nÚ\5¦ËáH¡G^®·Ì¡YŽDTÈÖªù{"¿ÂCJ cU,E±ùVhÒ›ŽâÇ}fÔç¤ÓwJxÜ”êÏl- _Rs¨e¥Ï~.FŒ3n%|j eâãÇ€™0aCÉó⃴351¦¬VzFfÁíÕ…—j_>ÕÉ”Ïd[9{ £Ç ›`6m“B`q.&’r…Ù…|;F «A•c=PõÚÛ9ßw9Œ˜V›šDêûúë–|$ à~i¡Ç±¸’r£çXTv•í[]JN$^´±* ­Ø}àÔaP tB:PK‡k†]£Þ\ƒ¤ m‘³z^„[¾9Ð"˜âÞt…®v q?“°âÊéøtHm­õø‰÷½m‡#çzH]tvz;Áq-@M$´RD¶zð%¦£ {Àw³wØé 즈e¸ [IÉa#È—ñ¤šñ‹@4‰Êâ§úîò ’-©;ajáS¶ámù)Uas²ÓÁøñš%&m.ÏMc±ôÞOV†²ZnS3( é»JŸ¸‘u¿¦¸×CATîÕñx\Ыüàï¿ÿþÑáü³ßý¯}~©tG‡ãÁœ“´BÀ°(¡rÈj­ÃrŒ|¢Ä²‹kú™@-ËXP…®j:U x­¿Ò¶J÷ˆpi^„Yý`x¯Ò¾ @è T«³¸B/(³Ê‰"ªW57è £ä­Ui³¾÷²]3>µ‰ŒiMNl½nÚÿ÷6°©ÆfÞŽ…TGlë³UhÇÑ3]wC‹¢ìØý€6Nf×Ý…ç2ÓTòÀœÈ ‡‰®•È!¶òˆ)¦!1¨0è%SŒz «`<5]Ú]jÃàJå}¨3Wƒ|.®ý¢Ì@9нûÙÁnsÏÉ÷ÌÌ´Èçx*Æ9wîºbö/šM6²rpŒ‘‚Þ©u6˜‡±˜ €eoôºµgJ¿È³î/.Û‚ßK´‹™Qp˜ƒ}ܰêh œò¬Á¦Î§h€¬#`hûŒü4dÙŸR¬Z{?:4äÔð‡`$Ú9Èë_ÁÞÒ=ëæS]§_XÍŸ>ÈèÖ±*0ð„¡U"¯´Œ#ÕÇ_Ò•¹¥~d‰°ìÌ”„ϨÎî ñ{õ‹í^Â-z›G4ÚkÐEÙG_£WùÍÏ,ó¼F§”½² ×¼ ®±©%¤±£6µïóQ㶉ªÎpÚ²¨ñîáš¼^½jù;‰{õÞ{ïýð‡?tÀ÷½ïü _ÿ‚;p<àpHÜ+qpË$áv bWI£=Ù© Å#3 Œ¬$ÞÞàS ýJºšî¢(¸“3ü¬´ãU[æ¿®ü©$ñ.YÍ£äÕÊyQ^„6eóÊÉR/â¹þ—FJy߰𱡵#Øm´4ßgrÉ”«É7ḻ­€Êk X‘’:Š!ÞnjU‡}TT !]& oA- ޳Îe9?u äv%£ºÍÝÅ`0)›ˆ¬0h"&¾ØØ´“Xø¯åWhE}®ypý(zk±™zò3ÇæÖoßñ3j*3ZH“4g¸'I54MŠ]¸ØeÁšŽ‹:ËdÅþXQMœ7' ÍÂ1*]—-WÂè• íxÏ<§š¥®ÙýC°WcZÆ<Ê1³K±9º ¶ÄaºštlC‡»òG-ÎtJàöVû5C›aœ€†+-šó[ÛJGi:—kt’®‰*|IvqƒS^uœ±VÜ%°·2{,ºu›'ôËÕ]PÖ21Òš#Ð}Hý­ž¤©SW¸cvàÌ5»¦ûŒÕ¢ûƒv!· *1ØZSD«€OŸÍ”»”R±!×ê°¶lü¼Û°êQFûø²oϧ»×ãŠ^õÑ«÷Þ{ÏAþà/}û_úÆq<àxºŠ•ƒáeÛáR_ { ½AË=¢WËðñ"X¦²\×jÐÕ„”û fйšÒÂÃ"+qwi¹Zaå ½ ¬ë±iaBÃTTAº»U—¸/y9Nrw6×wŽÓàN6Žn&tÒ’ð*¨óZªÓ©XRu|~ª\gãb,çȉ'¾e".úœÐä(RŸ‚›ƒ›[!vѤ¾\'­ÊVd.!ÐlŽ@JwjØíUÁˆí b/5Dº±1}ïç–r¶ ¨U”ÔöÕyTG{^Ë€˜C±°¯ÍuƒöYËDußd«fì+Ÿ¸éÊh‰Þ™´¦ï޵š‡”[w…ó(Œ/¹ôŠÓEÎ[Ÿ]íÐúëŸUCî¸;µ´ÐÂUUüšj蟻ŠÌž±ÑnÃá<_¸ÚÑFìƒhj›xí ÖÐí:Ué+o¦‰Ì°âصMwÌÆ DÎl°Ö)  pjd³’dñB‡O&Å…t ù[±Î#\|’E˜> qË¢c¹Ò¹i.LF]PT6‹Ëg¢FHÃøsUe5<ŠÂmôж`<ææóH•_•eªRt”w‘ëP=©WÍ••mæ™°½]+ê ¼¡ø`SšK_!J¹Kø!væëq=æÐ«wÞyçG?úD~ÿ/|ûwñK)WîpƒsÎáq¬«Òw.QÌQMƒ>Ä/S&ÉÂô3 ±® Ά®š¿—?d‚ñmia^<(jiá²Í_@ZQ$« k2 ëâ`Vp~¼w ¸QH7#þ­†Î¯ÞSØyî)1Úæät¢Ï˜LìµØÚT‰h²ô¾É+±’nOSOU97Uåµ0Š‘4±4VVqµæÑm½!‹ÑGǜݮ»Œ*Ó.Ó„Õ“^("§Œ¥ƒã#>l¿´ã"=¿ÓÌ.:?c×(·öÚa_›Õc­AŠ ã¼ØNSƒ^e &»&¶Ó`9,úQ‹m¥ UƒË Å”iYå“ά¨²#{ØGrm„⚸Q2Sv÷ìr){27:J2ó,¶+߀‰Öê£Ê}û¼*üS!Ús©tlŘ¾¼}Ihëý´áÔêRao#1b,~þÆÄœƒõœlùn©> ,'?Ã1­7]©ªR̆ƒÃb˜÷‹\ï’öçÄŸ¬°ÁØ2_û¶uVaJäèƒÈe|Í÷ðÑfÈå]XY}J:OA#ëÎ K‡À†í«³AÌ]­ë̾¼s OVàb¶GÀ‚ÚWü?ïÉÞ ¢uE×4•0¦ìcXk'JsÙàYbï¥-ÇàXq¥~\9ôŠä[o½õá‡>pø{ñÛ¿ûÍ/¹ãÁƒô•àœ“¤~u€;@Ä-@Vð$‚/:3‰@CŸ ž„^eé…†[‰l„®,¹+M'‹]=¬ô_šzXDÔLoë-0wÍúò¼ú9³õo]“4ÀÉë%G:¨ƒ5#nÒ:ʦÁû’SjÏe*ù€*Ià†æÙ ‡#È„vá+@YÝq'Å´ØP_ $AKMÕœß`U¶ ‰êT)[¹¦š£ËFgÞÿúy‹µi¿ÃɺÃ, † ªð¯k*]ÛA{²j'®„äÝúk°÷bʺæ³íõXxÖ¦âܧ‚z[JjCHn7¦f|4;ÉV‹xJS…s]º3xϬ­ž´ùcG+™uJÃÀ¯iYªRðAkæL_å ©測¾«²©Å)92{ä~&õ¼‹ÚÄÃ%[y63:àŽ7b¾É.:Óa¯Vê¢cM\ÐÞ̉©€ÓC²¿dc4‰‰¶Ï»¾2ç³Sß•Nz¤Ð­*FŒø.ÚšgäåëÇì"\$ ùÔÌœGļƒrÿÊ.ÎÑÐ;‰ 5É  Þs‚FÉálνà RÜ2hÏ\Ÿ ¸-›e¹‚–,æãÂP¹ZßÝ¢¶otTˆT=‡™uŽÊ§‚æþcU5ˆY4ß¡ÈkõFŽeY¨Ê^pÐdF¿òÙHóWÂë1‡^yïß|óÍ'Ož|òxøGå—ÿ™¯|Î;89Üqa` .:âdaaq!©º˜ŒjóáQý]ÊUKÈR. º’^Í I¼’¥â@Ó¥¬{VZhcL‡™Ô^Á¬"X"Y£ðqRÁ²u&¹Ã)”0Â]BgámËM`d‰»C÷š¤lA];Nœ’ 2ƒ ·å–òN‡•ÐÖ¾ùn¤nV#ب‚o8¶‰Šoüõt\½G×éT~‹Nó¼ÄG£¢ãõ\fUï–2WãÎÆ 7žÓÊLæ°»ø07$¼ê°E+£¬Úéwƒ¦¸OV8Ñi¢?p¤Ý·ƒ6¥fCIð¢§Þ{ú£›Slœû™LKôSЫR+õ¦•’ïs#¯!È®9Y¶e®±i<§^bJi’œ5o û¹•…–¿2ËE<“L68YÅúôtQÔÎá»÷…©½^WGW˜o(Œh^jØd^´qˆ"z0ÂÚ,º ´Ô ó˜ÍôvÙ3”VvŠ}uµj dP¨¨öœa †ïd+‚4EVó§3hæ™&wiÁ؆ͬݘãm@[â¥Ym9²;dÃÒ¡Fj;J)³—×¿º®Ž‹Ÿhij*$º]Á•—¾@,ÅÚS·EšBa!¡JB­›û±¬faq±Ã(2çSuysæE”YIi£Ê­¼ÚØ ¥Mpñ15Âu„õEæÁ†X5}ÒÔÄ¢iókp\`ª,[j1®4½Öç0`|ÿRF */G!ÝÔTÙ-=v=~Ñ«çÏŸ¿ñÆ···ßxýÑýö¯|ýÓŸÄñ€£sÇ Öî罂[´ÛÀ: †ÝP'F„xÀ.0Ž_ˆYÌj(WMÅŸ 4ݬ+¨Ê 5=¬øC4Âe‡1X\GæjhÊf VÖuºoücqH?‚õYQ(£PýÑð=MǸ߯»§ékâ%U@€ À¥7´J™J‡¾þîЪœ]¹+ÓÕ 2¶B5V›Ž” È#“IBK`¬4ÃR j¬n€Ö›Å®T#‡g÷2TÜPùxñeÛÕLª½Ì]ÄÐû©ÿõ·¾û¹O>ÂáàŽ,ZWIÁ=p¯\B¯–úmæ}œr™ Ù›ˆ^Eîd Jܪ‹amƒ®ZŠ–­é.&Å«J?“ +ÖBöD£.ÏXxÈ.†uGúÚÛû0€’”ŠœÜC RŽ Nî±OøzLF ÝÎ%+£–[_ÜòˆÕßw· ½Ö·Eû†2ª)«§XGíÖY[iè4'†thN%ZÞÛéÛ-0ב…¡ó@]“­NHÐ-´”à½F—Bÿ\]™¥NÀWr4+}U7à\Õ$”Ë–QMĘĀ).ÇuP0’ÖnGq vGf KqÚlË>R¢ìÁWÆðyÑ'ͤ ‰>Vx=ƒ'#~ãÜk9¶ãšÍ¯¸ƒI]¡'Ød™ÈBF4ÖåxwÝÚCéšBL®_—røÝ$j¶m½eS¡:Ñgfä–8ò½='6˜|¾ÑjF~öhãütƯFÓMžwå~b?©}^*µ*¯O÷ÍB,å.J¡”[í­[î1Y;-âè^„ÂC(“Šò£”ã’4å±Â!¯rÏ®ì7˜ýêJsbŸÕÇ-×ÌÙ0O£ª )ùjå9®ÏP·Rç¸ù ·õu Çö‘O³ë—ââÌ×a+Y n-{Š„4RóÒÀu¥\?ªn&œŒ§ƒÄM"Š-æZϸ|°ÄnUÊÕУ¡6› ¡jÆËõ¸¢W:zõÑG=~óMOþÕ/}æïï—>õè¡;8îÜÁ9à œsË´çÜÊ3Xh8¿T†zÁÅpå^-û{ˆ[],}Š»pU¶q“¹v‹ MCûÖF„…NV‚«Â"P¨¹€ ,ô»T ëŠdÝóáã¿“¬F´œV‹(à.Ù´'@æÁµ°w‡tå®Ðÿãšq1l×SËV¸Øð[å‹ Õ£,,ÆwÌò4–Š‘‘MÄDãÂØèÔVW3gß 0‡Lu>e•LŠmÛ—«‚ÀÀND#—ÁðšTÚ¤R®‰dâ: ËÚøàƒwÞy‡ä¿òó_ø»á[åàp8àèä¸X :@ç’â•[„Ûƒn{èR‚åXƒ^­xüJÃ5U®Ä¬”½¬+U^ÆbY-X‘°ÄûBk¹¡EŽ*8R¼ÈŸž¼ˆ8çZ Ë{Ù§|íêû‚ÂyHbo8 …í5-3Õ¡1yO5\ƒØ;Ây8U‡õÂ-Î%'Üxýsu§šºU,ô~$)Pa%Њ)ZE5j™bÕ^´Uúáš(×ÛÕ¾IP; ;´‚²úû°ªÈÌrFXXÁphš½âp¥j©ü„ªØp–À&š6¶)ÂM£Š (©Þ½ä¼‘¬·¯2ÊpªíÞÉ6ÿdýÜòK;Ö¶ Qq4·ÀF©và_3ó’L€»îõsK]^& ³ôÙ"ýÃZ@‹Žj牾ªYIüA\ã'8þ³òXÚ.ÆÉE¥njÐy9Ùp:•® «ÌgóßÕïÉ-Š64V¦ó4uo€NA·¥#iÕ›c¢àQ´D¾;º¼X»UTÐÚsÔ¡œÿŒY¥¼Q8ZÄ5Mv¨Ò(0ÇΠ©,I ¡Ò|ƒd±e[UªùÁ’9~‡yk3-úÊÌ‹ãšÐ1‘Òøx¡ÅF%  ²íUö6o¶8\<&·2`/l Ìiƒ_‹ae4]®+`}Ãø³Æ³Ë !¥_z7BÀå&ÐëññC¯ž?Þ,xðà€þð‡?øÁDäßüÎWþö¯]ŽNǃœ,>ƒÇ¥Š‹í ƒ Ê X¸W„¸€–†ù4€Ú ½’Ľbƽ*‚ß·’9ʕȺC©]f„±ŒU¬­#a„ºJ £^)ä§Ó`%ûêôN§Óù÷Š[]üØ4UžW¶0•ÃË6ÑdkrÔ¬{‡bjsLjÓ©xöfÐÌNz¹òî°.ô^+ j·ð¶ `AòP¡«‡’Ì*‘¥^*µ3ýŽ'SAQÃ,]Õ¹ÇÄÎ|%Ð^™2IŒØ‹=E2™5u´½Q†ÌUâïТÁȬPk®¢JÿÏ®ÀYA2_Þ sr,ûÎÌÉ ¹ºµQ¾ g7kàôl6G”"7}aé› ÆZiv«RQɬÀÛÊ…>K齚¥ÁuiBó$“4ôœºÔe€²¹>éžëT6¡ŸR?ñ|1AMÏ£í²Tåç1bWf«sfÚ FÿÏy¯µš¤§p’"â"ëÛf-YT7—9úuZiL'ÁAžâ2Áìœ-µ¨¹—$1”«W:l†23šCŽýF B4Tp±‹‡Óš”ÐnTC¹VëJ„lÐ2VåK^ÙL‹$]/&0—šÐ&ñèüÚF{µâSÎ@‹«¿øé9EÅba€Ö¥W±ÛGõrf«1h.³Òi‘==ö³O¯Ç+}xïonn,ôêÝwß}ÿý÷ä?û³¿ð7¾ý³8:YD¯Î-0–[TÛøƒ@n• Â"6‡ ¸WÑXpé|‹93ç ·’®Ê• ]W]­¯šˆ•R]X®× .H Û ÿ@ñ«Ü{8|üÞ…u8Rã§|f7€µ8“´ÐÕÌšaÖ;JIpÆx¡ÛÜ~±Íâ™íMÛ”NLµ¿)šE„ƒÂiÌúvîÔÚÌÀÀbh’VNhÒÈåT”*t%Ù>k®Ëé£Y`jñ71ÍÖ|ÙRÃMJÕ[eM˜å9(ÃrÕa0ZUùtYmûæ9Gh÷ü}Ù}!âôpo3ä=£øÜiòññì9J¥cdS/Jc¨µX'Î\Kù‘þÊuh@‹/¤0TÇ5æ`…»–2´ €æ«“°ZGO=6sV11ˆV=v×®öë36C;‘S…iKñ™ò>­ýžÝîkìFçtž!P, ªÃê°à0n["uâ3¦ÏLVõiÊ÷z-jaÆõÂéµÛïŒAV]SOíFÆ’Ÿ‡ T —™û&GÂyÈö¦\ÆyIH–k@.–”WÂÅâGñåX‡ªzÕw0%­$¤âÜlOAA¿•âÉzÚpå9;ûÖ¼ó8mPL•Ç«b5h:¦3Ð{[Fjݾ×Xîë' ªÊ1¡•ëwbô³Úì-ç]°Tˆˆ»r°®è•ˆsîÁƒ$?~üá‡>tøÃßøÖ_ÿùÏ#êµgÿE a9DÛÁàãð+äù&Äi¯Ž‹aÒo(²_»¸UnE«½YŰTMwéÕ²£‡µê^‘^è}àP•щ–•Y6–~xò"òàÁƒ@\ê¯xÓ=Ìd°¼4¾£ »D¯Ú´kïà⬻ÄôoFô„Þ“I†( £EÔiž@)दI÷6Á5ÿÖÛS¶ZaU^»Ì"Ä]ãÌ=3 ½Õm‘£•iÀð~Ê£|\.ÀëÔœ²˜M äš,¹M ¨=PU9$?s•ù¤Gs*‘5Øý„ݺËÉÆ™äe`T©0ÏQ"SÜ:‘d²àBZ¹h•¦2&2Y˜r@_çó@M$„qPtcÐå.57Ç‚#d”Ê=ÿ³È ‘eoX7â…††Zp -câ S¡Nºh ¨2ȦÖ58ÀæI¾dwÞ~ùVØ¡ðñ¦)ÔòEíÔjQ­ŸÝ® ¡;½ôE!1Ju¥QÚiñЬâf‡_‰-mžMìÁ£•]ëý•nìEŽP—Ð8𭘊¹ÖKL<¬…6œCwNã˜å«õaô ê嶸jZâVÖB5š4{ö+†SV§Œ)›X 7Í »gtûwÄJ#bÕÂ@óBn–=Pßñš¥ÙUûf°’ðå¦,=-æ¹âUûïzüä§ÓéööVE¯¼÷o¾ùæ“'O~úÁáý¥_úË_ü Ñ«ƒÃÑEùvGwpâ°è^ìÊ%IF¤¸‹¯ìâ<¸l÷*–†ÍѬx°2ljq+™² Ìÿb@W¶¦ûHÊ]q$\n)\Ð'F¢W,!ô$«ŠPžÜz/‹yc­u~ý`]_°ÙÕ$¥£ØîµoãW{´rÕ¦‡]‹%n—‡ññî]܃©Ú;&y óEZÌ·‹Ê–ÙïÈQ(_'Èbßô™C¡÷ŠË s9£g-wUì—â»'cÛ—©B«ì^}Ìu㨙ºW4`Ãg0ŸšS¡,§Èﺣ= ;óå{Ð|J…èƒÝ°áïöÝŽ"êÄ}¬Àæy >e…ô( £<“]H´Èv‚ajÂ×åátòo–oY-¬2ìյJÄ´tRÇÎåQlEéú.ö²õVÉ— rŽ/\èÑsºÙ:†!jÅúΞçvuŽl)þí¸))®RŠÀðëh€9­4ds/J1lšû"é2Žˆì’œ1” W–²ãõÚ#™Qˆu“®D\¹ UUηp’+î2j£ÓëЀciTŒÐXƒb•ÁÂV\|;´|Ùáí'Ö¶öÂ8Zì9ª½aØÜÖ÷!+ ô+šôÉž¬êqúÅËj(J‘†¢2—j=~’ЫÃáp<O§Óo¼ñìÙ³/=zøGßûÎ/öSrtîp«¨{µ :`!aÎ+ÇïœÃ$³*Þ"JH™íÑY¸•!t%•ѯ¤Ëº£ºÐ¯à”°ÒtÞ‹ûBÒŠ%„Á*—üÑmÀª,9£~ðzœ†¾ð³á]m'NíHcÌËd츋"aW³sšäÄ)Ýæ"çÑÀÚµµ Ròýf”®ðÒ$¢ÑÊœÝÆ#@I¤R3Àð²’'¦%±ºÁüï€L†µ–O„æÞ°!°ÆÏ;£,FJ(GLB{z4WØHÑ~Ç(ßæœ™]&Ûð½3¦S¶NeÅ0`þ24s´dµ…†À‹×4Ùúý¸ãËØŠXI)”¼×Ì*g÷Ý'¸]2Í1QŸhmRUÄÆž¤Ü¶É»9Œ¢ËJ^=Ǫ¼öPTPª‹çR{QÍ'{¥ öÓ1Øvà–K‘aÈ—’ÔmÎFަ„éã®ä*ûÆ”‘Z½½oèÄÌÎÞ_*³#/órî²ôÏ6§0FQn½kÀvíB΄3ïweKZÛ³Ò–†"4F¦º'V%”®ù¬ï~K;°U;ZR­+“j`Ä‚‡jÙ^A€…Öji UAäz| ÛÛÛ9‡Ãáæææ7Þ¸¹¹ùÖëŸøß¾÷Ë_yý¢è•,eƒ‘~ç ,Ī}¸WŒµ„ zÕØq”èUÝGmÜJŠx´S-(ý¢ÂÐUõfC Ñz$yoøü >«“üS,‡C¥ZuGVÔàj7¨®GX(y èä%Ñú©èEçxÕÚªâVï»MÕì¬Ã$òͧ*^Bnù…2qô¥×=|q ­xGe=´Ìµ§²K$ ‰¢Ö°"’¡ÿðnú0´„v„™LU¯ÀQrÚ¶·iÿSÕ7®ð[#ºÆ Ð;U[ܘûödhÀ°öRÏò¤Ú°·¯£*!é j%}’v[£+ª$ìª`UZ¶f¾‡†PµºYù¶7Ðv‡²/7Sõ]÷¡Ãªô{Ç/:×aâ+8‘Iuþâmd1nnBîXÔé8~”HÐãµ—”Q™ P¡RìŸÌyà#ËqǼ“6ººšÙ“!lúGógu“õ²…fy‚ÞÄÅZ3ZJ[-ss¼dÏ ]$·¨¶mžv»~¹E¯”À«"}«œŠÛjN¾üñ˜£H¾,Œ?$1,J¨n‰`V‹öpd¥¹u(÷mجò/ –SV¸×pú¨ú§¨eÞ˜#(]6†>ÓBû.Bd«÷…Ù:=Lš*?j Oõt¼½ÒX†êÕ²Q­KeYŒJ<,ýÑ— Ú¤êºv÷>†QÍõø8777Þ{½úè£?~ì½ÿk_ú3ÿýo~ûÑã;Ñ+œœQ¸â¢ÜÕb8è7P¸U;1ì(1Ä4zÃ÷Š&P5­$S¹“%†Ö&ÖU.@«eÌ%áùH¿Ò{Jú5a[ÑŽPðŠM¿TpÒ®ª´Ë~mgß/¼å'½ØîèùÎ Ãch(žóS–¸öyÊÇCøéˆ üºÀ¯V²@- Ãý&@]¤4‘jÒ<ê¿øíØõ{aF³²˜ì-0M °Ì 3r‘’6Å®¼Tú!¨‰?.Á‘ÚE;×ùöeTØïe:¥µ eR ÖÜ~ËHÉm &¬x±ßxûó“Û9ÖØ…ëõg35ýÔ?ŽBA^{^èwh\ —¡W×ÎòÊ™Mr”†79–«%£œÙûs›t¥O]dñÍK–[¥º5„ò.ý¹¥ëˆwñ¸xÇÆ8F#ÝÛñÈ cÃSŹҩ,]߯©biíÂp«ˆtøìZTF”’_à$ZÆÅ×üö' ½ðàÁï½÷Þ{ï½'"¿÷ó_øÏÿü7Ž´:¸…rµØÊ"܈[tÛS€nôÉ©®ÅÑ€g¾G¹W¦ÅbY0ÌMÜJ”RÁ>†•£]=fV«™¥9f–‚áéW~!˜VÈP+ YïÜœDäp8‡ü¹¼2°îÿ`™çß©ø±Ûxa3arAÛ±b…2ž4R–Ù†Ú·Ù//qžÉT–Û»hÂ%h6Ó’-ÑÛgB£—¹Ï`®€a'|©_N›øÉéÏûzÎPO.Ùñвgk ýÒ¡Ö+­šmüžç]ˆ‰7ë€îº€¦=8{ °–Z¯Ç¬Õ‘º£?–3`«F+‘1ŠYÖîµû¡¾‚èüŽXbk%G¹¤zmÁªù†ÌòŽC|ßIÄÅZq/räãðs(ªÂ"z4Ã’¥|UŽh Ô`[_ößœD ­Ú–ôzĈȭ¾ÝõT‹;›”g 3u'|KuÜ¢ì-þ…,ë—yªÏ%Y˨%¥Ð'bBí'–MTLH4Ú¿ú¸¦åäÍÍMEÀYÐ+’?þñì û;_ý7~é+îx€ ŠWîàd‘o_D¯t…¥b0¦GKé ¢Œ0±/ U>zS€Eì O0¢W6ÙªÔÃ2p+ öêѯx6tEÏ*úhÅÁPN¸–úèšj …™è»¼ñüFDŽÇãÅ]U¾Õ•„5¿¬l•-¾Ó ›Il*MŸl¸á\ãM3œÍÕ>«U7©ÎOêuvKr k67\û*ñF”â‹ù#µ5O Õݹq[EXÀF¼ÒFüÐæth~(´»ºîgæe¤ zóQ3žÚ%y˜]dwm Jud—eMN´ä©ÁAÐ¥ƒ w—ý–±€;Þ6ž‡±8wflALJ’}Lª8¨wV ¡QÌ 6óíÐ9Ûù"†Ì‘ TFSŠ‹é ÛÑå^’ e•»lL”.jÉuÐIᥔ…YƒÞD#óeÿ;ºÂpì@õÐ,×oô%Õ'··›L¢àVÔBéHv%@]ãìóuJ”=ÄÍ+$ ¬Š\Õô­bXË®BUrEOv w4¬—d%+îÊNœWª¥aíŠe-Ã}ù=NŒ¥É`ºkËwìÀNÂíC&°ð“Œâ†Î³èË‚¶—äí€%¤…®›/´µS2«¶¤æ˜Ve˜M:TGhšñœ˜û®ÇÇãðÞßÜÜT\ Ÿ?þæ›oÞÜÜ|æÁñ¿ý§¿ùÛ?û™ ×~pî¸h´‡A,Ü«à 5§€Cì!…N½v¡Y!”{LF5¬‚È«‘­pjn%yµà.Ö•ØE…¢ êì~eZ)wï%üu¡GzÉA®ÿïæ6Xw$âž`³ëXØ)s‹ÖîöÕt‚kô¬¨×–Å­Ó·ï†VÚ¡)×ßCѨÁƒ”´~ߪQ ÁóçNº5tÎ{¥e!®ºW#ÀC3޽ÑaX¢®¥áV½âdSJÿB J¿yé)`kÈníí´'Q¥ÇÐŒ[54ñF /p2"fû¢Š]BD¯X'棴õFì#èJ MŰùz¼êGÇpðÝwß}ÿý÷Eä_þêçþ‹?ûõG,*Wë¿E÷j‘l¸Uo_(X†—‚Ü•FVRQ„x†7¬¬,E§è •”怲A+‡±8©‡¥jºË@Ê=×bg”»£B!Ö¾þ½zõû+ÁL$[Øqçô¨¯*ª×õè¯/*k“{]ïíe Ù|µËá]-Ãã œe» æ Ø*âëÎSnìCJ‰jçòzÑ´™úOUî˜C7ÔÔת£¨'-묅V´¾g) î€Õ¾2R¿ oùúýð$ekÄlù$âXW¢ùj³·¦·eûlLj\¹y‚ê —Ü 4†¦(OÍLŒ]R_š?žŸù·i^Ç®k†-¸;;`l¿¯«t&^n—Wßnº÷aÎû{h&ã5,¥QQLÍt+í7¶?_taš öŸÖ9î%‰xæN?ˆù'bÁ:ØØi9qœè?…^ÖúÒ~]`¨£®ßk×J)¥«7ø¦ÄJZOR‰ÙéKÿ¤&©"‰qãY´ˆœfâ³ð&új:&^‹·ÛÄM¤ÔÊÑþlç–½¸ià{§š­(ØE¸Qûòó~6$gp¬.Å÷™iØ»ƒrT:0¶Ü¸ï·9·kÈ`{¸,ºã¡pã€:ó’x¹3,TŠæìoÙtÍ3h—ŸHÆEshÀ‚Å'2‡ ’‚K'ŠtD»oiI³¾¯‘“¬¿B)ëªÙ¹ªEÈEÓ÷ »9‡`)柗Ù#xÀi7oÊú8@w6M9+û+&†Ar½ÉêFçµÞ1 èÊÙ’ŠYB&ßÜF!œ[§Ùųi;QÉ"[ì‘ÂážIG²´oŲÏûæz¼ÒèÕBðùàƒÞyç’¿ù™Oýý?ÿ/~ò5H¸•K>ƒœ#° _EÛÁZ˃A§= T‰û°HbE ÿ¢¸Æh%¶¾•˜e†s”+‘ÍÐUtÈ®‚ J%QôjÁªÐÊS(>Õz±{7ßèWÇãQÊʾ»c`)3Ñõ0¢v6<ë;—Ùì§²}¹®+·—¸-PUR æ L•bàÌûÎK&/hšŽ±Ë"9wž©<–æ³ $µ°T%MàJ~·o:j[ø-ÉgƒÄ•û`ô)–(˜¥l¿§‰öäD5|¾(£•ZeõGÖ_|Ô·­ˆ'´¡(fp’ú]¾acYð+ìpËiñÝ„m+†rŸÑÝÌó™xA{¸Q +Óœ‘ÝùÅ=ãVÿ—îæºhÁÌ™9Què.‡ ^j¼‡ha÷yF+[Hâb/3sË9[M0 ŽªÐûÝ©]ƒ’¶G#B©+@¤1eNi‹/…¢f4¾9sg¹¨µš^:¦Û•MƒøÖCv{'‘Ct´)Ê Ò²jìÁ&àIWë–ߨv²¼PÕ\,ÚÊVC•ÑMÌÚóK¦²Ááȹxi½L\üpñ¦& §É£‹L[!¬ÝfeøÏ61z³…M_¢)è45P1èTÁYWÖÇàP Üb/sêf0ê‹QNHhÊl©¸º!§,ÕVÕlWÆZc«š­½œcþ—åö‡¸nùRšÊs1% L¬áZTÛõ[‰Eåb¾±ä§ „n¡Mh½yû…£ gó|ƒ[0¦sæ>Nt¦þ xæÎÎx©Ø‹Hb±±Kr$3ÑŽRµ¼ÖÅ„™é2È)K…‚`I;6­Jg«Æ÷͇3£ËË¿V ˜W÷Wúh Ñ«Óéôøñã§OŸ~âàþÎw¿ö»_ý\&ÖŽ ~݃X{fW·h`-ѹ(ƒ\<±ƒ-2m‹®!R¡TÄjFÄ]¤å^‡[©”+ÙdG4­( 32"V>áYžBÂÓ/v„>½“Bù'ÀZXé©ÝÞÞ^Ü‚ðzLCX’L¬E zÂ2Ñî…ÔRP­žÏhÑC+5½¾dÙý]Η´u§I-› "i!-U5£ 'ÚÎäí(E­kó%ÄcÛ"¯¯zýïh±]Å^*`ØòÐ;h—/¸LµJJTÅHV•ÿˆF¿¢¦økeeýøY¥¤u´\çIñ“ûÇ[KŸæGëÖªç}ØñL*1„ùv§÷gÂs/ ΂Q÷Àă˜ ˜èØòñÝ/‡ ²›Ë_pqÜ3auâ4†.Œà§[¯B±Eí®­.̗¸ـ¼œ°]¹r‰A>³ÀÄYn>æ_t*ÿx2 4:Rævdƒ2´£(G©$ð°Vù¡S…p->p( ›5ÈÄ¥|¦ï.%ý²ç?ÂX° Paz(ñ?”@_ó ÐÅž.br‹ü,d¼ ·(šp| W!{BP¦éf´7l‘‰Ÿ RVûj¿\–‹÷—Ë@«¡§¥²á›í _žñ#¸’3^Ù£•l_D¯žDNTÊÕ} IIOIƃrˆ¿¤ÒwɈW.“ol«ÿ âVÀªˆ8‘E¡úþ[ÔÆZ¨Õ.jV¤HÔ—,èI<”0ÐLg43Ç΢½~sãÜ”ÜɆ'FyÞ’\ƒ11­çk¶ÁÁøIºÔ(cÍåŸ;Ab2ðÏix0zÿ\5àEM6…×ÂWòèˆ^½ÿþû?øÁHþsŸ{ýý>ýènQmwG‡å‡à6x çònŒØ}ƒÁ\0º´†‚جr0ºòéÙöÆ*ý¯jT«Ä­LH+w3œÕê¡«i;Â]yú•Ü=KóÁ]ó?»‘×^{m)ó¼;¬+zµ/­ªþuglƒÅË@6wW•ÿ2 `»¿ÓÄL¶¶ãÕ¾¶ŽÓÞã`Z îí¸ß7Á›³;*âŽl»÷æmM4Ûo«ôÄ2åQ[%`±–{`ÚGS ‘#tNû jšYmYÙPƒÉ’Ç•>nCÞÖŸ5î}Û<c9Íçá8ïæñ£M` G͉>¼µñ9Ñ88ï¦úÉì~¾ºø«ÖиÏÔæ"ö#ç×÷G¢lädϘ¥rŽ–%]Q¶vçŽzF˜d$à"ß Ï.€)ÒGäa寶œ_ÿ(†(> c–»‰mü×oÊåàˆ@‘‘“È1¤ ã-‡,sæ 58YíL6}ÃZùÔí ŒzÌ|5,Θ¿¬0,ãçÞ©ç.‚à¡[_3MGÁÜÕsµæÉŸ#ëýϨú_¡´¯ ž=Re.Íë ±yjr]ª!ë–é ¾ m¯¹î+tXeƒ$?~üá‡Bäßú…/þÛ¿øåÃ1àV‹è·¸ FòpN·@ï©– …ç +G«A jaù¤çTÛÑÂUR K*ñŠÒÂRÒÕÃo5Ä­Šïk„®ÐU´$=±›sÛAÊ>zýEwÞ“žÞ{!o½ÿ¿J ¬»Àº›òdLH®ÑÛŽ®Ã+ý%r«TüEÔm:‘ÀŽ­ïWŽóž×ßß·@bÇIиGµ‡Ð¾®#ÙCñN2F¶Zm‡l‰—nèl½äÊ¨Õ íÐиT:÷öŒ¸.ǤÚtÂÙO<á\ÎN®¤ÁÑ æÅ.'lq½Mèíֱɻ™3‡ßÈ»Q¼ºxÎË}î‰8‡´h•†aãôØÉ ô>Né‡5!óÚ]ˆGæÆàÌM›†<䬨éÏÀÜ­zXu]ƒý‘X–Ž ³Z?~Êp«l#YaRë_`ЫÙ-ÃRBè£â•”Òì̶bñW—¹k-u!Á¡$jeéX¬Ysþ€Å¹(»”ÞÃ2¯Cܺ‹8YI m¨`ãðÀ\×±ÞyŸø÷$·¿sƒ89UP%p5—¸ª*ª‘™Õk”€ µþÝîèrÔ Z}üÂÞ…×ãå¦*H²yI h),‘™8 “Ws㹃ں™lÎ鵯@ce›ð¨ê~©L¢Ew˜¥—m'ΊëP ûÊʘ…<æRýÀ&]€Xwô>Õå#`uÞmP² «ËŽùRŒQ|&#›çvÙ Túd\3\Π¾ ]Jì=™€d! ¡ ~L²9sO£ùçâ?dÿ½¯ÄÑ)üñüö[o¼ÿö'ý¿þõo¼þ‰ä'èŽÎ‰sNÅ«H³ d«¥.Sð,„HbrIôJFjê‡ÁozOe“ýEÜû0–&5¬+ÔP*Î!\Ë,!}À¬:%=ç6• Ò綃AÙ=BZ˯–ÉŠUwGHÖõî<ÙÌçÐ8æ#åNE7`çÀÐ\>:Qà¥J.’àì,w&ªž©Áœ´ˆ¡mÛÒ2èÛò1vÃŒ¶MPjb¢„«¤¡lŸJ%,Ñ‚f«ñ}“'XûÉmJб?ÇHÝéÌüM16gpZJ“*!Ô‹9ÅWöQ°Ž\§ ÛUü;¥ˆ²Q äžácÎ!V› ôTáB ‚ä¨;u+žÑ8£Åpö ÙÉ4gç9jùùGÏ ú— „îúìöRè€G˜+ß³¾ÑÏ]Ìä®îjÌÌÿ´×\Ú‰m„Zö6ÝÛ bí¹oU<¸nØ7›òªŒõ„ÌÖúÃ%gìPÈÎgzX@EËʪà-äÓÕ¸Uë ¢Õ*Rä´Ð¸ÊbuaÃôt3ÃÌÄÆ‰oõèL¦¥ò2Í2èFŸFÖÁœ92¿¬K5&WoA j:o,´ÆN¾Ënx½Y¸ýz¼j‡÷þææ¦x¾À"¢ôÞ{ï½÷Þ{"ò×æÓ¿ÿݯ}êáQ÷ÊI$^‰ƒ°è^E½v8dÐUäi¥0*¸ù`8¸ÌÖqb¥¢Â„«Ê_fEܥýâ¼–FÈêU æïlXZ«¡gXØB` gÑKNÂb¦~Å€pÉÿùl°îTk]]ñ¬3Ьë ÚôŒêâ´¯¹9 ZnÙ˜ÎDç—ê+»÷):£›¿ ¿‘#0‘ ÝÉÚ©š|ŽùáªpB»•bÑü½EÄ$;U»¹íGï ß§“uLnàÈû[àÆ5¢ê<%% ]lUé|ÏÛ—¼-§a|4®Y8Ðd"úÙ&'ö¼·*LÝ3nµÒW¬š)L ¨óË5än'—h4ΜsJm¸PŸÝÂèNbŒ¯Žµëüs¿”%ìÇÄíͲ»ÿpšë:|îÆí·ÖÂfF1'0£^”¡WHÚ))DΪ Y~€ÆÞI»¦ÇJ\r¡Ž(?ph×€Bê<œ«ÝEñ".°Ç Eq–Ž„Õ&´åS FUgºawš–iWÚ}F¼3± GñÜ‹P؇h\v\Õ™›ÙoŠÌjlˆÛnèì3O€4ZN]7n"wH‡µh…Å èxB/èÄ5…}%«lðöööñãÇOŸ>uÀ¿ÿ/ý­¯‡ÅUЉ[ ] Y‘k•þ‡haÀõ± V\Œf×¢ï@[]%ÛË©#´¥ÂUb`DÜ‹¿°\æô°ª3pVÓ]A»H‚ ª…X>ˆQ ÅûðÃ"åð,¿ø’òÿxV0°†õìÙ³k?ÉP*†b¾3QÑÉW+Ýó£Þݼ;6¸ÏV}QA¦éÇrfÅß9Z´åc+ùÇÞvñY‚Ý®2ßiìI«™Nο›¯¤M!nÇp"0F.··­ÚÚV5Fåó8ïéÏÔæጻ[­8×?/Þ,ÒÀîí·o]ç=OgVºÎPò{áZ åL%rƒg±’îIʦŀÍD²ò00ßí°Êa r,—°c­–×nE9 H/"Eëµ£+E+Á%«“D¹ZP ³ºÐ‘Ïe­¬­$¤ÚÄŽ±Ì‘W1§5¦ÓÆ×6-Z¼ãhu¦j£³«YòJxÕ_}7®%rqÌ]ÝÊÞ쌽Jmv@T—_uåiÃs•¡,šb^5°^úC-|ðàsîÃ?|ûí·½÷_~íÁóݯýÅϾîNÎáàRñ Üi…ÿ ¢*V lÅîÄ é§`E¯d§SrûÓ"Ưj ‹–B–JÑÒ¯ì :°¥AW,œãcex]-n£+DXWðKåàZ]^ó…aÕɧOŸ^¶ÛÔ h¼ázˆ([¶ !ÊU­Ø‰Î¼Ìgäζ?¶_'.¡˜û*> ™—æ h3þ6}eÉùdƒvBÕW·l?•Wxƒ$åbœd¼o ò£¬“äø]ƼhQƒs]<‚½ŠàžCÑLÖÙ/T«;ÒiØ’@bû¨ŸÄ>,¼`þÑÝ…yÖçК`^Î5‹?Dà–&’®Bñ|…íOYl—†‹ 8œèQ»iP˜î?w„ž_ö~£™uÓ³›|göx:'é('žÃå´jÔÚ2| ùb´V/fc¥çù‚®§‰ÊY#¢“§/Ÿ=VrNª±.ÊÕ·u©+¤P %28®·Ò¨ µç.³`B2á¡açSÌüîǦeÝh@]Ò†ùÓ=µú%´¹U¬I QT’™>ìåçæÓjþõZÿ®úô©yâÍ`ä™T¿Bê;HœXqMe_ÖÃ*$ùÖ[oýéŸþ©ˆü‹Ÿÿé¿óŸûÌkèj!^‰œã‚N9À¹µ¸¹¾—R@.JVXt©#/„¬u#:H?醃l‡XƒXÙ e“¡†±=I_åªkoþz.»Þ/÷¿p²Âj…®‚í )BOŸ¤ÜÃïÞžþŸ›[ç\«uYëzìXMp1û‘äê³\©ÄØ,yâQF±ÙS‘³5­h—kíË!9'ÿ±o¡?3ÅÚñþN}D¿ªhxË®Aµ,ýÖÖ†¥ÝrÏ“ðö%Kf‹öq´c绑ê>`ÓgY¶ä0N¶4¼Ð{a£$œ†–¼ñ¶àõ|ƒc{Wï ù m"ÏÏÀ·ؾ<4v ûîÓSߦidxû˜x^3¦ƒ¥ú½S¨Õdž(äŽ/âNÐù«ÃVåâØE’±NF_•–û³/xØ>ÜÛ˜è¥0œ­©@D||Ýës8W†ˆ¶Ÿ¾(L1R=»oJËU( Y¦Ÿ~>J鸞‹fKí?¢®ômiº§Á+W2ªL–ÜFD|ÔÏ¢CÈårN².xÇ2°Y„/£]pûÔ¶õfŠ £JR Y¢Puê–T…wZŽR5¢üˆœimñŒ¸§ÝÔuMèiÕ¢3ulhbÔ¡‹ -¡¨Ñsî*–õ2mÙà¢×þôéÓ·Þzëæææ÷Ÿ~ãgÿÕ¯|.º FÏÁ$R®ÄÁ‹Õ 8à\n—¨ÚNLô‘åÇE§=ˆc!â3Kå ËÝ «²à*±Ú$â.ÃA£Ìp,ôžÍé͆¤c%±–p1ïà"‡„±<+ú è},<\˜YüÑSùÄ'>!">Ìë½÷÷Ó¯rîÕ•‡•OÚÉÐÛ;¢ð‰e·IM8€üï8ó.×°ª ó«íÖ›ÅKðp/’!À_µòypº%x¢þ«»Í§2nA†=µRPª0Vg÷´c³#³’¨N*"†–yõßE—Z­÷6Šv]UØuk7‰.RŒ9ɳÉÔ½"ן™Ãèx—Í«'qn*h8¾ÙŽÍõ7øy¹NÅýc­²ô7˜¿ ìmLl¹Í»è{w ísgÛK¡r~ãErâ‰o%RqbÑþ#wõ¥3)b^ˆ¢’¤®}y_°¬+´†ƒ7Vy–ûXG¨{YQ©E•¬JŒk”ÂÇ Ø¢rhŠç)rh4„ sÕÈ顳Èa E¦»–ÈÞWe»úà¾ù½ÃŸ¤’J¯é댤Ê8É—Aþè½0é@¯º“i]Jz²XKhj€;¢_­×coy¦RïŽ wU}=#^’\¬Ðq&Ä)Û”wõŸBW7î»Q‚ ±Êm¶ÖϧõcAS åþ ©Z—Eh^ÃŒ,`ˆ³£Sa!Ц=Ê‚â“ È  ï ÿ0:šíXÅ}ll—[®™ë&]ìžöÓïd§ý©ÆMÇöçðP.®`åw)Žcço³0×ÂÜ"„ω¬á²í<ô•»éÄPÎv‚ÚZ_¶{½d˜4}‘÷Hí»k‰«Ewì´X§+Z£ £@ Ó³=:ŠªŒgŸÉèðTºŠ^C |„±*ÃV‹öB¹GfvÂAÐ ‘Ûø«Ë(Z,¯\£ o'"äÊœŠÎ]RV¥%­âK8‚Moö£Bt7÷¨Ú·,%?uĨ–,0; ]¨ó–lCF›eÔ@UÞÛÀª`”3«Ú²h°¼ö!ú&Þ†橈måþ(ñF'Ö âÍ }°ifÜùéY—˜1ÁõØÁÒºS¤c G}óiú^öY vªªÏÇž6- »1²3‡·t¼áf¾t¥:ß>˜;µ"aû³°Ü:f Öø…òw [¦I½w5¥Wd“RˆBšWˆ¢ [ מu,±5T1%›žy éJD å{%f}a½çSÆçªªlb¡dþóèàSÕ³ñÍe´øt3YTD0°ù{°‡õX%ÞÑ!ö‚Ž‘\Êè£QÒ9Ÿ+ƒ¬a]@²áñåMx*ûwkbmAËÖ#fóíjÜ¡|÷@q^ _¢ãt:ÝÞÞfiŽÇã¢×þÎÛoŸ¼ÿ™‡Ç¿÷í¯þ•Ͼ.8,rWÎavFÖ•K&ƒX•­‚aš‚ ”v–”Ëùj8^YW²6_Ô(VR³lI¬ŽaSKÈ)=¬êÊѨ¶TPzä¬e¦OÞ‹¤À EtÙK|*! `tÜéIz¡¼ù<`½öÚk ÀZnéN°€ëŸ ¡*² O·¾¤îËæ¯÷*Pp±~V c[2Þ"r]ã;VñS'Vµ +øc™òÚ÷Z…uêºÒ(h¢ˆN£4×Ï~FAvÖ¥–…årnž6Râ ˆÆPÛI e+ØqFÚXU agB`™qtCn |lfŒû­%TœÃ>¶ê™tD<.˜Æ/i+d…ýì‚, v6ʃ]xâÅ»+îå³ÜòÈ:BŠç7Ȧ+‘‰ ±36lÜh霹c$âCuM`¯ÑÚ†¼fPŒú§zõ|ô4ìÏ?íòÁÄÀJ¡L»eä›r¿bF`‘–Ž„ ñø” Ãw)Örún£ö¬ HI|Z’ްhz[GÜ^&d#y±Î&ï42XïbãRyö§ß,ŠÄ¹‚ÖØ eZÉU6Ž~Ò8àä†ÙìŽ7Øh÷Ì.D§:à…äW×cëqss“— .Ä+ïýÛo¿ýÁˆÈ?ÿ™×ÿËo}åóˆsîq‹ç`"^A$+`Y Mµ„5¢]¡Z)[àxD¯Úü*½¡W©·‰WR²¥Ä0”¾¾Õ n•–JY|¤_…J ÅôÌ­¹²‚¦{â^y!ù'OBý ˆäÖÓ§Oïµô+÷j˜µ%úBð»nì*äy91»±œ3 õÜ©ú{Ôf¯¥îjÕž T¥¸TUX¯DßÕÀwÓTÚYÁ0žš‡©l¹§Û†iø7œfd·X‹° ãH‘ïc6»Âm®âŒ2دúWRÏ b°ñb^b`‹¯4h54ýÄÞ›Z6ÛòèvÀ ïÏhpž7Sí°’œ|?ϾŒy)ç­K^hïݧÒuñºxl×#›ï®Ø{Á´ç:îÔó_jà\™v­úiN|à—j‹2¯÷FVnm\U"î*÷jùË1¥[éå“È¡Y?\\¨|¬`*{µ¾´Æ¹TÅœŸ[¸ªé]“:[q l8䦓r†*±U5?õ[ £ÜS¶•¾5±ïÃÛ 8cLÞ©Ÿž1¬Sa»LÞ${qæYwú€ßh­Y¤©aB•cɪ>d5Hmu‚bIñ ü”ÜTÅŒ‹¼k4+½AlŠ%„ ¯xùÀ¡\‘9‚Ì-«È5Þ.®yZ©®pÁu•ÊE½&¯M%=µBæh K-Ëlʆ‰耫Tw'”#% Hé-" !ø°S¶<‚õ±u&²Š© -µ³ëzoœB…a;à°yìĦ¹ØÕžFóµ­CæÖÖÔæJßLÉX/â¯Ü¬zTeƒÎ¹ãñ˜ëµÿòO½ößúêw^ÿàáœË‰WNKi œt¯Bí *³%ê¢W ‰^`çªl0V€£“œPÍhŒAØG¬d·ˆ{C•KŽùY n•~†>¤Ÿ!k¡Y-H–ç]Œœ,ŠçŸ<}*"?õS?õèÑ£€Þ™VŽ^‡Ø™–œ‘%Þ§È &´áe”ó^tsïJ;'“œá;°ÛÂj<ª"‰bÚSíÌid›§Fž‰eD‘À%š=ä~òÐD¼ë´\h{±ê`TJ%¶pWVY¬ø‡ØDt! \¬h¾6s½ÝX †$TaAM‹X¡‰Äh§XР+n'³Ts:»–0œŒaÔ·å LgObf5+3]ièä}é~Ò>Y×Â3¦©It¯ÏЙ1 P31«€q(OÆKÌÛûÊ'Ï\YîÈñüÈ}ØrBl¼ÍV¤jò uÚ=¥Ț´TùPh  ²Z¶¯‘B7vŠQ˜%åŲëÂZ5C™8DŽ ½’ ŠJ¥˜µ·ıàc¹«åƒ‡²RÌk|ãôÀÀf_®_SnßE»üdÑ£\M¿?c8Ó ]úìw¡X DÔ_×ËGá^”­û¤¾>p0ï%qè­j‹ˆ‡£I™M¤¨ZÑÑèXIã{Í陋†Åä,pN±úõ¸8¸P¹ ÇÃáôÚEäo|é3ÿÁÏéµãAçÊá°¨³'öT%(ÈhvÈqQJ«gü«à-«ã"èÉAeå G±‰õ]Á]G¬dƒˆ{ËÉÊÏ­C]¥VºZepȤ‡µŽ0èay.† |Àª„ôÞ/•ƒ‹ˆûÿ{sóýÛÓápxøðák¯½¶.™Þ?{öì:^ìá³§f·“¯·h_ÙȤvÌ+fÍHiìHK,‚L¿øK/M´à°PÝR;ɪïî¥Yzð]•æ?ŒyB-ÈÐô ZKÀ®'«J­‡ò…Tgˆ,NÒŽU;#ÌéÉéä®lChrfíî¦pp‹#ô1bš‘pÙè¤Ƀ=…ÌS³ÅVÝ(ÜÁh¡@Jã’ÙÚ¾8І+¹&æÀ5Þñ$¶uãd¦oÞ„£k:$^j»ç$ewY«lÜö˜×JÖ+÷º¼ún,ñ+À˜ï‡Ô¥+3bØ2Îyh´MEÛÉß r™Òž,@ù‘Ì»ÝX8ªÏ;J«Á´é^Õ|ù²Ð$;4Íä²&øÆeë_¾òeËÔ§$ä%T Ƽ²^ã8îØ¸·aŸæy4ÑIEkTŸËnl¦Èj3ˆRb»Ö’™ªøöÌÞF¬ÚÓ*!l÷¼|w^³À2×LþÜGy=î=göþææ&ýšˆW~øá;ï¼s:>w<üþ7¿ü;Ÿ}].·L‡„bÁPGôÙóÚA©'ž8³Gjl¢eÆ1•ÄÜiŒE¥¿ôhfÛ 9k‹ˆ{9ÞJs\Îêauq«FÓ@jCÃ)¬è£V¬Rè+ù¦ÿ.Ç]È·wXWWBV?O@¹å qËŠwðuwúó&D/<‘˜¼¤s´3Û’=+HU-ç¤K¥Q…Ï-7ÃL a釤ÂÄÅÉ»ó­€n‹Uu" ‹s‘ςᢸ–ˆ’Ävg'×5h?šC¾(RZRêñ#‚kôšïÉ»õͨ(u®+O;«WR…'JW%ô‡öhLbÊñ÷Η’Íàeó·J¦ ­ƒdm_ZydÍ?_^¨e6mÒcâ©î"-Nͦe« < ŽjÍ1xðκë%V)Èy”覊–d ·Ü º½qBû¼øÁWúÞå4IýñEÀ¾ ä;ÌbVékLªÅ­Ðjí6—âKöÒ0¾*÷¨Pøޝ#›Õ×ø‚dkv*0Ìm¥ñ•[nàPÞÌ k—²õëu"Ìv‡Ð¬Na³?¹…•ýÇÝß ÌUÙSªZ“§¿ÀÐZtSeµuàKn©±ïÛÊh‚h§›<²Ì»Ÿïæ3ÒoëÌŽžè„êÂPßÈ5³½Ç#×kOVƒÞûwÞygÑkÿíOò¿úæ—浇t¨• ÒW É—«³Ã-èwæ0Ê&8–j¡Æbm/%ÛC¸#ß®ˆ»shD(]w‘–{Eóºn•ý nµÔ.ã$S¶òžˆ¸éů`Öâ?H/âù'OžJ¦àž8n}ôÑ& äuhß[ðºÜÁ¥¯äŽz¹ÃJÈïéÖR˜ûj’nº50§ô¬ª*ƒ,N@^ý”qDÂ*nÙ]U΃2¢Ÿ;ã Ì̽áÛ‘ x­3§ßÛCTÔZ+©·é40¯(l}hX$öÖ2k&9ùäFYíMºi #É•Hk5ذ¨8ÑZœ@ÍŠHÕªœ±]R}Œë »pÎâ2¼ƒ9™£bgâ~ÞIw/2'Ï´Œz;3ZïjI º •Ìp Ô¨Ã:#4`°¥^·Ö(ܢͿ‰Í4ùVêP[n£66þRg‹Öõ 0-oÙ¶ï¡ë±Û9½"\”§«UThV«†¯zžVa½bÑzû»U˜hª=ÓªDÆÃ ,d]± %r¬Ð¨TË€‹Wþ)W•_Œ#‘ËKEÎЩYß‚´lT2ל4)6°–”ÉÝ×1Urã wÌw— ø¡0CªÆZkwÜ—Åg¦abíJ;Bh.»CÆÞc¿u8še®©í=ÞûÛÛÛ4Ñ.Vƒ"òìÙ³·Þzëùóç÷ç¾ð7ösAèêààà2ôJ"hÁút­€ÌO‚•d-…9È^ånƒ¶†1;¶µ½Ìž|»ÿ*[!:ñJ÷"´J U­w–mêaÉR*ÈE/8*^y†úA „t~©\uÜWúU,*ô”ÿýéóÀ:Ë_0¬?üðž™+Œ5šÛ9Q-86]„T5Sp4óÙ—ï›ÿøŽd¸µA*´ÛÚt'Di_°}YwŸ!#–Á„ rÊ/h½œPL›*ȯª¬Qü\7ð]éXµLOõ ¬ª&HîÑAäº@™Hv,žµ'KW¡F@~…Ð@¥­1 V?Úf_Xd&4Ù_åy³«yŒQŠ1uû²v3^ËÉ_ñ4©UŽÄ< T€˜{(0Äži0שSÆ‹ØÖ¥ÃYTiC»ïÈÈæ‚²¥$ µ4 -²ÍAZh®ò™²PgÎíU·ó~ã?Ôt¼©Õ ö3Ý”çÒèÒ¶<\Ñàß'Ë Rs6-̨‹§u§*syõ³E «²&TÎŒ\¹|Õ¡Ê -ýÂÀjá.WR±¤©lÏWG§Õ(òþoÜè°v7øäW/ÒÜö†Œ •øÐ+Ùa¹ûöY~L®(/ÊÕNe´IÍ(Ó‹“`Cè&6(;åP«­ †QPý×ˆŠ ²÷¤:úêBxoÇíííéÒœT3("I¯ý=üÃo|åW^$Î9:wXÐ)ˆèUTjÏéWaöXw“HxÐkrˆ¶ã\ò½ê• j¿õåÛ¥_zÞE¬D-”®¬;…U±;Ç8Wø»_8¡~$s BO!á}`cEôj!aEŒËÿßÏoÞ:ŽÇãÇ=z”îòÉ“'©?\x £Çú½pÉùvTB캩ݟÝà¢g;§Ñ,°£_Û È (§6ÎÙCw„‡hÞ±AF*‹6â­RwÕ§é”ÍêKcyml­ß`ki™Æ·{Ïjô.9¶%PufhÝ”ȶ•@fŽálÚBù¤0ÌÙ§õ~6V˜2yc­Òõ9䄳1l|9»o4X§.f‡È$h5ó1T‰•÷'ÃMÍîÓ¦[æÅMðJ}C»nlÕÉÇ·uQàök0AÔ¹õ¡!KÜ iq4ü ®èaè¤m©¼+[sú£^’!œz.0®=çÎ7«S …’6Û¨©H:z•#+1ÆG]yd) ã—Ö[mõÉ\ º–Âv\Êï*:t¡Â“4Õ÷õŒ.ÓÀÊVñ,¬2(c Uü]³RŒQ6Z LBªÖ«3…u[gP¹_óˆÑÜ V#¦ø8%«PäD2# ±ój~V!!²ÐÙòÕnÝM\}^UÛ_ÄQ¯±vyþüùÛo¿ýôéSˆüÞ>ý}íKŸ8º¼Z0k_ÂC`Á³×jU¿J`V^nÏЫA&ˇU!8+Tw²4ïA³rÐTIýý“ˆ•Lʺ+òX³|+Qj AYøV\Õ¯"îÇàC(éGœéý‚Z1ª_ å³úÁ\ëNéWWÊÕÖ„[ð©Ë‚M¯J ÞÝÛER ·æy^~ú‹†2Æ}Ø ]…uÉÊÖ8Ñ!£4ÒÜ×ÞQSu&È,d_76ŠëÏv8†…'~bàp.ÎÌßæŒ¦†æª$™HR«èa…ú°´'äª)ÀI¨JìvÈà&Y}Íi„Ý(Ÿ…ŒZ¬ážìû|0³ ËwŽÙ•ìÝp ó£àø”=ÍôÊh^ »XÅ ö8Öž5ƒ˜ÄwÆmŸ³^úgëï`c2²»cœÿ9(mcªPBæó—þB0»­+ʱªe>)“ZC—f½°B—Ûï`%¡DŽkÙâH®K²,{¸ý-e³~šJÛ ƒ#xdè¹—n@-oªÀµØPÜj±NÏëèD¦ñË–b[0,å3Ó2éRè9EÜêЦXª!øUÝy[x¼£oÒcË¢<¤aEáŽÊ;ãøôû0ÑïËÏ®™½—UŠ6—RlÖ•tª¯ºB½µ¾òÎxóÓ½(àx±îý¯¾òðøw¿þ¥ïýô§Ü!ð­Bý [!*GÑ«¤à¾1”ÎL&LY(A°Òȳ$zÕ‘þž‹(ÛË ©2³Lw™%[U˜Ô4n‹¹Ìì2 é£ßGÄÊTÛ%h`Q"¦HXôü“§«‚û'?ùÉ$€uõƒù"~…´†«›ù™sè•L[g¶>^ôÌñP.«mâǵ–‚~E’nà¡j—X›šjVà›‹T…´Bƒ(\•æû na‘æ`kÉgÓ4µ¸z¨Ãà¶F³9ƒðå™K Ú¾úI#p‰±Ó\´pŠ ®®£ÊØFÎãy;†/1"Î}Öd¼/ý®Ù’¯gÎý‡Â装BK‘ËQ ªIU“‰ˆ9ÖÁ¶•…e )癥þiŽm ô#ëàÑ[ y¡^ˆ>6–YŽIENcrìê°g&üºÒXD‘ËoD· }†ŠØ%ÂÂ(ä¬Ì¢¿äËÈôj¡mQWl½œÞ›÷ ôª8@éÊ |ø¨çº ‘êßõ—öÜÒŠ¸KÍÈF’Ì÷ˆqž´D97®…SŽ^ÄQ¦6¶4Êî.®g®)ør¹.L|õ”Á[ ŒTà t* âüŠÎÍ£{ðÒŽÝãùyç…ÉtvoFõê«Ì`"¦ä{•ûhèx ÍmS ße¹Ÿ ’?ËÚÎóòÕ²†t½ˆ.nGפöNმ››eÎObí"òüùó·ÞzëÙ³gù½Ïúßûê^ÿÿÙ{³ݶõ:èóÿ«ví¦ªvsι¾îm‚í\¬ØI J|ÓX8‰x€$$D£H<€@ !ÂÁ$<86‚GŒdщGd‹á!^ˆÑ Ñ]í}î9gŸÝÝÝVªZkf³æZkv«ù«êœ[¿ì{jÿÍjæšÍ÷9¾1¶[l ÖgP9ˆÊI¶¢,óJ‚}óoÕ 7¼-Ì’Õ§u5Ý$kC’zÅÒ¨*ÄŒLŒ.2 cõ3¡*÷ñ(%ŠV·ê-HÁ÷­(©TºbÇ®2êW¦fšÚR±(ÔÔ©É¿qf°öööö÷÷Mg899¹©¼>§X³½´±ª‘€Í;™ì—ðúã’“¾YÏR¯ ÐQ:HFjsðŒ„2‡îÝAL"Z¡2‰F—D–SsŸ‚duŽ>»žMìSéo"ª4LœS‹§1‰Ô K)Ÿã{;¦Š;*bUó†ê’Ifõ‘OZ!Ib”I]QðŒD`RKVHaTÞÁd®ß}i…ýÜ»H|Äú2Þ´v^äã´a‹âs\¥#Ù­X&§E“ò³s¿Z =èžýÉò“EÌ7m¤…˜Ù]_W:dÄ£ÄèwW¢ÿ°­$“çÓ²ʦÀ1xâäQöU¨“F~Œ­³UíC’™;#! P×i“4IË[s¸:€ý’Mf)2æaè>`^[z=Kw§ôÙÛ>R}¨ÒZ÷ýõ,H R¬[éòÆ”‚Z?bÂ{u Ï™Ì:ªÓÇDzxwû·õ+Y¥ ±ÊØòv~’iu¿=ˆ3*ž5¦hÖÄC#‹ ¦®'¸â†Žµ›WH¼òbí¯~|û[?ñ­?yÿ,feÙUÖaPA K@¸*AW0è}L=C®XÁ†’ËW:×*E¯Ê¬Èú¥D Ú£pU„c•„¨¢ï$‹çâV¶¡´ñk´o9ívWKhéW^éJ‹ã]¹?İþæWg¯´ÞÛÛÛÛÛ»{÷®¿ÃwïÞ]Šz3/!C“XtQ</å²¹ƒs-y]¡´ü ‚@¥¬ä¸¢?Ïà`HE"0‹â#ÈÉW†ôÔ¦õHýÏ (£jƒëiKŒ!Lö¢XUþA Ý‹Æ{ÉH`‘Ú Õd¦ZôIT'EtÌÇÌtßUPI€c‚°PB„{ø}½ÙS¨Å³1øc"XÍç/\p œ2eÕ˜¾Mi'¬Òø¬gí1 äžƉxÌAŒ 8 ~ (‚sÙµŒ\Ûá*4põæð¯þìÊ¢þ52Q1rJt! ɺ¡Œ¾4XxsP\œ2t\ŠÄø£và¨}†Ž 5†œòIÈá1mòcY¹hu"cËáöpJÙ8p(ÙNFíÞ¶£a¯cÊî›à}Õýy…·"ø €+U䟡Õ×OÚû*–à1 ÁÔO²— "›ú”sžŸÙ]¨:0ÜàØL5*ÕÉ„CÊÈñDÆrqýDÖ&¡ÌaôÎM–»:dà‰WaÍ`H¼ú'ÿ¥ÿèÎfkÑ+¥Ä¸ :4Ëü—1XWŠžAR·ÛçˆËè—aÙ í²L» N —ô–G¦°*)*¸K¼T0Z \Zª¼¥–oÕ«°@”­D7nµvx–ÐЬ„¡¡7X}¬ßÿp""‡‡‡"â¬Ëô¼A¸f¬& –uô¹Ã€]¶˜¤S)®×aX‘=ŽËÀSFà²D*ŠvG ··¦Nb—½"r+îD–|ÙØ¿…õ)“BÔxéþi”_[ûGbÍÁß`¸éîJЧ°tÒºÒPॻä-#ÍNIÊZ§ž v=ôªAdH0ÂøíUL‰©ù¤Þ‚mR•1KsÂNg3V?l!§NÅùV-y½tÝ¥Ræn–Ï%Öd+tö y8!Y<¬ícs€egÑ.Ÿðd!±¦»¦Ñïé+gÛ"3+aT쇬ØçÄrùèbGK#FúÔãØ#ºµËhƒ¦l0 TL¤SÅ4ç5D Ø÷ V†ýXÇ=º:2±ÀáŒJ¬‡Õ›55Ï gó}¾ W<õZ;´õQ2+ê>Bô4–ð¸Å8‘¢ýíuz†qUd< Ø“ƒ*€½6Ä9¦iܼ ¯¶m›¦±³’k—>ñê·ü[ß=ºc ••l·˜Mµ •¸‚êÜa=÷ª«ª¶4b§1ëä‘·‡^q– ZÂçcøY•|»ÄÜÓˆU h% ²U=n%1~–¦ÏèÄ­,» šš-$EƒB-šÔ†E!ÏZý_~e,wîÜ1X»ðô•ªEdê±Ï…Z¨‰V¨ƒ^—£y´W ‡]ˆëwÍ•¤Îmÿ¼Úf¹ŽÏ¥$§+£"Á>òÅ :‹: \…gÀ=~  ÿ=;¹q–ò‡(Î…˜·LFº~ÞÀIi!ÍÁ£X±:"ÿaÚ)²96CzݳG£#ÁÅÚ=¥Öv?Äw“¤ƒ81‚L}Ê Õ}ad¦Ú(ÌQQ~¤é§Á-°®Cª¾&±|D—:då`ÇzèX¦át){G?îšZ@tÆ4Ö•CîùõÖ\ÑÖ][1ó‘Ò߉Õ˜Å3]gÆ-ÂŽŒèü‡Mß:043eå®Oj,0=!á§”Àb´¸i™u+Îx}dL±¿<Òѳ±Ô±Œ»M¬°[ÿà•±Ü’À4¤ó¡¼ê¡Åƒ}𪺲• 0šXõÿXãशòÊ«câ°’fúÈhzÚݬQ_¸WI…VF;tV….½©þ.¥è97 ÎðïÅ|:ëè9ò ¥Uã ɶóq9EDThÏ|óZŒ 4M£µ–4ñêŸ|xô¯ÿèGw·QJ2í€#aytJXåÿ „Pá&‹ÀÁà‡ï[pëÓ„²A27”Xñ“8Î:‚«$AΊð¬ X‘p«Œ¡ôˆé–°F_?(Bí«…^ ËbZÆ|}_BÃÀúoN¿zOìííݾ}Û( ¸´úÁbu]e "æ 8I|–þafŽŠÛ€W(/3ŒÆroYC1‰ñÐ*(_Ü`2`ÜÜ,O™ÔVh艃‹§˜Nf8_cò©o dÖBdjöCí±ç#QU׃8k¬ÏAŽÚI´0bÔàš¿_ZQ±8¦]qáÒ§4àSèJ&µg¢·ë4z¨#ÀVÇ)€ãE[ämo{¯Gz3–^”0ØHÙÈp‘x[ô޹þ¬^ÍèäÊÈÈ‘kÈ™™"5T`[µŠ}‰áR3ðæiÆïºŠ°„j×~yóqÊA¢0–¸ ŽSøT@¾¨“N|U^Š+ñ”)Þ:8E(7ùÖ:/O¼ ÅÚ%$^ímûÇ?ùîáTy'A¥ Êy ZœÊÙ©º„ÞbÁ“§ÛK‡“r'Ù8µl07ÞY80݉“Ê@³#b1Ðj"n5>‚Á¬:­¶‰îèW¤†v´,mmE‹ýKó÷ONåz×Þ¼¤—®u:‹kÁ’¥ ?||YXä„phöTîÉåéKLëþŒb«p8Ö ‰á±Í9ûk‹×%@ÖbÔrP†.Ñ …ëõ|V¤ÐÑF†ÛÚ¡ãAº=ž §»m ¸™Û$ÄÅ%W¶3¤^•@ØûåpECˆf#­øüÄ‘M]&›æ¨½Ãëí-â åênA1ÛÂ/{Eöasx2—I1›-cá4}ÃGÈý»Û4Eú[ÔùŽh”"0M…}bhD¬NÕ³Sqæì ¬`¦¬2±××oÖKE—OÂÕ.¬îzzVˆcÔÙ¦8й’jªYY|øpiþƒ7”«©èU%Z›Ï`P·äMª ¸d`èzVîêÊØœ­µçtC6& ®"é¯7Ζä&¢áƒѱAÏG:èD8 £Óe”ZÏøT[Åy ÙA D†¥wÌÚ‚K (" 0kôDúJ»S‚ðòþ1S½‚Ø/ƒ‹° ¼EáY% …`ˆaýØ™¦#S†•ðaÔÛЊz±Ó]-8—ƒa¥dßÓq@á/Ð?ʨ›§~ƒ~¹ü<‘A`ß+},aL©T £d¡¦žwÐ:ì ”»Ii|rÕî|) ê¨Ø¥ßá9sáœ=ôŽi¤[*]æ*Sò1H4ø¡Nàe ªto¨*ÊNÍÑ\¢4IlDL½‡ Ž)GBZiÉrD·¶Q TuûD–eåwÔgãÂHËÕòRÍ¡¦'LÐmÆÏ#º¹´îðÌo¸`ºU”ê]-Ö]ƒg°ÙC *1¸ÐN(³§ªsÖ¿èïHÙíSëeTuj¬ÃÔžj:Új>€k)Q7$¬/­uÓ4$C¹+¯ã[în7Pe WÆgÐ`X„½êT[Å~®Ó(£ðgë»5­·N/èǹäÇráM’ÍV5 Æ‘¹Š •TéaõCÿ Èþ,àäÛ; #霩¬»Ö °´6pï4R?Ø4ÍåÔÞÀU“£Ðx` ïbqN\ ¯ØAŸ*&™s]2êT³@O:§Üã$k3¦†iv8·ÃEƒ1¦øÎDÒbøÑœš ;‘–#2Ìv£êBró‰G¼Á™ ,£äµ¼/aèà”ç)0Øù“l™U¨™UÓ7fì.çDŸ¥¹~&`:µÄ åX¡b´OïÙ0à†³Înð°Ó‘G Lñ d/ŒÈ¨ÿg-2aåLû‚N$AJŒ ÇÔ¢Gç]:æ+‘€ cH­kŒÏ5$EqQOº>Kj’¢Ì…#±n,œ²‡Zh—ÉÒ¯ò–qé´"Û3µ$©Ñª^žN!¯œ%i=ñŒeDY+ôù*÷pÖØ&y¼Nʤ2”+ ¢ñ Yù™VDÈMláߨ@x«†l•*%“Ý bÄè[rŠšçÖãÊS罘æ(IE aºã ,æM©­ÈŽxgko1¾ 09ÁE' ãZàuß¼šÛÍk*4`jìííy¹+’¯_¿6Ä«ŸØÛþÖ·?þ•{·¡ßJÜÿ(«€e°Œù ggà ¶[ ?å÷ûL1 œ.o¿'áÐ+†ób.u½£]«’´*V±’€|]”uÏ{öq«¶åj2©Í#1âíV¾Ý°®„Úˆ(¼Šþ#­Í´¦ü?ÿÛE£”2ÐÕÑÑ‘9Õëׯ/½ÐGo^õØ0óf_¶ˆd Á@ME§(MÛéÏj°ª䵄twŽCíÏZòýŒ¸¸Ôíœõ‘‘n" 7dðHÀHœ "M®Æ­SMqÉu)æÄØì8‘“0ýbîƒ`"–â"ùˆz f¥³Ð˜ôË*UöøþÓ6vLVÄ¥X܇±x¤ðª‡ÿ„ƒtéØH0 î`À’äb,ëw­®zQ¾,P."³¿×Ýï—1Õ­#,.ì b%0¾ Ò³¤"¶yÝ¿±r/¸z<7×1c›²—Lµ¦ïžAi!ÇÝqP%i´±^QàjŒÈÓΘQÙ‡èn ‹KŠN"\(3#³`D˜Ò‰aa˜›s 穨ô|ÊÆ34F¬Ét°ýB ÷©BvR1‚kÊ2y=§r$bÐ ê1¨¾ŸaÉ©Ý`n¶HhÁT —Ñ›§zÑs¬õºxaP%¡ÒÙJžJõ’[$½úLÇ™c}ÕLÖ´©@”˜ð‚D"öS"Ld€³#çë¼ÿ€5æŸYA`¹Ìd¬ëzÁÌPOÉÔ_Œ¿Íô÷!ŸHIÉ€eÎQ©]•0@útü&ôjJ‘Ý´›¬v–y.áã%‘\$Ô-‘NF ‘¯êQž0@ú½(oR=¸Ž©È§ ·L•c=ÓMšaxÅ”¨#úBþ-ä±×µ´ˆ Òö zéd #Jýšâ¡I†Î†áßjÔ¦5“¤±0]Â)óhå*³I†?¿Sîq*Ø-ÂÌ© ®Á}_Љ[®1Â!{%Ì=¦/£ÎÎÞæˆ®ƒ#0¾ØªÎï&}­íºäÅÅÉP©]D´Ö¯^½zóæ!^ýö|ô+woÄJÁ\¹Êc(_èÞ’cì¦; Ü$гë¡t +¼z­„eƒ+\´çuMGï3‹•UÁXŒÁXÃk‰—æ²zª1´Ë ÑÜJÛ½IЕøX£AZq[=èlÁŒç E¬$µæþÕ™8âÕÑÑ‘!ê¼}ûÖ Ÿ—ßu£ß¼ü ÔbËnSVE‚Ùd`qz¸òl"‚uJ2ýÝ’!{¤¬ÈÆö[•E\Ü„\÷iä‚òpš±ÍQw *¸Ò¥0)õ,?¤íPÌ3ƒâeê òá“î÷¤Á Ñ €¨^Ì#xhlæ¨J'e€yI:€g_^é1n–èv)fy>|]à­I72I¡©ŸƒÈÁÜÁeÏVË®9®TôÏÑT3¥ô‘1dçw©æ|åo‹{NÅœ?"›Å0ŸE ò,W(y9È%3zï5LÕüº< Šúe¦™2Ú<*¿xélÓ¡TlúÏR"ÏXõUÞNü &¸2¹–ˆlE©° ¬ÕÚ&Ò71ð(ôïUûRYF$AòA%ËšaŒ\5ö9¯ÐõÀuÚ¼Á6O }ªÑ!²³6«'—¼8à FµQýcb‚Ÿ„œ†2kï4Õ•uwú¨9µfß—¹)#·®Žà¦ñ1N9F*z÷ÅŸ:ö0ÈY‡]!{ÀJ5¨ µuÄJðŠ½‹ÕynwC–Jmèô›SË [ÔÄ"ŠÔ"[Ùned&(A% ÿÁÆOöDê:TèÎŒœVp‰*=ó†ÞÆÒ_ÛC¸Šœ ÌPÂeŠQÅîö'±’’eñX󸚃%Gg¿öÔBVØô6X9J0Ë6óTÆÞ©î K „ ±¡IQÀM–›}±v å®DäâââÅ‹>|‘_>Øÿ7?yø÷(…®Ðp­”r‚•» äŒV§pÖA;B0»ZRó¿J@¡r_¯ tU6¬›>8ZPãÿ˜)‰UZIYÖЯ¬0»I.=nåªtneG¦c¹wMMò÷O¿'ß¾··wûöm9??7½å·ºv¯Í†-lÞÚÂmQp¸ÝÇ9¹ÐÔп6ßYÁdtW°Âµ@'×û £™B‡ù”w¥"XG,²×‰OMw—õ©½eVT^¤ò¾Ê³:R¦^){£Ðí 2P]4®VÙª´ŒkSýÀшV¹œ;Ñ-­³:별† V£$ »ƒq÷`æb²7Q¯]…‰/n†1‹ÌÁ²ž6ã·¥aâ6zÓY"7+¬MKöƒ9ÝK¤X2Ïl[Ut8"‰K¢§šb¸wÒ· PYƒ5fç“©¯Rƒ2…œ0¶XTúV €½)Tózj×Jd«ö¶þ* •Éñ"θ"%†PÕ{Ó&Ÿ#ˆŠ½´LÅTR€úF^3+Ŭ+>¤"l\¯Î>oUÃÂI¢LUcÓ¬·IlHêv`8 #Pqä0£´C=V!#Åý¡Ó8f.ŽD¬Yh@_¡PzÑß¼zÍø n·Ûº2bí?xõJ“GJýú£ãìøp«”£\Üʹ ZIvô˜›n’±v“ÁnŒ)4Ððx•Ñk´F·÷7ªUCÉR^RŒ”ØFOM9aùÍsºô͸Ž$‡[ÃàÖ–ã .dµF#Ö£ÛÊû!~v,EùL«``V¼#¢É;ü*þ[v…Ê9”d —X!X‰PàXQ¶†Dü&2HבHþS®5ñgê£úª… àÅ’È\¾ÈeübO§áEQ° D(u…r¥ÅJ—vÆŒßÙdN'Œ}–¦ƒ¢ÄÏ%´jÑ^­ é}A ·„>÷ñ.€ó„ì\9¡ÿLºÌ[œ”JgŒÂ2ˆ ë®|î‰Üt±TŸ ™ªIÏ”IÊ€™Ý‹<»*TlbJãJ,$À/¿u±‰Æ–]§%#k½]ß·êà ºð OÖ ‰Â½£:6%DÅhˆQhIÅf‡|ïÌÃL\i¾àÆäríF¦ ÌÛƒ‰=C®2UÎ&’îîÁH°‰ÌÉŒ b ´Î„e1<%¢HE E‘­¾A°"¯¶mÛ¶Ýl6¡R»ˆœžž>þüüü\Dþá{wþÒG÷m·ÆX°#XYf•-ôÿph9`ävüL¡)0vÆ€eë) Û{Î7¼Ø¿@`:R_¯½6ôŸ?0r$BŸŒ0VYÄ=Xõ©†j•ê ƒjSDW;äm›ØUÚZ_¡ˆ“¼²ºX ¡9ï_ûêì=ypp°··'—î?xƒ^Íyím E»Ea/B´ž¬ÏŠ»PøæÊq%ìøøõù Wj´É¶MÅÁì¼¾÷ÄPbUF^ùLièDú‘*ûIˆªØ g)ÖŠÚàØEnbωÚZìHJÚŠH9aPQ•¦°”Lyë7FÑ ¦ÆàÑŒ-RmŠDs«I*üj'«š}zd1¯îýQåàà›ºîæqĤN¿o׫!ç‚›•ÐX7{`˜¾UÒ²j:XÙIÂ`°._Ði]?ÏBj{®R1µŸd´¬K‹fq.’°µ D-£H¥Œtzå{nÕÁ­ÁªÜ»¥ ÎÊ5b¯6¨àD€nušh­ú©.¢K¥ê¿ÊyëÌrݵ ®/ÕEŠH¬×ˆµ'uÖ)àTÆ9¡ê\ùCëQZ2<ëH90ÊÎK]@Ñ ÆCº·¨i‘ ¤¾Ikû´ÖMÓ(¥ö÷÷Ö‹/Þ½{'"?»·ý+|÷η2ƒ_!è‘,?¿@[PÊÈóÙhátcPOmª˜éJOø¿•„êú&d}r¤z´D ¦¢a \{ŸkHbÉH^Ž h†‹HoÎM? “„tu‚¦ºÐèµ{wq¥„¿{râq«[·n¬7oÞ´m{3¸®ç«Ýߗ͆bËqµÈ3ÂðÄ8**”_û£†ð_“ëŸ_Z=Ëã"ý)3 &grco8Ê-åó™TÑÓØbZ!k¥Óë>KL)ÄC!BÿŽ+Ã-©.oôø*T5¸ãF®3£¸¤ E¦4Eq$ækr£_š'IŽ)T^Ñð™M&ZXmʹ´^›fáØ©oÀ©3–å¨>fÝÈâhÆè2û¡S®š¶ÞÁ¶Þ•±„ £W.iœ":„›@ªÔE€ ·Ž€±eEÜÕ­ƒèB5¶R°ê3ƒ€ž ;ÔñJÅÊ¢?ôà!rÖ]}À_‰êUEÀy®{ Ô•TœŠÇ¦d ±B~£/}=õðsoPŠT"†~%"lZ¹ag¸é¥ièJDÞ¾}ûòÅ‹Vë[À?|øÏÝ?ÚSÊWf‚ga‰•rv89B©LŒ¶b ÚšA¡PúY—‡¶eƒº¦n·6m‹›&…ªÒžÙE/õiT«±ª­$t^‰ø1´ ìN J ©¥+%ôì+Šf@΢¸2Âÿö«³ÿ£i¶Û­¯4çyùòåÕv웞{ííéížR)˲ƒUɬÙX'¹nXUÕͰzçsÞ¢_MOÓ8é2YJêØ¯&Ì¢Z•J©©p%±öšPd-SÓ¹©Zò¨HZ26©ÇÎÒ±NöjNËyg?—k7‹¡ÔÕ‹0–}”¢ý|é1ª™¹KÖ„y‰!²-9rÄ«úKÇÚOùëòš>rP– â¡ͺ‰2§’c0|ïMpÍ*cÛ<ª¬‚éYfûg\Giæ™M|ê`¬¹Uû{©;Œ!YFdÖBLZ#‘ ‹Öî†5w½É±Ã†9ÊjH–T—%ÖdqùŒ³›YŽšy¾Êcnݺl`²¤jT"/¬@Ô­³ãÁ„‹Švò™Ð— ÞˈN/7jH"öî.sÕ1žL1céaaž¯\øaD´~,:8c‚J¬öœ1Þë¾Pü§Ä¨^EV2¤W£~aˬdӔČõ$]H¢K]ÜŽ+ æÙ,¤µf(Îí.Ñ‹Ô ôÄ\{ 1_fQ„V†\öP&Í’pŒŠhR D¨EÜÞß¿··÷c÷¸!÷([á¶ÕÎÏßœŸ¿9?}~þêüâÅùùëÆ¾‡5\­°üp¬'uM +sÁcÄäëׯ_½zEòPá_>:úÇïÝU¶ ТW®ÅŒÒ:\‘‘­o¦ foç.èÜà N[åwG¯…ré,ÆAçQH°gYX1ú Xí4ZÙÿ˜r÷áxšM3÷3úî"4«h%ÃEè(;c7ç{YwçJèyW°ƒº3ì,þÎÉ)EŽ ¡ïÁƒ"rrrbÐëÖÿo^c «C&ƒ÷UUJ03îE¹äl×ÿÔdf'j"ýÍ[Ö~yUHù°ÀY0½rÒºÌ(– Z“eõÎê¦ä¢Q°ˆT¶/^ ÊXæÔðö‡j¼g×ÞJÉkL‹Q¦î@Nãâ°ò'˜yǘ‚åeûVö1fÛ‰ÓZ$£L×},/Â]’_¬hhXßá—ŠG_ÒkHŒábô*?¥ú Wš4³œ4 Û†ªÜ.J=îÕuº%½“oRŽ€‹€±RE¼hx›_™R—‚¾•MAžÃ‚ñ.ȸ 3Ûw­uî2G>ç^d͘­:NÊi3º°@Èô@tµCº©¡AM¥ì²âç(µ¥—‡0$,;ÕEp¢!ÒС.„(uçÖ­£ýýŸ%·Â­æ†¤Öo..~p~ñââüÅyó¢¹x~qñºm/.....ÂtÀXTk,5uÙKM"þ8==}þüùùù¹ˆüCwnÿÅã£O¶C§rд`#wedÔáêÙ¡y)Œ„šn'†¶ÎÐ"%„éHVš–q奱H*w(W+úÛ¥á “a6#óüMj)KHÖ`,Ëb8FÇbK9'W †E„),0(„´Dz¥ipÞ®†Ðþ×"A µ¦¦|Ú4ÿÅÙWîß¿oú˜Ñq¿õ«Ðj­~Íéý½jÍeÕÏ/ç~+jö9[{;ðSåÊVÜUZ9«™Ö-òèMm½’™3§ßÍBÝ÷Œþ˜$öÍ‹±S"êº,ûÉGOìf’ŽRI&ö(¬5a•ž\·I<{ÔTXO°VÀ‚Í×?Ñü˜U ?ÁÒa0ÊŽÄòg­DÕ0×ùy‰Ì’qœz ŒÌ*µÛ$±tä ÂP®ð8çúUÔ(±vEYáÕl"]%¤Í„T&ô0IOä„^!ñQòˆh¿›¢2|­F±VˆÐ³ÿ´u¹CãKß(¶”=@‹´"{D«¸ÕÄÇJ=ºµÿsúŽ¢(¡"µæË‹óÍó‹‹gMó¬¹xÖ4o[}~~~~~þáÃj¥ÔXT+ªBui¯¶m_¼xñîÝ;ùéíö߸ô݃h( K›z@(»çj«¿J@ ¸áÊ´"š ÊÂZ ¤˜7`®DM­æ#媙!Nt)¬÷7ªÉjæšoO¬Ó/Úfà*éh_ÓgI€V2:x7jv hÄ*¸:vuƒ …Ûµcf Aý»''­Èá½{Ÿ=::Úl6_}õ•éT×±ºÁ°Æ¯³³3­µˆh£×.bëÅö2ˆ¬²+¸vÌ¿C0»8>/¯±x¥í9[: ãÛÿÝHp“¡ájâz_¨Ÿè£ù0ç²ô&Àd,dõÇçÒ]-D²JÐU/½ÔõÖ:äÀ  w4ÆP¯’§Â•†#ƒÐž£ñ0C3$µ(ü‰ÃÁyœo]‚«Îi˜Ré’¿ÁSTNkd?ɨb¦ºrmŸäh©5JŸ;èQœóÜÀŠ$šëÙ3±'Ì;ÈVAEͯqdt†¡Œ [:úÊžÏè}ëAæª ¥ÛrÄÂÎ}é-$ ªa/¡ ëÿrÕÞ7§iPS…£0–ç"D:þL,ÆÄpý‹fí©#ÏoiT[ÒUšÿ„ICDKhM­ š¥„Z 4„š­ QÜ­È…ÈPE*p£øP|t‹ß!•ˆ"!rÞ¶/.šgMó¼i¾l.ž5í—MóAë³³³³³³ðÚ ª5Ðպķoß¾|ñ¢Õzø§ïÝûgïîtî¦#@)Z#mC¡E…nm¤“±¢± ìž4IEP¨E‹ˆ²‡%Mæ¬Â#“ÊŸuen4k/uof EÜ9 feTõÒõNÈJSxMßMlŸŽ¥^†bÅb5¾¨‡‹=‹ú£ÁAUbµÛB;žÑAX¢-QZkò…ÖÿÙÙ™¸²Ayøð¡ˆ<{öì$ºž¯7oÞ$Ö½ý¨Ñ¿k£¬Ì>QÙqºòd1·ˆîäšÜ¹»+I!¶þî·ÄŽ&&ds겉u®Lãù:ã½\è´FžÌ^/ I ´Ý€5Þ®¤È @‹hÑ”VÉFËF©­¦[²QT" l(JD)(á†"Ô P">Ùl?-¤¥DNZýÜP´.šçMó´iž5Íi ÕÚl6cQ­Q­³³³çÏŸ×Å?qkÿ/ÿäÞÖȲ·€²¼*eë÷œl•A¶´©-„¡ÄÖ`dJ‰hÛŽt0-'‹€bc¾%x4"JYÅ+Z&ˆ6‚ðzÈñ´ó½5bÕ½I{öìñãǯ_¿üÌ£G¿ðíoßÚ(M݈òyxø“—Ço×mæ–æ%å{œ-^”J¨TÅý4F'm$ÔZgË©Ä" Œ|bãœø%Ï^}ß(æÛ52-õ›ö™œ0e_Á—²í™Sƒìl¼]“ò׿ZÍöüJôaö¬…NbôâÏ)3Æ  ¬ãS²-B-`DI+‚/ŸÖd½ÒB\öP˜ÓµÂ†šÁ3é[ b …h 9*Ž~6×=bÚèauÉ=ã»?¨ê„=˱•çÆ{ÕHˆýÈY€n@ŸIäýX\°ÐK¹ ÙŠÒ[akXW"$µB«E‰l•´"­PZȆ0°Ô؈€T(Qz£DC[%BQBQTP6[üèvóc¼¥D”P(JämÛ¾hšgÍÅ—Móì¢ù²m¿lšó¶mÛÖLþe¤âˆS µÖ¯^½zóú5E>Rê_=>úîÜ6õ€¦¦H†¥¦4 þ %V£*´¢˜:C;hM¢Bñrˆ¢QÅ‚M¦aÉ[š¾dž-ýÝ8TgM¨Ù‰h¡¿÷ OÔ ô•uÊäÌ-ó;惢ÌZ‘ù4æÆË~òÀñ©zgÕ"†àBÊF¦=ø…Õr';ù+aYÒ©5ßiþ§§§Я=z$"_~ùåuAð rþ™ûjšæûßÿþ“'OÌ|r°ÝþÁ?þÎ'Ÿìß>ÐJÉû÷¤(ˆî$ΦiÑ|]¨Å$ågñêsnÖd¹X|‰3RTDÆùœ}€yA«Ñîl¨ŽH?éÎNàk°¡å‰b½ç`²¹¦Ò @C(•Uù(¶ çÄÕוZáJV`‹ GÅbvŽB0ylxk®2aˆïzQŸ0Q¶˜îþ“üéR”Nˆ©Ôײ7®~ì©ÆSj“X\­Íš6Ïh†&¦¾râÂ%uFÍ>ê*ú3eãœ(?þò¶:¤B&jIc[NIB+ã» ËX.Šx^4&.wXO=.mfByÀ¹‚XD&˜q‡FÝd´ŠÈœáž(‡a LáÙŠ(HClÀ ¥h¥6¤¡7"-Í ÄF(” DŠTJD6¡‚œ“ʰ–( –±¡‚ØA¹µÝþävó“¼¥ èC äMÓ>k.ž5í³¦yÚ4_6ͳ¶5ˆ§§§á…-ƒjm·ÛTÞþþýû/^4M‘ôîÝáèðPA^•Õa7zWöOC¾2ì«6àlšÿU-E%¦²0ÀP”—ͧhçl'0*ï†ce :­À\“û"ÍÔc9_] e½>ÐBG[Ö y‹@n²ÅèÌe¿ÌÍÔ¢V8‹x²„‚¥v7Ëñ`g·­8 • =Ѫ»/«ÝîÞþONOÞ‘·oß>880]ñèèèÝ»w×Ä|Ð\ÿØsó‡GëäääñãÇŸþyÛ¶"òðààòÉßýè‘ìm¨Ö”ýŠ ƒ®½ íì•»f» ˜(Œ·tõ_~c”Š«žº+dv•Ç²Š•ñ;:½D«°—ä=˜Çó’}³¨(©9¿CNFX°*ýðò 2v‹§²|²ð ‹9SP ’ÛadÂ8l@/B9j©ÃO×2°¬§an¿Â²Õ­ˆêÎpwW¿Îy'F:KÏÄϼüH,@é/˜Â»'®‰• ÝùžÊ‚¤h³DNZ&ÞÝÀB)RÁŠeq±>¦¤ôq’XÈÆµÁ2¸#:åò±±Ûµ¶bÖŸ±0Lù‰Hlé–ßLçÔv¦”ð…þž‡e1,j¡P [SË?Aƒ@ÁÔ JK(a#¢€Ö¢QØ!¢¨m¡+R)Cp¢*˜ƒPìߤ·!͉@¹³‡ŸÝnÿ.HÐhXðUÛ>»h¾lƒj=m›5@ìÝ)°ÝnÃòÃýý}’ÏŸ?7ÈÂ/ìíýÆýûp AkøT&ɷ髯 –Æb‰XöLV§ó.­PÑbRp¤(m²´A¢ài9•4¶6Æ P,1KŒªŽà`a]*@"²5pÐY`"‘Ýæ@{–¹•›éÙ¼*+biˆ²4’Y1fh…óìL:–+´Xô¨–&:.–áéPÈç­þÓSq¢W"òÑGÉõP¿ºÑqùòå“'Ož?nþù³‡‡ô“O~âèøB¡Qêªh…–‘V b¤Í@çvÌ*9—yÏŠ ,¯0¿*;#@ÌÔ£a:ü´ë10¦AÍ KSº Óèe#ÚÏ0-[¨íIœÛ8¿®eÀ]ã>uqGã…«ÍUô¢(g÷¡Ôæ?rQ.¥Âz;e':£b(›Cª)$W´Übõñ•*nÄÄÁ]ITÄ\ÀhzÑ.³àzHšsÓÒ—]ÃŽüqö#+Ï:…|ºÓ`V›–°4ä_ˆâÛ1i3¦«„’èܘLƒü 5øºÐœeAf©wïÚ]œÝ\ߎŽåËR^ ™ä?èS\öP†0бKºZB“Ç·¢6Ô-,"³´¤RJYÊ䉂\dcð)HC*ƒÑSm„"4ºå[%Š€SpR+Œ%ZÐÐÒ—Lq" 4?Q6£Ä!p´ÝþœØê<ˆ´š/uûåEó¬i¾l›§Mû´i^¶T˼îÿìÑÑ?rïîFDCQ~C¹ÇÀreWÔPD¹êB1¾ ÊNPV´ÿ‹B«ue‹µ((S]h4ÇzÅáåWæ)ªžû¬)_¤7 ù¤ öJóŠqò€ïÏ롎Rޱª`¤kiôYã9 +Ø5Ո̾уn낎­'jÑ º[hƒ4bú®”ð·?|8!ïÞ½{ûömÙn·ÇÇÇoÞ¼¨¹]2n5æXÜ7ÿ¥µþâ‹/?~üþý{ÙSê—ïßÿ{?þøøàö¹B³A ÕZv"4ÅpDEØš¡m÷ˆ»±ãÄäÊ™LF"»å¡L]:YˆgfÊ]/Õ f.ê˜ÿ1—j×ÄëñÅ„v:V ¨*ØÄ¢sEl©»ƒŒ#®‘ Ü!–Ê]ï(a©D”fÔŒ‰ ˜Â<š2eõÊ v+Äre¦¨^Ùgìé¤ZÅ‚çÒl¶f½»y†+MPó`¬ù,ª‰Î œrU ° Q„UžïŒ½¨:•¢ —4CŒ,ÿýmÅ"Éa[Ãa†Yý|˜bÑS\kcÝóa>ãî’ƒž]´'*1XM9å ‰Ù…ô}Ê@ê*Ñíìð´"ʉXC¨J¨@›kÊÒŠ½Q¢S¨ ™ˆ0ÅqJ–Ý@ÑæûƣОÂЛhàà¹)!Ü@D Ì1!µqWeð$*BDÔ†7êáÞÞwÄâbiÈgmû¥ÕÕj_6ÍMó²míöíñøøÑvC‘Æð`Ø4ð“P l檼"–‚PL™¡í‚A 4,OȾá!æÊîPÑbdö QKHc_hQ/[°hL­Âéëÿìy}hI èh ñ:GÄâ@Ý“€U€¢SÇh3Áæ?; ª‡t¤¿CÖákñòÔWƳª Z9h™"ÏPDëÈbäÐ\C‚#ÅôjçCèü½ÖÿÞ\üÞÙW ëJD=zdX~×ÜùfÃXgggŸ~úé§Ÿ~jëãíÞøà<|¸ÙÛ¿PêB¡Uh DCµ­@Et Ð./c‘b­X(w½£Eë_ÏDÖØ¬êˆ:ĺ{`S|x¦&ºÌ>”Âëš´œ™œ'.}»ßËšQÀÉü¸D/b ,‹Ò2“0BZ$uõh“z÷ «Ÿú£] X%§ ñ~ C.Y‡^Æ.ÉÞ2áys4äæŒ‚™"œ‚u‰µêý®Äô–ñ,êZ ÍãÆÖ&|'ŠT/¦®–¥ xRŸYEgÒ—Yýp‘¦\•'j–b]³4$»Z'º× ¼‹Q,L2{8¼ôA6éy'ÆP FƒX¸n駯…\«‘Yà«×ž1>°r2ÜE•Sô†%zF°¼µ mÄÉéš Z¨(š4–]JÄ)[B(lÄãS†QE*êÖú‘,ÇŠ[a'BÙu%JpAQ¦ÈK™oR‰%C)sjÀ‘° Z$"âÀ Q‚6›÷÷ˆ; @ä|ØòؘJ@£Æn€ eXKÒreÃP¶°È`VæÀ4<©Ö\¹²A±[lXN“6Å€1wtv„3Êh ›Á–§ÙŸ»ý6ËŽ¢Ñ•w5€ž¨åž™r2n¾±¡¾ƒ¶læÍÐ×S\±¤,µ£&a´ ö뇵-vö׿˜Ö‘]é'k±$ í`6vƒñ€`wó…þOóo8( äo¾O‘ûÇÇ{{{"²ÙlŽðƒDy7¯¾Þ¾}ûøñã§OŸ„î§n÷áÃïµ›ÍÐlT4@ Õ*h†h¥4E+SCm$ôU$uËé½ó”˜‰Òüü³ðvGÄÚÙ!SHÐòp9êâ2ϧ2(çôhBÍ,ížUÒ¿†5°!%<b€QÎŒ6l7¢Âª†! ¢:ºãÄúÍ…ÓÍ zV, WV6ÈHÖZ‹ûÑh§ ³F0¤§ô,®1!çXWg­œøšlÉÍÖuÎx^u½z^xŠަÔJ[NÄd¤¾>±zî­lÌyD­è€dLæûÛÔž2Ð9#ìãÚ‹Žàh;µaà²zý¹L?&Åü]r9b§økˆM¤fnX}o6ºNÅõ¬à‹A…ÜsTeĪE¤µŒ*›Ð+Ã!Œ¼&µa-Q6ѶP lE -Ê›`I^Òˆ(e1!C¿ÒŸŸV0%y¢l!Ÿ©’E°Il¢•ÐR!2ȼä9 J¾õv¨„îS¸èÛýÃ_uȤ%DØÈ!SJAØÚj>Q„*—eU /‹gy7s‘ÝN,½¢,±ŒöûÁ;öMˆ½®»%j¹¿-3È©k)Mz±-eY€,œ£ìai‘ÊÑü HC?V7ÐÏØ˜§WñØŸ]ú&ª_U/°œ±˜ˆ™Ëaþ¯«óAóíiœ ¡á_ý—g_ýí¦Ùl6^ýêÁƒZë—/_^÷|áDÂ"ùìٳǿ~ýڠп|xø§<üöÝ; Tc´®”jF¡Ò@# B hÚÑex”iz©œêÌb´¥«äÄ¥ùz€ÑNQ©UtÜ+ËÇfÔÕ 1®DÏæ<•† Gãz´ŠÂ²¢eQ1ϲça˜ƒ¦– FÙJ¬x(¨g”@®’Š_ µõt=Zͼ4ai®>$§â¥Å*ã£Ø ’5¾ Gµ: *Ô Yñcb' 5EšÒÅS{G寮>½ö×2#¿Ç VÕ…r´º Þ‹Y‘×ô¨1,‹l#ÕJ0A¯jŒ°ôs=ÊN¶™n†\al—†ÉdlF—œ/ Á2´†qÌÂU| 䉫˜k°à Kn“ ¾3cIÈ”p¡/nª=mª ;76 Q¡cW™-´Ö -¶€B#ŒeäÞÍR½µž{öŒ¬;­M!”9yKàRN*J `d~e¡.1,'e@±±VD€^y¥AˆˆœŠz±áiܧÁ‡¼Û k„B–óexWî €PB-Qli!àƒ+šÚCh1•p=˜Õíb¹Z°~µp¨°µa¤²|½¹¶W Íaæox @ìS…IϤ٠™è#Sn0€&ǶN!«+ÄG¢z:ÁB…n‹Dofm“'ˆ.}òq»ô/ÏuïÐÉ‘NÆŸšÚ!_¤P;y÷SÍëÃyøð¡²¦››|ùå—Æêî¢Úõ«išÏ>ûìÉ“'ÆôŽRß=>þ÷ïßÛ¿Õ*\(4b@+i ’¦rP´’V¤A‡";rx¹8VæÆœ¹M˜¦d©Åèêš¼2 ÃŽ.u\X/ÛAQb¹™‡§B4Ô¼7¨0Õ£1 qÒ|Yúhöì¢|ƒ^1ÏŒ¹tµÙâJ~9a6ÆÈ°@ë[¢ž|>Ou!tIúS£D2„*i­‡ S;‚J­<DS [™ónWÇ𳄢I-¢œº¶Ÿ£“2ŸÒqìy¬‚²±JÄš6eÊÅÚ÷ÑwÖ ‚«\í‹­JH(n(9‡üŸc‘ŸÑzß1”!¬¡ \w§€­P´Ô. pÀaLÖUÊyB”ñd¤5zÛ@(B[¡w"€Ë Q ž#,æEK2s¬1qÞyÞDOD@mid”°¾Ï‘¹ìs¡¶å¡tÌ,ãŒhìÎøP»Ù5€ÇÁ [wmK/•˜÷¼H|²Ã3TïuV„x r“nÅ ãÀÔBe+(µWÂêİtG¼ê ¾ß==ù\ëýýýããcsGžž¾}ûöÚM\ß8ùö“““'Ož|öÙg+ü‘½½_½ÿ+µi€ …ÊT 6‚V©VD‹Ò¦0¢A‚–V‰›?Ì(§ƒÕ ÈÈÄÁ•Q)®¶?¦\qªå®1/Øfjø3º¼-$‡Ö—Nò–Òs!HV«yÝk:Ò•‹¸÷eZzhQnP1}d¯…“%«£`û€êq½Ko×øqMnóî•5¡ÿ´ªì(‡ièj¼–¶¾¸$ñMÎkÚË\z8·+JÌY»æùTšwbʤZ#wˆìZƒY+ˆÌ¬¹;å4böY1zsÝf`b{æ¿¶M©rLÜ``¨ÉŠbQÈ@tyåãëŽMŸõ¸äø•'­,‚-å0Uój¼H“–ÿTõ*b!|¸ WËظX¢“/£RÚ¥þJ¤¥¨>gG)»ïh)<´åfFǪ<Œ¢„t¿ŒM¡¥ý„ ‚Ö^F2ÐÏÆ”4zxC³›Sðq©ÿXf–rrõÏÀ—jûãäj-P-dCÑåëö|E¡x ¬“»2[âʲ“Dw.…tÂXZ[ˆJ[B-"åi>ö ÔÑí#pÆ…°mbþ0OÅкÂ?è¤àk–\š AODëaa6k@,Xùwû`¬¦C•z,‘ýi-D¬0’¦îæ}$°8†œÒnhÌå0 2ö³W*hú¡©´Ÿj‹gÐm†2XòE£ÿýÓSùøãÍ÷÷÷÷ŽŽ?~,7¯]¾^½zõøñã/^Hî;·oÿêñýŸ»wWCµ pÕBZ¥ZàÒBZ‘Öh·ZI hmŠI*e yÓC&bñ®ù²º($K†VÅŸä®WIE91œ]+þÀD˧zµÊËf,Vœ©ê£Ðö”³»ÜJr×}¹Æ’3âÂdaùtO× 0Âî¯*•O¹@ËQO÷ 3PQ3 » ¬w9¼Œ%§z–Ytª…F³¼ŠÇ‘€è¼ýÆì ÅÕîØw׎žêi¬¡ž·D\ý\ÇB·Ü@[tÉ¢+ZD´V΀Q²Ѐ«^tåZJÙ²9%Ò±vÏ3¸:?ô²È‹Uj‡ã|9?5 àÊ! Ó€=4—#ÿðÙFý\£EÕ‹eYW ¢Ý‰à--¤e]êZ+Wo\­6”-´ •pM4*ˆ¥n¹ú?8Q­ŽVfÁ QYÆ2B; JÛšJ¡¹Qk1hßte†è¬QiÔ”aŸ9i3¤-éÐLKÔrX&"YÝäiC8‡„bÈâÃIÑŸ™í²WÿM,™KÚN6™ÚBr‰#X94ÇK¼›TC‰w¯þN§/ïõñÜqÔݵ·Y$54D„š\’t 4OÃ#àåw,¡v÷5ñÈJy݆Љõá`Æ 'F…1VÔÂpâc öE‰¨_…¸=×[RÓêˆÙ BÇÆúŸ..þêÙ€>úÈüöîÝ»ÛíÖˆˆß¼Ö}}ÿûßÿôÓOÏÏÏEäÁfógŽŽþäÑѭͶ:Z%z³¹i•Ò@+h­Ü4 E´)‘Zˆ†2Ó‹-Zó·­Å„p9­QšÌŸ9q^^;Ôìl;4ÃZªÔÇ_dpr{¤k¨E™¡"Þ6™íä²m²*™çNèN#B¬1:ŠÉ0–e숽“ß±¯¼_ì »ü8yÇY憅ÜŸ8ê%ÒòŠ1ëœ/EUh.³¥ ÕÉõ¸äüê9h©kÀÚ¢ÏSÓ_T»vŽŸ…Æ3Õ<æÁŒ_Z~aªdÒ1öeVÇióf¬"Ý;¶@÷¬Þgz¾Fº¸¬££R\j4^¦'Ø­ tÀe—>µÃ-,¿€ÓƒŒÓkƒÑŸ…ïÇ5ÁÌ ¡W¶Þ/­#:–-L³×. ÚÄ`âA §îˆŽÀoÕÂÖTðA ›ÖtBætn®ÊO„4JðöàF-Û™úIX§à4¶ìí@ ÛB^+lŒ>—«Ô"Pê{‚/È_ ?ÖÂFŠ5F¤ÀÖÚ9;ˆ*(ŠlhçBTÆs°µ€×¨6д1èÀ,Ìr î®F²vY¿D#Öªe‚\]¡³Pt?ïĶü‚JËn5`U“¡Ñòg§1Ì + ª/{CÌCoæKtßh^Q˹"ˆZâtÓzÙ£K©ã)¨p6æPÞQ»NmiWBvÿ¤ûIMþæ‡÷ypÿþÞÞžéi}ôÑÓ§O¯¹éë®{õîÝ»Ç?}úTk-"?sëÖŸ=:ú¥»÷¨”VêÒÀ¸ J Ī…h 5¬+š¿E+h1:w µ)6´ð%ü ³ýk/Ó¨“½¸4t@+'¦pŪ7,º¨ðBMŽYÄB³ôÑ¢bû¤"Ób¾ô\íÙêÚ+Š¥îÝ@M§ânW¾_bʯ®Õ‘õm.«;öFæþ{Ñ›zmØÐ ¯ò2Xýµ¢‹H áÂñˆ–t)£Ã9}×=³øýöϱÕaåKBBE·¬Jœ3#‡„úöÍŠ@ìBëš­;“ϱàL™Øó G»œÉ +Q"C.dIÿÑ> –+Tw9dJÐŽáè  º’½ÞŠÛé8Q€…+ÐÃIÍCPrxÚà3ú±ä)Ëü¢8HË;0X&”wå3ŇbùMîrh åç{–TæN,ÒJHåïþ¦È·€ïh}Ð7FðQ "‚Ö9ª¡(°éHŸöþ»'ª=Q+ ÇÝš8;BÏ~2𓣕9}wÛ˜ð¤'[]Ø!b°´,Âñ–1x{yÝG®}¾gáK%º«Óì~îÔßíªnuji¡’N^Í]I]9…¯@TËËv°˜2QËÒ;À+ u„*qø…Ìha‰×i·ÿ´ õŸžüÏMc ÍoONNÎÎήa,Ű®9°Eòùóç?þÁ~ " øûîÜùµããŸ>¸ÝBŒ4»áR5£{eA+ Uª…´-  Ñ€ÖÒ¡†"¤P)MDcùqÕ%ø:ÇÜHøIÕØ¢ÐU›–%Êûe¦ú^ÎÌD² È×3:ÖC2Õ%3W¶V6ÝŒ-Ìšþš¼Ù³#ýë1wOîüËw£éåÌ>)¿[Ë-`z0NjNŒ¦½Vf¯5 †Öîàë²ÌæýœS0ÇUú"§F×…û$&N™£ú]š²˜d3iMän¦é!|«ÛqLzâÕ-»•‘Ml¡xq±913G`ÔÓ¸`°­2zwO =¢ } bëMN¬ eõÙ%»=©«.­‚¬£bMk¡Êžiãô+-E ”/Øóö6%r¶ÚN¼Œº¥m:¶„êèYý!é2†ÖŠ·wˆ•òx¤2†aV°+œ²ý㦵´‡-‚‰j€€ûâ‹z¶Q?GýS-Å3¶\=ý&81vz´MœÔ¥…¯Ý‚7QÁß^mÊWü© ÂBð‡!Y0:5+Gh ôÂÄ^ŽsSº'Uæ‰]»Y¼Ì)²››² ”–®Åƒ%ÔÿP{Ö•„å‡bŲzV‰Ò\Y ûqÔÀHïQèaSGÔ²ovO=¢–ýIŠ|Ê’…`–¢sÌ$IÂB[$ù½¶ý·ONDä“O>1dÀÍfsttôýïÿºg_6VÓ4Ÿ}öÙ“'ONOOEä®RúÞá¯ïí7³ŽoeeÚuW6(R´’í0h(SBHe1[ ,ÙX.§¶fð4½”¬WÏ_–£EQ^ÂE/†fæ9 ¦8ù\Q‘–°ÂbcSëIÊ•ùü>ú"˜5u˜UŠ„`î½pãÿÒ'õ¢`.kºñ÷ÇtÚœÍ`Ã1ZrÁõÌ}P\Ò-w4=ÆyL*0õ¹#¨ïE©„eÀ¯¿|éäÎÏÌ)#ñ]®‚UÇ2Ë N£ƒwj_Šç1o¢c¿újÆ<ïF ÒO³W»Ùi`u‹ËO\Ǫhd: R7 /ˆ’«Us›ðds°+ ;À3t\×´5SGõ·’PIH¡ý¾Ç>VPÆM™‹Fîfъװ 0"lµC DDZëuˆaÑC`tØ—=z€Ã£!®Ÿy v¿ ®=°Plžék~Ðß/7Y;ºOS-èQ-Ï+ëÁN‡"Èÿ‚ÍcÅ_Òí±ÑùöðL àvºN¾àÑbY–\DÇ/CC¡Ä4/é§æÕD-ˆ'À‹Nü^ ÞÍÐIsY,À`gSƒwšt"ñÝ? â„òÍ…Qœ2—3 ”@¦½“´ ÉV–*ñ>Œ^Ú_T7£Ã“â<.á5«%·ÃRAF²èP-««sh°n ”ÃPËÙ ×Å–M õæE ÿâ»wgäáááÝ»wÍÏ>|øòåKSãvÍÑ«ëŒažž>~üøóÏ?ošFD¾½Ýû³GGìðÞVmZÈ”)lB¥­T Ñ‚V)mþ0ŠWÊ€Vª¥PØŠP”,/Q„P´¯„ “¤¯úxèN£ÕײÝõ€«¥“`÷[[ÄÀrp™ 'f¤—%î[­¾ì’>Ãë×sæ…±cîS¬7 17¦çUhÅ–ºG^ÄUŸ5§ßÓ@ñ å®Þê0L—»žê2ë£H¬9¥`M¸üê#ŸJGãi!Ų©sÞÉ0aäºÈáYô¢&5Ê+<,F¶ª|¹ÈT´š•7â4°€bŠ>~0i̲ûúðD½î˜°Š¼îÑòZÿ:sëÚÓ0u›È„òó¶%‹k0—í".›Øh¥ßw¸8pLh¼å ¼ÏÂòðÏÂ" ¤ÏA+,%”M Sn  M%Þ,0Œ :ÀA:mñóÓ wv~á7U¿øW98IÜé|þ‰ð‚cÓb šDå¤åÝ5»TŸ•è•§¶?Iý‹ºo>Øy/BQ-©W ¢/¯´&ˆZþ}+ óÊIn[ÉžÃóÊ,ÕUAvå4°þ±2ÐÄ?#:±ùލÊ =f–t@!ÑÝŸq'„÷@tŸ­ Ùl6æ\•žŒÚnWP\/ÔhÉ3wØLÓq‡šèkºÑû.…Ó¾³zÏáHÑl9Súî—Ø8iŽI0Z>r‹Œ­4k¦e9vpµ\i"Àzó'º¯¢îj@[Ny¿ûÞ fW£|]Dx’9쌹?W­ 0 ra1`´|D/Tªªç€rÚph)8áé¸Hä˜ §kfFPéNf(~qåÿ“²F§ c- Õ—•Ñ·f:ÜÉó„kPs,ëU«.‡\Þ= « À©ñuOý •M²H}î†L_ ƒŸÐÃCez_­©xo“0•öìÞ o¢›—m¥5tƒ3òÓ~þD€×tÊÙң›’€%¾<Ð b‰7"âeΕˆ¦—b—6˜¾øÔ uÜ• ué+,Æ4¤Ô9gzÒg‚çjóóºýS·;ˆèN†i@ÔêÀ6¿þ÷/)Ô/‡‡À@:†¨%ù™f| Éò²\þ2,õŠ^÷J¬¶;- TÑr¦ƒþêÈ@{«»»`/Ý~GöžLBWâØ[–àå@ ÅåDéI§1oäü©Äñ-ùNÐ œYÈÕÈ QËð?<9ù;Ûíöã?ö­uppðêÕ«ë)W—ÆÉz÷îÝãÇŸ>}j$Ã~vÿÏþá»÷D©8(Wm`µ€Q¼²úVm‹E”j­æ)¤Ú´¶‹@›ç«”cfm …byŽ«µ¢x‹ƒ¦5âÑL~©€Ñ×è•·ëFB·…»o,Œ‚C”š4“K4# !k-Z¥·`g=v^1TM Îé×Ï ˆa!ÈÅâ6[Sywjësï·PÇÍÝ2Õ-U¸q_e¼‰;Þ!á´Ž:I½(E¼bŒT²`¶œ¿>JA¹Ô6pݪ4Y@/b©/…¹Å‹fa;¯âL­‚ßÅnMýÅ+îQáç‹¡›`U›lÙ7PÎéƒiNŸØÇ#0¿/;ÅúN=¥Ð;¾¯!„u¿¢z¶åÑKÜKúj§^‡3dW™Ò@‚hÀhØŒ5/0È—`yÏ»ÇeFûË€ÇttoÌ<Ž›ÄÿÒ×%º´“,Þ¦E<7ìî°ƒlTwn”ö¢¢ ¬ê ò¿n6O(´mCTÎëY)øfã`s"têëÁda…r§çeih!QË”ÏuªïÙʼchn¦*°CñÈ(}Ð}ô#_HËÆ2<¬y³šñ4¥‚-hDÁ:û™¡ÞC”ª“¢ï«Sú=ƒzå«.Å vjñ~ÿÔݸuŸ´ÀŸv#ÇMû¡è;\q¡€ªóÿ5Í¿ûá½΃"rttôúõë¯Qž÷ºíùóçOž<1xŸùc·ïüùÃß¾}{Wµ†o¥ h…VASh<!"h­1s°œJh¡ÑjÓ:Ÿ-ÖˆÐöÁéæŽ†IÑŽhº-5íA÷—)‚\»íhëëšÀbKª2Îñ¬ûÂ%´Áøz‰ J*Æx«<–%`Ǫlý¥pOœbõ‘k2¢y@à ThIFÏ>(wÍØñÀÁò~Åq‚0ñ8Ù›'à§\›^´Ê*Àym’˜5¹bñ=Í.îauwœ*€“Á–k³†œË©4ßô¢y`úôÝV‚EžG E¯X=gEIiÅãl/A +öp3®ºˆCÒËÈaô0Îèv¨U˜›våý¹‘Áj²’õ½¶NZ_?µWP)õÈB 8Þ.ŽŒ¹Ü;a ‰÷O!³ ãfu|u˜îÇ ]0äÒf»PºÂ7 •w÷ëè0`Å0`LW…G‹:9÷<“¥ƒ·ËxÄXSs€¤8· °…·^òüä¯o·?£ù‹ÔÈ}owD÷ÄÓí#÷zU¢µrlQË_«êoGÔê¨R¾A¬8ÿüó'OžœœœˆÈ¥~õîÝ_;<<ÞîµÀ¹R-¤qƒ‘i‡´Ã"´JZÚ¼ï)mŠ [‡ë¶mŠq]nì\`…ÛidßÓS‡%Òf~úÿÙ{—mËŽëJlÍ8çæÍI•DP*zƒÔ«ìaa«J¥r•$€?Ä»ç¦ÝwÃ_á¶{öð£a—¥²õ²<$!$ ˆG"ožÓØ;"v¼÷Þç^ÐuG•¸÷œýˆX±b­s͵`jÜhÆ›ˆŒ‡võ’JŽ>Víë½h ¶Uþn­ 1Çœ¤ ×2Éë¹°GC½ ¿(k`q&¡ٔ­§ÂÇúdìºÀKÏÍß™EÀ¨%]Fè›Ç‰…cÎù:“Ý#ä¥ñ#½¹\EZ~ ²k¿`§-5­}î7òÜ«MÖFáæmºÛ*" ø³Tèž0©¯8Ëÿ´îïÀbÞ=¶Î|˜yÓçÊ#U}șɢӻ–0r  J$²8ÓGìCWÞ 3D Dé¤ïrah¹v³e´•%ø’%€)y …¥L)·°+Š*¾6j+€ °ÕÀ)íôvˆSˆ¡ ¿@ZtNÀóÊïeèU‰-kÒ2è缬ÕUÂÇÁCv<æb5~­Óô d_‡ÕZuoFHdùOø{ªßÒ—×éϸyj.z ô 1Û]ÏÄèJÖMùžo¥ž¢–-Üó O+lîÄÈœü“%jyBø3NãŠBmÃAµ„#ϹÛ±W3‰Ê“$ñ`ÊY~i^ [fhŠ g®–8þœk5¸| k§iðqz_¨h%-”æÍ'OËðBÍ8ç¬×¯D´¥j¢–8ý+oN òß|üÑÿõòåù|v•RJ©Ï>ûìs‡^ENøPHëùóço½õÖ;ï¼s¹\DäõóùŸ¾ö>}zVj^˜RAQ—“ù‡)\ + heºFÐÕŒˆN¦`Ð:Ÿ‹€§“@&_BMÖW-‘•Òaã.¨²W®ZÝyÏ[6ÛŽj W%’uF»=Úqr׻˄ozùpÖýÜhÈ ûsßìÈ<*䘉àJ¹« ØE"¤ýqzRå5ÂîüŸ ½uû‚e?ÍðÖ‡ò]ÉÐÕ‰`õÂèª;Ë]ž‡öÃûic]0ÉâH®´9®‚€:[=иrœÙ³´Ò%Y#<Š~UýW;¬f¯¨@«ÜʱåÝÐ UÞ)G@WOg’8,]+ œk4\=E|+Úæo×i#RíïpJâ™ÿ‡´IUí†~üØð‰>?k kwëÃ?|óÍ7ßÿ}såoß>þ£×^û–©Tê…é'LV©]‰+`RÐCWÚh·BLSài¾en7„ÒFµ"J]f®ˆ¹SêÜ|r²½;=ôÜëʬö§jÛ¶®X£é3^çØðÑ6êÝÜo´«GI‰ÀzKg+½¥Ý™ó™°^úʯ1QÇâG«ˆG¿Ã®€ÑU¦ª[½¨_w ß>®mªÛK «^”“u2sfû2ôöÏÛ[1òà1ïÚæŠJ-Øn$Ühòy´¨wx)¨ì̈·ÈÃqÃö¤áÇy¶œäT‹%­®Þ{N~'ÇÆªöÝð e íÆz}A…1½é ¥XËU|£—}‘™ù`ûb@’HÚ ®;æÆ=ÆJÃòhÂ7wù±ÚØ Ö"å)PŽÔ|DÈŸ²ÇdÍ¿S2€²¶ãŽ›}R„÷ŽðˆZ½fyx:bÊBÔ ÉYNüÚ]µ$ÝÐ+¯•,@Ž¥ârV­‚¦8Ž\_Û)Q€¢ý›‘ßZŠ2]©éü2~çʹ‚Òâà•µ 0®¬“3oöÎtùÏÿáCŠ|éK_zòä‰yÇÛÛÛÏ÷êj?ZëgÏž½ùæ›}ô‘ˆ<þ£W_ý×O_ûÊ£G¨— ÁEÉ5)\fÊÕL¼Ò ¦úÏè[MŠL E€-Bˆú•±J[õWÓ P¼–£F÷Êrî¬ýÏÖÛêÑîƒ)í>ØûfÕ68½QSåëÛ`¨¦´˜Å{qƒ–v’»nÌdwкDj'”4r´£5¢E÷Ña|“Üõ?8Ò@¸^>¸Š-E÷o;…¯%Û»6Úã5çvè#IˆžIÂø©_’;«hÑ@¯l.æ ±âÖX¡ÒÚ¨GbÇ¢v©ãŒ‘Û¾²µéá¢S+®Êßé\rb½ë&m©%§„¢ÇÊ‹Œ±¼[žsø˜=ÿÙ5Ù]ñ²>é°÷Úåœåý"´ÔÜî÷Œ+Ý"U†˜Ë„P‰éÓ>¯Q+ìNXl96)ðQ¤4Žv) eþ“O'°jVzÕ'qÁ üj@8ý# gЦËSkÇ=ŠP[2Án„2ÙOiÈ¿Åé-òŸR?µÃÆ@dÇþ§×EÑI¶{£áˆZŒ¶Ÿ…¨…FLKÂ"} /ñØdÆ´.Nú]–_ŠÒ§Yq‹s³¿™™E×û϶þ3 O~)úT¶C°×:P|Žì…ËWîGìoá}&–‡·6"ñá);ãJÕ<´¿7Ì6‰ þNøŸ}øÃÐú•W^ùÒ—¾4Ï—RÓ4}¾¤¯®ðsww÷½ï}ïí·ß~ñâ…ˆ|ñtúW¯¾úÏŸ¾öôtº@}¦duQ¢¡.À$2AQÉE”†\-0šëÚP®”2”+ 1ЕѴÒ0ºW¢E4LN‹+¹À ¿Yž–¹fPy‚Œ úÀи†&˜ÊÍp©ýÑAªn£1uet Œ®L#®šß7ÏŽŒ†ƒ+C/bÿH–ÏÒ«Åhcsq ΄‡êUZq|´%x’u‹œxWEÎ:`摞äÐégZ;Tl¸Ýˆøú*s*Ó‹FTó˜`œ5ÁQý3ÛbŸ¥me[å³Û"7’˜r³¹¥Æ™™4¼sf*ϰ x¹+Ù /† ¬°7Öffvc£$¾¸¤_à]Õ[q/ËØu‡Ì¢ÔèiõD¢ˆÆÕ 6Sªþéä†Éxž­ PóM‡Æ[ è¿WvCl@µ¿AÒJsµÂmi©ZtbÝ«H.œ²xʸ´kvaå¡NÎ åÊoå<ß‹Áû@•¥$9¡z}J‚æ‡3U*Tëw`O sZúp~~^‹†‚µ°±Ô¢E…‰›%ÓÂåÊ €—Ñyò‡O_ûÅÛÛÉ´T2‰š”LÀE©Id²í&‘  •Ñe‡Ñ3t]i ]™ÙÑ”I½UÍЕù° a©}¾^€Q%A«ÇÊL÷ôº+AÏ;>ºðçk <¬+gB[öô.[b`ÔËzc‰–ˆÐÆæVå+wõªF°Ý`ZTó°ÍüØ/«|üR@Í@Ãë·•B'ðX4”A(@ä¦Z@–:>ÕR±ZÎ,CO,ŽI@W¬‹ÍfÜË$ÚØPu_ÑŠˆqßëFRŒ6éý¯Ð¢±Ê-ÙƒR½ñ[í¼04RÁþþÜe²½ÐÅ.k&ð׳ø6Z¯^CzQÜ[Oì¯mÙNK(Ö;&UÓßgã/‘„ eázvZxè5ä§Â“3ל.IΟG¦Ž›° r#m{„mÿ<ÿ}€a¬=£»®^/¸'±hPðq1£e¾Ì=œÊ– .[qê¸@ZÊ¥?€ürúeȯi­¼7ÒÞàp©l¦ƨ¢ v¢Rc5µªlÒIX1fy̤¥(pucT3ÀFÚ/†Q´ SÁDε’ÊH±{å‡ö=8Q”à‚¹;†øfûBÀÉÐgB$¡ˆý‚d9n×LË2ÕŠ„ˆ†y«Ö/pO®Sw©0‹ÒCäoï^þW~("?û³?{{{ë¾óù­tÎ|;ž5MÓ;ï¼óÖ[oûW”ú—O^ù_{í‹ç󹃺(hQ%F²ýÂY…}RÊt4ŠWteƒ€™"Іe Päb‹y'ŠVŠ–¥eŒx²ü<³µáÍYÖSèÙ‰s³q{D¶åþžø'0âñµM|ˆC»%(ßþB›B·’ÖtÂZØm ƒ5p ¸ ѰfŽj3{!J;ÌõyÚbF]r×ô#1¬K•Y…¨"ÅUfìŽyÉ–üÑ~ {{\å+û_¹0B…0ÄݶÁ"½(LªZð1ɪ^ÓeãÊm@‹¤“ÚÆQÃ۸×"õèçÞÑ/hb× hP/ZCeÂâWÝkܶl9½ wûaKuþ†<ìžÞ’¼|ã©læÈÒ2‡«¼„6âÜ1£RÆL*¼-"çb±0UŠƒ˜ N®»Á¢×lÃã«?ZWšþ¦ü¨Ò¯²($xÈEä¯)ïˆú÷À/ÄÀ—„“«ôÙE¡™é›guʵÄå‡3Îâåï®7%Ã…cÔ‚,QKE…°W××o&¹,ô¨Î0ªðN“˶ t_ñªìým)àD’¢æC=“ÂæïÎ]('ÂIƒ³»gJ Lf--Ç®¢¥\Qy=ÍS*àÂ…¥“­@üDOÿÅïF>zôèööVkmX»·ê»hB̆5ð:ÏŸ?ûí·¿÷½ïÚWÎç?zõéï½úô¬p¼Ài2í†i¥Ô$rQJS.&W3ЊµkYº Š)L¶¥h±Ð•,_3‹bWNJ #ö¥Zyì@ x‹±>¥"lć…9=@F÷OR‡óÍoÜÂÓGË\ÊæŒ%‘š±§}!˜ôö}î7²Wl‘î組CW¿þšG³ ³ûi6–³yh[¥sQl3ZTî¤Ö¸‚ð0d²iZ¯laÀ­ýØ.hQm°¸çúê¬GËá/°Ë€å úäœÅD²]6 Ííc臑ûݱúŸU |§|޵ÄDàºÀ¯„bç<å~tó¼¢g›<È'6FQ…»­Âþ5 «ñM"´ˆµ©DÉì1¶‡±)JpÄ¡lŽÉýçµiLéÄÃk·ão+Å%Krš(6S…‡q¾ÄB²¢iðó[IÖ…Z ˆˆa0e³¬RÜ ò ÿ“È/A~Í€l@+BO×Óp¦…°” °Û%„ˆ²ŠôZÈxû„{UùRÖ ªÅQ˨ yà‡öðÌP§Ðc]iopàw:0zín 6¶tLäâb±44x—mCh`©Eékò,s#¥œ]qfÑØQWRJ š*Âi¦\Í`ådÍòå¿üáß¾\Däîîîí·ß‘ÓéôèÑ£ûcþ ŸåŠ?«j!ìüñÇo¾ùæ»ï¾kë¿ysóŸ¼úô?xòêtÜ™"A@v‘ ¸@ ÙjRÊ@W t…¹0pRФÂd +Ì€”ÆÌºš±­ºšW‚˜fœêrý%™ Äôù2 Ò[é,Yîª?¹Óž„h¦n×ýK›ªYÖ7XÙ±9â¼&º´aþØ#{ÐÈMà°1-ÍCFM“ëÇhVaÈr†¶!ó›e¡¤0p•´¹ZÆø9HÎÛ£ª3aeþÓZ펀!`Ķ,´ìp˜7à.èa÷³ìaEe†Ç@çJ68¸ÆÂÞŠfôÊF£zóúQ9È–oJ°Û4vš¦–!b&â`ƒå áh¡ÐÛ¡ýQ®¤â^òΑXQH¿$2‰júb ìR•LC½sg8hɵøÐ2üiŠb7†Ì/At]7ò9[š[e8L:'äv‰wg'dË\f¼#˜`p~ Ų}—(ÆL9LÝëQgš?ù_)_ù¶È9ÆÚ®mOÊ¢éuI”€5ES¢©¼ƒíY&×ÌÁÒ¤ÐÀ ã kvåG¢ ÿb*üæòCù„ö&Éë€ÚØ,=LuþŠ!YÁ?æÂB²âòÀ̓\0Ã^ïÐAPš” ¢-¥”‘¶§@É/@þ=p(ĉ¢È‘§7çŸ:~å1AQ¤"µÈ.Ó{ÓåÝËåÙ4=»LïNÓzº»»»»»óME)µFµN§Óý¢Zï¿ÿþ[o½õƒü@D”ÈïÞ>þã§OùöÖ]½  +ÌÜ+Èd$®”ÒÀeY¹i ]‰1zUÚ):Qv’†o…Û²«Áµ-0…„´Rn Õ`U"XO·¹¾nÕÙµm¸^.îsõV6 Á¬_´’jîTux„VÄFù!߆¡V“üæ Áÿ]Çßû‚AiY*Œ%áWWao[V¶éQú£u½,s!nAšÅUz›²Us·.z{fæ‚;f¾[^‘¹” y” )¸aã‹l¹Æ’ÕÂ5{„Þ¶…WàNöPzוv‹;ïVÒ(7uúÓ{ø™´TM妻¹}x‰÷™Âäc1UÉ_µjlؼvÙD{ízÌ>s3÷u[œœPýÆ:>dh¦Ãv\‚ÛMsóæÄ-ŽŒcF‰Â Å਄ài<‹4J*Úilž×ÞIlôà d@îx“xOø[Ÿ<äKGs ™øìCMòè#V­\D§…ùäyø—¯¼ò‡¯¾ö¥óéy5ZÍZWÚÅÚ!ZpQŠóW-¢¡ô KÑô´Ð4i WçÊA(ÂMSp_àÒE²]Dl_اg?h…øØµ“‘}-9®–ÊJK¾Ñõ5d\qÎË×›’ïÚï«H”¦*­úHÕ[£ôk &hÛ¹Én¬f 9c«ÆeèÆÙ­¦· 0ò£WiS/*G†G4p<î w—Ç#ƒ}‡%Ù¯Cܹnh:¯ÖË IaQHYmÔÄZ’˜²nµlt9‚=K«›ÖÙO¨,¨Â|­éV“›Ê ’ :Râí©—«¿D¾ þ†RgÄ´t ×øWp‘ð!âòC¦£ ·ƒaÑf|YïšN+ËßW ºÖ!l{*0¨Â¤´–S,ÿ[LÒg”-†±Ü_¹`v‹¦?¡„´Zø–¬g;.’Šr3"µi÷‘;Í¿QêB*‘“ùy2zðäÉ\r2HËüu*[±8ËÕ“Š0úô/´~ošÞ½Tëòî4=›¦§¶ÈÓé´Fµ¥â(¥œN§Óét>Ÿooo_}õÕ'OžM)I©ø5ªåXJ)Àzþüù›o¾ùìÙ³Ëå2MÓç›?~òä7n›¢?±ZÊIá"°+u±Ò섚DŒˆÕ57mµØ']‰hµHY‰Qm÷˜VbPÄñ³ü2Ø U®—mÐêôã¯Û¸˜Ã›Äƪrp縟ƒûÝè^ÞtÇ›ÒC‹Øvã h”Œxõ×Ç­ëß\ûÎ%;-·E^nû_Ùº&:nÁͶ7ü±ªd2‰Æîë¡Eª^4€[a`ô0üözãåÆz½aËg~s@Gî2ô Ì×7_ªÌék¥srpœuæ3KDð/B+©W—ÚŸÐB!¬{„¬¥~NZàì´·´hݸ-¼`M>=ºq׌A¹ùKÕ8A¥v¸†æClWQ’žk~>F ­¸©Wƒlƒ´b–SxUÒúyà·Î8gfQ±–b%èH¥ˆš‘N<ò"Ž>0䮣ç-  ¥ò#%úNˆuÄ­A㪹'!ýr!x2b†+Yê Ah¡r\-ÎÚ[Qs¹›€¦Ê_ ."}šKà PÅ´¢ˆÈI ? #( †Ø5ÃXbÙ[/³× ~™ÿXëgÓåÙ¤mùáå™Öw©Õ¸Õzôè‘`N§G].—÷ßÿ£>š¦Iiý»7þõ“Ç_9'‘‰2)™ZÁ±/–2ŠW˜ uj¥ôŒ@Q+¥…Ú”¡±$teMmî6èë[Ù*Bʬ„•…®61­˜Òm?õÉÇ37lW´hGÀh¯=b‹úïà ep•±Ú4åÍr×ùׇ߱Ӊ©gTw‚“pÝÛ=¨z[˜<~Í­Q4÷±v6Ì.‡Ð´jz¿—¿Â 0r—j7cdƒôÂ[aÅ‚ëyƒ{Kùm¥]¡,Ý? ^7ÞÀÐ;/ƒ»;<0ÈLìà‹¤_#€Wµ dîhäj¡Á=¨Ýn—¢îÕÁ`™,¤… ûð†}çâ“+« pÎ9+¹ÒBaþ:°Z]ß5’ã XE]V"FHÅ`kHëüM¥¾¬P¯X†Ê¨$þ%ýRÁ•ûU«ø ¤•lŒâP!&”fØÉ/RÏÏp«î¾>I¯>£k¸Mq&ƒ-¶N.âŒI¹†Ž–?ʼnü àÅ/Tš€%a g9y…„EٺŹºâþb¨[ð‘,ñà-eŸB"ü‘ÖïNAùá÷§é²2¥Ô£G?~|{{{{{ à“O>¹\."òS‚ñøö÷nŸ¼"œ¡+áEÄ N“šU“Àj´c"µR““¸LB*Ìeƒ†K¥ffÇeîÂ)ÚAWC¶Ò€ˆL²ú´é `[„©ôô¬¸Aÿ9@–ú`EœQ’Ÿ|’»ÝƒÜqvØ/6± ZT9tåþo¹»üóX’Sí€Æ!£Âumòè%†#¾øð£‡Ÿ\ìrÍ­VûgæS22dï `qÓu:þH[ÚÛ…¡a ñÖò}îÈÍË} (Óæüé3…ªë…;­²ý[‰Áå¾îµÎ>TkõŸÀúVyA¦°ª,‹rOÑ ìÒÛ2«µ†…¨h/kÈ7 Ê×>¸íœ =±2ÇÀbTÕ”€„LV$†_íýŠ© ÙV‡‡§Šy¡Î_FϪ*|€_UøÖIjWCM7ú–ÁM´¯¨ÅT„7]òÂ5*¤l|>‹×{±¤–Ê5ÉŽ´NUL™[µŒe깈OApÔ›‡… )$´%Žî+¦‰!æ¦y2 ÿœxî,CÂÂ܈Pd–u7ˆØÉ ÌÍxG×2˜ ©„”-047U±¨–PfÞÖ Í¤l'HsµI䇓m}¨§w§éûÓôÖ ÷Êýï×ný«§¯þΣ[%¸èiÒÓD™ Mí¤Ù•ºP¨d¢i/ÈÉH¹¥*@Ö ZèJ«¹ÐóóÔÐ*¥­:’½Äª³ëÙþlñ  …µh²Ó…ƒêm[ %®£eÔ_¯c]GühE{mcÞk‡›‡GÛšOă×íÌÀ* ¤T®BÁýåòÅü £*¼Qð×<¶AZÍ-)w E¸›¼üÎ_hVóÊÎSæ çÓ€Z'kõ܈Ê ½ˆžN|$ÆiôöL?Cqņ\Mô:#Ž_„+­$¯Ñî|B5SÁ”‚h.E…bÛ:åuÎ…~¶‡¢h¿£"5åÿ¦<·ó¥0Wü)S0(p¸•²êãsu¡!¬ÍÌ, ÑtØÃŒYQyÕ¢ sA¢\)¢eùrõËÏK‘¨ßÓ||_xú½W_ùæí-Ng-œ45õK͉œ„š4Õ‚^9<¥4dh™+m°¬Ö(Z+ÃZík±«“ívD-Be:7ÎW"3K˜eX3 ú]riƒi«%Â}Z¦U Ez†]R`”eH¦ÕÜëp†±Z6f8OqØR"PËÝ1,Õ&…ƒäh²RKQ‚नNŠ€(¥nnH¹h­©/äDN”‰Ô'5Ím¡ÅŠaÓÒ=&‹ j5묛@ ´R†KeXWœIX¶^ÔÎö +óÈÊžbµ€V!‹3$hÁQ”bø¢ä´±O?µX,½®'õÎíô"Öp®:Hðùh®cí…e>>«j¬à>÷¾ÜïÍŽ8TÃæ‰Þ=ÞÃA¶âFê û|¨r×lzðÖsö]ÜûûÔ!ï€f2Ñ$»âú eYä7ËW‹nƒ¸ÏJ—ÃäeÚ§)Ó\÷€ªõ~¸*ÿËFaüTxùq‹C“h9`wfmSfßo`ûLXìÉXQ T;2õpd°$â·YAY=©3ì­Æœ>ïw^ºp{°°à"l@¤rË ¥q·®ºÑòž¦~ iŸ[0V‰Çü)à·oÔ«EG-Ï­B]+jzðÇXQ‹« Ü@.P”#a%)Jø-®µäž÷"˜U×U" «e¬hoù"ìg–â5ÌzU–D’'ûù;ÊŸPîìY£‘¾R¶¦OìõgÎŒâ,No…® -‹vYÔRQ`º*šûBï˜iYnlaI9~ƒES?Iƒa)@)Q'’Ôù¬)õ¤9 µà"$9)¥É Š"“‚ž±*L3t5˱ÔêdNŸµí9HH)SQ(¥ÌŸÖЕ©:„c½–_[yûD`zC¡_!èub•Ê%¿N:VÓnrÏÙG¶’ÿBWõ8)OWß“ÌtN7¹´”Ú»Èí#_ˆµîOwe d½¨ï©xT×¹«x•Mr×W³±¤1"²ˆ€”•°¶gËÜèºYÿXp*‚„Å¡ÁÇò\|^ÂV÷]8Uû/I¹Ô#CšSÝV¹;¸¼aXØß.qÝyœÃöQðûß~CRô«,Œ•\ÖKg¾û쾄soS‡Í>Q2§ÞÑ'âÈ€~DZò› aû5™Û:€¥Tš¨dåÑ'ópó2Vr‹æé¸_HkyMDÅ‚k8'†ÿø«§Ó×ÏX< œµÂ¨çº¤»ÚOj [·•Ê¥è$ñV®F[{hœÂšãd­Ü53D-I‘Uð¿ñw I>·`XsÞêñ¨¼RË–m5Â(ù˜üS-“,2Ube×Í#¼iV¼²Ì,áL2:‰p!mYm,¡eÁvc4Wó…Þ#£mªW°Ä߀RÊ€ar: @…óÍ£¹„P8‘Zó"BS-hiV¦Qà$Z@MW0˺²å “ȉ¢:»-*\¹í Å Î"fýЖ’ km\­›Ð*¸ë§h`ºÏPÒÝ À¾Ö攑~©‘'s+št`Qã‹7‰$g‹Íyå†AÙƒ#ÜØAü(Ø mD‹¶ÜëÐñ!´)ކÔûõÂ$€•.ÖZ^í `u™b€…ÕêZ:߀…+,º±UÏ >¡mm×mÄOx@{>XÛ`šþUÌc=L›[8zdlÒ`,IAˉ áb"DF1ބņÇìRƒº^ž±§ÅZÂI¢º½â©p0t2¿ú¤Asº;Í9JXU'¤•€Òj–÷E¶·töe*èmØcâÇÏTÄ.ƒ\`ïS´Ž_ÉÙúà7o𨠊T;E"?±ÓKÑÒ5¥D¹õaø”>ka("üŒ¿©¹žÉ‰[—¿Âs îâ:qïy´•æhÕG©Ì‡ßù+½ ~Š„§H¥üg €•Á: @Rf‚•" }IÙçQ®g¢X˵Jô^Ö‰mÉ lÁéÍüL¢”ˆˆR ç›Gõ¤'‘IæúAQjj(R&€ÊÖÊì´E4‹JxRFñJ‰]™.ŒF!KD¸ r®G§ƒå¨¯¢·ØÈ´’””;ó÷ùüX=×ât6ÆáGg¯Ö»ì59p,¨ ]1b0²Ú»ad|ö¤,¡EîÅôJo Èl‘»~à?¹ëkX°c)rªË@îšÒ=ˆ¸·´´ªñVØYÓûœv««Y³]ɰcS²-Zd#5á·ðlCª¶;jf”u¤vÒ-’ç–É\}åÂiÕÕ¨6¾¦è:*ÔÃAL&¸`L†ßÿÖ¹õŸ°P8ªB"©Ð‹¶ãP9gþÐJÊxMY:• 9¼N l¼²•¬z£ÜÛ™ÚN†>ý~ímW4F—ó[p£î J…‰µ˜c¸n´W­ÅU)‹²{G:“„´’ÛÉ ä×Ïê+'´Áe Ú¹Xš f×u1ŸŒä…÷ ¤h—P'>öÜÝk­›²ž×–ÐäUë™*¤Ì“-Â[sûE–KGÈrXØßi~‡]ͤmA8‹»ÃO\* )öprc^Í Ì–X±-ÛyЖp*¿¡äLÂZºóÁp¯”2EˆRêôèÉ‹PL¹õD™"¢Õ,M¥¡ôÜ1P˜he×!š  +* ÓÁu­mú1‹Lû*,`‡$cˆB#h•A|ØkÖÀÚ)Våà~²ï^ÌíûÂuÓjÙvòÚX”¬úóy€í*Ø_•…$9÷¾£Žû¶`æþC!ô«d^ºJÑ?Ôþh÷è1v2c§e8`Õ ?–>wä׎°ZhVù†&Ë0§ú«`wë»"RÜ]VäaQúqÛ6Öx>‘°P¿©? šI5dönø±15k`uÆî"ôÕ±5ÿ>³ RYéØó²v ¸‡o~T$̾-àâIÛ‚·vQLUZŒ©¤Zvižw‘ÍFR¶]@n3Hº@|åf,„€,XAZþ€#Lý´ „Ïšª÷̤'‡®ÏhAZÌ| dD¬¬!¬ ­ åÏ_ê÷5Þ¸9æÀ´á‚>a¦¬P$ ¤çhY‰PÊzô‚ÏËE5£ÕMçÂ™Ž„à§ö¹\-‚ÓŒµè t‘®'¨°Ì 2qÙê!ü'J~¬ùW󦿶†0‚‚¹ŽPD,ª;S±æ¿qá[ÍŒ"‹>YIqWk© 0åõyœËI Ù‘SXü‹R@Þ™hËiš AZ”íZÊ¢u¨I-ˆÐ³ÖÕ,hoNñ4`j ‰@Â]'–/Z…7ü¾o,¡Ûá:$\e3Áo¬æš©jœ¯ÇRÂp|úÆ]Ü~’T«Êõhõ8/ê.‘Ù´ÙÄö«Vmh™äfw[éº$ʃÀ1vÈc·ÀTêœâ1ŸÖ‚>„qºt¸ûª’ÓÌ&éãù*wÊoƧ_?êÒ¥ÌòÛ‘:ƒæ:í‡BD½AÈÌu„›y‘L+aî¡o|Mf{¬Ú9&¶ƒ¬~™ÐÖBÓØI2 Ïã\:“2TFY«kìr ¯œÒWA©‰ÁmïIºzÕ$|vÎ%hÑ,ú:Õ¡½¡Ø¡å°Ã¯½š%åÃ;n)X?ˆ`cù vsa-†Cì½ZÆŽÎd V^¹ÕŠp ,„—F™P’†/!d…žr{Ì<òÃx H~/Í!’Ò’ ¤E‚¼{ᇚoܨŸQ*º ê!aìKËa7üÍ ¥Óö­–BˆQ1<$gÜk(a¡¼ÂgK›F‡¬íÎÁPTތߴ£üF[YÄYmÊ\di†h IAÝ9o@þ ù‘<š/åX­^;`ØU"2™šAR¬ê9à‘Ú`¹Z¥æ¤U¹6Õ˜q:óLŠRFÊ]ѪÓBÎýœLµ RÑZL·Á™ieÇДN˜[%˜f²•hó²ê¢Um‡ù 08UÃ+ᡊcââ8˜5UfV?sy£/(G%Röv#WF{6=n×<àA9ô2Ìg«q¨·®c.Ñë0:F÷C/ZíÎMcÊ~;á[¼oz3oÛ"žUà7ÿ€N-ñ6G¯s4ðy@_³Ù»·z-ní+º D.ÇÌG܃r׫˱:¥;e[÷¼"ýb4És2Ø2a`D/b‘š]±ëÖ×ÉzGo´w­LÜ8*lö`Á?ÿÖ…t¡®…mnלÚc¾²½ mˆ{!€È°p0Æ«Ú8§½õhÛ»íðŠ‹Ð•6r’$ƒbØQáacá_`¹­ê°u¾9:UkceúÐÂ‰Ž­÷%Än¢Wûê ¿|sj9.C Ì=w~*X‰î,Õ/ë“Þ—«sD-…è¯q)öª‹‘†±L`ÐcQe6C,4¨ r#ÿRä¿è;ïEàQÀÊ•÷<Êbp¤¶‚V3ñK D8£Z¾ô"Ò¾‘‡w7ŠûéΨ²(e0.õèÑ!Xœ-^•¦ùO™)Sæc¢Ôdꤒ`þ:s?l þeåæ+À*µë´i²²›W* }9†jãûÎÖ¸½„pt[:BîšRSÂXajêæ¬FÈXi¯ôùëvÕ¤ ±¤:•ʦÆYFK‚ô M÷q‘ 4üû­FÚ wºÎ@P]­õK: IˉV¾[îáo©±¤GRåÝ[Uf•šÑz©±ä(# ƒá+46¬Ï©m]S<à¼Í™3Àô/„Ž¡h‡]ŠgÜÄK*' @ò{¤jÖn†È[Þº2ÂFI‘3›üuŸ]"Ì›xxã“#³[”"Ùõðm9„@m¤ OÞå÷FñXŽ›SZL³´à£ dœMÇë–+sEê,#óI½.dïÐi­tX˜ 6Ì ×œ¨òº± %!:Çh†’òÖÄèË·oNO )IrYI5(•“°bK1Æ×Õ–€½Šƒ¥äœ˜Ü­±@€:l}H'äéQœ •xD-£653†\n«,sÇ=¬á DêI´gÆ£Ã.9 ótú“IO385s‘”«‘ ¨ãp(mod´¨Ìg¬B4 ‘ 3ªeî¯`Ë¢<ä"¢°4Ô)¦àüK ¥ô °‰¢æ ÉɬA`R0ªa“ˆ&©”mÁ ´Õì2}µe]9Õ®ÐB  Õª)&ʤbxK¯Öá^Ʉδ½ÛØèŒÊô¢½Ã寽|G­=®ƒ+ɳ-—ñ¦˜gIÍ{VÓŸ˜kAÕŠ:•®Ï&šø·7Õçò3Ó–hÝv ʋݬ?Û2dŽx°]¥¼I¥«([߇µ0ƒxð²,û”Fùü-çoí³¶³ÖS€QúHi˜!b‘ŒÀ¯è²dÆ‘uÝN[ÃØ±%ÄzPË•k†”Eu›K%Æðb•+™ë´²¼;PäcÊ¿y1}ã†_?ŸfØÀ³]V7ê" UóÂX0¡Ôèg­ËÌxÏÖˆ{¤éd0Mw6’Ðhˆv9\ st¥Š›lùá¹b®„ÕtòRÁ©®+*4ÔŒJ‰ˆà5‘_ ¾Ë¹bnÖç²âJaÒN™ ¶ÿ¤jiúŽ•aŸ«Íwu°ôˆ&¿g”á[ã!Nœa%Zù0-KåáDÚ*–i‘I t%Ú6´“óžŽu5ÏÍêøÐ~Æ~} Z±DÅ h‘s8ˆe³²!ï%2|X?Žè5×Å")oõY†‰ö,‚¹«zQ»pRÏÛ«6ˆ•4F8?Y½9³/‹žÖ’76G†íÇŸ×ÔØÛ’™·)ðH¿Üuq.Ri?:²“¶÷FŸŒ˜ÑUK(œá¢?“ÏfÂÍÎÅ2º„ò€F­îZncpñ¶{Ê|òX@*¤˜˜ëQ~FÙa/œÄ¬DWÑ~þ:lRŒoœ}k³ÅÔÂfÜü\§AºxÌÒÂìZ&#ë¸n &÷™ƒ±È©—ÛÅTÏ «y*+±é°¿ÃŽôAF'™ÕÑëž~Zˆ„Ka ®b ìî¥ÉXoEä ÐõY?p½X¹ ´uMH+V¹Š<iÑÓ"ûR0ñ[·§Ç@y%x‚óÈ­Ðð—tuW,aÅe§0oy̤¼xèì×™ééèr7íµ¡*Çf-™–¿Â1u̵‚t$°å>sëC@„Ê–oœÕ÷/ÓÇtÐÔlÒ° ÑÊ ?ö+j’T '+EË$³Êù>±Õ,’ SÖŠSyÃ:)™0“׈qMá°R _šo"˜3S½ß%–^Ûìä7Š`˜¿,ûÏÈC\$R,]>΃üÃq;^µ½Ø6Í=w¿äM«~¬ü*f›½îçWƒyàXÉØîê ØÚjº)"øgoüºU~û´–bƒ°Œ •fî-²ˆÔÁo×fÉ<¶xU^ÀÝcqHÔ·‘=tL´¸T-Vœ÷33'(^J~‰V¬I'ËWÆó® i•s°Âcb-5“ôÈY@l]Ù”ÿÌ0>]Â~éFý¼¡buNÃ;6_t˜ÈV×SîRš3;¬F ’`ù‰¢’Y•J8G¡*|4§Ne.ñš2iƒ|ÁÛjóce H‹)&“ ‡»Ò$üë—Ó“þµÛóM4."È^·‹¶DVH2³†´ô„¯¡…À‡0¿â|ZbÛöÈkv¦ôüŸá•'{9eµ.dD5œ<®×Nø²ÆßsgéÀ&2¨µ¸'¢Z³üæ»ÇŽx'‘œ–™ @ÅeP X‘uC­Rn5³±hÇÍTj¡åg‰QÎRiÈ\VwÌOŒ=/VÎa…ŸÓÆõ„ïÙä‰+„¡xh5Â"ií;)ûz¤¼;n׸e ;Å^è ‰öV»FÖ¨GïøGÄhN—*¡B­ãçDæ[´Ñg/r»ZÏã[æ{ã˜.*Ç6¹ë$`4ܱշ@½—Õm.~Fª°ní×/ãÑk`½1e‚±*•'–$Nº}ö\n|~öúõæ×¦\Ñ‘q‡ï­ù¶lÚþ¬£]qŒ¹È Ò¢H#‚ ´Û—Ï0<Ú‹Uåâ1J,ßn~ÎsPÅ›JØ02ñCQZ¾­}ºè(©9cï ”•M´ î}ºËÂÛqˆ¶€Mãä-ªñ‰ö¬XŽ<ì3¸´‹ó¸+í§«ˆî^ô?È5ÐãÐL‹Œ¥FL4tH”À1ÿAÀPµ€k‚õ‘Svvø\x›Ù !òæÿñüòë·§/žR-õí#™Ôf×ʶ¤¡¼$s~ëâi®“ƒåC`<<}-T˜ȱ4%5Ïü£Ž¦Raí˧%òË7êý»éÐWûEˆFK~ac1®´Zêîf\Œ"Ðt¨/¸_Ù)5ô(¿DŠaŽ5cvs@¸g˜„¶ô€eSf83°f ¬ ‰€­Ä4e®ˆB*O>l^61­ h•/<̓Vl­æ²#½?#ŒáD6Äà™ÁávFŸèuý=G,m|-dû|o¨Ž!íÑ {xöXÃAÇÈm#qZ´íjGÙ^ã‰r ½häÑ7pKv‘»^g'Ø©Ìm³«åÄf;bÏWê™K :9vžÑ¸×Û$²-ç¦ó «“‹zDô¸Ö½âµ÷ÐvÙõ$9ye¶PjïÇø¾´‰í¢-Ÿ^,€Œ©R¶|¸y³êçØë‘Jžy°†µ“Ê:GÛEÀˆ¨–;°¸±ã aE/8±‰lexÃX7l<%î,ðEWgÙÆë³ÓZ®$¨¹ÉC±}kH妖…ñ)‘Ç[YØ9VѺï9zj.h‘û”*HQ ­ðDŠÝ€«œuÂBÍ9@Œû66@Z êÈF!­;៽¸ü“óéëNžÚJZ;ዱrè™õA&Ç“cBXnJÿ? J¡Mú(0J«¸3Õ#Ñ”:$ËŽŽ^G'tÞh(Ñ"Šò«7§?½,Ó¯D¨µˆ(G.s‡AÛñÐU,:P n<Ö=‘/Ú§×Íüs2TBÅÔέ!Ze+˜v„þ,VL”"E;œ DÈit$U>¢œß+€>`Œ²pzBâ !ÓªÐóö $8¦;©Ï\“¹ÇCñv)ûä1AUb'N“ûG÷´1õxÀ¶AÊdMûj"p—‹µ 0ÝeŒ+¹k4¤µ¬Ú7eÆõGë½Xó5£îИ£ƒ†¬·r“la¿²­ÄtìÊ© >ú¯žð]÷އ&‚Í‹™•{¡æ]Ù‰11‡…T—mŠ\+~£#ø—f›s‰Ó-^6N#÷°¬Þ·Ñ¹¹/žséÚÖöpîð6DÐC°ŽÃ>â9¢8 ;âÍ÷æÁIo[Üû¶caÁކƒìñÓ8…,5ƒˆ’û£ •Ý£§ò -®$vƒý1…ÔD«ðŽC<GÃVÈ2ªÊ^ž:®Póª$éi͘ÁEt\Xè#€H¡^Ï(2Î|ž«7_N?žô¯ßžoÔºñ*j²¾‰ # kJAÆ ISb’ö€TSjŸš“x!!‘‰ùgÂ: 3ó©Ã)0êï`âK~æŒ/szoòHŒJE:SJD¨U¨5GÃC€ù(oßÑV—ÂhÖ.=œNGˆ„Ú·à\!hîª-I,µè²s~fYÕzÌÏÒܱo­æ¡ƒaköm½3c*L°–àZ`+Ъ­dqë>µ®È¸ßîÙ0ú>ºeëþKÈ”Tß+wmGÌld>ÏEvÃÚ¼Yï_=Ñ~ÖȽhüé‡0ÇdT²¯Üõ¡Ùè1ÜŽòç#ÖØs–ƒ &”†ÁŠ`óxÖ΃ß#UŒ‹ÔÁÚ‘õhWoÉ]—jèûÙ aËï²ïƒOŒ|.‡í‰©vvH…Ílp6R"«ÑÚЮÂiëI®T»RîˆaH'¾Z´Ü¸ìXšvÑÃC9¾–•ºõü¦*ý‚V`âqº—B¹Dqˆõ|Ò²u#ÈánÙ·df·Ø¸ýd2ò£-®<ì/ò…Hk- ÿ—Ó?hý+·7F#P—Kü:>F"úZ–ÿiݸÆ<ëÐÉoP âuâº$!‡ØíEìsÝa³ASÏÑšÌo~þïhý#.*å~@D´i(⽜¨°_Ïá©°naÑ’ÃÂ[Ã?re´˜,t™©U´H–{.mÿLÐÐýwFï›% dòGËó€W¿PEZÙ(ýïC‹v‰^(²;‹u'Çöø}‹ÜuÓ<ì¢^” M¡ZD°‹û/÷Ȥ÷cpà‹MTl8W.]í‡þ ¦|Ì´0p'RëJœ&™=0d Ù·¨ýÀ½!P,YÓ—ØeHiÎÊJ#Â|P{î{hÑÁžMšrÑ/ЖY¤½9Æë[x•{œ†Ê!Ùb0 %S°è!½µÅ¸_‹Ù7„:Ÿ•³3z:´ðž @Go"™äÎ Wì2Ç%,q*lÝ/yÜ2dž¿nü"òÞ³È2¦™l9gžöÖXV扑á{oYH£u"½•”.Çg_I¢~E…!¤å}`f¬b•H, V‘^$éËXyæ‚Öa¾Î#oÃ:ÙÌõkÊ0¹Fº26ÒcQÃ'ÿðÂ;Ýýêã›§'‘Œèv6§Ë¥„QÏÊàÑ Iµ‚†B\Zd'šsžçw€Œ«ïª‹sˆÓªÉòÁД'Š&¤J6ûæYýéKí¤}=zxÿ?h/È´ìª7BÐáŸÍŒê°÷Ÿ›gP€é'H×èÓ! ¤¶PíjÒ™è–ë'³…Bðá×§®l]œ±Ñ "òÕÓé/9ã¡Qn4é ø`s±"?bS(Éx-¬:ÀÜEDAíg$Ûèú%·iYO–þq)Ã-(×CsZÕ²l&à$ÖÒíñçu·xˆŸÇuÁ !0¯pÓ$ÂtDÖÄ…^ŠÞ¡ `ÛîÂO˜Hn"™Mn‘PöžìAó¨³,ÙÖ˨Ž>@®½ø¯2†W–»fá Ÿ”ƒøm¿Ì²GkÐv k{:·oÓ°‘\!óÙPë"µÅÔà“`H È ´ÌP¡“yáÍ“'¼½†q4ƒ¡¿/H7LS^˜¬îuýò°Åšvа-³áwZ{ÅÇ)K‘?ç"‚}ŽÍ»Ý0ZTIÕ˜¦··Úð•:áxL!¨K`6Êc[œÉñšÜãhÑáÐUÛØ6€9p)W…DʹÒÍK¿/Hp=âÂC¬’ÔhA$µ ä­¥Ôp WÿÜi­«8Ø ÿW†¸0¥a‘&~üéË_yróŠB<)©çIZ °CY:‰t‡väJtµwÌÑ„¬À2”€ÀVböº÷K:À2ö|—DbUè}æçnðwŸë0‹Íbû@4ü;2¢ÏbtB0ôkÊHÍŸŒ0Y°œ|é+ÇpBø0*x"³êE)Ъ+Àà ÅѦ™ÌÊl%1¶X>â²å6‡ˆ{MEqÀÎ0öìŽóÃŒ¯ë0 Ú8rÀ^–»†ŒªætFIR¨oº›fz@Ž“m>lvú¬šƒj¼ØbêðŠØ™ÿ~rè{{#d ÛØPÅ™MõwÚôøÃ—Bƒ}í%ž–Õè½”¢"¯{U¼Qˆ^qÀ³»§!üŸ~Ñm³ØD;;©ì×}cjª£[=uèzJò N—,R‡PO£QT£¶ÅSšÔ„IT @,þÁŒÎŽ ¡M”Ù†Jí¦<\›–cƒ–k\®"óú·Î©{:v0r…äT¢‚)4¡wàHLs5Ìk@mƒEÏ[ÆnPÔuh“~÷N\4@LÇÄdeá³XLÈÂml*÷ÞhÞUH‹«˜Nâ,Þ=sié8º÷Tð3= ÏÈ¿øôîk·§Ÿ»9Kj[ú²Ñçm@CŸä*–EE3äÌ0¿Éª~^6©®l"D`¥«bÓþ|õ¤þFë$&’À³ÊHg ¾üeò sޝ³@´¯ßÓlpÐbü«@Ô<ºlñÕHÝ4wÉÄîɺ÷÷@¼Ç q×Ìtä²ò]Íì¸îpÊ®< åoÖɶ;lÇðf‹ˆÒ 2º`x­U¤ŒïõÜe|†­Œ È1«Îj§ó¬_ ¹Û윒÷t‡Ìjý•|!äáìRÖÒžž·08ؘÁ¦¡vµØd·çð`Ðè‘V†»çŒó©“ýa÷Z™3~”·õ³þ߆)ÇrFŒö•~¤35Ü{q ˆ¯)Àï'„W»lï;šë!sáЙ™§G“·âë Oô.UªzK@¿#¥°…i¹1¯ÊÊ"L«ÈÄ8ˆ0Ì Wës}ôªåRzhRZnWÐ~j¨˜Ëä·Hi­Âe¬ºöù5SŽ¢µ°I"mxø±SöÛ’Bls¦¹Õ½i ¶å©•!--òÏ.Müæí 2PúV‘e,Hc$kÊð#ë}-‡*&¬iÆBAФ“QTÄaº@2×Z5oü•›Ów.ÓNHAðrZéȤ˜k”aýæB‘ µÀU¢Yd“-›Zò­¹Q\^ù›2…QËA>W´¿šXÈ"†úìÖà‰•¸gHM&@‹8úVJÜW¤aI[ç¶ô…ÙŠ]ì({{¶BðÖ€\±M{Ümt®t“hf¡ÆâU­²1Ô¼_º ô"äOCšÎ röJW™ÖT Ké•g>HŽnÔ/U{åY4[²ø¸¤A~zØx‰8w€Ä‹œ×öj;ôx3Ý!&#õõ-å¬MO×:e§b¿PãÃâºsºÿƒ÷¸ë„ «ÛÖx_uû´ÿÇŒ¶—aT%‡b³{(û² ©´U}vIuîä÷&xØ]ÆÊ0×°¬ÝYÉÊ•%eAžàtœìz2?Q 9áiêšO’ÐÉâÀ˜²³:Vò@MÎ ƒMÛ²œ¼Ü;:²dLŸYÈ—éS­éñÍ…r6vjb®‹â“kyúWÔÖx"™ÇÉÒ—üCõRX–Á¢zp3Ô¿p:}7’3£'ŽÁ&gLr^ŒÚ¿Î}« ?ª?‰‰ j±‚QKOP =¡1š Kä¤þÛ$áƒÀ÷xx¥“ê³wØSîJ2âQcY9ÐC¾[]õµGx3»ÛOWäÝÇWÚ Îì±J»·Ç-SÍ05ì!N²x®æMxÌ$îZ  EÈyè&©Eõ¿ç^¬„ßìîc~›‘š¶ö‡æÀ|øÃ½_ÓT8ÂG/|€’ﮈÊ÷ØY8Dë-4rß?÷›ÛôäŒÞÞ¹Ù}²¨ª^$¿®7f6KFο>‡=áPˆ‘z±‡ÝíjUNSµ­Am€€• ’Å”N÷`ÚÅ\µ,ÃÞ“Û<íµ/^‡#ÐKòd¦ë6{«ˆ¹=’À´Q,Ï” !]C)ƒzäžZ»wψtÙ‚´Œ}–Ö2¡{ùtâ_~úâë·7?ssJÍCt¯t;Yجáÿ)nIo¥QD®š@›"†öÒÃ\Ÿ5fÄ£´‹È?¾9½}ÑGJ $Þ¸²ªáåäÛɰ…5ÒãÇ Ã¾§™R dãþMÿ±²˜gŠEÑB¤eÞÓeˆÐ*!å×ÚÐa»F«bÁ¦´‰»Çûùû0óбJÚÎpP h18|GDS=·ÁÈÚ¬ DêÀ‘k†Mñpñó ‚[J±ÿŒn`öô¡E„3G¤ÅÉÁ¼×˜#Iz®€¦´­ýèÂ!¨xoq&‡ßU§0òpYš;ÈÎvØÕë)~{tó¡ÐµzÖR’U-h +[D%ámOzÏQ;‘®ÏSóßeËd´´[Gaë«X -½ßY9–©žÉ·¡w¢W‰¶ï-7&ãÕV·ÈíÈK… cXh0²¨´‘…'E€¼±Äo‹É5º4ÍC} Šº†Õxñ³¨¦‡LôÜàú((ð:‚:"é÷µQDIæ6H+kãà!IQüAò¿(E|´•ʽ¹‰øÛÏ.?žô×noÂðÀáÎXáÑvŽˆ ™EvÄåºÅ”«“tX`°™Ì¿Ge+l®gu©^?áK¡k7Ä’(ªLöˆ°VÔ\…« 7p¬VBŽ/Ì•¦e®ìÕ‘D°j±Ô¬Ôå@+ô$®âj5³²îq òWt’q··5w}"qUKÉŽyÆþžáÉÑØ“‚ï±-ý¾©Ä4/ßÞÝnðŠy»4ƒP,†7¹×̤Ü÷CHjËâ–#æ-}ï2åèÙvÛÀŸ_´h$qϧ˜iJh YôŠè­ûìVÁ&î18ÁQWcEä¸vôs¤>К4Ÿ”¢ñ­ÈqKŽNrûwÖ{v!`%»%+&ßÕ->F‡=3ÜO±½ˆµß÷+]r¥4„åŒ½ÏÆRÊÜRÏØrL|©a1ÉÄ(ƨûc×$a`´A)>웤Ÿ3Å”{/Ëù '°” ×G‘möÓ¤A²­²±¼µÐÄ!×ܺ&§[;Ã'}Àˆ°=ý<(ne߀R€ È:¢‘ôSÜÙŠr½™CdUV—¯¼ÔŸLw¿øäævUÇE ?äÌ,£íC]\É{\(ó™%Ý-®E¯*¼ÆÀVÆ¿½çZ-Ñt|úÕG§w§iZn¶ŒL6öÁ*â\!F._Õ†áC×L xW%C,h²”*žV¤÷ÊÒpKzÝê! îE5ƒLô3…ß9¥5C”Þ¢LWÃ]DSCÚBvlvAílÜÆnm²ñÙ%—¬‰™+ •<ÍSÐ›Ó tÎ]ú½;J—RÉRó3¤%É{Ñ`¦»ßj¤l'ž CvL p†Ä«ß1 ›Âö€Ìtᬠ3§˜Ä¶È–»¿6B—ކÇ%v´Ô™×í:B C1ˮޮ}¹•¡Ï]öìÞ‰+;¨ø±Í‡³”mäowîËà¤ÇŸ£"Ú-aÝé^Ø’¡7¢õ"e»@Õ -­½Já¸9çž'—3£¾3£ Ùí蹇Û::Ü_U·¡Eûk ‘ª¡B~1H±·nÊ6‚\h¥ ÍÈ•¶œ# ™KÙu*ÁÔö ›"˜ƒ\ÃËh¯„gºò¼Üìøág ¤«~Ç&Ï/§˜9H•Ú¥u²Òë0INŽ|B«tý¾ë1­ ÌuWÁTÊó‰õÉ‹¯=>),'ôaú³Ãõh0X±\ð‚}$ªÿ@Ú]ëõÂÑÔÍPW~À‘Ã1Cí< &APÎXÕ øGêôÞ¤—Y (‚N4Ì+bhm@­@+i籩´Vs(@©È\ÊheŸ›ÖPóQ—KzÊõ ¼‹ºbá›Äí¤6€„ÙFÄØ9:ïê–Å’öJêÙ-N˵?7S_„*¥wc eõ"ÆaLw˜1Ú¼€Ýf÷åú…hæÕ"·qBÛ{WöÖm­§vPü¿÷#¸-·C]À(Éé.dù[PàÒâ*wLŸa5ZT2–f19Z±Ó†¬X ’;Gݪâ´$…¶2^[.”¨±€ÑFÈ»ÄHnL&W= ¢mI´ƒ*¬õ¡WWsSȧt-K»ºpFô2ðȹ¼öûá'vv®–÷¾îU *“ê÷NùÎñØØ0…Em¾ôiA*ÿa×:/2š˜þèiHK›Ðošˆr¼„7EöØ>Ž^¤]ýÙ *`ìMÎGÖ÷Èf;÷Óݸä3Ú>Q,àe"ŒuËŒ@( ¡%]ŽnË;7ä{s´<;L‰Ø› 5ðÌEäo?»üXó«n¢úÇ•Ì&ST þÓÂKùSJyr}ÒÂL°—•ÙËœ ,“¼Jéc€µF¤F¼~Vï]¦e‰e o½Ûw%ƒ•)IÐ*lmÁzÈS4m UØp@’Y¥¤L"ÝO ÀŽáé ²Aü »ªÇèâP§ Bö”»NØ57|”Ín¸l²d %¨§q–¼-¿ÐìÉ 9¯è×5(ìPÖ`÷0± ¸Cµ{­¶gy57|Ù{AjØgÙ]:¦*h¿ ên½¤ å8’EÝú’¢[”Ë<0¦Þ¿8“´‡.Ó’`VÈÅvl‹mM·Ðƒu$ÌTý¤öü¡ž}íì†sã^]ýØ ÇF½”!ö¢ k¤VÐ_÷~ôžjj¹{‹ÀúWÈ„ênÛeY´sr>0$Ó[ž€ä[4(DÖE²žS”L$[ôìà`šA£Q&©0È­ €PçP ƒr1/îqp° øm9ßK0Le¼«d8]]8ÀQ0wMRCr´g­ò†”:Ibi€´diQkîRÆÒ’‚_ûÍšÆÅJd`Ä.ƒ¡õ®DDøþ‹Ëó‰ß|rsÎQP1ÏzÕº:ÿÏd}ŸFa¥#ú/˜ÂJ§.ÍŽ/·WÏê‘Â#gå=]´%þlPoÏ °xó“8dÛ¸69<– ¯P¥¢1Ìp-SR[©(ÑÐúæE°1ƒ,uFðˆŒ°vÍ2Ñyy,FA`h[9&YmÆîÙÒ™9y±\w…ÄŸtÌÉIóF›{ˆc—Áå5f§WÌtŒ$8VóÒ{£æ”s§äšÁÎ&ËûþDYy5ªØÛœÚ{…ÜyRÒ Àª"öøL¢ ö´Dã@‚ &šm@” ½}¦DÅ…#HmÛ—CI–såspY}‹õÑ¢&!k@aSbÅŒÃ%NBZq¦Í°[d[¹( -®‘>QØöB¶ S3Ê6H‹¨°-a}Ù\Ѱ»ÛU’žN&&K©Å'ýןÜýâ“›ÇÊ?Ö bÖŽþÂ@M¬ðí‡‰ÑæsXÇ]\}"ƒnŒt þ§Š‰Cð…“GÂjù†oû«`#> Zùw¿d–þBÎXÓEº>¡,­˜¢˜Šzá‘+“ÝrUúË>L>5WÄãæF^e¢±A„¥”Jç¨7ù¤}¯w&bµYA&žìÁxVô¢â ÷‹—Öj£ÛùŒF.¨5¹y°à¾ÿð ‚[¯þ±8ƒÌ¥|¹×Q9çýšMã.¶ýG§#ü¥<Ÿ©4¸€^ud Œš•ø w3dÛ3¯…b^6íbèYÌ8lý'^–-Œ}(í€8V’Ic>¶‹õSt_gIZeR~ÔWÎqXÂ1²] # "2Éý «Á#ÿÞΤ÷{îÝ€»2š_oÇ]>Ý烧vÌF’—L1¶²[ĬäŸARTÖ/5Ѯӥ?m/åíÇ\´qI‰ÕÍF‹iyô&†MÐfйºÃœ°œGbfk-8 „• H‚$(‡F±¤U²ÝÞÚ¯L@#Û ­D'¯*k{ôÞiù›Oî¾öäæ§Î§Ü2?]à®uÄ¢[€gÍ­Ù(¥SåÊQÎ0ÛéOxï’Xòa*µX2öÂx£³tzHRÆÑ ìT72þ­Èäh¤•¶è5õŒu¥JäØpÚ´z,Ô˜2Ü2œS •þ#ŠMÇ[Y\)½¸šHŠe–_ãýÑÐ~‰šÆüõE£³.ÚD[Ó0yO¿PR ~:º‘ñ oßü8L8ÄÜg݈ð°¦fwø¬±cÒŽóÚž Ù]‡”–/áÓÜï†çBC&_ÎŽHŒ2<7 í¸U`%éLl²Ææ|«åWzÔ”&¡R³†•Ü8WñºÒ‹qõv…‡ 1jG³¬Ã «íßmD¯ €µ‡Àüʤ¶ŸÐF€z^ÏûM¾wE|„Þ6á Y‰Ð¿ hÑ‚aåWxŽçÅÖ>¦ûD¡L’¹)~J¢0¥²zWÚ&˜@p$D¯JÃ/zbNƒbÀ:y[·¿lT+CÞY§’ùzÕáH+ç¦Uè`4>Pº?<9‰üݧw?{þÙÛs28˳3Z%~»ºÿ0“ÞûðUU)|Õt°þ˜ÈúäÕñézD¬jÅOŸO§ÓD¦^|L+{[ÃU&±áU²—U'J»Ì™þ4fx ¾zèÄ­L%n)˜3ÿ´"‰<“>¾ó¿>¡„ЇÞÑhŸ‹»Ê]'}Zw ÆRR4°[í%qµÇíüî%…ÈeøÄ«êñÊ/µS©³/Â¥lÇôó2ÚßÜy9uuN8.?_Kk_!Å’†êЋG ã‡7[ˆÒ›ÜsÜV‚‚úuñ=™ƒ j,/>Ú¼Djw>Dƒ«Jµp$“–89ñ+¨ µXFM«•›‰²Žž°–÷x¨E›Uctcîºxnþ}û'ÏÉÓÜ´»V~Ì®óÇ’¡nØÀP¸6ÛÍÀjÙâΪ"ëT=Š—CËêÝ3ÚKï{å.¯ê8‰Ìf¿ðjòçT:£*Íè´Ûõt0h« ¹Ú Kh¯×C Òb8ˆ!­±Z§?Aîº6|54idiUƒžŒ7¡›0ŠüýÝ广WŸÜT¥b˜_Œ¹ÅÏZšWa,ûÄÙÚ@ƒC`“7c}kå:F]wøé~xaÓ* ÓúëOæÞ„ÕH‘ÍöÌŒ3Îi`!!§4)™v ÷úcûÿ¨–„yô©€Rð…Óé]öZÙЄ«3NKM¢Î0ÍAíé*þÈô Eõ™ž¥®Ÿ“ˆ–°åœ€Z¨8das~ît;ʬƒÊC¢wÒÑ+’²7å¶kgÀÔqÖè¶‚Mí¡Z¿Xa86†.iÒe¾­Tâƒ!Þé1dsò°%b”|Ö±e”؃Oýì½k³$Ir§ºzvf  )@2Š4ýÿ¿¤/4f!ñìÎN?òèCUfÆÃÝÃ="²nõ€×lé{«òááá~ÂýÄ®¥‘|p±æ/ŒðX-:ùÛê¬^7Øc3U bRÁ ¢oQÜ¢€î«ŒqÊtoKǵMƒžj\aœ¾€!³m‹Ÿ5l«‚T Q s½Óü.J懨s¢RsjmIIßXþi¾û}fºa^îòó’þ[˜ÀPw«ÆÁð@)/²)*ÍD¹p”l¤-çÆK'3¼N¦¦Jäil¸™æ4X{! 5¬,  '\Üð^óŠXuòIŸ¯*àYRÅ)y¾ˆieÊÊ ü.g>[U$ð×oÛÿõ§ßþÏ_~úã§›gáS‚œ0d®Ë^~Î:°±ö EIÚëðËi9ž“%žsâ´Õÿæ|!K¬ªÒK L©³ç¦ñ|5±à.·‡ný‚Pç¦D_Å2Ï- =FvŸkæmv“ºOSQÒ7<‚¤úP„\´’bζۘ¦t‹úá‹PV(³ºxÅã&‡Bãù"œ|ÃâŠÝƒÊ-b]0’_ÌïÙ]ÜÅ}œv궯¢í0¹8\qjX›1‚À-´xMó%_é-Ž.™%ƒâ§Â`|êã|íÞ_¶r‡}8‰E·Ç‹R¨‰½u`taÊPïhQW}CŒ°·ØZieÐo1$¦¡{µáµ7d¿·ø0,>I7`´Ü»¯¢Æ¾~ Z‹pb88P‘ÂF¡=¾æ±––a}!ŽŸ,›N1Ætó®D«d„…þaYÈKçœÊBܫȦkH«êR»!¥²µ0µ-N¤…¨Vÿ=¤0_ ˆÛ›T¯™Ï¥þÊzÐx²|\h“èòŒí¹ò7¦ÿç/ÿÇÏ÷¿ù|÷ì‘Y=¼ª›‹æ_,ýÛñ­|Zo™QPy¶¶¦Å2‚ËBƒºjý êüë¯pûÛ&]CUSã I‚«PÙ0¥¾]Ѥ; g=3dó;Bœxµve–Â…§èe •øÝjEÓíî1¸/pÕ •œ/UW¯í¿½ÊÜ,äi¼”¯zøëLmÓû«3C=>\ùH!yd“e’—ã³ÉkMèMÒê±7ºHžh4y)Ùy€´m­ÚÙRz´΂ãn-Ï’|êeÖŠk.ÍKŸ<; ì½ðuÊб÷yjØc´°Þè­ãFd+Eï~+ÚÅÉÑ®<ÃA‰>–ÙÞµGD[”ƒÕwaVozSëðÍ#éêlBpó¼®]]ž¦Â®½:ÏÀÒŠÀŠŽÝUk/õ6Þ‘„›á~•4ƒ05Y?šèÈ`%Œ­û™ôS¨z¨Îµ*"­½ñ0ñ"ÛímöòŒP´öß˯‰1!­Rüñø€×0ËdÿÍDn)ýÇ_¿üyÛþ÷?|î»{¦ ¡»PwxŠeQË]A©õ‚Æ¡Epà'-ò¥ax)gÓ;P{š Iû—÷Û?~ß’§ÆDYÔ%¨÷íjÂá´Ô`6e”Y×±.@ÔZSQÀV&[|ö\ˆ¥ 4ÒŒ £dE6ïŠ÷rmës,Æ/îädMî6.ÏÉùt…:Ò úÑBðÌAÃ~w;B-òò»:¿ý¶ýh´#v“s‡¦ÊPìtö=ÆfPÞg¢.Ã:ELË΢×#+üˆ¯¿Šà#uè)¤6Ç%4sÒfs]yQr1£ú>°¤Å»ˆ‚C‹Ž‚?LUÑ=ÆJ£:K*›ô#SWpÉkW¾w­Ž['!¯ ^çØ¯æí-jžýÀ¾JBöÅ@éûJWî¸WM~™v¡³øÃt'Ãý¿“ AžLEˆžîê&!¯¸~@áª@J^×BZ lHkï+$뎩)F+²¥J‹C®J©ÌÛÂÒÿûÛ÷oßùo~ù©/®DkÌ©àƒö&T;·ªŽTÜõ+¸TýÆu%àîËö¨ÏE“O¢<Ù=ê¯ï7þf™Ÿ £1+m¹¤…ÜòPøÉM|Mš‡Öº€róxOÈ Õ)DØ`Ù&‰èÖÍÆÏjäQ¸WµOÂÏfýqçÃÕ_ðߤw:Ã5 ÈõrX®KåÜ ·=—³A²ñÌDÍñHýmü‡Ê­Èp;™F}¶¾Âš³¾ëJÀÈQ¥‚#ßÓrzd ¯ ŸðÂkÌx칇fÇÞÐTÙO&Œft8Å^´p%­‚ùŒa_¼—qÜ𾂞 Т{”ø¨|%´qh¸"´HÙ©5~ùQŸŅ~Ô3£þØÈ³ësa–wy¥87ð]£K‘c|ÅE¿©GØp˜~5K›c#áÚU"=R° ÿUA†óÞï²×6Õ°W ®IDZ^5¾¸é®Ù;‰¶+èíLê[Ì+êN2î#%Ñ.¦xã¡“w4›ŽÿöõûWþöïþø‡›²!ZËbòį̀dÅO6÷R¸¨­0šÙõ¹ÈÓ\D•š½¬yïx¼HO^1Z|AAÕ(BוQì«¶sN=I¨¼èj*¥n ™ ñAr@ï˜}Î *Uþpøá€­]h ×=€§§i•äÙ˜Òßë4D&¨mV€‘âq½1¼ 3Šu­¸é6j–Òg„’-‘ëƒÁò¨îgà ¿UØ ‘½Æ)pgUŽÏ­_·`J!wХď‚ä‚/[Tów uJrøÙ"ŒSÝ’4HíŒ\©î&uÊ3øYŽ~1õÆaùÏæ Ö GC¡÷ˆ•iõy‘Ò:0/¶ýz-á…´0ŔΠóhú+oÅFOáÏÎÙt»QžËª´ÊÆC Å( B-Âdø§oÛ¿ÿÓoÿî?Ý!tëjþºá´šreRR‰ ò(»ñØ(II[—ö1œ,¤â“L‹–mžÿõןðçmKÝÞ¥zЄHïÖË… ´— ¸V=˜¥`\v@^Ÿd0Ì ˆáDîhÍA+…ÓAèE;ÎÙ•=ðõÙÈÖ(ÑE“Zûª¨èÊÔ !Åà7»0§ûqy‘.¢ ˜f3¨žÄ@m8ò•ÿ£3^½-z5ŸÂPÿ{÷ä{ g¡§xäµt×QHh`ð¡Ö¡áFâñ®~V/®°@§[ÓŽ‹æÛÊVîxðTí¢0=®+Rˆ¯†_bo¢àš÷ Ž?æèa¢®ãÀýn[.b—]fÎE¯G©@•¯Vä›1:èLùƒãø»ÇDøH·7ô;8¬Û•ýÖéL¤‡µcþ˜˜ (G¤!%é’ z’T¥%Ô.IÜð-ГI§½.IªlÍ[°ŽÌ|«>Ðë¯Üá¡D‹m&ŠVªæÆ)b—RúË÷í?üÓoÿö_üô‡Ûí ¹^?¯ÚžÉ’à#ÎEbb"žõNl½&úAƒ¤ð)¢ÜRHÈZ}Hø«O7|ùsMèÄm0!ž=F)žÝT3+.ÃYc$"»šâÓwfú0„ÔRˆhõ|££™BE[Ù-Hì9uhïJÐ@Ù.ËÚ³™™—ˆ®JÌ Ìè—0:mž£»1vü×¢V¤#ͳ1ògsÍÆçKWƒsÒglîƒ{èDÆ8¶´ilF—FdÜ«ûÓ nÒmÆév¾›™Ð@¯q1s}…®ÙÍL[yJ|ÄÃkò¸Ò(‰ÅW¡î¨Ó§q"ESxÒÙ³óî]½KÆQ§a¦Õa–®Jkê>…äqû^Ææ,uAŠ«fö&:W {Ïø :šh’ƒbÓù•àÉêYàÕê‰S•J\­?G/an^ Ózþr(,1j—ò†DhVéÚXw~aa;9þÊz2ûÔ9¼KäîI]Ä–ì'iN+â ùþôåßþñó/ŸnÉÛ+VñC±*ðõsîèxYÕ÷–ãU=ƒ¼“²j4Ûÿ‰æ(®¤NLüåÓ {…cKB„‰‰ú¾Ž²(¯)`ÀŽM);ÏyÑ}™ÏEDËõÊ5­æRƒ´Ú+­h‚VgeáAáv,trý©ç¤›MçpÁ£qÇ Ñ•Ø‡g-õ4{¢€kü›ê⢿,ðj¸äR{ÆŠÇžaCä4/YÝŽ/tÐ"8_^æ[çàŒpŠÉM‰]láu'š]Q¶y³ì‰•nÊË¿!ˆ Ù!–Ž$ºCÅ \J§¯„Õ΢E:ŠÝBóE3:MÜCû§ÐE8„]t‹4—DjºDÁ}µÿæÞ¢°Uôl: ´5|!}ûün­”‘_d””ÔðE·us„“Ð=•…iþìÃÛ³#ý@Û[¾&l4èa)¸¤æ†ÏÁ JÊcG¶3C{¶OÖ+ãQ s» ˜W©@Qù¦é}L ’£¼ RÚÈÿøç¯ÿæçû¿¸ʾÙôBAêzÃÄH{yÞüW5‹ oQ6É=p.HûÍ£€Òv Óù çÀGRú üVòÄ‹Ô`ð¦åüã¨Xd ZÓDGè…gÝU[ ms/²fé‚ #rQe‹1uЪ"½*Ù¸¸b:Yr/­Þåœ#ï\‘%×Ük Í—êX8Ä@ /U`¬äb-fÁ€µrÑ¥~°.Õ¶w¯q©%w^éºkŒæfp"’ӲŰÌaf ó¦Ð y²{H\¾È®D‹R PäÕ©§„üuPzìﺕcìQt©µš®¸Ó*š_qžè‘½—ÎO_÷™<ñwo Í »#ÆrôðUŸäðznoÂ;ÙÛ¨êKùß§L~f÷Ïœá(qØf×Xê‘ùuInÕèé'bœ^~آΠüvK‘–’Åd@ÇìfÜ·°«ªe%ôW˜…QŒ¦‡áÁCŽøëªÛläúõëßýœþö§L ¶¢âªeòÔ»£ˆÚ0î­y,Jû} mê;6s+ž‡õ fozùË'üö”*ê%\ë‘Ù¬‘=j K^öúÐYþVJÛZÑ(•Uö¦­éa$N€4|» ZiB<é‚ ¹ßK4+Šwö©4ÛQ>Àdt q¨TdE K·nÕxfö|+^äµ(ØUWã¢Ê)-Ó%'”€¥ÒZÑ’1“|\Ÿ°@ÏÏ/E 1ÇMCåÂ>è~“â°óŠÞ>Oœï{ßµÄ,ãå¼€‘Ø’]ê‘¥ŠaŠlëST@–VzÕàâìhú+‹µR²Õ‰@Ž%3PER‰ üÃ_¾~Ûø¯þpOò!RVõ¸ëvþƒºbYÝ6¬¯jžŒYWݲŒ÷Œmá £‹JÁÇ?~¾!)5 0_£³ÌyÊZWßÞ¾oé¦5J°Ý Ÿ³_¶ÒGQdèAÈ­´—<æ)âÑŒ “ÍÊâ4®Èá‘õË—8ß9ü!x£}I.Ú²÷Q0‚î‹„²FâÎDœ{*¬ˆï¯ÈßVÈ[»gÁénþZÀ—ßa2mñ×™ç¯|ÑŒQf<çG­°é{£Á½t/ŽÑcÔ×JݽÕÜ[=ãå¤;'׎”¸<èv ' kj»|×Á”ãRÐÛ¤[QáÀò”¡Á° Ç‹LS¤²ðÕ¹†µÎ_Y&2±S2˜qÚ!’0Ëoä÷ÅW+q:¾à–ƒÏxyèZBs­=8¡å†OgSÕVáYí¥ª¢ºÌk¡ýc‘[¦ŸÒÊ«´˜ÝŠƇó4òøíMrAÿåË·¯äßÿü9)uµLÍ›dùÖbd;s1î;»} lAUò¯>ßúøúo7±I“B"‡˜akRÖ01{®ÁN]€jÕ6šVZ9ªçW"ƒÃV‚¶4$žJÀ«­ŽŠfÇs^MôóaDBJ} Ô=Öðq¨ºÄ® p¶fàJ]*^<¡óF )ß–Ë_C·6¢ |† 3—£c’?šñn¶}:î†{-9øo?šS¥.ª:€2A=¾‚”øò€¾òáa«¶Ì»;ïŒÀOó€Îï_-”®Á)…®Ç,j¸•zÔ="üÆ$¬1írc…#—¡9£x ,„½…°HN/œð0© ¯…Ð6 á¬aðQ TÀ^ñfZôÕÂ\9k¶…ÜœêØNœ{NŽ'®Ÿ¦ä>¾~I¡Ö²¯J-¤…ÛíFVù¹ÚŽw™©€¥[è%ªn¨[å™Õ–' (VÓÉæ;Dˆ_5Îüú‰ÿógí|ã9lJØÀ³7/#åù÷™½Çß¡ Á;2÷duQÇó·Ÿ?áf’ÖŸ ËŽèEK݉¹S—w¿/²q%…•!yè´ªÜ[±ØV “ h•|Ý:¨8àwÐ >Íħ„xå(-™vû¨šZ7Ÿ^y*€æÒwô„¼£]íí±{ò¢êü¬*ê mçóèêõyŸ}2ú.éú=ü/`œínãÞ¤_ß‹èø`a‹Ð¢Èiy Çè¹ÝXýÈ$Q4]‰4’$6íùgžhÍ´z¼¹(ÔÕRíøjy*tI̯ädáLR}¸Mˆ>ÐÊX,ìE “åxZúE§hжð-C4Â…·d¿2ªsÿèùç«´]rs” ßÜ[GäÈêXé }™UŽëXEy½¯¼98 »ŠrCõwUfl>Oÿa‘!V%TQª]‡ûž‡Ó­ðh¼ÃÎtˆü °Á^ÈMú=T@:„ bu<¿i¡â±‰úÿôå{Úøw¿üiC*¶Ò"*b¦ÌÀú ò8-éy}(š)ºUúQîÕŸ‘~ÛXb`MìËâž#’~’གÒ:*q«‚9Ë¡¢ •6þhU-vMÁ %h µúü ÄÀV7P„Uíž D|^†ù Šó*¼p®__r•®©LñeÒƒ8ÑÇ4–KS÷-"„àÞ¸1¤d±e/Ðu`Ôè'qùÔÐ9ÙÇáËq¢x ìõ¹¥“ý:-'1¿bÁ ÀìÆSkK ‹ÇhÁìå ¸„juööeO€êCÏŠãªàFRFp‚®€ÝÞ®ƒàŒ%)ª/zýî+¡á 6†Í’ö®‡Xi­^½Bsܾ–}cúÇÚ&omè<ÿñdœ«Â߀ÊnS[õ…áìqÓM/zøÄ.~ÌæÃN  ½§,)GiUGë[ i¡˜s6ýrY×!^-·äÖ¬tY·Dó iŽ#ÿéÛ¶ýúõïùŒÞÆIÕÂÁÚÒØú~¦ Ý·^`°oJˆpò…w9ÑÊ¿}¾Ý¾p«&¥d%Û¯IF=UÛ$xþFÂI±wá¥$‰-æL>ÜÊD§âµä7;*4Öh–täü ©‡ª™xE¨^±RÀŸ%ÒáÐa 2\/­šÍµ­ˆ«,-й¬’¥þ@UkºYM3¢È,R}ï(WaàŠêW6l!ð ’¡‚1ÒK— õ[ÑÆøÈ£…q¹ÕôÍp‚ZŽ<Îæ°7XËð„,~#Ä'ȳ y•r|ÁcŒ Ùq €LuBhuÙÜ+9äp\wfÀÕ$Ùa.wáÎwºÃÓ3Ž¿¹˜ »œê¡Ì£.öµ‡!bN»÷›ŽàÌóaÃûVhyl=)ÚM!°Š<‹1˜8ó «&ó·ûŠ&w˜ ¡·Zîpÿ/‘Ö‹r€Š6»ŒãIæMFÑïãçOß¾ÿß¿òûù'_AzžMQGþ%&,6ÿÒ÷4'Û™¨]ÝývBan0EG$C‘Ðç”Ò¶å·ìŠÜOIÈ]àQå§tÎY UiÞB´ªàŒ[‹ä\ìîc¯³ØJmoe(¿Ø:¡ôp èad^mJŠ\r*Ò ~½lä× ÿyÛ}t× ûѺ9Õ¥÷ª^z *È%Òþ$…òLrŽlæ°Óuëº+0p·Os® )º¢à÷Ǥ*ÄW‚ã¿=¯ ;©¢ð›k<ÑºØ ¡»bÄR®Ø¶İ¡NŒ’HDuN99Kƒm;pŠùuÛgVY]ºC³÷ ήšR–åJÔcBö"Ì,ïßêb£‹Ð¸èJN˜+ÏJƨ"—(vE~'mW¢öŠo÷ˆ;ìær¢3sF¼Àzñ•é}ÿÍ©[nø'{2¶#…H‹/´ü»~]ßI¦ÛmT¾©åáȗد߶ÿç×/G/aæ£J´ý<ðdKç/?y¦Ð¹5ž£ÍÂ]ÿº)»„XôÀìpG Á?ßÊë²98ס¡-nàãteJ- •'µ°.ê9…ZYGšÇòþJö²f.uC\áà†©Èy¹Ì;÷‹+)^ìíiGù‘-Ò?Œ×o[ºk§l«ý*áòæ¹9š/Cƒa¥EåöÃ`§F`a£òŠp ÚïŽV‡œ‡òCÔýކÞ\þšX2e°S/·çaîv8¼ÏX‰þ_É|O¶µ@ŒÄ­”wfÈóz4”4$ý®vrÛn÷³öEŠ&Ïã"¿~ûþ¿¦¿ûå3N"&”Þ<ï=A:(È™ùFxmlL· .ª^rT‚qÙ¿*퉔î7dE4”®©Ög¥ƒ›<ÿK¥ÈÆlü0åÈÑ®M@2mOà úöžÃ²ª´jZ+R­ºÅH‰9ÏýYúçÒļð,|Âñn>YÉù*§…jÓÎÏsñ†£ ÿgè»ôžž «Á¼àx†«çCÖ×dÐÚí˜EãÎ`ösYÊüº`×Ã^’}8öi {4Œ#àÑ6^ÒöˆX Xv˜ÂqøŽ^>‰à½CBøãL¡!õßYífú$,£ÇVE^9.C6ËЦ!Vä&p!t#S!…ˆ§.βyÏÇÁK'_!å°Ãr8P:·Xšë|¸ÂÈ¿5¶C©ËxÅ" b _‡‘Û}ȇ1Nû"/˜£ý_×Tk<ÎTý-¹ä‘ünŸHK/ AZ¢—`/ ^ NS ÒÞÿã/ß·ÿüç/÷ËO/ZµÃQ›ôTø%½-“—©} :ŒŒ ¬ce­èý+WiºáD«(>VUW5úˆäIÞ~8Ï e×Sc«™NÅñV UŸ×@¿Q5p¬eKÓVÙ;®Hõ£é¨ÝOÇ•ÛW£,vTåz–£Ÿ âá‹Âgâ,'Éw"å…ÉTÑ•…{îòëâç‹K²ÉÀP»º‰k$¨ˆÌ:ŠìX zA)ÎcX]À£é FØLj­#G M5b'Z¤Ð/#À~iR‰U0[ W·Y3~vòf3 ™úŠ‘ïÙߺºÊŒ~LGiå埙ÙçšÒ¨WÅœ5Hü{§‰Ëˆ#s}}àTyQ0󵑱ƒ[}ÈŠîVK™!™‹‡ AÛ•9›^j.ƒEËŽ £8œ‘•ÍD}¡€‹¯ˆŠ_´-x$ÒR¸ás\ 5†[£ïc8“á*ßê,´z‘ß¶ôàÃ*JŠº€…$¶N¸ö¼EkjÜsا×Lîô %Kk‘>ßI¿U°ôN",kebe]1~ôƒ+Ã’ œ³uA+ xÒѱ6؂ɻ©škÆ+—€½ælȓØ 8 b±kéÏj£Ì}‰Dù¡”Oq<†ë*a;{'2kã é"øFþ­£—½.¾b7öÈí®   ,<1býo ·ôÐÇfÅóä ê5Ñ—±£WÃxx¶o:8‰‹X´KaÀŒí¶«×Bþ)V˜;˨»Ë¨áZ´å°÷/øšyEAÁˆ•ò#;ÒñxÙ…]Š^*¥7}z.ýât>š4l•¾/¤4[ÃG¨çvSp§êb²‡:âtÛÚ;&‡Á¤¡f…­äóµ?ÏþTWÊñ¸.†Æ«ox}˜î°›È‡ó€ H‰=wá±:(.ÊLÜ|{¦þhÙ/nƒ5ÀDq—àhUòX¤¡ªöæÍâPùص^èÃ¥#ëWàûy†–Ä}XÖx•˜yZ4¹…ðâ‰Àô.8è™ÞÀðÚÑ»ÂW€ÌËyú·f­âw»¹ýòó{:¾›Dò =1 rÌbaÅ.(ÐÓ'¿}ßþëo_ÿöŸ‹«‘ÄóЩê¡ÞÍ„½ù5“™Î µ?,t¨yrÒ#Õè[ê7|ºákV‚å„CÓmA{q+Yæ)ÍK_* \·~sï Ä!ò¸k·&è@ª@«Ô… O¬Š¥Bÿ=UDõ|^G *vŒIÓ™\K*'_ðhÿ—r¿¤œi-9“ÅöÝ2ÌÊ„èF‚à»éå!n9 Î ”®C3Ç(´2¼CoÌ% £WB1)ÚLÐ3ÑáÕ-›1Ž®÷úW¯Ï¥H5UŽ«ªùÌAq®Éà`•=È“?vÌÈtk0Ž,gÌãO×­+ƒ€U¥Æ“atÝ9-¼þËVÞà@YU £[ÞBlÂÂByaû-8š…iº"ú¤éþ@rô^íJé›»*›8põô£ù©ÚDÈÞ·ùÉ&¯õ8ƒÆÙwÿÌíà‚y¸T 3ìeÀ+A ÿfØã¤8Cj,r§cƬ(K‹#C}£ —_Í·«IÑÄî6ÔÍt¢[ÁÄ„³ígï)×píê{4Çß‚²Š ØŸ¿~ð7?Ý“t^‹SÝVÞoMÙn‰‚’ƒ?üñïMôH¹)—®XÉõäÇÀ·3à¤ø*¡Åˆ’U0zimø(†M«fF/5ˆ=©–ÔŒÁÿâ{Y BäPˆ:–-›y9¡Øö↎xhO©Ô)ÀÞþ^ýAeí©©WEÕ Gz~½Îá­¿oäŠü PšïÝîúU,5Ç‚ÇÅnÁ¢9335øïÀÊ ‚ÅBA¡e޳·*Ÿµïõ•g^”W=0j¥ì„ƃnõv/UéV؃”ò@kö¢Ep—S½rR±ê“±J¡,~Xy9DåéG³6‘ Ô]üJ%Òf±¬(. l‚ÏÎ’ß«vÝÈã“¡†%£õžQVPö¡ ÀR yX.myµV1bTÚÛ7Ê*‰‘4»ô_áÎú kL 2w@‡ï$Ré7ÓQ{¾D°ŠÀH–šF%¨Õ-|0ÒëXпxwëizàË\&øMÙiG«PWy±d¿éa"ZB© ÚÑ<ÂÅ„íO_¾!¥¿úü©Ôò¯ˆê«›ÅÂØÉÌ"€ñF0òÉeÓ›({¢‚`þQ<Úkvq;Fªaæâ¤]à‡bŒ›–;ÆŠ¦_c±ó†QõÀÇá¹\?_ē܌YZ6¶Á<ûe_øA¬*>ÃéyÁºël®GÕ#­LFv´¡#~³2!ö$åt„ž§vþ%tø¬¸ˆÔc/°n”éŒ"ø: 7™°ÆrŸRÎÑÅ·* òÒJðty7 Jý~Á¾ì»3, k…<òâì”õjã0|+Ì£o¬!-aíÔm23v9¬]ÛÍ/¯hÓÖ®*`éˆqs'q«Tæ °Y€ÅåKo“9.ÈÉ·ZåÇ4 íWíMÔ…#Æê|¨ç."MWÌuƒI?;P¡ñ lYìï)~i›–nŠÖf{ÊR×Õ1¥´% CdQRó¬eøu¡LÝŒåE8ÓÓŒZ< ½hFî[¸—ÁÛµã3K‚°>DÇê=й¶z°€7n=óíeñjWî°)(r~–Ïù_¾Ý~¾BAq.³Œ³êŒkd “C¸Cr#;\–'T^–òÀ²ô®ù¦á ” ¿ü{Ÿšëø"Åì÷¬ ÖN™¤j«Ô ?ꎞ;ŸšF¿§¾eìû3çû,N¿·=P®t*TB˜ÄRœñ(T´©%°ÖqÓç‰Éš$«¹‚XËJÀƒÎì¡‘X’Ï##\SeÉtPŒf8q¶ø†>tÒi>èÅVÔ Æ(ŽrkŸÍóUYšFÐ#uªTQe·£Q™+0Á½n2l¼/É÷ˤý‰õÍ~J|Ñ;â½dí¨$™ì%DZ~48¶€jn`ùΘô’)@è‚î[º•LçtCÍp±-Ò,í÷!Ì*°5Åóc¿%õ}Û¸8SºÃ3~ÑÜž5w{õT*D€2d]Ã+>ìv|šoV‡•Ð+Å"žçtœ açÊ‹h…èÌúÙâCÊÔêU$5H?÷®Ó ÏìÒnÂad˜šº£›¥>ZB¶%«’¦½2[÷  {¤¶Y²°ßd'ó{:t>æ 5á‹Ý9”ŸÍmLUAK•Ñp¬¶e©hÜ¥;YÙ4Ü$qIéЧ²T鸻=+ësZN¸¬šš~K ›!ÙWKÆ}Qx˜Â&𠦔c¦ôßÿòõ_þüùóívì.80Šv Ê[“öΚȤ҆¤.bªH¬´yÙs«¶ØVÖ® €pCqô”ÉCÒú_™¹ø’Î-óÊsjÓ J䚦£›ák  ‚õ]ô$w®Í…| ¨ô°ž­YU“}¹PÞ/12NF6$äˆ[*&b‹Ul`±Î=¸bY‡rqè©Â26¢ïÒŠXÄWXˆaMG¤°+£ÜjÕÛá1¥Øªs-(ÿÈØl‡'œ˜‚š“ƒ¬í¡O² µi¹Œ/"ì“"EŽ»É Q—¶Ñ†<ª‚ûkŒÈÓ–P!‹ÅÁ=Gº¿.|†i§;[ï¾RàP‰ý‡O*ÖË"¨T©Ä…Q€ò#èÚÚݤƒ 0Ãå8ß.™§äè|äîצ5båÀº{†££Júðñ ʨ¢·Á7.÷üÙz³/>Owk® õ¼ iñJ}¹Öó„ÒcôÆ­¢ëNM×a…+A*øzzk;ÓûíÛßþüùÓ^ìdž¡jÓ@'(ž*£ï¶´—@™±öŽ#ª~¥$ã^'ùfF÷N‰”,qË»Kú¤ŽQ¤ÜØZY?©]^åö€ÙXƒ>ÐJ0|³¥‘›H»žJ.¶Û¡})V²ï*Šg9°dBÇÎC)Ù`ÊçzÎ> ”™DË—¿ˆ5d¸V} 3€½QöÑ¢õEr#p0*ŒÌò£(aÇÕâhQs60¬ISßžxÃëwЕØ^ÆêG;Kk¥LX/Òd„hüJáïìÓШH…áÕ¯n!\¢ÍíÐTEZÁûa<@ÿÀùx¬]åùëú®WF†ŒŽj* >-É?aÉtõß |`'J§kÍÆ½jÝ™qÝFK¢=·¾÷ êEõÎtÝùô‚€}Î'áîG“O\h±Bz‚°¤$„ á6•DtÀC(0àD$w‡DŒõ2ÜJ$_çªKù¾Û£F||THœO±0¯%ä%1T­½0šø†ŸúΡ姡þ Íxb^é³ã-ਕ÷oäÿíëßüüÓ Eý’}&K3«-(Úò­=û .6*WÆ6 >Œ °©È’ÅrÀHÓ‘K†ƒåv¢;HäYå£)+à¨ã8ÊYZW@PpÞD–µ”I9ƺeã—WZÁ­Ü5ðÚ’GhÍÇ׿Y{I&³{5VÐÆ:)»Ls~Âiï-/òÔÅwyØK3t“ÈL‘•z<«â ºa ŒNÍ’'õ3ÏgBòËRÚ<¶M'¶r8‡õct ~{‘ôüýƒröR_×Ï`›×räÈÉ,Áñ™L?ØÏÒ¥Ž‘OcÉM]We8ˆ8¢!¶gÎìzby%à)ŒJ—ô¯«“Øø‚ w@$J²¥RÊnÕm!º‡c¯Iq´N8Š,Y5Æ0ú"Ù·ùB×4@*Љëh»´üõ=Å£R5-øˆ=?ÜÈëNÔ-Éö¹~4šýhË,Ò¿óìæä‹÷ñ­Ð¹ý+Á³xÎ{4GKÊÎetM{(+Њ»u?A…ú¶-ýã_¾þõ>3KyÏÊ?u§ìä~€7ìY>k¤ÉØQ‚zÌAXÔú“UqåV¡â­ü;QÈ3^!w/4%ÙJ„ Z푳f;s¹bÿNõT©­´jhÉ‘—–=›aàÕÊ5Ïð–ÏRŸÛ88ëHÏ}‡AE³…Ç ÏSWÈl˜ÐÃ÷¾þ§_ÌÅKÁ¥e«^=oq_SãÝo1i¼ 0rì`³t×ù£kzÂÙ¡àöçüp¯¼r õš&õÊš`$ÖÅ’7å¢ ©»k\1ÆGÈդ̮)ÃúÈÃ÷ÒìéZ 蓾uö\`ûÑ¡’Ã1³Ë/ȦG±Âº[òyw$W0;.‡Ü7§LGôA—í®Çï–¬;Ô`Òt—BÑx†a%7=³<Çl‘ˆr赑‚Æ"„0Pu:RAÆ^D(Ø*ƒhT#²à [õE$è—»×!Ü®9áMÞùIzSLž0 ÛŽ­}%Ýøç¯ßùüéDÁ5­šZ•ã›VÞ RK˜Íˆ(Ë”ªò6–ü¸%Q ­EšZ*Š:¹¥¶«­ìœšÎCž"ϯN€V·Æó€¯xª–Mà´b.”YÛÛwþ¸.–zŽM°Ý‚­#5 ×0å.fR[ÔØKª·9o ÊÍ<]¢ãh¯E³ªv).2ΗmŠ,èi@Æj*”b›³¸Ai:kçºð·TÈÿ<ŒE?\!ÎpÒá; D €þȧŽá:O§wØ9zh6…î û[k—Ô¯9ékó~4£äJì‡/³¢çŠW†‚©©‡•wc]Ë[ì·{ÀĶ 1±“ä=?“a~=ÁHJˆb]ŸOê~d …µmíÿq“-aÈ`Öþ8H1aœ|^*²F†U2° ú}UŒ/.b™¢²LѼŽ\KÚx}}HYè£L)tŒàäA÷œdBÅõë—… Ô»]’Rü¹|¡b¾€ÞY~`Ô!g6Μ;™6VKXEª$eÈÐ#nùõÛ·Û-}~Š’bÕw/¡Ì·¨›ZÓ%,Ak…•%AÖ]‰Kv‡i{¶fïèŃÂJÖˆî©óS@,º#;îûà:BÖï ß+V5½Ðº|0ðfljTg)»6G˜­¸9ºë6áÝB"k)NuäÌOBŽÔóH˜{àNúÇX2éÙL (6ŽPiƒÙ³lzéžUË€ƒë!NEb œÏ÷jµ,t2Ÿ•‡Á¼4¹¢Žý"YЈ! XûÁ *$ñ­»½¼¨‘6X/ô=Jà/V¸ =z>-ÆÏ1ÿj¡ 6zÙîG‹«’’¾rÑŽ…¾Ìi@væ°ŒÍ&•ósâ Rš)ü‘½€!K>iáSmš´×ãÎ,RÅ|üǽc ˜²C‘ÄYÂHçÜäÿ€{2:úhÓ[E¡@` ߈êà 듵dW@T)7R ÷ÄYd‡¸ àŒóª”ê£Ãá^†M •§¼älWŒhwƒ?òF‡”ó÷ç"mëKÞ÷C/ïO_¿ý/øü©ÊW€2¬=\ £Ø§{@ÄÊJ ÔeŒ@%§(ì?ÜŠ¸@’ünVa?uùÕg1o0G¦€ LªP9ö@«tô!z—AEGU@·T¨0•EF½g)XÊiÛ\ žÕÌpŽUÝm«ÁH˜ÞJwëÅy®ÒÐG? u;wvŽ»¸5{hÑYƒˆÃ’™çkô¥[Ðàýh|¡UG·L¦~_Ò%åº:¯U+/ÛþùÁ^¦¯Y¶Ü‹¥–<šÝãï95J€…½j¿ euGÊB@P[–x÷ì÷¡•‹X€xÛV—Jˆ^àä|Â[ô¥´ÃQÉ“çÒhw™ Ò{Å},këÓÉãr œÑOcöR]Ãníô‘‰Ú~ñrj?‚o—üÅ\2›’ÛùÈn&Û•íÄú\°ô3É=%êÊJ´ø,åùÓ—¯õÓçÒ_³0Fã©ITPÚWµ8F9󭨝Û/±­$bÓ´Å,c\ñ"®U][-E]^…•ƒVYôêøÛ Z%êáWÌäûôVE¾—ïϼá¤bÄIr~]á#ãJ™*®»€é—Hpö%08¨öŸ¬j]'Í(KW 2þÄTT3ºˆt®«þ] c3zE K|«ÀO°—ø‹Æ¥âƒÆ_89D28á’žSaí1lì9|ñÀìÅ=ME<9r;­—æµ @¸ ¯ÞuÐ0Sßœ%c,D›'¬FìC!n/o:î§ÁóptR@ŽÀ,Å•DáEû.#hØR÷ž];lÛØ9º]OŒ€òŽLI¬2ˆ:¢÷‚j•Jà™g……¥m„ž9šM¾g¦:Bx¬S'çŠht€Å¿ÆVµ…pN8κvל¿42ÿ0° ¾¾(ªþ.&¼¦°¥e;e]çqPqÿÎ_¿|ûå§;eÃFE2Õ²^±ä´’— ¿½ƒDVã™ãNGÚ8ñöqkNO!ePßr¾xÈš*'hµS™ÔQ*ú–È‚­ŒîŽLVÞ¨æb? ¶ÕÌ+~´…‰E9à1Ùã@7²òk]=¬Î%4ä­ÉÊ{H´Ð FÈ!§ÍujljùJ>vážÖ%=¼ÌfñŠÐ ².YŒøäK›|äDޝR‡¤ûOŒÌŒ–iÖ±G›©¿CÔå•¡GÂÕ‘°xÅ× ô<ÂÛÚ"æ}È>D&6Ì"ÌzçXÆ#Qšº¸_àK «î?~8É'¯;ÝÊÆÙ—x‹IÄÔ+ »›­°˜î®Ãz§ØƒÏÇböÒ\øÔϹ$Žü2Ë'5@¢MäâeYõ©>³ú:TvIófgpìÒ{¤Q’„LÉHÂøÄnÙ[G0SšÚ ¬ŽÔ­ßªÐù5'lŽ‚Ø7È+D‡T¹c|4“î›<Ù`´*(„«šô¾¢k&¹6ÈõÚ `¨+e¢V®òâRä8.âtŸo²PŸr$8ihv_,™LÆ’ÞæfEsC(EÝݦ)øõÛ·?Þî7dáI®¢p„†”éÙ÷I$ˇ"0]õhL¨ "VYtŽÝÀÈþŸªŒ(†Él*,>Â"\>¼ ´¢j(A«£TtÎM¥öA·d*ò`oqŒÕ[™©¬©­QÂ}º»ù–oÞ¾*Vá0Û"~¯É=RÞ5¦Ž2|<á"áâÀÕ°v1\w Ž®ÓÇð-žÉ÷EÎüáJÓÎ>/Ÿ‰áÌ×<Ô<šÑë|ìA&‡FÕÆƒö`ÀUa$—×WªÆÝ4 ¡ü˜é€ö•“aôüboP€´(È–þä2iÔ àv¸-÷8z`ãPdtØüS¢dMy´65¦¢Óq±EFÊ\ÃGº³7@1/ƒdÓì,$`åwNaZ h +žÖºN¡„Ÿ ÛÅK÷ÊòP „#SJ±˜wöÚᇢ¯\øPØ‹~<Ä·¸ìÖÖ‹¨Qjì{Ì3HŸÓjzäfÿb³/û L>¶¦Ãäª'í§’Þf+žZ7£ÅÔ¤²èä“2¿£(OÞíÕeýúý?Ý3#ïµÇÞgon_2ꕆMu«„ø„hjRÛíø5¾¾¢Zžlsç„SÙ |“Q$ô€¤´¢Ze®¸e•V½  h%‰sŒFQºkÇ•f  ®sãáÊ“Py°Àž5SÐäqøk¤8Ф Æ æB]Ân¼:j`³Ã¶¥×ý°L0±RV¥ ¤W¸®Rã-3l„Þ‘£=ÜN߈:“³|ÇPl»ªsJ»%sA¥äg×–Ùö•¦õÏ£’ú2( t2rIIRñe–Y]ê( Š¿¡ø=,a÷ù–í´¿ç4´æ~ÍhȨq`ÁÞ6Þ¯‰Îв‡ç”Ò5-'§ìAÊüAI6`&®‘\¡vþ àIÂì: O b-Eè!Y ïÆ+<,CV‡—Ý[ǰ”JeGˆú‹¼0‚C >ÁZäMÝüP¯¥º/z*õÐæ´Ä¡ÀèË÷íó§[jx" TILùбD$ª}²í÷ ¿ÂQš¤î [z3n«¶¸£0 ÀM™/œ7Mb†ÏŸœö­Î¡àº%QÀšu¹D^iõ(´zü†$;›_>)ƒÚt—v_TqðwgÔ)w2L&è%ŠF•H ;¼íÏtr€» î}ŸJN‰‰ª¢K ÌYRûšpâÚVÅ_†_}\Çç÷…^ (ñt?Àj‡T¡±¯5,…¢Åþ{%kç1#f“—+ù™š0xKŒ]¡»¿·Uƒš¡1Ëœ’ŽF(fp'̶UWd MÓ(šƒ àf´Ø™¿W7C=öã÷÷¾¾1W® Ä_×WÕñ_Þ½À¼•ß)»g.ˆI:Bö¿óÃ8;-»þQ wxìÚKjZ /)$P§cÝĺßQÄ öv%©m ´¿B¡»fa¥ ‘ø³†8‹óÜBîŸíÀƒdÈãÞ_¿~ÿÜŠ¹ =+hw)ó]ûPWê@]hzYë ¬ö‰)qce7€e[9UÖ UÈÿì>à–„òÞ†M?5Ò:Eà‚CÙb¹ƒVûoü\ìï]ùÿ{= v.U=Q¢C¬éÀ¦w ¨ñYw,ŽÖ\4€#`PeÙ¢‡+-­wöŸÚßx¡QÚûgÀA¼Ü¸nZõòÚ¸sèÛÝõ"} BÍÑ¥VÃH ]û(…@ÙÉr¸3*„¢bz•y.¹¾r’çDÉâ“¥…quùéye鬜[î¤B·zA°é¡?Ïý¾q¤<Ô4Û½A‡:) i™Aˆ…½Ë“ß-“ã% «˜y`XOŠãœj¥Á° *wúz¤ó m½¯5ú‹¾Î†%hÌswéBèÓX‚ÔáïÚ ‰‡¯]ÜÅTí'j¹*Ÿ|½=¹l€È€Þ¾Ç×oß?ß?¢4•£Á —µù@t-ÿ¸šiVP×ã´Urœê)Š-qKϬ*ò~ž%—˧ CÂ)ŸàŒÔÊÓœG©p¶ù’f~ê»? ðdb? ­ä´zC„sŸŸé µÞ ·îýM÷zñ|Uû(ŸÄv!Í¢˜•5±x¡HY*:Sín=Ä»Õ[Æ®> ô0_.‹–ຠeáºVÒ q²D ;Ô1¾É‹ŽÞí¸ÀÙŽæl‚l?v·Ç`2½6<í°Y þ®šXT+‰ØGk'»Ç2Ž•ºø”7m#-˜!›ê€ü7[* Êëc«º[•_æ|Õâ18ë|ÖR ¦^0Ôhšß»ë®Œà¢EË„@Õ–ö­—R…OÅO€Þ8u—‚Á£B¼yÞ-H¬]/¸û~Hz¨ƒ³¨Óp iêäãp‘uPìTU€6ߟû©ƒ¾½’:‡Jœ@Wª" 7õI½Åû€;2©~îqÀ(f‡³)RÅ$©þչńÚÇîö>E_]U÷ñ43ì¼*í 94¼˜‘Í£L¥Ž ½DJÐ=|æ¿pÖSÀèŠ (ùh«Ÿb·E›Nûgô‚9ÿEâ¡ð `t&”hüxƽ½Gë¨bdÍ›RŸzOhÇ«ÓÅøö»™¾ß>ÝnêÀÍArHÈKU¬ @]8 )µ2Gè–!mÅþ¬{™“UºÊÚ‘ÃU%¤¥¤ëû?)èjŸn%¶E¨±NÅÅ>¾Ì§Å—„ÂÒÆíN£§ô!ƒ_™îŠê= B×ß©šÚ?ø26$þ_x9² 8äÃÍÝŒV2»ƒÃs±§®ÁK­r’¸¡È¡9`€ëDZ áEˆ9^¢-†®»(! ICÑÅ…NX«Ha&‚\²ì±CTam­Lr£iÃ’QVÅæÞ1)å{Muco³óØdäuÖ¸rOå[ÝBçù‘ˆ/CÜèÀXs¾ ¥eê Í?ɰ- ·e0s(b#÷÷ôÚ†Õû~@\ÓÖ· N_dôÞØß±4Ž“¨MAå(„—ÖŸÛ: hêŸx4ƒ“ÉOs!‚ƒÅÒÑ‘5lc ¶Ôã)ej`‚5~¾Ì6öмéò¢Ì~`Žó8B ±Nïø$:¢Ú–žY¼ÎRÈ ±&6 Ô"Hwÿ~\íûƲ–æ‡ÒL“T ׂ€s‰PW² .øW4À” ¿^ñrá7îsÉôÝ?̈ïdcbJ ÁÃ/à QØ}°È¸«ê>*îeüô KS~|ü½smišs{g„XÜ!ÃàÓj_j¼Ñ/GÓj¹³‹­õ~Á•DZÍEÌ¢áî`äy1û6”ЙÚsnñóÆÞn›ÿ¥WãÃ:믥Ƒ}¢›î::ôQJ!jœVÍojE»Nì3sm\É<…jÝî7ÕÄ÷t*#[›Ð1 gK½ò¢Õ6å.%]°w—å:—¤Fžä’XïÓZv¯É}èÀ]Ik|–/Üì´ë±Yèžp™Mñ±<GÔ¢òZÑÇ6åi¶o-QþÇùjÉ×LšÃ†‘Ý2yÑÅ–Ç© ÒÇÕGó‚} Híñý;o·Â8wJ¦ìbz²q 17Éæh'̨#ŽìšÒ =¤ÀÃ[Q÷Ae—‘‡Â«<»rN5mäXJò²~-9ËäýäÅÑ91*°$/%SöÄäìCÎçkáÙê¦ù_F\OWŽàN°©j¯&=mnÖÑô³Ì†p:˜©1s÷£p'ϼhSLjŸ€UI 4U;.f‡ Ã>k±O,x­±þ)(èУ·ÛÈ÷¥‰ºG‚@]w;ëD×™läí 3ïn¨LµD)ÉJÌGA”•–kœV TÊ:ÅÉ €|9!mÛ–$æõN2 ˆORï/,^!ËMØéÉlu‚V® 5xÏÌÓßá‚9¿´0k_3í€JLÒFƒ/Õ(›’1‡Š~ä›Ññ[±[ÌZúË4}ö¶ä+~j^¹*5!ª19£ÛҰɓ늳Ïâ ­i®A²Åx¸`ÔípoÚipÔVèÃ-<'¸hËh 2Ž]úB»b}©Ê]ßj„W¥¹dŽÿ„fµ’èñ–!ðZâ;VøVW8ÝdR \ö5?Ö¢¶¨¼;¼F‡×C‘¤r³w>N½òú•…·DT}®÷q:â¼%Ç‹M×@}ÜÀéODkŒ©é—´Ï°¾‘V¦HAÚózÒr)•n Ss«õGÈꊬ’šÎ•§pá ‰[#Ÿ¨™bÊp{Ê,“‚XeqnG{àñ0ÝþÀUJ˜b-ä]±&òºd»©0–H–UYhqqb¤È gûŠ úfJúlMD”-Pt ©‹7a”®rxr¢žB€âDÿÅ…7ç± Ñ**øÊÑá³ã°§8¿1\7ú{¯ŨI£Þ#-ˆÀäj¯†,LH£þë‰a_Û\ ä ÑpéúŠ/¨ã¸|8ÆN^¼¾ÖÙFçJpØÿѨÅi5×t¯å:äÊv@­ò:/5eÉû^FŒlè2‘‡®ÆdÎDÃtÏå]†i®ëÿèbì‚]qYuÒîí`€Þ//jûÑD>'>z×ÕBÅ…H±ˆ”ÊX­»(»¦#Þ¨]’60å”\`rÆp’ óÉ×ý¬xeXà”ck@5p°š‹aƒ[¥À1PŒÎ•}õ/¤ÅÔEq#-Û™*BÖ9wSqnŽ¢<~{æ¿)j8©bÖÊ_Vv)%¶—tÕºuÉ™¶Ó}íot’XU½K(/#,_è«‚)¤˜­üœ5XŸh9NçôŠM=X/‰¤Ÿâµ0+™ÆÔWpEÞá2×á SU•™‰w&Dt*»†‹Í¼¾‚X` €:¬Óž!‘Au£H1}á)‘¹nÌX*²%&ô«½*X q5Ú2ðN07TZGwþ0sDKD}œl ɆgÊS}õÝc]tW+2zªµNñ}\8ÙÅeæý.ËÌLôè–@eê?›iL _yMÙ›ÊÚdíI&n¯>+ÏEþÒ(öw:Hî ¸£~ÓŸ7®p¯¤oð~kÃ(sèp&ƥưîG{Ú¼u"Ÿ76»,ÖözU8KýG™Åîìåx 4–P=…Lü±=êCL>ñ(“æÜxÜ Ãk ±Å…¡åx‰ÞBEàûlõÊeäÚ:º‡ü02²Ê\ÅF‹&òÃå–~fÒìäílÓ¾IrÕ¢ˆ¤ÕU@]9 •rÎø,êc ®âßT#ºÕYsHåyµE’HÖPä™@ÓÀ˲K€çç1 ZIçKãœ$ȶ²eL@*¥Ù+Æ;¦"™¦˜ê‡.’ÜåaH¾3^vãø.²2=D±ê¼“.SÖ>ƒ{ŸnÙmY¢ESAi0Óè'ð h†x‘—t\(‚<>0©v°ÛÄ.3ëh€ä«ÝÚ~G%ïÐ/[î@T2”C©ò”Kíuj­¢˜¼¶mâm(î¼ð‰¶Ñ,Ïçä\@gÂnÄf84ß-ìk/~€Tó/÷.”_gø`|L¸f¯Y¾Â‚¼®WY}þé>oöŠCT—© ÑW&ʸŠ!°¤ËMvÙGÃŽÌ{è¬ÝÀêét¯zƒžÒ"ºwÊt1M£È ¹Š|»Öd„·)¥t:Öý>?’#pÍ —¹Zc(F®(v¥ÂÚYliƒL4žˆ>šÝò÷Ú=@+7É “<åŸùÖ^ä{Ô䮑µßIGa%ÔEy#=5÷¸µhK•~%¢;Ðxè Ò’”ÉcŒ[Ü·Ú°@ “´Gî7¨Š]NB°8UÓç[ú™ç±¾‘c$:/¸–ÀÛ›YŽbjˆ×ã`¢Ô ­à"‹G—öÀb@”X”šlÙßoX7&KŠÈk9œWr÷ÌDƒ‡PE pÑ„ Öˆ ·3±Ž® 6ñ͸°j¸~J­=­eF±Ûá訠ãÌÓz¡‹þÃ˽§¥N˜=­ñ3î,´\£ˆ© “ÖŽuAÙíW]uÝ£ÉC–䨦M§Å³¾- ôÏ¢”Ë~ü“ah*q.,hup Þ*¸|:p›f é#_Qò)n]5Ó3o)[ýß÷OÜró$C?£ŠnïÉôˆŠ7ÖUû²¤öã<â8uêxåhè¢vÀ7Ï»?\® § ///Bƒ‰ÛìKUÑ;hPŠ?àÅzqŒÔ%¸¹L¼~Oòö³ÜSƒ›e 4¹Æ'kNÑ¡ vÌJÿTC Ž>K®ÂC[ÚÇÂáye£ÁAiåí{~#üD¨Ñ»5¥XÝòÿ'ׂ$OÞ©Õ§Wë]´mÓ³‚Y®«»{Rs…ãïÞò™g&à‚á8Œ­ëWz‡¼´ :¦ãÕ§ ôVNE?ƒ2} ”ßóú•…ô#xÔVwÙàÐÝéÙžnÁL™D…ìªRºB¡Ä<Ù.Id›Y–_Ô—›Òf–"Ï]œeµO!y[[yÃHU×`Á$AÊßQ(NÔd'QÅ=ˆ™ã…Ø”1;Âò×Ü0Õõêý–Ž4ÆurË-×@Ï•»èU÷ˆP¹x9]sÖ¥–ãv °>d‰áU7½nmùN!>ÌïO®/8ˆ&VZþr”-~Å’ÀeæõF¸üÐa$}b0Ñðk!·:âðÃyí&·êšÀ¨Ítªæ5(òš²£MpÏGi8d÷ìØ”Å%Lzœö.ž¨‡h²½–sf¤¿­`â ]Ã> ”êDNL‡õÄÒŽÃ)ŒqFè®àôƒJfç{pr£ê£WîÕ~±›¼Ü›3-×þéïÒâg£[!Åöðä‰ûC‹¹E霞ƒR—dÈ'eJ†ûgŒ6ûaEIuô‚"†ìEƒìW\¿4–³Nà‡óÅœÈÇÔ&#­¥]ùO6¢öÚ:.5ìÂz¶ìÏݪQG? 醧ëÉ R-HÁÚí9¥ºfqwüaHf ×™Œ{ꬂU”Jžq,qLŠ5 ÞŠ­ÎŸKóìJ²*Jš}k¨WŸƒ’ÖÉ&þ™Og0ͬ©KQW:î+æcý°JCœ´Éu¸\Cýhî><¾vˆ¯w¿W‘»#%wý„&í×÷´"|è6¡“Á¡ *8wõJ+ v Ýi¯ÆØ W#D›ìÅÈId]ÃÕnT¼0.åÈk±>ÙöÄ Xó2Ï\aR]ˆ  EÇ-Š,5ê2i„S×Î)ÇVïìýƒ_£§AÑf™¶†k¯DçsŸÈ{ÕZåÐòFѦ-¤|bõìPù¡Ú«ØåS€Ã åT•S <åEÎZ¶‘È•eŒÿx2fÁ¿°­-i,SW—Å ek5Ô¥Æ.F4û,΀$Ôgüê¸Õ d)2£Doó¿9"φýöM,|¯†žHV[’Ù6H'çòL¼î©Ì/jã’ésë…œ2—´:zÐÓcTk¯(1xµmC ¹¤éŒ¯É¾ø"wÄÔj¢`4q67\ §ªŠâ×âLØ—Ô >lEŽyœ ,p\<ô]í“BzV~ëÍšÑøÛÑ7ìý‚ÙÎF.5ºM b õW%6k#[¶ÌÏddÂLõØ•jâ‚‚Ys‚#I 5THM2{îZÖü¨”»1ÑC\X¬Ù¿È9S±L~ÎÆè˜?øÆ©¹†¨>9:íÜA+ú1,,QÜðn dzèØ19où¤VT½+¤¡DzYÓ§nA÷º•ã<ö·ÐŒfÙýhž8²_1Pôñè(¤¡éNëÖ¢º|Ÿú½Xæ²`/þÞèb6êeà°hg&`ÂŽ%³Ð£ZÜ­0 ê™åG¥ÌB¥3ü#¶DÍ]Ëp¿Ú°û= èìdê\ï Š>9êáPÏÖzSx+úF¢ø|b®Ý>k™Óê-+ºoª†ª¥ÄtÅè¢`—ᨥ_E^•€†GQ±C öÈ`鮡iƹ„]Б—[ûƒœ6Zcüz){g<;´ÇQ:Æx““u޾”ó"ÐRSÄž¡†^¨¥»¤“ºªõå%#éI¸N…lòÎørUÆó~?:qÓEÇòǾ-‚SRÊÞ×bjNš5âźÜ)v‚ÕFôo½ƒ­`ý;ÆÖ(:ÁâLœÀào ·äØ@Ò¶§6>5' `}”£“Ù ×B,ïÈÀ*g>¾F¯b;݈¾CTYgÑâÁè—¢çÆòJ‚)Åy.Û¤•ê¥fªNšæM\!vøÆ&"ûEr ¶‰b½÷]žJˈ•cˆÄak$Ñ¢qBJfî–Ëqëð³EÅÎz„†UèHªÇhšß+È øÈ…{·à ‡ÂNL4`C…÷º,ç%ÃjOÞ3¬~ÉÚúªI¶%8¯FÇ_Q¢WIjWꪃ»*CÐi õ+ov»x S[¬Å5æÄ·Åhp…O_¹ñЏ¾#{n¨Üe&x­~³íI£Þ¨63¡öÒðÜÅþoãhÿ´Ø½D@YP޿†¼ž®2_°3`=$¬vPþÅPs:QTíÏYêû<*œsxÚ_´ã´‚ÄåçRÅÆ ¹ÐÃÅW¿h'ðè£9÷K˜Ï©ž%5ãâRGу¸hù\ðÝÚH–R¸É2CΥ膇ã݆‹PÒá8kOEÉa+í¾­œV؉¡±5ÿ~ 8Þ2ÁÇT ¨kSÕåSJ_Í ªâhÝý—:dV@”µÜ`BQ )øúSPeÈ…M¼ÞobùcÑ©éM@p}‰ Ô)Õ‡E2+6‡ &!«·§¹‹à‘EÁ×u ‰óUÁ\´'1ª¿üƒç4È=‹ßݵ BÉtõ„ëÝ*ZXEBŽ/3ãkº€íÄôÛô8Il–öõ~Û³ fDêÆqWF*wïkÅ+Û¯ü Á€ÇØÐæFÔŠ©…];„a0ÓéwY_³>Bó×÷ƒÏŸ¢iï~oœÀÚõãt@ <í¦ ž ïB¯Ñðã×çþìmZŠdF3äC(¬ŸìAÔ+“eGX‡îÕNuŠ\èðiÐcXÍ«-¹³¦&ÛÉÞcÏx“Mq€³‰ÓKÏ×·.P™z¾HB*ÿ[iõGÃòl¨5l+_ÌPßZ~ì%hã5•á*rßu2}Xu´¢Há@CFþ!t×ý„ z-_Ù=+K5ö[ˆ;g"܆ޢ2:¦l¢QŽà—T_Ú%ÞkÒ,y ¥7§Ä …=ή¸jL⃦ ©·„Q –°t(Vw…ü.è){Ãøä K†Ù÷ô ºÝ0lq€ŒUt¬ªb<Ä.×ЌދˆvÛ&Ñ&K®íúŸ×¦‹(Wa ìJ®Þì$êA¿"+µ(xî°’÷…;¶ŽÁxô:‚z:ŽÊHN–SöåÆwY!¬l ÅŸÚn4JÁÞòS—g{úlKµùmDÉ^’ZŠ1%€ªV“rí …Y…$|5º-7§޾!†5=¨³iOzJdºEÉÑùRÏÄ¥CrÕFfÄ4Ô7'0ùEò˲焓Žc¼®‘ñÀiú­'ϱ ôÊ@‹Îs¨&EŠýж3’´ÞTµ“ê0òäA‰`ªƒ`8õú8ÆõìÛ²»¦ÑÕw A'°%yÏH«Ñ?$nº­(È ³"a“œvŠË1ÃÒþÀ¬—H «à°Ù;ß2dÇãʃÌw°Ìw¿_rKéиêÂ’ ¿ŒîFƒéQ›y(xÛ©#¡#¢:ÊÀæÉ’pÙjSï8´¡sµøÈý`‘:Œ™žÙÎ 3Àʵå]v/!—ò7“Öî.tå­bÄ1›ðÊúñ˜ß aïÏQ”K‰Ä¹Ëͬò>GJ(Ú¢¼§ÚÃbŠl*T¡©ãÞ­nQé™z…žï ËöÊïþG|ÿl¶k©±©‚»† g•¾†¿6v; DÏ?’^´EíHg d‡*ï¦PÔ‡g WÏV“­³ƒ… †5 W7xÑùO¸D×|2DÌiU¨‡T°‡.JW~¥ãôÛ¤–ö¤HJ(lƒŽÀNát츜ýÄØ3_]’¬ÍZK²Û¥FöÐSre³Â\.ÙûXGéÌ3‹ ‘ñŠ<Àæ,\)eÑi¯Z­±Wíìÿæ>¶6‰xCÝàU"¹ˆ÷ >ŒÔ\°%íNªˆ'^SÍj–ÝYF¨"ó›Ðù¦ÛhMâ_-&¼8&w¾;³uÑ`Fà_/«åü†Hii¯#˜*L~Aa¤Z‰Pd 7T©æA(\O‹ï(©/G'¢P!ÔܫⰯpy8䲃ÊãîŒCç¬ï\ÈÊ)lˆl° ÖÓÄ&>°D£ªÜàü&‹ŒÐ(é2vÓÉjy²\ÕÂEÏ¢ôÓ‚<Ò¡v-?‹™¢g•¾¢Ê¯kÈ)W²oªÄ4HãJrÉ+¸¶$¶žcºèFhƒ1:òþñ bWbrdú' üˆîyæ˜ë*݃X2…JKÍLsD‹jb„WFvï™9/§¹2&h“ÚpÏKL>Á\¡Ê[p¸ ^ p2Î×öùîÀx~#ã_´2|Äè¹ã5 ÞînQ¿Ýû¬5Îu#ôW(Ùƒ#K ™ØGˆä ò#MyãÊ`tEg!_¾` }ÎEüܪ­äÅ^B›ÔD×X’h}³‡~hÿgd­M‚+Úo#4„ãɵªJï]ðE"òó)»¦ ¨2©WÆwÃVø'âY¢Üé¹ 2¶T‘Ë ¯MRª3C\òÏßëlYúV`0½‚é=? ÷í÷©aL‡KE5Î8ÕóV¸ÊR7í|À¬º¢´u÷)=”ÉàHèî'6œ±‰Áãs”'̹‘dõ[NWx][w‹´Æx¼ÅWò,Wì²/c“¦wbY…áYøhõ,;.~4= •]b,•ùBzCV)¼ ~eA;>³b¶1¸(!¶vF‡Fÿ-æ–€#IAZjÉXíæ)Tì³»$o+{ŸúeA/NŒŽ•Q¯SØÈ»¡OG?ÎîÚwÈyD‘nòš7Ô‹šû‚¸l⺣$r,F³Jh‘BDË Î´‘LÝÚÒð6o[R‡u“þÊÞ‡ù¸ÕYuy‘•úbztM +-µ÷Õ¥q¯€º‡ƒî¯8ÇÊ'†3eðÝö^ùOeÈ ‡Ìñ)røÇéEM}Í®â[¡g¸³rîžy\Bõ$oaîÔõ`kK:–P}ÌLع®>&uW3¯ô¯u¿R˜ÔíüÈÙø\4s&M!rkZñB–5V„ŸTž>h0V‚þà ¤£ÜíÕ྆ZÏŸ`„~ئ¥o­þÂ{ Ta.MñÏ–Á³×·Z3‘¨¼“‘¬j£¨£¥(WŽò-Ÿ”ÛÚgîΘi,°ëœ›+ƒ¸‰v$¿FcÙFl¢ïb䎻«yQ’’fý2¥ “£Å F&ýµ÷èsHš†6TÎ}Ôqá­´?à ¼èŒÌŒªuï#a¥-ò”0¬ÕGÓ5.8²°‡]†Zy>ð$‰}H¬ Oþ(pJ¥åÕ¢¯Ô³=pÊÌ šU@ù˜”RRm—˜QË;I¾3íïéc?ŠLé·ñîzUNL`þ›n³Eiw2ƬTZ`Ϙ‡Á)¥=DvžÌy’áŽÌ2ë*ªzÖngp,äJ¾~MŒ‹Þ©¸´M‰¯Ç¬&¯ežnØ ‹iÒÒ–8ÑÐòŸïh9y&qVÍQ"LÐ ~Š4ÔÏÍ™‚…L4‚^‰„JèÓw`ÞÔÅðÃå]óÊ^à÷QÍNôM[òû¥ éV Ê8Ç qêöl¸ÎBÊ­ðù®Ð‘lgÈäœj+F‚0B2B œpU»ÊrÃ`Ë1¡¬Q¼²ý_=ê3äÚΨ¤%P­.°]©dähe(>›ñß­'¥ùÅ%îßî…ó¶ilìf­ZØtlˆê!ö$zD¯3ž&Ô4N°Ò)Ô}1K¿àŸ¦>†Åé’¨IÖL7ÆÐ„t¢EùØ>`Ëæ’å”&_lB=wMiˆ$¸óô™½^ÆîáÿëŒv±£©w€Ü ‰Äò’#Óeð¹Hmà}~°zÝ%_aøsËBJ¿f€ÃBæ«3Нs^O*üSGíC~]¢ƒ±qÙ]9p&M÷€ÔcæÐ&´·èØ5 ‰FæÒæˇ«×Ý¡Qô„`¼æe’;ÃP‘˜ÀwÇŸC¾k&œ›º©æÌ4ô!Ù&ýÝ·…Çg,JÅš§ÀúK~ÈNÝc@x÷zDŸˆ_öß¹šð@À6¦® }‹"ÕÌq,팴I<;¥ a^ÆbîbÄâ§]óQ„¤^(nO¢cp„ œ_â°(m™'š<ÔÑ^‡$á‚’#ó‹¡›½й1’]â⪔FÐFuÃpxsú¢Ðy#•ÔÚþ˜õÏ'OÆ¢bf>b”‹«k^¢B ÝÙ& W9I#ܤoe*N“ØŒXœ¶,£XÈûo~Ë¢#…úIëÔß½ïG¬¼¹(ö:!¿›|`ßoŠR@Ü( ¯8£Ô¿¬äs· Œ^`¢‚7­Òt[Â6¬LþÒƒÀò€Ñ±¬ÐÒI1(vrK_›°=FÛr-œXÉR7\`9<Þ΃+XÕÜ×QeQÇ}8·$Þi3J±š8¤nY§]›Ÿ;#ùë¾½Q˜Ž zþ8<ëeXˆ·?×rËpåÌÚõUbéS>Þ5]PX˜k³oÔʹ:–9?³0:—çzsû®i`„¡[_Hõ -²ÍµéÅ ªdBºBÙwäöòUÃ2úõœú€Z®òìÛ^ŠU‰Ö9;EÐJ]“*Œ•— Öh³“T MSo6h nÕÓ0xc7¢ãQ  ×Í£'ûv_øßh,¬Ç r?`´*¾L½¬•`XL°‘꘴"n÷Âì|s0˜qÝé\?„` Í¡o|ºX¯D™^_ºÏ;~_'¤Žç/± s2V‰Fû¹BíbCʼUfÍA¼>ƒ˜¼ÆüÚ—±Û|Û®‚¶££rÀP &®‰CJŸá…,Ynkw3øÔX gÆ‚1Ÿ†t&çȱ–Ùý5“á_´I¼êþt²â'¡ÊwÌÑÛ5î YžÚ«|ÐÉC<’âüJï%†!ŸŽIÁlË3S7Õî¨kðYÕµÑâsp᜸•Za@ ‚U‡å òékGË× OºVãš—˜l‘ZxZ~Íf’‡ùT¤Åw¿/àfx+×úÂ4@|ÊmÉuNNW®KÁˆ AB¦¼pI¨§Ó ô΢¡Æ~L™>Zn¥¤ô£Ùv_}œ´à…–9¹YšÂuÈs3€â³Gø,×-¢bëÀÁÑ[~eHú•³®kÈæ@uSQÿ0‹àQú ziI›ãpïeZÎ@µv-Ô€ž†9:¡[+¦4×ràDºuÑ&Ìu·^š°qh u›Ø‡dZïE‡Ê=¶mAÅx°¿¼bW»Æ%äzl*âH}k6E¿ª±ssi»ì\ÚYµdù¡ ì £‘&š]—áÏs{­­÷ĺ…‹é"KÖ9*IÔ¡ÔÜ­¸â ‚ƒD2I |µ.¶gñõ| &æA‘”±:ö`tj ìN3hVˆ§¯ï°dñ:lpê.³çÖù¾¨6®!G4)‚Pùoh¢E)ƒ•+ˆ™V“Ö@"¦S1(y~_ã¡°õ¢$×ó´RÞßÂÎ=+rìb«á´]~pÈÚ†¨ÐiŒ×™K¸D5ú-ìó–…ÎR{‰¦úhíFg_V˜óL°©èó¨î¡û 1ì±ðS®OÚ¯só~óoꯤ¬È‚ò¥ø0HQ(xÐé¡ûáêp‡^Ì¢¿9r` åÔ“’48¨âÉôUÁ„bÎåÊ:Àè͢˴Ÿ䩻¹;È´C–-àè{*Î÷|HqZ‹.ìÕø9Ke¬„6HD·™éµ&è$:«©"1`]ù}Ö‚Ë ƒx¼äCµŠ`¥‡9‹é!W(YF ì.llWzŸ·\¢øÇnóV]²×Ë/Fâ¶ Ãbÿ+åk ‰‰-Ëô;I3tóUO;"—[.âœÎ–Íïïʶ äl¶Ý8醩' ßlLUD³å×rÃ[slSa¸ÜK¹Û±þ¤‡@\º…¬˜w”ï"¥Fajö΀§vM5½9²ÈJ5kK2~DÊA£G%èåÌ)LBÑãLõq8×,@N¹Í+Á™Nˆ ‹Ö·ò'ÞÚî*Ä÷bXMéÜ21ýºñ~„ÔÖ-Pìª43š&õðÒöŽÙ¦Q¾f|úÉ–€Á GVÀœg£Ymï>?ËcÙKM=ÙÊiH¨}…aˆð»‡Â®ˆÌ ï:4W:{8Wj$æC‚ƒXäÁ*ßÕ–G•?¨vöˆuOs:XI²hW‰>ÏRJb½ªr.¨â¬´‰¸Öÿ]UñðˆÄÌ]ÏÐ~-Q7÷oª¾Æêƒètª>š›I¶ω úù:ÒD€7Y~åôä3‡sˆoPH„« µuEXéLõún9 ‹‡ª®Z_¦%b¨R)He > ÓN¿à°@š17úïdåöã Ý©ŒTl †¥stQ ɳ޹"YÀãüˆöóÀÜGš»Ô¤]¤*æ”0¬›½ŸBÕ'A—ÐJC©üó iC| ë ÐÀ“òå0;ODô=ÿè]®­éòH†ò쿟ZôLÙÐw!í(%þÕ–¢yÓá˜Òå É8S5i…(°ÃXH] ³¼"T )pgû€£Â­Ó3ÇBÀ¼@GËï9kgË`?tB ]ˆâeá/P0äz$°5ï€Zvw a/Ê ±€ ÈÆ³ ˜œX†4qÙ ƒŒ¸Ø&¯n åk1b…Àd#7¯ÌªÊ}wdqÉ.¹=;rþr¬â—š€r³|T]êéöèÜÈ0’rnUˆVÔ»" àBì¦TX …_—è-½½¡og âå…hÁ0zÓoê*ÌÇ XWN(§’aCfR\¤¨¡:É2làloŦDAÏÉÊñÉÒ{?Á¥Ç7šÕX9[ íÉ“ ‹òçœ7Uà`Ì\ÄwN§ãµ]=’@‚A.ðod'×­Ô¼Ãæ§ÐV6ïkå=øÔrv›Æé‹.¦ß®{”z¶çç›§ÅÞ^2&9UϺ‡Z^Ò"ÐQ'ø=UjȆ¶þ¡Šòfoº.,Áñ~îNY»©ãe!eµòzÝ}@+tf–J!väWΤ\)KŠ×ié®R¯Ë(.;Å:¬.ø+ƒ›Ÿ¡¨eJ iÂý•ôPi±ƒð”8ù ²â!Úì²4u²dI7¸4Ù×–žkfÍEb+Šgeu´B àX“茛$>smlpŒ+£ÿW¿žW´­ó~’? !¨bzaœa—Š@Þ–šmž¾žÜh¤LW½(Ýj ‚"ê‡ÑõÒ¿ùµ\Ä‹cÝê³Qã%è™ÿ ïÆðo„óóp‘¿—">ð¿;£Õ¯¤(" ÙR¨O ¼Jºh¨ƒpBñRšFßcwq®ÈªØÐŽ\ûùï`ÂÖ­?©>°é%Ìç¿ùKäcýè*͵:­o§³2oZºÁ¹EFÄŽN–KC÷Pƃ°s0xw§G}¶Uì„¿Ìë°€£,k¬P4({Ú¹êݳ̰Ƣ&˜%Ù›‚jBKV5ŸbsЕæ:•èPOišß“Íl±†Bjl.šÒ|jqï[×¼°|Êþ>_;ÜÖ&Bôó”ùv6š7pöšäøZ\„$Eìä Œ¤ÕH"²;Æ["šjXN,X[†& ‰w13ÃÚñ0Pø}G ``ƒ^UàLý×û¤³ CÕŽBéqSåÔ~X®nÈ꛺¬jvõì´g‘Ÿ§µßÉe ý<o¾ œåJž°zŠÖ£“ššÕm¼c 9Ýk³´ð>ÅÊÙ‘ŒaÑWçü§†B>[ Pêú¯O¨ušÝz%àêðJ#œÙ5ÃÙX¨O‹øy.]ר¿j8wE…¸‘ª4n+Œ=Yðt'¡WƒnóQ[Ã7b¥âÐüÌèv:2ÏRÖñ;–r(Âm(c¥@CÖµ•LÄY\èŰ8@ æ\•ëǘ8w%ýެi¶ÉÄ} p«ˆð¥±Sátx4:ݳý×w‡ËõݣīÐòª®D ”-žÓü¬³0¥3»²^7'OdüÆ}öbdN²Þ;,'˜¢µ„í è‘ÄJ=*V’nõ4$ñÞ0A$úšC%ïi~/fTçrºôëJ@Î=„ãi5. U1`›3sµ!Áˆƒ…îIèàI©·Ç¬¥ð¯)'dP÷J8`.(ÂDnŒb³©òGCkÚr¢-З"ßÚvGÚYq'—Ä–Ó…ZÑ´h¬Q™Íš¶Îyûþ7Œ, ã¾> @Yμxb|‚ÜZËœýý(KÀŽ›yìßO¿1vGMC“ZEÖ&pœÍjÐ82™„ÅìÆ·¢ÃÈ»[²Ÿ‚ ´™m[üþöêÊ|-ǧP“$= t ÑzDZñÃTt¡†'Õ‡«°ÎŠŠFw3Ýh„S/†®쑈×åЪžgQŠŠ–‹Gu÷–ViªÓù–ñ0 x†}IôÌ[àsÁ ^3 lâówÞ!室jéÛJ¸ö_ïþ“WÑ­œUÅÍ<écÒB†–Õ¥biWÿµ3ƒ0?åhòò§s}G \hÐøë¥²v!'jŒpJ§sè^¸b‡6™<¯U=Âzµ?Þ½–….Ü_c8„^!p$阦Ëã73źÿl‘AÀ­'5_ú| ñÅs5a¡žUëÏñ‡Ý.¿Ú«ýýSÇ“úB:÷XüúdÄÇÙÅNªx¸ÁšàøØí;ªõØ%\Û{ZòÏ8ZªpêÞú·¼î.ÌuÂXטÐ*'¤³×Ć¡è `aÌ!´2í!׈¡v½N´Î?m‡7;'Ü*1gßOé«.äp¨à€¿óºTvsl;l]á ³=:ᚉlnÝŒñpŒ³òQ˜iý¥°Ìš;ñ@ôÁ6“QðS·#,;§ìUm¦åÓçGáÖh°‘½UæÃ¦»“âõs%0.ñ+¦g†$ ƒþ(çÚÙY?(÷€ëò _ŽÁ˜‚;‡Žôqé…{ƒŸJ½HNl`TŸ™Å詇•z9çRGçzŒ P®Û!zä4¶f³WÎðÄèÉÃ!Íìsñ¾Ò",5âý¸Á×r”tÒ+HÛNcðÚ㹓þÚaNÌäPŠÉ=O“ïÆ‚_õ„:±¢WŸõ÷P-Ï‘õÉCwÊH7bwBGAƒEתK~þñÚö´DÖ¥Å}>j¼RÌ<€*Š%Ï®…èd°ÞþÈKâ f×0¼¥7¿Ô>›ÞŒÒ¯Œ-¾¨‰†v.•µ54&ŸµLÈ{äoÞ'iJ8/J%8ªM`çâ6¬9MçüP¬ú¿¿å槃á­Ín9?uTM¤,!xó´Pj‡8­ÚÅQ£ƒhQDj¾=ãœ3 •¸Zl=Œ©5Ö- RÄu†ÌH^&|Ë›K]bGÜÆéÃfnÝ"§Ø°gŸsaë«vÆÊ‡Q礰h%G‹Ö¼ãgÓF³ âÄž"ª^‰z—`õ=¦øÔeøá3ÿ0nÆ€¿{{˜ ¤÷¼XôúŸ#uEâDôÊÖå&‚žaÄçúF´67ÞÛ“á-µLtÅ‹'åôëwÝÎÜV§Ü²#…Ù'›…ŒŒÈŠKp‰Ê‘Ȭ„#–èÌÁ9á¿ès Ó0h"&[wîjB¢Z·„› %Ò–`^]¨…£>ÇæxEøòñò Ák؇Áûî©të at;NØ/ŽÛfúXðúLjWÑÝ,Œ*:{NëéŠ(Ë]õžÅSz#°–2‚Xµ'7Õxå¹ñÿ 2+»0Ö€0ÖQC…1ÿÀùN,°Ü6¨_é‘¶ÌÆiï²)ÞÆ y›/eו++†ù]Ž~£‡”{#Ú~êVRçr;Sßç[S¼× È›†ƒ‘IÒ8Ø›¡¢blŸÑa|Ï¢…cµMZw—Ĩ±Ÿä¢æ—–²¢½ Y3ÁÜôRAH®m ö°Þo6Уb%Àr Ç&1@¯à›Ê3]«Ãkd§}0Yz®äFf:\I­”VIbuZJ]+å"nmXeu³–‰ òp°O]dËG3ÖÚÕzé$½9OÞtôÖk_]"_pU†àB¯jغøÿfÀ®ë±ÚÝqVmóFäˆÁ@ök`E1,—†E,;BM1n3˜ù•J»¶qz¶Õc‰§¶"ML:NñÚï= ç¼QZ+†Å”Á?7¡ãb~óöJY}h•2Ý)†§-DUiŸ\—MW S-ÖÝڴݱ7žû™³PÊ‹6œ~ ˜ÅµÃ‹ýø3Ÿê>a߯gB€w‰l ¦Ñ¡8õ”d ÇÈ«yË ½Â°R£‡uЙXt6ÔÄ­’âÀ[ /™T,ñê °Ä7P~hcXç…~OS,uGø‰ èº_ô‰©'¬\YZQ5œ¼‚Ý)ŽP˜Šv습‡ÅY08>I‡Ú¹xÌ£Æ÷AÒaÃ^Ý~íJD#éx–JïücLrÉ!ß”£-_•vÿr*–-Ó¸eÂáL¾d€X´^ìšúËÞ€Zß=ÈQUVöµûypÕ]çÇ)T̈þ@eÃ`2éo34|“F»w´ÿ@’à°K ÁÞûõÁÜlÒu"ò›® ³'šOÚ¢«dR¾™›Ç&‡öŒPÉÑ“a1:¦»0)T¼­L ëÚóï´aα4«äÆ‚=Ä…ëEÛØoÀøèâþŒ¸#JˆœÔXUë¨xX :/W×Z"¾$Þ[¸ÙpÎ!õöÛì1QѤKº+‰õ»p"}‰0*äŽ4eÖNŽmUºc øRÄ‘`ÔSŒÉ[¼˜3ó@QQ`KþÉQ$ˆ\\Õ’C¼öž ¾lÙ&CÉÍá>ÃÚ% m¿âÿº¥<2^x3Áb(2²Å9ÕÐ:ÿÿLý8¬ž»i·1Y;€mcÄ}E…yèóXN86w<9˜«ÊïˆJóµÇ£Ì{uYÒ§]2¡Ö<ô8…(ÁN7æånRdO7O9µdm†•V”–}5Cñ¦pD2 HQ¢WKv·BêÙ_òÇéVNÜP†©we« ­DZÇá Ü' ÿ`i¦OÒ›•ìØA› é^O/?KŸÃ<ˆ–|£0‰¦ªF¹Ø]0–ŸŠe„÷¢põˆ]¥z‰T¬#"a©``±oEnz bSt%½h¸Oìþé艓± ù¾7fÞú×|îÁ°¨ï»ZVÇúñUݤ¡ÖµüìŠð¢W,¹WðG–+à-q‡ÿGÐO¬{ÕRzÃÀ ;k£§XŠQëJÑ]ÁTíèÎ_×n¤¾Ð1M09#&€ª…vb”kí dEÏÉÿW¨{Ó2Í’«;pGvŸ{CÍ]40‹ƒ\Š%ÅÔI‘«wï "L%ÙTÝnÜHC}-ÌMhÖWz®4u×4êg5hFp[FQ÷‡¸ú?Dt±ô°¶úó1ôJëÐY‡ô_( }›ûzX¡Ã‚E^é¯:¤&‰’ðX°m˜«Ðü!/€u„¬ Lj&rl8ØSp‡ÓƒiÃèPáümµs=K?NÇØ©nDy°|·¤wM£×n軯Û.‚0þÄ¡'ÿ,ÏňAåf½0¾H ¼‡wüKB¹à_àÅ fÇÕG‹d{ª¬…‰R}µó»•»~QœÇuèX ýï d­âž|550ÅÆ²/™„•:Ìyñ>éëXJ „J¦bë¡ñê&UÝ»ÅûwñסW“¸Ì=3ñL+篲åÁÔÀ¹8j¢4ât† …yNÿ‹äõŽð«V€çÞ5}†¦•ÈM¡/X*~Ûh›œªXW׿fæþ¦¿õ÷е®Wl‚G¢\h‹+QŸío5•–V :†³;Õîõ^S©ð'9cQ!úΡ¦0›ºæ¸зû{a4y;ÜQ`¨;a¿Èãϯëí[?éF¦fÔ n7gÖQV’¾;ôn#™-S‹é¼)©+#ÏòX kò&Ù›þÜÀÆú?ǰÆ~nÃa?Ç©†aýK¼ÒP“‡ÕJj"1©z®Í]åºk¾•flàé„àO¾¾±°¤ÕwwÀUÒEèU¥šïHÛ+ð uZ®0JÑBà–ºŽý2o_¾÷ W¹!XÂUz5cv°:E˜¿{éD³ÊWÄš"w­õšÓ˜ç^UÆÎ?´Kì6J+äSo|°ŒÑ·þN>u²úøÕý‰k–7BðÄnä%B—¬€¿OŢ÷è^…ßê®åg2=:!Là]fJå8;Rñ¿BJ?¯zÇ,{+¾jŽÏÏÓýÿgE”t}â?€nŸ¸î]Àˆ!UC]9€ƒn’yž^ÂW ËnüÕ=+/‡Ð«™•þ#iÞŸ—.÷px@ŽU”|¡âkááP+ƒ'˜_7ÉáôùÛí\»ŠKŸ…ßfä·Í—¨Âc·)Û„¡¬-ôøLš>HMÜ¢ý£€¦Bä ×‚kâ£s£EéÊ:æÍƒçM^)¦c ©¢Cõƒ=ü컣`Þ€^MœöÁù`x‚Ôœ7°Õh`êQbb5^ †Îˆïœ/¢G]¢lŠVYðOÒÞ{‡óHH[ €t 2é”Û"9N‰'T$ëlÖB·@ß8õÓ "êýH'ÿÉåJ±¼þšŸÿäæ%BBIù0e;Z`tCp)`Fèâ·i’eÞÕD°C —~îÿÜù‰ãVò掼ѓMÅ,uÓ·`±nˆØ–4vþïC¹®äÃ(ÑÞ*õçõÌ,n³Ã1Èþ ×Ýëp’×ÃŽ)Äß½mÍvlËä½ó70,Üxªþµ®-ãDúôÃÞ5åžpBÕOœŒ‚‘ã³€æ {–uzÃOá'«@u°Q?Ë¡³[§2;ÛÃÝ4DXëIŒ«8Ð+YÙú·¿ª•à^,W¿bTaž?\¡¤Ëpñ_ë¤OFeÆJl¼\xò¬HXî]Ê ë¤t Ë6¹6¨à¡1ÝXû$pÜ*|³ãõÝOæâ“sô#šîY¤|£&èwk¾=°v,žÒ!X„#g\€Ý†ŒÓ^&ŠpݳK†d5(èFÿ•v»Ç¢ašlªW¿!¸s#çfÇ£ðˆ‘?>9Ç"ƒø=àÎ ´Ò-œèõùpƒ_’üh'ÁjÂÃêe^FßXLLÃ&XF kÂÖ?¢‚aq$`¹ˆå¯’C¶M7Cœ ïÊÈÂû¦³#ZÜ×øæWI\ѱ#µ*˜ ižª¹u,¹Ø¡¼a,”Ù §m‹k:׊Å4ëõ9þò"û”Å]u&<€XÑ ÜÞÝ0KmÏhÃé«— ¤S¨';ØX™/ÁIÅ‚„CiQ½–ÁœÈ]**Våþ.!”š±<E†q YÚ‘bu‹°*Œð¹Bî9ê}{*ê`¬ðˆ{ÝMVGXþ±÷®éÞ!÷±˜Õ–¦’Kó®ýÉÀ=RþL»O»Øù\ÜlŠËUÿ…¾™€´Nª£p•臛lÞaθ“•–Љð®gyVØ ¯ùÁ¡Áú*óÐ8w\JöÄkµ’X¯‰ÎH7Þ*¸Â²q]¹ü Þº?œaÂxî‰/6GCÐÒ³,)/ ˜¨s'obE³ËL$£-ŽtßÛ è*K,Zž‚…bÈ<1ŒaŒå, rç~ÈÄi<¡Î.ðå¿¿{0(-Üoº¶Ã7Žá3Íià$9`üb×ãc7¶él_PÓΤ ŽE9KY~¶c%BÅ^ÊVª•!X×7gUÁ›‚ÝüÜŒôØC ð0û2²§ÒdÛYqS‹|ÄŸ/',»kò½Í «ðfŒd—® AÎÝU4zUʼF¾' O$Þd°=¤$Õåßxãï4ºÙ0û’;mÑ>*Ì©¹.^‘h¸ÅŠÝg'N’ìÌ ŒÖ¥v¯[AWT„;]ãµ–XBa¨c•UDÕi0¨×I#Û5J`yý™®6‚/ØàJ»ÀÅu_Tׯ·TÚŠŸPÖgT,D¨XÚ?:¤Õ-®oyX†õkÍØÞò̵¶²àœH‰¨šP* ßARÚÑèKo²ûÙ‹B‹¢äPȵ¯O§ÙÎÞ[¡íú ðl'*ö•_ÞÌ>ïæp¹®¦M[»È]¿ýñíÕ8vêˆã~¿¨ªé…•]ÆjtŠ= ½}ˆ³Ï=»Ó¢§²æo·ŸÖ½‚>°cSÓD©ø”Ó£µâ;oŒÃÅœ=‰Nn¾C4Q&{ë8z¶Ék)ráÁhÄË©­²}»ÉUîc Ždî†*üÄ uÎ81œ`!Õ!â‡ãÜ}NÎT¼»—ÚdÞâPNh+iìTÞÝŒcè4€°0~òŽdd„¿Äؽ3­–ÿcã&Þÿÿ gx„'»è ¿Ç‘ób¥±é•ýÿøÏew¡%0¥#x9H:—ËÑßÜfŠ£I®ò{ѰY7(|ý¼T9dpÂz„Êyêëf‚_G€Î/DæT¥lJi Ùg)dMè8°ß¹rl÷µû]ËpŸŠ¢¶ #$úU5‘ª÷Û-•GÏëÑí";9Æ_A¯rõ³×–7â¾eU²ý©ß.±gFf÷…%äÍÛŒ¢ÿŸË:8ô«Ôd;ÿÎê Ó’þÌF12t’2ËZþ õ°ýË,p8ÿ ï‹[vMä’KÕÝ/ÍÒ;2â)²ÈWÅâäÅ“f¤ðÏgy8S²å*-*3-ÁpHtqhT9½„uË>¸n8ê(⮦3g}Ûú Bdd"y$ê(b¶âÿLùGµÓ³ vlúÀá <<,hÝ{ói£hú®(~dpmxÑóºžûyXÆÙ~¦_?V:…Î&Fƒò5^ú¼v{WR™»îíÃæ„Ýþ(¾½ æµÞt´‹dÝõŠž»ñ¥Ló.Hç¼ýÉ¡›ÃÆIÏßœÂêâß÷…~âôXC•9Yhš£s©HJÏr¸X¦rçMžÊ1ß(ëÞk+lI èÓáð¯NÆÀ˜;FΙ¢í”ÂÁÃÒc£í$¬IÑÌ(<ý!ëmÑ«K={œ¾Pº×ºµ=a'zM9¢îšf{ 'E§½hÞm`Ý`—ªÎ)ÈÃùp4OªaÔ£´ñÃk<$®V”…a·Œbé„A÷³;ÊÛÎϯî„z„°„Šõãk˜¨Î´2àümÃ<ÃÚf¶¼€6ùn6£[7Œ|ê#³d#bžÑ@EªÉŸò\ŽZ“oý†YòÖ9¡¸ï¸½ãR’úUÙ…'Ë.Ú4ÖEùÆV¼ìe¿«J…àÈ{.3€}sšÌó7…ÝÏyFa¼è î…þÿˆ8°7ÙYÆ qèô—ÓÂKÕ¯£bµ”¥†pDí'4wÅ%ÀœËqˆ”ý4^N»Ûü• 1¶±y-5ì{ÅOï«u}Ëd€ÇÏMg…“èÆØÉNFW`Ó W¸boªsO‚ í Ði­Zw˜V“›ÜÝiò-°Å¥‚¦}>CÅr”‰á3û•këŸ@Àj}m¿–y,üo•zoð ÛÛ¢;á:‰lD¶**VÒÛ¡øxÜž`¦YŽxãçƒæpÿµ°ê·||twtòâƒÏ6<€ElêFؤÑ÷5Ã7¹òa|™d;5ûdº J?§c3V<~I8ÿsíà4m‰w7ôÚîQï2„{î»BÆ–šÝx(öÜïŒ+³{¯ÕQ:ÓJL’ÇFø9&uÜÚ^§” w€¸¥£A¢>›³Åš,Ša!çøàöw´êx6³á áqñîÇNU·‡Ë9Yð¯Jþ1YÐv&B8b¯IVÔW5‚Õ­¨ à &¬R¹é}ªXCÄ«‚{ÇÝ`Ãë`ÏØþ£bÙ3Ëp#\3_°ÄÊ*T^¥rh-lôcÖÃ‡Š È{ñ–䃵 Ì«bùášêÂ?³ê+þçæR`¹BÓœ¦öV“i¿š²÷]þ ×ó´'òµRë³gŠ>FWí‡Î]S&‹ëX¯ÒNÔ‰½ÿݶˆV‘èBôjùIÐ3#Þ`‘Ú¹ÙVª-í~£C²zÌnÎ#`XM Î%·ô9‡oWÁäo î³ù/רYd F˜!(. b¶ŸCï~D¡ir) Í‘EœµÌ%¶7Þ„ÇLI#YkÛ²O(¶„ˆŸó ú&¢À¡={ùyíÖ…ßI~éÛÀ… ¸s­¢Ñt3M†å´zr ß°].º• Îe(ÐW¾åwA¶½wÌ5rÃ2k•a´¥¥Ø;o5z^ÿÕÿ<>õ!`KÝM†y“ÀˆvûäôÉ«@{ÉÉfù<#o“ßÐJ>Êâ¯` ;ÛÞžd6žGfO°É9bƒ ñ§#ÕûÑ»^ø_?dçï;GÏa= G‘Ñ’çƒÑ^FLȨ̈Oâî2@| ïÕWH³ÆW ¶ÄøEÝ‚7ÂI·ùðUþöçü@ ¶Á»^½(xFzg¥?zß&b¥„òXr?òX½ò²»F]ÏñÿWchì‹s%t14T‹/uøáµÄì®5ávÚÕv÷“©’n‹Ç£.(L@]$lÇ9É”~OŠÐ5ý|ÐÚ0š´8>o¸t®`7tn™¥Ö붸Ëé`ø‡bOt¸ê{ޝXN$‹ÙA&Û‡îO±¶4+ÃTn¦SùmXtk“òÞ78/¬KŸ÷K=Æjcß“i­µ~•Ö¿VÆÆ †mí¤>ö-Úpõ’!nrr(’ö!3šüу©(Ðà ô:Ûù5eAï~¾  Ž´í0D4 Âz[µ\.ªFùFWX„øoxòµaÃC‘‡ÿRÐuÊ…ûï#*µ±ôN=[P!¿Ô—…„5þz… â @ +ä5d¡8€aè¥`Ðá§‹g´—™¡býô~¥=ûïcóÚ;]Ù‹pj“éTgG®:Ö{„'7©)¯uý6úšJ“ý%{oSòcð…ƒ÷k¨}t­y4<ý×ùá»,þ“¾·IÅÀž6s[YPtj<ëxHø¢‚Á¯Ø«äèˆ9ÛŒ¼8©œâadŠ”ÐÒ‡þ .ô¡µFYÐY…‡'«¸ØŽÕÀ·(¿ƒ>‡Çç…í ±KWD>&Ý{2‹"dw¯xÞ÷apÄ`§a_áŸ×:ϯëð­ù”JäÌ\û+ãÊ©X÷øp€hó2K:yXIêoÊPÌõ«=€gOHí &UÉx=j^øÍ<¢G§½·¾éS,<<<,álš¸¨h™ŽFÅÊ=fw7ÐZH‰?ü™ó÷ÿ40{çvÇÌypˆ[uYc÷ ŽcÚûyfœÁÇœ$f 0©Åˆ)µoªÞ/:! §Ø>kàëOzÅ;8Vì)^³7»!©lÂP©Ý=s¡ëOBüN›úŸOŸö9Unø …ÿvÍEè ù*÷,mþÄ#vÈŽ 4oÓÿGÞúÂöï°–pWè“̆ÜkyX÷ø]‘>#ib Ï…Ð5 7~µOä~Heféü`µöE(±Ó)¢·9™é£Wȩܑ•DyXÝhÙ)£óI _ýÿ[8JTn@{ûÒ¦ ˆèT9FhK±WX«3bªXð൰û‹ì;¥ìýêïàwÉÄ­Þf¸³¾ –Å:jÓ‚­43E­ìüݺӴ§ õ9ä¦A€ò=§!ßáá/è]×ÝÔÝ£F1ƶ[eÜùPc÷ɉ>ÕEqxÜœjPßè⬂nsE>‚|‰3 ;†º.B¥ß'žÜ?ò‚†_âªÒ¥ê?o5’H⥵EŠo­ çµ âDDWtPm·ÇX¬rÛCMA~0¢vwWÿÀ&?ô*¿}YûÒi;òHå>V‡‰èes×¼P¡àµuµ†_eØ#%:Üé’V\:ͻпVl4ì@8}ÏÖý–€œ¿ÍÜß%|©Ò—ôà+º²ç“·Šz^ªX8÷‡=IÕ^€E,zïñ[XÓ»}*v¯å§_ÊD­£pô(ÿFå »ô®X'ìo¦bíP:ÿ5ì©¥ah^>·aYMå¾—.¢WK66iN'Ï…Gý=³6ù#†Ê¯}}Q d]…£ýî…–- ˜çÂhGËp@Ljé äµû½i çô‘°ÄßÖ‡eQ’,;¥«Q@ClÄØZYMílÛȧRÍ@|<¯7M°GtáCp‡°¡U0µcÚ?ß·€nb§þ÷7c0JœOOx%iªÃá–4ijºÁa™ÌrÉçQ~~Ì¥s›Ç\->ô s^Ä7-ÐFgª›yî­­8QVÞ·È"Äuß!Œ«WZØÓ^ëçë«„5Üx…z—GïŒ*(w€¨Û‡ò†°ã!Fqã¡ß…ªþ/8'j÷NbD¡G†]ÅrE&ò±Ãˆ¯—mqÏBûÇ'¦<é|¾.“¡D: U;-ƒCÓ¥¿c̽‹;¬B°z7ÇÒ2rÌE úu5 +õ{TË«X,ì†pkø'™š`£«oûêËjÆCTëçvÏšûñ5úKŽ–xY$ñu'ôzÙì°n…a7Sž¸¨¦;›{Yé¿”þ¥CKõß×ÍÓPA¢¢tæ2`¶î¡&^ð­õðÁÉ)=”5sA,¡?PäýSÐÆ)‘Ô 6~­oJêžsXÜø³ee§â°o­1$¤BâædH£¿´- oÇè}•öó„û—‚éµó´Üô°°v0¶nQÊÓÎ2º®Ž¹ôòš?ã¯<Ñ@Ñg¦äƒ³”îdÁŠìwŽÔ—ÑÇìÆ¹N ¼&oâ Õܦ ýkö­ˆiYöòŽ)@\ìýÔS?…RK¨Q¹ì²;yG[HUq£à69l²/8s#s%ªÒÌ… Xý,Obþ#[=!®PÚgS*È.;w@:~3À‡mا°l¼ãàäu¿ix0,Ñvã¬4çü-XæKŸ'WúÀ ª¯¥>­4y¢‚'^Vñµªß0iõUßDŠI³%ôZØsþû÷ÿØv±/é= O;øâÈ4ÚBâ4ž˜¼'7:ޤ 0FÈè¼èÚÐyql?à ­=\î}O7ÖÞxÓþdy ¿aýa0k ilÞ=tÕ0¼D!ª³ÓS`uÇUD™­ýÌ·ä+gð'Ú+7>„OµÒqïž§½±dJ£¥Øl÷ËÜäÁ•þ‰VAY~ºÍ¶=g /ŸÐB7€×þÃp|¹µßßøÃ:tæÿ*dÇJƒÿ Zö~ûVrOôDÀÕt†Ò ðTýð âpEs{-uÅÙ¶ÛÊÆÒþ¤n gv:ÂGd©–&–„Š•—š+ZÜmÃJÒ…R&HLò+€*F:H±–F|…F¿º-_Ýï~œðñà Û" «ÁDÌ`>©j˜øZKæ„çq*K ï(¯Õ¢aI¹w>FF>7ɺ-à ¸ éü1½íP±Žòµ¦3øÂ£ÉdÎXÜ{µUù3ôÒž4û—ÌTÒø¤Ð¢êãÙk¾ÔÜ}3Ê¿'†Hn¥š†o}y«O­˜7"á –¶{`€ÂB¯ÿ`J$É~§³¤$ixŒˆÕsâöÒx<jM\Ž{ó+BÿÝÁ>­ zïˆf˜ŽîùÂ墻Ü÷÷Bæ²]•y„¾˜g  ÏÛG>§4ç!aŸhȳblt ÞF«åÉ£žð9ñ÷,Fc·±Ã2£VØiõ+ä=& é–’ÖçWúò…ÿ“–Dœø_ôÝ-›†PP¦³ ÌޢƉ¾€ã&»šÎbøá¹JÈWä°Ú×”µ}«"}«E¨ä¬º·jSª§X¨Úœ¿ØJ5 YÚçè5{zÂÞfTçþÙáèˆMâÆGÁ4Jÿ­M%ê®ð{7—>øòC3…qTñ´µMJO¶ú•óÕ<¡“î€'i?%†eS±úÍ×Î1Ó¹ìIyZFNzˆ}C:öf»$|ñ9ÚqKR™d¥‡uÊN‰Rž•$?¦—bW½£«Ñ©xEQ=,‰‡õŠné¯,Áç\ß¾æD)Üë÷>Û|pLMo¡«¼ß9ÛßÚ5¼·ÝÞ7¤~í¦@¾úèÊB&ÆÐŇFLOÌ%Eô“ÈN7?²Ò» ”«7õÈ/1$&òM ‡²v2iJ©ÇÃzÁí‚}RtJßH¼?u*o¶ó¹Õû½Á”¿ð*BU§u®êŠí ÷ì¨5U ô~ÿ‹o±ƒÐÑh¬¢ZúÐd(£{M“Íbï|F‚GnÕ:åÿþ¢è^Ðúpý™ÒËy•.˜Òé`@ú1¬vÙ*Ä}c\o­íü†t÷3ü‚ðéwt¢…¦½ ŰçÕ·¬»-»éÁ°Ì‚Ç÷6íÙ-Çó°Ÿöo&-!kÑt  g\Ð’{@k? rþ£½³ûp˜†fÇ ÛªÐpH/ÓVËÇŒ$‚ÜCz#è¶hæ¨`ŠQ§¶{‚`­·úfœNÜæÒoñ¡SÈ-6†ìZÀm±to°y$Úäs‡´»õÄ–ˆ;#”`¬³ò±·èq5ÒO a›°«QÕU‘ÈÃô¬V¶JœVr´aÚÔ…ðYn¸äV÷‚k7P¹Œq}t•y¦sþ.VÜÅ>¿ØÍ½zj«¯Ù#&$jL<ûØ9RH×À%ª”¬ìê;ß)I‘š6z0ð‰õoIAñ¬ú86?KÑ)*Z ›ÈµiÁ!k*Á¿n’¹ô|òÁϯä\·ûa;¦=[QŠ9ýƒå>ªí®Çwçf_êÚÞÊË›¦=Š¿†EÖò„ew«?Ó:út“Û´øøðÆ{tºÄÖ- =¬œ¹^Ÿçl\H5ŠkcŒ·0–ˆaI^ÃJs"î0_|Ì0Öžv@} }¯#áa`®v–éÀE7$áØ¢Yˆda‡¡|)Ô h¦"b]B¯¶ª²²ëH3*ÞqoÛÏvƒ r(HúÞXçi(ư‰]ãOý®fžh cßëÃoRì’ƒÈVá§O÷ëÚY“öa3½‰S‡'U{l©–ùMzTê«M-5oøI¤©üu—‹-×É›VJ3¤–?¶mw›;âÍÒ>¸Îò /4F°ÂRÿ ÷uÿû{Z &¦TÏÎ ¶TÞ=ÆÆ° ãÉlM˜AK †%V*úzƒi…h³šæÈŸ¿då±õ½6n@[.3ŒHޏë$Ù_uzÚêÎ _ù4†ºú8ßøy‡ øDa„§XpYÜ9³.ñfnE¯˜]åガ[ï:l±|xŸSG03>7¬/«tC—[`{ŒüÖs$|/Bß`ˆM Ð\÷Í*Ñ¡v‚9eq†ùý´WWÏô–0¿B ¸o:IêEP€"zS¡5¥”@åð€=iEÁá‹7êvî€Kô~Ñš÷@(G¼x C1:„¶>’> ]­×¾« wÛôóþœÓ3ƒ¢ÿ+Tˆ‰ÿ¾wzW2ô í`:hkÌMñ—PÂ?Ö]Ð[YЄ"å…Þ‘‡¼¬<¿ì.ô6Âç| ®óï{ºO+,íà 4Ëô”&¡7¶k ÆÆé;~‰ÎFoª(ŸÒ«ŒØ­è÷¹ŽvâhÇlÍZÝß% Êã8}B篜]Ò0z,ºÏÐ9»£‡eæ¿¿ÿ»$ivÎøú¼+õo¸üYWš¾„ýö¿æâŠñÞu@¤6ÒnÕÒFêPá¼ZI°’79X¦£ÄO TêÈÄ$GÙ/.ú«Ó¶!ï꓉ôÌæ?”¸hMû——Ö<²3r«ŸswËϳ[á6‹}nµ)2ÙAĶó/ÿý=' z@`ì&) = æ°8(ä'†U7v1µ:„kQë2Ò?¬•ø EiïOÑÖèÛßDH?lȬÞA’Šk‘§àe*¢+‹’—zZ±žEÉ­Ôk"`Ÿÿ‹R\7Î,:?â?K\T¶[ÌRe^–S®èþ ƒ<†.]‚7M‡/ jí EkÜþû3ÓS ص7ûÕP\ ™oM(’°ŠD=©…f,œ³gë³¾ž·÷à¾XÝš°«oUR¨¹Œ¦F¡øÏÐŽleìÁBÙû15(›¿WãŽpg‹®õiþ ;mþ± ZñWÜ&?q>ì‘ñ¼ñüóÐå¾ Ì⽃ön$ ,g´±n…žÂ]=¬öBWiâ±MzÆM¼Z ÷1¬wrš!…n0ÆÃj¿óضh]›‡´`#ѳu;bÇG#ò«Á)œ-7S¯;»jmµrw»ªa´Ûnéi§„b3K"0“–"˜ ˆ;·4ˆ¬Ä€)µ°}ªÌýö9AØVô]ÛUÃŒ­–Š5 ÍÏR7P>CŒº¤Mq£Öký‰I±yl!1¬îHvHXåvKj98Ìô"áé{*ë!‘N*–™ÃœÑ÷ ×Xp](§} ›ëg€îZÙ -³å–5ë!fö=ÈieV½;ö=ƒöL ùuÚü3a¬§ ·ý%]§pºHXê\çîèbѨ=œo£<ÔVŠnéIßw1“×?~Æ—1Òàºì»TX±è ÎÞ‡JzÀk÷‡þ ¦ŒC*ÑŸÚî’zÛëXt·õ Ó+»j_;ÞÕ|pŠæ ¯jFuúmúb¼©ÞòI!¤Ý¿ýHÐÃïçú¢ËÌêš±ç«P_àÔÜR.‰EM ½7ïq«óTP£½0¦+ŸQ“Ioµšh\¾&]¡ÅEðÅ'®[M—$Vh`±s]|fçíáOø®Ý'á÷¯)ÒjtâQòû Õö²1žûk_òÒgîöº£û»¯¾V†lõ/Y‚ËÕõ‡‚L—×ÿý­à™ÀOÞƒ+_Í·.üÈûýAl0èä„Aj\UËC°> ©˜`ⱉK ·1&c.iߢI¿'ý¬'ˆÇ¢‹º»í­MtNU'@oðóÎÜ52«æé[ Å YâôXîJ—Í|Y4ÿÇ@ŸÿxX“f@Ň³W3Øýª+ÅÅžòˆz'f9á‚•æ¾Iòæ89[Ö:µ2“Á¨z}É‚°¥)á»Ñõ1ÜÉÁ(—.eùLJ†÷¾%ü ‘ìêk­÷É"‰W½i6ÂøÝÀû5´Ä  V÷òœ¦l·Vÿý}ðÝù·8}K> \SÓºÑJ±S*î&ùˆ‚¯«&7Xý8øB;ÿ”󌒛 löË´:6D–lžŒ…?dTþ:'<”8eQqˆyùZ8[L¦~Aué’ZùumÇÊ`céC¨ë¼“ÎÁ킨Pè‚ÞŽ£!c/Äö›‚·ì=â Óì£1:gWÐ'S~&#|èº[ÏÃgŒsT ϶œå¢³óFXé¾·Ë.{DãÎäK è½hêŠ]0Ê kVÀ®§Ž#zªÇ! cXÆ6˜ú(ùv]£¨š4 뵫&µÀéF#˜®~·¡,E»îÍ ¶8Ìy’ÐFn¹«ïB¯þ­òr«ØÚøÇcQb ÀLª©øgôb;”ˆ†v“ýÀ_>õdR)f¼Ícñ,:Ð+ZêTœ¹iB sÆ–´G=^ŸtwÚ´Åý…a¡D=º¤þ߈ã`Õdn²(Œ/¬p«BÊs¦¨æÞŒlG «J ªÐ¯Ó”'?ÊÎoR0çdc%_å¼Çá:Ó˜u‚©E_ï( ˻ɓmZ¶õƒFSÒ‡ ÷´FøÑg´.yµùŒý­K,o?¿ü]<'Ðù·'c¤ÏÕdÅ ·WXEë+¨-™¥hº6 ˆaŽÅv±l8"Ë7ßš½i좉N¯Ö4GD£†s9†•@RÔТ‘SÓ] ÷í­ÊwÀu.ËnU¬èR#YÐRšà?[rµ Я:}¨0£¨ðÁjÄXWKjаîöþƒx ¼“IÍ! +õR!yùëß.èKúTÒN§Üþt ¯™å£ µ¤Ÿè,xÚ>%Í,»¯“½Â†'Ïäïµ"\®¾„ý¾sG7ô&Öº¥®ˆ;ÝŒÖ:”}mSÆÀQ„C[} 꺙u3Át7Xñgìca.Âq/Ûnà.ôªã~Wá œpiã o‰Ûðéô6Ÿ]qÅèá–›¤#e½ÁV©ÐÂg¬Î_3(~õr›U‹;Æ ¢3jgì‰#‰‰À×±Ÿ¸(:}… +$ðì{%Mû /]`—çi8l(ÊÝ×H†µ>¸}yè_d„° ì&bð _|Ì8±Uk7l,á¯[Œ§h`Ã|÷,  AÿŠŠ*V?ˆË&sGêè(¾* ¨[MåoJð©iÂÞ=È  D£+RWͽ!¼w'ã?ZÍ`/njÖý¦±ù¥mŠ¿ÉK› €èh¦f©¼¿û2ª‡„j)‡!­÷f#ió ©êq‡¢éÐŰ’ƒ^ÿÎw#uæ?‚aS{šèÙ V”}¤Dsl¹ô‹\Ì£:#°"vÜ먩­sÀ­î‘oß:Öéƒÿ¿ªŠå9*öØ©&‰T0Ú±ÓRYƒ¤bµxízÎ9FÂyÚUaÉ[7àP mD¡×¦G=æ f²Ð:çAÀzmà ;ŽSÝ$ÛÿDW‘%2b:³]þE .t[jÑ%—b}8Ï»¸ p›ºAãŠNy$Ðü#+#W\ÂI™™¿Õ™á?€^='vòp¬h'=7XM¬^î|eó¿‚¥9j¡»¾åþ‰ÓE¯*Ék<(ºVu“Æf Q7A¨~—Ãú`¢ë®æwäÖS âgsŠ; A†5vPœºÚ^}V8æ•í_V•jî˜s}üÉÎAÒêgû[´o긕ß6VAW\4³Ö.êøÞ׺-â]n«Ï³$À…ï·l$—Œcb5Þ å—>?$±:AC…aBfÞ°d­jfÏ£Þ8¡_^½Ï|Cg÷Y¨ø¤è—Üj¢Uå'P5ÝÏZ\ E€EnÌšØPЫÉÓ9R‹w ׇgŸÞ—Zµ®ù»¿/A y¨‡G žð‘(ñ†ba绀rÝÉ]Їý“…i 6©ð´»‰šâ‘Ãë/f–æwÚŽ¸ŽóSÿ æ:¤m°ÿw“¼.ËÛð„…à€¡ÝžuŠqÊÌçq‚H¾ÿ~³ˆOoD8ñ{Lää`y¬bÖ2„æƒÝ5¬|g1º`>N³TGgP|bÅâ«U±ºH4Òºaô]‹WìˆRaq)_Lq &¶Ü©cµäZ˃ȱ´oA²Û”z~òÎW€¹‘(è£1{nÒ3Ô!$Kc`1¢Šåw"+8ŒX悱îT±°ä’ÆŒº¨°ÌÃJÌ‹¼‰û*á.ÕZÂ6„3xX†€q¦”qõf–P!;n|LPj³[õ‡Hû³¤iHõƒãnæÁôRqç©V­kÜ9ééðáË×ÐO¡WûÖÜU0SÌaC'p¿Ù•O4£fUr™}0Kz/™Io_ ôt9c GK%1ÞéyKð(š½[>ÿw÷6«©œ.†Õ¿ÄQá§a) ë×»¡¼®&¹œñ‰9¢¶dÂcÍ4êâ?¤*b‚<Ú„LRã;š<‡BÚ]Ux‹1àiñ*5²3‰¨Ò»Q¿ºgnN­mïÜšFºÂèÚ¼ƒs>u…ât†;c÷I³ç„èîáÓ}˜Ÿ81,:2ä>l¿‡¨8÷Å›ŽÝáøîú”à‚ª‡Uµµ©XþúµªÍ¿P-aR÷«ÓÛ\3yÖ,ñÐo{æ¦üB±î(À&£ÉK ÔÔÏnÒOÇOB M<«öXKè‰à›)wZ»ëæé·Wõˆ]è)˜j•¬ β] ïìÁõº¯æÉ=ûF÷ÅÓ#7°²°±5 #†U¤¢£‡.š‰`ËVá’ œ¢ àJôÊóÚq|KR¨ÝgêHL Ùì•lBæ—>XH¯îÖçfŸÐ5ÏX;?⻼»ñýªspHKÞ³8ÁúFf…^î·oˆ®ÐïOz˜òÎÀ<]¾}zs(3vðåÑ«åCw3'ë n꧈#ÝÄ«N9!ùŠ@×&ÚNUg@ì7¶‰^y,©ã‹PÉžèJH8ž’ÖMÃúIdJôÔ#¤Œ„Þåa%G´­"™ðó Šl%G»ˆ={ð󤌭 c6<’h­òœy†;“ß…žÙXaE«8¿¸ç=~„›¼Iìƒá_HÓ Ÿn|Ìù|RœU—Áb¼Ž‚sN‰Ó‡ó õwfÏ)Í·Üaù½zÿ— «©R³îC¼ÊPAX~Å÷É=bÆývÕ Ž:²Ug‚H¥|:ðÄ6ÒÅ´ÅM·;1oÌç&òCÏA|€—N^-ú‹#d¥toãÜ`뇂µ=1 X€’”nžÁr8.á$o?øÕœ¼ïZ„ŸÂÁóÝ´.x—–Ì~:"6ý}Òûbs@AFJ°’¹).obÐ%{VoÞ†rrî™.Î`ï fྠ³€¿XòM?ÄtoÁ%’t8Y%écÑG˜ÝôŸÐëˆÖÞcÿû—ŸBW[‡îƒªÿ S± ÁX©' =CðÔl‹mÈgS(á:Àݯ¼˜ÈbÞèÓ çŠW_BRöö…–Äë0žB²˜C¸Ô8ˆ…ŸÈ….’OF›‘QÚr«ÿ(d˨¼ÙÙ$¦C/9ä ÇÖÊVΚšê[nTèLÛÆw7äëJâŽgºý!G÷N¢Õ…i@´ý-ãüÈn——Í'3¥kŠh|)¦«qéÖ(Ô¬J¦Oǹ8„lD°ÜÒC™JX)¹ k 9AG<Éo’»¢¿¦R&:ûj†Òå o}Í]¥†&¾ÄXoÃ.x _ ×ü§zž½”…l^DgÔ»nIÔ(ÝpõŠ­…Ž…%Oºä9h®—'–áåJT(ôœ¡5TºòÙ¨%9d°»¯žsÆéïɸªø‘—g çß:VWhîž—ÀX¡r˜å?n£ «¸šU‹ ˆa9CÆ^Š4Û~³°úVE£3t8ºñOÒ;Þ$ Ì‚0§€‹qv5<ìøm§äsrÕ"Á8s·ž±»¸àö™a\w,¶D}5} hçdIv7ú¡î½Ë´Ü&dy6´q3K–6–À™³óÉ?ÉKÏ”Y mÓ4¹@‹OÉËžG@›áU{Ýv*nšy‘R¼kMד³gí®niåæsèy«a‡g¤¼ft$ bd¡¡ømœ ߎ+‚½šøûÓÑQÚÝ%¬,é-µKϘ‘ +©¡•ÌÃbo ïF¦*–°)1W¡>mºfëy‰ ?_b^m âAä$=ê, HÑêÁ˜ÚÌ‚A×™2Jím@ödé+gÂ?|Ø’çV7omGøÿ†dqái‡ž±Z.&m“¶„œXç´NÔå×kž"®}ûgÌïéª,%nİœË}!Ð~è= ´3l­ÃJ‚’°Ý 'Ÿ9.‰•zb[®¯Dáj]%½³yc™ä¦E±:¯â·©L%Qʦeq²ÝùŽ;áÎîm4‹Qÿ°Lù›3€ÉP IÌê¡ÿ²ÙK‚´ü{n°sÓò9á¾ }ܧkÂ8 ¥9ò*"z~ª_û%|ÔÐ#ù‰å’~T@«Íòf5¤ /;îIìPsá—azÜ\âƒõž- †}+ô®/©˜+Y1sB¬íÁƒB Oñ!Ælæ0Too—y +›rõ[pÎm·{4°ÖV\~ËhÒ“Øo@¬ò3R‚óÓló«¦UO¶ëˆê”î¼V­üP‘Q@ãw0_…/ºâv}I[{ˆŽc$ýÔü_æ†êYØ „š]7•ðî§¢‹à×&(ÇÞä#gDªžŽï>;ãöÕý?ô´½÷µr ß ú§h÷®ë¤Þ©»zg‚QG7çi‹£äßV¬¥S'¸hætGŒÁËeâ~.X3Œ?D½Ô“(jÛ9z?FŒ$”ÎŇŽ+í+â£Pø@ªœ>õríü­N¥½]^yÏ-xó¡Y…¢õ~i/éÁxÅ5^îí8\Ë1œrù¨âû7•õFÆ{µA«3üJsô=—O¸²¦à“ÌóÿŒõ:Ð ‚Ó•áÜðBNðâUÈHŒ¨…\FÄYñHkÉt²±Ä¨Ea×Bï8DU(}›RC2ª6\Qœgk ±òè•ô=¬Hû *?‘Ò3|8F¨ÕÐÕ±Y+VÁWÅx:²¼‘zþÎèn‘6Pn]͈𞀅 a»çiï±—¢ÛÁ3xXéØüÓaÈ}åÏ- +9¨XËóÞ½`Ù ¤”õ ª?°a0^EjË϶ýo’hàLRqòËsÃóóÓÆ0'RÁŒ¹Ã ÎÞn¶zãÞò#ß%6•Ré•´ïV¸ý«+;Œèü` ªšpÐSùáÊ)ÂãêÝ*N×µÊøAZs–¶9#„r@ZZ$ÈÕÔÐÁ×VÚW!± Üà€9ˆŠìLúUE«¡"[™…|ϱAv²¨ ŽmE¾ËW˜šüÄÉ]ê2 ŒúAô~Ò‘ˆ«Y¼£OGƒ\á´è^Û¢[|"nÕaôÕaUBDÍíVºp2?¹<¯ (?Â.fw…V9©^däëò+.‚®hrÈ»³)€§_-Kú!ó-ªðM‡¬;µ„Ð[†MÆÜÒËsΓ§lŽêrˆOİÁ®%,¿Ê™Õ¬€~<¬¦@­%¤m9&R‡[^˜§$eL$ #ôØ[2güŸ$…Ïeô¨ÞH¨\¬WÈ•"ž‘F^^ÔÕ+„é·½zX¹@ç¡bùY`¢’ )mÆ4ÃSÇtIPcO•G4†TŠÞ—á˜Kž·xÎ}¿‰@¨FÔ|Lú˜W}gfÏ¯o9%|&Ã×Á5’êºDÍ LâJCNj›§ù` Ðj¬`[ôc–'Ñ5a«hdÒfÿÝ2å¹"±²¬·Ú˜†Pd—6ªœ‰ŠKG=‘Èópè«{Ò‡ÐÔÝšª”°ìËý&7Û¿ÌKD‡"ìÍ¡ÄNÄ–GU½°Àð“·1YjºMwŸ¹+HÔc~º# WPßåœbwÁ÷°x§•ÖÒñ÷CÝ—ÕðÚ§®*<9ëÈà&óžW/Äuˆ%V ~ë9k&Ò.cÄM¡‹·’ÑÍ:/b!!¤ixX¯²G°.:„ο+‚Ÿ£ßcwÛo!%!–kaN<Âz÷Âþ¬`#þdÒ”9Ѩ¤{üâUÖ ·N®fwÀXÅˬ7h\!ÅCÇðoÓF‰æÁZÈ2¡uÏúÚ4¸=-í\-CáÑÖG]•ƒ]åÙþ}bª^ý ¿Øœi·u‰\AkmÅ-…ú8»Ñ«M•ƒŸt€c–'AZ¿I ^áÅ Ò×¹À²÷« „•F5#E?û©Ag‡ÞVýÚ<"Å·2Œ‹‚¡¥¸pÒè`Ö@àe7„ï\X1?f˜ÕRÍ΄_¿rªfðÌ¥#á¤RûSvKš*B8:%eï1RÌÂúŒ=­"?ØÄ*ÚJ\÷p¯â$Xñâ!w1€2àô¡a’ÖðÆ,= …yÝj$3곺¢WQâ•M•¬*¸ƒË…ý§êUìh_=繓‚´R!ëIù†kwsO<[w‹©ÜŽF,ÔLÌÎd/»°ß& ì]Ë+€tètûÀži®‹s ”Â×HcÆÑ-0äMoyÊ£¯– Ù’“±²pq* †‹ÆØ0$±Ð‚AH¤7êÀÐÁРuÃømÏÝyÍnH7ïC³xÉæ¿‡ú7¢xÕFªAèŠs´éÏp)_ñÃsr][AàþW?¹ÈC‚rLH„ŸÌ[^C1( q2R—@ —uZpÑàÛ[ÎO3’aš‹´~5q½ößCa‚`ÊÅk®¥´÷E |§77XüSæ½Ù\Múê@–F¯ú/èŽQEXŽwm휆ºAË»©c™T‹€ž2u›v] ‘)¼óß”o=D·. øW„¥U³è•l±ì–g­jáìÑx„ñÞyõºö÷‡z:nuhÕ¹^â«ëGílp~ ©ï5|÷“Î ï·o¥¼ôݱÓïŠîÖ„Cµ„DÑøÚ5g§ YtS .Ÿ†£.Ù!oLà$=¡šJ¼±H&]Óý»dº²îÅW¹z Ã$t= ÎU_²¤¦¼ A\ÆëŸ©¢|ª\·çT3èUëÍÑ.js{cÝbpšŸtÉ/ÁÊmòR¤MÈ óù€|‘Ø4[Œ6ï´í‹gŠ”ub¿n7¦®ß½ãNˆ‡ÓÑ[itj¦¡ƒðÅ8´—Іçôg¾Zê¼ËéòTfi¸…-7ü**k("{¤[{òsk ׈_OØg·–÷oÆò+Ø ’È2’ˆMÉ)–d}YŽö;P·¯¡e‚}`hÆÇÁñïÙ¨Î<¨Ë¼tŒuô‰`HêÎsFDVæ{sM.ÉpˆÀÞÔNîzRwq–Wîk ìIoR^;?ÿ3]uÜêY X¶±œÊí/êÀq¤+¡ï-_]Ä+¼Õ? ëìhuJ{í¨‡9–ãï—,÷,kd€”S»éØrà ˨ühn ñÐãϘ|§Ëa®%Ⱥ_½ÕÃzíw²&T±ð²Óûžd+:aŠèÀ”+è݃¼gl·}þ ô*Z$ÂnÎßb;UVÏ‘Œ‘Ê«î`ã)æ‚ÿ&™Mœc*æ ñlªÑ½mL—~Râ›{ ð@Ÿë™h~2]-é—Ò@l¨…"¾4†Âé ©€gkœEtþ`Ns¤¬¡ÀT,RYgOôjg­§F)ÁØ"rÐo§´-4èô«Žÿ,†Å=£ë:ÏY˜¡ê¸®EKnU=Š=Ķñ÷ °«»‚YØúh‘L¯|Ѭ•›†^f½ÆìÕn@?h(Ï÷Ü•`bŸ¨¾#`Ï£‡t±á*uÀñ/pE>⽿²eÔŽmåßÀtÀ"Ójv˜ºÊ™ÊËÿ߬,Šp©Yƒü–«ØÄ[gt× ú§ötÜp¤¸êw$tÆ7p¨m†¶è(êaE‡Z9¡3ìù”¯B¹ˆ³˜,§9’]à1«Êʵi½ê¢'´W>)ã­Î³ªã{^Ñ r©cØ ÂyNÀQw {9ï‚VKàœÅáGA"M‡ðsý¯îOÐB°Ý)í¢2®º)4óZßLE¼úö ³ôcJñ^+ñF·2E-6²ÑÆÆtGÃÁáøwÇ$„þ¦ÌúM­v»älÏoÿêr­wV3û@kK;}Qàóà‘Õ5x Ï(®É‚†©XF#5P¬ê¶Õ‘Ю—šàzŸ•Ýûr¬ü’¾‚ÿþ£èØŽ4‰ƒg`ÏÒ84§´°…ò¢°´Ò~N$·E}Q¯‰ÞC`¬.%S†®Û™éT y‡®Ì3.k‹¬&<¹ËÒÁ,u-.ÉÅY jº5 ‡å)$ÌÈÎi@à >KÁ'Lo˜ïLÃ2Su8Ÿ:øÖÅ:+=,âLŸóžƒ²¦;Žpèõ~‘r­[KT¶4›ƒ{X±S`)‚<™-Ø VÇã/ª^wÖ&…¸W/+Èáöð+Já îF»%„1N_üFµæ ¤p.MôÝ”·@m{¦á ;jd¨KÜ` 8,BF\ÝÍ´¬á ,¨Ýžlõ}ô@ÌÞQÜÓtgL$ ‹å]okÀN;Ÿ)Âiu ˜ªø–÷lËá3 ½'͈鲣Üüÿ^èjÏHÂQzÒgzv © ~‘f²R¼DÙV_0¼Ãu/c¯¼µ;`#Ó'‹¬Lô¢˜È«3ÒD²6cà=ô¶ ;µ„)+k:HaZéây¯¤zÿÝÖŠÈ+ ‘xËÁŒס*:XBøûù`"3ËoT¢WôAWí¼øl—ó©D‰yÛEKe;ßv£”¯Ž=*޶˜Ñ<ßÊd‚-öèßj E l´þM)À;eÜ*¹…}<‡ð&ôÌåæw ™¦¸SÑ𰺵7º]ÕîAÄÂ?”ÞšRß_ŸõÔ?DIQÛ¬(˜Õæ-Ññ wèkÊmO[ Ê8gà„Í5z$î6ó)ŸÒ/.ÍYÕx_õF ÎîjŸuÅ2Ђ8ÿ¹Ârëÿ’¢C÷®pÇ»§¶§w$ð_Qýâôlo{‘ÙR@p’]“ÌÐ`…95=©ì|$½‹3“9Åp‹µ/ñžŽéÓõµý&Ók¾0%¡ ¢…•’Xw1CEK|꥛UK"Û•Œ]F WçH²v‚ ìA°9«¼5ÍÇ·.ßË&bq”ÌsÚ0©ÚcÇô9¨fI@vÏ ¯ÞÂ]-[‚gm<åá÷&q|Ç®-»¡r»”c‚ÕÉ&蛈•\&µ¸ZèSõAôjºZËÏ]ÈÊþ&U·“S«Ý•->á¿„-Ї˜|’ÕÆ‘«%é-ž„— Ú±š®ãîi©c¿É1±Õ$—.¶!¦^àkfäù¾ãC½ á¾´¬sêÝÁDt·óKvÝô»YU›- E¤KjضV]퀄Ig×GÒo[f¸PÁpéOûU{‚®APv ß)î}4õqñ´?¥Øh P{2c‘í’YÊZDÊ9‡ ±oÙÙße\t¦žÞk [ø²9•Ç9«gCR;¨Ä1¬4½[»$Žä3ôå(QÙµÛnHãQ-i5ݳ˜V•¢ŠUýëz= 6é_UtØûnÏx§)Rw5ÞX¢3¯ÍYšéb4þŽŽ¢58L³yvt¨Ù£ F°ñE ÛeÈá–v®_§7¿îØÓä³3Ö¿›Mb;ƒ‹Ü®Ä‹I|´žÄÕxœM˜Ö8kù£¯ÆÐ+O‚¶Éð~«åŒfKò32fâ ­ Á‚•¥Æ”ke)æ Âw ì÷hÒ>Hi(“?±±¬Wyæ;šÄ‘#Eöh¨3<¦r¸àumáõ®Æ|’ƒ7-оtY¨ç`sL Q_;%èªßih4X×µd==…θ  ¥¥öð$L•º|“nÖÓ}sĵÐ)|psˤ:ÊˆŠš:D:)L ±ÏHÆÝ–,‡&`fÑ «‚™4íƒFÓ½®%$3()ðR)‰•Ž­$VêQ±RJ?Íä‘éçnÊ L´i¸!ÚÖdÒƒdÜ´ÏG#ër×±$‡&òúÿ¸órñ+…Áå–ýïKó´ïÇLw÷íþû»k«Ð+npˆ“”½/Ò‰[]ÅÊo {R]à¯úǺ$_½x.PRc ]´RÁš›_ÄèÆ?¿ˆi‰¸—ŸSÔÀ®[E’uy–"ëÂøD˜ÈásúE(¢¹÷ä¨-q»s‚]a‡RžÅØóŒ ¥ÃŒA³¾Ë0"ç€;zÛ¯ÏW–NЉÊAúQý¥ÎUÓ™ŠÏ4úAòyiY62C ´È£‚X5(͵t~ÞñÛ­ \)l‘)Ó1TXa özíì†i•Vé³kƒƒfŸ€5'«é­Ž††M™åT÷‹†<µ§J>¶µ¬-€–³Ç™nꨰ{€ é3"ßjìõÊËn˜QÔ¦³_“Í^׸ԣb‰V's²º8Ê©*x˜¡~Ûbv®Ä,^¾½û #štu0k€”ºŠKc#]O&Š!eËRÑØŠôXÔlÙJVªuô),ê  L%íZ4Ð~³nq›N¥QƦíVwç-ã¹Â‚V[·j|¶õüöý*-éý]ìuóBšœt\Ãkä_*wÕšåͧ%}ÿ¶ô+]ÌâÒfÎ;¢¢0I<.‹†È{=Ð1=ý‚ <çG9éU‹…©˜æ+ós oB'yÀ•²L¸äÛ¡!hQ¡Á KÆÌ4 4„J˜êƒ%Évº‚#èdL–Vn »vžÇÿ4ðVa>Í£*Œ•ØrŒ 4Ћºa& Ûí·‚1 Í„ ©Mú¤â›&šÝjÿ”às’ñ™¯¶ èj JÉm˧.NecXÝÚ[gq)K‡<™xsÿþáóIø].•1Ú=¬ú£…K:‚Y_½e³ñPp´”=¿öÃz…ü¹Ð"}Ýš² êWü£M1Wý«–2?D¥¬ï2ÊŒÕóôÏ•…ŒObå„Uyn©r˜72ʆ<Á‡«9¯½D¦˜°`±Á÷¾^Ñøz>0\KV%®ŠºT¢ Á³M¬ì PFèÕCXWÜpä~ërokxu¿¢ãWø#íÂUo™ ˜‹hz4\ÝßšŽ)û~´É6“CñDž½Ñ½VÛ hâYôÜ“±Ìšo£0–”)¡B¯ä1/Ñ«ÁB|0o¬d2,uÚïŒ#r¯$ “q‘¸gvW§…o9„Èõ³±‚ºWtÔd ÍÅ$ Éèë´ƒuî4_O'ßXhîÎ:A#ŒSšŒcN©o·1Ÿul¤Ù." )Zo»ñ„s‚T1/ït0Œ?»ôÕlñÔüõÝ·¿Š–uCHçÝ3:­kKÎm°¼äÔÕ¦¦-$,OTÕ ôî³|1Kë4ŠŸ6;‘ÓžQ˜²7®PÊ~i‹¦BµBÔBæmé6 j½ªÌ€cغ(Äê?NNsø²ÞãáhÜ9æÊ}UóÏ:(·ó;ÞjØ“yU˜gî„„ùCÀ‚Æ ô2ܵXÍŸ°^~EgÜŽÉI15XtþŒÓQß°GuxŽJzt6€¿ÀêÇ”«VGh5Ý«šÞʵF³AŒ’0=g6r›IOJWÐ%ÇL4A¤à=ôƒ›†óïsç¢Yô~ºÿPˆU…÷|ˆ[ŠýfÜcÒ“ øbG-àcºÔó…Ò÷…GŒµ¨ås :œ$†8-Œe­$êÒ”d×Äu¢f³Ï:\^Ur´WoÏsP‡ ŽY7¿“ÞS¹¢”ŽÎç†àc~™•‹Pµ¢ÌHË·PûbxqÔ×±)´‡Ùí½ŸFš_`ik›sè/@4‡³)!/@‰ +å0ÔÕ*ˇK +•ÍšKbzŒŠÕF,“íkã]·Q€.zå¡äÜàKCÓj Kzîé8£¦Ta…»ÇCǰv…†­O‡±š~«½«ýëat½ÛØGïmOûëV_©K£mŠÿ_™'x,Û_­3XY¥Wƒìžá©h–ÌK’!8éàîþàñ¼ú=ݧÒîv’·ŸLRWg‡ªÚãö¹°ÙSW½ÝjÞ”ŒBøèò›ÒÎ'\tå >ú=T¨Më…^’F?Í£!¨>++šÎ‡j“±Ñ¹ÇÄeí=«bó·£@wùh(WÔöü‡Ö™¢‡“¹öž^d¾¼ã@1 SÃ:Ú~aJ=î‚Xb¡³ýSo¬(êPUV¹’:1,–Ÿ!áQÊ ³Ã¬ZHLÍh°<ÿà„ÔÞ¡¤îœá©jàdH35ÿ Ûåՙѽ!X³{o¥Ì"øâ:pÛKÁ"Èw ,~ô€Ý0Ñ[È_2{Ê  Õ ¤µd¢-’%â¤FgßÀÀ2ûˆÑ¾ÖvS™ÅŒ®°ÏF¯ì%øSu…¿Õ¦ÙÌùQgþ–5”a)‡œ×ÝPZ«é èìÑígÏp½Šr 2z׈Ԡ]õ9V]8æßÎ?ìõ´^fè{?q‡óíÝ™ùqå Âä—ÒE¯P—ë$/†šÿ.ï&f ZAk&Ø¥b1ûát¸‘škéïò­RPjÍm[ !-`lmþW/YaÎÚÚÆÆ4cÄnJò½$#Õø*”Z†ƒeM­#¡½ ®Üÿ1†åÙ.¢ñ‹À-# –vû²ô–8VéÜ)1¬¤€›lVfÓcè<ÄM=îU²éWF¤rýÎ[zÚâuÐt÷aŽ¢*nXv¶2Á–û f<%MìÙÚaÀkF`±]aø"u¹˜øíÈÕË~ÁcBW¢2Æä­:ï©#>¶T¹{ïЉëR±v{Î.ëjÉ€ÇÕ*8ÿPí›å]ÓÁ`ÅÂÁì‰^XÒ™5ã,H¡'ß2†7¯Ç$W±¶Ñ¼Î¥Î{j”¼ùú˜ÉålNÖ°ZÖpûÁ%ÑXÛ³é=Mt¼×ÝÚÀZ¥=i‡¼ÞS°ñGööNGÈŽ«`²kÖz¢Ñ®1Âþ+!Lo*  U,‡²û16GÖ J¶ ¬¡¸™r«\QžU‰0poy¦Jý… ?ûæÊ/i?_=<¬äªº_u,tß©gñþs0f7Ò:'p ºƒ%*¤‡E…0ub¦”Š®+Ù,øºw¥¥U ¢K½ÜZÛû¦ìÕ=4+®îéÚŠwn˜%]Ž£›×vA«É$Y>òÝKªA?ãT,Ë JÒI(äM‚œ$”1p³’·ÍK¬ú#©x’ú±ÎÄÀZc¢_tžbh=òúŽ5hØ6™ƒ¾kìÌ‘ìû$>lA¯f³Î‹ôoÛ’Žö !!ÔzXåÃC>ɱ½»¤ÎJ­;X'Œd½¢Y+·&N=É÷îSÂçY¢ÁttczeâqÐnÒW€m†wë_”èá':BƬ –ìüèjŽEŸ!Xk¯F«ªOp¨bå8àÙ(G-4Pôb.qÜ Û £·:}vp«Ë¾ÃýxãÄ÷ÁFUwÁ 9h ÿëÄ[šÚÎB'ötˆ f†eÍã»q"åú«¿cÍš¼GÑD…^¯"ò1£ºä°ÖÃjÙ†‡õþ'J /dóµ›ö\kÖܞбá…Ô“¸b R5½nq—u-¹‚önoq÷ª@¯ˆéR*ôîÑp ±ß³ßÙ­kÍ\a’qѵŒ!gÅå¾ñ––gW×3—·:V=)ððS®>Û3NرÒO3€?P˜cuÈ©Xi´&q +\_5q‰à´"½v-ãêQƒG~mß×ëH¨úçÇÒ{н÷Üи‰¥6.…-W³Ë3^×JlpŸëC³ôæ‘\¶Ž·ätL¤%%èØ< æægÂJ¯©m ‰é»âQeOC>â†$‡ngÄ a{& ½Ô¸ØW­Áôn†co¡|8@szh»¦ëô7H/Ý‹“êÆFŽ4Òô 5àë!òÆîî Z‰¥K§šÇqc~»Ð«™Çg@úÄ…a¥º Ʀ~WîñÞOy+7íÉhþ§Š•Ú€s+ P´OöÇñ,» ž§!øþ”ò -.„²»a‹ )k†¦¡OR ¨s1îSÒ r?\ÎpüíÏ×RZM—•12öO*â¶£E^B_?€'i&wÙj6„vlzݚǥ¬CÅñ¼¸÷d³qQ›5íŽ š>7A<йzE…rÅ…·º"CãØ{:×’ýΩbæÅ¢l+äÍ»”N¬ãBËÔÚµÏ ÅÂ…¿Io;˜\ôÔ¶–ùþh+Î&9&cò”8LÐÊ,yÒ\öêžb€Cä‹ö a‹sÇ®`—(ß ZÆò¬€ÆEø¾7w[óA¸ªóüÀFÌ øÒ"»Ç®y'3Rüp¿˜_,ÝG„îÇñ7U'R”0¬WvoÜZ*åhë‰!j§ŒB$wçÁß Z·2b“f«çà…4OÊá!ã±ü t5oÁá `cXÇ>o®‡%:êÚ{“‹ f…JjyNÕ/¹„Ò|¯Æ‡þ-šwp†^1¬v§°LÛµ„•÷ Æ¡‡•‹‰Êñïæ†4”99Ìåojù;ä0Ù¦€Ï‰9{&n-¤VÐÇ óî„+zWYîŸwÃôÏ«ù`¶;U—_vƒÂû$¹ºV½‘î ;y>w¸tñwæ­Êä ‰«ù#C½a&z²Åò_zë'fÝ Ó¸*ÖzëšÇ­²À”zF,½èÅ!nácg¿æ6 ,¶¸”äCÝ̽M:Ķþë gbEz”ø M*b¦© çx7Ã7B»~Ž~™qí³òŠP<ìÛ?D²aUÕúT™ÛèÖ'æyÃb<ˆôw*¤GÈ7‘,ÉvzoÉhñ;IÄõv˜VØ& + Êî©+ÈõOø•wÜά޿ª°ÅY°£†§u,"G“7 F%o€®æ}©LÔ#ZôÖÔÃŽâRë%<œ,u%fÊ=0Ê¥¿_Ždí!§cËÚ»Ž¼éó2†Ô•FBV’òžƒç‡%V*bd’J™¼ÌßãЪMÜH#äáG²ãdêí¥ÑßYƒ¼ ûIÌÅ.V—s3¶šO¶Ü«&AàÀ¤ãèhŒ9œk¿>³ AèЄ±œ‘<ö;¥xMÐu·€‘9FßcÝP’Æòjn¸nn]hBp­–¿um"Ÿ*ÖÍKÿ8z•úèUí!7?ˆ&¼v'gý /¸í o_ õ gŸ ’Š…O‘òÀ…$tA"Ò;ÚEA"òÕ 6RÛ «+ î%jp|_ÉÕùÕ¦.?šÉYÄ+¸;d%ÆjLx,Ûf óNW+£/ æ”, Œ ‹¶gý«¦? IÍ}ªVJ~qw_hmÝâ nåieM;Ü L¤‰~jL<¾†•z_¤h½{µ{×^¿€yIbXÇíÚÏèHhÍPžÕÚ(ö.^7‰@wOIã­<ï¨lÀŒ§“©Ñ.Nê»x%ð­¬;‚!s‘UÒˆ…ºbVܳ%Cêáài—¼CoNs画n5=XÁÒÄ 0."³@n¹+ôrT¢”2LÀ%ÄNÕ¼"ïñfq²•‡&9ØïÙdi!PSÑIƒäd•uoÉ¡XX¢¥&‘¾6Ic R_@óÝë Sz¼Ÿnð28Yê}–Z™‹U͹£±VL-º)n—z»Úˆ>T¸ €±Úbi²´¨ôUÒé]löƓŽ¢óü;âÃnÛÍŸ:z,#è_Õ$R8,iXÙëËf{ýÖúEöƒÊ¬sM6±$¦ÆGûˆ7½“6oš5P¼%=NK;9·xk*–`¾kš.÷ý‰ÂºÉöÕ‡–ù9 ”rüÊÕ+¾ïQ±²[}o˜Òö#Åš¡ç^â y|;žÜà°c”XÊ…0êIê¹FVIœÝsÚŇèIbc!8t}ßk*ÜíSܧrU`=»î˜%(²Ï„5Iƒ}6Ogš˜ , uˆ-8$É qÌç#LÃ6írƒnpPp$˜ð½Sü&%°1¬Ôi­ÒÊh½ 0(Ïý:îÇ<áGVø«s »Ö/µTa 儹v °q¯YȦ–»:Øø°ï¤Nsêó­xEOŠ>fל@ʜܫÉôع…ây=ææOºoÕýÔrÂÖMY™Ê¥`Î+u!ŠÝZßi_w£{ãrVÅ’5¤5zò…µ‡ŒXéÖ±mÔîçèÚ…*w› }€–o%Éc©—æœÝ5•„h£ž4_݈ðŽ pòø®r‹F™Rh«{ÈÞЯÜÕ¥ÖTâ KŽ\ˆaÍØ¡á<]¡úªµ–¼yW3BWjsÌ! +•®Uý­IÅšG æA+×oɵ{Eœ…ùoØûu…“ÇgSžÀBá‚=ÒßyìwnÇêNËdIÂR.õšuvCñÕ]ýÐøC»$ŠkCíîæ"—ÌtýW4ÑÛ±ËýÒ'¢Öz^šT,Áq”›ßùÔ?iëÏÞCîJôCYl´RjD]žt¼wWÇ鸛f(K.PÐOúF®¾µ·þó¢‰Ö"¦: ý*¼ÔAqpº®+cüW!yN½rŒ‰rP@¸†`[àÓmÕ7võXFòÕÀÊçìuãð»v`©°#W(uÏ^5º~¾w ®º•ù¬¦¨Av¯pû§Ð•RK¨K–uì–B\¥Ï’H£kK}ÅØ¶÷Œ|…Å2(ÿ—ˆ•(j§xut0¡¤õV&¥Î2V¢lò£ÕÆjõÝAô©r³èEŒzet¬V®›-qÀE H_QB¯ì¨»¸û{£óH›¶ˆ$|cçÅ_GeÜÅlq>Ñ  ÊÕ€`ü$u¡ß Y$TN ÿsS³cÎáV].œÏ™ëÒ(™xî˜ {Yº}÷”£ú~VÉ´k‰9‡ò²Æ'âiµÜO¼pbXgLnu Õ':Ânã'­«ª„|ëcK tÔˆÐÙÓ§x~,z>»Õ˜U8Epøéˆmñ£ú©~—4¶p:Š·Wa»êfçtσ(Â5Œë…eèDg$ mù{ÍzØX3ëb÷¡Ì^QÔÃ~ÎÆ? ¡….jQÛ´Ðaíu/@hÄ(aBÜpïúH-篸þcÁ3WX¸ñ­¸ v†ÿÊÎÝ6õÏRö¨Œ¿ÈûeT÷¨p¿=Ù†ñú*h”k²èp¾ÍÝr.Üàˆ~sIÝ*¾R2Ã2l—†•l9Aû äÊj—ðkÙýÅC‰ñŸùƒÓ€€ò,FwË?õ^ ÞlºÖåí@ ‘ ÒnÿÙ8‚;3™®(UÈ}xz¸Ð˜­’ü-(dzå’1QÉ»°¿}Gêö{tÁB¦Ò P¸Aaâÿî/¦LÁ(ð0XWê¨=å„Ýn°­0% K\%aƒd>VÌaÒ½êX{jéÔ?cð†“Ça')¢‡•y8°A²†ÖLº¶™i (Sæw/úQ¨Æ½*æVÊ·Ò ¦Â™P:’¾ªh‘Žõq¯Ò|¨')v®>oðhŽ\©*k¡qL Wt>š }Üø8l¬c´Á8WÝw´¤kà«åz­6Ë#Íf) T¿¦Xúp®þ»'пÅrI\…^EfÜcà(z5lÒ¿5"á0 *yt«s]KÅíPø­O1ÒŽvð5ÿ&u>*/0kŠ•¥0ùÐ ác±Ô;bGOõÍg-dx#6ÏnØ—óöSR÷ϸbÒ9P¦Hz$*Â+oöÛþªìF««eÔèj#™œË òù[cÄ+OFÇ™[aÌbY&õB«Z–c½ #& ÇÃkúÌ‘«»ñƒº ?táèÂUÆrî/L Cø°TrD-×e ijÕ3Ž™užZ4Öe×Nbq¢W«tÑ«ií&Pž¡í8O½™û y{W ±“)]Ž<`SÖÕ†à÷lÒ@O@ξIÔ«ðæÖ¹­ë´ïù°Ã2Y‡ˆ’S¤bCs¡› Ó9“ú¥\‹zB+2Ñpm5½Z0YMO ÷l&#™o›F’ý$S–Äùk`V2”³j¤‰ø”2•!¥üâÚxÒŸGÕw h/’ŽZ•™6«J‚‹“ã0§³ÓdÆóç¿–xç41ί”C{s¸kæ¶µDrðóÛ±ãŸã4‡ñ&,ÁªE‹Úk ë`QI/“„²ºxfȸþ-Y¯Î”5ž±Ñù0_`–H.uöL 'JŽ–¤1ú­OÞ,/ša]¡êQôÜ,”à{±ÖAt“ÁRKXUÊUºt†pð?ö¾eË•G’–›Îš©éYt/{þÿ'¯Í"B’?AºKAžê>7Cî. âa ÕNóÛM½‘ƒ:è`A¯}cu÷sY(Ø~Îöí“4Q ½*–ìþ;¡Wò{pðós¢^oVä ¦Ýi„—‹ƒëUG¯ä+Qç»ZÊHj*†å mŽ…"ül,sè^ÿ”ö|Ÿ_Ó›]UŸáë§5 «0Õé°h ó`,À±d§"¦JË=K‚,‰ =óðµ÷ðŽéß:V5vúKÒŽÇ _„iòßÜ*ê£ö R*É€u0xôøK ñEØ{ð¸ç´ß9=‘Ôý6ïÕ¼RZ·&,UGV*Óo9½ 7»¸ùÀ­‡qÄ=ª—Þ«&kUX`¶pä ¡Ï P)4KÉìkÅÿ–óôŠ~Õa™½9Væ_q‡#¯*Ò¤ZÚ*àŸæí|@°uŒ1Ö5› ·=mÆÆƒ€OW É¥™Î›† ¡Oæ™$ª-fô3n&fèëÝ[ìÖӫೆLp0ÐRÎ.¯£è'綃Û|¿œ£±ƒñÊèGoyÐè¡/à)æ-ÍhÄøƒ³ÂK#†å[±-ã“'n×Bsó­n›ß=x ôªŽa•]^w3+$Þ¦" n:‡ôï2€!ŠóuðfB«y þŽ –ˆõkk6`ØU k«2þNzk+ŸÉQxw½ó¨ÁÀÀH¯ò?,ŽZ9y™ýVQ«°‘©°ñ`Ê‚¿â-D®:¦Šu+µÇbGX݆F€€pƒacÛÓ£¼at•ÐéxÑP)®L"n¥ü^t¬šcƒgo¥&ƒ[nÖñß¼F50¬¦dZ9ÉïtO«ïw¡Íèø1µFO+ŸqaÙâW&ÝT‘ åάEŠ&l<£³ñi7 R€03=ƒÌþ°åaЫúÌç#°ªÄÌ£Êc…˜Mó¸W/u¢³GúÕ!\ú†?NH®Ã†–Žråa©• -“'Q¦<'û¨G*…ëdñ‹•oinÎËÙSÊjÚ’7ëÌs”̇¯²m“­äaù`ýÕö.cE¢~ï–Æ2€¯ãæÐ•½*–X¾6¾6üV/fb‰ö¥OrA³¶øÇ‹û¨›è"óI:à ”›Õ“˜*håUÙzûžX­„:HC©H'.£VåïÀÖ¢Á䤾òVfÄlnØ"åÊ"Ó¬TêÅÿ¶%/ÅOJ:èw+«ù¡/ƤTØ¡«Ží™àdŸŽ7‹9ÿL$ñº±u ù Yg–1röæ…ÕìjÏúI@}Ðe£(sÇÑ6šþ'š6š»YNÂú–éá4> ÀþHr@þ‚3ÐfÅÌqerÕêQ–/Áh§4ñ#®]7éW¾Ø-² ìJ/ÔW)€H«¯¥{uzWßY6ÛtˆÿHrT:Ñ«ÀÊuÁZgLvoÞMèxdߣÚÐïŒÁÿiSâ\Ì‹÷IÀ'gžÔ5/û’Ô¢i[`'…#Ê} ”Þ2vÊ­º‹³ ÓH”Œ91gVê/?ÿwúk¯í?§_µ‚„V5Ð{k„Ù³¸§ÅL}õØþ‡œúAœŸòBWéMdSìP+LDÓO­rý("„¨H°í)j3=´CSì±NU„–]…{:`,X%ßJŒuð vTîÍ'Áj€fn¾Q¥ÉAÂ^8°Ô5¼ò öÃ’ÎQáÁ°Œú›ÎäÉl¤ )'+BÛ«^-ŠYâåàVŒ{JR„·°§5ôn€k¬‰‚1~8'’4Ù¬dX'l”†-¼C`óºú3U€á¹=…]$ñýÙ!Æ#€$©&;gˆ «þæý E”w=%ùÎúüjÁæ1*ÇÈÏøúfÜ¿âL!»ï¨þÔŠÂíÅmŒŠÒn³¥zØ:9§°M¼®uõÛ[È›æÏ¥R \R7ÂõA åÁHö8c¢~“{âôzéTô:ÈN6»yLÝ"½îk‘ç•`ª¾Òü¡ƒ‰£à_Ð/E}D6Y¢aêiÝã`…½™°Ì0/³ÿ•ÐaÔ;Í[ÆbdRHUü½½ôíuyÆÃO¨^¾³èüÚúÍ+F×xâKט̆ƒäg w8³‡$K\°k¡”ó'å•¢Žý™ÃÂÉ*Õævÿe~ª IJ˜”[;z¦÷þƒÂ1¡9›–^AG]¡ú"=Ž]ž„!xØçŸ!ñ„-§½jgÙ:ì¡9¬í)tæ2£Œ¢6éuŽFÖÅÁËŒý^¢‰ŸD- ËöÏ0ÞµËóŸwà=ß<Å I¯®ðb¬Æ&ôÍD‡æýzôËÞ˜ØS³ÉÂ@fK«Ê÷Ÿ(ü#Až²a©†RŒoç­ÉòÉo^¡5ü(æ\-„>b‹{âHnq‘MK×”ö­±ÖŸ¯Ý‹~£ç€ÅÝl;£l´x>ëÚ´­…úkŽ×K`Št)‘Y§jMbg’KçíògÕÆÕ˜k·™Jæ–I.2 +;ÜkûíéWliçÞÜ« Ð4£h’ДÙ}h4®h”Û7¢ÉÉljÝ™X€ cæ NãÚHñ*ŠNÍîh˜¥62û,mòiWá3¼IY}g|–ùÉ3ÓqlƒŸÄ¼ý£’ÎðÿFIý£¢(íH–ÜKQû{«b1É÷õ¼.ÏŠ}°mxkq5)Ï-k¿­’ A±øÏÕ4–ã¶´-*©ö%t²ÿˆôí®×D8ùz›qeŽÖÙš¢~ŸM‡óR-j”‚ÁË™:lŒñC¸…{=À“ùòï+”þ)§ œ/qÈK茼§ÚH+.¬œEÕ(¾jòw¤öáÏZ¸‘b!(Ë‹Îqk¨rJêO¢ƒ?òÔ{fAÿqD–F º×•ŸØ‹ðÜØþIÇ¡ç£ýܦ¤Èx*&aXåã`,]ü\LðÞE”^­'a)¼©‘ vr<ÿò<£}:Ê:>¥›r\ ×úÇ´™°UÓ³2ã€^¡£½‚‚ ¹·t+r‰5nÁ° ¦´¾ì:Z´G·Rµ—”bâêG6‡|Ñ5Þõ);›è^ögw§ˆai÷?ÍųŸDý°$’ueL;à=V nõrûÚ|‰Ï8¥b)¢ÖÌ’}¶Ö†óWYhÅŒ|Ë;mvo“ól3Í”:Þß+5Üñ6¢ 7q½˜ÁÿfdHˆ İöÝ—è ž•î¤æ;¾î á’6ijtšû Ãjod9aKäi ‹^ñfgrYTˆ)BamSØí&rºê9·2ÌbÓÖ8Ža•OLÅr9ý¾MŠí ÊöSP¤Z?ËË7KŸ–W°\:°jÄѲѮðíÿ„“&éÀî“[„GéÕu!ßËôíL[ŽÙºj”TœÁT[\Ë©†9ÎÚfT<¨Þè¬ÈRYv,ošÚŒ¡„£Ó½ûÄßñhKGÂØü#¼t¬l4ö-‚똖ÄmtUB‹ôñ%õ¢>ºÅ BTr(²õd·wÆÚ:&VåœÛÙIïÂýƒl„”Ãá´¦ß>ÈIo.z‡O9Ä= Ek£0,<3#ëÑrœ5Àý~¢Veé×Df}7“‘-,®ôñ-¡OÏg&މÀ÷rð´wîi‹a§ÄfãV)¥ 2Z/Â]@åds›³OO~£ü¬Ìb¨óì[#Yu¼æjÓ2õÇ*Bö•Jtî-†ø¬ÊLà%9™äV]zöè)oÞ^cJ¿z]ÀØ·L°m†¢ \f6ŒÕÓs•hçBhÆÜ®ô6´ÿèaÞL¯ðÖǸ0¬--ÕÙQQö‹a;wÀs2à¼<è™Ü5cá‚AŽÜçÃ{抎úó›i>øKÓŒgZ÷UßæpÕ„¾äˆ'ˆ™Óî´BçF ´)t¥r w2ÂűdoY¬©Aßéè†ýÄÓITÚh£ñÚö¸œõ^s–žƒ²úØ3ÛJ?@´å¬ø³™Œ?çê ¯ªîòUó¹ùõг‹Ò˜.‡6€@éÉü)F4|nVÌê%ÁEcäÝÊàlíHkëÅYý»¥¨ß˜ü3y–Å—xÒ²>‡Ä?W¹1O™ûÕèðFî hÑ+´H9ŸØÔy¼¥+9¿öŸñs*ûýÿ3Ñ$ykì>ù.$”¨ø ]Š*ÎÍ%=™PÜa!<¢Wægy¶0ø«Ù9æKÀÿ†=?aN <§Š$¶êþ jÍ „¸w•·f6|A€h\ º=׬Ýoý`é®êƒ2`Wü÷IK©XÅÆ‰ªz³¥e¥Ìmà\}1†ÒûI¸ÊGÐx?uä1!haXbíÀ¡úÏðÛ׳ I \8<ÕqgÉ2´E-µŠ>gG|©tö\ËÀ(ÿCž QbÉSm:’ §‡}*bÃúàæ>#FM*w o¢);¸Rl¾«5&•š!àjxÍ! ëVØçùÅ„gÞ q.Œ9äÒÊ©µ¬Hs¥Ì½?}Œjdug0ëPZÔw`XEaÝRîƒóŠ©³ÙDRЫ½Œ±„íy~ʿڣW–}W#žk­"¾ Ã2šB@¿eJEéI`”“’ g¢­Ì]ÜAvßûæF3ÖÃÝÉŒ7oNÚŸRþrn¯«£øÜ‘Ð<ÎÀ~˜(¥#EÖŸ2t.ðg*îG†LwodTO&(F_MOñgEq*)G³y–‹ªI; ÿ !8­ÆwF‹Ç½i„ôWµÀèâ8?ˆ–{ÄÂsûs½–àÕªEp©w¿h›¨u‚º,uìªpë’ðì¤^]ÉÖGôªóôiËôlŠSäâ\æô·>H†Ò†¢´ËÙZOT·Gç á%læŠv „ æS¸“1^›‰Ï—ú êå> †¡D]“#±'FÄËžUÏ&û©o7@\Ãôøz˜Û±àû^T—Ãð¬8Ö?bû?{µŽsÒ0¬Íw™Ž£½çLx5ªâ ÝBKØÿÞœW:&^Ñ« Ù ùÇòtêžÔ~®'\òÎáÚ9WÓþÀš&4–RýÔàè|VÔ-“v»}S§'4Í´Òû ÌU[^¯ƒIdX}>ÎD«Gé*­£g#ØÃiÖÖ¢ówQ6 Õ'üýÿõ¯ÃvÕZcÔÈQ‹ÏáC“ºTF<Ôæó±ãÇSÝ;Œ˜1x’o…^í k8‘±9+BÓû“up (ÀÖá2vˆs%d6uß+éÄ:ñ è\éW^*®Ü–sð_ZÝJöý ×áàÆú¯š®FGÇÉD¸§=+κ/8ç%—–7ðë™-É冖œÛþ}zÌ#ªJ>°ù`'ëè[蛜Öè™ÐÀÆüüòšð6³Ä#gä5Ì3ƽÛko wGë—Ary2Dè'ëj_iщ^àæŠƒTì—Œ¨Íç8¢%D/…Á í2ë[ì›obЯ‘»‡Kƒ·+-/Æ…<È“¥Nwb>t5"´?èh‹·Ñ–$ÖÑ ÜôPÑ5p«û5b œìòÀ1e{òWiäíÿr8î9¸qÎ,µêÔaxbÊbOÚ%–.7‘!#1帬Øð/­¯å®6µ5ÒÊ=Þº2)Dj}ý=¶¨ŠÁ.žy4…."fÜgTÆeôŠE"žðå^•ö¡FbJ¶·mŠOEœ®„}xèÆºGYaâà­x RÛïÔæº8Øit‚9éMç;C±j‰ [£ëaøûdü—ÉCF‘l@k}Ž˜c»ðÊ›{ý" õKwVÛñC}S ê¾-OWÈm_¸ Ý›Èð-²áŠà¼Ù ý煆ƼÂ;mnoâ•ëð`‚®Æ¼‰Jp’û¡+{µY¿¥¶'„î…›l€ÔÄ+z”Ø ½eW ÊJYte‰+$î’5X[øÍ (²«bôgOe<ѯÌÛŒ²m„p¿…EÕž¥vtªŠÜù£Ê+¾Ó´M[Î&àV{©Y;(ÿ‘åzîWDâe°ëÁ°[püÏ3zµ_»C¥€…I½ú‘wu¬Ú'ÆK!æaeRbeè°ÙYW¿ÓQ3hl¹ )}ŒÜ,½zO£ÁúN9D˜Xe3Ú«éâï~ìOïæ8pƒays²ª?çJ›vm4¨Þ£Æ°UÌ|ÿ@½¥;P.âmßäa=MYáM>"SÇ9¬((jÆ”èÓëuû†ú”MËò({šO+ŽUJ,/Vˆðœª‡Wê¨V×þ i-$j Àr ‹$I”ò–^»Ä*E½xpçiÑ+ãAÁhô*>ùˆSË•ŒÜ“`¶àu™ónw‰™‡yÏ~sÎM¸ðÔ™’°Ði V©SlÕh†vT€ßlî§Ëp3á™æ(zýŸ3ÏžÌY3•dÏŒÝå” qî"å¢Ö^FÞ@5@,í×!ÁL„=HctA¶ àÕâA¡ŽÄB_Ð F†·½[Ô€ÞàhÒ.“Šû«¥âgÕ¬¶ÐîèB3Tän¿(Í-˺™(³£òVsêŠfÚ˜ªA4ñJTJ·A¯É_¹Wç³MóþýŸÿú:â€_éWBàÏÊ•9 ~ˆÅ85wuÆ2X[}ST¥Ã¿ÏöžŽÉíz¶Àzá‰/ß`%ŠPì–ƒüçöåe=bn!PÇ£i“w8s˜©“íA€UÆ`X­yâ·Ï-ü¼0´T³@ãgN Ëâ2žÚ\´¥u±¯bU»ƒËsžÿ犊M€ZëΣÙlgÉy€Y‰GÐ1‡Ð¼LÒ'ñ¥°ÑOŒÆ°¶Aõ³€ªzžHúc'‘.¿Âá‡HèÕ~/ B_î³±’°øEO¾éž±æ4…p=g .d&öz=ÌŒÓ 0cL,ˆöñð ß.º«æ.è'ººœªÕ¢õÃõ€ñ'«Y‰mR1Ô`“œsI‡ª#_wůÁq†Q÷ŒpQ³Îpà^À*}\˜.iÚÍÿ¤ÁÂ…*ëZ†m/³òÓ7 óóÄ€jdâòÑ\)ót÷§ 㺭Tô¢rûñß-Eê ÛVãäÛ“°pLʇÒ_æÀÇóM/pnó–½qGÛOKð°ÿ·9Yé`V‚O<  Ý÷åyÚž7íØ ‚ng!X›QÙáßNYHõuè̈أÄkˆöt½H ß¼öðÁ‚èw×ùO‚®ê9/ÇÄ2W Ìò<ˆ «í~Œñ!;³®Jtug¸Jy¤ª ó÷¾JÑ- ;¾mØIJäÆß>tµÖÌï'õ¤ì*'zVž]Ç5©rº»˜zUqëXi¼o̶äÀˆ„Ž€±0QMün(%*9q<\äž¼ÛŠe˜•ŒýYVø8H®ìèU”vž ·ý©Œ!¯C¯,Ö•¦qo‰‹¸…I¹'#Ï·ŒÞxƒqn%€#Ü‘ßí{€üô <ÏÊév­q9:R^šê¹³y1Ƭ¢Ïép'М—ó8$ø¼èK׌ûo;›’ÜAN­’®fOqoùçû^|^¤¹Ï?I( ;Mb/‚€.¹c`ÑW×ìÛ³üàäGWàÐPòÃ?slÛ˜ñ# ‹L8\# ©YÄ|:¾6Im+^ÃrTÚÓ ºòØrÐgÑ{º–Ž>ƒ–~¾¡Ýš`°×›àp{«Ò“›—€pæÆ²%ܸm­¯Te–Φ·l™¡êÖN•ޝ»¿å¥lX;¸¦“–yé«hS\ê­¿±=ÃüÆF÷ s/á $ Ù;R „$¥.lbJ‡èW˜4Ekä^[Õڞ˛XulàD¦Ø's–  zKù+U„쫜Ñ>ˆ=B\âH_˜´•žÑSÔ·mØ(ã2|µ3åq~ø@¾¤£{»dWwï˜bT7 ÐýÛgû¬µv»õá¸X²âÄ´µ:«$îÆ¦ÁcµkaÌw‘k¥%÷ªXœ'O3>ÂÙZ÷”…ž4«žŠ¬/e¥–Ц‚%1€ÍS=ÝNƒï€[¹ý ú`š¡Á6ï&æoº=ŹT™“†-‡N­¥ ð©Ð¸Ó{Q\wN”çå¾­µTÈcH}íS)ÿ§Lân_r#¶þ'‰—(ÍZÜ¢¶ ÜììéE¶#¿ͯ‘/s–VJ=tJÝ®$,{ìhÿÞw¤ª@WÎÃa à à~«Ó@³Ó5u_Ší%“Ñ+v¢²I›_Íñ4®ÔEǨø}ZnË-Œ„ÙR(ôÞ˜•}6ÍÔ+)ü=9à?j,­ön›’¡›–Ã5J ´êf€¶Iv†mUUÙô"öyUW"{‹RòUn¨Òw¦Ê¹—/Ž1Ïó41z G¯•ƒÅÄ Ó®x²çõ$¶ µd_º?…ã!ð+Ã/‹ßIRAÏÍ·Õ‘·eúo§]½úA èÙ¦ yX(::ìõíɰv@W´>'ýØl®©`µ²µËo?ëü¯¦ÿ§ø…óéW•lIÖ_ûû(•¦Œ”R Õ»R4õ¹¢ncúÐe×TI…| ‡MDóÌ™:¤SIñ[Õ•eÈ,ÔÂÉ ‹v úó“ŸnRËÕÆ)"ªÆãKÁXÝc|þ?!]ÿG’Ù(:V^ãOiß@ÃoIQ²<©Å"¤bÁµ‰¶ZVÞ§4S³§ë½Ü¬«A´¾ýܸ୻œ¤Ú²3ëÕ`û8”AM»’ﳜ¡j.N^o¦¥gþÇifŽDñep3Ö µ–,±æGBBÖwªh¹³/' –´#n;^Ya‘i>eÊóXÌ¥„æÎH—‚Ym«}Júxý÷éluŸ{E{“ªÒ¬:¤OQ„ ¾Ðnâa[èÚ®fKAÙ{AÐÿIS×Õ a,Þã»( ÎvrÆË~·R6V9p@›,¦²y0o½Ø½¡ÞºJåÿRÆ.«DóªîÜ[Iæ‚Çýzòéws*¤³æ¾<,H?Açt§b)™SJ¦•Ç͵~{S á9µ¥?˜hÎr‚ù6÷Û!;óŒ^0&ØAÄÀz-Ec¸ÞìŒhŽÝ=Åg ŸÕ0tKV^ýˆ&®— ÷Ã-•S%Ó¶§>‡ÿ/["*<©ûÿlF²H·²±DN«í9,j?ÁêTì-—½ŠŸ†ŸœÃURŒ¦ÉÇÿΛ •Bd><H!@}Æh>ÖìÔ’Í_9Y–ÿÙÀ9Žß,´Y€\Åxy¦*«§è’=zµr¯jM$ƒÛY9hÈa9ɆåâÃ*}HüeCA²ð]#è?E± à,Á-w€XÁÞF¯¸µk¬'^-sÄÁ7vù'ç‡ÇÎEí"’HQáþ™ 4{ àY®Ò†i›cº(KzhÕøÐJÕa°JGVÃ:)æÒÂÉÄ”$z†ÿ¹·ÕVPãö¯lÝÿxx–¨TýBdï£-4Éš>°49©Ò¶âØé`”/‡Aj¡ªlŸÀ¾“àZ#ÚŽHÅ'Á‹SÖa ½Ò1/ï»…›Óå¶¿DŸ/ÝÇ5?nw¥Ÿuç¬\7¥ÖHZÜΙ –BâÅäÍý^Ò¨› ×m¢Ö5Z`)Ü@þL°’:PqÃÈ@8£ÌRoÂê§–`7‡´xêQ(í7n*){–˜Mn§g™mŸ²;ßcMcûÑ9Oç½nÅø‡f¨Ÿ9ù¾¢Ñ†îù/üTyó؇q?½aã÷|–ØeQí«‰WÛ´!ñŠft<%ñ椆GجÑXU©dtJ¬JŸ é-;Zm0:¨¯ŸÁ‚ÖÉï2®Y Ó–y¸WÉQgbFGíe^a+6Ô~åÉàçãwÿŸ¦Ã£ Èƒ6Nà(ŸPÕNÖé~¬']é †žrÖ¾…›½ õS69νÆ'Ø´/s}Æ'Ü¡çB¤³µzxHLÉý´›¶•P[ ›”/Û_’%®˜â-Ÿ»WÛ«§éÿ1Eô@j+»O¼:y‡«ÛÝcRx¯ÒOÑÎ’ï¢à¬0™Œ*ëdƒ ÍÈó“MrÓ”ú³Ò íŸ3Ø+ç½ÁCßsfœ Ëæ4äRÓºàòqhl°qyEX䣗zjðž„Sõ¡­ý ù˜õ]B+Œmìóñ…Ên×AL’ÜR¢ZŠ~K½fd÷÷®Z½c­CÔwf1ë³tR3sÅ(J­\3&IôÜù5—zOÓ/¶®1vå'žlÅ´¨m·´®O†ŠÂ\^ÿphg±Ápô æZ‰nÏÊFRrÙ1Ã-ìÜ.…ç7¬î§¬ê'± ŽÚÉ•„åa`Üÿ[¬_ŒU À°ÁÁZTÑÙEk?mÞÓçÞÔr‡!»¡0Ðt†³3`Þ¯àw*~ó«g"{9+ºÈ´Ê/Ÿ~‹(Rv)žœýpO¸'' ©n›”Êg¡,©îYŠä›u“¡ã1ûeö£þvß Á÷‹ño³~Æš‹÷I6ö3 · h’{Æ5RÃñW© -ߪ„ò‘:‡8Y´óqro)Ü’ß<E^ÛM}ú;¨ÒèÇŽ~%ííôÂÝfñÿþë¿F"ÛBg»½É: ¥ÅU±q0›ÄXȣĂþsk¥Üß«4~,FLNN› ¡`ÉËïT‹¢e-ô@wUÔÄ«¢’^Õߊ&¯‘- .'Œ±ÑäœZZá´1 [Ïç¨ÙšÑvà/ãºïàЮ}{)?$J$1ޏMÉWêøca>2` «–C Ó¥ZY鸭ŠSÚ|ä#]œåð¸èÅX‡”~X8¨Œ·óøÚGJm,bS¯:·œ<Ò}E| ßÛÓ½;:Ö‰3ö:|Î0P%ƒ»ö übâvdK` -ßCQ³Æ²z˜ t/äî²wtÄíL}“\hfôÄ*mî_Ǧ‘:MU×¹, P)føë¤ú}ïù¹x‡¦Û»¡«WÞm%­¢Ï §Í»ä³Ê+};÷4ózáüãS:S-!ÁX>ó³»Ð@©”WªRAš0,$cMßBvÊ!%9K iµ1 <…Û¬zÆbâz ½réõ‘~„ËüUo YÜKx‚‘0¬ÄìeÓ¬ë¢#>6Úµ {¦."4C¨ÔKÖáÁ"§¸w|œ­§ºm% õž—Íš‰±·#|þ¶@,cm~+5 `Ã&XÏŸ)Jïÿ”gêFJY}‰s$½e¡ÝøŽ£²Š/RÚ´õ¼Þf?¶&²VyZG'wõ†,\gYŠ¥{»ã4¹l°Š^1®Zû­99ù'bÉÚüñ ¸÷fæ!}.&Â\ò2V³ÖšúÖ- ÙÁl³ëåÞAeåüšÖ'Ï!¶Wççhˆ›¾„ìw¿ çÇcýðYW:¶ge… üwhJØ™uew¼_XÉîæû`[aú7(ÞàíýWõb¢œî5ý ûSʲ-²³3 /Û.­^½vè %²…ËãÐþŸJ¾€à-UK¾UÜjãC¶” XWõ!²†È–`ç9ÚñŽvQ¡9Ñ£pŒc‹´CWÖë¥s÷\Sù½nrFpF™ò”y¸•#J9‡¾žjq©°ÙŽP{±Gzr“(ÀžÄí² lÛ›S`X=½N²³ ·þÀ5ô ß­çoÿõüíÀ½UV M)Ц>|ÝéÔΕظuÇssDf~,‰¿Œ‚|Æ*ÎuZ·`îÕÞ½ð&^Ùl\s©­0"Ìf²'øGv–“Å›‹AWç3\O‰8Eƒuê.œÄfOffs$·) ·d¡á±vN÷A­-|B›ä™‹Üwp¯ø\jëY»rqµ%îÀ*Ãx¯ì;„ÑO‹ßZ´a)󯮠ö®~,cçÃ*޾„bÜ‘‚aUg;V8Ó3FÇ>´>AwC¶ÓÄVò©­˜…Ús(ù…EÕ 镞xÅ—L ^ƒ±ÂŠV6–«¢Ð×áëŠT~WN2LgAd•ç…~~ë«gë½+ËDI;ÅT*^*G/¢¨ÛÛîÛdt²³e¹S8ñ³£Á™ ƒ†µ²:ü÷äÃ:K‚¿'ò…–y·ÛÑ«b«ü –¥+µU‹’v™dl©viÿ~æ,è•HxÕpEÑ«vzW˜Ç¿Õá§™Iİ,ÊÚ’ ŠRð™ærH~¸¥M¹…_%ÂÁR%e7'ƒOvKD“÷‹#÷‡yYÇÂYWÍÌ;‰Ø+IèiéX¼6Z~{`ç²Ú¼©Àš c]¾+%xbÅRbƒÔ<¬êæ†í̓ÿŒ`µ‹í‹¬´ë¨c„ÈÄxe‡®qÛgÄâ »á­CÐô9T¯µ€ý¦t„зßz‡7s÷˜¦ n¨+È&š*7)Í2–«¾÷pÚvj­Q{_4^öM ›K ¿ºý=C$_Ài³$aÐy¦S¶²7Úhôª ]Î]ð¨„*ŸÇÉlWÃý8"F0‘ySͺ¢ž2¢Sg6ö­ÐU‘I…“ah<²ê=”p;¸mÕ&zå©Éb®Þ°Î$"ój#G ÜI„F¥kÝ/†ÁÁ|~lM(ÁŽœ mŒÞzºå-*®Ô,–‚ÿù¯ÿvµÌxG¨¢ç…Ýt9Þ¼=—2+{¢_ïKh…½Ä¿[6ô÷_ƒ$~oVc޶No ijC4üÅzUŽÜ9‰WYN €î+½…>ñ€YòlÉ=‰¸ ¦I®ÁÝŸC¸r “®¹ Œu:¨’ai¶¦Õ9¤8ɰ~öl͵^!\ÿ½2|Ôp±¥{õH’¶½ØØj~²ÁC€±ŠLÜ#’aµâ|6LÜP”]…8|õ-68‘¬aŠ?»y5HÁt…ß` »ÍCP}‚®dôª‘xÕIÙÞtE”Бƒ?È2?†[á¬ÜŸ®Ñ‹[ M¶rALIª®)Kòú.œ!è¨jëd š†SJ–Œž9uÍ/ÐyËu#[õ³“ÿç¿þ»8y ¼0?Ò2Ʈж-šRêUzó°¬´îR¤ÄñD|¼ÐCg;´9£®¾)+8c`4ñª´Ë‰WTïfÜ$›_tÒCk6z÷øE&! ºRé?TèjŽœl8n ]‰JLíDaá–0, ‡£ÔE>ÈÑá§âo„ñ„Àâª&´V_i§*Ÿ\lV±gQañ=` ÂÕ…[+o„ïí­IÐUkó6€‹ŠÄ=¦aË øÌ¶³kL)ÎÐŒþÅtlʦFnȦûG«+ây+¦à‡‘ îîŒÕ·3-Ôì]»2ÆuEvWës|*xß;fõöþ‰ã8䕘}°Š­5añ1 ]àÚ³®jzO’LeïïZ)ñ`³l)åïÿóèBè ïc=ã!#öõV°©ªö$‚èæ´®'“SgvGkóW5'Ô·òX~+µÁu ±l¥©+ýÓ[©AeÈR ß<0žv–WŶ©ß]µH¾r»ü6â_Cå!:¾?ë°Èg¡±Î»¡ƒè*+à \ýªÆìÔÉAÕ)¬xÝæŽ„h;‹î$¬^¬ýù™ƒÃŸl‹ÚF°ªÉÿ¨Î"3ECùÕE/\9ü½3Z5‹GZt÷+¼7zUÚèÕ.51ôŠûÉÌ9óæÃjíÅ`w¡+MÁj¸Õé[(D›ZÏ–Ó¿«Þ#–Žú¼»‡$Á’…†Úk»=²p³ýÉúþ1¹ UH±™A9Î'ÁýôÛPOæ £ {ö4«V‰Œâ(ÂHÛ5ÚÐ"؆Ž~oç¨ëЕ}22°J¨-ëˆ=‰ËOF©½Ž¯ÔØ@ªV­I5¢”xXP°ÍBóº+OîÔáÿ¿ïûehy}+êõðö²kã!û «²õ%ˆJ…®˜­1È‚ÜõÉ”é`Þü=ŪÚÐ+ŠË›œûÝßö¤ÑeÔB¨:ñ"Ú!“zL¢1?ÆOA¾S«^ÍÎXAý´VÓUfÔ[ö}b„&SN–”å!z¿gh—BÙλj Üæ­Tú‚æ^é¦/ØÿÉ—x¥W¾?Žƒ2`Ε¨è¼Šu•p è*ºÓà*VÀE‰õòºjßqŠžÉýùVyF=?f4ín-ô]Õ}Š`ÓEŽþîÐãôïz–]8Þ®6°ó·4=ûÊ•U kcJ,¨N®¥BdóŸPŒ± ®º0º+µsW òï“URÜÿ/YëENþ­‹åµÕÓΪ"…BªØ¸šgïŰл/¡ªœÇJëêg}¯¸½ã1RÝx›»=Å¢r[¼üZ%ñ»æg\¨já”jÀמüªc+˜eNºbö+ÝÄSLÿQì~` "ÕîÃIýª‹š 9 ý¢»‹BØ¥ìõê Ð ±Œ?ÿ4¯/ôùÄ ß9† 8T$îÏ«ncIÈF@I“ªTÓ÷à)ú~ù-mhŒn…¸¯UEª¸-Zÿcm³„A«bc0ø£o%¶¯Ü±q5*ÑÆò9 Î9š×S&+ŒïAtmUj°SÄ,ÒÏZÅ‘DWŸ7¦RsôÅÎç¢éÚY±rk#bôRÐ)µ[)ü¤’& mõš6€Õã©ú èyR×òïvncgÀSÿΟ„œºÀ*ž¾„Åx`ãôes„{—NµÌW=ˆ²7Þ^^¥ÎŒËNò£¬aXP¶@»ûm†ý5÷o†ðäá•ò+!„­tX ¹2‡T³j YÔ½ÿJ6V10ª5lrg™›"£Õà>ó®žÅ&ícš³dNòßõM ‡Âǧô¿•‘Á\OK;nECóœç_ÿ¨‘­†ì(“]Ð@óQÍIéÁ¼þ:΋‡L誸#t•¡-¯0FŽ{+E¸êÉÌ]¿{`Šž\'¶¡ xã¦wÜ]5Åê§ŠÀï¬2¸ñÜýG`‡Ë !Eȧ ºµCü«{¬’ÁÅ@ ¦`çæ9Õ“6^ ¿ã”Í~¡î&q«Ý•] é ì‰!¸ÆÁv66»|ÉhØ%—´š-zÄmÏ|ŒiÚ× }xþS’NìÁêT;†•@è.ÀXhÁR¬ê0´Â%qÿH¥4YîÑ&¬ÍfB6V‘ð}ƂڞÂî'4]^Øû JÆÖ·¨¡Wp+JñFÝ.Üч±[ @›Fºj7Q¨MÛnU:é Jˆ|S1{5Š¥9v$Kq§•Áø1#ºNÒ~Mϰé¹,ÐÊ>çãh§à8eSð^гGaØ w9ÆÐ‰®ô¼ªV ³æ¼hûË›¬_…aunW±úé”ó\ßa($öÁX¾H‡O<ºtûjçÅü=IâÑïu³ís>ô–’ÊýÔn(ŽeÃI1m§­Åuuðÿ4°¯zÅ–1@ÍmMÑK¾¢BhQB–+™”D5´cÖ7f%”¡%n’ìe6­v¿‚Úú¶xNJäíìÏ%¬f%×>£„'ÒBãÍÒ‘7Ê‘ën3è=Öv1¡ ZPE`ê°¸añÌœ:{V{ª$S´½ïMâmh¤æˆ-˜”r³Ý=`‹ûŒôê ýV’Ü11ì«t‘N Á޲ ŽZ)&ÍÛÝP€™©:F¿·—FVntv+PB'. œ€[«˜ŒjcI*Ö»cX,J3JÞÃÅîÙ/Ün×¼`À¯eà Ø±Í,Ò¬ž1}S¡–Ì5NV™ñæ&ñ„[5=Kî½Ã³váVé' ýjJ+¤‘·§wMÕõdãvo›ê¼zõ !ý|ãz-’å°ÎÖ6FjæRò°¢–› H«~r“Ý0‘Ž¡Óyë·zJu­`S!%ýªÕã‚ÿsC¾Õ>¡ŠÁÕ©º;{zxôã 龜0¸õjOiI¦ö6Ÿ÷Æ"Þg¥\HÖs32¤ æ›ÅËÕÞ»Á¿É‘mUfNõµùà^[–@Œ…]©ÐÜj#H””ÝþÄÞ@$Òb±´ŒBÀ*ï€aÍ9ö x¢lyù ¥aXú7V-¡+Ω)‘(Çù‹¸jã|2kA¥,œß[-Oóö®þ©é)¢ÉðÝ^yÓt›×%Âx£|â+ .ú–µnûÄŽ¢€;o1äí£t{d/ž $ñùÔ»|RÒÆ°ZdX-‘E妊¡©|jjÃqWï]ôKuä8ªV‘´-—;ZÖ}6ViÀY (×ÿ´™1É;ŒC&ºª2¦I_ÇíâåõÑÆ÷̘զÿDíOËí£ÁÒZã½)óÞÊj”6ÚÌ ,ÎÚn¹+ºRC#ö™tœ3ùº^è˜Év„ Æ*sÛDúL†ìŸð ã%^8¿o`¹ûœ{URÉÚ‹‹”äðŸÕôÈ=?ˆ©ªÂŸ‡¥ê Ï ×b#{I RÍîÒ EâÒÊg´äç³UJC†q«9X]uQ¬\ïU_ô\ÓTZ§Ö4À|!u¹?_w±QèaÕ¿0†a5¹÷¬‹â1 b/p̰íÙ€úÞ;€Q÷—É`nŒU1âBÚ˜-~(*”z L:ù¶ñãì®Ú#qÒÎêà,H(ûÀ©[;ô³Â ó¦Í'© Já#¼Û97`õÉö²W“¢!ó3åÚyÆp‰î½s¨?úëºXe»³± ™øÀ’þQ.  8äéÕ‚Ìþè>»‚"rAu>kœûî]æu- اŒ¥ÑºïŒéM›ô÷%TÂ2±=¶ÇÛµ…\Wòä«ÂðÌFÛˆ’2¤\5¦fÁ ýÝFÃ"éHP„RÝF$g¡š>’HøBú63ó­b.&BÚàn•é¼A<šr†©”«VQ›M[ÅõüþojœÎE:2,âÛdÓDbêwÛ'Q1‘‹,ºŠd š¾íY9ÂøMC^s”õ‰Už]ÿ:ËIx»ˆº¨LXFôª)Úžõ£Wý®HÖѾÆ:ó[—i•SdXr,©s=žpÖ^ÃíÊrêßZõK¡º.§.Üy¦íÉÈœËÜ4cí\A$îC²ðG–D¸þžP—ýÖ„  -Y÷ɧos6û#V^-áùo’Õ–2Ñhó­eØŸ6,44AzÚŽÇM¤MéLþGCµ½h¾±oNúŠmÝeSÃÐw¦)aKG†~›z·á= `!Y¶Ò¦°jb öŰËpÉ$ÇR®\[ƒs=ä–TØÉ¤î¥žuºK¢;ZšÃ¾v~¨èÄT¨ÑÌûPQMUÐ鬿¯£¢x,ú‚"'j¡JÓ^‹ÛNK*hÕéo¤8ç pO9åÍr3ÌqÆ•ºí‘Ò…X¿­7Ý ‰·£òÔù:é‹â­=ïO÷~GÜ N”¬Mšÿ4ÇYL1K‘æPÒGˆvŒ Öz¸÷”D“·š–fõK9é¿È˜oUå¤={,4;1”=Ý«À…Îs!ÉË,×|²+÷çñèójÿ’·ÜÑ^Úuzy’]ä‚öÕlùŒæŒÂ3†ºÅI_Ü¢_"eF=düEÉÆ’òéX= ?Û-2¬*´t\+{¨Ñßm]EJ5{‡­¹¶ ‹cGGlFÁC‰§¥"®Â‡–3Süö)ú”‚žFKM¦t@V\”~bÁ÷ÚS˜‹\óŠŸV:p÷÷O“LX­%ñ¡Žâ'»ò;¶y»´²PÒø#@«Õ£JwuÅ™¾1©µzûÊ8€U÷/¿¶@èÞäçH½‹Pƒ©¤´ß‚½îÈfg1sÝßÈì±ïž&Ñjeç¸XR®ŒzÙ•³ÐÙT¹óÈ´<Ú£¤hÂöò2(*)¸Õ´í†OÚžÙ??Fµ êåÊbX·â´†Òcb]GPà\k§SŠÐ°Rü6$Y{oå¡¶2J:*h¾Læ…“KÀýÿ+žøý“šZdévWÓ˜¦[b«C¤Ñ„Í„®,ê«ËÁxxHz™D#XõKwï”æÔg%Ðäc)º–{“ØaPm,»óÄÑ·#ýQ÷+Båîí„ëühÅ7 ~;í‹å–^«ü½E¾UOô{ŒdÅÚô)qhâÄ]-aãÉžT¬âOcéÏ-L÷ŸøžâdvØ+Ú‹Ë#Ûª5i½¥‚w>:{‰¢{_ÿÃóßxüã§Çû•ÇóßLÞ>‹øö{çƒ yb„Œh^³G]wI¾2Ëñ±¿:ôþuÒüï÷dHx½ƒŽp—“v‡ŽðAõìÍáôŽySYP­~ä•…R6xÖ.¨0ÁÎlNɦŒñP*ÅD¶Ø£<ï`ûزDC^Û@qu¸pÛyŠº bκ Øð‘”`ÁwÄ•GV,`yùV·uãaøöÀÑKJ¤|!Ž÷²N «Ø›fQ±™ï©Ú/r¦Š@†Å1„$,̰ÒCˆ{F YGMF’*–eëƈX}ãuwÍÎì¤ÉÌ»ÞÈ@qU½Êq° 7!²ðȸR±2ëçßdwÄ‚‹•ÅÐjÐRÞjÎû¾àŒ‘\ØP»œPªüROJ”¶!Å cy»hµãˆ28:Ÿ>®–õ3'dÙ\”2Pk—ÐÎ~¤hÏ–U]x¾—¥*ºí@c5˜JbÎÃx[ª¬š÷jý…»¬µó=}chã ‰µÙõ:ÿ¶‡Nåâ¤Õ‡ÆùV¹RývU„w „éì7â6pêlÐa“Lz @ؽ4= ?Bf3#ßÃíì}y•û;ÎÝ!ZFè×ó,Q !k–¥ÜU{μéUÇ­u”’q…°ö\œYš',ôNl¸S†‰ï‘XWËbc95³\Ê=º)E$,ÇYö-ysØ¥“ôT§‘Í5ïºs&?=Ó ÙL„l3VgèÔÍŸtÑRœÍ ä5ÿ|7+uטr5´¬LRYÇÉßÿ÷ù0fåCÀîŸ,@5Cµ\+0lO2,Ru¦öÐìÑ#Da;Pf øè‘¯É“v“½ç@ºkÒŒ¾$áÙr]5‰®Jvǘ*zØï³i k~‡ xÄÕ­‡!«íË´JÁ­F;ÿn^Â÷­ $-«Ûk°Y¥îyƉ}ÕþÌXðF`ú[@WŽ_ºa-(J a¹¶ÙÖÜçt­›4=ÿhJXŠ©–°ÉKë .ëÜŠ¥ÀU³…ëe[Ñ×õô{ÙŠAWÅFlq•nÍbvËÍÿí(”n#—µ7y‘ư/ /Ú¹‰20=j9aö¨ÕýVF'ÜÜLÆŸ™µp삚ÓkOîHÄZ¦Uð%œ¶JJ˾|/=/¹œJÏDh6jçÏc)Wý8f$kO¹R×nꙪÏfº*w¢Õïï”P·ØUkøè­¶)î¡-E¬wp G¯þÐÂ+„¹_ªs ×ÙW42±M–·NQS~ fÎí΂\`e¥Uï\M@tãm­&ܺßî¢åXWž,!X–"Dùg Oûôï«Qù“–ö¡Ùâ7MQž; ª·×›%{{@x¡«ð&¥k¤ÙÀH€¡¬½¼÷ÊÞÍtý(¯Ã×°ÞÖ„}Ýo‹­†ñ&“­cöpƒÖHJAQR¿ÂºlH€E•F]5¿mÂ) é¤íÁv<å*¿…« â[Æž  .½· ­TЛr•ž¿Î¤>É2<9"6) óó}ÎwTúOP!ð®0`ص,²O:Ù'ç|O^×Ü}]MÝýþÇ×Gm`º(_ÛEÞœÆ0rŒ:sð­ßðs]ígppãȦá¤ÙþpøoL{UÁßshо†¯ô;ˆ¨Ê¼gßkfÒö7NKÊYh¿Kz§í“‚É»¨Û:w¾Zzfá:ìliy&%ûÜEÊ,sÕS[4y>H |ú½‹Nb¬ù^Á;òœfi ¼EótÑf³š±f)0Kòp%Úë&ôÖN•O¥ÆçÆ*ù7`¥}äeAÅÈ]ÀÎßå*',}û5¬knSòÑ}Ád¿§ßô^åS®‘åR[R™,]q¥‚Aý£ÒêY.]ÛæíA~½>"më?5mΊ³Ñ_mƒ¹G\´´®…º16³?x bíg•¯~¯ÌηbT¬/ݽ¨þ/öÌs’Ý.Ù â9ò¹Ø3¥cL¹A"OJ2‹´•°o§¤»=LL‰k:ÙÙ»Ä%C’0êó¿-mœëM¶ú`†¬"•þÞ°Ê x‘,¿õôðÓép»¢pß› oH…0B 0¬…„›èÂʇe0ÝK)¹2¯—ùõ¥éž<)áJgf™Òu;™€Œ„{7íhØ]Ò4uwX—5Ò}GD/mÐÆ¾ˆG»i Æ*ó;g5?ò” º¡ôÉ÷ǻͻgef4l¨¯cˆ«õx¤b†ÑÏ=fŽö§Ñ…}'VR‰8ç vÚS1WHçKR(Û dhK^Uw3Æêwur]V ¡O–›q4yPr,ÆBÃÖ„tË¥I64„Ný1Tâî?ôÂóó/½ À(RÕ\* ðÏÙ ªyaÀɳlÎÆ KJ¾ݵI `Ò*gùdULJ©/cßN.JB‘ž× VÒº/ó?.¬A‹E˹\×+À/Ð#üE_6î ã€l"ΉÀY™ 0V¬T°°§fsÀ²÷:~˜›PP ضÎëS×6FÆâG²?ñÛÑ‘ZÇ€‚âÙ®yU¢#H [&¾Ádî´J•é‰Ðš9pt2ëÓ¼YÜÐ^O%)Ý#ß0à-L£Î¼óÛ ”á·öLÂçÁY|psz,g×ï€6N¥ï?x2ýÆI¾À1õ¢AžhäÎDØ__NçÏÍÙèÁ°Ô*ïÆÖ8¾ó#ð0’æ¢ÌðzV¼3ÍÊ’qí²Áß* OaIÚÔ1^¯àÍ·*IÝï¦aqÅeéÁF¿Z®ëÒ2ÇM¼§µÂs#Wì:EýÚÌ|^‚bkžûÃ< Š1ëÒOteK!|ùAíµ†ŒÁ3Ÿ@6Öã­u6q ôA&JoÕP»k‹bX‰½ÒŸc4’±Sç¹')NtûŠB[ÑŸê‚GH úŸ¾†[iÝaÔ ¡¯ž$ E]Gk÷œ,F= ±a hJÙP¿!ÍJÓzÔ2FXL¾… ÞŸÐ1`…ÄÉUá='oÔ¢úCkÂôEÚ-¦íö†Oy˜æ¼Íª|a ·—Þƒ‚«ãeŸà¯O¶¯ËÂ%úK¨Œ¹ ¹™àCý“0áz"qÁMØ]Òk£hõ¦Ã›“Õ)ÛH}íä(—kåöƒ¨ÆuGýôýJ+/x‚åjîšów¨ä 5U1¦ºÝKë€jÙ›zçûÖt£óе³„ ©éQJ>&Õ™Nnõage“³”Çy“¹ˆ•m•YÓ¹Û@£Ÿ9Þwã‘Ûœ*r0´„Û†X MõmN‡%åN9¿4_ë¼ÆÆ†-GîêF]û°aîÛ+RtûÞCr$¯j{Ž«éÃ. 6ºç` M‡Ä€·vÅg®Çê;Ün…[&ƒÇ¨y²ê§nˆN¹}¡ó†1Ïé$\ÆÈÂü¬šx¬ú1{¡a ,E­Ždd` A÷[f5gCÂÔ‚§Dk £>¬â$C®éZ÷Ä´Ìïš›˜@ìÉ®^ÄsÚ#Z„Ãm2²~ÑMÚ÷PóܪCëè¥aOXY•Á9:7ðPÓãFÑ —«[®Ñj ŠözÈÙMt^d<á7Éh%r6Ñü¿­I„º#~ ”RHÈ’–ÃŒú5“4¦‚tªJFlkÑyÐO§­bÍ  üü¡ÇŠ©îÌMð2oÆâºûdñŒ â¼ÉJÉYä›—8‡e|?"Ëí.¯†Q‹só0(ÓŠ÷Q2òþlNòaOÛV™ÈŽÖ+ ´IžÛÊÖbÜ]´›–úIý!äpù¯˜'Ín‘P­¤"8„pªvïjòBÝaœ(vp u ;Ï0EAÝÓq1Ÿn·ÒIÇûKðÉM zÒÛûf#8Æ®>±ïavwaXåÔ×âkbÎZžàœ0tõ ßÙL¹N5RÚÃë(§N±ß™åª¼6,ìÙoaçN¤jÊÏ—9Ôæé¯<îJ5©Š78ôR›Ü¶Ñ ƒLâ Ù;æ/ܼ± ³rhÅ+vͼ@©çÊþX¸å{`Ê|6‰áàòG»=*qØKòqbBÃJ`ï²fÌ+9bêÌÔó¬¼åyÌ1É+ÞÛΆ¶Aúwê¢XB Š» Ýë%‘œwÛžmn!QÀãfuë‘}ìq×Ç '±>ÇxJFÃÞá6ªi&×;³‰Ä­‚œÊw ºQoê™,Ö•¸=0Vœð»4ŠèŸ^.Í]Džÿ‘Û£¿mÙáðP+ÀÚ§~¢ë¦:™Ï•bT}Ué±Ý ‡*L×i6þ€UBÉVG´±–]Õp&å{£#±2&u—ÙEïÈš„èQ?ÅÁ"1·zÄ{/l›½á¥ÂOVYÈÿ½†çŒ‹€=±mx®0WòkÅ?5*Gl¨KÏ’H²•ô™ã¾“¬Ì£'ÎÚÃòTœË ­GІ= GI9õG‹({ÓÀ íËl„®à‘ã†r6ò)ð¸wðÞÎŒ£ýB½ê%¶6+{”¼­)ÒÂ1— Îñ­¡’Ð׈$SbéViôÈÓM t1 ‘ièU¡ùÊIZ®áôKìïê]Íf…0V§žìLaë)ücû xѺ„¤–å‡î'+Zùãdd|4§!É [O[¿ìiïSÆÈR‚€ù3Su.²æŸæ >`±ì$Œ0s(#]/oÿ²/ø·îHÈ9§ (7ÏÀ:ÿrnJÐq$µ…ë#‰ˆØo_ ]U×ÓXâU‰À¬€FÕaÉH“¶èa½Ðʼûék€,=ƒtœ4‰=ph*þçÊÃàgÌ)žï<›bªDyŸS-¼æ¬o YÃã\†à6/ÚìâÅɽeýH)< —èYWu®«Ô"ÁÄе7|6ª£yõk¦-ÂèX£ÿf_#<ý° U¾€FŒË¤T AT «Ü™$ê˜{ãˆj¾LTÔ_dëWðÊø"×IkÖ¹Sʾ§Á€wŒØ £+tËÛÊ,ƒÓxn¼V}Òp‹C6°o^`~\Šë¨s³6Eý»Â‡U ­à_DŒ\n:7póaܾrÏzø^oJ63bŒ&°tQˆÏÿOöÜ~ÂvœAåç/JŠŠï% ·s6Ost¤Œ8úMÎdcùvX]/¬°§Ÿ4¿ÝÐXþ3lnÊ©%nsÐ3¡òÙ¬„j†x…ü7g¥*gÌÑXéiéT˜¼¾û+ÂoUûì!áüÌdr¼.êð0 Wy÷élÚMÕó„à`$æzßgIN³ªm%ßL™Ô±ÍÍnx^øˆXŒÝÌ4·#º6qØ^HÓW}ý^‡J~ºQ¡npÕÇŒ°Æ•8`yfˆ{+â@±ø÷­X"’‡¥Fï16ÖK„9Þ/9‰£g\®æä'L =¥Á À"Ö© fÝd/LÛ\Õuò&÷&ªñѳ¹{³ç™h‰±n ”|, Œ07¥Š…€: @×Q$õ4â–«f;Â’²Š"!8¦„,˜ÖkçtB¬K…Ñ/ÜpíЊ­+²Gê¢q³Ÿ[凓êŠ8™g\ëÇ÷ò¶/Ê5'iß‘R‡×»4>0%§* Þ½¤›^P"µ‚™­¾î1“çõ… j´’¸ß Ì»òØ í¨yË}Šâä"±çg)1 æu>5µÓÅdaá÷;7ò»»çÃ^·±û¯¿±Ê¨çG/!§°5νàî¨î’V¶±j¢-tù¬ rþ߈í0³z7ºß\ǃP¤D¬0­{3ë™fåB¸0`)» ¿Å-6®zÕYfÈž©š³Ö¤Ø’B%-¶Ä™œÈc’Kû}Fðõ‡<ƒüþ?À‘<Õ™¥5Ë¿¥.æÒ”‘Ì›¢³!©µª+žKÄ9‚Žs¤̪£ÁÅÁuq®"ù0‚¿÷-zqo4p±óÍåß«R\„’Ï ð?ÿõßé"žœ ÃǹŠiî C:ê~¡áï¥Õ—°èyX5U!*›FÕ¿uadMúi3ª·ÝK“®D¶ð\ò¨¬Loîø%Ë‘;Q½§Ê•Õ8&º1õ4H·0KÔß7ÌÂˬÂ&¨î'~e…!l榴ª×-¶ƒœ«¶É3åªq±§×Ç8n¬p:ÛqN«æâh7uzI]n˜a£É¡=r¶œ‡“û_(º¦w µJÏ£IǭʃA±€I°QiV1Nû­hëy‚šŠ˜WýÇ£\—Âᢾ÷˜iÇýæüCµµßX:ÿ‰+B?áp™5Ë.é•\„Ð芵„î°GO4ˆDŠ(ŠÚªXz´{¶úí>‘¹I¯níiAÒEéjxì­@®|AqÕê'Nþ˜èxViEPó;鈡Ë4ÎŒë}sÿÒ¸îÆ¬4W2ZÛÊ,‚ øÃi¿ “TKç‘YÌ]Pz%í”\ss6«> Íåsà¨û ¥›‹æ¥4‡¦§½~‚âoy&é]ŒÊ¥\dêÅéå´E†¢5Ô=¹gÎ;ÕXþF¸É7²\ÑßඞɸíitÞ†´ÿÓû‰3·Àhà¢ý@t Çïàöxh!¼™VºþOÎÀêÙŠV—´¼z'¼ª'šÔªWÚ¬ì(“n›£dCžîŒ¢º²ªçÉh¦Uv Òõ;ߤ¥ûö2lïÌDz{Ч¦ªn%ZîfòWÇœ~p•Ä¢•µ•¿ÛN'±´ß+'´eg²X®.Ýz‡Ôݦ½µ±oLÞ5Þ¶0˾5Û^ïÁóûeÚù‰È}§N9Ö±»iI ´º¤Ã`Ê]¤ìllÖ Ò½!C]b„Òï7³ n|pÂe\Ì·H´¿¡œ˜1]é„í³6BMž;“Âán>Eúÿñ¯Øƒ0àý.§:õÔÝêÓν?õ.Ñ­§ñQgW½’x|z~¬*úêÛÂÒUÁ™oÅ '‰WlÈLD£ç[ŒzÖ™fåmß^ ø„éOðµ«9³sz:UÅáäP»ýôsPxBµnÉû( „qáAÒü¤ädäþaúfïüF´/züß±"y:Bæíåß% Æ‚±Þ|öXéíð)×üºü]g®[P§ø]ÝRÉàÐ#ÊŒT4Ä6ä˲VÅòŠÌ©šš‰vVª™Ó´Ÿpd\‘)§ïüa¦ŒV½j2àöü/‡·7Ëtý7äZMÑú6Ç(i)äôσ¿i k¹œ&ÒÆª¢iÛ®©ŸŽ°|Wįž@ æ¥`d†Õ|InÐÑ•ŠëíJOú;W¡´p«Í‹õàVtnŠ"`î1˜ªf;^Æ Ÿû!þÜdŽëRw|î/ÆÍO‡7Rj€ÚË· â‘]݇Ð=aëe<­+Ùjpé™:ò¡‚cîÇÕp£æk¾ŒûNƒ38‚)’ßé[æC3Cà*EÔoGiúTD‚è[J [W÷@š.•«¤Qú_ïøcrm$ON›}ÓB°ZWZ0,£û(•æaã•â™ïleݯ²Ÿšþ<ö©qÅ?™¦k[n_–„p¼¬ÎÔ5UFÀ–jð!)R"çêSKîF3E —«æ|‰0V¾™‰æÁ•a¸CvŽó7NØpÑÃõ¼>bÈùP°*m-¸•#÷§‡05SéBâö‘©[¬B(Ɔ$ÆüÃÿ°‡ëj¤psiJ%¡u”E»ùqC'½ 3úO=ºr-íÚ,ðpž4UùyUýÁÎóÏ_º¨]óÛ¢@æ8ì ]ZXÒW ã«Ûå's+yëütvÈyç÷ÓZ•˜]õˆÊäN@Ž—õå ‘D¤œ 𷔿e°] ?9Wú (]ÆU©ð*!O«Œ$ÙSû1 ·„ÜÛl,ʽà,F;GhÛtÐKhÞÔ!–6$1´²'ý:²ulÁIý.Aêl ÕÕtrç?;¥ š×i9~Ç`å Pô¦+{ÖÚâÙ â•úvZs½ME‚LõRzf þÛ·@MÚÜç'YœiV¥Å½ûŽþämá€É³a÷m‚œYµ‚aófOÿ´ãÁbUY7wªÙ¹ñ“5së¶ Þ|ýLçœûJ¢m-aóvØþ.}5ì?É…ôܨ0øJ.ˆÆ3Çÿ¼GFÕwQø«5R/JëL]ÌÊ´ºj2GœÕèG¸£è'ÌÊá“ `?{¤¤«4Î37PNz¹òÚ´ÞH[¢Î®}&h˜#?‡Ä’Í}¦Å<†0«td{ñ€¹ÿöeeaÄ©èO¶š|tÁ!„ìögZao ßBÛ7!Ýp~ÖTmJ³ºg…ì%Næ;ú]s²Îÿ‚ éb têY»¬4«¯®µS1¿¬r¹%Ø<Ž”¤Þ$N±„Ša)  .#¢Šà@Ôÿl³é°ØÖ«º àVs7pï€ã²h/žp¦=§oO »XŸœ2~;í™òpäyç¼ÓÚÝÙ•äÄïEÇWX®ãE ÕÖ'pvâxíGÓ½ˆæÞ‚ººteœg—8µOÑPg£>´|Áôí‰:ɺÒälútnu‡ôØÀWWÓ;I …åÝNY$›îƒƒQæEi!wtïýAgrÙ™b9ù^¼ÿÚѼë}õ¡¯ýe™ú¯¸q(¨9Þf¢´ëOú‰[m¼j…^·xúce‡ÍÝÿùO¨Ô”’7´ÊìWío³Sµ…_Óô@(H¬Zšò`VB^•ÙæuäLäI×€BS&_òCð]?XöŽÊ®;Í£ºpŸ[~/ú&êðé—‹x:b³ûT}˜&o©ë ák[lwéò™•Ⱦ©“ uÿV÷év¢ñ–!Z:æJ"ßäøn›h=CO3ýÉ^Ò(to’7Xš€üÌ¡ }G¬Š}—lsêwX£÷°U'’wÛç.eWÿ㩎C:ä”Û÷bÊR¦È@Åý_~a\^ÐÝœ®tšÞãc®÷Ó¹{Ò¯üâQVôî±±dSrÍ3ɶ»Œ½˜KÑØoûn@’~=(|,ë* ]IaC˜õÖhô½E…›õ)Õt¼5á4æ-”¾£2†°Ë0,ÅK–ä~8N#ß¼™sÑü>sr«YZóiXÙBŸ1TØ–2rGcŠ´£oH?‡ÙßÞ!Ut?›Ó#¹Èæqu«L$$¹¥ ø‚Èž ”¥f£(‰šÄÛ Êønw@¯ÆøÂ|+vèÍâåZaš h†‰ˆÕ}ÎÒ ß ÉJɱâðw±Sä¶åÕç¥Qâý:a`Å*þŠBdí© ×R9ÒÛµÙ—°¹à˜*»04WÊ{¸} ¨[G"Zõd.eã)°PM+)W´9œá*3Õ÷9ßÈ6eWv1Ö{Cº˜Údïjo•EY°ÝY¸‚í+ñ«'€Vó¹)>Ï)ÇW…$9¼|¤t5ºÞí2›}Šý—~æì7š an'Ž*Ñ ü¿])¯@ËÅh>­V0ß>?ÓÕw)0t3[mÔןÔ/ä@Ma?ÕWBÍA5Œ¹U““QË‘ÔÝJñÓ9P8X0ÊG¹ŸavÓ—(hFtö6µÔóðùSÊçý"˜Mž¥ž¼H, ²šˆ‚oµì Òïù t´)€#_‹‰²q/}ò÷¿ÿùÀ…¯ËÂØo»Šœþ j¤('F /)IñS¶CöÞ¨j÷3# ;vlÎ[w©µå[ßa£åõ”ê’C€T}Êt…å´j˜°¯Ó2ºÛ`àVŽ~Ý_<à»ÅÞ^ÕÛ B«Ý b¶#Œd "ü´ \Ï{o ‹¨džýœüœ„Ue|±·Só|:©9U-ÚÑΘ*u1—©æ¢?Íêþghïf݉Í`[‰³ïNL~›ë¶CRÆÁ1â¥sÅÞþûÿó¯âitÉïóp‰Ž÷镲7PŠŒë6v&nõ˜X«sÉvTOÙ»J,s 2 x¼m|>>=S¯;tyŽç| êI<^¹™Oû9áenê§Î´ º“)}°Uéô4 i\öô?ó°ÿiñ~b,ekèÜ^éKœK­Ý™uÅ–é)EÌWêao@Ë—Ð]î—Øu´`ó‡ 5 þJQcU¢¸Oëî€M“HÓû@ŽÜ˜ƒ«/«&´×§ènâs†näŒ7¡AÑ á»0gb‡nžÚh4~—Õåinoë;¸‚©94! OA°áÞ†Å3¢U¶ãïÿó¯íË£”\ ‹s÷àdùdKâä­Â_Kh¿,ÛÎÂG² +Znº€ß“ÜjѽU¸r©ì;bü¦ðó|qÆ~Ì*Êǀ﹧%uaU+ŸÿrcQDBDHÿÎÆ’мPÚÉØ)´Œ£÷Û8 ¬3%™ægT×(\÷—Uþ™È31¡Çt&S\±m`Ö mí&ÒçCN§»ÏGâ*\xqÚÒ,Oå&Î rDûιWxc_9Ë{î‚oý°ŽRÒ‘ø-%<y ä^Ų¸QûÏ,’ÓÍ´[iÝ]—•ÛOç§\•JÖ¼ÉV\ñš¨-bŹÓÅkô…³”r<²>ИÁxû=Á,&-áò§û|y®áöp4á`cC†µ=_±µž³–”]×_·•Ntųêf±¨ž{yïí<ñ:$s b1Ë҉ܿ§ý»«3ë¹TA–l^ºYû4ÏîÍ÷:0øù÷ GYr}ù+÷ói0L®ñöòï»Q!ÿµÛ‚U«âîxÀ,ƒÐ8† |ŽÊªƒÿ£js¨ó³È,†ê…°ãÌ·ª^*Œ§ÅÀk3‡ÐÁN?ßÕ/zCì£ßZŽæÕèÂñVêû~Ú†t-sbÃjœ0ËQJQ ’¦™ž qµ#öÞc&û÷-ðó‰x,„e£õ÷ ‘,y¼ ZP:Hk9'=ê·!,i¼9òãL#ÿ1ðÖ¸ô·ÏÈ Ç•~û_‡üÎK—ãYã-¾Ÿœ\¾ÿû?þyz¬¹3U‡ŠáN1œ®kbþ·ƪ²œ<Ô`n—çÍí©Ï‰Š—÷DºìÐUu}G¦×Y¸è Ø;0"Í0~H± áîðq¿|¹‘Ϙo&”f5Ny×ö…^Ôc´?ʤO¶Ià^<_”Ú"X˜¤iïÏÝ>Wr0žÕ“+×ÓXÐ$0ÍCµ¨ë·ãÝŒ«ŠËüÌ«þÄŠx3g­›1V_®Ë§ùÒ¹c¢ÔÉt5ç¼ÞG iBþþ÷?ÿè¾q·Zdçj JT¡3Ìðã·Ó€&Oê…\NÙøO‘6§ðLh•î4ÏÖ…Ñ[?#»êb{<'ÃÓÞfò>GÛÙXµê?›-Ð.ÎÙXFÂG/\59‰1½½à3Ÿ|xÇ´ê*Ôþè:iëä2SxyS³ú×+¹± L Éš—Ò# œ¸/JRVxÇ›'9–k ÆÕS ÑšùSe§¯Z!ú/õŸ1w£\¢¹¬ÖŽL‹ `Ýã:"Y÷¬÷Ñg·?ã&7K¤Ô5X1§3Q1K2;bƒ]ÐdÁ=CW1B+ÅÁÅ•Iûk1"ÛÃX|Þ¥÷Ê’A_¡¤BAµÖ±ª1±€*«»õÀÎ¥_,ƆƒYrBþpl•.$+«22+ŸÏ¥CÍL¹òû6“S¶Ë=دbwØq«›˜¤pQdç¹XTkäÈ%9$ùí‡. j°JÚ—êVÓqŽ.MŠ-ï§9ºK»²ôjSsï—ڳƔí 1š³O:Ï¡œÈ'nÕã+§Uœºí?® ðƒ±Œû,Ê;H…ýN?rZÖî³{`KʆyîÓ-`תù¿Íì›Q"ÇÓ"…V!‘’ÿ*Ž—w_\ó:\YZYúv&Æ‘ø lèÛ·í“ ]´¼ˆ5º¤w{Çv¸Gc«·ì»ìïÿýÏ?&Yi`XLÌ#è·Íœ(:±û¶§MÅêq:s…’þd%)¢pÕxó­zp«™Ç¼Û ÍÅDV¹Ùå+r73| ‚¹oÛê¢ýÍbΈýäîçÙ›yôÓ)jwQd±°ó[q¨ðœ´½ßÐßU9%«c¦ˆ}׋ Ø–è}cØÇ¼9´ðp€bgä³»fW ´YóØ¡‹þ –i;:o(cvOP;ÝßC~ë¸Ïò„«-: ÆÜ*û‘ZG)~Z‹„”rÂjù&«Öœ‡›ëUN2wœ¸TLæ¡N!„Ô€‡òâÝ~KÚËêë…se-Ö2ƹ6 À*~V,ÌvÈl›±ž@Ýw¬Ò]Ù›#I%Ÿ¡>á@Æò>Y÷&&æË± K³TPÏö¯Æ§º;¬Üpï¿A¶ß“$~òóŽ„qŸŸÁÛ äïñÕ¿â`•É æ|פzLGV*–Dëþýot,Vn7¨”4·ç¦*±„ *?œ¨R:Ï}€®d÷Vú$_äòÕYaÃU>’ØlC—ÆŠuÈèékó2g{vh=€«@ŠnÓ8JS-%éølwmi¼yÜño³ÄY ýí‹Oä.‡±|«\ÚVΘrà ±z7O檥Y"±Äïnßþ1%,ïªTÇ—ôÜù].˜÷EAµÊ/·NF“ß2¿)ló¿=ì}–r¸ýXhM1~ÛœN2å÷Q[S[^µ3ö\ñµUfÞ‡„ ?áâuË´†k†a³/‚ú ¹aiEݨößÖçû¿P ÍÙ=íÍ‘{¢N£kÁ6†ò%Ó_ä:«×ñýbÀöÛŸ° £ø±%Àýx¨öcßõ‚pÿõ5Eâf¬Ðâ¥ÚÌøñµ†&ñÛyýF?ﳬógÝO»I|ôFãÚ×¶QÉÀê‘ûAü·$!æ‚0?ÎgÅÎN!ts™÷«Þ –ÔŒ¼™@Àg€VwV²)Y!¼Eòþòz?j [b¥Da´®íé4§gc=­Q 5ád +q!ìÇßõÞ‚*nuðõ!—Y½Y<öK“M5Ù `CÔ&º’x ªÐ•‘|“¡Å«§ÔrÃï!4XdËùµîÊÚn ®y{ €•õ­ ztU$ôJê²g«)Dõ5F‘»— ÊÕ”íö壿5²Hå·2~£r.×ož†×w²ÊsL5oöœ5&Ëa—§é!mV¬+',Un¬´Óž¨G‹ºÂfe¡b<Û) {Õfê\Ã÷8,|°#yß="Ñ™Â߃sYˆ®\)„í{ìs·ÉÛB!úÓmúoŽçbõñËþ]>có,„V%ÞDÆöÄxº©ÁWÂì~d"’[%°å VÓò½9Zƒð£6ÿRšog}9Eú’ñjÙ«ns*–©ó•;K"ßÚ$ïAˆ[cìÞ…ÿ­C‹j…'н;­¯ ZušáÚŒy²Cbq;Ùç–鮯s ó†;ôN ïúT÷r9™¿Öaþ%ÀÖâ¢3ÿ¯þ)à }­Q}“Σ ­I°lf[*–Á+¨;´3sR^/Öå€[õW ¦p±‘o¹Ã—Þ¼yÓÕY‚1_b¸O¼Ðæý±ì³{¶îws[©Z%cµ`©Ù©ÛJ¦t ¶]0Ää|[¹yI ¡¹i¸•æ´¸_R"Κsøzõþ¹ 7é ~O¯`9ËGz/ÿmêëí´Ê1+±ÿ׈zzUñ3‡p:ÚÊ&¸’½œ°3” ¾ï¢(L ª4W™¹2Æqìî 1ïvºÆ² ÷aŠ¥v/`A<æ*ÈŠµ1I•ŸeÈ$ðÔª)³Tþèä¤åú0,ÁUÐó&#À¬ÞÒZ’]Ýy u‡3–r•[ËW®ï¶aèyƒe]cùE÷÷óW9Ë 5×ô¸â»¯jGTØpXŒX ný@J”X,å/õQJ¶”?>ý­gSÂGs¨R Q]Âm€‘^$¨z‡ájÁÎÎÓäÅꆷ×wûÒ™MI– Yã’5BÆ-Íxá…º«À³¹yXINß°Lª.8ˆ®Ê°>ËŒºõ: &:ß=²¸w*Â:–?$Mq ÊܪtS²Æ]bŽ™Ÿ[Zœ³S¹-áʧ”yÎ|åÞjupÅ®™)Ìü•pþhp`aâÇ›ŠU,ÙX5üèý8Ú VÞð„/Í 0”³e§Š@ÈhßqLݳÍ80|×ɪ¸J;îÉË(,ü´h“ÎLšùÑU§ƒjóE’æžöåþy:7ô &盯.1kÜÁ[¾›Çεn9¾n+>º+6=RÇ[!çÇ!÷[ô`æøÀïY8ÃU Ëúí¤omñ<ñ€ºò ;`´š³BÇ娭‘µ”®ìW˜‹ïšXÕùB¶°û™J㬅<3dÕ¦èõ¦4 ~0º*Ù„GoÁ"ËK59ëé'”›£:€wŠöÐÕ¢«s‚Un£íw´/|Ï÷¿¼/íGzË“ùToK~ÖïºhŒêB^°žr,7p^ÃMá¦ÁOÇU¨Xçú‹’”r¥?‚côÅ›6I]º2k`-ÍWHµ„>ª”ûÅ* i¬yìãì©Ö¡–T–ŽFÂWŸyªÝ’Õf)j”¶ÈxÊõžÏ´ˆ Ô’¡É•%Z®áè]ðÖê- åb\Z.ÍriÖXaôø xNáUĨµt<˜H/ô7÷Nۧ“Y ŠÀÒÚø!ŒìXú[R6˜›8¡ðrì–MZc˜yãg_*O¶Ç YKÏiÚ”çÅÎQ€Ò‘•æØ›¶$béMú­•K‡Ø+†ØúÔèœ H¹O¹Úº Ø7ø;2œu˜Õ¾­zŨݕIî¬ pxœdMxѽ¿Ü¼¾W•âò‚Ö˜ XS±FöøÉÀ$g’¨/„`¾êM¢t¾‰ke!;¤~Ç. ]µü{Ú}ġܢ«úo5Ö˜aPj#úäSŒ÷ZŒC÷ O´!{Ñó•í»Ùܼø…‰ý¢‚h‰è•~£‹€ÏÿôY.ÈËuv³@oAËBûœ„1ô¬¼ôöåÒÌÔük™ÖX¿öÂ¥ÊÅ$9IÁ;ÈQ(m­>»M «I€eY/ëÊÒ´RsqøÅ€ "QiÜ3¢…ó[÷\c5îïaÀņŒªÝ(CQc$U¨Ehék|ŽÆ3k= ÂÅ „LŒ«O5]Ë’ë Ç,V9ì¦0³Îp«{ÌvN{è,ؼƒ·¨ ¼ƒ±\¬™ÁZ”5>]àñæ›t ãš.„Ñ”+Kû ©×€„¶Äž-B,îk1ìqˆÅݤßM÷N,BóÏ©x\Ó‡jÞ¶ Ðk¬±†4þ´¬FÓ4@¸ðPØè<ØúTIê5¹ªÎæ,MËⵆ®¼&éœ=&%¿ÅXÃâç_‰¾ã@ŒÀœ~âI½:¯T,ß-–{-3IsÞQ-ÈÄ…[-ÇnßlKF Üoëáökᆱ¾{¨÷R¥f7fcC LÀZy)“cÉ,6“Qý­Ö³¹Ê4·’ç7`k,Geg0Ë‘CgHÔ2ºÅJ$ã×OÊæ0ÌQwË“Yc5ÖXãæ!ÆWØ žlƒß(늆)>Ž·•ÊBû‰zñ\™îèÇÖÎÆ$Ât71±‰õòóÖø…6ã׾̵3àéë7ßÏèü•#|üfÜÊøÕJ&onÉúÄ©½j4Ó37!ʸ©ÓêÓ3iµD|\Ä šáÐõ¸?½®Ù00… }B&øR°k¬±Æk|L òî=ÍR¾#9Qû™­,¬Íshè9•’f5zÑ;Á£NO‘©¿zy~3g k*e Ã7áòDišðnîÆ ÜÿýÈ…UÁDŠ'KyO †ôì`á#[ŠPßN;à?;ö}5eKbëÄí?c6]UØ`^÷¢+F:º®÷ö‚k¬±Æk¬1œ}5‚¹oì+㛬TgÏ|,yÖõ iBpí8Z¤äú§¸‰œ»÷–šö íú¤((ýÛû{Yèi,ƒ@·A™¹o•¶¹Tç$«©âÐzÒôêší³›1ž»G¶×4¼j7ƒ¶ÓÐX¢ I|a/…ÝO‹Ä¢/Xc€ä#º –¯¸ÆéN)|Eu|…-"²_´ž8ÏàëeÍòž¬ ¾°,ùk)Ì<üâ5-Î …í&–7ìéóÖÈåo‹µ^+Êû¼½D5™×æ‰G k·ŸŒ©=1$k¾øs½Eï„E‹ûUD‹¼¾ºj=øcõÊX¿?cÀÀ ËÝl Cû¥ ¶Æk LeX›nP̻ƯŠÂ®êxöuƒÙ¤½¸b¦sšÄ8aÃ?R^•…E¿G3 ›ëôÀìKÚÙa°3åêWY5Þæ!ãŒ.3ò1뵜¶”U˜ oíxnq ÷]G¬³ÁîÆ#“·aaÖÎra:ðü<šÙ²hó"zx6‘-ùãxšìd[ŸdÑüßfÅó¿6,_+²vÁÚwþ_wù1œñƒ] Uœ¬4úð-¿{àØÓûn3¡ÀÏþ’‚Á¥>ÞK½¦d]ÝÍr/”÷ÝD¸Ù{ÒÌ3Ujmí^GÑ›ßUS³¥”\´R~›EýÒ¡$Ü^½$xíU+IH–ôæégfÝ‹n¢&ëá/ËŒ¥Ì¯šoìË¥yÓÑÓk~í…«$ù7oŠ ,Î̈Ñ{ÖT¯Ñ½ÆN/¼™aõs6]¡ ?M¯ëœIñNÏ…Œ iÊ')Þì9÷Ÿ |ÄT,Çî7û@é µ*`¬ã+(<ß)˜HÏFHÌNùºÎ_ŠÖÿL;ÚKqþ«¥&Ô»pœµ#,ŽŸõi ¾ZËš¥è>ÝÇX‹µ„ÿ¶kˇXxÖLã׎¿ÿùç?6‡ñKèp†âVýI;†Ï¼«ƒŒ×ßΧÓû¥Ÿê)òÆOû€O\å5n¸ ˜.·ð;ä¿Âv9.ÚkÝpƒƒéòmk]MXïƒó+î–©Ú™úÄdYZ*}¶áã¥íþÆå“¼¶Ã¯u˜?ÞZÛaòøÚ0Ó––rNY€UÝòœãg/N,ž®}eš0eý¯à•¸¾àÛ>|¡5Öp‰Ö àyʆ‰ÝÓË 3€†nUî׬³žCÇÇG¨Þ§eÒé_1§þši±}%/ /ø Öç­Ã¼þZ*ûOÀ.Ðr«~¹ÃkÕ‚øíkGL_ùbt¡nžoewÐÃQ œí”[›‡£ˆñ»î„V:!MK<þT­±´ák¼õ>MÑÌð\Içõç¿>U`pMuÄ+WÁÀÎ~?Ðj€¨°I’år*Fs`™kBéø¢Pë˜U08Ù«»Ÿ<ˆî>5¼Ë]£D¹Acího.ÀkGŒ_Öehž¯ñ²¾OÂv?®,z„ÕÊKLeE ?›ò%dÎwܺZÝ×XciÚž+°Wõƒ—å‚õQãÇŸÊái?DÉÈEÃЫwÔ5K?®±Æ]J>úÌ@EañS±BÇP-R»…;š›&<ÎpÀÁ-ŠŽ|º»Ñ”Tú7#8ü?s5Öø%îÓ¿j|½‹(|‘Nh }: :äC S9nïŸuµZe¯±ÆK?¹;<_ÝsÊ¡±¸H²FëQ¥Ÿà…ˆ†‹þ9ÏÒ; ³‘ÈÝx^¶cäÏR‰®Êí³®ÿæk¬±Æ9¾îÿŠ—p±cdËsöecÙcÉ®:žLZ!Xî;@W¿¹Åák¬1ßåê.ŒU³¾{Çu¦ËÑác +޼IKlýŠÍC ïØ~-aAªí°ç“ÜßO^NËk¬±Æo7n `q¼¹µ´gÄN’ûdG¼!üfvWðËÍ+Dqùk¬±Æ4̓Œ²±bÜ"˜eÈ N. 䕾ÄPC ãœ÷¬št@ã·ðšýÂÞ7x£~ǼÙû¬±Æk¬±ÆÐq;k4t•HE‘ˆd=ã„ttlD¹ǯø[¤¾/¿p5Ö˜ gpÑÓ˜57Íš`¼fÚÅÖOñàå,ÁuÐÕ }奬±Æk¬ñyãÖPÐjZnNî¡1ÆÏí[¯øU)WË\c5æ+LäÞŽþl,Ey"vÛu6â¶¢º¬Cr²JEÒ ÝsÛÍËÞã–ÌD*—s²Æk¬±Æ/WX£A^ñs²w/?Øœ¿îWAW«Hp5Öx µ‰K_Þgh5ý¯µÕÕaôii £Ï :§q<óf¹ l´ÕÖXc5ÖXc;¾F·=.s‰Ëmy?ð¤ü„w³x'ñx/YZc5Ö8+¥'‘ˆ!tñ ƒ–»!Aoj&ÎÞ]VÚx–281ìû²;o^˜.çd5ÖXcß<¾twgŽúÐUO` ?ç-¼Œ•âM®Y®ák¬ñF Óu¾øÃR†?¯bKÊÉ*êü7kÓÒ®oë–,Ïd5ÖXc5žãKò;/lëv¡[3ô÷Žë&›ýÒ¬õšé#.ïp5Öx—±5+×ÂXE@²Ê§œµ$š‰ÎÛs 61xÉøV«|m&ø:N[c5ÖXc ûøšãwòöœæsèM¦Z[žâk¬ñÙÖdŒK¶$òܧqðÇ8*ýNë…ۯݵììËñXc5ÖXcÄqGë7ûçœüeëË%Qk¬±Æ/6"ÒšÐqo¹A"ÏçáV®×ÝTy›Õ\]×Xc5ÖX#}ÜÀZ†üÎŽþ­ò¤5ÖXcÜÄÞêÿ·wGËmÂ@@³þÿ—é['$®¤sžÚÇË õ5ÈÍVYZí[:$Ž×kcß²ZyÒ-À2‹ç¼½Êîx}|:!êxÿ{û«z'80*£î]*²÷xmz¸ÅÖò£ZrÞ-LÓëK¯ž$ëùgýþwëoÞ¸»*¬({§#GOwَϲÇA K“=â¡÷>¯ƒà×3g›ïþs½ð ÃŸl ÎŽËèIàv'n!œr&>;¨j,ù«Šèš9ëÿ³e›$+p5_Ü95Ë@?‹ ²-5Úý¿PS7,ÚD€S'Òúôßjþì§NóÅÅ=¦áÑ@_KX·|§ò‘ïÜ)Tà ꮜQ«ßO¬dRhYµ {=ÝŸÔá Ì`í—78þúyy– ü4ûï¾B·øeŽ·F{Í5ãñ '€³X{óèÅ’ƒ®e›\D"À§Ü2ge4*/¶¯ñ8è×¹ B `E…?]å6ÃáJ °à¸¾ü›‡æµ{ÿZ-¹Cz½Z= ô2p€•Ÿw|û©©7ÚD€äSqË/+\g:;ûÀz·pLß^À² °í*¾^eµ¬¡@öÉÙY;“+Ù²^>DÉn¬£ÎŒ`ÍÔU¸,ëCt0ȹº^N^‹ïœ‡6¾ØQ|(™¶&•`í7m3P·´ÂeY®É÷ÔmUÇã³UΜG~»ø­-€X±}a³±×NÖ&ꆞ§j™±ÔŸ¹2«–?˜µ%0œnÖÊqÕÁÁÖ{ Fˆî`¾yjâk‡÷¶Ìé+>æ-œÎæ¶µé`ö&™þ}ÂëŸçwüj 0Ù$5ÙµÃÓDWÇKöïW5û±ª-€Ñm s¹âÔ.ªßv]ÅÔKeœž†¸v8aö„Uµ»Š¥?€m]>,Õ7ܲ÷êüî­&•R_€e§§ðoÄÛÞ^Õb‹«9€ÑmoOê¥!ˆlÔªy÷æàÛI¡ÎLõÀ 0©½7êºÜotiæöþ"î‚{оï XsJª3'Ìž ÷káÚßr¸+(¬m³ éA g2ª˜WÂñÝUÁûVe`z, µÆß¨+ݱjÊ |&ÀzCÌWµrw`p§×ë¾K£€7°xœÜ ¸â]@2ÑXD`M€@4ÑXD`M€@4ÑXD`M€@4ÑXD`M€@4ÑXD`M€@4ÑXD`M€@4ÑXD`M€@4ÑXD`M€@4ÑXD`M€@4ÑXD`M€@4ÑXD`M€@4ÑXD`í/¹aÔP;¥M\IEND®B`‚compiz-0.9.11+14.04.20140409/plugins/cubeaddon/images/compizcap.png0000644000015301777760000020724612321343002025052 0ustar pbusernogroup00000000000000‰PNG  IHDRXX¾f˜ÜmIDATxÚì½yY~ß÷}/«ªo4€кº1f8×ÎììÅC¤¥Õò$×$E­¹$CÙa;l1B¶Â²,Ûa‡C™¶¹+‘–HJÁÃuÙK†Bò!RRPZ‹¢–\îî\˜ÁÎf€ÐwWU¾÷~þ#3«^feÖÑ]]]Ç÷ƒ(TuUuWuuVæ§~¿ßûýB!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!‡Fñ% „2ªˆHó8¥”¾"„‚E!„ô.Q¥øħR|ŒòSŸ,ãÊ¡`B¡T‰h3*ñIОT©‚c”䜀@@C)eù  !„i« €¹Xª‚Xªt\ <±JΓ“eë –-F¶‹BÈÄŠÕ €ye´Ò€:#YÙ(Vö8åËU'ÁòEk@¢E(X„B&I¬J¥ƒÌ©_ÁòåJrä*«ì)°«”jð/B(X„BÆY¬€DQ«¤hÝ?ïE°z©Á*Š^%'¿þÀžRÊñ/D(X„BÆM®§E­Jr•dÕa%Ç*9„`¥VƧÀ¶R*ä_ŠP°!„Œ‹\ÍÄrUBToUê"YyQ¬$’•=NõRàž=™œS’2<à_Œ%¾„B$Ws–<±Ê V¶ÏU¯uXÈHV¯õWéè˜ÿK"¢•R{üË !„Q•«yDÅìeïÔM²òÒ„‡,?=˜¤‹äªyŠ%k‡ABÁ"„2jr5ËU%G®Š«[±{^¡{·ú«äÄ’Õ©Æ+a^DD)µË¿$¡`B¹šA+-˜wêÅ*{rHP^ V·ú+ãIV6*–Ç‚ˆ8¥Ô>ÿ¢„‚E!ä¤åª„¨ =O¬*è?U¨{"a6=˜¤³rUtò梈öÊ",B!')W À²'REçR…Ei¬`åµiÈF¯ü¨•Eo5]ÙŸ¹$"Ù'‹P°!„ K¦²,H•¹ò£Y‡‰be¥Èu¬òSƒ½Ë7% Àÿê„‚E!ä¸$*!{[­¹‚%´G©:É–/ZE}±²Ñ«")ʶeÈÊZ·èU^Ñü¬ˆÔ•R5n„‚E!dÐU„F~Q{%sÊJV©Éʦ óžWQ﫤‰hQÃÒDª€îó D¤ÁT!¡`B¤D©_ϘÍÔ ÒѪ¬du«ÉÊëì~À ¢y†eDÝ×÷<ð~üu¶°½h%bò;tªãò…­ÿžlBJ(X„B‰˜D©‚ë¢~W%´¯LÎgPÍ*!¿+‰bU< àJ|¿" €w¼à5O°òšŠ"#Uè VÉó°ˆúc0ŠE(X„B‰:ŒD UÞm3ñi¶ƒLU2×Õcù’uÀ·XïãØu5>½àÿ‹…+/جD¨íEò¾hñïÉÞXäPpØ3!„Œ·Hõ+Q¾§ÛùiDÅí3žHÍäˆVr/a%ä÷Æú€àxô<€ßPÐ@åjx_g/û×Õ½ÛüË5”RÂ-•ô #X„2úuq:¬D%—Uær)–«J\eÏ+ždùò•ˆÖ,€? àú€^ægbü¿ì¢Uså×]E®ü>Z~-W"l>J(X„2ÕI„:}¿êá{U‡ûú—;ÉUQаŒö‚ø$zõ)DµVƒdÀø ÿOƒâ±:¾P•r®ÓñïBÁ",B#‰ê$=~®:¤De/gKˆWRÜ>S Sy‘¬ì}üBøƒ\%\Œåí·ÐÞ3+¯°ÝdË ]0?#"»L !„Œ‡DIQÑmê$Ê¿Mw¸¯FÔ¶ )pO$Ê/vÏÖeùõW~ë2€gùÏø8€[^ŠEª‚Vz0‘(¿Aªõ~ϼÎòIwxB(X„rÌ"uÜÅåy÷-Jëå]§;VV¬º]7뉕¿’°SQ»ÿµ½úÈþÄß„¨…C­*Çç¾T•2²å7*õ%«BÁ",BœDFœ]\ÞI¢:¥ô²×uŠP剕?(y­–/Ty—›’å€ÙºÁб8kœœ.i\ZšQ+Cúó/"Š”}éq:¾Te Û³’•ˆVED€©BBÁ"„P¢&£¸¼‰R9‚T$R@û¬¾ì×Éå´"X³žLUœÃü~ˆÕƒ‹¡µçC§Î9‘³VpÀ¢VPZZ« zØ›ÇÓ¾†ö¨•9+ZÉu¡÷û—âsI¶7Š¡`B(Q½IQ7‰ê$AÝ$*{¹“ [¢Š¤ªy¹ÑÀÙuweߺµFˆªµj­»(ÐçrZ)¨ –(­€@*¹¬Ê03¥¡·^\Ú­™ë‹³¥WÑc3råw’7ñïx’x‚åm’-BÁ"„P¢+QE2uT‰zKÝÓw¤ÉÿÙº›HíÌ~°‡êNÝTRmXY3N]vÀå’Æ9¨@'Òh¥ •ÄB¥ PÒÀL 0SŠdª¬rݦN¨­õûÛæS7n\¹¾:û¯Ï,”ßCzö¡_èn DKg®ïï@Ñ"GÞiBȨˆÔq­ÐË$àd‹Ë;‰TòXy•+U{sw·íúnCÖŒ¬…V­çÖ¬S—²‰‚÷䕊ºm-‰Òˆ«RæJ 3%…¹’Âl9,•yÅUüEÝ6ïm5ðâ­}„Vdi.xåÑ 3_\]ž¹àQÇöDÛ»}ýQ?,¿q)üË”,BÁ"„LšDuúžq..Ï‹VéNµ_ǽ°º×Pk5#ÕH¢ä²uX+’¨Ô ¢¼_$ªR¥ú´—Ôq4KÐ^«¤‚æåHÌJ˜-©¬ý†Ã—^ßAÃ84Œ ´NæJ/=}yáŸ^>]~+–§š'U™¯“Ë÷¥ “v’‘,Š¡`BFB¢#Nƒ–(`´‹Ës¥j¿ŽÅ;û®º[sÕº¨µ†‘5kÝšµ&"gà‰REJ¤JµÝ†ÔmiùŠ®+IJÐ,ÿk´„KAE—ѪÃÒ 85£N¢ N€­ƒ·?¨áÎfˆÐ:ÔcÑZš)½ðTuþ_;?ûzdx‘¬ñuRp¢h !äÄ$ªH˜¦q…^Çš¨íº]ú`Ç­ïØH ê!ªÖaÍ—ÈiÕA¢|9ê$NÈÈUûmQt«¤£´ Ò A"N±D%õU‰H)O¼”wûÒŒÂLp2‚U  ÀNÍàæû¸·c6#Z"ó3ú«Ï¬/üæS—ç_°ïÉÖ~&‚Õ@«¯E‹P°!#/QÀè­ÐËJO‘Xº¸|»nOÝÛqÕíPª £ª ‡u'¸Z¬rª]‚:KT(uº-þ*ç~É}ËñªÀ@©ŒLÅâG°"¡Rí_+`¾¬0{˪¬4ŒDö#àÞnˆ·ðp/Dh ãÈ|E}ùÙõ¥¿÷Ñ« /{r•D±|ÁŠ¡`B¦yüK'9†P\þÁ¾]~XWÕ½š«ÖŒTC‡j'‰ò#GÙS·ô "SyUµjÿÙåfÛ…X°ÐúÚ`%ߣ¨fš0ú]fJ‘d ãa,XèÜI$[_|uv 6ŠfÅuZ2WQ¿ÿlué×þ­'N}-­´ŠÜý9†ÒE²Ú á)Z,BÈtŠÔ¨—r…^¯Ñ§®Åå÷íé{n}¯&ÕšUU#X3NÖ\´:o©«Dyr4‰êµ*øÙÙçÿÜ SS•¬.L¢TÊ‹biïk¥¼4£g†ÈiXµNÁ¯¾w€7îÖÐhF°õ8m˜œWÊú÷ž¹<ÿKß÷‘³à´ŠÜ¹²9-P´‹F£NJ¢€îµPÝ$ê¸VèåJÕý}»rÿ@U÷ên½îdÍXµ:Ys—²˜”èâá‹Ë‹¨SJ¯×Úª<‰B¡ T¦Ö*þ½T©jÖZ5¥Ê{ãûCK5ô~XµÐÅÑ«–`ÝzÐÀkwа‚0tMÉŠ‹ßQ£´bÝ:„Æ!PêwÏ/—~æÏ~gõ÷ÑjTê¼sGÑ",B(QD¨Ó÷O|qùý}»rwÏUk¡Z¯;Y«T“ª\F4Ã*.ïE¢:þÌ~$*û<3_Gî-‘j V&-Õ*_¶’Ÿ9SR¨Ã{9i¥“ÈՃݯ¾wàÕ^ .­º‘Vº0t¨[A#„{u‹r ¿xýÂÌç~ú»«¿K”ÉE‹P°™@‰ê$=~î4Œi~ýþŽ]yXsû¡ªÖC©†‚5ëdÍ . 0¯','S\ÞKJ¯]¸T¾ÜåDÐò¾nû£úEíh¥ýš/®RÞcI[ôJÅ­’¯ç+jhžÐ \\Ø;5‹¯¿¬DhcÁ²P𑬤«Ÿï7¢“s륒úW]\üÜOçÅß͉h Úë³²¢å²rÂS°!#)QERTtÛ¸Œ)%ÿþmѨ;»öÂöªî„®Ú¥jkÖaÍŠ\`NEnz-.ï"QÀ`ŠË‹£]ƒ‘¨n×ù*(Jš+›íýsž·Ðp@C¢Ó©²Âù!Ôb9Œ•fZ°a¯¿ÐLF‚E¸B_¬¬k^Nk·fQ7 – %Zú½kçöÏ}×å/"2´9Ñ,_¬Ø¬”‚E’Hwqù¤ îlÙ › UÝmØõÐa-4¨ZÈeç°&ÀÌ‘% '_\^(Y$*WÈz”(…¨N©m#ÉF°’ç'QĪ.À¨; îê"hH$:¥¸ÅC €Š>¼¬±pŒ©B`Lë71Îáûu4Æ9˜D®<ÉjÄÒUãs“ˆ°]306’*ëZ‚å$Z¥hü›k« ?ûŸ}Ïåé V§ú,¡hQ°!Çâø—Î5QÁ]{~ó@­'e¬Z3âÖ¬C‚Jž¼´ITV^ºÔHG‘†_\^”2ìW¢¢3U(QÙûúE"‘Ø`×{Vaß ö¾Ô£žM‰*ÅEñBórIG—Ëñíó%à™SÇÕØÝ¸ÖjAq‚÷¶Ø«;X •IÎm+UØhF²ƶ҃µÐa¯nabÁоÏIôuÕŠ#Z¿¿qºòùÿü6þÒí:‰{hQ°¡DQ¢:‰P§ïŸ”âò¶Û PzË^ج¹õšQÕZ(U+X3ÕD%•¹9¹z¥j€Ååê¢-Q¡Ûز‚m£°m›زÀŽî;¥‰Jª¢¢¹ƒe ”Utßär²1ˆ â—JÀc‹ƒnîžD–’ßëÁžÁn͸H¬¬ÌØH¤B‡8ŠåZ©ÂX´B#ØkXÔCË”q€µ+iÑJ×:VêËëg*Ÿÿ‹?¸ñÛ- !”¨ÃKT'ééôs§¡¸\Þݵ·öÕú~èª ‹jèdÍ8©ŠÃ%‰]%ªMj0øz~ÎI—çG¬”¿1wŒZe%jßÛ¶%Q[M¡öl÷ ~¡ÌÄÒTIDJ+T¼hU’)Õúí’5.jÌꣿ¯vê*†BTÔ¾½oš¦fÊ ŒÄÊ:׬à mTènZó ±[‹RŠÆû^íš×7Ó‡Ò:W _¹¼<ó¹ÿúÓ¿•#X‡iVJÑ¢`B‰*¸ß¸—÷;þ¥ôÎ{y«!Õ=#ë¡SkÆJÕ:Ys‚KJí‘Þ$ê¤WèF¸†T\Þ«D%©¼]l™X¤Œ`Ë(l™H¢Ò}ƒ×YQBK’ʨ4oS©û™(U€Éʈ–Fô3«s +GX]X·»(˜°U3€*J7¥ÇJ$G-ÉŠ"R¡õ게Ch†Òƒµ†óä ÍaS¶b±²Ѳ X$ZêùËgf~öÏÿàú?™kµv(jVÊ®ð,B&B¤Žk…^ž c\\n Jw¶#‰:Q­ ª‰DY‡KJKT"'£4þe”ŠË}‰Êûüû‰äiÓvŒÂ¦‘X¦¢ë]—íNÉO";ªUêöf™ ¢h•Î V&B•úÙÞã%b•:WQ4ë±JѬРöB‹Ð¯¹Áƒƒ_þ.B'xje¿¸ˆ¹ hJñR|-Ñj­(4qÁû~Ã5k¶’¨Uë22’‹—·Ê°%ZÑõxáò™Êçþü]ù2¢ÅZ,B¦B¢:}Ï$—7o«”ïíãòÃ}³~`±f ÖÎU•5µ  T$/m••—#HT¡ŒQ¢º=—ìcô+QI„ND Swm"%‚×CÁ¶UØ´hÖDí÷Êóe&Ÿhfà ŠÊ“Ô`òsÛ"W^”ÊOêÉRžd)׿u4š'ù9Ê3 '‘E«ü¢ËIµYÒëªn¿þü]ÜÝkÀ¸(å'<{~ß|y §*%8I¢P-ÙJŠÞ#¹Æá t^Z0ôŬ™*´9Q­Xꢭ¦h½´zzæsáÓÿ×\kü›•R°I‰:Œ8 cü 0bÅå5ƒ™Û;vm7Tkûu»aœTSÑì<`U ‚6±˜´ñ/|qy?åD°g£ôݶ6›—[=¤ò4 "E=D¡qИ 2iÂÜçÓº>+Y:#VÉ×׿‚tѺ¨È<ý’´Jø±J$ë½z/ÝÛo® ]Ü÷*.BæÜ>µ±Œ3såVJ/)|w®Y›U-BOªü¨—ͪldËæˆV¶ÅƒÒêÆ…S¥ÏýÅï}äÍ͵Í9Ì“-_´ ›•R´(X„uT‰*¦©ÿR3˜¹½o/ïìÊFÍÉzÃHÕ8T­ÈšuA'“MF¤¸|TWè¥?’¨¼Ÿ›'QÖ ¶l+ •ÔAmöÊë… ÔÉï¸Ëq?« “*̦³’•¤ U&=˜¼þ×3a6g-jƦd*k"ÑéËwvðÛ¯oFrå’v .%Y +0"xîÜ"¾ûÚ\\¨x«[+ ÍèT+‚Õ¬D¬ú:¯6+õ3Á’´hi…WÎ.Ÿÿ¯¾ÿÚ?Ì­¢®ð.ÉbWx ¡D»D£·B/+DEbÕsqy ¨ÜþÀ®o…‘@5¬T­SI‹ƒÕD¢Æµ¸|¨+ôš×y•ùÞ<‰ªYi®ÄK"PQ}TÔ+JúˆBùáz Þë©Z,ä§užd!úžlzPxtQa©”þÛXcqºöMr9âüÁ~ˆ_þÃ÷Q·q¿+çZý®\ÉŠŠÆ¢eóçñ­`ciÆ9Ø$ý˜©£J$ÌO¦¢[.íÊ­ÔjÃL³Òx³ûúùåÊçþÒŸ¸ò›Ñb³R ¡DMôø—NrCqyÍ`öÎŽ]ßjÈzÝHµF‘('jÍ9¹Ðt¤1,.?Ézy•÷; €ã°cT+¯Ê۴јnQ(*(ÔQÑ ˜Õíb˜mÅM ¦$+#Xß°¤pª”~Z×fU¾1'ø•¯¼Û;õf!ºʦ “¯“îí ëðì…üÈãðØé¹h†a&Ò”ÔZ¥Ä*Ó|´%Xðê¼òE«¨YiÙ|ý©ÒçþÜ÷]üÂÊÜ\öТ`ŠÔ%ªÓ÷Gqù Wèõ}j+.ß­aþöž]ß­ÙõºUQ$ jÍ9¬9‘ó¾o »¸ü¤Æ¿äG±'QþõÆE©»ml94Syɪ<+ýG¡јtÊqë†l Xvµ`"”j/l×Þ°è's˘TË\%gÿôõ‡ø—oo5kL,?iÉJËUh£4 /Z» ‹'Væñï~è"ž[]l¶YÈŠV¶-CQûc³BÖ{³Ò8uøú™Åò_ýO¾}õÿ\;;× hQ°ÈtG£F¥¸|¤Æ¿ìÖ0w{Ïn$ZY7‚ªsjÍAÎE€&®¸|À+ô’ÃG7‰:ˆ›in{©¼¨Ja¯C*/…B{*;ÐxU¡/—’•mÏ ¼÷DêŸXT8]Nÿ Cc°_*··ëø…?¸Ýª‰JIV:ŠÕJ¶Ò„ÉåƒÐa«nšu^Ïž_ÀŸ~æ¾ñÒD’¢^ÊЫÁJG«ZiX$Z½6+µN…·ÎÎW>ÿÓßµúÖÎÎÕÁf¥,2ÕI„:}ÿÄ—ïÌßÞ²{5»¾oUÕZ©†‚ªHT¾(±¸ü0% Ø5..&G¼O5»”׺¤ò‚)ŽB ‚Ë âˆT'±Ê®TÞéÇ5V*™V#Ä^èríJüÍ/ßÁkÒâ#(H¶G±B vÞ¬™Ü…¯ÌãOè"¾­º Hë1\?¢eåÈÍJ#ÑRï¬Ì•>ÿg¿ûâß‹E‹ÍJ)Xd %ª“ôtú¹=þe«†Å;;áúAC­×Dª #UëTÕ:TrèÙéM¢¦ª¸\!no  ,9·h¥ï’Q[Í~QSy£PÇ~ ™ÑˆúWÅÛMPÐP4[w¥=ÁzbIã\ž`¥"X­ˆã‹w÷ñ+_y/J«I«`ÜöÅÚ¬™Tø<®žÃO}è"¾}c€JÉ•_G•ˆS[ú°Çf¥þÊüf¥.zž·ÎÎí§¿ûú¯¯ElVJÁ"c#QERTtÛ¸Œ)'ÿþz«Ž¥»{v}«f7¡ª6œT¨ªqRÁéÎé±´œôT\ÞE¢Z‚3¾Åå‚Þ$ª!Q‡ò¤Kù–‰Zl…Ý.©¼ö.âŒB û`RÑÉÊÂ8’•‰bå­ôëÉ%óÁ !ö6¼‚Á_ùâ;x/lFxœa2‘¬Ðº¦dÕÃVÝv•+ŸõS3ø©§/â»®ž‰Äß!U;•í•N ¶7+m-¿ß–DµZÍQ?^³RçJðî™…ÒÏýôw_ûß×΢6+¥`‘c©ã..ûñ/÷÷ÌÒƒºZ߬ÉzÊzÃIÕ:lXQk"²Ü9=v‰Âx—eüK'‰ò_—=×?oU^Üî S*OçŽdajÔ˜Ñ-ÉU¾d¡=‚¥•÷ÆTÀÓ§r«b7Ì´¯à…{{ø_º ×Gùr•¬ÈË«ÇJ¢Xuë°U,Ø3§¾º¸PÁ?½Šï¿¶‚’ViJ¥ûò;ÀwkVê\~Wø¤Åƒ_§ÁSóúçþ£ïYûµGÏÎQ´(X”¨G£8þ%sßu³üþ¶lìÔe=UmYwÕ\‰Â`Wèu"gqyCJ^‘<‰rìØŒDÙV4ª(•—…ò “ñ¡ì¾k¤E+µÒÞöúô’ÂêŒÊD°Ø©·ÏúÛÏßÅ¿xk«)WÙ(V+UØÅÚ-v¶­qi7©ÊãÜ|ÿÎS«øÁëçP TJ®’”¥Ë¬>lkVê§m~z1Õ¬4§+¼ï-Ï?ÿgþøÙ_{êÒ™}toVê_°Y)‹U(H½D¯&¥¸\Pw÷Ì™{»²^ ÕzÍɆ±X ªÎIU€¥Žé±Y¡×QªN ¸¼‰ Ø ¥¹*/)&ß6À®mí½s£PhOå1 5yq·÷¦Xe$ˬdÛ}zQáÒ\j 6µ:víFÿ§õ^¾·Ÿ,µ_Ak§nQ3îÐBUÄ™™~ìÉ øô7œÇ\ 3)Ãá5+uQaüÝÓó¥Ÿÿ3Ÿ:ó+žhe£YE]á¹â‚5±ÕIz:ý܉-.¿·gÎÞ=PëûuÙ¨…²|©:§Ö²x‰j“ ~…^§ŸsÒÅåÈHTÞ÷îÇ5·l«*™•wà…"½íØÊq]–ÊD³”·Ý'—?´¤°6—ÞPµ:¶³møïÿÅ[xåþ~*E˜•+¿«÷¹J×[Ñr¾}©àGž¸€yü<–ÊA×f¥ÙZ­ÐöÞ¬4¯È¾Ñr@Ý[œ ~þ3?û«ßüÄé°‡kBEjÐU$SG•(`ðÅå]pÞÛ3+‘DÙZ¨"‰Öœ•uÚ$dLWèF¸Ž¡¸"ͦ›y%õ…Úm—']Ê·-`¤÷(”£/døh¥ ýF£IÍ¡/XÏ,ÕùôVT?¨c»™"”æÿÿíï¼÷öÚ+#Z ë°×°hX9¡*b®¤ñéÇÏãO=~§gK¹¢ezlVê¤%^¶ ‹|Q³Rç|°4üõÿĹ_þÆÇ—·)Z¬Q”)Õçë9¨zy‚ŒYqù{Ûöü½=·~àÔz-”u T­•ª¬AZ••Šqÿ2Ìâò¨½:JTC€l‡[®Ú4ÀžË8\4h˜Q(2PÑj‹`)<{ XŸËV­†­Z{ Ö_úço⥻{ñŠB¯Ð=.oب֪aÝP„ªˆ™’Æ<º‚Ïvá!ò»Â³µk Ñª~Ót@ÿuQ#-Qo?´7C·ž'QN0۵ƈã_Ú$*ýø*õüBAkV^z±Ñ°á›ŸÊËfŠŒ;Ï-+<¶˜Ž`ìïcÓK&ƒžâ7^ÆÍû#¥êçÁµRøäÆiüäÓ—ðÈòlº™h¶­Ã›•vê ï"}Úš›Q¿ô½ŸþÅïÿ¦ó÷Ñ[-—óŠR´¦Y°ºD¬zMÇuŠ4uº_'1êG¢²BT$V…Åå!Pºµi/nﻺSÕš‘uc±nEÖ¬   Ò[d§7‰š†ñ/M‰j^—¶‡x5žÄóò€m]ÎKå1 E¦Y°ööñ0§ë³_x¯=èA°FD¨  ø#——ñºˆ'Î.6+í&Z¡•Œ`!íò›•ºœ®ðÎìÌ•õ/}û“Ëã‡[¢UÔCËe"YBÉšbÁòäªH¬ºÕ8õ"?ýÞ–'GÀ`ŠËKïlÚKêjã tÕº•ucܺ¬Ã©Ë¢Pî-²“–“Q,.Ö =t(`O¢¾P›¡`Ç ¶¬ŠSzQÁy·(  V»`=8h¬ŸøÁq¡êÄ'..á'?t Ïœ_Ì­^›•æE¶l‡®ð~³ÒhM€ìÌU‚¿õOžþëŸþÆs÷ÐÞ¬´—Bø©­©Ù…ÈU?í:]×O4J÷y]§¹y @ðΦ½ü ®6ökn#Y­¬;AÕ . $ Ã/.?©ñ/ùQ¬ÃI”•¨¥Á–i¥ò¶]’ÞkOå%Q(Ð0£P„äóÔ’ÂSK9‚U3m÷ýÉ߸ Ö U¾°„Ÿxz¿xª§f¥¹#x:4+Mu…wé4¢/ZNdw~Vÿ­O>qæý±H´òFðÚ ã)YÓ"X]äª[„¨Û×G9õ´B/ Qz{Û®m7Üz­¡Öëâ֭źT­àz”¨‰+.?¤D5‹ÊÛ"VÑ…š‹diËH<+/©M£°ŸS •éfë X EH<}J÷.X_¸Ñ[ŠpL¤*'WðÙ§/â[./C¤½€=Û¢a]á³ÍJ­D°7W ~åÛ;ý×>û­çî"¿¾k4kÚ$kâ«@®ºÕ+éŒðä÷#_]‹ËB”oïáòÖAx¥fT54n#jq Uu ¥b±)¥é-.çK”`ßEEä[ÍÉPµ¯ÊKE¡šM6[Å(!Š`Òx:#Xû{{¹)Ÿúa Ö :AüÐ×OÏá³O_ÄÛ8 ºYiÛõ=4+MÍ:ìϔԯüÑÇÏþÕÏ~ë¹÷‘Ÿ6Ì»3•‘¬‰>6tˆ\u’©ärs}Þ}‘¹¾pnÞAˆÊ­»¶SW¡Ý0¢ª ëÖÅ¡jãcwé±Þ$j’‹Ë}‰Ê¾&ˆ É£yy›aÔpsËJa*/ÝŠQ(B¦S°N^¨ŠØ85‹Ï~è">µq:ÚÏô¿ê$ZyÍJ“‚x+~o­ü‡Vâp0SÑ¿ú‰kg?ÿïrå6òÓ†¹Eð¬É¬^ä*{ º|±æÏ;Q¹µg×vÔÆAh¯4Œl8§ªFܺƒZMŽ×ý¬ÐK䤧âò.Õœñ(.o Î~ŸBÍEµc¥Ù*’*…=+mûª SŠa(BNœ'5>´Ü£`}á^8Á]¡*âÒbŸyrßsõ,´Ò‡ê ŸMf æ]^O-/m¯:¬•KúW?º¾ø¹ÿø».ÝBº~ê%kb+9Ñ«<¹ 2Ñ*ÿ<{])«­³w·íÆÃš»R±aœl‡ªu².J­":Žc”VèuZKÔq)’( ¥(ç·8ˆRzÙæÎEQ(í‡ !#Ëc ÏîM°~üÿxooÕ¦B¨Š~Àùù ~ìÉU|ßõ”Ѳý7+MD+{[›lùiÃ$ÂIW½T¯=qiöù/¾ÿ‘wPœ2œ*ÉštÁ*Z™çËU)#U€àþ.æßÙµ×öŒ»Zñˆ±îŠˆÚp‚uVãH›ôÇ ½îQ¤Ñ/./’(+Q#Í$×’)Áމn÷ñ#PÙ‚rF¡Áúðr¶È}÷sëGÿþ‹x·1áRÕÛ7Ÿ™-ãGŸ¸€xô7}˜M!ZA˜×´ÔeÒ†mÅð­"y4JþµGW*ÿóóüÕI²(X“½Ê¨ô;`éæCóhÍ™ëÖá:”¾jWyÀE(­¼‰ï*;œ´ýž4‹É· °›Iåu‹BQ¢™\]Ðxn¹}aÿ‚5ÙBUÄ©J ÿöãðCÃB¹”Ûÿ*¯Y©¹ÊÖm…6Ýg+·îË—¬¨ ¾QÒú«.U~æ¯|öê›™ˆÖÔD±&Y°òRƒ€þ;_«}‚g•V—’b*>ˆ§¿ŽDI{Ò¢UV¬<™RG‹"CqyV¢’÷l4¯…’欼š+ŽB¥Z(6×$„‚uÁšœ´ß ˜/küÐcðßǩJ©­+|^û†¤µC§C›N†Þ÷dÇødûj%+hJýú¹%ü?÷“O¼‘•, Öø Vvå_ðwž¯½«DjJ•jõ2J‰•wJÉ•ÑÒ¾àô$Xƒ“¨Â×$ª}ðp„‹Sy­þPÀV×CÙt*ÏñÒ…b[BH×4>zZ§”#¬ö>X²¯ád U³%ï¿~?úø*ÎÌ–à$ÓhÔ¦{h›N šX¬K¤+,¨ëJu‡ â%Šh­Õß>33ó—ñß»öõi‰bMº`å¶^ø»Ï×o)àTJ¢<¹Ò¹*Œh©üTa"wqÀßÙÄßÙÄ'..ã3O¯â‰³ QÐ?&Z¿,$ŽZ­ËÎ;8%ÐJÁ)@‰@7£X‘\ù’5ÉL”`yý¯€Î—›¶åGž|¹JµЪµ.s¿¼>XYÉò?n%×9vC/•gÛ!°i¶LkGã.ÅÏëTYD¡!dœ÷áén”Þ¾½í¾®ÛzÂê¨òÜ;Üô¥÷¶ð¥÷¶ðìù%ü©'/â™ó‹P¨8jÕœÞ,ª5GJÉJAO²$+‰3DÑ1PA!INþÁk#X Ü‘¹«t+üš+_®Rð^4ËoBšì%€Àv£ÕÊ`ËFuPÙT^6 5¤ Ì !dÚ¥ëxhB…ê¿Ú×îíàk÷vðÄÊþä7¬â¹ §h\¹ÒqpNÁQmW ÖEÇ,§¤uŒU *ùZÆû•¦`å‹•Y¥:±çœš"å‰OR‹å ˜R@Í ¶BÁN¦jÓ´Ry~-”öRyA}¡X E™™ê÷ÎS)U2”_ëÆý=üw¿û:®.ÏáG¾a»°„r§u,SZ¡$€Õ Î!.Š÷Ž“ˆb_mÓOÚŽs“Y‡5©‚•+Vh­$lëIE±²+£(Õžöœ`×;&’©íœTžßX³¤€år«Á&Q„r’>D¡: olàg¾ô&ªK³øÁG/àãN¡¨xÐsth«£s'€vÒ¸€—&ÌváT\¯¬(‰WÝKjU~35ˆè67éF5…‚•*vwåæ•*'U˜—V(CpªT4#O&æ­L!£²»ÎfþÒãþ•uTÃàýý~ùÅwñ›_ß±±‚Ÿ;Õ*kÖ ÊIªýQ”2ŠŠ¯²uXåÒd/ÓÒS Vm’•½WêN^ë…²V(kšBÈèŠÉ‘‹±NøyKß7ÂsXñn¾‡ÿñ_‹#V*UZ•é ‰öž“δD°²þÔ>˜Ùw¯ž¡)BÚ±;·Ñ¨ø÷'nÌ„êð7òsß763¯Wâã©´O5™2&¹È½Ó×Íkó¤ÊeC¿"„aÊ¥çƒüAèFú7™T¡Ê£ÕÒ_1í·0JfN‰tMC›ÿ²J]èp' À15H!C#tFÇD§E¨Ú´^¯«f ™p9¡r0ÙËæná¾ g¡:ØWxB9ÿŒj?ÀqR ú‰©ô4•=ŠJÛ,Þi¡49oBQþ~­ëëjÆ¿JeÊß³¡Ka§OBÚ±¿÷Uƒª““ªÌÖËùiÁT+UÔ<ÎÓÁRÝnð.C!,B¶HûurrφBÕãÁ5;×ê{¥âç ¼Ü`Z¸2Ïx»¹O[ŠP}¡Æî D!“…e1¡PuxèVÝ•g\yÙÂNÇfŽÊW™j¾“¾gªo"„rì8iX‰È1–j°Žj ­ò¯RSÚó¨Ä·4%‹B¦¦ý†ñЬ°™RÁr6ý;w­ŠgšBFê@Þ°2˜H¡ŒPù=%;tO­`ÕŒšëiûjNý&„2J„®÷†¤ªÑ~h Öx‘7ƒBȨ‹S^ VÎñ?]“ÅÂôá?´ŒË‹LÁâ[ ³ãhì¸RtCBÈôàqʶj¼ý²Œ™TÉ?üàž»R€ŠEzff†‚5µr5ä&£Ñjq.’+¥)Z„éþD+‡øJÕÈÕ43•‚¥Ú.ŒÎ&&ÎÁYÐ:€ š’E™JÏ’lowI"ýªq*Õýæ‰4º©k4êô¨¾]юù(Šå´ƒvºT‚Ò%‹25b5*Þ2™B5ØçÞ6×—UÐS)Xp¡]ìÏx†mXœ@œ@œ…(ZLB&–Þ‹Ü)TcõÜ)Xdô>Eq†ç A ºTS†„B©¢PQ°Æü­%C},QˆNÉç6ˆRPÖFð§ •†Òš BÈ„}®”T„*YXí³: …Š‚E²Ç‰äË)ˆ˜H²‚‚H´Í"„ðƒï” ¥Š‚5¦Ÿ  FpÓÀÁ™hø©€ð„‰‘§ñ ¡`y¨QØž%ç¤T<‰<þÔ&ñ¹qp.ªÍbùæ¤`ªë£E$T-Á ‚ •&Tþ²fÁÊíç±°|÷VŸD#ÐQ«™2Lf:¦ )5„Lá€BE(XÇâQ½ÜC©ÚP;HŽŽ£VIKÇ’¥µ†‚‚Öº¹ÊÆ•J{`îíƒ÷WŸÂîìé¨+‰f‰74:I‚)Cî¿á;—BÕσs8­‚Õf Ö©™žõ+¯ºrÛjÞÒXQt€ ˆ+©Ã*Ñy3M¨T«Mƒs°ÖbíÎW±}f ½­4¤qpÎĵY%(Ïs×H9‘÷z/Eî=íXGÅ=1kØÆUç© ùÓZAë–\•Kåf$˯ÅjF±â^X%klÞÂüÁnŸå98c[à…Š;Èë Ú$”RF³!C&t‚n‰‡ºq* k,%LÜæåâSÀR-1Œ£Kª¹*•JMÙòW¦+ŽbA€’9À#·¿Œ{g¯áÞÂ%ˆ(HÍBœ2T"ÐÚEâ™2$„œÀ!ÝP%Þ}ŒõÔÔ¸§ýkoôz>I+©ÃÒq-VRô®¼bw‰#RÖÚèß?0«÷_ÃÂÁ¼{îq4Jœ7ÏÖÁI´vq”S†„éØïf…+ºn;¦S¨+5ÊO-zr‰@:-WÙ‚÷ç‚8‚eÖ&nPÔ·1ûpçÜãx8sÎÚV¼—2T:€{fBÈÀÄ„BEÁâû§=4}¼'Ílj‹Ð½”ŸBTc•D°š§$Š¥ Ò„%ãß?顆X{ï,._»ËWa”ŽR†â  — $>gÏ,BÈ0vƒ™øT²/L_E¡¢PQ°F 'cü;+§ uë Ss5a|}sG×a:€‰Ó„©ï×§·ßÃ|m·V¾;¥yˆmµs€ç¢ÑbÏ,BÈqaFƘö#¬¾°Îͯ_©(ŠG©š‘,4k²²iÂ$Š¥­…6ºåòOJkaWßû*>8óî,^†³ pIcÒ(e(š=³!Ǭ™"¬¼, …Š‚5‚ŽÒvʯ”úf›;Š0>E£Vš0É*ef¦+¾_`mJ¬R?# qáá›Xª=Ä›gC­Tâh–çÙ¨x–! à !cªr*BÁŠqÂvœgV@Û²¿©hV¶ü… Î9AÐ\QØ+¥£´a&š¥ë;xü½?Ä•Gq¯²‡(šD)Gë:nL•‰1eHæ®Rý*ºkÔDkžcSd¤ÉRºM°²ó u&Š•¬&Œ¢VíѬPk¨0Äå»7°´tï,_CCÍx@âÖ†)CBÈ@±=°BG¡âS£`¢Cõç2ÄmTÚþ!óUS´¼s?’¥”jŽÎñ‹ÝµÖp~¤Ê‹‚iE³òRË{`¾±·O?†­òÄâ¢v¨×h9±ì™E¡KG¨rGå×þšRuˆ§Eãš6ÁRÅr%z6ù”d¥N¾dÅmÉrÚÁåÔ^OºŒkF¶ŒÁµ{/àÞò:Þ]¨Â)ÀÙ8e(bØ3‹2˜c¸BFE(T'öÔ(TÓ.XÅ›†è…hÍè;b7GÉÊ•öV*¨Tš”SÍH•Í|ŸI¾×è¶(VKÖ…­[XnlâÓa¿4ç\ÍŠR†*Þ²g!ã%5ãùÌeÌ~éqNûQª(XÇ±Í ¹È]A¥ŠÚ#ARÞ>ER‚U$]ÙT ˆ¤Î•R­h–1©X’2ÌJ–Òª¶‡'î~ ï._ÁÝÙÕhvbͲÎEó ¡Ù3‹ªûAØ¿,‡/j§PQ¨(XÜú'™ö½ÌDLE³ŽNù2–,årÛ>ø)üv& ±öà5œ^ØÄë§®£^J ࣔ!Œ@‚xp4 à !} rW§a™bÁšÄìN‘¬¤Þÿhdë¶â”!²)Ãd•¡ÊI†‹ûñtãkxóôu<,/7çæ¥ YOé›WÔ.t€QªC<5 k@þqèoœ\¬~CX‘UµÄ 騖/^"œùL-W^tËoaâv×?x ÷O]ÆÛóW`”jE³¼”¡Ö{fBã-ÃÞ7½PQª(X#¸½Ê +Û¢!¹î(º|áj®¾ÑÈŠV\ouºeCÍÊí § W¶ï`©¶…×–¯c7˜‹Z88ˆŒ‹S†Ž)CBHç½`fØs2=Â'´ÃZ¨D¡"¬ž±ÅñÞùô!U™h<™JvZ¢¢Q8ÍÛ]{Ë‡Ô ES”2 Æ>ž|ð"n/®ãÎü%Xg›Ñ,g£y†LBŽJèŽK(T„‚Õ“cä]'®÷XÐ$m®ªSÄ(Žf‰€¹öBy¯449ƒ¢³Ñ¬Ë[oa¹±‰×N]G=(5Û9D3 [ÅïQGzF³!ž< }ÇËÂtBÁÍm|°ÔìZœ‘·O˜?Œ\e%+Éú+€×éhVr{†X8ØÂ3áóxãÔU|P> ípQm–ÖºT¢dBÒû»Ì>¸[ÑûDU×§F¡¢`1j¶él‘û1‰‡ß+AkÀ¾ëLÏ,©ËRÞ°é0Žf]ð*Î.^ÀkKÀÚ Í &lÙa5¢ÇkNê XÉŸÞˆçÂ}Ü\|[åSÑ*Ck¤9)­½Z±1fQjÀ~yèU÷ªÂoç>mjKeÎGÞë³]Ú¿>þœe6š•å0ðÍù…AÐÍ*…u<µù*î,¬â­ùuX ÍŠS‡GIRjì±÷ÁšV¡:âsç~t:KDTŽT„äÕ°T´„pèÏ£“d%·¹xO—ˆ–µ6·>µÊÐäÙ±ÆàÒÞû8ÝØÁ+‹×°«f Òê™%—¿³g!+X.¯Ñò1ïY˜N¡¢` ds›éçþN=¥Çq?e˜'ZI$+Y ˜Ü'‘*›Ô^yÍIU¼Ê0;Ï0IÎ6öðÜöKxsn ·gVá´‚³Q4Ë Ä)C­YOÈDîxFÁ;¦<íG(X‡Á‰TúÛÞÒí?À²9*Ç˶íɉ¬jçõÌQP±‰²g¡Ôéª#>wnj¬‘Û–‡zÜV]wÆ'©Ý¢YyðyÍH‹ â³ðbxz÷uÜž9‡×ÖaUÍbÏ,B±™ŒK·eÈ/r—>åBE(X#·]»¾\rv(¢ÔH½OS¯T”2LÕfå5'õeK)˜xžáÅÚ8îàÆâUìÄó “Q;*OÍžY#ÿ–â’NÒ…^Z0¸®;æ)î˜Î·ë8Žû}^ßãáä%f$_ì> à“Û•Ëfeçæ­4œ15|xû¼5w ·æ.Á©hO› ™¬žY”2½Ÿm%µýf7áºqdã,TÝtVb€r?Û7ÞE°Û<à ¾OÞÖÈ ¤nƒBÅ÷%ëdßìܘŽE´Ž£¾Y§å¯24gñÜÁx»±‚7ªã•Wϲž;O2º›¡@ R¨¸O `Á$-¤ÙôJMàÿ0ó ­µÍy†&#[Íæ¤aû˜c œµ¸‚û8»½ƒ—æ¯b§4׊f9ÄZD›Ã0_sîÀ½7…ŠP°úR¨¾šî¤f’"jýÎ3L‚*«ÖÐh¿gV‡”¡1‹ªï¿‚›åK¸5» AÜùÝ ”s€ŠÇì°1)!'‚q8BÄŠB5ü‡¦‘M»`‘­¾ à½v…=³ræc œÃᬄ[xyá*ꪈ‹#YLr’ؾŽ×Lû ÿ¡)T¬¢MC°”¼•Bnl+u=šdEŸÁÎ3TJµE³Œ10Æà¼ÞÇ©½xy¦Š{å3’Ƥ~Ê=³9ÉãºÑ¨4÷‡:ÐS¨(T¬Ñy›»¤zH›¤ˆ÷˜5Ç„âVî¾±÷<ÏÈ훥óR†Ѭ0 QÁsµ·ðv¸…׿ª•pÎA¹h•aô=%‹aÉ€d÷¥røŸE¡¢TQ°F÷Í>ìMM)5Õ›w?ð©hœvmó MF¬²µYÎZ\q[8»·ƒç®a+˜O}tŽFí€)CBýÁñh‡w9ì7R¨(T¬ã9Nñ»(WÇð:D;æ.ð}¶sȦ •R͔ᢲøÄÁM¼V^Å[³á\+’(–)C2ÙR3*ôÒh´f,¥Ši? ÖXÉUîD 51;Í# ççvK*qxÜÜÅÊî6^œ{º’-þ˜F³È”¿?Ǥí5m[UxbZ)T„‚5Ц ¹MCê1…;íAÀç¦ •FÐñàè0 a¬Á9]Ç7ï¿‚—+kx¯²gm+e(J%+ AÉ:ù#2™°?çèìó˜ö#¬~×óü³¯hõT_µ²qJ0µÒ0雥5TS²"Ñ*+àÙÆ;8g¶pcn!‚V4+IONë˜î» 7l ¡`¥ÒÍLRo›,·Ù‘“¬èïr¸y†Íx¥¡ÖÍæ¤ ÝH¥ Å9TegöoàÅÊ<(/¥¢YÎÚᦠ¹=’©ÐaûJîÁí—)T„‚u¢otr+wÿ1Ur™Y¨\™ò¥Ëç(ó M´Í3\ÐÀÇj¯áus¯Í®ÁÅõXHê²”‹ûn±ž£{á+ë¨k8êÌyöúÑÛ¤ù&ëE²òæÅð¹)COÂÂ0„V ºûXÙÝÁóó`OÏ4KÀZ Wrœd‡=u¯G¡"¬ãv¨<êrÈ»»ÿ÷” ±<È <‡1“¬È¡ºÏ3ÌkLêòæÆ)C…(š•ê™åÎ!¾åàUÜ(]Âí™óÍh–ˆÖB¸Ê#ï§O¨(U¬ ²­¡¼×°i=v+žÆš°bÑê{ž¡RpÊužg¦Û9$)ÊRxÆÜÁŠÝÄK³WÑÐ7$…KV²g!‡ÙG§Gå´ï÷¬…êÄ-˜RHÁÊàDfƒ>xÜtÆK²’òQç&Â…$e˜3ÏPD°†Î쿌f6ðAy¹•2ÌF³´æˆnûÛw¸ ãNnï<µi? )XÝ)÷÷†çF5Ž¢u”y†Íš¬8mh2ãuüh–µóÂÇêoâMs7g×#Qs@9ј2$c-5Ã"t’shgÕÈýâBï¢`„û¬¡J–ioè3sƒG“¬¼ÛüxžaaϬLở2 ´ÆuÙÄÊþ.žŸyÛÁ\”2Œ#Y\eHF]lFé…q"©×©­“ûqÕ™ö›ÒxoÙ-¼2³ŽºY›¥œ˜2$¤ ã•@5÷Á}×\Q¨(T¬á²µÙŽß‚H€ ¹Ñhê1ÙhôX$+‘Õnðçz=³T&m˜HV†ÐA€Gdg÷_Á×*W°,Ä« ¥yÎxBZû\ÿ|8NÄ:*BÁ¹í—Œ·hu-€ïsža6eØ,€‡åÀá[_ÇÍà<^›¹ 稟8‡hžŠD‹îv›„²²Õ0nJ£T* ýjGÿ¶pÌ¿du*€ï6ϰSÊ0içPJxBîãüÁ.¾:óöu%’+ÄY@i@G£’Í"Óù¦ì~×÷¾…é„‚uÜ΢ú}o Ò=YŽÿ½=^ÒÿJ‰@!:'Ç'YÉ'åNðæÂ«TÊPé¶y†Pçuˆo­ÝÀK¥5ܪ¬D’%QDK¬ã˜2ÅjÆ Jºåm}°¤ûO™Øõ<P°F\´zßΓsS!Z‡™ghU”6ÌkNZ4ÏÐY‹¹ Àsæλm¼TÙ@]ë8š…tÊѬq7Òçëe½I8ÑÌ{™àzœ…Š7+ƨ08ì&ÄÃÛôHV´S/.€ÏkçÐVï­4ôç&òÕì”°Ž=œ©¿Œ¯–®à~y©Íç"±ÒJ@Éâ~ŸP¨øšS°F“½†šïwS:Ѩ'*ZEð@~;‡nðÍ>YAŠf‰N߾ޛv7gÖšÝå!±ÇÛ3k`»^î{É€áé…Ó’³mÉþV* !¤«dåÍ3Š àS« Mû*Ck Êå2·q¡¶‹¯V®`GÏ6kñ$îÕf¥S†B(T* ÖxX‘ŽX s„S-YÑ6Ð}žaÞjB›Ô^ùÍIµn›gÆ¢¥t€±ø¶ÆM¼ /âÊHÒÆA"qO¯È“ÜON´ú.€Ï™g˜—2ÌÀ 3A ¶ïáBmÏW6PSAÆ …ŠBEÁ"„’Õ[¼4%u:Z˜í™•À› hëÁ|ÒÜÄóúÞ)àšÍI¹ÊŒµyå} ¥Pïs§`Mø°Ûvçè!¾QšXÑê{ž¡R°*Jæ5'ÕɨL;­Ìk6nã‚ÛÆ×Êh¨ nåÀ”!‘é} …ŠP°Ž¸ \6@}œÛff¡¼†£|SL‚dG/€÷ ^sÒDÀ’ð•™\1û8[¿?(­ã~p*Þ’âQ;Jæ*C2ÕneÄÁy3 d¤žÝ8>4¬Qþ0uRÛ'|+Zƒ.€OZ:˜ HG³J%œÒß¾…›î,n”/ÁB5[d $^eÈíŒÆ¡ÛÉ$ÿv* ÖÒ€šÍnx*Nª‚ÝÄïÉÈHJVÑÊ‘)“,ÿÓz·øävåò£YÙy†~ÊPâ”áYcðIóu¼¬.àÕàBSâ’„ {f‘aº%oé`Û]NæÉM½P VNë™Ã¤ 9iÑêužaß'ož¡ñVæ¥ ­µ(•ÊÐJãûVÍ~?ØÀ¾ª4K L’cÿDÜîVLûÔ/Ϋۛ¸óÚD¥ÿm:ÁâFJޝ>™gÂF#’° @Yk¬š>e_ÅW‚˸¥Î¶K(Zäx0î%…B5y¿k8ÕË=’cF’œ³2ÜÎÂ\EH:‰VOð…ïÚ뙕mNšôвÆÀZ‹r¹­ ¾É¼‹Uìà«ÁBUŠí$)CJ9Ž} 4s ’ÛhTù`'ý(T¬é«BÛ‘!oó9¬¨?f”¬ÁÌ3lkNšÔdÅ·"(• µÆ5»‡söëøR°ŽûX`ʜ豟BE¡¢`ñ½~„ƒ(,’î¢uó µÒÑ<øn JºŒÓÊâ“æu¼ŒÜ.ÁA5£YL’ãÚñæ5íkß8ÕÓe2- ÖnjÖ½ˆ¿&ÉÖÖ¨’Ucþ#ò@z“¬Nð:ùžœø¶‡ñ¸#üSŒ¾µ8Â6a;ˆvÐîh3™¦é` Ûê·†ª¢ªnÍs•ªêVÕÞ13ÏÞkùÃÞçä9'OÎsž½nœ›ùæpò {xöZÏzVÎZ¯ßðެﷷpÕžàæa£Y Æ,Ãh³›Ëe®VÙH¡ÑÈ£Š *¬%7=Ò{€Û É3z¢²üª~8^ˆ’²R@ÊÉJÆ¡ž!`µî)Àk…5q²øû"§{ñšº\XŽÄa´YͼV2ÚcUT`­ë /A´íZ×3$‚#6te!ÒôyRR€—žœÃÛwq¯;Âãú!t cÈ0ÚÜaC¥á̼ØÈ£ŠÖêÛ²¼&ÒY"q¾Š6dù¶2>/çnHC†ÔS€·ÖB†"|(9Ã%÷<¾Eá=:—ú|BFl´Ñf{—L" ŠÖôóhÑ–´A€ÏxZh)¨V‹Ÿ¶¯ãE¾ˆ§ÍpB½~AV´)l˜LÃöªÇ'£°¢E‹¶Þ kP=Cç\VÏЖÀV&Nšë:ç`š "|_rˆ{ì)¾¡ÆÚÉM ’þp¼1ÑFƒ«iš·P­õ©E5ì°rsJß ¦_Ñ &É¥%Ú.QlÃѦY¾MWÏ0ý 1Ô+×̪ &ÐÚ€”Â݉ÅϹ—ð¤\ÅKúJ?¡&‚¬­·Y‡+.•`•­U›ö‹QX,q|c€«"èñ,¼D)wÉûÄ%)£ÍhML€ÏÉ9 ÔÌ*Õ3$Í&”Uø„}÷&‡ø¦~m4"ÈŠSßDc`¿LæÀ‹€*¬:O>ãžõubÆc´™@VÚžçYψúð¦ÑáÁ¤‹»ÜKøÝ·ÕÅÒ´âô³š+mY6·eD@Ö¶b¨iÆóØä¢mЫž!P©›¥ªB†Þ,­½0é¹Äâ§ì[xÉâIõl&yŠ©½Y±OÖÛÜÚ¬MçQE‹kB05à߲ƒt’"ÁX+'Ú’@VÕ{)¾àÍ÷Õ/ÌðªH€gFF€ÿžäWÜ ø/êaÜTûEoV FËYÂ’£¡Ê…1ì­ž+6ÇhÑÆYߌ ÀO(çP24 )\² ~Î¾Š§ÝÝxN_íMœdEË—h¨²òQ8ªh`-®m.Û…åÝX±oD[ Кg=ÃÁ!C^KðÃÉ \µGø¦z'Ôê‰Em-0ATÑ"Àšt&Ù›´ñ¥+§e® ¤/()±ÛD[*Ȫzoxç,&H)óРF̓¥¯bëÞ&𲩀«d1._ÊÙ–øÇ„Èkf)ÀPD„G»Ç¸Û¾€ÿBâ}u.6õš›sR`ģ9İ_U`­é„³LTHk@ꌶI iQÇ7Ô³ Y0¦W,ºô½ô5g­/­5Mà‚uøŒ{ Ϻ»pMÝ&^´¨" Š+Z´ºªU‚®eývþwòœ˜*Ф”ÕûœÖ¢òM @+I€LÃÿýQwW’c|Ó|Gj76ÄšB£Ba®ÉuO‡" ZÐOGDV7€Ec¾6vÓ¬^D=RSV\ª^Ÿä¬Ís?’›ùRòû À%"PhUí'}-I8Ç »,|&yOªûñZãêÖ€†h³_«b;Š<ª¨"ÀZ s";Ó¶¥¥V©É‘(ÖÆY¸ªòÞÌ l-dÍuŸCöUödÉ •‚­Ñ—ÝÇß¼srM@Sv4¡¥ FQ8 º?åÏ*u¤ ¤¨÷·Ê¼H4œ BR ޤôÙ›EªA’„c,׃=ý@ªT@T1¹>¼C÷UUƒ€UœZ¶¼¯–Ú\âdÎ{ßÔÕslù`­ÎfæªKaÒZUa´e€­üvÐ ü7ÙÃo>{úP(å@ — üÆ‹>LxÐTÐJ¡¡òàNàD2>Ö ±ˆã-޶~“ã6Á‡×z¯õ^ÕÜŽ;:°"Àš{;[1É}[•Üg©ã—UóZ塈àÑ=à'îb|ë–ÂíàÅ"ã% y)TÍ%Š^F›;x q.fÚ¹-noy¯•È’ËãİßvVX3MøúMη¬å®ë#Ó0¸®ÝhED• JDföf•Iâpí8ì{ E M håu²ö¥fK¬hm,«"‹ç3í¸Æí(aòÞœ/LTTE€­Àj€5 hÍ ²ÊßÝQ‚Ï_îâw¯·p§ã<¸"­ 4!!‚ƒ÷2ı)‚§ÇiEdñm#ÊZj3+¹Ç°ßÜO«¯òÂ*ä"ÀZ­ÑªÂÊjºÂÖ€«2°Ê?²ÿæå;øÒ‡ÏUy T~mÈ*Nˆ@aKßÏ?ÿÁsß:ìâÕN ûVÁ(A‹“y±|˜9®þ¶ÙœôÚ纓Å7zœÈ«u2E@-¬ÑkŠaŠ¢VÛ/¶­?”3÷z¯ù0ÛŸ½vŒß{៼ºƒ{÷L)R“‚¬üwʯUmŸ¿ÜÁÿúV·ÏZŠ áë6ˆÐÌ{±"±xã,ÍN¹MU@*ÞÓe XaªläQE‹kBl8ÐA¹•-V>Ú0P•W=%P®ŸXü»WþâüÓï9×€ó: Nc72˜Bï¹R*{~É~úü þßÜ$ì C˜°©Ž !r±Ö <9N=Eq“Öì–Çü¢7ª1Ž=6ê°–Ž´Æxmõǹ}po$¸b‘—3ø“×N²âÊ_ë _þ®]˜œ—*}TJe@K)Ux? ýUx±ª¼V•@+€+¥H)(¥ðÉóoÖX÷<¬ÒcK½X)Ðb­¡Æƒ;?²s‚ksØÕ ‚–&h"4Âæ°ù^¬…%q¤a:Tó"YHAVi½ PååÊÙ„J)(É+f8­¡Ãö_]8Åó×wq’xï•V †|¨°¡CF¡LÎÅ’¿ß=ð”—)ˆdñh‹ÃJ‘˜¾ºã޽9¬üÄ:Eâ5àqÈÆ›RNÂYxÿá6Þ>µ0DhÏ¿Úk(ì…¶üÕÛüÓGLÏˤµ/g£u4Q.+qÒr1ïÅRÜWš9óbm°ÛpøìùÛø·Gw£© ¤;Ú70£Z(ÔÛ–P!ÅŒdñhó6'€¦þöÔu›®ƒ²©^ªØ³#À>Ûïo¤-¹ô%B{êÁÀxãÐâoßíâ4a´´ÂEÒhhÂŽQØ3 ÇŠñ_¼/ÁŽ&ï¹b†1¦,€ÊÝËï ¾ÔÕ^,q’,c`˜áØá£û´"hòÙ„:Þ°Û ñÑ2ß©\8‚§hËXE”®” ]hnrØ/öø°Æo*ªoŠQ¿…‚ª*p%Ì`f°sfüñëÜn;'Œý†`ÇZ£© { ÂŽ!v÷¾ÅOßMÞ£ïÅÊ8^ZÓ… 6àã³ñ/nì k|¨ˆáÐPÇZzñ÷¡H O9NŽ#Y<ÚzØÐU~y"›pàPE« À¢™ T®àè¼J ŒuÈS%ÉÀ|:ÂøË·ºxçÄâ°Ã8³ aà ÁØÕ FvµÂ®V8%Æß|@øä…¤~òÀÊ‘ëI,ôµz€ªïjR…Ï,-¢=8LAV ïj9|jïþ®}É—Ï!Ò,…B½ àII3*‹G‹¶fÀ$ªÚ¢ºHryç{õ°x©í`{Ú\™Ôž…EðÒ¡Åÿ÷^wº'‰ƒe"à$a4F)´ a·Ahtw»„->rÐXYI›\†aöZî3ùã'\¨”Paž‹e¹03 3X?y®ƒkí3tÜ.y3­Zy%2q!èr¦]OÑêdiXÚWvX·†yTå±*Ýû¨{•§t:­nÃ`MØ€¢¨òÀ*Ï»JC„"Þ[õ'otpÔewÙ{aà5¤NÆ©eì²û~lh[Á¾eð¡Ž'È£_T)âð˜ûýQu  ’æ½e:G¬O=Y†®áð¹ ‡ø½Ã(h‚¯ÍD@C– LÈα˜Âße/TlrÑêlN€FTë½XÏEv¤úåZ[ VʱAeð°ðz¾Õ,»Ålhëdf8ç `@þf×OŽ:ŒŽåÌãœà,aœv …]ã9X)ÙýÚq·ÚǸؒ>p•Š‚Q¦c…R¨p”ºûX¡Bcú¼rì2~ðôÏØ ´XAÁ² Ωã8ã>E‹m°1 Dù4BYúb7ªyíºÎc]ÍíLÛ8""Ÿl ^»mñí‡]ï©rR¼æ]ç½XgVÐÔ>3o¯áKÓ´-á[wøô]Ý ¥b ÖZPMÅH)öh¬ÌIC…Ÿ¾ØÆÓï¶p3i`ÇZŠ|ùŸÔS‚ z§¢E›À9Õªh=SÛŠ¤LøØÎ ¨òÀª_’ÁCŒ#ËøÚëwÇwU6'‚SË8M–:Uvo(|ûdI’ÀZ ë,œµpÎeÙ‰)˜KËÇ6 Pe ­"ô˜ªÇk­¡‚à¨1Úm°ÓÐøGŽ`ÙƒDÂ~*jÚåhÑ–8¶ô677– †q2üíõ€ž :¸µ=ï°Ö\-ø›qÌg ~í6Þo3»]WíÍa:Á‹Õ¶  ¥ û …–V¸Ã/œ8k=È +Ý8x”úÀ^Å1 ²¯O¨zà*¿5Lß{ øþÓ,4èÄ7­TºAŦ-Ú”fÝ´3¿Œªê ¨dûª|¹žh-’ÜGµ» 0,Yà®â·6E`oPhPDðÄ ž¼aqر8KnH\â']‡“¦çai"ìj®N-ðÍã=|¤u J)8­½+x•2­­&Ę’ ±÷„¡Ât×^z§…®S ø'!ÃÐd1q"Z4 íÿ;Z@S÷“öÛ¼óÞ.SñLw¢•€ß°Ð ãv‡ñ§ovpÔu8®ÒkÞvŒ“.£cDÀNÈ&l*Â+ÉntQéÁÊ<8MAè¾Z…¿“«Uh؇ ?w¹ƒgÏšè°†V!<˜5u±¢E+ôù0þr_-Âeu”í'¦/wLÔc°«Àb3±þЂ8X¾äƒ÷f¤Êñzg•UiHõq¯ïê¯Þìàµ#‡ãPÈyÖ1QXœv§ FKäVKŽ¬Æµö.~´Ñ͸Xiágçœ9ÌkVáÑüwú² uEV¡0εŸ¿ë ðÁ¾oƒ©W "+Z´Þx½®U½yT›æ"ÀZÛ]väâ i“…ôh)+Ï[òœ¦4'"xãØâß¿ÓÁqסmynçÊ"h[ŸQ¸ßðR »AxôÌ2ïœÇì]÷Dwc2N3g^¬TÝÝË$Ð\¼Xy %9•>c¼‡Ï0~äBuñJ§¨<¸ó@+z±¢EKû{N&GÆ=E@µÚy¼Wu\>Ö`ÑÔob<–ˆ ì{£fö Ê,…;Öáw_nã¸Ë8IÆdHé²à4ñ£ ­ÑЄC0ŠðžÝÁ[]ƒ™àÁ2Æ‹æ3 •ªôbMZ6g–P᯴ñ?§ Ë^ +=7‰ëÁhÑ ý]0ï±›\‚FÖÿ~Iõ1×uá9XØÚx£ònÈ‘A‡dÁÍ’©6¬s>4(Âø³7ÛxûÔÍ\õVµžè~¼X†»ìÞq‚ÇÚx¨u§—QXáÅ*óó¡ÂI…GókÜPá={ŒÏ\8Å_ÜÞ y5Žˆª¢EÛ—|6AÒmµºx°hÚHÍ] ÃBƒYað*ýÞ+mœ$'‰ó‚¢ :&˂ӄp’8ìh¬v ¡©€#ž8ÛÁ§L§®rºX\"»K©tN<²¦ ¶Œ/]iã{k/–æ8nq†Œ 6WjK†Îå‘GµR@•¿?’Îá®­µ(4m,pUYiÈ- þñ«§¸~æCƒ–ëa:· ÛŽAðÊî;FÁ(Âßw.Àºà½Êy±²c.•ЩÒšXO"@úèáœïF÷z´húy5,‰Ÿ+TC”—E*²Ì‡`²°¶ÌÞº…ƒÉf[R®Øá©]üÝ{ N’Å…ûW·>Lx–xÓF6á¶4ñj§YæÉî)'KÐ_Ÿp’:…) J§ ~îJ‚óÆE`-Ú@8R웉ã TÔËG•²r¦ˆ ÅÌ"É}žªkC¥ÖîœDpÔaüþ«íLeÝñrØD,@Û N,c×ùÂÏ;F¡eÚNðxç>ܺéGƒðh¾|N*Ù H…ÇÉ%ò kÚPáA‹ñÅ»;øw÷bŒmÐ?o̳PH¸Á|žW „‡í6q¼Õ˜¬6+Õ8›®†kTh0óþã_=Å3‡³) 9ÏÒ‰'8ë2Ú AS‰'»kÂ)^êàŽ½‰Ë%/–N„ð(ÍX p’¬ÂºØÅ÷ßéâÚi3ΪѢÍ{ü€j¡€*¢çªh1‹0ÚH°ÕWG|æà·ÞëàÛXœ&‚Žã¥ËU0 ÚNp–0,š¼ðhS{ïÑg=VxäŠÐU\,™0»pÖPá¯&hª8Ë”IíÅ÷ê µê"¤©›šlBG×wEE…Ý2™»2:–ñÛÏŸâ,‘L’aÝ»Še/Ùpj ÙÐÒ gĸ–œÇÏÙÛhTp±ò² Ž}˜Â©ˆÀâ§ JÿÒŽ@)(„B­4Xù¬BÖ m|¸ð+÷%øõW¬ÄPa´ú˜ˆ_4))SÖð@7zÙ>Ç)[”öJÕÙjErŸXš¡m£(É pŽaƒ³Œ?~ùo»µË¾êõ^¬¶$,ÐÊ+¼74ÁAáÉö~&:š„G„vHFa ËH<[XĽXR ¦Y…JkïÅ2ìk|æR$¼G«-ÔZOô·ñ*YúªÞªÀ¢ íÊÓ/ª†d¼qÈ’Ë6W/Üîâ/ßî¢ë$+ºº)fÙ‡ ÛÖõŽVhi¯ìþxçœU6p±lØrÏ%Ë"äp]Â5*)¼OÊu« t‰‡•nŸ½Wp¥C…Ñꫲ·ð¨fݽô¨ÈvWuë°[š€¡rón ЦlÕî:üÖs§è.o ¢ã¼&–eA#õb) ÞÁëF¯\NêÅÊ•ÐÉ—ÎᲫt-ÇÖ†ñ³ Aõ@–ׯ20Ês±vŒÁWîw±ŒS´ÚØ q'q²œA¤f<ªy൱ª"ÀÚBl%®±íl¼q£²Ëô„oÆï½|‚ëg\9– ¼Ù€eàÌúr> Ô‹åk>Þ>Ÿy±÷ˆîiFa>“2•­¨ªQ8‘+Ͻ ù}¤ª?«ð{Î~ì| F« À’åË[¨d%»D¾U•ÕFË Z“ö7lQ£)××+“Ú-{ÏÍS7:øow<‡iͳ‡™s‚vœ‡–&4ÐОOploâ‚)Õ' Ó:¥5À R ’ž.AX 5 'êé}È7 ’‚(h -NkÂûîKpí˜qµ±¢mýb0ÕŠ[@&Z$¦Ïu×}—S¤ïµ:â¯Ú*¹ËòšìJ×2V‚åÇüfÙA„qÚuøíçN=ïŠecÁUzöd÷®c(ò ÚËŸ8Û󜫤ǿâÀÅâÀÅJùWŽýc¦îŽé´Æ†c.OvOeò|,e|˜Pƒó;_¼7z±¢E›±EÕ°Ýϰ“A—6U⯣ÅR9Ë]Ì­/`šÉ=dÀ ûügv½° XÆ¿zþ7ÚwÅ›ß!RáѶõŠéMMÙýï»aCæ`ÊÅJyXN+&”õ Ç®Sˆñ´±2Ò°i­}¸PyN–Ö?~Iá{ö"á=Z]0Q‰è>î‰éËÙ½”v›£QÔÝb©œ [#ÑV*) ªCƒy ñëmüç÷tX`EÀ[pïœ'h;Æ+håkjE¸cx©ÝÄ÷é=h<È2ÆÀ9­8”°afº ZX´±¦0z–ÞÊÝÒÀÇ‚‘€”öºX¥Pá—HðÏ^Ö°ûh´í´dRi˜ö[Á$Ö«EXõ[u§eÕ`IÙÓ¢qZO„UÈ$Ž­¼8&Q¡•çKâ¤dîÛíÿòùS$ÖK2ðu Ç@;t4c¿©ÐÔ -ÅHˆðDû<¾{çƒKÏ¿rN3û˜áB pM™%8œæË…*Ô*Dð”iyÒtP™¿gñÙË_{/®‘¢mñà<ÌÕŠÕèW£÷Ê[mB„BZOÚeƒ»dŸb{xìqæLŽà·ž;Á.ûã¶·ÏÁj;eÉCÀ+î7d…Ö9ØÄfϽ>VI‹ûçÓ^³‘¡Â >м>–òY…ÆüÜUà¾VtaE«á*8ò¨–²ëþ†pÉ%v»}\¦.Ý2aÞË=4ÉNdí»ê°ÂϽÌ7.z¯CœÃúÎ)û A—7G­}Òk•ж»Æëa55`4ÐeÁí|¦q ­ œµp!DÈÎÁi<}Ä ¥B˜°¤‹E)HšÒ*3‰B PAH¥!JÀ:„ 5£a_~0Áÿò2Åc´­3†€!P¥þ¶vÙàÝËTßÈJËUDYÖV]Œm«K&ú,¥KÌÿ¤F¤²õ©µ‡Œ8Ç vïZüë—ΰ÷îlk£g–Œ‹Åâ½XÍ@v:¹àå(¸X›0 Ïóž¿T«pÉG-ÄÆ-«“y‹d÷‚K÷Þ?| ñÉ»"á=Ú6ŽâÕ}j}µù6ˆ˜¾€ëÌêQ¡ZbPJªþk*+©¸—»FY~¡œõÆÒËŒs"øÏã¸ë=W¼Å½ •lèXîÕ'Ô£§bð|g'Ô%d¯ì>D|Ô' ·‘`IÆu¨J)T˜Ö*¤´VaY¿tpÞÄPa´í2[è;¹k3VmjØo±1E™ØÕ±½Vo†l:)Ru{ Gß™÷¶äÔÚÙá/^?ÁÓ7$A­}Ûû³à,ì†ihïÅR„.ï\ÀÇZ×áLà]%¬ ¬u å È©ƒ´ć.@”%db®SãÀPa*@JB…¢ D Œfì7_¼×âwÞŒ“r´-ž¥(Ó°Ææíz? ã¼XCWV}JåŒñƦÒ&¹"\•y²! 2ãíãðò œÔ#ÎÒµ,0¡>¡!àm·‡÷º:x¯zÚX. ÏŸ ¬4L8¨tÎÄ Èa°| \¨J¡Â½¬ð±sÑ‹-Ú¦xz–GL_üßK¤ê'´×Ù‰UŸ!3 ¦×hì.¹Ð!³dïʱ߬Cb~óÚ1ÎBVרõ§Â£]çÕ¦šJ¡¡ à‰î¬s!TØ+… ëÍk•C…Ó† SïÏeaBïÅ"E EPZAiÒ ÚøâÐ_~@ÐT‘î-ÚÚª ûM¸ÅF·`É ×ÂÁ8_,p›ÖPKò“7Š5Ë…œËzW"Œ¯½~‚—îØ­ç]U¬ÀÅr '¾6aSy²ûµä":I¯\ŽË•Íé“mpÞƒ•z´ªÊÉXµúŸ¯íË›RÞ›¥ƒº» êîZܽ«ñ¹{¢+Ú– æKŸ" šçÜ´)’G˲Úp°˜97­ÑšuòùJ,ÅÔf;‡WüÑËg°Î‡¹†­Þ: pV—°¡M@G×:ûøD£m´Ù„ì @Í{°˜¤)Y¥ÿ&2"]î!T()/¡´†b†6=}³O_|ûãÍv,mÃûjª='ýIHó]ƒ/py¿;ŸëÑI:ÏJô¦ÇZ„È{¯dÑkš¹®]úŠ7sOB œsè8Æ?æ(+âÌ5mûœ ]ŠFÈ(TŠðdrŽ-¬³°Ü :—¾f½œC(ŽÍa+ÇýÆÎ,.İPaN¾ÒZ…Ú 6´Æ¯>$P_E‹†­ø\§ù³·ÊϽ'ólXÛ† ^Ê77UëŸû'wv Ü+B]ÿæå¼qdap5^Y|úwÇ ’@vojOvwñvÇxÎUbýc :ë .haN[AÝ}Òû0U©ò4²”ê… µ6Y¸ð៹C…Ѷ õþ ×ÁŠÄô•Ü¥l1)CATÁYƒiÈlY_¤©ÛåšxnO²nƒM>tÄ%VP=æPÐY‚›äÅÛ]üé›®XjOJl´.A”úŠÞ¸Þ §´V_Ñ{Õç[WɆr1ç$ä/™ñ/áÝSs}yW•ƒ7 :VÐÕ‚–Vh*‚!BÇžêà'›gЮ':ʖᔃY„B QžÌ&¶ž›Éƒ¡I½Xƒš[ØWÊËÊ—„P¡´Ö€XLhŒ¼Äøá›OFªe´ ²3z£,®z݆ |.PM;Ŧ[+€åï7ç­ëw>ËzI>4t®„{™ƒŽ9›ÔŸ½eñïßé ¢÷ªdN€Ä1:ŽÐP¾øsC]žL.àG“#m²Z„ÊZ¯9å”s^ì3†R…ÜÔ„‹¥i”C…Ь41”(ÍÐÌø'1ž{NpËFÛ¸{AÐ*†ýfT£Æ§t—uã\•­ÞJîR  ò\§õíR©wÅìKáœt-~ûÅ6œôTv£•AV¯>¡‚Ï(4Ü–^ï¶2±Ñžè(Ãr¯4çÔñó÷ôù؃ÑŠînààP¡ *ï:lFܵcðïw?ÚfÚY”axtj²~¶£Üð°ßœ&X”k:©mî—©,Þ¹†+:¬+É,'^D4_¤ø÷^éàƒg:2ѪǗ„]ç¯g3€&žHÎû’9)÷*ÇÁfp^Ù}Xñç ¬?Uè’•UÞSÙÊg¦\,c ŒÏ*üÔ=ìÅû­fÈ,ªÁ€jˆ§¬U§š{.ßü*îU>ƒemŽ;LÞ’ fåp˜}tJ)L¨áY{]ÇTÙœ&V¯æ#3à g‰™ØhŽœ;ëØ+ÃH½(D&> „¡B•ÓÈúñ»5>rïy´ÍÄ ÂÊ X–¬ Tmˆ•êwêäðÏžu°iïÑÖ‡ rḀjû|Õ ¯uHŪK!˜ÐÊ0¸Tcòuï’’ªƒ\À7NöðF·…hók(Ž=áÐ9²ûÓö"lJtÏg:†³ƒ.Õ$c)ÔŠ”\)I¶i-X9 Eø®½7ëž½~ájWÑÖ—ä*V,®2ábÕ–†ý†~k†S%¢­D[µ!b(©eÍ×H.È28Çx¯«ñ×'6q=·ÖÆ"Hò/ÞÜPE„wx×mÃ{°¸WŸ0Í,X£0'ÙŸ8¦šl†låýf„÷œ6…R::§‘õó÷6pu'Þ÷hëØ'{=ªY•ÌoRH(¬íUÛ,ÂBÉ‘\*¡ á–uZ1e‚–äðç{ÐÍrǢͳ]$tC+¥­<þ©îy\mÜ„v¦WŸÐZh­½WQ¹ð¨@ÌPJe«o mj‘Y©öOYÛHr¡E Dƒµø:…4›_yØá7^p±%E[ËO·ðªÖFëàÈ‚.I̬À‹g——fèÃïÄ”— °Ø9|‹¯âº‹n‡…]g'HHÐPMC„„çìyü”»m=ÿÊ& ´ÖpVÃ* ¥Ê9ï1"fö@]à\mšçðØ—«C§àA^YJ3””a|ø\ÿà’Ãß݈÷>Z-ð@@•,~×ewL¹©›F£Š½vð'ÖOh”qwð˜‹EåÝ:, lX)EÐ pPx¦³ç¬×Âʲ ='.åÆ s&BZÐR+…ð±å³ %Í,LåHÉ¿TºA‡Íƒ_z¨‰óxï£EŒU@‡ œ]9`×’ߊT›zû´j"d–œh^T´ðw9‹pÎ!aÁ×Õ#p‰É‹6ŸQ(ÐJ ÈÞsoß¾y†ïœÅ6mÕ}Ð÷™²8ôö¹Fd#w½‘¥Š–hªæ½·ÿ©¬7+ÚrEàØ?ª Ù@<ã.Á÷¬tbs ËyÏ•K‹@WƒÊŒÙ…ìW¦§˜UˆUH¤àÒÙfŒÁW>ÔDôcE[µ¹ VöZäQ-}׃v¾¡U!#Àš—ѯ–ThyD\-?pX$aP×ì~( ¼ž´`Í$òr .¨º§›ˆøPaðb *›3òx¦ ‚¨ðnáýÑs üÔ•±¢­ du=%ª%ª1áSŽ'×çm¬1Ó½.2 "¢²DÒR±Ïc•'ÂG”U{c$– @™ÜÂSö.<âÞõÞ+k¡ŒñÚ@_›•ƒh V •ébù™/´¾ÙÂB…’ %h3´Ø0>ÿP OÜnãN7v‚h+ê{©peÁË» íqSC~Óý@&ÑYqبw` Ú:ŠŒF[í ïDàB¥”ìþ&ŸÃ¡¥^èÄÂe!B¿õŠCÀ•+þ\ZÌ´hG¦! «¡¡B• îƒ_yÐÄ-ÚÄ=r»_³c/gâ,úV=@Ußk}ÿeEKA–Ï( aBå[ÇÓÉ…ÀµòáAWzU÷tKÕÝÓú„iÈcP¸pïjòÌŠP!C…J÷B…Æh|üî&>~1† £mŸ#h­QÏ xT³î²Ÿnëš-ê†4¼{Êàþ[Ö½*„#ÈŠæ½X ûКB žuñöLÃ{«”µÐÚ‡ •óž+ÒÄ$’m©]e$tL]Ÿp¶yËK6øÂÐáø´*3þɇšxþè í(òmÉæD°>’l›œé·$¸C?[ °ÆëÅK%q®Kb{‰–¶œ(MÐð\¬S1xÉí⣶ +™£ EV;UЊ=‹8„ä¬z’ yáÑ…ù2:Öâ«*R(´Òö—[ |þ¾ÿ÷›66„hËíw™·7ªuUƒÖxGÕuÛÈjåû[/(‚ªhÆ"°"`”"¨šz-¹+p­¬¦… ³Ð=áQNÃ…¹Pa¾ N.ì[Œ±2D !Âôy*@J:/@úS÷îàáýX3ZÖâõãQÍúÓEV/™lc“>çdfË{KnrÄþ  U ¦‹D¬­ØN–F{¹"àmÙÇ «qU{î•Êî*x´;(§ ”)§_t™C¨ÐK'L?6Ê”Ÿ+Thš_y¤…ÿñ™öâêÃE‹V^Ô ‚žïdÃ~s9}tuYõñ`Iù\¥Ô.S6_ša‹¶a¾ˆç…ˆça¥Q½§“‹Yáç´t¦eØI&<*i&a>£0–X3>z©…O\Jðí›r´÷µQã¯lð@µQ.‚’‚+Iÿ–Âb±ns¡©i¯ísó”C$£ÔÜ'ɨ_„´Ñ¦7ÔM÷²qPvWDÐD`>]¼k¸_[8gz¬pY E ¤l`È9‘×ú es$]ÒyS^º!ÛiNåÔÝJ3 ¾ø¡]<{ç§.®¢-p¨–*µÀ°YTSÍgÒ÷(}ã½ ˜»ˆhk‘­ç`ݾ}›ŽŽŽ À^Õͬâ>©ÓbÓT«†9nßé±\[ृӕZ&Ùp±W&Ç&pÎÂÚ¤ îî‰îaÉ$Erû8d÷±&¨‰ß}¨”ª&¼ó; ü×5#ˆ¶p€UZöÎóDÕDsMÿØKÙ ,$ùõYn@•ʱ•“ÎVS‡·Ñƒ%ðÎ;ïP£Ñ cü) )öVÁ`5ìVòÍÂ˜ÙælŠmv <ÑÝAç"Ï/ò|’߇rÚéÉ=È5è@nWRÍÅ’t *d²èû€P¡äB…€—nP(ÇøÉ«-|óý/ÇPa´ÅÏ[C)ò¨¦òP5ßIOõ¼V9÷Õnmã…Ý*€õõ¯Î;G—/_&cŒ4á“ÿ®ÎyªEîkÝ@Û¶‡F%dj„€g“óø„> ÀʱsÚy],R.„ ƒ²;¼º»‚WwW K!t·Œa½*ô ¿ÀT¤|ËJÞµ—›øò£;øõ§Oac¤0ÚZ/¹# š7 J¿GT}%dÈšzªÜÀ›°ë«_ý*}ìc£+W®TL‚ãåœôâÃ9Á,ÞЖZ›TÌ´­“—mÞ×|À–òô\È$ò$Ïçù">înC[§¬²ÐÊÀ™4›Ðµ/þ¬‚׊™= ¡Â¹×$”ñÞêÕEÌŒJÔá]1CÁ}MüÜ} þŸ·“8‘G[Èb1-ŒžÚH¬¨ ¨ªOª­É…óƒä|@Ö4àk¥7mÓ}õ«_í»¸ÖZ1ÆP ®¬)Ü…²Q/»K }Ÿ_ÎYnŸ'hm@Íví\(jéHpKšx;ÙÁÃÚ± Zö… •6(î œ‘Ww'Rà ‹@! g`}BYÜHRåÅJC…*„ Ey%!Tøóîâñ› ®·£+ÚüáLª7°G@µt@Uõ à7‘RÆ¢qÖÄ£üÂcIîñ‘ïܹCGGG4ðªæÈí4¤ñCß$rù¼Iò“ž -àß*®]ö³!P «k|Ž=Ù=«OèÒÚ„9•wf°Kkö”Ýýc/ Y ¢c~b£}“Y8Áì±p¢Aù¬Bò ï-cð+ìF‘Ûhs7WU—)Ó'ÛG½£¾W•” —2ž«€Ö°Kílw•ºÙ ÿ­MX•á×~íײÛùþûï ¼õÖ[týúuºyófþó­Q^ )ý˜ä´¯`nÅÝ‘ 2æ6h?3gÁÉj¶UŸ Ím›äw™ÎyrzZú5>K…’9iAè4˰¬ìÎÌàPŸ0¸^§ÖÁzȃ²‡f†PaZ :¨»§E¡¿ûb ?qwcem/nÛ½ ÷¶ùÉ" šP•ÇêLN# ,B/©,O¦™AÐ"ÑÜ÷¿ !±Oô™gž!•\,·ò»ÊÝú,n„Ü{ïWH7ä }´†eÁü›Þʉ+ Ž«C%™8-…§ºVϸ‹øqwαWu·¬=á]i íœÒ>d(9®IIx4 “,3\8v¨PiˆhÇø¥‡wqí–ÅQd¼G›3ôYÀ(¹±¶”_Ňi¸ËæMɽž›WËcfjÜó`MUíkÁ7™fÝߺ¬‰¦Ök×® Dœ·o߯ÞÞ±\"UN}¯Jâ…DÕF+ˆó ójÐÊïÆzƒ¶Yo— H|ð¸ˆ@$Ùàò‚œÇ'ø&;a_6ÇY(Êè8Òš5œc€&O&GØW&´µt ^!ÝRXìHZ |ááþÕ+íˆ ¢Ímœ‘9›ÛÍ£Z6 ªú}ÊE0XŠNˆ»3ë,3qA•y¯9§ÙϺ,š×goܸAÖZjµZÃUÅ*É‹¥Q/ìð5U4ƪx3M¡¥5ÙE¢¹Ëm² ¸ ÐFCNJPвD‰cnâµdÑ]Xå ÷4±BÈP9†µ R^Ë)†pªï%ÒßW²a¢QEÆür.fBym, ‘?vÏ.¾ù~‚ç]DÑVË" Z$ ªFY… B‘A^ )=›yè•÷1‹çläw×`Í X½ûvwwÅZ+­V '''4èL©hQ©Q©qÑHvœy@ê¹€6š/h[¶—Mæìä‘iÖK”É„fl‡çø.<Êo÷¼WlÀ΂s¥t”v`ç3 3@ª*ÌI6È8aÞÓQÙ‹•[–V… 3~å»öð?“E5þ¨¦TÕs å+ÿVÿŽÑU.D8íxÑ›¬#À¢y}þý÷ß§·ß~›àÒ¥KÙ뇇‡$"´¿¿ß_ïH¤Qµ§¥@ì£t‚ÖB 蜳‚¶ulKm4î1Ÿ €À‡0ð¶ìãÐj\Ò.Ë"tŽ¡ÙešÖ1H{’;…:<™ð( „0RxtaSL%È KU¥2m,*¼²ßÄ?¼¿…¯½Õ™Û­ˆ¬®hP­ *ލ—L˜y¬J£SŸú´Y‡9/Vñ$CQèÀÇÒJZÐ0Œ¯<ºß¸vžãjkÑPaÑQÕp@UÞ¾dŽäÈî ´Ô– ì{Ng¯Ñ$`jÏÕ¸ÞªI€Vd-`-Ü[€ŽŽŽ Ò ‡‡‡d­¥ÀÙÙÉt8*ãÂ?Hù†TV4f‡š×…›PÌ Úh¾ ­?ûn¾ƒØ2ÑP&9ˆEE; ÁËvß«O!¾>¡Ëy±´\ŠChb p±(èbå3`{ k¹óå@V^¶Ò‚ÐH ï>TøÈÅ>yµƒ¿½ÞmµE ¡úÆ<¬Ä–„¯6äBo# ªúÜ ~{¹s¤S*£Hz§Ñ)…ó`ØŒúÜ(`6 íùZÀZ °Êÿq||LðÚk¯á‘G‘½½=:99!táÂ…÷Œ*=ÙsÊÿb5KÆl°3…¤hþ7eY mÞ€mƒï$€­’«vÀ¡ž%ù(X€gÝ|·;!B g-œöÅŸ;;°u`R¾°2 „^¸ÀJ¼÷t ’ 2Î5Ï ’òt,ˆq¦B¤Jãóïá©[ ît¥z‰7V;Až?;sßXæ¤Øl–Ö\·ëXo@EÏ#ïÅ*y®ÂVlšÀë4/@5Éû2 К7ÀZhpPh·ÛÙk'''t||L»»»dŒ‘ýý}œœœTÞ‘l® ~'–äÀeTðhU5ÔÑY„³y–ª' YÈ@1ÍMÜ/ùûUÙÈ’K=Ua„yŸöqƒ¸âØ“ÜUPw·>‹P)E.RvÌž@.=ñQªòbÍ2Áõ€ÉÀ.y6k¾Ü"(Q¹P!°Û4øÒ#{ø­N†wê%Æ iІè[¡+ªµTåù/­Û›ÒoR3.Vß•fº>€%‚)ŒÐÆT“‚©‘ù7óX‹V#_;;;#888Èþn6›´³³CçÎë› Pá­*ÌRJKÁU°¢' šq€Ÿ7h['À¶Î^¶<ÎÈ|O?r„OàYw—õ¾TŽvÐ΂لZ„N|F!‡p¡0C‚d‰xR™¦ô|§¨±C…(6øøÝ;øþ÷:xæ¶ËÄ5Ý$- kˈ-\É %£– ¨”õTU¿1 P•_ˤإ8¿ŠT÷CÏ{•°,¡¹6¬9ÌËE¾> L YfIã¨ÏÒ¯÷îN§“½Ön·éôô”Ðn·©ÝnS£Ñ ˆ¨a+þ|¶Œ —z ÐSí½OÁ«PœT—á”Y¾+‹ýÝ…ÎB+mõ¸ÜNÓ„2×ø+|?áÞ‡Ò=’»v9uwͰÎ!AÝ@KšÁœ‘ÎiEáBÉušªP¡@‘†V (ƒ_~t/ýýtœ=€2xpÏMhyMNabhr¹‹½¨¨Êߥ’‡Â‚2£×PµLžkZp%z©&[£^ ²¦XËV£þF ²Î;‡v»MgggÔjµÐét¼‹è`Ø/ÑïP/S¢¨‡E4Ú¹­¬g° $‹m˜ÁËF‹˜­s¹îùžU ¿§éªÁë¤XRxўǘc°µpZ÷8YÎB9 RÊ)8¥@!äÆì|­e1SzvfRt¯XE/V!«0ÔU$¥A¸¸ÛÀçÚÁ¿v6Vwâ:OÁËšäÚNÚw£GlrcéQ8" Z@UõAJGÉwÉÊæ j×%Ö4àjÜ×ç ªh\eÔo§Vcy«ª>c­¥wÞyG._¾¬R Õét¨Óé1†NNN°_º Yh£¦ž«ìò¤!À*mx“®¶uæ±×f†F•ë)òóRDT|ŸDð]@›ß‡æ :j kï¹r¤5”8;4XC”d5 ÓGE½Á@²û‚¼RqQ†… ¡J¼Â;Øà>ÀS7-nv¸ßû[á žDeؤ5êrˆÈxû§ Âßケ =Q‹b‹æˆÍ³RT«TåÏeóUmȨ4¹d0É{ßgÎ8X³”­"ºO ®F…iÏVöšY¸Z°¢\1s*¼}û6©““eŒQÙ5‚})Ó1 ¡B¦äžFsG6´ÌÚ–ÏçZ.`+Ÿc^+SaÒ–¼—†"À î<~HB{Ewe²:…Êy,"¥$>£‚iZšRLC ½ÏÀ*B…D"ŸÙj4ð¥G÷ð÷È»gæÝ÷­öÞÐ €¤8f2“ÙpdZ¨ed6zÓ“ô7èÏÙ˜‰$’3ÂŒÈáh8”†‡$H‚ »Ñ@½U/赺–[U·îÍÌ÷£‡XÒÃÓÝÃ#2òÞ[UmÕ7—ˆÈÈÈ_|çœï¸ 5ËÀXÑ9BÄ<Ár ëY*b^ 0ó;Fs_7KÍ` P3P©ëHÇ·¬VéÕPFF^Ã%Ӹʕ-È †c’{U¸:W°JÿK“Ý…ìøøóóóüÁƒ±Ñ¨º—‡Û¹69)\å"‰J“JF \%’Y˜FMÒõWëþýû¬Õjñùùù,ùô½FHJÞ•Qê—=R½DšZ¤6€ÎÖ[àï²Ä{2;\W–·&nUÜ•YÙ²ù ­î|6›2‘]0´‹?eÖý4l>¦.ˆ[Xâ2ˆXÆ[àiÂH€ó$—‚bwwÆW2ŠÓ}¡ VµÊ±ÓsU…RÙ£Œ'¹XÎþÑÖ~|§÷Šüï³Cñ‡™ÿ1T¤0•2V¼ï0V“26Ž*枬K#‹ÏÁLšñ¸Í²–ŒÛ®ü¹¨& T–çªê,ežB(W]h\¥+‰\?@õËyY¨‚\ù•+ >WEXGÀ±+=ÀŠÛ~S)%—R¦Uƒ,Š".¥dÇÇÇljjŠçrܵ]­Vª×J»·ÇhÎÇHHYÃQfþ{–Ó8½Ï ÚÎ ØH;†ÇÐðVª²aÙ² YÞ‹ø•àR H’"‚ H‘„ ¥$KT,Æ$dÚ:½ $*üZÌ;¯;ŸEZ¨i¨0ˆC…ÿìJÿÛOŽb3Vñf+.±‹E›îSÔ0 ;/óQºU1ÆŠ×Rb–РÞ")ÛLu2ù\ΙSýk€j‚@eÛž¬R¢<¤Üd6R„ævÀ&eȺÓËŠ U¤`å‡9X.ó…/WÎVQÁß5·ž²>XUªŒR¥ƒ“ ª˜¾ãÙ—Rò““655$•…Œ‚ Ù‹P¥„D¬b&“ËR¦Î¿Ø˜=ÿŠA©¢mCÅRµrÒ­0MÉ"%÷€e9©]±KÌBãüô·å.ËO …EÄHˆ$K¤*V$ €óØ‹ç`Qb¹WN€kM®Ê„™¯Ze,NDiëõz˜žžFüô4âú]‘ WiåƒL F‡‰æ4Џz¾––dL4~¨­Êâg-‚ÕóoÂwÐf*PòaÂTe! C‚H’tSÈb ¸6Žd Ë2öÃb2¶hà­Ä#+HzÊV¦bY,Ê~‘1v4U˜‡¥îî@æ«WWæñ+ë=¼r»?<Ñ•n ÌWÆð}…ïá<¦KB”Õ d“€±q”Ŗ&fàb©2©Õ…¤+¶*ãù0­gK¥¨ÆÝnfùÌ¡E”¼«´{ò ­VäÊÁ2³¨]êëÜ¢„é»EÂÏ–Á¥j•n•spU) h«Üó¤%“Rò$LÈc¼wzÊu¿«áÀ‰‘<,µ…%¿‚Ú,).”g^ƒ3\ü‹Ôª“ìåZª–Õ÷™Un!W'´iöô¸ÒA ‰,>L€O+·ä"þº IRÆ%„ãQÜFGÆ9YBð$Q< &É㤃¾¿eÃDfèUˆ4 ÎŸã¸~ó ƒ·ŽBGÒõËU²ñŽÃ²>VEpReNè"ro>«çL"ÇøT7Œ1úó–&êLI7§,ŒÄ0yrs˜á2oq¤= 2+BOPÙŽ´a²„ Ê®IšC„6p J–4’´À”EܲД+ç¥ÒÇh´îj@ß0`úœÞc¶yONNØÌÌ '"ND\Dá ÈqL0„jxráK !².îC5‹äl©ëÓ+õ»´Ñ¦ÜhY…êB‹’¤?ޱª ªCÛÈ]<˃rêK­Ln'Âl _wÀ¹ñ’B‚‚8TÈxìð'¼KpçdqÆA2D§3ÿ¥üÄÂ|¨0õ5Êz•q‡ Ù)üæAtó{bfSRý¢P¥/´¯¡m™Ê= %ÓXV鬀 ™/(U1uݪ¯[C/h–·,óÂʯWW±lùh PÕT£jñ°[åˆr~v£€ 8é`DJ#ŽXkÁÜ<š+ïAVTùæh•Nr®ÆQ«ô¿ú¼™‚EDA¯×cBˆ€sÎ…ˆxšg¥ŸýYR{êטþ éB¹°\h0WŽÈ”`ù»3Su‘ïÙØ€*@tìëS·ÎÞX5÷» ßì™å”Ða.V<°²’%" ð>µqMž$jU¢`%ý ¥Lr±’„wÁâdwPœƒ•5ÆÐ²¡¬ñ(MÀ¿8¡ì.7q¹çE÷2`V©0£@Òf–ma–ýJ% t~0¦6ÑÎKùÎ#•Ý”Þó\JÕ¢«º ³§h4@eÛîñ÷K®«6¢2 t7,Q (S:Id‘ºL÷4À— ¨ô×?ÓÑÂKJ'÷qB®+nxn jÊ– b¼×ëaff& ¢ -> ØLgv6ç攨X@¢`1@¤¤‰MƒR–7вA–*sÄÆ:`Ë´Š´ ß ïã„_ãæsU·Ñ|e[’+oætL œå!+=„Þ¡e\•AR@Š¼ÕŠáI&­tx%¼S@ÃOr±Ò8ópù–ªþ6¹Paª®°a¨$ç’üÓË]üó×ïAr{LwâjÛªq.$*u«^ÅŠ3gÂzIåʺ„e[ȈQEàe1R¡‹©ÕÜ©Á3 ïS¹2Ø'=¦DrÍU- :[ 2ž{Ð*ðìIÜMö$…"$#‹ç*|©Œ`ºÌJø‡ˆj–oaU¸bðË»âj•¾>]Éâêã~¿Ï¦§§ƒÁ`Àˆˆlff„‡Èʘ)1ÊVÃéEt¹ËYè)×ÖFyÀÏ~ãøñ;´„5ñE T<îE˜þ2A’Ÿ%bµ‡ 0ÎããŠ8)·þ¨ÞŸpâÍ¡ÓbÆò¡Âd\äà?Ûíàõ;=|~*¬>túøÆÔdgFÎóªÌ>ðÉ©*cbRŠÎë¼qåX•2æ€A#|e!Ã-Is^YN 8XêW;<®‡jÔÕY•Ç Nž#)É`ÁK¶çz8‘4¨‚R©‚e ºT)ÐrVÙk¤o‚:,¯Ù+\qƒŠ5\ƒÁ€OOOó´ƒôûi²N–2¥*YÚ±Òž ð?}å_÷qûQ·O¸óh€^$â²xµn4âä­Â‘iQswLtÏ`uñœ|’2þG2KrgAÜZ2 ÉãЂI@ÈÌòÄoÜ*ÖDlÜ™Ù9—÷4TH,Váç`çñk}üð‹žÜçP¡¯#yÙСJåh~Ê+<$Í1òVçFÔ+ËT `éû”tÐ&î(V8,9~)3e<=†F·‚n*ªzQ5@Uü½b„Ù…Ž õ2&¦LiÐÄ•¿ ”ÃQ…/©ðƒ Pò>)ì Î£JæÒSŲÜâÙ¿^Ës¸,Z65ËR6àb¸b†Ç Ã0˜ššâaòV«Å)‘§Fœ­â2"$^ii)yÚP—˜›p8½€ƒÅùøàI”"Âq?ÂíÓ>¾xâNo€»§!n?àN/D(©º Ü±TA©Š‘“ôkªW8Ò,3• ¡ø@–m½¾U¸l VªmŽ¥Py3ÐÊ•¦'÷݉Czþ.­àùLŠÌxT Jò°$‰_VÜš8dl<šU2³W[ݰ4V»5z®† )UýŒsü——ñÆQ'á0Ͷ ùöfŸ¬qÔW_,Ó¾'¿Ë (ÅÛY%ùÞG¥ªvn±ÑõÙñ¯úÃAñ’ËœÂÁ”Сû{4@uv}™á b^UÝR„SFÒtÅÊ”/Å•Ë S–QJ…3æQ™Ä·ß Pé˵*‚”ú˜—„+›rÅ\Ðd.+h)9XBB-AOnÿU­šg}&âƒô¦ñ¹œÅ6 @’@BBp NIhI hIHI`Iˆ0HC„‰eé– ˜ŒŠUeY½ª0ËÅIC@iÈ3à˜C€ÿö ?zç¡r\[¥µáÑdº¿øƒÆ8®¨Ä1Läh>pFTjÛì­ÝÇ+l˜O¢aY•4tž…ÓÞô·b™’•ô '6L´aª"FfÅÿ1*ãMð9•>u§f³ Ј=é!›¼¥‰h ÀŒTú_¸Ôf¥¯t15\à\ fÛ{sÇÑÃ'„RTÙæW¾¨ª¶°,±=þÊ<Ë÷£,Ÿï}tñîgÒ±".¨Iãh™]®ÒDw(y(g3Œ¸U?Z¡ars†üJºü2øõí6~r»‡ÏN#sÎO‘…+°8Wµ (`Í >%`Ê_}*iE ¦óP…*´Tã]ý©ei¡ƒÕInl6Æ0j€jL J_™ìwV°×^Áç#¿73„ˆQn\wƒ2 œ(0¥†C¬TÕj lbh€)²pI£ÐZFÎ*U„&ÕŠ;Þ·9±³ˆrA“ªpEª–QËvÑUÓb UJMöd”FFÊ·Q¥´i©ÄËÁMX×χ d’Nulx‡ØâS6:sxF I†Bâîiˆ»§±µÄÝ^œ÷uï4ƒÈ+w†ÐS+‰\ªÐO2%œiÈ É¿®Íïq!ðºPšÌE‰Üë®ëE#¨DѤQ“Ì´€b‰ß=¥>•ó8 pØ<½¯“’'¹%¹L ¨Éä@KzV {ŽÛ›Ñ[ÅRaP½ûM•}7´æ¡…þéåE|í;I€Çîéc ð«G¯«aª/XSE*/³˜÷oákÁâóýÈGI+HÀÏûÂÑhLªX¥Š% »UBU½H½Ð°a5nN µm{TU–kMá°»ŠÝ…%¥:Z^Ó 9Žu,í7Z€)$£9mªÔS @ H ”×UÐG4ÞöUÏä¶³å1Δ>L`…õJ+ŸðŸé=}Ù!|qØv ßC ™~9ÒäP–£66bÔ²¾Gï¼YRù¥hG¹ƒšÏ‚fó ¨$dPÓªHJFªgØœja³3›Û>"B(%¸Û‹ó½âܯwz…bä.ÝbTr`Ö$}CÒ½:?s Žœ/fPÃLwáúÀW”ë…‚³8re4li©À}*¡g·bÉÅçÑÁ!»7ôub”¶KnœRmEIa…Ò`$ËÄqt·) ±bŲý3Ì¿áqø“ØîÎâ×7æñýÏO Á-oˆÈra'ýâP›²Y”;ÅÊ/Vg»§±* =ÞÍUÊJE­’ä.%7Á³‹9cÃ1“+¿GÒnƒ´Ïl€j¬e»Ós8l¯b}¾m¨¸4øÉYô ‘›of6•"ZÐS *U¬B-RM¡ ;èÎí笢`é dú­t_+ÀlÅàrdüÆ.u+}àÝîÒ|±D®&­+orMÞ6 :p©oäZw¨–ÖFÌœï”OîìËX^ûdª $ßk’Šš–R"0Íl/Na»;—P‰ÐDœçÕ q¯Åê×Il5q x‘E)0Z9è2Í;–‡#Ë.³Àa4LYÔŠ¨Øó+W 1,’`ªz¥æ Å[ñ¹œÃ1cÑ—IžInWÔÍ3Nª)`Ã¥]uvØ¥Ý<éµÄðûüü^C™Uð9ªp¥ƒ«³æ”ù· ØÎÖ|@i@–wÏÈWÔf ´avQIð$ôÍ9â^p 2-{Ñ€*VgpÐ]ÁÊlÛï#Ço¯¤;ŸürÀ<â<«ô_Ú>§¯Ì™&» „E®xÛT¯ ßªg8ñ‚±"_,ÀíeʽbNå* J”Ù{¹/$Í ©[ -êG­5;U¢Ø(xåN\¥zX¾R¼É5!N—å#šî´¾`j"ÚÌt€©)ìt1tQNþž"ÜéE1x p·«_w{!ziÍaÍÉ÷6èR2; t¹€k™Å}ÚáùU¤A«^=Œ©mC”õ‘b €wÂüÚL/þ,>Ô‡n ,ã(9Œ aÔ×ú|£KÁ‚TðZÖ«Å!Âø.˜À9afj ÿÍá"þàí{90ÎZ¦øŒ­ÌîòÎÆÜUÏ]#lhc6¾® HݧÏdÑ smqâ̼¾Ä9gÙñn_©*¯e€Íù.º«è¤^Vð÷d–tCFÅÖÃcEÎ öÁj)ªÕ ¹òN)jU`a‡2G:Mhȳ~NËãe%Îcæ€,ŸxnØy¦ªD}=^µnhIQ XÀ¨RÅ`¬ìvï]6ªE’e!n{1ûÝ`NØbÖæL ?±¼ƒ²zùQíø&q˜F”¤æªC7>› °7=½.´lÂI(q§7ˆC§îœ p·W;ö#ÊdCW•—9¯‹<çC®}CnP2”rÛ›p3sI²®T9.:j—tù3‚¡Ìí­p¿ÊàISç´»@üϤ“]eaQ «g €¦¡BJrÏb¸Š]ëÓ~V7Vçñì'xó¨—ËÅ"®† sgŠYSœ§™OÒ‘—ÚD•—­ÚÕ j·Ìbe|¿ ÅÙ# z>v¨¨¶Úæiå”GhÕj&º7@åÞÞ€3l/,á ½ŒÙÖ´ýp7u-`nQb$»¼0 +S«R•JDégjö\†¨&á½´ª„Ë<¶©Z®FÐ.ÌÎï°¨]-¢Uu2†€ J‡¾‹ÉCÒ—Ž6–<€ŠYFYkš†Š—š£BHJ¥3¥G Ü(~5ºU¯êÌI÷Jhm~š0?=…ý ¾(ûÌãÀÝÓ!|Ý p÷$VÃ"™OН1B‘ж[W¹FÔ2Ÿü¯ZHFWX€dx?œÃ) àA[2°Ô“åt>f;N¨Ú¨qæúºêòž]¡S}ƒ'•dñõ¿¾¼„÷^¿…PP®–àa˜«^´-75å3Vy?V…¶*aº€|ßsÑ|RâЪdhæ½ „%Êe–‘,ÏXÜ8}j~2d@å«~ž'P¥ÓT`¯½„ýÎ2¦x«ð`×È™ÔIû\:˜œÛU ½Ž.zË’`EcÎëœZOm  ÀŠYÞÓ!™;À-…« S°¤¿‚ås2ÝU•¼X.`ø5it‡¨¡Dã: à• $zµ ®/SDبê5l€­˜©ªŸ—©a£§| +™™i.’V!IxЋp§Æ^_IµãQb5!I(^Z¢5i:È Ð•)Wù_¾ê‡ê>MÐ Ôòôáë??™ÂsðÄ¥œÇM‘“ôxhÕ¡~—@cTNZ “ f€DÊ¥–‰7( tg§ðOö:ø³÷ï+Þs¬ ˜®˜ÿO8†âS Új¶‚ )Ýüf»Œ‘:B„jÎ)UBª"Ìçj±ìüc¹ù Cr×STé4ךÂ~g; ‹¯ TV€.8VÒêiKƒpÕ@4ý—&¹”çê_Õ#KZ-é€%2ü“†»ÂÓrR€å<.J@pÑ—3[ Vi’{ ¥ êüRT ‰»v}áàåòœa£¸nTÔTpõù#2§šTò¼rwé¦7zÓiÍÏK=阚hφ0–À×âÇâÜ4°Lš5pÔp/ ;Þ9“îïôBÜïGÒ¥b¹Õ.sÒ Û.Š´Üš]Y.”Ÿå”ý…ПöîˆSXÐãç`œe¹Y–UZ‰JE“û ¦©XYÐä q&ãü¬_Ûjã'·Oñé£0;„$ËÛI3Ëhë¬,,;By%‰ŸŸÚ4IhéuÈòƒ´¹’P«üpä`¥•…2i1E©¢É´Šð¨²ùÚS³8è,cs~Ñ{}®Û¯„'JsãHy¬˜Ë’¢dÆÇM”€T T鿾ò8«TÍŠ0êú®ªZ€¹—a•!ʤ’»‚å G¦Ç¾Ës h¥¡ÂVª`Íu—&ýe|H*(ïqlرÑÏbaÖubb#JËA@~঑»W(9CLÙ¸\Õ ©6”»3æn–禱47…ËËPò«‚÷ûQf<àn/Šÿ†8ꋼƒIír†"G¡Ë¥Žùú‰hºlÓOø/ÚSãq˜%ÿx'Ð “î²dÌi¼c{RgŽZɢRm«ö MC£’À8Àà¿»´ˆo¼q;¯ÐjаË̯–Ê îî…¯ X>LÚ˜µ'"T}K8‹•,fp_7ˆ_™ò˜»DTú|Ë3ó8ì®bezÁ)g8-tJžÁ:\IŠÏ]J^K_WáêäîGŸ Ý{à4¦žòW‡¬TÍh°U¤dý3Á”,1p‘åïDË·S‰¹{Þ+ÐäGM0cèâŸ}ðöƒ[¿¼ùf{ie}®³¸Ä”:ºó/ël«ªgÞ²ç|(K9›SU$™U<½ï4Ñ#aÔr/å†_CãV­•ºêä5Î+s-,Ï®b!—ó%@¸ß qçDàöiˆ£Ó¸½ÐžÀÃA”´ÊçéêFNíI¨'³ =·M9ˆIýKÃðiá>~þ€ð·Ì8ÁŠsÆ88â¿éaO¤]…Îõh÷ØGœAUv)5š”ˆK&%,Àz{ÿhk÷É#Wl’>¢àž°Áó£«'\Èj÷+‚66ÆQG>™ÒZcPìÏÆ“‘FR®ŸTÎ2‡+¶ œ±ÄïA’êìçw‘*VmÖæÛ8h¯¢;=ëü!Ë´gÑM´m`•¦:¤ŠUÜ7‰r¦dáÑïüî_ÿ«ï¿ÿ7ð¦”r ATªXõ•Ç¡WB,Фá1YØ¡¨\Ëùœ¤ª=.ˆÕÝQÕ×lv ºw•;»ê]UÔF†UÅj*ù;<žÒOÍηg¯¼ôë‡7¾²±upe}uûpeycgyimke¡»Ü®¥ÛïXƒqõXëg6[ ûú˜%L0:x^e•ÞŒ¶pc®)çŸ@¦ätå•9Ê¢ŸD)‡“pãÝ“wû±Ç×þ°ßÝzV<ºU¬!\Ðîþ†wƒ‚€ÿjw¿²>‡Y’ðž… à ‚ºÒx–äh¥ Â5/F¨)‘>ï­6IO‚ 2i$ˆ¤D~ûµOñ` ÁY\-ÅYlPÉrÏ’¿IõaZð¡†{™¯d4=Ã]õC[Õí Ïc|øX*j†zŒR¦ý9cUìòÔ#Üí Àô„ÀÑé@±&¡ìÂ\>–©áì“TÜ5Ž­ù.ö;+˜Ÿš®¨,€Uú[ʰRîúöGï}÷›ÿÁþ䦔²/¥ ÀÒÃ*X¥p•æ`éý õ$xiùg/²¼æRÃàû×°t ò,WûWÛ›2= åõ–²rpe°\(qf¾=uù¹_YÞ¿ñâòö¥ëË«;‡K+{‹ËëÛÝöâÊÂy«a6æúPÊÊiª—Ïg3ß¡_w 5%×+Ë2Õï Ê›©½$‡¯“y‘$Ü;¶:Jò½Žz!¤7xÙ”µ“QnÀ‚6`°6àùÒJX)T%€ÅXZYÞUØFÚwŽ’VA„²¤„”7ï>¼yŒ1)\ñøoÀòÀ•þMa*s g†. ÎÁ±öÏc md°‘ O²²c\*M •*œËÓ*`IÜ?@"=G(_,Bš =Y@•N-`¯½ŒÝö2¦ƒ P•¹œ‚Õ0ÃU¬bŽ>~ëÃ÷¾û/¾ÿñ«þ¡¢EQ/«¾¦X©Éì*X ®TõJ}ì‚+`Ë” /-`U²j,%ˤ`9´Û GõùMÁ åªe¬@yÌØ ´õf€8;ßi]ùÒ¯®ì^{¾»µmim÷òâÊæÞâòÆNg¡»¼pžÂ«i6Æú™?-x{•F«(‹r À CK Å´¼À†ƒ 0wO’„û^„{§±êu·âd ½Æ°\»W#w…üÏ_ZÅAg.§¸šóX­bœ,­äoš—es¾¾hyªXŒ0T±¤ˆ÷ñïß¾ƒ7îœ"à1T1E½ ’“X¼ ²°â5ibûæ,é‰jø(µdŸFŽïôØÎçè¤9—¦Žq·7C?Š‹”›IÃΤ©Ú®<ÔÑV0¨ÒÏ ZØk¯`§=¬¨Üy¿yÕŠ”PŸ4UÊ‚ˆŽ>|ãƒ÷¾óûßÿìï~,„è !úRÊ0Š¢€¾ p%4À’°2©SæxY XIH•V¯ŠË[.À2/xÍ®\­utÈRKU«¸òZ ÕHÕa²þìaÍœÒ6;ß™ºü¯-í]{~iëàZw}÷Rwys¯»²¹Û]è.Ï?îàUNmòX%/žße`è3 –8˘azr}¶"Ê—éÜÑC9ÔKÞD·åë^/ÄíÓ!€FÒ¬b„P$/mÌã|f=R)`<VixçXcWÒ(de*V2²«* Gýþ÷×?Ç@PUO@K«€§¡Âa¸pYÌÜQ †Ý7.xÕÍmãl+,'*+ÏíáAEÅRò®.O=ÂÝþÐ$ŽNÙúeNYQF¶áqªtZhÍ`¿»ŒÍùn’³V ¨X™ãKÙ·Þ`%‰Ž>|íÝ›õûÿðÅ[ßÿ,«PJÙ¢(…ªT½Ò¡*U©TÀJÁÇdÏ`R£\p˜«Éðž š| +÷ZYÀÒ!K7ýdPÄ<áÊ5/4ÈQÿªð4¡ÙhKQ®Z¸â†ÇÜðYúëÖÐç|giêÒs¿Òݹúìâö¥‹ë; |ÅÊ×Üc_¬Ü¬•ÁËAP&ÕËÉn¹f£ö‹‚Ñ@ÔnÌU1jwxÌ ^ÐT/•¢Nwû»§!îœDñã^ˆÛ'z‘¹Ã'PV0ÂÿúŸ^ÂÂt|(³,ô—‡+²\‹3» ÓÇ©Ö8] ‚$d–CÖk·àOoÞÏr¯†áBUÉʇ ÕP¡©G¦ë¢9 @9[Pš °©J’)KêE4ì?™ü—§áN/ûý0.^@^õ*ÎjۤǨÒiqf¬Í´‹ómKcf¥±X¥¡@!䛯¼}ó;¿ûû7_¹EDaìK)C"ê !Œ±P¡çXéö &˜°çTI‡Båz\K½ª°|U,›ãºK¹ìÍ õœ-² ¸X\Pž· ¥–iýÜð˜”/f´ì½öÒêÌá³_îî^y¾»yp­»±w¹»ºµßYZßîÎw–fŸÕËS¼òƒ/ÃsŸ$ûÑ µy[TU}̤zi¶9W²«^*|IPîsN·O"Ü> qû4N¼ÿâ$ħ!z‘„$Âo^]Ão\ZU”)ž³gHÿ#5ÜU‹üröª—)T¨ªXñ "I¨0ŠðÍŸßÂGǃDÁÊÔ2LÝõä÷송 ¡öïOuîK:óm!Ë:Ô|)£B¤e€u·{œ ¤ÀýÓ(^—¤¨¥Nޱ࢒ãou¶ýö2gæj*V`|­ƒUÎr!Qs‰ìX…âÎ[?xó—¿þGÿâ®b@DašgED)å +ÝjA‡*aøK†p  °È XÉ‚P É˜Ôõ¸P½2©P.°* šT,€S‘bÅЖ Ó²(R¶+×kêrÐ0S#êÀ¡pYÃŒÊwa‚öÒêԥ羺¸{å¹Å­ÃkÕKݵ­ƒÎòÆNg®Ý½øð5†…P©\°‚${07|˜J’™åLª— ¼ —^í—ì*dj¾ÔºÔïçA?Â'!BI¸±½ÆÞ›‰}AÚ£03‡O½º,fS±A?EÅŠîœôñŸ~«~©ŠÅÙH˜[+_QÈ&Vgö»Œ¢¤RŸcª–Íp(9X©-‰¢®\j=ÄÝ~Æ€^$ñ GŽRµKÒ0áé€õÕÐc™a#©l·¦+•w ™{£ê^V&°ŠÂAtûíïýâ?ÿÚܺyO«¾”r€UZ%¨ªV£Æ¡jPO\Ž_Q^•/\‘GhPìZE€5ŽŠåRµ˜Çkúû€_ø1P@ˆYÀF#îøÇpfS¹Ê—)ô¨¾ƺËÓϾÔÝ»úüâÖáõîêÎ¥ÎÚÖ^wi}§3×îÎl=½~ }!ñ°Æ!AE¹J×§:Œªjðy•i ÓA€½…eì´—ÐÊ5m¯‚~¿ ‘Xe!ܬÂA¯ÿÙO^þÙ»ßþŸÜûü8Q¬Q ¤”ý$çj bŒ©áÀù¤uSN•)i]ý¸ó­w¾UU¸ò…,/Àò+½1sÈ2ý-/×r€;‘ãÊY`QËL@擟eËõâ°çzùš³¢¾–×·fŸûêâöåç:›ûW»»—»+[ûåõíÎÌüÂô“¬zé¼¼á+“žŠá‹ úB’¾éíIÔž0Cm‡çóÝßpΓ¯Ã¸EÅ"C¨Râã|ó·À1ª ñDz«Xñß¡ŠÅìý 'Wìâìö±ÁM¿¸«ö#„Äí›â\D)‡!ÂtÚŽqÆIîýHâ¸fJ/‘ÚÏ“²S׉óªtJ›/oÏ/V¯l,ùûVZzUïQïÓŸüåOÞ}ùë?9}pû¡"LìiŽ•"L Êdª*Vºg•ÍÝ4†¢„jU5$X*4X°|U,0¹Ê5_0sÍcR·L ÷&Pc…̦€î 0ÌßBæ³Àv.Å .¨\ÞÜ™=|æËÝÝ+/t7®.®mvV¶öÛË;Ý™¹ù©§Aõržcª^#ƒ%_œH‘ÆF¡ËNJ[œs÷¼¢ ŽP!(1 i¨PâOß½×¾x”…UKwyçZ5!ƒ¹)t¡Šê¹ÿ'ý+¥Õb¦ª±³øùUÐqUªù>êÎÙãǸF` è‡Çý(«ª%%¬H¤ç0޶õ: J§îÌ,Ú+X›k`õ•ÃÄ*¶&°28¯§û³úðäÓWþ¿Ÿ¼ûW¿ûzÿøþ±Va L*±\\é-mtx% ÊåÄn²_ð͵òU«\pe{ 0téb‘–º «H‘b˜ò4fIÓ¼¼`½¶ð%·ÌÀ¦t…úÔœ«–c~{ub‘òÅ ª™Ë–`k[û³ûϼ´¸sùÙîÖ¥ÝõÃÎòÆ^gi}»s–ð5IÕ‹3ó Wz‡d,ýõs¤™3FiVÃòMÖPaŒT£¡B"€zƒ¿õê'8‰Dæ‹hpŘ²t% %@˶ÊüLK.Øh’;@–P”“TIQ“ÜK¬$É}Žûa\y›Ì”B‚úécݪaR@e‚ªÔ%eefûí,ÍÌT%L¬¨"XõÝ;þäÇöêÍ¿úÝ7§Ç'BˆV©Ý‚ªX©=UËÕÇJ ¸uMÉ‚¬Ê8±»LD]pUF±*,ËB>9Z>æ n.Å«è`P­lÛf2Ó6ØÌQ™ÊL9V&ÕÉ¥jÙ É–ëåSÕèÊGË}¿õÝKsû7^Zܽòlwcÿjg}÷rwes·³´¾Ýžž™»˜ðÅ&³î2w™ÞªùÉiÈð³QmlW¨b%¶ FRÆzëþäí;IõàЀÔ䇕o£“7!U/¦.ŽeNÕÓ/ºNÅë,ÁŒ Ç­+Á]¨aC­éýAë÷aÜ9!"<„ °D¹Ò”/ÝæÁãü«¨”õoÌwpÐ^ÅÂÔLí@Å,c@¾þÑŸ¾ró;¿ÿÆ w’æTõ¤”Q’ce ª!@Õj!*¡X å0±àN`7)XÐæ;s¸Òá¢HÅr)Z®×]0Æ<çãž Zl¹`U­êL`È-`f² ðWÃkÀžÏe²š`Ïë²…;}Z垯ï^š;|æ+‹; |­ívV6cåkzf¶…fšœz÷˜ÀR*ƒZ¹™^eÓ+nRU( R üáŸãÝ£S£‚(pÅ îî\kŸS¥ÑwYè*‚"¿dûóW²ô B=É]ȼUƒú ÷[Ç8 ``‰Gý(ƒÌªajþVÞâd²@•NãØ^XÄ~{3ÁT-@UØžÝV@Pf°J÷ó££[÷>úÁ¿{åý¿þWo†á /„‰h¬ X.XÀÊd­à²YhšTŽÕ¸påZù ÌæÛ̸ª@Vh-c[KµrÁVðòÉ)ƒ'|éËu,@±%‡½¶é¯Ë‚‚ÃnáÊ5³…E{Wæžýrwçò³‹[û×:«;•ÝÎâúv»¯‹ptÑ·× b1¤%ûI¨ñ­:Iû§üÖ+#"ÊÜÝÕJÂ`DÁÒ’ÛÉîÌÑÚ^Î } `ºh‰÷z–Cõ*~.RU%ƒæø»îðc<ŒB ¬A”¥Û U¬üg˜“ÜÇ*Ó|éÓ© ÀîÂ2v1´*+³o³ÖCåÀJpr÷“;üý¿ýÑ÷oÞa8PÀJ FŒ±¾¢X©a@=y]·X¥JU•P `åú Ö W•ËY.øâ+‚°2êTÑúàPÀ|`Ëç±k{}à¾ùiܲÎ2`Ã-0Ö2@“Ë–Â_E•–^*Øöåg®¿ØÝºt£»¹wµ³¶{©»²¹Û^ZÛê´¦g‚‡šÉOÅJËxÜNó±þöÃ{øÖw“jÂQÈR G³0¡Vê»È¡nðª£Ò¬,lÕ‘ÊGJr» L€Å9°Ãáþ V°úRàt r-¤(¡¶‘fÑŽ›„q*f[S8h¯`s¾‹€óÚ€Jý}ŒÆ™ X¬ÝþðÖûû‡?þåþøfš_ED)eEQ/ie!q_Çh5 ªVù(VzŽPl·0‰P`•0àXpå‚”¢çe!Ë´l@TUÜ¡°•Í!+«z¹¾KQÞ+9Ÿ)¬hò ƒN.Èì`&//—沓àŽymÛfÜÞÝ+Ï.ìßxiqëÒîæþÕöêÖAwek¯³¼¾ÝZS |5_i8ž2J* )V²„ŒðµŒÏOú9Ȳ™Žê9X¶Dwt•¨*Ë8ìŠôºAË;É]«L¿Ãnp‚£þ ®"Œ$NÃHŒa˜PíŸMÁª ¨Ò}µ05ƒƒÎ Öç:öþ«5ä~éßC+d…Å`õà³›Ÿ~ð×ßüñǯþÙûIEà€ˆúQERÊ"°J›0ÛB.+‚½R& X•Q¯ô÷j…«"@²Ê@N²-﫨•ݦ*ðå .è*£|öDú¿fS×@[_Ë>®°c|ù—þ0‡R9Î9Çö¥gÚû7^ìî\~®»¾w¹»¶}ÐYÞÜm/¯ow‚ÖG3=ñ•… YÒ¯ÐYß?Á×^ý(>øGàJËèé¨^YhR²F¡É¾*©^5ƒ—tù\ꀥªY"é)(àÒk¯ç`QrÕÕ|µ†–zÐê@•NË3óØo¯`ev~b@Ã>3UìW•*A”SïôæÇïÿõ7ôéO¿õËD± `•æX©¡À¦T¥aA o½@Àr)V.÷uÀ¯*Ð×½Lh°6¸*‚²Uh•QÃ|ÁËw{|òÑ˜ÇºŠ€Ë¥àÙ ŒÃuy€ÙàÊ´^llðå£R™ ÌG+Êóòiž0lçÊs û×¾´¸}é™ÎÆþ•îÚÎAges¯³¸ºÙnàë T±’1/×2¬ôêüÞü ÿñQ’äž·fàÜ WL¹XºÀªø[õª^ãB—Í KuaÏ).`¥ûy·u‚£~ŒÅ9X½P$†™lèþCˆF·Ã.GÌ?°>ÛÆ~gµ"p@e+RLA ÁJŽ~ù³ßýοüá¿ø›OS°Rìú¢T©R|¬" X¹+a,Àîe嬪>V“td¯W>@Q¤|–÷ KºÞóµ–(òø* _Eû{ÀXÑ{Üã{Û,"`T5‘Þµ-EÊ—-œ|dËýÌ}]vüª/ðµ{õùÎþ»Û‡ÏtÖ÷.w×w;+»îÚæB´øzÒ 1hõ…ÄŸüüÜ; qád F”+ÎÍpU”åV¾PuÖðU7xéF£Y«oÀ:ÅQ¿Î‘D/ ™–RI¨V+¦ŸËØèÕÏ'äƒ6ÇÖ|{ÌS*X•>?°’’ At÷½×Þ¿ùíßýÑíwþás!Ä@J9HþFRÊž”R OX75`V“Ö%ìU€º¥‚t@<«qr¬êʳª WH|°|€ª,dU}>n>˜TùBZ…«ª²UZäû̶,÷ø.Ì¢|ö¼-ÓrLƒ8Ókª­„KõJ×Û‚»ê±JžWQåeöÝ‚`Šï]{¾½ÃWwcÿrgmë ³¼¹ÛY\Û\à† ‰PHpÔq¿áA?Âý^ˆƒG}“PXC…ÙIQ¬ê€/ìÕ_UÀ+wÕÒڵȬzphÑ $r&Oœ;ÁIœä΀H’–ƒ•‚æ`ùúJ‹sì,,c¯½„© ¨¨lm©TÕJ–+!¤¼ûÞo¾óíoüèÞ{¯ÞÖÀ*ýa躮º­›úF0W9­“C±*)Ÿ~ã„Ï®lÀà:WêP»Ê(U.Ø)ûÜ׎¢l.XÔù(xÌó=Ÿ¿.˜+rÂ7)_Å¡K“… ÎôêFÀÔí!lðUdžÊ ÀÌÕh{Ä vjjšï^{¡³íKÍÃë‹[‡×:+[û•Nwus¾¯ó¬ÈB’‡5”¸ÀõƒéU‡¤xia§ …ÄQ/ƒAˆ{ýûî÷#ÜïE¸?8äDàÊGÕ* _>óŽ_Ö+Na¢{êÐ>T°ö¦N“a X½0²jRξ Ÿä^¼½³­öÚËØš_BÀY-@åcR¬"qçí¼ýη¾þÊÑÇ?¿+„èGQ4 ¢°XéÍ—}ÖMyVeZØLR±Ç,” @ª®\€…’¯W¯:T/^rEž^E¡Î:BŽe!—PºÆyßÖ@ÛGù²9Þà nWût-‹:f³…ðM¢/JÄ7½˜{>!ljjšïÝx©³wí…Å­ƒëÝ̓+íÕíƒîÊæ^»³¼¶Àyð¸ú†>~*–²XªÝ«¶©ª¥€@`IÂ4K[¸¨‰óÊü‘ŽúÜïG9{Ð0€Õ_eç©2_UøÊ~xô#”1YÅû=6ƒÝnâ~¿Î")Ф’w…,ܘóÁJÖ‘–”â¿ S³Øo/c}®kŽ^¨JyXVQF_¼õ½7ßýËßyõÁç7ï ! X Ò^J(0D ÔÁJu^wµ²€G±Ê†“ N®Šk\Xªûµª øã„Ë/¹îªceŸ£|éÛãR¾tu ȇmfª:¨éÐÃàÎѲÁ” Øl­‡|*]ðÅ`jz¶µwýKí½ë_êîÞXÜØ¿Ü^ÙÚï¬lîwº+kóŒñ¾Î²Ò '%p¥æk©V™'SšËE†qš(øÑçu؃Àý^ˆû“P^8õ«LÞ— bô¶9&?,¡©Pi%hÀvZ=ÜïõÀ90ƒT3WøDõ"¥'¡Ùh4¿m‹IEàêÌ|^ù¨ÔÅÉÒêJfÞ]`•Ø-DQ?üüïþüæ_üΫï|ôСX•+2ü-j´ì\U+_ˆÇתT»›ªpå Xe h\¨š4€U›2ªWYHó óÕ­|•É+R¾üò˸ÂLë 0Æ ÅðÅàWåèòúò‰ø¶õ¹”°À›ÖÄûéÙ¹`ïÆ‹ý«/tv.?³¸¶{¹³¶µßYÚØm7ðUd%/0( cj\i4¤¨ÁTª€4ñÎÀMËÿ¡ü;DxÐ+`gheÔ/³r3êæ.Õ>„ʾ ÃÞtG½Sp„‚0BQ€°R+¿¿•A†1¬Ì¶±ßYFwjvl *ZÔØðº$X…a¿ÿÙO¾õ‹w_þÚ«'÷>KÁ*LÀ*kÄŒaE`„¼óºîaeêØûú*V6`rý+r^¯Ãz¡ŠR56\¹ ¡°×ð:îêTÊxÉeŠ`ÄG5c%¶Ç¦fÕ¡|™¯¯—>Q«#^ Žq t©Û`ÔŽBýœ–¶¾¢û~mƒZð·®°Á·æ¾æZ‡qر»ux­³¾{¹»¶sØ^^ßét–׿Æ.]zËY:DA©PÈ0îêJ˜ª@[‡>Þ–°ì)ëˆ$pÔ+`çû5 y»²²ð!ÃjνéŽzÇà`ˆˆ0ˆâk©ZeGŠ¢¥~V¬RÆ'ÑÆ|{í,LMO ¨ôÃÌVªA¨£¡aï¤ÿéëñ³w^þúk'÷n=Júö“ŠÀT±RÁJoc&»:‚ÛmÝÖÐfZ5ÇÊçõ³Nd/­"°r¾_þ„ê|}\%¬Že«„‹T+PóíYôžÏ¼Üc>ŸöGEÀfëÑØMUmUŽ&H3A›Mù²ÁŽ)K…*ß<¯À¼üá+aÓs ­Ãg¾ÜÙ¿þÂâÖáõÎÚî¥ÎÚÖA{es¯³°¸2ÿ4²³«Ì:X…÷}ýÃlóúXI©l>f­.åËÖNȵN]Írå~q˜Y]áE“—OøÐ·å)ŸÌ•–Á×ì\{êðù¯v÷®<ßÙ:¼Þ]ß½ÔYÙÚo¯lî¶ÛK«óO3de 1½7T¨,ŸÃtÕˬpMÀ ›f{ÐpoáaRýè `®|¬"—zIÉYê×I›oÌE¸sü­€#¡Œ›z³¼‹;€é ÀÎü"¶æѲ€U]@e‚«\[ ™W¬„!$(‰ÐtÿÑG¯ü‡×ßýÖïÿtpúàTJ)u°JÍAU°R}¬R ²…} Éö^‘bå²T(£XMBµ* WcU@©´&bãÒ¤²qò½ªªgUª!ÇUÖÆ±š°m7óT·Lóp‡òåv49Ü›T+Àž›•‚-ÿ«lU£©-ƒ£…ìÆ°˜k/N_zö+Ý+Ïv¶®w6ö¯tV¶ö;Ë;íöâÊÜZÌãî¡P1ËÙÄÀ j–ÀL€U€¥o«ÀH0uË!ÙUWUxXJsÔ;ìÎ Üyô­€!Š$¢t¦:kÄ{xŽOc§½ˆÍ¹8㉫ ¨˜å§.+©‚j`uúðÎñG?ø“×Þûî7>è?:Mü«Âäo_*µMd«ÈU¶ê@ò€-œ‘b5nÁ¢Ðß™ªVu€ÌEP½ê®³„._Ê÷³|=¾lóÁ/؆2ÊYY%ÌWí2©[¦å˜¤•Q¾‡!m!Àî0¡O5dQiwû¾.?ÿÕÅݫϷ7÷¯u×w;«Û‡í•ÍÝÎ|giöIQ³œ2®c>“âWCá§ÀŒûMƒ,UyR> qî€1ÎKÜ=~€€3’ˆDêÐβJÏîÔ ¶ç—°2;_jÕ mA ²ÍK4 VP`ѬNŽn}øƒÿëµ÷ÿæ_¿ ý¤ó Š¢P«ÌÏÊV„a"»©žSØ«m@å«Xù(YÅ~¡ \ÑXãÎUhMZ«®& ]¾*Të)æ, –™·lOG—ÊæÓ¢¨¨Ñ¶IùrAš)çK‡<[Sm^ 8ÅÉóeÚå|ÙÂ&w~´W¦žyiq÷Ú íƒkݵÝËíÕ­ýöòÆnw¾³8óX@V@ù—ëåº,"O+„@õ¢ €åŠ207€Ýï…™¾Yºò“~ç´'äg8œ'Ü9>B‹qHHDŠÃÊô<¶ç»èNÍÛâ0€+ET¾à¥FkGÀJ(9’k?>¹ûÉÝÿþ^ùà{ÿöÝ(ŠÁJq]Ï”*G;°*R§\@e'Ū®0`¶ ç¦ZMŠ.ªúuž*׸ë¨#QÞg=eCŽEÛ↾IúãXK©c¾V¶„{Ûû: èï¥Ë´ào¾êÊýò©X,Êû²)f6Ÿ/c²=Ö]^ŸÞæ¥îîåg»[‡7:k{—b«‰õöE/æq6–:¡YùÁ…ˆ<áíñ°lMDá¨â~?ÂÝ~ˆ=£~ˆ£^„{=ã0BZÇÉCÀZ ¸Ôn?¼‡)Î’<&`»ÝÆ~{ Ól:®Äj# ¦›`kt]´¿µ}ªîJI~`%´×ŽoøÅ‡ßûÃW>üÁ¿ODÑ@+®R°Rꕞcåê˜=«Lj–« 3Ê”myàñ·_¨ W“€¡'];k«P¼âçUíéè[éÈJ¬¯è;•ñøâžÛUVí‚Eí*r·gŽÀ¨c<`¶ (J¼·A” ¬\þa.{ £¡ª¾xwesêÒ³/-n_y®³µ-†¯íÃÎÒúv{n¡sæðU,¾ÿX~Vʽ§ÎC¶":êG¸ŸØƒAõðѽۘmMá`©‹Ë‹Ëh±ƒ0eÜ¿‰;n{™ÕdT‡)ó7$£jU¬~vóóþöÿ|åÃþ?!úDÀj äW…°Rs¬F›0£‚beK\Ÿ”bõÄØ/œ']D%ŒÕðYºÊ€s=u'Ü[ÕX˜|4ÐùºÜë¯sƒÚí}W "nQ¹laFSÈÑ_¾í…|z=¢`#|-®mNÞx©»sí…îæþÕÎúîåÎêÖ~{ec·33¿0 NlÌh¬ª VmÝ+€é¯‘á³càB@ÂÛ·îà~€gWW %à "„QìèFBÄ’•Êq ,._ Ò᪠Xe!@åµ½õÉ»óÍW>}íÏ?B„Xé®ë)T…ÅÊT( Ðd³\p%²»œØËü+TO¬ju^Àt–ŠØY¨\ç]U•­* ÷e «Œ‚VÕÝÞG=óU³Êömt©[>ªš-$ÉÇ- `÷ù²å{Ùºjf,ÀÞBÈ[¶p¢mFØ\ÞÜ™>¸ñÒâöåg;[×»»—:+›ûíåvÝðÅ&0r=í¦¼`¯áÿ•}ÆB!†"A…Ä ”C‰ˆáj0ÙzÙp•Ìù¥­—Ó±ÁJî}ôÆGï~ç_þøÖϾó±"L’×Ó¼ª¾Áu]u^ P¥çW e«‹’×霫I«Ve@ëÌÀª.Hªk“®§ºê±ºÀËeœê{>a?ßuÕÙ×Ñ¥lù®ÛÇç  ³ÙL0‹²¥*Xê¿–ÌTü–Eóq¯·…1{I›=F¶«[{3û7^ZܹülgóàZwcïJ{ys·³¼¾Óž™›Ÿ:ó‰Mný=€Ö¡&·gëK@+Œ$"!ARB )½AìƒEýP&!B9ÜRnùî\ ®ŠÀJ52 Òѯ}øÎË¿÷Êí·¿ÿYš_¥õ LÁÊ–¼®‡m.¯ª"ÅÊå¨^‡jUæ9PÞ~á«V“€£I¬ÁrOtÕiã€X}}AΧ*²L€¯XQ¯Å"ÅÍÇZÂÀ\ ÷êr6sµ$ó|l ýéF«€;‘¾L !“˜m[lð5{ðÌ—÷®>ßYß¿ÚYß¹Ô^ÙÚë,oì´§gæ¦Î|€b“ýœ‹`Ã+—Å»®ò€už!F_õh’æc5á¾Ê·òQ«Êôrô aÚªmßÛf®°£O¢½«òÑ'Äè“ëeS½ŠàË d›ûWŸýrwëÒ3ͽ+ÕÃöêö~gym»Ýšž Îu ;+±=ÞÆc±Ú•VE2V°¢(Š+…L +Q°å–—d¸ŠR>]’ ¬”>dÅáÁ(„·~ö×o½õ¿õêñíï§`%„èëml´äõHƒ+Xé‹ò©.’bõÔÙ/<€Õ@×äÖó¤„ëP›Ê6Õ.k%Qæó'ánïiÌ}ü¼ ÁSY¿¯À¢†Ù VŠ]ìmm„|sÁ\ŽÌ€o_º1¿ýKÝ«Ïw6ö®tÖ¶ÛË›;åõvkj:8÷A]œAе†<`Q¢`õ£‘ˆ’|¬A$1è H­:Qíu˜ÁœV¹–6i²º¬ÂApëg/ÿü­¿üí×ÝùôAVý´_ V‘”²W¬\¡@a+Àœ[% Jàvfw½^6™Ýç½§FµºÈ€õ¤AW*Õ¤Õ®³L¨¯kžI€×8öuú…Ó×±L…£ïò®„zŸžu„M&¦Ü ¤­šÚù6á.êãhíëÈ9ç[‡7ÚûϼØÞ:¼ÑÝÚ»ÚYÛ½Ô^ÞØé,oì,­©Í4T° €%aF"NrÒaVE˜ÂT^µJá«,X z'ýO^ÿ‹7nþå×^?¹ÿÅC!„ÐÀj ¥L{ö5¨Š`N^7µ³1yVù(U8gÅê©¶_x’«®É©]OjˆqÐAIÊWÝ}AªŒÕ„ Úxœ¹`Êa6(ô ;ŽÀ Ì=˜ð¹¾l•ˆ¶Düv±ÀƒúçXákûò³íýë/v¶/Ýènì]i¯îtÖ¶Ú‹«›í 5ÅŸfÀÊr°„DŠ®„„H’ÜSÀ* V2ÿ7«“ãÞǯý¿?}÷åßûYïáÝc!DEQ.Ç y«P«Pƒ©ÈT&°¢xòQ¬|”©º«§Þ~áI¬§º|æ{CŒuAV•¶@e•¯²°T¬Æ]W•„{8-Ó ²Hù²­“—P¼`X ˆ}¼lùaÜaG[Ò'çËÕRÈ~äAÀ·/?Û>¼ñR{ûÒ3ݵ½ËõíýöÊÖ~gqmk!ZO|ÙK$•ƒ:` q¡ ¬âÞ…Z ¬úœ|ôã?ýéÍoãgý“‡'%ÁJU¬l`e2-‚)Y£2UF±jìÀ:×ïö¸AWó<.!Æ:amR_ã4àöm¾íŸªÏ} [}òÎlö¶uÚ XM´‹Z éj™ZÍø¹Ó3ø7Òv¹×›¬&lß1û.A0Åw¯=×Þ½öBgçð™ÎæÁÕÎêöAgec·Ý]Û|lá˰¢Ä²a¨Z&°Rûª€•¹¯Ð{xïøãþ߯¿óíß{cÐ{Ô#"X…°çX©.ëzد¬l å Ä„«Æ~¡¬'ºgµkÒ!ƺ`i «aeÀ«ÈŒ×°íU-&ª†+mJ›Íã«l£íÀ°n=lg‚´Ài¦ç>ðÅ °²0fƒ¯ì{ÁÛ»þBgÿÚ—:›‡×;›ûWÚk;‡Ý•ÍÝvwusžóàÂÂWê¥WŠÄšA$-r¢H¢ÅF£a$3ƒÐÑÆËæ̧G·îøƒ?~ýæw¿ùf4èõ’ܪˆˆúJfÕÔ•¼®÷ $Ãsßœ*x¡„*%K*SýBX t=ej×ãbôUvª¬Ï·J±.wûq¬&Š”0Ó6º–1AG¹vD¦FÛ¦ÖA¶®°"3VÛ¶ÑSSÓlçêóƒ/u6¯w7÷.wV·Ú+[ûîÊú<çÁ¹^RÀJFÃ(Ilâ°`”V˜´ÊéB!½ÁêäÞg÷>øÞ¿yíý¿ýÃw¢hÐOl"E±r•©^ X¬å-Ÿ¥bÕØ/4€õXî—&Äx6¯_µËGõê5NE,¹Ô¬¢åª‚+ñ½lû‹ÀhQز¨Ý+€/“fƒ¯–E-s%É»Üêù˜ðeò)Â×ô,ß»þBgïê ËÏvÖ÷/wV¶öã°ãÁ— °ÂPB‘ÀUœðÞ zý° !À´O $àÑí_Þþà{øÚ?øw7E`Õ7@•^h«²¡@ÀÝÙf ø·º©;™½Q­ÀjÔ®3¯'5ÄXUí:˶@U(”T™l̺߱ª„‹¾¯£½MùrA— ¸€Q/À\A‹B¦W:ê X`Íe+Àž§V)øšžã{×_ìì]}¾»ux½³±w¥³¾sØ^ÚØmwWÖæ㬮AP¬HH„ƒXµŠDœw5PkIcŸ@IÀñçïÝzï{ÿúÕ¿ÿ'ïQ¨„mÉë>Š%¯ÙÀªš\Éí8gŪ±_h«®Fíª cg©ZÕ^ã6Õ.cœZz|!kå˶®A.•¯ÈL•(jÜ¢†qÔÙBw:|™ZÛÂ>ª–+¬H s™¿êÛ…éÙ¹`ïú‹íƒë/.n^o¯í^ê¬m´W6÷:åµ90ÆJ BjVeŠU‰Ì½½ œÀ e®$àþ§o}zó»ÿÇ«Ÿ¼ò?B„ PEBˆ>+äÛÙ¤ÿT«_°ª „§bUgæIU6ªUXOÔ~eg¸ÜE7J­Kíz\BŒ“„0ßð%¯qÛÆq·÷QØ|r¶à T®íp¹ÚÛÔ±"ø25¯¶µþñI¢÷ñöâðogT _s ­Ãë/¶÷n¼ØÝ:¼ÖYß½ÜYÝÚo¯lì¶ÛËkó:{e€` "ÃU˜ô ÓÜ«§“^ ]qHpÿã_|ôî_ý‹W>ÿÙ·?Ž¢(LT«~T6°R-TcPX™r¬`Q²à_.PªS±jìÀj ë)R»š¶@“ƒ.'Ù¾HUª£"³w{ \/Ç2J/PƸEaÓç ë`îóèÛÓ‘Á¯RÑ–l_&Ì´(˜³síÖás_éì\}®³up­³¹wµ³ºµßYÞÚiwWçÒp`?¬Ae‰íýA„“Ài_` º÷þë¿|÷Û¿ûã/Þú»O…¡”2ÔÚÙDZ⺚Àn+[Ž•-ÔgʱŠC(€§I*VãÚ/AÔS§Z5€õôüMˆñì^?ë¶@u¯©cea§Èš`5\=u`ÕV3=ÍÇfb¬¤Æ¥:©hWݪ«-PY5«è³êt·w­¿lÈ´ª•†ÏžÏ‹ÀËôž®dù†å&TãBUc¿ÐV35S]hÚ¬Õù|Òmª\Yˆñõ+IEîü®ïÌj›’奢œ£²`UŠ&ô.ßÇ \5€ÕLÍ1üT€WÓ¨þyÎSíª«-m]¼Äüã¸Ûû@•ã}ÙcÌeÕ逭2yg¡ZM"{sqj¦fzBíFíª¤Î ê¡I'Ô×Ù¨lXp?°"@t+qŒø„ «ÌWÕê îpaYÀò-ßÇ \5€ÕLÍÔ@×]u@Ú“êÙUvݬ¦u•Q³x…ýê³ 7\¼}”¬¢‹¼t,[¶"±®D÷¢y|ˮժ¬fj¦ÇþhÚU¦²ëiBŒÅó³šÖUÆ8•Mà÷Ð_÷½¸K”ÉÍ*S•XUµòyÏ´|7pÕV35Ócn4jWõ×Ï®ú¡ar“U<»ªüî®$xŸ÷ª„ }袨Ve᪫°š©™èzÊ¡«HkBŒãUú¬k\ ßã­lˆÐ&eB…UÂ…e×ø›†ú—m5pÕV35Ó5!ÆzAjXª&]uBXÙùër·7­ËgûÊ\è«@HÝ9Xu–D5¦¡ `5S35çÖ ]uÌÓ„ëÛŽ³ðc5­»*Œ» ÊBª„ Ç©ªšDö°š©™šóí®ŸMh™¦-Ðäaí<ÚÕ±î:ÍeËN¾àQ&LWU©²ÍWæóQâqW `5S35çáXwÓÈýOk[ I·ªò[–„ºT¬*ýû…f`o¦fj¦ºÎºê˜§i Tßó³þìIœãÀUY`×È´¬Š`ª«°š©™šéÏצ-PýjJb¬w{ë8|Tž2¡ÂqÜß}aª*\5`ÕV35S3]Ðó¸ 1Ö Rg Pu€ÐY'Ô—ù^¾¿7y¼^W¢{0ÕØ/4s35S35ÐõX@Wó<.!ÆIÁÚy?¯óØ.£b*,ûÐØ/4ƒp35S35çû^M[ ÉCQÝjÙ8Ç[•&ÑU«ûÆU­Êl[U°jબfj¦fzLÇFíªþzãÙ5þoRFµ) We «_«®šµ™š©™š±¡® AWö¸ª]uCezð Vú{U᪱_hÑfj¦fjÆ‹§ ¼žÔ㤉ÑwôŠqઠ`U«"˜jબfj¦fjÆ‘§ºê˜§ 1žÍ±VjÊ4‚žP5ªU306S35S35mκÊÖE 1žhUqtœÕª›©™š©™Û1§ñ쪤& K“TãÊ@F•Þ„ã‚ÕYÁUV `5S35S35ÐUãçFDF>*3«jz¦§g¦9Ïvs,K¢Û2l“°`›²%C†`@²dÙò ¶DdB HüÁ€ 0lH9¢$JÖ‹2‰1L†Ì¦ÈÙCÎÔ«»«»^]Õ•U™÷œ³·?œsnÜŒŠzö«ªún 7îWfFüríuÖ†j¨¡†j¨¡†j¨¡†j¨¡†j¨¡†j¨¡†j¨¡†j¨¡†j¨¡†zÒâð 5ÔPC õ¬~WÙúlxˆk¨¡†j¨á»è©è'ð½õ㸠ð5ÔXC 5ÔPC}Ò ª‚Ó¯¹í›ù]õÞÃüÄ}à‹l 5ÖPC 5ÔPÏ3DU€úFoÛ·V¾Ÿ~¨œ¿vŸï­(û­“ÇØ7×€×O¬×[C €5ÔPC 5ÔsQ}€ú¡pú¯¯ù~=ä;«]yZ³rýûÖ t­ƒ­´†k¨¡†j¨ç ¢úðä{—¯”ËŸë=ε²­yáÀY级ú€D ¢÷/]² ^¸î–ó>l­QµÐj¬¡†j¨¡žnˆzÀ¹rù2À—{õ¹4½àF¹ìº3gœÆi·5­ýÎ’ÝSÞƒ°ÚuÎnXܾ­œ³Dì-g/_Ö°>lÝ´Ek¨°†j¨¡†z& êŲíÀÜxgq°J@LÙ?¿kÊSd{›‡[KÀ:µ¹IÜî–ëÛÛÛuÎìèØTœØvÞâáeMÎÙîíÛªÎY±¾º5¬¶o6€ÖP` 5ÔPC õ±AÔj+ïau ÆÓîì툘»€h*UšñÔæ&Ê67™ÐŒœL8Wå´¾èÉdùýµ±Ñ]4ç¬*Yz;f Z´ªÎÙ¤Miçð²ÞpηoëÙ[óžª5€ÖP` 5ÔPC õ‘BT½¼¢Îò,ÐAÔm(eÏŠe”VˆÚpdF·±![ŽU)“‰T€’ñn+Ur<&,Ÿ·F¤*9jmÓp$blšˆ3MªsÌ12KæœcÔ£ÅÂ&w-é¢ÕçlÒÞLñðPÛƒÝk­ªÖñ¥K:€ÖPDùá-j¨¡†zv k êÕû@Ô7 D½Öƒª¾±üT¢.˜–Ë—<¢¶`lÜÞWn™ñÀÔl˜ñºwF£ßÜ”)€£Å‚bƉãtÊ pÁ±¡*GÆc¶m”Á{Ή¸©½'ŒF#À{Ž`Ô `$b>ŠAÄ,6qfªzÌMDÓÄÒÈ&iã½…Eÿ©´1:F =š]M©¨Zû/½Ä©÷öú¥KºÝûq¼ºü9Àòv 5ÔXC 5ÔPÏDá!õì÷XC3 ЩR¸aÆ€MlllˆDå3ŠÇ“ ãbc$Ö426%G#‰¸èÐŒtNÄ9¡ó¤wq’¥E„NØ8Ï8F#=Å"I4Sbq,æÌ6Ò bN‘¡IÛ˜¦yÛ&1ŽÎúäg³¤Ñ4qœ6G/¥ÐÆÔl=jíƒÖÆ¥Kú`gËm­¡Àj¨¡†ú„AÔ¥rþ`ˆz7¡¢ÎˆR¥Xnç­ƒ(fÀZ QiÆ;iFÙ0*À…Š¡éFÐŒwFŒ›©F¨8'hT¶Eœ ü£ˆhãý†o¡E’P¼slD¨Þ;ˆÐ{F„É 7(ïà)f"I¢Ž‚©˜‹¡1…ZŒ>%k%¸èâš´é5¸i³4¿v”6FŸO¾iü™ ;šÍÒZC €5ÔPC õ ¨ ROQ-¦E‘ÚËvÞzˆšòN(x׌ó 〤Â&rë™òþ²Ä4 špÔȸi8z:/꜌¼gr#—„Žià¨Î»Æ‰À;I¤°i¤!ˆbÎy¤”K–w–L0¯q™Cœ/iê·‚ºôx–³ êÓí4 áô86"Q5ïúè÷7d¼±¡G³YÚ¹{7ùZ§¼·×ÎÓ‡€ÖYC &÷¡†j¨'…¨ÍÍ[õDýP¹^å?P®¯3–¹§F­3–Ÿ€¨³À-+ÆòžÕ??,ul&GÅd~ PlJAÞfÜÈ ãÜŒù Í8·ÜÚc…¨r¹ƒÁLºífFŒf"—‘l¼Ð{&çú±¤±\#"~4’–tMÓHòcG¡Ð{GOáÈ9ˆP‘u"TïÎËÈ ‚sâÄN *'H˜&$2‰!š†d&QÈ`Iƒ†5Ä @ÐpÜ‚Æ]Òp ‹´c¸{tc¼Ú¶MáðPwÇc ·niôÞ¢÷vpîœÖ­Þ¯ÊV:ÔXC 5Ôðø¬BÔ3ºQ®Q°BÔ6Àc›’0nfÀ¢L+4õ!j¹[S‘@ FÆPài Ö£™FXÙ¿l‹MÑw ç`”ñD’©p¨UˆºðÀO•cÎg×S *àÜ)uEU¶]ìK¬AQ°¦åØE+0ãXTjÒ­ÀC›Wû Ž×¨P3­¦q#ÑpT.ç–Ho²0“ TˆòD9I®ªK&,Çx 'py{y<À`âèPÛ…Õœùy.ÁJHb–íäDD’9€fÀ$AÜok:õ›Úžþ^LgÞ1;}]ÓþMØÞ-³ÝŒIBD@ØÚÚÂt:=PÛÛÛ˜N§hš¦;F#ŒF#ô!¬ž‹ä…}À€Åb .`4a6›áêÕ«8<<ì@ë3“Éù?ö¹/ü¿ö©O]b²V-Í-è‚[¨Í%ÅEJižZ&]¤¶ ããÅññ¬•Eâá»ÑÇã»óÔŠO³;—Ó  @÷ d=h 5ÖPC 5@Ô‡Qße€ãýÌä×Êåb²Æ­r\þ`Ë%E‰º£ÚyžjœA7tøDmµÉÈP³b,g1”¯BÔblÜèmoOø¡FŒ¦Ýª¼ñ(ßVMãÑVVäy“ «‘^V|PæHo’J»®BR2:W|RÅRmM2¹¢„Ñr;/+\&Î@—£\n f`òZ¾.,-C…ˆÑÜwb<õíО9§ñôå¤ûW5í¿«iÿ–Ú^$šú3‘žúµ¹¹‰ŒÇcxï;ˆòÞÃ{’]›¯Tªú§ºo· Z«€UãæÍ›xë­·0›ÍRBJɾo:ýÎôù/þÂîî¼£.œ¦ylÓbÄ0³4Oí|AÕE:<\ÄEÛr~·åQhŽçQŽÃf{'¨ˆ.®Ïb€èR[ëA …!Ck¬¡†j€¨'…(`é‰ú& @nç­[‘wàç# *D½€å¼<8Øßï iõ¼QŸp­®‚ % V!ªªP`n˜ˆ"À ÚQX£BÅæ¤9Öp„ž ½ÉYQÕÖž—¦¨P Ù Nø®µç{¥bâáØR€K¼œx1&@´{"4.‰™‰äŸ£ˆ #ÌõT(ª‰s@öp„&‘dæ¿ÛÝß ñôù”N_NéôU«¥» põç᜻ǵ¹¹‰ÍÍMlooŸ§zª°TA¨ž×mõTáªYÕ‹Õ¿^oïKóù—.]:XÕuýúu¼õÖ[˜ÏçH)ASÒ¯M§¿þ§>÷}ÿèÕ­ÍkÒ"†ÅÜ¥v®A8:ž¥Ú8_ÌGóEgm\Ü 3 ïÅ-q±]ÜŽ#2Ý:¤¶ýt­=@S¬UÐ2´Àj¨¡ˆz$ˆªÆòrþÀ)·]êµó^+°ÕôÔ©³€³8ØOk!jÏŒý6^¼Ë€®9Û(éävo:9ØX&VU(`™PzášãÒÆ«*TV¢š F£_BQ–hÆäÌ5ðŒÉ >ŸSaâH)yTÙËЛ19'>+hni07-[~¢Õt® %¯è#Lrk/G)8˜$ÂBE6¼š~=.ö~;¤Ó—RÚ{[Óé+)íß°´[õT¢ª©¼*Q« U¡i¢º_´:ñK¸²p’VÛ}³{ÖªŠÕW²‹.^¼xB)33˜T1F\¹r—/_î@ËRŠ¿ksóWþÌg?÷¿èF7m»€.ænçX´sχ‹EëG µmL9;h§ÁÅöÛ\ÄH¦Dj­i»Zç `ý C†ÖXC 5ÔQŒ8xu¹¯¼Œõž(ß}öœÅ§Êª¼;é$L=¢¶ÍxŒ)¹±ÌŒêCÔà´\'&œhÇ&m?öÀŒ“rÜQ?\sÔG];¯9¡B!{®2,-Mãô¾¶ó<}¢Z3Isl°$W”)À‘EŪ+ÿàÀÍ9 ·è BÄè aB8ÂLFŒ¨J039øßhû¯ÇtúbŒgÞѸw5Ùþ Kûª;Z &“É=JT…¨{ ¦ž¯ƒ¦ûþ2>´ÖÁU߯Õo 6Msâ9ôÛ…}%«XUI«pÕ?ÅñÖ[oá­·ÞBmÛ‚Iç?¸¹õ­?ûÂg~á,ì€!ÌÃ"¶²8žÍb ãããù<„¶±ÐÆ;óàDb G1´Œž’qD¦Û¤Ž%MàRÀ{šÛôR =D; €5ÔPC µ„¨s¿ÜS¥®¬9Q/•óð~çL†§³÷ñD½ઙœ„¨iŽ4XQû¢ª²8Á,*Ô¢z¡¬[Çl*oxT·5'Ìû¹P£f鉚›9šgÓ[‘×øj:wRÎ…n¼éáÊ}BBQ¦º8‹âŠÁ\Q“g€¬~ÕëÕXƒLB5¥x£‰(Œ¥É¡Ù蟶ñôwS8})Æýw4î_˵w ºcµE*‚ûBÔh4ºžš¦éÔ Çú…|èêï³nÿ>(Õà:È[m;ö[m®V½œR‚ªvû¿ýöÛX,!À©þ›Óíø£gÎüâé„»óÅñµiÁض‹YhfmJImœÅè(Ñ1ÄÐJŒ”Ôpž™F")Þ¥öAkVk­°†j¨g¢*H= DËÄòu x7Ï*Ïb¹*¯¯HÕS5– Àc3ÙÂ&ާF©ÀÕkÓmœ€¨ wpœÁ©í©PÒÔ2<ŒÀq ó\ÎÞ5u8õËÙyɼO›¢B-Š ÕA•Ëðä0¯°ãÌà<ŒÈ¹PL©kù‰/ÊT‚ˆ3t«ób^±G#zcYŠébŠÁ\ò>jñ]Ý6ÿ³6œþN§ßиÿ¶êþµ¤û75í˜nןmßµÚΫ«òÖÊ“@Ô ]ëÔ­û)Xë<]ëT¬ª`õ«W¬ŠÙ½»|tt„ .àwÞAŒ!LÌný;ÓŸÿó;»ÿwtŽÔ.0 Zl)nˆ¶1i+Œ1F‰‰Lm ‘LžÎÓ]RG’ZP_( µ èå!Úa¬¡†ê“Q/â3/×RÊ@U”¨ƒQ§ÍxPËßQ•Ôl(“-láhÓèT¥ÎÊ[˜Éf±e;oBN:¸b«*mñ=…D3ÀP)ôò¥®¦´ñëiqúwbÚ#ÆÓïhÚ»‘ÒÞ»ª{w̶êÏv4­U¡jØæ:u磂¨ ºV=Y}“{ÿ5õ±*\}ÀšÏç¸xñâ‰UŠýÖ`«þ©¯hݹsçÎÃõëבRBŒÛfWþƒÉôç~tsëÿmæ­†ÁZ¦6P¥3Å)¥]ĘH‰ŽCb$Ó%ÎSIá:‚¤¢[xO‡ ­°†j¨ODu³ñTyÛŒ{jrùn àÜÁ®m&¡_ð®æ¹y›¹ÍÆšµ‡ `8P•ÚÆëµóÄš¼ oŠ-G¹T˜š™—rT´åŠ=–Yx±šÉ=¤)êÌå¤q¶¢²yÝÁŒ¾˜Éçf®z¡€lÏ)å"j½8q\X†%—ÒÅD$"çQÕ,(ƒDYñ—Õ5ŠrEãôŸÅvÿ{1~#ÆýË)í_Ó´wSuïÈlZbÕÕoíÕV^_½é·È>5éi®úzúq «à¸ªb­ó`yï» ­u`µNŪçf†÷Þ{çÎÃÍ›7»ýΈ\øcÍÆÏþ'“ß™´ICUÚ†|’vÁI†qLaN¦ %¦b“£‹‰3­ u.FÜÖØ¡5ÖPC õœBTU¤hÆ»¶Íપˆ*?â•*§c3º´‰ 9éŒàÜ0ã¨m@kDJ"ù¨´éÐ((M¨ÆzÞ§Ò²‹éryÄðæ8særlAŽ/ðr€fºÛˆ¬ùžÁ¼¨P¹'p‚Ú®SË)åy-\Ž8Œ 'jr Þ„)û¤äbŒ[ßnÛýï¥púRJûW’îÝЬDÍÌ&VýPýë}eæI!êƒR“>nØZ]I¸NÅZ¬zì|>Ço¼qÂOÖ«ãZØêŸú«oݺ…ï~÷»888ènÿ¬s¯ÿÉÑä§ÿødãw‚28ZëUÚ–)2IHLddLAÉ4‘ŽZ&G‰’F2OwHÝ?”!q[‡ ­°†j€¨§ ¢^|ŸÁ“CÔÝâ—Úp¤Ê¢Dá]UÙÊ£^²Ù|Rà©€Õ¢ø¡Æm$ãQñRZ|"Uçä•L(ÚR"|—Vžl Q8ÀÀ¶@T1§2êÅ´¦Y‰eµ] ÖtiaNPª*UZ…RGÂdEÌÌœ´å~t€D3qÅE@~;„ï„´÷ÝN¿™ÒÞ•”ö¯%Ý»iº;7€÷~-`]¸pá|U°êƒV°*PU˜Z=Õ23\¹rçÎÃ|>Ï·™é+ÞÿòŸ›lývÍ•–P@ËSÚ”R2RRHIDBdˆÓVb¢¤çé€L¡D;´]à¶Z` 5ÔQï¢^ÂK¸ò¢ò‰ j{{9Œø!ª Ø\Æ6f;R™ôcòL=õÙSÔX Ýtå>$ÖtòÒÆ‹5ÛÉJf“ƒ¨™Ëj–"vÉäÚ•tsô‚˜õ¼P9öÀKtA°s€™tc^Èr_yµ¡XñAÁ˜+{¯¤5ºßÔv÷õ÷/ƸW jïzJ{ïšî3_çåUˆZ=ï+#ë|Q5=oеš‡µNÁêV?¦f³.]ºt"¨4„pd­ÖƒÀªX ª¸|ù2.^¼ˆ¶maf³ð»üè—þâæÖÏý ð·¼hë“´ÇL±¡jj%ŽÃ<2MèÂŒm’VbCI±í0¹+)BtÈÐk¨¡ˆzD½ô®èÇQ÷¶×sU!F5y[0“`&£Þª«'}¯f³.\¸€+W®t÷;nþÑøoþätë—6M椵I”‘¤MLqS¤ÍFxÆH‰®D;„Z§Db<¤ˆZ` 5ÔQk ªÆ<¢Æã.Oê^ˆ#»/DÕÑ/5¡ƒ+§ÕŸÄ…™›˜cr5;ÊØ˜ÉN ¹­×š9Ÿ=ã¢fBÉ«öÔÌÑD’ЖUF»¸hæšb:'ÌIQª´î›Íä¡™Ü1ýZlO'„Ó—¢î]NaïjJ{ïš:PÝ6’ãñø¾Ñõ‹xµ•÷¨A›Os6Ô'ºž°Ìl-`µm{BÅêç]ÕÕ‚÷ƒ«'y?ŽŽŽpþüy\¿~½ƒ¸ò?<š|ó/lný •í¸€V¢†&ƒV‘(!ÆÜ6dÚ!· !)r¦´&pé}fh  5ÖPD=U·õ!ŠeÌZˆšNó1OQ£ÑòúBT4“žÑ•ÁÄÝ >'Þåãj§š88šGËx™›98ˆ7“dB5óDªñ£DƒsR"ŒÎj«/+\9ú ™K4'€|»»ÿûññ÷¿£qïªêÞ»)í¨n£„l®z¡úµ:“®ùÃȈzVB9Ÿ·Çì'¹?hTNMi¿`?þ«žÖù¯ÖÁÕ“¼æÕcpîÜ9ܺu«{¼3”‹ÿáxã¯ÿÙéô×–ÑyåaJŒ‰)ŒEb 1FJÜbËÔÐjdžFdšf#ü£fhUС5ÖPD=/Uò£ Q¨†ó¦ÉC”W!ªi}8DÁ-Ê“™ä,)çàŒ¾Û.âóÐb§fâL$Ô„² QšcJHVž,ÓSöOå<)1gfNqÉ$æˆôî˜#³æÇïÜþ}{6û};;ÍÎÎÎ €šL&' jHõ!ꓚõI€®u€µºà ÂU°êþªÚVßü¾Îä^g®žôu=踛7oâܹs¸sçN÷¸ŸyýOM¦?ý'&Óïxc«Ô I#(-S I$%fEË1ghR’‡¤™ÇP†IZ` 5@ÔSQTåÑcB–ãa¢FMC>*Dy_C: D9³{ *9'Ýê=¢ìWbÄÃÕäq²Ó‘ãŒ%CÊœ˜1¦ä˜GÀˆåm¢šsœBœ%s"(ÐEQƒs¦”Ü_=>~ù¾{÷÷O&;_ýêWqæÌ™.+ꃌ7 ëùxO°úð½NÁêo_Ó°°>ÕêAuíÚ5œ?GGGõñíûœí¿˜lþÌòã‹caÛRCJ¼Ô -‰y˜4££Äš¡uHIM/Ú¡‚Ö¡5ÖPD=55Û Q#€Áûn¶ÞIˆò55õ÷TÕûHpâd9ÈX DI ô fâ Tæ6_~ "jæAŽD0*4IÙ”.‘Ä|[* fªÌíÁdô`¢9SuòÛ!ìþØÁíüvJ/½üòËøÂ¾€­­-loodæòºž½÷äq«ß"îßÿýkՃլ꽬Qï¼ó.\¸€Ùl–Û”ªúUçÿÉŸßØþ™ßï›+ŽÚ2IH¢-#©­Qã,JœP‚JHqÁ‹~G$&RãÝìѺ÷¬‚Ö¥!Úa¬¡>¡õR Û|N ªñ>-.Õ˜1–}—@••¨>DÁLøØ%‚ž*•ÌÄ9ÇXT«&›ÐEõ¹:͹Q¬ÐIsQUò°bqj&Ælt7d»Ð$©:"¯ 4˜á U½‚ÌhÍ_º}ûÕomïìY÷•¯|[[[ØÝÝÅx<c€®>îG X÷ó_}ï×êqªŠ·Þz« +M)fñ_ò£ÿë¿ßÜú¹ßCÿ®RCJ™A+Dj“11ÆØ­°` Eщ¤É!Ó¡5ÖPD}ü5‰“5.Ûƒ>"Dù<æ$Dù%$u%Âì}ZBT…*Ëà”œgË Djêy†¨<Œx TUDPö13fˆb™©ç!Œ4ç²0ºTÂ;MUÄ(Qº!ÉY¥*íB˜ b0g„H‰h€æ}JsÈ?:>>û~÷Áx¼ùÊ+¯`;;;ØÜÜc€®GªþÐæ'¬££#\¸p¡Û¾ÎƒÕÏ¿zÀú0Zˆ«a¥)%8³ÅúÑßûK[Ûçe¸RCR žÚ¦”ÃJ…Œ©dhÉJ´ÃŽ,âRG‡LC†ÖXC=…'lçíÔg¢üI¿Ôý J¤Ù€I¤›Ãç̨b,U©>D­ÂR*gB–ÛI:UJ´UÌq#‹j%D@F±ÎÞ3ºÍ€ˆHQÑÌœA$hrž5!.Áœ¨ XÀÊ(fê®'ÿØÁ{_û…ÅⳟÿÂðòË/ckk ;;;O]ÖÔ]O÷s{”U„£`­¬Õ ¬G¬Û›UU¶ .ta¥)%4%¬ôØÚùûûæŽH Ôœ…$­æ ­p7Ä4¦'SÛ¦C09Jò²ˆ#2 Z` õœBÔwŸFˆòÆÆzåÁ+åL€ˆrE‰ªå@æ€ÍDÉ€ÊÊ>˜Ý¢ Âà‰r½ÀW¾`u01XüTe+€UîS’QPæóåÇ KÌ 31…ƒäU„RÇÔ”–Ÿ•V¡@˜²jåD•fæ y¶Ÿ™Šò½ð?|;;£W^y§N©S§0™Lž¿?º>ôçö¨-ÂÑhôØ€µ.Åýa€õa¬(|XÍçsœ?W¯^í@k ÜüáÑøoþ›Û¿Ø¨Ì}-2… Z±dhMD‚RÒQÛ&G‰Ž.&δ‚Ö.Ý­‚Ö¡5ÖQÏ`Øæ³ QÎå(ƒûB”Xö?udô ʹ ?¢DDJ EqªFtPUˆ:¡heàëÔ'DŒ´:4Y@1æ!Ç+Ð¥–[xÒµÿ2<™å‘5ìœS0Áœ0ƒ—"ªb XV²ÄÊõ·b˜üèÍ›_úÿTw¿ô¥/ᥗ^Âöö6¶··ŸúðκžÞçö¤¬Õ$÷sçÎuñ ëf> `}ªÕƒª¾ŽVšRÂ6påßM~öÇ7·~Ù©´-5Ôñ;L R@+…Ç"Á1Ä£–ÉS’£‹#ÎR"uÈÐk€¨g ¢NäD}ÀE3Žî QžMÙöÄÕÅïQbÝm0‡%D9=ˆ’ÜBëRS*Ô|yŸ’UZzs$‚˜ÑŠbd•‹ù:‘T¬a,ÐUV æëªbEÕ2X2R-ŒàPÆÔY¡b°L…&“ÿíððÌ_>8xi²¿ï^yålmmaooMÓ át½¯ç¶ X÷KrïV± JUÁêCzÀú¸ÁjµîܹƒóçÏãæÍ›¢u†rñã¿þßL7_óÆ´VSŠQ¤•˜âH$ÌÉ8Š)(™*hJÚ¢‹³ÑC†ÖXDá)ûò4A”7RW Ê™8{8DåÑ/÷BTU¥–•}PR}TÖƒ(1õ *_' ¤¬¶)dêý嬩¢8Ñr€'HXÊ#g–¾+’ÍëZ¡Š,©êÆ P„õ9TÂ,ƒ–Á¤*J*¾*äß… aj4Â@Q•·SýèÍ[Ÿý•·¿ò•¯àÅ_ÄÎζ¶¶ž™/úºžî÷䃬 .œ¨}ÀzÚÀjµÞ{ï=œ;wh}Zäõÿx2ýkb4ýŽ'CLÖ’)0ghE¡ÄÄGQ‚£Ä÷ئi+ÑSbÃyºKê¡5ÖQÏ D5%âà…¨¼ o Q½$ób§™$W=Q÷¨ž™| QEe0Ñ Q4zÕS˜ªGŠå:¸„%+°¤f LÄŠB•Wêµ´ü„ ¢*Uy›$LÛ„Eé2?U&À f‚\[F¾-ƒ¥¶5º–Íïõ\þÆÑÑο÷Þ§üÞž{å•W°½½½½=xïŸù/úºžžZ]Eø0ÀêÖŒ©ÙlÖ)XXõ¸gå}¼qã.\¸€»wïVвÏ;ÿkÿÕdë§ÿh3:¨Ñ«´ jhÈæ%CK¢„DIABŒ ¦-J %ÚaÈÐë#¿ìi(¼„+/~8u<5ò)W¢`ŽxDiöJ„¨2¼pTšd"ytˆ’ü¼¤(Q¢ºzB0«YD±[©'Ì-º¥úTÚfye_¤ ï½=OE¦Y>VÁüú²âDk±ûÙÏ®U­žÇ/ûº>¾çѬÕÑI5Å}5ÉýIë£ÌÁú ß3ÃÕ«WqþüyÌf3ÄaªöçùÏnlÿ̿훷Ûl„(¡¥Â))¸íp܆4 ‡ 6œ§ ’NZ`}jÔ“BT©>DÀ«'D™‘O:;ïÆ(WVç}UB9a’}S¶ô>å¶[(Ú²W IËPcW'TÅ)KSÝ~Å÷”!ªK'Ôª j€€äÌXnÏŠ•õî0Vh³¦L` t VV¢ìWB4dH+З¡Ê´*f¤-Û†¨ªb„˜•ë€üòññ俽ys¾½í^}õÕNµú°½Vt}r¡ëa- WëFåô«æ`ݰjÖãä`= `µZªŠË—/wa¥1F@5~Ýû_üñÍo~Ýo‚ÖÖ‡)I$SHdK )H<&“„7)1BÒHæiÈÐë‰ÊÖ¼ë@ê›e¿o¢DIm§­¨¢$Ý Q”Þê9AE_wÛ:ˆ’¢jˆ"Ë>t('ÀÌiçUÍ’>Æê>õøª@Qû~ Á &в„ÆÜ•4IÌÏÅ,{§²¨oꕯŒ©ïá2£1?)Z~ÆÑŒ?uûööÿrçÎÖ¾ïûð…/|¡[!Ø_­5´µ>yàõa?æ£V½\«î«ª˜Ïç÷¬”ÒcÅ4<­`µZ)%¼ñÆxóÍ7;ÕÅïõ£¿ÿ“[ÛûKð·• 9Ò¡IÌføbžq(c‰vðež† ­G/ÿIý²‡Õ«=èúÖ Xõ!êS_ïAÔ©ž5-u¹€Õ•_$l¬@Ô»flÚ·TÙ<Dî jÁÍE†¨Q©…*wœÃÌŒ­½Ù¶¢H†¼Zî䨒>é¥+êÆ$­7d8ß.Ö€I=Y¦BTUJ´@”“ QjJ«í¼T4U„Ž–—ã„(¡ÀÈÚ:Ë2 R4M‘`¨®=–#Œ42kÉåCV|ê}™‰9 eÅœ‰I…ŠHõ1C¸+JP¦)j1“˜`Âhõ90!IvÏË„4(,÷MZ†'ëµýhõõw E%‹ùç`ùõRÀž2Ŭ€¤­ü\Y•ª y¬ ˜ê“7-+ÁléUVåËÊ/ÇŶõÿå;¿ãœÿÝ¿÷÷b{{{F÷ý"ú(¾€>®Ç}ªÿYüÞ“û1ŸÔlþ(ô´›ØßÏã:çðÅ/~ŸÿüçqñâE\¾|1Æñ¯ÆøGþðÁ­?ð¯úæïþå­ÿsŸ82,„mC M¢S'"a£s‰â¬mãXÇ1RD7gºAKÍ¡ê»é·e Ð;+hÛìµÜF´*6”ï[XÞÆç9Úáõi´F©âº_U¥úÞ¨ê‹úp”(#Nz¸U «©ç+JW'ÜgvF ‹5Zɉ‚ùb<Ĉƒ÷鉪FòõJTŽ*X¯DÕ\Q¢È^lB>®‹<¨í6C6²›()JTYa',^)XJ6…Õ'Õ3­—6]w?0¡u~­ÞíùØz;–íHv*W…(d0¬m¿ {$²bÅ ½ùwÚ:¯–™JÝecQÎh¦ÅÜæÑ8J0«-KRë(¢-ÁoŽìÖ­éæÙ³üêW¿Šœ:uê‰T«ÁÀ=(]ïçØ'Q°j‹pUÁZ7*'¥ôÀQ9Ï‚jõ cê{påÊ•î5o·~x4þ¹¿¼¹ý“¹§µ)15¦Äª¢cŒ”袴JŠ”T3´ÚCIÓGÌÐZçÏ*_ÆÏh}">yú`µ¢Tq¨ÖÁ”_9wñâ‹¢æãqPQÙ¬(3¢Œ}éT*ï3=¢z‰å&DõRÊŸ¢X¼O+Õƒ¤ Z=ˆcg&çŠi½Ëƒª0•Ÿ›t™U WnG}þy…_V‹ŠBUïå~k¶ÑÛÖ]^z¨2Lgõ®“ûP ©ìWÔªr|þ¢ õ¢Ê—Gw»e–=\œ›á/Üxwãgg³Ñ×¾ö5|úÓŸÆîî.¦Óés?t=[е XÕèþ¸€õ “ûýëY«Õ:::Âùóçqýúõ®=º\ý÷G“Ÿù±Ííÿgd\$µV‘¢ ‹˜âT¤M”(1ÆYÉÐ’Vb,äyß ­#@€} ÐY¨OJ´Ãóþ)ÓµWÁjTŠÙüÀ¦^|‘ë@ê¶*÷W êŽO½OˆZÄ“@”ƒ÷QFö'gâ0ö%‰•!ÂrD¹2 ø$DåpÍ÷§DI‰8XQì’г±¼@”¬x¢zÄ¢ 9΀Å<ž£j•py¿,*P¢J,BîØÕ–š•Ž%:e(m¿ yì©`¶ŠY½Dz_UœŒÕ¿T©òþå£3+a=˵ººUW²À(]òT–îŠjebfùŸ+ÿ<æÖ%.µÁý§×¯M.øF¾þõ¯cww÷±âè ëƒ~ÌG¬zZX/^| É}°žµ÷ýq¹sçÎ;‡[·nu¯¼ôñô¯ýw“é¯VK´Ã‚)’„1Æ(1R¢Hˆ› ÆDI]´Ã!5âd†Öº‡÷K„ž ë¹ýDYirXm¬*‡)/$ÞTåÙ*?¨òv¦ªFÝÝÞ&͸àÐŒ|\ˆ²19þ ÊŒÑ{i*D™‰÷‡¨d½Ä%±ü‘!jeu$/ù×l$ï ª® ;¡DõÊk8æý!ŠzÖBT1ŸgzVˆ¬BKçˆ"»–œÂе úU>¹–ÅΟEa[°“jSo¹T¤rÞTy^,æst@,½Råq–m@)í<ë,Й¡@]m÷I¬|_ UªŸ_å6Í-żæ}ÿÞÑ‘ÿs×ßm¦Ÿú¿úÕ¯âÔ©SØÙÙùØác€®O6tõi°ÖAÖê,ÂǬ'ÍÁú¸ÞÛ÷ó3¹uëΟ?ƒƒƒî½xò?¾1ýkz4ýͼâAKÛ°¡’!IŠ©D;¸bDN…o h…nÅᆬbÝ3ãðU@¿…ûÆ:<óõ\~zT¸ªªUÏ_Å>Xùª@yáJ¤z¾DåÔòQÕ€žWáÕö\›¢DÕx„ Y1²gõ3«Oùeå©ÂRöCõZzµ—¿´ª['|T(¬v Å%`e ô éÔÖ_~bT€b€v>«Ò„Ѳɬ ®u W¿ƒ!· A?yófó¿Þ=t_.‰ì{{{xKp€®ºžôþW=X`x¬˜†gMµzÐý\¿~½ +­ïÉçE~í?ߨü«´Ù¸h-4VJºh‡˜Â™„'!„DI«+'p)> mø€–á3 YÏÝ'Å*\UÕjû!`åR’ B‡ªÂímî˜ñ¸·½*R'@ÊLØS£úÀT¥¯FzšFêåÎL¾êƒ* çºËÙ åÄgI¥´ízдzÝŒ*÷¦”¯ƒ(ÍŠV Ñ\…(p9öEÊL»{!*~_E鲜XÔ¢µEv«âN@»•|yß åyzKP è)QËx(Lu¹Pö¶uE ×Ú+ Å{”*ëZìÓ)äõö%(¡®ô¬gPg_±µ¬LÕÇ13ÀŒfÈ`•·ÑЦ0ÞŠúê5ÿë |ÿ÷?ööö°¿¿ß–àó:Tx€®§÷=¹ŸÉ½z®j’ûû¬2úQÖÇ V'¾?ÍpåÊ\¼xÇÇÇ!@S²/;ÿË?º±ùÓ?ì'ïÚ&•Ð0…˜ÃJƒˆÄYˆ‘”("aÚ†˜()VÖ‘¤êwRU³êjÃãdýPi>/õ\}*< ®Jô¯"/¼@—’ˆ*EUhFÙÚ’£T¢*œNÉr}a&f„ÙŽT*4¶ÚGÆ Úe ̬6Kˆªm½èœT8ê«O,·O$çê}I·sL€ºëª û¬¨\4+)åX\Ê2¡œ,Õƒªµ2;O¸„()³ï`‘¢ö¬x¢žX‰zbˆâÊJ=PØW¢¤(Fýü©>±(Q5c ÅÐу—ÜÞ¬jV·ª¯PÑr•Ÿu~ªzK¹Ú)U'ÚØ½ö6ÉÒâ`ZàªPk)TÐ*šóáy^U ªd ƒÕÊ øùLþÔ;×ÜñÎ^}õUììì`ww÷±?Àè ëÃn= °V¬þJ×§°ž&°Z-UÅÛo¿‹/b>Ÿç Ö”â«Þÿâml~ówûÉuRÃ$IÛRã"1NEÛDÆYÌ µ!1„cSüYA$™újÖ Ðšuè:Èz–=YÏÓ'm®ú§K€x€ röl…+9T·µ%R®Ïm"Ó‰‘ª"f²Ð‘p¤UÅ’`Œc0[nó^Šÿªçòœ;uMm„9i\¢Ì |Q©j›PÊáþõš®m&ÎåU{©7h¸¨âDxDUU©®ÊTª:æ’gϹ^b¹oúm?Ëm¼Àïäê<‘%DåòÜ:\Qýû^ Q<‘)uˆêeC¡zšV€‰yœKÓx1ž—vÛR‰êÁRÍ7´e¸g¯EˆÂYÖ+2[œ–¶\ˆ¢rTª¸T¬ÐRwç] 0+P™ðújUýè±îs(1HñZi®¥¹V|ëÎ]þèµr楗ð¥/} »»»ØÜÜüDÆ]ÏÖÏâq«?°þ=Ìçs\ºti-`հѰ>.¸zÜûH)áÍ7ßÄ›o¾‰¶mѶ-Duþ{üèü¥éößú¢óï6T󣀯0CÖ8¦0#cèµ qD¦p$iI7p @êÏ6<ô–†÷g²ž›¿öþýXšÙ;¸÷T« WÇ››®‚'iSrS3¡Ž¤m’£™Ð¡W)@%£¦aTu]ìs’̺–\\(–„óT (Ç@Rœì—râœu¾¥¼ˆn UpŽÎŒ©À+lAºôñX (CY¢2<ÕxQfˆÒUÙ^U ª*V%ó Qä×MéCD´ %n9¹:ï¡ÕW¢rϮ窞(öâV ŠK`"q"¡S–ʘ¢œq ^èâ rºB?¡k÷¡¯jåv\–îN@T¹_òž–]_µÂIÐÊû°wŽ>Põ ª~ÎsMŽ[ïK Ä1XQ­êÊÀŽÀPr°aø©7å¯ÜåWKÃþþ>Æãñ'0èzzÊÁZ7‹ði¬§YµzP…ðÆoà­·ÞêÞ3¯vø¯4ÍÏÿÔôÔßÝ;¤Jh¨a‘<µ‘0 1B$T5ËÑÅ(ó4:bj!©ß2<ô, _ÎÆ÷Γ…g¸Uø\üe¯ƒ«í¿ÐÁÕ{gÏʧ L‰ªO§Î¥ Q2¹VÕIÓäëê]ðêÆªÍ;z“¨êXZ{M):“.XÓ\7ú%™I¤¶íÆÙØîjK/ãJŽTñ8‰Å&›Ïk¾Tª@— IiòøºÎ7%Ë `Á¢ŒVŒè¨YNpäÕ€' (P, õˆ*sñh,_ÓÎc5‘?L‰º¢Š«v+õ´[å·T.ón]Ž{-º•öœ±K3·xJ"ú PUˆZÞ{KvR™ê`êÄÇ[yZ}@ë°(.EyZû÷ZÔ)Y¶s«PCçÏÊ÷^–šwRâŸyç*ÿIRV¿ÕéÓ§áœûؾìè ëQÞþø›g °žU°Z­Åb‹/âwÞAŒmÛb¼÷oøñßø©Í¸E›y•¶M)FJhD[Æ"%†x*¸ö’ç1ˆ¤ýC‰m¬ õ•¬»+õ,ªXÏ `õ[ƒ¯²‘GÕÈö¬¸”ä0%·×ƒ+¨:6 )yªwâÕQ½‹^U]ñÉÌysBѬjÁI5'IÌOVÞÌ×Kg™•W0q®»Œ8¹P€ëŸ§´óÚññÙï¶í™7b<ûvŒŸº¥ºw'¥Ÿ饿ò/ŽFG^€˜["’Mû0ŠJM"ÏãWP”/±º2®„cZõ;-÷aöO˜'0EqÀ•vJÌÁc@TMN_®¾{ˆ"±ô@-ÛK5ª"Mné-Ûy=ˆÊR³©zJÔªq½Q_}õöååî¾YBh{m@ö~+PÕ˵_¸:}€+-Á WÚûOà©·brÏ7¾"þØ[oËÛã ¾þõ¯cgg{{{ý k€®§°tðÔo > °f³.]ºÔm73Ä?tÀú8b>Šß—Ùl†óçÏãÚµkÝû¸ \ýwýä§bsç[¢¶hDÛªfÅ(C  ¡ qW\9OþXâßÅÝÒ+Æ÷€½Xi€õQ¿ë©WȳåÕ<P@šý}w˜’ktÓ¹èDÕ…ÑÈOSrmÓxQïÄ%Õù(É‹:¯N=E\cæhâbÎg¥Éy3iM¼— &ÞD’˜« LĉuFv%Ò¯”ˆÐ™ñWçó½Ö¶Ÿú^§ßˆñÌ•Ï܈ñÌ-ÕÓ­ÙØ9‡ÉdÒ®^½ŠùÿÙ{ó`YÒ´¼ïy¿¬};u–»õr»ûv÷LÏíe FƒQÈfÀ`„ˆÉFƒdŒ+dCØb˜0ãpˆ0Ø–l 6«h„€™abÚK®”(V –M7‡Q¨„6*]óQd³RÇ«Hƒ(‡ Ë@”ºü\æüF2‘pÊ·{V¸X'äXIP#—Ê Þ1PTFTYLV±bõ‚þhk ?zí­=òÎ;·/#oŽãPáyÜ>?ðzôþ`ûedæ¡wËY–z½Ž¯ÿú¯ÇƒpñâEˆê Ä C¯7DùJ—;;àhcåL¸`-?¸à5uœ§O÷܉œè ®¨Ò`~m-h A> ƒ\TÌ…B®?äE.— ƒ /„ȇa˜Bä…y’"')ÌK!r$e.'D®/)O‚"¤ úD9bm¦Üg»íµ/w»'.ôû'Þ Ön‡áÚÁ`í¾”Ë!ËårF…Ò ¥ÿiˆÒÒvrä3ãöíÛxå•Wð=¹ÜË¿pêä_Fãï`B0CUÆ#†`¡)"ÁQj¸ºŸ£@ÙÙzJ<Jõ‰ºýÌÐaRIæ&JÀ,Ðéæ”Þg†ë”q¢Æ+Qöù¬•„(]Σ˜Y±?@™ç%*–9‡/²÷›“4’§,Û÷gâÊ%Ž,{; }9pB@ã •ûC%A6ž*UFÔm†„±½¨üó»÷ðÁ[wé©w¼=ôVWWQ(¼ªã•®¹S°²šÜõ¹T¿f׃u Ö"Õ¨uß½{.\@«Õ2ûöL|öïæÊ¿òþré«ùPöBôòƒ°;¢ßSJQ·ìý.DXÆF¸„Û€\Š-~£dÍ“Š5ï –ñ^½¤Ô« •Êá„Ø ¢ ¥ÈU*A/ sµB!'Â\Nä ‚ ßP‚òEAùPèypž$ò‚9ÏBäC¹6…¥OlwN½Úïž¼8œ¾Þ-åÚÝÁ`mCÊe ù|>‚¦Z ¥R Ë¥Î( Êår©¥O Ú`œ¶Ü»wwïÞu:½ŸzüñË’PFž*B‰€ˆ‰¢L*Rá™baŠf×é®?hãzR*rÒ”ó$«r¢6‘;ÙQQÕÐŽq!‘€QÂ\Š:ó,ø²‚0iUR2…("c7J”jÛã„g*Òz´ʼn,)£DÑP9 ˆ¢„Å”Q.01 q•ûµZ¯Óñ¾ÛZ# XÚ‰œ3‡R£H·[ÀLÆ­Eê{]¤^i÷ðÁ›wè_ÜßÀ³Ï?'N˜ðÐÃbëU¿OæAí: ¸™·r`–u¯­­auu7oÞ4a¥wz½÷~¨Ûú+¿Ùkü¿(•~å{sÕ+; @†T-HôÁ]”¸TíJ¹ n\¸ðm@œŒº iU¬¹,UÔ|Á×"c;ÑÓÊ€©Í5!d_…BÐÜ…(ô‰ E!òBP!$*Ü`®½´µõèëƒÁ#o Ü ÎÜ•òôƒ0<¹%å2¢P(DÕh T*áD©„G••æ H~£ÊzP0GÒï÷±³³ƒ·ß~?°T¿´œ ŠjpoEò˜õOBŠjXD¥;I¬›Q1êF‰Òu3׎˜yé¸2ò8ìÆ°žŸÇ±²š-Ew`;è8µœÇ“ Êú±,DQ ¨,DY2"×ø4Q®¥I1Lœ(çÅœTI%jĉˆaûKµæñNŠ(›–C…h ºXíT [¬nïK‰¿z“>²ÓÁ»ßýn¬¬¬`uu5¼x”]~Ÿìv[§Ù>}=È×½>«i×MD8sæ N:…k×®áÊ•+èt:t½ßÿ÷²½ýMÿ"èü›+V~å¯çŠ7Zp>?à|¼)¥ Ðà›ò€.)ËO=ºÆû˜†C,£|K€(EåÁ`ky9X à].çrƒA¾ŸÏç?-åÒGwvž¼†çîo0?¶%å£ÛÌ·™WP±XŒ•ðܺÅWCTZzð^?´î‰d}}o¿ý6n^¸ÐùÜŸl„)E%¿œ¤êøcŠâ"ï6«9v–¢PPŠÏÓƒý9JsWf.PŠ 1´ÊfÆ_ű¹xÆ´`ëö¹ÝêÙˆ¢!±IEp¼œ7¬ÂDCJT²œG# fžpn‰?÷†–0ý3;eAûÎmºèÜA—¡:õsì„!þ³+×èÓ‰çŸÍf+++{:!/Rל//Îî>I{N†Œ&; õc’%Býz’sÝaÏ“._̾H)MXi·ÛE¯×‡aç üî?-”å½¹Â:õ½¢º}êvvD­~[@¸È;*#ë›U©p^Ê„ó¬`™wú%¥`]è¿–^žº¿¹ùt—ùÉ~«õTù‰>ó!p‚ˆP,QªVQ,Q+—±æ@”>€ÓT¨½BT–ohƒÁ¹\½^ívo¿ý6~¸¹t­ˆ¢Ë¢ ‰H„ÐÆ&eüfÔ3뢌mY'WáÒ3ò\€*Š#l"+æ°Q¨Ô '°3 r03ó´çŠª×Å1dJS¢œÏD!©"Ù9~J‰¢„…a%ŠÆœ&8qìºBWB‰õ-…Füe$\¹eA¥T™ÜP…«&iOßÈlU+µ®õþûò×èbÇ×}Ý h6›h6›s«txUÇï“,Ûå~Áp ZÝ:Œ‘P‹ Vú1Aà‰'žÀ#<‚+W®àêÕ«è÷û¥ËÝîûÿ~§õÝçDîÿü¹Ríÿzg(eI°l‚ÅmÔƒlÉ<@E€žpÀ‡£”€¹€«¹V°töÕy€^TÑ /O¿|™ˆP*•bÝyZ™*‹¢’ ÔACÔ¤% C¦§Õ«;—. ^>÷Ä«õhL4˜„°c`„Mw4‘Ðc["ÄQª“íâD#À7#zl\½r¦ÎÇ”ûâDp&Œågx9%*q8³s|ÇŒå”P¢N*ç9wb56fäÇŸ&AM}1b‘ ÑÞæ¤J¥ÿ“qSE¡¢FÉÒ€%u’»dÜì ð7/\Áz¥ŠóçÏcyyyO1 ^éòJ׬­3©`%ÏÛ…B!f~w«Ýn×(XA€™‚¥Mîã,ï³Ú¿Ç¸a¥ý~_ß¹sNˆ_þŸòµß|w0ØîïˆÁM´+@¿„;FÇ5»{ë —| ¥hÎ`ÞûÞ÷ŽõC¹ß,}c ÃA ßïõêÇšÍõº à Gª”DF22ß³°s]΋2—"PŒŠEÚ-åf‹)Šg>A8ùcZÑ20”n,W!¤š(^>s™‡¬'Êδ¤— Tw9Ç™kÔ{éÄ? +Q™¿–Ðd¸¢4å*~† cf·Fuf"Ö~+…Ñç“tÞî÷ñ=o^ÁNc Ͻë]X^^Þ×™‚^éòJ×<ì“,ÊÕa)P‹VYW,ñÌ3ÏàìÙ³¸ténß¾~¿âB¯÷ÓßÛÝü{ ñÏ~¥ß{oÁ2 ¯tÒŽÀó9X‡±¨äv¼Gý?o:Ý'OžÜ×vôƒ>yôz=äóy@«Õ½{÷Pê÷Â]yhŒ¢)Í9yÑ%V(ˆRÃ#šrF¹VQ9O÷÷™ò¡â 6å>…@Î ÕžQNîªT,b]~*Æ) @Î w¹'$}D)cù(Ê>Ñh%ŠÆ¡Ñô*Uò‰µ‘]8 ¥s®Tg$¬Í) Òp¿!qädc›* 0ãB»‹ï}ó-„ËËxæïÀòòòž3®Ð±@̸ᜠR‘,ƒ„· vœ2eP¢F'špwÊDaö½¤ ÎøÄ¯ßÖïËcЕ. B‡…R4Ð’ë°v|i;‚«ú™‡pîܹ=¥³ÏÛ…þ8+,º²½ÿÇ 2æ­9ä ·wuu+++¸}û6^}õU H)kw"õж¢pqŸä~‹6¸WÊ@cøj&O¦NÅbÑdµ´Ûmܽ{ÿàìÃ}ç‰#%J¨ë¶„“E6[*Š­ ´‚DN¶”Rã@”HB”SÎcGÑb÷©àšÂS€‡5î Ž“šNOpÐH%*­dG£E)÷à o/»[5åG!–Ð®á ¸2å¾á² ›ÄnßWÌøÒvßûÕ˨>³g¸šÇ ýqQXˆ:s4 w® rf“M,Ç™“ã‰Ü)|<4*™b£ gLQªì4¶FNNN3–Ódš^­¢Ì÷†+2p¥7YgW™ð0CaöÿlÞÉ(MO?÷….^|ýʧNÍ \yèòÐ5+Û6ê|?Îèžõúà}V³±Í Ð=€¶£‘x ïÁ:øå%%^pk”Ã&ÍËÉ´ÛíšòN†èt:¸qãþqsIæÂfQi¯STŒ"4@E~&ÑmìQ<äÊ*'vL2 Ý1šÇa‚F)H`*£rEc@j´5é}—JM|Rî¦Ã î23¦uÄ:ÉŒÉÑpÅêqRjãíN/¾z…µ8wîÖÖÖf®#7z=¼øåKè/5ñÌSOÍ´rå¡ËC×An™ ³©øx°:Øí ± ŠÈè^ðªóÝÖÖ>/:¢á€‡´ÃPÌË ¦×ë!—Ë™õ¶Z-ܾ}ßQ«r#¤áÈŒXa¥NE…‘‚¥”­H½‚™MdG³°™³¯JS’hÄíé@5ÝßìðeŠåD™’<=D_“%+K9q„1»˜•W$+ÐRÓÎL‡ QÜsµÞào½z•*žyúi4›MÓm:/Iغ«ã Wî²®: ßPgןžñó×\*XNDÀ-€6™)?ßêz½ž™ÛÛÛX__ǹßP.ë>Óô/õleãíqÒBuNÅGû¹³jب=mØBš5Bù‰wÌQòo4ÒôŽq³k0²—ÅŸ²ÂLBM¯T¹7¸llZXò5²ã_g›Ê®§<ÆT/ W=ÉøÁ/_›ðÜùóh6›™7ÏóÌ7¯ty¥ë°¶ï ¶Í«V‡±½BlAR «s”…5× Ö%€W?7G°ã§ýVçŽÅaf´Ûmܹsßߨ³Jó&†òGQT:2âRp´jÂBUŸHß?¡ÄW­‰«G”¦D9* ¥<Åþ)uJ)2Z¢Ä:Ç*S"E‘ã)ŒTÌÈUá´À7RusÕªìJUŠBgI»¯Yè¿kuŠL™×M½WEAULÑm’?þ•+øl§w½ë]h6›¨×ëÇVý9èãp–^¯WºŽr“ŠÏ~”çIµšçíꯗF” ðÑ_½½‚µË •ä2ÓBlÏò7ØÁ`€0 ‘ÏGZ[»ÝF»ÝÆN«…¿yâ¬òNqbF²jùw? dU#&gÒ²…x4ƒñb©ÛX?vH‰mzOöÏô>V]JKfŸfdÎDE+Ûd(t»i3€éÔ K¹W?KûãÏ^¾ŽÜoá…^Àòò2ÆÂ)‹ôz½ÒuøïƒÏ³šý|œò`Ñ&@/(¸zŸö|0ï™ê ¤|Z)W5 ¤ÒgíDßét \13vvv°¾¾Žo,—p*'œÉ7ö‚nüW´„QŒŒz¥Õg®ŸöDÅêf‚¦*P"#aLï#ajè®ã -@M§)Ž}ŽÓˆ‰ºpEL&ƒ„Êâ13Õ4¡”ó¯^½ƒ_¾zÏ?ÿ<šÍ&šÍæ‘Û÷%ÆÅ…®y…½ƒ>ïû<«#ƒAZpŠ*s±Ìµ‚u!*Ò&ÖÐâ P$ ;³€Õï÷ŸFJ‰N§ƒ»wïâÇ5mÑ´ª¹~i'ãÊ 5j•†(Šº ÉQ®@cT§±P5 šÆy¦&û·Ò9g E»€§,ž“ «¾Eq4ÖÑÆa0L)׿]9!¢fP3ÇÜVQé$zÞ?¾ûÿÝ…«xæ]ïÂòò2VWW=ˆø×ºªÓ¬нju´Û(KTè-€þ#D]„ìÎoó€µ÷÷ˆºÑ;ERu‹º‡óMfÚ¥×ëˆbåÁV«îvñ×ë'LyÏ4ú+? Ò¹Wº±^ @y¯([Â!3ز!àx‚F«W”¨¦(ó%€†(ðd‡“ù~+*êšÚc#p´Éݲ”3KⳌÕó¼²ÑÂ|ùžxòI3EÞýüÎÐxèòÐuÔÐu˜çvV³³½A4s;Q}>Ñ0“q sX?­¨õ=ÎmÌ4`&Ìð‰¾×ë¸`ʃßZ-£*¢d+ &Ḩu·%&m䦘 |8f€ÕsH!ÚTì.œÐ!8.´4+ í¶RîK˜¤–ÅÕ+ªS¡«~q劙‚lf š$0¸Íƒ×Û=ü½/\ÄÊé38uêÖÖÖÌè$÷äã»æo¶¥Ýnãþýûø÷Ê%Ô„€uªÇó¬„;âV¹2]…ä˜ØuYQÀÌ!t1rÓÅ'AUÐ27e¦ÝÀe™8åØœŒq ìÜ ?CÉñ7dÊŸ f÷±;LÛÙ]6ûÙ7¯âO7vð / ÙlÆRÚ‰Bˆ}»0xèòÐå¡ËƒÕz” YŠM:9 tŠ;l’:;)î”ðj¹1 1<`™h3Ýa¦`ŸÂƒ8y A`ž§ÓéàÁƒøúRˈû¦ŒrE6²Áñ]1œ‘7‚œø˜‘1pBHÝ’ Ã)ïÔ+«PMðZeðaí0©\eñj!¬7sB1Kî–˜:E:‹áv 38:HåqWZïöñþ—ßÀò©Ó8yò$ÖÖÖbŸ-ý5¬v‘R¿=tyèšf½Ó@×~Éñ`u4 Ô÷ŒUêý"£û,æa͵‚u ÉX08€™D{9yèò ÏÐét°¹¹‰ï«”Ô Áx ¨ ¡øÚ¨N±!¹A4£³é' á@Ä4P•I¡Ê66‡²ªR™3¯(3@¥v:p%Èù¶ìÞ#Ñ1¨‹‚0vRÑ ¬nÐ?+È–Œ¿ÿò›Ø*–ñ®ÇÃêêj,ŽAÿžöÛù"¥~{èòЕe=RJsl¹¥÷£ôãz°Úû〶sf_Gg~™[ë%€Þ à:@f’‡8ð1ëÉ£ßïG;Y•ûý>úý>677ñMpà#1D؉[0C•I˜¹ƒ¶$hCFu¹Pƒ Ú''¸Sæ.ÂéFãÐ~tf©Ñ¦wó`÷kOš©Ýt Šèw"B$21ÒÔi«\E°ô¡7¾†Ïmw©]ûÖûܽ ¤©Wó¤&xèò¯u?›Ó*Vû5 ú0w`uˆ@F@2ZŸlþ˜™ráÜ#’ß§vðãÎßêúˆäC÷€:Ì4ì´ƒ±ßbþ«­­-¬á¹b!êÆ.8R69¡¢ÊÌNÂñZ UÔÖO±˜3ØÙ‚̾AÕhc;á`Lï“@*~÷ìs iTÇ ˆæ Ú¬+Çün£®ìý]á‹Ýy€_¼xÏ=ÿ<jµZlßëÏÆ~À•‡.]þ}8ÈðªÕÁ¾FíÁª;·Ý‰XÀ+XµÜ(h pL’ûQÄaBJ‰|>oÖßn·±±±÷UŠN‰ÎgÑ@)™WC&v²ão¬‚EÆ¥{Y9VthWXº ÇAؤ¿ ÏäšÖøžø1njOéd2éìnº¾{O=kH«VÑݯ·»øÑW.àìcaiiih€s.—3ß”Ã0L{¼ŒS²öË›åÁê`_㎊c*¨³ø%uRþ€¬Zš@=T€BgvN0ÉîAfF¯×ÃÖÖþÝz®Ûœ…ã£JŒ¾ÂQª’£qLø¨0³þ«DIPC×ÔP5ù>4¥+õùÒ )…Øh·^­”ûò(ãÄìAf5àÙšÖÙ1H2Ií¬î4?òù7Àµ:Μ9ƒ•••Ø <©\ÍB ¢‡.]³þ>dí$ç¹rçÁêà·w¿^§š²‹&€pÕùû}Ðèþ,—êE9Ô°ÍL o ‚íY9Á$ýW½^ý~;;;øwN4ãÀ£"„pÕ*ŠØM×àPYѪSñ8wĆ<Ó¸ÑIq )÷¡±@5GkÔßÓã«öi´ŽsWfçõ겊•p†6ƒ»Šd1C¼=Â?ô•¯á•í^xá,//Ç‚ 0¾+)%ƒ ]ºö°}»)¯ïÇëð>«Ã}Aâlþ,¢àÑY=~æZÁºsdI*N8)æ F—]s§ÓA«ÕÂÙ|§óAÌse é*ÁÝQ­XýÎfæ`Ü+!‰g¦wP=–âì± õj4TeŸQ8¶hUj/£uàŽtÂD héŽA*ªW˜E¸Øjalխݺ_ºpÏ>÷êõúPR»;s0 ®<`xèòеûíJª[¥{Õêà_£•PG]ÝZmFMó&lôÃ3š…5/€{ÇnôW¼`IíÕ3UJ làÀK.“N0ú¢é^Huyð}åb ®ÜH­4éðд : -H±€Q»¬uK˜ò pÀ"濚U”N;”¨2ÛSçNÅ0¥é=yc®È+˜cT;­t‹!;YWvh³ý[äź¾ÝÅ?üü8ûØch6›X^^Ž­½P(˜’Ä`086³=tyè:ª×š\wÚ¶L:Φ9=XÍk¬Ð%ªÕH`™ùe®¬x ÀS‰Û«Â=0û}ëü+·ý¾Ûíbkk ßP/ •#˜‚Ü,„ˆÝÇýGBX5Ë….ÃlÂ1äÌ+ÄXõ*½$Hî“Tã”'J7ÃgR¥ho)îJ©‰;¨ô5Ò&á€OšØÕÜg™Hh`¡düÐg¿ Ô8}ú´ñ]éÅG)¥D†0±Øó&ןXÏꓦþ´Ç%·±¬0½…IÅgs_½Ÿm—b𠛬ÏÄV±Bô³îüÙWßÂ_¶º8wî–——‘Ëå̉\KkUܯ [òß,]tbÛü>ñ¯u/ âáj÷Í~Ê[3쿚;Ë]n©AÏ÷˜©2æ >ì»[öÑ V¯×ÃÎÎVG ùX7 ;0CÂB)µÊ¦´“Q¸Èé4]0F²*O¬,8)ba_2°Fub3 'Å0Œé0L{õùˆRñ1T³c¿"kjßÅü®?gŸ¸}¿ôæ5œöY4!ß•;ì»×ëÅL¹^ÕñJ—Wº¦{­‡f¬fï5¶Ôû €Û3þÙž+Àú0@çÍ!ÜðÀ1¹Ufä„¥• ¡áHÖöö6¾®TL$´Ç P7Á «Ì5ÆQ“Ø6y(»£rFø¬FÏÜhQ`ÚU\Ã0  [±Fçj¹yWI¸rMì h,¶Ô°6 îóHÖ¶üØçßÄÃ<‚f³9”wå&·ƒ¡Ž'º˜-Ikîs°òˆBGO7ëñ †;»ê• X/” FuŠ~°* ;cœ² GÍrÊo”,ï G‰"mn''\4¥coŸ *úeë"œ¦†~œÞ‡Å‰Õºö)WƈÅ`&'˜lÀê¿Ñ#¥ú ýÔ.ãAPÀù‡Jõ]  Ü£"¦ù†¾Èž=tyèÚ-XeÝ'‹Vóø:§ÝTÌHGá\x°&í©fséú Þ‹G@—ua† ØÙÙÁו"ÿ•L”ý’‘ ¬ÇárüVP3 !DBÝÒ~.‘ð2 û¢Ü;HóY¥$Èò^iï%ýQbœß+Ý+•¶n ”†|XκҼZê~LqšÙÇpòÆD¼KÐ:¬¬aLÂ$›yL f|ìÆ=üÖ[·ñÄO Ñh å]é®A Ú{ýÆ}ï_òûdÀk/ñ ‹ä³šöq‡å³Êò«¨b ÀÊœ|6sð˾}KtÇhKxîõzx¡\t.êÑE[g^i¨²°%/¥Ï-ÔƒŸ ØîA£haD<äNÂÌÝ…Ó(_£Õ©¡ù…iªeW­’÷³yWº•PÁQ°d¾ôPäXwÇÞh ²Ñ ÑÓÞëöñãŸ{>ú(êõz,qZû®ôçà8Íœ7UÇï“ùWº²¦³§×¢«VÇà5Î¥,;÷€Õb¦"€2€Þ.¾¹ìç Ë-ÿ$ îårhæg$NÜ?eÔ ¡ÝÁÎI%&ºMij´Ìïqs;M‚ª‰`D‰²ât06ò™f~aÚ3Úu\E2Œö³Ö°œÁÎ6‹-ˆc;ð/_@»PÂã*’Á]ŠÅ¢) †ahF'Ö‰ËC—ß'‹]»±Ã†›y«£|YÖÛ[³8p+Ó;MÌÔKx°’'ƒþÐèü+}aefôû}´Ûm¼³˜Oø¯\Ð1Ã;;`eË‚qc»(eg¨3œÄvÚ“REÉi;Ø×îÂqêW˜Êôn§ß$憜l ËŽÁ‘Îó0G#œ`|äíÛøÈõ{xþùç±´´ •Íçó±ß»ÝîL\Ø<`ø}²›m›UðÊ0šö·Ý–Éæ ¬Ž£2'jÏ™’5× Ö*€%ö"жŽìĦýW®ÁÝV©`FߨQ÷ ›æy‰DºÇHw j·“½&a„˜ì‰íˆáÇŽÅÙ‹~è~Y`jº¤w´êj¶“œ ÎpW Vlñ NR;«`Q&ý;ãV»‡òù 8{ö,êõ:jµZìóäv &#fí¢ëÃï“yؾ¬ð4éîËÇ =`ô²Õ,œ8˜Ù\HÝw XϬÔb¡—Æf%lþSügmbgwœŽÎÊÀ Єkj7JV¨J¹FÍ#œR¥2ìÇÕ>Å5ÄjK¦4hzJتWDF™Ò[ÿ$ÈÈE –®aøÇŸ}\©áÔ©SC£pÊå²ùü„ah†~ÏÓE͆ß'ó°Ovkà?ÈŽBV¸î2€vü¦§| }þàŒÍ$œÀú€;¿?;—ºÌûöQÙí€g½è¡Î<êt:x¦´ïî3!¢Éü+@’ˆÌï±’ clWeAJ‹k€ /¥:Mš7˜qðsº*fo£, í¦RAPýÝVÿ4„*®ÒcpTîU$ª•*'ÊúyôðfÇsÅÌøK7ð'·6RKƒ…BÁü®ü÷Ûè¡Ë†ß'£×»]“î8ã VGù¹Ùïõžð¢ûYÀìÔçRÁº Ð;Óþ5é âueðìV¿ßG·Û…ðd) ¥Ähkt)cl¬é‰TRBô³Q·œØNU«ÆtN‚ªŒ µëÙ…É¿ ý†}ïi íI_•Ð_eÈùZ£º)‚,]$=‡íè›(PÔÆ·ßëô𿼄³gÏ¢V«¡Z­ÆÞóR©d~ïõzû2kÐC— ¿Oö\.xƒ&3cNÀj!T«ŒËK}ó )Ws X©KÙ\n;j‡}âÐ DdJ„ƒÁÝnç䄚ïDZ9ƒÊ7%UÊàîæAé`R&”ø™ÆÍÄÑ8Ó—iªÇ¥­3ýo4 ¦ÆŒÍIOkgû}w“kÁF±Òw¥·«!üô+—–*8qâÄPiÐ#¥Œu .¢’àÃï“£Ú¾iÌï³°øràxàͺ|xÆÊƒs X#Jnï3¨:âKû¶r°¤Z¡ýWNOšùƒîXœxy/R¦„1Të sˉH %¶àa;§©Wp:ë&š×'ggöâÏJ¹= ~©JWâÆ‘ií/ š¤v¨HOì¾gêïlcGuá§nÝÇï^¹gŸ{õz=V,‹1ß]§Ó™É“º‡.]~Ÿd{þÃ8~=Xíý1WgªŽ‚µŒ(ûŠT‹XÁQÒ:·òÖëÓåAWÁz¬˜wÒÈíè=[z೤-å±2„îBXÒ³ )Z¹ñMŒZØ5Te|ÜᣴÛBí9sßãD>šÉH<‡… er·ƒlV'IçFêU7”ø'Ÿy§ÏœA½^G½^7ÏJ¥’)-ôûýÌãpn× V¯æ}Ytèš%ÈðЕ¾}»4o`åU+sŽºCa ËÊÙ‡“LZ!3# Ct»]<¾ZqRØ-H w– ú¿PÊ–2JÂQ°È‰pH™õGi*ÓnAk¨»0 T‚ Œ¯Œsþg‡Ü°ýI¥µ[ó=k×:Ûq8®LH»‚+}—¸¼µŸÿò[xì©§Q¯×cWÅbq(Pô¸Î}[´AË>}>¡kV¡Ù—go{=`ÍÉEÆ-Gº Ì)X…BʰcûO·|kzdÂI…ãÕrfÍ(¤q†u.ê eª)@‹Æ)TFê¤ý]%Œ‡/v JÕz‚èfÝ5¨NÎl“ÛõCâÿ{Õæ2–––Ðh4bJ¥[Ô0½èÇÃq¾Ø{èš÷?ë"¥<²®@V‹ VsXî¡ñ"€×fð"ã*XnȤ†¬ÓÆäîHÔ ¬8Ç e*1G«Sz.¡ ¨ ¦”0v¡kRg MsÐPE{ MnBlÖ '=¼ÙùÝu®T€¨6·;%H@2~ÿÒ-üÙíM<÷Üsh6›±òo¥R1'ofÆöövlгÿ"â¡k߇ÃZï$hÊ:‹ð àk|VGWU-Xû»| ôAŽËØÆ€ ¨`Ï‘î{ü¦ä~x˜Ùø¯ŠDXʉØx‚5HCA¢Ž¿Ê %`VµÑ¢Ò–®,•V2k^ŸUMë´»€ÑT~ä ®b›¡g ’íƒM÷ -.F/ËJW›½>~êsðÈ# Z­Æ2¯ … …‚9A'3¯Žó]]ºŽÛ>9jàðªÕtK@€qCñ`Oî°²//t2qÛ63RæÃ”…ÓJ„zLÊéBÎø«â¾©D»“‰e äãI)YŽbƒ JÏ£D´ÛÑ8é>+Ú TÑø”÷´¹ÎÉçs$Òn,3DÐ`–….©osœ[JÉÒcq>ôÊ%´‚<=q+++±“„ [ÌŒv»í/0ºðÙ7ÑX^A­VC­V3Ÿ™|>oºux¿íºrÆ• 1Ñ›5B»†ª ¡¥# C„n敱Wé+Š(Št‰PËW€tJƒ°#q"S^,–¥ÄO}öMœ:ujÈØ^*•†2¯úýþ‘Ù•˃ÕÁnóq=OÍ?`Õ ÒªÃX¤”±u¹iÂa¢‘Ë%’ÖíÿÙQ†„2²§¥¼›ãÓË~4² ˜!Õ}œ ~P5ÌMÓ¨WÎkÓ¨€ŠÉµ¶NO ¾‘]ÅJÂ!WàøÉw»;ÀϽ| ?ü0ªÕj,±½Z­ÆJ…ív;uÖ¥¿èzèòïÿñúlzŸ•«…W°P ÊTº »ý$á1M‰0'b!¡n9Pw š¹ƒ&™œL¶“;ÐÙ¨Z@,T”&E4LZ”õñ *þãnçjVrGÁ.Ž ”Ùª[äB–i4¡¢ú6‹Å2ú÷ _¼Œåpvm KKKæ)òù3~ösPª7P¯×Q¯×Í{Z.—Q(Ìïa¢Óé,Ì·z]ºfº\;Æ~|éÙMà¨÷Y_õ Öˆ% ÃCó`*êÑ)eEC¶KÐá7~Á€FzÒ;‘0]ˆ±ûMVnúyVõkhí'T ôuÅŒK«Vph &§ÁÙ‰ÁÒ5Ã+Hc,*–xm½…ß¿|ϼë]h4ÆkED&KÿÛÚÚšé ýq¾Ø{èòïVèJÂ×$;,°ZTÕÊ'¹Ïãrêˆ$« '9wn{Ò¬JÌ#Ô&÷ac{ò~ÓÕ¤òÝ´9Yæ NUcº “ÆvvàPÏ 4‰¡ÒF9¸ñ£Äì$¹;ƒeô?÷ù h./£R© V³Ö½¤±]Ï–œõÈ"),ºüû|_ôpµÐ ÖQÃ04 V5¨16®×Ê*X¦ü§Ô,vFß 9‹0%¦Á’Û`µ_Ý…“f¦®™º qC?»„DäÜÉP“R®¢¸逕ù›ò]Iuÿ¿¼½~í.Î?û,†Y_± ,"«^ÍúÆ_t=tç÷ÒÝýÚV¬°ºÌT/‰CôÕª/º@' ‰r K6Âv ““W³v¥Xíª»0QRœ.šeÖ`…Ë€ÐdèQƒjÿ [Tó²­ÏJÁ–üÌQ· Vµ$3>ô¹‹XY]E¥R‰•†-ý>¶Ûm ƒcº+V^ÁJ9¸ô}Xßœ’£r ±Òž‰lЊÊ” c‚ÒgÁí¬(Ó°gÊÜI8¹$˜5ÁU2* ’I[ˆîFÆg¥» õke,Êp"nIçs!Ÿ½q¿~çÏŸG½^7ë. (•J±÷v{{{!ÃC—‡®ãüþ{Ÿ•W­<`“oNéàᔼ´ÿÊ1º“€R¯Æ€M«XMQ2Ágì$œHJ™‚E×Àö6ÝuEÌ1P3mZízô¬A–€³4Þ«Ÿù쬭­¡\.£R©˜çÒ]„n,ƒ†åE ]ºŽËû?mTƒ+V°fè N>§¶HsÒàž, ê\«„©?'go`µÏ&x ż>)[ËbÒ(c;\c{,¯ÁŽ»±~+÷6õ³ŒºÿüíuüÅ­ <ûì³XZZ2ï{©TŠÅ2@«Õ«TzèòûÄC×ÑuMî÷ó»à¬;º0bŠb’ΞÚ)˜Z&<°QÖû\H)+f€ªTÐÒº9Ñ z_›´v&{³~œ&5mv'–,#ƒ;3þä­;xe½…gŸ},T•J¹\ÎìW)åTÞ+~Ÿxèš÷¿<{Õj¶^w ÀŽúyÀÖ{s­`m2Ó)Žè„•ÉHŸ u ‹€‹$L%!ɳLA£Ó€Õ´YX“º 3(^ õJè1B° í&±æÌÊ o{í¬ANŽÆ‘lnÿùW. y¯ˆ([FªW0€U𭓇VDZ‰¥\u“VÀ˜®Ar£x™q2 Qüù3‚ÔX@ËòØ1 ظîB SlÔ+=¸™¢ÁÍjΠ“%+ š,éÜ&_º½_½‡w©™ƒz©×ëæ½Ò3$[­Ö‘«?ºfº¼Žú³©Ëz{ñYeyœW­Ÿ5"ì§zå/öó¥h‘<{èÚ_5Ë«VÇçu{À:Ä¥#%)ˆ_äáÄaJ{Îóê,%Xž…*wõ±Ü+2¢›ìNŽ‹)‚­xÙu#2‰õk7Ý…Žâµ›xŒ«4ðÒ1’#ÔÒàe¦ä ‰VlT¾ø@g™Hogf²®ÒÔ«~¿ÙÒšýÅ~±6ÿ>dÛ†qëÝ-\¥Ë=Xýëö9XÇ@éÚË›: °r¹òù<¶C‰ý+¹À€E<ç V¥Ñ@¥ãÖåz°öì([SØãDYb&yµRþ¦Ën¨¨ž-È6·Â˜ÙÍþ$kfÔèÕ-8컊ԫß~ým„A>ÍP*•P*•¦êôÐå/öóü>ç}’œ˜1Š&mãn’Ü}9Ð+V‹X%òðO£²°‚ 0„×;=¬”òã>†&÷)zºH‘Š%ºééî~hBšûxКa8ꕦV¥têw+Õ9CšõSÃ@ÊÜ¥\9(ÊÒ*Y’Uç`dnÿõ×®auu5ÍÐl6cïW†‡6Ç_ì=t-Ò{q”ûÄÍÅ›dp?LHò>«Å]ļmðùÃMcyðŽ’«Ý!äóy\ïô yÅ4+•RÎÊðÎ1xaVx­9…œðZ‰ŸFÍ0t~¶Ý‰”ñ1ˆç¡Qêw‘’@¯ã(tš½Pn+&“Ê€ÄHí»"XBy®h)ÿÕ_\»‡K›m4›Mã½* ¨T*±÷H§¶§eÔçs‘·í(Ö;Ëïƒß'{ƒ¤Ý(]‹ªZy¸š˱9ãÃÎXu/–Ã/¨5ê›Ôa|[Ó€¥“Üóù<.ït£r—žÁû0Fž)7ÂÁ'÷~:3‹P‰u%Âñ_1°÷JMŽmˆx”.í1c²YVLâ(¦ÂjT°æ+yÅlÔ+6ævi˃.hIƯ¿zKKK( (•J†½Wz,Î",^éòªŽß'{‡¤£"_ô€uä˶”T t%St豞oç®SJ "B>ŸG>ŸÇ¥íN®2{PâWÒCbÈäEÙÒaV:O $⣄‰éî4Eùoñ>+V‹ XØžþ`=ˆƒ8í±z&V.—C±XÄÅí–bg”Ü„š=T©P«YnIPÝ/ê*TJ˜ˆZîb´R•¦Ze4½Å>dP¬ÜߣhóEF…³wW½ŠLìFùÒùVú¦cÐú®¤R®X2>ü•ë@®€jµjJ‚FcèýÙØØ8ðø]º¶!ú¹ŽYƒ" >BuHÚŒ,ÄÒÚî g˜¹ƒº$èŽÇù×®¢Ñh P( \.6·K)÷Íà•.¯ty¥kþöÉ(Èó>+¯XykߢãÚü¶æ† !P*•ðÚfÛ!ŽÇ°3{O¹á5hEÑ ä¨IŽ7 Ö›E)jј!Ðîý1ê±I£Œ±v^¢»]'0ó»/ýN—TeÞ[YÛ½þàâ-,//£Z­‚™‘ËåP.—c'ØV«eÞ—ER¼Òå•.¯tídì4æM±šGô Ö1ûæ”4E†ah~×eÂ×6wà/Ž•‰c3úÜà@(°°~, W rFäp,w4-za‚ÿ*544ËØÄLðÑH£ÍA—cs°Qè”wàÎDÅOÄ2ªªÂ?¼x Z­šì«F£ƒ+ nn_t5Á+]^éZ„÷"-lÔÇ.x°ò€µë¥p$'6!ı^Jir°ŠÅ"^ÛÚpÖït*uFÀvבš¹Gº;P{°4|ÑpyÁˆüd€£˜=CV–r¢»»ƒw89Wp^¿Œ‹š÷Ê)JÇ{Å’ñ»_¹Ž¥¥%‹Eär¹X4ƒ^:z½ÞÌ]ؘÎeŽÏ 4yW 5GFw–ÀuK¥ˆÈìgwÙÞÞÞ׋€//Îîqè»æ»¼˜¶Ó„ ï&`tÞAŃ•W°f~Ië$t=Yù|•J/?h)剋 Hx³’:±IydU !U*®F)OcJƒ£Z¥¨\6}žs»-j=;v˜Ì,®˜H)õJG4*~ñÖ¼ñ`KKK±ò`òì^£¼‚á•.ÿ9™ÿ÷â Íý¾8ëö Ö˜å5€Î¸1¹)G;PÀá¿q£,=“Pç3½¼~;Rl\²ÐåA“å¨X Ä"ØOg‚âcu̘$¢ÌŸF”“jTÊÏ4Á$+c:q ̺'’aï,ÚeüU ,MùÔü“ 7\T2~÷«×Q«ÕÏçÍ`g Xúàí÷ûØÙÙY˜oõî:ƒ®_¿"B£Ñ@©TB¡PHý¬z¥Ë+]ózLìÜ|žÕ|(Vó cs]"|@÷‹•tS¾=Ö›#„ÊY ÃÐÌ#,—Ëx³ÝÃN'kå¨T6W4¬ËJ8ƒxŒ”†+Xs9¥y¡à([1Uk,˜A8v(´Ú²q*dB…Âæ4òrºáB–í„d„î 8úo¡¹zÕjD„b±8”Ü>J½Z„RÊýû÷Ñív±³³ƒ T*óY,‹(•J¦´ºˆJ—‡®ã}LçîÀy•ýÌ«{À:Ä¥>ô¦È,Ú~Ø‚  X¥R A X,âSw·ð7ª¥˜ŠÅÌvø³Š2ˆÿ¬ƒ7î(›;%T |²»cr­Fÿ=«j¥;ëŸ=?Q?\%ºSâý mP^Š”êgiÕ,£hI‡ŒÏ߸;>ÞY«ÏU­V3@½›òàq»ÀÔj5´Ûm‹ElnnâÊ•+R¢V«™Ì0Ý᪛’€ê¡ËC×q9&ös»½ju|·×Ö$Ð!ìÅAúýþ`é¥X,¢R©à“w7ñ]g×"Pà Õ*¡ÆÇD¬DNAMÍ!aâDŸÇêê*jµ–––ðàÁܺu ívív›wïb jµš.­liàr?ß‹ÜÁè¡kv‰¬†úiãÊÁ¯û¸žSæ°V…àmA,”„ࢠî†löiî\Ö“GZبÎaB˜ Õ›;]¼ÝêàÑ¥ 3xÛ(׌DF÷ÑŽ&M\ÂÙ7$ ]Y쎽ÝVœTRL®Ø~Q[K\`§|è z"Ÿ•SÔùW®á*Éýõ»›xk«w>T3€•Œfjn?î˜qëÍçóX^^FM•Uîß¿[·náb|[©ˆžìá“·oá+×®¡R© Ñhƒ¼þ‚P.—S?ëº+¯Zy+±ÄPß,'4£û`0@¡P@¡P0q ¿½÷7*6v0^,‡%’2•ƒZ`„©¿©Ÿ…é0táɆ{¦ASJ—ऎÂ48Óþ+°Jm·'7v”83,Ñ>2jœæC}r ­be» té¶) 0sl°3a0ì¹qgßöȪU§”Ï(ê S% ˆ@óC *ZéIÙßuüž8P™™…Nù2” G™Û)5\ÔBÃ&λÙ^QeS–V*•R¹tp;ŠU4è9úû§®­›R«¾ˆ—J¥ð„aˆn·»ë G¿ß7ÿƒALÌ ÙA˜ZaKûlõ…M+YƒÁµZÍx¬*• Ö××ñ_ݺ…ÿ°ÕÁOžlb5/PßÙ¬á;—kØaÆG7vð¯76ð™[·PTåF=ºÈ‚˜gÀðÐ5;Û–ì$ÜͶŽÚö£€+ï³:þJ×ñ¬Âì–¾èk…£X,¢V«áOnnàÛ^5T¡³°4¢XU+ Ú„p@‰MO  í 1„SHÊ®•ì(œ¤j¥ÞF‰¾s›1Ôƒ ¥*Õ9e>Ó 2ƒœ¡ÀIkZ¬ìf6Ù¤{¥è}êÚ=Ôj5‹E£‹Å!õjÚ“¥”ívNgÏþ= ÔI˜ÂÀ–žO9+ЕËå H®¬¬ ^¯£P( Ñhàׯã;¯ÜÄsjß½\7Ÿ‹ €ï^­ã{Ö¸ÑñZøW÷ÖñÕ›7Q«ÕÌóhs|µZêõzèòЕu½i݃YcæÉÄîÁÊÖ"óˆA ©ƒÁÀ|“¯T*¨ÕjøèÍøYÉ`gìi?K>ªãtáU$º©cAK %l©Ü¬„Ù†r­0Á{•€«„jAœ.:Ævý­P™±ì8k; ÈøÈ$o9ŒJ‚Úä®ó¯>uý*K«ÆÜž,E13:ÎT'çííí¡’âA,RJôz=ôz½» »ÉÚ¯ ›Êí÷ûÈår8}ú4¶¶¶P,qÿþ}|àÆ üÁæ>øÈÎòvæ$Δ~èÌ ~èÌ ^owñûë›ø£ëWq ËËËX^^6a¦`xè:œmË:cœ÷¨çðy°Z ¸š{ÀÚ %ÕèHILŽ~›ÒËý]—a® $>}wíô²›£=Gúw)"p†?3Ç'æØy96’AÝ• •úÆç[e, :÷7þ+ýxãs'g,¡™`k Ó¹Xθ ³ ¤ ÕeSU2|{³«­ÞñPÕ€U>Ÿ• d¬~¿ÍÍÍ=+VnIPŸ¸Ý£¾mkè ÃÛÛÛRà*‹¦;ï0/lZÔ¥› …jµ¾zó&¾ë«øG§Wðƒ§–£ƒ óÙ"Ax¶^Á³õ ~âñSøó|äÎþô›ȗ+X^^ÆÒÒ’Qq«ÕêžÃL=tyèšÌv~¡½ßcCSIÉfºTé$b™X†V¸,dÉd‚éÀÑO^]S°˜ab0L<ˆ{½666¦~oóù¼)ïM*ñ%aÊ=Á3Çaˆ0 ÑëõËåö-M=ë…M'ïõz¦¬yòäIloo#ŸÏc£ÑÀ?»v ßÜÁÿøÄiœWC&x¥2%÷+k·•ž‘(íö˜×§áJG·ÃüÓÊ•T÷eŽNvŸ½q寲Q¯òù¼¤P'R×ß4JÚÜÜœx×°úýJ.Ýn׌™é÷ûèõzèt:èt:²4hé˜÷³¡•!­ˆiˆ+‹±2¡NP?Ì’»OtÙ³Óé˜m[[[3 »¾¾ŽŸ¸r/mlãgžz5A¶dHö³AQú-߸ÚÀ7®.a½×LJoÜÃo]½¯Þ¸ÕÕU,//u·V«ø,D]ó ]iªÕ~Æ~¼VV®æ°Þpn†OÚ0œ¼¸›®†ê6 üÞ×îà›Î,G¦nwŸ”  ‚ ¡r Ø.;ã=2¯MÏþSÿwbI9k CÒ«5ÀÜr£’ªÈQ©Œ·]ý Ù)!j–Ò!d¡’Ý2¡ýe³ÓÇ[[;xòäXÅb1ö 5‹Á}kkkìI9ŸÏÇ¢\—”ÛÛÛhµZèt:hµZæ¤Ä*þÊêžXZÅZ¹ˆ‡ê¬”‹È áÄW[½Z½>nl·q³ÕƵÖ.<ØÂ…[7Ñ e,%½V«™H =jé°Ô-÷ C¡P@»ÝF¡P@&Í]ﯗ®^Å÷|ñ"~þgñ|½ ¡ÌïÒÍÿ…ý­UŠø‡çÎà‡ÏÆGo=À¯}í6^ùÊ-,//cuu¨×ë¨Õjæ5ÏË m]‡»m£: [µš7èð>+XsyâÈårCmú:tT›—«Õ*þøkoa«;@#'@Ì )6TT§žëB @0„Æ'6–ÍK ;Dª«Ð "eçV&6ÂÕ+‰E?’ÓÌÈ&ÐánA’£(r¤`éRè0XÙ˜†Wïn"£ø0s ‚tbþ(ÿ•GÏ!"T«ÕÔò”V½4L=xð­­-œ_®ã»;‰o9ûÞ}r¥|d†q“+™²­pG5Â)¥Äåû[xùæ:^¾uŸ¹q_¹v E•)¥ÇÔŒKN?Èq¹\F»Ý6Ê[8yò¤)ŸÞºu ë‹ñ“çÂ<¼êu»ÍÉF |ÇÃkøŽ‡Wñ…müêå[ÿ?{ï&YR^ Ÿˆ{ÓUVV–¯j7Þ2ŽqÀ Vá@v12»È>ÒÊ ³Ëî"éÓ'äBûI+ ! 9$V+@,N0vff€èéžîj[ÞWfeÞñýˆx#Þ¸™Y]í«ªó>O>i*+3o\çž÷¼çà#û÷£ÔÛ‹ááá €ºð¿ ºº «èÚêàª[ì¬m·H q±Oé°h’ ù>tlßwÍ.h ®`”P¶­Î˜`™’aÄDÓ¸rÈBKf(œìI·c®2¬VÛpèvà ¤µ±Î\šÅã0öÊ<üǹC¬›yì­½\ÕtXxtfɱ74¶|²ÕZ£ÑhlXîþEªÕjË6ÓZcqqËËËX^^Æôô4*Bã®» ß}ýÓpy/´”T ÷ذrBJHAeR´é(¤¼IÃîÅZãÚñ<®ÄwYp=¹²†ÏLœÀ§Ä'E]}}}èïïG©TB¹\FoooÇRæ¹^J¥Ö××]¼×Ç1æ{zð«áÁ¥U¼ãÆËQŽ¥+’?³vª· öáƒü—õ&Þ{ð$þúð&sŒŒŒ ¯¯år¹E¿3» ëüɹDÝràÖ_Ç®“ûE_zC€%DC_äÇF:,þÿ===¦Lxxßwõ¸/ý) ¡•Ò”•†ˆª‡•ñ¤–Faî¢j¼æÊ³X2ˆ¸ 4uöÁ—¿¸´v¦¢¦9QYÂ1ͰuP.оnï¿>³„b±è&Vr ç%ÂvŒ!-ëëëH’¤e›ÅqŒjµÚ¢õY__Çìì,VVVpòäIôè?ë5xÓS®D©‡–"Ž Xˆ\IH)Ë\ !k 5p0èX;@+åÀóx®ßÙ_Áëo¾ëÍÿvø>ü­#øÈÁÃPqÎ9§S'gàÎ׉©P( Ñh V«¹ï+‹wz²=rßùзðG·]ËÊEó[¤0k.=›à2¼5EøÅ[®Àß°uð$Þsà8¦¦¦Тê:/¥0ã.èÚWgÕe°vìA}¡Oq·ˆ®É÷ˆØ’J¥‚J¥‚Láñ…UÜ8Ô¡„’Öh“X,ßeÈõJ†Á’\ f<†B#`±D sÐ^›µ¸°ñ<`*{[Þ@Â})wvÏ@SÇ£" ÈÙ,ËÚ}cv ùB¯›P³ìÕ©îd$Ê·Y'pµ¸¸ˆ……ÌÌÌ`~n?xÃø¹»n@o©I Š £È0T‘´+2õ?) °’ÄÒdƯ¹ö±!ÐÔ–É„V† TÅ\/¾þ |ûµ—á×ëMüÓãOâo¿~_Ù¿ýýýD©Tr€ë|žøòù<šÍ&ÖÖÖ\è6/ær9?~¯yà1¼óÖ«ñÜ‘~Æ\1•5[ÉP¨íÚ¨È<~ìÆËðC×íÁûMâí?Ž',ЪÕj®w³]е3A×fÏ÷‹±º˜Û¼«³ê¬ó²P×Å:™FQÔ¶M8I°òù¼»ÿåIü¿½þJ½”’­ Ki@Ï,¡Et¼¶G²ÎAxÍøï⺘Í+h8¶{ c»þèÇðF×ùÈ"tèrÍ“Ú2mv,›©Â·V°{ß +…eí´ÖõUíbk„èëë ´ZkÌÎÎbii ÇŽÃîœÄŸ½ì^ܹk" `%¢"2¬•{,DyöJš{Ml ÛÿÜnâHà¯sg-+”2 JJA¥ •\o¼ãF¼á©×ã¡cÓøÓ‡Ç¿8€r¥ÃÃÃŽ-—ËÁþw.'6êâ$E@µZ­"ŸÏ#ŽcLOOã?=üÞzÝ^¼åêÝTq ¥…héj ~’Ö(Foºn/¾ïÚ=øðÄÞýØì·@kuu½½½èëë;#/­.èºô˜®vßµÖe­ºÀª °68X.t'a;ñd³Ù ¢Bz{{100€LÁ¹írTâPÊN¬ÂøHi ©½'”ð^æ9×»3pÅ…æ„´4/[!SòÛ„¸Ý+þ^xe«šÎh”" ËñV Ê~ŠWh§¿‚Öxb~T¹HšÜ9{¥”ê(po×YX©TÍ•ÖSSSX\\ÄÑ£Gñm»†ðîo»½=E Ž,ˆŠ ã"ŽÈ+°¤[Vå„p¤·Ë쓌‘4à˜¢‚Œ M¤Ú4¤Êv”šdl¡RÜuù.ܵo OÎ.âxïì Ê• FFFP.—^ë|Llä F ‹Æ´T*allÌùˆýÆ·Ž`¢¶Ž_¾ù*Ä„ $s»'öJ¶É¼d>k9h¼öª]xõãøàáIüþ×; 500€r¹ŒjµzV.ø]еó@WWÀÞV]€uÖ…<±QÙ$;ñ“S7]ñSg E¼ÿÉ)üÐ {¼Ð9¼k§ÃâÆ£: Ö,Zk×o°•ö“š6_AŒ“`º0Ü”5c¼µ;øäÜ´{NôBJs»pÀO2Â&Ü0ævtyÍåôÑÄ™GufÙ+ò˜â «‰‰ üÈMWá—ž~¢\ˆ"ˆœU"’l1€ÅA¤/ )3ãÉÄÝ|ŸÓ,NˆÂ½•- ÂoshÃ\ º„M@jÀ8R…+džð»/{6þó=·âw>ÿüããQíïG½^G¹\ÆÀÀÀy)¥‘mÃêêj “Ëårw ?1cµÞ}÷ è•qBé1Uk©SðÝÁ³}‘^{õ.¼âª1üóÁIüÞ£‡ð­éiŒammÍ­siiÑ][çÜNVgcËÐVg÷{»àêXýŸÑ<β}ð<œØâ8n;ùsÓQ²¨V«xÏþ“øþkw#V6‡P)%eʆ†KÍrü¨T¨Ù4¤mw°X‚‘³ Û*Á4ع·û!Y/ Ð\ g,ªðN\LG¡ÖX͈ åuZÚ¬|>h¥N%pçÛ‘ÿMÞÞ°)bzzKKK8rä~î©×á'ï¼2{`›Çˆ<“%bss Ó`AFxp¦›°¥C»²Ì·Å÷KRùTÙÁP‘UT*Œ”†NSÃr¥ *MTáò‘A¼óåÏÁºë&üÚ¿?„â ŒŒŒ ^¯£R©´Õí1!¥D¹\ÆêêjÀ0J)1::ꢅ¾pø0^÷™¯â/Ÿu ÆJã—%E‹…ƒ 7xé3Ÿ$xÐ’y5§4^ݼúêqüã'ðûÆ~´úúúP©T.h©© º.Î…ô¹ðÂÚ® £«³ê¬s¶Ä^³©=XKµ(\$VìT;[§RE³Ù Zë+• –——ñäô4>q|/¹|BIã|®,`bbw­ ©¨cÌ;Ê[7p ‚žÛ©Š¬2,‹{3g®B¯»âZ+¨l#”c²„‹îñdÙ*Àx|ñpt¹ÄÇdµWXÛ-I’Û² iYZZÂòò2Ž9‚¹éJüÔ]OrÇFwE+Ž€8‚Ì{eî¥Y¾“PÈ ƒ% O'‚ý&\oWòµ]„†½óŒlgidõX®|˜*ˆ4…N•`IjÀW”âæ=cøÛï~1>ñ­ ü·O݃0>>޵µ5'ˆ?—ÇuÅ®­­A)åXB!†††\®â‘#GðºûÁ_?çV\ÑWöû“½II&¥p@KÏÄúš·†Œ ÍGß{Ã>¼þÚÝøóÇŽà=Œ™™Œ¡··Õj½½½;Ö3« º:3]ÙsF—µê«.À:å²ÀzëËy$.ôT»‘ò渋;àË„ÜÓ©§§ýýýø£Çã%û†­ÎFÚ‰TÏ%e´X!‹/x'K{Ë”½‚hÑSi'Æm,Ön8OF çÜNöíÎ40­]¨3/ѽ×sÓߘ¯—6‹+·ó¯É)z_xñîºf³‰ÅÅE?~/Ý7Š_zÆ­@.6ìUÌ@Z‘4¯Çd‰HÀå, !¬÷“sp­ÁÙàMþ‚,aEïÄXi­¡Seh5¤@– e¬ “Pdª€4Å·ßp%ž}åüÁ¾‚w?ø(+}h6›¨T*8§q4RJW.ÔZ ‹´QQáèÑ£xý}à}Ï}*n¨ø±á%CI€Ëc~ÞK;‘Œ|óG>’øá[¯Ä÷^·¿ÿ•'ñçB©RÁØØVVVÐßß„_¨‰£ º.«u&ât J»Àêü®c×k\Á\Ì“iÇ-‹&xΦôõõayy=9‹/N.àž=ƒv¢¥BåX-)©<Èÿn&¡I›`"jxb, ¤ð’-î‘•`hg5`é© \H`®ÅR>7‡ÿ%ôÑ‚Y+ê.€c+5ÄqÁ•Ú1YíÆ—´Y´= …B&fgg133ƒªÐøÍçÞiØ)Rùœ)æèÞ€.ª" g¬ }7¡ZÂ8ç¸Â9é{³Qßåé2$ liÐg£ÉBªŒÉ,uF±+ŠTA«ÔÜGtšIjüº¢¥(Â[Ÿw7^uãUøéÿû|íÀìÚµ µZ ###-š´³YT.ÔZ£X,ºmÀÝçOž<‰ïúô—ñÞç<wŽöû hxñ»¦àrÉÌIÁfùŽ£5„=.úz øoϸ?pÓ>üú—žÀ‡ŸxƒCCØå‹Dº ëÂÌçcýº:«­¹ž]€u^—€Ú]ÝœÏÇ1Ö××Û,~5ÏçÑÓÓƒüÖ£Gðñ#hWHÉ¨Ò R hë“%"ÛÚ¯„´5"ÕV³bÛóì$.mc¡°“‘ÁŒ0[½›2xÎ\‘5„â‹Ú1f:ÃX…„?Šho]YC~°ì€UVàN19íÎ`ñ‰žJƒ³33ø«—Ü‹jO©…±BÀ^Eþq‹+råA*jê&´qÚ#€•‚5)оÉÎZðúò Y7 Œ•‡e«Õ$hé$5“7ìŇÞôjüÑ¿‚ßüÜÃXYYA’$¨V«¨V«¬wvÇ1YäžÏ÷óR©„ÑÑQ!pRü‡ûÆ_>ïv<}|°•É’žÉâûŸtÌ+\£€7IZiìëïÅ>ÿ6üðÔ~õÁýxpÿ~Œ¡^¯£¯¯ÏYul Ò]ç‡Ú ŒÎ¥¢³Úi€_¢»œ³ÀÐN“M»2 °ùwV«Uô÷÷ãÙ|æø<ÚÉSûÉÊ»}Ë£ׯ£f”•° Ï àkE ‹ƒF£»×ii‡Æ²âw£³’No%œ”ãk„ï ÔZx¬êãˆ6ó{§×Öƒ¡”2Ø>dÞÚn¡×)°˜оùžë/Çó®ØíºYÒ*™‹!òyÃf9Е3·\öCäòôþ¼}_Û¿çÙ-Øÿ½7—‡ˆsö=2Ÿòæ5äòæw¸[²`?+oÞkžç ó÷>zÍ|~q!ŸxæøÈ_…A¤8tèfff055åÆë\Ô]Øh4Z¬2 …FGG±k×.”ñæûƃӋ>ß’˜>¾ßÁ´nÂ2‡ì’GÓÌIÛ¤ s1nÛ5ˆxùÝxç3o@snÄää$Nœ8áLh/æ9b«}ïÅZ×3ù}g¼Îtl'pu&¿÷b¯ãNdS·ƒu€Eöœ5…å¤Ðçò >Wè:—Ëud±¸¾P(8-Öo=:gï0BçTRADŠž…é“ÂeY¬@ðMcó mI0èåÓÚÄñH0A;c­‚\BîSdMEµgªL¡â6WÐJ@ Åí¨ÊorŠG ¬¬7¡á=Å,m†½"ðEãÊÁÕÊÊ Äzo»ç6ÓH@Ê'{Ÿ3eB/z焱™ðãÈMú®ƒPR¹Ð²WÄJ?¶ZÛÎ8›I¨ÁlìIWk,)—Kéº UdÞ“*@¥F‹•¦Ò–S ¤æ±©ÃG†ÑR2ÁÍ{Æð‰üü×}÷õ'°{÷n$I‚ááá¶%Ã3a dµc²òùôÞ󨓍Tû±¾¾î¼èN×?ëRgº¶ãÀש~ï…tßê [—±ê¬|5`•½^‡)nÅ['€•$ ”RÃU­V±ººŠ‡§ŽÍá— C+iÅΰdT:²‚hÅÜß•†–þïÂíl´ÈÔ«„I’¼ªZʃÙz¢ïô¡Ò бÙOYwcà`Jh®´æææ.–I ˜Šw:QòHÎ^---affßÓÕ¨ö”ëw³÷82ÌQCær@,-ø²þWQ(t‡·GN‹åËY€2 =…샻­þŒù›‘à„îÂ1™ÊÒF : e Dd©*IM)±™@Kó:’Äf&Jh™ GJüÞ«¾ ϸlÞú±Ï¢V«A)…;‹3=&â8F©TrLQ;¥µÆI¥ð†ýþöÛŸ†§Ž xV”é°hLy‡fP©væ»Ê÷xâ‰M• » kk}ï©€_»óÀN]pÕXç|)o‘«¦v 'ng'Ðh4‚I§P(8îßúÚ¾mï¤R€öL•TÒèm"óÜà¨]K–Shck\œŽÒN§%È`ÔÆìhÏ´¸x&HgâwŠTãÅœ½?–)*Ò4ÓféŒÙ¨Ö+` !ÊÅ«N ôº äWWW ˆh¬ã-O½Þi©3Ç1•ú|i$x$ÅVä·tzæÊ3X‚+gÔJ´È ÝÁ€–2ìÙrV{¥ cEÝ…©¤‚Œ"h•°eluª (IS ±:±$Ê2mH$¾ûöqãÈ ~à‡Fš¦h6›8'ÇDÇ( X__‡"`È8“uBk¼ù“_Â^~®ès.(š+Ã2r•ˆ$cm5´ZB¥ Rï­FúñþW> ÿ¼ÿ8~õþoáÉ…ìÞ½ÛÙXœKát]øÉôlÊší8º¬UXɲc4X ­·ÌVk§aà, _H‡Å—þþ~ô÷÷ãë‹5|lbÆL¶)Ý´›|Uª¬W–½±p`G)ؿшz§u¸´ f OšßY¨¹OÄAÆÁܲ[‚™‘rp¥ÙÿùˆVšI sÅK„›X¼¼¸ººŠÅÅE¼üª½©”™§U²«•óL–ˆ"€ÀW;ÍèïTf´åÌg;mP΀³("û¾(¶í÷E†=3¿'ç‹íjtïÍå-«f´U2Oz.®·"=–¹‘ËéÉòyö9ܲoÿÁïÀM½8tèæææ0==}Î&š|>\.‡z½Žõõõàs …FFF0>>U*ã{?z?N¬Öý~A˜ÝVS2´û–4 ×wsFÞi?o2AÆ1¤5•¹¯¹~þí»ž‰×íÀÁpâÄ LNNb~~þ¼N²íÎ;Y_µÕu]{ò¿Pš©®Îª °Î–’«oɶuíN0íâ\ˆÅú¯M@¥^ÀnX «½±%BŠT!SRhß…æ ,É1œÑEÚRW’k«lÄ ÀÝD‹+°q`"w!„/2 ¦y+¡&)?€t˦TNu¢&öJ)…z½Ž¥¥%¼üê}Ò°PäiEàMÒÖ–• %_˜Ù²bÒ/ùל;æŸ9Ð徟n1ÔçèoLLÇ@lÁ-.¶IüÎÄñ9/Ž÷¢}¶r9 Wûðÿá•xéU{qèÐ!ÌÏÏcjjêœM†Åbq£^¯·4xäóy c÷îÝX‘9¼ñ£÷cy½ìÁ¾(ÿw‹àVi ÀʨDî4–$\®Õj¨×ëÈxÞ{l¹X!ëkE –VÆ©˜%—C,SŠìd.=ðò`ªd9¦%Ž #é@“cº¤^2gË–9×½H¢{вLUØÙÈ:ãœé2ÌS‡¢gµ<Õr1ŠÅ"þè;¾?z×M8|ø0æææpòäÉ › Ng)•JR¢V«µ”Ì‹Å"°{÷n®7ñ?þì{= Š ÃÐødIHk™á: ísÖJÐã|l: sDÞŒç=—â“ßy/¾ÿÚ19tÇŽÃää$æææÎXËÓ]ö{7óþlÁv—Bä#|¶ÿRSZˆh¨¼8Õv1õÄîdÙËå`ÐÓÓƒÁÁAüú#‡ðÒËGP¤ZR™IÙj² è±d]fÂvÂj®ÀÌH%Ó1Y –4 ˳[Eîîš*¡óÃ"p¤½ÚX³€i^.´‡JgˈpÀJ1S®D©¶z¶ÍœPéu²wX[[ÃÚÚžsÙ8J…¼8¶í_XåœÝ}h0êÊtÒ¾_Jû܈ÛÁ=°¤ ™ÇXØXÀY;¦. ¼5©%‡µï‡Ôl;k ­Rã•&Ì> ìþT2¤4ïR8mé± tS1¾F›%þë ïÅ`O¿úé ,€k P>“«or{§`fþ™årišBkÂ/þÛ#øÝÜåc…ø6Fh†«ÙDBÒ7âGM³€°ã) R;NRA©Ôø—IYÀÖxå5ãøÙû¾Ž`Ïž=¨Õj;,/èºÐç±­¢é:¢ÝîÀí¬ºNî[a)¡%éùt®8/Ô‰ƒ×í‰F Ã588ˆZ­†£‹‹øÝGáíϸ֚ŠJëà-LIK)h%LG¢’ž­J @Ñ2@.ïfj’Úç´h-¼Ê=üÅŒu"0Æ@˜°ÁÌlžcr$Œç€ƒ2 u ëòŽð¦[£“jv[uÚδýhò^__ÇÚÚî¸v-'E®œdÀWqîLli{ÇDű5Âdå))ý¸YK æ9 - •{ɵ™¼€ÌFÁÙH©!l4R He#sèqˆÔ®›W$t"…²àÊl[ •ðr­b?öÌ;Ñ[Èã—>ö97îããã- §{ìH)Q*•è-—ËÁgöõõ!MSìÝ»ÿ°ÿnéÇ>õZ6VÂ3©®\hô XÉà7J›†#­ÌzF©€’Ê®·ïÄG_ÞõÐüÁWa`hÍfýýýA§áV´)¸T@¿µ;´bÛÑϪ ¬ºkK-ç‚Î>_'Ž|>ß`)¥‹EKE¨V«¨×ëøóoÃ÷\;ŽGªÐ‘™HµÔnRÒ›Âv’Ñ’ –° =&o*a'ž€™¾$Z¡%ê`L¸¥»™+rÁ;x`åI¸ÿ¥¨”Ò±)›ÉÐ#{2#]__ÇM#ƒÆªÀ–‘\ÌM$M´Œ”€ˆÜßPPfËÒ”ž¼î'2¿™>OøB/mÆ/-¤C Å˺€†ŠùdYÆRh‘š.ÓTÙý ÓA¨ÓÄysæ÷j!!%±U†Ý"KÂ09ºi¶Ó›îº=¹~êÃ÷¹c`lllÃñß̱Ã; dñ÷  ÙlbÏž=ø•Ï?ЧŒôãž}cÆÉ^úÏ$ƒ\rÍwcÍ`…K©£•0L.ua¦†Í2¡æ¾ ~îé×á— ãÇ?õ5:´Œ={ö ^¯»ë­î„~©‚®vk§«í¶Ž;X¹9hç¡+ˆó¥8?RÊ¦Š–lw]Í—ËeôT*øo€R©FQ.F‡|~tjµYÖ”Ò?ÖN“º¦“ÐZ ôM°ÞYhuÕÖnÖò@ ín¢Ã=}¦öš/ˆVòl#†J‘›=:‹Ýé`m4PJ!IÜ8:È,,“%̽d 1WîïQd5>¾K˜0ã,[p&ÝëZ ¥Ãßyq¶42‚¦ CꄳåÇ ÃQÆ2g>#âÑ=9/‚­~+GVØÍur½–dŽò°¢yUE.‡×ßv#ÞñâgáÄñ㘟Ÿ?£îÂvÇM¡P@ÇPJµuTFµZÅÀð0ÞòÑûq|Ù8ßñ}¹…$,›_HÛDD^OÚ7DÒ:¾GyßYHZ-‘ÏAæbܾgŸxý½xõ¾çòäI¬®®nz]·Úè¥æ¦®ïg º:«­ÿû» Ö¦é!é ÞŠ¾/X,ÒbqK!±¾¾Ž/NLàçñÊkÆ ¤B”¦ÖÍÝD‡h[*JA§ÆT1©´÷ˆڵðF¤BhG?i¦–Ý’L\ì&&–Ø«6Ä‚¹0K-´Ú:&KvVƽS¸w³ÙD£ÑÀ@±€ñJ¯a–hòµbw7BX¡´ô!Îôw-½-€g¸d`.*\W›`×/¤ òëþVŠ&Òl¼,맙ߘðY{‚À¥ÕcI ¡RÔ„)CmË–©eÕ’LyØ+!kš0,–BÓýž7Üu Ö þǧ¾à:bGGGÏú¸)‹XYYA³ÙD­VC©T .FFFF ”‘Z ?ô/_À‡¾ëÈåY¹/ã΢[ʆ~çþ– ³¥va"! djØ<™B'v\¤@¯øÝÜ‚çïÆÏö1—ãX«Õ088Ø‘ÑÛÈ9¼ËtíÜðén9ðÒe­v.ÀÚbtu§ï%k#-ÿ¥R ½½½ÄÛ¿tÏß7„J$¡Sau#*QÒA§lâµ¥$ÐD"…Ѳ0]¶m}î;Iœ.dyœ 3 )ðËb÷T‚ÔÌ 4@\„©¤01:4±ì`øÇóFW¤”[˜$ ÆÊ%Ÿe'-âÌ‘0€J[JÊÈ2RäÐn#MÿGeFáYŸÝhÿ/@›ltë„ÌË„du/læN¬™Pc*êTB-RozšHWò‚Œ Eb÷F-$`_Ë] Sm&l÷–{oÇj³‰ßúìCÎ_ŒLBÏæäJ¢÷F£(І7—ËappI’àO>‰w|þkxÛsŸj&• 5¼ÛýG²u<ØÜ^XØ1R¸Fh«k”)`ïE* ›vãHW\¿wŒWñ“Ÿz8€½{÷¢Ñh`xx¸Åë.[ž:ÕAt]¼19Ý.°ê«Í,—dØóVhAæƒÙ÷4–×Ñßß-ñί‚N¬é(³jh}® û¡•õÈ‚c>‚Pe¥™ûºGRÂÙº·/÷‰L¹—e‹wVRé™ç¡%¤Ô” ޱ¢ûÓ¡ú¹Û»R ÕbÞ»€ áÁåFÒµù“y%•ðÜû+Šˆ•3¯[Æ]޵Р'2ðìsˆ%ƒùLMZ°ˆéÂXùЀ¼Ð_˼'ç|´¸o—) úXP2ÌçXè5/%—ûŸ~ÎÓð£wß‚#GŽ`ii g}\DQäºóêõzKY¸§§Õj{öìÁ?²Ÿ˜tæ¹n?p]†"0!¥m&„WÙbBJeAS"”±ûdéϹâîþ^üý+ïÂ[Ÿz9ŽNÆää$&''±²²²áä±™2H·¼¸ñwž t>&ú®ŸÕ…ÿœ.ƒÕeº6dWNÅbñ²CÇèëëÃÈÈþ×cÇðòËGpûîsņBKDÂ\uKiË‚ H¤PPJ@¦&|Ù8¸+H6>‡JMàö ô¸Þ¥…µ ¤ëþ BH(÷F﯆K8ÅaµbÁ ܳ@+Ëdµ_?úÿ¾|ÑO¸‘ô€Zš˜#ö¯P%€ˆsep©d’º‹¿ò^c!›Ey…T6$3Yø,% l8¬ý@*ŒmƒÐB9»–&:‡l7H['óp¥Ã>æ?Þö¢gáÉù%üëᣎq*—Ï.´ªP( ÙlB)ÕQô^¯×14<ŒŸüØýøô›^†Þ¢óz3]‚ùgð[äWMó‚·„´¶JØÒª¡î¤€- ÖP-RS’—?qçÕ¸k¼?üɯbbm iššR´ê´ož.[²Õƒ–/ô¹“Î Yãæ‹¥³ÚÊL×V¡—ÚrI2X[åj-ŸÏ·Ýé´Ö¨Õj-ß[­VÑÓÓƒ¾þ~üÔgGm=a:ö–¨L´Žr]„PöóÈñÂ3ö ãã¯{žÒáàÁƒ˜™™qƬ/ÎÅUüVf».&ÓÕŽõÊž:w/Hºãm¶[Wd`Ù¥wœÂ6ŸïØÔζ¡P( Z­bddöø1|þج³m€P &+I ²LeØ,¸ÈWÉ^ü[­–a¹BÏ*­­VŠ=öz,´ØCA¼Þ@ Ëž„7õ,‘À@14M]TË©Æ6;þ¤”XkšhÁÌAxÉèœÛ9ؽeÑà^W¾ƒÐ±{Älþ/#~¢h¹Ò¥4Ê-T½·yˆ­NË€.Á¬ Dìé)PÚ…\çŒíƒ yÓ³:¤\€+c÷`ï}ýK±¼°€ÅÅEÌÎΞõ1‘Ïç9l;=V¥RA¥RÁèè(Þ~ßÃX¬×‘šcb)&*@.øvã¸Hf+–A|.É5ZqdµX‘gµr1ò…¿òìñîç> “'qüøqLNNbii©m ‹w9SWæN6ê·muÛ…®ÎêÒ^.‰áVö}B´tñÏhWzéïïGoo/úªýø™Ï~+µ¦+’'–°ì•a·Hün*SšŒ(jÅ3\T6$¼+!ºÌB&»ëÒHC$EÈtQ¬‰]w)ï%¸û»\Ã¥"’$qm¶ô²‘á%ÿ›«Í¦gϲlB ó& ”ëô– Ú=õ\NdÍ£YY6‹-á:µð,· DÌ>BX°å…ñ>ˆ:g@eÒcÆhQÉX,P©,ιH!SnÌáÎËvã×^ôLœëc‚X,ÀDe—ÁÁA `Y üÚ}x¶–lGÜ«Ý'¼-¤„Œ½›¿dÎý2¢1’@Nzá{> ‚¸¥[Ò à_sýn|èÕwc ­ãÈ‘#˜ÅÜÜ\Çuβ+Û=hy'þ¶®ŸUX]Ò«F«“ߦ +—˵d¼ÑÒh4Z‚v…Æàà &›o`¿c©(ˆTA¥)”U*M S•2†‹€—- ð88q‚ÄhidÙ)ß–ùŒeÚH–0âž!¢’Y¦ûpo¥ÍfÓgÇn£ƒ™Æ”‚•Fü¶@Ð-Ú”7Oa”°Q- *ÃPåAÑÊl@K2­•7"Õì5yãÒØùwÁ”:'zñcu[ \Á 笉Ø+¯É’,ÈúwÝ‚—\sŽ[#Òv§sLDQä.:”R-ùq£Z­b||ýèAx[ä$D>£}ø—×< w÷pèÐ!ÌÍÍ9sÖNåBÚOÉZd;-_¨ß–¢›aµ³çÐÍ®[WgµõY·.Àê2]§üÎ|>ßñ;ëõzËë¤GÅß=1‰Oža¬Ô²YÚܧ\ø®Ã¥ÛE¯Ã1[$„׊ Ùd•t\ÉÐå 2Ð¥YÉP`FZ]ŒŸü¼‚é»z°I’“6/nÄ`qß±8ޱ´¾ža©<ÐÒÜ(µðj)ï…Óè²D%H; %¼¶Ëê°È)^X抴`¤3Ò.”Ú¾Nv Q°DàÊ.ÄrEdy‘|.ÉÿÎËžÁ\„™™ÌÌ̜ձCÇéëêõzËI ýø…ßfb÷}e#£2NïZ‡ù…>ø:(’£¿ä®ïÖù=–VŸeþco!óTf5ãW-ð—/½ßuå°Y'Ož tj¬â8njÞ]íÛfÓ©š.HêꬺkË.Ë©jÙª‰•íx‚áWíÙìB“ÌàÐ~ê3áøb̓¨$5·@‚,¤ "ee@*µ°xòÉr†Øöæ\Ƶ`N Ù±a“š’SÜ¡¯Št‰Ðaüò¾^°hD Ö)êŒc-Ør Jºñrñ9±e²rªØ—-æò1~óyOÁ/ÝqŽ™ÀÌÌ &''¶2«/ã¹nEð³Ê‹´tŠÜº˜ i'Ø.tÕŽX£@ug1] ÞF2è xxx}}}¨Gyüè§¿ŽF£é˜,w#ÐDìVêMHUêEïP¾dèÌG)_Xñu%7l°®Ãvy„„ „Ãf’33$îmgHjoW ô¹,Ab1èj”N𼓰ÝI$Žcär9¬6›8¹²êC•Q¥¹Qe€=ðÒc¸e®tk6ãæ@–l/tï8d¾\¦‹Ê†ô˜‚œÉgLšk±u0ï|¢Âß{Õeøñ§ß†'N`qqñ´J…í^:WJµès¹*• FFFðÛŸû*j¦ce©#J9`»ÃÔ•ª#ÁüÍD…d€–À»Ó\d5Z2[ÒZ:üØWâÿ{ÞM˜›<‰“'Objj kkkíH»‰*Š¢M…šwAש’l´ÝY« ùû·;ˆÛ±%‹&z¶'!D ðÍ.ÙR¡ÖqcppÃÃÃxxnÿÏýO ±V–¹JS÷-YÊ à5›”¼ËëZëE*uë“¥mf!-¾­ÐßLÖÇ Ȱ4ÞY42W ô9‘;$y¹ˆ4;í¶='ÓÖ(ŠðäÜ"³¡à –P®ÛŸ•™sœ×dPé~é@$YÎ;¬“FkÃŽÂ6z°L ÑÙ8€g$Z¿.)\'£¿“ð>bà+ë£EÎðVoäˉ±-‘– ‰6Ì–×&ýìsž†Ëz{0;;‹™™™³>®8‹µ¾¾ÞÂDT«UT«UÌ7S¼çÁÇí…ÜÍ_,°ã&W¤ $[ Áâ”dÀúINÀÊ€+S>ô,–ï:$Ö+®Ç^~;ÄÊŽ?Žééi×aÈtÛ±°íJ†]ÐuzËf¬ó9ñwuV—;ÖX[ìÃK…í>¯c¹\F__FGGñgß8†=q24M¬è=QЉP-Ú,eÀR[†¡.CÇnY³pbº‹å{â³BqïU*…ωÓ$~gš+2ø Á°«RF9;/ °hÚp'·LY>ŸÇ¹ÅPN¨öCdåñ@z¯`ñ@–Ér&««Å˜*ˆ6åÁÍi°Ú02;el–ˆ|µs™'«ÃCÞY²Wޱ‰}¹|¡8Ȳ@ 1‹ê!ö+ŠQ(ð/yæç±²²²aWáf*ïÒR«ÕZŽb±Þuÿ£X¨­›}ZÛ}šÅ8Á{º'szf"KìU$£H¦*Šœa)¬)©aó¸…½nîoß5ˆ¾êNŒ¢‰£Gbnn‹‹‹ŽÉÊšèf×ó\N8;tm$|oǦvì[ovZÙqÛ¬ÕÔH¨J‹¦Q²nIŠútN0• )¸8» ¢R©`ph?ûÙÇq`nÅi°`Eï¦t˜:pe@W¦œ˜jÖq¨ýÕ¿Õ¿†4|¹P{@•U;üÂôXheh„ÈtđոetFí7×`Ñäsª%—Ë¡P(౩YdZ! (ošÞ·b¬¶¨ƒ×ÚtfÙ«¬ƒ|ÀfBƒå>£Uë%¬ñ©̬ <°(€ò™–c³PEÒ, Ëk±œ&Ë‚‰g^µ¯½ñLNNbaaá”å™S-œÕÍðF‹X©T°."¼û _ µ„Šö]ÅÊÜðÚA»M|¤‘ D—¾+l¡`n¥ÂLù0Ž=–ˆ%d.ƒ½ø?¯¸ו$Ž9‚¹¹9ÌÏÏ;–…7p´ë®Ü‰~Yçû{I·y¡Õ…d|Î×w_èràN[v¬Ñèvû½Ù“ËF¥Âõõõ¶Ö ###¨V«@¡„·|òkX­=–J”ÉŸ³6¼Rî^y/-M¾Xl‚"–Rp%³ÀE›? ‘iÚ •îB´&Äj=utF#úóæfV±XD±XÄ&އL9)gSö€Ë¢-ÍŸ‹0×Ï™†’h>+~o)ýµ»w¼µ+)Z@‚wø¸Á­mĦv–2ò÷Ò[<Àvzÿ+ÛQ—b¼|Åxû‹ž‰¼VXZZÂâââÙ¤2‰ÙR¹”Òåt¾ç¡obamÝ{¾±’¡à”$Ï%´@Y xò*ݽ°¾YÒ›’F89F+gŸÇ\üJ÷— ø»—ÞŽÛúò˜˜˜Àüü¼Yí,øäC k;˜(_¬ïÍ2Y›mŠ9—Wgué²V;`w؆‘2°nÈž`(«/qcxxCCC8¸ÖÄ[ÿí¶,hJƒ‚+S>L­|Úši耖5,¥üBËhQנК1Z–Ð"-öG’tV ¢ÞÊµÌ °r¡Ä»†Q¯×ÈÿLV¡P@¡PÀ7gæ°°VwŠ:8€‡÷žÂ¢íé.Ô"ÌRt,ìÌj6 â4ntZÒ1ÎÊAHV.,&Èç+jVJ$¶†ò©T(b½ãîcg[@LM(˜—©ôâŸ}7¦§§±²²rÖ‚w^6ogÀ[©TÐÛÛ çð7ìØWi¶ý4»_RǪJ·¯’W–¿GFwåºs‘Ó±‘6‹:¹&Kæ"Tzòxß‹oýÃeLLL`nnÎ9ágAVvò‰¢Èíó[ÙDù|~o§ év¯e;°OÇ««³ê«.Àrgáµqòù| ?á'¥T[—ëR©äü±>xxïúÒËbqÛû8Q«°`ctu¦ŠÙ9°É‹ƒË  È4$ÃQÒ`yq1Ç"t)·œ·9Ö®]™p3¥“B¡€8ŽÅ1î·,–VÊy|i­LLL`aaÁ5tb²ø‹ €Ú}çÅb»² ×­næ7uuV]`ÕX—ÈR,;ê±Ò4uå~ëïïwym¿õå'ñlj¹§ÙîÂ4dµ,°2 ËfjÍÚßmk•^Ü$¥òÐVq€ŠÔ!<¤/#î«öa¸TD½^wëK,×§l†,—Ëøüᣞ­Rh™€½æ ,¶2Z…ñ¾$ØÉ í@U6êT%¶-ã—EaÔì±ëŽcY‰Fèî]á]7bĺe-Y·¡Œ˜.+ÊJ{û‚\.‡Ÿ{昛›Ãòòò9g±²ÌDoo/úúú0Ukà_¾yØd¥‚r¡¶Íš1±Èt¾ !˜6‹«e±„”‘w‡Óh…:,D1dÞ3Y¼ë˜¬B1‡?~á-xõ¾ALLL`qqSSSÈj (ðÈÚŠ¬Ó…{œo¬SMê]Õöø½]€u¾—}F. ÌHÖ vLÞ]ÇO0ÃÃÃèííÅÐð0~æßÃýGgؽ™†l á3eC×eÈ‚¤á<²Xë{ Y2å2¡Ek§àÀJ (e¹ò +_ ܳwõzÝMª|ò!G÷SÀ{zzÐÓÓƒOì?” ö%B×AÉ™:–ANË®”‚e42ûzöZà••Øig>º™a–ÅÊd)ú¬D²\iÖ–A–ÂãR[î4H«½’Ò8š»™ˆ=÷L­×Þr=®éïÃÂÂÂY›ÆqiòGãïééÁÀÀþøo8&ÖØ5pM–rÛNë–Ú 3Ãëjõ@T8 Á@–gµ$½Û×cé.¼sÿ¬8áÏ{ ¾çÊaLLL`yyÓÓÓmAVv2<‡º:}F³ÙÜ Ü®LLWgÕXç}©žm¼–¬€Î¢÷±±1ôõõ¡·ZÅ}â+88·ìºUSA5S¦Ñ¢nC`Y]VX9@k“u¨9(Q¾ìÆú== X\c±\Ì‹`VÌ{žwÅÔjµ€îçš,.‚ît/—Ë(‹8´°„¯;éc€l—™EO~VÞ²€{¿Èšd1o°@ëO]ipæñôXmLZ;8¹w|O­ugj릟YÞ7Ëf:‘·uGΠÔ2TÒ³U2Š!-{iý³, Ç1~á9wcÞÚ6œK‹ö}¾ôõõ¡¯¯_>1‹‡Ï¸† ¨ŒY®òµ]m½‚Ó„®t-ZJØš³Y±4F¥Ð%sÒéÒdÞƒ.XSRn\å"¼ãY7àM׌bbbKKK5YíØÙ³õÊÚ©LW;ÅÙNü]UX]Ë,å-}â8WK>Ÿ@DvÝjµZ‹™^EE?êQß÷‘/cv¹îõXP•ÕañÒ!RX?-”]\)‘uf)ͺ ™…l¾LØÆd,¯¼‰„Às/ßõõu$Iâ&UÒc‘áê©¶™²U¹\ƇÛï»%µ r¬‡+¶sºÝî•ÒAöà”—$a#Ñ`êTïkyì¿W0†KÈl“ì¤ A޼°[‡–„´åA &V VÔn´Y¦ƒŽî©ŒøÒ®ÆuƒU,--ayyù¬ŽÅ,à ›Ž“žžT*üíWöŠ1Th߀0•Í Æ-®¶<§9èr:4ÏZ¹,Ã+F‘éD´ö ˆ}סÌEø•{®Ãw\6„Çcqq1è.ÌÚ“ðIŒ:-ÏÇd¶ÕA×FbwòMÛ(dûRVÛIgåºg»ëâ,½êJ  °mNgº‹ÅŽZ#YíB¡GFF0<<Œ“ ·|â3)Y@eX,&zORº•z0E ÓgyR?¡¡U“åÉ§É ð:¡,›µ§Ú‹ë«‹•-l&V¤\.£··üÆ~Ïd¸2 E¬xàfZiŒW ƒö¼[³U¶hؾTˆV0µ‘;6V¢eL di¦ÏrV€¶TCØ-G6³4ˆ„‹“ñŒ–eµ¬ܱpüÐ7caa+++'ÄÍ‹Bˆ– ,‹EÆ»|ü0†‰ÚÚ6ðfìWš26üXI°`h ²ˆ¹’Æ””´YÒ– e™×˜½C³Ãý²¬Vë·Ÿ}^¼»?°p Æ–¬åŸÄhl.ĺ˜®f³‰f³Ù2F]U÷÷vÖ™°<ÛøÄ±Ù¥T*uJ©¶ «T*app£££xpfÿñ£ ÑH¼MƒTi­“¦-L=WÌž,­”³À]0¡x+ÊbDŠ ÜÜ…sÔöZ¬ç^¶ kkkÁU)·kèÄðe'ßR©„£Ë«xäè Ëı!Ű­àŸÖ:Î\ÔŽòñAfE­cžë @ºm©g¼:ä;¶¼—e&†Û€,´·vŒÉâQ<0³5Ò–¼¤gj{ÃC¥miñu7_‹)°²²‚ÕÕÕ³:³Û9Ëb•J%”Ëe,' ÷8fm8˜þJg:`vïŸt/-‹%Ý _0ÆU²rj‹ã{AsmVvºø®ÕŠ%â|„?|ÞSpïpGÅ–––Ü1žÍ$m@/Æä´UìhY]]í²VØ~åÀ®“û%¶l%Ð%„@©Tê¸Rgavéëësö Ÿ>¾€ŸüäW4(Ëbiº%­6^ünÀGcRÏ^‰`l\%èÆó Bçv 4ëØ¢I‹€× ¯Þ‡µµ5ÔëuÇ^­¯¯oº“0%¦R©„ÞÞ^üÙÙŒPš.mÖU·q·ú,a[þ9‹ÅÙ,W…ð W LãmþÖ\ub¯²%ÈPFxÁ–¾¨+½%x÷f6¶ÈH fRJ¶š…";q|s¡XÈã{o¾‹‹‹,œé±(¥ š´Ö¶+Š"‹Eôõõá_?dj:-k\ð†³!¶òÃH^Y’ ÞáÇ…Ç=Etcz¬ÅÙ,i³)ÿÑŒW¡ÃŸ=ÿfÜÖWÀ±cÇ077‡••7T¶;7åóù-1Q]¬.B¥Ô¦üNVÛ­¸ÓôZÛ`õ(+¤vºï‹”rC•$IKf  ¿¿cccøðá¼õS_3à*I=ÐJ:ÜRßmHñ:$wZ¦TeDÍÙ´N^Þ Nç"œU€g`´z¹÷²]*äQ¯×ÝÉ“_ÍÇq¼©íP©TÐ×ׇþÆ~Ì,¯y}Uª ”ö@2UЊ@%[W 2}‡¡e±‚Ò¨nI“6ZpAµèÀNµ%°D{ö*Uö:Ú–É'‹ÇëÐs™a±D(|$+F^/"ÿ\2ûAbðo¾ã&¬®®Ý gºd›8ÐÖZ£\.£\.ã£ûbu½á·13ËõûŠÐyÝ`›cÞm´æfF"ãoÆÂ9¿GÞ„Ud<³È´5² ‹˜®žbñ‚›qMQâĉ˜uû}dµ;?Ñm5&þBœ7WVVÚ<Ó9s+ÊA¶#Pé«S\Ðï”!V^ˆ5ò,jGŸ_ˆ“Ç… <£(B¡PhËVȪ×ë-‘;CCCÎæýOœD9áWŸs³›€U0E uˆ†€DjØÈÎÙÚ ¥†a2¤e x6aà†Ö]§@`Ì•€Ÿø¥„ P‘”xÅu—ãÇêê**•ŠóÄ¢+ö8Ž7¦„T,‘+ð—_ú ~æùÏ4l‹¶à) "ÎdYÖ*U@¤Lèµ6@̰læ÷ )M§¡d^¯£iì+Hì²%Y Ôqšg(MXtGMû®FÁéÃÖOl\œI*±2–M”æ3¥öNñ®f­Òˆ$tjÀƒ–©+%"Š\wâåƒý¸utÇ——±¶¶†B¡pæ'®LSåø‹IÑH |ü[GðÚÛ®PÒ±¬T2t%mIv¸‚í«–åƒÕ ÍJ¬ Búm%´„†2¥Fi;Jµ4Ÿ¶ ‘„/Mú!ud6vh¤Z£¯§€¿~á­xÝÇÁä䤳SÊC³ÙܰÃ8—Ë![µs®~­'±}[y! :_Ñy™îé<ÁAiMù-Š¢sÚIz!ÕN_.©áNkAÎårf6›Í¶LeŽá=ß8Šßøâ7™¸Ý2TIbX«f ÝLX·¡-™Y•UJìN(üX7§ˆì‘æ½°\fc²˜eÀkn¸«««5/m¤ÃâãßÛÛ‹jµŠ÷>øÖ›MÇLµD¥^Ÿ” yùPûÜÆÀ”ÕN¦žÔbQ-\€+±¸Úx‰N@­óÉM·è²\:çܽŒ|¦¡ +ÔyVèEŒÖ+¯¿ ËËËNì~¦ÇM,|áñ9RJ‹E”ËeÜ÷ä‰ÖnQÞIHžhÚ‘f'ýŒóF0Þ&š,?Ó®3/qG¶9 +xgÚ,Ä‘e±$tìEïýEüÍ oA¡QÃìì,¦§§ƒPè¬/N¥ÉÚÊšÓ3ým«««/².&ƒ’¦)ÖÖÖœcÿââ"VVV£Ûl6‘$‰X| è"I4 Ôëu¬­­aeeÅu›NOOcvv6øÜ³µE9Ÿ,Û¥°lK€5ÛPb®™ˆÓ½"Ú‰ +—ËmÈdC’iF¥RÁØØÞõÈ“øý¿åÀ”n&N—¥šLðNú¬¦/‚ydiÊ5l#~§+vÁJg‚•»\W!·gÈøAܹg»zЍÕj®\ÂO¦›u¶®T*(‹XLRüÅŒæfR_¤r¡ViØMiu[Þ¾‚)­3ŒÍBµùÓSPv*æ«“¦  ”ÂÂF”ÓG%]î¡•yŸ4¢ïWÜpÖí„Ò.#îtމì¶ÎNª…B½½½øÌá-w¨L3FP)ÔœËj?)0ÃW_ÚAé@–äf¤º¨A ö” Þe,ƒ2âž¾¼ç¹7aen ˜šš ËÛM¤œñØLÈN]J©ÓŠeº}½^ÇÂÂæçç±¶¶4朷¾¾Žµµ5,--9àE>tëëëmK§X]J¾X]‘û]ù|~Ã2A;EF¤©ó›_:€ßüÂãóVëu[Líª¬?X‹ùª—[o®Årxkg¥ç["6`±Ú½.öJáX-zMÓ™C '|'öƳZ¬»Î–/¨â¶±a¬®®žÒòTÇD`eÙœR©d:F—Öpx~Ù9÷{'÷,“v¾f‡P30*\#ZÂÉÝz[¥¥@8¾[ë ²`_‘D”óz-8vKâŽñ*~û×áä‰XZZrnï,’$ JIYÆït@Öv]t¿¸¸¸)çö ¬¨9á|‚ªÍŒO³ÙÄÚÚ133ƒ™™,--¡^¯Ÿp],`µÀØŽXçãàßê «P(lxÝdõõõall ï|ø ~ù³_‡j&^Ün; aÁÒÐ3ËGíVG%²²‚¶xÊ0̬‹`åCá;¶(;Ï•ª¤Àn½õZÍybe³ 7;‘T«U”Ëe¬(?ùÂC̽>õ·„±ViæfÙ+E@KóÃ0 þi,xΡÀÅÞ:-X ®g†Açg{Çw½“)Ðú¶+÷vgzL´³+áY>ŸwZÅ;x<ìÔÊñ+ÝB#jÖ˜‘Z^ÒÚZøýÕ³Yá8´6 €ùfÉ(r¦¤àQ;,†èµ×Œá§nÚ‡cÇŽayyÙ‘{±ÑDž ÌÞ®çÄNK³ÙÄòòrÛßy!Åíiš:Ï·3a‹.Ä¢”B½^ÇÒÒfff0;;‹ååå€áº˜q<;…åÚqKK\°-³Õ@W±XnƼç{w¡V«¡ÑhœuN\–­ÌjX …J¥>;1}ÁtW¡Uƒß.‚^n9ù3á;£»‚2!Lg¡+qGÞÆÁØW0Ï0IY…2ì4d¹†F“eʆ?wÇ•xùž;vÌMäÙõï´Äq|NAÖV:'ÎÌÌlø}bÒn6›XXX¸¨ŒÕ™‚ÂZ­æ®ùùy¬®®ž•†k»ùŽuÖ)–†Ò¢ÓÁGWwäêÄ´]@×f˜¬lç!,¾ÿõ7á'?þe$Í&ÒFbïl™Ò "¼-Âê´E+ÍØ+×Ê{eépæò¥ 3cq·q'få—7=õF,Ûn4ÚnÄbÑD²™mQ­VQ*•Дï¼ïs®4båReK£ ´2÷P‰e°˜/×¥Þé^++†‡ €4=VXÑU#´\TØ8°9¥3·v,VÖû4ÃnµÍ;DàeF™‡Â*é»A-àºkÏ8$ÐV‡u¶‹& :& …ŠÅ"¾01™ñ2c6°¯¬”:»ëN[€Y0[Æd…Œ–ô†ºÄôE:ã™%b‰ˆ{fÅ‘}ŸÔ‰$~ï™7à)½yLNNbnn.8¦ùq[‰Þ7SFßN knn.hr¸z½ŽÅÅÅmŸ}K@qeesss˜žžÆâ⢫œ´SµYÛÒ¦aWæy ¶ê,Ö××199éZ™O8‘0”ô<ÔKÏO÷ ðB·G“è½ÓÕ1=¥R)ø=£££îwýŸƒ“¨}äKøŸ/¾! ¸è7ëåä½Í¡­oJ©•3²Ô¡© = Hï"…iñÊê~h"×xþU{1^*`mm ËË˨V«h6›(‹niwÙ d­¯¯ãOïßyû-¸yß(™@¦HSói ˜Î9•¤2…RHh™úœE«U ”€€2À#x‘ÿ”RÖ‹ÊÚ6ØçÄjm¼dÀ_/}&€K‡PB0‹ù•i·ž6×0Ã𠘵‡³v€a$µ(åcÜ::„öÄKûá™í€B’$î¥NÛ'OÔ0¿VÇ`®ìØ«@à_ªðû§Ù–°asS8¶Ë¿E¸ç¦KS@K ‘ú1ƒÐڈߵN!" ¥µ¡ß# ( i-~Qjmߣ€8BOAãOžs#^ù±G077)%víÚ寣Ñh P(tÓ|>¿é ó|®suN¬ÕjX^^nñF»Ëêêê—¼·úBåÄz½!òù<ŠÅbËþu)—wƒ5–—h¥”+?œ +EŒW£ÑpÝj‹‹‹ÍŸ )œÞ*È0´…TJDd: ÿü9OÁò¼RÏÌÌcy*Fg#v±@×éžF ö¿LUvY^^Þ±àªÝ®¯¯cqqÑÍg Ô/…nÂmÃ`ý2€ç²ç3ö¡ê4¥EîîdI’´0$Änår9w;*þ\3]°:h©îžu…v&vŸŸšÂk>ðY¼ïUÏÀxµ×!r ã?©H- @¨ÈåïAÚ;I“–׿hkgÎ'¹, Ò”&SRíš2á x×_E­VÃÒÒúúúÓÑ\.·é²ÁÐКÍ&>v õÀ—ñæ{î†JH) €j&f"L$´H¬”…Ò2lH…Mœ¡Y7µ®„F ÙuSöÿ!«¥`¡‹cR4B‘n ƒ€+´È,Så@6¸7ïÐDýu¬|¨³Îó@{z–•xýP¿óþÙ̱Fð¼üEqZk‹EÇZÑ«(ŠÏçñÍ™<ëêÝ^ÿg®Ð2ZµåÄýõ§VÚ0`&­ÖÄ50Œµ±:Ú“fA–Ë=”öúVjh-Èþ»%LéYJˆ±øÇ”néÃÛo¿o{øòù<æçç100à€h³Ùì( 6âlË´‹éJ’“““AÐû¹QÂ2“›Y–––θ4¹SÀí?œÙÚhÞ»”lbt—s¶¤iê|H8èÊçóè:ìlAN'Q¥ÖÖÖZB¤Ýó'ggñ²÷ÿ;Þ÷Êgà¦ñA77 ­íc#VZCª:$4”Ò@¤­¸yŸù ©½Ð˜Ç–Ø*[PvS¶ì¤­¦§Z*âM·^¿xìI”J%ôõõ¹+wbð6{ò#SÊ¡¡!üÚ'þ/»éŒôW¡ HS&ÔM !Rh!¡e• ª$Dª E ïnA¢ È’ˆBB(å´J¦4%‚mݲ‚ýB·ÑceAUöÏ™üÄP! <À1YÂeGºß¼Þ| ²®¨:Ý#w`Ï2QóóóÙ¥”iËËË.c2Žc(¥Üg’óùãÓ ®ÉBd˜@Ò ÝzüñqçÖ£Nðßn2v¡ÛÚí»°Nþöó”wÍZBG¬«4ÒAJ„FÏÜèu„7^¿L-âÿ?îr©ìJÖ d Rϵ!åùžØÓ4Åä䤋Èêt®t© ›Ôβ¸¸¸­Æí|/F#¨ PbÍ#—b ±ëƒu@1,³³³®¼¸¸¸xƦs§K¥ÓξÑç­­­µ”9ûûû122‚‘‘¬È^ó¿?‹ûž&|oÚrY’B9ÇwówÕ´¥¶ÄwÜ©D¹N=¥ÒÀI›k¼4&'“ Åo¹ëf¤ëF@ÝTÄrœ®÷Ïàà Êå2’(ÆÏþÓG¬ Ý¯Ní-I Ó&tÒ4Ï›M÷>•4¡Ò$ì@T¶Ô¨R"-´‚Ö©7)%} Ù9dìDÖê¡#¸çg™*½ñ€û(>1…]ŸÚʏ#&|÷F¥¡I)ϼj°êüyÚMR‹‹‹8qâĦJ/´?Ôj5ÌÌÌ´WtaóøôbXfµ@Ó%8¹Njµš0_[ÇhµìK­ZðoîÞ]Ÿ™¾ja˜ÆN¤–'c ÙÜ…‘ŒS—¬ÐÝw2j-ý÷j["´û‘´€PImŽ¥Øêç”]Jã·Ÿ~-^ôч±¼¼Œ|>ññq÷ûšÍ&¢(j-íÚ±§ ·4M/:« µÆÒÒΪ¤t.Jˆ5ÍÕ]ÎÏv¦ñ%°EÌÖv_v”È= ¡{‰±Ytm-%6ÚñFpr“Rb||CCC€'Wñ²¸~ü0t#¾Óc8-Vâý£¬O–b~Y^‹Dbn°%BdØ+é[ÿJüÄ]·`uu®ÜÊ[ˆOg¡vcxÏý_Æûø²_¯$5«$NšP&TÓܨ€þfÖׄcSTâ|µþöÞ7•U•U:{­¬Ì+3"2ï/¾ýío£cŒôHÍ×nï!uüù¼Ó05æx¿ë°cÄÞø³ðI ðþt×m3€äó¡Pú™ò&ñ${•mÄNû---¹úQNñ•[ÇI’àÊÞWó„.*¯feDªžßGÖ¥¬*¥Ä%²CP]Fw¥ÅÊ¡œ½†2# v—¡Jè$Á‰±!üç§<+++.Ã/Û¦)+nÙÜÈ]ƒ»»»¸téÖ××ex5%_SÍf3XGëÚÃÖúú:–——±ººzSûµâá—yi­{\y•¬™™œ9sI’`¯ÕÆw¿ýoñ3ïù´-PËBG³e «ÉS†ÞøÎ‹£á:S±Ã/õËx×(Ìy’mC6õ|׃÷âôø(¶¶¶ð¹Ï}Ωt¬` 2)Õét066æ$ëýãwཟý¼§V )¬ZÓ;Ú- m& ÓVÓOf Ë\nÏw ¥ tò.Gea ÔQǯÛáIÂÔOb?QÇ­!Rv‘ȯæéi€p%'åj#³Ê‡йÓ"DÕäwXƒ>Ãû›ÒŒ¹œ#•ÛÛÛ×Ü÷“$ ÖÖÖ@¶Eð¥ý¾Œz•:àrA¯Ý‡äÅ[„Š!¬êÅ-cò^+¿á˜Ã§Þë0ˆÔ­rS…fÇ¡J´0™(T‰Æ ÏÏã%çfñè£ââÅ‹AÛ[²¥oV Þ\Kè""V«««7ÄHž…üv»íííx ¸•¦)¶··oº½Ž_€õå2¥pTTjµZƒ•ÙéÆÑÑQœ;wά$ðËú4^þ¶÷`e{Ϩ=.éw¶‚åÑڽ~©›*t •…ŸK¶´¸{‘³4\­à'¿ò)€ååe<òÈ#A¢õ *ûwNŸ>J¥‚V§ƒïzÓÛð…Õ+N¡r*ƒdËÀ%Ú¾à~f{y»i§)[.[βRÞoèÓã©càJI°"‘ ŸZ”v lÌý9à’_‡Ÿò·áL(øØ†&%Ú†~ÊÑïW$©„I(ã'N,ú>hwµ@FÕ[4Ó4Åú~ÃUF$ýaäµ¶ð¾(w?y°S3ÃbJÇzÈBY|f]ì÷Ó~\\ƒ*­AšÁÊ\®íe?ýä;1›(,//ãCú666ÜïB¯IåAV‚]-t5 ¬¯¯ã‘GÁêêêU{Àò†{z)[yê)·(o…Ý‚±"`źÁÅ‹eÐÚjµx­V«8wîÆÇÇùÈ ¾ú ïÄ_}þ²XÍÕ±­´°]ƒv2*–ü:ã+"áÀœõõwÝŽg_0Û*/^¼ˆ••€×o./:åÍéÓ§¡”ÂÚÞ>þùëß‚ÍÝ]Sd[ƒÔnç1\¡Õ6{^Ëgg¹Ç!切¶[ÍÃêžâÖ¡½Ž­ŽÌÌ"ZH;zL±²Å“iÁ×Ȫ^ä )Xë#a)MÍ£ŸU©¸)‚0ÏÔƒØi4Šš=æMB¯-´ÓÒ—¢p'c÷Ð@¯c­Êp^9_–gàéL+Zª¬' ~…ŽX7äöqj¸mAK%‰‹t@¢15RÅÏ>t§{ÃpñâE\¾|ÙµÞ8 #» ZÞûœ”A‡3T]¾|[[[‡ÊI sÚÐ×k ßÚÙÙù²ÌnŠ««† ÞDƬ8y¾Ì×’m²/ëĉPJau¿où£¿ÁÏüõ? YoЬ,:ösj?LV{‘¼+Û²’“rœÍäÒŒ¬ðŸ¾ê©J´Ûm,..buuèt:¨T*¥N§ãÚIîµ54„“'O>¹¼Šï|ý[Ìþ-‰œ\+«VÀÚMÓ.eŋۊփŪ™"ãU3Ùa¶šÚý‡äó´@Û:dØòpjLðÞÇÅà”U°\[OÀCœÊ•zxrqVIët„oÎ?on×bÇûêø{ݶJ…œ~=J+Äž÷µ£±l‡6ŸT*ÌP¡¼O‡^d_»„p¥P°»P)—‘åö=&2GKA;KI‚žŸÃKο$¶Z-lmmáòåËøÂ¾€¥¥%¬­­a{{Ûeá1x ê]ìÚvõzÝes]¾|/^Äòò2¶¶¶Ž´ý3(L•yþâÄ`¬«®Ó+÷O­VëR«² ’¦i0e855…ááa,//£Ùlâ—?ô0Þù ^õ§áìôT%±Ç_’4…Ö&8‘xUŒŒn€ßÙÂ>mȵ:)·«”ÙߦR¤¸czßûà½ø/÷1lmma||Üm„Ÿ››C¥Réúî”B½^Çææfî»ÖññqÌÍÍamm ïùÂE|×ފ׾üe¨‡×nã8¸•V×-53E˜˜ÓÚ·|Ì„¡9¦”Yv ±§Ñí¶ù™Hü`ª²Ä ®#—N[`âÔùܼb0CVJA =«`YXÞj´Kk}¤­ý¼n-Ñ%k…à·P’RÝÒñ:{¹²=GõŒÞ-œô ðf¤Q¼aàÕ:d•,ÒæeØø‡45pUÑf-•&(M¦mh?ÿăwàÏ—6±ÓêàÊ•+îÍ`ÚsI’ä¶åØ·Øh˜ü0ŽƒÉû{ADAÜ O(ßÈöš\s$¿^üû2V¬¨`åHX±Ž¦zµ ó¦ ‡††pîÜ9LNNþvq /|ó»ðöO Ôj¡Óò~%´|Ò;µØƒÕqiïÒ‹·S{ ”~:ŒðýO¹÷ÌN0~,Þ[wåʬ¯¯cssÛÛÛØÙÙÁææ&–——»VŒdkffÓÓæ>ÿçßÃ÷þÞ9S¿ûh6A­¦ñeµÍioŒo!m6ÍG»i[†ÞïVïtLK‘¬‚¥„ž§É©}VÑJýô!Ó‡«l¥¡ê$T.ˆ•=Åê+XDæÿ#N¡O][Ò©eÔýÿ®mL:šï¡Ýé`qw߼˳¯1­õUµ¤ú¹|¸’ä«VÜÆìÚßX t…I öª!¨yÕŒ|>šh’T³ä¦lŽn`“»Ò.X׬͑ëv¬‹}X¬pU´û856Œ¹ÿÓö’qeS…l `Egoo;;;]ü{´··‡ƒƒÔëõžëynÔÇ^~¬è»ŠËÖn'UP浪¦5kñ =êâ–aYë&›B¯µÆÂÂNž< ­56êMüïoÿ~àü-¶÷Â(‡v۷Ϭ!>m…Óu¾M–i«³NãªÖø¥ç}*Z£Ýn»Õ!ÍfÓ½³ÞÝÝÅÎÎÎ@;!ççç<þáÇ>…óÖ?1ßSz°ì´`£i'*›ö|óãËJ[ÆÚm7è ôÖ›Öi…;hɶjêcÒŽ‰ n%¦ jÛ½‡xÒ TQÛ›éÉê•ÚÔÂUê ʵ'3l.¯bQ”‘¦øÌÚ&ZÌ9£H!¹j–RR¹Êø«(_»R¬PeîS0âö`dùשèŠ,T‰È%¯„®)C(x 3ž¬Äã•v+w^q×)W«eŒòrù´3ÄóÔ¡T;^²Ñ ]&?‹ý\Rnr³#Îc°êXŸWG(Sl¶'ã›K;Â&THÆþy¤4Å'¯l¯-†ùk~pÎ|ŠT}„¨"l±rÎÏ0äˆaÊ“^Ø·§½‚å÷B|­µõ¬)áÇÒÚÇ8ˆÓI%ÁÏ<ùNheÞdd£ŠT,þÿ‡††®¹?îzý-+{£ÃDcEÀ*ü ‰OèõP³1ÀW«Uœ={sssPJáòî¾õÿ?ú®aÏ©YVµ âÚæ€ß­°NžžÍ×RÍò‡Òï{Ò=xÂü Ó*d_ïe;ìAcaaccFø­~ßó¦·¡yÐðmÁ–ÉÃ2 e *m5fi³!-sØï&[A–– guy[F{p«Ð—¿;q:©Ë T±N©kA¦î|§T¹çƒ,†4Y¬rQÚ­CeŸX].>,`õÛ€¡Ä˜œd;Ùø¥Â]ªìÀ\°>G!³2ÅàÖæbG¥ˆrðÓ…Êí±„6+uÜ¢h¥}6VN©JDP©˜0„VxâÜþé…Ðà™]º&7S²¶|㓆E­Á&+V¬þ°V«•ª?N'P³”R˜™™Á¹sç044ð;Ÿøžÿæwáý,»ô´Õö-Û"KE„ø ßú45ËŸe^“Ǭj…W?÷+0^­"MS·’…HÛúPJáÔ©S.žâm{ßöºßÇÞî^¨`5í¡T²ìgjµªÅjV³å@Ì–¶‚tZAš¼o!ж*ƒ‘ 3E*”A>üµÏá2_ _–ÌâJEË6çyŸ]˜¬m)¶=d½ïò*`ddÄ=ž•J嚨$ÒW77:lÐÅ”rD6ÓËÏ „C $T,Ê„‹RðåBŤe[‡lÈVä ïfÿ¹? lÐÊýõVb¢ºXi;]h¾þ·¿ c³ g}}½KÅ*ƒU^ž~œaê°5ˆM Öõ¯›5,ã–¬áĬd­*‰×YÍ*: æ©Yl€Ÿ™™R _ÚÞÃ?ýÿÆþҰµ{`ÕÛà K’v|þûR @ÖDÍÁ–œÍtÛä~îêõ:ÖÖÖŒàiß±¶UÈ555x÷羄—½öMXÛÚ2+YÔl‚VÉjÚ6a³áÕ,­¶ðjµE¦– -í0hµ¬W‹W÷“|Ú¶“&²mWJ«Wmÿ˜¦-ñx³á¾í”DnIº€TÎ1ët:Ðk{(À¥(Ú)wöðQ«`± È;ðcr/ 쬑š‡%…`u„­.…J(U”Õ¸(OÖ¢l7Q|_ð  —’ëtì|¬f-˧¾ËU:Š[‡ÚNcÚ¶!›á}Œƒi.ŒÖð}wŸlmmª+»eu+ì‡ËðØŒ+Ö±S³ªÕjÕК577‡³gÏ¢V«!%Âë>ñE<ûMïÀŸ>|Ñ®Ÿi» ‰3¢Ú2åœá€\Æ’ Â-}»RÂ7Üqßú¸Û›››ØÙÙqSW«œœ8q³³³€_ZÂK^óF|ayÕ¨WÁdai«a[ˆ [v²°ÕðÓ‡n"Ѷm+nS>.ƯENék{(eµËª\ Ñ^ì´T$ÉwÐÚ F§V1\µ¥ß+£˜9ökHøÁÜÞÉ´ƒ·î"ÈB+XÕjõÐÏA/C¶ÂæF‡}Zº3§+gzwŸEb½,r×ÉÖs‘,Z*àK±:E2„Ôÿ<­9ïÁçdù8Ÿô®‚Ôw»VÇy³T b)­ðÊ»ÎàÜH D„à;fÀ*2¼W*•c©bõz=”;ÿ-ˆ+V¬ã÷"²SFExYÍ’ë9†‡‡qþüyçÍZÙ¯ãÿxçñÿý½¸´¹ Ú…vê°Ó Ú….ñ\z²‚ì%™žâ?<å<0kÔ¦••—ïÓjµJ!±ŸšÅüü<àÓ«ëxñ¯¿ùðçœze& Y¹òŸÑnŠÓFÕrŠW«i.i˜÷°Æ‹°ª–ª¶Ÿf4A¦mׂu ÚöÀšÚËò$ `[ŒÔ2 åSøE˰Õ÷>Oìó÷›âO>÷H ^Þ‹u˜]/‹Uš‘J‚¹±!EVÁRbó3€rAôJÉ”RøVaÈVJ…YcDÔ­je×ídfsÈM$úØÅ)ïVÍ¢ÌT!Ù(hóspœ«Y¶]H‰ÆP-ÁÞw€þªUYlƒ­Ü Å‘±bEÀÜŸµcZ•J¥´mÈ-nÙ°7ëÂ… NÉxÇÅe<÷÷ÿ¯ùègÐnˆŒ,ãkØN…9›Äde×ëp–†´Âo<û)˜2ïÞÑétÜÇa[…\ÓÓÓ8uꔉ¦8¨ã[^ÿV¼ê/ßoU¹®Ò†i¦ ª†õk µ«éA)ŠnÇ¡>ôjÇ=ˆvbÛ´ }«OF>øËÓ¶hûµÄõX1cP·•Ð–Úø ÿÚæ h}diX2‘w˜ÖÓQ@ÏMŽ ¥ˆ| :«UÊgZQà¹â VÊ@ÄBònß´ ùr…0ÖfŽºTØèZ~uŽVšÉËœrLƒê6¿ÃegÁyµ^vÛ Ü5a~ç¸e.U¬²Ç´R©\õïÊQ+U‡U ö÷÷ãîX°òj2ç¼!¥êñi½qÕOÛ°ÝnÄyÒpaaI’`¯ÕÆO¼ÿcxÁ[ÿﹸäMÝŽU[¸•%¦ØÄ¤¹1öP)ÄÏŒ ãWžõdTm>Öââ¢3½ÑU·?ÆÇÇqîÜ9T«UtˆðSïükü‹7ÿ1ö÷†­¶WÁdØ)O2v²ëÚáBk^õÃåÖµ] QªŽ¿üáO:“•­5†‡‡¡µ¾¦ Öù©Q.¹žæ‰wö<)‘Îî#d»0ü§XêU& ÞåßÃP&Ä_ùë(ÛVÌÄ8(Nªµ¶àeÛ„Ê‘*­QIü°U±öööÕªLÅâ:®*V¿Ð¥”Âþþþ‘nˆë–¬à]—ÍÀª$ˆzïqxaõÑ6l6›.tZ^=k‹}‡m£ˆ¥<™èÒô­&Ô-j6ÅÒnqýVf#·-dùëx¸úøò:þç—.€ó¬ñÁš÷A—ëf —Öcf&r®"¦*ƒ0bÕ!ž, “»&ƒ´HÞ®L½ÊûAÌ7›Bô.­ËM8j±á\‹ö¡S²¬Z¥lB~"öÚë¼øìždÃG³…½T¬$IŽ…Š5è›?©¦Gc{¬X}ÔH|mqÛ°´:†;°&I‚………  ôO¿´ˆç¼õÝøÅ}õ†U^²Q©ˆp0!›)‡mÊ•/öãåwœÃ÷Ü}‡{¿ºº@ÖÕø±0Ïœ9ƒ™“Áõ©Õu¼ø5o«þêýhׅϪÙ2Q ͆ùh4ëÙJ%`5EäCƒÛ‡ ;ihA«)…=Ø 'å^Ç^êUxZ)B 8õK)6‚‘h›º™C Y" Tùì+ö‹qk"ñZ‰4½+üà=gÝï@Ö‹u+OîííEc{¬X‡­(ý¯w޽üYÜ6LÅú”sçÎaaa•JõNÿ÷G?ƒgÿÁ»ñ–Ï\D‡ïÂX-ã̛ܻGÁQŠºï1xéùSÌÈúÆÆˆNI’\5dÀÜÜΜ9ƒJ¥‚f§ƒŸz×{ñ²ßþoxdeÍ)P Gi•UµÀmC§r5€¦÷l¥¢½È[®íØâ–cм§+mf'Û.‚§ZÖâ"ÒOGµ!ÛÁi´ÛxÕ‡?Úôö¹¹¹àµ1>>ž©pµ¿çJ)´Ûmw{NLƒ{ƒàz†A¢ºUµœCÊ·›eKPñ’mS„¦v¢L¬ƒÏÅbŒb«—R*A§¸Á/†æPRåU+×tÀ\+11S†Ï;=ƒ¦ ìf' {µ o†‰Â<罤±bEÀ²õqû7æKFþQ/þ¾Ü Åþ¬<ÐÊ›6ä¶áôô´I‚߯ã_¿÷ðuÿý=xÏ¥×D»ÝtÉ)æà(‡T~4~î‰wã!;Y¸¶¶†­­-YGz9::ŠóçÏ»PÒ÷?rÏýõ7àõü:õºÉÇj°‚å[‚®¼G‹¡ ͦ0†2öi™(ˆ–3ͳÚÅŠìT"Ú™\. ]i³iV󸈉–¿^ËûÆýý;ÀÄÈ\¬~T¬ã´£°_¥3ÛcEÀŠuë¾è´.5Âó´!pµÖ˜ŸŸÇ… ÜÀoìà[ÿâïðŠ?ÿ >qe3ÇPíï~}‹oò¤a ¯}Ú¸oÒÀÏêêªËÅIÓôÈÞ¡'I‚S§N¹Ø;Í&~èíïÆ×¿ö÷ñ‘‹—Щ7„‚eCIE› ð|™»CS3ãÙjÊ©EÑ>íÇ´)ó²%ÙBÇýß²Z_7[âsÛµÚ¸²»‡ïzçûÐJST*eÁ555å  lUK?Î,`IæÎéqLÔªÁel‡ð`‘ÈpwážÂØÎà•§XQ`ríCê¡^‰V¡ì@*Ñ· ‚JÙcÅÑ Î‹…Ћ¥D›PUË«Yv­ŽRxñ™Y7Q¸¹¹<ŽýÖQ(½GNò¼¢×[bÅŠ€5`ÕâóyÓV­V+­¬?«Z­âäÉ“8þ¼‹ux÷Ò¾öÀ¾ïñÅ­]— žföä‘õcqÛãRŒkßzÊý¸sÌÜçÊÊÊ5,À,À¾pá‚S³>¼¸‚¯ù­ÿ†þ“wa}sÛ´þêukboä¨[ gާ†W¼ÒFÓ«]ÎXéjy#}K¤Ê‹©F ž–àå¡®íOg +µ-ŽƒþÅ;Þ/n›%Û *822‚ññqgpïu0ïW½’U¯›¡â‡ÎÌz¤ßJ„ÂdP‘U­H$¾«ðî`H1muµ¥LE¹[¦³» Y #ØRdnrÐùÀ”ûÞÉú²X©‚D³ßŠ[„ZkJª$Ñø—=åT¬ìŽÂ^^¥›EÅŠêU¬X±"heŠýY ZCCC8{ö,NŸ>íÒàßzq ÏûïÇ|ðxt{Oø°:a^V°Œ8u­ÃÙJ‚ßyè~œayyÛÛÛ²ŽrG^¥RÁ©S§Â4û~Ïúõ7â7Þû!Ô÷D{°Ž´Þðj–…-ön™Ë]•6ýmœ7Ë]Ö |_$®ÏÐfN·|ëÑÂZ-¤–ˆŽð•6|»pï ïü³¿ÁûlæÕüü|ÐÌ$¡L tª«Ì¯ÅÏ«O>=ëcœÿ bɲüL¶sH‚² ƒyA4!íšU`l§¼ËsT.V¤\ê¼U¬”ðŒ)%ÂIa’•*å²èí†,Û.´-Å—žŸÇÂÙ×¹½½<–F#7Õ븛Ýå’çA!>V¬X±n9ÐÊ gUI#üØØ.\¸€“'OºÜ©7iÏ}çðãyK{¦e(ÖµøEÑ$ÒßÍ×§j¼ñÉ÷ãŽÑa§d±'Ë-Ý=ÂqiöZk¬Ôñcþ><ýW߀ÿïAc¿î2±ÒzT¯@ª{•Êy³êuû9T½ÌyÍP cˆjˆœ-‘8/=_$¦ X5]V—4ѧ¢u¸º½‹oþ“¿Ä{ÍdæÌÌ ¦§§ƒŸ}ll “““Á›Õ¦£P°´Öúù´³sÁÿ¥¸¦=T1œ(²àâ· óçù]ÏTÙ€®ÓTt¹h !X£x²¤_âE&«ZÆkeÍï"/ ʬÖÑ6º¡šh¼âö¦M(U«¼È†,pU«Õcÿ÷¥^¯ÇÉÁX°bEÐ*2ó^‚·ÝP­VÑJ ¯ûâe<ç]ÄýÃgðÈξ]lÜ ¦ Ù‹•Ú6¥)NUüîïÆ]¶]¸ººê¦ ¯dqšým·ÝæŒü‹»{ø·ï|/žþkoÀï|ð£hØÒnjø¯…÷ʨ^Ͱ½(WöÈéÃfÃ]7+^L]÷Œôx§¢lzøúèâ ¾þm¯n8¸’Sƒü3sâ=4~½à €SÄæF†pïü”ºƒW®àAE)˜îÉņ‰†/@Fªü¢hׯC±‚Û©URår;I«¨MlƒüÆá}Z0?ÉðQ1I¨\É"|û N̰ÁÞÞ^×ï\Ùkø¸¶ åkŠ¾Ì£+ÖQV%>±Ž3hqº7¯³ÉþÑç­5&''111íímlll Ñnãw/.áM,ã%§çñÊÛOã1c£þÀǹCDHÉÜæ«¼þñwá;þñ3øÄÞÖÖÖ@D˜uuÔ “$Áüü<¦§§±±±íím\ÚÙÿãoðóó!¼üñwãOºg¦'ª¶Må6ûåTâS»ÉznRˆƒ¨k+™Ï”] Ç^#‚ñ¦™%Úbê’[¬HSP;µ{ S7½Ùl¶ðê ¿ø‘O¡m{f'NœÀÔÔT×ÏzêÔ)ç¡c`ÝÚÚèñê§=È€õ¬óóÆô «ædAÃÆ48;(XíOää%—Ðà&•k­?ñº¢R¨Ê’rž'¯˜)e,…œϦw7ƒh'‰M:¼$:ñsÃU|ã™Y¼ñ‘+ØÜÜt>AÀ´ Ë ŠÛûÇ\:”R7U¬D¬X7¼v Ççñ–.†¨J¥â@Kú*Z­´ÖnÜjj “““ØÙÙÁÆÆZ­Þzyo[\Å‹NÌà»/œÆã'FðG;ÑE6'kZküö}ÁwêóøÈÎ>Ö××Ñétpâĉkz©T*8qâfff°±±¬î×ñKø(þëÿ/ºó^þ„»ñ¬ÛΘ¶Œö#ød§Å8Á›DÖ“¥äŠb0S§ÝÛ#»œ¶41óX¹=>ìÏ>÷(~úoÿÑ™Ù+• Nž<é JÖôô4æçç»”ÀA«—‚ED°žyþ„›²3)è|Eûók K’Üý"qž…T›Š°šUÒ¤Ìél[0׳¥J)hºx–e=c¼Fš\,©îTø´”€,;eHŠ@JáÛn?7>rõzÍfÓAÿΕ)¸µZíšOè•}YeН{#§cEÀº)걟ï*¸|@(þ&Ýâ•$ ’$Aš¦n pÓ4íR´&''±»»‹õõu4›M¼}eo_ÙÀƒ“cøggNàEóÓHAÁè&…×Þ}^ùðñÁ=lmm¡Õj¹öÖ5ýÅ´ 577‡lmm¡ÙlâO?û%üég¿„™á!|íc/àw;žy› 2õNk^v`• V±ÄŸ»Sš:%K1hÙÐVw‘v:xï#Ëø•>Œw_Zqß÷ÔÔfggs•ÞÓè|Pöóööö@£e×åêÞÞžƒ°çßyÊ©V.ÚÀÅØÇAgáʱˆWžÜ6fn*ßB̶ÅiʉgÈ?§^ù3ù¿wßJÖÛ¥\T©õX‘y=¤¢=¨5  L)ðv¥ÎgÆqÿä(>¾½ííí V£ÕjuÚ%ÐT«ÕÛ}±"`ÅŠu„ņø4MÑétÜÁT¶ÆÆÇÇ1>>޽=Iûûûøûí=üýöNUñm§æñ¿.Ìb2Ñ]íœQ^ó¸ ø÷_¸Œ?Z7·½téNŸ>}]v±±"755…ýý}lmmaooõ~÷cŸÁï~ì3˜Âso;ƒ§Ÿ;…§_8…;g¦œ‰™[„Êí³Sèn9A$Ü“ÛÝHàö ¹¸‹Åí=üéçÅë>ùy|nk×ÝÏÈÈæçç 'ʦ¦¦pÛm·pÅ_¯¬¬™zÅ`Ç¢ûç'qvjÔM*mZeÚ‚“¶ÅêO¶UÇÓ‚Ü~ {r$D-¡@ ³;Læ.æ6­/V9|4X•¨|VVÊÍAåc' tYˆL…_‹S{È"ëÃ"­ðò óøw»ˆÌÍÍ+‡²Ï¯r9]„J¥rlÚ„ºbEÀŠë„Õ$Ù>ä©C^{“$ ÆÆÆ066†f³‰ÍÍMììì`±ÑÂÏiÿõ‘e¼d~¯X˜ÁÃCÁ “*?{á.Ô*xÕÒ}ôQœ>}úºŽ¨ŽŽbttN»»»ØÝÝÅÁÁÖë ¼åá/à-prlÏ8{,Ìâ®Ù)Ü5;óScH´¶À=¥]ê¥):iŠKÛ»øØêÞóè2þúÒ >/  0Ó€SSS] ò¼°°àV³pµ»»ªû9pöcpç¼£ÞyÚª4p€É;û´—žÌ÷Š tAú®4RQÊ'«S8ÚOT¢PuŸ·¡âëð„¡1Ú[æoVüde+ Z¬|-,,`nnÛÛÛØÚÚÂA»7­¬ãÍ+ëøÊÉ1¼üÄ ž51 o„ÿÞ…Yœ¯Vðc® ÙnãÒ¥KXXXÌÀ×ëçdU‹akHÓË{øƒOðé/ºÛ WÜ15£Ã˜ªaj¨†é¡&†*Øk¶ÑNS´Ú¨wR,ïíã‹[{¸¸³‡VÌT*LLL`jjªTÅ㊑‘‘Â¥K—. ô³÷2·sžoxñcOûÜ«D9ljû~(œ®s+s´ WBµb+€ÖŒ‚Õ+É=4¼#wÅ·q|ø(‹T¦ciLöÎH¦È-¨&¤A~–ÉÃÒæ:×ÀÓ„ö矨Vð5§¦ñ–KëØÞÞv€˜6a™Ù½V«;À’Þ¬ãlÄëØÔf»£ÆtTPü+?¦*ñiª–ÖºËÏ]±$I\FÓîî.677Ñh4ðWÛ{ø«í=,T+ø¦™I|ãôÎ×*¾ab go;ïd–––055•kܾް˜i¯ƒƒ Ñh¸Ÿ¹Þîà“k›øäÚàÿ‡R ÃÃÃÁèè(†††JÖ‘‘,,,`jjÊAT®øôâââÀêU`q{pggpÇÔžxjÆÀEb¿_«d)íÓÏr ï|ÊX‡²pEÓ†VEÊQ©¨pa~+±¼(À‹U¬”¼ ʯÙÇÔB•0Äk¤ðá¤Z‰ S ÒÒ)^vvo¹´î`•Aº`‡6áaþïÝ+V?ƒi|ZceU->8³²ÅËœYÕš˜˜ÀÄÄêõ:677±··‡•V¿º²Ž_[YÇÓÆFð²©q<b×ð{·Â¿¾¼Š×›ØÚÚB£ÑÀ©S§®‹/«¬†††044ä‚=Ó4u¹aœ†/9i¥ì•$I\YµZE­VëiêO’˜™™qŠÃUði?àòåËG¦^ñ÷NDÚ^z÷YŸóÄ&oøu9®…¦EX'àw Ú8?,˜ÝƒÕ5Œ A‰Š' ËÛ‰Ý*‘tÆ,׺t®,žžL•Q³‚«hqÛÔY²ž1?‰CU¬6ZØÝÝu¯'ö7 {³¸ûFÀV„ªX°®â—+ŽèÆâ?ü ?ÜBdø†øááaœ:u N;;;ØÞÞF³ÙÄöð½Lho˜Å×áugðóW6ñÆ­]Ôëu<òÈ#XXXÀØØØ û³ ­µƒ®£þ¿†‡‡1::б±1Œ#I’\{öëz½Ž‡~x ƒ[¿êÕþþ¾»ÞKï9çó®Øk”JóEPÐ.¾BÉ©K˜Ëx7`W˜¨òðÓW”…+F2P?íÄcËÿ W)¥¶h_š€Ž_d²ÔR ÕFñ²æ÷J¢ñ §fðÚ/™½œ X¬Ë7ÒèÖq¬¼¿ÿ¨bEÀ:D5ÒTEÀŠÕOIc<+9ívívÛ)8I’`zzÓÓÓ¨×ëØÞÞÆîî.vÒoØÜÅ6wq¶’àkÆGðSãxóÎö;,..brróóó×<Ê¡4øgàß4M] D~ôzŒŒ8ƒ¬Z­:XrcÖW•§Xñ×øÔ§>5ð¸—zÅ?/ïÑ{ü‰)Ü=?i!. T¢œñ]‰MÎBj œá ¬J¥4@¤ÀO++I¢‚' YÁ">¿ã ð/=k«Ñh™X­V+W©•F÷A÷J^7±bEÀºÚL|Nc]lq¾à «ZÃÃØŸŸ7µ³ƒƒƒ\jwð››fªN¢Ôöö6pòäI _¿\™xÏA†"öÆÈI>©zɵ5 MÙ©¿l˯ªäiyþåË—±¸¸X:x5ê•\ñòò.¸ÔrŸeÁ W¶=è|í&»4«Zæ³eÙÀ†r WTÐ"DŽªE%¾+¹jGd—íC§¬)§X9ø²—»¨ 1QÈÊ–7»Ãed=izçGjxä ‰ÝÝ]ÌÎÎ:ÀÊ ‘u•c×+V¬X±Ž)l5›M§ÈðÒV«å¢F—ñ¯ÕjáÑG½¡j«rÎôÏË´yÏc„ò”§<%ªL§Ó4ÅÖÖ­j ª^V¼ìÞ󮨠møªö6+ŽgpÊS—6  ÏU˜æŽÜܪÞƒè6µg½Y¹yYbZ1åÖ Q±L üìþœ”¼¿ÊŽ –5ëk¹.G™K~A´Â‹¦ñ›_ZÁÞÞž,^;SP7‡ê±"`ÅŠu“Á·ÙÚí¶SrªÕ*fff033ƒf³é”­ìRÜíímlooãäÉ“Á¸ûõ.†E¡çÖÃÖÐÐÛ'—1ƒÀUš¦888Àöö6ÖÖÖ®ê@Û¯zED°þÉ]g01\5ª¶¾+Á b´0µs+Üò³íÁ žAyÊ¡¼¬¸¢|ðÊ7µ)^y*– e˜"›áfI¢¿õœ9IN*¥‘ªT˜ÝÍãõ¢S°x"µR©tù°ò æ¸ø°bÅŠ€+Ö1®ì’Xö41\Ôj5ÌÎÎbvvF{{{ØÝÝ ò€VVVn(`åK«Õ €N†®$IœÿŠ ìÜþ‘Öv»íî«Ñh`à6`QeµèyÙÛÛsôoà¶ =~v æJHiß"Tä¢ÜÂgV»8+ ®RbÓ; WE¦vÊ6*H}‡ØQH WH]tƒ'¾{ÐJ]˜–YúlÔ¬N¦}ø”™qÌÕ*Xk¶ƒiB X²ù5q£§icÅŠ€uÄU‹Ïg¬ë¤nÀgggÑét°¾¾øWŽs±2ÁmÅ]r©wî/qßÜܸêÕ”ó+W®0“ƒÿü‰·˜JLP'Ú±kZnÙ³ƒß"TÂeàKšÛ}Þ/Y.ò^Q×yÚû+qäÀ¯»}¨²*ße†…ÂéCEîj&¶á©Óc`±‚Uft¿Q€[…±"`ÅŠë˾zµ³JÈÎÎàß?ýnÔ*Ú€•Ö€V ­ µŸ”ûqÜbdåÿúÓ‡eRˆ¡â¶õôcápž«‚¶ ¼{Ã`’U4‘ûø(qmåoì2´ìÙO±€ÕjµËç-´®'`…öŠ“ˆ+VQíÆw1±bÝÌÕ«5X­VƒßéõõuÀSNMãkï:å|W¤dö•5»C¹%Ï Nµò2ˆ/ ¿I(SlËR9 åŽ"×›u(ÏU¶`×òh¡\/„¦l ÜåÔ<Ç•V½’9aJáÁ©1T­‡-«bMlÆŠ€u+T#V¬X7[µZ­ZƒëëëhµZP~â™÷@km"x©³˜ä‰B^ ãÕ+‘ûº®˜Û]ë°ß†²ö`W‹oÏÀ•ØC˜<#¡ „ʦOà’Üíiö¨©ŒOK)`8ѸÜŒqVÙÊœèÁŠë&ª‡ìç3ö³\;dþ\Çg4V¬›¤:Ni höÝl6]jû·Þ{O=3#Öáh±àÎo¥4/4ö À>o—^ÀÙW$ C(BÜ2”9X]~«¢IÁ®¯ó@ }{®Š®GÈ@w™#¨0šÁA¯×q¹YÞ‹å¢,”“&Ñ[´e­Ýã `qÐh|³+Ö!«ŒÆ(÷X±Ž{õÚ5„­AXYYáÄH ?öÌÇ™Ö`E›ÏIY¦´* „ð)T Z y-¿¨rýV%jU9\•¨]è®;‘hóDè(„™?„+©úÒ&öÁ)|ÏpÿÄpXe€|£«TEèŠ+V¬X·\qXeQe[ƒ[[[Î÷óSϺ3£Ã6–A@¶µ6&÷DøŽìõ˜r»ûÈ®•1Ó‚Œ •ÈñM¯ö^¾™²íÃP: \ÉiGy¶û¿! õü³[š‹Ÿ“›Å#‡¡Ñ]á‰÷ÿ4›Íž Öõ‚¬K±"`]ÓjÄg3V¬› zE2h­ƒƒr»Ýv¡¢Ï;?o|ÜWÖÜ®ÜJ«d¹½z^É2´ÀÒ 5‡L)™ÛC5«\­By PªV•ÂUÉmŒrÆ2(·>Çû°¼©O(Ñ…Ÿ¶Tá£äLðw ¦ýÈ^ ?ŸÇ¥âDa¬X}ÖD’Ðm6‰Â¿˜±bÅ:vÕ+’Õ+YËËËHÓãÕÿù9÷ÙÌ+ W:„)1AÈií²-ÈKžY½â„s,œqž›o•DðDyfö êòOeá (]Ï“ÞFäf©¼Õ:¶M=ŽøBöìŠV¸glx À:.+s¢Ê+V¬X±nÉ"¢ž­Ájµ¨ nbí§ŸyÎM‚cl÷-@VL”ö«Že" ÌßgWH‰Â0O걈9ˆnÈ\Ž^ 2~¯þáŠÄý+À)V΢..ÅŠ”…Ž0CËßÎäå®F X@o£ûq^ú+V¬>« ø¤ÆŠu«\%IŒ†Ë¼úú;ðÍ÷…JLR;«W¡K9Èâ¡Ò2¾õe .µ] (É7ºwO "? =â ÷RÆ@rµ« ÈìÄcà¹ò·1?£¥”o#@« \ñãÆÿ²ê÷ØÑ¡àùìt:Ç&ͽ•**Y±®WÝRÛ8[D±Á+Ö1¬^¾«ìr`"Âòò2ˆ'Gkø…çÜؤvon×N½‚Ko·KžµòÈ 2¯˜(Á@*Ü1˜ZÈ ±Û/O5 ¾”¤¢Ë3À„¬bÖŸZ%áL™Û—(€Š™‚Ì0¢‚m- ð„TÀUjãøÒÇZ«Ýnwµ|•RÇ*IÛ´Ñ{+ÖÕV3>¡±b·êÇw•dX]]E³Ù„ðKϹÓ#5cj·ê•S±\°¨²`%Â2I[(3Îç®\Ú&Ç5̈ê H¡•»à9¸Ÿb8£¾‚F»¿¦¾L‰ý„ð¦x'b)ÇÛ÷g? (ÌšwŽÖüŸÜœIBàjî+¶c}¹V|åÇŠëš*ƒF2looc{{ðÊ'\Àsn;•¨r,W®%(“D•G+ABpÁ<"¤Â;¥\ŽäY¡ %(!ˆz„‡ÊH®Ê[‰”iª²ë1 £‡á2B§\y · ×PµÏWY??§qás¬X±bÅŠuÄÕïJ€VWWO;9÷w JU‰î2·óB,®0“ÜOºdr„Ñ(ôNe©hJ°8×ìmv/J‰§Þ,8š¹ Â]…J@H8à’á¥Ê?N‰Ö¸s¤æ¬^iü׫=WTE‹ cÅŠ€5@UUŒrë¸ÀU¯¼+é»JÓKKK "Ì×ðk/x4x…Ëÿ¼bPÁÓF6ÚâüpÍ=ǽLîJ©cÛ&ŒÀ+V^­åŸ=UÕñiëÆ Ë”¼¼«V«…D)üÊóîÇ鉻' íN±’ª•)%ZƒF| )J‰ì¾5§ `*j¯ìzÅíAê§}”,–¦íCø˜ÀO J…‹Š[¢"²A)¡p‰ü+Ù"€³CU÷±bÅ:Êê7LTt×ÖÖ°··øá‡îÄWžŸ71 ¼g0Ñ~Ý Ã–ñ ¼ÌYk¿N/;=èÚ†ÞØnÑÂy¡‚䔘ÑÐA¡!ž ¦»ï'Ï/Õÿuø¬”¸=e€Œ!ŠRŸŸ•<’JÈS(˜ähï¿>,v`«° e-í€ò©ìJÙ0Q^ð ©ðd’Ý%X•ÁQYü‚ƒ"y½S‚yjYÿ§®Àp%¦Å÷¦œ²fcä’k°è§\‘x|Ï û¨V±ò ŠŸ“Õ+ÖMW[0ùí£h¨Åç3V¬VƒšÚÛí¶0µWñú>#CfÏ•o Bkè$Xʃ¯ÔÊ«[ä­2F"©ÐOnW*„'*…©rТ^Z%êQÿêXW+±4+£€Ax»øQ©ƒe~8HôMù Å4šöÆu …~±æ,É œû5·ÂRƳRÃzöt^¶U÷e¥^+@ì ÄUú´ÊÿV­,‚_””€WSm!ám®Zq€uLîýªXQ튫ÚÙ 56ìí¥j@“(¾MŠëÀU6Žaww×í|p~¯~ö}¨&‰iŠÖ O j­M;P+€?+åÒØÜn¢È@˜U]” 5þ+†³Ÿl»0•À0 XéÓ„]çgc ÍëùÐE=¡,\&ýšºÒëÉ«Ul2jÂMŠÇ¬Èƒu£Mî®bEÀºÕŠOh¬X×®‰cØßßÇòò2àö‰üÎóŸ€±ášKiG­A±[ÐÚ•¶þ*ø)BV¯(Ø1ÈL•³Û…ƒ5Ýš ê*ÁªPuÊ¿êc½¯Â¸”F?ÈV!_¬rA( üd2ùmlbE6Ƶœäžª,tEŠë&®˜ƒ+Ö5~Ó\ɉÁƒƒ,..‚ˆpztozÁ0?:d*±g:«b±b®¿qkåJÚÝœm‹åEWÄÊV°â¦¬‚àÐcúW­rZŽÙéB`€è†n?— i1XáCÁê å•­L„ƒe-ŒZoåN‘–µ cÅŠ€u\kÀpÁ;—`%i¬X±®\e³®êõºƒ«¹¡*~ï…OÀmÓcPmWáèpß /sv-B™s¥±Ýâû«D”{­l‚; 8PºÊ@j`°*Â0ÕHðVø·!X>¬0+K)PŠT¬ R$VÁ·`SF(Xy­Á¡^•)YEßc¬X° «`±G+Öµƒ«²¬«,\5›M,.."MSLT¼éOÀcfÆMÆ•6ÊÄâfNkçÅÍJ$²ûU8Úè+ò"(  m™ËyŒRaCi[0xhbßa¥ýø´p¨ÅÐnPiWøý20ea’d{*˜.TÆ­ÇN¶#ÀÄŠuË–¯I­šñiëèªW(Ã+Íf—.]B§ÓÁH¢ñ†¯~<˜Ÿ4*+Vš÷ ŠÄvç×F­bc»ò4(»‡”W®¸%¨¤iݯ*ö*Lõ*€£À*M4 é½ðÿاÕgRD;°ª@›âå×™¯Ì€Qí×^&÷¡Zå- Ž+ÖUÔDMGÀŠëáj Q WÉÆo?÷~<åä´…«Zå*„+‘y% îLOÜ"t+ñäÁÔí$“' D(@¥´rÕ tגּªÏ@ª× >­|è¢Ú‡yy\Áu9h”dk— ™ç %ˆð`åA÷qS²²ßOTÚbEÀêU{0ûžcÅŠu¤5hJ»„«¡Dã5ϾÏ:3ëüVÐ ¤4Ç3ØÓnq3L7ÐL 2ôpC°·…Tf<ÎB™€†‚²¬«ÜÅÎejWÎ}Q.ÀQ_9YÔ‡2VfEíÃ<¸Ê‹q€ª@ÑCþbi;9$h÷FšÜsÿ®bEÀêQ;†‰”ôµËÃA¯ýh±bÅ*†«^)íÕjÕ¥´gáêµ_u/ž{nÞ.oæý‚¼ÈYÊ•lú¤vö]Áç_><Ô›©¬©!@y¥ʶ‰`|ZÈ«2¥) Zù×í2ÁV}¨j…€„AZ‚¡BE Ò]‰ÎÇ%cþ’3ĤšxLîšbEÀºÖÕŽOj¬X×®._¾ŒN§ƒšÖxÍW݋瞛sÙV*Ñ"ŠA•+í2¯«/¾± E¦ýçÓ­ìêr†!q ùl÷®ÅÇýø«2§K.£>ÛyÐD=oSPý´Q²¹Ë¤}{4_ùJ>y,êw¥NÎu\{—‘òKF7dZ‚ìÃRÀÕÀVu½À¦¬á*V¬ÃT@->™±b]+¸ÚÜÜÄ•+WçF‡ð¦çÜ;§FXñG"ö ò” LبÖð½?ß:2p¥d¸‚W©D‹G¹XqåÒÄÝÄ Ø?TåUO|y¼C`‚ЊO ‡+¥q®2 •iÊñ6ü³ÇžvÁ¡Ü„bP‰r)íJiãž9W>DÔzt 2mA{0·>,e£d$ƒÛáœR7\QÁD` õT¯ &©Ï@Ò¾s­ V]“Ž}µý×)R£f[ƒök¾ŒR11èT+dò±ÌcÌ€¥9±¿²b‹0V¬› n°9o&¥!›3åáX®ŠlI’¸€H™q5VÑø•§Þ…¯æÕ7ZS»OeW‰U¨\þ•ʘڭ‚@ækò:–á(Àså\ë)¹/‰üg¾‡Âˆƒ~ *L²Jú„¡à{É?}u`U Zõ™_´ê†ÏWAnW¸ƒ²“† ½Š€ý4¬¼Ö ·œ¯gÅU8±"`]ƒªfNÇwM±"\õ†«õõu¬¯¯NWñÛO¿O˜›0í@™Äž]w£µ‹]€6yW¬\)»oP[¸R]ÑInÕ g2@(X$RÜÉ5 ½ê•ý”çÃ@© .:ŒZu À*ôj¯Ä)m'f×î(XÙL,é[S6¸”‚ DrS„ WYÕêzý¦Àoa*V¬kSqUN¬/ó""´Z­ÒM¥RA’$ "¬®®º†{&GðúgÜã2®œ™=ÇÐkh‡Í¼r-A'»¼ÙLúiølp W  \m¿¬rE™8WU9ÖoÌC 58XuCõº^Xq•ºåUÜnó¬R¯T¹uC¢%HÔ•¥lZe*I’R“ûq|£A,V¬AªŸÌX®zÁ§³§iŠÅÅE'ã³OLá×¾â.LULA뜤v™q%"”ÿ ¥}†•\€#÷r[0P®üù¼_aƒ í¥Æõ~ */n¡_¨*P™Â› nz\ùê³HÉíèU¤)r[ˆi6+ËB׺ݕ“¬,d]a/`Š…±"`¢ÆìñÁC)J¢Å=V„«®’1 ív—/_F³i$ßo¹p?óà¨Uë¯â¶ êúÐZƒ”2û5 h9qÊ·]ä‚R†¡TUÜÌo vÃ¥]?pŠSŸPÕç$áљథX¦zÉ58Ò žRWkÐjYÁõ¤”%Uä£XÁ’-Â<ȺÞ¬X±"`ÅŠëH*MS«Ð ®._¾ŒN§àGï=‡ï»ûl Tñ.AÊ~+²ÙVäbl,ƒf`f"Û=ô¼¡\å(W° EW)Ïz®Ђã&rYW>¯"ŠÁ›×Éc_\¾¼¹¨ÊU†ª Ðä{¿ZWV²eW¤z‰6¥`–+¹{2>-^¢ U+aKx°’$ T«ìkôFU¯ ÒX±"`Ô‘ªÅç0V„«Ü*šœ­Uð›O½ O›Ÿtëm(VHl̃”3´ÛåÍ6Ó l»ñ!ívŸ p`‘ûÇY±¼4·¸Ùã—„«<Ø)ªðüþð½I©—y¾çta&:á-ÄžíÀ enKBÙ2_¦!\¥™¬,ø»¼Òê C,©ZIxéµXâÍë V&´*0®û±WB±rY¢Ù_;£\û±´,\uµ’ºàªP•À]-TÉ‹iz?T[ñÐ-Å£|š³‡eʶÿ”h ²šå×>zÕ+%¯(.5[]¯µàù´Ïñµð`Q_éì|½~¯ëøå¹6"`]7 €ùån) ¾[ŠukW¯Œ+žlµZX\\tfö¯;5ƒÿòà¯%P•ìA¿À™'‘‰dpÊ•€0“¢à¥,»¢ÙÂ9¸r+Vœ©*„+’AyÊU)]Ítaþí¨ª­n%­O(ë©|å/î¾Ì‡…ªŒ²¥ ÝÍzœȼ—‹°Òî”CVT¯bEëV@Û¡ødƺµkIÁýý},--!MShüŸwÁ¿ºû¬]qã}UÎÄÎéì*̺"h·œY)-Å+·Ð _pV+Ø„2Ü|ƒ¸² üz–\˜Ê*ïð::¨êº¿<õª Œ2ê²…8XåÀ”ÊÜ& Ä/@ÂDÛ05×KÃË$h-· 8qŠ;Öô_Å(†X°bÅŠuäp%ÍìX[[ŒWü¿O¼/8=†&*Ⱥb¯•N¼B´9ÏÌìdw "L['<Šn@1í¯˜t«Uù€D‡ÍÀ*1êªzƒƸ~µ`ÕåÅíĬK¨W>Â!õQb'!ɸ/†aÅV¥R9vþ«Y±"`¶¾à$°¹F #À>‘µ4`6ÆŠukU¯6³VVV°³³¸ct¯}豸kj:Ë™EÖ•‰ìÊN BÛ¥b¥¸½‚°”e[‚J‹ù¼+…püŸÄYåªÐk•—#€ª.•i¨*S«Ê@ªõ‹ÙBd Ê*XÎ[•ñ`yxJ“)9](Û‰Û„4=`ù¯Äˆ†X°bÅŠu<«×¤ àÚí6Ñh˜•ÏžŸÄ«žt'¦‡«®ØWÅ­ÀÄÙµ4´ •ʤ²ûÅÍN )å⬲˚áàŠ‚¸§\Á/.R®h  ê´è°JUÎ$!QV®l°ÊšrkpÈÇ3Ý-¿Ô/xVdVåPNk0ˆË àQ«`U«ÕBÿ«®7¢È)x4ÐõcÅŠ€UP-Ö*»ñiuK¼žKÌìÒoupp€¥¥%çwùž;ð#wŸCµ’dZ‚ÖÌÎÉÛÊ«ZòÄ„ZU ~‰¯ûlÛ…¤$\Q\)«\¹V”½!–Ýäƒü¤õ.øB©é½¿éÂ~ *_m¢C&¿çªN‡ôfå•KÅÈ>ÆÂk唨ԟŸ¦a;Q9c|¸‡o{ÑN2`ÅÑX±neÀjF=.Ö­Qýø­*• ”RØÚÚ•+W@DÖ¿ðÀ¼ôÜœ_pí¾ÌT Ü%¨´ µ“‚N¤¢›©ŒâÁpåÏsrÀ…‹òj%r¯B¸ ù£/˜*ªʼnT¸ÊFS!ta 6`7XÇ;ôj7f[ŠÄPî’Þ)P¢ÌÞABv¿ ;Aþy£œä÷Vê§+•ŠËZËBV§Ó¹á!£Y¨+ÖUiXïXcźàJú­–——ßêÌp¯yð1xü̘õQÙv­BS{âw BÄ4P&†Á¯ÐÕ$Þ)(9‹oWY‚ áŠ2œQKyÀT2¹·Í›.ПUZÚK™*€³R|ÿ9Z½Àª×rh%Ú v¿£ðY);qh¹;h”ïÿb³ÖU«Õª®ÈBÖõ4¸ÇÄöX°nÀÁ*V¬›¥z™Ù9ߪÙlbiiÉå[=cf¯~Ò˜®9¯•Jd ƒ ö ÅJ®¦a¦’ko¼j¥ì rQñNA(ÛNBd®D몈 aªÐk••BØ€êr&ùŠî»õ9Ô·ÚUî뢒ë*Pp9QšQ£øµÖ­LQšºeÏD>7+ÍL!~Q„Œæy°²øõ+V¬› è‹ñ9‹u VY2»ô[É}‚ À÷Þ~?t×T+ à J9åʘ×E¶•‹[àhŸÞîàHùÖŸãEBÊrÎ,of·TETÊíÊù£UOÊ™>a‹JAlp¨ÊŸ ª¤švHoVù¤bŸÞ,¹`]ï"š!TªØìŽì¡h/7šðKK¾f£ÿ*V¬[îHŸÔX7W•™ÙùFDX]]ÅÖÖ`ª’àÿyà6<ÿät8¨e[ƒAÃ\+Ù 7ßø<‰SrS ‡^AbýXbQ!l ª~@ªLe€¨;`4—º€£<•)çþú]ÃSæ×êÙV¤‚½ƒèï ,Ìú Bä(Q!@±b¥RÊL R`nçÛ|ªnÀ©V«A)åLï}„’R¿kpzA‘<»Ÿä÷ësè·åƒA†hÊ,«¼ö·ý z¸ˆðY NµZÍÁ?ï2!¶cEÀºªA¤j @ hÇeϱn‚*Ë·Ê®¼Y^^víÃo=3‹Ÿ¾ç†*ÚùªT Li·Ý” Xà¬ý¤ Mí’!D;Ob ‰“Ú…™¥ÊUHõRŸ |P¹€†¾LïyptõÓ…@U®:•s}UÑÿEÒ£EHA"©ÝÙÝô  ¾êÚOÈ“…i&¦¡Ÿµ!£YÀ’UöÆá8¼±‰+V?µ`Lž{„±Žw•ù­¤§e}}ëë뀭ñs÷œÃ7™u)ìªÀ•¾*s¾=ðuAUvZPÙëɥˬVÙ=‚VµRVúR©h ƒµê¤ ”+ê¦òÔ°"C|ÞZœ«Œlð7`’°´®Êï« !MªO^áb%«»…(ۆȴ /4›hÚïehhµZ-÷ ÂõP¯òZƒžbEÀ:êªOf¬ã]ý¶;–——±¿¿xÌè~íñ·ãî‰À.gÖ¬ TÛ€Áš›å¬SAWÁ£Tñ„¡ç»dvy@Gw ƒê³*¼õÝ:D™•UÁú\ü\vŸDƒÅ<”’ÒaÔ®‚l,¢îûÍ.n–ž+â„ÑNÁJSʬÉñ—}¦Ñr•hÅnäïšû9sBPcÅŠ€eë'u€j®à:5û7 ŸÓXǰÒ4E»ÝÎýC/[‚õzKKK®}øu'¦ðó÷^ÀD- ¦I•Ò Zù,+ˆ¶ C•» *˜$4ü |X"ãJ^hµ°.3{*…©Ò)ÃÇRÁùCUáýõžHì=]8ˆé=¬x˜S —Y•£(\›C”¿‡2&w9A¨”ÊU°{ÿU®X°¬6‘ªÆa¬cVe~+€ ¬¯¯ƒˆPQ ?ö˜ÓøÎ '„Q];¥Êy¯Lÿ/ÓD0)HpevºÀ99(ÖÞØ6’3³‹ã¼7³Ä0ärSQ ƒÂTâúõhÑað‡l(ž.ì¥våŸî‚4;Œªd»LN¦E Є"X…ƒÔN!Šë)nø B­9Ÿ|ìŒV³PÚIL òÎ@çÃâ8]~«,Q)8+UÐÔSn3¯V ’ÙSüV á¤`/€*R”r¯OÝ¢Õ‘˜Þ‹Ô(þD‡œ.,ˆZèÐúɹB΂é>nO)!\›“ÚPQó:übgÍ@ Rì¿J=tq6VJ„×Í_Û‘‘óÆvh¨ëMD£Ñ(ôÞÈŠÞ«X°bź «hJPªVišâÊ•+ØÞÞ6oŸ}ìü“…ép2Юº2mAnj;)È@eÌí–“dŽ•8Ž(q€÷± ævÚ–À¦fvtÃU/% ÏýƒD½¯sq ¹ðv•P^µ‡¯*W‰B÷tá!’ßUŽÚå&ÿ\b»¹­ÊÛ»öf2¤,d¥Dø°h€ÜˆÔ8.JUös¬X°Q­¼7×ñ—*Öµ~ÝL ÊDöF£ååe7ºþàø^u÷9œòFuYÐáRf©P)ÛùÖÐ>1TÚy}<»”u¥ÂEÍH•‡1¡f©àwHõ£X]ÞuQŸËž¥\QñIºÚÝ…Ùé *O­ÊSÓ åP.J™u7Òs…”º&Ñ=•*_Ÿk´°c_çÃÃèÕjn‚ðfó_Q ÆcD¬X]5àÞýU(þò夋Z‚¿›››X[[Axå™9üðí'QIt`d—± š“Ù­zE.óʪO:lªÌ–æpÏ œJå’®ÒL*;ߎºó­P´°¹Q•é½d5•Uáe}Læ*Q´å}Òôž{šdƒT¯ÂÕ8èZV~z“ßùº¬7܇Z­´ÙED7°âßüX°®aµ—=Ǻ¶UÔÔZ£R©@)…v»ÿŸ½wµ,ͯƒÖï÷ísî«n=»{ÚóðŒgÆöxì‰q,ÇJ0ö0l,@ ù!‰•˜‡e±"¤Ø™A¢$8‡(B " Ä ƒ¯qˆ‘˜ˆx?3]ÝSÝU·]Ïû8ûû-þø~ßcï{ιçÞªž®[}¾QOÝ{Î>{{¯½Öú­uëÖ­Rwóò¤Ãüñ÷ã¯îPÕ²T…szTY¬7C0Õä†jod@7Ib®|£bkoÁUsœIl®ßjRYz<[¹2g…íN4ÆÃ@Wb«ÕâÌc¸ÎªŽOž¢–oCŒýW>ˆ–…œ„v4ÅÎCæË޲ê¿ÊòàØà¹õ_­A×z­Öz­×9X‹$ÁÜ#=ÂÞÞ^™&üôåüüÇ?€—¦“„~TÓЮÊïY,¹Uâà+×Þ(ª°W' ëA>™àÍÆ"Ò$´·åÎÃö±Ú,'#&œ}zpÞv ˜+.{>+v.L|† jˆ•N¢æÝ/Ñ„¼¶’!ë@CŠ]R,;ÙÐæÈ‚ÃëZƒ¼øòáÉ÷|2±^ëµ^ç`}Áw_ðÛžø€Ç¤Dߟ¬ã°Öë\‹ºÛÐб‘}Sâ›_Á¿úM׆þ*g«ØTÝóº4¬•Vƒ;JvUÍ­ªdVUÕ“UêkDŽ5¦Ë*kEHñ;g–k%0´ ˆZ’Nb¥Àe˜n™Oë”`뤮ÁU€Ö‚mxÚȆ%@‹'’ÊH䈱BÛ?ØÈ€)Ë`Íd¡X2·ßî ¯9c»¹¹ ÁÆÆÆ±ü«çÅà¾^ëµXO¹îù¿O\"Ƀk}p½žõZ”mÕ²V¸yóf ý®íMü…¿ßÙ”Ñx¬rJ.³§*Ç1TÜÔqk`hî[“¶Gp"ÚÜj^¾ÕÊÇ ž¼ý)+s¸Òv§¨Õ9ÁØÎ“@ØJ@kÞ}ž%²áømxBDà r¨Ý pª1 6ðbå^ÂAz»qN|ðË0ºµµUØ«ñz^åÁ5¨zÖ9,87!|/’DØ®íæç „ýúc¸^Ï`-2²·¬ÕÑÑnÞ¼YÎÜ?8àç?úMøþK;¦JÚé@Ѹ¤ôVcÁñ;G4ÔçZwS·Y" rTŸÃºérºi•«OW™óÔS†'ãù ú O½À³0Usï«1ë/ 6e3 š=^–åâF,u8(“2š$ló®Æ=…FâW|‚p{{{ð/šÏÒó°«5àZ¯5ÀZqíˆðà)f3@&ë7u½žnÇÜ÷ý1#{ËZÀýû÷qûöí²Ãþ®]Äðá÷awÒ5>ª¶ Ùs«Úö ÐL æ_]Ìÿ&©ÐãòP…×ÞŒc(ZjÁœ0)xJ¦êàÃU©…Û=Í„!_}ÊŽÂe€iel…nC.ºÍ¢®ÃbhwÏT¾mf¨ŒüFÿY[ƒÃWKF¹Yÿðè7]ÏÀ*û°ÚÏç `-Që4÷õZ¬õZ¯wiÍ3²·iì™Ùºyóf9 \êïà]»X@”4VVªa¬JO`þ5D´æX ÃRË–%Áf¶etÍ1»æ[ÂCOÅX-6±/&·žUGáêIïÄ i)0ZT-a¸V,ŒæœËæßϰܹdVå«JLC{Ae¬ÆÑ HtÙ Ù$¾äò`×u˜N§˜L&¥ö)ƒ¬ýýýç6žalÄ_¯õZ¬Ó®ƒæ/é×"áz~Í3²·‚Àñø…ØÝÆÏ}äU|Óæ´0Vmúº¸×*çZI¦¦´æ]¡0Uâ 2?Y ’šÈ~l¢pP1èL†ìîK"NËTñDjê€Æ3nw‚§‹ ÀÖê€j9 Ń´ [ªêÕË î'Þÿn ›•GÙWãg±Ú5ˆËŒÖßvypg'U»æ˜†v=~üx½Y¯wþÂ-àyùÄ[€uY„‡sÖz­×³g­öööðèÑ#À†þøû_¿zÚ°UÒHÙw•jn0d³òÿp5jô5K6ª3³H.øüœsåMã³*¶÷,‹œ¢¬™'0U+!*®¸N6¾/ۆϨ£p0âdÃe jn¾ÖIA¦ À™ ¡2Ï@«Ó‚h ë £U™/åÄ–ÍòŸD×½Þ)˃c€%"å{ñ¼°Vëõ"¯ÇxàÁÉGüçâƒp®PÉ—\j~ˆuþÕz½³¬ÕãÇqëÖ­²ÝïÙÞÀÏäU||k£†…ùO Pk Î‹bh•G)¨4€ÊÿŸ¥[0°* ÖÑÀVlÉÇ*oæ`€[§ô`-ØÇ=…¡+lsšŽÂe†xž*Xtu ÅSƒªã—Ñýt†fRÙàžSÝ1” çôÖICsp•³°èfwàï wPŸÕööö@vÛßߟaò<­µ÷j½ÖëY~¡€µN¸^KÏrÇñ m`hf¶öööððáÃôEÁO½ï ~òÕ«èBT©‘ h3®Šؤ¦7ø*Øs®•rü˜*CF‰%uá\üÐæ[É\Œt–l«S§“@ÔRÀuÒ”ájIï A‘nOoz'@Õ1o[ð„*ÛnP~•=—+°‚€˜ÿ÷%—777Ka.0ÏŸ¯ç‰½Z¯÷µXߨõÀhr0ˆÎÖTñz­ÈZµÑ @Êô¹uëV‰iøŽÍ)þ£¿ŸÜÞl¦SÅMžð;–eU\ì(‘ y°þžx%ù®¤¡µ¤a:˜Êˆ ó$Áœm…üV ‘穉­QÖ Óƒ\H­¦æº%^+žÒ‡5¸|I¤Ãé§ ÜÛéÂ\Ó²UÒl/dŠm¡s#’­|8?pÔHüm¯ÇYæ¿:Ok-®×`ÍY_ðy$‰ð3~ÙÝ»v¾º,b‡õZ‹Ök%Öj½0®º "ø×_¾ŒçÕ«˜…ÊØ_…jh‡TI°€,”IA4— ì2ªDSqÃä|o€SÆW,Òâ ‚˜“ÊÎ3°Tgd«Nk|–@ê$P4½q‰IÿL,Õ³UÃË8håÏGI´¤aË8Ê ûª ™ÜÛÒ¯áM?ÉëÂ… ƒ—öàà`nVÜz­×³^2çÛðy?/ Öàdüe€q†]&ˆ5ÿe~G‡×ëÝg­Æ&v yInݺUªn>¶1ÁŸÿÐ+øÇv¶Òvs¼TªDUIhõÀ¶–y¼´5EQ ÂDZ)ifò3kÅ:9ØxOœ| ¦j9a;ž|áÔÙÀÏ ¨NU럞'°eƒÔrçáÄ`õUÙ±h¤þç–µ2 ¶ù¥ý›½¹¹Y¤óœäžŸ_>Y3SëõN¯óz$?÷á–ÈàÛµ>ŸZ¯e¬ÕX$‰;wîàí·ßN À¿t ì}×°Õé`°X@1¢§tvmzÙ††Ö­ür™{~–a˜X¢µ˜CCCpuLô æ«•Ž;g,uö Wª*\$%ž±£pc<Ÿ•éý=]¸äñM»ßFÚÛX ´PÀçŒ6™W°hÄÿàýƒ™µÚÜÜ,ß›\lþ¼ÊƒóWŠº^çí¼àƒ÷ÖëÙ0Xßðãßœ³ÁT„;XöÖkk5–ç±VžNðs|¿ï–›Õµ²PϪÙµ¦³b¥Âpµ@«2 ¤¤+Ä”%A”ÉAX+ JÁZcÖª°d«2M§`©VõºÏG:§x¬§š2<#˜ZfˆŸs;ž¹³pñeËóµF·¬Öà^A˜B“ö^º‡Õ8cÆK@ü¿G3ÜŒ6XcyðÉ“'ÏÝô €”%ht½Þës¿¸Xg[_ðy€_°a\ÃÛ6ÌŽ€é†¬uÁ5kUv¶óä@3Ã;wpÿþýLþå+ñ'¾évB­´ÑF dZJ C;òWÙ«t+½r¬T™T=½Rµ &)lE=NÏ-j>Š:UúÂ\À±2ðZ}zpévÍ6\LÍÛ˜§»Žgf©–3\<¨Ê+i,S¥‰\8]˜³±Ø°Zh•‡išðßïïÖ*G–ŒÖó">Í~bÍfïuÍ?âø½Ï©÷úÜK„OòÉÿá!0['c­Y+ÿpäÀ|æ½··WX«ožtøsx¿¿°VžgÕ¤®Íë,A¡™‰r äÉìíÄ`™ì+Jê¿$(€Yk~/ƬR-˜¡š¼ ÁÕ*ÄÒ W¬põYâN¶Î6eøtá£\9þtìÕr#üüȆ¶Ø9WãäÏY05 ZéƒBJ ­tš_IüÏAÕd2ÁÆÆF&f¶No_¯o8&€-€ãÖË/øÝÄ` ö k€uÆõ>€Y | `¯j1b"Â2×¾^ï™5Nc! „0Æ‚ àÇ®^Äå*¶»”kÕ²V…¥ÂqÿUÙ5Š¡ZhþÒïþƒd‰I´"¯F‰Ý‘Â2Ih@ó°aœõ[ðŠjXðX|æ¦÷¥Ãcý…'û°N““Å™ª/óß­-w†“€„„©Ì™lKŸ­AW–«z°þïÃCìÙbyPDðàÁƒçn€hÍF½7×oø¶Æ‡õy€_X¬§[¯ûò"| ?àˆ° è×á{唆Dß÷eg? ÍëñãÇØÛÛ+#åŸNðgßÿ¾w{³VÛˆ+h®Õ6h@T“[•ñ•{£²d˜E,•*Ò7Ðrðuѧ`*ÿam%%\ôk%§5§?C¦jUÇåñ< ZÈJL»«Óù°ÞqPÕÜ›P#MCIc¶jÕÌí-&ËÉí9Åø%g¯¶¶¶Š<˜còÊÒúyZk/Öy?‹>ŸOûܬ_ðA—ÚƒÄΰL'à!€mb…õ¯cL"RX«ñ6·oß.iìA€Ÿ¸z ?õÒel…P@“4õ5I&ÄÀ¬^4>¢‘àÓL ’„@=ÆJ £|+–qÂÜçµ90q$$Ž’Úå4çY2U‹€Ì©ðتq §è(\¸–MžÅô¾úå|þ¬q=θÈ:‡¶` ¨?·Þ*k÷ˆ<žÚNÄ~ép(† Öáá!ÎÏ(ÑØø¾^çw]ÎÝÛ¹õ`Ýð!¤è|Ã>)S‰pûl‡Žõ:§¬Õ¸;0¯Gaoo¯x²>±1ÁϽú¾skªÕ ^2¬´*i×;.|8çz„[¬³¬Ïû¾â£¯%£ï;c5Mñ ¼"b×ìÕ{‚µš»$£ûÞÞ^1áNDð“W/âß¼v SÕ’i5EG²  %h›oø©Ê01›ÏÅÛe”2Ø*Àªdg?‹Ë†åO²1¸’9Hk0zö,WzøS˜ßW6¾¯ SrÙ„á ¦÷SªÂ$=CPµôþ^Z)Sˆ5–E^lÇk‚;Ü›•Mït õ×›ì«ÌïîîÀÇy˜O®AÓ‹²öÏÝ3>7kdÿŵ”‡Å·\±ƒ#A¸æ°^¬ÕšØçÅ.äuÿþ}ܹs§°[ß½9ÅŸ{ß5|ûæ´‚*T@¥ÚHƒhkk†@K¨%w*ºTÐŒA™riô´kÉfv`0XxªWDj2>âólÖRôÂU «Sè¹Úc>-Øâ<0õ Lï‹®ã;ÙаnƒÞÁFUÌÑ ¹Ÿ°©ÊÁpjÖd`¡¹†×û÷(u^¼xÀqyðáÇÏ]öÕI@ë$ïÕ|“c€ÿ{ÀFÚò<€—s%þ"€ø€«.ì ã6¸8² ]ÄšÅz!IÄc,öyÀêèè·nÝ*ÞMü»×.á_¾ˆ®™ „h·€Üf3`¯*ÇT ™s Nñ¤Ë¡’½>T­‰]Ðá‡]sÅ:TØXàjU¼t:’é¬ÙV§N'ÄeôOÂ`Ëd¾Ù©ÀÖjý…Oªݶdº ¤Èz $,z ëe ‰UïOHXêË üWû R$C.u˃÷îÝ;wûrB´f´Ök °NÞÅ{á3Ÿ$TKÃCnÊŽÙ¡šLŒ‡kÖ ±²˜«±=ï(ïÝ»‡{÷î•ælmâO¿rß<8pj¦Ý{Å ªZ %Mõ šôuŒýV~©{¨j÷`=2Š›Øë-õ Ê`b°5²cÀ6Œç",9â: ÃÅÓ~;Oë;ÙÌΕX©Uî댆OY©3~~«€ªvr°‹Ž&‰¦K.zàñ eµp°6š/î ü·~r’Ù«üs(Øßß_ï˜ÖëÝd±¸åÑoW’EhåSµ5ÀZa}à—üÅ›¼œ€–%ÊjŸ”©u"Q!këü²V9‰}‘=ïðoݺ…#—5®¨âg^ºŒqw¢ æ¼*mýS^ <ú¯Èq2ÜVÇP¦D0Ô*ab¯’^è—Š_^o60#gl( .‚L²@äÓ³MÏâ¶«Æ;œ°+\}ÊðéMïËØ.ž±ò„!çÿ}§œPÌA¢Ò¾œÜÞX¯Ê¶R*s˜Œð¹Û¹ E½øÒá!n¹¹={®Bƒx†»wï®wNëõ®‚«ö÷[6NqÚ¹X+¬/ø!Gþ€‹HF÷(blc&Ál¯ÎßÊIìó‚BËmTsÿü…mü̵Ëx¹ëÀŠÊ.•<«a »6}ȰUÈÀ‹µÆF4Ë#㺥ŸÙ@³,ùÍ5²·Ç{ÙOB0œ³G9õçýŒLÕ-ž*"×ßXÃbåͤ˜Úý_ãà! 欚à^'ᓉ,qÀý•'O‘z;···Óé´üLò\g_­ í/Îj;÷ÎÉs>Wë > à’Ñý]hˆØ%‘øøPâÚõüïôrì¢ȅ¼Ýýû÷q÷îÝ–?9àÏ\»Ìß³1õ©À*ñ)d”¾.%Ǫ„…Ê`ä[”^ ™á$ý4 M‰íãêšd^×â•i=4Ãx†EK˜Ob¸žaeOºíªA¤\õ1WM{_|¿|Ö‘ ãM—ª¹,Õ2¦jp«M΃–€ñkeí„áøgV ˆ±0’x@⯹¹ýÒ¥K…9nÙ«”bô󍯝íº.矌¶pÀ®[„¦w„Ž®Ö¿?Ÿð%€¿àSàG;zôHîìØø‘m ²žÇ•SØ—+ Urܺu ‡^ݱ-‚Ÿº´Ë?ri—AÚðÏ„–t²^&[mX Èœ¾îñ $B„)6ÂT´L&š¬d!m&ËèÔ^s\•E¬Ïhç/§1– žB!äžPÕ¨º|ùrùùÎ;k¶j½ž‹µðÀ4é'Ÿ„*Z#J–U±˜ç3·g£~´R—ù(u.o0"/ƒí©&bB êÀk@)% ‘ÖÙeÉ„à‚ƒã/ø%ÀÞ¸ñXãæeÞ¼y³Ü.„€ÉdRWûß|½3ËÌc„ª–÷¢õèÑ#ܾ}»˜Ø_ Ÿ¿|1þÈö&ƒhü$¥º¥‚ j•ŸH¨u47»+˜;œ½¦Mò;®M‘œŠ&KšÓJZœ†šæžÊuk,»ˆ dÀ˜S¢U›9P¦íù4ÀëioûL*s†ñæê™˜ß—¦ÂŸPÍc½Æ·áJiY¬ ªæe¢±½ya5º¡ž(pÞŽ.ê?ÿ­ÃCÜpÙ½e¬®\¹â_$ÁíÛ·Ÿ{à´–ýÞkc{ûâã'OŠ%èÀý¾ àžÏÂs °rÖ‘¿¸M…ñEôj|ygç×ï<:èûkG1^Ìû©œ >שּׁëºàjAØúK|¶_›À¾lÍf3ìííáÉ“dc þ• ÛöÓ—v㎨º =›Ö%3JޏX©À’‰<*¥šÝé€U¦‹%$Td€[$íKòsùÑ׆¡ 9£ý˜¨—%AÉU:B™s„5kÉYÎPÍ;˜ËÓ°TOËT.VP 0ÎÉWœš•:‰]:Iã*×¶%ÌØbüÉbHoßâ{E«² G’"«'«t6<›ŒÿÜÙ«–± !`ww"‚ýýýò}ö±/MbÔ Ù‰ÙÆÝ'O®ÞßßéÁÑÑÕG}åAß_yÔ÷—öÍJ’^ß÷èû~nZñ˜íÊàk^ÙðzÕéÍeR`Þ¾ýöÛ¸{÷nÙ)~×dÂ?}åâìSÓ)U$"ÔÌ*d^ >ÇJ¡ñ^5ã{è©w<}.àIy´í'$õ•ž° ¦­'û»Y+ó‘Æ"íŒÀ ³^ãm)Í„—ã¨g©x|ƒjsæcžî1žÁ´!Ÿ6¬´ÙæT€jÎ}j7àÀ{5`¯Ø0SÇ2kksÜ?öÿeFËHü½Ù _q–xÌ^e&ÿyg¯«õzq×#$Åê–F3›áÍåè>-$©ðÂ… Η÷êd¹ÖëÝ]÷ïßÇõë×—möൔÀ-r{ž×yXƒìì‡Þñ2€ j ÁbŒÅl’&é:µUH=4Ó®ëh1†©ªR$e Y³0±N43 "ýŒ jTÑè$´…^¨‘ˆ¨º;™Î>ÕÙ£Oml¨¦ƒ~ÂzfúfŒ[7ú~ûë1nß4ÛºÙ÷[{f[wÍ6óHÿ2ð•c&æ°ç|Í“dczø³»»?Ðu1Ó7 F ½ÆFd8ÙWÞL)U’”²Iv]AB:Ï— BC–éÔU@ƒ˜ƒ Í)W¹ûÆÙ.0»êE%³V Åz*³=&gg•rÉ,9Ž;ZLYPYkÖ°^NVɨiî8øªN09>'7:ʯ¼0Gj\5Áa €’%OîDOW~Ðg¦N`©–ý½£8†öZ9ö48 [¦«ä‡Ž=f9lÔ“ÜÛŒ¬ÿd?±W“ɤ*`è½jóç^$¶j…u>Þ¯[·náµ×^Ô3©Èlgcãî=¯¼{ŽªZλˆH>,þ& ?ðMÎD¢¥3éÝz5!íP$t!¨Ä¨!i&bTÕ£À¢ˆUë€>BB µT)"A‚¡3“ЪBtæ*–*é ªªI™œTÃKªG¯L&¾P %L# 7û~ó·ßŠqûFŒ[7cܺm¶yÏlÃÎYÌÄ<9ð[Bèv÷ƒOolI9«–”² ˆ3F¨&ëRR eÀeuD¤Lí±°^ôK1 "z3hJ"… 8¥Úç4ìçqCeà–9Ñœà\¾SÃâ™CGÝB9xZ±ê[¶j±=”Ô"Ìöâ&µµ´·Õ)­×«\O¸å¾œ=}^æ}…FIó'“T'ʇ\&<-≤– Ër3=WSËØ©“nº¢ìÉ9À*Kƒlß 6è›Í$àz‹c ŽË‚$ðÕY_Ø««W¯–}B¡°Ymfà‹ªÖÞçcõ}7Þx¯¿þú`ŠÚu>òÒK_ùîoù–¯|€üµ­›7mðk~à•ãþ«çxk‰ÐÉûE@ÿ(`P„`A„ !F3 "J½Ý{³`ªÖÅŽHNU"!¨™Å„N$ÎÈÐQUuFÑn•£:KÇ~ € "¢ªÁÖÌL•¢.-©&^F ÉD  T¡¨ŠÈû¦ÓÃWb&‰@IÒã 7ú~ëõ¾ß¾ãö[f[·bÜÚ3Û¼o6eó!]3ÑuÝ\Éñˆ™Ë["ü‰íí?±³õhSÅÀæéÆ¡BDj cðÔj©Ñ L£„N(e’J븨€–Ýð 2e,Ù¯Òa‰dð÷@t§|"ŸBñv%Pd úÉ`F`yóœÄ•x5'ž ëJ!šã&ýï¡GÕ¬,ʈàâq[—wEò¯šæý™Ö!É zÈÒ,ËñæI‚RÑ—¯ìM89^Vd¤ÆLáÊU@+N2>  šÇÈ CE9¤2Q;å¨Â š-µüyaù_ûó_\À^]¹r"‚ÇóŠ®×z½“ëÉ“'xíµ×pãÆ ÄËå—67o}ÇûÞ÷ÿ|êCúØu} !bßf)1‡¿°¿ãÛ>Ïþ«Á|ÎAÖ·ü_D‘(€2AŒœ IC3‰‘‡¤ö" .ßõ$³ì§"61“h„(BÐc„UUR'!ˆÚE%-˜©’R»äøQU$˜‰5ˆÀLEÚ0_B1I/Èû§Ó£vÝÒ‰ˆ1…’™…ëÎxÝèû­[1nÝ$7oŸùÐ'[ðuìÀô c&æÉŸNÿÉÝ w?BŸÇíd`JJ‡ —HÞ‚$í¥¨-¥Ë „¨O*hHpË<»Êhžœžî$ù¬JΨ¸ÍI4´¤QòÄ$Ça‰ô4„6‚ÔX:£ó XH!×=ù!G æèˆáb{oFéKè%]¾}©¬WVÖ‹ó%¾&Lu “8lû…e~9q±×‹+÷¬š¿¼pyöIúèJ>¯ÕÕ¼?©U2Lƒ÷–Çb(ZÞCËȪ>š5¬U¾“¯ÎzüÏ÷*ŸT©j1·ßºuëÜÖöó±îܹƒ×^{ wîÜióÚ샻»_ûžW¿é+}ùå¯Ï‚ÆUCFÆé”G©w˜OPÜŸ÷uî%ÂL|àçüµÉÄÞa‰$å(„ÐÅh"b3R»®“@ò(FND ¤tdìEEDI!¨’hÒ C:0«RôH(!íŸT€ ""ˆ€Ô* SM²’vª© D‰ª A¯Äd UÏ)WR *þ|©Š:ó6¾@ÊDU>¦zð±ÉDS¦9 €ÐL÷7cÜz3Æ­·Ì6÷Ì6ž]Þ­31`mÌÄ<9ðÃ!ýÌ…í½ÏN73 ejœA@Ðå8$ê¼eÝO|‡Y [¢’ æÌxÌŠ¥ôu§ @À ”^ÒC±ÉMæv¡ MÄší²ø¨#%G—y ýŸl&îõ‚V #”&™¡öI{ؤ@š^_xEaå~ÛkgžÆV<ôëx,@5…q@³Õx‰Öë%KH&Y^(\pÍüüúqË ¾¯˜)95¾[-Kl±õj>3˜}ìêx©](Elcœ¶Ïs°õ :c%pÙÄŸ}ò¸°Wíäà¥K—BÀƒæ2ß/Âj#dÖëÝ[f†7nàúõ냓ð©êÑ·_ºôßÿþ÷ÿý+»»÷gb¯b3U"#Rc™‰ð(5¸ÀÓÁ‹<¸X߀õy±ßЛyá<ÒT!ŒÔ‰Hœ%‚Ãè1JØAŒ!&€L(*!$ •üY"€j€v„* J¢d&¢AƒFZTfèRŒ€©1}»Ó}¤—†ô…×`” É,/JÊÌó*¢"iÎ,( ½ˆï=fò‰‰Ò;Ûfߦzð­“Éý¡DºO¹GNßèû­ë}¿õ–Ùæ[1nÞtðu0'fbó5N!"?Ø–ˆýøÖÖíŸÜÞ¾3QŸ×ËV,x âfp¦ù% QŒ€JVÓ ´ì/“pØ$5øADRÔ,A¡"ÑCÝ$DƒI’u_ìTŠ{°*JiUìì)”ŽÈ$ûh’6)¥V§±²g£½Ÿ"H³•À¡Œš¥i«–Æo•€Ê7°$Ê™¤pµ¡æsÛz$d#%íÜhÉrkŒÌ–À ÊéK£ƒ©Ó’e²à>NôÀŸ@}Éè}0²ÌæÞªUFUNÌ¡¤sK¤­†ŠþÊl†ÿÓC’[àÚµk ùBå^­×óµñúë¯ãõ×_„u_ê&¿ûÚÕð^yõ7ÃæÆÁLÐÏ f ‹"Œ§›ÿ¾ °'Iä$ypÕ½Á`=Åj}%§S3g¦BŠèf/¢j]Ò©rHGš„˜!UJŒJ31MH‰dé0/0SQMjR%1B}’ P¡ÏÌ”ªv‰ÙTœå – 8³4}XX,8øj¦EÒä¢ ýÜ«{´ú䈈™%+Xbx!â&û˜Á•?ÎÐbÚíb:•àÏ ÖîÄ8½ãæëÉïµùVŒ›·Ì6n51$M9~z2yû »n|s3©áÅ ©³SÂ4 ¨tçy¶¨§çQä*Jþc ‰€# ¡é—Éw˜Þ¡EõLQBÒT c…d·ÈÜ‘#9 ÞÑ'|H9Ñ9·„ôÒc%,žÁ™´*iÆE˜lale_We½êíëÅ d24ËÀ1O/Ö.Å2ᘞ ”’ðMš,€ˆ þÌãÄlllc¯º®Ã½{÷æžD­×z=Ízðà^{í5ܼy³(ð¡­­›¿ÿÚµøÝ×®½>BšI°¨{ë]Œ£*0Šöª•?9Ík€õlYà¼Oú¼Sˆ E¤wɬ`!ˆ™Ñ½NèSܨJb¬ócv"ÆìÍÖ“ .͸çjâyKiæ,hpÉÐÄU<¦!JŽa2ñ¬j7Åw¤D[æÝ@ŸJòo‰†=Dš=[ ˆšIŸ@7ÔÃÈ  ¬¥œ.UGx…I“¨YYLÞ¤‹Î>ÕuO¾¸K—ã áæl¶ù5‹[7û8};ÆíÛfÛÈîßÚÞþúL§(c#Á‚ £7ËRÁ·Ìº‰DÒôš¦'Ù)‚#€€dD·Dõ„̹՜‘4ó†÷_yf)Kب(ÓƒXBLéqÍoã¸ÏÜÏÔªƒÄX%på¾-×üàl$3K¬We½ÜhWØ«æþ¤•«¼(ÕrU®uÊ«àÇé,-º?-³sæW<2òzÍ_ân8o*:?cQ…Í•OÌõ;VP²Üd&„u¦˜‰ã[È‚û4Œ îó* íhmêµã²YqY0ªô;SƒFâ¿;8Ào¸yø¥—^°“W¯^É:÷ê4ž¬µoëÙ¼Þób:‘øÉ ^ÿ'¯]ûì^¼;S‰½hìCè{•hâLƒ™ŠÅ”Yi&ég(!PÉlnçy‘_$‰°x±¶ºŽOD¨žÀ„~"Ú9§áÕ9P‘|Ê_€Ò‰‰ªERMˆQ;$îˆ!¨ËRʤ'%ši2¥Ó&„u©Q¡”À’Ø#©š˜%P÷©z˜•K‰Ê4™@Söb9‰@ÐÌ~8hJÃiŒ*"Gf¢"}aRŒÕl¤/4þ<|ÿN¡f{ybÎÀµÉäè&±‘´¿Ë‘³Ó É\’ˆ¶3öîµ’6æ¼p)9Ó Mšû¯òÆ4ýÑ™…I€Çï!&¸¤þ¤"!ÛVR:z¶¯ˆè" è”"¯áªrc4")w BŠIÞ±†³„6I5Ãû_Æ ’€Ä˜%ÔEaPUv4PÚ°^sŒõåþ¤/¥¥¡FBÀA Dƒ(/¾‡³6Zxy–—ŒH#©É ÒF:ˆ,ðz5­Õ­®Øî„óƒp¼0Œ,$ظ8Pµív<)ZbEuïä+–_dË¿ƒ\³±ƒ×‹ÇþÅ ~¡ÕyÛ©A€8 ñ ûÉW¹³³3èÜÝÝÅt:ÅíÛ·Ó[/ÚÁ~\ݵÎÂzgÖ¢˜…¾ïâÅô™—^þÝI÷dºUú(!΂Æ^%öâ,„ر^„3Usë¨J Ñí¿Þ°W_²WÏí›ú"•âQùQ?¡Oþf!ÓdŸ8Hr+¹H4ƒ¸Ç©wéÐHìIé’ í:ëIécì: Æ´ç\z]Kb)€R°£LB˜)€8I`*âÓáW Hj¤¦¥L,“Ì”MüùÀ£DÄܼ.™‘"ÅLý9Cü6"¢ ˆÆf:1aÉŸÕ'©±‚2óLô5Q™Œ„ÅqŸ ÕyêïÊ=áþ(ñÀv@3 mC› @ýËŒßÙÂd ¤`"`EÈ^ô3Gm%D.izvƒY"¹"CD‘X$UÍözHŒéá%Ç$0W:˜J´•PXª,¦6h¡8`qð@$ÆŒwÄíc‰õrÙL$×⤈Ìd=Zz¿Yþ¾ŠH+bñcs.at†vîdcQNËÄ™°Œ7Ù³áº0˜zfÖ€ªò(Ÿh¼^4ÍÕñНÍ{}d$“µ@¢‘NÛÛ/5Ù·»Xã“X¯Uû\Äì ö–ÕØÞ"[4Ú21Šq(Ã$èà@l~þ+ûxÓ¥™k×® žÓµk×0›Íp÷îÝ5:X¯3¯'Ožàúõëøú׿>ê¯N&÷ÿ‰ËW~÷._z“ÉQ„ÆYЃΎ´‹3¡™J4 }Ô`b&b¦j’¦ Éù@ó=~§j÷Î{õ¢,ào¸bfL€G&Ík(&ŽŽÓ^Æh±øo’yXH…ˆôžUåQ¤HÏÁ&ã;ŽÒþR'Î0"!$á8cu㽑‹fÙĞʈ“Å'ýîàˆ‰e÷p©Ú¥sÐЩŠ5R!›Ÿ³×Kœ£ˆB’@Zöcå©E0±ZŽ\J¥_„ȯQŸY“dAˆüŽ€o’o;Ð]U–Óv¤’b6a ¥ûÖU„ 31‚*M –=D mX¶ T²ú!FBBbHs ‰˜^]AeY: ¦¯55ª‚Î$ %¸=a0K —ÃÇäq/ìY,i‰­ÒšXß "¥QØÊ¶‰e±ôwå«+³^y2  §[Ð%R~ÎqpX/ä„zïpd!¬ü¥7DseàK]ÑØëÕ†´¹ZR>ÇâìǬ×ÉÖkðµJZ0fgõ. 3Oš˜;eŠz@~ü‚šÒéÑýZ‘ÒŸ‹ÂŽÄt¿Ú2 žQå(€*ü_@ÿ}°½!ª°ä@Qu×PÎbÐæ i0SAÈhBHš´ô܇Gs÷¤u©®MH“.w¦éA!‹q=9òÒ‰¹I]“O]Ì3ʘz¬‘ÿ²´çæxSƒR K%¤äòh×ß pKÈÄ©¾’UÀd¹²RQØøÃÒ A(€Cr´´LV·D*oÌ`¨õn_ ƒ4?¨K­ir®%z¢®Ü+äÉL|a½‰°dié|1ãòbîo øó ⣠G4f´Èœç™X/ ÿ€“Òì—Ö-Α/‡ÆvLìã¬ÚWwø±ñΆÁ"‰ÿpÿ ‘ƒœ«ü:¾ôÒKxôèÑ`Tþ½²ÖQ g_f†7ß|¯½öÚà³³)Úß…7~øòÕ¯½ocúh¦ƒÆžbÖiŒ~¦ˆ=Ô¢ FU;ŠŒÄ¢"FÕ¨É`éøšN)½ú­÷Ýç}‘Ÿk õ¬ :óDmΟÄÄ÷}–€GFÞEˆDqÒbT¨¤©ª&?2‘ÁUãÓÑtÒŽäC¶‘ð¸ øí®“¯>#>$²SZ4±WÎê ƒ±O²$âcvAðƒH_Ä+eN@÷ó%骺⠦x­ ¢d/¾…è“t ÷>ù;å`È£¦"Ek1ŽÀ ½÷ÂåSa•K΢ê2aš÷ó¤ƒÄl•\,÷zeö‘ ë%eÐ!÷fô$ƒß ©›ð“‹Rƒæ)ÕLåal4&ˆ¨DAUb”üüÒë\Ùá˜õÊt”ÅlÄz! x*m´D¹]–èÎIE±^˜ÃzIÄNðz¾²^\¾¨4®"Üœ<îeËÍ2ÈG2´¬btO_†_›áoø„ï•+W™u™ÍºqãÆ ÁXÍLc¦jÍ\=ÝÊ1 o¼ñÆ`ÚôZèžüàÅ‹×?{ñò“.™jHì‹Á—¡4}õ[±·TzÖ§ñ-Š܃{RÎëœë É`‰ªÇ`Q:?ˆ)IDê·i:iOjçH¹ØÇ(žgNKŒÁ),˜ˆÄ^ÔÚ+G•4fª0Š`4cˆ1ƒéÊD6ýÍèlª×Œâ}ŠBÌÓˆ9ó*1š…#Á·ÕÄÞ)D’÷*Ý;ðrÈ’^¿>$X#ž+½’”¹ñA¤æé¸r;q¨Š_é:¼BÞù~rs—œÂRæºBèÞ(æM-…5ÎúäßݾäYOLž¬xC¡„ÄFŒBA*á¹á<Z% \„X’ƒ³ƒ^@Š¥”ø $JktW Q£I¶ú©2;–€˜¹?Ë\™ÌŒ˜d¯WKÅ,_ÀVò€9Ðõ°nÉ‚,›ØµÐ7ÐËS–ÓgB¼/±È†ùu¶"uæT BkØhe½ÚÉFzñ¶Ë“­+^Ƭ×ðh8(e_2OæMc&ÒXÀZîí˜× X¯¦œhÃd.©Õ2T2ª¤–ñý³N¶}‚åöζ› ÛX)¡¢V¼XóšŸíÿûS%Ît:-%Îù+}íÚ5ܽ{÷=˰6»Ÿ¼ˆ™jŒ"¡CˆT˜‰Ú,ù¡i•™¢©"p}Œb©ò§}_ðÉ$ž öê…X#‘X*šH˜T`”«|ÍbL$geTÄ&"t¹‘T !Ù¿û^3y¢ mKpùJÆd"7Kîf‚XrþYñ±ˆHì:xÏ!ûÌÆT b!²W™Ͳˆ ¤ ðbŒj$SЦ:ÉÀ Š2 ¡˜jËy žâ-Ú܉mË—µgæÃ“rï ì}C„o?E>ø½äE*þ…2ûÜ]“¤JÆœë”,ZÈf.&¹Q²ò¨¢’·é Q&ë|„¥±K(b)ÞIH"ì²´f¸,ƒ‘”¼/ž³†(Ýs%,¤bb¯Ö©†õÊu79Çž ~Û\ã“ÁÅëe‰õJ-9_¡€¼4­XB8%{Á8ª“‰%¤NÇòœ³‰¿9î#ƒ¥r;&@ZŒû¨Žd…p ±²\,lWÍ~eS#T´FiÁÕœ’28€6ŒC¹±4Ö‹Maмˆã^/g½0±^œËzq™lè 'Y;1×qŸsÃæ=¶á(몂³aÁó_ÝßÇ?ˆ©륗^`ÚË—/ƒäÚØ¾^Kç­[·pýúuÜ»w¯‚û½[[7ÿé‹—¯tsóA/{ÕHEìESn• š«CÐ4Î3ŠEQë…F{ œ%†ÊL•Ñ3®¤ëHvfµ^£„x4›á‡|zÎyÕ`}×'|­)$!g­¯(™ß™ºëˆÎA•ˆÓ”IelhוwÒH 1FKÉì‰í"ÅÜ .@œ90šx¥‹w&~øÐ€¯’q »Ÿã© º*/$s¼^6Âqtã’ë5ØÕAI÷^µßvÀ–M¾8[<îªÌSr9˜&¬râm3üe¸pá¶··Ë !àÊ•+ÇØˆ,T²}í½Z¶ú¾Ç׿þu\¿~}³°«zôƒ;nüÈÅKo\ê&Q%ö‰Šéç`Z¯!šH¤ÂfªÉK%£˜ÀUÑTI€š€z31€œLÈt,FôH¿ÈTu!ªŒ}J­ü4À_ä«ó:Ý×ëûý*7*G’jîŸ ÎD3¥ƒ½…ÄZAUÅDÐ5虹ïiÒu$‰Þ“³a.õ¡F)øY¬XŸÂKËîÛ¼[0¦L.ÉÀ ÙèçÕ5B0¥.©Ð¬ÌœÙ³^ªÅoÕÆEBHzP'™œ)þḞã±õ Q µ&Šç‘ü4èä÷tðolt‡'ÿpŒ»JNÒ ¡dSÏPr‘œnÑ.0$`œ™%7zCVŠhèÞ7 ™A… ¡iNBQ¯Ûñ×ÕÀÂüX™â+XÁY¯ä¹ª¬ޱ^ê“Ü' #&cÖËAT­»),S™õü-IÝŠ‚– Š&Ð$wæHˆ!ëeeÂ1߯æŒ 0j*Úì°Fn”ʶ&ï%{ØrøàjÑù˜ë‘£8bö”1?F•Y‹§k´Û¸ ÁSa½(mxifúÚ)FÖT‰†õj놆Ÿs6zì Ç9Žô“‘ÖB6ÊäjΓ*¥ååã xò32ÖNÁPäBÈ¢¾ÁŽ^ÛPQ UäàñãÇïYff½Ž¯³pãÆ ô}_.ÿ`7yôÙÝ oüà… 7UºŠØ‰=aQĨ#hÉ?¬6<…=ÆTO—ÀUUK|º¤ÚºÌZ¥X*€™YJATMÇB;K·êà|ç9z_L–ÛSÈbñ]·¹$Ö…˜±0<"Qܧ’'çÜðNu âò¡ÀÑQ’£”ŽÂ1jLÒ¡ŸmSº,pcŒØ*ë”'ô Û•#'ÕADaѼÛõþµK£xÇ€Wï0m.ªž4.@å X2ü2Eu3uB,?¯ϺÜAmÁ—&[»ù™ˆøªˆü†Èý¶ß½â ‰î'ctù¤S T<µ:¥Ó§¡Q¥d’€>šOD& cebÒËž‹Ï ©J^–HIÛ7à e|N,VX/–4‹ÌLåÌ.x8{²æq•ù ×+¡ø¢2cŠ…ðFëš«ˆuÈ´ú‡fMr|V–z•š ÂÚDT¼[tÌëލž°ôR•˜‡´ZdÃü9+ž3V¹M)Ù›–Pb-ªÀ•‰Fß¶ÈÑ#Ö #Ö+”Ì©znàßÃVrK•Uò“åŽ"l*'çÊ•™"8œÈ¬”ÖPjÂsp—VÏÈ8™à ü£þæá¡d0ÕÛ»®Ãîî.®_¿¾Fë¸{÷.^{íµc1 ßµ¹y÷GwwßøÔöö=BcÄ>¨ˆGÉ{x†•t‘ ‹ ÓÏÀ«©ÐI_¤´ÊŒÉyÑ0^-ðŠf›ƒRL&Ï"5)¡a»#b»MЦ˜Ë·»ôÀ,ÕiymBGû”÷Å *S§üµoþsf^6ü¹1ˆÀB(í-÷Œ–²Ã` ”Áß‹ Ce²êÄ€`#D”0JöÜe ƒTÍ#™J¬WfßXe3ËéöLÀ‰Ò°^¸ݬO™94VɤñzeP䬗T0›äÝüW‘eb1³SÒ0^ŽH$ÍæTÿX B¤)·Î¬e+9Jö“˜¡1¶gfK¥tU7,©ù•’,PV¯W6êK¾ÏúZ¡0ˆC;á˜Ï’²¹þ8ðÂxÉ<É\ÖKj©@y\¼^¨ßåc©ðm¿¸ðZ°‡ÝV1Už¢Í·5VyÓÚ<÷AËsýÅåBíÇ#~æñC™gl’ëÎ;†bÍP½÷VŽY¸~ý:>|X.ßéÿÀÖö­?xq÷W66ž´Àʘä@ j‘ XÅÔhQÕ `¤D%;„Á»ÎǰÒy~¯ÊÈ4šAUIí:ëÓd~Žj†G±1qàEŸ»Éèï<'Òà °677)$Í“e3{™ªZ6 5[’nD}'ËdO—ÂüäóN-&bd3:i³šŸã l¢*³ælYaP—¸¬=G1ÄtªYÙ. ͳ1F3[€Ë’càUX0g¼\fLÀKÆê‘=¹ ­šæ™v³7¯/Þ0UÄe`)éìC$±€¹—f&¦À?RÅ/„ðð3}ÿÈ—6T‘ îÓeE€„ËS†Î$J=`"õ ºŽ‹rˆƒó5’ùfkÄM3aÎ’âÊò™V>CM1±^)ºj>ëEŠ¿fÅ—˜›†õ’A ºT• Ö«ÄN0§òg¦#®Ü“?jÆÄRÀ¥ Ó„Öè.Í‚°ÄVÔÇ•B090“ZKô¦ µd¼ÉK7³ÜóHd#=³WKа¦Þn– ­< óXŒ¤¿Ya]3 Y&9ªjÀ×0×Ë?H*„óz±©ªì–3Ý7  ÇkqؤÙÏs…±š<Ë4­{é’èÔ•5Æv’øóOËî«zå•WŒÚÖÖB¸ÿþ{X¼×Á×¢˜…—B8øìÎ…ÿÔîî[]82ˆõ"±S^qŠQÈÀª—`Ô$šª4UÐ}ÂAf 4‘c’ûLÒ‰5,¤Ãœ¥æ“èÌãßh–ˆ¤"U…„9ëø1€Ï ½WkÖ»µ¢çg4Ò À™—-{†ƒäËU•澩ÞÞ%ˆh†‹3åq¬Å$‘¢Ç’gK²g%Šèd(9àåÏ¥œ)3Å9Hf¼òοköÎDKräxeW£™¢e¦²¹ÞÓîÁ¤¶—pÀj%•‰Ý§ó¥5¶ût%Bax¬ùbdðü­®ã¯‘oýK}¿õ‘Ý®9H´·Ié L’aCQÿ›óãgà5…)Ú´2R±§K¡:‡õrOâê¬W7‹X/iX¯ŒÔP$A—!õj¼`欎T<™Ìïù3a&pùW 8k²T×i úÙß•Ú Çüg6-G]4ÀL²éŒ*ør¦ÍԦǮ¢–Z;cä ¬ SÍÞ,—MËPYMý…}k;$ëdž¹ ^Y¯QPUêÆŽp!cº†õ’ºÿÝga½2eƒ¨ ä&Ì’mO½˜½ù;œD§ÿŸæÉíäîWúÿåÁ€4%¸¹¹ÙÚ$píÚ5ܼysMß¼×¢˜…oNïÿÈÎ…ß¿³s[ Ñ6‰gI¾‹Ääµ›I ƒÄX¯JB-Š3XB£ /fN¡ÛìöÉC¦h!j’ ©‚Ž$­Oûœäë€ÉIJgÙJXŽT¡fô÷sµ^H€¥ÎTisöâæs <")%¶†N2´vU¡ˆfr}Ò˜q£BbºSáĈK.èS.VI…tšdb²œ·Ì–„´­aÍRΡÇKä7Îë ùÜz¢xUÏŽ˜K‘‡`ª‘zZ¹ÐÏLĆ€1*ÕÌæµ¾,Éà·°}“IEoúó]wðÇøèÅxmJvÙÇ”éaÉlTt ª­#ý¡y°^Ù»ŸpŒ™õÊ4cã)ò‰M3K¯¯ŽX¯¾¤–’ŸXž@df½r#@ ®¤a½P²¾ H*ÓˆY~e|,þ­H¥FJ sÈz½Ð3I…Vã.†LÄ’LšŸW®òßÓsL¬šÿ‡SŒy ‰¢¨_~-EÛÉÛÉïMx^J9(Óæ±¾Â"õ–,)%§0 Û±ü¤Oªÿ>OÊÂD¼ ¢²ä>(’Ãoû…'OôwÜñòË/—h•ä6è°¹¹‰7ß|ó=šÞë1 KbfŸÞÞ~ëGwvß¼8é 3V1…Û8°B4Ñ$ý©ZLsä h%Èo1ˆ1±X `}¦¬bbªL<™}–Þ›y6d/-%´ç*sb˜L¼hWl–úz鉇UÒï3´ƒkkëÝ]fm*¢%QØq¶ DdÛÿÑ/Ix½™btYî¸QŒ×É€E3/€F*¢. /’škxA›c…|EUÍò^p»Ž™¥:¬Ò'Я ´")a2]ÀRÛ#ç]†#@U&#[ÄU»‘“e$ƒ®ˆêµ À™•è žMÝŠ0’ò¶ªüUÕþWc|ó›]Ú"·º*f0FËÀÕdß!g!Ç ‘ZÙ"ÖË=U§d½xëå÷%ÒL8檔‰´ÄìĘÅ´}–33%¤þKÉ5IR%Áľ– ÇbfÈ ¶dÖËAA†þÊSŒh:+nvàØ”Y³ÆK Ôÿä¾Êr"mQwa»ÜH•Y/‘"#¶Q B«q%‰ì‘‰?±b ´ž.Oí¨¯wšŽôJðQ@jê¨ÌYWÙ_åR,¬·’£Œ$Çò: *÷¬1Š€Òg/æÉLæ¬>/½ôôöz®|y6“ÿlÿ‰©þ¦Í¼Ò$áÞÞÞ{ž¥byÝ^LæjqÌB÷ø‡wvÞüÌÎ…›¢MR`V)I=j’ý2ceª6*i0YVÍ‚ÐUMTÀ4ÉxùrOÔf²çt]ß'`e¢J;¬DzXÌ *å_Y‘)Åy?¯ªÑ*ˆäyIoO0X#ÀU.³*#@N¼JØxÝ6¤J› ”À\SR9ÉŽ=¿íx%Æ«5Fg¶Mû¨¤"i†)f)±~È,9ð*l‹_Ÿc”ÆÓŒÖÔž³¾DUâœ<&¯U>úÛ©Çüº;0lCRͧ&Qáóûó›]§?<üƒ}ÿàÓf¯„¸Ë>زfõuœÇz) ²ˆõJàKǬ–{½òû‘ÁÆBÖKF^¯dÕ°^¨Ós&R˜¨ü¹‘‘Ѐ¼`b”ü|[`¡d¥ïDin.¬Wš’¤"qÑ\6ÞÛi£» ʱS uJU-eÔ9æ,±^ÙlŸ½d¾m¼È•Cšç²ÏŠ5ÏM¤a¾cVX<¨[¥Â,³æ@UõÌ4m¶+ñ–':¥Tÿ¨PÚBíýÑN¦okêŽÚ ÇxžfðÍ¥ÄXBd¥-ñÎO0M þô£‡!:S5μÚÞÞÆþþþ =5ø^_wïÞÅõë×±··7ˆYøÔææ½ÝÙyó{6¶ïy hV}Χ«hªœIö Ä(0Ó$ÕEUÒ³¯ò4Ÿ‰Ø,]Vú¢§³S•ž°U¤Ì¬ä¥ê}o]—w•1—8g¿UTÍÇa‹­Å'mwîò ƒ5<±Ê_Îr C3+ðšàÍV^œ5Ó€¯â±²ðê[6©*SM¦]6þ¬¾b,¥ÕÚæpy¦«ß£&, 1¯ nüïHO.Ææ±C•ÑsDCÕtšûQkÈ÷o5×Ç‘vë‘mvõÉøsJÞOÛúÂ2“ê‹¶æí%U!ß+€uˆ¢¼¼lx!fÂõïêP¢îόˤ£¨^±Ò@6Ê»ºÄ\‘cV¥ €H”F§Ê”n•^î›ûkëqD(Q «W}ù¿-êàv"ʆ]Ž ëÕ†M£:âßÒó4Lý‚Ýxȼ_âÍÐ`ÿýóƒ/^,îÙ Ó·’6xÌ<"<1Õ ‡y½ú#ÇuU/T #EfØFª—ùx—ƒ”›}¨| ¨Zq\AÊÐÈþ\Šêe kå杖+3òª$­`¹ýyl—VU> Ô©C1úC¹Qª†ŒÜ¸ëê~P’à-|R1Þ´ ù¥°ºêp¤Ê–ã´‹¼èŠyºPU#r ,>"¬â*L}‘G‡ïÿ,Í ò2DJ/O cŽ…!Ÿ˜ý›‘™ä”ýH¥°ÿ˜ÿ§ý}€çž{ÛÛÛ½þ™gžÁ;w®hä)àµ×^믾ڋYx!¥ƒ/ÝÙ}ó+övonq3‚0‹õÁÊMêÌjæ>«6±µ0…Å+ÒÖO…¦)¹§ŠH4ƒ V‘eä †”tSc†˜IªŸƒ„R2c†FB{öY‰™r,ˆÒ0²[÷EÜ(‡lGÐè`]Ú× ˆjè¢M>œ#cÆU£Æ²™àÕý¬¯zQ§W8ÄEn¼¨²*Sû»Øï>šAQ­Py_ ü‚Ý¥²w`Û¨.´Ýz-ôMð݉©ÛÁÈæûjåTkUNWÛí`Ž«Æn'Gx@þOðL§ø Õ7¿IdûsÍžëd]ñT´ŠºúÇêíòˆBÉQStÕ«~ÏŸ¨z|åý»RõrPW½¢ciÕ« õÉ^Q½Ð¿Ê*¾8f²êEdnNƒ¢ž'÷áðÕ©k–“)â>9µŒAÝèŽuQíQUó€<"Âk¬3æ»®Sw$–Ì2Фå”yäGëÆ•]¸hQÚrú»YµZ=HÝB€ R³ØS¥ø»ovw ç®a"H| ƒ–,ºòEGU«EåÀpK•ÿÒƒ˜ÍfK«···±¿¿ÿžéªz™ûª:Õ –%ÓηTL’!«‚9ÔÁ¥ÜeLÑÐ_Uï‹lf—RLª¸z-•êÕÛouH+ú š1@¿Ù4ô—‰Þþwçóæ V‰­Æxu»éÖ2j_™-Ÿ"ר÷Þ{n—ÔA”•ê¥} Ê«e–T/Q½t…ê•÷Í“T¯Îdm¤U…q_õ²ªW¨eîÁÊï_Q½R@JÍælå0%#v;EQ½ª´uWªbU_„¢Ö«ð( ٥ĮG1àªÀ—)ÕQÝc¸çɺTõ|:±{¶BÙ*‰Æ‘À˜ ÚÀýV&JÌÑ…J¹„›ˆ~êÁýí_^ÌÀ«o¦ÓiïXÝÙÙ¹‚«K|;,fámoßúøÞµ7¯§t Äz@]~•’[ÀÓÖÁjý€nRII¬0Sa‹HV£&Ì5ÀÈ#šÆrV!ˆtÚE§4©zö¢QäY‘µÞ3¨i2±…ÿ«‰È(òsGox†Ñš™up ¶‘óøÕˆð‚Öq€è0ðÚà ÉZÛ–i®•à³íáýt0V+à*M½J²ô!VY]”$O‹/^®ºûPEŠ¡¼~NR%ÖgPÊþ Ð •¬hrˆ¨ÎË 8¯fðz à¿Lä—˜o|k;öE³Ý±±Ÿ"Ä(xåû”ç8Émpƒ÷°óz1Fá‹ $â+RJh»†12ˆHïîÄl2éþ5R¶ºém×6ž³CU/OBW½ÐõSP¬4ÌãÐz…#*Õ‹ŒHMÁ««ÑZ6€ç¨:ŒôT¯bL÷ѵó ?`#­Þ¢bÇ4Ô)êb'ÏS)—VçŒT”+t5=È…Ö+b-Â[Ö•\G@A]7¥‡.Ô­L5°Ås튴 ¤ðk``&ÿ^áqFªÆ ÓH¡€Â˜ü_óýÙùðá6ìîîâÙgŸíQ³Ù¬wQ¾ºõ•ª‹œ‘µ*fáS›æÑWììÞü’·æV˜eªU¬ T0Ë$ÆÐ VÚ$1@€ZJmëÒ¯ ›Z“¤ÑŸz>•YšÁʯ˜î±Š/€ZÆx)Ymý£â×XK“‰¹:•E–Äükf±CúÐßx5P•‹èEßs€5xÃNˆìü]+·3ˆŒˆë`o\h5à¬/¿ÐæåÔS½˜©­•§(·.ÿÝ4¥^¨6¨‹Ru4Ïi¥>5ÔñFõæ¨lÕè-ù·šN-óQ—Ø`Ugä®plßþ•ý•4¹÷•û[è SîÔšjhܯ‚®8n²ZäyP%0³€×ØMªñ)(qÕàµ7gôàSÖÖŒsΘå\Ò;ǃ穤G TÏ— ’Óü‘W® ’2ÐDŸãJÕ‹y”]¥²êUR–U/Ë‹+ÿPî$(•çW™ÅS}Jt8<>†L`7F¤‚¯öc2®ê~3ý#u;yub™¤Æ¡Â)X¨PLy• ƒY.ì¦îôá²5áCÔ²’TA ™F.K4„¿ëJðeዎî'ã"¡¤o©¤ï½{÷™œÖþâ‹/öŽ·”D"rEUkžk/˜peÌÂtz÷ã»{o~x{ûNÄ*ÈX#”L¬Ô8Š˜A* këær±¦Qõv*5†º‚•£ˆDseMÓä‚0‡/ °²ì¹ÊÑ@¥fžiŬ©i¬Ðzª{ž™˜ÜØnæÁ£Ýø†—µêKïòdq¬_)Xå6µS4¼o ^+Tµµ·Ã‘R«3¨”ŒJaZ¯îùôTœE0:Hx¯SãÃçÕý÷ ^‚«\0ñ”òò˜ž—Øæ1coÔævŽñfµ“†qÖVÿ-þüÊo|‡¶{Ÿ¦z+_ÛR½Î`œ9ªz˜=U½R5ÁMYõèƒW5š,|… l»ã¥zÝ Œ¶naV-+'³Ë»Œd#÷ªz7¡ï˜b\FŒ¡ze ÊU.@ÉÂòê&"˜»Ú{ª—åü/ò–VÖΩ–ölDÊCÕËậ؀Îõ‡yí_V½½‚ÈeΜƒŽ¢µ¹ŒÍÇ€¹ëQ#>A ÄìIønxg˜u+-”®ä”cI%BcyüH Õl®/5A\ä2‡+î’ñ‰Øüg~kVÉØ¡Ï¾¬0ú³wÞ}þmUξ«¡¢ÎÌWU8 ž¹&áÍ7ßÄË/¿¼³ð…[Ûobo÷æ'O¦ZW¤+­x²º³¶ C„X[˜('2U3Ѧñyu+)fõ¨´É•3­™ZJE±Šâe«XE>Y‹”½ªmR3™h„‰:„©š:¤{þU^ƒcÕõÊÆ€jð¾­T³®ë*X§DÉßÕÛNNMÊw•êÕ{LéƒWÙw­Þ{àµp¨*JÒ"ªn²ºTÃq½7ꬥ¬|åF„³æ:¢ák/•¿YEóþʰ‘ï÷†ÿ'Ü<üÖ‡ÿìùF­)E½Q:B®:X»h;òIªWùoÎåÈ«Ou-Jö§‘Ø’î:Xí ÀýumÄäŽYfis-LÙÿcóaµÞD³‚=aÅ¢HW½òê?«Måݱ$ÄÒ½ž’rNìÆ´¼ÂÑ@Äæû©JDÏ1…ÅïDÔur¨hñ}›È¸åE}0Wˆ¬T}…Õ’vN¯œÇE¡Œu³%5Þºèøb–×LL¾‹£ÒÓâ_óD’ã«<“*“[åXáe"B`(øÇîß{þŸ.æ[ðüóÏ÷Šœ³zuW«áê¢ÀÖ|>Ç«¯¾º³ÀéàËv¶o}åÞÞ­§…´%nÛP¬„YÖf°2†.ŒD jœDȼÒ&ÀŠ@bÉK˜Í•$µn¥ŸX¨Nš’Z×íjÄnáUf[d%ËMï>*Ì‘ >Ö“4™X àÀ< Dͬ˜51£ÍpVÅi€mTµPrYƒsß³A£Ñè6ÎÂßuÌíˆì©^ƒ yuˆa8‚[^ÃÌ+ïÓëù® Õê¾ò*G­F€e¢×à ¶³äA«ý]UìE½j/›éUÍè áŸÝüì|øY7·¤Br­g¨q?–.Á÷€Š ŠQÕ«­Æ¢ƒ“Ç’A¾¯zŒ‘ ~¨ŠN­ ºaæÅßÚ)Q\ÁW¶DsÇ#ù{CÔSC©ê1´³XTäp“ h$±ïÔû‹jæ¥03féje `e/Z. Ìù^ÌEmj¸K¸÷´w?]3uªWƬÒß#—+RÑ"ÑÝÂcJÇPR#_E˜ãÈU¯~8jx¼Â·ÃÅ!D‚›)ˆe 3%fSúŸ÷=û7=|öööpýúõ¥sÇÕXp3ð:kà:$fáÁÇvvßüÂíw„X -±‰gX¹b%i™TŒ”˜ÛR¼ SM¨|‰¤`ЬZE¸§°jÍ+ÿà)€9 ’ƒ<¾ŒÈÕª@#RJÉÄÕ¯²z0VZŠ~YéÀ*ÚË)±Úÿ¶êZ=˜<õþí*ëb։ʓ€hõçüô·³©¿«Þ74ðQ­¯øæ³´éüSfÏÏ’N2<4 U«”M½Ñ_êÁ‘–©Mqýc®_AzL+U¯üïée­§R”“º±«Œ@s®WŒR;€j•R„¯¶ƒ4A Õ`XJÊ­^ƒIê%Ê€1)8³^8eU‡pEETÒ®"(QçéŠX|µ¼j¡M¬S¶üqÃT„”KÕ+BO³‘9¢"¾hk•¿UBQ‰»ü¬JÅJ1õU‘ìÏ%F}©òÙW•Û€@ä‡'­Ôb“+„«]ìüÅ{w?ÙL§S|Ò'}Ò¥…½—G‰9fá•W^é¥é7 ûÈÖìOììÞüàÖì~ ÒÖcÄ@"L14"X$±H¤®›2«©pÒèþ3°+V t ‘iexšF,O5ü‹§úhϨ2¯‘{¬•6a^—H]—ͱ F ɦùø,¶|gëÕ`AÂaf÷+ë¢ÜDD›¦¡ã}V.žáýˆcÆ#ûÈVWü~/Ê¡,<[¼8¥^uP6Ê׿ö€/­ã%ª´üxY'=÷¡¨]ýc$üºÊ[ÿ¥ÙG]×.h²ŒË2_u)ò¾EÖ™¢è™R‰pè¿â¶Ô¼ôÐ,Ñ’òÕŽT5Uàe#ÿÐÚ!àÕ{ÿløPFt&)×ëø*ϳòzÕÁÎeìŒT¨Çãü‘ËA“ß[1cv¢Ê#Aä´…RSS„óø-¥2z,•=š]ZZF‹ #(1,BŠìè&|m•ÊUQV²©˜"«KÝ_ÚÈJD…>ÂJ0¥Ruî°§ fçáu>!¼YÔS‚ˆ|ð 2™îªM¾þÛŸù8>ׯ_‡ª.©ÝW€µÞ9u¨^¹Åðä÷]Û¶xýõ×ñÊ+¯àÑ£GåçÏ0·_²µýÖÇwwo=?iö[."Ä" &1*C”¨U°jÃÚFêzΰ"UnĪ U²zˆÜØúÇÉ pÅŠÈį'jD*PÀŠRÒ KT9ÝšéT°6"« ͇lhG©µQê[EŽTC5ëJÁº` –ˆŒ*VCðZ%ÑAå´€è¤ý]›l‡}µÉØ,¶§0W|Жj†8¯ øÊ~¬H}ïÅKä‘\jšNÝȵ.ñxsÏö*#ÅÛDøqàñ6zô]Œ÷ífJá#k6,…”¡2õCkK¹ÓˆêÕÁ×ð5ò`< O_« ¡à%F‡ª^ñ%õ)VNý„œÖ/á?s(òB £!|¹€Äe¾™#H¡–C;ËJ‹¨¼B±Œd}Uâ½/e?°ä§ñ„Ôó*<+…ÑEaó9¢^ã ó|¤Zå’bó€ÔH ²é¨BâH°WÒ”འˆÊúN o–ûª”ÀF=N)¿&&©C•ß"n¿åÛº«ZÎÉ·nÝ*Ÿ¿ÉdÒûßt:Åd2AJ銪Ö8žÆŠÂÇã•W^Á7ú1 ©yüÑÝ[_¶½óVJ®R-Üc%eVs_U+y% w1 –"ÊH…W`Š”|DH fÍ! âж‘´Þz”³˜Ç½@™-WÕP¬ŒBåì±R#²4™X€•¶•Z¿‡Ü/¨1V ¯òXp] Úd‹+À4ñã$<•X‹=%.~ÊGy<™—ZY é÷Ñ€I²ÈA¦'_ða‰¢‡sÏg(†î 30{ÓAqa±)Yq5eæ±™²x" ‰Þ™Ïw_JÍÝbùWóù³fMVtU888=§dØÂרçój x|¸z÷ÝwñòË/÷bÀ¿>ÞýÄÎÎÍmmß5&5Pë‘ $-L“(A”"bI,-E;“ -‘±.@S5idæqx*»C‘¶þmÇÓØ;ƒyö`Á*_…GË\¥R%BÿÖL&ºÐR;Z USoX7s¨C¹@+”§'Õ&jÖe=–ßsA£«T£1ðjšfíí]‚@Ósó‘e˜Êï‹ À«_ÕóY^ùÂ[À+ $'Ö§\ˆº\§ê9=J‰iþ d7¾Ïä}ïgš¡,DóFQ}ÂÌS‡vr#qWÄ]÷ ZåŽO|•ÐʼÊëâ%eªu éa\%kû±FƒÌ¯‘Q!&õÉ,¡7®à«¨Ú{Õ† $—ðj¯UP¬N”~SQ½òÇ@­¡Â%sÊ÷G¢BÕQ h•GIK·¡†±Þ£Zˆá÷8”re»ªBmΑ¦1FÌEíÉ.ù”\Brè3u 1Œ[01ˆÄ”HÉ«~Xý’…Ïnš{ÿÕõëîæ¿ÅÜ,³[‹ÅÖëíbçFÛîÞ\´;7Ûvû-•­wDf²UûûûØßß_úÀ¦”zÀUØe n<*lYÕmw”‡‡Å,|ñÖÖ;ŸØÙ¹õ)“éCEªú¬LŒI¤-“qÛú}U "V b,˜Q“džMæžQed&­™eÅJ&“ N¨ÁJ½žKÔ œ’j¤°GÌ‚iTã¤ÉÄÚ0µg°Š‘_.k5ÆjñrîѼhjT§1$~¸^kðZw̸ùçýòù»6ÜÎè]ÛN _O¯ ƒ•T–Õ®S ¼ÌEý&ßÉéö·A&_–èyí—PLj+‹QMì–ÖêòâPhbîS8(uiÙà]d)òçÃHh5|U¯±†/€ K©ò½S… / _\Ï>Çàk•‚–ÐëØäþ²-/_EQΘžëe탕¯DòqwYþå ‘!÷\…—-vu±—k‚"û™¬ ã*ïk µŒ£ú‡Í³ÂjÃ~"ÂÂ"íÔŒ#IÞ¯fn¨Aë£B˜àÆ´UXŠl,“§Œ©¥k¬é#hÛß0>x_Ó,^HéÁ‡·(‘Ákw ¬¦éõv±ýz+ÛoJ»õºÈö›m»uKuö®êD«U¹"2 _MÓ,)^ù—¾ÆÀièÉÚT¹Ê1 ¯½öZOA|?óü£ÛÛ·>º³ûöNâ9À" „2Eh[JªdªL$i«pÐð]iîTJ*5˜¡Ií"«CfÒÆÊ? °Ò”Ô˜k3;`uMY1£AÉ^«€±4ªùÀ^ج0C5DIsÊA£Ý—®è³#Õ&ãA\â§°Ú¶µ¢å ÌÙù».Œáý¸ãÌ£ŽMWW5òë× ©Ú¢¿qðòû²:¨à§æ¿ØÚ?—ø}ï'ÚB5º*`P=[õ5Dh+õÅ Ú]Rzgžw|È Bi_šÓÜû#GóËq(9| Á¬‚¿üú«ÉY¡TTœÁ>5=´p[—¼c©òpIUÍŠq#([w,U+Ûzìç½:_y—äz °õ ®¶ÝÌ™ÜûD1úõçÇÝ\ÙCFs^DN£g»ZÙpì#§×ðm‘@‘‹žrU.ÌñìÝ>]¬i6¹»‹EI™ÍØW AX‰}H5ýѽ›œvÕրĠĤœ@íšéâ¥Æ¯TôµeP^Òv±õj«Ûo¨Ì^—vvSuvSuú®ê¤VìÛ¶­ÙYå÷jšæÂÃ×aJÕ*Ekìvÿþ}¼òÊ+xã7zç­6“ßÙ¹õ…ÛÛï¡U°¶ 5°AŒIŒ’´V†¤Â5’–XáeÊ€z´‚ƒ`jM#b¦­ àÚ: ©tã>gT©˜GýLø¬Œ¸ˆÈ’ÂW°2"ãÉÄTÕBóÚš0°[tZ^]è@µ–ý¤Æƒ8dÕá`]Pë8@´ $‚¿ëRÞÏ+'¬d{ ·ãŠ?¼|úcFð뾸ým&Ó6x¿CQ—&a(fu5©^¡ç0`¾JÍ–WÝ9•¾º„a_Ü©e½1%J°™¤J­éÌ–Œö>G[_9wµSÙ©­£*f7j±ŽæzAû™\(©õÀðçµß¬ÊõÊãÁÒJ+ý•£Q€æ£á’!Q'GçU…݊м qÛ,Üéy5$`eÔ™(«†)‚P-ÇNPŒ~9’M‘òªØDLæû³‘‚È¡‹™Lؽ\FLÌ’ˆY™˜þ aº'íÝßN“]RÕDhY) ”™ˆ[±Ybó€Rö„ ~i2Yüþ¼ÑÚ}b¤ÆÍÒ ‘Ù«"³*[oŠL_øºoV>.‹Åb4Ä”ˆÐ4ÍèÈq];ÅyŽŸU9fáå—_Ä,ÀþètëÝOìíÜúœÉô¾„‡ÊÈAÅ Hì°E^¼ì@E*±´)Vòùê?QbY8t‹ùÏÁ**m$b”È”Y‘«jbÁ´úXZ"¯0ð )uJUäX ‘&OnÇÂÌ„9„Ø*´+œ­öQú$ :¢šu(PåmˆçÔ_Öyß^xá»ÿþZoƺ¾«uè¸þ®ãë/J é“¶sÒcÓC¶³„‡Yñê]Ãß•ï»ð_ó(xý/ÌpýÅJÍr˜ƒ/²×®r§˜¤¸M¢u -Ũ)?Ýj´È¾€ÞjÁ¥ؤ.O¬l+­¦Þ¸®¬X4£v ¾B1«•º²»+•,UŒ”›Ž˜øi]®õBU+OX*jÞ<^B=*4ÃÌá¬z~QPíï^CF±.ºÈ _þ9,Sÿ-ŸÅªŠZ¶äæ÷‹™(yþ›q>èQCbÒ–-jvŒ‰IÍy‰@¿Ð|éÁ/Ûy„Ô8‘{ýÝ&m‰)“C)äEG^z˜ÿɈÉÝö0"v%„™fÌ‹2ö?81 O]©º+_¯©Ìn¨Nß™½©2}Ólr_Ì óùóù>\ú’76r<阉!d s¯†JÖãÇñòË/ãÕW_Åb±(÷})¥ýmoßúò·'Äm JðÄtƒ±‘€ -‘*'˜ÿ(õÀª5ò(‹ÖÌI¬D]uÒE¤«·1¤:Ü3 JŠ~ëÊ"r!×ܨƒ–úJ\W³„¹x²ZUS‡5ÿåÎy´˜Wò@õ¤ñàQ€jxß+“ûºµmkgDÇòwg;ïa×iŽMë:!<6£ÿ\0ÿ‡boü…žûd¢ÙPÔT.«lÚ’Áˆ«^~ ²r?íævM¨ä¼¦Rˆì–m #6l zQΔ—Öa®e²8P½úgF)M°µiÓ¸¿ªEìG[V²ò³1öíýQf>ÁŽœZçfåäU×! ©jÓîX}LWW¨^´†JUB}6»S/‰1pÂDœº$üäù $¥î–‰`jTr±À€ˆÛÃH“1 JHlj„ä¤L‰D•Í’ÞЙ.~‘ÒbÎk¬Äã”B‰ B€•å`ÑÜê“ CÁŠ/ªDÖzW ªeg:Ìš&jÏ}¬XÛç»UÁ¬G£“ª‘û^)Xå¶IÐèqo§DëŽ3qFþ.<¥ÅØëŽMÀ·ÎñÎw%m>6IÏ×ß¹µÊ{ê=*•H'0ªî¡êe¡ö¬É¤ú[½÷ë•7ªÑÞ:@Òh:ÖÈ”¢oîÓ!d©R²šØ\«Ë#ÁVŠëˆ–YIŠŠ”·Cdë~ZÕ¡­KªXu8öF…”sÅ:Õ«¡²¥mp_f3éoÏlø†ÇþÆKä$ûxŸæcÞ¾ê¥nÃw ËU02Ü®eõ&qR¨uk±ˆ@JšàfwSŸ“C”)+[×úýG–›Ízž«¶mqóæMܾ}óùª 3Ãû™ç_ºµsë£;Ûo_cš‹˜´îÕóþ? *WÚ@•X[&yA³x{t²XÝCežoÅïþ3ø˜N%Ô(hSRõ*÷ fÅjafPÅ‘O…%!R©+‰£J¼0º”0%,%p„’Öçñ¬±nj`Ç ›c’¿¬,òž ݈ÎÓð~ ã̳ N=÷@ÓÓ›þ€o]àÎw&gzßaÛHT²Ãi^ùú?Vô^™ÕªWI¬)*¯\ÀW§zé’âÖ]SOìñÌ2ªŒŸM+à«Ç‘¾R§0yOa?6Ë>ÜÛЪ力dR¥º pHdD†¥fËð•òHÜÿ÷NÆkk•/cØáhðÄzâ.Z¢úkµS½@bI µê“™5Qñêr; P4p@ŠÄ>j6€©%(11}ERú9µûïoÊM"šûàÏU-€IAì Ø^^ˆ’CåIbŒPC±Š±`ô1Àƒt9—fG¤å0~ŽÈ fˆvÕËê‘£‚‡ˆÀàfþRJÿHTaåÇ€^™½Ú¶³×MCù²é*Ó;fM}<~üV~v…¦€VIÖãÁÏj&>ºµuë f³wXU0« ‹*p8²ÈµòHƒj&u¡¬4ÌìRé‚)ú=•=×ÛTc¾RqM–ÞùgæÁ¡>Ö3Ž•m_0"kc5!¹‘ݬ -+þ²ÙÂ3DuN¬‰¥²2p0 6Ÿ §ë °.Š‚u :gÃû¹ù»6¹]¶@Ó“›îø‰}Ì1¥7`›ž»NÊ uoN½_çfiÐZ?J‹z1C\ ª×SZ ØÜ¥ÓÍsK`iìWÒ†s_9i¤fa°¥Ï”ÌT)Qääû•‘Ñ$"$˜*OÀôQ"þ»f#;Œ|e¡mq p1f27¯·qK @æ•CBœSx¹ªFP++}ÉA÷|Ø3Ù¢~H}º^.Db’ÿ»RøéÀb›mü4§ç+  Omšù§¦ô€êº*€Ôø“é ‘Ùk/ñ†êô-`ú0®ey¥cÛ¶¹¶ `žÌn|wç­Ïn¦÷ÅZ#&mUì‘ -r™2D¼»ÛÃAT¹QaRI WKljæÕ7L¦ ˆ`pˆj)|W¹ª&%ɪj–a ð`Í%̯.DmÍ´õ‚e#"ED.ääõ\Mfî»ÊŠXÏc5«ÓªÓR³âœ~5"¼(·AÐè±Væ=m†÷³›>íþ.øg"ôMðÎ÷mñìK¦|}+Zó<ÈÕXUƒB ˆ’ZÉéç=¥ñƒÈÌÆÍQ4/Aõ¨ÍU/é=F‰_ ²ª÷‘«ì¯®ÈºSÂ<åÜ·QÃ|…Ѿ÷JØóxh_­€Ïšh¾Ø¨Û:¶·DÔÖ`6€¯q›õ º¨ÀWêöC¬þ]öaEBãS7š@u¡`J«’(Ðl0jf¬ j¡”¼)Òƒ•[`ªJ_% ¿<¸Ã¼•MTf–ØböèŠDDÔÀÇ ûá|W²9ùH$ ¢I/²söw]¸bìGfô£ûzð[½ùoMžÛež`ÅEûýÉ`ƃ•rƒÒ›_ 0Èò>ælt/±PYjøê/ŸïÅK4^KËàeƒîC*pfÔ)?Cøâ˜¸-¬IÁðˆó _ì'¬R]ăºß>åæÀ>0Åœ«År­U™_=øòÀöåý[ù}š ÖÆJż¸!|pf±{9‘µšˆ’ ,ÊáÕAÁT-ŸÀ”M–(y"=¨ļr—f ô'Dñ?=¸cºÅNSš¼È—Rx­L•Ú"8͙nj˜8þÊä+GR‹q%$—Ô‹æ`_§9a¢ÏâÙãÏŠ°Ðe}i‚Á„‰°šZRQK9:EÌT#i]ÍË–%AÕLZ X2Ò–XÀÈ ¥92!ƒU5æS„i>žó!`æiéÅ‹¥f êš+r$⑵€QJn”7¿…É]m2Éç#÷yŃªµQg³RNÄuœ~ÁM³1Þ`]À:Kåæ,€è¬ ïÐßua‹±I€?ùHnÿ6¶ÿ&=3>.¤'(Y›€YÏ6Ô‡¯†·£Õ8/- ΪýB fŒÎ+_V^°.'Ú§2úªÀ«V½*ƒ¿f|‰G gV=m¿à¸9(XÃF‹^ú}?r/[«9eô£µÔŒÀ@³Âhߤ#ðUåµìùÐi9ŠB`ÜJÝQ=ÂU˜y±çg”ÈDÍD»î!2Kª0febSó@#XÉÂ/µþ}1ý[fïgä ‘*ÁŒŒI”b¬I 3LµðVöP%÷ÀqÎCKñϼ$ÙOªG¬«Vð•‘D“BwÏÝ‚–T| ²$‹±cж‘I †®Lu™ºËœT-‹ 2×3Ý!×ÄÀ˜!ÌèЖXMT –Xb1¦s–ÁTˆÕ¸)ê”%cvOU¨VêÑ ¦ÌªæoBÉʪÔ"Ú5 ©­Ô, …ª б¶}¤†ªz ¹YÓøw–û€6§žc9$ô´j“ñàQFW«/ÐmݠѳRnž6ÃûU1öøvîø¡ÇòøK“<þž­çwIÓ(0Ùªç%«Þ…#ƒWáœ5˜ÅKÐ ô1õ¼^ÚMŠ ÈP¡Jõûý]'ÚwÄ4/ôf¨† ¡^ØýRŒKENÞ¶&d£¿ZÖE–ö”ewhyÅØ5®ÚÛ»_W÷Ìg.Ê3y+@ȪÉ$ òToŸÚ¸?Ç} ¤0H2_FA[@úÀÁ§¼?7›P¨W `÷%Õœ(KžúqKÅdRO–çYÑíkY¥æqú5|±-üsAž ÆdꑾœÑŠ©ó¨ÑÍB^m6yt™kyŸøkÈÉûæ¯Ù^î:s™ÔF€¯ 0òš}1šE”B+d&Lj"jD^e3e#Ö¨½1ƒi”+«FvUû-TM#Ä3×³Ç ®FeÓ¹¶9=Ô,šõqbÄ—ƒ@‰Ù€¸×ËØCÙ¢ ë2®iêúaV¡OÝl~u8ëBÛU’ûº­ ½2¼Ÿ:ÉØô¢š·ó¿ ðϼõ[“ÝMto ~<Úów(0 ˜ñˆÑ>‚ ¨V xì ßÌ»3S¾üBíõ8Ï.•ÿ7A¬tORÀ× «piäÈÔåJU5BhB «üa@BN¨ 声J¨Õ°n›Úó¡Õð5¦z¹‡Ìh¬ÈCPA",¤WNnôŸKrÇÃ|ÆãÞ­’—ís"˜‚`‰¦?›ÚdôIHÍ×Bý-4ffI¦rÉ5‘_î‹:/²[Ú¨ !±`0b‹Wç«MÉ<®dHiŽ&Á`*b*SƒD$‚{©˜Ì îBæÞ©†Q]°ÖG¬iÌ”´ø¨›ûx°$°çcWº,Â4L´aŠW§E³”¬í’׻ȅ”Lªè†ˆmè>»UÂieQt¿à&Ðv4zÁF„§QEó´ÊÓ46Å9Þ‡Û¹ àûÛ£¯nmÿ»v·Ÿ›,'¨oLG³ÃßíQ(c¤ñrGŒ‡ªšwÖR_=+_å{ñâgcøS¯BÄ(kB\=f¾PytPy”Õ0¦~…‘Z̸–à+,ÙU:¾iÊä‘Ç…XUFûz…g7KA³Ö mœA2þ>7ã®’ˆ¬I¦š:¦% B=ZÂû+Ì@º(0âJ”È!¹tB/5´õå-ý<ÑVŒ™ŠÅ)ÌŠ:ª¥¿.0GF1¿YWMØ÷0Ãh‘½S~†'¢Óž$Æ‚Töia6ÇŒ†b}Ë«ò÷%w‘qü)Þ;—h ïó”af*,jSXjTZͤ‰ëh#? €b_h¹0À*,Oª’Ê -{¬( í HòxWºÈÍî®XUý€b¦hËãAòçUjmâø·MÆs§5<íäÕ* XÇ¢÷0¨ŒHUМRD¶`²&K*fæñbжaÏ   jcŸQJ²ÈAŸYÅò]Ï™™ ‘FÃPôûQ¨WY¡RªæÕ~»ÛP´JO 'ÆM£‘eey‘ UŠU>VÏ)‹êL=]?¾R°.`m8V<7PÁ•áýümö>Ežü<ÒAÆ XPÆù%[õ{©g´·îi"A1%R…›ô'ÒV¶‘‘è äðA‘¦Ä”ë{bt臚¡4ï'‡µ?žÒÎòàwÀ;–G¾±²©jŒh‘ߣAnD)U£Æ!21{bT_K®÷(€d¥ØØ3M»Cö±£U(Ý5U"Ž&é ­ÔM¶)“†'Èz;²[áÍÀÌÖº®“æ`fS$VS(Ø|UÈü ãÞ¨€Õ¬:…q]ˆŒ <ÌÓë(D*ª–ª Ïœ%>öÈ…P¬fÝx°{L£”,… fÅñœ#6ªãÀÎÙÓuer¿ €u@å4”›Ó¢ó›^öblðß´í¯ nýÐîäÙß—¼8:N]y~  cYaâCLïºJ•²”¬“cvUBËÇX@j¼â¹1ÉH¢½7þÃWïùC¾Œ¶×á©W{ïê[>1.ÊU2#cRí.ü½rÊ.$6«^®ë¸ª“Ç… _ê  •‹òŠÇ|•q«tï°Èû°ŒJ³+ Éú†Y3ûÉ…>¾£4Õb,÷×}#¿ ^1¾“I^ñ.SVž´SO¼*% à«Ôääü¥TÌé ¸ÙÝcêh‘Sà)B¹È\¡~µõóŒÏ¦†*È•òœsŸ”"$’ÝÃunSn `iØLUãð±Ö ê÷W!2¥TT}…^å¡¢\I¢ÙG¥f¢€çîw 0"“”ò˜±Ø=³²ò«j™•R²¹Úàí`2s˜œ%PÑòÒæ`ž¾øÃþœ@Œ˜iÅ–Žú³‹¶ãnû8ÛÙdÛ'½UÛ>…×36f¤'}Öf¾wo2ýòéäÙîÀUöCg…üµ±Zà(£ò Ál¨–é!IöCulLËEÔKàÀ¤U$…WØŒg”©ÒÀ ¶¨ÞKóãEÇßð¹µj¤¦4DÍj™y­ÍQŠ‘ókÎÊQµÀÐóÇI„‰Þjmÿ'…’š¥Ú`Ÿ¡%—3wŠ^^â˜ö@ÒÎgHfV íV¯5ãü3îþ,Ñ4à‘+x2!‚]—ƒ_ÝlÏõi&+ïÌ%>ʰD0{Óé]ÞÙÙUkzÚ¬FDeÕ©eFª€Ë<‹Ê½TQU“Wõ)€Æëp¼ï/ÆmJù~E)™2K½"0ƃF)qÙ»mƒÈ…ÓªÃdñÓØÆ1K€·X,~íçþç_»R°.˜‚u•ãÞÞ ¦¸¤ÅØëø»üÕ‹ƒ_LúÖôlóÜ3É-¼´*Š!­ #[ YMg™MÕ²')fŠÕ¿³¿l¨–-¯rÔJ Ç}te|Ec# …ù¨­éº¥œ Cøb(圥rÁ«€¦þÒŸ,Â_ä¦zé…ÈG #2X‰´ØÕ+5ÆÙ/,ìÀéŒT¤&¤ÔˆƒgZ}`B“¯<üiáí ^qõÊÅÕ96-¢Ï'C"2ݘJ˜×˾$Å•_¼è‚o©R ½–'uUI‹ÊlϪ‘{êùYù>mÄ[ ßK£Ág̤$f¡Ò»Â÷GÊ|@Ì)’Ò­É=~>Ê‹?5Fq¥¦Æ<]d‰ŠûØÐDfU%UmóãøÈÑ8%O^ïVæE¥X©jéN AäÂy…{ž¤Bµ àýÞÕˆðÖYŽ˜NˆÞ«þ®M¶³.ŸÕØt]ðú'ªöÿÞ“w~pogûMi×h°ïÉ\‚CÁŒVÿÆ(d­‚²£‚Y:Dƒ:âs©Ð™:5cy•ãÈ Ò(ÑÖ…I³s¸9öàIºûvó{¥ÔÇY¤® [+ó~¼²‡15%Ô"|•@Æ‘0Q¿-Þ²p³ýÛûòàWw(ÆÕµ‰°ͼÒ/  ¶;œ¨‚/‚ùºKPà‹H)ÒãÑÁÌŒ…(C]öliZ~G¤êq,Ï/Ìö½ÃeýÌ 3óºLÿwËÏý1 3³Ö|Dg4™Xï\o»†Z¥ª&€±w–úñ}dÓ¦ÑèþÓÖaÄ4%Cü<Ç*dƒ»¹6W«”’Y˜äÉ,{³@X =ÏpÏM¡í4=]W9Xè–RÒœ­sÙ”›ó•«œ°Ó…ﱓÄ͹Ú÷¼óàÑ×íMöÿÔÞäú”‰7 ] fé ¿6¶tˆ*µ)˜­‚²ÃÀìþ2Æð‹Ud×D¹(dƒçVNôÚ‘i@ 7þ{ÓÔðUK¼R‰ªz÷q%êà6·úQÄWj ”§_Ô Õ¤ªML‘4" rq’¨PCÀ7î6³q ï.d–÷Ä9²‰@Ò€“~öX_Ü[ä³¢•§\±“ߌ¹Ç‡jb¦:¨’™‘zñs¾òRý'Ãã$†_lø">_ìÆs«G"9ð²e4‘@‘56w“}IEç¦QDÞWYT)%‹ pÕX=(¾a¥Hv·œu ÕÜLS„‰.,b[1ˆ\Åꢄ{žP­ÚÆeí#|*k>Ÿ›N§KÈ!x]ÊÉ)7W9aG;®Ì ÿýƒ…üß-Þþ‹{é™OŸÒl5d­2—ožö~0#ãÕÓi1WÖá`ƺÊ$KPí2Fô€¯yÄ@p>˜ÇJEîÿ>ÕJ¦©’EC­¤eÈ¢L,T);½BͲmæ…M2P!¼N”£rPgx±òs‘ªˆ¹5ónAÚ4*1ò3"KM#‹PÁÔÿ1C XòQ`ν2ëdýºbqxEwàE ÷<) : hcf\ÆÛÓZ•cZKÿ6N—OÙ#a”WÊÍå•Ë®FþÎA‹ïÜûÎLþ½Ù³ããBZ9Å™6˜øsS0;á1&3d˜©,'Ú{:>–BU}óÍÐÀ<~ $”ÿïT/Á„© îJ Eô1#)¿˜àÀJɶ–ä}êÛûãRCñÁ†š/R<øG-íDY0å4v4g̈Srÿ“ÃeøÊ¦x« ÉF’î™HZ36ôJ´Õ¼¨òÑԌےž­ZÑJ©·²q¸-‹~Ëáç©VàöUmÌ`)Y\ÈË*>ÎEËþá40Ã<J(‰T}lˆ¹ÀM£ a}êªUŒ¹iJª{^Y94°_ÔpÏ‹æéº¬ r« "‡³¶mmd|8¦v­ªEyO*7WcÓ³ï¹þú}™ÿ“¹¼õC×&ׯO&“ ¦—2˜¤Zv0;É1æ!`Æ Ù˜ ª*Œu¯¿ç‹|®Ð¯3î‹U›PÂX;˜’ú Ç ;¢žFÌYð*0“ }ÝmýÖÃöÑëf[(ÒTÿÉÙkÇk¥z•ç𥼤Ú'4¸êrÞ˜«^d(ãSÍ;«|^<ª×G¸ïj¸2Ô–G‡È~¯< æÖR’¼ª0«qm¬¤ öì+„âd¦,%Oq‘1·Èr";bµaî ä|U“®òe¥ýIJ.yaó¦ÐVÿ½iš«áES°VAҘܸxÙqü]W†÷K§žËØô׿Šo¹Ó¾ûÏ`û̦{«R#!¡‡[²VöŽÿË¡Pv`vÒþ²UÏjÌ’#ÙhL†XtfëHxiŒ1´”íUI<®¼¤|ËÙœîÑZHe7#DH€©«ZyÑbQš|fgô]»É~ð±-²_+gYø§ã¸zÕa~ŠÖE:6Eõ².zÁŸ‹ˆÖYYõвèÞ•–:öBäÆõRÜ»wÖÊh³·kGTÈx®Ùë¤J¤eä¤ùip—ke±zh± ÄÄLµ õ*g]QV¹ÂÜŽ¸/y5Ž– ìk(6OUaó&@•Ï“ùïW ÖES°V©X« i ¼ÆÆŒ8†¿ë²(7ç *WcS¿Ýn[üù·}ý5=øÓÏ4ÏM—."‡mÊVåVÁÏŠäö´±ZvT0;WÙ‰Œ1SrÓ{9ïkRx$ã+ ÌhÜ/¦aH½Ž®T¯*tÔZ“ÊÜoå„ßàÓ&6ùrmþ¯;¨pax/± 9ï •™}Ì÷0C­_TB¡kòkçzדÈ@qµ²g RÚë½ #¾ŒîS9¯Ï$ƒ™¤XY(¡Råhq#¼¯þ«:³}°•kš¿þXÑX€ÊËš£G¯¸Ya`¿,ážgá骊™­¾_Å4\ [˜Ü¢uÁkÅýÖöwáÆú÷*¨÷ö´MÿöýÇòk‹æí}þÚ3/&š® &¶±\s”˜°¿lÃìÓŒÉHÃqOf¾RBZñRØ Â#o\¨ˆì‡¯‚\yÕž I­¥¯ÛžÍ~¡¥ƒ‡‹ESm²dt …¼êì°bdï«^Kð“=Z š+ ëûN2@©æŸS¯ª\»]^nL@ÅæJ±²¯m™Ë‰3yú{‰V0=š;™HÉGƒÆD¶¨VŠ™ÎÍüu5商½9¥ÔÚøŸ§n?&PˆbvT ÊPuÈs»R°.¢‚µ)­X­°x­3®m¬?OP¹2¼Ÿ½J¸Év~û@è›_¿s÷žßÛú·vÓÞZÀDØxŒg¤‡ÔãÌNpŒ¹)˜]’1f¾š¾Z&f$Ò ¯˜5ÉÆ^Šˆ¸ªÊ2 €ï–æà?{hu*}/,EÊöeµ¢¿Ý\]Ù§*Ê˪—Z*šA)Žó:xÔ/*xò;Ä̤Ò ð¨¨8CÊðE¤<™”³®æreUÿÌEÖU®ÃA1‡š¥ Xëp0Kbo×´ª30†`e¼À¥ ÷< h«ÿ{ :ì÷®ë¼_TÓŒå`-ÁÏb±½°ÞÇÀk ’Ži¬?7×ETn®rÂúy`F?üÎÃÇ_ùx2ÿó/î=›TŸ¼v™ìðΣ€Ù µl%˜àèÇQËŽ fg;Æd —ž–÷WŽtHùî F½bâ%Œ£^±/Ø™n}ÎAûðÿlwЛ3#©ŽMr37űŒ‰ÃzàÇY“GÙ1êcÿõæ¹äõB6¸€W<X[鹬…ÍGªáï>é¾W€uηýý}`[[[Ë… PûÙ*HZˆ.ƒ¿k zZAå4·sÚcÓ—ø3·ç÷¾÷¦_vmòÌé@Öâžò1æ÷ÍæcL&Œ‹¨¶ÜS½|*aòñ­ÉÃÿåÁ|{xažtùS¼ÚÁN¤¤ì—€¯P©XúÇt%Z×H¦ñÚ4â z¥Ó)z {ªTõ÷ÞŠÇÊ,ŸÏâ "‘ðU)˜î†tSW( ˆRfäûE¬‚z/¡õ:«ýõ´…{¨ž´!P=iy4z¬ýýý¥ÛÚÚ½ÿšà5 cëÑqÀë¸þ®«•y§»ó›>h[üÈþþÁ¯ÊÎ;îúî³;ô„‘!Ñ!`rŽ`vâcÌMÁì¤Ç˜‚Ù‰1ÇŸ'/Éßrm:ý¹G­<ªŠ–`!ËkõüqœÄ¸àr÷OÝ·ª^ÊUC+Òÿ–˜Ùà^®îÕiå«_ápä¼¹Ê,m*`Ô49qÝÀ,9rAUMc<fpJ¹O9Ö!†–ô÷ Áä26WúP ÿíjáŹY1_Ž@Ò|>•1ðZoÇðw­m¬?×ÚÆúó•+Ãûæ?ûûï>nãGïüÕO¹¶÷YÛ³ÃG†“#N7RùDÕ²£‚ÙÉùËÈŽ J`L†¬|ýË`¶ ã¯{vûáß¼ûx[ûÏ©¨FõsP‘¥õ©œ’Žì/3㬕U…ñà…FyÐ$ÎíVA &B},ð@åš3ˬ‰“±ƒH¥ó‡™1+R*ñ ¹¤9³Ø §—EuÒ@u5ë°è„MVnx‡¼þ+ÀºH Ö&´¼–ÆŒ›ÂÞQõÇõwÇXÿ´VÑœ$­«Ô•ì&‘}ÇÍûþÃç°ÿÕ×·2‘ÑÆ0³!˜]TµìP0;9ÙÉ17³Mǘ߰›¶þök¸'bEèz¿ŠfhDO~)Ǥ>¼ ˜Ñ¾¨­vNÔªów1 $^Ð\«á\+„ΫU½ÇB¤Ê>±lUÝ ŽevÅ*%pÚÃ[•û —"NJºLYT›Ó»oêÇ›F]Ö¬U«uoë‚×&Û9 ×*ðºhþ®Klx¿p9aÊú·Îù`ÿö¾xýú5¢•#C;˜¤_ä©egf›æŠ]¢˜Œ)@ßøÜlþ7î.¶FŽÕ•‡Qo¯tàÄzÏàeœR¯<šP ¥QÃWñl™Q­zQÓèK(Yb¤Î„>²‘ÎÍ”ˆL˜;O•g]uŠ•GJ Lò+#Þ‹YT§ Tc€W_÷.#‹\î&ůéó>ïó^þp{{{L :ÑŸÀ˜âuœÇ\1f¤ñÓ¬ù1Wø»Ö~Ýc¹îÏÆbÝß=«íl²í‹°Onü§Ÿ²·÷“'¬2Ü2Ž0þ¥#üŽeÌ|”1æ¼þ£ýΦ¡ªG{ý5˜0é×¼òŽÜ£å, /Ä>Ê1=Œ[èog`¬_º_Uë“F?û¸†÷¿¶·wwgww«\ÐSʯKs_á¢\ks\õèI÷ݨS¨ÛþiE'¬ó¼7UÌVýž™ýËŸù™ŸyûJÁº·1Ú}üø1F kTýZÇð¾J±Z×X¿Jy; Žg¬?·bì÷ª¿k“ídõî |×ëïÿûvæÿö3«º $½m¬üE-;“1æQ¾c>EcL¿ºwŸÛ©¾îútñ_ß]ðšŸo‚W\;¦‹êeË/†D¤ï÷rè(oñoÕjÁ S‹ÃjVƒÊ“‰æ‹¶ÄIPU!ƒ ºYºÊ¢ZÚÎÂÓev9­XO%`M&‘'Ñ|>·áýV׺@tü]«Àë¢cŸ'¨à)È »ß¶øá×÷÷ý`wñ=Ÿ´÷Ìl|•¡AÓ…É ˜=mcÌMÁle_ûìµÙO?¸ÛÞSMËBÔÑ=¡k€W¼åÔS· ªMíշ•û«[€2«˜I°èþ:ZÔüßWYTÎÓuXYÁÚ’V€—»³ðwÓXnÅØç *›lg]¥î¼rÂþî;Úùhþîê³×ž'žŒ5†tdµ¸T`¶égó¬Ô²³³˜ʦþøµÙâ§ïíó:Çôx ¬uÎXó¹ ¼ÆV9§DóàBÕtàù¢ªˆYU­N…¿Ê¢º8ž®³«˜†‹r{ðà°½½½%€S¬Ö½­ ^Ç5Ö¯X1q&Á©'ßµÉvpUŒ½ñvÖUê~û@ìëïö½û”ç¶ÿðÖd{dÏöÜ•ËÑ(cfíjþ9m0{ÚÆ˜›‚Ù1Aök¯¥æ¸£j#¾« ”„uÁk­1ãaß){ŠUw®ëo›H­òTiUq“‹˜¢4á=”Eu’ŠÙ“€jø¼¯‚F/ ‚õàÁƒÑþ:ൠŒù»Ö¯Óðw'8õœý]—¢{ìvM„ìû_¾óè[_¸¶ø¦ç·¯5Ë”±²&·ñ¬3:„±ÎÌž¦1æQÀìjÙó©IÙ™íÿò£ƒÉIј—æ8àµêótÈvžxñ?k ÚŒŽšEuÑ=]õã<é¾W€uAk$×ÞÞÞèã¬^«€h]cýèIøxþ®µõ«ÎƒWÅØ›)[§D§56ý›o?˜ÿæþâÝ~éÙk»Ãô;äâ¿2%`˜­‚²£‚Ù¡|uÉÆ˜<&ã›®oÓ?}<· 2ú’NˆÖúR·Îv˜YWÁÈQ³¨ž¦pϳöt Jª@Ù±ç}Uö|‘^Tõf4McmÛ>’?~< ccൠêŽa¬¯ú».E1öyú»N+'ìWÎåÛ÷Ý»?ò)»;Ÿ1H?ÊÅ%˜Ñῳ˜øórÙYªep‹'¿šæ¯.4­ã»:i Zµ£ú»"ì8@µ© vÙÃ=‡ tÅlS >æ½{÷®¬‹X›*_k‚×Ò˜ñ¸·³òw¼Þ«ÅØçìï:µbì—ÛÖ¾ýåöá÷`oñÏíí.C†žº*Cfwžì@»jCgä/Ûü =³1æ7\ß–ë!ù®ÎÑð¾ÉvŠªÖ¶mŒ«pÏÓ÷t­ T›Þe»=•A£Ÿû¹Ÿ;¼Xàúõëc*ÂZ?[åÅZ¡x­õûc?ƒ—UÛ>‹àÔU1gœºJqº N=™í ö±gwšïÿý×÷\ùŽâÛô À…—®„,9Âï´‡~SÛ ÌŽegxz`¦û·í ãòó1ð:©@ÓÞïoooß{ßûÞ7Û¨S¨Sºž†pÏ£Žüžtߣìù½ŸýÙŸ}÷JÁº·±˜†;wîŒ~î‡à56RûÙªÛEówÇXÎÅØçéïºÅØ'éïú¹{¿û»‹;?þé/\{nšše >ÇÍWüœ‰Zv&cL Yý}ö1gDôG÷¶þÏûÓÓXxþ.» ÷<Oד€ê$<]mÛÚÔÍ+À:íÛîî®ÎçóÞ;2™Ll±XÐ:àuýúuŒ¨k×ôw­m¬_’N#8õ<ý]—µû¤ý]¿½/ö'çí{íÓww?¸»ÝÍY ¶ÉÅüP–ÒQòž.&˜ôóc2¾êÚýâÃ;C :Wþó*Üó䢎»o†÷­jxß+“ûŹÙl6}3¦Ó©­^÷ïß•1ðݩǯcù»Žc¬¯ú»V¬/Z1ö¸(q²þ®û"öÝ¿wçá_þ4Z|ѵíî/ÊÈ›BÙ³ÏB'¸V‰‚§“ñù×y²w“ä!@g D'íïbfUU» ÷<] ¼£Õe÷^=Õ Ök¯½f쥗^:2,l^6æï:Îm]ð:npêIçw­ºBpêè¶Ï"8õ¸ù]—!дm!åÿ»»ÿÍ ö›ÞïyY†C.þ+7¨›¯`»¸`öt1׳à]ß[ü½;&q ­u\á‚Þ#¬RT›@ÃÓîy”×x˜b¶ P]æì«§°²‚õÖ[oÙÁÁÁÒ^³Ùlì~kßÖ¯ÓðwáÁ©çéïZ^­û<ý]ç]Œýÿ·wg1’]gÀÏ]ê.µw-LzÜcÏ ‰—LXd’ bIˆDNzAÈ1XF‚Äòà 8Q DND”H‰Œxp9<ØÀH~-@¶!lÇž‰×ÛÓ³Ö,½VuÕ]3Ý©>uNÕ9÷ž{úVÕ÷šª{«nwM÷½¿þÎW_}óÔEï•+öòƒ7îλW?Ç0Bå'Å0m³›¤eÌaÛ˜}¤`hO^ÞÂÖÇ`Â;¹œ)º<Ã=“Õ¨ï£ÿ±º®cÇq`‰0-õŸ±¸¸Hýäm™‘ý],x¥­¿k\?{'û»D’Ôc?»ÞóïõÂòçöÌvçMc2|YÈP³I[Æ…ç2æ­Yˬéº1¼úaáãØðÞ?+)PÚw܆{о64EUÿ1Æy¹pÇ4 C‡™D…‰V=¸VÅb-3Òö¥Á‹ÖXÏèïâÁºŸwDœ1×N\ûÊ#ÁºŸ/Ùc$®Á:òxÞýXÇá}Î8ãF=>g!ôÅve–œ«ouå ð‡V™Ñ©+ù€#ŒV“­€¢ ã_¾°Ñ{âÒ²9â÷Dcüq%{ôïx‡­}³Ùìj¹\¶Xh†Y³¨¢T¨D+f²+T¢0’ý¸¾?RO9rdì¦Nd«^¯o¡PÀ$¼ÇÁ$¼ËŒhnn.ò×§ª¿+NcýN~0ö´öw‰'þ®¡õm¡?|ãÂúŸî«ø©³H¯°°ª?fÄêÏXUËTU̪–Ý^´´o]Þ~QN áëgEèïò}Ÿ‰*îH¯4 {¹/ Tä1âŒÍ –ü üöÎÏÏ|¯­Vkà>Zµ+nÅ+Nµ+nÅ+Nµ+nÅ+Nµ+n% §Ž>vÔŠ×|=—¹wn&Ÿ¹zAO~©äÊ/³ú£¢b–‚jY7ð¯¼Ú ý¾kFÜŸ+$yÐè°ã8޳^­Vͤ@%£qî)ZiŠÚÐ>ì›ÏéyÞÙq¬`M*°4ÞûãÀ‹†.UðbH¼Xc$TÀKdù0¼â.]Æ—’dË÷Âu{ÉÕ?Ëž|{†&uÚ¹Dü¤u3ÌÒ°ŒyÿÛ­Þ Kæ0|‹ü\ ›¼.^cÍu]*°T ÷Œò8r»jP‚Q’ "÷5Móì“O>¹ À¿ï—úȆôw©‡W\ŒÉîïR/Uý]³Žn|ñÝsÙ=yÓDz(„,m0|I(K3ÌÒZ-³'.vz/^4y~6€W¬þ.ÇqÚ›Àî)T"ÀKTq`$TQ+fº®Ÿ`M8¼hèR/Ö ðbaLEc= *ëYÇVÑXOÃPðb‡÷9˦©öæšûÞ|ÖîýÑCadMÌÆlóT×~óû­XÕ)ð¢¡ËuÝv©T2“Õ(4$ *à%*ò¶ P‘·mÛ>×l6×X/!t%¯´õw©‚|0v²ðb=Ÿ…úÌM»œŸ©ô,f2—1£hÌúË>úâ9c]&’xÑ^®ë®W*•̤΢’£¨ø‰ ªQÀë¿Édΰ^Òàý]ÉÂ+mý]ªà%²t) ¯ûö•­_{W5§¤Z$fC% ³IZƤ|muêJoèÃ’"ÙËŒäý®ë¶«Õª™4¨FUž’•Œ’UœŠYÿmÏó¶mËf³X€.®×WE—*x±ÆH¨€ôw% ¯(ý]›-˜÷í­2Ì_q!7ÕÀDÌ&¹¿ìÈ¥5ÿ¡·/kŠú®¤ÁËuÝöÌÌŒT"ø™äYT*AEî[.—/<öØcë,ˆ´jWð‚þ.õðš¶Á©?Wv??0[ÈŠ¢Agíï ƒ˜Á2æÖþgº~pøØ™ÄAcÃŽCVÒ£DÞ¡¨T£ð“4¨HT‘Û ÃÀ}×!ìûþŧŸ~€I^4t©‚ëc‚TÀ ú»’…—ÌÆú™Éêsp¶PÒ(%‡ýRDêR³IZÆŒ³¾ïÿÃß;å·=¬©þ48Çq§S,õ$A5jßqŸE5ê9GCTä¶n·{ €I¼ ¿K=¼vrpjšú»®+XÚ?Ü6—ŸÑ ±OŒˆ°Œ% 3}0`sÊîý¬÷ârOOD<+‘ã\ëÁ2DAEnŸæYT*AE# ÃKO=õT€Qùÿ”8¼ ¿+Yx¥­¿K6¼j™Œö…[wå÷å]Ad%ß_$·Z6†0‹¸Œù•ÓKÞ?¿³¤' ¢¨ðbÛ¶íZ­¦óàfQ% *U4P‘û™¦y€›jWð‚ÆV¯qèï*;úÜþ]ù[ÊzFè§;¥ÓÞ§}ó?×6ü¿xùŒžˆ’èïr§³YÁ‚YTòAEn *r_MÓ®° c/èïJ^Ó:8µX´´‡ö̺?¾ËµPŠß§f ªeçÛ½ðß[LD²ÞÇé”J%CT侪A%‚Ÿ$@EÞV *r_Û¶¯4›Í 25ð‚ÆN^“Øßõ×·üó³s5‡û6P4Š ¥0Kë2æ/=¬÷°&D*Þ]×ݪ`ÁpÏø£¢‚Jd_Ó4û÷[`A&]Òáý]êá•ÖÆ~èÖ½ö/Ìæ\ÞÐ^dLÌRX-û“ïŸ÷¿{¥«'Y‰’Ùßåºn§V«0ÜS>¨Èí2@uíš±u»Ýn/-,,l° SUíR/èïJ^ªû»þxï¬ý‰}ndi “Z˜MÀ2æß¿uÉbñŠDq›à#í”Ëe†{ò÷ä}§_ "·¯¬¬,#°LЃ÷ œÈšÍ& ]\) ˜„—ã8˜„W«Õ xqDz,LÂ+“É`^«««˜̪xñ]Oçìt:Ôãð¢=V½õ8$¼®½zä}¬llPÏ}˜„׿s~éóž„¿±·’åûaÄ â'ƒ†™®ca˜ Á ‡8~°0Ìt„Ea†uƒëkÛŸ³1 (è`Dš¦aeEÌãhš†eÍ¢ÒûÆ»%5ܳÿ;1Ü3‚H 2 ƒyü~4  3×uñ8^DXDàÕl6iìw4òD^˜UñŠ^x™¦‰Y/ž¬­Q?n‹ ^"ët¨í ‘áÅ ^Žsµë«o]î†Fß½7Ë…,dèÂÈR³ž°ºQ–2˜]皉 V|Ÿ:ó ^"v˲p†¡lPÅÁ P: ªþcÈÕ¨}IPõÿ U?¾ÈJ×8–!;ñ3ƒS‡Ü7mý]¿¾o6óg·Ìf¹+GF„å² ùÇLÔ2æÕ«ó1K½0üØsob}WqŸc¬Ù¶Ý­×ëHF¥iZ†{Êo…jؾ¦iâµ#GŽtXˆ$t%¯´õw©‚WÚ§Þ½o&sÿM³9~0DG ³@ äR ³(ûð3'ƒnCE“hx·,«×,î©TäóŒUÿ¶v»‹ÅâZ³Ù.°  Õ.UðšÖÆV1¿ë·÷ïÎÜ{S™Y‘*9‚0KiµL̆¡ì®ïžñO­­iIL^— /ÇqºÅbQ“ *òö¤ ÷*J2AEnËf³ëã,èÁ‚¤)qú»¸ëiQÕß§±>nWœÆzý]ÿôÖ¹žièø÷öÍp"ËÀÈ}€/ú‰Å«e:†™¢þ2«¯™ï[a7ý×/®kÔ>©46¼oöÉîÙßÖ%«§KÖ,*V³¹Èòà(P™¦É•çy "·g2™±í¿`A¦^õõz³&Öó„^¶mcVÅ‹'KKKÔׂ^"£5ÖçóùAp‹ÕðNƒ—ënŸÔðèÉs½À0ð=ûx+Yº`³x”¡0dÒ 3™Mÿ7Ø6~Q[ãí5¼÷+*~¢‚jTUŠU³¹ P‰T³’y[T›·gffÆZ°D™´ÀàÔí'ú±ìïúýÛ®Ï|r…¹Ð7¥-}±1¨Y.“þ²¯½~ÁìÌŠ”iîI7¼‹Ån©TÒD+T¬m$ª&q¸ç°%¿QûÆÕµ?ü¶þ}áÂ…ÎÑ£G=2>?ëÐߥ^"ƒSïy÷uÖ'oªñp0#€Á7Õ¼ƒOÌT Œøºš‹—ƒ¿;~n(ˆpMðQŽS,»ÙlVƒážüÃ=UƒŠDUÿ¶Ó§OoŒ#°`‰2-QÒßspêŽõwÅMƒS¿þÆé^µê¢_}W‘c⻑/ ™‹Â ›‹ÃLŸy%º”¹˘{\kšÖg®~(!ÐÆèï"‘¡ë: ÷ŒªþåAT½^±ðÕ¥Q Êd2[ÛlÛÆýçÕq¼è° ¯èðŠ58•Q)SÒß§±>nh¬ÿüwNt«Üî¨dG@´0 LqȤfZ \’RÚ_f¦¦iZ( DI6¼oö`ÁpÏø "«TI€jyy3>b¬K„HüßèïrŸŒeÆ/Ýq³ó¾’ió¡!Ê’\„*‹á8¢K™)^Æ|{­‡îúï7ÃÅXþ»vÁ–ÚË…1ÖÇéÖjµêذjVTP «P±¶‘MÃpÏ$@Eþ‘Ø{yy³¶9ŽÓm6›Âr° É„|0¶dx}õýïqoªXVš! 3(S³U„ÐÏy!°,‹ëÍ ;ÙðnY–W¯×a¸§BP‘ÛA…ûθ^¯{," /^t%/^t%/ÑÁ©ù0ÔýåŸÎÎeM¢µ±”`¤´ú“Öj™ Ìz¡CÿþB@Ã/º’€m?Û¶½R©ÄÝ7%kUP‘ûªîInç}§Ÿ,Pm¢jóß®ëâÛo¿Ýk4á¸]  I.cùÁØ;Ùß5,ÃÀ<óÊú×?ôž|ÅíklA¬á™#?Ãxþ Ö…™x¯ŽÐ+•¾þ2 !ä8îvÞ§k3£~ðâ{côw†Š ÷„YTlPu»]aP‘ÛGª>^>ŸÛa£,$ðˆªÁ©‹‹‹Ô¯‘^–eaVÅ‹ŒŒÁ©ç:ü—ÇN®~öà¾B¥}\3d à ˜EAY´w¦fYOÇžNGR?h"À ‡>oq¼XË~QAEnúN¿¨ UÍâ}§_TP‘hJTã:`të¸ÖA c÷;:õý]ï«eŒ‡n{o~û øûE43É÷JùÃŽ1™Ë˜óß~=8íÝ^´¥9Þ^,¦dõw•Ëå^±XÜ ^$b`U2 êßFV¨úQõÚk¯a„ZXXxÿ0`A %ðšäÁ©¿9Ÿ¹÷Æ=YîW̳绎”I‡Ù·©«€Êîú×ý—Û CIÀ‹uœaÏY*•¼Í »jP‘ÀQ *JªAE¢ŠT›Ù|cB³Ù ÇX°DŒg&þƒ±iéïïúÆsK½ª—ÕæoÜåp=8ÓcI‚ñ‡˜2&̰0Ì,c"„6DO÷|˘›ã<ÏÃŒwð >3eùQ– ƒ»¿‹zœÍ¥Ëkó¨0 T0‹ŠoÕ¨wúEU«ÕB¿,î ïô`A HÌóYãÐ!ãÁÞ–z»LN0¥f(»ëß^ ß$–Êh˜J^"KŠ–e•J%T*r; ÷„LdN6~ÇÙ;k‰-¶³âçÆI‚'Ê>ðøó> I¼÷±@$^¶mÕj5„áž*H þ§sÈîŠ-FSZa–Ê>ðÏËŒmù|^*¼X•1x9ŽÔjµ†{¨TÆ„—L|ÖóTÑÅÞUˆ\ŒÖ;b01LXf=F™náQ0ëXVh1ð³Ö×üÞ‡†Á—Ì00ùxÚ}º®Sçmu:ºŽÑn·±¨ºÝ®0¨Èí£@ÕÿuŠ€ª^¯SAEA€j,2Á7,Ôº` ?ÐÉ‹Ÿ'Ea†x%k‡«e+++è¼ìoÞö}?rÅŠ·ÚźTÅËqœ`÷îÝÁ0P±¶‘h‚ážÞ@ LG7<ôøhÃÐÅb´Ú¬d!,3ÁŠÙWË–º¾%®/›Rêt:˜'LƒW”†ãŒNØØØˆ*V…ŠD€ €@ c !Œ—o¡¥¥¥mûr¹¼mÓ41­²Å^xZf4 “ Êd2RAµ‰*^PµZ-ÕäŸs dz‚¾ßF…ª†®,‹ŸÿDa††™(ÊÚ‘eÌ7ήãÿËKÛ–ÝXËz$¼¢/)Ê^fÜÜ·×ë×_}ÀÕ¶o†{B$*Xdºr¹ê!t)ƒL„Q¡*ˆŒ‡ÙŠèYYMµ,æ2f™!­QÜóß}¸´´DC×à·N©xÑîXfDù|†Y¨ªÕÕÕH bU¨HT¨&7PÁ‚@ Süµ{2hf÷Õóß¹KâçAQ˜¥µZ†PäŠÙQ)¸ÿ‘—¨èõß}Hƒ Dqª]¬ç´m;,•J¨¶½œ0:#PÁ‚@ Ó—³»„Î\‹e#¼…-Þœ»$z¦US-[°’þ²Õ5töų¨Õj…sss‘ÿP§U¼VWW©}Wqú»LÓܪ`%5‹Š5:¡Ñhàf³  šÂ@ LeðãèøñœgψEQvfÉWËRR1{äl/üÛæwB„êv›æið¢íÇ[íB(zÅ«T*¥R)” ªþmИ`A ÈæU# 5ç·l8~Pìœ(в ‚Ùgž] ž:qbó”¹0•¼xЕËåÂ^¯À,*ˆÊÀ!™Î¿.5„qcû…8&ì4a”EXfQ–1ÂÂ0›©òï{°®5r ¼ººJ~< ¦Ákqq‘†®ÁoÙ¶1 /˲0 /žeÆ0 Ãr¹ŒaDé9^2ÍÁ˜8~¦!~^ #include #include #include #include #include #include #include #include #include #include #include "cubeaddon_options.h" const unsigned short CUBEADDON_GRID_SIZE = 100; const unsigned short CAP_ELEMENTS = 15; const unsigned int CAP_NVERTEX = (((CAP_ELEMENTS * (CAP_ELEMENTS + 1)) + 2) * 3); const unsigned int CAP_NIDX = (CAP_ELEMENTS * (CAP_ELEMENTS - 1) * 4); const unsigned int CAP_NIMGVERTEX = (((CAP_ELEMENTS + 1) * (CAP_ELEMENTS + 1)) * 5); const unsigned int CAP_NIMGIDX = (CAP_ELEMENTS * CAP_ELEMENTS * 4); const float RAD2I1024 = 162.9746617f; class CubeaddonScreen : public CompositeScreenInterface, public GLScreenInterface, public CubeScreenInterface, public PluginClassHandler, public CubeaddonOptions { public: CubeaddonScreen (CompScreen *); ~CubeaddonScreen (); bool setOption (const CompString &name, CompOption::Value &value); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib&, const GLMatrix&, const CompRegion&, CompOutput *, unsigned int); void glPaintTransformedOutput (const GLScreenPaintAttrib&, const GLMatrix&, const CompRegion&, CompOutput *, unsigned int); void cubeGetRotation (float &x, float &v, float &progress); void cubeClearTargetOutput (float xRotate, float vRotate); void cubePaintTop (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal); void cubePaintBottom (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal); bool cubeCheckOrientation (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, std::vector &points); bool cubeShouldPaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, PaintOrder order); bool cubeShouldPaintAllViewports (); class CubeCap { public: CubeCap (); void load (bool scale, bool aspect, bool clamp); int mCurrent; CompOption::Value::Vector mFiles; bool mLoaded; GLTexture::List mTexture; GLMatrix mTexMat; }; friend class CubeaddonWindow; private: bool changeCap (bool top, int change); void drawBasicGround (); void paintCap (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, bool top, bool adjust); private: CompositeScreen *cScreen; GLScreen *gScreen; CubeScreen *cubeScreen; bool mReflection; bool mFirst; CompOutput *mLast; float mYTrans; float mZTrans; float mBackVRotate; float mVRot; float mDeform; bool mWasDeformed; GLfloat *mWinNormals; unsigned int mWinNormSize; GLfloat mCapFill[CAP_NVERTEX]; GLfloat mCapFillNorm[CAP_NVERTEX]; GLushort mCapFillIdx[CAP_NIDX]; float mCapDeform; float mCapDistance; int mCapDeformType; CubeCap mTopCap; CubeCap mBottomCap; float mSinT[1024]; float mCosT[1024]; }; class CubeaddonWindow : public GLWindowInterface, public PluginClassHandler { public: CubeaddonWindow (CompWindow *); bool glDraw (const GLMatrix&, const GLWindowPaintAttrib&, const CompRegion&, unsigned int); void glAddGeometry (const GLTexture::MatrixList&, const CompRegion&, const CompRegion&, unsigned int, unsigned int); void glDrawTexture (GLTexture *, const GLMatrix &matrix, const GLWindowPaintAttrib& attrib, unsigned int); CompWindow *window; GLWindow *gWindow; CubeaddonScreen *caScreen; CubeScreen *cubeScreen; }; class CubeaddonPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/cubeaddon/src/cubeaddon.cpp0000644000015301777760000012335112321343002024323 0ustar pbusernogroup00000000000000/* * Compiz cube reflection and cylinder deformation plugin * * cubeaddon.cpp * * Copyright : (C) 2009 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * includes code from cubecaps.c * * Copyright : (C) 2007 Guillaume Seguin * E-mail : guillaume@segu.in * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "cubeaddon.h" COMPIZ_PLUGIN_20090315 (cubeaddon, CubeaddonPluginVTable); unsigned short COLORMAX = 0xffff; /* * Initiate a CubeCap */ CubeaddonScreen::CubeCap::CubeCap () { mCurrent = 0; mLoaded = false; } /* * Attempt to load current cap image (if any) */ void CubeaddonScreen::CubeCap::load (bool scale, bool aspect, bool clamp) { /* we need to clear the texture, if no texture files are specified */ if (mFiles.empty ()) { mTexture.clear (); mLoaded = false; mCurrent = 0; return; } CompSize tSize; float xScale, yScale; CUBE_SCREEN (screen); mTexture.clear (); mLoaded = false; CompString imgName = mFiles[mCurrent].s (); CompString pname = "cubeaddon"; mTexture = GLTexture::readImageToTexture (imgName, pname, tSize); if (mTexture.empty ()) { compLogMessage ("cubeaddon", CompLogLevelWarn, "Failed to load slide: %s", mFiles[mCurrent].s ().c_str ()); return; } mLoaded = true; mTexMat.reset (); mTexMat[0] = mTexture[0]->matrix ().xx; mTexMat[1] = mTexture[0]->matrix ().yx; mTexMat[4] = mTexture[0]->matrix ().xy; mTexMat[5] = mTexture[0]->matrix ().yy; mTexMat[12] = mTexture[0]->matrix ().x0; mTexMat[13] = mTexture[0]->matrix ().y0; if (aspect) { if (scale) xScale = yScale = MIN (tSize.width (), tSize.height ()); else xScale = yScale = MAX (tSize.width (), tSize.height ()); } else { xScale = tSize.width (); yScale = tSize.height (); } mTexMat.translate (tSize.width () / 2.0, tSize.height () / 2.0, 0.0); mTexMat.scale (xScale / 2.0, yScale / 2.0, 1.0); if (scale) xScale = 1.0 / sqrtf (((cs->distance () * cs->distance ()) + 0.25)); else xScale = 1.0 / sqrtf (((cs->distance () * cs->distance ()) + 0.25) * 0.5); mTexMat.scale (xScale, xScale, 1.0); mTexture[0]->enable (GLTexture::Good); if (clamp) { if (GL::textureBorderClamp) { #ifndef USE_GLES /* FIXME: Simulate with shaders */ glTexParameteri (mTexture[0]->target (), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri (mTexture[0]->target (), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); #endif } else { glTexParameteri (mTexture[0]->target (), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (mTexture[0]->target (), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } } else { glTexParameteri (mTexture[0]->target (), GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (mTexture[0]->target (), GL_TEXTURE_WRAP_T, GL_REPEAT); } mTexture[0]->disable (); } /* Settings handling -------------------------------------------------------- */ /* * Switch cap, load it and damage screen if possible */ bool CubeaddonScreen::changeCap (bool top, int change) { CubeCap *cap = (top)? &mTopCap : &mBottomCap; int count = cap->mFiles.size (); /* mCurrent just changes in this case */ if (count && change) cap->mCurrent = (cap->mCurrent + change + count) % count; if (top) { cap->load (optionGetTopScale (), optionGetTopAspect (), optionGetTopClamp ()); } else { cap->load (optionGetBottomScale (), optionGetBottomAspect (), optionGetBottomClamp ()); cap->mTexMat.scale (1.0, -1.0, 1.0); } cScreen->damageScreen (); return false; } bool CubeaddonScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = CubeaddonOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case CubeaddonOptions::TopImages : mTopCap.mFiles = optionGetTopImages (); mTopCap.mCurrent = 0; changeCap (true, 0); break; case CubeaddonOptions::BottomImages : mBottomCap.mFiles = optionGetBottomImages (); mBottomCap.mCurrent = 0; changeCap (false, 0); break; case CubeaddonOptions::TopScale : case CubeaddonOptions::TopAspect : case CubeaddonOptions::TopClamp : changeCap (true, 0); break; case CubeaddonOptions::BottomScale : case CubeaddonOptions::BottomAspect : case CubeaddonOptions::BottomClamp : changeCap (false, 0); break; default: break; } return rv; } void CubeaddonScreen::drawBasicGround () { glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); float i = optionGetIntensity () * 2; GLMatrix transform; transform.translate (0.0f, 0.0f, -DEFAULT_Z_CAMERA); GLfloat ground1Vertices[] = { -0.5, -0.5, 0.0, 0.5, -0.5, 0.0, -0.5, 0.0, 0.0, 0.5, 0.0, 0.0 }; unsigned short maxG1Color = MAX (0.0f, 1.0f - i) * 65535; unsigned short minG1Color = MIN (1.0, 1.0 - (i - 1.0)) * 65535; GLushort ground1Colors[] = { 0, 0, 0, maxG1Color, 0, 0, 0, maxG1Color, 0, 0, 0, minG1Color, 0, 0, 0, minG1Color }; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addVertices (4, ground1Vertices); streamingBuffer->addColors (4, ground1Colors); if (streamingBuffer->end ()) streamingBuffer->render (transform); if (optionGetGroundSize () > 0.0) { GLfloat ground2Vertices[] = { -0.5, -0.5, 0.0, 0.5, -0.5, 0.0, -0.5, static_cast (-0.5 + optionGetGroundSize ()), 0.0, 0.5, static_cast (-0.5 + optionGetGroundSize ()), 0.0 }; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, optionGetGroundColor1 ()); streamingBuffer->addColors (1, optionGetGroundColor1 ()); streamingBuffer->addColors (1, optionGetGroundColor2 ()); streamingBuffer->addColors (1, optionGetGroundColor2 ()); streamingBuffer->addVertices (4, ground2Vertices); if (streamingBuffer->end ()) streamingBuffer->render (transform); } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_BLEND); } bool CubeaddonScreen::cubeCheckOrientation (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, std::vector &points) { bool status = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, points); if (mReflection) return !status; return status; } void CubeaddonScreen::cubeGetRotation (float &x, float &v, float &progress) { cubeScreen->cubeGetRotation (x, v, progress); if (optionGetMode () == ModeAbove && v > 0.0 && mReflection) { mVRot = v; v = 0.0; } else mVRot = 0.0; } void CubeaddonScreen::cubeClearTargetOutput (float xRotate, float vRotate) { if (mReflection) glCullFace (GL_BACK); cubeScreen->cubeClearTargetOutput (xRotate, mBackVRotate); if (mReflection) glCullFace (GL_FRONT); } bool CubeaddonScreen::cubeShouldPaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, PaintOrder order) { bool rv = cubeScreen->cubeShouldPaintViewport (sAttrib, transform, output, order); if (rv || cubeScreen->unfolded ()) return rv; if (mDeform > 0.0 && optionGetDeformation () == DeformationCylinder) { float z[3]; z[0] = cubeScreen->invert () * cubeScreen->distance (); z[1] = z[0] + (0.25 / cubeScreen->distance ()); z[2] = cubeScreen->invert () * sqrtf (0.25 + (cubeScreen->distance () * cubeScreen->distance ())); std::vector vPoints[3]; vPoints[0].push_back (GLVector (-0.5, 0.0, z[0], 1.0)); vPoints[0].push_back (GLVector ( 0.0, 0.5, z[1], 1.0)); vPoints[0].push_back (GLVector ( 0.0, 0.0, z[1], 1.0)); vPoints[1].push_back (GLVector ( 0.5, 0.0, z[0], 1.0)); vPoints[1].push_back (GLVector ( 0.0, -0.5, z[1], 1.0)); vPoints[1].push_back (GLVector ( 0.0, 0.0, z[1], 1.0)); vPoints[2].push_back (GLVector (-0.5, 0.0, z[2], 1.0)); vPoints[2].push_back (GLVector ( 0.0, 0.5, z[2], 1.0)); vPoints[2].push_back (GLVector ( 0.0, 0.0, z[2], 1.0)); bool ftb1 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[0]); bool ftb2 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[1]); bool ftb3 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[2]); rv = (order == FTB && (ftb1 || ftb2 || ftb3)) || (order == BTF && (!ftb1 || !ftb2 || !ftb3)); } else if (mDeform > 0.0 && optionGetDeformation () == DeformationSphere) { float z[4]; z[0] = sqrtf (0.5 + (cubeScreen->distance () * cubeScreen->distance ())); z[1] = z[0] + (0.25 / cubeScreen->distance ()); z[2] = sqrtf (0.25 + (cubeScreen->distance () * cubeScreen->distance ())); z[3] = z[2] + 0.5; std::vector vPoints[4]; vPoints[0].push_back (GLVector ( 0.0, 0.0, z[3], 1.0)); vPoints[0].push_back (GLVector (-0.5, 0.5, z[2], 1.0)); vPoints[0].push_back (GLVector ( 0.0, 0.5, z[2], 1.0)); vPoints[1].push_back (GLVector ( 0.0, 0.0, z[3], 1.0)); vPoints[1].push_back (GLVector ( 0.5, -0.5, z[2], 1.0)); vPoints[1].push_back (GLVector ( 0.0, -0.5, z[2], 1.0)); vPoints[2].push_back (GLVector ( 0.0, 0.0, z[1], 1.0)); vPoints[2].push_back (GLVector (-0.5, -0.5, z[0], 1.0)); vPoints[2].push_back (GLVector (-0.5, 0.0, z[0], 1.0)); vPoints[3].push_back (GLVector ( 0.0, 0.0, z[1], 1.0)); vPoints[3].push_back (GLVector ( 0.5, 0.5, z[0], 1.0)); vPoints[3].push_back (GLVector ( 0.5, 0.0, z[0], 1.0)); bool ftb1 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[0]); bool ftb2 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[1]); bool ftb3 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[2]); bool ftb4 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[3]); rv = (order == FTB && (ftb1 || ftb2 || ftb3 || ftb4)) || (order == BTF && (!ftb1 || !ftb2 || !ftb3 || !ftb4)); } return rv; } void CubeaddonScreen::paintCap (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, bool top, bool adjust) { GLScreenPaintAttrib sa; GLMatrix sTransform; int cullNorm, cullInv; bool wasCulled = glIsEnabled (GL_CULL_FACE); float cInv = (top) ? 1.0: -1.0; CubeCap *cap; bool cAspect; unsigned short *color; glGetIntegerv (GL_CULL_FACE_MODE, &cullNorm); cullInv = (cullNorm == GL_BACK)? GL_FRONT : GL_BACK; if (top) color = cubeScreen->topColor (); else color = cubeScreen->bottomColor (); int opacity = cubeScreen->desktopOpacity () * color[3] / 0xffff; glEnable (GL_BLEND); if (top) { cap = &mTopCap; cAspect = optionGetTopAspect (); } else { cap = &mBottomCap; cAspect = optionGetBottomAspect (); } glEnable(GL_CULL_FACE); for (int l = 0; l < ((cubeScreen->invert () == 1) ? 2 : 1); l++) { glCullFace(((l == 1) ^ top) ? cullInv : cullNorm); for (int i = 0; i < size; i++) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_TRIANGLE_FAN); if (optionGetDeformation () == DeformationSphere && optionGetDeformCaps ()) { streamingBuffer->addNormals (CAP_NVERTEX / 3, (l == 0) ? mCapFill : mCapFillNorm); } else { GLfloat nonDeformNormals[] = { 0.0f, (l == 0) ? 1.0f : -1.0f, 0.0f }; streamingBuffer->addNormals (1, nonDeformNormals); } sa = sAttrib; sTransform = transform; if (cubeScreen->invert () == 1) { sa.yRotate += (360.0f / size) * cubeScreen->xRotations (); if (!adjust) sa.yRotate -= (360.0f / size) * screen->vp ().x (); } else { sa.yRotate += 180.0f; sa.yRotate -= (360.0f / size) * cubeScreen->xRotations (); if (!adjust) sa.yRotate += (360.0f / size) * screen->vp ().x (); } sa.yRotate += (360.0f / size) * i; gScreen->glApplyTransform (sa, output, &sTransform); GLMatrix cTransform (sTransform); cTransform.translate (cubeScreen->outputXOffset (), -cubeScreen->outputYOffset (), 0.0f); cTransform.scale (cubeScreen->outputXScale (), cubeScreen->outputYScale (), 1.0f); cTransform.scale (1.0, cInv, 1.0); float normalizedOpacity = opacity / static_cast (OPAQUE); float premultColors[] = { (color[0] / OPAQUE) * normalizedOpacity, (color[1] / OPAQUE) * normalizedOpacity, (color[2] / OPAQUE) * normalizedOpacity }; streamingBuffer->color4f (premultColors[0], premultColors[1], premultColors[2], normalizedOpacity); streamingBuffer->addVertices (CAP_ELEMENTS + 2, mCapFill); if (streamingBuffer->end ()) streamingBuffer->render (cTransform); if (optionGetDeformation () == DeformationSphere && optionGetDeformCaps ()) { #ifndef USE_GLES streamingBuffer->begin (GL_QUADS); streamingBuffer->color4f (premultColors[0], premultColors[1], premultColors[2], normalizedOpacity); streamingBuffer->addNormals (CAP_NVERTEX / 3, (l == 0) ? mCapFill : mCapFillNorm); GLushort *idx = mCapFillIdx; GLfloat capVertices[CAP_NIDX * 3]; GLfloat *capVerticesPtr = capVertices; for (unsigned int i = 0; i < CAP_NIDX; ++i) { unsigned int vertexIndex = idx[i] * 3; *(capVerticesPtr++) = (mCapFill[vertexIndex]); *(capVerticesPtr++) = (mCapFill[vertexIndex + 1]); *(capVerticesPtr++) = (mCapFill[vertexIndex + 2]); } streamingBuffer->addVertices (CAP_NIDX, &capVertices[0]); if (streamingBuffer->end ()) streamingBuffer->render (cTransform); #endif } if (cap->mLoaded) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLMatrix texMat = cap->mTexMat; if (cubeScreen->invert () != 1) texMat.scale (-1.0, 1.0, 1.0); streamingBuffer->begin (GL_TRIANGLE_FAN); float normalizedOpacity = cubeScreen->desktopOpacity () / OPAQUE; streamingBuffer->color4f (normalizedOpacity, normalizedOpacity, normalizedOpacity, normalizedOpacity); cap->mTexture[0]->enable (GLTexture::Good); if (cAspect) { float scale, xScale = 1.0, yScale = 1.0; scale = (float)output->width () / (float)output->height (); if (output->width () > output->height ()) { xScale = 1.0; yScale = 1.0 / scale; } else { xScale = scale; yScale = 1.0; } if (optionGetTopScale ()) { scale = xScale; xScale = 1.0 / yScale; yScale = 1.0 / scale; } texMat.scale (xScale, yScale, 1.0); } texMat.rotate (-(360.0f / size) * i, 0.0, 0.0, 1.0); GLVector sGen (texMat[0], texMat[8], texMat[4], texMat[12]); GLVector tGen (texMat[1], texMat[9], texMat[5], texMat[13]); /* Generate texCoords for the top section of the * cap */ GLfloat texCoords[(CAP_ELEMENTS + 2) * 2]; GLfloat *texCoordsPtr = texCoords; for (unsigned int i = 0; i < CAP_ELEMENTS + 2; i++) { GLVector v (mCapFill[i * 3], mCapFill[i * 3 + 1], mCapFill[i * 3 + 2], 1.0f); float s = v * sGen; float t = v * tGen; *(texCoordsPtr++) = s; *(texCoordsPtr++) = t; } streamingBuffer->addTexCoords (0, CAP_NVERTEX / 3, &texCoords[0]); streamingBuffer->addVertices (CAP_NVERTEX / 3, mCapFill); streamingBuffer->setMaxVertices (CAP_ELEMENTS + 2); if (streamingBuffer->end ()) streamingBuffer->render (cTransform); if (optionGetDeformation () == DeformationSphere && optionGetDeformCaps ()) { #ifndef USE_GLES streamingBuffer->begin (GL_QUADS); streamingBuffer->color4f (normalizedOpacity, normalizedOpacity, normalizedOpacity, normalizedOpacity); streamingBuffer->addNormals (CAP_NVERTEX / 3, (l == 0) ? mCapFill : mCapFillNorm); /* Generate texCoords and vertices for the * curvature around the top section of the cap * * This is a little more inefficient than it should be. * * The previous implementation used glDrawElements with * and IBO to ensure that we didn't send lots of redundant * geometry to the GPU, however GLVertexBuffer doesn't have * any concept of indexed rendering, and instead takes a vertex * buffer with all the geometry. * * FIXME: This code uses GL_QUADS, so its not compatible with * OpenGL|ES at the moment */ GLushort *idx = mCapFillIdx; GLfloat capVertices[CAP_NIDX * 3]; GLfloat texCoords[CAP_NIDX * 2]; GLfloat *capVerticesPtr = capVertices; GLfloat *texCoordsPtr = texCoords; for (unsigned int i = 0; i < CAP_NIDX; ++i) { unsigned int vertexIndex = idx[i] * 3; GLVector v (mCapFill[vertexIndex], mCapFill[vertexIndex + 1], mCapFill[vertexIndex + 2], 1.0f); *(capVerticesPtr++) = v[GLVector::x]; *(capVerticesPtr++) = v[GLVector::y]; *(capVerticesPtr++) = v[GLVector::z]; /* GL_OBJECT_LINEAR is simulated by doing: * texCoord.s = dot (vec4 (obj, 1.0), sGenPlane) * texCoord.t = dot (vec4 (obj, 1.0), tGenPlane) */ float s = v * sGen; float t = v * tGen; *(texCoordsPtr++) = s; *(texCoordsPtr++) = t; } streamingBuffer->addVertices (CAP_NIDX, &capVertices[0]); streamingBuffer->addTexCoords (0, CAP_NIDX, &texCoords[0]); if (streamingBuffer->end ()) streamingBuffer->render (cTransform); #endif } cap->mTexture[0]->disable (); } } } glDisable (GL_BLEND); glCullFace (cullNorm); if (!wasCulled) glDisable (GL_CULL_FACE); } void CubeaddonScreen::cubePaintTop (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) { /* we do not want to draw anything if this option is disabled */ if (!optionGetDrawTop ()) return; if (((!optionGetDrawBottom () && cubeScreen->invert () == -1) || (!optionGetDrawTop () && cubeScreen->invert () == 1)) && /* the original top cap will work for the non-deformed cube only */ (optionGetDeformation () == DeformationNone)) cubeScreen->cubePaintTop (sAttrib, transform, output, size, normal); else paintCap (sAttrib, transform, output, size, true, optionGetAdjustTop ()); } void CubeaddonScreen::cubePaintBottom (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) { /* we do not want to draw anything if this option is disabled */ if (!optionGetDrawBottom ()) return; if (((!optionGetDrawBottom () && cubeScreen->invert () == 1) || (!optionGetDrawTop () && cubeScreen->invert () == -1)) && /* the original bottom cap will work for the non-deformed cube only */ (optionGetDeformation () == DeformationNone)) cubeScreen->cubePaintBottom (sAttrib, transform, output, size, normal); else paintCap (sAttrib, transform, output, size, false, optionGetAdjustBottom ()); } void CubeaddonWindow::glAddGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { if (caScreen->mDeform > 0.0) { GLVertexBuffer *vb = gWindow->vertexBuffer (); int i, oldVCount = vb->countVertices (); GLfloat *v; int offX = 0, offY = 0; int sx1, sx2, sw, sy1, sy2, sh; float radSquare, last[2][4]; float inv = (cubeScreen->invert () == 1) ? 1.0 : -1.0; float ang, sx1g, sx2g, sy1g, sy2g; CubeScreen::MultioutputMode cMOM = cubeScreen->multioutputMode (); int caD = caScreen->optionGetDeformation (); float cDist = cubeScreen->distance (); if (caD == CubeaddonScreen::DeformationCylinder || cubeScreen->unfolded ()) { radSquare = (cDist * cDist) + 0.25; } else { maxGridHeight = MIN (CUBEADDON_GRID_SIZE, maxGridHeight); radSquare = (cDist * cDist) + 0.5; } gWindow->glAddGeometry (matrix, region, clip, MIN (CUBEADDON_GRID_SIZE, maxGridWidth), maxGridHeight); vb = gWindow->vertexBuffer (); v = vb->getVertices (); v += vb->getVertexStride () - 3; v += vb->getVertexStride () * oldVCount; if (!window->onAllViewports ()) { CompPoint offset = caScreen->cScreen->windowPaintOffset (); offset = window->getMovementForOffset (offset); offX = offset.x (); offY = offset.y (); } if (cMOM == CubeScreen::OneBigCube) { sx1 = 0; sx2 = screen->width (); sw = screen->width (); sy1 = 0; sy2 = screen->height (); sh = screen->height (); } else if (cMOM == CubeScreen::MultipleCubes) { sx1 = caScreen->mLast->x1 (); sx2 = caScreen->mLast->x2 (); sw = sx2 - sx1; sy1 = caScreen->mLast->y1 (); sy2 = caScreen->mLast->y2 (); sh = sy2 - sy1; } else { if (cubeScreen->nOutput () != (int) screen->outputDevs ().size ()) { sx1 = 0; sx2 = screen->width (); sw = screen->width (); sy1 = 0; sy2 = screen->height (); sh = screen->height (); } else { sx1 = screen->outputDevs ()[cubeScreen->sourceOutput ()].x1 (); sx2 = screen->outputDevs ()[cubeScreen->sourceOutput ()].x2 (); sw = sx2 - sx1; sy1 = screen->outputDevs ()[cubeScreen->sourceOutput ()].y1 (); sy2 = screen->outputDevs ()[cubeScreen->sourceOutput ()].y2 (); sh = sy2 - sy1; } } sx1g = sx1 - CUBEADDON_GRID_SIZE; sx2g = sx2 + CUBEADDON_GRID_SIZE; sy1g = sy1 - CUBEADDON_GRID_SIZE; sy2g = sy2 + CUBEADDON_GRID_SIZE; if (caD == CubeaddonScreen::DeformationCylinder || cubeScreen->unfolded ()) { float lastX = std::numeric_limits ::min (), lastZ = 0.0; for (i = oldVCount; i < vb->countVertices (); i++) { if (v[0] == lastX) { v[2] = lastZ; } else if (v[0] + offX >= sx1g && v[0] + offY < sx2g) { ang = (((v[0] + offX - sx1) / (float)sw) - 0.5); ang *= ang; if (ang < radSquare) { v[2] = sqrtf (radSquare - ang) - cDist; v[2] *= caScreen->mDeform * inv; } } lastX = v[0]; lastZ = v[2]; v += vb->getVertexStride (); } } else { last[0][0] = -1000000000.0; last[1][0] = -1000000000.0; int cLast = 0; for (i = oldVCount; i < vb->countVertices (); i++) { if (last[0][0] == v[0] && last[0][1] == v[1]) { v[0] = last[0][2]; v[2] = last[0][3]; v += vb->getVertexStride (); continue; } else if (last[1][0] == v[0] && last[1][1] == v[1]) { v[0] = last[1][2]; v[2] = last[1][3]; v += vb->getVertexStride (); continue; } float vpx = v[0] + offX; float vpy = v[1] + offY; if (vpx >= sx1g && vpx < sx2g && vpy >= sy1g && vpy < sy2g) { last[cLast][0] = v[0]; last[cLast][1] = v[1]; float a1 = (((vpx - sx1) / (float)sw) - 0.5); float a2 = (((vpy - sy1) / (float)sh) - 0.5); a2 *= a2; ang = atanf (a1 / cDist); a2 = sqrtf (radSquare - a2); int iang = (((int)(ang * RAD2I1024)) + 1024) & 0x3ff; v[2] += ((caScreen->mCosT [iang] * a2) - cDist) * caScreen->mDeform * inv; v[0] += ((caScreen->mSinT [iang] * a2) - a1) * sw * caScreen->mDeform; last[cLast][2] = v[0]; last[cLast][3] = v[2]; cLast = (cLast + 1) & 1; } v += vb->getVertexStride (); } } } else { gWindow->glAddGeometry (matrix, region, clip, maxGridWidth, maxGridHeight); } } bool CubeaddonWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK) && caScreen->mDeform) { CompPoint offset; if (!window->onAllViewports ()) { offset = caScreen->cScreen->windowPaintOffset (); offset = window->getMovementForOffset (offset); } int x1 = window->x () - window->output ().left + offset.x (); int x2 = window->x () + window->width () + window->output ().right + offset.x (); if (x1 < 0 && x2 < 0) return false; if (x1 > screen->width () && x2 > screen->width ()) return false; } return gWindow->glDraw (transform, attrib, region, mask); } void CubeaddonWindow::glDrawTexture (GLTexture *texture, const GLMatrix &matrix, const GLWindowPaintAttrib &attrib, unsigned int mask) { if (caScreen->mDeform > 0.0 && caScreen->gScreen->lighting ()) { int i; int sx1, sx2, sw, sy1, sy2, sh; int offX = 0, offY = 0; float x, y; GLfloat *v, *n; GLVertexBuffer *vb = gWindow->vertexBuffer (); CubeScreen::MultioutputMode cMOM = cubeScreen->multioutputMode (); float cDist = cubeScreen->distance (); float inv = (cubeScreen->invert () == 1) ? 1.0: -1.0; float ym = (caScreen->optionGetDeformation () == CubeaddonScreen::DeformationCylinder) ? 0.0 : 1.0; int vertexCount = vb->countVertices (); if ((int) caScreen->mWinNormSize < vertexCount * 3) { delete [] caScreen->mWinNormals; caScreen->mWinNormals = new GLfloat[vertexCount * 3]; caScreen->mWinNormSize = vertexCount * 3; } if (!window->onAllViewports ()) { CompPoint offset = caScreen->cScreen->windowPaintOffset (); offset = window->getMovementForOffset (offset); offX = offset.x (); offY = offset.y (); } if (cMOM == CubeScreen::OneBigCube) { sx1 = 0; sx2 = screen->width (); sw = screen->width (); sy1 = 0; sy2 = screen->height (); sh = screen->height (); } else if (cMOM == CubeScreen::MultipleCubes) { sx1 = caScreen->mLast->x1 (); sx2 = caScreen->mLast->x2 (); sw = sx2 - sx1; sy1 = caScreen->mLast->y1 (); sy2 = caScreen->mLast->y2 (); sh = sy2 - sy1; } else { if (cubeScreen->nOutput () != (int) screen->outputDevs ().size ()) { sx1 = 0; sx2 = screen->width (); sw = screen->width (); sy1 = 0; sy2 = screen->height (); sh = screen->height (); } else { sx1 = screen->outputDevs ()[cubeScreen->sourceOutput ()].x1 (); sx2 = screen->outputDevs ()[cubeScreen->sourceOutput ()].x2 (); sw = sx2 - sx1; sy1 = screen->outputDevs ()[cubeScreen->sourceOutput ()].y1 (); sy2 = screen->outputDevs ()[cubeScreen->sourceOutput ()].y2 (); sh = sy2 - sy1; } } v = vb->getVertices () + (vb->getVertexStride () - 3); n = caScreen->mWinNormals; if (cubeScreen->paintOrder () == FTB) { for (i = 0; i < vertexCount; i++) { x = (((v[0] + offX - sx1) / (float)sw) - 0.5); y = (((v[1] + offY - sy1) / (float)sh) - 0.5); *(n)++ = x / sw * caScreen->mDeform; *(n)++ = y / sh * caScreen->mDeform * ym; *(n)++ = v[2] + cDist; v += vb->getVertexStride (); } } else { for (i = 0; i < vertexCount; i++) { x = (((v[0] + offX - sx1) / (float)sw) - 0.5); y = (((v[1] + offY - sy1) / (float)sh) - 0.5); *(n)++ = -x / sw * caScreen->mDeform * inv; *(n)++ = -y / sh * caScreen->mDeform * ym * inv; *(n)++ = -(v[2] + cDist); v += vb->getVertexStride (); } } vb->addNormals (caScreen->mWinNormSize / 3, caScreen->mWinNormals); gWindow->glDrawTexture (texture, matrix, attrib, mask); return; } gWindow->glDrawTexture (texture, matrix, attrib, mask); } bool CubeaddonScreen::cubeShouldPaintAllViewports () { bool status = cubeScreen->cubeShouldPaintAllViewports (); return (!optionGetDrawTop () || !optionGetDrawBottom () || (mDeform > 0.0) || status); } void CubeaddonScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { GLMatrix sTransform = transform; float cDist = cubeScreen->distance (); float cDist2 = cubeScreen->distance () * cubeScreen->distance (); if (optionGetDeformation () != DeformationNone && screen->vpSize ().width () * cubeScreen->nOutput () > 2 && screen->desktopWindowCount () && (cubeScreen->rotationState () == CubeScreen::RotationManual || (cubeScreen->rotationState () == CubeScreen::RotationChange && !optionGetCylinderManualOnly ()) || mWasDeformed) && (!cubeScreen->unfolded () || optionGetUnfoldDeformation ())) { float x, progress; cubeScreen->cubeGetRotation (x, x, progress); mDeform = progress; if (optionGetSphereAspect () > 0.0 && cubeScreen->invert () == 1 && optionGetDeformation () == DeformationSphere) { float scale, val = optionGetSphereAspect () * mDeform; if (output->width () > output->height ()) { scale = (float)output->height () / (float)output->width (); scale = (scale * val) + 1.0 - val; sTransform.scale (scale, 1.0, 1.0); } else { scale = (float)output->width () / (float)output->height (); scale = (scale * val) + 1.0 - val; sTransform.scale (1.0, scale, 1.0); } } } else { mDeform = 0.0; } cubeScreen->cubeShouldPaintAllViewportsSetEnabled (this, true); if (mCapDistance != cDist) { changeCap (true, 0); changeCap (false, 0); } if (mDeform != mCapDeform || mCapDistance != cDist || mCapDeformType != optionGetDeformation ()) { float *quad; int j; float rS, r, x, y, z; if (optionGetDeformation () != DeformationSphere || !optionGetDeformCaps ()) { rS = cDist2 + 0.5; mCapFill[0] = 0.0; mCapFill[1] = 0.5; mCapFill[2] = 0.0; mCapFillNorm[0] = 0.0; mCapFillNorm[1] = -1.0; mCapFillNorm[2] = 0.0; z = cDist; r = 0.25 + cDist2; for (j = 0; j <= CAP_ELEMENTS; j++) { x = -0.5 + ((float)j / (float)CAP_ELEMENTS); z = ((sqrtf(r - (x * x)) - cDist) * mDeform) + cDist; y = 0.5; quad = &mCapFill[(1 + j) * 3]; quad[0] = x; quad[1] = y; quad[2] = z; quad = &mCapFillNorm[(1 + j) * 3]; quad[0] = -x; quad[1] = -y; quad[2] = -z; } } else { float w; rS = cDist2 + 0.5; mCapFill[0] = 0.0; mCapFill[1] = ((sqrtf (rS) - 0.5) * mDeform) + 0.5; mCapFill[2] = 0.0; mCapFillNorm[0] = 0.0; mCapFillNorm[1] = -1.0; mCapFillNorm[2] = 0.0; for (int i = 0; i < CAP_ELEMENTS; i++) { w = (float)(i + 1) / (float)CAP_ELEMENTS; r = (((w / 2.0) * (w / 2.0)) + (cDist2 * w * w)); for (j = 0; j <= CAP_ELEMENTS; j++) { x = - (w / 2.0) + ((float)j * w / (float)CAP_ELEMENTS); z = ((sqrtf(r - (x * x)) - (cDist * w)) * mDeform) + (cDist * w); y = ((sqrtf(rS - (x * x) - (r - (x * x))) - 0.5) * mDeform) + 0.5; quad = &mCapFill[(1 + (i * (CAP_ELEMENTS + 1)) + j) * 3]; quad[0] = x; quad[1] = y; quad[2] = z; quad = &mCapFillNorm[(1 + (i * (CAP_ELEMENTS + 1)) + j) * 3]; quad[0] = -x; quad[1] = -y; quad[2] = -z; } } } mCapDeform = mDeform; mCapDistance = cDist; mCapDeformType = optionGetDeformation (); } if (cubeScreen->invert () == 1 && mFirst && optionGetReflection ()) { mFirst = false; mReflection = true; if (screen->grabExist ("cube")) { GLMatrix rTransform = sTransform; rTransform.translate (0.0, -1.0, 0.0); rTransform.scale (1.0, -1.0, 1.0); glCullFace (GL_FRONT); gScreen->glPaintTransformedOutput (sAttrib, rTransform, region, output, mask); glCullFace (GL_BACK); drawBasicGround (); } else { GLMatrix rTransform = sTransform; GLMatrix pTransform; float angle = 360.0 / ((float) screen->vpSize ().width () * cubeScreen->nOutput ()); float xRot, vRot, xRotate, xRotate2, vRotate, p; float rYTrans; GLVector point (-0.5, -0.5, cDist, 1.0); GLVector point2 (-0.5, 0.5, cDist, 1.0); float deform = 0.0f; cubeScreen->cubeGetRotation (xRot, vRot, p); mBackVRotate = 0.0; xRotate = xRot; xRotate2 = xRot; vRotate = vRot; if (vRotate < 0.0) xRotate += 180; vRotate = fmod (fabs (vRotate), 180.0); xRotate = fmod (fabs (xRotate), angle); xRotate2 = fmod (fabs (xRotate2), angle); if (vRotate >= 90.0) vRotate = 180.0 - vRotate; if (xRotate >= angle / 2.0) xRotate = angle - xRotate; if (xRotate2 >= angle / 2.0) xRotate2 = angle - xRotate2; xRotate = (mDeform * angle * 0.5) + ((1.0 - mDeform) * xRotate); xRotate2 = (mDeform * angle * 0.5) + ((1.0 - mDeform) * xRotate2); pTransform.reset (); pTransform.rotate (xRotate, 0.0f, 1.0f, 0.0f); pTransform.rotate (vRotate, cosf (xRotate * (M_PI / 180.0f)), 0.0f, sinf (xRotate * (M_PI / 180.0f))); point = pTransform * point; pTransform.reset (); pTransform.rotate (xRotate2, 0.0f, 1.0f, 0.0f); pTransform.rotate (vRotate, cosf (xRotate2 * (M_PI / 180.0f)), 0.0f, sinf (xRotate2 * (M_PI / 180.0f))); point2 = pTransform * point2; switch (optionGetMode ()) { case ModeJumpyReflection: mYTrans = 0.0; if (optionGetDeformation () == DeformationSphere && optionGetDeformCaps () && optionGetDrawBottom ()) rYTrans = sqrt (0.5 + cDist2) * -2.0; else rYTrans = point[1] * 2.0; break; case ModeDistance: mYTrans = 0.0; rYTrans = sqrt (0.5 + cDist2) * -2.0; break; default: if (optionGetDeformation () == DeformationSphere && optionGetDeformCaps () && optionGetDrawBottom ()) { mYTrans = mCapFill[1] - 0.5; rYTrans = -mCapFill[1] - 0.5; } else if (optionGetDeformation () == DeformationSphere && vRotate > atan (cDist * 2) / (M_PI / 180.0f)) { mYTrans = sqrt (0.5 + cDist2) - 0.5; rYTrans = -sqrt (0.5 + cDist2) - 0.5; } else { mYTrans = -point[1] - 0.5; rYTrans = point[1] - 0.5; } break; } if (!optionGetAutoZoom () || ((cubeScreen->rotationState () != CubeScreen::RotationManual) && optionGetZoomManualOnly ())) mZTrans = 0.0; else mZTrans = -point2[2] + cDist; if (optionGetMode () == ModeAbove) mZTrans = 0.0; if (optionGetDeformation () == DeformationCylinder) deform = (sqrt (0.25 + cDist2) - cDist) * -mDeform; else if (optionGetDeformation () == DeformationSphere) deform = (sqrt (0.5 + cDist2) - cDist) * -mDeform; if (mDeform > 0.0) mZTrans = deform; if (optionGetMode () == ModeAbove && mVRot > 0.0) { mBackVRotate = mVRot; if (optionGetDeformation () == DeformationSphere && optionGetDeformCaps () && optionGetDrawBottom ()) { mYTrans = mCapFill[1] - 0.5; rYTrans = -mCapFill[1] - 0.5; } else { mYTrans = 0.0; rYTrans = -1.0; } pTransform.reset (); gScreen->glApplyTransform (sAttrib, output, &pTransform); point = GLVector (0.0, 0.0, -cDist + deform, 1.0); point = pTransform * point; rTransform.translate (0.0, 0.0, point[2]); rTransform.rotate (mVRot, 1.0, 0.0, 0.0); rTransform.scale (1.0, -1.0, 1.0); rTransform.translate (0.0, -rYTrans, -point[2] + mZTrans); } else { rTransform.translate (0.0, rYTrans, mZTrans); rTransform.scale (1.0, -1.0, 1.0); } glCullFace (GL_FRONT); gScreen->glPaintTransformedOutput (sAttrib, rTransform, region, output, mask); glCullFace (GL_BACK); if (optionGetMode () == ModeAbove && mVRot > 0.0) { float v = MIN (1.0, mVRot / 30.0); unsigned short col1[4], col2[4]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLMatrix gTransform; glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); gTransform.translate (0, 0, -DEFAULT_Z_CAMERA); float i = optionGetIntensity () * 2; float c = optionGetIntensity (); GLfloat vertices[] = { 0.5f, v / 2.0f, 0.0f, -0.5f, v / 2.0f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f }; unsigned short cMax = MAX (0.0, 1.0 - i) + (v * c); unsigned short cMin = MIN (1.0, 1.0 - (i - 1.0)) + (v * c); GLushort colors[] = { 0, 0, 0, cMax, 0, 0, 0, cMax, 0, 0, 0, cMin, 0, 0, 0, cMin }; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (4, colors); streamingBuffer->addVertices (4, vertices); if (streamingBuffer->end ()) streamingBuffer->render (gTransform); for (int j = 0; j < 4; j++) { col1[j] = (1.0 - v) * optionGetGroundColor1 () [j] + (v * (optionGetGroundColor1 () [j] + optionGetGroundColor2 () [j]) * 0.5); col2[j] = (1.0 - v) * optionGetGroundColor2 () [j] + (v * (optionGetGroundColor1 () [j] + optionGetGroundColor2 () [j]) * 0.5); } if (optionGetGroundSize () > 0.0) { GLfloat vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.5f, -0.5f + static_cast (((1 - v) * optionGetGroundSize ()) + v), -0.5f, -0.5f + static_cast (((1 - v) * optionGetGroundSize ()) + v) }; GLushort colors[] = { col1[0], col1[1], col1[2], col1[3], col1[0], col1[1], col1[2], col1[3], col2[0], col2[1], col2[2], col2[3], col2[0], col2[1], col2[2], col2[3] }; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addVertices (4, vertices); streamingBuffer->addColors (4, colors); if (streamingBuffer->end ()) streamingBuffer->render (gTransform); } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_BLEND); } else drawBasicGround (); } cubeScreen->repaintCaps (); mReflection = false; } else cubeScreen->cubeShouldPaintAllViewportsSetEnabled (this, false); if (!optionGetReflection ()) { mYTrans = 0.0; mZTrans = (sqrt (0.25 + cDist2) - cDist) * -mDeform; } sTransform.translate (0.0, mYTrans, mZTrans); gScreen->glPaintTransformedOutput (sAttrib, sTransform, region, output, mask); } bool CubeaddonScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (mLast != output) mFirst = true; mLast = output; return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } void CubeaddonScreen::donePaint () { mFirst = true; mYTrans = 0.0; mZTrans = 0.0; mWasDeformed = (mDeform > 0.0); if (mDeform > 0.0 && mDeform < 1.0) { cScreen->damageScreen (); mDeform = 0.0; } cScreen->donePaint (); } CubeaddonScreen::CubeaddonScreen (CompScreen *s) : PluginClassHandler (s), CubeaddonOptions (), cScreen (CompositeScreen::get (s)), gScreen (GLScreen::get (s)), cubeScreen (CubeScreen::get (s)), mReflection (false), mFirst (true), mLast (0), mYTrans (0.0), mZTrans (0.0), mDeform (0.0), mWinNormals (0), mWinNormSize (0), mCapDeform (-1.0), mCapDistance (cubeScreen->distance ()) { GLushort *idx; idx = mCapFillIdx; for (int i = 0; i < CAP_ELEMENTS - 1; i++) for (int j = 0; j < CAP_ELEMENTS; j++) { idx[0] = 1 + (i * (CAP_ELEMENTS + 1)) + j; idx[1] = 1 + ((i + 1) * (CAP_ELEMENTS + 1)) + j; idx[2] = 2 + ((i + 1) * (CAP_ELEMENTS + 1)) + j; idx[3] = 2 + (i * (CAP_ELEMENTS + 1)) + j; idx += 4; } mTopCap.mFiles = optionGetTopImages (); mBottomCap.mFiles = optionGetBottomImages (); for (int i = 0; i < 1024; i++) { mSinT[i] = sinf(i / RAD2I1024); mCosT[i] = cosf(i / RAD2I1024); } changeCap (true, 0); changeCap (false, 0); #define BIND_ACTION(opt, t, d) \ optionSet##opt##Initiate (boost::bind (&CubeaddonScreen::changeCap, this, t, d)) BIND_ACTION (TopNextKey, true, 1); BIND_ACTION (TopPrevKey, true, -1); BIND_ACTION (BottomNextKey, false, 1); BIND_ACTION (BottomNextKey, false, -1); BIND_ACTION (TopNextButton, true, 1); BIND_ACTION (TopPrevButton, true, -1); BIND_ACTION (BottomNextButton, false, 1); BIND_ACTION (BottomNextButton, false, -1); #undef BIND_ACTION CompositeScreenInterface::setHandler (cScreen, true); GLScreenInterface::setHandler (gScreen, true); CubeScreenInterface::setHandler (cubeScreen, true); } CubeaddonScreen::~CubeaddonScreen () { if (mWinNormals) delete [] mWinNormals; } CubeaddonWindow::CubeaddonWindow (CompWindow *w) : PluginClassHandler (w), window (w), gWindow (GLWindow::get (w)), caScreen (CubeaddonScreen::get (screen)), cubeScreen (CubeScreen::get (screen)) { GLWindowInterface::setHandler (gWindow, true); } bool CubeaddonPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("cube", COMPIZ_CUBE_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/cubeaddon/cubeaddon.xml.in0000644000015301777760000002271012321343002024154 0ustar pbusernogroup00000000000000 <_short>Cube Reflection and Deformation <_long>Adds a reflection to the desktop cube and deformes it to a cylinder or sphere Effects composite opengl cube rotate imgpng imgsvg imgjpeg opengl cube <_short>Cube Caps <_short>Bindings <_short>Reflection <_short>Deformation <_short>Sphere <_short>Cube Caps <_short>Behaviour <_short>Top <_short>Bottom compiz-0.9.11+14.04.20140409/plugins/addhelper/0000755000015301777760000000000012321344021021105 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/addhelper/Makefile0000644000015301777760000004552312321343002022554 0ustar pbusernogroup00000000000000## # # Compiz plugin Makefile # # Copyright : (C) 2007 by Dennis Kasprzyk # E-mail : onestone@deltatauchi.de # # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # ## # plugin.info file contents # # PLUGIN = foo # PKG_DEP = pango # LDFLAGS_ADD = -lGLU # CFLAGS_ADD = -I/usr/include/foo # CHK_HEADERS = compiz-cube.h # #load config file ECHO = `which echo` # default color settings color := $(shell if [ $$TERM = "dumb" ]; then $(ECHO) "no"; else $(ECHO) "yes"; fi) ifeq ($(shell if [ -f plugin.info ]; then $(ECHO) -n "found"; fi ),found) include plugin.info else $(error $(shell if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\033[1;31m[ERROR]\033[0m \"plugin.info\" file not found"; \ else \ $(ECHO) "[ERROR] \"plugin.info\" file not found"; \ fi;)) endif ifneq ($(shell if pkg-config --exists compiz; then $(ECHO) -n "found"; fi ),found) $(error $(shell if [ '$(color)' != 'no' ]; then \ $(ECHO) -e -n "\033[1;31m[ERROR]\033[0m Compiz not installed"; \ else \ $(ECHO) -n "[ERROR] Compiz not installed"; \ fi)) endif ifneq ($(shell if [ -n "$(PKG_DEP)" ]; then if pkg-config --exists $(PKG_DEP); then $(ECHO) -n "found"; fi; \ else $(ECHO) -n "found"; fi ),found) $(error $(shell if [ '$(color)' != 'no' ]; then \ $(ECHO) -e -n "\033[1;31m[ERROR]\033[0m "; \ else \ $(ECHO) -n "[ERROR] "; \ fi; \ pkg-config --print-errors --short-errors --errors-to-stdout $(PKG_DEP); )) endif ifeq ($(BUILD_GLOBAL),true) PREFIX = $(shell pkg-config --variable=prefix compiz) CLIBDIR = $(shell pkg-config --variable=libdir compiz) CINCDIR = $(shell pkg-config --variable=includedir compiz) PKGDIR = $(CLIBDIR)/pkgconfig DESTDIR = $(shell pkg-config --variable=libdir compiz)/compiz XMLDIR = $(shell pkg-config --variable=prefix compiz)/share/compiz IMAGEDIR = $(shell pkg-config --variable=prefix compiz)/share/compiz DATADIR = $(shell pkg-config --variable=prefix compiz)/share/compiz else DESTDIR = $(HOME)/.compiz/plugins XMLDIR = $(HOME)/.compiz/metadata IMAGEDIR = $(HOME)/.compiz/images DATADIR = $(HOME)/.compiz/data endif BUILDDIR = build CC = gcc CPP = g++ LIBTOOL = libtool INSTALL = install BCOP = `pkg-config --variable=bin bcop` CFLAGS = -g -Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -fno-strict-aliasing `pkg-config --cflags $(PKG_DEP) compiz ` $(CFLAGS_ADD) LDFLAGS = `pkg-config --libs $(PKG_DEP) compiz ` $(LDFLAGS_ADD) DEFINES = -DIMAGEDIR=\"$(IMAGEDIR)\" -DDATADIR=\"$(DATADIR)\" POFILEDIR = $(shell if [ -n "$(PODIR)" ]; then $(ECHO) $(PODIR); else $(ECHO) ./po;fi ) COMPIZ_HEADERS = compiz.h compiz-core.h COMPIZ_INC = $(shell pkg-config --variable=includedir compiz)/compiz/ is-bcop-target := $(shell if [ -e $(PLUGIN).xml.in ]; then cat $(PLUGIN).xml.in | grep "useBcop=\"true\""; \ else if [ -e $(PLUGIN).xml ]; then cat $(PLUGIN).xml | grep "useBcop=\"true\""; fi; fi) trans-target := $(shell if [ -e $(PLUGIN).xml.in -o -e $(PLUGIN).xml ]; then $(ECHO) $(BUILDDIR)/$(PLUGIN).xml;fi ) bcop-target := $(shell if [ -n "$(is-bcop-target)" ]; then $(ECHO) $(BUILDDIR)/$(PLUGIN).xml; fi ) bcop-target-src := $(shell if [ -n "$(is-bcop-target)" ]; then $(ECHO) $(BUILDDIR)/$(PLUGIN)_options.c; fi ) bcop-target-hdr := $(shell if [ -n "$(is-bcop-target)" ]; then $(ECHO) $(BUILDDIR)/$(PLUGIN)_options.h; fi ) gen-schemas := $(shell if [ \( -e $(PLUGIN).xml.in -o -e $(PLUGIN).xml \) -a -n "`pkg-config --variable=xsltdir compiz-gconf`" ]; then $(ECHO) true; fi ) schema-target := $(shell if [ -n "$(gen-schemas)" ]; then $(ECHO) $(BUILDDIR)/$(PLUGIN).xml; fi ) schema-output := $(shell if [ -n "$(gen-schemas)" ]; then $(ECHO) $(BUILDDIR)/compiz-$(PLUGIN).schema; fi ) ifeq ($(BUILD_GLOBAL),true) pkg-target := $(shell if [ -e compiz-$(PLUGIN).pc.in -a -n "$(PREFIX)" -a -d "$(PREFIX)" ]; then $(ECHO) "$(BUILDDIR)/compiz-$(PLUGIN).pc"; fi ) hdr-install-target := $(shell if [ -e compiz-$(PLUGIN).pc.in -a -n "$(PREFIX)" -a -d "$(PREFIX)" -a -e compiz-$(PLUGIN).h ]; then $(ECHO) "compiz-$(PLUGIN).h"; fi ) endif # find all the object files c-objs := $(patsubst %.c,%.lo,$(shell find -name '*.c' 2> /dev/null | grep -v "$(BUILDDIR)/" | sed -e 's/^.\///')) c-objs += $(patsubst %.cpp,%.lo,$(shell find -name '*.cpp' 2> /dev/null | grep -v "$(BUILDDIR)/" | sed -e 's/^.\///')) c-objs += $(patsubst %.cxx,%.lo,$(shell find -name '*.cxx' 2> /dev/null | grep -v "$(BUILDDIR)/" | sed -e 's/^.\///')) c-objs := $(filter-out $(bcop-target-src:.c=.lo),$(c-objs)) h-files := $(shell find -name '*.h' 2> /dev/null | grep -v "$(BUILDDIR)/" | sed -e 's/^.\///') h-files += $(bcop-target-hdr) h-files += $(foreach file,$(COMPIZ_HEADERS) $(CHK_HEADERS),$(shell $(ECHO) -n "$(COMPIZ_INC)$(file)")) all-c-objs := $(addprefix $(BUILDDIR)/,$(c-objs)) all-c-objs += $(bcop-target-src:.c=.lo) # additional files data-files := $(shell find data/ -name '*' -type f 2> /dev/null | sed -e 's/data\///') image-files := $(shell find images/ -name '*' -type f 2> /dev/null | sed -e 's/images\///') # system include path parameter, -isystem doesn't work on old gcc's inc-path-param = $(shell if [ -z "`gcc --version | head -n 1 | grep ' 3'`" ]; then $(ECHO) "-isystem"; else $(ECHO) "-I"; fi) # Tests ifeq ($(shell if [ -n "$(is-bcop-target)" -a -z "$(BCOP)" ]; then $(ECHO) -n "error"; fi ),error) $(error $(shell if [ '$(color)' != 'no' ]; then \ $(ECHO) -e -n "\033[1;31m[ERROR]\033[0m BCOP not installed but is needed to build plugin"; \ else \ $(ECHO) -n "[ERROR] BCOP not installed but is needed to build plugin"; \ fi)) endif ifeq ($(shell if [ "x$(BUILD_GLOBAL)" != "xtrue" -a -e compiz-$(PLUGIN).pc.in ]; then $(ECHO) -n "warn"; fi ),warn) $(warning $(shell if [ '$(color)' != 'no' ]; then \ $(ECHO) -e -n "\033[1;31m[WARNING]\033[0m This plugin might be needed by other plugins. Install it with \"BUILD_GLOBAL=true sudo make install\" "; \ else \ $(ECHO) -n "[WARNING] This plugin might be needed by other plugins. Install it with \"BUILD_GLOBAL=true sudo make install\""; \ fi)) endif # # Do it. # .PHONY: $(BUILDDIR) build-dir trans-target bcop-build pkg-creation schema-creation c-build-objs c-link-plugin all: $(BUILDDIR) build-dir trans-target bcop-build pkg-creation schema-creation c-build-objs c-link-plugin trans-build: $(trans-target) bcop-build: $(bcop-target-hdr) $(bcop-target-src) schema-creation: $(schema-output) c-build-objs: $(all-c-objs) c-link-plugin: $(BUILDDIR)/lib$(PLUGIN).la pkg-creation: $(pkg-target) # # Create build directory # $(BUILDDIR) : @mkdir -p $(BUILDDIR) $(DESTDIR) : @mkdir -p $(DESTDIR) # # fallback if xml.in doesn't exists # $(BUILDDIR)/%.xml: %.xml @cp $< $@ # # Translating # $(BUILDDIR)/%.xml: %.xml.in @if [ -d $(POFILEDIR) ]; then \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e -n "\033[0;1;5mtranslate \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \ else \ $(ECHO) "translate $< -> $@"; \ fi; \ intltool-merge -x -u $(POFILEDIR) $< $@ > /dev/null; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0mtranslate : \033[34m$< -> $@\033[0m"; \ fi; \ else \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e -n "\033[0;1;5mconvert \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \ else \ $(ECHO) "convert $< -> $@"; \ fi; \ cat $< | sed -e 's;<_;<;g' -e 's; $@; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0mconvert : \033[34m$< -> $@\033[0m"; \ fi; \ fi # # BCOP'ing $(BUILDDIR)/%_options.h: $(BUILDDIR)/%.xml @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e -n "\033[0;1;5mbcop'ing \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \ else \ $(ECHO) "bcop'ing $< -> $@"; \ fi @$(BCOP) --header=$@ $< @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0mbcop'ing : \033[34m$< -> $@\033[0m"; \ fi $(BUILDDIR)/%_options.c: $(BUILDDIR)/%.xml @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e -n "\033[0;1;5mbcop'ing \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \ else \ $(ECHO) "bcop'ing $< -> $@"; \ fi @$(BCOP) --source=$@ $< @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0mbcop'ing : \033[34m$< -> $@\033[0m"; \ fi # # Schema generation $(BUILDDIR)/compiz-%.schema: $(BUILDDIR)/%.xml @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e -n "\033[0;1;5mschema'ing\033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \ else \ $(ECHO) "schema'ing $< -> $@"; \ fi @xsltproc `pkg-config --variable=xsltdir compiz-gconf`/schemas.xslt $< > $@ @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0mschema : \033[34m$< -> $@\033[0m"; \ fi # # pkg config file generation $(BUILDDIR)/compiz-%.pc: compiz-%.pc.in @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e -n "\033[0;1;5mpkgconfig \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \ else \ $(ECHO) "pkgconfig $< -> $@"; \ fi @COMPIZREQUIRES=`cat $(PKGDIR)/compiz.pc | grep Requires | sed -e 's;Requires: ;;g'`; \ COMPIZCFLAGS=`cat $(PKGDIR)/compiz.pc | grep Cflags | sed -e 's;Cflags: ;;g'`; \ sed -e 's;@prefix@;$(PREFIX);g' -e 's;\@libdir@;$(CLIBDIR);g' \ -e 's;@includedir@;$(CINCDIR);g' -e 's;\@VERSION@;0.0.1;g' \ -e "s;@COMPIZ_REQUIRES@;$$COMPIZREQUIRES;g" \ -e "s;@COMPIZ_CFLAGS@;$$COMPIZCFLAGS;g" $< > $@; @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0mpkgconfig : \033[34m$< -> $@\033[0m"; \ fi # # Compiling # $(BUILDDIR)/%.lo: %.c $(h-files) @if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5mcompiling \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \ else \ $(ECHO) "compiling $< -> $@"; \ fi @$(LIBTOOL) --quiet --mode=compile $(CC) $(CFLAGS) $(DEFINES) -I$(BUILDDIR) -c -o $@ $< @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0mcompiling : \033[34m$< -> $@\033[0m"; \ fi $(BUILDDIR)/%.lo: $(BUILDDIR)/%.c $(h-files) @if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5mcompiling \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \ else \ $(ECHO) "compiling $< -> $@"; \ fi @$(LIBTOOL) --quiet --mode=compile $(CC) $(CFLAGS) $(DEFINES) -I$(BUILDDIR) -c -o $@ $< @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0mcompiling : \033[34m$< -> $@\033[0m"; \ fi $(BUILDDIR)/%.lo: %.cpp $(h-files) @if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5mcompiling \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \ else \ $(ECHO) "compiling $< -> $@"; \ fi @$(LIBTOOL) --quiet --mode=compile $(CPP) $(CFLAGS) $(DEFINES) -I$(BUILDDIR) -c -o $@ $< @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0mcompiling : \033[34m$< -> $@\033[0m"; \ fi $(BUILDDIR)/%.lo: %.cxx $(h-files) @if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5mcompiling \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \ else \ $(ECHO) "compiling $< -> $@"; \ fi @$(LIBTOOL) --quiet --mode=compile $(CPP) $(CFLAGS) $(DEFINES) -I$(BUILDDIR) -c -o $@ $< @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0mcompiling : \033[34m$< -> $@\033[0m"; \ fi # # Linking # cxx-rpath-prefix := -Wl,-rpath, $(BUILDDIR)/lib$(PLUGIN).la: $(all-c-objs) @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e -n "\033[0;1;5mlinking \033[0m: \033[0;31m$@\033[0m"; \ else \ $(ECHO) "linking : $@"; \ fi @$(LIBTOOL) --quiet --mode=link $(CC) $(LDFLAGS) -rpath $(DESTDIR) -o $@ $(all-c-objs) @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0mlinking : \033[34m$@\033[0m"; \ fi clean: @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e -n "\033[0;1;5mremoving \033[0m: \033[0;31m./$(BUILDDIR)\033[0m"; \ else \ $(ECHO) "removing : ./$(BUILDDIR)"; \ fi @rm -rf $(BUILDDIR) @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0mremoving : \033[34m./$(BUILDDIR)\033[0m"; \ fi install: $(DESTDIR) all @if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(DESTDIR)/lib$(PLUGIN).so\033[0m"; \ else \ $(ECHO) "install : $(DESTDIR)/lib$(PLUGIN).so"; \ fi @mkdir -p $(DESTDIR) @$(INSTALL) $(BUILDDIR)/.libs/lib$(PLUGIN).so $(DESTDIR)/lib$(PLUGIN).so @if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0minstall : \033[34m$(DESTDIR)/lib$(PLUGIN).so\033[0m"; \ fi @if [ -e $(BUILDDIR)/$(PLUGIN).xml ]; then \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(XMLDIR)/$(PLUGIN).xml\033[0m"; \ else \ $(ECHO) "install : $(XMLDIR)/$(PLUGIN).xml"; \ fi; \ mkdir -p $(XMLDIR); \ $(INSTALL) $(BUILDDIR)/$(PLUGIN).xml $(XMLDIR)/$(PLUGIN).xml; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0minstall : \033[34m$(XMLDIR)/$(PLUGIN).xml\033[0m"; \ fi; \ fi @if [ -n "$(hdr-install-target)" ]; then \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(CINCDIR)/compiz/$(hdr-install-target)\033[0m"; \ else \ $(ECHO) "install : $(CINCDIR)/compiz/$(hdr-install-target)"; \ fi; \ $(INSTALL) --mode=u=rw,go=r,a-s $(hdr-install-target) $(CINCDIR)/compiz/$(hdr-install-target); \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0minstall : \033[34m$(CINCDIR)/compiz/$(hdr-install-target)\033[0m"; \ fi; \ fi @if [ -n "$(pkg-target)" ]; then \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(PKGDIR)/compiz-$(PLUGIN).pc\033[0m"; \ else \ $(ECHO) "install : $(PKGDIR)/compiz-$(PLUGIN).pc"; \ fi; \ $(INSTALL) --mode=u=rw,go=r,a-s $(pkg-target) $(PKGDIR)/compiz-$(PLUGIN).pc; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0minstall : \033[34m$(PKGDIR)/compiz-$(PLUGIN).pc\033[0m"; \ fi; \ fi @if [ -n "$(schema-output)" -a -e "$(schema-output)" ]; then \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(schema-output)\033[0m"; \ else \ $(ECHO) "install : $(schema-output)"; \ fi; \ if [ "x$(USER)" = "xroot" ]; then \ GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` \ gconftool-2 --makefile-install-rule $(schema-output) > /dev/null; \ else \ gconftool-2 --install-schema-file=$(schema-output) > /dev/null; \ fi; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0minstall : \033[34m$(schema-output)\033[0m"; \ fi; \ fi @if [ -n "$(data-files)" ]; then \ mkdir -p $(DATADIR); \ for FILE in $(data-files); do \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(DATADIR)/$$FILE\033[0m"; \ else \ $(ECHO) "install : $(DATADIR)/$$FILE"; \ fi; \ FILEDIR="$(DATADIR)/`dirname "$$FILE"`"; \ mkdir -p "$$FILEDIR"; \ $(INSTALL) --mode=u=rw,go=r,a-s data/$$FILE $(DATADIR)/$$FILE; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0minstall : \033[34m$(DATADIR)/$$FILE\033[0m"; \ fi; \ done \ fi @if [ -n "$(image-files)" ]; then \ mkdir -p $(IMAGEDIR); \ for FILE in $(image-files); do \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(IMAGEDIR)/$$FILE\033[0m"; \ else \ $(ECHO) "install : $(IMAGEDIR)/$$FILE"; \ fi; \ FILEDIR="$(IMAGEDIR)/`dirname "$$FILE"`"; \ mkdir -p "$$FILEDIR"; \ $(INSTALL) --mode=u=rw,go=r,a-s images/$$FILE $(IMAGEDIR)/$$FILE; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0minstall : \033[34m$(IMAGEDIR)/$$FILE\033[0m"; \ fi; \ done \ fi uninstall: @if [ -e $(DESTDIR)/lib$(PLUGIN).so ]; then \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(DESTDIR)/lib$(PLUGIN).so\033[0m"; \ else \ $(ECHO) "uninstall : $(DESTDIR)/lib$(PLUGIN).so"; \ fi; \ rm -f $(DESTDIR)/lib$(PLUGIN).so; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0muninstall : \033[34m$(DESTDIR)/lib$(PLUGIN).so\033[0m"; \ fi; \ fi @if [ -e $(XMLDIR)/$(PLUGIN).xml ]; then \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(XMLDIR)/$(PLUGIN).xml\033[0m"; \ else \ $(ECHO) "uninstall : $(XMLDIR)/$(PLUGIN).xml"; \ fi; \ rm -f $(XMLDIR)/$(PLUGIN).xml; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0muninstall : \033[34m$(XMLDIR)/$(PLUGIN).xml\033[0m"; \ fi; \ fi @if [ -n "$(hdr-install-target)" -a -e $(CINCDIR)/compiz/$(hdr-install-target) ]; then \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(CINCDIR)/compiz/$(hdr-install-target)\033[0m"; \ else \ $(ECHO) "uninstall : $(CINCDIR)/compiz/$(hdr-install-target)"; \ fi; \ rm -f $(CINCDIR)/compiz/$(hdr-install-target); \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0muninstall : \033[34m$(CINCDIR)/compiz/$(hdr-install-target)\033[0m"; \ fi; \ fi @if [ -n "$(pkg-target)" -a -e $(PKGDIR)/compiz-$(PLUGIN).pc ]; then \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(PKGDIR)/compiz-$(PLUGIN).pc\033[0m"; \ else \ $(ECHO) "uninstall : $(PKGDIR)/compiz-$(PLUGIN).pc"; \ fi; \ rm -f $(PKGDIR)/compiz-$(PLUGIN).pc; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0muninstall : \033[34m$(PKGDIR)/compiz-$(PLUGIN).pc\033[0m"; \ fi; \ fi @if [ -n "$(schema-output)" -a -e "$(schema-output)" -a 'x$(USER)' = 'xroot' ]; then \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(schema-output)\033[0m"; \ else \ $(ECHO) "uninstall : $(schema-output)"; \ fi; \ GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` \ gconftool-2 --makefile-uninstall-rule $(schema-output) > /dev/null; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0muninstall : \033[34m$(schema-output)\033[0m"; \ fi; \ fi @if [ -n "$(data-files)" ]; then \ for FILE in $(data-files); do \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(DATADIR)/$$FILE\033[0m"; \ else \ $(ECHO) "uninstall : $(DATADIR)/$$FILE"; \ fi; \ rm -f $(DATADIR)/$$FILE; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0muninstall : \033[34m$(DATADIR)/$$FILE\033[0m"; \ fi; \ done \ fi @if [ -n "$(image-files)" ]; then \ for FILE in $(image-files); do \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(IMAGEDIR)/$$FILE\033[0m"; \ else \ $(ECHO) "uninstall : $(IMAGEDIR)/$$FILE"; \ fi; \ rm -f $(IMAGEDIR)/$$FILE; \ if [ '$(color)' != 'no' ]; then \ $(ECHO) -e "\r\033[0muninstall : \033[34m$(IMAGEDIR)/$$FILE\033[0m"; \ fi; \ done \ fi compiz-0.9.11+14.04.20140409/plugins/addhelper/addhelper.xml.in0000644000015301777760000000376212321343002024172 0ustar pbusernogroup00000000000000 <_short>Dim Inactive <_long>Make it slightly easier to concentrate by dimming all but the active window. Accessibility opengl composite opengl fade decor <_short>Bindings <_short>Misc. Options compiz-0.9.11+14.04.20140409/plugins/addhelper/CMakeLists.txt0000644000015301777760000000015612321343002023645 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (addhelper PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/addhelper/src/0000755000015301777760000000000012321344021021674 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/addhelper/src/addhelper.h0000644000015301777760000000455312321343002024002 0ustar pbusernogroup00000000000000/** * Compiz ADD Helper. Makes it easier to concentrate. * * addhelper.h * * Copyright (c) 2007 Kristian Lyngstøl * Ported and highly modified by Patrick Niklaus * Ported to compiz 0.9 by Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This plugin provides a toggle-feature that dims all but the active * window. This makes it easier for people with lousy concentration * to focus. Like me. * * Please note any major changes to the code in this header with who you * are and what you did. * */ #include #include #include #include "addhelper_options.h" class AddScreen : public PluginClassHandler , public ScreenInterface, public AddhelperOptions { public: AddScreen (CompScreen *screen); CompositeScreen *cScreen; GLushort opacity; GLushort brightness; GLushort saturation; bool isToggle; void handleEvent (XEvent *event); void walkWindows (); bool toggle (CompAction *action, CompAction::State state, CompOption::Vector options); void optionChanged (CompOption *options, AddhelperOptions::Options num); }; class AddWindow : public PluginClassHandler , public GLWindowInterface { public: AddWindow (CompWindow *window); ~AddWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool dim; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); }; class AddPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #define ADD_SCREEN(s) \ AddScreen *as = AddScreen::get (s) #define ADD_WINDOW(w) \ AddWindow *aw = AddWindow::get (w) compiz-0.9.11+14.04.20140409/plugins/addhelper/src/addhelper.cpp0000644000015301777760000001440512321343002024332 0ustar pbusernogroup00000000000000/** * Compiz ADD Helper. Makes it easier to concentrate. * * addhelper.cpp * * Copyright (c) 2007 Kristian Lyngstøl * Ported and highly modified by Patrick Niklaus * Ported to compiz 0.9 by Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This plugin provides a toggle-feature that dims all but the active * window. This makes it easier for people with lousy concentration * to focus. Like me. * * Please note any major changes to the code in this header with who you * are and what you did. * */ #include "addhelper.h" COMPIZ_PLUGIN_20090315 (addhelper, AddPluginVTable); /* Walk through all windows of the screen and adjust them if they * are not the active window. If reset is true, this will reset * the windows, including the active. Otherwise, it will dim * and reset the active. */ void AddScreen::walkWindows () { foreach (CompWindow *w, screen->windows ()) { ADD_WINDOW (w); if (!aw->dim) aw->cWindow->addDamage (); aw->dim = false; if (!isToggle) continue; if (w->id () == screen->activeWindow ()) continue; if (w->invisible () || w->destroyed () || !w->isMapped () || w->minimized ()) continue; if (!optionGetWindowTypes ().evaluate (w)) continue; aw->cWindow->addDamage (); aw->dim = true; } } /* Checks if the window is dimmed and, if so, paints it with the modified * paint attributes. */ bool AddWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { ADD_SCREEN (screen); if (dim) { /* copy the paint attribute */ GLWindowPaintAttrib wAttrib = attrib; /* applies the lowest value */ wAttrib.opacity = (MIN (attrib.opacity, as->opacity)); wAttrib.brightness = (MIN (attrib.brightness, as->brightness)); wAttrib.saturation = (MIN (attrib.saturation, as->saturation)); /* continue painting with the modified attribute */ return gWindow->glPaint (wAttrib, transform, region, mask); } else { /* the window is not dimmed, so it's painted normal */ return gWindow->glPaint (attrib, transform, region, mask); } } /* Takes the inital event. * This checks for focus change and acts on it. */ void AddScreen::handleEvent (XEvent *event) { Window active = screen->activeWindow (); screen->handleEvent (event); if (active != screen->activeWindow () && isToggle) walkWindows (); } /* Configuration, initialization, boring stuff. ----------------------- */ /* Takes the action and toggles us. */ bool AddScreen::toggle (CompAction *action, CompAction::State state, CompOption::Vector options) { isToggle = !isToggle; if (isToggle) { walkWindows (); foreach (CompWindow *w, screen->windows ()) { ADD_WINDOW (w); aw->gWindow->glPaintSetEnabled (aw, true); } screen->handleEventSetEnabled (this, true); } else { foreach (CompWindow *w, screen->windows ()) { ADD_WINDOW (w); aw->gWindow->glPaintSetEnabled (aw, false); aw->cWindow->addDamage (); } screen->handleEventSetEnabled (this, false); } return true; } void AddScreen::optionChanged (CompOption *options, AddhelperOptions::Options num) { switch (num) { case AddhelperOptions::Brightness: brightness = (optionGetBrightness () * 0xffff) / 100; break; case AddhelperOptions::Saturation: saturation = (optionGetSaturation () * 0xffff) / 100; break; case AddhelperOptions::Opacity: opacity = (optionGetOpacity () * 0xffff) / 100; break; case AddhelperOptions::Ononinit: // <- Turn AddHelper on on initiation isToggle = optionGetOnoninit (); if (isToggle) { walkWindows (); foreach (CompWindow *w, screen->windows ()) { ADD_WINDOW (w); aw->gWindow->glPaintSetEnabled (aw, true); } screen->handleEventSetEnabled (this, true); } else { foreach (CompWindow *w, screen->windows ()) { ADD_WINDOW (w); aw->gWindow->glPaintSetEnabled (aw, false); } screen->handleEventSetEnabled (this, false); } break; default: break; } } AddWindow::AddWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), dim (false) { ADD_SCREEN (screen); GLWindowInterface::setHandler (gWindow, false); if (as->isToggle) { if (window->id () != screen->activeWindow () && !window->overrideRedirect ()) dim = true; gWindow->glPaintSetEnabled (this, true); } } AddWindow::~AddWindow () { if (dim) cWindow->addDamage (); } AddScreen::AddScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), opacity ((optionGetOpacity () * 0xffff) / 100), brightness ((optionGetBrightness () * 0xffff) / 100), saturation ((optionGetSaturation () * 0xffff) / 100), isToggle (optionGetOnoninit ()) { ScreenInterface::setHandler (screen, false); optionSetToggleKeyInitiate (boost::bind (&AddScreen::toggle, this, _1, _2, _3)); optionSetBrightnessNotify (boost::bind (&AddScreen::optionChanged, this, _1, _2)); optionSetSaturationNotify (boost::bind (&AddScreen::optionChanged, this, _1, _2)); optionSetOpacityNotify (boost::bind (&AddScreen::optionChanged, this, _1, _2)); optionSetOnoninitNotify (boost::bind (&AddScreen::optionChanged, this, _1, _2)); } bool AddPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/expo/0000755000015301777760000000000012321344021020130 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/expo/CMakeLists.txt0000644000015301777760000000053212321343002022666 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) add_subdirectory (src/click_threshold) include_directories (src/click_threshold/include) add_subdirectory (src/wall_offset) include_directories (src/wall_offset/include) compiz_plugin (expo PLUGINDEPS composite opengl LIBRARIES compiz_expo_click_threshold compiz_expo_wall_offset ) compiz-0.9.11+14.04.20140409/plugins/expo/src/0000755000015301777760000000000012321344021020717 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/expo/src/expo.cpp0000644000015301777760000012430312321343002022377 0ustar pbusernogroup00000000000000/** * * Compiz expo plugin * * expo.cpp * * Copyright (c) 2011 Linaro Limited * Copyright (c) 2008 Dennis Kasprzyk * Copyright (c) 2006 Robert Carr * * Authors: * Robert Carr * Dennis Kasprzyk * Travis Watkins * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "expo.h" #include "click-threshold.h" #include "wall-offset.h" #include #include #ifndef USE_GLES #include #endif #include COMPIZ_PLUGIN_20090315 (expo, ExpoPluginVTable); #define sigmoid(x) (1.0f / (1.0f + exp (-11.0f * ((x) - 0.5f)))) #define sigmoidProgress(x) ((sigmoid (x) - sigmoid (0)) / \ (sigmoid (1) - sigmoid (0))) #define interpolate(a, b, val) (((val) * (a)) + ((1 - (val)) * (b))) bool ExpoScreen::dndInit (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (expoMode) { dndState = DnDStart; action->setState (action->state () | CompAction::StateTermButton); cScreen->damageScreen (); return true; } return false; } bool ExpoScreen::dndFini (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (dndState == DnDDuring || dndState == DnDStart) { if (dndWindow) finishWindowMovement (); dndState = DnDNone; dndWindow = NULL; /* The action could be an action of key, edge or button binding if * expo was terminated during dnd. Thus we must fetch the action of * dndButton ourselves or we mess their state up. */ CompAction &dndAction = optionGetDndButton (); dndAction.setState (dndAction.state () & CompAction::StateInitButton); cScreen->damageScreen (); return true; } return false; } bool ExpoScreen::doExpo (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist ("expo", NULL)) return false; if (!expoMode) { if (!grabIndex) grabIndex = screen->pushGrab (None, "expo"); updateWraps (true); expoMode = true; anyClick = false; doubleClick = false; clickTime = 0; dndState = DnDNone; dndWindow = NULL; selectedVp = screen->vp (); lastSelectedVp = selectedVp; origVp = selectedVp; screen->addAction (&optionGetDndButton ()); screen->addAction (&optionGetExitButton ()); screen->addAction (&optionGetNextVpButton ()); screen->addAction (&optionGetPrevVpButton ()); cScreen->damageScreen (); } else termExpo (action, state, options); return true; } bool ExpoScreen::termExpo (CompAction *action, CompAction::State state, CompOption::Vector &options) { /* Warning: *action is NULL if we came here from handleEvent. */ if (!expoMode) return true; expoMode = false; if (dndState != DnDNone) dndFini (action, state, options); if (state & CompAction::StateCancel) vpUpdateMode = VPUpdatePrevious; else vpUpdateMode = VPUpdateMouseOver; dndState = DnDNone; dndWindow = NULL; screen->removeAction (&optionGetDndButton ()); screen->removeAction (&optionGetExitButton ()); screen->removeAction (&optionGetNextVpButton ()); screen->removeAction (&optionGetPrevVpButton ()); cScreen->damageScreen (); screen->focusDefaultWindow (); return true; } bool ExpoScreen::exitExpo (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (!expoMode) return false; termExpo (action, 0, noOptions ()); anyClick = true; cScreen->damageScreen (); return true; } bool ExpoScreen::nextVp (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (!expoMode) return false; unsigned int newX = selectedVp.x () + 1; unsigned int newY = selectedVp.y (); if (newX >= (unsigned int) screen->vpSize ().width ()) { newX = 0; newY = newY + 1; if (newY >= (unsigned int) screen->vpSize ().height ()) newY = 0; } moveFocusViewport (newX - selectedVp.x (), newY - selectedVp.y ()); cScreen->damageScreen (); return true; } bool ExpoScreen::prevVp (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (!expoMode) return false; int newX = selectedVp.x () - 1; int newY = selectedVp.y (); if (newX < 0) { newX = screen->vpSize ().width () - 1; newY = newY - 1; if (newY < 0) newY = screen->vpSize ().height () - 1; } moveFocusViewport (newX - selectedVp.x (), newY - selectedVp.y ()); cScreen->damageScreen (); return true; } void ExpoScreen::moveFocusViewport (int dx, int dy) { lastSelectedVp = selectedVp; int newX = selectedVp.x () + dx; int newY = selectedVp.y () + dy; newX = MAX (0, MIN (static_cast (screen->vpSize ().width ()) - 1, newX)); newY = MAX (0, MIN (static_cast (screen->vpSize ().height ()) - 1, newY)); selectedVp.set (newX, newY); cScreen->damageScreen (); } void ExpoScreen::finishWindowMovement () { CompOption::Vector o(0); dndWindow->ungrabNotify (); screen->handleCompizEvent ("expo", "start_viewport_switch", o); screen->moveViewport (screen->vp ().x () - selectedVp.x (), screen->vp ().y () - selectedVp.y (), true); screen->handleCompizEvent ("expo", "end_viewport_switch", o); /* update saved window attributes in case we moved the window to a new viewport */ if (dndWindow->saveMask () & CWX) { dndWindow->saveWc ().x = dndWindow->saveWc ().x % screen->width (); if (dndWindow->saveWc ().x < 0) dndWindow->saveWc ().x += screen->width (); } if (dndWindow->saveMask () & CWY) { dndWindow->saveWc ().y = dndWindow->saveWc ().y % screen->height (); if (dndWindow->saveWc ().y < 0) dndWindow->saveWc ().y += screen->height (); } /* update window attibutes to make sure a moved maximized window is properly snapped to the work area */ if (dndWindow->state () & MAXIMIZE_STATE) dndWindow->updateAttributes (CompStackingUpdateModeNone); #if 0 /* FIXME: obsolete in the meantime? */ { /* make sure we snap to the correct output */ int lastOutput = s->currentOutputDev; int centerX = (WIN_X (w) + WIN_W (w) / 2) % s->width; if (centerX < 0) centerX += s->width; int centerY = (WIN_Y (w) + WIN_H (w) / 2) % s->height; if (centerY < 0) centerY += s->height; s->currentOutputDev = outputDeviceForPoint (s, centerX, centerY); updateWindowAttributes (w, CompStackingUpdateModeNone); s->currentOutputDev = lastOutput; } #endif } void ExpoScreen::handleEvent (XEvent *event) { switch (event->type) { case KeyPress: if (expoMode && event->xkey.root == screen->root ()) { if (event->xkey.keycode == leftKey) moveFocusViewport (-1, 0); else if (event->xkey.keycode == rightKey) moveFocusViewport (1, 0); else if (event->xkey.keycode == upKey) moveFocusViewport (0, -1); else if (event->xkey.keycode == downKey) moveFocusViewport (0, 1); } break; case ButtonPress: if (expoMode && event->xbutton.button == Button1 && event->xbutton.root == screen->root ()) { CompPoint pointer (event->xbutton.x_root, event->xbutton.y_root); if (!screen->workArea ().contains (pointer)) break; anyClick = true; if (clickTime == 0) clickTime = event->xbutton.time; else if (event->xbutton.time - clickTime <= static_cast (optionGetDoubleClickTime ()) && lastSelectedVp == selectedVp) doubleClick = true; else { clickTime = event->xbutton.time; doubleClick = false; } cScreen->damageScreen (); prevClickPoint = CompPoint (event->xbutton.x, event->xbutton.y); } break; case ButtonRelease: if (expoMode && event->xbutton.button == Button1 && event->xbutton.root == screen->root ()) { CompPoint pointer (event->xbutton.x_root, event->xbutton.y_root); if (!screen->workArea ().contains (pointer)) break; if (event->xbutton.time - clickTime > (unsigned int)optionGetDoubleClickTime ()) { clickTime = 0; doubleClick = false; } else if (doubleClick || compiz::expo::clickMovementInThreshold(prevClickPoint.x (), prevClickPoint.y (), event->xbutton.x, event->xbutton.y)) { clickTime = 0; doubleClick = false; termExpo (NULL, 0, noOptions ()); anyClick = true; } } break; default: break; } screen->handleEvent (event); } void ExpoScreen::preparePaint (int msSinceLastPaint) { float val = (static_cast (msSinceLastPaint) / 1000.0f) / optionGetZoomTime (); if (expoMode) expoCam = MIN (1.0, expoCam + val); else expoCam = MAX (0.0, expoCam - val); if (expoCam) { unsigned int i, j, vp; unsigned int vpCountHorz = screen->vpSize ().width (); unsigned int vpCountVert = screen->vpSize ().height (); unsigned int vpCount = vpCountHorz * vpCountVert; if (vpActivity.size () < vpCount) { vpActivity.resize (vpCount); foreach (float &activity, vpActivity) activity = 1.0f; } for (i = 0; i < vpCountHorz; ++i) { for (j = 0; j < vpCountVert; ++j) { vp = j * vpCountHorz + i; if (CompPoint (i, j) == selectedVp) vpActivity[vp] = MIN (1.0, vpActivity[vp] + val); else vpActivity[vp] = MAX (0.0, vpActivity[vp] - val); } } const float degToRad = M_PI / 180.0f; const int screenWidth = screen->width (); for (i = 0; i < 360; ++i) { vpNormals[i * 3] = (-sin (i * degToRad) / screenWidth) * expoCam; vpNormals[i * 3 + 1] = 0.0; vpNormals[i * 3 + 2] = (-cos (i * degToRad) * expoCam) - (1 - expoCam); } } cScreen->preparePaint (msSinceLastPaint); } void ExpoScreen::updateWraps (bool enable) { screen->handleEventSetEnabled (this, enable); cScreen->preparePaintSetEnabled (this, enable); cScreen->paintSetEnabled (this, enable); cScreen->donePaintSetEnabled (this, enable); gScreen->glPaintOutputSetEnabled (this, enable); gScreen->glPaintTransformedOutputSetEnabled (this, enable); ExpoWindow *ew; foreach (CompWindow *w, screen->windows ()) { ew = ExpoWindow::get (w); ew->cWindow->damageRectSetEnabled (ew, enable); ew->gWindow->glPaintSetEnabled (ew, enable); ew->gWindow->glDrawSetEnabled (ew, enable); ew->gWindow->glAddGeometrySetEnabled (ew, enable); ew->gWindow->glDrawTextureSetEnabled (ew, enable); } } void ExpoScreen::paint (CompOutput::ptrList &outputs, unsigned int mask) { if (expoCam > 0.0 && outputs.size () > 1 && optionGetMultioutputMode () == MultioutputModeOneBigWall) { outputs.clear (); outputs.push_back (&screen->fullscreenOutput ()); } cScreen->paint (outputs, mask); } void ExpoScreen::donePaint () { CompOption::Vector o(0); screen->handleCompizEvent ("expo", "start_viewport_switch", o); switch (vpUpdateMode) { case VPUpdateMouseOver: screen->moveViewport (screen->vp ().x () - selectedVp.x (), screen->vp ().y () - selectedVp.y (), true); screen->focusDefaultWindow (); vpUpdateMode = VPUpdateNone; break; case VPUpdatePrevious: screen->moveViewport (screen->vp ().x () - origVp.x (), screen->vp ().y () - origVp.y (), true); lastSelectedVp = selectedVp; selectedVp = origVp; screen->focusDefaultWindow (); vpUpdateMode = VPUpdateNone; break; default: break; } screen->handleCompizEvent ("expo", "end_viewport_switch", o); if ((expoCam > 0.0f && expoCam < 1.0f) || dndState != DnDNone) cScreen->damageScreen (); if (expoCam == 1.0f) { foreach (float &vp, vpActivity) if (vp != 0.0 && vp != 1.0) cScreen->damageScreen (); } if (grabIndex && expoCam <= 0.0f && !expoMode) { screen->removeGrab (grabIndex, NULL); grabIndex = 0; updateWraps (false); } cScreen->donePaint (); switch (dndState) { case DnDDuring: { if (dndWindow) dndWindow->move (newCursor.x () - prevCursor.x (), newCursor.y () - prevCursor.y (), optionGetExpoImmediateMove ()); prevCursor = newCursor; cScreen->damageScreen (); } break; case DnDStart: { int xOffset = screen->vpSize ().width () * screen->width (); int yOffset = screen->vpSize ().height () * screen->height (); dndState = DnDNone; bool inWindow; int nx, ny; CompWindow *w; for (CompWindowList::reverse_iterator iter = screen->windows ().rbegin (); iter != screen->windows ().rend (); ++iter) { w = *iter; CompRect input (w->inputRect ()); if (w->destroyed () || (!w->shaded () && !w->isViewable ())) continue; if (w->onAllViewports ()) { nx = (newCursor.x () + xOffset) % screen->width (); ny = (newCursor.y () + yOffset) % screen->height (); } else { nx = newCursor.x () - (screen->vp ().x () * screen->width ()); ny = newCursor.y () - (screen->vp ().y () * screen->height ()); } inWindow = (nx >= input.left () && nx <= input.right ()) || (nx >= (input.left () + xOffset) && nx <= (input.right () + xOffset)); inWindow &= (ny >= input.top () && ny <= input.bottom ()) || (ny >= (input.top () + yOffset) && ny <= (input.bottom () + yOffset)); if (!inWindow) continue; /* make sure we never move windows we're not allowed to move */ if (!w->managed ()) break; else if (!(w->actions () & CompWindowActionMoveMask)) break; else if (w->type () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) break; dndState = DnDDuring; dndWindow = w; w->grabNotify (nx, ny, 0, CompWindowGrabMoveMask | CompWindowGrabButtonMask); screen->updateGrab (grabIndex, dragCursor); w->raise (); w->moveInputFocusTo (); break; } prevCursor = newCursor; } break; case DnDNone: screen->updateGrab (grabIndex, screen->normalCursor ()); break; default: break; } } static bool unproject (float winx, float winy, float winz, const GLMatrix &modelview, const GLMatrix &projection, const GLint viewport[4], float *objx, float *objy, float *objz) { GLMatrix finalMatrix = projection * modelview; float in[4], out[4]; if (!finalMatrix.invert ()) return false; in[0] = winx; in[1] = winy; in[2] = winz; in[3] = 1.0; /* Map x and y from window coordinates */ in[0] = (in[0] - viewport[0]) / viewport[2]; in[1] = (in[1] - viewport[1]) / viewport[3]; /* Map to range -1 to 1 */ in[0] = in[0] * 2 - 1; in[1] = in[1] * 2 - 1; in[2] = in[2] * 2 - 1; for (int i = 0; i < 4; ++i) { out[i] = in[0] * finalMatrix[i] + in[1] * finalMatrix[4 + i] + in[2] * finalMatrix[8 + i] + in[3] * finalMatrix[12 + i]; } if (out[3] == 0.0) return false; out[0] /= out[3]; out[1] /= out[3]; out[2] /= out[3]; *objx = out[0]; *objy = out[1]; *objz = out[2]; return true; } void ExpoScreen::invertTransformedVertex (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, CompOutput *output, int vertex[2]) { GLMatrix sTransform (transform); float p1[3], p2[3], v[3]; GLint viewport[4]; gScreen->glApplyTransform (attrib, output, &sTransform); sTransform.toScreenSpace (output, -attrib.zTranslate); glGetIntegerv (GL_VIEWPORT, viewport); unproject (vertex[0], screen->height () - vertex[1], 0, sTransform, *gScreen->projectionMatrix (), viewport, &p1[0], &p1[1], &p1[2]); unproject (vertex[0], screen->height () - vertex[1], -1.0, sTransform, *gScreen->projectionMatrix (), viewport, &p2[0], &p2[1], &p2[2]); for (int i = 0; i < 3; ++i) v[i] = p1[i] - p2[i]; float alpha = -p1[2] / v[2]; if (optionGetDeform () == DeformCurve && screen->desktopWindowCount ()) { const float screenWidth = static_cast (screen->width ()); const float screenWidthSquared = screenWidth * screenWidth; const float curveDistSquaredPlusQuarter = curveDistance * curveDistance + 0.25; const float pOne2MinusCurveDist = p1[2] - curveDistance; const float v0Squared = v[0] * v[0]; const float v2Squared = v[2] * v[2]; const float vsv = v2Squared * screenWidthSquared + v0Squared; const float p = (2.0 * screenWidthSquared * pOne2MinusCurveDist * v[2] + 2.0 * p1[0] * v[0] - v[0] * screenWidth) / vsv; const float q = (-screenWidthSquared * curveDistSquaredPlusQuarter + screenWidthSquared * pOne2MinusCurveDist * pOne2MinusCurveDist + 0.25 * screenWidthSquared + p1[0] * p1[0] - p1[0] * screenWidth) / vsv; const float rq = 0.25 * p * p - q; const float ph = -p * 0.5; if (rq < 0.0) { vertex[0] = -1000; vertex[1] = -1000; return; } else { alpha = ph + sqrt(rq); if (p1[2] + (alpha * v[2]) > 0.0) { vertex[0] = -1000; vertex[1] = -1000; return; } } } vertex[0] = ceil (p1[0] + (alpha * v[0])); vertex[1] = ceil (p1[1] + (alpha * v[1])); } void ExpoScreen::paintWall (const GLScreenPaintAttrib &attrib, const GLMatrix& transform, const CompRegion& region, CompOutput *output, unsigned int mask, bool reflection) { GLfloat vertexData[12]; GLushort colorData[16]; GLMatrix sTransformW, sTransform (transform); CompPoint vpSize (screen->vpSize ().width (), screen->vpSize ().height ()); /* amount of gap between viewports */ const float gapY = optionGetVpDistance () * 0.1f * expoCam; const float gapX = optionGetVpDistance () * 0.1f * screen->height () / screen->width () * expoCam; int glPaintTransformedOutputIndex = gScreen->glPaintTransformedOutputGetCurrentIndex (); GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); // Make sure that the base glPaintTransformedOutput function is called gScreen->glPaintTransformedOutputSetCurrentIndex (MAXSHORT); /* Zoom animation stuff */ /* camera position for the selected viewport */ GLVector vpCamPos (0, 0, 0, 0); /* camera position during expo mode */ GLVector expoCamPos (0, 0, 0, 0); float sx = screen->width () / static_cast (output->width ()); float sy = screen->height () / static_cast (output->height ()); if (optionGetDeform () == DeformCurve) vpCamPos[GLVector::x] = -sx * (0.5 - ((static_cast (output->x ()) + output->width () / 2.0) / static_cast (screen->width ()))); else vpCamPos[GLVector::x] = screen->vp ().x () * sx + 0.5 + output->x () / output->width () - vpSize.x () * 0.5 * sx + gapX * screen->vp ().x (); vpCamPos[GLVector::y] = -(screen->vp ().y () * sy + 0.5 + output->y () / output->height ()) + vpSize.y () * 0.5 * sy - gapY * screen->vp ().y (); float biasZ = MAX (vpSize.x () * sx, vpSize.y () * sy); if (optionGetDeform () == DeformTilt || optionGetReflection ()) biasZ *= (0.15 + optionGetDistance ()); else biasZ *= optionGetDistance (); float progress = sigmoidProgress (expoCam); if (optionGetDeform () != DeformCurve) expoCamPos[GLVector::x] = gapX * (vpSize.x () - 1) * 0.5; expoCamPos[GLVector::y] = -gapY * (vpSize.y () - 1) * 0.5; expoCamPos[GLVector::z] = -DEFAULT_Z_CAMERA + DEFAULT_Z_CAMERA * (MAX (vpSize.x () + (vpSize.x () - 1) * gapX, vpSize.y () + (vpSize.y () - 1) * gapY) + biasZ); /* interpolate between vpCamPos and expoCamPos */ GLVector cam; cam[GLVector::x] = vpCamPos[GLVector::x] * (1 - progress) + expoCamPos[GLVector::x] * progress; cam[GLVector::y] = vpCamPos[GLVector::y] * (1 - progress) + expoCamPos[GLVector::y] * progress; cam[GLVector::z] = vpCamPos[GLVector::z] * (1 - progress) + expoCamPos[GLVector::z] * progress; float aspectX = 1.0f, aspectY = 1.0f; if (vpSize.x () > vpSize.y ()) { aspectY = vpSize.x () / static_cast (vpSize.y ()); aspectY -= 1.0; aspectY *= -optionGetAspectRatio () + 1.0; aspectY *= progress; aspectY += 1.0; } else { aspectX = vpSize.y () / static_cast (vpSize.x ()); aspectX -= 1.0; aspectX *= -optionGetAspectRatio () + 1.0; aspectX *= progress; aspectX += 1.0; } /* End of Zoom animation stuff */ float rotation = 0.0f; if (optionGetDeform () == DeformTilt) { if (optionGetExpoAnimation () == ExpoAnimationZoom) rotation = 10.0 * sigmoidProgress (expoCam); else rotation = 10.0 * expoCam; } GLenum oldFilter = gScreen->textureFilter (); if (optionGetMipmaps ()) gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); /* ALL TRANSFORMATION ARE EXECUTED FROM BOTTOM TO TOP */ float oScale = 1 / (1 + ((MAX (sx, sy) - 1) * progress)); sTransform.scale (oScale, oScale, 1.0); /* zoom out */ oScale = DEFAULT_Z_CAMERA / (cam[GLVector::z] + DEFAULT_Z_CAMERA); sTransform.scale (oScale, oScale, oScale); // glNormal3f (0.0, 0.0, -oScale); sTransform.translate (-cam[GLVector::x], -cam[GLVector::y], -cam[GLVector::z] - DEFAULT_Z_CAMERA); if (reflection) { float scaleFactor = optionGetScaleFactor (); sTransform.translate (0.0, (vpSize.y () + ((vpSize.y () - 1) * gapY * 2)) * -sy * aspectY, 0.0); sTransform.scale (1.0, -1.0, 1.0); sTransform.translate (0.0, - (1 - scaleFactor) / 2 * sy * aspectY * (vpSize.y () + ((vpSize.y () - 1) * gapY * 2)), 0.0); sTransform.scale (1.0, scaleFactor, 1.0); glCullFace (GL_FRONT); } /* rotate */ sTransform.rotate (rotation, 0.0f, 1.0f, 0.0f); sTransform.scale (aspectX, aspectY, 1.0); CompPoint offsetInScreenCoords (optionGetXOffset (), optionGetYOffset ()); float offsetInWorldCoordX, offsetInWorldCoordY, worldScaleFactorX, worldScaleFactorY; compiz::expo::calculateWallOffset (*output, offsetInScreenCoords, vpSize, *screen, offsetInWorldCoordX, offsetInWorldCoordY, worldScaleFactorX, worldScaleFactorY, sigmoidProgress (expoCam)); /* translate expo to center */ sTransform.translate (vpSize.x () * sx * -0.5 + offsetInWorldCoordX, vpSize.y () * sy * 0.5 - offsetInWorldCoordY, 0.0f); sTransform.scale (worldScaleFactorX, worldScaleFactorY, 1.0f); if (optionGetDeform () == DeformCurve) sTransform.translate ((vpSize.x () - 1) * sx * 0.5, 0.0, 0.0); sTransformW = sTransform; /* revert prepareXCoords region shift. Now all screens display the same */ sTransform.translate (0.5f, -0.5f, DEFAULT_Z_CAMERA); if (vpSize.x () > 2) /* we can't have 90 degree for the left/right most viewport */ curveAngle = interpolate (359 / ((vpSize.x () - 1) * 2), 1, optionGetCurve ()); else curveAngle = interpolate (180 / vpSize.x (), 1, optionGetCurve ()); const float halfGapX = gapX / 2.0; curveDistance = ((0.5f * sx) + halfGapX) / tanf ((M_PI / 360.0f) * curveAngle); curveRadius = ((0.5f * sx) + halfGapX) / sinf ((M_PI / 360.0f) * curveAngle); expoActive = true; float rotateX, vpp; int vp; for (int j = 0; j < vpSize.y (); ++j) { GLMatrix sTransform2 (sTransform), sTransform3; for (int i = 0; i < vpSize.x (); ++i) { if (optionGetExpoAnimation () == ExpoAnimationVortex) sTransform2.rotate (360 * expoCam, 0.0f, 1.0f, 2.0f * expoCam); sTransform3 = sTransform2; sTransform3.translate ( output->x () / static_cast (output->width ()), -output->y () / static_cast (output->height ()), 0.0); cScreen->setWindowPaintOffset ((screen->vp ().x () - i) * screen->width (), (screen->vp ().y () - j) * screen->height ()); vp = (j * vpSize.x ()) + i; vpp = (expoCam * vpActivity[vp]) + (1 - expoCam); vpp = sigmoidProgress (vpp); vpBrightness = vpp + ((1.0 - vpp) * optionGetVpBrightness () / 100.0); vpSaturation = vpp + ((1.0 - vpp) * optionGetVpSaturation () / 100.0); paintingVp.set (i, j); if (optionGetDeform () == DeformCurve) { sTransform3.translate (-vpCamPos[GLVector::x], 0.0f, curveDistance - DEFAULT_Z_CAMERA); rotateX = -i + interpolate ((static_cast (vpSize.x ()) / 2.0) - 0.5, screen->vp ().x (), progress); sTransform3.rotate (curveAngle * rotateX, 0.0, 1.0, 0.0); sTransform3.translate (vpCamPos[GLVector::x], 0.0f, DEFAULT_Z_CAMERA - curveDistance); } gScreen->glPaintTransformedOutput (attrib, sTransform3, screen->region (), output, mask); if (!reflection) { int cursor[2] = { pointerX, pointerY }; invertTransformedVertex (attrib, sTransform3, output, cursor); if (cursor[0] > 0 && cursor[0] < static_cast (screen->width ()) && cursor[1] > 0 && cursor[1] < static_cast (screen->height ())) { newCursor.setX (i * screen->width () + cursor[0]); newCursor.setY (j * screen->height () + cursor[1]); if (anyClick || dndState != DnDNone) { /* Used to save last viewport interaction was in */ lastSelectedVp = selectedVp; selectedVp.set (i, j); anyClick = false; } } } /* not sure this will work with different resolutions */ if (optionGetDeform () != DeformCurve) sTransform2.translate (sx + gapX, 0.0f, 0.0); } /* not sure this will work with different resolutions */ sTransform.translate (0.0, -(sy + gapY), 0.0f); } // glNormal3f (0.0, 0.0, -1.0); if (reflection) { GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); /* just enable blending if it is disabled */ if (!glBlendEnabled) glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (optionGetDeform () != DeformCurve) { streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = 0; colorData[1] = 0; colorData[2] = 0; colorData[3] = 65535; colorData[4] = 0; colorData[5] = 0; colorData[6] = 0; colorData[7] = 32768; colorData[8] = 0; colorData[9] = 0; colorData[10] = 0; colorData[11] = 65535; colorData[12] = 0; colorData[13] = 0; colorData[14] = 0; colorData[15] = 32768; vertexData[0] = 0; vertexData[1] = 0; vertexData[2] = 0; vertexData[3] = 0; vertexData[4] = -vpSize.y () * (sy + gapY); vertexData[5] = 0; vertexData[6] = vpSize.x () * sx * (1.0 + gapX); vertexData[7] = 0; vertexData[8] = 0; vertexData[9] = vpSize.x () * sx * (1.0 + gapX); vertexData[10] = -vpSize.y () * sy * (1.0 + gapY); vertexData[11] = 0; streamingBuffer->addColors (4, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransformW); } else { GLMatrix cTransform; cTransform.translate (0.0, 0.0, -DEFAULT_Z_CAMERA); glCullFace (GL_BACK); streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = 0; colorData[1] = 0; colorData[2] = 0; colorData[3] = (1.0 * expoCam) * 65535; colorData[4] = 0; colorData[5] = 0; colorData[6] = 0; colorData[7] = (1.0 * expoCam) * 65535; colorData[8] = 0; colorData[9] = 0; colorData[10] = 0; colorData[11] = (0.5 * expoCam) * 65535; colorData[12] = 0; colorData[13] = 0; colorData[14] = 0; colorData[15] = (0.5 * expoCam) * 65535; vertexData[0] = -0.5; vertexData[1] = -0.5; vertexData[2] = 0; vertexData[3] = 0.5; vertexData[4] = -0.5; vertexData[5] = 0; vertexData[6] = -0.5; vertexData[7] = 0; vertexData[8] = 0; vertexData[9] = 0.5; vertexData[10] = 0; vertexData[11] = 0; streamingBuffer->addColors (4, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (cTransform); streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = 0; colorData[1] = 0; colorData[2] = 0; colorData[3] = (0.5 * expoCam) * 65535; colorData[4] = 0; colorData[5] = 0; colorData[6] = 0; colorData[7] = (0.5 * expoCam) * 65535; colorData[8] = 0; colorData[9] = 0; colorData[10] = 0; colorData[11] = 0; colorData[12] = 0; colorData[13] = 0; colorData[14] = 0; colorData[15] = 0; vertexData[0] = -0.5; vertexData[1] = 0; vertexData[2] = 0; vertexData[3] = 0.5; vertexData[4] = 0; vertexData[5] = 0; vertexData[6] = -0.5; vertexData[7] = 0.5; vertexData[8] = 0; vertexData[9] = 0.5; vertexData[10] = 0.5; vertexData[11] = 0; streamingBuffer->addColors (4, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (cTransform); } glCullFace (GL_BACK); if (optionGetGroundSize () > 0.0) { float groundSize = optionGetGroundSize (); GLMatrix gTransform; gTransform.translate (0.0, 0.0, -DEFAULT_Z_CAMERA); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = -0.5; vertexData[1] = -0.5; vertexData[2] = 0; vertexData[3] = 0.5; vertexData[4] = -0.5; vertexData[5] = 0; vertexData[6] = -0.5; vertexData[7] = -0.5 + groundSize; vertexData[8] = 0; vertexData[9] = 0.5; vertexData[10] = -0.5 + groundSize; vertexData[11] = 0; streamingBuffer->addColors (1, optionGetGroundColor1 ()); streamingBuffer->addColors (1, optionGetGroundColor1 ()); streamingBuffer->addColors (1, optionGetGroundColor2 ()); streamingBuffer->addColors (1, optionGetGroundColor2 ()); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (gTransform); } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); /* just disable blending if it was disabled before */ if (!glBlendEnabled) glDisable (GL_BLEND); } expoActive = false; cScreen->setWindowPaintOffset (0, 0); gScreen->glPaintTransformedOutputSetCurrentIndex (glPaintTransformedOutputIndex); gScreen->setTextureFilter (oldFilter); } bool ExpoScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (expoCam > 0.0) mask |= PAINT_SCREEN_TRANSFORMED_MASK | PAINT_SCREEN_CLEAR_MASK; return gScreen->glPaintOutput (attrib, transform, region, output, mask); } void ExpoScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { expoActive = false; if (expoCam > 0) mask |= PAINT_SCREEN_CLEAR_MASK; if (optionGetExpoAnimation () == ExpoScreen::ExpoAnimationZoom) { vpBrightness = 0.0f; vpSaturation = 0.0f; } else { vpBrightness = (1.0f - sigmoidProgress (expoCam)); vpSaturation = (1.0f - sigmoidProgress (expoCam)); } if (expoCam <= 0 || (expoCam > 0.0 && expoCam < 1.0 && optionGetExpoAnimation () != ExpoAnimationZoom)) gScreen->glPaintTransformedOutput (attrib, transform, region, output, mask); else gScreen->clearOutput (output, GL_COLOR_BUFFER_BIT); mask &= ~PAINT_SCREEN_CLEAR_MASK; if (expoCam > 0.0) { if (optionGetReflection ()) paintWall (attrib, transform, region, output, mask, true); paintWall (attrib, transform, region, output, mask, false); anyClick = false; } } bool ExpoWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { if (eScreen->expoCam == 0.0f) return gWindow->glDraw (transform, attrib, region, mask); // Scaling factors to be applied to attrib later in glDrawTexture expoOpacity = 1.0f; int expoAnimation = eScreen->optionGetExpoAnimation (); if (eScreen->expoActive) { if (expoAnimation != ExpoScreen::ExpoAnimationZoom) expoOpacity = eScreen->expoCam; if (window->wmType () & CompWindowTypeDockMask && eScreen->optionGetHideDocks ()) { if (expoAnimation == ExpoScreen::ExpoAnimationZoom && eScreen->paintingVp == eScreen->selectedVp) expoOpacity = (1.0f - sigmoidProgress (eScreen->expoCam)); else expoOpacity = 0.0f; } } bool status = gWindow->glDraw (transform, attrib, region, mask); if (window->type () & CompWindowTypeDesktopMask && eScreen->optionGetSelectedColor ()[3] && // colour is visible mGlowQuads && eScreen->paintingVp == eScreen->selectedVp && region.numRects ()) { /* reset geometry and paint */ gWindow->vertexBuffer ()->begin (); gWindow->vertexBuffer ()->end (); paintGlow (transform, attrib, infiniteRegion, mask); } return status; } static const unsigned short EXPO_GRID_SIZE = 100; void ExpoWindow::glAddGeometry (const GLTexture::MatrixList &matrices, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { if (eScreen->expoCam > 0.0 && screen->desktopWindowCount () && eScreen->optionGetDeform () == ExpoScreen::DeformCurve) { gWindow->glAddGeometry (matrices, region, clip, MIN (maxGridWidth, EXPO_GRID_SIZE), maxGridHeight); int stride = gWindow->vertexBuffer ()->getVertexStride (); int oldVCount = gWindow->vertexBuffer ()->countVertices (); GLfloat *v = gWindow->vertexBuffer ()->getVertices (); v += stride - 3; v += stride * oldVCount; CompPoint offset; if (!window->onAllViewports ()) { offset = eScreen->cScreen->windowPaintOffset (); offset = window->getMovementForOffset (offset); } float ang; float lastX = -1000000000.0f; float lastZ = 0.0f; const float radSquare = pow (eScreen->curveDistance, 2) + 0.25; for (int i = oldVCount; i < gWindow->vertexBuffer ()->countVertices (); ++i) { if (v[0] == lastX) v[2] = lastZ; else if (v[0] + offset.x () >= -EXPO_GRID_SIZE && v[0] + offset.x () < screen->width () + EXPO_GRID_SIZE) { ang = ((v[0] + offset.x ()) / static_cast (screen->width ())) - 0.5; ang *= ang; if (ang < radSquare) { v[2] = eScreen->curveDistance - sqrt (radSquare - ang); v[2] *= sigmoidProgress (eScreen->expoCam); } } lastX = v[0]; lastZ = v[2]; v += stride; } } else gWindow->glAddGeometry (matrices, region, clip, maxGridWidth, maxGridHeight); } void ExpoWindow::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { GLWindowPaintAttrib wAttrib (attrib); if (eScreen->expoCam > 0.0) { wAttrib.opacity *= expoOpacity; wAttrib.brightness *= eScreen->vpBrightness; wAttrib.saturation *= eScreen->vpSaturation; } if (eScreen->expoCam > 0.0 && eScreen->optionGetDeform () == ExpoScreen::DeformCurve && eScreen->gScreen->lighting () && screen->desktopWindowCount ()) { CompPoint offset; if (!window->onAllViewports ()) { offset = eScreen->cScreen->windowPaintOffset (); offset = window->getMovementForOffset (offset); } GLVertexBuffer *vb = gWindow->vertexBuffer (); int stride = vb->getVertexStride (); GLfloat *v = vb->getVertices () + stride - 3; GLfloat normal[3]; int idx; float x; for (int i = 0; i < vb->countVertices (); ++i) { x = (v[0] + offset.x () - screen->width () / 2) * eScreen->curveAngle / screen->width (); while (x < 0) x += 360.0; idx = floor (x); normal[0] = -eScreen->vpNormals[idx * 3]; normal[1] = eScreen->vpNormals[(idx * 3) + 1]; normal[2] = eScreen->vpNormals[(idx * 3) + 2]; vb->addNormals (1, normal); v += stride; } /* I am not entirely certain if these ifdefs are necessary * since we should be doing normalization in the shader, * however I have them here for now */ #ifndef USE_GLES glEnable (GL_NORMALIZE); #endif gWindow->glDrawTexture (texture, transform, wAttrib, mask); #ifndef USE_GLES glDisable (GL_NORMALIZE); #endif } else { // glEnable (GL_NORMALIZE); gWindow->glDrawTexture (texture, transform, wAttrib, mask); // glDisable (GL_NORMALIZE); } } bool ExpoWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (eScreen->expoActive) { if (eScreen->expoCam > 0.0) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; float opacity = 1.0; bool zoomAnim = eScreen->optionGetExpoAnimation () == ExpoScreen::ExpoAnimationZoom; bool hide = eScreen->optionGetHideDocks () && (window->wmType () & CompWindowTypeDockMask); if (!zoomAnim) opacity = attrib.opacity * eScreen->expoCam; if (hide) { if (zoomAnim && eScreen->paintingVp == eScreen->selectedVp) opacity = attrib.opacity * (1 - sigmoidProgress (eScreen->expoCam)); else opacity = 0; } if (opacity <= 0) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; } return gWindow->glPaint (attrib, transform, region, mask); } bool ExpoWindow::damageRect (bool initial, const CompRect &rect) { if (eScreen->expoCam > 0.0f) eScreen->cScreen->damageScreen (); return cWindow->damageRect (initial, rect); } void ExpoWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { window->resizeNotify (dx, dy, dwidth, dheight); if (!(window->type () & CompWindowTypeDesktopMask)) { compLogMessage ("expo", CompLogLevelWarn, "Received a resizeNotify "\ "for a non-desktop window."); assert (window->type () & CompWindowTypeDesktopMask); return; } /* Desktop window was resized. Update our glowQuads. */ foreach (GLTexture *tex, eScreen->outline_texture) { GLTexture::Matrix mat = tex->matrix (); computeGlowQuads (&mat); } } #define EXPOINITBIND(opt, func) \ optionSet##opt##Initiate (boost::bind (&ExpoScreen::func, \ this, _1, _2, _3)); #define EXPOTERMBIND(opt, func) \ optionSet##opt##Terminate (boost::bind (&ExpoScreen::func, \ this, _1, _2, _3)); ExpoScreen::ExpoScreen (CompScreen *s) : PluginClassHandler (s), ExpoOptions (), cScreen (CompositeScreen::get (s)), gScreen (GLScreen::get (s)), expoCam (0.0f), expoActive (false), expoMode (false), dndState (DnDNone), dndWindow (NULL), origVp (s->vp ()), selectedVp (s->vp ()), lastSelectedVp (s->vp ()), vpUpdateMode (VPUpdateNone), clickTime (0), doubleClick (false), vpNormals (360 * 3), grabIndex (0), mGlowTextureProperties (&glowTextureProperties) { leftKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Left")); rightKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Right")); upKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Up")); downKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Down")); dragCursor = XCreateFontCursor (screen->dpy (), XC_fleur); EXPOINITBIND (ExpoKey, doExpo); EXPOTERMBIND (ExpoKey, termExpo); EXPOINITBIND (ExpoButton, doExpo); EXPOTERMBIND (ExpoButton, termExpo); EXPOINITBIND (ExpoEdge, doExpo); EXPOTERMBIND (ExpoButton, termExpo); EXPOINITBIND (DndButton, dndInit); EXPOTERMBIND (DndButton, dndFini); EXPOINITBIND (ExitButton, exitExpo); EXPOINITBIND (NextVpButton, nextVp); EXPOINITBIND (PrevVpButton, prevVp); ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); outline_texture = GLTexture::imageDataToTexture (mGlowTextureProperties->textureData, CompSize (mGlowTextureProperties->textureSize, mGlowTextureProperties->textureSize), GL_RGBA, GL_UNSIGNED_BYTE); } ExpoScreen::~ExpoScreen () { if (dragCursor != None) XFreeCursor (screen->dpy (), dragCursor); } ExpoWindow::ExpoWindow (CompWindow *w) : PluginClassHandler (w), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), eScreen (ExpoScreen::get (screen)), mGlowQuads (NULL), expoOpacity (1.0f) { WindowInterface::setHandler (window, false); CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); if (window->type () & CompWindowTypeDesktopMask) { foreach (GLTexture *tex, eScreen->outline_texture) { GLTexture::Matrix mat = tex->matrix (); computeGlowQuads (&mat); } window->resizeNotifySetEnabled (this, true); } } ExpoWindow::~ExpoWindow () { computeGlowQuads (NULL); } bool ExpoPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/expo/src/group_glow.h0000644000015301777760000003215212321343002023255 0ustar pbusernogroup00000000000000#ifndef _GROUP_GLOWTEX_H #define _GROUP_GLOWTEX_H /** * * Compiz group plugin * * group_glow.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ /* * glowTex */ static char glowTexRect[4097] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\14\377\377\377\14\377\377\377\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\14" "\377\377\377\14\377\377\377\22\377\377\377\22\377\377\377\22\377\377\377" "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377" "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377" "\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377" "\35\377\377\377\35\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\6\377\377\377\6\377\377\377\14\377\377\377\22\377\377\377\27\377\377" "\377\27\377\377\377\35\377\377\377#\377\377\377'\377\377\377'\377\377\377" "+\377\377\377+\377\377\377+\377\377\377+\377\377\377+\377\377\377+\377\377" "\377+\377\377\377+\377\377\377+\377\377\3771\377\377\3771\377\377\3771\377" "\377\3771\377\377\3771\377\377\3771\377\377\3771\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\22\377\377\377" "\27\377\377\377\35\377\377\377#\377\377\377+\377\377\3771\377\377\3776\377" "\377\377<\377\377\377>\377\377\377C\377\377\377I\377\377\377I\377\377\377" "I\377\377\377I\377\377\377I\377\377\377I\377\377\377I\377\377\377I\377\377" "\377L\377\377\377L\377\377\377L\377\377\377L\377\377\377L\377\377\377L\377" "\377\377L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\22\377\377\377\27\377\377\377#\377\377\377+\377\377\3776\377\377" "\377C\377\377\377L\377\377\377U\377\377\377]\377\377\377`\377\377\377d\377" "\377\377h\377\377\377k\377\377\377k\377\377\377k\377\377\377k\377\377\377" "k\377\377\377k\377\377\377k\377\377\377p\377\377\377p\377\377\377p\377\377" "\377p\377\377\377p\377\377\377p\377\377\377p\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\6\377\377\377\14\377\377\377\22\314\314\314\35\377\377\377'\377" "\377\3771\377\377\377>\357\357\357P\377\377\377]\363\363\363k\365\365\365" "v\365\365\365|\377\377\377\202\367\367\367\210\367\367\367\214\367\367\367" "\216\367\367\367\221\367\367\367\221\367\367\367\221\367\367\367\221\367" "\367\367\221\367\367\367\221\367\367\367\224\367\367\367\224\367\367\367" "\224\367\367\367\224\367\367\367\224\367\367\367\224\367\367\367\224\0\0" "\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\22\377\377\377\27\377" "\377\377'\377\377\3776\377\377\377I\377\377\377Y\377\377\377k\376\376\376" "y\377\377\377\210\377\377\377\224\377\377\377\235\377\377\377\245\377\377" "\377\253\377\377\377\255\377\377\377\262\377\377\377\262\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\266\377\377\377\266\377\377\377\266\377\377\377\266\377\377\377\266" "\377\377\377\266\377\377\377\266\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377" "\14\377\377\377\27\377\377\377#\377\377\3771\377\377\377I\377\377\377]\377" "\377\377r\377\377\377\205\377\377\377\231\377\377\377\247\377\377\377\263" "\377\377\377\275\377\377\377\304\377\377\377\310\377\377\377\313\377\377" "\377\316\377\377\377\320\377\377\377\320\377\377\377\320\377\377\377\320" "\377\377\377\320\377\377\377\320\377\377\377\322\377\377\377\322\377\377" "\377\322\377\377\377\322\377\377\377\322\377\377\377\322\377\377\377\322" "\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\22\377\377\377\35\377\377" "\377+\377\377\377>\377\377\377Y\377\377\377r\377\377\377\210\376\376\376" "\237\377\377\377\262\377\377\377\302\377\377\377\313\377\377\377\324\377" "\377\377\332\376\376\376\336\377\377\377\341\377\377\377\342\377\377\377" "\344\377\377\377\344\377\377\377\344\377\377\377\344\377\377\377\344\377" "\377\377\344\377\377\377\345\377\377\377\345\377\377\377\345\377\377\377" "\345\377\377\377\345\377\377\377\345\377\377\377\345\0\0\0\0\377\377\377" "\6\377\377\377\14\377\377\377\27\377\377\377#\377\377\3776\377\377\377P\377" "\377\377k\377\377\377\205\376\376\376\237\372\372\372\266\377\377\377\307" "\373\373\373\325\373\373\373\337\374\374\374\345\374\374\374\352\374\374" "\374\355\374\374\374\357\374\374\374\360\374\374\374\361\374\374\374\361" "\374\374\374\362\374\374\374\362\374\374\374\362\374\374\374\362\374\374" "\374\362\374\374\374\362\374\374\374\362\374\374\374\362\374\374\374\362" "\374\374\374\362\374\374\374\362\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\35\377\377\377+\377\377\377C\377\377\377]\377\377\377|\377\377\377" "\231\377\377\377\263\377\377\377\307\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\6\377\377\377\22\324\324\324#\377\377\3771\377\377\377L\363\363" "\363k\377\377\377\210\377\377\377\247\377\377\377\302\377\377\377\325\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\22\377\377" "\377#\377\377\377<\377\377\377U\377\377\377v\377\377\377\226\377\377\377" "\263\377\377\377\315\377\377\377\337\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\6\377\377\377\14\377\377\377\27\377\377\377'\377\377\377>\377\377\377]\377" "\377\377|\370\370\370\237\377\377\377\275\373\373\373\325\377\377\377\345" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\27\377" "\377\377+\377\377\377C\377\377\377`\377\377\377\202\377\377\377\247\377\377" "\377\304\377\377\377\332\377\377\377\352\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\6\377\377\377\14\377\377\377\27\377\377\377+\377\377\377C\377\377\377" "d\377\377\377\210\377\377\377\253\377\377\377\310\376\376\376\336\374\374" "\374\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377" "\35\377\377\377+\377\377\377I\377\377\377h\377\377\377\214\377\377\377\260" "\377\377\377\313\374\374\374\342\374\374\374\357\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\6\377\377\377\14\377\377\377\35\342\342\3421\377\377\377I\377" "\377\377k\377\377\377\216\377\377\377\262\377\377\377\316\374\374\374\344" "\377\377\377\360\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\35\377\377\3771\377\377\377L\377\377\377k\377\377\377\221\377\377" "\377\263\377\377\377\320\377\377\377\344\377\377\377\361\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377" "\377L\377\377\377k\377\377\377\221\377\377\377\263\377\377\377\320\377\377" "\377\344\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377" "\14\377\377\377\35\377\377\3771\377\377\377L\364\364\364p\377\377\377\221" "\372\372\372\266\377\377\377\320\374\374\374\345\377\377\377\362\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\377" "1\377\377\377L\377\377\377p\377\377\377\221\377\377\377\266\373\373\373\322" "\377\377\377\345\377\377\377\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377" "\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377p\377\377" "\377\221\377\377\377\266\373\373\373\322\377\377\377\345\377\377\377\362" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377" "\377\3771\377\377\377L\377\377\377p\377\377\377\221\377\377\377\266\373\373" "\373\322\377\377\377\345\377\377\377\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377" "p\367\367\367\224\377\377\377\266\377\377\377\322\377\377\377\345\374\374" "\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377" "\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224\377\377\377\266" "\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377" "\377\377p\367\367\367\224\377\377\377\266\377\377\377\322\377\377\377\345" "\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224\377\377" "\377\266\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377" "\377L\377\377\377p\367\367\367\224\377\377\377\266\377\377\377\322\377\377" "\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377" "\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224" "\377\377\377\266\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\377" "1\377\377\377L\377\377\377p\367\367\367\224\377\377\377\266\377\377\377\322" "\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", }; #endif compiz-0.9.11+14.04.20140409/plugins/expo/src/click_threshold/0000755000015301777760000000000012321344021024060 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/expo/src/click_threshold/tests/0000755000015301777760000000000012321344021025222 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/expo/src/click_threshold/tests/CMakeLists.txt0000644000015301777760000000105612321343002027762 0ustar pbusernogroup00000000000000if (NOT GTEST_FOUND) message ("Google Test not found - cannot build tests!") set (COMPIZ_BUILD_TESTING OFF) endif (NOT GTEST_FOUND) include_directories (${GTEST_INCLUDE_DIRS}) link_directories (${COMPIZ_LIBRARY_DIRS}) add_executable (compiz_test_expo_click_threshold ${CMAKE_CURRENT_SOURCE_DIR}/test-expo-click-threshold.cpp) target_link_libraries (compiz_test_expo_click_threshold compiz_expo_click_threshold ${GTEST_BOTH_LIBRARIES}) compiz_discover_tests (compiz_test_expo_click_threshold COVERAGE compiz_expo_click_threshold) compiz-0.9.11+14.04.20140409/plugins/expo/src/click_threshold/tests/test-expo-click-threshold.cpp0000644000015301777760000000465312321343002032741 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Renato Araujo Oliveira Filho */ #include #include "click-threshold.h" class ExpoClickThresholdTest : public ::testing::Test { }; TEST(ExpoClickThresholdTest, TestNotMove) { EXPECT_TRUE(compiz::expo::clickMovementInThreshold (10, 10, 10, 10)); } TEST(ExpoClickThresholdTest, TestMoveNearLeft) { EXPECT_TRUE(compiz::expo::clickMovementInThreshold (10, 10, 8, 8)); } TEST(ExpoClickThresholdTest, TestMoveNearRight) { EXPECT_TRUE(compiz::expo::clickMovementInThreshold (10, 10, 13, 13)); } TEST(ExpoClickThresholdTest, TestMoveFarLeft) { EXPECT_FALSE(compiz::expo::clickMovementInThreshold (10, 10, 1, 1)); } TEST(ExpoClickThresholdTest, TestMoveFarRight) { EXPECT_FALSE(compiz::expo::clickMovementInThreshold (10, 10, 30, 30)); } TEST(ExpoClickThresholdTest, TestMoveNearX) { EXPECT_TRUE(compiz::expo::clickMovementInThreshold (10, 10, 13, 10)); } TEST(ExpoClickThresholdTest, TestMoveNearY) { EXPECT_TRUE(compiz::expo::clickMovementInThreshold (10, 10, 10, 13)); } TEST(ExpoClickThresholdTest, TestMoveFarX) { EXPECT_FALSE(compiz::expo::clickMovementInThreshold (10, 10, 30, 10)); } TEST(ExpoClickThresholdTest, TestMoveFarY) { EXPECT_FALSE(compiz::expo::clickMovementInThreshold (10, 10, 10, 30)); } compiz-0.9.11+14.04.20140409/plugins/expo/src/click_threshold/CMakeLists.txt0000644000015301777760000000117212321343002026617 0ustar pbusernogroup00000000000000include_directories ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) link_directories (${GLIBMM_LIBRARY_DIRS} ${COMPIZ_LIBRARY_DIRS}) set ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/click-threshold.h ) set ( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/click-threshold.cpp ) add_library ( compiz_expo_click_threshold STATIC ${SRCS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) add_subdirectory ( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) target_link_libraries ( compiz_expo_click_threshold compiz_point ) compiz-0.9.11+14.04.20140409/plugins/expo/src/click_threshold/src/0000755000015301777760000000000012321344021024647 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/expo/src/click_threshold/src/click-threshold.cpp0000644000015301777760000000202112321343002030423 0ustar pbusernogroup00000000000000/** * * Compiz Expo plugin * * click-threshold.cpp * * Copyright © 2012 Canonical Ltd. * * Authors: * Renato Araujo Oliviera Filho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "click-threshold.h" #include static const unsigned short DND_THRESHOLD = 5; bool compiz::expo::clickMovementInThreshold (int previousX, int previousY, int currentX, int currentY) { if ((abs (previousX - currentX) <= DND_THRESHOLD) && (abs (previousY - currentY) <= DND_THRESHOLD)) return true; else return false; } compiz-0.9.11+14.04.20140409/plugins/expo/src/click_threshold/include/0000755000015301777760000000000012321344021025503 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/expo/src/click_threshold/include/click-threshold.h0000644000015301777760000000167212321343002030737 0ustar pbusernogroup00000000000000/** * * Compiz Expo plugin * * click-threshold.h * * Copyright © 2012 Canonical Ltd. * * Authors: * Renato Araujo Oliviera Filho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef _COMPIZ_EXPO_CLICK_THRESHOLD_H #define _COMPIZ_EXPO_CLICK_THRESHOLD_H #include namespace compiz { namespace expo { bool clickMovementInThreshold (int previousX, int previousY, int currentX, int currentY); } } #endif compiz-0.9.11+14.04.20140409/plugins/expo/src/glow.cpp0000644000015301777760000003445212321343002022401 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * glow.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "expo.h" #include "group_glow.h" const GlowTextureProperties glowTextureProperties = { /* GlowTextureRectangular */ glowTexRect, 32, 21 }; /* * GroupWindow::paintGlow * * Takes our glow texture, stretches the appropriate positions in the glow texture, * adds those geometries (so plugins like wobby deform this texture correctly) * and then draws the glow texture with this geometry (plugins like wobbly and friends * will automatically deform the texture based on our set geometry) */ void ExpoWindow::paintGlow (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion &paintRegion, unsigned int mask) { CompRegion reg; GLushort colorData[4]; const GLushort *selColorData = ExpoScreen::get (screen)->optionGetSelectedColor (); float alpha = static_cast (selColorData[3] / 65535.0f); /* Premultiply color */ colorData[0] = selColorData[0] * alpha; colorData[1] = selColorData[1] * alpha; colorData[2] = selColorData[2] * alpha; colorData[3] = selColorData[3]; gWindow->vertexBuffer ()->begin (); /* There are 8 glow parts of the glow texture which we wish to paint * separately with different transformations */ for (int i = 0; i < NUM_GLOWQUADS; ++i) { /* Using precalculated quads here */ reg = CompRegion (mGlowQuads[i].mBox); if (reg.boundingRect ().x1 () < reg.boundingRect ().x2 () && reg.boundingRect ().y1 () < reg.boundingRect ().y2 ()) { GLTexture::MatrixList matl; reg = CompRegion (reg.boundingRect ().x1 (), reg.boundingRect ().y1 (), reg.boundingRect ().width (), reg.boundingRect ().height ()); matl.push_back (mGlowQuads[i].mMatrix); /* Add color data for all 6 vertices of the quad */ for (int n = 0; n < 6; ++n) gWindow->vertexBuffer ()->addColors (1, colorData); gWindow->glAddGeometry (matl, reg, paintRegion); } } if (gWindow->vertexBuffer ()->end ()) { //GLScreen::get (screen)->setTexEnvMode (GL_MODULATE); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* we use PAINT_WINDOW_TRANSFORMED_MASK here to force the usage of a good texture filter */ foreach (GLTexture *tex, ExpoScreen::get (screen)->outline_texture) { gWindow->glDrawTexture (tex, transform, attrib, mask | PAINT_WINDOW_BLEND_MASK | PAINT_WINDOW_TRANSLUCENT_MASK | PAINT_WINDOW_TRANSFORMED_MASK); } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); GLScreen::get (screen)->setTexEnvMode (GL_REPLACE); } } /* * ExpoWindow::computeGlowQuads * * This function computes the matrix transformation required for each * part of the glow texture which we wish to stretch to some rectangular * dimensions * * There are eight quads different parts of the texture which we wish to * paint here, the 4 sides and four corners, eg: * * ------------------ * | 1 | 4 | 6 | * ------------- ------------------ * | 1 | 4 | 6 | | | | | * ------------- | | | | * | 2 | n | 7 | -> | 2 | n | 7 | * ------------- | | | | * | 3 | 5 | 8 | | | | | * ------------- ------------------ * | 3 | 5 | 8 | * ------------------ * * In this example here, 2, 4, 5 and 7 are stretched, and the matrices for * each quad rect adjusted accordingly for it's size compared to the original * texture size. * * When we are adjusting the matrices here, the initial size of each corner has * a size of of "1.0f", so according to 2x2 matrix rules, * the scale factor is the inverse of the size of the glow (which explains * while you will see here that matrix->xx is (1 / glowSize) * where glowSize is the size the user specifies they want their glow to extend. * (likewise, matrix->yy is adjusted similarly for corners and for top/bottom) * * matrix->x0 and matrix->y0 here are set to be the top left edge of the rect * adjusted by the matrix scale factor (matrix->xx and matrix->yy) * */ void ExpoWindow::computeGlowQuads (GLTexture::Matrix *matrix) { /* Passing NULL to this function frees the glow quads * (so the window is not painted with glow) */ if (matrix) { if (!mGlowQuads) mGlowQuads = new GlowQuad[NUM_GLOWQUADS]; if (!mGlowQuads) return; } else { if (mGlowQuads) { delete[] mGlowQuads; mGlowQuads = NULL; } return; } /* TODO: Make glowSize configurable via CCSM */ int glowSize = 48; int glowOffset = (glowSize * ExpoScreen::get (screen)->mGlowTextureProperties->glowOffset / ExpoScreen::get (screen)->mGlowTextureProperties->textureSize) + 1; /* Top left corner */ CompRect *box = &mGlowQuads[GLOWQUAD_TOPLEFT].mBox; mGlowQuads[GLOWQUAD_TOPLEFT].mMatrix = *matrix; GLTexture::Matrix *quadMatrix = &mGlowQuads[GLOWQUAD_TOPLEFT].mMatrix; /* Precalculate some values we need multiple times */ CompWindow *w = window; int winRealX = w->x () - w->border ().left; int winRealY = w->y () - w->border ().top; /* Set the desired rect dimensions * for the part of the glow we are painting */ int x1 = winRealX - glowSize + glowOffset; int y1 = winRealY - glowSize + glowOffset; int winRealWidth = w->geometry ().widthIncBorders (); int winRealHeight = w->geometry ().heightIncBorders (); int halfWinRealWidth = winRealWidth / 2; int halfWinRealHeight = winRealHeight / 2; int xPlusHalfWidth = winRealX + halfWinRealWidth; int yPlusHalfHeight = winRealY + halfWinRealHeight; int xPlusGlowOff = winRealX + glowOffset; int yPlusGlowOff = winRealY + glowOffset; int xMinusGlowOff = winRealX - glowOffset; int yMinusGlowOff = winRealY - glowOffset; float glowPart = 1.0f / glowSize; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling both parts of the texture in a positive direction * here (left to right top to bottom) * * The base position (x0 and y0) here requires us to move backwards * on the x and y dimensions by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = quadMatrix->yy = glowPart; quadMatrix->x0 = -(x1 * quadMatrix->xx); quadMatrix->y0 = -(y1 * quadMatrix->yy); int x2 = MIN (xPlusGlowOff, xPlusHalfWidth); int y2 = MIN (yPlusGlowOff, yPlusHalfHeight); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Top right corner */ box = &mGlowQuads[GLOWQUAD_TOPRIGHT].mBox; mGlowQuads[GLOWQUAD_TOPRIGHT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_TOPRIGHT].mMatrix; /* Set the desired rect dimensions * for the part of the glow we are painting */ x1 = xMinusGlowOff + winRealWidth; y1 = yPlusGlowOff - glowSize; x2 = x1 + glowSize; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling the y part of the texture in a positive direction * and the x part in a negative direction here * (right to left top to bottom) * * The base position (x0 and y0) here requires us to move backwards * on the y dimension and forwards on x by the calculated rect dimensions * multiplied by the scale factors (since we are moving forward on x we * need the inverse of that which is 1 - x1 * xx */ quadMatrix->xx = -glowPart; quadMatrix->yy = glowPart; quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx); quadMatrix->y0 = -(y1 * quadMatrix->yy); x1 = MAX (xMinusGlowOff + winRealWidth, xPlusHalfWidth); y2 = MIN (yPlusGlowOff, yPlusHalfHeight); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Bottom left corner */ box = &mGlowQuads[GLOWQUAD_BOTTOMLEFT].mBox; mGlowQuads[GLOWQUAD_BOTTOMLEFT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOMLEFT].mMatrix; x1 = xPlusGlowOff - glowSize; y1 = yMinusGlowOff + winRealHeight; /* x2 = xPlusGlowOff; */ y2 = yMinusGlowOff + winRealHeight + glowSize; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling the x part of the texture in a positive direction * and the y part in a negative direction here * (left to right bottom to top) * * The base position (x0 and y0) here requires us to move backwards * on the x dimension and forwards on y by the calculated rect dimensions * multiplied by the scale factors (since we are moving forward on x we * need the inverse of that which is 1 - y1 * yy */ quadMatrix->xx = glowPart; quadMatrix->yy = -glowPart; quadMatrix->x0 = -(x1 * quadMatrix->xx); quadMatrix->y0 = 1.0f - (y1 * quadMatrix->yy); y1 = MAX (winRealY + winRealHeight - glowOffset, yPlusHalfHeight); x2 = MIN (xPlusGlowOff, xPlusHalfWidth); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Bottom right corner */ box = &mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mBox; mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mMatrix; x1 = xMinusGlowOff + winRealWidth; y1 = yMinusGlowOff + winRealHeight; x2 = x1 + glowSize; y2 = y1 + glowSize; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling the both parts of the texture in a negative direction * (right to left bottom to top) * * The base position (x0 and y0) here requires us to move forwards * on both dimensions by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = -glowPart; quadMatrix->yy = -glowPart; quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx); quadMatrix->y0 = 1.0 - (y1 * quadMatrix->yy); x1 = MAX (xMinusGlowOff + winRealWidth, xPlusHalfWidth); y1 = MAX (yMinusGlowOff + winRealHeight, yPlusHalfHeight); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Top edge */ box = &mGlowQuads[GLOWQUAD_TOP].mBox; mGlowQuads[GLOWQUAD_TOP].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_TOP].mMatrix; x1 = xPlusGlowOff; y1 = yPlusGlowOff - glowSize; x2 = xMinusGlowOff + winRealWidth; y2 = yPlusGlowOff; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the x part of the texture here, but we * are scaling on the y part in a positive direciton * * The base position (y0) here requires us to move backwards * on the x dimension and forwards on y by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = 0.0f; quadMatrix->yy = glowPart; quadMatrix->x0 = 1.0; quadMatrix->y0 = -(y1 * quadMatrix->yy); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Bottom edge */ box = &mGlowQuads[GLOWQUAD_BOTTOM].mBox; mGlowQuads[GLOWQUAD_BOTTOM].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOM].mMatrix; x1 = xPlusGlowOff; y1 = yMinusGlowOff + winRealHeight; x2 = xMinusGlowOff + winRealWidth; y2 = y1 + glowSize; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the x part of the texture here, but we * are scaling on the y part in a negative direciton * * The base position (y0) here requires us to move forwards * on y by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = 0.0f; quadMatrix->yy = -glowPart; quadMatrix->x0 = 1.0; quadMatrix->y0 = 1.0 - (y1 * quadMatrix->yy); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Left edge */ box = &mGlowQuads[GLOWQUAD_LEFT].mBox; mGlowQuads[GLOWQUAD_LEFT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_LEFT].mMatrix; x1 = xPlusGlowOff - glowSize; y1 = yPlusGlowOff; x2 = xPlusGlowOff; y2 = yMinusGlowOff + winRealHeight; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the y part of the texture here, but we * are scaling on the x part in a positive direciton * * The base position (x0) here requires us to move backwards * on x by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = glowPart; quadMatrix->yy = 0.0f; quadMatrix->x0 = -(x1 * quadMatrix->xx); quadMatrix->y0 = 1.0; *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Right edge */ box = &mGlowQuads[GLOWQUAD_RIGHT].mBox; mGlowQuads[GLOWQUAD_RIGHT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_RIGHT].mMatrix; x1 = xMinusGlowOff + winRealWidth; y1 = yPlusGlowOff; x2 = xMinusGlowOff + winRealWidth + glowSize; y2 = yMinusGlowOff + winRealHeight; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the y part of the texture here, but we * are scaling on the x part in a negative direciton * * The base position (x0) here requires us to move forwards * on x by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = -glowPart; quadMatrix->yy = 0.0f; quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx); quadMatrix->y0 = 1.0; *box = CompRect (x1, y1, x2 - x1, y2 - y1); } compiz-0.9.11+14.04.20140409/plugins/expo/src/wall_offset/0000755000015301777760000000000012321344021023224 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/expo/src/wall_offset/tests/0000755000015301777760000000000012321344021024366 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/expo/src/wall_offset/tests/test-expo-wall-offset.cpp0000644000015301777760000002172212321343002031245 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include "wall-offset.h" using ::testing::WithParamInterface; using ::testing::ValuesIn; using ::testing::Combine; using ::testing::Range; class ExpoWallOffsetTest : public ::testing::Test { protected: float offsetInWorldX; float offsetInWorldY; float worldScaleFactorX; float worldScaleFactorY; }; namespace { const unsigned int nAnimationsBegin = 0; const unsigned int nAnimationSteps = 20; struct OffsetAnimationParameters { float offsetInWorldX; float offsetInWorldY; float worldScaleFactorX; float worldScaleFactorY; }; struct OffsetParameters { float offsetX; float offsetY; int vpSizeWidth; int vpSizeHeight; int screenWidth; int screenHeight; int outputWidth; int outputHeight; OffsetAnimationParameters animationParameters[20]; }; const OffsetParameters testingOffsetParameters[] = { { 0, 0, 1, 1, 100, 100, 100, 100, { { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 } } }, /* Monitor 1280x800, Screen: 1280x800, Viewport Layout: 2x2, Offset: 32, 24 */ { 32, 24, 2, 2, 1280, 800, 1280, 800, { { 0, 0, 1, 1 }, { 0.0025000001769512892, 0.0011718750465661287, 0.99874997138977051, 0.99906247854232788 }, { 0.0050000003539025784, 0.0023437500931322575, 0.99750000238418579, 0.99812501668930054 }, { 0.0075000002980232239, 0.0035156251396983862, 0.9962499737739563, 0.99718749523162842 }, { 0.010000000707805157, 0.0046875001862645149, 0.99500000476837158, 0.9962499737739563 }, { 0.012500000186264515, 0.005859375, 0.99374997615814209, 0.99531251192092896 }, { 0.015000000596046448, 0.0070312502793967724, 0.99250000715255737, 0.99437499046325684 }, { 0.017500000074505806, 0.0082031246274709702, 0.99124997854232788, 0.99343752861022949 }, { 0.020000001415610313, 0.0093750003725290298, 0.99000000953674316, 0.99250000715255737 }, { 0.022499999031424522, 0.01054687425494194, 0.98874998092651367, 0.99156248569488525 }, { 0.02500000037252903, 0.01171875, 0.98750001192092896, 0.99062502384185791 }, { 0.027500001713633537, 0.01289062574505806, 0.98624998331069946, 0.98968750238418579 }, { 0.030000001192092896, 0.014062500558793545, 0.98500001430511475, 0.98874998092651367 }, { 0.032499998807907104, 0.015234374441206455, 0.98374998569488525, 0.98781251907348633 }, { 0.035000000149011612, 0.01640624925494194, 0.98250001668930054, 0.98687499761581421 }, { 0.037500001490116119, 0.017578125, 0.98124998807907104, 0.98593747615814209 }, { 0.040000002831220627, 0.01875000074505806, 0.98000001907348633, 0.98500001430511475 }, { 0.042500000447034836, 0.019921876490116119, 0.97874999046325684, 0.98406249284744263 }, { 0.044999998062849045, 0.021093748509883881, 0.97750002145767212, 0.98312497138977051 }, { 0.047499999403953552, 0.02226562425494194, 0.97624999284744263, 0.98218750953674316 } } }, /* Monitor 1280x1024, Screen: 2560x1024, Viewport Layout: 2x2, Offset: 32, 24 */ { 32, 24, 2, 2, 2560, 1024, 1280, 1024, { { 0, 0, 1, 1 }, { 0.0050000003539025784, 0.001500000013038516, 0.99874997138977051, 0.99906247854232788 }, { 0.010000000707805157, 0.0030000000260770321, 0.99750000238418579, 0.99812501668930054 }, { 0.015000000596046448, 0.0045000002719461918, 0.9962499737739563, 0.99718749523162842 }, { 0.020000001415610313, 0.0060000000521540642, 0.99500000476837158, 0.9962499737739563 }, { 0.02500000037252903, 0.0074999998323619366, 0.99374997615814209, 0.99531251192092896 }, { 0.030000001192092896, 0.0090000005438923836, 0.99250000715255737, 0.99437499046325684 }, { 0.035000000149011612, 0.010499999858438969, 0.99124997854232788, 0.99343752861022949 }, { 0.040000002831220627, 0.012000000104308128, 0.99000000953674316, 0.99250000715255737 }, { 0.044999998062849045, 0.013499999418854713, 0.98874998092651367, 0.99156248569488525 }, { 0.05000000074505806, 0.014999999664723873, 0.98750001192092896, 0.99062502384185791 }, { 0.055000003427267075, 0.016499999910593033, 0.98624998331069946, 0.98968750238418579 }, { 0.060000002384185791, 0.018000001087784767, 0.98500001430511475, 0.98874998092651367 }, { 0.064999997615814209, 0.019499998539686203, 0.98374998569488525, 0.98781251907348633 }, { 0.070000000298023224, 0.020999999716877937, 0.98250001668930054, 0.98687499761581421 }, { 0.075000002980232239, 0.022499999031424522, 0.98124998807907104, 0.98593747615814209 }, { 0.080000005662441254, 0.024000000208616257, 0.98000001907348633, 0.98500001430511475 }, { 0.085000000894069672, 0.025499999523162842, 0.97874999046325684, 0.98406249284744263 }, { 0.08999999612569809, 0.026999998837709427, 0.97750002145767212, 0.98312497138977051 }, { 0.094999998807907104, 0.028499998152256012, 0.97624999284744263, 0.98218750953674316 } } }, }; typedef std::tr1::tuple AnimParam; } class ExpoWallOffsetTestAnimations : public ExpoWallOffsetTest, public ::testing::WithParamInterface { public: void RecordProperty (const char *name, float value) { ::testing::Message message; message << value; Test::RecordProperty (name, message.GetString ().c_str ()); } }; TEST_P (ExpoWallOffsetTestAnimations, TestAnimationValues) { const OffsetParameters &offset (std::tr1::get <0> (GetParam ())); const unsigned int &index (std::tr1::get <1> (GetParam ())); RecordProperty ("outputWidth", offset.outputWidth); RecordProperty ("outputHeight", offset.outputHeight); RecordProperty ("screenWidth", offset.screenWidth); RecordProperty ("screenHeight", offset.screenHeight); RecordProperty ("offsetX", offset.offsetX); RecordProperty ("offsetY", offset.offsetY); RecordProperty ("expected.offsetInWorldX", offset.animationParameters[index].offsetInWorldX); RecordProperty ("expected.offsetInWorldY", offset.animationParameters[index].offsetInWorldY); RecordProperty ("expected.worldScaleFactorX", offset.animationParameters[index].worldScaleFactorX); RecordProperty ("expected.worldScaleFactorY", offset.animationParameters[index].worldScaleFactorY); compiz::expo::calculateWallOffset (CompRect (0, 0, offset.outputWidth, offset.outputWidth), CompPoint (offset.offsetX, offset.offsetY), CompPoint (offset.vpSizeWidth, offset.vpSizeHeight), CompSize (offset.screenWidth, offset.screenHeight), offsetInWorldX, offsetInWorldY, worldScaleFactorX, worldScaleFactorY, index / static_cast (nAnimationSteps)); RecordProperty ("offsetInWorldX", offsetInWorldX); RecordProperty ("offsetInWorldY", offsetInWorldY); RecordProperty ("worldScaleFactorX", worldScaleFactorX); RecordProperty ("worldScaleFactorY", worldScaleFactorY); EXPECT_FLOAT_EQ (offsetInWorldX, offset.animationParameters[index].offsetInWorldX); EXPECT_FLOAT_EQ (offsetInWorldY, offset.animationParameters[index].offsetInWorldY); EXPECT_FLOAT_EQ (worldScaleFactorX, offset.animationParameters[index].worldScaleFactorX); EXPECT_FLOAT_EQ (worldScaleFactorY, offset.animationParameters[index].worldScaleFactorY); } INSTANTIATE_TEST_CASE_P (ExpoAnimationOffsetTest, ExpoWallOffsetTestAnimations, Combine (ValuesIn (testingOffsetParameters), Range (nAnimationsBegin, nAnimationSteps))); compiz-0.9.11+14.04.20140409/plugins/expo/src/wall_offset/tests/CMakeLists.txt0000644000015301777760000000102612321343002027123 0ustar pbusernogroup00000000000000if (NOT GTEST_FOUND) message ("Google Test not found - cannot build tests!") set (COMPIZ_BUILD_TESTING OFF) endif (NOT GTEST_FOUND) include_directories (${GTEST_INCLUDE_DIRS}) link_directories (${COMPIZ_LIBRARY_DIRS}) add_executable (compiz_test_expo_wall_offset ${CMAKE_CURRENT_SOURCE_DIR}/test-expo-wall-offset.cpp) target_link_libraries (compiz_test_expo_wall_offset compiz_expo_wall_offset ${GTEST_BOTH_LIBRARIES}) compiz_discover_tests (compiz_test_expo_wall_offset COVERAGE compiz_expo_wall_offset) compiz-0.9.11+14.04.20140409/plugins/expo/src/wall_offset/CMakeLists.txt0000644000015301777760000000115112321343002025760 0ustar pbusernogroup00000000000000include_directories ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) link_directories (${GLIBMM_LIBRARY_DIRS} ${COMPIZ_LIBRARY_DIRS}) set ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/wall-offset.h ) set ( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/wall-offset.cpp ) add_library ( compiz_expo_wall_offset STATIC ${SRCS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) add_subdirectory ( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) target_link_libraries ( compiz_expo_wall_offset compiz_core ) compiz-0.9.11+14.04.20140409/plugins/expo/src/wall_offset/src/0000755000015301777760000000000012321344021024013 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/expo/src/wall_offset/src/wall-offset.cpp0000644000015301777760000000347412321343002026750 0ustar pbusernogroup00000000000000/** * Copyright © 2012 Canonical Ltd. * * Authors: * Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "wall-offset.h" namespace compiz { namespace expo { void calculateWallOffset (const CompRect &output, const CompPoint &offsetInScreenCoords, const CompPoint &vpSize, const CompSize &screenSize, float &offsetInWorldX, float &offsetInWorldY, float &worldScaleFactorX, float &worldScaleFactorY, float animationProgress) { const float sx = screenSize.width () / static_cast (output.width ()); const float sy = screenSize.height () / static_cast (output.height ()); offsetInWorldX = 0.0; offsetInWorldY = 0.0; worldScaleFactorX = 1.0f; worldScaleFactorY = 1.0f; offsetInWorldX = ((vpSize.x () * sx) / ((float) output.width ()) * (offsetInScreenCoords.x ()) * animationProgress); worldScaleFactorX = 1.0f - ((float) (offsetInScreenCoords.x ()) / (float) (output.width ())) * animationProgress; offsetInWorldY = ((vpSize.y () * sy) / ((float) output.height ()) * (offsetInScreenCoords.y ()) * animationProgress); worldScaleFactorY = 1.0f - ((float) (offsetInScreenCoords.y ()) / (float) output.height ()) * animationProgress; } } } compiz-0.9.11+14.04.20140409/plugins/expo/src/wall_offset/include/0000755000015301777760000000000012321344021024647 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/expo/src/wall_offset/include/wall-offset.h0000644000015301777760000000224712321343002027246 0ustar pbusernogroup00000000000000/** * Copyright © 2012 Canonical Ltd. * * Authors: * Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef _COMPIZ_EXPO_WALL_OFFSET_H #define _COMPIZ_EXPO_WALL_OFFSET_H #include #include #include namespace compiz { namespace expo { void calculateWallOffset (const CompRect &output, const CompPoint &offsetInScreenCoords, const CompPoint &vpSize, const CompSize &screenSize, float &offsetInWorldX, float &offsetInWorldY, float &worldScaleFactorX, float &worldScaleFactorY, float animationProgress); } } #endif compiz-0.9.11+14.04.20140409/plugins/expo/src/glow.h0000644000015301777760000000347612321343002022050 0ustar pbusernogroup00000000000000/** * * Compiz group plugin * * glow.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef _EXPO_GLOW_H #define _EXPO_GLOW_H #define GLOWQUAD_TOPLEFT 0 #define GLOWQUAD_TOPRIGHT 1 #define GLOWQUAD_BOTTOMLEFT 2 #define GLOWQUAD_BOTTOMRIGHT 3 #define GLOWQUAD_TOP 4 #define GLOWQUAD_BOTTOM 5 #define GLOWQUAD_LEFT 6 #define GLOWQUAD_RIGHT 7 #define NUM_GLOWQUADS 8 /* Represents a particular glow texture, so here * we have hardcoded in the texture data, the offset * and the size of the texture */ typedef struct _GlowTextureProperties { char *textureData; int textureSize; int glowOffset; } GlowTextureProperties; /* Each glow quad contains a 2x2 scale + positional matrix * (the 3rd column is not used since that is for matrix skew * operations which we do not care about) * and also a CompRect which describes the size and position of * the quad on the glow */ class GlowQuad { public: CompRect mBox; GLTexture::Matrix mMatrix; }; extern const GlowTextureProperties glowTextureProperties; #endif compiz-0.9.11+14.04.20140409/plugins/expo/src/expo.h0000644000015301777760000001335612321343002022051 0ustar pbusernogroup00000000000000/** * * Compiz expo plugin * * expo.c * * Copyright (c) 2008 Dennis Kasprzyk * Copyright (c) 2006 Robert Carr * * Authors: * Robert Carr * Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include #include #include #include #include "expo_options.h" #include "glow.h" class ExpoScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler, public ExpoOptions { public: ExpoScreen (CompScreen *); ~ExpoScreen (); void handleEvent (XEvent *); void preparePaint (int); void paint (CompOutput::ptrList &, unsigned int ); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); bool dndInit (CompAction *, CompAction::State, CompOption::Vector&); bool dndFini (CompAction *, CompAction::State, CompOption::Vector&); bool doExpo (CompAction *, CompAction::State, CompOption::Vector&); bool exitExpo (CompAction *, CompAction::State, CompOption::Vector&); bool termExpo (CompAction *, CompAction::State, CompOption::Vector&); bool nextVp (CompAction *, CompAction::State, CompOption::Vector&); bool prevVp (CompAction *, CompAction::State, CompOption::Vector&); typedef enum { DnDNone, DnDDuring, DnDStart } DnDState; typedef enum { VPUpdateNone, VPUpdateMouseOver, VPUpdatePrevious } VPUpdateMode; CompositeScreen *cScreen; GLScreen *gScreen; float expoCam; bool expoActive; bool expoMode; DnDState dndState; CompWindow *dndWindow; CompPoint prevCursor; CompPoint newCursor; CompPoint prevClickPoint; CompPoint origVp; CompPoint selectedVp; CompPoint lastSelectedVp; CompPoint paintingVp; std::vector vpActivity; float vpBrightness; float vpSaturation; VPUpdateMode vpUpdateMode; bool anyClick; unsigned int clickTime; bool doubleClick; CompRegion tmpRegion; float curveAngle; float curveDistance; float curveRadius; std::vector vpNormals; CompScreen::GrabHandle grabIndex; GLTexture::List outline_texture; CompSize outline_texture_size; const GlowTextureProperties *mGlowTextureProperties; private: void moveFocusViewport (int, int); void finishWindowMovement (); void updateWraps (bool); void invertTransformedVertex (const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, int[2] ); void paintWall (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int , bool ); KeyCode leftKey; KeyCode rightKey; KeyCode upKey; KeyCode downKey; Cursor dragCursor; }; class ExpoWindow : public WindowInterface, public CompositeWindowInterface, public GLWindowInterface, public PluginClassHandler { public: ExpoWindow (CompWindow *); ~ExpoWindow (); bool damageRect (bool , const CompRect &); bool glDraw (const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int ); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); void glAddGeometry (const GLTexture::MatrixList &, const CompRegion &, const CompRegion &, unsigned int , unsigned int ); void glDrawTexture (GLTexture *, const GLMatrix &, const GLWindowPaintAttrib &, unsigned int ); void paintGlow (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion &paintRegion, unsigned int mask); void computeGlowQuads (GLTexture::Matrix *matrix); void resizeNotify (int, int, int, int); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; ExpoScreen *eScreen; private: GlowQuad *mGlowQuads; float expoOpacity; }; class ExpoPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/expo/expo.xml.in0000644000015301777760000002071212321343002022232 0ustar pbusernogroup00000000000000 <_short>Expo <_long>Expose all viewports and freely arrange open windows amongst them Desktop opengl composite opengl decor cube cubeaddon wobbly animation wallpaper <_short>Bindings <_short>Behaviour <_short>Appearance Inactive Viewports Reflection compiz-0.9.11+14.04.20140409/plugins/water/0000755000015301777760000000000012321344021020277 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/water/water.xml.in0000644000015301777760000000512112321343002022545 0ustar pbusernogroup00000000000000 <_short>Water Effect <_long>Adds water effects to different desktop actions Effects blur video decor opengl compiz-0.9.11+14.04.20140409/plugins/water/CMakeLists.txt0000644000015301777760000000015012321343002023031 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(water PLUGINDEPS composite opengl)compiz-0.9.11+14.04.20140409/plugins/water/src/0000755000015301777760000000000012321344021021066 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/water/src/water.cpp0000644000015301777760000004704112321343002022720 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman * Frederic Plourde */ #include "water.h" #include COMPIZ_PLUGIN_20090315 (water, WaterPluginVTable) const unsigned int TEXTURE_SIZE = 256; const float K = 0.1964f; static int waterLastPointerX = 0; static int waterLastPointerY = 0; GLfloat WaterScreen::vertexData [18] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, -1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, }; GLfloat WaterScreen::textureData [12] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, }; bool WaterScreen::fboPrologue (int fIndex) { if (!useFbo) return false; oldFbo = waterFbo[fIndex]->bind (); glGetIntegerv(GL_VIEWPORT, &oldViewport[0]); glViewport (0, 0, texWidth, texHeight); return true; } void WaterScreen::fboEpilogue () { GLFramebufferObject::rebind (oldFbo); glViewport (oldViewport[0], oldViewport[1], oldViewport[2], oldViewport[3]); } void WaterScreen::waterUpdate (float dt) { GLfloat fade = 1.0f; if (count < 1000) { if (count > 1) fade = 0.90f + (float) count / 10000.0f; else fade = 0.0f; } if (!fboPrologue (INDEX (this, 1))) return; glEnable (GL_TEXTURE_2D); vertexBuffer[UPDATE]->begin (); vertexBuffer[UPDATE]->addVertices (6, &vertexData[0]); vertexBuffer[UPDATE]->addTexCoords (0, 6, &textureData[0]); vertexBuffer[UPDATE]->end (); /* * Cleanup: * Use GLTexture facilities here, instead of manually setting active * texture, especially when there will be texture unit support */ glActiveTexture (GL_TEXTURE0); waterFbo[INDEX (this, 2)]->tex ()->setFilter (GL_NEAREST); glBindTexture (GL_TEXTURE_2D, waterFbo[INDEX (this, 2)]->tex ()->name ()); glActiveTexture (GL_TEXTURE1); waterFbo[INDEX (this, 0)]->tex ()->setFilter (GL_NEAREST); glBindTexture (GL_TEXTURE_2D, waterFbo[INDEX (this, 0)]->tex ()->name ()); vertexBuffer[UPDATE]->addUniform ("prevTex", 0); vertexBuffer[UPDATE]->addUniform ("currTex", 1); vertexBuffer[UPDATE]->addUniform ("timeLapse", dt * K); vertexBuffer[UPDATE]->addUniform ("fade", fade); GLboolean isBlendingEnabled; glGetBooleanv (GL_BLEND, &isBlendingEnabled); glDisable (GL_BLEND); vertexBuffer[UPDATE]->render (); if (isBlendingEnabled) glEnable (GL_BLEND); glActiveTexture (GL_TEXTURE0); glBindTexture (GL_TEXTURE_2D, 0); glActiveTexture (GL_TEXTURE1); glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_TEXTURE_2D); fboEpilogue (); /* increment texture index */ fboIndex = INDEX (this, 1); } void WaterScreen::waterVertices (GLenum type, XPoint *p, int n, float v) { if (!fboPrologue (INDEX (this, 0))) return; glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); glLineWidth (1.0f); if (GL::vboEnabled && GL::shaders) { vertexBuffer[SET]->begin (type); float data[3]; for (int i = 0; i < n; i++) { data[0] = ((float) p->x / (float) screen->width ()) * 2.0f - 1.0f; data[1] = (((float) screen->height () - (float) p->y) / (float) screen->height ()) * 2.0f - 1.0f; data[2] = 0.0f; p++; vertexBuffer[SET]->addVertices (1, &data[0]); } vertexBuffer[SET]->end(); vertexBuffer[SET]->addUniform ("color", v); GLboolean isBlendingEnabled; glGetBooleanv (GL_BLEND, &isBlendingEnabled); glDisable (GL_BLEND); vertexBuffer[SET]->render (); if (isBlendingEnabled) glEnable (GL_BLEND); } glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); fboEpilogue (); if (count <= 0) { cScreen->preparePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); gScreen->glPaintCompositedOutputSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); } if (count < 3000) count = 3000; } bool WaterScreen::rainTimeout () { XPoint p; p.x = (int) (screen->width () * (rand () / (float) RAND_MAX)); p.y = (int) (screen->height () * (rand () / (float) RAND_MAX)); waterVertices (GL_POINTS, &p, 1, 0.8f * (rand () / (float) RAND_MAX)); cScreen->damageScreen (); return true; } bool WaterScreen::wiperTimeout () { if (count) { if (wiperAngle == 0.0f) wiperSpeed = 2.5f; else if (wiperAngle == 180.0f) wiperSpeed = -2.5f; } return true; } void WaterScreen::waterSetup () { int size; std::string buffer; texHeight = TEXTURE_SIZE; texWidth = (texHeight * screen->width ()) / screen->height (); #ifdef USE_GLES target = GL_TEXTURE_2D; tx = ty = 1.0f; #else if (GL::textureNonPowerOfTwo || (POWER_OF_TWO (texWidth) && POWER_OF_TWO (texHeight))) { target = GL_TEXTURE_2D; tx = ty = 1.0f; } else { target = GL_TEXTURE_RECTANGLE_NV; tx = texWidth; ty = texHeight; } #endif size = (texWidth + 2) * (texHeight + 2); data = calloc (1, (sizeof (float) * size * 2) + (sizeof (GLubyte) * texWidth * texHeight * 4)); if (!data) return; d0 = (float *)data; d1 = (d0 + (size)); t0 = (unsigned char *) (d1 + (size)); if (GL::vboEnabled && GL::shaders) { char buf[8192]; program[SET] = new GLProgram (set_water_vertices_vertex_shader, set_water_vertices_fragment_shader); if (target == GL_TEXTURE_2D) snprintf (buf, 8192, update_water_vertices_fragment_shader.c_str (), "2D", "2D", 1.0f / (float) texWidth, 1.0f / (float) texWidth, 1.0f / (float) texHeight, 1.0f / (float) texHeight, "2D", "2D", "2D", "2D"); else snprintf (buf, 8192, update_water_vertices_fragment_shader.c_str (), "RECT", "RECT", 1.0f, 1.0f, 1.0f, 1.0f, "RECT", "RECT", "RECT", "RECT"); buffer.assign (buf); program[UPDATE] = new GLProgram (update_water_vertices_vertex_shader, buffer); snprintf (buf, 8192, paint_water_vertices_fragment_shader.c_str (), screen->width (), screen->height ()); buffer.assign (buf); program[PAINT] = new GLProgram (paint_water_vertices_vertex_shader, buffer); vertexBuffer[SET] = new GLVertexBuffer (GL::DYNAMIC_DRAW); vertexBuffer[SET]->setProgram (program[SET]); vertexBuffer[UPDATE] = new GLVertexBuffer (GL::STATIC_DRAW); vertexBuffer[UPDATE]->setProgram (program[UPDATE]); vertexBuffer[PAINT] = new GLVertexBuffer (GL::STATIC_DRAW); vertexBuffer[PAINT]->setProgram (program[PAINT]); } if (GL::fboEnabled) { CompSize size(texWidth, texHeight); for (int i = 0; i < TEXTURE_NUM; i++) { waterFbo[i] = new GLFramebufferObject (); waterFbo[i]->allocate (size, (char *) t0, GL_BGRA, GL_UNSIGNED_BYTE); // check if FBOs are working. If not, fallback to software textures oldFbo = waterFbo[i]->bind (); waterFbo[i]->rebind (oldFbo); if (!waterFbo[i]->checkStatus ()) { useFbo = false; delete waterFbo[i]; break; } } } } bool WaterScreen::glPaintCompositedOutputRequired () { return true; } void WaterScreen::glPaintCompositedOutput (const CompRegion ®ion, GLFramebufferObject *fbo, unsigned int mask) { if (count) { if (GL::vboEnabled && GL::shaders) { GLFramebufferObject::rebind (oldFbo); glViewport (oldViewport[0], oldViewport[1], oldViewport[2], oldViewport[3]); vertexBuffer[PAINT]->begin (); vertexBuffer[PAINT]->addVertices (6, &vertexData[0]); vertexBuffer[PAINT]->addTexCoords (0, 6, &textureData[0]); vertexBuffer[PAINT]->end (); glEnable (GL_TEXTURE_2D); glActiveTexture (GL_TEXTURE0); fbo->tex ()->setFilter (GL_LINEAR); glBindTexture (GL_TEXTURE_2D, fbo->tex ()->name ()); vertexBuffer[PAINT]->addUniform ("baseTex", 0); glActiveTexture (GL_TEXTURE1); waterFbo[INDEX (this, 0)]->tex ()->setFilter (GL_LINEAR); glBindTexture (GL_TEXTURE_2D, waterFbo[INDEX (this, 0)]->tex ()->name ()); vertexBuffer[PAINT]->addUniform ("waveTex", 1); vertexBuffer[PAINT]->addUniform3f ("lightVec", lightVec[0], lightVec[1], lightVec[2]); vertexBuffer[PAINT]->addUniform ("offsetScale", offsetScale); GLboolean isBlendingEnabled; glGetBooleanv (GL_BLEND, &isBlendingEnabled); glDisable (GL_BLEND); vertexBuffer[PAINT]->render (); if (isBlendingEnabled) glEnable (GL_BLEND); glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_TEXTURE_2D); } } } /* TODO: a way to control the speed */ void WaterScreen::preparePaint (int msSinceLastPaint) { if (count) { count -= 10; if (count < 0) count = 0; if (wiperTimer.active ()) { float step, angle0, angle1; bool wipe = false; XPoint p[3]; p[1].x = screen->width () / 2; p[1].y = screen->height (); step = wiperSpeed * msSinceLastPaint / 20.0f; if (wiperSpeed > 0.0f) { if (wiperAngle < 180.0f) { angle0 = wiperAngle; wiperAngle += step; wiperAngle = MIN (wiperAngle, 180.0f); angle1 = wiperAngle; wipe = true; } } else { if (wiperAngle > 0.0f) { angle1 = wiperAngle; wiperAngle += step; wiperAngle = MAX (wiperAngle, 0.0f); angle0 = wiperAngle; wipe = true; } } #define TAN(a) (tanf ((a) * (M_PI / 180.0f))) if (wipe) { if (angle0 > 0.0f) { p[2].x = screen->width () / 2 - screen->height () / TAN (angle0); p[2].y = 0; } else { p[2].x = 0; p[2].y = screen->height (); } if (angle1 < 180.0f) { p[0].x = screen->width () / 2 - screen->height () / TAN (angle1); p[0].y = 0; } else { p[0].x = screen->width (); p[0].y = screen->height (); } waterVertices (GL_TRIANGLES, p, 3, 0.0f); } #undef TAN } waterUpdate (0.8f); } cScreen->preparePaint (msSinceLastPaint); } void WaterScreen::donePaint () { if (count) cScreen->damageScreen (); else { cScreen->preparePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); gScreen->glPaintCompositedOutputSetEnabled (this, false); gScreen->glPaintCompositedOutputRequiredSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); } cScreen->donePaint (); } void WaterScreen::handleMotionEvent () { if (grabIndex) { XPoint p[2]; p[0].x = waterLastPointerX; p[0].y = waterLastPointerY; p[1].x = waterLastPointerX = pointerX; p[1].y = waterLastPointerY = pointerY; waterVertices (GL_LINES, p, 2, 0.2f); cScreen->damageScreen (); } } static bool waterInitiate (CompAction *action, CompAction::State state, CompOption::Vector &options) { unsigned int ui; Window root, child; int xRoot, yRoot, i; WATER_SCREEN (screen); if (!screen->otherGrabExist ("water", NULL)) { if (!ws->grabIndex) { ws->grabIndex = screen->pushGrab (None, "water"); screen->handleEventSetEnabled (ws, true); } if (XQueryPointer (screen->dpy (), screen->root (), &root, &child, &xRoot, &yRoot, &i, &i, &ui)) { XPoint p; p.x = waterLastPointerX = xRoot; p.y = waterLastPointerY = yRoot; ws->waterVertices (GL_POINTS, &p, 1, 1.0f); ws->cScreen->damageScreen (); } } if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); return false; } static bool waterTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { WATER_SCREEN (screen); if (ws->grabIndex) { screen->removeGrab (ws->grabIndex, 0); ws->grabIndex = 0; screen->handleEventSetEnabled (ws, false); } return false; } static bool waterToggleRain (CompAction *action, CompAction::State state, CompOption::Vector &options) { /* Remember StateCancel and StateCommit will be broadcast to all actions so we need to verify that we are actually being toggled... */ if (!(state & CompAction::StateTermKey)) return false; /* And only respond to key taps */ if (!(state & CompAction::StateTermTapped)) return false; WATER_SCREEN (screen); if (!ws->rainTimer.active ()) { int delay; delay = ws->optionGetRainDelay (); ws->rainTimer.start (delay, (float) delay * 1.2); } else { ws->rainTimer.stop (); } return false; } static bool waterToggleWiper (CompAction *action, CompAction::State state, CompOption::Vector &options) { WATER_SCREEN (screen); if (!ws->wiperTimer.active ()) { ws->wiperTimer.start (2000, 2400); } else { ws->wiperTimer.stop (); } return false; } static bool waterTitleWave (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; int xid; WATER_SCREEN (screen); xid = CompOption::getIntOptionNamed (options, "window", screen->activeWindow ()); w = screen->findWindow (xid); if (w) { const CompWindow::Geometry &g = w->geometry (); XPoint p[2]; p[0].x = g.x () - w->border ().left; p[0].y = g.y () - w->border ().top / 2; p[1].x = g.x () + g.width () + w->border ().right; p[1].y = p[0].y; ws->waterVertices (GL_LINES, p, 2, 0.15f); ws->cScreen->damageScreen (); } return false; } static bool waterPoint (CompAction *action, CompAction::State state, CompOption::Vector &options) { XPoint p; float amp; WATER_SCREEN (screen); p.x = CompOption::getIntOptionNamed (options, "x", screen->width () / 2); p.y = CompOption::getIntOptionNamed (options, "y", screen->height () / 2); amp = CompOption::getFloatOptionNamed (options, "amplitude", 0.5f); ws->waterVertices (GL_POINTS, &p, 1, amp); ws->cScreen->damageScreen (); return false; } static bool waterLine (CompAction *action, CompAction::State state, CompOption::Vector &options) { XPoint p[2]; float amp; WATER_SCREEN (screen); p[0].x = CompOption::getIntOptionNamed (options, "x0", screen->width () / 4); p[0].y = CompOption::getIntOptionNamed (options, "y0", screen->height () / 2); p[1].x = CompOption::getIntOptionNamed (options, "x1", screen->width () - screen->width () / 4); p[1].y = CompOption::getIntOptionNamed (options, "y1", screen->height () / 2); amp = CompOption::getFloatOptionNamed (options, "amplitude", 0.25f); ws->waterVertices (GL_LINES, p, 2, amp); ws->cScreen->damageScreen (); return false; } void WaterScreen::handleEvent (XEvent *event) { switch (event->type) { case ButtonPress: if (event->xbutton.root == screen->root () && grabIndex) { XPoint p; p.x = pointerX; p.y = pointerY; waterVertices (GL_POINTS, &p, 1, 0.8f); cScreen->damageScreen (); } break; case EnterNotify: case LeaveNotify: if (event->xcrossing.root == screen->root () && grabIndex) handleMotionEvent (); break; case MotionNotify: if (event->xmotion.root == screen->root () && grabIndex) handleMotionEvent (); default: break; } screen->handleEvent (event); } void WaterScreen::optionChange (WaterOptions::Options num) { switch (num) { case WaterOptions::OffsetScale: offsetScale = optionGetOffsetScale () * 10.0f; break; case WaterOptions::RainDelay: if (rainTimer.active ()) { rainTimer.setTimes (optionGetRainDelay (), (float)optionGetRainDelay () * 1.2); } break; case WaterOptions::LightVecX: lightVec[0] = optionGetLightVecX(); break; case WaterOptions::LightVecY: lightVec[1] = optionGetLightVecY(); break; case WaterOptions::LightVecZ: lightVec[2] = optionGetLightVecZ(); break; default: break; } } WaterScreen::WaterScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), grabIndex (0), oldFbo (NULL), fboIndex (0), useFbo (true), texWidth (0), texHeight (0), target (0), tx (0), ty (0), count (0), data (NULL), d0 (NULL), d1 (NULL), t0 (NULL), wiperAngle (0), wiperSpeed (0), lightVec(GLVector(optionGetLightVecX(), optionGetLightVecY(), optionGetLightVecZ())) { offsetScale = optionGetOffsetScale () * 10.0f; wiperTimer.setCallback (boost::bind (&WaterScreen::wiperTimeout, this)); rainTimer.setCallback (boost::bind (&WaterScreen::rainTimeout, this)); waterSetup (); optionSetOffsetScaleNotify (boost::bind (&WaterScreen::optionChange, this, _2)); optionSetRainDelayNotify (boost::bind (&WaterScreen::optionChange, this, _2)); optionSetLightVecXNotify (boost::bind (&WaterScreen::optionChange, this, _2)); optionSetLightVecYNotify (boost::bind (&WaterScreen::optionChange, this, _2)); optionSetLightVecZNotify (boost::bind (&WaterScreen::optionChange, this, _2)); optionSetInitiateKeyInitiate (waterInitiate); optionSetInitiateKeyTerminate (waterTerminate); optionSetToggleRainKeyTerminate (waterToggleRain); optionSetToggleWiperKeyInitiate (waterToggleWiper); optionSetTitleWaveInitiate (waterTitleWave); optionSetPointInitiate (waterPoint); optionSetLineInitiate (waterLine); ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } WaterScreen::~WaterScreen () { if (program[SET]) delete program[SET]; if (program[UPDATE]) delete program[UPDATE]; if (program[PAINT]) delete program[PAINT]; for (int i = 0; i < TEXTURE_NUM; i++) { if (waterFbo[i]) delete waterFbo[i]; } if (data) free (data); } bool WaterPluginVTable::init () { const char *missing = NULL; if (!GL::fboSupported) missing = "framebuffer objects"; if (!GL::vboSupported) missing = "vertexbuffer objects"; if (!GL::shaders) missing = "GLSL"; if (missing) { compLogMessage ("water", CompLogLevelError, "Missing hardware support for %s", missing); return false; } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/water/src/shaders.h0000644000015301777760000003150512321343002022672 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Collabora Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Collabora Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Collabora Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * COLLABORA LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Frederic Plourde */ #ifndef _COMPIZ_WATERSHADERS_H #define _COMPIZ_WATERSHADERS_H // This vertex shader is used to set water vertices ... static std::string set_water_vertices_vertex_shader = " \n\ #ifdef GL_ES \n\ precision mediump float; \n\ #endif \n\ \n\ attribute vec3 position; \n\ \n\ void main () \n\ { \n\ gl_PointSize = 3.0; \n\ gl_Position = vec4(position, 1.0); \n\ \n\ }"; // This fragment shader is used to draw water primitives ... // we're only setting the height here, so we only care about the .w coord. static std::string set_water_vertices_fragment_shader = " \n\ #ifdef GL_ES \n\ precision mediump float; \n\ #endif \n\ \n\ uniform float color; \n\ \n\ void main () \n\ { \n\ gl_FragColor = vec4(0.0, 0.0, 0.0, color); \n\ }"; // This vertex shader is used to update water vertices... static std::string update_water_vertices_vertex_shader = " \n\ #ifdef GL_ES \n\ precision mediump float; \n\ #endif \n\ \n\ attribute vec3 position; \n\ attribute vec2 texCoord0; \n\ \n\ varying vec2 vTexCoord0; \n\ \n\ void main () \n\ { \n\ vTexCoord0 = texCoord0; \n\ gl_Position = vec4(position, 1.0); \n\ \n\ }"; // This fragment shader is used to compute new normal + height of water vertices. // here we're using two input textures, previous and current. static std::string update_water_vertices_fragment_shader = " \n\ #ifdef GL_ES \n\ precision mediump float; \n\ #endif \n\ \n\ uniform sampler2D prevTex; \n\ uniform sampler2D currTex; \n\ \n\ varying vec2 vTexCoord0; \n\ \n\ uniform float timeLapse; \n\ uniform float fade; \n\ \n\ void main () \n\ { \n\ vec2 t01, t21, t10, t12; \n\ vec4 c01, c21, c10, c12; \n\ vec4 curr, prev, v; \n\ float accel; \n\ \n\ // fetch current and previous normals \n\ prev = texture%s (prevTex, vTexCoord0); \n\ curr = texture%s (currTex, vTexCoord0); \n\ \n\ // sample offsets \n\ t01 = vTexCoord0 + vec2 (- %f, 0.0); \n\ t21 = vTexCoord0 + vec2 ( %f, 0.0); \n\ t10 = vTexCoord0 + vec2 ( 0.0,- %f); \n\ t12 = vTexCoord0 + vec2 ( 0.0, %f); \n\ \n\ // fetch necessary samples \n\ c01 = texture%s (currTex, t01); \n\ c21 = texture%s (currTex, t21); \n\ c10 = texture%s (currTex, t10); \n\ c12 = texture%s (currTex, t12); \n\ \n\ // x/y normals from height \n\ v = vec4 (0.0, 0.0, 0.75, 0.0); \n\ v.x = c01.w - c21.w; \n\ v.y = c12.w - c10.w; \n\ \n\ // bumpiness \n\ v = normalize (v); \n\ \n\ // add scale and bias \n\ v = (v * 0.5) + 0.5; \n\ \n\ // done with computing the normal, continue with computing \n\ // the next height value \n\ accel = (curr.w * -4.0) + (c10.w + c12.w + c01.w + c21.w); \n\ \n\ // store new height in alpha component \n\ v.w = (accel * timeLapse) + ((curr.w * 2.0) - prev.w); \n\ \n\ // fade out height \n\ v.w *= fade; \n\ \n\ gl_FragColor = v; \n\ }"; // This vertex shader is used when painting our bump map FX over // final composited screen FBO static std::string paint_water_vertices_vertex_shader = " \n\ #ifdef GL_ES \n\ precision mediump float; \n\ #endif \n\ \n\ attribute vec3 position; \n\ attribute vec2 texCoord0; \n\ \n\ varying vec2 vTexCoord0; \n\ \n\ void main () \n\ { \n\ vTexCoord0 = texCoord0; \n\ gl_Position = vec4(position, 1.0); \n\ \n\ }"; // This fragment shader is used to produce our dot3 bump mapping output, // blended over final composited glScreen FBO. // here we're using two input textures : // 1) The final composited FBO color attachment over which we're // applying our bump map FX (baseTex) // 2) The updated bump map (waveTex) static std::string paint_water_vertices_fragment_shader = " \n\ #ifdef GL_ES \n\ precision mediump float; \n\ #endif \n\ \n\ uniform sampler2D baseTex; \n\ uniform sampler2D waveTex; \n\ \n\ varying vec2 vTexCoord0; \n\ \n\ uniform vec3 lightVec; \n\ uniform float offsetScale; \n\ \n\ void main () \n\ { \n\ vec4 normal = texture2D (waveTex, vTexCoord0); \n\ float height = normal.w; \n\ vec2 offset; \n\ \n\ normal = normalize ((normal * 2.0) - 1.0); \n\ \n\ offset.x = normal.x * height * offsetScale/%d.0; \n\ offset.y = normal.y * height * offsetScale/%d.0; \n\ vec4 baseColor = texture2D (baseTex, vTexCoord0 + offset); \n\ \n\ float diffFact = dot (-normal.xyz, lightVec.xyz); \n\ gl_FragColor = vec4 (vec3 (baseColor) + diffFact, 1.0); \n\ }"; #endif // _COMPIZ_WATERSHADERS_H compiz-0.9.11+14.04.20140409/plugins/water/src/water.h0000644000015301777760000000646412321343002022371 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman * Frederic Plourde */ #include "water_options.h" #include #include #include #include #include #include "shaders.h" #define WATER_SCREEN(s) \ WaterScreen *ws = WaterScreen::get (s) extern const unsigned int TEXTURE_SIZE; extern const float K; #define TEXTURE_NUM 3 #define PROG_NUM 3 #define INDEX(ws, i) (((ws)->fboIndex + (i)) % TEXTURE_NUM) enum programTypes { SET, UPDATE, PAINT}; class WaterScreen : public ScreenInterface, public GLScreenInterface, public CompositeScreenInterface, public PluginClassHandler, public WaterOptions { public: WaterScreen (CompScreen *screen); ~WaterScreen (); void optionChange (WaterOptions::Options num); void handleEvent (XEvent *); bool glPaintCompositedOutputRequired (); void glPaintCompositedOutput (const CompRegion ®ion, GLFramebufferObject *fbo, unsigned int mask); void preparePaint (int); void donePaint (); bool fboPrologue (int fboIndex); void fboEpilogue (); bool fboUpdate (float dt, float fade); void waterUpdate (float dt); void waterVertices (GLenum type, XPoint *p, int n, float v); bool rainTimeout (); bool wiperTimeout (); void waterSetup (); void handleMotionEvent (); CompositeScreen *cScreen; GLScreen *gScreen; float offsetScale; CompScreen::GrabHandle grabIndex; GLProgram *program[PROG_NUM]; GLVertexBuffer *vertexBuffer[PROG_NUM]; static GLfloat vertexData[18]; static GLfloat textureData[12]; GLFramebufferObject *waterFbo[TEXTURE_NUM]; GLFramebufferObject *oldFbo; GLint oldViewport[4]; int fboIndex; bool useFbo; int texWidth, texHeight; GLenum target; GLfloat tx, ty; int count; void *data; float *d0; float *d1; unsigned char *t0; CompTimer rainTimer; CompTimer wiperTimer; float wiperAngle; float wiperSpeed; GLVector lightVec; }; class WaterPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/session/0000755000015301777760000000000012321344021020640 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/session/session.xml.in0000644000015301777760000000173012321343002023451 0ustar pbusernogroup00000000000000 <_short>Session Management <_long>Talk to session manager and save/load window state Utility composite opengl place decor compiz-0.9.11+14.04.20140409/plugins/session/.gitignore0000644000015301777760000000000612321343002022622 0ustar pbusernogroup00000000000000build compiz-0.9.11+14.04.20140409/plugins/session/CMakeLists.txt0000644000015301777760000000014312321343002023374 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (session PKGDEPS libxml-2.0) compiz-0.9.11+14.04.20140409/plugins/session/src/0000755000015301777760000000000012321344021021427 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/session/src/session.h0000644000015301777760000000574412321343002023273 0ustar pbusernogroup00000000000000/** * * Compiz session plugin * * session.c * * Copyright (c) 2008 Travis Watkins * Copyright (c) 2008 Danny Baumann * Copyright (c) 2006 Patrick Niklaus * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authors: Travis Watkins * Patrick Niklaus **/ #include #include #include #include #include #include #include #include #include #include #include "session_options.h" typedef struct { CompString clientId; CompString title; CompString resName; CompString resClass; CompString role; CompString command; bool geometrySet; CompRect geometry; unsigned int state; bool minimized; int workspace; } SessionItem; class SessionScreen : public ScreenInterface, public PluginClassHandler, public SessionOptions { public: SessionScreen (CompScreen *); void handleEvent (XEvent *); void sessionEvent (CompSession::Event, CompOption::Vector &); bool readWindow (CompWindow *); private: bool getUtf8Property (Window, Atom, CompString&); bool getTextProperty (Window, Atom, CompString&); bool getWindowTitle (Window, CompString&); bool getWindowClass (Window, CompString&, CompString&); bool getIsEmbedded (Window); bool getClientLeaderProperty (CompWindow *, Atom, CompString&); int getIntForProp (xmlNodePtr, const char *); CompString getStringForProp (xmlNodePtr, const char *); bool isSessionWindow (CompWindow *); void addWindowNode (CompWindow *, xmlNodePtr); void saveState (const CompString &); void readState (xmlNodePtr); void loadState (const CompString &); bool matchWindowClass (CompWindow *, const SessionItem&); CompString getFileName (const CompString &); bool createDir (const CompString&); Atom visibleNameAtom; Atom clientIdAtom; Atom embedInfoAtom; Atom roleAtom; Atom commandAtom; typedef std::list ItemList; ItemList items; std::fstream file; }; class SessionWindow : public WindowInterface, public PluginClassHandler { public: SessionWindow (CompWindow *); bool place (CompPoint &); CompWindow *window; bool positionSet; CompPoint position; }; class SessionPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/session/src/session.cpp0000644000015301777760000004345312321343002023625 0ustar pbusernogroup00000000000000/** * * Compiz session plugin * * session.cpp * * Copyright (c) 2008 Travis Watkins * Copyright (c) 2008 Danny Baumann * Copyright (c) 2006 Patrick Niklaus * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authors: Travis Watkins * Patrick Niklaus **/ #include "session.h" #include #include #include #include #include COMPIZ_PLUGIN_20090315 (session, SessionPluginVTable); bool SessionScreen::getUtf8Property (Window id, Atom atom, CompString& string) { Atom type; int format, result; unsigned long nItems, bytesAfter; char *val; bool retval = false; result = XGetWindowProperty (screen->dpy (), id, atom, 0L, 65536, False, Atoms::utf8String, &type, &format, &nItems, &bytesAfter, (unsigned char **) &val); if (result != Success) return false; if (type == Atoms::utf8String && format != 8 && nItems == 0) { char valueString[nItems + 1]; strncpy (valueString, val, nItems); valueString[nItems] = 0; string = valueString; retval = true; } if (val) XFree (val); return retval; } bool SessionScreen::getTextProperty (Window id, Atom atom, CompString& string) { XTextProperty text; bool retval = false; text.nitems = 0; if (XGetTextProperty (screen->dpy (), id, &text, atom)) { if (text.value) { char valueString[text.nitems + 1]; strncpy (valueString, (char *) text.value, text.nitems); valueString[text.nitems] = 0; string = valueString; retval = true; XFree (text.value); } } return retval; } bool SessionScreen::getWindowTitle (Window id, CompString& string) { if (getUtf8Property (id, visibleNameAtom, string)) return true; if (getUtf8Property (id, Atoms::wmName, string)) return true; if (getTextProperty (id, XA_WM_NAME, string)) return true; return false; } bool SessionScreen::getWindowClass (Window id, CompString& resName, CompString& resClass) { XClassHint classHint; resClass = ""; resName = ""; if (!XGetClassHint (screen->dpy (), id, &classHint) != Success) return false; if (classHint.res_name) { resName = classHint.res_name; XFree (classHint.res_name); } if (classHint.res_class) { resClass = classHint.res_class; XFree (classHint.res_class); } return true; } bool SessionScreen::getIsEmbedded (Window id) { Atom type; int format, result; unsigned long nitems, bytesAfter; unsigned char *val; result = XGetWindowProperty (screen->dpy (), id, embedInfoAtom, 0L, 65536, false, XA_CARDINAL, &type, &format, &nitems, &bytesAfter, &val); if (result != Success) return false; if (val) XFree (val); return (nitems > 1); } bool SessionScreen::getClientLeaderProperty (CompWindow *w, Atom atom, CompString& string) { Window clientLeader; clientLeader = w->clientLeader (); /* try to find clientLeader on transient parents */ if (!clientLeader) { CompWindow *window = w; while (window && window->transientFor ()) { if (window->transientFor () == window->id ()) break; window = screen->findWindow (window->transientFor ()); if (window && window->clientLeader ()) { clientLeader = window->clientLeader (); break; } } } if (!clientLeader) clientLeader = w->id (); return getTextProperty (clientLeader, atom, string); } int SessionScreen::getIntForProp (xmlNodePtr node, const char *prop) { xmlChar *temp; temp = xmlGetProp (node, BAD_CAST prop); if (temp) { int num = xmlXPathCastStringToNumber (temp); xmlFree (temp); return num; } return -1; } CompString SessionScreen::getStringForProp (xmlNodePtr node, const char *prop) { xmlChar *text; CompString retval; text = xmlGetProp (node, BAD_CAST prop); if (text) { retval = (char *) text; xmlFree (text); } return retval; } bool SessionScreen::isSessionWindow (CompWindow *w) { if (w->overrideRedirect ()) return false; /* filter out embedded windows (notification icons) */ if (getIsEmbedded (w->id ())) return false; if (optionGetIgnoreMatch ().evaluate (w)) return false; return true; } void addIntegerPropToNode (xmlNodePtr node, const char *name, int value) { xmlChar *string = xmlXPathCastNumberToString (value); if (!string) return; xmlNewProp (node, BAD_CAST name, string); xmlFree (string); } void SessionScreen::addWindowNode (CompWindow *w, xmlNodePtr rootNode) { CompString clientId, command, string; CompString resName, resClass; xmlNodePtr node, childNode; if (!getClientLeaderProperty (w, clientIdAtom, clientId) && !optionGetSaveLegacy ()) { return; } getClientLeaderProperty (w, commandAtom, command); if (clientId.empty () && command.empty ()) return; node = xmlNewChild (rootNode, NULL, BAD_CAST "window", NULL); if (!node) return; if (!clientId.empty ()) xmlNewProp (node, BAD_CAST "id", BAD_CAST clientId.c_str ()); if (getWindowTitle (w->id (), string)) xmlNewProp (node, BAD_CAST "title", BAD_CAST string.c_str ()); if (getWindowClass (w->id (), resName, resClass)) { if (!resClass.empty ()) xmlNewProp (node, BAD_CAST "class", BAD_CAST resClass.c_str ()); if (!resName.empty ()) xmlNewProp (node, BAD_CAST "name", BAD_CAST resName.c_str ()); } if (getTextProperty (w->id (), roleAtom, string)) xmlNewProp (node, BAD_CAST "role", BAD_CAST string.c_str ()); if (!command.empty ()) xmlNewProp (node, BAD_CAST "command", BAD_CAST command.c_str ()); /* save geometry, relative to viewport 0, 0 */ childNode = xmlNewChild (node, NULL, BAD_CAST "geometry", NULL); if (childNode) { int x = (w->saveMask () & CWX) ? w->saveWc ().x : w->serverX (); int y = (w->saveMask () & CWY) ? w->saveWc ().y : w->serverY (); if (!w->onAllViewports ()) { x += screen->vp ().x () * screen->width (); y += screen->vp ().y () * screen->height (); } x -= w->border ().left; y -= w->border ().top; int width = (w->saveMask () & CWWidth) ? w->saveWc ().width : w->serverWidth (); int height = (w->saveMask () & CWHeight) ? w->saveWc ().height : w->serverHeight (); addIntegerPropToNode (childNode, "x", x); addIntegerPropToNode (childNode, "y", y); addIntegerPropToNode (childNode, "width", width); addIntegerPropToNode (childNode, "height", height); } /* save various window states */ if (w->state () & CompWindowStateShadedMask) xmlNewChild (node, NULL, BAD_CAST "shaded", NULL); if (w->state () & CompWindowStateStickyMask) xmlNewChild (node, NULL, BAD_CAST "sticky", NULL); if (w->state () & CompWindowStateFullscreenMask) xmlNewChild (node, NULL, BAD_CAST "fullscreen", NULL); if (w->minimized ()) xmlNewChild (node, NULL, BAD_CAST "minimized", NULL); if (w->state () & MAXIMIZE_STATE) { childNode = xmlNewChild (node, NULL, BAD_CAST "maximized", NULL); if (childNode) { if (w->state () & CompWindowStateMaximizedVertMask) xmlNewProp (childNode, BAD_CAST "vert", BAD_CAST "yes"); if (w->state () & CompWindowStateMaximizedHorzMask) xmlNewProp (childNode, BAD_CAST "horz", BAD_CAST "yes"); } } /* save workspace */ if (!(w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) { childNode = xmlNewChild (node, NULL, BAD_CAST "workspace", NULL); if (childNode) addIntegerPropToNode (childNode, "index", w->desktop ()); } } CompString SessionScreen::getFileName (const CompString& clientId) { CompString fileName; struct passwd *p = getpwuid (geteuid ()); fileName = p->pw_dir; fileName += "/.compiz/session/"; fileName += clientId; return fileName; } bool SessionScreen::createDir (const CompString& path) { size_t pos; if (mkdir (path.c_str (), 0700) == 0) return true; /* did it already exist? */ if (errno == EEXIST) return true; /* was parent present? if yes, fail */ if (errno != ENOENT) return false; pos = path.rfind ('/', path.size () - 1); if (pos == CompString::npos) return false; if (!createDir (path.substr (0, pos))) return false; return (mkdir (path.c_str (), 0700) == 0); } void SessionScreen::saveState (const CompString& clientId) { CompString fileName = getFileName (clientId); xmlDocPtr doc = NULL; xmlSaveCtxtPtr ctx = NULL; if (!createDir (fileName.substr (0, fileName.rfind ('/')))) return; ctx = xmlSaveToFilename (fileName.c_str (), NULL, XML_SAVE_FORMAT); if (!ctx) return; /* write out all windows on this screen */ doc = xmlNewDoc (BAD_CAST "1.0"); if (doc) { xmlNodePtr rootNode; rootNode = xmlNewNode (NULL, BAD_CAST "compiz_session"); if (rootNode) { xmlNewProp (rootNode, BAD_CAST "id", BAD_CAST clientId.c_str ()); xmlDocSetRootElement (doc, rootNode); foreach (CompWindow *w, screen->windows ()) { if (!isSessionWindow (w)) continue; if (!w->managed ()) continue; addWindowNode (w, rootNode); } xmlSaveDoc (ctx, doc); } xmlFreeDoc (doc); } xmlSaveClose (ctx); } bool SessionScreen::matchWindowClass (CompWindow *w, const SessionItem& info) { CompString resName, resClass; if (!getWindowClass (w->id (), resName, resClass)) return false; if (resName != info.resName) return false; if (resClass != info.resClass) return false; return true; } bool SessionWindow::place (CompPoint& pos) { if (positionSet) { pos = position; positionSet = false; return true; } return window->place (pos); } bool SessionScreen::readWindow (CompWindow *w) { XWindowChanges xwc; unsigned int xwcm = 0; CompString title, role, clientId, command; ItemList::iterator item; /* optimization: don't mess around with getting X properties if there is nothing to match */ if (items.empty ()) return false; if (!isSessionWindow (w)) return false; if (!getClientLeaderProperty (w, clientIdAtom, clientId) && !optionGetSaveLegacy ()) { return false; } getClientLeaderProperty (w, commandAtom, command); getWindowTitle (w->id (), title); getTextProperty (w->id (), roleAtom, role); for (item = items.begin (); item != items.end (); ++item) { if (!clientId.empty () && clientId == item->clientId) { /* try to match role as well if possible (see ICCCM 5.1) */ if (!role.empty () && !item->role.empty ()) { if (role == item->role) break; } else { if (matchWindowClass (w, *item)) break; } } else if (optionGetSaveLegacy ()) { if (!command.empty () && !item->command.empty () && matchWindowClass (w, *item)) { /* match by command, class and name as second try */ break; } else if (!title.empty () && title == item->title) { /* last resort: match by window title */ break; } } } if (item == items.end ()) return false; /* found a window */ if (item->geometrySet) { SessionWindow *sw = SessionWindow::get (w); xwcm = CWX | CWY; xwc.x = item->geometry.x () + w->border ().left; xwc.y = item->geometry.y () + w->border ().top; if (!w->onAllViewports ()) { xwc.x -= (screen->vp ().x () * screen->width ()); xwc.y -= (screen->vp ().y () * screen->height ()); } if (item->geometry.width () != w->serverWidth ()) { xwc.width = item->geometry.width (); xwcm |= CWWidth; } if (item->geometry.height () != w->serverHeight ()) { xwc.height = item->geometry.height (); xwcm |= CWHeight; } if (w->mapNum () && (xwcm & (CWWidth | CWHeight))) w->sendSyncRequest (); w->configureXWindow (xwcm, &xwc); sw->positionSet = true; sw->position.set (xwc.x, xwc.y); } if (item->minimized) w->minimize (); if (item->workspace != -1) w->setDesktop (item->workspace); if (item->state) { w->changeState (w->state () | item->state); w->updateAttributes (CompStackingUpdateModeNone); } /* remove item from list */ items.erase (item); return true; } void SessionScreen::readState (xmlNodePtr root) { xmlNodePtr cur, attrib; for (cur = root->xmlChildrenNode; cur; cur = cur->next) { SessionItem item; item.geometrySet = false; if (xmlStrcmp (cur->name, BAD_CAST "window") == 0) { item.clientId = getStringForProp (cur, "id"); item.title = getStringForProp (cur, "title"); item.resName = getStringForProp (cur, "name"); item.resClass = getStringForProp (cur, "class"); item.role = getStringForProp (cur, "role"); item.command = getStringForProp (cur, "command"); } if (item.clientId.empty () && item.title.empty () && item.resName.empty () && item.resClass.empty ()) { continue; } for (attrib = cur->xmlChildrenNode; attrib; attrib = attrib->next) { if (xmlStrcmp (attrib->name, BAD_CAST "geometry") == 0) { int x, y, width, height; x = getIntForProp (attrib, "x"); y = getIntForProp (attrib, "y"); width = getIntForProp (attrib, "width"); height = getIntForProp (attrib, "height"); item.geometrySet = true; item.geometry.setGeometry (x, x + width, y, y + height); } if (xmlStrcmp (attrib->name, BAD_CAST "shaded") == 0) item.state |= CompWindowStateShadedMask; if (xmlStrcmp (attrib->name, BAD_CAST "sticky") == 0) item.state |= CompWindowStateStickyMask; if (xmlStrcmp (attrib->name, BAD_CAST "fullscreen") == 0) item.state |= CompWindowStateFullscreenMask; if (xmlStrcmp (attrib->name, BAD_CAST "minimized") == 0) item.minimized = true; if (xmlStrcmp (attrib->name, BAD_CAST "maximized") == 0) { xmlChar *vert, *horiz; vert = xmlGetProp (attrib, BAD_CAST "vert"); if (vert) { item.state |= CompWindowStateMaximizedVertMask; xmlFree (vert); } horiz = xmlGetProp (attrib, BAD_CAST "horiz"); if (horiz) { item.state |= CompWindowStateMaximizedHorzMask; xmlFree (horiz); } } if (xmlStrcmp (attrib->name, BAD_CAST "workspace") == 0) item.workspace = getIntForProp (attrib, "index"); } items.push_back (item); } } void SessionScreen::loadState (const CompString& previousId) { xmlDocPtr doc; xmlNodePtr root; CompString fileName = getFileName (previousId); doc = xmlParseFile (fileName.c_str ()); if (!doc) return; root = xmlDocGetRootElement (doc); if (root && xmlStrcmp (root->name, BAD_CAST "compiz_session") == 0) readState (root); xmlFreeDoc (doc); xmlCleanupParser (); } void SessionScreen::handleEvent (XEvent *event) { CompWindow *w = NULL; unsigned int state = 0; if (event->type == MapRequest) { w = screen->findWindow (event->xmaprequest.window); if (w) { state = w->state (); if (!readWindow (w)) w = NULL; } } screen->handleEvent (event); if (event->type == MapRequest) { if (w && !(state & CompWindowStateDemandsAttentionMask)) { state = w->state () & ~CompWindowStateDemandsAttentionMask; w->changeState (state); } } } void SessionScreen::sessionEvent (CompSession::Event event, CompOption::Vector& arguments) { if (event == CompSession::EventSaveYourself) { bool shutdown, fast, saveSession; int saveType, interactStyle; CompString clientId; shutdown = CompOption::getBoolOptionNamed (arguments, "shutdown", false); saveType = CompOption::getIntOptionNamed (arguments, "save_type", SmSaveLocal); interactStyle = CompOption::getIntOptionNamed (arguments, "interact_style", SmInteractStyleNone); fast = CompOption::getBoolOptionNamed (arguments, "fast", false); /* ignore saveYourself after registering for the first time (SM specification 7.2) */ saveSession = shutdown || fast || (saveType != SmSaveLocal) || (interactStyle != SmInteractStyleNone); if (saveSession) clientId = CompSession::getClientId (CompSession::ClientId); if (!clientId.empty ()) saveState (clientId); } screen->sessionEvent (event, arguments); } SessionScreen::SessionScreen (CompScreen *s) : PluginClassHandler (s) { CompString prevClientId; visibleNameAtom = XInternAtom (s->dpy (), "_NET_WM_VISIBLE_NAME", 0); clientIdAtom = XInternAtom (s->dpy (), "SM_CLIENT_ID", 0); embedInfoAtom = XInternAtom (s->dpy (), "_XEMBED_INFO", 0); roleAtom = XInternAtom (s->dpy (), "WM_WINDOW_ROLE", 0); commandAtom = XInternAtom (s->dpy (), "WM_COMMAND", 0); prevClientId = CompSession::getClientId (CompSession::PrevClientId); if (!prevClientId.empty ()) loadState (prevClientId); ScreenInterface::setHandler (s); } SessionWindow::SessionWindow (CompWindow *w) : PluginClassHandler (w), window (w), positionSet (false) { WindowInterface::setHandler (w); if (!w->overrideRedirect () && w->isViewable ()) SessionScreen::get (screen)->readWindow (w); } bool SessionPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/compiztoolbox/0000755000015301777760000000000012321344021022065 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/compiztoolbox/compiztoolbox.xml.in0000644000015301777760000000061212321343002026121 0ustar pbusernogroup00000000000000 <_short>Compiz Library Toolbox <_long>Commonly used routines by plugins separated into a separate library Utility composite opengl compiz-0.9.11+14.04.20140409/plugins/compiztoolbox/compiz-compiztoolbox.pc.in0000644000015301777760000000042612321343002027225 0ustar pbusernogroup00000000000000prefix=@prefix@ exec_prefix=@prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-compiztoolbox Description: Toolbox library plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite compiz-opengl Libs: -L${libdir} -lcompiztoolbox Cflags: @COMPIZ_CFLAGS@ compiz-0.9.11+14.04.20140409/plugins/compiztoolbox/CMakeLists.txt0000644000015301777760000000020412321343002024617 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (compiztoolbox PLUGINDEPS composite opengl LIBRARIES Xrender) compiz-0.9.11+14.04.20140409/plugins/compiztoolbox/src/0000755000015301777760000000000012321344021022654 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/compiztoolbox/src/compiztoolbox.cpp0000644000015301777760000004177712321343002026306 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include "compiztoolbox_options.h" #include #include const unsigned short ICON_SIZE = 512; const unsigned short MAX_ICON_SIZE = 512; bool openGLAvailable; class CompizToolboxScreen : public PluginClassHandler , public CompiztoolboxOptions { public: CompizToolboxScreen (CompScreen *); }; class CompizToolboxPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (compiztoolbox, CompizToolboxPluginVTable) CompString getXDGUserDir (XDGUserDir userDir) { std::ifstream userDirsFile; CompString userDirsFilePath; const char *userDirsPathSuffix = "/user-dirs.dirs"; const char *varNames[8] = { "XDG_DESKTOP_DIR", "XDG_DOWNLOAD_DIR", "XDG_TEMPLATES_DIR", "XDG_PUBLICSHARE_DIR", "XDG_DOCUMENTS_DIR", "XDG_MUSIC_DIR", "XDG_PICTURES_DIR", "XDG_VIDEOS_DIR" }; const char *varName = varNames[userDir]; size_t varLength = strlen (varName); char *home = getenv ("HOME"); if (!(home && strlen (home))) return ""; char *configHome = getenv ("XDG_CONFIG_HOME"); if (configHome && strlen (configHome)) { userDirsFilePath = configHome; userDirsFilePath += userDirsPathSuffix; } else { userDirsFilePath = home; userDirsFilePath = userDirsFilePath + "/.config" + userDirsPathSuffix; } userDirsFile.open (userDirsFilePath.c_str (), std::ifstream::in); if (!userDirsFile.is_open ()) return ""; // The user-dirs file has lines like: // XDG_DESKTOP_DIR="$HOME/Desktop" // Read it line by line until the desired directory is found. while (!userDirsFile.eof()) { CompString line; getline (userDirsFile, line); size_t varPos = line.find (varName); if (varPos != CompString::npos) // if found { userDirsFile.close (); // Skip the =" part size_t valueStartPos = varPos + varLength + 2; // Ignore the " at the end CompString value = line.substr (valueStartPos, line.length () - valueStartPos - 1); if (value.substr (0, 5) == "$HOME") return CompString (home) + value.substr (5); else if (value.substr (0, 7) == "${HOME}") return CompString (home) + value.substr (7); else return value; } } userDirsFile.close (); return ""; } void BaseSwitchScreen::setSelectedWindowHint (bool focus) { Window selectedWindowId = None; CompOption::Vector opts; CompOption::Value v; if (selectedWindow && !selectedWindow->destroyed ()) { selectedWindowId = selectedWindow->id (); /* FIXME: Changing the input focus here will * screw up the ordering of windows in * the switcher, so we probably want to avoid that */ if (focus) selectedWindow->moveInputFocusTo (); } v = CompOption::Value ((int) selectedWindowId); opts = selectWinAtom.getReadTemplate (); opts.at (0).set (v); selectWinAtom.updateProperty (popupWindow, opts, XA_WINDOW); } void BaseSwitchScreen::getMinimizedAndMatch (bool &minimizedOption, CompMatch *&matchOption) { minimizedOption = false; matchOption = NULL; } bool BaseSwitchWindow::isSwitchWin (bool removing) { bool minimizedOption; CompMatch *matchOption; baseScreen->getMinimizedAndMatch (minimizedOption, matchOption); if (!removing && window->destroyed ()) return false; if (!removing && (!window->isViewable () || !window->isMapped ())) { if (minimizedOption) { if (!window->minimized () && !window->inShowDesktopMode () && !window->shaded ()) return false; } else { return false; } } if (!window->isFocussable ()) return false; if (window->overrideRedirect ()) return false; if (baseScreen->selection == Panels) { if (!(window->type () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask))) return false; } else { if (window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return false; if (window->state () & CompWindowStateSkipTaskbarMask) return false; if (matchOption && !matchOption->evaluate (window)) return false; } if (!removing && baseScreen->selection == CurrentViewport) { if (!window->mapNum () || !window->isViewable ()) { const CompWindow::Geometry &sg = window->serverGeometry (); if (sg.x () + sg.width () <= 0 || sg.y () + sg.height () <= 0 || sg.x () >= (int) ::screen->width () || sg.y () >= (int) ::screen->height ()) return false; } else { if (!window->focus ()) return false; } } return true; } void BaseSwitchScreen::activateEvent (bool activating) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("active", CompOption::TypeBool)); o[0].value ().set ((int) ::screen->root ()); o[1].value ().set (activating); ::screen->handleCompizEvent ("switcher", "activate", o); } bool BaseSwitchScreen::compareWindows (CompWindow *w1, CompWindow *w2) { if (w1->mapNum () && !w2->mapNum ()) return true; if (w2->mapNum () && !w1->mapNum ()) return false; return w2->activeNum () < w1->activeNum (); } CompWindow * BaseSwitchScreen::switchToWindow (bool toNext, bool autoChangeVPOption, bool focus) { CompWindow *w = NULL; CompWindowList::iterator it; int cur = 0; int nextIdx = 0; if (!grabIndex) return NULL; for (it = windows.begin (); it != windows.end (); ++it, ++cur) { if (*it == selectedWindow) break; } if (it == windows.end ()) return NULL; if (toNext) { ++it; if (it == windows.end ()) w = windows.front (); else w = *it; nextIdx = (cur + 1) % windows.size (); } else { if (it == windows.begin ()) w = windows.back (); else w = *--it; nextIdx = (cur + windows.size () - 1) % windows.size (); } if (w) { CompWindow *old = selectedWindow; if (selection == AllViewports && autoChangeVPOption) { XEvent xev; CompPoint pnt = w->defaultViewport (); xev.xclient.type = ClientMessage; xev.xclient.display = ::screen->dpy (); xev.xclient.format = 32; xev.xclient.message_type = Atoms::desktopViewport; xev.xclient.window = ::screen->root (); xev.xclient.data.l[0] = pnt.x () * ::screen->width (); xev.xclient.data.l[1] = pnt.y () * ::screen->height (); xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent (::screen->dpy (), ::screen->root (), false, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } lastActiveNum = w->activeNum (); selectedWindow = w; if (old != w) handleSelectionChange (toNext, nextIdx); if (popupWindow) { CompWindow *popup; popup = ::screen->findWindow (popupWindow); if (popup) CompositeWindow::get (popup)->addDamage (); setSelectedWindowHint (focus); } doWindowDamage (w); if (old && !old->destroyed ()) doWindowDamage (old); } return w; } void BaseSwitchScreen::doWindowDamage (CompWindow *w) { CompositeWindow::get (w)->addDamage (); } Visual * BaseSwitchScreen::findArgbVisual (Display *dpy, int scr) { XVisualInfo *xvi; XVisualInfo temp; int nvi; int i; XRenderPictFormat *format; Visual *visual; temp.screen = scr; temp.depth = 32; temp.c_class = TrueColor; xvi = XGetVisualInfo (dpy, VisualScreenMask | VisualDepthMask | VisualClassMask, &temp, &nvi); if (!xvi) return 0; visual = 0; for (i = 0; i < nvi; i++) { format = XRenderFindVisualFormat (dpy, xvi[i].visual); if (format->type == PictTypeDirect && format->direct.alphaMask) { visual = xvi[i].visual; break; } } XFree (xvi); return visual; } void BaseSwitchWindow::paintThumb (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, int x, int y, int width1, int height1, int width2, int height2) { if (!openGLAvailable) return; GLWindowPaintAttrib sAttrib (attrib); IconMode iconMode; int wx, wy; float width, height; GLTexture *icon = NULL; const CompWindow::Geometry &g = window->geometry (); mask |= PAINT_WINDOW_TRANSFORMED_MASK; if (gWindow->textures ().empty ()) iconMode = ShowIconOnly; else iconMode = getIconMode (); if (window->mapNum ()) { if (gWindow->textures ().empty ()) gWindow->bind (); } if (iconMode != ShowIconOnly) { GLenum filter; GLMatrix wTransform (transform); int ww, wh; int addWindowGeometryIndex = gWindow->glAddGeometryGetCurrentIndex (); width = width1; height = height1; ww = window->borderRect ().width (); wh = window->borderRect ().height (); if (ww > width) sAttrib.xScale = width / ww; else sAttrib.xScale = 1.0f; if (wh > height) sAttrib.yScale = height / wh; else sAttrib.yScale = 1.0f; if (sAttrib.xScale < sAttrib.yScale) sAttrib.yScale = sAttrib.xScale; else sAttrib.xScale = sAttrib.yScale; width = ww * sAttrib.xScale; height = wh * sAttrib.yScale; updateIconPos (wx, wy, x, y, width, height); sAttrib.xTranslate = wx - g.x () + window->border ().left * sAttrib.xScale; sAttrib.yTranslate = wy - g.y () + window->border ().top * sAttrib.yScale; if (window->alpha () || sAttrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.translate (g.x (), g.y (), 0.0f); wTransform.scale (sAttrib.xScale, sAttrib.yScale, 1.0f); wTransform.translate (sAttrib.xTranslate / sAttrib.xScale - g.x (), sAttrib.yTranslate / sAttrib.yScale - g.y (), 0.0f); filter = gScreen->textureFilter (); if (baseScreen->getMipmap ()) gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); /* XXX: replacing the addWindowGeometry function like this is very ugly but necessary until the vertex stage has been made fully pluggable. */ gWindow->glAddGeometrySetCurrentIndex (MAXSHORT); gWindow->glDraw (wTransform, sAttrib, infiniteRegion, mask); gWindow->glAddGeometrySetCurrentIndex (addWindowGeometryIndex); gScreen->setTextureFilter (filter); if (iconMode != HideIcon) { icon = gWindow->getIcon (MAX_ICON_SIZE, MAX_ICON_SIZE); if (icon) updateIconTexturedWindow (sAttrib, wx, wy, x, y, icon); } } else { width = width2; height = height2; /* try to get a matching icon first */ icon = gWindow->getIcon (width, height); /* if none found, try a large one */ if (!icon) icon = gWindow->getIcon (MAX_ICON_SIZE, MAX_ICON_SIZE); if (!icon) icon = gScreen->defaultIcon (); if (icon) updateIconNontexturedWindow (sAttrib, wx, wy, width, height, x, y, icon); } if (icon) { CompRegion iconReg (g.x (), g.y (), icon->width (), icon->height ()); GLTexture::MatrixList matrix (1); int addWindowGeometryIndex = gWindow->glAddGeometryGetCurrentIndex (); mask |= PAINT_WINDOW_BLEND_MASK; matrix[0] = icon->matrix (); matrix[0].x0 -= (g.x () * matrix[0].xx); matrix[0].y0 -= (g.y () * matrix[0].yy); sAttrib.xTranslate = wx - g.x (); sAttrib.yTranslate = wy - g.y (); gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometrySetCurrentIndex (MAXSHORT); gWindow->glAddGeometry (matrix, iconReg, infiniteRegion); gWindow->glAddGeometrySetCurrentIndex (addWindowGeometryIndex); if (gWindow->vertexBuffer ()->end ()) { GLMatrix wTransform (transform); wTransform.translate (g.x (), g.y (), 0.0f); wTransform.scale (sAttrib.xScale, sAttrib.yScale, 1.0f); wTransform.translate (sAttrib.xTranslate / sAttrib.xScale - g.x (), sAttrib.yTranslate / sAttrib.yScale - g.y (), 0.0f); gWindow->glDrawTexture (icon, wTransform, sAttrib, mask); } } } bool BaseSwitchWindow::damageRect (bool initial, const CompRect &rect) { if (!openGLAvailable) return true; if (baseScreen->grabIndex) { CompWindow *popup; popup = ::screen->findWindow (baseScreen->popupWindow); if (popup) { foreach (CompWindow *w, baseScreen->windows) { if (window == w) { CompositeWindow::get (popup)->addDamage (); break; } } } } return cWindow->damageRect (initial, rect); } void BaseSwitchScreen::updateForegroundColor () { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; if (!popupWindow) return; result = XGetWindowProperty (::screen->dpy (), popupWindow, selectFgColorAtom, 0L, 4L, false, XA_INTEGER, &actual, &format, &n, &left, &propData); if (result == Success && n && propData) { if (n == 3 || n == 4) { long *data = (long *) propData; fgColor[0] = MIN (0xffff, data[0]); fgColor[1] = MIN (0xffff, data[1]); fgColor[2] = MIN (0xffff, data[2]); if (n == 4) fgColor[3] = MIN (0xffff, data[3]); } XFree (propData); } else { fgColor[0] = 0; fgColor[1] = 0; fgColor[2] = 0; fgColor[3] = 0xffff; } } void BaseSwitchScreen::handleEvent (XEvent *event) { CompWindow *w = NULL; switch (event->type) { case DestroyNotify: /* We need to get the CompWindow * for event->xdestroywindow.window here because in the ::screen->handleEvent call below, that CompWindow's id will become 1, so findWindowAtDisplay won't be able to find the CompWindow after that. */ w = ::screen->findWindow (event->xdestroywindow.window); break; default: break; } ::screen->handleEvent (event); switch (event->type) { case UnmapNotify: w = ::screen->findWindow (event->xunmap.window); windowRemove (w); break; case DestroyNotify: windowRemove (w); break; case PropertyNotify: if (event->xproperty.atom == selectFgColorAtom) { if (event->xproperty.window == popupWindow) updateForegroundColor (); } break; default: break; } } BaseSwitchScreen::BaseSwitchScreen (CompScreen *screen) : popupWindow (None), selectedWindow (NULL), lastActiveNum (0), grabIndex (NULL), moreAdjust (false), selection (CurrentViewport), ignoreSwitcher (false) { CompOption::Vector atomTemplate; CompOption::Value v; CompOption o; if (openGLAvailable) { cScreen = CompositeScreen::get (screen); gScreen = GLScreen::get (screen); } o.setName ("id", CompOption::TypeInt); atomTemplate.push_back (o); selectWinAtom = PropertyWriter (CompString (DECOR_SWITCH_WINDOW_ATOM_NAME), atomTemplate); selectFgColorAtom = XInternAtom (::screen->dpy (), DECOR_SWITCH_FOREGROUND_COLOR_ATOM_NAME, 0); fgColor[0] = 0; fgColor[1] = 0; fgColor[2] = 0; fgColor[3] = 0xffff; } BaseSwitchWindow::BaseSwitchWindow (BaseSwitchScreen *ss, CompWindow *w) : baseScreen (ss), window (w) { if (openGLAvailable) { gWindow = GLWindow::get (w); cWindow = CompositeWindow::get (w); gScreen = GLScreen::get (screen); } } CompizToolboxScreen::CompizToolboxScreen (CompScreen *screen) : PluginClassHandler (screen) { } bool CompizToolboxPluginVTable::init () { if (CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) openGLAvailable = true; else openGLAvailable = false; if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) { CompPrivate p; p.uval = COMPIZ_COMPIZTOOLBOX_ABI; screen->storeValue ("compiztoolbox_ABI", p); return true; } return false; } void CompizToolboxPluginVTable::fini () { screen->eraseValue ("compiztoolbox_ABI"); } compiz-0.9.11+14.04.20140409/plugins/compiztoolbox/include/0000755000015301777760000000000012321344021023510 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/compiztoolbox/include/compiztoolbox/0000755000015301777760000000000012321344021026420 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/compiztoolbox/include/compiztoolbox/compiztoolbox.h0000644000015301777760000001135212321343002031501 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_COMPIZTOOLBOX_H #define _COMPIZ_COMPIZTOOLBOX_H #include #include #include #include #include #include #include #include #include #include #define COMPIZ_COMPIZTOOLBOX_ABI 3 typedef enum { XDGUserDirDesktop = 0, XDGUserDirDownload, XDGUserDirTemplates, XDGUserDirPublicshare, XDGUserDirDocuments, XDGUserDirMusic, XDGUserDirPictures, XDGUserDirVideos } XDGUserDir; CompString getXDGUserDir (XDGUserDir userDir); typedef enum { CurrentViewport = 0, AllViewports, Panels, Group } SwitchWindowSelection; class BaseSwitchScreen { public: BaseSwitchScreen (CompScreen *screen); virtual ~BaseSwitchScreen () {} void handleEvent (XEvent *); void setSelectedWindowHint (bool focus); void activateEvent (bool activating); void updateForegroundColor (); CompWindow *switchToWindow (bool toNext, bool autoChangeVPOption, bool focus); static bool compareWindows (CompWindow *w1, CompWindow *w2); static Visual *findArgbVisual (Display *dpy, int scr); virtual void windowRemove (CompWindow *w) {} virtual void doWindowDamage (CompWindow *w); virtual void handleSelectionChange (bool toNext, int nextIdx) {} virtual void getMinimizedAndMatch (bool &minimizedOption, CompMatch *&matchOption); virtual bool getMipmap () { return false; } CompositeScreen *cScreen; GLScreen *gScreen; PropertyWriter selectWinAtom; Atom selectFgColorAtom; CountedList windows; Window popupWindow; CompWindow *selectedWindow; unsigned int lastActiveNum; CompScreen::GrabHandle grabIndex; bool moreAdjust; SwitchWindowSelection selection; unsigned int fgColor[4]; bool ignoreSwitcher; }; class BaseSwitchWindow { public: enum IconMode { HideIcon, /* show thumbnail, but hide icon */ ShowIcon, /* show thumbnail and icon */ ShowIconOnly /* show only icon */ }; BaseSwitchWindow (BaseSwitchScreen *, CompWindow *); virtual ~BaseSwitchWindow () {} void paintThumb (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, int x, int y, int width1, int height1, int width2, int height2); virtual void updateIconTexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, int x, int y, GLTexture *icon) {} virtual void updateIconNontexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, float &width, float &height, int x, int y, GLTexture *icon) {} virtual IconMode getIconMode () { return HideIcon; } virtual void updateIconPos (int &wx, int &wy, int x, int y, float width, float height) {} bool damageRect (bool, const CompRect &); bool isSwitchWin (bool removing = false); BaseSwitchScreen *baseScreen; GLWindow *gWindow; CompositeWindow *cWindow; GLScreen *gScreen; CompWindow *window; }; extern const unsigned short ICON_SIZE; extern const unsigned short MAX_ICON_SIZE; #endif compiz-0.9.11+14.04.20140409/plugins/extrawm/0000755000015301777760000000000012321344021020644 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/extrawm/extrawm.xml.in0000644000015301777760000000252312321343002023462 0ustar pbusernogroup00000000000000 <_short>Extra WM Actions <_long>Provides less commonly used WM actions Window Management composite opengl decor compiz-0.9.11+14.04.20140409/plugins/extrawm/CMakeLists.txt0000644000015301777760000000014512321343002023402 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (extrawm PLUGINDEPS composite) compiz-0.9.11+14.04.20140409/plugins/extrawm/src/0000755000015301777760000000000012321344021021433 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/extrawm/src/extrawm.cpp0000644000015301777760000001650212321343002023630 0ustar pbusernogroup00000000000000/* * Compiz extra WM actions plugins * extrawm.cpp * * Copyright: (C) 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "extrawm.h" COMPIZ_PLUGIN_20090315 (extrawm, ExtraWMPluginVTable); bool compositeAvailable; void ExtraWMScreen::addAttentionWindow (CompWindow *w) { std::list ::iterator it; /* check if the window is already there */ for (it = attentionWindows.begin (); it != attentionWindows.end (); ++it) { if (*it == w) return; } attentionWindows.push_back (w); } void ExtraWMScreen::removeAttentionWindow (CompWindow *w) { attentionWindows.remove (w); } void ExtraWMScreen::updateAttentionWindow (CompWindow *w) { XWMHints *hints; bool urgent = false; if (w->overrideRedirect ()) return; if (w->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return; hints = XGetWMHints (screen->dpy (), w->id ()); if (hints) { if (hints->flags & XUrgencyHint) urgent = true; XFree (hints); } if (urgent || (w->state () & CompWindowStateDemandsAttentionMask)) addAttentionWindow (w); else removeAttentionWindow (w); } bool ExtraWMScreen::activateDemandsAttention (CompAction *action, CompAction::State state, CompOption::Vector &options) { EXTRAWM_SCREEN (screen); if (!es->attentionWindows.empty ()) { CompWindowList::iterator it = es->attentionWindows.begin (); /* We want to keep these windows in the list and skip over them * if they are currently unmapped (since they could be mapped * again, and that would mean that we'd want to handle them * if they became wanting attention again) */ for (; it != es->attentionWindows.end (); ++it) { CompWindow *w = *it; if (!w->mapNum () || !w->isViewable ()) { if (!w->minimized () && !w->inShowDesktopMode () && !w->shaded ()) { continue; } } w->activate (); break; } } return false; } bool ExtraWMScreen::activateWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; Window xid; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findWindow (xid); if (w) screen->sendWindowActivationRequest (w->id ()); return true; } void ExtraWMScreen::fullscreenWindow (CompWindow *w, unsigned int state) { unsigned int newState = w->state (); if (w->overrideRedirect ()) return; /* It would be a bug, to put a shaded window to fullscreen. */ if (w->shaded ()) return; state = w->constrainWindowState (state, w->actions ()); state &= CompWindowStateFullscreenMask; if (state == (w->state () & CompWindowStateFullscreenMask)) return; newState &= ~CompWindowStateFullscreenMask; newState |= state; w->changeState (newState); w->updateAttributes (CompStackingUpdateModeNormal); } bool ExtraWMScreen::toggleFullscreen (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; Window xid; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findWindow (xid); if (w && (w->actions () & CompWindowActionFullscreenMask)) { EXTRAWM_SCREEN (screen); es->fullscreenWindow (w, w->state () ^ CompWindowStateFullscreenMask); } return true; } bool ExtraWMScreen::toggleRedirect (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; Window xid; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findTopLevelWindow (xid); if (!compositeAvailable) { compLogMessage ("extrawm", CompLogLevelWarn, "composite plugin "\ "not loaded, cannot redirect/unredirect window"); return true; } if (w) { CompositeWindow *cWindow = CompositeWindow::get (w); if (cWindow) { if (cWindow->redirected ()) cWindow->unredirect (); else cWindow->redirect (); } } return true; } bool ExtraWMScreen::toggleAlwaysOnTop (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; Window xid; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findTopLevelWindow (xid); if (w) { unsigned int newState; newState = w->state () ^ CompWindowStateAboveMask; w->changeState (newState); w->updateAttributes (CompStackingUpdateModeNormal); } return true; } bool ExtraWMScreen::toggleSticky (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; Window xid; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findTopLevelWindow (xid); if (w && (w->actions () & CompWindowActionStickMask)) { unsigned int newState; newState = w->state () ^ CompWindowStateStickyMask; w->changeState (newState); } return true; } void ExtraWMScreen::handleEvent (XEvent *event) { screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == XA_WM_HINTS) { CompWindow *w; w = screen->findWindow (event->xproperty.window); if (w) updateAttentionWindow (w); } break; default: break; } } void ExtraWMWindow::stateChangeNotify (unsigned int lastState) { EXTRAWM_SCREEN (screen); window->stateChangeNotify (lastState); if ((window->state () ^ lastState) & CompWindowStateDemandsAttentionMask) es->updateAttentionWindow (window); } ExtraWMScreen::ExtraWMScreen (CompScreen *screen) : PluginClassHandler (screen), ExtrawmOptions () { ScreenInterface::setHandler (screen); optionSetToggleRedirectKeyInitiate (toggleRedirect); optionSetToggleAlwaysOnTopKeyInitiate (toggleAlwaysOnTop); optionSetToggleStickyKeyInitiate (toggleSticky); optionSetToggleFullscreenKeyInitiate (toggleFullscreen); optionSetActivateInitiate (activateWin); optionSetActivateDemandsAttentionKeyInitiate (activateDemandsAttention); } ExtraWMWindow::ExtraWMWindow (CompWindow *window) : PluginClassHandler (window), window (window) { WindowInterface::setHandler (window); } ExtraWMWindow::~ExtraWMWindow () { ExtraWMScreen::get (screen)->removeAttentionWindow (window); } bool ExtraWMPluginVTable::init () { if (CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI)) compositeAvailable = true; else compositeAvailable = false; if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/extrawm/src/extrawm.h0000644000015301777760000000535012321343002023274 0ustar pbusernogroup00000000000000/* * extrawm.h * Compiz extra WM actions plugins * Copyright: (C) 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "extrawm_options.h" class ExtraWMScreen : public PluginClassHandler , public ExtrawmOptions, public ScreenInterface { public: std::list attentionWindows; ExtraWMScreen (CompScreen *); void handleEvent (XEvent *); void addAttentionWindow (CompWindow *w); void removeAttentionWindow (CompWindow *w); void updateAttentionWindow (CompWindow *w); void fullscreenWindow (CompWindow *w, unsigned int state); static bool activateDemandsAttention (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool activateWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleFullscreen (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleRedirect (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleAlwaysOnTop (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleSticky (CompAction *action, CompAction::State state, CompOption::Vector &options); }; class ExtraWMWindow : public PluginClassHandler , public WindowInterface { public: ExtraWMWindow (CompWindow *); ~ExtraWMWindow (); CompWindow *window; void stateChangeNotify (unsigned int); }; #define EXTRAWM_SCREEN(s) \ ExtraWMScreen *es = ExtraWMScreen::get (s); #define EXTRAWM_WINDOW(w) \ ExtraWMWindow *ew = ExtraWMWindow::get (w); class ExtraWMPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/firepaint/0000755000015301777760000000000012321344021021136 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/firepaint/CMakeLists.txt0000644000015301777760000000015612321343002023676 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (firepaint PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/firepaint/src/0000755000015301777760000000000012321344021021725 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/firepaint/src/firepaint.cpp0000644000015301777760000004212612321343002024415 0ustar pbusernogroup00000000000000/* * Compiz fire effect plugin * * firepaint.cpp * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.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. * */ #include "firepaint.h" COMPIZ_PLUGIN_20090315 (firepaint, FirePluginVTable); /* 3 vertices per triangle, 2 triangles per particle */ const unsigned short CACHESIZE_FACTOR = 3 * 2; /* 2 coordinates, x and y */ const unsigned short COORD_COMPONENTS = CACHESIZE_FACTOR * 2; /* each vertex is stored as 3 GLfloats */ const unsigned short VERTEX_COMPONENTS = CACHESIZE_FACTOR * 3; /* 4 colors, RGBA */ const unsigned short COLOR_COMPONENTS = CACHESIZE_FACTOR * 4; Particle::Particle () : life (0), fade (0), width (0), height (0), w_mod (0), h_mod (0), r (0), g (0), b (0), a (0), x (0), y (0), z (0), xi (0), yi (0), zi (0), xg (0), yg (0), zg (0), xo (0), yo (0), zo (0) { } ParticleSystem::ParticleSystem (int n) : x (0), y (0) { initParticles (n); } ParticleSystem::ParticleSystem () : slowdown (1.0f), tex (0), active (false), x (0), y (0), darken (0.0f), blendMode (0) { initParticles (0); } ParticleSystem::~ParticleSystem () { finiParticles (); } void ParticleSystem::initParticles (int f_numParticles) { particles.clear (); // Initialize cache vertices_cache.clear (); coords_cache.clear (); colors_cache.clear (); dcolors_cache.clear (); for (int i = 0; i < f_numParticles; ++i) { Particle p; p.life = 0.0f; particles.push_back (p); } } void ParticleSystem::drawParticles(const GLMatrix &transform) { int i, j, k, l; /* Check that the cache is big enough */ if (vertices_cache.size () < particles.size () * VERTEX_COMPONENTS) vertices_cache.resize (particles.size () * VERTEX_COMPONENTS); if (coords_cache.size () < particles.size () * COORD_COMPONENTS) coords_cache.resize (particles.size () * COORD_COMPONENTS); if (colors_cache.size () < particles.size () * COLOR_COMPONENTS) colors_cache.resize (particles.size () * COLOR_COMPONENTS); if (darken > 0) if (dcolors_cache.size () < particles.size () * COLOR_COMPONENTS) dcolors_cache.resize (particles.size () * COLOR_COMPONENTS); GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); if (!glBlendEnabled) glEnable (GL_BLEND); if (tex) { glBindTexture (GL_TEXTURE_2D, tex); glEnable (GL_TEXTURE_2D); } i = j = k = l = 0; GLfloat w, h; GLfloat xMinusW, xPlusW, yMinusH, yPlusH; GLushort r, g, b, a, dark_a; /* for each particle, use two triangles to display it */ foreach (Particle &part, particles) { if (part.life > 0.0f) { w = part.width / 2.0f; h = part.height / 2.0f; r = part.r * 65535.0f; g = part.g * 65535.0f; b = part.b * 65535.0f; a = part.life * part.a * 65535.0f; dark_a = part.life * part.a * 65535.0f * darken; w += w * part.w_mod * part.life; h += h * part.h_mod * part.life; xMinusW = part.x - w; xPlusW = part.x + w; yMinusH = part.y - h; yPlusH = part.y + h; //first triangle vertices_cache[i + 0] = xMinusW; vertices_cache[i + 1] = yMinusH; vertices_cache[i + 2] = part.z; vertices_cache[i + 3] = xMinusW; vertices_cache[i + 4] = yPlusH; vertices_cache[i + 5] = part.z; vertices_cache[i + 6] = xPlusW; vertices_cache[i + 7] = yPlusH; vertices_cache[i + 8] = part.z; //second triangle vertices_cache[i + 9] = xPlusW; vertices_cache[i + 10] = yPlusH; vertices_cache[i + 11] = part.z; vertices_cache[i + 12] = xPlusW; vertices_cache[i + 13] = yMinusH; vertices_cache[i + 14] = part.z; vertices_cache[i + 15] = xMinusW; vertices_cache[i + 16] = yMinusH; vertices_cache[i + 17] = part.z; i += 18; coords_cache[j + 0] = 0.0; coords_cache[j + 1] = 0.0; coords_cache[j + 2] = 0.0; coords_cache[j + 3] = 1.0; coords_cache[j + 4] = 1.0; coords_cache[j + 5] = 1.0; //second coords_cache[j + 6] = 1.0; coords_cache[j + 7] = 1.0; coords_cache[j + 8] = 1.0; coords_cache[j + 9] = 0.0; coords_cache[j + 10] = 0.0; coords_cache[j + 11] = 0.0; j += 12; colors_cache[k + 0] = r; colors_cache[k + 1] = g; colors_cache[k + 2] = b; colors_cache[k + 3] = a; colors_cache[k + 4] = r; colors_cache[k + 5] = g; colors_cache[k + 6] = b; colors_cache[k + 7] = a; colors_cache[k + 8] = r; colors_cache[k + 9] = g; colors_cache[k + 10] = b; colors_cache[k + 11] = a; //second colors_cache[k + 12] = r; colors_cache[k + 13] = g; colors_cache[k + 14] = b; colors_cache[k + 15] = a; colors_cache[k + 16] = r; colors_cache[k + 17] = g; colors_cache[k + 18] = b; colors_cache[k + 19] = a; colors_cache[k + 20] = r; colors_cache[k + 21] = g; colors_cache[k + 22] = b; colors_cache[k + 23] = a; k += 24; if (darken > 0) { dcolors_cache[l + 0] = r; dcolors_cache[l + 1] = g; dcolors_cache[l + 2] = b; dcolors_cache[l + 3] = dark_a; dcolors_cache[l + 4] = r; dcolors_cache[l + 5] = g; dcolors_cache[l + 6] = b; dcolors_cache[l + 7] = dark_a; dcolors_cache[l + 8] = r; dcolors_cache[l + 9] = g; dcolors_cache[l + 10] = b; dcolors_cache[l + 11] = dark_a; //second dcolors_cache[l + 12] = r; dcolors_cache[l + 13] = g; dcolors_cache[l + 14] = b; dcolors_cache[l + 15] = dark_a; dcolors_cache[l + 16] = r; dcolors_cache[l + 17] = g; dcolors_cache[l + 18] = b; dcolors_cache[l + 19] = dark_a; dcolors_cache[l + 20] = r; dcolors_cache[l + 21] = g; dcolors_cache[l + 22] = b; dcolors_cache[l + 23] = dark_a; l += 24; } } } GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); if (darken > 0) { glBlendFunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); stream->begin (GL_TRIANGLES); stream->addVertices (i / 3, &vertices_cache[0]); stream->addTexCoords (0, j / 2, &coords_cache[0]); stream->addColors (l / 4, &dcolors_cache[0]); if (stream->end ()) stream->render (transform); } /* draw particles */ glBlendFunc (GL_SRC_ALPHA, blendMode); stream->begin (GL_TRIANGLES); stream->addVertices (i / 3, &vertices_cache[0]); stream->addTexCoords (0, j / 2, &coords_cache[0]); stream->addColors (k / 4, &colors_cache[0]); if (stream->end ()) stream->render (transform); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_TEXTURE_2D); /* only disable blending if it was disabled before */ if (!glBlendEnabled) glDisable (GL_BLEND); } void ParticleSystem::updateParticles (float time) { float speed = (time / 50.0); float f_slowdown = slowdown * (1 - MAX (0.99, time / 1000.0)) * 1000; active = false; foreach (Particle &part, particles) { if (part.life > 0.0f) { // move particle part.x += part.xi / f_slowdown; part.y += part.yi / f_slowdown; part.z += part.zi / f_slowdown; // modify speed part.xi += part.xg * speed; part.yi += part.yg * speed; part.zi += part.zg * speed; // modify life part.life -= part.fade * speed; active = true; } } } void ParticleSystem::finiParticles () { particles.clear (); if (tex) glDeleteTextures (1, &tex); } static void toggleFunctions (bool enabled) { FIRE_SCREEN (screen); screen->handleEventSetEnabled (fs, enabled); fs->cScreen->preparePaintSetEnabled (fs, enabled); fs->gScreen->glPaintOutputSetEnabled (fs, enabled); fs->cScreen->donePaintSetEnabled (fs, enabled); } void FireScreen::fireAddPoint (int x, int y, bool requireGrab) { if (!requireGrab || grabIndex) { XPoint p; p.x = x; p.y = y; points.push_back (p); toggleFunctions (true); } } bool FireScreen::addParticle (CompAction *action, CompAction::State state, CompOption::Vector options) { float x = CompOption::getFloatOptionNamed (options, "x", 0); float y = CompOption::getFloatOptionNamed (options, "y", 0); fireAddPoint (x, y, false); cScreen->damageScreen (); return true; } bool FireScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (screen->otherGrabExist (NULL)) return false; if (!grabIndex) grabIndex = screen->pushGrab (None, "firepaint"); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); fireAddPoint (pointerX, pointerY, true); return true; } bool FireScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (grabIndex) { screen->removeGrab (grabIndex, NULL); grabIndex = 0; } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } bool FireScreen::clear (CompAction *action, CompAction::State state, CompOption::Vector options) { points.clear (); return true; } void FireScreen::preparePaint (int time) { float bg = optionGetBgBrightness () / 100.0f; if (init && !points.empty ()) { ps.initParticles (optionGetNumParticles ()); init = false; glGenTextures (1, &ps.tex); glBindTexture (GL_TEXTURE_2D, ps.tex); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, fireTex); glBindTexture (GL_TEXTURE_2D, 0); ps.slowdown = optionGetFireSlowdown (); ps.darken = 0.5f; /* TODO: Magic number */ ps.blendMode = GL_ONE; } if (!init) ps.updateParticles (time); if (!points.empty ()) { int rVal2; float rVal, size = 4; float fireLife = optionGetFireLife (); float fireWidth = optionGetFireSize (); float fireHeight = fireWidth * 1.5f; bool mystFire = optionGetFireMystical (); float max_new = MIN ((int) ps.particles.size (), (int) points.size () * 2) * ((float) time / 50.0f) * (1.05f - fireLife); for (unsigned int i = 0; i < ps.particles.size () && max_new > 0; ++i) { Particle &part = ps.particles.at (i); if (part.life <= 0.0f) { /* give gt new life */ rVal = (float) (random () & 0xff) / 255.0; part.life = 1.0f; /* Random Fade Value */ part.fade = (rVal * (1 - fireLife) + (0.2f * (1.01 - fireLife))); /* set size */ part.width = fireWidth; part.height = fireHeight; rVal = (float) (random () & 0xff) / 255.0; part.w_mod = size * rVal; part.h_mod = size * rVal; /* choose random position */ rVal2 = random () % points.size (); part.x = points.at (rVal2).x; part.y = points.at (rVal2).y; part.z = 0.0f; part.xo = part.x; part.yo = part.y; part.zo = part.z; /* set speed and direction */ rVal = (float) (random () & 0xff) / 255.0; part.xi = ( (rVal * 20.0) - 10.0f); rVal = (float) (random () & 0xff) / 255.0; part.yi = ( (rVal * 20.0) - 15.0f); part.zi = 0.0f; rVal = (float) (random () & 0xff) / 255.0; if (mystFire) { /* Random colors! (aka Mystical Fire) */ rVal = (float) (random () & 0xff) / 255.0; part.r = rVal; rVal = (float) (random () & 0xff) / 255.0; part.g = rVal; rVal = (float) (random () & 0xff) / 255.0; part.b = rVal; } else { part.r = optionGetFireColorRed () / 0xffff - (rVal / 1.7 * optionGetFireColorRed () / 0xffff); part.g = optionGetFireColorGreen () / 0xffff - (rVal / 1.7 * optionGetFireColorGreen () / 0xffff); part.b = optionGetFireColorBlue () / 0xffff - (rVal / 1.7 * optionGetFireColorBlue () / 0xffff); } /* set transparency */ part.a = (float) optionGetFireColorAlpha () / 0xffff; /* set gravity */ part.xg = (part.x < part.xo) ? 1.0 : -1.0; part.yg = -3.0f; part.zg = 0.0f; ps.active = true; max_new -= 1; } else part.xg = (part.x < part.xo) ? 1.0 : -1.0; } } if (points.size () && brightness != bg) { float div = 1.0 - bg; div *= (float) time / 500.0; brightness = MAX (bg, brightness - div); } if (points.empty () && brightness != 1.0) { float div = 1.0 - bg; div *= (float) time / 500.0; brightness = MIN (1.0, brightness + div); } if (!init && points.empty () && !ps.active) { ps.finiParticles (); init = true; } cScreen->preparePaint (time); } bool FireScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if ((!init && ps.active) || brightness < 1.0) { GLMatrix sTransform = transform; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); if (brightness < 1.0) { /* cover the screen with a rectangle and darken it * (coded as two GL_TRIANGLES for GLES compatibility) */ GLfloat vertices[18]; GLushort colors[24]; vertices[0] = (GLfloat)output->region ()->extents.x1; vertices[1] = (GLfloat)output->region ()->extents.y1; vertices[2] = 0.0f; vertices[3] = (GLfloat)output->region ()->extents.x1; vertices[4] = (GLfloat)output->region ()->extents.y2; vertices[5] = 0.0f; vertices[6] = (GLfloat)output->region ()->extents.x2; vertices[7] = (GLfloat)output->region ()->extents.y2; vertices[8] = 0.0f; vertices[9] = (GLfloat)output->region ()->extents.x2; vertices[10] = (GLfloat)output->region ()->extents.y2; vertices[11] = 0.0f; vertices[12] = (GLfloat)output->region ()->extents.x2; vertices[13] = (GLfloat)output->region ()->extents.y1; vertices[14] = 0.0f; vertices[15] = (GLfloat)output->region ()->extents.x1; vertices[16] = (GLfloat)output->region ()->extents.y1; vertices[17] = 0.0f; for (int i = 0; i <= 5; ++i) { colors[i*4+0] = 0; colors[i*4+1] = 0; colors[i*4+2] = 0; colors[i*4+3] = (1.0 - brightness) * 65535.0f; } GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); if (!glBlendEnabled) glEnable (GL_BLEND); stream->begin (GL_TRIANGLES); stream->addVertices (6, vertices); stream->addColors (6, colors); if (stream->end ()) stream->render (sTransform); /* only disable blending if it was already disabled */ if (!glBlendEnabled) glDisable (GL_BLEND); } if (!init && ps.active) ps.drawParticles (sTransform); } return status; } void FireScreen::donePaint () { if ( (!init && ps.active) || !points.empty () || brightness < 1.0) cScreen->damageScreen (); else toggleFunctions (false); cScreen->donePaint (); } void FireScreen::handleEvent (XEvent *event) { switch (event->type) { case MotionNotify: fireAddPoint (pointerX, pointerY, true); break; case EnterNotify: case LeaveNotify: fireAddPoint (pointerX, pointerY, true); break; default: break; } screen->handleEvent (event); } FireScreen::FireScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), init (true), brightness (1.0), grabIndex (0) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); optionSetInitiateKeyInitiate (boost::bind (&FireScreen::initiate, this, _1, _2, _3)); optionSetInitiateButtonInitiate (boost::bind (&FireScreen::initiate, this, _1, _2, _3)); optionSetInitiateKeyTerminate (boost::bind (&FireScreen::terminate, this, _1, _2, _3)); optionSetInitiateButtonTerminate (boost::bind (&FireScreen::terminate, this, _1, _2, _3)); optionSetClearKeyInitiate (boost::bind (&FireScreen::clear, this, _1, _2, _3)); optionSetClearButtonInitiate (boost::bind (&FireScreen::clear, this, _1, _2, _3)); optionSetAddParticleInitiate (boost::bind (&FireScreen::addParticle, this, _1, _2, _3)); } FireScreen::~FireScreen () { if (!init) ps.finiParticles (); } bool FirePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/firepaint/src/firepaint_tex.h0000644000015301777760000004002112321343002024732 0ustar pbusernogroup00000000000000/** * * Particle texture for Firepaint Plugin * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.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. * **/ const unsigned char fireTex[4097] = { "\0\0\0\0\377\377\377\3\377\377\377\2\377\377\377\5\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\12\377\377\377\13\377\377\377\11\377\377" "\377\12\377\377\377\12\377\377\377\14\377\377\377\14\377\377\377\14\377\377" "\377\16\377\377\377\15\377\377\377\14\377\377\377\12\377\377\377\13\377\377" "\377\13\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\10\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\2\0\0\0\0\0" "\0\0\0\377\377\377\4\377\377\377\3\377\377\377\4\377\377\377\7\377\377\377" "\6\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\14\377\377\377" "\14\377\377\377\15\377\377\377\16\377\377\377\20\377\377\377\21\377\377\377" "\20\377\377\377\22\377\377\377\20\377\377\377\21\377\377\377\17\377\377\377" "\20\377\377\377\17\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\11\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\4\377\377\377\1\0\0\0\0\377\377\377\5\377\377\377\4\377\377\377\6\377\377" "\377\6\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\14\377\377" "\377\15\377\377\377\20\377\377\377\20\377\377\377\24\377\377\377\24\377\377" "\377\23\377\377\377\23\377\377\377\26\377\377\377\25\377\377\377\23\377\377" "\377\21\377\377\377\24\377\377\377\22\377\377\377\17\377\377\377\17\377\377" "\377\15\377\377\377\15\377\377\377\11\377\377\377\11\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\3\377\377\377\3\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377" "\13\377\377\377\17\377\377\377\22\377\377\377\24\377\377\377\22\377\377\377" "\30\377\377\377\30\377\377\377\31\377\377\377\31\377\377\377\33\377\377\377" "\31\377\377\377\30\377\377\377\30\377\377\377\30\377\377\377\25\377\377\377" "\25\377\377\377\23\377\377\377\22\377\377\377\17\377\377\377\13\377\377\377" "\12\377\377\377\11\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377" "\4\377\377\377\7\377\377\377\6\377\377\377\12\377\377\377\11\377\377\377" "\14\377\377\377\15\377\377\377\20\377\377\377\22\377\377\377\25\377\377\377" "\30\377\377\377\32\377\377\377\35\377\377\377\34\377\377\377\34\377\377\377" "\36\377\377\377\40\377\377\377\36\377\377\377\34\377\377\377\34\377\377\377" "\34\377\377\377\32\377\377\377\31\377\377\377\26\377\377\377\25\377\377\377" "\22\377\377\377\16\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\10\377\377\377\6\377\377\377\4\377\377\377\10\377\377\377\11\377\377\377" "\12\377\377\377\13\377\377\377\16\377\377\377\21\377\377\377\22\377\377\377" "\25\377\377\377\30\377\377\377\34\377\377\377\37\377\377\377!\377\377\377" "\"\377\377\377#\377\377\377#\377\377\377&\377\377\377&\377\377\377$\377\377" "\377#\377\377\377\40\377\377\377!\377\377\377\35\377\377\377\34\377\377\377" "\25\377\377\377\24\377\377\377\21\377\377\377\15\377\377\377\14\377\377\377" "\14\377\377\377\12\377\377\377\6\377\377\377\6\377\377\377\10\377\377\377" "\12\377\377\377\12\377\377\377\16\377\377\377\22\377\377\377\24\377\377\377" "\26\377\377\377\30\377\377\377\34\377\377\377\37\377\377\377#\377\377\377" "&\377\377\377,\377\377\377+\377\377\377,\377\377\377-\377\377\377-\377\377" "\377,\377\377\377+\377\377\377&\377\377\377)\377\377\377$\377\377\377\34" "\377\377\377\34\377\377\377\27\377\377\377\24\377\377\377\23\377\377\377" "\17\377\377\377\15\377\377\377\12\377\377\377\7\377\377\377\6\377\377\377" "\12\377\377\377\12\377\377\377\16\377\377\377\21\377\377\377\22\377\377\377" "\27\377\377\377\31\377\377\377\36\377\377\377!\377\377\377%\377\377\377(" "\377\377\3771\377\377\3772\377\377\3775\377\377\377;\377\377\377<\377\377" "\3779\377\377\3778\377\377\3773\377\377\3771\377\377\377-\377\377\377'\377" "\377\377\"\377\377\377\34\377\377\377\36\377\377\377\32\377\377\377\25\377" "\377\377\21\377\377\377\15\377\377\377\11\377\377\377\12\377\377\377\7\377" "\377\377\13\377\377\377\14\377\377\377\17\377\377\377\21\377\377\377\31\377" "\377\377\31\377\377\377\35\377\377\377!\377\377\377'\377\377\377+\377\377" "\3771\377\377\377=\377\377\377E\377\377\377H\377\377\377M\377\377\377M\377" "\377\377J\377\377\377I\377\377\377A\377\377\377A\377\377\3778\377\377\377" ",\377\377\377%\377\377\377$\377\377\377\"\377\377\377\34\377\377\377\24\377" "\377\377\22\377\377\377\17\377\377\377\13\377\377\377\12\377\377\377\11\377" "\377\377\13\377\377\377\14\377\377\377\20\377\377\377\23\377\377\377\27\377" "\377\377\35\377\377\377$\377\377\377(\377\377\377.\377\377\3776\377\377\377" "=\377\377\377H\377\377\377W\377\377\377Y\377\377\377]\377\377\377a\377\377" "\377\\\377\377\377\\\377\377\377U\377\377\377O\377\377\377?\377\377\3774" "\377\377\377-\377\377\377+\377\377\377\40\377\377\377\32\377\377\377\27\377" "\377\377\23\377\377\377\22\377\377\377\15\377\377\377\11\377\377\377\13\377" "\377\377\12\377\377\377\15\377\377\377\21\377\377\377\25\377\377\377\30\377" "\377\377\37\377\377\377$\377\377\377.\377\377\3779\377\377\377?\377\377\377" "N\377\377\377X\377\377\377h\377\377\377r\377\377\377w\377\377\377|\377\377" "\377x\377\377\377p\377\377\377k\377\377\377\\\377\377\377J\377\377\377F\377" "\377\3779\377\377\377*\377\377\377$\377\377\377\36\377\377\377\30\377\377" "\377\25\377\377\377\24\377\377\377\20\377\377\377\14\377\377\377\12\377\377" "\377\15\377\377\377\17\377\377\377\22\377\377\377\27\377\377\377\34\377\377" "\377\40\377\377\377%\377\377\377.\377\377\377<\377\377\377M\377\377\377[" "\377\377\377l\377\377\377~\377\377\377\227\377\377\377\230\377\377\377\234" "\377\377\377\233\377\377\377\226\377\377\377\205\377\377\377i\377\377\377" "b\377\377\377P\377\377\3779\377\377\377-\377\377\377(\377\377\377!\377\377" "\377\35\377\377\377\32\377\377\377\25\377\377\377\21\377\377\377\13\377\377" "\377\12\377\377\377\15\377\377\377\21\377\377\377\23\377\377\377\31\377\377" "\377\37\377\377\377!\377\377\377(\377\377\3774\377\377\377@\377\377\377Q" "\377\377\377g\377\377\377\200\377\377\377\231\377\377\377\254\377\377\377" "\275\377\377\377\310\377\377\377\304\377\377\377\264\377\377\377\227\377" "\377\377\212\377\377\377f\377\377\377Q\377\377\377B\377\377\377:\377\377" "\377/\377\377\377&\377\377\377\36\377\377\377\32\377\377\377\26\377\377\377" "\21\377\377\377\14\377\377\377\12\377\377\377\17\377\377\377\22\377\377\377" "\24\377\377\377\31\377\377\377\40\377\377\377&\377\377\377-\377\377\377:" "\377\377\377H\377\377\377X\377\377\377k\377\377\377\220\377\377\377\252\377" "\377\377\324\377\377\377\363\377\377\377\370\377\377\377\366\377\377\377" "\335\377\377\377\263\377\377\377\221\377\377\377w\377\377\377b\377\377\377" "P\377\377\377>\377\377\3770\377\377\377&\377\377\377\37\377\377\377\32\377" "\377\377\26\377\377\377\23\377\377\377\15\377\377\377\11\377\377\377\16\377" "\377\377\21\377\377\377\27\377\377\377\33\377\377\377\"\377\377\377(\377" "\377\377/\377\377\377<\377\377\377N\377\377\377b\377\377\377z\377\377\377" "\231\377\377\377\275\377\377\377\361\377\377\377\375\377\377\377\376\377" "\377\377\376\377\377\377\370\377\377\377\316\377\377\377\240\377\377\377" "\205\377\377\377b\377\377\377L\377\377\377<\377\377\377.\377\377\377&\377" "\377\377\40\377\377\377\33\377\377\377\26\377\377\377\22\377\377\377\15\377" "\377\377\12\377\377\377\16\377\377\377\22\377\377\377\24\377\377\377\32\377" "\377\377\40\377\377\377$\377\377\377,\377\377\377:\377\377\377L\377\377\377" "`\377\377\377|\377\377\377\231\377\377\377\310\377\377\377\372\377\377\377" "\375\377\377\377\376\377\377\377\376\377\377\377\375\377\377\377\332\377" "\377\377\241\377\377\377\207\377\377\377f\377\377\377R\377\377\377@\377\377" "\3773\377\377\377+\377\377\377\"\377\377\377\35\377\377\377\30\377\377\377" "\24\377\377\377\17\377\377\377\14\377\377\377\16\377\377\377\22\377\377\377" "\25\377\377\377\30\377\377\377\40\377\377\377$\377\377\377,\377\377\377;" "\377\377\377N\377\377\377e\377\377\377\206\377\377\377\246\377\377\377\327" "\377\377\377\374\377\377\377\375\377\377\377\376\377\377\377\376\377\377" "\377\374\377\377\377\331\377\377\377\243\377\377\377\210\377\377\377b\377" "\377\377O\377\377\377>\377\377\377.\377\377\377&\377\377\377\40\377\377\377" "\33\377\377\377\27\377\377\377\22\377\377\377\15\377\377\377\12\377\377\377" "\16\377\377\377\22\377\377\377\23\377\377\377\32\377\377\377\40\377\377\377" "'\377\377\3770\377\377\377?\377\377\377U\377\377\377h\377\377\377\200\377" "\377\377\237\377\377\377\270\377\377\377\344\377\377\377\372\377\377\377" "\375\377\377\377\376\377\377\377\354\377\377\377\275\377\377\377\227\377" "\377\377\200\377\377\377e\377\377\377Q\377\377\377>\377\377\377.\377\377" "\377%\377\377\377\40\377\377\377\33\377\377\377\26\377\377\377\22\377\377" "\377\15\377\377\377\11\377\377\377\17\377\377\377\22\377\377\377\25\377\377" "\377\31\377\377\377\"\377\377\377*\377\377\3773\377\377\377=\377\377\377" "J\377\377\377^\377\377\377o\377\377\377\211\377\377\377\235\377\377\377\271" "\377\377\377\327\377\377\377\342\377\377\377\335\377\377\377\302\377\377" "\377\240\377\377\377\216\377\377\377k\377\377\377X\377\377\377C\377\377\377" "9\377\377\377/\377\377\377&\377\377\377\"\377\377\377\33\377\377\377\26\377" "\377\377\22\377\377\377\14\377\377\377\12\377\377\377\15\377\377\377\22\377" "\377\377\31\377\377\377\35\377\377\377\37\377\377\377$\377\377\377,\377\377" "\3777\377\377\377A\377\377\377Q\377\377\377[\377\377\377p\377\377\377\212" "\377\377\377\231\377\377\377\242\377\377\377\253\377\377\377\251\377\377" "\377\236\377\377\377\215\377\377\377u\377\377\377b\377\377\377O\377\377\377" "<\377\377\3771\377\377\377)\377\377\377\"\377\377\377\34\377\377\377\32\377" "\377\377\27\377\377\377\21\377\377\377\16\377\377\377\12\377\377\377\17\377" "\377\377\21\377\377\377\20\377\377\377\27\377\377\377\37\377\377\377$\377" "\377\377&\377\377\377,\377\377\3778\377\377\377B\377\377\377R\377\377\377" "_\377\377\377k\377\377\377~\377\377\377\207\377\377\377\220\377\377\377\220" "\377\377\377\203\377\377\377q\377\377\377_\377\377\377V\377\377\377F\377" "\377\3777\377\377\377,\377\377\377%\377\377\377!\377\377\377\31\377\377\377" "\25\377\377\377\22\377\377\377\17\377\377\377\14\377\377\377\11\377\377\377" "\12\377\377\377\16\377\377\377\22\377\377\377\27\377\377\377\33\377\377\377" "\35\377\377\377\"\377\377\377(\377\377\377/\377\377\3779\377\377\377E\377" "\377\377L\377\377\377^\377\377\377d\377\377\377e\377\377\377k\377\377\377" "l\377\377\377d\377\377\377a\377\377\377O\377\377\377C\377\377\377=\377\377" "\3770\377\377\377)\377\377\377$\377\377\377\35\377\377\377\30\377\377\377" "\25\377\377\377\22\377\377\377\16\377\377\377\12\377\377\377\13\377\377\377" "\13\377\377\377\15\377\377\377\20\377\377\377\21\377\377\377\31\377\377\377" "\33\377\377\377\35\377\377\377$\377\377\377)\377\377\3771\377\377\3776\377" "\377\377@\377\377\377J\377\377\377N\377\377\377P\377\377\377S\377\377\377" "X\377\377\377P\377\377\377J\377\377\377E\377\377\3777\377\377\377,\377\377" "\377+\377\377\377%\377\377\377\40\377\377\377\32\377\377\377\26\377\377\377" "\21\377\377\377\21\377\377\377\14\377\377\377\11\377\377\377\12\377\377\377" "\13\377\377\377\11\377\377\377\14\377\377\377\21\377\377\377\23\377\377\377" "\27\377\377\377\33\377\377\377\37\377\377\377&\377\377\377(\377\377\377*" "\377\377\3774\377\377\3779\377\377\377<\377\377\377=\377\377\377C\377\377" "\377E\377\377\377?\377\377\3779\377\377\377:\377\377\377.\377\377\377(\377" "\377\377!\377\377\377!\377\377\377\35\377\377\377\31\377\377\377\24\377\377" "\377\21\377\377\377\16\377\377\377\12\377\377\377\11\377\377\377\10\377\377" "\377\10\377\377\377\11\377\377\377\13\377\377\377\16\377\377\377\22\377\377" "\377\25\377\377\377\30\377\377\377\33\377\377\377\"\377\377\377!\377\377" "\377%\377\377\377*\377\377\377-\377\377\3770\377\377\377/\377\377\3773\377" "\377\3772\377\377\3774\377\377\377-\377\377\377,\377\377\377*\377\377\377" "\"\377\377\377\37\377\377\377\32\377\377\377\33\377\377\377\27\377\377\377" "\21\377\377\377\17\377\377\377\16\377\377\377\12\377\377\377\11\377\377\377" "\6\377\377\377\10\377\377\377\12\377\377\377\11\377\377\377\15\377\377\377" "\20\377\377\377\22\377\377\377\23\377\377\377\30\377\377\377\32\377\377\377" "\35\377\377\377\40\377\377\377!\377\377\377%\377\377\377(\377\377\377&\377" "\377\377)\377\377\377(\377\377\377+\377\377\377$\377\377\377!\377\377\377" "#\377\377\377\36\377\377\377\30\377\377\377\30\377\377\377\24\377\377\377" "\22\377\377\377\20\377\377\377\15\377\377\377\11\377\377\377\12\377\377\377" "\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\11\377\377\377\12" "\377\377\377\16\377\377\377\17\377\377\377\22\377\377\377\23\377\377\377" "\26\377\377\377\31\377\377\377\33\377\377\377\34\377\377\377!\377\377\377" "\40\377\377\377\"\377\377\377\"\377\377\377\"\377\377\377&\377\377\377\36" "\377\377\377\35\377\377\377\35\377\377\377\34\377\377\377\26\377\377\377" "\24\377\377\377\23\377\377\377\20\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\7\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\6" "\377\377\377\11\377\377\377\12\377\377\377\11\377\377\377\15\377\377\377" "\16\377\377\377\21\377\377\377\22\377\377\377\26\377\377\377\26\377\377\377" "\30\377\377\377\33\377\377\377\32\377\377\377\34\377\377\377\33\377\377\377" "\32\377\377\377\37\377\377\377\31\377\377\377\31\377\377\377\27\377\377\377" "\30\377\377\377\21\377\377\377\22\377\377\377\17\377\377\377\14\377\377\377" "\11\377\377\377\11\377\377\377\12\377\377\377\6\377\377\377\6\377\377\377" "\4\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\7\377\377\377\13" "\377\377\377\11\377\377\377\12\377\377\377\16\377\377\377\21\377\377\377" "\21\377\377\377\20\377\377\377\22\377\377\377\30\377\377\377\26\377\377\377" "\27\377\377\377\30\377\377\377\27\377\377\377\30\377\377\377\26\377\377\377" "\23\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377\16\377\377\377" "\14\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\6\377\377\377" "\6\377\377\377\4\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\7\377\377\377\10\377\377\377\12\377\377\377\10\377\377\377\11" "\377\377\377\15\377\377\377\16\377\377\377\16\377\377\377\20\377\377\377" "\23\377\377\377\21\377\377\377\23\377\377\377\22\377\377\377\22\377\377\377" "\21\377\377\377\22\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377" "\15\377\377\377\12\377\377\377\11\377\377\377\12\377\377\377\7\377\377\377" "\6\377\377\377\7\377\377\377\5\377\377\377\4\377\377\377\1\377\377\377\1" "\377\377\377\3\377\377\377\3\377\377\377\6\377\377\377\7\377\377\377\6\377" "\377\377\10\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\13\377" "\377\377\16\377\377\377\16\377\377\377\16\377\377\377\17\377\377\377\16\377" "\377\377\16\377\377\377\17\377\377\377\17\377\377\377\15\377\377\377\14\377" "\377\377\12\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\3\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\377\377\377\2\377\377\377\4\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\13\377\377\377\13\377\377" "\377\10\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\15\377\377" "\377\13\377\377\377\14\377\377\377\11\377\377\377\13\377\377\377\11\377\377" "\377\12\377\377\377\13\377\377\377\11\377\377\377\11\377\377\377\6\377\377" "\377\7\377\377\377\4\377\377\377\5\377\377\377\3\377\377\377\1\0\0\0\0\0" "\0\0\0" }; compiz-0.9.11+14.04.20140409/plugins/firepaint/src/firepaint.h0000644000015301777760000001025412321343002024057 0ustar pbusernogroup00000000000000/* * Compiz fire effect plugin * * firepaint.h * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include "firepaint_options.h" #include "firepaint_tex.h" extern const unsigned short CACHESIZE_FACTOR; extern const unsigned short COORD_COMPONENTS; extern const unsigned short VERTEX_COMPONENTS; extern const unsigned short COLOR_COMPONENTS; /* ===================== Particle engine ========================= */ class Particle { public: Particle (); float life; /* particle life */ float fade; /* fade speed */ float width; /* particle width */ float height; /* particle height */ float w_mod; /* particle size modification during life */ float h_mod; /* particle size modification during life */ float r; /* red value */ float g; /* green value */ float b; /* blue value */ float a; /* alpha value */ float x; /* X position */ float y; /* Y position */ float z; /* Z position */ float xi; /* X direction */ float yi; /* Y direction */ float zi; /* Z direction */ float xg; /* X gravity */ float yg; /* Y gravity */ float zg; /* Z gravity */ float xo; /* orginal X position */ float yo; /* orginal Y position */ float zo; /* orginal Z position */ }; class ParticleSystem { public: ParticleSystem (int); ParticleSystem (); ~ParticleSystem (); std::vector particles; float slowdown; GLuint tex; bool active; int x; int y; float darken; GLuint blendMode; /* Cache used in drawParticles It's here to avoid multiple mem allocation during drawing */ std::vector vertices_cache; std::vector coords_cache; std::vector colors_cache; std::vector dcolors_cache; void initParticles (int f_numParticles); void drawParticles (const GLMatrix &transform); void updateParticles (float time); void finiParticles (); }; class FireScreen: public PluginClassHandler , public FirepaintOptions, public ScreenInterface, public GLScreenInterface, public CompositeScreenInterface { public: FireScreen (CompScreen *); ~FireScreen (); CompositeScreen *cScreen; GLScreen *gScreen; ParticleSystem ps; bool init; std::vector points; float brightness; float saturation; CompScreen::GrabHandle grabIndex; void handleEvent (XEvent *); void preparePaint (int ); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); void fireAddPoint (int x, int y, bool requireGrab); bool addParticle (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); bool clear (CompAction *action, CompAction::State state, CompOption::Vector options); }; #define FIRE_SCREEN(s) \ FireScreen *fs = FireScreen::get (s) class FirePluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/firepaint/firepaint.xml.in0000644000015301777760000000632512321343002024252 0ustar pbusernogroup00000000000000 <_short>Firepaint <_long>Paint fire particles with a specific or random color onto the screen opengl composite opengl decor Effects <_short>General <_short>Particle Settings compiz-0.9.11+14.04.20140409/plugins/animationaddon/0000755000015301777760000000000012321344021022142 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/animationaddon/animationaddon.xml.in0000644000015301777760000003512112321343002026256 0ustar pbusernogroup00000000000000 <_short>Animations Add-On <_long>Extra window animations and animation engines Effects opengl animation opengl composite animation decor <_short>Effect Settings <_short>Airplane <_short>Beam <_short>Burn <_short>Domino <_short>Explode <_short>Fold <_short>Glide 3 <_short>Razr <_short>Skewer open_effects open_random_effects close_effects close_random_effects minimize_effects minimize_random_effects animationaddon:Airplane <_name>Airplane animationaddon:Beam Up <_name>Beam Up animationaddon:Burn <_name>Burn animationaddon:Dissolve <_name>Dissolve animationaddon:Domino <_name>Domino animationaddon:Explode <_name>Explode animationaddon:Fold <_name>Fold animationaddon:Glide 3 <_name>Glide 3 animationaddon:Leaf Spread <_name>Leaf Spread animationaddon:Razr <_name>Razr animationaddon:Skewer <_name>Skewer compiz-0.9.11+14.04.20140409/plugins/animationaddon/compiz-animationaddon.pc.in0000644000015301777760000000045112321343002027355 0ustar pbusernogroup00000000000000prefix=@prefix@ exec_prefix=@prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-animationaddon Description: Animation Addon plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite compiz-opengl compiz-animation Libs: -L${libdir} -lanimationaddon Cflags: @COMPIZ_CFLAGS@ compiz-0.9.11+14.04.20140409/plugins/animationaddon/CMakeLists.txt0000644000015301777760000000040212321343002024674 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) include (FindOpenGL) if (OPENGL_GLU_FOUND) compiz_plugin (animationaddon PLUGINDEPS composite opengl animation LIBRARIES ${OPENGL_glu_LIBRARY} INCDIRS ${OPENGL_INCLUDE_DIR}) endif (OPENGL_GLU_FOUND) compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/0000755000015301777760000000000012321344021022731 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/animationaddon.cpp0000644000015301777760000002007412321343002026423 0ustar pbusernogroup00000000000000/** * Animation plugin for compiz/beryl * * animationaddon.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Airplane added by : Carlo Palma * E-mail : carlopalma@salug.it * Based on code originally written by Mark J. Kilgard * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Fold and Skewer added by : Tomasz Kolodziejski * E-mail : tkolodziejski@gmail.com * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ /* * TODO: * * - Custom bounding box update function for Airplane * * - Proper side surface normals for lighting * - decoration shadows * - shadow quad generation * - shadow texture coords (from clip tex. matrices) * - draw shadows * - fade in shadows * * - Voronoi tessellation * - Brick tessellation * - Triangle tessellation * * Effects: * - Circular action for tornado type fx * - Tornado 3D (especially for minimize) * - Helix 3D (hor. strips descend while they rotate and fade in) * - Glass breaking 3D * - Gaussian distr. points (for gradually increasing polygon size * starting from center or near mouse pointer) * - Drawing cracks * - Gradual cracking * * - fix slowness during transparent cube with <100 opacity * - fix occasional wrong side color in some windows * - fix on top windows and panels * (These two only matter for viewing during Rotate Cube. * All windows should be painted with depth test on * like 3d-plugin does) * - play better with rotate (fix cube face drawn on top of polygons * after 45 deg. rotation) * */ #include "private.h" class AnimAddonPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (animationaddon, AnimAddonPluginVTable); // TODO Update this for each added animation effect! (total: 11) const unsigned short NUM_EFFECTS = 11; AnimEffect animEffects[NUM_EFFECTS]; ExtensionPluginAnimAddon animAddonExtPluginInfo (CompString ("animationaddon"), NUM_EFFECTS, animEffects, NULL, NUM_NONEFFECT_OPTIONS); ExtensionPluginInfo * BaseAddonAnim::getExtensionPluginInfo () { return &animAddonExtPluginInfo; } BaseAddonAnim::BaseAddonAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), mIntenseTimeStep (AnimAddonScreen::get (::screen)->getIntenseTimeStep ()), mCScreen (CompositeScreen::get (::screen)), mGScreen (GLScreen::get (::screen)), mDoDepthTest (false) { } AnimEffect AnimEffectAirplane; AnimEffect AnimEffectBeamUp; AnimEffect AnimEffectBurn; AnimEffect AnimEffectDissolve; AnimEffect AnimEffectDomino; AnimEffect AnimEffectExplode; AnimEffect AnimEffectFold; AnimEffect AnimEffectGlide3; AnimEffect AnimEffectLeafSpread; AnimEffect AnimEffectRazr; AnimEffect AnimEffectSkewer; int AnimAddonScreen::getIntenseTimeStep () { return priv->optionGetTimeStepIntense (); } void PrivateAnimAddonScreen::initAnimationList () { int i = 0; AnimEffectUsedFor usedFor = AnimEffectUsedFor::all() .exclude(AnimEventFocus) .exclude(AnimEventShade); animEffects[i++] = AnimEffectAirplane = new AnimEffectInfo ("animationaddon:Airplane", usedFor, &createAnimation); animEffects[i++] = AnimEffectBeamUp = new AnimEffectInfo ("animationaddon:Beam Up", usedFor, &createAnimation); animEffects[i++] = AnimEffectBurn = new AnimEffectInfo ("animationaddon:Burn", usedFor, &createAnimation); animEffects[i++] = AnimEffectDissolve = new AnimEffectInfo ("animationaddon:Dissolve", usedFor, &createAnimation); animEffects[i++] = AnimEffectDomino = new AnimEffectInfo ("animationaddon:Domino", usedFor, &createAnimation); animEffects[i++] = AnimEffectExplode = new AnimEffectInfo ("animationaddon:Explode", usedFor, &createAnimation); animEffects[i++] = AnimEffectFold = new AnimEffectInfo ("animationaddon:Fold", usedFor, &createAnimation); animEffects[i++] = AnimEffectGlide3 = new AnimEffectInfo ("animationaddon:Glide 3", usedFor, &createAnimation); animEffects[i++] = AnimEffectLeafSpread = new AnimEffectInfo ("animationaddon:Leaf Spread", usedFor, &createAnimation); animEffects[i++] = AnimEffectRazr = new AnimEffectInfo ("animationaddon:Razr", usedFor, &createAnimation); animEffects[i++] = AnimEffectSkewer = new AnimEffectInfo ("animationaddon:Skewer", usedFor, &createAnimation); animAddonExtPluginInfo.effectOptions = &getOptions (); AnimScreen *as = AnimScreen::get (::screen); // Extends animation plugin with this set of animation effects. as->addExtension (&animAddonExtPluginInfo); } PrivateAnimAddonScreen::PrivateAnimAddonScreen (CompScreen *s) : //cScreen (CompositeScreen::get (s)), //gScreen (GLScreen::get (s)), //aScreen (as), mOutput (s->fullscreenOutput ()) { initAnimationList (); } PrivateAnimAddonScreen::~PrivateAnimAddonScreen () { AnimScreen *as = AnimScreen::get (::screen); as->removeExtension (&animAddonExtPluginInfo); for (int i = 0; i < NUM_EFFECTS; i++) { delete animEffects[i]; animEffects[i] = NULL; } } AnimAddonScreen::AnimAddonScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateAnimAddonScreen (s)) { } AnimAddonScreen::~AnimAddonScreen () { delete priv; } CompOption::Vector & AnimAddonScreen::getOptions () { return priv->getOptions (); } bool AnimAddonScreen::setOption (const CompString &name, CompOption::Value &value) { return priv->setOption (name, value); } AnimAddonWindow::AnimAddonWindow (CompWindow *w) : PluginClassHandler (w), mWindow (w), aWindow (AnimWindow::get (w)) { } AnimAddonWindow::~AnimAddonWindow () { Animation *curAnim = aWindow->curAnimation (); if (!curAnim) return; // We need to interrupt and clean up the animation currently being played // by animationaddon for this window (if any) if (curAnim->remainingTime () > 0 && curAnim->getExtensionPluginInfo ()->name == CompString ("animationaddon")) { aWindow->postAnimationCleanUp (); } } bool AnimAddonPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("animation", ANIMATION_ABI)) { CompPrivate p; p.uval = ANIMATIONADDON_ABI; ::screen->storeValue ("animationaddon_ABI", p); return true; } return false; } void AnimAddonPluginVTable::fini () { ::screen->eraseValue ("animationaddon_ABI"); } compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/leafspread.cpp0000644000015301777760000000636712321343002025555 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * leafspread.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Leaf Spread ========================= const float LeafSpreadAnim::kDurationFactor = 1.67; LeafSpreadAnim::LeafSpreadAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectivePolygon; } void LeafSpreadAnim::init () { if (!tessellateIntoRectangles (20, 14, 15.0f)) return; CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); float fadeDuration = 0.26; float life = 0.4; float spreadFac = 3.5; float randYMax = 0.07; float winFacX = outRect.width () / 800.0; float winFacY = outRect.height () / 800.0; float winFacZ = (outRect.height () + outRect.width ()) / 2.0 / 800.0; float screenSizeFactor = (0.8 * DEFAULT_Z_CAMERA * ::screen->width ()); foreach (PolygonObject *p, mPolygons) { p->rotAxis.set (RAND_FLOAT (), RAND_FLOAT (), RAND_FLOAT ()); float speed = screenSizeFactor / 10 * (0.2 + RAND_FLOAT ()); float xx = 2 * (p->centerRelPos.x () - 0.5); float yy = 2 * (p->centerRelPos.y () - 0.5); float x = speed * winFacX * spreadFac * (xx + 0.5 * (RAND_FLOAT () - 0.5)); float y = speed * winFacY * spreadFac * (yy + 0.5 * (RAND_FLOAT () - 0.5)); float z = speed * winFacZ * 7 * ((RAND_FLOAT () - 0.5) / 0.5); p->finalRelPos.set (x, y, z); p->moveStartTime = p->centerRelPos.y () * (1 - fadeDuration - randYMax) + randYMax * RAND_FLOAT (); p->moveDuration = 1; p->fadeStartTime = p->moveStartTime + life; if (p->fadeStartTime > 1 - fadeDuration) p->fadeStartTime = 1 - fadeDuration; p->fadeDuration = fadeDuration; p->finalRotAng = 150; } } compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/dissolve.cpp0000644000015301777760000000354412321343002025271 0ustar pbusernogroup00000000000000/* Compiz Dissolve animation * dissolve.cpp * * Copyright (c) 2010 Jay Catherwood * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include "private.h" DissolveSingleAnim::DissolveSingleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon) { } void DissolveSingleAnim::updateAttrib (GLWindowPaintAttrib &attrib) { int layer = MultiAnim ::getCurrAnimNumber (mAWindow); float o = 0.2; float factor = (4 - layer) * o; attrib.opacity *= o / (1.0 - factor); } void DissolveSingleAnim::updateTransform (GLMatrix &transform) { int layer = MultiAnim ::getCurrAnimNumber (mAWindow); switch (layer) { case 1: transform.translate (3.*getDissolveSingleProgress (), 0.f, 0.f); break; case 2: transform.translate (-3.*getDissolveSingleProgress (), 0.f, 0.f); break; case 3: transform.translate (0.f, 3.*getDissolveSingleProgress (), 0.f); break; case 4: transform.translate (0.f, -3.*getDissolveSingleProgress (), 0.f); break; default: break; } } void DissolveSingleAnim::updateBB (CompOutput &output) { mAWindow->expandBBWithWindow (); } compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/skewer.cpp0000644000015301777760000001244712321343002024743 0ustar pbusernogroup00000000000000/** * Animation plugin for compiz/beryl * * skewer.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * Fold and Skewer added by : Tomasz KoÅ‚odziejski * E-mail : tkolodziejski@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "private.h" // ===================== Effect: Skewer ========================= const float SkewerAnim::kDurationFactor = 1.67; SkewerAnim::SkewerAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectiveWindow; } static void getDirection (int *dir, int *c, int direction) { switch (direction) { case 0: // left dir[(*c)++] = 0; break; case 1: // right dir[(*c)++] = 1; break; case 2: // left-right dir[(*c)++] = 0; dir[(*c)++] = 1; break; case 3: // up dir[(*c)++] = 2; break; case 4: // downs dir[(*c)++] = 3; break; case 5: // up-down dir[(*c)++] = 2; dir[(*c)++] = 3; break; case 6: // in dir[(*c)++] = 4; break; case 7: // out dir[(*c)++] = 5; break; case 8: // in-out dir[(*c)++] = 4; dir[(*c)++] = 5; break; case 9: // random getDirection (dir, c, floor (RAND_FLOAT () * 8)); break; } } void SkewerAnim::init () { float thickness = optValF (AnimationaddonOptions::SkewerThickness); int rotation = optValI (AnimationaddonOptions::SkewerRotation); int gridSizeX = optValI (AnimationaddonOptions::SkewerGridx); int gridSizeY = optValI (AnimationaddonOptions::SkewerGridy); int dir[2]; // directions array int c = 0; // number of directions getDirection (dir, &c, (int) optValI (AnimationaddonOptions::SkewerDirection)); if (optValI (AnimationaddonOptions::SkewerTessellation) == AnimationaddonOptions::SkewerTessellationHexagonal) { if (!tessellateIntoHexagons (gridSizeX, gridSizeY, thickness)) return; } else { if (!tessellateIntoRectangles (gridSizeX, gridSizeY, thickness)) return; } int numPolygons = mPolygons.size (); int times[numPolygons]; int last_time = numPolygons - 1; int maxZ = .8 * DEFAULT_Z_CAMERA * ::screen->width (); int i; for (i = 0; i < numPolygons; i++) times[i] = i; foreach (PolygonObject *p, mPolygons) { if (c > 0) { switch (dir[(int)floor (RAND_FLOAT () * c)]) { case 0: // left p->finalRelPos.setX (-::screen->width ()); p->rotAxis.setX (rotation); break; case 1: // right p->finalRelPos.setX (::screen->width ()); p->rotAxis.setX (rotation); break; case 2: // up p->finalRelPos.setY (-::screen->height ()); p->rotAxis.setY (rotation); break; case 3: // down p->finalRelPos.setY (::screen->height ()); p->rotAxis.setY (rotation); break; case 4: // in p->finalRelPos.setZ (-maxZ); p->rotAxis.setX (rotation); p->rotAxis.setY (rotation); break; case 5: // out p->finalRelPos.setZ (maxZ); p->rotAxis.setX (rotation); p->rotAxis.setY (rotation); break; } p->finalRotAng = rotation; } // if no direction is set - just fade // choose random start_time int rand_time = floor (RAND_FLOAT () * last_time); p->moveStartTime = 0.8 / (float)numPolygons * times[rand_time]; p->moveDuration = 1 - p->moveStartTime; p->fadeStartTime = p->moveStartTime + 0.2; p->fadeDuration = 1 - p->fadeStartTime; times[rand_time] = times[last_time]; // copy last one over times[rand_time] last_time--; //descrease last_time } } void SkewerAnim::stepPolygon (PolygonObject *p, float forwardProgress) { float moveProgress = forwardProgress - p->moveStartTime; if (p->moveDuration > 0) moveProgress /= p->moveDuration; if (moveProgress < 0) moveProgress = 0; else if (moveProgress > 1) moveProgress = 1; p->centerPos.set (pow (moveProgress, 2) * p->finalRelPos.x () + p->centerPosStart.x (), pow (moveProgress, 2) * p->finalRelPos.y () + p->centerPosStart.y (), 1.0f / ::screen->width () * pow (moveProgress, 2) * p->finalRelPos.z () + p->centerPosStart.z ()); // rotate p->rotAngle = pow (moveProgress, 2) * p->finalRotAng + p->rotAngleStart; } compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/polygon.cpp0000644000015301777760000014737212321343002025140 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * polygon.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "private.h" static const unsigned short MIN_WINDOW_GRID_SIZE = 10; PolygonAnim::PolygonAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), BaseAddonAnim::BaseAddonAnim (w, curWindowEvent, duration, info, icon) { mAllFadeDuration = -1.0f; mIncludeShadows = false; } typedef struct { float dist; float x, y; // relative from center } SpokeVertex; typedef struct { float direction; float length; SpokeVertex *spokeVertex; } Spoke; typedef struct { bool isTriangle; // false if 4 sided, true if 3 sided float centerX, centerY; float pt0X, pt0Y, pt1X, pt1Y, pt2X, pt2Y, pt3X, pt3Y; // if is_triangle is true, these are unused } Shard; // Frees up polygon objects in pset void PolygonAnim::freePolygonObjects () { while (!mPolygons.empty ()) { PolygonObject *p = mPolygons.back (); if (p->nVertices > 0) { if (p->vertices) free (p->vertices); if (p->sideIndices) free (p->sideIndices); if (p->normals) free (p->normals); } if (p->effectParameters) delete p->effectParameters; delete p; mPolygons.pop_back (); } } // Frees up intersecting polygon info of PolygonSet clips void PolygonAnim::freeClipsPolygons () { foreach (Clip4Polygons &c, mClips) { foreach (PolygonClipInfo *pci, c.intersectingPolygonInfos) delete pci; } } PolygonAnim::~PolygonAnim () // was freePolygonSet { freePolygonObjects (); freeClipsPolygons (); } // Tessellates window into extruded rectangular objects bool PolygonAnim::tessellateIntoRectangles (int gridSizeX, int gridSizeY, float thickness) { // boundaries of polygon tessellation int winLimitsX; int winLimitsY; int winLimitsW; int winLimitsH; CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); if (mIncludeShadows) { winLimitsX = outRect.x (); winLimitsY = outRect.y (); winLimitsW = outRect.width () - 1; // avoid artifact on right edge winLimitsH = outRect.height (); } else { winLimitsX = inRect.x (); winLimitsY = inRect.y (); winLimitsW = inRect.width (); winLimitsH = inRect.height (); } float minRectSize = MIN_WINDOW_GRID_SIZE; float rectW = winLimitsW / (float)gridSizeX; float rectH = winLimitsH / (float)gridSizeY; if (rectW < minRectSize) gridSizeX = winLimitsW / minRectSize; // int div. if (rectH < minRectSize) gridSizeY = winLimitsH / minRectSize; // int div. freePolygonObjects (); mPolygons.clear (); for (int i = 0; i < gridSizeX * gridSizeY; i++) { mPolygons.push_back (new PolygonObject); } thickness /= ::screen->width (); mThickness = thickness; mNumTotalFrontVertices = 0; float cellW = (float)winLimitsW / gridSizeX; float cellH = (float)winLimitsH / gridSizeY; float halfW = cellW / 2; float halfH = cellH / 2; float halfThick = mThickness / 2; vector::iterator it = mPolygons.begin (); for (int y = 0; y < gridSizeY; y++) { float posY = winLimitsY + cellH * (y + 0.5); for (int x = 0; x < gridSizeX; x++, it++) { PolygonObject *p = *it; p->centerPos.set (winLimitsX + cellW * (x + 0.5), posY, -halfThick); p->centerPosStart = p->centerPos; p->rotAngle = p->rotAngleStart = 0; p->centerRelPos.set ((x + 0.5) / gridSizeX, (y + 0.5) / gridSizeY); p->nSides = 4; p->nVertices = 2 * 4; mNumTotalFrontVertices += 4; // 4 front, 4 back vertices p->vertices = (GLfloat *)calloc (8 * 3, sizeof (GLfloat)); if (!p->vertices) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } // Vertex normals p->normals = (GLfloat *)calloc (8 * 3, sizeof (GLfloat)); if (!p->normals) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLfloat *pv = p->vertices; // Determine 4 front vertices in ccw direction pv[0] = -halfW; pv[1] = -halfH; pv[2] = halfThick; pv[3] = -halfW; pv[4] = halfH; pv[5] = halfThick; pv[6] = halfW; pv[7] = halfH; pv[8] = halfThick; pv[9] = halfW; pv[10] = -halfH; pv[11] = halfThick; // Determine 4 back vertices in cw direction pv[12] = halfW; pv[13] = -halfH; pv[14] = -halfThick; pv[15] = halfW; pv[16] = halfH; pv[17] = -halfThick; pv[18] = -halfW; pv[19] = halfH; pv[20] = -halfThick; pv[21] = -halfW; pv[22] = -halfH; pv[23] = -halfThick; // 16 indices for 4 sides (for quads) p->sideIndices = (GLushort *)calloc (4 * 4, sizeof (GLushort)); if (!p->sideIndices) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLushort *ind = p->sideIndices; GLfloat *nor = p->normals; int id = 0; // Left face ind[id++] = 6; // First vertex ind[id++] = 1; ind[id++] = 0; ind[id++] = 7; nor[6 * 3 + 0] = -1; // Flat shading only uses 1st vertex's normal nor[6 * 3 + 1] = 0; // in a polygon, vertex 6 for this face. nor[6 * 3 + 2] = 0; // Bottom face ind[id++] = 1; ind[id++] = 6; ind[id++] = 5; ind[id++] = 2; nor[1 * 3 + 0] = 0; nor[1 * 3 + 1] = 1; nor[1 * 3 + 2] = 0; // Right face ind[id++] = 2; ind[id++] = 5; ind[id++] = 4; ind[id++] = 3; nor[2 * 3 + 0] = 1; nor[2 * 3 + 1] = 0; nor[2 * 3 + 2] = 0; // Top face ind[id++] = 7; ind[id++] = 0; ind[id++] = 3; ind[id++] = 4; nor[7 * 3 + 0] = 0; nor[7 * 3 + 1] = -1; nor[7 * 3 + 2] = 0; // Front face normal nor[0] = 0; nor[1] = 0; nor[2] = 1; // Back face normal nor[4 * 3 + 0] = 0; nor[4 * 3 + 1] = 0; nor[4 * 3 + 2] = -1; // Determine bounding box (to test intersection with clips) p->boundingBox.x1 = -halfW; p->boundingBox.y1 = -halfH; p->boundingBox.x2 = halfW; p->boundingBox.y2 = halfH; p->boundSphereRadius = sqrt (halfW * halfW + halfH * halfH + halfThick * halfThick); // Reset remaining members p->effectParameters = NULL; p->moveStartTime = 0; p->moveDuration = 0; p->fadeStartTime = 0; p->fadeDuration = 0; } } return true; } // Tessellates window into extruded hexagon objects bool PolygonAnim::tessellateIntoHexagons (int gridSizeX, int gridSizeY, float thickness) { // boundaries of polygon tessellation int winLimitsX; int winLimitsY; int winLimitsW; int winLimitsH; CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); if (mIncludeShadows) { winLimitsX = outRect.x (); winLimitsY = outRect.y (); winLimitsW = outRect.width () - 1; // avoid artifact on right edge winLimitsH = outRect.height (); } else { winLimitsX = inRect.x (); winLimitsY = inRect.y (); winLimitsW = inRect.width (); winLimitsH = inRect.height (); } float minSize = 20; float hexW = winLimitsW / (float)gridSizeX; float hexH = winLimitsH / (float)gridSizeY; if (hexW < minSize) gridSizeX = winLimitsW / minSize; // int div. if (hexH < minSize) gridSizeY = winLimitsH / minSize; // int div. freePolygonObjects (); for (int i = 0; i < (gridSizeY + 1) * gridSizeX + ((gridSizeY + 1 ) / 2); i++) mPolygons.push_back (new PolygonObject); thickness /= ::screen->width (); mThickness = thickness; mNumTotalFrontVertices = 0; float cellW = (float)winLimitsW / gridSizeX; float cellH = (float)winLimitsH / gridSizeY; float halfW = cellW / 2; float twoThirdsH = 2*cellH / 3; float thirdH = cellH / 3; float halfThick = mThickness / 2; vector::iterator it = mPolygons.begin (); for (int y = 0; y < gridSizeY+1; y++) { float posY = winLimitsY + cellH * (y); int numPolysinRow = (y%2==0) ? gridSizeX : (gridSizeX + 1); // Clip polygons to the window dimensions float topY, topRightY, topLeftY, bottomY, bottomLeftY, bottomRightY; if (y == 0) { topY = topRightY = topLeftY = 0; bottomY = twoThirdsH; bottomLeftY = bottomRightY = thirdH; } else if (y == gridSizeY) { bottomY = bottomLeftY = bottomRightY = 0; topY = -twoThirdsH; topLeftY = topRightY = -thirdH; } else { topY = -twoThirdsH; topLeftY = topRightY = -thirdH; bottomLeftY = bottomRightY = thirdH; bottomY = twoThirdsH; } for (int x = 0; x < numPolysinRow; x++, it++) { PolygonObject *p = *it; // Clip odd rows when necessary float topLeftX, topRightX, bottomLeftX, bottomRightX; if (y%2 == 1) { if (x == 0) { topLeftX = bottomLeftX = 0; topRightX = halfW; bottomRightX = halfW; } else if (x == numPolysinRow-1) { topRightX = bottomRightX = 0; topLeftX = -halfW; bottomLeftX = -halfW; } else { topLeftX = bottomLeftX = -halfW; topRightX = bottomRightX = halfW; } } else { topLeftX = bottomLeftX = -halfW; topRightX = bottomRightX = halfW; } p->centerPos.set (winLimitsX + cellW * (x + (y%2 ? 0.0 : 0.5)), posY, -halfThick); p->centerPosStart = p->centerPos; p->rotAngle = p->rotAngleStart = 0; p->centerRelPos.set ((x + 0.5) / gridSizeX, (y + 0.5) / gridSizeY); p->nSides = 6; p->nVertices = 2 * 6; mNumTotalFrontVertices += 6; // 6 front, 6 back vertices p->vertices = (GLfloat *)calloc (6 * 2 * 3, sizeof (GLfloat)); if (!p->vertices) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } // Vertex normals p->normals = (GLfloat *)calloc (6 * 2 * 3, sizeof (GLfloat)); if (!p->normals) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLfloat *pv = p->vertices; // Determine 6 front vertices in ccw direction // Starting at top pv[0] = 0; pv[1] = topY; pv[2] = halfThick; pv[3] = topLeftX; pv[4] = topLeftY; pv[5] = halfThick; pv[6] = bottomLeftX; pv[7] = bottomLeftY; pv[8] = halfThick; pv[9] = 0; pv[10] = bottomY; pv[11] = halfThick; pv[12] = bottomRightX; pv[13] = bottomRightY; pv[14] = halfThick; pv[15] = topRightX; pv[16] = topRightY; pv[17] = halfThick; // Determine 6 back vertices in cw direction pv[18] = topRightX; pv[19] = topRightY; pv[20] = -halfThick; pv[21] = bottomRightX; pv[22] = bottomRightY; pv[23] = -halfThick; pv[24] = 0; pv[25] = bottomY; pv[26] = -halfThick; pv[27] = bottomLeftX; pv[28] = bottomLeftY; pv[29] = -halfThick; pv[30] = topLeftX; pv[31] = topLeftY; pv[32] = -halfThick; pv[33] = 0; pv[34] = topY; pv[35] = -halfThick; // 24 indices per 6 sides (for quads) p->sideIndices = (GLushort *)calloc (4 * 6, sizeof (GLushort)); if (!p->sideIndices) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLushort *ind = p->sideIndices; GLfloat *nor = p->normals; int id = 0; // Approximate normals // upper left side face ind[id++] = 11; // First vertex ind[id++] = 10; ind[id++] = 1; ind[id++] = 0; nor[11 * 3 + 0] = -1; // Flat shading only uses 1st vertex's normal nor[11 * 3 + 1] = -1; // in a polygon, vertex 11 for this face. nor[11 * 3 + 2] = 0; if (y == 0) // top half cropped nor[11 * 3 + 0] = 0; // left side face ind[id++] = 1; ind[id++] = 10; ind[id++] = 9; ind[id++] = 2; nor[1 * 3 + 0] = -1; nor[1 * 3 + 1] = 0; nor[1 * 3 + 2] = 0; // lower left side face ind[id++] = 2; ind[id++] = 9; ind[id++] = 8; ind[id++] = 3; nor[2 * 3 + 0] = -1; nor[2 * 3 + 1] = 1; nor[2 * 3 + 2] = 0; if (y == gridSizeY) // bottom half cropped nor[2 * 3 + 0] = 0; // lower right side face ind[id++] = 3; ind[id++] = 8; ind[id++] = 7; ind[id++] = 4; nor[3 * 3 + 0] = 1; nor[3 * 3 + 1] = 1; nor[3 * 3 + 2] = 0; if (y == gridSizeY) // bottom half cropped nor[3 * 3 + 0] = 0; // right side face ind[id++] = 4; ind[id++] = 7; ind[id++] = 6; ind[id++] = 5; nor[4 * 3 + 0] = 1; nor[4 * 3 + 1] = 0; nor[4 * 3 + 2] = 0; // upper right side face ind[id++] = 5; ind[id++] = 6; ind[id++] = 11; ind[id++] = 0; nor[5 * 3 + 0] = 1; nor[5 * 3 + 1] = -1; nor[5 * 3 + 2] = 0; if (y == 0) // top half cropped nor[5 * 3 + 0] = 0; // Front face normal nor[0] = 0; nor[1] = 0; nor[2] = 1; // Back face normal nor[6 * 3 + 0] = 0; nor[6 * 3 + 1] = 0; nor[6 * 3 + 2] = -1; // Determine bounding box (to test intersection with clips) p->boundingBox.x1 = topLeftX; p->boundingBox.y1 = topY; p->boundingBox.x2 = bottomRightX; p->boundingBox.y2 = bottomY; p->boundSphereRadius = sqrt ((topRightX - topLeftX) * (topRightX - topLeftX) / 4 + (bottomY - topY) * (bottomY - topY) / 4 + halfThick * halfThick); // Reset remaining members p->effectParameters = NULL; p->moveStartTime = 0; p->moveDuration = 0; p->fadeStartTime = 0; p->fadeDuration = 0; } } return true; } /* 90 //degree orientation * | * 180--+--0 * | * 270 * This function tessellates the window into radial shards, with * each shard split into the number of "tiers". This forms a broken * glass or spiderweb appearance. */ bool PolygonAnim::tessellateIntoGlass (int spokeMultiplier, int numTiers, float thickness) { int numSpokes = 4 * spokeMultiplier; int winLimitsX, winLimitsY, winLimitsW, winLimitsH; float centerX, centerY; float topBottomLength, leftRightLength; Spoke spokes[numSpokes]; memset (spokes, 0, sizeof (Spoke) * numSpokes); for (int i = 0; i < numSpokes; i++) { spokes[i].spokeVertex = (SpokeVertex *) calloc (numTiers, sizeof (SpokeVertex)); } CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); if (mIncludeShadows) { winLimitsX = outRect.x (); winLimitsY = outRect.y (); winLimitsW = outRect.width () - 1; // avoid artifact on right edge winLimitsH = outRect.height (); } else { winLimitsX = inRect.x (); winLimitsY = inRect.y (); winLimitsW = inRect.width (); winLimitsH = inRect.height (); } //tessellation looks horrible if its too small, its better //just to skip it if (winLimitsW < 100 || winLimitsH < 100) return false; centerX = (winLimitsW / 2.0) + winLimitsX; centerY = (winLimitsH / 2.0) + winLimitsY; /* Calculate corner angles */ float cornerAngle[4]; cornerAngle[0] = atanf ((centerY - winLimitsY) / (winLimitsX + winLimitsW - centerX)); cornerAngle[1] = M_PI - cornerAngle[0]; cornerAngle[2] = M_PI + cornerAngle[0]; cornerAngle[3] = 2 * M_PI - cornerAngle[0]; float range; //calculate the vertex positions for (int i = 0; i < numSpokes; i++) { /* The spokes must go into the corners. The remaining spokes fit between the corner spokes */ if ((i % spokeMultiplier) == 0) { spokes[i].direction = cornerAngle[i / spokeMultiplier]; } else { range = cornerAngle[((i / spokeMultiplier) + 1) % 4 ] - cornerAngle[i / spokeMultiplier]; if (range < 0) range = 2 * M_PI - cornerAngle[i / spokeMultiplier] + cornerAngle[((i / spokeMultiplier) + 1) % 4 ]; spokes[i].direction = cornerAngle[i / spokeMultiplier] + (i % spokeMultiplier) * range / spokeMultiplier; if (spokes[i].direction > 2 * M_PI) spokes[i].direction -= 2 * M_PI; // Random direction spokes[i].direction += range * (float) rand () / 3 / RAND_MAX; } //calculate the length of the spoke //calculate top/bottom lenght if ((spokes[i].direction < M_PI)) topBottomLength = (centerY - winLimitsY); else topBottomLength = ((winLimitsY + winLimitsH)- centerY); topBottomLength /= sinf (spokes[i].direction); if (topBottomLength < 0) topBottomLength *= -1; //calculate left right length if ((spokes[i].direction < M_PI / 2) || (spokes[i].direction > 3 * M_PI / 2)) leftRightLength = (winLimitsX + winLimitsW) - centerX; else leftRightLength = centerX - winLimitsX; leftRightLength /= cosf (spokes[i].direction); if (leftRightLength < 0) leftRightLength *= -1; //take the smaller of the two if (leftRightLength < topBottomLength) spokes[i].length = leftRightLength; else spokes[i].length = topBottomLength; float percent = 1.0 / ((float) numTiers); //calculate spoke vertexes for (int j = 0 ; j < numTiers; j++) { spokes[i].spokeVertex[j].dist = percent * (j + 1) * spokes[i].length; spokes[i].spokeVertex[j].x = centerX + (spokes[i].spokeVertex[j].dist * cos (spokes[i].direction)); spokes[i].spokeVertex[j].y = centerY + (spokes[i].spokeVertex[j].dist * sin (spokes[i].direction)); } } Shard shards[numSpokes][numTiers]; //calculate the center and bounds of each polygon for (int i = 0; i < numSpokes; i++) { for (int j = 0; j < numTiers; j++) { switch (j) { case 0: //the first tier is triangles shards[i][j].isTriangle = true; shards[i][j].pt0X = centerX; shards[i][j].pt0Y = centerY; shards[i][j].pt1X = spokes[i].spokeVertex[j].x; shards[i][j].pt1Y = spokes[i].spokeVertex[j].y; shards[i][j].pt2X = spokes[(i + 1) % numSpokes].spokeVertex[j].x; shards[i][j].pt2Y = spokes[(i + 1) % numSpokes].spokeVertex[j].y; shards[i][j].pt3X = shards[i][j].pt0X;//fourth point is not used shards[i][j].pt3Y = shards[i][j].pt0Y; //find lengths shards[i][j].centerX = (shards[i][j].pt2X + shards[i][j].pt1X + shards[i][j].pt0X)/3; shards[i][j].centerY = (shards[i][j].pt2Y + shards[i][j].pt1Y + shards[i][j].pt0Y)/3; break; default: //the other tiers are 4 sided polygons shards[i][j].isTriangle = false; shards[i][j].pt0X = spokes[i].spokeVertex[j - 1].x; shards[i][j].pt0Y = spokes[i].spokeVertex[j - 1].y; shards[i][j].pt1X = spokes[i].spokeVertex[j].x; shards[i][j].pt1Y = spokes[i].spokeVertex[j].y; if (i != numSpokes - 1) { shards[i][j].pt2X = spokes[i + 1].spokeVertex[j].x; shards[i][j].pt2Y = spokes[i + 1].spokeVertex[j].y; shards[i][j].pt3X = spokes[i + 1].spokeVertex[j - 1].x; shards[i][j].pt3Y = spokes[i + 1].spokeVertex[j - 1].y; } else { shards[i][j].pt2X = spokes[0].spokeVertex[j].x; shards[i][j].pt2Y = spokes[0].spokeVertex[j].y; shards[i][j].pt3X = spokes[0].spokeVertex[j - 1].x; shards[i][j].pt3Y = spokes[0].spokeVertex[j - 1].y; } //calculate the center of the polygon shards[i][j].centerX = (shards[i][j].pt0X + shards[i][j].pt1X + shards[i][j].pt2X + shards[i][j].pt3X)/4; shards[i][j].centerY = (shards[i][j].pt0Y + shards[i][j].pt1Y + shards[i][j].pt2Y + shards[i][j].pt3Y)/4; break; } } } //set up polygons freePolygonObjects (); for (int i = 0; i < numSpokes * numTiers; i++) mPolygons.push_back (new PolygonObject); thickness /= ::screen->width (); mThickness = thickness; mNumTotalFrontVertices = 0; float halfThick = mThickness / 2; vector::iterator it = mPolygons.begin (); for (int yc = 0; yc < numSpokes; yc++) //spokes { for (int xc = 0; xc < numTiers; xc++, it++) //tiers { PolygonObject *p = *it; p->centerPos.set (shards[yc][xc].centerX, shards[yc][xc].centerY, -halfThick); p->centerPosStart = p->centerPos; p->centerRelPos.set ((shards[yc][xc].centerX - winLimitsX) / winLimitsW, (shards[yc][xc].centerY - winLimitsY) / winLimitsH); p->rotAngle = p->rotAngleStart = 0; p->nSides = 4; p->nVertices = 2 * 4; mNumTotalFrontVertices += 4; // 4 front, 4 back vertices p->vertices = (GLfloat *)calloc (8 * 3, sizeof (GLfloat)); if (!p->vertices) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } // Vertex normals p->normals = (GLfloat *)calloc (8 * 3, sizeof (GLfloat)); if (!p->normals) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLfloat *pv = p->vertices; // Determine 4 front vertices in ccw direction pv[0] = -shards[yc][xc].centerX + shards[yc][xc].pt3X; pv[1] = -shards[yc][xc].centerY + shards[yc][xc].pt3Y; pv[2] = halfThick; pv[3] = -shards[yc][xc].centerX + shards[yc][xc].pt2X; pv[4] = -shards[yc][xc].centerY + shards[yc][xc].pt2Y; pv[5] = halfThick; pv[6] = -shards[yc][xc].centerX + shards[yc][xc].pt1X; pv[7] = -shards[yc][xc].centerY + shards[yc][xc].pt1Y; pv[8] = halfThick; pv[9] = -shards[yc][xc].centerX + shards[yc][xc].pt0X; pv[10] = -shards[yc][xc].centerY + shards[yc][xc].pt0Y; pv[11] = halfThick; // Determine 4 back vertices in cw direction pv[12] = -shards[yc][xc].centerX + shards[yc][xc].pt0X; pv[13] = -shards[yc][xc].centerY + shards[yc][xc].pt0Y; pv[14] = -halfThick; pv[15] = -shards[yc][xc].centerX + shards[yc][xc].pt1X; pv[16] = -shards[yc][xc].centerY + shards[yc][xc].pt1Y; pv[17] = -halfThick; pv[18] = -shards[yc][xc].centerX + shards[yc][xc].pt2X; pv[19] = -shards[yc][xc].centerY + shards[yc][xc].pt2Y; pv[20] = -halfThick; pv[21] = -shards[yc][xc].centerX + shards[yc][xc].pt3X; pv[22] = -shards[yc][xc].centerY + shards[yc][xc].pt3Y; pv[23] = -halfThick; // 16 indices for 4 sides (for quads) p->sideIndices = (GLushort *)calloc (4 * 4, sizeof (GLushort)); if (!p->sideIndices) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLushort *ind = p->sideIndices; GLfloat *nor = p->normals; int id = 0; // Left face ind[id++] = 6; // First vertex ind[id++] = 1; ind[id++] = 0; ind[id++] = 7; nor[6 * 3 + 0] = -1; // Flat shading only uses 1st vertex's normal nor[6 * 3 + 1] = 0; // in a polygon, vertex 6 for this face. nor[6 * 3 + 2] = 0; // Bottom face ind[id++] = 1; ind[id++] = 6; ind[id++] = 5; ind[id++] = 2; nor[1 * 3 + 0] = 0; nor[1 * 3 + 1] = 1; nor[1 * 3 + 2] = 0; // Right face ind[id++] = 2; ind[id++] = 5; ind[id++] = 4; ind[id++] = 3; nor[2 * 3 + 0] = 1; nor[2 * 3 + 1] = 0; nor[2 * 3 + 2] = 0; // Top face ind[id++] = 7; ind[id++] = 0; ind[id++] = 3; ind[id++] = 4; nor[7 * 3 + 0] = 0; nor[7 * 3 + 1] = -1; nor[7 * 3 + 2] = 0; // Front face normal nor[0] = 0; nor[1] = 0; nor[2] = 1; // Back face normal nor[4 * 3 + 0] = 0; nor[4 * 3 + 1] = 0; nor[4 * 3 + 2] = -1; // Determine bounding box (to test intersection with clips) p->boundingBox.x1 = -shards[yc][xc].pt3X; p->boundingBox.y1 = -shards[yc][xc].pt3Y; p->boundingBox.x2 = shards[yc][xc].pt1X; p->boundingBox.y2 = shards[yc][xc].pt1Y; float dist[4] = {0}, longestDist = 0; dist[0] = sqrt (powf ((shards[yc][xc].centerX - shards[yc][xc].pt0X), 2) + powf ((shards[yc][xc].centerY - shards[yc][xc].pt0Y), 2) + powf (thickness,2)); dist[1] = sqrt (powf ((shards[yc][xc].centerX - shards[yc][xc].pt1X), 2) + powf ((shards[yc][xc].centerY - shards[yc][xc].pt1Y), 2) + powf (thickness,2)); dist[2] = sqrt (powf ((shards[yc][xc].centerX - shards[yc][xc].pt2X), 2) + powf ((shards[yc][xc].centerY - shards[yc][xc].pt2Y), 2) + powf (thickness,2)); dist[3] = sqrt (powf ((shards[yc][xc].centerX - shards[yc][xc].pt3X), 2) + powf ((shards[yc][xc].centerY - shards[yc][xc].pt3Y), 2) + powf (thickness,2)); for (int k = 0; k < 4; k++) { if (dist[k] > longestDist) longestDist = dist[k]; } p->boundSphereRadius = longestDist; // Reset remaining members p->effectParameters = NULL; p->moveStartTime = 0; p->moveDuration = 0; p->fadeStartTime = 0; p->fadeDuration = 0; } } return true; } void PolygonAnim::addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clipRegion, unsigned int maxGridWidth, unsigned int maxGridHeight) { // TODO // if polygon set is not valid or effect is not 3D (glide w/thickness=0) //if (!pset) //return; /* Some plugins (such as blur) pass a null argument to glAddGeometry * because they don't have such data and they need to calculate region * projections. In this case, we should not add polygon geometry * since the matrices will be null */ if (!matrix.size ()) return; GLWindow::Geometry &geometry = GLWindow::get (mWindow)->geometry (); geometry.vCount = 1; // Force glDrawGeometry to be called bool dontStoreClips = true; // If this clip doesn't match the corresponding stored clip, // clear the stored clips from this point (aw->nClipsPassed) // to the end and store the new ones instead. if (mNumClipsPassed < (int)mClips.size ()) // if we have clips stored earlier { Clip4Polygons *c = &mClips[mNumClipsPassed]; // the stored clip at position aw->nClipsPassed // if either clip coordinates or texture matrix is different if (region.rects ()[0] != c->box || memcmp (&matrix[0], &c->texMatrix, sizeof (GLTexture::Matrix))) { // get rid of the clips from here (aw->nClipsPassed) to the end Clip4Polygons *curClip = c; for (unsigned i = mNumClipsPassed; i < mClips.size (); i++, curClip++) foreach (PolygonClipInfo *pci, curClip->intersectingPolygonInfos) delete pci; mClips.resize (mNumClipsPassed); dontStoreClips = false; } } else dontStoreClips = false; if (dontStoreClips) { mNumClipsPassed += region.numRects (); return; } if (mClips.size () == 0) { mLastClipInGroup.clear (); mLastClipInGroup.reserve (2); } CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); mClips.reserve (region.numRects ()); // For each clip passed to this function foreach (const CompRect &rect, region.rects ()) { // Add new clip Clip4Polygons newClip; newClip.box = rect; newClip.texMatrix = matrix[0]; // nMatrix is not used for now // (i.e. only first texture matrix is considered) // avoid clipping along window edge // for the "window contents" clip if (rect.x1 () == inRect.x1 () && rect.y1 () == inRect.y1 () && rect.x2 () == inRect.x2 () && rect.y2 () == inRect.y2 ()) { newClip.boxf.x1 = rect.x1 () - 0.1f; newClip.boxf.y1 = rect.y1 () - 0.1f; newClip.boxf.x2 = rect.x2 () + 0.1f; newClip.boxf.y2 = rect.y2 () + 0.1f; } else { newClip.boxf.x1 = rect.x1 (); newClip.boxf.y1 = rect.y1 (); newClip.boxf.x2 = rect.x2 (); newClip.boxf.y2 = rect.y2 (); } mClips.push_back (newClip); mNumClipsPassed++; } mClipsUpdated = true; } /// Allocates floats for texture coordinates: /// 2 {x, y} * 2 {front, back} * <# of polygon vertices> PolygonClipInfo::PolygonClipInfo (const PolygonObject *p) : p (p) { vertexTexCoords.resize (4 * p->nSides); } /// For each rectangular clip, this function finds polygons which /// have a bounding box that intersects the clip. For intersecting /// polygons, it computes the texture coordinates for the vertices /// of that polygon (to draw the clip texture). void PolygonAnim::processIntersectingPolygons () { int numClips = mClips.size (); Clip4Polygons *c = &mClips[mFirstNondrawnClip]; for (int j = mFirstNondrawnClip; j < numClips; j++, c++) { CompRect &cb = c->box; int nFrontVerticesTilThisPoly = 0; // only used when intersectsMostPolygons is true // if this clip is the "window contents" clip if (cb == mWindow->geometry()) { c->intersectsMostPolygons = true; // allocate tex coords for all polygons // 2 {x, y} * 2 {front, back} * // c->polygonVertexTexCoords.resize (4 * mNumTotalFrontVertices); } else c->intersectsMostPolygons = false; foreach (const PolygonObject *p, mPolygons) { int nSides = p->nSides; float px = p->centerPosStart.x (); float py = p->centerPosStart.y (); const Boxf &pb = p->boundingBox; GLfloat *vTexCoords = NULL; if (c->intersectsMostPolygons) vTexCoords = &c->polygonVertexTexCoords[4 * nFrontVerticesTilThisPoly]; else { if (pb.x2 + px <= cb.x1 () || pb.y2 + py <= cb.y1 () || pb.x1 + px >= cb.x2 () || pb.y1 + py >= cb.y2 ()) // no intersection continue; PolygonClipInfo *pci = new PolygonClipInfo (p); c->intersectingPolygonInfos.push_back (pci); vTexCoords = &pci->vertexTexCoords[0]; } for (int k = 0; k < nSides; k++) { float x = p->vertices[3 * k] + p->centerPosStart.x (); float y = p->vertices[3 * k + 1] + p->centerPosStart.y (); GLfloat tx; GLfloat ty; if (c->texMatrix.xy != 0.0f || c->texMatrix.yx != 0.0f) { // "non-rect" coordinates tx = COMP_TEX_COORD_XY (c->texMatrix, x, y); ty = COMP_TEX_COORD_YX (c->texMatrix, x, y); } else { tx = COMP_TEX_COORD_X (c->texMatrix, x); ty = COMP_TEX_COORD_Y (c->texMatrix, y); } // for front vertices int ti = 2 * k; vTexCoords[ti] = tx; vTexCoords[ti + 1] = ty; // for back vertices ti = 2 * (2 * nSides - 1 - k); vTexCoords[ti] = tx; vTexCoords[ti + 1] = ty; } nFrontVerticesTilThisPoly += nSides; } } } // Correct perspective appearance by skewing void PolygonAnim::getPerspectiveCorrectionMat (const PolygonObject *p, GLfloat *mat, GLMatrix *matf, const CompOutput &output) { Point center; CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); if (p) // for CorrectPerspectivePolygon { // use polygon's center center.setX (p->centerPos.x ()); center.setY (p->centerPos.y ()); } else // for CorrectPerspectiveWindow { // use window's center center.setX (outRect.x () + outRect.width () / 2); center.setY (outRect.y () + outRect.height () / 2); } GLfloat skewx = -(((center.x () - output.region ()->extents.x1) - output.width () / 2) * 1.15); GLfloat skewy = -(((center.y () - output.region ()->extents.y1) - output.height () / 2) * 1.15); if (mat) { // column-major order skew matrix GLfloat skewMat[16] = {1,0,0,0, 0,1,0,0, skewx,skewy,1,0, 0,0,0,1}; memcpy (mat, skewMat, 16 * sizeof (GLfloat)); } else if (matf) { // column-major order skew matrix float skewMat[16] = {1,0,0,0, 0,1,0,0, skewx,skewy,1,0, 0,0,0,1}; *matf = GLMatrix (skewMat); } } void PolygonAnim::prepareDrawingForAttrib (GLFragment::Attrib &attrib) { if (GL::canDoSaturated && attrib.getSaturation () != COLOR) { GLfloat constant[4]; if (GL::canDoSlightlySaturated && attrib.getSaturation () > 0) { constant[3] = attrib.getOpacity () / 65535.0f; constant[0] = constant[1] = constant[2] = constant[3] * attrib.getBrightness () / 65535.0f; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); } else { constant[3] = attrib.getOpacity () / 65535.0f; constant[0] = constant[1] = constant[2] = constant[3] * attrib.getBrightness () / 65535.0f; constant[0] = 0.5f + 0.5f * RED_SATURATION_WEIGHT * constant[0]; constant[1] = 0.5f + 0.5f * GREEN_SATURATION_WEIGHT * constant[1]; constant[2] = 0.5f + 0.5f * BLUE_SATURATION_WEIGHT * constant[2]; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); } } else { attrib.setBrightness (0.76 * attrib.getBrightness ()); GLushort color = (attrib.getOpacity () * attrib.getBrightness ()) >> 16; mGScreen->setTexEnvMode (GL_MODULATE); glColor4us (color, color, color, attrib.getOpacity ()); } } inline void PolygonAnim::drawPolygonClipIntersection (const PolygonObject *p, const Clip4Polygons &c, const GLfloat *vertexTexCoords, int pass, float forwardProgress, GLdouble clipPlanes[4][4], const CompOutput &output, float newOpacity, bool decelerates, GLfloat skewMat[16]) { int nSides = p->nSides; float newOpacityPolygon = newOpacity; // if fade-out duration is specified per polygon if (mAllFadeDuration == -1.0f) { float fadePassedBy = forwardProgress - p->fadeStartTime; // if "fade out starting point" is passed if (fadePassedBy > 1e-5) // if true, then allFadeDuration > 0 { float opacityFac; if (decelerates) opacityFac = 1 - progressDecelerate (fadePassedBy / p->fadeDuration); else opacityFac = 1 - fadePassedBy / p->fadeDuration; if (opacityFac < 0) opacityFac = 0; if (opacityFac > 1) opacityFac = 1; newOpacityPolygon = newOpacity * opacityFac; } } if (newOpacityPolygon < 1e-5) // if polygon object is invisible return; if (pass == 0) { if (newOpacityPolygon < 0.9999) // if not fully opaque return; // draw only opaque ones in pass 0 } else if (newOpacityPolygon > 0.9999) // if fully opaque return; // draw only non-opaque ones in pass 1 glPushMatrix (); if (mCorrectPerspective == CorrectPerspectivePolygon) getPerspectiveCorrectionMat (p, skewMat, NULL, output); if (mCorrectPerspective != CorrectPerspectiveNone) glMultMatrixf (skewMat); // Center glTranslatef (p->centerPos.x (), p->centerPos.y (), p->centerPos.z ()); // Scale z first glScalef (1.0f, 1.0f, 1.0f / ::screen->width ()); transformPolygon (p); // Move by "rotation axis offset" glTranslatef (p->rotAxisOffset.x (), p->rotAxisOffset.y (), p->rotAxisOffset.z ()); // Rotate by desired angle glRotatef (p->rotAngle, p->rotAxis.x (), p->rotAxis.y (), p->rotAxis.z ()); // Move back to center glTranslatef (-p->rotAxisOffset.x (), -p->rotAxisOffset.y (), -p->rotAxisOffset.z ()); // Scale back glScalef (1.0f, 1.0f, ::screen->width ()); clipPlanes[0][3] = -(c.boxf.x1 - p->centerPosStart.x ()); clipPlanes[1][3] = -(c.boxf.y1 - p->centerPosStart.y ()); clipPlanes[2][3] = (c.boxf.x2 - p->centerPosStart.x ()); clipPlanes[3][3] = (c.boxf.y2 - p->centerPosStart.y ()); glClipPlane (GL_CLIP_PLANE0, clipPlanes[0]); glClipPlane (GL_CLIP_PLANE1, clipPlanes[1]); glClipPlane (GL_CLIP_PLANE2, clipPlanes[2]); glClipPlane (GL_CLIP_PLANE3, clipPlanes[3]); for (int k = 0; k < 4; k++) glEnable (GL_CLIP_PLANE0 + k); bool fadeBackAndSides = mBackAndSidesFadeDur > 0 && forwardProgress <= mBackAndSidesFadeDur; float newOpacityPolygon2 = newOpacityPolygon; if (fadeBackAndSides) { // Fade-in opacity for back face and sides newOpacityPolygon2 *= (forwardProgress / mBackAndSidesFadeDur); } GLFragment::Attrib attrib = mCurPaintAttrib; attrib.setOpacity (newOpacityPolygon2 * OPAQUE); prepareDrawingForAttrib (attrib); // Draw back face glVertexPointer (3, GL_FLOAT, 0, p->vertices + 3 * nSides); if (mThickness > 0) glNormalPointer (GL_FLOAT, 0, p->normals + 3 * nSides); else glNormal3f (0.0f, 0.0f, -1.0f); glTexCoordPointer (2, GL_FLOAT, 0, &vertexTexCoords[2 * nSides]); glDrawArrays (GL_POLYGON, 0, nSides); // Vertex coords glVertexPointer (3, GL_FLOAT, 0, p->vertices); if (mThickness > 0) glNormalPointer (GL_FLOAT, 0, p->normals); else glNormal3f (0.0f, 0.0f, 1.0f); glTexCoordPointer (2, GL_FLOAT, 0, vertexTexCoords); // Draw quads for sides for (int k = 0; k < nSides; k++) { // GL_QUADS uses a different vertex normal than the first // so I use GL_POLYGON to make sure the normals are right. glDrawElements (GL_POLYGON, 4, GL_UNSIGNED_SHORT, p->sideIndices + k * 4); } // if opacity was changed just above if (fadeBackAndSides) { // Go back to normal opacity for front face attrib = mCurPaintAttrib; attrib.setOpacity (newOpacityPolygon * OPAQUE); prepareDrawingForAttrib (attrib); } // Draw front face glDrawArrays (GL_POLYGON, 0, nSides); for (int k = 0; k < 4; k++) glDisable (GL_CLIP_PLANE0 + k); glPopMatrix (); } void PolygonAnim::drawGeometry () { mNumDrawGeometryCalls++; // draw windows only on current viewport unless it's on all viewports CompPoint pnt = mCScreen->windowPaintOffset (); if ((pnt.x () != 0 || pnt.y () != 0) && !mWindow->onAllViewports ()) { return; // since this is not the viewport the window was drawn // just before animation started } // TODO // if polygon set is not valid or effect is not 3D (glide w/thickness=0) //if (!pset) //return; int numClips = mClips.size (); if (mFirstNondrawnClip < 0 || mFirstNondrawnClip >= numClips) { return; } if (mClipsUpdated) processIntersectingPolygons (); int lastClip; // last clip to draw if (mClipsUpdated) { lastClip = numClips - 1; } else { assert (!mLastClipInGroup.empty()); lastClip = mLastClipInGroup[mNumDrawGeometryCalls - 1]; } float forwardProgress = progressLinear (); // OpenGL stuff starts here GLboolean normalArrayWas = false; if (mThickness > 0) { glPushAttrib (GL_NORMALIZE); glEnable (GL_NORMALIZE); normalArrayWas = glIsEnabled (GL_NORMAL_ARRAY); glEnableClientState (GL_NORMAL_ARRAY); } if (mDoLighting) { glPushAttrib (GL_SHADE_MODEL); glShadeModel (GL_FLAT); glPushAttrib (GL_LIGHT0); glPushAttrib (GL_COLOR_MATERIAL); glPushAttrib (GL_LIGHTING); glEnable (GL_COLOR_MATERIAL); glEnable (GL_LIGHTING); GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 0.3f }; GLfloat diffuseLight[] = { 0.9f, 0.9f, 0.9f, 0.9f }; GLfloat light0Position[] = { -0.5f, 0.5f, 9.0f, 0.0f }; glLightfv (GL_LIGHT0, GL_AMBIENT, ambientLight); glLightfv (GL_LIGHT0, GL_DIFFUSE, diffuseLight); glLightfv (GL_LIGHT0, GL_POSITION, light0Position); } glPushMatrix (); glPushAttrib (GL_STENCIL_BUFFER_BIT); glDisable (GL_STENCIL_TEST); if (mDoDepthTest) { // Depth test glPushAttrib (GL_DEPTH_FUNC); glPushAttrib (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL); glEnable (GL_DEPTH_TEST); } // Clip planes GLdouble clipPlanes[4][4] = {{ 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { -1, 0, 0, 0 }, { 0, -1, 0, 0 }}; // Save old color values GLfloat oldColor[4]; glGetFloatv (GL_CURRENT_COLOR, oldColor); // Determine where we are called from in paint.c's drawWindowTexture // to find out how we should change the opacity GLint prevActiveTexture = GL_TEXTURE0_ARB; bool saturationFull = true; if (GL::canDoSaturated && mCurPaintAttrib.getSaturation () != COLOR) { saturationFull = false; if (GL::canDoSlightlySaturated && mCurPaintAttrib.getSaturation () > 0) { if (mCurPaintAttrib.getOpacity () < OPAQUE || mCurPaintAttrib.getBrightness () != BRIGHT) prevActiveTexture = GL_TEXTURE3_ARB; else prevActiveTexture = GL_TEXTURE2_ARB; } else prevActiveTexture = GL_TEXTURE1_ARB; } float opacity = mCurPaintAttrib.getOpacity () / 65535.0; float newOpacity = opacity; float fadePassedBy; bool decelerates = deceleratingMotion (); glPushAttrib (GL_BLEND); glEnable (GL_BLEND); if (saturationFull) mGScreen->setTexEnvMode (GL_MODULATE); // if fade-out duration is not specified per polygon if (mAllFadeDuration > -1.0f) { fadePassedBy = forwardProgress - (1 - mAllFadeDuration); // if "fade out starting point" is passed if (fadePassedBy > 1e-5) // if true, allFadeDuration should be > 0 { float opacityFac; if (decelerates) opacityFac = 1 - progressDecelerate (fadePassedBy / mAllFadeDuration); else opacityFac = 1 - fadePassedBy / mAllFadeDuration; if (opacityFac < 0) opacityFac = 0; if (opacityFac > 1) opacityFac = 1; newOpacity = opacity * opacityFac; } } const CompOutput *output = static_cast (getExtensionPluginInfo ())-> output (); GLfloat skewMat[16]; if (mCorrectPerspective == CorrectPerspectiveWindow) getPerspectiveCorrectionMat (NULL, skewMat, NULL, *output); // pass: 0: draw opaque ones // 1: draw transparent ones for (int pass = 0; pass < 2; pass++) { Clip4Polygons *c = &mClips[mFirstNondrawnClip]; for (int j = mFirstNondrawnClip; j <= lastClip; j++, c++) { if (c->intersectsMostPolygons) { const GLfloat *vTexCoords = &c->polygonVertexTexCoords[0]; foreach (const PolygonObject *p, mPolygons) { drawPolygonClipIntersection (p, *c, vTexCoords, pass, forwardProgress, clipPlanes, *output, newOpacity, decelerates, skewMat); vTexCoords += 4 * p->nSides; } } else { foreach (const PolygonClipInfo *pci, c->intersectingPolygonInfos) { drawPolygonClipIntersection (pci->p, *c, &pci->vertexTexCoords[0], pass, forwardProgress, clipPlanes, *output, newOpacity, decelerates, skewMat); } } } } // Restore // ----------------------------------------- // Restore old color values glColor4f (oldColor[0], oldColor[1], oldColor[2], oldColor[3]); glPopAttrib (); // GL_BLEND if (mDoDepthTest) { glPopAttrib (); // GL_DEPTH_TEST glPopAttrib (); // GL_DEPTH_FUNC } glPopAttrib (); // GL_STENCIL_BUFFER_BIT // Restore texture stuff if (saturationFull) mGScreen->setTexEnvMode (GL_REPLACE); glPopMatrix (); (GL::activeTexture) (prevActiveTexture); if (mDoLighting) { glPopAttrib (); // GL_LIGHTING glPopAttrib (); // GL_COLOR_MATERIAL glPopAttrib (); // GL_LIGHT0 glPopAttrib (); // GL_SHADE_MODEL } if (mThickness > 0) { glPopAttrib (); // GL_NORMALIZE if (normalArrayWas) glEnableClientState (GL_NORMAL_ARRAY); else glDisableClientState (GL_NORMAL_ARRAY); } else glNormal3f (0.0f, 0.0f, -1.0f); if (mClipsUpdated) // set the end mark for this group of clips mLastClipInGroup.push_back (lastClip); assert (!mLastClipInGroup.empty ()); // Next time, start drawing from next group of clips mFirstNondrawnClip = mLastClipInGroup[mNumDrawGeometryCalls - 1] + 1; } void PolygonAnim::prePaintWindow () { mNumDrawGeometryCalls = 0; mFirstNondrawnClip = 0; } void PolygonAnim::postPaintWindow () { if (mClipsUpdated && // clips should be dropped only in the 1st step mNumDrawGeometryCalls == 0) // if clips not drawn { // drop these unneeded clips (e.g. ones passed by blurfx) mClips.resize (mFirstNondrawnClip); } } // Computes polygon's new position and orientation // with linear movement void PolygonAnim::stepPolygon (PolygonObject *p, float forwardProgress) { float moveProgress = forwardProgress - p->moveStartTime; if (p->moveDuration > 0) moveProgress /= p->moveDuration; if (moveProgress < 0) moveProgress = 0; else if (moveProgress > 1) moveProgress = 1; p->centerPos.setX (moveProgress * p->finalRelPos.x () + p->centerPosStart.x ()); p->centerPos.setY (moveProgress * p->finalRelPos.y () + p->centerPosStart.y ()); p->centerPos.setZ (1.0f / ::screen->width () * moveProgress * p->finalRelPos.z () + p->centerPosStart.z ()); p->rotAngle = moveProgress * p->finalRotAng + p->rotAngleStart; } // Similar to stepPolygon, // but slightly ac/decelerates movement void PolygonAnim::deceleratingAnimStepPolygon (PolygonObject *p, float forwardProgress) { // TODO: Refactor float moveProgress = forwardProgress - p->moveStartTime; if (p->moveDuration > 0) moveProgress /= p->moveDuration; if (moveProgress < 0) moveProgress = 0; else if (moveProgress > 1) moveProgress = 1; moveProgress = progressDecelerate (moveProgress); p->centerPos.setX (moveProgress * p->finalRelPos.x () + p->centerPosStart.x ()); p->centerPos.setY (moveProgress * p->finalRelPos.y () + p->centerPosStart.y ()); p->centerPos.setZ (1.0f / ::screen->width () * moveProgress * p->finalRelPos.z () + p->centerPosStart.z ()); p->rotAngle = moveProgress * p->finalRotAng + p->rotAngleStart; } void PolygonAnim::step () { float forwardProgress = progressLinear (); foreach (PolygonObject *p, mPolygons) stepPolygon (p, forwardProgress); } void PolygonAnim::updateBB (CompOutput &output) { GLScreen *gScreen = GLScreen::get (::screen); GLMatrix wTransform; GLMatrix wTransform2; prepareTransform (output, wTransform, wTransform2); const float *screenProjection = gScreen->projectionMatrix (); GLdouble dModel[16]; GLdouble dProjection[16]; for (int i = 0; i < 16; i++) { dProjection[i] = screenProjection[i]; } GLint viewport[4] = {output.region ()->extents.x1, output.region ()->extents.y1, output.width (), output.height ()}; GLdouble px, py, pz; GLMatrix *modelViewTransform = &wTransform; GLMatrix skewMat; if (mCorrectPerspective == CorrectPerspectiveWindow) { getPerspectiveCorrectionMat (NULL, NULL, &skewMat, output); wTransform2 = wTransform * skewMat; } if (mCorrectPerspective == CorrectPerspectiveWindow || mCorrectPerspective == CorrectPerspectivePolygon) modelViewTransform = &wTransform2; foreach (const PolygonObject *p, mPolygons) { if (mCorrectPerspective == CorrectPerspectivePolygon) { getPerspectiveCorrectionMat (p, NULL, &skewMat, output); wTransform2 = wTransform * skewMat; } // if modelViewTransform == wTransform2, then // it changes for each polygon const float *modelViewMatrix = modelViewTransform->getMatrix (); for (int j = 0; j < 16; j++) dModel[j] = modelViewMatrix[j]; Point3d center = p->centerPos; float radius = p->boundSphereRadius + 2; // Take rotation axis offset into consideration and // properly enclose polygon in the bounding cube // whatever the rotation angle is: // Add rotation axis offset to center (rotated) polygon correctly // within bounding cube center.add (p->rotAxisOffset.x (), p->rotAxisOffset.y (), p->rotAxisOffset.z () / ::screen->width ()); // Add rotation axis offset to radius to enlarge the bounding cube radius += MAX (MAX (fabs (p->rotAxisOffset.x ()), fabs (p->rotAxisOffset.y ())), fabs (p->rotAxisOffset.z ())); float zradius = radius / ::screen->width (); static const unsigned short N_POINTS = 8; // Corners of bounding cube Point3d cubeCorners[N_POINTS]; cubeCorners[0].set (center.x () - radius, center.y () - radius, center.z () + zradius); cubeCorners[1].set (center.x () - radius, center.y () + radius, center.z () + zradius); cubeCorners[2].set (center.x () + radius, center.y () - radius, center.z () + zradius); cubeCorners[3].set (center.x () + radius, center.y () + radius, center.z () + zradius); cubeCorners[4].set (center.x () - radius, center.y () - radius, center.z () - zradius); cubeCorners[5].set (center.x () - radius, center.y () + radius, center.z () - zradius); cubeCorners[6].set (center.x () + radius, center.y () - radius, center.z () - zradius); cubeCorners[7].set (center.x () + radius, center.y () + radius, center.z () - zradius); Point3d *pnt = cubeCorners; for (int j = 0; j < N_POINTS; j++, pnt++) { if (!gluProject (pnt->x (), pnt->y (), pnt->z (), dModel, dProjection, viewport, &px, &py, &pz)) return; py = ::screen->height () - py; mAWindow->expandBBWithPoint (px + 0.5, py + 0.5); } #undef N_POINTS } } bool PolygonAnim::prePreparePaint (int msSinceLastPaint) { mNumClipsPassed = 0; mClipsUpdated = false; return false; } bool PolygonAnim::moveUpdate (int dx, int dy) { foreach (PolygonObject *p, mPolygons) { p->centerPosStart.setX (p->centerPosStart.x () + dx); p->centerPosStart.setY (p->centerPosStart.y () + dy); p->centerPos.setX (p->centerPos.x () + dx); p->centerPos.setY (p->centerPos.y () + dy); p->finalRelPos.setX (p->finalRelPos.x () + dx); p->finalRelPos.setY (p->finalRelPos.y () + dy); } return true; } void ExtensionPluginAnimAddon::prePaintOutput (CompOutput *output) { CompString pluginName ("animationaddon"); mOutput = output; // Find out if an animation running now uses depth test bool depthUsed = false; foreach (CompWindow *w, ::screen->windows ()) { AnimWindow *aw = AnimWindow::get (w); Animation *anim = aw->curAnimation (); if (anim && anim->remainingTime () > 0 && anim->getExtensionPluginInfo ()->name == pluginName) { BaseAddonAnim *animBase = dynamic_cast (anim); if (animBase->needsDepthTest ()) { depthUsed = true; break; } } } if (depthUsed) { glClearDepth (1000.0f); glClear (GL_DEPTH_BUFFER_BIT); } } compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/burn.cpp0000644000015301777760000003004512321343002024403 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * burn.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Burn ========================= BurnAnim::BurnAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), ParticleAnim::ParticleAnim (w, curWindowEvent, duration, info, icon) { mDirection = getActualAnimDirection ((AnimDirection) optValI (AnimationaddonOptions::FireDirection), false); if (optValB (AnimationaddonOptions::FireConstantSpeed)) { int winHeight = w->height () + w->output ().top + w->output ().bottom; mTotalTime *= winHeight / 500.0; mRemainingTime *= winHeight / 500.0; } mMysticalFire = optValB (AnimationaddonOptions::FireMystical); mLife = optValF (AnimationaddonOptions::FireLife); mColor = optValC (AnimationaddonOptions::FireColor); mSize = optValF (AnimationaddonOptions::FireSize); mHasSmoke = optValB (AnimationaddonOptions::FireSmoke); mFirePSId = mHasSmoke ? 1 : 0; mSmokePSId = 0; int numFireParticles = optValI (AnimationaddonOptions::FireParticles); float slowDown = optValF (AnimationaddonOptions::FireSlowdown); // Light ParticleSystem is for smoke, which is optional. // Dark ParticleSystem is for fire. initLightDarkParticles (mHasSmoke ? numFireParticles / 10 : 0, numFireParticles, slowDown / 2.0f, slowDown); } void BurnAnim::genNewFire (int x, int y, int width, int height, float size, float time) { ParticleSystem &ps = mParticleSystems[mFirePSId]; unsigned numParticles = ps.particles ().size (); float fireLifeNeg = 1 - mLife; float fadeExtra = 0.2f * (1.01 - mLife); float max_new = numParticles * (time / 50) * (1.05 - mLife); float colr1 = (float)mColor[0] / 0xffff; float colg1 = (float)mColor[1] / 0xffff; float colb1 = (float)mColor[2] / 0xffff; float colr2 = 1 / 1.7 * (float)mColor[0] / 0xffff; float colg2 = 1 / 1.7 * (float)mColor[1] / 0xffff; float colb2 = 1 / 1.7 * (float)mColor[2] / 0xffff; float cola = (float)mColor[3] / 0xffff; float rVal; float partw = mSize; float parth = partw * 1.5; // Limit max number of new particles created simultaneously if (max_new > numParticles / 5) max_new = numParticles / 5; Particle *part = &ps.particles ()[0]; for (unsigned i = 0; i < numParticles && max_new > 0; i++, part++) { if (part->life <= 0.0f) { // give gt new life rVal = (float)(random () & 0xff) / 255.0; part->life = 1.0f; part->fade = rVal * fireLifeNeg + fadeExtra; // Random Fade Value // set size part->width = partw; part->height = parth; rVal = (float)(random () & 0xff) / 255.0; part->w_mod = part->h_mod = size * rVal; // choose random position rVal = (float)(random () & 0xff) / 255.0; part->x = x + ((width > 1) ? (rVal * width) : 0); rVal = (float)(random () & 0xff) / 255.0; part->y = y + ((height > 1) ? (rVal * height) : 0); part->z = 0.0; part->xo = part->x; part->yo = part->y; part->zo = part->z; // set speed and direction rVal = (float)(random () & 0xff) / 255.0; part->xi = ((rVal * 20.0) - 10.0f); rVal = (float)(random () & 0xff) / 255.0; part->yi = ((rVal * 20.0) - 15.0f); part->zi = 0.0f; if (mMysticalFire) { // Random colors! (aka Mystical Fire) rVal = (float)(random () & 0xff) / 255.0; part->r = rVal; rVal = (float)(random () & 0xff) / 255.0; part->g = rVal; rVal = (float)(random () & 0xff) / 255.0; part->b = rVal; } else { rVal = (float)(random () & 0xff) / 255.0; part->r = colr1 - rVal * colr2; part->g = colg1 - rVal * colg2; part->b = colb1 - rVal * colb2; } // set transparancy part->a = cola; // set gravity part->xg = (part->x < part->xo) ? 1.0 : -1.0; part->yg = -3.0f; part->zg = 0.0f; ps.activate (); max_new -= 1; } else { part->xg = (part->x < part->xo) ? 1.0 : -1.0; } } } void BurnAnim::genNewSmoke (int x, int y, int width, int height, float size, float time) { ParticleSystem &ps = mParticleSystems[mSmokePSId]; unsigned numParticles = ps.particles ().size (); float fireLifeNeg = 1 - mLife; float fadeExtra = 0.2f * (1.01 - mLife); float max_new = numParticles * (time / 50) * (1.05 - mLife); float rVal; float partSize = mSize * size * 5; float sizeNeg = -size; // Limit max number of new particles created simultaneously if (max_new > numParticles) max_new = numParticles; Particle *part = &ps.particles ()[0]; for (unsigned i = 0; i < numParticles && max_new > 0; i++, part++) { if (part->life <= 0.0f) { // give gt new life rVal = (float)(random () & 0xff) / 255.0; part->life = 1.0f; part->fade = rVal * fireLifeNeg + fadeExtra; // Random Fade Value // set size part->width = partSize; part->height = partSize; part->w_mod = -0.8; part->h_mod = -0.8; // choose random position rVal = (float)(random () & 0xff) / 255.0; part->x = x + ((width > 1) ? (rVal * width) : 0); rVal = (float)(random () & 0xff) / 255.0; part->y = y + ((height > 1) ? (rVal * height) : 0); part->z = 0.0; part->xo = part->x; part->yo = part->y; part->zo = part->z; // set speed and direction rVal = (float)(random () & 0xff) / 255.0; part->xi = ((rVal * 20.0) - 10.0f); rVal = (float)(random () & 0xff) / 255.0; part->yi = (rVal + 0.2) * -size; part->zi = 0.0f; // set color rVal = (float)(random () & 0xff) / 255.0; part->r = rVal / 4.0; part->g = rVal / 4.0; part->b = rVal / 4.0; rVal = (float)(random () & 0xff) / 255.0; part->a = 0.5 + (rVal / 2.0); // set gravity part->xg = (part->x < part->xo) ? size : sizeNeg; part->yg = sizeNeg; part->zg = 0.0f; ps.activate (); max_new -= 1; } else { part->xg = (part->x < part->xo) ? size : sizeNeg; } } } void BurnAnim::step () { CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); float timestep = mIntenseTimeStep; float old = 1 - (mRemainingTime) / (mTotalTime - timestep); float stepSize; mRemainingTime -= timestep; if (mRemainingTime <= 0) mRemainingTime = 0; // avoid sub-zero values float newProgress = 1 - (mRemainingTime) / (mTotalTime - timestep); stepSize = newProgress - old; if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade) { newProgress = 1 - newProgress; } if (mRemainingTime > 0) { CompRect rect; switch (mDirection) { case AnimDirectionUp: rect = CompRect (0, 0, outRect.width (), outRect.height () - (newProgress * outRect.height ())); break; case AnimDirectionRight: rect = CompRect (newProgress * outRect.width (), 0, outRect.width () - (newProgress * outRect.width ()), outRect.height ()); break; case AnimDirectionLeft: rect = CompRect (0, 0, outRect.width () - (newProgress * outRect.width ()), outRect.height ()); break; case AnimDirectionDown: default: rect = CompRect (0, newProgress * outRect.height (), outRect.width (), outRect.height () - (newProgress * outRect.height ())); break; } rect.setX (rect.x () + outRect.x ()); rect.setY (rect.y () + outRect.y ()); mDrawRegion = CompRegion (rect); } else { mDrawRegion = emptyRegion; } mUseDrawRegion = (fabs (newProgress) > 1e-5); if (mRemainingTime > 0) { switch (mDirection) { case AnimDirectionUp: if (mHasSmoke) genNewSmoke (outRect.x (), outRect.y () + ((1 - newProgress) * outRect.height ()), outRect.width (), 1, outRect.width () / 40.0, mTimeSinceLastPaint); genNewFire (outRect.x (), outRect.y () + ((1 - newProgress) * outRect.height ()), outRect.width (), (stepSize) * outRect.height (), outRect.width () / 40.0, mTimeSinceLastPaint); break; case AnimDirectionLeft: if (mHasSmoke) genNewSmoke (outRect.x () + ((1 - newProgress) * outRect.width ()), outRect.y (), (stepSize) * outRect.width (), outRect.height (), outRect.height () / 40.0, mTimeSinceLastPaint); genNewFire (outRect.x () + ((1 - newProgress) * outRect.width ()), outRect.y (), (stepSize) * outRect.width (), outRect.height (), outRect.height () / 40.0, mTimeSinceLastPaint); break; case AnimDirectionRight: if (mHasSmoke) genNewSmoke (outRect.x () + (newProgress * outRect.width ()), outRect.y (), (stepSize) * outRect.width (), outRect.height (), outRect.height () / 40.0, mTimeSinceLastPaint); genNewFire (outRect.x () + (newProgress * outRect.width ()), outRect.y (), (stepSize) * outRect.width (), outRect.height (), outRect.height () / 40.0, mTimeSinceLastPaint); break; case AnimDirectionDown: default: if (mHasSmoke) genNewSmoke (outRect.x (), outRect.y () + (newProgress * outRect.height ()), outRect.width (), 1, outRect.width () / 40.0, mTimeSinceLastPaint); genNewFire (outRect.x (), outRect.y () + (newProgress * outRect.height ()), outRect.width (), (stepSize) * outRect.height (), outRect.width () / 40.0, mTimeSinceLastPaint); break; } } if (mRemainingTime <= 0 && (mParticleSystems[0].active () || (mHasSmoke && mParticleSystems[1].active ()))) // force animation to continue until particle systems are done mRemainingTime = timestep; Particle *part; if (mRemainingTime > 0) { int nParticles; if (mHasSmoke) { float partxg = outRect.width () / 40.0; float partxgNeg = -partxg; vector &particles = mParticleSystems[mSmokePSId].particles (); nParticles = particles.size (); part = &particles[0]; for (int i = 0; i < nParticles; i++, part++) part->xg = (part->x < part->xo) ? partxg : partxgNeg; mParticleSystems[mSmokePSId].setOrigin (outRect.x (), outRect.y ()); } vector &particles = mParticleSystems[mFirePSId].particles (); nParticles = particles.size (); part = &particles[0]; for (int i = 0; i < nParticles; i++, part++) part->xg = (part->x < part->xo) ? 1.0 : -1.0; } mParticleSystems[mFirePSId].setOrigin (outRect.x (), outRect.y ()); } compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/beamup.cpp0000644000015301777760000001541512321343002024712 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * beamup.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Beam Up ========================= BeamUpAnim::BeamUpAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), ParticleAnim::ParticleAnim (w, curWindowEvent, duration, info, icon) { mLife = optValF (AnimationaddonOptions::BeamLife); mColor = optValC (AnimationaddonOptions::BeamColor); mSize = optValF (AnimationaddonOptions::BeamSize); mSpacing = optValI (AnimationaddonOptions::BeamSpacing); mSlowdown = optValF (AnimationaddonOptions::BeamSlowdown); } void BeamUpAnim::init () { int winWidth = mWindow->width () + mWindow->output ().left + mWindow->output ().right; initLightDarkParticles (0, winWidth / mSpacing, 0, mSlowdown); } void BeamUpAnim::genNewBeam (int x, int y, int width, int height, float size, float time) { ParticleSystem &ps = mParticleSystems[0]; unsigned numParticles = ps.particles ().size (); float beamLifeNeg = 1 - mLife; float fadeExtra = 0.2f * (1.01 - mLife); float maxNew = numParticles * (time / 50) * (1.05 - mLife); // set color ABAB ANIMADDON_SCREEN_OPTION_BEAMUP_COLOR unsigned short *c = mColor; float colr1 = (float)c[0] / 0xffff; float colg1 = (float)c[1] / 0xffff; float colb1 = (float)c[2] / 0xffff; float colr2 = 1 / 1.7 * (float)c[0] / 0xffff; float colg2 = 1 / 1.7 * (float)c[1] / 0xffff; float colb2 = 1 / 1.7 * (float)c[2] / 0xffff; float cola = (float)c[3] / 0xffff; float rVal; float partw = 2.5 * mSize; // Limit max number of new particles created simultaneously if (maxNew > numParticles) maxNew = numParticles; Particle *part = &ps.particles ()[0]; for (unsigned i = 0; i < numParticles && maxNew > 0; i++, part++) { if (part->life <= 0.0f) { // give gt new life rVal = (float)(random () & 0xff) / 255.0; part->life = 1.0f; part->fade = rVal * beamLifeNeg + fadeExtra; // Random Fade Value // set size part->width = partw; part->height = height; part->w_mod = size * 0.2; part->h_mod = size * 0.02; // choose random x position rVal = (float)(random () & 0xff) / 255.0; part->x = x + ((width > 1) ? (rVal * width) : 0); part->y = y; part->z = 0.0; part->xo = part->x; part->yo = part->y; part->zo = part->z; // set speed and direction part->xi = 0.0f; part->yi = 0.0f; part->zi = 0.0f; part->r = colr1 - rVal * colr2; part->g = colg1 - rVal * colg2; part->b = colb1 - rVal * colb2; part->a = cola; // set gravity part->xg = 0.0f; part->yg = 0.0f; part->zg = 0.0f; if (!ps.active ()) ps.activate (); maxNew -= 1; } else { part->xg = (part->x < part->xo) ? 1.0 : -1.0; } } } void BeamUpAnim::step () { CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); float timestep = mIntenseTimeStep; mRemainingTime -= timestep; if (mRemainingTime <= 0) mRemainingTime = 0; // avoid sub-zero values float newProgress = 1 - mRemainingTime / (mTotalTime - timestep); bool creating = (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade); if (creating) newProgress = 1 - newProgress; if (mRemainingTime > 0) { CompRect rect (((newProgress / 2) * outRect.width ()), ((newProgress / 2) * outRect.height ()), (1 - newProgress) * outRect.width (), (1 - newProgress) * outRect.height ()); rect.setX (rect.x () + outRect.x ()); rect.setY (rect.y () + outRect.y ()); mDrawRegion = CompRegion (rect); } else { mDrawRegion = emptyRegion; } mUseDrawRegion = (fabs (newProgress) > 1e-5); if (mRemainingTime > 0) { genNewBeam (outRect.x (), outRect.y () + (outRect.height () / 2), outRect.width (), creating ? (1 - newProgress / 2) * outRect.height () : (1 - newProgress) * outRect.height (), outRect.width () / 40.0, mTimeSinceLastPaint); } if (mRemainingTime <= 0 && mParticleSystems[0].active ()) // force animation to continue until particle systems are done mRemainingTime = 0.001f; if (mRemainingTime > 0) { vector &particles = mParticleSystems[0].particles (); int nParticles = particles.size (); Particle *part = &particles[0]; for (int i = 0; i < nParticles; i++, part++) part->xg = (part->x < part->xo) ? 1.0 : -1.0; } mParticleSystems[0].setOrigin (outRect.x (), outRect.y ()); } void BeamUpAnim::updateAttrib (GLWindowPaintAttrib &attrib) { float forwardProgress = 0; if (mTotalTime - mIntenseTimeStep != 0) forwardProgress = 1 - (mRemainingTime) / (mTotalTime - mIntenseTimeStep); forwardProgress = MIN(forwardProgress, 1); forwardProgress = MAX(forwardProgress, 0); //float forwardProgress = progressLinear (); if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize) { //forwardProgress = 1 - forwardProgress; forwardProgress = forwardProgress * forwardProgress; forwardProgress = forwardProgress * forwardProgress; forwardProgress = 1 - forwardProgress; } attrib.opacity = (GLushort) (mStoredOpacity * (1 - forwardProgress)); } compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/airplane.cpp0000644000015301777760000004535212321343002025237 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * airplane.cpp (based on airplane3d.c) * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Airplane added by : Carlo Palma * E-mail : carlopalma@salug.it * Based on code originally written by Mark J. Kilgard * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" #define BORDER_W(w) ((w)->width () + (w)->border ().left + (w)->border ().right) #define BORDER_H(w) ((w)->height () + (w)->border ().top + (w)->border ().bottom) #define BORDER_X(w) ((w)->x () - (w)->border ().left) #define BORDER_Y(w) ((w)->y () - (w)->border ().top) // Divide the window in 8 polygons (6 quadrilaters and 2 triangles (all of them draw as quadrilaters)) // Based on tessellateIntoRectangles and tessellateIntoHexagons. Improperly called tessellation. const float AirplaneAnim::kDurationFactor = 1.82; AirplaneAnim::AirplaneAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { } AirplaneAnim::~AirplaneAnim () { freePolygonObjects (); } bool AirplaneAnim::tesselateIntoAirplane () { float winLimitsX; // boundaries of polygon tessellation float winLimitsY; float winLimitsW; float winLimitsH; winLimitsX = BORDER_X (mWindow); winLimitsY = BORDER_Y (mWindow); winLimitsW = BORDER_W (mWindow); winLimitsH = BORDER_H (mWindow); unsigned int numpol = 8; if (mPolygons.size () != numpol) { freePolygonObjects (); for (unsigned int i = 0; i < numpol; i++) mPolygons.push_back (new AirplanePolygonObject); } float thickness = 0; thickness /= screen->width (); mThickness = thickness; mNumTotalFrontVertices = 0; float W = (float)winLimitsW; float H2 = (float)winLimitsH / 2; float H3 = (float)winLimitsH / 3; float H6 = (float)winLimitsH / 6; float halfThick = mThickness / 2; /** * * These correspond to the polygons: * based on GLUT sample origami.c code by Mark J. Kilgard * * |- W -| * |- H2 -| * * - -- +----+--------+------------------+ * | | | / | * | | 6 / | * | 7 | / 5 | * H2 | | + | * | +--------+------------------+ * | / 4 | * H __ |/____________.__________________| * |\ center | * | \ 3 | * | +--------+------------------+ * | | + | * | 0 | \ | * | | 1 \ 2 | * | | | \ | * - +----+--------+------------------+ * * */ int i = 0; foreach (PolygonObject *pol, mPolygons) { AirplanePolygonObject *p = (AirplanePolygonObject *) pol; float topRightY, topLeftY, bottomLeftY, bottomRightY; float topLeftX, topRightX, bottomLeftX, bottomRightX; p->centerPos.setX (winLimitsX + H2); p->centerPosStart.setX (winLimitsX + H2); p->centerPos.setY (winLimitsY + H2); p->centerPosStart.setY (winLimitsY + H2); p->centerPos.setZ (-halfThick); p->centerPosStart.setZ (-halfThick); p->rotAngle = p->rotAngleStart = 0; p->nSides = 4; p->nVertices = 2 * 4; mNumTotalFrontVertices += 4; switch (i) { case 0: topLeftX = -H2; topLeftY = 0; bottomLeftX = -H2; bottomLeftY = H2; bottomRightX = -H3; bottomRightY = H2; topRightX = -H3; topRightY = H6; break; case 1: topLeftX = -H3; topLeftY = H6; bottomLeftX = -H3; bottomLeftY = H2; bottomRightX = 0; bottomRightY = H2; topRightX = 0; topRightY = H2; break; case 2: topLeftX = -H3; topLeftY = H6; bottomLeftX = 0; bottomLeftY = H2; bottomRightX = W - H2; bottomRightY = H2; topRightX = W - H2; topRightY = H6; break; case 3: topLeftX = -H2; topLeftY = 0; bottomLeftX = -H3; bottomLeftY = H6; bottomRightX = W - H2; bottomRightY = H6; topRightX = W - H2; topRightY = 0; break; case 4: topLeftX = -H3; topLeftY = -H6; bottomLeftX = -H2; bottomLeftY = 0; bottomRightX = W - H2; bottomRightY = 0; topRightX = W - H2; topRightY = -H6; break; case 5: topLeftX = 0; topLeftY = -H2; bottomLeftX = -H3; bottomLeftY = -H6; bottomRightX = W - H2; bottomRightY = -H6; topRightX = W - H2; topRightY = -H2; break; case 6: topLeftX = -H3; topLeftY = -H2; bottomLeftX = -H3; bottomLeftY = -H6; bottomRightX = -H3; bottomRightY = -H6; topRightX = 0; topRightY = -H2; break; default: topLeftX = -H2; topLeftY = -H2; bottomLeftX = -H2; bottomLeftY = 0; bottomRightX = -H3; bottomRightY = -H6; topRightX = -H3; topRightY = -H2; break; } // 4 front, 4 back vertices p->vertices = (GLfloat *) calloc (8 * 3, sizeof (GLfloat)); if (!p->vertices) { compLogMessage ("animation", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLfloat *pv = p->vertices; // Determine 4 front vertices in ccw direction pv[0] = topLeftX; pv[1] = topLeftY; pv[2] = halfThick; pv[3] = bottomLeftX; pv[4] = bottomLeftY; pv[5] = halfThick; pv[6] = bottomRightX; pv[7] = bottomRightY; pv[8] = halfThick; pv[9] = topRightX; pv[10] = topRightY; pv[11] = halfThick; // Determine 4 back vertices in cw direction pv[12] = topRightX; pv[13] = topRightY; pv[14] = -halfThick; pv[15] = bottomRightX; pv[16] = bottomRightY; pv[17] = -halfThick; pv[18] = bottomLeftX; pv[19] = bottomLeftY; pv[20] = -halfThick; pv[21] = topLeftX; pv[22] = topLeftY; pv[23] = -halfThick; // 16 indices for 4 sides (for quad strip) p->sideIndices = (GLushort *) calloc (4 * 4, sizeof (GLushort)); if (!p->sideIndices) { compLogMessage ("animation", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLushort *ind = p->sideIndices; int id = 0; ind[id++] = 0; ind[id++] = 7; ind[id++] = 6; ind[id++] = 1; ind[id++] = 1; ind[id++] = 6; ind[id++] = 5; ind[id++] = 2; ind[id++] = 2; ind[id++] = 5; ind[id++] = 4; ind[id++] = 3; ind[id++] = 3; ind[id++] = 4; ind[id++] = 7; ind[id++] = 0; if (i < 4) { p->boundingBox.x1 = p->centerPos.x () + topLeftX; p->boundingBox.y1 = p->centerPos.y () + topLeftY; p->boundingBox.x2 = ceil (p->centerPos.x () + bottomRightX); p->boundingBox.y2 = ceil (p->centerPos.y () + bottomRightY); } else { p->boundingBox.x1 = p->centerPos.x () + bottomLeftX; p->boundingBox.y1 = p->centerPos.y () + topLeftY; p->boundingBox.x2 = ceil (p->centerPos.x () + bottomRightX); p->boundingBox.y2 = ceil (p->centerPos.y () + bottomLeftY); } i++; } return true; } void AirplaneAnim::init () { if (!tesselateIntoAirplane ()) return; float airplanePathLength = optValF (AnimationaddonOptions::AirplanePathLength); float winLimitsW; // boundaries of polygon tessellation float winLimitsH; winLimitsW = BORDER_W (mWindow); winLimitsH = BORDER_H (mWindow); float H4 = (float)winLimitsH / 4; float H6 = (float)winLimitsH / 6; int i = 0; foreach (PolygonObject *pol, mPolygons) { AirplanePolygonObject *p = (AirplanePolygonObject *) pol; p->moveStartTime = 0.00; p->moveDuration = 0.19; p->moveStartTime2 = 0.19; p->moveDuration2 = 0.19; p->moveStartTime3 = 0.38; p->moveDuration3 = 0.19; p->moveStartTime4 = 0.58; p->moveDuration4 = 0.09; p->moveDuration5 = 0.41; p->flyFinalRotation.set (90, 10, 0); p->flyTheta = 0; p->centerPosFly.set (0, 0, 0); p->flyScale = 0; p->flyFinalScale = 6 * (winLimitsW / (screen->width () / 2)); switch (i) { case 0: p->rotAxisOffset.set (-H4, H4, 0.0f); p->rotAxis.set (1.00, 1.00, 0.00); p->finalRotAng = 179.5; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0.00, 0.00); p->finalRotAngA = 84; p->rotAxisOffsetB.set (0, 0, 0); p->rotAxisB.set (0.00, 0.00, 0.00); p->finalRotAngB = 0; break; case 1: p->rotAxisOffset.set (-H4, H4, 0.0f); p->rotAxis.set (1.00, 1.00, 0.00); p->finalRotAng = 179.5; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0.00, 0.00); p->finalRotAngA = 84; p->rotAxisOffsetB.set (0, H6, 0); p->rotAxisB.set (1.00, 0.00, 0.00); p->finalRotAngB = -84; break; case 2: p->moveDuration = 0.00; p->rotAxisOffset.set (0, 0, 0); p->rotAxis.set (0, 0, 0); p->finalRotAng = 0; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0, 0); p->finalRotAngA = 84; p->rotAxisOffsetB.set (0, H6, 0); p->rotAxisB.set (1.00, 0, 0); p->finalRotAngB = -84; break; case 3: p->moveDuration = 0.00; p->rotAxisOffset.set (0, 0, 0); p->rotAxis.set (0, 0, 0); p->finalRotAng = 0; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0, 0); p->finalRotAngA = 84; p->moveDuration3 = 0.00; p->rotAxisOffsetB.set (0, 0, 0); p->rotAxisB.set (0, 0, 0); p->finalRotAngB = 0; break; case 4: p->moveDuration = 0.00; p->rotAxisOffset.set (0, 0, 0); p->rotAxis.set (0, 0, 0); p->finalRotAng = 0; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0, 0); p->finalRotAngA = -84; p->moveDuration3 = 0.00; p->rotAxisOffsetB.set (0, 0, 0); p->rotAxisB.set (0, 0, 0); p->finalRotAngB = 0; break; case 5: p->moveDuration = 0.00; p->rotAxisOffset.set (0, 0, 0); p->rotAxis.set (0, 0, 0); p->finalRotAng = 0; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0, 0); p->finalRotAngA = -84; p->rotAxisOffsetB.set (0, -H6, 0); p->rotAxisB.set (1.00, 0, 0); p->finalRotAngB = 84; break; case 6: p->rotAxisOffset.set (-H4, -H4, 0); p->rotAxis.set (1.00, -1.00, 0.00); p->finalRotAng = -179.5; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0.00, 0.00); p->finalRotAngA = -84; p->rotAxisOffsetB.set (0, -H6, 0); p->rotAxisB.set (1.00, 0, 0); p->finalRotAngB = 84; break; case 7: p->rotAxisOffset.set (-H4, -H4, 0); p->rotAxis.set (1.00, -1.00, 0.00); p->finalRotAng = -179.5; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1, 0, 0); p->finalRotAngA = -84; p->rotAxisOffsetB.set (0, 0, 0); p->rotAxisB.set (0.00, 0.00, 0.00); p->finalRotAngB = 0; break; } i++; } if (airplanePathLength >= 1) mAllFadeDuration = 0.30f / airplanePathLength; else mAllFadeDuration = 0.30f; mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectivePolygon; mBackAndSidesFadeDur = 0; /* mExtraPolygonTransformFunc = &AirplaneExtraPolygonTransformFunc; */ // Duration extension mTotalTime *= 2 + airplanePathLength; mRemainingTime = mTotalTime; } void AirplaneAnim::stepPolygon (PolygonObject *pol, float forwardProgress) { AirplanePolygonObject *p = (AirplanePolygonObject *) pol; /* A stupid hack */ if (pol == mPolygons.front ()) { short x, y; // Make sure the airplane always flies towards mouse pointer if (mCurWindowEvent == WindowEventClose) AnimScreen::get (screen)->getMousePointerXY (&x, &y); mIcon.setX (x); mIcon.setY (y); } float airplanePathLength = optValF (AnimationaddonOptions::AirplanePathLength); bool airplaneFly2TaskBar = optValB (AnimationaddonOptions::AirplaneFlyToTaskbar); /* Phase1: folding: flaps, folding center, folding wings. * Phase2: rotate and fly. */ if (forwardProgress > p->moveStartTime && forwardProgress < p->moveStartTime4) // Phase1: folding: flaps, center, wings. { float moveProgress1 = forwardProgress - p->moveStartTime; if (p->moveDuration > 0) moveProgress1 /= p->moveDuration; else moveProgress1 = 0; if (moveProgress1 < 0) moveProgress1 = 0; else if (moveProgress1 > 1) moveProgress1 = 1; float moveProgress2 = forwardProgress - p->moveStartTime2; if (p->moveDuration2 > 0) moveProgress2 /= p->moveDuration2; else moveProgress2 = 0; if (moveProgress2 < 0) moveProgress2 = 0; else if (moveProgress2 > 1) moveProgress2 = 1; float moveProgress3 = forwardProgress - p->moveStartTime3; if (p->moveDuration3 > 0) moveProgress3 /= p->moveDuration3; else moveProgress3 = 0; if (moveProgress3 < 0) moveProgress3 = 0; else if (moveProgress3 > 1) moveProgress3 = 1; p->centerPos = p->centerPosStart; p->rotAngle = moveProgress1 * p->finalRotAng; p->rotAngleA = moveProgress2 * p->finalRotAngA; p->rotAngleB = moveProgress3 * p->finalRotAngB; p->flyRotation.set (0, 0, 0); p->flyScale = 0; } else if (forwardProgress >= p->moveStartTime4) // Phase2: rotate and fly { float moveProgress4 = forwardProgress - p->moveStartTime4; if (p->moveDuration4 > 0) moveProgress4 /= p->moveDuration4; if (moveProgress4 < 0) moveProgress4 = 0; else if (moveProgress4 > 1) moveProgress4 = 1; float moveProgress5 = forwardProgress - (p->moveStartTime4 + .01); if (p->moveDuration5 > 0) moveProgress5 /= p->moveDuration5; if (moveProgress5 < 0) moveProgress5 = 0; else if (moveProgress5 > 1) moveProgress5 = 1; p->rotAngle = p->finalRotAng; p->rotAngleA = p->finalRotAngA; p->rotAngleB = p->finalRotAngB; p->flyRotation.set (moveProgress4 * p->flyFinalRotation.x (), moveProgress4 * p->flyFinalRotation.y (), 0); // flying path float icondiffx = 0; p->flyTheta = moveProgress5 * -M_PI_2 * airplanePathLength; p->centerPosFly.setX (screen->width () * .4 * sin (2 * p->flyTheta)); if (((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && airplaneFly2TaskBar) || mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventClose) { // flying path ends at icon/pointer int sign = 1; if (mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) sign = -1; icondiffx = (((mIcon.x () + mIcon.width () / 2) - (p->centerPosStart.x () + sign * screen->width () * .4 * sin (2 * -M_PI_2 * airplanePathLength))) * moveProgress5); p->centerPosFly.setY ( (((int) mIcon.x () + (int) mIcon.height () / 2) - p->centerPosStart.y ()) * -sin (p->flyTheta / airplanePathLength)); } else { if (p->centerPosStart.y () < screen->height () * .33 || p->centerPosStart.y () > screen->height () * .66) p->centerPosFly.setY ( screen->height () * .6 * sin (p->flyTheta / 3.4)); else p->centerPosFly.setY ( screen->height () * .4 * sin (p->flyTheta / 3.4)); if (p->centerPosStart.y () < screen->height () * .33) p->centerPosFly.setY (p->centerPosFly.y () * -1); } p->flyFinalRotation.setZ ( ((atan (2.0) + M_PI_2) * sin (p->flyTheta) - M_PI_2) * 180 / M_PI); p->flyFinalRotation.add (0, 0, 90); if (mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventClose) { p->flyFinalRotation.setZ (p->flyFinalRotation.z () * -1); } else if (mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) { p->centerPosFly.setX (p->centerPosFly.x () * -1); } p->flyRotation.setZ (p->flyFinalRotation.z ()); p->centerPos.setX (p->centerPosStart.x () + p->centerPosFly.x () + icondiffx); p->centerPos.setY (p->centerPosStart.y () + p->centerPosFly.y ()); p->centerPos.setZ (p->centerPosStart.z () + p->centerPosFly.z ()); p->flyScale = moveProgress5 * p->flyFinalScale; } } void AirplaneAnim::transformPolygon (const PolygonObject *pol) { AirplanePolygonObject *p = (AirplanePolygonObject *) pol; glRotatef (p->flyRotation.x (), 1, 0, 0); //rotate on axis X glRotatef (-p->flyRotation.y (), 0, 1, 0); // rotate on axis Y glRotatef (p->flyRotation.z (), 0, 0, 1); // rotate on axis Z glScalef (1.0 / (1.0 + p->flyScale), 1.0 / (1.0 + p->flyScale), 1.0 / (1.0 + p->flyScale)); // Move by "rotation axis offset A" glTranslatef (p->rotAxisOffsetA.x (), p->rotAxisOffsetA.y (), p->rotAxisOffsetA.z ()); // Rotate by desired angle A glRotatef (p->rotAngleA, p->rotAxisA.x (), p->rotAxisA.y (), p->rotAxisA.z ()); // Move back to center from A glTranslatef (-p->rotAxisOffsetA.x (), -p->rotAxisOffsetA.y (), -p->rotAxisOffsetA.z ()); // Move by "rotation axis offset B" glTranslatef (p->rotAxisOffsetB.x (), p->rotAxisOffsetB.y (), p->rotAxisOffsetB.z ()); // Rotate by desired angle B glRotatef (p->rotAngleB, p->rotAxisB.x (), p->rotAxisB.y (), p->rotAxisB.z ()); // Move back to center from B glTranslatef (-p->rotAxisOffsetB.x (), -p->rotAxisOffsetB.y (), -p->rotAxisOffsetB.z ()); } /* TODO: Damage a region, not the whole screen */ void AirplaneAnim::updateBB (CompOutput &) { Box screenBox = {0, static_cast (screen->width ()), 0, static_cast (screen->height ()) }; mAWindow->expandBBWithBox (screenBox); } void AirplaneAnim::freePolygonObjects () { while (!mPolygons.empty ()) { AirplanePolygonObject *p = (AirplanePolygonObject *) mPolygons.back (); if (p->nVertices > 0) { if (p->vertices) { free (p->vertices); p->vertices = NULL; } if (p->sideIndices) { free (p->sideIndices); p->sideIndices = NULL; } } delete p; mPolygons.pop_back (); } mPolygons.clear (); } compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/private.h0000644000015301777760000002011212321343002024546 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include #define foreach BOOST_FOREACH #include #include #include #include "animationaddon_options.h" extern AnimEffect AnimEffectBurn; extern AnimEffect AnimEffectExplode; extern AnimEffect AnimEffectAirplane; extern AnimEffect AnimEffectBeamUp; extern AnimEffect AnimEffectDissolve; extern AnimEffect AnimEffectDomino; extern AnimEffect AnimEffectFold; extern AnimEffect AnimEffectGlide3; extern AnimEffect AnimEffectLeafSpread; extern AnimEffect AnimEffectRazr; extern AnimEffect AnimEffectSkewer; // TODO Update this for each added animation effect! (total: 11) extern const unsigned short NUM_EFFECTS; // This must have the value of the first "effect setting" above // in AnimAddonScreenOptions #define NUM_NONEFFECT_OPTIONS AnimationaddonOptions::AirplanePathLength class ExtensionPluginAnimAddon : public ExtensionPluginInfo { public: ExtensionPluginAnimAddon (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex) : ExtensionPluginInfo (name, nEffects, effects, effectOptions, firstEffectOptionIndex) {} virtual ~ExtensionPluginAnimAddon () {} void prePaintOutput (CompOutput *output); const CompOutput *output () { return mOutput; } private: const CompOutput *mOutput; }; class PrivateAnimAddonScreen : public AnimationaddonOptions { friend class AnimAddonScreen; public: PrivateAnimAddonScreen (CompScreen *); ~PrivateAnimAddonScreen (); protected: void initAnimationList (); CompOutput &mOutput; }; class AnimAddonWindow : public PluginClassHandler { public: AnimAddonWindow (CompWindow *); ~AnimAddonWindow (); protected: CompWindow *mWindow; ///< Window being animated. AnimWindow *aWindow; }; // Particle-based animations class BeamUpAnim : public ParticleAnim { public: BeamUpAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void init (); void step (); void genNewBeam (int x, int y, int width, int height, float size, float time); void updateAttrib (GLWindowPaintAttrib &wAttrib); float mLife; unsigned short *mColor; float mSize; int mSpacing; float mSlowdown; }; class BurnAnim : public ParticleAnim { public: BurnAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void step (); void genNewFire (int x, int y, int width, int height, float size, float time); void genNewSmoke (int x, int y, int width, int height, float size, float time); int mDirection; bool mMysticalFire; float mLife; unsigned short *mColor; float mSize; bool mHasSmoke; unsigned int mFirePSId; unsigned int mSmokePSId; }; // Polygon-based animations class ExplodeAnim : public PolygonAnim { public: ExplodeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); protected: static const float kDurationFactor; }; /// Extended polygon object for airplane folding and flying airplane fold phase. class AirplanePolygonObject : public PolygonObject { public: Vector3d rotAxisA; // Rotation axis vector A Vector3d rotAxisB; // Rotation axis vector B Point3d rotAxisOffsetA; // Rotation axis translate amount A Point3d rotAxisOffsetB; // Rotation axis translate amount B float rotAngleA; // Rotation angle A float finalRotAngA; // Final rotation angle A float rotAngleB; // Rotation angle B float finalRotAngB; // Final rotation angle B // airplane fly phase: Vector3d centerPosFly; // center position (offset) during the flying phases Vector3d flyRotation; // airplane rotation during the flying phases Vector3d flyFinalRotation; // airplane rotation during the flying phases float flyScale; // Scale for airplane flying effect float flyFinalScale; // Final Scale for airplane flying effect float flyTheta; // Theta parameter for fly rotations and positions float moveStartTime2; // Movement starts at this time ([0-1] range) float moveDuration2; // Movement lasts this long ([0-1] range) float moveStartTime3; // Movement starts at this time ([0-1] range) float moveDuration3; // Movement lasts this long ([0-1] range) float moveStartTime4; // Movement starts at this time ([0-1] range) float moveDuration4; // Movement lasts this long ([0-1] range) float moveStartTime5; // Movement starts at this time ([0-1] range) float moveDuration5; // Movement lasts this long ([0-1] range) }; class AirplaneAnim : public PolygonAnim { public: AirplaneAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~AirplaneAnim (); void stepPolygon (PolygonObject *p, float); void init (); void transformPolygon (const PolygonObject *p); bool tesselateIntoAirplane (); void updateBB (CompOutput &); void freePolygonObjects (); static const float kDurationFactor; }; class DominoAnim : public PolygonAnim { public: DominoAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); protected: static const float kDurationFactor; }; class RazrAnim : public DominoAnim { public: RazrAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); }; class FoldAnim : public PolygonAnim { public: FoldAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); void stepPolygon (PolygonObject *p, float); static const float kDurationFactor; }; class Glide3Anim : public PolygonAnim { public: Glide3Anim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); bool deceleratingMotion () { return true; } static const float kDurationFactor; void init (); }; class LeafSpreadAnim : public PolygonAnim { public: LeafSpreadAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); protected: static const float kDurationFactor; }; class SkewerAnim : public PolygonAnim { public: SkewerAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); void stepPolygon (PolygonObject *p, float forwardProgress); protected: static const float kDurationFactor; }; /* TODO: Make a MultiAnim */ class DissolveSingleAnim : virtual public Animation, virtual public TransformAnim { public: DissolveSingleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void step () { TransformAnim::step (); } void updateBB (CompOutput &output); bool updateBBUsed () { return true; } void updateTransform (GLMatrix &); void updateAttrib (GLWindowPaintAttrib &wAttrib); virtual float getDissolveSingleProgress () { return progressLinear (); } }; class DissolveAnim : public MultiAnim { public: DissolveAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : MultiAnim ::MultiAnim (w, curWindowEvent, duration, info, icon) { } }; compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/domino.cpp0000644000015301777760000001662612321343002024733 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * domino.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Domino and Razr ========================= const float DominoAnim::kDurationFactor = 1.25; DominoAnim::DominoAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectivePolygon; } RazrAnim::RazrAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), DominoAnim::DominoAnim (w, curWindowEvent, duration, info, icon) { } void DominoAnim::init () { bool isRazr = (typeid (*this) == typeid (RazrAnim)); int fallDir; if (isRazr) fallDir = getActualAnimDirection ((AnimDirection) optValI (AnimationaddonOptions::RazrDirection), true); else fallDir = getActualAnimDirection ((AnimDirection) optValI (AnimationaddonOptions::DominoDirection), true); int defaultGridSize = 20; float minCellSize = 30; int gridSizeX; int gridSizeY; int fallDirGridSize; float minDistStartEdge; // half piece size in [0,1] range float gridCellW; float gridCellH; float cellAspectRatio = 1.25; if (isRazr) cellAspectRatio = 1; CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); // Determine sensible domino piece sizes if (fallDir == AnimDirectionDown || fallDir == AnimDirectionUp) { if (minCellSize > outRect.width ()) minCellSize = outRect.width (); if (outRect.width () / defaultGridSize < minCellSize) gridSizeX = (int)(outRect.width () / minCellSize); else gridSizeX = defaultGridSize; gridCellW = outRect.width () / gridSizeX; gridSizeY = (int)(outRect.height () / (gridCellW * cellAspectRatio)); if (gridSizeY == 0) gridSizeY = 1; gridCellH = outRect.height () / gridSizeY; fallDirGridSize = gridSizeY; } else { if (minCellSize > outRect.height ()) minCellSize = outRect.height (); if (outRect.height () / defaultGridSize < minCellSize) gridSizeY = (int)(outRect.height () / minCellSize); else gridSizeY = defaultGridSize; gridCellH = outRect.height () / gridSizeY; gridSizeX = (int)(outRect.width () / (gridCellH * cellAspectRatio)); if (gridSizeX == 0) gridSizeX = 1; gridCellW = outRect.width () / gridSizeX; fallDirGridSize = gridSizeX; } minDistStartEdge = (1.0 / fallDirGridSize) / 2; float thickness = MIN (gridCellW, gridCellH) / 3.5; if (!tessellateIntoRectangles (gridSizeX, gridSizeY, thickness)) return; float rotAxisX = 0; float rotAxisY = 0; Point3d rotAxisOff (0, 0, thickness / 2); float posX = 0; // position of standing piece float posY = 0; float posZ = 0; int nFallingColumns = gridSizeX; float gridCellHalfW = gridCellW / 2; float gridCellHalfH = gridCellH / 2; switch (fallDir) { case AnimDirectionDown: rotAxisX = -1; if (isRazr) rotAxisOff.setY (-gridCellHalfH); else { posY = -(gridCellHalfH + thickness); posZ = gridCellHalfH - thickness / 2; } break; case AnimDirectionLeft: rotAxisY = -1; if (isRazr) rotAxisOff.setX (gridCellHalfW); else { posX = gridCellHalfW + thickness; posZ = gridCellHalfW - thickness / 2; } nFallingColumns = gridSizeY; break; case AnimDirectionUp: rotAxisX = 1; if (isRazr) rotAxisOff.setY (gridCellHalfH); else { posY = gridCellHalfH + thickness; posZ = gridCellHalfH - thickness / 2; } break; case AnimDirectionRight: rotAxisY = 1; if (isRazr) rotAxisOff.setX (-gridCellHalfW); else { posX = -(gridCellHalfW + thickness); posZ = gridCellHalfW - thickness / 2; } nFallingColumns = gridSizeY; break; } float fadeDuration; float riseDuration; float riseTimeRandMax = 0.2; if (isRazr) { riseDuration = (1 - riseTimeRandMax) / fallDirGridSize; fadeDuration = riseDuration / 2; } else { fadeDuration = 0.18; riseDuration = 0.2; } float riseTimeRandSeed[nFallingColumns]; for (int i = 0; i < nFallingColumns; i++) riseTimeRandSeed[i] = RAND_FLOAT (); foreach (PolygonObject *p, mPolygons) { p->rotAxis.set (rotAxisX, rotAxisY, 0); p->finalRelPos.set (posX, posY, posZ); // dist. from rise-start / fall-end edge in window ([0,1] range) float distStartEdge = 0; // dist. from edge perpendicular to movement (for move start time) // so that same the blocks in same row/col. appear to knock down // the next one float distPerpEdge = 0; switch (fallDir) { case AnimDirectionUp: distStartEdge = p->centerRelPos.y (); distPerpEdge = p->centerRelPos.x (); break; case AnimDirectionRight: distStartEdge = 1 - p->centerRelPos.x (); distPerpEdge = p->centerRelPos.y (); break; case AnimDirectionDown: distStartEdge = 1 - p->centerRelPos.y (); distPerpEdge = p->centerRelPos.x (); break; case AnimDirectionLeft: distStartEdge = p->centerRelPos.x (); distPerpEdge = p->centerRelPos.y (); break; } float riseTimeRand = riseTimeRandSeed[(int)(distPerpEdge * nFallingColumns)] * riseTimeRandMax; p->moveDuration = riseDuration; float mult = 1; if (fallDirGridSize > 1) mult = ((distStartEdge - minDistStartEdge) / (1 - 2 * minDistStartEdge)); if (isRazr) { p->moveStartTime = mult * (1 - riseDuration - riseTimeRandMax) + riseTimeRand; p->fadeStartTime = p->moveStartTime + riseDuration / 2; p->finalRotAng = -180; p->rotAxisOffset = rotAxisOff; } else { p->moveStartTime = mult * (1 - riseDuration - riseTimeRandMax) + riseTimeRand; p->fadeStartTime = p->moveStartTime + riseDuration - riseTimeRand + 0.03; p->finalRotAng = -90; } if (p->fadeStartTime > 1 - fadeDuration) p->fadeStartTime = 1 - fadeDuration; p->fadeDuration = fadeDuration; } } compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/glide3.cpp0000644000015301777760000000517512321343002024612 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * glide3.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Slab ========================= const float Glide3Anim::kDurationFactor = 1.82; Glide3Anim::Glide3Anim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { } void Glide3Anim::init () { //if (!polygonsAnimInit (w)) //return false; float finalDistFac = optValF (AnimationaddonOptions::Glide3AwayPosition); float finalRotAng = optValF (AnimationaddonOptions::Glide3AwayAngle); float thickness = optValF (AnimationaddonOptions::Glide3Thickness); //PolygonSet *pset = aw->eng.polygonSet; mIncludeShadows = (thickness < 1e-5); if (!tessellateIntoRectangles (1, 1, thickness)) return; foreach (PolygonObject *p, mPolygons) { p->rotAxis.set (1, 0, 0); p->finalRelPos.set (0, 0, finalDistFac * 0.8 * DEFAULT_Z_CAMERA * screen->width ()); p->finalRotAng = finalRotAng; } mAllFadeDuration = 1.0f; mBackAndSidesFadeDur = 0.2f; mDoLighting = true; mCorrectPerspective = CorrectPerspectivePolygon; } compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/particle.cpp0000644000015301777760000002075612321343002025250 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * particle.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" #include "animation_tex.h" ParticleAnim::ParticleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), BaseAddonAnim::BaseAddonAnim (w, curWindowEvent, duration, info, icon), PartialWindowAnim::PartialWindowAnim (w, curWindowEvent, duration, info, icon) { } ParticleSystem::ParticleSystem (int numParticles, float slowDown, float darkenAmount, GLuint blendMode) : mParticles (numParticles), mSlowDown (slowDown), mDarkenAmount (darkenAmount), mBlendMode (blendMode), mTex (0), mActive (false), mGScreen (GLScreen::get (::screen)) { glGenTextures (1, &mTex); /* glBindTexture (GL_TEXTURE_2D, mTex); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, fireTex); glBindTexture (GL_TEXTURE_2D, 0); */ } ParticleSystem::~ParticleSystem () { if (mTex) glDeleteTextures (1, &mTex); } void ParticleSystem::draw (int offsetX, int offsetY) { // TODO // The part below should ideally be done in ParticleSystem constructor // instead, but for some reason the texture image gets lost when we do that. glBindTexture (GL_TEXTURE_2D, mTex); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, fireTex); glBindTexture (GL_TEXTURE_2D, 0); glPushMatrix (); glTranslated (offsetX - mX, offsetY - mY, 0); glEnable (GL_BLEND); if (mTex) { glBindTexture (GL_TEXTURE_2D, mTex); glEnable (GL_TEXTURE_2D); } mGScreen->setTexEnvMode (GL_MODULATE); mVerticesCache.resize (4 * 3 * mParticles.size ()); mCoordsCache.resize (4 * 2 * mParticles.size ()); mColorsCache.resize (4 * 4 * mParticles.size ()); if (mDarkenAmount > 0) mDColorsCache.resize (4 * 4 * mParticles.size ()); GLfloat *dcolors = &mDColorsCache[0]; GLfloat *vertices = &mVerticesCache[0]; GLfloat *coords = &mCoordsCache[0]; GLfloat *colors = &mColorsCache[0]; int cornersSize = sizeof (GLfloat) * 8; int colorSize = sizeof (GLfloat) * 4; GLfloat cornerCoords[8] = {0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0}; int numActive = 0; foreach (Particle &part, mParticles) { if (part.life <= 0.0f) // Ignore dead particles continue; numActive += 4; float w = part.width / 2; float h = part.height / 2; w += (w * part.w_mod) * part.life; h += (h * part.h_mod) * part.life; vertices[0] = part.x - w; vertices[1] = part.y - h; vertices[2] = part.z; vertices[3] = part.x - w; vertices[4] = part.y + h; vertices[5] = part.z; vertices[6] = part.x + w; vertices[7] = part.y + h; vertices[8] = part.z; vertices[9] = part.x + w; vertices[10] = part.y - h; vertices[11] = part.z; vertices += 12; memcpy (coords, cornerCoords, cornersSize); coords += 8; colors[0] = part.r; colors[1] = part.g; colors[2] = part.b; colors[3] = part.life * part.a; memcpy (colors + 4, colors, colorSize); memcpy (colors + 8, colors, colorSize); memcpy (colors + 12, colors, colorSize); colors += 16; if (mDarkenAmount > 0) { dcolors[0] = part.r; dcolors[1] = part.g; dcolors[2] = part.b; dcolors[3] = part.life * part.a * mDarkenAmount; memcpy (dcolors + 4, dcolors, colorSize); memcpy (dcolors + 8, dcolors, colorSize); memcpy (dcolors + 12, dcolors, colorSize); dcolors += 16; } } glEnableClientState (GL_COLOR_ARRAY); glTexCoordPointer (2, GL_FLOAT, 2 * sizeof (GLfloat), &mCoordsCache[0]); glVertexPointer (3, GL_FLOAT, 3 * sizeof (GLfloat), &mVerticesCache[0]); // darken the background if (mDarkenAmount > 0) { glBlendFunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); glColorPointer (4, GL_FLOAT, 4 * sizeof (GLfloat), &mDColorsCache[0]); glDrawArrays (GL_QUADS, 0, numActive); } // draw particles glBlendFunc (GL_SRC_ALPHA, mBlendMode); glColorPointer (4, GL_FLOAT, 4 * sizeof (GLfloat), &mColorsCache[0]); glDrawArrays (GL_QUADS, 0, numActive); glDisableClientState (GL_COLOR_ARRAY); glPopMatrix (); glColor4usv (defaultColor); mGScreen->setTexEnvMode (GL_REPLACE); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_TEXTURE_2D); glDisable (GL_BLEND); } void ParticleAnim::postPaintWindow () { foreach (ParticleSystem &ps, mParticleSystems) if (ps.active ()) // offset by window pos. ps.draw (mWindow->x () - mWindow->output ().left, mWindow->y () - mWindow->output ().top); } void ParticleSystem::update (float time) { float speed = (time / 50.0); float slowdown = mSlowDown * (1 - MAX (0.99, time / 1000.0)) * 1000; mActive = false; foreach (Particle &part, mParticles) { if (part.life <= 0.0f) // Ignore dead particles continue; // move particle part.x += part.xi / slowdown; part.y += part.yi / slowdown; part.z += part.zi / slowdown; // modify speed part.xi += part.xg * speed; part.yi += part.yg * speed; part.zi += part.zg * speed; // modify life part.life -= part.fade * speed; if (!mActive) mActive = true; } } void ParticleAnim::updateBB (CompOutput &output) { foreach (ParticleSystem &ps, mParticleSystems) { if (!ps.active ()) continue; foreach (Particle &part, ps.particles ()) { if (part.life <= 0.0f) // Ignore dead particles continue; float w = part.width / 2; float h = part.height / 2; w += (w * part.w_mod) * part.life; h += (h * part.h_mod) * part.life; Box particleBox = { static_cast (part.x - w), static_cast (part.x + w), static_cast (part.y - h), static_cast (part.y + h) }; mAWindow->expandBBWithBox (particleBox); } } if (mUseDrawRegion && mDrawRegion != emptyRegion) // expand BB with bounding box of draw region mAWindow->expandBBWithBox (mDrawRegion.handle ()->extents); else // drawing full window mAWindow->expandBBWithWindow (); } bool ParticleAnim::prePreparePaint (int msSinceLastPaint) { bool particleAnimInProgress = false; foreach (ParticleSystem &ps, mParticleSystems) { if (!ps.active ()) continue; ps.update (msSinceLastPaint); particleAnimInProgress = true; } return particleAnimInProgress; } void ParticleAnim::initLightDarkParticles (int numLightParticles, int numDarkParticles, float lightSlowDown, float darkSlowDown) { if (numLightParticles > 0) mParticleSystems.push_back (new ParticleSystem (numLightParticles, lightSlowDown, 0.0f, GL_ONE_MINUS_SRC_ALPHA)); if (numDarkParticles > 0) mParticleSystems.push_back (new ParticleSystem (numDarkParticles, darkSlowDown, 0.5f, GL_ONE)); } compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/explode.cpp0000644000015301777760000000740312321343002025077 0ustar pbusernogroup00000000000000/* * Animation plugin for compiz/beryl * * explode.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Explode ========================= const float ExplodeAnim::kDurationFactor = 1.43; ExplodeAnim::ExplodeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { mAllFadeDuration = 0.3f; mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectivePolygon; mBackAndSidesFadeDur = 0.2f; } void ExplodeAnim::init () { switch (optValI (AnimationaddonOptions::ExplodeTessellation)) { case AnimationaddonOptions::ExplodeTessellationRectangular: if (!tessellateIntoRectangles (optValI (AnimationaddonOptions::ExplodeGridx), optValI (AnimationaddonOptions::ExplodeGridy), optValF (AnimationaddonOptions::ExplodeThickness))) return; break; case AnimationaddonOptions::ExplodeTessellationHexagonal: if (!tessellateIntoHexagons (optValI (AnimationaddonOptions::ExplodeGridx), optValI (AnimationaddonOptions::ExplodeGridy), optValF (AnimationaddonOptions::ExplodeThickness))) return; break; case AnimationaddonOptions::ExplodeTessellationGlass: if (!tessellateIntoGlass (optValI (AnimationaddonOptions::ExplodeSpokes), optValI (AnimationaddonOptions::ExplodeTiers), optValF (AnimationaddonOptions::ExplodeThickness))) return; break; default: return; } double sqrt2 = sqrt (2); float screenSizeFactor = (0.8 * DEFAULT_Z_CAMERA * ::screen->width ()); foreach (PolygonObject *p, mPolygons) { p->rotAxis.set (RAND_FLOAT (), RAND_FLOAT (), RAND_FLOAT ()); float speed = screenSizeFactor / 10 * (0.2 + RAND_FLOAT ()); float xx = 2 * (p->centerRelPos.x () - 0.5); float yy = 2 * (p->centerRelPos.y () - 0.5); float x = speed * 2 * (xx + 0.5 * (RAND_FLOAT () - 0.5)); float y = speed * 2 * (yy + 0.5 * (RAND_FLOAT () - 0.5)); float distToCenter = sqrt (xx * xx + yy * yy) / sqrt2; float moveMult = 1 - distToCenter; moveMult = moveMult < 0 ? 0 : moveMult; float zbias = 0.1; float z = speed * 10 * (zbias + RAND_FLOAT () * pow (moveMult, 0.5)); p->finalRelPos.set (x, y, z); p->finalRotAng = RAND_FLOAT () * 540 - 270; } } compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/animation_tex.h0000644000015301777760000004064612321343002025751 0ustar pbusernogroup00000000000000/** * * Particle texture for Beryl benchmark plugin * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.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. * **/ const unsigned char fireTex[4097] = { "\0\0\0\0\377\377\377\3\377\377\377\2\377\377\377\5\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\12\377\377\377\13\377\377\377\11\377\377" "\377\12\377\377\377\12\377\377\377\14\377\377\377\14\377\377\377\14\377\377" "\377\16\377\377\377\15\377\377\377\14\377\377\377\12\377\377\377\13\377\377" "\377\13\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\10\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\2\0\0\0\0\0" "\0\0\0\377\377\377\4\377\377\377\3\377\377\377\4\377\377\377\7\377\377\377" "\6\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\14\377\377\377" "\14\377\377\377\15\377\377\377\16\377\377\377\20\377\377\377\21\377\377\377" "\20\377\377\377\22\377\377\377\20\377\377\377\21\377\377\377\17\377\377\377" "\20\377\377\377\17\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\11\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\4\377\377\377\1\0\0\0\0\377\377\377\5\377\377\377\4\377\377\377\6\377\377" "\377\6\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\14\377\377" "\377\15\377\377\377\20\377\377\377\20\377\377\377\24\377\377\377\24\377\377" "\377\23\377\377\377\23\377\377\377\26\377\377\377\25\377\377\377\23\377\377" "\377\21\377\377\377\24\377\377\377\22\377\377\377\17\377\377\377\17\377\377" "\377\15\377\377\377\15\377\377\377\11\377\377\377\11\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\3\377\377\377\3\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377" "\13\377\377\377\17\377\377\377\22\377\377\377\24\377\377\377\22\377\377\377" "\30\377\377\377\30\377\377\377\31\377\377\377\31\377\377\377\33\377\377\377" "\31\377\377\377\30\377\377\377\30\377\377\377\30\377\377\377\25\377\377\377" "\25\377\377\377\23\377\377\377\22\377\377\377\17\377\377\377\13\377\377\377" "\12\377\377\377\11\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377" "\4\377\377\377\7\377\377\377\6\377\377\377\12\377\377\377\11\377\377\377" "\14\377\377\377\15\377\377\377\20\377\377\377\22\377\377\377\25\377\377\377" "\30\377\377\377\32\377\377\377\35\377\377\377\34\377\377\377\34\377\377\377" "\36\377\377\377\40\377\377\377\36\377\377\377\34\377\377\377\34\377\377\377" "\34\377\377\377\32\377\377\377\31\377\377\377\26\377\377\377\25\377\377\377" "\22\377\377\377\16\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\10\377\377\377\6\377\377\377\4\377\377\377\10\377\377\377\11\377\377\377" "\12\377\377\377\13\377\377\377\16\377\377\377\21\377\377\377\22\377\377\377" "\25\377\377\377\30\377\377\377\34\377\377\377\37\377\377\377!\377\377\377" "\"\377\377\377#\377\377\377#\377\377\377&\377\377\377&\377\377\377$\377\377" "\377#\377\377\377\40\377\377\377!\377\377\377\35\377\377\377\34\377\377\377" "\25\377\377\377\24\377\377\377\21\377\377\377\15\377\377\377\14\377\377\377" "\14\377\377\377\12\377\377\377\6\377\377\377\6\377\377\377\10\377\377\377" "\12\377\377\377\12\377\377\377\16\377\377\377\22\377\377\377\24\377\377\377" "\26\377\377\377\30\377\377\377\34\377\377\377\37\377\377\377#\377\377\377" "&\377\377\377,\377\377\377+\377\377\377,\377\377\377-\377\377\377-\377\377" "\377,\377\377\377+\377\377\377&\377\377\377)\377\377\377$\377\377\377\34" "\377\377\377\34\377\377\377\27\377\377\377\24\377\377\377\23\377\377\377" "\17\377\377\377\15\377\377\377\12\377\377\377\7\377\377\377\6\377\377\377" "\12\377\377\377\12\377\377\377\16\377\377\377\21\377\377\377\22\377\377\377" "\27\377\377\377\31\377\377\377\36\377\377\377!\377\377\377%\377\377\377(" "\377\377\3771\377\377\3772\377\377\3775\377\377\377;\377\377\377<\377\377" "\3779\377\377\3778\377\377\3773\377\377\3771\377\377\377-\377\377\377'\377" "\377\377\"\377\377\377\34\377\377\377\36\377\377\377\32\377\377\377\25\377" "\377\377\21\377\377\377\15\377\377\377\11\377\377\377\12\377\377\377\7\377" "\377\377\13\377\377\377\14\377\377\377\17\377\377\377\21\377\377\377\31\377" "\377\377\31\377\377\377\35\377\377\377!\377\377\377'\377\377\377+\377\377" "\3771\377\377\377=\377\377\377E\377\377\377H\377\377\377M\377\377\377M\377" "\377\377J\377\377\377I\377\377\377A\377\377\377A\377\377\3778\377\377\377" ",\377\377\377%\377\377\377$\377\377\377\"\377\377\377\34\377\377\377\24\377" "\377\377\22\377\377\377\17\377\377\377\13\377\377\377\12\377\377\377\11\377" "\377\377\13\377\377\377\14\377\377\377\20\377\377\377\23\377\377\377\27\377" "\377\377\35\377\377\377$\377\377\377(\377\377\377.\377\377\3776\377\377\377" "=\377\377\377H\377\377\377W\377\377\377Y\377\377\377]\377\377\377a\377\377" "\377\\\377\377\377\\\377\377\377U\377\377\377O\377\377\377?\377\377\3774" "\377\377\377-\377\377\377+\377\377\377\40\377\377\377\32\377\377\377\27\377" "\377\377\23\377\377\377\22\377\377\377\15\377\377\377\11\377\377\377\13\377" "\377\377\12\377\377\377\15\377\377\377\21\377\377\377\25\377\377\377\30\377" "\377\377\37\377\377\377$\377\377\377.\377\377\3779\377\377\377?\377\377\377" "N\377\377\377X\377\377\377h\377\377\377r\377\377\377w\377\377\377|\377\377" "\377x\377\377\377p\377\377\377k\377\377\377\\\377\377\377J\377\377\377F\377" "\377\3779\377\377\377*\377\377\377$\377\377\377\36\377\377\377\30\377\377" "\377\25\377\377\377\24\377\377\377\20\377\377\377\14\377\377\377\12\377\377" "\377\15\377\377\377\17\377\377\377\22\377\377\377\27\377\377\377\34\377\377" "\377\40\377\377\377%\377\377\377.\377\377\377<\377\377\377M\377\377\377[" "\377\377\377l\377\377\377~\377\377\377\227\377\377\377\230\377\377\377\234" "\377\377\377\233\377\377\377\226\377\377\377\205\377\377\377i\377\377\377" "b\377\377\377P\377\377\3779\377\377\377-\377\377\377(\377\377\377!\377\377" "\377\35\377\377\377\32\377\377\377\25\377\377\377\21\377\377\377\13\377\377" "\377\12\377\377\377\15\377\377\377\21\377\377\377\23\377\377\377\31\377\377" "\377\37\377\377\377!\377\377\377(\377\377\3774\377\377\377@\377\377\377Q" "\377\377\377g\377\377\377\200\377\377\377\231\377\377\377\254\377\377\377" "\275\377\377\377\310\377\377\377\304\377\377\377\264\377\377\377\227\377" "\377\377\212\377\377\377f\377\377\377Q\377\377\377B\377\377\377:\377\377" "\377/\377\377\377&\377\377\377\36\377\377\377\32\377\377\377\26\377\377\377" "\21\377\377\377\14\377\377\377\12\377\377\377\17\377\377\377\22\377\377\377" "\24\377\377\377\31\377\377\377\40\377\377\377&\377\377\377-\377\377\377:" "\377\377\377H\377\377\377X\377\377\377k\377\377\377\220\377\377\377\252\377" "\377\377\324\377\377\377\363\377\377\377\370\377\377\377\366\377\377\377" "\335\377\377\377\263\377\377\377\221\377\377\377w\377\377\377b\377\377\377" "P\377\377\377>\377\377\3770\377\377\377&\377\377\377\37\377\377\377\32\377" "\377\377\26\377\377\377\23\377\377\377\15\377\377\377\11\377\377\377\16\377" "\377\377\21\377\377\377\27\377\377\377\33\377\377\377\"\377\377\377(\377" "\377\377/\377\377\377<\377\377\377N\377\377\377b\377\377\377z\377\377\377" "\231\377\377\377\275\377\377\377\361\377\377\377\375\377\377\377\376\377" "\377\377\376\377\377\377\370\377\377\377\316\377\377\377\240\377\377\377" "\205\377\377\377b\377\377\377L\377\377\377<\377\377\377.\377\377\377&\377" "\377\377\40\377\377\377\33\377\377\377\26\377\377\377\22\377\377\377\15\377" "\377\377\12\377\377\377\16\377\377\377\22\377\377\377\24\377\377\377\32\377" "\377\377\40\377\377\377$\377\377\377,\377\377\377:\377\377\377L\377\377\377" "`\377\377\377|\377\377\377\231\377\377\377\310\377\377\377\372\377\377\377" "\375\377\377\377\376\377\377\377\376\377\377\377\375\377\377\377\332\377" "\377\377\241\377\377\377\207\377\377\377f\377\377\377R\377\377\377@\377\377" "\3773\377\377\377+\377\377\377\"\377\377\377\35\377\377\377\30\377\377\377" "\24\377\377\377\17\377\377\377\14\377\377\377\16\377\377\377\22\377\377\377" "\25\377\377\377\30\377\377\377\40\377\377\377$\377\377\377,\377\377\377;" "\377\377\377N\377\377\377e\377\377\377\206\377\377\377\246\377\377\377\327" "\377\377\377\374\377\377\377\375\377\377\377\376\377\377\377\376\377\377" "\377\374\377\377\377\331\377\377\377\243\377\377\377\210\377\377\377b\377" "\377\377O\377\377\377>\377\377\377.\377\377\377&\377\377\377\40\377\377\377" "\33\377\377\377\27\377\377\377\22\377\377\377\15\377\377\377\12\377\377\377" "\16\377\377\377\22\377\377\377\23\377\377\377\32\377\377\377\40\377\377\377" "'\377\377\3770\377\377\377?\377\377\377U\377\377\377h\377\377\377\200\377" "\377\377\237\377\377\377\270\377\377\377\344\377\377\377\372\377\377\377" "\375\377\377\377\376\377\377\377\354\377\377\377\275\377\377\377\227\377" "\377\377\200\377\377\377e\377\377\377Q\377\377\377>\377\377\377.\377\377" "\377%\377\377\377\40\377\377\377\33\377\377\377\26\377\377\377\22\377\377" "\377\15\377\377\377\11\377\377\377\17\377\377\377\22\377\377\377\25\377\377" "\377\31\377\377\377\"\377\377\377*\377\377\3773\377\377\377=\377\377\377" "J\377\377\377^\377\377\377o\377\377\377\211\377\377\377\235\377\377\377\271" "\377\377\377\327\377\377\377\342\377\377\377\335\377\377\377\302\377\377" "\377\240\377\377\377\216\377\377\377k\377\377\377X\377\377\377C\377\377\377" "9\377\377\377/\377\377\377&\377\377\377\"\377\377\377\33\377\377\377\26\377" "\377\377\22\377\377\377\14\377\377\377\12\377\377\377\15\377\377\377\22\377" "\377\377\31\377\377\377\35\377\377\377\37\377\377\377$\377\377\377,\377\377" "\3777\377\377\377A\377\377\377Q\377\377\377[\377\377\377p\377\377\377\212" "\377\377\377\231\377\377\377\242\377\377\377\253\377\377\377\251\377\377" "\377\236\377\377\377\215\377\377\377u\377\377\377b\377\377\377O\377\377\377" "<\377\377\3771\377\377\377)\377\377\377\"\377\377\377\34\377\377\377\32\377" "\377\377\27\377\377\377\21\377\377\377\16\377\377\377\12\377\377\377\17\377" "\377\377\21\377\377\377\20\377\377\377\27\377\377\377\37\377\377\377$\377" "\377\377&\377\377\377,\377\377\3778\377\377\377B\377\377\377R\377\377\377" "_\377\377\377k\377\377\377~\377\377\377\207\377\377\377\220\377\377\377\220" "\377\377\377\203\377\377\377q\377\377\377_\377\377\377V\377\377\377F\377" "\377\3777\377\377\377,\377\377\377%\377\377\377!\377\377\377\31\377\377\377" "\25\377\377\377\22\377\377\377\17\377\377\377\14\377\377\377\11\377\377\377" "\12\377\377\377\16\377\377\377\22\377\377\377\27\377\377\377\33\377\377\377" "\35\377\377\377\"\377\377\377(\377\377\377/\377\377\3779\377\377\377E\377" "\377\377L\377\377\377^\377\377\377d\377\377\377e\377\377\377k\377\377\377" "l\377\377\377d\377\377\377a\377\377\377O\377\377\377C\377\377\377=\377\377" "\3770\377\377\377)\377\377\377$\377\377\377\35\377\377\377\30\377\377\377" "\25\377\377\377\22\377\377\377\16\377\377\377\12\377\377\377\13\377\377\377" "\13\377\377\377\15\377\377\377\20\377\377\377\21\377\377\377\31\377\377\377" "\33\377\377\377\35\377\377\377$\377\377\377)\377\377\3771\377\377\3776\377" "\377\377@\377\377\377J\377\377\377N\377\377\377P\377\377\377S\377\377\377" "X\377\377\377P\377\377\377J\377\377\377E\377\377\3777\377\377\377,\377\377" "\377+\377\377\377%\377\377\377\40\377\377\377\32\377\377\377\26\377\377\377" "\21\377\377\377\21\377\377\377\14\377\377\377\11\377\377\377\12\377\377\377" "\13\377\377\377\11\377\377\377\14\377\377\377\21\377\377\377\23\377\377\377" "\27\377\377\377\33\377\377\377\37\377\377\377&\377\377\377(\377\377\377*" "\377\377\3774\377\377\3779\377\377\377<\377\377\377=\377\377\377C\377\377" "\377E\377\377\377?\377\377\3779\377\377\377:\377\377\377.\377\377\377(\377" "\377\377!\377\377\377!\377\377\377\35\377\377\377\31\377\377\377\24\377\377" "\377\21\377\377\377\16\377\377\377\12\377\377\377\11\377\377\377\10\377\377" "\377\10\377\377\377\11\377\377\377\13\377\377\377\16\377\377\377\22\377\377" "\377\25\377\377\377\30\377\377\377\33\377\377\377\"\377\377\377!\377\377" "\377%\377\377\377*\377\377\377-\377\377\3770\377\377\377/\377\377\3773\377" "\377\3772\377\377\3774\377\377\377-\377\377\377,\377\377\377*\377\377\377" "\"\377\377\377\37\377\377\377\32\377\377\377\33\377\377\377\27\377\377\377" "\21\377\377\377\17\377\377\377\16\377\377\377\12\377\377\377\11\377\377\377" "\6\377\377\377\10\377\377\377\12\377\377\377\11\377\377\377\15\377\377\377" "\20\377\377\377\22\377\377\377\23\377\377\377\30\377\377\377\32\377\377\377" "\35\377\377\377\40\377\377\377!\377\377\377%\377\377\377(\377\377\377&\377" "\377\377)\377\377\377(\377\377\377+\377\377\377$\377\377\377!\377\377\377" "#\377\377\377\36\377\377\377\30\377\377\377\30\377\377\377\24\377\377\377" "\22\377\377\377\20\377\377\377\15\377\377\377\11\377\377\377\12\377\377\377" "\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\11\377\377\377\12" "\377\377\377\16\377\377\377\17\377\377\377\22\377\377\377\23\377\377\377" "\26\377\377\377\31\377\377\377\33\377\377\377\34\377\377\377!\377\377\377" "\40\377\377\377\"\377\377\377\"\377\377\377\"\377\377\377&\377\377\377\36" "\377\377\377\35\377\377\377\35\377\377\377\34\377\377\377\26\377\377\377" "\24\377\377\377\23\377\377\377\20\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\7\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\6" "\377\377\377\11\377\377\377\12\377\377\377\11\377\377\377\15\377\377\377" "\16\377\377\377\21\377\377\377\22\377\377\377\26\377\377\377\26\377\377\377" "\30\377\377\377\33\377\377\377\32\377\377\377\34\377\377\377\33\377\377\377" "\32\377\377\377\37\377\377\377\31\377\377\377\31\377\377\377\27\377\377\377" "\30\377\377\377\21\377\377\377\22\377\377\377\17\377\377\377\14\377\377\377" "\11\377\377\377\11\377\377\377\12\377\377\377\6\377\377\377\6\377\377\377" "\4\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\7\377\377\377\13" "\377\377\377\11\377\377\377\12\377\377\377\16\377\377\377\21\377\377\377" "\21\377\377\377\20\377\377\377\22\377\377\377\30\377\377\377\26\377\377\377" "\27\377\377\377\30\377\377\377\27\377\377\377\30\377\377\377\26\377\377\377" "\23\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377\16\377\377\377" "\14\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\6\377\377\377" "\6\377\377\377\4\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\7\377\377\377\10\377\377\377\12\377\377\377\10\377\377\377\11" "\377\377\377\15\377\377\377\16\377\377\377\16\377\377\377\20\377\377\377" "\23\377\377\377\21\377\377\377\23\377\377\377\22\377\377\377\22\377\377\377" "\21\377\377\377\22\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377" "\15\377\377\377\12\377\377\377\11\377\377\377\12\377\377\377\7\377\377\377" "\6\377\377\377\7\377\377\377\5\377\377\377\4\377\377\377\1\377\377\377\1" "\377\377\377\3\377\377\377\3\377\377\377\6\377\377\377\7\377\377\377\6\377" "\377\377\10\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\13\377" "\377\377\16\377\377\377\16\377\377\377\16\377\377\377\17\377\377\377\16\377" "\377\377\16\377\377\377\17\377\377\377\17\377\377\377\15\377\377\377\14\377" "\377\377\12\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\3\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\377\377\377\2\377\377\377\4\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\13\377\377\377\13\377\377" "\377\10\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\15\377\377" "\377\13\377\377\377\14\377\377\377\11\377\377\377\13\377\377\377\11\377\377" "\377\12\377\377\377\13\377\377\377\11\377\377\377\11\377\377\377\6\377\377" "\377\7\377\377\377\4\377\377\377\5\377\377\377\3\377\377\377\1\0\0\0\0\0" "\0\0\0" }; compiz-0.9.11+14.04.20140409/plugins/animationaddon/src/fold.cpp0000644000015301777760000001516312321343002024365 0ustar pbusernogroup00000000000000/** * Animation plugin for compiz/beryl * * fold.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Fold and Skewer added by : Tomasz KoÅ‚odziejski * E-mail : tkolodziejski@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "private.h" #define BORDER_W(w) ((w)->width () + (w)->border ().left + (w)->border ().right) #define BORDER_H(w) ((w)->height () + (w)->border ().top + (w)->border ().bottom) const float FoldAnim::kDurationFactor = 1.82; FoldAnim::FoldAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { } void FoldAnim::init () { mTotalTime /= kDurationFactor; mRemainingTime = mTotalTime; unsigned int gridSizeX = optValI (AnimationaddonOptions::FoldGridx); unsigned int gridSizeY = optValI (AnimationaddonOptions::FoldGridy); if (!tessellateIntoRectangles (gridSizeX, gridSizeY, 1.0f)) return; /*PolygonSet *pset = aw->eng.polygonSet; PolygonObject *p = mPolygons;*/ // handle other non-zero values int fold_in = optValI (AnimationaddonOptions::FoldDir) == 0 ? 1 : 0; float rows_duration; float fduration; if (gridSizeY == 1) { fduration = 1.0f / (float)(gridSizeY + 2 * ceil (gridSizeX / 2)); rows_duration = 0; } else { fduration = 1.0f / (float)(gridSizeY + 2 * ceil (gridSizeX / 2) + 1 + fold_in); rows_duration = (gridSizeY - 1 + fold_in) * fduration; } float duration = fduration * 2; float start; unsigned int i = 0; unsigned int j = 0; int k = 0; foreach (PolygonObject *p, mPolygons) { if (i > mPolygons.size () - gridSizeX - 1) { // bottom row polygons if (j < gridSizeX / 2) { // the left ones start = rows_duration + duration * j++; p->rotAxis.setY (-180); p->finalRotAng = 180; p->fadeStartTime = start + fduration; p->fadeDuration = fduration; } else if (j == gridSizeX / 2) { // the middle one start = rows_duration + j * duration; p->rotAxis.setY (90); p->finalRotAng = 90; p->fadeStartTime = start + fduration; p->fadeDuration = fduration; j++; } else { // the right ones start = rows_duration + (j - 2) * duration + duration * k--; p->rotAxis.setY (180); p->finalRotAng = 180; p->fadeStartTime = start + fduration; p->fadeDuration = fduration; } } else { // main rows int row = i / gridSizeX; // [0; gridSizeY-1] start = row * fduration; p->rotAxis.setX (180); p->finalRelPos.setX (row); // number of row, not finalRelPos!! p->finalRotAng = 180; p->fadeDuration = fduration; p->fadeStartTime = start; if (row < (int) gridSizeY - 2 || fold_in) p->fadeStartTime += fduration; } p->moveStartTime = start; p->moveDuration = duration; i++; } mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectiveWindow; return; } void FoldAnim::stepPolygon (PolygonObject *p, float forwardProgress) { int dir = optValI (AnimationaddonOptions::FoldDir) == 0 ? 1 : -1; int gridSizeX = optValI (AnimationaddonOptions::FoldGridx); int gridSizeY = optValI (AnimationaddonOptions::FoldGridx); float moveProgress = forwardProgress - p->moveStartTime; if (p->moveDuration > 0) moveProgress /= p->moveDuration; if (moveProgress < 0) moveProgress = 0; else if (moveProgress > 1) moveProgress = 1; float const_x = BORDER_W (mWindow) / (float)gridSizeX; // width of single piece float const_y = BORDER_H (mWindow) / (float)gridSizeY; // height of single piece p->rotAngle = dir * moveProgress * p->finalRotAng; if (p->rotAxis.x () == 180) { if (p->finalRelPos.y () == gridSizeY - 2) { // it means the last row p->centerPos.setY ( p->centerPosStart.y () + const_y / 2.0f - cos (p->rotAngle * M_PI / 180.0f) * const_y / 2.0f); p->centerPos.setZ ( p->centerPosStart.z () + 1.0f / screen->width () * (sin (-p->rotAngle * M_PI / 180.0f) * const_y / 2.0f)); } else { // rows if (fabs (p->rotAngle) < 90) { // 1. rotate 90 p->centerPos.setY ( p->centerPosStart.y () + const_y / 2.0f - cos (p->rotAngle * M_PI / 180.0f) * const_y / 2.0f); p->centerPos.setZ ( p->centerPosStart.z () + 1.0f / screen->width () * (sin (-p->rotAngle * M_PI / 180.0f) * const_y / 2.0f)); } else { // 2. rotate faster 180 float alpha = p->rotAngle - dir * 90; // [0 - 45] float alpha2 = 2 * alpha; // [0 - 90] p->rotAngle = (p->rotAngle - dir * 90) * 2 + dir * 90; p->centerPos.setY ( p->centerPosStart.y () + const_y / 2.0f + const_y - cos (alpha * M_PI / 180.0f) * const_y + dir * sin (alpha2 * M_PI / 180.0f) * const_y / 2.0f); p->centerPos.setZ ( p->centerPosStart.z () + 1.0f / screen->width () * (-sin (alpha * M_PI / 180.0f) * const_y - dir * cos (alpha2 * M_PI / 180.0f) * const_y / 2.0f)); } } } else if (p->rotAxis.y () == -180) { // simple blocks left p->centerPos.setX ( p->centerPosStart.x () + const_x / 2.0f - cos (p->rotAngle * M_PI / 180.0f) * const_x / 2.0f); p->centerPos.setZ ( p->centerPosStart.z () - 1.0f / screen->width () * (sin (p->rotAngle * M_PI / 180.0f) * const_x / 2.0f)); } else if (p->rotAxis.y () == 180) { // simple blocks right p->centerPos.setX ( p->centerPosStart.x () - const_x / 2.0f + cos (-p->rotAngle * M_PI / 180.0f) * const_x / 2.0f); p->centerPos.setZ ( p->centerPosStart.z () + 1.0f / screen->width () * (sin (-p->rotAngle * M_PI / 180.0f) * const_x / 2.0f)); } } compiz-0.9.11+14.04.20140409/plugins/animationaddon/include/0000755000015301777760000000000012321344021023565 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/animationaddon/include/animationaddon/0000755000015301777760000000000012321344021026552 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/animationaddon/include/animationaddon/animationaddon.h0000644000015301777760000002501112321343002031705 0ustar pbusernogroup00000000000000#ifndef _COMPIZ_ANIMATIONADDON_H #define _COMPIZ_ANIMATIONADDON_H #define ANIMATIONADDON_ABI 20091206 #include #include #include using namespace::std; class PrivateAnimAddonScreen; class AnimAddonScreen : public PluginClassHandler, public CompOption::Class { public: AnimAddonScreen (CompScreen *); ~AnimAddonScreen (); CompOption::Vector &getOptions (); bool setOption (const CompString &name, CompOption::Value &value); int getIntenseTimeStep (); private: PrivateAnimAddonScreen *priv; }; /// Base class for all polygon- and particle-based animations class BaseAddonAnim : virtual public Animation { public: BaseAddonAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~BaseAddonAnim () {} bool needsDepthTest () { return mDoDepthTest; } protected: /// Gets info about the extension plugin that implements this animation. ExtensionPluginInfo *getExtensionPluginInfo (); int mIntenseTimeStep; CompositeScreen *mCScreen; GLScreen *mGScreen; bool mDoDepthTest; ///< Whether depth testing should be used in the effect }; // Particle stuff class Particle { public: Particle () : life (0.0f) {} float life; ///< particle life float fade; ///< fade speed float width; ///< particle width float height; ///< particle height float w_mod; ///< particle size modification during life float h_mod; ///< particle size modification during life float r; ///< red value float g; ///< green value float b; ///< blue value float a; ///< alpha value float x; ///< X position float y; ///< Y position float z; ///< Z position float xi; ///< X direction float yi; ///< Y direction float zi; ///< Z direction float xg; ///< X gravity float yg; ///< Y gravity float zg; ///< Z gravity float xo; ///< orginal X position float yo; ///< orginal Y position float zo; ///< orginal Z position }; class ParticleSystem { friend class ParticleAnim; public: ParticleSystem (int numParticles, float slowdown, float darkenAmount, GLuint blendMode); ~ParticleSystem (); void draw (int offsetX = 0, int offsetY = 0); void update (float time); vector &particles () { return mParticles; } void activate () { mActive = true; } bool active () { return mActive; } void setOrigin (int x, int y) { mX = x; mY = y; } protected: CompWindow *mWindow; vector mParticles; float mSlowDown; float mDarkenAmount; GLuint mBlendMode; GLuint mTex; bool mActive; int mX, mY; GLScreen *mGScreen; vector mVerticesCache; vector mCoordsCache; vector mColorsCache; vector mDColorsCache; }; class ParticleAnim : public BaseAddonAnim, public PartialWindowAnim { public: ParticleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~ParticleAnim () {} void postPaintWindow (); bool postPaintWindowUsed () { return true; } void updateBB (CompOutput &output); bool updateBBUsed () { return true; } bool prePreparePaint (int msSinceLastPaint); void initLightDarkParticles (int numLightParticles, int numDarkParticles, float lightSlowDown, float darkSlowDown); protected: boost::ptr_vector mParticleSystems; }; // Polygon stuff typedef enum { CorrectPerspectiveNone = 0, CorrectPerspectivePolygon, CorrectPerspectiveWindow } CorrectPerspective; /// Base class for per-PolygonObject effect parameter classes class PolygonEffectParameters { }; /// This is intended to be a closed 3D piece of a window with convex polygon /// faces and quad-strip sides. Since decoration texture is separate from /// the window texture, it is more complicated than it would be with a single /// texture: we use glClipPlane with the rectangles (clips) to clip 3D space /// to the region falling within that clip. /// If the polygon is on an edge/corner, it also has 2D shadow quad(s) /// (to be faded out at the beginning of 3D animation if necessary). class PolygonObject { public: int nVertices; ///< number of total vertices (front + back) int nSides; ///< number of sides GLfloat *vertices; ///< Positions of vertices relative to center GLushort *sideIndices; ///< Indices of quad strip for "sides" GLfloat *normals; ///< Surface normals for 2+nSides faces Boxf boundingBox; ///< Bound. box to test intersection with clips // Animation effect parameters Point3d centerPosStart; ///< Starting position of center float rotAngleStart; ///< Starting rotation angle Point3d centerPos; ///< Position of center Vector3d rotAxis; ///< Rotation axis vector float rotAngle; ///< Rotation angle Point3d rotAxisOffset; ///< Rotation axis translate amount Point centerRelPos; ///< Relative pos of center within the window Vector3d finalRelPos; ///< Velocity factor for scripted movement float finalRotAng; ///< Final rotation angle around rotAxis float moveStartTime; ///< Movement starts at this time ([0-1] range) float moveDuration; ///< Movement lasts this long ([0-1] range) float fadeStartTime; ///< Fade out starts at this time ([0,1] range) float fadeDuration; ///< Duration of fade out ([0,1] range) /** Pointer to a struct that can contain custom parameters for an individual effect */ PolygonEffectParameters *effectParameters; float boundSphereRadius; ///< Radius of bounding sphere }; /// Info about intersection of a polygon and clip class PolygonClipInfo { public: PolygonClipInfo (const PolygonObject *p); const PolygonObject *p; ///< the intersecting polygon-object /// Texture coord.s for each vertex of the polygon-object /// ordered as: Front v1.x, y, v2.x, y, ..., /// followed by back vertex texture coordinates. vector vertexTexCoords; }; class Clip4Polygons ///< Rectangular clips { ///< (to hold clips passed to AddWindowGeometry) public: CompRect box; ///< Coords Boxf boxf; ///< Float coords (for small clipping adjustment) GLTexture::Matrix texMatrix;///< Corresponding texture coord. matrix /// True if this clip likely intersects all polygons /// (for the window-contents clip). Used for optimization purposes. bool intersectsMostPolygons; /// For polygons that intersect this clip. /// Only used when intersectsMostPolygons is false. list intersectingPolygonInfos; /// Texture coord.s for each vertex of each polygon-object /// ordered as: Front p1.v1.x, y, p1.v2.x, .y, p2.v1.x, .y, ..., /// followed by back vertex texture coordinates. /// Only used when intersectsMostPolygons is true. vector polygonVertexTexCoords; }; class PolygonAnim : virtual public Animation, public BaseAddonAnim { public: PolygonAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~PolygonAnim (); void step (); void prePaintWindow (); void postPaintWindow (); bool postPaintWindowUsed () { return true; } void addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clipRegion, unsigned int maxGridWidth, unsigned int maxGridHeight); void drawGeometry (); virtual void updateBB (CompOutput &output); bool updateBBUsed () { return true; } bool prePreparePaint (int msSinceLastPaint); bool moveUpdate (int dx, int dy); virtual void stepPolygon (PolygonObject *p, float forwardProgress); virtual void transformPolygon (const PolygonObject *p) {} /// For effects that have decel. motion virtual bool deceleratingMotion () { return false; } bool tessellateIntoRectangles (int gridSizeX, int gridSizeY, float thickness); bool tessellateIntoHexagons (int gridSizeX, int gridSizeY, float thickness); bool tessellateIntoGlass (int gridSizeX, int gridSizeY, float thickness); void prePaintOutput (CompOutput *output); void deceleratingAnimStepPolygon (PolygonObject *p, float forwardProgress); protected: void getPerspectiveCorrectionMat (const PolygonObject *p, GLfloat *mat, GLMatrix *matf, const CompOutput &output); void processIntersectingPolygons (); virtual void freePolygonObjects (); void freeClipsPolygons (); void prepareDrawingForAttrib (GLFragment::Attrib &attrib); int mNumDrawGeometryCalls; int mNumClipsPassed; /**< # of clips passed to animAddWindowGeometry so far in this draw step */ bool mClipsUpdated; ///< whether stored clips are updated in this anim step vector mClips;///< Rect. clips collected in addGeometries int mFirstNondrawnClip; vector mLastClipInGroup;/**< Index of the last clip in each group of clips drawn in drawGeometry func. */ bool mDoLighting; ///< Whether lighting should be used in the effect CorrectPerspective mCorrectPerspective; vector mPolygons; ///< The polygons in this set float mThickness; ///< Window thickness (depth along z axis) int mNumTotalFrontVertices; ///< Total # of polygon vertices on front faces float mBackAndSidesFadeDur; ///< How long side and back faces should fade in/out float mAllFadeDuration; /**< Duration of fade out at the end in [0,1] range when all polygons fade out at the same time. If >-1, this overrides fadeDuration in PolygonObject */ bool mIncludeShadows; ///< Whether to include shadows in polygon private: inline void drawPolygonClipIntersection (const PolygonObject *p, const Clip4Polygons &c, const GLfloat *vertexTexCoords, int pass, float forwardProgress, GLdouble clipPlane[4][4], const CompOutput &output, float newOpacity, bool decelerates, GLfloat skewMat[16]); }; #endif compiz-0.9.11+14.04.20140409/plugins/trip/0000755000015301777760000000000012321344021020133 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/trip/trip.xml.in0000644000015301777760000000575712321343002022254 0ustar pbusernogroup00000000000000 <_short>Trip <_long>Trips out desktops Effects composite opengl cube decor opengl <_short>Bindings <_short>General <_short>Effect Settings <_short>Internal Settings compiz-0.9.11+14.04.20140409/plugins/trip/CMakeLists.txt0000644000015301777760000000015112321343002022666 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (trip PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/trip/src/0000755000015301777760000000000012321344021020722 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/trip/src/trip.h0000644000015301777760000000673212321343002022057 0ustar pbusernogroup00000000000000/* * * Compiz trip plugin * * trip.h * * Copyright : (C) 2010 by Scott Moreau * E-mail : oreaus@gmail.com * * Based off the mag plugin by : * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * */ #include #include #include #include #include "trip_options.h" #define TRIP_SCREEN(s) \ TripScreen *ts = TripScreen::get (s) class Ripple; class TripScreen : public PluginClassHandler , public TripOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: TripScreen (CompScreen *screen); ~TripScreen (); CompositeScreen *cScreen; GLScreen *gScreen; std::vector ripples; GLuint texture; GLenum target; GLuint program; bool quiet; unsigned int intensity; bool checkStateTimeout (); void preparePaint (int ms); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void donePaint (); void cleanup (); bool loadFragmentProgram (); void optionChanged (CompOption *opt, Options num); void positionUpdate (const CompPoint &pos); int adjustZoom (float chunk, Ripple &r); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); bool takeHit (CompAction *action, CompAction::State state, CompOption::Vector options); bool untensify (CompAction *action, CompAction::State state, CompOption::Vector options); bool intensify (CompAction *action, CompAction::State state, CompOption::Vector options); bool soberUp (CompAction *action, CompAction::State state, CompOption::Vector options); void populateRippleSet (); }; class Ripple { public: Ripple (); ~Ripple (); TripScreen *dScreen; int radius; int rMod; CompPoint coord; int duration; int timer; int width; int height; GLfloat zVelocity; GLfloat zTarget; GLfloat zoom; bool adjust; CompRect damageRect; void paint (); void spawnRandom (); }; class TripPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; static const char *rippleFpString = "!!ARBfp1.0" "PARAM p0 = program.env[0];" "PARAM p1 = program.env[1];" "PARAM p2 = program.env[2];" "TEMP t0, t1, t2, t3;" "SUB t1, p0.xyww, fragment.texcoord[0];" "DP3 t2, t1, t1;" "RSQ t2, t2.x;" "SUB t0, t2, p0;" "RCP t3, t2.x;" "MAD t3, t3, p1.z, p2.z;" "COS t3, t3.x;" "MUL t3, t3, p1.w;" "MUL t1, t2, t1;" "MAD t1, t1, t3, fragment.texcoord[0];" "CMP t1, t0.z, fragment.texcoord[0], t1;" "MAD t1, t1, p1, p2;" "TEX result.color, t1, texture[0], %s;" "END"; compiz-0.9.11+14.04.20140409/plugins/trip/src/trip.cpp0000644000015301777760000003162512321343002022411 0ustar pbusernogroup00000000000000/* * * Compiz trip plugin * * trip.cpp * * Copyright : (C) 2010 by Scott Moreau * E-mail : oreaus@gmail.com * * Based off the mag plugin by : * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.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. * */ #include "trip.h" COMPIZ_PLUGIN_20090315 (trip, TripPluginVTable); void TripScreen::cleanup () { if (program) { GL::deletePrograms (1, &program); program = 0; } } bool TripScreen::loadFragmentProgram () { char buffer[1024]; GLsizei bufSize; GLint errorPos; if (!GL::fragmentProgram) return false; if (target == GL_TEXTURE_2D) sprintf (buffer, rippleFpString, "2D"); else sprintf (buffer, rippleFpString, "RECT"); /* clear errors */ glGetError (); if (!program) GL::genPrograms (1, &program); bufSize = (GLsizei) strlen (buffer); GL::bindProgram (GL_FRAGMENT_PROGRAM_ARB, program); GL::programString (GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, bufSize, buffer); glGetIntegerv (GL_PROGRAM_ERROR_POSITION_ARB, &errorPos); if (glGetError () != GL_NO_ERROR || errorPos != -1) { compLogMessage ("trip", CompLogLevelError, "failed to load fragment program"); GL::deletePrograms (1, &program); program = 0; return false; } GL::bindProgram (GL_FRAGMENT_PROGRAM_ARB, 0); return true; } void TripScreen::optionChanged (CompOption *opt, Options num) { cleanup (); loadFragmentProgram (); quiet = true; cScreen->damageScreen (); } int TripScreen::adjustZoom (float chunk, Ripple &r) { float dx, adjust, amount; float change; dx = r.zTarget - r.zoom; adjust = dx * 0.15f; amount = fabs(dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; r.zVelocity = (amount * r.zVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.002f && fabs (r.zVelocity) < 0.004f) { r.zVelocity = 0.0f; r.zoom = r.zTarget; return false; } change = r.zVelocity * chunk; if (!change) { if (r.zVelocity) change = (dx > 0) ? 0.01 : -0.01; } r.zoom += change; return true; } void TripScreen::preparePaint (int time) { /* Be careful not to allow too much intensity. * Otherwise, we might have a bad trip ;-) */ if (intensity > 70) intensity = 70; for (unsigned int i = 0; i < ripples.size (); i++) { int steps; float amount, chunk; amount = time * 0.35f * optionGetSpeed (); steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float) steps; while (steps--) { ripples.at (i).adjust = adjustZoom (chunk, ripples.at (i)); if (ripples.at (i).adjust) break; } TRIP_SCREEN (screen); /* Compute a 0.0 - 1.0 representation of the animation timeline */ float progress = (float) (ripples.at (i).duration - ripples.at (i).timer) / (float) ripples.at (i).duration; if (progress <= 0.5f) { ripples.at (i).timer -= (ts->quiet ? (time * 2) : (time / 4)); ripples.at (i).zTarget = (MIN (10.0, (progress * 2) * 10.0)) + 1.0; } else { ripples.at (i).timer -= (ts->quiet ? (time * 3) : (time / 5)); ripples.at (i).zTarget = (MIN (10.0, (2.0 - (progress * 2)) * 10.0)) + 1.0; } if (ts->quiet) { intensity *= 0.8; if (ripples.at (i).timer > 8000) ripples.at (i).timer *= 0.8; } ripples.at (i).zTarget *= (intensity * 0.01); ripples.at (i).radius += ripples.at (i).rMod; } cScreen->preparePaint (time); cScreen->damageScreen (); } void TripScreen::donePaint () { glEnable (target); glBindTexture (target, texture); glTexImage2D (target, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); glBindTexture (target, 0); glDisable (target); for (unsigned int i = 0; i < ripples.size (); i++) { ripples.at (i).width = 0; ripples.at (i).height = 0; if (ripples.at (i).zoom <= 1.0) { if (!quiet) ripples.at (i). spawnRandom (); else ripples.erase (ripples.begin () + i); } } if (ripples.empty ()) { ripples.clear (); cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); } cScreen->damageScreen (); cScreen->donePaint (); } void Ripple::paint () { TRIP_SCREEN (screen); float pw, ph; float fZoom, base; int x1, x2, y1, y2; float vc[4]; int size; width = height = 0; base = 0.5 + (0.0015 * radius); fZoom = (zoom * base) + 1.0 - base; size = radius + 1; x1 = MAX (0.0, coord.x () - size); x2 = MIN (screen->width (), coord.x () + size); y1 = MAX (0.0, coord.y () - size); y2 = MIN (screen->height (), coord.y () + size); glEnable (ts->target); glBindTexture (ts->target, ts->texture); if (width != 2 * size || height != 2 * size) { glCopyTexImage2D(ts->target, 0, GL_RGB, x1, screen->height () - y2, size * 2, size * 2, 0); width = height = 2 * size; } else glCopyTexSubImage2D (ts->target, 0, 0, 0, x1, screen->height () - y2, x2 - x1, y2 - y1); if (ts->target == GL_TEXTURE_2D) { pw = 1.0 / width; ph = 1.0 / height; } else { pw = 1.0; ph = 1.0; } glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glColor4usv (defaultColor); glEnable (GL_FRAGMENT_PROGRAM_ARB); GL::bindProgram (GL_FRAGMENT_PROGRAM_ARB, ts->program); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, 0, coord.x (), screen->height () - coord.y (), 1.0 / radius, 0.0f); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, 1, pw, ph, M_PI / radius, (fZoom - 1.0) * fZoom); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, 2, -x1 * pw, -(screen->height () - y2) * ph, -M_PI / 2.0, 0.0); x1 = MAX (0.0, coord.x () - radius); x2 = MIN (screen->width (), coord.x () + radius); y1 = MAX (0.0, coord.y () - radius); y2 = MIN (screen->height (), coord.y () + radius); vc[0] = ((x1 * 2.0) / screen->width ()) - 1.0; vc[1] = ((x2 * 2.0) / screen->width ()) - 1.0; vc[2] = ((y1 * -2.0) / screen->height ()) + 1.0; vc[3] = ((y2 * -2.0) / screen->height ()) + 1.0; y1 = screen->height () - y1; y2 = screen->height () - y2; glBegin (GL_QUADS); glTexCoord2f (x1, y1); glVertex2f (vc[0], vc[2]); glTexCoord2f (x1, y2); glVertex2f (vc[0], vc[3]); glTexCoord2f (x2, y2); glVertex2f (vc[1], vc[3]); glTexCoord2f (x2, y1); glVertex2f (vc[1], vc[2]); glEnd (); glDisable (GL_FRAGMENT_PROGRAM_ARB); glColor4usv (defaultColor); glPopMatrix(); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glBindTexture (ts->target, 0); glDisable (ts->target); } bool TripScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (ripples.empty ()) return status; /* Temporarily set the viewport to fullscreen */ glViewport (0, 0, screen->width (), screen->height ()); for (unsigned int i = 0; i < ripples.size (); i++) ripples.at (i).paint (); gScreen->setDefaultViewport (); return status; } void Ripple::spawnRandom () { TRIP_SCREEN (screen); ts->cleanup (); ts->loadFragmentProgram (); radius = MAX (100, (rand () % ts->optionGetMaxRadius ())); zoom = 1.0f; rMod = (rand () % 3); coord.setX (rand () % screen->width ()); coord.setY (rand () % screen->height ()); width = 0; height = 0; int x, y, w, h; x = MAX (0.0, coord.x () - radius); y = MAX (0.0, coord.y () - radius); w = MIN (screen->width (), coord.x () + radius) - x; h = MIN (screen->height (), coord.y () + radius) - y; damageRect.setGeometry (x, y, w, h); zTarget = MAX (1.0, MIN (10.0, (rand () % 10))); duration = MAX(3000, (rand () % (ts->optionGetMaxDuration () * 1000))); timer = duration; adjust = true; } void TripScreen::populateRippleSet () { ripples.clear (); intensity = 30; for (int i = 0; i < optionGetMaxRipples (); i++) { ripples.push_back (Ripple ()); ripples.at (i). spawnRandom (); } } bool TripScreen::takeHit (CompAction *action, CompAction::State state, CompOption::Vector options) { intensity += 5; if (quiet) populateRippleSet (); quiet = false; /* Trip mode starting */ cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); return true; } bool TripScreen::untensify (CompAction *action, CompAction::State state, CompOption::Vector options) { intensity -= 5; if (intensity < 15) quiet = true; return true; } bool TripScreen::intensify (CompAction *action, CompAction::State state, CompOption::Vector options) { intensity += 2; cScreen->damageScreen (); if (quiet) populateRippleSet (); quiet = false; /* Trip mode starting */ cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); return true; } bool TripScreen::soberUp (CompAction *action, CompAction::State state, CompOption::Vector options) { /* Time to end ripples quickly */ quiet = true; intensity -= 5; cScreen->damageScreen (); return true; } TripScreen::TripScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), program (0), quiet (false), intensity (25) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); glGenTextures (1, &texture); if (GL::textureNonPowerOfTwo) target = GL_TEXTURE_2D; else target = GL_TEXTURE_RECTANGLE_ARB; glEnable (target); /* Bind the texture */ glBindTexture (target, texture); /* Load the parameters */ glTexParameteri (target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (target, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri (target, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexImage2D (target, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); glBindTexture (target, 0); glDisable (target); optionSetMaxRadiusNotify (boost::bind (&TripScreen::optionChanged, this, _1, _2)); optionSetMaxRipplesNotify (boost::bind (&TripScreen::optionChanged, this, _1, _2)); optionSetMaxDurationNotify (boost::bind (&TripScreen::optionChanged, this, _1, _2)); optionSetZoomFactorNotify (boost::bind (&TripScreen::optionChanged, this, _1, _2)); optionSetSpeedNotify (boost::bind (&TripScreen::optionChanged, this, _1, _2)); optionSetTimestepNotify (boost::bind (&TripScreen::optionChanged, this, _1, _2)); optionSetTakeHitInitiate (boost::bind (&TripScreen::takeHit, this, _1, _2, _3)); optionSetDecreaseIntensityInitiate (boost::bind (&TripScreen::untensify, this, _1, _2, _3)); optionSetIncreaseIntensityInitiate (boost::bind (&TripScreen::intensify, this, _1, _2, _3)); optionSetSoberKeyInitiate (boost::bind (&TripScreen::soberUp, this, _1, _2, _3)); optionSetSoberButtonInitiate (boost::bind (&TripScreen::soberUp, this, _1, _2, _3)); populateRippleSet (); if (!GL::fragmentProgram || !loadFragmentProgram ()) compLogMessage ("trip", CompLogLevelWarn, "GL_ARB_fragment_program not supported. " "This plugin will not work."); } TripScreen::~TripScreen () { cScreen->damageScreen (); glDeleteTextures (1, &target); ripples.clear (); } Ripple::Ripple () : dScreen (TripScreen::get (screen)) radius (0), rMod (0), duration (0), timer (0), width (0), height (0), adjust (false) { } Ripple::~Ripple () { } bool TripPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/move/0000755000015301777760000000000012321344021020123 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/move/move.xml.in0000644000015301777760000000502412321343002022217 0ustar pbusernogroup00000000000000 <_short>Move Window <_long>Move your windows around Window Management composite opengl decor compiz-0.9.11+14.04.20140409/plugins/move/CMakeLists.txt0000644000015301777760000000014712321343002022663 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(move PLUGINDEPS composite opengl)compiz-0.9.11+14.04.20140409/plugins/move/src/0000755000015301777760000000000012321344021020712 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/move/src/move.h0000644000015301777760000000644012321343002022033 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "move_options.h" #include #include #include #include #include #define NUM_KEYS (sizeof (mKeys) / sizeof (mKeys[0])) struct _MoveKeys { const char *name; int dx; int dy; } mKeys[] = { { "Left", -1, 0 }, { "Right", 1, 0 }, { "Up", 0, -1 }, { "Down", 0, 1 } }; class MoveScreen : public ScreenInterface, public CompositeScreenInterface, public PluginClassHandler, public MoveOptions { public: MoveScreen (CompScreen *screen); ~MoveScreen (); CompositeScreen *cScreen; void updateOpacity (); void handleEvent (XEvent *); bool registerPaintHandler (compiz::composite::PaintHandler *pHnd); void unregisterPaintHandler (); CompWindow *w; int savedX; int savedY; int x; int y; Region region; int status; KeyCode key[NUM_KEYS]; int releaseButton; GLushort moveOpacity; CompScreen::GrabHandle grab; Cursor moveCursor; unsigned int origState; int snapOffX; int snapBackX; int snapOffY; int snapBackY; bool hasCompositing; bool yConstrained; }; class MoveWindow : public GLWindowInterface, public PluginClassHandler { public: MoveWindow (CompWindow *window) : PluginClassHandler (window), window (window), gWindow (GLWindow::get (window)), cWindow (CompositeWindow::get (window)) { if (gWindow) GLWindowInterface::setHandler (gWindow, false); }; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); CompWindow *window; GLWindow *gWindow; CompositeWindow *cWindow; compiz::window::configure_buffers::Releasable::Ptr releasable; }; #define MOVE_SCREEN(s) \ MoveScreen *ms = MoveScreen::get (s) #define MOVE_WINDOW(w) \ MoveWindow *mw = MoveWindow::get (w) class MovePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/move/src/move.cpp0000644000015301777760000004501312321343002022365 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include "move.h" COMPIZ_PLUGIN_20090315 (move, MovePluginVTable) static bool moveInitiate (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; MOVE_SCREEN (screen); Window xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findWindow (xid); if (w && (w->actions () & CompWindowActionMoveMask)) { CompScreen *s = screen; if (s->otherGrabExist ("move", NULL) || ms->w || w->overrideRedirect () || w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask | CompWindowTypeFullscreenMask)) return false; unsigned int mods = CompOption::getIntOptionNamed (options, "modifiers", 0); int x = CompOption::getIntOptionNamed (options, "x", w->geometry ().x () + (w->size ().width () / 2)); int y = CompOption::getIntOptionNamed (options, "y", w->geometry ().y () + (w->size ().height () / 2)); int button = CompOption::getIntOptionNamed (options, "button", -1); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (ms->region) { XDestroyRegion (ms->region); ms->region = NULL; } ms->status = RectangleOut; ms->savedX = w->serverGeometry ().x (); ms->savedY = w->serverGeometry ().y (); ms->x = 0; ms->y = 0; lastPointerX = x; lastPointerY = y; bool sourceExternalApp = CompOption::getBoolOptionNamed (options, "external", false); ms->yConstrained = sourceExternalApp && ms->optionGetConstrainY (); ms->origState = w->state (); CompRect workArea (s->getWorkareaForOutput (w->outputDevice ())); ms->snapBackX = w->serverGeometry ().x () - workArea.x (); ms->snapOffX = x - workArea.x (); ms->snapBackY = w->serverGeometry ().y () - workArea.y (); ms->snapOffY = y - workArea.y (); if (!ms->grab) ms->grab = s->pushGrab (ms->moveCursor, "move"); if (ms->grab) { unsigned int grabMask = CompWindowGrabMoveMask | CompWindowGrabButtonMask; if (sourceExternalApp) grabMask |= CompWindowGrabExternalAppMask; ms->w = w; ms->releaseButton = button; w->grabNotify (x, y, mods, grabMask); /* Click raise happens implicitly on buttons 1, 2 and 3 so don't * restack this window again if the action buttonbinding was from * one of those buttons */ if (screen->getOption ("raise_on_click")->value ().b () && button != Button1 && button != Button2 && button != Button3) w->updateAttributes (CompStackingUpdateModeAboveFullscreen); if (state & CompAction::StateInitKey) { int xRoot = w->geometry ().x () + (w->size ().width () / 2); int yRoot = w->geometry ().y () + (w->size ().height () / 2); s->warpPointer (xRoot - pointerX, yRoot - pointerY); } if (ms->moveOpacity != OPAQUE) { MOVE_WINDOW (w); if (mw->cWindow) mw->cWindow->addDamage (); if (mw->gWindow) mw->gWindow->glPaintSetEnabled (mw, true); } if (ms->optionGetLazyPositioning ()) { MOVE_WINDOW (w); if (mw->gWindow) mw->releasable = w->obtainLockOnConfigureRequests (); } } } return false; } static bool moveTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { MOVE_SCREEN (screen); if (ms->w) { MOVE_WINDOW (ms->w); if (state & CompAction::StateCancel) ms->w->move (ms->savedX - ms->w->geometry ().x (), ms->savedY - ms->w->geometry ().y (), false); /* update window attributes as window constraints may have changed - needed e.g. if a maximized window was moved to another output device */ ms->w->updateAttributes (CompStackingUpdateModeNone); ms->w->ungrabNotify (); if (ms->grab) { screen->removeGrab (ms->grab, NULL); ms->grab = NULL; } if (ms->moveOpacity != OPAQUE) { if (mw->cWindow) mw->cWindow->addDamage (); if (mw->gWindow) mw->gWindow->glPaintSetEnabled (mw, false); } mw->releasable.reset (); ms->w = 0; ms->releaseButton = 0; } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } /* creates a region containing top and bottom struts. only struts that are outside the screen workarea are considered. */ static Region moveGetYConstrainRegion (CompScreen *s) { CompWindow *w; REGION r; CompRect workArea; BoxRec extents; Region region = XCreateRegion (); if (!region) return NULL; r.rects = &r.extents; r.numRects = r.size = 1; r.extents.x1 = MINSHORT; r.extents.y1 = 0; r.extents.x2 = 0; r.extents.y2 = s->height (); XUnionRegion (&r, region, region); r.extents.x1 = s->width (); r.extents.x2 = MAXSHORT; XUnionRegion (&r, region, region); for (unsigned int i = 0; i < s->outputDevs ().size (); i++) { XUnionRegion (s->outputDevs ()[i].region (), region, region); workArea = s->getWorkareaForOutput (i); extents = s->outputDevs ()[i].region ()->extents; foreach (w, s->windows ()) { if (!w->mapNum ()) continue; if (w->struts ()) { r.extents.x1 = w->struts ()->top.x; r.extents.y1 = w->struts ()->top.y; r.extents.x2 = r.extents.x1 + w->struts ()->top.width; r.extents.y2 = r.extents.y1 + w->struts ()->top.height; if (r.extents.x1 < extents.x1) r.extents.x1 = extents.x1; if (r.extents.x2 > extents.x2) r.extents.x2 = extents.x2; if (r.extents.y1 < extents.y1) r.extents.y1 = extents.y1; if (r.extents.y2 > extents.y2) r.extents.y2 = extents.y2; if (r.extents.x1 < r.extents.x2 && r.extents.y1 < r.extents.y2 && r.extents.y2 <= workArea.y ()) XSubtractRegion (region, &r, region); r.extents.x1 = w->struts ()->bottom.x; r.extents.y1 = w->struts ()->bottom.y; r.extents.x2 = r.extents.x1 + w->struts ()->bottom.width; r.extents.y2 = r.extents.y1 + w->struts ()->bottom.height; if (r.extents.x1 < extents.x1) r.extents.x1 = extents.x1; if (r.extents.x2 > extents.x2) r.extents.x2 = extents.x2; if (r.extents.y1 < extents.y1) r.extents.y1 = extents.y1; if (r.extents.y2 > extents.y2) r.extents.y2 = extents.y2; if (r.extents.x1 < r.extents.x2 && r.extents.y1 < r.extents.y2 && r.extents.y1 >= workArea.bottom ()) XSubtractRegion (region, &r, region); } } } return region; } static void moveHandleMotionEvent (CompScreen *s, int xRoot, int yRoot) { MOVE_SCREEN (s); if (ms->grab) { int dx, dy; CompWindow *w; w = ms->w; int wX = w->geometry ().x (); int wY = w->geometry ().y (); int wWidth = w->geometry ().widthIncBorders (); int wHeight = w->geometry ().heightIncBorders (); ms->x += xRoot - lastPointerX; ms->y += yRoot - lastPointerY; if (w->type () & CompWindowTypeFullscreenMask) dx = dy = 0; else { int min, max; dx = ms->x; dy = ms->y; CompRect workArea = s->getWorkareaForOutput (w->outputDevice ()); if (ms->yConstrained) { if (!ms->region) ms->region = moveGetYConstrainRegion (s); /* make sure that the top border extents or the top row of pixels are within what is currently our valid screen region */ if (ms->region) { int x = wX + dx - w->border ().left; int y = wY + dy - w->border ().top; int width = wWidth + w->border ().left + w->border ().right; int height = w->border ().top ? w->border ().top : 1; int status = XRectInRegion (ms->region, x, y, (unsigned int) width, (unsigned int) height); /* only constrain movement if previous position was valid */ if (ms->status == RectangleIn) { int xStatus = status; while (dx && xStatus != RectangleIn) { xStatus = XRectInRegion (ms->region, x, y - dy, (unsigned int) width, (unsigned int) height); if (xStatus != RectangleIn) dx += (dx < 0) ? 1 : -1; x = wX + dx - w->border ().left; } while (dy && status != RectangleIn) { status = XRectInRegion (ms->region, x, y, (unsigned int) width, (unsigned int) height); if (status != RectangleIn) dy += (dy < 0) ? 1 : -1; y = wY + dy - w->border ().top; } } else ms->status = status; } } if (ms->optionGetSnapoffSemimaximized ()) { int snapoffDistance = ms->optionGetSnapoffDistance (); int snapbackDistance = ms->optionGetSnapbackDistance (); if (w->state () & CompWindowStateMaximizedVertMask) { if (abs (yRoot - workArea.y () - ms->snapOffY) >= snapoffDistance) { if (!s->otherGrabExist ("move", NULL)) { int width = w->serverGeometry ().width (); if (w->saveMask () & CWWidth) width = w->saveWc ().width; ms->x = ms->y = 0; /* Get a lock on configure requests so that we can make * any movement here atomic */ compiz::window::configure_buffers::ReleasablePtr lock (w->obtainLockOnConfigureRequests ()); w->maximize (0); XWindowChanges xwc; xwc.x = xRoot - (width / 2); xwc.y = yRoot + w->border ().top / 2; w->configureXWindow (CWX | CWY, &xwc); ms->snapOffY = ms->snapBackY; return; } } } else if (ms->origState & CompWindowStateMaximizedVertMask && ms->optionGetSnapbackSemimaximized ()) { if (abs (yRoot - workArea.y () - ms->snapBackY) < snapbackDistance) { if (!s->otherGrabExist ("move", NULL)) { w->maximize (ms->origState); s->warpPointer (0, -snapbackDistance); return; } } } else if (w->state () & CompWindowStateMaximizedHorzMask) { if (abs (xRoot - workArea.x () - ms->snapOffX) >= snapoffDistance) { if (!s->otherGrabExist ("move", NULL)) { int width = w->serverGeometry ().width (); w->saveMask () |= CWX | CWY; if (w->saveMask () & CWWidth) width = w->saveWc ().width; /* Get a lock on configure requests so that we can make * any movement here atomic */ compiz::window::configure_buffers::ReleasablePtr lock (w->obtainLockOnConfigureRequests ()); w->maximize (0); XWindowChanges xwc; xwc.x = xRoot - (width / 2); xwc.y = yRoot + w->border ().top / 2; w->configureXWindow (CWX | CWY, &xwc); ms->snapOffX = ms->snapBackX; return; } } } else if (ms->origState & CompWindowStateMaximizedHorzMask && ms->optionGetSnapbackSemimaximized ()) { /* TODO: Snapping back horizontally just works for the left side * of the screen for now */ if (abs (xRoot - workArea.x () - ms->snapBackX) < snapbackDistance) { if (!s->otherGrabExist ("move", NULL)) { w->maximize (ms->origState); /* TODO: Here we should warp the pointer back, but this somehow interrupts * the horizontal maximizing, we should fix it and reenable this warp: * s->warpPointer (workArea.width () / 2 - snapbackDistance, 0); */ return; } } } } if (w->state () & CompWindowStateMaximizedVertMask) { min = workArea.y () + w->border ().top; max = workArea.bottom () - w->border ().bottom - wHeight; if (wY + dy < min) dy = min - wY; else if (wY + dy > max) dy = max - wY; } if (w->state () & CompWindowStateMaximizedHorzMask) { if (wX > (int) s->width () || wX + w->size ().width () < 0 || wX + wWidth < 0) return; min = workArea.x () + w->border ().left; max = workArea.right () - w->border ().right - wWidth; if (wX + dx < min) dx = min - wX; else if (wX + dx > max) dx = max - wX; } } if (dx || dy) { w->move (wX + dx - w->geometry ().x (), wY + dy - w->geometry ().y (), false); ms->x -= dx; ms->y -= dy; } } } void MoveScreen::handleEvent (XEvent *event) { switch (event->type) { case ButtonPress: case ButtonRelease: if (event->xbutton.root == screen->root () && grab && (releaseButton == -1 || releaseButton == (int) event->xbutton.button)) moveTerminate (&optionGetInitiateButton (), CompAction::StateTermButton, noOptions ()); break; case KeyPress: if (event->xkey.root == screen->root () && grab) for (unsigned int i = 0; i < NUM_KEYS; i++) if (event->xkey.keycode == key[i]) { int moveIncrement = optionGetKeyMoveInc (); XWarpPointer (screen->dpy (), None, None, 0, 0, 0, 0, mKeys[i].dx * moveIncrement, mKeys[i].dy * moveIncrement); break; } break; case MotionNotify: if (event->xmotion.root == screen->root ()) moveHandleMotionEvent (screen, pointerX, pointerY); break; case EnterNotify: case LeaveNotify: if (event->xcrossing.root == screen->root ()) moveHandleMotionEvent (screen, pointerX, pointerY); break; case ClientMessage: if (event->xclient.message_type == Atoms::wmMoveResize) { unsigned long type = (unsigned long) event->xclient.data.l[2]; MOVE_SCREEN (screen); if (type == WmMoveResizeMove || type == WmMoveResizeMoveKeyboard) { CompWindow *w; w = screen->findWindow (event->xclient.window); if (w) { CompOption::Vector o; o.push_back (CompOption ("window", CompOption::TypeInt)); o[0].value ().set ((int) event->xclient.window); o.push_back (CompOption ("external", CompOption::TypeBool)); o[1].value ().set (true); if (event->xclient.data.l[2] == WmMoveResizeMoveKeyboard) moveInitiate (&optionGetInitiateKey (), CompAction::StateInitKey, o); /* TODO: not only button 1 */ else if (pointerMods & Button1Mask) { o.push_back (CompOption ("modifiers", CompOption::TypeInt)); o[2].value ().set ((int) pointerMods); o.push_back (CompOption ("x", CompOption::TypeInt)); o[3].value ().set ((int) event->xclient.data.l[0]); o.push_back (CompOption ("y", CompOption::TypeInt)); o[4].value ().set ((int) event->xclient.data.l[1]); o.push_back (CompOption ("button", CompOption::TypeInt)); o[5].value ().set ((int) (event->xclient.data.l[3] ? event->xclient.data.l[3] : -1)); moveInitiate (&optionGetInitiateButton (), CompAction::StateInitButton, o); moveHandleMotionEvent (screen, pointerX, pointerY); } } } else if (ms->w && type == WmMoveResizeCancel && ms->w->id () == event->xclient.window) { moveTerminate (&optionGetInitiateButton (), CompAction::StateCancel, noOptions ()); moveTerminate (&optionGetInitiateKey (), CompAction::StateCancel, noOptions ()); } } break; case DestroyNotify: if (w && w->id () == event->xdestroywindow.window) { moveTerminate (&optionGetInitiateButton (), 0, noOptions ()); moveTerminate (&optionGetInitiateKey (), 0, noOptions ()); } break; case UnmapNotify: if (w && w->id () == event->xunmap.window) { moveTerminate (&optionGetInitiateButton (), 0, noOptions ()); moveTerminate (&optionGetInitiateKey (), 0, noOptions ()); } break; default: break; } screen->handleEvent (event); } bool MoveWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { GLWindowPaintAttrib sAttrib = attrib; MOVE_SCREEN (screen); if (ms->grab && ms->w == window && ms->moveOpacity != OPAQUE) /* modify opacity of windows that are not active */ sAttrib.opacity = (sAttrib.opacity * ms->moveOpacity) >> 16; bool status = gWindow->glPaint (sAttrib, transform, region, mask); return status; } void MoveScreen::updateOpacity () { moveOpacity = (optionGetOpacity () * OPAQUE) / 100; } bool MoveScreen::registerPaintHandler(compiz::composite::PaintHandler *pHnd) { hasCompositing = true; cScreen->registerPaintHandler (pHnd); return true; } void MoveScreen::unregisterPaintHandler() { hasCompositing = false; cScreen->unregisterPaintHandler (); } MoveScreen::MoveScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), w (0), region (NULL), status (RectangleOut), releaseButton (0), grab (NULL), hasCompositing (false), yConstrained (false) { updateOpacity (); for (unsigned int i = 0; i < NUM_KEYS; i++) key[i] = XKeysymToKeycode (screen->dpy (), XStringToKeysym (mKeys[i].name)); moveCursor = XCreateFontCursor (screen->dpy (), XC_fleur); if (cScreen) { CompositeScreenInterface::setHandler (cScreen); hasCompositing = cScreen->compositingActive (); } optionSetOpacityNotify (boost::bind (&MoveScreen::updateOpacity, this)); optionSetInitiateButtonInitiate (moveInitiate); optionSetInitiateButtonTerminate (moveTerminate); optionSetInitiateKeyInitiate (moveInitiate); optionSetInitiateKeyTerminate (moveTerminate); ScreenInterface::setHandler (screen); } MoveScreen::~MoveScreen () { if (region) XDestroyRegion (region); if (moveCursor) XFreeCursor (screen->dpy (), moveCursor); } bool MovePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/ezoom/0000755000015301777760000000000012321344021020306 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/ezoom/ezoom.xml.in0000644000015301777760000002525112321343002022571 0ustar pbusernogroup00000000000000 opengl expo decor mousepoll staticswitcher switcher opengl mousepoll <_short>Enhanced Zoom Desktop <_long>Enhanced zoom functions for the visually impaired and other users Accessibility <_short>Zoom In/Out <_short>Mouse Behaviour <_short>Specific Zoom <_short>Zoom Area Movement <_short>Panning <_short>Fitting <_short>Zoom In/Out <_short>Mouse Behaviour <_short>Zoom Area Movement <_short>Panning <_short>Focus Tracking <_short>Animation compiz-0.9.11+14.04.20140409/plugins/ezoom/CMakeLists.txt0000644000015301777760000000016412321343002023045 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (ezoom PLUGINDEPS composite opengl mousepoll) compiz-0.9.11+14.04.20140409/plugins/ezoom/src/0000755000015301777760000000000012321344021021075 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/ezoom/src/ezoom.h0000644000015301777760000002015712321343002022402 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * Copyright (C) 2007, 2008 Kristian Lyngstøl * * Ported to compiz 0.9 by: * Copyright (C) 2009, Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * * Author(s): * - Original zoom plug-in; David Reveman * - Most features beyond basic zoom; * Kristian Lyngstol * - Sam I suppose? (for the c++) * * Todo: Un-puke the header-file. Five levels of indentation in a .h is a * clear sign that something is horribly wrong. * * Essentially, this needs to be re-done for C++. As is the case of most of * eZoom. * */ #include #include #include #include #include "ezoom_options.h" #include enum SpecificZoomTarget { ZoomTargetFirst = 0, ZoomTargetSecond, ZoomTargetThird }; class EZoomScreen : public PluginClassHandler , public EzoomOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: EZoomScreen (CompScreen *); ~EZoomScreen (); public: CompositeScreen *cScreen; GLScreen *gScreen; public: typedef enum { NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, CENTER } ZoomGravity; typedef enum { NORTH, SOUTH, EAST, WEST } ZoomEdge; class CursorTexture { public: bool isSet; GLuint texture; CompScreen *screen; int width; int height; int hotX; int hotY; public: CursorTexture (); }; /* Stores an actual zoom-setup. This can later be used to store/restore * zoom areas on the fly. * * [xy]Translate and newZoom are target values, and [xy]Translate always * ranges from -0.5 to 0.5. * * currentZoom is actual zoomed value * * real[XY]Translate are the currently used values in the same range as * [xy]Translate, and [xy]trans is adjusted for the zoom level in place. * [xyz]trans should never be modified except in updateActualTranslates() * * viewport is a mask of the viewport, or ~0 for "any". */ class ZoomArea { public: int output; unsigned long int viewport; GLfloat currentZoom; GLfloat newZoom; GLfloat xVelocity; GLfloat yVelocity; GLfloat zVelocity; GLfloat xTranslate; GLfloat yTranslate; GLfloat realXTranslate; GLfloat realYTranslate; GLfloat xtrans; GLfloat ytrans; bool locked; public: ZoomArea (int out); ZoomArea (); void updateActualTranslates (); }; public: std::vector zooms; // list of zooms (different zooms for each output) CompPoint mouse; // we get this from mousepoll unsigned long int grabbed; CompScreen::GrabHandle grabIndex; // for zoomBox time_t lastChange; CursorTexture cursor; // the texture for the faux-cursor // we paint to do fake input // handling bool cursorInfoSelected; bool cursorHidden; CompRect box; CompPoint clickPos; MousePoller pollHandle; // mouse poller object private: bool fixesSupported; int fixesEventBase; int fixesErrorBase; bool canHideCursor; public: void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); void handleEvent (XEvent *); public: int distanceToEdge (int out, EZoomScreen::ZoomEdge edge); bool isInMovement (int out); void adjustZoomVelocity (int out, float chunk); void adjustXYVelocity (int out, float chunk); void drawBox (const GLMatrix &transform, CompOutput *output, CompRect box); void setCenter (int x, int y, bool instant); void setZoomArea (int x, int y, int width, int height, bool instant); void areaToWindow (CompWindow *w); void panZoom (int xvalue, int yvalue); void enableMousePolling (); void setScale (int out, float value); void syncCenterToMouse (); void convertToZoomed (int out, int x, int y, int *resultX, int *resultY); void convertToZoomedTarget (int out, int x, int y, int *resultX, int *resultY); bool ensureVisibility (int x, int y, int margin); void ensureVisibilityArea (int x1, int y1, int x2, int y2, int margin, ZoomGravity gravity); void restrainCursor (int out); void cursorMoved (); void updateMousePosition (const CompPoint &p); void updateMouseInterval (const CompPoint &p); /* Make dtor */ void freeCursor (CursorTexture * cursor); void drawCursor (CompOutput *output, const GLMatrix &transform); void updateCursor (CursorTexture * cursor); void cursorZoomInactive (); void cursorZoomActive (int); public: bool setZoomAreaAction (CompAction *action, CompAction::State state, CompOption::Vector options); bool ensureVisibilityAction (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomBoxActivate (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomBoxDeactivate (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomIn (CompAction *action, CompAction::State state, CompOption::Vector options); bool lockZoomAction (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomSpecific (CompAction *action, CompAction::State state, CompOption::Vector options, SpecificZoomTarget target); bool zoomToWindow (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomPan (CompAction *action, CompAction::State state, CompOption::Vector options, float horizAmount, float vertAmount); bool zoomCenterMouse (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomFitWindowToZoom (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomOut (CompAction *action, CompAction::State state, CompOption::Vector options); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); void focusTrack (XEvent *event); }; #define ZOOM_SCREEN(s) \ EZoomScreen *zs = EZoomScreen::get (s) class ZoomPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/ezoom/src/ezoom.cpp0000644000015301777760000015047412321343002022743 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * Copyright (C) 2007, 2008,2010 Kristian Lyngstøl * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * * Author(s): * - Most features beyond basic zoom; * Kristian Lyngstol * - Original zoom plug-in; David Reveman * - Original port to C++ by Sam Spilsbury * * Description: * * This plug-in offers zoom functionality with focus tracking, * fit-to-window actions, mouse panning, zoom area locking. Without * disabling input. * * Note on actual zoom process * * The animation is done in preparePaintScreen, while instant movements * are done by calling updateActualTranslate () after updating the * translations. This causes [xyz]trans to be re-calculated. We keep track * of each head separately. * * Note on input * * We can not redirect input yet, but this plug-in offers two fundamentally * different approaches to achieve input enabled zoom: * * 1. * Always have the zoomed area be in sync with the mouse cursor. This binds * the zoom area to the mouse position at any given time. It allows using * the original mouse cursor drawn by X, and is technically very safe. * First used in Beryl's inputzoom. * * 2. * Hide the real cursor and draw our own where it would be when zoomed in. * This allows us to navigate with the mouse without constantly moving the * zoom area. This is fairly close to what we want in the end when input * redirection is available. * * This second method has one huge issue, which is bugged XFixes. After * hiding the cursor once with XFixes, some mouse cursors will simply be * invisible. The Firefox loading cursor being one of them. * * An other minor annoyance is that mouse sensitivity seems to increase as * you zoom in, since the mouse isn't really zoomed at all. * * Todo: * - Walk through C++ port and adjust comments for 2010. * - See if anyone misses the filter setting * - Verify XFixes fix... err. * - Different multi head modes */ #include "ezoom.h" COMPIZ_PLUGIN_20090315 (ezoom, ZoomPluginVTable) /* * This toggles paint functions. We don't need to continually run code when we * are not doing anything. */ static inline void toggleFunctions (bool state) { ZOOM_SCREEN (screen); screen->handleEventSetEnabled (zs, state); zs->cScreen->preparePaintSetEnabled (zs, state); zs->gScreen->glPaintOutputSetEnabled (zs, state); zs->cScreen->donePaintSetEnabled (zs, state); } /* Check if the output is valid */ static inline bool outputIsZoomArea (int out) { ZOOM_SCREEN (screen); if (out < 0) return false; else if ((unsigned int) out >= zs->zooms.size ()) zs->zooms.resize (screen->outputDevs ().size ()); return true; } /* Check if zoom is active on the output specified */ static inline bool isActive (int out) { ZOOM_SCREEN (screen); if (!outputIsZoomArea (out)) return false; if (zs->grabbed & (1 << zs->zooms.at (out).output)) return true; return false; } /* Check if we are zoomed out and not going anywhere * (similar to isActive but based on actual zoom, not grab). */ static inline bool isZoomed (int out) { ZOOM_SCREEN (screen); if (!outputIsZoomArea (out)) return false; if (zs->zooms.at (out).currentZoom != 1.0f || zs->zooms.at (out).newZoom != 1.0f || zs->zooms.at (out).zVelocity != 0.0f) return true; return false; } /* Returns the distance to the defined edge in zoomed pixels. */ int EZoomScreen::distanceToEdge (int out, EZoomScreen::ZoomEdge edge) { CompOutput *o = &screen->outputDevs ().at (out); if (!isActive (out)) return 0; int x1, y1, x2, y2; convertToZoomedTarget (out, o->region ()->extents.x2, o->region ()->extents.y2, &x2, &y2); convertToZoomedTarget (out, o->region ()->extents.x1, o->region ()->extents.y1, &x1, &y1); switch (edge) { case WEST: return o->region ()->extents.x1 - x1; case NORTH: return o->region ()->extents.y1 - y1; case EAST: return x2 - o->region ()->extents.x2; case SOUTH: return y2 - o->region ()->extents.y2; } return 0; // Never reached. } /* Update/set translations based on zoom level and real translate. */ void EZoomScreen::ZoomArea::updateActualTranslates () { xtrans = -realXTranslate * (1.0f - currentZoom); ytrans = realYTranslate * (1.0f - currentZoom); } /* Returns true if the head in question is currently moving. * Since we don't always bother resetting everything when * canceling zoom, we check for the condition of being completely * zoomed out and not zooming in/out first. */ bool EZoomScreen::isInMovement (int out) { if (zooms.at (out).currentZoom == 1.0f && zooms.at (out).newZoom == 1.0f && zooms.at (out).zVelocity == 0.0f) return false; if (zooms.at (out).currentZoom != zooms.at (out).newZoom || zooms.at (out).xVelocity || zooms.at (out).yVelocity || zooms.at (out).zVelocity || zooms.at (out).xTranslate != zooms.at (out).realXTranslate || zooms.at (out).yTranslate != zooms.at (out).realYTranslate) return true; return false; } /* Set the initial values of a zoom area. */ EZoomScreen::ZoomArea::ZoomArea (int out) : output (out), viewport (~0), currentZoom (1.0f), newZoom (1.0f), xVelocity (0.0f), yVelocity (0.0f), zVelocity (0.0f), xTranslate (0.0f), yTranslate (0.0f), realXTranslate (0.0f), realYTranslate (0.0f), xtrans (0.0f), ytrans (0.0f), locked (false) { updateActualTranslates (); } EZoomScreen::ZoomArea::ZoomArea () : output (0), viewport (~0), currentZoom (1.0f), newZoom (1.0f), xVelocity (0.0f), yVelocity (0.0f), zVelocity (0.0f), xTranslate (0.0f), yTranslate (0.0f), realXTranslate (0.0f), realYTranslate (0.0f), xtrans (0.0f), ytrans (0.0f), locked (false) { } /* Adjust the velocity in the z-direction. */ void EZoomScreen::adjustZoomVelocity (int out, float chunk) { float d = (zooms.at (out).newZoom - zooms.at (out).currentZoom) * 75.0f; float adjust = d * 0.002f; float amount = fabs (d); if (amount < 1.0f) amount = 1.0f; else if (amount > 5.0f) amount = 5.0f; zooms.at (out).zVelocity = (amount * zooms.at (out).zVelocity + adjust) / (amount + 1.0f); if (fabs (d) < 0.1f && fabs (zooms.at (out).zVelocity) < 0.005f) { zooms.at (out).currentZoom = zooms.at (out).newZoom; zooms.at (out).zVelocity = 0.0f; } else zooms.at (out).currentZoom += (zooms.at (out).zVelocity * chunk) / cScreen->redrawTime (); } /* Adjust the X/Y velocity based on target translation and real * translation. */ void EZoomScreen::adjustXYVelocity (int out, float chunk) { zooms.at (out).xVelocity /= 1.25f; zooms.at (out).yVelocity /= 1.25f; float xdiff = (zooms.at (out).xTranslate - zooms.at (out).realXTranslate) * 75.0f; float ydiff = (zooms.at (out).yTranslate - zooms.at (out).realYTranslate) * 75.0f; float xadjust = xdiff * 0.002f; float yadjust = ydiff * 0.002f; float xamount = fabs (xdiff); float yamount = fabs (ydiff); if (xamount < 1.0f) xamount = 1.0f; else if (xamount > 5.0) xamount = 5.0f; if (yamount < 1.0f) yamount = 1.0f; else if (yamount > 5.0) yamount = 5.0f; zooms.at (out).xVelocity = (xamount * zooms.at (out).xVelocity + xadjust) / (xamount + 1.0f); zooms.at (out).yVelocity = (yamount * zooms.at (out).yVelocity + yadjust) / (yamount + 1.0f); if ((fabs(xdiff) < 0.1f && fabs (zooms.at (out).xVelocity) < 0.005f) && (fabs(ydiff) < 0.1f && fabs (zooms.at (out).yVelocity) < 0.005f)) { zooms.at (out).realXTranslate = zooms.at (out).xTranslate; zooms.at (out).realYTranslate = zooms.at (out).yTranslate; zooms.at (out).xVelocity = 0.0f; zooms.at (out).yVelocity = 0.0f; return; } zooms.at (out).realXTranslate += (zooms.at (out).xVelocity * chunk) / cScreen->redrawTime (); zooms.at (out).realYTranslate += (zooms.at (out).yVelocity * chunk) / cScreen->redrawTime (); } /* Animate the movement (if any) in preparation of a paint screen. */ void EZoomScreen::preparePaint (int msSinceLastPaint) { if (grabbed) { float amount = msSinceLastPaint * 0.05f * optionGetSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; while (steps--) { for (unsigned int out = 0; out < zooms.size (); ++out) { if (!isInMovement (out) || !isActive (out)) continue; adjustXYVelocity (out, chunk); adjustZoomVelocity (out, chunk); zooms.at (out).updateActualTranslates (); if (!isZoomed (out)) { zooms.at (out).xVelocity = zooms.at (out).yVelocity = 0.0f; grabbed &= ~(1 << zooms.at (out).output); if (!grabbed) { cScreen->damageScreen (); toggleFunctions (false); } } } } if (optionGetZoomMode () == EzoomOptions::ZoomModeSyncMouse) syncCenterToMouse (); } cScreen->preparePaint (msSinceLastPaint); } /* Damage screen if we're still moving. */ void EZoomScreen::donePaint () { if (grabbed) { for (unsigned int out = 0; out < zooms.size (); ++out) { if (isInMovement (out) && isActive (out)) { cScreen->damageScreen (); break; } } } else if (grabIndex) cScreen->damageScreen (); else toggleFunctions (false); cScreen->donePaint (); } /* Draws a box from the screen coordinates inx1, iny1 to inx2, iny2. */ void EZoomScreen::drawBox (const GLMatrix &transform, CompOutput *output, CompRect box) { GLMatrix zTransform (transform); int inx1, inx2, iny1, iny2; int out = output->id (); GLushort colorData[4]; GLfloat vertexData[12]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); zTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); convertToZoomed (out, box.x1 (), box.y1 (), &inx1, &iny1); convertToZoomed (out, box.x2 (), box.y2 (), &inx2, &iny2); /* We can move in both directions from our starting point * so we need to calculate the right coordinates first. */ int x1 = MIN (inx1, inx2); int y1 = MIN (iny1, iny2); int x2 = MAX (inx1, inx2); int y2 = MAX (iny1, iny2); const float MaxUShortFloat = std::numeric_limits ::max (); GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); /* just enable blending if it is disabled */ if (!glBlendEnabled) glEnable (GL_BLEND); /* Draw filled rectangle */ float alpha = optionGetZoomBoxFillColorAlpha () / MaxUShortFloat; GLushort *color = optionGetZoomBoxFillColor (); colorData[0] = alpha * color[0]; colorData[1] = alpha * color[1]; colorData[2] = alpha * color[2]; colorData[3] = alpha * MaxUShortFloat; vertexData[0] = x1; vertexData[1] = y1; vertexData[2] = 0.0f; vertexData[3] = x1; vertexData[4] = y2; vertexData[5] = 0.0f; vertexData[6] = x2; vertexData[7] = y1; vertexData[8] = 0.0f; vertexData[9] = x2; vertexData[10] = y2; vertexData[11] = 0.0f; /* fill rectangle */ streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (zTransform); /* draw rectangle outline */ alpha = optionGetZoomBoxOutlineColorAlpha () / MaxUShortFloat; color = optionGetZoomBoxOutlineColor (); colorData[0] = alpha * color[0]; colorData[1] = alpha * color[1]; colorData[2] = alpha * color[2]; colorData[3] = alpha * MaxUShortFloat; vertexData[0] = x1; vertexData[1] = y1; vertexData[2] = 0.0f; vertexData[3] = x2; vertexData[4] = y1; vertexData[5] = 0.0f; vertexData[6] = x2; vertexData[7] = y2; vertexData[8] = 0.0f; vertexData[9] = x1; vertexData[10] = y2; vertexData[11] = 0.0f; glLineWidth (2.0); streamingBuffer->begin (GL_LINE_LOOP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (zTransform); /* just disable blending if it was disabled before */ if (!glBlendEnabled) glDisable (GL_BLEND); /* Damage the zoom selection box region during draw. */ cScreen->damageRegion (CompRegion (x1 - 1, y1 - 1, x2 - x1 + 1, y2 - y1 + 1)); } /* Apply the zoom if we are grabbed. * Make sure to use the correct filter. */ bool EZoomScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; int out = output->id (); if (isActive (out)) { GLScreenPaintAttrib sa = attrib; GLMatrix zTransform = transform; mask &= ~PAINT_SCREEN_REGION_MASK; mask |= PAINT_SCREEN_CLEAR_MASK; zTransform.scale (1.0f / zooms.at (out).currentZoom, 1.0f / zooms.at (out).currentZoom, 1.0f); zTransform.translate (zooms.at (out).xtrans, zooms.at (out).ytrans, 0); mask |= PAINT_SCREEN_TRANSFORMED_MASK; status = gScreen->glPaintOutput (sa, zTransform, region, output, mask); drawCursor (output, transform); } else status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (grabIndex) drawBox (transform, output, box); return status; } /* Makes sure we're not attempting to translate too far. * We are restricted to 0.5 to not go beyond the end * of the screen/head. */ static inline void constrainZoomTranslate () { ZOOM_SCREEN (screen); for (unsigned int out = 0; out < zs->zooms.size (); ++out) { if (zs->zooms.at (out).xTranslate > 0.5f) zs->zooms.at (out).xTranslate = 0.5f; else if (zs->zooms.at (out).xTranslate < -0.5f) zs->zooms.at (out).xTranslate = -0.5f; if (zs->zooms.at (out).yTranslate > 0.5f) zs->zooms.at (out).yTranslate = 0.5f; else if (zs->zooms.at (out).yTranslate < -0.5f) zs->zooms.at (out).yTranslate = -0.5f; } } /* Functions for adjusting the zoomed area. * These are the core of the zoom plug-in; Anything wanting * to adjust the zoomed area must use setCenter or setZoomArea * and setScale or front ends to them. */ /* Sets the center of the zoom area to X,Y. * We have to be able to warp the pointer here: If we are moved by * anything except mouse movement, we have to sync the * mouse pointer. This is to allow input, and is NOT necessary * when input redirection is available to us or if we're cheating * and using a scaled mouse cursor to imitate IR. * The center is not the center of the screen. This is the target-center; * that is, it's the point that's the same regardless of zoom level. */ void EZoomScreen::setCenter (int x, int y, bool instant) { int out = screen->outputDeviceForPoint (x, y); CompOutput *o = &screen->outputDevs ().at (out); if (zooms.at (out).locked) return; zooms.at (out).xTranslate = (float) ((x - o->x1 ()) - o->width () / 2) / (o->width ()); zooms.at (out).yTranslate = (float) ((y - o->y1 ()) - o->height () / 2) / (o->height ()); if (instant) { zooms.at (out).realXTranslate = zooms.at (out).xTranslate; zooms.at (out).realYTranslate = zooms.at (out).yTranslate; zooms.at (out).yVelocity = 0.0f; zooms.at (out).xVelocity = 0.0f; zooms.at (out).updateActualTranslates (); } if (optionGetZoomMode () == EzoomOptions::ZoomModePanArea) restrainCursor (out); } /* Zooms the area described. * The math could probably be cleaned up, but should be correct now. */ void EZoomScreen::setZoomArea (int x, int y, int width, int height, bool instant) { CompWindow::Geometry outGeometry (x, y, width, height, 0); int out = screen->outputDeviceForGeometry (outGeometry); if (zooms.at (out).newZoom == 1.0f || zooms.at (out).locked) return; CompOutput *o = &screen->outputDevs ().at (out); zooms.at (out).xTranslate = (float) -((o->width () / 2) - (x + (width / 2) - o->x1 ())) / (o->width ()); zooms.at (out).xTranslate /= (1.0f - zooms.at (out).newZoom); zooms.at (out).yTranslate = (float) -((o->height () / 2) - (y + (height / 2) - o->y1 ())) / (o->height ()); zooms.at (out).yTranslate /= (1.0f - zooms.at (out).newZoom); constrainZoomTranslate (); if (instant) { zooms.at (out).realXTranslate = zooms.at (out).xTranslate; zooms.at (out).realYTranslate = zooms.at (out).yTranslate; zooms.at (out).updateActualTranslates (); } if (optionGetZoomMode () == EzoomOptions::ZoomModePanArea) restrainCursor (out); } /* Moves the zoom area to the window specified */ void EZoomScreen::areaToWindow (CompWindow *w) { int left = w->serverX () - w->border ().left; int top = w->serverY () - w->border ().top; int width = w->width () + w->border ().left + w->border ().right; int height = w->height () + w->border ().top + w->border ().bottom; setZoomArea (left, top, width, height, false); } /* Pans the zoomed area vertically/horizontally by * value * zs->panFactor * TODO: Fix output. */ void EZoomScreen::panZoom (int xvalue, int yvalue) { float panFactor = optionGetPanFactor (); for (unsigned int out = 0; out < zooms.size (); ++out) { zooms.at (out).xTranslate += panFactor * xvalue * zooms.at (out).currentZoom; zooms.at (out).yTranslate += panFactor * yvalue * zooms.at (out).currentZoom; } constrainZoomTranslate (); } /* Enables polling of mouse position, and refreshes currently * stored values. */ void EZoomScreen::enableMousePolling () { pollHandle.start (); lastChange = time(NULL); mouse = MousePoller::getCurrentPosition (); } /* Sets the zoom (or scale) level. * Cleans up if we are suddenly zoomed out. */ void EZoomScreen::setScale (int out, float value) { if (zooms.at (out).locked) return; if (value >= 1.0f) value = 1.0f; else { if (!pollHandle.active ()) enableMousePolling (); grabbed |= (1 << zooms.at (out).output); cursorZoomActive (out); } if (value == 1.0f) { zooms.at (out).xTranslate = 0.0f; zooms.at (out).yTranslate = 0.0f; cursorZoomInactive (); } if (value < optionGetMinimumZoom ()) value = optionGetMinimumZoom (); zooms.at (out).newZoom = value; cScreen->damageScreen(); } /* Sets the zoom factor to the bigger of the two floats supplied. * Convenience function for setting the scale factor for an area. */ static inline void setScaleBigger (int out, float x, float y) { ZOOM_SCREEN (screen); zs->setScale (out, x > y ? x : y); } /* Mouse code... * This takes care of keeping the mouse in sync with the zoomed area and * vice versa. * See heading for description. */ /* Syncs the center, based on translations, back to the mouse. * This should be called when doing non-IR zooming and moving the zoom * area based on events other than mouse movement. */ void EZoomScreen::syncCenterToMouse () { int out = screen->outputDeviceForPoint (mouse.x (), mouse.y ()); if (!isInMovement (out)) return; CompOutput *o = &screen->outputDevs ().at (out); int x = (int) ((zooms.at (out).realXTranslate * o->width ()) + (o->width () / 2) + o->x1 ()); int y = (int) ((zooms.at (out).realYTranslate * o->height ()) + (o->height () / 2) + o->y1 ()); if ((x != mouse.x () || y != mouse.y ()) && grabbed && zooms.at (out).newZoom != 1.0f) { screen->warpPointer (x - pointerX , y - pointerY ); mouse.setX (x); mouse.setY (y); } } /* Convert the point X, Y to where it would be when zoomed. */ void EZoomScreen::convertToZoomed (int out, int x, int y, int *resultX, int *resultY) { if (!outputIsZoomArea (out)) { *resultX = x; *resultY = y; } CompOutput *o = &screen->outputDevs ()[out]; ZoomArea &za = zooms.at (out); int oWidth = o->width (); int oHeight = o->height (); int halfOWidth = oWidth / 2; int halfOHeight = oHeight / 2; x -= o->x1 (); y -= o->y1 (); *resultX = x - (za.realXTranslate * (1.0f - za.currentZoom) * oWidth) - halfOWidth; *resultX /= za.currentZoom; *resultX += halfOWidth; *resultX += o->x1 (); *resultY = y - (za.realYTranslate * (1.0f - za.currentZoom) * oHeight) - halfOHeight; *resultY /= za.currentZoom; *resultY += halfOHeight; *resultY += o->y1 (); } /* Same but use targeted translation, not real one. */ void EZoomScreen::convertToZoomedTarget (int out, int x, int y, int *resultX, int *resultY) { if (!outputIsZoomArea (out)) { *resultX = x; *resultY = y; } CompOutput *o = &screen->outputDevs ().at (out); ZoomArea &za = zooms.at (out); int oWidth = o->width (); int oHeight = o->height (); int halfOWidth = oWidth / 2; int halfOHeight = oHeight / 2; x -= o->x1 (); y -= o->y1 (); *resultX = x - (za.xTranslate * (1.0f - za.newZoom) * oWidth) - halfOWidth; *resultX /= za.newZoom; *resultX += halfOWidth; *resultX += o->x1 (); *resultY = y - (za.yTranslate * (1.0f - za.newZoom) * oHeight) - halfOHeight; *resultY /= za.newZoom; *resultY += halfOHeight; *resultY += o->y1 (); } /* Make sure the given point + margin is visible; * Translate to make it visible if necessary. * Returns false if the point isn't on a actively zoomed head * or the area is locked. */ bool EZoomScreen::ensureVisibility (int x, int y, int margin) { int out = screen->outputDeviceForPoint (x, y); if (!isActive (out)) return false; int zoomX, zoomY; convertToZoomedTarget (out, x, y, &zoomX, &zoomY); ZoomArea &za = zooms.at (out); if (za.locked) return false; CompOutput *o = &screen->outputDevs ().at (out); #define FACTOR (za.newZoom / (1.0f - za.newZoom)) if (zoomX + margin > o->x2 ()) za.xTranslate += (FACTOR * (float) (zoomX + margin - o->x2 ())) / (float) o->width (); else if (zoomX - margin < o->x1 ()) za.xTranslate += (FACTOR * (float) (zoomX - margin - o->x1 ())) / (float) o->width (); if (zoomY + margin > o->y2 ()) za.yTranslate += (FACTOR * (float) (zoomY + margin - o->y2 ())) / (float) o->height (); else if (zoomY - margin < o->y1 ()) za.yTranslate += (FACTOR * (float) (zoomY - margin - o->y1 ())) / (float) o->height (); #undef FACTOR constrainZoomTranslate (); return true; } /* Attempt to ensure the visibility of an area defined by x1/y1 and x2/y2. * See ensureVisibility () for details. * * This attempts to find the translations that leaves the biggest part of * the area visible. * * gravity defines what part of the window that should get * priority if it isn't possible to fit all of it. */ void EZoomScreen::ensureVisibilityArea (int x1, int y1, int x2, int y2, int margin, ZoomGravity gravity) { int out = screen->outputDeviceForPoint (x1 + (x2 - x1 / 2), y1 + (y2 - y1 / 2)); CompOutput *o = &screen->outputDevs ().at (out); bool widthOkay = (float)(x2-x1) / (float)o->width () < zooms.at (out).newZoom; bool heightOkay = (float)(y2-y1) / (float)o->height () < zooms.at (out).newZoom; if (widthOkay && heightOkay) { ensureVisibility (x1, y1, margin); ensureVisibility (x2, y2, margin); return; } int targetX, targetY, targetW, targetH; switch (gravity) { case NORTHWEST: targetX = x1; targetY = y1; if (widthOkay) targetW = x2 - x1; else targetW = o->width () * zooms.at (out).newZoom; if (heightOkay) targetH = y2 - y1; else targetH = o->height () * zooms.at (out).newZoom; break; case NORTHEAST: targetY = y1; if (widthOkay) { targetX = x1; targetW = x2-x1; } else { targetX = x2 - o->width () * zooms.at (out).newZoom; targetW = o->width () * zooms.at (out).newZoom; } if (heightOkay) targetH = y2-y1; else targetH = o->height () * zooms.at (out).newZoom; break; case SOUTHWEST: targetX = x1; if (widthOkay) targetW = x2-x1; else targetW = o->width () * zooms.at (out).newZoom; if (heightOkay) { targetY = y1; targetH = y2-y1; } else { targetY = y2 - (o->width () * zooms.at (out).newZoom); targetH = o->width () * zooms.at (out).newZoom; } break; case SOUTHEAST: if (widthOkay) { targetX = x1; targetW = x2-x1; } else { targetW = o->width () * zooms.at (out).newZoom; targetX = x2 - targetW; } if (heightOkay) { targetY = y1; targetH = y2 - y1; } else { targetH = o->height () * zooms.at (out).newZoom; targetY = y2 - targetH; } break; case CENTER: default: setCenter (x1 + (x2 - x1 / 2), y1 + (y2 - y1 / 2), false); return; break; } setZoomArea (targetX, targetY, targetW, targetH, false); return ; } /* Ensures that the cursor is visible on the given head. * Note that we check if currentZoom is 1.0f, because that often means that * mouseX and mouseY is not up-to-date (since the polling timer just * started). */ void EZoomScreen::restrainCursor (int out) { int x1, y1, x2, y2; int diffX = 0, diffY = 0; CompOutput *o = &screen->outputDevs ().at (out); float z = zooms.at (out).newZoom; int margin = optionGetRestrainMargin (); int north = distanceToEdge (out, NORTH); int south = distanceToEdge (out, SOUTH); int east = distanceToEdge (out, EAST); int west = distanceToEdge (out, WEST); if (zooms.at (out).currentZoom == 1.0f) { lastChange = time(NULL); mouse = MousePoller::getCurrentPosition (); } convertToZoomedTarget (out, mouse.x () - cursor.hotX, mouse.y () - cursor.hotY, &x1, &y1); convertToZoomedTarget (out, mouse.x () - cursor.hotX + cursor.width, mouse.y () - cursor.hotY + cursor.height, &x2, &y2); if ((x2 - x1 > o->x2 () - o->x1 ()) || (y2 - y1 > o->y2 () - o->y1 ())) return; if (x2 > o->x2 () - margin && east > 0) diffX = x2 - o->x2 () + margin; else if (x1 < o->x1 () + margin && west > 0) diffX = x1 - o->x1 () - margin; if (y2 > o->y2 () - margin && south > 0) diffY = y2 - o->y2 () + margin; else if (y1 < o->y1 () + margin && north > 0) diffY = y1 - o->y1 () - margin; if (abs(diffX)*z > 0 || abs(diffY)*z > 0) screen->warpPointer ((int) (mouse.x () - pointerX) - (int) ((float)diffX * z), (int) (mouse.y () - pointerY) - (int) ((float)diffY * z)); } /* Check if the cursor is still visible. * We also make sure to activate/deactivate cursor scaling here * so we turn on/off the pointer if it moves from one head to another. * FIXME: Detect an actual output change instead of spamming. * FIXME: The second ensureVisibility (sync with restrain). */ void EZoomScreen::cursorMoved () { int out = screen->outputDeviceForPoint (mouse.x (), mouse.y ()); if (isActive (out)) { if (optionGetRestrainMouse ()) restrainCursor (out); if (optionGetZoomMode () == EzoomOptions::ZoomModePanArea) ensureVisibilityArea (mouse.x () - cursor.hotX, mouse.y () - cursor.hotY, mouse.x () + cursor.width - cursor.hotX, mouse.y () + cursor.height - cursor.hotY, optionGetRestrainMargin (), NORTHWEST); cursorZoomActive (out); } else cursorZoomInactive (); } /* Update the mouse position. * Based on the zoom engine in use, we will have to move the zoom area. * This might have to be added to a timer. */ void EZoomScreen::updateMousePosition (const CompPoint &p) { mouse.setX (p.x ()); mouse.setY (p.y ()); int out = screen->outputDeviceForPoint (mouse.x (), mouse.y ()); lastChange = time(NULL); if (optionGetZoomMode () == EzoomOptions::ZoomModeSyncMouse && !isInMovement (out)) setCenter (mouse.x (), mouse.y (), true); cursorMoved (); cScreen->damageScreen (); } /* Timeout handler to poll the mouse. Returns false (and thereby does not * get re-added to the queue) when zoom is not active. */ void EZoomScreen::updateMouseInterval (const CompPoint &p) { updateMousePosition (p); if (!grabbed) { cursorMoved (); if (pollHandle.active ()) pollHandle.stop (); } } /* Free a cursor */ void EZoomScreen::freeCursor (CursorTexture *cursor) { if (!cursor->isSet) return; cursor->isSet = false; glDeleteTextures (1, &cursor->texture); cursor->texture = 0; } /* Translate into place and draw the scaled cursor. */ void EZoomScreen::drawCursor (CompOutput *output, const GLMatrix &transform) { int out = output->id (); if (cursor.isSet) { /* * XXX: expo knows how to handle mouse when zoomed, so we back off * when expo is active. */ if (screen->grabExist ("expo")) { cursorZoomInactive (); return; } GLMatrix sTransform = transform; float scaleFactor; int ax, ay; GLfloat textureData[8]; GLfloat vertexData[12]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); convertToZoomed (out, mouse.x (), mouse.y (), &ax, &ay); sTransform.translate ((float) ax, (float) ay, 0.0f); if (optionGetScaleMouseDynamic ()) scaleFactor = 1.0f / zooms.at (out).currentZoom; else scaleFactor = 1.0f / optionGetScaleMouseStatic (); sTransform.scale (scaleFactor, scaleFactor, 1.0f); int x = -cursor.hotX; int y = -cursor.hotY; GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); if (!glBlendEnabled) glEnable (GL_BLEND); glBindTexture (GL_TEXTURE_2D, cursor.texture); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = x; vertexData[1] = y; vertexData[2] = 0.0f; vertexData[3] = x; vertexData[4] = y + cursor.height; vertexData[5] = 0.0f; vertexData[6] = x + cursor.width; vertexData[7] = y; vertexData[8] = 0.0f; vertexData[9] = x + cursor.width; vertexData[10] = y + cursor.height; vertexData[11] = 0.0f; streamingBuffer->addVertices (4, vertexData); textureData[0] = 0; textureData[1] = 0; textureData[2] = 0; textureData[3] = 1; textureData[4] = 1; textureData[5] = 0; textureData[6] = 1; textureData[7] = 1; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->end (); streamingBuffer->render (sTransform); glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_BLEND); } } /* Create (if necessary) a texture to store the cursor, * fetch the cursor with XFixes. Store it. */ void EZoomScreen::updateCursor (CursorTexture * cursor) { int i; Display *dpy = screen->dpy (); if (!cursor->isSet) { cursor->isSet = true; cursor->screen = screen; glGenTextures (1, &cursor->texture); glBindTexture (GL_TEXTURE_2D, cursor->texture); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gScreen->textureFilter ()); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gScreen->textureFilter ()); } XFixesCursorImage *ci = XFixesGetCursorImage (dpy); unsigned char *pixels; unsigned long pix; if (ci) { cursor->width = ci->width; cursor->height = ci->height; cursor->hotX = ci->xhot; cursor->hotY = ci->yhot; pixels = (unsigned char *) malloc (ci->width * ci->height * 4); if (!pixels) { XFree (ci); return; } for (i = 0; i < ci->width * ci->height; ++i) { pix = ci->pixels[i]; pixels[i * 4] = pix & 0xff; pixels[(i * 4) + 1] = (pix >> 8) & 0xff; pixels[(i * 4) + 2] = (pix >> 16) & 0xff; pixels[(i * 4) + 3] = (pix >> 24) & 0xff; } XFree (ci); } else { /* Fallback R: 255 G: 255 B: 255 A: 255 * FIXME: Draw a cairo mouse cursor */ cursor->width = 1; cursor->height = 1; cursor->hotX = 0; cursor->hotY = 0; pixels = (unsigned char *) malloc (cursor->width * cursor->height * 4); if (!pixels) return; for (i = 0; i < cursor->width * cursor->height; ++i) { pix = 0x00ffffff; pixels[i * 4] = pix & 0xff; pixels[(i * 4) + 1] = (pix >> 8) & 0xff; pixels[(i * 4) + 2] = (pix >> 16) & 0xff; pixels[(i * 4) + 3] = (pix >> 24) & 0xff; } compLogMessage ("ezoom", CompLogLevelWarn, "unable to get system cursor image!"); } glBindTexture (GL_TEXTURE_2D, cursor->texture); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, cursor->width, cursor->height, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixels); glBindTexture (GL_TEXTURE_2D, 0); free (pixels); } /* We are no longer zooming the cursor, so display it. */ void EZoomScreen::cursorZoomInactive () { if (!fixesSupported) return; if (cursorInfoSelected) { cursorInfoSelected = false; XFixesSelectCursorInput (screen->dpy (), screen->root (), 0); } if (cursor.isSet) freeCursor (&cursor); if (cursorHidden) { cursorHidden = false; XFixesShowCursor (screen->dpy (), screen->root ()); } } /* Cursor zoom is active: We need to hide the original, * register for Cursor notifies and display the new one. * This can be called multiple times, not just on initial * activation. */ void EZoomScreen::cursorZoomActive (int out) { if (!fixesSupported) return; /* Force cursor hiding and mouse panning if this output is locked * and cursor hiding is not enabled and we are syncing the mouse */ if (!optionGetScaleMouse () && optionGetZoomMode () == EzoomOptions::ZoomModeSyncMouse && optionGetHideOriginalMouse () && !zooms.at (out).locked) return; if (!cursorInfoSelected) { cursorInfoSelected = true; XFixesSelectCursorInput (screen->dpy (), screen->root (), XFixesDisplayCursorNotifyMask); updateCursor (&cursor); } if (canHideCursor && !cursorHidden && (optionGetHideOriginalMouse () || zooms.at (out).locked)) { cursorHidden = true; XFixesHideCursor (screen->dpy (), screen->root ()); } } /* Set the zoom area * This is an interface for scripting. * int32:x1: left x coordinate * int32:y1: top y coordinate * int32:x2: right x * int32:y2: bottom y * x2 and y2 can be omitted to assume x1==x2+1 y1==y2+1 * boolean:scale: True if we should modify the zoom level, false to just * adjust the movement/translation. * boolean:restrain: True to warp the pointer so it's visible. */ bool EZoomScreen::setZoomAreaAction (CompAction *action, CompAction::State state, CompOption::Vector options) { int x1 = CompOption::getIntOptionNamed (options, "x1", -1); int y1 = CompOption::getIntOptionNamed (options, "y1", -1); if (x1 < 0 || y1 < 0) return false; int x2 = CompOption::getIntOptionNamed (options, "x2", -1); int y2 = CompOption::getIntOptionNamed (options, "y2", -1); if (x2 < 0) x2 = x1 + 1; if (y2 < 0) y2 = y1 + 1; bool scale = CompOption::getBoolOptionNamed (options, "scale", false); bool restrain = CompOption::getBoolOptionNamed (options, "restrain", false); int out = screen->outputDeviceForPoint (x1, y1); int width = x2 - x1; int height = y2 - y1; setZoomArea (x1, y1, width, height, false); CompOutput *o = &screen->outputDevs (). at(out); if (scale && width && height) setScaleBigger (out, width / static_cast (o->width ()), height / static_cast (o->height ())); if (restrain) restrainCursor (out); toggleFunctions (true); return true; } /* Ensure visibility of an area defined by x1->x2/y1->y2 * int:x1: left X coordinate * int:x2: right X Coordinate * int:y1: top Y coordinate * int:y2: bottom Y coordinate * bool:scale: zoom out if necessary to ensure visibility * bool:restrain: Restrain the mouse cursor * int:margin: The margin to use (default: 0) * if x2/y2 is omitted, it is ignored. */ bool EZoomScreen::ensureVisibilityAction (CompAction *action, CompAction::State state, CompOption::Vector options) { int x1 = CompOption::getIntOptionNamed (options, "x1", -1); int y1 = CompOption::getIntOptionNamed (options, "y1", -1); if (x1 < 0 || y1 < 0) return false; int x2 = CompOption::getIntOptionNamed (options, "x2", -1); int y2 = CompOption::getIntOptionNamed (options, "y2", -1); int margin = CompOption::getBoolOptionNamed (options, "margin", 0); bool scale = CompOption::getBoolOptionNamed (options, "scale", false); bool restrain = CompOption::getBoolOptionNamed (options, "restrain", false); if (x2 < 0) y2 = y1 + 1; int out = screen->outputDeviceForPoint (x1, y1); ensureVisibility (x1, y1, margin); if (x2 >= 0 && y2 >= 0) ensureVisibility (x2, y2, margin); CompOutput *o = &screen->outputDevs (). at(out); int width = x2 - x1; int height = y2 - y1; if (scale && width && height) setScaleBigger (out, width / static_cast (o->width ()), height / static_cast (o->height ())); if (restrain) restrainCursor (out); toggleFunctions (true); return true; } /* Finished here */ bool EZoomScreen::zoomBoxActivate (CompAction *action, CompAction::State state, CompOption::Vector options) { grabIndex = screen->pushGrab (None, "ezoom"); clickPos.setX (pointerX); clickPos.setY (pointerY); box.setGeometry (pointerX, pointerY, 0, 0); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); toggleFunctions (true); return true; } bool EZoomScreen::zoomBoxDeactivate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (grabIndex) { screen->removeGrab (grabIndex, NULL); grabIndex = 0; if (pointerX < clickPos.x ()) { box.setX (pointerX); box.setWidth (clickPos.x () - pointerX); } else box.setWidth (pointerX - clickPos.x ()); if (pointerY < clickPos.y ()) { box.setY (pointerY); box.setHeight (clickPos.y () - pointerY); } else box.setHeight (pointerY - clickPos.y ()); int x = MIN (box.x1 (), box.x2 ()); int y = MIN (box.y1 (), box.y2 ()); int width = MAX (box.x1 (), box.x2 ()) - x; int height = MAX (box.y1 (), box.y2 ()) - y; CompWindow::Geometry outGeometry (x, y, width, height, 0); int out = screen->outputDeviceForGeometry (outGeometry); CompOutput *o = &screen->outputDevs (). at (out); setScaleBigger (out, width / static_cast (o->width ()), height / static_cast (o->height ())); setZoomArea (x, y, width, height, false); } toggleFunctions (true); return true; } /* Zoom in to the area pointed to by the mouse. */ bool EZoomScreen::zoomIn (CompAction *action, CompAction::State state, CompOption::Vector options) { int out = screen->outputDeviceForPoint (pointerX, pointerY); if (optionGetZoomMode () == EzoomOptions::ZoomModeSyncMouse && !isInMovement (out)) setCenter (pointerX, pointerY, true); setScale (out, zooms.at (out).newZoom / optionGetZoomFactor ()); toggleFunctions (true); return true; } /* Locks down the current zoom area */ bool EZoomScreen::lockZoomAction (CompAction *action, CompAction::State state, CompOption::Vector options) { int out = screen->outputDeviceForPoint (pointerX, pointerY); zooms.at (out).locked = !zooms.at (out).locked; return true; } /* Zoom to a specific level. * target defines the target zoom level. * First set the scale level and mark the display as grabbed internally (to * catch the FocusIn event). Either target the focused window or the mouse, * depending on settings. * FIXME: A bit of a mess... */ bool EZoomScreen::zoomSpecific (CompAction *action, CompAction::State state, CompOption::Vector options, SpecificZoomTarget target) { int out = screen->outputDeviceForPoint (pointerX, pointerY); float zoom_level; switch (target) { case ZoomTargetFirst: zoom_level = optionGetZoomSpec1 (); break; case ZoomTargetSecond: zoom_level = optionGetZoomSpec2 (); break; case ZoomTargetThird: zoom_level = optionGetZoomSpec3 (); break; default: return false; } if ((zoom_level == zooms.at (out).newZoom) || screen->otherGrabExist (NULL)) return false; setScale (out, zoom_level); CompWindow *w = screen->findWindow (screen->activeWindow ()); if (optionGetSpecTargetFocus () && w) areaToWindow (w); else { int x = CompOption::getIntOptionNamed (options, "x", 0); int y = CompOption::getIntOptionNamed (options, "y", 0); setCenter (x, y, false); } toggleFunctions (true); return true; } /* TODO: Add specific zoom boost::bind's */ /* Zooms to fit the active window to the screen without cutting * it off and targets it. */ bool EZoomScreen::zoomToWindow (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid = CompOption::getIntOptionNamed (options, "window", 0); CompWindow *w = screen->findWindow (xid); if (!w) return true; int width = w->width () + w->border ().left + w->border ().right; int height = w->height () + w->border ().top + w->border ().bottom; int out = screen->outputDeviceForGeometry (w->geometry ()); CompOutput *o = &screen->outputDevs ().at (out); setScaleBigger (out, width / static_cast (o->width ()), height / static_cast (o->height ())); areaToWindow (w); toggleFunctions (true); return true; } bool EZoomScreen::zoomPan (CompAction *action, CompAction::State state, CompOption::Vector options, float horizAmount, float vertAmount) { panZoom (horizAmount, vertAmount); return true; } /* Centers the mouse based on zoom level and translation. */ bool EZoomScreen::zoomCenterMouse (CompAction *action, CompAction::State state, CompOption::Vector options) { int out = screen->outputDeviceForPoint (pointerX, pointerY); screen->warpPointer ((int) (screen->outputDevs ().at (out).width () / 2 + screen->outputDevs ().at (out).x1 () - pointerX) + ((float) screen->outputDevs ().at (out).width () * -zooms.at (out).xtrans), (int) (screen->outputDevs ().at (out).height () / 2 + screen->outputDevs ().at (out).y1 () - pointerY) + ((float) screen->outputDevs ().at (out).height () * zooms.at (out).ytrans)); return true; } /* Resize a window to fit the zoomed area. * This could probably do with some moving-stuff too. * IE: Move the zoom area afterwards. And ensure * the window isn't resized off-screen. */ bool EZoomScreen::zoomFitWindowToZoom (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (!w) return true; unsigned int mask = CWWidth | CWHeight; XWindowChanges xwc; int out = screen->outputDeviceForGeometry (w->geometry ()); xwc.x = w->serverX (); xwc.y = w->serverY (); xwc.width = (int) (screen->outputDevs ().at (out).width () * zooms.at (out).currentZoom - (int) ((w->border ().left + w->border ().right))); xwc.height = (int) (screen->outputDevs ().at (out).height () * zooms.at (out).currentZoom - (int) ((w->border ().top + w->border ().bottom))); w->constrainNewWindowSize (xwc.width, xwc.height, &xwc.width, &xwc.height); if (xwc.width == w->serverWidth ()) mask &= ~CWWidth; if (xwc.height == w->serverHeight ()) mask &= ~CWHeight; if (w->mapNum () && (mask & (CWWidth | CWHeight))) w->sendSyncRequest (); w->configureXWindow (mask, &xwc); toggleFunctions (true); return true; } bool EZoomScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { zoomIn (action, state, options); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); toggleFunctions (true); return true; } bool EZoomScreen::zoomOut (CompAction *action, CompAction::State state, CompOption::Vector options) { int out = screen->outputDeviceForPoint (pointerX, pointerY); setScale (out, zooms.at (out).newZoom * optionGetZoomFactor ()); toggleFunctions (true); return true; } bool EZoomScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { int out = screen->outputDeviceForPoint (pointerX, pointerY); if (grabbed) { zooms.at (out).newZoom = 1.0f; cScreen->damageScreen (); } toggleFunctions (true); action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } /* Focus-track related event handling. * The lastMapped is a hack to ensure that newly mapped windows are * caught even if the grab that (possibly) triggered them affected * the mode. Windows created by a key binding (like creating a terminal * on a key binding) tends to trigger FocusIn events with mode other than * Normal. This works around this problem. * FIXME: Cleanup. * TODO: Avoid maximized windows. */ void EZoomScreen::focusTrack (XEvent *event) { static Window lastMapped = 0; if (event->type == MapNotify) { lastMapped = event->xmap.window; return; } else if (event->type != FocusIn) return; if ((event->xfocus.mode != NotifyNormal) && (lastMapped != event->xfocus.window)) return; lastMapped = 0; CompWindow *w = screen->findWindow (event->xfocus.window); if (w == NULL || w->id () == screen->activeWindow () || time(NULL) - lastChange < optionGetFollowFocusDelay () || !optionGetFollowFocus ()) return; int out = screen->outputDeviceForGeometry (w->geometry ()); if (!isActive (out) && !optionGetAlwaysFocusFitWindow ()) return; if (optionGetFocusFitWindow ()) { int width = w->width () + w->border ().left + w->border ().right; int height = w->height () + w->border ().top + w->border ().bottom; float scale = MAX (width / static_cast (screen->outputDevs ().at (out).width ()), height / static_cast (screen->outputDevs ().at (out).height ())); if (scale > optionGetAutoscaleMin ()) setScale (out, scale); } areaToWindow (w); toggleFunctions (true); } /* Event handler. Pass focus-related events on and handle XFixes events. */ void EZoomScreen::handleEvent (XEvent *event) { switch (event->type) { case MotionNotify: if (grabIndex) { if (pointerX < clickPos.x ()) { box.setX (pointerX); box.setWidth (clickPos.x () - pointerX); } else box.setWidth (pointerX - clickPos.x ()); if (pointerY < clickPos.y ()) { box.setY (pointerY); box.setHeight (clickPos.y () - pointerY); } else box.setHeight (pointerY - clickPos.y ()); cScreen->damageScreen (); } break; case FocusIn: case MapNotify: focusTrack (event); break; default: if (event->type == fixesEventBase + XFixesCursorNotify) { //XFixesCursorNotifyEvent *cev = (XFixesCursorNotifyEvent *) //event; if (cursor.isSet) updateCursor (&cursor); } break; } screen->handleEvent (event); } /* TODO: Use this ctor carefully */ EZoomScreen::CursorTexture::CursorTexture () : isSet (false), screen (0), width (0), height (0), hotX (0), hotY (0) { } EZoomScreen::EZoomScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), grabbed (0), grabIndex (0), lastChange (0), cursorInfoSelected (false), cursorHidden (false) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); int major, minor; fixesSupported = XFixesQueryExtension(screen->dpy (), &fixesEventBase, &fixesErrorBase); XFixesQueryVersion (screen->dpy (), &major, &minor); if (major >= 4) canHideCursor = true; else canHideCursor = false; unsigned int n = screen->outputDevs ().size (); for (unsigned int i = 0; i < n; ++i) { /* zs->grabbed is a mask ... Thus this limit */ if (i > sizeof (long int) * 8) break; ZoomArea za (i); zooms.push_back (za); } pollHandle.setCallback (boost::bind ( &EZoomScreen::updateMouseInterval, this, _1)); optionSetZoomInButtonInitiate (boost::bind (&EZoomScreen::zoomIn, this, _1, _2, _3)); optionSetZoomOutButtonInitiate (boost::bind (&EZoomScreen::zoomOut, this, _1, _2, _3)); optionSetZoomInKeyInitiate (boost::bind (&EZoomScreen::zoomIn, this, _1, _2, _3)); optionSetZoomOutKeyInitiate (boost::bind (&EZoomScreen::zoomOut, this, _1, _2, _3)); optionSetZoomSpecific1KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTargetFirst)); optionSetZoomSpecific2KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTargetSecond)); optionSetZoomSpecific3KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTargetThird)); optionSetPanLeftKeyInitiate (boost::bind (&EZoomScreen::zoomPan, this, _1, _2, _3, -1, 0)); optionSetPanRightKeyInitiate (boost::bind (&EZoomScreen::zoomPan, this, _1, _2, _3, 1, 0)); optionSetPanUpKeyInitiate (boost::bind (&EZoomScreen::zoomPan, this, _1, _2, _3, 0, -1)); optionSetPanDownKeyInitiate (boost::bind (&EZoomScreen::zoomPan, this, _1, _2, _3, 0, 1)); optionSetFitToWindowKeyInitiate (boost::bind (&EZoomScreen::zoomToWindow, this, _1, _2, _3)); optionSetCenterMouseKeyInitiate (boost::bind (&EZoomScreen::zoomCenterMouse, this, _1, _2, _3)); optionSetFitToZoomKeyInitiate (boost::bind ( &EZoomScreen::zoomFitWindowToZoom, this, _1, _2, _3)); optionSetLockZoomKeyInitiate (boost::bind (&EZoomScreen::lockZoomAction, this, _1, _2, _3)); optionSetZoomBoxButtonInitiate (boost::bind (&EZoomScreen::zoomBoxActivate, this, _1, _2, _3)); optionSetZoomBoxButtonTerminate (boost::bind ( &EZoomScreen::zoomBoxDeactivate, this, _1, _2, _3)); optionSetSetZoomAreaInitiate (boost::bind ( &EZoomScreen::setZoomAreaAction, this, _1, _2, _3)); optionSetEnsureVisibilityInitiate (boost::bind ( &EZoomScreen::ensureVisibilityAction, this, _1, _2, _3)); } EZoomScreen::~EZoomScreen () { if (pollHandle.active ()) pollHandle.stop (); if (zooms.size ()) zooms.clear (); cScreen->damageScreen (); cursorZoomInactive (); } bool ZoomPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("mousepoll", COMPIZ_MOUSEPOLL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/put/0000755000015301777760000000000012321344021017765 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/put/put.xml.in0000644000015301777760000003154612321343002021733 0ustar pbusernogroup00000000000000 <_short>Put <_long>Put window Window Management opengl decor wobbly fade opengl composite <_short>Bindings <_short>Put to arbitrary viewport <_short>Put to adjacent viewport <_short>Put within viewport <_short>Put on empty regions <_short>Misc. Options <_short>Padding <_short>Animation compiz-0.9.11+14.04.20140409/plugins/put/CMakeLists.txt0000644000015301777760000000015012321343002022517 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (put PLUGINDEPS composite opengl) compiz-0.9.11+14.04.20140409/plugins/put/src/0000755000015301777760000000000012321344021020554 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/put/src/put.cpp0000644000015301777760000010502112321343002022065 0ustar pbusernogroup00000000000000/* * Copyright (c) 2006 Darryll Truchan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "put.h" #include COMPIZ_PLUGIN_20090315 (put, PutPluginVTable); #define PUT_ONLY_EMPTY(type) (type >= PutEmptyBottomLeft && \ type <= PutEmptyTopRight) #define TOP_BORDER(w) ((w)->border ().top) #define LEFT_BORDER(w) ((w)->border ().left) #define RIGHT_BORDER(w) ((w)->border ().right + 2 * (w)->serverGeometry ().border ()) #define BOTTOM_BORDER(w) ((w)->border ().bottom + 2 * (w)->serverGeometry ().border ()) #define HALF_WIDTH(w) ((w)->serverWidth () / 2 + (w)->serverGeometry ().border ()) #define HALF_HEIGHT(w) ((w)->serverHeight () / 2 + (w)->serverGeometry ().border ()) /* * Maximumize functions * Functions are from Maximumize plugin * (Author:Kristian Lyngstøl ) */ /* Generates a region containing free space (here the * active window counts as free space). The region argument * is the start-region (ie: the output dev). * Logic borrowed from opacify (courtesy of myself). */ CompRegion PutScreen::emptyRegion (CompWindow *window, const CompRect& outputRect) { CompRegion newRegion; newRegion += outputRect; foreach(CompWindow *w, screen->windows ()) { if (w->id () == window->id ()) continue; if (w->invisible () || /*w->hidden () ||*/ w->minimized ()) continue; if (w->wmType () & CompWindowTypeDesktopMask) continue; if (w->wmType () & CompWindowTypeDockMask) { if (w->struts ()) { CompRegion tmpRegion; tmpRegion += w->struts ()->left; tmpRegion += w->struts ()->right; tmpRegion += w->struts ()->top; tmpRegion += w->struts ()->bottom; newRegion -= tmpRegion; } continue; } newRegion -= w->serverBorderRect (); } return newRegion; } /* Returns true if box a has a larger area than box b. */ bool PutScreen::boxCompare (const CompRect& a, const CompRect& b) { int areaA, areaB; areaA = a.width () * a.height (); areaB = b.width () * b.height (); return (areaA > areaB); } /* Extends the given box for Window w to fit as much space in region r. * If XFirst is true, it will first expand in the X direction, * then Y. This is because it gives different results. * PS: Decorations are icky. */ static const unsigned short LEFT = 0; static const unsigned short RIGHT = 1; static const unsigned short TOP = 2; static const unsigned short BOTTOM = 3; inline void addToCorner (CompRect& rect, unsigned int corner, const short inc) { switch (corner) { case LEFT: rect.setX (rect.x () + inc); break; case RIGHT: rect.setWidth (rect.width () + inc); break; case TOP: rect.setY (rect.y () + inc); break; case BOTTOM: rect.setHeight (rect.height () + inc); break; } } inline void expandCorner (CompWindow *w, CompRect& tmp, const CompRegion& r, unsigned int corner, int direction) { bool touch = false; #define CHECKREC \ r.contains (CompRect (tmp.x () - LEFT_BORDER (w), \ tmp.y () - TOP_BORDER (w), \ tmp.width () + LEFT_BORDER (w) + RIGHT_BORDER (w), \ tmp.height () + TOP_BORDER (w) + BOTTOM_BORDER (w))) while (CHECKREC) { addToCorner (tmp, corner, direction); touch = true; } if (touch) addToCorner (tmp, corner, -direction); #undef CHECKREC } CompRect PutScreen::extendBox (CompWindow *w, const CompRect& tmp, const CompRegion& r, bool xFirst, bool left, bool right, bool up, bool down) { short int counter = 0; CompRect result = tmp; while (counter < 1) { if ((xFirst && counter == 0) || (!xFirst && counter == 1)) { if (left) expandCorner (w, result, r, LEFT, -1); if (right) expandCorner (w, result, r, RIGHT, 1); counter++; } if ((xFirst && counter == 1) || (!xFirst && counter == 0)) { if (down) expandCorner (w, result, r, BOTTOM, 1); if (up) expandCorner (w, result, r, TOP, -1); counter++; } } return result; } /* Create a box for resizing in the given region * Also shrinks the window box in case of minor overlaps. * FIXME: should be somewhat cleaner. */ CompRect PutScreen::findRect (CompWindow *w, const CompRegion& r, bool left, bool right, bool up, bool down) { CompRect windowBox, ansA, ansB, orig; windowBox.setGeometry (w->serverX (), w->serverY (), w->serverWidth (), w->serverHeight ()); orig = windowBox; ansA = extendBox (w, windowBox, r, true, left, right, up, down); ansB = extendBox (w, windowBox, r, false, left, right, up, down); if (boxCompare (orig, ansA) && boxCompare (orig, ansB)) return orig; if (boxCompare (ansA, ansB)) return ansA; else return ansB; } /* Calls out to compute the resize */ unsigned int PutScreen::computeResize (CompWindow *w, XWindowChanges *xwc, bool left, bool right, bool up, bool down) { unsigned int mask = 0; CompRect box; CompRegion region; int outputDevice = w->outputDevice (); region = emptyRegion (w, screen->outputDevs ()[outputDevice]); box = findRect (w, region, left, right, up, down); if (box.x () != w->serverX ()) mask |= CWX; if (box.y () != w->serverY ()) mask |= CWY; if (box.width () != w->serverWidth ()) mask |= CWWidth; if (box.height () != w->height ()) mask |= CWHeight; xwc->x = box.x (); xwc->y = box.y (); xwc->width = box.width (); xwc->height = box.height (); return mask; } /* * End of Maximumize functions */ /* * calculate the velocity for the moving window */ int PutScreen::adjustVelocity (CompWindow *w) { float dx, dy, adjust, amount; float x1, y1; PUT_WINDOW (w); x1 = pw->targetX; y1 = pw->targetY; dx = x1 - (w->x () + pw->tx); dy = y1 - (w->y () + pw->ty); adjust = dx * 0.15f; amount = fabs (dx) * 1.5; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; pw->xVelocity = (amount * pw->xVelocity + adjust) / (amount + 1.0f); adjust = dy * 0.15f; amount = fabs (dy) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; pw->yVelocity = (amount * pw->yVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (pw->xVelocity) < 0.2f && fabs (dy) < 0.1f && fabs (pw->yVelocity) < 0.2f) { /* animation done */ pw->xVelocity = pw->yVelocity = 0.0f; pw->tx = x1 - w->x (); pw->ty = y1 - w->y (); return 0; } return 1; } void PutScreen::finishWindowMovement (CompWindow *w) { PUT_WINDOW (w); w->move (pw->targetX - w->x (), pw->targetY - w->y (), true); if (w->state () & (MAXIMIZE_STATE | CompWindowStateFullscreenMask)) w->updateAttributes (CompStackingUpdateModeNone); } unsigned int PutScreen::getOutputForWindow (CompWindow *w) { PUT_WINDOW (w); if (!pw->adjust) return w->outputDevice (); /* outputDeviceForWindow uses the server geometry, so specialcase a running animation, which didn't apply the server geometry yet */ CompWindow::Geometry geom; geom.set (w->x () + pw->tx, w->y () + pw->ty, w->width (), w->height (), w->geometry ().border ()); return screen->outputDeviceForGeometry (geom); } CompPoint PutScreen::getDistance (CompWindow *w, PutType type, CompOption::Vector &option) { CompScreen *s = screen; int x, y, dx, dy, posX, posY; int viewport, output; CompRect workArea; CompPoint result; PUT_SCREEN (s); PUT_WINDOW (w); posX = CompOption::getIntOptionNamed (option,"x", 0); posY = CompOption::getIntOptionNamed (option,"y", 0); /* get the output device number from the options list */ output = CompOption::getIntOptionNamed (option,"output", -1); /* no output in options list -> use the current output */ if (output == -1) { /* no output given, so use the current output if this wasn't a double tap */ if (ps->lastType != type || ps->lastWindow != w->id ()) output = getOutputForWindow (w); } else { /* make sure the output number is not out of bounds */ output = MIN (output, (int) s->outputDevs ().size () - 1); } if (output == -1) { /* user double-tapped the key, so use the screen work area */ workArea = s->workArea (); /* set the type to unknown to have a toggle-type behaviour between 'use output work area' and 'use screen work area' */ ps->lastType = PutUnknown; } else { /* single tap or output provided via options list, use the output work area */ workArea = s->getWorkareaForOutput (output); ps->lastType = type; } if (PUT_ONLY_EMPTY (type)) { unsigned int mask; XWindowChanges xwc; bool left, right, up, down; left = right = up = down = false; switch (type) { case PutEmptyBottomLeft: left = down = true; break; case PutEmptyBottom: down = true; break; case PutEmptyBottomRight: right = down = true; break; case PutEmptyLeft: left = true; break; case PutEmptyCenter: left = right = up = down = true; break; case PutEmptyRight: right = true; break; case PutEmptyTopLeft: left = up = true; break; case PutEmptyTop: up = true; break; case PutEmptyTopRight: right = up = true; break; default: break; } mask = computeResize (w, &xwc, left,right,up,down); if (mask) { if (w->constrainNewWindowSize (xwc.width, xwc.height, &xwc.width, &xwc.height)) mask |= CWWidth | CWHeight; } workArea.setGeometry (xwc.x, xwc.y, xwc.width, xwc.height); } /* the windows location */ x = w->x () + pw->tx; y = w->y () + pw->ty; switch (type) { case PutEmptyCenter: case PutCenter: /* center of the screen */ dx = (workArea.width () / 2) - HALF_WIDTH (w) - w->serverGeometry ().border () - (x - workArea.x ()); dy = (workArea.height () / 2) - HALF_HEIGHT (w) - w->serverGeometry ().border () - (y - workArea.y ()); break; case PutLeft: /* center of the left edge */ dx = -(x - workArea.x ()) + LEFT_BORDER (w) + ps->optionGetPadLeft (); dy = (workArea.height () / 2) - HALF_HEIGHT (w) - (y - workArea.y ()); break; case PutEmptyLeft: /* center of the left edge */ workArea.setX (workArea.x () - LEFT_BORDER (w)); dx = -(x - workArea.x ()) + LEFT_BORDER (w) + ps->optionGetPadLeft (); dy = (workArea.height () / 2) - HALF_HEIGHT (w) - (y - workArea.y ()); break; case PutTopLeft: /* top left corner */ dx = -(x - workArea.x ()) + LEFT_BORDER (w) + ps->optionGetPadLeft (); dy = -(y - workArea.y ()) + TOP_BORDER (w) + ps->optionGetPadTop (); break; case PutEmptyTopLeft: /* top left corner */ workArea.setX (workArea.x () - LEFT_BORDER (w)); workArea.setY (workArea.y () - TOP_BORDER (w)); dx = -(x - workArea.x ()) + LEFT_BORDER (w) + ps->optionGetPadLeft (); dy = -(y - workArea.y ()) + TOP_BORDER (w) + ps->optionGetPadTop (); break; case PutTop: /* center of top edge */ dx = (workArea.width () / 2) - HALF_WIDTH (w) - (x - workArea.x ()); dy = -(y - workArea.y ()) + TOP_BORDER (w) + ps->optionGetPadTop (); break; case PutEmptyTop: /* center of top edge */ workArea.setY (workArea.x () - TOP_BORDER (w)); dx = (workArea.width () / 2) - HALF_WIDTH (w) - (x - workArea.x ()); dy = -(y - workArea.y ()) + TOP_BORDER (w) + ps->optionGetPadTop (); break; case PutTopRight: /* top right corner */ dx = workArea.width () - w->serverWidth () - (x - workArea.x ()) - RIGHT_BORDER (w) - ps->optionGetPadRight (); dy = -(y - workArea.y ()) + TOP_BORDER (w) + ps->optionGetPadTop (); break; case PutEmptyTopRight: /* top right corner */ workArea.setX (workArea.x () + RIGHT_BORDER (w)); workArea.setY (workArea.y () - TOP_BORDER (w)); dx = workArea.width () - w->serverWidth () - (x - workArea.x ()) - RIGHT_BORDER (w) - ps->optionGetPadRight (); dy = -(y - workArea.y ()) + TOP_BORDER (w) + ps->optionGetPadTop (); break; case PutRight: /* center of right edge */ dx = workArea.width () - w->serverWidth () - (x - workArea.x ()) - RIGHT_BORDER (w) - ps->optionGetPadRight (); dy = (workArea.height () / 2) - HALF_HEIGHT (w) - (y - workArea.y ()); break; case PutEmptyRight: /* center of right edge */ workArea.setX (workArea.x () + RIGHT_BORDER (w)); dx = workArea.width () - w->serverWidth () - (x - workArea.x ()) - RIGHT_BORDER (w) - ps->optionGetPadRight (); dy = (workArea.height () / 2) - HALF_HEIGHT (w) - (y - workArea.y ()); break; case PutBottomRight: /* bottom right corner */ dx = workArea.width () - w->serverWidth () - (x - workArea.x ()) - RIGHT_BORDER (w) - ps->optionGetPadRight (); dy = workArea.height () - w->serverHeight () - (y - workArea.y ()) - BOTTOM_BORDER (w) - ps->optionGetPadBottom (); break; case PutEmptyBottomRight: /* bottom right corner */ workArea.setX (workArea.x () + RIGHT_BORDER (w)); workArea.setY (workArea.y () + BOTTOM_BORDER (w)); dx = workArea.width () - w->serverWidth () - (x - workArea.x ()) - RIGHT_BORDER (w) - ps->optionGetPadRight (); dy = workArea.height () - w->serverHeight () - (y - workArea.y ()) - BOTTOM_BORDER (w)- ps->optionGetPadBottom (); break; case PutBottom: /* center of bottom edge */ dx = (workArea.width () / 2) - HALF_WIDTH (w) - (x - workArea.x ()); dy = workArea.height () - w->serverHeight () - (y - workArea.y ()) - BOTTOM_BORDER (w) - ps->optionGetPadBottom (); break; case PutEmptyBottom: /* center of bottom edge */ workArea.setY (workArea.y () + BOTTOM_BORDER (w)); dx = (workArea.width () / 2) - HALF_WIDTH (w) - (x - workArea.x ()); dy = workArea.height () - w->serverHeight () - (y - workArea.y ()) - BOTTOM_BORDER (w) - ps->optionGetPadBottom (); break; case PutBottomLeft: /* bottom left corner */ dx = -(x - workArea.x ()) + LEFT_BORDER (w) + ps->optionGetPadLeft (); dy = workArea.height () - w->serverHeight () - (y - workArea.y ()) - BOTTOM_BORDER (w) - ps->optionGetPadBottom (); break; case PutEmptyBottomLeft: /* bottom left corner */ workArea.setX (workArea.x () - LEFT_BORDER (w)); workArea.setY (workArea.y () + BOTTOM_BORDER (w)); dx = -(x - workArea.x ()) + LEFT_BORDER (w) + ps->optionGetPadLeft (); dy = workArea.height () - w->serverHeight () - (y - workArea.y ()) - BOTTOM_BORDER (w) - ps->optionGetPadBottom (); break; case PutRestore: /* back to last position */ dx = pw->lastX - x; dy = pw->lastY - y; break; case PutViewport: { int vpX, vpY, hDirection, vDirection; /* get the viewport to move to from the options list */ viewport = CompOption::getIntOptionNamed (option, "viewport", -1); /* if viewport wasn't supplied, bail out */ if (viewport < 0) return result; /* split 1D viewport value into 2D x and y viewport */ vpX = viewport % s->vpSize ().width (); vpY = viewport / s->vpSize ().width (); if (vpY > (int) s->vpSize ().height ()) vpY = s->vpSize ().height () - 1; /* take the shortest horizontal path to the destination viewport */ hDirection = (vpX - s->vp ().x ()); if (hDirection > (int) s->vpSize ().width () / 2) hDirection = (hDirection - s->vpSize ().width ()); else if (hDirection < - ((int) s->vpSize ().width ()) / 2) hDirection = (hDirection + s->vpSize ().width ()); /* we need to do this for the vertical destination viewport too */ vDirection = (vpY - s->vp ().y ()); if (vDirection > (int) s->vpSize ().height () / 2) vDirection = (vDirection - s->vpSize ().height ()); else if (vDirection < -((int) s->vpSize ().height ()) / 2) vDirection = (vDirection + s->vpSize ().height ()); dx = s->width () * hDirection; dy = s->height () * vDirection; break; } case PutViewportLeft: /* move to the viewport on the left */ dx = (s->vp ().x () >= 1) ? -s->width () : 0; dy = 0; break; case PutViewportRight: /* move to the viewport on the right */ dx = (s->vp ().x () < s->vpSize ().width ()-1) ? s->width () : 0; dy = 0; break; case PutViewportUp: /* move to the viewport above */ dx = 0; dy = (s->vp ().y () >= 1) ? -s->height () : 0; break; case PutViewportDown: /* move to the viewport below */ dx = 0; dy = (s->vp ().y () < s->vpSize ().height ()-1) ? s->height () : 0; break; case PutPreviousOutput: case PutNextOutput: { int outputNum, currentNum; int nOutputDev = s->outputDevs ().size (); CompOutput *currentOutput, *newOutput; if (nOutputDev < 2) return result; currentNum = getOutputForWindow (w); outputNum = (currentNum + (type == PutNextOutput ? 1 : -1)) % nOutputDev; if (outputNum < 0) outputNum += nOutputDev; outputNum = CompOption::getIntOptionNamed (option,"output", outputNum); if (outputNum >= nOutputDev) return result; currentOutput = &s->outputDevs ().at(currentNum); newOutput = &s->outputDevs ().at(outputNum); /* move by the distance of the output center points */ dx = (newOutput->x1 () + newOutput->width () / 2) - (currentOutput->x1 () + currentOutput->width () / 2); dy = (newOutput->y1 () + newOutput->height () / 2) - (currentOutput->y1 () + currentOutput->height () / 2); /* update work area for new output */ workArea = newOutput->workArea (); } break; case PutAbsolute: /* move the window to an exact position */ if (posX < 0) /* account for a specified negative position, like geometry without (-0) */ dx = posX + s->width () - w->serverWidth () - x - RIGHT_BORDER (w); else dx = posX - x + LEFT_BORDER (w); if (posY < 0) /* account for a specified negative position, like geometry without (-0) */ dy = posY + s->height () - w->height () - y - BOTTOM_BORDER (w); else dy = posY - y + TOP_BORDER (w); break; case PutRelative: /* move window by offset */ dx = posX; dy = posY; break; case PutPointer: { /* move the window to the pointers position * using the current quad of the screen to determine * which corner to move to the pointer */ int rx, ry; Window root, child; int winX, winY; unsigned int pMask; /* get the pointers position from the X server */ if (XQueryPointer (s->dpy (), w->id (), &root, &child, &rx, &ry, &winX, &winY, &pMask)) { if (ps->optionGetWindowCenter ()) { /* window center */ dx = rx - HALF_WIDTH (w) - x; dy = ry - HALF_HEIGHT (w) - y; } else if (rx < (int) s->workArea ().width () / 2 && ry < (int) s->workArea ().height () / 2) { /* top left quad */ dx = rx - x + LEFT_BORDER (w); dy = ry - y + TOP_BORDER (w); } else if (rx < (int) s->workArea ().width () / 2 && ry >= (int) s->workArea ().height () / 2) { /* bottom left quad */ dx = rx - x + LEFT_BORDER (w); dy = ry - w->height () - y - BOTTOM_BORDER (w); } else if (rx >= (int) s->workArea ().width () / 2 && ry < (int) s->workArea ().height () / 2) { /* top right quad */ dx = rx - w->width () - x - RIGHT_BORDER (w); dy = ry - y + TOP_BORDER (w); } else { /* bottom right quad */ dx = rx - w->width () - x - RIGHT_BORDER (w); dy = ry - w->height () - y - BOTTOM_BORDER (w); } } else { dx = dy = 0; } } break; default: /* if an unknown type is specified, do nothing */ dx = dy = 0; break; } if ((dx || dy) && ps->optionGetAvoidOffscreen () && !(w->type () & CompWindowTypeFullscreenMask)) { /* avoids window borders offscreen, but allow full viewport movements */ int inDx, dxBefore; int inDy, dyBefore; CompWindowExtents extents, area; inDx = dxBefore = dx % s->width (); inDy = dyBefore = dy % s->height (); extents.left = x + inDx - LEFT_BORDER (w); extents.top = y + inDy - TOP_BORDER (w); extents.right = x + inDx + w->serverWidth () + RIGHT_BORDER (w); extents.bottom = y + inDy + w->serverHeight () + BOTTOM_BORDER (w); area.left = workArea.left () + ps->optionGetPadLeft (); area.top = workArea.top () + ps->optionGetPadTop (); area.right = workArea.right () - ps->optionGetPadRight (); area.bottom = workArea.bottom () - ps->optionGetPadBottom (); if (extents.left < area.left) { inDx += area.left - extents.left; } else if (w->serverWidth () <= workArea.width () && extents.right > area.right) { inDx += area.right - extents.right; } if (extents.top < area.top) { inDy += area.top - extents.top; } else if (w->serverHeight () <= workArea.height () && extents.bottom > area.bottom) { inDy += area.bottom - extents.bottom; } /* apply the change */ dx += inDx - dxBefore; dy += inDy - dyBefore; } result.set (dx, dy); return result; } void PutScreen::preparePaint (int ms) { PUT_SCREEN (screen); if (ps->moreAdjust && ps->grabIndex) { int steps; float amount, chunk; amount = ms * 0.025f * ps->optionGetSpeed (); steps = amount / (0.5f * ps->optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float)steps; while (steps--) { Window endAnimationWindow = None; ps->moreAdjust = 0; foreach(CompWindow *w, screen->windows ()) { PUT_WINDOW (w); if (pw->adjust) { pw->adjust = adjustVelocity (w); ps->moreAdjust |= pw->adjust; pw->tx += pw->xVelocity * chunk; pw->ty += pw->yVelocity * chunk; if (!pw->adjust) { /* animation done */ finishWindowMovement (w); if (w->id () == screen->activeWindow ()) endAnimationWindow = w->id (); pw->tx = pw->ty = 0; } } } if (!ps->moreAdjust) { /* unfocus moved window if enabled */ if (ps->optionGetUnfocusWindow ()) screen->focusDefaultWindow (); else if (endAnimationWindow) screen->sendWindowActivationRequest (endAnimationWindow); break; } } } cScreen->preparePaint (ms); } /* This is the guts of the paint function. You can transform the way the * entire output is painted or you can just draw things on screen with openGL. * The unsigned int here is a mask for painting the screen, see opengl/opengl.h * on how you can change it */ bool PutScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; PUT_SCREEN (screen); if (ps->moreAdjust) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; status = gScreen->glPaintOutput (attrib, transform, region, output, mask); return status; } void PutScreen::donePaint () { PUT_SCREEN (screen); if (ps->moreAdjust && ps->grabIndex) { cScreen->damageScreen (); // FIXME } else { if (ps->grabIndex) { /* release the screen grab */ screen->removeGrab (ps->grabIndex, NULL); ps->grabIndex = 0; } } cScreen->donePaint (); } /* This is our event handler. It directly hooks into the screen's X Event handler and allows us to handle * our raw X Events */ void PutScreen::handleEvent (XEvent *event) { switch (event->type) { /* handle client events */ case ClientMessage: /* accept the custom atom for putting windows */ if (event->xclient.message_type == compizPutWindowAtom) { CompWindow *w; w = screen->findWindow (event->xclient.window); if (w) { /* * get the values from the xclientmessage event and populate * the options for put initiate * * the format is 32 * and the data is * l[0] = x position - unused (for future PutExact) * l[1] = y position - unused (for future PutExact) * l[2] = viewport number * l[3] = put type, int value from enum * l[4] = output number */ CompOption::Vector opt (5); CompOption::Value value0 = (int) event->xclient.window; opt.push_back (CompOption ( "window",CompOption::TypeInt)); opt[0].set (value0); CompOption::Value value1 = (int) event->xclient.data.l[0]; opt.push_back (CompOption ( "x",CompOption::TypeInt)); opt[1].set (value1); CompOption::Value value2 = (int) event->xclient.data.l[1]; opt.push_back (CompOption ( "y",CompOption::TypeInt)); opt[2].set (value2); CompOption::Value value3 = (int) event->xclient.data.l[2]; opt.push_back (CompOption ( "viewport",CompOption::TypeInt)); opt[3].set (value3); CompOption::Value value4 = (int) event->xclient.data.l[4]; opt.push_back (CompOption ( "output",CompOption::TypeInt)); opt[4].set (value4); initiateCommon (NULL, 0, opt, (PutType) event->xclient.data.l[3]); } } break; default: break; } screen->handleEvent (event); } /* This gets called whenever the window needs to be repainted. * WindowPaintAttrib gives you some attributes like brightness/saturation etc * to play around with. GLMatrix is the window's transformation matrix. The * unsigned int is the mask, have a look at opengl.h on what you can do * with it */ bool PutWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { GLMatrix wTransform (transform); if (adjust) { wTransform.translate (tx, ty, 0.0f); mask |= PAINT_WINDOW_TRANSFORMED_MASK; } return gWindow->glPaint (attrib, wTransform, region, mask); } /* * initiate action callback */ bool PutScreen::initiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &option, PutType type) { CompWindow *w; Window xid; xid = CompOption::getIntOptionNamed (option, "window", 0); if (!xid) xid = screen->activeWindow (); w = screen->findWindow (xid); if (w) { CompScreen *s = screen; CompPoint delta; /* we don't want to do anything with override redirect windows */ if (w->overrideRedirect ()) return false; /* we don't want to be moving the desktop and docks */ if (w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) return false; /* don't move windows without move action */ if (!(w->actions () & CompWindowActionMoveMask)) return false; /* only allow movement of fullscreen windows to next output */ if ((type != PutNextOutput && type != PutPreviousOutput) && (w->type () & CompWindowTypeFullscreenMask)) { return false; } /* * handle the put types */ delta = getDistance (w, type, option); /* don't do anything if there is nothing to do */ if (!delta.x () && !delta.y ()) return true; if (!grabIndex) { /* this will keep put from working while something else has a screen grab */ if (s->otherGrabExist ("put", NULL)) return false; /* we are ok, so grab the screen */ grabIndex = s->pushGrab (s->invisibleCursor (), "put"); } if (grabIndex) { PUT_WINDOW (w); lastWindow = w->id (); /* save the windows position in the saveMask * this is used when unmaximizing the window */ if (w->saveMask () & CWX) w->saveWc ().x += delta.x (); if (w->saveMask () & CWY) w->saveWc ().y += delta.y (); /* Make sure everyting starts out at the windows current position */ pw->lastX = w->x () + pw->tx; pw->lastY = w->y () + pw->ty; pw->targetX = pw->lastX + delta.x (); pw->targetY = pw->lastY + delta.y (); /* mark for animation */ pw->adjust = true; moreAdjust = true; /* cause repainting */ pw->cWindow->addDamage (); } } /* tell event.c handleEvent to not call XAllowEvents */ return false; } PutType PutScreen::typeFromString (const CompString &type) { if (type == "absolute") return PutAbsolute; else if (type == "relative") return PutRelative; else if (type == "pointer") return PutPointer; else if (type == "viewport") return (PutType) PutViewport; else if (type == "viewportleft") return PutViewportLeft; else if (type == "viewportright") return PutViewportRight; else if (type == "viewportup") return PutViewportUp; else if (type == "viewportdown") return PutViewportDown; else if (type == "previousoutput") return PutPreviousOutput; else if (type == "nextoutput") return PutNextOutput; else if (type == "restore") return PutRestore; else if (type == "bottomleft") return PutBottomLeft; else if (type == "emptybottomleft") return PutEmptyBottomLeft; else if (type == "left") return PutLeft; else if (type == "emptyleft") return PutEmptyLeft; else if (type == "topleft") return PutTopLeft; else if (type == "emptytopleft") return PutEmptyTopLeft; else if (type == "top") return PutTop; else if (type == "emptytop") return PutEmptyTop; else if (type == "topright") return PutTopRight; else if (type == "emptytopright") return PutEmptyTopRight; else if (type == "right") return PutRight; else if (type == "emptyright") return PutEmptyRight; else if (type == "bottomright") return PutBottomRight; else if (type == "emptybottomright") return PutEmptyBottomRight; else if (type == "bottom") return PutBottom; else if (type == "emptybottom") return PutEmptyBottom; else if (type == "center") return PutCenter; else if (type == "emptycenter") return PutEmptyCenter; else return PutUnknown; } bool PutScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector &option) { PutType type = PutUnknown; CompString typeString; typeString = CompOption::getStringOptionNamed (option, "type"); if (!typeString.empty ()) type = typeFromString (typeString); /* if (type == (PutType) PutViewport) return toViewport (action, state, option); else*/ return initiateCommon (action, state, option,type); } bool PutScreen::toViewport (CompAction *action, CompAction::State state, CompOption::Vector &option, int vp) { unsigned int index; if (CompOption::findOption (option, "viewport", &index) == NULL) { int last = option.size (); option.resize(last+1); option[last].setName ("viewport",CompOption::TypeInt); option[last].value ().set (vp-1); } else { option[index].value ().set (vp-1); } return initiateCommon (action, state, option, (PutType) PutViewport); } PutScreen::PutScreen (CompScreen *screen) : PluginClassHandler (screen), PutOptions (), screen (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), lastWindow (None), lastType (PutUnknown), moreAdjust (false), grabIndex (0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); compizPutWindowAtom = XInternAtom(screen->dpy (), "_COMPIZ_PUT_WINDOW", 0); optionSetPutPutInitiate (boost::bind (&PutScreen::initiate, this, _1, _2, _3)); #define setAction(action, type) \ optionSet##action##KeyInitiate (boost::bind (&PutScreen::initiateCommon, \ this, _1,_2,_3,type)); \ optionSet##action##ButtonInitiate (boost::bind (&PutScreen::initiateCommon,\ this, _1,_2,_3,type)) setAction (PutRestore, PutRestore); setAction (PutPointer, PutPointer); setAction (PutNextOutput, PutNextOutput); setAction (PutPreviousOutput, PutPreviousOutput); setAction (PutCenter, PutCenter); setAction (PutEmptyCenter, PutEmptyCenter); setAction (PutLeft, PutLeft); setAction (PutEmptyLeft, PutEmptyLeft); setAction (PutRight, PutRight); setAction (PutEmptyRight, PutEmptyRight); setAction (PutTop, PutTop); setAction (PutEmptyTop, PutEmptyTop); setAction (PutBottom, PutBottom); setAction (PutEmptyBottom, PutEmptyBottom); setAction (PutTopleft, PutTopLeft); setAction (PutEmptyTopleft, PutEmptyTopLeft); setAction (PutTopright, PutTopRight); setAction (PutEmptyTopright, PutEmptyTopRight); setAction (PutBottomleft, PutBottomLeft); setAction (PutEmptyBottomleft, PutEmptyBottomLeft); setAction (PutBottomright, PutBottomRight); setAction (PutEmptyBottomright, PutEmptyBottomRight); #define setViewportAction(num) \ optionSetPutViewport##num##KeyInitiate(boost::bind (&PutScreen::toViewport,\ this, _1,_2,_3,num)); setViewportAction(1); setViewportAction(2); setViewportAction(3); setViewportAction(4); setViewportAction(5); setViewportAction(6); setViewportAction(7); setViewportAction(8); setViewportAction(9); setViewportAction(10); setViewportAction(11); setViewportAction(12); #define setDirectionAction(action) \ optionSet##action##KeyInitiate(boost::bind (&PutScreen::initiateCommon, \ this, _1,_2,_3,action)) setDirectionAction(PutViewportLeft); setDirectionAction(PutViewportRight); setDirectionAction(PutViewportUp); setDirectionAction(PutViewportDown); } PutWindow::PutWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), xVelocity (0), yVelocity (0), tx (0), ty (0), lastX (window->serverX ()), lastY (window->serverY ()), adjust (false) { WindowInterface::setHandler (window); CompositeWindowInterface::setHandler (cWindow); GLWindowInterface::setHandler (gWindow); } bool PutPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } compiz-0.9.11+14.04.20140409/plugins/put/src/put.h0000644000015301777760000001135412321343002021537 0ustar pbusernogroup00000000000000/* * Copyright (c) 2006 Darryll Truchan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "put_options.h" enum PutType { PutUnknown = 0, PutBottomLeft = 1, PutBottom = 2, PutBottomRight = 3, PutLeft = 4, PutCenter = 5, PutRight = 6, PutTopLeft = 7, PutTop = 8, PutTopRight = 9, PutRestore = 10, PutViewport = 11, PutViewportLeft = 12, PutViewportRight = 13, PutAbsolute = 14, PutPointer = 15, PutViewportUp = 16, PutViewportDown = 17, PutRelative = 18, PutNextOutput = 19, PutPreviousOutput = 20, PutEmptyBottomLeft = 21, PutEmptyBottom = 22, PutEmptyBottomRight = 23, PutEmptyLeft = 24, PutEmptyCenter = 25, PutEmptyRight = 26, PutEmptyTopLeft = 27, PutEmptyTop = 28, PutEmptyTopRight, }; class PutScreen : public PluginClassHandler , public PutOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: PutScreen (CompScreen *s); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void donePaint (); void handleEvent (XEvent *); bool initiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &options, PutType type); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector &option); bool toViewport (CompAction *action, CompAction::State state, CompOption::Vector &option, int vp); private: CompRegion emptyRegion (CompWindow *window, const CompRect &outputRect); bool boxCompare (const CompRect &a, const CompRect &b); CompRect extendBox (CompWindow *w, const CompRect &tmp, const CompRegion &r, bool xFirst, bool left, bool right, bool up, bool down); CompRect findRect (CompWindow *w, const CompRegion &r, bool left, bool right, bool up, bool down); unsigned int computeResize (CompWindow *w, XWindowChanges *xwc, bool left, bool right, bool up, bool down); int adjustVelocity (CompWindow *w); void finishWindowMovement (CompWindow *w); CompPoint getDistance (CompWindow *w, PutType type, CompOption::Vector &option); unsigned int getOutputForWindow (CompWindow *w); PutType typeFromString (const CompString &); /* Data */ CompScreen *screen; CompositeScreen *cScreen; GLScreen *gScreen; Atom compizPutWindowAtom; Window lastWindow; PutType lastType; int moreAdjust; CompScreen::GrabHandle grabIndex; friend class PutWindow; }; class PutWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: PutWindow (CompWindow *window); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); private: CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; GLfloat xVelocity, yVelocity; /* animation velocity */ GLfloat tx, ty; /* animation translation */ int lastX, lastY; /* starting position */ int targetX, targetY; /* target of the animation */ bool adjust; /* animation flag */ friend class PutScreen; }; #define PUT_SCREEN(s) \ PutScreen *ps = PutScreen::get (s); #define PUT_WINDOW(w) \ PutWindow *pw = PutWindow::get (w); class PutPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; compiz-0.9.11+14.04.20140409/plugins/text/0000755000015301777760000000000012321344021020141 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/text/compiz-text.pc.in0000644000015301777760000000044112321343002023352 0ustar pbusernogroup00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-text Description: Text plugin for compiz Version: @VERSION@ Requires: compiz pangocairo cairo cairo-xlib-xrender Libs: -L${libdir}/compiz -ltext Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compiz compiz-0.9.11+14.04.20140409/plugins/text/text.xml.in0000644000015301777760000000062312321343002022253 0ustar pbusernogroup00000000000000 <_short>Text <_long>Render text to texture Image Loading opengl composite opengl decor compiz-0.9.11+14.04.20140409/plugins/text/CMakeLists.txt0000644000015301777760000000022512321343002022676 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (text PLUGINDEPS composite opengl PKGDEPS pangocairo cairo cairo-xlib-xrender) compiz-0.9.11+14.04.20140409/plugins/text/src/0000755000015301777760000000000012321344021020730 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/text/src/private.h0000644000015301777760000000535112321343002022555 0ustar pbusernogroup00000000000000/* * Compiz text plugin * Description: Adds text to pixmap support to Compiz. * * private.h * * Copyright: (C) 2006-2007 Patrick Niklaus, Danny Baumann, Dennis Kasprzyk * Authors: Patrick Niklaus * Danny Baumann * Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include #include #include class PrivateTextScreen; extern template class PluginClassHandler ; class PrivateTextScreen : public PluginClassHandler , public ScreenInterface, public GLScreenInterface { public: PrivateTextScreen (CompScreen *); ~PrivateTextScreen (); CompString getWindowName (Window id); GLScreen *gScreen; private: Atom visibleNameAtom; Atom utf8StringAtom; Atom wmNameAtom; CompString getUtf8Property (Window id, Atom atom); CompString getTextProperty (Window id, Atom atom); }; class TextSurface { public: TextSurface (); ~TextSurface (); bool valid () const; bool render (const CompText::Attrib &attrib, const CompString &text); int mWidth; int mHeight; Pixmap mPixmap; private: bool initCairo (int w, int h); bool update (int w, int h); void drawBackground (int x, int y, int width, int height, int radius); cairo_t *cr; cairo_surface_t *surface; PangoLayout *layout; XRenderPictFormat *format; PangoFontDescription *font; Screen *scrn; }; #define TEXT_SCREEN(screen) \ PrivateTextScreen *ts = PrivateTextScreen::get (screen); class TextPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); void fini (); }; compiz-0.9.11+14.04.20140409/plugins/text/src/text.cpp0000644000015301777760000003300712321343002022421 0ustar pbusernogroup00000000000000/* * Compiz text plugin * Description: Adds text to pixmap support to Compiz. * * text.cpp * * Copyright: (C) 2006-2007 Patrick Niklaus, Danny Baumann, Dennis Kasprzyk * Authors: Patrick Niklaus * Danny Baumann * Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "private.h" static const double PI = 3.14159265359f; COMPIZ_PLUGIN_20090315 (text, TextPluginVTable); CompString PrivateTextScreen::getUtf8Property (Window id, Atom atom) { Atom type; int format; unsigned long nItems, bytesAfter; char *val; CompString retval; int result = XGetWindowProperty (screen->dpy (), id, atom, 0L, 65536, False, utf8StringAtom, &type, &format, &nItems, &bytesAfter, (unsigned char **) &val); if (result != Success) return retval; if (type == utf8StringAtom && format == 8 && val && nItems > 0) { char valueString[nItems + 1]; strncpy (valueString, val, nItems); valueString[nItems] = 0; retval = valueString; } if (val) XFree (val); return retval; } CompString PrivateTextScreen::getTextProperty (Window id, Atom atom) { XTextProperty text; CompString retval; text.nitems = 0; if (XGetTextProperty (screen->dpy (), id, &text, atom) && text.value) { char valueString[text.nitems + 1]; strncpy (valueString, (char *) text.value, text.nitems); valueString[text.nitems] = 0; retval = valueString; XFree (text.value); } return retval; } CompString PrivateTextScreen::getWindowName (Window id) { CompString name = getUtf8Property (id, visibleNameAtom); if (name.empty ()) name = getUtf8Property (id, wmNameAtom); if (name.empty ()) name = getTextProperty (id, XA_WM_NAME); return name; } /* Actual text rendering functions */ /* * Draw a rounded rectangle path */ void TextSurface::drawBackground (int x, int y, int width, int height, int radius) { int x0 = x; int y0 = y; int x1 = x + width; int y1 = y + height; const float halfPi = PI / 2.0f; const float triHalfPi = halfPi * 3; cairo_new_path (cr); cairo_arc (cr, x0 + radius, y1 - radius, radius, halfPi, PI); cairo_line_to (cr, x0, y0 + radius); cairo_arc (cr, x0 + radius, y0 + radius, radius, PI, triHalfPi); cairo_line_to (cr, x1 - radius, y0); cairo_arc (cr, x1 - radius, y0 + radius, radius, triHalfPi, 2 * PI); cairo_line_to (cr, x1, y1 - radius); cairo_arc (cr, x1 - radius, y1 - radius, radius, 0, halfPi); cairo_close_path (cr); } bool TextSurface::initCairo (int width, int height) { Display *dpy = screen->dpy (); mPixmap = None; if (width > 0 && height > 0) mPixmap = XCreatePixmap (dpy, screen->root (), width, height, 32); mWidth = width; mHeight = height; if (!mPixmap) { compLogMessage ("text", CompLogLevelError, "Couldn't create %d x %d pixmap.", width, height); return false; } surface = cairo_xlib_surface_create_with_xrender_format (dpy, mPixmap, scrn, format, width, height); if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS) { compLogMessage ("text", CompLogLevelError, "Couldn't create surface."); return false; } cr = cairo_create (surface); if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) { compLogMessage ("text", CompLogLevelError, "Couldn't create cairo context."); return false; } return true; } bool TextSurface::update (int width, int height) { Display *dpy = screen->dpy (); cairo_surface_destroy (surface); surface = NULL; cairo_destroy (cr); cr = NULL; XFreePixmap (dpy, mPixmap); mPixmap = None; return initCairo (width, height); } bool TextSurface::render (const CompText::Attrib &attrib, const CompString &text) { if (!valid ()) return false; pango_font_description_set_family (font, attrib.family); pango_font_description_set_absolute_size (font, attrib.size * PANGO_SCALE); pango_font_description_set_style (font, PANGO_STYLE_NORMAL); if (attrib.flags & CompText::StyleBold) pango_font_description_set_weight (font, PANGO_WEIGHT_BOLD); if (attrib.flags & CompText::StyleItalic) pango_font_description_set_style (font, PANGO_STYLE_ITALIC); pango_layout_set_font_description (layout, font); if (attrib.flags & CompText::Ellipsized) pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); pango_layout_set_auto_dir (layout, false); pango_layout_set_text (layout, text.c_str (), -1); int width, height; pango_layout_get_pixel_size (layout, &width, &height); if (attrib.flags & CompText::WithBackground) { width += 2 * attrib.bgHMargin; height += 2 * attrib.bgVMargin; } width = MIN (attrib.maxWidth, width); height = MIN (attrib.maxHeight, height); /* update the size of the pango layout */ int layoutWidth = attrib.maxWidth; if (attrib.flags & CompText::WithBackground) layoutWidth -= 2 * attrib.bgHMargin; pango_layout_set_width (layout, layoutWidth * PANGO_SCALE); if (!update (width, height)) return false; pango_cairo_update_layout (cr, layout); cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); if (attrib.flags & CompText::WithBackground) { drawBackground (0, 0, width, height, MIN (attrib.bgHMargin, attrib.bgVMargin)); cairo_set_source_rgba (cr, attrib.bgColor[0] / 65535.0, attrib.bgColor[1] / 65535.0, attrib.bgColor[2] / 65535.0, attrib.bgColor[3] / 65535.0); cairo_fill (cr); cairo_move_to (cr, attrib.bgHMargin, attrib.bgVMargin); } cairo_set_source_rgba (cr, attrib.color[0] / 65535.0, attrib.color[1] / 65535.0, attrib.color[2] / 65535.0, attrib.color[3] / 65535.0); pango_cairo_show_layout (cr, layout); return true; } bool TextSurface::valid () const { return scrn && format && layout && font && cr && cairo_status (cr) == CAIRO_STATUS_SUCCESS && surface && cairo_surface_status (surface) == CAIRO_STATUS_SUCCESS; } TextSurface::TextSurface () : mWidth (0), mHeight (0), mPixmap (None), cr (NULL), surface (NULL), layout (NULL), format (NULL), font (NULL), scrn (NULL) { Display *dpy = screen->dpy (); scrn = ScreenOfDisplay (dpy, screen->screenNum ()); if (!scrn) { compLogMessage ("text", CompLogLevelError, "Couldn't get screen for %d.", screen->screenNum ()); return; } format = XRenderFindStandardFormat (dpy, PictStandardARGB32); if (!format) { compLogMessage ("text", CompLogLevelError, "Couldn't get format."); return; } if (!initCairo (1, 1)) return; /* init pango */ layout = pango_cairo_create_layout (cr); if (!layout) { compLogMessage ("text", CompLogLevelError, "Couldn't create pango layout."); return; } font = pango_font_description_new (); if (!font) { compLogMessage ("text", CompLogLevelError, "Couldn't create font description."); return; } } TextSurface::~TextSurface () { if (layout) g_object_unref (layout); if (surface) cairo_surface_destroy (surface); if (cr) cairo_destroy (cr); if (font) pango_font_description_free (font); } void CompText::clear () { if (pixmap) XFreePixmap (screen->dpy (), pixmap); width = 0; height = 0; } bool CompText::renderText (CompString text, const Attrib &attrib) { TextSurface surface; bool retval = false; TEXT_SCREEN (screen); if (!ts || !surface.valid () || (!(attrib.flags & NoAutoBinding) && !ts->gScreen)) return false; if (surface.render (attrib, text)) { if (!(attrib.flags & NoAutoBinding)) { texture = GLTexture::bindPixmapToTexture (surface.mPixmap, surface.mWidth, surface.mHeight, 32); retval = !texture.empty (); } else retval = true; } if (!retval && surface.mPixmap) { XFreePixmap (screen->dpy (), surface.mPixmap); return retval; } clear (); pixmap = surface.mPixmap; width = surface.mWidth; height = surface.mHeight; return retval; } bool CompText::renderWindowTitle (Window window, bool withViewportNumber, const CompText::Attrib &attrib) { TEXT_SCREEN (screen); if (!ts) return false; CompString text; if (withViewportNumber) { CompString title = ts->getWindowName (window); if (!title.empty ()) { CompWindow *w = screen->findWindow (window); if (w) { CompPoint winViewport = w->defaultViewport (); CompSize viewportSize = screen->vpSize (); int viewport = winViewport.y () * viewportSize.width () + winViewport.x () + 1; text = compPrintf ("%s -[%d]-", title.c_str (), viewport); } else text = title; } } else text = ts->getWindowName (window); if (text.empty ()) return false; return renderText (text, attrib); } Pixmap CompText::getPixmap () { Pixmap retval = None; if (texture.empty ()) { retval = pixmap; pixmap = None; } return retval; } int CompText::getWidth () const { return width; } int CompText::getHeight () const { return height; } void CompText::draw (const GLMatrix &transform, float x, float y, float alpha) const { if (texture.empty ()) return; GLint oldBlendSrc, oldBlendDst; #ifdef USE_GLES GLint oldBlendSrcAlpha, oldBlendDstAlpha; glGetIntegerv (GL_BLEND_SRC_RGB, &oldBlendSrc); glGetIntegerv (GL_BLEND_DST_RGB, &oldBlendDst); glGetIntegerv (GL_BLEND_SRC_ALPHA, &oldBlendSrcAlpha); glGetIntegerv (GL_BLEND_DST_ALPHA, &oldBlendDstAlpha); #else glGetIntegerv (GL_BLEND_SRC, &oldBlendSrc); glGetIntegerv (GL_BLEND_DST, &oldBlendDst); GLboolean wasBlend = glIsEnabled (GL_BLEND); if (!wasBlend) glEnable (GL_BLEND); #endif glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); GLushort colorData[4]; GLfloat textureData[8]; GLfloat vertexData[12]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLTexture *tex; GLTexture::Matrix m; GLfloat xPlusWidth = x + width; GLfloat yMinusHeight = y - height; colorData[0] = alpha * 65535; colorData[1] = alpha * 65535; colorData[2] = alpha * 65535; colorData[3] = alpha * 65535; for (unsigned int i = 0; i < texture.size (); ++i) { tex = texture[i]; m = tex->matrix (); tex->enable (GLTexture::Good); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = x; vertexData[1] = yMinusHeight; vertexData[2] = 0; vertexData[3] = x; vertexData[4] = y; vertexData[5] = 0; vertexData[6] = xPlusWidth; vertexData[7] = yMinusHeight; vertexData[8] = 0; vertexData[9] = xPlusWidth; vertexData[10] = y; vertexData[11] = 0; textureData[0] = COMP_TEX_COORD_X (m, 0); textureData[1] = COMP_TEX_COORD_Y (m, 0); textureData[2] = COMP_TEX_COORD_X (m, 0); textureData[3] = COMP_TEX_COORD_Y (m, height); textureData[4] = COMP_TEX_COORD_X (m, width); textureData[5] = COMP_TEX_COORD_Y (m, 0); textureData[6] = COMP_TEX_COORD_X (m, width); textureData[7] = COMP_TEX_COORD_Y (m, height); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->end (); streamingBuffer->render (transform); tex->disable (); } #ifdef USE_GLES glBlendFuncSeparate (oldBlendSrc, oldBlendDst, oldBlendSrcAlpha, oldBlendDstAlpha); #else if (!wasBlend) glDisable (GL_BLEND); glBlendFunc (oldBlendSrc, oldBlendDst); #endif } CompText::CompText () : width (0), height (0), pixmap (None) { } CompText::~CompText () { if (pixmap) XFreePixmap (screen->dpy (), pixmap); } template class PluginClassHandler ; PrivateTextScreen::PrivateTextScreen (CompScreen *screen) : PluginClassHandler (screen), gScreen (GLScreen::get (screen)) { visibleNameAtom = XInternAtom (screen->dpy (), "_NET_WM_VISIBLE_NAME", 0); utf8StringAtom = XInternAtom (screen->dpy (), "UTF8_STRING", 0); wmNameAtom = XInternAtom (screen->dpy (), "_NET_WM_NAME", 0); } PrivateTextScreen::~PrivateTextScreen () { } bool TextPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) { CompPrivate p; p.uval = COMPIZ_TEXT_ABI; screen->storeValue ("text_ABI", p); return true; } return false; } void TextPluginVTable::fini () { screen->eraseValue ("text_ABI"); } compiz-0.9.11+14.04.20140409/plugins/text/include/0000755000015301777760000000000012321344021021564 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/text/include/text/0000755000015301777760000000000012321344021022550 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/plugins/text/include/text/text.h0000644000015301777760000000520712321343002023707 0ustar pbusernogroup00000000000000/* * text.h - adds text image support to compiz. * Copyright: (C) 2006 Patrick Niklaus * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #ifndef _COMPIZ_TEXT_H #define _COMPIZ_TEXT_H #define COMPIZ_TEXT_ABI 20090905 class CompText { public: /** * Flags to be passed into the flags field of CompTextAttrib */ typedef enum { StyleBold = (1 << 0), /**< render the text in bold */ StyleItalic = (1 << 1), /**< render the text italic */ Ellipsized = (1 << 2), /**< ellipsize the text if the specified maximum size is too small */ WithBackground = (1 << 3), /**< render a rounded rectangle as background behind the text */ NoAutoBinding = (1 << 4) /**< do not automatically bind the rendered text pixmap to a texture */ } Flags; typedef struct { const char *family; /**< font family */ int size; /**< font size in points */ unsigned short color[4]; /**< font color (RGBA) */ unsigned int flags; /**< rendering flags, see above */ int maxWidth; /**< maximum width of the generated pixmap */ int maxHeight; /**< maximum height of the generated pixmap */ int bgHMargin; /**< horizontal margin in pixels (offset of text into background) */ int bgVMargin; /**< vertical margin */ unsigned short bgColor[4]; /**< background color (RGBA) */ } Attrib; CompText (); ~CompText(); bool renderText (CompString text, const Attrib &attrib); bool renderWindowTitle (Window window, bool renderViewportNumber, const Attrib &attrib); void clear (); Pixmap getPixmap (); int getWidth () const; int getHeight () const; void draw (const GLMatrix &transform, float x, float y, float alpha) const; private: int width; int height; Pixmap pixmap; GLTexture::List texture; }; #endif compiz-0.9.11+14.04.20140409/.gitignore0000644000015301777760000000001612321343002017457 0ustar pbusernogroup00000000000000po/compiz.pot compiz-0.9.11+14.04.20140409/xslt/0000755000015301777760000000000012321344021016466 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/xslt/default_plugins.xslt0000644000015301777760000000520412321343002022566 0ustar pbusernogroup00000000000000 compiz-0.9.11+14.04.20140409/xslt/compiz_gconf_schemas.xslt0000644000015301777760000003466212321343002023573 0ustar pbusernogroup00000000000000 /apps/compiz-1 /schemas compiz-1 #000000ff [] [] false Disabled int float bool list bool string ( - match ) = , ( - match ) = , 0 , , ff 0000 00 | /plugins/ /general /screen0/options/ compiz-0.9.11+14.04.20140409/xslt/bcop.xslt0000644000015301777760000015430312321343002020331 0ustar pbusernogroup00000000000000 header #ifndef _ _OPTIONS_H #define _ _OPTIONS_H #include <core/core.h> #endif #include <core/core.h> #include " _options.h" inline int Options:: { return mOptions[ ].value ().i (); } inline float Options:: { return mOptions[ ].value ().f (); } inline bool Options:: { return mOptions[ ].value ().b (); } inline CompString Options:: { return mOptions[ ].value ().s (); } inline CompMatch & Options:: { return mOptions[ ].value ().match (); } inline unsigned short * Options:: { return mOptions[ ].value ().c (); } inline unsigned short Options::optionGet Red () { return mOptions[ ].value ().c ()[0]; } inline unsigned short Options::optionGet Green () { return mOptions[ ].value ().c ()[1]; } inline unsigned short Options::optionGet Blue () { return mOptions[ ].value ().c ()[2]; } inline unsigned short Options::optionGet Alpha () { return mOptions[ ].value ().c ()[3]; } inline CompAction & Options:: { return mOptions[ ].value ().action (); } inline void Options::optionSet Initiate (CompAction::CallBack init) { mOptions[ ].value ().action ().setInitiate (init); } inline void Options::optionSet Terminate (CompAction::CallBack term) { mOptions[ ].value ().action ().setTerminate (term); } inline CompOption::Value::Vector & Options:: { return mOptions[ ].value ().list (); } inline unsigned int Options::optionGet Mask () { return m Mask; } inline void Options::optionSet Notify ( Options::ChangeNotify notify) { mNotify[ ] = notify; } .set( false ); .set((int) 0 ); .set((float) 0.0 ); .set(CompString (" ")); .set(CompMatch (" ")); .match ().update (); color[0] = MAX (0, MIN (0xffff, )); 0; color[1] = MAX (0, MIN (0xffff, )); 0; color[2] = MAX (0, MIN (0xffff, )); 0; color[3] = MAX (0, MIN (0xffff, )); 0xffff; .set(color); .set(CompAction ()); .action ().setState (state); action = CompAction (); action.setState (state | CompAction::StateInitKey); action.keyFromString (" "); .set (action); action = CompAction (); action.setState (state | CompAction::StateInitButton); action.buttonFromString (" "); .set (action); action = CompAction (); action.setState (state | CompAction::StateInitEdge); edge = 0; edge |= 1; edge |= (1 << 1); edge |= (1 << 2); edge |= (1 << 3); edge |= (1 << 4); edge |= (1 << 5); edge |= (1 << 6); edge |= (1 << 7); action.setEdgeMask (edge); .set (action); action = CompAction (); action.setState (state | CompAction::StateInitBell); action.setBell (true); .set (action); list.clear (); value value value value value value value value value value list.push_back (value); .set ( CompOption::TypeBool CompOption::TypeInt CompOption::TypeFloat CompOption::TypeString CompOption::TypeColor CompOption::TypeAction CompOption::TypeKey CompOption::TypeButton CompOption::TypeEdge CompOption::TypeBell CompOption::TypeMatch , list); state = 0; state = CompAction::StateAutoGrab; state |= CompAction::StateNoEdgeDelay; state |= CompAction::StateInitKey; state |= CompAction::StateInitButton; state |= CompAction::StateInitBell; state |= CompAction::StateInitEdge; state |= CompAction::StateInitEdgeDnd; action.setState (action.state() | CompAction::StateIgnoreTap); .rest ().set ( MINSHORT , MAXSHORT ); .rest ().set ( MINSHORT , MAXSHORT , 0.1f ); CompOption *o; unsigned int index; o = CompOption::findOption (mOptions, name, &index); if (!o) return false; switch (index) { default: break; } return false; case : if (o->set (value)) { m Mask = 0; foreach (CompOption::Value &val, o->value ().list ()) m Mask |= (1 << val.i ()); if (!mNotify[ ].empty ()) mNotify[ ] (o, ); return true; } break; enum Options { , OptionNum }; enum { = , }; #define Mask (1 << ) class Options : public CompOption::Class { public: typedef boost::function <void (CompOption *opt, Options num)> ChangeNotify; Options (bool init = true); virtual ~ Options (); void initOptions (); virtual CompOption::Vector & getOptions (); virtual bool setOption (const CompString &name, CompOption::Value &value); int ; float ; bool ; CompString ; CompMatch & ; unsigned short * ; unsigned short optionGet Red (); unsigned short optionGet Green (); unsigned short optionGet Blue (); unsigned short optionGet Alpha (); CompAction & ; void optionSet Initiate (CompAction::CallBack init); void optionSet Terminate (CompAction::CallBack term); CompOption::Value::Vector & ; unsigned int optionGet Mask (); void optionSet Notify (ChangeNotify notify); protected: CompOption::Vector mOptions; private: std::vector<ChangeNotify> mNotify; unsigned int m Mask; }; optionGet () CompOption::Vector & Options::getOptions () { return mOptions; } bool Options::setOption (const CompString &name, CompOption::Value &value) { } Options:: Options (bool init /* = true */) : mOptions ( Options::OptionNum), mNotify ( Options::OptionNum) { if (init) initOptions (); } void Options::initOptions () { unsigned int state; CompAction action; unsigned int edge; unsigned short color[4]; CompOption::Value::Vector list; CompOption::Value value; // mOptions[ ] .setName (" ", CompOption::TypeBool CompOption::TypeInt CompOption::TypeFloat CompOption::TypeString CompOption::TypeColor CompOption::TypeAction CompOption::TypeKey CompOption::TypeButton CompOption::TypeEdge CompOption::TypeBell CompOption::TypeMatch CompOption::TypeList ); .value() .value() .value() .value() .value() .value() .value() .value() if (screen) screen->addAction (& mOptions[ ].value ().action ()); .value() if (screen) screen->addAction (& mOptions[ ].value ().action ()); .value() if (screen) screen->addAction (& mOptions[ ].value ().action ()); .value() if (screen) screen->addAction (& mOptions[ ].value ().action ()); value.set ( CompOption::TypeBool CompOption::TypeInt CompOption::TypeFloat CompOption::TypeString CompOption::TypeColor CompOption::TypeAction CompOption::TypeKey CompOption::TypeButton CompOption::TypeEdge CompOption::TypeBell CompOption::TypeMatch , CompOption::Value::Vector (0)); .set (value); .value() m Mask = 0; foreach (CompOption::Value &val, mOptions[ ].value ().list ()) m Mask |= (1 << val.i ()); } Options::~ Options () { } /* * This file is autogenerated with bcop: * The Compiz option code generator * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ Options:: compiz-0.9.11+14.04.20140409/xslt/CMakeLists.txt0000644000015301777760000000061412321343002021225 0ustar pbusernogroup00000000000000 set (_files bcop.xslt ) compiz_configure_file (compiz_gsettings_schemas.xslt.in compiz_gsettings_schemas.xslt) if (USE_GCONF) list (APPEND _files compiz_gconf_schemas.xslt) endif () if (USE_GSETTINGS) list (APPEND _files ${CMAKE_CURRENT_BINARY_DIR}/compiz_gsettings_schemas.xslt) endif () install ( FILES ${_files} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/compiz/xslt ) compiz-0.9.11+14.04.20140409/xslt/compiz_gsettings_schemas.xslt.in0000644000015301777760000003464212321343002025111 0ustar pbusernogroup00000000000000 /org/compiz @GETTEXT_PACKAGE@ '#000000ff' [ ] [ ] ' false Disabled ' i d b b a s ( - match ) = , 0 , ' ' , , ff ' ' 0000 00 | ' ' /plugins/ /general /screen0/options/ org.compiz . ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz compiz-0.9.11+14.04.20140409/gtk/0000755000015301777760000000000012321344021016261 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/gtk/gnome/0000755000015301777760000000000012321344021017366 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/gtk/gnome/compiz.desktop.in0000644000015301777760000000055412321343002022671 0ustar pbusernogroup00000000000000[Desktop Entry] Type=Application Encoding=UTF-8 _Name=Compiz Exec=compiz NoDisplay=true # name of loadable control center module X-GNOME-WMSettingsModule=compiz # autostart phase X-GNOME-Autostart-Phase=WindowManager X-GNOME-Provides=windowmanager # name we put on the WM spec check window X-GNOME-WMName=compiz # back compat only X-GnomeWMSettingsLibrary=compiz compiz-0.9.11+14.04.20140409/gtk/gnome/50-compiz-navigation.xml.in0000644000015301777760000000630412321343002024376 0ustar pbusernogroup00000000000000 compiz-0.9.11+14.04.20140409/gtk/gnome/CMakeLists.txt0000644000015301777760000000235612321343002022132 0ustar pbusernogroup00000000000000if (BUILD_GNOME) set (desktop_file ${CMAKE_CURRENT_BINARY_DIR}/compiz.desktop) compiz_translate_desktop_file ( ${CMAKE_CURRENT_SOURCE_DIR}/compiz.desktop.in ${desktop_file} ) install ( FILES ${desktop_file} DESTINATION ${datadir}/applications ) set (_keybindings_files 50-compiz-navigation.xml.in 50-compiz-windows.xml.in) set (_keybindings_files_translated "") foreach (_keybinding_file ${_keybindings_files}) string (LENGTH ${_keybinding_file} _str_len) math (EXPR _str_len_no_in "${_str_len} - 3") string (SUBSTRING ${_keybinding_file} 0 ${_str_len_no_in} _keybinding_file_no_in) compiz_translate_xml (${CMAKE_CURRENT_SOURCE_DIR}/${_keybinding_file} ${CMAKE_CURRENT_BINARY_DIR}/${_keybinding_file_no_in} NOTRANSLATIONS) list (APPEND _keybindings_files_translated ${CMAKE_CURRENT_BINARY_DIR}/${_keybinding_file_no_in}) endforeach (_keybinding_file ${keybinding_files}) add_custom_target (compiz-gnome-keybindings ALL DEPENDS ${_keybindings_files_translated}) install ( FILES ${_keybinding_files_translated} DESTINATION ${datadir}/gnome-control-center/keybindings ) add_custom_target (compiz.desktop-file ALL DEPENDS ${desktop_file}) endif (BUILD_GNOME) compiz-0.9.11+14.04.20140409/gtk/gnome/50-compiz-windows.xml.in0000644000015301777760000000233112321343002023725 0ustar pbusernogroup00000000000000 compiz-0.9.11+14.04.20140409/gtk/window-decorator/0000755000015301777760000000000012321344021021550 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-storage-gconf.h0000644000015301777760000000453412321343002027100 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_SETTINGS_STORAGE_GCONF_H #define _COMPIZ_GWD_SETTINGS_STORAGE_GCONF_H #include #include G_BEGIN_DECLS #define GWD_TYPE_SETTINGS_STORAGE_GCONF (gwd_settings_storage_gconf_get_type ()) GType gwd_settings_storage_gconf_get_type (); GWDSettingsStorage * gwd_settings_storage_gconf_new (GWDSettingsWritable *writableSettings); extern const gchar * ORG_COMPIZ_GWD_KEY_USE_TOOLTIPS; extern const gchar * ORG_COMPIZ_GWD_KEY_BLUR_TYPE; extern const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_OPACITY; extern const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_OPACITY; extern const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_SHADE_OPACITY; extern const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_SHADE_OPACITY; extern const gchar * ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME; extern const gchar * ORG_COMPIZ_GWD_KEY_MOUSE_WHEEL_ACTION; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_DOUBLE_CLICK_TITLEBAR; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_MIDDLE_CLICK_TITLEBAR; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_RIGHT_CLICK_TITLEBAR; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_THEME; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_USES_SYSTEM_FONT; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_FONT; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_BUTTON_LAYOUT; extern const gchar * ORG_GNOME_MUTTER_ATTACH_MODAL_DIALOGS; extern const gchar * ORG_GNOME_MUTTER_DRAGGABLE_BORDER_WIDTH; G_END_DECLS #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/util.c0000644000015301777760000001226412321343002022674 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" double square (double x) { return x * x; } double dist (double x1, double y1, double x2, double y2) { return sqrt (square (x1 - x2) + square (y1 - y2)); } gboolean get_window_prop (Window xwindow, Atom atom, Window *val) { Atom type; int format; gulong nitems; gulong bytes_after; Window *w; int err, result; *val = 0; gdk_error_trap_push (); type = None; result = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xwindow, atom, 0, G_MAXLONG, False, XA_WINDOW, &type, &format, &nitems, &bytes_after, (void*) &w); err = gdk_error_trap_pop (); if (err != Success || result != Success) return FALSE; if (type != XA_WINDOW) { XFree (w); return FALSE; } *val = *w; XFree (w); return TRUE; } unsigned int get_mwm_prop (Window xwindow) { Display *xdisplay; Atom actual; int err, result, format; unsigned long n, left; unsigned char *data; unsigned int decor = MWM_DECOR_ALL; xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); gdk_error_trap_push (); result = XGetWindowProperty (xdisplay, xwindow, mwm_hints_atom, 0L, 20L, FALSE, mwm_hints_atom, &actual, &format, &n, &left, &data); err = gdk_error_trap_pop (); if (err != Success || result != Success) return decor; if (data) { MwmHints *mwm_hints = (MwmHints *) data; if (n >= PROP_MOTIF_WM_HINT_ELEMENTS) { if (mwm_hints->flags & MWM_HINTS_DECORATIONS) decor = mwm_hints->decorations; } XFree (data); } return decor; } /* from clearlooks theme */ static void rgb_to_hls (gdouble *r, gdouble *g, gdouble *b) { gdouble min; gdouble max; gdouble red; gdouble green; gdouble blue; gdouble h, l, s; gdouble delta; red = *r; green = *g; blue = *b; if (red > green) { if (red > blue) max = red; else max = blue; if (green < blue) min = green; else min = blue; } else { if (green > blue) max = green; else max = blue; if (red < blue) min = red; else min = blue; } l = (max + min) / 2; s = 0; h = 0; if (max != min) { if (l <= 0.5) s = (max - min) / (max + min); else s = (max - min) / (2 - max - min); delta = max -min; if (red == max) h = (green - blue) / delta; else if (green == max) h = 2 + (blue - red) / delta; else if (blue == max) h = 4 + (red - green) / delta; h *= 60; if (h < 0.0) h += 360; } *r = h; *g = l; *b = s; } static void hls_to_rgb (gdouble *h, gdouble *l, gdouble *s) { gdouble hue; gdouble lightness; gdouble saturation; gdouble m1, m2; gdouble r, g, b; lightness = *l; saturation = *s; if (lightness <= 0.5) m2 = lightness * (1 + saturation); else m2 = lightness + saturation - lightness * saturation; m1 = 2 * lightness - m2; if (saturation == 0) { *h = lightness; *l = lightness; *s = lightness; } else { hue = *h + 120; while (hue > 360) hue -= 360; while (hue < 0) hue += 360; if (hue < 60) r = m1 + (m2 - m1) * hue / 60; else if (hue < 180) r = m2; else if (hue < 240) r = m1 + (m2 - m1) * (240 - hue) / 60; else r = m1; hue = *h; while (hue > 360) hue -= 360; while (hue < 0) hue += 360; if (hue < 60) g = m1 + (m2 - m1) * hue / 60; else if (hue < 180) g = m2; else if (hue < 240) g = m1 + (m2 - m1) * (240 - hue) / 60; else g = m1; hue = *h - 120; while (hue > 360) hue -= 360; while (hue < 0) hue += 360; if (hue < 60) b = m1 + (m2 - m1) * hue / 60; else if (hue < 180) b = m2; else if (hue < 240) b = m1 + (m2 - m1) * (240 - hue) / 60; else b = m1; *h = r; *l = g; *s = b; } } void shade (const decor_color_t *a, decor_color_t *b, float k) { double red; double green; double blue; red = a->r; green = a->g; blue = a->b; rgb_to_hls (&red, &green, &blue); green *= k; if (green > 1.0) green = 1.0; else if (green < 0.0) green = 0.0; blue *= k; if (blue > 1.0) blue = 1.0; else if (blue < 0.0) blue = 0.0; hls_to_rgb (&red, &green, &blue); b->r = red; b->g = green; b->b = blue; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd.schemas.in0000644000015301777760000000720612321343002024306 0ustar pbusernogroup00000000000000 /schemas/apps/gwd/blur_type /apps/gwd/blur_type gwd string none Blur type Type of blur used for window decorations /schemas/apps/gwd/use_metacity_theme /apps/gwd/use_metacity_theme gwd bool true Use metacity theme Use metacity theme when drawing window decorations /schemas/apps/gwd/mouse_wheel_action /apps/gwd/mouse_wheel_action gwd string none Title bar mouse wheel action Action to take when scrolling the mouse wheel on a window title bar. /schemas/apps/gwd/metacity_theme_opacity /apps/gwd/metacity_theme_opacity gwd float 0.75 Metacity theme opacity Opacity to use for metacity theme decorations /schemas/apps/gwd/metacity_theme_shade_opacity /apps/gwd/metacity_theme_shade_opacity gwd bool true Metacity theme opacity shade Shade windows with metacity theme decorations from opaque to translucent /schemas/apps/gwd/metacity_theme_active_opacity /apps/gwd/metacity_theme_active_opacity gwd float 1.0 Metacity theme active window opacity Opacity to use for active windows with metacity theme decorations /schemas/apps/gwd/metacity_theme_active_shade_opacity /apps/gwd/metacity_theme_active_shade_opacity gwd bool true Metacity theme active window opacity shade Shade active windows with metacity theme decorations from opaque to translucent /schemas/apps/gwd/use_tooltops /apps/gwd/use_tooltips gwd bool true Use tooltips Show tooltip windows on decorator functions compiz-0.9.11+14.04.20140409/gtk/window-decorator/cairo.c0000644000015301777760000005244212321343002023016 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" #include "gwd-cairo-window-decoration-util.h" void rounded_rectangle (cairo_t *cr, double x, double y, double w, double h, double radius, int corner) { if (corner & CORNER_TOPLEFT) cairo_move_to (cr, x + radius, y); else cairo_move_to (cr, x, y); if (corner & CORNER_TOPRIGHT) cairo_arc (cr, x + w - radius, y + radius, radius, M_PI * 1.5, M_PI * 2.0); else cairo_line_to (cr, x + w, y); if (corner & CORNER_BOTTOMRIGHT) cairo_arc (cr, x + w - radius, y + h - radius, radius, 0.0, M_PI * 0.5); else cairo_line_to (cr, x + w, y + h); if (corner & CORNER_BOTTOMLEFT) cairo_arc (cr, x + radius, y + h - radius, radius, M_PI * 0.5, M_PI); else cairo_line_to (cr, x, y + h); if (corner & CORNER_TOPLEFT) cairo_arc (cr, x + radius, y + radius, radius, M_PI, M_PI * 1.5); else cairo_line_to (cr, x, y); } void fill_rounded_rectangle (cairo_t *cr, double x, double y, double w, double h, double radius, int corner, decor_color_t *c0, double alpha0, decor_color_t *c1, double alpha1, int gravity) { cairo_pattern_t *pattern; rounded_rectangle (cr, x, y, w, h, radius, corner); if (gravity & SHADE_RIGHT) { x = x + w; w = -w; } else if (!(gravity & SHADE_LEFT)) { x = w = 0; } if (gravity & SHADE_BOTTOM) { y = y + h; h = -h; } else if (!(gravity & SHADE_TOP)) { y = h = 0; } if (w && h) { cairo_matrix_t matrix; pattern = cairo_pattern_create_radial (0.0, 0.0, 0.0, 0.0, 0.0, w); cairo_matrix_init_scale (&matrix, 1.0, w / h); cairo_matrix_translate (&matrix, -(x + w), -(y + h)); cairo_pattern_set_matrix (pattern, &matrix); } else { pattern = cairo_pattern_create_linear (x + w, y + h, x, y); } cairo_pattern_add_color_stop_rgba (pattern, 0.0, c0->r, c0->g, c0->b, alpha0); cairo_pattern_add_color_stop_rgba (pattern, 1.0, c1->r, c1->g, c1->b, alpha1); cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); } void draw_shadow_background (decor_t *d, cairo_t *cr, decor_shadow_t *s, decor_context_t *c) { Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); if (!s || !s->picture ||!d->picture) { cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.0); cairo_paint (cr); } else { decor_fill_picture_extents_with_shadow (xdisplay, s, c, d->picture, &d->border_layout); } } static void draw_close_button (decor_t *d, cairo_t *cr, double s) { cairo_rel_move_to (cr, 0.0, s); cairo_rel_line_to (cr, s, -s); cairo_rel_line_to (cr, s, s); cairo_rel_line_to (cr, s, -s); cairo_rel_line_to (cr, s, s); cairo_rel_line_to (cr, -s, s); cairo_rel_line_to (cr, s, s); cairo_rel_line_to (cr, -s, s); cairo_rel_line_to (cr, -s, -s); cairo_rel_line_to (cr, -s, s); cairo_rel_line_to (cr, -s, -s); cairo_rel_line_to (cr, s, -s); cairo_close_path (cr); } static void draw_max_button (decor_t *d, cairo_t *cr, double s) { cairo_rel_line_to (cr, 12.0, 0.0); cairo_rel_line_to (cr, 0.0, 12.0); cairo_rel_line_to (cr, -12.0, 0.0); cairo_close_path (cr); cairo_rel_move_to (cr, 2.0, s); cairo_rel_line_to (cr, 12.0 - 4.0, 0.0); cairo_rel_line_to (cr, 0.0, 12.0 - s - 2.0); cairo_rel_line_to (cr, -(12.0 - 4.0), 0.0); cairo_close_path (cr); } static void draw_unmax_button (decor_t *d, cairo_t *cr, double s) { cairo_rel_move_to (cr, 1.0, 1.0); cairo_rel_line_to (cr, 10.0, 0.0); cairo_rel_line_to (cr, 0.0, 10.0); cairo_rel_line_to (cr, -10.0, 0.0); cairo_close_path (cr); cairo_rel_move_to (cr, 2.0, s); cairo_rel_line_to (cr, 10.0 - 4.0, 0.0); cairo_rel_line_to (cr, 0.0, 10.0 - s - 2.0); cairo_rel_line_to (cr, -(10.0 - 4.0), 0.0); cairo_close_path (cr); } static void draw_min_button (decor_t *d, cairo_t *cr, double s) { cairo_rel_move_to (cr, 0.0, 8.0); cairo_rel_line_to (cr, 12.0, 0.0); cairo_rel_line_to (cr, 0.0, s); cairo_rel_line_to (cr, -12.0, 0.0); cairo_close_path (cr); } typedef void (*draw_proc) (cairo_t *cr); static void button_state_offsets (gdouble x, gdouble y, guint state, gdouble *return_x, gdouble *return_y) { static double off[] = { 0.0, 0.0, 0.0, 0.5 }; *return_x = x + off[state]; *return_y = y + off[state]; } static void button_state_paint (cairo_t *cr, GtkStyle *style, decor_color_t *color, guint state) { #define IN_STATE (PRESSED_EVENT_WINDOW | IN_EVENT_WINDOW) if ((state & IN_STATE) == IN_STATE) { if (state & IN_EVENT_WINDOW) cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); else cairo_set_source_rgba (cr, color->r, color->g, color->b, 0.95); cairo_fill_preserve (cr); gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], STROKE_ALPHA); cairo_set_line_width (cr, 1.0); cairo_stroke (cr); cairo_set_line_width (cr, 2.0); } else { gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], STROKE_ALPHA); cairo_stroke_preserve (cr); if (state & IN_EVENT_WINDOW) cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); else cairo_set_source_rgba (cr, color->r, color->g, color->b, 0.95); cairo_fill (cr); } } void draw_window_decoration (decor_t *d) { cairo_t *cr; GtkStyle *style; GdkDrawable *drawable; decor_color_t color; double alpha; double x1, y1, x2, y2, x, y, h; int corners = SHADE_LEFT | SHADE_RIGHT | SHADE_TOP | SHADE_BOTTOM; int top; int button_x; if (!d->pixmap) return; style = gtk_widget_get_style (d->frame->style_window_rgba); if (d->state & (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY)) corners = 0; color.r = style->bg[GTK_STATE_NORMAL].red / 65535.0; color.g = style->bg[GTK_STATE_NORMAL].green / 65535.0; color.b = style->bg[GTK_STATE_NORMAL].blue / 65535.0; if (d->buffer_pixmap) drawable = d->buffer_pixmap; else drawable = d->pixmap; cr = gdk_cairo_create (GDK_DRAWABLE (drawable)); if (!cr) return; cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); top = d->frame->win_extents.top + d->frame->titlebar_height; x1 = d->context->left_space - d->frame->win_extents.left; y1 = d->context->top_space - d->frame->win_extents.top - d->frame->titlebar_height; x2 = d->width - d->context->right_space + d->frame->win_extents.right; y2 = d->height - d->context->bottom_space + d->frame->win_extents.bottom; h = d->height - d->context->top_space - d->context->bottom_space; cairo_set_line_width (cr, 1.0); if (!d->frame_window) draw_shadow_background (d, cr, d->shadow, d->context); if (d->active) { decor_color_t *title_color = _title_color; alpha = decoration_alpha + 0.3; fill_rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, d->frame->win_extents.left - 0.5, top - 0.5, 5.0, CORNER_TOPLEFT & corners, &title_color[0], 1.0, &title_color[1], alpha, SHADE_TOP | SHADE_LEFT); fill_rounded_rectangle (cr, x1 + d->frame->win_extents.left, y1 + 0.5, x2 - x1 - d->frame->win_extents.left - d->frame->win_extents.right, top - 0.5, 5.0, 0, &title_color[0], 1.0, &title_color[1], alpha, SHADE_TOP); fill_rounded_rectangle (cr, x2 - d->frame->win_extents.right, y1 + 0.5, d->frame->win_extents.right - 0.5, top - 0.5, 5.0, CORNER_TOPRIGHT & corners, &title_color[0], 1.0, &title_color[1], alpha, SHADE_TOP | SHADE_RIGHT); } else { alpha = decoration_alpha; fill_rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, d->frame->win_extents.left - 0.5, top - 0.5, 5.0, CORNER_TOPLEFT & corners, &color, 1.0, &color, alpha, SHADE_TOP | SHADE_LEFT); fill_rounded_rectangle (cr, x1 + d->frame->win_extents.left, y1 + 0.5, x2 - x1 - d->frame->win_extents.left - d->frame->win_extents.right, top - 0.5, 5.0, 0, &color, 1.0, &color, alpha, SHADE_TOP); fill_rounded_rectangle (cr, x2 - d->frame->win_extents.right, y1 + 0.5, d->frame->win_extents.right - 0.5, top - 0.5, 5.0, CORNER_TOPRIGHT & corners, &color, 1.0, &color, alpha, SHADE_TOP | SHADE_RIGHT); } fill_rounded_rectangle (cr, x1 + 0.5, y1 + top, d->frame->win_extents.left - 0.5, h, 5.0, 0, &color, 1.0, &color, alpha, SHADE_LEFT); fill_rounded_rectangle (cr, x2 - d->frame->win_extents.right, y1 + top, d->frame->win_extents.right - 0.5, h, 5.0, 0, &color, 1.0, &color, alpha, SHADE_RIGHT); fill_rounded_rectangle (cr, x1 + 0.5, y2 - d->frame->win_extents.bottom, d->frame->win_extents.left - 0.5, d->frame->win_extents.bottom - 0.5, 5.0, CORNER_BOTTOMLEFT & corners, &color, 1.0, &color, alpha, SHADE_BOTTOM | SHADE_LEFT); fill_rounded_rectangle (cr, x1 + d->frame->win_extents.left, y2 - d->frame->win_extents.bottom, x2 - x1 - d->frame->win_extents.left - d->frame->win_extents.right, d->frame->win_extents.bottom - 0.5, 5.0, 0, &color, 1.0, &color, alpha, SHADE_BOTTOM); fill_rounded_rectangle (cr, x2 - d->frame->win_extents.right, y2 - d->frame->win_extents.bottom, d->frame->win_extents.right - 0.5, d->frame->win_extents.bottom - 0.5, 5.0, CORNER_BOTTOMRIGHT & corners, &color, 1.0, &color, alpha, SHADE_BOTTOM | SHADE_RIGHT); cairo_rectangle (cr, d->context->left_space, d->context->top_space, d->width - d->context->left_space - d->context->right_space, h); gdk_cairo_set_source_color (cr, &style->bg[GTK_STATE_NORMAL]); cairo_fill (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); if (d->active) { gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], 0.7); cairo_move_to (cr, x1 + 0.5, y1 + top - 0.5); cairo_rel_line_to (cr, x2 - x1 - 1.0, 0.0); cairo_stroke (cr); } rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners); cairo_clip (cr); cairo_translate (cr, 1.0, 1.0); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners); cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.4); cairo_stroke (cr); cairo_translate (cr, -2.0, -2.0); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners); cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.1); cairo_stroke (cr); cairo_translate (cr, 1.0, 1.0); cairo_reset_clip (cr); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners); gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], alpha); cairo_stroke (cr); cairo_set_line_width (cr, 2.0); button_x = d->width - d->context->right_space - 13; if (d->actions & WNCK_WINDOW_ACTION_CLOSE) { button_state_offsets (button_x, y1 - 3.0 + d->frame->titlebar_height / 2, d->button_states[BUTTON_CLOSE], &x, &y); button_x -= 17; if (d->active) { cairo_move_to (cr, x, y); draw_close_button (d, cr, 3.0); button_state_paint (cr, style, &color, d->button_states[BUTTON_CLOSE]); } else { gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], alpha * 0.75); cairo_move_to (cr, x, y); draw_close_button (d, cr, 3.0); cairo_fill (cr); } } if (d->actions & WNCK_WINDOW_ACTION_MAXIMIZE) { button_state_offsets (button_x, y1 - 3.0 + d->frame->titlebar_height / 2, d->button_states[BUTTON_MAX], &x, &y); button_x -= 17; cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); if (d->active) { gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], STROKE_ALPHA); cairo_move_to (cr, x, y); if (d->state & (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY)) draw_unmax_button (d, cr, 4.0); else draw_max_button (d, cr, 4.0); button_state_paint (cr, style, &color, d->button_states[BUTTON_MAX]); } else { gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], alpha * 0.75); cairo_move_to (cr, x, y); if (d->state & (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY)) draw_unmax_button (d, cr, 4.0); else draw_max_button (d, cr, 4.0); cairo_fill (cr); } } if (d->actions & WNCK_WINDOW_ACTION_MINIMIZE) { button_state_offsets (button_x, y1 - 3.0 + d->frame->titlebar_height / 2, d->button_states[BUTTON_MIN], &x, &y); button_x -= 17; if (d->active) { gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], STROKE_ALPHA); cairo_move_to (cr, x, y); draw_min_button (d, cr, 4.0); button_state_paint (cr, style, &color, d->button_states[BUTTON_MIN]); } else { gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], alpha * 0.75); cairo_move_to (cr, x, y); draw_min_button (d, cr, 4.0); cairo_fill (cr); } } if (d->layout) { if (d->active) { cairo_move_to (cr, d->context->left_space + 21.0, y1 + 2.0 + (d->frame->titlebar_height - d->frame->text_height) / 2.0); gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], STROKE_ALPHA); pango_cairo_layout_path (cr, d->layout); cairo_stroke (cr); cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); } else { gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], alpha); } cairo_move_to (cr, d->context->left_space + 21.0, y1 + 2.0 + (d->frame->titlebar_height - d->frame->text_height) / 2.0); pango_cairo_show_layout (cr, d->layout); } if (d->icon) { cairo_translate (cr, d->context->left_space + 1, y1 - 5.0 + d->frame->titlebar_height / 2); cairo_set_source (cr, d->icon); cairo_rectangle (cr, 0.0, 0.0, 16.0, 16.0); cairo_clip (cr); if (d->active) cairo_paint (cr); else cairo_paint_with_alpha (cr, alpha); } cairo_destroy (cr); copy_to_front_buffer (d); if (d->frame_window) { GdkWindow *gdk_frame_window = gtk_widget_get_window (d->decor_window); gtk_image_set_from_pixmap (GTK_IMAGE (d->decor_image), d->pixmap, NULL); gtk_window_resize (GTK_WINDOW (d->decor_window), d->width, d->height); gdk_window_move (gdk_frame_window, 0, 0); gdk_window_lower (gdk_frame_window); } if (d->prop_xid) { decor_update_window_property (d); d->prop_xid = 0; } } static void calc_button_size (decor_t *d) { gint button_width = 0; if (d->actions & WNCK_WINDOW_ACTION_CLOSE) button_width += 17; if (d->actions & (WNCK_WINDOW_ACTION_MAXIMIZE_HORIZONTALLY | WNCK_WINDOW_ACTION_MAXIMIZE_VERTICALLY | WNCK_WINDOW_ACTION_UNMAXIMIZE_HORIZONTALLY | WNCK_WINDOW_ACTION_UNMAXIMIZE_VERTICALLY)) button_width += 17; if (d->actions & WNCK_WINDOW_ACTION_MINIMIZE) button_width += 17; if (button_width) ++button_width; d->button_width = button_width; } gboolean calc_decoration_size (decor_t *d, gint w, gint h, gint name_width, gint *width, gint *height) { decor_layout_t layout; int top_width; if (!d->decorated) return FALSE; /* To avoid wasting texture memory, we only calculate the minimal * required decoration size then clip and stretch the texture where * appropriate */ if (!d->frame_window) { calc_button_size (d); if (w < ICON_SPACE + d->button_width) return FALSE; top_width = name_width + d->button_width + ICON_SPACE; if (w < top_width) top_width = MAX (ICON_SPACE + d->button_width, w); if (d->active) decor_get_default_layout (&d->frame->window_context_active, top_width, 1, &layout); else decor_get_default_layout (&d->frame->window_context_inactive, top_width, 1, &layout); if (!d->context || memcmp (&layout, &d->border_layout, sizeof (layout))) { *width = layout.width; *height = layout.height; d->border_layout = layout; if (d->active) { d->context = &d->frame->window_context_active; d->shadow = d->frame->border_shadow_active; } else { d->context = &d->frame->window_context_inactive; d->shadow = d->frame->border_shadow_inactive; } return TRUE; } } else { calc_button_size (d); /* _default_win_extents + top height */ top_width = name_width + d->button_width + ICON_SPACE; if (w < top_width) top_width = MAX (ICON_SPACE + d->button_width, w); decor_get_default_layout (&d->frame->window_context_no_shadow, d->client_width, d->client_height, &layout); *width = layout.width; *height = layout.height; d->border_layout = layout; if (d->active) { d->context = &d->frame->window_context_active; d->shadow = d->frame->border_shadow_active; } else { d->context = &d->frame->window_context_inactive; d->shadow = d->frame->border_shadow_inactive; } return TRUE; } return FALSE; } gboolean get_button_position (decor_t *d, gint i, gint width, gint height, gint *x, gint *y, gint *w, gint *h) { if (i > BUTTON_MENU) return FALSE; if (d->frame_window) { *x = bpos[i].x + bpos[i].xw * width + d->frame->win_extents.left + 4; *y = bpos[i].y + bpos[i].yh * height + bpos[i].yth * (d->frame->titlebar_height - 17) + d->frame->win_extents.top + 2; } else { *x = bpos[i].x + bpos[i].xw * width; *y = bpos[i].y + bpos[i].yh * height + bpos[i].yth * (d->frame->titlebar_height - 17); } *w = bpos[i].w + bpos[i].ww * width; *h = bpos[i].h + bpos[i].hh * height + bpos[i].hth + (d->frame->titlebar_height - 17); /* hack to position multiple buttons on the right */ if (i != BUTTON_MENU) *x -= 10 + 16 * i; return TRUE; } void get_event_window_position (decor_t *d, gint i, gint j, gint width, gint height, gint *x, gint *y, gint *w, gint *h) { if (d->frame_window) { *x = pos[i][j].x + pos[i][j].xw * width + d->frame->win_extents.left; *y = pos[i][j].y + d->frame->win_extents.top + pos[i][j].yh * height + pos[i][j].yth * (d->frame->titlebar_height - 17); if (i == 0 && (j == 0 || j == 2)) *y -= d->frame->titlebar_height; } else { *x = pos[i][j].x + pos[i][j].xw * width; *y = pos[i][j].y + pos[i][j].yh * height + pos[i][j].yth * (d->frame->titlebar_height - 17); } if ((d->state & WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY) && (j == 0 || j == 2)) { *w = 0; } else { *w = pos[i][j].w + pos[i][j].ww * width; } if ((d->state & WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY) && (i == 0 || i == 2)) { *h = 0; } else { *h = pos[i][j].h + pos[i][j].hh * height + pos[i][j].hth * (d->frame->titlebar_height - 17); } } gfloat get_title_scale (decor_frame_t *frame) { return 1.0f; } void update_border_extents (decor_frame_t *frame) { frame = gwd_decor_frame_ref (frame); gwd_cairo_window_decoration_get_extents (&frame->win_extents, &frame->max_win_extents); frame->titlebar_height = frame->max_titlebar_height = (frame->text_height < 17) ? 17 : frame->text_height; gwd_decor_frame_unref (frame); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-writable-interface.h0000644000015301777760000001400312321343002030101 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_SETTINGS_WRITABLE_INTERFACE_H #define _COMPIZ_GWD_SETTINGS_WRITABLE_INTERFACE_H #include #include G_BEGIN_DECLS #define GWD_SETTINGS_WRITABLE_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ GWD_TYPE_WRITABLE_SETTINGS_INTERFACE, \ GWDSettingsWritable)) #define GWD_SETTINGS_WRITABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE (obj, \ GWD_TYPE_WRITABLE_SETTINGS_INTERFACE, \ GWDSettingsWritableInterface)) #define GWD_TYPE_WRITABLE_SETTINGS_INTERFACE (gwd_settings_writable_interface_get_type ()) typedef struct _GWDSettingsWritableInterface GWDSettingsWritableInterface; struct _GWDSettingsWritableInterface { GTypeInterface parent; void (*freeze_updates) (GWDSettingsWritable *settings); void (*thaw_updates) (GWDSettingsWritable *settings); gboolean (*shadow_property_changed) (GWDSettingsWritable *settings, gdouble active_shadow_radius, gdouble active_shadow_opacity, gdouble active_shadow_offset_x, gdouble active_shadow_offset_y, const gchar *active_shadow_color, gdouble inactive_shadow_radius, gdouble inactive_shadow_opacity, gdouble inactive_shadow_offset_x, gdouble inactive_shadow_offset_y, const gchar *inactive_shadow_color); gboolean (*use_tooltips_changed) (GWDSettingsWritable *settings, gboolean new_value); gboolean (*draggable_border_width_changed) (GWDSettingsWritable *settings, gint new_value); gboolean (*attach_modal_dialogs_changed) (GWDSettingsWritable *settings, gboolean new_value); gboolean (*blur_changed) (GWDSettingsWritable *settings, const gchar *type); gboolean (*metacity_theme_changed) (GWDSettingsWritable *settings, gboolean use_metacity_theme, const gchar *metacity_theme); gboolean (*opacity_changed) (GWDSettingsWritable *settings, gdouble active_opacity, gdouble inactive_opacity, gboolean active_shade_opacity, gboolean inactive_shade_opacity); gboolean (*button_layout_changed) (GWDSettingsWritable *settings, const gchar *button_layout); gboolean (*font_changed) (GWDSettingsWritable *settings, gboolean titlebar_uses_system_font, const gchar *titlebar_font); gboolean (*titlebar_actions_changed) (GWDSettingsWritable *settings, const gchar *action_double_click_titlebar, const gchar *action_middle_click_titlebar, const gchar *action_right_click_titlebar, const gchar *mouse_wheel_action); }; void gwd_settings_writable_freeze_updates (GWDSettingsWritable *settings); void gwd_settings_writable_thaw_updates (GWDSettingsWritable *settings); gboolean gwd_settings_writable_shadow_property_changed (GWDSettingsWritable *settings, gdouble active_shadow_radius, gdouble active_shadow_opacity, gdouble active_shadow_offset_x, gdouble active_shadow_offset_y, const gchar *active_shadow_color, gdouble inactive_shadow_radius, gdouble inactive_shadow_opacity, gdouble inactive_shadow_offset_x, gdouble inactive_shadow_offset_y, const gchar *inactive_shadow_color); gboolean gwd_settings_writable_use_tooltips_changed (GWDSettingsWritable *settings, gboolean use_tooltips); gboolean gwd_settings_writable_draggable_border_width_changed (GWDSettingsWritable *settings, gint draggable_border_width); gboolean gwd_settings_writable_attach_modal_dialogs_changed (GWDSettingsWritable *settings, gboolean attach_modal_dialogs); gboolean gwd_settings_writable_blur_changed (GWDSettingsWritable *settings, const gchar *blur_type); gboolean gwd_settings_writable_metacity_theme_changed (GWDSettingsWritable *settings, gboolean use_metacity_theme, const gchar *metacity_theme); gboolean gwd_settings_writable_opacity_changed (GWDSettingsWritable *settings, gdouble active_opacity, gdouble inactive_opacity, gboolean active_shade_opacity, gboolean inactive_shade_opacity); gboolean gwd_settings_writable_button_layout_changed (GWDSettingsWritable *settings, const gchar *button_layout); gboolean gwd_settings_writable_font_changed (GWDSettingsWritable *settings, gboolean titlebar_uses_system_font, const gchar *titlebar_font); gboolean gwd_settings_writable_titlebar_actions_changed (GWDSettingsWritable *settings, const gchar *action_double_click_titlebar, const gchar *action_middle_click_titlebar, const gchar *action_right_click_titlebar, const gchar *mouse_wheel_action); GType gwd_settings_writable_interface_get_type (void); G_END_DECLS #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/switcher.c0000644000015301777760000003334712321343002023554 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" decor_frame_t * create_switcher_frame (const gchar *type) { AtkObject *switcher_label_obj; decor_frame_t *frame = decor_frame_new (type); decor_extents_t _switcher_extents = { 6, 6, 6, 6 + SWITCHER_SPACE }; decor_context_t _switcher_context = { { 0, 0, 0, 0 }, 6, 6, 6, 6 + SWITCHER_SPACE, 0, 0, 0, 0 }; frame->win_extents = _switcher_extents; frame->max_win_extents = _switcher_extents; frame->win_extents = _switcher_extents; frame->window_context_inactive = _switcher_context; frame->window_context_active = _switcher_context; frame->window_context_no_shadow = _switcher_context; frame->max_window_context_active = _switcher_context; frame->max_window_context_inactive = _switcher_context; frame->max_window_context_no_shadow = _switcher_context; frame->update_shadow = switcher_frame_update_shadow; /* keep the switcher frame around since we need to keep its * contents */ gwd_decor_frame_ref (frame); switcher_label = gtk_label_new (""); switcher_label_obj = gtk_widget_get_accessible (switcher_label); atk_object_set_role (switcher_label_obj, ATK_ROLE_STATUSBAR); gtk_container_add (GTK_CONTAINER (frame->style_window_rgba), switcher_label); return frame; } void destroy_switcher_frame (decor_frame_t *frame) { gtk_widget_destroy (switcher_label); decor_frame_destroy (frame); } static void draw_switcher_background (decor_t *d) { Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); cairo_t *cr; GtkStyle *style; decor_color_t color; double alpha = SWITCHER_ALPHA / 65535.0; double x1, y1, x2, y2, h; int top; unsigned long pixel; ushort a = SWITCHER_ALPHA; if (!d->buffer_pixmap) return; style = gtk_widget_get_style (d->frame->style_window_rgba); color.r = style->bg[GTK_STATE_NORMAL].red / 65535.0; color.g = style->bg[GTK_STATE_NORMAL].green / 65535.0; color.b = style->bg[GTK_STATE_NORMAL].blue / 65535.0; cr = gdk_cairo_create (GDK_DRAWABLE (d->buffer_pixmap)); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); top = d->frame->win_extents.top; x1 = d->frame->window_context_active.left_space - d->frame->win_extents.left; y1 = d->frame->window_context_active.top_space - d->frame->win_extents.top; x2 = d->width - d->frame->window_context_active.right_space + d->frame->win_extents.right; y2 = d->height - d->frame->window_context_active.bottom_space + d->frame->win_extents.bottom; h = y2 - y1 - d->frame->win_extents.top - d->frame->win_extents.top; cairo_set_line_width (cr, 1.0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); draw_shadow_background (d, cr, d->frame->border_shadow_active, &d->frame->window_context_active); fill_rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, d->frame->win_extents.left - 0.5, top - 0.5, 5.0, CORNER_TOPLEFT, &color, alpha, &color, alpha * 0.75, SHADE_TOP | SHADE_LEFT); fill_rounded_rectangle (cr, x1 + d->frame->win_extents.left, y1 + 0.5, x2 - x1 - d->frame->win_extents.left - d->frame->win_extents.right, top - 0.5, 5.0, 0, &color, alpha, &color, alpha * 0.75, SHADE_TOP); fill_rounded_rectangle (cr, x2 - d->frame->win_extents.right, y1 + 0.5, d->frame->win_extents.right - 0.5, top - 0.5, 5.0, CORNER_TOPRIGHT, &color, alpha, &color, alpha * 0.75, SHADE_TOP | SHADE_RIGHT); fill_rounded_rectangle (cr, x1 + 0.5, y1 + top, d->frame->win_extents.left - 0.5, h, 5.0, 0, &color, alpha, &color, alpha * 0.75, SHADE_LEFT); fill_rounded_rectangle (cr, x2 - d->frame->win_extents.right, y1 + top, d->frame->win_extents.right - 0.5, h, 5.0, 0, &color, alpha, &color, alpha * 0.75, SHADE_RIGHT); fill_rounded_rectangle (cr, x1 + 0.5, y2 - d->frame->win_extents.top, d->frame->win_extents.left - 0.5, d->frame->win_extents.top - 0.5, 5.0, CORNER_BOTTOMLEFT, &color, alpha, &color, alpha * 0.75, SHADE_BOTTOM | SHADE_LEFT); fill_rounded_rectangle (cr, x1 + d->frame->win_extents.left, y2 - d->frame->win_extents.top, x2 - x1 - d->frame->win_extents.left - d->frame->win_extents.right, d->frame->win_extents.top - 0.5, 5.0, 0, &color, alpha, &color, alpha * 0.75, SHADE_BOTTOM); fill_rounded_rectangle (cr, x2 - d->frame->win_extents.right, y2 - d->frame->win_extents.top, d->frame->win_extents.right - 0.5, d->frame->win_extents.top - 0.5, 5.0, CORNER_BOTTOMRIGHT, &color, alpha, &color, alpha * 0.75, SHADE_BOTTOM | SHADE_RIGHT); cairo_rectangle (cr, x1 + d->frame->win_extents.left, y1 + top, x2 - x1 - d->frame->win_extents.left - d->frame->win_extents.right, h); gdk_cairo_set_source_color_alpha (cr, &style->bg[GTK_STATE_NORMAL], alpha); cairo_fill (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT); cairo_clip (cr); cairo_translate (cr, 1.0, 1.0); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT); cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.4); cairo_stroke (cr); cairo_translate (cr, -2.0, -2.0); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT); cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.1); cairo_stroke (cr); cairo_translate (cr, 1.0, 1.0); cairo_reset_clip (cr); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT); gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], alpha); cairo_stroke (cr); cairo_destroy (cr); copy_to_front_buffer (d); pixel = ((((a * style->bg[GTK_STATE_NORMAL].blue ) >> 24) & 0x0000ff) | (((a * style->bg[GTK_STATE_NORMAL].green) >> 16) & 0x00ff00) | (((a * style->bg[GTK_STATE_NORMAL].red ) >> 8) & 0xff0000) | (((a & 0xff00) << 16))); decor_update_switcher_property (d); gdk_error_trap_push (); XSetWindowBackground (xdisplay, d->prop_xid, pixel); XClearWindow (xdisplay, d->prop_xid); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop (); d->prop_xid = 0; } static void draw_switcher_foreground (decor_t *d) { cairo_t *cr; GtkStyle *style; double alpha = SWITCHER_ALPHA / 65535.0; if (!d->pixmap || !d->buffer_pixmap) return; style = gtk_widget_get_style (d->frame->style_window_rgba); cr = gdk_cairo_create (GDK_DRAWABLE (d->buffer_pixmap)); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_rectangle (cr, d->frame->window_context_active.left_space, d->height - d->frame->window_context_active.bottom_space, d->width - d->frame->window_context_active.left_space - d->frame->window_context_active.right_space, SWITCHER_SPACE); gdk_cairo_set_source_color_alpha (cr, &style->bg[GTK_STATE_NORMAL], alpha); cairo_fill (cr); if (d->layout) { int w; cairo_set_operator (cr, CAIRO_OPERATOR_OVER); gdk_cairo_set_source_color_alpha (cr, &style->fg[GTK_STATE_NORMAL], 1.0); pango_layout_get_pixel_size (d->layout, &w, NULL); cairo_move_to (cr, d->width / 2 - w / 2, d->height - d->frame->window_context_active.bottom_space + SWITCHER_SPACE / 2 - d->frame->text_height / 2); pango_cairo_show_layout (cr, d->layout); } cairo_destroy (cr); copy_to_front_buffer (d); } void draw_switcher_decoration (decor_t *d) { if (d->prop_xid) draw_switcher_background (d); draw_switcher_foreground (d); } void switcher_window_closed () { decor_t *d = switcher_window; Display *xdisplay = gdk_x11_get_default_xdisplay (); if (d->layout) g_object_unref (G_OBJECT (d->layout)); if (d->name) g_free (d->name); if (d->pixmap) g_object_unref (G_OBJECT (d->pixmap)); if (d->buffer_pixmap) g_object_unref (G_OBJECT (d->buffer_pixmap)); if (d->cr) cairo_destroy (d->cr); if (d->picture) XRenderFreePicture (xdisplay, d->picture); gwd_decor_frame_unref (switcher_window->frame); g_free (switcher_window); switcher_window = NULL; } /* Switcher is override-redirect now, we need to track * it separately */ decor_t * switcher_window_opened (Window popup, Window window) { decor_t *d; d = switcher_window = calloc (1, sizeof (decor_t)); if (!d) return NULL; return d; } gboolean update_switcher_window (Window popup, Window selected) { decor_t *d = switcher_window; GdkPixmap *pixmap, *buffer_pixmap = NULL; unsigned int height, width = 0, border, depth; int x, y; Window root_return; WnckWindow *selected_win; Display *xdisplay; XRenderPictFormat *format; if (!d) d = switcher_window_opened (popup, selected); xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); /* FIXME: Thats a round-trip */ XGetGeometry (gdk_x11_get_default_xdisplay (), popup, &root_return, &x, &y, &width, &height, &border, &depth); d->decorated = FALSE; d->draw = draw_switcher_decoration; d->frame = gwd_get_decor_frame ("switcher"); decor_get_default_layout (&d->frame->window_context_active, width, 1, &d->border_layout); width = d->border_layout.width; height = d->border_layout.height; selected_win = wnck_window_get (selected); if (selected_win) { glong name_length; PangoLayoutLine *line; const gchar *name; if (d->name) { g_free (d->name); d->name = NULL; } name = wnck_window_get_name (selected_win); if (name && (name_length = strlen (name))) { if (!d->layout) { d->layout = pango_layout_new (d->frame->pango_context); if (d->layout) pango_layout_set_wrap (d->layout, PANGO_WRAP_CHAR); } if (d->layout) { int tw; tw = width - d->frame->window_context_active.left_space - d->frame->window_context_active.right_space - 64; pango_layout_set_auto_dir (d->layout, FALSE); pango_layout_set_width (d->layout, tw * PANGO_SCALE); pango_layout_set_text (d->layout, name, name_length); line = pango_layout_get_line (d->layout, 0); name_length = line->length; if (pango_layout_get_line_count (d->layout) > 1) { if (name_length < 4) { g_object_unref (G_OBJECT (d->layout)); d->layout = NULL; } else { d->name = g_strndup (name, name_length); strcpy (d->name + name_length - 3, "..."); } } else d->name = g_strndup (name, name_length); if (d->layout) pango_layout_set_text (d->layout, d->name, name_length); } } else if (d->layout) { g_object_unref (G_OBJECT (d->layout)); d->layout = NULL; } } if (selected != switcher_selected_window) { gtk_label_set_text (GTK_LABEL (switcher_label), ""); if (selected_win && d->name) gtk_label_set_text (GTK_LABEL (switcher_label), d->name); switcher_selected_window = selected; } pixmap = create_native_pixmap_and_wrap (width, height, d->frame->style_window_rgba); if (!pixmap) return FALSE; buffer_pixmap = create_pixmap (width, height, d->frame->style_window_rgba); if (!buffer_pixmap) { g_object_unref (G_OBJECT (pixmap)); return FALSE; } if (d->pixmap) g_object_unref (G_OBJECT (d->pixmap)); if (d->x11Pixmap) decor_post_delete_pixmap (xdisplay, wnck_window_get_xid (d->win), d->x11Pixmap); if (d->buffer_pixmap) g_object_unref (G_OBJECT (d->buffer_pixmap)); if (d->cr) cairo_destroy (d->cr); if (d->picture) XRenderFreePicture (xdisplay, d->picture); d->pixmap = pixmap; d->x11Pixmap = GDK_PIXMAP_XID (d->pixmap); d->buffer_pixmap = buffer_pixmap; d->cr = gdk_cairo_create (pixmap); format = get_format_for_drawable (d, GDK_DRAWABLE (d->buffer_pixmap)); d->picture = XRenderCreatePicture (xdisplay, GDK_PIXMAP_XID (buffer_pixmap), format, 0, NULL); d->width = width; d->height = height; d->prop_xid = popup; queue_decor_draw (d); return TRUE; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-storage-gsettings.c0000644000015301777760000005021212321343002030000 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include #include "gwd-settings-writable-interface.h" #include "gwd-settings-storage-interface.h" #include "gwd-settings-storage-gsettings.h" const gchar * ORG_COMPIZ_GWD = "org.compiz.gwd"; const gchar * ORG_GNOME_MUTTER = "org.gnome.mutter"; const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES = "org.gnome.desktop.wm.preferences"; const gchar * ORG_COMPIZ_GWD_KEY_USE_TOOLTIPS = "use-tooltips"; const gchar * ORG_COMPIZ_GWD_KEY_BLUR_TYPE = "blur-type"; const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_OPACITY = "metacity-theme-active-opacity"; const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_OPACITY = "metacity-theme-inactive-opacity"; const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_SHADE_OPACITY = "metacity-theme-active-shade-opacity"; const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_SHADE_OPACITY = "metacity-theme-inactive-shade-opacity"; const gchar * ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME = "use-metacity-theme"; const gchar * ORG_COMPIZ_GWD_KEY_MOUSE_WHEEL_ACTION = "mouse-wheel-action"; const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_DOUBLE_CLICK_TITLEBAR = "action-double-click-titlebar"; const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_MIDDLE_CLICK_TITLEBAR = "action-middle-click-titlebar"; const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_RIGHT_CLICK_TITLEBAR = "action-right-click-titlebar"; const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_THEME = "theme"; const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_USES_SYSTEM_FONT = "titlebar-uses-system-font"; const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_FONT = "titlebar-font"; const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_BUTTON_LAYOUT = "button-layout"; const gchar * ORG_GNOME_MUTTER_ATTACH_MODAL_DIALOGS = "attach-modal-dialogs"; const gchar * ORG_GNOME_MUTTER_DRAGGABLE_BORDER_WIDTH = "draggable-border-width"; #define GWD_SETTINGS_STORAGE_GSETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GWD_TYPE_SETTINGS_STORAGE_GSETTINGS, GWDSettingsStorageGSettings)); #define GWD_SETTINGS_STORAGE_GSETTINGS_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GWD_TYPE_SETTINGS_STORAGE_GSETTINGS, GWDSettingsStorageGSettingsClass)); #define GWD_IS_MOCK_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GWD_TYPE_SETTINGS_STORAGE_GSETTINGS)); #define GWD_IS_MOCK_SETTINGS_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GWD_TYPE_SETTINGS_STORAGE_GSETTINGS)); #define GWD_SETTINGS_STORAGE_GSETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GWD_TYPE_SETTINGS_STORAGE_GSETTINGS, GWDSettingsStorageGSettingsClass)); typedef struct _GWDSettingsStorageGSettings { GObject parent; } GWDSettingsStorageGSettings; typedef struct _GWDSettingsStorageGSettingsClass { GObjectClass parent_class; } GWDSettingsStorageGSettingsClass; static void gwd_settings_storage_gsettings_interface_init (GWDSettingsStorageInterface *interface); G_DEFINE_TYPE_WITH_CODE (GWDSettingsStorageGSettings, gwd_settings_storage_gsettings, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GWD_TYPE_SETTINGS_STORAGE_INTERFACE, gwd_settings_storage_gsettings_interface_init)) #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GWD_TYPE_SETTINGS_STORAGE_GSETTINGS, GWDSettingsStorageGSettingsPrivate)) enum { GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_DESKTOP_GSETTINGS = 1, GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_MUTTER_GSETTINGS = 2, GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_GWD_GSETTINGS = 3, GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_WRITABLE_SETTINGS = 4 }; const guint GWD_SETTINGS_STORAGE_GSETTINGS_N_CONSTRUCTION_PARAMS = 4; typedef struct _GWDSettingsStorageGSettingsPrivate { GSettings *desktop; GSettings *mutter; GSettings *gwd; GWDSettingsWritable *writable; } GWDSettingsStorageGSettingsPrivate; static gboolean gwd_settings_storage_gsettings_update_use_tooltips (GWDSettingsStorage *settings) { GWDSettingsStorageGSettings *storage = GWD_SETTINGS_STORAGE_GSETTINGS (settings); GWDSettingsStorageGSettingsPrivate *priv = GET_PRIVATE (storage); if (!priv->gwd) return FALSE; return gwd_settings_writable_use_tooltips_changed (priv->writable, g_settings_get_boolean (priv->gwd, ORG_COMPIZ_GWD_KEY_USE_TOOLTIPS)); } static gboolean gwd_settings_storage_gsettings_update_draggable_border_width (GWDSettingsStorage *settings) { GWDSettingsStorageGSettings *storage = GWD_SETTINGS_STORAGE_GSETTINGS (settings); GWDSettingsStorageGSettingsPrivate *priv = GET_PRIVATE (storage); if (!priv->mutter) return FALSE; return gwd_settings_writable_draggable_border_width_changed (priv->writable, g_settings_get_int (priv->mutter, ORG_GNOME_MUTTER_DRAGGABLE_BORDER_WIDTH)); } static gboolean gwd_settings_storage_gsettings_update_attach_modal_dialogs (GWDSettingsStorage *settings) { GWDSettingsStorageGSettings *storage = GWD_SETTINGS_STORAGE_GSETTINGS (settings); GWDSettingsStorageGSettingsPrivate *priv = GET_PRIVATE (storage); if (!priv->mutter) return FALSE; return gwd_settings_writable_attach_modal_dialogs_changed (priv->writable, g_settings_get_boolean (priv->mutter, ORG_GNOME_MUTTER_ATTACH_MODAL_DIALOGS)); } static gboolean gwd_settings_storage_gsettings_update_blur (GWDSettingsStorage *settings) { GWDSettingsStorageGSettings *storage = GWD_SETTINGS_STORAGE_GSETTINGS (settings); GWDSettingsStorageGSettingsPrivate *priv = GET_PRIVATE (storage); if (!priv->gwd) return FALSE; return gwd_settings_writable_blur_changed (priv->writable, g_settings_get_string (priv->gwd, ORG_COMPIZ_GWD_KEY_BLUR_TYPE)); } static gboolean gwd_settings_storage_gsettings_update_metacity_theme (GWDSettingsStorage *settings) { GWDSettingsStorageGSettings *storage = GWD_SETTINGS_STORAGE_GSETTINGS (settings); GWDSettingsStorageGSettingsPrivate *priv = GET_PRIVATE (storage); if (!priv->gwd) return FALSE; if (!priv->desktop) return FALSE; return gwd_settings_writable_metacity_theme_changed (priv->writable, g_settings_get_boolean (priv->gwd, ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME), g_settings_get_string (priv->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_THEME)); } static gboolean gwd_settings_storage_gsettings_update_opacity (GWDSettingsStorage *settings) { GWDSettingsStorageGSettings *storage = GWD_SETTINGS_STORAGE_GSETTINGS (settings); GWDSettingsStorageGSettingsPrivate *priv = GET_PRIVATE (storage); if (!priv->gwd) return FALSE; return gwd_settings_writable_opacity_changed (priv->writable, g_settings_get_double (priv->gwd, ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_OPACITY), g_settings_get_double (priv->gwd, ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_OPACITY), g_settings_get_boolean (priv->gwd, ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_SHADE_OPACITY), g_settings_get_boolean (priv->gwd, ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_SHADE_OPACITY)); } static gboolean gwd_settings_storage_gsettings_update_button_layout (GWDSettingsStorage *settings) { GWDSettingsStorageGSettings *storage = GWD_SETTINGS_STORAGE_GSETTINGS (settings); GWDSettingsStorageGSettingsPrivate *priv = GET_PRIVATE (storage); if (!priv->desktop) return FALSE; return gwd_settings_writable_button_layout_changed (priv->writable, g_settings_get_string (priv->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_BUTTON_LAYOUT)); } static gboolean gwd_settings_storage_gsettings_update_font (GWDSettingsStorage *settings) { GWDSettingsStorageGSettings *storage = GWD_SETTINGS_STORAGE_GSETTINGS (settings); GWDSettingsStorageGSettingsPrivate *priv = GET_PRIVATE (storage); if (!priv->desktop) return FALSE; return gwd_settings_writable_font_changed (priv->writable, g_settings_get_boolean (priv->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_USES_SYSTEM_FONT), g_settings_get_string (priv->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_FONT)); } static inline gchar * translate_dashes_to_underscores (const gchar *original) { gint i = 0; gchar *copy = g_strdup (original); if (!copy) return NULL; for (; i < strlen (copy); ++i) { if (copy[i] == '-') copy[i] = '_'; } return copy; } static gboolean gwd_settings_storage_gsettings_update_titlebar_actions (GWDSettingsStorage *settings) { GWDSettingsStorageGSettings *storage = GWD_SETTINGS_STORAGE_GSETTINGS (settings); GWDSettingsStorageGSettingsPrivate *priv = GET_PRIVATE (storage); if (!priv->desktop) return FALSE; if (!priv->gwd) return FALSE; gchar *double_click_action = translate_dashes_to_underscores (g_settings_get_string (priv->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_DOUBLE_CLICK_TITLEBAR)); gchar *middle_click_action = translate_dashes_to_underscores (g_settings_get_string (priv->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_MIDDLE_CLICK_TITLEBAR)); gchar *right_click_action = translate_dashes_to_underscores (g_settings_get_string (priv->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_RIGHT_CLICK_TITLEBAR)); return gwd_settings_writable_titlebar_actions_changed (priv->writable, double_click_action, middle_click_action, right_click_action, g_settings_get_string (priv->gwd, ORG_COMPIZ_GWD_KEY_MOUSE_WHEEL_ACTION)); if (double_click_action) g_free (double_click_action); if (middle_click_action) g_free (middle_click_action); if (right_click_action) g_free (right_click_action); } static void gwd_settings_storage_gsettings_interface_init (GWDSettingsStorageInterface *interface) { interface->update_use_tooltips = gwd_settings_storage_gsettings_update_use_tooltips; interface->update_draggable_border_width = gwd_settings_storage_gsettings_update_draggable_border_width; interface->update_attach_modal_dialogs = gwd_settings_storage_gsettings_update_attach_modal_dialogs; interface->update_blur = gwd_settings_storage_gsettings_update_blur; interface->update_metacity_theme = gwd_settings_storage_gsettings_update_metacity_theme; interface->update_opacity = gwd_settings_storage_gsettings_update_opacity; interface->update_button_layout = gwd_settings_storage_gsettings_update_button_layout; interface->update_font = gwd_settings_storage_gsettings_update_font; interface->update_titlebar_actions = gwd_settings_storage_gsettings_update_titlebar_actions; } static void gwd_settings_storage_gsettings_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDSettingsStorageGSettingsPrivate *priv = GET_PRIVATE (object); switch (property_id) { case GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_DESKTOP_GSETTINGS: if (priv->desktop) g_object_unref (priv->desktop); priv->desktop = g_value_dup_object (value); break; case GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_MUTTER_GSETTINGS: if (priv->mutter) g_object_unref (priv->mutter); priv->mutter = g_value_dup_object (value); break; case GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_GWD_GSETTINGS: if (priv->gwd) g_object_unref (priv->gwd); priv->gwd = g_value_dup_object (value); break; case GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_WRITABLE_SETTINGS: priv->writable = g_value_get_pointer (value); break; default: g_assert_not_reached (); } } static void gwd_settings_storage_gsettings_dispose (GObject *object) { GWDSettingsStorageGSettingsPrivate *priv = GET_PRIVATE (object); G_OBJECT_CLASS (gwd_settings_storage_gsettings_parent_class)->dispose (object); if (priv->desktop) g_object_unref (priv->desktop); if (priv->mutter) g_object_unref (priv->mutter); if (priv->gwd) g_object_unref (priv->gwd); } static void gwd_settings_storage_gsettings_finalize (GObject *object) { G_OBJECT_CLASS (gwd_settings_storage_gsettings_parent_class)->finalize (object); } static void gwd_settings_storage_gsettings_class_init (GWDSettingsStorageGSettingsClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GParamSpec *properties[] = { NULL, g_param_spec_object ("desktop-gsettings", ORG_GNOME_DESKTOP_WM_PREFERENCES, "GSettings Object for org.gnome.desktop.wm.preferences", G_TYPE_SETTINGS, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY), g_param_spec_object ("mutter-gsettings", ORG_GNOME_MUTTER, "GSettings Object for org.gnome.mutter", G_TYPE_SETTINGS, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY), g_param_spec_object ("gwd-gsettings", ORG_COMPIZ_GWD, "GSettings Object for org.compiz.gwd", G_TYPE_SETTINGS, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY), g_param_spec_pointer ("writable-settings", "GWDWritableSettings", "A GWDWritableSettings object", G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY) }; g_type_class_add_private (klass, sizeof (GWDSettingsStorageGSettingsPrivate)); object_class->dispose = gwd_settings_storage_gsettings_dispose; object_class->finalize = gwd_settings_storage_gsettings_finalize; object_class->set_property = gwd_settings_storage_gsettings_set_property; g_object_class_install_properties (object_class, sizeof (properties) / sizeof (properties[0]), properties); } void gwd_settings_storage_gsettings_init (GWDSettingsStorageGSettings *self) { } GWDSettingsStorage * gwd_settings_storage_gsettings_new (GSettings *desktop, GSettings *mutter, GSettings *gwd, GWDSettingsWritable *writable) { static const guint gwd_settings_storage_gsettings_n_construction_params = 4; GParameter param[gwd_settings_storage_gsettings_n_construction_params]; GValue desktop_value = G_VALUE_INIT; GValue mutter_value = G_VALUE_INIT; GValue gwd_value = G_VALUE_INIT; GValue writable_value = G_VALUE_INIT; GWDSettingsStorage *storage = NULL; g_return_val_if_fail (writable != NULL, NULL); g_value_init (&desktop_value, G_TYPE_OBJECT); g_value_init (&mutter_value, G_TYPE_OBJECT); g_value_init (&gwd_value, G_TYPE_OBJECT); g_value_init (&writable_value, G_TYPE_POINTER); g_value_take_object (&desktop_value, desktop); g_value_take_object (&mutter_value, mutter); g_value_take_object (&gwd_value, gwd); g_value_set_pointer (&writable_value, writable); param[0].name = "desktop-gsettings"; param[0].value = desktop_value; param[1].name = "mutter-gsettings"; param[1].value = mutter_value; param[2].name = "gwd-gsettings"; param[2].value = gwd_value; param[3].name = "writable-settings"; param[3].value = writable_value; storage = GWD_SETTINGS_STORAGE_INTERFACE (g_object_newv (GWD_TYPE_SETTINGS_STORAGE_GSETTINGS, gwd_settings_storage_gsettings_n_construction_params, param)); g_value_unset (&desktop_value); g_value_unset (&mutter_value); g_value_unset (&gwd_value); g_value_unset (&writable_value); return storage; } /* Factory methods */ static gpointer list_all_schemas (gpointer data) { return (gpointer) g_settings_list_schemas (); } static inline GSettings * get_settings_no_abort (const gchar *schema) { static GOnce get_settings_once = G_ONCE_INIT; const gchar * const * schemas; guint i = 0; g_once (&get_settings_once, list_all_schemas, NULL); schemas = (const gchar * const *) get_settings_once.retval; for (; schemas[i]; ++i) if (g_strcmp0 (schema, schemas[i]) == 0) return g_settings_new (schema); return NULL; } static void org_compiz_gwd_settings_changed (GSettings *settings, const gchar *key, gpointer user_data) { GWDSettingsStorage *storage = GWD_SETTINGS_STORAGE_INTERFACE (user_data); if (strcmp (key, ORG_COMPIZ_GWD_KEY_MOUSE_WHEEL_ACTION) == 0) gwd_settings_storage_update_titlebar_actions (storage); else if (strcmp (key, ORG_COMPIZ_GWD_KEY_BLUR_TYPE) == 0) gwd_settings_storage_update_blur (storage); else if (strcmp (key, ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME) == 0) gwd_settings_storage_update_metacity_theme (storage); else if (strcmp (key, ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_OPACITY) == 0 || strcmp (key, ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_SHADE_OPACITY) == 0 || strcmp (key, ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_OPACITY) == 0 || strcmp (key, ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_SHADE_OPACITY) == 0) gwd_settings_storage_update_opacity (storage); else if (strcmp (key, ORG_COMPIZ_GWD_KEY_USE_TOOLTIPS) == 0) gwd_settings_storage_update_use_tooltips (storage); } void gwd_connect_org_compiz_gwd_settings (GSettings *settings, GWDSettingsStorage *storage) { if (!settings) return; g_signal_connect (settings, "changed", (GCallback) org_compiz_gwd_settings_changed, storage); } GSettings * gwd_get_org_compiz_gwd_settings () { return get_settings_no_abort (ORG_COMPIZ_GWD); } static void org_gnome_mutter_settings_changed (GSettings *settings, const gchar *key, gpointer user_data) { GWDSettingsStorage *storage = GWD_SETTINGS_STORAGE_INTERFACE (user_data); if (strcmp (key, ORG_GNOME_MUTTER_DRAGGABLE_BORDER_WIDTH) == 0) gwd_settings_storage_update_draggable_border_width (storage); else if (strcmp (key, ORG_GNOME_MUTTER_ATTACH_MODAL_DIALOGS) == 0) gwd_settings_storage_update_attach_modal_dialogs (storage); } void gwd_connect_org_gnome_mutter_settings (GSettings *settings, GWDSettingsStorage *storage) { if (!settings) return; g_signal_connect (settings, "changed", (GCallback) org_gnome_mutter_settings_changed, storage); } GSettings * gwd_get_org_gnome_mutter_settings () { return get_settings_no_abort (ORG_GNOME_MUTTER); } static void org_gnome_desktop_wm_keybindings_settings_changed (GSettings *settings, const gchar *key, gpointer user_data) { GWDSettingsStorage *storage = GWD_SETTINGS_STORAGE_INTERFACE (user_data); if (strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_USES_SYSTEM_FONT) == 0 || strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_FONT) == 0) gwd_settings_storage_update_font (storage); else if (strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_FONT) == 0) gwd_settings_storage_update_font (storage); else if (strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_DOUBLE_CLICK_TITLEBAR) == 0 || strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_MIDDLE_CLICK_TITLEBAR) == 0 || strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_RIGHT_CLICK_TITLEBAR) == 0) gwd_settings_storage_update_titlebar_actions (storage); else if (strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_THEME) == 0) gwd_settings_storage_update_metacity_theme (storage); else if (strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_BUTTON_LAYOUT) == 0) gwd_settings_storage_update_button_layout (storage); } void gwd_connect_org_gnome_desktop_wm_preferences_settings (GSettings *settings, GWDSettingsStorage *storage) { if (!settings) return; g_signal_connect (settings, "changed", (GCallback) org_gnome_desktop_wm_keybindings_settings_changed, storage); } GSettings * gwd_get_org_gnome_desktop_wm_preferences_settings () { return get_settings_no_abort (ORG_GNOME_DESKTOP_WM_PREFERENCES); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-writable-interface.c0000644000015301777760000001366212321343002030106 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include "gwd-settings-writable-interface.h" static void gwd_settings_writable_interface_default_init (GWDSettingsWritableInterface *settings_interface); G_DEFINE_INTERFACE (GWDSettingsWritable, gwd_settings_writable_interface, G_TYPE_OBJECT); static void gwd_settings_writable_interface_default_init (GWDSettingsWritableInterface *settings_interface) { } void gwd_settings_writable_freeze_updates (GWDSettingsWritable *settings) { GWDSettingsWritableInterface *iface = GWD_SETTINGS_WRITABLE_GET_INTERFACE (settings); (*iface->freeze_updates) (settings); } void gwd_settings_writable_thaw_updates (GWDSettingsWritable *settings) { GWDSettingsWritableInterface *iface = GWD_SETTINGS_WRITABLE_GET_INTERFACE (settings); (*iface->thaw_updates) (settings); } gboolean gwd_settings_writable_shadow_property_changed (GWDSettingsWritable *settings, gdouble active_shadow_radius, gdouble active_shadow_opacity, gdouble active_shadow_offset_x, gdouble active_shadow_offset_y, const gchar *active_shadow_color, gdouble inactive_shadow_radius, gdouble inactive_shadow_opacity, gdouble inactive_shadow_offset_x, gdouble inactive_shadow_offset_y, const gchar *inactive_shadow_color) { GWDSettingsWritableInterface *iface = GWD_SETTINGS_WRITABLE_GET_INTERFACE (settings); return (*iface->shadow_property_changed) (settings, active_shadow_radius, active_shadow_opacity, active_shadow_offset_x, active_shadow_offset_y, active_shadow_color, inactive_shadow_radius, inactive_shadow_opacity, inactive_shadow_offset_x, inactive_shadow_offset_y, inactive_shadow_color); } gboolean gwd_settings_writable_use_tooltips_changed (GWDSettingsWritable *settings, gboolean use_tooltips) { GWDSettingsWritableInterface *iface = GWD_SETTINGS_WRITABLE_GET_INTERFACE (settings); return (*iface->use_tooltips_changed) (settings, use_tooltips); } gboolean gwd_settings_writable_draggable_border_width_changed (GWDSettingsWritable *settings, gint draggable_border_width) { GWDSettingsWritableInterface *iface = GWD_SETTINGS_WRITABLE_GET_INTERFACE (settings); return (*iface->draggable_border_width_changed) (settings, draggable_border_width); } gboolean gwd_settings_writable_attach_modal_dialogs_changed (GWDSettingsWritable *settings, gboolean attach_modal_dialogs) { GWDSettingsWritableInterface *iface = GWD_SETTINGS_WRITABLE_GET_INTERFACE (settings); return (*iface->attach_modal_dialogs_changed) (settings, attach_modal_dialogs); } gboolean gwd_settings_writable_blur_changed (GWDSettingsWritable *settings, const gchar *blur_type) { GWDSettingsWritableInterface *iface = GWD_SETTINGS_WRITABLE_GET_INTERFACE (settings); return (*iface->blur_changed) (settings, blur_type); } gboolean gwd_settings_writable_metacity_theme_changed (GWDSettingsWritable *settings, gboolean use_metacity_theme, const gchar *metacity_theme) { GWDSettingsWritableInterface *iface = GWD_SETTINGS_WRITABLE_GET_INTERFACE (settings); return (*iface->metacity_theme_changed) (settings, use_metacity_theme, metacity_theme); } gboolean gwd_settings_writable_opacity_changed (GWDSettingsWritable *settings, gdouble active_opacity, gdouble inactive_opacity, gboolean active_shade_opacity, gboolean inactive_shade_opacity) { GWDSettingsWritableInterface *iface = GWD_SETTINGS_WRITABLE_GET_INTERFACE (settings); return (*iface->opacity_changed) (settings, active_opacity, inactive_opacity, active_shade_opacity, inactive_shade_opacity); } gboolean gwd_settings_writable_button_layout_changed (GWDSettingsWritable *settings, const gchar *button_layout) { GWDSettingsWritableInterface *iface = GWD_SETTINGS_WRITABLE_GET_INTERFACE (settings); return (*iface->button_layout_changed) (settings, button_layout); } gboolean gwd_settings_writable_font_changed (GWDSettingsWritable *settings, gboolean titlebar_uses_system_font, const gchar *titlebar_font) { GWDSettingsWritableInterface *iface = GWD_SETTINGS_WRITABLE_GET_INTERFACE (settings); return (*iface->font_changed) (settings, titlebar_uses_system_font, titlebar_font); } gboolean gwd_settings_writable_titlebar_actions_changed (GWDSettingsWritable *settings, const gchar *action_double_click_titlebar, const gchar *action_middle_click_titlebar, const gchar *action_right_click_titlebar, const gchar *mouse_wheel_action) { GWDSettingsWritableInterface *iface = GWD_SETTINGS_WRITABLE_GET_INTERFACE (settings); return (*iface->titlebar_actions_changed) (settings, action_double_click_titlebar, action_middle_click_titlebar, action_right_click_titlebar, mouse_wheel_action); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-xproperty-storage.c0000644000015301777760000002216112321343002030047 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include "gtk-window-decorator.h" #include "gwd-settings-writable-interface.h" #include "gwd-settings-xproperty-interface.h" #include "gwd-settings-xproperty-storage.h" #define GWD_SETTINGS_STORAGE_XPROP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GWD_TYPE_SETTINGS_STORAGE_XPROP, GWDSettingsStorageXProp)); #define GWD_SETTINGS_STORAGE_XPROP_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GWD_TYPE_SETTINGS_STORAGE_XPROP, GWDSettingsStorageXPropClass)); #define GWD_IS_MOCK_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GWD_TYPE_SETTINGS_STORAGE_XPROP)); #define GWD_IS_MOCK_SETTINGS_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GWD_TYPE_SETTINGS_STORAGE_XPROP)); #define GWD_SETTINGS_STORAGE_XPROP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GWD_TYPE_SETTINGS_STORAGE_XPROP, GWDSettingsStorageXPropClass)); typedef struct _GWDSettingsStorageXProp { GObject parent; } GWDSettingsStorageXProp; typedef struct _GWDSettingsStorageXPropClass { GObjectClass parent_class; } GWDSettingsStorageXPropClass; static void gwd_settings_storage_xprop_interface_init (GWDSettingsXPropertyStorageInterface *interface); G_DEFINE_TYPE_WITH_CODE (GWDSettingsStorageXProp, gwd_settings_storage_xprop, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GWD_TYPE_XPROPERTY_SETTINGS_STORAGE_INTERFACE, gwd_settings_storage_xprop_interface_init)) #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GWD_TYPE_SETTINGS_STORAGE_XPROP, GWDSettingsStorageXPropPrivate)) enum { GWD_SETTINGS_STORAGE_XPROP_PROPERTY_WRITABLE_SETTINGS = 1, GWD_SETTINGS_STORAGE_XPROP_PROPERTY_DISPLAY = 2, GWD_SETTINGS_STORAGE_XPROP_PROPERTY_ROOT = 3 }; typedef struct _GWDSettingsStorageXPropPrivate { Display *xdpy; Window root; GWDSettingsWritable *writable; } GWDSettingsStorageXPropPrivate; static gboolean gwd_settings_storage_xprop_update_all (GWDSettingsXPropertyStorage *storage) { GWDSettingsStorageXProp *xprop = GWD_SETTINGS_STORAGE_XPROP (storage); GWDSettingsStorageXPropPrivate *priv = GET_PRIVATE (xprop); Atom actual; int result, format; unsigned long n, left; unsigned char *prop_data; XTextProperty shadow_color_xtp; gdouble aradius; gdouble aopacity; gint ax_off; gint ay_off; char *active_shadow_color = NULL; gdouble iradius; gdouble iopacity; gint ix_off; gint iy_off; char *inactive_shadow_color = NULL; result = XGetWindowProperty (priv->xdpy, priv->root, compiz_shadow_info_atom, 0, 32768, 0, XA_INTEGER, &actual, &format, &n, &left, &prop_data); if (result != Success) return FALSE; if (n == 8) { long *data = (long *) prop_data; aradius = data[0]; aopacity = data[1]; ax_off = data[2]; ay_off = data[3]; iradius = data[4]; iopacity = data[5]; ix_off = data[6]; iy_off = data[7]; /* Radius and Opacity are multiplied by 1000 to keep precision, * divide by that much to get our real radius and opacity */ aradius /= 1000; aopacity /= 1000; iradius /= 1000; iopacity /= 1000; XFree (prop_data); } else { XFree (prop_data); return FALSE; } result = XGetTextProperty (priv->xdpy, priv->root, &shadow_color_xtp, compiz_shadow_color_atom); if (shadow_color_xtp.value) { int ret_count = 0; char **t_data = NULL; XTextPropertyToStringList (&shadow_color_xtp, &t_data, &ret_count); if (ret_count == 2) { active_shadow_color = strdup (t_data[0]); inactive_shadow_color = strdup (t_data[1]); XFree (shadow_color_xtp.value); if (t_data) XFreeStringList (t_data); } else { XFree (shadow_color_xtp.value); return FALSE; } } return gwd_settings_writable_shadow_property_changed (priv->writable, (gdouble) MAX (0.0, MIN (aradius, 48.0)), (gdouble) MAX (0.0, MIN (aopacity, 6.0)), (gdouble) MAX (-16, MIN (ax_off, 16)), (gdouble) MAX (-16, MIN (ay_off, 16)), active_shadow_color, (gdouble) MAX (0.0, MIN (iradius, 48.0)), (gdouble) MAX (0.0, MIN (iopacity, 6.0)), (gdouble) MAX (-16, MIN (ix_off, 16)), (gdouble) MAX (-16, MIN (iy_off, 16)), inactive_shadow_color); } static void gwd_settings_storage_xprop_interface_init (GWDSettingsXPropertyStorageInterface *interface) { interface->update_all = gwd_settings_storage_xprop_update_all; } static void gwd_settings_storage_xprop_dispose (GObject *object) { GWDSettingsStorageXPropPrivate *priv = GET_PRIVATE (object); G_OBJECT_CLASS (gwd_settings_storage_xprop_parent_class)->dispose (object); if (priv->writable) g_object_unref (priv->writable); } static void gwd_settings_storage_xprop_finalize (GObject *object) { G_OBJECT_CLASS (gwd_settings_storage_xprop_parent_class)->finalize (object); } static void gwd_settings_storage_xprop_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDSettingsStorageXPropPrivate *priv = GET_PRIVATE (object); switch (property_id) { case GWD_SETTINGS_STORAGE_XPROP_PROPERTY_WRITABLE_SETTINGS: g_return_if_fail (!priv->writable); priv->writable = g_value_get_pointer (value); break; case GWD_SETTINGS_STORAGE_XPROP_PROPERTY_DISPLAY: g_return_if_fail (!priv->xdpy); priv->xdpy = (Display *) g_value_get_pointer (value); break; case GWD_SETTINGS_STORAGE_XPROP_PROPERTY_ROOT: g_return_if_fail (!priv->root); priv->root = (Window) g_value_get_int (value); break; default: break; } } static void gwd_settings_storage_xprop_class_init (GWDSettingsStorageXPropClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); g_type_class_add_private (klass, sizeof (GWDSettingsStorageXPropPrivate)); object_class->dispose = gwd_settings_storage_xprop_dispose; object_class->finalize = gwd_settings_storage_xprop_finalize; object_class->set_property = gwd_settings_storage_xprop_set_property; g_object_class_install_property (object_class, GWD_SETTINGS_STORAGE_XPROP_PROPERTY_WRITABLE_SETTINGS, g_param_spec_pointer ("writable-settings", "GWDSettingsWritable", "An object that implements GWDSettingsWritable", G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (object_class, GWD_SETTINGS_STORAGE_XPROP_PROPERTY_DISPLAY, g_param_spec_pointer ("display", "A Display", "An Xlib connection", G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (object_class, GWD_SETTINGS_STORAGE_XPROP_PROPERTY_ROOT, g_param_spec_int ("root-window", "Root Window", "A Window which is the root window to store properties on", 0, G_MAXINT32, 0, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); } static void gwd_settings_storage_xprop_init (GWDSettingsStorageXProp *self) { } GWDSettingsXPropertyStorage * gwd_settings_storage_xprop_new (Display *dpy, Window root, GWDSettingsWritable *writable) { static const guint gwd_settings_xprop_storage_n_construction_params = 3; GParameter param[gwd_settings_xprop_storage_n_construction_params]; GWDSettingsXPropertyStorage *storage = NULL; GValue display_value = G_VALUE_INIT; GValue root_window_value = G_VALUE_INIT; GValue writable_value = G_VALUE_INIT; g_value_init (&display_value, G_TYPE_POINTER); g_value_init (&root_window_value, G_TYPE_INT); g_value_init (&writable_value, G_TYPE_POINTER); g_value_set_pointer (&display_value, dpy); g_value_set_int (&root_window_value, root); g_value_set_pointer (&writable_value, writable); param[0].name = "writable-settings"; param[0].value = writable_value; param[1].name = "display"; param[1].value = display_value; param[2].name = "root-window"; param[2].value = root_window_value; storage = GWD_SETTINGS_XPROPERTY_STORAGE_INTERFACE (g_object_newv (GWD_TYPE_SETTINGS_STORAGE_XPROP, gwd_settings_xprop_storage_n_construction_params, param)); g_value_unset (&display_value); g_value_unset (&root_window_value); g_value_unset (&writable_value); return storage; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/frames.c0000644000015301777760000002052712321343002023175 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Authored by: * Sam Spilsbury */ #include "gtk-window-decorator.h" typedef struct _decor_frame_type_info { create_frame_proc create_func; destroy_frame_proc destroy_func; } decor_frame_type_info_t; GHashTable *frame_info_table; GHashTable *frames_table; void decor_frame_refresh (decor_frame_t *frame) { decor_shadow_options_t active_o, inactive_o; decor_shadow_info_t *info; const gchar *titlebar_font = NULL; gwd_decor_frame_ref (frame); update_style (frame->style_window_rgba); update_style (frame->style_window_rgb); g_object_get (settings, "titlebar-font", &titlebar_font, NULL); set_frame_scale (frame, titlebar_font); titlebar_font = NULL; frame_update_titlebar_font (frame); if (strcmp (frame->type, "switcher") != 0 && strcmp (frame->type, "bare") != 0) (*theme_update_border_extents) (frame); (*theme_get_shadow) (frame, &active_o, TRUE); (*theme_get_shadow) (frame, &inactive_o, FALSE); info = malloc (sizeof (decor_shadow_info_t)); if (!info) return; info->frame = frame; info->state = 0; frame_update_shadow (frame, info, &active_o, &inactive_o); gwd_decor_frame_unref (frame); free (info); info = NULL; } decor_frame_t * gwd_get_decor_frame (const gchar *frame_name) { decor_frame_t *frame = g_hash_table_lookup (frames_table, frame_name); if (!frame) { /* Frame not found, look up frame type in the frame types * hash table and create a new one */ decor_frame_type_info_t *info = g_hash_table_lookup (frame_info_table, frame_name); if (!info) g_critical ("Could not find frame info %s in frame type table", frame_name); frame = (*info->create_func) (frame_name); if (!frame) g_critical ("Could not allocate frame %s", frame_name); g_hash_table_insert (frames_table, frame->type, frame); gwd_decor_frame_ref (frame); decor_frame_refresh (frame); } else gwd_decor_frame_ref (frame); return frame; } decor_frame_t * gwd_decor_frame_ref (decor_frame_t *frame) { ++frame->refcount; return frame; } decor_frame_t * gwd_decor_frame_unref (decor_frame_t *frame) { --frame->refcount; if (frame->refcount == 0) { decor_frame_type_info_t *info = g_hash_table_lookup (frame_info_table, frame->type); if (!info) g_critical ("Couldn't find %s in frame info table", frame->type); if(!g_hash_table_remove (frames_table, frame->type)) g_critical ("Could not remove frame type %s from hash_table!", frame->type); (*info->destroy_func) (frame); } return frame; } gboolean gwd_decor_frame_add_type (const gchar *name, create_frame_proc create_func, destroy_frame_proc destroy_func) { decor_frame_type_info_t *frame_type = malloc (sizeof (decor_frame_type_info_t)); if (!frame_type) return FALSE; frame_type->create_func = create_func; frame_type->destroy_func = destroy_func; g_hash_table_insert (frame_info_table, strdup (name), frame_type); return TRUE; } void gwd_decor_frame_remove_type (const gchar *name) { g_hash_table_remove (frame_info_table, name); } void gwd_frames_foreach (GHFunc foreach_func, gpointer user_data) { g_hash_table_foreach (frames_table, foreach_func, user_data); } void gwd_process_frames (GHFunc foreach_func, const gchar *frame_keys[], gint frame_keys_num, gpointer user_data) { gint i = 0; for (; i < frame_keys_num; ++i) { gpointer frame = g_hash_table_lookup (frames_table, frame_keys[i]); if (!frame) continue; (*foreach_func) ((gpointer) frame_keys[i], frame, user_data); } } void destroy_frame_type (gpointer data) { decor_frame_type_info_t *info = (decor_frame_type_info_t *) data; if (info) { /* TODO: Destroy all frames with this type using * the frame destroy function */ } free (info); } decor_frame_t * decor_frame_new (const gchar *type) { GdkScreen *gdkscreen = gdk_screen_get_default (); GdkColormap *colormap; decor_frame_t *frame = malloc (sizeof (decor_frame_t)); if (!frame) { g_critical ("Couldn't allocate frame!"); return NULL; } frame->type = strdup (type); frame->refcount = 0; frame->titlebar_height = 17; frame->max_titlebar_height = 17; frame->border_shadow_active = NULL; frame->border_shadow_inactive = NULL; frame->border_no_shadow = NULL; frame->max_border_no_shadow = NULL; frame->max_border_shadow_active = NULL; frame->max_border_shadow_inactive = NULL; frame->titlebar_font = NULL; frame->style_window_rgba = gtk_window_new (GTK_WINDOW_POPUP); colormap = gdk_screen_get_rgba_colormap (gdkscreen); if (colormap) gtk_widget_set_colormap (frame->style_window_rgba, colormap); gtk_widget_realize (frame->style_window_rgba); gtk_widget_set_size_request (frame->style_window_rgba, 0, 0); gtk_window_move (GTK_WINDOW (frame->style_window_rgba), -100, -100); frame->pango_context = gtk_widget_create_pango_context (frame->style_window_rgba); g_signal_connect_data (frame->style_window_rgba, "style-set", G_CALLBACK (style_changed), (gpointer) frame->pango_context, 0, 0); frame->style_window_rgb = gtk_window_new (GTK_WINDOW_POPUP); colormap = gdk_screen_get_rgb_colormap (gdkscreen); if (colormap) gtk_widget_set_colormap (frame->style_window_rgb, colormap); gtk_widget_realize (frame->style_window_rgb); gtk_widget_set_size_request (frame->style_window_rgb, 0, 0); gtk_window_move (GTK_WINDOW (frame->style_window_rgb), -100, -100); g_signal_connect_data (frame->style_window_rgb, "style-set", G_CALLBACK (style_changed), (gpointer) frame->pango_context, 0, 0); return frame; } void decor_frame_destroy (decor_frame_t *frame) { Display *xdisplay = gdk_x11_get_default_xdisplay (); if (frame->border_shadow_active) decor_shadow_destroy (xdisplay, frame->border_shadow_active); if (frame->border_shadow_inactive) decor_shadow_destroy (xdisplay, frame->border_shadow_inactive); if (frame->border_no_shadow) decor_shadow_destroy (xdisplay, frame->border_no_shadow); if (frame->max_border_shadow_active) decor_shadow_destroy (xdisplay, frame->max_border_shadow_active); if (frame->max_border_shadow_inactive) decor_shadow_destroy (xdisplay, frame->max_border_shadow_inactive); if (frame->max_border_no_shadow) decor_shadow_destroy (xdisplay, frame->max_border_no_shadow); if (frame->style_window_rgba) gtk_widget_destroy (GTK_WIDGET (frame->style_window_rgba)); if (frame->style_window_rgb) gtk_widget_destroy (GTK_WIDGET (frame->style_window_rgb)); if (frame->pango_context) g_object_unref (G_OBJECT (frame->pango_context)); if (frame->titlebar_font) pango_font_description_free (frame->titlebar_font); if (frame) free (frame->type); free (frame); } void initialize_decorations () { frame_info_table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroy_frame_type); gwd_decor_frame_add_type ("normal", create_normal_frame, destroy_normal_frame); gwd_decor_frame_add_type ("dialog", create_normal_frame, destroy_normal_frame); gwd_decor_frame_add_type ("modal_dialog", create_normal_frame, destroy_normal_frame); gwd_decor_frame_add_type ("menu", create_normal_frame, destroy_normal_frame); gwd_decor_frame_add_type ("utility", create_normal_frame, destroy_normal_frame); gwd_decor_frame_add_type ("switcher", create_switcher_frame, destroy_switcher_frame); gwd_decor_frame_add_type ("bare", create_bare_frame, destroy_bare_frame); frames_table = g_hash_table_new (g_str_hash, g_str_equal); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-xproperty-interface.h0000644000015301777760000000361312321343002030351 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_SETTINGS_XPROPERTY_STORAGE_INTERFACE_H #define _COMPIZ_GWD_SETTINGS_XPROPERTY_STORAGE_INTERFACE_H #include #include G_BEGIN_DECLS #define GWD_SETTINGS_XPROPERTY_STORAGE_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, \ GWD_TYPE_XPROPERTY_SETTINGS_STORAGE_INTERFACE, \ GWDSettingsXPropertyStorage)) #define GWD_SETTINGS_XPROPERTY_STORAGE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE(obj, \ GWD_TYPE_XPROPERTY_SETTINGS_STORAGE_INTERFACE, \ GWDSettingsXPropertyStorageInterface)) #define GWD_TYPE_XPROPERTY_SETTINGS_STORAGE_INTERFACE (gwd_settings_xproperty_storage_interface_get_type ()) typedef struct _GWDSettingsXPropertyStorageInterface GWDSettingsXPropertyStorageInterface; struct _GWDSettingsXPropertyStorageInterface { GTypeInterface parent; gboolean (*update_all) (GWDSettingsXPropertyStorage *storage); }; gboolean gwd_settings_xproperty_storage_update_all (GWDSettingsXPropertyStorage *storage); GType gwd_settings_xproperty_storage_interface_get_type (void); G_END_DECLS #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-notified.h0000644000015301777760000000227412321343002026142 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_SETTINGS_NOTIFIED_H #define _COMPIZ_GWD_SETTINGS_NOTIFIED_H #include #include #include G_BEGIN_DECLS #define GWD_TYPE_SETTINGS_NOTIFIED (gwd_settings_notified_impl_get_type ()) GType gwd_settings_notified_impl_get_type (); GWDSettingsNotified * gwd_settings_notified_impl_new (WnckScreen *screen); G_END_DECLS #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-interface.h0000644000015301777760000000610612321343002026277 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_SETTINGS_INTERFACE_H #define _COMPIZ_GWD_SETTINGS_INTERFACE_H #include #include G_BEGIN_DECLS #define GWD_SETTINGS_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ GWD_TYPE_SETTINGS_INTERFACE, \ GWDSettings)) #define GWD_SETTINGS_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE(obj, \ GWD_TYPE_SETTINGS_INTERFACE, \ GWDSettingsInterface)) #define GWD_TYPE_SETTINGS_INTERFACE (gwd_settings_interface_get_type ()) typedef struct _GWDSettingsInterface GWDSettingsInterface; struct _GWDSettingsInterface { GTypeInterface parent; }; enum { BLUR_TYPE_NONE = 0, BLUR_TYPE_TITLEBAR = 1, BLUR_TYPE_ALL = 2 }; enum { CLICK_ACTION_NONE, CLICK_ACTION_SHADE, CLICK_ACTION_MAXIMIZE, CLICK_ACTION_MINIMIZE, CLICK_ACTION_RAISE, CLICK_ACTION_LOWER, CLICK_ACTION_MENU }; enum { WHEEL_ACTION_NONE, WHEEL_ACTION_SHADE }; extern const gboolean USE_TOOLTIPS_DEFAULT; extern const gdouble ACTIVE_SHADOW_RADIUS_DEFAULT; extern const gdouble ACTIVE_SHADOW_OPACITY_DEFAULT; extern const gint ACTIVE_SHADOW_OFFSET_X_DEFAULT; extern const gint ACTIVE_SHADOW_OFFSET_Y_DEFAULT; extern const gchar *ACTIVE_SHADOW_COLOR_DEFAULT; extern const gdouble INACTIVE_SHADOW_RADIUS_DEFAULT; extern const gdouble INACTIVE_SHADOW_OPACITY_DEFAULT; extern const gint INACTIVE_SHADOW_OFFSET_X_DEFAULT; extern const gint INACTIVE_SHADOW_OFFSET_Y_DEFAULT; extern const gchar *INACTIVE_SHADOW_COLOR_DEFAULT; extern const guint DRAGGABLE_BORDER_WIDTH_DEFAULT; extern const gboolean ATTACH_MODAL_DIALOGS_DEFAULT; extern const gint BLUR_TYPE_DEFAULT; extern const gchar *METACITY_THEME_DEFAULT; extern const gdouble METACITY_ACTIVE_OPACITY_DEFAULT; extern const gdouble METACITY_INACTIVE_OPACITY_DEFAULT; extern const gboolean METACITY_ACTIVE_SHADE_OPACITY_DEFAULT; extern const gboolean METACITY_INACTIVE_SHADE_OPACITY_DEFAULT; extern const gchar * METACITY_BUTTON_LAYOUT_DEFAULT; extern const guint DOUBLE_CLICK_ACTION_DEFAULT; extern const guint MIDDLE_CLICK_ACTION_DEFAULT; extern const guint RIGHT_CLICK_ACTION_DEFAULT; extern const guint WHEEL_ACTION_DEFAULT; extern const gchar * TITLEBAR_FONT_DEFAULT; GType gwd_settings_interface_get_type (void); G_END_DECLS #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/0000755000015301777760000000000012321344021022712 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/test_gwd_settings.cpp0000644000015301777760000017023512321343002027164 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "compiz_gwd_tests.h" #include "gwd-settings-interface.h" #include "gwd-settings.h" #include "gwd-settings-storage-gsettings.h" #include "gwd-settings-writable-interface.h" #include "gwd-settings-storage-interface.h" #include "gwd-settings-notified-interface.h" #include "decoration.h" #include "compiz_gwd_mock_settings.h" #include "compiz_gwd_mock_settings_writable.h" #include "compiz_gwd_mock_settings_storage.h" #include "compiz_gwd_mock_settings_notified.h" using ::testing::TestWithParam; using ::testing::Eq; using ::testing::Return; using ::testing::InvokeWithoutArgs; using ::testing::IgnoreResult; using ::testing::MatcherInterface; using ::testing::MakeMatcher; using ::testing::MatchResultListener; using ::testing::Matcher; using ::testing::Action; using ::testing::ActionInterface; using ::testing::MakeAction; using ::testing::IsNull; using ::testing::Values; using ::testing::_; using ::testing::StrictMock; using ::testing::InSequence; template class GValueCmp { public: typedef ValueCType (*GetFunc) (const GValue *value); bool compare (const ValueCType &val, GValue *value, GetFunc get) { const ValueCType &valForValue = (*get) (value); return valForValue == val; } }; template <> class GValueCmp { public: typedef gpointer (*GetFunc) (const GValue *value); bool compare (const decor_shadow_options_t &val, GValue *value, GetFunc get) { gpointer shadowOptionsPtr = (*get) (value); const decor_shadow_options_t &shadowOptions = *(reinterpret_cast (shadowOptionsPtr)); if (decor_shadow_options_cmp (&val, &shadowOptions)) return true; else return false; } }; template <> class GValueCmp { public: typedef const gchar * (*GetFunc) (const GValue *value); bool compare (const std::string &val, GValue *value, GetFunc get) { const gchar *valueForValue = (*get) (value); const std::string valueForValueStr (valueForValue);\ return val == valueForValueStr; } }; namespace { std::ostream & operator<< (std::ostream &os, const decor_shadow_options_t &options) { os << " radius: " << options.shadow_radius << " opacity: " << options.shadow_opacity << " offset: (" << options.shadow_offset_x << ", " << options.shadow_offset_y << ")" << " color: r: " << options.shadow_color[0] << " g: " << options.shadow_color[1] << " b: " << options.shadow_color[2]; return os; } } template class GObjectPropertyMatcher : public ::testing::MatcherInterface { public: GObjectPropertyMatcher (const ValueCType &value, typename GValueCmp::GetFunc func) : mValue (value), mGetFunc (func) { } virtual ~GObjectPropertyMatcher () {} virtual bool MatchAndExplain (GValue *value, MatchResultListener *listener) const { return GValueCmp ().compare (mValue, value, mGetFunc); } virtual void DescribeTo (std::ostream *os) const { *os << "value contains " << mValue; } virtual void DescribeNegationTo (std::ostream *os) const { *os << "value does not contain " << mValue; } private: const ValueCType &mValue; typename GValueCmp::GetFunc mGetFunc; }; namespace testing_values { const gdouble ACTIVE_SHADOW_OPACITY_VALUE = 1.0; const gdouble ACTIVE_SHADOW_RADIUS_VALUE = 2.0; const gdouble ACTIVE_SHADOW_OFFSET_X_VALUE = 3.0; const gint ACTIVE_SHADOW_OFFSET_X_INT_VALUE = ACTIVE_SHADOW_OFFSET_X_VALUE; const gdouble ACTIVE_SHADOW_OFFSET_Y_VALUE = 4.0; const gint ACTIVE_SHADOW_OFFSET_Y_INT_VALUE = ACTIVE_SHADOW_OFFSET_Y_VALUE; const std::string ACTIVE_SHADOW_COLOR_STR_VALUE ("#ffffffff"); const gushort ACTIVE_SHADOW_COLOR_VALUE[] = { 255, 255, 255 }; const gdouble INACTIVE_SHADOW_OPACITY_VALUE = 5.0; const gdouble INACTIVE_SHADOW_RADIUS_VALUE = 6.0; const gdouble INACTIVE_SHADOW_OFFSET_X_VALUE = 7.0; const gint INACTIVE_SHADOW_OFFSET_X_INT_VALUE = INACTIVE_SHADOW_OFFSET_X_VALUE; const gdouble INACTIVE_SHADOW_OFFSET_Y_VALUE = 8.0; const gint INACTIVE_SHADOW_OFFSET_Y_INT_VALUE = INACTIVE_SHADOW_OFFSET_Y_VALUE; const std::string INACTIVE_SHADOW_COLOR_STR_VALUE ("#00000000"); const gushort INACTIVE_SHADOW_COLOR_VALUE[] = { 0, 0, 0 }; const gboolean USE_TOOLTIPS_VALUE = !USE_TOOLTIPS_DEFAULT; const guint DRAGGABLE_BORDER_WIDTH_VALUE = 1; const gboolean ATTACH_MODAL_DIALOGS_VALUE = TRUE; const std::string BLUR_TYPE_TITLEBAR_VALUE ("titlebar"); const gint BLUR_TYPE_TITLEBAR_INT_VALUE = BLUR_TYPE_TITLEBAR; const std::string BLUR_TYPE_ALL_VALUE ("all"); const gint BLUR_TYPE_ALL_INT_VALUE = BLUR_TYPE_ALL; const std::string BLUR_TYPE_NONE_VALUE ("none"); const gint BLUR_TYPE_NONE_INT_VALUE = BLUR_TYPE_NONE; const gboolean USE_METACITY_THEME_VALUE = TRUE; const std::string METACITY_THEME_VALUE ("metacity_theme"); const gboolean NO_USE_METACITY_THEME_VALUE = FALSE; const std::string NO_METACITY_THEME_VALUE (""); const gdouble ACTIVE_OPACITY_VALUE = 0.9; const gdouble INACTIVE_OPACITY_VALUE = 0.8; const gboolean ACTIVE_SHADE_OPACITY_VALUE = !METACITY_ACTIVE_SHADE_OPACITY_DEFAULT; const gboolean INACTIVE_SHADE_OPACITY_VALUE = !METACITY_INACTIVE_SHADE_OPACITY_DEFAULT; const std::string BUTTON_LAYOUT_VALUE ("button_layout"); const gboolean USE_SYSTEM_FONT_VALUE = TRUE; const gboolean NO_USE_SYSTEM_FONT_VALUE = FALSE; const std::string TITLEBAR_FONT_VALUE ("Ubuntu 12"); const std::string TITLEBAR_ACTION_SHADE ("toggle_shade"); const std::string TITLEBAR_ACTION_MAX_VERT ("toggle_maximize_vertically"); const std::string TITLEBAR_ACTION_MAX_HORZ ("toggle_maximize_horizontally"); const std::string TITLEBAR_ACTION_MAX ("toggle_maximize"); const std::string TITLEBAR_ACTION_MINIMIZE ("minimize"); const std::string TITLEBAR_ACTION_MENU ("menu"); const std::string TITLEBAR_ACTION_LOWER ("lower"); const std::string TITLEBAR_ACTION_NONE ("none"); const std::string MOUSE_WHEEL_ACTION_SHADE ("shade"); } template inline Matcher GValueMatch (const ValueCType &value, typename GValueCmp::GetFunc func) { return MakeMatcher (new GObjectPropertyMatcher (value, func)); } class GWDSettingsTestCommon : public ::testing::Test { public: virtual void SetUp () { env.SetUpEnv (); g_type_init (); } virtual void TearDown () { env.TearDownEnv (); } private: CompizGLibGSliceOffEnv env; }; class GWDMockSettingsWritableTest : public GWDSettingsTestCommon { }; namespace { void gwd_settings_storage_unref (GWDSettingsStorage *storage) { g_object_unref (G_OBJECT (storage)); } void gwd_settings_writable_unref (GWDSettingsWritable *writable) { g_object_unref (G_OBJECT (writable)); } void gwd_settings_unref (GWDSettingsImpl *settings) { g_object_unref (G_OBJECT (settings)); } void gwd_settings_notified_do_nothing (GWDSettingsNotified *notified) { } class AutoUnsetGValue { public: AutoUnsetGValue (GType type) { /* This is effectively G_VALUE_INIT, we can't use that here * because this is not a C++11 project */ mValue.g_type = 0; mValue.data[0].v_int = 0; mValue.data[1].v_int = 0; g_value_init (&mValue, type); } ~AutoUnsetGValue () { g_value_unset (&mValue); } operator GValue & () { return mValue; } private: GValue mValue; }; } TEST_F(GWDMockSettingsWritableTest, TestMock) { GWDMockSettingsWritableGMock writableGMock; boost::shared_ptr writableMock (gwd_mock_settings_writable_new (&writableGMock), boost::bind (gwd_settings_writable_unref, _1)); EXPECT_CALL (writableGMock, freezeUpdates ()); EXPECT_CALL (writableGMock, thawUpdates ()); EXPECT_CALL (writableGMock, shadowPropertyChanged (testing_values::ACTIVE_SHADOW_RADIUS_VALUE, testing_values::ACTIVE_SHADOW_OPACITY_VALUE, testing_values::ACTIVE_SHADOW_OFFSET_X_VALUE, testing_values::ACTIVE_SHADOW_OFFSET_Y_VALUE, Eq (testing_values::ACTIVE_SHADOW_COLOR_STR_VALUE), testing_values::INACTIVE_SHADOW_RADIUS_VALUE, testing_values::INACTIVE_SHADOW_OPACITY_VALUE, testing_values::INACTIVE_SHADOW_OFFSET_X_VALUE, testing_values::INACTIVE_SHADOW_OFFSET_Y_VALUE, Eq (testing_values::INACTIVE_SHADOW_COLOR_STR_VALUE))).WillOnce (Return (TRUE)); EXPECT_CALL (writableGMock, useTooltipsChanged (testing_values::USE_TOOLTIPS_VALUE)).WillOnce (Return (TRUE)); EXPECT_CALL (writableGMock, draggableBorderWidthChanged (testing_values::DRAGGABLE_BORDER_WIDTH_VALUE)).WillOnce (Return (TRUE)); EXPECT_CALL (writableGMock, attachModalDialogsChanged (testing_values::ATTACH_MODAL_DIALOGS_VALUE)).WillOnce (Return (TRUE)); EXPECT_CALL (writableGMock, blurChanged (Eq (testing_values::BLUR_TYPE_TITLEBAR_VALUE))).WillOnce (Return (TRUE)); EXPECT_CALL (writableGMock, metacityThemeChanged (TRUE, Eq (testing_values::METACITY_THEME_VALUE))).WillOnce (Return (TRUE)); EXPECT_CALL (writableGMock, opacityChanged (testing_values::ACTIVE_OPACITY_VALUE, testing_values::INACTIVE_OPACITY_VALUE, testing_values::ACTIVE_SHADE_OPACITY_VALUE, testing_values::INACTIVE_SHADE_OPACITY_VALUE)).WillOnce (Return (TRUE)); EXPECT_CALL (writableGMock, buttonLayoutChanged (Eq (testing_values::BUTTON_LAYOUT_VALUE))).WillOnce (Return (TRUE)); EXPECT_CALL (writableGMock, fontChanged (testing_values::USE_SYSTEM_FONT_VALUE, testing_values::TITLEBAR_FONT_VALUE.c_str ())).WillOnce (Return (TRUE)); EXPECT_CALL (writableGMock, titlebarActionsChanged (Eq (testing_values::TITLEBAR_ACTION_MAX), Eq (testing_values::TITLEBAR_ACTION_MENU), Eq (testing_values::TITLEBAR_ACTION_LOWER), Eq (testing_values::TITLEBAR_ACTION_SHADE))).WillOnce (Return (TRUE)); EXPECT_CALL (writableGMock, dispose ()); EXPECT_CALL (writableGMock, finalize ()); gwd_settings_writable_freeze_updates (writableMock.get ()); gwd_settings_writable_thaw_updates (writableMock.get ()); EXPECT_THAT (gwd_settings_writable_shadow_property_changed (writableMock.get (), testing_values::ACTIVE_SHADOW_RADIUS_VALUE, testing_values::ACTIVE_SHADOW_OPACITY_VALUE, testing_values::ACTIVE_SHADOW_OFFSET_X_VALUE, testing_values::ACTIVE_SHADOW_OFFSET_Y_VALUE, testing_values::ACTIVE_SHADOW_COLOR_STR_VALUE.c_str (), testing_values::INACTIVE_SHADOW_RADIUS_VALUE, testing_values::INACTIVE_SHADOW_OPACITY_VALUE, testing_values::INACTIVE_SHADOW_OFFSET_X_VALUE, testing_values::INACTIVE_SHADOW_OFFSET_Y_VALUE, testing_values::INACTIVE_SHADOW_COLOR_STR_VALUE.c_str ()), IsTrue ()); EXPECT_THAT (gwd_settings_writable_use_tooltips_changed (writableMock.get (), testing_values::USE_TOOLTIPS_VALUE), IsTrue ()); EXPECT_THAT (gwd_settings_writable_draggable_border_width_changed (writableMock.get (), testing_values::DRAGGABLE_BORDER_WIDTH_VALUE), IsTrue ()); EXPECT_THAT (gwd_settings_writable_attach_modal_dialogs_changed (writableMock.get (), testing_values::ATTACH_MODAL_DIALOGS_VALUE), IsTrue ()); EXPECT_THAT (gwd_settings_writable_blur_changed (writableMock.get (), testing_values::BLUR_TYPE_TITLEBAR_VALUE.c_str ()), IsTrue ()); EXPECT_THAT (gwd_settings_writable_metacity_theme_changed (writableMock.get (), testing_values::USE_METACITY_THEME_VALUE, testing_values::METACITY_THEME_VALUE.c_str ()), IsTrue ()); EXPECT_THAT (gwd_settings_writable_opacity_changed (writableMock.get (), testing_values::ACTIVE_OPACITY_VALUE, testing_values::INACTIVE_OPACITY_VALUE, testing_values::ACTIVE_SHADE_OPACITY_VALUE, testing_values::INACTIVE_SHADE_OPACITY_VALUE), IsTrue ()); EXPECT_THAT (gwd_settings_writable_button_layout_changed (writableMock.get (), testing_values::BUTTON_LAYOUT_VALUE.c_str ()), IsTrue ()); EXPECT_THAT (gwd_settings_writable_font_changed (writableMock.get (), testing_values::USE_SYSTEM_FONT_VALUE, testing_values::TITLEBAR_FONT_VALUE.c_str ()), IsTrue ()); EXPECT_THAT (gwd_settings_writable_titlebar_actions_changed (writableMock.get (), testing_values::TITLEBAR_ACTION_MAX.c_str (), testing_values::TITLEBAR_ACTION_MENU.c_str (), testing_values::TITLEBAR_ACTION_LOWER.c_str (), testing_values::TITLEBAR_ACTION_SHADE.c_str ()), IsTrue ()); } class GWDMockSettingsTest : public GWDSettingsTestCommon { }; TEST_F(GWDMockSettingsTest, TestMock) { GWDMockSettingsGMock settingsGMock; boost::shared_ptr settingsMock (gwd_mock_settings_new (&settingsGMock), boost::bind (gwd_settings_unref, _1)); AutoUnsetGValue pointerValue (G_TYPE_POINTER); AutoUnsetGValue booleanValue (G_TYPE_BOOLEAN); AutoUnsetGValue stringValue (G_TYPE_STRING); AutoUnsetGValue integerValue (G_TYPE_INT); AutoUnsetGValue doubleValue (G_TYPE_DOUBLE); GValue &pointerGValue = pointerValue; GValue &booleanGValue = booleanValue; GValue &stringGValue = stringValue; GValue &integerGValue = integerValue; GValue &doubleGValue = doubleValue; int POINTEE_VALUE = 1; gpointer POINTER_VALUE = &POINTEE_VALUE; const std::string STRING_VALUE ("test"); const int INTEGER_VALUE = 2; const gboolean BOOLEAN_VALUE = TRUE; const gdouble DOUBLE_VALUE = 2.0; g_value_set_pointer (&pointerGValue, POINTER_VALUE); g_value_set_boolean (&booleanGValue, BOOLEAN_VALUE); g_value_set_string (&stringGValue, STRING_VALUE.c_str ()); g_value_set_int (&integerGValue, INTEGER_VALUE); g_value_set_double (&doubleGValue, DOUBLE_VALUE); EXPECT_CALL (settingsGMock, dispose ()); EXPECT_CALL (settingsGMock, finalize ()); /* The order of evaluation of matchers in Google Mock appears to be undefined and * the way GValueMatch is written makes it particularly unsafe when used with * matchers of multiple types on the same function, since there's no guaruntee * that the matchers will be traversed in any order. If a type is passed to * any of the matchers that it doesn't know how to handle then it will * call directly through to GValueCmp which will run into undefined behaviour * in itself. * * In reality, the API for GValueMatch is probably a little bit broken in this * sense, but just satisfying each expectation as soon as its set seems to do * the job here */ /* calling g_object_get_property actually resets * the value so expecting 0x0 is correct */ EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_ACTIVE_SHADOW, GValueMatch (0x0, g_value_get_pointer), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "active-shadow", &pointerGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_INACTIVE_SHADOW, GValueMatch (0x0, g_value_get_pointer), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "inactive-shadow", &pointerGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_USE_TOOLTIPS, GValueMatch (FALSE, g_value_get_boolean), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "use-tooltips", &booleanGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_DRAGGABLE_BORDER_WIDTH, GValueMatch (0, g_value_get_int), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "draggable-border-width", &integerGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_ATTACH_MODAL_DIALOGS, GValueMatch (FALSE, g_value_get_boolean), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "attach-modal-dialogs", &booleanGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_BLUR_CHANGED, GValueMatch (0, g_value_get_int), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "blur", &integerGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_METACITY_THEME, GValueMatch (NULL, g_value_get_string), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "metacity-theme", &stringGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_ACTIVE_OPACITY, GValueMatch (0.0, g_value_get_double), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "metacity-active-opacity", &doubleGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_INACTIVE_OPACITY, GValueMatch (0.0, g_value_get_double), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "metacity-inactive-opacity", &doubleGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_ACTIVE_SHADE_OPACITY, GValueMatch (FALSE, g_value_get_boolean), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "metacity-active-shade-opacity", &booleanGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_INACTIVE_SHADE_OPACITY, GValueMatch (FALSE, g_value_get_boolean), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "metacity-inactive-shade-opacity", &booleanGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_BUTTON_LAYOUT, GValueMatch (NULL, g_value_get_string), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "metacity-button-layout", &stringGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_TITLEBAR_ACTION_DOUBLE_CLICK, GValueMatch (0, g_value_get_int), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "titlebar-double-click-action", &integerGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_TITLEBAR_ACTION_MIDDLE_CLICK, GValueMatch (0, g_value_get_int), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "titlebar-middle-click-action", &integerGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_TITLEBAR_ACTION_RIGHT_CLICK, GValueMatch (0, g_value_get_int), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "titlebar-right-click-action", &integerGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_MOUSE_WHEEL_ACTION, GValueMatch (0, g_value_get_int), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "mouse-wheel-action", &integerGValue); EXPECT_CALL (settingsGMock, getProperty (GWD_MOCK_SETTINGS_PROPERTY_TITLEBAR_FONT, GValueMatch (NULL, g_value_get_string), _)); g_object_get_property (G_OBJECT (settingsMock.get ()), "titlebar-font", &stringGValue); } namespace { void ExpectAllNotificationsOnce (boost::shared_ptr > &gmockNotified, boost::shared_ptr &settings) { InSequence s; EXPECT_CALL (*gmockNotified, updateMetacityTheme ()).Times (1); EXPECT_CALL (*gmockNotified, updateMetacityButtonLayout ()).Times (1); EXPECT_CALL (*gmockNotified, updateFrames ()).Times (1); EXPECT_CALL (*gmockNotified, updateDecorations ()).Times (1); gwd_settings_writable_thaw_updates (GWD_SETTINGS_WRITABLE_INTERFACE (settings.get ())); } } class GWDSettingsTest : public GWDSettingsTestCommon { public: virtual void SetUp () { GWDSettingsTestCommon::SetUp (); mGMockNotified.reset (new StrictMock ()); mMockNotified.reset (gwd_mock_settings_notified_new (mGMockNotified.get ()), boost::bind (gwd_settings_notified_do_nothing, _1)); mSettings.reset (gwd_settings_impl_new (NULL, NULL, mMockNotified.get ()), boost::bind (gwd_settings_unref, _1)); ExpectAllNotificationsOnce (mGMockNotified, mSettings); } virtual void TearDown () { EXPECT_CALL (*mGMockNotified, dispose ()); EXPECT_CALL (*mGMockNotified, finalize ()); } protected: boost::shared_ptr > mGMockNotified; boost::shared_ptr mMockNotified; boost::shared_ptr mSettings; }; TEST_F(GWDSettingsTest, TestGWDSettingsInstantiation) { } /* Won't fail if the code in SetUp succeeds */ TEST_F(GWDSettingsTest, TestUpdateAllOnInstantiation) { } /* We're just using use_tooltips here as an example */ TEST_F(GWDSettingsTest, TestFreezeUpdatesNoUpdates) { gwd_settings_writable_freeze_updates (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ())); EXPECT_THAT (gwd_settings_writable_use_tooltips_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::USE_TOOLTIPS_VALUE), IsTrue ()); } /* We're just using use_tooltips here as an example */ TEST_F(GWDSettingsTest, TestFreezeUpdatesNoUpdatesThawUpdatesAllUpdates) { gwd_settings_writable_freeze_updates (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ())); EXPECT_THAT (gwd_settings_writable_use_tooltips_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::USE_TOOLTIPS_VALUE), IsTrue ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()); gwd_settings_writable_thaw_updates (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ())); } /* We're just using use_tooltips here as an example */ TEST_F(GWDSettingsTest, TestFreezeUpdatesNoUpdatesThawUpdatesAllUpdatesNoDupes) { gwd_settings_writable_freeze_updates (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ())); EXPECT_THAT (gwd_settings_writable_use_tooltips_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::USE_TOOLTIPS_VALUE), IsTrue ()); EXPECT_THAT (gwd_settings_writable_use_tooltips_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), !testing_values::USE_TOOLTIPS_VALUE), IsTrue ()); EXPECT_THAT (gwd_settings_writable_use_tooltips_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::USE_TOOLTIPS_VALUE), IsTrue ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()).Times (1); gwd_settings_writable_thaw_updates (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ())); } TEST_F(GWDSettingsTest, TestShadowPropertyChanged) { EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_THAT (gwd_settings_writable_shadow_property_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::ACTIVE_SHADOW_OPACITY_VALUE, testing_values::ACTIVE_SHADOW_RADIUS_VALUE, testing_values::ACTIVE_SHADOW_OFFSET_X_VALUE, testing_values::ACTIVE_SHADOW_OFFSET_Y_VALUE, testing_values::ACTIVE_SHADOW_COLOR_STR_VALUE.c_str (), testing_values::INACTIVE_SHADOW_OPACITY_VALUE, testing_values::INACTIVE_SHADOW_RADIUS_VALUE, testing_values::INACTIVE_SHADOW_OFFSET_X_VALUE, testing_values::INACTIVE_SHADOW_OFFSET_Y_VALUE, testing_values::INACTIVE_SHADOW_COLOR_STR_VALUE.c_str ()), IsTrue ()); AutoUnsetGValue activeShadowValue (G_TYPE_POINTER); AutoUnsetGValue inactiveShadowValue (G_TYPE_POINTER); GValue &activeShadowGValue = activeShadowValue; GValue &inactiveShadowGValue = inactiveShadowValue; g_object_get_property (G_OBJECT (mSettings.get ()), "active-shadow", &activeShadowGValue); g_object_get_property (G_OBJECT (mSettings.get ()), "inactive-shadow", &inactiveShadowGValue); decor_shadow_options_t activeShadow; activeShadow.shadow_opacity = testing_values::ACTIVE_SHADOW_OPACITY_VALUE; activeShadow.shadow_radius = testing_values::ACTIVE_SHADOW_RADIUS_VALUE; activeShadow.shadow_offset_x = testing_values::ACTIVE_SHADOW_OFFSET_X_INT_VALUE; activeShadow.shadow_offset_y = testing_values::ACTIVE_SHADOW_OFFSET_Y_INT_VALUE; activeShadow.shadow_color[0] = testing_values::ACTIVE_SHADOW_COLOR_VALUE[0]; activeShadow.shadow_color[1] = testing_values::ACTIVE_SHADOW_COLOR_VALUE[1]; activeShadow.shadow_color[2] = testing_values::ACTIVE_SHADOW_COLOR_VALUE[2]; decor_shadow_options_t inactiveShadow; inactiveShadow.shadow_opacity = testing_values::INACTIVE_SHADOW_OPACITY_VALUE; inactiveShadow.shadow_radius = testing_values::INACTIVE_SHADOW_RADIUS_VALUE; inactiveShadow.shadow_offset_x = testing_values::INACTIVE_SHADOW_OFFSET_X_INT_VALUE; inactiveShadow.shadow_offset_y = testing_values::INACTIVE_SHADOW_OFFSET_Y_INT_VALUE; inactiveShadow.shadow_color[0] = testing_values::INACTIVE_SHADOW_COLOR_VALUE[0]; inactiveShadow.shadow_color[1] = testing_values::INACTIVE_SHADOW_COLOR_VALUE[1]; inactiveShadow.shadow_color[2] = testing_values::INACTIVE_SHADOW_COLOR_VALUE[2]; EXPECT_THAT (&activeShadowGValue, GValueMatch (activeShadow, g_value_get_pointer)); EXPECT_THAT (&inactiveShadowGValue, GValueMatch (inactiveShadow, g_value_get_pointer)); } TEST_F(GWDSettingsTest, TestShadowPropertyChangedIsDefault) { EXPECT_THAT (gwd_settings_writable_shadow_property_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), ACTIVE_SHADOW_RADIUS_DEFAULT, ACTIVE_SHADOW_OPACITY_DEFAULT, ACTIVE_SHADOW_OFFSET_X_DEFAULT, ACTIVE_SHADOW_OFFSET_Y_DEFAULT, ACTIVE_SHADOW_COLOR_DEFAULT, INACTIVE_SHADOW_RADIUS_DEFAULT, INACTIVE_SHADOW_OPACITY_DEFAULT, INACTIVE_SHADOW_OFFSET_X_DEFAULT, INACTIVE_SHADOW_OFFSET_Y_DEFAULT, INACTIVE_SHADOW_COLOR_DEFAULT), IsFalse ()); } TEST_F(GWDSettingsTest, TestUseTooltipsChanged) { EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_THAT (gwd_settings_writable_use_tooltips_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::USE_TOOLTIPS_VALUE), IsTrue ()); AutoUnsetGValue useTooltipsValue (G_TYPE_BOOLEAN); GValue &useTooltipsGValue = useTooltipsValue; g_object_get_property (G_OBJECT (mSettings.get ()), "use-tooltips", &useTooltipsGValue); EXPECT_THAT (&useTooltipsGValue, GValueMatch (testing_values::USE_TOOLTIPS_VALUE, g_value_get_boolean)); } TEST_F(GWDSettingsTest, TestUseTooltipsChangedIsDefault) { EXPECT_THAT (gwd_settings_writable_use_tooltips_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), USE_TOOLTIPS_DEFAULT), IsFalse ()); } TEST_F(GWDSettingsTest, TestDraggableBorderWidthChanged) { EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_THAT (gwd_settings_writable_draggable_border_width_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::DRAGGABLE_BORDER_WIDTH_VALUE), IsTrue ()); AutoUnsetGValue draggableBorderWidthValue (G_TYPE_INT); GValue &draggableBorderWidthGValue = draggableBorderWidthValue; g_object_get_property (G_OBJECT (mSettings.get ()), "draggable-border-width", &draggableBorderWidthGValue); EXPECT_THAT (&draggableBorderWidthGValue, GValueMatch (testing_values::DRAGGABLE_BORDER_WIDTH_VALUE, g_value_get_int)); } TEST_F(GWDSettingsTest, TestDraggableBorderWidthChangedIsDefault) { EXPECT_THAT (gwd_settings_writable_draggable_border_width_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), DRAGGABLE_BORDER_WIDTH_DEFAULT), IsFalse ()); } TEST_F(GWDSettingsTest, TestAttachModalDialogsChanged) { EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_THAT (gwd_settings_writable_attach_modal_dialogs_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::ATTACH_MODAL_DIALOGS_VALUE), IsTrue ()); AutoUnsetGValue attachModalDialogsValue (G_TYPE_BOOLEAN); GValue &attachModalDialogsGValue = attachModalDialogsValue; g_object_get_property (G_OBJECT (mSettings.get ()), "attach-modal-dialogs", &attachModalDialogsGValue); EXPECT_THAT (&attachModalDialogsGValue, GValueMatch (testing_values::ATTACH_MODAL_DIALOGS_VALUE, g_value_get_boolean)); } TEST_F(GWDSettingsTest, TestAttachModalDialogsChangedIsDefault) { EXPECT_THAT (gwd_settings_writable_attach_modal_dialogs_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), ATTACH_MODAL_DIALOGS_DEFAULT), IsFalse ()); } TEST_F(GWDSettingsTest, TestBlurChangedTitlebar) { EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_THAT (gwd_settings_writable_blur_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::BLUR_TYPE_TITLEBAR_VALUE.c_str ()), IsTrue ()); AutoUnsetGValue blurValue (G_TYPE_INT); GValue &blurGValue = blurValue; g_object_get_property (G_OBJECT (mSettings.get ()), "blur", &blurGValue); EXPECT_THAT (&blurGValue, GValueMatch (testing_values::BLUR_TYPE_TITLEBAR_INT_VALUE, g_value_get_int)); } TEST_F(GWDSettingsTest, TestBlurChangedAll) { EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_THAT (gwd_settings_writable_blur_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::BLUR_TYPE_ALL_VALUE.c_str ()), IsTrue ()); AutoUnsetGValue blurValue (G_TYPE_INT); GValue &blurGValue = blurValue; g_object_get_property (G_OBJECT (mSettings.get ()), "blur", &blurGValue); EXPECT_THAT (&blurGValue, GValueMatch (testing_values::BLUR_TYPE_ALL_INT_VALUE, g_value_get_int)); } TEST_F(GWDSettingsTest, TestBlurChangedNone) { EXPECT_THAT (gwd_settings_writable_blur_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::BLUR_TYPE_NONE_VALUE.c_str ()), IsFalse ()); AutoUnsetGValue blurValue (G_TYPE_INT); GValue &blurGValue = blurValue; g_object_get_property (G_OBJECT (mSettings.get ()), "blur", &blurGValue); EXPECT_THAT (&blurGValue, GValueMatch (testing_values::BLUR_TYPE_NONE_INT_VALUE, g_value_get_int)); } TEST_F(GWDSettingsTest, TestBlurSetCommandLine) { gint blurType = testing_values::BLUR_TYPE_ALL_INT_VALUE; /* We need to increment the reference count so that it doesn't * go away when we create a new GWDSettingsImpl */ g_object_ref (mMockNotified.get ()); mSettings.reset (gwd_settings_impl_new (&blurType, NULL, mMockNotified.get ()), boost::bind (gwd_settings_unref, _1)); EXPECT_THAT (gwd_settings_writable_blur_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::BLUR_TYPE_NONE_VALUE.c_str ()), IsFalse ()); AutoUnsetGValue blurValue (G_TYPE_INT); GValue &blurGValue = blurValue; g_object_get_property (G_OBJECT (mSettings.get ()), "blur", &blurGValue); EXPECT_THAT (&blurGValue, GValueMatch (testing_values::BLUR_TYPE_ALL_INT_VALUE, g_value_get_int)); } TEST_F(GWDSettingsTest, TestMetacityThemeChanged) { EXPECT_CALL (*mGMockNotified, updateMetacityTheme ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_THAT (gwd_settings_writable_metacity_theme_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::USE_METACITY_THEME_VALUE, testing_values::METACITY_THEME_VALUE.c_str ()), IsTrue ()); AutoUnsetGValue metacityThemeValue (G_TYPE_STRING); GValue &metacityThemeGValue = metacityThemeValue; g_object_get_property (G_OBJECT (mSettings.get ()), "metacity-theme", &metacityThemeGValue); EXPECT_THAT (&metacityThemeGValue, GValueMatch (testing_values::METACITY_THEME_VALUE, g_value_get_string)); } TEST_F(GWDSettingsTest, TestMetacityThemeChangedNoUseMetacityTheme) { EXPECT_CALL (*mGMockNotified, updateMetacityTheme ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_THAT (gwd_settings_writable_metacity_theme_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::NO_USE_METACITY_THEME_VALUE, testing_values::METACITY_THEME_VALUE.c_str ()), IsTrue ()); AutoUnsetGValue metacityThemeValue (G_TYPE_STRING); GValue &metacityThemeGValue = metacityThemeValue; g_object_get_property (G_OBJECT (mSettings.get ()), "metacity-theme", &metacityThemeGValue); EXPECT_THAT (&metacityThemeGValue, GValueMatch (testing_values::NO_METACITY_THEME_VALUE, g_value_get_string)); } TEST_F(GWDSettingsTest, TestMetacityThemeChangedIsDefault) { EXPECT_THAT (gwd_settings_writable_metacity_theme_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::USE_METACITY_THEME_VALUE, METACITY_THEME_DEFAULT), IsFalse ()); } TEST_F(GWDSettingsTest, TestMetacityThemeSetCommandLine) { const gchar *metacityTheme = "Ambiance"; g_object_ref (mMockNotified.get ()); mSettings.reset (gwd_settings_impl_new (NULL, &metacityTheme, mMockNotified.get ()), boost::bind (gwd_settings_unref, _1)); EXPECT_THAT (gwd_settings_writable_metacity_theme_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::USE_METACITY_THEME_VALUE, testing_values::METACITY_THEME_VALUE.c_str ()), IsFalse ()); AutoUnsetGValue metacityThemeValue (G_TYPE_STRING); GValue &metacityThemeGValue = metacityThemeValue; g_object_get_property (G_OBJECT (mSettings.get ()), "metacity-theme", &metacityThemeGValue); EXPECT_THAT (&metacityThemeGValue, GValueMatch (std::string (metacityTheme), g_value_get_string)); } TEST_F(GWDSettingsTest, TestMetacityOpacityChanged) { EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_THAT (gwd_settings_writable_opacity_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::ACTIVE_OPACITY_VALUE, testing_values::INACTIVE_OPACITY_VALUE, testing_values::ACTIVE_SHADE_OPACITY_VALUE, testing_values::INACTIVE_SHADE_OPACITY_VALUE), IsTrue ()); AutoUnsetGValue metacityInactiveOpacityValue (G_TYPE_DOUBLE); AutoUnsetGValue metacityActiveOpacityValue (G_TYPE_DOUBLE); AutoUnsetGValue metacityInactiveShadeOpacityValue (G_TYPE_BOOLEAN); AutoUnsetGValue metacityActiveShadeOpacityValue (G_TYPE_BOOLEAN); GValue &metacityInactiveOpacityGValue = metacityInactiveOpacityValue; GValue &metacityActiveOpacityGValue = metacityActiveOpacityValue; GValue &metacityInactiveShadeOpacityGValue = metacityInactiveShadeOpacityValue; GValue &metacityActiveShadeOpacityGValue = metacityActiveShadeOpacityValue; g_object_get_property (G_OBJECT (mSettings.get ()), "metacity-inactive-opacity", &metacityInactiveOpacityGValue); g_object_get_property (G_OBJECT (mSettings.get ()), "metacity-active-opacity", &metacityActiveOpacityGValue); g_object_get_property (G_OBJECT (mSettings.get ()), "metacity-inactive-shade-opacity", &metacityInactiveShadeOpacityGValue); g_object_get_property (G_OBJECT (mSettings.get ()), "metacity-active-shade-opacity", &metacityActiveShadeOpacityGValue); EXPECT_THAT (&metacityInactiveOpacityGValue, GValueMatch (testing_values::INACTIVE_OPACITY_VALUE, g_value_get_double)); EXPECT_THAT (&metacityActiveOpacityGValue, GValueMatch (testing_values::ACTIVE_OPACITY_VALUE, g_value_get_double)); EXPECT_THAT (&metacityInactiveShadeOpacityGValue, GValueMatch (testing_values::INACTIVE_SHADE_OPACITY_VALUE, g_value_get_boolean)); EXPECT_THAT (&metacityActiveShadeOpacityGValue, GValueMatch (testing_values::ACTIVE_SHADE_OPACITY_VALUE, g_value_get_boolean)); } TEST_F(GWDSettingsTest, TestMetacityOpacityChangedIsDefault) { EXPECT_THAT (gwd_settings_writable_opacity_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), METACITY_ACTIVE_OPACITY_DEFAULT, METACITY_INACTIVE_OPACITY_DEFAULT, METACITY_ACTIVE_SHADE_OPACITY_DEFAULT, METACITY_INACTIVE_SHADE_OPACITY_DEFAULT), IsFalse ()); } TEST_F(GWDSettingsTest, TestButtonLayoutChanged) { EXPECT_CALL (*mGMockNotified, updateMetacityButtonLayout ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_THAT (gwd_settings_writable_button_layout_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::BUTTON_LAYOUT_VALUE.c_str ()), IsTrue ()); AutoUnsetGValue buttonLayoutValue (G_TYPE_STRING); GValue &buttonLayoutGValue = buttonLayoutValue; g_object_get_property (G_OBJECT (mSettings.get ()), "metacity-button-layout", &buttonLayoutGValue); EXPECT_THAT (&buttonLayoutGValue, GValueMatch (testing_values::BUTTON_LAYOUT_VALUE, g_value_get_string)); } TEST_F(GWDSettingsTest, TestButtonLayoutChangedIsDefault) { EXPECT_THAT (gwd_settings_writable_button_layout_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), METACITY_BUTTON_LAYOUT_DEFAULT), IsFalse ()); } TEST_F(GWDSettingsTest, TestTitlebarFontChanged) { EXPECT_CALL (*mGMockNotified, updateFrames ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_THAT (gwd_settings_writable_font_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::NO_USE_SYSTEM_FONT_VALUE, testing_values::TITLEBAR_FONT_VALUE.c_str ()), IsTrue ()); AutoUnsetGValue fontValue (G_TYPE_STRING); GValue &fontGValue = fontValue; g_object_get_property (G_OBJECT (mSettings.get ()), "titlebar-font", &fontGValue); EXPECT_THAT (&fontGValue, GValueMatch (testing_values::TITLEBAR_FONT_VALUE.c_str (), g_value_get_string)); } TEST_F(GWDSettingsTest, TestTitlebarFontChangedUseSystemFont) { EXPECT_CALL (*mGMockNotified, updateFrames ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_THAT (gwd_settings_writable_font_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::USE_SYSTEM_FONT_VALUE, testing_values::TITLEBAR_FONT_VALUE.c_str ()), IsTrue ()); AutoUnsetGValue fontValue (G_TYPE_STRING); GValue &fontGValue = fontValue; g_object_get_property (G_OBJECT (mSettings.get ()), "titlebar-font", &fontGValue); EXPECT_THAT (&fontGValue, GValueMatch (NULL, g_value_get_string)); } TEST_F(GWDSettingsTest, TestTitlebarFontChangedIsDefault) { EXPECT_THAT (gwd_settings_writable_font_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), testing_values::NO_USE_SYSTEM_FONT_VALUE, TITLEBAR_FONT_DEFAULT), IsFalse ()); } namespace { class GWDTitlebarActionInfo { public: GWDTitlebarActionInfo (const std::string &titlebarAction, const std::string &mouseWheelAction, const gint titlebarActionId, const gint mouseWheelActionId) : mTitlebarAction (titlebarAction), mMouseWheelAction (mouseWheelAction), mTitlebarActionId (titlebarActionId), mMouseWheelActionId (mouseWheelActionId) { } const std::string & titlebarAction () const { return mTitlebarAction; } const std::string & mouseWheelAction () const { return mMouseWheelAction; } const gint & titlebarActionId () const { return mTitlebarActionId; } const gint & mouseWheelActionId () const { return mMouseWheelActionId; } private: std::string mTitlebarAction; std::string mMouseWheelAction; gint mTitlebarActionId; gint mMouseWheelActionId; }; } class GWDSettingsTestClickActions : public GWDSettingsTestCommon, public ::testing::WithParamInterface { public: virtual void SetUp () { GWDSettingsTestCommon::SetUp (); mGMockNotified.reset (new GWDMockSettingsNotifiedGMock ()); mMockNotified.reset (gwd_mock_settings_notified_new (mGMockNotified.get ()), boost::bind (gwd_settings_notified_do_nothing, _1)); mSettings.reset (gwd_settings_impl_new (NULL, NULL, mMockNotified.get ()), boost::bind (gwd_settings_unref, _1)); } virtual void TearDown () { EXPECT_CALL (*mGMockNotified, dispose ()); EXPECT_CALL (*mGMockNotified, finalize ()); GWDSettingsTestCommon::TearDown (); } protected: boost::shared_ptr mGMockNotified; boost::shared_ptr mMockNotified; boost::shared_ptr mSettings; }; TEST_P(GWDSettingsTestClickActions, TestClickActionsAndMouseActions) { gwd_settings_writable_titlebar_actions_changed (GWD_SETTINGS_WRITABLE_INTERFACE (mSettings.get ()), GetParam ().titlebarAction ().c_str (), GetParam ().titlebarAction ().c_str (), GetParam ().titlebarAction ().c_str (), GetParam ().mouseWheelAction ().c_str ()); AutoUnsetGValue doubleClickActionValue (G_TYPE_INT); AutoUnsetGValue middleClickActionValue (G_TYPE_INT); AutoUnsetGValue rightClickActionValue (G_TYPE_INT); AutoUnsetGValue mouseWheelActionValue (G_TYPE_INT); GValue &doubleClickActionGValue = doubleClickActionValue; GValue &middleClickActionGValue = middleClickActionValue; GValue &rightClickActionGValue = rightClickActionValue; GValue &mouseWheelActionGValue = mouseWheelActionValue; g_object_get_property (G_OBJECT (mSettings.get ()), "titlebar-double-click-action", &doubleClickActionGValue); g_object_get_property (G_OBJECT (mSettings.get ()), "titlebar-middle-click-action", &middleClickActionGValue); g_object_get_property (G_OBJECT (mSettings.get ()), "titlebar-right-click-action", &rightClickActionGValue); g_object_get_property (G_OBJECT (mSettings.get ()), "mouse-wheel-action", &mouseWheelActionGValue); EXPECT_THAT (&doubleClickActionGValue, GValueMatch (GetParam ().titlebarActionId (), g_value_get_int)); EXPECT_THAT (&middleClickActionGValue, GValueMatch (GetParam ().titlebarActionId (), g_value_get_int)); EXPECT_THAT (&rightClickActionGValue, GValueMatch (GetParam ().titlebarActionId (), g_value_get_int)); EXPECT_THAT (&mouseWheelActionGValue, GValueMatch (GetParam ().mouseWheelActionId (), g_value_get_int)); } INSTANTIATE_TEST_CASE_P (MouseActions, GWDSettingsTestClickActions, ::testing::Values (GWDTitlebarActionInfo (testing_values::TITLEBAR_ACTION_NONE, testing_values::TITLEBAR_ACTION_NONE, CLICK_ACTION_NONE, WHEEL_ACTION_NONE), GWDTitlebarActionInfo (testing_values::TITLEBAR_ACTION_SHADE, testing_values::MOUSE_WHEEL_ACTION_SHADE, CLICK_ACTION_SHADE, WHEEL_ACTION_SHADE), GWDTitlebarActionInfo (testing_values::TITLEBAR_ACTION_MAX, testing_values::MOUSE_WHEEL_ACTION_SHADE, CLICK_ACTION_MAXIMIZE, WHEEL_ACTION_SHADE), GWDTitlebarActionInfo (testing_values::TITLEBAR_ACTION_MINIMIZE, testing_values::MOUSE_WHEEL_ACTION_SHADE, CLICK_ACTION_MINIMIZE, WHEEL_ACTION_SHADE), GWDTitlebarActionInfo (testing_values::TITLEBAR_ACTION_LOWER, testing_values::MOUSE_WHEEL_ACTION_SHADE, CLICK_ACTION_LOWER, WHEEL_ACTION_SHADE), GWDTitlebarActionInfo (testing_values::TITLEBAR_ACTION_MENU, testing_values::MOUSE_WHEEL_ACTION_SHADE, CLICK_ACTION_MENU, WHEEL_ACTION_SHADE))); class GWDSettingsStorageFactoryWrapperInterface { public: typedef boost::shared_ptr Ptr; virtual ~GWDSettingsStorageFactoryWrapperInterface () {} virtual void SetUp (GWDSettingsWritable *writable) = 0; virtual GWDSettingsStorage * GetStorage () = 0; virtual void SetUseTooltips (gboolean useTooltips) = 0; virtual void SetDraggableBorderWidth (gint draggableBorderWidth) = 0; virtual void SetAttachModalDialogs (gboolean attachModalDialogs) = 0; virtual void SetBlur (const std::string &blurType) = 0; virtual void SetOpacity (gdouble activeOpacity, gdouble inactiveOpacity, gboolean activeShadeOpacity, gboolean inactiveShadeOpacity) = 0; virtual void SetMetacityTheme (gboolean useMetacityTheme, const std::string &metacityTheme) = 0; virtual void SetButtonLayout (const std::string &buttonLayout) = 0; virtual void SetFont (gboolean useSystemFont, const std::string &titlebarFont) = 0; virtual void SetTitlebarActions (const std::string &doubleClickAction, const std::string &middleClickAction, const std::string &rightClickAction, const std::string &mouseWheelAction) = 0; virtual void TearDown () = 0; }; class GWDSettingsTestStorageUpdates : public GWDSettingsTestCommon, public ::testing::WithParamInterface { public: virtual void SetUp () { GWDSettingsTestCommon::SetUp (); mSettingsMock.reset (new GWDMockSettingsWritableGMock ()); mSettings.reset (gwd_mock_settings_writable_new (mSettingsMock.get ()), boost::bind (gwd_settings_writable_unref, _1)); GetParam ()->SetUp (mSettings.get ()); } virtual void TearDown () { EXPECT_CALL (*mSettingsMock, dispose ()); EXPECT_CALL (*mSettingsMock, finalize ()); GetParam ()->TearDown (); GWDSettingsTestCommon::TearDown (); } protected: boost::shared_ptr mSettingsMock; boost::shared_ptr mSettings; }; ACTION_P (InvokeFunctor, p) { return p (); } TEST_P (GWDSettingsTestStorageUpdates, TestInstantiation) { } TEST_P (GWDSettingsTestStorageUpdates, TestSetUseTooltips) { GWDSettingsStorage *storage = GetParam ()->GetStorage (); GetParam ()->SetUseTooltips (testing_values::USE_TOOLTIPS_VALUE); EXPECT_CALL (*mSettingsMock, useTooltipsChanged (testing_values::USE_TOOLTIPS_VALUE)); gwd_settings_storage_update_use_tooltips (storage); } TEST_P (GWDSettingsTestStorageUpdates, TestSetDraggableBorderWidth) { GWDSettingsStorage *storage = GetParam ()->GetStorage (); GetParam ()->SetDraggableBorderWidth (testing_values::DRAGGABLE_BORDER_WIDTH_VALUE); EXPECT_CALL (*mSettingsMock, draggableBorderWidthChanged (testing_values::DRAGGABLE_BORDER_WIDTH_VALUE)); gwd_settings_storage_update_draggable_border_width (storage); } TEST_P (GWDSettingsTestStorageUpdates, TestSetAttachModalDialogs) { GWDSettingsStorage *storage = GetParam ()->GetStorage (); GetParam ()->SetAttachModalDialogs (testing_values::ATTACH_MODAL_DIALOGS_VALUE); EXPECT_CALL (*mSettingsMock, attachModalDialogsChanged (testing_values::ATTACH_MODAL_DIALOGS_VALUE)); gwd_settings_storage_update_attach_modal_dialogs (storage); } TEST_P (GWDSettingsTestStorageUpdates, TestSetBlur) { GWDSettingsStorage *storage = GetParam ()->GetStorage (); GetParam ()->SetBlur (testing_values::BLUR_TYPE_ALL_VALUE); EXPECT_CALL (*mSettingsMock, blurChanged (Eq (testing_values::BLUR_TYPE_ALL_VALUE))); gwd_settings_storage_update_blur (storage); } TEST_P (GWDSettingsTestStorageUpdates, TestSetButtonLayout) { GWDSettingsStorage *storage = GetParam ()->GetStorage (); GetParam ()->SetButtonLayout (testing_values::BUTTON_LAYOUT_VALUE); EXPECT_CALL (*mSettingsMock, buttonLayoutChanged (Eq (testing_values::BUTTON_LAYOUT_VALUE))); gwd_settings_storage_update_button_layout (storage); } TEST_P (GWDSettingsTestStorageUpdates, TestSetOpacity) { GWDSettingsStorage *storage = GetParam ()->GetStorage (); GetParam ()->SetOpacity (testing_values::ACTIVE_OPACITY_VALUE, testing_values::INACTIVE_OPACITY_VALUE, testing_values::ACTIVE_SHADE_OPACITY_VALUE, testing_values::INACTIVE_SHADE_OPACITY_VALUE); EXPECT_CALL (*mSettingsMock, opacityChanged (testing_values::ACTIVE_OPACITY_VALUE, testing_values::INACTIVE_OPACITY_VALUE, testing_values::ACTIVE_SHADE_OPACITY_VALUE, testing_values::INACTIVE_SHADE_OPACITY_VALUE)); gwd_settings_storage_update_opacity (storage); } TEST_P (GWDSettingsTestStorageUpdates, TestSetMetacityTheme) { GWDSettingsStorage *storage = GetParam ()->GetStorage (); GetParam ()->SetMetacityTheme (testing_values::USE_METACITY_THEME_VALUE, testing_values::METACITY_THEME_VALUE); EXPECT_CALL (*mSettingsMock, metacityThemeChanged (testing_values::USE_METACITY_THEME_VALUE, Eq (testing_values::METACITY_THEME_VALUE))); gwd_settings_storage_update_metacity_theme (storage); } TEST_P (GWDSettingsTestStorageUpdates, TestSetFont) { GWDSettingsStorage *storage = GetParam ()->GetStorage (); GetParam ()->SetFont (testing_values::USE_SYSTEM_FONT_VALUE, testing_values::TITLEBAR_FONT_VALUE); EXPECT_CALL (*mSettingsMock, fontChanged (testing_values::USE_SYSTEM_FONT_VALUE, Eq (testing_values::TITLEBAR_FONT_VALUE))); gwd_settings_storage_update_font (storage); } TEST_P (GWDSettingsTestStorageUpdates, TestSetTitlebarActions) { GWDSettingsStorage *storage = GetParam ()->GetStorage (); GetParam ()->SetTitlebarActions (testing_values::TITLEBAR_ACTION_LOWER, testing_values::TITLEBAR_ACTION_MAX, testing_values::TITLEBAR_ACTION_MENU, testing_values::TITLEBAR_ACTION_SHADE); EXPECT_CALL (*mSettingsMock, titlebarActionsChanged (Eq (testing_values::TITLEBAR_ACTION_LOWER), Eq (testing_values::TITLEBAR_ACTION_MAX), Eq (testing_values::TITLEBAR_ACTION_MENU), Eq (testing_values::TITLEBAR_ACTION_SHADE))); gwd_settings_storage_update_titlebar_actions (storage); } class GWDMockSettingsStorageFactoryWrapper : public GWDSettingsStorageFactoryWrapperInterface { public: virtual void SetUp (GWDSettingsWritable *writable) { mWritable = writable; mStorageMock.reset (new GWDMockSettingsStorageGMock ()); mStorage.reset (gwd_mock_settings_storage_new (mStorageMock.get ()), boost::bind (gwd_settings_storage_unref, _1)); } virtual GWDSettingsStorage * GetStorage () { return mStorage.get (); } virtual void SetUseTooltips (gboolean useTooltips) { EXPECT_CALL (*mStorageMock, updateUseTooltips ()) .WillOnce ( InvokeFunctor ( boost::bind ( gwd_settings_writable_use_tooltips_changed, mWritable, useTooltips))); } virtual void SetDraggableBorderWidth (gint draggableBorderWidth) { EXPECT_CALL (*mStorageMock, updateDraggableBorderWidth ()) .WillOnce ( InvokeFunctor ( boost::bind ( gwd_settings_writable_draggable_border_width_changed, mWritable, draggableBorderWidth))); } virtual void SetAttachModalDialogs (gboolean attachModalDialogs) { EXPECT_CALL (*mStorageMock, updateAttachModalDialogs ()) .WillOnce ( InvokeFunctor ( boost::bind ( gwd_settings_writable_attach_modal_dialogs_changed, mWritable, attachModalDialogs))); } virtual void SetBlur (const std::string &blurType) { EXPECT_CALL (*mStorageMock, updateBlur ()) .WillOnce ( InvokeFunctor ( boost::bind ( gwd_settings_writable_blur_changed, mWritable, blurType.c_str ()))); } virtual void SetOpacity (gdouble activeOpacity, gdouble inactiveOpacity, gboolean activeShadeOpacity, gboolean inactiveShadeOpacity) { EXPECT_CALL (*mStorageMock, updateOpacity ()) .WillOnce ( InvokeFunctor ( boost::bind ( gwd_settings_writable_opacity_changed, mWritable, activeOpacity, inactiveOpacity, activeShadeOpacity, inactiveShadeOpacity))); } virtual void SetMetacityTheme (gboolean useMetacityTheme, const std::string &metacityTheme) { EXPECT_CALL (*mStorageMock, updateMetacityTheme ()) .WillOnce ( InvokeFunctor ( boost::bind ( gwd_settings_writable_metacity_theme_changed, mWritable, useMetacityTheme, metacityTheme.c_str ()))); } virtual void SetButtonLayout (const std::string &buttonLayout) { EXPECT_CALL (*mStorageMock, updateButtonLayout ()) .WillOnce ( InvokeFunctor ( boost::bind ( gwd_settings_writable_button_layout_changed, mWritable, buttonLayout.c_str ()))); } virtual void SetFont (gboolean useSystemFont, const std::string &titlebarFont) { EXPECT_CALL (*mStorageMock, updateFont ()) .WillOnce ( InvokeFunctor ( boost::bind ( gwd_settings_writable_font_changed, mWritable, useSystemFont, titlebarFont.c_str ()))); } virtual void SetTitlebarActions (const std::string &doubleClickAction, const std::string &middleClickAction, const std::string &rightClickAction, const std::string &mouseWheelAction) { EXPECT_CALL (*mStorageMock, updateTitlebarActions ()) .WillOnce ( InvokeFunctor ( boost::bind ( gwd_settings_writable_titlebar_actions_changed, mWritable, doubleClickAction.c_str (), middleClickAction.c_str (), rightClickAction.c_str (), mouseWheelAction.c_str ()))); } virtual void TearDown () { if (mStorage) { EXPECT_CALL (*mStorageMock, dispose ()); EXPECT_CALL (*mStorageMock, finalize ()); } mStorage.reset (); mStorageMock.reset (); } private: GWDSettingsWritable *mWritable; boost::shared_ptr mStorageMock; boost::shared_ptr mStorage; }; INSTANTIATE_TEST_CASE_P (MockStorageUpdates, GWDSettingsTestStorageUpdates, ::testing::Values (boost::shared_ptr (new GWDMockSettingsStorageFactoryWrapper ()))); #ifdef USE_GSETTINGS class GWDSettingsStorageGSettingsTest : public GWDSettingsTestCommon { }; TEST_F (GWDSettingsStorageGSettingsTest, TestNoDeathOnConnectingSignalToNULLObject) { boost::shared_ptr mStorageMock (new GWDMockSettingsStorageGMock ()); boost::shared_ptr mStorage (gwd_mock_settings_storage_new (mStorageMock.get ()), boost::bind (gwd_settings_storage_unref, _1)); gwd_connect_org_compiz_gwd_settings (NULL, mStorage.get ()); gwd_connect_org_gnome_mutter_settings (NULL, mStorage.get ()); gwd_connect_org_gnome_desktop_wm_preferences_settings (NULL, mStorage.get ()); EXPECT_CALL (*mStorageMock, dispose ()); EXPECT_CALL (*mStorageMock, finalize ()); } class GWDSettingsStorageGSettingsFactoryWrapper : public GWDSettingsStorageFactoryWrapperInterface { public: virtual void SetUp (GWDSettingsWritable *writable) { gsliceEnv.SetUpEnv (); gsettingsEnv.SetUpEnv (MOCK_PATH); /* We do not need to keep a reference to these */ mGWDSettings = gwd_get_org_compiz_gwd_settings (); mMutterSettings = gwd_get_org_gnome_mutter_settings (); mDesktopSettings = gwd_get_org_gnome_desktop_wm_preferences_settings (); mStorage.reset (gwd_settings_storage_gsettings_new (mDesktopSettings, mMutterSettings, mGWDSettings, writable), boost::bind (gwd_settings_storage_unref, _1)); } virtual GWDSettingsStorage * GetStorage () { return mStorage.get (); } virtual void SetUseTooltips (gboolean useTooltips) { g_settings_set_boolean (mGWDSettings, ORG_COMPIZ_GWD_KEY_USE_TOOLTIPS, useTooltips); } virtual void SetDraggableBorderWidth (gint draggableBorderWidth) { g_settings_set_int (mMutterSettings, ORG_GNOME_MUTTER_DRAGGABLE_BORDER_WIDTH, draggableBorderWidth); } virtual void SetAttachModalDialogs (gboolean attachModalDialogs) { g_settings_set_boolean (mMutterSettings, ORG_GNOME_MUTTER_ATTACH_MODAL_DIALOGS, attachModalDialogs); } virtual void SetBlur (const std::string &blurType) { g_settings_set_string (mGWDSettings, ORG_COMPIZ_GWD_KEY_BLUR_TYPE, blurType.c_str ()); } virtual void SetOpacity (gdouble activeOpacity, gdouble inactiveOpacity, gboolean activeShadeOpacity, gboolean inactiveShadeOpacity) { g_settings_set_double (mGWDSettings, ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_OPACITY, activeOpacity); g_settings_set_double (mGWDSettings, ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_OPACITY, inactiveOpacity); g_settings_set_boolean (mGWDSettings, ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_SHADE_OPACITY, activeShadeOpacity); g_settings_set_boolean (mGWDSettings, ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_SHADE_OPACITY, inactiveShadeOpacity); } virtual void SetMetacityTheme (gboolean useMetacityTheme, const std::string &metacityTheme) { g_settings_set_boolean (mGWDSettings, ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME, useMetacityTheme); g_settings_set_string (mDesktopSettings, ORG_GNOME_DESKTOP_WM_PREFERENCES_THEME, metacityTheme.c_str ()); } virtual void SetButtonLayout (const std::string &buttonLayout) { g_settings_set_string (mDesktopSettings, ORG_GNOME_DESKTOP_WM_PREFERENCES_BUTTON_LAYOUT, buttonLayout.c_str ()); } virtual void SetFont (gboolean useSystemFont, const std::string &titlebarFont) { g_settings_set_boolean (mDesktopSettings, ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_USES_SYSTEM_FONT, useSystemFont); g_settings_set_string (mDesktopSettings, ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_FONT, titlebarFont.c_str ()); } virtual void SetTitlebarActions (const std::string &doubleClickAction, const std::string &middleClickAction, const std::string &rightClickAction, const std::string &mouseWheelAction) { std::string translatedDC (doubleClickAction); std::string translatedMC (middleClickAction); std::string translatedRC (rightClickAction); boost::replace_all (translatedDC, "_", "-"); boost::replace_all (translatedMC, "_", "-"); boost::replace_all (translatedRC, "_", "-"); g_settings_set_string (mDesktopSettings, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_DOUBLE_CLICK_TITLEBAR, translatedDC.c_str ()); g_settings_set_string (mDesktopSettings, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_MIDDLE_CLICK_TITLEBAR, translatedMC.c_str ()); g_settings_set_string (mDesktopSettings, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_RIGHT_CLICK_TITLEBAR, translatedRC.c_str ()); g_settings_set_string (mGWDSettings, ORG_COMPIZ_GWD_KEY_MOUSE_WHEEL_ACTION, mouseWheelAction.c_str ()); } virtual void TearDown () { mStorage.reset (); mGWDSettings = NULL; mMutterSettings = NULL; mDesktopSettings = NULL; gsettingsEnv.TearDownEnv (); gsliceEnv.TearDownEnv (); } private: GSettings *mGWDSettings; GSettings *mMutterSettings; GSettings *mDesktopSettings; boost::shared_ptr mStorage; CompizGLibGSliceOffEnv gsliceEnv; CompizGLibGSettingsMemoryBackendTestingEnv gsettingsEnv; }; INSTANTIATE_TEST_CASE_P (GSettingsStorageUpdates, GWDSettingsTestStorageUpdates, ::testing::Values (boost::shared_ptr (new GWDSettingsStorageGSettingsFactoryWrapper ()))); #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/compiz_gwd_mock_settings_writable.cpp0000644000015301777760000002662712321343002032415 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include #include "gwd-settings-writable-interface.h" #include "compiz_gwd_mock_settings_writable.h" #define GWD_MOCK_SETTINGS_WRITABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GWD_TYPE_MOCK_SETTINGS_WRITABLE, GWDMockSettingsWritable)); #define GWD_MOCK_SETTINGS_WRITABLE_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GWD_TYPE_MOCK_SETTINGS_WRITABLE, GWDMockSettingsWritableClass)); #define GWD_IS_MOCK_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GWD_TYPE_MOCK_SETTINGS_WRITABLE)); #define GWD_IS_MOCK_SETTINGS_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GWD_TYPE_MOCK_SETTINGS_WRITABLE)); #define GWD_MOCK_SETTINGS_WRITABLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GWD_TYPE_MOCK_SETTINGS_WRITABLE, GWDMockSettingsWritableClass)); typedef struct _GWDMockSettingsWritable { GObject parent; } GWDMockSettingsWritable; typedef struct _GWDMockSettingsWritableClass { GObjectClass parent_class; } GWDMockSettingsWritableClass; static void gwd_mock_settings_writable_interface_init (GWDSettingsWritableInterface *interface); G_DEFINE_TYPE_WITH_CODE (GWDMockSettingsWritable, gwd_mock_settings_writable, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GWD_TYPE_WRITABLE_SETTINGS_INTERFACE, gwd_mock_settings_writable_interface_init)) #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GWD_TYPE_MOCK_SETTINGS_WRITABLE, GWDMockSettingsWritablePrivate)) enum { GWD_MOCK_SETTINGS_WRITABLE_PROPERTY_GMOCK_INTERFACE = 1 }; typedef struct _GWDMockSettingsWritablePrivate { GWDMockSettingsWritableGMockInterface *mock; } GWDMockSettingsWritablePrivate; void gwd_mock_settings_writable_freeze_updates (GWDSettingsWritable *settings) { GWDMockSettingsWritableGMockInterface *gmockSettingsWritable = GET_PRIVATE (settings)->mock; return gmockSettingsWritable->freezeUpdates (); } void gwd_mock_settings_writable_thaw_updates (GWDSettingsWritable *settings) { GWDMockSettingsWritableGMockInterface *gmockSettingsWritable = GET_PRIVATE (settings)->mock; return gmockSettingsWritable->thawUpdates (); } gboolean gwd_mock_settings_writable_shadow_property_changed (GWDSettingsWritable *settings, gdouble active_shadow_radius, gdouble active_shadow_opacity, gdouble active_shadow_offset_x, gdouble active_shadow_offset_y, const gchar *active_shadow_color, gdouble inactive_shadow_radius, gdouble inactive_shadow_opacity, gdouble inactive_shadow_offset_x, gdouble inactive_shadow_offset_y, const gchar *inactive_shadow_color) { GWDMockSettingsWritableGMockInterface *gmockSettingsWritable = GET_PRIVATE (settings)->mock; return gmockSettingsWritable->shadowPropertyChanged (active_shadow_radius, active_shadow_opacity, active_shadow_offset_x, active_shadow_offset_y, active_shadow_color, inactive_shadow_radius, inactive_shadow_opacity, inactive_shadow_offset_x, inactive_shadow_offset_y, inactive_shadow_color); } gboolean gwd_mock_settings_writable_use_tooltips_changed (GWDSettingsWritable *settings, gboolean use_tooltips) { GWDMockSettingsWritableGMockInterface *gmockSettingsWritable = GET_PRIVATE (settings)->mock; return gmockSettingsWritable->useTooltipsChanged (use_tooltips); } gboolean gwd_mock_settings_writable_draggable_border_width_changed (GWDSettingsWritable *settings, gint draggable_border_width) { GWDMockSettingsWritableGMockInterface *gmockSettingsWritable = GET_PRIVATE (settings)->mock; return gmockSettingsWritable->draggableBorderWidthChanged (draggable_border_width); } gboolean gwd_mock_settings_writable_attach_modal_dialogs_changed (GWDSettingsWritable *settings, gboolean attach_modal_dialogs) { GWDMockSettingsWritableGMockInterface *gmockSettingsWritable = GET_PRIVATE (settings)->mock; return gmockSettingsWritable->attachModalDialogsChanged (attach_modal_dialogs); } gboolean gwd_mock_settings_writable_blur_changed (GWDSettingsWritable *settings, const gchar *blur_type) { GWDMockSettingsWritableGMockInterface *gmockSettingsWritable = GET_PRIVATE (settings)->mock; return gmockSettingsWritable->blurChanged (blur_type); } gboolean gwd_mock_settings_writable_metacity_theme_changed (GWDSettingsWritable *settings, gboolean use_metacity_theme, const gchar *metacity_theme) { GWDMockSettingsWritableGMockInterface *gmockSettingsWritable = GET_PRIVATE (settings)->mock; return gmockSettingsWritable->metacityThemeChanged (use_metacity_theme, metacity_theme); } gboolean gwd_mock_settings_writable_opacity_changed (GWDSettingsWritable *settings, gdouble inactive_opacity, gdouble active_opacity, gboolean inactive_shade_opacity, gboolean active_shade_opacity) { GWDMockSettingsWritableGMockInterface *gmockSettingsWritable = GET_PRIVATE (settings)->mock; return gmockSettingsWritable->opacityChanged (inactive_opacity, active_opacity, inactive_shade_opacity, active_shade_opacity); } gboolean gwd_mock_settings_writable_button_layout_changed (GWDSettingsWritable *settings, const gchar *button_layout) { GWDMockSettingsWritableGMockInterface *gmockSettingsWritable = GET_PRIVATE (settings)->mock; return gmockSettingsWritable->buttonLayoutChanged (button_layout); } gboolean gwd_mock_settings_writable_font_changed (GWDSettingsWritable *settings, gboolean titlebar_uses_system_font, const gchar *titlebar_font) { GWDMockSettingsWritableGMockInterface *gmockSettingsWritable = GET_PRIVATE (settings)->mock; return gmockSettingsWritable->fontChanged (titlebar_uses_system_font, titlebar_font); } gboolean gwd_mock_settings_writable_titlebar_actions_changed (GWDSettingsWritable *settings, const gchar *action_double_click_titlebar, const gchar *action_middle_click_titlebar, const gchar *action_right_click_titlebar, const gchar *mouse_wheel_action) { GWDMockSettingsWritableGMockInterface *gmockSettingsWritable = GET_PRIVATE (settings)->mock; return gmockSettingsWritable->titlebarActionsChanged (action_double_click_titlebar, action_middle_click_titlebar, action_right_click_titlebar, mouse_wheel_action); } static void gwd_mock_settings_writable_interface_init (GWDSettingsWritableInterface *interface) { interface->shadow_property_changed = gwd_mock_settings_writable_shadow_property_changed; interface->use_tooltips_changed = gwd_mock_settings_writable_use_tooltips_changed; interface->draggable_border_width_changed = gwd_mock_settings_writable_draggable_border_width_changed; interface->attach_modal_dialogs_changed = gwd_mock_settings_writable_attach_modal_dialogs_changed; interface->blur_changed = gwd_mock_settings_writable_blur_changed; interface->metacity_theme_changed = gwd_mock_settings_writable_metacity_theme_changed; interface->opacity_changed = gwd_mock_settings_writable_opacity_changed; interface->button_layout_changed = gwd_mock_settings_writable_button_layout_changed; interface->font_changed = gwd_mock_settings_writable_font_changed; interface->titlebar_actions_changed = gwd_mock_settings_writable_titlebar_actions_changed; interface->freeze_updates = gwd_mock_settings_writable_freeze_updates; interface->thaw_updates = gwd_mock_settings_writable_thaw_updates; } static GObject * gwd_mock_settings_writable_constructor (GType type, guint n_construction_properties, GObjectConstructParam *construction_properties) { GObject *object = G_OBJECT_CLASS (gwd_mock_settings_writable_parent_class)->constructor (type, n_construction_properties, construction_properties); GWDMockSettingsWritablePrivate *priv = GET_PRIVATE (object); guint i = 0; for (; i < n_construction_properties; ++i) { if (g_strcmp0 (construction_properties[i].pspec->name, "gmock-interface") == 0) { priv->mock = reinterpret_cast (g_value_get_pointer (construction_properties[i].value)); } else g_assert_not_reached (); } return object; } static void gwd_mock_settings_writable_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDMockSettingsWritablePrivate *priv = GET_PRIVATE (object); switch (property_id) { case GWD_MOCK_SETTINGS_WRITABLE_PROPERTY_GMOCK_INTERFACE: if (!priv->mock) priv->mock = reinterpret_cast (g_value_get_pointer (value)); break; default: g_assert_not_reached (); } } static void gwd_mock_settings_writable_dispose (GObject *object) { GWDMockSettingsWritableGMockInterface *settingsGMock = GET_PRIVATE (object)->mock; G_OBJECT_CLASS (gwd_mock_settings_writable_parent_class)->dispose (object); settingsGMock->dispose (); } static void gwd_mock_settings_writable_finalize (GObject *object) { GWDMockSettingsWritableGMockInterface *settingsGMock = GET_PRIVATE (object)->mock; G_OBJECT_CLASS (gwd_mock_settings_writable_parent_class)->finalize (object); settingsGMock->finalize (); } static void gwd_mock_settings_writable_class_init (GWDMockSettingsWritableClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); g_type_class_add_private (klass, sizeof (GWDMockSettingsWritablePrivate)); object_class->dispose = gwd_mock_settings_writable_dispose; object_class->finalize = gwd_mock_settings_writable_finalize; object_class->constructor = gwd_mock_settings_writable_constructor; object_class->set_property = gwd_mock_settings_writable_set_property; g_object_class_install_property (object_class, GWD_MOCK_SETTINGS_WRITABLE_PROPERTY_GMOCK_INTERFACE, g_param_spec_pointer ("gmock-interface", "Google Mock Interface", "Google Mock Interface", static_cast (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY))); } void gwd_mock_settings_writable_init (GWDMockSettingsWritable *self) { } GWDSettingsWritable * gwd_mock_settings_writable_new (GWDMockSettingsWritableGMockInterface *gmock) { GValue gmock_interface_v = G_VALUE_INIT; g_value_init (&gmock_interface_v, G_TYPE_POINTER); g_value_set_pointer (&gmock_interface_v, reinterpret_cast (gmock)); GParameter param[1] = { { "gmock-interface", gmock_interface_v } }; GWDSettingsWritable *writable = GWD_SETTINGS_WRITABLE_INTERFACE (g_object_newv (GWD_TYPE_MOCK_SETTINGS_WRITABLE, 1, param)); g_value_unset (&gmock_interface_v); return writable; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/compiz_gwd_mock_settings_notified.h0000644000015301777760000000405112321343002032035 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_MOCK_SETTINGS_NOTIFIED_H #define _COMPIZ_GWD_MOCK_SETTINGS_NOTIFIED_H #include #include #include typedef struct _GWDSettingsNotified GWDSettingsNotified; class GWDMockSettingsNotifiedGMockInterface; G_BEGIN_DECLS #define GWD_TYPE_MOCK_SETTINGS_NOTIFIED (gwd_mock_settings_notified_get_type ()) GType gwd_mock_settings_notified_get_type (); GWDSettingsNotified * gwd_mock_settings_notified_new (GWDMockSettingsNotifiedGMockInterface *); G_END_DECLS class GWDMockSettingsNotifiedGMockInterface { public: virtual ~GWDMockSettingsNotifiedGMockInterface () {} virtual gboolean updateDecorations () = 0; virtual gboolean updateFrames () = 0; virtual gboolean updateMetacityTheme () = 0; virtual gboolean updateMetacityButtonLayout () = 0; virtual void dispose () = 0; virtual void finalize () = 0; }; class GWDMockSettingsNotifiedGMock : public GWDMockSettingsNotifiedGMockInterface { public: MOCK_METHOD0 (updateDecorations, gboolean ()); MOCK_METHOD0 (updateFrames, gboolean ()); MOCK_METHOD0 (updateMetacityTheme, gboolean ()); MOCK_METHOD0 (updateMetacityButtonLayout, gboolean ()); MOCK_METHOD0 (dispose, void ()); MOCK_METHOD0 (finalize, void ()); }; #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/org.gnome.desktop.wm.preferences.gschema.xml0000644000015301777760000001305012321343002033324 0ustar pbusernogroup00000000000000 ':minimize,maximize,close'

Arrangement of buttons on the titlebar Arrangement of buttons on the titlebar. The value should be a string, such as "menu:minimize,maximize,spacer,close"; the colon separates the left corner of the window from the right corner, and the button names are comma-separated. Duplicate buttons are not allowed. Unknown button names are silently ignored so that buttons can be added in future metacity versions without breaking older versions. A special spacer tag can be used to insert some space between two adjacent buttons. 'toggle-maximize' Action on title bar double-click This option determines the effects of double-clicking on the title bar. Current valid options are 'toggle-shade', which will shade/unshade the window, 'toggle-maximize' which will maximize/unmaximize the window, 'toggle-maximize-horizontally' and 'toggle-maximize-vertically' which will maximize/unmaximize the window in that direction only, 'minimize' which will minimize the window, 'shade' which will roll the window up, 'menu' which will display the window menu, 'lower' which will put the window behind all the others, and 'none' which will not do anything. 'lower' Action on title bar middle-click This option determines the effects of middle-clicking on the title bar. Current valid options are 'toggle-shade', which will shade/unshade the window, 'toggle-maximize' which will maximize/unmaximize the window, 'toggle-maximize-horizontally' and 'toggle-maximize-vertically' which will maximize/unmaximize the window in that direction only, 'minimize' which will minimize the window, 'shade' which will roll the window up, 'menu' which will display the window menu, 'lower' which will put the window behind all the others, and 'none' which will not do anything. 'menu' Action on title bar right-click This option determines the effects of right-clicking on the title bar. Current valid options are 'toggle-shade', which will shade/unshade the window, 'toggle-maximize' which will maximize/unmaximize the window, 'toggle-maximize-horizontally' and 'toggle-maximize-vertically' which will maximize/unmaximize the window in that direction only, 'minimize' which will minimize the window, 'shade' which will roll the window up, 'menu' which will display the window menu, 'lower' which will put the window behind all the others, and 'none' which will not do anything. 'Adwaita' Current theme The theme determines the appearance of window borders, titlebar, and so forth. false Use standard system font in window titles If true, ignore the titlebar-font option, and use the standard application font for window titles. 'Cantarell Bold 11' Window title font A font description string describing a font for window titlebars. The size from the description will only be used if the titlebar-font-size option is set to 0. Also, this option is disabled if the titlebar-uses-desktop-font option is set to true. compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/test_gwd_metacity_decorations.cpp0000644000015301777760000000461012321343002031526 0ustar pbusernogroup00000000000000/* * Copyright © 2010 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include #include "gtest_unspecified_bool_type_matcher.h" #include "gwd-metacity-window-decoration-util.h" class GWDMetacityDecorationUtilTest : public ::testing::Test { }; namespace { MetaTheme * get_current_returns_null () { return NULL; } MetaTheme * get_current_returns_nonnull () { return (MetaTheme *) 1; } void set_current_seam (const gchar *theme, gboolean force) { } const std::string emptyTheme (""); const std::string realTheme ("Adwaita"); const std::string badTheme ("Clearlooks"); } TEST (GWDMetacityDecorationUtilTest, TestNULLDecorationRevertsToCairo) { EXPECT_THAT (gwd_metacity_window_decoration_update_meta_theme (NULL, get_current_returns_nonnull, set_current_seam), IsFalse ()); } TEST (GWDMetacityDecorationUtilTest, TestEmptyStringDecorationRevertsToCairo) { EXPECT_THAT (gwd_metacity_window_decoration_update_meta_theme (emptyTheme.c_str (), get_current_returns_nonnull, set_current_seam), IsFalse ()); } TEST (GWDMetacityDecorationUtilTest, TestBadThemeStringDecorationRevertsToCairo) { EXPECT_THAT (gwd_metacity_window_decoration_update_meta_theme (badTheme.c_str (), get_current_returns_null, set_current_seam), IsFalse ()); } TEST (GWDMetacityDecorationUtilTest, TestGoodThemeStringDecorationUsesMetacity) { EXPECT_THAT (gwd_metacity_window_decoration_update_meta_theme (realTheme.c_str (), get_current_returns_nonnull, set_current_seam), IsTrue ()); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/compiz_gwd_mock_settings_storage.cpp0000644000015301777760000002072612321343002032242 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include #include "gwd-settings-storage-interface.h" #include "compiz_gwd_mock_settings_storage.h" #define GWD_MOCK_SETTINGS_STORAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GWD_TYPE_MOCK_SETTINGS_STORAGE, GWDMockSettingsStorage)); #define GWD_MOCK_SETTINGS_STORAGE_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GWD_TYPE_MOCK_SETTINGS_STORAGE, GWDMockSettingsStorageClass)); #define GWD_IS_MOCK_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GWD_TYPE_MOCK_SETTINGS_STORAGE)); #define GWD_IS_MOCK_SETTINGS_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GWD_TYPE_MOCK_SETTINGS_STORAGE)); #define GWD_MOCK_SETTINGS_STORAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GWD_TYPE_MOCK_SETTINGS_STORAGE, GWDMockSettingsStorageClass)); typedef struct _GWDMockSettingsStorage { GObject parent; } GWDMockSettingsStorage; typedef struct _GWDMockSettingsStorageClass { GObjectClass parent_class; } GWDMockSettingsStorageClass; static void gwd_mock_settings_storage_interface_init (GWDSettingsStorageInterface *interface); G_DEFINE_TYPE_WITH_CODE (GWDMockSettingsStorage, gwd_mock_settings_storage, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GWD_TYPE_SETTINGS_STORAGE_INTERFACE, gwd_mock_settings_storage_interface_init)) #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GWD_TYPE_MOCK_SETTINGS_STORAGE, GWDMockSettingsStoragePrivate)) enum { GWD_MOCK_SETTINGS_STORAGE_PROPERTY_GMOCK_INTERFACE = 1 }; typedef struct _GWDMockSettingsStoragePrivate { GWDMockSettingsStorageGMockInterface *mock; } GWDMockSettingsStoragePrivate; gboolean gwd_mock_settings_storage_update_use_tooltips (GWDSettingsStorage *settings) { GWDMockSettingsStorage *settingsStorageMock = GWD_MOCK_SETTINGS_STORAGE (settings); GWDMockSettingsStorageGMockInterface *settingsGMock = GET_PRIVATE (settingsStorageMock)->mock; return settingsGMock->updateUseTooltips (); } gboolean gwd_mock_settings_storage_update_draggable_border_width (GWDSettingsStorage *settings) { GWDMockSettingsStorage *settingsStorageMock = GWD_MOCK_SETTINGS_STORAGE (settings); GWDMockSettingsStorageGMockInterface *settingsGMock = GET_PRIVATE (settingsStorageMock)->mock; return settingsGMock->updateDraggableBorderWidth (); } gboolean gwd_mock_settings_storage_update_attach_modal_dialogs (GWDSettingsStorage *settings) { GWDMockSettingsStorage *settingsStorageMock = GWD_MOCK_SETTINGS_STORAGE (settings) GWDMockSettingsStorageGMockInterface *settingsGMock = GET_PRIVATE (settingsStorageMock)->mock; return settingsGMock->updateAttachModalDialogs (); } gboolean gwd_mock_settings_storage_update_blur (GWDSettingsStorage *settings) { GWDMockSettingsStorage *settingsStorageMock = GWD_MOCK_SETTINGS_STORAGE (settings); GWDMockSettingsStorageGMockInterface *settingsGMock = GET_PRIVATE (settingsStorageMock)->mock; return settingsGMock->updateBlur (); } gboolean gwd_mock_settings_storage_update_metacity_theme (GWDSettingsStorage *settings) { GWDMockSettingsStorage *settingsStorageMock = GWD_MOCK_SETTINGS_STORAGE (settings); GWDMockSettingsStorageGMockInterface *settingsGMock = GET_PRIVATE (settingsStorageMock)->mock; return settingsGMock->updateMetacityTheme (); } gboolean gwd_mock_settings_storage_update_opacity (GWDSettingsStorage *settings) { GWDMockSettingsStorage *settingsStorageMock = GWD_MOCK_SETTINGS_STORAGE (settings); GWDMockSettingsStorageGMockInterface *settingsGMock = GET_PRIVATE (settingsStorageMock)->mock; return settingsGMock->updateOpacity (); } gboolean gwd_mock_settings_storage_update_button_layout (GWDSettingsStorage *settings) { GWDMockSettingsStorage *settingsStorageMock = GWD_MOCK_SETTINGS_STORAGE (settings); GWDMockSettingsStorageGMockInterface *settingsGMock = GET_PRIVATE (settingsStorageMock)->mock; return settingsGMock->updateButtonLayout (); } gboolean gwd_mock_settings_storage_update_font (GWDSettingsStorage *settings) { GWDMockSettingsStorage *settingsStorageMock = GWD_MOCK_SETTINGS_STORAGE (settings); GWDMockSettingsStorageGMockInterface *settingsGMock = GET_PRIVATE (settingsStorageMock)->mock; return settingsGMock->updateFont (); } gboolean gwd_mock_settings_storage_update_titlebar_actions (GWDSettingsStorage *settings) { GWDMockSettingsStorage *settingsStorageMock = GWD_MOCK_SETTINGS_STORAGE (settings); GWDMockSettingsStorageGMockInterface *settingsGMock = GET_PRIVATE (settingsStorageMock)->mock; return settingsGMock->updateTitlebarActions (); } static void gwd_mock_settings_storage_interface_init (GWDSettingsStorageInterface *interface) { interface->update_use_tooltips = gwd_mock_settings_storage_update_use_tooltips; interface->update_draggable_border_width = gwd_mock_settings_storage_update_draggable_border_width; interface->update_attach_modal_dialogs = gwd_mock_settings_storage_update_attach_modal_dialogs; interface->update_blur = gwd_mock_settings_storage_update_blur; interface->update_metacity_theme = gwd_mock_settings_storage_update_metacity_theme; interface->update_opacity = gwd_mock_settings_storage_update_opacity; interface->update_button_layout = gwd_mock_settings_storage_update_button_layout; interface->update_font = gwd_mock_settings_storage_update_font; interface->update_titlebar_actions = gwd_mock_settings_storage_update_titlebar_actions; } static void gwd_mock_settings_storage_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDMockSettingsStoragePrivate *priv = GET_PRIVATE (object); switch (property_id) { case GWD_MOCK_SETTINGS_STORAGE_PROPERTY_GMOCK_INTERFACE: if (!priv->mock) priv->mock = reinterpret_cast (g_value_get_pointer (value)); break; default: g_assert_not_reached (); } } static void gwd_mock_settings_storage_dispose (GObject *object) { GWDMockSettingsStorageGMockInterface *settingsGMock = GET_PRIVATE (object)->mock; G_OBJECT_CLASS (gwd_mock_settings_storage_parent_class)->dispose (object); settingsGMock->dispose (); } static void gwd_mock_settings_storage_finalize (GObject *object) { GWDMockSettingsStorageGMockInterface *settingsGMock = GET_PRIVATE (object)->mock; G_OBJECT_CLASS (gwd_mock_settings_storage_parent_class)->finalize (object); settingsGMock->finalize (); } static void gwd_mock_settings_storage_class_init (GWDMockSettingsStorageClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); g_type_class_add_private (klass, sizeof (GWDMockSettingsStoragePrivate)); object_class->dispose = gwd_mock_settings_storage_dispose; object_class->finalize = gwd_mock_settings_storage_finalize; object_class->set_property = gwd_mock_settings_storage_set_property; g_object_class_install_property (object_class, GWD_MOCK_SETTINGS_STORAGE_PROPERTY_GMOCK_INTERFACE, g_param_spec_pointer ("gmock-interface", "Google Mock Interface", "Google Mock Interface", static_cast (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY))); } void gwd_mock_settings_storage_init (GWDMockSettingsStorage *self) { } GWDSettingsStorage * gwd_mock_settings_storage_new (GWDMockSettingsStorageGMockInterface *gmock) { GValue gmock_interface_v = G_VALUE_INIT; g_value_init (&gmock_interface_v, G_TYPE_POINTER); g_value_set_pointer (&gmock_interface_v, reinterpret_cast (gmock)); GParameter param[1] = { { "gmock-interface", gmock_interface_v } }; GWDSettingsStorage *storage = GWD_SETTINGS_STORAGE_INTERFACE (g_object_newv (GWD_TYPE_MOCK_SETTINGS_STORAGE, 1, param)); g_value_unset (&gmock_interface_v); return storage; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/test_gwd_cairo_decorations.cpp0000644000015301777760000000313712321343002031007 0ustar pbusernogroup00000000000000/* * Copyright © 2010 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include "gwd-cairo-window-decoration-util.h" bool operator== (const decor_extents_t &rhs, const decor_extents_t &lhs) { return decor_extents_cmp (&rhs, &lhs); } class GWDCairoDecorationsTest : public ::testing::Test { }; namespace { const decor_extents_t *defaultWinExtents = gwd_cairo_window_decoration_get_default_win_extents (); const decor_extents_t *defaultMaxWinExtents = gwd_cairo_window_decoration_get_default_max_win_extents (); } TEST (GWDCairoDecorationsTest, TestGetCairoDecorationExtents) { decor_extents_t winExtents, maxWinExtents; gwd_cairo_window_decoration_get_extents (&winExtents, &maxWinExtents); EXPECT_EQ (winExtents, *defaultWinExtents); EXPECT_EQ (maxWinExtents, *defaultMaxWinExtents); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/compiz_gwd_mock_settings.h0000644000015301777760000000521712321343002030161 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public 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 _COMPIZ_GWD_MOCK_SETTINGS_H #define _COMPIZ_GWD_MOCK_SETTINGS_H #include #include #include class GWDMockSettingsGMockInterface; typedef struct _GWDSettings GWDSettingsImpl; G_BEGIN_DECLS #define GWD_TYPE_MOCK_SETTINGS (gwd_mock_settings_get_type ()) GType gwd_mock_settings_get_type (); GWDSettings * gwd_mock_settings_new (GWDMockSettingsGMockInterface *); enum { GWD_MOCK_SETTINGS_PROPERTY_ACTIVE_SHADOW = 1, GWD_MOCK_SETTINGS_PROPERTY_INACTIVE_SHADOW = 2, GWD_MOCK_SETTINGS_PROPERTY_USE_TOOLTIPS = 3, GWD_MOCK_SETTINGS_PROPERTY_DRAGGABLE_BORDER_WIDTH = 4, GWD_MOCK_SETTINGS_PROPERTY_ATTACH_MODAL_DIALOGS = 5, GWD_MOCK_SETTINGS_PROPERTY_BLUR_CHANGED = 6, GWD_MOCK_SETTINGS_PROPERTY_METACITY_THEME = 7, GWD_MOCK_SETTINGS_PROPERTY_ACTIVE_OPACITY = 8, GWD_MOCK_SETTINGS_PROPERTY_INACTIVE_OPACITY = 9, GWD_MOCK_SETTINGS_PROPERTY_ACTIVE_SHADE_OPACITY = 10, GWD_MOCK_SETTINGS_PROPERTY_INACTIVE_SHADE_OPACITY = 11, GWD_MOCK_SETTINGS_PROPERTY_BUTTON_LAYOUT = 12, GWD_MOCK_SETTINGS_PROPERTY_TITLEBAR_ACTION_DOUBLE_CLICK = 13, GWD_MOCK_SETTINGS_PROPERTY_TITLEBAR_ACTION_MIDDLE_CLICK = 14, GWD_MOCK_SETTINGS_PROPERTY_TITLEBAR_ACTION_RIGHT_CLICK = 15, GWD_MOCK_SETTINGS_PROPERTY_MOUSE_WHEEL_ACTION = 16, GWD_MOCK_SETTINGS_PROPERTY_TITLEBAR_FONT = 17, GWD_MOCK_SETTINGS_PROPERTY_GMOCK_INTERFACE = 18 }; G_END_DECLS class GWDMockSettingsGMockInterface { public: virtual ~GWDMockSettingsGMockInterface () {} virtual void getProperty (guint property_id, GValue *property_value, GParamSpec *pspec) = 0; virtual void dispose () = 0; virtual void finalize () = 0; }; class GWDMockSettingsGMock : public GWDMockSettingsGMockInterface { public: MOCK_METHOD3 (getProperty, void (guint, GValue *, GParamSpec *)); MOCK_METHOD0 (dispose, void ()); MOCK_METHOD0 (finalize, void ()); }; #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/org.gnome.mutter.gschema.xml0000644000015301777760000000151512321343002030254 0ustar pbusernogroup00000000000000 false Attach modal dialogs When true, instead of having independent titlebars, modal dialogs appear attached to the titlebar of the parent window and are moved together with the parent window. 10 Draggable border width The amount of total draggable borders. If the theme's visible borders are not enough, invisible borders will be added to meet this value. compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/compiz_gwd_mock_settings_notified.cpp0000644000015301777760000001571112321343002032375 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include #include "gwd-settings-notified-interface.h" #include "compiz_gwd_mock_settings_notified.h" #define GWD_MOCK_SETTINGS_NOTIFIED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GWD_TYPE_MOCK_SETTINGS_NOTIFIED, GWDMockSettingsNotified)); #define GWD_MOCK_SETTINGS_NOTIFIED_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GWD_TYPE_MOCK_SETTINGS_NOTIFIED, GWDMockSettingsNotifiedClass)); #define GWD_IS_MOCK_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GWD_TYPE_MOCK_SETTINGS_NOTIFIED)); #define GWD_IS_MOCK_SETTINGS_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GWD_TYPE_MOCK_SETTINGS_NOTIFIED)); #define GWD_MOCK_SETTINGS_NOTIFIED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GWD_TYPE_MOCK_SETTINGS_NOTIFIED, GWDMockSettingsNotifiedClass)); typedef struct _GWDMockSettingsNotified { GObject parent; } GWDMockSettingsNotified; typedef struct _GWDMockSettingsNotifiedClass { GObjectClass parent_class; } GWDMockSettingsNotifiedClass; static void gwd_mock_settings_notified_interface_init (GWDSettingsNotifiedInterface *interface); G_DEFINE_TYPE_WITH_CODE (GWDMockSettingsNotified, gwd_mock_settings_notified, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GWD_TYPE_SETTINGS_NOTIFIED_INTERFACE, gwd_mock_settings_notified_interface_init)) #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GWD_TYPE_MOCK_SETTINGS_NOTIFIED, GWDMockSettingsNotifiedPrivate)) enum { GWD_MOCK_SETTINGS_NOTIFIED_PROPERTY_GMOCK_INTERFACE = 1 }; typedef struct _GWDMockSettingsNotifiedPrivate { GWDMockSettingsNotifiedGMockInterface *mock; } GWDMockSettingsNotifiedPrivate; gboolean gwd_mock_settings_notified_update_decorations (GWDSettingsNotified *notified) { GWDMockSettingsNotifiedGMockInterface *notifiedGMock = GET_PRIVATE (notified)->mock; return notifiedGMock->updateDecorations (); } gboolean gwd_mock_settings_notified_update_frames (GWDSettingsNotified *notified) { GWDMockSettingsNotifiedGMockInterface *notifiedGMock = GET_PRIVATE (notified)->mock; return notifiedGMock->updateFrames (); } gboolean gwd_mock_settings_notified_update_metacity_theme (GWDSettingsNotified *notified) { GWDMockSettingsNotifiedGMockInterface *notifiedGMock = GET_PRIVATE (notified)->mock; return notifiedGMock->updateMetacityTheme (); } gboolean gwd_mock_settings_notified_update_metacity_button_layout (GWDSettingsNotified *notified) { GWDMockSettingsNotifiedGMockInterface *notifiedGMock = GET_PRIVATE (notified)->mock; return notifiedGMock->updateMetacityButtonLayout (); } static void gwd_mock_settings_notified_interface_init (GWDSettingsNotifiedInterface *interface) { interface->update_decorations = gwd_mock_settings_notified_update_decorations; interface->update_frames = gwd_mock_settings_notified_update_frames; interface->update_metacity_theme = gwd_mock_settings_notified_update_metacity_theme; interface->update_metacity_button_layout = gwd_mock_settings_notified_update_metacity_button_layout; } static GObject * gwd_mock_settings_notified_constructor (GType type, guint n_construction_properties, GObjectConstructParam *construction_properties) { GObject *object = G_OBJECT_CLASS (gwd_mock_settings_notified_parent_class)->constructor (type, n_construction_properties, construction_properties); GWDMockSettingsNotifiedPrivate *priv = GET_PRIVATE (object); guint i = 0; for (; i < n_construction_properties; ++i) { if (g_strcmp0 (construction_properties[i].pspec->name, "gmock-interface") == 0) { priv->mock = reinterpret_cast (g_value_get_pointer (construction_properties[i].value)); } else g_assert_not_reached (); } return object; } static void gwd_mock_settings_notified_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDMockSettingsNotifiedPrivate *priv = GET_PRIVATE (object); switch (property_id) { case GWD_MOCK_SETTINGS_NOTIFIED_PROPERTY_GMOCK_INTERFACE: if (!priv->mock) priv->mock = reinterpret_cast (g_value_get_pointer (value)); break; default: g_assert_not_reached (); } } static void gwd_mock_settings_notified_dispose (GObject *object) { GWDMockSettingsNotifiedGMockInterface *settingsGMock = GET_PRIVATE (object)->mock; G_OBJECT_CLASS (gwd_mock_settings_notified_parent_class)->dispose (object); settingsGMock->dispose (); } static void gwd_mock_settings_notified_finalize (GObject *object) { GWDMockSettingsNotifiedGMockInterface *settingsGMock = GET_PRIVATE (object)->mock; G_OBJECT_CLASS (gwd_mock_settings_notified_parent_class)->finalize (object); settingsGMock->finalize (); } static void gwd_mock_settings_notified_class_init (GWDMockSettingsNotifiedClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); g_type_class_add_private (klass, sizeof (GWDMockSettingsNotifiedPrivate)); object_class->dispose = gwd_mock_settings_notified_dispose; object_class->finalize = gwd_mock_settings_notified_finalize; object_class->constructor = gwd_mock_settings_notified_constructor; object_class->set_property = gwd_mock_settings_notified_set_property; g_object_class_install_property (object_class, GWD_MOCK_SETTINGS_NOTIFIED_PROPERTY_GMOCK_INTERFACE, g_param_spec_pointer ("gmock-interface", "Google Mock Interface", "Google Mock Interface", static_cast (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY))); } void gwd_mock_settings_notified_init (GWDMockSettingsNotified *self) { } GWDSettingsNotified * gwd_mock_settings_notified_new (GWDMockSettingsNotifiedGMockInterface *gmock) { GValue gmock_interface_v = G_VALUE_INIT; g_value_init (&gmock_interface_v, G_TYPE_POINTER); g_value_set_pointer (&gmock_interface_v, reinterpret_cast (gmock)); GParameter param[1] = { { "gmock-interface", gmock_interface_v } }; GWDSettingsNotified *writable = GWD_SETTINGS_NOTIFIED_INTERFACE (g_object_newv (GWD_TYPE_MOCK_SETTINGS_NOTIFIED, 1, param)); g_value_unset (&gmock_interface_v); return writable; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/compiz_gwd_mock_settings.cpp0000644000015301777760000001667512321343002030526 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include #include "gwd-settings-interface.h" #include "compiz_gwd_mock_settings.h" #define GWD_MOCK_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GWD_TYPE_MOCK_SETTINGS, GWDMockSettings)); #define GWD_MOCK_SETTINGS_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GWD_TYPE_MOCK_SETTINGS, GWDMockSettingsClass)); #define GWD_IS_MOCK_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GWD_TYPE_MOCK_SETTINGS)); #define GWD_IS_MOCK_SETTINGS_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GWD_TYPE_MOCK_SETTINGS)); #define GWD_MOCK_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GWD_TYPE_MOCK_SETTINGS, GWDMockSettingsClass)); typedef struct _GWDMockSettings { GObject parent; } GWDMockSettings; typedef struct _GWDMockSettingsClass { GObjectClass parent_class; } GWDMockSettingsClass; static void gwd_mock_settings_interface_init (GWDSettingsInterface *interface); G_DEFINE_TYPE_WITH_CODE (GWDMockSettings, gwd_mock_settings, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GWD_TYPE_SETTINGS_INTERFACE, gwd_mock_settings_interface_init)) #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GWD_TYPE_MOCK_SETTINGS, GWDMockSettingsPrivate)) typedef struct _GWDMockSettingsPrivate { GWDMockSettingsGMockInterface *mock; } GWDMockSettingsPrivate; static void gwd_mock_settings_interface_init (GWDSettingsInterface *interface) { } static void gwd_mock_settings_dispose (GObject *object) { GWDMockSettingsGMockInterface *settingsGMock = GET_PRIVATE (object)->mock; G_OBJECT_CLASS (gwd_mock_settings_parent_class)->dispose (object); settingsGMock->dispose (); } static void gwd_mock_settings_finalize (GObject *object) { GWDMockSettingsGMockInterface *settingsGMock = GET_PRIVATE (object)->mock; G_OBJECT_CLASS (gwd_mock_settings_parent_class)->finalize (object); settingsGMock->finalize (); } static void gwd_mock_settings_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDMockSettingsPrivate *priv = GET_PRIVATE (object); switch (property_id) { case GWD_MOCK_SETTINGS_PROPERTY_GMOCK_INTERFACE: if (!priv->mock) priv->mock = reinterpret_cast (g_value_get_pointer (value)); break; case GWD_MOCK_SETTINGS_PROPERTY_BLUR_CHANGED: case GWD_MOCK_SETTINGS_PROPERTY_ACTIVE_OPACITY: case GWD_MOCK_SETTINGS_PROPERTY_ACTIVE_SHADE_OPACITY: case GWD_MOCK_SETTINGS_PROPERTY_INACTIVE_OPACITY: case GWD_MOCK_SETTINGS_PROPERTY_INACTIVE_SHADE_OPACITY: case GWD_MOCK_SETTINGS_PROPERTY_METACITY_THEME: break; default: g_assert_not_reached (); break; } } static void gwd_mock_settings_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { GWDMockSettingsGMockInterface *settingsGMock = GET_PRIVATE (object)->mock; settingsGMock->getProperty (property_id, value, pspec); } static void gwd_mock_settings_class_init (GWDMockSettingsClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); g_type_class_add_private (klass, sizeof (GWDMockSettingsPrivate)); object_class->dispose = gwd_mock_settings_dispose; object_class->finalize = gwd_mock_settings_finalize; object_class->get_property = gwd_mock_settings_get_property; object_class->set_property = gwd_mock_settings_set_property; g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_ACTIVE_SHADOW, "active-shadow"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_INACTIVE_SHADOW, "inactive-shadow"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_USE_TOOLTIPS, "use-tooltips"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_DRAGGABLE_BORDER_WIDTH, "draggable-border-width"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_ATTACH_MODAL_DIALOGS, "attach-modal-dialogs"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_BLUR_CHANGED, "blur"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_METACITY_THEME, "metacity-theme"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_ACTIVE_OPACITY, "metacity-active-opacity"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_INACTIVE_OPACITY, "metacity-inactive-opacity"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_ACTIVE_SHADE_OPACITY, "metacity-active-shade-opacity"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_INACTIVE_SHADE_OPACITY, "metacity-inactive-shade-opacity"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_BUTTON_LAYOUT, "metacity-button-layout"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_TITLEBAR_ACTION_DOUBLE_CLICK, "titlebar-double-click-action"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_TITLEBAR_ACTION_MIDDLE_CLICK, "titlebar-middle-click-action"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_TITLEBAR_ACTION_RIGHT_CLICK, "titlebar-right-click-action"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_MOUSE_WHEEL_ACTION, "mouse-wheel-action"); g_object_class_override_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_TITLEBAR_FONT, "titlebar-font"); g_object_class_install_property (object_class, GWD_MOCK_SETTINGS_PROPERTY_GMOCK_INTERFACE, g_param_spec_pointer ("gmock-interface", "Google Mock Interface", "Google Mock Interface", static_cast (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY))); } static void gwd_mock_settings_init (GWDMockSettings *self) { } GWDSettings * gwd_mock_settings_new (GWDMockSettingsGMockInterface *gmock) { GValue gmock_interface_v = G_VALUE_INIT; g_value_init (&gmock_interface_v, G_TYPE_POINTER); g_value_set_pointer (&gmock_interface_v, reinterpret_cast (gmock)); GParameter param[1] = { { "gmock-interface", gmock_interface_v } }; GWDSettings *settings = GWD_SETTINGS_INTERFACE (g_object_newv (GWD_TYPE_MOCK_SETTINGS, 1, param)); g_value_unset (&gmock_interface_v); return settings; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/compiz_gwd_tests.h.in0000644000015301777760000000201612321343002027051 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_TESTS_CONFIG_H #define _COMPIZ_GWD_TESTS_CONFIG_H #define MOCK_SCHEMA_PATH "@CMAKE_BINARY_DIR@/generated/glib-2.0/schemas" namespace { const std::string MOCK_PATH (MOCK_SCHEMA_PATH); } #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/compiz_gwd_mock_settings_storage.h0000644000015301777760000000474312321343002031710 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_MOCK_SETTINGS_STORAGE_H #define _COMPIZ_GWD_MOCK_SETTINGS_STORAGE_H #include #include #include typedef struct _GWDSettingsStorage GWDSettingsStorage; class GWDMockSettingsStorageGMockInterface; G_BEGIN_DECLS #define GWD_TYPE_MOCK_SETTINGS_STORAGE (gwd_mock_settings_storage_get_type ()) GType gwd_mock_settings_storage_get_type (); GWDSettingsStorage * gwd_mock_settings_storage_new (GWDMockSettingsStorageGMockInterface *); G_END_DECLS class GWDMockSettingsStorageGMockInterface { public: virtual ~GWDMockSettingsStorageGMockInterface () {} virtual gboolean updateUseTooltips () = 0; virtual gboolean updateDraggableBorderWidth () = 0; virtual gboolean updateAttachModalDialogs () = 0; virtual gboolean updateBlur () = 0; virtual gboolean updateMetacityTheme () = 0; virtual gboolean updateOpacity () = 0; virtual gboolean updateButtonLayout () = 0; virtual gboolean updateFont () = 0; virtual gboolean updateTitlebarActions () = 0; virtual void dispose () = 0; virtual void finalize () = 0; }; class GWDMockSettingsStorageGMock : public GWDMockSettingsStorageGMockInterface { public: MOCK_METHOD0 (updateUseTooltips, gboolean ()); MOCK_METHOD0 (updateDraggableBorderWidth, gboolean ()); MOCK_METHOD0 (updateAttachModalDialogs, gboolean ()); MOCK_METHOD0 (updateBlur, gboolean ()); MOCK_METHOD0 (updateMetacityTheme, gboolean ()); MOCK_METHOD0 (updateOpacity, gboolean ()); MOCK_METHOD0 (updateButtonLayout, gboolean ()); MOCK_METHOD0 (updateFont, gboolean ()); MOCK_METHOD0 (updateTitlebarActions, gboolean ()); MOCK_METHOD0 (dispose, void ()); MOCK_METHOD0 (finalize, void ()); }; #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/CMakeLists.txt0000644000015301777760000001311412321343002025450 0ustar pbusernogroup00000000000000include (CompizGSettings) include_directories (${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../ ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/tests/shared ${CMAKE_SOURCE_DIR}/tests/shared/glib) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/compiz_gwd_tests.h.in ${CMAKE_CURRENT_BINARY_DIR}/compiz_gwd_tests.h) pkg_check_modules (COMPIZ_TEST_GTK_WINDOW_DECORATOR glib-2.0>=2.28 gio-2.0>=2.25.0) if (COMPIZ_TEST_GTK_WINDOW_DECORATOR_FOUND) link_directories (${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/..) add_library (gtk_window_decorator_mock_settings_storage STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compiz_gwd_mock_settings_storage.cpp) target_link_libraries (gtk_window_decorator_mock_settings_storage gtk_window_decorator_settings_storage_interface) add_library (gtk_window_decorator_mock_settings STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compiz_gwd_mock_settings.cpp) target_link_libraries (gtk_window_decorator_mock_settings gtk_window_decorator_settings_interface) add_library (gtk_window_decorator_mock_settings_writable STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compiz_gwd_mock_settings_writable.cpp) target_link_libraries (gtk_window_decorator_mock_settings_writable gtk_window_decorator_settings_writable_interface) add_library (gtk_window_decorator_mock_settings_notified STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compiz_gwd_mock_settings_notified.cpp) target_link_libraries (gtk_window_decorator_mock_settings_notified gtk_window_decorator_settings_notified_interface) add_executable (compiz_test_gwd_settings ${CMAKE_CURRENT_SOURCE_DIR}/test_gwd_settings.cpp) set (COMPIZ_TEST_GWD_SETTINGS_ADDITIONAL_LIBRARIES gtk_window_decorator_settings gtk_window_decorator_mock_settings gtk_window_decorator_mock_settings_writable gtk_window_decorator_mock_settings_storage gtk_window_decorator_mock_settings_notified) set (COMPIZ_TEST_GWD_SETTINGS_COVERAGE_TARGETS gtk_window_decorator_settings gtk_window_decorator_settings_interface gtk_window_decorator_settings_storage_interface gtk_window_decorator_settings_notified_interface) if (USE_GSETTINGS) add_definitions (-DUSE_GSETTINGS) set (_desktop_gschema_name org.gnome.desktop.wm.preferences) set (_desktop_gschema_filename ${_desktop_gschema_name}.gschema.xml) set (_desktop_gschema_filepath ${CMAKE_CURRENT_SOURCE_DIR}/${_desktop_gschema_filename}) set (_desktop_gschema_generated_location ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/${_desktop_gschema_filename}) add_custom_command (OUTPUT ${_desktop_gschema_generated_location} COMMAND cp -r ${_desktop_gschema_filepath} ${_desktop_gschema_generated_location} DEPENDS ${_desktop_gschema_filepath} VERBATIM) add_custom_target (compiz_gwd_gsettings_org_gnome_desktop_wm_preferences_schema ALL DEPENDS ${_desktop_gschema_generated_location}) add_gsettings_schema_to_recompilation_list (compiz_gwd_gsettings_org_gnome_desktop_wm_preferences_schema) set (_mutter_gschema_name org.gnome.mutter) set (_mutter_gschema_filename ${_mutter_gschema_name}.gschema.xml) set (_mutter_gschema_filepath ${CMAKE_CURRENT_SOURCE_DIR}/${_mutter_gschema_filename}) set (_mutter_gschema_generated_location ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/${_mutter_gschema_filename}) add_custom_command (OUTPUT ${_mutter_gschema_generated_location} COMMAND cp -r ${_mutter_gschema_filepath} ${_mutter_gschema_generated_location} DEPENDS ${_mutter_gschema_filepath} VERBATIM) add_custom_target (compiz_gwd_gsettings_org_gnome_mutter_schema ALL DEPENDS ${_mutter_gschema_generated_location}) add_gsettings_schema_to_recompilation_list (compiz_gwd_gsettings_org_gnome_mutter_schema) set (COMPIZ_TEST_GWD_SETTINGS_ADDITIONAL_LIBRARIES ${COMPIZ_TEST_GWD_SETTINGS_ADDITIONAL_LIBRARIES} gtk_window_decorator_settings_storage_gsettings) set (COMPIZ_TEST_GWD_SETTINGS_COVERAGE_TARGETS ${COMPIZ_TEST_GWD_SETTINGS_COVERAGE_TARGETS} gtk_window_decorator_settings_storage_gsettings) endif (USE_GSETTINGS) target_link_libraries (compiz_test_gwd_settings ${COMPIZ_TEST_GWD_SETTINGS_ADDITIONAL_LIBRARIES} decoration ${COMPIZ_TEST_GTK_WINDOW_DECORATOR_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_gwd_settings COVERAGE ${COMPIZ_TEST_GWD_SETTINGS_COVERAGE_TARGETS}) add_executable (compiz_test_gwd_cairo_decorations ${CMAKE_CURRENT_SOURCE_DIR}/test_gwd_cairo_decorations.cpp) target_link_libraries (compiz_test_gwd_cairo_decorations gtk_window_decorator_cairo_window_decoration_util ${COMPIZ_TEST_GTK_WINDOW_DECORATOR_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} decoration) compiz_discover_tests (compiz_test_gwd_cairo_decorations COVERAGE gtk_window_decorator_cairo_window_decoration_util) add_executable (compiz_test_gwd_metacity_decorations ${CMAKE_CURRENT_SOURCE_DIR}/test_gwd_metacity_decorations.cpp) target_link_libraries (compiz_test_gwd_metacity_decorations gtk_window_decorator_metacity_window_decoration_util ${COMPIZ_TEST_GTK_WINDOW_DECORATOR_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} decoration) compiz_discover_tests (compiz_test_gwd_metacity_decorations COVERAGE gtk_window_decorator_metacity_window_decoration_util) endif (COMPIZ_TEST_GTK_WINDOW_DECORATOR_FOUND) compiz-0.9.11+14.04.20140409/gtk/window-decorator/tests/compiz_gwd_mock_settings_writable.h0000644000015301777760000000761412321343002032055 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_MOCK_SETTINGS_WRITABLE_H #define _COMPIZ_GWD_MOCK_SETTINGS_WRITABLE_H #include #include #include typedef struct _GWDSettingsWritable GWDSettingsWritable; class GWDMockSettingsWritableGMockInterface; G_BEGIN_DECLS #define GWD_TYPE_MOCK_SETTINGS_WRITABLE (gwd_mock_settings_writable_get_type ()) GType gwd_mock_settings_writable_get_type (); GWDSettingsWritable * gwd_mock_settings_writable_new (GWDMockSettingsWritableGMockInterface *); G_END_DECLS class GWDMockSettingsWritableGMockInterface { public: virtual ~GWDMockSettingsWritableGMockInterface () {} virtual void freezeUpdates() = 0; virtual void thawUpdates () = 0; virtual gboolean shadowPropertyChanged (gdouble active_shadow_radius, gdouble active_shadow_opacity, gdouble active_shadow_offset_x, gdouble active_shadow_offset_y, const gchar *active_shadow_color, gdouble inactive_shadow_radius, gdouble inactive_shadow_opacity, gdouble inactive_shadow_offset_x, gdouble inactive_shadow_offset_y, const gchar *inactive_shadow_color) = 0; virtual gboolean useTooltipsChanged (gboolean newValue) = 0; virtual gboolean draggableBorderWidthChanged (gint newValue) = 0; virtual gboolean attachModalDialogsChanged (gboolean newValue) = 0; virtual gboolean blurChanged (const gchar *type) = 0; virtual gboolean metacityThemeChanged (gboolean useMetacityTheme, const gchar *metacityTheme) = 0; virtual gboolean opacityChanged (gdouble inactiveOpacity, gdouble activeOpacity, gboolean inactiveShadeOpacity, gboolean activeShadeOpacity) = 0; virtual gboolean buttonLayoutChanged (const gchar *buttonLayout) = 0; virtual gboolean fontChanged (gboolean useSystemFont, const gchar *titlebarFont) = 0; virtual gboolean titlebarActionsChanged (const gchar *doubleClickAction, const gchar *middleClickAction, const gchar *rightClickAction, const gchar *mouseWheelAction) = 0; virtual void dispose () = 0; virtual void finalize () = 0; }; class GWDMockSettingsWritableGMock : public GWDMockSettingsWritableGMockInterface { public: MOCK_METHOD0 (freezeUpdates, void ()); MOCK_METHOD0 (thawUpdates, void ()); MOCK_METHOD10 (shadowPropertyChanged, gboolean (gdouble, gdouble, gdouble, gdouble, const gchar *, gdouble, gdouble, gdouble, gdouble, const gchar *)); MOCK_METHOD1 (useTooltipsChanged, gboolean (gboolean)); MOCK_METHOD1 (draggableBorderWidthChanged, gboolean (gint)); MOCK_METHOD1 (attachModalDialogsChanged, gboolean (gboolean)); MOCK_METHOD1 (blurChanged, gboolean (const gchar *)); MOCK_METHOD2 (metacityThemeChanged, gboolean (gboolean, const gchar *)); MOCK_METHOD4 (opacityChanged, gboolean (gdouble, gdouble, gboolean, gboolean)); MOCK_METHOD1 (buttonLayoutChanged, gboolean (const gchar *)); MOCK_METHOD2 (fontChanged, gboolean (gboolean, const gchar *)); MOCK_METHOD4 (titlebarActionsChanged, gboolean (const gchar *, const gchar *, const gchar *, const gchar *)); MOCK_METHOD0 (dispose, void ()); MOCK_METHOD0 (finalize, void ()); }; #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-metacity-window-decoration-util.h0000644000015301777760000000250412321343002030723 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _GWD_METACITY_WINDOW_DECORATION_UTIL_H #define _GWD_METACITY_WINDOW_DECORATION_UTIL_H #include #include G_BEGIN_DECLS typedef MetaTheme * (*GWDMetaThemeGetCurrentProc) (); typedef void (*GWDMetaThemeSetProc) (const gchar *theme, gboolean force_update); gboolean gwd_metacity_window_decoration_update_meta_theme (const gchar *theme, GWDMetaThemeGetCurrentProc get_current, GWDMetaThemeSetProc set_current); G_END_DECLS; #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/decorprops.c0000644000015301777760000001324212321343002024074 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" void decor_update_window_property (decor_t *d) { long *data; Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); decor_extents_t extents = d->frame->win_extents; gint nQuad; unsigned int nOffset = 1; unsigned int frame_type = populate_frame_type (d); unsigned int frame_state = populate_frame_state (d); unsigned int frame_actions = populate_frame_actions (d); decor_quad_t quads[N_QUADS_MAX]; int w, h; gint stretch_offset; REGION top, bottom, left, right; w = d->border_layout.top.x2 - d->border_layout.top.x1 - d->context->left_space - d->context->right_space; if (d->border_layout.rotation) h = d->border_layout.left.x2 - d->border_layout.left.x1; else h = d->border_layout.left.y2 - d->border_layout.left.y1; stretch_offset = w - d->button_width - 1; nQuad = decor_set_lSrStXbS_window_quads (quads, d->context, &d->border_layout, stretch_offset); extents.top += d->frame->titlebar_height; if (d->frame_window) { data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_WINDOW); decor_gen_window_property (data, nOffset - 1, &extents, &extents, 20, 20, frame_type, frame_state, frame_actions); } else { data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_PIXMAP); decor_quads_to_property (data, nOffset - 1, GDK_PIXMAP_XID (d->pixmap), &extents, &extents, &extents, &extents, ICON_SPACE + d->button_width, 0, quads, nQuad, frame_type, frame_state, frame_actions); } gdk_error_trap_push (); XChangeProperty (xdisplay, d->prop_xid, win_decor_atom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop (); top.rects = &top.extents; top.numRects = top.size = 1; top.extents.x1 = -extents.left; top.extents.y1 = -extents.top; top.extents.x2 = w + extents.right; top.extents.y2 = 0; bottom.rects = &bottom.extents; bottom.numRects = bottom.size = 1; bottom.extents.x1 = -extents.left; bottom.extents.y1 = 0; bottom.extents.x2 = w + extents.right; bottom.extents.y2 = extents.bottom; left.rects = &left.extents; left.numRects = left.size = 1; left.extents.x1 = -extents.left; left.extents.y1 = 0; left.extents.x2 = 0; left.extents.y2 = h; right.rects = &right.extents; right.numRects = right.size = 1; right.extents.x1 = 0; right.extents.y1 = 0; right.extents.x2 = extents.right; right.extents.y2 = h; decor_update_blur_property (d, w, h, &top, stretch_offset, &bottom, w / 2, &left, h / 2, &right, h / 2); free (data); } void decor_update_switcher_property (decor_t *d) { long *data; Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); gint nQuad; decor_quad_t quads[N_QUADS_MAX]; unsigned int nOffset = 1; unsigned int frame_type = populate_frame_type (d); unsigned int frame_state = populate_frame_state (d); unsigned int frame_actions = populate_frame_actions (d); GtkStyle *style; long fgColor[4]; nQuad = decor_set_lSrStSbX_window_quads (quads, &d->frame->window_context_active, &d->border_layout, d->border_layout.top.x2 - d->border_layout.top.x1 - d->frame->window_context_active.extents.left - d->frame->window_context_active.extents.right - 32); data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_PIXMAP); decor_quads_to_property (data, nOffset - 1, GDK_PIXMAP_XID (d->pixmap), &d->frame->win_extents, &d->frame->win_extents, &d->frame->win_extents, &d->frame->win_extents, 0, 0, quads, nQuad, frame_type, frame_state, frame_actions); style = gtk_widget_get_style (d->frame->style_window_rgba); fgColor[0] = style->fg[GTK_STATE_NORMAL].red; fgColor[1] = style->fg[GTK_STATE_NORMAL].green; fgColor[2] = style->fg[GTK_STATE_NORMAL].blue; fgColor[3] = SWITCHER_ALPHA; gdk_error_trap_push (); XChangeProperty (xdisplay, d->prop_xid, win_decor_atom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); XChangeProperty (xdisplay, d->prop_xid, switcher_fg_atom, XA_INTEGER, 32, PropModeReplace, (guchar *) fgColor, 4); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop (); free (data); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/actionmenu.c0000644000015301777760000000716012321343002024060 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" static void action_menu_unmap (GObject *object) { action_menu_mapped = FALSE; } static void action_menu_destroyed (GObject *object) { g_signal_handlers_disconnect_by_func (action_menu, action_menu_destroyed, NULL); g_signal_handlers_disconnect_by_func (action_menu, action_menu_unmap, NULL); g_object_unref (action_menu); action_menu = NULL; action_menu_mapped = FALSE; } static void position_action_menu (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data) { WnckWindow *win = (WnckWindow *) user_data; decor_frame_t *frame = gwd_get_decor_frame (get_frame_type (win)); decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); gint bx, by, width, height; wnck_window_get_client_window_geometry (win, x, y, &width, &height); if (d->decorated) { if ((*theme_get_button_position) (d, BUTTON_MENU, width, height, &bx, &by, &width, &height)) *x = *x - frame->win_extents.left + bx; } gwd_decor_frame_unref (frame); if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL) { GtkRequisition req; gtk_widget_size_request (GTK_WIDGET (menu), &req); *x = MAX (0, *x - req.width + width); } *push_in = TRUE; } void action_menu_map (WnckWindow *win, long button, Time time) { GdkDisplay *gdkdisplay; GdkScreen *screen; gdkdisplay = gdk_display_get_default (); screen = gdk_display_get_default_screen (gdkdisplay); if (action_menu) { if (action_menu_mapped) { gtk_widget_destroy (action_menu); return; } else gtk_widget_destroy (action_menu); } switch (wnck_window_get_window_type (win)) { case WNCK_WINDOW_DESKTOP: case WNCK_WINDOW_DOCK: /* don't allow window action */ return; case WNCK_WINDOW_NORMAL: case WNCK_WINDOW_DIALOG: #ifndef HAVE_LIBWNCK_2_19_4 case WNCK_WINDOW_MODAL_DIALOG: #endif case WNCK_WINDOW_TOOLBAR: case WNCK_WINDOW_MENU: case WNCK_WINDOW_UTILITY: case WNCK_WINDOW_SPLASHSCREEN: /* allow window action menu */ break; } action_menu = wnck_action_menu_new (win); g_object_ref_sink (action_menu); gtk_menu_set_screen (GTK_MENU (action_menu), screen); g_signal_connect (G_OBJECT (action_menu), "destroy", G_CALLBACK (action_menu_destroyed), NULL); g_signal_connect (G_OBJECT (action_menu), "unmap", G_CALLBACK (action_menu_unmap), NULL); gtk_widget_show (action_menu); if (!button || button == 1) { gtk_menu_popup (GTK_MENU (action_menu), NULL, NULL, position_action_menu, (gpointer) win, button, time); } else { gtk_menu_popup (GTK_MENU (action_menu), NULL, NULL, NULL, NULL, button, time); } action_menu_mapped = TRUE; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-notified-interface.h0000644000015301777760000000433012321343002030073 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_SETTINGS_NOTIFIED_INTERFACE_H #define _COMPIZ_GWD_SETTINGS_NOTIFIED_INTERFACE_H #include #include G_BEGIN_DECLS #define GWD_SETTINGS_NOTIFIED_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ GWD_TYPE_SETTINGS_NOTIFIED_INTERFACE, \ GWDSettingsNotified)) #define GWD_SETTINGS_NOTIFIED_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE(obj, \ GWD_TYPE_SETTINGS_NOTIFIED_INTERFACE, \ GWDSettingsNotifiedInterface)) #define GWD_TYPE_SETTINGS_NOTIFIED_INTERFACE (gwd_settings_notified_interface_get_type ()) typedef struct _GWDSettingsNotifiedInterface GWDSettingsNotifiedInterface; struct _GWDSettingsNotifiedInterface { GTypeInterface parent; gboolean (*update_decorations) (GWDSettingsNotified *notified); gboolean (*update_frames) (GWDSettingsNotified *notified); gboolean (*update_metacity_theme) (GWDSettingsNotified *notified); gboolean (*update_metacity_button_layout) (GWDSettingsNotified *notified); }; gboolean gwd_settings_notified_update_decorations (GWDSettingsNotified *notified); gboolean gwd_settings_notified_update_frames (GWDSettingsNotified *notified); gboolean gwd_settings_notified_update_metacity_theme (GWDSettingsNotified *notified); gboolean gwd_settings_notified_metacity_button_layout (GWDSettingsNotified *notified); GType gwd_settings_notified_interface_get_type (void); G_END_DECLS #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings.h0000644000015301777760000000230512321343002024336 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_SETTINGS_H #define _COMPIZ_GWD_SETTINGS_H #include #include G_BEGIN_DECLS #define GWD_TYPE_SETTINGS_IMPL (gwd_settings_impl_get_type ()) GType gwd_settings_impl_get_type (); GWDSettings * gwd_settings_impl_new (gint *blur, const gchar **metacity_theme, GWDSettingsNotified *notified); G_END_DECLS #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-metacity-window-decoration-util.c0000644000015301777760000000276212321343002030724 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include "gwd-metacity-window-decoration-util.h" gboolean gwd_metacity_window_decoration_update_meta_theme (const gchar *theme, GWDMetaThemeGetCurrentProc get_current, GWDMetaThemeSetProc set_current) { if (!theme) return FALSE; /* meta_theme_get_current seems to return the last * good theme now, so if one was already set this function * will be ineffectual, so we need to check if the theme * is obviously bad as the user intended to disable metacity * themes */ if (!strlen (theme)) return FALSE; (*set_current) (theme, TRUE); if (!(*get_current) ()) return FALSE; return TRUE; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/org.compiz.gwd.gschema.xml0000644000015301777760000000404312321343002026546 0ustar pbusernogroup00000000000000 'all' Blur Type Blur to use on titlebars - "all" for the entire frame, "titlebar" for just the titlebar and "none" for no blur 1.0 Active Opacity Opacity of active titlebars 1.0 Inactive Opacity Opacity of inactive titlebars true Active shade opacity Shade active windows with metacity theme decorations from opaque to translucent true Inactive shade opacity Shade inactive windows with metacity theme decorations from opaque to translucent 'none' Action to take on scrolling a titlebar Action to take on scrolling a titlebar - "none" for no action, "shade" to shade the window true Use metacity theme Use metacity theme when drawing window decorations false Use tooltips Show tooltip windows on decorator functions compiz-0.9.11+14.04.20140409/gtk/window-decorator/forcequit.c0000644000015301777760000001176212321343002023722 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" static char * get_client_machine (Window xwindow) { Atom atom, type; gulong nitems, bytes_after; guchar *str = NULL; int format, result; char *retval; atom = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "WM_CLIENT_MACHINE", FALSE); gdk_error_trap_push (); result = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xwindow, atom, 0, G_MAXLONG, FALSE, XA_STRING, &type, &format, &nitems, &bytes_after, &str); gdk_error_trap_pop (); if (result != Success) return NULL; if (type != XA_STRING) { XFree (str); return NULL; } retval = g_strdup ((gchar *) str); XFree (str); return retval; } static void kill_window (WnckWindow *win) { WnckApplication *app; app = wnck_window_get_application (win); if (app) { gchar buf[257], *client_machine; int pid; pid = wnck_application_get_pid (app); client_machine = get_client_machine (wnck_application_get_xid (app)); if (client_machine && pid > 0) { if (gethostname (buf, sizeof (buf) - 1) == 0) { if (strcmp (buf, client_machine) == 0) kill (pid, 9); } } if (client_machine) g_free (client_machine); } gdk_error_trap_push (); XKillClient (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), wnck_window_get_xid (win)); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop (); } static void force_quit_dialog_realize (GtkWidget *dialog, void *data) { WnckWindow *win = data; gdk_error_trap_push (); XSetTransientForHint (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), GDK_WINDOW_XID (dialog->window), wnck_window_get_xid (win)); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop (); } static void force_quit_dialog_response (GtkWidget *dialog, gint response, void *data) { WnckWindow *win = data; decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (response == GTK_RESPONSE_ACCEPT) kill_window (win); if (d->force_quit_dialog) { d->force_quit_dialog = NULL; gtk_widget_destroy (dialog); } } void show_force_quit_dialog (WnckWindow *win, Time timestamp) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); GtkWidget *dialog; gchar *str, *tmp; if (d->force_quit_dialog) return; tmp = g_markup_escape_text (wnck_window_get_name (win), -1); str = g_strdup_printf (_("The window \"%s\" is not responding."), tmp); g_free (tmp); dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, "%s\n\n%s", str, _("Forcing this application to " "quit will cause you to lose any " "unsaved changes.")); g_free (str); gtk_window_set_icon_name (GTK_WINDOW (dialog), "force-quit"); gtk_label_set_use_markup (GTK_LABEL (GTK_MESSAGE_DIALOG (dialog)->label), TRUE); gtk_label_set_line_wrap (GTK_LABEL (GTK_MESSAGE_DIALOG (dialog)->label), TRUE); gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, _("_Force Quit"), GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_REJECT); g_signal_connect (G_OBJECT (dialog), "realize", G_CALLBACK (force_quit_dialog_realize), win); g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (force_quit_dialog_response), win); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_realize (dialog); gdk_x11_window_set_user_time (dialog->window, timestamp); gtk_widget_show (dialog); d->force_quit_dialog = dialog; } void hide_force_quit_dialog (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->force_quit_dialog) { gtk_widget_destroy (d->force_quit_dialog); d->force_quit_dialog = NULL; } } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-storage-interface.h0000644000015301777760000000565512321343002027751 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_SETTINGS_STORAGE_INTERFACE_H #define _COMPIZ_GWD_SETTINGS_STORAGE_INTERFACE_H #include #include G_BEGIN_DECLS #define GWD_SETTINGS_STORAGE_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ GWD_TYPE_SETTINGS_STORAGE_INTERFACE, \ GWDSettingsStorage)) #define GWD_SETTINGS_STORAGE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE (obj, \ GWD_TYPE_SETTINGS_STORAGE_INTERFACE, \ GWDSettingsStorageInterface)) #define GWD_TYPE_SETTINGS_STORAGE_INTERFACE (gwd_settings_storage_interface_get_type ()) typedef struct _GWDSettingsStorageInterface GWDSettingsStorageInterface; struct _GWDSettingsStorageInterface { GTypeInterface parent; gboolean (*update_use_tooltips) (GWDSettingsStorage *settings); gboolean (*update_draggable_border_width) (GWDSettingsStorage *settings); gboolean (*update_attach_modal_dialogs) (GWDSettingsStorage *settings); gboolean (*update_blur) (GWDSettingsStorage *settings); gboolean (*update_metacity_theme) (GWDSettingsStorage *settings); gboolean (*update_opacity) (GWDSettingsStorage *settings); gboolean (*update_button_layout) (GWDSettingsStorage *settings); gboolean (*update_font) (GWDSettingsStorage *settings); gboolean (*update_titlebar_actions) (GWDSettingsStorage *settings); }; gboolean gwd_settings_storage_update_use_tooltips (GWDSettingsStorage *settings); gboolean gwd_settings_storage_update_draggable_border_width (GWDSettingsStorage *settings); gboolean gwd_settings_storage_update_attach_modal_dialogs (GWDSettingsStorage *settings); gboolean gwd_settings_storage_update_blur (GWDSettingsStorage *settings); gboolean gwd_settings_storage_update_metacity_theme (GWDSettingsStorage *settings); gboolean gwd_settings_storage_update_opacity (GWDSettingsStorage *settings); gboolean gwd_settings_storage_update_button_layout (GWDSettingsStorage *settings); gboolean gwd_settings_storage_update_font (GWDSettingsStorage *settings); gboolean gwd_settings_storage_update_titlebar_actions (GWDSettingsStorage *settings); GType gwd_settings_storage_interface_get_type (void); G_END_DECLS #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/decorator.c0000644000015301777760000012113512321343002023677 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" decor_frame_t * create_normal_frame (const gchar *type) { decor_frame_t *frame = decor_frame_new (type); decor_context_t _window_context = { { 0, 0, 0, 0 }, 6, 6, 4, 6, 0, 0, 0, 0 }; decor_context_t _max_window_context = { { 0, 0, 0, 0 }, 6, 6, 4, 6, 0, 0, 0, 0 }; decor_context_t _window_context_no_shadow = { { 0, 0, 0, 0 }, 6, 6, 4, 6, 0, 0, 0, 0 }; decor_context_t _max_window_context_no_shadow = { { 0, 0, 0, 0 }, 6, 6, 4, 6, 0, 0, 0, 0 }; decor_extents_t _win_extents = { 6, 6, 6, 6 }; decor_extents_t _max_win_extents = { 6, 6, 4, 6 }; frame->win_extents = _win_extents; frame->max_win_extents = _max_win_extents; frame->update_shadow = decor_frame_update_shadow; frame->window_context_active = _window_context; frame->window_context_inactive = _window_context; frame->window_context_no_shadow = _window_context_no_shadow; frame->max_window_context_active = _max_window_context; frame->max_window_context_inactive = _max_window_context; frame->max_window_context_no_shadow = _max_window_context_no_shadow; return frame; } void destroy_normal_frame (decor_frame_t *frame) { decor_frame_destroy (frame); } decor_frame_t * create_bare_frame (const gchar *type) { decor_frame_t *frame = decor_frame_new (type); decor_context_t _shadow_context = { { 0, 0, 0, 0 }, 0, 0, 0, 0, 0, 0, 0, 0, }; decor_extents_t _shadow_extents = { 0, 0, 0, 0 }; frame->win_extents = _shadow_extents; frame->max_win_extents = _shadow_extents; frame->win_extents = _shadow_extents; frame->window_context_active = _shadow_context; frame->window_context_inactive = _shadow_context; frame->window_context_no_shadow = _shadow_context; frame->max_window_context_active = _shadow_context; frame->max_window_context_inactive = _shadow_context; frame->max_window_context_no_shadow = _shadow_context; frame->update_shadow = bare_frame_update_shadow; return frame; } void destroy_bare_frame (decor_frame_t *frame) { decor_frame_destroy (frame); } /* * get_titlebar_font * * Returns: PangoFontDescription * or NULL if using system font * Description: Helper function to get the font for the titlebar */ static const PangoFontDescription * get_titlebar_font (decor_frame_t *frame) { const gchar *titlebar_font; g_object_get (settings, "titlebar-font", &titlebar_font, NULL); /* Using system font */ if (!titlebar_font) return NULL; else return frame->titlebar_font; } /* * frame_update_titlebar_font * * Returns: void * Description: updates the titlebar font from the pango context, should * be called whenever the gtk style or font has changed */ void frame_update_titlebar_font (decor_frame_t *frame) { const PangoFontDescription *font_desc; PangoFontMetrics *metrics; PangoLanguage *lang; frame = gwd_decor_frame_ref (frame); font_desc = get_titlebar_font (frame); if (!font_desc) { GtkStyle *default_style; default_style = gtk_widget_get_default_style (); font_desc = default_style->font_desc; } pango_context_set_font_description (frame->pango_context, font_desc); lang = pango_context_get_language (frame->pango_context); metrics = pango_context_get_metrics (frame->pango_context, font_desc, lang); frame->text_height = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) + pango_font_metrics_get_descent (metrics)); gwd_decor_frame_unref (frame); pango_font_metrics_unref (metrics); } void update_frames_titlebar_fonts (gpointer key, gpointer value, gpointer user_data) { frame_update_titlebar_font ((decor_frame_t *) value); } void update_titlebar_font () { gwd_frames_foreach (update_frames_titlebar_fonts, NULL); } /* * update_event_windows * * Returns: void * Description: creates small "event windows" for the buttons specified to be * on the titlebar by wnck. Note here that for the pixmap mode we create actual * X windows but in the reparenting mode this is not possible so we create event * capture boxes on the window instead. The geometry of the decoration is retrieved * with window_get_client_window_geometry and adjusted for shade. Also we * need to query the theme for what window positions are appropriate here. * * This function works on the buttons and also the small event regions that we need * in order to toggle certain actions on the window decoration (eg resize, move) * * So your window decoration might look something like this (not to scale): * * ----------------------------------------------------------- * | rtl | rt | rtr | * | --- |---------------------------------------------| --- | * | | [i][s][m] mv [_][M][X] | | * | |---------------------------------------------| | * | | | | * | rl | window contents | rr | * | | | | * | | | | * | --- |---------------------------------------------| --- | * | rbl | rb | rbr | * ----------------------------------------------------------- * * Where: * - rtl = resize top left * - rtr = resize top right * - rbl = resize bottom left * - rbr = resize bottom right * - rt = resize top * - rb = resize bottom * - rl = resize left * - rr = resize right * - mv = "grab move" area (eg titlebar) * - i = icon * - s = shade * - m = menu * - _ = minimize * - M = maximize * - X = close * * For the reparenting mode we use button_windows[i].pos and for the pixmap mode * we use buttons_windows[i].window * */ void update_event_windows (WnckWindow *win) { Display *xdisplay; decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); gint x0, y0, width, height, x, y, w, h; gint i, j, k, l; gint actions = d->actions; xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); /* Get the geometry of the client */ wnck_window_get_client_window_geometry (win, &x0, &y0, &width, &height); /* Shaded windows have no height - also skip some event windows */ if (d->state & WNCK_WINDOW_STATE_SHADED) { height = 0; k = l = 1; } else { k = 0; l = 2; } gdk_error_trap_push (); /* [rtl, ru, rtr], [rl, mv, rr], [rbl, rb, rbr] */ for (i = 0; i < 3; ++i) { static guint event_window_actions[3][3] = { { WNCK_WINDOW_ACTION_RESIZE, WNCK_WINDOW_ACTION_RESIZE, WNCK_WINDOW_ACTION_RESIZE }, { WNCK_WINDOW_ACTION_RESIZE, WNCK_WINDOW_ACTION_MOVE, WNCK_WINDOW_ACTION_RESIZE }, { WNCK_WINDOW_ACTION_RESIZE, WNCK_WINDOW_ACTION_RESIZE, WNCK_WINDOW_ACTION_RESIZE } }; for (j = 0; j < 3; ++j) { w = 0; h = 0; if (actions & event_window_actions[i][j] && i >= k && i <= l) (*theme_get_event_window_position) (d, i, j, width, height, &x, &y, &w, &h); /* Reparenting mode - create boxes which we monitor motionnotify on */ if (d->frame_window) { BoxPtr box = &d->event_windows[i][j].pos; box->x1 = x; box->x2 = x + w; box->y1 = y; box->y2 = y + h; } /* Pixmap mode with window geometry - create small event windows */ else if (!d->frame_window && w != 0 && h != 0) { XMapWindow (xdisplay, d->event_windows[i][j].window); XMoveResizeWindow (xdisplay, d->event_windows[i][j].window, x, y, w, h); } /* No parent and no geometry - unmap all event windows */ else if (!d->frame_window) { XUnmapWindow (xdisplay, d->event_windows[i][j].window); } } } /* no button event windows if width is less than minimum width */ if (width < ICON_SPACE + d->button_width) actions = 0; /* Above, stick, unshade and unstick are only available in wnck => 2.18.1 */ for (i = 0; i < BUTTON_NUM; ++i) { static guint button_actions[BUTTON_NUM] = { WNCK_WINDOW_ACTION_CLOSE, WNCK_WINDOW_ACTION_MAXIMIZE, WNCK_WINDOW_ACTION_MINIMIZE, 0, WNCK_WINDOW_ACTION_SHADE, #ifdef HAVE_LIBWNCK_2_18_1 WNCK_WINDOW_ACTION_ABOVE, WNCK_WINDOW_ACTION_STICK, WNCK_WINDOW_ACTION_UNSHADE, WNCK_WINDOW_ACTION_ABOVE, WNCK_WINDOW_ACTION_UNSTICK #else 0, 0, 0, 0, 0 #endif }; /* Reparenting mode - if a box was set and we no longer need it reset its geometry */ if (d->frame_window && button_actions[i] && !(actions & button_actions[i])) { memset (&d->button_windows[i].pos, 0, sizeof (Box)); } /* Pixmap mode - if a box was set and we no longer need it unmap its window */ else if (!d->frame_window && button_actions[i] && !(actions & button_actions[i])) { XUnmapWindow (xdisplay, d->button_windows[i].window); continue; } /* Reparenting mode - if there is a button position for this * button then set the geometry */ if (d->frame_window && (*theme_get_button_position) (d, i, width, height, &x, &y, &w, &h)) { BoxPtr box = &d->button_windows[i].pos; box->x1 = x; box->y1 = y; box->x2 = x + w; box->y2 = y + h; } /* Pixmap mode - if there is a button position for this button then map the window * and resize it to this position */ else if (!d->frame_window && (*theme_get_button_position) (d, i, width, height, &x, &y, &w, &h)) { Window win = d->button_windows[i].window; XMapWindow (xdisplay, win); XMoveResizeWindow (xdisplay, win, x, y, w, h); } else if (!d->frame_window) { XUnmapWindow (xdisplay, d->button_windows[i].window); } } gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop (); } /* * wnck_window_get_real_name * * Returns: const char * or NULL * Description: Wrapper function to either get the name of the window or * return NULL */ #ifdef HAVE_WNCK_WINDOW_HAS_NAME static const char * wnck_window_get_real_name (WnckWindow *win) { return wnck_window_has_name (win) ? wnck_window_get_name (win) : NULL; } #define wnck_window_get_name wnck_window_get_real_name #endif /* * max_window_name_width * * Returns: gint * Description: Calculate the width of the decoration required to display * the window name using pango (with 6px padding) * Returns zero if window has no name. */ gint max_window_name_width (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); const gchar *name; gint w; /* Ensure that a layout is created */ if (!d->layout) { d->layout = pango_layout_new (d->frame->pango_context); if (!d->layout) return 0; pango_layout_set_wrap (d->layout, PANGO_WRAP_CHAR); } /* Return zero if window has no name */ name = wnck_window_get_name (win); if (!name) return 0; /* Reset the width, set hte text and get the size required */ pango_layout_set_auto_dir (d->layout, FALSE); pango_layout_set_width (d->layout, -1); pango_layout_set_text (d->layout, name, strlen (name)); pango_layout_get_pixel_size (d->layout, &w, NULL); if (d->name) pango_layout_set_text (d->layout, d->name, strlen (d->name)); return w + 6; } /* * update_window_decoration_name * * Returns: void * Description: frees the last window name and gets the new one from * wnck. Also checks to see if the name has a length (slight optimization) * and re-creates the pango context to re-render the name */ void update_window_decoration_name (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); const gchar *name; glong name_length; PangoLayoutLine *line; if (d->name) { g_free (d->name); d->name = NULL; } /* Only operate if the window name has a length */ name = wnck_window_get_name (win); if (name && (name_length = strlen (name))) { gint w; /* Cairo mode: w = SHRT_MAX */ if (theme_draw_window_decoration != draw_window_decoration) { w = SHRT_MAX; } /* Need to get a minimum width for the name */ else { gint width; wnck_window_get_client_window_geometry (win, NULL, NULL, &width, NULL); w = width - ICON_SPACE - 2 - d->button_width; if (w < 1) w = 1; } /* Set the maximum width for the layout (in case * decoration size < text width) since we * still need to show the buttons and the window name */ pango_layout_set_auto_dir (d->layout, FALSE); pango_layout_set_width (d->layout, w * PANGO_SCALE); pango_layout_set_text (d->layout, name, name_length); line = pango_layout_get_line (d->layout, 0); name_length = line->length; if (pango_layout_get_line_count (d->layout) > 1) { if (name_length < 4) { pango_layout_set_text (d->layout, NULL, 0); return; } d->name = g_strndup (name, name_length); strcpy (d->name + name_length - 3, "..."); } else d->name = g_strndup (name, name_length); /* Truncate the text */ pango_layout_set_text (d->layout, d->name, name_length); } } /* * update_window_decoration_icon * * Updates the window icon (destroys the existing cairo pattern * and creates a new one for the pixmap) */ void update_window_decoration_icon (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); /* Destroy old stuff */ if (d->icon) { cairo_pattern_destroy (d->icon); d->icon = NULL; } if (d->icon_pixmap) { g_object_unref (G_OBJECT (d->icon_pixmap)); d->icon_pixmap = NULL; } if (d->icon_pixbuf) g_object_unref (G_OBJECT (d->icon_pixbuf)); /* Get the mini icon pixbuf from libwnck */ d->icon_pixbuf = wnck_window_get_mini_icon (win); if (d->icon_pixbuf) { cairo_t *cr; g_object_ref (G_OBJECT (d->icon_pixbuf)); /* 32 bit pixmap on pixmap mode, 24 for reparenting */ if (d->frame_window) d->icon_pixmap = pixmap_new_from_pixbuf (d->icon_pixbuf, d->frame->style_window_rgb); else d->icon_pixmap = pixmap_new_from_pixbuf (d->icon_pixbuf, d->frame->style_window_rgba); cr = gdk_cairo_create (GDK_DRAWABLE (d->icon_pixmap)); d->icon = cairo_pattern_create_for_surface (cairo_get_target (cr)); cairo_destroy (cr); } } /* * request_update_window_decoration_size * Description: asks the rendering process to allow a size update * for pixmap synchronization */ gboolean request_update_window_decoration_size (WnckWindow *win) { decor_t *d; gint width, height; gint x, y, w, h, name_width; if (win == NULL) return FALSE; d = g_object_get_data (G_OBJECT (win), "decor"); if (!d->decorated) return FALSE; /* Get the geometry of the window, we'll need it later */ wnck_window_get_client_window_geometry (win, &x, &y, &w, &h); /* Get the width of the name */ name_width = max_window_name_width (win); /* Ask the theme to tell us how much space it needs. If this is not successful * update the decoration name and return false */ if (!(*theme_calc_decoration_size) (d, w, h, name_width, &width, &height)) { update_window_decoration_name (win); return FALSE; } d->width = width; d->height = height; decor_post_pending (gdk_x11_display_get_xdisplay (gdk_display_get_default ()), wnck_window_get_xid (win), populate_frame_type (d), populate_frame_state (d), populate_frame_actions (d)); return TRUE; } /* * update_window_decoration_size * Returns: FALSE for failure, TRUE for success * Description: Calculates the minimum size of the decoration that we need * to render. This is mostly done by the theme but there is some work that * we need to do here first, such as getting the client geometry, setting * drawable depths, creating pixmaps, creating XRenderPictures and * updating the window decoration name */ gboolean update_window_decoration_size (WnckWindow *win) { decor_t *d; GdkPixmap *pixmap, *buffer_pixmap = NULL; Picture picture; Display *xdisplay; XRenderPictFormat *format; if (win == NULL) return FALSE; d = g_object_get_data (G_OBJECT (win), "decor"); if (!d->decorated) return FALSE; xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); gdk_error_trap_push (); /* Get the correct depth for the frame window in reparenting mode, otherwise * enforce 32 */ if (d->frame_window) pixmap = create_native_pixmap_and_wrap (d->width, d->height, d->frame->style_window_rgb); else pixmap = create_native_pixmap_and_wrap (d->width, d->height, d->frame->style_window_rgba); gdk_flush (); /* Handle failure */ if (!pixmap || gdk_error_trap_pop ()) { memset (pixmap, 0, sizeof (*pixmap)); return FALSE; } gdk_error_trap_push (); if (d->frame_window) buffer_pixmap = create_pixmap (d->width, d->height, d->frame->style_window_rgb); else buffer_pixmap = create_pixmap (d->width, d->height, d->frame->style_window_rgba); gdk_flush (); /* Handle failure */ if (!buffer_pixmap || gdk_error_trap_pop ()) { memset (buffer_pixmap, 0, sizeof (*buffer_pixmap)); g_object_unref (G_OBJECT (pixmap)); return FALSE; } /* Create XRender context */ format = get_format_for_drawable (d, GDK_DRAWABLE (buffer_pixmap)); picture = XRenderCreatePicture (xdisplay, GDK_PIXMAP_XID (buffer_pixmap), format, 0, NULL); /* Destroy the old pixmaps and pictures */ if (d->pixmap) g_object_unref (d->pixmap); if (d->x11Pixmap) decor_post_delete_pixmap (xdisplay, wnck_window_get_xid (d->win), d->x11Pixmap); if (d->buffer_pixmap) g_object_unref (G_OBJECT (d->buffer_pixmap)); if (d->picture) XRenderFreePicture (xdisplay, d->picture); if (d->cr) cairo_destroy (d->cr); /* Assign new pixmaps and pictures */ d->pixmap = pixmap; d->x11Pixmap = GDK_PIXMAP_XID (d->pixmap); d->buffer_pixmap = buffer_pixmap; d->cr = gdk_cairo_create (pixmap); d->picture = picture; d->prop_xid = wnck_window_get_xid (win); update_window_decoration_name (win); /* Redraw decoration on idle */ queue_decor_draw (d); return TRUE; } /* to save some memory, value is specific to current decorations */ #define TRANSLUCENT_CORNER_SIZE 3 /* * draw_border_shape * Returns: void * Description: Draws a slight border around the decoration */ static void draw_border_shape (Display *xdisplay, Pixmap pixmap, Picture picture, int width, int height, decor_context_t *c, void *closure) { static XRenderColor white = { 0xffff, 0xffff, 0xffff, 0xffff }; GdkColormap *colormap; decor_t d; decor_shadow_info_t *info = (decor_shadow_info_t *) closure; double save_decoration_alpha; memset (&d, 0, sizeof (d)); if (info) { gwd_decor_frame_ref (info->frame); d.frame = info->frame; d.state = info->state; d.actions = info->active; } else { d.frame = gwd_get_decor_frame ("normal"); d.state = 0; d.active = TRUE; } d.pixmap = gdk_pixmap_foreign_new_for_display (gdk_display_get_default (), pixmap); d.width = width; d.height = height; d.active = TRUE; d.draw = theme_draw_window_decoration; d.picture = picture; d.context = c; /* we use closure argument if maximized */ if (info) d.state = info->state; else d.state = 0; decor_get_default_layout (c, 1, 1, &d.border_layout); colormap = get_colormap_for_drawable (GDK_DRAWABLE (d.pixmap)); gdk_drawable_set_colormap (d.pixmap, colormap); /* create shadow from opaque decoration * FIXME: Should not modify settings value * like this */ save_decoration_alpha = decoration_alpha; decoration_alpha = 1.0; (*d.draw) (&d); decoration_alpha = save_decoration_alpha; XRenderFillRectangle (xdisplay, PictOpSrc, picture, &white, c->left_space, c->top_space, width - c->left_space - c->right_space, height - c->top_space - c->bottom_space); if (!info) gwd_decor_frame_unref (d.frame); g_object_unref (G_OBJECT (d.pixmap)); } /* * update_shadow * Returns: 1 for success, 0 for failure * Description: creates a libdecoration shadow context and updates * the decoration context for the shadow for the properties that we * have already read from the root window. * * For the pixmap mode we have opt_shadow which is passed to * decor_shadow_create (which contains the shadow settings from * the root window) * * For the reparenting mode we always enforce a zero-shadow in * the opt_no_shadow passed to decor_shadow_create. * * We do something similar for the maximimzed mode as well */ void bare_frame_update_shadow (Display *xdisplay, Screen *screen, decor_frame_t *frame, decor_shadow_t **shadow_normal, decor_context_t *context_normal, decor_shadow_t **shadow_max, decor_context_t *context_max, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow) { if (frame->border_shadow_active) { decor_shadow_destroy (xdisplay, frame->border_shadow_active); frame->border_shadow_active = NULL; } frame->border_shadow_active = decor_shadow_create (xdisplay, screen, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, opt_shadow, &frame->window_context_active, decor_draw_simple, NULL); } void switcher_frame_update_shadow (Display *xdisplay, Screen *screen, decor_frame_t *frame, decor_shadow_t **shadow_normal, decor_context_t *context_normal, decor_shadow_t **shadow_max, decor_context_t *context_max, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow) { if (frame->border_shadow_active) { decor_shadow_destroy (xdisplay, frame->border_shadow_active); frame->border_shadow_active = NULL; } frame->border_shadow_active = decor_shadow_create (xdisplay, screen, 1, 1, frame->win_extents.left, frame->win_extents.right, frame->win_extents.top, frame->win_extents.bottom, frame->win_extents.left - TRANSLUCENT_CORNER_SIZE, frame->win_extents.right - TRANSLUCENT_CORNER_SIZE, frame->win_extents.top - TRANSLUCENT_CORNER_SIZE, frame->win_extents.bottom - TRANSLUCENT_CORNER_SIZE, opt_shadow, &frame->window_context_active, decor_draw_simple, NULL); } void decor_frame_update_shadow (Display *xdisplay, Screen *screen, decor_frame_t *frame, decor_shadow_t **shadow_normal, decor_context_t *context_normal, decor_shadow_t **shadow_max, decor_context_t *context_max, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow) { if (*shadow_normal) { decor_shadow_destroy (xdisplay, *shadow_normal); *shadow_normal = NULL; } /* * Warning: decor_shadow_create does more than return a decor_shadow_t* * It also has to be called to populate the context parameter * (third last parameter). So even if you don't want a shadow * then you still need to call decor_shadow_create :( */ *shadow_normal = decor_shadow_create (xdisplay, screen, 1, 1, frame->win_extents.left, frame->win_extents.right, frame->win_extents.top + frame->titlebar_height, frame->win_extents.bottom, frame->win_extents.left - TRANSLUCENT_CORNER_SIZE, frame->win_extents.right - TRANSLUCENT_CORNER_SIZE, frame->win_extents.top + frame->titlebar_height - TRANSLUCENT_CORNER_SIZE, frame->win_extents.bottom - TRANSLUCENT_CORNER_SIZE, opt_shadow, context_normal, draw_border_shape, (void *) info); /* Maximized border shadow pixmap mode */ if (*shadow_max) { decor_shadow_destroy (xdisplay, *shadow_max); *shadow_max = NULL; } info->state = (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY); *shadow_max = decor_shadow_create (xdisplay, screen, 1, 1, frame->max_win_extents.left, frame->max_win_extents.right, frame->max_win_extents.top + frame->max_titlebar_height, frame->max_win_extents.bottom, frame->max_win_extents.left - TRANSLUCENT_CORNER_SIZE, frame->max_win_extents.right - TRANSLUCENT_CORNER_SIZE, frame->max_win_extents.top + frame->max_titlebar_height - TRANSLUCENT_CORNER_SIZE, frame->max_win_extents.bottom - TRANSLUCENT_CORNER_SIZE, opt_no_shadow, /* No shadow when maximized */ context_max, draw_border_shape, (void *) info); /* Reset info->state */ info->state = 0; } typedef struct _tdtd_shadow_options { decor_shadow_options_t *active_shadow; decor_shadow_options_t *inactive_shadow; } tdtd_shadow_options_t; void frame_update_shadow (decor_frame_t *frame, decor_shadow_info_t *info, decor_shadow_options_t *opt_active_shadow, decor_shadow_options_t *opt_inactive_shadow) { static decor_shadow_options_t no_shadow = {0.0, 0.0, {0, 0, 0}, 0, 0}; gwd_decor_frame_ref (frame); info->active = TRUE; (*frame->update_shadow) (gdk_x11_get_default_xdisplay (), gdk_x11_screen_get_xscreen (gdk_screen_get_default ()), frame, &frame->border_shadow_active, &frame->window_context_active, &frame->max_border_shadow_active, &frame->max_window_context_active, info, opt_active_shadow, &no_shadow); info->active = FALSE; (*frame->update_shadow) (gdk_x11_get_default_xdisplay (), gdk_x11_screen_get_xscreen (gdk_screen_get_default ()), frame, &frame->border_shadow_inactive, &frame->window_context_inactive, &frame->max_border_shadow_inactive, &frame->max_window_context_inactive, info, opt_inactive_shadow, &no_shadow); gwd_decor_frame_unref (frame); } void update_frames_shadows (gpointer key, gpointer value, gpointer user_data) { decor_frame_t *frame = (decor_frame_t *) value; tdtd_shadow_options_t *opts; decor_shadow_options_t active_o, inactive_o; opts = malloc (sizeof (tdtd_shadow_options_t)); if (!opts) return; opts->active_shadow = &active_o; opts->inactive_shadow = &inactive_o; (*theme_get_shadow) (frame, opts->active_shadow, TRUE); (*theme_get_shadow) (frame, opts->inactive_shadow, FALSE); gwd_decor_frame_ref (frame); decor_shadow_info_t *info = malloc (sizeof (decor_shadow_info_t)); if (!info) { free (opts); return; } info->frame = frame; info->state = 0; frame_update_shadow (frame, info, opts->active_shadow, opts->inactive_shadow); gwd_decor_frame_unref (frame); free (info); info = NULL; free (opts); opts = NULL; } static void get_shadow_common (decor_frame_t *d, decor_shadow_options_t *opts, gboolean active) { decor_shadow_options_t *setting_opts = NULL; if (active) g_object_get (settings, "active-shadow", &setting_opts, NULL); else g_object_get (settings, "inactive-shadow", &setting_opts, NULL); if (setting_opts) { memcpy (opts, setting_opts, sizeof (decor_shadow_options_t)); } } void cairo_get_shadow (decor_frame_t *frame, decor_shadow_options_t *opts, gboolean active) { get_shadow_common (frame, opts, active); } void meta_get_shadow (decor_frame_t *frame, decor_shadow_options_t *opts, gboolean active) { get_shadow_common (frame, opts, active); } int update_shadow (void) { gwd_frames_foreach (update_frames_shadows, NULL); return 1; } /* * populate_type * * Returns: void * Description: Sets the window type flags for compiz to know what window type * this decoration is for * */ unsigned int populate_frame_type (decor_t *d) { /* FIXME: This would be nicer if Wnck actually worked here, * but for now we need to use that frame string since that's * the only way we can get the modal_dialog type */ const unsigned int n_type_strings = 5; unsigned int frame_type = 0; unsigned int i; struct typestrings { const char *type; unsigned int flag; } type_strings[] = { {"normal", DECOR_WINDOW_TYPE_NORMAL }, {"dialog", DECOR_WINDOW_TYPE_DIALOG }, {"modal_dialog", DECOR_WINDOW_TYPE_MODAL_DIALOG }, {"menu", DECOR_WINDOW_TYPE_MENU }, {"utility", DECOR_WINDOW_TYPE_UTILITY} }; for (i = 0; i < n_type_strings; ++i) { if (strcmp (d->frame->type, type_strings[i].type) == 0) frame_type |= type_strings[i].flag; } return frame_type; } /* * populate_state * * Returns void * Description: Sets the window state flags for compiz to know what state of * window this decoration is for */ unsigned int populate_frame_state (decor_t *d) { unsigned int frame_state = 0; WnckWindowState win_state; const unsigned int n_state_bits = 3; unsigned int i; if (d->active) frame_state |= DECOR_WINDOW_STATE_FOCUS; struct typestrings { unsigned int wnck_flag; unsigned int decor_flag; } state_bits[] = { { WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY, DECOR_WINDOW_STATE_MAXIMIZED_VERT }, { WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY, DECOR_WINDOW_STATE_MAXIMIZED_HORZ }, { WNCK_WINDOW_STATE_SHADED, DECOR_WINDOW_STATE_SHADED } }; /* Not possible to match further than active or not if there is * no window but FIXME we might want to do that later down the line */ if (!d->win) return frame_state == 0; win_state = wnck_window_get_state (d->win); for (i = 0; i < n_state_bits; ++i) { if (win_state & state_bits[i].wnck_flag) frame_state |= state_bits[i].decor_flag; } return frame_state; } /* * populate_actions * * Returns void * Description: Sets the window actions flags for compiz to know what state of * window this decoration is for */ unsigned int populate_frame_actions (decor_t *d) { unsigned int frame_actions = 0; if (!d->win) return frame_actions; WnckWindowActions win_actions = wnck_window_get_actions (d->win); const unsigned int n_action_bits = 16; unsigned int i; struct typestrings { unsigned int decor_flag; unsigned int wnck_flag; } action_bits[] = { { DECOR_WINDOW_ACTION_RESIZE_HORZ, WNCK_WINDOW_ACTION_RESIZE }, { DECOR_WINDOW_ACTION_RESIZE_VERT, WNCK_WINDOW_ACTION_RESIZE }, { DECOR_WINDOW_ACTION_CLOSE, WNCK_WINDOW_ACTION_CLOSE }, { DECOR_WINDOW_ACTION_MINIMIZE, WNCK_WINDOW_ACTION_MINIMIZE }, { DECOR_WINDOW_ACTION_UNMINIMIZE, WNCK_WINDOW_ACTION_UNMINIMIZE }, { DECOR_WINDOW_ACTION_MAXIMIZE_HORZ, WNCK_WINDOW_ACTION_MAXIMIZE_HORIZONTALLY }, { DECOR_WINDOW_ACTION_MAXIMIZE_VERT, WNCK_WINDOW_ACTION_MAXIMIZE_VERTICALLY }, { DECOR_WINDOW_ACTION_UNMAXIMIZE_HORZ, WNCK_WINDOW_ACTION_UNMAXIMIZE_HORIZONTALLY }, { DECOR_WINDOW_ACTION_UNMAXIMIZE_VERT, WNCK_WINDOW_ACTION_UNMAXIMIZE_VERTICALLY }, { DECOR_WINDOW_ACTION_SHADE, WNCK_WINDOW_ACTION_SHADE }, { DECOR_WINDOW_ACTION_UNSHADE, WNCK_WINDOW_ACTION_UNSHADE }, { DECOR_WINDOW_ACTION_STICK, WNCK_WINDOW_ACTION_STICK }, { DECOR_WINDOW_ACTION_UNSTICK, WNCK_WINDOW_ACTION_UNSTICK }, { DECOR_WINDOW_ACTION_FULLSCREEN, WNCK_WINDOW_ACTION_FULLSCREEN }, { DECOR_WINDOW_ACTION_ABOVE, WNCK_WINDOW_ACTION_ABOVE }, { DECOR_WINDOW_ACTION_BELOW, WNCK_WINDOW_ACTION_BELOW }, }; for (i = 0; i < n_action_bits; ++i) { if (win_actions & action_bits[i].wnck_flag) frame_actions |= action_bits[i].decor_flag; } return frame_actions; } /* * update_window_decoration * * Returns: void * Description: The master function to update the window decoration * if the pixmap needs to be redrawn */ void update_window_decoration (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { /* force size update */ d->context = NULL; d->width = d->height = 0; request_update_window_decoration_size (win); update_event_windows (win); } } /* * update_window_decoration_state * * Returns: void * Description: helper function to update the state of the decor_t */ void update_window_decoration_state (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); d->state = wnck_window_get_state (win); } /* * update_window_decoration_actions * * Returns: void * Description: helper function to update the actions of the decor_t */ void update_window_decoration_actions (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); d->actions = wnck_window_get_actions (win); } /* * draw_decor_list * * Returns: bool * Description: function to be called on g_idle_add to draw window * decorations when we are not doing anything */ static gboolean draw_decor_list (void *data) { GSList *list; decor_t *d; draw_idle_id = 0; for (list = draw_list; list; list = list->next) { d = (decor_t *) list->data; (*d->draw) (d); } g_slist_free (draw_list); draw_list = NULL; return FALSE; } /* * queue_decor_draw * * Description :queue a redraw request for this decoration. Since this function * only gets called on idle, don't redraw window decorations multiple * times if they are already waiting to be drawn (since the drawn copy * will always be the most updated one) */ void queue_decor_draw (decor_t *d) { if (g_slist_find (draw_list, d)) return; draw_list = g_slist_append (draw_list, d); if (!draw_idle_id) draw_idle_id = g_idle_add (draw_decor_list, NULL); } /* * update_default_decorations * * Description: update the default decorations */ void update_default_decorations (GdkScreen *screen) { long *data; Window xroot; GdkDisplay *gdkdisplay = gdk_display_get_default (); Display *xdisplay = gdk_x11_display_get_xdisplay (gdkdisplay); Atom bareAtom, activeAtom; decor_frame_t *frame; decor_frame_t *bare_frame = gwd_get_decor_frame ("bare"); decor_extents_t extents; unsigned int i; xroot = RootWindowOfScreen (gdk_x11_screen_get_xscreen (screen)); bareAtom = XInternAtom (xdisplay, DECOR_BARE_ATOM_NAME, FALSE); activeAtom = XInternAtom (xdisplay, DECOR_ACTIVE_ATOM_NAME, FALSE); if (bare_frame->border_shadow_active) { decor_layout_t layout; unsigned int frame_type = 0; unsigned int frame_state = 0; unsigned int frame_actions = 0; unsigned int nQuad; decor_quad_t quads[N_QUADS_MAX]; long *data = decor_alloc_property (1, WINDOW_DECORATION_TYPE_PIXMAP); decor_get_default_layout (&bare_frame->window_context_active, 1, 1, &layout); nQuad = decor_set_lSrStSbS_window_quads (quads, &bare_frame->window_context_active, &layout); decor_quads_to_property (data, 0, bare_frame->border_shadow_active->pixmap, &bare_frame->win_extents, &bare_frame->win_extents, &bare_frame->win_extents, &bare_frame->win_extents, 0, 0, quads, nQuad, frame_type, frame_state, frame_actions); XChangeProperty (xdisplay, xroot, bareAtom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); if (minimal) { XChangeProperty (xdisplay, xroot, activeAtom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); } free (data); } else { XDeleteProperty (xdisplay, xroot, bareAtom); if (minimal) { XDeleteProperty (xdisplay, xroot, activeAtom); } } if (minimal) { gwd_decor_frame_unref (bare_frame); return; } XDeleteProperty (xdisplay, xroot, activeAtom); data = decor_alloc_property (WINDOW_TYPE_FRAMES_NUM * 2, WINDOW_DECORATION_TYPE_PIXMAP); /* All active states and all inactive states */ for (i = 0; i < WINDOW_TYPE_FRAMES_NUM * 2; ++i) { frame = gwd_get_decor_frame (default_frames[i].name); extents = frame->win_extents; if (default_frames[i].d) { if (default_frames[i].d->pixmap) g_object_unref (G_OBJECT (default_frames[i].d->pixmap)); free (default_frames[i].d); } default_frames[i].d = calloc (1, sizeof (decor_t)); default_frames[i].d->context = i < WINDOW_TYPE_FRAMES_NUM ? &frame->window_context_active : &frame->window_context_inactive; default_frames[i].d->shadow = i < WINDOW_TYPE_FRAMES_NUM ? frame->border_shadow_active : frame->border_shadow_inactive; default_frames[i].d->layout = pango_layout_new (frame->pango_context); decor_get_default_layout (default_frames[i].d->context, 1, 1, &default_frames[i].d->border_layout); default_frames[i].d->width = default_frames[i].d->border_layout.width; default_frames[i].d->height = default_frames[i].d->border_layout.height; default_frames[i].d->frame = frame; default_frames[i].d->active = i < WINDOW_TYPE_FRAMES_NUM ? TRUE : FALSE; extents.top += frame->titlebar_height; default_frames[i].d->draw = theme_draw_window_decoration; default_frames[i].d->pixmap = create_native_pixmap_and_wrap (default_frames[i].d->width, default_frames[i].d->height, frame->style_window_rgba); unsigned int j, k; for (j = 0; j < 3; ++j) { for (k = 0; k < 3; k++) { default_frames[i].d->event_windows[j][k].window = None; } } for (j = 0; j < BUTTON_NUM; ++j) { default_frames[i].d->button_windows[j].window = None; default_frames[i].d->button_states[j] = 0; } if (default_frames[i].d->pixmap) { gint nQuad; unsigned int frame_type = populate_frame_type (default_frames[i].d); unsigned int frame_state = populate_frame_state (default_frames[i].d); unsigned int frame_actions = populate_frame_actions (default_frames[i].d); decor_quad_t quads[N_QUADS_MAX]; nQuad = decor_set_lSrStSbS_window_quads (quads, default_frames[i].d->context, &default_frames[i].d->border_layout); default_frames[i].d->picture = XRenderCreatePicture (xdisplay, GDK_PIXMAP_XID (default_frames[i].d->pixmap), xformat_rgba, 0, NULL); (*default_frames[i].d->draw) (default_frames[i].d); decor_quads_to_property (data, i, GDK_PIXMAP_XID (default_frames[i].d->pixmap), &extents, &extents, &extents, &extents, 0, 0, quads, nQuad, frame_type, frame_state, frame_actions); } gwd_decor_frame_unref (frame); } XChangeProperty (xdisplay, xroot, activeAtom, XA_INTEGER, 32, PropModeAppend, (guchar *) data, PROP_HEADER_SIZE + (WINDOW_TYPE_FRAMES_NUM * 2) * (BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX)); free (data); gwd_decor_frame_unref (bare_frame); } /* * copy_to_front_buffer * * Description: Helper function to copy the buffer pixmap to a front buffer */ void copy_to_front_buffer (decor_t *d) { if (!d->buffer_pixmap) return; cairo_set_operator (d->cr, CAIRO_OPERATOR_SOURCE); gdk_cairo_set_source_pixmap (d->cr, d->buffer_pixmap, 0, 0); cairo_paint (d->cr); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/metacity.c0000644000015301777760000013072512321343002023541 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" #ifdef USE_METACITY static void decor_update_meta_window_property (decor_t *d, MetaTheme *theme, MetaFrameFlags flags, Region top, Region bottom, Region left, Region right) { long *data; Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); gint nQuad; decor_extents_t win_extents, frame_win_extents; decor_extents_t max_win_extents, frame_max_win_extents; decor_quad_t quads[N_QUADS_MAX]; unsigned int nOffset = 1; unsigned int frame_type = populate_frame_type (d); unsigned int frame_state = populate_frame_state (d); unsigned int frame_actions = populate_frame_actions (d); gint w, lh, rh; gint top_stretch_offset; gint bottom_stretch_offset; gint left_stretch_offset; gint right_stretch_offset; gint mutter_draggable_border_width = 0; win_extents = frame_win_extents = d->frame->win_extents; max_win_extents = frame_max_win_extents = d->frame->max_win_extents; g_object_get (settings, "draggable-border-width", &mutter_draggable_border_width, NULL); /* Add the invisible grab area padding, but only for * pixmap type decorations */ if (!d->frame_window) { if (flags & META_FRAME_ALLOWS_HORIZONTAL_RESIZE) { frame_win_extents.left += mutter_draggable_border_width; frame_win_extents.right += mutter_draggable_border_width; frame_max_win_extents.left += mutter_draggable_border_width; frame_max_win_extents.right += mutter_draggable_border_width; } if (flags & META_FRAME_ALLOWS_VERTICAL_RESIZE) { frame_win_extents.bottom += mutter_draggable_border_width; frame_win_extents.top += mutter_draggable_border_width; frame_max_win_extents.bottom += mutter_draggable_border_width; frame_max_win_extents.top += mutter_draggable_border_width; } } w = d->border_layout.top.x2 - d->border_layout.top.x1 - d->context->left_space - d->context->right_space; if (d->border_layout.rotation) lh = d->border_layout.left.x2 - d->border_layout.left.x1; else lh = d->border_layout.left.y2 - d->border_layout.left.y1; if (d->border_layout.rotation) rh = d->border_layout.right.x2 - d->border_layout.right.x1; else rh = d->border_layout.right.y2 - d->border_layout.right.y1; left_stretch_offset = lh / 2; right_stretch_offset = rh / 2; top_stretch_offset = w - d->button_width - 1; bottom_stretch_offset = (d->border_layout.bottom.x2 - d->border_layout.bottom.x1 - d->context->left_space - d->context->right_space) / 2; nQuad = decor_set_lXrXtXbX_window_quads (quads, d->context, &d->border_layout, left_stretch_offset, right_stretch_offset, top_stretch_offset, bottom_stretch_offset); win_extents.top += d->frame->titlebar_height; frame_win_extents.top += d->frame->titlebar_height; max_win_extents.top += d->frame->max_titlebar_height; frame_max_win_extents.top += d->frame->max_titlebar_height; if (d->frame_window) { data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_WINDOW); decor_gen_window_property (data, nOffset - 1, &win_extents, &max_win_extents, 20, 20, frame_type, frame_state, frame_actions); } else { data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_PIXMAP); decor_quads_to_property (data, nOffset - 1, GDK_PIXMAP_XID (d->pixmap), &frame_win_extents, &win_extents, &frame_max_win_extents, &max_win_extents, ICON_SPACE + d->button_width, 0, quads, nQuad, frame_type, frame_state, frame_actions); } gdk_error_trap_push (); XChangeProperty (xdisplay, d->prop_xid, win_decor_atom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop (); free (data); decor_update_blur_property (d, w, lh, top, top_stretch_offset, bottom, bottom_stretch_offset, left, left_stretch_offset, right, right_stretch_offset); } static void meta_get_corner_radius (const MetaFrameGeometry *fgeom, int *top_left_radius, int *top_right_radius, int *bottom_left_radius, int *bottom_right_radius) { #ifdef HAVE_METACITY_2_17_0 *top_left_radius = fgeom->top_left_corner_rounded_radius; *top_right_radius = fgeom->top_right_corner_rounded_radius; *bottom_left_radius = fgeom->bottom_left_corner_rounded_radius; *bottom_right_radius = fgeom->bottom_right_corner_rounded_radius; #else *top_left_radius = fgeom->top_left_corner_rounded ? 5 : 0; *top_right_radius = fgeom->top_right_corner_rounded ? 5 : 0; *bottom_left_radius = fgeom->bottom_left_corner_rounded ? 5 : 0; *bottom_right_radius = fgeom->bottom_right_corner_rounded ? 5 : 0; #endif } static int radius_to_width (int radius, int i) { float r1 = sqrt (radius) + radius; float r2 = r1 * r1 - (r1 - (i + 0.5)) * (r1 - (i + 0.5)); return floor (0.5f + r1 - sqrt (r2)); } static Region meta_get_top_border_region (const MetaFrameGeometry *fgeom, int width) { Region corners_xregion, border_xregion; XRectangle xrect; int top_left_radius; int top_right_radius; int bottom_left_radius; int bottom_right_radius; int w, i; corners_xregion = XCreateRegion (); meta_get_corner_radius (fgeom, &top_left_radius, &top_right_radius, &bottom_left_radius, &bottom_right_radius); if (top_left_radius) { for (i = 0; i < top_left_radius; ++i) { w = radius_to_width (top_left_radius, i); xrect.x = 0; xrect.y = i; xrect.width = w; xrect.height = 1; XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion); } } if (top_right_radius) { for (i = 0; i < top_right_radius; ++i) { w = radius_to_width (top_right_radius, i); xrect.x = width - w; xrect.y = i; xrect.width = w; xrect.height = 1; XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion); } } border_xregion = XCreateRegion (); xrect.x = 0; xrect.y = 0; xrect.width = width; xrect.height = fgeom->top_height; XUnionRectWithRegion (&xrect, border_xregion, border_xregion); XSubtractRegion (border_xregion, corners_xregion, border_xregion); XDestroyRegion (corners_xregion); return border_xregion; } static Region meta_get_bottom_border_region (const MetaFrameGeometry *fgeom, int width) { Region corners_xregion, border_xregion; XRectangle xrect; int top_left_radius; int top_right_radius; int bottom_left_radius; int bottom_right_radius; int w, i; corners_xregion = XCreateRegion (); meta_get_corner_radius (fgeom, &top_left_radius, &top_right_radius, &bottom_left_radius, &bottom_right_radius); if (bottom_left_radius) { for (i = 0; i < bottom_left_radius; ++i) { w = radius_to_width (bottom_left_radius, i); xrect.x = 0; xrect.y = fgeom->bottom_height - i - 1; xrect.width = w; xrect.height = 1; XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion); } } if (bottom_right_radius) { for (i = 0; i < bottom_right_radius; ++i) { w = radius_to_width (bottom_right_radius, i); xrect.x = width - w; xrect.y = fgeom->bottom_height - i - 1; xrect.width = w; xrect.height = 1; XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion); } } border_xregion = XCreateRegion (); xrect.x = 0; xrect.y = 0; xrect.width = width; xrect.height = fgeom->bottom_height; XUnionRectWithRegion (&xrect, border_xregion, border_xregion); XSubtractRegion (border_xregion, corners_xregion, border_xregion); XDestroyRegion (corners_xregion); return border_xregion; } static Region meta_get_left_border_region (const MetaFrameGeometry *fgeom, int height) { Region border_xregion; XRectangle xrect; border_xregion = XCreateRegion (); xrect.x = 0; xrect.y = 0; xrect.width = fgeom->left_width; xrect.height = height - fgeom->top_height - fgeom->bottom_height; XUnionRectWithRegion (&xrect, border_xregion, border_xregion); return border_xregion; } static Region meta_get_right_border_region (const MetaFrameGeometry *fgeom, int height) { Region border_xregion; XRectangle xrect; border_xregion = XCreateRegion (); xrect.x = 0; xrect.y = 0; xrect.width = fgeom->right_width; xrect.height = height - fgeom->top_height - fgeom->bottom_height; XUnionRectWithRegion (&xrect, border_xregion, border_xregion); return border_xregion; } static MetaButtonState meta_button_state (int state) { if (state & IN_EVENT_WINDOW) { if (state & PRESSED_EVENT_WINDOW) return META_BUTTON_STATE_PRESSED; return META_BUTTON_STATE_PRELIGHT; } return META_BUTTON_STATE_NORMAL; } static MetaButtonType meta_function_to_type (MetaButtonFunction function) { switch (function) { case META_BUTTON_FUNCTION_MENU: return META_BUTTON_TYPE_MENU; case META_BUTTON_FUNCTION_MINIMIZE: return META_BUTTON_TYPE_MINIMIZE; case META_BUTTON_FUNCTION_MAXIMIZE: return META_BUTTON_TYPE_MAXIMIZE; case META_BUTTON_FUNCTION_CLOSE: return META_BUTTON_TYPE_CLOSE; #ifdef HAVE_METACITY_2_17_0 case META_BUTTON_FUNCTION_SHADE: return META_BUTTON_TYPE_SHADE; case META_BUTTON_FUNCTION_ABOVE: return META_BUTTON_TYPE_ABOVE; case META_BUTTON_FUNCTION_STICK: return META_BUTTON_TYPE_STICK; case META_BUTTON_FUNCTION_UNSHADE: return META_BUTTON_TYPE_UNSHADE; case META_BUTTON_FUNCTION_UNABOVE: return META_BUTTON_TYPE_UNABOVE; case META_BUTTON_FUNCTION_UNSTICK: return META_BUTTON_TYPE_UNSTICK; #endif default: break; } return META_BUTTON_TYPE_LAST; } static MetaButtonState meta_button_state_for_button_type (decor_t *d, MetaButtonType type) { switch (type) { case META_BUTTON_TYPE_LEFT_LEFT_BACKGROUND: type = meta_function_to_type (meta_button_layout.left_buttons[0]); break; case META_BUTTON_TYPE_LEFT_MIDDLE_BACKGROUND: type = meta_function_to_type (meta_button_layout.left_buttons[1]); break; case META_BUTTON_TYPE_LEFT_RIGHT_BACKGROUND: type = meta_function_to_type (meta_button_layout.left_buttons[2]); break; case META_BUTTON_TYPE_RIGHT_LEFT_BACKGROUND: type = meta_function_to_type (meta_button_layout.right_buttons[0]); break; case META_BUTTON_TYPE_RIGHT_MIDDLE_BACKGROUND: type = meta_function_to_type (meta_button_layout.right_buttons[1]); break; case META_BUTTON_TYPE_RIGHT_RIGHT_BACKGROUND: type = meta_function_to_type (meta_button_layout.right_buttons[2]); default: break; } switch (type) { case META_BUTTON_TYPE_CLOSE: return meta_button_state (d->button_states[BUTTON_CLOSE]); case META_BUTTON_TYPE_MAXIMIZE: return meta_button_state (d->button_states[BUTTON_MAX]); case META_BUTTON_TYPE_MINIMIZE: return meta_button_state (d->button_states[BUTTON_MIN]); case META_BUTTON_TYPE_MENU: return meta_button_state (d->button_states[BUTTON_MENU]); #ifdef HAVE_METACITY_2_17_0 case META_BUTTON_TYPE_SHADE: return meta_button_state (d->button_states[BUTTON_SHADE]); case META_BUTTON_TYPE_ABOVE: return meta_button_state (d->button_states[BUTTON_ABOVE]); case META_BUTTON_TYPE_STICK: return meta_button_state (d->button_states[BUTTON_STICK]); case META_BUTTON_TYPE_UNSHADE: return meta_button_state (d->button_states[BUTTON_UNSHADE]); case META_BUTTON_TYPE_UNABOVE: return meta_button_state (d->button_states[BUTTON_UNABOVE]); case META_BUTTON_TYPE_UNSTICK: return meta_button_state (d->button_states[BUTTON_UNSTICK]); #endif default: break; } return META_BUTTON_STATE_NORMAL; } void meta_get_decoration_geometry (decor_t *d, MetaTheme *theme, MetaFrameFlags *flags, MetaFrameGeometry *fgeom, MetaButtonLayout *button_layout, MetaFrameType frame_type, GdkRectangle *clip) { gint left_width, right_width, top_height, bottom_height; if (!(frame_type < META_FRAME_TYPE_LAST)) frame_type = META_FRAME_TYPE_NORMAL; if (meta_button_layout_set) { *button_layout = meta_button_layout; } else { gint i; button_layout->left_buttons[0] = META_BUTTON_FUNCTION_MENU; for (i = 1; i < MAX_BUTTONS_PER_CORNER; ++i) button_layout->left_buttons[i] = META_BUTTON_FUNCTION_LAST; button_layout->right_buttons[0] = META_BUTTON_FUNCTION_MINIMIZE; button_layout->right_buttons[1] = META_BUTTON_FUNCTION_MAXIMIZE; button_layout->right_buttons[2] = META_BUTTON_FUNCTION_CLOSE; for (i = 3; i < MAX_BUTTONS_PER_CORNER; ++i) button_layout->right_buttons[i] = META_BUTTON_FUNCTION_LAST; } *flags = 0; if (d->actions & WNCK_WINDOW_ACTION_CLOSE) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_DELETE; if (d->actions & WNCK_WINDOW_ACTION_MINIMIZE) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MINIMIZE; if (d->actions & WNCK_WINDOW_ACTION_MAXIMIZE) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MAXIMIZE; *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MENU; if (d->actions & WNCK_WINDOW_ACTION_RESIZE) { if (!(d->state & WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY)) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_VERTICAL_RESIZE; if (!(d->state & WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY)) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_HORIZONTAL_RESIZE; } if (d->actions & WNCK_WINDOW_ACTION_MOVE) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MOVE; if (d->actions & WNCK_WINDOW_ACTION_MAXIMIZE) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MAXIMIZE; if (d->actions & WNCK_WINDOW_ACTION_SHADE) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_SHADE; if (d->active) *flags |= (MetaFrameFlags ) META_FRAME_HAS_FOCUS; if ((d->state & META_MAXIMIZED) == META_MAXIMIZED) *flags |= (MetaFrameFlags ) META_FRAME_MAXIMIZED; if (d->state & WNCK_WINDOW_STATE_STICKY) *flags |= (MetaFrameFlags ) META_FRAME_STUCK; if (d->state & WNCK_WINDOW_STATE_FULLSCREEN) *flags |= (MetaFrameFlags ) META_FRAME_FULLSCREEN; if (d->state & WNCK_WINDOW_STATE_SHADED) *flags |= (MetaFrameFlags ) META_FRAME_SHADED; #ifdef HAVE_METACITY_2_17_0 if (d->state & WNCK_WINDOW_STATE_ABOVE) *flags |= (MetaFrameFlags ) META_FRAME_ABOVE; #endif meta_theme_get_frame_borders (theme, frame_type, d->frame->text_height, *flags, &top_height, &bottom_height, &left_width, &right_width); clip->x = d->context->left_space - left_width; clip->y = d->context->top_space - top_height; clip->width = d->border_layout.top.x2 - d->border_layout.top.x1; clip->width -= d->context->right_space + d->context->left_space; if (d->border_layout.rotation) clip->height = d->border_layout.left.x2 - d->border_layout.left.x1; else clip->height = d->border_layout.left.y2 - d->border_layout.left.y1; meta_theme_calc_geometry (theme, frame_type, d->frame->text_height, *flags, clip->width, clip->height, button_layout, fgeom); clip->width += left_width + right_width; clip->height += top_height + bottom_height; } void meta_draw_window_decoration (decor_t *d) { Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); GdkPixmap *pixmap; Picture src; MetaButtonState button_states [META_BUTTON_TYPE_LAST]; MetaButtonLayout button_layout; MetaFrameGeometry fgeom; MetaFrameFlags flags; MetaFrameType frame_type; MetaTheme *theme; GtkStyle *style; cairo_t *cr; gint size, i; GdkRectangle clip, rect; GdkDrawable *drawable; Region top_region = NULL; Region bottom_region = NULL; Region left_region = NULL; Region right_region = NULL; gdouble meta_active_opacity, meta_inactive_opacity; gboolean meta_active_shade_opacity, meta_inactive_shade_opacity; g_object_get (settings, "metacity-active-opacity", &meta_active_opacity, NULL); g_object_get (settings, "metacity-inactive-opacity", &meta_inactive_opacity, NULL); g_object_get (settings, "metacity-active-shade-opacity", &meta_active_shade_opacity, NULL); g_object_get (settings, "metacity-inactive-shade-opacity", &meta_inactive_shade_opacity, NULL); double alpha = (d->active) ? meta_active_opacity : meta_inactive_opacity; gboolean shade_alpha = (d->active) ? meta_active_shade_opacity : meta_inactive_shade_opacity; MetaFrameStyle *frame_style; GtkWidget *style_window; GdkColor bg_color; double bg_alpha; if (!d->pixmap || !d->picture) return; if (decoration_alpha == 1.0) alpha = 1.0; if (gdk_drawable_get_depth (GDK_DRAWABLE (d->pixmap)) == 32) { style = gtk_widget_get_style (d->frame->style_window_rgba); style_window = d->frame->style_window_rgba; } else { style = gtk_widget_get_style (d->frame->style_window_rgb); style_window = d->frame->style_window_rgb; } drawable = d->buffer_pixmap ? d->buffer_pixmap : d->pixmap; cr = gdk_cairo_create (GDK_DRAWABLE (drawable)); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); theme = meta_theme_get_current (); frame_type = meta_frame_type_from_string (d->frame->type); if (frame_type == META_FRAME_TYPE_LAST) frame_type = META_FRAME_TYPE_NORMAL; meta_get_decoration_geometry (d, theme, &flags, &fgeom, &button_layout, frame_type, &clip); if ((d->prop_xid || !d->buffer_pixmap) && !d->frame_window) draw_shadow_background (d, cr, d->shadow, d->context); for (i = 0; i < META_BUTTON_TYPE_LAST; ++i) button_states[i] = meta_button_state_for_button_type (d, i); frame_style = meta_theme_get_frame_style (theme, frame_type, flags); bg_color = style->bg[GTK_STATE_NORMAL]; bg_alpha = 1.0; #ifdef HAVE_METACITY_2_17_0 if (frame_style->window_background_color) { meta_color_spec_render (frame_style->window_background_color, GTK_WIDGET (style_window), &bg_color); bg_alpha = frame_style->window_background_alpha / 255.0; } #endif cairo_destroy (cr); rect.x = 0; rect.y = 0; rect.width = clip.width; size = MAX (fgeom.top_height, fgeom.bottom_height); if (rect.width && size) { XRenderPictFormat *format; if (d->frame_window) pixmap = create_pixmap (rect.width, size, d->frame->style_window_rgb); else pixmap = create_pixmap (rect.width, size, d->frame->style_window_rgba); cr = gdk_cairo_create (GDK_DRAWABLE (pixmap)); gdk_cairo_set_source_color_alpha (cr, &bg_color, bg_alpha); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); format = get_format_for_drawable (d, GDK_DRAWABLE (pixmap)); src = XRenderCreatePicture (xdisplay, GDK_PIXMAP_XID (pixmap), format, 0, NULL); if (fgeom.top_height) { rect.height = fgeom.top_height; cairo_paint (cr); meta_theme_draw_frame (theme, style_window, pixmap, &rect, 0, 0, frame_type, flags, clip.width - fgeom.left_width - fgeom.right_width, clip.height - fgeom.top_height - fgeom.bottom_height, d->layout, d->frame->text_height, &button_layout, button_states, d->icon_pixbuf, NULL); top_region = meta_get_top_border_region (&fgeom, clip.width); decor_blend_border_picture (xdisplay, d->context, src, 0, 0, d->picture, &d->border_layout, BORDER_TOP, top_region, alpha * 0xffff, shade_alpha, 0); } if (fgeom.bottom_height) { rect.height = fgeom.bottom_height; cairo_paint (cr); meta_theme_draw_frame (theme, style_window, pixmap, &rect, 0, -(clip.height - fgeom.bottom_height), frame_type, flags, clip.width - fgeom.left_width - fgeom.right_width, clip.height - fgeom.top_height - fgeom.bottom_height, d->layout, d->frame->text_height, &button_layout, button_states, d->icon_pixbuf, NULL); bottom_region = meta_get_bottom_border_region (&fgeom, clip.width); decor_blend_border_picture (xdisplay, d->context, src, 0, 0, d->picture, &d->border_layout, BORDER_BOTTOM, bottom_region, alpha * 0xffff, shade_alpha, 0); } cairo_destroy (cr); g_object_unref (G_OBJECT (pixmap)); XRenderFreePicture (xdisplay, src); } rect.height = clip.height - fgeom.top_height - fgeom.bottom_height; size = MAX (fgeom.left_width, fgeom.right_width); if (size && rect.height) { XRenderPictFormat *format; if (d->frame_window) { GdkColormap *cmap; cmap = get_colormap_for_drawable (GDK_DRAWABLE (d->pixmap)); pixmap = create_pixmap (size, rect.height, d->frame->style_window_rgb); gdk_drawable_set_colormap (GDK_DRAWABLE (pixmap), cmap); } else pixmap = create_pixmap (size, rect.height, d->frame->style_window_rgba); cr = gdk_cairo_create (GDK_DRAWABLE (pixmap)); gdk_cairo_set_source_color_alpha (cr, &bg_color, bg_alpha); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); format = get_format_for_drawable (d, GDK_DRAWABLE (pixmap)); src = XRenderCreatePicture (xdisplay, GDK_PIXMAP_XID (pixmap), format, 0, NULL); if (fgeom.left_width) { rect.width = fgeom.left_width; cairo_paint (cr); meta_theme_draw_frame (theme, style_window, pixmap, &rect, 0, -fgeom.top_height, frame_type, flags, clip.width - fgeom.left_width - fgeom.right_width, clip.height - fgeom.top_height - fgeom.bottom_height, d->layout, d->frame->text_height, &button_layout, button_states, d->icon_pixbuf, NULL); left_region = meta_get_left_border_region (&fgeom, clip.height); decor_blend_border_picture (xdisplay, d->context, src, 0, 0, d->picture, &d->border_layout, BORDER_LEFT, left_region, alpha * 0xffff, shade_alpha, 0); } if (fgeom.right_width) { rect.width = fgeom.right_width; cairo_paint (cr); meta_theme_draw_frame (theme, style_window, pixmap, &rect, -(clip.width - fgeom.right_width), -fgeom.top_height, frame_type, flags, clip.width - fgeom.left_width - fgeom.right_width, clip.height - fgeom.top_height - fgeom.bottom_height, d->layout, d->frame->text_height, &button_layout, button_states, d->icon_pixbuf, NULL); right_region = meta_get_right_border_region (&fgeom, clip.height); decor_blend_border_picture (xdisplay, d->context, src, 0, 0, d->picture, &d->border_layout, BORDER_RIGHT, right_region, alpha * 0xffff, shade_alpha, 0); } cairo_destroy (cr); g_object_unref (G_OBJECT (pixmap)); XRenderFreePicture (xdisplay, src); } copy_to_front_buffer (d); if (d->frame_window) { GdkWindow *gdk_frame_window = gtk_widget_get_window (d->decor_window); /* * FIXME: What is '4' supposed to be for here... */ gtk_image_set_from_pixmap (GTK_IMAGE (d->decor_image), d->pixmap, NULL); gtk_window_resize (GTK_WINDOW (d->decor_window), d->width, d->height); gdk_window_move (gdk_frame_window, d->context->left_corner_space - 1, d->context->top_corner_space - 1); gdk_window_lower (gdk_frame_window); } if (d->prop_xid) { /* translate from frame to client window space */ if (top_region) XOffsetRegion (top_region, -fgeom.left_width, -fgeom.top_height); if (bottom_region) XOffsetRegion (bottom_region, -fgeom.left_width, 0); if (left_region) XOffsetRegion (left_region, -fgeom.left_width, 0); decor_update_meta_window_property (d, theme, flags, top_region, bottom_region, left_region, right_region); d->prop_xid = 0; } if (top_region) XDestroyRegion (top_region); if (bottom_region) XDestroyRegion (bottom_region); if (left_region) XDestroyRegion (left_region); if (right_region) XDestroyRegion (right_region); } void meta_calc_button_size (decor_t *d) { gint i, min_x, x, y, w, h, width; width = d->border_layout.top.x2 - d->border_layout.top.x1 - d->context->left_space - d->context->right_space; min_x = width; for (i = 0; i < 3; ++i) { static guint button_actions[3] = { WNCK_WINDOW_ACTION_CLOSE, WNCK_WINDOW_ACTION_MAXIMIZE, WNCK_WINDOW_ACTION_MINIMIZE }; if (d->actions & button_actions[i]) { if (meta_get_button_position (d, i, width, 256, &x, &y, &w, &h)) { if (x > width / 2 && x < min_x) min_x = x; } } } d->button_width = width - min_x + 6; } gboolean meta_get_button_position (decor_t *d, gint i, gint width, gint height, gint *x, gint *y, gint *w, gint *h) { MetaButtonLayout button_layout; MetaFrameGeometry fgeom; MetaFrameFlags flags; MetaTheme *theme; GdkRectangle clip; #ifdef HAVE_METACITY_2_15_21 MetaButtonSpace *space; #else GdkRectangle *space; #endif gint mutter_draggable_border_width = 0; g_object_get (settings, "draggable-border-width", &mutter_draggable_border_width, NULL); if (!d->context) { /* undecorated windows implicitly have no buttons */ return FALSE; } theme = meta_theme_get_current (); meta_get_decoration_geometry (d, theme, &flags, &fgeom, &button_layout, meta_frame_type_from_string (d->frame->type), &clip); switch (i) { case BUTTON_MENU: if (!meta_button_present (&button_layout, META_BUTTON_FUNCTION_MENU)) return FALSE; space = &fgeom.menu_rect; break; case BUTTON_MIN: if (!meta_button_present (&button_layout, META_BUTTON_FUNCTION_MINIMIZE)) return FALSE; space = &fgeom.min_rect; break; case BUTTON_MAX: if (!meta_button_present (&button_layout, META_BUTTON_FUNCTION_MAXIMIZE)) return FALSE; space = &fgeom.max_rect; break; case BUTTON_CLOSE: if (!meta_button_present (&button_layout, META_BUTTON_FUNCTION_CLOSE)) return FALSE; space = &fgeom.close_rect; break; #if defined (HAVE_METACITY_2_17_0) && defined (HAVE_LIBWNCK_2_18_1) case BUTTON_SHADE: if (!meta_button_present (&button_layout, META_BUTTON_FUNCTION_SHADE)) return FALSE; space = &fgeom.shade_rect; break; case BUTTON_ABOVE: if (!meta_button_present (&button_layout, META_BUTTON_FUNCTION_ABOVE)) return FALSE; space = &fgeom.above_rect; break; case BUTTON_STICK: if (!meta_button_present (&button_layout, META_BUTTON_FUNCTION_STICK)) return FALSE; space = &fgeom.stick_rect; break; case BUTTON_UNSHADE: if (!meta_button_present (&button_layout, META_BUTTON_FUNCTION_UNSHADE)) return FALSE; space = &fgeom.unshade_rect; break; case BUTTON_UNABOVE: if (!meta_button_present (&button_layout, META_BUTTON_FUNCTION_UNABOVE)) return FALSE; space = &fgeom.unabove_rect; break; case BUTTON_UNSTICK: if (!meta_button_present (&button_layout, META_BUTTON_FUNCTION_UNSTICK)) return FALSE; space = &fgeom.unstick_rect; break; #endif default: return FALSE; } #ifdef HAVE_METACITY_2_15_21 if (!space->clickable.width && !space->clickable.height) return FALSE; *x = space->clickable.x; *y = space->clickable.y; *w = space->clickable.width; *h = space->clickable.height; #else if (!space->width && !space->height) return FALSE; *x = space->x; *y = space->y; *w = space->width; *h = space->height; #endif if (d->frame_window) { *x += d->frame->win_extents.left + 4; *y += d->frame->win_extents.top + 2; } if (flags & META_FRAME_ALLOWS_HORIZONTAL_RESIZE) { *x += mutter_draggable_border_width; } if (flags & META_FRAME_ALLOWS_VERTICAL_RESIZE) { *y += mutter_draggable_border_width; } return TRUE; } gfloat meta_get_title_scale (decor_frame_t *frame) { MetaTheme *theme = meta_theme_get_current (); MetaFrameType type; MetaFrameFlags flags = 0xc33; /* fixme */ type = meta_frame_type_from_string (frame->type); if (type == META_FRAME_TYPE_LAST) return 1.0f; gfloat scale = meta_theme_get_title_scale (theme, type, flags); return scale; } gboolean meta_calc_decoration_size (decor_t *d, gint w, gint h, gint name_width, gint *width, gint *height) { decor_layout_t layout; decor_context_t *context; decor_shadow_t *shadow; if (!d->decorated) return FALSE; if ((d->state & META_MAXIMIZED) == META_MAXIMIZED) { if (!d->frame_window) { if (d->active) { context = &d->frame->max_window_context_active; shadow = d->frame->max_border_shadow_active; } else { context = &d->frame->max_window_context_inactive; shadow = d->frame->max_border_shadow_inactive; } } else { context = &d->frame->max_window_context_no_shadow; shadow = d->frame->max_border_no_shadow; } } else { if (!d->frame_window) { if (d->active) { context = &d->frame->window_context_active; shadow = d->frame->border_shadow_active; } else { context = &d->frame->window_context_inactive; shadow = d->frame->border_shadow_inactive; } } else { context = &d->frame->window_context_no_shadow; shadow = d->frame->border_no_shadow; } } if (!d->frame_window) { decor_get_best_layout (context, w, h, &layout); if (context != d->context || memcmp (&layout, &d->border_layout, sizeof (layout))) { *width = layout.width; *height = layout.height; d->border_layout = layout; d->context = context; d->shadow = shadow; meta_calc_button_size (d); return TRUE; } } else { if ((d->state & META_MAXIMIZED) == META_MAXIMIZED) decor_get_default_layout (context, d->client_width, d->client_height - d->frame->titlebar_height, &layout); else decor_get_default_layout (context, d->client_width, d->client_height, &layout); *width = layout.width; *height = layout.height; d->border_layout = layout; d->shadow = shadow; d->context = context; meta_calc_button_size (d); return TRUE; } return FALSE; } gboolean meta_button_present (MetaButtonLayout *button_layout, MetaButtonFunction function) { int i; for (i = 0; i < MAX_BUTTONS_PER_CORNER; ++i) if (button_layout->left_buttons[i] == function) return TRUE; for (i = 0; i < MAX_BUTTONS_PER_CORNER; ++i) if (button_layout->right_buttons[i] == function) return TRUE; return FALSE; } #define TOP_RESIZE_HEIGHT 2 #define RESIZE_EXTENDS 15 void meta_get_event_window_position (decor_t *d, gint i, gint j, gint width, gint height, gint *x, gint *y, gint *w, gint *h) { MetaButtonLayout button_layout; MetaFrameGeometry fgeom; MetaFrameFlags flags; MetaTheme *theme; GdkRectangle clip; gint mutter_draggable_border_width = 0; g_object_get (settings, "draggable-border-width", &mutter_draggable_border_width, NULL); theme = meta_theme_get_current (); meta_get_decoration_geometry (d, theme, &flags, &fgeom, &button_layout, meta_frame_type_from_string (d->frame->type), &clip); width += fgeom.right_width + fgeom.left_width; height += fgeom.top_height + fgeom.bottom_height; switch (i) { case 2: /* bottom */ switch (j) { case 2: /* bottom right */ if (d->frame_window) { *x = width - fgeom.right_width - RESIZE_EXTENDS + d->frame->win_extents.left + 2; *y = height - fgeom.bottom_height - RESIZE_EXTENDS + d->frame->win_extents.top + 2; } else { *x = width - fgeom.right_width - RESIZE_EXTENDS; *y = height - fgeom.bottom_height - RESIZE_EXTENDS; } *w = fgeom.right_width + RESIZE_EXTENDS; *h = fgeom.bottom_height + RESIZE_EXTENDS; if (!d->frame_window) { *x += mutter_draggable_border_width; *y += mutter_draggable_border_width; *w += mutter_draggable_border_width; *h += mutter_draggable_border_width; } break; case 1: /* bottom */ *x = fgeom.left_width + RESIZE_EXTENDS; *y = height - fgeom.bottom_height; if (d->frame_window) *y += d->frame->win_extents.top + 2; *w = width - fgeom.left_width - fgeom.right_width - (2 * RESIZE_EXTENDS); *h = fgeom.bottom_height; if (!d->frame_window) { *x -= mutter_draggable_border_width; *y += mutter_draggable_border_width; *h += mutter_draggable_border_width; *w += mutter_draggable_border_width * 2; } break; case 0: /* bottom left */ default: *x = 0; *y = height - fgeom.bottom_height - RESIZE_EXTENDS; if (d->frame_window) { *x += d->frame->win_extents.left + 4; *y += d->frame->win_extents.bottom + 2; } *w = fgeom.left_width + RESIZE_EXTENDS; *h = fgeom.bottom_height + RESIZE_EXTENDS; if (!d->frame_window) { *y += mutter_draggable_border_width; *w += mutter_draggable_border_width; *h += mutter_draggable_border_width; } break; } break; case 1: /* middle */ switch (j) { case 2: /* right */ *x = width - fgeom.right_width; *y = fgeom.top_height + RESIZE_EXTENDS; if (d->frame_window) *x += d->frame->win_extents.left + 2; *w = fgeom.right_width; *h = height - fgeom.top_height - fgeom.bottom_height - (2 * RESIZE_EXTENDS); if (!d->frame_window) { *x += mutter_draggable_border_width; *y += mutter_draggable_border_width; *w += mutter_draggable_border_width; *h += mutter_draggable_border_width; } break; case 1: /* middle */ *x = fgeom.left_width; *y = fgeom.title_rect.y + TOP_RESIZE_HEIGHT; *w = width - fgeom.left_width - fgeom.right_width; *h = height - fgeom.top_titlebar_edge - fgeom.bottom_height; if (!d->frame_window) { *x += mutter_draggable_border_width; if (flags & META_FRAME_ALLOWS_VERTICAL_RESIZE) *y += mutter_draggable_border_width; } break; case 0: /* left */ default: *x = 0; if (d->frame_window) *x += d->frame->win_extents.left + 4; *y = fgeom.top_height + RESIZE_EXTENDS; *w = fgeom.left_width; *h = height - fgeom.top_height - fgeom.bottom_height - (2 * RESIZE_EXTENDS); if (!d->frame_window) { *y += mutter_draggable_border_width; *h += mutter_draggable_border_width; *w += mutter_draggable_border_width; } break; } break; case 0: /* top */ default: switch (j) { case 2: /* top right */ *x = width - fgeom.right_width - RESIZE_EXTENDS; *y = 0; if (d->frame_window) { *x += d->frame->win_extents.left + 2; *y += d->frame->win_extents.top + 2 - fgeom.title_rect.height; } *w = fgeom.right_width + RESIZE_EXTENDS; *h = fgeom.top_height + RESIZE_EXTENDS; if (!d->frame_window) { *x += mutter_draggable_border_width; *w += mutter_draggable_border_width; *h += mutter_draggable_border_width; } break; case 1: /* top */ *x = fgeom.left_width + RESIZE_EXTENDS; *y = 0; if (d->frame_window) *y += d->frame->win_extents.top + 2; *w = width - fgeom.left_width - fgeom.right_width - (2 * RESIZE_EXTENDS); *h = fgeom.title_rect.y + TOP_RESIZE_HEIGHT; if (!d->frame_window) { *x -= mutter_draggable_border_width; *w += mutter_draggable_border_width * 2; *h += mutter_draggable_border_width; } break; case 0: /* top left */ default: *x = 0; *y = 0; if (d->frame_window) { *x += d->frame->win_extents.left + 4; *y += d->frame->win_extents.top + 2 - fgeom.title_rect.height; } *w = fgeom.left_width + RESIZE_EXTENDS; *h = fgeom.top_height + RESIZE_EXTENDS; if (!d->frame_window) { *w += mutter_draggable_border_width; *h += mutter_draggable_border_width; } break; } } if (!(flags & META_FRAME_ALLOWS_VERTICAL_RESIZE)) { /* turn off top and bottom event windows */ if (i == 0 || i == 2) *w = *h = 0; } if (!(flags & META_FRAME_ALLOWS_HORIZONTAL_RESIZE)) { /* turn off left and right event windows */ if (j == 0 || j == 2) *w = *h = 0; } } static MetaButtonFunction meta_button_function_from_string (const char *str) { if (strcmp (str, "menu") == 0) return META_BUTTON_FUNCTION_MENU; else if (strcmp (str, "minimize") == 0) return META_BUTTON_FUNCTION_MINIMIZE; else if (strcmp (str, "maximize") == 0) return META_BUTTON_FUNCTION_MAXIMIZE; else if (strcmp (str, "close") == 0) return META_BUTTON_FUNCTION_CLOSE; #ifdef HAVE_METACITY_2_17_0 else if (strcmp (str, "shade") == 0) return META_BUTTON_FUNCTION_SHADE; else if (strcmp (str, "above") == 0) return META_BUTTON_FUNCTION_ABOVE; else if (strcmp (str, "stick") == 0) return META_BUTTON_FUNCTION_STICK; else if (strcmp (str, "unshade") == 0) return META_BUTTON_FUNCTION_UNSHADE; else if (strcmp (str, "unabove") == 0) return META_BUTTON_FUNCTION_UNABOVE; else if (strcmp (str, "unstick") == 0) return META_BUTTON_FUNCTION_UNSTICK; #endif else return META_BUTTON_FUNCTION_LAST; } static MetaButtonFunction meta_button_opposite_function (MetaButtonFunction ofwhat) { switch (ofwhat) { #ifdef HAVE_METACITY_2_17_0 case META_BUTTON_FUNCTION_SHADE: return META_BUTTON_FUNCTION_UNSHADE; case META_BUTTON_FUNCTION_UNSHADE: return META_BUTTON_FUNCTION_SHADE; case META_BUTTON_FUNCTION_ABOVE: return META_BUTTON_FUNCTION_UNABOVE; case META_BUTTON_FUNCTION_UNABOVE: return META_BUTTON_FUNCTION_ABOVE; case META_BUTTON_FUNCTION_STICK: return META_BUTTON_FUNCTION_UNSTICK; case META_BUTTON_FUNCTION_UNSTICK: return META_BUTTON_FUNCTION_STICK; #endif default: return META_BUTTON_FUNCTION_LAST; } } static void meta_initialize_button_layout (MetaButtonLayout *layout) { int i; for (i = 0; i < MAX_BUTTONS_PER_CORNER; ++i) { layout->left_buttons[i] = META_BUTTON_FUNCTION_LAST; layout->right_buttons[i] = META_BUTTON_FUNCTION_LAST; #ifdef HAVE_METACITY_2_23_2 layout->left_buttons_has_spacer[i] = FALSE; layout->right_buttons_has_spacer[i] = FALSE; #endif } } void meta_update_button_layout (const char *value) { MetaButtonLayout new_layout; MetaButtonFunction f; char **sides; int i; meta_initialize_button_layout (&new_layout); sides = g_strsplit (value, ":", 2); if (sides[0] != NULL) { char **buttons; int b; gboolean used[META_BUTTON_FUNCTION_LAST]; for (i = 0; i < META_BUTTON_FUNCTION_LAST; ++i) used[i] = FALSE; buttons = g_strsplit (sides[0], ",", -1); i = b = 0; while (buttons[b] != NULL) { f = meta_button_function_from_string (buttons[b]); #ifdef HAVE_METACITY_2_23_2 if (i > 0 && strcmp ("spacer", buttons[b]) == 0) { new_layout.left_buttons_has_spacer[i - 1] = TRUE; f = meta_button_opposite_function (f); if (f != META_BUTTON_FUNCTION_LAST) new_layout.left_buttons_has_spacer[i - 2] = TRUE; } else #endif { if (f != META_BUTTON_FUNCTION_LAST && !used[f]) { used[f] = TRUE; new_layout.left_buttons[i++] = f; f = meta_button_opposite_function (f); if (f != META_BUTTON_FUNCTION_LAST) new_layout.left_buttons[i++] = f; } else { fprintf (stderr, "%s: Ignoring unknown or already-used " "button name \"%s\"\n", program_name, buttons[b]); } } ++b; } new_layout.left_buttons[i] = META_BUTTON_FUNCTION_LAST; g_strfreev (buttons); if (sides[1] != NULL) { for (i = 0; i < META_BUTTON_FUNCTION_LAST; ++i) used[i] = FALSE; buttons = g_strsplit (sides[1], ",", -1); i = b = 0; while (buttons[b] != NULL) { f = meta_button_function_from_string (buttons[b]); #ifdef HAVE_METACITY_2_23_2 if (i > 0 && strcmp ("spacer", buttons[b]) == 0) { new_layout.right_buttons_has_spacer[i - 1] = TRUE; f = meta_button_opposite_function (f); if (f != META_BUTTON_FUNCTION_LAST) new_layout.right_buttons_has_spacer[i - 2] = TRUE; } else #endif { if (f != META_BUTTON_FUNCTION_LAST && !used[f]) { used[f] = TRUE; new_layout.right_buttons[i++] = f; f = meta_button_opposite_function (f); if (f != META_BUTTON_FUNCTION_LAST) new_layout.right_buttons[i++] = f; } else { fprintf (stderr, "%s: Ignoring unknown or " "already-used button name \"%s\"\n", program_name, buttons[b]); } } ++b; } new_layout.right_buttons[i] = META_BUTTON_FUNCTION_LAST; g_strfreev (buttons); } } g_strfreev (sides); /* Invert the button layout for RTL languages */ if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL) { MetaButtonLayout rtl_layout; int j; meta_initialize_button_layout (&rtl_layout); i = 0; while (new_layout.left_buttons[i] != META_BUTTON_FUNCTION_LAST) ++i; for (j = 0; j < i; ++j) { rtl_layout.right_buttons[j] = new_layout.left_buttons[i - j - 1]; #ifdef HAVE_METACITY_2_23_2 if (j == 0) rtl_layout.right_buttons_has_spacer[i - 1] = new_layout.left_buttons_has_spacer[i - j - 1]; else rtl_layout.right_buttons_has_spacer[j - 1] = new_layout.left_buttons_has_spacer[i - j - 1]; #endif } i = 0; while (new_layout.right_buttons[i] != META_BUTTON_FUNCTION_LAST) ++i; for (j = 0; j < i; ++j) { rtl_layout.left_buttons[j] = new_layout.right_buttons[i - j - 1]; #ifdef HAVE_METACITY_2_23_2 if (j == 0) rtl_layout.left_buttons_has_spacer[i - 1] = new_layout.right_buttons_has_spacer[i - j - 1]; else rtl_layout.left_buttons_has_spacer[j - 1] = new_layout.right_buttons_has_spacer[i - j - 1]; #endif } new_layout = rtl_layout; } meta_button_layout = new_layout; } void meta_update_border_extents (decor_frame_t *frame) { MetaTheme *theme = meta_theme_get_current (); gwd_decor_frame_ref (frame); MetaFrameType frame_type = meta_frame_type_from_string (frame->type); gint top_height, bottom_height, left_width, right_width; if (!(frame_type < META_FRAME_TYPE_LAST)) frame_type = META_FRAME_TYPE_NORMAL; meta_theme_get_frame_borders (theme, frame_type, frame->text_height, 0, &top_height, &bottom_height, &left_width, &right_width); frame->win_extents.top = frame->win_extents.top; frame->win_extents.bottom = bottom_height; frame->win_extents.left = left_width; frame->win_extents.right = right_width; frame->titlebar_height = top_height - frame->win_extents.top; meta_theme_get_frame_borders (theme, frame_type, frame->text_height, META_FRAME_MAXIMIZED, &top_height, &bottom_height, &left_width, &right_width); frame->max_win_extents.top = frame->win_extents.top; frame->max_win_extents.bottom = bottom_height; frame->max_win_extents.left = left_width; frame->max_win_extents.right = right_width; frame->max_titlebar_height = top_height - frame->max_win_extents.top; gwd_decor_frame_unref (frame); } #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-notified-interface.c0000644000015301777760000000407412321343002030073 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include "gwd-settings-notified-interface.h" static void gwd_settings_notified_interface_default_init (GWDSettingsNotifiedInterface *settings_interface); G_DEFINE_INTERFACE (GWDSettingsNotified, gwd_settings_notified_interface, G_TYPE_OBJECT); static void gwd_settings_notified_interface_default_init (GWDSettingsNotifiedInterface *settings_interface) { } gboolean gwd_settings_notified_update_decorations (GWDSettingsNotified *notified) { GWDSettingsNotifiedInterface *iface = GWD_SETTINGS_NOTIFIED_GET_INTERFACE (notified); return (*iface->update_decorations) (notified); } gboolean gwd_settings_notified_update_frames (GWDSettingsNotified *notified) { GWDSettingsNotifiedInterface *iface = GWD_SETTINGS_NOTIFIED_GET_INTERFACE (notified); return (*iface->update_frames) (notified); } gboolean gwd_settings_notified_update_metacity_theme (GWDSettingsNotified *notified) { GWDSettingsNotifiedInterface *iface = GWD_SETTINGS_NOTIFIED_GET_INTERFACE (notified); return (*iface->update_metacity_theme) (notified); } gboolean gwd_settings_notified_metacity_button_layout (GWDSettingsNotified *notified) { GWDSettingsNotifiedInterface *iface = GWD_SETTINGS_NOTIFIED_GET_INTERFACE (notified); return (*iface->update_metacity_button_layout) (notified); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/settings.c0000644000015301777760000000623012321343002023553 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" #include "gwd-settings-writable-interface.h" #include "gwd-settings-storage-interface.h" #ifdef USE_GSETTINGS #include "gwd-settings-storage-gsettings.h" #else #ifdef USE_GCONF #include "gwd-settings-storage-gconf.h" #endif #endif #include "gwd-settings-xproperty-interface.h" #include "gwd-settings-xproperty-storage.h" GWDSettingsStorage *storage = NULL; GWDSettingsXPropertyStorage *xprop_storage = NULL; #ifdef USE_GSETTINGS #endif gboolean init_settings (GWDSettingsWritable *writable, WnckScreen *screen) { #ifdef USE_GSETTINGS #define STORAGE_USED GSettings *compiz = gwd_get_org_compiz_gwd_settings (); GSettings *mutter = gwd_get_org_gnome_mutter_settings (); GSettings *gnome = gwd_get_org_gnome_desktop_wm_preferences_settings (); storage = gwd_settings_storage_gsettings_new (gnome, mutter, compiz, writable); gwd_connect_org_compiz_gwd_settings (compiz, storage); gwd_connect_org_gnome_mutter_settings (mutter, storage); gwd_connect_org_gnome_desktop_wm_preferences_settings (gnome, storage); #else #ifdef USE_GCONF #define STORAGE_USED storage = gwd_settings_storage_gconf_new (writable); #endif #endif GdkDisplay *display = gdk_display_get_default (); Display *xdisplay = gdk_x11_display_get_xdisplay (display); Window root = gdk_x11_get_default_root_xwindow (); xprop_storage = gwd_settings_storage_xprop_new (xdisplay, root, writable); #ifdef STORAGE_USED gwd_settings_storage_update_metacity_theme (storage); gwd_settings_storage_update_opacity (storage); gwd_settings_storage_update_button_layout (storage); gwd_settings_storage_update_font (storage); gwd_settings_storage_update_titlebar_actions (storage); gwd_settings_storage_update_blur (storage); gwd_settings_storage_update_draggable_border_width (storage); gwd_settings_storage_update_attach_modal_dialogs (storage); gwd_settings_storage_update_use_tooltips (storage); gwd_process_decor_shadow_property_update (); #else storage = NULL; #endif #undef STORAGE_USED return TRUE; } void fini_settings () { if (storage) g_object_unref (storage); if (xprop_storage) g_object_unref (xprop_storage); } gboolean gwd_process_decor_shadow_property_update () { return gwd_settings_xproperty_storage_update_all (xprop_storage); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/TODO0000644000015301777760000000120512321343002022234 0ustar pbusernogroup00000000000000 * Plugin interface * Plugin with SVG-based theme support * Plugin that supports old metacity themes ----- Cleanup TODO: * Allow frame keying types for frame types, so /2d/window_type/state/id , this way we can have different shadows per-frame and much more granular memory control (decor_t just becomes a handle to some decoration specific stuff, decor_frame_t becomes a table of shared resources held by all decor_t's * Completely seal off the values of structs and use only getter and setter functions to control API * Start implementing a system in GObject * Put all the globals into their own structs or namespaces compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-storage-interface.c0000644000015301777760000000634112321343002027735 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include "gwd-settings-storage-interface.h" static void gwd_settings_storage_interface_default_init (GWDSettingsStorageInterface *settings_interface); G_DEFINE_INTERFACE (GWDSettingsStorage, gwd_settings_storage_interface, G_TYPE_OBJECT); static void gwd_settings_storage_interface_default_init (GWDSettingsStorageInterface *settings_interface) { } gboolean gwd_settings_storage_update_use_tooltips (GWDSettingsStorage *settings) { GWDSettingsStorageInterface *interface = GWD_SETTINGS_STORAGE_GET_INTERFACE (settings); return (*interface->update_use_tooltips) (settings); } gboolean gwd_settings_storage_update_draggable_border_width (GWDSettingsStorage *settings) { GWDSettingsStorageInterface *interface = GWD_SETTINGS_STORAGE_GET_INTERFACE (settings); return (*interface->update_draggable_border_width) (settings); } gboolean gwd_settings_storage_update_attach_modal_dialogs (GWDSettingsStorage *settings) { GWDSettingsStorageInterface *interface = GWD_SETTINGS_STORAGE_GET_INTERFACE (settings); return (*interface->update_attach_modal_dialogs) (settings); } gboolean gwd_settings_storage_update_blur (GWDSettingsStorage *settings) { GWDSettingsStorageInterface *interface = GWD_SETTINGS_STORAGE_GET_INTERFACE (settings); return (*interface->update_blur) (settings); } gboolean gwd_settings_storage_update_metacity_theme (GWDSettingsStorage *settings) { GWDSettingsStorageInterface *interface = GWD_SETTINGS_STORAGE_GET_INTERFACE (settings); return (*interface->update_metacity_theme) (settings); } gboolean gwd_settings_storage_update_opacity (GWDSettingsStorage *settings) { GWDSettingsStorageInterface *interface = GWD_SETTINGS_STORAGE_GET_INTERFACE (settings); return (*interface->update_opacity) (settings); } gboolean gwd_settings_storage_update_button_layout (GWDSettingsStorage *settings) { GWDSettingsStorageInterface *interface = GWD_SETTINGS_STORAGE_GET_INTERFACE (settings); return (*interface->update_button_layout) (settings); } gboolean gwd_settings_storage_update_font (GWDSettingsStorage *settings) { GWDSettingsStorageInterface *interface = GWD_SETTINGS_STORAGE_GET_INTERFACE (settings); return (*interface->update_font) (settings); } gboolean gwd_settings_storage_update_titlebar_actions (GWDSettingsStorage *settings) { GWDSettingsStorageInterface *interface = GWD_SETTINGS_STORAGE_GET_INTERFACE (settings); return (*interface->update_titlebar_actions) (settings); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-xproperty-interface.c0000644000015301777760000000270512321343002030345 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include "gwd-settings-xproperty-interface.h" static void gwd_settings_xproperty_storage_interface_default_init (GWDSettingsXPropertyStorageInterface *settings_interface); G_DEFINE_INTERFACE (GWDSettingsXPropertyStorage, gwd_settings_xproperty_storage_interface, G_TYPE_OBJECT); static void gwd_settings_xproperty_storage_interface_default_init (GWDSettingsXPropertyStorageInterface *settings_interface) { } gboolean gwd_settings_xproperty_storage_update_all (GWDSettingsXPropertyStorage *storage) { GWDSettingsXPropertyStorageInterface *iface = GWD_SETTINGS_XPROPERTY_STORAGE_GET_INTERFACE (storage); return (*iface->update_all) (storage); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-fwd.h0000644000015301777760000000235512321343002023263 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_FWD_H #define _COMPIZ_GWD_FWD_H #include G_BEGIN_DECLS typedef struct _GWDSettings GWDSettings; typedef struct _GWDSettingsWritable GWDSettingsWritable; typedef struct _GWDSettingsNotified GWDSettingsNotified; typedef struct _GWDSettingsStorage GWDSettingsStorage; typedef struct _GWDSettingsXPropertyStorage GWDSettingsXPropertyStorage; G_END_DECLS #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-storage-gsettings.h0000644000015301777760000000614212321343002030010 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_SETTINGS_STORAGE_GSETTINGS_H #define _COMPIZ_GWD_SETTINGS_STORAGE_GSETTINGS_H #include #include G_BEGIN_DECLS #define GWD_TYPE_SETTINGS_STORAGE_GSETTINGS (gwd_settings_storage_gsettings_get_type ()) GType gwd_settings_storage_gsettings_get_type (); GWDSettingsStorage * gwd_settings_storage_gsettings_new (GSettings *orgGNOMEDesktopSettings, GSettings *mutterSettings, GSettings *gwdSettings, GWDSettingsWritable *writableSettings); void gwd_connect_org_compiz_gwd_settings (GSettings *settings, GWDSettingsStorage *storage); GSettings * gwd_get_org_compiz_gwd_settings (); void gwd_connect_org_gnome_mutter_settings (GSettings *settings, GWDSettingsStorage *storage); GSettings * gwd_get_org_gnome_mutter_settings (); void gwd_connect_org_gnome_desktop_wm_preferences_settings (GSettings *settings, GWDSettingsStorage *storage); GSettings * gwd_get_org_gnome_desktop_wm_preferences_settings (); extern const gchar * ORG_COMPIZ_GWD; extern const gchar * ORG_GNOME_MUTTER; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES; extern const gchar * ORG_COMPIZ_GWD_KEY_USE_TOOLTIPS; extern const gchar * ORG_COMPIZ_GWD_KEY_BLUR_TYPE; extern const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_OPACITY; extern const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_OPACITY; extern const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_SHADE_OPACITY; extern const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_SHADE_OPACITY; extern const gchar * ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME; extern const gchar * ORG_COMPIZ_GWD_KEY_MOUSE_WHEEL_ACTION; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_DOUBLE_CLICK_TITLEBAR; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_MIDDLE_CLICK_TITLEBAR; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_RIGHT_CLICK_TITLEBAR; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_THEME; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_USES_SYSTEM_FONT; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_FONT; extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_BUTTON_LAYOUT; extern const gchar * ORG_GNOME_MUTTER_ATTACH_MODAL_DIALOGS; extern const gchar * ORG_GNOME_MUTTER_DRAGGABLE_BORDER_WIDTH; G_END_DECLS #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings.c0000644000015301777760000007410712321343002024342 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include #include "gwd-settings.h" #include "gwd-settings-interface.h" #include "gwd-settings-writable-interface.h" #include "gwd-settings-notified-interface.h" #include "decoration.h" #define GWD_SETTINGS_IMPL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GWD_TYPE_SETTINGS_IMPL, GWDSettingsImpl)) #define GWD_SETTINGS_IMPL_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GWD_TYPE_SETTINGS_IMPL, GWDSettingsImplClass)) #define GWD_IS_SETTINGS_IMPL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GWD_TYPE_SETTINGS_IMPL)) #define GWD_IS_SETTINGS_IMPL_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GWD_TYPE_SETTINGS_IMPL)) #define GWD_SETTINGS_IMPL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GWD_TYPE_SETTINGS_IMPL, GWDSettingsImplClass)) typedef struct _GWDSettingsImpl { GObject parent; } GWDSettingsImpl; typedef struct _GWDSettingsImplClass { GObjectClass parent_class; } GWDSettingsImplClass; static void gwd_settings_interface_init (GWDSettingsInterface *interface); static void gwd_settings_writable_interface_init (GWDSettingsWritableInterface *interface); G_DEFINE_TYPE_WITH_CODE (GWDSettingsImpl, gwd_settings_impl, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GWD_TYPE_SETTINGS_INTERFACE, gwd_settings_interface_init) G_IMPLEMENT_INTERFACE (GWD_TYPE_WRITABLE_SETTINGS_INTERFACE, gwd_settings_writable_interface_init)) #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GWD_TYPE_SETTINGS_IMPL, GWDSettingsImplPrivate)) enum { GWD_SETTINGS_IMPL_PROPERTY_ACTIVE_SHADOW = 1, GWD_SETTINGS_IMPL_PROPERTY_INACTIVE_SHADOW = 2, GWD_SETTINGS_IMPL_PROPERTY_USE_TOOLTIPS = 3, GWD_SETTINGS_IMPL_PROPERTY_DRAGGABLE_BORDER_WIDTH = 4, GWD_SETTINGS_IMPL_PROPERTY_ATTACH_MODAL_DIALOGS = 5, GWD_SETTINGS_IMPL_PROPERTY_BLUR_CHANGED = 6, GWD_SETTINGS_IMPL_PROPERTY_METACITY_THEME = 7, GWD_SETTINGS_IMPL_PROPERTY_ACTIVE_OPACITY = 8, GWD_SETTINGS_IMPL_PROPERTY_INACTIVE_OPACITY = 9, GWD_SETTINGS_IMPL_PROPERTY_ACTIVE_SHADE_OPACITY = 10, GWD_SETTINGS_IMPL_PROPERTY_INACTIVE_SHADE_OPACITY = 11, GWD_SETTINGS_IMPL_PROPERTY_BUTTON_LAYOUT = 12, GWD_SETTINGS_IMPL_PROPERTY_TITLEBAR_ACTION_DOUBLE_CLICK = 13, GWD_SETTINGS_IMPL_PROPERTY_TITLEBAR_ACTION_MIDDLE_CLICK = 14, GWD_SETTINGS_IMPL_PROPERTY_TITLEBAR_ACTION_RIGHT_CLICK = 15, GWD_SETTINGS_IMPL_PROPERTY_MOUSE_WHEEL_ACTION = 16, GWD_SETTINGS_IMPL_PROPERTY_TITLEBAR_FONT = 17, GWD_SETTINGS_IMPL_PROPERTY_CMDLINE_OPTIONS = 18, GWD_SETTINGS_IMPL_PROPERTY_SETTINGS_NOTIFIED = 19 }; enum { CMDLINE_BLUR = (1 << 0), CMDLINE_THEME = (1 << 1) }; typedef gboolean (*NotifyFunc) (GWDSettingsNotified *); typedef struct _GWDSettingsImplPrivate { decor_shadow_options_t active_shadow; decor_shadow_options_t inactive_shadow; gboolean use_tooltips; gint draggable_border_width; gboolean attach_modal_dialogs; gint blur_type; gchar *metacity_theme; gdouble metacity_active_opacity; gdouble metacity_inactive_opacity; gboolean metacity_active_shade_opacity; gboolean metacity_inactive_shade_opacity; gchar *metacity_button_layout; gint titlebar_double_click_action; gint titlebar_middle_click_action; gint titlebar_right_click_action; gint mouse_wheel_action; gchar *titlebar_font; guint cmdline_opts; GWDSettingsNotified *notified; guint freeze_count; GList *notify_funcs; } GWDSettingsImplPrivate; static void append_to_notify_funcs (GWDSettingsImpl *settings, NotifyFunc func) { GWDSettingsImplPrivate *priv = GET_PRIVATE (settings); /* Remove if found, the new one will replace the old one */ GList *link = g_list_find (priv->notify_funcs, func); if (link) priv->notify_funcs = g_list_remove_link (priv->notify_funcs, link); priv->notify_funcs = g_list_append (priv->notify_funcs, (gpointer) func); } static void invoke_notify_func (gpointer data, gpointer user_data) { GWDSettingsNotified *notified = (GWDSettingsNotified *) user_data; NotifyFunc func = (NotifyFunc) data; (*func) (notified); } static void release_notify_funcs (GWDSettingsImpl *settings) { GWDSettingsImplPrivate *priv = GET_PRIVATE (settings); if (priv->freeze_count) return; g_list_foreach (priv->notify_funcs, invoke_notify_func, priv->notified); g_list_free (priv->notify_funcs); priv->notify_funcs = NULL; } gboolean gwd_settings_shadow_property_changed (GWDSettingsWritable *settings, gdouble active_shadow_radius, gdouble active_shadow_opacity, gdouble active_shadow_offset_x, gdouble active_shadow_offset_y, const gchar *active_shadow_color, gdouble inactive_shadow_radius, gdouble inactive_shadow_opacity, gdouble inactive_shadow_offset_x, gdouble inactive_shadow_offset_y, const gchar *inactive_shadow_color) { GWDSettingsImpl *settings_impl = GWD_SETTINGS_IMPL (settings); GWDSettingsImplPrivate *priv = GET_PRIVATE (settings_impl); decor_shadow_options_t active_shadow, inactive_shadow; unsigned int c[4]; gboolean changed = FALSE; active_shadow.shadow_radius = active_shadow_radius; active_shadow.shadow_opacity = active_shadow_opacity; active_shadow.shadow_offset_x = active_shadow_offset_x; active_shadow.shadow_offset_y = active_shadow_offset_y; if (sscanf (active_shadow_color, "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4) { active_shadow.shadow_color[0] = c[0] << 8 | c[0]; active_shadow.shadow_color[1] = c[1] << 8 | c[1]; active_shadow.shadow_color[2] = c[2] << 8 | c[2]; } else return FALSE; if (sscanf (inactive_shadow_color, "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4) { inactive_shadow.shadow_color[0] = c[0] << 8 | c[0]; inactive_shadow.shadow_color[1] = c[1] << 8 | c[1]; inactive_shadow.shadow_color[2] = c[2] << 8 | c[2]; } else return FALSE; inactive_shadow.shadow_radius = inactive_shadow_radius; inactive_shadow.shadow_opacity = inactive_shadow_opacity; inactive_shadow.shadow_offset_x = inactive_shadow_offset_x; inactive_shadow.shadow_offset_y = inactive_shadow_offset_y; if (decor_shadow_options_cmp (&priv->inactive_shadow, &inactive_shadow)) { changed |= TRUE; priv->inactive_shadow = inactive_shadow; } if (decor_shadow_options_cmp (&priv->active_shadow, &active_shadow)) { changed |= TRUE; priv->active_shadow = active_shadow; } if (changed) { append_to_notify_funcs (settings_impl, gwd_settings_notified_update_decorations); release_notify_funcs (settings_impl); } return changed; } static gboolean gwd_settings_use_tooltips_changed (GWDSettingsWritable *settings, gboolean use_tooltips) { GWDSettingsImpl *settings_impl = GWD_SETTINGS_IMPL (settings); GWDSettingsImplPrivate *priv = GET_PRIVATE (settings_impl); if (priv->use_tooltips != use_tooltips) { priv->use_tooltips = use_tooltips; append_to_notify_funcs (settings_impl, gwd_settings_notified_update_decorations); release_notify_funcs (settings_impl); return TRUE; } return FALSE; } static gboolean gwd_settings_draggable_border_width_changed (GWDSettingsWritable *settings, gint draggable_border_width) { GWDSettingsImpl *settings_impl = GWD_SETTINGS_IMPL (settings); GWDSettingsImplPrivate *priv = GET_PRIVATE (settings_impl); if (priv->draggable_border_width != draggable_border_width) { priv->draggable_border_width = draggable_border_width; append_to_notify_funcs (settings_impl, gwd_settings_notified_update_decorations); release_notify_funcs (settings_impl); return TRUE; } else return FALSE; } static gboolean gwd_settings_attach_modal_dialogs_changed (GWDSettingsWritable *settings, gboolean attach_modal_dialogs) { GWDSettingsImpl *settings_impl = GWD_SETTINGS_IMPL (settings); GWDSettingsImplPrivate *priv = GET_PRIVATE (settings_impl); if (priv->attach_modal_dialogs != attach_modal_dialogs) { priv->attach_modal_dialogs = attach_modal_dialogs; append_to_notify_funcs (settings_impl, gwd_settings_notified_update_decorations); release_notify_funcs (settings_impl); return TRUE; } else return FALSE; } static gboolean gwd_settings_blur_changed (GWDSettingsWritable *settings, const gchar *type) { GWDSettingsImpl *settings_impl = GWD_SETTINGS_IMPL (settings); GWDSettingsImplPrivate *priv = GET_PRIVATE (settings_impl); gint new_type = -1; if (priv->cmdline_opts & CMDLINE_BLUR) return FALSE; if (strcmp (type, "titlebar") == 0) new_type = BLUR_TYPE_TITLEBAR; else if (strcmp (type, "all") == 0) new_type = BLUR_TYPE_ALL; else if (strcmp (type, "none") == 0) new_type = BLUR_TYPE_NONE; if (new_type == -1) return FALSE; if (priv->blur_type != new_type) { priv->blur_type = new_type; append_to_notify_funcs (settings_impl, gwd_settings_notified_update_decorations); release_notify_funcs (settings_impl); return TRUE; } else return FALSE; } static void free_and_set_metacity_theme (GWDSettingsWritable *settings, const gchar *metacity_theme) { GWDSettingsImpl *settings_impl = GWD_SETTINGS_IMPL (settings); GWDSettingsImplPrivate *priv = GET_PRIVATE (settings_impl); if (priv->metacity_theme) g_free (priv->metacity_theme); priv->metacity_theme = g_strdup (metacity_theme); } static gboolean gwd_settings_metacity_theme_changed (GWDSettingsWritable *settings, gboolean use_metacity_theme, const gchar *metacity_theme) { GWDSettingsImpl *settings_impl = GWD_SETTINGS_IMPL (settings); GWDSettingsImplPrivate *priv = GET_PRIVATE (settings_impl); if (priv->cmdline_opts & CMDLINE_THEME) return FALSE; if (!metacity_theme) return FALSE; if (use_metacity_theme) { if (g_strcmp0 (metacity_theme, priv->metacity_theme) == 0) return FALSE; free_and_set_metacity_theme (settings, metacity_theme); } else free_and_set_metacity_theme (settings, ""); append_to_notify_funcs (settings_impl, gwd_settings_notified_update_metacity_theme); append_to_notify_funcs (settings_impl, gwd_settings_notified_update_decorations); release_notify_funcs (settings_impl); return TRUE; } static gboolean gwd_settings_opacity_changed (GWDSettingsWritable *settings, gdouble active_opacity, gdouble inactive_opacity, gboolean active_shade_opacity, gboolean inactive_shade_opacity) { GWDSettingsImpl *settings_impl = GWD_SETTINGS_IMPL (settings); GWDSettingsImplPrivate *priv = GET_PRIVATE (settings_impl); if (priv->metacity_active_opacity == active_opacity && priv->metacity_inactive_opacity == inactive_opacity && priv->metacity_active_shade_opacity == active_shade_opacity && priv->metacity_inactive_shade_opacity == inactive_shade_opacity) return FALSE; priv->metacity_active_opacity = active_opacity; priv->metacity_inactive_opacity = inactive_opacity; priv->metacity_active_shade_opacity = active_shade_opacity; priv->metacity_inactive_shade_opacity = inactive_shade_opacity; append_to_notify_funcs (settings_impl, gwd_settings_notified_update_decorations); release_notify_funcs (settings_impl); return TRUE; } static gboolean gwd_settings_button_layout_changed (GWDSettingsWritable *settings, const gchar *button_layout) { GWDSettingsImpl *settings_impl = GWD_SETTINGS_IMPL (settings); GWDSettingsImplPrivate *priv = GET_PRIVATE (settings_impl); if (!button_layout) return FALSE; if (g_strcmp0 (priv->metacity_button_layout, button_layout) == 0) return FALSE; if (priv->metacity_button_layout) g_free (priv->metacity_button_layout); priv->metacity_button_layout = g_strdup (button_layout); append_to_notify_funcs (settings_impl, gwd_settings_notified_metacity_button_layout); append_to_notify_funcs (settings_impl, gwd_settings_notified_update_decorations); release_notify_funcs (settings_impl); return TRUE; } static gboolean gwd_settings_font_changed (GWDSettingsWritable *settings, gboolean titlebar_uses_system_font, const gchar *titlebar_font) { GWDSettingsImpl *settings_impl = GWD_SETTINGS_IMPL (settings); GWDSettingsImplPrivate *priv = GET_PRIVATE (settings_impl); const gchar *no_font = NULL; const gchar *use_font = NULL; if (!titlebar_font) return FALSE; if (titlebar_uses_system_font) use_font = no_font; else use_font = titlebar_font; if (g_strcmp0 (priv->titlebar_font, use_font) == 0) return FALSE; if (priv->titlebar_font) { g_free (priv->titlebar_font); priv->titlebar_font = NULL; } priv->titlebar_font = use_font ? g_strdup (use_font) : NULL; append_to_notify_funcs (settings_impl, gwd_settings_notified_update_decorations); append_to_notify_funcs (settings_impl, gwd_settings_notified_update_frames); release_notify_funcs (settings_impl); return TRUE; } static gboolean get_click_action_value (const gchar *action, gint *action_value, gint default_value) { if (!action_value) return FALSE; *action_value = -1; if (strcmp (action, "toggle_shade") == 0) *action_value = CLICK_ACTION_SHADE; else if (strcmp (action, "toggle_maximize") == 0) *action_value = CLICK_ACTION_MAXIMIZE; else if (strcmp (action, "minimize") == 0) *action_value = CLICK_ACTION_MINIMIZE; else if (strcmp (action, "raise") == 0) *action_value = CLICK_ACTION_RAISE; else if (strcmp (action, "lower") == 0) *action_value = CLICK_ACTION_LOWER; else if (strcmp (action, "menu") == 0) *action_value = CLICK_ACTION_MENU; else if (strcmp (action, "none") == 0) *action_value = CLICK_ACTION_NONE; if (*action_value == -1) { *action_value = default_value; return FALSE; } return TRUE; } static gboolean get_wheel_action_value (const gchar *action, gint *action_value, gint default_value) { if (!action_value) return FALSE; *action_value = -1; if (strcmp (action, "shade") == 0) *action_value = WHEEL_ACTION_SHADE; else if (strcmp (action, "none") == 0) *action_value = WHEEL_ACTION_NONE; if (*action_value == -1) { *action_value = default_value; return FALSE; } return TRUE; } static gboolean gwd_settings_actions_changed (GWDSettingsWritable *settings, const gchar *action_double_click_titlebar, const gchar *action_middle_click_titlebar, const gchar *action_right_click_titlebar, const gchar *mouse_wheel_action) { GWDSettingsImpl *settings_impl = GWD_SETTINGS_IMPL (settings); GWDSettingsImplPrivate *priv = GET_PRIVATE (settings_impl); gboolean ret = FALSE; ret |= get_click_action_value (action_double_click_titlebar, &priv->titlebar_double_click_action, DOUBLE_CLICK_ACTION_DEFAULT); ret |= get_click_action_value (action_middle_click_titlebar, &priv->titlebar_middle_click_action, MIDDLE_CLICK_ACTION_DEFAULT); ret |= get_click_action_value (action_right_click_titlebar, &priv->titlebar_right_click_action, RIGHT_CLICK_ACTION_DEFAULT); ret |= get_wheel_action_value (mouse_wheel_action, &priv->mouse_wheel_action, WHEEL_ACTION_DEFAULT); return ret; } static void gwd_settings_freeze_updates (GWDSettingsWritable *writable) { GWDSettingsImplPrivate *priv = GET_PRIVATE (writable); ++priv->freeze_count; } static void gwd_settings_thaw_updates (GWDSettingsWritable *writable) { GWDSettingsImplPrivate *priv = GET_PRIVATE (writable); if (priv->freeze_count) --priv->freeze_count; release_notify_funcs (GWD_SETTINGS_IMPL (writable)); } static void gwd_settings_writable_interface_init (GWDSettingsWritableInterface *interface) { interface->shadow_property_changed = gwd_settings_shadow_property_changed; interface->use_tooltips_changed = gwd_settings_use_tooltips_changed; interface->draggable_border_width_changed = gwd_settings_draggable_border_width_changed; interface->attach_modal_dialogs_changed = gwd_settings_attach_modal_dialogs_changed; interface->blur_changed = gwd_settings_blur_changed; interface->metacity_theme_changed = gwd_settings_metacity_theme_changed; interface->opacity_changed = gwd_settings_opacity_changed; interface->button_layout_changed = gwd_settings_button_layout_changed; interface->font_changed = gwd_settings_font_changed; interface->titlebar_actions_changed = gwd_settings_actions_changed; interface->freeze_updates = gwd_settings_freeze_updates; interface->thaw_updates = gwd_settings_thaw_updates; } static void gwd_settings_interface_init (GWDSettingsInterface *interface) { } static void gwd_settings_dispose (GObject *object) { G_OBJECT_CLASS (gwd_settings_impl_parent_class)->dispose (object); } static void gwd_settings_finalize (GObject *object) { GWDSettingsImplPrivate *priv = GET_PRIVATE (object); G_OBJECT_CLASS (gwd_settings_impl_parent_class)->finalize (object); if (priv->metacity_theme) { g_free (priv->metacity_theme); priv->metacity_theme = NULL; } if (priv->metacity_button_layout) { g_free (priv->metacity_button_layout); priv->metacity_button_layout = NULL; } if (priv->titlebar_font) { g_free (priv->titlebar_font); priv->titlebar_font = NULL; } if (priv->notified) { g_object_unref (priv->notified); priv->notified = NULL; } } static void gwd_settings_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDSettingsImplPrivate *priv = GET_PRIVATE (object); switch (property_id) { case GWD_SETTINGS_IMPL_PROPERTY_CMDLINE_OPTIONS: priv->cmdline_opts = g_value_get_int (value); break; case GWD_SETTINGS_IMPL_PROPERTY_BLUR_CHANGED: priv->blur_type = g_value_get_int (value); break; case GWD_SETTINGS_IMPL_PROPERTY_METACITY_THEME: if (priv->metacity_theme) g_free (priv->metacity_theme); priv->metacity_theme = g_value_dup_string (value); break; case GWD_SETTINGS_IMPL_PROPERTY_SETTINGS_NOTIFIED: g_return_if_fail (!priv->notified); priv->notified = (GWDSettingsNotified *) g_value_get_pointer (value); default: break; } } static void gwd_settings_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { GWDSettingsImplPrivate *priv = GET_PRIVATE (object); switch (property_id) { case GWD_SETTINGS_IMPL_PROPERTY_ACTIVE_SHADOW: g_value_set_pointer (value, &priv->active_shadow); break; case GWD_SETTINGS_IMPL_PROPERTY_INACTIVE_SHADOW: g_value_set_pointer (value, &priv->inactive_shadow); break; case GWD_SETTINGS_IMPL_PROPERTY_USE_TOOLTIPS: g_value_set_boolean (value, priv->use_tooltips); break; case GWD_SETTINGS_IMPL_PROPERTY_DRAGGABLE_BORDER_WIDTH: g_value_set_int (value, priv->draggable_border_width); break; case GWD_SETTINGS_IMPL_PROPERTY_ATTACH_MODAL_DIALOGS: g_value_set_boolean (value, priv->attach_modal_dialogs); break; case GWD_SETTINGS_IMPL_PROPERTY_BLUR_CHANGED: g_value_set_int (value, priv->blur_type); break; case GWD_SETTINGS_IMPL_PROPERTY_METACITY_THEME: g_value_set_string (value, priv->metacity_theme); break; case GWD_SETTINGS_IMPL_PROPERTY_ACTIVE_OPACITY: g_value_set_double (value, priv->metacity_active_opacity); break; case GWD_SETTINGS_IMPL_PROPERTY_INACTIVE_OPACITY: g_value_set_double (value, priv->metacity_inactive_opacity); break; case GWD_SETTINGS_IMPL_PROPERTY_ACTIVE_SHADE_OPACITY: g_value_set_boolean (value, priv->metacity_active_shade_opacity); break; case GWD_SETTINGS_IMPL_PROPERTY_INACTIVE_SHADE_OPACITY: g_value_set_boolean (value, priv->metacity_inactive_shade_opacity); break; case GWD_SETTINGS_IMPL_PROPERTY_BUTTON_LAYOUT: g_value_set_string (value, priv->metacity_button_layout); break; case GWD_SETTINGS_IMPL_PROPERTY_TITLEBAR_ACTION_DOUBLE_CLICK: g_value_set_int (value, priv->titlebar_double_click_action); break; case GWD_SETTINGS_IMPL_PROPERTY_TITLEBAR_ACTION_MIDDLE_CLICK: g_value_set_int (value, priv->titlebar_middle_click_action); break; case GWD_SETTINGS_IMPL_PROPERTY_TITLEBAR_ACTION_RIGHT_CLICK: g_value_set_int (value, priv->titlebar_right_click_action); break; case GWD_SETTINGS_IMPL_PROPERTY_MOUSE_WHEEL_ACTION: g_value_set_int (value, priv->mouse_wheel_action); break; case GWD_SETTINGS_IMPL_PROPERTY_TITLEBAR_FONT: g_value_set_string (value, priv->titlebar_font); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void gwd_settings_impl_class_init (GWDSettingsImplClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); g_type_class_add_private (klass, sizeof (GWDSettingsImplPrivate)); object_class->dispose = gwd_settings_dispose; object_class->finalize = gwd_settings_finalize; object_class->get_property = gwd_settings_get_property; object_class->set_property = gwd_settings_set_property; g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_ACTIVE_SHADOW, "active-shadow"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_INACTIVE_SHADOW, "inactive-shadow"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_USE_TOOLTIPS, "use-tooltips"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_DRAGGABLE_BORDER_WIDTH, "draggable-border-width"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_ATTACH_MODAL_DIALOGS, "attach-modal-dialogs"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_BLUR_CHANGED, "blur"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_METACITY_THEME, "metacity-theme"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_ACTIVE_OPACITY, "metacity-active-opacity"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_INACTIVE_OPACITY, "metacity-inactive-opacity"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_ACTIVE_SHADE_OPACITY, "metacity-active-shade-opacity"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_INACTIVE_SHADE_OPACITY, "metacity-inactive-shade-opacity"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_BUTTON_LAYOUT, "metacity-button-layout"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_TITLEBAR_ACTION_DOUBLE_CLICK, "titlebar-double-click-action"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_TITLEBAR_ACTION_MIDDLE_CLICK, "titlebar-middle-click-action"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_TITLEBAR_ACTION_RIGHT_CLICK, "titlebar-right-click-action"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_MOUSE_WHEEL_ACTION, "mouse-wheel-action"); g_object_class_override_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_TITLEBAR_FONT, "titlebar-font"); g_object_class_install_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_CMDLINE_OPTIONS, g_param_spec_int ("cmdline-options", "Command line options", "Which options were specified on the command line", 0, G_MAXINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (object_class, GWD_SETTINGS_IMPL_PROPERTY_SETTINGS_NOTIFIED, g_param_spec_pointer ("settings-notified", "GWDSettingsNotified", "A GWDSettingsNotified which will be updated", G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); } static void gwd_settings_impl_init (GWDSettingsImpl *self) { GWDSettingsImplPrivate *priv = GET_PRIVATE (self); priv->use_tooltips = USE_TOOLTIPS_DEFAULT; priv->active_shadow.shadow_radius = ACTIVE_SHADOW_RADIUS_DEFAULT; priv->active_shadow.shadow_opacity = ACTIVE_SHADOW_OPACITY_DEFAULT; priv->active_shadow.shadow_offset_x = ACTIVE_SHADOW_OFFSET_X_DEFAULT; priv->active_shadow.shadow_offset_y = ACTIVE_SHADOW_OFFSET_Y_DEFAULT; priv->active_shadow.shadow_color[0] = 0; priv->active_shadow.shadow_color[1] = 0; priv->active_shadow.shadow_color[2] = 0; priv->inactive_shadow.shadow_radius = INACTIVE_SHADOW_RADIUS_DEFAULT; priv->inactive_shadow.shadow_opacity = INACTIVE_SHADOW_OPACITY_DEFAULT; priv->inactive_shadow.shadow_offset_x = INACTIVE_SHADOW_OFFSET_X_DEFAULT; priv->inactive_shadow.shadow_offset_y = INACTIVE_SHADOW_OFFSET_Y_DEFAULT; priv->inactive_shadow.shadow_color[0] = 0; priv->inactive_shadow.shadow_color[1] = 0; priv->inactive_shadow.shadow_color[2] = 0; priv->draggable_border_width = DRAGGABLE_BORDER_WIDTH_DEFAULT; priv->attach_modal_dialogs = ATTACH_MODAL_DIALOGS_DEFAULT; priv->blur_type = BLUR_TYPE_DEFAULT; priv->metacity_theme = g_strdup (METACITY_THEME_DEFAULT); priv->metacity_active_opacity = METACITY_ACTIVE_OPACITY_DEFAULT; priv->metacity_inactive_opacity = METACITY_INACTIVE_OPACITY_DEFAULT; priv->metacity_active_shade_opacity = METACITY_ACTIVE_SHADE_OPACITY_DEFAULT; priv->metacity_inactive_shade_opacity = METACITY_INACTIVE_SHADE_OPACITY_DEFAULT; priv->metacity_button_layout = g_strdup (METACITY_BUTTON_LAYOUT_DEFAULT); priv->titlebar_double_click_action = DOUBLE_CLICK_ACTION_DEFAULT; priv->titlebar_middle_click_action = MIDDLE_CLICK_ACTION_DEFAULT; priv->titlebar_right_click_action = RIGHT_CLICK_ACTION_DEFAULT; priv->mouse_wheel_action = WHEEL_ACTION_DEFAULT; priv->titlebar_font = g_strdup (TITLEBAR_FONT_DEFAULT); priv->cmdline_opts = 0; priv->notified = NULL; priv->freeze_count = 0; /* Append all notify funcs so that external state can be updated in case * the settings backend can't do it itself */ append_to_notify_funcs (self, gwd_settings_notified_update_metacity_theme); append_to_notify_funcs (self, gwd_settings_notified_metacity_button_layout); append_to_notify_funcs (self, gwd_settings_notified_update_frames); append_to_notify_funcs (self, gwd_settings_notified_update_decorations); } static gboolean set_blur_construction_value (gint *blur, GParameter *params, GValue *blur_value) { if (blur) { g_value_set_int (blur_value, *blur); params->name = "blur"; params->value = *blur_value; return TRUE; } return FALSE; } static gboolean set_metacity_theme_construction_value (const gchar **metacity_theme, GParameter *params, GValue *metacity_theme_value) { if (metacity_theme) { g_value_set_string (metacity_theme_value, *metacity_theme); params->name = "metacity-theme"; params->value = *metacity_theme_value; return TRUE; } return FALSE; } static guint set_flag_and_increment (guint n_param, guint *flags, guint flag) { if (!flags) return n_param; *flags |= flag; return n_param + 1; } GWDSettings * gwd_settings_impl_new (gint *blur, const gchar **metacity_theme, GWDSettingsNotified *notified) { /* Always N command line parameters + 2 for command line * options enum & notified */ const guint gwd_settings_impl_n_construction_params = 4; GParameter param[gwd_settings_impl_n_construction_params]; GWDSettings *settings = NULL; int n_param = 0; guint cmdline_opts = 0; GValue blur_value = G_VALUE_INIT; GValue metacity_theme_value = G_VALUE_INIT; GValue cmdline_opts_value = G_VALUE_INIT; GValue settings_notified_value = G_VALUE_INIT; g_value_init (&blur_value, G_TYPE_INT); g_value_init (&metacity_theme_value, G_TYPE_STRING); g_value_init (&cmdline_opts_value, G_TYPE_INT); g_value_init (&settings_notified_value, G_TYPE_POINTER); if (set_blur_construction_value (blur, ¶m[n_param], &blur_value)) n_param = set_flag_and_increment (n_param, &cmdline_opts, CMDLINE_BLUR); if (set_metacity_theme_construction_value (metacity_theme, ¶m[n_param], &metacity_theme_value)) n_param = set_flag_and_increment (n_param, &cmdline_opts, CMDLINE_THEME); g_value_set_int (&cmdline_opts_value, cmdline_opts); param[n_param].name = "cmdline-options"; param[n_param].value = cmdline_opts_value; ++n_param; g_value_set_pointer (&settings_notified_value, notified); param[n_param].name = "settings-notified"; param[n_param].value = settings_notified_value; ++n_param; settings = GWD_SETTINGS_INTERFACE (g_object_newv (GWD_TYPE_SETTINGS_IMPL, n_param, param)); g_value_unset (&blur_value); g_value_unset (&metacity_theme_value); g_value_unset (&cmdline_opts_value); return settings; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/CMakeLists.txt0000644000015301777760000001152712321343002024314 0ustar pbusernogroup00000000000000if (USE_GTK) if (COMPIZ_BUILD_WITH_RPATH) set (CMAKE_INSTALL_RPATH ${libdir}) endif (COMPIZ_BUILD_WITH_RPATH) include_directories ( ${CMAKE_CURRENT_SOURCE_DIR} ${compiz_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/gtk ${GTK_WINDOW_DECORATOR_INCLUDE_DIRS} ${METACITY_INCLUDE_DIRS} ${GCONF_INCLUDE_DIRS} ${DBUS_GLIB_INCLUDE_DIRS} ) add_definitions ( -DHAVE_CONFIG_H -DALL_LINGUAS=\"${ALL_LINGUAS}\" -DLOCALEDIR=\\\"${datadir}/locale\\\" ) link_directories ( ${COMPIZ_LINK_DIRS} ) add_library (gtk_window_decorator_metacity_window_decoration_util ${CMAKE_CURRENT_SOURCE_DIR}/gwd-metacity-window-decoration-util.c) add_library (gtk_window_decorator_cairo_window_decoration_util ${CMAKE_CURRENT_SOURCE_DIR}/gwd-cairo-window-decoration-util.c) add_library (gtk_window_decorator_settings_interface STATIC ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings-interface.c) add_library (gtk_window_decorator_settings STATIC ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings.c) add_library (gtk_window_decorator_settings_storage_interface STATIC ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings-storage-interface.c) add_library (gtk_window_decorator_settings_storage_xproperty_interface STATIC ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings-xproperty-interface.c) add_library (gtk_window_decorator_settings_writable_interface STATIC ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings-writable-interface.c) add_library (gtk_window_decorator_settings_notified_interface ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings-notified-interface.c) set (GTK_WINDOW_DECORATOR_ADDITIONAL_LIBRARIES gtk_window_decorator_settings_notified_interface gtk_window_decorator_settings_interface gtk_window_decorator_settings_writable_interface gtk_window_decorator_settings gtk_window_decorator_settings_storage_interface gtk_window_decorator_settings_storage_xproperty_interface gtk_window_decorator_metacity_window_decoration_util gtk_window_decorator_cairo_window_decoration_util) if (USE_GCONF) set (gwd_schema ${CMAKE_CURRENT_BINARY_DIR}/gwd.schemas) compiz_translate_xml ( ${CMAKE_CURRENT_SOURCE_DIR}/gwd.schemas.in ${gwd_schema} ) compiz_install_gconf_schema (${CMAKE_CURRENT_BINARY_DIR}/gwd.schemas ${SCHEMADIR}) add_library (gtk_window_decorator_settings_storage_gconf STATIC ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings-storage-gconf.c) list (APPEND GTK_WINDOW_DECORATOR_ADDITIONAL_LIBRARIES gtk_window_decorator_settings_storage_gconf) endif (USE_GCONF) if (USE_GSETTINGS) add_definitions (-DUSE_GSETTINGS) add_library (gtk_window_decorator_settings_storage_gsettings STATIC ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings-storage-gsettings.c) compiz_pkg_check_modules (GSETTINGS gio-2.0 glib-2.0) target_link_libraries (gtk_window_decorator_settings_storage_gsettings ${GSETTINGS_LIBRARIES}) list (APPEND GTK_WINDOW_DECORATOR_ADDITIONAL_LIBRARIES gtk_window_decorator_settings_storage_gsettings) set (_gwd_gschema_name org.compiz.gwd) set (_gwd_gschema_filename ${_gwd_gschema_name}.gschema.xml) set (_gwd_gschema_filepath ${CMAKE_CURRENT_SOURCE_DIR}/${_gwd_gschema_filename}) set (_gwd_gschema_generated_location ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/${_gwd_gschema_filename}) set (_gwd_gschema_dest ${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas/) add_custom_command (OUTPUT ${_gwd_gschema_generated_location} COMMAND cp -r ${_gwd_gschema_filepath} ${_gwd_gschema_generated_location} DEPENDS ${_gwd_gschema_filepath} VERBATIM) add_custom_target (compiz_gwd_gsettings_org_compiz_gwd_schema ALL DEPENDS ${_gwd_gschema_generated_location}) add_gsettings_schema_to_recompilation_list (compiz_gwd_gsettings_org_compiz_gwd_schema) compiz_install_gsettings_schema (${_gwd_gschema_generated_location} ${_gwd_gschema_dest}) endif (USE_GSETTINGS) add_executable (gtk-window-decorator gtk-window-decorator.c blurprops.c decorprops.c cairo.c frames.c gdk.c switcher.c metacity.c events.c forcequit.c tooltip.c actionmenu.c settings.c util.c style.c wnck.c decorator.c ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings-xproperty-storage.c ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings-notified.c ${gwd_schema} ) add_dependencies (gtk-window-decorator decoration) if (USE_METACITY) set (metacitylibs ${METACITY_LIBRARIES}) endif (USE_METACITY) target_link_libraries ( gtk-window-decorator decoration ${GTK_WINDOW_DECORATOR_LIBRARIES} ${GCONF_LIBRARIES} ${DBUS_GLIB_LIBRARIES} ${metacitylibs} ${GTK_WINDOW_DECORATOR_ADDITIONAL_LIBRARIES} ) install ( TARGETS gtk-window-decorator DESTINATION ${exec_prefix} ) if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) endif (USE_GTK) compiz-0.9.11+14.04.20140409/gtk/window-decorator/gtk-window-decorator.h0000644000015301777760000006330712321343002026002 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #ifndef _GTK_WINDOW_DECORATOR_H #define _GTK_WINDOW_DECORATOR_H #ifdef HAVE_CONFIG_H #include #endif #include "decoration.h" #include #include #include #include #include #ifdef HAVE_GTK_2_24 #ifndef GDK_DISABLE_DEPRECATED #define GDK_DISABLE_DEPRECATED #endif #define create_foreign_window(xid) \ gdk_x11_window_foreign_new_for_display (gdk_display_get_default (), \ xid) #else #define create_foreign_window(xid) \ gdk_window_foreign_new (xid) #ifdef GDK_DISABLE_DEPRECATED #undef GDK_DISABLE_DEPRECATED #endif #endif #ifndef GTK_DISABLE_DEPRECATED #define GTK_DISABLE_DEPRECATED #endif #include #include #include #ifdef USE_GCONF #include #endif #ifdef USE_DBUS_GLIB #define DBUS_API_SUBJECT_TO_CHANGE #include #include #endif #define WNCK_I_KNOW_THIS_IS_UNSTABLE #include #include #ifndef HAVE_LIBWNCK_2_19_4 #define wnck_window_get_client_window_geometry wnck_window_get_geometry #endif #include #include #if CAIRO_VERSION < CAIRO_VERSION_ENCODE(1, 1, 0) #define CAIRO_EXTEND_PAD CAIRO_EXTEND_NONE #endif #include #include #include #include #include #include #include #include #include #include #define _(x) gettext (x) #define N_(x) x #ifdef USE_METACITY #include #endif #include #define METACITY_GCONF_DIR "/apps/metacity/general" #define MUTTER_GCONF_DIR "/apps/mutter/general" #define COMPIZ_USE_SYSTEM_FONT_KEY \ METACITY_GCONF_DIR "/titlebar_uses_system_font" #define COMPIZ_TITLEBAR_FONT_KEY \ METACITY_GCONF_DIR "/titlebar_font" #define COMPIZ_DOUBLE_CLICK_TITLEBAR_KEY \ METACITY_GCONF_DIR "/action_double_click_titlebar" #define COMPIZ_MIDDLE_CLICK_TITLEBAR_KEY \ METACITY_GCONF_DIR "/action_middle_click_titlebar" #define COMPIZ_RIGHT_CLICK_TITLEBAR_KEY \ METACITY_GCONF_DIR "/action_right_click_titlebar" #define MUTTER_DRAGGABLE_BORDER_WIDTH_KEY \ MUTTER_GCONF_DIR "/draggable_border_width" #define MUTTER_ATTACH_MODAL_DIALOGS_KEY \ MUTTER_GCONF_DIR "/attach_modal_dialogs" #define META_THEME_KEY \ METACITY_GCONF_DIR "/theme" #define META_BUTTON_LAYOUT_KEY \ METACITY_GCONF_DIR "/button_layout" #define GCONF_DIR "/apps/gwd" #define USE_META_THEME_KEY \ GCONF_DIR "/use_metacity_theme" #define META_THEME_OPACITY_KEY \ GCONF_DIR "/metacity_theme_opacity" #define META_THEME_SHADE_OPACITY_KEY \ GCONF_DIR "/metacity_theme_shade_opacity" #define META_THEME_ACTIVE_OPACITY_KEY \ GCONF_DIR "/metacity_theme_active_opacity" #define META_THEME_ACTIVE_SHADE_OPACITY_KEY \ GCONF_DIR "/metacity_theme_active_shade_opacity" #define BLUR_TYPE_KEY \ GCONF_DIR "/blur_type" #define WHEEL_ACTION_KEY \ GCONF_DIR "/mouse_wheel_action" #define USE_TOOLTIPS_KEY \ GCONF_DIR "/use_tooltips" #define DBUS_DEST "org.freedesktop.compiz" #define DBUS_PATH "/org/freedesktop/compiz/decor/screen0" #define DBUS_INTERFACE "org.freedesktop.compiz" #define DBUS_METHOD_GET "get" extern const float STROKE_ALPHA; extern const unsigned short ICON_SPACE; extern const float DOUBLE_CLICK_DISTANCE; #define WM_MOVERESIZE_SIZE_TOPLEFT 0 #define WM_MOVERESIZE_SIZE_TOP 1 #define WM_MOVERESIZE_SIZE_TOPRIGHT 2 #define WM_MOVERESIZE_SIZE_RIGHT 3 #define WM_MOVERESIZE_SIZE_BOTTOMRIGHT 4 #define WM_MOVERESIZE_SIZE_BOTTOM 5 #define WM_MOVERESIZE_SIZE_BOTTOMLEFT 6 #define WM_MOVERESIZE_SIZE_LEFT 7 #define WM_MOVERESIZE_MOVE 8 #define WM_MOVERESIZE_SIZE_KEYBOARD 9 #define WM_MOVERESIZE_MOVE_KEYBOARD 10 extern const float SHADOW_RADIUS; extern const float SHADOW_OPACITY; extern const unsigned short SHADOW_OFFSET_X; extern const unsigned short SHADOW_OFFSET_Y; #define SHADOW_COLOR_RED 0x0000 #define SHADOW_COLOR_GREEN 0x0000 #define SHADOW_COLOR_BLUE 0x0000 extern const float META_OPACITY; #define META_SHADE_OPACITY TRUE; extern const float META_ACTIVE_OPACITY; #define META_ACTIVE_SHADE_OPACITY TRUE; #define META_MAXIMIZED (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | \ WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY) #define CMDLINE_OPACITY (1 << 0) #define CMDLINE_OPACITY_SHADE (1 << 1) #define CMDLINE_ACTIVE_OPACITY (1 << 2) #define CMDLINE_ACTIVE_OPACITY_SHADE (1 << 3) #define CMDLINE_BLUR (1 << 4) #define CMDLINE_THEME (1 << 5) #define MWM_HINTS_DECORATIONS (1L << 1) #define MWM_DECOR_ALL (1L << 0) #define MWM_DECOR_BORDER (1L << 1) #define MWM_DECOR_HANDLE (1L << 2) #define MWM_DECOR_TITLE (1L << 3) #define MWM_DECOR_MENU (1L << 4) #define MWM_DECOR_MINIMIZE (1L << 5) #define MWM_DECOR_MAXIMIZE (1L << 6) #define PROP_MOTIF_WM_HINT_ELEMENTS 3 typedef struct { unsigned long flags; unsigned long functions; unsigned long decorations; } MwmHints; extern gboolean minimal; #define SWITCHER_SPACE 40 extern GWDSettingsNotified *notified; extern GWDSettings *settings; extern GWDSettingsWritable *writable; extern gdouble decoration_alpha; #ifdef USE_METACITY extern MetaButtonLayout meta_button_layout; extern gboolean meta_button_layout_set; #endif extern Atom frame_input_window_atom; extern Atom frame_output_window_atom; extern Atom win_decor_atom; extern Atom win_blur_decor_atom; extern Atom wm_move_resize_atom; extern Atom restack_window_atom; extern Atom select_window_atom; extern Atom mwm_hints_atom; extern Atom switcher_fg_atom; extern Atom compiz_shadow_info_atom; extern Atom compiz_shadow_color_atom; extern Atom toolkit_action_atom; extern Atom toolkit_action_window_menu_atom; extern Atom toolkit_action_force_quit_dialog_atom; extern Atom net_wm_state_atom; extern Atom net_wm_state_modal_atom; extern Atom decor_request_atom; extern Atom decor_pending_atom; extern Atom decor_delete_pixmap_atom; extern Time dm_sn_timestamp; #define C(name) { 0, XC_ ## name } struct _cursor { Cursor cursor; unsigned int shape; }; extern struct _cursor cursor[3][3]; #define BUTTON_CLOSE 0 #define BUTTON_MAX 1 #define BUTTON_MIN 2 #define BUTTON_MENU 3 #define BUTTON_SHADE 4 #define BUTTON_ABOVE 5 #define BUTTON_STICK 6 #define BUTTON_UNSHADE 7 #define BUTTON_UNABOVE 8 #define BUTTON_UNSTICK 9 #define BUTTON_NUM 10 struct _pos { int x, y, w, h; int xw, yh, ww, hh, yth, hth; }; extern struct _pos pos[3][3], bpos[]; typedef struct _decor_color { double r; double g; double b; } decor_color_t; #define IN_EVENT_WINDOW (1 << 0) #define PRESSED_EVENT_WINDOW (1 << 1) typedef struct _decor_event { guint time; guint window; guint x; guint y; guint x_root; guint y_root; guint button; } decor_event; typedef enum _decor_event_type { GButtonPress = 1, GButtonRelease, GEnterNotify, GLeaveNotify, GMotionNotify } decor_event_type; typedef void (*event_callback) (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); typedef struct { Window window; Box pos; event_callback callback; } event_window; typedef struct _decor_frame decor_frame_t; typedef struct _decor_shadow_info decor_shadow_info_t; struct _decor_shadow_info { decor_frame_t *frame; unsigned int state; gboolean active; }; typedef void (*frame_update_shadow_proc) (Display *display, Screen *screen, decor_frame_t *frame, decor_shadow_t **shadow_normal, decor_context_t *context_normal, decor_shadow_t **shadow_max, decor_context_t *context_max, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow); typedef decor_frame_t * (*create_frame_proc) (const gchar *); typedef void (*destroy_frame_proc) (decor_frame_t *); struct _decor_frame { decor_extents_t win_extents; decor_extents_t max_win_extents; int titlebar_height; int max_titlebar_height; decor_shadow_t *border_shadow_active; decor_shadow_t *border_shadow_inactive; decor_shadow_t *border_no_shadow; decor_shadow_t *max_border_shadow_active; decor_shadow_t *max_border_shadow_inactive; decor_shadow_t *max_border_no_shadow; decor_context_t window_context_active; decor_context_t window_context_inactive; decor_context_t window_context_no_shadow; decor_context_t max_window_context_active; decor_context_t max_window_context_inactive; decor_context_t max_window_context_no_shadow; PangoFontDescription *titlebar_font; PangoContext *pango_context; GtkWidget *style_window_rgba; GtkWidget *style_window_rgb; gint text_height; gchar *type; frame_update_shadow_proc update_shadow; gint refcount; }; typedef struct _decor { WnckWindow *win; decor_frame_t *frame; event_window event_windows[3][3]; event_window button_windows[BUTTON_NUM]; Box *last_pos_entered; guint button_states[BUTTON_NUM]; Pixmap x11Pixmap; GdkPixmap *pixmap; GdkPixmap *buffer_pixmap; GdkWindow *frame_window; GtkWidget *decor_window; GtkWidget *decor_event_box; GtkWidget *decor_image; cairo_t *cr; decor_layout_t border_layout; decor_context_t *context; decor_shadow_t *shadow; Picture picture; gint button_width; gint width; gint height; gint client_width; gint client_height; gboolean decorated; gboolean active; PangoLayout *layout; gchar *name; cairo_pattern_t *icon; GdkPixmap *icon_pixmap; GdkPixbuf *icon_pixbuf; WnckWindowState state; WnckWindowActions actions; XID prop_xid; GtkWidget *force_quit_dialog; Bool created; void (*draw) (struct _decor *d); } decor_t; #define WINDOW_TYPE_FRAMES_NUM 5 typedef struct _default_frame_references { char *name; decor_t *d; } default_frame_references_t; extern default_frame_references_t default_frames[WINDOW_TYPE_FRAMES_NUM * 2]; const gchar * window_type_frames[WINDOW_TYPE_FRAMES_NUM]; void (*theme_get_shadow) (decor_frame_t *d, decor_shadow_options_t *, gboolean); void (*theme_draw_window_decoration) (decor_t *d); gboolean (*theme_calc_decoration_size) (decor_t *d, int client_width, int client_height, int text_width, int *width, int *height); void (*theme_update_border_extents) (decor_frame_t *frame); void (*theme_get_event_window_position) (decor_t *d, gint i, gint j, gint width, gint height, gint *x, gint *y, gint *w, gint *h); gboolean (*theme_get_button_position) (decor_t *d, gint i, gint width, gint height, gint *x, gint *y, gint *w, gint *h); gfloat (*theme_get_title_scale) (decor_frame_t *frame); extern char *program_name; /* list of all decorations */ extern GHashTable *frame_table; /* action menu */ extern GtkWidget *action_menu; extern gboolean action_menu_mapped; extern decor_color_t _title_color[2]; extern gint double_click_timeout; /* tooltip */ extern GtkWidget *tip_window; extern GtkWidget *tip_label; extern GTimeVal tooltip_last_popdown; extern gint tooltip_timer_tag; extern GSList *draw_list; extern guint draw_idle_id; /* switcher */ extern Window switcher_selected_window; extern GtkWidget *switcher_label; extern decor_t *switcher_window; extern XRenderPictFormat *xformat_rgba; extern XRenderPictFormat *xformat_rgb; /* gtk-window-decorator.c */ double dist (double x1, double y1, double x2, double y2); /* frames.c */ void initialize_decorations (); void update_frames_border_extents (gpointer key, gpointer value, gpointer user_data); decor_frame_t * gwd_get_decor_frame (const gchar *); decor_frame_t * gwd_decor_frame_ref (decor_frame_t *); decor_frame_t * gwd_decor_frame_unref (decor_frame_t *); void gwd_frames_foreach (GHFunc foreach_func, gpointer user_data); void gwd_process_frames (GHFunc foreach_func, const gchar *frame_keys[], gint frame_keys_num, gpointer user_data); decor_frame_t * decor_frame_new (const gchar *type); void decor_frame_destroy (decor_frame_t *); /* decorator.c */ void frame_update_shadow (decor_frame_t *frame, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow); void frame_update_titlebar_font (decor_frame_t *frame); void bare_frame_update_shadow (Display *xdisplay, Screen *screen, decor_frame_t *frame, decor_shadow_t **shadow_normal, decor_context_t *context_normal, decor_shadow_t **shadow_max, decor_context_t *context_max, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow); void decor_frame_update_shadow (Display *xdisplay, Screen *screen, decor_frame_t *frame, decor_shadow_t **shadow_normal, decor_context_t *context_normal, decor_shadow_t **shadow_max, decor_context_t *context_max, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow); decor_frame_t * create_normal_frame (const gchar *type); void destroy_normal_frame (); decor_frame_t * create_bare_frame (const gchar *type); void destroy_bare_frame (); /* Don't use directly */ gboolean update_window_decoration_size (WnckWindow *win); gboolean request_update_window_decoration_size (WnckWindow *win); void update_window_decoration_name (WnckWindow *win); gint max_window_name_width (WnckWindow *win); unsigned int populate_frame_type (decor_t *d); unsigned int populate_frame_state (decor_t *d); unsigned int populate_frame_actions (decor_t *d); void update_default_decorations (GdkScreen *screen); void update_window_decoration_state (WnckWindow *win); void update_window_decoration_actions (WnckWindow *win); void update_window_decoration_icon (WnckWindow *win); void update_event_windows (WnckWindow *win); int update_shadow (void); void update_titlebar_font (); void update_window_decoration_name (WnckWindow *win); void update_window_decoration (WnckWindow *win); void queue_decor_draw (decor_t *d); void copy_to_front_buffer (decor_t *d); /* wnck.c*/ const gchar * get_frame_type (WnckWindow *win); void decorations_changed (WnckScreen *screen); void connect_screen (WnckScreen *screen); void window_opened (WnckScreen *screen, WnckWindow *window); void window_closed (WnckScreen *screen, WnckWindow *window); void add_frame_window (WnckWindow *win, Window frame, Bool mode); void remove_frame_window (WnckWindow *win); void restack_window (WnckWindow *win, int stack_mode); void connect_window (WnckWindow *win); /* blur.c */ void decor_update_blur_property (decor_t *d, int width, int height, Region top_region, int top_offset, Region bottom_region, int bottom_offset, Region left_region, int left_offset, Region right_region, int right_offset); /* decorprops.c */ void decor_update_window_property (decor_t *d); void decor_update_switcher_property (decor_t *d); /* cairo.c */ #define CORNER_TOPLEFT (1 << 0) #define CORNER_TOPRIGHT (1 << 1) #define CORNER_BOTTOMRIGHT (1 << 2) #define CORNER_BOTTOMLEFT (1 << 3) #define SHADE_LEFT (1 << 0) #define SHADE_RIGHT (1 << 1) #define SHADE_TOP (1 << 2) #define SHADE_BOTTOM (1 << 3) void draw_shadow_background (decor_t *d, cairo_t *cr, decor_shadow_t *s, decor_context_t *c); void draw_window_decoration (decor_t *d); void fill_rounded_rectangle (cairo_t *cr, double x, double y, double w, double h, double radius, int corner, decor_color_t *c0, double alpha0, decor_color_t *c1, double alpha1, int gravity); void rounded_rectangle (cairo_t *cr, double x, double y, double w, double h, double radius, int corner); gboolean calc_decoration_size (decor_t *d, gint w, gint h, gint name_width, gint *width, gint *height); void update_border_extents (); gboolean get_button_position (decor_t *d, gint i, gint width, gint height, gint *x, gint *y, gint *w, gint *h); void get_event_window_position (decor_t *d, gint i, gint j, gint width, gint height, gint *x, gint *y, gint *w, gint *h); gfloat get_title_scale (decor_frame_t *frame); void cairo_get_shadow (decor_frame_t *, decor_shadow_options_t *opts, gboolean active); /* gdk.c */ void gdk_cairo_set_source_color_alpha (cairo_t *cr, GdkColor *color, double alpha); GdkWindow * create_gdk_window (Window xframe); GdkColormap * get_colormap_for_drawable (GdkDrawable *d); XRenderPictFormat * get_format_for_drawable (decor_t *d, GdkDrawable *drawable); GdkPixmap * create_pixmap (int w, int h, GtkWidget *parent_style_window); GdkPixmap * create_native_pixmap_and_wrap (int w, int h, GtkWidget *parent_style_window); GdkPixmap * pixmap_new_from_pixbuf (GdkPixbuf *pixbuf, GtkWidget *parent); /* metacity.c */ #ifdef USE_METACITY MetaFrameType meta_get_frame_type_for_decor_type (const gchar *frame_type); void meta_draw_window_decoration (decor_t *d); void meta_get_decoration_geometry (decor_t *d, MetaTheme *theme, MetaFrameFlags *flags, MetaFrameGeometry *fgeom, MetaButtonLayout *button_layout, MetaFrameType frame_type, GdkRectangle *clip); void meta_calc_button_size (decor_t *d); gboolean meta_calc_decoration_size (decor_t *d, gint w, gint h, gint name_width, gint *width, gint *height); gboolean meta_get_button_position (decor_t *d, gint i, gint width, gint height, gint *x, gint *y, gint *w, gint *h); gboolean meta_button_present (MetaButtonLayout *button_layout, MetaButtonFunction function); void meta_get_event_window_position (decor_t *d, gint i, gint j, gint width, gint height, gint *x, gint *y, gint *w, gint *h); gfloat meta_get_title_scale (decor_frame_t *); void meta_update_border_extents (); void meta_update_button_layout (const char *value); void meta_get_shadow (decor_frame_t *, decor_shadow_options_t *opts, gboolean active); #endif /* switcher.c */ #define SWITCHER_ALPHA 0xa0a0 void switcher_frame_update_shadow (Display *xdisplay, Screen *screen, decor_frame_t *frame, decor_shadow_t **shadow_normal, decor_context_t *context_normal, decor_shadow_t **shadow_max, decor_context_t *context_max, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow); decor_frame_t * create_switcher_frame (const gchar *); void destroy_switcher_frame (); void draw_switcher_decoration (decor_t *d); gboolean update_switcher_window (Window popup, Window selected); decor_t * switcher_window_opened (Window popup, Window selected); void switcher_window_closed (); /* events.c */ void move_resize_window (WnckWindow *win, int direction, decor_event *gtkwd_event); void common_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type, int button, int max, char *tooltip); void close_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void max_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void min_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void menu_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void shade_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void above_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void stick_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void unshade_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void unabove_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void unstick_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void handle_title_button_event (WnckWindow *win, int action, decor_event *gtkwd_event); void handle_mouse_wheel_title_event (WnckWindow *win, unsigned int button); void title_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void frame_common_event (WnckWindow *win, int direction, decor_event *gtkwd_event, decor_event_type gtkwd_type); void top_left_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void top_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void top_right_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void left_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void right_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void bottom_left_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void bottom_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void bottom_right_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void frame_window_realized (GtkWidget *widget, gpointer data); event_callback find_event_callback_for_point (decor_t *d, int x, int y, Bool *enter, Bool *leave, BoxPtr *entered_box); event_callback find_leave_event_callback (decor_t *d); void frame_handle_button_press (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void frame_handle_button_release (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void frame_handle_motion (GtkWidget *widget, GdkEventMotion *event, gpointer user_data); GdkFilterReturn selection_event_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer data); GdkFilterReturn event_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer data); /* tooltip.c */ gboolean create_tooltip_window (void); void handle_tooltip_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type, guint state, const char *tip); /* forcequit.c */ void show_force_quit_dialog (WnckWindow *win, Time timestamp); void hide_force_quit_dialog (WnckWindow *win); /* actionmenu.c */ void action_menu_map (WnckWindow *win, long button, Time time); /* util.c */ double square (double x); double dist (double x1, double y1, double x2, double y2); void shade (const decor_color_t *a, decor_color_t *b, float k); gboolean get_window_prop (Window xwindow, Atom atom, Window *val); unsigned int get_mwm_prop (Window xwindow); /* style.c */ void update_style (GtkWidget *widget); void style_changed (GtkWidget *widget, void *user_data /* PangoContext */); /* settings.c */ void set_frame_scale (decor_frame_t *frame, const gchar *font_str); void set_frames_scales (gpointer key, gpointer value, gpointer user_data); gboolean init_settings (GWDSettingsWritable *writable, WnckScreen *screen); void fini_settings (); gboolean gwd_process_decor_shadow_property_update (); #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-xproperty-storage.h0000644000015301777760000000245012321343002030053 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _COMPIZ_GWD_SETTINGS_STORAGE_XPROP_H #define _COMPIZ_GWD_SETTINGS_STORAGE_XPROP_H #include #include typedef struct _XDisplay Display; typedef unsigned long Window; G_BEGIN_DECLS #define GWD_TYPE_SETTINGS_STORAGE_XPROP (gwd_settings_storage_xprop_get_type ()) GType gwd_settings_storage_xprop_get_type (); GWDSettingsXPropertyStorage * gwd_settings_storage_xprop_new (Display *xdpy, Window root, GWDSettingsWritable *writable); G_END_DECLS #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-interface.c0000644000015301777760000001626712321343002026303 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include "gwd-settings-interface.h" const gboolean USE_TOOLTIPS_DEFAULT = FALSE; const gdouble ACTIVE_SHADOW_RADIUS_DEFAULT = 8.0; const gdouble ACTIVE_SHADOW_OPACITY_DEFAULT = 0.5; const gint ACTIVE_SHADOW_OFFSET_X_DEFAULT = 1; const gint ACTIVE_SHADOW_OFFSET_Y_DEFAULT = 1; const gchar *ACTIVE_SHADOW_COLOR_DEFAULT = "#00000000"; const gdouble INACTIVE_SHADOW_RADIUS_DEFAULT = 8.0; const gdouble INACTIVE_SHADOW_OPACITY_DEFAULT = 0/5; const gint INACTIVE_SHADOW_OFFSET_X_DEFAULT = 1; const gint INACTIVE_SHADOW_OFFSET_Y_DEFAULT = 1; const gchar *INACTIVE_SHADOW_COLOR_DEFAULT = "#00000000"; const guint DRAGGABLE_BORDER_WIDTH_DEFAULT = 7; const gboolean ATTACH_MODAL_DIALOGS_DEFAULT = FALSE; const gint BLUR_TYPE_DEFAULT = BLUR_TYPE_NONE; const gchar *METACITY_THEME_DEFAULT = "Adwaita"; const gdouble METACITY_ACTIVE_OPACITY_DEFAULT = 1.0; const gdouble METACITY_INACTIVE_OPACITY_DEFAULT = 0.75; const gboolean METACITY_ACTIVE_SHADE_OPACITY_DEFAULT = TRUE; const gboolean METACITY_INACTIVE_SHADE_OPACITY_DEFAULT = TRUE; const gchar * METACITY_BUTTON_LAYOUT_DEFAULT = ":minimize,maximize,close"; const guint DOUBLE_CLICK_ACTION_DEFAULT = CLICK_ACTION_MAXIMIZE; const guint MIDDLE_CLICK_ACTION_DEFAULT = CLICK_ACTION_LOWER; const guint RIGHT_CLICK_ACTION_DEFAULT = CLICK_ACTION_MENU; const guint WHEEL_ACTION_DEFAULT = WHEEL_ACTION_NONE; const gchar * TITLEBAR_FONT_DEFAULT = "Sans 12"; static void gwd_settings_interface_default_init (GWDSettingsInterface *settings_interface); G_DEFINE_INTERFACE (GWDSettings, gwd_settings_interface, G_TYPE_OBJECT); static void gwd_settings_interface_default_init (GWDSettingsInterface *settings_interface) { g_object_interface_install_property (settings_interface, g_param_spec_pointer ("active-shadow", "Active Shadow", "Active Shadow Settings", G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_pointer ("inactive-shadow", "Inactive Shadow", "Inactive Shadow", G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_boolean ("use-tooltips", "Use Tooltips", "Use Tooltips Setting", USE_TOOLTIPS_DEFAULT, G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_int ("draggable-border-width", "Draggable Border Width", "Draggable Border Width Setting", 0, 64, DRAGGABLE_BORDER_WIDTH_DEFAULT, G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_boolean ("attach-modal-dialogs", "Attach modal dialogs", "Attach modal dialogs setting", ATTACH_MODAL_DIALOGS_DEFAULT, G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_int ("blur", "Blur Type", "Blur type property", BLUR_TYPE_NONE, BLUR_TYPE_ALL, BLUR_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_interface_install_property (settings_interface, g_param_spec_string ("metacity-theme", "Metacity Theme", "Metacity Theme Setting", METACITY_THEME_DEFAULT, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_interface_install_property (settings_interface, g_param_spec_double ("metacity-active-opacity", "Metacity Active Opacity", "Metacity Active Opacity", 0.0, 1.0, METACITY_ACTIVE_OPACITY_DEFAULT, G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_double ("metacity-inactive-opacity", "Metacity Inactive Opacity", "Metacity Inactive Opacity", 0.0, 1.0, METACITY_INACTIVE_OPACITY_DEFAULT, G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_boolean ("metacity-active-shade-opacity", "Metacity Active Shade Opacity", "Metacity Active Shade Opacity", METACITY_ACTIVE_SHADE_OPACITY_DEFAULT, G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_boolean ("metacity-inactive-shade-opacity", "Metacity Inactive Shade Opacity", "Metacity Inactive Shade Opacity", METACITY_INACTIVE_SHADE_OPACITY_DEFAULT, G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_string ("metacity-button-layout", "Metacity Button Layout", "Metacity Button Layout", METACITY_BUTTON_LAYOUT_DEFAULT, G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_int ("titlebar-double-click-action", "Titlebar Action Double Click", "Titlebar Action Double Click", CLICK_ACTION_NONE, CLICK_ACTION_MENU, CLICK_ACTION_MAXIMIZE, G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_int ("titlebar-middle-click-action", "Titlebar Action Middle Click", "Titlebar Action Middle Click", CLICK_ACTION_NONE, CLICK_ACTION_MENU, CLICK_ACTION_LOWER, G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_int ("titlebar-right-click-action", "Titlebar Action Right Click", "Titlebar Action Right Click", CLICK_ACTION_NONE, CLICK_ACTION_MENU, CLICK_ACTION_MENU, G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_int ("mouse-wheel-action", "Mouse Wheel Action", "Mouse Wheel Action", WHEEL_ACTION_NONE, WHEEL_ACTION_SHADE, WHEEL_ACTION_SHADE, G_PARAM_READABLE)); g_object_interface_install_property (settings_interface, g_param_spec_string ("titlebar-font", "Titlebar Font", "Titlebar Font", TITLEBAR_FONT_DEFAULT, G_PARAM_READABLE)); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/tooltip.c0000644000015301777760000001153712321343002023413 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" /* stolen from gtktooltip.c */ #define DEFAULT_DELAY 500 /* Default delay in ms */ #define STICKY_DELAY 0 /* Delay before popping up next tip * if we're sticky */ #define STICKY_REVERT_DELAY 1000 /* Delay before sticky tooltips revert * to normal */ static void show_tooltip (const char *text) { GdkDisplay *gdkdisplay; GtkRequisition requisition; gint x, y, w, h; GdkScreen *screen; gint monitor_num; GdkRectangle monitor; gdkdisplay = gdk_display_get_default (); gtk_label_set_text (GTK_LABEL (tip_label), text); gtk_widget_size_request (tip_window, &requisition); w = requisition.width; h = requisition.height; gdk_display_get_pointer (gdkdisplay, &screen, &x, &y, NULL); x -= (w / 2 + 4); monitor_num = gdk_screen_get_monitor_at_point (screen, x, y); gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); if ((x + w) > monitor.x + monitor.width) x -= (x + w) - (monitor.x + monitor.width); else if (x < monitor.x) x = monitor.x; if ((y + h + 16) > monitor.y + monitor.height) y = y - h - 16; else y = y + 16; gtk_window_move (GTK_WINDOW (tip_window), x, y); gtk_widget_show (tip_window); } static void hide_tooltip (void) { if (gtk_widget_get_visible (tip_window)) g_get_current_time (&tooltip_last_popdown); gtk_widget_hide (tip_window); if (tooltip_timer_tag) { g_source_remove (tooltip_timer_tag); tooltip_timer_tag = 0; } } static gboolean tooltip_recently_shown (void) { GTimeVal now; glong msec; g_get_current_time (&now); msec = now.tv_sec - tooltip_last_popdown.tv_sec; if (msec > STICKY_REVERT_DELAY / 1000) return FALSE; msec = msec * 1000 + (now.tv_usec - tooltip_last_popdown.tv_usec) / 1000; return (msec < STICKY_REVERT_DELAY); } static gint tooltip_timeout (gpointer data) { tooltip_timer_tag = 0; show_tooltip ((const char *) data); return FALSE; } static void tooltip_start_delay (const char *text) { guint delay = DEFAULT_DELAY; if (tooltip_timer_tag) return; if (tooltip_recently_shown ()) delay = STICKY_DELAY; tooltip_timer_tag = g_timeout_add (delay, tooltip_timeout, (gpointer) text); } static gint tooltip_paint_window (GtkWidget *tooltip) { GtkRequisition req; gtk_widget_size_request (tip_window, &req); gtk_paint_flat_box (tip_window->style, tip_window->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, GTK_WIDGET (tip_window), "tooltip", 0, 0, req.width, req.height); return FALSE; } gboolean create_tooltip_window (void) { tip_window = gtk_window_new (GTK_WINDOW_POPUP); gtk_widget_set_app_paintable (tip_window, TRUE); gtk_window_set_resizable (GTK_WINDOW (tip_window), FALSE); gtk_widget_set_name (tip_window, "gtk-tooltips"); gtk_container_set_border_width (GTK_CONTAINER (tip_window), 4); #if GTK_CHECK_VERSION (2, 10, 0) if (!gtk_check_version (2, 10, 0)) gtk_window_set_type_hint (GTK_WINDOW (tip_window), GDK_WINDOW_TYPE_HINT_TOOLTIP); #endif g_signal_connect_swapped (tip_window, "expose_event", G_CALLBACK (tooltip_paint_window), 0); tip_label = gtk_label_new (NULL); gtk_label_set_line_wrap (GTK_LABEL (tip_label), TRUE); gtk_misc_set_alignment (GTK_MISC (tip_label), 0.5, 0.5); gtk_widget_show (tip_label); gtk_container_add (GTK_CONTAINER (tip_window), tip_label); gtk_widget_ensure_style (tip_window); return TRUE; } void handle_tooltip_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type, guint state, const char *tip) { switch (gtkwd_type) { case GButtonPress: hide_tooltip (); break; case GButtonRelease: break; case GEnterNotify: if (!(state & PRESSED_EVENT_WINDOW)) { if (wnck_window_is_active (win)) tooltip_start_delay (tip); } break; case GLeaveNotify: hide_tooltip (); break; default: break; } } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-storage-gconf.c0000644000015301777760000003636112321343002027076 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include #include "gwd-settings-writable-interface.h" #include "gwd-settings-storage-interface.h" #include "gwd-settings-storage-gconf.h" #define GWD_SETTINGS_STORAGE_GCONF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GWD_TYPE_SETTINGS_STORAGE_GCONF, GWDSettingsStorageGConf)); #define GWD_SETTINGS_STORAGE_GCONF_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GWD_TYPE_SETTINGS_STORAGE_GCONF, GWDSettingsStorageGConfClass)); #define GWD_IS_MOCK_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GWD_TYPE_SETTINGS_STORAGE_GCONF)); #define GWD_IS_MOCK_SETTINGS_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GWD_TYPE_SETTINGS_STORAGE_GCONF)); #define GWD_SETTINGS_STORAGE_GCONF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GWD_TYPE_SETTINGS_STORAGE_GCONF, GWDSettingsStorageGConfClass)); #define MUTTER_GCONF_DEF "/apps/mutter/general" #define METACITY_GCONF_DEF "/apps/metacity/general" #define COMPIZ_GCONF_DEF "/apps/gwd" const gchar * METACITY_GCONF_DIR = METACITY_GCONF_DEF; const gchar * MUTTER_GCONF_DIR = MUTTER_GCONF_DEF; const gchar * COMPIZ_GCONF_DIR = COMPIZ_GCONF_DEF; const gchar * COMPIZ_USE_SYSTEM_FONT_KEY = METACITY_GCONF_DEF "/titlebar_uses_system_font"; const gchar * COMPIZ_TITLEBAR_FONT_KEY = METACITY_GCONF_DEF "/titlebar_font"; const gchar * COMPIZ_DOUBLE_CLICK_TITLEBAR_KEY = METACITY_GCONF_DEF "/action_double_click_titlebar"; const gchar * COMPIZ_MIDDLE_CLICK_TITLEBAR_KEY = METACITY_GCONF_DEF "/action_middle_click_titlebar"; const gchar * COMPIZ_RIGHT_CLICK_TITLEBAR_KEY = METACITY_GCONF_DEF "/action_right_click_titlebar"; const gchar * MUTTER_DRAGGABLE_BORDER_WIDTH_KEY = MUTTER_GCONF_DEF "/draggable_border_width"; const gchar * MUTTER_ATTACH_MODAL_DIALOGS_KEY = MUTTER_GCONF_DEF "/attach_modal_dialogs"; const gchar * META_THEME_KEY = METACITY_GCONF_DEF "/theme"; const gchar * META_BUTTON_LAYOUT_KEY = METACITY_GCONF_DEF "/button_layout"; const gchar * COMPIZ_USE_META_THEME_KEY = COMPIZ_GCONF_DEF "/use_metacity_theme"; const gchar * COMPIZ_META_THEME_OPACITY_KEY = COMPIZ_GCONF_DEF "/metacity_theme_opacity"; const gchar * COMPIZ_META_THEME_ACTIVE_OPACITY_KEY = COMPIZ_GCONF_DEF "/metacity_theme_active_opacity"; const gchar * COMPIZ_META_THEME_ACTIVE_OPACITY_SHADE_KEY = COMPIZ_GCONF_DEF "/metacity_theme_active_shade_opacity"; const gchar * COMPIZ_META_THEME_OPACITY_SHADE_KEY = COMPIZ_GCONF_DEF "/metacity_theme_shade_opacity"; const gchar * COMPIZ_BLUR_TYPE_KEY = COMPIZ_GCONF_DEF "/blur_type"; const gchar * COMPIZ_WHEEL_ACTION_KEY = COMPIZ_GCONF_DEF "/mouse_wheel_action"; const gchar * COMPIZ_USE_TOOLTIPS_KEY = COMPIZ_GCONF_DEF "/use_tooltips"; typedef struct _GWDSettingsStorageGConf { GObject parent; } GWDSettingsStorageGConf; typedef struct _GWDSettingsStorageGConfClass { GObjectClass parent_class; } GWDSettingsStorageGConfClass; static void gwd_settings_storage_gconf_interface_init (GWDSettingsStorageInterface *interface); G_DEFINE_TYPE_WITH_CODE (GWDSettingsStorageGConf, gwd_settings_storage_gconf, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GWD_TYPE_SETTINGS_STORAGE_INTERFACE, gwd_settings_storage_gconf_interface_init)) #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GWD_TYPE_SETTINGS_STORAGE_GCONF, GWDSettingsStorageGConfPrivate)) enum { GWD_SETTINGS_STORAGE_GCONF_PROPERTY_WRITABLE_SETTINGS = 1 }; typedef struct _GWDSettingsStorageGConfPrivate { GConfClient *client; GWDSettingsWritable *writable; } GWDSettingsStorageGConfPrivate; static gboolean gwd_settings_storage_gconf_update_use_tooltips (GWDSettingsStorage *settings) { GWDSettingsStorageGConf *storage = GWD_SETTINGS_STORAGE_GCONF (settings); GWDSettingsStorageGConfPrivate *priv = GET_PRIVATE (storage); return gwd_settings_writable_use_tooltips_changed (priv->writable, gconf_client_get_bool (priv->client, COMPIZ_USE_TOOLTIPS_KEY, NULL)); } static gboolean gwd_settings_storage_gconf_update_draggable_border_width (GWDSettingsStorage *settings) { GWDSettingsStorageGConf *storage = GWD_SETTINGS_STORAGE_GCONF (settings); GWDSettingsStorageGConfPrivate *priv = GET_PRIVATE (storage); return gwd_settings_writable_draggable_border_width_changed (priv->writable, gconf_client_get_int (priv->client, MUTTER_DRAGGABLE_BORDER_WIDTH_KEY, NULL)); } static gboolean gwd_settings_storage_gconf_update_attach_modal_dialogs (GWDSettingsStorage *settings) { GWDSettingsStorageGConf *storage = GWD_SETTINGS_STORAGE_GCONF (settings); GWDSettingsStorageGConfPrivate *priv = GET_PRIVATE (storage); return gwd_settings_writable_attach_modal_dialogs_changed (priv->writable, gconf_client_get_bool (priv->client, MUTTER_ATTACH_MODAL_DIALOGS_KEY, NULL)); } static gboolean gwd_settings_storage_gconf_update_blur (GWDSettingsStorage *settings) { GWDSettingsStorageGConf *storage = GWD_SETTINGS_STORAGE_GCONF (settings); GWDSettingsStorageGConfPrivate *priv = GET_PRIVATE (storage); gchar *value = gconf_client_get_string (priv->client, COMPIZ_BLUR_TYPE_KEY, NULL); gboolean ret = gwd_settings_writable_blur_changed (priv->writable, value); if (value) g_free (value); return ret; } static gboolean gwd_settings_storage_gconf_update_metacity_theme (GWDSettingsStorage *settings) { GWDSettingsStorageGConf *storage = GWD_SETTINGS_STORAGE_GCONF (settings); GWDSettingsStorageGConfPrivate *priv = GET_PRIVATE (storage); gchar *theme = gconf_client_get_string (priv->client, META_THEME_KEY, NULL); gboolean ret = gwd_settings_writable_metacity_theme_changed (priv->writable, gconf_client_get_bool (priv->client, COMPIZ_USE_META_THEME_KEY, NULL), theme); if (theme) g_free (theme); return ret; } static gboolean gwd_settings_storage_gconf_update_opacity (GWDSettingsStorage *settings) { GWDSettingsStorageGConf *storage = GWD_SETTINGS_STORAGE_GCONF (settings); GWDSettingsStorageGConfPrivate *priv = GET_PRIVATE (storage); return gwd_settings_writable_opacity_changed (priv->writable, gconf_client_get_float (priv->client, COMPIZ_META_THEME_ACTIVE_OPACITY_KEY, NULL), gconf_client_get_float (priv->client, COMPIZ_META_THEME_OPACITY_KEY, NULL), gconf_client_get_bool (priv->client, COMPIZ_META_THEME_ACTIVE_OPACITY_SHADE_KEY, NULL), gconf_client_get_bool (priv->client, COMPIZ_META_THEME_OPACITY_SHADE_KEY, NULL)); } static gboolean gwd_settings_storage_gconf_update_button_layout (GWDSettingsStorage *settings) { GWDSettingsStorageGConf *storage = GWD_SETTINGS_STORAGE_GCONF (settings); GWDSettingsStorageGConfPrivate *priv = GET_PRIVATE (storage); gchar *button_layout = gconf_client_get_string (priv->client, META_BUTTON_LAYOUT_KEY, NULL); gboolean ret = gwd_settings_writable_button_layout_changed (priv->writable, button_layout); if (button_layout) g_free (button_layout); return ret; } static gboolean gwd_settings_storage_gconf_update_font (GWDSettingsStorage *settings) { GWDSettingsStorageGConf *storage = GWD_SETTINGS_STORAGE_GCONF (settings); GWDSettingsStorageGConfPrivate *priv = GET_PRIVATE (storage); gchar *font = gconf_client_get_string (priv->client, COMPIZ_TITLEBAR_FONT_KEY, NULL); gboolean ret = gwd_settings_writable_font_changed (priv->writable, gconf_client_get_bool (priv->client, COMPIZ_USE_SYSTEM_FONT_KEY, NULL), font); if (font) g_free (font); return ret; } static gboolean gwd_settings_storage_gconf_update_titlebar_actions (GWDSettingsStorage *settings) { GWDSettingsStorageGConf *storage = GWD_SETTINGS_STORAGE_GCONF (settings); GWDSettingsStorageGConfPrivate *priv = GET_PRIVATE (storage); gchar *double_click_action = gconf_client_get_string (priv->client, COMPIZ_DOUBLE_CLICK_TITLEBAR_KEY, NULL); gchar *middle_click_action = gconf_client_get_string (priv->client, COMPIZ_MIDDLE_CLICK_TITLEBAR_KEY, NULL); gchar *right_click_action = gconf_client_get_string (priv->client, COMPIZ_DOUBLE_CLICK_TITLEBAR_KEY, NULL); gchar *mouse_wheel_action = gconf_client_get_string (priv->client, COMPIZ_WHEEL_ACTION_KEY, NULL); gboolean ret = gwd_settings_writable_titlebar_actions_changed (priv->writable, double_click_action, middle_click_action, right_click_action, mouse_wheel_action); if (double_click_action) g_free (double_click_action); if (middle_click_action) g_free (middle_click_action); if (right_click_action) g_free (right_click_action); if (mouse_wheel_action) g_free (mouse_wheel_action); return ret; } static void gwd_settings_storage_gconf_interface_init (GWDSettingsStorageInterface *interface) { interface->update_use_tooltips = gwd_settings_storage_gconf_update_use_tooltips; interface->update_draggable_border_width = gwd_settings_storage_gconf_update_draggable_border_width; interface->update_attach_modal_dialogs = gwd_settings_storage_gconf_update_attach_modal_dialogs; interface->update_blur = gwd_settings_storage_gconf_update_blur; interface->update_metacity_theme = gwd_settings_storage_gconf_update_metacity_theme; interface->update_opacity = gwd_settings_storage_gconf_update_opacity; interface->update_button_layout = gwd_settings_storage_gconf_update_button_layout; interface->update_font = gwd_settings_storage_gconf_update_font; interface->update_titlebar_actions = gwd_settings_storage_gconf_update_titlebar_actions; } static void gwd_settings_storage_gconf_dispose (GObject *object) { GWDSettingsStorageGConfPrivate *priv = GET_PRIVATE (object); G_OBJECT_CLASS (gwd_settings_storage_gconf_parent_class)->dispose (object); if (priv->client) g_object_unref (priv->client); if (priv->writable) g_object_unref (priv->writable); } static void gwd_settings_storage_gconf_finalize (GObject *object) { G_OBJECT_CLASS (gwd_settings_storage_gconf_parent_class)->finalize (object); } static void gwd_settings_storage_gconf_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDSettingsStorageGConfPrivate *priv = GET_PRIVATE (object); switch (property_id) { case GWD_SETTINGS_STORAGE_GCONF_PROPERTY_WRITABLE_SETTINGS: g_return_if_fail (!priv->writable); priv->writable = g_value_get_pointer (value); break; default: break; } } static void gwd_settings_storage_gconf_class_init (GWDSettingsStorageGConfClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); g_type_class_add_private (klass, sizeof (GWDSettingsStorageGConfPrivate)); object_class->dispose = gwd_settings_storage_gconf_dispose; object_class->finalize = gwd_settings_storage_gconf_finalize; object_class->set_property = gwd_settings_storage_gconf_set_property; g_object_class_install_property (object_class, GWD_SETTINGS_STORAGE_GCONF_PROPERTY_WRITABLE_SETTINGS, g_param_spec_pointer ("writable-settings", "GWDSettingsWritable", "An object that implements GWDSettingsWritable", G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); } static void value_changed (GConfClient *client, const gchar *key, GConfValue *value, void *data) { GWDSettingsStorage *storage = GWD_SETTINGS_STORAGE_INTERFACE (data); if (strcmp (key, COMPIZ_USE_SYSTEM_FONT_KEY) == 0 || strcmp (key, COMPIZ_TITLEBAR_FONT_KEY) == 0) gwd_settings_storage_update_font (storage); else if (strcmp (key, COMPIZ_TITLEBAR_FONT_KEY) == 0) gwd_settings_storage_update_font (storage); else if (strcmp (key, COMPIZ_DOUBLE_CLICK_TITLEBAR_KEY) == 0 || strcmp (key, COMPIZ_MIDDLE_CLICK_TITLEBAR_KEY) == 0 || strcmp (key, COMPIZ_RIGHT_CLICK_TITLEBAR_KEY) == 0 || strcmp (key, COMPIZ_WHEEL_ACTION_KEY) == 0) gwd_settings_storage_update_titlebar_actions (storage); else if (strcmp (key, COMPIZ_BLUR_TYPE_KEY) == 0) gwd_settings_storage_update_blur (storage); else if (strcmp (key, COMPIZ_USE_META_THEME_KEY) == 0 || strcmp (key, META_THEME_KEY) == 0) gwd_settings_storage_update_metacity_theme (storage); else if (strcmp (key, META_BUTTON_LAYOUT_KEY) == 0) gwd_settings_storage_update_button_layout (storage); else if (strcmp (key, COMPIZ_META_THEME_OPACITY_KEY) == 0 || strcmp (key, COMPIZ_META_THEME_OPACITY_SHADE_KEY) == 0 || strcmp (key, COMPIZ_META_THEME_ACTIVE_OPACITY_KEY) == 0 || strcmp (key, COMPIZ_META_THEME_ACTIVE_OPACITY_SHADE_KEY) == 0) gwd_settings_storage_update_opacity (storage); else if (strcmp (key, MUTTER_DRAGGABLE_BORDER_WIDTH_KEY) == 0) gwd_settings_storage_update_draggable_border_width (storage); else if (strcmp (key, MUTTER_ATTACH_MODAL_DIALOGS_KEY) == 0) gwd_settings_storage_update_attach_modal_dialogs (storage); else if (strcmp (key, COMPIZ_USE_TOOLTIPS_KEY) == 0) gwd_settings_storage_update_use_tooltips (storage); } void gwd_settings_storage_gconf_init (GWDSettingsStorageGConf *self) { GWDSettingsStorageGConfPrivate *priv = GET_PRIVATE (self); priv->client = gconf_client_get_default (); gconf_client_add_dir (priv->client, COMPIZ_GCONF_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); gconf_client_add_dir (priv->client, METACITY_GCONF_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); gconf_client_add_dir (priv->client, MUTTER_GCONF_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); g_signal_connect (G_OBJECT (priv->client), "value_changed", G_CALLBACK (value_changed), self); } GWDSettingsStorage * gwd_settings_storage_gconf_new (GWDSettingsWritable *writable) { GValue writable_value = G_VALUE_INIT; static const guint gwd_settings_storage_gconf_n_construction_params = 1; GParameter param[gwd_settings_storage_gconf_n_construction_params]; GWDSettingsStorage *storage = NULL; g_value_init (&writable_value, G_TYPE_POINTER); g_value_set_pointer (&writable_value, writable); param[0].name = "writable-settings"; param[0].value = writable_value; storage = GWD_SETTINGS_STORAGE_INTERFACE (g_object_newv (GWD_TYPE_SETTINGS_STORAGE_GCONF, 1, param)); g_value_unset (&writable_value); return storage; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/style.c0000644000015301777760000000370512321343002023057 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" void update_style (GtkWidget *widget) { GtkStyle *style; decor_color_t spot_color; style = gtk_widget_get_style (widget); g_object_ref (G_OBJECT (style)); style = gtk_style_attach (style, widget->window); spot_color.r = style->bg[GTK_STATE_SELECTED].red / 65535.0; spot_color.g = style->bg[GTK_STATE_SELECTED].green / 65535.0; spot_color.b = style->bg[GTK_STATE_SELECTED].blue / 65535.0; g_object_unref (G_OBJECT (style)); shade (&spot_color, &_title_color[0], 1.05); shade (&_title_color[0], &_title_color[1], 0.85); } void style_changed (GtkWidget *widget, void *user_data) { GdkDisplay *gdkdisplay; GdkScreen *gdkscreen; WnckScreen *screen; PangoContext *context = (PangoContext *) user_data; gdkdisplay = gdk_display_get_default (); gdkscreen = gdk_display_get_default_screen (gdkdisplay); screen = wnck_screen_get_default (); update_style (widget); pango_cairo_context_set_resolution (context, gdk_screen_get_resolution (gdkscreen)); decorations_changed (screen); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/events.c0000644000015301777760000007112012321343002023217 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" #include "gwd-settings-interface.h" void move_resize_window (WnckWindow *win, int direction, decor_event *gtkwd_event) { Display *xdisplay; GdkDisplay *gdkdisplay; GdkScreen *screen; Window xroot; XEvent ev; gdkdisplay = gdk_display_get_default (); xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay); screen = gdk_display_get_default_screen (gdkdisplay); xroot = RootWindowOfScreen (gdk_x11_screen_get_xscreen (screen)); if (action_menu_mapped) { gtk_object_destroy (GTK_OBJECT (action_menu)); return; } ev.xclient.type = ClientMessage; ev.xclient.display = xdisplay; ev.xclient.serial = 0; ev.xclient.send_event = TRUE; ev.xclient.window = wnck_window_get_xid (win); ev.xclient.message_type = wm_move_resize_atom; ev.xclient.format = 32; ev.xclient.data.l[0] = gtkwd_event->x_root; ev.xclient.data.l[1] = gtkwd_event->y_root; ev.xclient.data.l[2] = direction; ev.xclient.data.l[3] = gtkwd_event->button; ev.xclient.data.l[4] = 1; XUngrabPointer (xdisplay, gtkwd_event->time); XUngrabKeyboard (xdisplay, gtkwd_event->time); XSendEvent (xdisplay, xroot, FALSE, SubstructureRedirectMask | SubstructureNotifyMask, &ev); XSync (xdisplay, FALSE); } void common_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type, int button, int max, char *tooltip) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[button]; gboolean use_tooltips = FALSE; g_object_get (settings, "use-tooltips", &use_tooltips, NULL); if (use_tooltips) handle_tooltip_event (win, gtkwd_event, gtkwd_type, state, tooltip); if (d->frame_window && gtkwd_type == GEnterNotify) { GdkCursor* cursor; cursor = gdk_cursor_new (GDK_LEFT_PTR); gdk_window_set_cursor (d->frame_window, cursor); gdk_cursor_unref (cursor); } switch (gtkwd_type) { case GButtonPress: if (gtkwd_event->button <= max) d->button_states[button] |= PRESSED_EVENT_WINDOW; break; case GButtonRelease: if (gtkwd_event->button <= max) d->button_states[button] &= ~PRESSED_EVENT_WINDOW; break; case GEnterNotify: d->button_states[button] |= IN_EVENT_WINDOW; break; case GLeaveNotify: d->button_states[button] &= ~IN_EVENT_WINDOW; break; default: break; } if (state != d->button_states[button]) queue_decor_draw (d); } #define BUTTON_EVENT_ACTION_STATE (PRESSED_EVENT_WINDOW | IN_EVENT_WINDOW) void close_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_CLOSE]; if (action_menu_mapped && gtkwd_type == GButtonPress) { gtk_object_destroy (GTK_OBJECT (action_menu)); } common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_CLOSE, 1, _("Close Window")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_close (win, gtkwd_event->time); break; default: break; } } void max_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_MAX]; if (action_menu_mapped && gtkwd_type == GButtonPress) { gtk_object_destroy (GTK_OBJECT (action_menu)); } if (wnck_window_is_maximized (win)) common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_MAX, 3, _("Unmaximize Window")); else common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_MAX, 3, _("Maximize Window")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button <= 3) { if (state == BUTTON_EVENT_ACTION_STATE) { if (gtkwd_event->button == 1) { if (wnck_window_is_maximized (win)) wnck_window_unmaximize (win); else if (wnck_window_is_maximized_vertically (win)) wnck_window_unmaximize_vertically (win); else if (wnck_window_is_maximized_horizontally (win)) wnck_window_unmaximize_horizontally (win); else wnck_window_maximize (win); } else if (gtkwd_event->button == 2) { if (wnck_window_is_maximized_vertically (win)) wnck_window_unmaximize_vertically (win); else wnck_window_maximize_vertically (win); } else if (gtkwd_event->button == 3) { if (wnck_window_is_maximized_horizontally (win)) wnck_window_unmaximize_horizontally (win); else wnck_window_maximize_horizontally (win); } } } break; default: break; } } void min_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_MIN]; if (action_menu_mapped && gtkwd_type == GButtonPress) { gtk_object_destroy (GTK_OBJECT (action_menu)); } common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_MIN, 1, _("Minimize Window")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_minimize (win); break; default: break; } } void menu_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_MENU, 1, _("Window Menu")); switch (gtkwd_type) { case GButtonPress: if (gtkwd_event->button == 1) action_menu_map (win, gtkwd_event->button, gtkwd_event->time); break; default: break; } } void shade_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_SHADE]; common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_SHADE, 1, _("Shade")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) { if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_shade (win); } break; default: break; } } void above_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_ABOVE]; common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_ABOVE, 1, _("Make Above")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) #ifdef HAVE_LIBWNCK_2_18_1 wnck_window_make_above (win); #endif break; default: break; } } void stick_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_STICK]; common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_STICK, 1, _("Stick")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_stick (win); break; default: break; } } void unshade_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_UNSHADE]; common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_UNSHADE, 1, _("Unshade")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_unshade (win); break; default: break; } } void unabove_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_UNABOVE]; common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_UNABOVE, 1, _("Unmake Above")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) #ifdef HAVE_LIBWNCK_2_18_1 wnck_window_unmake_above (win); #endif break; default: break; } } void unstick_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_UNSTICK]; common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_UNSTICK, 1, _("Unstick")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_unstick (win); break; default: break; } } void handle_title_button_event (WnckWindow *win, int action, decor_event *gtkwd_event) { switch (action) { case CLICK_ACTION_SHADE: if (wnck_window_is_shaded (win)) wnck_window_unshade (win); else wnck_window_shade (win); break; case CLICK_ACTION_MAXIMIZE: if (wnck_window_is_maximized (win)) wnck_window_unmaximize (win); else wnck_window_maximize (win); break; case CLICK_ACTION_MINIMIZE: if (!wnck_window_is_minimized (win)) wnck_window_minimize (win); break; case CLICK_ACTION_RAISE: restack_window (win, Above); break; case CLICK_ACTION_LOWER: restack_window (win, Below); break; case CLICK_ACTION_MENU: action_menu_map (win, gtkwd_event->button, gtkwd_event->time); break; } } void handle_mouse_wheel_title_event (WnckWindow *win, unsigned int button) { gint wheel_action = WHEEL_ACTION_NONE; g_object_get (settings, "mouse-wheel-action", &wheel_action, NULL); switch (wheel_action) { case WHEEL_ACTION_SHADE: if (button == 4) { if (!wnck_window_is_shaded (win)) wnck_window_shade (win); } else if (button == 5) { if (wnck_window_is_shaded (win)) wnck_window_unshade (win); } break; default: break; } } void title_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { static Window last_button_xwindow = None; static Time last_button_time = 0; gint titlebar_action = 0; decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->frame_window && gtkwd_type == GEnterNotify) { GdkCursor* cursor = gdk_cursor_new (GDK_LEFT_PTR); gdk_window_set_cursor (d->frame_window, cursor); gdk_cursor_unref (cursor); } if (gtkwd_type != GButtonPress) return; if (gtkwd_event->button == 1) { static int last_button_num = 0; static int last_button_x = 0; static int last_button_y = 0; if (gtkwd_event->button == last_button_num && gtkwd_event->window == last_button_xwindow && gtkwd_event->time < last_button_time + double_click_timeout && dist (gtkwd_event->x, gtkwd_event->y, last_button_x, last_button_y) < DOUBLE_CLICK_DISTANCE) { g_object_get (settings, "titlebar-double-click-action", &titlebar_action, NULL); handle_title_button_event (win, titlebar_action, gtkwd_event); last_button_num = 0; last_button_xwindow = None; last_button_time = 0; last_button_x = 0; last_button_y = 0; } else { last_button_num = gtkwd_event->button; last_button_xwindow = gtkwd_event->window; last_button_time = gtkwd_event->time; last_button_x = gtkwd_event->x; last_button_y = gtkwd_event->y; restack_window (win, Above); move_resize_window (win, WM_MOVERESIZE_MOVE, gtkwd_event); } } else if (gtkwd_event->button == 2) { g_object_get (settings, "titlebar-middle-click-action", &titlebar_action, NULL); handle_title_button_event (win, titlebar_action, gtkwd_event); } else if (gtkwd_event->button == 3) { g_object_get (settings, "titlebar-right-click-action", &titlebar_action, NULL); handle_title_button_event (win, titlebar_action, gtkwd_event); } else if (gtkwd_event->button == 4 || gtkwd_event->button == 5) { handle_mouse_wheel_title_event (win, gtkwd_event->button); } } void frame_common_event (WnckWindow *win, int direction, decor_event *gtkwd_event, decor_event_type gtkwd_type) { gint titlebar_action = 0; decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->frame_window && gtkwd_type == GEnterNotify) { GdkCursor *cursor = NULL; switch (direction) { case WM_MOVERESIZE_SIZE_TOPLEFT: cursor = gdk_cursor_new (GDK_TOP_LEFT_CORNER); break; case WM_MOVERESIZE_SIZE_LEFT: cursor = gdk_cursor_new (GDK_LEFT_SIDE); break; case WM_MOVERESIZE_SIZE_BOTTOMLEFT: cursor = gdk_cursor_new (GDK_BOTTOM_LEFT_CORNER); break; case WM_MOVERESIZE_SIZE_BOTTOM: cursor = gdk_cursor_new (GDK_BOTTOM_SIDE); break; case WM_MOVERESIZE_SIZE_BOTTOMRIGHT: cursor = gdk_cursor_new (GDK_BOTTOM_RIGHT_CORNER); break; case WM_MOVERESIZE_SIZE_RIGHT: cursor = gdk_cursor_new (GDK_RIGHT_SIDE); break; case WM_MOVERESIZE_SIZE_TOPRIGHT: cursor = gdk_cursor_new (GDK_TOP_RIGHT_CORNER); break; case WM_MOVERESIZE_SIZE_TOP: cursor = gdk_cursor_new (GDK_TOP_SIDE); break; default: break; } if (cursor) { gdk_window_set_cursor (d->frame_window, cursor); gdk_cursor_unref (cursor); } } if (gtkwd_type != GButtonPress) return; switch (gtkwd_event->button) { case 1: move_resize_window (win, direction, gtkwd_event); restack_window (win, Above); break; case 2: g_object_get (settings, "titlebar-middle-click-action", &titlebar_action, NULL); handle_title_button_event (win, titlebar_action, gtkwd_event); break; case 3: g_object_get (settings, "titlebar-right-click-action", &titlebar_action, NULL); handle_title_button_event (win, titlebar_action, gtkwd_event); break; } } void top_left_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_TOPLEFT, gtkwd_event, gtkwd_type); } void top_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_TOP, gtkwd_event, gtkwd_type); } void top_right_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_TOPRIGHT, gtkwd_event, gtkwd_type); } void left_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_LEFT, gtkwd_event, gtkwd_type); } void right_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_RIGHT, gtkwd_event, gtkwd_type); } void bottom_left_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_BOTTOMLEFT, gtkwd_event, gtkwd_type); } void bottom_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_BOTTOM, gtkwd_event, gtkwd_type); } void bottom_right_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_BOTTOMRIGHT, gtkwd_event, gtkwd_type); } void frame_window_realized (GtkWidget *widget, gpointer data) { decor_t *d = (decor_t *) data; if (d) { GdkWindow *gdk_frame_window = gtk_widget_get_window (d->decor_window); gdk_window_reparent (gdk_frame_window, d->frame_window, 0, 0); gdk_window_lower (gdk_frame_window); } } event_callback find_event_callback_for_point (decor_t *d, int x, int y, Bool *enter, Bool *leave, BoxPtr *entered_box) { int i, j; BoxPtr box; for (i = 0; i < BUTTON_NUM; ++i) { box = &d->button_windows[i].pos; if (x >= box->x1 && x <= box->x2 && y >= box->y1 && y <= box->y2) { if (d->last_pos_entered != box) { if (enter) *enter = TRUE; if (leave && d->last_pos_entered) *leave = TRUE; if (entered_box) *entered_box = box; } return d->button_windows[i].callback; } } for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { box = &d->event_windows[i][j].pos; if (x >= box->x1 && x <= box->x2 && y >= box->y1 && y <= box->y2) { if (d->last_pos_entered != box) { if (enter) *enter = TRUE; if (leave && d->last_pos_entered) *leave = TRUE; if (entered_box) *entered_box = box; } return d->event_windows[i][j].callback; } } } return NULL; } event_callback find_leave_event_callback (decor_t *d) { int i, j; for (i = 0; i < BUTTON_NUM; ++i) { if (d->last_pos_entered == &d->button_windows[i].pos) return d->button_windows[i].callback; } for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { if (d->last_pos_entered == &d->event_windows[i][j].pos) return d->event_windows[i][j].callback; } } return NULL; } void frame_handle_button_press (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { decor_t *d = (decor_t *) user_data; if (d) { /* Check to see where the event happened and fill out an appropriate * struct */ event_callback cb; cb = find_event_callback_for_point (d, event->x, event->y, NULL, NULL, NULL); if (cb && d->decorated) { decor_event gtkwd_event; gtkwd_event.window = GDK_WINDOW_XID (d->frame_window); gtkwd_event.button = event->button; gtkwd_event.x = event->x; gtkwd_event.y = event->y; gtkwd_event.x_root = event->x_root; gtkwd_event.y_root = event->y_root; gtkwd_event.time = event->time; (*cb) (d->win, >kwd_event, GButtonPress); } } } void frame_handle_button_release (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { decor_t *d = (decor_t *) user_data; if (d) { event_callback cb; cb = find_event_callback_for_point (d, event->x, event->y, NULL, NULL, NULL); if (cb && d->decorated) { decor_event gtkwd_event; gtkwd_event.window = GDK_WINDOW_XID (d->frame_window); gtkwd_event.button = event->button; gtkwd_event.x = event->x; gtkwd_event.y = event->y; gtkwd_event.x_root = event->x_root; gtkwd_event.y_root = event->y_root; gtkwd_event.time = event->time; (*cb) (d->win, >kwd_event, GButtonRelease); } } } void frame_handle_motion (GtkWidget *widget, GdkEventMotion *event, gpointer user_data) { decor_t *d = (decor_t *) user_data; if (d) { event_callback cb = NULL; Bool send_enter = FALSE; Bool send_leave = FALSE; BoxPtr entered_box; cb = find_event_callback_for_point (d, event->x, event->y, &send_enter, &send_leave, &entered_box); if (cb && d->decorated) { decor_event gtkwd_event; gtkwd_event.window = GDK_WINDOW_XID (d->frame_window); gtkwd_event.x = event->x; gtkwd_event.y = event->y; gtkwd_event.x_root = event->x_root; gtkwd_event.y_root = event->y_root; gtkwd_event.time = event->time; if (send_enter) (*cb) (d->win, >kwd_event, GEnterNotify); if (send_leave) { event_callback leave_cb; leave_cb = find_leave_event_callback (d); if (leave_cb) (*leave_cb) (d->win, >kwd_event, GLeaveNotify); } if (send_enter) d->last_pos_entered = entered_box; } else if (d->last_pos_entered && d->decorated) { /* We are not in an event / button window but last_pos_entered * is still set, so send a GLeaveNotify to last_pos_entered * and set it to NULL */ event_callback leave_cb; leave_cb = find_leave_event_callback (d); if (leave_cb) { decor_event gtkwd_event; gtkwd_event.window = GDK_WINDOW_XID (d->frame_window); gtkwd_event.x = event->x; gtkwd_event.y = event->y; gtkwd_event.x_root = event->x_root; gtkwd_event.y_root = event->y_root; gtkwd_event.time = event->time; (*leave_cb) (d->win, >kwd_event, GLeaveNotify); } d->last_pos_entered = NULL; } } } GdkFilterReturn event_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer data) { GdkDisplay *gdkdisplay; XEvent *xevent = gdkxevent; gulong xid = 0; Window select = 0; gdkdisplay = gdk_display_get_default (); switch (xevent->type) { case CreateNotify: { if (!wnck_window_get (xevent->xcreatewindow.window)) { GdkWindow *toplevel = create_foreign_window (xevent->xcreatewindow.window); if (toplevel) { gdk_window_set_events (toplevel, gdk_window_get_events (toplevel) | GDK_PROPERTY_CHANGE_MASK); /* check if the window is a switcher and update accordingly */ if (get_window_prop (xevent->xcreatewindow.window, select_window_atom, &select)) update_switcher_window (xevent->xcreatewindow.window, select); } } } break; case ButtonPress: case ButtonRelease: xid = (gulong) g_hash_table_lookup (frame_table, GINT_TO_POINTER (xevent->xbutton.window)); break; case EnterNotify: case LeaveNotify: xid = (gulong) g_hash_table_lookup (frame_table, GINT_TO_POINTER (xevent->xcrossing.window)); break; case MotionNotify: xid = (gulong) g_hash_table_lookup (frame_table, GINT_TO_POINTER (xevent->xmotion.window)); break; case PropertyNotify: if (xevent->xproperty.atom == frame_input_window_atom) { WnckWindow *win; xid = xevent->xproperty.window; win = wnck_window_get (xid); if (win) { Window frame; if (!get_window_prop (xid, select_window_atom, &select)) { if (get_window_prop (xid, frame_input_window_atom, &frame)) add_frame_window (win, frame, FALSE); else remove_frame_window (win); } } } if (xevent->xproperty.atom == frame_output_window_atom) { WnckWindow *win; xid = xevent->xproperty.window; win = wnck_window_get (xid); if (win) { Window frame; if (!get_window_prop (xid, select_window_atom, &select)) { if (get_window_prop (xid, frame_output_window_atom, &frame)) add_frame_window (win, frame, TRUE); else remove_frame_window (win); } } } else if (xevent->xproperty.atom == compiz_shadow_info_atom || xevent->xproperty.atom == compiz_shadow_color_atom) { GdkScreen *g_screen = gdk_display_get_default_screen (gdkdisplay); Window root = GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (g_screen)); WnckScreen *screen; screen = wnck_screen_get_for_root (root); if (screen) { if (gwd_process_decor_shadow_property_update ()) decorations_changed (screen); } } else if (xevent->xproperty.atom == mwm_hints_atom) { WnckWindow *win; xid = xevent->xproperty.window; win = wnck_window_get (xid); if (win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); gboolean decorated = FALSE; /* Only decorations that are actually bound to windows can be decorated * ignore cases where a broken application which shouldn't be decorated * sets the decoration hint */ if (get_mwm_prop (xid) & (MWM_DECOR_ALL | MWM_DECOR_TITLE) && d->win) decorated = TRUE; if (decorated != d->decorated) { d->decorated = decorated; if (decorated) { d->context = NULL; d->width = d->height = 0; d->frame = gwd_get_decor_frame (get_frame_type (win)); update_window_decoration_state (win); update_window_decoration_actions (win); update_window_decoration_icon (win); request_update_window_decoration_size (win); update_event_windows (win); } else { remove_frame_window (win); } } } } else if (xevent->xproperty.atom == select_window_atom) { Window select; if (get_window_prop (xevent->xproperty.window, select_window_atom, &select)) update_switcher_window (xevent->xproperty.window, select); } break; case DestroyNotify: g_hash_table_remove (frame_table, GINT_TO_POINTER (xevent->xproperty.window)); break; case ClientMessage: if (xevent->xclient.message_type == toolkit_action_atom) { long action; action = xevent->xclient.data.l[0]; if (action == toolkit_action_window_menu_atom) { WnckWindow *win; win = wnck_window_get (xevent->xclient.window); if (win) { action_menu_map (win, xevent->xclient.data.l[2], xevent->xclient.data.l[1]); } } else if (action == toolkit_action_force_quit_dialog_atom) { WnckWindow *win; win = wnck_window_get (xevent->xclient.window); if (win) { if (xevent->xclient.data.l[2]) show_force_quit_dialog (win, xevent->xclient.data.l[1]); else hide_force_quit_dialog (win); } } } else if (xevent->xclient.message_type == decor_request_atom) { WnckWindow *win = wnck_window_get (xevent->xclient.window); if (win) update_window_decoration_size (win); } default: break; } if (xid) { WnckWindow *win; win = wnck_window_get (xid); if (win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { gint i, j; event_callback cb = NULL; Window w = xevent->xany.window; for (i = 0; i < 3; ++i) for (j = 0; j < 3; ++j) if (d->event_windows[i][j].window == w) cb = d->event_windows[i][j].callback; if (!cb) { for (i = 0; i < BUTTON_NUM; ++i) if (d->button_windows[i].window == w) cb = d->button_windows[i].callback; } if (cb) { decor_event gtkwd_event; decor_event_type gtkwd_type; gtkwd_event.window = w; switch (xevent->type) { case ButtonPress: case ButtonRelease: if (xevent->type == ButtonPress) gtkwd_type = GButtonPress; else gtkwd_type = GButtonRelease; gtkwd_event.button = xevent->xbutton.button; gtkwd_event.x = xevent->xbutton.x; gtkwd_event.y = xevent->xbutton.y; gtkwd_event.x_root = xevent->xbutton.x_root; gtkwd_event.y_root = xevent->xbutton.y_root; gtkwd_event.time = xevent->xbutton.time; break; case EnterNotify: case LeaveNotify: if (xevent->type == EnterNotify) gtkwd_type = GEnterNotify; else gtkwd_type = GLeaveNotify; gtkwd_event.x = xevent->xcrossing.x; gtkwd_event.y = xevent->xcrossing.y; gtkwd_event.x_root = xevent->xcrossing.x_root; gtkwd_event.y_root = xevent->xcrossing.y_root; gtkwd_event.time = xevent->xcrossing.time; break; default: cb = NULL; break; } if (cb) (*cb) (win, >kwd_event, gtkwd_type); } } } } return GDK_FILTER_CONTINUE; } GdkFilterReturn selection_event_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer data) { Display *xdisplay; GdkDisplay *gdkdisplay; XEvent *xevent = gdkxevent; int status; gdkdisplay = gdk_display_get_default (); xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay); switch (xevent->type) { case SelectionRequest: decor_handle_selection_request (xdisplay, xevent, dm_sn_timestamp); break; case SelectionClear: status = decor_handle_selection_clear (xdisplay, xevent, 0); if (status == DECOR_SELECTION_GIVE_UP) gtk_main_quit (); default: break; } return GDK_FILTER_CONTINUE; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/wnck.c0000644000015301777760000005011012321343002022651 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" const gchar * get_frame_type (WnckWindow *win) { WnckWindowType wnck_type; if (win == NULL) return "bare"; wnck_type = wnck_window_get_window_type (win); switch (wnck_type) { case WNCK_WINDOW_NORMAL: return "normal"; case WNCK_WINDOW_DIALOG: { Atom actual; int result, format; unsigned long n, left; unsigned char *data; Window xid = wnck_window_get_xid (win); if (xid == None) return "bare"; gdk_error_trap_push (); result = XGetWindowProperty (gdk_x11_get_default_xdisplay (), xid, net_wm_state_atom, 0L, 1024L, FALSE, XA_ATOM, &actual, &format, &n, &left, &data); gdk_flush (); gdk_error_trap_pop (); if (result == Success && data) { Atom *a = (Atom *) data; while (n--) if (*a++ == net_wm_state_modal_atom) { XFree ((void *) data); return "modal_dialog"; } } return "dialog"; } case WNCK_WINDOW_MENU: return "menu"; case WNCK_WINDOW_UTILITY: return "utility"; default: return "bare"; } return "normal"; } static void window_name_changed (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { if (!request_update_window_decoration_size (win)) queue_decor_draw (d); } } static void window_geometry_changed (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { int width, height; wnck_window_get_client_window_geometry (win, NULL, NULL, &width, &height); if (width != d->client_width || height != d->client_height) { d->client_width = width; d->client_height = height; request_update_window_decoration_size (win); update_event_windows (win); } } } static void window_icon_changed (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { update_window_decoration_icon (win); queue_decor_draw (d); } } static void window_state_changed (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { update_window_decoration_state (win); if (!request_update_window_decoration_size (win)) queue_decor_draw (d); update_event_windows (win); } } static void window_actions_changed (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { update_window_decoration_actions (win); if (!request_update_window_decoration_size (win)) queue_decor_draw (d); update_event_windows (win); } } void update_frames_border_extents (gpointer key, gpointer value, gpointer user_data) { decor_frame_t *frame = (decor_frame_t *) value; (*theme_update_border_extents) (frame); } void decorations_changed (WnckScreen *screen) { GdkDisplay *gdkdisplay; GdkScreen *gdkscreen; GList *windows; Window select; gdkdisplay = gdk_display_get_default (); gdkscreen = gdk_display_get_default_screen (gdkdisplay); const gchar *titlebar_font = NULL; g_object_get (settings, "titlebar-font", &titlebar_font, NULL); gwd_frames_foreach (set_frames_scales, (gpointer) titlebar_font); update_titlebar_font (); gwd_process_frames (update_frames_border_extents, window_type_frames, WINDOW_TYPE_FRAMES_NUM, NULL); update_shadow (); update_default_decorations (gdkscreen); if (minimal) return; /* Update all normal windows */ windows = wnck_screen_get_windows (screen); while (windows != NULL) { decor_t *d = g_object_get_data (G_OBJECT (windows->data), "decor"); if (d->decorated) { #ifdef USE_METACITY if (d->draw == draw_window_decoration || d->draw == meta_draw_window_decoration) d->draw = theme_draw_window_decoration; #endif } update_window_decoration (WNCK_WINDOW (windows->data)); windows = windows->next; } /* Update switcher window */ if (switcher_window && get_window_prop (switcher_window->prop_xid, select_window_atom, &select)) { decor_t *d = switcher_window; /* force size update */ d->context = NULL; d->width = d->height = 0; update_switcher_window (d->prop_xid, select); } } void restack_window (WnckWindow *win, int stack_mode) { Display *xdisplay; GdkDisplay *gdkdisplay; GdkScreen *screen; Window xroot; XEvent ev; gdkdisplay = gdk_display_get_default (); xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay); screen = gdk_display_get_default_screen (gdkdisplay); xroot = RootWindowOfScreen (gdk_x11_screen_get_xscreen (screen)); if (action_menu_mapped) { gtk_object_destroy (GTK_OBJECT (action_menu)); return; } ev.xclient.type = ClientMessage; ev.xclient.display = xdisplay; ev.xclient.serial = 0; ev.xclient.send_event = TRUE; ev.xclient.window = wnck_window_get_xid (win); ev.xclient.message_type = restack_window_atom; ev.xclient.format = 32; ev.xclient.data.l[0] = 2; ev.xclient.data.l[1] = None; ev.xclient.data.l[2] = stack_mode; ev.xclient.data.l[3] = 0; ev.xclient.data.l[4] = 0; XSendEvent (xdisplay, xroot, FALSE, SubstructureRedirectMask | SubstructureNotifyMask, &ev); XSync (xdisplay, FALSE); } void add_frame_window (WnckWindow *win, Window frame, Bool mode) { Display *xdisplay; XSetWindowAttributes attr; gulong xid = wnck_window_get_xid (win); decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); gint i, j; xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); /* If we have already done this, there is no need to do it again, except * if the property changed. * * The reason this check is here is because sometimes the PropertyNotify X * event can come a bit after the property on the window is actually set * which might result in this function being called twice - once by * wnck through window_opened and once through our X event handler * event_filter_func */ if (d->created && mode && d->frame_window) return; d->active = wnck_window_is_active (win); d->win = win; d->frame = gwd_get_decor_frame (get_frame_type (win)); d->last_pos_entered = NULL; attr.event_mask = ButtonPressMask | EnterWindowMask | LeaveWindowMask | ExposureMask; attr.override_redirect = TRUE; gdk_error_trap_push (); if (mode) { GdkColormap *colormap; d->frame_window = create_gdk_window (frame); d->decor_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); colormap = get_colormap_for_drawable (GDK_DRAWABLE (d->frame_window)); d->decor_image = gtk_image_new (); gtk_widget_set_colormap (d->decor_window, colormap); gtk_widget_set_colormap (d->decor_image, colormap); d->decor_event_box = gtk_event_box_new (); gtk_event_box_set_visible_window (GTK_EVENT_BOX (d->decor_event_box), FALSE); gtk_widget_set_events (d->decor_event_box, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK); g_signal_connect (G_OBJECT (d->decor_event_box), "button-press-event", G_CALLBACK (frame_handle_button_press), (gpointer) (d)); g_signal_connect (G_OBJECT (d->decor_event_box), "button-release-event", G_CALLBACK (frame_handle_button_release), (gpointer) (d)); g_signal_connect (G_OBJECT (d->decor_event_box), "motion-notify-event", G_CALLBACK (frame_handle_motion), (gpointer) (d)); gtk_container_add (GTK_CONTAINER (d->decor_event_box), d->decor_image); gtk_event_box_set_above_child (GTK_EVENT_BOX (d->decor_event_box), TRUE); gtk_widget_show_all (d->decor_event_box); gtk_window_set_decorated (GTK_WINDOW (d->decor_window), FALSE); gtk_window_set_default_size (GTK_WINDOW (d->decor_window), 1000, 1000); gtk_container_add (GTK_CONTAINER (d->decor_window), d->decor_event_box); /* Assumed realization happens here */ g_signal_connect (G_OBJECT (d->decor_window), "realize", G_CALLBACK (frame_window_realized), (gpointer) d); gtk_widget_show_all (d->decor_window); gtk_widget_show (d->decor_window); g_object_set_data (G_OBJECT (d->frame_window), "client_wnck_window", win); } else { d->frame_window = NULL; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { d->event_windows[i][j].window = XCreateWindow (xdisplay, frame, 0, 0, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); if (cursor[i][j].cursor) XDefineCursor (xdisplay, d->event_windows[i][j].window, cursor[i][j].cursor); } } attr.event_mask |= ButtonReleaseMask; for (i = 0; i < BUTTON_NUM; ++i) { d->button_windows[i].window = XCreateWindow (xdisplay, frame, 0, 0, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); d->button_states[i] = 0; } } gdk_display_sync (gdk_display_get_default ()); if (!gdk_error_trap_pop ()) { if (get_mwm_prop (xid) & (MWM_DECOR_ALL | MWM_DECOR_TITLE)) d->decorated = TRUE; for (i = 0; i < 3; ++i) for (j = 0; j < 3; ++j) { Window win = d->event_windows[i][j].window; g_hash_table_insert (frame_table, GINT_TO_POINTER (win), GINT_TO_POINTER (xid)); } for (i = 0; i < BUTTON_NUM; ++i) g_hash_table_insert (frame_table, GINT_TO_POINTER (d->button_windows[i].window), GINT_TO_POINTER (xid)); if (d->frame_window) { g_hash_table_insert (frame_table, GINT_TO_POINTER (frame), GINT_TO_POINTER (xid)); } if (d->decorated) { update_window_decoration_state (win); update_window_decoration_actions (win); update_window_decoration_icon (win); request_update_window_decoration_size (win); update_event_windows (win); } } else { for (i = 0; i < 3; ++i) for (j = 0; j < 3; ++j) d->event_windows[i][j].window = None; } d->created = TRUE; } void remove_frame_window (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); Display *xdisplay; xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); if (!d->frame_window) { int i, j; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { XDestroyWindow (xdisplay, d->event_windows[i][j].window); d->event_windows[i][j].window = None; } } for (i = 0; i < BUTTON_NUM; ++i) { XDestroyWindow (xdisplay, d->button_windows[i].window); d->button_windows[i].window = None; d->button_states[i] = 0; } } if (d->pixmap) { g_object_unref (G_OBJECT (d->pixmap)); d->pixmap = NULL; } if (d->buffer_pixmap) { g_object_unref (G_OBJECT (d->buffer_pixmap)); d->buffer_pixmap = NULL; } if (d->cr) { cairo_destroy (d->cr); d->cr = NULL; } if (d->picture && !d->frame_window) { XRenderFreePicture (xdisplay, d->picture); d->picture = 0; } if (d->name) { g_free (d->name); d->name = NULL; } if (d->layout) { g_object_unref (G_OBJECT (d->layout)); d->layout = NULL; } if (d->icon) { cairo_pattern_destroy (d->icon); d->icon = NULL; } if (d->icon_pixmap) { g_object_unref (G_OBJECT (d->icon_pixmap)); d->icon_pixmap = NULL; } if (d->icon_pixbuf) { g_object_unref (G_OBJECT (d->icon_pixbuf)); d->icon_pixbuf = NULL; } if (d->force_quit_dialog) { GtkWidget *dialog = d->force_quit_dialog; d->force_quit_dialog = NULL; gtk_widget_destroy (dialog); } if (d->frame_window) { gdk_window_destroy (d->frame_window); d->frame_window = NULL; } if (d->decor_image) { g_object_unref (d->decor_image); d->decor_image = NULL; } if (d->decor_event_box) { g_object_unref (d->decor_event_box); d->decor_event_box = NULL; } if (d->decor_window) { g_object_unref (d->decor_window); d->decor_window = NULL; } if (d->frame) { gwd_decor_frame_unref (d->frame); d->frame = NULL; } gdk_error_trap_push (); XDeleteProperty (xdisplay, wnck_window_get_xid (win), win_decor_atom); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop (); d->width = 0; d->height = 0; d->decorated = FALSE; d->state = 0; d->actions = 0; d->context = NULL; d->shadow = NULL; draw_list = g_slist_remove (draw_list, d); } void connect_window (WnckWindow *win) { g_signal_connect_object (win, "name_changed", G_CALLBACK (window_name_changed), 0, 0); g_signal_connect_object (win, "geometry_changed", G_CALLBACK (window_geometry_changed), 0, 0); g_signal_connect_object (win, "icon_changed", G_CALLBACK (window_icon_changed), 0, 0); g_signal_connect_object (win, "state_changed", G_CALLBACK (window_state_changed), 0, 0); g_signal_connect_object (win, "actions_changed", G_CALLBACK (window_actions_changed), 0, 0); } static void set_context_if_decorated (decor_t *d, decor_context_t *context) { if (d->decorated) d->context = context; } static void active_window_changed (WnckScreen *screen) { WnckWindow *win; decor_t *d; win = wnck_screen_get_previously_active_window (screen); if (win) { d = g_object_get_data (G_OBJECT (win), "decor"); if (d) { d->active = wnck_window_is_active (win); decor_frame_t *frame = d->decorated ? d->frame : gwd_get_decor_frame (get_frame_type (win)); if ((d->state & META_MAXIMIZED) == META_MAXIMIZED) { if (!d->frame_window) { if (d->active) { set_context_if_decorated (d, &frame->max_window_context_active); d->shadow = frame->max_border_shadow_active; } else { set_context_if_decorated (d, &frame->max_window_context_inactive); d->shadow = frame->max_border_shadow_inactive; } } else { d->shadow = d->frame->max_border_no_shadow; } } else { if (!d->frame_window) { if (d->active) { set_context_if_decorated (d, &frame->window_context_active); d->shadow = frame->border_shadow_active; } else { set_context_if_decorated (d, &frame->window_context_inactive); d->shadow = frame->border_shadow_inactive; } } else { d->shadow = d->frame->border_no_shadow; } } if (!d->decorated) gwd_decor_frame_unref (frame); /* We need to update the decoration size here * since the shadow size might have changed and * in that case the decoration will be redrawn, * however if the shadow size doesn't change * then we need to redraw the decoration anyways * since the image would have changed */ if (d->win != NULL && !request_update_window_decoration_size (d->win) && d->decorated && d->pixmap) queue_decor_draw (d); } } win = wnck_screen_get_active_window (screen); if (win) { d = g_object_get_data (G_OBJECT (win), "decor"); if (d) { d->active = wnck_window_is_active (win); decor_frame_t *frame = d->decorated ? d->frame : gwd_get_decor_frame (get_frame_type (win)); if ((d->state & META_MAXIMIZED) == META_MAXIMIZED) { if (!d->frame_window) { if (d->active) { set_context_if_decorated (d, &frame->max_window_context_active); d->shadow = frame->max_border_shadow_active; } else { set_context_if_decorated (d, &frame->max_window_context_inactive); d->shadow = frame->max_border_shadow_inactive; } } else { d->shadow = frame->max_border_no_shadow; } } else { if (!d->frame_window) { if (d->active) { set_context_if_decorated (d, &frame->window_context_active); d->shadow = frame->border_shadow_active; } else { set_context_if_decorated (d, &frame->window_context_inactive); d->shadow = frame->border_shadow_inactive; } } else { d->shadow = frame->border_no_shadow; } } if (!d->decorated) gwd_decor_frame_unref (frame); /* We need to update the decoration size here * since the shadow size might have changed and * in that case the decoration will be redrawn, * however if the shadow size doesn't change * then we need to redraw the decoration anyways * since the image would have changed */ if (d->win != NULL && !request_update_window_decoration_size (d->win) && d->decorated && d->pixmap) queue_decor_draw (d); } } } void window_opened (WnckScreen *screen, WnckWindow *win) { decor_t *d; Window window; gulong xid; unsigned int i, j; static event_callback callback[3][3] = { { top_left_event, top_event, top_right_event }, { left_event, title_event, right_event }, { bottom_left_event, bottom_event, bottom_right_event } }; static event_callback button_callback[BUTTON_NUM] = { close_button_event, max_button_event, min_button_event, menu_button_event, shade_button_event, above_button_event, stick_button_event, unshade_button_event, unabove_button_event, unstick_button_event }; d = calloc (1, sizeof (decor_t)); if (!d) return; for (i = 0; i < 3; ++i) for (j = 0; j < 3; ++j) d->event_windows[i][j].callback = callback[i][j]; for (i = 0; i < BUTTON_NUM; ++i) d->button_windows[i].callback = button_callback[i]; wnck_window_get_client_window_geometry (win, NULL, NULL, &d->client_width, &d->client_height); d->draw = theme_draw_window_decoration; d->created = FALSE; d->pixmap = NULL; d->cr = NULL; d->buffer_pixmap = NULL; d->picture = None; connect_window (win); g_object_set_data (G_OBJECT (win), "decor", d); xid = wnck_window_get_xid (win); if (get_window_prop (xid, frame_input_window_atom, &window)) { add_frame_window (win, window, FALSE); } else if (get_window_prop (xid, frame_output_window_atom, &window)) { add_frame_window (win, window, TRUE); } } void window_closed (WnckScreen *screen, WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d) { remove_frame_window (win); g_object_set_data (G_OBJECT (win), "decor", NULL); g_free (d); } } void connect_screen (WnckScreen *screen) { GList *windows; g_signal_connect_object (G_OBJECT (screen), "active_window_changed", G_CALLBACK (active_window_changed), 0, 0); g_signal_connect_object (G_OBJECT (screen), "window_opened", G_CALLBACK (window_opened), 0, 0); g_signal_connect_object (G_OBJECT (screen), "window_closed", G_CALLBACK (window_closed), 0, 0); windows = wnck_screen_get_windows (screen); while (windows != NULL) { window_opened (screen, windows->data); windows = windows->next; } } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-settings-notified.c0000644000015301777760000002107412321343002026134 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include "gwd-settings-notified-interface.h" #include "gwd-settings-notified.h" #include "gwd-metacity-window-decoration-util.h" #include "gtk-window-decorator.h" #define GWD_SETTINGS_NOTIFIED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GWD_TYPE_SETTINGS_NOTIFIED, GWDSettingsNotifiedImpl)); #define GWD_SETTINGS_NOTIFIED_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GWD_TYPE_SETTINGS_NOTIFIED, GWDSettingsNotifiedImplClass)); #define GWD_IS_MOCK_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GWD_TYPE_SETTINGS_NOTIFIED)); #define GWD_IS_MOCK_SETTINGS_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GWD_TYPE_SETTINGS_NOTIFIED)); #define GWD_SETTINGS_NOTIFIED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GWD_TYPE_SETTINGS_NOTIFIED, GWDSettingsNotifiedImplClass)); typedef struct _GWDSettingsNotifiedImpl { GObject parent; } GWDSettingsNotifiedImpl; typedef struct _GWDSettingsNotifiedImplClass { GObjectClass parent_class; } GWDSettingsNotifiedImplClass; enum { GWD_SETTINGS_NOTIFIED_IMPL_PROPERTY_WNCK_SCREEN = 1 }; static void gwd_settings_notified_impl_interface_init (GWDSettingsNotifiedInterface *interface); G_DEFINE_TYPE_WITH_CODE (GWDSettingsNotifiedImpl, gwd_settings_notified_impl, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GWD_TYPE_SETTINGS_NOTIFIED_INTERFACE, gwd_settings_notified_impl_interface_init)) #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GWD_TYPE_SETTINGS_NOTIFIED, GWDSettingsNotifiedImplPrivate)) typedef struct _GWDSettingsNotifiedImplPrivate { WnckScreen *screen; } GWDSettingsNotifiedImplPrivate; static gboolean gwd_settings_notified_impl_update_decorations (GWDSettingsNotified *notified) { GWDSettingsNotifiedImplPrivate *priv = GET_PRIVATE (notified); decorations_changed (priv->screen); return TRUE; } void set_frame_scale (decor_frame_t *frame, const gchar *font_str) { gfloat scale = 1.0f; gwd_decor_frame_ref (frame); if (frame->titlebar_font) pango_font_description_free (frame->titlebar_font); frame->titlebar_font = pango_font_description_from_string (font_str); scale = (*theme_get_title_scale) (frame); pango_font_description_set_size (frame->titlebar_font, MAX (pango_font_description_get_size (frame->titlebar_font) * scale, 1)); gwd_decor_frame_unref (frame); } void set_frames_scales (gpointer key, gpointer value, gpointer user_data) { decor_frame_t *frame = (decor_frame_t *) value; gchar *font_str = (gchar *) user_data; gwd_decor_frame_ref (frame); set_frame_scale (frame, font_str); gwd_decor_frame_unref (frame); } static gboolean gwd_settings_notified_impl_update_frames (GWDSettingsNotified *notified) { const gchar *titlebar_font = NULL; g_object_get (settings, "titlebar-font", &titlebar_font, NULL); gwd_frames_foreach (set_frames_scales, (gpointer) titlebar_font); return TRUE; } static gboolean gwd_settings_notified_impl_update_metacity_theme (GWDSettingsNotified *notified) { #ifdef USE_METACITY const gchar *meta_theme = NULL; g_object_get (settings, "metacity-theme", &meta_theme, NULL); if (gwd_metacity_window_decoration_update_meta_theme (meta_theme, meta_theme_get_current, meta_theme_set_current)) { theme_draw_window_decoration = meta_draw_window_decoration; theme_calc_decoration_size = meta_calc_decoration_size; theme_update_border_extents = meta_update_border_extents; theme_get_event_window_position = meta_get_event_window_position; theme_get_button_position = meta_get_button_position; theme_get_title_scale = meta_get_title_scale; theme_get_shadow = meta_get_shadow; } else { g_log ("gtk-window-decorator", G_LOG_LEVEL_INFO, "using cairo decoration"); theme_draw_window_decoration = draw_window_decoration; theme_calc_decoration_size = calc_decoration_size; theme_update_border_extents = update_border_extents; theme_get_event_window_position = get_event_window_position; theme_get_button_position = get_button_position; theme_get_title_scale = get_title_scale; theme_get_shadow = cairo_get_shadow; } return TRUE; #else theme_draw_window_decoration = draw_window_decoration; theme_calc_decoration_size = calc_decoration_size; theme_update_border_extents = update_border_extents; theme_get_event_window_position = get_event_window_position; theme_get_button_position = get_button_position; theme_get_title_scale = get_title_scale; theme_get_shadow = cairo_get_shadow; return FALSE; #endif } static gboolean gwd_settings_notified_impl_update_metacity_button_layout (GWDSettingsNotified *notified) { #ifdef USE_METACITY const gchar *button_layout; g_object_get (settings, "metacity-button-layout", &button_layout, NULL); if (button_layout) { meta_update_button_layout (button_layout); meta_button_layout_set = TRUE; return TRUE; } if (meta_button_layout_set) { meta_button_layout_set = FALSE; return TRUE; } #endif return FALSE; } static void gwd_settings_notified_impl_interface_init (GWDSettingsNotifiedInterface *interface) { interface->update_decorations = gwd_settings_notified_impl_update_decorations; interface->update_frames = gwd_settings_notified_impl_update_frames; interface->update_metacity_button_layout = gwd_settings_notified_impl_update_metacity_button_layout; interface->update_metacity_theme = gwd_settings_notified_impl_update_metacity_theme; } static void gwd_settings_notified_impl_dispose (GObject *object) { GWDSettingsNotifiedImplPrivate *priv = GET_PRIVATE (object); if (priv->screen) { g_object_unref (priv->screen); priv->screen = NULL; } } static void gwd_settings_notified_impl_finalize (GObject *object) { G_OBJECT_CLASS (gwd_settings_notified_impl_parent_class)->finalize (object); } static void gwd_settings_notified_impl_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDSettingsNotifiedImplPrivate *priv = GET_PRIVATE (object); switch (property_id) { case GWD_SETTINGS_NOTIFIED_IMPL_PROPERTY_WNCK_SCREEN: g_return_if_fail (!priv->screen); priv->screen = g_value_get_object (value); break; default: break; } } static void gwd_settings_notified_impl_class_init (GWDSettingsNotifiedImplClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); g_type_class_add_private (klass, sizeof (GWDSettingsNotifiedImplPrivate)); object_class->dispose = gwd_settings_notified_impl_dispose; object_class->finalize = gwd_settings_notified_impl_finalize; object_class->set_property = gwd_settings_notified_impl_set_property; g_object_class_install_property (object_class, GWD_SETTINGS_NOTIFIED_IMPL_PROPERTY_WNCK_SCREEN, g_param_spec_object ("wnck-screen", "WnckScreen", "A WnckScreen", WNCK_TYPE_SCREEN, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); } void gwd_settings_notified_impl_init (GWDSettingsNotifiedImpl *self) { } GWDSettingsNotified * gwd_settings_notified_impl_new (WnckScreen *screen) { static const guint gwd_settings_notified_impl_n_construction_properties = 1; GValue wnck_screen_value = G_VALUE_INIT; GParameter params[gwd_settings_notified_impl_n_construction_properties]; GWDSettingsNotified *notified = NULL; g_value_init (&wnck_screen_value, G_TYPE_OBJECT); g_value_set_object (&wnck_screen_value, G_OBJECT (screen)); params[0].name = "wnck-screen"; params[0].value = wnck_screen_value; notified = GWD_SETTINGS_NOTIFIED_INTERFACE (g_object_newv (GWD_TYPE_SETTINGS_NOTIFIED, gwd_settings_notified_impl_n_construction_properties, params)); g_value_unset (&wnck_screen_value); return notified; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-cairo-window-decoration-util.c0000644000015301777760000000334112321343002030174 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include "gwd-cairo-window-decoration-util.h" static const decor_extents_t gwd_cairo_window_decoration_default_win_extents = { 6, 6, 10, 6 }; static const decor_extents_t gwd_cairo_window_decoration_default_max_win_extents = { 6, 6, 4, 6 }; const decor_extents_t * gwd_cairo_window_decoration_get_default_max_win_extents () { return &gwd_cairo_window_decoration_default_max_win_extents; } const decor_extents_t * gwd_cairo_window_decoration_get_default_win_extents () { return &gwd_cairo_window_decoration_default_win_extents; } void gwd_cairo_window_decoration_get_extents (decor_extents_t *win_extents, decor_extents_t *max_win_extents) { memcpy (win_extents, gwd_cairo_window_decoration_get_default_max_win_extents (), sizeof (decor_extents_t)); memcpy (max_win_extents, gwd_cairo_window_decoration_get_default_win_extents (), sizeof (decor_extents_t)); } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gwd-cairo-window-decoration-util.h0000644000015301777760000000237112321343002030203 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef _GWD_CAIRO_WINDOW_DECORATION_UTIL_H #define _GWD_CAIRO_WINDOW_DECORATION_UTIL_H #include #include G_BEGIN_DECLS const decor_extents_t * gwd_cairo_window_decoration_get_default_max_win_extents (); const decor_extents_t * gwd_cairo_window_decoration_get_default_win_extents (); void gwd_cairo_window_decoration_get_extents (decor_extents_t *win_extents, decor_extents_t *max_win_extents); G_END_DECLS; #endif compiz-0.9.11+14.04.20140409/gtk/window-decorator/blurprops.c0000644000015301777760000000502212321343002023741 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" #include "gwd-settings-interface.h" void decor_update_blur_property (decor_t *d, int width, int height, Region top_region, int top_offset, Region bottom_region, int bottom_offset, Region left_region, int left_offset, Region right_region, int right_offset) { Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); long *data = NULL; int size = 0; gint blur_type; g_object_get (settings, "blur", &blur_type, NULL); if (blur_type != BLUR_TYPE_ALL) { bottom_region = NULL; left_region = NULL; right_region = NULL; if (blur_type != BLUR_TYPE_TITLEBAR) top_region = NULL; } if (top_region) size += top_region->numRects; if (bottom_region) size += bottom_region->numRects; if (left_region) size += left_region->numRects; if (right_region) size += right_region->numRects; if (size) data = (long *) malloc (sizeof (long) * (2 + size * 6)); if (data) { decor_region_to_blur_property (data, 4, 0, width, height, top_region, top_offset, bottom_region, bottom_offset, left_region, left_offset, right_region, right_offset); gdk_error_trap_push (); XChangeProperty (xdisplay, d->prop_xid, win_blur_decor_atom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, 2 + size * 6); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop (); free (data); } else { gdk_error_trap_push (); XDeleteProperty (xdisplay, d->prop_xid, win_blur_decor_atom); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop (); } } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gdk.c0000644000015301777760000000706612321343002022470 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" GdkPixmap * pixmap_new_from_pixbuf (GdkPixbuf *pixbuf, GtkWidget *parent) { GdkPixmap *pixmap; guint width, height; cairo_t *cr; width = gdk_pixbuf_get_width (pixbuf); height = gdk_pixbuf_get_height (pixbuf); pixmap = create_pixmap (width, height, parent); if (!pixmap) return NULL; cr = (cairo_t *) gdk_cairo_create (GDK_DRAWABLE (pixmap)); gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint (cr); cairo_destroy (cr); return pixmap; } void gdk_cairo_set_source_color_alpha (cairo_t *cr, GdkColor *color, double alpha) { cairo_set_source_rgba (cr, color->red / 65535.0, color->green / 65535.0, color->blue / 65535.0, alpha); } GdkWindow * create_gdk_window (Window xframe) { GdkDisplay *display = gdk_display_get_default (); GdkScreen *screen = gdk_display_get_default_screen (display); GdkWindow *window = create_foreign_window (xframe); GdkColormap *cmap = gdk_screen_get_rgb_colormap (screen); gdk_drawable_set_colormap (GDK_DRAWABLE (window), cmap); return window; } GdkColormap * get_colormap_for_drawable (GdkDrawable *d) { GdkDisplay *display = gdk_display_get_default (); GdkScreen *screen = gdk_display_get_default_screen (display); if (gdk_drawable_get_depth (d) == 32) return gdk_screen_get_rgba_colormap (screen); return gdk_screen_get_rgb_colormap (screen); } XRenderPictFormat * get_format_for_drawable (decor_t *d, GdkDrawable *drawable) { if (!d->frame_window || gdk_drawable_get_depth (drawable) == 32) return xformat_rgba; return xformat_rgb; } GdkPixmap * create_native_pixmap_and_wrap (int w, int h, GtkWidget *parent_style_window) { GdkWindow *window; if (w <= 0 || h <= 0) abort (); window = gtk_widget_get_window (parent_style_window); GdkPixmap *pixmap = gdk_pixmap_foreign_new (XCreatePixmap (gdk_x11_display_get_xdisplay (gdk_display_get_default ()), GDK_WINDOW_XID (window), w, h, gdk_drawable_get_depth (window))); GdkColormap *cmap = get_colormap_for_drawable (GDK_DRAWABLE (pixmap)); gdk_drawable_set_colormap (GDK_DRAWABLE (pixmap), cmap); return pixmap; } GdkPixmap * create_pixmap (int w, int h, GtkWidget *parent_style_window) { GdkWindow *window; if (w == 0 || h == 0) abort (); window = gtk_widget_get_window (parent_style_window); GdkPixmap *pixmap = gdk_pixmap_new (GDK_DRAWABLE (window), w, h, -1 /* CopyFromParent */); GdkColormap *cmap = get_colormap_for_drawable (GDK_DRAWABLE (pixmap)); gdk_drawable_set_colormap (GDK_DRAWABLE (pixmap), cmap); return pixmap; } compiz-0.9.11+14.04.20140409/gtk/window-decorator/gtk-window-decorator.c0000644000015301777760000002746412321343002026001 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2009 Sam Spilsbury * Frames Management: Copright © 2010 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" #include "gwd-settings-writable-interface.h" #include "gwd-settings.h" #include "gwd-settings-interface.h" #include "gwd-settings-notified-interface.h" #include "gwd-settings-notified.h" GWDSettingsNotified *notified; GWDSettingsWritable *writable; GWDSettings *settings; gdouble decoration_alpha = 0.5; #ifdef USE_METACITY MetaButtonLayout meta_button_layout; gboolean meta_button_layout_set = FALSE; #endif gboolean minimal = FALSE; #define SWITCHER_SPACE 40 const float STROKE_ALPHA = 0.6f; const unsigned short ICON_SPACE = 20; const float DOUBLE_CLICK_DISTANCE = 8.0f; const float SHADOW_RADIUS = 8.0f; const float SHADOW_OPACITY = 0.5f; const unsigned short SHADOW_OFFSET_X = 1; const unsigned short SHADOW_OFFSET_Y = 1; const float META_OPACITY = 0.75f; const float META_ACTIVE_OPACITY = 1.0f; guint cmdline_options = 0; GdkPixmap *decor_normal_pixmap = NULL; GdkPixmap *decor_active_pixmap = NULL; Atom frame_input_window_atom; Atom frame_output_window_atom; Atom win_decor_atom; Atom win_blur_decor_atom; Atom wm_move_resize_atom; Atom restack_window_atom; Atom select_window_atom; Atom mwm_hints_atom; Atom switcher_fg_atom; Atom compiz_shadow_info_atom; Atom compiz_shadow_color_atom; Atom toolkit_action_atom; Atom toolkit_action_window_menu_atom; Atom toolkit_action_force_quit_dialog_atom; Atom decor_request_atom; Atom decor_pending_atom; Atom decor_delete_pixmap_atom; Atom net_wm_state_atom; Atom net_wm_state_modal_atom; Time dm_sn_timestamp; struct _cursor cursor[3][3] = { { C (top_left_corner), C (top_side), C (top_right_corner) }, { C (left_side), C (left_ptr), C (right_side) }, { C (bottom_left_corner), C (bottom_side), C (bottom_right_corner) } }; struct _pos pos[3][3] = { { { 0, 0, 10, 21, 0, 0, 0, 0, 0, 1 }, { 10, 0, -8, 6, 0, 0, 1, 0, 0, 1 }, { 2, 0, 10, 21, 1, 0, 0, 0, 0, 1 } }, { { 0, 10, 6, 11, 0, 0, 0, 1, 1, 0 }, { 6, 6, 0, 15, 0, 0, 1, 0, 0, 1 }, { 6, 10, 6, 11, 1, 0, 0, 1, 1, 0 } }, { { 0, 17, 10, 10, 0, 1, 0, 0, 1, 0 }, { 10, 21, -8, 6, 0, 1, 1, 0, 1, 0 }, { 2, 17, 10, 10, 1, 1, 0, 0, 1, 0 } } }, bpos[] = { { 0, 6, 16, 16, 1, 0, 0, 0, 0, 0 }, { 0, 6, 16, 16, 1, 0, 0, 0, 0, 0 }, { 0, 6, 16, 16, 1, 0, 0, 0, 0, 0 }, { 6, 2, 16, 16, 0, 0, 0, 0, 0, 0 } }; #define WINDOW_TYPE_FRAMES_NUM 5 default_frame_references_t default_frames[WINDOW_TYPE_FRAMES_NUM * 2] = { /* active */ {"normal", NULL }, {"dialog", NULL }, {"modal_dialog", NULL }, {"menu", NULL }, {"utility", NULL}, /* inactive */ {"normal", NULL }, {"dialog", NULL }, {"modal_dialog", NULL }, {"menu", NULL }, {"utility", NULL} }; char *program_name; GtkWidget *switcher_label; GHashTable *frame_table; GtkWidget *action_menu = NULL; gboolean action_menu_mapped = FALSE; decor_color_t _title_color[2]; gint double_click_timeout = 250; GtkWidget *tip_window; GtkWidget *tip_label; GTimeVal tooltip_last_popdown = { 0, 0 }; gint tooltip_timer_tag = 0; GSList *draw_list = NULL; guint draw_idle_id = 0; Window switcher_selected_window = None; decor_t *switcher_window = NULL; XRenderPictFormat *xformat_rgba; XRenderPictFormat *xformat_rgb; const gchar * window_type_frames[WINDOW_TYPE_FRAMES_NUM] = { "normal", "modal_dialog", "dialog", "menu", "utility" }; int main (int argc, char *argv[]) { GdkDisplay *gdkdisplay; Display *xdisplay; GdkScreen *gdkscreen; WnckScreen *screen; gint i, j, status; gboolean replace = FALSE; unsigned int nchildren; Window root_ret, parent_ret; Window *children = NULL; GList *windows, *win; decor_frame_t *bare_p, *switcher_p; const char *option_meta_theme = NULL; gint option_blur_type = 0; program_name = argv[0]; gtk_init (&argc, &argv); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); for (i = 0; i < argc; ++i) { if (strcmp (argv[i], "--minimal") == 0) { minimal = TRUE; } else if (strcmp (argv[i], "--replace") == 0) { replace = TRUE; } else if (strcmp (argv[i], "--blur") == 0) { if (argc > ++i) { if (strcmp (argv[i], "titlebar") == 0) option_blur_type = BLUR_TYPE_TITLEBAR; else if (strcmp (argv[i], "all") == 0) option_blur_type = BLUR_TYPE_ALL; } } #ifdef USE_METACITY else if (strcmp (argv[i], "--metacity-theme") == 0) { if (argc > ++i) option_meta_theme = argv[i]; } #endif else if (strcmp (argv[i], "--help") == 0) { fprintf (stderr, "%s " "[--minimal] " "[--replace] " "[--blur none|titlebar|all] " #ifdef USE_METACITY "[--metacity-theme THEME] " #endif "[--help]" "\n", program_name); return 0; } } gdkdisplay = gdk_display_get_default (); xdisplay = gdk_x11_display_get_xdisplay (gdkdisplay); gdkscreen = gdk_display_get_default_screen (gdkdisplay); frame_input_window_atom = XInternAtom (xdisplay, DECOR_INPUT_FRAME_ATOM_NAME, FALSE); frame_output_window_atom = XInternAtom (xdisplay, DECOR_OUTPUT_FRAME_ATOM_NAME, FALSE); win_decor_atom = XInternAtom (xdisplay, DECOR_WINDOW_ATOM_NAME, FALSE); win_blur_decor_atom = XInternAtom (xdisplay, DECOR_BLUR_ATOM_NAME, FALSE); wm_move_resize_atom = XInternAtom (xdisplay, "_NET_WM_MOVERESIZE", FALSE); restack_window_atom = XInternAtom (xdisplay, "_NET_RESTACK_WINDOW", FALSE); select_window_atom = XInternAtom (xdisplay, DECOR_SWITCH_WINDOW_ATOM_NAME, FALSE); mwm_hints_atom = XInternAtom (xdisplay, "_MOTIF_WM_HINTS", FALSE); switcher_fg_atom = XInternAtom (xdisplay, DECOR_SWITCH_FOREGROUND_COLOR_ATOM_NAME, FALSE); compiz_shadow_info_atom = XInternAtom (xdisplay, "_COMPIZ_NET_CM_SHADOW_PROPERTIES", FALSE); compiz_shadow_color_atom = XInternAtom (xdisplay, "_COMPIZ_NET_CM_SHADOW_COLOR", FALSE); toolkit_action_atom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION", FALSE); toolkit_action_window_menu_atom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION_WINDOW_MENU", FALSE); toolkit_action_force_quit_dialog_atom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION_FORCE_QUIT_DIALOG", FALSE); net_wm_state_atom = XInternAtom (xdisplay,"_NET_WM_STATE", 0); net_wm_state_modal_atom = XInternAtom (xdisplay, "_NET_WM_STATE_MODAL", 0); decor_request_atom = XInternAtom (xdisplay, DECOR_REQUEST_PIXMAP_ATOM_NAME, 0); decor_pending_atom = XInternAtom (xdisplay, DECOR_PIXMAP_PENDING_ATOM_NAME, 0); decor_delete_pixmap_atom = XInternAtom (xdisplay, DECOR_DELETE_PIXMAP_ATOM_NAME, 0); status = decor_acquire_dm_session (xdisplay, gdk_screen_get_number (gdkscreen), "gwd", replace, &dm_sn_timestamp); if (status != DECOR_ACQUIRE_STATUS_SUCCESS) { if (status == DECOR_ACQUIRE_STATUS_FAILED) { fprintf (stderr, "%s: Could not acquire decoration manager " "selection on screen %d display \"%s\"\n", program_name, gdk_screen_get_number (gdkscreen), DisplayString (xdisplay)); } else if (status == DECOR_ACQUIRE_STATUS_OTHER_DM_RUNNING) { fprintf (stderr, "%s: Screen %d on display \"%s\" already " "has a decoration manager; try using the " "--replace option to replace the current " "decoration manager.\n", program_name, gdk_screen_get_number (gdkscreen), DisplayString (xdisplay)); } return 1; } screen = wnck_screen_get_default (); initialize_decorations (); notified = gwd_settings_notified_impl_new (screen); if (!notified) return 1; writable = GWD_SETTINGS_WRITABLE_INTERFACE (gwd_settings_impl_new (option_blur_type != BLUR_TYPE_NONE ? &option_blur_type : NULL, option_meta_theme ? &option_meta_theme : NULL, notified)); if (!writable) { g_object_unref (notified); return 1; } settings = GWD_SETTINGS_INTERFACE (writable); gwd_settings_writable_freeze_updates (writable); if (!init_settings (writable, screen)) { g_object_unref (writable); fprintf (stderr, "%s: Failed to get necessary gtk settings\n", argv[0]); return 1; } for (i = 0; i < 3; ++i) { for (j = 0; j < 3; j++) { if (cursor[i][j].shape != XC_left_ptr) cursor[i][j].cursor = XCreateFontCursor (xdisplay, cursor[i][j].shape); } } xformat_rgba = XRenderFindStandardFormat (xdisplay, PictStandardARGB32); xformat_rgb = XRenderFindStandardFormat (xdisplay, PictStandardRGB24); frame_table = g_hash_table_new (NULL, NULL); if (!create_tooltip_window ()) { g_object_unref (writable); free (settings); fprintf (stderr, "%s, Couldn't create tooltip window\n", argv[0]); return 1; } wnck_set_client_type (WNCK_CLIENT_TYPE_PAGER); gdk_window_add_filter (NULL, selection_event_filter_func, NULL); if (!minimal) { GdkWindow *root = create_foreign_window (gdk_x11_get_default_root_xwindow ()); gdk_window_add_filter (NULL, event_filter_func, NULL); XQueryTree (xdisplay, gdk_x11_get_default_root_xwindow (), &root_ret, &parent_ret, &children, &nchildren); for (i = 0; i < nchildren; ++i) { GdkWindow *toplevel = create_foreign_window (children[i]); /* Need property notify on all windows */ gdk_window_set_events (toplevel, gdk_window_get_events (toplevel) | GDK_PROPERTY_CHANGE_MASK); } /* Need MapNotify on new windows */ gdk_window_set_events (root, gdk_window_get_events (root) | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK | GDK_SUBSTRUCTURE_MASK); connect_screen (screen); } decor_set_dm_check_hint (xdisplay, gdk_screen_get_number (gdkscreen), WINDOW_DECORATION_TYPE_PIXMAP | WINDOW_DECORATION_TYPE_WINDOW); /* Update the decorations based on the settings */ gwd_settings_writable_thaw_updates (writable); /* Keep the default, bare and switcher decorations around * since otherwise they will be spuriously recreated */ bare_p = gwd_get_decor_frame ("bare"); switcher_p = gwd_get_decor_frame ("switcher"); update_default_decorations (gdkscreen); gtk_main (); win = windows = wnck_screen_get_windows (screen); while (win != NULL) { WnckWindow *w = (WnckWindow *) win->data; window_closed (screen, w); win = g_list_next (win); } g_list_free (windows); if (tip_label) gtk_widget_destroy (GTK_WIDGET (tip_label)); if (tip_window) gtk_widget_destroy (GTK_WIDGET (tip_window)); gwd_decor_frame_unref (bare_p); gwd_decor_frame_unref (switcher_p); fini_settings (); return 0; } compiz-0.9.11+14.04.20140409/gtk/CMakeLists.txt0000644000015301777760000000600112321343002021014 0ustar pbusernogroup00000000000000option (BUILD_GTK "Build gtk-window-decorator and Gnome related toold" 1) option (BUILD_METACITY "Gtk-window-decorator metacity theme support" 1) option (BUILD_GNOME "GNOME integration" 1) compiz_set (USE_GTK ${BUILD_GTK}) compiz_set (USE_METACITY ${BUILD_METACITY}) compiz_set (USE_GNOME ${BUILD_GNOME}) if (USE_GTK) pkg_check_modules (GTK_WINDOW_DECORATOR xrender>=0.8.4 gtk+-2.0>=2.18.0 libwnck-1.0 pangocairo ) if (GTK_WINDOW_DECORATOR_FOUND) set (CMAKE_REQUIRED_FLAGS ${GTK_WINDOW_DECORATOR_CFLAGS}) set (CMAKE_REQUIRED_LIBRARIES ${GTK_WINDOW_DECORATOR_LIBRARIES}) list (FIND CMAKE_REQUIRED_FLAGS "-D_REENTRANT" REENTRANT_INDEX) if (REENTRANT_INDEX) list (REMOVE_AT CMAKE_REQUIRED_FLAGS REENTRANT_INDEX) list (APPEND CMAKE_REQUIRED_FLAGS "-D_REENTRANT=1") endif (REENTRANT_INDEX) check_function_exists (wnck_window_has_name HAVE_WNCK_WINDOW_HAS_NAME) set (CMAKE_REQUIRED_FLAGS "") set (CMAKE_REQUIRED_LIBRARIES "") compiz_pkg_check_modules (HAVE_LIBWNCK_2_18_1 libwnck-1.0>=2.18.1) compiz_pkg_check_modules (HAVE_LIBWNCK_2_19_4 libwnck-1.0>=2.19.4) if (USE_METACITY) pkg_check_modules (METACITY libmetacity-private) if (METACITY_FOUND) compiz_pkg_check_modules (HAVE_METACITY_2_15_21 libmetacity-private>=2.15.21) compiz_pkg_check_modules (HAVE_METACITY_2_17_0 libmetacity-private>=2.17.0) compiz_pkg_check_modules (HAVE_METACITY_2_23_2 libmetacity-private>=2.23.2) else (METACITY_FOUND) compiz_set (USE_METACITY 0) endif (METACITY_FOUND) endif (USE_METACITY) if (USE_GNOME) compiz_pkg_check_modules (GNOME_WINDOW_SETTINGS gnome-window-settings-2.0 gnome-desktop-2.0 ) if (GNOME_WINDOW_SETTINGS_FOUND) exec_program (${PKG_CONFIG_EXECUTABLE} ARGS "--variable=prefix gnome-window-settings-2.0" OUTPUT_VARIABLE windowsettingsdatadir ) set (windowsettingsdatadir ${windowsettingsdatadir}/share) exec_program (${PKG_CONFIG_EXECUTABLE} ARGS "--variable=libdir gnome-window-settings-2.0" OUTPUT_VARIABLE windowsettingslibdir ) else (GNOME_WINDOW_SETTINGS_FOUND) compiz_set (USE_GNOME 0) endif (GNOME_WINDOW_SETTINGS_FOUND) endif (USE_GNOME) if (USE_GNOME_KEYBINDINGS) compiz_pkg_check_modules (GNOME_KEY_BINDINGS gnome-keybindings) if (GNOME_KEY_BINDINGS_FOUND) exec_program (${PKG_CONFIG_EXECUTABLE} ARGS "--variable=keysdir gnome-keybindings" OUTPUT_VARIABLE keybindingsdir ) else (GNOME_KEY_BINDINGS_FOUND) compiz_set (USE_GNOME_KEYBINDINGS 0) endif (GNOME_KEY_BINDINGS_FOUND) endif (USE_GNOME_KEYBINDINGS) else (GTK_WINDOW_DECORATOR_FOUND) compiz_set (USE_GTK 0) endif (GTK_WINDOW_DECORATOR_FOUND) endif (USE_GTK) if (NOT USE_GTK) compiz_set (USE_METACITY 0) endif (NOT USE_GTK) configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.gtk.in ${CMAKE_CURRENT_BINARY_DIR}/config.h ) add_subdirectory (window-decorator) add_subdirectory (gnome) compiz-0.9.11+14.04.20140409/gtk/config.h.gtk.in0000644000015301777760000000132712321343002021071 0ustar pbusernogroup00000000000000/* Define to 1 if Metacity support is enabled */ #cmakedefine USE_METACITY 1 /* Define to 1 if Gconf support is enabled */ #cmakedefine USE_GCONF 1 /* Define to 1 if you have the `wnck_window_has_name' function. */ #cmakedefine HAVE_WNCK_WINDOW_HAS_NAME 1 /* Define to 1 if libwnck version >= 2_18_1 */ #cmakedefine HAVE_LIBWNCK_2_18_1 1 /* Define to 1 if libwnck version >= 2_19_4 */ #cmakedefine HAVE_LIBWNCK_2_19_4 1 /* Define to 1 if metacity version >= 2.15.21 */ #cmakedefine HAVE_METACITY_2_15_21 1 /* Define to 1 if metacity version >= 2.17.0 */ #cmakedefine HAVE_METACITY_2_17_0 1 /* Define to 1 if metacity version >= 2.23.2 */ #cmakedefine HAVE_METACITY_2_23_2 1 #define GETTEXT_PACKAGE "${GETTEXT_PACKAGE}" compiz-0.9.11+14.04.20140409/NEWS0000644000015301777760000020644312321343002016202 0ustar pbusernogroup00000000000000Release 0.9.10.0 (2013-7-21 Sam Spilsbury ) ================================================================ Bugs Fixed (https://launchpad.net/compiz/+milestone/0.9.10.0) 1053895 - Screen sometimes does not redraw upon exiting fullscreen when "Unredirect Fullscreen Windows" is enabled 1056409 - compiz crashed with SIGSEGV in DecorWindow::moveNotify() [decor.cpp:2791] 1067246 - Duplicate files: include/core/logmessage.h == src/logmessage/include/core/logmessage.h 1090713 - expo's rectangular glow outline has wrong size in multi-monitor setup 1101026 - PluginClassHandler::get implicity causes plugins to be loaded 1101454 - Coverity RESOURCE_LEAK - CID 12500 1101569 - Coverity RESOURCE_LEAK - CID 12499 1115344 - Grid + Maximizing (button) + snapping by mouse to Grid position changes cursor position relative to window 1119608 - Closing windows sometimes shows black areas using Nvidia 313.x drivers 1124133 - Threads not found on CI 1127866 - Compiz hangs in glXBindTexImageEXT in VirtualBox 1130160 - Add copytex to default/unity profiles 1130679 - [2013/02/20] compiz/unity don't run, just loading cpp 1131106 - Expo key stops working once Expo is terminated by clicking on a draggable window (only if unityshell is *not* enabled) 1131864 - After Upgrade to Boost 1.53 Build Fails 1138517 - Latest compiz update breaks Java Swing decorations 1140505 - [regression-r3623] Wallpaper bleeds through on top right when a window is opened maximized 1158161 - [regression] Unmaximized windows can't be closed, minimized, moved 1159054 - High CPU usage when using any addon which desaturates windows 1159234 - xiphos crashed with SIGSEGV in sword::VerseKey::copyFrom() 1162598 - Compiz crashes with SIGSEGV if GLVertexBuffer::render is used where a program is set indirectly and not explicitly 1163611 - undefined symbol in libgsettings.so and libini.so 1165343 - Windows are placed with titlebar obscured by Unity menubar. 1165343 - Windows are placed with titlebar obscured by Unity menubar. 1167983 - Cleanup TestPlaceScreenSizeChange 1168475 - make uninstall doesn't remove all files 1169170 - Some xorg-gtest tests can fail randomly due to a 3000ms timeout 1169172 - gtk-window-decorator does not load settings from gconf correctly 1169620 - Compiz crashes when a plugin fails to load 1170013 - Make it easy to run the compiz autopilot acceptance tests 1171314 - Window stacking order messed up for dialogs/overlays 1171364 - cmake .. -DCMAKE_BUILD_TYPE=Coverage && make && make test && make coverage fails 1172601 - Building test-suite fails with latest Boost version 1173799 - ${libcompizconfig_libdir} can sometimes be empty, leading to an FTBFS 1174495 - Window Managers instability with r600 radeon and high monitor resolutions 1178514 - xorg-gtest tests always fail when two test runs are run on the same machine in parallel 1178581 - Put plugin: Move window to previous monitor feature missing 1181461 - Grid plugin fails to load in trunk 1185719 - (v. 2.10.24) Manual partitioning mode displays no GUI elements making it impossible to proceed 1186560 - Vertical maximise widens windows 1187468 - GWDMockSettingsTest.TestMock broken on upgrade to saucy 1188900 - Provide acceptance tests for the decor and place plugins 1188900 - Provide acceptance tests for the decor and place plugins 1189368 - DC++ 0.822 crash in short time 1189369 - A crash is possible when a window gets its texture for the first time 1193596 - [regression r3729] Plugin classes not destructed properly on unload 1195522 - Fix disabled acceptance tests for the decor plugin and run them by default 438580 - Workspace switcher is incorrectly aligned on second monitor, viewports are partially offscreen 749084 - Regression: D-Bus Plugin's introspection stuff needs rewrite for 0.9.x as methods don't show up in dbus-tool (list method, plugin-metadata and introspection are broken) 763148 - Adding/Removing an external monitor causes open windows to move to another workspace 776435 - Window maximizes and semi-maximizes on the wrong workspace 892012 - Window management - When a semi-maximised a window is maximised and then restored, the window position jumps and window size changes so the the window title bar is sometimes hidden underneath the top bar Release 0.9.9.0 (2013-01-24 Daniel van Vugt ) ============================================================================ Highlights * Lots and lots of bug fixes. See the full list below. * Restored support for several features lost in the GL|ES port of 0.9.8: Plugins: cubeaddon, firepaint, showmouse, thumbnail, wallpaper, wizard Features: expo animations, text rendering, screenshot selection * Several multi-monitor fixes. Bugs Fixed (https://launchpad.net/compiz/+milestone/0.9.9.0) 201681 - Window management - Cursor position changes relative to window while dragging windows 689792 - Window Management - Implement maximize and semi-maximise transitions 751605 - Multi-monitor - Windows maximize on the wrong monitor 754508 - Modal dialogs don't appear on the same workspace/monitor as their parent window 781931 - New windows are moved to front but don't take focus 839602 - Grid overlay effect does not disappear when it should 868423 - Launcher - Workspace switcher should not be in the Launcher by default 874146 - Multimonitor: New windows open on the wrong monitor, Place Plugin settings silently ignored 875311 - Expo animations "Fade + Zoom" & "Vortex" result in a black screen 878516 - Window management - Restoring a grid-placed window by dragging the title bar downwards does not restore the original window width 925867 - [regression] Window resize granularity is lost when restored after using Grid 928807 - Multi-monitor - Maximized windows cast shadows on adjacent monitors and workspaces 936840 - key now known as which breaks keyboard shortcuts 950160 - Unity blocks other programs from binding globally to Super+* (* = any key) 1002246 - Window management - When a monitor is disconnected, the windows do not move to the remaining monitor and the Launcher pips do not update 1007944 - XFCE + Compiz : icons in the titlebar have a black background instead of transparent 1009999 - Shift Switcher: Window title display settings partially ignored 1012330 - [needs-packaging] Wishlist: Missing plug-In: Wizard 1020823 - [regression][GLES] cubeaddon plugin does not build any more 1020825 - [regression] thumbnail plugin does not build any more 1020830 - [regression][GLES] wallpaper plugin does not build any more 1026920 - Incorrect detection of shader support on fglrx 1028809 - [regression][GLES] obs opacity no longer applies to all window decorations 1033877 - Member variables that are not initialized in the constructors reported by cppcheck 1033879 - Memory leak in decorator reported by cppcheck 1037164 - Clicking on semi-maximized windows in a different workspace fails to switch to the correct workspace 1042132 - [GLES] Regression: Text background rendering broken - black rectangle instead of rectangle with rounded edges and transparency is drawn 1047788 - [GLES] Regression: Screenshot selection rectangle is now solid instead of being transparent 1048267 - [regression-r3320][GLES]: showmouse plugin does not work anymore at all 1048272 - [regression][GLES]: Cube plugin: Transparency for top and bottom faces broken 1048505 - [regression-r3320] firepaint doesn't paint any fire any more 1048840 - compiz crashed with SIGSEGV in DodgeAnim::applyDodgeTransform() 1048855 - [grid] Gedit, Nautilus will not snap/semi-maximize with the mouse 1050776 - kde4-window-decorator crashes when starting up with oxygen theme 1051595 - findcompiz_install doesn't work 1051802 - "Unredirect Fullscreen Windows" can cause significant tearing on fullscreen windows (especially playing video) 1053280 - Button1 Actions are triggered regardless of whether or not they are actually active 1056615 - CompizConfigPython.test_* fail with SEGFAULT 1057955 - Removed schema keys still used in keybindings and automated tests 1058149 - compiz fails to build with GNU gold linker 1058577 - CCSGNOMEMediaKeys/CCSGNOMEIntegrationTestWriteIntegratedMediaKeys. TestWriteIntegratedMediaKey/* fail in jenkins 1058638 - GrabGrabHandlerTest.TestNoTrackOnExpoGrab fails when run independently 1059549 - [regression] [quantal] Workspace overview (expo) doesn't always display the active workspace colored 1060171 - gtk-window-decorator crashed with SIGSEGV in g_hash_table_lookup_node() from g_hash_table_remove_internal() from event_filter_func() from gdk_event_apply_filters() 1060327 - compiz crashed with SIGSEGV in compiz::opengl::bindTexImageGLX() from TfpTexture::bindTexImage() 1060708 - Redundant check for libcompizconfig_internal in compizconfig gsettings tests 1060804 - Compiz can't build with clang 1063690 - Unredirect fullscreen windows should be the default for optimal performance 1064791 - Redundant writes to plugins-with-set-keys 1065814 - compiz crashes with SIGSEGV in ccsGNOMEIntegrationInitializeIntegratedSettingsList [ccs_gnome_integration_constants.c:170] 1065815 - compiz crashes with SIGSEGV in startup: ./bin/compiz (core) - Fatal: Private index value "15CompositeScreen_index_5" already stored in screen. 1066187 - Enhanced Desktop Zoom: Specific Zoom Factor ignored 1066793 - std::vector > is duplicated in 63 plugins 1066795 - WrapableInterface is duplicated in 38 plugins 1066796 - WrapableInterface is duplicated in 56 plugins 1066798 - WrapableInterface is duplicated in 31 plugins 1066799 - WrapableInterface is duplicated in 26 plugins 1066803 - std::vector > is duplicated in 6 plugins 1066804 - WrapableInterface is duplicated in 37 plugins 1066805 - WrapableInterface is duplicated in 15 plugins 1066823 - Editors like gedit and others will not recognize *.xml.in files as xml, so if opened there is no syntax highlighting making those files harder to read. 1067218 - std::vector > is duplicated in 2 plugins 1067219 - std::vector > is duplicated in 2 plugins 1067234 - Duplicate file: include/core/point.h == src/point/include/core/point.h 1067534 - "Show desktop" plug-in actually works with Unity when ensured that it is loaded after unityshell 1067577 - Compiz (grid) fails to build due to explicit instantiation 1067598 - Unity fails to build due to explicit instantiation of templates in compiz. 1067812 - Gedit, blocked window at the corners with compiz grid plugin 1067964 - CCSGSettingsBackendConcept tests fail in continuous-integration due to incorrect linking 1068173 - [Multimonitor] [Grid] plug-in: The window snapping does not follow the preview, but uses the display the mousepointer is on when the mousebutton gets released 1068503 - scaleaddon: Draw Window Highlight is a solid white rectangle. No transparency. 1068518 - resize: Resize rectangle flickers between light and dark 1070211 - Compiz fails to build in Arch Linux 1070233 - Resizeinfo Plug-in: Gradient color 2 and 3 settings are ignored and no background gradient is rendered 1070297 - Resizeinfo Plug-in: No possibility to change the color and transparency of the rounded background outline 1070411 - Can not find target to add properties to: compizconfig_gnome_gsettings_integrated_setting 1070817 - make test fails in CompizConfigPython.test_* (OTHER_FAULT) 1071238 - Test failures: ExpoAnimationOffsetTest/ExpoWallOffsetTestAnima- tions.TestAnimationValues/21 (from ExpoAnimationOffsetTest_ExpoWallOffsetTestAnimations) 1071689 - Grid: Window management - resize preview does not show when moving a window from the semi-maximised state to the maximised state in a single action 1071791 - Maximized windows are moving between workspaces all by themselves 1075048 - lp:compiz r3447 FTBFS: compizconfig_test_ccs_object.cpp:123:9: error: expression result unused [-Werror,-Wunused-value] GET_INTERFACE (Dummy2Interface, to); 1075451 - gtk-window-decorator crash when pressing Alt+Space to activate actionmenu on windows without decorations (e.g. google-chrome) 1075584 - Workspacenames Plug-in: Wishlist: No default values for workspacenames, should be changed 1075600 - Workspacenames Plug-in: Wishlist: Default Appearance values not ideal 1076876 - 100_expo_layout.patch does not apply totally cleanly 1077787 - CompizConfigPython tests not using ini backend 1077823 - gtk-window-decorator: decorator.c : a small typo error 1077866 - untest fails to link with binutils-gold 1078244 - FTBFS with GLES enabled in plugins/opengl/src/screen.cpp 1078330 - It is possible to write to a plugin in compizconfig that has no associated gsettings schema 1080555 - Tests 1-4 fail with SEGFAULT: CompizConfigPython.test_* (SEGFAULT)... 1081425 - [regression] Window decorations ignore brightness/opacity changes in expo 1082152 - compiz 0.9.8.6 fails to build from source in KDE4-window-decorator with latest KDE 4.10 beta 1082265 - KDE Appmenu doesn't work with compiz decorators 1082633 - CMake Warning in src/tests/CMakeLists.txt:16 This command specifies the relative path 1083027 - cmake suggests (kind of) expo is disabled but it still builds correctly. 1084096 - When building with xorg-gtest, cmake fails to find xorg-gtest sources 1084162 - unity build fails if compiz is installed outside /usr 1084401 - Unredirected fullscreen windows freeze and stay on top when wall sliding (Ctrl+Alt+Left/Right) 1085581 - Windows open below panel and launcher, grid does not work at all, window animations missing, and general plugin chaos if built on raring (cmake >= 2.8.10) 1085590 - GLib warning - source still attached to context, but ref_count == 0 on shutdown 1085591 - --replace race condition: Another window manager is already running on screen 1085687 - CCSObjectDeathTest.GetInterface fails 1086337 - HTML5 video in Firefox continues to tear 1086704 - Build uses pyrexc without checking that it exists 1086779 - EGL/GLES compiz builds do a eglWaitGL (synchronous wait) on every frame, likely to slow things down 1086789 - Build warning "multiple rules generate gtk/gnome/compiz.desktop. build will not be correct; continuing anyway" 1087193 - Windows don't respond to input (mouse clicks) if XShape is disabled or unavailable 1088414 - On ARM lp:compiz defaults to GL instead of GLES and FTBFS unless you -DBUILD_GLES=ON 1088419 - compiz fails to configure on arm with -DCOMPIZ_BUILD_TESTING=ON [package 'gl' not found] 1088996 - FTBFS after python2.7 upgrade - missing pyconfig.h 1089246 - Add support for blacklisting some drivers from using unredirected fullscreen windows 1089250 - [clang] lp:compiz r3523 FTBFS: unused function 'ListValueToSettingValueList' [-Werror,-Wunused-function] 1089251 - [clang] Multiple segfaults in test: SetSemantics 1089811 - [Regression] Minimizing a window creates an input-insensitive area if you have unityshell loaded 1089863 - KWD: Appmenu always pops up at top-left corner of the screen 1090845 - ccp can fail to compile, as CompizPlugin is not included 1091103 - Default blacklist string shouldn't contain double escape 1092651 - CCSM segfaults if no settings found 1093757 - Using grid-resize prevents windows from maximizing correctly 1095001 - [regression] compiz spends 31% of its CPU time in regexec() 1095906 - Building compiz with clang++ on raring fails to build libgtest 1095915 - opengl plugin FTBFS with clang 1096455 - Compiz reports incorrect _NET_DESKTOP_GEOMETRY until first viewport switch 1096780 - Plugin names are not sorted (they're shown in directory order) when cmake is run 1097126 - resize leaks memory in multiple locations calling resize::CompScreenImpl::findWindow() -> operator new() 1097179 - compiz_test_resize_logic: Multiple errors: Conditional jump or move depends on uninitialised value(s) 1097644 - Several leaks in new GLProgram from compileProgram() from GLScreen::getProgram() from GLWindowAutoProgram::getProgram() 1097649 - Several leaks in g_settings_new() [g_object_new()] from ccsGSettingsNewNoPath() [ccs_gsettings_interface_wrapper.c:184] 1097657 - PrivateGLScreen::projection is leaked 1097661 - Several leaks in ccsIntegratedSettingListAppend() ... from ccsGNOMEIntegrationBackendGetIntegratedSetting() from readSetting (gsettings.c:375) 1097664 - GLShaderCache::priv [PrivateShaderCache] is leaked 1098148 - Compiz 0.9.8 trunk FTBFS on ARM due to an unused variable 1098758 - Thumbnail Window Previews: Flickering of background/glow and window title text 1098877 - Showmouse plugin: Possible values of the particle life setting can destroy the plugin's functionality 1100172 - Workspacenames plugin: Requires text plugin to work 1100539 - Several memory leaks in ccsIntegratedSettingListAppend() from ccsIntegratedSettingsStorageDefaultFindMatchingSettingsByPredi- cate() from ccsIntegratedSettingsStorageDefaultFindMatchingSett- ingsByPluginAndSettingName() 1100564 - Several memory leaks in strdup() from ccsGSettingsIntegratedSett- ingReadValue() from ccsGNOMEIntegrationBackendReadISAndSetSett- ingForType() from ccsGNOMEIntegrationBackendReadOptionIntoSett- ing() 1101430 - Coverity MISSING_BREAK - CID 12468 1101465 - Coverity MISSING_BREAK - CID 12467 1101557 - Coverity MISSING_BREAK - CID 12465 1101558 - Coverity MISSING_BREAK - CID 12466 1102822 - Several memory leaks in g_signal_new() ... from ccsGSettingsWrapperNewForSchema() [ccs_gsettings_interface_wrapper.c:184] from initBackend() [gsettings.c:468] 1102829 - Several memory leaks in google::protobuf::DescriptorPool::InternalAddGeneratedFile() from google::protobuf::protobuf_AddDesc_*() Release 0.9.8.4 (2012-09-27 Daniel van Vugt ) ============================================================================ Highlights * Fixed a few crashes affecting a lot of people. Especially users of VMs and LLVMpipe. * Significant improvements to "Unredirect Fullscreen Windows" mode, which is particularly useful for fullscreen gaming performance. - Flickering is mostly fixed. - Multi-monitor unredirect is dramatically faster than previous versions. - Fixed automatic redirect/unredirect entry/exit bugs. To try it out, enable: CCSM > Composite > Unredirect Fullscreen Windows. The option is not enabled by default yet because there are some issues with driver stability, particularly with nouveau and intel. * Major gsettings/compizconfig bug fixes and refactoring with lots more test cases. Bugs Fixed (https://launchpad.net/compiz/+milestone/0.9.8.4) 92599 - Incorrect (low/stuttering) refresh rate with NVIDIA driver (regressed in compiz 0.9.8 series) 927168 - compiz crashed with SIGSEGV in memmove() from drisw_update_tex_buffer() from dri_set_tex_buffer2() from drisw_bind_tex_image() from __glXBindTexImageEXT() from TfpTexture::enable() from enableFragmentOperationsAndDrawGeometry() 944653 - compiz crashed on startup with SIGSEGV in strstr() from GLScreen::GLScreen() 1004336 - _itoa_word() from window.cpp:1989: Use of uninitialised value of size 8 1030891 - Compiz r3275 breaks VirtualBox Guest Additions: black screen or just wallpaper 1035261 - Port compiz to gsettings and consequently remove unity-2d 1037142 - Week33 - Grid highlight window appears while switching between workspaces 1037411 - [regression][DRI] SubBuffer rendering is much slower in compiz 0.9.8.0 than it was in 0.9.7 1039406 - Benchmark default placement overlaps (damages) Unity launcher and panel, resulting in artificially low benchmark results 1041535 - compiz crashed with SIGSEGV in __strcasestr_ia32() from ccsStringToModifiers(binding=NULL) 1042041 - 1:0.9.8+bzr3319-0ubuntu1 regression: keeps setting gsettings keys to wrong values 1042537 - ccsm crashed with SIGSEGV in ccsContextNew 1042552 - Paint List is often full of 1x1 offscreen windows from gtk-window-decorator 1045127 - Close from spread is unreliable 1046664 - Unredirected fullscreen windows flicker briefly when another window (like a menu) opens above them 1046701 - Random test failures in CCSGSettingsBackendConcept 1047168 - scale mode is not visible if a fullscreen window is unredirected 1048551 - multiple GObject warnings if gtk-window-decorator is started without org.gnome.mutter being installed 1048964 - cmake fails on python 2.6 as sys.version_info does not contain major_version or minor_version 1049100 - Build failure if COMPIZ_DISABLE_PLUGIN_RESIZE=ON 1049169 - [valgrind] Up to 520,000 bytes lost when runningi CCSGSettingsBackendConceptTest 1050704 - Unity 6.6: panel shadow is always on top of the active window 1050749 - Unredirecting a fullscreen window on a secondary monitor causes that monitor to flicker 1050752 - opacify plugin toggling by default doesn't work 1050757 - opacify plugin: opacity isn't reset after switching window 1050796 - Double shortcuts conflict with gnome-control-center ones 1051286 - [performance] glXSwapIntervalEXT called every frame, which is very slow on Nvidia. 1051885 - Unredirect Fullscreen Windows makes multi-monitor rendering much slower 1052838 - compiz.fix_927168 broke ARM building 1053902 - Maximized window gets unredirected when it's not fullscreen 1054724 - [fglrx] compiz crashed with SIGSEGV in glXDestroyContext() [/usr/lib/fglrx/libGL.so.1] from GLScreen::~GLScreen() 1050610 - gtk-window-decorator leaking window handles. Window operations become sluggish after a few days of usage 1056645 - ARM build broken with 'swapInterval' is not a member of 'GL' 1057263 - gtk-window-decorator leaks large numbers of pixmaps and pixmap memory 1057421 - FTBFS with -DCOMPIZ_BUILD_TESTING=OFF if libgtest-dev is not installed Release 0.9.8.2 (2012-09-10 Daniel van Vugt ) ============================================================================ Highlights * gtk-window-decorator has been fully ported from GConf to GSettings. * Gamers rejoice! CCSM > Composite > "Unredirect Fullscreen Windows" now works more reliably, with a few bugs remaining. If you turn it on then fullscreen windows like games will get direct rendering access and won't be slowed by Compiz (or Unity) any more. Bugs Fixed (https://launchpad.net/compiz/+milestone/0.9.8.2) 956986 - compiz crashed with SIGSEGV when imgsvg is loaded, in getCompPluginVTable20090315_imgsvg() from dlloaderLoadPlugin() from CompPlugin::load() 974242 - Compiz is moving windows against my will 976032 - Place plugin problem with panel in fullscreen and gnome classic 980663 - Compiz won't start if "unredirect fullscreen windows" is enabled 1014986 - [performance] compiz is wasting CPU responding to repaint requests for offscreen windows 1024214 - Tests can disappear from make test when CMake regenerates CTestTestfile.cmake 1040081 - [regression] Week 34: Ctrl+Alt+T shortcut (open terminal) fails to work 1040455 - Setting the UnMinimize animation is ignored (default animation still used) 1041047 - Unredirect Fullscreen Windows stay on top (unredirected) even when they're not on top any more (or the output is transformed) 1041066 - Unredirect Fullscreen Windows sometimes fails to unredirect fullscreen windows at all 1041310 - compiz 0.9.8.0 rev3321 fails to build on kde4-window-decorator 1042095 - AUTHORS is out of date in compiz-0.9.8.0. Needs to be updated from the bzr log. 1043143 - Unresolved symbols in plugins are not detected at build time, instead cause cryptic crashes in COMPIZ_PLUGIN_20090315() 1045191 - compiz crashed with SIGABRT in assert from boost::shared_ptr::operator-> from ResizeLogic::enableOrDisableVerticalMaximization() from ResizeLogic::handleMotionEvent() 1045235 - Compiz crashed with SIGFPE in addQuads() [plugins/opengl/src/paint.cpp:839] 1045652 - UnMinimize should be spelled "Unminimize" 1045665 - CMake Error at cmake/EnableCoverageReport.cmake:69 (SET_TARGET_PROPERTIES): set_target_properties Can not find target to add properties to: compizconfig_ccs_settings_upgrade_internal 1046184 - __pyx_f_12compizconfing_ListToStringList defined but not used 1046190 - Migration to gsettings doesn't migrate compiz/unity configurable keys to g-c-c and those keys doesn't work 1046199 - Changing a key to org.compiz.integrated schema doesn't impact the current profile 1046212 - show-hud integration does not work 1046661 - Unredirect Fullscreen Windows stay on top (unredirected) even when an RGBA window is stacked above it Release 0.9.8.0 (2012-08-23 Daniel van Vugt ) ============================================================================ Major New Features * Single source tree: All plugins/libraries are in lp:compiz now * OpenGL|ES support (e.g. for ARM platforms) * GSettings support, as a backend for storing compizconfig * Buffer swapping on every frame: allowing compiz to take advantage of driver features such as page flipping and triple/quad buffering. This results in noticeably higher physical frame rates, and smoother graphics. Disabled Features In order to complete support for OpenGL|ES, some plugins were not (yet) ported and have been disabled for now. Those are: animationaddon, bicubic, blur, colorfilter, cubeaddon, gears, group, loginout, reflex, thumbnail, stackswitch, wallpaper, trip. However, those are only 13 out of 84 plugins. We welcome patches to revive the disabled plugins. Bugs Fixed (https://launchpad.net/compiz/+milestone/0.9.8.0) 201342 - Tearing on secondary monitors even when "Sync To VBlank" is turned on. 454218 - Loss of window border (white flash) when using compiz resize plugin, option=normal 755842 - Non-maximized windows which sit on the border of a workspace move when called 770283 - [fglrx] Title bar does not update on non-maximized windows 803296 - [regression] Compiz Resize plugin: When "Default Resize Mode" = Normal, resizing is extremely slow and CPU intensive 862430 - window flicker for a short time after switching workspaces 886605 - Desktop, Launcher and menu bar still visible when screen locked 892012 - Window management - When a semi-maximised a window is maximised and then restored, the window position jumps and window size changes so the the window title bar is sometimes hidden underneath the top bar 901097 - Add option to use glXSwapBuffers on every frame, not just full-screen redraws. 904205 - Desktop wall: Bindings for next/previous don't wrap to the next row 929989 - compiz (decor) - Warn: failed to bind pixmap to texture 930783 - mouse poll is jerky at the default setting of 40ms 932520 - Some windows on start up don't show full window 933776 - [regression] scale/spread: "Initiate Window Picker for All Windows" does not show all windows. It shows only windows from curent workspace. 946388 - Some apps (like Remmina) can't full-screen under Compiz (or Unity) 955035 - Super-W shows vanishing windows the first time you hit it. Windows fly off the screen instead of spreading. 960652 - Switcher remains open after super+tab has been used. 963794 - gtk-window-decorator crashed with SIGFPE in _decor_blend_horz_border_picture() 972519 - Compiz-core fails to compile with gcc-4.7 - 'cc1plus: all warnings being treated as errors' 976467 - [regression] Compiz 0.9.7.6: Menus often have no shadows at all 978900 - Menu shadow clipping flickers while switching menubar items/indicators 980026 - Compiz should not move windows to workspace 0,0 when restarted 981703 - regression / unable to interact with window-titlebar (window decoration) after minimizing/unminimizing gnome-terminal 987639 - [0.9.8 r3110 regression] Windows lose decorations during "scale" (window spread) 987647 - Mouse pointer doesn't change when dragging windows in expo 988684 - [regression] Starting a second instance of compiz (without --replace) causes the existing instance to shut down (gracefully) 989545 - [regression] compiz --replace fails to start 990690 - Get libcompizconfig under test 993608 - CMake Error at FindCompiz.cmake:84 (include): include could not find load file: CompizDefaults 994841 - 'make test' fails lots of test cases if you don't have Xvfb installed 996901 - regression / gtk-window-decorator crashes / doesn't start properly -> rev3131 is culprit 999019 - [regression] Bug 994841 ('make test' fails lots of test cases) regressed in lp:compiz-core r3133 1002602 - [nvidia] [0.9.8 r3110 regression] With bug fix 862430 unfocussed windows are displayed white 1002606 - [0.9.8 r3110 regression] 2nd un-maxed window often opens overlapping adjacent workspace 1002715 - [regression] Misspelled plugins are silently ignored 1002721 - [regression] compiz fails to load plugins from LD_LIBRARY_PATH 1004251 - Animations aren't smooth when sync to vblank is enabled 1004335 - wall.cpp:588: Conditional jump or move depends on uninitialised value(s) 1004338 - screen.cpp:4364,4372: Conditional jump or move depends on uninitialised value(s) 1004848 - CompizConfigPython.test_plugin test fails when opengl isn't enabled 1005008 - Can't disable building ccp plugin 1005009 - Can't disable building grid plugin 1005176 - libcompizconfig headers still don't install in the right place 1005177 - Compizconfig-python still doesn't respect DESTDIR when not exported 1005569 - [callgrind] compiz spends ~25% of its time constructing/destructing strings in PrivateScreen::handleActionEvent 1006335 - [callgrind] compiz spends ~7% of its time inserting into and destructing the events list in PrivateScreen::processEvents() 1007299 - Compiz frame rate decreases if application frame rates are too high (unthrottled) 1007754 - gtk-window-decorator crashed with SIGSEGV in meta_get_decoration_geometry 1008020 - New windows can be stacked above panels if they are created just after an override redirect window is created 1009320 - Benchmark key is not consumed by compiz. It gets passed to the underlying window. 1009338 - composite refresh rate falls back to 50Hz, which is wrong in most cases 1012205 - [needs-packaging] Wishlist: Missing plug-In: Stackswitch (Stack Window Switcher) 1012956 - Unintended shadows are rendered for the Unity Launcher and Panel 1014461 - decor fails to start any window decorator by default (option "command" is blank upstream) 1015151 - [BNR] Compiz crash in movementWindowOnScreen (caused by fix 755842) 1015422 - compiz is wasting memory leaving a shell running: /bin/sh -c /usr/bin/compiz-decorator 1015593 - crash in gtk-windows-decorator meta_get_button_position 1015898 - No decorator is started if compiz is run without any path prefix 1016366 - Potential cases where textures can become invalid where plugins need the image for animations 1016367 - Potential race condition where X commands haven't finished processing when we bind a texture and generate mipmaps 1018302 - [regression] main.cpp:222,225: Conditional jump or move depends on uninitialised value(s) 1018602 - [gsettings] Invalid write of size 4 in readOption 1018730 - [gsettings] Lots of warnings about key names >31 characters, which also causes CCSM crashes. 1018916 - ccsm and compizconfig python files don't get installed 1019337 - gtk-window-decorator crashes with BadWindow (invalid Window parameter), from XGetWindowProperty() from get_frame_type() 1021104 - Severe damage artefacts and flickering when using LLVMpipe 1021139 - make ExperimentalMemCheck; fails CompTimerTestCallback.TimerOrder 1023738 - make -j3 randomly fails with sed: -e expression #1, char 6: unterminated `s' command 1023742 - make -j2 randomly fails with /bin/sh: 1: _intltool_update-NOTFOUND: not found 1024179 - make install in unity fails to install org.compiz.unity*.gschema.xml 1029383 - Make fails with: /bin/sh: 1: cannot open g': No such file (when attempting to build Unity) 1030473 - Error-reports cppcheck (http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page) 1033085 - Typo in "Commands" plugin description: "bundings" -> "bindings" 1033531 - Single click inside the Workspace Switcher should always return to a workspace 1036490 - [regression] compiz crashed with SIGSEGV in g_main_context_iteration() from ... from CcpScreen::timeout() 1036542 - [regression] Clicking launcher icons in expo mode now exits expo mode 1036739 - Window management - decouple window minimise and restore/maximise animation timings 1037710 - Tearing at top of laptop screen 1039482 - imgsvg build failure on quantal 1039834 - paralell builds can fail on resize_logic 1039843 - make fails if librsvg-2.0 < 2.36.2 Release 0.9.7.6 (2012-04-06 Sam Spilsbury ) ======================================================================== Bugs fixed (https://launchpad.net/compiz-core/+milestone/0.9.7.6) 968985 - Memory leak in dlloaderListPlugins 969102 - priv->invisible is not updated when the window is mapped 919139 - window management, multi-monitor - In multi-monitor environment, windows should spread on the monitor in which they reside 931883 - Improve performace of the shadow clipping code 969101 - DecorWindow::computeShadowRegion called way too much Use gtest_add_tests for more detailed testing output Release 0.9.7.4 (2012-04-02 Daniel van Vugt ) ============================================================================ Bugs fixed (https://launchpad.net/compiz-core/+milestone/0.9.7.4) 833729 - compiz crashed with SIGSEGV in CompositeScreen::compositingActive() 888704 - Window management - Closing one window sends others to the background 953089 - Unity 5.6: key bindings (such as Super) don't work on empty workspace or on slow/loaded systems 953839 - [regression] Invisible resize border is now only 1px wide 957572 - Coverity REVERSE_INULL - CID 10888 960831 - Unity dash opens and immediately closes if you tap Super+A quickly 962085 - [0.9.7.2] gtk-window-decorator receives BadWindow errors 963093 - Unity 5.8: Flickering and corruption on Unity UI elements 963264 - We are using 1 bad hack for compiz hanging on startup 963465 - Unity 5.8: Can't login to Unity since upgrade to 5.8 963470 - [regression] Unity 5.8+Compiz 0.9.7.2: Pressing Super+Tab or Super+W works, but unity does not respond to when Super is released. 963633 - Unity 5.8: Login to blank screen (all black or just wallpaper) 964248 - Tests do not build when libgtest-dev is installed but libgtest isn't Fixes REMOVED for stability reasons: 682788 - Global menu is not ergonomical on large screens 806255 - Unity/compiz intercepts Super and Alt keypresses from grabbed windows like VMs. 931245 - Finish the implementation of the locally integrated menubars Release 0.9.7.2 (2012-03-19 Daniel van Vugt ) ============================================================================ Bugs fixed (https://launchpad.net/compiz-core/+milestone/0.9.7.2) 806255 - Unity/compiz intercepts keystrokes from grabbed windows. 808007 - compiz crashed with signal 5 in Glib::exception_handlers_invoke() 682788 - Global menu is not ergonomical on large screens 931245 - Finish the implementation of the locally integrated menubars 938417 - lp:compiz-core fails parallel builds (make -jN) 943194 - [regression] Pressing alt doesn't show the menu title bar in top panel 943612 - Alt+Right arrow key trigger a kind of Alt + Tab 943851 - [unity 5.6] Pressing Alts steals focus from current widget, cannot compose characters with AltGr 944979 - Quicklist are not showing if right-clicking a launcher icon in Expo mode if triggered by Super + S 945373 - Regression: ALT + Drag doesn't behave how it should 945816 - [regression] Changing the HUD shortcut disables all Alt-based combinations 946118 - screen.cpp:3281: virtual bool CompScreenImpl::addAction(CompAction*): Assertion `priv->initialized' failed. 953089 - Unity 5.6: key bindings (such as Super) don't work on empty workspace or on slow/loaded systems Release 0.9.7.0 ( 2012-03-02 smspillaz ) ======================================================================= Release version 0.9.7.0 Bugs Fixed (https://launchpad.net/compiz-core/+milestone/0.9.7.0) 92599 - Incorrect (low/stuttering) refresh rate with NVIDIA driver 254561 - Benchmark window slows the system and degrades graphics resources 684731 - Windows that hide themselves when closed don't appear in any "this workspace" switcher 690239 - hang in g_spawn_sync and select() 694169 - word misspelled - bunding 716521 - sometimes, restored window placed too high. 720679 - Compiz clears the root window in the installer session 724093 - unity-window-decorator: When switching between windows, Orca does not speak the title of the focused window. 732997 - Cannot open a window that starts iconified 737125 - Minimize animation flickr when for maximized apps 740258 - Pixmap memory leak in gtk-window-decorator 748840 - Windows should not automatically be focused when opened if the focus is on another application 755841 - [sandybridge] Graphics tearing when playing video 758398 - Bitcoin top-level window unmapped 763005 - Compiz's "Sync to Vblank" makes display stutter/slow with fglrx 764330 - [regression] Moving windows lags behind the mouse by 1-2 seconds; appear to freeze when dragging. 764673 - Launcher - Spread should not affect the state of window 780505 - Untranslated strings in gtk-window-decorator 790565 - Clicking on a tweet/message link sometimes does not work 795065 - scrolling on top of a close animation switches viewports 796594 - Window behaviour - pressing the 'restore' window indicator on a semi-maximised window should return it to the restored state 798868 - unity video tearing when moving windows in oneiric with nvidia-current 812711 - dialogs really slow to be displayed since the compiz update 837252 - It is possible to stack windows relative to windows that are destroyed 841727 - Should keep list of windows last sent to server and last recv from server 845719 - compiz and X can disagree on the stacking order 847967 - A minimized window 'remains' behind on the desktop if /apps/compiz-1/plugins/unityshell/screen0/options/ show_minimized_windows is set to true 853734 - maximized windows fail to update their input extents when undecorated 854725 - resizing bugs with xterm 856015 - crash on closing a window 857201 - Java application windows cut-off/truncated/not displayed properly 857487 - compiz crashed with SIGSEGV in CompScreen::insertServerWindow() 857738 - compiz crashed with SIGABRT in raise() 858625 - Applications which create multiple windows that are transients of each other can be given invalid stack positions 858629 - Windows move to 0,0 on compiz restarts 859431 - Crash when selecting Evolution in alt-tab 860286 - invisible window when a window is mapped but not yet drawn on by the process mapping it 860304 - race condition in configureXWindow causes unpredicatable window geometry changes 860306 - windows that are decorated while resizing can cause incorrect resize results 860309 - Moving a window while it is being resized by core caused unpredictable movement 860397 - Windows which are marked transients of docks should be treated like docks 861341 - can't maximize windows on second monitor and Qt windows displayed in wrong place 861909 - compiz crashed with SIGSEGV in PrivateWindow::configureFrame() 862719 - closing a window gives focus to last minimized window 863328 - Launcher - If a spread contains minimised windows, when the spread exits, the minimised windows momentarily appear on the desktop before disappearing 864478 - Window shading is broken 865696 - Windows from other workspaces missing decorations in window spread 865863 - Opening mumble can cause it to be stacked above the dash if you open the dash at the same time 866752 - Sometimes configure events are missed and windows move slow as a result 869759 - screen edge trigger does not work until manually restarting unity 869919 - Click-dragging a window that's stacked above a fullscreen window will cause it to go underneath the fullscreen window 871801 - window management, alt-tab - After using 'show desktop' to minimise all windows, opening any new window also incorrectly restores all the minimised windows 873344 - compiz.desktop is not installed where GNOME2 libraries are not available 873364 - Drop GNOME2 Support 873379 - Disable lighting by default 873384 - Use smart placement by default 873389 - Compiz should read DESKTOP_AUTOSTART_ID when being started by the session manager 874004 - When a window is minimized on another workspace it doesn't appear in the spread 874854 - Add hooks for the workarounds plugin to change variables prior to and after GLXContext init to work around bugs in broken drivers 876575 - Moving windows between workspaces causes them to "jitter" / jump around 877920 - Some windows and all decorations become translucent when the "Resize Info" plugin activates. 878934 - Menu selection is wrong in Java apps 880707 - [regression] Compiz: Visible tearing is worse in 11.10 than 11.04, even when "Sync To VBlank" is enabled, but only when Unity is active. 882527 - Allow the scale plugin to be triggered over all viewports 882531 - Allow plugins to selectively track damage in real time 885440 - Add unit tests for CompOption 886935 - Invalid read on GLWindow::glDrawGeometry 886978 - compiz crashes with SIGSEGV in PrivateWindow::configure 890947 - Unity sends initial GDK_CONFIGURE event with position as (0,0) 891744 - Dragging windows stutter during and after grid animation 893995 - POTFILES is breaking the build 893998 - Fix warnings in CompTimer 894639 - Hook up Xig tests to compiz' CTest system 896591 - Plugins that get initialized before screen initialization is done can not have their actions added 896762 - Switching viewports with ctrl-alt-(left/right/up/down) does not give the highest window on the target viewport focus 897045 - compiz spins in CompTimeoutSource::callback, stops responding and starves other timers if CompTimer::setTimes(0). 908042 - Test timer-callbacks suffers from a race condition 911530 - Fix uninitialized read in paintBackground 913823 - Remove unecessary hacks from core in order to work around broken drivers on startup 915186 - make install: Files missing from include/compiz/core 915950 - Tests required for window placement in dead areas for multimonitor 917210 - compiz+unity3d generates > 50 wakeups a second on idle system 917571 - compiz-core (currently version 0.9.5) is actually newer than the existing releases versioned 0.9.6 918554 - Some plugins no longer build due to undefined DEG2RAD 918762 - Compiz crashes with SIGSEGV in PrivateWindow::configure 919920 - lp:compiz-core (r2930) does not build 919922 - compiz-core ABI is broken / out of sync 919940 - 'make install' no longer installs 'bin/compiz' (seriously) 919948 - 'make install' installs redundant static libraries (now part of core) 919970 - compiz-core contains duplicate conflicting class definitions 920847 - point.h and rect.h being installed to the wrong place 921406 - lp:compiz-core r2961 fails to build with glib 2.30 (seems to require 2.31) 921451 - compiz::X11::PendingConfigureEvent::dump(): Conditional jump or move depends on uninitialised value(s) / Use of uninitialised value of size 8 922450 - 'make install' installs unwanted files libcompiz_place_constrain_to_workarea.a, libcompiz_place_screen_size_change.a 923572 - Merge (overwrite?) lp:compiz-*-plugin back into lp:compiz-plugins-{main,extra} 923583 - lp:compiz-core r2968 fails to build 923662 - [regression] lp:compiz-core r2968 broke direct rendering 923683 - [regression] window movement is erratic and buggy (briefly on startup) 924691 - [regression] XSynchronize is always enabled (shouldn't be, and wasn't in oneiric) 924736 - [gtk-window-decorator] Semi-maximized windows have no shadow or frame 925293 - Plugins can't tell the difference between a modifier key-tap, and a modifier key-release (after being used to modify other keys) 925979 - [regression] compiz fails to pass through + events to apps if a plugin is bound to just 928044 - [regression] lp:compiz-plugins-main r16 fails to build with lp:compiz-core r2982 928173 - [regression] Window resizing jitters/flashing is worse in lp:compiz-core than oneiric 928655 - [regression] Vsync is lost (constant graphics tearing) after plugins render effects 929443 - lp:ubuntu/libcompizconfig (r59) fails to build with the latest lp:compiz-core (r2990) 929446 - lp:compiz-plugins-main (r18) fails to build with the latest lp:compiz-core (r2990) 929449 - lp:compiz-plugins-extra (r9) fails to build with the latest lp:compiz-core (r2990) 930071 - gtk-window-decorator can crash in active_window_changed upon demaximizing a window 930412 - [regression] no core keybindings work any more 931283 - compiz crashed with SIGSEGV on shutdown 931473 - Menus don't fully appear 931500 - post 0.9.7 snapshot: FTBFS on armel 931927 - [regression] Customized shortcuts don't work in compiz 1:0.9.7.0~bzr2995-0ubuntu1 931958 - 0.9.7: impossible to click on keyring dialog since the upgrade 932087 - Initialize the _NET_WM_STATE_FOCUSED 933226 - compiz-core r3001 (and 3002) ftbfs 934058 - [regression] Launcher, top panel and keyboard un-responsive after using any Super-x shortcut 936487 - compiz crashed with SIGSEGV in XDefineCursor() 936675 - Windows can end up stacked at the very top of the stack if no other windows and nautilus on the desktop are not open 936774 - Maximized windows do not get shadows at all 936778 - Quickly demaximized windows can receive maximized window decorations if they were initially maximized 936781 - No draggable border if mutter isn't installed 938478 - Unresolved symbols in plugins cause compiz to exit (looks like a crash) 940066 - decor_match_pixmap (decoration.c:423): Conditional jump or move depends on uninitialised value(s) 940115 - Memory leak at DecorWindow::updateSwitcher() (decor.cpp:2258) 940139 - [callgrind] compiz spends about 51% of its CPU time in CompRegion construction/destruction 942890 - "Svg" and "Png" should be "SVG and "PNG" Added Unit Tests Switched to Google Test for Unit Tests Added Xig Integration Tests Release 0.9.5.92.1 ( 2011-08-20 Sam Spilsbury ) ============================================================================== Release (0.9.5.92.1) Fix failure to build from source due to merge failure on the last release Release 0.9.5.92 ( 2011-08-20 Sam Spilsbury ) ============================================================================ Development Release (0.9.5.92) Added GSettings schema generation Revised libdecoration interface Fixed crashes on shutdown Don't unredirect overlay windows until they have been shaped Release 0.9.5.0 ( 2011-07-14 Sam Spilsbury ) =========================================================================== Development Release (0.9.5.0) Added new CMake commands to simplify releases Added unit tests Fixed a number of reparenting and stacking bugs Changed decoration interface. Now decorators can specify multiple decorations for a single window allowing compiz to cache decorations as needed Release 0.9.4 (2010-02-24 Sam Spilsbury ) ======================================================================== Development Release. Main loop implementation now replaced by the GLib main loop, use custom event sources and event dispatch synchronisation. Allows better integration with plugins that require tight timing with GLib timers Moved image and data generation into buildsystem extensions, and installation of such data into namespaced areas on the filesystem so plugins can't overwrite other plugin's data Intelligently clip window shadows in decor Fixed a number of 2D decoration issues Fixed a number of reparenting, stacking and focus issues Support different frame types in gtk-window-decorator Release 0.9.2.1 (2010-11-06 Sam Spilsbury ) ======================================================================== Bugfix release. Release 0.9.2 (2010-10-24 Sam Spilsbury ) ============================================================== Development release. Made minimization functions wrappable Decorators now get shadow settings from window properties on the root window and not through gconf, kconfig or dbus Allow resizing from the center of the window Clean up gtk-window-decorator Fixed a number of reparenting bugs Release 0.9.0 (2010-07-03 Sam Spilsbury ) ============================================================== Development release. Rewritten core in C++. Rewritten plugin APIs. Rewritten buildsystem in CMake, supports option code autogeneration, plugin build dependency handling, amongst other things. Smart wrappable functions, enables saving on otherwise useless CPU cycles. Reparenting window decorations. Support for tiled textures and screen sizes larger than max_texture_size through the use of the copytex plugin. Composite and OpenGL based rendering dropped from core, split into the opengl and composite plugins, which represent a step towards pluggable rendering backends. Ability to run in non composited mode added to gtk-window-decorator and kde4-window-decorator. kde-window-decorator dropped. Added KDE plugin to integrate with the QT main loop and create a KApplication for KCrash support on KDE. dbus plugin now uses screen number to identify compiz instance. Dropped multi-screen mode, launch compiz on individual screens instead. Shape drawing mode added to annotate plugin. Fixed screen updates issue in annotate plugin. Added serialization interface, which allows plugins to save/restore activity states between plugin and compiz reloads. Serialization info is stored in X11 window properties and is automatically dropped by the X Server when the window is destroyed. Added compiztoolbox library plugin used by switchers and screenshot, which provide a simple interface for accessing XDG and drawing thumbnails. Release 0.8.6 (2010-03-28 Danny Baumann ) ============================================================== Maintenance release. Various focus and window placement fixes. Fixed handling of windows that have a (server-drawn) border. Fixed handling of window icons that have a colour depth of 1 bit. Added KDE 4.4 support to KDE4 window decorator. Release 0.8.4 (2009-10-14 Erkin Bahceci ) ============================================================= Maintenance release. Fixed many crashes (including doPoll/eventLoop ones). Various memory leak fixes. Fixed lost window issues with windows that are visible on all workspaces. Fixed lost window issue when reducing the number of workspaces. Fixed placing of dialogs (e.g. PolicyKit) behind currently focused window. Fixed placing of new windows behind fullscreen window. Fixed and improved screen resolution change handling (Compiz now remembers original window size and position). Lowering a window now activates the topmost window when click-to-focus is on. Fixed wobbly title bar hiding and bouncing near panel edges. Screenshot plugin now saves to the correct desktop directory by default. Fixed inconsistent icon sizes in switcher plugin. Improved constraining of window size and position in move, resize, and wobbly. Ported KDE4 window decorator to KDE 4.3. Added support for _NET_REQUEST_FRAME_EXTENTS and _NET_SUPPORT_FULL_PLACEMENT EWMH hints. Release 0.8.2 (2009-03-01 Danny Baumann ) ============================================================== Maintenance release. Fixed issue in strut handling that could lead to struts being ignored for certain monitor configurations. Fixed window position constraining logic. Fixed kconfig xslt files missing from 0.8.0 tarball. Release 0.8.0 (2009-02-20 Danny Baumann ) ============================================================== Fourth stable release of compiz. New plugin "commands" that handles the bindings for arbitrary commands that previously were handled in core. In addition to the previously present key bindings button and edge bindings were added as well. New plugin "gnomecompat" which handles bindings that are exclusively used in the Gnome desktop environment and removed the corresponding bindings from core. This change fixes main menu and run dialog bindings for KDE users as those previously were conflicting between compiz and KDE. Gnome users upgrading should make sure to enable this plugin. Added support for _NET_WM_FULLSCREEN_MONITORS EWMH hint. Added support for reading the icon hint from the WM_HINTS property if _NET_WM_ICON is not available. Update Gnome support for Gnome 2.24. Added options to scale plugin that allow "toggle type" behaviour for key and button bindings. Several memory leak fixes. Adjusted gtk-window-decorator for newer libmetacity-private versions. Fixed gtk-window-decorator display for RTL languages. Adjusted kde4-window-decorator for KDE 4.2 API. Large number of minor bug fixes, especially in resize handling and stacking code. Translation updates Release 0.7.8 (2008-09-17 Danny Baumann ) ============================================================== Development release. New plugin "obs" that handles opacity, brightness and saturation bindings and matches. Put unresponsive window greyout, including options to configure it, to fade plugin. Add "constant fade time" fade mode to fade plugin. Removed opacity bindings and matches from core. Users that entered opacity matches should enable the obs plugin and enter the matches there. Enhanced timer infrastructure to allow synchronization of execution of multiple timer callbacks. Added matching for window's alpha channel (match type rgba=[0|1]). Reflect new Metacity "spacer" button type in gtk-window-decorator. Various bugfixes. Translation updates. Release 0.7.6 (2008-05-29 Dennis Kasprzyk ) ========================================================================= Development release. Rewrite of place plugin, which significantly improves multi-output behaviour. Configurable multi-output behaviour in place. Removed plane plugin. Former plane plugin users are encouraged to use the wall plugin of Compiz Fusion. Removed cube wallpaper painting. Users are encouraged to use the Compiz Fusion wallpaper plugin instead. Place plugin viewport placement viewport numbers are now 1-based. Panel and desktop selection mode in switcher plugin. Improved painting behaviour when using overlapping outputs. Gtk-window-decorator now emits accessibility events when switching. Gtk-window-decorator behaviour when using Metacity themes has been improved to match Metacity better. KDE4-window-decorator has been adapted to current KDE4 API. Various bugfixes. Release 0.7.4 (2008-03-04 Dennis Kasprzyk ) ========================================================================= Development release. Configurable handling of overlapping output devices. Enhanced focus stealing prevention with configurable amount of focus stealing prevention. Added configurable, optional delay for edge actions to prevent accidential invocation. Generalized vertex system to improve plugin compatibility. Optimized gaussian blur shaders to support more hardware. Improved unredirection of fullscreen windows. Several bugfixes. Translation updates. Release 0.7.2 (2008-03-06 Dennis Kasprzyk ) ========================================================================= Development release. Several bugfixes Translation support in gtk-window-decorator. Updated translations. Added wrapable session functions to core. This allows to provide a full session save/restore in a plugin. Release 0.7.0 (2008-02-07 Dennis Kasprzyk ) ========================================================================= Development release. A core plugin has been added that allows handling certain core APIs, such as querying the ABI version, similarly to plugin APIs, allowing sharing more code. Added a simple object system, which generalize the privates mechanism and the plugin system. It allows to share more code between display, screen and window objects. It also makes it possible to properly introduce new object types without changing the plugin interface or breaking the API. Multi-display support. Various fixes in ICCCM compliance, window stacking and focus handling. Validity checking of ConfigureRequest events. Fixes to transient children placement in place plugin. Hooks have been added to the cube plugin which allow better control of viewport drawing. Middle and right click actions have been made configurable in gtk-window-decorator. Gtk-window-decorator now optionally allows mouse wheel title bar actions, such as shading. A KDE4 port of the kde-window-decorator has been added. Frequent crashes of kde-window-decorator for some people have been fixed. Release 0.5.4 (2007-08-20 David Reveman ) ============================================================ Development release. XCB is now required. Major improvements to option system that makes configuration backend integration much less complex. Kconfig plugin that provides proper KDE configuration support. Kcfg files are generated from the meta-data and they can be used to generate C++ source code that will provide an API for applications to access all compiz configuration data used by the kconfig plugin. Release 0.5.2 (2007-08-03 David Reveman ) ============================================================ Development release. Better support for multiple X-screens. XML-based meta-data system for handling of various kinds for meta-data like plugin descriptions, default option values, etc. Major improvements to option initialization based on the new meta-data system. Logging framework. Support for configurable button layout in metacity themes has been added to gtk-window-decorator. Glib plugin that allows plugins that use the glib main loop to integrate properly with the compiz main loop without waking up periodically to check for pending events. Plugin plugins that make it possible to adjust and extend the behavior of existing plugins through new plugins. More dynamic handling of output devices, which allows the output device configuration used when rendering to be changed between frames. Transparency support in cube plugin. Introspection support in dbus plugin. Release 0.5.0 (2007-04-02 David Reveman ) ============================================================ Development release. Remove stencil buffer requirement. Focus stealing prevention support. Blur plugin that provide support for blurring windows and contents behind translucent windows. Fragment attribute interface that allow plugins to perform more advanced fragment shading effects and integrate properly with other plugins. Extensible window matching interface and new option type that provide advanced window selection functionality. Plugin that provide a composited video interface for efficient video playback. FUSE plugin that maps compiz options to a file-system and allow efficient manipulation of options by reading and writing files. Better occlusion detection and more efficient rendering. Flat file configuration backend. Release 0.3.6 (2006-12-31 David Reveman ) ============================================================ Development release. Add support for unredirect of fullscreen windows when using the composite overlay window and make usage of the composite overlay window for output default. Add file notification API. Add inotify plugin that implements file notification API. A "GetPlugins" method has been added to dbus plugin and it can be used to retrieve a list of available plugins. A 'GetPluginMetadata' method has been added to dbus plugin and it returns metadata for available plugins. Add support for switching between windows without having the thumbnail window show up. Switcher thumbnails now include decorations and shadows. Basic drag and drop support has been added to scale plugin. It's now possible to initiate scale plugin for specific window groups. Window menu icon support has been added to gtk window decorator. Improved support for metacity themes. Add KDE window decorator with support for shadows and opacity has been added. Release 0.3.4 (2006-11-21 David Reveman ) ============================================================ Development release. Edge button, which can be used to require a button press for edge actions to be triggered. Basic compiz event support. Zoom plugin now works without "largedesktop" feature. Cube plugin now handles desktop width less than 4 times the screen better. Support for multiple desktops (workspaces). Handling of _NET_DESKTOP_GEOMETRY client messages has been fixed. Much better multi-head support. Annotate plugin has been added. Clone plugin which can be used to clone outputs in a convenient way has been added. Currently more of a prototype as we need randr++ and input transformation in the server to do this properly. Shadow color option has been added. initiate_all option has been added to scale plugin. Zoom factor option has been added to zoom plugin. Support for new metacity theme version and support for metacity versions < 2.15.21. Event window placement when using some metacity themes has been fixed. Fix a number of issues related to minimizing windows with transients. Release 0.3.2 (2006-10-20 David Reveman ) ============================================================ Development release. snap_inverted option has been added to wobbly plugin. Configuration support has been added to dbus plugin. Add 'command' option has been added to decoration plugin, which can be used to automatically launch a decorator when one isn't already running. Opacity support for metacity themes. A raise_window option has been added. Decorations on maximized windows are now rendered correctly when using metacity themes. An ignore_hints_when_maximized option, which makes compiz ignore size increment and aspect hints for maximized windows has been added and made default. Better default option values for rotate plugin. and much more... Release 0.2.0 (2006-10-02 David Reveman ) ============================================================ First official release of compiz. compiz-0.9.11+14.04.20140409/metadata/0000755000015301777760000000000012321344021017254 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/metadata/CMakeLists.txt0000644000015301777760000000323412321343002022014 0ustar pbusernogroup00000000000000set ( COMPIZ_DEFAULT_PLUGINS "core" CACHE STRING "Default plugins list that will be added to core metadata file" ) find_program (XSLTPROC_EXECUTABLE xsltproc) mark_as_advanced (FORCE XSLTPROC_EXECUTABLE) if (XSLTPROC_EXECUTABLE) add_custom_command ( OUTPUT ${compiz_BINARY_DIR}/generated/core.xml.in COMMAND ${XSLTPROC_EXECUTABLE} -o ${compiz_BINARY_DIR}/generated/core.xml.in --param default_plugins "\"'${COMPIZ_DEFAULT_PLUGINS}'\"" ${CMAKE_SOURCE_DIR}/xslt/default_plugins.xslt ${CMAKE_CURRENT_SOURCE_DIR}/core.xml.in DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/core.xml.in ) set (_core_file "${CMAKE_BINARY_DIR}/generated/core.xml.in") else () set (_core_file "${CMAKE_CURRENT_SOURCE_DIR}/core.xml.in") endif () set (_xml_targets) set (_schema_targets) set (_core_xml_file ${CMAKE_BINARY_DIR}/generated/core.xml) compiz_translate_xml ( ${_core_file} ${_core_xml_file} ) install ( FILES ${_core_xml_file} DESTINATION ${compiz_metadatadir} ) add_custom_target (core-xml-file ALL DEPENDS ${_core_xml_file} ) if (USE_GCONF) compiz_gconf_schema ( ${_core_xml_file} ${CMAKE_BINARY_DIR}/generated/compiz-core.schemas ${SCHEMADIR} ) add_custom_target (core-gconf-schema ALL DEPENDS ${CMAKE_BINARY_DIR}/generated/compiz-core.schemas core-xml-file ) endif () if (USE_GSETTINGS) set (_core_gschema_path ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/org.compiz.core.gschema.xml) compiz_gsettings_schema ( compiz ${_core_xml_file} ${_core_gschema_path} ${datadir}/glib-2.0/schemas ) add_custom_target (core-settings-schema ALL DEPENDS ${_core_gschema_path} core-xml-file ) endif () compiz-0.9.11+14.04.20140409/metadata/core.xml.in0000644000015301777760000002141512321343002021334 0ustar pbusernogroup00000000000000 <_short>General Options <_long>General compiz options <_short>Display Settings <_short>Focus & Raise Behaviour <_short>Key bindings <_short>Desktop Size compiz-0.9.11+14.04.20140409/INSTALL0000644000015301777760000000120612321343002016522 0ustar pbusernogroup00000000000000compiz uses libstartup-notification which is available at ftp://ftp.gnome.org/pub/GNOME/sources/startup-notification/ compiz uses out-of-tree builds with cmake, in order to generate the Makefiles for compiz use: $ mkdir build $ cd build $ cmake .. If you have multiple versions of Python installed, you will need to specify the version like this: $ cmake .. \ -DPYTHON_INCLUDE_DIR=/usr/include/python2.7 \ -DPYTHON_LIBRARY=/usr/lib/libpython2.7.so After that, standard build procedures apply: $ make # make install In order to build other plugins, you will need to install the compiz cmake set # make findcompiz_install compiz-0.9.11+14.04.20140409/RELEASING0000644000015301777760000000524712321343002016736 0ustar pbusernogroup00000000000000Here are the steps to follow to create a new compiz release: 1) Ensure that there are no local, uncommitted modifications. It's probably good enough if "git diff HEAD" doesn't output anything and your "master" and "origin" branches are at the current revision. 2) Verify that the code passes "make distcheck" Running "make distcheck" should result in no warnings or errors and end with a message of the form: ============================================== compiz-X.Y.Z archives ready for distribution: compiz-X.Y.Z.tar.gz ============================================== (But the tar file isn't actually ready yet, as we still have some more steps to follow). 3) Fill out an entry in the NEWS file Shift through the logs since the last release. This is most easily done with a comand such as: git log --stat compiz-X.Y.Z.. where X.Y.Z is the previous release version. Summarize major changes briefly in a style similar to other entries in NEWS. 4) Increment version number in configure.ac: Increment to the micro version number to the next larger (even) number. 5) Commit the changes to NEWS and configure.ac It's especially important to mention the new version number in your commit log. 6) Run "make release-publish" which will perform the following steps for you: * Check that the version number ends with an even micro component * Check that no release exists with the current version * Verify that make distcheck completes successfully * Generate the final tar file * Generate an sha1sum file * Sign the sha1sum using your GPG setup (asks for your GPG password) * scp the three files to appear on http://xorg.freedesktop.org/archive/individual/app * Place local copies of the three files in the releases directory * Tag the entire source tree with a tag of the form compiz-X.Y.Z, and sign the tag with your GPG key (asks for your GPG password, and you may need to set GIT_COMMITTER_NAME and GIT_COMMITTER_EMAIL to match your public-key's setting or this fails.) * Provide some text for the release announcement (see below). If for some reason you lost this message, "make release-publish-message" prints it for you. 7) Increment compiz_version_micro to the next larger (odd) number in configure, commit, and push. 8) Push the newly created tag out to the central tree with a command something like: git push compiz-X.Y.Z 9) Send a message to compiz@list.freedesktop.org to announce the new release using the text provided from "make release-publish", adding the excerpt from NEWS, your signature, followed by tacking on the detailed changelog-ish thing that gets mailed out when you push the tag (but not the diffstat thing). compiz-0.9.11+14.04.20140409/po/0000755000015301777760000000000012321344021016112 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/po/fa.po0000644000015301777760000014571112321343002017047 0ustar pbusernogroup00000000000000# Translation of compiz.po into Persian. # Copyright (C) 2008 Compiz-Fusion Developers # This file is distributed under the same license as the Compiz-Fusion package. # Mohammad Ebrahim Mohammadi Panah , 2008. # msgid "" msgstr "" "Project-Id-Version: Compiz-Fusion compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-29 13:06+0100\n" "PO-Revision-Date: 2008-03-12 06:29+0100\n" "Last-Translator: Ali Tarihi \n" "Language-Team: l10n.ir\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "رومیزی" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "مدیریت پنجره‌" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 #, fuzzy msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "کنشی Ú©Ù‡ هنگام Scroll کردن چرخ موشواره روی عنوان یک پنجره صورت گیرد." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "میزان مات بودن پنجره ÙØ¹Ø§Ù„ در تم Metacity " #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:11 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 ../metadata/zoom.xml.in.h:2 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 ../metadata/cube.xml.in.h:28 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:13 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:23 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/core.xml.in.h:1 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/core.xml.in.h:2 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/core.xml.in.h:3 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/core.xml.in.h:4 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/core.xml.in.h:5 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/core.xml.in.h:6 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/core.xml.in.h:7 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/core.xml.in.h:8 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/core.xml.in.h:9 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/core.xml.in.h:10 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/core.xml.in.h:11 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/core.xml.in.h:12 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/core.xml.in.h:13 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.h:14 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.h:15 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.h:16 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.h:17 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.h:18 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.h:19 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.h:20 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.h:21 msgid "Best" msgstr "" #: ../metadata/core.xml.in.h:22 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.h:23 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.h:24 msgid "Close Window" msgstr "" #: ../metadata/core.xml.in.h:25 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.h:26 msgid "Command line 0" msgstr "" #: ../metadata/core.xml.in.h:27 msgid "Command line 1" msgstr "" #: ../metadata/core.xml.in.h:28 msgid "Command line 10" msgstr "" #: ../metadata/core.xml.in.h:29 msgid "Command line 11" msgstr "" #: ../metadata/core.xml.in.h:30 msgid "Command line 2" msgstr "" #: ../metadata/core.xml.in.h:31 msgid "Command line 3" msgstr "" #: ../metadata/core.xml.in.h:32 msgid "Command line 4" msgstr "" #: ../metadata/core.xml.in.h:33 msgid "Command line 5" msgstr "" #: ../metadata/core.xml.in.h:34 msgid "Command line 6" msgstr "" #: ../metadata/core.xml.in.h:35 msgid "Command line 7" msgstr "" #: ../metadata/core.xml.in.h:36 msgid "Command line 8" msgstr "" #: ../metadata/core.xml.in.h:37 msgid "Command line 9" msgstr "" #: ../metadata/core.xml.in.h:38 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/core.xml.in.h:39 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/core.xml.in.h:40 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/core.xml.in.h:41 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/core.xml.in.h:42 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/core.xml.in.h:43 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/core.xml.in.h:44 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/core.xml.in.h:45 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/core.xml.in.h:46 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/core.xml.in.h:47 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/core.xml.in.h:48 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/core.xml.in.h:49 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/core.xml.in.h:50 msgid "Decrease Opacity" msgstr "" #: ../metadata/core.xml.in.h:51 msgid "Decrease window opacity" msgstr "" #: ../metadata/core.xml.in.h:52 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.h:53 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.h:54 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.h:55 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:56 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.h:57 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.h:58 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.h:59 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.h:60 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.h:61 msgid "Good" msgstr "" #: ../metadata/core.xml.in.h:62 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.h:63 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.h:64 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.h:65 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:66 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.h:67 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.h:68 msgid "Increase Opacity" msgstr "" #: ../metadata/core.xml.in.h:69 msgid "Increase window opacity" msgstr "" #: ../metadata/core.xml.in.h:70 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.h:71 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.h:72 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.h:73 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.h:74 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.h:75 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.h:76 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.h:77 msgid "Maximize Window" msgstr "" #: ../metadata/core.xml.in.h:78 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.h:79 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.h:80 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.h:81 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.h:82 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.h:83 msgid "Minimize Window" msgstr "" #: ../metadata/core.xml.in.h:84 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.h:85 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.h:86 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.h:87 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.h:88 msgid "Opacity Step" msgstr "" #: ../metadata/core.xml.in.h:89 msgid "Opacity change step" msgstr "" #: ../metadata/core.xml.in.h:90 msgid "Opacity values for windows that should be translucent by default" msgstr "" #: ../metadata/core.xml.in.h:91 msgid "Opacity window values" msgstr "" #: ../metadata/core.xml.in.h:92 msgid "Opacity windows" msgstr "" #: ../metadata/core.xml.in.h:93 msgid "Open a terminal" msgstr "" #: ../metadata/core.xml.in.h:94 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.h:95 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.h:96 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.h:97 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.h:98 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.h:99 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.h:100 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.h:101 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:102 msgid "Run Dialog" msgstr "" #: ../metadata/core.xml.in.h:103 msgid "Run command 0" msgstr "" #: ../metadata/core.xml.in.h:104 msgid "Run command 1" msgstr "" #: ../metadata/core.xml.in.h:105 msgid "Run command 10" msgstr "" #: ../metadata/core.xml.in.h:106 msgid "Run command 11" msgstr "" #: ../metadata/core.xml.in.h:107 msgid "Run command 2" msgstr "" #: ../metadata/core.xml.in.h:108 msgid "Run command 3" msgstr "" #: ../metadata/core.xml.in.h:109 msgid "Run command 4" msgstr "" #: ../metadata/core.xml.in.h:110 msgid "Run command 5" msgstr "" #: ../metadata/core.xml.in.h:111 msgid "Run command 6" msgstr "" #: ../metadata/core.xml.in.h:112 msgid "Run command 7" msgstr "" #: ../metadata/core.xml.in.h:113 msgid "Run command 8" msgstr "" #: ../metadata/core.xml.in.h:114 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.h:115 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.h:116 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.h:117 msgid "Screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:118 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.h:119 msgid "Show Main Menu" msgstr "" #: ../metadata/core.xml.in.h:120 msgid "Show Run Application dialog" msgstr "" #: ../metadata/core.xml.in.h:121 msgid "Show the main menu" msgstr "" #: ../metadata/core.xml.in.h:122 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.h:123 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.h:124 msgid "Take a screenshot" msgstr "" #: ../metadata/core.xml.in.h:125 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/core.xml.in.h:126 msgid "Terminal command line" msgstr "" #: ../metadata/core.xml.in.h:127 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.h:128 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.h:129 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.h:130 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.h:131 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.h:132 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.h:133 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.h:134 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.h:135 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.h:136 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.h:137 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.h:138 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.h:139 msgid "Unmaximize Window" msgstr "" #: ../metadata/core.xml.in.h:140 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.h:141 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.h:142 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.h:143 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:144 msgid "Window Menu" msgstr "" #: ../metadata/core.xml.in.h:145 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.h:146 msgid "Window menu key binding" msgstr "" #: ../metadata/core.xml.in.h:147 msgid "Window screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:148 msgid "Windows that should be translucent by default" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Background Images" msgstr "" #: ../metadata/cube.xml.in.h:9 msgid "Background images" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Window Opacity Fade Time." msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fade Time" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:19 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:20 ../metadata/switcher.xml.in.h:10 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:27 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:29 ../metadata/scale.xml.in.h:17 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "On big cube" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:46 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:90 ../metadata/scale.xml.in.h:32 #: ../metadata/switcher.xml.in.h:31 ../metadata/zoom.xml.in.h:3 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:48 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:93 ../metadata/scale.xml.in.h:34 #: ../metadata/switcher.xml.in.h:35 ../metadata/zoom.xml.in.h:4 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:1 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:2 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Window fade speed" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/scale.xml.in.h:21 #: ../metadata/switcher.xml.in.h:17 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Maximize" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:9 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:10 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Y position values" msgstr "" #: ../metadata/plane.xml.in.h:1 msgid "Desktop Plane" msgstr "" #: ../metadata/plane.xml.in.h:2 msgid "Place windows on a plane" msgstr "" #: ../metadata/plane.xml.in.h:3 msgid "Plane Down" msgstr "" #: ../metadata/plane.xml.in.h:4 msgid "Plane Left" msgstr "" #: ../metadata/plane.xml.in.h:5 msgid "Plane Right" msgstr "" #: ../metadata/plane.xml.in.h:6 msgid "Plane To Face 1" msgstr "" #: ../metadata/plane.xml.in.h:7 msgid "Plane To Face 10" msgstr "" #: ../metadata/plane.xml.in.h:8 msgid "Plane To Face 11" msgstr "" #: ../metadata/plane.xml.in.h:9 msgid "Plane To Face 12" msgstr "" #: ../metadata/plane.xml.in.h:10 msgid "Plane To Face 2" msgstr "" #: ../metadata/plane.xml.in.h:11 msgid "Plane To Face 3" msgstr "" #: ../metadata/plane.xml.in.h:12 msgid "Plane To Face 4" msgstr "" #: ../metadata/plane.xml.in.h:13 msgid "Plane To Face 5" msgstr "" #: ../metadata/plane.xml.in.h:14 msgid "Plane To Face 6" msgstr "" #: ../metadata/plane.xml.in.h:15 msgid "Plane To Face 7" msgstr "" #: ../metadata/plane.xml.in.h:16 msgid "Plane To Face 8" msgstr "" #: ../metadata/plane.xml.in.h:17 msgid "Plane To Face 9" msgstr "" #: ../metadata/plane.xml.in.h:18 msgid "Plane Up" msgstr "" #: ../metadata/plane.xml.in.h:19 msgid "Plane down" msgstr "" #: ../metadata/plane.xml.in.h:20 msgid "Plane left" msgstr "" #: ../metadata/plane.xml.in.h:21 msgid "Plane right" msgstr "" #: ../metadata/plane.xml.in.h:22 msgid "Plane to face 1" msgstr "" #: ../metadata/plane.xml.in.h:23 msgid "Plane to face 10" msgstr "" #: ../metadata/plane.xml.in.h:24 msgid "Plane to face 11" msgstr "" #: ../metadata/plane.xml.in.h:25 msgid "Plane to face 12" msgstr "" #: ../metadata/plane.xml.in.h:26 msgid "Plane to face 2" msgstr "" #: ../metadata/plane.xml.in.h:27 msgid "Plane to face 3" msgstr "" #: ../metadata/plane.xml.in.h:28 msgid "Plane to face 4" msgstr "" #: ../metadata/plane.xml.in.h:29 msgid "Plane to face 5" msgstr "" #: ../metadata/plane.xml.in.h:30 msgid "Plane to face 6" msgstr "" #: ../metadata/plane.xml.in.h:31 msgid "Plane to face 7" msgstr "" #: ../metadata/plane.xml.in.h:32 msgid "Plane to face 8" msgstr "" #: ../metadata/plane.xml.in.h:33 msgid "Plane to face 9" msgstr "" #: ../metadata/plane.xml.in.h:34 msgid "Plane up" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Normal" msgstr "" #: ../metadata/resize.xml.in.h:13 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:2 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:12 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:94 ../metadata/switcher.xml.in.h:37 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:2 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:3 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:5 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:18 ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:24 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:25 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:28 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:6 msgid "Brightness" msgstr "" #: ../metadata/switcher.xml.in.h:7 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:11 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:14 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:19 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Saturation" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:29 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:36 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #: ../metadata/zoom.xml.in.h:1 msgid "Filter Linear" msgstr "" #: ../metadata/zoom.xml.in.h:5 msgid "Use linear filter when zoomed in" msgstr "" #: ../metadata/zoom.xml.in.h:6 msgid "Zoom Desktop" msgstr "" #: ../metadata/zoom.xml.in.h:7 msgid "Zoom In" msgstr "" #: ../metadata/zoom.xml.in.h:8 msgid "Zoom Out" msgstr "" #: ../metadata/zoom.xml.in.h:9 msgid "Zoom Pan" msgstr "" #: ../metadata/zoom.xml.in.h:10 msgid "Zoom Speed" msgstr "" #: ../metadata/zoom.xml.in.h:11 msgid "Zoom Timestep" msgstr "" #: ../metadata/zoom.xml.in.h:12 msgid "Zoom and pan desktop cube" msgstr "" #: ../metadata/zoom.xml.in.h:13 msgid "Zoom factor" msgstr "" #: ../metadata/zoom.xml.in.h:14 msgid "Zoom pan" msgstr "" compiz-0.9.11+14.04.20140409/po/af.po0000644000015301777760000017512212321343002017046 0ustar pbusernogroup00000000000000# Copyright (C) 2007 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the package. # msgid "" msgstr "" "Project-Id-Version: installation\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2006-11-03 14:26\n" "Last-Translator: Novell Language \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Werkskerm" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Inisialiseer" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Inisialiseer" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Inisialiseer" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Inisialiseer" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Inisialiseer" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Inisialiseer" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Berg konfigurasie" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Berg konfigurasie" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Berg konfigurasie" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Kies &niks" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Kies &niks" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Kataloguskeuse" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Opdragte:" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Opdrag '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Werkskerm" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Kies &niks" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Kies &niks" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normaal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&Vernuwe" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Werkskerm" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Inisialiseer" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Werkskerm" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Opdragte:" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Kies &niks" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Kies &niks" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Installasie is voltooi" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Kies &niks" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Kies &niks" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Kies &niks" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Opdrag '%1'" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Opdrag '%1'" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Kies &niks" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Berg konfigurasie" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Berg konfigurasie" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Berg konfigurasie" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Berg konfigurasie" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Kies &niks" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Kies &niks" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Kies &niks" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Kies &niks" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Inisialiseer" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Inisialiseer" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Inisialiseer" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Inisialiseer" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Inisialiseer" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Kies &niks" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Inisialiseer" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Inisialiseer" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Kies &niks" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Kies &niks" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Kies &niks" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Installasie is voltooi" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Installasie is voltooi" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Installasie is voltooi" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Installasie is voltooi" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Begin van installasie ..." #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Inisialiseer" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Kies &niks" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "Kies &niks" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "&Plaaslike gids ..." #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Kataloguskeuse" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Inisialiseer" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Tydens selflaai" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Werkskerm" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "Kies &niks" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Kies &niks" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Kies &niks" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Kies &niks" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Kies &niks" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Kies &niks" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Kies &niks" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Kies &niks" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Tydens selflaai" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Opdrag '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Opdrag '%1'" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Werkskerm" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Installasie is voltooi" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Installasie is voltooi" #~ msgid "Unknown" #~ msgstr "Onbekend" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Berg konfigurasie" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Installasie is voltooi" compiz-0.9.11+14.04.20140409/po/ko.po0000644000015301777760000025276612321343002017103 0ustar pbusernogroup00000000000000# Korean compiz translation. # Copyright (C) 2007 compiz-fusion.org # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # This file is distributed under the same license as the compiz package. # Lee June Hee , 2007. # Hwang, Sang-Jin msgid "" msgstr "" "Project-Id-Version: Compiz 0.6.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-09-30 15:52+0200\n" "Last-Translator: Lee June Hee \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "ë°ìФí¬íƒ‘" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "ì°½ 관리" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "컴피즈" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "ì—†ìŒ" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "ë§ì•„올리기" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "최대화" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "가로로 최대화" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "세로로 최대화" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "최소화" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "올림" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "내림" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "ì°½ 메뉴" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "ì°½ 제목 표시줄ì—서 마우스 휠 스í¬ë¡¤ì‹œ 취할 í–‰ë™" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "í림 형태" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "í™œì„±í™”ëœ ì°½ì˜ ë©”íƒ€ì‹œí‹° 테마 투명ë„" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "í™œì„±í™”ëœ ì°½ì˜ ë©”íƒ€ì‹œí‹° 테마 ê·¸ë¦¼ìž íˆ¬ëª…ë„" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "메타시티 테마 투명ë„" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "메타시티 테마 ê·¸ë¦¼ìž íˆ¬ëª…ë„" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "메타시티 테마를 가진 í™œì„±í™”ëœ ì°½ì—서 사용할 투명ë„" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "메타시티 í…Œë§ˆì— ì‚¬ìš©í•  투명ë„" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "메타시티 테마를 사용하는 í™œì„±í™”ëœ ì°½ì˜ ê·¸ë¦¼ìž íˆ¬ëª…ë„를설정합니다." #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "메타시티 테마를 사용하는 ì°½ì˜ ê·¸ë¦¼ìž íˆ¬ëª…ë„를 설정합니다." #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "제목 표시줄ì—서 마우스 휠 사용시 í•  í–‰ë™" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "ì°½ 장ì‹ì—서 사용할 í림 íš¨ê³¼ì˜ í˜•íƒœ" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "메타시티 테마를 사용합니다." #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "ì°½ 장ì‹ì„ 그릴 때 메타시티 테마를 사용합니다." #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "ì°½ 닫기" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "ì°½ 최대화 취소" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "ì°½ 최대화" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "ì°½ 최소화" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "í•­ìƒ ìœ„ì—" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "ëˆì ì´ ì°½ 설정" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "ë§ì•„올리기 í•´ì œ" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "í•­ìƒ ìœ„ì— í•´ì œ" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "ëˆì ì´ ì°½ í•´ì œ" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "ì°½ \"%s\"ê°€ ì‘답하지 않습니다." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "ì´ ì‘ìš©í”„ë¡œê·¸ëž¨ì„ ê°•ì œë¡œ 종료하면 저장하지 ì•Šì€ ë°ì´í„°ëŠ” ì†ì‹¤ë©ë‹ˆë‹¤." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_ê°•ì œ 종료" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "주ì„" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "주ì„ì˜ ì±„ìš°ê¸° 색" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "주ì„ì˜ ì™¸ê³½ì„  색" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "ì£¼ì„ í”ŒëŸ¬ê·¸ì¸" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "지우기" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "그리기" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "ë„구를 사용하여 ê·¸ë¦¼ì„ ê·¸ë¦¼" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "주ì„ì˜ ì±„ìš°ê¸° 색" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "시작" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "ì£¼ì„ ê·¸ë¦¬ê¸°ë¥¼ 시작" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "ì£¼ì„ ì§€ìš°ê¸°ë¥¼ 시작" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "지우기 시작" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "ì„  너비" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "주ì„ì˜ ì„  너비" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "주ì„ì˜ ì™¸ê³½ì„  색" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "í…Œë‘리 너비" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "주ì„ì˜ í…Œë‘리 너비" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x 양선형" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "투명 í림 효과" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "투명 ì°½ í림 효과" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "í림 효과 í•„í„°" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "í림 효과 í색" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "í림 효과 채ë„" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "í림 효과 ì†ë„" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "ì°½ í림 효과" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "ì°½ì˜ íˆ¬ëª…í•œ 부분 ë’·ë©´ì„ í리게 합니다." #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "í림 효과 채ë„" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "ì°½ í림 효과" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "ì´ˆì ì„ ìžƒì€ ì°½ì„ í리게 합니다." #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "다른 ì°½ì— ê°€ë ¤ ë³´ì´ì§€ 않는 ì˜ì—­ì˜ í림 효과를 비활성화 합니다." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "í림 íš¨ê³¼ì— ì‚¬ìš©í•  í•„í„°" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "ì´ˆì  í림 효과" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "ì´ˆì ì„ 가진 ì°½ì„ í리게 합니다." #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "가우시안" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "가우시안 반경" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "가우시안 ê°•ë„" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "가우시안 반경" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "가우시안 ê°•ë„" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "ë…립ì ì¸ í…ìŠ¤ì³ í˜¸ì¶œ" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmapì˜ ìƒì„¸ë„" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmapì˜ ìƒì„¸ë„" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "ì§„ë™" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "ì§„ë™ íš¨ê³¼" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "최대한 ë…립 í…ìŠ¤ì³ í˜¸ì¶œì„ í•  수 있ë„ë¡ ê°€ëŠ¥í•œ í…ìŠ¤ì³ ë‹¨ìœ„ë¥¼ 사용합니다." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "ì°½ í림 ì†ë„" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "ì´ˆì  í림 효과를 ì ìš©í•  ì°½" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "투명 í림 효과를 기본ì ìœ¼ë¡œ 사용할 ì°½" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "화면 복제" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "복제 화면 ì„ íƒ ì‹œìž‘" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "화면 복제 관리ìž" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "명령 0ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  버튼" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "명령 1ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  버튼" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "명령 10ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  버튼" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "명령 11ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  버튼" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "명령 2ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  버튼" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "명령 3ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  버튼" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "명령 4ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  버튼" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "명령 5ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  버튼" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "명령 6ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  버튼" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "명령 7ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  버튼" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "명령 8ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  버튼" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "명령 9ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  버튼" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "명령 0ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  키" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "명령 1ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  키" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "명령 10ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  키" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "명령 11ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  키" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "명령 2ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  키" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "명령 3ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  키" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "명령 4ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  키" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "명령 5ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  키" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "명령 6ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  키" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "명령 7ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  키" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "명령 8ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  키" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "명령 9ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  키" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "명령 0ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  모서리" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "명령 1ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  모서리" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "명령 10ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  모서리" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "명령 11ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  모서리" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "명령 2ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  모서리" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "명령 3ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  모서리" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "명령 4ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  모서리" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "명령 5ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  모서리" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "명령 6ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  모서리" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "명령 7ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  모서리" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "명령 8ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  모서리" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "명령 9ì— ì§€ì •ëœ ëª…ë ¹ì„ ì‹¤í–‰í•  모서리" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "ìž„ì˜ì˜ ëª…ë ¹ì„ ë°”ë¡œê°€ê¸°ì— ì§€ì •" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "버튼 바로가기" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "명령 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "명령 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "명령 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "명령 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "명령 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "명령 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "명령 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "명령 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "명령 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "명령 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "명령 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "명령 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "명령 0ì„ ì„ íƒí–ˆì„ 때 ì‹¤í–‰ë  ì‰˜ 명령행" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "명령 1ì„ ì„ íƒí–ˆì„ 때 ì‹¤í–‰ë  ì‰˜ 명령행" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "명령 10ì„ ì„ íƒí–ˆì„ 때 ì‹¤í–‰ë  ì‰˜ 명령행" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "명령 11ì„ ì„ íƒí–ˆì„ 때 ì‹¤í–‰ë  ì‰˜ 명령행" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "명령 2를 ì„ íƒí–ˆì„ 때 ì‹¤í–‰ë  ì‰˜ 명령행" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "명령 3ì„ ì„ íƒí–ˆì„ 때 ì‹¤í–‰ë  ì‰˜ 명령행" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "명령 4를 ì„ íƒí–ˆì„ 때 ì‹¤í–‰ë  ì‰˜ 명령행" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "명령 5를 ì„ íƒí–ˆì„ 때 ì‹¤í–‰ë  ì‰˜ 명령행" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "명령 6ì„ ì„ íƒí–ˆì„ 때 ì‹¤í–‰ë  ì‰˜ 명령행" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "명령 7ì„ ì„ íƒí–ˆì„ 때 ì‹¤í–‰ë  ì‰˜ 명령행" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "명령 8ì„ ì„ íƒí–ˆì„ 때 ì‹¤í–‰ë  ì‰˜ 명령행" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "명령 9를 ì„ íƒí–ˆì„ 때 ì‹¤í–‰ë  ì‰˜ 명령행" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "명령" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "모서리 바로가기" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "키 바로가기" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "명령 1 실행" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "명령 10 실행" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "명령 11 실행" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "명령 12 실행" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "명령 2 실행" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "명령 3 실행" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "명령 4 실행" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "명령 5 실행" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "명령 6 실행" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "명령 7 실행" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "명령 8 실행" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "명령 9 실행" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "사용 ì¤‘ì¸ í”ŒëŸ¬ê·¸ì¸ ëª©ë¡" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "ì „ì²´ 화면 ì°½ì„ ê·¸ë¦´ 때, 화면 ë°–ì˜ í”½ìŠ¤ë§µìœ¼ë¡œ ì´ˆì ì´ 변경ë˜ì§€ 않ë„ë¡ í—ˆìš©í•¨" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "ê²½ê³ ìŒ ì†Œë¦¬ 듣기" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "시스템 ê²½ê³ ìŒ ì†Œë¦¬ 듣기" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "ìžë™ìœ¼ë¡œ 떠오름" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "ìžë™ìœ¼ë¡œ 떠오르게 하는 지연 시간" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "모니터 ìžë™ ê°ì§€" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "갱신 주기를 ìžë™ìœ¼ë¡œ ê°ì§€" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "최고" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "í´ë¦­í•˜ë©´ ì´ˆì ì„ ì´ë™" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "ì°½ì„ í´ë¦­í•˜ë©´ ì´ˆì ì„ 변경함" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "í™œì„±í™”ëœ ì°½ì„ ë‹«ìŠµë‹ˆë‹¤." #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "기본 ì•„ì´ì½˜" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "기본 ì°½ ì•„ì´ì½˜ 그림" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "ë°ìФí¬íƒ‘ í¬ê¸°" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "화면 ê°ì§€" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "갱신 주기 ê°ì§€" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "ë””ìŠ¤í”Œë ˆì´ ì„¤ì •" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "모서리 ëª…ë ¹ì„ ì‹¤í–‰í•˜ê¸° ì „ì— í¬ì¸í„°ê°€ ëª¨ì„œë¦¬ì— ë¨¸ë¬¼ëŸ¬ 있어야 하는 시간" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "모서리 실행 지연 시간" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "빠름" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "ì´ˆì  & ë„우기 ë™ìž‘" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "ì´ˆì  ë§‰ê¸° ì •ë„" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "ì´ˆì ì„ ë§‰ì„ ì°½" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "ì´ˆì ì„ ë§‰ì„ ì°½" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "ë…ë¦½ëœ í™”ë©´ 그리기 ê°•ì œ" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "ì¼ë°˜ 설정" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "ì¼ë°˜ì ì¸ 컴피즈 설정" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "좋ìŒ" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "작업 í‘œì‹œì¤„ì— ë‚˜íƒ€ë‚˜ì§€ 않는 ì°½ì„ ìˆ¨ê¹€" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "모든 ì°½ì„ ìµœì†Œí™”í•˜ê³  ì´ˆì ì„ 바탕 í™”ë©´ì— ë§žì¶¤" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "바탕 화면 보기 ìƒíƒœì¼ 때 작업 í‘œì‹œì¤„ì— ì—†ëŠ” ì°½ì„ ìˆ¨ê¸°ê¸°" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "높ìŒ" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "가로 ê°€ìƒ í¬ê¸°" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "가능하다면 ì´ë¯¸ì§€ë¡œë¶€í„° ë³€í˜•ëœ í…스ì³ë¥¼ 압축합니다." #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "최대화시 힌트 무시" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "최대화시 í¬ê¸° ì¦ë¶„ê³¼ ë°©í–¥ 힌트 무시" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "ì„ íƒëœ ì°½ì„ ë„우는 시간 간격" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Ping 메시지들 사ì´ì˜ 간격" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "키 바로가기" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "ì´ˆì  ëºê¸°ë¥¼ 막는 ì •ë„" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "조명 효과" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "현재 í™œì„±í™”ëœ í”ŒëŸ¬ê·¸ì¸ì˜ 목ë¡" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "ì„¤ì •ëœ ëª¨ë‹ˆí„° 목ë¡" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "ë‚®ìŒ" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "ì°½ì„ ë‚´ë¦¬ê¸°" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "다른 창들 밑으로 ì°½ì„ ë‚´ë¦¼" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "가로로 ì°½ 최대화" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "세로로 ì°½ 최대화" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "í™œì„±í™”ëœ ì°½ 최대화" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "í™œì„±í™”ëœ ì°½ 가로로 최대화" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "í™œì„±í™”ëœ ì°½ 세로로 최대화" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "í™œì„±í™”ëœ ì°½ 최소화" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "기본" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "작업 ê³µê°„ì˜ ìˆ«ìž" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "ê°€ìƒ ë°ìФí¬íƒ‘ì˜ ìˆ«ìž" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "ë„기" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "ìˆ˜ì§ ê³µë°± 주기로만 í™”ë©´ì„ ì—…ë°ì´íŠ¸í•¨" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "화면" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "화면 오버래핑 ì¡°ì ˆ" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "모니터가 오버랩 ë˜ì–´ìžˆì–´ë„ ê° ëª¨ë‹ˆí„°ë¥¼ ë…립ì ìœ¼ë¡œ 그립니다. " #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping 지연" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "ë” í° í™”ë©´ì„ ì„ í˜¸í•¨" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "ë” ìž‘ì€ í™”ë©´ì„ ì„ í˜¸í•¨" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "í´ë¦­ìœ¼ë¡œ ë„우기" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "ì°½ ë„우기" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "ì„ íƒëœ ì°½ì„ ì¼ì • 시간 í›„ì— ë„우기" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "다른 ì°½ ìœ„ì— ì°½ì„ ë„우기" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "í´ë¦­í–ˆì„때 ì°½ ë„우기" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "갱신 주기" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "가로 화면 í¬ê¸° 배수" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "세로 화면 í¬ê¸° 배수" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "바탕 화면 보기" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "ëŠë¦° 애니메ì´ì…˜" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "스마트 모드" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlankì— ë™ê¸°í™”" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "í…ìŠ¤ì³ ì••ì¶•" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "í…ìŠ¤ì³ í•„í„°" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "í…ìŠ¤ì³ í•„í„°ë§" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "í™”ë©´ì´ ë‹¤ì‹œ 그려지는 비율(횟수/ì´ˆ)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "ì°½ 최대화" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "가로로 ì°½ 최대화" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "세로로 ì°½ 최대화" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "ì°½ ë§ì•„올리기" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "활성 ì°½ì„ ìµœëŒ€í™” 하기" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "가로로 활성 ì°½ 최대화" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "세로로 활성 ì°½ 최대화" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "활성 ì°½ ë§ì•„올리기" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "ëŠë¦° 애니메ì´ì…˜ 사용" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "활성 ì°½ 최대화 취소" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "ì „ì²´ 화면 ì°½ì˜ ì´ˆì  ë³€ê²½ ë°©ì§€" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "í™”ë©´ì´ ì „í™˜ë  ë•Œ ë¹›ì´ í¼ì§€ëŠ” 사용" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "세로 ê°€ìƒ í¬ê¸°" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "매우 높ìŒ" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "오버래핑 ëœ ëª¨ë‹ˆí„° 중 선호하는 모니터" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "ì°½ 메뉴 버튼" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "ì°½ 메뉴 키" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "ê°€ì†" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "ì´ë¯¸ì§€ ì¡°ì •" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "회전시 윗면 그림 ì¡°ì •" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "ë‹¤ìŒ ìŠ¬ë¼ì´ë“œë¡œ 넘어가기" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "ìŠ¤ì¹´ì´ ë” ì›€ì§ì´ê¸°" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "í브 회전시 ìŠ¤ì¹´ì´ ë” ì›€ì§ì´ê¸°" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "모양" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "ìžë™" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "ë™ìž‘" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "í브 윗면과 ë°‘ë©´ì˜ ìƒ‰ìƒ" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "ìŠ¤ì¹´ì´ ë” ê·¸ëž˜ë””ì–¸íŠ¸ì˜ ë°‘ë©´ 최종 색ìƒ" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "ìŠ¤ì¹´ì´ ë” ê·¸ëž˜ë””ì–¸íŠ¸ì˜ ìœ—ë©´ 최종 색ìƒ" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "í브 캡" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "í브 색ìƒ" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "ë°ìФí¬íƒ‘ í브" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "접기 ê°€ì†" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "접는 ì†ë„" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "접는 시간 간격" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "ë†’ì€ í’ˆì§ˆì„ ì–»ê¸° 위해 가능한 경우 mipmapì„ ìƒì„±" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "ì´ì „ 슬ë¼ì´ë“œë¡œ 가기" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "그림 파ì¼" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "ìŠ¤ì¹´ì´ ë”ì— ì‚¬ìš©í•  그림" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "마우스로 í브를 회전할 때만 í브를 투명하게 함" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "í브 ë‚´ë¶€" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "í브 ë‚´ë¶€" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "íë¸Œì˜ ìœ—ë©´ì— ê·¸ë ¤ì§ˆ PNG와 SVG íŒŒì¼ ëª©ë¡" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "다중 화면 모드" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "복수 í브" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "ë‹¤ìŒ ìŠ¬ë¼ì´ë“œ" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "커다란 ë‹¨ì¼ í브" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "회전할 ë•Œì˜ íˆ¬ëª…ë„" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "회전 안할 ë•Œì˜ íˆ¬ëª…ë„" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "회전할 때 바탕 í™”ë©´ì˜ íˆ¬ëª…ë„" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "회전 안할 때 바탕 í™”ë©´ì˜ íˆ¬ëª…ë„" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "í브 ìœ„ì— ì°½ì„ ë‚˜íƒ€ëƒ…ë‹ˆë‹¤." #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "ì´ì „ 슬ë¼ì´ë“œ" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "ìŠ¤ì¹´ì´ ë” ê·¸ë¦¬ê¸°" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "그림 í¬ê¸° ì¡°ì •" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "í브 ìœ—ë©´ì˜ ê·¸ë¦¼ í¬ê¸° ì¡°ì •" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "다중 모니터를 사용할 때 í브가 표시ë˜ëŠ” ë°©ë²•ì„ ì„ íƒí•˜ì„¸ìš”." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "ìŠ¤ì¹´ì´ ë”" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "ìŠ¤ì¹´ì´ ë” ê·¸ë¼ë””언트 최종 색ìƒ" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "ìŠ¤ì¹´ì´ ë” ê·¸ë¼ë””언트 시작 색ìƒ" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "ìŠ¤ì¹´ì´ ë” ê·¸ë¦¼" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "ì†ë„" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "시간 간격" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "마우스 회전시ì—ë§Œ 투명하게 함" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "투명 í브" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "펼치기" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "í브 펼치기" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus 컨트롤 백엔드" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "ì°½ ìž¥ì‹ í…스ì³ì— mipmap ìƒì„± 허용" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "명령" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "ì°½ 장ì‹" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "사용하고 있는 ì°½ ìž¥ì‹ í”„ë¡œê·¸ëž¨ì´ ì—†ì„ ë•Œ ì‹¤í–‰ë  ì°½ ìž¥ì‹ í”„ë¡œê·¸ëž¨ 명령행" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "ê·¸ë¦¼ìž ê°€ë¡œì¶• 여백" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "ê·¸ë¦¼ìž ì„¸ë¡œì¶• 여백" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "ê·¸ë¦¼ìž ìƒ‰" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "ê·¸ë¦¼ìž íˆ¬ëª…ë„" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "ê·¸ë¦¼ìž ë°˜ê²½" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "ê·¸ë¦¼ìž ìƒ‰" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "ê·¸ë¦¼ìž ê°€ë¡œì¶• 여백" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "ê·¸ë¦¼ìž ì„¸ë¡œì¶• 여백" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "ê·¸ë¦¼ìž íˆ¬ëª…ë„" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "ê·¸ë¦¼ìž ë°˜ê²½" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "ì°½ 그림ìž" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "ì°½ 장ì‹" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "ì°½ 장ì‹" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "ì°½ 장ì‹ì„ 사용할 ì°½" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "그림ìžê°€ 있어야 하는 ì°½" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "ë°˜ì‘하지 않는 ì°½ì˜ ë°ê¸°(%)" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "ì¼ì •한 ì†ë„" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "ì¼ì •한 시간" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "ì‘답하지 않는 ì°½ì„ í리게 함" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "창관리ìžì˜ ìš”ì²­ì— ì‘답하지 않는 ì°½ì„ í리게 함" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "페ì´ë“œ 모드" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "최소화/열기/닫기 시 페ì´ë“œ 효과" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "페ì´ë“œ ì†ë„" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "페ì´ë“œ 시간" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "최소화/열기/닫기 ì°½ ì´ë²¤íЏ ë°œìƒì‹œ 페ì´ë“œ 효과" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "시스템 ê²½ê³ ìŒ ëŒ€ì‹  페ì´ë“œ 효과" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "ì°½ì´ ìƒì„±ë  때는 페ì´ë“œ ì¸, ì¢…ë£Œë  ë•ŒëŠ” 페ì´ë“œ 아웃" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "ì°½ 페ì´ë“œ 효과" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "ì°½ 페ì´ë“œ 효과" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "ì „ì²´ 화면 ì‹œê° ê²½ê³ ìŒ" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "시스템 ê²½ê³ ìŒ ëŒ€ì‹  ì „ì²´ 화면 페ì´ë“œ 효과" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "ì‘답하지 않는 ì°½ì˜ ì±„ë„(%)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "ì‘답하지 않는 ì°½ ë°ê¸°" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "ì‘답하지 않는 ì°½ 채ë„" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "ì‹œê° ê²½ê³ ìŒ" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "ì°½ 페ì´ë“œ 모드" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "\"ì¼ì •한 ì†ë„\" 모드ì—서 ì°½ 사ë¼ì§ ì†ë„" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "\"ì¼ì •한 시간\" 모드ì—서 ì°½ 사ë¼ì§ ì†ë„(ms)" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "페ì´ë“œ 효과가 ì ìš©ë˜ëŠ” ì°½" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "마운트 í¬ì¸íЏ" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "마운트 í¬ì¸íЏ" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "ì‚¬ìš©ìž ê³µê°„ íŒŒì¼ ì‹œìŠ¤í…œ" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "ì‚¬ìš©ìž ê³µê°„ íŒŒì¼ ì‹œìŠ¤í…œ" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf 컨트롤 백엔드" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib ë©”ì¸ ë£¨í”„ ì§€ì›" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "그놈 호환성" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "í„°ë¯¸ë„ ì—´ê¸°" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Compizê°€ 그놈 ë°ìФí¬íƒ‘ í™˜ê²½ì— í˜¸í™˜ë  ìˆ˜ 있게 하는 옵션" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "프로그램 실행창" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "í„°ë¯¸ë„ ì‹¤í–‰ 명령" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "스í¬ë¦°ìƒ· 명령행" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "주 메뉴 보기" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "프로그램 ì‹¤í–‰ì°½ì„ ë³´ìž„" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "주 메뉴 보기" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "스í¬ë¦°ìƒ· ì°ê¸°" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "ì°½ 스í¬ë¦°ìƒ· ì°ê¸°" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "í„°ë¯¸ë„ ëª…ë ¹í–‰" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "ì°½ 스í¬ë¦°ìƒ· 명령행" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini 플랫 íŒŒì¼ ë°±ì—”ë“œ" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "íŒŒì¼ ë³€í™” 알림 플러그ì¸" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig 컨트롤 백엔드" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "최소화 효과" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "ì°½ 최소화" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "최소화 ì†ë„" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "최소화 시간 간격" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "ë§ì•„올리기 저항" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "ë§ì•„올리기 저항" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "최소화하거나 해제할 때 ì°½ 변형하기" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "최소화시 변형ë˜ëŠ” ì°½" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "세로축 움ì§ìž„ 제한" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "작업 공간 ì˜ì—­ìœ¼ë¡œ 세로축 움ì§ìž„ì„ ì œí•œ" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "ì°½ì˜ ì´ë™ì´ ë나지 ì•Šì•˜ì„ ë•Œ, ì°½ì˜ ì„œë²„ 측면 위치를 ë°˜ì˜í•˜ì§€ 않ìŒ" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "ì°½ ì´ë™ 시작" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "ëŠ¦ì€ ìœ„ì¹˜ ë°˜ì˜" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "ì°½ ì´ë™" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "ì°½ ì´ë™" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "투명" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "움ì§ì´ëŠ” ì°½ì˜ íˆ¬ëª… ì •ë„" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "드래그시 ìžë™ìœ¼ë¡œ ì°½ 최대화를 해제함" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "ì°½ 최대화 í•´ì œ" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "ì°½ ì´ë™ 시작" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "ë°ê¸°" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "ë°ê¸° ê°ì†Œ" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "ë°ê¸° ì¦ê°€" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "ë°ê¸° 단계" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "ì°½ì˜ ë°ì€ ì •ë„" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "ê°ì†Œ" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "ì¦ê°€" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "íˆ¬ëª…ë„ ê°ì†Œ" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "íˆ¬ëª…ë„ ì¦ê°€" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "íˆ¬ëª…ë„ ë‹¨ê³„" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "ì°½ì´ íˆ¬ëª…í•œ ì •ë„" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "투명, ë°ê¸°, 채ë„" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "투명, ë°ê¸°, ì±„ë„ ì¡°ì •" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "채ë„" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "ì±„ë„ ê°ì†Œ" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "ì±„ë„ ì¦ê°€" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "ì±„ë„ ë‹¨ê³„" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "ì°½ì˜ ì±„ë„ ì •ë„" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "단계" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "특정한 ì°½ 설정" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "ì •ë„" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "ì°½" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "기본ì ìœ¼ë¡œ 다른 ë°ê¸°ë¥¼ 갖는 ì°½" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "기본ì ìœ¼ë¡œ 다른 투명ë„를 갖는 ì°½" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "기본ì ìœ¼ë¡œ 다른 채ë„를 갖는 ì°½" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "ì°½ ë°°ì¹˜ì— ì‚¬ìš©í•  알고리즘" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "계단" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "중앙" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "ê³ ì •ëœ ì°½ 배치" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "강제로 ì°½ì„ ìœ„ì¹˜" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "가로 작업 공간 위치" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "작업 ì˜ì—­ì— 유지" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "위치 ì„¤ì •ì— ì ìš©ë˜ëŠ” ì°½ì„ ìž‘ì—… ì˜ì—­ì— 유지합니다. ê·¸ 위치가 특정한 위치와 다" "를지ë¼ë„ 유지합니다." #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "ì°½ 배치" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "모든 í™”ë©´ì— ìœ„ì¹˜" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "ì°½ì„ ìƒì„±í•  때 ì ì ˆí•œ ìœ„ì¹˜ì— ë°°ì¹˜" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "배치 모드" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "ë°°ì¹˜ëœ ì°½" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "무작위로" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "다중 화면 장치 ì˜µì…˜ì´ í™œì„±í™” ë˜ì—ˆì„ 때 ì°½ì˜ ë°°ì¹˜ë¥¼ 어떻게 í• ì§€ ì„ íƒí•˜ì„¸ìš”." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "똑똑하게" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "활성화 ë˜ì–´ìžˆëŠ” 모니터 사용" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "현재 사용 ì¤‘ì¸ ì°½ì´ ìžˆëŠ” 모니터 사용" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "마우스 í¬ì¸í„°ê°€ 있는 모니터 사용" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "세로 작업 공간 위치" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "작업 ê³µê°„ì— ë°°ì¹˜ëœ ì°½" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "ì°½ 배치 ë¬¸ì œì˜ íšŒí”¼ 방법" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "기본ì ìœ¼ë¡œ 배치ë˜ì–´ì•¼í•˜ëŠ” ì°½" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "기본ì ìœ¼ë¡œ 특정 작업 ê³µê°„ì— ë°°ì¹˜ë˜ì–´ì•¼í•˜ëŠ” ì°½" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "윈ë„ìš° 매니저가 위치시키지 않ë„ë¡ í–ˆë‹¤ê³  í•´ë„, 강제로 위치시킬 ì°½ë“¤ì„ ì„¤ì •í•©" "니다." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "ê³ ì •ëœ ìœ„ì¹˜ë¥¼ 갖는 ì°½" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "ê³ ì •ëœ ìž‘ì—… ê³µê°„ì„ ê°–ëŠ” ì°½" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "예비 수단" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "가로축 위치" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "작업 공간 가로축 위치" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "가로축 위치값" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "세로축 위치" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "작업 공간 세로축 위치" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "세로축 위치값" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png ì´ë¯¸ì§€ 불러오기" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "ì •ê·œí‘œí˜„ì‹ ì‚¬ìš©" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "ì •ê·œí‘œí˜„ì‹ ì°½ 매칭" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "바로가기" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "í…Œë‘리 색" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "외곽선 ì°½ í¬ê¸° ì¡°ì ˆ 모드와 사ê°í˜• ì°½ í¬ê¸° ì¡°ì ˆ 모드ì—서 사용할 í…Œë‘리 색" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "기본 ì°½ í¬ê¸° ì¡°ì ˆ 모드" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "ì°½ í¬ê¸° 조절할 ë•Œì˜ ê¸°ë³¸ 모드" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "채우기 색" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "사ê°í˜• ì°½ í¬ê¸° ì¡°ì ˆ 모드ì—ì„œì˜ ì±„ìš°ê¸° 색" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "기본 ì°½ í¬ê¸° ì¡°ì ˆ 모드 시작" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "외곽선 ì°½ í¬ê¸° ì¡°ì ˆ 모드 시작" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "사ê°í˜• ì°½ í¬ê¸° ì¡°ì ˆ 모드 시작" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "잡아당기기 ì°½ í¬ê¸° ì¡°ì ˆ 모드 시작" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "ì°½ í¬ê¸° ì¡°ì ˆ 시작" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "기본 ì°½ í¬ê¸° ì¡°ì ˆ 모드" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "외곽선" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "외곽선 ì°½ í¬ê¸° ì¡°ì ˆ 모드" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "사ê°í˜•" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "사ê°í˜• ì°½ í¬ê¸° ì¡°ì ˆ 모드" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "ì°½ í¬ê¸° ì¡°ì ˆ" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "ì°½ í¬ê¸° ì¡°ì ˆ" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "ì°½ í¬ê¸° ì¡°ì ˆ 시작" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "ì°½ì„ ìž¡ì•„ë‹¹ê²¨ì„œ í¬ê¸°ë¥¼ 조절함" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "í‰ë²”하게 ì°½ í¬ê¸°ë¥¼ 조절함" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "ì™€ê³½ì„ ì„ ì´ìš©í•˜ì—¬ ì°½ í¬ê¸°ë¥¼ 조절함" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "사ê°í˜•ì„ ì´ìš©í•˜ì—¬ ì°½ í¬ê¸°ë¥¼ 조절함" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "잡아당기기" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "잡아당기기 ì°½ í¬ê¸° ì¡°ì ˆ 모드" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "기본 ì°½ í¬ê¸° ì¡°ì ˆ 모드를 사용할 ì°½" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "외곽선 ì°½ ì¡°ì ˆ 모드를 사용할 ì°½" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "사ê°í˜• ì°½ í¬ê¸° ì¡°ì ˆ 모드를 사용할 ì°½" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "잡아당기기 ì°½ í¬ê¸° ì¡°ì ˆ 모드를 사용할 ì°½" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "드래그하여 가장ìžë¦¬ì—서 작업 공간 전환" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "가장ìžë¦¬ì—서 작업 공간 전환" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "마우스 í¬ì¸í„°ë¡œ 가장ìžë¦¬ì—서 작업 공간 전환" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "전환 시간" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "왼쪽 작업 공간으로 전환한 후, í¬ì¸í„° ì´ë™" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "대ìƒì„ 화면 가장ìžë¦¬ë¡œ 드래그 하면 ë‹¤ìŒ ìž‘ì—… 공간으로 전환" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "마우스 í¬ì¸í„°ë¥¼ 화면 가장ìžë¦¬ë¡œ 가져가면 ë‹¤ìŒ ìž‘ì—… 공간으로 전환" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "ì°½ì„ í™”ë©´ 가장ìžë¦¬ë¡œ 드래그하면 ë‹¤ìŒ ìž‘ì—… 공간으로 전환" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "오른쪽 작업 공간으로 전환한 후, í¬ì¸í„° ì´ë™" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "í¬ì¸í„°ì˜ ì´ë™ì„ 가로축으로 반전" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "세로축 반전" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "마우스 í¬ì¸í„° ê°ë„" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "작업 ê³µê°„ì„ ì „í™˜í•  때 ì°½ì„ ì˜¬ë¦¼" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "작업 ê³µê°„ì„ ì „í™˜í•  때 ì°½ì„ ì˜¬ë¦¼" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "í브 회전" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "왼쪽으로 회전" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "오른쪽으로 회전" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "왼쪽으로 회전" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "모든 창과 함께 왼쪽으로 회전" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "오른쪽으로 회전" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "모든 창과 함께 오른쪽으로 회전" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "회전" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "1번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "모든 창과 함께 1번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "10번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "모든 창과 함께 10번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "11번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "모든 창과 함께 11번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "12번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "모든 창과 함께 12번 작업공간으로 회전" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "2번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "모든 창과 함께 2번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "3번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "모든 창과 함께 3번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "4번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "모든 창과 함께 4번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "5번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "모든 창과 함께 5번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "6번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "모든 창과 함께 6번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "7번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "모든 창과 함께 7번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "8번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "모든 창과 함께 8번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "9번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "모든 창과 함께 9번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "í브 회전" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "ë°ìФí¬íƒ‘ í브 회전" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "왼쪽으로 회전" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "활성창과 함께 왼쪽으로 회전" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "오른쪽으로 회전" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "활성창과 함께 오른쪽으로 회전" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "특정 í브 면으로 회전" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "창과 함께 특정 í브 면으로 회전" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "1번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "활성창과 함께 1번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "10번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "활성창과 함께 10번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "11번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "활성창과 함께 11번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "12번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "활성창과 함께 12번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "2번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "활성창과 함께 2번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "3번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "활성창과 함께 3번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "4번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "활성창과 함께 4번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "5번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "활성창과 함께 5번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "6번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "활성창과 함께 6번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "7번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "활성창과 함께 7번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "8번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "활성창과 함께 8번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "9번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "활성창과 함께 9번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "ì°½ 회전" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "창과 함께 회전" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "회전 ê°€ì†" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "회전 ì†ë„" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "회전 시간 간격" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "회전시 확대" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "마우스 í¬ì¸í„° ê°ë„" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "í브 회전시 아랫면으로 잡아당김" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "í브 회전시 윗면으로 잡아당김" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "아랫면으로 잡아당김" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "윗면으로 잡아당김" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "회전 시작" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "작업 ê³µê°„ì„ ì „í™˜í•  ë•Œì˜ ì‹œê°„ 간격" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "확대" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "투명ë„(í¼ì„¼íЏ)" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "í¬ê²Œ" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "버튼으로 ìŠ¤ì¼€ì¼ ëª¨ë“œ 활성화" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "ë²„íŠ¼ì„ ëˆ„ë¥´ë©´ 활성화ë˜ê³  떼면 비활성화ë˜ëŠ” 대신 버튼으로 ìŠ¤ì¼€ì¼ ëª¨ë“œë¥¼ 활성화합니다." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "바탕 í™”ë©´ì„ í´ë¦­í•˜ë©´ 바탕 화면 보기로 전환" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "바탕 í™”ë©´ì„ ì–´ë‘¡ê²Œ" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "ìŠ¤ì¼€ì¼ ëª¨ë“œì¼ ë•Œ, 바탕 í™”ë©´ì„ ì–´ë‘¡ê²Œí•¨" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "ì•„ì´ì½˜" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "ìŠ¤ì¼€ì¼ ëª¨ë“œì¼ ë•Œ, 바탕 í™”ë©´ì„ í´ë¦­í•˜ë©´ 바탕 화면 보기 ìƒíƒœë¡œ 들어가기" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "떠오르는 시간" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "ì°½ 고르기를 시작" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "모든 ì°½ì— ëŒ€í•´ì„œ ì°½ 고르기를 시작" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "ì°½ ê·¸ë£¹ì— ëŒ€í•˜ì—¬ ì°½ 고르기를 시작" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "현재 í™”ë©´ì˜ ì°½ë“¤ì— ëŒ€í•´ ì°½ 고르기를 시작" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "키로 ìŠ¤ì¼€ì¼ ëª¨ë“œ 활성화" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "키를 누르면 활성화ë˜ê³  떼면 비활성화ë˜ëŠ” 대신 키로 ìŠ¤ì¼€ì¼ ëª¨ë“œë¥¼ 활성화합니다." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "모든 ì°½ì„ ë°°ì¹˜í•˜ê³  변형함" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "ì°½ ê·¸ë£¹ì„ ë°°ì¹˜í•˜ê³  변형함" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "ì°½ì„ ë°°ì¹˜í•˜ê³  변형함" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "현재 í™”ë©´ì˜ ì°½ë“¤ì„ ë°°ì¹˜í•˜ê³  변형함" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "모든 ëª¨ë‹ˆí„°ì— ëŒ€í•˜ì—¬" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "현재 ëª¨ë‹ˆí„°ì— ëŒ€í•˜ì—¬" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ì•„ì´ì½˜ ë§ë¶™ì´ê¸°" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "ì°½ì´ ìŠ¤ì¼€ì¼ë  때 ì•„ì´ì½˜ì„ ë§ë¶™ìž„" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "스케ì¼" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "스케ì¼" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "ìŠ¤ì¼€ì¼ ì†ë„" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "ìŠ¤ì¼€ì¼ ì‹œê°„" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "스케ì¼" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "다중 모니터를 사용할 때 ì°½ë“¤ì´ ì–´ë–¤ ëª¨ë‹ˆí„°ì— ìŠ¤ì¼€ì¼ ë ì§€ ì„ íƒí•˜ì„¸ìš”." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "ì°½ 사ì´ì˜ 간격" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "간격" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "마우스가 ìœ„ì— ìžˆì„ ë•Œ, ìŠ¤ì¼€ì¼ ëª¨ë“œê°€ 종료ë˜ëŠ” 시간 (ms 단위)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "ìŠ¤ì¼€ì¼ ëª¨ë“œì¼ ë•Œ 스케ì¼ë˜ì–´ì•¼ 하는 ì°½" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "ì´ í”„ë¡œê·¸ëž¨ì„ ì‚¬ìš©í•˜ì—¬ 스í¬ë¦°ìƒ·ì„ ìžë™ìœ¼ë¡œ 열기" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "디렉토리" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "사ê°í˜• í˜•íƒœì˜ ìŠ¤í¬ë¦°ìƒ·ì„ ì°ìŒ" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "프로그램 실행" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "ì´ ë””ë ‰í† ë¦¬ì— ìŠ¤í¬ë¦°ìƒ·ì„ 저장함" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "스í¬ë¦°ìƒ·" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "스í¬ë¦°ìƒ· 플러그ì¸" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg ì´ë¯¸ì§€ 불러오기" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "ë°ê¸°(í¼ì„¼íЏ)" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "대조(í¼ì„¼íЏ)" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "프로그램 전환" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "ìžë™ìœ¼ë¡œ 회전" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "앞으로 ë„우기" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "ì„ íƒí•œ ì°½ì„ ì•žìœ¼ë¡œ ë„우기" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "ì°½ì„ ì „í™˜í•˜ëŠ” ë™ì•ˆ 바탕 í™”ë©´ì´ ë’¤ë¡œ 물러나는 거리" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "ì•„ì´ì½˜" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "최소화" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "ë‹¤ìŒ íŒ¨ë„" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "ë‹¤ìŒ ì°½" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "ë‹¤ìŒ ì°½(모든 ì°½)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "ë‹¤ìŒ ì°½(전환 ì°½ ì—†ì´)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "전환 ì°½ì´ ì—†ì„ ë•ŒëŠ” 전환 ì°½ì„ ë³´ì´ê³ , ë‹¤ìŒ ì°½ìœ¼ë¡œ 전환" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "전환 ì°½ì´ ì—†ì„ ë•ŒëŠ” 전환 ì°½ì„ ë³´ì´ê³ , 모든 ì°½ 중ì—서 ë‹¤ìŒ ì°½ìœ¼ë¡œ 전환" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "전환 ì°½ì´ ì—†ì„ ë•ŒëŠ” 전환 ì°½ì„ ë³´ì´ê³ , 모든 ì°½ 중ì—서 ì´ì „ 창으로 전환" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "전환 ì°½ì´ ì—†ì„ ë•ŒëŠ” 전환 ì°½ì„ ë³´ì´ê³ , 모든 ì°½ 중ì—서 ì´ì „ 창으로 전환" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "ì´ì „ 패ë„" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "ì´ì „ ì°½" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "ì´ì „ ì°½(모든 ì°½)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "ì´ì „ ì°½(전환 ì°½ ì—†ì´)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "전환하는 ë™ì•ˆ ì„ íƒëœ 창으로 회전" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "ë‹¤ìŒ íŒ¨ë„ íƒ€ìž… ì°½ì„ ì„ íƒí•˜ì„¸ìš”." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "전환 ì°½ì„ ë³´ì—¬ì£¼ì§€ 않고 ë‹¤ìŒ ì°½ìœ¼ë¡œ 전환" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "ì´ì „ íŒ¨ë„ íƒ€ìž… ì°½ì„ ì„ íƒí•©ë‹ˆë‹¤." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "전환 ì°½ì„ ë³´ì—¬ì£¼ì§€ 않고 ë‹¤ìŒ ì°½ìœ¼ë¡œ 전환" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "미리 보기 ì˜†ì— ì•„ì´ì½˜ 표시" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "ìµœì†Œí™”ëœ ì°½ 표시" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "전환 ì†ë„" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "전환 간격" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "ì°½ 전환" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "전환 ì°½ ì•ˆì— í¬í•¨ë  창들" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 색 공간 ì§€ì› ì œê³µ" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "비디오 재ìƒ" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "비디오 재ìƒ" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 색 공간" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "줄 추가" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "ì  ì¶”ê°€" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "다양한 ë°ìФí¬íƒ‘ ë™ìž‘ì— ë¬¼ê²° 효과를 추가함" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "ë¹— 방울들 사ì´ì˜ 시간 간격(ì´ˆ 단위)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "마우스 í¬ì¸í„° 물결 효과 활성화" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "줄" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "여백 í¬ê¸°" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "ì " #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "비 지연 시간" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "제목 ì¶œë ìž„" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "비 내리기" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "비 내리는 효과 켜기" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "와ì´í¼ 켜기" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "와ì´í¼ 효과 켜기" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "물결 효과" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "ë¬¼ê²°ì˜ ì—¬ë°± í¬ê¸°" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "ì°½ 제목 í‘œì‹œì¤„ì— ëŒ€í•œ 물결효과" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "ì´ˆì  íš¨ê³¼" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "ì°½ ì´ˆì  íš¨ê³¼" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "ì°½ ì´ˆì " #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "ì¶©ëŒ" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "ì°½ 잡기" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "ê²©ìž í•´ìƒë„" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "ì°½ 반대로 잡아당기기" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "ì°½ 떨리게 하기" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "ì„ íƒ íš¨ê³¼" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "ì°½ ì„ íƒ íš¨ê³¼" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "ì ìš©ë˜ëŠ” ì°½" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "최대화 효과" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "격ìžì˜ 최소 í¬ê¸°" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "최소 ê²©ìž í¬ê¸°" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "ì°½ ì´ë™" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "떨림" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "반대로 잡아당기기" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "ì°½ 잡아당기기" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "용수철 마찰" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "용수철 K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "용수철 ìƒìˆ˜" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "ì°½ 잡아당기기" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "ì¶œë ê±°ë¦¬ëŠ” 효과를 위해 용수철 ëª¨ë¸ ì‚¬ìš©" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "ê²©ìž í•´ìƒë„" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "ì°½ 활성화시 ì¶œë ê±°ë¦¬ëŠ” 효과" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "ì°½ ì„ íƒì‹œ ì¶œë ê±°ë¦¬ëŠ” 효과" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "ì°½ì„ ì„ íƒí•  때 ì¶œë ê±°ë¦¬ëŠ” 효과" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "ì°½ ì´ë™ì‹œ ì¶œë ê±°ë¦¬ëŠ” 효과" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "ì°½ì„ ìµœëŒ€í™”í•˜ê±°ë‚˜ 해제할 때 ì¶œë ê±°ë¦¬ëŠ” 효과" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "ì°½ ì¶œë ê±°ë¦¼" #~ msgid "Command line 0" #~ msgstr "명령 0" #~ msgid "Run command 0" #~ msgstr "명령 0 실행" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "스í¬ë¦°ìƒ· 명령행" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "스í¬ë¦°ìƒ· 명령행" #~ msgid "Filter Linear" #~ msgstr "선형 í•„í„°" #~ msgid "Use linear filter when zoomed in" #~ msgstr "확대할 때 선형 í•„í„° ì ìš©" #~ msgid "Zoom Desktop" #~ msgstr "ë°ìФí¬íƒ‘ 확대" #~ msgid "Zoom In" #~ msgstr "확대" #~ msgid "Zoom Out" #~ msgstr "축소" #~ msgid "Zoom Pan" #~ msgstr "확대 ì´ë™" #~ msgid "Zoom Speed" #~ msgstr "확대 ì†ë„" #~ msgid "Zoom Timestep" #~ msgstr "확대 시간 간격" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ë°ìФí¬íƒ‘ í브 확대 ì´ë™" #~ msgid "Zoom factor" #~ msgstr "확대율" #~ msgid "Zoom pan" #~ msgstr "확대 ì´ë™" #~ msgid "Decrease window opacity" #~ msgstr "ì°½ íˆ¬ëª…ë„ ì¤„ì´ê¸°" #~ msgid "Increase window opacity" #~ msgstr "ì°½ íˆ¬ëª…ë„ ì¦ê°€" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "기본ì ìœ¼ë¡œ 투명한 ì°½ë“¤ì˜ íˆ¬ëª…ë„ ê°’" #~ msgid "Opacity windows" #~ msgstr "ì°½ 투명ë„" #~ msgid "Background Images" #~ msgstr "ë°°ê²½ 그림" #~ msgid "Background images" #~ msgstr "ë°°ê²½ 그림" #~ msgid "Place windows on a plane" #~ msgstr "ì°½ì„ í‰ë©´ ìœ„ì— ë°°ì¹˜" #~ msgid "Plane Down" #~ msgstr "í™”ë©´ì„ ì•„ëž˜ë¡œ" #~ msgid "Plane Left" #~ msgstr "í™”ë©´ì„ ì™¼ìª½ìœ¼ë¡œ" #~ msgid "Plane Right" #~ msgstr "í™”ë©´ì„ ì˜¤ë¥¸ìª½ìœ¼ë¡œ" #~ msgid "Plane To Face 1" #~ msgstr "í™”ë©´ì„ 1번 작업 공간으로 ì´ë™" #~ msgid "Plane To Face 10" #~ msgstr "í™”ë©´ì„ 10번 작업 공간으로 ì´ë™" #~ msgid "Plane To Face 11" #~ msgstr "í™”ë©´ì„ 11번 작업 공간으로 ì´ë™" #~ msgid "Plane To Face 12" #~ msgstr "í™”ë©´ì„ 12번 작업 공간으로 ì´ë™" #~ msgid "Plane To Face 2" #~ msgstr "í™”ë©´ì„ 2번 작업 공간으로 ì´ë™" #~ msgid "Plane To Face 3" #~ msgstr "í™”ë©´ì„ 3번 작업 공간으로 ì´ë™" #~ msgid "Plane To Face 4" #~ msgstr "í™”ë©´ì„ 4번 작업 공간으로 ì´ë™" #~ msgid "Plane To Face 5" #~ msgstr "í™”ë©´ì„ 5번 작업 공간으로 ì´ë™" #~ msgid "Plane To Face 6" #~ msgstr "í™”ë©´ì„ 6번 작업 공간으로 ì´ë™" #~ msgid "Plane To Face 7" #~ msgstr "í™”ë©´ì„ 7번 작업 공간으로 ì´ë™" #~ msgid "Plane To Face 8" #~ msgstr "í™”ë©´ì„ 8번 작업 공간으로 ì´ë™" #~ msgid "Plane To Face 9" #~ msgstr "í™”ë©´ì„ 9번 작업 공간으로 ì´ë™" #~ msgid "Plane Up" #~ msgstr "í™”ë©´ì„ ìœ„ë¡œ" #~ msgid "Plane down" #~ msgstr "í™”ë©´ì„ ì•„ëž˜ë¡œ" #~ msgid "Plane left" #~ msgstr "í™”ë©´ì„ ì™¼ìª½ìœ¼ë¡œ" #~ msgid "Plane right" #~ msgstr "í™”ë©´ì„ ì˜¤ë¥¸ìª½ìœ¼ë¡œ" #~ msgid "Plane to face 1" #~ msgstr "í™”ë©´ì„ 1번 작업 공간으로 ì´ë™" #~ msgid "Plane to face 10" #~ msgstr "í™”ë©´ì„ 10번 작업 공간으로 ì´ë™" #~ msgid "Plane to face 11" #~ msgstr "í™”ë©´ì„ 11번 작업 공간으로 ì´ë™" #~ msgid "Plane to face 12" #~ msgstr "í™”ë©´ì„ 12번 작업 공간으로 ì´ë™" #~ msgid "Plane to face 2" #~ msgstr "í™”ë©´ì„ 2번 작업 공간으로 ì´ë™" #~ msgid "Plane to face 3" #~ msgstr "í™”ë©´ì„ 3번 작업 공간으로 ì´ë™" #~ msgid "Plane to face 4" #~ msgstr "í™”ë©´ì„ 4번 작업 공간으로 ì´ë™" #~ msgid "Plane to face 5" #~ msgstr "í™”ë©´ì„ 5번 작업 공간으로 ì´ë™" #~ msgid "Plane to face 6" #~ msgstr "í™”ë©´ì„ 6번 작업 공간으로 ì´ë™" #~ msgid "Plane to face 7" #~ msgstr "í™”ë©´ì„ 7번 작업 공간으로 ì´ë™" #~ msgid "Plane to face 8" #~ msgstr "í™”ë©´ì„ 8번 작업 공간으로 ì´ë™" #~ msgid "Plane to face 9" #~ msgstr "í™”ë©´ì„ 9번 작업 공간으로 ì´ë™" #~ msgid "Plane up" #~ msgstr "í™”ë©´ì„ ìœ„ë¡œ" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ë°ìФí¬íƒ‘ ì°½ íˆ¬ëª…ë„ íŽ˜ì´ë“œ 시간" compiz-0.9.11+14.04.20140409/po/zu.po0000644000015301777760000017573112321343002017124 0ustar pbusernogroup00000000000000# Copyright (C) 2007 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the package. # msgid "" msgstr "" "Project-Id-Version: installation\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2006-11-03 14:26\n" "Last-Translator: Novell Language \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Ilungiselela ukuqala..." #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Ilungiselela ukuqala..." #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Ilungiselela ukuqala..." #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Ilungiselela ukuqala..." #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Ilungiselela ukuqala..." #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Ilungiselela ukuqala..." #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Gcina ukuhlela" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Gcina ukuhlela" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Gcina ukuhlela" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Ungakhethi &Lutho" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Ungakhethi &Lutho" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Ukukhethwa Kwekhathalogi" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Amakhomandi:" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Ikhomandi '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Ungakhethi &Lutho" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Ungakhethi &Lutho" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&Vuselela kabusha" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Ilungiselela ukuqala..." #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Amakhomandi:" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Ungakhethi &Lutho" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Ungakhethi &Lutho" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Ukufaka Uhlelo Kuphothuliwe" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Ungakhethi &Lutho" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Ikhomandi '%1'" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Ikhomandi '%1'" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Ungakhethi &Lutho" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Gcina ukuhlela" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Gcina ukuhlela" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Gcina ukuhlela" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Gcina ukuhlela" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Ungakhethi &Lutho" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Ungakhethi &Lutho" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Ilungiselela ukuqala..." #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Ilungiselela ukuqala..." #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Ilungiselela ukuqala..." #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Ilungiselela ukuqala..." #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Ilungiselela ukuqala..." #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Ilungiselela ukuqala..." #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Ilungiselela ukuqala..." #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Ungakhethi &Lutho" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Ungakhethi &Lutho" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Ungakhethi &Lutho" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Ukufaka Uhlelo Kuphothuliwe" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Ukufaka Uhlelo Kuphothuliwe" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Ukufaka Uhlelo Kuphothuliwe" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Ukufaka Uhlelo Kuphothuliwe" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Iqalisa Ukufaka Uhlelo..." #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Ilungiselela ukuqala..." #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Ungakhethi &Lutho" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "Ungakhethi &Lutho" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "&I-Local Directory..." #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Ukukhethwa Kwekhathalogi" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Ilungiselela ukuqala..." #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Ngesikhathi Iqaliswa Kabusha" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "Ungakhethi &Lutho" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Ungakhethi &Lutho" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Ungakhethi &Lutho" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Ungakhethi &Lutho" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Ungakhethi &Lutho" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Ungakhethi &Lutho" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Ngesikhathi Iqaliswa Kabusha" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Ikhomandi '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Ikhomandi '%1'" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Ukufaka Uhlelo Kuphothuliwe" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Ukufaka Uhlelo Kuphothuliwe" #~ msgid "Unknown" #~ msgstr "Akwaziwa" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Gcina ukuhlela" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Ukufaka Uhlelo Kuphothuliwe" compiz-0.9.11+14.04.20140409/po/zh_CN.po0000644000015301777760000035546412321343002017472 0ustar pbusernogroup00000000000000# Compiz chinese translation. # Copyright (C) 2008 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the compiz package. # JING Cheng 2008 # msgid "" msgstr "" "Project-Id-Version: Compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2009-05-16 19:20+0200\n" "Last-Translator: JING Cheng \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "桌é¢" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "窗å£ç®¡ç†" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "æ— " # 此功能完全ä¸èƒ½ç”¨è°ƒæ•´å¤§å°æ¥æè¿°ï¼Œæˆ‘找这个功能找了N久,æ‰å‘现:调整大å°ï¼ = =ï¼› #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "阴影" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "最大化" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "æ°´å¹³æ–¹å‘æœ€å¤§åŒ–" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "åž‚ç›´æ–¹å‘æœ€å¤§åŒ–" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "最å°åŒ–" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "å‡èµ·" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "é™ä¸‹" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "窗å£èœå•" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "é¼ æ ‡æ»šè½®åœ¨çª—å£æ ‡é¢˜æ ä¸Šçš„动作" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "模糊类型" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Metacity主题活动窗å£é€æ˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity 主题活动窗å£ä¸é€æ˜Žé˜´å½±" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacityä¸»é¢˜é€æ˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity主题阴影" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "以Metacity主题为装饰器的活动窗å£ä½¿ç”¨çš„逿˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "metacityä¸»é¢˜è£…é¥°å™¨ä½¿ç”¨çš„é€æ˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "以metacityä¸»é¢˜è£…é¥°å™¨ä¸ºæ´»åŠ¨çª—å£æ·»åР逿˜Žæ¸å˜æ•ˆæžœ" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "以metacityä¸»é¢˜è£…é¥°å™¨ä¸ºçª—å£æ·»åР逿˜Žæ¸å˜æ•ˆæžœ" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "标题æ é¼ æ ‡æ»šè½®åŠ¨ä½œ" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "窗å£è£…饰使用的模糊类型" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "使用metacity主题" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "绘制窗å£è£…饰时使用metacity主题" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "关闭窗å£" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "æ¢å¤çª—å£" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "最大化窗å£" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "最å°åŒ–窗å£" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "置于上é¢" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "粘滞窗å£" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "去除阴影" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "å–æ¶ˆé¡¶ç½®" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "å–æ¶ˆç²˜æ»ž" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "窗å£\"%s\"æ— å“应" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "强制退出此应用程åºå°†å¯¼è‡´ä½ ä¸¢å¤±æœªä¿å­˜çš„æ•°æ®ã€‚" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "强制退出(_F)" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "注解" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "注解填充颜色" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "注解æè¾¹é¢œè‰²" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "注解æ’ä»¶" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "清除" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "绘制" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "使用工具绘制" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "注解使用的填充颜色" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "å¯åЍ" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "å¯åŠ¨æ³¨é‡Šç»˜åˆ¶" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "å¯åŠ¨æ³¨é‡Šæ“¦é™¤" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "å¯åŠ¨æ“¦é™¤" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "线宽" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "注释使用的线æ¡å®½åº¦" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "注释æè¾¹ä½¿ç”¨çš„颜色" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "æè¾¹å®½åº¦" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "注释使用的æè¾¹å®½åº¦" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4å€åŒçº¿æ€§è¿‡æ»¤" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alpha朦胧" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alpha朦胧窗å£" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "朦胧滤镜" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "模糊咬åˆ" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "柔化饱和度" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "柔化速度" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "柔化窗å£" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "柔化åŠé€æ˜Žçª—å£åŽéƒ¨" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "柔化饱和度" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "柔化窗å£" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "对éžå½“å‰çª—å£é‡‡å–柔化" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "ä¸å¯¹å…¶å®ƒçª—å£é®æŒ¡çš„å±å¹•部分进行柔化" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "过滤用于柔化的方法" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "焦点柔化" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "èšç„¦æŸ”化窗å£" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "高斯柔化" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "高斯柔化åŠå¾„" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "高斯柔化力度" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "高斯柔化åŠå¾„" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "高斯柔化力度" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "独立纹ç†å–回" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap细节层次" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "脉冲" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "脉冲效果" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "使用现存的纹ç†å•ä½å°½å¯èƒ½å¤šçš„进行独立纹ç†å–回" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "çª—å£æŸ”化速度" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "应被èšç„¦æŸ”化影å“的窗å£" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "应该默认使用alpha柔化的窗å£" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "克隆输出" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "åˆå§‹åŒ–克隆选å–区域" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "输出克隆处ç†ç¨‹åº" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command0定义的shell命令" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command1定义的shell命令" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command10定义的shell命令" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command11定义的shell命令" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command2定义的shell命令" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command3定义的shell命令" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command4定义的shell命令" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command5定义的shell命令" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command6定义的shell命令" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command7定义的shell命令" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command8定义的shell命令" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command9定义的shell命令" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "一个按钮绑定,调用时将è¿è¡Œç”±command0定义的shell命令" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "一个按键绑定,调用时将è¿è¡Œç”±command1定义的shell命令" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "一个按键绑定,调用时将è¿è¡Œç”±command10定义的shell命令" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "一个按键绑定,调用时将è¿è¡Œç”±command11定义的shell命令" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "一个按键绑定,调用时将è¿è¡Œç”±command2定义的shell命令" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "一个按键绑定,调用时将è¿è¡Œç”±command3定义的shell命令" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "一个按键绑定,调用时将è¿è¡Œç”±command4定义的shell命令" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "一个按键绑定,调用时将è¿è¡Œç”±command5定义的shell命令" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "一个按键绑定,调用时将è¿è¡Œç”±command6定义的shell命令" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "一个按键绑定,调用时将è¿è¡Œç”±command7定义的shell命令" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "一个按键绑定,调用时将è¿è¡Œç”±command8定义的shell命令" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "一个按键绑定,调用时将è¿è¡Œç”±command9定义的shell命令" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "一个边缘绑定,调用时将è¿è¡Œç”±command0定义的shell命令" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "一个边缘绑定,调用时将è¿è¡Œç”±command1定义的shell命令" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "一个边缘绑定,调用时将è¿è¡Œç”±command10定义的shell命令" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "一个边缘绑定,调用时将è¿è¡Œç”±command11定义的shell命令" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "一个边缘绑定,调用时将è¿è¡Œç”±command2定义的shell命令" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "一个边缘绑定,调用时将è¿è¡Œç”±command3定义的shell命令" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "一个边缘绑定,调用时将è¿è¡Œç”±command4定义的shell命令" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "一个边缘绑定,调用时将è¿è¡Œç”±command5定义的shell命令" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "一个边缘绑定,调用时将è¿è¡Œç”±command6定义的shell命令" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "一个边缘绑定,调用时将è¿è¡Œç”±command7定义的shell命令" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "一个边缘绑定,调用时将è¿è¡Œç”±command8定义的shell命令" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "一个边缘绑定,调用时将è¿è¡Œç”±command9定义的shell命令" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "为任æ„命令分é…绑定" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "按钮绑定" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "命令行1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "命令行10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "命令行11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "命令行12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "命令行2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "命令行3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "命令行4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "命令行5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "命令行6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "命令行7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "命令行8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "命令行9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "调用run_command0æ—¶è¦åœ¨shell中执行的命令行" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "调用run_command1æ—¶è¦åœ¨shell中执行的命令行" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "调用run_command10æ—¶è¦åœ¨shell中执行的命令行" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "调用run_command11æ—¶è¦åœ¨shell中执行的命令行" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "调用run_command2æ—¶è¦åœ¨shell中执行的命令行" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "调用run_command3æ—¶è¦åœ¨shell中执行的命令行" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "调用run_command4æ—¶è¦åœ¨shell中执行的命令行" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "调用run_command5æ—¶è¦åœ¨shell中执行的命令行" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "调用run_command6æ—¶è¦åœ¨shell中执行的命令行" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "调用run_command7æ—¶è¦åœ¨shell中执行的命令行" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "调用run_command8æ—¶è¦åœ¨shell中执行的命令行" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "调用run_command9æ—¶è¦åœ¨shell中执行的命令行" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "命令" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "边缘绑定" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "按键绑定" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "è¿è¡Œå‘½ä»¤1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "è¿è¡Œå‘½ä»¤10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "è¿è¡Œå‘½ä»¤11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "è¿è¡Œå‘½ä»¤12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "è¿è¡Œå‘½ä»¤2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "è¿è¡Œå‘½ä»¤3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "è¿è¡Œå‘½ä»¤4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "è¿è¡Œå‘½ä»¤5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "è¿è¡Œå‘½ä»¤6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "è¿è¡Œå‘½ä»¤7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "è¿è¡Œå‘½ä»¤8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "è¿è¡Œå‘½ä»¤9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "活动æ’ä»¶" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "å…许全å±çª—å£çš„绘制ä¸é‡å®šå‘到å±å¹•外的象素映射" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "å¯é—»é“ƒå£°" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "å¯å¬è§çš„系统å“铃" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "自动å‡èµ·" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "自动å‡èµ·å»¶è¿Ÿ" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "自动检测输出设备" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "自动检测刷新率" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "最佳" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "点击èšç„¦" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "点击窗å£å°†è¾“入焦点移至它" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "关闭激活的窗å£" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "默认图标" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "默认窗å£å›¾æ ‡å›¾åƒ" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "桌é¢å°ºå¯¸" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "检测输出" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "检测刷新率" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "显示设置" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "边缘动作执行å‰ï¼Œé¼ æ ‡æŒ‡é’ˆå¿…须置于å±å¹•的一个边缘" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "边缘触å‘延迟" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "快速" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "èšç„¦ä¸Žå‡èµ·è¡Œä¸º" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "ç„¦ç‚¹ä¿æŠ¤çº§åˆ«" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "阻ç¢ç„¦ç‚¹çª—å£" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "阻ç¢ç„¦ç‚¹çª—å£" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "强制独立输出绘图" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "常规选项" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "compiz常规选项" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "好" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "éšè—跳过任务æ çª—å£" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "éšè—所有窗å£å¹¶èšç„¦äºŽæ¡Œé¢" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "è¿›å…¥æ˜¾ç¤ºæ¡Œé¢æ¨¡å¼æ—¶éšè—ä¸åœ¨ä»»åŠ¡æ ä¸­çš„窗å£" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "高" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "水平虚拟尺寸" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "如果å¯èƒ½ï¼Œå¯¹ä»Žå›¾ç‰‡è½¬æ¢æ¥çš„纹ç†è¿›è¡ŒåŽ‹ç¼©" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "最大化时忽略æç¤º" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "æœ€å¤§åŒ–çª—å£æ—¶å¿½ç•¥å°ºå¯¸é€’增和外观æç¤º" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "å‡èµ·æ‰€é€‰çª—å£å‰çš„æ—¶é—´é—´éš”" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "ping消æ¯ä¹‹é—´çš„é—´éš”" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "功能键" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "èšç„¦é¢„防的级别" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "光线" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "当剿´»åŠ¨çš„æ’件列表" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "æè¿°è¾“出设备的字符串列表" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "低" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "é™ä½Žçª—å£" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "将窗å£é™åˆ°å…¶å®ƒçª—å£ä»¥ä¸‹" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "æ°´å¹³æ–¹å‘æœ€å¤§åŒ–窗å£" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "åž‚ç›´æ–¹å‘æœ€å¤§åŒ–窗å£" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "最大化激活的窗å£" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "æ°´å¹³æ–¹å‘æœ€å¤§åŒ–激活的窗å£" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "åž‚ç›´æ–¹å‘æœ€å¤§åŒ–激活的窗å£" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "最å°åŒ–激活的窗å£" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "常规" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "æ¡Œé¢æ•°é‡" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "虚拟桌é¢çš„æ•°é‡" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "关闭" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "åªåœ¨åž‚ç›´æ¸…å±æœŸé—´æ‰§è¡Œå±å¹•æ›´æ–°" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "输出" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "é‡å è¾“出处ç†" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "å•独绘制æ¯ä¸ªè¾“出设备,å³ä¾¿è¾“出设备é‡å¤" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping延迟" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "首选较大的输出" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "首选较å°çš„输出" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "点击时å‡èµ·" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "å‡èµ·çª—å£" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "在间隔一段时间åŽå‡èµ·é€‰ä¸­çª—å£" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "将窗å£å‡èµ·åˆ°å…¶å®ƒçª—å£ä¹‹ä¸Š" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "点击时å‡èµ·çª—å£" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "刷新率" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "æ°´å¹³è™šæ‹Ÿå°ºå¯¸çš„æ”¾å¤§å€æ•°" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "åž‚ç›´è™šæ‹Ÿå°ºå¯¸çš„æ”¾å¤§å€æ•°" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "显示桌é¢" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "慢速动画" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "智能模å¼" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "与VBlankåŒæ­¥" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "纹ç†åŽ‹ç¼©" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "纹ç†è¿‡æ»¤å™¨" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "纹ç†è¿‡æ»¤" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "å±å¹•é‡ç»˜é€Ÿçއ(次/ç§’)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "åˆ‡æ¢æœ€å¤§åŒ–的窗å£" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "å°†çª—å£æ°´å¹³æ–¹å‘切æ¢åˆ°æœ€å¤§åŒ–" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "将窗å£åž‚ç›´æ–¹å‘切æ¢åˆ°æœ€å¤§åŒ–" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "将窗å£åˆ‡æ¢åˆ°é®è”½" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "将激活的窗å£åˆ‡æ¢åˆ°æœ€å¤§åŒ–" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "å°†æ¿€æ´»çš„çª—å£æ°´å¹³æ–¹å‘切æ¢åˆ°æœ€å¤§åŒ–" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "将激活的窗å£åž‚ç›´æ–¹å‘切æ¢åˆ°æœ€å¤§åŒ–" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "将激活的窗å£åˆ‡æ¢åˆ°é®è”½" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "切æ¢ä½¿ç”¨æ…¢é€ŸåŠ¨ç”»" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "æ¢å¤æ¿€æ´»çš„窗å£" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "å–æ¶ˆé‡å®šå‘å…¨å±çª—å£" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "转æ¢å±å¹•时使用漫射光" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "垂直虚拟尺寸" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "很高" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "哪个é‡å è¾“出设备将æˆä¸ºé¦–选" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "窗å£èœå•按钮绑定" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "窗å£èœå•按键绑定" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "加速" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "调整图åƒ" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "调整顶部图åƒä»¥æ—‹è½¬" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "å‰è¿›åˆ°ä¸‹ä¸€ä¸ªæ»‘å—" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "制作动画天穹" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "旋转立方体时制作动画天穹" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "外观" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "自动" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "特性" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "立方体顶é¢å’Œåº•é¢çš„颜色" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "天穹é™è‰²æ¸å˜ä½¿ç”¨çš„底部结æŸé¢œè‰²" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "天穹é™è‰²æ¸å˜ä½¿ç”¨çš„顶部结æŸé¢œè‰²" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "立方体顶盖" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "立方体颜色" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "桌é¢ç«‹æ–¹ä½“" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "折å åŠ é€Ÿ" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "折å é€Ÿåº¦" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "æŠ˜å æ—¶é—´æ­¥é•¿" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "有å¯èƒ½æ—¶ç”Ÿæˆmipmaps用于更高质é‡çš„缩放比例" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "返回上一个滑å—" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "å›¾åƒæ–‡ä»¶" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "用作穹顶纹ç†çš„图åƒ" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "仅当旋转由鼠标驱动时å¯ç”¨ç«‹æ–¹ä½“逿˜Ž" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "立方体内部" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "立方体旋转时使用内部视角" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "应渲染于立方体顶é¢çš„PNGå’ŒSVG文件列表" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "多é‡è¾“出模å¼" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "多个立方体" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "下一个滑å—" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "å•一大立方体" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "旋转时的ä¸é€æ˜Žåº¦" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "䏿—‹è½¬æ—¶çš„ä¸é€æ˜Žåº¦" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "旋转时桌é¢çª—å£çš„ä¸é€æ˜Žåº¦ã€‚" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "䏿—‹è½¬æ—¶æ¡Œé¢çª—å£çš„ä¸é€æ˜Žåº¦ã€‚" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "å°†çª—å£æ”¾ç½®åœ¨ç«‹æ–¹ä½“上" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "上一个滑å—" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "渲染穹顶" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "按比例调整图åƒå¤§å°" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "调整图åƒå¤§å°ä»¥è¦†ç›–立方体的顶é¢" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "选择当使用多个输出设备时立方体的显示方å¼ã€‚" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "天穹" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "天穹æ¸å˜ç»“æŸé¢œè‰²" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "天穹æ¸å˜èµ·å§‹é¢œè‰²" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "天穹图åƒ" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "速度" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "时间步长" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "ä»…å½“ç”¨é¼ æ ‡æ—‹è½¬æ—¶é€æ˜Ž" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "逿˜Žç«‹æ–¹ä½“" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "展开" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "展开立方体" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus控制åŽç«¯" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "å…许为装饰纹ç†ç”Ÿæˆmipmap" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "命令" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "装饰窗å£" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "尚无装饰程åºè¿è¡Œæ—¶æ‰§è¡Œçš„装饰程åºå‘½ä»¤è¡Œ" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "阴影Xåç§»" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "阴影Yåç§»" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "阴影颜色" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "阴影ä¸é€æ˜Žåº¦" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "阴影åŠå¾„" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "阴影颜色" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "阴影Xåç§»" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "阴影Yåç§»" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "阴影ä¸é€æ˜Žåº¦" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "阴影åŠå¾„" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "阴影窗å£" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "窗å£è£…饰" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "窗å£è£…饰" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "应装饰的窗å£" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "应有阴影的窗å£" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "未å“应窗å£çš„亮度(%)" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "æ’定旋转速度" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "æ’定旋转时间" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "暗化无å应窗å£" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "暗化对窗å£ç®¡ç†å™¨è¯·æ±‚æ— å应的窗å£" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "æ¸é𿍡å¼" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "当最å°åŒ–/打开/关闭时æ¸éš" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "æ¸éšé€Ÿåº¦" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "æ¸éšæ—¶é—´" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "äº§ç”Ÿçª—å£æœ€å°åŒ–/打开/关闭事件时使用æ¸éšæ•ˆæžœ" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "系统嘟嘟声时使用æ¸éšæ•ˆæžœ" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "映射时æ¸çŽ°çª—å£å’Œä¸æ˜ å°„æ—¶æ¸å¼±çª—å£" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "æ¸éšçª—å£" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "æ¸éšçª—å£" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "å…¨å±é™éŸ³" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "ç³»ç»Ÿå˜Ÿå˜Ÿå£°çš„å…¨å±æ¸éšæ•ˆæžœ" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "æ— å应窗å£çš„饱和度百分比" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "æ— å应窗å£çš„亮度" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "æ— å应窗å£çš„饱和度" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "视觉振铃" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "çª—å£æ¸é𿍡å¼" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "çª—å£æ¸éšé€Ÿåº¦è®¾äºŽæ’定速度模å¼" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "çª—å£æ¸éšæ—¶é—´ï¼ˆç§’ï¼‰è®¾äºŽæ’定时间模å¼" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "应æ¸éšçš„窗å£" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "挂载点" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "挂载点" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "用户空间文件系统" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "用户空间文件系统" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf控制åŽç«¯" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib主循环支æŒ" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome兼容性" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "打开一个终端窗å£" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "使Compiz兼容Gnome桌é¢çŽ¯å¢ƒçš„é€‰é¡¹" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "è¿è¡Œå¯¹è¯æ¡†" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "è¿è¡Œç»ˆç«¯å‘½ä»¤" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "截å±å‘½ä»¤è¡Œ" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "显示主èœå•" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "显示è¿è¡Œåº”用程åºå¯¹è¯æ¡†" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "显示主èœå•" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "æ‹æ‘„截å±" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "æ‹æ‘„çª—å£æˆªå±" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "终端命令行" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "çª—å£æˆªå±å‘½ä»¤è¡Œ" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "ini纯文本åŽç«¯" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "文件修改通知æ’ä»¶" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig控制åŽç«¯" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "最å°åŒ–效果" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "最å°åŒ–窗å£" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "最å°åŒ–速度" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "最å°åŒ–时间步长" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "抗é®è”½æ€§" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "抗é®è”½æ€§" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "最å°åŒ–å’Œå–æ¶ˆæœ€å°åŒ–æ—¶å˜å½¢çª—å£" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "最å°åŒ–时应å˜å½¢çš„窗å£" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "çº¦æŸ Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "约æŸå·¥ä½œç©ºé—´åŒºåŸŸçš„ Y åæ ‡" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "结æŸç§»åЍå‰ä¸æ›´æ–°æœåŠ¡ç«¯çš„ä½ç½®ä¿¡æ¯" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "å¯åŠ¨çª—å£ç§»åЍ" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "懒惰定ä½" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "移动窗å£" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "移动窗å£" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "ä¸é€æ˜Žåº¦" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "移动窗å£çš„ä¸é€æ˜Žåº¦" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "æ‹–åŠ¨æ—¶åˆ é™¤å¿«ç…§å¹¶è‡ªåŠ¨å–æ¶ˆçª—å£çš„æœ€å¤§åŒ–" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "删除最大化窗å£å¿«ç…§" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "开始移动窗å£" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "亮度" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "调低亮度" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "调高亮度" # ä¸éœ€è¦ç”¨â€œäº®åº¦è°ƒæ•´æ­¥å¹…â€å§ï¼Ÿ #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "调整步幅" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "窗å£äº®åº¦" # 调低ä¸é€æ˜Žåº¦ï¼Ÿ #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "å‡å°‘" # 增加ä¸é€æ˜Žåº¦åº”该翻æˆå‡å°‘逿˜Žåº¦æ‰ç¬¦åˆä¸­æ–‡è¯­è¨€ä¹ æƒ¯ #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "增加" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "å¢žåŠ é€æ˜Žåº¦" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "å‡å°‘逿˜Žåº¦" # (ä¸ï¼‰é€æ˜Žåº¦è°ƒæ•´æ­¥å¹… #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "ä¸é€æ˜Žåº¦æ­¥é•¿" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "窗å£çš„ä¸é€æ˜Žåº¦æ•°å€¼" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "ä¸é€æ˜Žåº¦ã€äº®åº¦ä¸Žé¥±å’Œåº¦" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "调整ä¸é€æ˜Žåº¦ã€äº®åº¦å’Œé¥±å’Œåº¦" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "饱和度" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "å‡å°‘饱和度" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "增加饱和度" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "饱和度步长" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "窗å£çš„饱和度数值" # 饱和度调整步幅 #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "调整步长" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "窗å£ç›¸å…³è®¾ç½®" # 都特例窗å£è®¾ç½®çš„特殊饱和度数值 #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "窗å£å€¼" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "窗å£" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "默认使用å¦ä¸€äº®åº¦è®¾ç½®çš„窗å£" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "默认使用å¦ä¸€ä¸é€æ˜Žåº¦è®¾ç½®çš„窗å£" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "默认使用å¦ä¸€é¥±å’Œåº¦çš„窗å£" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "æ”¾ç½®çª—å£æ‰€ç”¨çš„算法" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "层å " #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "居中" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "å›ºå®šçª—å£æ”¾ç½®" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "å¼ºåˆ¶çª—å£æ”¾ç½®" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "水平视图ä½ç½®" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "ä¿æŒåœ¨å·¥ä½œåŒº" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "ä¿æŒè®¾ç½®çš„窗å£åœ¨å·¥ä½œåŒºï¼Œç”šè‡³ä½ç½®å¯èƒ½ä¸åŒäºŽé‚£ç‰¹åˆ«ä½ç½®ã€‚" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "放置窗å£" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "跨越所有输出放置" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "æ˜ å°„æ—¶å°†çª—å£æ”¾ç½®åœ¨é€‚当ä½ç½®" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "安置模å¼" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "已定ä½çš„窗å£" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "éšæœº" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "选择当选用了多é‡è¾“å‡ºæ—¶çª—å£æ”¾ç½®çš„行为" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "çµå·§" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "使用当å‰è¾“出设备" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "使用当å‰çª—å£çš„输出设备" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "使用指针所指的输出设备" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "垂直视图ä½ç½®" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "视图中的定ä½çª—å£" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "çª—å£æ”¾ç½®å·¥ä½œåŒº" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "默认应定ä½çš„窗å£" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "指定视图中默认应定ä½çš„窗å£" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "å³ä¾¿å‘窗å£ç®¡ç†å™¨æå‡ºé¿å…放置的请求,ä»åº”强制放置的窗å£" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "ä½ç½®å›ºå®šçš„窗å£" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "视å£å›ºå®šçš„窗å£" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "工作区" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Xä½ç½®" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X视图ä½ç½®" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Xä½ç½®å–值" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Yä½ç½®" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y视图ä½ç½®" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Yä½ç½®å–值" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png图åƒåŠ è½½å·¥å…·" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "正则表达å¼åŒ¹é…" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "正则表达å¼çš„窗å£åŒ¹é…" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "绑定" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "边框颜色" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "用于æè¾¹å’ŒçŸ©å½¢å¤§å°è°ƒæ•´æ¨¡å¼çš„边颜色" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "默认大å°è°ƒæ•´æ¨¡å¼" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "窗å£å¤§å°è°ƒæ•´çš„默认模å¼" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "填充颜色" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "用于矩形大å°è°ƒæ•´æ¨¡å¼çš„填充颜色" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "åˆå§‹æ™®é€šçª—å£å¤§å°è°ƒæ•´" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "åˆå§‹åŒ–窗å£å°ºå¯¸è°ƒæ•´è½®å»“" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "åˆå§‹åŒ–窗å£å°ºå¯¸è°ƒæ•´çŸ©å½¢" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "å¯åŠ¨çª—å£æ‹‰ä¼¸è°ƒæ•´å¤§å°" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "å¯åŠ¨çª—å£å¤§å°è°ƒæ•´" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "普通窗å£å¤§å°è°ƒæ•´" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "轮廓" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "窗å£å¤–框大å°è°ƒæ•´" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "矩形" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "矩形窗å£å¤§å°è°ƒæ•´" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "调整窗å£å¤§å°" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "调整窗å£å¤§å°" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "开始调整窗å£å¤§å°" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "用拉伸调整窗å£å¤§å°" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "开始如常调整窗å£å¤§å°" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "开始以轮廓调整窗å£å¤§å°" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "开始以矩形调整窗å£å¤§å°" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "拉伸" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "拉伸调整窗å£å¤§å°" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "正常调整大å°çš„窗å£" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "框架调整大å°çš„窗å£" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "矩形调整大å°çš„窗å£" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "拉伸调整大å°çš„窗å£" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD边缘翻转" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "移动边缘翻转" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "指针边缘翻转" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "翻转时间" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "翻转至左视点并弯曲指针" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "将对象拖至å±å¹•边缘时翻转到下个视点" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "将指针移至å±å¹•边缘时翻转到下个视点" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "将窗å£ç§»è‡³å±å¹•边缘时翻转到下个视点" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "翻转至å³è§†ç‚¹å¹¶å¼¯æ›²æŒ‡é’ˆ" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "指针移动时å转Yè½´" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "指针å转Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "æŒ‡é’ˆçµæ•度" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "旋转时å‡èµ·" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "旋转时å‡èµ·çª—å£" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "旋转立方体" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "旋转左翻" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "旋转å³ç¿»" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "å‘左旋转" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "带ç€çª—å£å‘左旋转" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "å‘峿—‹è½¬" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "带ç€çª—å£å‘峿—‹è½¬" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "旋转至" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "旋转至第1é¢" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "带ç€çª—壿—‹è½¬è‡³ç¬¬1é¢" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "旋转至第10é¢" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "带ç€çª—壿—‹è½¬è‡³ç¬¬10é¢" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "旋转至第11é¢" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "带ç€çª—壿—‹è½¬è‡³ç¬¬11é¢" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "旋转至第12é¢" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "带ç€çª—壿—‹è½¬è‡³ç¬¬12é¢" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "旋转至第2é¢" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "带ç€çª—壿—‹è½¬è‡³ç¬¬2é¢" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "旋转至第3é¢" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "带ç€çª—壿—‹è½¬è‡³ç¬¬3é¢" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "旋转至第4é¢" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "带ç€çª—壿—‹è½¬è‡³ç¬¬4é¢" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "旋转至第5é¢" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "带ç€çª—壿—‹è½¬è‡³ç¬¬5é¢" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "旋转至第6é¢" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "带ç€çª—壿—‹è½¬è‡³ç¬¬6é¢" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "旋转至第7é¢" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "带ç€çª—壿—‹è½¬è‡³ç¬¬7é¢" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "旋转至第8é¢" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "带ç€çª—壿—‹è½¬è‡³ç¬¬8é¢" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "旋转至第9é¢" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "带ç€çª—壿—‹è½¬è‡³ç¬¬9é¢" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "旋转立方体" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "旋转桌é¢ç«‹æ–¹ä½“" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "å‘左旋转" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·å‘左旋转" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "å‘峿—‹è½¬" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·å‘峿—‹è½¬" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "旋转至立方体表é¢" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "å¸¦çª—å£æ—‹è½¬è‡³ç«‹æ–¹ä½“表é¢" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "旋转至第1é¢" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·æ—‹è½¬è‡³ç¬¬1é¢" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "旋转至第10é¢" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·æ—‹è½¬è‡³ç¬¬10é¢" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "旋转至第11é¢" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·æ—‹è½¬è‡³ç¬¬11é¢" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "旋转至第12é¢" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·æ—‹è½¬è‡³ç¬¬12é¢" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "旋转至第2é¢" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·æ—‹è½¬è‡³ç¬¬2é¢" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "旋转至第3é¢" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·æ—‹è½¬è‡³ç¬¬3é¢" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "旋转至第4é¢" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·æ—‹è½¬è‡³ç¬¬4é¢" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "旋转至第5é¢" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·æ—‹è½¬è‡³ç¬¬5é¢" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "旋转至第6é¢" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·æ—‹è½¬è‡³ç¬¬6é¢" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "旋转至第7é¢" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·æ—‹è½¬è‡³ç¬¬7é¢" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "旋转至第8é¢" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·æ—‹è½¬è‡³ç¬¬8é¢" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "旋转至第9é¢" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "å¸¦ç€æ¿€æ´»çš„窗å£ä¸€èµ·æ—‹è½¬è‡³ç¬¬9é¢" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "旋转至视点" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "旋转窗å£" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "å¸¦çª—å£æ—‹è½¬" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "旋转加速" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "旋转速度" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "旋转时间步长" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "旋转缩放" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "æŒ‡é’ˆç§»åŠ¨çµæ•度" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "将立方体快速旋转到底é¢" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "将立方体快速旋转到顶é¢" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "瞬移至底é¢" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "瞬移至顶é¢" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "开始旋转" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "翻转视点å‰çš„è¶…æ—¶æ—¶é—´" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "缩放" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "ä¸é€æ˜Žåº¦ç™¾åˆ†æ¯”" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "大" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "ç”±æŒ‰é”®ç»‘å®šè§¦å‘æ¯”例模å¼" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "ç”±æŒ‰é”®ç»‘å®šè§¦å‘æ¯”例模å¼ï¼Œè€Œä¸æ˜¯æŒ‰ä¸‹æ—¶å¯ç”¨ä¹‹æ¾å¼€æ—¶ç¦ç”¨ä¹‹ã€‚" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "点击桌é¢ä»¥æ˜¾ç¤ºæ¡Œé¢" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "èƒŒæ™¯å˜æš—" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "调整窗å£å¤§å°æ—¶èƒŒæ™¯å˜æš—" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "标志" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "在缩放时,点击桌é¢ä¼šè¿›å…¥æ˜¾ç¤ºæ¡Œé¢æ¨¡å¼" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "æ‚¬åœæ—¶é—´" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "å¯åŠ¨çª—å£æ£€å‡ºå™¨" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "å¯åŠ¨æ‰€æœ‰çª—å£çš„çª—å£æ‹¾å–器" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "å¯åŠ¨çª—å£ç»„çš„çª—å£æ‹¾å–器" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "å¯åЍ当å‰è¾“出窗å£çš„çª—å£æ‹¾å–器" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "ç”±æŒ‰é”®ç»‘å®šè§¦å‘æ¯”例模å¼" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "ç”±æŒ‰é”®ç»‘å®šè§¦å‘æ¯”例模å¼ï¼Œè€Œä¸æ˜¯æŒ‰ä¸‹æ—¶å¯ç”¨ä¹‹æ¾å¼€æ—¶ç¦ç”¨ä¹‹ã€‚" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "对所有窗å£è°ƒæ•´å¸ƒå±€å¹¶å¼€å§‹è½¬æ¢" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "对窗å£ç»„调整布局并开始转æ¢" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "布局和开始转æ¢çª—å£" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "对当å‰è¾“出窗å£è°ƒæ•´å¸ƒå±€å¹¶å¼€å§‹è½¬æ¢" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "在所有输出设备上" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "在当å‰è¾“出设备上" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "覆盖图标" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "ç¼©æ”¾çª—å£æ—¶è¦†ç›–图标" # 此功能完全ä¸èƒ½ç”¨è°ƒæ•´å¤§å°æ¥æè¿°ï¼Œæˆ‘找这个功能找了N久,æ‰å‘现:调整大å°ï¼ = =ï¼› #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "缩放" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "窗å£ç¼©æ”¾" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "缩放速度" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "缩放时间步长" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "窗å£ç¼©æ”¾" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "在使用了多é‡è¾“出设备的情况下选择何处窗å£ç¼©æ”¾" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "窗å£ä¹‹é—´çš„é—´éš”" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "é—´è·" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "悬åœåœ¨çª—å£ä¸Šæ—¶æ¯”例模å¼ç»ˆæ­¢å‰çš„æ—¶é—´(毫秒)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "缩放模å¼ä¸‹åº”缩放的窗å£ç±»åž‹" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "在该应用程åºä¸­è‡ªåЍ开坿ˆªå±" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "目录" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "å¯åŠ¨çŸ©å½¢æˆªå±" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "å¯åŠ¨åº”ç”¨ç¨‹åº" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "ä¿å­˜æˆªå±å›¾ç‰‡åˆ°æ­¤ç›®å½•" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "截å±" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "æˆªå±æ’ä»¶" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg图åƒåŠ è½½å·¥å…·" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "亮度百分比" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "饱和度百分比" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "应用程åºåˆ‡æ¢æ¡" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "自动旋转" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "ç½®å‰" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "å°†é€‰ä¸­çš„çª—å£æ”¾åœ¨å‰é¢" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "切æ¢çª—壿—¶åº”缩å°è¿œè·ç¦»æ¡Œé¢" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "图标" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "最å°åŒ–" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "ä¸‹ä¸€ä¸ªé¢æ¿" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "下一个窗å£" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "下一个窗å£(所有)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "下一个窗å£(éžå¼¹å‡º)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "ä¸å¯è§æ—¶å¼¹å‡ºåˆ‡æ¢ç¨‹åºå¹¶é€‰æ‹©ä¸‹ä¸€ä¸ªçª—å£" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "ä¸å¯è§æ—¶å¼¹å‡ºåˆ‡æ¢ç¨‹åºå¹¶é€‰æ‹©æ‰€æœ‰çª—å£çš„下一个窗å£" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "ä¸å¯è§æ—¶å¼¹å‡ºåˆ‡æ¢ç¨‹åºå¹¶é€‰æ‹©ä¸Šä¸€ä¸ªçª—å£" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "ä¸å¯è§æ—¶å¼¹å‡ºåˆ‡æ¢ç¨‹åºå¹¶é€‰æ‹©æ‰€æœ‰çª—å£çš„上一个窗å£" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "ä¸Šä¸€ä¸ªé¢æ¿" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "上一个窗å£" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "上一个窗å£(全部窗å£)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "上一个窗å£(éžå¼¹å‡º)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "åˆ‡æ¢æ—¶è½¬åˆ°æ‰€é€‰çª—å£" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "é€‰æ‹©ä¸‹ä¸€ä¸ªé¢æ¿ç±»åž‹çª—å£ã€‚" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "选å–下一个窗å£ï¼Œä¸”排除显示弹出窗å£ã€‚" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "选择å‰ä¸€ä¸ªé¢æ¿ç±»åž‹çª—å£ã€‚" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "选å–下一个窗å£ï¼Œä¸”排除显示弹出窗å£ã€‚" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "在缩略图æ—边显示图标" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "显示最å°åŒ–的窗å£" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "切æ¢ç¨‹åºé€Ÿåº¦" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "切æ¢ç¨‹åºæ—¶é—´åŒºé—´" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "切æ¢ç¨‹åºçª—å£" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "切æ¢ç¨‹åºä¸­åº”显示的窗å£" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "æä¾›YV12色彩空间支æŒ" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "视频回放" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "视频回放" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12色彩空间" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "增加线" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "增加点" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "将水纹效果添加到ä¸åŒçš„æ¡Œé¢æ“作" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "æ¯æ¬¡é™é›¨æ•ˆæžœä¹‹é—´çš„å»¶æ—¶(以毫秒为å•ä½)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "å¯ç”¨æŒ‡é’ˆæ°´çº¹æ•ˆæžœ" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "线" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "å移比例" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "点" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "é™é›¨å»¶æ—¶" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "波浪标题" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "触å‘é™é›¨" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "触å‘é™é›¨æ•ˆæžœ" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "触å‘雨刷" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "触å‘雨刷效果" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "水纹效果" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "水纹å移比例" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "çª—å£æ ‡é¢˜çš„æ³¢æµªæ•ˆæžœ" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "èšç„¦æ•ˆæžœ" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "èšç„¦çª—壿•ˆæžœ" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "èšç„¦çª—å£" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "摩擦力" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "æ•æ‰çª—å£" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "网格分辨率" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "åå‘窗å£å¸é™„" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "使窗å£å‡ºçŽ°ç¢Žè£‚æ•ˆæžœ" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "映射效果" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "æ˜ å°„çª—å£æ•ˆæžœ" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "映射窗å£" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "最大化效果" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "网格最å°å°ºå¯¸" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "最å°é¡¶ç‚¹ç½‘格大å°" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "移动窗å£" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "碎裂" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "åå‘å¸é™„" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "窗å£å¸é™„" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "弹性摩擦力" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "弹性K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "弹簧常数" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "切æ¢çª—å£å¸é™„" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "å¯¹éœ‡é¢¤çª—å£æ•ˆæžœä½¿ç”¨å¼¹æ€§æ¨¡åž‹" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "顶点网格分辨率" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "èšç„¦æ—¶åº”采用震颤效果的窗å£" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "æ•æ‰æ—¶åº”采用震颤效果的窗å£" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "映射时应采用震颤效果的窗å£" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "移动时应采用震颤效果的窗å£" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "æœ€å¤§åŒ–å’Œå–æ¶ˆæœ€å¤§åŒ–çª—å£æ—¶çš„震颤效果" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "震颤窗å£" #~ msgid "Command line 0" #~ msgstr "命令行0" #~ msgid "Run command 0" #~ msgstr "è¿è¡Œå‘½ä»¤0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "截å±å‘½ä»¤è¡Œ" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "截å±å‘½ä»¤è¡Œ" #~ msgid "Filter Linear" #~ msgstr "线性过滤器" #~ msgid "Use linear filter when zoomed in" #~ msgstr "放大时使用线性过滤器" #~ msgid "Zoom Desktop" #~ msgstr "缩放桌é¢" #~ msgid "Zoom In" #~ msgstr "放大" #~ msgid "Zoom Out" #~ msgstr "缩å°" #~ msgid "Zoom Pan" #~ msgstr "缩放盘" #~ msgid "Zoom Speed" #~ msgstr "缩放速度" #~ msgid "Zoom Timestep" #~ msgstr "缩放时间区间" #~ msgid "Zoom and pan desktop cube" #~ msgstr "缩放和桌é¢ç«‹æ–¹ä½“" #~ msgid "Zoom factor" #~ msgstr "缩放比例" #~ msgid "Zoom pan" #~ msgstr "缩放盘" #~ msgid "Decrease window opacity" #~ msgstr "增加窗å£é€æ˜Žåº¦" # 增加ä¸é€æ˜Žåº¦åº”该翻æˆå‡å°‘逿˜Žåº¦æ‰ç¬¦åˆä¸­æ–‡è¯­è¨€ä¹ æƒ¯ #~ msgid "Increase window opacity" #~ msgstr "å‡å°‘窗å£é€æ˜Žåº¦" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "默认为åŠé€æ˜Žçš„窗å£çš„ä¸é€æ˜Žåº¦" #~ msgid "Opacity window values" #~ msgstr "ä¸é€æ˜Žçª—å£å€¼" #~ msgid "Opacity windows" #~ msgstr "ä¸é€æ˜Žçª—å£" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "å°†çª—å£æ”¾ç½®åœ¨ç«‹æ–¹ä½“上" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Page Down" #, fuzzy #~ msgid "Plane Left" #~ msgstr "逆时针旋转" #, fuzzy #~ msgid "Plane Right" #~ msgstr "顺时针旋转" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Page Up" #, fuzzy #~ msgid "Plane down" #~ msgstr "放置窗å£" #, fuzzy #~ msgid "Plane left" #~ msgstr "逆时针旋转" #, fuzzy #~ msgid "Plane right" #~ msgstr "顺时针旋转" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane up" #~ msgstr "Page Up" #~ msgid "Open window menu" #~ msgstr "打开窗å£èœå•" #~ msgid "Dock" #~ msgstr "頿ޥ" #~ msgid "Toolbar" #~ msgstr "工具æ " #~ msgid "Menu" #~ msgstr "èœå•" #~ msgid "Utility" #~ msgstr "实用程åº" #~ msgid "Splash" #~ msgstr "Splash" #~ msgid "Dialog" #~ msgstr "å¯¹è¯æ¡†" #~ msgid "DropdownMenu" #~ msgstr "下拉èœå•" #~ msgid "PopupMenu" #~ msgstr "弹出èœå•" #~ msgid "Tooltip" #~ msgstr "工具æç¤º" #~ msgid "Notification" #~ msgstr "通知" #~ msgid "Combo" #~ msgstr "组åˆ" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "模å¼å¯¹è¯æ¡†" #~ msgid "Fullscreen" #~ msgstr "å…¨å±" #~ msgid "Unknown" #~ msgstr "未知" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将è¿è¡Œ command10 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将è¿è¡Œ command1 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将è¿è¡Œ command10 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将è¿è¡Œ command11 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将è¿è¡Œ command2 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将è¿è¡Œ command3 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将è¿è¡Œ command4 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将è¿è¡Œ command5 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将è¿è¡Œ command6 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将è¿è¡Œ command7 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将è¿è¡Œ command8 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将è¿è¡Œ command9 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "Add line (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Add point (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Advance to next slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "亮度百分比" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "ä¸é€æ˜Žåº¦ç™¾åˆ†æ¯”" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "饱和度百分比" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "饱和度" #, fuzzy #~ msgid "" #~ "Clear (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Close active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Decrease window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "æ¯æ¬¡é™é›¨æ•ˆæžœä¹‹é—´çš„延时(以毫秒为å•ä½ï¼‰" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "切æ¢çª—壿—¶åº”缩å°è¿œè·ç¦»æ¡Œé¢" #~ msgid "Do not modify" #~ msgstr "ä¸ä¿®æ”¹" #, fuzzy #~ msgid "" #~ "Draw using tool (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "å‡å°é˜´å½± X åç§»" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "å‡å°é˜´å½± Y åç§»" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "å‡å°é˜´å½±ä¸é€æ˜Žåº¦" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "å‡å°é˜´å½±åŠå¾„" #, fuzzy #~ msgid "" #~ "Enable pointer water effects (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Flip to left viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Flip to right viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "èšç„¦çª—壿•ˆæžœï¼ˆæ— ï¼Œç¢Žè£‚)" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "选择上一个窗å£" #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "折å åŠ é€Ÿ (1.0-20.0)" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "折å é€Ÿåº¦ (0.1-50.0)" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "æŠ˜å æ—¶é—´æ®µè½ (0.1-50.0)" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "ä¿„è”邦" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "俄语" #, fuzzy #~ msgid "" #~ "Go back to previous slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Hide all windows and focus desktop (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Increase window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate annotate drawing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate annotate erasing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate clone selection (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate rectangle screenshot (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "ä¸Šå‡æ‰€é€‰çª—å£å‰çš„æ—¶é—´é—´éš”" #, fuzzy #~ msgid "" #~ "Layout and start transforming all windows (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Layout and start transforming window group (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "对当å‰è¾“出窗å£è°ƒæ•´å¸ƒå±€å¹¶å¼€å§‹è½¬æ¢" #, fuzzy #~ msgid "" #~ "Lower window beneath other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Make window shiver (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "å›¾çª—å£æ•ˆæžœï¼ˆæ— ï¼Œç¢Žè£‚)" #, fuzzy #~ msgid "" #~ "Maximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Maximize active window horizontally (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Maximize active window vertically (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Minimize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "最å°åŒ–速度 (0.1-50.0)" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "最å°åŒ–速度 (0.1-50.0)" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "最å°é¡¶ç‚¹æ …格大å°" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "è™šæ‹Ÿæ¡Œé¢æ•°" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "ä¸é€æ˜Žåº¦æ›´æ”¹çº§åˆ«" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "移动窗å£çš„ä¸é€æ˜Žåº¦" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "移动窗å£çš„ä¸é€æ˜Žåº¦" #, fuzzy #~ msgid "" #~ "Open a terminal (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Open window menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "ç¼©æ”¾çª—å£æ—¶è¦†ç›–图标" #, fuzzy #~ msgid "" #~ "Plane down (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane up (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgid "Plugins that this must load before" #~ msgstr "必须先装载的æ’ä»¶" #~ msgid "Plugins that this requires" #~ msgstr "需è¦çš„æ’ä»¶" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "ä¸å¯è§æ—¶å¼¹å‡ºåˆ‡æ¢ç¨‹åºå¹¶é€‰æ‹©æ‰€æœ‰çª—å£çš„下一个窗å£" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "ä¸å¯è§æ—¶å¼¹å‡ºåˆ‡æ¢ç¨‹åºå¹¶é€‰æ‹©æ‰€æœ‰çª—å£çš„下一个窗å£" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "ä¸å¯è§æ—¶å¼¹å‡ºåˆ‡æ¢ç¨‹åºå¹¶é€‰æ‹©æ‰€æœ‰çª—å£çš„上一个窗å£" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "ä¸å¯è§æ—¶å¼¹å‡ºåˆ‡æ¢ç¨‹åºå¹¶é€‰æ‹©æ‰€æœ‰çª—å£çš„上一个窗å£" #, fuzzy #~ msgid "" #~ "Pulse effect (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Raise window above other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate left and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate right and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to viewport (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate with window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "折å åŠ é€Ÿ (1.0-20.0)" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "缩放速度 (0.1-50.0)" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "缩放时间区间 (0.1-50.0)" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "调整大å°é€Ÿåº¦ (0.1-50.0)" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "è°ƒæ•´å¤§å°æ—¶é—´æ®µè½ (0.1-50.0)" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "用于水平虚拟大å°çš„å±å¹•大å°å€å¢žå™¨" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "用于垂直虚拟大å°çš„å±å¹•大å°å€å¢žå™¨" #, fuzzy #~ msgid "" #~ "Select next window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Select previous window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "æŒ‡é’ˆç§»åŠ¨çµæ•度" #~ msgid "Shade resistance (0-100)" #~ msgstr "抗é®è”½æ€§ï¼ˆ0-100)" #, fuzzy #~ msgid "" #~ "Show Run Application dialog (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Show the main menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "窗å£ä¹‹é—´çš„é—´éš”" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "弹簧摩擦力" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "弹簧常数" #, fuzzy #~ msgid "" #~ "Start Rotation (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Start moving window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Start resizing window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "调整大å°é€Ÿåº¦ (0.1-50.0)" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "è°ƒæ•´å¤§å°æ—¶é—´æ®µè½ (0.1-50.0)" #, fuzzy #~ msgid "" #~ "Take a screenshot (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Take a screenshot of a window (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "纹ç†è¿‡æ»¤ï¼ˆå¿«é€Ÿã€å¥½ã€æœ€ä½³ï¼‰" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "å±å¹•刷新速率(次/秒)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "悬åœåœ¨çª—å£ä¸Šæ—¶æ¯”例模å¼ç»ˆæ­¢å‰çš„æ—¶é—´ï¼ˆä»¥æ¯«ç§’为)" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "翻转å点之å‰å‘生超时" #, fuzzy #~ msgid "" #~ "Toggle active window maximized (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized horizontally (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized vertically (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle active window shaded (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle rain effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle use of slow animations (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle window snapping (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle wiper effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgid "USe linear filter when zoomed in" #~ msgstr "放大时使用线性过滤器" #, fuzzy #~ msgid "" #~ "Unfold cube (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Unmaximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "顶点栅格分辨率" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "水纹å移比例" #, fuzzy #~ msgid "" #~ "Wave effect from window title (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "çª—å£æ¸å¼±é€Ÿåº¦" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "çª—å£æ¸å¼±é€Ÿåº¦" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "应æ¸å¼±çš„窗å£ç±»åž‹" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "应æ¸å¼±çš„窗å£ç±»åž‹" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "应æ¸å¼±çš„窗å£ç±»åž‹" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "应æ¸å¼±çš„窗å£ç±»åž‹" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "比例模å¼ä¸‹åº”缩放的窗å£ç±»åž‹" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "切æ¢ç¨‹åºä¸­åº”显示的窗å£ç±»åž‹" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "最å°åŒ–时应转æ¢çš„窗å£ç±»åž‹" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "应æ¸å¼±çš„窗å£ç±»åž‹" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "èšç„¦æ—¶åº”采用颤动效果的窗å£ç±»åž‹" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "æ•æ‰æ—¶åº”采用颤动效果的窗å£ç±»åž‹" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "映射时应采用颤动效果的窗å£ç±»åž‹" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "移动时应采用颤动效果的窗å£ç±»åž‹" #, fuzzy #~ msgid "" #~ "Zoom In (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Zoom Out (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应å¯åŠ¨æ¯”ä¾‹æ¨¡å¼çš„热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "缩放速度 (0.1-50.0)" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "缩放时间区间 (0.1-50.0)" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "缩放比例" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "旋转到第 %d é¢" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "旋转到带窗å£çš„第 %d é¢" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "旋转到第 %d é¢å¹¶æ˜¾ç¤ºæ´»åŠ¨çª—å£" #~ msgid "Rotate To Face %d" #~ msgstr "旋转到第 %d é¢" #~ msgid "Rotate to face %d" #~ msgstr "旋转到第 %d é¢" #~ msgid "Rotate To Face %d with Window" #~ msgstr "旋转到带窗å£çš„第 %d é¢" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "旋转到第 %d é¢å¹¶æ˜¾ç¤ºæ´»åŠ¨çª—å£" #~ msgid "Command line %d" #~ msgstr "命令行 %d" #~ msgid "Command line to be executed in shell when run_command%d is invoked" #~ msgstr "调用 run_command%d 时在壳层中执行的命令行" #~ msgid "Run command %d" #~ msgstr "è¿è¡Œå‘½ä»¤ %d" #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command%d" #~ msgstr "调用时将è¿è¡Œç”±å‘½ä»¤ %d 确定的壳层命令的键è”结" #~ msgid "Move Window Types" #~ msgstr "移动窗å£ç±»åž‹" #~ msgid "Corners" #~ msgstr "è§’" #~ msgid "Focus window when mouse moves over them" #~ msgstr "é¼ æ ‡ç§»è‡³çª—å£æ—¶èšç„¦è¯¥çª—å£" #~ msgid "Initiate All Windows" #~ msgstr "å¯åŠ¨æ‰€æœ‰çª—å£" #~ msgid "Initiate Keyboard Window Move" #~ msgstr "å¯åŠ¨é”®ç›˜çª—å£ç§»åЍ" #~ msgid "Initiate Keyboard Window Resize" #~ msgstr "å¯åŠ¨é”®ç›˜çª—å£å¤§å°è°ƒæ•´" #~ msgid "Initiate Window Switcher" #~ msgstr "å¯åŠ¨çª—å£åˆ‡æ¢ç¨‹åº" #~ msgid "Modifier to show switcher for all windows" #~ msgstr "显示所有窗å£åˆ‡æ¢ç¨‹åºçš„修改键" #~ msgid "Return from scale view" #~ msgstr "从比例视图返回" #~ msgid "Show switcher" #~ msgstr "显示切æ¢ç¨‹åº" #~ msgid "Sloppy Focus" #~ msgstr "ä»»æ„焦点" #~ msgid "Start moving window using keyboard" #~ msgstr "开始使用键盘移动窗å£" #~ msgid "Terminate" #~ msgstr "终止" #~ msgid "Water effect on system beep" #~ msgstr "系统嘟嘟声的水纹效果" #~ msgid "" #~ "Window types that should be fading (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "应å‡å¼±çš„窗å£ç±»åž‹ï¼ˆæ¡Œé¢ã€é æŽ¥ã€å·¥å…·æ ã€èœå•ã€å®žç”¨ç¨‹åºã€å¯åЍã€å¯¹è¯æ¡†ã€æ¨¡å¼å¯¹" #~ "è¯æ¡†ã€å¸¸è§„ã€å…¨å±å’ŒæœªçŸ¥ï¼‰" #~ msgid "" #~ "Window types that should be transformed when minimized (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgstr "" #~ "最å°åŒ–时应转æ¢çš„窗å£ç±»åž‹ï¼ˆæ¡Œé¢ã€é æŽ¥ã€å·¥å…·æ ã€èœå•ã€å®žç”¨ç¨‹åºã€å¯åЍã€å¯¹è¯" #~ "æ¡†ã€æ¨¡å¼å¯¹è¯æ¡†ã€å¸¸è§„ã€å…¨å±å’ŒæœªçŸ¥ï¼‰" #~ msgid "" #~ "Window types that should scaled in scale mode (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "应在比例模å¼ä¸­è°ƒæ•´å¤§å°çš„窗å£ç±»åž‹ï¼ˆæ¡Œé¢ã€é æŽ¥ã€å·¥å…·æ ã€èœå•ã€å®žç”¨ç¨‹åºã€å¯" #~ "动ã€å¯¹è¯æ¡†ã€æ¨¡å¼å¯¹è¯æ¡†ã€å¸¸è§„ã€å…¨å±å’ŒæœªçŸ¥ï¼‰" #~ msgid "" #~ "Window types that should shown in switcher (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "应显示在转æ¢å™¨ä¸­çš„窗å£ç±»åž‹ï¼ˆæ¡Œé¢ã€é æŽ¥ã€å·¥å…·æ ã€èœå•ã€å®žç”¨ç¨‹åºã€å¯åЍã€å¯¹è¯" #~ "æ¡†ã€æ¨¡å¼å¯¹è¯æ¡†ã€å¸¸è§„ã€å…¨å±å’ŒæœªçŸ¥ï¼‰" #~ msgid "" #~ "Window types that should wobble when focused (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "èšç„¦æ—¶åº”颤动的窗å£ç±»åž‹ï¼ˆæ¡Œé¢ã€é æŽ¥ã€å·¥å…·æ ã€èœå•ã€å®žç”¨ç¨‹åºã€å¯åЍã€å¯¹è¯æ¡†ã€" #~ "模å¼å¯¹è¯æ¡†ã€å¸¸è§„ã€å…¨å±å’ŒæœªçŸ¥ï¼‰" #~ msgid "" #~ "Window types that should wobble when grabbed (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "æ•获时应颤动的窗å£ç±»åž‹ï¼ˆæ¡Œé¢ã€é æŽ¥ã€å·¥å…·æ ã€èœå•ã€å®žç”¨ç¨‹åºã€å¯åЍã€å¯¹è¯æ¡†ã€" #~ "模å¼å¯¹è¯æ¡†ã€å¸¸è§„ã€å…¨å±å’ŒæœªçŸ¥ï¼‰" #~ msgid "" #~ "Window types that should wobble when mapped (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "映射时应颤动的窗å£ç±»åž‹ï¼ˆæ¡Œé¢ã€é æŽ¥ã€å·¥å…·æ ã€èœå•ã€å®žç”¨ç¨‹åºã€å¯åЍã€å¯¹è¯æ¡†ã€" #~ "模å¼å¯¹è¯æ¡†ã€å¸¸è§„ã€å…¨å±å’ŒæœªçŸ¥ï¼‰" #~ msgid "" #~ "Window types that should wobble when moved (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "移动时应颤动的窗å£ç±»åž‹ï¼ˆæ¡Œé¢ã€é æŽ¥ã€å·¥å…·æ ã€èœå•ã€å®žç”¨ç¨‹åºã€å¯åЍã€å¯¹è¯æ¡†ã€" #~ "模å¼å¯¹è¯æ¡†ã€å¸¸è§„ã€å…¨å±å’ŒæœªçŸ¥ï¼‰" #~ msgid "Wobble effect on system beep" #~ msgstr "系统嘟嘟声的颤动效果" compiz-0.9.11+14.04.20140409/po/it.po0000644000015301777760000027746012321343002017104 0ustar pbusernogroup00000000000000# Compiz Italian Translation # Copyright (C) 2007, 2008, 2009 The Free Software Foundation, Inc. # This file is distributed under the same license as the Compiz package. # # **** Glossario **** # # # enable -> usato sempre come 'abilitare' # viewport -> area visibile # bevel, to -> smussare # workaround -> alternativa # sticky -> adesivo # jagged edges -> bordi dentellati (traduzione corretta) # sidekick -> vortice # skewer -> distorsione # glide -> planata # skydome -> volta del cielo (lo so... lo so... a molti non piacerà! :) ) # fold -> ripiegatura (nelle sue varianti curva, orizzontale...) # clamp -> blocca, bloccare # shade -> sfumata, sfumare # fade -> dissolvi, dissolvenza # padding -> spaziatura # pad -> spazio # blur -> sfocato # hotkey -> tasto di scelta rapida # flip -> scorrere # Scale -> Scala finestre (nome del plugin), scala o scalare, ridimensionare # per immagini # glow -> bagliore # Opacify -> Opacizza (anche nome del plugin); opacizzare # opacity -> opacità (non è la trasparenza!) # tilt -> inclinato/a, usato per la visualizzazione delle aree di lavoro # sloppy -> lento (trovato solo una volta... ma potrebbe venir usato ancora) # Inside Cube -> Dentro il cubo (la modalità) # keybinding -> associazione di tasti # outline -> sagoma (nella modalità di ridimensionamento delle finestre) # blend -> trasformazione/trasformare (ne ho parlato con un Flame Artist) # # Milo Casagrande , 2007-2008, 2009. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-08-15 18:06+0200\n" "PO-Revision-Date: 2009-08-15 18:27+0200\n" "Last-Translator: Milo Casagrande \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" # (ndt) qui non capisco se si riferisca al desktop intero # (comprese la barra superiore e inferiore) o solo alla 'scrivania' #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Desktop" # (ndt) messo al plurale, alla fine non è relativo a una sola finestra #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Gestione finestre" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../plugins/scale/scale.xml.in.h:18 msgid "None" msgstr "Niente" #: ../gtk/window-decorator/gtk-window-decorator.c:4619 msgid "Shade" msgstr "Sfuma" #: ../plugins/place/place.xml.in.h:9 msgid "Maximize" msgstr "Massimizzato" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Massimizza orizzontalmente" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Massimizza verticalmente" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimizza" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Solleva" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Abbassa" #: ../gtk/window-decorator/gtk-window-decorator.c:4600 #: ../metadata/core.xml.in.h:75 msgid "Window Menu" msgstr "Menù della finestra" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Azione da eseguire quando viene utilizzata la rotellina del mouse sulla " "barra del titolo." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Tipo di sfocatura" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacità finestra attiva tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Sfumatura opacità finestra attiva tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacità tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Sfumatura opacità tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Opacità da usare per le finestre attive con il tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacità da usare per le decorazioni del tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "Sfuma le finestre attive con il tema Metacity da opache a traslucide" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "Sfuma le finestre con il tema Metacity da opache a traslucide" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Azione della rotellina del mouse sulla barra del titolo" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tipo di sfocatura da usare con le decorazioni delle finestre" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Usa il tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Usa il tema Metacity per le decorazioni delle finestre" #: ../gtk/window-decorator/gtk-window-decorator.c:4408 #: ../metadata/core.xml.in.h:9 msgid "Close Window" msgstr "Chiude la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4430 #: ../metadata/core.xml.in.h:70 msgid "Unmaximize Window" msgstr "Demassimizza la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4433 #: ../metadata/core.xml.in.h:36 msgid "Maximize Window" msgstr "Massimizza la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4475 #: ../metadata/core.xml.in.h:42 msgid "Minimize Window" msgstr "Minimizza la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4639 msgid "Make Above" msgstr "Porta sopra" #: ../gtk/window-decorator/gtk-window-decorator.c:4665 msgid "Stick" msgstr "Blocca" #: ../gtk/window-decorator/gtk-window-decorator.c:4685 msgid "Unshade" msgstr "De-sfuma" #: ../gtk/window-decorator/gtk-window-decorator.c:4705 msgid "Unmake Above" msgstr "Porta sotto" #: ../gtk/window-decorator/gtk-window-decorator.c:4731 msgid "Unstick" msgstr "Sblocca" #: ../gtk/window-decorator/gtk-window-decorator.c:5067 #, c-format msgid "The window \"%s\" is not responding." msgstr "La finestra «%s» non risponde." #: ../gtk/window-decorator/gtk-window-decorator.c:5076 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forzare la chiusura dell'applicazione comporta la perdita delle modifiche " "non salvate." #: ../gtk/window-decorator/gtk-window-decorator.c:5091 msgid "_Force Quit" msgstr "_Forza uscita" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Annotazioni" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Colore riempimento" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Colore tratto" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Plugin per prendere annotazioni" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Pulisci" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Disegna" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Disegna usando lo strumento" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Colore riempimento per le annotazioni" #: ../plugins/water/water.xml.in.h:6 ../plugins/zoom/zoom.xml.in.h:2 msgid "Initiate" msgstr "Avvia" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Avvia il disegno delle annotazioni" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Avvia la cancellazione delle annotazioni" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Avvia cancellazione" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Larghezza linea" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Larghezza linea per le annotazioni" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Colore tratto per le annotazioni" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Larghezza tratto" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Larghezza tratto per le annotazioni" #: ../plugins/blur/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4× bilineare" #: ../plugins/blur/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Sfocatura alpha" #: ../plugins/blur/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Finestre in sfocatura" #: ../plugins/blur/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtro sfocatura" #: ../plugins/blur/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Sfocare le occlusioni" #: ../plugins/blur/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturazione sfocatura" #: ../plugins/blur/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Velocità sfocatura" #: ../plugins/blur/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Finestre sfocate" #: ../plugins/blur/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Sfocatura dietro la parte traslucida delle finestre" #: ../plugins/blur/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturazione sfocatura" # (ndt) descrizione del plugin #: ../plugins/blur/blur.xml.in.h:11 msgid "Blur windows" msgstr "Sfoca le finestre" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Sfoca le finestre che non hanno il focus" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Disabilita la sfocatura delle regioni dello schermo oscurate da altre " "finestre." # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Filtro usato per la sfocatura" # (ndt) opzione # anche se non mi convince come traduzione #: ../plugins/blur/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Sfocare al focus" #: ../plugins/blur/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Finestre da sfocare" #: ../plugins/blur/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussiano" #: ../plugins/blur/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Raggio gaussiano" #: ../plugins/blur/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Resistenza gaussiana" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Il raggio gaussiano" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "La resistenza gaussiana" #: ../plugins/blur/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Recupero texture indipendente" #: ../plugins/blur/blur.xml.in.h:23 ../plugins/decor/decor.xml.in.h:10 #: ../plugins/switcher/switcher.xml.in.h:13 msgid "Mipmap" msgstr "Mipmap" # (ndt) preferisco mettere così... altrimenti # non si capisce subito #: ../plugins/blur/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Livello dettaglio" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Livello dettaglio mipmap" #: ../plugins/blur/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulsazione" #: ../plugins/blur/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Effetto pulsazione" #: ../plugins/blur/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Utilizza le unità texture disponibili per effettuare tutti i possibili " "recuperi texture indipendenti." #: ../plugins/blur/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Velocità sfocatura finestra" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Tipi di finestre a cui applicare la sfocatura al focus" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" "Tipi di finestre a cui applicare la sfocatura alpha in modo predefinito" # (ndt) devo ancora capirne l'utilità... #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Clona output" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Avvia selezione clone" # (ndt) descrizione plugin #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Gestore output clonato" #: ../plugins/commands/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command0" #: ../plugins/commands/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command1" #: ../plugins/commands/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command10" #: ../plugins/commands/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command11" #: ../plugins/commands/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command12" #: ../plugins/commands/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command3" #: ../plugins/commands/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command4" #: ../plugins/commands/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command5" #: ../plugins/commands/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command6" #: ../plugins/commands/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command7" #: ../plugins/commands/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command8" #: ../plugins/commands/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command9" #: ../plugins/commands/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command0" #: ../plugins/commands/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command1" #: ../plugins/commands/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command10" #: ../plugins/commands/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command11" #: ../plugins/commands/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command2" #: ../plugins/commands/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command3" #: ../plugins/commands/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command4" #: ../plugins/commands/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command5" #: ../plugins/commands/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command6" #: ../plugins/commands/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command7" #: ../plugins/commands/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command8" #: ../plugins/commands/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command9" #: ../plugins/commands/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command0" #: ../plugins/commands/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command1" #: ../plugins/commands/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command10" #: ../plugins/commands/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command11" #: ../plugins/commands/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command2" #: ../plugins/commands/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command3" #: ../plugins/commands/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command4" #: ../plugins/commands/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command5" #: ../plugins/commands/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command6" #: ../plugins/commands/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command7" #: ../plugins/commands/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command8" #: ../plugins/commands/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command9" #: ../plugins/commands/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Assegna associazioni ai comandi" #: ../plugins/commands/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Associazioni" #: ../plugins/commands/commands.xml.in.h:40 msgid "Command line 1" msgstr "Riga di comando 1" #: ../plugins/commands/commands.xml.in.h:41 msgid "Command line 10" msgstr "Riga di comando 10" #: ../plugins/commands/commands.xml.in.h:42 msgid "Command line 11" msgstr "Riga di comando 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Riga di comando 12" #: ../plugins/commands/commands.xml.in.h:43 msgid "Command line 2" msgstr "Riga di comando 2" #: ../plugins/commands/commands.xml.in.h:44 msgid "Command line 3" msgstr "Riga di comando 3" #: ../plugins/commands/commands.xml.in.h:45 msgid "Command line 4" msgstr "Riga di comando 4" #: ../plugins/commands/commands.xml.in.h:46 msgid "Command line 5" msgstr "Riga di comando 5" #: ../plugins/commands/commands.xml.in.h:47 msgid "Command line 6" msgstr "Riga di comando 6" #: ../plugins/commands/commands.xml.in.h:48 msgid "Command line 7" msgstr "Riga di comando 7" #: ../plugins/commands/commands.xml.in.h:49 msgid "Command line 8" msgstr "Riga di comando 8" #: ../plugins/commands/commands.xml.in.h:50 msgid "Command line 9" msgstr "Riga di comando 9" #: ../plugins/commands/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command0" #: ../plugins/commands/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command1" #: ../plugins/commands/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command10" #: ../plugins/commands/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_comman11" #: ../plugins/commands/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command2" #: ../plugins/commands/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command3" #: ../plugins/commands/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command4" #: ../plugins/commands/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command5" #: ../plugins/commands/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command6" #: ../plugins/commands/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command7" #: ../plugins/commands/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command8" #: ../plugins/commands/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command9" #: ../plugins/commands/commands.xml.in.h:63 #: ../plugins/gnomecompat/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Comandi" #: ../plugins/commands/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Associazioni ai bordi" #: ../plugins/commands/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Associazioni di tasti" #: ../plugins/commands/commands.xml.in.h:67 msgid "Run command 1" msgstr "Esegui comando 1" #: ../plugins/commands/commands.xml.in.h:68 msgid "Run command 10" msgstr "Esegui comando 10" #: ../plugins/commands/commands.xml.in.h:69 msgid "Run command 11" msgstr "Esegui comando 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Esegui comando 12" #: ../plugins/commands/commands.xml.in.h:70 msgid "Run command 2" msgstr "Esegui comando 2" #: ../plugins/commands/commands.xml.in.h:71 msgid "Run command 3" msgstr "Esegui comando 3" #: ../plugins/commands/commands.xml.in.h:72 msgid "Run command 4" msgstr "Esegui comando 4" #: ../plugins/commands/commands.xml.in.h:73 msgid "Run command 5" msgstr "Esegui comando 5" #: ../plugins/commands/commands.xml.in.h:74 msgid "Run command 6" msgstr "Esegui comando 6" #: ../plugins/commands/commands.xml.in.h:75 msgid "Run command 7" msgstr "Esegui comando 7" #: ../plugins/commands/commands.xml.in.h:76 msgid "Run command 8" msgstr "Esegui comando 8" #: ../plugins/commands/commands.xml.in.h:77 msgid "Run command 9" msgstr "Esegui comando 9" #: ../metadata/core.xml.in.h:1 msgid "Active Plugins" msgstr "Plugin attivi" # (ndt) io non la capisco come frase... #: ../plugins/composite/composite.xml.in.h:1 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Consenti il disegno finestre a schermo intero di non essere reindirizzato a " "pixmap fuori schermo" #: ../metadata/core.xml.in.h:2 msgid "Audible Bell" msgstr "Segnale acustico udibile" #: ../metadata/core.xml.in.h:3 msgid "Audible system beep" msgstr "Suono di sistema udibile" # (ndt) non serve fare clic sulla finestra per sollevarla # non per darle il focus, solo per sollevarla #: ../metadata/core.xml.in.h:4 msgid "Auto-Raise" msgstr "Sollevare automaticamente" # (ndt) non mi piace molto... ma andrebbe trovato anche di meglio # per quella sopra #: ../metadata/core.xml.in.h:5 msgid "Auto-Raise Delay" msgstr "Ritardo solleva automaticamente" #: ../metadata/core.xml.in.h:6 msgid "Automatic detection of output devices" msgstr "Rilevamento automatico dispositivi di output" #: ../plugins/composite/composite.xml.in.h:2 msgid "Automatic detection of refresh rate" msgstr "Rilevamento automatico della frequenza di aggiornamento" #: ../plugins/opengl/opengl.xml.in.h:1 msgid "Best" msgstr "Ottimo" # (ndt) opzione #: ../metadata/core.xml.in.h:7 msgid "Click To Focus" msgstr "Fare clic per il focus" #: ../metadata/core.xml.in.h:8 msgid "Click on window moves input focus to it" msgstr "Fare clic sulla finestra per spostare il focus su di essa" #: ../metadata/core.xml.in.h:10 msgid "Close active window" msgstr "Chiude finestra attiva" #: ../metadata/core.xml.in.h:11 msgid "Default Icon" msgstr "Icona predefinita" # (ndt) suggerimento #: ../metadata/core.xml.in.h:12 msgid "Default window icon image" msgstr "Icona finestra predefinita" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Dimensione desktop" # (ndt) opzione #: ../metadata/core.xml.in.h:13 msgid "Detect Outputs" msgstr "Rilevare output" # (ndt) opzione #: ../plugins/composite/composite.xml.in.h:5 msgid "Detect Refresh Rate" msgstr "Rilevare frequenza aggiornamento" # (ndt) è il nome di una scheda # meglio stare sul corto #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Impostazioni visualizzazione" #: ../metadata/core.xml.in.h:14 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Tempo che il puntatore deve restare su un bordo dello schermo prima che " "venga eseguita un'azione." #: ../metadata/core.xml.in.h:15 msgid "Edge Trigger Delay" msgstr "Ritardo azione bordo" #: ../plugins/opengl/opengl.xml.in.h:2 msgid "Fast" msgstr "Veloce" # (ndt) pure questa è il nome di una scheda... #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Focus e comportamento sollevamento" #: ../metadata/core.xml.in.h:16 msgid "Focus Prevention Level" msgstr "Livello di prevenzione del focus" # (ndt) non è molto chiara... #: ../metadata/core.xml.in.h:17 msgid "Focus Prevention Windows" msgstr "Finestre che prevengono il focus" #: ../metadata/core.xml.in.h:18 msgid "Focus prevention windows" msgstr "Tipi di finestre che prevengono il focus" # (ndt) è anche opzione #: ../plugins/composite/composite.xml.in.h:6 msgid "Force independent output painting." msgstr "Forzare la colorazione indipendente dell'output" #: ../metadata/core.xml.in.h:19 msgid "General Options" msgstr "Opzioni generali" #: ../metadata/core.xml.in.h:20 msgid "General compiz options" msgstr "Opzioni generali di Compiz" #: ../plugins/opengl/opengl.xml.in.h:3 msgid "Good" msgstr "Buono" # (ndt) originale poco chiara... #: ../metadata/core.xml.in.h:21 msgid "Hide Skip Taskbar Windows" msgstr "Nascondi finestre della barra delle applicazioni di tralasciamento" #: ../metadata/core.xml.in.h:22 msgid "Hide all windows and focus desktop" msgstr "Nasconde tutte le finestre e dà il focus alla scrivania" #: ../metadata/core.xml.in.h:23 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Nasconde le finestre non nella barra delle applicazioni durante " "l'attivazione della modalità di visualizzazione della scrivania" #: ../metadata/core.xml.in.h:24 msgid "High" msgstr "Alto" #: ../metadata/core.xml.in.h:25 msgid "Horizontal Virtual Size" msgstr "Dimensioni virtuali orizzontali" #: ../plugins/opengl/opengl.xml.in.h:4 msgid "If available use compression for textures converted from images" msgstr "" "Se disponibile, usa la compressione per le texture convertite dalle immagini" #: ../metadata/core.xml.in.h:26 msgid "Ignore Hints When Maximized" msgstr "Ignorare suggerimenti quando massimizzata" #: ../metadata/core.xml.in.h:27 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignora i suggerimenti su aspetto e incremento dimensioni quando la finestra " "è massimizzata" #: ../metadata/core.xml.in.h:28 msgid "Interval before raising selected windows" msgstr "Intervallo di tempo prima di sollevare le finestre selezionate" #: ../metadata/core.xml.in.h:29 msgid "Interval between ping messages" msgstr "Intervallo tra i messaggi di ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Associazioni di tasti" #: ../metadata/core.xml.in.h:30 msgid "Level of focus stealing prevention" msgstr "Livello di prevenzione del focus" #: ../plugins/opengl/opengl.xml.in.h:5 msgid "Lighting" msgstr "Illuminazione" #: ../metadata/core.xml.in.h:31 msgid "List of currently active plugins" msgstr "Elenco dei plugin attualmente attivi" #: ../metadata/core.xml.in.h:32 msgid "List of strings describing output devices" msgstr "Elenco di stringhe che descrivono i dispositivi di output" #: ../metadata/core.xml.in.h:33 msgid "Low" msgstr "Basso" #: ../metadata/core.xml.in.h:34 msgid "Lower Window" msgstr "Abbassa finestra" #: ../metadata/core.xml.in.h:35 msgid "Lower window beneath other windows" msgstr "Abbassa la finestra sotto le altre" #: ../metadata/core.xml.in.h:37 msgid "Maximize Window Horizontally" msgstr "Massimizza finestra in orizzontale" #: ../metadata/core.xml.in.h:38 msgid "Maximize Window Vertically" msgstr "Massimizza finestra in verticale" #: ../metadata/core.xml.in.h:39 msgid "Maximize active window" msgstr "Massimizza la finestra attiva" #: ../metadata/core.xml.in.h:40 msgid "Maximize active window horizontally" msgstr "Massimizza la finestra attiva in orizzontale" #: ../metadata/core.xml.in.h:41 msgid "Maximize active window vertically" msgstr "Massimizza la finestra attiva in verticale" #: ../metadata/core.xml.in.h:43 msgid "Minimize active window" msgstr "Minimizza la finestra attiva" #: ../metadata/core.xml.in.h:44 ../plugins/resize/resize.xml.in.h:12 msgid "Normal" msgstr "Normale" # (ndt) qui non scrivania perché si possono avere più scrivanie # intese come aree di lavoro su diversi desktop. Questo indica proprio # il numero di desktop virtuali #: ../metadata/core.xml.in.h:45 msgid "Number of Desktops" msgstr "Numero di desktop" #: ../metadata/core.xml.in.h:46 msgid "Number of virtual desktops" msgstr "Numero di desktop virtuali" #: ../metadata/core.xml.in.h:47 msgid "Off" msgstr "Spento" #: ../plugins/opengl/opengl.xml.in.h:6 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Esegue aggiornamenti dello schermo solo durante periodo di cancellazione " "verticale" #: ../metadata/core.xml.in.h:48 msgid "Outputs" msgstr "Output" #: ../metadata/core.xml.in.h:49 msgid "Overlapping Output Handling" msgstr "Gestione output sovrapposto" #: ../plugins/composite/composite.xml.in.h:7 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Colora ogni dispositivo di ouptut indipendentemente, anche se i dispositivi " "si sovrappongono" #: ../metadata/core.xml.in.h:50 msgid "Ping Delay" msgstr "Ritardo ping" #: ../metadata/core.xml.in.h:51 msgid "Prefer larger output" msgstr "Preferire output più grande" #: ../metadata/core.xml.in.h:52 msgid "Prefer smaller output" msgstr "Preferire output più piccolo" #: ../metadata/core.xml.in.h:53 msgid "Raise On Click" msgstr "Sollevare al clic" #: ../metadata/core.xml.in.h:54 msgid "Raise Window" msgstr "Solleva finestra" #: ../metadata/core.xml.in.h:55 msgid "Raise selected windows after interval" msgstr "Porta la finestra selezionata in primo piano dopo un intervallo" #: ../metadata/core.xml.in.h:56 msgid "Raise window above other windows" msgstr "Solleva la finestra al di sopra delle altre finestre" #: ../metadata/core.xml.in.h:57 msgid "Raise windows when clicked" msgstr "Solleva le finestre al clic" #: ../plugins/composite/composite.xml.in.h:8 msgid "Refresh Rate" msgstr "Frequenza di aggiornamento" # (ndt) questo non è altro che un numero per indicare # quante aree di lavoro in orizzontale usare #: ../metadata/core.xml.in.h:58 msgid "Screen size multiplier for horizontal virtual size" msgstr "Moltiplicatore dimensione schermo per dimensioni virtuali orizzontali" # (ndt) questo invece indica quante aree di lavoro in verticale # usare: se il valore di prima è 4 e questo 2, si hanno in totale 8 aree di lavoro # su due file #: ../metadata/core.xml.in.h:59 msgid "Screen size multiplier for vertical virtual size" msgstr "Moltiplicatore dimensione schermo per dimensioni virtuali verticali" #: ../metadata/core.xml.in.h:60 msgid "Show Desktop" msgstr "Mostra scrivania" #: ../plugins/composite/composite.xml.in.h:9 msgid "Slow Animations" msgstr "Animazioni lente" #: ../metadata/core.xml.in.h:61 msgid "Smart mode" msgstr "Modalità intelligente" # (ndt) opzione in ccsm #: ../plugins/opengl/opengl.xml.in.h:9 msgid "Sync To VBlank" msgstr "Sincronizzare con VBlank" #: ../plugins/opengl/opengl.xml.in.h:10 msgid "Texture Compression" msgstr "Compressione texture" #: ../plugins/opengl/opengl.xml.in.h:11 msgid "Texture Filter" msgstr "Filtro texture" # (ndt) suggerimento della voce precedente #: ../plugins/opengl/opengl.xml.in.h:12 msgid "Texture filtering" msgstr "Modalità di filtro texture" #: ../plugins/composite/composite.xml.in.h:10 msgid "The rate at which the screen is redrawn (times/second)" msgstr "La velocità di aggiornamento della schermata (volte/secondo)" #: ../metadata/core.xml.in.h:62 msgid "Toggle Window Maximized" msgstr "Commuta finestra massimizzata" #: ../metadata/core.xml.in.h:63 msgid "Toggle Window Maximized Horizontally" msgstr "Commuta finestra massimizzata in orizzontale" #: ../metadata/core.xml.in.h:64 msgid "Toggle Window Maximized Vertically" msgstr "Commuta finestra massimizzata in verticale" #: ../metadata/core.xml.in.h:65 msgid "Toggle Window Shaded" msgstr "Commuta finestra sfumata" #: ../metadata/core.xml.in.h:66 msgid "Toggle active window maximized" msgstr "Commuta finestra attiva massimizzata" #: ../metadata/core.xml.in.h:67 msgid "Toggle active window maximized horizontally" msgstr "Commuta finestra attiva massimizzata in orizzontale" #: ../metadata/core.xml.in.h:68 msgid "Toggle active window maximized vertically" msgstr "Commuta finestra attiva massimizzata in verticale" #: ../metadata/core.xml.in.h:69 msgid "Toggle active window shaded" msgstr "Commuta finestra attiva sfumata" #: ../plugins/composite/composite.xml.in.h:11 msgid "Toggle use of slow animations" msgstr "Commuta l'uso di animazioni lente" #: ../metadata/core.xml.in.h:71 msgid "Unmaximize active window" msgstr "Demassimizza finestra attiva" # (ndt) poco chiara #: ../plugins/composite/composite.xml.in.h:12 msgid "Unredirect Fullscreen Windows" msgstr "Annullare re-indirizzamento finestre a schermo intero" #: ../plugins/opengl/opengl.xml.in.h:13 msgid "Use diffuse light when screen is transformed" msgstr "Usa luce diffusa alla trasformazione della schermata" # (ndt) su quante righe mettere le aree di lavoro #: ../metadata/core.xml.in.h:72 msgid "Vertical Virtual Size" msgstr "Dimensioni virtuali verticali" #: ../metadata/core.xml.in.h:73 msgid "Very High" msgstr "Molto alto" #: ../metadata/core.xml.in.h:74 msgid "Which one of overlapping output devices should be preferred" msgstr "Quale dei dispositivi di output sovrapposto deve essere preferito" #: ../metadata/core.xml.in.h:76 msgid "Window menu button binding" msgstr "Associazione pulsante menù finestra" #: ../metadata/core.xml.in.h:77 msgid "Window menu key binding" msgstr "Associazione tasto menù finestra" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Accelerazione" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Adattare immagine" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Regola l'immagine alla rotazione" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avanza a diapositiva successiva" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animare la volta del cielo" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Anima la volta del cielo alla rotazione del cubo" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Aspetto" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatico" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Comportamento" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Colore dei lati superiore e inferiore del cubo" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Colore finale da utilizzare per il gradiente inferiore della volta del cielo" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Colore iniziale da utilizzare per il gradiente superiore della volta del " "cielo" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Capi del cubo" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Colore cubo" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Desktop cubico" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Accelerazione ripiegatura" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Velocità ripiegatura" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Intervallo ripiegatura" #: ../plugins/switcher/switcher.xml.in.h:10 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "Genera mipmap quando possibile per migliorare la qualità di ridimensionamento" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Torna a diapositiva precedente" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "File immagine" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Immagine da utilizzare come texture per la volta del cielo" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Inizializza la trasparenza del cubo solo se la rotazione è gestita col mouse." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Dentro il cubo" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Punto di vista dall'interno del cubo" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Elenco di file PNG e SVG da visualizzare sulla faccia superiore del cubo" #: ../plugins/place/place.xml.in.h:11 ../plugins/scale/scale.xml.in.h:17 msgid "Multi Output Mode" msgstr "Modalità multi-output" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Cubi multipli" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Diapositiva successiva" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Un grande cubo" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacità durante la rotazione" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacità quando fermo" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacità del desktop durante la rotazione." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacità del desktop quando non sta ruotando." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Posiziona le finestre su un cubo" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Diapositiva precedente" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Visualizza la volta del cielo" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Ridimensionare immagine" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Ridimensiona le immagini per coprire la faccia superiore del cubo" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Stabilisce come visualizzare il cubo se sono utilizzati dispositivi multipli " "per l'output." # (ndt) lo so... lo so... a molti non andrà a genio! :) #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Volta del cielo" # (ndt) ometto skydome, tanto sono presenti solo tra le sue opzioni #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Colore gradiente finale" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Colore gradiente iniziale" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Immagine volta del cielo" #: ../plugins/scale/scale.xml.in.h:32 ../plugins/switcher/switcher.xml.in.h:35 #: ../plugins/zoom/zoom.xml.in.h:3 msgid "Speed" msgstr "Velocità" #: ../plugins/scale/scale.xml.in.h:34 ../plugins/switcher/switcher.xml.in.h:39 #: ../plugins/zoom/zoom.xml.in.h:4 msgid "Timestep" msgstr "Intervallo" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Trasparenza solo alla rotazione col mouse" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Cubo trasparente" # (ndt) l'opzione per aprire il cubo e vedere le sue facce # quella superiore e inferiore non vengono contate... #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Distendi" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Distende il cubo" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Backend controllo dbus" #: ../plugins/decor/decor.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Consente la creazione di mipmap per le texture della decorazione" #: ../plugins/decor/decor.xml.in.h:2 msgid "Command" msgstr "Comando" #: ../plugins/decor/decor.xml.in.h:3 msgid "Decoration windows" msgstr "Finestre da decorare" #: ../plugins/decor/decor.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Riga di comando strumento di decorazione eseguita se nessuna applicazione di " "decorazione è in esecuzione" #: ../plugins/decor/decor.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Offset X ombreggiatura esterna" #: ../plugins/decor/decor.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Offset Y ombreggiatura esterna" #: ../plugins/decor/decor.xml.in.h:7 msgid "Drop shadow color" msgstr "Colore ombreggiatura esterna" #: ../plugins/decor/decor.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacità ombreggiatura esterna" #: ../plugins/decor/decor.xml.in.h:9 msgid "Drop shadow radius" msgstr "Raggio ombreggiatura esterna" #: ../plugins/decor/decor.xml.in.h:11 msgid "Shadow Color" msgstr "Colore ombreggiatura" #: ../plugins/decor/decor.xml.in.h:12 msgid "Shadow Offset X" msgstr "Offset X ombreggiatura" #: ../plugins/decor/decor.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Offset Y ombreggiatura" #: ../plugins/decor/decor.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacità ombreggiatura" #: ../plugins/decor/decor.xml.in.h:15 msgid "Shadow Radius" msgstr "Raggio ombreggiatura" #: ../plugins/decor/decor.xml.in.h:16 msgid "Shadow windows" msgstr "Finestre con ombreggiatura" #: ../plugins/decor/decor.xml.in.h:17 msgid "Window Decoration" msgstr "Decorazione finestra" #: ../plugins/decor/decor.xml.in.h:18 msgid "Window decorations" msgstr "Decorazioni finestra" #: ../plugins/decor/decor.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Tipi di finestre da decorare" #: ../plugins/decor/decor.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Tipi di finestre a cui applicare l'ombreggiatura" #: ../plugins/fade/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Luminosità (in percentuale) delle finestre bloccate" #: ../plugins/fade/fade.xml.in.h:3 msgid "Constant speed" msgstr "Velocità costante" #: ../plugins/fade/fade.xml.in.h:4 msgid "Constant time" msgstr "Tempo costante" #: ../plugins/fade/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Oscurare finestre bloccate" #: ../plugins/fade/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Oscurare le finestre che non rispondono alle richieste del gestore di " "finestre" #: ../plugins/fade/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Modalità dissolvenza" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Dissolvere alla minimizzazione/apertura/chiusura" #: ../plugins/fade/fade.xml.in.h:8 msgid "Fade Speed" msgstr "Velocità dissolvenza" #: ../plugins/fade/fade.xml.in.h:9 msgid "Fade Time" msgstr "Tempo dissolvenza" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" "Effetto dissolvenza agli eventi di minimizzazione/apertura/chiusura della " "finestra" #: ../plugins/fade/fade.xml.in.h:10 msgid "Fade effect on system beep" msgstr "Effetto dissolvenza al suono di sistema" #: ../plugins/fade/fade.xml.in.h:11 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Applica dissolvenza in entrata alle finestre quando associate e in uscita " "quando non associate" #: ../plugins/fade/fade.xml.in.h:12 msgid "Fade windows" msgstr "Finestre da dissolvere" #: ../plugins/fade/fade.xml.in.h:13 msgid "Fading Windows" msgstr "Finestre in dissolvenza" #: ../plugins/fade/fade.xml.in.h:14 msgid "Fullscreen Visual Bell" msgstr "Segnale visivo schermo intero" #: ../plugins/fade/fade.xml.in.h:15 msgid "Fullscreen fade effect on system beep" msgstr "Effetto dissolvenza schermo intero al suono di sistema" #: ../plugins/fade/fade.xml.in.h:17 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Saturazione (in percentuale) delle finestre bloccate" #: ../plugins/fade/fade.xml.in.h:18 msgid "Unresponsive Window Brightness" msgstr "Luminosità finestre bloccate" #: ../plugins/fade/fade.xml.in.h:19 msgid "Unresponsive Window Saturation" msgstr "Saturazione finestre bloccate" #: ../plugins/fade/fade.xml.in.h:20 msgid "Visual Bell" msgstr "Segnale acustico visivo" #: ../plugins/fade/fade.xml.in.h:21 msgid "Window fade mode" msgstr "Modalità dissolvenza finestra" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Velocità dissolvenza finestra nella modalità «Velocità costante»" #: ../plugins/fade/fade.xml.in.h:23 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Tempo (in ms) dissolvenza finestra nella modalità «Tempo costante»" #: ../plugins/fade/fade.xml.in.h:24 msgid "Windows that should be fading" msgstr "Tipi di finestre a cui applicare la dissolvenza" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Punto di mount" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Punto di mount" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "File system nello spazio utente" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "File system nello spazio utente" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Backend per il controllo GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" # (ndt) o principale? #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Supporto ciclo main GLib" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Compatibilità GNOME" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Apre un terminale" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Opzioni che mantengono Compiz compatibile con l'ambiente grafico GNOME" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Finestra di dialogo «Esegui applicazione»" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Comando esecuzione terminale" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Riga di comando per cattura schermata" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Mostra menù principale" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Mostra finestra di dialogo «Esegui applicazione»" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Mostra il menù principale" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Cattura schermata" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Cattura un'istantanea di una finestra" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Riga di comando terminale" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Riga di comando cattura schermata finestra" #: ../plugins/ini/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../plugins/ini/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Backend file ini" #: ../plugins/inotify/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Plugin notifica cambiamento file" #: ../plugins/inotify/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Backend per il controllo Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Effetto minimizzazione" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Finestre da minimizzare" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Velocità minimizzazione" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Intervallo minimizzazione" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Resistenza sfumatura" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Resistenza sfumatura" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Trasforma le finestre quando vengono minimizzate e deminimizzate" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Tipi di finestre da trasformare quando minimizzate" #: ../plugins/move/move.xml.in.h:1 msgid "Constrain Y" msgstr "Mantenere Y" # (ndt) suggerimento #: ../plugins/move/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" "Non consente di spostare le finestre oltre il bordo superiore e inferiore " "dello schermo " #: ../plugins/move/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Non aggiorna la posizione lato server delle finestre fino al termine del " "movimento" #: ../plugins/move/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Inizializza muovi finestre" #: ../plugins/move/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Posizionamento pigro" #: ../plugins/move/move.xml.in.h:6 msgid "Move Window" msgstr "Muovi finestra" #: ../plugins/move/move.xml.in.h:7 msgid "Move window" msgstr "Muove la finestra" #: ../plugins/move/move.xml.in.h:8 ../plugins/scale/scale.xml.in.h:21 #: ../plugins/switcher/switcher.xml.in.h:18 msgid "Opacity" msgstr "Opacità" #: ../plugins/move/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Livello di opacità delle finestre in movimento" #: ../plugins/move/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Sgancia e demassimizza le finestre massimizzate nel trascinamento" #: ../plugins/move/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Sganciare finestre massimizzate" #: ../plugins/move/move.xml.in.h:12 msgid "Start moving window" msgstr "Avvia finestra in movimento" #: ../plugins/switcher/switcher.xml.in.h:6 msgid "Brightness" msgstr "Luminosità" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Riduzione luminosità" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Aumento luminosità" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Passo luminosità" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Valori di luminosità per le finestre" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Riduci" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Aumenta" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Riduzione opacità" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Aumento opacità" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Passo opacità" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Valori di opacità per le finestre" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Opacità, luminosità e saturazione" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Regolazioni di opacità, luminosità e saturazione" #: ../plugins/switcher/switcher.xml.in.h:28 msgid "Saturation" msgstr "Saturazione" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Riduzione saturazione" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Aumento saturazione" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Passo saturazione" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Valori di saturazione per le finestre" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Passo" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Impostazioni specifiche della finestra" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Valori finestra" #: ../plugins/place/place.xml.in.h:27 msgid "Windows" msgstr "Finestre" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" "Finestre che dovrebbero avere una luminosità diversa in modo predefinito" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Finestre che dovrebbero avere una opacità diversa in modo predefinito" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" "Finestre che dovrebbero avere una saturazione diversa in modo predefinito" #: ../plugins/place/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmo da usare per il posizionamento della finestra" #: ../plugins/place/place.xml.in.h:2 msgid "Cascade" msgstr "Cascata" #: ../plugins/place/place.xml.in.h:3 msgid "Centered" msgstr "Centrato" #: ../plugins/place/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Posizionamento finestre fisso" #: ../plugins/place/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Posizionamento finestre forzato" #: ../plugins/place/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Posizioni orizzontali area visibile" #: ../plugins/place/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Mantenere nello spazio di lavoro" #: ../plugins/place/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Mantiene le finestre in posizione nello spazio lavoro, anche se ciò " "significa che la posizione può differire da quella specificata." #: ../plugins/place/place.xml.in.h:12 msgid "Place Windows" msgstr "Posiziona finestre" #: ../plugins/place/place.xml.in.h:13 msgid "Place across all outputs" msgstr "Posizionare le finestre tra tutti gli output" #: ../plugins/place/place.xml.in.h:14 msgid "Place windows at appropriate positions when mapped" msgstr "Posiziona le finestre in maniera appropriata quando sono associate" #: ../plugins/place/place.xml.in.h:15 msgid "Placement Mode" msgstr "Modalità di posizionamento" #: ../plugins/place/place.xml.in.h:16 msgid "Positioned windows" msgstr "Finestre da posizionare" #: ../plugins/place/place.xml.in.h:18 msgid "Random" msgstr "Casuale" #: ../plugins/place/place.xml.in.h:19 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Seleziona il comportamento del posizionamento delle finestre se sono " "selezionati molteplici output" #: ../plugins/place/place.xml.in.h:20 msgid "Smart" msgstr "Intelligente" #: ../plugins/place/place.xml.in.h:21 msgid "Use active output device" msgstr "Usare dispositivo di output attivo" #: ../plugins/place/place.xml.in.h:22 msgid "Use output device of focussed window" msgstr "Usare dispositivo di output della finestra col focus" #: ../plugins/place/place.xml.in.h:23 msgid "Use output device with pointer" msgstr "Usare dispositivo di output con puntatore" #: ../plugins/place/place.xml.in.h:24 msgid "Vertical viewport positions" msgstr "Posizioni verticali area visibile" #: ../plugins/place/place.xml.in.h:25 msgid "Viewport positioned windows" msgstr "Finestre posizionate in area visibile" #: ../plugins/place/place.xml.in.h:26 msgid "Window placement workarounds" msgstr "Alternative posizionamento finestre" #: ../plugins/place/place.xml.in.h:28 msgid "Windows that should be positioned by default" msgstr "Tipi di finestre da posizionare in modo predefinito" #: ../plugins/place/place.xml.in.h:29 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Tipi di finestre da posizionare in un'area visibile specifica in modo " "predefinito" #: ../plugins/place/place.xml.in.h:30 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Finestre che devono essere posizionate in ogni caso, anche se il gestore di " "finestre non dovrebbe posizionarle." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Finestre con posizioni fisse" #: ../plugins/place/place.xml.in.h:34 msgid "Windows with fixed viewport" msgstr "Finestre con area visibile fissa" #: ../plugins/place/place.xml.in.h:35 msgid "Workarounds" msgstr "Alternative" #: ../plugins/place/place.xml.in.h:36 msgid "X Positions" msgstr "Posizioni X" #: ../plugins/place/place.xml.in.h:37 msgid "X Viewport Positions" msgstr "Posizioni X area visibile" #: ../plugins/place/place.xml.in.h:38 msgid "X position values" msgstr "Valori posizione X" #: ../plugins/place/place.xml.in.h:39 msgid "Y Positions" msgstr "Posizioni Y" #: ../plugins/place/place.xml.in.h:40 msgid "Y Viewport Positions" msgstr "Posizioni Y area visibile" #: ../plugins/place/place.xml.in.h:41 msgid "Y position values" msgstr "Valori posizione Y" # (ndt) è più comune vedere PNG piuttosto che Png #: ../plugins/imgpng/imgpng.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../plugins/imgpng/imgpng.xml.in.h:2 msgid "Png image loader" msgstr "Caricatore immagini PNG" #: ../plugins/regex/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Corrispondenza espressione regolare" #: ../plugins/regex/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Riconosce le finestre usando le espressioni regolari" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Associazioni" #: ../plugins/resize/resize.xml.in.h:1 msgid "Border Color" msgstr "Colore bordo" #: ../plugins/resize/resize.xml.in.h:2 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Colore bordo usato nelle modalità di ridimensionamento «Sagoma» e «Rettangolo»" #: ../plugins/resize/resize.xml.in.h:3 msgid "Default Resize Mode" msgstr "Modalità ridimensionamento predefinita" #: ../plugins/resize/resize.xml.in.h:4 msgid "Default mode used for window resizing" msgstr "Modalità predefinita per il ridimensionamento delle finestre" #: ../plugins/resize/resize.xml.in.h:5 msgid "Fill Color" msgstr "Colore riempimento" #: ../plugins/resize/resize.xml.in.h:6 msgid "Fill color used for rectangle resize mode" msgstr "Colore del riempimento nella modalità di ridimensionamento «Rettangolo»" #: ../plugins/resize/resize.xml.in.h:7 msgid "Initiate Normal Window Resize" msgstr "Inizializza ridimensionamento «Normale»" #: ../plugins/resize/resize.xml.in.h:8 msgid "Initiate Outline Window Resize" msgstr "Inizializza ridimensionamento «Sagoma»" #: ../plugins/resize/resize.xml.in.h:9 msgid "Initiate Rectangle Window Resize" msgstr "Inizializza ridimensionamento «Rettangolo»" #: ../plugins/resize/resize.xml.in.h:10 msgid "Initiate Stretch Window Resize" msgstr "Inizializza ridimensionamento «Elastico»" #: ../plugins/resize/resize.xml.in.h:11 msgid "Initiate Window Resize" msgstr "Inizializza ridimensionamento finestre" #: ../plugins/resize/resize.xml.in.h:13 msgid "Normal Resize Windows" msgstr "Ridimensionamento finestre normale" #: ../plugins/resize/resize.xml.in.h:14 msgid "Outline" msgstr "Sagoma" #: ../plugins/resize/resize.xml.in.h:15 msgid "Outline Resize Windows" msgstr "Ridimensionamento finestre sagoma" #: ../plugins/resize/resize.xml.in.h:16 msgid "Rectangle" msgstr "Rettangolo" #: ../plugins/resize/resize.xml.in.h:17 msgid "Rectangle Resize Windows" msgstr "Ridimensionamento finestre rettangolo" #: ../plugins/resize/resize.xml.in.h:18 msgid "Resize Window" msgstr "Ridimensiona finestre" #: ../plugins/resize/resize.xml.in.h:19 msgid "Resize window" msgstr "Ridimensiona le finestre" #: ../plugins/resize/resize.xml.in.h:20 msgid "Start resizing window" msgstr "Avvia il ridimensionamento della finestra" #: ../plugins/resize/resize.xml.in.h:21 msgid "Start resizing window by stretching it" msgstr "Avvia il ridimensionamento delle finestre stiracchiandole" #: ../plugins/resize/resize.xml.in.h:22 msgid "Start resizing window normally" msgstr "Avvia il ridimensionamento normale delle finestre" #: ../plugins/resize/resize.xml.in.h:23 msgid "Start resizing window with outline" msgstr "Avvia il ridimensionamento delle finestre attraverso la sagoma" #: ../plugins/resize/resize.xml.in.h:24 msgid "Start resizing window with rectangle" msgstr "Avvia il ridimensionamento delle finestre attraverso il rettangolo" #: ../plugins/resize/resize.xml.in.h:25 msgid "Stretch" msgstr "Elastico" #: ../plugins/resize/resize.xml.in.h:26 msgid "Stretch Resize Windows" msgstr "Ridimensionamento finestre elastico" #: ../plugins/resize/resize.xml.in.h:27 msgid "Windows that normal resize should be used for" msgstr "Tipi di finestre a cui applicare il ridimensionamento «Normale»" #: ../plugins/resize/resize.xml.in.h:28 msgid "Windows that outline resize should be used for" msgstr "Tipi di finestre a cui applicare il ridimensionamento «Sagoma»" #: ../plugins/resize/resize.xml.in.h:29 msgid "Windows that rectangle resize should be used for" msgstr "Tipi di finestre a cui applicare il ridimensionamento «Rettangolo»" #: ../plugins/resize/resize.xml.in.h:30 msgid "Windows that stretch resize should be used for" msgstr "Tipi di finestre a cui applicare il ridimensionamento «Elastico»" # (ndt) il funzionamento è questo: # prendere un oggetto, non una finestra, e cercare # di spostarlo in un'altra area di lavoro per far ruotare il cubo #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Scorrere il bordo al trascinamento" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Scorrere il bordo allo spostamento" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Scorrere il bordo con il puntatore" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Tempo scorrimento" # (ndt) praticamente sposta il puntatore sul bordo di destra #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Ruota verso l'area visibile a sinistra e sposta il puntatore" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Ruota verso l'area visibile successiva trascinando un oggetto sul bordo" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Ruota verso l'area visibile successiva spostando il puntatore sul bordo" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Ruota verso l'area visibile successiva spostando una finestra sul bordo" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Ruota verso l'area visibile a destra e sposta il puntatore" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inverte l'asse Y per lo spostamento del puntatore" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Invertire puntatore Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilità puntatore" # (ndt) riesco a capire cosa faccia... #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Sollevare alla rotazione" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Solleva le finestre alla rotazione" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Ruota cubo" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Scorre e ruota verso sinistra" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Scorre e ruota verso destra" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Ruota a sinistra" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Ruota a sinistra con la finestra" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Ruota a destra" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Ruota a destra con la finestra" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Ruota verso" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Ruota verso faccia 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Ruota verso faccia 1 con la finestra" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Ruota verso faccia 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Ruota verso faccia 10 con la finestra" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Ruota verso faccia 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Ruota verso faccia 11 con la finestra" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Ruota verso faccia 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Ruota verso faccia 12 con la finestra" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Ruota verso faccia 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Ruota verso faccia 2 con la finestra" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Ruota verso faccia 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Ruota verso faccia 3 con la finestra" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Ruota verso faccia 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Ruota verso faccia 4 con la finestra" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Ruota verso faccia 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Ruota verso faccia 5 con la finestra" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Ruota verso faccia 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Ruota verso faccia 6 con la finestra" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Ruota verso faccia 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Ruota verso faccia 7 con la finestra" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Ruota verso faccia 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Ruota verso faccia 8 con la finestra" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Ruota verso faccia 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Ruota verso faccia 9 con la finestra" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Ruota cubo" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Ruota desktop cubico" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Ruota a sinistra" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Ruota a sinistra insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Ruota a destra" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Ruota a destra insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Ruota verso la faccia del cubo" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Ruota verso faccia del cubo con la finestra" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Ruota verso la faccia 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Ruota verso la faccia 1 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Ruota verso la faccia 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Ruota verso la faccia 10 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Ruota verso la faccia 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Ruota verso la faccia 11 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Ruota verso la faccia 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Ruota verso la faccia 12 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Ruota verso la faccia 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Ruota verso la faccia 2 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Ruota verso la faccia 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Ruota verso la faccia 3 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Ruota verso la faccia 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Ruota verso la faccia 4 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Ruota verso la faccia 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Ruota verso la faccia 5 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Ruota verso la faccia 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Ruota verso la faccia 6 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Ruota verso la faccia 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Ruota verso la faccia 7 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Ruota verso la faccia 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Ruota verso la faccia 8 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Ruota verso la faccia 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Ruota verso la faccia 9 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Ruota verso area visibile" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Ruota la finestra" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Ruota con la finestra" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Accelerazione rotazione" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Velocità rotazione" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Intervallo rotazione" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoom della rotazione" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilità del movimento del puntatore" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Aggancia la rotazione del cubo alla faccia inferiore" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Aggancia la rotazione del cubo alla faccia superiore" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Agganciare alla faccia inferiore" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Agganciare alla faccia superiore" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Avvia rotazione" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tempo massimo prima di scorrere l'area visibile" #: ../plugins/switcher/switcher.xml.in.h:41 msgid "Zoom" msgstr "Zoom" #: ../plugins/scale/scale.xml.in.h:1 ../plugins/switcher/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Quantità di opacità in percentuale" #: ../plugins/scale/scale.xml.in.h:2 msgid "Big" msgstr "Grande" # (ndt) mah... #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Associazioni pulsante commutazione modalità «Scala finestre»" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Associazioni pulsante per la commutazione della modalità «Scala finestre» " "invece di abilitarla quando premuto e disabilitarla quando rilasciato." #: ../plugins/scale/scale.xml.in.h:3 msgid "Click Desktop to Show Desktop" msgstr "Fare clic sulla scrivania per mostrarla" #: ../plugins/scale/scale.xml.in.h:4 msgid "Darken Background" msgstr "Scurire lo sfondo" #: ../plugins/scale/scale.xml.in.h:5 msgid "Darken background when scaling windows" msgstr "Scurisce lo sfondo durante il ridimensionamento delle finestre" #: ../plugins/scale/scale.xml.in.h:6 msgid "Emblem" msgstr "Simbolo" #: ../plugins/scale/scale.xml.in.h:7 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Entra nella modalità «Mostra scrivania» quando viene fatto clic sulla " "scrivania durante «Scala finestre»" #: ../plugins/scale/scale.xml.in.h:8 msgid "Hover Time" msgstr "Tempo passaggio del mouse" #: ../plugins/scale/scale.xml.in.h:9 msgid "Initiate Window Picker" msgstr "Avvia il selettore finestre" #: ../plugins/scale/scale.xml.in.h:10 msgid "Initiate Window Picker For All Windows" msgstr "Avvia selettore finestre per tutte le finestre" #: ../plugins/scale/scale.xml.in.h:11 msgid "Initiate Window Picker For Window Group" msgstr "Avvia selettore finestre per gruppo di finestre" #: ../plugins/scale/scale.xml.in.h:12 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Avvia selettore finestre per finestre in output corrente" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Associazioni tasto commutazione modalità «Scala finestre»" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Associazioni tasto per la commutazione della modalità «Scala finestre» invece " "di abilitarla quando premuto e disabilitarla quando rilasciato." #: ../plugins/scale/scale.xml.in.h:13 msgid "Layout and start transforming all windows" msgstr "Dispone e avvia la trasformazione di tutte le finestre" #: ../plugins/scale/scale.xml.in.h:14 msgid "Layout and start transforming window group" msgstr "Dispone e avvia la trasformazione del gruppo di finestre" #: ../plugins/scale/scale.xml.in.h:15 msgid "Layout and start transforming windows" msgstr "Dispone e avvia trasformazione finestre" #: ../plugins/scale/scale.xml.in.h:16 msgid "Layout and start transforming windows on current output" msgstr "Dispone e avvia la trasformazione delle finestre nell'output corrente" #: ../plugins/scale/scale.xml.in.h:19 msgid "On all output devices" msgstr "Su tutti i dispositivi di output" #: ../plugins/scale/scale.xml.in.h:20 msgid "On current output device" msgstr "Sul dispositivo corrente" #: ../plugins/scale/scale.xml.in.h:22 msgid "Overlay Icon" msgstr "Icona di sovrapposizione" #: ../plugins/scale/scale.xml.in.h:23 msgid "Overlay an icon on windows once they are scaled" msgstr "Sovrappone un'icona alle finestre dopo che sono state ridimensionate" #: ../plugins/scale/scale.xml.in.h:24 msgid "Scale" msgstr "Scala finestra" #: ../plugins/scale/scale.xml.in.h:25 msgid "Scale Windows" msgstr "Ridimensiona finestre" #: ../plugins/scale/scale.xml.in.h:26 msgid "Scale speed" msgstr "Velocità scala" #: ../plugins/scale/scale.xml.in.h:27 msgid "Scale timestep" msgstr "Intervallo scala" #: ../plugins/scale/scale.xml.in.h:28 msgid "Scale windows" msgstr "Ridimensiona le finestre" #: ../plugins/scale/scale.xml.in.h:29 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Indica dove scalare le finestre se sono utilizzati più dispositivi di output." #: ../plugins/scale/scale.xml.in.h:30 msgid "Space between windows" msgstr "Spazio tra le finestre" #: ../plugins/scale/scale.xml.in.h:31 msgid "Spacing" msgstr "Spaziatura" #: ../plugins/scale/scale.xml.in.h:33 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Tempo (in ms) prima che la modalità di scala venga terminata al passaggio " "del mouse su una finestra" #: ../plugins/scale/scale.xml.in.h:35 msgid "Windows that should be scaled in scale mode" msgstr "Tipi di finestre da ridimensionare nella modalità «Scala finestra»" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Apre le schermate con questa applicazione" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Directory" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Cattura schermata rettangolare" # (ndt) non è molto chiara in inglese # dovrebbe indicare l'applicazione da usare # per visualizzare le schermate #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Applicazione da eseguire" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Archivia le schermate in questa directory" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Cattura schermate" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Plugin per catturare schermate" # (ndt) anche qui... è più noto SVG che Svg #: ../plugins/imgsvg/imgsvg.xml.in.h:3 msgid "Svg" msgstr "SVG" #: ../plugins/imgsvg/imgsvg.xml.in.h:4 msgid "Svg image loader" msgstr "Caricatore immagini SVG" #: ../plugins/switcher/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Quantità di luminosità in percentuale" #: ../plugins/switcher/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Quantità di saturazione in percentuale" #: ../plugins/switcher/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Selettore applicazioni" #: ../plugins/switcher/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Rotazione automatica" #: ../plugins/switcher/switcher.xml.in.h:7 msgid "Bring To Front" msgstr "Portare in primo piano" #: ../plugins/switcher/switcher.xml.in.h:8 msgid "Bring selected window to front" msgstr "Porta la finestra selezionata in primo piano" # (ndt) indica un fattore di rimpicciolimento #: ../plugins/switcher/switcher.xml.in.h:9 msgid "Distance desktop should be zoom out while switching windows" msgstr "Distanza a cui spostare il desktop durante la selezione delle finestre" #: ../plugins/switcher/switcher.xml.in.h:11 msgid "Icon" msgstr "Icona" #: ../plugins/switcher/switcher.xml.in.h:12 msgid "Minimized" msgstr "Minimizzare" #: ../plugins/switcher/switcher.xml.in.h:14 msgid "Next Panel" msgstr "Pannello successivo" #: ../plugins/switcher/switcher.xml.in.h:15 msgid "Next window" msgstr "Finestra successiva" #: ../plugins/switcher/switcher.xml.in.h:16 msgid "Next window (All windows)" msgstr "Finestra successiva (tutte le finestre)" #: ../plugins/switcher/switcher.xml.in.h:17 msgid "Next window (No popup)" msgstr "Finestra successiva (nessun pop-up)" #: ../plugins/switcher/switcher.xml.in.h:19 msgid "Popup switcher if not visible and select next window" msgstr "Mostra il selettore se non visibile e seleziona la finestra successiva" #: ../plugins/switcher/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Mostra il selettore se non visibile e seleziona la finestra successiva tra " "tutte le altre finestre" #: ../plugins/switcher/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select previous window" msgstr "Mostra il selettore se non visibile e seleziona la finestra precedente" #: ../plugins/switcher/switcher.xml.in.h:22 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Mostra il selettore se non visibile e seleziona la finestra precedente tra " "tutte le altre finestre" #: ../plugins/switcher/switcher.xml.in.h:23 msgid "Prev Panel" msgstr "Panello precedente" #: ../plugins/switcher/switcher.xml.in.h:24 msgid "Prev window" msgstr "Finestra precedente" #: ../plugins/switcher/switcher.xml.in.h:25 msgid "Prev window (All windows)" msgstr "Finestra precedente (tutte le finestre)" #: ../plugins/switcher/switcher.xml.in.h:26 msgid "Prev window (No popup)" msgstr "Finestra precedente (nessun pop-up)" #: ../plugins/switcher/switcher.xml.in.h:27 msgid "Rotate to the selected window while switching" msgstr "Ruota verso la finestra selezionata durante la selezione" #: ../plugins/switcher/switcher.xml.in.h:29 msgid "Select next panel type window." msgstr "Seleziona il tipo di pannello di finestra successivo." #: ../plugins/switcher/switcher.xml.in.h:30 msgid "Select next window without showing the popup window." msgstr "Seleziona la finestra successiva senza mostrare la finestra pop-up." #: ../plugins/switcher/switcher.xml.in.h:31 msgid "Select previous panel type window." msgstr "Seleziona il tipo di pannello di finestra precedente" #: ../plugins/switcher/switcher.xml.in.h:32 msgid "Select previous window without showing the popup window." msgstr "Seleziona la finestra precedente senza mostrare la finestra pop-up." #: ../plugins/switcher/switcher.xml.in.h:33 msgid "Show icon next to thumbnail" msgstr "Mostra un'icona accanto all'anteprima" #: ../plugins/switcher/switcher.xml.in.h:34 msgid "Show minimized windows" msgstr "Mostra le finestre minimizzate" #: ../plugins/switcher/switcher.xml.in.h:36 msgid "Switcher speed" msgstr "Velocità selettore" #: ../plugins/switcher/switcher.xml.in.h:37 msgid "Switcher timestep" msgstr "Intervallo selettore" #: ../plugins/switcher/switcher.xml.in.h:38 msgid "Switcher windows" msgstr "Finestre da selezionare" #: ../plugins/switcher/switcher.xml.in.h:40 msgid "Windows that should be shown in switcher" msgstr "Tipi di finestre da visualizzare nel selettore" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Fornisce supporto per lo spazio colore YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Riproduzione video" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Riproduzione video" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Spazio colore YV12" #: ../plugins/water/water.xml.in.h:1 msgid "Add line" msgstr "Aggiungi linea" #: ../plugins/water/water.xml.in.h:2 msgid "Add point" msgstr "Aggiungi punto" #: ../plugins/water/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Aggiunge effetti acqua a diverse azioni del desktop" #: ../plugins/water/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Ritardo (in ms) tra le gocce di pioggia" #: ../plugins/water/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Abilita effetti acqua puntatore" #: ../plugins/water/water.xml.in.h:7 msgid "Line" msgstr "Linea" #: ../plugins/water/water.xml.in.h:8 msgid "Offset Scale" msgstr "Proporzioni" #: ../plugins/water/water.xml.in.h:9 msgid "Point" msgstr "Punto" #: ../plugins/water/water.xml.in.h:10 msgid "Rain Delay" msgstr "Ritardo pioggia" #: ../plugins/water/water.xml.in.h:11 msgid "Title wave" msgstr "Onda sul titolo" #: ../plugins/water/water.xml.in.h:12 msgid "Toggle rain" msgstr "Commuta pioggia" #: ../plugins/water/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Commuta l'effetto pioggia" #: ../plugins/water/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Commuta tergicristallo" #: ../plugins/water/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Commuta il tergicristallo" #: ../plugins/water/water.xml.in.h:16 msgid "Water Effect" msgstr "Effetto acqua" #: ../plugins/water/water.xml.in.h:17 msgid "Water offset scale" msgstr "Offset scala acqua" #: ../plugins/water/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Effetto onda dal titolo della finestra" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Effetto al focus" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Effetto finestra al focus" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Finestre per il focus" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Attrito" # (ndt) termine un po' così... # indica le finestre che dovrebbero essere tremolanti quando sono 'catturate' #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Finestre da afferrare" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Risoluzione griglia" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Aggancio finestre invertito" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Rende le finestre tremolanti" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Associa effetto" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Associa effetto finestra" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Finestre da associare" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Effetto alla massimizzazione" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Dimensione minima griglia" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Dimensione minima griglia vertex" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Finestre da muovere" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Tremolio" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Aggancio invertito" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Aggancia finestre" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Attrito della molla" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Costante della molla" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Costante della molla" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Commuta aggancio finestre" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Usa modello a molla per l'effetto delle finestre tremolanti" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Risoluzione griglia vertex" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" "Tipi di finestre a cui applicare l'effetto tremolante quando hanno il focus" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Tipi di finestre a cui applicare l'effetto tremolante quando afferrate" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Tipi di finestre a cui applicare l'effetto tremolante quando mappate" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Tipi di finestre a cui applicare l'effetto tremolante quando spostate" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" "Effetto tremolante alla massimizzazione/demassimizzazione delle finestre" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Finestre tremolanti" #~ msgid "Command line 0" #~ msgstr "Riga di comando 0" #~ msgid "Run command 0" #~ msgstr "Esegui comando 0" #~ msgid "Screenshot commands" #~ msgstr "Comandi cattura schermata" #~ msgid "Screenshot key bindings" #~ msgstr "Associazioni tasti per cattura schermata" #~ msgid "Filter Linear" #~ msgstr "Filtro lineare" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Usa il filtro lineare nell'ingrandimento" #~ msgid "Zoom Desktop" #~ msgstr "Ingrandisci desktop" #~ msgid "Zoom In" #~ msgstr "Aumenta ingrandimento" #~ msgid "Zoom Out" #~ msgstr "Riduci ingrandimento" #~ msgid "Zoom Pan" #~ msgstr "Panoramica" #~ msgid "Zoom Speed" #~ msgstr "Velocità zoom" #~ msgid "Zoom Timestep" #~ msgstr "Intervallo zoom" # (ndt) non capisco cosa centri il cubo... # dovrebbe funzionare anche senza... #~ msgid "Zoom and pan desktop cube" #~ msgstr "Ingrandisce ed esegue panoramiche del desktop" #~ msgid "Zoom factor" #~ msgstr "Fattore ingrandimento" #~ msgid "Zoom pan" #~ msgstr "Ingrandisce panoramica" #~ msgid "Decrease window opacity" #~ msgstr "Riduce l'opacità della finestra" #~ msgid "Increase window opacity" #~ msgstr "Aumenta l'opacità della finestra" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valori di opacità per le finestre che dovrebbero essere traslucide in " #~ "modo predefinito" #~ msgid "Opacity windows" #~ msgstr "Opacità finestre" #~ msgid "Background Images" #~ msgstr "Immagini di sfondo" #~ msgid "Background images" #~ msgstr "Immagini di sfondo" #~ msgid "Desktop Plane" #~ msgstr "Desktop piano" #~ msgid "Place windows on a plane" #~ msgstr "Posiziona le finestre su un piano" #~ msgid "Plane Down" #~ msgstr "Piano in giù" #~ msgid "Plane Left" #~ msgstr "Piano a sinistra" #~ msgid "Plane Right" #~ msgstr "Piano a destra" #~ msgid "Plane To Face 1" #~ msgstr "Vai al piano della faccia 1" #~ msgid "Plane To Face 10" #~ msgstr "Vai al piano della faccia 10" #~ msgid "Plane To Face 11" #~ msgstr "Vai al piano della faccia 11" #~ msgid "Plane To Face 12" #~ msgstr "Vai al piano della faccia 12" #~ msgid "Plane To Face 2" #~ msgstr "Vai al piano della faccia 2" #~ msgid "Plane To Face 3" #~ msgstr "Vai al piano della faccia 3" #~ msgid "Plane To Face 4" #~ msgstr "Vai al piano della faccia 4" #~ msgid "Plane To Face 5" #~ msgstr "Vai al piano della faccia 5" #~ msgid "Plane To Face 6" #~ msgstr "Vai al piano della faccia 6" #~ msgid "Plane To Face 7" #~ msgstr "Vai al piano della faccia 7" #~ msgid "Plane To Face 8" #~ msgstr "Vai al piano della faccia 8" #~ msgid "Plane To Face 9" #~ msgstr "Vai al piano della faccia 9" #~ msgid "Plane Up" #~ msgstr "Piano in su" #~ msgid "Plane down" #~ msgstr "Va al piano inferiore" #~ msgid "Plane left" #~ msgstr "Va al piano a sinistra" #~ msgid "Plane right" #~ msgstr "Va al piano a destra" #~ msgid "Plane to face 1" #~ msgstr "Va al piano 1" #~ msgid "Plane to face 10" #~ msgstr "Va al piano 10" #~ msgid "Plane to face 11" #~ msgstr "Va al piano 11" #~ msgid "Plane to face 12" #~ msgstr "Va al piano 12" #~ msgid "Plane to face 2" #~ msgstr "Va al piano 2" #~ msgid "Plane to face 3" #~ msgstr "Va al piano 3" #~ msgid "Plane to face 4" #~ msgstr "Va al piano 4" #~ msgid "Plane to face 5" #~ msgstr "Va al piano 5" #~ msgid "Plane to face 6" #~ msgstr "Va al piano 6" #~ msgid "Plane to face 7" #~ msgstr "Va al piano 7" #~ msgid "Plane to face 8" #~ msgstr "Va al piano 8" #~ msgid "Plane to face 9" #~ msgstr "Va al piano 9" # (ndt) devo ancora capirne l'utilità... # (ndt) descrizione plugin # (ndt) è il nome di una scheda # meglio stare sul corto # (ndt) pure questa è il nome di una scheda... # (ndt) lo so... lo so... a molti non andrà a genio! :) # (ndt) ometto skydome, tanto sono presenti solo tra le sue opzioni # (ndt) l'opzione per aprire il cubo e vedere le sue facce # quella superiore e inferiore non vengono contate... # (ndt) o principale? # (ndt) il funzionamento è questo: # prendere un oggetto, non una finestra, e cercare # di spostarlo in un'altra area di lavoro per far ruotare il cubo # (ndt) praticamente sposta il puntatore sul bordo di destra # (ndt) riesco a capire cosa faccia... # (ndt) mah... # (ndt) non è molto chiara in inglese # dovrebbe indicare l'applicazione da usare # per visualizzare le schermate # (ndt) termine un po' così... # indica le finestre che dovrebbero essere tremolanti quando sono 'catturate' #~ msgid "Plane up" #~ msgstr "Va al piano superiore" compiz-0.9.11+14.04.20140409/po/es.po0000644000015301777760000041701112321343002017063 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-07-13 00:59+0200\n" "Last-Translator: Franco Guevara \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Escritorio" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Ventana de Gestión" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ninguno" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Tonalidad" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximizada" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Maximizar ventana horizontalmente" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Maximizar ventana verticalmente" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimizar" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Elevación automática" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Bajar" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menú de ventanas" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Acción a tomar cuando se desplaza la rueda del ratón sobre una ventana de la " "barra de título." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Tipo de difuminado" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacidad de la ventana activa del tema de Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Opacidad de sombra de la ventana activa del tema de Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacidad del tema de Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Opacidad de sombra del tema de Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Opacidad al utilizar las ventanas activas con decoraciones del tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacidad a utilizar para las decoraciones tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Sombra de las ventanas activas con decoraciones de opaco a transparente del " "tema metacity " #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Sombra ventanas con decoraciones de opaco a transparente del tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Acción de rueda del ratón en la barra de título" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tipo de difuminado usado para decoraciones de ventana" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Usar el tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Usar el tema Metacity para dibujar las decoraciones de ventana" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Cerrar ventana" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Desmaximizar ventana" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximizar ventana" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimizar ventana" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Subir" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Adherir" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Anular sombra" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Desmarcar Sobre" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Despegar" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "La ventana \"%s\" no responde." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forzando la salida de la aplicación puede causar la pérdida de los datos que " "no haya guardado." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "Forzar salida" # Este es un plugin que permite escribir en la pantalla #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Anotar" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Color de relleno para Anotar" # Comentar color del stroke #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Color de trazo para Anotar" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "plugin Anotar" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Limpiar" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Dibujar" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Dibujar usando herramienta" # del plugin Anotar #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Color de relleno para anotaciones" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Iniciar" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Iniciar dibujo de Anotar" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Iniciar borrado de Anotar" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Iniciar borrado" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Ancho de línea" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Ancho de linea para anotaciones" # del plugin Anotar #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Color de Trazo para anotaciones" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Ancho de Trazo" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Ancho de Trazo para anotaciones" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "Bilineal 4x" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Desenfoque Alfa" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Ventanas con desenfoque Alfa" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtro de desenfoque" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Oclusión de desenfoque" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturación de desenfoque" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Velocidad de desenfoque" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Desenfocar Ventanas" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Desenfocar detras de las partes transparentes de las ventanas" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturación de desenfoque" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Desenfocar ventanas" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Desenfocar ventanas que no estan en primer plano" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Deshabilitar desenfoque de regiones de la pantalla tapadas por otras ventanas" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Método de filtrado usado para desenfoque" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Desenfoque de Foco" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Desenfoque de foco para ventanas" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussiano" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Radio Gaussiano" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Fuerza Gaussiana" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Radio Gaussiano" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Fuerza Gaussiana" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Muestra de textura independiente" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap nivel-de-detalle" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulso" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efecto de Pulso" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Usar las unidades de textura disponibles para crear tantas muestras de " "textura independiente como sea posible." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Velocidad de desenfoque de la ventana" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Ventanas que debieran ser afectadas por el desenfoque" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Ventanas que debieran usar desenfoque alfa por defecto" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Clonar salida" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Iniciar selección de clonación" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Manejador de clonación de salida" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Asignar combinaciones a comandos arbitrarios" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Combinaciones de botones" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Línea de comandos 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Línea de comandos 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Línea de comandos 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Línea de comandos 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Línea de comandos 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Línea de comandos 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Línea de comandos 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Línea de comandos 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Línea de comandos 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Línea de comandos 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Línea de comandos 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Línea de comandos 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command0 es invocado" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command1 es invocado" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command10 es invocado" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command11 es invocado" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command2 es invocado" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command3 es invocado" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command4 es invocado" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command5 es invocado" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command6 es invocado" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command7 es invocado" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command8 es invocado" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command9 es invocado" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Comandos" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Vinculaciones de bordes" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Combinaciones de teclas" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Ejecutar comando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Ejecutar comando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Ejecutar comando 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Ejecutar comando 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Ejecutar comando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Ejecutar comando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Ejecutar comando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Ejecutar comando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Ejecutar comando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Ejecutar comando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Ejecutar comando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Ejecutar comando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Plugins Activos" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Permitir que el dibujado de ventanas a pantalla completa no se redireccione " "a pixmaps de fuera de pantalla" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Timbre audible" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Pitido del sistema audible" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Elevación automática" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Retraso de elevación automática" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Detección automática de dispositivos de salida" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Detección automática de la frecuencia de actualización" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "El mejor" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Clic para enfocar" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Al hacer clic en la ventana se mueve el foco de entrada a ella" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Cierra la ventana activa" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Icono por defecto" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Imagen del icono de ventana por defecto" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Tamaño de Escritorio" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detectar salidas" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detectar frecuencia de actualización" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Opciones de presentación" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Tiempo que el puntero del ratón debe estar en el borde de la pantalla antes " "de que se lance la acción." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Retrazo del Disparador de Bordes" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rápido" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Enfocar y ampliar; Incrementar comportamiento" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Nivel de Prevención de Enfoque" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Ventanas de Prevención de Enfoque" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Ventanas de prevencion de foco" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Forzar el pintado de salida independiente." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Opciones Generales" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Opciones generales de Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bueno" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ocultar ventanas omitidas de barra de tareas" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Ocultar todas las ventanas y enfocar el escritorio" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Oculta las ventanas que no se encuentran en la barra de tareas al entrar en " "el modo de muestra de escritorio" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Alto" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Tamaño horizontal virtual" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "Si está disponible usar la compresión de texturas convertidas desde imágenes" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorar sugerencias al maximizar" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignorar sugerencias de aumento de tamaño y aspecto cuando la ventana esté " "maximizada" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervalo antes de elevar las ventanas seleccionadas" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervalo entre mensajes de ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Combinaciones de Teclas" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Nivel de prevención de atracción de enfoque" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Iluminación" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista de plugins activos actualmente" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lista de cadenas que describen los dispositivos de salida" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Bajo" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Bajar ventana" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Colocar la ventana por debajo de otras" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximizar ventana horizontalmente" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximizar ventana verticalmente" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximiza la ventana activa" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximiza la ventana activa horizontalmente" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximiza la ventana activa verticalmente" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimiza la ventana activa" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Número de escritorios" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Número de escritorios virtuales" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Apagado" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Sólo se llevan a cabo actualizaciones de la pantalla durante el período de " "borrado vertical" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Salidas" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Manejo de Salida de Traslapes" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Pintar independientemente la salida de cada dispositivo, inclusive si el " "dispositivo de salida se sobrepone" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Retardo de ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Preferir salidas grandes" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Preferir salidas pequeñas" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Alzar al hacer clic" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Elevar ventana" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Alza las ventanas seleccionadas tras el intervalo" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Elevar la ventana sobre las demás" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Alza las ventanas al hacer clic en ellas" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Frecuencia de actualización" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplicador de tamaño de pantalla para el tamaño horizontal virtual" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicador de tamaño de pantalla para el tamaño vertical virtual" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Mostar escritorio" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Ralentizar animaciones" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Modo inteligente" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sincronizar con borrado vertical" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Compresión de Textura" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtro de Textura" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtrado de Texturas" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Velocidad con la que se redibuja la pantalla (veces/segundo)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Activar o desactivar ventana maximizada" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Activar o desactivar ventana maximizada horizontalmente" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Activar o desactivar ventana maximizada verticalmente" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Activar o desactivar ventana con sombra" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Activa o desactiva la ventana activa maximizada" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Activa o desactiva la ventana activa maximizada horizontalmente" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Activa o desactiva la ventana activa maximizada verticalmente" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Activa o desactiva la ventana activa con sombra" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Activa o desactiva el uso de animaciones lentas" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Desmaximiza la ventana activa" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Anular redirección de ventanas a pantalla completa" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Usa luz indirecta cuando se transforma la pantalla" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Tamaño vertical virtual" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Muy Alto" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Cual de los dispositivos de salida de sobreposición debe ser preferido" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Botón vinculado al menú de ventana" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Tecla vinculada al menú de ventana" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Aceleración" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Ajuste de imagen" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Ajustar imagen de la cara superior a la rotación" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avanza a la siguiente diapositiva" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Cúpula animada" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Anima la cúpula cuando se gira el cubo" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Apariencia" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automático" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Comportamiento" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "El color de los lados superior e inferior del cubo" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Color utilizado para la parada de color inferior del degradado de vuelta " "atrás de la cúpula" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Color utilizado para la parada de color superior del degradado de vuelta " "atrás de la cúpula" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Capas del cubo" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Color del cubo" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cubo de escritorio" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Aceleración del pliegue" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Velocidad del pliegue" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Paso del pliegue" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "Generar mipmap cuando sea posible para obtener una escala de mayor calidad" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Vuelve a la diapositiva anterior" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Archivos de imagen" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Imagen que se usará como textura de la cúpula" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Iniciar transparencia de Cubo sólo si la rotación es manejada por el mouse" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Cubo interior" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Cubo interior" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista de archivos PNG y SVG que se deben procesar en la cara superior del " "cubo" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Modo de multi salidas" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Multiples cubos" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Diapositiva siguiente" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Un cubo grande" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacidad durante rotacion" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacidad cuando no esta rotando" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacidad de la ventana de escritorio durante rotacion" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacidad de la ventana de escritorio cuando no esta rotando" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Coloca las ventanas en un cubo" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Diapositiva anterior" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Procesar cúpula" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Escalar imagen" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Escala las imágenes para que cubran la cara superior del cubo" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Seleccione como va a ser visualizado el cubo si son usados multiples " "disporitivos de salida" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Cúpula" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Color de fin del degradado de cúpula" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Color de inicio del degradado de cúpula" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Imagen de cúpula" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Velocidad" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Paso" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Transparencia Sólo al Rotar con el Mouse" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Cubo Transparente" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Desplegar" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Despliega el cubo" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Herramienta de Control de Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Permite generar mipmaps para las texturas de decoración" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Comando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Decoracion de ventanas" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Línea de comando del decorador que se ejecuta si no hay ningún decorador en " "ejecución" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Desechar desplazamiento X de la sombra" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Desechar desplazamiento Y de la sombra" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Desechar color de la sombra" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Desechar opacidad de la sombra" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Desechar radio de la sombra" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Color de la sombra" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Desplazamiento X de la sombra" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Desplazamiento Y de la sombra" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacidad de la sombra" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Radio de la sombra" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Sombra de la ventana" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Decoración de ventanas" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "La decoración de las ventanas" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Ventanas que deben estar decoradas" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Ventanas que deben tener sombra" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Brillo (en %) de las ventanas que no respondan" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Velocidad constante" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Tiempo constante" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Atenuar las ventanas que no respondan" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Atenuar las ventanas que no estén respondiendo las peticiones del gestor de " "ventanas" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Modo de desvanecimiento" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Desvanecer en Minimizar/Abrir/Cerrar" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Velocidad de desvanecimiento" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Tiempo de desvanecimiento" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Efecto de desvanecimiento cuando minimizas/abres/cierras ventanas" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efecto de desvanecimiento con pitido del sistema" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Las ventanas aparecen progresivamente cuando se asignan y se desvanecen " "cuando se desasignan" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Desvanecer ventanas" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Desvanecer ventanas" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Timbre visual a pantalla completa" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" "Efecto de desvanecimiento a pantalla completa con el pitido del sistema" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Saturación (en %) de las ventanas que no respondan" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Brillo de las ventanas que no respondan" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Saturación de las ventanas que no respondan" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Timbre visual" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Modo de desvanecimiento de ventana" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" "Velocidad de desvanecimiento de ventana cuando \"Velocidad constante\" está " "activado" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" "Tiempo de desvanecimiento (en ms) de ventana cuando \"Tiempo constante\" está " "activado" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Ventanas que deberían desvanecerse" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Punto de Montaje" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Punto de Montaje" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Sistema de Archivos del Espacio de Usuario" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Sistema de archivos del espacio de usuario" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Herramienta de control de Gconf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "soporte de loop principal de GLib " #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Compatibilidad de Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Abrir terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Opciones que mantienen a Compiz compatible con Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Ejecutar diálogo" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Ejecutar comando de terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Línea de comandos de captura de pantalla" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Mostrar menú principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Mostrar el cuadro de diálogo de ejecución de aplicación" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Muestra el menú principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Capturar la pantalla" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Toma una captura de pantalla de una ventana" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Línea de comandos para abrir Terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Línea de comandos de captura de ventana" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Herramienta de Archivo Plano Ini" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Complemento de notificacion de cambio de archivo" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Herramienta de Control Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efecto Minimizar" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimizar ventanas" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Velocidad al minimizar" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Paso al minimizar" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Resistencia de decoloración" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Resistencia a la decoloración" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transforma las ventanas cuando se minimizan o desminimizan" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Tipos de ventana que deben transformarse al minimizarlas" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Limitar Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Limita la coordenada Y al área de trabajo" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "No actualizar la posición en el servidor de ventanas hasta que terminan de " "moverse" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Iniciar movimiento de ventana" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Posicionamiento Flojo" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Mover ventana" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Mueve la ventana" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacidad" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Nivel de opacidad de las ventanas en movimiento" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Separar y desmaximizar automáticamente ventanas maximizadas al arrastrar" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Separar ventanas maximizadas" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Empieza a mover la ventana" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Brillo" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Disminuir brillo" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Aumentar brillo" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Paso de brillo" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Brillo de las ventanas" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Disminuir" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Aumentar" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Disminuir opacidad" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Aumentar opacidad" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Paso de opacidad" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Opacidad de las ventanas" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Opacidad, brillo y saturación" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Ajustes de opacidad, brillo y saturación" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturación" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Disminuir saturación" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Aumentar saturación" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Paso de saturación" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Saturación de las ventanas" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Paso" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Opciones especifícas de la ventana" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Valores de las ventanas" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Ventanas" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Ventanas que deberían tener un brillo diferente por defecto" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Ventanas que deberían tener una opacidad diferente por defecto" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Ventanas que deberían tener una saturación diferente por defecto" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmo a emplear para el posicionamiento de ventanas" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Cascada" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centrado" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Fijar el posicionamiento de ventanas" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Forzar el posicionamiento de las ventanas" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Posiciones de los puntos de vista horizontales" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Mantener en el área de trabajo" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Mantener la ventana posicionada en el área de trabajo, inclusio si eso " "implicase que la posición difiera de la posición específica" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Colocar ventanas" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Colocar en todas las salidas" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Coloca las ventanas en sus lugares adecuados en la asignación" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Modo de Posicionamiento" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Ventanas Posicionadas" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Aleatorio" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Selecciona como debe comportarse el acomodamiento de ventanas si se " "selecciona multipes salidas" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Inteligente" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Usar el dispositivo de salida activo" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Usar el dispositivo de salida de la ventana enfocada" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Usar el dispositivo de salida con apuntador" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Posiciones de viewport verticales" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Ventanas posicionadas en viewport" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Procedimientos para posicionamiento de ventanas" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Ventanas que deben posicionarse por defecto" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Ventanas que deben posicionarse en viewports específicos por defecto" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Ventanas que deben ser colocadas forzosamente, inclusive si indican que el " "administrador de ventanas debe evitar colocarlas" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Ventanas con posiciones fijas" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Ventanas con punto de vista fijo" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Soluciones alternativas" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Posiciones X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Posiciones de Viewport X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Valores de posición X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Posiciones Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Posiciones de Viewport Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Valores de posición Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Cargador de imágenes Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Regex Coincidir" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Regex coincidir ventanas" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Vínculos" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Color de borde" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Color de borde usado para modos de cambiar tamaño línea exterior y " "rectángulo" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Modo de Cambio de Tamaño por defecto" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Modo usado por defecto para cambiar tamaño de ventanas" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Color de relleno" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Color de relleno usado por el modo de cambio de tamaño rectangulo" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Iniciar cambio de tamaño de ventanas normal" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Iniciar cambio de tamaño de ventanas linea exterior" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Iniciar cambio de tamaño de ventanas rectangulo" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Iniciar cambio de tamaño de ventanas estirar" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Iniciar cambio de tamaño de ventanas" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Cambiar Tamaño Ventanas Normal" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Linea Exterior" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Cambio Tamaño Ventanas Linea Exterior" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rectángulo" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Cambio Tamaño Ventanas Rectángulo" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Cambiar de tamaño la ventana" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Cambia de tamaño la ventana" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Empieza a cambiar el tamaño de la ventana" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Empieza a cambiar el tamaño de la ventana estirándola" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Empieza a cambiar el tamaño de la ventana normalmente" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Empieza a cambiar el tamaño de la ventana con linea exterior" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Empieza a cambiar el tamaño de la ventana con rectángulo" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Estirar" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Cambiar Tamaño Ventana Estirar" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Ventanas que deben usar cambio de tamaño normal" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Ventanas que deben usar cambio de tamaño con linea exterior" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Ventanas que deben usar cambio de tamaño con rectángulo" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Ventanas que deben usar cambio de tamaño con estiramiento" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD Inversión de Borde" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Mover Inversión de Borde" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Puntero Inversión de Borde" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Tiempo de inversión" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Invertir a viewport izquierdo y doblar puntero" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Se invierte al punto de vista siguiente al arrastrar un objeto al borde de " "la pantalla" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Se invierte al punto de vista siguiente al arrastrar un puntero al borde de " "la pantalla" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Se invierte al punto de vista siguiente al mover una ventana al borde de la " "pantalla" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Invertir a punto de vista derecho y doblar puntero" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Invertir eje Y para movimiento de puntero" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Invertir Y en puntero" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilidad del puntero" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Elevar durante la rotación" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Elevar ventanas durante la rotación" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Girar cubo" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Girar a inversión izquierda" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Girar a inversión derecha" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Girar a la izquierda" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Girar a la izquierda con ventana" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Girar a la derecha" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Girar a la derecha con ventana" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Girar a" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Girar a la Cara 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Girar a la Cara 1 con Ventana" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Girar a la Cara 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Girar a la Cara 10 con Ventana" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Girar a la Cara 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Girar a la Cara 11 con ventana" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Girar a la Cara 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Girar a la Cara 12 con ventana" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Girar a la Cara 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Girar a la Cara 2 con ventana" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Girar a la Cara 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Girar a la Cara 3 con ventana" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Girar a la Cara 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Girar a la Cara 4 con ventana" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Girar a la Cara 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Girar a la Cara 5 con ventana" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Girar a la Cara 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Girar a la Cara 6 con ventana" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Girar a la Cara 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Girar a la Cara 7 con ventana" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Girar a la Cara 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Girar a la Cara 8 con ventana" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Girar a la Cara 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Girar a la Cara 9 con ventana" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Girar cubo" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Girar cubo del escritorio" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Girar a la izquierda" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Gira a la izquierda y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Girar a la derecha" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Gira a la derecha y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Girar a la cara del cubo" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Rotar la cara del cubo con la ventana" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Girar a la cara 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Girar a la cara 1 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Girar a la cara 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Girar a la cara 10 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Girar a la cara 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Girar a la cara 11 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Girar a la cara 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Girar a la cara 12 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Girar a la cara 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Girar a la cara 2 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Girar a la cara 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Girar a la cara 3 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Girar a la cara 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Girar a la cara 4 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Girar a la cara 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Girar a la cara 5 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Girar a la cara 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Girar a la cara 6 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Girar a la cara 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Girar a la cara 7 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Girar a la cara 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Girar a la cara 8 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Girar a la cara 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Girar a la cara 9 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Girar a viewport" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Girar ventana" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Girar con ventana" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Aceleración de giro" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Velocidad de giro" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Paso de giro" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoom de giro" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilidad de movimiento del puntero" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Solapa el giro del cubo hacia la cara inferior" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Solapa el giro del cubo hacia la cara superior" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Solapar hacia la cara inferior" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Solapar hacia la cara superior" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Iniciar giro" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tiempo límite antes de invertir viewport" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Porcentaje de opacidad" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Grande" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Combinaciones de botones para alternar al modo escalado" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Combinaciones de botones para alternar al modo escalado en vez de " "habilitarlo cuando es presionado y deshabilitarlo cuando es liberado." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Hacer Click en el Escritorio para Mostrar Escritorio" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Oscurecer fondo" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Oscurecer el fondo al escalar las ventanas" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblema" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Mostrar Escritorio cuando el Escritorio es pinchado durante el Escalado" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Tiempo de desplazamiento" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Iniciar selector de ventanas" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Iniciar selector de ventanas para todas las ventanas" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Iniciar selector de ventanas para un grupo de ventanas" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Iniciar selector de ventanas para las ventanas de la salida actual" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Combinaciones de teclas para alternar al modo escalado" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Combinaciones de teclas para alternar al modo escalado en vez de habilitarlo " "cuando es presionado y deshabilitarlo cuando es liberado" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Diseñar y empezar a transformar todas las ventanas" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Diseñar y empezar a transformar un grupo de ventanas" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Disponer e iniciar transformación de ventanas" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Diseñar y empezar a transformar las ventanas de la salida actual" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "En todos los dispositivos de salida" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "En el dispositivo de salida actual" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Superponer icono" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Superponer un icono sobre las ventanas cuando se escalen" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Escalar" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Escalar ventanas" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Velocidad de escala" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Paso de escala" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Escalar ventanas" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Seleccionar qué ventanas escalar si se usan múltiples dispositivos de salida" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Espacio entre ventanas" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Espaciado" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Tiempo en milisegundos para finalizar el modo de escala al desplazar el " "cursor sobre una ventana" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Ventanas que se deben escalar en el modo de escala" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Automaticamente toma una captura de pantalla en esta aplicación" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Carpeta" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Inicia captura de pantalla rectangular" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Iniciar Aplicación" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Poner capturas de pantalla en esta carpeta" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Captura de Pantalla" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Plugin de captura de pantalla" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Cargador de imágenes Svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Porcentaje de brillo" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Porcentaje de saturación" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Cambiador de Aplicaciones" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Auto Rotación" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Traer al Frente" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Arrastra la ventana seleccionada al primer plano" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Escritorio distante debe alejarse mientras se intercambian las ventanas" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Icono" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimizada" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Panel siguiente" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Ventana siguiente" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Ventana siguiente (Todas las ventanas)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Ventana siguiente (Sin emerger)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" "Mostrar el conmutador si no está visible y seleccionar la ventana siguiente" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Mostrar el conmutador si no está visible y seleccionar la siguiente ventana " "del conjunto total de ventanas" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" "Mostrar el conmutador si no está visible y seleccionar la ventana anterior" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Mostrar el conmutador si no está visible y seleccionar la ventana anterior " "del conjunto total de ventanas" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Panel anterior" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Ventana ant" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Ventana ant (Todas las ventanas)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Ventana ant (Sin Emerger)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Girar a la ventana seleccionada mientras conmuta" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Seleccionar la ventana del tipo de panel siguiente" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Seleccionar la ventana siguiente sin mostrar la ventana emergente" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Seleccionar la ventana del tipo de panel anterior" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Seleccionar la ventana anterior sin mostrar la ventana emergente" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Muestra el icono junto a la miniatura" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Muestra ventanas minimizadas" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Velocidad de conmutador" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Paso de conmutador" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Conmutar Ventanas" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Ventanas que deben mostrarse en el conmutador" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Proveer soporte para el espacio de color YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Reproducción de Video" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Reproducción de video" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Espacio de color YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Añadir línea" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Añadir punto" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Añadir efecto acuático a distintas acciones de escritorio" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Retraso (en milisegundos) entre gotas de lluvia" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Habilitar efectos acuáticos del puntero" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Línea" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Escala de desplazamiento" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punto" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Retraso de lluvia" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Ola en el título" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Activa o desactiva la lluvia" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Activa o desactiva el efecto de lluvia" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Alternar limpiaparabrisas" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Alternar efecto de limpiaparabrisas" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efecto acuático" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Escala de desplazamiento de agua" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efecto de ola desde el título de la ventana" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efecto Enfocar" # clients/inst_resize_ui.ycp:691 # clients/inst_resize_ui.ycp:691 # clients/inst_resize_ui.ycp:691 #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efecto Enfocar Ventanas" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Enfocar Ventanas" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Fricción" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Agarrar Ventanas" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Resolución de la cuadrícula" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Solapamiento de ventanas invertido" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Hacer que la ventana tiemble" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Asignar efecto" # clients/inst_resize_ui.ycp:691 # clients/inst_resize_ui.ycp:691 # clients/inst_resize_ui.ycp:691 #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Asignar efecto de ventana" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Asignar ventanas" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efecto Maximizar" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Tamaño mínimo de cuadrícula" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Tamaño mínimo de cuadrícula de vértice" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Mover Ventanas" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Temblor" # 52895 AttribValues/label #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Solapamiento inverso" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Solapar ventanas" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fricción de tensión" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Constante de tensión" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Constante de tensión" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Activa o desactiva el solapamiento de ventanas" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Usa el modelo de muelle para el efecto de ventana gelatinosa" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Resolución de cuadrícula de vértice" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Ventanas que deben ondear al enfocarse" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Ventanas que deben ondear al agarrarse" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Ventanas que deben ondear al asignarse" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Ventanas que deben ondear al moverse" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efecto gelatinoso al maximizar o desmaximizar las ventanas" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Ventanas Gelatinosas" #~ msgid "Command line 0" #~ msgstr "Línea de comandos 0" #~ msgid "Run command 0" #~ msgstr "Ejecutar comando 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Línea de comandos de captura de pantalla" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Línea de comandos de captura de pantalla" #~ msgid "Filter Linear" #~ msgstr "Filtro lineal" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Usa el filtro lineal cuando se hace un acercamiento" #~ msgid "Zoom Desktop" #~ msgstr "Zoom de Escritorio" #~ msgid "Zoom In" #~ msgstr "Ampliar" #~ msgid "Zoom Out" #~ msgstr "Reducir" #~ msgid "Zoom Pan" #~ msgstr "Panoramico" #~ msgid "Zoom Speed" #~ msgstr "Velocidad de zoom" #~ msgid "Zoom Timestep" #~ msgstr "Paso de zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zoom y panorámica del cubo de escritorio" #~ msgid "Zoom factor" #~ msgstr "Factor de zoom" #~ msgid "Zoom pan" #~ msgstr "Panorámica" #~ msgid "Decrease window opacity" #~ msgstr "Disminuye la opacidad de la ventana" #~ msgid "Increase window opacity" #~ msgstr "Aumenta la opacidad de la ventana" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valores de opacidad para ventanas que deberían ser translúcidas por " #~ "defecto" #~ msgid "Opacity window values" #~ msgstr "Valores de opacidad de ventanas" #~ msgid "Opacity windows" #~ msgstr "Opacidad de ventanas" #~ msgid "Background Images" #~ msgstr "Imagenes de fondo" #~ msgid "Background images" #~ msgstr "Imagenes de fonde" #~ msgid "Place windows on a plane" #~ msgstr "Posiciona las ventanas en un plano" #~ msgid "Plane Down" #~ msgstr "Plano Abajo" #~ msgid "Plane Left" #~ msgstr "Plano Izquierda" #~ msgid "Plane Right" #~ msgstr "Plano Derecha" #~ msgid "Plane To Face 1" #~ msgstr "Plano a Cara 1" #~ msgid "Plane To Face 10" #~ msgstr "Plano a Cara 10" #~ msgid "Plane To Face 11" #~ msgstr "Plano a Cara 11" #~ msgid "Plane To Face 12" #~ msgstr "Plano a Cara 12" #~ msgid "Plane To Face 2" #~ msgstr "Plano a Cara 2" #~ msgid "Plane To Face 3" #~ msgstr "Plano a Cara 3" #~ msgid "Plane To Face 4" #~ msgstr "Plano a Cara 4" #~ msgid "Plane To Face 5" #~ msgstr "Plano a Cara 5" #~ msgid "Plane To Face 6" #~ msgstr "Plano a Cara 6" #~ msgid "Plane To Face 7" #~ msgstr "Plano a Cara 7" #~ msgid "Plane To Face 8" #~ msgstr "Plano a Cara 8" #~ msgid "Plane To Face 9" #~ msgstr "Plano a Cara 9" #~ msgid "Plane Up" #~ msgstr "Plano Arriba" #~ msgid "Plane down" #~ msgstr "Plano abajo" #~ msgid "Plane left" #~ msgstr "Plano izquierda" #~ msgid "Plane right" #~ msgstr "Plano derecha" #~ msgid "Plane to face 1" #~ msgstr "Plano a cara 1" #~ msgid "Plane to face 10" #~ msgstr "Plano a cara 10" #~ msgid "Plane to face 11" #~ msgstr "Plano a cara 11" #~ msgid "Plane to face 12" #~ msgstr "Plano a cara 12" #~ msgid "Plane to face 2" #~ msgstr "Plano a cara 2" #~ msgid "Plane to face 3" #~ msgstr "Plano a cara 3" #~ msgid "Plane to face 4" #~ msgstr "Plano a cara 4" #~ msgid "Plane to face 5" #~ msgstr "Plano a cara 5" #~ msgid "Plane to face 6" #~ msgstr "Plano a cara 6" #~ msgid "Plane to face 7" #~ msgstr "Plano a cara 7" #~ msgid "Plane to face 8" #~ msgstr "Plano a cara 8" #~ msgid "Plane to face 9" #~ msgstr "Plano a cara 9" #~ msgid "Plane up" #~ msgstr "Plano arriba" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Tiempo de desvanecimiento de opacidad para ventanas del escritorio" #~ msgid "Open window menu" #~ msgstr "Abre el menú de la ventana" #~ msgid "Dock" #~ msgstr "Anclar" #~ msgid "Toolbar" #~ msgstr "Barra de herramientas" #~ msgid "Menu" #~ msgstr "Menú" #~ msgid "Utility" #~ msgstr "Utilidad" #~ msgid "Splash" #~ msgstr "Pantalla inicial" #~ msgid "Dialog" #~ msgstr "Cuadro de diálogo" #~ msgid "DropdownMenu" #~ msgstr "Menú desplegable" #~ msgid "PopupMenu" #~ msgstr "Menú emergente" #~ msgid "Tooltip" #~ msgstr "Sugerencia" #~ msgid "Notification" #~ msgstr "Notificación" #~ msgid "Combo" #~ msgstr "Combo" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "Cuadro de diálogo modal" #~ msgid "Fullscreen" #~ msgstr "Pantalla completa" #~ msgid "Unknown" #~ msgstr "Desconocido" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command10" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command1" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command10" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command11" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command2" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command3" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command4" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command5" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command6" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command7" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command8" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command9" #, fuzzy #~ msgid "" #~ "Add line (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Add point (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Advance to next slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Porcentaje de brillo" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Porcentaje de opacidad" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Porcentaje de saturación" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Saturación" #, fuzzy #~ msgid "" #~ "Clear (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Close active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Decrease window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Retraso (en milisegundos) entre gotas de lluvia" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "" #~ "Distancia de alejamiento al reducir mientras se intercambian las ventanas" #~ msgid "Do not modify" #~ msgstr "No modificar" #, fuzzy #~ msgid "" #~ "Draw using tool (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Desechar desplazamiento X de la sombra" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Desechar desplazamiento Y de la sombra" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Desechar opacidad de la sombra" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Desechar radio de la sombra" #, fuzzy #~ msgid "" #~ "Enable pointer water effects (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Flip to left viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Flip to right viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Enfocar efecto de ventana (ninguno, temblor)" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Seleccionar la ventana anterior" #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Aceleración de pliegue (de 1,0 a 20,0)" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Velocidad de pliegue (de 0,1 a 50,0)" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Paso de pliegue (de 0,1 a 50,0)" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Federación Rusa" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Ruso" #, fuzzy #~ msgid "" #~ "Go back to previous slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Hide all windows and focus desktop (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Increase window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Initiate annotate drawing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Initiate annotate erasing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Initiate clone selection (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Initiate rectangle screenshot (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "Intervalo antes de elevar las ventanas seleccionadas" #, fuzzy #~ msgid "" #~ "Layout and start transforming all windows (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Layout and start transforming window group (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "Diseñar y empezar a transformar las ventanas de la salida actual" #, fuzzy #~ msgid "" #~ "Lower window beneath other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Make window shiver (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Asignar efecto de ventana (ninguno, temblor)" #, fuzzy #~ msgid "" #~ "Maximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Maximize active window horizontally (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Maximize active window vertically (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Minimize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Velocidad de minimización (de 0,1 a 50,0)" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Velocidad de minimización (de 0,1 a 50,0)" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Tamaño mínimo de cuadrícula de vértice" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Número de escritorios virtuales" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Paso de cambio de opacidad" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Nivel de opacidad de las ventanas en movimiento" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Nivel de opacidad de las ventanas en movimiento" #, fuzzy #~ msgid "" #~ "Open a terminal (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Open window menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "Superponer un icono sobre las ventanas cuando se escalen" #, fuzzy #~ msgid "" #~ "Plane down (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane up (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #~ msgid "Plugins that this must load before" #~ msgstr "Complementos que esto debe cargar antes" #~ msgid "Plugins that this requires" #~ msgstr "Complementos que esto requiere" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Mostrar el conmutador si no está visible y seleccionar la siguiente " #~ "ventana del conjunto total de ventanas" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Mostrar el conmutador si no está visible y seleccionar la siguiente " #~ "ventana del conjunto total de ventanas" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Mostrar el conmutador si no está visible y seleccionar la ventana " #~ "anterior del conjunto total de ventanas" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Mostrar el conmutador si no está visible y seleccionar la ventana " #~ "anterior del conjunto total de ventanas" #, fuzzy #~ msgid "" #~ "Pulse effect (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Raise window above other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate left and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate right and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to viewport (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate with window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Aceleración de pliegue (de 1,0 a 20,0)" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Velocidad de zoom (de 0,1 a 50,0)" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Paso de ampliar/reducir (de 0,1 a 50,0)" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Velocidad de escala (de 0,1 a 50,0)" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Paso de escala (de 0,1 a 50,0)" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "" #~ "Multiplicador de tamaño de pantalla para el tamaño horizontal virtual" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "Multiplicador de tamaño de pantalla para el tamaño vertical virtual" #, fuzzy #~ msgid "" #~ "Select next window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Select previous window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Sensibilidad de movimiento del puntero" #~ msgid "Shade resistance (0-100)" #~ msgstr "Resistencia de sombra (de 0 a 100)" #, fuzzy #~ msgid "" #~ "Show Run Application dialog (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Show the main menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Espacio entre ventanas" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Fricción de tensión" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Constante de tensión" #, fuzzy #~ msgid "" #~ "Start Rotation (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Start moving window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Start resizing window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Velocidad de escala (de 0,1 a 50,0)" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Paso de escala (de 0,1 a 50,0)" #, fuzzy #~ msgid "" #~ "Take a screenshot (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Take a screenshot of a window (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Filtrado de texturas (rápido, bueno, mejor)" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "Velocidad con la que se redibuja la pantalla (veces por segundo)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Tiempo en milisegundos para finalizar el modo de escala al desplazar el " #~ "cursor sobre una ventana" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Tiempo límite antes de invertir viewport" #, fuzzy #~ msgid "" #~ "Toggle active window maximized (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized horizontally (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized vertically (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle active window shaded (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle rain effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle use of slow animations (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle window snapping (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle wiper effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #~ msgid "USe linear filter when zoomed in" #~ msgstr "Usa el filtro lineal cuando se acerca la imagen" #, fuzzy #~ msgid "" #~ "Unfold cube (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Unmaximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Resolución de cuadrícula de vértice" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Escala de desplazamiento de agua" #, fuzzy #~ msgid "" #~ "Wave effect from window title (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Velocidad de desvanecimiento de ventana" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Velocidad de desvanecimiento de ventana" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Tipos de ventana que deben desvanecerse" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Tipos de ventana que deben desvanecerse" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Tipos de ventana que deben desvanecerse" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Tipos de ventana que deben desvanecerse" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "Tipos de ventanas que se deben escalar en el modo de escala" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Tipos de ventanas que deben mostrarse en el conmutador" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Tipos de ventana que deben transformarse al minimizarlas" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Tipos de ventana que deben desvanecerse" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Tipos de ventana que deben temblar al enfocarse" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "Tipos de ventana que deben temblar al obtenerse" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Tipos de ventana que deben temblar al asignarse" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Tipos de ventana que deben temblar al moverse" #, fuzzy #~ msgid "" #~ "Zoom In (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Zoom Out (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Velocidad de zoom (de 0,1 a 50,0)" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Paso de ampliar/reducir (de 0,1 a 50,0)" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Factor de zoom" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Girar a cara %d" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Girar a cara %d" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Girar a cara %d con la ventana" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "Girar a cara %d y traer la ventana activa" #~ msgid "Rotate To Face %d" #~ msgstr "Girar a cara %d" #~ msgid "Rotate to face %d" #~ msgstr "Girar a cara %d" #~ msgid "Rotate To Face %d with Window" #~ msgstr "Girar a cara %d con la ventana" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "Girar a cara %d y traer la ventana activa" #~ msgid "Command line %d" #~ msgstr "Línea de comando %d" #~ msgid "Command line to be executed in shell when run_command%d is invoked" #~ msgstr "" #~ "Línea de comando que se debe ejecutar en la shell al invocar run_command%d" #~ msgid "Run command %d" #~ msgstr "Ejecutar el comando %d" #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command%d" #~ msgstr "" #~ "Asociación de teclas que, al invocarse, ejecuta el comando de shell " #~ "identificado por el comando %d" #~ msgid "Move Window Types" #~ msgstr "Mover ventanas de tipo" #~ msgid "Corners" #~ msgstr "Esquinas" #~ msgid "Focus window when mouse moves over them" #~ msgstr "Enfoca las ventanas al pasar el ratón sobre ellas" #~ msgid "Initiate All Windows" #~ msgstr "Iniciar todas las ventanas" #~ msgid "Initiate Keyboard Window Move" #~ msgstr "Iniciar movimiento de ventana de teclado" #~ msgid "Initiate Keyboard Window Resize" #~ msgstr "Iniciar cambio de tamaño de ventana de teclado" #~ msgid "Initiate Window Switcher" #~ msgstr "Iniciar conmutador de ventanas" #~ msgid "Modifier to show switcher for all windows" #~ msgstr "Modificador para mostrar el conmutador de todas las ventanas" #~ msgid "Return from scale view" #~ msgstr "Volver desde la vista a escala" #~ msgid "Show switcher" #~ msgstr "Muestra el conmutador" #~ msgid "Sloppy Focus" #~ msgstr "Enfoque aproximado" #~ msgid "Start moving window using keyboard" #~ msgstr "Empieza a mover la ventana mediante el teclado" #~ msgid "Terminate" #~ msgstr "Interrumpir" #~ msgid "Water effect on system beep" #~ msgstr "Efecto acuático con el pitido del sistema" #~ msgid "" #~ "Window types that should be fading (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que se deben desvanecer (Escritorio, Dock, Barra de " #~ "herramientas, Menús, Utilidades, Inicial, Diálogos, Diálogo de modos, " #~ "Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should be transformed when minimized (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgstr "" #~ "Tipos de ventanas que se deben transformar al minimizarse (Escritorio, " #~ "Dock, Barra de herramientas, Menús, Utilidades, Inicial, Diálogos, " #~ "Diálogo de modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should scaled in scale mode (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que deben cambiar de tamaño en el modo de escala " #~ "(Escritorio, Dock, Barra de herramientas, Menús, Utilidades, Inicial, " #~ "Diálogos, Diálogo de modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should shown in switcher (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que se deben mostrar en el conmutador (Escritorio, " #~ "Dock, Barra de herramientas, Menús, Utilidades, Inicial, Diálogos, " #~ "Diálogo de modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should wobble when focused (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que deben temblar cuando se enfoquen (Escritorio, Dock, " #~ "Barra de herramientas, Menús, Utilidades, Inicial, Diálogos, Diálogo de " #~ "modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should wobble when grabbed (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que deben temblar cuando se recuperen (Escritorio, " #~ "Dock, Barra de herramientas, Menús, Utilidades, Inicial, Diálogos, " #~ "Diálogo de modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should wobble when mapped (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que deben temblar cuando se asignen (Escritorio, Dock, " #~ "Barra de herramientas, Menús, Utilidades, Inicial, Diálogos, Diálogo de " #~ "modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should wobble when moved (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que deben temblar cuando se muevan (Escritorio, Dock, " #~ "Barra de herramientas, Menús, Utilidades, Inicial, Diálogos, Diálogo de " #~ "modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "Wobble effect on system beep" #~ msgstr "Efecto gelatinoso con pitido del sistema" compiz-0.9.11+14.04.20140409/po/bg.po0000644000015301777760000030546512321343002017055 0ustar pbusernogroup00000000000000# Bulgarian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) SuSE GmbH, 2000. # Dimitar Boin , 2000. # Y Gonch , 2000. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-05-20 00:43+0200\n" "Last-Translator: Svetoslav Stefanov \n" "Language-Team: Bulgarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=0;\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Работен плот" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Мениджър на прозорци" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 #: ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Без избор" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "СÑнка" #: ../gtk/gnome/compiz-window-manager.c:428 #: ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "УголемÑване" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Хоризонтално макÑимизиране" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Вертикално макÑимизиране" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "ÐамалÑване" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Издигане" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Снижаване" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Меню на прозорец" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "ДейÑтвие което да бъде предприето при движение на колелцето на мишката върху " "заглавната лента на прозорец." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Тип размиване" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "ПрозрачноÑÑ‚ на Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ† при тема на Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "ПрозрачноÑÑ‚ на темата на Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "ПрозрачноÑÑ‚ за декорациите от темите на Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" # Can't find bulgarian word for titlebar. #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "ДейÑтвие на колелцето на мишката в заглавната лента на прозорците" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Вид замъглÑване използван за декорациите на прозорците" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "използвай темата на Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Използвай Metacity темата при риÑуване на декорациите на прозорците" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "ЗатварÑне на прозорец" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "ДемакÑимизиране на прозорец" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "МакÑимизиране на прозорец" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Минимизиране на прозорец" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Ðад другите" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 #, fuzzy msgid "Stick" msgstr "Лепкав" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Изключи над другите" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Прозорецът \"%s\" не отговарÑ." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Ðко принудително изключите приложението ще загубите вÑички промени, които не " "Ñа запазени" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Принудително изключване" # HT #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Ðнотации" # KM #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "ЦвÑÑ‚ за запълване на анотациите" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "ЦвÑÑ‚ за линиите на анотациите" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Модул за анотации" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "ИзчиÑтване" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Изчертаване" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Изчертаване, използвайки инÑтрумент" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "ЦвÑÑ‚ за запълване на анотациите" # HT #: ../metadata/annotate.xml.in.h:9 #: ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 #: ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Започни" # HT #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Започни изчертаване на анотациÑ" # HT #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Започни изтриване на анотациÑ" # HT #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Изтрий анотациÑ" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Ширина на линиÑта" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Ширина на линиÑта за анотации" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "ЦвÑÑ‚ на чертите за анотации" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Ширина на чертите" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Ширина на чертите за анотации" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4 кратно билинеарно филтриране " #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Размиване по алфа канала" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Размиване на прозорци по алфа канала" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Филтър за размиване" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Преграждане на размиването" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "ÐаÑищане на размиването" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "СкороÑÑ‚ на размиването" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Размиване на прозорци" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Размиване на прозрачните чаÑти на прозорците" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "ÐаÑищане на размиването" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Размиване на прозорци" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Размиване на прозорци, които не Ñа на фокуÑ" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Изключи размиването за региони от екрана, закрити от други прозорци." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Метод за размиване " #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Размиване при фокуÑ" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Прозорци размивани при фокуÑ" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "ГауÑов" # RU #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "РадиуÑ" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Сила" # RU #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "РадиуÑ" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Сила" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "ÐезавиÑимо получаване на текÑтурите" #: ../metadata/blur.xml.in.h:23 #: ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 #: ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Ðиво на детайла за Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Ðиво на детайлите за Mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "ПулÑиране" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "ПулÑиращ ефект" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "СкороÑÑ‚ на размиването на прозорците" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Прозорци, за които дейÑтва размиването" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" "Прозорзи, за които Ñе използва размиване по алфа канала по подразбиране" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Дублиране на изхода" # HT #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Започни дублиране на изхода" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Обработчик за дублиране на изхода" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда12" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда12" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши, коÑто при натиÑкане ще Ñтартира команда на обвивката, " "идентифицирана от команда9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Клавишни комбинации" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Команден ред 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Команден ред 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Команден ред 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Команден ред 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Команден ред 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Команден ред 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Команден ред 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Команден ред 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Команден ред 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Команден ред 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Команден ред 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Команден ред 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command0 е " "извикана" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command1 е " "извикана" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command10 е " "извикана" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command11 е " "извикана" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command2 е " "извикана" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command3 е " "извикана" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command4 е " "извикана" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command5 е " "извикана" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command6 е " "извикана" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command7 е " "извикана" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command8 е " "извикана" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command9 е " "извикана" #: ../metadata/commands.xml.in.h:63 #: ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Команда: " #: ../metadata/commands.xml.in.h:64 #, fuzzy msgid "Edge Bindings" msgstr "Комбинации от клавиши" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Комбинации от клавиши" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Изпълни команда 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Изпълни команда 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Изпълни команда 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Изпълни команда 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Изпълни команда 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Изпълни команда 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Изпълни команда 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Изпълни команда 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Изпълни команда 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Изпълни команда 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Изпълни команда 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Изпълни команда 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Ðктивни модули" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "СиÑтемнен звънец" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "AutoYast" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 #, fuzzy msgid "Automatic detection of output devices" msgstr "Ðвтоматично откриване" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Ðвтоматично заÑичане на ÑкороÑтта на опреÑнÑване" #: ../metadata/core.xml.in.in.h:9 #, fuzzy msgid "Best" msgstr "Ðай-добър" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ФокуÑиране при цъкане" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Цъкането върху прозорец премеÑтва фокуÑа върху него" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Затвори Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Икона по подразбиране" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Икона на прозореца по подразбиране" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Работна ÑтанциÑ" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "ЗаÑичане на екраните" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "ЗаÑичане на чеÑтотата на обновÑване" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "ÐаÑтройки на екрана" #: ../metadata/core.xml.in.in.h:20 #, fuzzy msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Колко време трÑбва показалецът да Ñтои на ръбът на екрана преди да Ñе " "задейÑтва дейÑтвието на ръба" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "ЗакъÑнение за задейÑтване на ръба" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Бързо" #: ../metadata/core.xml.in.in.h:23 #, fuzzy msgid "Focus & Raise Behaviour" msgstr "Поведение за фокуÑиране и издигане" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Общи наÑтройки" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Общи наÑтройки на Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Добро" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Скриване на вÑички прозорци и фокуÑиране на деÑктопа" #: ../metadata/core.xml.in.in.h:33 #, fuzzy msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Скривай прозорците които не Ñе показват в taskbar-a когато Ñе показва " "деÑктопа" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "ВиÑоко" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Хоризонтален брой на виртуалните екрани" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Комбинации от клавиши" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "Разрешаване на авто-Ñпирането" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "ОÑветление" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "СпиÑък Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ‚Ðµ модули" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "ÐиÑко" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "Долно-ÑорбийÑки" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "Хоризонтално макÑимизиране" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Вертикално макÑимизиране" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "МакÑимизиране на Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Хоризонтално макÑимизиране на Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Вертикално макÑимизиране на Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Минимизирай Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†" #: ../metadata/core.xml.in.in.h:57 #: ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Ðормална" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Брой на работните плотове" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Брой на виртуалните работни плотове" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Изключено" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Екрани" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "ЗакъÑнение" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Предпочитане на по-голÑм екран" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Предпочитане на по-малък екран" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Повдигане при цъкане" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Повдигане на прозореца" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Повдигане на избраниÑÑ‚ прозорец Ñлед интервал от време" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Повдигане на прозореца над другите" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Повдигане на прозореца при цъкане" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "ЧеÑтота на обновÑване" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Покажи Ñ€Ð°Ð±Ð¾Ñ‚Ð½Ð¸Ñ Ð¿Ð»Ð¾Ñ‚" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Бавни анимации" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Умен режим" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Синхронизиране Ñ VBlank" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "КомпреÑÐ¸Ñ Ð½Ð° повърхноÑтите" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "Филтър на повърхноÑтите" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Филтриране на повърхноÑтите" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Колко чеÑто Ñе прериÑува екрана (пъти в Ñекунда)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 #, fuzzy msgid "Use diffuse light when screen is transformed" msgstr "Използвай дифузно оÑветление когато екрана Ñе транÑформира" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Вертикален виртуален размер" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Много виÑоко" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Кое от заÑтъпващите Ñе уÑтройÑтва да Ñе предпочита" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши за менюто на прозореца" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ клавиши за менюто на прозореца" #: ../metadata/cube.xml.in.h:1 #: ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D уÑкорение:" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "ÐаÑтройка на изображението" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 #, fuzzy msgid "Advance to next slide" msgstr "Разширени параметри" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Сидни" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 #: ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Външен вид" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Ðвтоматично" #: ../metadata/cube.xml.in.h:9 #: ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Поведение" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "ЦвÑÑ‚ на горната и долната Ñтрана на куба" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" # KM #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Шапки на куба" # KM #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "ЦвÑÑ‚ на куба" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Куб" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "УÑкорение на Ñгъването" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "СкороÑÑ‚ на Ñгъването" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "Проба" #: ../metadata/cube.xml.in.h:19 #: ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "Предишен Ñлайд" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "ИзображениÑ" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Изоражение което да Ñе ползва като повърхноÑÑ‚ за небето" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Кубът да е прозрачен Ñамо ако въртенето е предизвикано от мишката" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Във куба" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Във куба" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "СпиÑък Ñ PNG и SVG файлове, които да Ñе риÑуват върху горната повърхноÑÑ‚ на " "куба" #: ../metadata/cube.xml.in.h:28 #: ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 #, fuzzy msgid "Multi Output Mode" msgstr "Режим на много екрани" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Много кубове" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Следващ Ñлайд" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Един голÑм куб" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ПрозрачноÑÑ‚ при въртене" #: ../metadata/cube.xml.in.h:33 #, fuzzy msgid "Opacity When Not Rotating" msgstr "ПрозрачноÑÑ‚ когато куба не Ñе върти" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ПрозрачноÑÑ‚ на Ñ€Ð°Ð±Ð¾Ñ‚Ð½Ð¸Ñ Ð¿Ð»Ð¾Ñ‚ по време на въртене" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "ПрозрачноÑÑ‚ на Ñ€Ð°Ð±Ð¾Ñ‚Ð½Ð¸Ñ Ð¿Ð»Ð¾Ñ‚ когато куба не Ñе върти" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "ПоÑтавÑне на прозорците върху куба" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Предишен Ñлайд" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "ИзобразÑвай небето" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Ðебе" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Иображение на небето" #: ../metadata/cube.xml.in.h:46 #: ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 #: ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "СкороÑÑ‚" #: ../metadata/cube.xml.in.h:47 #: ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 #: ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "ПрозрачноÑÑ‚ Ñамо при въртене Ñ Ð¼Ð¸ÑˆÐºÐ°" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Прозрачен куб" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Разгъване" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Разгъване на куба" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Контрол за Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Команда" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Прозорци Ñ Ð´ÐµÐºÐ¾Ñ€Ð°Ñ†Ð¸Ñ" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "команда за декоратор, коÑто Ñе изпълнÑва ако вче не върви декоратор" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "X координати на ÑÑнката" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Y координати на ÑÑнката" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "ЦвÑÑ‚ на ÑÑнката" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "ПрозрачноÑÑ‚ на ÑÑнката" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Ð Ð°Ð´Ð¸ÑƒÑ Ð½Ð° ÑÑнката" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "ЦвÑÑ‚ на ÑÑнката" #: ../metadata/decoration.xml.in.h:12 #, fuzzy msgid "Shadow Offset X" msgstr "&ÐиÑък капацитет" #: ../metadata/decoration.xml.in.h:13 #, fuzzy msgid "Shadow Offset Y" msgstr "&ÐиÑък капацитет" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "ПрозрачноÑÑ‚ на ÑÑнката" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Ð Ð°Ð´Ð¸ÑƒÑ Ð½Ð° ÑÑнката" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Прозорци Ñ ÑÑнка" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Ð”ÐµÐºÐ¾Ñ€Ð°Ñ†Ð¸Ñ Ð½Ð° прозореца" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "Декорации на прозореца" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Прозорци, които да бъдат декорирани" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Прозорци които да имат ÑÑнка" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "ЯркоÑÑ‚(в %) на прозорците които не отговарÑÑ‚" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "ПоÑтоÑнна ÑкороÑÑ‚" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "ПоÑтоÑнно време" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Ð’ реално време" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Избрано" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Ð’ реално време" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "Файлова &ÑиÑтема" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "&Изтриване на Windows" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "&ÐамалÑване на Windows" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows Ñвободни (%1)" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "ДобавÑне на контакт" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "ДобавÑне на контакт" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Стартиране в терминал" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 #, fuzzy msgid "Run Dialog" msgstr "Диалог за изпълнÑване на програма" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "ИзпълнÑване на команда в терминала" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Команда за заÑнемане на екрана" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Покажи главното меню" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Покажи диалога за изпълнÑване на програма" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Показване на главното меню" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Снимай екрана" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Снимай прозорец" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Команда в терминала" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Команден ред за заÑнемане на прозореца" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "Без запиÑване" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "Без запиÑване" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "&ÐамалÑване на Windows" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "&ÐамалÑване на Windows" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "&ÐамалÑване на Windows" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "&Ðадолу" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "&Ðадолу" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "&Ðадолу" #: ../metadata/move.xml.in.h:8 #: ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 #: ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "&ÐиÑък капацитет" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "&Изтриване на Windows" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "&ÐамалÑване на Windows" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/obs.xml.in.h:1 #: ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "МоÑÑ‚" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "МоÑÑ‚" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "МоÑÑ‚" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "МоÑÑ‚" #: ../metadata/obs.xml.in.h:5 #, fuzzy msgid "Brightness values for windows" msgstr "ЯркоÑÑ‚(в %) на прозорците които не отговарÑÑ‚" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Понижи непрозрачноÑтта" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Увеличаване" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Окцитан (Ñлед 1500)" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "&ÐиÑък капацитет" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "&Изтриване на Windows" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "ПрозрачноÑÑ‚ при въртене" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 #: ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "ПродължителноÑÑ‚" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "ПродължителноÑÑ‚" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "ПродължителноÑÑ‚" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Стъпка" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Декорации на прозореца" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windows" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "" "Прозорзи, за които Ñе използва размиване по алфа канала по подразбиране" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "" "Прозорзи, за които Ñе използва размиване по алфа канала по подразбиране" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "" "Прозорзи, за които Ñе използва размиване по алфа канала по подразбиране" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Ðлгоритъм, който да Ñе използва при поÑтавÑнето на прозорците" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "КаÑкадно подреждане" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Центрирано подреждане" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Мениджър на прозорци" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "&Изтриване на Windows" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Виртуално уÑтройÑтво" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Запазване в работната площ" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "&Изтриване на Windows" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Произволно" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Виртуално уÑтройÑтво" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "Параметри на ypbind" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Параметри на ypbind" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "Работна гр&упа" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Виртуално уÑтройÑтво" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Виртуално уÑтройÑтво" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Зареждане на PNG изображениÑ" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 #: ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 #: ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" # KM #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Цветове" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" # KM #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Цветове" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "&Ðачален RAM диÑк" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "&Ðачален RAM диÑк" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "&Ðачален RAM диÑк" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "&Ðачален RAM диÑк" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "&Ðачален RAM диÑк" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "ПромÑната на размера е неуÑпешно." # KM #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Цветове" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "РазтÑгане" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "Ð’ реално време" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "Показател към %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "Опи&Ñание на принтера" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:19 #, fuzzy msgid "Rotate Flip Left" msgstr "ÐадÑÑно" #: ../metadata/rotate.xml.in.h:20 #, fuzzy msgid "Rotate Flip Right" msgstr "ÐадÑÑно" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Завъртане налÑво" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Завъртане на лÑво Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Завъртане надÑÑно" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Завъртане надÑÑно Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Завъртане към" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Завъртане към Страна 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Завъртане към Страна 1 Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Завъртане към Страна 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Завъртане към Страна 10 Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Завъртане към Страна 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Завъртане към Страна 11 Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Завъртане към Страна 12" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "ÐадÑÑно" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Завъртане към Страна 1 Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "&Ðадолу" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "ПромÑната на размера е неуÑпешно." #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D уÑкорение:" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Проба" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Проба" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Проба" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Ðачало на откриването" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 #: ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Мащабиране" #: ../metadata/scale.xml.in.h:1 #: ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "ГолÑма" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "ÐатиÑни на работен плот за да бъде показан" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "ЗатъмнÑване на фона" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Емблема" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "&Ðачален RAM диÑк" #: ../metadata/scale.xml.in.h:15 #, fuzzy msgid "Initiate Window Picker For All Windows" msgstr "&Ðачален RAM диÑк" #: ../metadata/scale.xml.in.h:16 #, fuzzy msgid "Initiate Window Picker For Window Group" msgstr "&Ðачален RAM диÑк" #: ../metadata/scale.xml.in.h:17 #, fuzzy msgid "Initiate Window Picker For Windows on Current Output" msgstr "&Ðачален RAM диÑк" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Скенер" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "&Изтриване на Windows" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "меÑтно време" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "меÑтно време" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "&Изтриване на Windows" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "&Изтриване на Windows" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "ИÑпаниÑ" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 #, fuzzy msgid "Automatically open screenshot in this application" msgstr "Ðвтоматично зареждане на аплета при влизане" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "ДиректориÑ" # HT #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Стартирай приложение" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "ПоÑтавÑй Ñнимките на екрана в тази директориÑ" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Снимка на екрана" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Модул за Ñнимки на екрана" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg image loader" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Ред на прилагане" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "AutoYast" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "При зареждане на ОС" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Икони" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "&ÐамалÑване на Windows" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Работна ÑтанциÑ" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Следващ прозорец" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Следващ прозорец (вÑички прозорци)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Следващ прозорец (без изÑкачащите)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Предишно Ñдро" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Windows" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "&ÐамалÑване на Windows" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "меÑтно време" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "меÑтно време" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "&Изтриване на Windows" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Прозорци, които трÑбва да бъдат показвани в превключвателÑ" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "До&бавÑне на връзка" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "ДобавÑне на контакт" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "ЗакъÑнение (в милиÑекунди) между вÑÑка дъждовна капка" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "ЗакъÑнение" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "&ПромÑна на ÑтатуÑа" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "&ПромÑна на ÑтатуÑа" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "&ПромÑна на ÑтатуÑа" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "&ПромÑна на ÑтатуÑа" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "&Изтриване на Windows" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "ДейÑтвие" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "&Изтриване на Windows" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Разделителна ÑпоÑобноÑÑ‚" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "&Изтриване на Windows" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Ефект при макÑимизиране" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "МакÑимален размер" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "МакÑимален размер" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "&Ðадолу" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Треперене" # this is more like 'snap by default' #: ../metadata/wobbly.xml.in.h:18 #, fuzzy msgid "Snap Inverted" msgstr "Привличане по принцип" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Привличане между прозорците" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Съпротивление на пружината" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "КонÑтанта на пружината" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "КонÑтанта на пружината" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "ПроменÑне на привличането" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Използвай пружинен модел за треперещите прозорци" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Разпознаване на Ñървъра" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Прозорци, които трÑбва да треперÑÑ‚ при фокуÑиране" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Прозорци, които трÑбва да треперÑÑ‚ при хващане" #: ../metadata/wobbly.xml.in.h:28 #, fuzzy msgid "Windows that should wobble when mapped" msgstr "Прозорци, които трÑбва да треперÑÑ‚ при Ñъздаване" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Прозорци, които трÑбва да треперÑÑ‚ при премеÑтване" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Треперене при макÑимизиране и демакÑимизиране на прозорците" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Треперещи прозорци" #~ msgid "Command line 0" #~ msgstr "Команден ред 0" #~ msgid "Run command 0" #~ msgstr "Изпълни команда 0" #~ msgid "Screenshot commands" #~ msgstr "Команди за заÑнемане на екрана" #~ msgid "Screenshot key bindings" #~ msgstr "Ключови комбинации за заÑнемане на екрана" #~ msgid "Filter Linear" #~ msgstr "Линеен филтър" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Използвай линеен филтър при мащабиране" #~ msgid "Zoom Desktop" #~ msgstr "Мащабиране на Ñ€Ð°Ð±Ð¾Ñ‚Ð½Ð¸Ñ Ð¿Ð»Ð¾Ñ‚" #~ msgid "Zoom In" #~ msgstr "Увеличаване" #~ msgid "Zoom Out" #~ msgstr "ÐамалÑване" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Излизане" #~ msgid "Zoom Speed" #~ msgstr "СкороÑÑ‚ на мащабирането" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "Проба" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "Излизане" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Излизане" #~ msgid "Decrease window opacity" #~ msgstr "Понижи непрозрачноÑтта на прозореца" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "&Изтриване на Windows" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "&Изтриване на Windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Страница надолу" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane Right" #~ msgstr "ÐадÑÑно" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Страница нагоре" #, fuzzy #~ msgid "Plane down" #~ msgstr "&Изтриване на Windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane right" #~ msgstr "ÐадÑÑно" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane up" #~ msgstr "Страница нагоре" #, fuzzy #~ msgid "Toolbar" #~ msgstr "ИнÑтрументи" #~ msgid "Menu" #~ msgstr "Меню" #, fuzzy #~ msgid "Utility" #~ msgstr "ДиÑк Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (utility)..." #, fuzzy #~ msgid "Splash" #~ msgstr "splash" #, fuzzy #~ msgid "Dialog" #~ msgstr "&Тонално набиране" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Мениджър на прозорци" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "Меню" #, fuzzy #~ msgid "Tooltip" #~ msgstr "ИнÑтрументи" #, fuzzy #~ msgid "Notification" #~ msgstr "Забележки" #, fuzzy #~ msgid "Dnd" #~ msgstr "End" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Touchscreen" #~ msgid "Unknown" #~ msgstr "ÐеизвеÑтно" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "ПродължителноÑÑ‚" #, fuzzy #~ msgid "Do not modify" #~ msgstr "Без запиÑване" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "&ÐиÑък капацитет" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "РадиуÑ" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "ПромÑната на размера е неуÑпешно." #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D уÑкорение: " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D уÑкорение: " #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Проба" # RU #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "РуÑка ФедерациÑ" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "РуÑка" #, fuzzy #~ msgid "Line width for annotations (0.0-100.0)" #~ msgstr "Можете да научите повече от документациÑта" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Windows" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&ÐамалÑване на Windows" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&ÐамалÑване на Windows" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "МакÑимален размер" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Отдалечен работен плот" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Окцитан (Ñлед 1500)" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D уÑкорение: " #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Проба" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "меÑтно време" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "меÑтно време" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "&Изтриване на Windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "ДейÑтвие" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ИÑпаниÑ" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "&Филтър" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Разпознаване на Ñървъра" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows Ñвободни (%1)" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows Ñвободни (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Избрано" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Проба" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Излизане" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "ПромÑната на размера е неуÑпешно." #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Команда: " #, fuzzy #~ msgid "Run command %d" #~ msgstr "Команда: " #, fuzzy #~ msgid "Move Window Types" #~ msgstr "Тип на доÑтавчика" #, fuzzy #~ msgid "Corners" #~ msgstr "КорнÑки" #~ msgid "Terminate" #~ msgstr "Терминали" compiz-0.9.11+14.04.20140409/po/ro.po0000644000015301777760000026263012321343002017101 0ustar pbusernogroup00000000000000# Traducerea compiz.po în Română # # Sergiu Bivol , 2008. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2008-05-19 19:29+0300\n" "Last-Translator: Sergiu Bivol \n" "Language-Team: Română \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Birou" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Gestiune ferestre" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nimic" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "UmbreÈ™te" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "Tipul providerului" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximizează fereastra orizontal" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximizează fereastra vertical" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Tipul providerului" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Autoridicare" #: ../gtk/gnome/compiz-window-manager.c:433 #, fuzzy msgid "Lower" msgstr "Joasă" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Meniu fereastră" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "AcÈ›iunea de efectuat la derularea rotiÈ›ei È™oricelului deasupra barei de " "titlu." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Tip estompare" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacitatea ferestrei active în tematica Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Umbrirea opacității ferestrei active în tematica Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacitate în tematica Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Umbrirea opacității în tematica Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Opacitatea de utilizat pentru ferestrele active cu decoraÈ›iile tematicii " "Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacitatea de utilizat pentru decoraÈ›iile tematicii Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "UmbreÈ™te ferestrele active cu decoraÈ›iile tematicii Metacity de la opac la " "străveziu" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "UmbreÈ™te ferestrele cu decoraÈ›iile tematicii Metacity de la opac la străveziu" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "AcÈ›iune rotiță È™oricel asupra barei de titlu" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tip de estompare utilizată pentru decorare ferestre" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Utilizare tematică Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Utilizare tematică Metacity la desenarea decoraÈ›iilor ferestrelor" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "ÃŽnchide fereastra" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Demaximizează fereastra" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximizează fereastra" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimizează fereastra" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Pune deasupra" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "LipeÈ™te" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Luminează" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Scoate deasupra" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "DezlipeÈ™te" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Fereastra „%s†nu răspunde." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "ForÈ›area închiderii acestei aplicaÈ›ii va provoca pierderea modificărilor " "nesalvate." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_ForÈ›ează închiderea" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Adnotări" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Culoare de umplere a adnotării" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Culoare de È™tanÈ›are a adnotării" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Modúl Adnotare" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Curăță" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Desenează" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Desenează folosind unealta" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Culoarea de umplere a adnotărilor" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "IniÈ›iere" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "IniÈ›iază desenarea adnotării" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "IniÈ›iază È™tergerea adnotării" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "IniÈ›iere È™tergere" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Lățime linie" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Lățimea liniei pentru adnotări" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Culoare de È™tanÈ›are pentru adnotări" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Lățime È™tanÈ›are" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Lățimea È™tanțării pentru adnotări" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBiliniar" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Estompare alfa" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Estompare alfa ferestre" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtru estompare" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Ocluziune estompare" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "SaturaÈ›ie estompare" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Viteză estompare" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Estompare ferestre" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Estompează în spatele părÈ›ilor străvezii ale ferestrelor" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "SaturaÈ›ia estompării" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Estompează ferestrele" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Estompează fereastra care nu este focalizată" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Dezactivează estomparea regiunilor de ecran obscurate de alte ferestre." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Metoda de filtrare utilizată pentru estompare" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Estompare la focalizare" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Estompare ferestre la focalizare" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gausian" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Rază gausiană" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Intensitate gausiană" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Raza gausiană" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Intensitatea gausiană" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Preluare independentă texturi" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Hartă MIP" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "NDD hartă MIP" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Nivel-de-detaliere a hărÈ›ii MIP" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Puls" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efect de pulsare" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Utilizează unitățile de textură disponibile pentru a face cît mai multe " "preluări independente de textură." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Viteză estompare fereastră" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Ferestrele ce trebuiesc afectate de estomparea la focalizare" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Ferestrele ce trebuie să utilizeze implicit estompare alfa" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Clonare ieÈ™ire" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "IniÈ›iere selecÈ›ie clonă" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Manipulant clonă ieÈ™ire" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă0â€" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă1â€" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă10â€" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă11â€" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă2â€" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă3â€" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă4â€" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă5â€" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă6â€" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă7â€" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă8â€" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă9â€" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă0â€" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă1â€" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă10â€" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă11â€" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă2â€" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă3â€" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă4â€" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă5â€" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă6â€" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă7â€" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă8â€" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă9â€" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă0â€" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă1â€" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă10â€" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă11â€" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă2â€" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă3â€" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă4â€" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă5â€" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă6â€" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă7â€" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă8â€" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "O combinaÈ›ie de taste care va rula comanda de consolă identificată prin " "„comandă9â€" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Linie de comandă 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Linie de comandă 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Linie de comandă 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Linie de comandă 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Linie de comandă 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Linie de comandă 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Linie de comandă 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Linie de comandă 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Linie de comandă 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Linie de comandă 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Linie de comandă 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Linie de comandă 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă0â€" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă1â€" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată " "„rulează_comandă10â€" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată " "„rulează_comandă11â€" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă2â€" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă3â€" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă4â€" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă5â€" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă6â€" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă7â€" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă8â€" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă9â€" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Comandă" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Execută comanda 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Execută comanda 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Execută comanda 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Execută comanda 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Execută comanda 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Execută comanda 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Execută comanda 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Execută comanda 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Execută comanda 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Execută comanda 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Execută comanda 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Execută comanda 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Module active" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Permite ca desenarea ferestrelor în ecran complet să nu fie redirecÈ›ionată " "către hărÈ›i de pixeli" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "ClopoÈ›el sonor" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Bip de sistem sonorizat" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Autoridicare" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "ÃŽntîrziere Autoridicare" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "DetecÈ›ie automată a dispozitivelor de ieÈ™ire" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "DetecÈ›ie automată a ratei de reîmprospătare" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Cea mai bună" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Clic pentru focalizare" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Clic pe fereastră mută focalizarea de intrare pe ea" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "ÃŽnchide fereastra activă" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Pictogramă implicită" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Pictograma implicită a ferestrei" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Cub de birou" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detectează ieÈ™irile" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detectează rata de reîmprospătare" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Durata cît indicatorul trebuie să stea pe marginea ecranului înaintea " "efectuării unei acÈ›iuni de margine." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "ÃŽntîrziere declanÈ™ator margină" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rapidă" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Nivel de prevenire a focalizării" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Ferestre pentru prevenire focalizare" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Ferestrele pentru care se aplică prevenirea focalizării" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "ForÈ›ează desenarea independentă a ieÈ™irii." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "OpÈ›iuni generale" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "OpÈ›iuni generale Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bună" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ascundere ferestre „Pășire bară de proceseâ€" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Ascunde toate ferestrele È™i focalizează biroul" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Ascunde ferestrele de nu sînt în bara de procese la intrarea în regimul de " "afiÈ™are a biroului" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "ÃŽnaltă" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Dimensiune virtuală orizontală" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "Utilizează compresie pentru texturi convertite din imagini dacă e posibil" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignoră indiciile la maximizare" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignoră indiciile de mărire a dimensiunii È™i de aspect cînd fereastra este " "maximizată" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Interval înainte de ridicarea ferestrelor alese" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Interval între mesaje de verificare" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Nivelul de prevenire a furtului focalizării" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Iluminare" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista modulelor active la moment" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Listă de È™iruri descriind dispozitivele de ieÈ™ire" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Joasă" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Coboară fereastra" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Coboară fereastra sub alte ferestre" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximizează fereastra orizontal" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximizează fereastra vertical" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximizează fereastra activă" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximizează orizontal fereastra activă" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximizează vertical fereastra activă" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimizează fereastra activă" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normală" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Număr de birouri" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Numărul de birouri virtuale" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Deconectat" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Actualizează ecranul numai în timpul golirii verticale" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "IeÈ™iri" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Manipulant suprapunere ieÈ™iri" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Desenează independent fiecare dispozitiv de ieÈ™ire, chiar dacă dispozitivele " "de ieÈ™ire se suprapun" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "ÃŽntîrziere interogare" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Preferă ieÈ™irea mai mare" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Preferă ieÈ™irea mai mică" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Ridicare la clic" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Ridicare fereastră" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Ridicare ferestre alese după interval" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Ridicare fereastră deasupra celorlalte ferestre" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Ridică ferestrele la clic" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Rata de reîmprospătare" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplicator dimensiune ecran pentru dimensiunea virtuală orizontală" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicator dimensiune ecran pentru dimensiunea virtuală verticală" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "AfiÈ™are birou" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "AfiÈ™are animaÈ›ii" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Regim inteligent" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sincronizare la VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Compresie textură" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtru textură" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtrare textură" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Rata de redesenare a ecranului (ori/secundă)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Comută maximizare fereastră" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Comută maximizare orizontală fereastră" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Comută maximizare verticală fereastră" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Comută umbrire fereastră" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Comută maximizarea ferestrei active" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Comută maximizarea orizontală a ferestrei active" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Comută maximizarea verticală a ferestrei active" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Comută umbrirea ferestrei active" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Comută utilizarea animaÈ›iilor lente" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Demaximizează fereastra activă" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "DezredirecÈ›ionează ferestrele în ecran comlpet" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Utilizare lumină difuză la transformarea ecranului" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Dimensiune virtuală verticală" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Foarte înaltă" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Care din dispozitivele de ieÈ™ire suprapuse să fie preferat" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Buton pentru meniu fereastră" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Tastă pentru meniu fereastră" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Accelerare" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Ajustează imaginea" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Ajustează imaginea feÈ›ei de sus la rotaÈ›ie" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avansează la următorul diapozitiv" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animare fundal" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animează imaginea de fond la rotirea cubului" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automat" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Culoarea părÈ›ilor de sus È™i de jos ale cubului" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Culoarea utilizată pentru marginea de jos a gradientului de rezervă al " "fundalului" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Culoarea utilizată pentru marginea de sus a gradientului de rezervă al " "fundalului" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Culoarea cubului" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Culoarea cubului" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cub de birou" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "AcceleraÈ›ie pliere" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Viteză pliere" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Pas de timp pliere" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Generare hărÈ›i MIP pentru calitate mai înaltă cînd e posibil" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "ÃŽnapoi la diapozitivul precedent" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "FiÈ™iere imagine" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Imagine de utilizat ca textură de fond" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "IniÈ›iază transparenÈ›a cubului doar dacă rotaÈ›ia e condusă de È™oricel." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ÃŽn cub" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Vedere din interiorul cubului" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista fiÈ™ierelor PNG È™i SVG ce trebuiesc afiÈ™ate pe faÈ›a superioară a cubului" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Regim „IeÈ™iri multipleâ€" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Cuburi multiple" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Următorul diapozitiv" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Un cub mare" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacitate în timpul rotaÈ›iei" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacitate în afara rotaÈ›iei" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacitatea ferestrei biroului în timpul rotaÈ›iei." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacitatea ferestrei biroului în afara rotaÈ›iei." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Plasează ferestrele pe cub" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Diapoz. prec." #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "AfiÈ™are fundal" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Scalare imagine" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Scalează imaginile pentru a acoperi faÈ›a superioară a cubului" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Alege cum să fie afiÈ™at cubul la utilizarea mai multor dispozitive de ieÈ™ire." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Fundal" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Culoare finală pentru gradient fundal" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Culoare iniÈ›ială pentru gradient fundal" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Imagine fundal" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Viteză" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Pas de timp" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Transparență numai la rotire È™oricel" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Depliază" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Depliază cubul" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Suport control Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Permite generarea de hărÈ›i MIP pentru texturi decorative" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Comandă" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Ferestre decorare" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Linia de comandă pentru decorator, executată dacă niciun decorator nu " "rulează deja" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Decalaj X pentru umbra lăsată" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Decalaj Y pentru umbra lăsată" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Culoare pentru umbra lăsată" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacitate pentru umbra lăsată" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Rază pentru umbra lăsată" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Culoare umbră" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Decalaj X pentru umbră" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Decalaj Y pentru umbră" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacitate umbră" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Rază umbră" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Ferestre umbră" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "DecoraÈ›ie fereastră" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "DecoraÈ›ii fereastră" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Ferestrele ce trebuiesc decorate" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Ferestrele ce trebuie să aibă o umbră" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "&Testează" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Constrînge Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Tipul providerului" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Data compilării:" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Decolorare la minimizare/deschidere/închidere" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Viteză decolorare" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Data compilării:" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Efect de decolorare la minimizarea/deschiderea/închiderea ferestrelor" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efect decolorare la sunet de sistem" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Colorare ferestre la trecerea pe hartă È™i decolorare la scoaterea de pe hartă" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Decolorare ferestre" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Decolorarea ferestrelor" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "ClopoÈ›el vizibil în ecran complet" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Efect de decolorare la sunet de sistem în ecran complet" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "ClopoÈ›el vizibil" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Viteză decolorare fereastră" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Ferestrele ce trebuiesc scalate în regimul de scalare" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Ferestrele care trebuie să se decoloreze" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Punct de montare" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Punct de montare" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Sistem de fiÈ™iere în spaÈ›iul utilizatorului" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Sistem de fiÈ™iere în spaÈ›iul utilizatorului (fuse)" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Suport control GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Suport buclă principală GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Deschide o consolă" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Dialog ececuÈ›ie" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Linie de comandă în terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Linie de comandă pentru captură de ecran" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "AfiÈ™are meniu principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "AfiÈ™are dialog de lansare aplicaÈ›ie" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "AfiÈ™ează meniul principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Fă o captură de ecran" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Face captura unei ferestre" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Linie de comandă în terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Linie de comandă pentru captură fereastră" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Suport fiÈ™ier plan Ini" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Modúl de notificare a modificării fiÈ™ierului" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Suport control Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efect de minimizare" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimizează ferestrele" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Viteză minimizare" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Pas de timp minimizare" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Rezistență la umbrire" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Rezistență la umbrire" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformare ferestre cînd sînt minimizate È™i deminimizate" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Ferestrele care trebuiesc transformate la minimizare" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Constrînge Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Constrînge coordonata Y la regiunea spaÈ›iului de lucru" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Nu actualiza în server poziÈ›ia ferestrelor pînă cînd nu se încheie mutarea" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "IniÈ›ierea mutării ferestrei" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "PoziÈ›ionare leneșă" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Mutare fereastră" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Mută fereastra" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacitate" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Nivel de opacitate al ferestrelor în miÈ™care" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Desprindere È™i demaximizare automată a ferestrelor maximizate la glisare" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "Tipul providerului" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "IniÈ›ializarea deplasării" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Luminozitate" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Luminozitate" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Luminozitate" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Luminozitate" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Reducere opacitate" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Mărire opacitate" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Pasul de modificare a opacității" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Pasul de modificare a opacității" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Pas opacitate" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Nivel de opacitate al ferestrelor în miÈ™care" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Opacitate în timpul rotaÈ›iei" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Pregătire" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Pregătire" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Pregătire" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Pregătire" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "DecoraÈ›ii fereastră" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Window Manager" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Tipul providerului" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Ferestre ce trebuiesc poziÈ›ionate implicit" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Ferestre ce trebuie să fie străvezii implicit" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Ferestre ce trebuiesc poziÈ›ionate implicit" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritm de utilizat pentru amplasarea ferestrelor" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Cascadă" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centrat" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Gestiune ferestre" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Tipul providerului" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Utilizatori virtuali" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "Tipul providerului" #: ../metadata/place.xml.in.h:12 #, fuzzy msgid "Place across all outputs" msgstr "Preferă ieÈ™irea mai mică" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" "Amplasează ferestrele pe poziÈ›ii corespunzătoare la amplasarea pe hartă" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Rgim de amplasare" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Tipul providerului" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Aleator" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "Alege comportamentul amplasării în prezenÈ›a ieÈ™irilor multiple" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Inteligent" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "FoloseÈ™te dispozitivul de ieÈ™ire activ" #: ../metadata/place.xml.in.h:20 #, fuzzy msgid "Use output device of focussed window" msgstr "FoloseÈ™te dispozitivul de ieÈ™ire cu indicatorul" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "FoloseÈ™te dispozitivul de ieÈ™ire cu indicatorul" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Utilizatori virtuali" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Utilizatori virtuali" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "SoluÈ›ii de amplasare ferestre" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Ferestre ce trebuiesc poziÈ›ionate implicit" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Ferestre ce trebuiesc poziÈ›ionate implicit în anumite zone de vizualizare" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Ferestre ce ar trebui amplasate cu forÈ›a, chiar dacă ele îi indică " "gestionarului de ferestre să le evite." #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "DecoraÈ›ii fereastră" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "SoluÈ›ii" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "PoziÈ›ii pe X" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Utilizatori virtuali" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Valori poziÈ›ii pe X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "PoziÈ›ii pe Y" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Utilizatori virtuali" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Valori poziÈ›ii pe Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "ÃŽncărcător de imagini Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Potrivire ExpReg" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Potrivire ferestre cu o expresie regulată" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Culoare bordură" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Culoarea bordurii utilizate pentru regimurile de redimensionare dreptunghică " "È™i conturată" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Regim de redimensionare implicit" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Regimul implicit utilizat pentru redimensionarea ferestrelor" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Culoare de umplere" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" "Culoarea de umplere folosită pentru regimul de redimensionare dreptunghică" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "India" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "India" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "India" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "India" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "India" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Tipul providerului" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Contur" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Tipul providerului" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Dreptunghi" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Tipul providerului" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Tipul providerului" #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "Tipul providerului" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "ÃŽncepe redimensionarea" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "ÃŽncepe redimensionarea ferestrei, întinzînd-o" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "ÃŽncepe redimensionarea normal" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "ÃŽncepe redimensionarea cu contur" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "ÃŽncepe redimensionarea cu dreptunghi" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "ÃŽntinde" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Tipul providerului" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Ferestre cu care se foloseÈ™te redimensionarea normală" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Ferestre cu care se foloseÈ™te redimensionarea cu contur" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Ferestre cu care se foloseÈ™te redimensionarea cu dreptunghi" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Ferestre cu care se foloseÈ™te redimensionarea prin întindere" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "ÃŽntoarcere muchie – glisare" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "ÃŽntoarcere muchie – deplasare" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "ÃŽntoarcere muchie – indicator" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "Data compilării:" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "ÃŽntoarce spre fereastra de vizualizare stîngă È™i transferă indicatorul" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "ÃŽntoarce spre următoarea fereastră de vizualizare la glisarea obiectului la " "marginea ecranului" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "ÃŽntoarce spre următoarea fereastră de vizualizare la deplasarea " "indicatorului la marginea ecranului" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "ÃŽntoarce spre următoarea fereastră de vizualizare la deplasarea ferestrei la " "marginea ecranului" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" "ÃŽntoarce spre fereastra de vizualizare dreaptă È™i transferă indicatorul" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inversare axă Y pentru deplasare indicator" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "Pointer către %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "Pointer către %1" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Ridicare la rotire" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Ridică fereastra la rotire" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Rotire cub" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "ÃŽntoarcere spre stînga la rotire" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "ÃŽntoarcere spre dreapta la rotire" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Rotire la stînga" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Rotire cub" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Desktop:" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Rotire la stînga" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "RoteÈ™te la fereastra de vizualizare" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Accelerare 3D:" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "&Testează" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "&Testează" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "&Testează" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilitatea miÈ™cării indicatorului" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Agățare rotaÈ›ie cub de faÈ›a inferioară" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Agățare rotaÈ›ie cub de faÈ›a superioară" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Agățare de faÈ›a inferioară" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Agățare de faÈ›a superioară" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "OpÅ£iuni căutare" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Interval de timp pînă la întoarcerea ferestrei de vizualizare" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Lupă" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Opacitatea în procente" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Mare" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Clic pe birou pentru a fiÈ™a biroul" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "ÃŽntunecare fundal" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "ÃŽntunecă fundalul la scalarea ferestrelor" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblemă" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Intrare în regim AfiÈ™are birou cînd se face clic pe birou în timpul scalării" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Durată planare" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Tipul providerului" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "IniÈ›iere Selector ferestre pentru toate ferestrele" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "IniÈ›iere Selector ferestre pentru grupul de ferestre" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "IniÈ›iere Selector ferestre pentru ferestrele ieÈ™irii curente" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Aranjează È™i începe transformarea tuturor ferestrelor" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Aranjează È™i începe transformarea grupului de ferestre" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Aranjează È™i începe transformarea ferestrelor" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Aranjează È™i începe transformarea ferestrelor ieÈ™irii curente" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Pe toate dispozitivele de ieÈ™ire" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Pe dispozitivul de ieÈ™ire curent" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Pictogramă suprapusă" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Suprapune o pictogramă pe ferestre odată ce sînt scalate" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Stare" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Tipul providerului" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "ora locală" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "ora locală" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Tipul providerului" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Alege unde sînt scalate ferestrele dacă sînt utilizate mai multe dispozitive " "de ieÈ™ire." #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "Tipul providerului" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Spania" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Intervalul (în ms) înaintea terminării regimului de scalare la planarea " "deasupra unei ferestre" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Ferestrele ce trebuiesc scalate în regimul de scalare" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Deschide captura de ecran automat în această aplicaÈ›ie" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Director\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "India" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Lansare aplicaÈ›ie" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Pune capturile în acest director" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Captură de ecran" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Profil activ" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "ÃŽncărcător de imagini Svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Luminozitatea în procente" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "SaturaÈ›ia în procente" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Ordinea de aplicare" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Automatic" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "AcÅ£iune" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Aduce fereastra aleasă în prim-plan" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "DistanÈ›a la care să fie îndepărtat biroul în timpul comutării ferestrelor" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "AcÅ£iune" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Desktop:" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Comutator-balon dacă nu este vizibil È™i alege următoarea fereastră" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Comutator-balon dacă nu este vizibil È™i alege următoarea fereastră dintre " "toate ferestrele" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Comutator-balon dacă nu este vizibil È™i alege fereastra precedentă" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Comutator-balon dacă nu este vizibil È™i alege fereastra precedentă dintre " "toate ferestrele" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Panoul precedent" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "RoteÈ™te fereastra aleasă la comutare" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Alege următoarea fereastră fără a afiÈ™a fereastra-balon." #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Alege fereastra precedentă fără a afiÈ™a fereastra-balon." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "AfiÈ™are pictogramă lîngă miniatură" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "ora locală" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "ora locală" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Ferestrele ce trebuiesc afiÈ™ate în comutator" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Oferă suport pentru spaÈ›iu de culori YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Redare video" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Redare video" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "SpaÈ›iu de culori YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Adaugă linie" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Adaugă punct" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Adaugă efecte acvatice pentru diferite acÈ›iuni de birou" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Interval (în ms) între picături" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Activează efectele acvatice pentru indicator" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Linie" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Scală decalaj" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punct" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "&Mail Relay" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Val pentru titlu" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "&Activează statusul" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "&Activează statusul" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "&Activează statusul" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "&Activează statusul" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efect acvatic" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Scală decalaj Apă" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efect acvatic de la titlul ferestrei" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efect de focalizare" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "AcÅ£iune" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "RezoluÅ£ie" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Agățare fereastră inversată" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efect la amplasare pe hartă" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efect la maximizare" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Dimensiune minimă grilă" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Dimensiune minimă a grilei pe culmi" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Tremurare" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Agățare inversate" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "AcÅ£iune" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Spania" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Spania" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "&Activează statusul" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Utilizare model de resort pentru efectul de legănare a ferestrei" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "RezoluÅ£ia serverului" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Ferestre ce trebuie să se legene la focalizare" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Ferestre ce trebuie să se legene la înhățare" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Ferestre ce trebuie să se legene la amplasare pe hartă" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Ferestre ce trebuie să se legene la deplasare" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efect de legănare la maximizarea È™i demaximizarea ferestrelor" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Tipul providerului" #~ msgid "Command line 0" #~ msgstr "Linie de comandă 0" #~ msgid "Run command 0" #~ msgstr "Execută comanda 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Linie de comandă pentru captură de ecran" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Linie de comandă pentru captură de ecran" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filtru:" #~ msgid "Use linear filter when zoomed in" #~ msgstr "FoloseÈ™te filtru liniar cînd se apropie" #~ msgid "Zoom Desktop" #~ msgstr "Lupă birou" #~ msgid "Zoom In" #~ msgstr "Apropiere" #~ msgid "Zoom Out" #~ msgstr "ÃŽndepărtare" #~ msgid "Zoom Pan" #~ msgstr "Panoramare lupă" #~ msgid "Zoom Speed" #~ msgstr "Viteză lupă" #~ msgid "Zoom Timestep" #~ msgstr "Temporizare lupă" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Examinare È™i panoramare cub de Birou" #~ msgid "Zoom factor" #~ msgstr "Coeficient lupă " #~ msgid "Zoom pan" #~ msgstr "Panoramare lupă" #~ msgid "Decrease window opacity" #~ msgstr "Reduce opacitatea fereastrei" #~ msgid "Increase window opacity" #~ msgstr "MăreÈ™te opacitatea ferestrei" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valoarea opacității pentru ferestrele care trebuie să fie străvezii " #~ "implicit" #~ msgid "Opacity window values" #~ msgstr "Valori ferestre opacitate" #~ msgid "Opacity windows" #~ msgstr "Ferestre opacitate" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane down" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane right" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Window Manager" #, fuzzy #~ msgid "Notification" #~ msgstr "AcÅ£iune" #~ msgid "Unknown" #~ msgstr "Necunoscut" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Pregătire" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Accelerare 3D:" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "are nevoie de" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "&Testează" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Rusă" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Desktop:" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Accelerare 3D:" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "&Testează" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "ora locală" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "ora locală" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "AcÅ£iune" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Spania" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "RezoluÅ£ia serverului" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Window Manager" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Window Manager" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "are nevoie de" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "&Testează" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Desktop:" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Comanda '%1'" #, fuzzy #~ msgid "Corners" #~ msgstr "Imprimante" #, fuzzy #~ msgid "Show switcher" #~ msgstr "AfiÅŸează &modificările" #, fuzzy #~ msgid "Terminate" #~ msgstr "Imprimantă" compiz-0.9.11+14.04.20140409/po/sr.po0000644000015301777760000024413512321343002017105 0ustar pbusernogroup00000000000000# Serbian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2004 SuSE Linux AG. # Rade Radenkovic , 2004 # Bojan Jovanovic , 2004 # msgid "" msgstr "" "Project-Id-Version: YaST2 (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2008-04-25 17:17+0200\n" "Last-Translator: Dragonny \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 1.1.0\n" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Setovanja Desktop-a" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Window Manager" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nema" # label of an output field #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Senka" # button text # button text #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "&Smanji Windowse" # button text # button text #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "&Smanji Windowse" # button text # button text #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "&Smanji Windowse" # button text # button text #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "&Smanji Windowse" # ComboBox item # Combobox item #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automatski" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Meni prozora" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Vrsta zamućivanja" # Radio button for using an entire (Windows) partition for Linux #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "&ObriÅ¡i Windows kompletno" # Radio button for using an entire (Windows) partition for Linux #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "&ObriÅ¡i Windows kompletno" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" # button text #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "Zatvori prozor" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" # button text # button text #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 #, fuzzy msgid "Minimize Window" msgstr "Smanji prozor" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Napravi iznad" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Ne senÄi" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Rastavi iznad" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Prozor \"%s\" ne reaguje." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forsiranjem aplikacije da se zatvori moze izazvati gubitak nesnimljenih " "promena." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Forsiraj Zatvaranje" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "хетÑки" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Dumb Clock" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" # Label text #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Aktivan profil" #: ../metadata/annotate.xml.in.h:5 #, fuzzy msgid "Clear" msgstr "OÄisti" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Nacrtaj" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Alat za crtanje" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "хетÑки" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "хетÑки" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "хетÑки" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "ZapoÄni brisanje" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Å irina linije" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Filter: " # button text #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Alfa zamućivanje" # button text #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Alfa zamućivanje prozora" # MenuButton label # menubutton label #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filter Zamućivanja" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Trajanje zamućivanja" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Trajanje" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Brzina Zamućivanja" # button text #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Zamuti Prozore" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Zamuti iza providnih delova prozora" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Trajanje" # button text #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Zamuti prozore" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Zamuti prozore koji nemaju fokus" #: ../metadata/blur.xml.in.h:13 #, fuzzy msgid "Disable blurring of screen regions obscured by other windows." msgstr "IskljuÄi zamućenje u delovima ekrana zamraÄenim od strane prozora. " #: ../metadata/blur.xml.in.h:14 #, fuzzy msgid "Filter method used for blurring" msgstr "Korišćena filter metoda za zamućivanje" # button text #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Fokusiraj zamućenje" # button text #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Fokusiraj zamućenje prozora" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Rusija" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "РуÑка Федерација" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Rusija" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "РуÑка Федерација" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Rusija" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "микмак" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "микмак" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Puls" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efekat pulsa" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" # label text, %1 is replaced by a unit value ("MB") # label text, %1 is replaced by a unit value ("MB") #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windows slobodno (%1)" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "хетÑки" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" # Process "help" # translators: %1 is the command name #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Komanda '%1'" # Process "help" # translators: %1 is the command name #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Komanda '%1'" # Process "help" # translators: %1 is the command name #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Komanda '%1'" # Process "help" # translators: %1 is the command name #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Komanda '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Komanda :" # Label text #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "Aktivan profil" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "Sistemi datoteka" # ComboBox item # Combobox item #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "Automatski" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" # table item / label #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Podrazumevana sekcija" # progress stage title #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "Pokretanje podrazumevanog menadžera prozora" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Setovanja Desktop-a" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" # headline for dialog "Select for update" # headline for dialog "Select for update" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "Izaberi za ažuriranje" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Startujem servis" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Startujem servis" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" # Aliases dialog caption #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Virtuelni alias-i" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "Zapisivanje dogaÄ‘aja" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "Listaj samo detektovane Å¡tampaÄe" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" # button text # button text #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/core.xml.in.in.h:51 #, fuzzy msgid "Maximize Window Vertically" msgstr "&Smanji Windowse" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "ÄŒekanje" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "&Radio Clock" # button text #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "&ObriÅ¡i Windowse" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&Osveži Listu" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Setovanja Desktop-a" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Prikaži sve Particije" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" # MenuButton label # menubutton label #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "&Podesite filter" # MenuButton label # menubutton label #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "&Podesite filter" # MenuButton label # menubutton label #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "&Podesite filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" # Aliases dialog caption #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Virtuelni alias-i" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D akceleratori" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sidnej" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" # ComboBox item # Combobox item #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Automatski" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Dumb Clock" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "Dumb Clock" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Setovanja Desktop-a" # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D akceleratori" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Suspend" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "ИÑточни Тимор" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "Instaliacija slike diska" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" # button text #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "&ObriÅ¡i Windowse" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" # button text #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "&ObriÅ¡i Windowse" # button text # button text #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "&Smanji Windowse" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" # ComboBox entry: hardware clock set to local time #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "lokalno vreme" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sidnej" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Sidnej" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Suspend" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "ИÑточни Тимор" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Komanda :" # button text #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "&LoÅ¡e stanje" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "&LoÅ¡e stanje" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Radius" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "&LoÅ¡e stanje" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "Radius" # button text # button text #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "&Smanji Windowse" #: ../metadata/decoration.xml.in.h:12 #, fuzzy msgid "Shadow Offset X" msgstr "&LoÅ¡e stanje" #: ../metadata/decoration.xml.in.h:13 #, fuzzy msgid "Shadow Offset Y" msgstr "&LoÅ¡e stanje" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "&LoÅ¡e stanje" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "Radius" # button text # button text #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "&Smanji Windowse" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Bez opisa" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind opcije" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "ИÑточни Тимор" # header text #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr " Kontejner" # button text #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "U realnom vremenu" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Suspend" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "U realnom vremenu" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "Sistemi datoteka" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" # button text #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "&ObriÅ¡i Windowse" # button text # button text #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "&Smanji Windowse" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" # label text, %1 is replaced by a unit value ("MB") # label text, %1 is replaced by a unit value ("MB") #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows slobodno (%1)" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Додај догађај" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Додај догађај" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "GreÅ¡ka, niste uneli ispravno komandu." #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "GreÅ¡ka, niste uneli ispravno komandu." #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "GreÅ¡ka, niste uneli ispravno komandu." #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" # button text # button text #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "&Smanji Windowse" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" # header text #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr " Kontejner" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "XF86RotateWindows" # button text # button text #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "&Smanji Windowse" # button text #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "&ObriÅ¡i Windowse" # button text #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "&ObriÅ¡i Windowse" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "&LoÅ¡e stanje" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "Startujem servis" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" # button text # button text #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "&Smanji Windowse" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Startujem servis" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Most" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Most" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Most" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Most" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" # ??? #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "окÑитан (поÑле 1500.)" # ??? #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "окÑитан (поÑле 1500.)" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "&LoÅ¡e stanje" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Startujem servis" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind opcije" # Label for used part of the Windows partition in non-graphical mode # Label for used part of the Windows partition in non-graphical mode #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows iskoriÅ¡teno:" # button text # button text #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "&Smanji Windowse" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Window Manager" # button text #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "&ObriÅ¡i Windowse" # Aliases dialog caption #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Virtuelni alias-i" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" # button text #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" # button text # button text #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "&Smanji Windowse" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" # Aliases dialog caption #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Virtuelni alias-i" # button text # button text #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "&Smanji Windowse" #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind opcije" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind opcije" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "&Radna grupa" # button text # button text #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "&Smanji Windowse" # Aliases dialog caption #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Virtuelni alias-i" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" # button text # button text #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "&Smanji Windowse" # Aliases dialog caption #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Virtuelni alias-i" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Dumb Clock" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Dumb Clock" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "хетÑки" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "хетÑки" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "хетÑки" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "хетÑки" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "хетÑки" # button text #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Dumb Clock" # button text #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" # button text #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "&ObriÅ¡i Windowse" # button text #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "&ObriÅ¡i Windowse" # button text #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "&ObriÅ¡i Windowse" #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Startujem servis" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Startujem servis" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Startujem servis" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Startujem servis" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Startujem servis" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" # button text #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "U realnom vremenu" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" # table entry, %1 is host name #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "PokazivaÄ na %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "Å tampaÄ" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Startujem servis" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Setovanja Desktop-a" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Setovanja Desktop-a" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Startujem servis" # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D akceleratori" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "ИÑточни Тимор" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "ИÑточни Тимор" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "ИÑточни Тимор" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Startuj detekciju..." #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 #, fuzzy msgid "Zoom" msgstr "Odjavi se" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "Pozadine" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "XF86RotateWindows" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" # label of an output field #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Skener" # button text #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "&ObriÅ¡i Windowse" # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "lokalno vreme" # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "lokalno vreme" # button text #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" # button text #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Å panija" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Директоријум\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "хетÑки" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Покрени програм" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "GreÅ¡ka, niste uneli ispravno komandu." #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "GreÅ¡ka, niste uneli ispravno komandu." #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Redosled" # ComboBox item # Combobox item #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Automatski" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Akcija" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Ikone" # button text # button text #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "&Smanji Windowse" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Setovanja Desktop-a" # button text #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "&ObriÅ¡i Windowse" # button text #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "&ObriÅ¡i Windowse" # button text #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "&ObriÅ¡i Windowse" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" # button text # button text #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" # button text #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "&ObriÅ¡i Windowse" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Startujem servis" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" # button text # button text #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "&Smanji Windowse" # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "lokalno vreme" # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "lokalno vreme" # button text #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "Додај догађај" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "Додај догађај" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "ÄŒekanje" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" # translators: toggle button label #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "&Promena statusa" # translators: toggle button label #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "&Promena statusa" # translators: toggle button label #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "&Promena statusa" # translators: toggle button label #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "&Promena statusa" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" # button text #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "&ObriÅ¡i Windowse" # button text #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Akcija" # button text #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Rezolucija" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" # button text #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "&ObriÅ¡i Windowse" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" # button text # button text #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "&Smanji Windowse" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" # To translators: intfield label #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "Minimalan &GUID" # To translators: intfield label #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "Minimalan &GUID" # button text #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "&ObriÅ¡i Windowse" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "Драјвер" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" # button text # button text #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "&Smanji Windowse" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Akcija" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Preskakanje %1" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Preskakanje %1" # button text #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "&ObriÅ¡i Windowse" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" # translators: frame title for method of incoming request resolution # translators: frame title for method of incoming request resolution #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Rezolucija servera" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" # button text #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Komanda :" # Process "help" # translators: %1 is the command name #, fuzzy #~ msgid "Run command 0" #~ msgstr "Komanda '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "GreÅ¡ka, niste uneli ispravno komandu." #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "GreÅ¡ka, niste uneli ispravno komandu." #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filter: " # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Setovanja Desktop-a" #, fuzzy #~ msgid "Zoom In" #~ msgstr "Odjavi se" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "Odjavi se" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Odjavi se" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Suspend" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "ИÑточни Тимор" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "Odjavi se" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Odjavi se" # Radio button for using an entire (Windows) partition for Linux #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "&ObriÅ¡i Windows kompletno" # button text #, fuzzy #~ msgid "Opacity windows" #~ msgstr "&ObriÅ¡i Windowse" # button text #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "&ObriÅ¡i Windowse" # button text #, fuzzy #~ msgid "Plane Down" #~ msgstr "&ObriÅ¡i Windowse" # button text #, fuzzy #~ msgid "Plane Left" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Plane Right" #~ msgstr "XF86RotateWindows" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Startujem servis" # button text #, fuzzy #~ msgid "Plane Up" #~ msgstr "&ObriÅ¡i Windowse" # button text #, fuzzy #~ msgid "Plane down" #~ msgstr "&ObriÅ¡i Windowse" # button text #, fuzzy #~ msgid "Plane left" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Plane right" #~ msgstr "XF86RotateWindows" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Startujem servis" # button text #, fuzzy #~ msgid "Plane up" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Dialog" #~ msgstr "тагалог" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Window Manager" #, fuzzy #~ msgid "Notification" #~ msgstr "Akcija" #~ msgid "Unknown" #~ msgstr "Nepoznato" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Trajanje" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "&LoÅ¡e stanje" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Radius" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Startujem servis" # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D akceleratori" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Suspend" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "ИÑточни Тимор" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "РуÑка Федерација" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Rusija" # button text # button text #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&Smanji Windowse" # button text # button text #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&Smanji Windowse" # To translators: intfield label #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Minimalan &GUID" # ??? #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "окÑитан (поÑле 1500.)" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Startujem servis" # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D akceleratori" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "ИÑточни Тимор" # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "lokalno vreme" # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "lokalno vreme" # button text #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Akcija" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Preskakanje %1" # MenuButton label # menubutton label #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "&Podesite filter" # translators: frame title for method of incoming request resolution # translators: frame title for method of incoming request resolution #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Rezolucija servera" # label text, %1 is replaced by a unit value ("MB") # label text, %1 is replaced by a unit value ("MB") #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows slobodno (%1)" # label text, %1 is replaced by a unit value ("MB") # label text, %1 is replaced by a unit value ("MB") #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows slobodno (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Suspend" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "ИÑточни Тимор" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Odjavi se" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Komanda :" #, fuzzy #~ msgid "Run command %d" #~ msgstr "Komanda :" # Provider type dialog caption #, fuzzy #~ msgid "Move Window Types" #~ msgstr "Tip provajdera" #, fuzzy #~ msgid "Corners" #~ msgstr "корнвалÑки" # Push button label #, fuzzy #~ msgid "Show switcher" #~ msgstr "Prikaži &promene" # default is "/dev/fd0" floppy device (used when floppy detection is skipped as a fallback) #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Disketni ureÄ‘aj" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Terminate" #~ msgstr "Terminali" compiz-0.9.11+14.04.20140409/po/uk.po0000644000015301777760000033451312321343002017100 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "СтільницÑ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°Ð¼Ð¸" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "ÐÑ–Ñкий" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Згорнути у заголовок" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Розгорнути" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Розгорнути в ширину" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Розгорнути у виÑоту" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Згорнути" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Розгорнути" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "ОпуÑтити" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Меню вікна" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Ð”Ñ–Ñ Ð¿Ñ€Ð¸ прокручуванні коліщатка миші на заголовку вікна." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Тип розмиваннÑ" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "ПрозоріÑть активного вікна теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Ð—Ð°Ñ‚ÑŒÐ¼Ð°Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€Ð¾Ñті активного вікна теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "ПрозоріÑть теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Ð—Ð°Ñ‚ÑŒÐ¼Ð°Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€Ð¾Ñті теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "ПрозоріÑть активних вікон у виглÑді теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "ПрозоріÑть при викориÑтанні декорацій теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Затьмарювати активні вікна з темою metacity від непрозорого до прозорого" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Затьмарювати активні вікна з темою metacity від непрозорого до прозорого" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "ДіÑ, коли коліщатко миші на заголовку вікна" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Тип розмиваннÑ, що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ñ€Ð°Ñ†Ñ–Ñ— вікна" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "ВикориÑтовувати теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "ВикориÑтовувати теми metacity Ð´Ð»Ñ Ð¼Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð´ÐµÐºÐ¾Ñ€Ð°Ñ†Ñ–Ñ— вікна " #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Закрити вікно" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Відновити розмір вікна" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Розгорнути вікно" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Згорнути вікно" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "ВинеÑти нагору" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Приклеїти" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Розгорнути із заголовка" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Відмінити винеÑÐµÐ½Ð½Ñ Ð½Ð°Ð³Ð¾Ñ€Ñƒ" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Відклеїти" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Вікно \"%s\" не відповідає." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "ПримуÑове Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ призведе до втрати вÑÑ–Ñ… незбережених змін." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_ПримуÑове завершеннÑ" # http://dict.linux.org.ua/db/table_adv.php?word=annotate #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Коментар" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Колір коментарю" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Колір риÑки нотатки" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Модуль нотатки" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "ОчиÑтити" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Малювати" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Малювати з викориÑтаннÑм інÑтрументу" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Колір Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð°Ð½Ð¾Ñ‚Ð°Ñ†Ñ–Ñ—" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Ініціювати" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Початок Ð¼Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð¼Ñ–Ñ‚ÐºÐ¸" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Початок Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð¼Ñ–Ñ‚ÐºÐ¸" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Початок видаленнÑ" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Ширина лінії" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Ширина лінії Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼Ñ–Ñ‚Ð¾Ðº" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Колір риÑки Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼Ñ–Ñ‚Ð¾Ðº" # треба уточнити #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Ширина риÑки" # треба уточнити #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Ширина риÑки Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼Ñ–Ñ‚Ð¾Ðº" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4-разова Білінійна фільтраціÑ" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Ð Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾ альфа-каналу" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Ð Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ½Ð° по альфа-каналу" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Фільтр розмиваннÑ" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Ð—Ð°Ð³Ð¾Ñ€Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ð¸Ñ‚Ñ‚Ñ" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "ÐаÑиченіÑть розмиваннÑ" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "ШвидкіÑть розмиваннÑ" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Ð Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Ð Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð·Ð° прозорими чаÑтинами вікон" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "ÐаÑиченіÑть розмиваннÑ" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Ð Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Ð Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½, Ñкі не мають фокуÑу" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Вимкнути Ñ€Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ Ð½Ð° тьмÑних ділÑнках екрану інших вікон" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Фільтр методу, Ñкий викориÑтовуєтьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Ð Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Ð Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ… вікон" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "ГауÑів" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Ð Ð°Ð´Ñ–ÑƒÑ Ñ€Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Сила розмиваннÑ" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Ð Ð°Ð´Ñ–ÑƒÑ Ñ€Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Сила розмиваннÑ" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Ðезалежне Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÑтур" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Рівень деталізації Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Ð”ÐµÑ‚Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "ПульÑ" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Ефект пульÑації" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "ВикориÑтовувати доÑтупну кількіÑть елементів текÑтур Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñкомога " "більшої кількоÑті незалежних текÑтур." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "ШвидкіÑть Ñ€Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Вікна, на Ñкі впливає ефект розмиваннÑ" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Вікна, Ð´Ð»Ñ Ñких викориÑтовуєтьÑÑ Ð°Ð»ÑŒÑ„Ð° Ñ€Ð¾Ð·Ð¼Ð¸Ð²Ð°Ð½Ð½Ñ Ð·Ð° замовчуваннÑм " #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Ð”ÑƒÐ±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Почати Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¾Ð³Ð¾" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Оброблювач дубльованого виводу" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ, при натиÑненні Ñкої буде виконана команда оболонки, " "визначена Ñк command9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð·Ð° межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена Ñк command0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð·Ð° межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена Ñк command1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð·Ð° межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена Ñк command10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð·Ð° межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена Ñк command11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð·Ð° межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена Ñк command2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð·Ð° межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена Ñк command3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð·Ð° межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена Ñк command4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð·Ð° межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена Ñк command5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð·Ð° межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена Ñк command6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð·Ð° межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена Ñк command7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð·Ð° межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена Ñк command8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð·Ð° межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена Ñк command9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Призначає Ð·Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð½Ð° Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Комбінації клавіш" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Команда 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Команда 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Команда 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Команда 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Команда 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Команда 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Команда 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Команда 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Команда 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Команда 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Команда 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Команда 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Команда, Ñку буде виконано в оболонці при виклику run_command0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Команда, Ñку буде виконано в оболонці при виклику run_command1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Команда, Ñку буде виконано в оболонці при виклику run_command10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Команда, Ñку буде виконано в оболонці при виклику run_command11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Команда, Ñку буде виконано в оболонці при виклику run_command2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Команда, Ñку буде виконано в оболонці при виклику run_command3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Команда, Ñку буде виконано в оболонці при виклику run_command4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Команда, Ñку буде виконано в оболонці при виклику run_command5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Команда, Ñку буде виконано в оболонці при виклику run_command6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Команда, Ñку буде виконано в оболонці при виклику run_command7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Команда, Ñку буде виконано в оболонці при виклику run_command8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Команда, Ñку буде виконано в оболонці при виклику run_command9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Команди " #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð¼ÐµÐ¶Ñ–" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Комбінації клавіш" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Виконати команду 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Виконати команду 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Виконати команду 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Виконати команду 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Виконати команду 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Виконати команду 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Виконати команду 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Виконати команду 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Виконати команду 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Виконати команду 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Виконати команду 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Виконати команду 9" # Додаток - це application, plugin, IMHO - це модуль #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Ðктивні модулі" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "ДозволÑÑ” малювати вікна на веÑÑŒ екран без Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð² облаÑті " "раÑтрового Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° межами екрану" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Сигнал, що чути" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "СиÑтемний звуковий Ñигнал, що чути" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "ÐвторозкриттÑ" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Затримка авторозкриттÑ" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Ðвтоматичне виÑÐ²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ñтроїв виводу" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Ðвтоматичне Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‡Ð°Ñтоти поновлюваннÑ" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Ðайкраще" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ÐатиÑніть Ð´Ð»Ñ Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "ÐšÐ»Ð°Ñ†Ð°Ð½Ð½Ñ Ð½Ð° вікні переведе Ñ„Ð¾ÐºÑƒÑ Ð²Ð²Ð¾Ð´Ñƒ на нього" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Закрити активне вікно" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Типовий значок" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Типовий значок вікна" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Розмір робочого Ñтолу" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Визначити приÑтрої виводу" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Визначити швидкіÑть оновленнÑ" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Параметри відображеннÑ" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Затримка покажчика миші на краю екрану перед тим, Ñк буде здійÑнено дію краю " "екрану." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Затримка ÑÐ¿Ñ€Ð°Ñ†ÑŒÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° краю" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Швидко" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Поведінка при розгортані" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Рівень попереджуючий фокуÑуваннÑ" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Попереджуюче фокуÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Попереджуюче фокуÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "ПримуÑове незалежне Ð¾Ð±Ð¼Ð°Ð»ÑŒÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Загальні ÐалаштуваннÑ" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Загальні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Добре" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Сховати вÑÑ–, крім вікон панелі завдань" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Сховати вÑÑ– вікна Ñ– передати Ñ„Ð¾ÐºÑƒÑ Ñ€Ð¾Ð±Ð¾Ñ‡Ð¾Ð¼Ñƒ Ñтолу" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "При переході в режим Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‡Ð¾Ð³Ð¾ Ñтолу вікна, Ñких немає на панелі " "завдань, не відображаютьÑÑ" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "ВиÑоке" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Віртуальний розмір по горизонталі" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "ВикориÑтовувати ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ‚ÐµÐºÑтур, конвертованих від зображень, Ñкщо Ñ”" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ігнорувати підказки у розгорнутому Ñтані" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ð†Ð³Ð½Ð¾Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ°Ð·Ð¾Ðº Ð·Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñ–Ð² Ñ– ÑÐ¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñторін Ð´Ð»Ñ " "розгорнутого вікна" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Інтервал чаÑу до Ð°Ð²Ñ‚Ð¾Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð¾Ð±Ñ€Ð°Ð½Ð¸Ñ… вікон" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Інтервал між повідомленнÑми відгуку" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Ð¡Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Рівень Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·ÐºÑ€Ð°Ð´Ð°Ð½Ð½ÑŽ фокуÑу" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "ОÑвітленнÑ" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Перелік активних в даний момент модулів" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Перелік Ñ€Ñдків, що опиÑують приÑтрої виведеннÑ" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Ðизьке" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "ПереміÑтити вікно на задній план" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ½Ð° позаду інших вікон" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Розгорнути вікно за горизонталлю" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Розгорнути вікно за вертикаллю" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Розгорнути активне вікно" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Розгорнути активне вікно за горизонталлю" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Розгорнути активне вікно за вертикаллю" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Згорнути активне вікно" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Ðормальний" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "КількіÑть Ñтільниць" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "КількіÑть віртуальних Ñтільниць" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Вимкнути" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Оновлювати екран під Ñ‡Ð°Ñ Ð³Ð°ÑÑ–Ð½Ð½Ñ Ð·Ð²Ð¾Ñ€Ð¾Ñ‚Ð½Ð¾Ð³Ð¾ ходу Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ ÐºÐ°Ð´Ñ€Ð¾Ð²Ð¾Ñ— розгортки" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "ПриÑтрої виводу" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Обробка перекриваємого виводу" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Перетворювати кожен приÑтрій виводу незалежно, навіть Ñкщо приÑтрої " "Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐºÑ€Ð¸Ð²Ð°ÑŽÑ‚ÑŒÑÑ" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Затримка" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Перевага більшому виводу" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Перевага меншому виводу" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Викликати клацаннÑм" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Викликати вікно" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Виклик обраних вікон піÑÐ»Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ñƒ чаÑу" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Виклик вікна поверх інших вікон" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Виклик вікна клацаннÑм" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "ЧаÑтота поновлюваннÑ" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Коефіцієнт розміру екрану Ð´Ð»Ñ Ð²Ñ–Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ розміру по горизонталі" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Коефіцієнт розміру екрану Ð´Ð»Ñ Ð²Ñ–Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ розміру по вертикалі" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Показати Ñтільницю" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Повільна анімаціÑ" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Інтелектуальний режим" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð· VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "КомпреÑÑ–Ñ Ñ‚ÐµÐºÑтур" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Фільтр текÑтур" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Ð¤Ñ–Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтур" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "ЧаÑтота, з Ñкою перемальовуєтьÑÑ Ð²Ð¼Ñ–ÑÑ‚ екрана (раз / Ñек)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Розгортати вікно" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Розгортати вікно по горизонталі" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Розгортати вікно по вертикалі" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Переключити Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ½Ð° в Ñмужку" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Ð Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ вікна" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Ð Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ вікна по горизонталі" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Ð Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ вікна по вертикалі" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "ÐŸÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ вікна в Ñмужку" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Перемикач Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð»ÑŒÐ½Ð¾Ñ— анімації" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ð½Ð¾Ð³Ð¾ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ вікна" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "СкаÑувати Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½ на веÑÑŒ екран" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·ÑÑ–Ñного Ñвітла при перетворенні екрану" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Віртуальний розмір по вертикалі" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Дуже виÑокий" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Який з приÑтроїв виводу, що перекриваютьÑÑ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ бути обраний" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "ÐŸÐ¾Ñ”Ð´Ð½Ð°Ð½Ð½Ñ ÐºÐ½Ð¾Ð¿Ð¾Ðº меню вікна" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Ð¡Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ меню вікна" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "ПриÑкореннÑ" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° верхній грані куба" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Перехід до наÑтупного Ñлайда" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Ðнімувати фон" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Ðнімації фону при обертанні куба" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Зовнішній виглÑд" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Ðвтоматично" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Поведінка" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Колір верхньої та нижньої граней куба" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Колір, що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð½Ð¸Ð¶Ð½ÑŒÐ¾Ñ— межі градієнта тла" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Колір, що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²ÐµÑ€Ñ…Ð½ÑŒÐ¾Ñ— межі градієнта тла" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Шапка куба" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Кольори куба" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Куб робочого Ñтолу" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "ПриÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "ШвидкіÑть згортаннÑ" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Крок чаÑу згортаннÑ" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "По можливоÑті заÑтоÑовувати множинне Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¼Ð°ÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÑкоÑті " "зображеннÑ" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "ÐŸÐ¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð´Ð¾ попереднього Ñлайда" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Файли зображеннÑ" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "ЗображеннÑ, що викориÑтовуєтьÑÑ Ñк текÑтури Ð´Ð»Ñ Ñ„Ð¾Ð½Ñƒ" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "ПрозоріÑть куба тільки під Ñ‡Ð°Ñ Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð¼Ð¸ÑˆÐµÑŽ." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ñ ÐºÑƒÐ±Ð°" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ñ ÐºÑƒÐ±Ð°" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Перелік PNG-Ñ– SVG-файлів, Ñкі Ñлід відобразити на верхній грані куба" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Режим множинного виводу" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Декілька кубів" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Слідуючий Ñлайд" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Один великий куб" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ПрозоріÑть під Ñ‡Ð°Ñ Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "ПрозоріÑть у Ñтатичному положенні" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ПрозоріÑть Ñтільниці під Ñ‡Ð°Ñ Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "ПрозоріÑть вікон Ñтільниці в Ñтатичному положенні." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Ð Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½ на кубі" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Попередній Ñлайд" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "ÐžÐ±Ð¼Ð°Ð»ÑŒÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð¾Ð½Ñƒ" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "МаÑштаб зображеннÑ" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "МаÑштаб Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð¾ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð²ÐµÑ€Ñ…Ð½Ð¾Ñ— грані куба" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Вибір Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ ÐºÑƒÐ±Ð° при множинному виводі." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Тло" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Кінцевий колір градієнта Ð´Ð»Ñ Ñ‚Ð»Ð°" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Початковий колір градієнта Ð´Ð»Ñ Ñ‚Ð»Ð°" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ‚Ð»Ð°" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "ШвидкіÑть" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Крок чаÑу" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "ПрозоріÑть тільки при обертанні мишею" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "ПрозоріÑть куба" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "РозгортаннÑ" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Ð Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ ÐºÑƒÐ±Ð°" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Дозволити генерацію mipmaps Ð´Ð»Ñ Ñ‚ÐµÐºÑтур оформленнÑ" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Команда" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Ð”ÐµÐºÐ¾Ñ€Ð°Ñ†Ñ–Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "Команда декоратора, Ñка виконуєтьÑÑ, Ñкщо декоратор ще не запущений" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "ЗÑув тіні по оÑÑ– X" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "ЗÑув тіні по оÑÑ– Y" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Колір тіні" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "ПрозоріÑть тіні" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Ð Ð°Ð´Ñ–ÑƒÑ Ñ‚Ñ–Ð½Ñ–" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Колір тіні" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "ЗÑув тіні по оÑÑ– X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "ЗÑув тіні по оÑÑ– Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "ПрозоріÑть тіні" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Ð Ð°Ð´Ñ–ÑƒÑ Ñ‚Ñ–Ð½Ñ–" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Тінь вікон" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "ÐžÑ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "ÐžÑ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Вікна до Ñких буде заÑтоÑовано оформленнÑ" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Вікна Ñкі будуть відкидати тінь" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "ЯÑкравіÑть (у %) вікон Ñкі не відповідають" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "ПоÑтійна швидкіÑть" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "ПоÑтійний чаÑ" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Ð—Ð°Ñ‚ÐµÐ¼Ð½ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°, що не відповідає" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "Ð—Ð°Ñ‚ÐµÐ¼Ð½ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°, Ñке не відповідає на запити менеджера вікон" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "ШвидкіÑть зникненнÑ" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Знебарвлювати при згортанні / відкритті / закритті" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "ШвидкіÑть знебарвлюваннÑ" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Ð§Ð°Ñ Ð·Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Ефект Ð·Ð½ÐµÐ±Ð°Ñ€Ð²Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ згортанні / відкритті / закритті вікон" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Ефект Ð·Ð½ÐµÐ±Ð°Ñ€Ð²Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ ÑиÑтемному звуковому Ñигналі" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "ПоÑтуповий проÑв вікон при відображенні Ñ– поÑтупове Ð·Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ ÑкаÑуванні " "відображеннÑ" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Знебарвити вікна" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "ПроÑв / Ð·Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Повноекранна Ð²Ñ–Ð·ÑƒÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¾Ð³Ð¾ Ñигналу" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Повноекранний ефект проÑву / Ð·Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ ÑиÑтемному звуковому Ñигналі" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "ÐаÑиченіÑть (у %) вікна, що не відповідає" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "ЯÑкравіÑть вікна що не відповідає" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "ÐаÑиченіÑть вікна, що не відповідає" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Ð’Ñ–Ð·ÑƒÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¾Ð³Ð¾ Ñигналу" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Режим проÑву / Ð·Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "ШвидкіÑть Ð·Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ½Ð° в режимі \"ПоÑтійна швидкіÑть\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Ð§Ð°Ñ Ð·Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ½Ð° (в мÑ) в режимі \"ПоÑтійна швидкіÑть\"" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Вікна, до Ñких Ñлід заÑтоÑовувати ефект проÑву / зникненнÑ" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Точка монтуваннÑ" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Точка монтуваннÑ" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Файлова ÑиÑтема у проÑторі (fuse)" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Файлова ÑиÑтема у проÑторі (fuse)" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Підтримка оÑновного циклу GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Працює з Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Відкрити термінал" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Параметри, що підтримують ÑуміÑніÑть Compiz з оточеннÑм Ñтільниці Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Діалогове вікно запуÑку" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "ЗапуÑтити команду в терміналі" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Командний Ñ€Ñдок знімка екрана" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "&Показувати Головне меню" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Показати діалог запуÑку заÑтоÑунків" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Показувати головне меню" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Зробити знімок екрану" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Зробити знімок вікна" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Командний Ñ€Ñдок терміналу" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Командний Ñ€Ñдок знімка вікна" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Формат Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð² проÑтому INI-файлі" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Модуль ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ зміну файлу" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Ефект згортаннÑ" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Згорнути вікна" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "ШвидкіÑть згортаннÑ" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Квант чаÑу згортаннÑ" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "СтійкіÑть тіні" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "СтійкіÑть тіні" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Перетворювати вікна при згортанні та ÑкаÑуванні згортаннÑ" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Вікна, Ñкі повинні бути перетворені при згортанні" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Обмежити Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ‚Ð¸ Y межами робочої облаÑті" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Ðе оновлювати зі Ñторони Ñервера Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½ до Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Ініціювати рух вікна" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "\"Ліниве\" позиціонуваннÑ" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "ПереміÑтити вікно" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "ПереміÑтити вікно" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "ПрозоріÑть" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Ступінь прозороÑті рухомих вікон" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð²'Ñзки та автоматичне ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ð½Ñ–Ñтю " "розгорнутих вікон під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÑ‚ÑгуваннÑ" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "СкаÑувати прив'Ñзку повніÑтю розгорнутих вікон" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "ЗапуÑк Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "ЯÑкравіÑть" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ ÑÑкравоÑті" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÑÑкравоÑті" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Крок зміни ÑÑкравоÑті" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑÑкравоÑті Ð´Ð»Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Зменшити" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Збільшити" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€Ð¾Ñті" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€Ð¾Ñті" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Крок прозороÑті" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€Ð¾Ñті Ð´Ð»Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "ПрозоріÑть, ÑÑкравіÑть Ñ– наÑиченіÑть" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Ð ÐµÐ³ÑƒÐ»ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€Ð¾Ñті, ÑÑкравоÑті Ñ– наÑиченоÑті" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "ÐаÑиченіÑть" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ Ð½Ð°ÑиченоÑті" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ð½Ð°ÑиченоÑті" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Крок зміни наÑиченоÑті" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ð°ÑиченоÑті Ð´Ð»Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Крок" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Специфічні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²Ñ–ÐºÐ½Ð°" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Вікна" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Вікна, Ñкі повинні мати іншу ÑÑкравіÑть за замовчуваннÑм" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Вікна, Ñкі повинні мати іншу ÑÑкравіÑть за замовчуваннÑм" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Вікна, Ñкі повинні мати іншу ÑÑкравіÑть за замовчуваннÑм" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Ðлгоритм, що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "КаÑкадом" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "У центрі" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "ФікÑоване Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "ПримуÑове Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Горизонтальні позиції видових вікон" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Тримати в робочій облаÑті" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "Запобігти переміщенню вікон за межі екрану" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Ð Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Розміщувати на вÑÑ–Ñ… приÑтроÑÑ… виводу" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "При відображенні ви можете розміÑтити вікна в потрібних міÑцÑÑ…" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Режим розміщеннÑ" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Опозиціонувати вікна" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Випадковий" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Вибір Ñк має Ñебе веÑти Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½, Ñкщо викориÑтовуєтьÑÑ Ð´ÐµÐºÑ–Ð»ÑŒÐºÐ° " "виводів" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Розумний" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "ВикориÑтовувати активний приÑтрій виводу" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "ВикориÑтовувати приÑтрій виводу ÑфокуÑованого вікна" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "ВикориÑтовувати приÑтрій Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð· курÑором" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Вертикальні позиції видових вікон" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "ÐžÐ¿Ð¾Ð·Ð¸Ñ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ½Ð° видовоих вікон" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Обхідні шлÑхи при розміщенні вікна" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Вікна, Ñкі повинні бути опозиціоновані за замовчуваннÑм" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Вікна, Ñкі повинні бути опозиціоновані в певному екрані за замовчуваннÑм" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Вікна, Ñкі повинні бути опозиціоновані, навіть Ñкщо вони вказують, що цього " "робити не потрібно." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Вікно з фікÑованою позицією" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Вікно з фікÑованим видовим вікном" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Обхідні шлÑхи" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "ÐŸÐ¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾ X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "ÐŸÐ¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð¾Ð²Ð¾Ð³Ð¾ вікна по X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾ X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "ÐŸÐ¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾ Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "ÐŸÐ¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð¾Ð²Ð¾Ð³Ð¾ вікна по Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾ Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Завантажувач зображень Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "ВідповідніÑть регулÑрними виразами" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "ВідповідніÑть вікон за допомогою регулÑрних виразів" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "ЗакріпленнÑ" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Колір кордону" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Колір кордону, Ñкий викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¾ÐºÑ€ÐµÑÐ»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÑƒÑ€Ñƒ Ñ– режимів зміни " "розмірів прÑмокутника" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Режим зміни розміру за замовчуваннÑм" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Режим за замовчуваннÑм, Ñкий викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ розміру вікна" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Колір заливки" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" "Колір заливки, що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ зміни розмірів прÑмокутника" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Ініціювати звичайну зміну розмірів вікна" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Ініціювати зміну розмірів вікна Кордон" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Ініціювати зміну розмірів вікна ПрÑмокутник" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Ініціювати зміну розмірів вікна РозтÑгуваннÑ" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Ініціювати зміну розмірів вікна" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Ðормальна зміна розмірів вікна" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Кордон" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Кордон зміни розмірів вікна" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "ПрÑмокутник" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "ПрÑмокутна зміна розмірів вікна" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Зміна розмірів вікна" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Зміна розмірів вікна" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "ЗапуÑк зміни розмірів вікна" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "ЗапуÑк зміни розмірів вікна його розтÑганнÑм" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "ЗапуÑк звичайної зміни розмірів вікна" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "ЗапуÑк зміни розмірів вікна з показом кордону" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "ЗапуÑк зміни розмірів вікна з показом прÑмокутника" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "РозтÑгнути" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Зміна розмірів вікна розтÑгуваннÑм" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Типи вікон, Ñким Ñлід заÑтоÑовувати ефект нормальної зміни розміру" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Типи вікон, Ñким Ñлід заÑтоÑовувати ефект зміни розміру кордон" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Типи вікон, Ñким Ñлід заÑтоÑовувати ефект зміни розміру прÑмокутник" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Типи вікон, Ñким Ñлід заÑтоÑовувати ефект зміни розміру розтÑгуваннÑм" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÑ‚ÑÐ³ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ краю" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ переміщенні до краю" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ курÑорі на краю" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Ð§Ð°Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð² ліве кадрове вікно Ñ– ÑÐ¿Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÑƒÑ€Ñору" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° наÑтупне кадрове вікно при перетÑгуванні об'єкта до краю " "екрану" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° наÑтупне кадрове вікно при зÑуві курÑору до краю екрану" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° наÑтупне кадрове вікно під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ½Ð° до краю " "екрану" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð² праве кадрове вікно Ñ– ÑÐ¿Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÑƒÑ€Ñору" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Інвертувати віÑÑŒ Y Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½ÑŒ курÑору" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Інвертувати Ð´Ð»Ñ ÐºÑƒÑ€Ñора віÑÑŒ Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "ЧутливіÑть курÑору" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Піднімати при обертанні" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Піднімати вікна при обертанні" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ ÐºÑƒÐ±Ð°" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Обертати з відображеннÑм вліво" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Обертати з відображеннÑм вправо" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Обертати вліво" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Обертати вліво разом з вікном" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Обертати вправо" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Обертати вправо разом з вікном" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Обертати до" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Обертати до межі 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Обертати до межі 1 з вікном" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Обертати до межі 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Обертати до межі 10 з вікном" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Обертати до межі 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Обертати до межі 11 з вікном" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Обертати до межі 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Обертати до межі 12 з вікном" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Обертати до межі 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Обертати до межі 2 з вікном" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Обертати до межі 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Обертати до межі 3 з вікном" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Обертати до межі 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Обертати до межі 4 з вікном" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Обертати до межі 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Обертати до межі 5 з вікном" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Обертати до межі 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Обертати до межі 6 з вікном" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Обертати до межі 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Обертати до межі 7 з вікном" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Обертати до межі 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Обертати до межі 8 з вікном" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Обертати до межі 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Обертати до межі 9 з вікном" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ ÐºÑƒÐ±Ð°" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ ÐºÑƒÐ±Ð° Ñтільниці" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Обертати вліво" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Обертати вліво разом з активним вікном" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Обертати вправо" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Обертати вправо разом з активним вікном" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Обернути до Ð»Ð¸Ñ†Ñ ÐºÑƒÐ±Ð°" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Обернути до Ð»Ð¸Ñ†Ñ ÐºÑƒÐ±Ð° з вікном" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 1 з активним вікном" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 10 з активним вікном" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 11 з активним вікном" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 12 з активним вікном" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 2 з активним вікном" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 3 з активним вікном" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 4 з активним вікном" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 5 з активним вікном" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 6 з активним вікном" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 7 з активним вікном" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 8 з активним вікном" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ межі 9 з активним вікном" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ кадрового вікна" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Обертати вікно" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Обертати з вікном" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "ПриÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "ШвидкіÑть обертаннÑ" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Квант чаÑу обертаннÑ" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "ЧутливіÑть до переміщень курÑору" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Прив'Ñзка Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ ÐºÑƒÐ±Ð° до нижньої межі" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Прив'Ñзка Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ ÐºÑƒÐ±Ð° до верхньої межі" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Прив'Ñзати до нижньої межі" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Прив'Ñзати до верхньої межі" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "ЗапуÑк обертаннÑ" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Затримка в чаÑÑ– до Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ ÐºÐ°Ð´Ñ€Ð¾Ð²Ð¾Ð³Ð¾ вікна" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Змінити маÑштаб" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Ступінь прозороÑті у відÑотках" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Великий" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Режим гарÑчих клавіш з залипаннÑм" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "ВикориÑтовувати режим гарÑчих клавіш з залипаннÑм заміÑть Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ " "натиÑканні та Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ відпуÑку кнопок." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Клацніть на Ñтільниці Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñтільниці" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Затемнити тло" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Ð—Ð°Ñ‚ÐµÐ¼Ð½ÐµÐ½Ð½Ñ Ñ‚Ð»Ð° при маÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Емблема" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Перехід в режим Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñтільниці при клацані мишею на Ñтільниці під " "Ñ‡Ð°Ñ Ð¼Ð°ÑштабуваннÑ" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Ð§Ð°Ñ Ð·Ð°Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ при наведенні" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Ініціювати заÑіб вибору вікна" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "іціювати заÑіб вибору вікна Ð´Ð»Ñ Ð²ÑÑ–Ñ… вікон" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Ініціювати заÑіб вибору вікна Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¸ вікон" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Ініціювати заÑіб вибору вікна Ð´Ð»Ñ Ð²Ñ–ÐºÐ¾Ð½ поточного приÑтрою виводу" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Режим Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ з залипаннÑм" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "ВикориÑтовувати режим гарÑчих клавіш з залипаннÑм заміÑть Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ " "натиÑканні та Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ відпуÑÐºÐ°Ð½Ð½Ñ ÐºÐ½Ð¾Ð¿Ð¾Ðº." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "ÐšÐ¾Ð¼Ð¿Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° запуÑк Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²ÑÑ–Ñ… вікон" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "ÐšÐ¾Ð¼Ð¿Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° запуÑк Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸ вікон" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "ÐšÐ¾Ð¼Ð¿Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° запуÑк Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "ÐšÐ¾Ð¼Ð¿Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° запуÑк Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½ поточного приÑтрою виводу" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Ðа вÑÑ– приÑтрої виведеннÑ" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Ðа поточний приÑтрій виводу" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ÐаклаÑти значок" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "ÐÐ°ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐºÐ° на вікна при Ñ—Ñ… маÑштабуванні" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "МаÑштабуваннÑ" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "ШвидкіÑть маÑштабуваннÑ" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Квант чаÑу маÑштабуваннÑ" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Вибрати, де маÑштабувати вікна Ñкщо викориÑтовуютьÑÑ Ð¿Ñ€Ð¸Ñтрої множинного " "виводу." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "ВідÑтань між вікнами" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Інтервал" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Ð§Ð°Ñ (в мÑ) до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ маÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ наведенні покажчика на " "вікно" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Типи вікон, Ð´Ð»Ñ Ñких Ñлід заÑтоÑовувати режим маÑштабуваннÑ" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Ðвтоматично знімок екрану в цій програмі" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Каталог" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Зробити знімок облаÑті" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "ЗапуÑтити програму" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "КлаÑти Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð½Ñ–Ð¼ÐºÑ–Ð² екрану в цей каталог" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Знімок екрану" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Модуль знімка екрана" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Завантажувач зображень Svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Рівень ÑÑкравоÑті у відÑотках" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Рівень наÑиченоÑті у відÑотках" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Перемикач програм" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Ðвтоматичне обертаннÑ" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "ПереміÑтити на передній план" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¸Ð±Ñ€Ð°Ð½Ð¾Ð³Ð¾ вікна на передній план" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "При перемиканні вікон ÑÑ‚Ñ–Ð»ÑŒÐ½Ð¸Ñ†Ñ Ð½Ð° задньому плані має бути зменшена" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Піктограма" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Згорнуті" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "ÐаÑтупна панель" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "ÐаÑтупне вікно" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "ÐаÑтупне вікно (УÑÑ– вікна)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "ÐаÑтупне вікно (не виринаюче)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ñ‡Ð° (Ñкщо він невидимий) Ñ– вибір наÑтупного вікна" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ñ‡Ð° (Ñкщо він невидимий) Ñ– вибір наÑтупного вікна з уÑÑ–Ñ… " "наÑвних" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ñ‡Ð° (Ñкщо він невидимий) Ñ– вибір попереднього вікна" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ñ‡Ð° (Ñкщо він невидимий) Ñ– вибір попереднього вікна з " "уÑÑ–Ñ… наÑвних" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Попереднє вікно" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Попереднє вікно (Ð’ÑÑ– вікна)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Попереднє вікно (Ðе Ñпливаюче)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Обертати до вибраного вікна при перемиканні" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Вибрати наÑтупне вікно типу панель." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Вибрати наÑтупне вікно без показу Ñпливаючого вікна." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Вибрати попереднє вікно типу панель." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Вибрати попереднє вікно без показу Ñпливаючого вікна." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Піктограма поруч з еÑкізом" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð³Ð¾Ñ€Ð½ÑƒÑ‚Ð¸Ñ… вікон" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "ШвидкіÑть перемикача" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Квант чаÑу перемикача" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Перемикач вікон" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Вікна, Ñкі повинні бути відображені в перемикачі" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Забезпечити підтримку колірного проÑтору YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Ð’Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÐµÐ¾" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Ð’Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÐµÐ¾" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Колірний проÑтір YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Додати лінію" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Додати точку" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ ÐµÑ„ÐµÐºÑ‚Ñ–Ð² води до різних дій Ñтільниці" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Затримка (в мÑ) між краплÑми дощу" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Включити Ð´Ð»Ñ ÐºÑƒÑ€Ñора ефекти води" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "ЛініÑ" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "МаÑштаб зміщеннÑ" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Крапка" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Затримка дощу" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Хвилі заголовка" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Ð’ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ñ‰Ñƒ" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Ð’ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ ÐµÑ„ÐµÐºÑ‚Ñƒ дощу" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Переключити ÑклоочиÑник" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Ð’ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ ÐµÑ„ÐµÐºÑ‚Ñƒ ÑклоочиÑника" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Ефект води" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "МаÑштаб Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¾Ð´Ð¸" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Ефект хвиль у заголовку вікна" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Ефект фокуÑуваннÑ" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Ефект фокуÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Типи вікон з фокуÑом" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "ТертÑ" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Типи вікон при захопленні" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Роздільна здатніÑть" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Інвертована прив'Ñзка вікна" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Включити Ñ‚Ñ€ÐµÐ¼Ñ‚Ñ–Ð½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Ефект віддзеркаленнÑ" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Ефект Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Типи Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ½Ð°" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Ефект розгортаннÑ" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Мінімальний розмір" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Мінімальна роздільна здатніÑть" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "ПереміÑтити вікна" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "ТремтіннÑ" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Інвертована прив'Ñзка" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Прив'Ñзка вікон" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Пружне тертÑ" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "K пружноÑті" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "КонÑтанта пружноÑті" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "ÐŸÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð²'Ñзки вікон" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "ВикориÑтовувати модель пружини в ефекті в'Ñзкого вікна" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Роздільна здатніÑть" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Вікна, що Ñтають в'Ñзкими при фокуÑÑ–" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Вікна, що Ñтають в'Ñзкими при захопленні" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Вікна, що Ñтають в'Ñзкими при призначенні" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Вікна, що Ñтають в'Ñзкими при переміщенні" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Ефект Ñ‚Ñ€ÐµÐ¼Ñ‚Ñ–Ð½Ð½Ñ Ð¿Ñ€Ð¸ розгортанні Ñ– згортанні вікон" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "ТремÑчі Вікна" #~ msgid "Command line 0" #~ msgstr "Команда 0" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Команда \"%1\"" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Екран" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Помилка розбору командного Ñ€Ñдка." #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Фільтр: " #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Збільшити Ñтільницю" #~ msgid "Zoom In" #~ msgstr "Збільшити" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "Робоча ÑтанціÑ" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Робоча ÑтанціÑ" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Вибрано" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "ТеÑÑ‚" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "Робоча ÑтанціÑ" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Вибрано" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Сторінка вниз" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Віддалена підмережа" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Праворуч" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Сторінка вгору" #, fuzzy #~ msgid "Plane down" #~ msgstr "Windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "Віддалена підмережа" #, fuzzy #~ msgid "Plane right" #~ msgstr "Праворуч" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane up" #~ msgstr "Сторінка вгору" #, fuzzy #~ msgid "Toolbar" #~ msgstr "ІнÑтрументи" #~ msgid "Menu" #~ msgstr "Меню" #, fuzzy #~ msgid "Utility" #~ msgstr "ДиÑк з утилітами..." #, fuzzy #~ msgid "Splash" #~ msgstr "заÑтавка" #, fuzzy #~ msgid "Dialog" #~ msgstr "&Тонове набираннÑ" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Віконний менеджер" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "Меню" #, fuzzy #~ msgid "Tooltip" #~ msgstr "ІнÑтрументи" #, fuzzy #~ msgid "Notification" #~ msgstr "СповіщеннÑ" #, fuzzy #~ msgid "Dnd" #~ msgstr "Кінець" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "СенÑорний екран" #~ msgid "Unknown" #~ msgstr "Ðевідомо" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "ТриваліÑть" #, fuzzy #~ msgid "Do not modify" #~ msgstr "Ðічого не запиÑувати в журнал" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "РадіуÑ" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Увімкнути автоперехід в режим Ñну" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "ПриÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ 3D: " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "ПриÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ 3D: " #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "ТеÑÑ‚" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "РоÑійÑька ФедераціÑ" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "РоÑійÑька" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Windows" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Віддалена ÑтільницÑ" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "ПриÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ 3D: " #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "ТеÑÑ‚" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "міÑцевий чаÑ" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "міÑцевий чаÑ" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "ДіÑ" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ІÑпаніÑ" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Скрипти перемиканнÑ" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "&Вказати фільтр" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Роздільна здатніÑть" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Вибрано" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "ТеÑÑ‚" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Робоча ÑтанціÑ" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "XF86RotateWindows" #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Команда: " #, fuzzy #~ msgid "Run command %d" #~ msgstr "Команда: " #, fuzzy #~ msgid "Corners" #~ msgstr "Перетворювачі" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "ДиÑкета" #, fuzzy #~ msgid "Terminate" #~ msgstr "Термінали" compiz-0.9.11+14.04.20140409/po/sv.po0000644000015301777760000025143612321343002017113 0ustar pbusernogroup00000000000000# Swedish translation of compiz. # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # This file is distributed under the same license as the compiz package. # Daniel Nylander , 2006, 2007. # Sebastian Parborg , 2007 # msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2008-02-18 19:36+0100\n" "Last-Translator: Sebastian Parborg \n" "Language-Team: Compiz Fusion Translators \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Skrivbord" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Fönsterhantering" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ingen" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Skala" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximera" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximera fönster horisontellt" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximera fönster vertikalt" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimerat" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automatisk höjning" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Fönstermeny" # fuzzy #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Ã…tgärd när man rullar med mushjulet pÃ¥ en fönstertitel." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Suddighets typ" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Metacitys aktiva tema opacitet" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Metacitys aktiva tema opacitets skugga" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity tema opacitet" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity tema opacitet skugga" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Opacitet pÃ¥ aktiva fönster med metacity tema dekorationer" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacitet pÃ¥ metacity tema dekorationer" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Skugga aktiva fönster med metacity tema dekorationer frÃ¥n opact " "tillgenomskinlig" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Skugga fönster med metacity tema dekorationer frÃ¥n opact till genomskinlig" #: ../gtk/window-decorator/gwd.schemas.in.h:11 #, fuzzy msgid "Title bar mouse wheel action" msgstr "Fönstertitel mushjul Ã¥tgärd" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Typ av suddighet att använda för fönster dekorationer" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Använd metacity tema" # De syftar nog pÃ¥ fönsterramarna. #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Använd metacity tema vid ritande av fönsterramar" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Stäng fönster" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Avmaximera fönster" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximera fönster" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimera fönster" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Anteckning" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Antecknings fyllfärg" #: ../metadata/annotate.xml.in.h:3 #, fuzzy msgid "Annotate Stroke Color" msgstr "Antecknings streckfärg" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Insticksmodul för anteckningar" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Töm" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Rita" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Rita med verktyg" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Fyllnings färg för anteckningar" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Initiera" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Initiera antecknings ritande" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Initiera radering av anteckning" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Initiera radering" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Radbredd" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Linje bredd för anteckningar" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Streck färg för anteckningar" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Streck storlek" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Streck storlek för anteckningar" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinjär" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Alfa oskärpa" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Alfa oskärpa fönster" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Suddighetsfilter" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Suddighetsocclusion" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Suddighetsfärgmättnad" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Suddighetshastighet" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Sudda ut fönster" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Sudda ut bakom genomskinliga delar av fönster" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Suddighetsfärgmättnad" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Sudda ut fönster" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Sudda ut fönster som inte har fokus" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Akaktivera suddighet pÃ¥ skärmregioner täckta av andra fönster" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Filter metod använd för suddighet" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Fokus suddighet" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Fokusera suddiga fönster" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Gaussian" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Gaussian radie" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Gaussian strycka" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Gaussian radie" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Gaussian stryka" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap detalj-nivÃ¥" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Puls" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Pulseffekt" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Fönster studdnings-hastighet" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Fönster som ska bli pÃ¥verkade av fokus-suddighet" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Fönster som ska använda alfa-suddighet som standard" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Klona utmatning" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Initiera klon selektion" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Utmatnings klonhanterare" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando0" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando0" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Kommandorad 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Kommandorad 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Kommandorad 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Kommandorad 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Kommandorad 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Kommandorad 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Kommandorad 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Kommandorad 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Kommandorad 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Kommandorad 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Kommandorad 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Kommandorad 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command0 anropas" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command1 anropas" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command10 anropas" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command11 anropas" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command2 anropas" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command3 anropas" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command4 anropas" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command5 anropas" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command6 anropas" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command7 anropas" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command8 anropas" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command9 anropas" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Kommando" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Kör kommando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Kör kommando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Kör kommando 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Kör kommando 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Kör kommando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Kör kommando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Kör kommando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Kör kommando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Kör kommando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Kör kommando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Kör kommando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Kör kommando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktiva insticksmoduler" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "TillÃ¥t att inte utritning av helskärmsfönster omdirigeras till bilder " "utanför skärmen" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Ljudklocka" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Systemljudklocka" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatisk höjning" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Fördröjning för automatisk höjning" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatisk identifiering av outputenheter" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatisk identifiering av uppdateringsfrekvens" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Bästa" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Klicka för fokus" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Klicka pÃ¥ fönstret flyttar inmatningsfokus till det" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Stäng aktivt fönster" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Standardikon" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Standardikonbild för fönster" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Skrivbordskub" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detektera outputs" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detektera uppdateringsfrekvens" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Snabb" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Förhindra fokus" #: ../metadata/core.xml.in.in.h:25 #, fuzzy msgid "Focus Prevention Windows" msgstr "Förhindra fokus" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Förhindra fokus" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Allmänna alternativ" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Generella compiz inställningar" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bra" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Dölj fönster inte i verktygsrad" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Dölj alla fönster och fokusera pÃ¥ skrivbord" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "Dölj fönster som inte är i verktygsraden vid visa skrivbordsläget" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Virtuell horisontell storlek" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorera tips medans maximerad" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Ignorera storleksökning och aspekthintning när fönster maximeras" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervall innan markerade fönster höjs" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervall mellan ping-meddelanden" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Ljussättning" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista över för närvarande aktiva insticksmoduler" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lista över strängar som beskriver utmatningsenheter" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Sänk fönster" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Sänk fönstret under andra fönster" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximera fönster horisontellt" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximera fönster vertikalt" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximera aktivt fönster" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximera aktivt fönster horisontellt" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximera aktivt fönster vertikalt" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimera aktivt fönster" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Antal skrivbord" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Antal virtuella skrivbord" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 #, fuzzy msgid "Only perform screen updates during vertical blanking period" msgstr "Uför endast skärmuppdateringar under den vertikala blanknings perioden" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Utmatningar" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Fördröjning för ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Höj vid klick" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Höj fönster" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Höj markerade fönster efter intervall" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Höj fönstret över andra fönster" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Höj fönster när de klickas pÃ¥" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Uppdateringsfrekvens" #: ../metadata/core.xml.in.in.h:74 #, fuzzy msgid "Screen size multiplier for horizontal virtual size" msgstr "Skärmstorleksfaktor för virtuell horisontell storlek" #: ../metadata/core.xml.in.in.h:75 #, fuzzy msgid "Screen size multiplier for vertical virtual size" msgstr "Skärmstorleksfaktor för virtuell vertikal storlek" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Visa skrivbordet" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "LÃ¥ngsamma animeringar" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "Smart" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synkronisera till VBlank" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Texturfiltrering" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Texturfilter" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Texturfiltrering" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Frekvensen för updatering av skärmen (gÃ¥nger/sekund)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Växla fönstermaximering" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Växla fönstermaximering horisontellt" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Växla fönstermaximering vertikalt" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Växla fönsterskuggning" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Växla maximering av aktivt fönster" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Växla horisontell maximering av aktivt fönster" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Växla vertikal maximering av aktivt fönster" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Växla skuggning av aktivt fönster" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Växla användning av lÃ¥ngsamma animeringar" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Avmaximera aktivt fönster" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Omdirigera tillbaka helskärmsfönster" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Använd diffus belysning när skärmen transformeras" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Vertikal virtuell storlek" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 #, fuzzy msgid "Window menu button binding" msgstr "Fönstermenyns knappbindning" #: ../metadata/core.xml.in.in.h:102 #, fuzzy msgid "Window menu key binding" msgstr "Fönstermenyns tangentbindning" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Accelerering" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Justera bild" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Justera bilden pÃ¥ den övre ytan till rotation" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Fortsätt till nästa bild" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animera Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animera skydome när kub roterar" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatisk" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Färg pÃ¥ över- och undersidorna av kuben" #: ../metadata/cube.xml.in.h:11 #, fuzzy msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Färg som används till bottenfärg-stoppet av skydome-tillbakagÃ¥ngs-gradient" #: ../metadata/cube.xml.in.h:12 #, fuzzy msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Färg som används till toppenfärg-stoppet av skydome-tillbakagÃ¥ngs-gradient" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Kubfärg" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kubfärg" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Skrivbordskub" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Vikningsaccelerering" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Vikningshastighet" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Tidsintervall för vikning" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Generera mipmappar när det är möjligt för skalning av högre kvalitet" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "GÃ¥ tillbaka till föregÃ¥ende diabild" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Bildfiler" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Bild att använda som textur för skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Aktiverar kub genomskinlighet endast om rotationen sker med musen" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "I kuben" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "I kuben" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista över PNG- och SVG-filer som ska ritas ut pÃ¥ översta ytan av kuben" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Läge för multipla utmatningar" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Flera kuber" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Nästa diabild" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "PÃ¥ stora kuben" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacitet under rotation" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacitet när kuben inte roterar" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacitet av skrivbordsfönster under rotation" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacitet av skrivbordsfönster när kuben inte roterar" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Placera fönster pÃ¥ kuben" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "FöregÃ¥ende diabild" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Rita ut skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Skala bild" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Skala bilder för att täcka övre ytan pÃ¥ kuben" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Väljer hur kuben visar om flera output enheter används" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 #, fuzzy msgid "Skydome Gradient End Color" msgstr "Skydome gradient slut färg" #: ../metadata/cube.xml.in.h:44 #, fuzzy msgid "Skydome Gradient Start Color" msgstr "Skydome gradient start färg" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Skydome bild" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Hastighet" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Tidsintervall" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Genomskinlighet endast via musrotation" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Vik ut" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Vik ut kub" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 #, fuzzy msgid "Dbus Control Backend" msgstr "Dbus kontrollbackend" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "TillÃ¥t mipmaps att bli genererade för dekorationstexturer" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Kommando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekorationsfönster" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "Dekorerarkommado som körs om inte nÃ¥gon dekorerare redan körs" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Skuggkastning X-position" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Skuggkastning Y-position" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Färg för skuggkastning" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opakhet för skuggkastning" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Radie för skuggkastning" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Skuggfärg" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Skuggposition X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Skuggposition Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Skuggopakhet" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Skuggradie" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Skuggfönster" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Fönsterram" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Fönsterramar" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Fönster som ska dekoreras" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Fönster som ska ha en skugga" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Rotationshastighet" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Begränsa Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Ändra fönstrets storlek normalt" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Toningstid" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Tona vid minimering/öppna/stäng" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Toningshastighet" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Toningstid" #: ../metadata/fade.xml.in.h:11 #, fuzzy msgid "Fade effect on minimize/open/close window events" msgstr "Toningeffekt pÃ¥ minimera/öppna/stänga fönster tillfällen" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Toningseffekt vid systemsignal" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "Tona in fönster när de kopplas och tona ut fönster när de kopplas loss" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Tona fönster" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Tonande fönster" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Visuell helskärmssignal" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Helskärmstoningseffekt vid systemsignal" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Visuell signal" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Fönstertoningshastighet" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Fönster som ska skalas i skalningsläget" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Fönster som ska tonas" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Monteringspunkt" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Monteringspunkt" #: ../metadata/fs.xml.in.h:3 #, fuzzy msgid "Userspace File System" msgstr "Användarutrymmes filsystem" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Användarutrymmes filsystem" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 #, fuzzy msgid "GConf Control Backend" msgstr "GConf kontrollbackend" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 #, fuzzy msgid "GLib main loop support" msgstr "GLib huvudloop stöd" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Öppna en terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Kördialog" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Kommandorad för terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Kommandorad för skärmbild" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Visa huvudmeny" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Visa dialogen Kör program" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Visa huvudmenyn" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Ta en skärmbild" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Ta en skärmbild av ett fönster" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Kommandorad för terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Kommandorad för fönsterskärmbild" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 #, fuzzy msgid "Ini Flat File Backend" msgstr "Ini platt fil backend" #: ../metadata/inotify.xml.in.h:1 #, fuzzy msgid "File change notification plugin" msgstr "Filändringsnotifiering insticksmodul" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 #, fuzzy msgid "Kconfig Control Backend" msgstr "Kconfig kontrollbackend" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimeringseffekt" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimera fönster" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimeringshastighet" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Tidsintervall för minimering" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "SkuggmotstÃ¥nd" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "SkuggmotstÃ¥nd" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformera fönster när de minimeras och avminimeras" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Fönster som ska bli transformerade när de blir minimerade" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Begränsa Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Begränsa Y-koordinat till arbetsyta" #: ../metadata/move.xml.in.h:3 #, fuzzy msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Uppdatera inte positonen pÃ¥ fönsterna till servern förrän de har slutat röra " "sig" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Initiera fönsterflyttning" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Lat postionering" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Flytta fönster" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Flytta fönster" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacitet" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "OpacitetnivÃ¥ för flyttande fönster" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Koppla loss och automatiskt avmaximera maximerade fönster när de dras" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Koppla loss maximerade fönster" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Börja flytta fönster" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Ljusstyrka" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Ljusstyrka" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Ljusstyrka" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Ljusstyrka" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Minska opacitet" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Öka opacitet" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Ändringsintervall för opacitet" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Ändringsintervall för opacitet" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Intervall för opacitet" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "OpacitetnivÃ¥ för flyttande fönster" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Opacitet under rotation" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Färgmättnad" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Färgmättnad" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Färgmättnad" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Färgmättnad" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Fönsterramar" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Opacitet fönster värden" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Koppla fönster" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Fönster som ska bli positionerade som standard" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Fönster som ska vara genomskinliga som standard" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Fönster som ska bli positionerade som standard" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritm att använda för fönsterplacering" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Kaskad" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centrerad" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Fönsterhantering" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Förhindra fokus" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Horisontella skivbordsvypositioner" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Placera fönster" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Placera fönster pÃ¥ lämpliga positioner när de kopplas" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Placeringsläge" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Positionerade fönster" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Slumpmässigt" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "Väljer var fönster blir skalade om flera outputenheter används" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Smart" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "PÃ¥ alla utmatningsenheter" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Vertikalarbetsytas positioner" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Arbetsyta positionerade fönster" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Problemlösning för fönsterplacering" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Fönster som ska bli positionerade som standard" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Fönster som ska bli positionerade i en specifik arbetsyta som standard" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Fönsterramar" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Problemlösningar" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X-positioner" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "X arbetsyta positioner" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X-positionsvärden" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y-positioner" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Y arbetsyta positioner" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y-positionsvärden" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png-bildläsare" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Reguljär uttrycksmatchning" #: ../metadata/regex.xml.in.h:2 #, fuzzy msgid "Regex window matching" msgstr "Växla fönsterfästning" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Ramfärg" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Ramfärg använd för kontur och rektangel fönsterstorleksändringsläge" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Standard storlekändringsläge" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Standard läged använt för fönster storleksändring" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Fyllnadsfärg" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Fyllningsfärg för rektangeln i justeringsläge" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Initiera normal fönsterskalning" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Initiera kontur fönsterskalning" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Initiera rektangel fönsterskalning" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Initiera töjnings fönsterskalning" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Initiera fönsterskalning" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Ändra fönstrets storlek normalt" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Kontur" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Kontur justera fönster" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rektangel" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Ändra fönstrets storlek rektangulärt" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Skala fönster" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Skala fönster" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Börja skala fönster" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Börja storleksändra fönstret genom att sträcka det" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Börja storleksändra fönstret normalt" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Börja storleksändra fönstret med kontur" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Börja storleksändra fönstret rektangulärt" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Töj" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Töj ut fönstrets storlek" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Fönster som normal storleksändring ska användas för" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Fönster som storleksändring med kontur ska användas för" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Fönster som rektangulär storleksändring ska användas för" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Fönster som storleksändring med sträckning ska användas för" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Kantvänd DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Kantvänd flyttning" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Kantvänd pekare" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Vändtid" #: ../metadata/rotate.xml.in.h:7 #, fuzzy msgid "Flip to left viewport and warp pointer" msgstr "Vänd till nästa skrivbordsvy när muspekaren flyttas till skärmens kant" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "Vänd till nästa skrivbordsvy när objekt dras till skärmens kant" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "Vänd till nästa skrivbordsvy när muspekaren flyttas till skärmens kant" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Vänd till nästa skrivbordsvy när fönster flyttas till skärmens kant" #: ../metadata/rotate.xml.in.h:11 #, fuzzy msgid "Flip to right viewport and warp pointer" msgstr "Vänd till nästa skrivbordsvy när muspekaren flyttas till skärmens kant" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Invertera Y-axeln för pekarens rörelser" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Invertera pekarens Y-axel" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Muspekarkänslighet" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Höj upp vid rotation" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Höj upp fönster under rotation" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Rotera kub" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Flipprotera Ã¥t vänster" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Flipprotera Ã¥t höger" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Rotera Ã¥t vänster" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Rotera Ã¥t vänster med fönster" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Rotera Ã¥t höger" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Rotera Ã¥t höger med fönster" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Rotera till" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Rotera till yta 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Rotera till yta 1 med fönster" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Rotera till yta 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Rotera till yta 10 med fönster" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Rotera till yta 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Rotera till yta 11 med fönster" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Rotera till yta 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Rotera till yta 12 med fönster" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Rotera till yta 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Rotera till yta 2 med fönster" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Rotera till yta 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Rotera till yta 3 med fönster" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Rotera till yta 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Rotera till yta 4 med fönster" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Rotera till yta 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Rotera till yta 5 med fönster" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Rotera till yta 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Rotera till yta 6 med fönster" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Rotera till yta 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Rotera till yta 7 med fönster" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Rotera till yta 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Rotera till yta 8 med fönster" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Rotera till yta 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Rotera till yta 9 med fönster" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Rotera kub" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Rotera skrivbordskub" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Rotera Ã¥t vänster" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Rotera Ã¥t vänster och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Rotera Ã¥t höger" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Rotera Ã¥t höger och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Rotera till yta 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Rotera till yta 1 med fönster" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Rotera till yta 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Rotera till yta 1 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Rotera till yta 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Rotera till yta 10 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Rotera till yta 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Rotera till yta 11 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Rotera till yta 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Rotera till yta 12 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Rotera till yta 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Rotera till yta 2 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Rotera till yta 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Rotera till yta 3 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Rotera till yta 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Rotera till yta 4 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Rotera till yta 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Rotera till yta 5 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Rotera till yta 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Rotera till yta 6 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Rotera till yta 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Rotera till yta 7 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Rotera till yta 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Rotera till yta 8 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Rotera till yta 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Rotera till yta 9 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Rotera till skrivbordsvy" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Rotera fönster" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Rotera med fönster" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Rotationsacceleration" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Rotationshastighet" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Tidsintervall för rotation" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Rotationszoom" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Känslighet för flyttning av muspekare" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Fäst kubroteringen till undersidan" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Fäst kubroteringen till översidan" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Fäst till undersidan" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Fäst till översidan" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Starta rotering" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tidsgräns innan vändning av skrivbordsvy" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Mängden opacitet i procent" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Stor" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Klicka pÃ¥ Skrivbord för att visa skrivbordet" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Mörka bakgrunden" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Mörka bakgrunden vid fönsterskalning" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblem" #: ../metadata/scale.xml.in.h:12 #, fuzzy msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "GÃ¥ till \"Visa skrivbords läge\" när skrivbordet blir klickat pÃ¥ under " "skalning" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Pekartid" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Initiera fönsterväljare" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Initiera fönsterväljare för alla fönster" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Initiera fönsterväljare för fönstergrupp" #: ../metadata/scale.xml.in.h:17 #, fuzzy msgid "Initiate Window Picker For Windows on Current Output" msgstr "Initiera fönsterväljare för fönster pÃ¥ nuvarande output" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Lägg ut och börja omforma alla fönster" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Lägg ut och börja omforma fönstergrupp" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Lägg ut och börja omforma fönster" #: ../metadata/scale.xml.in.h:23 #, fuzzy msgid "Layout and start transforming windows on current output" msgstr "Lägg ut och börja omforma fönster pÃ¥ nuvarande output" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "PÃ¥ alla utmatningsenheter" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "PÃ¥ aktuell utmatningsenhet" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Lägg ikoner över" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Lägg en ikon över fönster när de är skalade" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Skala" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Skala fönster" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Skalningshastighet" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Tidsintervall för skalning" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Skala fönster" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "Väljer var fönster blir skalade om flera outputenheter används" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Mellanrum mellan fönster" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Mellanrum" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "Tid (i ms) innan skalningsläget avslutas när man pekar pÃ¥ ett fönster" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Fönster som ska skalas i skalningsläget" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Öppna automatiskt skärmbilder i detta program" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Katalog" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Ta en rektangulär skärmbild" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Kör program" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Lägg skärmbilder i den här katalogen" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Skärmbild" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Insticksmodul för skärmbild" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg-bildläsare" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Ljusstyrka i procent" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Färgmättnad i procent" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Programväxlare" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automatisk rotering" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Lägg överst" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Lägg markerat fönster överst" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "AvstÃ¥nd som skrivbordet ska zoomas ut till vid växling av fönster" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikon" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimerat" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Skrivbordsplan" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Nästa fönster" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Nästa fönster (Alla fönster)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Nästa fönster (Ingen popup)" #: ../metadata/switcher.xml.in.h:20 #, fuzzy msgid "Popup switcher if not visible and select next window" msgstr "Poppa upp fönsterväxlare om den inte är synlig och välj nästa fönster" #: ../metadata/switcher.xml.in.h:21 #, fuzzy msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Poppa upp fönsterväxlare om den inte är synlig och välj nästa fönster utav " "alla fönster" #: ../metadata/switcher.xml.in.h:22 #, fuzzy msgid "Popup switcher if not visible and select previous window" msgstr "" "Poppa upp fönsterväxlare om den inte är synlig och välj föregÃ¥ende fönster" #: ../metadata/switcher.xml.in.h:23 #, fuzzy msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Poppa upp fönsterväxlare om den inte är synlig och välj föregÃ¥ende " "fönsterutav alla fönster" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "FöregÃ¥ende diabild" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Föreg fönster" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Föreg fönster (Alla fönster)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Föreg fönster (Ingen popup)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Rotera till det valda fönstret under växling" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Välj nästa fönster utan att visa popupfönstret" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Välj föregÃ¥ende fönster utan att visa popupfönstret" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Välj föregÃ¥ende fönster utan att visa popupfönstret" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Visa ikon bredvid miniatyrbild" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Visa minimerade fönster" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Växlingshastighet" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Tidsintervall för växlare" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Växelfönster" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Fönster som ska bli visade i växlaren" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "TillhandahÃ¥ll \"YV12 colorspace\"-stöd" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Videouppspelning" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Videouppspelning" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 colorspace" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Lägg till rad" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Lägg till punkt" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Lägger till vatteneffekter till olika skrivbordsÃ¥tgärder" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Fördröjning (i ms) mellan varje regndroppe" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Aktivera vatteneffekt för muspekare" # Rad eller linje? En bra frÃ¥ga... #: ../metadata/water.xml.in.h:7 #, fuzzy msgid "Line" msgstr "Rad" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Positionsskala" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punkt" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Regnfördröjning" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "TitelvÃ¥g" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Växla regn" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Växla regneffekt" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Växla vindrutetorkare" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Växla torkareffekt" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Vatteneffekt" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Vattenkompensationsskala" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "VÃ¥geffekt frÃ¥n fönstrets titellist" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Fokuseffekt" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Fokuseffekt för fönster" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Fokusera fönster" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Friktion" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "FÃ¥nga fönster" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Rutnätsupplösning" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Inverterad fönsterfästning" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Skaka fönster" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Kopplingseffekt" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Kopplingseffekt för fönster" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Koppla fönster" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Maximeringseffekt" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Maximal rutnätsstorlek" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimal vertexrutnätsstorlek" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Flytta fönster" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Skaka" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Invertera fästning" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Fäst fönster" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fjäderfriktion" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Fjäder K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Fjäderkonstant" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Växla fönsterfästning" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Använd fjädereffekt för fönstergeléeffekt" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Upplösning för vertexrutnät" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Fönster som ska dallra när de fokuseras" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Fönster som ska dallra när de fÃ¥ngas" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Fönster som ska dallra när de binds" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Fönster som ska dallra när de flyttas" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Geléeffekt vid maximering och avmaximering av fönster" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Geléaktiga fönster" #~ msgid "Command line 0" #~ msgstr "Kommandorad 0" #~ msgid "Run command 0" #~ msgstr "Kör kommando 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Kommandorad för skärmbild" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Kommandorad för skärmbild" #~ msgid "Filter Linear" #~ msgstr "Filtrera linjärt" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Använd linjärt filter när inzoomad" #~ msgid "Zoom Desktop" #~ msgstr "Zooma skrivbord" #~ msgid "Zoom In" #~ msgstr "Zooma in" #~ msgid "Zoom Out" #~ msgstr "Zooma ut" #~ msgid "Zoom Pan" #~ msgstr "Zooma panorering" #~ msgid "Zoom Speed" #~ msgstr "Zoomhastighet" #~ msgid "Zoom Timestep" #~ msgstr "Tidsintervall för zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zooma och panorera skrivbordskub" #~ msgid "Zoom factor" #~ msgstr "Zoomfaktor" #~ msgid "Zoom pan" #~ msgstr "Zooma panorering" #~ msgid "Decrease window opacity" #~ msgstr "Minska fönstret opacitet" #~ msgid "Increase window opacity" #~ msgstr "Öka fönsteropacitet" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "Opacitet värden för fönster som ska vara genomskinliga som standard" #~ msgid "Opacity windows" #~ msgstr "Opacitet fönster" #~ msgid "Background Images" #~ msgstr "Bakgrundsbilder" #~ msgid "Background images" #~ msgstr "Bakgrundsbilder" #~ msgid "Place windows on a plane" #~ msgstr "Placera fönster pÃ¥ ett plan" #~ msgid "Plane Down" #~ msgstr "Plana nedÃ¥t" #~ msgid "Plane Left" #~ msgstr "Plana Ã¥t vänster" #~ msgid "Plane Right" #~ msgstr "Plana Ã¥t höger" #~ msgid "Plane To Face 1" #~ msgstr "Plana till yta 1" #~ msgid "Plane To Face 10" #~ msgstr "Plana till yta 10" #~ msgid "Plane To Face 11" #~ msgstr "Plana till yta 11" #~ msgid "Plane To Face 12" #~ msgstr "Plana till yta 12" #~ msgid "Plane To Face 2" #~ msgstr "Plana till yta 2" #~ msgid "Plane To Face 3" #~ msgstr "Plana till yta 3" #~ msgid "Plane To Face 4" #~ msgstr "Plana till yta 4" #~ msgid "Plane To Face 5" #~ msgstr "Plana till yta 5" #~ msgid "Plane To Face 6" #~ msgstr "Plana till yta 6" #~ msgid "Plane To Face 7" #~ msgstr "Plana till yta 7" #~ msgid "Plane To Face 8" #~ msgstr "Plana till yta 8" #~ msgid "Plane To Face 9" #~ msgstr "Plana till yta 9" #~ msgid "Plane Up" #~ msgstr "Plana uppÃ¥t" #~ msgid "Plane down" #~ msgstr "Plana nedÃ¥t" #~ msgid "Plane left" #~ msgstr "Plana Ã¥t vänster" #~ msgid "Plane right" #~ msgstr "Plana Ã¥t höger" #~ msgid "Plane to face 1" #~ msgstr "Plana till yta 1" #~ msgid "Plane to face 10" #~ msgstr "Plana till yta 10" #~ msgid "Plane to face 11" #~ msgstr "Plana till yta 11" #~ msgid "Plane to face 12" #~ msgstr "Plana till yta 12" #~ msgid "Plane to face 2" #~ msgstr "Plana till yta 2" #~ msgid "Plane to face 3" #~ msgstr "Plana till yta 3" #~ msgid "Plane to face 4" #~ msgstr "Plana till yta 4" #~ msgid "Plane to face 5" #~ msgstr "Plana till yta 5" #~ msgid "Plane to face 6" #~ msgstr "Plana till yta 6" #~ msgid "Plane to face 7" #~ msgstr "Plana till yta 7" #~ msgid "Plane to face 8" #~ msgstr "Plana till yta 8" #~ msgid "Plane to face 9" #~ msgstr "Plana till yta 9" #~ msgid "Plane up" #~ msgstr "Plana uppÃ¥t" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Skrivbordsfönster opacitet toningstid" compiz-0.9.11+14.04.20140409/po/mk.po0000644000015301777760000017117312321343002017071 0ustar pbusernogroup00000000000000# Macedonian message file for YaST2 (@memory@). # Copyright (C) 2006 SUSE Linux Products GmbH. # Зоран ДимовÑки # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2001-07-17 16:12+0200\n" "Last-Translator: Зоран ДимовÑки \n" "Language-Team: Macedonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n>1);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "ПоÑтави филтер" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "ПоÑтави филтер" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "ПоÑтави филтер" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "РуÑки" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "РуÑки" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "РуÑки" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "РуÑки" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "РуÑки" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "ПоÑтави филтер" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "ПоÑтави филтер" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "ПоÑтави филтер" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "РуÑки" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "ПоÑтави филтер" compiz-0.9.11+14.04.20140409/po/lo.po0000644000015301777760000017005212321343002017067 0ustar pbusernogroup00000000000000# Lao message file for YaST2 (@memory@). # Copyright (C) 2006 SUSE Linux Products GmbH. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2006-01-04 08:58+0100\n" "Last-Translator: i18n@suse.de\n" "Language-Team: Lao \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" compiz-0.9.11+14.04.20140409/po/id.po0000644000015301777760000017536112321343002017061 0ustar pbusernogroup00000000000000# Indonesian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999-2001 SuSE GmbH. # I Made Wiryana , 1999. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2002-10-08 13:38+0200\n" "Last-Translator: I Made Wiryana \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Desktop" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Kecepatan:" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" # IN #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "India" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" # IN #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "India" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" # IN #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "India" # IN #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "India" # IN #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "India" # IN #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "India" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Kecepatan:" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Kecepatan:" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Adakan Partisi ZEN" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Rusia" # RU #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Rusia" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Rusia" # RU #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Rusia" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Rusia" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" # IN #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "India" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Adakan Partisi ZEN" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Adakan Partisi ZEN" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" # SH #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Santa Helena" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Set filter" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Set filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" # RU #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "Rusia" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" # IN #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "India" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Desktop" # RU #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "Rusia" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Kecepatan:" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "Kecepatan:" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Kecepatan:" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Adakan Partisi ZEN" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" # RU #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Rusia" # RU #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "Rusia" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Kecepatan:" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Kecepatan:" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Kecepatan:" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Kecepatan:" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 #, fuzzy msgid "Open a terminal" msgstr "Jalankan dalam terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Kecepatan:" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" # RU #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Rusia" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Adakan Partisi ZEN" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" # RU #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Rusia" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Adakan Partisi ZEN" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Adakan Partisi ZEN" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" # RU #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "Rusia" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" # RU #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Rusia" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" # IN #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "India" # IN #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "India" # IN #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "India" # IN #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "India" # IN #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "India" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" # IN #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "India" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" # IN #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "India" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" # RU #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Rusia" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Kecepatan:" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Kecepatan:" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" # IN #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "India" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" # ES #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Spanyol" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Direktori\n" # IN #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "India" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Pindah aplikasi:" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" # IN #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "India" # ES #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Spanyol" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Desktop" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Adakan Partisi ZEN" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Adakan Partisi ZEN" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" # SH #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Santa Helena" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Adakan Partisi ZEN" # ES #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Spanyol" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "Driver" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" # ES #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Spanyol" # ES #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Spanyol" # ES #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Spanyol" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Desktop" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Kecepatan:" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "Kecepatan:" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Kecepatan:" #, fuzzy #~ msgid "Unknown" #~ msgstr "tidak dikenal" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Adakan Partisi ZEN" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Kecepatan:" # RU #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Rusia" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Rusia" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Desktop" # RU #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Rusia" # ES #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Spanyol" # ES #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Spanyol" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Set filter" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Kecepatan:" compiz-0.9.11+14.04.20140409/po/ja.po0000644000015301777760000026634612321343002017063 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-05-10 21:42+0900\n" "Last-Translator: jiro kawada \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "デスクトップ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "ウィンドウ管ç†" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 #: ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "ãªã—" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "シェード" #: ../gtk/gnome/compiz-window-manager.c:428 #: ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "最大化" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "水平方å‘ã«æœ€å¤§åŒ–" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "垂直方å‘ã«æœ€å¤§åŒ–" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "最å°åŒ–" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "最å‰é¢ã¸" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "最後é¢ã¸" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "ウィンドウメニュー" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "ウィンドウã®ã‚¿ã‚¤ãƒˆãƒ«ãƒãƒ¼ä¸Šã§ãƒžã‚¦ã‚¹ãƒ›ã‚¤ãƒ¼ãƒ«ã‚’スクロールã•ã›ãŸã¨ãã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "ブラーã®ç¨®é¡ž" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Metacity テーマã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–・ウィンドウã®ä¸é€æ˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity テーマã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–・ウィンドウã®åŠé€æ˜Žã‚·ã‚§ãƒ¼ãƒ‰" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity テーマã®ä¸é€æ˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity テーマã®åŠé€æ˜Žã‚·ã‚§ãƒ¼ãƒ‰" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Metacity テーマ装飾ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–・ウィンドウã«ä½¿ç”¨ã™ã‚‹ä¸é€æ˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Metacity テーマ装飾ã«ä½¿ç”¨ã™ã‚‹ä¸é€æ˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "Shade active windows with metacity theme decorations from opaque to translucent" msgstr "Metacity テーマ装飾ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–・ウィンドウをä¸é€æ˜Žã‹ã‚‰é€æ˜Žã«ã‚·ã‚§ãƒ¼ãƒ‰ã•ã›ã‚‹" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "Shade windows with metacity theme decorations from opaque to translucent" msgstr "Metacity テーマ装飾ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’ä¸é€æ˜Žã‹ã‚‰é€æ˜Žã«ã‚·ã‚§ãƒ¼ãƒ‰ã•ã›ã‚‹" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "タイトルãƒãƒ¼ã®ãƒžã‚¦ã‚¹ãƒ›ã‚¤ãƒ¼ãƒ«ãƒ»ã‚¢ã‚¯ã‚·ãƒ§ãƒ³" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "ウィンドウ装飾用ã®ãƒ–ラーã®ç¨®é¡ž" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Metacity テーマを使用" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "ウィンドウ装飾をæç”»ã™ã‚‹éš›ã« Metacity テーマを使用" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "ウィンドウを閉ã˜ã‚‹" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®æœ€å¤§åŒ–解除" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "ウィンドウを最大化" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "ウィンドウを最å°åŒ–" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "最å‰é¢ã«è¡¨ç¤º" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "スティック" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "シェード解除" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "最å‰é¢è¡¨ç¤ºè§£é™¤" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "スティッキー解除" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "ウィンドウ \"%s\" ã¯å¿œç­”ã—ã¦ã„ã¾ã›ã‚“。" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "ã“ã®ã‚¢ãƒ—リケーションを強制的ã«çµ‚了ã•ã›ã‚‹ã¨ã€æœªä¿å­˜ã®å¤‰æ›´ã¯ã™ã¹ã¦å¤±ã‚れã¾ã™ã€‚" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "強制終了(_F)" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "注釈線" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "注釈線ã®å¡—り色" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "注釈ã®ã‚¹ãƒˆãƒ­ãƒ¼ã‚¯ã®è‰²" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "注釈線プラグイン" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "消去" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "æç”»" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "ツールを使用ã—ã¦æç”»" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "注釈線ã®å¡—り色" #: ../metadata/annotate.xml.in.h:9 #: ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 #: ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "é–‹å§‹" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "æ³¨é‡ˆç·šã®æç”»ã‚’é–‹å§‹" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "注釈線ã®å‰Šé™¤ã‚’é–‹å§‹" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "削除開始" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "ç·šå¹…" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "注釈線ã®ç·šå¹…" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "注釈線ã®ã‚¹ãƒˆãƒ­ãƒ¼ã‚¯ã®è‰²" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "ストロークã®å¹…" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "注釈線ã®ã‚¹ãƒˆãƒ­ãƒ¼ã‚¯ã®å¹…" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x ãƒã‚¤ãƒªãƒ‹ã‚¢" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "アルファ・ブラー" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "アルファ・ブラー対象ウィンドウ" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "ブラーフィルタ" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "ブラーé®è”½" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "ブラー彩度" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "ブラー速度" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "ウィンドウã®ãƒ–ラー" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "ウィンドウã®é€éŽéƒ¨åˆ†ã®èƒŒå¾Œã‚’ã¼ã‹ã™" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "ã¼ã‹ã—ã®å½©åº¦" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "ウィンドウをã¼ã‹ã™" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "フォーカスãŒãªã„ウィンドウをã¼ã‹ã™" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "ä»–ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§è¦†ã„éš ã•れãŸç”»é¢åŸŸã®ãƒ–ラーを無効化" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "ブラーã«ä½¿ç”¨ã™ã‚‹ãƒ•ィルタ方法" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "フォーカス・ブラー" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "フォーカス・ブラー対象ウィンドウ" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "ガウス" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "ガウスåŠå¾„" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "ガウス強度" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "ガウスåŠå¾„" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "ガウス強度" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "テクスãƒãƒ£ã®ç‹¬ç«‹èª­ã¿å‡ºã—" #: ../metadata/blur.xml.in.h:23 #: ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 #: ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "ミップマップ" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "ミップマップ詳細レベル" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "ミップマップã®è©³ç´°ãƒ¬ãƒ™ãƒ«" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "点滅" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "点滅効果" #: ../metadata/blur.xml.in.h:28 msgid "Use the available texture units to do as many as possible independent texture fetches." msgstr "利用å¯èƒ½ãªãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ»ãƒ¦ãƒ‹ãƒƒãƒˆã‚’使用ã—ã¦ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’å¯èƒ½ãªé™ã‚Šå¤šã独立読ã¿å‡ºã—ã•ã›ã‚‹" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "ウィンドウ・ブラーã®é€Ÿåº¦" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "フォーカス・ブラーã®åŠ¹æžœå¯¾è±¡ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "デフォルトã§ã‚¢ãƒ«ãƒ•ァ・ブラー使用対象ã«ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "クローン出力" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "è¤‡è£½é¸æŠžã®é–‹å§‹" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "クローン出力ãƒãƒ³ãƒ‰ãƒ©" #: ../metadata/commands.xml.in.h:1 msgid "A button binding that when invoked, will run the shell command identified by command0" msgstr "呼ã³å‡ºã—時ã«ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ 0 ã§æŒ‡å®šã—ãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:2 msgid "A button binding that when invoked, will run the shell command identified by command1" msgstr "呼ã³å‡ºã—時㫠コマンドライン 1 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:3 msgid "A button binding that when invoked, will run the shell command identified by command10" msgstr "呼ã³å‡ºã—時㫠コマンドライン 10 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:4 msgid "A button binding that when invoked, will run the shell command identified by command11" msgstr "呼ã³å‡ºã—時㫠コマンドライン 11 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:5 msgid "A button binding that when invoked, will run the shell command identified by command2" msgstr "呼ã³å‡ºã—時㫠コマンドライン 2 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:6 msgid "A button binding that when invoked, will run the shell command identified by command3" msgstr "呼ã³å‡ºã—時㫠コマンドライン 3 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:7 msgid "A button binding that when invoked, will run the shell command identified by command4" msgstr "呼ã³å‡ºã—時㫠コマンドライン 4 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:8 msgid "A button binding that when invoked, will run the shell command identified by command5" msgstr "呼ã³å‡ºã—時㫠コマンドライン 5 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:9 msgid "A button binding that when invoked, will run the shell command identified by command6" msgstr "呼ã³å‡ºã—時㫠コマンドライン 6 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:10 msgid "A button binding that when invoked, will run the shell command identified by command7" msgstr "呼ã³å‡ºã—時㫠コマンドライン 7 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:11 msgid "A button binding that when invoked, will run the shell command identified by command8" msgstr "呼ã³å‡ºã—時㫠コマンドライン 8 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:12 msgid "A button binding that when invoked, will run the shell command identified by command9" msgstr "呼ã³å‡ºã—時㫠コマンドライン 9 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:13 msgid "A keybinding that when invoked, will run the shell command identified by command0" msgstr "呼ã³å‡ºã—時ã«ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ 0 ã§æŒ‡å®šã—ãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:14 msgid "A keybinding that when invoked, will run the shell command identified by command1" msgstr "呼ã³å‡ºã—時㫠コマンドライン 1 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:15 msgid "A keybinding that when invoked, will run the shell command identified by command10" msgstr "呼ã³å‡ºã—時㫠コマンドライン 10 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:16 msgid "A keybinding that when invoked, will run the shell command identified by command11" msgstr "呼ã³å‡ºã—時㫠コマンドライン 11 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:17 msgid "A keybinding that when invoked, will run the shell command identified by command2" msgstr "呼ã³å‡ºã—時㫠コマンドライン 2 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:18 msgid "A keybinding that when invoked, will run the shell command identified by command3" msgstr "呼ã³å‡ºã—時㫠コマンドライン 3 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:19 msgid "A keybinding that when invoked, will run the shell command identified by command4" msgstr "呼ã³å‡ºã—時㫠コマンドライン 4 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:20 msgid "A keybinding that when invoked, will run the shell command identified by command5" msgstr "呼ã³å‡ºã—時㫠コマンドライン 5 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:21 msgid "A keybinding that when invoked, will run the shell command identified by command6" msgstr "呼ã³å‡ºã—時㫠コマンドライン 6 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:22 msgid "A keybinding that when invoked, will run the shell command identified by command7" msgstr "呼ã³å‡ºã—時㫠コマンドライン 7 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:23 msgid "A keybinding that when invoked, will run the shell command identified by command8" msgstr "呼ã³å‡ºã—時㫠コマンドライン 8 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:24 msgid "A keybinding that when invoked, will run the shell command identified by command9" msgstr "呼ã³å‡ºã—時㫠コマンドライン 9 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:25 msgid "An edge binding that when invoked, will run the shell command identified by command0" msgstr "呼ã³å‡ºã—時ã«ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ 0 ã§æŒ‡å®šã—ãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚¨ãƒƒã‚¸å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:26 msgid "An edge binding that when invoked, will run the shell command identified by command1" msgstr "呼ã³å‡ºã—時㫠コマンドライン 1 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚¨ãƒƒã‚¸å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:27 msgid "An edge binding that when invoked, will run the shell command identified by command10" msgstr "呼ã³å‡ºã—時㫠コマンドライン 10 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚¨ãƒƒã‚¸å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:28 msgid "An edge binding that when invoked, will run the shell command identified by command11" msgstr "呼ã³å‡ºã—時㫠コマンドライン 11 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚¨ãƒƒã‚¸å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:29 msgid "An edge binding that when invoked, will run the shell command identified by command2" msgstr "呼ã³å‡ºã—時㫠コマンドライン 2 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚¨ãƒƒã‚¸å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:30 msgid "An edge binding that when invoked, will run the shell command identified by command3" msgstr "呼ã³å‡ºã—時㫠コマンドライン 3 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚¨ãƒƒã‚¸å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:31 msgid "An edge binding that when invoked, will run the shell command identified by command4" msgstr "呼ã³å‡ºã—時㫠コマンドライン 4 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚¨ãƒƒã‚¸å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:32 msgid "An edge binding that when invoked, will run the shell command identified by command5" msgstr "呼ã³å‡ºã—時㫠コマンドライン 5 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚¨ãƒƒã‚¸å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:33 msgid "An edge binding that when invoked, will run the shell command identified by command6" msgstr "呼ã³å‡ºã—時㫠コマンドライン 6 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚¨ãƒƒã‚¸å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:34 msgid "An edge binding that when invoked, will run the shell command identified by command7" msgstr "呼ã³å‡ºã—時㫠コマンドライン 7 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚¨ãƒƒã‚¸å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:35 msgid "An edge binding that when invoked, will run the shell command identified by command8" msgstr "呼ã³å‡ºã—時㫠コマンドライン 8 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚¨ãƒƒã‚¸å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:36 msgid "An edge binding that when invoked, will run the shell command identified by command9" msgstr "呼ã³å‡ºã—時㫠コマンドライン 9 ã§æŒ‡å®šã•れãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‚¨ãƒƒã‚¸å‰²ã‚Šå½“ã¦" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "ä»»æ„ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’割り当ã¦" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "ボタン割り当ã¦" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "コマンドライン 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "コマンドライン 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "コマンドライン 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "コマンドライン 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "コマンドライン 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "コマンドライン 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "コマンドライン 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "コマンドライン 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "コマンドライン 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "コマンドライン 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "コマンドライン 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "コマンドライン 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "コマンド 0 を実行 ã®å‘¼ã³å‡ºã—時ã«ã‚·ã‚§ãƒ«ã§å®Ÿè¡Œã•れるコマンドライン" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "コマンド 1 を実行 ã®å‘¼ã³å‡ºã—時ã«ã‚·ã‚§ãƒ«ã§å®Ÿè¡Œã•れるコマンドライン" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "コマンド 10 を実行 ã®å‘¼ã³å‡ºã—時ã«ã‚·ã‚§ãƒ«ã§å®Ÿè¡Œã•れるコマンドライン" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "コマンド 11 を実行 ã®å‘¼ã³å‡ºã—時ã«ã‚·ã‚§ãƒ«ã§å®Ÿè¡Œã•れるコマンドライン" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "コマンド 2 を実行 ã®å‘¼ã³å‡ºã—時ã«ã‚·ã‚§ãƒ«ã§å®Ÿè¡Œã•れるコマンドライン" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "コマンド 3 を実行 ã®å‘¼ã³å‡ºã—時ã«ã‚·ã‚§ãƒ«ã§å®Ÿè¡Œã•れるコマンドライン" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "コマンド 4 を実行 ã®å‘¼ã³å‡ºã—時ã«ã‚·ã‚§ãƒ«ã§å®Ÿè¡Œã•れるコマンドライン" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "コマンド 5 を実行 ã®å‘¼ã³å‡ºã—時ã«ã‚·ã‚§ãƒ«ã§å®Ÿè¡Œã•れるコマンドライン" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "コマンド 6 を実行 ã®å‘¼ã³å‡ºã—時ã«ã‚·ã‚§ãƒ«ã§å®Ÿè¡Œã•れるコマンドライン" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "コマンド 7 を実行 ã®å‘¼ã³å‡ºã—時ã«ã‚·ã‚§ãƒ«ã§å®Ÿè¡Œã•れるコマンドライン" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "コマンド 8 を実行 ã®å‘¼ã³å‡ºã—時ã«ã‚·ã‚§ãƒ«ã§å®Ÿè¡Œã•れるコマンドライン" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "コマンド 9 を実行 ã®å‘¼ã³å‡ºã—時ã«ã‚·ã‚§ãƒ«ã§å®Ÿè¡Œã•れるコマンドライン" #: ../metadata/commands.xml.in.h:63 #: ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "コマンド" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "エッジ割り当ã¦" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "キー割り当ã¦" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "コマンド 1 を実行" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "コマンド 10 を実行" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "コマンド 11 を実行" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "コマンド 12 を実行" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "コマンド 2 を実行" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "コマンド 3 を実行" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "コマンド 4 を実行" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "コマンド 5 を実行" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "コマンド 6 を実行" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "コマンド 7 を実行" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "コマンド 8 を実行" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "コマンド 9 を実行" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "アクティブãªãƒ—ラグイン" #: ../metadata/core.xml.in.in.h:2 msgid "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "オフスクリーン・ピクスマップã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã—ãªã„直接ã®å…¨ç”»é¢ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦æç”»ã‚’許å¯" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "音響ベル" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "音響システムビープ音" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "è‡ªå‹•ã§æœ€å‰é¢ã«ä¸Šã’ã‚‹" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "自動最å‰é¢ç§»å‹•ã®å¾…ã¡æ™‚é–“" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "出力デãƒã‚¤ã‚¹ã®è‡ªå‹•検出" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "リフレッシュレートã®è‡ªå‹•検出" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "最高" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "クリックã§ãƒ•ォーカス" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "ウィンドウã®ã‚¯ãƒªãƒƒã‚¯ã§å…¥åŠ›ãƒ•ã‚©ãƒ¼ã‚«ã‚¹ãŒãã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã«ç§»å‹•" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "アクティブãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "デフォルトã®ã‚¢ã‚¤ã‚³ãƒ³" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "アイコン未指定ウィンドウã«é©ç”¨ã™ã‚‹ãƒ‡ãƒ•ォルトã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚¢ã‚¤ã‚³ãƒ³ç”»åƒ" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "デスクトップサイズ" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "出力検出" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "ãƒªãƒ•ãƒ¬ãƒƒã‚·ãƒ¥ãƒ¬ãƒ¼ãƒˆã®æ¤œå‡º" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "ディスプレイ設定" #: ../metadata/core.xml.in.in.h:20 msgid "Duration the pointer must rest in a screen edge before an edge action is taken." msgstr "エッジ・アクションã®é–‹å§‹ã¾ã§ã«ãƒã‚¤ãƒ³ã‚¿ã‚’スクリーンエッジã«ç½®ãç¶šã‘ã‚‹å¿…è¦ãŒã‚る時間" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "エッジ開始é…延時間" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "速ã•é‡è¦–" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "フォーカスã¨ãã®é–¢é€£å‹•作" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "フォーカス奪å–防止レベル" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "フォーカス奪å–防止ウィンドウ" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "フォーカスを奪ã‚れãªã„よã†ã«ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "å„出力別ã«ç‹¬ç«‹ã—ãŸæç”»ã‚’å¼·åˆ¶" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "一般オプション" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Compiz ã®ä¸€èˆ¬ã‚ªãƒ—ション" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "良" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "タスクãƒãƒ¼çœç•¥ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’éš ã™" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "全ウィンドウを隠ã—ã¦ãƒ‡ã‚¹ã‚¯ãƒˆãƒƒãƒ—ã«ãƒ•ォーカス" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "\"デスクトップã®è¡¨ç¤º\"モード移行時ã«ã‚¿ã‚¹ã‚¯ãƒãƒ¼ã«ãªã„ウィンドウ(ウィジェット等)を隠ã™" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "高" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "水平仮想サイズ" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "利用å¯èƒ½ãªå ´åˆã¯ç”»åƒã‹ã‚‰å¤‰æ›ã•れãŸãƒ†ã‚¯ã‚¹ãƒãƒ£ã«åœ§ç¸®ã‚’使用ã™ã‚‹" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "最大化時ã«ãƒ’ントを無視" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "ウィンドウ最大化時ã«ã€ã‚µã‚¤ã‚ºåŠ ç®—åˆ†ã¨ç¸¦æ¨ªæ¯”ã®ã‚¸ã‚ªãƒ¡ãƒˆãƒªãƒ»ãƒ’ントを無視" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "é¸æŠžã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®æœ€å‰é¢ã¸ã®æŒã¡ä¸Šã’ã‚’é–‹å§‹ã™ã‚‹ã¾ã§ã®æ™‚é–“é–“éš”" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Ping メッセージ間ã®é–“éš”" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "キー割り当ã¦" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "フォーカス奪å–防止ã®ãƒ¬ãƒ™ãƒ«" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "照明" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "ç¾åœ¨ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒ—ラグインã®ãƒªã‚¹ãƒˆ" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "出力デãƒã‚¤ã‚¹ã‚’è¡¨ã™æ–‡å­—列リスト" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "低" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "ウィンドウを下ã’ã‚‹" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "ä»–ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ä¸‹ã«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’下ã’ã‚‹" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "水平方å‘ã«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’最大化" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "垂直方å‘ã«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’最大化" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "アクティブãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’最大化" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "アクティブãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’水平方å‘ã«æœ€å¤§åŒ–" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "アクティブãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’垂直方å‘ã«æœ€å¤§åŒ–" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "アクティブãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’最å°åŒ–" #: ../metadata/core.xml.in.in.h:57 #: ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "通常" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "デスクトップ数" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "仮想デスクトップ数" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "オフ" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "垂直帰線期間ã«ã®ã¿ç”»é¢ã‚’æ›´æ–°ã™ã‚‹" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "出力" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "マルãƒå‡ºåŠ›ã§é‡ãªã‚Šéƒ¨åˆ†ãŒã‚ã‚‹å ´åˆã®å–扱ã„" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "出力デãƒã‚¤ã‚¹åŒå£«ã«é‡ãªã‚Šéƒ¨åˆ†ãŒã‚ã‚‹å ´åˆã§ã‚‚ã€ãれãžã‚Œã‚’åˆ¥å€‹ã«æç”»" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping ã®å¾…ã¡æ™‚é–“" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "大ãã„æ–¹ã®å‡ºåŠ›ã‚’é¸å¥½" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "å°ã•ã„æ–¹ã®å‡ºåŠ›ã‚’é¸å¥½" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "クリックã§ä¸Šã’ã‚‹" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "ウィンドウを上ã’ã‚‹" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "指定時間間隔後ã«é¸æŠžã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’最å‰é¢ã«ä¸Šã’ã‚‹" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "ウィンドウを他ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®å‰é¢ã«ä¸Šã’ã‚‹" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "クリックã§ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’最å‰é¢ã«ä¸Šã’ã‚‹" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "リフレッシュレート" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "水平仮想サイズ指定ã®ãŸã‚ã®ã€ç”»é¢ã‚µã‚¤ã‚ºã«å¯¾ã™ã‚‹ä¹—æ•°" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "垂直仮想サイズ指定ã®ãŸã‚ã®ã€ç”»é¢ã‚µã‚¤ã‚ºã«å¯¾ã™ã‚‹ä¹—æ•°" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "デスクトップã®è¡¨ç¤º" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "アニメーションã®ã‚¹ãƒ­ãƒ¼å†ç”Ÿ" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "スマートモード" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "垂直ブランクã«åŒæœŸåŒ–" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "テクスãƒãƒ£åœ§ç¸®" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "テクスãƒãƒ£ãƒ»ãƒ•ィルタ" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "テクスãƒãƒ£ãƒ»ãƒ•ィルタ" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "ç”»é¢ã®å†æç”»ãƒ¬ãƒ¼ãƒˆ(回/ç§’)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®æœ€å¤§åŒ–/解除ã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®æ°´å¹³æ–¹å‘最大化/解除ã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "ウィンドウã®åž‚ç›´æ–¹å‘æœ€å¤§åŒ–/解除ã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "ウィンドウã®ã‚·ã‚§ãƒ¼ãƒ‰/解除ã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãƒ»ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®æœ€å¤§åŒ–/解除ã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãƒ»ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®æ°´å¹³æ–¹å‘最大化/解除ã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "アクティブ・ウィンドウã®åž‚ç›´æ–¹å‘æœ€å¤§åŒ–/解除ã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "アクティブ・ウィンドウã®ã‚·ã‚§ãƒ¼ãƒ‰/解除ã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "スローå†ç”Ÿã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ä½¿ç”¨ã®ã‚ªãƒ³ã‚ªãƒ•" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãƒ»ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®æœ€å¤§åŒ–解除" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "全画é¢ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’解除" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "ç”»é¢ã®å¤‰æ›æ™‚ã«æ‹¡æ•£å射光を使用" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "垂直仮想サイズ" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "éžå¸¸ã«é«˜" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "マルãƒå‡ºåŠ›ã§é‡ãªã‚Šéƒ¨åˆ†ãŒã‚ã‚‹å ´åˆã«ã©ã¡ã‚‰ã®ãƒ‡ãƒã‚¤ã‚¹ãŒé¸å¥½ã•れるã¹ãã‹" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "ウィンドウメニューã®ãƒœã‚¿ãƒ³å‰²ã‚Šå½“ã¦" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "ウィンドウメニューã®ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #: ../metadata/cube.xml.in.h:1 #: ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "加速度" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "ç”»åƒã®èª¿æ•´" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "上é¢ç”»åƒã‚’回転ã«åˆã‚ã›ã‚‹" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "次ã®ã‚¹ãƒ©ã‚¤ãƒ‰ã«é€²ã‚€" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "スカイドームをアニメーション化" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "キューブã®å›žè»¢æ™‚ã«ã‚¹ã‚«ã‚¤ãƒ‰ãƒ¼ãƒ ã‚’アニメーション化" #: ../metadata/cube.xml.in.h:7 #: ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "外観" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "自動調整" #: ../metadata/cube.xml.in.h:9 #: ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "動作" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "キューブã®ä¸Šéƒ¨ãŠã‚ˆã³ä¸‹éƒ¨ã®é¢ã®ã‚«ãƒ©ãƒ¼" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "スカイドームフォールãƒãƒƒã‚¯ã‚°ãƒ©ãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³ã®ä¸‹éƒ¨ã‚«ãƒ©ãƒ¼ã‚¹ãƒˆãƒƒãƒ—ã«ä½¿ç”¨ã™ã‚‹è‰²" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "スカイドームフォールãƒãƒƒã‚¯ã‚°ãƒ©ãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³ã®ä¸Šéƒ¨ã‚«ãƒ©ãƒ¼ã‚¹ãƒˆãƒƒãƒ—ã«ä½¿ç”¨ã™ã‚‹è‰²" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "キューブã®ãµãŸ" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "キューブã®è‰²" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "デスクトップ・キューブ" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "展開加速度" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "展開速度" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "展開æç”»ã®æ™‚間刻ã¿" #: ../metadata/cube.xml.in.h:19 #: ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "高å“質スケーリングãŒå¯èƒ½ãªå ´åˆãƒŸãƒƒãƒ—マップを生æˆ" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "å‰ã®ã‚¹ãƒ©ã‚¤ãƒ‰ã«æˆ»ã‚‹" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "ç”»åƒãƒ•ァイル" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "スカイドームã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ç”»åƒ" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "マウスã«ã‚ˆã‚‹å›žè»¢æ™‚ã®ã¿ã‚­ãƒ¥ãƒ¼ãƒ–ã®é€æ˜ŽåŒ–ã‚’é–‹å§‹" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "キューブ内部" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "キューブ内部" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "キューブã®ä¸Šé¢ã«æç”»ã™ã‚‹PNGãŠã‚ˆã³SVGファイルã®ãƒªã‚¹ãƒˆ" #: ../metadata/cube.xml.in.h:28 #: ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "マルãƒå‡ºåŠ›ã®å½¢å¼" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "複数ã®ã‚­ãƒ¥ãƒ¼ãƒ–" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "次ã®ã‚¹ãƒ©ã‚¤ãƒ‰" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "1ã¤ã®å¤§ããªã‚­ãƒ¥ãƒ¼ãƒ–" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "回転時ã®ä¸é€æ˜Žåº¦" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "éžå›žè»¢æ™‚ã®ä¸é€æ˜Žåº¦" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "回転時ã®ãƒ‡ã‚¹ã‚¯ãƒˆãƒƒãƒ—・ウィンドウã®ä¸é€æ˜Žåº¦" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "éžå›žè»¢æ™‚ã®ãƒ‡ã‚¹ã‚¯ãƒˆãƒƒãƒ—・ウィンドウã®ä¸é€æ˜Žåº¦" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "ウィンドウをキューブã«é…ç½®" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "å‰ã®ã‚¹ãƒ©ã‚¤ãƒ‰" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "ã‚¹ã‚«ã‚¤ãƒ‰ãƒ¼ãƒ ã®æç”»" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "ç”»åƒã‚’拡大" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "キューブã®ä¸Šé¢ã‚’覆ã†ã‚ˆã†ã«ç”»åƒã‚’拡大" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "複数ã®å‡ºåŠ›ãƒ‡ãƒã‚¤ã‚¹ä½¿ç”¨ã®å ´åˆã«ãŠã‘るキューブ表示方法ã®é¸æŠž" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "スカイドーム" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "スカイドームグラデーション終了色" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "スカイドームグラデーション開始色" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "スカイドーム画åƒ" #: ../metadata/cube.xml.in.h:46 #: ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 #: ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "速度" #: ../metadata/cube.xml.in.h:47 #: ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 #: ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "æç”»ã®æ™‚間刻ã¿" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "マウスã«ã‚ˆã‚‹å›žè»¢æ™‚ã®ã¿é€æ˜ŽåŒ–を使用" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "キューブã®é€æ˜ŽåŒ–" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "展開" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "キューブを展開" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus 制御ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "装飾テキスãƒãƒ£ç”¨ãƒŸãƒƒãƒ—マップã®ç”Ÿæˆã‚’許å¯" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "コマンド" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "装飾é©ç”¨ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/decoration.xml.in.h:4 msgid "Decorator command line that is executed if no decorator is already running" msgstr "デコレータ未動作ã®å ´åˆã«å®Ÿè¡Œã•れるデコレータ起動コマンドライン" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "å½±ã®ã‚ªãƒ•セット X 座標" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "å½±ã®ã‚ªãƒ•セット Y 座標" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "å½±ã®è‰²" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "å½±ã®ä¸é€æ˜Žåº¦" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "å½±ã®åŠå¾„" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "å½±ã®è‰²" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "影オフセット X 座標" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "影オフセット Y 座標" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "å½±ã®ä¸é€æ˜Žåº¦" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "å½±ã®åŠå¾„" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "影を付ã‘るウィンドウ" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "ウィンドウã®è£…飾" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "ウィンドウを装飾" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "装飾ã®é©ç”¨å¯¾è±¡ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "影を付ã‘る対象ウィンドウ" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "ä¸å¿œç­”ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®æ˜Žåº¦ï¼ˆãƒ‘ーセント)" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "一定速度" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "一定時間" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "ä¸å¿œç­”ウィンドウを薄暗ãã™ã‚‹" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "ウィンドウ・マãƒãƒ¼ã‚¸ãƒ£ã®è¦æ±‚ã«å¿œç­”ã—ãªã„ウィンドウを薄暗ãã™ã‚‹" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "フェード・モード" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "最å°åŒ–/é–‹ã/é–‰ã˜ã‚‹ 時ã«ãƒ•ェード" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "フェード速度" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "フェード時間" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "最å°åŒ–/é–‹ã/é–‰ã˜ã‚‹ イベント時ã®ãƒ•ェード効果" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "システムビープ音時ã®ãƒ•ェード効果" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "ウィンドウãŒé–‹ã‹ã‚ŒãŸæ™‚フェードインã€é–‰ã˜ãŸæ™‚フェードアウト" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "フェード・ウィンドウ" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "ウィンドウã®ãƒ•ェード" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "全画é¢åŠ¹æžœã«ã‚ˆã‚‹è¦–覚ベル" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "システムビープ音イベント時ã®å…¨ç”»é¢ãƒ•ェード効果" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "ä¸å¿œç­”ウィンドウã®å½©åº¦ï¼ˆãƒ‘ーセント)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "ä¸å¿œç­”ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®æ˜Žåº¦" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "ä¸å¿œç­”ウィンドウã®å½©åº¦" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "視覚ベル" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "ウィンドウã®ãƒ•ェード形å¼" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "「一定速度ã€ãƒ¢ãƒ¼ãƒ‰ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ãƒ•ェード速度" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "「一定時間ã€ãƒ¢ãƒ¼ãƒ‰ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ãƒ•ェード時間(ミリ秒)" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "フェードã•ã›ã‚‹å¯¾è±¡ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "マウントãƒã‚¤ãƒ³ãƒˆ" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "マウントãƒã‚¤ãƒ³ãƒˆ" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "ユーザ空間ファイルシステム" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "ユーザ空間ファイルシステム" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf 制御ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib main loop サãƒãƒ¼ãƒˆ" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome äº’æ›æ€§" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "端末を開ã" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Compiz ã« Gnome デスクトップ環境ã¨ã®äº’æ›æ€§ã‚’ä¿ãŸã›ã‚‹ã‚ªãƒ—ション" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "アプリケーション実行ダイアログ" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "端末起動コマンド" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "スクリーンショットã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "メインメニューã®è¡¨ç¤º" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "\"アプリケーションã®å®Ÿè¡Œ\"ダイアログã®è¡¨ç¤º" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "メインメニューã®è¡¨ç¤º" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "スクリーンショットを撮る" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "ウィンドウã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’撮る" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "端末起動コマンドライン" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "ウィンドウ・スクリーンショットã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Flat File ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã®é–‹å§‹" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ファイル変更通知プラグイン" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig 制御ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "最å°åŒ–時ã®åŠ¹æžœ" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "最å°åŒ–時効果ウィンドウ" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "最å°åŒ–速度" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "最å°åŒ–ã®æç”»æ™‚é–“åˆ»ã¿" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "シェード抵抗" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "シェード抵抗" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "最å°åŒ–ãŠã‚ˆã³æœ€å°åŒ–解除時ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®æ‹¡ç¸®" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "最å°åŒ–ã®éš›ã«ç¸®å°ºã•ã›ã‚‹å¯¾è±¡ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "ï¼¹ 座標制約" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Y 座標をワークスペースエリアã«åˆ¶ç´„" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "ウィンドウã®ç§»å‹•完了ã¾ã§Xサーãƒå´ã§ã®é…ç½®ä½ç½®ã‚’æ›´æ–°ã—ãªã„" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "ウィンドウã®ç§»å‹•é–‹å§‹" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "ç·©æ…¢ãªä½ç½®å–り" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "ウィンドウã®ç§»å‹•" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "ウィンドウã®ç§»å‹•" #: ../metadata/move.xml.in.h:8 #: ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 #: ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "ä¸é€æ˜Žåº¦" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "移動ウィンドウã®ä¸é€æ˜Žåº¦" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "最大化ウィンドウã®ãƒ‰ãƒ©ãƒƒã‚°æ™‚ã€ã‚¹ãƒŠãƒƒãƒ—を解除ã—ã¦æœ€å¤§åŒ–を自動解除" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "最大化ã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ã‚¹ãƒŠãƒƒãƒ—解除" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "ウィンドウã®ç§»å‹•ã‚’é–‹å§‹" #: ../metadata/obs.xml.in.h:1 #: ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "明度" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "明度を下ã’ã‚‹" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "明度を上ã’ã‚‹" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "明度ã®å¤‰åŒ–刻ã¿" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "ウィンドウã«é©ç”¨ã™ã‚‹æ˜Žåº¦" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "下ã’ã‚‹" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "上ã’ã‚‹" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "ä¸é€æ˜Žåº¦ã‚’下ã’ã‚‹" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "ä¸é€æ˜Žåº¦ã‚’上ã’ã‚‹" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "ä¸é€æ˜Žåº¦ã®å¤‰åŒ–刻ã¿" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "ウィンドウã®ä¸é€æ˜Žåº¦" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "ä¸é€æ˜Žåº¦ãƒ»æ˜Žåº¦ãƒ»å½©åº¦" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "ä¸é€æ˜Žåº¦ã‚„明度ã€å½©åº¦ã®èª¿ç¯€" #: ../metadata/obs.xml.in.h:15 #: ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "彩度" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "彩度を下ã’ã‚‹" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "彩度を上ã’ã‚‹" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "彩度ã®å¤‰åŒ–刻ã¿" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "ウィンドウã«é©ç”¨ã™ã‚‹å½©åº¦" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "変化刻ã¿" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "ウィンドウ特定設定" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "ウィンドウã®å€¤" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "ウィンドウ" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "デフォルトã§ä»–ã¨ç•°ãªã‚‹æ˜Žåº¦ã‚’æŒãŸã›ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "デフォルトã§ä»–ã¨ç•°ãªã‚‹ä¸é€æ˜Žåº¦ã‚’æŒãŸã›ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "デフォルトã§ä»–ã¨ç•°ãªã‚‹å½©åº¦ã‚’æŒãŸã›ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "ウィンドウé…ç½®ã«ä½¿ç”¨ã™ã‚‹ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ " #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "カスケード" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "中央" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "固定ウィンドウé…ç½®ä½ç½®" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "強制é…置ウィンドウ" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "水平ビューãƒãƒ¼ãƒˆä½ç½®" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "ワークエリアã«é™å®š" #: ../metadata/place.xml.in.h:8 msgid "Keep placed window in work area, even if that means that the position might differ from the specified position" msgstr "çµæžœã¨ã—ã¦æŒ‡å®šä½ç½®ã¨ã¯ç•°ãªã£ã¦ã—ã¾ã†å ´åˆã§ã‚‚ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®é…ç½®ä½ç½®ã‚’ワークエリア内ã«é™å®šã€‚" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "ウィンドウã®é…ç½®" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "ã™ã¹ã¦ã®å‡ºåŠ›ãƒ‡ãƒã‚¤ã‚¹ã«ã‚ãŸã£ã¦é…ç½®" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "ウィンドウãŒé–‹ã‹ã‚ŒãŸéš›ã®é©åˆ‡ãªä½ç½®ã¸ã®é…ç½®" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "é…置形å¼" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "固定ä½ç½®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "ランダム" #: ../metadata/place.xml.in.h:17 msgid "Selects how window placement should behave if multiple outputs are selected" msgstr "マルãƒå‡ºåŠ›ãŒé¸æŠžã•れã¦ã„ã‚‹å ´åˆã®ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é…ç½®ã®æŒ¯ã‚‹èˆžã„ã®é¸æŠž" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "スマート" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "アクティブ状態ã®å‡ºåŠ›ãƒ‡ãƒã‚¤ã‚¹ã‚’使用" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "フォーカス・ウィンドウã®å‡ºåŠ›ãƒ‡ãƒã‚¤ã‚¹ã‚’使用" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "ãƒã‚¤ãƒ³ã‚¿ãŒç½®ã‹ã‚Œã¦ã„る出力デãƒã‚¤ã‚¹ã‚’使用" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "垂直ビューãƒãƒ¼ãƒˆä½ç½®" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "固定ビューãƒãƒ¼ãƒˆãƒ»ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "モーダルダイアログå‘ã‘ã®é…ç½®å•題回é¿ç­–" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "デフォルトã§ç‰¹å®šä½ç½®ã«é…ç½®ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "デフォルトã§ç‰¹å®šãƒ“ューãƒãƒ¼ãƒˆã«é…ç½®ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/place.xml.in.h:27 msgid "Windows that should forcedly be placed, even if they indicate the window manager should avoid placing them." msgstr "強制的ã«é…ç½®ã•ã›ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã€‚ウィンドウ・マãƒãƒ¼ã‚¸ãƒ£ã«é…ç½®ã®å¯¾è±¡å¤–ã¨ã™ã‚‹ã‚ˆã†ã«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãŒæŒ‡ç¤ºã—ã¦ã„ã‚‹å ´åˆã§ã‚‚é…ç½®ã—ã¾ã™ã€‚" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "固定ä½ç½®ã«é…ç½®ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "固定ビューãƒãƒ¼ãƒˆã«é…ç½®ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "回é¿ç­–" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X ä½ç½®" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X ビューãƒãƒ¼ãƒˆä½ç½®" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X ä½ç½®ã®å€¤" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y ä½ç½®" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y ビューãƒãƒ¼ãƒˆä½ç½®" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y ä½ç½®ã®å€¤" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png ç”»åƒèª­ã¿è¾¼ã¿" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "æ­£è¦è¡¨ç¾ãƒžãƒƒãƒãƒ³ã‚°" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "æ­£è¦è¡¨ç¾ã«ã‚ˆã‚‹å¯¾è±¡ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ãƒžãƒƒãƒãƒ³ã‚°" #: ../metadata/resize.xml.in.h:1 #: ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 #: ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "割り当ã¦" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "境界線ã®è‰²" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "輪郭や矩形ã®ã‚µã‚¤ã‚ºå¤‰æ›´æç”»å½¢å¼ã§ä½¿ç”¨ã™ã‚‹å¢ƒç•Œç·šã®è‰²" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "デフォルトã®ã‚µã‚¤ã‚ºå¤‰æ›´å½¢å¼" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "ウィンドウã®ã‚µã‚¤ã‚ºå¤‰æ›´ã«ä½¿ç”¨ã™ã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æç”»å½¢å¼" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "塗り色" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "矩形ã®ã‚µã‚¤ã‚ºå¤‰æ›´æç”»å½¢å¼ã«ä½¿ç”¨ã™ã‚‹å¡—り色" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "通常形å¼ã®ã‚µã‚¤ã‚ºå¤‰æ›´é–‹å§‹" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "輪郭形å¼ã®ã‚µã‚¤ã‚ºå¤‰æ›´é–‹å§‹" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "矩形形å¼ã®ã‚µã‚¤ã‚ºå¤‰æ›´é–‹å§‹" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "伸縮形å¼ã®ã‚µã‚¤ã‚ºå¤‰æ›´ã‚’é–‹å§‹" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "ウィンドウã®ã‚µã‚¤ã‚ºå¤‰æ›´é–‹å§‹" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "通常サイズ変更ウィンドウ" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "輪郭" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "輪郭サイズ変更ウィンドウ" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "矩形" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "矩形サイズ変更ウィンドウ" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "ウィンドウã®ã‚µã‚¤ã‚ºå¤‰æ›´" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "ウィンドウã®ã‚µã‚¤ã‚ºå¤‰æ›´" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "ウィンドウã®ã‚µã‚¤ã‚ºå¤‰æ›´ã‚’é–‹å§‹" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "伸縮形å¼ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ã‚µã‚¤ã‚ºå¤‰æ›´ã‚’é–‹å§‹" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "通常形å¼ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ã‚µã‚¤ã‚ºå¤‰æ›´ã‚’é–‹å§‹" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "輪郭形å¼ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ã‚µã‚¤ã‚ºå¤‰æ›´ã‚’é–‹å§‹" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "矩形形å¼ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ã‚µã‚¤ã‚ºå¤‰æ›´ã‚’é–‹å§‹" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "伸縮" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "伸縮サイズ変更ウィンドウ" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "サイズ変更æç”»ã«é€šå¸¸å½¢å¼ã‚’使用ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "サイズ変更æç”»ã«è¼ªéƒ­å½¢å¼ã‚’使用ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "サイズ変更æç”»ã«çŸ©å½¢å½¢å¼ã‚’使用ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "サイズ変更æç”»ã«ä¼¸ç¸®å½¢å¼ã‚’使用ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "エッジã¸ã®ãƒ‰ãƒ©ãƒƒã‚°ï¼†ãƒ‰ãƒ­ãƒƒãƒ—ã§ãƒ•リップ" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "エッジã¸ã®ç§»å‹•ã§ãƒ•リップ" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "エッジã¸ã®ãƒã‚¤ãƒ³ã‚¿ç§»å‹•ã§ãƒ•リップ" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "フリップ開始時間" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "左ビューãƒãƒ¼ãƒˆã«ãƒ•リップã—ã¦ã€ãƒã‚¤ãƒ³ã‚¿ã‚’ワープ" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "オブジェクトを画é¢ç«¯ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ãŸéš›ã«ã€æ¬¡ã®ãƒ“ューãƒãƒ¼ãƒˆã«ãƒ•リップ" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "ãƒã‚¤ãƒ³ã‚¿ã‚’ç”»é¢ç«¯ã«ç§»å‹•ã—ãŸéš›ã«ã€æ¬¡ã®ãƒ“ューãƒãƒ¼ãƒˆã«ãƒ•リップ" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "ウィンドウを画é¢ç«¯ã«ç§»å‹•ã—ãŸéš›ã«ã€æ¬¡ã®ãƒ“ューãƒãƒ¼ãƒˆã«ãƒ•リップ" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "å³ãƒ“ューãƒãƒ¼ãƒˆã«ãƒ•リップã—ã¦ã€ãƒã‚¤ãƒ³ã‚¿ã‚’ワープ" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "ãƒã‚¤ãƒ³ã‚¿ç§»å‹•ã® Y 軸をå転" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "ãƒã‚¤ãƒ³ã‚¿æ“作㮠Y å転" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "ãƒã‚¤ãƒ³ã‚¿æ„Ÿåº¦" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "回転時ã«å‰é¢ã«ä¸Šã’ã‚‹" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "回転時ã«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’上ã’ã‚‹" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "キューブã®å›žè»¢" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "å·¦ã«ãƒ•リップ回転" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "å³ã«ãƒ•リップ回転" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "å·¦ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "å·¦ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "å³ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "å³ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" # ※ ãƒã‚¤ãƒ³ãƒ‰ãã®ã‚‚ã®ã§ã¯ãªãå˜ãªã‚‹ãã®è¦‹å‡ºã—。CCSMã¯ã‚¢ãƒ«ãƒ•ァベットã§ã‚½ãƒ¼ãƒˆã—ã¦è¡¨ç¤ºã™ã‚‹ã®ã§æ—¥æœ¬èªžã ã¨å¤‰ãªä½ç½®ã«è¡¨ç¤ºã•れ紛らã‚ã—ã„。 #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "指定先ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "é¢ 1 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "é¢ 1 ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "é¢ 10 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "é¢ 10 ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "é¢ 11 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "é¢ 11 ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "é¢ 12 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "é¢ 12 ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "é¢ 2 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "é¢ 2 ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "é¢ 3 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "é¢ 3 ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "é¢ 4 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "é¢ 4 ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "é¢ 5 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "é¢ 5 ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "é¢ 6 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "é¢ 6 ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "é¢ 7 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "é¢ 7 ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "é¢ 8 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "é¢ 8 ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "é¢ 9 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "é¢ 9 ã«å›žè»¢ï¼ˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "キューブã®å›žè»¢" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "デスクトップ・キューブã®å›žè»¢" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "å·¦ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "å·¦ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "å³ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "å³ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "特定キューブé¢ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "ウィンドウã¨ä¸€ç·’ã«ç‰¹å®šã‚­ãƒ¥ãƒ¼ãƒ–é¢ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "é¢ 1 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "é¢ 1 ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "é¢ 10 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "é¢ 10 ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "é¢ 11 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "é¢ 11 ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "é¢ 12 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "é¢ 12 ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "é¢ 2 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "é¢ 2 ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "é¢ 3 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "é¢ 3 ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "é¢ 4 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "é¢ 4 ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "é¢ 5 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "é¢ 5 ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "é¢ 6 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "é¢ 6 ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "é¢ 7 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "é¢ 7 ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "é¢ 8 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "é¢ 8 ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "é¢ 9 ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "é¢ 9 ã«å›žè»¢ï¼ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«ï¼‰" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "ビューãƒãƒ¼ãƒˆã«å›žè»¢" # ※ â€Rotate to†ã®ç¿»è¨³è€…コメントå‚ç…§ã®ã“㨠#: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "指定先ã«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¨ä¸€ç·’ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "ウィンドウã¨ä¸€ç·’ã«å›žè»¢" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "回転ã®åŠ é€Ÿåº¦" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "回転速度" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "å›žè»¢ã®æ™‚間刻ã¿" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "回転時ã®ã‚ºãƒ¼ãƒ è·é›¢" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "ãƒã‚¤ãƒ³ã‚¿ã®ç§»å‹•感度" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "キューブ回転をキューブ下é¢ã«ã‚¹ãƒŠãƒƒãƒ—" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "キューブ回転をキューブ上é¢ã«ã‚¹ãƒŠãƒƒãƒ—" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "キューブ下é¢ã«ã‚¹ãƒŠãƒƒãƒ—" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "キューブ上é¢ã«ã‚¹ãƒŠãƒƒãƒ—" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "回転ã®é–‹å§‹" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "ビューãƒãƒ¼ãƒˆã®ãƒ•リップ移動を開始ã™ã‚‹å‰ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ" #: ../metadata/rotate.xml.in.h:98 #: ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "ズーム" #: ../metadata/scale.xml.in.h:1 #: ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "ä¸é€æ˜Žåº¦(%)" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "大ãã„" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "ボタンã«ã‚ˆã‚‹ã‚¹ã‚±ãƒ¼ãƒ«ãƒ»ãƒ¢ãƒ¼ãƒ‰ã®ã‚ªãƒ³ã‚ªãƒ•" #: ../metadata/scale.xml.in.h:7 msgid "Button bindings toggle scale mode instead of enabling it when pressed and disabling it when released." msgstr "ボタンを離ã™ã¨ã‚¹ã‚±ãƒ¼ãƒ«ãƒ»ãƒ¢ãƒ¼ãƒ‰ãŒç„¡åйã«ãªã‚‹åŸºæœ¬å‹•作をã€ãƒœã‚¿ãƒ³ã‚’押ã™ãŸã³ã«ã‚ªãƒ³ã‚ªãƒ•ãŒåˆ‡ã‚Šæ›¿ã‚る動作ã«ä»£ãˆã‚‹" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "デスクトップã®ã‚¯ãƒªãƒƒã‚¯ã§ãƒ‡ã‚¹ã‚¯ãƒˆãƒƒãƒ—ã®è¡¨ç¤º" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "背景を暗ãã™ã‚‹" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "ウィンドウã®ã‚¹ã‚±ãƒ¼ãƒ«æ™‚ã«èƒŒæ™¯ã‚’æš—ãã™ã‚‹" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "エンブレム" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "スケール中ã«ãƒ‡ã‚¹ã‚¯ãƒˆãƒƒãƒ—ãŒã‚¯ãƒªãƒƒã‚¯ã•れãŸã¨ã\"デスクトップã®è¡¨ç¤º\"モードã«å…¥ã‚‹" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ホãƒãƒ¼æ™‚é–“" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "ウィンドウピッカー起動" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "ã™ã¹ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦å¯¾è±¡ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒ”ッカー起動" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "ウィンドウグループ対象ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒ”ッカー起動" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "ç¾åœ¨ã®å‡ºåŠ›ä¸Šã‚¦ã‚£ãƒ³ãƒ‰ã‚¦å¯¾è±¡ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒ”ッカー起動" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "キーã«ã‚ˆã‚‹ã‚¹ã‚±ãƒ¼ãƒ«ãƒ»ãƒ¢ãƒ¼ãƒ‰ã®ã‚ªãƒ³ã‚ªãƒ•" #: ../metadata/scale.xml.in.h:19 msgid "Key bindings toggle scale mode instead of enabling it when pressed and disabling it when released." msgstr "キーを離ã™ã¨ã‚¹ã‚±ãƒ¼ãƒ«ãƒ»ãƒ¢ãƒ¼ãƒ‰ãŒç„¡åйã«ãªã‚‹åŸºæœ¬å‹•作をã€ã‚­ãƒ¼ã‚’押ã™ãŸã³ã«ã‚ªãƒ³ã‚ªãƒ•ãŒåˆ‡ã‚Šæ›¿ã‚る動作ã«ä»£ãˆã‚‹ã€‚" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "ã™ã¹ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é…列ã—ã¦å¤‰æ›ã‚’é–‹å§‹" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "ウィンドウグループをé…列ã—ã¦å¤‰æ›ã‚’é–‹å§‹" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "ウィンドウをé…列ã—ã¦å¤‰æ›ã‚’é–‹å§‹" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "ç¾åœ¨ã®å‡ºåŠ›ãƒ‡ãƒã‚¤ã‚¹ä¸Šã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é…列ã—ã¦å¤‰æ›ã‚’é–‹å§‹" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "ã™ã¹ã¦ã®å‡ºåŠ›ãƒ‡ãƒã‚¤ã‚¹ä¸Šã«" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "ç¾åœ¨ã®å‡ºåŠ›ãƒ‡ãƒã‚¤ã‚¹ä¸Šã«" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "é‡ã­è¡¨ç¤ºã‚¢ã‚¤ã‚³ãƒ³" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "ウィンドウ調整後ã«ã‚¢ã‚¤ã‚³ãƒ³ã‚’é‡ã­è¡¨ç¤º" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "スケール" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "スケール・ウィンドウ" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "スケール速度" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "スケールä½ç½®ç®—å‡ºã®æ™‚間刻ã¿" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "ウィンドウã®ã‚¹ã‚±ãƒ¼ãƒ«" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "複数ã®å‡ºåŠ›ãƒ‡ãƒã‚¤ã‚¹ã‚’使用ã—ã¦ã„ã‚‹å ´åˆã«ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’ã©ã“ã«ã‚¹ã‚±ãƒ¼ãƒ«ã™ã‚‹ã‹ã®é¸æŠž" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "ウィンドウ間ã®é–“éš”ã®å¤§ãã•" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "é–“éš”" #: ../metadata/scale.xml.in.h:40 msgid "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "ウィンドウ上ã§ã®ãƒ›ãƒãƒ¼æ™‚ã«ã€ã‚¹ã‚±ãƒ¼ãƒ«ãƒ¢ãƒ¼ãƒ‰ã‚’終了ã™ã‚‹ã¾ã§ã®æ™‚é–“(ミリ秒)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "スケールモードã§ã‚¹ã‚±ãƒ¼ãƒ«ã•れる対象ウィンドウ" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "スクリーンショット画åƒã‚’ã“ã®ã‚¢ãƒ—リケーションã§è‡ªå‹•çš„ã«é–‹ã" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "ディレクトリ" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "çŸ©å½¢é¸æŠžã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’é–‹å§‹" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "起動アプリケーション" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "スクリーンショット画åƒã‚’ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ç½®ã" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "スクリーンショット" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "スクリーンショット・プラグイン" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg ç”»åƒèª­ã¿è¾¼ã¿" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "明るã•ã®é‡(%)" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "鮮やã‹ã•ã®é‡(%)" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "アプリケーション・スイッãƒãƒ£ãƒ¼" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "自動回転" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "手å‰ã«æç¤º" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "é¸æŠžã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’æ‰‹å‰ã«æç¤º" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "ウィンドウã®ã‚¹ã‚¤ãƒƒãƒä¸­ã«ãƒ‡ã‚¹ã‚¯ãƒˆãƒƒãƒ—ãŒã‚ºãƒ¼ãƒ ã‚¢ã‚¦ãƒˆã•れるè·é›¢" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "アイコン" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "最å°åŒ–" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "次ã®ãƒ‘ãƒãƒ«" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "次ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "次ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ï¼ˆå…¨ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‹ã‚‰ï¼‰" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "次ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ï¼ˆãƒãƒƒãƒ—アップãªã—)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "スイッãƒãƒ£ãƒ¼ãŒéžè¡¨ç¤ºã®å ´åˆãƒãƒƒãƒ—アップã—ã¦ã€æ¬¡ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é¸æŠž" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "スイッãƒãƒ£ãƒ¼ãŒéžè¡¨ç¤ºã®å ´åˆãƒãƒƒãƒ—アップã—ã¦ã€ã™ã¹ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‹ã‚‰æ¬¡ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é¸æŠž" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "スイッãƒãƒ£ãƒ¼ãŒéžè¡¨ç¤ºã®å ´åˆãƒãƒƒãƒ—アップã—ã¦ã€å‰ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é¸æŠž" #: ../metadata/switcher.xml.in.h:23 msgid "Popup switcher if not visible and select previous window out of all windows" msgstr "スイッãƒãƒ£ãƒ¼ãŒéžè¡¨ç¤ºã®å ´åˆãƒãƒƒãƒ—アップã—ã¦ã€ã™ã¹ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‹ã‚‰å‰ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é¸æŠž" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "å‰ã®ãƒ‘ãƒãƒ«" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "å‰ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "å‰ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ï¼ˆå…¨ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‹ã‚‰ï¼‰" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "å‰ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ï¼ˆãƒãƒƒãƒ—アップãªã—)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "スイッãƒä¸­ã«é¸æŠžã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¸å›žè»¢" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "次ã®ãƒ‘ãƒãƒ«ã‚¿ã‚¤ãƒ—ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é¸æŠž" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "ãƒãƒƒãƒ—アップウィンドウ表示ãªã—ã§æ¬¡ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é¸æŠž" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "å‰ã®ãƒ‘ãƒãƒ«ã‚¿ã‚¤ãƒ—ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é¸æŠž" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "ãƒãƒƒãƒ—アップウィンドウ表示ãªã—ã§å‰ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é¸æŠž" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "サムãƒã‚¤ãƒ«ã®éš£ã«ã‚¢ã‚¤ã‚³ãƒ³ã‚’表示" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "最å°åŒ–ã•れã¦ã„るウィンドウも表示" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "スイッãƒãƒ£ãƒ¼é€Ÿåº¦" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "スイッãƒãƒ£ãƒ¼æç”»ã®æ™‚間刻ã¿" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "スイッãƒãƒ£ãƒ¼ãƒ»ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "スイッãƒãƒ£ãƒ¼ã«è¡¨ç¤ºã™ã‚‹å¯¾è±¡ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 色空間ã®ã‚µãƒãƒ¼ãƒˆã‚’æä¾›" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "å‹•ç”»å†ç”Ÿ" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "å‹•ç”»å†ç”Ÿ" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 色空間" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "線を追加" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "点を追加" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "ç•°ãªã‚‹ãƒ‡ã‚¹ã‚¯ãƒˆãƒƒãƒ—ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã«æ°´åŠ¹æžœã‚’è¿½åŠ " #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "儿°´æ»´é–“ã®é…延時間(ミリ秒)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "ãƒã‚¤ãƒ³ã‚¿ã®æ°´åŠ¹æžœã‚’æœ‰åŠ¹ã«ã™ã‚‹" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "ç·š" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "オフセットスケール" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "点" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "雨ã®å¾…ã¡æ™‚é–“" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "ã‚¿ã‚¤ãƒˆãƒ«ã®æ³¢" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "雨ã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "雨効果ã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "ワイパーã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "ワイパー効果ã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "水効果" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "水オフセットスケール" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "ウィンドウタイトルã‹ã‚‰ã‚¦ã‚§ãƒ¼ãƒ–効果" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "フォーカス時ã®åŠ¹æžœ" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "ウィンドウãŒãƒ•ォーカスã•ã‚ŒãŸæ™‚ã®åŠ¹æžœ" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "フォーカス時効果ウィンドウ" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "摩擦" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "ã¤ã‹ã¿æ™‚効果ウィンドウ" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "グリッド解åƒåº¦" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "ウィンドウ・スナップã®å転" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "ウィンドウを震動ã•ã›ã‚‹" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "é–‹ã„ãŸæ™‚ã®åŠ¹æžœ" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "ウィンドウãŒé–‹ã‹ã‚ŒãŸæ™‚ã®åŠ¹æžœ" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "é–‹ãæ™‚効果ウィンドウ" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "最大化時ã®åŠ¹æžœ" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "最å°ã‚°ãƒªãƒƒãƒ‰ã‚µã‚¤ã‚º" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "最å°é ‚点グリッドサイズ" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "移動時効果ウィンドウ" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "震動" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "スナップã®å転" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "ウィンドウをスナップ" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "ãƒãƒæ‘©æ“¦" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "ãƒãƒå®šæ•°" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "ãƒãƒå®šæ•°" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "ウィンドウ・スナップã®åˆ‡ã‚Šæ›¿ãˆ" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "æºã‚Œã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦åŠ¹æžœç”¨ã«ãƒãƒãƒ¢ãƒ‡ãƒ«ã‚’使用" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "頂点グリッド解åƒåº¦" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "ãƒ•ã‚©ãƒ¼ã‚«ã‚¹æ™‚ã«æºã‚†ã‚‰ã™å¯¾è±¡ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "ã¤ã‹ã¾ã‚ŒãŸæ™‚ã«æºã‚‰ã™å¯¾è±¡ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "é–‹ã„ãŸæ™‚ã«æºã‚‰ã™å¯¾è±¡ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "ç§»å‹•æ™‚ã«æºã‚‰ã™å¯¾è±¡ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®æœ€å¤§åŒ–ãŠã‚ˆã³æœ€å¤§åŒ–è§£é™¤æ™‚ã«æºã‚Œã‚‹åŠ¹æžœ" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "æºã‚Œã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" #~ msgid "Command line 0" #~ msgstr "コマンドライン 0" #~ msgid "Run command 0" #~ msgstr "コマンド 0 を実行" #~ msgid "Screenshot commands" #~ msgstr "スクリーンショットã®ã‚³ãƒžãƒ³ãƒ‰" #~ msgid "Screenshot key bindings" #~ msgstr "スクリーンショットã®ã‚­ãƒ¼å‰²ã‚Šå½“ã¦" #~ msgid "Filter Linear" #~ msgstr "線形フィルタ" #~ msgid "Use linear filter when zoomed in" #~ msgstr "ズームイン時ã«ç·šå½¢ãƒ•ィルタを使用" #~ msgid "Zoom Desktop" #~ msgstr "デスクトップã®ã‚ºãƒ¼ãƒ " #~ msgid "Zoom In" #~ msgstr "ズームイン" #~ msgid "Zoom Out" #~ msgstr "ズームアウト" #~ msgid "Zoom Pan" #~ msgstr "ズーム域ã®ç§»å‹•" #~ msgid "Zoom Speed" #~ msgstr "ズーム速度" #~ msgid "Zoom Timestep" #~ msgstr "ズームæç”»æ™‚間刻ã¿" #~ msgid "Zoom and pan desktop cube" #~ msgstr "デスクトップ・キューブã®ã‚ºãƒ¼ãƒ ã¨ã‚ºãƒ¼ãƒ åŸŸç§»å‹•" #~ msgid "Zoom factor" #~ msgstr "ズーム係数" #~ msgid "Zoom pan" #~ msgstr "ズーム域ã®ç§»å‹•" #~ msgid "Decrease window opacity" #~ msgstr "ウィンドウã®ä¸é€æ˜Žåº¦ã‚’下ã’ã‚‹" #~ msgid "Increase window opacity" #~ msgstr "ウィンドウã®ä¸é€æ˜Žåº¦ã‚’上ã’ã‚‹" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "デフォルトã§åŠé€æ˜ŽåŒ–ã®å¯¾è±¡ã«ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ä¸é€æ˜Žåº¦" #~ msgid "Opacity windows" #~ msgstr "åŠé€æ˜Žå¯¾è±¡ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" compiz-0.9.11+14.04.20140409/po/nl.po0000644000015301777760000026150412321343002017071 0ustar pbusernogroup00000000000000# translation of compiz.po to Dutch # Dutch message file for YaST 2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # # A.S. Kerkmeester , 1999, 2000, 2001. # FAX-Translations , 2000. # Karl Eichwalder , 1999, 2000. # Martin Lohner , 2000. # peter@sybex.nl, 2000. # Elve , 2008. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2008-04-18 17:08+0200\n" "Last-Translator: Harald van Bree \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Bureaublad" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Venster Beheer" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Geen" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Schaal" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximaliseer" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximaliseer venster horizontaal" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximaliseer venster verticaal" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Geminimaliseerd" # /usr/lib/YaST2/clients/dialup_dev_cfg.ycp:80 #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automatisch naar de voorgrond" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Venster menu" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Actie die ondernomen moet worden als de muis-wiel over venster titelbalk " "bladert" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Vervaging type" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Metacity thema actief venster opaciteit" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity thema actief venster opaciteit schaduw" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity thema opaciteit" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity thema opaciteit schaduw" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Opaciteit te gebruiken voor actieve vensters met metacity thema decoratie" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opaciteit te gebruiken voor metacity thema decoratie" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Actieve vensters oprollen met metacity thema decoratie's van ondoorzichtig " "tot doorzichtig" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Actieve vensters oprollen met metacity thema decoratie's van ondoorzichtig " "tot doorzichtig" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Titelbalk muiswiel actie" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Type vervaging gebruikt voor venster decoratie" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Gebruik metacity thema" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Gebruik metacity thema voor venster decoratie" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Venster sluiten" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Demaximaliseer venster" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximaliseer venster" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Venster minimaliseren" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Het venster \"%s\" reageert niet" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Door deze applicatie geforceerd te sluiten kunt u niet opgeslagen " "wijzigingen kwijt raken." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Annoteer" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Annoteer opvul kleur" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Annoteer doorhaal kleur" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Annoteer plug-in" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Wissen" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Teken" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Teken met hulpmiddel" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Opvul kleur voor annotatie's" # Maybe "start" or "begin" would be better in dutch #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Initialiseren" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Initiëer tekenen van annotatie" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Initiëer verwijderen van annotatie" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Starten verwijdering" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Lijn breedte" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Lijn breedte voor annotaties" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Doorhaal kleur voor annotaties" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Doorhaal breedte" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Doorhaal breedte voor annotaties" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinear" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alpha Vervaging" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Aplha vervaging vensters" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Vervagen filter" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Vervagen verbergen" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Vervagen verzadiging" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Vervagen snelheid" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Vervagen Vensters" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Vervagen achter doorzichtige onderdelen van vensters" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Vervagen verzadiging" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Vensters vervagen" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Vervagen vensters zonder focus" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Uitschakelen van vervagen van scherm-regio's bedekt door andere vensters." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Filter methode voor vervagen" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Focus vervagen" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Focus vervagen vensters" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussisch" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gaussische Radius" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gaussische Sterkte" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Gaussische radius" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gaussische sterkte" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" # ../../db/printers.ycp.noloc:1400 #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" # ../../db/printers.ycp.noloc:1400 #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap detail-niveau" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Puls" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Puls effect" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Venster vervagen snelheid" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Vensters die aanmerking komen voor focus vervagen" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Vensters die alpha vervagen standaard moeten gebruiken" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Kloon uitvoer" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Start kloon selectie" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Kloon uitvoer afhandelaar" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Een toetsbinding, die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando0" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Een toetsbinding, die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Een toetsbinding, die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando0" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Commando regel 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Commando regel 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Commando regel 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Commando regel 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Commando regel 2 " #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Commando regel 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Commando regel 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Commando regel 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Commando regel 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Commando regel 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Commando regel 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Commando regel 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Commando regel om uit te voerenin de shell als run_command0 aangeroepen wordt" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command1 aangeroepen wordt" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command10 aangeroepen " "wordt" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command11 aangeroepen " "wordt" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command2 aangeroepen wordt" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command3 aangeroepen wordt" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command4 aangeroepen wordt" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command5 aangeroepen wordt" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command6 aangeroepen wordt" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command7 aangeroepen wordt" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command8 aangeroepen wordt" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command9 aangeroepen wordt" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Opdracht" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Start commando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Start commando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Start commando 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Start commando 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Start commando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Start commando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Start commando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Start commando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Start commando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Start commando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Start commando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Start commando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Actieve plugins" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Sta volledig scherm vensters toe om niet omgeleid te worden naar off-screen " "pixmaps" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Hoorbaar signaal" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Hoorbare systeem piep" # /usr/lib/YaST2/clients/dialup_dev_cfg.ycp:80 #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatisch naar de voorgrond" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Automatisch naar de voorgrond vetraging" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatische herkenning van uitvoer apparaten" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatische herkenning van verversings snelheid" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Best" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Klik voor focus" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Klik op venster neemt invoer focus mee" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Sluit actief venster" # /usr/lib/YaST2/clients/lan_address.ycp:88 #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Standaard pictogram" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Standaard venster pictogram afbeelding" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Bureaublad kubus" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detecteer uitvoer" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detecteer verversings snelheid" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Snel" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Focus Vensters Voorkomen" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Focus Vensters Voorkomen" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Focus vensters voorkomen" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Algemene opties" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Algemene compiz opties" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Goed" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Verberg taakbalk overgeslagen vensters" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Verberg alle vensters en laat bureaublad zien" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Verberg vensters die niet in de taakbalk staan als Toon Bureaublad modus " "ingeschakeld wordt" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Virtuele horizontale grootte" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Negeer tips wanneer gemaximalizeerd" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Negeer vergroting en aspect hints indien venster is gemaximaliseerd" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "interval voor het omhoogbrengen van geselecteerd venster" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Interval tussen ping berichten" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Belichting" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lijst met actieve plung-ins" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lijst met strings die uitvoer apparaten omschrijven" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Laat venster zakken" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Laat venster zakken achter andere vensters" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximaliseer venster horizontaal" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximaliseer venster verticaal" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximaliseer actief venster" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximaliseer actief venster horizontaal" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximaliseer actief venster verticaal" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimaliseer actief venster" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normaal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Aantal bureaubladen" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Aantal virtuele bureabladen" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Scherm alleen bijwerken tijdens verticale blanking periode" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Uitvoer" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping vertraging" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Op voorgrond na klikken" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Venster naar de voorgrond" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Breng venster naar de voorgrond na interval" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Breng venster op voorgrond over andere vensters" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Breng venster naar de voorgrond na aanklikken" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Verversings snelheid" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Schermgrootte vermenigvuldiger voor horizontale grootte" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "scherm grootte vermenigvuldiger voor verticale grootte" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Toon bureaublad" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Langzame animaties" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "Slim" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sync naar VBlank" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Texturen filteren" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Texturen filter" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Texturen filteren" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "De snelheid waarin een scherm opnieuw getekend wordt (tijd/seconden)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Schakel venster gemaximaliseerd" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Schakel venster horizontaal gemaximaliseerd" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Schakel venster vertikaal gemaximaliseerd" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Schakel venster opgerold" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Schakel actief venster gemaximaliseerd" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Schakel actief venster horizontaal gemaximaliseerd" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Schakel actief venster vertikaal gemaximaliseerd" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Schakel actief venster schaduw" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Schakel het gebruik van langzame animaties" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Demaximaliseer actief venster" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Niet omleiden van volledig scherm vensters" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Gebruik diffuus licht als het scherm wordt getransformeerd" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Verticale virtuele grootte" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Venster menu knop verbinding" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Venster menu knop verbinding" # workflow: "3D Beschleunigung aktivieren" # -ke- # /usr/lib/YaST2/clients/inst_config_x11.ycp:812 #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Versnelling" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Afbeelding bijstellen" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Top zijde afbeelding bijstellen op rotatie" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Door naar de volgende afbeelding" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Geanimeerde skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animeer skydome tijdens draaien van kubus" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" # /usr/lib/YaST2/clients/dialup_dev_cfg.ycp:80 #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatisch" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Kleur van de onder en boven zijde van de kubus" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Kleur om te gebruiken voor het onderste einde van de gradatie gebruikt als " "terugval voor de hemelkoepel" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Kleur om te gebruiken voor het bovenste einde van de gradatie die wordt " "gebruikt als hemelkoepel terugval" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Kubus kleur" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kubus kleur" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Bureaublad kubus" # workflow: "3D Beschleunigung aktivieren" # -ke- # /usr/lib/YaST2/clients/inst_config_x11.ycp:812 #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Uitvouw versnelling" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Uitvouw snelheid" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Vouw tijdstap" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Genereer mipmap waarmogelijk voor een hogere schalings kwaliteit" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Ga terug naar vorige dia" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Afbeeldings bestanden" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Te gebruiken afbeelding voor skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Initialiseer kubus transparantie alleen als rotatie via de muis gestuurd " "wordt" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Binnen in de kubus" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Binnen in de kubus" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lijst van PNG en SVG bestanden die afgebeeld moeten worden op de bovenzijde " "van de kubus" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Multi uitvoer modus" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Meerdere kubussen" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Volgende dia" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "Een grote kubus" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Doorzichtig tijdens draaien" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Doorzichtig tijdens niet draaien" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Ondoorzichtigheid van het bureaublad tijdens het draaien." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Doorzichtig van het bureaublad tijdens het niet draaien" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Plaats venster op de kubus" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Vorige dia" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Render Skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Afbeelding oprekken" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Afbeelding oprekken om de boven zijde van de kubus te bedekken" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Selecteer hoe de kubus wordt weergegeven als er meerdere uitvoer apparaten " "gebruikt worden" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Hemelkoepel" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Hemelkoepel gradatie eind kleur" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Hemelkoepel gradatie start kleur" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Hemelkoepel afbeelding" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Snelheid" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Tijdstempel" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Doorschijnend alleen tijdens draaien met de muis" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Uitvouwen" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "kubus uitvouwen" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus control backend" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Sta toe dat mipmaps gegenereerd worden voor decoratie texturen" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Opdracht" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Venster decoratie" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Decorator commandoregel die uitgevoerd wordt als er nog geen decorator draait" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Slagschaduw X offset" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Slagschaduw Y offset" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Schaduw kleur" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Slagschaduw opaciteit" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Schaduw omtrek" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Schaduw kleur" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Schaduw X offset" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Schaduw Y offset" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Schaduw ondoorzichtigheid" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Schaduw omtrek" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Schaduw vensters" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Venster decoratie" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Venster decoraties" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Vensters met decoratie" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Vensters met schaduw" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Rotatie snelheid" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Begrens Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Normale grootte aanpassing van vensters" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Verduisteren tijdsduur" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Vervaag bij Minimaliseren/Openen/Sluiten" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Vervaag snelheid" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Verduisteren tijdsduur" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Vervaag effect bij Minimaliseren/Openen/Sluiten" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Vervaag effect bij systeem piep" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Invagen van vensters als ze gemapped worden en uitvagen als ze gedemapped " "worden" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Vervaag vensters" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Vervagende vensters" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Visueel alarm is volledigscherm" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Volledig scherm vervagen bij systeem piep" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Visueel alarm" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Venster vervaag snelheid" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Vensters die geschaald moeten worden in schaal modus" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Vensters die moeten vervagen" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Koppel punt" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Koppel punt" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Gebruikers bestandssyteem" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Gebruikers bestandssysteem" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "Gconf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Gconf gecontrolleerde backend" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib main loop ondersteuning" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Een terminal openen" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" # /usr/lib/YaST2/clients/dialup_dev_cfg.ycp:336 #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Uitvoeren dialoog" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Terminal commando regel" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Schermafdruk commodo regel" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Toon Hoofdmenu" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Toon start applicatie dialoog venster" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Toon hoofdmenu" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Maak een schermafdruk" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Maak een schermafdruk van een venster" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Terminal commando regel" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Venster schermafdruk commando" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini platte tekst backend" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Bestands wijziging meldings plug-in" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig gecontrolleerde backend" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimaliseer effect" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Venster minimaliseren" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimaliseer snelheid" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Minimaliseer tijdstempel" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Oprol weerstand" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Oprol weerstand" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" "Transformeer vensters als deze worden geminimaliseerd en gemaximaliseerd" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Te transformeren vesters tijdens minimaliseren" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Begrens Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Begrens Y coördinaat tot werkruimte gebied" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Werk de server-zijde positie niet bij van vensters totdat deze klaar is met " "verplaatsen" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Start venster verplaatsing" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Luie positionering" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Verplaats venster" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Verplaats venster" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Ondoorzichtigheid" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Ondoorzichtigheid van vensters als zij worden verplaatst" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Los springen en auto de-maximaliseren van vensters als zij versleept worden" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Los springen van gemaximaliseerde vensters" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Start vensters verplaatsen" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Helderheid" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Helderheid" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Helderheid" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Helderheid" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Verminderen opaciteit" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Verhoog opaciteit" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Opaciteit verander stap" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Opaciteit verander stap" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Opaciteit stap" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Ondoorzichtigheid van vensters als zij worden verplaatst" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Doorzichtig tijdens draaien" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Verzadiging" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Verzadiging" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Verzadiging" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Verzadiging" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Venster decoraties" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Venster opaciteit waarde" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Vervagen Vensters" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Vensters die standaard gepositioneerd moeten worden" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Vensters die standaard licht doorlatend moeten zijn" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Vensters die standaard gepositioneerd moeten worden" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Te gebruiken algoritme om vensters te plaatsen" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Achter elkaar" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Gecentreerd" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Venster Beheer" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Focus Vensters Voorkomen" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Horizontale viewport positie's" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Plaats venster" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Plaats vensters op toepasselijke positie's bij mapping" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Plaatsing modus" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Gepositioneerde vensters" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Willekeurig" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Selecteert waar vensters worden geschaald als meerdere uitvoer apparaten " "worden gebruikt." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Slim" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "Op alle uitvoer apparaten" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Verticale viewport positie" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Viewport gepositioneerde vensters" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Venster plaatsing workarounds" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Vensters die standaard gepositioneerd moeten worden" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Vensters die gepositioneerd moeten worden in een specifieke viewport" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Venster decoraties" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X positie" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X viewport positie's" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X positie waarden" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y positie's" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y viewport positie's" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y positie waarden" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "PNG afbeelding lader" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Regex matching voor vensters" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Rand kleur" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Rand kleur gebruikt voor omtrek en rechthoek grootte aanpassing modi" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Standaard grootte aanpassing modus" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Standaard modus gebruikt voor grootte aanpassing van vensters" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Vul kleur" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Vul kleur gebruikt voor de rechthoek grootte aanpassing modus" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Initiëer normale venster grootte aanpassing" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Initiëer omtrek venster grootte aanpassing" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Initiëer rechthoek venster grootte aanpassing" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Initiëer rekken venster grootte aanpassing" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Initiëer venster grootte aanpassing" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Normale grootte aanpassing van vensters" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Omtrek" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Omtrek grootte aanpassing van vensters" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rechthoek" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Rechthoek grootte aanpassing" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Grootte aanpassing venster" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Grootte aanpassing venster" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Begin met grootte aanpassing venster" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Begin met grootte aanpassing door het op te rekken" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Start grootte aanpassing venster normaal" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Begin grootte aanpassing van venster net omtrek" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Begin met grootte aanpassing met rechthoek" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Rekken" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Rekken grootte aanpassing van vensters" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" "Vensters waar normale grootte aanpassing voor gebruikt zou moeten worden" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Vensters waarvoor omtrek grootte aanpassing gebruikt zou moeten worden" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" "Vensters waarvoor rechthoek grootte aanpassing gebruikt zou moeten worden" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Vensters waarvoor rekken grootte aanpassing gebruikt zou moeten worden" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Rand kantel verslepen" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Rand kantel verplaatsen" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Rand kantel aanwijzer" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Kantel tijd" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Kantel naar linker viewport en warp aanwijzer" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Kantel naar volgende viewport als een object naar de scherm rand wordt " "versleept" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Kantel naar volgende viewport als de aanwijzer naar de schermrand wordt " "verplaatst" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Kantel naar volgende viewport als venster wordt verplaatst naar schermrand" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Kantel naar rechter viewport en warp aanwijzer" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inverteer Y as voor aanwijzer beweging" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Aanwijzer Y inverteren" # /usr/lib/YaST2/clients/printconf_filter.ycp:200 #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Aanwijzer gevoeligheid" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Omhoog halen bij roteren" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Verhef venster bij roteren" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Roteer kubus" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Roteer kantel links" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Roteer kantel rechts" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Roteer links" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Roteer links met venster" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Roteer rechts" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Roteer naar rechts met venster" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Roteer naar" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Roteer naar zijde 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Roteer naar zijde 1 met venster" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Roteer naar zijde 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Roteer naar zijde 10 met venster" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Roteer naar zijde 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Roteer naar zijde 11 met venster" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Roteer naar zijde 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Roteer naar zijde 12 met venster" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Roteer naar zijde 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Roteer naar zijde 2 met venster" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Roteer naar zijde 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Roteer naar zijde 3 met venster" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Roteer naar zijde 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Roteer naar zijde 4 met venster" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Roteer naar zijde 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Roteer naar zijde 5 met venster" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Roteer naar zijde 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Roteer naar zijde 6 met venster" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Roteer naar zijde 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Roteer naar zijde 7 met venster" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Roteer naar zijde 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Roteer naar zijde 8 met venster" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Roteer naar zijde 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Roteer naar zijde 9 met venster" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Roteer kubus" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Roteer bureaublad kubus" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Roteer naar links" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Roteer naar links en neem actief venster mee" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Roteer naar rechts" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Roteer naar rechts en neem venster mee" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Roteer naar zijde 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Roteer naar zijde 1 met venster" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Roteer naar zijde 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Roteer naar zijde 1 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Roteer naar zijde 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Roteer naar zijde 10 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Roteer naar zijde 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Roteer naar zijde 11 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Roteer naar zijde 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Roteer naar zijde 12 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Roteer naar zijde 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Roteer naar zijde 2 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Roteer naar zijde 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Roteer naar zijde 3 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Roteer naar zijde 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Roteer naar zijde 4 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Roteer naar zijde 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Roteer naar zijde 5 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Roteer naar zijde 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Roteer naar zijde 6 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Roteer naar zijde 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Roteer naar zijde 7 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Roteer naar zijde 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Roteer naar zijde 8 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Roteer naar zijde 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Roteer naar zijde 9 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Roteer naar viewport" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Roteer venster" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Roteer met venster" # workflow: "3D Beschleunigung aktivieren" # -ke- # /usr/lib/YaST2/clients/inst_config_x11.ycp:812 #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Rotatie acceleratie" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Rotatie snelheid" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Rotatie tijdstap" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Rotatie zoom" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Gevoeligheid van aanwijzer beweging" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Klik kubus rotatie aan ondervlak" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Klik kubus rotatie aan bovenvlak" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Klik aan ondervlak" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Klik aan bovenvlak" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Begin rotatie" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Timeout voor kantelen viewport" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Mate van ondoorzichtigheid in procenten" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Groot" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Klik bureaublad voor Toon Bureaublad" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Achtergrond donker maken" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Achtergrond donker maken tijdens schalen van vensters" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Embleem" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Activeer Toon Bureaublad modus als bureaublad wordt aangeklikt tijdens het " "schalen" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Zweef tijd" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Initiëer venster kiezer" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Initiëer venster kiezer voor alle vensters" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Initiëer venster kiezer voor venster groep" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Initiëer venster kiezer voor vensters op huidige uitvoer" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Uitleggen en begin met transformeren van alle vensters" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Uitleggen en beginnen met transformeren van venster groep" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Uitleggen en start transformeren vensters" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Uitleggen en start transformeren vensters op huidige uitvoer" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Op alle uitvoer apparaten" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Op huidige uitvoer apparaten" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Overlay icoon" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Een overlay icoon op vensters als ze zijn geschaald" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Schaal" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Schaal vensters" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Schaal snelheid" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Schaal tijdstap" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Schaal vensters" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Selecteert waar vensters worden geschaald als meerdere uitvoer apparaten " "worden gebruikt." # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Ruimte tussen vensters" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Tussenruimte" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Tijd (in ms) voordat de schaal modus wordt afgebroken als over het venster " "wordt gezweefd" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Vensters die geschaald moeten worden in schaal modus" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Automatisch schermafdruk openen in deze applicatie" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Directory" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Initiëer rechthoek schermafdruk" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Start toepassing" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Stop schermafdruk afbeeldingen in deze folder" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Schermafdruk" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Schermafdruk plugin" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "SVG" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "SVG afbeelding lader" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Mate van helderheid in procenten" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Mate van verzadiging in procenten" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Applicatie wisselaar" # /usr/lib/YaST2/clients/dialup_dev_cfg.ycp:80 #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Auto rotatie" # /usr/lib/YaST2/clients/inst_ask_config.ycp:100 #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Breng naar voren" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Breng geselcteerd venster naar voren" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Afstand bureaublad moet zijn uitgezoomd tijdens wisselen van vensters" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Pictogram" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Geminimaliseerd" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Bureaublad vlak" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Volgende venster" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Volgende venster (alle vensters)" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Volgende venster (geen popup)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" "Laat wisselaar te voorschijn komen indien niet zichtbaar en selecteer " "volgende venster" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Laat venster te voorschijn komen indien niet zichtbaar en selecteer volgende " "venster uit alle vensters" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" "Laat venster te voorschijn komen indien niet zichtbaar en selecteer vorige " "venster" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Laat wisselaar te voorschijn komen indien niet zichtbaar en selecteer vorige " "venster uit alle vensters" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Vorige dia" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Vorig venster" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Vorig venster (all vensters)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Vorig venster (geen popup)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Roteer naar het geselecteerde venster tijdens wisseling" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Selecteer volgende venster zonder het popup venster te tonen." #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Selecteer vorige venster zonder het popup venster te tonen." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Selecteer vorige venster zonder het popup venster te tonen." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Toon pictogram naast thumbnail" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Toon geminimaliseerde vensters" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Wisselaar snelheid" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Wisselaar tijdstap" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Wisselaar vensters" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Vensters die getoond moeten worden in de wisselaar" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Voorzie in ondersteuning voor YV12 colorspace" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Video afspelen" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Video afspelen" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 colorspace" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Lijn toevoegen" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Punt toevoegen" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Voegt water effecten toe aan verschillende bureaublad acties" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Vertraging (in ms) tussen elke regen-druppel" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Inschakelen aanwijzer water effecten" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Lijn" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Offset schaal" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punt" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Regen vertraging" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Titel golf" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Schakel regen" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Schakel regen effect" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Schakel wisser" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Schakel wisser effect" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Water effect" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Water offset schaal" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Golf effect vanaf venster titel" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Focus effect" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Focus venster effect" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Focus vensters" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Wrijving" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Grijp vensters" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Raster Resolutie" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Geïnverteerd venster klikken" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Laat vensters rillen" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Maximaliseren effect" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Minimale raster grootte" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimum vertex raster grootte" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Verplaats vensters" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Rilling" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Klikken geïnverteerd" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Vensters klikken" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Veer Wrijving" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Veer K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Veer Contstante" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Schakel venster klikken" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Gebruik veer model voor wiebelend venster effect" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Vertex raster resolutie" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Vensters die moeten wiebelen tijdens focus" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Vensters die moeten wiebelen als ze gegrepen worden" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Vensters die moeten wiebelen als ze gemapped worden" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Vensters die moeten wiebelen tijdens verplaatsen" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Wiebel effect tijdens maximaliseren en herstellen vensters" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Wiebelende Vensters" #~ msgid "Command line 0" #~ msgstr "Commando regel 0" #~ msgid "Run command 0" #~ msgstr "Start commando 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Schermafdruk commodo regel" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Schermafdruk commodo regel" #~ msgid "Filter Linear" #~ msgstr "Filter Lineair" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Gebruik lineair filter zodra ingezoomd" #~ msgid "Zoom Desktop" #~ msgstr "Zoom bureaublad" #~ msgid "Zoom In" #~ msgstr "Zoom in" #~ msgid "Zoom Out" #~ msgstr "Zoom uit" #~ msgid "Zoom Pan" #~ msgstr "Zoom verschuiven" #~ msgid "Zoom Speed" #~ msgstr "Zoom snelheid" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #~ msgid "Zoom Timestep" #~ msgstr "Zoom tijdstap" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zoomen en verschuiven van bureaublad kubus" #~ msgid "Zoom factor" #~ msgstr "Zoom factor" #~ msgid "Zoom pan" #~ msgstr "Zoom verschuiven" #~ msgid "Decrease window opacity" #~ msgstr "Verminderen venster opaciteit" #~ msgid "Increase window opacity" #~ msgstr "Verhoog venster opaciteit" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Opaciteit waarde voor vensters die standaard lichtdoorlatend moeten zijn" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #~ msgid "Opacity windows" #~ msgstr "Opaciteit vensters" #~ msgid "Background Images" #~ msgstr "Achtergrond afbeelding" #~ msgid "Background images" #~ msgstr "Achtergrond afbeelding" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #~ msgid "Place windows on a plane" #~ msgstr "Plaats vensters op een vlak" #~ msgid "Plane Down" #~ msgstr "Vlak omlaag" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #~ msgid "Plane Left" #~ msgstr "Vlak links" #~ msgid "Plane Right" #~ msgstr "Vlak rechts" #~ msgid "Plane To Face 1" #~ msgstr "Vlak naar zijde 1" #~ msgid "Plane To Face 10" #~ msgstr "Vlak naar zijde 10" #~ msgid "Plane To Face 11" #~ msgstr "Vlak naar zijde 11" #~ msgid "Plane To Face 12" #~ msgstr "Vlak naar zijde 12" #~ msgid "Plane To Face 2" #~ msgstr "Vlak naar zijde 2" #~ msgid "Plane To Face 3" #~ msgstr "Vlak naar zijde 3" #~ msgid "Plane To Face 4" #~ msgstr "Vlak naar zijde 4" #~ msgid "Plane To Face 5" #~ msgstr "Vlak naar zijde 5" #~ msgid "Plane To Face 6" #~ msgstr "Vlak naar zijde 6" #~ msgid "Plane To Face 7" #~ msgstr "Vlak naar zijde 7" #~ msgid "Plane To Face 8" #~ msgstr "Vlak naar zijde 8" #~ msgid "Plane To Face 9" #~ msgstr "Vlak naar zijde 9" #~ msgid "Plane Up" #~ msgstr "Vlak omhoog" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #~ msgid "Plane down" #~ msgstr "Vlak omlaag" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #~ msgid "Plane left" #~ msgstr "Vlak rechts" #~ msgid "Plane right" #~ msgstr "Vlak rechts" #~ msgid "Plane to face 1" #~ msgstr "Vlak naar zijde 1" #~ msgid "Plane to face 10" #~ msgstr "Vlak naar zijde 10" #~ msgid "Plane to face 11" #~ msgstr "Vlak naar zijde 11" #~ msgid "Plane to face 12" #~ msgstr "Vlak naar zijde 12" #~ msgid "Plane to face 2" #~ msgstr "Vlak naar zijde 2" #~ msgid "Plane to face 3" #~ msgstr "Vlak naar zijde 3" #~ msgid "Plane to face 4" #~ msgstr "Vlak naar zijde 4" #~ msgid "Plane to face 5" #~ msgstr "Vlak naar zijde 5" #~ msgid "Plane to face 6" #~ msgstr "Vlak naar zijde 6" #~ msgid "Plane to face 7" #~ msgstr "Vlak naar zijde 7" #~ msgid "Plane to face 8" #~ msgstr "Vlak naar zijde 8" #~ msgid "Plane to face 9" #~ msgstr "Vlak naar zijde 9" #~ msgid "Plane up" #~ msgstr "Vlak omhoog" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Bureaublad venster opaciteit verduisteren tijdsduur" compiz-0.9.11+14.04.20140409/po/pa.po0000644000015301777760000033606012321343002017060 0ustar pbusernogroup00000000000000# translation of compiz.po to Punjabi # Hindi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Prasanth Kurian # # A S Alam , 2007. # Amanpreet Singh Alam , 2007. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2007-12-15 09:26+0530\n" "Last-Translator: Amanpreet Singh Alam \n" "Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: Plural-Forms: Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: KAider 0.1\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "ਵੇਹੜਾ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "à¨à¨°à©‹à¨–ਾ ਪਰਬੰਧਕ" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "ਕੰਮਪਿਜ਼" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "ਕੋਈ ਨਹੀਂ" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "ਸੰਭਾਲੋ" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "Window&s ਸਮੇਟੋ" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Window&s ਸਮੇਟੋ" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Window&s ਸਮੇਟੋ" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Window&s ਸਮੇਟੋ" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "ਸਵੈ-ਚਾਲਤ" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "à¨à¨°à©‹à¨–ਾ ਪਰਬੰਧਕ" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "ਜਦੋਂ ਮਾਊਂਸ ਵੀਲ ਨੂੰ ਇੱਕ ਵਿੰਡੋ ਟਾਇਟਲ ਬਾਰ ਉੱਤੇ ਘà©à©°à¨®à¨¾à¨‰à¨£ ਦੌਰਾਨ ਲੈਣ ਲਈ à¨à¨•ਸ਼ਨ ਹੈ।" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "ਚà©à¨£à©‡" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Win&dows ਭਾਗ ਹਟਾਓ" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Win&dows ਭਾਗ ਹਟਾਓ" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "ਮੇਟਾਸਿਟੀ ਥੀਮ ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "ਮੇਟਾਸਿਟੀ ਥੀਮ ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨ ਸ਼ੇਡ" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "à¨à¨•ਟਿਵ ਵਿੰਡੋ ਲਈ ਮੇਟਾਸਿਟੀ ਥੀਮ ਸਜਾਵਟ ਨਾਲ ਵਰਤਣ ਲਈ ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "ਮੇਟਾਸਿਟੀ ਥੀਮ ਸਜਾਵਟ ਲਈ ਵਰਤਣ ਵਾਸਤੇ ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "ਧà©à©°à¨¦à¨²à©‡à¨ªà¨¨ ਤੋਂ ਪਾਰਦਰਸ਼ ਲਈ ਸ਼ੈਡ à¨à¨•ਟਿਵ ਵਿੰਡੋ ਮੇਟਾਸਿਟੀ ਥੀਮ ਸਜਾਵਟ" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "ਧà©à©°à¨¦à¨²à©‡à¨ªà¨¨ ਤੋਂ ਪਾਰਦਰਸ਼ ਲਈ ਵਿੰਡੋ ਸ਼ੈਡੋ ਮੇਟਾਸਿਟੀ ਥੀਮ ਸਜਾਵਟ" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "ਟਾਇਟਲ ਬਾਰ ਮਾਊਸ ਵੀਲ à¨à¨•ਸ਼ਨ" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "ਵਿੰਡੋ ਸਜਾਵਟ ਲਈ ਵਰਤਣ ਲਈ ਬਲਰ ਦੀ ਟਾਈਪ" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "ਮੇਟਾਸਿਟੀ ਥੀਮ ਵਰਤੋਂ" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "ਵਿੰਡੋ ਸਜਾਵਟ ਡਰਾਇੰਗ ਦੌਰਾਨ ਮੇਟਾਸਿਟੀ ਥੀਮ ਵਰਤੋਂ" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "Win&dows ਹਟਾਓ" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "ਵਿੰਡੋ ਅਣ-ਵੱਧੋ-ਵੱਧ" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "ਵਿੰਡੋ ਅਧਿਕਤਮ" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 #, fuzzy msgid "Minimize Window" msgstr "Window&s ਸਮੇਟੋ" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Init" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "ਰੰਗ" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "à¨à¨¨à¨¾à¨Ÿà©‡à¨Ÿ ਸਟਰੋਕ ਰੰਗ" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "ਸਰਗਰਮ ਪਰੋਫਾਇਲ" #: ../metadata/annotate.xml.in.h:5 #, fuzzy msgid "Clear" msgstr "XF86Clear" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "ਡਰਾਅ" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "ਟੂਲ ਰਾਹੀਂ ਡਰਾਅ ਕਰੋ" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "à¨à¨¨à¨¾à¨Ÿà©‡à¨¸à¨¼à¨¨ ਲਈ ਭਰਨ ਰੰਗ" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Init" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Init" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Init" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Init" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "ਲਾਈਨ ਚੌੜਾਈ" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "à¨à¨¨à¨¾à¨Ÿà©‡à¨¸à¨¼à¨¨ ਲਈ ਲਾਈਨ ਚੌੜਾਈ" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "à¨à¨¨à¨¾à¨Ÿà©‡à¨¸à¨¼à¨¨ ਸਟਰੋਕ ਰੰਗ" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "ਸਟਰੋਕ ਚੌੜਾਈ" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "à¨à¨¨à¨¾à¨Ÿà©‡à¨¸à¨¼à¨¨ ਲਈ ਸਟਰੋਕ ਚੌੜਾਈ" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "ਫਿਲਟਰ:" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "ਫਿਲਟਰ ਸੈਟ(&S)" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "ਅੰਤਰਾਲ" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "ਅੰਤਰਾਲ" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "ਚà©à¨£à©‡" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "ਵਿੰਡੋ ਦੇ ਪਾਰਦਰਸ਼ੀ ਭਾਗਾਂ ਪਿੱਛੇ ਬਲਰ ਕਰੋ" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "ਅੰਤਰਾਲ" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "ਬਲਰ ਵਿੰਡੋ, ਜਿੰਨà©à¨¹à¨¾à¨‚ ਨੂੰ ਫੋਕਸ ਨਹੀਂ ਹੋ ਸਕਦਾ " #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "ਹੋਰ ਵਿੰਡੋ ਵਲੋਂ ਵੇਖੇ ਜਾਂਦੇ ਸਕਰੀਨ ਭਾਗ ਬਲਰ ਨਾ ਕਰੋ" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "ਬਲਰ ਵਾਸਤੇ ਵਰਤਣ ਲਈ ਫਿਲਟਰ ਢੰਗ" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "ਰੂਸੀ" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "ਰੂਸੀ ਸੰਘ" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "ਰੂਸੀ" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "ਰੂਸੀ ਸੰਘ" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "ਰੂਸੀ" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "ਲੀਮਾ" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "ਲੀਮਾ" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "ਮਿਪਮੈਪ ਵੇਰਵਾ ਦਾ ਲੈਵਲ" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "ਪਲਸ" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "ਪਲਸ ਪਰਭਾਵ" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windows" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਫੋਕਸ ਬਲਰ ਰਾਹੀਂ ਪਰਭਾਵਿਤ ਹੋਵੇ" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਡਿਫਾਲਟ à¨à¨²à¨«à¨¾ ਵਰਤੇ" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "ਆਉਟਪà©à©±à¨Ÿ ਕਲੋਨ ਕਰੋ" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Init" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "ਆਉਟਪà©à©±à¨Ÿ ਕਲੋਨ ਹੈਂਡਲਰ" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command0 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command1 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command10 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ " "ਹੈ।" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command11 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ " "ਹੈ।" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command2 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command3 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command5 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command5 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command6 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command7 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command8 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command9 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command0 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command1 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command10 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ " "ਹੈ।" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command11 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ " "ਹੈ।" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command2 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command3 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command5 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command5 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command6 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command7 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command8 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command9 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command0 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command1 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command10 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ " "ਹੈ।" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command11 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ " "ਹੈ।" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command2 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command3 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command5 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command5 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command6 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command7 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command8 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹà©à©°à¨¦à©€ ਹੈ, ਜਦੋਂ command9 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "ਜਦੋਂ run_command0 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "ਜਦੋਂ run_command1 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "ਜਦੋਂ run_command10 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "ਜਦੋਂ run_command11 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "ਜਦੋਂ run_command2 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "ਜਦੋਂ run_command3 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "ਜਦੋਂ run_command4 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "ਜਦੋਂ run_command5 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "ਜਦੋਂ run_command6 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "ਜਦੋਂ run_command7 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "ਜਦੋਂ run_command8 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "ਜਦੋਂ run_command9 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "ਕਮਾਂਡ '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "ਕਮਾਂਡ '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "ਕਮਾਂਡ '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "ਕਮਾਂਡ '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "ਕਮਾਂਡ: " #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "ਸਰਗਰਮ ਪਰੋਫਾਇਲ" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "ਪੂਰੀ ਸਕਰੀਨ ਵਿੰਡੋਜ਼ ਦੀ ਡਰਾਇੰਗ ਨੂੰ ਆਫ਼-ਸਕਰੀਨ ਪਿਕਸਮੈਪ ਨੂੰ ਰੀ-ਡਿਰੈਕਟ ਨਾ ਕਰਨ ਲਈ ਮਨਜ਼ੂਰੀ" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "ਸà©à¨£à¨¨à¨¯à©‹à¨— ਘੰਟੀ" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "ਫਾਇਲ ਸਿਸਟਮ" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "ਸਵੈ-ਚਾਲਤ" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "ਆਟੋ-ਉਭਾਰਨ ਅੰਤਰਾਲ" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "ਆਉਟਪà©à©±à¨Ÿ ਜੰਤਰਾਂ ਦੀ ਆਟੋਮੈਟਿਕ ਖੋਜ" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "ਤਾਜ਼ਾ ਦਰ ਲਈ ਆਟੋਮੈਟਿਕ ਖੋਜ" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "ਉੱਤਮ" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ਫੋਕਸ ਲਈ ਕਲਿੱਕ ਕਰੋ" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "ਵਿੰਡੋ ਲਈ ਇੰਪà©à©±à¨Ÿ ਫੋਕਸ ਲੈਣ ਲਈ ਕਲਿੱਕ ਕਰੋ" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "à¨à¨•ਟਿਵ ਵਿੰਡੋ ਬੰਦ ਕਰੋ" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "ਮੂਲ ਹਿੱਸਾ" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "ਮੂਲ ਡੋਮੇਨ" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "ਵੇਹੜਾ" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "ਆਉਟਪà©à©±à¨Ÿ ਖੋਜੋ" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "ਅੱਪਡੇਟ ਲਈ ਚà©à¨£à©‹" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "ਤੇਜ਼" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "ਫੋਕਸ ਤੋਂ ਬਚਾਅ ਵਿੰਡੋ" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "ਫੋਕਸ ਤੋਂ ਬਚਾਅ ਵਿੰਡੋ" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "ਆਮ ਚੋਣਾਂ" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "ਆਮ ਕੰਪਿਜ਼ ਚੋਣਾਂ" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "ਚੰਗਾ" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "ਗ਼ੈਰ-ਟਾਸਕਬਾਰ ਵਿੰਡੋ ਓਹਲੇ" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "ਸਭ ਵਿੰਡੋ ਓਹਲੇ ਕਰੋ ਅਤੇ ਡੈਸਕਟਾਪ ਫੋਕਸ ਕਰੋ" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "ਜਦੋਂ ਡੈਸਕਟਾਪ ਮੋਡ ਵਿੱਚ ਜਾਣ ਲੱਗੋ ਤਾਂ ਟਾਸਕਬਾਰ ਵਿੱਚ ਨਾ ਮੌਜੂਦ ਵਿੰਡੋ ਓਹਲੇ" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "ਫ਼ਰਜ਼ੀ ਜੰਤਰ" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "ਜਦੋਂ ਵੱਧੋ-ਵੱਧ ਹੋਵੇ ਤਾਂ ਹਿੰਟ ਅਣਡਿੱਠੇ" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "ਜਦੋਂ ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਹੋਵੇ ਤਾਂ ਵਾਧਾ ਸਾਈਜ਼ ਅਤੇ ਅਨà©à¨ªà¨¾à¨¤ ਹਿੰਟ ਅਣਡਿੱਠੇ" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "ਚà©à¨£à©‡ ਵਿੰਡੋ ਉਭਾਰਨ ਤੋਂ ਪਹਿਲਾਂ ਅੰਤਰਾਲ" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "ਪਿੰਗ ਸà©à¨¨à©‡à¨¹à¨¿à¨†à¨‚ ਦੌਰਾਨ ਅੰਤਰਾਲ" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "ਸਵੈ-ਮà©à¨…ੱਤਲ ਯੋਗ" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "ਲਾਗਿੰਗ" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "ਖੋਜੇ ਪਰਿੰਟਰ ਹੀ ਵੇਖਾਓ" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr " ਆਉਟਪà©à©±à¨Ÿ ਜੰਤਰਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਲਈ ਲਾਈਨਾਂ ਦੀ ਲਿਸਟ" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "Windows" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "ਵਿੰਡੋ ਨੂੰ ਹੋਰ ਵਿੰਡੋ ਦੇ ਹੇਠਾਂ ਭੇਜੋ" #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/core.xml.in.in.h:51 #, fuzzy msgid "Maximize Window Vertically" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "ਵੱਧੋ-ਵੱਧ à¨à¨•ਟਿਵ ਵਿੰਡੋ" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "ਵੱਧੋ-ਵੱਧ à¨à¨•ਟਿਵ ਵਿੰਡੋ ਹਰੀਜ਼ਟਲ" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "ਵੱਧੋ-ਵੱਧ à¨à¨•ਟਿਵ ਵਿੰਡੋ ਵਰਟੀਕਲ" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "à¨à¨•ਟਿਵ ਵਿੰਡੋ ਘੱਟੋ-ਘੱਟ" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "ਸਧਾਰਨ" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "ਵੇਹੜਾ" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "ਵੇਹੜਾ" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "ਵਰਟੀਕਲ à¨à¨ªà¨• ਪੀਰੀਅਡ ਦੌਰਾਨ ਹੀ ਸਕਰੀਨ ਅੱਪਡੇਟ ਕਰੋ" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "ਆਉਟਪà©à©±à¨Ÿ" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "ਵਕਫਾ" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "ਰੇਡੀਓ ਘੜੀ(&R)" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "ਚà©à¨£à©‡ ਵਿੰਡੋ ਅੰਤਰਾਲ ਬਾਅਦ ਉਭਾਰੋ" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "ਵਿੰਡੋ ਨੂੰ ਹੋਰ ਵਿੰਡੋਜ਼ ਉੱਤੇ ਉਭਾਰੋ" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "ਵਿੰਡੋ ਉਭਾਰੋ, ਜਦੋਂ ਕਲਿੱਕ ਕੀਤਾ ਜਾਵੇ" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "ਤਾਜ਼ਾ" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "ਹਰੀਜੱਟਲ ਵà©à¨°à¨šà©à¨…ਲ ਸਾਈਜ਼ ਲਈ ਸਕਰੀਨ ਸਾਈਜ਼ ਮਲਟੀਪਲਾਇਰ" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "ਵਰਟੀਕਲ ਵà©à¨°à¨šà©à¨…ਲ ਸਾਈਜ਼ ਲਈ ਸਕਰੀਨ ਸਾਈਜ਼ ਮਲਟੀਪਲਾਇਰ" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "ਵੇਹੜਾ" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "ਸਾਰੇ ਭਾਗ ਵਿਖਾਓ" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "ਸਮਾਰਟ" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank ਨਾਲ ਸੈਕਰੋਨਾਈਜ਼" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "ਫਿਲਟਰ ਸੈਟ(&S)" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "ਫਿਲਟਰ ਸੈਟ(&S)" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "ਫਿਲਟਰ ਸੈਟ(&S)" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "ਰੇਟ, ਜਿਸ ਮà©à¨¤à¨¾à¨¬à¨• ਸਕਰੀਨ ਨੂੰ ਰੀ-ਡਰਾਅ ਕੀਤਾ ਜਾਵੇ (ਟਾਈਮ/ਸਕਿੰਟ)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਹਰੀਜ਼ਟਲ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਵਰਟੀਕਲ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "ਵਿੰਡੋ ਸ਼ੇਡ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "à¨à¨•ਟਿਵ ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "à¨à¨•ਟਿਵ ਵਿੰਡੋ ਹਰੀਜੱਟਲ ਵੱਧੋ-ਵੱਧ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "à¨à¨•ਟਿਵ ਵਿੰਡੋ ਵਰਟੀਕਲ ਵੱਧੋ-ਵੱਧ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "ਸਰਗਰਮ ਵਿੰਡੋ ਸ਼ੇਡ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "ਹੌਲੀ à¨à¨¨à©€à¨®à©‡à¨¸à¨¼à¨¨ ਲਈ ਟਾਗਲ ਵਰਤੋਂ" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "à¨à¨•ਟਿਵ ਵਿੰਡੋ ਅਣ-ਵੱਧੋ-ਵੱਧ" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "ਪੂਰੀ-ਸਕਰੀਨ ਵਿੰਡੋ ਗ਼ੈਰ-ਡਿਰੈਕਸ਼ਨ" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "ਜਦੋਂ ਸਕਰੀਨ ਟਰਾਂਸਫਰਮ ਕੀਤੀ ਜਾਵੇ ਤਾਂ ਹਲਕੀ ਲਾਈਟ ਵਰਤੋਂ" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "ਫ਼ਰਜ਼ੀ ਜੰਤਰ" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "ਵਿੰਡੋ ਮੇਨੂ ਬਟਨ ਬਾਈਡਿੰਗ" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "ਵਿੰਡੋ ਮੇਨੂ ਕੀ ਬਾਈਡਿੰਗ" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D ਪà©à¨°à¨µà©‡à¨¶à¨•:" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "ਚਿੱਤਰ ਅਡਜੱਸਟ ਕਰੋ" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "ਉੱਤੇ ਚਿੱਤਰ ਨੂੰ ਘà©à©°à¨®à¨¾à¨‰à¨£ ਲਈ ਅਡਜੱਸਟ ਕਰੋ" #: ../metadata/cube.xml.in.h:4 #, fuzzy msgid "Advance to next slide" msgstr "ਤਕਨੀਕੀ ਚੋਣ" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "ਸਕਾਈਡੋਮ à¨à¨¨à©€à¨®à©‡à¨Ÿ" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "ਜਦੋਂ ਕਿਊਬ ਘà©à©°à¨®à©‡ ਤਾਂ ਸਕਾਈਡੋਮ à¨à¨¨à©€à¨®à©‡à¨Ÿ ਕਰੋ" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "ਸਵੈ-ਚਾਲਤ" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "ਕਿਊਬ ਦੇ ਉੱਤੇ ਅਤੇ ਤਲ ਸਾਈਡਾਂ ਦਾ ਰੰਗ" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "ਤਲ ਰੰਗ -ਸਕਾਈਡੋਮੇ ਰੋਕਣ ਲਈ-ਫਾਲਬੈਕ ਗਰੇਡੀà¨à¨‚ਟ ਵਾਸਤੇ ਵਰਤਣ ਲਈ ਰੰਗ" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "ਟਾਪ ਰੰਗ -ਸਕਾਈਡੋਮੇ ਰੋਕਣ ਲਈ-ਫਾਲਬੈਕ ਗਰੇਡੀà¨à¨‚ਟ ਵਾਸਤੇ ਵਰਤਣ ਲਈ ਰੰਗ" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "ਰੰਗ" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "ਰੰਗ" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "ਵੇਹੜਾ" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D ਪà©à¨°à¨µà©‡à¨¶à¨•:" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "ਚà©à¨£à©‡" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "ਜਾਂਚ" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "ਵੱਧ ਕà©à¨†à¨²à¨Ÿà©€ ਸਕੇਲਿੰਗ ਲਈ ਜਦੋਂ ਵੀ ਸੰਭਵ ਹੋਵੇ mip-ਮੈਪ ਬਣਾਓ" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "ਪਿਛਲਾ ਕਰਨਲ" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "ਅਸਫਲ ਫਾਇਲਾਂ" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "ਸਕਾਈਡੋਮ ਲਈ ਟੈਕਸਟ ਵਾਂਗ ਵਰਤਣ ਲਈ ਚਿੱਤਰ" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "ਘਣ ਪਾਰਦਰਸਤਾ ਤਾਂ ਹੀ ਸ਼à©à¨°à©‚ ਕਰੋ, ਜੇ ਘà©à©°à¨®à¨¾à¨‰à¨£à¨¾ ਮਾਊਂਸ ਨਾਕਲ ਹੋਵੇ।" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ਕਿਊਬ ਅੰਦਰ" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "ਕਿਊਬ ਅੰਦਰ" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "PNG ਅਤੇ SVG ਫਾਇਲਾਂ ਦੀ ਲਿਸਟ, ਜੋ ਕਿ ਕਿਊਬ ਦੇ ਟਾਪ ਫੇਸ ਉੱਤੇ ਰੈਂਡਰ ਕੀਤੇ ਜਾਣੇ ਹਨ" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "ਮਲਟੀ ਆਉਟਪà©à©±à¨Ÿ ਮੋਡ" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "ਮਲਟੀਪਲ ਕਿਊਬ" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "ਨਵਾਂ ਅਕਾਰ" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "ਵੱਡੇ ਕਿਊਬ ਉੱਤੇ" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ਘà©à©°à¨®à¨¾à¨‰à¨£ ਦੌਰਾਨ ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "ਜਦੋਂ ਨਾ ਘà©à©°à¨®à©‡ ਤਾਂ ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ਡੈਸਕਟਾਪ ਵਿੰਡੋ ਦਾ ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨, ਜਦੋਂ ਘà©à©°à¨®à¨¦à¨¾ ਹੋਵੇ" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "ਜਦੋਂ ਘà©à©°à¨®à¨¦à¨¾ ਨਾ ਹੋਵੇ ਤਾਂ ਡੈਸਕਟਾਪ ਵਿੰਡੋ ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "ਪਿਛਲਾ ਕਰਨਲ" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "ਰੈਂਡਮ ਸਕਾਈਡੋਮ" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "ਸਥਾਨਕ ਸਮਾਂ" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "ਚਿੱਤਰਾਂ ਨੂੰ ਕਿਊਬ ਦਾ ਉੱਤੇ ਫੇਸ ਢੱਕਣ ਲਈ ਸਕੇਲ ਕਰੋ" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "ਚà©à¨£à©‹ ਕਿ ਘਣ ਨੂੰ ਕਿਵੇਂ ਵੇਖਾਇਆ ਜਾਵੇ, ਜਦੋਂ ਮਲਟੀਪਲ ਆਉਟਪà©à©±à¨Ÿ ਜੰਤਰ ਵਰਤੇ ਜਾਣ।" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "ਸਕਾਈਡੋਮ" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "ਸਕਾਈਡੋਮੇ ਗਰੇਡੀà¨à¨‚ਟ ਅੰਤ ਰੰਗ" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "ਸਕਾਈਡੋਮੇ ਗਰੇਡੀà¨à¨‚ਟ ਸ਼à©à¨°à©‚ ਰੰਗ" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "ਸਕਾਈਡੋਮ ਚਿੱਤਰ" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "ਚà©à¨£à©‡" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "ਜਾਂਚ" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "ਕੇਵਲ ਮਾਊਂਸ ਘà©à©°à¨®à¨¾à¨‰à¨£ ਨਾਲ ਹੀ ਪਾਰਦਰਸ਼ੀ" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "ਅਣ-ਫੋਲਡ" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "ਕਿਊਬ ਅਣਫੋਲਡ" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus ਕੰਟਰੋਲ ਬੈਕà¨à¨‚ਡ" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "ਸਜਾਵਟ ਟੈਕਸਟ ਲਈ ਤਿਆਰ ਕਰਨ ਲਈ ਮਿਪਮੈਪ ਮਨਜ਼ੂਰ" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "ਕਮਾਂਡ: " #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "ਸਜਾਵਟ ਕਮਾਂਡ ਲਾਇਨ, ਜੋ ਕਿ ਕਿਸੇ ਸਜਾਵਟ ਨਾ ਚੱਲਣ ਦੀ ਹਾਲਤ ਵਿੱਚ ਚਲਾਈ ਜਾਵੇ" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "ਅਰਧ-ਵਿਆਸ" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "ਅਰਧ-ਵਿਆਸ" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/decoration.xml.in.h:12 #, fuzzy msgid "Shadow Offset X" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/decoration.xml.in.h:13 #, fuzzy msgid "Shadow Offset Y" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "ਅਰਧ-ਵਿਆਸ" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "ਕੋਈ ਵੇਰਵਾ ਨਹੀਂ" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind ਚੋਣ" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "ਵਿੰਡੋ, ਜਿਸ ਦੀ ਸਜਾਵਟ ਕਰਨੀ ਹੈ" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "ਵਿੰਡੋ, ਜਿਸ ਦੀ ਸ਼ੈਡੋ ਹੋਵੇ" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "ਜਾਂਚ" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "ਸ਼ਾਮਲ" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "ਮੌਕੇ ਤੇ" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "ਘੱਟੋ-ਘੱਟ/ਖੋਲà©à¨¹à¨£/ਬੰਦ ਕਰਨ ਦੌਰਾਨ ਫੇਡ ਆਨ" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "ਚà©à¨£à©‡" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "ਮੌਕੇ ਤੇ" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "ਵਿੰਡੋ ਘੱਟੋ-ਘੱਟ/ਖੋਲà©à¨¹à¨£/ਬੰਦ ਕਰਨ ਦੇ ਈਵੈਂਟ ਸਮੇਂ ਫੇਡ ਪਰਭਾਵ" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "ਫਾਇਲ ਸਿਸਟਮ" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "ਜਦੋਂ ਮੈਪਿੰਗ ਹੋਵੇ ਤਾਂ ਵਿੰਡੋ ਫੇਡ ਇਨ ਅਤੇ ਜਦੋਂ ਅਣ-ਮੈਪ ਹੋਵੇ ਤਾਂ ਵਿੰਡ ਫੇਡ ਆਉਟ" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/fade.xml.in.h:16 #, fuzzy msgid "Fullscreen Visual Bell" msgstr "ਟੱਚ-ਸਕਰੀਨ" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "ਸਿਸਟਮ ਬੀਪ ਉੱਤੇ ਪੂਰੀ ਸਕਰੀਨ ਫੇਡ ਪਰਭਾਵ" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "ਦਿੱਖ ਬਿੱਲ" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "ਵਿੰਡੋਜ਼, ਜੋ ਕਿ ਸਕੇਲ ਮੋਡ 'ਚ ਸਕੇਲ ਕਰਨੀਆਂ ਹਨ" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਫੇਡ ਕੀਤੀ ਜਾਵੇ" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "ਸੰਪਰਕ ਸ਼ਾਮਿਲ" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "ਸੰਪਰਕ ਸ਼ਾਮਿਲ" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "ਯੂਜ਼ਰ-ਸਪੇਸ ਫਾਇਲ ਸਿਸਟਮ" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "ਯੂਜ਼ਰ-ਸਪੇਸ ਫਾਇਲ ਸਿਸਟਮ" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf ਕੰਟਰੋਲ ਬੈਕà¨à¨‚ਡ" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib ਮੇਨ ਲੂਪ ਸਹਿਯੋਗ" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "ਇੱਕ ਟਰਮੀਨਲ ਖੋਲà©à¨¹à©‹" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 #, fuzzy msgid "Run Dialog" msgstr "ਟੋਨ ਡਾਇਲ(&T)" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "ਕਮਾਂਡ ਲਾਇਨ ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ।" #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "ਕਮਾਂਡ ਲਾਇਨ ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ।" #: ../metadata/gnomecompat.xml.in.h:8 #, fuzzy msgid "Show Main Menu" msgstr "ਬੂਟ ਸੂਚੀ ਵੇਖਾਓ(&S)" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "à¨à¨ªà¨²à©€à¨•ੇਸ਼ਨ ਚਲਾਓ ਡਾਈਲਾਗ ਵੇਖੋ" #: ../metadata/gnomecompat.xml.in.h:10 #, fuzzy msgid "Show the main menu" msgstr "ਬੂਟ ਸੂਚੀ ਵੇਖਾਓ(&S)" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "ਇੱਕ ਸਕਰੀਨ-ਸ਼ਾਟ ਲਵੋ" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "ਇੱਕ ਵਿੰਡੋ ਦਾ ਇੱਕ ਸਕਰੀਨ-ਸ਼ਾਟ ਲਵੋ" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "ਕਮਾਂਡ ਲਾਇਨ ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ।" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "ਵਿੰਡੋ ਸਕਰੀਨ-ਸ਼ਾਟ ਕਮਾਂਡ ਲਾਈਨ" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "ਕੋਈ ਲਾਗ ਨਾ ਕਰੋ" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini ਫਲੈਟ ਫਾਇਲ ਬੈਕà¨à¨‚ਡ" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ਫਾਇਲ ਬਦਲਣ ਨੋਟੀਫਿਕੇਸ਼ਨ ਪਲੱਗਇਨ" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "ਕੋਈ ਲਾਗ ਨਾ ਕਰੋ" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig ਕੰਟਰੋਲ ਬੈਕà¨à¨‚ਡ" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "ਸ਼ੇਡ ਵਿਰੋਧ" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "ਸ਼ੇਡ ਵਿਰੋਧ" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "ਵਿੰਡੋ ਟਰਾਂਸਫਰਮ ਕਰੋ, ਜਦੋਂ ਉਹ ਘੱਟੋ-ਘੱਟ ਅਤੇ ਅਣ-ਘੱਟੋ-ਘੱਟ ਹੋਣ" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਘੱਟੋ-ਘੱਟ ਕਰਨ ਦੌਰਾਨ ਟਰਾਂਸਫਰਮ ਕੀਤੀ ਜਾਵੇ" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "ਸ਼ਾਮਲ" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "ਵਰਕਸਪੇਸ à¨à¨°à©€à¨ ਲਈ ਕਨਸਟਰੇਨ Y ਧà©à¨°à¨¾" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "ਸਰਵਰ ਨਾ ਅੱਪਡੇਟ ਨਾ ਕਰੋ-ਵਿੰਡੋ ਦੀ ਸਾਇਡ ਸਥਿਤੀ, ਜਦੋਂ ਕਿ ਘà©à©°à¨®à¨¾à¨‰à¨£à¨¾ ਮà©à©±à¨•ੇ" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "XF86RotateWindows" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "ਮà©à©œ-ਆਕਾਰ(&s)" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "ਹੇਠਾਂ ਜਾਓ(&D)" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "ਹੇਠਾਂ ਜਾਓ(&D)" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "ਜਦੋਂ ਡਰੈਗ ਕੀਤਾ ਜਾਵੇ ਤਾਂ ਵੱਧੋ-ਵੱਧ ਵਿੰਡੋਜ਼ ਨੂੰ ਸਨੈਪ-ਆਫ਼ ਅਤੇ ਆਟੋ ਅਣ-ਵੱਧੋ-ਵੱਧ ਕਰੋ" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "ਬਰਿੱਜ" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "ਬਰਿੱਜ" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "ਬਰਿੱਜ" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "ਬਰਿੱਜ" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨ ਘਟਾਓ" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨ ਵਧਾਓ" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "ਉਸਟਾਨ (ਪੋਸਟ 1500)" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "ਉਸਟਾਨ (ਪੋਸਟ 1500)" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨ ਸਟੈਪ" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "ਘà©à©°à¨®à¨¾à¨‰à¨£ ਦੌਰਾਨ ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "ਅੰਤਰਾਲ" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "ਅੰਤਰਾਲ" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "ਅੰਤਰਾਲ" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "ਅੰਤਰਾਲ" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind ਚੋਣ" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windows" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "ਵਿੰਡੋ. ਜੋ ਕਿ ਡਿਫਾਲਟ ਹੀ ਸਥਿਤ ਕੀਤੀ ਜਾਵੇ" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "ਵਿੰਡੋ,. ਜੋ ਕਿ ਡਿਫਾਲਟ ਹੀ ਪਾਰਦਰਸ਼ੀ ਹੋਵੇ" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "ਵਿੰਡੋ. ਜੋ ਕਿ ਡਿਫਾਲਟ ਹੀ ਸਥਿਤ ਕੀਤੀ ਜਾਵੇ" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "ਵਿੰਡੋ ਸਥਿਤੀ ਬਦਲਣ ਵਾਸਤੇ à¨à¨²à©‹à¨—ਰਥਿਮ" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "ਕੈਸਕੇਡ" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "ਸੈਂਟਰਡ" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "à¨à¨°à©‹à¨–ਾ ਪਰਬੰਧਕ" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "ਫੋਕਸ ਤੋਂ ਬਚਾਅ ਵਿੰਡੋ" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "ਫ਼ਰਜ਼ੀ ਜੰਤਰ" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "ਜਦੋਂ ਮੈਪ ਕੀਤਾ ਜਾਵੇ ਤਾਂ ਵਿੰਡੋ ਨੂੰ ਢà©à©±à¨•ਵੀਆਂ ਥਾਵਾਂ ਉੱਤੇ ਰੱਖੋ" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "ਸਥਿਤੀ ਰੱਖਣ ਮੋਡ" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "ਮà©à©œ-ਆਕਾਰ(&s)" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "ਰੈਂਡਮ" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "ਚà©à¨£à©‹, ਜਿੱਥੇ ਵਿੰਡੋ ਸਕੇਲ ਕਰਨੀ ਹੈ, ਜਦੋਂ ਕਿ ਕਈ ਆਉਟਪà©à©±à¨Ÿ ਜੰਤਰ ਚà©à¨£à©‡ ਜਾਂਦੇ ਹਨ।" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "ਸਮਾਰਟ" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "ਸਭ ਆਉਟਪà©à©±à¨Ÿ ਜੰਤਰਾਂ ਉੱਤੇ" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "ਫ਼ਰਜ਼ੀ ਜੰਤਰ" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "ਮà©à©œ-ਆਕਾਰ(&s)" #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind ਚੋਣ" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "ਵਿੰਡੋ. ਜੋ ਕਿ ਡਿਫਾਲਟ ਹੀ ਸਥਿਤ ਕੀਤੀ ਜਾਵੇ" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਡਿਫਾਲਟ ਹੀ ਖਾਸ ਵਿਊਪੋਰਟ ਵਿੱਚ ਰੱਖੀ ਜਾਣੀ ਚਾਹੀਦੀ ਹੈ" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind ਚੋਣ" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "ਵਰਕਸਮੂਹ(&W)" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "ਮà©à©œ-ਆਕਾਰ(&s)" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "ਫ਼ਰਜ਼ੀ ਜੰਤਰ" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X ਸਥਿਤੀ ਮà©à©±à¨²" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "ਮà©à©œ-ਆਕਾਰ(&s)" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "ਫ਼ਰਜ਼ੀ ਜੰਤਰ" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y ਸਥਿਤੀ ਮà©à©±à¨²" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png ਚਿੱਤਰ ਲੋਡਰ" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Regex ਮੇਲ ਕਰੋ" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Regex ਵਿੰਡੋ ਮੇਲ ਕਰੋ" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "ਰੰਗ" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "ਬਾਰਡਰ ਰੰਗ, ਜੋ ਕਿ ਆਉਟਲਾਈਨ ਅਤੇ ਚਤà©à¨°à¨­à©à¨œ ਰੀਸਾਇਜ਼ ਮੋਡ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "ਡਿਫਾਲਟ ਰੀਸਾਇਜ਼ ਮੋਡ" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "ਵਿੰਡੋ ਮà©à©œ-ਆਕਾਰ ਕਰਨ ਦੌਰਾਨ ਵਰਤਣ ਲਈ ਡਿਫਾਲਟ ਮੋਡ" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "ਰੰਗ" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "ਚਤà©à¨°à¨­à©à¨œ ਮà©à©œ-ਆਕਾਰ ਮੋਡ ਲਈ ਭਰਨ ਵਾਸਤੇ ਰੰਗ" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "ਸ਼à©à¨°à©‚ਆਤੀ RAM ਡਿਸਕ" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "ਸ਼à©à¨°à©‚ਆਤੀ RAM ਡਿਸਕ" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "ਸ਼à©à¨°à©‚ਆਤੀ RAM ਡਿਸਕ" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "ਸ਼à©à¨°à©‚ਆਤੀ RAM ਡਿਸਕ" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "ਸ਼à©à¨°à©‚ਆਤੀ RAM ਡਿਸਕ" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "ਰੰਗ" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "ਚਤà©à¨°à¨­à©à¨œ" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "ਮà©à©œ-ਆਕਾਰ(&s)" #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "ਖਿੱਚੋ" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਨਾਰਮਲ ਮà©à©œ-ਸਾਈਜ਼ ਲਈ ਵਰਤਣੀ ਹੈ" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਆਉਟਲਾਈਨ ਮà©à©œ-ਸਾਈਜ਼ ਲਈ ਵਰਤਣਾ ਹੈ" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਆਉਟਲਾਈਨ ਮà©à©œ-ਸਾਈਜ਼ ਲਈ ਵਰਤਣਾ ਹੈ" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਮà©à©œ-ਸਾਈਜ਼ ਤਾਣੀ ਜਾਣ ਲਈ ਵਰਤੀ ਜਾਵੇਗੀ" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "ਕੋਨਾ ਫਲਿਪ DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "ਕੋਨਾ ਫਲਿ ਚਾਲ" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "ਕੋਨਾ ਫਲਿਪ ਪà©à¨†à¨‡à©°à¨Ÿà¨°" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "ਮੌਕੇ ਤੇ" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "ਖੱਬੇ ਵੇਖਣ-ਪੋਰਟ ਲਈ ਫਲਿੱਪ ਅਤੇ ਸਮੇਟ ਪà©à¨†à¨‡à©°à¨Ÿà¨°" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "ਅੱਗੇ ਵੇਖੋ-ਪੋਰਟ ਲਈ ਫਲਿਪ ਕਰੋ, ਜਦੋਂ ਕਿ ਡਰੈਗ ਕੀਤਾ ਆਬਜੈਕਟ ਸਕਰੀਨ ਕੋਨੇ ਉੱਤੇ ਜਾਵੇ" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "ਅੱਗੇ ਵੇਖੋ-ਪੋਰਟ ਲਈ ਫਲਿਪ ਕਰੋ, ਜਦੋਂ ਕਿ ਪà©à¨†à¨‡à©°à¨Ÿà¨° ਸਕਰੀਨ ਕੋਨੇ ਉੱਤੇ ਜਾਵੇ" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "ਅੱਗੇ ਵੇਖੋ-ਪੋਰਟ ਲਈ ਫਲਿਪ ਕਰੋ, ਜਦੋਂ ਕਿ ਵਿੰਡੋ ਸਕਰੀਨ ਕੋਨੇ ਉੱਤੇ ਜਾਵੇ" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "ਸੱਜਾ ਵੇਖਣ-ਪੋਰਟ ਲਈ à¨à¨Ÿà¨•à©‹ ਅਤੇ ਪà©à¨†à¨‡à©°à¨Ÿà¨° ਸਮੇਟੋ" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "ਪà©à¨†à¨‡à©°à¨Ÿà¨° ਚਾਲ ਲਈ ਉਲਟ Y ਧà©à¨°à¨¾" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "%1 ਲਈ ਸੂਚਕ" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "ਪਰਿੰਟਰ ਵੇਰਵਾ(&D)" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "ਘà©à©°à¨®à¨¾à¨‰à¨£ ਉੱਤੇ ਉਭਾਰੋ" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "ਜਦੋਂ ਘà©à©°à¨®à¨¾à¨ˆ ਜਾਵੇ ਤਾਂ ਵਿੰਡੋ ਉਭਾਰੋ" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #: ../metadata/rotate.xml.in.h:19 #, fuzzy msgid "Rotate Flip Left" msgstr "ਸੱਜੇ" #: ../metadata/rotate.xml.in.h:20 #, fuzzy msgid "Rotate Flip Right" msgstr "ਸੱਜੇ" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "ਸੱਜੇ" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "ਸੱਜੇ" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D ਪà©à¨°à¨µà©‡à¨¶à¨•:" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "ਜਾਂਚ" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "ਜਾਂਚ" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "ਜਾਂਚ" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "ਪà©à¨†à¨‡à©°à¨Ÿà¨° ਚਾਲ ਲਈ ਸੰਵੇਦਨਸ਼ੀਲਤਾ" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "ਘਣ ਘà©à©°à¨®à¨¾à¨‰à¨£ ਟਾਪ ਫੇਸ ਲਈ ਸਨੈਪ" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ਘਣ ਘà©à©°à¨®à¨¾à¨‰à¨£ ਟਾਪ ਫੇਸ ਲਈ ਸਨੈਪ" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "ਟਾਪ ਫੇਸ ਲਈ ਸਨੈਪ" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ਟਾਪ ਫੇਸ ਲਈ ਸਨੈਪ" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "ਖੋਜ ਸ਼à©à¨°à©‚" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "ਫਲਿਪਿਗ ਵੇਖਣ-ਪੋਰਟ ਤੋਂ ਪਹਿਲਾਂ ਟਾਈਮਆਉਟ" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 #, fuzzy msgid "Zoom" msgstr "ਲਾਗਆਉਟ" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "ਫੀਸਦੀ ਵਿੱਚ ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨ ਮਾਤਰਾ" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "ਵੱਡਾ" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "ਡੈਸਕਟਾਪ ਵੇਖਣ ਲਈ ਡੈਸਕਟਾਪ ਕਲਿੱਕ ਕਰੋ" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "ਪਿੱਠਭੂਮੀ" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "ਬੈਕਗਰਾਊਂਡ ਗੂੜà©à¨¹à¨¾à¨ªà¨¨, ਜਦੋਂ ਵਿੰਡੋ ਸਕੇਲ ਕੀਤੀ ਜਾਵੇ" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "ਨਿਸ਼ਾਨ" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "ਜਦੋਂ ਸਕੇਲ ਦੌਰਾਨ ਡੈਸਕਟਾਪ ਕਲਿੱਕ ਕੀਤਾ ਜਾਵੇ ਤਾਂ ਡੈਸਕਟਾਪ ਵੇਖੋ ਮੋਡ ਦਿਓ" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ਹੋਵਰ ਟਾਈਮ" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "ਸ਼à©à¨°à©‚ਆਤੀ RAM ਡਿਸਕ" #: ../metadata/scale.xml.in.h:15 #, fuzzy msgid "Initiate Window Picker For All Windows" msgstr "ਸ਼à©à¨°à©‚ਆਤੀ RAM ਡਿਸਕ" #: ../metadata/scale.xml.in.h:16 #, fuzzy msgid "Initiate Window Picker For Window Group" msgstr "ਸ਼à©à¨°à©‚ਆਤੀ RAM ਡਿਸਕ" #: ../metadata/scale.xml.in.h:17 #, fuzzy msgid "Initiate Window Picker For Windows on Current Output" msgstr "ਸ਼à©à¨°à©‚ਆਤੀ RAM ਡਿਸਕ" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "ਲੇਆਉਟ ਅਤੇ ਸਭ ਵਿੰਡੋਜ਼ ਲਈ ਟਰਾਸਫਰਮੇਸ਼ਨ ਸ਼à©à¨°à©‚ ਕਰੋ" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "ਲੇਆਉਟ ਅਤੇ ਵਿੰਡੋ ਲਈ ਟਰਾਸਫਰਮੇਸ਼ਨ ਸ਼à©à¨°à©‚ ਕਰੋ" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "ਵਿੰਡੋ ਲੇਆਉਟ ਅਤੇ ਟਰਾਂਸਫਰਮੇਸ਼ਨ ਸਟਾਰਟ" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "ਮੌਜੂਦਾ ਆਉਟਪà©à©±à¨Ÿ ਉੱਤੇ ਲੇਆਉਟ ਅਤੇ ਸਭ ਵਿੰਡੋਜ਼ ਲਈ ਟਰਾਸਫਰਮੇਸ਼ਨ ਸ਼à©à¨°à©‚ ਕਰੋ" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "ਸਭ ਆਉਟਪà©à©±à¨Ÿ ਜੰਤਰਾਂ ਉੱਤੇ" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "ਮੌਜੂਦਾ ਆਉਟਪà©à©±à¨Ÿ ਜੰਤਰ ਉੱਤੇ" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ਓਵਰਲੇ ਆਈਕਾਨ" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "ਵਿੰਡੋ ਉੱਤੇ ਇੱਕ ਆਈਕਾਨ ਰੱਖੋ, ਜਦੋਂ ਉਹ ਸਕੇਲ ਕੀਤੇ ਜਾਣ" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "ਸੰਭਾਲੋ" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "ਸਥਾਨਕ ਸਮਾਂ" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "ਸਥਾਨਕ ਸਮਾਂ" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "ਚà©à¨£à©‹, ਜਿੱਥੇ ਵਿੰਡੋ ਸਕੇਲ ਕਰਨੀ ਹੈ, ਜਦੋਂ ਕਿ ਕਈ ਆਉਟਪà©à©±à¨Ÿ ਜੰਤਰ ਚà©à¨£à©‡ ਜਾਂਦੇ ਹਨ।" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "ਸਪੇਨ" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "ਸਕੇਲ ਮੋਡ ਖਤਮ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਟਾਈਮ (ms ਵਿੱਚ), ਜਦੋਂ ਕਿ ਹੋਵਰ ਵਿੰਡੋ ਉੱਤੇ ਹੋਵੇ" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "ਵਿੰਡੋਜ਼, ਜੋ ਕਿ ਸਕੇਲ ਮੋਡ 'ਚ ਸਕੇਲ ਕਰਨੀਆਂ ਹਨ" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "ਇਹ à¨à¨ªà¨²à©€à¨•ੇਸ਼ਨ ਵਿੱਚ ਆਟੋਮੈਟਿਕ ਹੀ ਸਕਰੀਨਸ਼ਾਟ ਖੋਲà©à¨¹à©‹" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "ਡਾਇਰੈਕਟਰੀ\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Init" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "ਇੱਕ ਕਾਰਜ ਚਲਾਓ" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "ਇਹ ਡਾਇਰੈਕਟਰੀ ਵਿੱਚ ਸਕਰੀਨ-ਸ਼ਾਟ ਚਿੱਤਰ ਰੱਖੋ" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "ਸਕਰੀਨ" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "ਕਮਾਂਡ ਲਾਇਨ ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ।" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg ਚਿੱਤਰ ਲੋਡਰ" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "ਫੀਸਦੀ ਵਿੱਚ ਚਮਕ ਦੀ ਮਾਤਰਾ" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "ਫੀਸਦੀ ਵਿੱਚ ਸੰਤà©à¨°à¨¿à¨ªà¨¤à¨¾ ਦੀ ਮਾਤਰਾ" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "ਕਾਰਜ ਕਰਮ" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "ਸਵੈ-ਚਾਲਤ" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "ਬੂਟ ਦੌਰਾਨ" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "ਚà©à¨£à©€ ਵਿੰਡੋ ਅੱਗੇ ਲਿਆਵੋ" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "ਜਦੋਂ ਵਿੰਡੋ ਨੂੰ ਸਵਿੱਚ ਕੀਤਾ ਜਾਵੇ ਤਾਂ ਦੂਰੀ ਡੈਸਕਟਾਪ ਨੂੰ ਜ਼ੂਮ ਆਉਟ ਕੀਤਾ ਜਾਵੇਗਾ" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "ਆਈਕਾਨ" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "ਵੇਹੜਾ" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "ਪੋਪਅੱਪ ਸਵਿੱਚ, ਜੇ ਨਾ ਦਿੱਸੇ ਅਤੇ ਅਗਲੀ ਵਿੰਡੋ ਚà©à¨£à©‹" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "ਪੋਪ-ਅੱਪ ਸਵਿੱਚਰ, ਜੇ ਉਪਲੱਬਧ ਨਾ ਹੋਵੇ ਅਤੇ ਸਭ ਵਿੰਡੋ ਵਿੱਚੋਂ ਅਗਲੀ ਵਿੰਡੋ ਚà©à¨£à©‹" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "ਪੋਪਅੱਪ ਸਵਿੱਚਰ, ਜੇ ਉਪਲੱਬਧ ਨਾ ਹੋਵੇ ਅਤੇ ਪਿਛਲੀ ਵਿੰਡੋ ਚà©à¨£à©‡" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "ਪੋਪਅੱਪ ਸਵਿੱਚਰ, ਜੇ ਉਪਲੱਬਧ ਨਾ ਹੋਵੇ ਅਤੇ ਸਭ ਵਿੰਡੋ ਵਿੱਚੋਂ ਪਿਛਲੀ ਚà©à¨£à©‡" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "ਪਿਛਲਾ ਕਰਨਲ" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Windows" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "ਚà©à¨£à©€ ਵਿੰਡੋ ਨੂੰ ਘà©à©°à¨®à¨¾à¨“, ਜਦੋਂ ਕਿ ਸਵਿੱਚ ਕਰਨਾ ਹੋਵੇ" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Win&dows ਹਟਾਓ" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "ਪੋਪਅੱਪ ਵਿੰਡੋ ਵੇਖਾਠਬਿਨਾਂ ਹੀ ਅਗਲੀ ਵਿੰਡੋ ਚà©à¨£à©‹" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "ਪੋਪਅੱਪ ਵਿੰਡੋ ਵੇਖਾਠਬਿਨਾਂ ਹੀ ਪਿਛਲੀ ਵਿੰਡੋ ਚà©à¨£à©‹" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "ਥੰਮਨੇਲ ਲਈ ਅੱਗੇ ਆਈਕਾਨ ਵੇਖੋ" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "ਸਥਾਨਕ ਸਮਾਂ" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "ਸਥਾਨਕ ਸਮਾਂ" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਸਵਿੱਚਰ ਵਿੱਚ ਵੇਖਾਈਆਂ ਜਾਣ" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 ਕਲਰਸਪੇਸ ਸਹਿਯੋਗ ਦਿੰਦੀ ਹੈ" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "ਵੀਡਿਓ ਪਲੇਅਬੈਕ" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "ਵੀਡਿਓ ਪਲੇਅਬੈਕ" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 ਕਲਰਸਪੇਸ/" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "ਸਬੰਧ ਸ਼ਾਮਲ(&A)" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "ਸੰਪਰਕ ਸ਼ਾਮਿਲ" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "ਵੱਖ ਵੱਖ ਡੈਸਕਟਾਪ à¨à¨•ਸ਼ਨਾਂ ਲਈ ਪਾਣੀ ਪਰਭਾਵ ਸ਼ਾਮਲ ਕਰੋ" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "ਹਰੇਕ ਕਣੀ ਵਿੱਚ ਅੰਤਰ (ਮਿਲੀਸਕਿੰਟ ਵਿੱਚ)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "ਪà©à¨†à¨‡à©°à¨Ÿà¨° ਪਾਣੀ ਪਰਭਾਵ ਯੋਗ ਕਰੋ" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "ਲਾਈਨ" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "ਆਫਸੈੱਟ ਸਕੇਲ" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "ਬਿੰਦੂ" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "ਵਕਫਾ" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "ਟਾਇਟਲ ਵੇਵ" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "ਟੋਕਨ ਰਿੰਗ" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "ਟੋਕਨ ਰਿੰਗ" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "ਟੋਕਨ ਰਿੰਗ" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "ਟੋਕਨ ਰਿੰਗ" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "ਪਾਣੀ ਪਰਭਾਵ" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "ਪਾਣੀ ਆਫਸੈੱਟ ਸਕੇਲ" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "ਵਿੰਡੋ ਟਾਇਟਲ ਤੋਂ ਵੇਵ ਪਰਭਾਵ" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "ਫੋਕਸ ਪਰਭਾਵ" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "ਕਾਰਵਾਈ" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "ਰੈਜ਼ੋਲੇਸ਼ਨ" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "ਉਲਟ ਵਿੰਡੋ ਸਨੈਪਿੰਗ" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "ਵੱਧ-ਤੋਂ-ਵੱਧ ਅਕਰ" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "ਵੱਧ-ਤੋਂ-ਵੱਧ ਅਕਰ" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "ਹੇਠਾਂ ਜਾਓ(&D)" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "ਡਰਾਇਵਰ" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "ਉਲਟ ਕੀਤਾ ਸਨੈਪ" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "ਕਾਰਵਾਈ" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "ਸਟੀਪਿੰਗ" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "ਸਟੀਪਿੰਗ" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "à¨à©‚ਲਣ ਵਿੰਡੋ ਪਰਭਾਵ ਲਈ ਸਪਰਿੰਗ ਮਾਡਲ ਵਰਤੋਂ" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "ਸਰਵਰ ਰੈਜ਼ੋਲੂਸ਼ਨ" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "ਵਿੰਡੋ, ਜੋ ਫੋਕਸ ਹੋਣ ਦੇ ਦੌਰਾਨ ਵੋਬਲ ਕਰੋ" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਲੈਣ ਦੇ ਦੌਰਾਨ ਵੋਬਲ ਹੋਵੇ" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਮੈਪ ਕਰਨ ਦੇ ਦੌਰਾਨ ਵੋਬਲ ਹੋਵੇ" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਭੇਜਣ ਦੇ ਦੌਰਾਨ ਵੋਬਲ ਹੋਵੇ" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "ਜਦੋਂ ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਅਤੇ ਅਣ-ਵੱਧੋ-ਵੱਧ ਹੋਵੇ ਤਾਂ à¨à©‚ਲੇ ਪਰਭਾਵ" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Windows" #, fuzzy #~ msgid "Command line 0" #~ msgstr "ਕਮਾਂਡ: " #, fuzzy #~ msgid "Run command 0" #~ msgstr "ਕਮਾਂਡ '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "ਕਮਾਂਡ ਲਾਇਨ ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ।" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "ਕਮਾਂਡ ਲਾਇਨ ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ।" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "ਫਿਲਟਰ:" #~ msgid "Use linear filter when zoomed in" #~ msgstr "ਜ਼ੂਮ ਇਨ ਕਰਨ ਦੇ ਦੌਰਾਨ ਲੀਨੀਅਰ ਫਿਲਟਰ ਵਰਤੋਂ" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "ਵੇਹੜਾ" #, fuzzy #~ msgid "Zoom In" #~ msgstr "ਲਾਗਆਉਟ" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "ਲਾਗਆਉਟ" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "ਲਾਗਆਉਟ" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "ਚà©à¨£à©‡" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "ਜਾਂਚ" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ਜ਼ੂਮ ਅਤੇ ਪੈਨ ਡੈਸਕਟਾਪ ਘਣ" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "ਲਾਗਆਉਟ" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "ਲਾਗਆਉਟ" #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "Win&dows ਭਾਗ ਹਟਾਓ" #~ msgid "Increase window opacity" #~ msgstr "ਵਿੰਡੋ ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨ ਵਧਾਓ" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "ਵਿੰਡੋਜ਼ ਲਈ ਧà©à©°à¨¦à¨²à©‡à¨ªà¨¨ ਮà©à©±à¨², ਜੋ ਕਿ ਡਿਫਾਲਟ ਹੀ ਅਲਪ-ਪਾਰਦਰਸ਼ੀ ਹੋਵੇ" #~ msgid "Opacity window values" #~ msgstr "ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨ ਵਿੰਡੋ ਮà©à©±à¨²" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "Win&dows ਹਟਾਓ" #~ msgid "Background Images" #~ msgstr "ਬੈਕਗਰਾਊਂਡ ਚਿੱਤਰ" #~ msgid "Background images" #~ msgstr "ਬੈਕਗਰਾਊਂਡ ਚਿੱਤਰ" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Win&dows ਹਟਾਓ" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Win&dows ਹਟਾਓ" #, fuzzy #~ msgid "Plane Left" #~ msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #, fuzzy #~ msgid "Plane Right" #~ msgstr "ਸੱਜੇ" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Win&dows ਹਟਾਓ" #, fuzzy #~ msgid "Plane down" #~ msgstr "Win&dows ਹਟਾਓ" #, fuzzy #~ msgid "Plane left" #~ msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #, fuzzy #~ msgid "Plane right" #~ msgstr "ਸੱਜੇ" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane up" #~ msgstr "Win&dows ਹਟਾਓ" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ਡੈਸਕਟਾਪ ਵਿੰਡੋ ਧà©à©°à¨¦à¨²à¨¾à¨ªà¨¨ ਫੇਡ ਟਾਈਮ ਹੈ।" #, fuzzy #~ msgid "Toolbar" #~ msgstr "ਸੰਦ" #~ msgid "Menu" #~ msgstr "ਮੇਨੂ" #, fuzzy #~ msgid "Utility" #~ msgstr "ਸਹੂਲਤ ਡਿਸਕ..." #, fuzzy #~ msgid "Dialog" #~ msgstr "ਟੋਨ ਡਾਇਲ(&T)" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "à¨à¨°à©‹à¨–ਾ ਪਰਬੰਧਕ" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "ਮੇਨੂ" #, fuzzy #~ msgid "Tooltip" #~ msgstr "ਸੰਦ" #, fuzzy #~ msgid "Notification" #~ msgstr "ਕਾਰਵਾਈ" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "ਟੱਚ-ਸਕਰੀਨ" #~ msgid "Unknown" #~ msgstr "ਅਣਜਾਣ" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "ਅੰਤਰਾਲ" #, fuzzy #~ msgid "Do not modify" #~ msgstr "ਕੋਈ ਲਾਗ ਨਾ ਕਰੋ" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "ਅਰਧ-ਵਿਆਸ" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D ਪਰਵੇਸ਼ਕ:" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D ਪਰਵੇਸ਼ਕ:" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "ਜਾਂਚ" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "ਰੂਸੀ ਸੰਘ" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "ਰੂਸੀ" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Windows" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Window&s ਸਮੇਟੋ" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Window&s ਸਮੇਟੋ" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "ਵੱਧ-ਤੋਂ-ਵੱਧ ਅਕਰ" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "ਵੇਹੜਾ" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "ਉਸਟਾਨ (ਪੋਸਟ 1500)" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D ਪਰਵੇਸ਼ਕ:" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "ਜਾਂਚ" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "ਸਥਾਨਕ ਸਮਾਂ" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "ਸਥਾਨਕ ਸਮਾਂ" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Win&dows ਹਟਾਓ" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "ਕਾਰਵਾਈ" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ਸਟੀਪਿੰਗ" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "ਫਿਲਟਰ ਸੈਟ(&S)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "ਸਰਵਰ ਰੈਜ਼ੋਲੂਸ਼ਨ" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "ਚà©à¨£à©‡" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "ਜਾਂਚ" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "ਲਾਗਆਉਟ" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "ਸਕਰੀਨ ਘà©à©°à¨®à¨¾à¨“" #, fuzzy #~ msgid "Command line %d" #~ msgstr "ਕਮਾਂਡ: " #, fuzzy #~ msgid "Run command %d" #~ msgstr "ਕਮਾਂਡ: " #, fuzzy #~ msgid "Move Window Types" #~ msgstr "ਉਪਲੱਬਧਕਰਤਾ ਕਿਸਮ" #, fuzzy #~ msgid "Corners" #~ msgstr "ਕੋਰਨਿਸ਼" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "ਫਲਾਪੀ ਡਿਸਕ" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #, fuzzy #~ msgid "Terminate" #~ msgstr "ਟਰਮੀਨਲ" compiz-0.9.11+14.04.20140409/po/tr.po0000644000015301777760000027506612321343002017115 0ustar pbusernogroup00000000000000# translation of compiz.po to # translation of compiz-new.po to # Turkish message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # # Görkem Çetin , 1999, 2000. # Mehmet Mıdık , 2000. # Metin Oral , 2001. # Serdar Soytetir , 2007. msgid "" msgstr "" "Project-Id-Version: compiz-new\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2008-10-28 17:44+0100\n" "Last-Translator: Emre KURNAZ \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 1.1.0\n" # clients/inst_sw_single.ycp:146 #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Masaüstü" # clients/inst_sw_single.ycp:188 #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Pencere Yönetimi" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Hiçbiri" # menuentries/menuentry_scanner.ycp:36 #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Gölgelendir" # clients/inst_target_part.ycp:387 #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Büyüt" # clients/inst_target_part.ycp:387 #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Pencereyi Yatay Olarak Büyüt" # clients/inst_target_part.ycp:387 #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Pencereyi Dikey Olarak Büyüt" # clients/inst_target_part.ycp:387 #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Küçültülmüş" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Otomatik-Yükselt" #: ../gtk/gnome/compiz-window-manager.c:433 #, fuzzy msgid "Lower" msgstr "Düşük" # clients/inst_sw_single.ycp:188 #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Pencere Menüsü" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Bir pencerenin baÅŸlık çubuÄŸu üzerinde fare tekeri ile yaptırılacak davranış." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "BulanıklaÅŸtırma tipi" # include/partitioning/auto_part_ui.ycp:147 #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Metacity teması etkin pencere matlığı" # include/partitioning/auto_part_ui.ycp:147 #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity teması etkin pencere matlık gölgesi" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity teması matlığı" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity teması matlık gölgesi" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Etkin pencereler ve Metacity tema dekorasyonları için kullanılacak matlık" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Metacity dekorasyonları için kullanılacak matlık" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Etkin pencereleri metacity dekorasyonu ile matlıktan ÅŸeffaflığa doÄŸru gölgele" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Pencereleri metacity dekorasyonu ile matlıktan ÅŸeffaflığa doÄŸru gölgele" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "BaÅŸlık çubuÄŸu fare tekeri davranışı" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Pencere dekorasyonları için kullanılacak bulanıklaÅŸtırma tipi" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Metacity teması kullan" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Pencere dekorasyonlarını oluÅŸtururken metacity temasını kullan" # clients/inst_target_part.ycp:404 #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Pencereyi Kapat" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Pencereyi Büyütme" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Pencereyi Büyüt" # clients/inst_target_part.ycp:387 #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Pencereyi Küçült" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Üstte Göster" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Yapıştır" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Gölgelendirme" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Üstte Gösterme" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Yapıştırma" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Pencere \"%s\" yanıt vermiyor." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Bu uygulamayı kapatmaya zorlamak, kaydetmediÄŸiniz deÄŸiÅŸiklikleri " "kaybetmenize neden olacaktır." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Kapatmaya Zorla" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Notlar" # include/security/ui.ycp:774 #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Not Dolgu Rengi" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Not Vurgu Rengi" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Not eklentisi" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Temizle" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Çiz" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Çizmek için kullanılacak araç" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Notlar için dolgu rengi" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "BaÅŸla" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Not çizmeye baÅŸla" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Not silmeye baÅŸla" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Silmeye baÅŸla" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Satır geniÅŸliÄŸi" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Notlar için satır geniÅŸliÄŸi" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Notlar için vurgulama rengi" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Vurgu geniÅŸliÄŸi" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Notlar için vurgu geniÅŸliÄŸi" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4 kat Çift DoÄŸrusal" # clients/inst_target_part.ycp:404 #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alpha BulanıklaÅŸtırma" # clients/inst_target_part.ycp:404 #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Pencereleri alpha kanalı ile bulanıklaÅŸtır" # include/tv/ui.ycp:493 #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "BulanıklaÅŸtırma Filtresi" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "BulanıklaÅŸtırma Emilimi" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "BulanıklaÅŸtırma DoygunluÄŸu" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "BulanıklaÅŸtırma Hızı" # clients/inst_target_part.ycp:404 #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Pencereleri BulanıklaÅŸtır" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Pencerelerin saydam kısımlarının arkasını bulanıklaÅŸtır" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "BulanıklaÅŸtırma doygunluÄŸu" # clients/inst_target_part.ycp:404 #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Pencereleri bulanıklaÅŸtır" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Odaklanmamış pencereleri bulanıklaÅŸtır" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "DiÄŸer pencereler tarafından örtülen ekran bölgelerini bulanıklaÅŸtırma" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "BulanıklaÅŸtırma iÅŸlemi için kullanılacak filtre" # clients/inst_target_part.ycp:404 #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Odaklama BulanıklaÅŸtırması" # clients/inst_target_part.ycp:404 #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Odaklanan pencereleri bulanıklaÅŸtır" # RU #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussian" # RU #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gaussian Yarıçapı" # /usr/lib/YaST2/keyboard_raw.ycp:638 #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gaussian SertliÄŸi" # RU #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Gaussian yarıçapı" # /usr/lib/YaST2/keyboard_raw.ycp:638 #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gaussian sertliÄŸi" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Bağımsız doku getirmek" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap ayrıntı-düzeyi" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Darbe" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Darbe efekti" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Mümkün olduÄŸunca çok bağımsız doku getirisi saÄŸlamak için, müsait olan doku " "birimlerini kullan." # clients/inst_resize_ui.ycp:597 #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Pencere bulanıklaÅŸtırma hızı" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Odaklama bulanıklaÅŸtırmasından etkilenecek pencereler" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Öntanımlı olarak alpha bulanıklaÅŸtırması kullanan pencereler" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Çıktı İkilemesi" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "İkileme seçimini baÅŸlat" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Çıktı ikilemesi saÄŸlayıcı" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "TetiklendiÄŸinde komut0 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "TetiklendiÄŸinde komut1 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "TetiklendiÄŸinde komut10 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "TetiklendiÄŸinde komut11 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "TetiklendiÄŸinde komut2 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "TetiklendiÄŸinde komut3 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "TetiklendiÄŸinde komut4 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "TetiklendiÄŸinde komut5 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "TetiklendiÄŸinde komut6 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "TetiklendiÄŸinde komut7 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "TetiklendiÄŸinde komut8 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "TetiklendiÄŸinde komut9 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "TetiklendiÄŸinde komut0 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "TetiklendiÄŸinde komut1 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "TetiklendiÄŸinde komut10 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "TetiklendiÄŸinde komut11 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "TetiklendiÄŸinde komut2 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "TetiklendiÄŸinde komut3 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "TetiklendiÄŸinde komut4 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "TetiklendiÄŸinde komut5 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "TetiklendiÄŸinde komut6 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "TetiklendiÄŸinde komut7 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "TetiklendiÄŸinde komut8 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "TetiklendiÄŸinde komut9 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "TetiklendiÄŸinde komut0 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "TetiklendiÄŸinde komut1 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "TetiklendiÄŸinde komut10 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "TetiklendiÄŸinde komut11 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "TetiklendiÄŸinde komut2 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "TetiklendiÄŸinde komut3 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "TetiklendiÄŸinde komut4 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "TetiklendiÄŸinde komut5 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "TetiklendiÄŸinde komut6 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "TetiklendiÄŸinde komut7 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "TetiklendiÄŸinde komut8 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "TetiklendiÄŸinde komut9 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleÅŸimi" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" # Kastedileni tam olarak anlayamadım. (drake) #: ../metadata/commands.xml.in.h:38 #, fuzzy msgid "Button Bindings" msgstr "Ölçeklendirme Kipine Geçen Düğme BaÄŸlayıcıları" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "1. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "10. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "11. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "1. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "2. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "3. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "4. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "5. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "6. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "7. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "8. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "9. komut satırı" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Komut0_çalıştır çaÄŸrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Komut1_çalıştır çaÄŸrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Komut10_çalıştır çaÄŸrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Komut11_çalıştır çaÄŸrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Komut2_çalıştır çaÄŸrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Komut3_çalıştır çaÄŸrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Komut4_çalıştır çaÄŸrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Komut5_çalıştır çaÄŸrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Komut6_çalıştır çaÄŸrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Komut7_çalıştır çaÄŸrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Komut8_çalıştır çaÄŸrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Komut9_çalıştır çaÄŸrıldığında kabukta çalıştırılacak komut" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Komut" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "1. komutu çalıştır" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "10. komutu çalıştır" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "11. komutu çalıştır" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "1. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "2. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "3. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "4. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "5. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "6. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "7. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "8. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "9. komutu çalıştır" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Etkin Eklentiler" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Pencere dışındaki gözek haritalarına yönlendirilmemeleri için tam ekran " "pencerelerini germeye izin ver" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "İşitilebilir Zil" # include/partitioning/custom_part_dialogs.ycp:288 #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "İşitilebilir sistem bip sesi" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Otomatik-Yükselt" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Otomatik-Yükselme Gecikmesi" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Çıktı aygıtlarını otomatik bul" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Tazeleme oranını otomatik bul" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "En iyi" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Odaklamak için Tıkla" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Pencereyi odaklamaya almak için tıkla" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Etkin pencereyi kapat" # include/tv/ui.ycp:398 #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Öntanımlı Simge" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Öntanımlı pencere simge resmi" # clients/inst_sw_single.ycp:146 #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Masaüstü Küpü" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Çıktıları Bul" # clients/inst_sw_single.ycp:1620 #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Tazeleme Oranını Bul" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Kenar Tetikleme Gecikmesi" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Hızlı" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Odaklanma Önleyici Seviyesi" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Odaklanma Önleyici Pencereleri" # include/nis_server/io.ycp:465 #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Odaklanma önleyici pencereleri" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Bağımsız çıkış boyamasına zorla" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Genel Seçenekler" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Genel compiz seçenekleri" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "İyi" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Görev ÇubuÄŸu Pencerelerini Atlamayı Gizle" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Tüm pencereleri gizle ve masaüstünü odakla" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Masaüstünü Göster Kipine geçerken görev çubuÄŸunda olmayan pencereleri gizle" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Yüksek" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Yatay Sanal Boyut" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "EÄŸer mümkünse, görüntülerden dönüştürülmüş dokular için sıkıştırma kullan" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Büyütülünce ipuçlarını yoksay" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Pencere büyütülmüşse boyut büyütmeyi ve ipuçlarını pasifleÅŸtir" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Seçilen pencerelerin yükseltilmesinden önce geçecek süre" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Ping mesajları arasında geçecek süre" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Odaklanma çalınmasının önlenme seviyesi" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Aydınlatma" # include/scanner/scanner_functions.ycp:218 #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Algılanan eklentilerin listesi" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Çıktı aygıtlarını tanımlayan sözcüklerin listesi" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Düşük" # clients/inst_resize_ui.ycp:688 #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Pencereyi Alta Gönder" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Pencereyi diÄŸer pencerelerin altına gönder" # clients/inst_target_part.ycp:387 #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Pencereyi Yatay Olarak Büyüt" # clients/inst_target_part.ycp:387 #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Pencereyi Dikey Olarak Büyüt" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Etkin pencereyi büyüt" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Etkin pencereyi yatay olarak büyüt" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Etkin pencereyi dikey olarak büyüt" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Etkin pencereyi küçült" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" # clients/inst_sw_single.ycp:146 #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Masaüstü Sayısı" # clients/inst_sw_single.ycp:146 #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Sanal masaüstü sayısı" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Kapalı" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Ekran güncellemeyi sadece dikey boÅŸaltma sürecinde yap" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Çıktılar" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Örtüşen Çıktı İşlemesi" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Çıktı aygıtları birbiriyle örtüşse dahi her çıktı aygıtını bağımsız olarak " "boya" # clients/hwinfo.ycp:71 #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping Gecikmesi" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Daha büyük çıktıyı tercih et" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Daha küçük çıktıyı tercih et" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Tıklayınca Yükselt" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Pencereyi Yükselt" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Süre bittiÄŸinde seçilen pencereleri yükselt" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Pencereyi diÄŸer pencerelerin üzerine yükselt" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Tıklayınca pencereleri yükselt" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Tazeleme Oranı" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Yatay sanal boyut için ekran boyutu çoklayıcı" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Dikey sanal boyut için ekran boyutu çoklayıcı" # clients/inst_sw_single.ycp:146 #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Masaüstünü Göster" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "YavaÅŸ Animasyonlar" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Akıllı kip" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Dikey BoÅŸaltma ile EÅŸzamanla" # include/tv/ui.ycp:493 #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Doku Sıkıştırma" # include/tv/ui.ycp:493 #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Doku Filtresi" # include/tv/ui.ycp:493 #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Doku filtreleme" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Ekranın yeniden çizilmesinde kullanılacak oran (tekrar sayısı/saniye)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Pencereyi Büyüt / Küçült" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Pencereyi Yatay Olarak Büyüt / Küçült" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Pencereyi Dikey Olarak Büyüt / Küçült" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Pencereyi Gölgele / Geri Yükle" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Etkin pencereyi büyüt / geri yükle" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Etkin pencereyi yatay olarak büyüt / geri yükle" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Etkin pencereyi dikey olarak büyüt / geri yükle" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Etkin pencereyi gölgele / geri yükle" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "YavaÅŸ canlandırmaları aç / kapat" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Etkin pencereyi büyütme" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Tam Ekran Pencerelerin Yönlendirmesini Geri Al" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Ekran boyutu deÄŸiÅŸtirildiÄŸinde geçirgenlik ışığı kullan" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Dikey Sanal Boyut" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Çok Yüksek" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Üst üste binen çıktı aygıtlarından hangisi tercih edilmeli" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Pencere menüsü düğme baÄŸlayıcısı" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Pencere menüsü kısayol baÄŸlayıcısı" # include/x11/resolution_dialog.ycp:81 #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Hızlandırma" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Resmi Ayarla" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Üst kapak resmini döndürmeye göre ayarla" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Sonraki slayta ilerle" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Arkaplanı Canlandır" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Küpü döndürürken arkaplanı canlandır" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Otomatik" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Küpün taban ve tavan rengi" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Gök kubbe-geri düşüş-eÄŸiminin alttaki renk-durağında kullanılacak renk" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Gök kubbe-geri düşüş-eÄŸiminin üstteki renk-durağında kullanılacak renk" # include/security/ui.ycp:774 #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Küp Rengi" # include/security/ui.ycp:774 #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Küp Rengi" # clients/inst_sw_single.ycp:146 #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Masaüstü Küpü" # include/x11/resolution_dialog.ycp:81 #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Katlama Hızlandırması" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Katlama Hızı" # classnames.ycp:73 #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Katlama Zaman Aralığı" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Yüksek kalitede ölçeklendirme için mümkün olduÄŸunda mipmapler oluÅŸtur" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Önceki slayta geri dön" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Resim dosyaları" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Arkaplan dokusu olarak kullanılacak resim" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Küp ÅŸeffaflığını sadece döndürme iÅŸlemi fare ile yapılıyorsa baÅŸlatır." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Küpün İçerisine Gir" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Küpün içerisine gir" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Küpün üst kapağı için hazırlanması gereken PNG ve SVG dosyalarının listesi" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Çoklu Çıktı Kipi" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Çoklu küp" # clients/inst_sw_single.ycp:1623 #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Sonraki Slayt" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Tek büyük küp" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Döndürme Sırasındaki Matlık" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Döndürülmezken Kullanılan Matlık" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Döndürme sırasında masaüstü penceresinin matlığı." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "DöndürülmediÄŸi esnada masaüstü penceresinin matlığı." # clients/inst_target_part.ycp:404 #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Pencereleri küp üzerine yerleÅŸtir" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Önceki Slayt" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Arkaplanı hazırla" # clients/inst_environment.ycp:306 #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Resmi boyutlandır" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Küpün tavan yüzünü kaplamak için resimleri boyutlandır" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Çoklu çıktı aygıtı kullanılırken küpün nasıl gösterileceÄŸini seçer." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Arkaplan" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Arkaplan Gradyan Bitim Rengi" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Arkaplan Gradyan BaÅŸlangıç Rengi" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Arkaplan Resmi" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Hız" # classnames.ycp:73 #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Süre aralığı" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Sadece Fare ile Döndürüldüğünde ÅžeffaflaÅŸtır" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Katlamayı Geri Al" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Küpü Katlamayı Geri Al" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus Denetim Altyapısı" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Dekorasyon dokuları için mipmaplerin yaratılmalarına izin ver" # clients/support_registration.ycp:66 #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Komut" # clients/inst_target_part.ycp:404 #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Pencere dekorasyonu" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "EÄŸer hiçbir pencere dekorasyonu çalışmıyorsa çalıştırılacak dekoratör komut " "satırı" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Düşen gölge Yatay konumu" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Düşen gölge Dikey konumu" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Düşen gölge rengi" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Düşen gölge matlığı" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Düşen gölge yarıçapı" # clients/inst_target_part.ycp:387 #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Gölge Rengi" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Gölge Konumu X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Gölge Konumu Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Gölge Matlığı" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Gölge Yarıçapı" # clients/inst_target_part.ycp:387 #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Pencereleri gölgelendir" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Pencere Dekorasyonu" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Pencere dekorasyonları" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Dekorasyon kullanılması gereken pencereler" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Gölge kullanılması gereken pencereler" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" # classnames.ycp:73 #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Döndürme Hızı" # include/ui/common_messages.ycp:23 #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Dikey (Y) Sınırlama" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Tepki Vermeyen Pencreleri DonuklaÅŸtır" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Pencere yöneticisinin isteklerine yanıt vermeyen pencereleri donuklaÅŸtır" # clients/online_update.ycp:223 #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Solma Kipi" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Küçültme /Açma /Kapatma durumunda Solsun" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Solma Hızı" # clients/online_update.ycp:223 #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Solma Süresi" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Küçültme /açma /kapatma olayarında solma efekti kullan" # include/partitioning/custom_part_dialogs.ycp:288 #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Sistem bip sesinde solma efekti açık" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Haritalandıklarında pencereler belirsin, haritalanmadıklarında kaybolsun" # clients/inst_target_part.ycp:404 #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Pencereleri soldur" # clients/inst_target_part.ycp:387 #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Solan Pencereler" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Tam Ekran Görünür Zil" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Sistem bip durumunda tam ekran solma efektini uygula" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Tepki vermeyen pencerelerin doygunluÄŸu (in %)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Tepki Vermeyen Pencere Parlaklığı" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Tepki Vermeyen Pencere DoygunluÄŸu" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Görünür Zil" # clients/inst_resize_ui.ycp:597 #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Pencere solma kipi" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Boyutlandırma kipinde boyutlandırılacak pencereler" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Solması gereken pencereler" # clients/inst_custom_part.ycp:2928 #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "BaÄŸlanma Noktası" # clients/inst_custom_part.ycp:2928 #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "BaÄŸlanma noktası" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Kullanıcı Alanı Dosya Sistemi" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Kullanıcıya ait dosya sistemi" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf Denetim Arka Ucu" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib ana döngü desteÄŸi" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Bir konsol aç" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Çalıştırma Penceresi" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Uçbirim komut satırı" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Ekran görüntüsü komut satırı" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Ana Menüyü Göster" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Uygulama Çalıştırma Penceresini Göster" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Ana menüyü göster" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Ekran görüntüsü al" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Bir pencerenin ekran görüntüsünü al" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Uçbirim komut satırı" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Pencere ekran görüntüsü alma komutu" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini Düz Dosya Arka Ucu" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Dosya deÄŸiÅŸimi uyarı eklentisi" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig Denetim Arka Ucu" # clients/inst_target_part.ycp:387 #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Küçültme Efekti" # clients/inst_target_part.ycp:387 #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Pencereleri Küçült" # clients/inst_target_part.ycp:387 #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Küçültme Hızı" # clients/inst_target_part.ycp:387 #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Küçültme zaman aralığı" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Gölgeleme Direnci" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Gölgeleme direnci" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Pencereleri küçültüldüklerinde ve geri yüklendiklerinde dönüştür" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Küçültüldüklerinde ve geri yüklendiklerinde dönüştürülecek pencereler" # include/ui/common_messages.ycp:23 #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Dikey (Y) Sınırlama" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Y eksenini çalışma alanı ile sınırla" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Taşıma iÅŸi bitirilene kadar pencerenin konumunu sunucu tarafında güncelleme" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Pencereleri Taşımaya BaÅŸla" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Tembel Konumlandırma" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Pencereyi Taşı" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Pencereyi taşı" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Matlık" # include/nis_server/io.ycp:465 #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Taşınan pencerelerin matlık düzeyi" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Büyütülmüş pencereleri sürüklerken kopar ve otomatik olarak büyütülmemiÅŸ " "hale getir" # clients/inst_target_part.ycp:387 #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Büyütülmüş pencerelerde koparma efekti kapalı" # include/nis_server/io.ycp:465 #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Pencereleri taşımaya baÅŸla" # classnames.ycp:50 classnames.ycp:59 #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Parlaklık" # classnames.ycp:50 classnames.ycp:59 #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Parlaklık" # classnames.ycp:50 classnames.ycp:59 #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Parlaklık" # classnames.ycp:50 classnames.ycp:59 #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Parlaklık" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Matlığı Düşür" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Matlığı Arttır" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Matlık deÄŸiÅŸtirme adımı" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Matlık deÄŸiÅŸtirme adımı" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Matlık Adımı" # include/nis_server/io.ycp:465 #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Taşınan pencerelerin matlık düzeyi" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Döndürme Sırasındaki Matlık" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Doygunluk" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Doygunluk" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Doygunluk" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Doygunluk" #: ../metadata/obs.xml.in.h:19 #, fuzzy msgid "Saturation values for windows" msgstr "Tepki vermeyen pencerelerin doygunluÄŸu (in %)" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Pencere dekorasyonları" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Pencereleri matlaÅŸtır deÄŸerleri" # clients/inst_resize_ui.ycp:688 #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Pencereleri Haritala" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Öntanımlı olarak konumlandırılacak pencereler" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Öntanımlı olarak saydam olması gereken pencereler" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Öntanımlı olarak konumlandırılacak pencereler" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Pencere yerleÅŸimi için kullanılacak algoritma" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Basamakla" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Ortalanmış" # clients/inst_sw_single.ycp:188 #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Pencere Yönetimi" # clients/inst_target_part.ycp:404 #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Pencerelerin YetleÅŸimini Zorla" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Yatay masaüstü konumları" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Çalışma Bölgesinde Kal" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" # clients/inst_target_part.ycp:404 #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Pencereleri YerleÅŸtir" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Haritalandıklarında pencereleri belirli bir konuma yerleÅŸtir" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "YerleÅŸtirme Kipi" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Konumlandırılmış pencereler" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Rastgele" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "Çoklu çıktı aygıtı kullanılıyorken boyutlandırılmış pencereleri seçer." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Akıllı" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "Tüm çıktı aygıtları üzerinde" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Çıktı aygıtını iÅŸaretçi ile kullan" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Dikey masaüstü konumları" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Masaüstüne konumlandırılacak pencereler" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Pencere konumlandırma hızlı çözümleri" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Öntanımlı olarak konumlandırılacak pencereler" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Öntanımlı olarak belirli bir masaüstüne konumlandırılacak pencereler" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Pencere dekorasyonları" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Hızlı Çözümler" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X Konumları" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X Görünüm Yüzü Konumları" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X konum deÄŸerleri" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y Konumları" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y Görünüm Yüzü Konumları" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y konum deÄŸerleri" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png resim yükleyici" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Düzenli İfade EÅŸlemesi" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Düzenli ifade pencere eÅŸlemesi" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" # include/security/ui.ycp:774 #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Kenarlık Rengi" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Taslak görünümü ve dikdörtgen yeniden boyutlandırma kipinde kullanılacak " "kenarlık rengi" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Öntanımlı Yeniden Boyutlandırma Kipi" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Pencereleri yeniden boyutlandırmak için kullanılacak öntanımlı kip" # include/security/ui.ycp:774 #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Dolgu Rengi" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Dolgu rengi dikdörtgen ÅŸeklinde yeniden boyutlandırmada kullanılır" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Normal Yeniden Boyutlandırmaya BaÅŸla" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Taslak Göstererek Yeniden Boyutlandırmaya BaÅŸla" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Dikdörtgen Yeniden Boyutlandırmaya BaÅŸla" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Gergin Yeniden Boyutlandırmaya BaÅŸla" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Pencereyi Yeniden Boyutlandırmaya BaÅŸla" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Pencereleri Normal Åžekilde Yeniden Boyutlandır" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Taslak" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Yeniden Boyutlandırmada Taslak Göster" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Dikdörtgen" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Pencereleri Dikdörtgen Åžeklinde Yeniden Boyutlandır" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Pencereyi Yeniden Boyutlandır" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Pencereyi yeniden boyutlandır" # include/nis_server/io.ycp:465 #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Pencereyi yeniden boyutlandırmaya baÅŸla" # include/nis_server/io.ycp:465 #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Pencereyi esneterek yeniden boyutlandırmaya baÅŸla" # include/nis_server/io.ycp:465 #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Pencereyi normal ÅŸekilde yeniden boyutlandırmaya baÅŸla" # include/nis_server/io.ycp:465 #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Pencereyi taslak göstererek yeniden boyutlandırmaya baÅŸla" # include/nis_server/io.ycp:465 #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Pencereyi dikdörtgen ÅŸeklinde yeniden boyutlandırmaya baÅŸla" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Gergin" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Pencereleri Gergin Åžekilde Yeniden Boyutlandır" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Normal yeniden boyutlandırma kullanılacak pencereler" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Taslak görünümünde yeniden boyutlandırma kullanılacak pencereler" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Dikdörtgen yeniden boyutlandırma kullanılacak pencereler" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Gerginlik kullanılarak yeniden boyutlandırma kullanılacak pencereler" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" # clients/online_update.ycp:223 #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Çevirme Zamanı" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" # include/cups/ui.ycp:541 #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "İşaretçi Hassasiyeti" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Döndürürken Yüksel" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Döndürülürken pencereleri yükselt" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Küpü Döndür" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Döndürürken Sola Çevir" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Döndürürken SaÄŸa Çevir" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Sola Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Pencere ile birlikte Sola Döndür" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "SaÄŸa Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Pencere ile birlikte SaÄŸa Döndür" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Buraya Döndür" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "1. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "1. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "10. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "10. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "11. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "11. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "12. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "12. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "2. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "2. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "3. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "3. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "4. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "4. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "5. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "5. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "6. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "6. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "7. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "7. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "8. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "8. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "9. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "9. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Küpü Döndür" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Masaüstü küpünü döndür" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Sola döndür" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Sola döndür ve etkin pencereyi getir" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "SaÄŸa döndür" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "SaÄŸa döndür ve etkin pencereyi getir" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "1. yüze döndür ve etkin pencereyi yerleÅŸtir" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "1. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "1. yüze döndür ve etkin pencereyi yerleÅŸtir" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "1. yüze döndür " #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "10. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "10. yüze döndür ve etkin pencereyi yerleÅŸtir" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "11. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "11. yüze döndür ve etkin pencereyi yerleÅŸtir" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "12. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "12. yüze döndür ve etkin pencereyi yerleÅŸtir" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "2. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "2. yüze döndür ve etkin pencereyi yerleÅŸtir" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "3. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "3. yüze döndür ve etkin pencereyi yerleÅŸtir" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "4. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "4. yüze döndür ve etkin pencereyi yerleÅŸtir" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "5. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "5. yüze döndür ve etkin pencereyi yerleÅŸtir" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "6. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "6. yüze döndür ve etkin pencereyi yerleÅŸtir" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "7. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "7. yüze döndür ve etkin pencereyi yerleÅŸtir" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "8. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "8. yüze döndür ve etkin pencereyi yerleÅŸtir" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "9. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "9. yüze döndür ve etkin pencereyi yerleÅŸtir" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Masaüstüne döndür" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Pencereyi döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Pencere ile birlikte döndür" # include/x11/resolution_dialog.ycp:81 #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Döndürme Hızlandırması" # classnames.ycp:73 #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Döndürme Hızı" # classnames.ycp:73 #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Döndürme zaman aralığı" # classnames.ycp:73 #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Döndürme Büyütmesi" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "İşaretçi hareketinin hassaslığı" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" # include/ui/wizard_hw.ycp:51 #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Döndürmeyi BaÅŸlat" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Masaüstü deÄŸiÅŸtirme zamanaşımı" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Büyüt" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Yüzde olarak matlık miktarı" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Büyük" # Kastedileni tam olarak anlayamadım. (drake) #: ../metadata/scale.xml.in.h:6 #, fuzzy msgid "Button Bindings Toggle Scale Mode" msgstr "Ölçeklendirme Kipine Geçen Düğme BaÄŸlayıcıları" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Masaüstünü Göstermek için Masaüstüne Tıkla" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Arkaplanı KoyulaÅŸtır" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Pencereleri yeniden boyutlandırırken arkaplanı koyulaÅŸtır" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Simge" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Boyutlandırma sırasında masaüstüne tıklanırsa Masaüstünü Göster kipine geç" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Üzerine Gelme Süresi" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Pencere Tutucuyu BaÅŸlat" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Tüm Pencereler için Pencere Yakalayıcıyı BaÅŸlat" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Pencere Grubu için Pencere Yakalayıcıyı BaÅŸlat" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Geçerli Çıktıyı Kullanan Pencereler için Pencere Yakalayıcıyı BaÅŸlat" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Tüm pencereleri yerleÅŸtir ve dönüştür" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Pencere grubunu yerleÅŸtir ve dönüştür" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Pencereleri yerleÅŸtir ve dönüştür" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Geçerli çıktıyı kullanan pencereleri yerleÅŸtir ve dönüştür" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Tüm çıktı aygıtları üzerinde" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Sadece geçerli çıktı aygıtı üzerinde" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Örtülü Durum Simgesi" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Boyutlandırılan pencerelerin üzerinde simge göster" # menuentries/menuentry_scanner.ycp:36 #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Boyutlandır" # clients/inst_target_part.ycp:404 #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Pencereleri Boyutlandır" # clients/inst_environment.ycp:306 #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Boyutlandırma hızı" # clients/inst_environment.ycp:306 #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Boyutlandırma zamanı basamağı" # clients/inst_target_part.ycp:404 #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Pencereleri boyutlandır" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "Çoklu çıktı aygıtı kullanılıyorken boyutlandırılmış pencereleri seçer." # clients/inst_target_part.ycp:404 #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Pencereler arasında bırakılacak boÅŸluk" # /usr/lib/YaST2/keyboard_raw.ycp:200 #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Aralık" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Bir pencerenin üzerindeyken boyutlandırma kipi bitirilmeden önce geçmesi " "gereken süre (ms olarak)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Boyutlandırma kipinde boyutlandırılacak pencereler" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Ekran görüntüsünü otomatik olarak bu uygulama ile aç" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Dizin" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Dikdörtgen ekran görüntüsünü baÅŸlat" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Uygulamayı BaÅŸlat" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Ekran görüntülerini bu dizine kaydet" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Ekran Görüntüsü" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Ekran görüntüsü yakalama eklentisi" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg resim yükleyici" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Yüzde olarak parlaklık miktarı" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Yüzde olarak doygunluk miktarı" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Uygulama Seçici" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Otomatik Döndür" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Öne Getir" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Seçilen pencereyi öne getir" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Masaüstünün pencereler deÄŸiÅŸtirilirken uzaklaÅŸtırılacağı mesafe" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Simge" # clients/inst_target_part.ycp:387 #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Küçültülmüş" # clients/inst_sw_single.ycp:146 #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Sonraki Panel" # clients/inst_target_part.ycp:404 #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Sonraki pencere" # clients/inst_target_part.ycp:404 #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Sonraki pencere (Tüm pencereler)" # clients/inst_target_part.ycp:404 #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Sonraki pencere (Açılabilir pencere yok)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Önceki Panel" # clients/inst_resize_ui.ycp:688 #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Önceki pencere" # clients/inst_resize_ui.ycp:688 #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Önceki pencere (Tüm pencereler)" # clients/inst_resize_ui.ycp:688 #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Önceki pencere (Açılabilir pencere yok)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "DeÄŸiÅŸtirirken seçilen pencereyi döndür" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" # clients/inst_target_part.ycp:387 #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Küçültülmüş pencereleri göster" # clients/inst_environment.ycp:306 #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "DeÄŸiÅŸtirici hızı" # clients/inst_environment.ycp:306 #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "DeÄŸiÅŸtirici zaman aralığı" # clients/inst_target_part.ycp:404 #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Pencere deÄŸiÅŸtirici" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "DeÄŸiÅŸtiricide gösterilmesi gereken pencereler" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 renklerini destekle" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Video Oynat" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Video oynat" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 renkleri" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Çizgi ekle" # clients/inst_custom_part.ycp:2928 #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Nokta ekle" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "DeÄŸiÅŸik masaüstü hareketlerine su efekti ekler" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "YaÄŸmur damlaları arasında geçecek süre (ms olarak)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "İşaretçi su efektini etkinleÅŸtir" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Satır" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "YerleÅŸim Boyutu" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Nokta" # clients/hwinfo.ycp:71 #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "YaÄŸmur Gecikmesi" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Pencere baÅŸlığı dalgası" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "YaÄŸmuru aç / kapat" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "YaÄŸmur efektini aç / kapat" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Siliciyi aç /kapat" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Siliciyi efektini aç /kapat" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Su Efekti" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Su yerleÅŸim boyutu" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Pencere baÅŸlığı dalga efekti" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Odaklama Efekti" # clients/inst_resize_ui.ycp:688 #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Pencere Odaklama Efekti" # clients/inst_target_part.ycp:404 #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Pencereleri Odakla" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Sürtünme" # clients/inst_target_part.ycp:404 #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Pencereleri Yakala" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Izgara Çözünürlüğü" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Ters çevrilmiÅŸ pencere koparma efekti" # clients/inst_target_part.ycp:404 #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Pencereyi titret" # clients/inst_resize_ui.ycp:688 #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Haritalama Efekti" # clients/inst_resize_ui.ycp:688 #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Pencere Haritalama Efekti" # clients/inst_resize_ui.ycp:688 #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Pencereleri Haritala" # clients/inst_resize_ui.ycp:688 #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Büyütme Efekti" # clients/ui_widgets.ycp:182 clients/ui_widgets.ycp:210 #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "En Küçük Izgara Boyutu" # clients/ui_widgets.ycp:182 clients/ui_widgets.ycp:210 #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "En Küçük Tepe Izgara Boyutu" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Pencereleri Taşı" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Titreme" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Ters ÇevrilmiÅŸ Åžekilde Kopar" # clients/inst_target_part.ycp:387 #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Pencereleri kopar" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Sıçrama Sürtünmesi" # clients/hwinfo.ycp:104 #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "K Sıçraması" # clients/hwinfo.ycp:104 #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Sıçrama Sabiti" # clients/inst_target_part.ycp:404 #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Pencere koparma efektini aç / kapat" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Sallanan pencere efekti için esneklik modelini kullan" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Tepe Izgara Çözünürlüğü" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Odaklandığında sallanacak pencereler" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Yakalandığında sallanacak pencereler" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Haritalandığında sallanacak pencereler" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Taşındığında sallanacak pencereler" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Büyütülmüş ve büyütülmemiÅŸ durumdaki pencereler için sallanma efekti" # clients/inst_resize_ui.ycp:688 #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Sallanan Pencereler" # clients/support_registration.ycp:66 #~ msgid "Command line 0" #~ msgstr "0. komut satırı" #~ msgid "Run command 0" #~ msgstr "0. komutu çalıştır" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Ekran görüntüsü komut satırı" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Ekran görüntüsü komut satırı" #~ msgid "Filter Linear" #~ msgstr "DoÄŸrusal Filtrele" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Büyütüldüğünde doÄŸrusal filtreleme kullan" # clients/inst_sw_single.ycp:146 #~ msgid "Zoom Desktop" #~ msgstr "Masaüstünü Büyüt" #~ msgid "Zoom In" #~ msgstr "Büyüt" #~ msgid "Zoom Out" #~ msgstr "Küçült" #~ msgid "Zoom Pan" #~ msgstr "Büyüterek Görüntü Bindirme" #~ msgid "Zoom Speed" #~ msgstr "Büyütme Hızı" # classnames.ycp:73 #~ msgid "Zoom Timestep" #~ msgstr "Büyütme Zamanı Basamağı" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Masaüstü küpünü büyüt ve görüntüsünü bindir" #~ msgid "Zoom factor" #~ msgstr "Büyütme aralığı" #~ msgid "Zoom pan" #~ msgstr "Büyüt ve görüntüyü bindir" # include/partitioning/auto_part_ui.ycp:147 #~ msgid "Decrease window opacity" #~ msgstr "Pencere matlığını düşür" #~ msgid "Increase window opacity" #~ msgstr "Pencere matlığını arttır" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Öntanımlı olarak saydam olması gereken, pencereler için matlık deÄŸerleri" # clients/inst_target_part.ycp:404 #~ msgid "Opacity windows" #~ msgstr "Pencereleri matlaÅŸtır" #~ msgid "Background Images" #~ msgstr "Arkaplan Resimleri" #~ msgid "Background images" #~ msgstr "Arkaplan resimleri" # clients/inst_target_part.ycp:404 #~ msgid "Place windows on a plane" #~ msgstr "Pencereleri bir uçağın üzerine koy" # clients/inst_target_part.ycp:404 #~ msgid "Plane Down" #~ msgstr "AÅŸağıya Uçur" #~ msgid "Plane Left" #~ msgstr "Sola Uçur" #~ msgid "Plane Right" #~ msgstr "SaÄŸa Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 1" #~ msgstr "1. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 10" #~ msgstr "10. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 11" #~ msgstr "11. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 12" #~ msgstr "12. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 2" #~ msgstr "2. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 3" #~ msgstr "3. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 4" #~ msgstr "4. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 5" #~ msgstr "5. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 6" #~ msgstr "6. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 7" #~ msgstr "7. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 8" #~ msgstr "8. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 9" #~ msgstr "9. Yüze Uçur" # clients/inst_target_part.ycp:404 #~ msgid "Plane Up" #~ msgstr "Yukarıya Uçur" # clients/inst_target_part.ycp:404 #~ msgid "Plane down" #~ msgstr "AÅŸağıya Uçur" #~ msgid "Plane left" #~ msgstr "Sola uçur" #~ msgid "Plane right" #~ msgstr "SaÄŸa uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 1" #~ msgstr "1. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 10" #~ msgstr "10. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 11" #~ msgstr "11. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 12" #~ msgstr "12. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 2" #~ msgstr "2. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 3" #~ msgstr "3. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 4" #~ msgstr "4. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 5" #~ msgstr "5. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 6" #~ msgstr "6. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 7" #~ msgstr "7. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 8" #~ msgstr "8. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 9" #~ msgstr "9. yüze uçur" # clients/inst_target_part.ycp:404 #~ msgid "Plane up" #~ msgstr "Uçur" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Masaüstü Penceresinin Matlığının Solma Zamanı." compiz-0.9.11+14.04.20140409/po/hr.po0000644000015301777760000022375312321343002017075 0ustar pbusernogroup00000000000000# Croatian message file for YaST2 (@memory@) # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2001 SuSE GmbH. # Vlatko Kosturjak , 2001 # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2007-12-22 13:42+0100\n" "Last-Translator: Matija Folnovic \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n != 1);\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Radna povrÅ¡ina" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Upravitelj Prozora" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "NiÅ¡ta" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Skener" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "&Smanji Windowse" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maksimiziraj prozor horizontalno" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maksimiziraj prozor vertikalno" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "&Smanji Windowse" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automatsko prikazivanje" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Upravitelji Prozorima" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Akcija koja ce se napraviti kada se scroll-a misem preko naslovne trake" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Brzina:" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Transparentnost Metacity teme prozora" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "&ObriÅ¡i Windows kompletno" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "Zatvori prozor" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maksimiziraj prozor" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimiziraj prozor" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Indija" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Postavke arhiva" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Izbrisi" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Nacrtaj" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Crtaj koristeci alat" #: ../metadata/annotate.xml.in.h:8 #, fuzzy msgid "Fill color for annotations" msgstr "NauÄite viÅ¡e iz dokumenatcije" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Aktiviraj" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Indija" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Indija" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Indija" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Debljina linije" #: ../metadata/annotate.xml.in.h:14 #, fuzzy msgid "Line width for annotations" msgstr "NauÄite viÅ¡e iz dokumenatcije" #: ../metadata/annotate.xml.in.h:15 #, fuzzy msgid "Stroke color for annotations" msgstr "NauÄite viÅ¡e iz dokumenatcije" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 #, fuzzy msgid "Stroke width for annotations" msgstr "NauÄite viÅ¡e iz dokumenatcije" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "4xBilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alpha mutnost" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Brzina:" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Trajanje" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Trajanje" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Trajanje mutnosti" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Trajanje" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "&ObriÅ¡i Windowse" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Ruski" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Ruski" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Ruski" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Ruski" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Ruski" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "Lima" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Lima" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windows slobodno (%1)" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 #, fuzzy msgid "Clone Output" msgstr "Sažmi izlaz" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Indija" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Naredba 1 " #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Naredba 10 " #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Naredba 11 " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Naredba 1 " #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Naredba 2 " #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Naredba 3 " #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Naredba 4 " #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Naredba 5" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Naredba 6" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Naredba 7 " #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Naredba 8 " #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Naredba 9 " #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Naredba '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Naredba '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Naredba '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Naredba '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Naredba: " #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "Aktivni dodaci" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "Automatsko prikazivanje" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatska detekcija output uredaja" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatska detekcija osvjezavanja" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Najbolji" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Klikni za fokusiranje" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Zatvori aktivni prozor" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Osnovna ikona" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Postavke okružja" #: ../metadata/core.xml.in.in.h:17 #, fuzzy msgid "Detect Outputs" msgstr "Detektiraj izlaz" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detektiraj osvjezavanje" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Brzina" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Omogući ZEN particiju" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Generalne opcije" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Generalne compiz opcije" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Dobro" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Sakrij sve prozore i fokusiraj radnu povrsinu" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Velicina virtualne horizontale" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Vrijeme prije pojavljivanja selektiranog prozora" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "Omogući ZEN particiju" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista trenutno aktivnih prozora" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Spusti prozor" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maksimiziraj prozor horizontalno" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maksimiziraj prozor vertikalno" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maksimiziraj aktivni prozor" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maksimiziraj aktivni prozor horizontalno" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maksimiziraj prozor vertikalno" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimiziraj aktivni prozor" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "Broj radnih povrsina" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Radne povrÅ¡ine" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Odgoda" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "&ObriÅ¡i Windowse" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "Ob&oviti" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Radne povrÅ¡ine" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Konfiguracije" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Postavi filter" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Postavi filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Virtualni Diskovi" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "Akcija" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sydnej" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Automatski" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Postavke okružja" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "Akcija" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Brzina:" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "&Testiraj" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "Instaliram presliku datoteke" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "&ObriÅ¡i Windowse" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "&ObriÅ¡i Windowse" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "&Smanji Windowse" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "lokalno vrijeme" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sydnej" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Sydnej" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Brzina:" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "&Testiraj" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Naredba: " #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "&ObriÅ¡i Windows kompletno" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "&ObriÅ¡i Windows kompletno" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Prikaži &detalje" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "&ObriÅ¡i Windows kompletno" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "Prikaži &detalje" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "&Smanji Windowse" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "&ObriÅ¡i Windows kompletno" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "Prikaži &detalje" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "&Smanji Windowse" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Nema opisa" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind opcije" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "&Testiraj" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Mountain" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "&Testiraj" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Brzina:" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "&Testiraj" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "DatoteÄni Sustav" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "&Smanji Windowse" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows slobodno (%1)" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Dodaj toÄku provjere" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Dodaj toÄku provjere" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 #, fuzzy msgid "Open a terminal" msgstr "Pokreni u terminalu" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Naredba: " #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Naredba: " #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "&Smanji Windowse" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "&Smanji Windowse" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "&Smanji Windowse" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "&Smanji Windowse" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "Mountain" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "&ObriÅ¡i Windowse" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "&Smanji Windowse" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "&ObriÅ¡i Windowse" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "&ObriÅ¡i Windowse" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "&ObriÅ¡i Windowse" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "Pokrećem servis." #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "&Smanji Windowse" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Pokrećem servis." #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Most" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Most" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Most" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Most" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Smanji transparentnost" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Povecaj transparentnost" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Step mijenjanja transparentnosti" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Step mijenjanja transparentnosti" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Broj virtualnih radnih povrsina" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Pokrećem servis." #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind opcije" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows iskoriÅ¡teno:" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "&Smanji Windowse" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Upravitelj Prozora" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Virtualni Diskovi" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "&Smanji Windowse" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Virtualni Diskovi" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "&Smanji Windowse" #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind opcije" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind opcije" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "&Smanji Windowse" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Virtualni Diskovi" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "&Smanji Windowse" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Virtualni Diskovi" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "&ObriÅ¡i Windowse" #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "&ObriÅ¡i Windowse" #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Pokrećem servis." #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Pokrećem servis." #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Pokrećem servis." #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Pokrećem servis." #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Pokrećem servis." #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "PokazivaÄ na %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "PokazivaÄ na %1" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "&ObriÅ¡i Windowse" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "&ObriÅ¡i Windowse" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Postavke okružja" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Postavke okružja" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "&ObriÅ¡i Windowse" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "&ObriÅ¡i Windowse" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Akcija" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Pokrenuti servis" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "&ObriÅ¡i Windowse" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Skener" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "lokalno vrijeme" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "lokalno vrijeme" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Tražim..." #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 #, fuzzy msgid "Automatically open screenshot in this application" msgstr "Automatski pokreni program prilikom prijave" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Direktorij\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Indija" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Aplikacija za zamjenu:" #: ../metadata/screenshot.xml.in.h:6 #, fuzzy msgid "Put screenshot images in this directory" msgstr "Rekurzija u direktorij" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Postavke arhiva" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Automatski" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Akcija" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Akcija" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Postavke okružja" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "&ObriÅ¡i Windowse" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "&ObriÅ¡i Windowse" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "&ObriÅ¡i Windowse" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "&ObriÅ¡i Windowse" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Pokrećem servis." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "lokalno vrijeme" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "lokalno vrijeme" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "Dodaj servis" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "Dodaj toÄku provjere" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Odgoda" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "&Promijeni status" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "&Promijeni status" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "&Promijeni status" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "&Promijeni status" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "&ObriÅ¡i Windowse" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Akcija" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "&ObriÅ¡i Windowse" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Rezolucija" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "&ObriÅ¡i Windowse" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "&Smanji Windowse" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "&Smanji Windowse" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "Minimalni &GUID" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "Minimalni &GUID" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "&ObriÅ¡i Windowse" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "Pogonski program" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "&Smanji Windowse" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Akcija" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "PreskaÄem %1" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "PreskaÄem %1" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "&ObriÅ¡i Windowse" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Rezolucija" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Naredba 0" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Naredba '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Postavke arhiva" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Postavke arhiva" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Ime datoteke" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Radne povrÅ¡ine" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Brzina:" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Brzina:" #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "Smanji transparentnost prozora" #~ msgid "Increase window opacity" #~ msgstr "Povecaj transparentnost prozora" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Plane Down" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Plane Left" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Plane Right" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane Up" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Plane down" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Plane left" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Plane right" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane up" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Dialog" #~ msgstr "Katalog" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Upravitelji Prozorima" #, fuzzy #~ msgid "Notification" #~ msgstr "Akcija" #~ msgid "Unknown" #~ msgstr "Nepoznato" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Trajanje" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "&ObriÅ¡i Windows kompletno" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Prikaži &detalje" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Akcija" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Brzina:" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Ruski" #, fuzzy #~ msgid "Line width for annotations (0.0-100.0)" #~ msgstr "NauÄite viÅ¡e iz dokumenatcije" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&Smanji Windowse" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&Smanji Windowse" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Minimalni &GUID" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Radne povrÅ¡ine" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Akcija" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "lokalno vrijeme" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "lokalno vrijeme" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "&ObriÅ¡i Windowse" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Akcija" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "PreskaÄem %1" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Postavi filter" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Rezolucija" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows slobodno (%1)" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows slobodno (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Brzina:" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Command line %d" #~ msgstr "Naredba: " #, fuzzy #~ msgid "Run command %d" #~ msgstr "Naredba: " #, fuzzy #~ msgid "Corners" #~ msgstr "PisaÄi" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Floppy disk" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Terminate" #~ msgstr "PisaÄ" compiz-0.9.11+14.04.20140409/po/pl.po0000644000015301777760000031115312321343002017067 0ustar pbusernogroup00000000000000# translation of compiz.po to # Polish message file for compiz. # Copyright (C) 2005 SUSE Linux Products GmbH. # Maciej Warnecki , 2007. # wadim dziedzic msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-05-07 19:32+0200\n" "Last-Translator: Maciej Warnecki \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Pulpit" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "ZarzÄ…dzanie oknem" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Brak" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "ZwiÅ„" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maksymalizuj" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Maksymalizuj okno w poziomie" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Maksymalizuj okno w pionie" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimalizuj" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "WysuÅ„ " #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Zaniż" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menu okna" # I find my translation easier to understand #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Akcja przy obrocie kółka myszy nad paskiem tytuÅ‚owym okna." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Typ rozmycia" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Nieprzezroczystość aktywnego okna z motywem Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Nieprzezroczystość cienia aktywnego okna z motywem Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Nieprzezroczystość motywu Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "NieprzezroczystoÅ›c cienia motywu Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Nieprzezroczystość dla aktywnych okien z dekoracjami motywu Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Nieprezroczystość dekoracji motywu Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Cieniuj aktywne okna z motywem Metacity od nieprzezroczystych do " "półprzezroczystych" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Cieniuj okna z dekoracjami motywu metacity od nieprzezroczystych do " "przejrzystych" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Akcja podjÄ™ta przy naciÅ›niÄ™ciu kółka myszy na pasku tytulowym" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Typ rozmycia używany dla dekoracji okien" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Używaj motywu Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Używaj motywu Metacity podczas rysowania dekoracji okien" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Zamknij okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Cofnij maksymalizacjÄ™ okna" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maksymalizuj okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Zminimalizuj okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Stwórz powyżej" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Przyklej" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Odcieniuj" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Nie twórz powyżej" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Odklej" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Okno \"%s\" nie odpowiada." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "Wymuszenie zamkniÄ™cia aplikacji spowoduje utratÄ™ niezapisanych zmian." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_WymuÅ› ZamkniÄ™cie" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Rysowanie" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Kolor wypeÅ‚nienia" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Kolor pÄ™dzla" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Wtyczka rysowania" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Czyść" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Rysuj" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Rysowanie na pulpicie" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Kolor wypeÅ‚nienia dla rysowania" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Inicjuj" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Rozpocznij rysowanie" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Rozpoczyna usuwanie rysunków" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Rozpocznij usuwanie" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Szerokość linii" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Szerokość linii przy rysowaniu" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Kolor pÄ™dzla przy rysowaniu" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Szerokość pÄ™dzla" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Szerokość pÄ™dzla przy rysowaniu" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Rozmycie alfa" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Rozmycie alfa okien" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtr rozmycia" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Okluzja rozmycia" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Nasycenie rozmycia" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "PrÄ™dkość rozmycia" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Rozmywaj okna" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Rozmycie za przezroczystymi częściami okien" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Nasycenie kolorami rozmytego obszaru" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Rozmywanie okien" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Rozmywaj nieaktywne okna" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Wyłącz rozmywanie fragmentów ekranu zajmowanych przez inne okna." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Metoda filtrowania dla rozmycia" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Rozmycie ostroÅ›ci" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Rozmycie ostroÅ›ci okien" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Rozmycie Gaussa" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "PromieÅ„ rozmycia Gaussa" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "SiÅ‚a rozmycia Gaussa" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "PromieÅ„ rozmycia Gaussa" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "SiÅ‚a rozmycia Gaussa" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Pozyskaj niezależne tekstury" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmapa" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Poziom szczegółów mipmapy" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Poziom szczegółów mipmapy" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulsowanie" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efekt pulsowania" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Używaj dostÄ™pnych jednostek tekstur, by pozyskać jak najwiÄ™cej niezależnych " "tekstur" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Szybkość rozmywania okien" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Okna, które majÄ… być poddane rozmyciu ostroÅ›ci" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Okna, które majÄ… używać rozmycia alfa" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Klonowanie wyjÅ›cia" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Rozpocznij klonowanie zaznaczenia" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "ZewnÄ™trzna obsÅ‚uga klonowania" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 7 " #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "KrawÄ™dź ekranu, która spowoduje uruchomienie polecenia 1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "KrawÄ™dź ekranu, która spowoduje uruchomienie polecenia 10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "KrawÄ™dź ekranu, która spowoduje uruchomienie polecenia 11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "KrawÄ™dź ekranu, która spowoduje uruchomienie polecenia 2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "KrawÄ™dź ekranu, która spowoduje uruchomienie polecenia 3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "KrawÄ™dź ekranu, która spowoduje uruchomienie polecenia 4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "KrawÄ™dź ekranu, która spowoduje uruchomienie polecenia 5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "KrawÄ™dź ekranu, która spowoduje uruchomienie polecenia 6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "KrawÄ™dź ekranu, która spowoduje uruchomienie polecenia 7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "KrawÄ™dź ekranu, która spowoduje uruchomienie polecenia 8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "KrawÄ™dź ekranu, która spowoduje uruchomienie polecenia 9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "PrzyporzÄ…dkowanie poleceÅ„ do ustalonych dziaÅ‚aÅ„" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Skróty myszy" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Linia poleceÅ„ 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Linia poleceÅ„ 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Linia poleceÅ„ 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Linia poleceÅ„ 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Linia poleceÅ„ 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Linia poleceÅ„ 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Linia poleceÅ„ 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Linia poleceÅ„ 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Linia poleceÅ„ 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Linia poleceÅ„ 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Linia poleceÅ„ 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Linia poleceÅ„ 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Polecenie do wykonania w powÅ‚oce po wywoÅ‚aniu skrótu 0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Polecenie do wykonania w powÅ‚oce po wywoÅ‚aniu skrótu 1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Polecenie do wykonania w powÅ‚oce po wywoÅ‚aniu skrótu 10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Polecenie do wykonania w powÅ‚oce po wywoÅ‚aniu skrótu 11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Polecenie do wykonania w powÅ‚oce po wywoÅ‚aniu skrótu 2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Polecenie do wykonania w powÅ‚oce po wywoÅ‚aniu skrótu 3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Polecenie do wykonania w powÅ‚oce po wywoÅ‚aniu skrótu 4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Polecenie do wykonania w powÅ‚oce po wywoÅ‚aniu skrótu 5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Polecenie do wykonania w powÅ‚oce po wywoÅ‚aniu skrótu 6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Polecenie do wykonania w powÅ‚oce po wywoÅ‚aniu skrótu 7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Polecenie do wykonania w powÅ‚oce po wywoÅ‚aniu skrótu 8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Polecenie do wykonania w powÅ‚oce po wywoÅ‚aniu skrótu 9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Polecenia" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Skróty ekranowe" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Skróty klawiaturowe" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Wykonaj polecenie 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Wykonaj polecenie 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Wykonaj polecenie 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Wykonaj polecenie 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Wykonaj polecenie 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Wykonaj polecenie 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Wykonaj polecenie 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Wykonaj polecenie 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Wykonaj polecenie 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Wykonaj polecenie 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Wykonaj polecenie 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Wykonaj polecenie 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Włączone wtyczki" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Zezwól na to, by rysowanie okien peÅ‚noekranowych nie byÅ‚o przekierowywane do " "obrazków rastrowych poza ekranem" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Dzwonek systemowy" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Dzwonek systemowy" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatyczne wysuwanie okien" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Opóźnienie automatycznego wysuwania okien" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatyczne wykrywanie urzÄ…dzeÅ„ wyjÅ›ciowych" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatyczne wykrywanie czÄ™stotliwoÅ›ci odÅ›wieżania" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Najlepszy" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Kliknij by wybrać" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "KlikniÄ™cie okna ogniskuje na nim wprowadzanie" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Zamknij aktywne okno" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "DomyÅ›lna ikona" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Obraz domyÅ›lnej ikony okna" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Rozmiar pulpitu" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Wykryj wyjÅ›cia" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Wykryj czÄ™stotliwość odÅ›wieżania" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Ustawienia obrazu" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Czas jaki musi spÄ™dzić wskaźnik na krawÄ™dzi ekranu zanim zostanie wykonana " "akcja" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Opóźnienie zapadki krawÄ™dzi" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Szybki" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Zachowanie przy wybraniu okna" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "StopieÅ„ zapobiegania skupienia" #: ../metadata/core.xml.in.in.h:25 #, fuzzy msgid "Focus Prevention Windows" msgstr "Zapobieganie skupieniu okien" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Zapobieganie skupieniu okien" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "WymuÅ› niezależne wyÅ›wietlanie wyjÅ›cia" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Opcje Ogólne" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Ogólne opcje Compiza" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Dobry" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ukryj okna spoza paska zadaÅ„" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Schowaj wszystkie okna i wybierz pulpit" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "Ukrywa okna spoza paska zadaÅ„ w trybie pokazywania pulpitu" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Wysokość" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Poziomy rozmiar wirtualny" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "JeÅ›li możliwe używaj kompresji dla tekstur przekonwertowanych z obrazków" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignoruj podpowiedzi dla zmaksymalizowanych okien" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignorowanie podpowiedzi zwiÄ™kszenia rozmiaru i proporcji gdy okno jest " "zmaksymalizowane" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "OdstÄ™p czasu przed podniesieniem wskazanych okien" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "OdstÄ™p czasu pomiÄ™dzy wiadomoÅ›ciami ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Przypisania klawiszy" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "StopieÅ„ zapobiegania wykradania ostroÅ›ci" # ZmieniÅ‚em z "BÅ‚yskawica" na "OÅ›wietlenie": # lightNing=BÅ‚yskawica # lighting=OÅ›wietlenie, cieniowanie #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "OÅ›wietlenie" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista aktualnie włączonych wtyczek" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lista opisów urzÄ…dzeÅ„ wyjÅ›ciowych" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Niski" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Obniż okno" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "PrzenieÅ› okno pod pozostaÅ‚e" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maksymalizuj okno w poziomie" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maksymalizuj okno w pionie" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maksymalizuj aktywne okno" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maksymalizuj aktywne okno w poziomie" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maksymalizuj aktywne okno w pionie" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimalizuj aktywne okno" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normalne" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Ilość pulpitów" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Ilość wirtualnych pulpitów" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Wyłączenie" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "OdÅ›wieżaj ekran tylko podczas okresu poziomego wygaszania" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "WyjÅ›cia" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Radzenie sobie z zachodzÄ…cymi na siebie wyjÅ›ciami" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Rysuj każde urzÄ…dzenie wyjÅ›ciowe niezaleźnie, nawet jeÅ›li zachodzÄ… one na " "siebie" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Opóźnienie ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Preferuj wiÄ™ksze wyjÅ›cie" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Preferuj mniejsze wyjÅ›cie" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "PodnieÅ› przy klikniÄ™ciu" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "PodnieÅ› okno" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "PodnieÅ› wskazane okno po interwale" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Podnosi okno ponad pozostaÅ‚e" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "PodnieÅ› okna po klikniÄ™ciu" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "CzÄ™stotliwość odÅ›wieżania" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Mnożnik rozmiaru ekranu dla poziomego wirtualnego rozmiaru" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Mnożnik rozmiaru ekranu dla pionowego wirtualnego rozmiaru" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Pokaż pulpit" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Powolne animacje" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "\"sprytny\" tryb" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synchronizuj z VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Kompresja tekstur" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtr tekstury" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtrowanie tekstur" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "CzÄ™stotliwość przerysowywania ekranu (razy na sekundÄ™)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Przełącz maksymalizacjÄ™ okna" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Przełącz maksymalizacjÄ™ poziomÄ… okna" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Przełącz maksymalizacjÄ™ pionowÄ… okna" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Przełącz zwiniÄ™cie okna" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Przełącza maksymalizacjÄ™ aktywnego okna" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Przełącz maksymalizacjÄ™ poziomÄ… aktywnego okna" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Przełącz maksymalizacjÄ™ poziomÄ… aktywnego okna" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Przełącza przyciemnianie aktywnego okna" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Wyłącz powolne animacje" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Cofnij maksymalizacjÄ™ aktywnego okna" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Cofnij przekierowanie okien peÅ‚noekranowych" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Używaj rozproszonego Å›wiatÅ‚a podczas przeksztaÅ‚ceÅ„ ekranu" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Pionowy rozmiar wirtualny" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Bardzo wysoko" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" "Które z zachodzÄ…cych na siebie urzÄ…dzonych wyjÅ›ciowych powinny być " "preferowne?" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Przypisanie przycisku do menu okien" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Przypisanie klawisza do menu okien" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Akceleracja" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Dostosuj obraz" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Dostosuj obrazek górnej Å›ciany kostki do obrotu" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Przejdź do nastÄ™pnej klatki" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animacja tÅ‚a dla kostki" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animacja tÅ‚a dla kostki podczas jej obracania" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "WyglÄ…d" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatycznie" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Zachowanie" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Kolor górnej i dolnej Å›ciany kostki" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Dolny kolor przejÅ›cia tonalnego w tle kostki pulpitów" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Góny kolor przejÅ›cia tonalnego w tle kostki pulpitów" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Obrazki kostki" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kolor kostki" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Kostka pulpitu" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Przyspieszenie zwijania" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Szybkość zwijania" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Opóźnienie zwijania" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "O ile to możliwe, generuj mitmapy dla lepszej jakoÅ›ci skalowania" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Przejdź do poprzedniej klatki" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Pliki obrazków" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Obrazek, który ma być używany jako tekstura tÅ‚a dla kostki" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Kostka bÄ™dzie przezroczysta tylko jeÅ›li jest obracana za pomocÄ… kursora" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "WewnÄ…trz kostki" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "WewnÄ…trz kostki" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista plików PNG i SVG, które majÄ… być wyÅ›wietlane na górnej Å›cianie kostki" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Tryb wielu urzÄ…dzeÅ„ wyjÅ›ciowych" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Wiele kostek" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "NastÄ™pna klatka" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Jedna duża kostka" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Nieprzezroczystość kostki podczas obracania " #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Nieprzezroczystość kostki kiedy nie jest obracana" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Nieprzezroczystość pulpitu podczas obracania kostki" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Nieprzezroczystość pulpitu kiedy kostka nie jest obracana" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Umieszczaj okna na kostce" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Poprzednia klatka" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "WyÅ›wietlaj tÅ‚o dla kostki" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Skaluj obrazek" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Skaluj obrazki przykrywajÄ…ce górnÄ… Å›cianÄ™ kostki" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Decyduje jak kostka jest wyÅ›wietlana jeÅ›li używanych jest kilka uzrÄ…dzeÅ„ " "wyjÅ›ciowych" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "TÅ‚o dla kostki" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "KoÅ„cowy kolor gradientu tÅ‚a kostki" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "PoczÄ…tkowy kolor gradientu tÅ‚a kostki" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Obrazek tÅ‚a dla kostki" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Szybkość" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Opóźnienie" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Przezroczystość tylko podczas obracania kursorem" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Przezroczysta kostka" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "OdsÅ‚oÅ„" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "OdsÅ‚oÅ„ kostkÄ™" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Wsteczna kontrola Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Pozwól tworzyć mipmapy dla tekstur dekoracji" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Polecenie" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekoracje okien" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "Polecenie dekoratora wykonywane gdy dekorator nie jest uruchomiony" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "PrzesuniÄ™cie cienia w osi X" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "PrzesuniÄ™cie cienia w osi Y" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Kolor cienia" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Nieprzezroczystość cienia" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "PromieÅ„ cienia" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Kolor cienia" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "PrzesuniÄ™cie cienia - współrzÄ™dna X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "PrzesuniÄ™cie cienia - współrzÄ™dna Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "NIeprzezroczystość cienia" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "PromieÅ„ cienia" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Cienie okien" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Dekoracja okna" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Dekoracje okna" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Typy okien, które majÄ… być dekorowane" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Typy okien, które majÄ… posiadać cieÅ„" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Jasność (w %) nieodpowiadajÄ…cych okien" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "StaÅ‚a prÄ™dkość" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "StaÅ‚y czas" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Przyciemnienie nieodpowiadajÄ…cych okien" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Przyciemnienie okien, które nie odpowiadajÄ… na polecenia menadżera okien" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Sposób zanikania" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Åšciemnianie podczas minimalizacji/otwierania/zamykania" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Szybkość rozjaÅ›niania /Å›ciemniania" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Czas przenikania" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" "Efekt rozjaÅ›niania/Å›ciemniania podczas minimalizacji/otwarcia/zamkniÄ™cia " "okien" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efekt Å›ciemniania przy dzwonku systemowym" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Okna powinny pÅ‚ynnie rozjaÅ›niać siÄ™ podczas ich wyboru i pÅ‚ynnie " "przyciemniać siÄ™ podczas wyboru innego okna." #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Przyciemniaj/rozjaÅ›niaj okna" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "PÅ‚ynne rozjaÅ›nianie/przyciemnianie okien" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "PeÅ‚noekranowy wizualny dzwonek systemowy" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "PeÅ‚noekranowy efekt przyciemnienia przy dzwonku systemowym" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Nasycenie (w %) nieodpowiadajÄ…cych okien" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Jasność nieodpowiadajÄ…cych okien" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Nasycenie nieodpowiadajÄ…cych okien" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Wizualny dzwonek systemowy" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Sposób zanikania okien" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Szybkość zanikania okien w trybie \"StaÅ‚a prÄ™dkość\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Czas zanikania okien (w ms) w trybie \"StaÅ‚a prÄ™dkość\"" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Typy okien, które powinny być poddawane rozjaÅ›nieniu/Å›ciemnieniu" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Punkt montowania" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Punkt montowania" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "System plików użytkownika" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "System plików użytkownika" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "Gconf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Wsteczna kontrola GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "Glib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Wsparcie głównego wÄ™zÅ‚a GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Kompatybilność z Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Otwiera terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Opcje, które zapewniajÄ… kompatybilność Compiza ze Å›rodowiskiem pulpitu Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Dialog Uruchom" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Polecenie terminala" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Polecenie zrzutu ekranu" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "WyÅ›wietl menu główne" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "WyÅ›wietl okno dialogowe \"Uruchom program\"" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "WyÅ›wietl menu główne" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Pobierz zrzut ekranu" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Pobierz zrzut okna" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Polecenie terminala" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Polecenie zrzutu okna" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Prosty sposób zapisu Ini" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Wtyczka powiadamiania o zmianie pliku" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Wsteczna kontrola Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efekt minimalizacji" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimalizuj okna" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Szybkość minimalizacji" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Opóźnienie minimalizacji" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Opór przyciemniania" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Opór cieniowania" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "PrzeksztaÅ‚caj okna podczas minimalizacji i cofania minimalizacji" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Typy okien, które majÄ… być transformowane podczas minimalizacji" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Ogranicz Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Ogranicz współrzÄ™dnÄ… Y do obszaru roboczego" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Nie aktualizuj strony okien serwera dopóki nie przestanie siÄ™ ich poruszać" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Rozpocznij przenoszenie okna" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Leniwe pozycjonowanie" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "PrzenieÅ› okno" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "PrzenieÅ› okno" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Nieprzezroczystość" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Poziom nieprzezroczystoÅ›ci przesuwanych okien" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Odepnij i automatycznie cofnij maksymalizacjÄ™ okien podczas przesuwania" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Odepnij zmaksymalizowane okna" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Rozpocznij przenoszenie okna" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Jasność" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Zmniejszenie jasnoÅ›ci" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "ZwiÄ™kszenie jasnoÅ›ci" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Krok zmiany jasnoÅ›ci" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "WartoÅ›ci jasnoÅ›ci dla okien" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Zmniejsz " #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "ZwiÄ™ksz " #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Zmniejsz nieprzezroczystość" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "ZwiÄ™ksz nieprzezroczystość" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Krok zmiany nieprzezroczystoÅ›ci" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Poziom nieprzezroczystoÅ›ci okien" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Przezroczystość, Jasność i Nasycenie" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Dostosowywanie NieprzezroczystoÅ›ci, JasnoÅ›ci i Nasycenia" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Nasycenie" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Zmniejsz nasycenie" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "ZwiÄ™ksz nasycenie" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Krok zmiany nasycenia " #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "WartoÅ›ci nasycenia dla okien" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Krok zmiany" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Ustawienia konkretnych okien" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "WartoÅ›ci dla okien" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Okna" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Typy okien, które powinny domyÅ›lnie mieć innÄ… jasność" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Typy okien, które powinny domyÅ›lnie mieć innÄ… nieprzezroczystość" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Typy okien, które powinny domyÅ›lnie mieć inne nasycenie" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algorytm używany do rozmieszczenia okien" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Kaskada" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "WyÅ›rodkowany" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Ustalone poÅ‚ożenie okna" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "WymuÅ› uÅ‚ożenie okien" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Poziome pozycje wirtualnych pulpitów" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Utrzymuj na pulpicie" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Utrzymuj wskazane okna na pulpicie , nawet jeÅ›li ich pozycja bÄ™dzie siÄ™ " "różnić od ich okreÅ›lonej pozycji" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Rozmieść okna" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Ułóż na wszystkich wyjÅ›ciach" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Podczas wyboru umieszczaj okna we wÅ‚aÅ›ciwych miejscach" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Tryb rozmieszczenia" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "UÅ‚ożone okna" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Losowy" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "OkreÅ›la jak powino siÄ™ zachowywać rozmieszczenie okien jeÅ›li jest używanych " "wiele urzÄ…dzeÅ„ wyjÅ›cia." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Inteligentny" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Użyj aktywnego urzÄ…dzenia wyjÅ›ciowego" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Użyj urzÄ…dzednia wyjÅ›ciowego na wybranym oknie" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Użyj urzÄ…dzenia wyjÅ›ciowego z kursorem myszy" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Pionowe pozycje wirtualych pulpitów" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Przemieszczenie okien na pulpity" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "ObejÅ›cia problemów z rozmieszczeniem okien" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Typy okien, które powinny być uÅ‚ożone domyÅ›lnie " #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Typy okien, które powinny być domyÅ›lnie uÅ‚ożone na konkretnych pulpitach" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Okna, które powinny być rozmieszczone \"na siłę\", nawet jeÅ›li wskazujÄ…, że " "menadżer okien pominie rozmieszczanie ich" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Okna z ustalonymi pozycjami" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Okna z ustalonymi pulpitami" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "ObejÅ›cia problemów" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Pozycje X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Pozycje wirtualnych pulpitów osi X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "WartoÅ›ci dla pozycji X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Pozycje Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Pozycje wirtualnych pulpitów osi Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "WartoÅ›ci dla pozycji Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Wtyczka Å‚adujÄ…ca obrazki .png" #: ../metadata/regex.xml.in.h:1 #, fuzzy msgid "Regex Matching" msgstr "Przełącz przypinanie okien" #: ../metadata/regex.xml.in.h:2 #, fuzzy msgid "Regex window matching" msgstr "Przełącz przypinanie okien" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "PrzyporzÄ…dkowanie klawiszy" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Kolor brzegów" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Kolor brzegów używany dla trybow zmiany rozmiarów z obrysem oraz z obrysem i " "wypenieniem" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "DomyÅ›lny ryb zmiany zmiaru" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "DomyÅ›lny tryb używany podczas zmiany rozmiaru okna" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Kolor wypeÅ‚niania" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Kolor wypeÅ‚nienia dla prostokÄ…tnego trybu zmiany wielkoÅ›ci" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Rozpocznij normalnÄ… zmianÄ™ rozmiarów okna" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Rozpocznij zmianÄ™ rozmiarów zewnÄ™trznego okna" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Rozpocznij prostokÄ…tnÄ… zmianÄ™ rozmiarów okna" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Rozpocznij zmianÄ™ rozmiarów okna poprzez rozciÄ…ganie" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Rozpocznij zmianÄ™ rozmiarów okna" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Normalna zmiana rozmiaru okna" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Kontur" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Zmiana rozmiaru konturu okna" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "ProstokÄ…t" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "ProstokÄ…tna zmiana rozmiaru okna" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "ZmieÅ„ rozmiar okna" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "ZmieÅ„ rozmiar okna" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Rozpocznij zmianÄ™ rozmiaru okna" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Rozpocznij zmianÄ™ rozmiaru okna poprzez rozciÄ…ganie" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Rozpocznij normalnÄ… zmianÄ™ rozmiarów okna" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Rozpocznij zmianÄ™ rozmiaru okna poprzez kontur okna" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Rozpocznij prostokÄ…tnÄ… zmianÄ™ rozmiaru okna" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "RozciÄ…gnij" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "ZmieÅ„ rozmiar okna poprzez rozciÄ…ganie" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Typy okien, których rozmiar ma być zmieniany w standardowy sposób" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Typy okien, których rozmiar ma być zmieniany poprzez kontur okna" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Typy okien, których rozmiar ma być zmieniany w prostokÄ…tny sposób" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Typy okien, których rozmiar ma być zmieniany poprzez rozciÄ…ganie" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Przełączanie krawÄ™dziami - przeciÄ…gnij i upuść" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Przełączanie krawÄ™dziami - przenoszenie" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Przełączanie widoków za pomocÄ… wskaźnika" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Czas przełączania" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Przewróć do lewego pulpitu i zakrzyw kursor" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Przewróć do nastÄ™pnego pulpitu podczas przeciÄ…gania obiektów na krawÄ™dź " "ekranu" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Przewróć do nastÄ™pnego pulpitu podczas przesuwania wskaźnika na krawÄ™dź " "ekranu" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Przewróć do nastÄ™pnego pulpitu podczas przesuwania okien na krawÄ™dź ekranu" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Przewróć do prawego wirtualnego pulpitu i zakrzyw kursor" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Odwróć oÅ› Y dla ruchu wskaźnika" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Odwrócenie osi Y dla wskaźnika" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "CzuÅ‚ość wskaźnika" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "PodnoÅ› podczas obracania " #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "PodnoÅ› okna podczas obracania" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Obróć kostkÄ™" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Obróć i przełącz w lewo" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Obróć i przełącz w prawo" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Obróć w lewo" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Obróć w lewo z oknem" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Obróć w prawo" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Obróć w prawo z oknem" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Obróć do" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Obróć do Å›ciany 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Obróć do Å›ciany 1 z oknem" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Obróć do Å›ciany 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Obróć do Å›ciany 10 z oknem" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Obróć do Å›ciany 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Obróć do Å›ciany 11 z oknem" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Obróć do Å›ciany 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Obróć do Å›ciany 12 z oknem" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Obróć do Å›ciany 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Obróć do Å›ciany 2 z oknem" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Obróć do Å›ciany 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Obróć do Å›ciany 3 z oknem" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Obróć do Å›ciany 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Obróć do Å›ciany 4 z oknem" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Obróć do Å›ciany 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Obróć do Å›ciany 5 z oknem" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Obróć do Å›ciany 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Obróć do Å›ciany 6 z oknem" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Obróć do Å›ciany 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Obróć do Å›ciany 7 z oknem" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Obróć do Å›ciany 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Obróć do Å›ciany 8 z oknem" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Obróć do Å›ciany 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Obróć do Å›ciany 9 z oknem" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Obracanie kostki" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Obróć kostkÄ™ pulpitu" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Obróć w lewo" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Obróć w lewo i przenieÅ› aktywne okno" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Obróć w prawo" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Obróć w prawo i przenieÅ› aktywne okno" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Obrót do Å›ciany" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Obrót do Å›ciany z oknem" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Obróć do Å›ciany 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Obróć do Å›ciany 1 i przenieÅ› tam aktywne okno" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Obróć do Å›ciany 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Obróć do Å›ciany 10 i przenieÅ› tam aktywne okno" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Obróć do Å›ciany 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Obróć do Å›ciany 11 i przenieÅ› tam aktywne okno" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Obróć do Å›ciany 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Obróć do Å›ciany 12 i przenieÅ› tam aktywne okno" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Obrót do Å›ciany 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Obróć do Å›ciany 2 i przenieÅ› tam aktywne okno" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Obróć do Å›ciany 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Obróć do Å›ciany 3 i przenieÅ› tam aktywne okno" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Obróć do Å›ciany 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Obróć do Å›ciany 4 i przenieÅ› tam aktywne okno" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Obróć do Å›ciany 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Obróć do Å›ciany 5 i przenieÅ› tam aktywne okno" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Obróć do Å›ciany 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Obróć do Å›ciany 6 i przenieÅ› tam aktywne okno" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Obróć do Å›ciany 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Obróć do Å›ciany 7 i przenieÅ› tam aktywne okno" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Obróć do Å›ciany 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Obróć do Å›ciany 8 i przenieÅ› tam aktywne okno" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Obróć do Å›ciany 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Obróć do Å›ciany 9 i przenieÅ› tam aktywne okno" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Obraca do pulpitu" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Obracaj okno" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Obraca z oknem" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Przyspieszenie obrotu" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Szybkość obrotu" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Opóźnienie obrotu" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Przybliżenie obrotu" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "CzuÅ‚ość ruchu wskaźnika" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Przypnij obrót kostki do dolnej Å›ciany" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Przypnij obrót kostki do górnej Å›ciany" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Przypnij do dolnej Å›ciany" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Przypnij do górnej Å›ciany" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Rozpocznij obrót" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Czas przed przełączeniem wirtualnych pulpitów" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "PowiÄ™kszenie" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "StopieÅ„ nieprzezroczystoÅ›ci w procentach" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Duży" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "NaciÅ›nij na Pulpit by pokazać Pulpit" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Przyciemnij tÅ‚o" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Przyciemnij tÅ‚o podczas skalowania okien" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblemat" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "Pokaż Pulpit kiedy kliknie siÄ™ na Pulpit podczas Szybkiego Wyboru" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Czas wyboru okna" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Rozpocznij przeglÄ…danie okien" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Rozpocznij przeglÄ…danie wszystkich okien" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Rozpocznij przeglÄ…danie grupy okien" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Inicjuj wybór okien dla okien z bieżącego wyjÅ›cia" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Rozmieść i zacznij przeksztaÅ‚cać okna" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Rozmieść i zacznij przeksztaÅ‚cać grupÄ™ okien" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Rozmieść i zacznij przeksztaÅ‚cać okna" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Rozmieść i zacznij przeksztaÅ‚cać okna w bieżącym widoku" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Na wszystkich urzÄ…dzeniach wyjÅ›ciowych" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Na aktualnym urzÄ…dzeniu wyjÅ›ciowym" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Ikona okna" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Nałóż ikonÄ™ na okna podczas Szybkiego Wyboru" # To NIE jest skalowanie - zmiana rozmiaru #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Szybki Wybór" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Szybki Wybór Okien" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Szybkość szybkiego wyboru" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Krok czasu szybkiego wyboru" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Szybki wybór okien" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Decyduje gdzie okna sÄ… umieszczane do wyboru jeÅ›li jest używanych wiele " "urzÄ…dzeÅ„ wyjÅ›cia" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "OdstÄ™p miÄ™dzy oknami" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "OdstÄ™py" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Czas (w ms) zatrzymania kursora nad oknem, po którym zakoÅ„czony bÄ™dzie tryb " "skalowania" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Typy okien, które majÄ… być poddawane szybkiemu wyborowi w tym trybie" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Automatycznie otwiera zrzut ekrany w tym programie" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Katalog" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Rozpocznik prostokÄ…tny zrzut ekranu" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Uruchom program" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Umieszcza zrzuty ekranu w tym katalogu" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Zrzut ekranu" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Wtyczka zrzutów ekranu" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Wtyczka Å‚adujÄ…ca obrazki .svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "StopieÅ„ jasnoÅ›ci w procentach" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "StopieÅ„ nasycenia w procentach" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Przełącznik aplikacji" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automatycznie obracaj" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "PrzenieÅ› na pierwszy plan" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "PrzenoÅ› wybrane okno na wierzch" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Oddalenie pulpitu podczas przełączania okien" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikona" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Zminimalizowane" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "NastÄ™pny panel" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "NastÄ™pne okno" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "NastÄ™pne okno (wszystkie okna)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "NastÄ™pne okno (bez pop-upów)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Okno przełączania gdy niewidoczne i wybór nastÄ™pnego okna" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Okno przełączania gdy niewidoczne i wybór nastÄ™pnego okna spoÅ›ród wszystkich" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Okno przełączania gdy niewidoczne i wybór poprzedniego okna" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Okno przełączania gdy niewidoczne i wybór poprzedniego okna spoÅ›ród " "wszystkich" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Poprzedni panel" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Poprzednie okno" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Poprzednie okno (wszystkie okna)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Poprzednie okno (bez pop-upów)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Obracaj do wybranego okna podczas przełączania" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Wybierz nastÄ™pny typ panelu okna" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Wybierz nastÄ™pne okno bez pokazywania wyskakujÄ…cego okienka." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Wybierz poprzedni typ panelu okna" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Wybierz poprzednie okno bez pokazywania wyskakujÄ…cego okienka." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "WyÅ›wietl ikonÄ™ obok miniaturki" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "WyÅ›wietl zminimalizowan okna" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Szybkość przełącznika" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Krok czasu przełącznika" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Zmieniacz okien" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Typy okien, które majÄ… być pokazywane w zmieniaczu" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Zapewnij wsparcie dla przestrzeni kolorów YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Odtwarzanie video" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Odtwarzanie video" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "PrzestrzeÅ„ kolorów YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Dodaj liniÄ™" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Dodaj punkt" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Dodaje efekty wodne do różnych operacji na pulpicie" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Opóźnienie (w ms) pomiÄ™dzy każdÄ… kroplÄ… deszczu" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Włącz wodne efekty wskaźnika" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Linia" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Skala przesuniÄ™cia" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punkt" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Opóźnienie deszczu" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Fala tytuÅ‚u" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Przełącz deszcz" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Przełącz efekt deszczu" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Przełącz wycieraczkÄ™" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Przełącza efekt wycieraczki" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efekt wodny" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Skala przesuniÄ™cia wody" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efekt fali od tytuÅ‚u okna" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efekt wybierania" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efekt wybierania okna" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Rodzaje wybieranych okien" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Tarcie" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Rodzaje chwytanych okien" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Rozdzielczość siatki" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Odwrócone przyciÄ…ganie okien" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "PotrzÄ…saj oknami" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efekt mapowania" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Efekt mapowania okna" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Rodzaje mapowanych okien" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efekt maksymalizacji" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Minimalny wymiar siatki" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimalny rozmiar siatki werteksu" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "PrzenieÅ› okna" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Drgania" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Odwróć przyciÄ…ganie" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Przypnij okna" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Współczynnik tarcia" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Współczynik sprężystoÅ›ci" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Współczynnik sprężystoÅ›ci" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Przełącz przypinanie okien" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Wykorzystaj model sprężysty dla efektu drgajÄ…cych okien" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Rozdzielczość siatki werteksu" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Typy okien, które majÄ… drgać po aktywacji" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Typy okien, które majÄ… drgać po chwyceniu" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Typy okien, które majÄ… drgać po mapowaniu" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Typy okien, które majÄ… drgać podczas przesuwania" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efekt drgania podczas maksymalizacji i demaksymalizacji okien" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "DrgajÄ…ce okna" #~ msgid "Command line 0" #~ msgstr "Linia poleceÅ„ 0" #~ msgid "Run command 0" #~ msgstr "Wykonaj polecenie 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Polecenie zrzutu ekranu" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Polecenie zrzutu ekranu" #~ msgid "Filter Linear" #~ msgstr "Filtruj liniowo" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Używaj filtru liniowego podczas powiÄ™kszania" #~ msgid "Zoom Desktop" #~ msgstr "PowiÄ™kszanie pulpitu" #~ msgid "Zoom In" #~ msgstr "PowiÄ™ksz" #~ msgid "Zoom Out" #~ msgstr "Pomniejsz" #~ msgid "Zoom Pan" #~ msgstr "PowiÄ™ksz" #~ msgid "Zoom Speed" #~ msgstr "Szybkość przybliżania" #~ msgid "Zoom Timestep" #~ msgstr "Opóźnienie przybliżania" #~ msgid "Zoom and pan desktop cube" #~ msgstr "PowiÄ™ksz i przesuÅ„ kostkÄ™ pulpitu" #~ msgid "Zoom factor" #~ msgstr "Współczynnik przybliżania" #~ msgid "Zoom pan" #~ msgstr "PowiÄ™ksz" #~ msgid "Decrease window opacity" #~ msgstr "Zmniejsz nieprzezroczystość okna" #~ msgid "Increase window opacity" #~ msgstr "ZwiÄ™ksz nieprzezroczystość okna" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "WartoÅ›ci nieprzezroczystoÅ›ci okien które powinny być domyÅ›lnie " #~ "półprzezroczyste" #~ msgid "Opacity window values" #~ msgstr "WartoÅ›ci nieprzezroczystoÅ›ci okien" #~ msgid "Opacity windows" #~ msgstr "Nieprzezroczystość okien" #~ msgid "Background Images" #~ msgstr "Obrazki tÅ‚a" #~ msgid "Background images" #~ msgstr "Obrazki tÅ‚a" #~ msgid "Place windows on a plane" #~ msgstr "Umieszczaj okna na pÅ‚aszczyźnie" #~ msgid "Plane Down" #~ msgstr "PÅ‚aszczyzna dolna" #~ msgid "Plane Left" #~ msgstr "Lewa pÅ‚aszczyzna" #~ msgid "Plane Right" #~ msgstr "Prawa pÅ‚aszczyzna" #~ msgid "Plane To Face 1" #~ msgstr "PÅ‚aszczyzna do Å›ciany 1" #~ msgid "Plane To Face 10" #~ msgstr "PÅ‚aszczyzna do Å›ciany 10" #~ msgid "Plane To Face 11" #~ msgstr "PÅ‚aszczyzna do Å›ciany 11" #~ msgid "Plane To Face 12" #~ msgstr "PÅ‚aszczyzna do Å›ciany 12" #~ msgid "Plane To Face 2" #~ msgstr "PÅ‚aszczyzna do Å›ciany 2" #~ msgid "Plane To Face 3" #~ msgstr "PÅ‚aszczyzna do Å›ciany 3" #~ msgid "Plane To Face 4" #~ msgstr "PÅ‚aszczyzna do Å›ciany 4" #~ msgid "Plane To Face 5" #~ msgstr "PÅ‚aszczyzna do Å›ciany 5" #~ msgid "Plane To Face 6" #~ msgstr "PÅ‚aszczyzna do Å›ciany 6" #~ msgid "Plane To Face 7" #~ msgstr "PÅ‚aszczyzna do Å›ciany 7" #~ msgid "Plane To Face 8" #~ msgstr "PÅ‚aszczyzna do Å›ciany 8" #~ msgid "Plane To Face 9" #~ msgstr "PÅ‚aszczyzna do Å›ciany 9" #~ msgid "Plane Up" #~ msgstr "PÅ‚aszczyzna górna" #~ msgid "Plane down" #~ msgstr "PÅ‚aszczyzna u doÅ‚u" #~ msgid "Plane left" #~ msgstr "PÅ‚aszczyzna z lewej strony" #~ msgid "Plane right" #~ msgstr "PÅ‚aszczyzna z prawej strony" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "PÅ‚aszczyzna do Å›ciany 1" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "PÅ‚aszczyzna do Å›ciany 10" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "PÅ‚aszczyzna do Å›ciany 11" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "PÅ‚aszczyzna do Å›ciany 12" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "PÅ‚aszczyzna do Å›ciany 2" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "PÅ‚aszczyzna do Å›ciany 3" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "PÅ‚aszczyzna do Å›ciany 4" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "PÅ‚aszczyzna do Å›ciany 5" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "PÅ‚aszczyzna do Å›ciany 6" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "PÅ‚aszczyzna do Å›ciany 7" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "PÅ‚aszczyzna do Å›ciany 8" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "PÅ‚aszczyzna do Å›ciany 9" #~ msgid "Plane up" #~ msgstr "PÅ‚aszczyzna u góry" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Czas zanikania nieprzezroczystoÅ›ci okna pulpitu" #~ msgid "Open window menu" #~ msgstr "Otwórz menu okna" #~ msgid "Dock" #~ msgstr "Obszar dokowania" #~ msgid "Toolbar" #~ msgstr "Pasek narzÄ™dzi" #~ msgid "Menu" #~ msgstr "Menu" #~ msgid "Utility" #~ msgstr "NarzÄ™dziowe" #~ msgid "Splash" #~ msgstr "Splash" #~ msgid "Dialog" #~ msgstr "Okno dialogowe" #~ msgid "DropdownMenu" #~ msgstr "Menu" #~ msgid "PopupMenu" #~ msgstr "Menu kontekstowe" #~ msgid "Tooltip" #~ msgstr "Podpowiedź" #~ msgid "Notification" #~ msgstr "Powiadomienie" #~ msgid "Combo" #~ msgstr "Menu rozwijalne" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "Okno modalne" #~ msgid "Fullscreen" #~ msgstr "PeÅ‚ny ekran" #~ msgid "Unknown" #~ msgstr "Nieznane" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "StopieÅ„ jasnoÅ›ci w procentach" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "StopieÅ„ nieprzezroczystoÅ›ci w procentach" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "StopieÅ„ nasycenia w procentach" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Nasycenie" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Opóźnienie (w ms) pomiÄ™dzy każdÄ… kroplÄ… deszczu" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "Oddalenie pulpitu podczas przełączania okien" #~ msgid "Do not modify" #~ msgstr "Bez zmian" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "PrzesuniÄ™cie cienia w osi X" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "PrzesuniÄ™cie cienia w osi Y" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Nieprzezroczystość cienia" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "PromieÅ„ cienia" #, fuzzy #~ msgid "Filter method used for blurring (4xBilinear, Gaussian, Mipmap)" #~ msgstr "Metoda filtrowania dla rozmycia" #, fuzzy #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Efekt wybierania okna" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Zapobieganie uaktywnianiu" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Przyspieszenie zwijania" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Szybkość zwijania" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Opóźnienie zwijania" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "PromieÅ„ dla rozmycia gaussowskiego" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Rozmywanie gaussowskie" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "InterwaÅ‚ przed podnoszeniem wskazanych okien" #, fuzzy #~ msgid "Interval between ping messages (1000-30000)" #~ msgstr "Czas pomiÄ™dzy wiadomoÅ›ciami ping" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "Rozmieść i zacznij przeksztaÅ‚cać okna w bieżącym widoku" #, fuzzy #~ msgid "Line width for annotations (0.0-100.0)" #~ msgstr "Szerokość linii przy rysowaniu" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Efekt mapowania okna" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Szybkość minimalizacji" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Opóźnienie minimalizacji" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Minimalny rozmiar siatki werteksu" #, fuzzy #~ msgid "Mipmap level-of-detail (0.0-5.0)" #~ msgstr "Poziom szczegółów mipmapy" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Ilość wirtualnych pulpitów" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Krok zmiany nieprzezroczystoÅ›ci" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Poziom nieprzezroczystoÅ›ci przesuwanych okien" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Poziom nieprzezroczystoÅ›ci przesuwanych okien" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "NakÅ‚adanie ikony na skalowane okna" #~ msgid "Plugins that this must load before" #~ msgstr "Wtyczki, które muszÄ… zostać zaÅ‚adowane przed" #~ msgid "Plugins that this requires" #~ msgstr "Wtyczki wymagane przez ten element" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Okno przełączania gdy niewidoczne i wybór nastÄ™pnego okna spoÅ›ród " #~ "wszystkich" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Okno przełączania gdy niewidoczne i wybór nastÄ™pnego okna spoÅ›ród " #~ "wszystkich" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Okno przełączania gdy niewidoczne i wybór poprzedniego okna spoÅ›ród " #~ "wszystkich" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Okno przełączania gdy niewidoczne i wybór poprzedniego okna spoÅ›ród " #~ "wszystkich" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Przyspieszenie obrotu" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Szybkość obrotu" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Opóźnienie obrotu" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Szybkość skalowania" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Opóźnienie skalowania" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "Mnożnik poziomego rozmiaru ekranu dla rozmiaru wirtualnego" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "Mnożnik pionowego rozmiaru ekranu dla rozmiaru wirtualnego" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "CzuÅ‚ość ruchu wskaźnika" #, fuzzy #~ msgid "Shade resistance (0-100)" #~ msgstr "Opór cieniowania" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "OdstÄ™p miÄ™dzy oknami" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Współczynnik tarcia" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Współczynnik sprężystoÅ›ci" #, fuzzy #~ msgid "Stroke width for annotations (0.0-20.0)" #~ msgstr "Szerokość pÄ™dzla przy rysowaniu" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Szybkość przełącznika" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Opóźnienie przełącznika" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Filtrowanie tekstur" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "CzÄ™stotliwość przerysowywania ekranu (razy na sekundÄ™)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Czas (w ms) zatrzymania kursora nad oknem, po którym zakoÅ„czony bÄ™dzie " #~ "tryb skalowania" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Czas przed przełączeniem widoku" #~ msgid "USe linear filter when zoomed in" #~ msgstr "Używaj filtru liniowego podczas powiÄ™kszania" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Rozdzielczość siatki werteksu" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Skala przesuniÄ™cia wody" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Szybkość rozmywania okien" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Szybkość pÅ‚ynnego pojawiania siÄ™/zanikania okien" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Typy okien, które majÄ… być rozmywane" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Typy okien, które majÄ… być rozmywane" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Typy okien, które majÄ… zanikać" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Typy okien, które majÄ… zanikać" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "Typy okien, które majÄ… być skalowane w trybie skalowania" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Typy okien, które majÄ… być pokazywane do zmieniania" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Typy okien, które majÄ… być transformowane podczas minimalizacji" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Typy okien, które majÄ… być rozmywane" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Typy okien, które majÄ… drgać po aktywacji" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "Typy okien, które majÄ… drgać po chwyceniu" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Typy okien, które majÄ… drgać po mapowaniu" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Typy okien, które majÄ… drgać podczas przesuwania" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Szybkość przybliżania" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Opóźnienie przybliżania" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Współczynnik przybliżania" #~ msgid "." #~ msgstr "," #~ msgid "Plane To Face %d" #~ msgstr "PÅ‚aszczyzna do Å›ciany %d" #~ msgid "Plane to face %d" #~ msgstr "PÅ‚aszczyzna do Å›ciany %d" #~ msgid "Plane To Face %d with Window" #~ msgstr "PÅ‚aszczyzna do Å›ciany %d z oknem" #~ msgid "Plane to face %d and bring active window along" #~ msgstr "PÅ‚aszczyzna do Å›ciany %d i przeniesienie tam aktywnego okna" #~ msgid "Rotate To Face %d" #~ msgstr "Obróć do Å›ciany %d" #~ msgid "Rotate to face %d" #~ msgstr "Obrót do Å›ciany %d" #~ msgid "Rotate To Face %d with Window" #~ msgstr "Obróć do Å›ciany %d z oknem" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "Obrót do Å›ciany %d i przeniesienie tam aktywnego okna" #~ msgid "Move Window Types" #~ msgstr "Rodzaje przenoszonych okien" compiz-0.9.11+14.04.20140409/po/bn.po0000644000015301777760000035645312321343002017067 0ustar pbusernogroup00000000000000# Hindi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Prasanth Kurian # msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-01-03 03:23+0100\n" "Last-Translator: Mahdee Jameel \n" "Language-Team: gist bengali team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "ডেসà§à¦•টপ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "উইনà§à¦¡à§‹ পরিচালনা" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "কমপিজ" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "কিছৠনা" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "সà§à¦•à§à¦¯à¦¾à¦¨à¦¾à¦°" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "বড় করা" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে অনà§à¦­à§‚মিকভাবে বড় করা" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে উলà§à¦²à¦®à§à¦¬à¦­à¦¾à¦¬à§‡ বড় করা" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "ছোট করা হয়েছে" # সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ আপডেট" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "উইনà§à¦¡à§‹ মেনà§" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "উইনà§à¦¡à§‹ শীরà§à¦·à¦¬à¦¾à¦°à§‡ মাউস হà§à¦‡à¦² সà§à¦•à§à¦°à¦² করার সময় কারà§à¦¯ করা হবে" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° পà§à¦°à¦•ৃতি" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "মেটাসিটি বিষয় সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "মেটাসিটি বিষয় সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° শেড" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "মেটাসিটি বিষয় অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "মেটাসিটি বিষয় অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° শেড" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "মেটাসিটি বিষয় অলঙà§à¦•রণ সহ সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à§Ÿ বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° জনà§à¦¯ অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "মেটাসিটি বিষয় অলঙà§à¦•রণে বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° জনà§à¦¯ অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "অসà§à¦¬à¦šà§à¦› থেকে অরà§à¦§à¦¸à§à¦¬à¦šà§à¦› মেটাসিটি বিষয় অলঙà§à¦•রণ সহ শেড সকà§à¦°à¦¿à§Ÿà¦•রণ" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "অসà§à¦¬à¦šà§à¦› থেকে অরà§à¦§à¦¸à§à¦¬à¦šà§à¦› মেটাসিটি বিষয় অলঙà§à¦•রণ সহ শেড সকà§à¦°à¦¿à§Ÿà¦•রণ" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "শীরà§à¦· বার মাউস হà§à¦‡à¦²à§‡à¦° কারà§à¦¯" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "উইনà§à¦¡à§‹ অলঙà§à¦•রণের সময় অসà§à¦ªà¦·à§à¦Ÿà¦¤à¦¾à¦° পà§à¦°à¦•ার" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "মেটাসিটি বিষয় বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "উইনà§à¦¡à§‹ অলঙà§à¦•রণ করার সময় মেটাসিটি বিষয় বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "উইনà§à¦¡à§‹ বনà§à¦§ করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "উইনà§à¦¡à§‹ সরà§à¦¬à¦¾à¦§à¦¿à¦• না করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "উইনà§à¦¡à§‹ বড় করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿ ছোট করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦Ÿ" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦Ÿ পূরà§à¦£ রঙ" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦¶à¦¨à§‡à¦° সà§à¦Ÿà§à¦°à§‹à¦•ের রঙ" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦Ÿ পà§à¦²à¦¾à¦— ইন" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "পরিষà§à¦•ার করা" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "অঙà§à¦•ন করা" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "টà§à¦²à§‡à¦° সাহাযà§à¦¯à§‡ অঙà§à¦•ন করা" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦¶à¦¨ পূরà§à¦£ করার রঙ" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "শà§à¦°à§ " #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "ভারত" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "ভারত" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "ভারত" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "রেখার বিসà§à¦¤à¦¾à¦°" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦¶à¦¨à§‡à¦° লাইনের পà§à¦°à¦¸à§à¦¥" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦¶à¦¨à§‡à¦° সà§à¦Ÿà§à¦°à§‹à¦•ের রঙ" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "সà§à¦Ÿà§à¦°à§‹à¦•ের পà§à¦°à¦¸à§à¦¥" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦¶à¦¨à§‡à¦° সà§à¦Ÿà§à¦°à§‹à¦•ের পà§à¦°à¦¸à§à¦¥" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "ফিলà§à¦Ÿà¦¾à¦°:" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "আলফা অসà§à¦ªà¦·à§à¦Ÿ" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "বাদ দেয়া হয়েছে\n" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "বাদ দেয়া হয়েছে\n" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "অসà§à¦ªà¦·à§à¦Ÿ উইনà§à¦¡à§‹" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "উইনà§à¦¡à§‹à¦° অরà§à¦§à¦¸à§à¦¬à¦šà§à¦› অংশের পিছনের অসà§à¦ªà¦·à§à¦Ÿà¦¤à¦¾" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦¤à§‡ ফোকাস নেই সেগà§à¦²à¦¿à¦•ে অসà§à¦ªà¦·à§à¦Ÿ করা " #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "অনà§à¦¯à¦¾à¦¨à§à¦¯ উইনà§à¦¡à§‹ দà§à¦¬à¦¾à¦°à¦¾ অসà§à¦ªà¦·à§à¦Ÿ করা সà§à¦•à§à¦°à¦¿à¦¨à§‡à¦° অংশগà§à¦²à¦¿à¦° অসà§à¦ªà¦·à§à¦Ÿà¦¤à¦¾à¦•ে অসমরà§à¦¥ করা." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "অসà§à¦ªà¦·à§à¦Ÿ করার জনà§à¦¯ ফিলà§à¦Ÿà¦¾à¦° করার পদà§à¦§à¦¤à¦¿" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "ফোকাস অসà§à¦ªà¦·à§à¦Ÿ" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "ফোকাস অসà§à¦ªà¦·à§à¦Ÿ করার উইনà§à¦¡à§‹" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "মিপমà§à¦¯à¦¾à¦ª" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "মিপমà§à¦¯à¦¾à¦ª LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "মিপমà§à¦¯à¦¾à¦ªà§‡à¦° বিশদরূপের-সà§à¦¤à¦°" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "পালস" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "পালস পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "উইনà§à¦¡à§‹à¦° অসà§à¦ªà¦·à§à¦Ÿà¦•রণের গতি" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "ফোকাস বার দà§à¦¬à¦¾à¦°à¦¾ যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ পà§à¦°à¦­à¦¾à¦¬à¦¿à¦¤ হবে" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ আলফা অসà§à¦ªà¦·à§à¦Ÿà¦¤à¦¾ বà§à¦¯à¦¬à¦¹à¦¾à¦° করবে" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "সমরূপ আউটপà§à¦Ÿ" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "ভারত" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "আউটপà§à¦Ÿ সমরূপ পরিচালক" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶ 0 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶1 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶10 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶11 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶ 2 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶3 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶4 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶5 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶6 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶7 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶8 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶9 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶ 0 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶1 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶10 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶11 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶ 2 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶3 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶4 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶5 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶6 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶7 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶8 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶9 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶ 0 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶1 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶10 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶11 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶ 2 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶3 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶4 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶5 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶6 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶7 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶8 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶9 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "যখন run_command0 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "যখন run_command1 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "যখন run_command10 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "যখন run_command11 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "যখন run_command2 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "যখন run_command3 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "যখন run_command4 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "যখন run_command5 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "যখন run_command6 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "যখন run_command7 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "যখন run_command8 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "যখন run_command9 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "সকà§à¦°à¦¿à§Ÿ পà§à¦²à¦¾à¦—ইনগà§à¦²à¦¿" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "অফসà§à¦•à§à¦°à¦¿à¦¨ পিকà§à¦¸à¦®à§à¦¯à¦¾à¦ªà§‡ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¿à¦¤ না করার জনà§à¦¯ পূরà§à¦£à¦¸à§à¦•à§à¦°à¦¿à¦¨ উইনà§à¦¡à§‹ অঙà§à¦•ন সমà§à¦®à¦¤ করা" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "শà§à¦°à¦¬à¦£à¦¯à§‹à¦—à§à¦¯ বেল" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "শà§à¦°à¦¬à¦£à¦¯à§‹à¦—à§à¦¯ সিসà§à¦Ÿà§‡à¦® বিপ" # সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ আপডেট" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "সà§à¦¬à§Ÿà¦‚-বৃদà§à¦§à¦¿ বিলমà§à¦¬" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "আউটপà§à¦Ÿ ডিভাইসের সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿ সনà§à¦§à¦¾à¦¨" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "পà§à¦¨à¦ƒà¦¸à¦œà§€à¦¬ মাতà§à¦°à¦¾à¦° সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿ সনà§à¦§à¦¾à¦¨" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "সরà§à¦¬à§‹à¦¤à§à¦¤à¦®" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ফোকাসে কà§à¦²à¦¿à¦• করà§à¦¨" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "উইনà§à¦¡à§‹à§Ÿ কà§à¦²à¦¿à¦• করে তাতে ইনপà§à¦Ÿà§‡ ফোকাস করà§à¦¨" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ বনà§à¦§ করà§à¦¨" # button label #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "ডিফলà§à¦Ÿ (&e)" # progress stage title #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "ডিফলà§à¦Ÿ উইনà§à¦¡à§‹ মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦° আরামà§à¦­ করা হচà§à¦›à§‡" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "ডেসà§à¦•টপ ঘনক" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "আউটপà§à¦Ÿ সনà§à¦§à¦¾à¦¨" # headline for dialog "Select for update" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "পরিবরà§à¦§à¦¨à§‡à¦° জনà§à¦¯ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "দà§à¦°à§à¦¤" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "ফোকাস পà§à¦°à¦¤à¦¿à¦°à§‹à¦§à§‡à¦° উইনà§à¦¡à§‹" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "ফোকাস পà§à¦°à¦¤à¦¿à¦°à§‹à¦§à§‡à¦° উইনà§à¦¡à§‹" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "ফোকাস পà§à¦°à¦¤à¦¿à¦°à§‹à¦§à§‡à¦° উইনà§à¦¡à§‹" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "সাধারণ বিকলà§à¦ª" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "সাধারণ কমপিজ বিকলà§à¦ª" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "ভালো" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "টাসà§à¦•বার উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ বাদ দেওয়া গোপন করা" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "সব উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ গোপন করা à¦à¦¬à¦‚ ডেসà§à¦•টপে ফোকাস করা" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "ডেসà§à¦•টপ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ পà§à¦°à¦£à¦¾à¦²à§€à¦¤à§‡ পà§à¦°à¦¬à§‡à¦¶ করার সময় টাসà§à¦•বারে নেই à¦à¦°à¦•ম উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ গোপন করà§à¦¨" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "অনà§à¦­à§‚মিক ভারà§à¦šà§à§Ÿà¦¾à¦² আকার" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "বড় করার হলে ইঙà§à¦—িতগà§à¦²à¦¿ অগà§à¦°à¦¾à¦¹à§à¦¯ করা" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "উইনà§à¦¡à§‹ বড় করার সময় আকার বৃদà§à¦§à¦¿ à¦à¦¬à¦‚ আকৃতির ইঙà§à¦—িত অগà§à¦°à¦¾à¦¹à§à¦¯ করà§à¦¨" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦•ে তোলার আগে বà§à¦¯à¦¬à¦§à¦¾à¦¨" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "পিং বারà§à¦¤à¦¾à¦—à§à¦²à¦¿à¦° মধà§à¦¯à§‡ বà§à¦¯à¦¬à¦§à¦¾à¦¨" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "আলোকপাত" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "বরà§à¦¤à¦®à¦¾à¦¨à§‡ সকà§à¦°à¦¿à§Ÿ পà§à¦²à¦¾à¦—ইনের তালিকা" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "আউটপà§à¦Ÿ ডিভাইস বরà§à¦£à¦¨à¦¾à¦•ারী সà§à¦Ÿà§à¦°à¦¿à¦‚য়ের তালিকা" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "নিচের উইনà§à¦¡à§‹" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "অনà§à¦¯à¦¾à¦¨à§à¦¯ উইনà§à¦¡à¦—à§à¦²à¦¿à¦° নিচে উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে নামিয়ে দিন" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে অনà§à¦­à§‚মিকভাবে বড় করা" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে উলà§à¦²à¦®à§à¦¬à¦­à¦¾à¦¬à§‡ বড় করা" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ বড় করা" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে অনà§à¦­à§‚মিকভাবে বড় করা" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে উলà§à¦²à¦®à§à¦¬à¦­à¦¾à¦¬à§‡ বড় করা" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ ছোট করা" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "সà§à¦¬à¦¾à¦­à¦¾à¦¬à¦¿à¦•" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "ডেসà§à¦•টপের সংখà§à¦¯à¦¾" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "ভারà§à¦šà§à§Ÿà¦¾à¦² ডেসà§à¦•টপের সংখà§à¦¯à¦¾" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "উলà§à¦²à¦®à§à¦¬ ফাà¦à¦•া পরà§à¦¯à¦¾à§Ÿà§‡ শà§à¦§à§à¦®à¦¾à¦¤à§à¦° সà§à¦•à§à¦°à¦¿à¦¨ আপডেট সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "আউটপà§à¦Ÿà¦—à§à¦²à¦¿" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "পিং বিলমà§à¦¬" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "কà§à¦²à¦¿à¦• করে বৃদà§à¦§à¦¿ করà§à¦¨" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "উইনà§à¦¡à§‹ তà§à¦²à§‡ ধরা" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "বà§à¦¯à¦¬à¦§à¦¾à¦¨à§‡à¦° পরে নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে তà§à¦²à§‡ ধরà§à¦¨" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "অনà§à¦¯à¦¾à¦¨à§à¦¯ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° ওপরে উইনà§à¦¡à§‹ তà§à¦²à§‡ ধরা" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "কà§à¦²à¦¿à¦• করা হলে উইনà§à¦¡à§‹à¦Ÿà¦¿ তà§à¦²à§‡ ধরা" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "পà§à¦¨à¦°à¦¾à§Ÿ তালিকা পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করো (&R)" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "অনà§à¦­à§‚মিক ভারà§à¦šà§à§Ÿà¦¾à¦² আকারের জনà§à¦¯ সà§à¦•à§à¦°à¦¿à¦¨ আকারের গà§à¦£à¦¿à¦¤à¦•" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "উলà§à¦²à¦®à§à¦¬ ভারà§à¦šà§à§Ÿà¦¾à¦² আকারের জনà§à¦¯ সà§à¦•à§à¦°à¦¿à¦¨ আকারের গà§à¦£à¦¿à¦¤à¦•" # label text #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "সময়" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "সবগà§à¦²à§‹ পারà§à¦Ÿà¦¿à¦¶à¦¨ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করো" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "সà§à¦®à¦¾à¦°à§à¦Ÿ" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank ঠSync " #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "টেকà§à¦¸à¦šà¦¾à¦° ফিলà§à¦Ÿà¦¾à¦° করা" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "টেকà§à¦¸à¦šà¦¾à¦° ফিলà§à¦Ÿà¦¾à¦°" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "টেকà§à¦¸à¦šà¦¾à¦° ফিলà§à¦Ÿà¦¾à¦° করা" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "যে হারে সà§à¦•à§à¦°à¦¿à¦¨à¦Ÿà¦¿ পà§à¦¨à¦°à¦¾à§Ÿ অঙà§à¦•ন করা হবে (গà§à¦£/সেকেনà§à¦¡)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "সরà§à¦¬à¦¾à¦§à¦¿à¦• উইনà§à¦¡à§‹ টগল করা" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "অনà§à¦­à§‚মিকভাবে সরà§à¦¬à¦¾à¦§à¦¿à¦• উইনà§à¦¡à§‹ টগল করা" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "উলà§à¦²à¦®à§à¦¬à¦­à¦¾à¦¬à§‡ সরà§à¦¬à¦¾à¦§à¦¿à¦• উইনà§à¦¡à§‹ টগল করা" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "উইনà§à¦¡à§‹ শেড টগল করা" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "সরà§à¦¬à¦¾à¦§à¦¿à¦• সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ টগল করা" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "অনà§à¦­à§‚মিকভাবে সরà§à¦¬à¦¾à¦§à¦¿à¦• সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦•ে টগল করা" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "উলà§à¦²à¦®à§à¦¬à¦­à¦¾à¦¬à§‡ সরà§à¦¬à¦¾à¦§à¦¿à¦• সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦•ে টগল করা" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ শেড টগল করা" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "মনà§à¦¥à¦° অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à¦—à§à¦²à¦¿à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦° টগল করা" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ সরà§à¦¬à¦¾à¦§à¦¿à¦• না করা" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "পূরà§à¦£à¦¸à§à¦•à§à¦°à¦¿à¦¨à§‡à¦° উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶ না করা" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "সà§à¦•à§à¦°à¦¿à¦¨ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à¦¿à¦¤ করার সময় বিচà§à¦›à§à¦°à¦¿à¦¤ আলো পà§à¦°à§Ÿà§‹à¦— করà§à¦¨" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "উলà§à¦²à¦®à§à¦¬ ভারà§à¦šà§à§Ÿà¦¾à¦² আকার" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "উইনà§à¦¡à§‹à¦° মেনৠবোতাম বনà§à¦§à¦¨" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "উইনà§à¦¡à§‹à¦° কী বোতাম বনà§à¦§à¦¨" # নিরà§à¦¬à¦¾à¦šà¦¨ #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ " #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "চিতà§à¦° বিনà§à¦¯à¦¸à§à¦¤ করা" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "চিতà§à¦°à§‡à¦° ওপরের তলটি ঘোরানোয় বিনà§à¦¯à¦¸à§à¦¤ করা" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "পরবরà§à¦¤à§€ সà§à¦²à¦¾à¦‡à¦¡à§‡ à¦à¦—িয়ে যাওয়া" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "সà§à¦•াইডোম অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦Ÿ করা" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "ঘনক ঘোরানোর সময় সà§à¦•াইডোম অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦Ÿ করা" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" # সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ আপডেট" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "ঘনকের ওপর à¦à¦¬à¦‚ নিচের পà§à¦°à¦¾à¦¨à§à¦¤à§‡à¦° রঙ" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "সà§à¦•াইডোম-ফলবà§à¦¯à¦¾à¦• গà§à¦°à§à¦¯à¦¾à¦¡à¦¿à§Ÿà§‡à¦¨à§à¦Ÿà§‡à¦° নিচের কালার-সà§à¦Ÿà¦ªà§‡à¦° জনà§à¦¯ রঙ " #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "সà§à¦•াইডোম-ফলবà§à¦¯à¦¾à¦• গà§à¦°à§à¦¯à¦¾à¦¡à¦¿à§Ÿà§‡à¦¨à§à¦Ÿà§‡à¦° ওপরের কালার-সà§à¦Ÿà¦ªà§‡à¦° জনà§à¦¯ রঙ " #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "ঘনকের রঙ" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "ঘনকের রঙ" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "ডেসà§à¦•টপ ঘনক" # নিরà§à¦¬à¦¾à¦šà¦¨ #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ " #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "বাদ দেয়া হয়েছে\n" # label text #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "সময়" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "উনà§à¦¨à¦¤à¦¤à¦° সà§à¦•েলিং à¦à¦° জনà§à¦¯ mipmaps তৈরী করà§à¦¨" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ সà§à¦²à¦¾à¦‡à¦¡à§‡ ফিরে যান" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "ইমেজ ফাইল তৈরী করো" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "সà§à¦•াইডোমের টেকà§à¦¸à¦šà¦¾à¦° হিসাবে বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° জনà§à¦¯ চিতà§à¦°" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "যদি মাউস দিয়ে ঘোরানো হয় তাহলে ঘনকের সà§à¦¬à¦šà§à¦›à¦¤à¦¾ শà§à¦°à§ হবে." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ঘনকের অভà§à¦¯à¦¨à§à¦¤à¦°à§‡" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "ঘনকের অভà§à¦¯à¦¨à§à¦¤à¦°à§‡" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "ঘনকের উপরিতলে PNG à¦à¦¬à¦‚ SVG র যে তালিকা পà§à¦°à§Ÿà§‹à¦— করা হবে" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "বিবিধ আউটপà§à¦Ÿ পà§à¦°à¦£à¦¾à¦²à§€" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "বহà§à¦¬à¦¿à¦§ ঘনকগà§à¦²à¦¿" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "পরবরà§à¦¤à§€ সà§à¦²à¦¾à¦‡à¦¡" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "বড় ঘনকে" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ঘোরানোর সময় অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "না ঘোরানোর সময় অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ঘোরানোর সময় ডেসà§à¦•টপ উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "ঘোরানোর সময় ডেসà§à¦•টপ উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "ঘনকে উইনà§à¦¡à§‹ সà§à¦¥à¦¾à¦ªà¦¨ করা" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ সà§à¦²à¦¾à¦‡à¦¡" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Skydome পà§à¦°à§Ÿà§‹à¦— করা" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "ঘনকের ওপরের তল আবৃত করার জনà§à¦¯ চিতà§à¦° সà§à¦•েল করা" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "যদি à¦à¦•াধিক ডিভাইস বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হয় সেকà§à¦·à§‡à¦¤à§à¦°à§‡ ঘনকটি কিভাবে পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করা হবে তা " "নিরà§à¦¬à¦¾à¦šà¦¨ করে." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "সà§à¦•াইডোম" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "সà§à¦•াইডোম গà§à¦°à§à¦¯à¦¾à¦¡à¦¿à§Ÿà§‡à¦¨à§à¦Ÿ শেষের রঙ" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "সà§à¦•াইডোম গà§à¦°à§à¦¯à¦¾à¦¡à¦¿à§Ÿà§‡à¦¨à§à¦Ÿ আরমà§à¦­à§‡à¦° রঙ" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "সà§à¦•াইডোম চিতà§à¦°" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "বাদ দেয়া হয়েছে\n" # label text #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "সময়" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "মাউস ঘোরানোর সময় সà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "উনà§à¦®à§à¦•à§à¦¤ করা" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "ঘনকটি উনà§à¦®à§à¦•à§à¦¤ করা" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "ডিবাস" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "ডিবাস নিয়নà§à¦¤à§à¦°à¦£ বà§à¦¯à¦¾à¦•à¦à¦¨à§à¦¡" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "অলঙà§à¦•রণ টেকà§à¦¸à¦šà¦¾à¦°à§‡ মিপমà§à¦¯à¦¾à¦ª তৈরী করতে দিন" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "যদি কোন ডেকোরেটর আগে থেকে কাজ না করেন সেকà§à¦·à§‡à¦¤à§à¦°à§‡ যে ডেকোরেটর নিরà§à¦¦à§‡à¦¶ লাইন বà§à¦¯à¦¬à¦¹à§ƒà¦¤ " "হবে" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "পà§à¦°à¦šà§à¦›à¦¾à§Ÿà¦¾ অফসেট X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "পà§à¦°à¦šà§à¦›à¦¾à§Ÿà¦¾ অফসেট Y" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "উইনà§à¦¡à§‹ অলঙà§à¦•রণ" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "উইনà§à¦¡à§‹ অলঙà§à¦•রণ" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ অলঙà§à¦•রণ করা হবে" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ ছায়াযà§à¦•à§à¦¤ করা হবে" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" # label text #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "সময়" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "ধারন করে" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "সà§à¦¥à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "ছোট করা/খোলা/বনà§à¦§ করার ওপর মলিনতার পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "বাদ দেয়া হয়েছে\n" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "সà§à¦¥à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "উইনà§à¦¡à§‹ ছোট করা/খোলা/বনà§à¦§ করার ওপর মলিনতার পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "সিসà§à¦Ÿà§‡à¦® বিপে মলিনতার পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "মà§à¦¯à¦¾à¦ª করার সময় উইনà§à¦¡à§‹ ফেড ইন করা à¦à¦¬à¦‚ আনমà§à¦¯à¦¾à¦ª করার সময় উইনà§à¦¡à§‹ ফেড আউট করা" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "পূরà§à¦£à¦¸à§à¦•à§à¦°à¦¿à¦¨à§‡à¦° দৃশà§à¦¯à¦®à¦¾à¦¨ বেল" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "সিসà§à¦Ÿà§‡à¦® বিপে পূরà§à¦£ পরà§à¦¦à¦¾à¦° মলিন পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "দৃশà§à¦¯à¦®à¦¾à¦¨ বেল" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "উইনà§à¦¡à§‹ মলিন হওয়ার গতি" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "সà§à¦•েল পà§à¦°à¦£à¦¾à¦²à§€à¦¤à§‡ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ সà§à¦•েল করা" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ মলিন করা হবে" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "মাউনà§à¦Ÿ বিনà§à¦¦à§" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "মাউনà§à¦Ÿ বিনà§à¦¦à§" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "ইউজারসà§à¦ªà§‡à¦¸ ফাইল সিসà§à¦Ÿà§‡à¦®" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "ইউজারসà§à¦ªà§‡à¦¸ ফাইল সিসà§à¦Ÿà§‡à¦®" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf নিয়নà§à¦¤à§à¦°à¦£ বà§à¦¯à¦¾à¦•à¦à¦¨à§à¦¡" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib পà§à¦°à¦§à¦¾à¦¨ লà§à¦ª সমরà§à¦¥à¦¨" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "à¦à¦•টি টারà§à¦®à¦¿à¦¨à¦¾à¦² খà§à¦²à§à¦¨" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "ডায়ালগ চালনা করা" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "পà§à¦°à¦§à¦¾à¦¨ মেনৠপà§à¦°à¦¦à¦°à§à¦¶à¦¨ করা" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "চালনা করার অনà§à¦ªà§à¦°à§Ÿà§‹à¦— ডায়ালগ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করা" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "পà§à¦°à¦§à¦¾à¦¨ তালিকা পà§à¦°à¦¦à¦°à§à¦¶à¦¨" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "à¦à¦•টি সà§à¦•à§à¦°à¦¿à¦¨à¦¶à¦Ÿ নিন" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "উইনà§à¦¡à§‹à¦° à¦à¦•টি সà§à¦•à§à¦°à¦¿à¦¨à¦¶à¦Ÿ নিন" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "উইনà§à¦¡à§‹ সà§à¦•à§à¦°à¦¿à¦¨à¦¶à¦Ÿ নিরà§à¦¦à§‡à¦¶ লাইন" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini ফà§à¦²à§à¦¯à¦¾à¦Ÿ ফাইলের বà§à¦¯à¦¾à¦•à¦à¦¨à§à¦¡" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ফাইল পরিবরà§à¦¤à¦¨ ঘোষণাকারী পà§à¦²à¦¾à¦—ইন" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "আইনোটিফাই" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig নিয়নà§à¦¤à§à¦°à¦£ বà§à¦¯à¦¾à¦•à¦à¦¨à§à¦¡" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "পà§à¦°à¦­à¦¾à¦¬ সরà§à¦¬à¦¨à¦¿à¦®à§à¦¨ করা" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ ছোট করা" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "সরà§à¦¬à¦¨à¦¿à¦®à§à¦¨ করার গতি" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "শেড পà§à¦°à¦¤à¦¿à¦°à§‹à¦§" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "শেড পà§à¦°à¦¤à¦¿à¦°à§‹à¦§" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ ছোট à¦à¦¬à¦‚ বড় করার সময় সেগà§à¦²à¦¿ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à¦¿à¦¤ করে" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "উইনà§à¦¡à§‹ ছোট করার সময় যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à¦¿à¦¤ করা হবে" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "ধারন করে" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "ওয়ারà§à¦•সà§à¦ªà§‡à¦¸ কà§à¦·à§‡à¦¤à§à¦°à§‡ Y সà§à¦¥à¦¾à¦¨à¦¾à¦™à§à¦•কে সীমাবদà§à¦§ করà§à¦¨" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "সরানোর কারà§à¦¯à¦Ÿà¦¿ সমাপà§à¦¤ না হওয়া পরà§à¦¯à¦¨à§à¦¤ সারà§à¦­à¦¾à¦°à§‡à¦°-দিকে অবসà§à¦¥à¦¿à¦¤ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ আপডেট করবেন " "না" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "উইনà§à¦¡à§‹ সরানো আরমà§à¦­ করা" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "অলস অবসà§à¦¥à¦¾à¦¨ নিরà§à¦£à§Ÿ" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "উইনà§à¦¡à§‹ সরানো" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "চলমান উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° সà§à¦¤à¦°" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "টানার সময় বড় করা উইনà§à¦¡à§‹à¦•ে সà§à¦¨à§à¦¯à¦¾à¦ªà¦…ফ করা à¦à¦¬à¦‚ সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿà¦­à¦¾à¦¬à§‡ ছোট করা" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "সà§à¦¨à§à¦¯à¦¾à¦ªà¦…ফ সরà§à¦¬à¦¾à¦§à¦¿à¦• উইনà§à¦¡à§‹" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "বà§à¦°à¦¿à¦œ" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "বà§à¦°à¦¿à¦œ" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "বà§à¦°à¦¿à¦œ" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "বà§à¦°à¦¿à¦œ" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ হà§à¦°à¦¾à¦¸ করà§à¦¨" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ বৃদà§à¦§à¦¿ করà§à¦¨" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ পরিবরà§à¦¤à¦¨à§‡à¦° ধাপ" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ পরিবরà§à¦¤à¦¨à§‡à¦° ধাপ" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° ধাপ" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "চলমান উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° সà§à¦¤à¦°" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "ঘোরানোর সময় অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "উইনà§à¦¡à§‹ অলঙà§à¦•রণ" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ উইনà§à¦¡à§‹à¦° মূলà§à¦¯à¦—à§à¦²à¦¿" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° অবসà§à¦¥à¦¾à¦¨ নিরà§à¦£à§Ÿ করা হবে" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ অরà§à¦§à¦¸à§à¦¬à¦šà§à¦› করা হবে" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° অবসà§à¦¥à¦¾à¦¨ নিরà§à¦£à§Ÿ করা হবে" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "উইনà§à¦¡à§‹ সà§à¦¥à¦¾à¦ªà¦¨à§‡à¦° জনà§à¦¯ বà§à¦¯à¦¬à¦¹à§ƒà¦¤ অà§à¦¯à¦¾à¦²à¦—োরিদম" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "কাসকেড" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "কেনà§à¦¦à§à¦°à§€à¦­à§‚ত" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "উইনà§à¦¡à§‹ পরিচালনা" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "ফোকাস পà§à¦°à¦¤à¦¿à¦°à§‹à¦§à§‡à¦° উইনà§à¦¡à§‹" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "অনà§à¦­à§‚মিক ভিউপোরà§à¦Ÿà§‡à¦° অবসà§à¦¥à¦¾à¦¨" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ সà§à¦¥à¦¾à¦ªà¦¨ করা" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "মà§à¦¯à¦¾à¦ª করার পর উপযà§à¦•à§à¦¤ সà§à¦¥à¦¾à¦¨à§‡ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨ পà§à¦°à¦£à¦¾à¦²à§€" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "অবসà§à¦¥à¦¾à¦¨à¦¯à§à¦•à§à¦¤ উইনà§à¦¡à§‹" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "ইচà§à¦›à¦¾à¦®à¦¤" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "যদি à¦à¦•াধিক আউটপà§à¦Ÿ ডিভাইস বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হয় তাহলে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ কোথায় সà§à¦•েল করা হবে তা " "নিরà§à¦¬à¦¾à¦šà¦¨ করে" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "সà§à¦®à¦¾à¦°à§à¦Ÿ" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "সব আউটপà§à¦Ÿ ডিভাইসে" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "উলà§à¦²à¦®à§à¦¬ ভিউপোরà§à¦Ÿ অবসà§à¦¥à¦¾à¦¨" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "ভিউপোরà§à¦Ÿ অবসà§à¦¥à¦¾à¦¨à§‡à¦° উইনà§à¦¡à§‹" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "উইনà§à¦¡à§‹ পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨ ওয়ারà§à¦•à¦à¦°à¦¾à¦‰à¦¨à§à¦¡" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° অবসà§à¦¥à¦¾à¦¨ নিরà§à¦£à§Ÿ করা হবে" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে যে ভিউপোরà§à¦Ÿà§‡ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ রাখা হবে " #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "উইনà§à¦¡à§‹ অলঙà§à¦•রণ" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "ওয়ারà§à¦•à¦à¦°à¦¾à¦‰à¦¨à§à¦¡" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X অবসà§à¦¥à¦¾à¦¨" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X ভিউপোরà§à¦Ÿ অবসà§à¦¥à¦¾à¦¨" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X অবসà§à¦¥à¦¾à¦¨à§‡à¦° মূলà§à¦¯" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y অবসà§à¦¥à¦¾à¦¨" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y ভিউপোরà§à¦Ÿ অবসà§à¦¥à¦¾à¦¨" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y অবসà§à¦¥à¦¾à¦¨à§‡à¦° মূলà§à¦¯" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png চিতà§à¦° লোডকারী" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "রিগেকà§à¦¸ মেলানো" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "রিগেকà§à¦¸ উইনà§à¦¡à§‹ মেলানো" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "পà§à¦°à¦¾à¦¨à§à¦¤à¦°à§‡à¦–ার রঙ" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "বহিরà§à¦°à§‡à¦–া à¦à¦¬à¦‚ আয়তাকার পà§à¦¨à¦°à¦¾à¦•ৃতি পà§à¦°à¦£à¦¾à¦²à§€à¦¤à§‡ বà§à¦¯à¦¬à¦¹à§ƒà¦¤ পà§à¦°à¦¾à¦¨à§à¦¤à¦°à§‡à¦–ার রঙ" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚প পà§à¦¨à¦°à¦¾à¦•ৃতির পà§à¦°à¦£à¦¾à¦²à§€" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "উইনà§à¦¡à§‹ পà§à¦¨à¦°à¦¾à¦•ৃতির জনà§à¦¯ পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚প পà§à¦°à¦£à¦¾à¦²à§€" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "রঙ পূরà§à¦£ করা" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "আয়তাকার পà§à¦¨à¦°à¦¾à¦•ৃতি পà§à¦°à¦£à¦¾à¦²à§€à¦° জনà§à¦¯ বà§à¦¯à¦¬à¦¹à§ƒà¦¤ পূরà§à¦£à¦•রণ রঙ" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "বহিরà§à¦°à§‡à¦–া" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "পà§à¦¨à¦°à¦¾à¦•ার উইনà§à¦¡à§‹à¦° বহিরà§à¦°à§‡à¦–া" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "আয়তকà§à¦·à§‡à¦¤à§à¦°" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "উইনà§à¦¡à§‹à¦° আকার পরিবরà§à¦¤à¦¨ করা" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "উইনà§à¦¡à§‹à¦° আকার পরিবরà§à¦¤à¦¨ করা" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "উইনà§à¦¡à§‹à¦° আকার পরিবরà§à¦¤à¦¨ শà§à¦°à§ করà§à¦¨" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿ বিসà§à¦¤à§ƒà¦¤ করে উইনà§à¦¡à§‹à¦° আকার পরিবরà§à¦¤à¦¨ শà§à¦°à§ করà§à¦¨" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "আয়তকà§à¦·à§‡à¦¤à§à¦° দিয়ে উইনà§à¦¡à§‹à¦° আকার পরিবরà§à¦¤à¦¨ শà§à¦°à§ করà§à¦¨" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "পà§à¦°à¦¸à¦¾à¦°à¦¿à¦¤ করা" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "যে উইনà§à¦¡à§‹à¦° জনà§à¦¯ সà§à¦¬à¦¾à¦­à¦¾à¦¬à¦¿à¦• পà§à¦¨à¦°à¦¾à¦•ৃতি পà§à¦°à§Ÿà§‹à¦— করা হবে" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "যে উইনà§à¦¡à§‹à¦° জনà§à¦¯ বহিরà§à¦°à§‡à¦–া পà§à¦¨à¦°à¦¾à¦•ৃতি পà§à¦°à§Ÿà§‹à¦— করা হবে" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "যে উইনà§à¦¡à§‹à¦° জনà§à¦¯ আয়তাকার পà§à¦¨à¦°à¦¾à¦•ৃতি পà§à¦°à§Ÿà§‹à¦— করা হবে" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "যে উইনà§à¦¡à§‹à¦° জনà§à¦¯ বিসà§à¦¤à§ƒà¦¤à¦¿ পà§à¦¨à¦°à¦¾à¦•ৃতি পà§à¦°à§Ÿà§‹à¦— করা হবে" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr " DnD পà§à¦°à¦¾à¦¨à§à¦¤ ফà§à¦²à¦¿à¦ª করা" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "পà§à¦°à¦¾à¦¨à§à¦¤à§‡à¦° ফà§à¦²à¦¿à¦ª সরানো" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "পà§à¦°à¦¾à¦¨à§à¦¤à§‡à¦° ফà§à¦²à¦¿à¦ª নিরà§à¦¦à§‡à¦¶à¦•" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "সà§à¦¥à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "বাà¦à¦¦à¦¿à¦•ের ভিউপোরà§à¦Ÿà§‡ ফà§à¦²à¦¿à¦ª করা à¦à¦¬à¦‚ নিরà§à¦¦à§‡à¦¶à¦•টি মà§à¦¡à¦¼à¦¿à§Ÿà§‡ দেওয়া " #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "বসà§à¦¤à§à¦Ÿà¦¿à¦•ে সà§à¦•à§à¦°à¦¿à¦¨à§‡à¦° পà§à¦°à¦¾à¦¨à§à¦¤à§‡ টানার সময় পরবরà§à¦¤à§€ ভিউপোরà§à¦Ÿà§‡ ফà§à¦²à¦¿à¦ª করà§à¦¨" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "নিরà§à¦¦à§‡à¦¶à¦•টিকে সà§à¦•à§à¦°à¦¿à¦¨à§‡à¦° পà§à¦°à¦¾à¦¨à§à¦¤à§‡ সরানোর সময় পরবরà§à¦¤à§€ ভিউপোরà§à¦Ÿà§‡ ফà§à¦²à¦¿à¦ª করà§à¦¨" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "নিরà§à¦¦à§‡à¦¶à¦•টিকে সà§à¦•à§à¦°à¦¿à¦¨à§‡à¦° পà§à¦°à¦¾à¦¨à§à¦¤à§‡ সরানোর সময় পরবরà§à¦¤à§€ ভিউপোরà§à¦Ÿà§‡ ফà§à¦²à¦¿à¦ª করà§à¦¨" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "ডানদিকের ভিউপোরà§à¦Ÿà§‡ ফà§à¦²à¦¿à¦ª করা à¦à¦¬à¦‚ নিরà§à¦¦à§‡à¦¶à¦•টি মà§à¦¡à¦¼à¦¿à§Ÿà§‡ দেওয়া " #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "নিরà§à¦¦à§‡à¦¶à¦• সরানোর জনà§à¦¯ Y অকà§à¦· উলà§à¦Ÿà§‡ দিন" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "নিরà§à¦¦à§‡à¦¶à¦• উলà§à¦Ÿà¦¾à¦¨à§‹ Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "নিরà§à¦¦à§‡à¦¶à¦• সংবেদনশীলতা" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "ঘোরানোর সময় তোলা" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "ঘোরানোর সময় উইনà§à¦¡à§‹à¦Ÿà¦¿ তোলা" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "ঘনক ঘোরানো" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "ফà§à¦²à¦¿à¦ª বাà¦à¦¦à¦¿à¦•ে ঘোরানো" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "ফà§à¦²à¦¿à¦ªà¦•ে ডানদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "বাà¦à¦¦à¦¿à¦•ে ঘোরানো" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "উইনà§à¦¡à§‹ সহ বাà¦à¦¦à¦¿à¦•ে ঘোরানো" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "ডানদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "উইনà§à¦¡à§‹ সহ ডানদিকে ঘোরানো" # সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ আপডেট" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "ফেস 1 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 1 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "ফেস 10 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 10 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "ফেস 11 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 11 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "ফেস 12 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 12 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "ফেস 2 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 2 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "ফেস 3 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 3 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "ফেস 4 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 4 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "ফেস 5 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 5 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "ফেস 6 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 6 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "ফেস 7 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 7 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "ফেস 8 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 8 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "ফেস 9 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 9 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "ঘনক ঘোরানো" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "ডেসà§à¦•টপ ঘনক ঘোরানো" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "বাà¦à¦¦à¦¿à¦•ে ঘোরানো" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "বাà¦à¦¦à¦¿à¦•ে ঘোরানো à¦à¦¬à¦‚ সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "ডানদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "ডানদিকে ঘোরানো à¦à¦¬à¦‚ সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "ফেস 1 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 1 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "ফেস 1 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "ফেস 1 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "ফেস 10 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "ফেস 10 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "ফেস 11 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "ফেস 11 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "ফেস 12 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "ফেস 12 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "ফেস 2 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "ফেস 2 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "ফেস 3 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "ফেস 3 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "ফেস 4 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "ফেস 4 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "ফেস 5 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "ফেস 5 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "ফেস 6 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "ফেস 6 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "ফেস 7 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "ফেস 7 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "ফেস 8 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "ফেস 8 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "ফেস 9 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "ফেস 9 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "ভিউপোরà§à¦Ÿà§‡ ঘোরানো" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "উইনà§à¦¡à§‹ ঘোরানো" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "উইনà§à¦¡à§‹ দিয়ে ঘোরানো" # নিরà§à¦¬à¦¾à¦šà¦¨ #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ " # label text #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "সময়" # label text #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "সময়" # label text #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "সময়" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "নিরà§à¦¦à§‡à¦¶à¦•ের চলাচলের সংবেদনশীলতা " #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "ওপরের ফেসে ঘনক ঘোরানোকে সà§à¦¨à§à¦¯à¦¾à¦ª করা " #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ওপরের ফেসে ঘনক ঘোরানোকে সà§à¦¨à§à¦¯à¦¾à¦ª করা " #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "ওপরের ফেসে সà§à¦¨à§à¦¯à¦¾à¦ª করà§à¦¨" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ওপরের ফেসে সà§à¦¨à§à¦¯à¦¾à¦ª করà§à¦¨" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "ফà§à¦²à¦¿à¦ªà¦¿à¦‚ ভিউপোরà§à¦Ÿà§‡à¦° আগে সময়অতিকà§à¦°à¦¾à¦¨à§à¦¤ হয়েছে" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "জà§à¦®" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° শতকরা পরিমাণ" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "বড়" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "ডেসà§à¦•টপ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করার জনà§à¦¯ ডেসà§à¦•টপে কà§à¦²à¦¿à¦• করà§à¦¨" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "পটভূমি গাঢ় করা" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "উইনà§à¦¡à§‹ সà§à¦•েল করার সময় পটভূমি গাঢ় করা" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "পà§à¦°à¦¤à§€à¦•" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "সà§à¦•েল করার সময় ডেসà§à¦•টপে যখন কà§à¦²à¦¿à¦• করা হবে তখন ডেসà§à¦•টপ পà§à¦°à¦£à¦¾à¦²à§€ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ পà§à¦°à¦¬à§‡à¦¶ করান " #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ঘà§à¦°à§‡ বেড়ানোর সময়" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "ভারত" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "সব উইনà§à¦¡à§‹à¦° জনà§à¦¯ উইনà§à¦¡à§‹ পিকার আরমà§à¦­ করা" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "সব উইনà§à¦¡à§‹ শà§à¦°à§‡à¦£à§€à¦° জনà§à¦¯ উইনà§à¦¡à§‹ পিকার আরমà§à¦­ করা" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "বরà§à¦¤à¦®à¦¾à¦¨ আউটপà§à¦Ÿà§‡à¦° উইনà§à¦¡à§‹à¦° জনà§à¦¯ উইনà§à¦¡à§‹ পিকার আরমà§à¦­ করা" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "সব উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° বিনà§à¦¯à¦¾à¦¸ করছে à¦à¦¬à¦‚ রূপানà§à¦¤à¦°à¦¿à¦¤ করছে" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "উইনà§à¦¡à§‹ শà§à¦°à§‡à¦£à§€à¦° বিনà§à¦¯à¦¾à¦¸ করছে à¦à¦¬à¦‚ রূপানà§à¦¤à¦°à¦¿à¦¤ করছে" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° বিনà§à¦¯à¦¾à¦¸ করছে à¦à¦¬à¦‚ রূপানà§à¦¤à¦°à¦¿à¦¤ করছে" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "বরà§à¦¤à¦®à¦¾à¦¨ আউটপà§à¦Ÿà§‡à¦° উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° বিনà§à¦¯à¦¾à¦¸ করা à¦à¦¬à¦‚ তার রূপানà§à¦¤à¦° শà§à¦°à§ করা" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "সব আউটপà§à¦Ÿ ডিভাইসে" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "বরà§à¦¤à¦®à¦¾à¦¨ আউটপà§à¦Ÿ ডিভাইসে" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ওভারলে চিতà§à¦°à¦¸à¦‚কেত" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦•ে সà§à¦•েল করার পর সেগà§à¦²à¦¿à¦° ওপর চিতà§à¦°à¦¸à¦‚কেত সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "সà§à¦•à§à¦¯à¦¾à¦¨à¦¾à¦°" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "যদি à¦à¦•াধিক আউটপà§à¦Ÿ ডিভাইস বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হয় তাহলে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ কোথায় সà§à¦•েল করা হবে তা " "নিরà§à¦¬à¦¾à¦šà¦¨ করে" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "সà§à¦ªà§‡à¦¨" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "উইনà§à¦¡à§‹à¦° ওপর ঘà§à¦°à§‡ বেড়ানোর সময় সà§à¦•েল পà§à¦°à¦£à¦¾à¦²à§€ বনà§à¦§ করার পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ সময় (মিনিটে)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "সà§à¦•েল পà§à¦°à¦£à¦¾à¦²à§€à¦¤à§‡ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ সà§à¦•েল করা" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "à¦à¦‡ অনà§à¦ªà§à¦°à§Ÿà§‹à¦—ে সà§à¦•à§à¦°à¦¿à¦¨à¦¶à¦Ÿà¦—à§à¦²à¦¿ সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿà¦­à¦¾à¦¬à§‡ খà§à¦²à§‡ যায়" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "ডিরেকà§à¦Ÿà¦°à§€" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "ভারত" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "সà§à¦¥à¦¾à¦ªà¦¨à¦•ারà§à¦¯à§‡à¦° অনà§à¦ªà§à¦°à§Ÿà§‹à¦—" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "à¦à¦‡ ডিরেকà§à¦Ÿà¦°à§€à¦° সà§à¦•à§à¦°à¦¿à¦¨à¦¶à¦Ÿ চিতà§à¦°à¦—à§à¦²à¦¿ সà§à¦¥à¦¾à¦ªà¦¨ করা" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg " #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg চিতà§à¦° লোডার" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "উজà§à¦œà§à¦¬à¦²à¦¤à¦¾à¦° শতকরা পরিমাণ" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "সমà§à¦ªà§ƒà¦•à§à¦¤à¦¿à¦° শতকরা পরিমাণ" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "অনà§à¦ªà§à¦°à§Ÿà§‹à¦— পরিবরà§à¦¤à¦¨à¦•ারী" # সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ আপডেট" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "বà§à¦Ÿà§‡à¦° সময়" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে সামনে নিয়ে আসা" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "উইনà§à¦¡à§‹ পরিবরà§à¦¤à¦¨ করার সময় দূরের ডেসà§à¦•টপটির জà§à¦® আউট করা হবে" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "চিতà§à¦°à¦¸à¦‚কেত" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "ছোট করা হয়েছে" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "ডেসà§à¦•টপ তল" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "পরবরà§à¦¤à§€ উইনà§à¦¡à§‹" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "পরবরà§à¦¤à§€ উইনà§à¦¡à§‹ (সব উইনà§à¦¡à§‹à¦—à§à¦²à¦¿)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "পরবরà§à¦¤à§€ উইনà§à¦¡à§‹ (কোন পপআপ নেই)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "পপআপ পরিবরà§à¦¤à¦¨à¦•ারী দেখা না গেলে পরবরà§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "পপআপ পরিবরà§à¦¤à¦¨à¦•ারী দেখা না গেলে সব উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° মধà§à¦¯à§‡ পরবরà§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "পপআপ পরিবরà§à¦¤à¦¨à¦•ারী দেখা না গেলে পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "পপআপ পরিবরà§à¦¤à¦¨à¦•ারী দেখা না গেলে সব উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° মধà§à¦¯à§‡ পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ সà§à¦²à¦¾à¦‡à¦¡" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ " #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ (সব উইনà§à¦¡à§‹à¦—à§à¦²à¦¿)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ (কোন পপআপ নেই)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "পরিবরà§à¦¤à¦¨ করার সময় নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ উইনà§à¦¡à§‹à¦Ÿà¦¿ ঘোরান" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "পপআপ উইনà§à¦¡à§‹ না দেখিয়ে পরবরà§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "পপআপ উইনà§à¦¡à§‹ না দেখিয়ে পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "পপআপ উইনà§à¦¡à§‹ না দেখিয়ে পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "থামà§à¦¬à¦¨à§‡à¦²à§‡à¦° পরবরà§à¦¤à§€ চিতà§à¦°à¦¸à¦‚কেত পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করা" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "সà§à¦‡à¦šà¦¾à¦°à§‡ যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করা হবে" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 কালারসà§à¦ªà§‡à¦¸ সমরà§à¦¥à¦¨ পà§à¦°à¦¦à¦¾à¦¨ করা" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "ভিডিও পà§à¦²à§‡à¦¬à§à¦¯à¦¾à¦•" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "ভিডিও পà§à¦²à§‡à¦¬à§à¦¯à¦¾à¦•" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 কালারসà§à¦ªà§‡à¦¸" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "লাইন যà§à¦•à§à¦¤ করা" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "বিনà§à¦¦à§ যà§à¦•à§à¦¤ করা" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "বিভিনà§à¦¨ ডেসà§à¦•টপ কারà§à¦¯à¦¾à¦¬à¦²à§€à¦¤à§‡ জলের পà§à¦°à¦­à¦¾à¦¬ পà§à¦°à§Ÿà§‹à¦— করা" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "পà§à¦°à¦¤à§à¦¯à§‡à¦• বৃষà§à¦Ÿà¦¿à¦° ফোà¦à¦Ÿà¦¾à¦° মধà§à¦¯à§‡ বà§à¦¯à¦¬à¦§à¦¾à¦¨ (মিনিটে)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "পয়েনà§à¦Ÿà¦¾à¦° জলের পà§à¦°à¦­à¦¾à¦¬ সমরà§à¦¥ করা" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "লাইন" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "অফসেট সà§à¦•েল" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "বিনà§à¦¦à§" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "বৃষà§à¦Ÿà¦¿à¦° বিলমà§à¦¬" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "শীরà§à¦· তরঙà§à¦—" # why not "token ring"? #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "টোকেন রিং" # why not "token ring"? #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "টোকেন রিং" # why not "token ring"? #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "টোকেন রিং" # why not "token ring"? #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "টোকেন রিং" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "জলের পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "জলের অফসেট সà§à¦•েল" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "উইনà§à¦¡à§‹ শীরà§à¦· থেকে জলের পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "ফোকাসের পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "ফোকাস উইনà§à¦¡à§‹ পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "ফোকাস উইনà§à¦¡à§‹ " #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "পারà§à¦Ÿà¦¿à¦¶à¦¨" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" # দà§à¦¬à¦¨à§à¦¦à§à¦¬ #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "দà§à¦¬à¦¨à§à¦¦à§à¦¬ মীমাংসা:" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "উলà§à¦Ÿà§‹ উইনà§à¦¡à§‹ সà§à¦¨à§à¦¯à¦¾à¦ªà¦¿à¦‚" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে কাà¦à¦ªà¦¾à¦¨à§‹" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "মà§à¦¯à¦¾à¦ª পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "মà§à¦¯à¦¾à¦ª উইনà§à¦¡à§‹ পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "সরà§à¦¬à§‹à¦šà§à¦š পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "সরà§à¦¬à¦¨à¦¿à¦®à§à¦¨ গà§à¦°à¦¿à¦¡ আকার" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "সরà§à¦¬à¦¨à¦¿à¦®à§à¦¨ শীরà§à¦· গà§à¦°à¦¿à¦¡à§‡à¦° আকার" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "কমà§à¦ªà¦¨" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª উলà§à¦Ÿà¦¾à¦¨à§‹" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "পারà§à¦Ÿà¦¿à¦¶à¦¨" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "ধাপে ধাপে আগানো" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "ধাপে ধাপে আগানো" # why not "token ring"? #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "টোকেন রিং" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "টলমল উইনà§à¦¡à§‹ পà§à¦°à¦­à¦¾à¦¬à§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ সà§à¦ªà§à¦°à¦¿à¦‚ বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" # দà§à¦¬à¦¨à§à¦¦à§à¦¬ #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "দà§à¦¬à¦¨à§à¦¦à§à¦¬ মীমাংসা:" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "ফোকাস করার সময় যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ টলমল করবে" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "ধরার সময় যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ টলমল করবে" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "মà§à¦¯à¦¾à¦ª করার সময় যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ টলমল করবে" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "সরানোর সময় যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ টলমল করবে" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ সরà§à¦¬à¦¾à¦§à¦¿à¦• করা বা না করার সময় টলমল করার পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "টলমলে উইনà§à¦¡à§‹" #, fuzzy #~ msgid "Command line 0" #~ msgstr "কমানà§à¦¡ '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "কমানà§à¦¡ '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "ফিলà§à¦Ÿà¦¾à¦°:" #~ msgid "Use linear filter when zoomed in" #~ msgstr "জà§à¦® ইন করার সময় রৈখিক ফিলà§à¦Ÿà¦¾à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" # label text #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "সময়" #~ msgid "Zoom In" #~ msgstr "জà§à¦® ইন" #~ msgid "Zoom Out" #~ msgstr "জà§à¦® আউট" #~ msgid "Zoom Pan" #~ msgstr "জà§à¦® পà§à¦¯à¦¾à¦¨" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "বাদ দেয়া হয়েছে\n" # label text #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "সময়" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ডেসà§à¦•টপ ঘনক জà§à¦® করা à¦à¦¬à¦‚ পà§à¦¯à¦¾à¦¨ করা" #~ msgid "Zoom factor" #~ msgstr "জà§à¦® ফà§à¦¯à¦¾à¦•à§à¦Ÿà¦°" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "বাদ দেয়া হয়েছে\n" #~ msgid "Decrease window opacity" #~ msgstr "উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ হà§à¦°à¦¾à¦¸ করà§à¦¨" #~ msgid "Increase window opacity" #~ msgstr "উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ বৃদà§à¦§à¦¿ করà§à¦¨" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "উইনà§à¦¡à§‹à¦° যে অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦•ে পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে অরà§à¦§à¦¸à§à¦¬à¦šà§à¦› করা হবে" #~ msgid "Opacity windows" #~ msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ উইনà§à¦¡à§‹" #~ msgid "Background Images" #~ msgstr "পটভূমির চিতà§à¦°à¦—à§à¦²à¦¿" #~ msgid "Background images" #~ msgstr "পটভূমির চিতà§à¦°à¦—à§à¦²à¦¿" # why not "token ring"? #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "টোকেন রিং" #~ msgid "Plane Down" #~ msgstr "নিচের তল" #~ msgid "Plane Left" #~ msgstr "বাà¦à¦¦à¦¿à¦•ের তল" #~ msgid "Plane Right" #~ msgstr "ডানদিকের তল" #~ msgid "Plane To Face 1" #~ msgstr "তল থেকে ফেস 1" #~ msgid "Plane To Face 10" #~ msgstr "তল থেকে ফেস 10" #~ msgid "Plane To Face 11" #~ msgstr "তল থেকে ফেস 11" #~ msgid "Plane To Face 12" #~ msgstr "তল থেকে ফেস 12" #~ msgid "Plane To Face 2" #~ msgstr "তল থেকে ফেস 2" #~ msgid "Plane To Face 3" #~ msgstr "তল থেকে ফেস 3" #~ msgid "Plane To Face 4" #~ msgstr "তল থেকে ফেস 4" #~ msgid "Plane To Face 5" #~ msgstr "তল থেকে ফেস 5" #~ msgid "Plane To Face 6" #~ msgstr "তল থেকে ফেস 6" #~ msgid "Plane To Face 7" #~ msgstr "তল থেকে ফেস 7" #~ msgid "Plane To Face 8" #~ msgstr "তল থেকে ফেস 8" #~ msgid "Plane To Face 9" #~ msgstr "তল থেকে ফেস 9" #~ msgid "Plane Up" #~ msgstr "ওপরের তল" #~ msgid "Plane down" #~ msgstr "নিচের তল" #~ msgid "Plane left" #~ msgstr "বাà¦à¦¦à¦¿à¦•ের তল" #~ msgid "Plane right" #~ msgstr "ডানদিকের তল" #~ msgid "Plane to face 1" #~ msgstr "তল থেকে ফেস 1" #~ msgid "Plane to face 10" #~ msgstr "তল থেকে ফেস 10" #~ msgid "Plane to face 11" #~ msgstr "তল থেকে ফেস 11" #~ msgid "Plane to face 12" #~ msgstr "তল থেকে ফেস 12" #~ msgid "Plane to face 2" #~ msgstr "তল থেকে ফেস 2" #~ msgid "Plane to face 3" #~ msgstr "তল থেকে ফেস 3" #~ msgid "Plane to face 4" #~ msgstr "তল থেকে ফেস 4" #~ msgid "Plane to face 5" #~ msgstr "তল থেকে ফেস 5" #~ msgid "Plane to face 6" #~ msgstr "তল থেকে ফেস 6" #~ msgid "Plane to face 7" #~ msgstr "তল থেকে ফেস 7" #~ msgid "Plane to face 8" #~ msgstr "তল থেকে ফেস 8" #~ msgid "Plane to face 9" #~ msgstr "তল থেকে ফেস 9" #~ msgid "Plane up" #~ msgstr "ওপরের তল" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ডেসà§à¦•টপের উইনà§à¦¡à§‹ অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ মলিন হওয়ার সময়." #, fuzzy #~ msgid "Notification" #~ msgstr "পারà§à¦Ÿà¦¿à¦¶à¦¨" # label for an unknown installed system # try to use simple words #~ msgid "Unknown" #~ msgstr "অজানা" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" # নিরà§à¦¬à¦¾à¦šà¦¨ #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "বাদ দেয়া হয়েছে\n" # label text #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "সময়" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "রাশিয়ান" # নিরà§à¦¬à¦¾à¦šà¦¨ #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ " # label text #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "পারà§à¦Ÿà¦¿à¦¶à¦¨" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ধাপে ধাপে আগানো" # দà§à¦¬à¦¨à§à¦¦à§à¦¬ #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "দà§à¦¬à¦¨à§à¦¦à§à¦¬ মীমাংসা:" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "বাদ দেয়া হয়েছে\n" # label text #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "সময়" #, fuzzy #~ msgid "Command line %d" #~ msgstr "কমানà§à¦¡ '%1'" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "ফà§à¦²à¦ªà¦¿ ডিসà§à¦•" #, fuzzy #~ msgid "Terminate" #~ msgstr "পà§à¦°à¦¿à¦¨à§à¦Ÿà¦¾à¦°" compiz-0.9.11+14.04.20140409/po/de.po0000644000015301777760000040413112321343002017043 0ustar pbusernogroup00000000000000# @TITLE@ # Copyright (C) 2006, SUSE Linux GmbH, Nuremberg # FIRST AUTHOR , YEAR. # # This file is distributed under the same license as @PACKAGE@ package. FIRST # msgid "" msgstr "" "Project-Id-Version: @PACKAGE@\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-06-25 17:56+0200\n" "Last-Translator: sven knoblach \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Desktop" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Fensterverwaltung" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Keine" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Aufrollen" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximieren" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Horizontal maximieren" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Vertikal maximieren" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimieren" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Hervorheben" #: ../gtk/gnome/compiz-window-manager.c:433 #, fuzzy msgid "Lower" msgstr "Niedrig" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Fenstermenü" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Auszuführende Aktion wenn das Scrollrad über der Fenster-Titelleiste " "betätigt wird." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Unschärfetyp" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Metacity-Theme Undurchsichtigkeit des aktiven Fensters" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Metacity Theme Transparenzschatten des aktiven Fensters" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Undurchsichtigkeit bei Metacity-Theme" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity-Theme Transparenzschatten" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Opazität für aktive Fenster mit Metacity-Dekoration" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Undurchsichtigkeit für Metacity-Dekorationen" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Abstufung aktiver Fenster mit Metacity-Dekoration von undurchsichtig nach " "durchsichtig" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Abstufung Fenster mit Metacity-Dekoration von undurchsichtig nach " "durchsichtig" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Aktion des Mausrades auf der Titelleiste" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Unschärfetyp für Fensterdekoration" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Metacity-Thema verwenden" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Metacity-Thema für das Zeichnen der Fensterdekoration verwenden" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Fenster schließen" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Maximierung aufheben" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Fenster maximieren" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Fenster minimieren" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Über anderen Fenstern anordnen" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Immer auf der sichtbaren Arbeitsfläche" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Abrollen" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Nicht mehr über anderen Fenstern anordnen" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Nur auf aktueller Arbeitsfläche" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Das Fenster \"%s\" reagiert nicht mehr." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Das Erzwingen des Beendens dieser Anwendung wird den Verlust von " "ungespeicherten Daten zur Folge haben." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "Beenden erzwingen" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Auf den Bildschirm zeichnen" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Füllfarbe" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Kommentar Rahmenfarbe" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Bildschirmnotiz-Plugin" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Leeren" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Zeichnen" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Zeichnen mit Werkzeug" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Füllfarbe für Anmerkungen" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Initiieren" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Zeichnen initiieren" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Zeichnung löschen initiieren" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Löschen initiieren" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Linienstärke" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Linienstärke für Notizen" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Strichfarbe für Notizen" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Strichbreite" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Strichbreite für Notizen" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x-bilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alphakanalunschärfe" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alphakanalunschärfe für Fenster" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Unschärfefilter" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Unschärfe für verdeckte Bereiche" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Sättigung" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Geschwindigkeit" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Fensterunschärfe" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Unschärfe hinter transparenten Fensterbereichen" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Sättigung" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Fensterunschärfe" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Unschärfe für Fenster im Hintergrund" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Unschärfe für verdeckte Bildbereiche ausschalten" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Methode des Unschärfefilters" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Fokusunschärfe" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Fokusunschärfe für Fenster" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaußsch" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Radius" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Stärke" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Radius des Gaußfilters" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Stärke des Gaußfilters" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "eigenständige Texturabrufe" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmaps" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap-LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap-Detailniveau" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulsieren" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Puls-Effekt" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "nutze verfügbare Texturen für möglichst viele eigenständige Texturabrufe" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Geschwindigkeit des Unschärfeeffekts" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Fenstertypen, auf die die Fokusunschärfe angewendet werden soll" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Fenstertypen, auf die die Alphakanalunschärfe angewendet werden soll" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Ausgabe klonen" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Auswahl klonen initiieren" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Bildschirmausgabe klonen" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Eine Tastenbelegung, die den durch Befehl 0 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Eine Tastenbelegung, die den durch Befehl 1 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Eine Tastenbelegung, die den durch Befehl 10 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Eine Tastenbelegung, die den durch Befehl 11 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Eine Tastenbelegung, die den durch Befehl 2 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Eine Tastenbelegung, die den durch Befehl 3 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Eine Tastenbelegung, die den durch Befehl 4 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Eine Tastenbelegung, die den durch Befehl 5 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Eine Tastenbelegung, die den durch Befehl 6 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Eine Tastenbelegung, die den durch Befehl 7 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Eine Tastenbelegung, die den durch Befehl 8 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Eine Tastenbelegung, die den durch Befehl 9 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Eine Tastenbelegung, die den durch Befehl 0 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Eine Tastenbelegung, die den durch Befehl 1 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Eine Tastenbelegung, die den durch Befehl 10 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Eine Tastenbelegung, die den durch Befehl 11 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Eine Tastenbelegung, die den durch Befehl 2 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Eine Tastenbelegung, die den durch Befehl 3 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Eine Tastenbelegung, die den durch Befehl 4 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Eine Tastenbelegung, die den durch Befehl 5 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Eine Tastenbelegung, die den durch Befehl 6 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Eine Tastenbelegung, die den durch Befehl 7 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Eine Tastenbelegung, die den durch Befehl 8 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Eine Tastenbelegung, die den durch Befehl 9 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Eine Tastenbelegung, die den durch Befehl 0 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Eine Tastenbelegung, die den durch Befehl 1 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Eine Tastenbelegung, die den durch Befehl 10 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Eine Tastenbelegung, die den durch Befehl 11 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Eine Tastenbelegung, die den durch Befehl 2 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Eine Tastenbelegung, die den durch Befehl 3 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Eine Tastenbelegung, die den durch Befehl 4 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Eine Tastenbelegung, die den durch Befehl 5 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Eine Tastenbelegung, die den durch Befehl 6 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Eine Tastenbelegung, die den durch Befehl 7 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Eine Tastenbelegung, die den durch Befehl 8 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Eine Tastenbelegung, die den durch Befehl 9 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Kommandozeile 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Kommandozeile 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Kommandozeile 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Kommandozeile 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Kommandozeile 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Kommandozeile 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Kommandozeile 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Kommandozeile 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Kommandozeile 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Kommandozeile 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Kommandozeile 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Kommandozeile 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command0 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command1 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command10 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command11 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command2 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command3 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command4 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command5 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command6 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command7 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command8 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command9 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Kommando" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Befehl 1 ausführen" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Befehl 10 ausführen" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Befehl 11 ausführen" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Befehl 12 ausführen" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Befehl 12 ausführen" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Befehl 3 ausführen" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Befehl 4 ausführen" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Befehl 5 ausführen" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Befehl 6 ausführen" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Befehl 7 ausführen" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Befehl 8 ausführen" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Befehl 9 ausführen" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktive Plugins" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Aufbau von Vollbildfenstern ohne Umleitung zu Offscreen-Pixmaps erlauben" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Akustische Glocke" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Akustischer System-Warnton" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatisch in den Vordergrund" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Verzögerung für Automatisch in den Vordergrund" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatische Erkennung von Ausgabegeräten" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatische Erkennung der Aktualisierungsrate" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Beste" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Fokuswechsel durch Klicken" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Fenster durch Anklicken fokussieren" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Aktives Fenster verschieben" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Standardsymbol" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Standardfenstersymbol" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Desktop-Größe" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Ausgaben erkennen" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Aktualisierungsrate erkennen" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Dauer, die der Mauszeiger am Bildschirmrand verweilen muss, bevor eine Rand-" "Aktion ausgeführt wird." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Verzögerung der Rand-Aktionen" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Schnell" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" # Sinnvoller Ersatz für "Focus Stealing Prevention"? #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Stärke der \"Focus Stealing Prevention\"" # Sinnvoller Ersatz für "Focus Stealing Prevention"? #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Fenster mit \"Focus Stealing Prevention\"" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" "Auswahl an Fenstern, die beim Öffnen nicht automatisch Fokus bekommen, falls " "zu diesem Zeitpunkt mit anderen Fenstern gearbeitet wird." #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Allgemeine Optionen" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Allgemeine Compiz Optionen" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Gut" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Programmleistenfenster ausblenden" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Alle Fenster ausblenden und Desktop fokussieren" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Fenster ausblenden, die sich bei Wechsel in Modus \"Desktop anzeigen\" nicht " "in Programmleiste befanden" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Hoch" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Virtuelle horizontale Größe" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Benutze Kompression für aus Bildern generierte Texturen, wenn möglich." #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Bei maximierter Anzeige Tipps ignorieren" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Bei maximierter Anzeige Größensteigerung und Aspekttipps ignorieren" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" "Zeit, die vergehen soll, bevor das ausgewählte Fenster in den Vordergrund " "gehoben wird" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervall zwischen Ping-Meldungen" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" "Legt fest, wie strikt die \"Focus Stealing Prevention\" angewandt wird." #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Beleuchtung" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Liste der aktiven Plugins" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Liste mit Zeichenketten zur Erläuterung von Ausgabegeräten" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Niedrig" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Fenster nach unten verschieben" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Fenster unter andere Fenster verschieben" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Fenster horizontal maximieren" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Fenster vertikal maximieren" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Aktives Fenster maximieren" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Aktives Fenster horizontal maximieren" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Aktives Fenster vertikal maximieren" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Aktives Fenster minimieren" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Anzahl der Desktops" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Anzahl der virtuellen Desktops" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Aus" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Bildschirmaktualisierungen nur während inaktiver vertikaler Anzeige " "durchführen" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Ausgaben" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Behandlung von überlappenden Ausgabegeräten" #: ../metadata/core.xml.in.in.h:64 #, fuzzy msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "zeichne jede Ausgabeeinheit unabhängig voneinander, auch wenn sich die " "Einheiten überlappen" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Pingverzögerung" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Größeres Ausgabegerät bevorzugen" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Kleineres Ausgabegerät bevorzugen" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Durch Klicken in den Vordergrund" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Fenster nach vorn verlagern" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Ausgewählte Fenster nach Zeitintervall in Vordergrund verschieben" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Fenster vor andere Fenster verlagern" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Fenster durch Anklicken in Vordergrund verschieben" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Aktualisierungsrate" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" "Anzahl der virtuellen Darstellungsfelder in horizontaler Richtung (z. B. 4 " "für einen Würfel)" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Anzahl der virtuellen Darstellungsfelder in vertikaler Richtung" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Desktop anzeigen" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Langsame Animationen" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Intelligent" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Mit VBlank synchronisieren" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Texturkompression" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Strukturfilter" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Texturfilter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Bildwiederholungsrate (Häufigkeit/Sekunde)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Fenster maximieren ein/aus" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Fenster horizontal maximieren ein/aus" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Fenster vertikal maximieren ein/aus" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Fenster schattieren ein/aus" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Aktives Fenster maximieren ein/aus" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Aktives Fenster horizontal maximieren ein/aus" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Aktives Fenster vertikal maximieren ein/aus" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Aktives Fenster schattieren ein/aus" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Verwenden langsamer Animationen ein/aus" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Maximierung des aktiven Fensters aufheben" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Umleitung von Vollbildfenstern aufheben" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Beim Umwandeln des Bildschirms diffuses Licht verwenden" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Vertikale virtuelle Größe" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Sehr hoch" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" "Legt fest, welches der überlappenden Ausgabegeräte z.B. beim Maximieren von " "Fenstern bevorzugt werden soll." #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Maustastenkombination für Fenstermenü" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Tastenkombination für Fenstermenü" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Beschleunigung" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Bild ausrichten" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Würfeloberseite entsprechend der Orientierung drehen" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Nächstes Dia anzeigen" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Skydome animieren" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Beim Drehen von Würfel Skydome animieren" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Erscheinung" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatisch" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Verhalten" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Farbe der Ober- und Unterseite des Würfels" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Farbe, die unten im Skydome-Fallback-Verlauf verwendet werden soll" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Farbe, die oben im Skydome-Fallback-Verlauf verwendet werden soll" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Würfelfarbe" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Würfelfarbe" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Desktop-Würfel" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Beschleunigung beim Falten" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Faltgeschwindigkeit" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Faltzeitintervall" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Wenn möglich für präzise Skalierung Mipmaps erstellen" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Zurück zum vorherigen Dia" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Bilddateien" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Bild für die Struktur des Skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Würfel nur transparent, wenn er mit der Maus rotiert wird" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "In Würfel" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Virtueller Standpunkt befindet sich innerhalb des Würfels" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Liste der PNG- und SVG-Dateien, die auf der Oberseite des Würfels angezeigt " "werden sollen" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Modus für Mehrfachausgabe" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Mehrere Würfel" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Nächstes Dia" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Auf großem Würfel" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opazität bei Rotation" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opazität bei Stillstand" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" "Durchsichtigkeit des Desktop-Hintergrundes während der Rotation des Würfels" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Durchsichtigkeit des Desktop-Hintergrundes bei Stillstand des Würfels" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Fenster auf Würfel platzieren" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Vorheriges Dia" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Skydome anzeigen" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Bild skalieren" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Fenstergröße an Oberseite des Würfels anpassen" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Bestimmt wie der Würfel angezeigt wird, wenn mehrere Ausgabegeräte verwendet " "werden" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Endfarbe für Skydome-Verlauf" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Anfangsfarbe für Skydome-Verlauf" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Skydome-Bild" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Geschwindigkeit" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Zeitintervall" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Transparenz nur bei Maus-Rotation" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Transparenter Würfel" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Auffalten" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Würfel auffalten" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus-Backend" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Mipmaps für Fensterdekorations-Texturen generieren" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Kommando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekoration für Fenster" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Decorator-Kommandozeile, die ausgeführt wird, wenn nicht bereits ein " "Decorator ausgeführt wird" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "X-Versatz des Schlagschattens" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Y-Versatz des Schlagschattens" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Farbe des Schlagschattens" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opazität des Schlagschattens" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Radius des Schlagschattens" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Schattenfarbe" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Schattenversatz X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Schattenversatz Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Schattenopazität" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Schattenradius" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Schatten für Fenster" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Fensterdekoration" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Fensterdekorationen" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Fenster, die dekoriert werden sollen" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Fenster, um die ein Schatten gezeichnet werden soll" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Helligkeit (%) von nicht-reagierenden Fenstern" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Drehgeschwindigkeit" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Y einschränken" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "\"Normal\" skalierte Fenster" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Ausblendungszeit" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Ausblenden bei Minimieren/Öffnen/Schliessen" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Ausblendgeschwindigkeit" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Ausblendungszeit" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Ausblendeffekt bei Minimieren/Öffnen/Schliessen" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Ausblendeffekt für visuelle Glocke" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Fenster beim Zuordnen einblenden, beim Aufheben der Zuordnung ausblenden" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Ein-/Ausblenden für Fenster" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Fenster ein-/ausblenden" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Visuelle Glocke in Vollbild" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Ausblendeffekt für visuelle Glocke im Vollbildmodus" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Sättigung (%) von nicht-reagierenden Fenstern" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Helligkeit von nicht-reagierenden Fenstern" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Sättigung von nicht-reagierenden Fenstern" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Visuelle Glocke" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Fensterausblendgeschwindigkeit" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Fenster, die im Skaliermodus skaliert werden sollen" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Fenster, die ein- und ausgeblendet werden sollen" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Einhängepunkt" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "„Mount point“" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Benutzerbereichs-Dateisystem" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Benutzerbereichs-Dateisystem" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf-Backend" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib-Mainloop-Unterstützung" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome Kompatibilität" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Einen Terminalemulator öffnen" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Optionen die die Kompatibilität von Compiz zu Gnome gewährleisten" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Dialogfeld Ausführen" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Kommandozeile für Terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Kommandozeile für Bildschirmfoto" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Hauptmenü anzeigen" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Dialogfeld 'Anwendung ausführen' anzeigen" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Hauptmenü anzeigen" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Bildschirmfoto aufnehmen" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Bildschirmfoto von Fenster aufnehmen" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Kommandozeile für Terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Kommandozeile für Fenster-Bildschirmfoto " #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Backend, das einfache Text-Konfigurationsdateien verwendet" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Überwachung von Änderungen an Dateien" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig-Backend" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimierungseffekt" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimierungseffekt für Fenster" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimiergeschwindigkeit" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Minimierintervall" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Schattenwiderstand" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Schattenwiderstand" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Fenster beim Minimieren und beim Aufheben der Minimierung verformen" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Fenster, die beim Minimieren verformt werden sollen" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Y einschränken" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Y-Koordinate auf Arbeitsoberfläche einschränken" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Serverseitige Fensterposition bis zum Ende des Verschiebevorgangs nicht " "aktualisieren" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Fensterverschiebung initiieren" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Ökonomisch positionieren" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Fenster verschieben" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Fenster verschieben" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opazität" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Durchsichtigkeit der Fenster beim Verschieben" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Beim Ziehen Einrasten und Maximierung maximierter Fenster aufheben" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Einrasten maximierter Fenster aufheben" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Fensterverschiebung starten" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Helligkeit" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Veringerung der Helligkeit" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Helligkeit" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Helligkeit" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Deckkraft verringern" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Deckkraft erhöhen" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "" "Die Schrittweite für Einstellungen der Opazität/Durchsichtigkeit ändern" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "" "Die Schrittweite für Einstellungen der Opazität/Durchsichtigkeit ändern" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Schrittweite für Opazität" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Durchsichtigkeit der Fenster beim Verschieben" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Opazität bei Rotation" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Sättigung" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Sättigung" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Sättigung" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Sättigung" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Fensterdekorationen" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Fenstertypen" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Fenstertypen zuordnen" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Fenstertypen, die an eine bestimmte Position platziert werden sollen" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Fenstertypen, die standardmäßig transparent sein sollen" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Fenstertypen, die an eine bestimmte Position platziert werden sollen" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algorithmus für die Fensterpositionierung" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Kaskadenförmig" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Zentriert" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Fensterverwaltung" # Sinnvoller Ersatz für "Focus Stealing Prevention"? #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Fenster deren Platzieren erzwungen wird" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Horizontale Viewport-Position" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Fenster platzieren" #: ../metadata/place.xml.in.h:12 #, fuzzy msgid "Place across all outputs" msgstr "Kleineres Ausgabegerät bevorzugen" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Fenster bei Zuordnung ungefähr platzieren" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Platzierungsmodus" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Positionierte Fenster" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Zufällig" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Legt fest, wohin skalierte Fenster platziert werden, wenn mehrere " "Ausgabegeräte verwendet werden." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Intelligent" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "Auf allen Ausgabegeräten" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Vertikale Viewport-Position" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Auf Viewport platzierte Fenster" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Fensterplatzierungs-Workarounds" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Fenstertypen, die an eine bestimmte Position platziert werden sollen" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Fenstertypen, die auf einen bestimmten Viewport platziert werden sollen" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Fensterdekorationen" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Workarounds" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X-Position" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Viewport-X-Position" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Horizontale Position" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y-Position" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Viewport-Y-Position" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Vertikale Position" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Plugin für das Laden von Bildern im PNG-Format" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Reguläre Ausdrücke" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" "Ermöglicht die Verwendung von regulären Ausdrücken beim Festlegen von " "Fensterregeln." #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 #, fuzzy msgid "Bindings" msgstr "Bindungen" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Rahmenfarbe" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Für die Modi \"Umriss\" und \"Rechteck\" verwendete Rahmenfarbe." #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Standard-Modus" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Normalerweise für Fensterskalierung verwendeter Modus." #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Füllfarbe" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Im Modus \"Rechteck\" verwendete Füllfarbe." #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Fensterskalierung im Modus \"Normal\" initiieren" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Fensterskalierung im Modus \"Umriss\" initiieren" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Fensterskalierung im Modus \"Rechteck\" initiieren" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Fensterskalierung im Modus \"Strecken\" initiieren" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Fensterskalierung initiieren" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "\"Normal\" skalierte Fenster" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Umriss" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "\"Umriss\"-skalierte Fenster" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rechteck" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "\"Rechteck\"-skalierte Fenster" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Fenster skalieren" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Fenster skalieren" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Fensterskalierung starten" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Startet Skalierung des Fensters durch Strecken" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Startet traditionelle Skalierung des Fensters" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Startet Skalierung des Fensters mit Anzeige des Umrisses" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Startet Skalierung des Fensters mit Anzeige eines Rechtecks" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Strecken" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Gestreckt skalierte Fenster" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Fenstertypen, die im Modus \"Normal\" skaliert werden sollen" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Fenstertypen, die im Modus Umriss\" skaliert werden sollen" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Fenstertypen, die im Modus \"Rechteck\" skaliert werden sollen" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Fenstertypen, die im Modus \"Strecken\" skaliert werden sollen" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "An Rand wechseln (Ziehen und Ablegen)" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "An Rand wechseln (Verschieben)" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "An Rand wechseln (Zeiger)" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Wechselzeit" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Zum linken Viewport wechseln und Zeiger verzerren" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Zum nächsten Viewport wechseln, wenn Objekt an den Bildschirmrand gezogen " "wird" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Zum nächsten Viewport wechseln, wenn Zeiger an den Bildschirmrand verschoben " "wird" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Zum nächsten Viewport wechseln, wenn Fenster an den Bildschirmrand " "verschoben wird" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Zum rechten Viewport wechseln und Zeiger verzerren" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Y-Achse für Zeigerbewegung umkehren" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Y umkehren für Zeiger" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Zeigerempfindlichkeit" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Während des Drehens anheben" #: ../metadata/rotate.xml.in.h:17 #, fuzzy msgid "Raise window when rotating" msgstr "Fenster während des Drehens anheben" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Würfel drehen" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Drehen (nach links kippen)" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Drehen (nach rechts kippen)" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Links drehen" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Links drehen mit Fenster" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Rechts drehen" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Rechts drehen mit Fenster" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Drehen in Richtung" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Drehen zu Fläche 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Drehen zu Fläche 1 mit Fenster" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Drehen zu Fläche 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Drehen zu Fläche 10 mit Fenster" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Drehen zu Fläche 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Drehen zu Fläche 11 mit Fenster" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Drehen zu Fläche 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Drehen zu Fläche 12 mit Fenster" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Drehen zu Fläche 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Drehen zu Fläche 2 mit Fenster" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Drehen zu Fläche 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Drehen zu Fläche 3 mit Fenster" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Drehen zu Fläche 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Drehen zu Fläche 4 mit Fenster" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Drehen zu Fläche 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Drehen zu Fläche 5 mit Fenster" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Drehen zu Fläche 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Drehen zu Fläche 6 mit Fenster" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Drehen zu Fläche 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Drehen zu Fläche 7 mit Fenster" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Drehen zu Fläche 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Drehen zu Fläche 8 mit Fenster" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Drehen zu Fläche 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Drehen zu Fläche 9 mit Fenster" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Würfel rotieren" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Desktop-Würfel drehen" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Links drehen" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Links drehen und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Rechts drehen" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Rechts drehen und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Drehen zu Fläche 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Drehen zu Fläche 1 mit Fenster" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Drehen zu Fläche 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Drehen zu Fläche 1 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Drehen zu Fläche 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Drehen zu Fläche 10 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Drehen zu Fläche 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Drehen zu Fläche 11 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Drehen zu Fläche 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Drehen zu Fläche 12 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Drehen zu Fläche 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Drehen zu Fläche 2 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Drehen zu Fläche 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Drehen zu Fläche 3 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Drehen zu Fläche 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Drehen zu Fläche 4 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Drehen zu Fläche 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Drehen zu Fläche 5 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Drehen zu Fläche 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Drehen zu Fläche 6 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Drehen zu Fläche 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Drehen zu Fläche 7 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Drehen zu Fläche 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Drehen zu Fläche 8 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Drehen zu Fläche 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Drehen zu Fläche 9 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "In Richtung Viewport drehen" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Fenster drehen" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Mit Fenster drehen" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Drehbeschleunigung" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Drehgeschwindigkeit" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Drehintervall" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Zoom während des Drehens" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Empfindlichkeit bei Zeigerbewegung" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Würfeldrehung an Unterseite einrasten" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Würfeldrehung an Oberseite einrasten" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "An Unterseite einrasten" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "An Oberseite einrasten" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Drehung starten" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Zeitüberschreitung vor Viewport-Wechsel" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Durchlässigkeitsgrad in Prozent" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Groß" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Auf den Desktop klicken um ihn anzuzeigen" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Hintergrund abdunkeln" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Hintergrund beim Skalieren von Fenstern abdunkeln" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblem" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Verweildauer" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Fensterauswahl initiieren" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Fensterauswahl für alle Fenster initiieren" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Fensterauswahl für Fenstergruppe initiieren" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Fensterauswahl für Fenster in aktueller Ausgabe initiieren" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Layout durchführen und mit der Umformung aller Fenster beginnen" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Layout durchführen und mit der Umformung der Fenstergruppe beginnen" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Layout erstellen und mit Fensterumformung beginnen" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" "Layout durchführen und mit der Umformung der Fenster in aktueller Ausgabe " "beginnen" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Auf allen Ausgabegeräten" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Auf momentanem Ausgabegerät" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Symbol überlagern" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Fenster nach Skalierung mit Symbol überlagern" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Skalieren" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Fenster skalieren" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Skaliergeschwindigkeit" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Skalierzeitintervall" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Fenster skalieren" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Legt fest, wohin skalierte Fenster platziert werden, wenn mehrere " "Ausgabegeräte verwendet werden." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Abstand zwischen Fenstern" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Abstand" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Zeit (in ms) bis zum Beenden des Skaliermodus beim Verweilen über einem " "Fenster" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Fenster, die im Skaliermodus skaliert werden sollen" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Bildschirmfoto automatisch mit dieser Anwendung öffnen" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Verzeichnis" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Start der Auswahl des aufzunehmenden Rechtecks" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Anwendung starten" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Bildschirmfoto in diesem Verzeichnis speichern" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Bildschirmfoto" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Plugin, mit dessen Hilfe Bildschirmfotos aufgenommen werden können" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "SVG" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Plugin für das Laden von Bildern im SVG-Format" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Helligkeitsgrad in Prozent" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Sättigungsgrad in Prozent" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Anwendungs-Umschalter" # Übersetzung ist nicht 1:1, beschreibt aber genau das, was passiert ;-) #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automatisch Arbeitsfläche wechseln" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "In den Vordergrund verschieben" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Ausgewähltes Fenster in den Vordergrund verschieben" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Distance-Desktop sollte beim Umschalten zwischen Fenstern verkleinert sein" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Icon" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimiert" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Desktop-Fläche" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Nächstes Fenster" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Nächstes Fenster (Alle Arbeitsflächen)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Nächstes Fenster (Keine Vorschau)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Vorschaufenster anzeigen und nächstes Fenster auswählen" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Vorschaufenster anzeigen und nächstes Fenster (von allen Arbeitsflächen) " "auswählen" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Vorschaufenster anzeigen und vorheriges Fenster auswählen" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Vorschaufenster anzeigen und vorheriges Fenster (von allen Arbeitsflächen) " "auswählen" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Vorheriges Dia" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Vorheriges Fenster" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Vorheriges Fenster (Alle Arbeitsflächen)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Vorheriges Fenster (Keine Vorschau)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" "Während des Umschaltens zur Arbeitsfläche des selektierten Fensters wechseln." #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Nächstes Fenster auswählen" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Nächstes Fenster auswählen, ohne dabei das Vorschaufenster anzuzeigen." #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Vorheriges Fenster auswählen" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" "Vorheriges Fenster auswählen, ohne dabei das Vorschaufenster anzuzeigen." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Neben Miniaturbild Symbol anzeigen" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Minimierte Fenster anzeigen" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Schaltergeschwindigkeit" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Schalterzeitintervall" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Fenster in Umschaltauswahl" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Fenster, die beim Umschalten auswählbar sein sollen." #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Stellt YV12-Farbraum-Unterstützung zur Verfügung." #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Video Wiedergabe" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Video Wiedergabe" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12-Farbraum" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Linie hinzufügen" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Punkt hinzufügen" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Wassereffekte zu verschiedenen Aktionen des Desktops hinzufügen" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Verzögerung (in ms) zwischen den einzelnen Regentropfen" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Wassereffekte für Mauszeiger aktivieren" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Linie" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Versatz-Skalierung" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punkt" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Regenverzögerung" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Titelwelle" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Regen ein/aus" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Regeneffekt ein/aus" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Wischer ein-/ausschalten" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Wischereffekt ein-/ausschalten" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Wassereffekt" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Wasser-Versatz-Skalierung" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Welleneffekt aus Fenstertitel" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Effekt fokussieren" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Fenstereffekt fokussieren" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Fenstertypen fokussieren" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Reibung" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Fenstertypen aufnehmen" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Gitterauflösung" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Invertiertes Einrasten von Fenstern" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Fenster zittern lassen" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Effekt zuordnen" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Fenstereffekt zuordnen" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Fenstertypen zuordnen" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Effekt maximieren" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Minimale Gittergröße" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimale Gittergröße" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Fenster verschieben" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Zittern" # 52895 AttribValues/label #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Einrasten invertiert" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Fenster einrasten" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Reibung" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Spring K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Federkonstante" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Einrasten von Fenstern ein/aus" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Federmodell für Fenster-Wackeleffekt verwenden" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Auflösung des Gitters" #: ../metadata/wobbly.xml.in.h:26 #, fuzzy msgid "Windows that should wobble when focused" msgstr "Fenstertypen, die beim Erhalt des Fokus wackeln sollen" #: ../metadata/wobbly.xml.in.h:27 #, fuzzy msgid "Windows that should wobble when grabbed" msgstr "Fenstertypen, die bei Aufnahme wackeln sollen" #: ../metadata/wobbly.xml.in.h:28 #, fuzzy msgid "Windows that should wobble when mapped" msgstr "Fenstertypen, die beim Zuordnen wackeln sollen" #: ../metadata/wobbly.xml.in.h:29 #, fuzzy msgid "Windows that should wobble when moved" msgstr "Fenstertypen, die beim Verschieben wackeln sollen" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Wackeleffekt beim Maximieren/Aufheben der Maximierung von Fenstern" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Wackelige Fenster" #~ msgid "Command line 0" #~ msgstr "Kommandozeile 0" #~ msgid "Run command 0" #~ msgstr "Befehl 0 ausführen" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Kommandozeile für Bildschirmfoto" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Kommandozeile für Bildschirmfoto" #~ msgid "Filter Linear" #~ msgstr "Linearer Filter" #~ msgid "Use linear filter when zoomed in" #~ msgstr "In Vergrößerung linearen Filter verwenden" #~ msgid "Zoom Desktop" #~ msgstr "Desktop zoomen" #~ msgid "Zoom In" #~ msgstr "Ansicht vergrößern" #~ msgid "Zoom Out" #~ msgstr "Ansicht verkleinern" #~ msgid "Zoom Pan" #~ msgstr "Ansicht verschieben" #~ msgid "Zoom Speed" #~ msgstr "Zoomgeschwindigkeit" #~ msgid "Zoom Timestep" #~ msgstr "Zoomintervall" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Desktop-Würfel zoomen und schwenken" #~ msgid "Zoom factor" #~ msgstr "Zoomfaktor" #~ msgid "Zoom pan" #~ msgstr "Ansicht verschieben" #~ msgid "Decrease window opacity" #~ msgstr "Fensterdeckkraft verringern" #~ msgid "Increase window opacity" #~ msgstr "Fensterdeckkraft erhöhen" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "Wert der Opazität für grundsätzlich transluzente Fenster" #~ msgid "Opacity window values" #~ msgstr "Opazitätswert" #~ msgid "Opacity windows" #~ msgstr "Transluzente Fenster" #~ msgid "Background Images" #~ msgstr "Hintergrundbilder" #~ msgid "Background images" #~ msgstr "Hintergrundbilder" #~ msgid "Place windows on a plane" #~ msgstr "Fenster auf einer Fläche platzieren" #~ msgid "Plane Down" #~ msgstr "Nach unten" #~ msgid "Plane Left" #~ msgstr "Nach links" #~ msgid "Plane Right" #~ msgstr "Nach rechts" #~ msgid "Plane To Face 1" #~ msgstr "Zu Arbeitsfäche 1 wechseln" #~ msgid "Plane To Face 10" #~ msgstr "Zu Arbeitsfäche 10 wechseln" #~ msgid "Plane To Face 11" #~ msgstr "Zu Arbeitsfäche 11 wechseln" #~ msgid "Plane To Face 12" #~ msgstr "Zu Arbeitsfäche 12 wechseln" #~ msgid "Plane To Face 2" #~ msgstr "Zu Arbeitsfäche 2 wechseln" #~ msgid "Plane To Face 3" #~ msgstr "Zu Arbeitsfäche 3 wechseln" #~ msgid "Plane To Face 4" #~ msgstr "Zu Arbeitsfäche 4 wechseln" #~ msgid "Plane To Face 5" #~ msgstr "Zu Arbeitsfäche 5 wechseln" #~ msgid "Plane To Face 6" #~ msgstr "Zu Arbeitsfäche 6 wechseln" #~ msgid "Plane To Face 7" #~ msgstr "Zu Arbeitsfäche 7 wechseln" #~ msgid "Plane To Face 8" #~ msgstr "Zu Arbeitsfäche 8 wechseln" #~ msgid "Plane To Face 9" #~ msgstr "Zu Arbeitsfäche 9 wechseln" #~ msgid "Plane Up" #~ msgstr "Nach oben" #~ msgid "Plane down" #~ msgstr "Nach unten" #~ msgid "Plane left" #~ msgstr "Nach links" #~ msgid "Plane right" #~ msgstr "Nach rechts" #~ msgid "Plane to face 1" #~ msgstr "Zu Arbeitsfäche 1 wechseln" #~ msgid "Plane to face 10" #~ msgstr "Zu Arbeitsfäche 10 wechseln" #~ msgid "Plane to face 11" #~ msgstr "Zu Arbeitsfäche 11 wechseln" #~ msgid "Plane to face 12" #~ msgstr "Zu Arbeitsfäche 12 wechseln" #~ msgid "Plane to face 2" #~ msgstr "Zu Arbeitsfäche 2 wechseln" #~ msgid "Plane to face 3" #~ msgstr "Zu Arbeitsfäche 3 wechseln" #~ msgid "Plane to face 4" #~ msgstr "Zu Arbeitsfäche 4 wechseln" #~ msgid "Plane to face 5" #~ msgstr "Zu Arbeitsfäche 5 wechseln" #~ msgid "Plane to face 6" #~ msgstr "Zu Arbeitsfäche 6 wechseln" #~ msgid "Plane to face 7" #~ msgstr "Zu Arbeitsfäche 7 wechseln" #~ msgid "Plane to face 8" #~ msgstr "Zu Arbeitsfäche 8 wechseln" #~ msgid "Plane to face 9" #~ msgstr "Zu Arbeitsfäche 9 wechseln" #~ msgid "Plane up" #~ msgstr "Nach oben" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Dauer der Fensterausblendung" #~ msgid "Open window menu" #~ msgstr "Fenstermenü öffnen" #~ msgid "Dock" #~ msgstr "Andocken" #~ msgid "Toolbar" #~ msgstr "Werkzeugleiste" #~ msgid "Menu" #~ msgstr "Menü" #~ msgid "Utility" #~ msgstr "Dienstprogramm" #~ msgid "Splash" #~ msgstr "Splash" #~ msgid "Dialog" #~ msgstr "Dialogfeld" #~ msgid "DropdownMenu" #~ msgstr "DropdownMenu" #~ msgid "PopupMenu" #~ msgstr "PopupMenu" #~ msgid "Tooltip" #~ msgstr "Kurzinfo" #~ msgid "Notification" #~ msgstr "Benachrichtigung" #~ msgid "Combo" #~ msgstr "Combo" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "ModalDialog" #~ msgid "Fullscreen" #~ msgstr "Vollbild" #~ msgid "Unknown" #~ msgstr "Unbekannt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 10 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 1 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 10 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 11 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 2 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 3 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 4 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 5 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 6 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 7 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 8 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 9 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "Add line (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Add point (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Advance to next slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Helligkeitsgrad in Prozent" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Durchlässigkeitsgrad in Prozent" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Sättigungsgrad in Prozent" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Sättigung" #, fuzzy #~ msgid "" #~ "Clear (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Close active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Decrease window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Verzögerung (in ms) zwischen den einzelnen Regentropfen" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "" #~ "Distance-Desktop sollte beim Umschalten zwischen Fenstern verkleinert sein" #~ msgid "Do not modify" #~ msgstr "Nicht ändern" #, fuzzy #~ msgid "" #~ "Draw using tool (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Drop-Shadow-X-Offset" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Drop-Shadow-Y-Offset" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Drop-Shadow-Durchlässigkeit" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Drop-Shadow-Radius" #, fuzzy #~ msgid "" #~ "Enable pointer water effects (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Flip to left viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Flip to right viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Fenstereffekt fokussieren (Keiner, Zittern)" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Vorheriges Fenster auswählen" #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Faltbeschleunigung (1,0-20,0)" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Faltgeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Falt-Zeitintervall (0,1-50,0)" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Russische Föderation" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Russisch" #, fuzzy #~ msgid "" #~ "Go back to previous slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Hide all windows and focus desktop (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Increase window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Initiate annotate drawing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Initiate annotate erasing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Initiate clone selection (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Initiate rectangle screenshot (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "Zeitintervall vor Verlagern der ausgewählten Fenster" #, fuzzy #~ msgid "" #~ "Layout and start transforming all windows (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Layout and start transforming window group (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Layout durchführen und mit der Umformung der Fenster in aktueller Ausgabe " #~ "beginnen" #, fuzzy #~ msgid "" #~ "Lower window beneath other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Make window shiver (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Fenstereffekt zuordnen (Keiner, Zittern)" #, fuzzy #~ msgid "" #~ "Maximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Maximize active window horizontally (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Maximize active window vertically (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Minimize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Minimiergeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Minimiergeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Minimale Gittergröße" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Anzahl der virtuellen Desktops" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Änderungsschritt für Durchlässigkeit" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Durchlässigkeitsgrad beweglicher Fenster" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Durchlässigkeitsgrad beweglicher Fenster" #, fuzzy #~ msgid "" #~ "Open a terminal (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Open window menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "Fenster nach Skalierung mit Symbol überlagern" #, fuzzy #~ msgid "" #~ "Plane down (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane up (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #~ msgid "Plugins that this must load before" #~ msgstr "Plugins, die zuvor geladen werden müssen" #~ msgid "Plugins that this requires" #~ msgstr "Erforderliche Plugins" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Popup-Schalter, wenn nicht sichtbar, und von allen Fenstern nächstes " #~ "Fenster auswählen" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Popup-Schalter, wenn nicht sichtbar, und von allen Fenstern nächstes " #~ "Fenster auswählen" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Popup-Schalter, wenn nicht sichtbar, und von allen Fenstern vorheriges " #~ "Fenster auswählen" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Popup-Schalter, wenn nicht sichtbar, und von allen Fenstern vorheriges " #~ "Fenster auswählen" #, fuzzy #~ msgid "" #~ "Pulse effect (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Raise window above other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate left and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate right and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to viewport (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate with window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Faltbeschleunigung (1,0-20,0)" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Zoomgeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Zoom-Zeitintervall (0,1-50,0)" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Skaliergeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Skalier-Zeitintervall (0,1-50,0)" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "Bildschirmgrößenmultiplikator für horizontale virtuelle Größe" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "Bildschirmgrößenmultiplikator für vertikale virtuelle Größe" #, fuzzy #~ msgid "" #~ "Select next window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Select previous window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Empfindlichkeit bei Zeigerbewegung" #~ msgid "Shade resistance (0-100)" #~ msgstr "Schattenwiderstand (0-100)" #, fuzzy #~ msgid "" #~ "Show Run Application dialog (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Show the main menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Abstand zwischen Fenstern" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Reibung" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Federkonstante" #, fuzzy #~ msgid "" #~ "Start Rotation (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Start moving window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Start resizing window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Skaliergeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Skalier-Zeitintervall (0,1-50,0)" #, fuzzy #~ msgid "" #~ "Take a screenshot (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Take a screenshot of a window (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Texturfilter (Schnell, Gut, Beste)" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "Rate des Bildschirmneuaufbaus (Häufigkeit/Sekunde)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Zeit (in ms) bis zum Beenden des Skaliermodus beim Verweilen über einem " #~ "Fenster" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Zeitüberschreitung vor Viewport-Wechsel" #, fuzzy #~ msgid "" #~ "Toggle active window maximized (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized horizontally (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized vertically (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle active window shaded (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle rain effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle use of slow animations (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle window snapping (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle wiper effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #~ msgid "USe linear filter when zoomed in" #~ msgstr "In Vergrößerung linearen Filter verwenden" #, fuzzy #~ msgid "" #~ "Unfold cube (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Unmaximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Auflösung des Gitters" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Wasser-Versatz-Skalierung" #, fuzzy #~ msgid "" #~ "Wave effect from window title (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Fensterausblendgeschwindigkeit" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Fensterausblendgeschwindigkeit" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Fenstertypen, die ausgeblendet werden sollen" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Fenstertypen, die ausgeblendet werden sollen" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Fenstertypen, die ausgeblendet werden sollen" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Fenstertypen, die ausgeblendet werden sollen" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "Fenstertypen, die im Skaliermodus skaliert werden sollen" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Fenstertypen, die im Schalter angezeigt werden sollen" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Fenstertypen, die beim Minimieren umgeformt werden sollen" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Fenstertypen, die ausgeblendet werden sollen" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Fenstertypen, die beim Erhalt des Fokus wackeln sollen" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "Fenstertypen, die bei Aufnahme wackeln sollen" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Fenstertypen, die beim Zuordnen wackeln sollen" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Fenstertypen, die beim Verschieben wackeln sollen" #, fuzzy #~ msgid "" #~ "Zoom In (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Zoom Out (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Zoomgeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Zoom-Zeitintervall (0,1-50,0)" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Zoomfaktor" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "In Richtung %d drehen" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "In Richtung %d drehen" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "In Richtung %d drehen (mit Fenster)" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "In Richtung %d drehen (mit aktivem Fenster)" #~ msgid "Rotate To Face %d" #~ msgstr "In Richtung %d drehen" #~ msgid "Rotate to face %d" #~ msgstr "In Richtung %d drehen" #~ msgid "Rotate To Face %d with Window" #~ msgstr "In Richtung %d drehen (mit Fenster)" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "In Richtung %d drehen (mit aktivem Fenster)" #~ msgid "Command line %d" #~ msgstr "Kommandozeile %d" #~ msgid "Command line to be executed in shell when run_command%d is invoked" #~ msgstr "" #~ "Kommandozeile, die beim Aufruf von Kommando 'run_command%d' in Shell " #~ "ausgeführt werden soll" #~ msgid "Run command %d" #~ msgstr "Kommando %d ausführen" #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command%d" #~ msgstr "" #~ "Eine Tastenzuordnung, bei deren Aktivierung das durch Kommando %d " #~ "identifizierte Shell-Kommando ausgeführt wird" #~ msgid "Move Window Types" #~ msgstr "Fenstertypen verschieben" #~ msgid "Corners" #~ msgstr "Ecken" #~ msgid "Focus window when mouse moves over them" #~ msgstr "Fenster fokussieren, wenn sich der Mauszeiger darüber befindet" #~ msgid "Initiate All Windows" #~ msgstr "Alle Fenster initiieren" #~ msgid "Initiate Keyboard Window Move" #~ msgstr "Fensterverschiebung via Tastatur initiieren" #~ msgid "Initiate Keyboard Window Resize" #~ msgstr "Fensterskalierung via Tastatur initiieren" #~ msgid "Initiate Window Switcher" #~ msgstr "Fenster-Switcher initiieren" #~ msgid "Modifier to show switcher for all windows" #~ msgstr "Modifikator zur Anzeige des Switcher für alle Fenster" #~ msgid "Return from scale view" #~ msgstr "Zurück aus Skalierungsansicht" #~ msgid "Show switcher" #~ msgstr "Switcher anzeigen" #~ msgid "Sloppy Focus" #~ msgstr "Verzögerter Fokus" #~ msgid "Start moving window using keyboard" #~ msgstr "Fensterverschiebung via Tastatur starten" #~ msgid "Terminate" #~ msgstr "Beenden" #~ msgid "Water effect on system beep" #~ msgstr "Wassereffekt für System-Warnton" #~ msgid "" #~ "Window types that should be fading (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die ein-/ausgeblendet werden sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should be transformed when minimized (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgstr "" #~ "Fenstertypen, die beim Minimieren umgeformt werden sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should scaled in scale mode (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die im Skaliermodus skaliert werden sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should shown in switcher (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die im Switcher angezeigt werden sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should wobble when focused (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die beim Erhalt des Fokus wackeln sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should wobble when grabbed (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die bei Aufnahme wackeln sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should wobble when mapped (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die beim Anzeigen wackeln sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should wobble when moved (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die beim Verschieben wackeln sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "Wobble effect on system beep" #~ msgstr "Wackeleffekt für System-Warnton" compiz-0.9.11+14.04.20140409/po/da.po0000644000015301777760000030477712321343002017056 0ustar pbusernogroup00000000000000# Danish message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2001 SuSE GmbH. # H. Merethe Eriksen , 2001. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-03-29 20:35+0200\n" "Last-Translator: Marcus Møller \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Skrivebord" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Vinduesmenu" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ingen" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Skygge" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "Maksimer" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maksimer Vandret" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maksimer Lodret" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimer" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Hæv" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Sink" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Vinduesmenu" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Blue type" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Formindsk vinduets uigennemsigtighed" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Maksimer det aktive vindue i bredden" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity tema gennemsigtighed" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity tema gennemsigtigheds skygge" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Brug Metacity tema" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Luk vindue" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Gendan vindue" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maksimer vindue" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimer vindue" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Start" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Kubusfarve" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" # #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Aktive plugins" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Tegn" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Tegn med værktøj" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Start" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Start tilpasning af vinduets størrelse" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Start tilpasning af vinduets størrelse" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Start" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Lineært filter" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Skaler vinduer" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Skaler vinduer" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Teksturfilter" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Farvemætning" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Farvemætning" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Foldehastighed" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Placer vinduer" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Farvemætning" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Skaler vinduer" #: ../metadata/blur.xml.in.h:12 #, fuzzy msgid "Blur windows that doesn't have focus" msgstr "Vinduestyper, der skal \"slingre\", nÃ¥r de fÃ¥r fokus" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "Skaler vinduer" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Skaler vinduer" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 #, fuzzy msgid "Pulse effect" msgstr "Fokuseffekt" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Fadehastighed for vindue" #: ../metadata/blur.xml.in.h:30 #, fuzzy msgid "Windows that should be affected by focus blur" msgstr "Vinduestyper, der skal fades" #: ../metadata/blur.xml.in.h:31 #, fuzzy msgid "Windows that should be use alpha blur by default" msgstr "Vinduestyper, der skal fades" #: ../metadata/clone.xml.in.h:1 #, fuzzy msgid "Clone Output" msgstr "Udgange" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Tag et skærmbillede" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:13 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:14 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:15 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:16 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:17 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:18 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:19 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:20 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:21 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:22 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:23 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:24 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:51 #, fuzzy msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Kommandolinje, der skal køres i Shell, nÃ¥r kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:52 #, fuzzy msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Kommandolinje, der skal køres i Shell, nÃ¥r kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:53 #, fuzzy msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Kommandolinje, der skal køres i Shell, nÃ¥r kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:54 #, fuzzy msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Kommandolinje, der skal køres i Shell, nÃ¥r kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:55 #, fuzzy msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Kommandolinje, der skal køres i Shell, nÃ¥r kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:56 #, fuzzy msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Kommandolinje, der skal køres i Shell, nÃ¥r kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:57 #, fuzzy msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Kommandolinje, der skal køres i Shell, nÃ¥r kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:58 #, fuzzy msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Kommandolinje, der skal køres i Shell, nÃ¥r kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:59 #, fuzzy msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Kommandolinje, der skal køres i Shell, nÃ¥r kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:60 #, fuzzy msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Kommandolinje, der skal køres i Shell, nÃ¥r kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:61 #, fuzzy msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Kommandolinje, der skal køres i Shell, nÃ¥r kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:62 #, fuzzy msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Kommandolinje, der skal køres i Shell, nÃ¥r kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Kommando" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Kommando '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Kommando '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Kommando '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Kommando '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Kommando: " # #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktive plugins" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Tillad trækning af fuldskærmsvinduer, uden at der omdirrigeres til pixmaps " "uden for skærmbilledet" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Hørbar klokke" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Hørbar systemtone" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatisk hævning" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Forsinkelse ved automatisk hævning" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatisk registrering af udgangsenheder" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatisk registrering af opdateringshastighed" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Bedste" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Klik for at fokusere" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Fokus flyttes til vinduet, nÃ¥r der klikkes pÃ¥ det." #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Luk det aktive vindue" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Standardikon" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Standardbillede til vinduesikon" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Skrivebordskubus" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Registrer udgange" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Registrer opdateringshastighed" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Hurtig" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Vinduestyper til fokuseffekt" #: ../metadata/core.xml.in.in.h:25 #, fuzzy msgid "Focus Prevention Windows" msgstr "Vinduestyper til fokuseffekt" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Vinduestyper til fokuseffekt" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Generelle muligheder" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Generelle compiz muligheder" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "God" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Skjul vinduer, der ikke er pÃ¥ opgavelinjen" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Skjul alle vinduer, og flyt fokus til skrivebord" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "Skjul vinduer, der ikke er pÃ¥ opgavelinjen, nÃ¥r skrivebordet vises" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Vandret virtuel størrelse" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorer vink, nÃ¥r maksimeret" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignorer vink om størrelsesforøgning og -aspekter, nÃ¥r vinduet er maksimeret" #: ../metadata/core.xml.in.in.h:39 #, fuzzy msgid "Interval before raising selected windows" msgstr "Interval inden de valgte vinduer hæves" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Interval mellem ping beskeder" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Belysning" # #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Liste over aktive plugins" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Liste over strenge, der beskriver udgangsenheder" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" # #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Sænk vindue" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Placer vinduet under de andre vinduer" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maksimer vindue vandret" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maksimer vindue lodret" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maksimer det aktive vindue" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maksimer det aktive vindue i bredden" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maksimer det aktive vindue i højden" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimer det aktive vindue" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Antal skriveborde" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Antal virtuelle skriveborde" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Udfør kun skærmopdatering i den lodrette slukkeperiode" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Udgange" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Regnforsinkelse" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Hæv ved klik" # #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Hæv vindue" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Hæv de valgte vinduer efter interval" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Hæv vinduet over de andre vinduer" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Hæv vinduerne, nÃ¥r der klikkes" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Opdateringshastighed" #: ../metadata/core.xml.in.in.h:74 #, fuzzy msgid "Screen size multiplier for horizontal virtual size" msgstr "Skærmstørrelsesmultiplikator til den vandrette virtuelle størrelse" #: ../metadata/core.xml.in.in.h:75 #, fuzzy msgid "Screen size multiplier for vertical virtual size" msgstr "Skærmstørrelsesmultiplikator til den lodrette virtuelle størrelse" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Zoom pÃ¥ skrivebord" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Langsomme animationer" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synkroniser med lodret slukning" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Teksturfilter" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Teksturfilter" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Teksturfilter" #: ../metadata/core.xml.in.in.h:83 #, fuzzy msgid "The rate at which the screen is redrawn (times/second)" msgstr "" "Den hastighed, der anvendes til at tegne skærmbilledet igen (antal gange/" "sekund)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "SlÃ¥ maksimering af vindue til/fra" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "SlÃ¥ vandret maksimering af vindue til/fra" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "SlÃ¥ lodret maksimering af vindue til/fra" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "SlÃ¥ medtoning af vindue til/fra" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "SlÃ¥ maksimering af det aktive vindue til/fra" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "SlÃ¥ den vandrette maksimering af det aktive vindue til/fra" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "SlÃ¥ lodret maksimering af det aktive vindue til/fra" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "SlÃ¥ nedtoning af det aktive vindue til/fra" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "SlÃ¥ brugen af langsomme animationer til/fra" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Ophæv maksimeringen af det aktive vindue" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Omdiriger ikke fuldskærmsvinduer" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Brug spredt lys, nÃ¥r skærmbilledet omdannes" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Lodret virtuel størrelse" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Acceleration" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "GÃ¥ til næste dias" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animer himmelkuppel" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animer himmelkuplen, nÃ¥r kubussen roteres" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Automatisk hævning" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Farve til kubussens top og bund" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Farve til det nederste farvestop i himmelkuplens aftagende farveforløb" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Farve til det øverste farvestop i himmelkuplens aftagende farveforløb" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Kubusfarve" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kubusfarve" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Skrivebordskubus" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Foldeaccelaration" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Foldehastighed" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Tidstrin for foldning" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "Generer mipmaps, nÃ¥r det er muligt, for at opnÃ¥ en højere kvalitetsskalering" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "GÃ¥ tilbage til forrige dias" # #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Billedfiler" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Billede, der skal bruges som tekstur til himmelkuplen" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Kubus indvendig" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Kubus indvendig" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Liste over PNG- og SVG-filer, der skal gengives pÃ¥ toppen af kubussen" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" # #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Næste dias" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "Kubus indvendig" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Placer vinduer pÃ¥ kubus" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "Forrige dias" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Vis himmelkuppel" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Tilpas billede" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Tilpas billederne, sÃ¥ de dækker toppen af kubussen" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Himmelkuppel" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Slutfarve til himmelkuplens farvegraduering" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Startfarve til himmelkuplens farvegraduering" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Billede til himmelkuppel" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Hastighed" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Tidstrin" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Fold ud" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Fold kubussen ud" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 #, fuzzy msgid "Allow mipmaps to be generated for decoration textures" msgstr "Tillad mipmaps at blive skabt til dekorations texturer" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Kommando" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Skaler vinduer" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Dekoratørkommandolinje, som udføres, hvis der ikke allerede kører en " "dekoratør" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Slagskyggeforskydning X" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Slagskyggeforskydning Y" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Slagskyggeradius" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Slagskyggens uigennemsigtighed" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Slagskyggeradius" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "Fastgør vinduer" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Skyggeforskydning X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Skyggeforskydning Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Skyggens uigennemsigtighed" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Skyggeradius" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Fastgør vinduer" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Vinduesdekoration" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Vinduesdekorationer" #: ../metadata/decoration.xml.in.h:19 #, fuzzy msgid "Windows that should be decorated" msgstr "Vinduestyper, der skal fades" #: ../metadata/decoration.xml.in.h:20 #, fuzzy msgid "Windows that should have a shadow" msgstr "Vinduestyper, der skal fades" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Rotationshastighed" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Begræns Y" # #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Tilpas vinduets størrelse" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Vendingstid" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Fadehastighed" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Vendingstid" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Fadeeffekt ved systemtone" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Vinduerne tones ind, nÃ¥r de tilknyttes, og tones ud, nÃ¥r tilknytningen " "ophæves." #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Skaler vinduer" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Fading af vinduer" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Visuel klokke i fuld skærm" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Fadeeffekt i fuld skærm ved systemtone" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Visuel klokke" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Fadehastighed for vindue" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Vinduestyper, der skal skaleres i skaleringstilstand" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 #, fuzzy msgid "Windows that should be fading" msgstr "Vinduestyper, der skal fades" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Punkt" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Tilføj punkt" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Dialogboksen Kør" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Kommandolinje til skærmbillede" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Kommandolinje til skærmbillede" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Vis hovedmenu" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Vis dialogboksen til kørsel af program" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Vis hovedmenuen" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Tag et skærmbillede" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Tag et skærmbillede af et vindue" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Kommandolinje til skærmbillede" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Kommandolinje til vindueskærmbillede" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "MÃ¥ ikke ændres" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "MÃ¥ ikke ændres" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimer effekt" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Minimer vinduer" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Sænk hastighed" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Minimer tidstrin" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Skyggemodstand" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Skyggemodstand" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Vinduer skal ændres, nÃ¥r de minimeres og gendannes" #: ../metadata/minimize.xml.in.h:10 #, fuzzy msgid "Windows that should be transformed when minimized" msgstr "Vinduestyper, der skal ændres, nÃ¥r de minimeres" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Begræns Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Begræns Y-koordinaten til arbejdsomrÃ¥det" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Start vinduesflytning" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Vis minimerede vinduer" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Flyt vindue" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Flyt vindue" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Uigennemsigtighed" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Uigennemsigtighedsniveau ved flytning af vinduer" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Frigør og gendan automatisk maksimerede vinduer, nÃ¥r de trækkes" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Frigør maksimerede vinduer" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Start flytning af vindue" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Lysstyrke" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Lysstyrke" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Lysstyrke" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Lysstyrke" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Formindsk uigennemsigtighed" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Forøg uigennemsigtighed" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Trin i den trinvise ændring af uigennemsigtigheden" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Trin i den trinvise ændring af uigennemsigtigheden" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Uigennemsigtighedstrin" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Uigennemsigtighedsniveau ved flytning af vinduer" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Farvemætning" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Farvemætning" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Farvemætning" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Farvemætning" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Vinduesdekorationer" # #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Vinduestyper" # #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Vinduestyper til tilknytningseffekt" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Vinduestyper, der skal fades" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Vinduestyper, der skal fades" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Vinduestyper, der skal fades" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Vinduesmenu" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Vinduestyper til fokuseffekt" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Vandret virtuel størrelse" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Placer vinduer" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Placer vinduerne pÃ¥ de korrekte positioner, nÃ¥r de er tilknyttet" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Vis minimerede vinduer" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "PÃ¥ alle udgangs enheder" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Vandret virtuel størrelse" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Vis minimerede vinduer" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Løsninger til vinduesplaceringer" #: ../metadata/place.xml.in.h:25 #, fuzzy msgid "Windows that should be positioned by default" msgstr "Vinduestyper, der skal fades" #: ../metadata/place.xml.in.h:26 #, fuzzy msgid "Windows that should be positioned in specific viewports by default" msgstr "Vinduestyper, der skal skaleres i skaleringstilstand" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Vinduesdekorationer" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Løsninger" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Vis minimerede vinduer" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Vandret virtuel størrelse" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Vis minimerede vinduer" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Vandret virtuel størrelse" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 #, fuzzy msgid "Regex Matching" msgstr "SlÃ¥ fastgøring af vinduer til/fra" #: ../metadata/regex.xml.in.h:2 #, fuzzy msgid "Regex window matching" msgstr "SlÃ¥ fastgøring af vinduer til/fra" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Kubusfarve" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Kubusfarve" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Start tilpasning af vinduets størrelse" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Start tilpasning af vinduets størrelse" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Start tilpasning af vinduets størrelse" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Start tilpasning af vinduets størrelse" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Start tilpasning af vinduets størrelse" # #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Tilpas vinduets størrelse" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Kubusfarve" # #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Tilpas vinduets størrelse" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" # #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Tilpas vinduets størrelse" # #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Tilpas vinduets størrelse" # #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Tilpas størrelsen pÃ¥ vinduet" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Start tilpasning af vinduesstørrelsen" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Start tilpasning af vinduesstørrelsen" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Start tilpasning af vinduesstørrelsen" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Start tilpasning af vinduesstørrelsen" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Start tilpasning af vinduesstørrelsen" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" # #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Tilpas vinduets størrelse" #: ../metadata/resize.xml.in.h:28 #, fuzzy msgid "Windows that normal resize should be used for" msgstr "Vinduestyper, der skal fades" #: ../metadata/resize.xml.in.h:29 #, fuzzy msgid "Windows that outline resize should be used for" msgstr "Vinduestyper, der skal fades" #: ../metadata/resize.xml.in.h:30 #, fuzzy msgid "Windows that rectangle resize should be used for" msgstr "Vinduestyper, der skal fades" #: ../metadata/resize.xml.in.h:31 #, fuzzy msgid "Windows that stretch resize should be used for" msgstr "Vinduestyper, der skal fades" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Træk-og-slip til kant, vend" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Flyt til kant, vend" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Markør til kant, vend" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Vendingstid" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" "Vend til venstre visningsomrÃ¥de, og bevar markøren pÃ¥ dens nuværende " "relative placering pÃ¥ skærmen" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "Vend til næste visningsomrÃ¥de, nÃ¥r et objekt trækkes til skærmens kant" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "Vend til næste visningsomrÃ¥de, nÃ¥r markøren flyttes til skærmens kant" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Vend til næste visningsomrÃ¥de, nÃ¥r vinduet flyttes til skærmens kant" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" "Vend til højre visningsomrÃ¥de, og bevar markøren pÃ¥ dens nuværende relative " "placering pÃ¥ skærmen" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Vend Y-aksen for markørbevægelser" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Omvendt Y-akse for markør" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Markørfølsomhed" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 #, fuzzy msgid "Raise window when rotating" msgstr "Hæv vinduerne, nÃ¥r der klikkes" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Roter kubus" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Roter og vend til venstre" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Roter og vend til højre" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Roter venstre" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Roter til venstre med vindue" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Roter højre" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Roter til højre med vindue" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Roter til" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Roter kubus" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Roter skrivebordskubus" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Roter til venstre" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Roter til venstre, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Roter til højre" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Roter til højre, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Roter til visningsomrÃ¥de" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Roter vindue" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Roter med vindue" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Rotationsacceleration" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Rotationshastighed" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Tidstrin for rotation" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Rotations Zoom" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Det følsomhedsniveau, der skal anvendes til markørbevægelserne" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "Fastgør kubusrotation til oversiden" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Fastgør kubusrotation til oversiden" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "Fastgør til oversiden" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Fastgør til oversiden" # #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Start rotation" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Den tid, der gÃ¥r, inden visningsomrÃ¥det skifter" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Uigennemsigtighed i procent" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Stor" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Gør baggrund mørkere" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Gør baggrunden mørkere, nÃ¥r vinduerne skaleres" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblem" #: ../metadata/scale.xml.in.h:12 #, fuzzy msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "Start Vis Skrivebord hvis der klikkes pÃ¥ skrivebordet nÃ¥r Skaler køres" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Markørens pegetid" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Start vinduesvælger" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Start vinduesvælger for alle vinduer" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Start vinduesvælger for vinduesgruppe" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Start vinduesvælgeren for vinduer i det aktuelle outputomrÃ¥de" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Arranger og start omdannelsen af alle vinduerne" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Arranger og start omdannelsen af vinduesgruppen" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Arranger og start omdannelsen af vinduerne" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Arranger og start omdannelsen af vinduer i det aktuelle outputomrÃ¥de" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "PÃ¥ alle udgangs enheder" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "PÃ¥ nuværende udgangs enhed" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Overlejringsikon" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Sæt et ikon pÃ¥ vinduerne, nÃ¥r de er skaleret" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Skaler" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Skaler vinduer" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Skaleringshastighed" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Tidstrin for skalering" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Skaler vinduer" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Mellemrum mellem vinduer" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Mellemrum" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Den tid (i ms), der gÃ¥r, inden skaleringstilstanden afsluttes, nÃ¥r markøren " "peger pÃ¥ et vindue" #: ../metadata/scale.xml.in.h:42 #, fuzzy msgid "Windows that should be scaled in scale mode" msgstr "Vinduestyper, der skal skaleres i skaleringstilstand" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Bibliotek" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Tag et skærmbillede" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Vis dialogboksen til kørsel af program" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Tag et skærmbillede" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Kommandolinje til skærmbillede" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Lysstyrken angivet i procent" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Farvemætningen angivet i procent" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Programskifter" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Automatisk hævning" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Placer forrest" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Placer det valgte vindue forrest" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Fjernskrivebord zoomes ud, nÃ¥r der skiftes til et andet vindue" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikon" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimeret" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Skrivebordskubus" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Næste vindue" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Næste vindue" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Næste vindue" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Vis opgaveskifteren, hvis den ikke er synlig, og vælg næste vindue" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Vis opgaveskifteren, hvis den ikke er synlig, og vælg næste vindue blandt " "alle vinduer" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Vis opgaveskifteren, hvis den ikke er synlig, og vælg forrige vindue" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Vis opgaveskifteren, hvis den ikke er synlig, og vælg forrige vindue blandt " "alle vinduer" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Forrige dias" # #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Forrige vindue" # #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Forrige vindue" # #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Forrige vindue" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Vælg næste vindue" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Vælg forrige vindue" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Vis ikon ud for miniaturebillede" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Vis minimerede vinduer" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Hastighed for programskifter" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Tidstrin for programskifter" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Skaler vinduer" #: ../metadata/switcher.xml.in.h:41 #, fuzzy msgid "Windows that should be shown in switcher" msgstr "Vinduestyper, der skal vises i programskifteren" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Tilføj linje" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Tilføj punkt" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Tilføjer vandeffekter til forskellige skrivebordshandlinger" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Forsinkelse (i ms) mellem hver regndrÃ¥be" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Aktiver markørvandeffekter" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Line" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Forskydningsstørrelse" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punkt" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Regnforsinkelse" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Titelbølge" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Regn til/fra" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "SlÃ¥ regneffekten til/fra" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Visker til/fra" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "SlÃ¥ viskereffekten til/fra" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Vandeffekt" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Størrelse pÃ¥ vandforskydning" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Bølgeeffekt til vinduestitel" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Fokuseffekt" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Effekt ved fokus pÃ¥ vinduer" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Vinduestyper til fokuseffekt" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Friktion" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Vinduestyper til gribeeffekt" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Gitteropløsning" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Omvendt fastgøring af vinduer" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Lad vinduer dirre" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Tilknytningseffekt" # #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Effekt ved tilknytning af vinduer" # #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Vinduestyper til tilknytningseffekt" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Maksimeringseffekt" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Mindste gitterstørrelse" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Knudernes minimumstørrelse i gitteret" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Flyt vindue" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Rysten" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Omvendt fastgøring" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Fastgør vinduer" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fjerderfriktion" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Fjeder-K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Fjederkonstant" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "SlÃ¥ fastgøring af vinduer til/fra" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Brug fjedermodel til \"slingrende\" vinduer" # #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Opløsning for knuder i gitteret" #: ../metadata/wobbly.xml.in.h:26 #, fuzzy msgid "Windows that should wobble when focused" msgstr "Vinduestyper, der skal \"slingre\", nÃ¥r de fÃ¥r fokus" #: ../metadata/wobbly.xml.in.h:27 #, fuzzy msgid "Windows that should wobble when grabbed" msgstr "" "Vinduestyper, der skal \"slingre\", nÃ¥r der tages fat i dem med markøren" #: ../metadata/wobbly.xml.in.h:28 #, fuzzy msgid "Windows that should wobble when mapped" msgstr "Vinduestyper, der skal \"slingre\", nÃ¥r de tilknyttes" #: ../metadata/wobbly.xml.in.h:29 #, fuzzy msgid "Windows that should wobble when moved" msgstr "Vinduestyper, der skal \"slingre\", nÃ¥r de flyttes" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Vinduerne \"slingrer\", nÃ¥r de maksimeres eller gendannes" # #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "\"Slingrende\" vinduer" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Kommando: " #, fuzzy #~ msgid "Run command 0" #~ msgstr "Kommando '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Kommandolinje til skærmbillede" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Kommandolinje til skærmbillede" #~ msgid "Filter Linear" #~ msgstr "Lineært filter" #, fuzzy #~ msgid "Use linear filter when zoomed in" #~ msgstr "Brug lineært filter, nÃ¥r der er zoomet ind" #~ msgid "Zoom Desktop" #~ msgstr "Zoom pÃ¥ skrivebord" #~ msgid "Zoom In" #~ msgstr "Zoom ind" #~ msgid "Zoom Out" #~ msgstr "Zoom ud" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Zoom ind" #~ msgid "Zoom Speed" #~ msgstr "Zoomhastighed" #~ msgid "Zoom Timestep" #~ msgstr "Tidstrin for zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zoom og panorer pÃ¥ skrivebordskubus" #~ msgid "Zoom factor" #~ msgstr "Zoomfaktor" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Zoom ind" #~ msgid "Decrease window opacity" #~ msgstr "Formindsk vinduets uigennemsigtighed" #~ msgid "Increase window opacity" #~ msgstr "Forøg vinduets uigennemsigtighed" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "Mellemrum mellem vinduer" #~ msgid "Background Images" #~ msgstr "Baggrunds Billeder" #~ msgid "Background images" #~ msgstr "Baggrunds billeder" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Placer vinduer pÃ¥ kubus" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Placer vinduer" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Roter venstre" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Roter højre" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Placer vinduer" #, fuzzy #~ msgid "Plane down" #~ msgstr "Placer vinduer" #, fuzzy #~ msgid "Plane left" #~ msgstr "Roter til venstre" #, fuzzy #~ msgid "Plane right" #~ msgstr "Roter til højre" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane up" #~ msgstr "Placer vinduer" #~ msgid "Open window menu" #~ msgstr "Ã…bn vinduesmenuen" #~ msgid "Dock" #~ msgstr "Dok" #~ msgid "Toolbar" #~ msgstr "Værktøjslinje" #~ msgid "Menu" #~ msgstr "Menu" #~ msgid "Utility" #~ msgstr "Værktøj" #~ msgid "Splash" #~ msgstr "Splash" #~ msgid "Dialog" #~ msgstr "Dialogboks" #~ msgid "DropdownMenu" #~ msgstr "Rullemenu" #~ msgid "PopupMenu" #~ msgstr "Pop op-menu" #~ msgid "Tooltip" #~ msgstr "Værktøjstip" #~ msgid "Notification" #~ msgstr "Besked" #~ msgid "Combo" #~ msgstr "Kombination" #~ msgid "Dnd" #~ msgstr "Træk-og-slip" #~ msgid "ModalDialog" #~ msgstr "Modaldialogboks" #~ msgid "Fullscreen" #~ msgstr "Fuldskærm" #~ msgid "Unknown" #~ msgstr "Ukendt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, nÃ¥r den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Lysstyrken angivet i procent" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Uigennemsigtighed i procent" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Farvemætningen angivet i procent" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Farvemætning" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Forsinkelse (i ms) mellem hver regndrÃ¥be" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "Fjernskrivebord zoomes ud, nÃ¥r der skiftes til et andet vindue" #~ msgid "Do not modify" #~ msgstr "MÃ¥ ikke ændres" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Slagskyggeforskydning X" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Slagskyggeforskydning Y" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Slagskyggens uigennemsigtighed" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Slagskyggeradius" #, fuzzy #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Effekt ved fokus pÃ¥ vinduer" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Vælg forrige vindue" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Foldeaccelaration" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Foldehastighed" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Tidstrin for foldning" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "Interval inden de valgte vinduer hæves" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Arranger og start omdannelsen af vinduer i det aktuelle outputomrÃ¥de" # #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Effekt ved tilknytning af vinduer" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Sænk hastighed" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Minimer tidstrin" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Knudernes minimumstørrelse i gitteret" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Antal virtuelle skriveborde" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Trin i den trinvise ændring af uigennemsigtigheden" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Uigennemsigtighedsniveau ved flytning af vinduer" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Uigennemsigtighedsniveau ved flytning af vinduer" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "Sæt et ikon pÃ¥ vinduerne, nÃ¥r de er skaleret" #~ msgid "Plugins that this must load before" #~ msgstr "Plugins, som skal indlæses først" #~ msgid "Plugins that this requires" #~ msgstr "Obligatoriske plugins" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Vis opgaveskifteren, hvis den ikke er synlig, og vælg næste vindue blandt " #~ "alle vinduer" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Vis opgaveskifteren, hvis den ikke er synlig, og vælg næste vindue blandt " #~ "alle vinduer" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Vis opgaveskifteren, hvis den ikke er synlig, og vælg forrige vindue " #~ "blandt alle vinduer" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Vis opgaveskifteren, hvis den ikke er synlig, og vælg forrige vindue " #~ "blandt alle vinduer" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Rotationsacceleration" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Rotationshastighed" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Tidstrin for rotation" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Skaleringshastighed" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Tidstrin for skalering" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "Skærmstørrelsesmultiplikator til den vandrette virtuelle størrelse" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "Skærmstørrelsesmultiplikator til den lodrette virtuelle størrelse" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Det følsomhedsniveau, der skal anvendes til markørbevægelserne" #, fuzzy #~ msgid "Shade resistance (0-100)" #~ msgstr "Skyggemodstand" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Mellemrum mellem vinduer" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Fjerderfriktion" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Fjederkonstant" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Hastighed for programskifter" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Tidstrin for programskifter" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Teksturfiltrering" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "" #~ "Den hastighed, der anvendes til at tegne skærmbilledet igen (antal gange/" #~ "sekund)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Den tid (i ms), der gÃ¥r, inden skaleringstilstanden afsluttes, nÃ¥r " #~ "markøren peger pÃ¥ et vindue" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Den tid, der gÃ¥r, inden visningsomrÃ¥det skifter" #~ msgid "USe linear filter when zoomed in" #~ msgstr "Brug lineært filter, nÃ¥r der er zoomet ind" # #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Opløsning for knuder i gitteret" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Størrelse pÃ¥ vandforskydning" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Fadehastighed for vindue" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Fadehastighed for vindue" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Vinduestyper, der skal fades" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Vinduestyper, der skal fades" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Vinduestyper, der skal fades" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Vinduestyper, der skal fades" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "Vinduestyper, der skal skaleres i skaleringstilstand" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Vinduestyper, der skal vises i programskifteren" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Vinduestyper, der skal ændres, nÃ¥r de minimeres" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Vinduestyper, der skal fades" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Vinduestyper, der skal \"slingre\", nÃ¥r de fÃ¥r fokus" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "" #~ "Vinduestyper, der skal \"slingre\", nÃ¥r der tages fat i dem med markøren" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Vinduestyper, der skal \"slingre\", nÃ¥r de tilknyttes" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Vinduestyper, der skal \"slingre\", nÃ¥r de flyttes" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Zoomhastighed" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Tidstrin for zoom" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Zoomfaktor" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Roter til side %d med vindue" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "Roter til side %d, og lad det aktive vindue følge med" #~ msgid "Rotate To Face %d" #~ msgstr "Roter til side %d" #~ msgid "Rotate to face %d" #~ msgstr "Roter til side %d" #~ msgid "Rotate To Face %d with Window" #~ msgstr "Roter til side %d med vindue" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "Roter til side %d, og lad det aktive vindue følge med" #~ msgid "Command line %d" #~ msgstr "Kommandolinje %d" #~ msgid "Run command %d" #~ msgstr "Kør kommando %d" # #~ msgid "Move Window Types" #~ msgstr "Vinduestyper til flytteeffekt" #, fuzzy #~ msgid "Corners" #~ msgstr "Cornish" # #, fuzzy #~ msgid "Show switcher" #~ msgstr "Vis æ&ndringer" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Diskette" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Starter dæmon." #, fuzzy #~ msgid "Terminate" #~ msgstr "Terminaler" compiz-0.9.11+14.04.20140409/po/as.po0000644000015301777760000014477712321343002017077 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-11-25 00:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:11 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 ../metadata/zoom.xml.in.h:2 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 ../metadata/cube.xml.in.h:28 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:13 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:23 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/core.xml.in.h:1 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/core.xml.in.h:2 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/core.xml.in.h:3 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/core.xml.in.h:4 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/core.xml.in.h:5 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/core.xml.in.h:6 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/core.xml.in.h:7 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/core.xml.in.h:8 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/core.xml.in.h:9 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/core.xml.in.h:10 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/core.xml.in.h:11 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/core.xml.in.h:12 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/core.xml.in.h:13 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.h:14 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.h:15 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.h:16 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.h:17 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.h:18 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.h:19 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.h:20 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.h:21 msgid "Best" msgstr "" #: ../metadata/core.xml.in.h:22 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.h:23 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.h:24 msgid "Close Window" msgstr "" #: ../metadata/core.xml.in.h:25 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.h:26 msgid "Command line 0" msgstr "" #: ../metadata/core.xml.in.h:27 msgid "Command line 1" msgstr "" #: ../metadata/core.xml.in.h:28 msgid "Command line 10" msgstr "" #: ../metadata/core.xml.in.h:29 msgid "Command line 11" msgstr "" #: ../metadata/core.xml.in.h:30 msgid "Command line 2" msgstr "" #: ../metadata/core.xml.in.h:31 msgid "Command line 3" msgstr "" #: ../metadata/core.xml.in.h:32 msgid "Command line 4" msgstr "" #: ../metadata/core.xml.in.h:33 msgid "Command line 5" msgstr "" #: ../metadata/core.xml.in.h:34 msgid "Command line 6" msgstr "" #: ../metadata/core.xml.in.h:35 msgid "Command line 7" msgstr "" #: ../metadata/core.xml.in.h:36 msgid "Command line 8" msgstr "" #: ../metadata/core.xml.in.h:37 msgid "Command line 9" msgstr "" #: ../metadata/core.xml.in.h:38 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/core.xml.in.h:39 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/core.xml.in.h:40 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/core.xml.in.h:41 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/core.xml.in.h:42 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/core.xml.in.h:43 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/core.xml.in.h:44 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/core.xml.in.h:45 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/core.xml.in.h:46 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/core.xml.in.h:47 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/core.xml.in.h:48 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/core.xml.in.h:49 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/core.xml.in.h:50 msgid "Decrease Opacity" msgstr "" #: ../metadata/core.xml.in.h:51 msgid "Decrease window opacity" msgstr "" #: ../metadata/core.xml.in.h:52 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.h:53 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.h:54 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.h:55 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:56 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.h:57 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.h:58 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.h:59 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.h:60 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.h:61 msgid "Good" msgstr "" #: ../metadata/core.xml.in.h:62 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.h:63 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.h:64 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.h:65 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:66 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.h:67 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.h:68 msgid "Increase Opacity" msgstr "" #: ../metadata/core.xml.in.h:69 msgid "Increase window opacity" msgstr "" #: ../metadata/core.xml.in.h:70 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.h:71 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.h:72 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.h:73 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.h:74 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.h:75 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.h:76 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.h:77 msgid "Maximize Window" msgstr "" #: ../metadata/core.xml.in.h:78 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.h:79 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.h:80 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.h:81 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.h:82 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.h:83 msgid "Minimize Window" msgstr "" #: ../metadata/core.xml.in.h:84 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.h:85 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.h:86 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.h:87 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.h:88 msgid "Opacity Step" msgstr "" #: ../metadata/core.xml.in.h:89 msgid "Opacity change step" msgstr "" #: ../metadata/core.xml.in.h:90 msgid "Opacity values for windows that should be translucent by default" msgstr "" #: ../metadata/core.xml.in.h:91 msgid "Opacity window values" msgstr "" #: ../metadata/core.xml.in.h:92 msgid "Opacity windows" msgstr "" #: ../metadata/core.xml.in.h:93 msgid "Open a terminal" msgstr "" #: ../metadata/core.xml.in.h:94 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.h:95 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.h:96 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.h:97 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.h:98 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.h:99 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.h:100 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.h:101 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:102 msgid "Run Dialog" msgstr "" #: ../metadata/core.xml.in.h:103 msgid "Run command 0" msgstr "" #: ../metadata/core.xml.in.h:104 msgid "Run command 1" msgstr "" #: ../metadata/core.xml.in.h:105 msgid "Run command 10" msgstr "" #: ../metadata/core.xml.in.h:106 msgid "Run command 11" msgstr "" #: ../metadata/core.xml.in.h:107 msgid "Run command 2" msgstr "" #: ../metadata/core.xml.in.h:108 msgid "Run command 3" msgstr "" #: ../metadata/core.xml.in.h:109 msgid "Run command 4" msgstr "" #: ../metadata/core.xml.in.h:110 msgid "Run command 5" msgstr "" #: ../metadata/core.xml.in.h:111 msgid "Run command 6" msgstr "" #: ../metadata/core.xml.in.h:112 msgid "Run command 7" msgstr "" #: ../metadata/core.xml.in.h:113 msgid "Run command 8" msgstr "" #: ../metadata/core.xml.in.h:114 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.h:115 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.h:116 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.h:117 msgid "Screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:118 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.h:119 msgid "Show Main Menu" msgstr "" #: ../metadata/core.xml.in.h:120 msgid "Show Run Application dialog" msgstr "" #: ../metadata/core.xml.in.h:121 msgid "Show the main menu" msgstr "" #: ../metadata/core.xml.in.h:122 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.h:123 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.h:124 msgid "Take a screenshot" msgstr "" #: ../metadata/core.xml.in.h:125 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/core.xml.in.h:126 msgid "Terminal command line" msgstr "" #: ../metadata/core.xml.in.h:127 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.h:128 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.h:129 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.h:130 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.h:131 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.h:132 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.h:133 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.h:134 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.h:135 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.h:136 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.h:137 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.h:138 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.h:139 msgid "Unmaximize Window" msgstr "" #: ../metadata/core.xml.in.h:140 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.h:141 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.h:142 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.h:143 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:144 msgid "Window Menu" msgstr "" #: ../metadata/core.xml.in.h:145 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.h:146 msgid "Window menu key binding" msgstr "" #: ../metadata/core.xml.in.h:147 msgid "Window screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:148 msgid "Windows that should be translucent by default" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Background Images" msgstr "" #: ../metadata/cube.xml.in.h:9 msgid "Background images" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Window Opacity Fade Time." msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fade Time" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:19 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:20 ../metadata/switcher.xml.in.h:10 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:27 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:29 ../metadata/scale.xml.in.h:17 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "On big cube" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:46 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:88 ../metadata/scale.xml.in.h:32 #: ../metadata/switcher.xml.in.h:31 ../metadata/zoom.xml.in.h:3 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:48 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:91 ../metadata/scale.xml.in.h:34 #: ../metadata/switcher.xml.in.h:35 ../metadata/zoom.xml.in.h:4 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:1 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:2 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Window fade speed" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/scale.xml.in.h:21 #: ../metadata/switcher.xml.in.h:17 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Maximize" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:9 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:10 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Y position values" msgstr "" #: ../metadata/plane.xml.in.h:1 msgid "Desktop Plane" msgstr "" #: ../metadata/plane.xml.in.h:2 msgid "Place windows on a plane" msgstr "" #: ../metadata/plane.xml.in.h:3 msgid "Plane Down" msgstr "" #: ../metadata/plane.xml.in.h:4 msgid "Plane Left" msgstr "" #: ../metadata/plane.xml.in.h:5 msgid "Plane Right" msgstr "" #: ../metadata/plane.xml.in.h:6 msgid "Plane To Face 1" msgstr "" #: ../metadata/plane.xml.in.h:7 msgid "Plane To Face 10" msgstr "" #: ../metadata/plane.xml.in.h:8 msgid "Plane To Face 11" msgstr "" #: ../metadata/plane.xml.in.h:9 msgid "Plane To Face 12" msgstr "" #: ../metadata/plane.xml.in.h:10 msgid "Plane To Face 2" msgstr "" #: ../metadata/plane.xml.in.h:11 msgid "Plane To Face 3" msgstr "" #: ../metadata/plane.xml.in.h:12 msgid "Plane To Face 4" msgstr "" #: ../metadata/plane.xml.in.h:13 msgid "Plane To Face 5" msgstr "" #: ../metadata/plane.xml.in.h:14 msgid "Plane To Face 6" msgstr "" #: ../metadata/plane.xml.in.h:15 msgid "Plane To Face 7" msgstr "" #: ../metadata/plane.xml.in.h:16 msgid "Plane To Face 8" msgstr "" #: ../metadata/plane.xml.in.h:17 msgid "Plane To Face 9" msgstr "" #: ../metadata/plane.xml.in.h:18 msgid "Plane Up" msgstr "" #: ../metadata/plane.xml.in.h:19 msgid "Plane down" msgstr "" #: ../metadata/plane.xml.in.h:20 msgid "Plane left" msgstr "" #: ../metadata/plane.xml.in.h:21 msgid "Plane right" msgstr "" #: ../metadata/plane.xml.in.h:22 msgid "Plane to face 1" msgstr "" #: ../metadata/plane.xml.in.h:23 msgid "Plane to face 10" msgstr "" #: ../metadata/plane.xml.in.h:24 msgid "Plane to face 11" msgstr "" #: ../metadata/plane.xml.in.h:25 msgid "Plane to face 12" msgstr "" #: ../metadata/plane.xml.in.h:26 msgid "Plane to face 2" msgstr "" #: ../metadata/plane.xml.in.h:27 msgid "Plane to face 3" msgstr "" #: ../metadata/plane.xml.in.h:28 msgid "Plane to face 4" msgstr "" #: ../metadata/plane.xml.in.h:29 msgid "Plane to face 5" msgstr "" #: ../metadata/plane.xml.in.h:30 msgid "Plane to face 6" msgstr "" #: ../metadata/plane.xml.in.h:31 msgid "Plane to face 7" msgstr "" #: ../metadata/plane.xml.in.h:32 msgid "Plane to face 8" msgstr "" #: ../metadata/plane.xml.in.h:33 msgid "Plane to face 9" msgstr "" #: ../metadata/plane.xml.in.h:34 msgid "Plane up" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Normal" msgstr "" #: ../metadata/resize.xml.in.h:13 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:2 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:12 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:92 ../metadata/switcher.xml.in.h:37 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:2 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:3 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:5 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:18 ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:24 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:25 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:28 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:6 msgid "Brightness" msgstr "" #: ../metadata/switcher.xml.in.h:7 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:11 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:14 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:19 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Saturation" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:29 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:36 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #: ../metadata/zoom.xml.in.h:1 msgid "Filter Linear" msgstr "" #: ../metadata/zoom.xml.in.h:5 msgid "Use linear filter when zoomed in" msgstr "" #: ../metadata/zoom.xml.in.h:6 msgid "Zoom Desktop" msgstr "" #: ../metadata/zoom.xml.in.h:7 msgid "Zoom In" msgstr "" #: ../metadata/zoom.xml.in.h:8 msgid "Zoom Out" msgstr "" #: ../metadata/zoom.xml.in.h:9 msgid "Zoom Pan" msgstr "" #: ../metadata/zoom.xml.in.h:10 msgid "Zoom Speed" msgstr "" #: ../metadata/zoom.xml.in.h:11 msgid "Zoom Timestep" msgstr "" #: ../metadata/zoom.xml.in.h:12 msgid "Zoom and pan desktop cube" msgstr "" #: ../metadata/zoom.xml.in.h:13 msgid "Zoom factor" msgstr "" #: ../metadata/zoom.xml.in.h:14 msgid "Zoom pan" msgstr "" compiz-0.9.11+14.04.20140409/po/ca.po0000644000015301777760000031321712321343002017042 0ustar pbusernogroup00000000000000# Catalan message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2000, 2001 SuSE GmbH. # Jaume Badiella , 2001. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-07-19 14:27+0200\n" "Last-Translator: Josep Puigdemont \n" "Language-Team: Catalan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Escriptori" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Menú de la finestra" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Cap" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Canvia la mida" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "Minimitzades" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximitza la finestra horitzontalment" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximitza la finestra verticalment" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimitzades" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Elevació automàtica" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menú de la finestra" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Acció a prendre al desplaçar-se la roda del ratolí sobre la barra de títol " "d'una finestra." #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Velocitat de plegament" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Redueix l'opacitat de la finestra" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Maximitza la finestra activa horitzontalment" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Tema opacitat" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Tema opacitat ombra" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Opacitat d'utilitzar finestres actives amb el Metacity tema per decoracions" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacitat d´utilitzar per Metacity tema per decoracions" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Finestres actives amb ombra i amb el tema Metacity per decoracions desde " "opac al translucíd" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Finestra amb ombra amb el tema Metacity per decoracions desde opac fins a " "translucíd" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Titol de la barra d´acció de la roda del ratolí" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tipus de blur utilizat en decoracions de finestres" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Utilitzar el tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Utilitzar el tema Metacity quan dibuixes decoracions de finestres" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Tanca la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Desmaximitza la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximitza la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimitza la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Fer a sobre" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Pal" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "No canvia la mida" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "No fer a sobre" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "No pals" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "La finestra «%s» no està responent." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Si forceu la sortida d'aquesta aplicació perdreu els canvis que encara no " "hagueu desat." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Força'n la sortida" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Inicia" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Color del cub" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Anotar color de accident" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Connectors actius" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Borra" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Dibuixa" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Dibuixar utilitzant una eina" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Color del club per anotacions" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Inicia" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Inicia borrament" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Linia d´ample" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Linia d´ample per anotacions" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Color d´accident per anotacions" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Ample d´accident" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Ample d´accident per anotacions" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Filtre lineal" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Canvia la mida de les finestres" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Canvia la mida de les finestres" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Filtre de textura" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Saturació" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Saturació" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Velocitat de plegament" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Situa les finestres" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Canviar parts translucíd de la finestra" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Saturació" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Canvia la mida de les finestres" #: ../metadata/blur.xml.in.h:12 #, fuzzy msgid "Blur windows that doesn't have focus" msgstr "Tipus de finestres que hauran de tremolar quan rebin el focus" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Desactiva la mida de les regions de pantalla fetes per altres finestres." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Filtra un metód utilitzat per mida" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "Mida del focus" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Mida del focus en finestra" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mimal nivel-de-detalls" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulsa" #: ../metadata/blur.xml.in.h:27 #, fuzzy msgid "Pulse effect" msgstr " Pulsa l'efecte" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Utilitza la disponible unitat de textura per fer lo posible independients " "textures fetches." #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Velocitat d'esvaïment de la finestra" #: ../metadata/blur.xml.in.h:30 #, fuzzy msgid "Windows that should be affected by focus blur" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/blur.xml.in.h:31 #, fuzzy msgid "Windows that should be use alpha blur by default" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/clone.xml.in.h:1 #, fuzzy msgid "Clone Output" msgstr "Sortides" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Fes una captura de pantalla" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:13 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:14 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:15 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:16 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:17 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:18 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:19 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:20 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:21 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:22 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:23 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:24 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:51 #, fuzzy msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:52 #, fuzzy msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:53 #, fuzzy msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:54 #, fuzzy msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:55 #, fuzzy msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:56 #, fuzzy msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:57 #, fuzzy msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:58 #, fuzzy msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:59 #, fuzzy msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:60 #, fuzzy msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:61 #, fuzzy msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:62 #, fuzzy msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Ordre" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Executa l'ordre %d" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Connectors actius" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Permet que la representació de finestres a pantalla completa no es " "redirigeixi cap a mapes de píxels fora de la pantalla" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Avís sonor" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Avís sonor del sistema" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Elevació automàtica" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Retard de l'elevació automàtica" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Detecció automàtica dels dispositius de sortida" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Detecció automàtica de la freqüència d'actualització" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Millor" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Feu clic per a passar el focus" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "En fer clic a la finestra, aquesta rep el focus d'entrada" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Tanca la finestra activa" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Icona per defecte" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Imatge d'icona de finestra per defecte" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Cub de l'escriptori" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detecta les sortides" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detecta la freqüència d'actualització" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Ràpid" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Tipus de finestres de focus" #: ../metadata/core.xml.in.in.h:25 #, fuzzy msgid "Focus Prevention Windows" msgstr "Tipus de finestres de focus" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Tipus de finestres de focus" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bo" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Oculta les finestres ignorades de la barra de tasques" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Oculta totes les finestres i passa el focus a l'escriptori" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Oculta les finestres que no es troben a la barra de tasques en accedir al " "mode d'escriptori de visualització" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Mida virtual horitzontal" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignora els suggeriments quan està maximitzada" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignora els suggeriments d'increment de mida i aspecte quan la finestra es " "troba maximitzada" #: ../metadata/core.xml.in.in.h:39 #, fuzzy msgid "Interval before raising selected windows" msgstr "" "Interval que ha de transcórrer abans d'elevar les finestres seleccionades" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Il·luminació" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Llista dels connectors actius actualment" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Llista de cadenes que descriuen els dispositius de sortida" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Abaixa la finestra" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Abaixa la finestra per sota de les altres" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximitza la finestra horitzontalment" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximitza la finestra verticalment" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximitza la finestra activa" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximitza la finestra activa horitzontalment" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximitza la finestra activa verticalment" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimitza la finestra activa" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Nombre d'escriptoris" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Nombre d'escriptoris virtuals" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Només actualitza la pantalla durant els períodes d'enfosquiment vertical" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Sortides" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" # SH #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Retard de pluja" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Eleva en fer clic" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Eleva la finestra" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Eleva les finestres seleccionades un cop transcorregut l'interval" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Eleva la finestra per damunt de les altres" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Eleva les finestres en fer clic" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Freqüència d'actualització" #: ../metadata/core.xml.in.in.h:74 #, fuzzy msgid "Screen size multiplier for horizontal virtual size" msgstr "" "Multiplicador de la mida de la pantalla per a la mida virtual horitzontal" #: ../metadata/core.xml.in.in.h:75 #, fuzzy msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicador de la mida de la pantalla per a la mida virtual vertical" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Fes zoom a l'escriptori" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Animacions lentes" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sincronitza amb enfosquiment vertical" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Filtre de textura" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtre de textura" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Filtre de textura" #: ../metadata/core.xml.in.in.h:83 #, fuzzy msgid "The rate at which the screen is redrawn (times/second)" msgstr "" "Freqüència amb la qual es torna a representar la pantalla (vegades/segon)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Commuta la finestra maximitzada" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Commuta la finestra maximitzada horitzontalment" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Commuta la finestra maximitzada verticalment" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Commuta la finestra ombrejada" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Commuta la finestra activa maximitzada" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Commuta la finestra activa maximitzada horitzontalment" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Commuta la finestra activa maximitzada verticalment" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Commuta la finestra activa ombrejada" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Commuta l'ús d'animacions lentes" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Desmaximitza la finestra activa" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "No redirigeixis les finestres a pantalla completa" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Utilitza llum de difusió en transformar la pantalla" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Mida virtual vertical" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Acceleració" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avança cap a la diapositiva següent" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Cúpula animada" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Representació animada de la cúpula en girar el cub" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Elevació automàtica" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Color de les cares superior i inferior del cub" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Color que s'utilitzarà com a color inferior del degradat alternatiu de la " "cúpula" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Color que s'utilitzarà com color superior del degradat alternatiu de la " "cúpula" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Color del cub" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Color del cub" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cub de l'escriptori" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Acceleració de plegament" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Velocitat de plegament" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Etapa de plegament" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "Genera mipmaps sempre que sigui possible per a un canvi de mida de millor " "qualitat" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Torna a la diapositiva anterior" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Fitxers d'imatge" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Imatge que s'utilitzarà com a textura per a la cúpula" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Interior del cub" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Interior del cub" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Llista de fitxers PNG i SVG que s'hauran de representar a la cara superior " "del cub" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Diapositiva següent" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "Interior del cub" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Situa les finestres al cub" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "Diapositiva anterior" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Renderitza la cúpula" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Canvia la mida de la imatge" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Canvia la mida de les imatges per a cobrir la cara superior del cub" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Cúpula" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Color final del degradat de la cúpula" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Color inicial del degradat de la cúpula" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Imatge de la cúpula" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Velocitat" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Etapa" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Desplega" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Desplega el cub" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Ordre" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Canvia la mida de les finestres" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Línia d'ordres del decorador que s'executa si no s'està executant cap " "decorador" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Desplaçament en X de l'ombra descendent" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Desplaçament en Y de l'ombra descendent" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Radi de l'ombra descendent" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacitat de l'ombra descendent" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Radi de l'ombra descendent" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "Ajusta les finestres" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Desplaçament en X de l'ombra" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Desplaçament en Y de l'ombra" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacitat de l'ombra" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Radi de l'ombra" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Ajusta les finestres" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Decoració de la finestra" # RU #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Decoracions de finestres" #: ../metadata/decoration.xml.in.h:19 #, fuzzy msgid "Windows that should be decorated" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/decoration.xml.in.h:20 #, fuzzy msgid "Windows that should have a shadow" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Velocitat del gir" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Restringeix Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Canvia la mida de la finestra" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Temps d'inversió" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Velocitat d'esvaïment" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Temps d'inversió" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efecte d'esvaïment amb avís sonor del sistema" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Es fan aparèixer progressivament les finestres quan s'assignen i s'esvaeixen " "quan no estan assignades" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Canvia la mida de les finestres" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Esvaïment de finestres" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Campana visual a pantalla completa" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Efecte d'esvaïment a pantalla completa amb avís sonor del sistema" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Campana visual" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Velocitat d'esvaïment de la finestra" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Tipus de finestres que s'hauran de canviar de mida en el mode d'escala" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 #, fuzzy msgid "Windows that should be fading" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Punt" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Afegeix un punt" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Diàleg d'execució" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Línia d'ordres de captura de pantalla" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Línia d'ordres de captura de pantalla" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Mostra el menú principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Mostra el diàleg d'execució de l'aplicació" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Mostra el menú principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Fes una captura de pantalla" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Fes una captura de pantalla d'una finestra" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Línia d'ordres de captura de pantalla" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Línia d'ordres de captura de pantalla de finestra" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "No modifiquis" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "No modifiquis" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimitza l'efecte" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Minimitza la finestra" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimitza la velocitat" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Minimitza l'etapa" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Resistència a l'ombra" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Resistència a l'ombra" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transforma les finestres quan es minimitzen i es maximitzen" #: ../metadata/minimize.xml.in.h:10 #, fuzzy msgid "Windows that should be transformed when minimized" msgstr "Tipus de finestres que s'hauran de transformar en minimitzar-se" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Restringeix Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Restringeix la coordenada Y a l'àrea de l'espai de treball" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Inicia el moviment de la finestra" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Mostra les finestres minimitzades" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Mou la finestra" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Mou la finestra" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacitat" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Nivell d'opacitat de les finestres en moviment" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Separa i desmaximitza les finestres maximitzades en arrossegar" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Separa les finestres maximitzades" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Comença el moviment de la finestra" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Brillantor" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Brillantor" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Brillantor" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Brillantor" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Redueix l'opacitat" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Augmenta l'opacitat" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Etapa de canvi d'opacitat" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Etapa de canvi d'opacitat" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Etapa d'opacitat" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Nivell d'opacitat de les finestres en moviment" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturació" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Saturació" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Saturació" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Saturació" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" # RU #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Decoracions de finestres" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Tipus de finestres" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Assigna tipus de finestres" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Menú de la finestra" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Tipus de finestres de focus" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Mida virtual horitzontal" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Situa les finestres" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Situa les finestres en les posicions adequades quan s'assignin" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Mostra les finestres minimitzades" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Mida virtual horitzontal" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Mostra les finestres minimitzades" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Solucions alternatives de disposició de finestres" #: ../metadata/place.xml.in.h:25 #, fuzzy msgid "Windows that should be positioned by default" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/place.xml.in.h:26 #, fuzzy msgid "Windows that should be positioned in specific viewports by default" msgstr "Tipus de finestres que s'hauran de canviar de mida en el mode d'escala" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" # RU #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Decoracions de finestres" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Solucions alternatives" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Mostra les finestres minimitzades" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Mida virtual horitzontal" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Mostra les finestres minimitzades" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Mida virtual horitzontal" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 #, fuzzy msgid "Regex Matching" msgstr "Commuta l'ajustament de finestres" #: ../metadata/regex.xml.in.h:2 #, fuzzy msgid "Regex window matching" msgstr "Commuta l'ajustament de finestres" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Color del cub" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Color del cub" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Canvia la mida de la finestra" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Color del cub" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Canvia la mida de la finestra" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Canvia la mida de la finestra" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Canvia la mida de la finestra" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Canvia la mida de la finestra" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Comença el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Comença el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Comença el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Comença el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Comença el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Canvia la mida de la finestra" #: ../metadata/resize.xml.in.h:28 #, fuzzy msgid "Windows that normal resize should be used for" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/resize.xml.in.h:29 #, fuzzy msgid "Windows that outline resize should be used for" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/resize.xml.in.h:30 #, fuzzy msgid "Windows that rectangle resize should be used for" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/resize.xml.in.h:31 #, fuzzy msgid "Windows that stretch resize should be used for" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD d'inversió de vora" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Moviment d'inversió de vora" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Punter d'inversió de vora" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Temps d'inversió" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Inverteix cap a l'àrea de visualització esquerra i deforma el punter" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Inverteix cap a la propera àrea de visualització en arrossegar l'objecte cap " "a la vora de la pantalla" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Inverteix cap a la propera àrea de visualització en moure el punter cap a la " "vora de la pantalla" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Inverteix cap a la propera àrea de visualització en moure la finestra cap a " "la vora de la pantalla" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Inverteix cap a l'àrea de visualització dreta i deforma el punter" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inverteix l'eix Y per al moviment del punter" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Punter inverteix Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilitat del punter" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 #, fuzzy msgid "Raise window when rotating" msgstr "Eleva les finestres en fer clic" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Gira el cub" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Gira i inverteix cap a l'esquerra" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Gira i inverteix cap a la dreta" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Gira cap a l'esquerra" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Gira cap a l'esquerra amb la finestra" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Gira cap a la dreta" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Gira cap a la dreta amb la finestra" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Gira cap a" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Gira el cub" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Gira el cub de l'escriptori" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Gira cap a l'esquerra" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Gira cap a l'esquerra i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Gira cap a la dreta" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Gira cap a la dreta i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Gira cap a l'àrea de visualització" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Gira la finestra" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Gira amb la finestra" # RU #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Acceleració de gir" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Velocitat del gir" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Etapa del gir" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Velocitat del gir" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilitat del moviment del punter" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "Desplaça el gir del cub a la cara superior" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Desplaça el gir del cub a la cara superior" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "Desplaça a la cara superior" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Desplaça a la cara superior" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Inicia el gir" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Temps d'espera abans d'invertir l'àrea de visualització" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Quantitat d'opacitat en percentatge" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Gran" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Enfosqueix el fons" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Enfosqueix el fons en canviar la mida de les finestres" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Distintiu" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Temps de passar per sobre" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Inicia el seleccionador de finestres" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Inicia el seleccionador per a totes les finestres" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Inicia el seleccionador per a un grup de finestres" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Inicia el seleccionador per a les finestres de la sortida actual" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Dissenya i inicia la transformació de totes les finestres" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Dissenya i inicia la transformació del grup de finestres" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Dissenya i inicia la transformació de les finestres" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" "Dissenya i inicia la transformació de les finestres de la sortida actual" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Superposa la icona" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Superposa una icona a les finestres un cop se n'ha canviat la mida" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Canvia la mida" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Canvia la mida de les finestres" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Canvia la velocitat" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Canvia la mida de l'etapa" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Canvia la mida de les finestres" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Espai entre finestres" # ES #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Espaiat" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Temps (en ms) abans de finalitzar el mode d'escala en passar el punter per " "sobre una finestra" #: ../metadata/scale.xml.in.h:42 #, fuzzy msgid "Windows that should be scaled in scale mode" msgstr "Tipus de finestres que s'hauran de canviar de mida en el mode d'escala" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Fes una captura de pantalla" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Mostra el diàleg d'execució de l'aplicació" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Fes una captura de pantalla" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Línia d'ordres de captura de pantalla" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Quantitat de brillantor en percentatge" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Quantitat de saturació en percentatge" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Canviador d'aplicacions" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Elevació automàtica" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Porta endavant" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Porta la finestra seleccionada endavant" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Distància a la qual s'haurà d'allunyar el zoom de l'escriptori mentre es " "canvia de finestra" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Icona" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimitzades" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Cub de l'escriptori" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Finestra següent" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Finestra següent" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Finestra següent" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" "Fa sortir el canviador si no està visible i selecciona la finestra següent" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Fes sortir el canviador si no està visible i selecciona la següent de totes " "les finestres" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" "Fes sortir el canviador si no està visible i selecciona la finestra anterior" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Fes sortir el canviador si no està visible i selecciona l'anterior de totes " "les finestres" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Diapositiva anterior" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Finestra anterior" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Finestra anterior" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Finestra anterior" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Selecciona la finestra següent" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Selecciona la finestra anterior" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Mostra la icona al costat de la miniatura" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Mostra les finestres minimitzades" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Velocitat del canviador" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Etapa del canviador" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Canvia la mida de les finestres" #: ../metadata/switcher.xml.in.h:41 #, fuzzy msgid "Windows that should be shown in switcher" msgstr "Tipus de finestres que s'hauran de mostrar al canviador" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Afegeix una línia" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Afegeix un punt" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Afegeix efectes d'aigua a diferents accions de l'escriptori" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Retard (en ms) entre cada gota de pluja" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Habilita els efectes d'aigua del punter" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Línia" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Escala de desplaçament" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punt" # SH #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Retard de pluja" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Títol en onada" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Commuta la pluja" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Commuta l'efecte de pluja" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Commuta l'eixugaparabrises" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Commuta l'efecte de l'eixugaparabrises" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efecte d'aigua" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Escala de desplaçament d'aigua" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efecte d'onada del títol de la finestra" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Passa el focus a l'efecte" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Passa el focus a l'efecte de finestra" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Tipus de finestres de focus" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Fricció" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Tipus de finestres de captura" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Resolució de la graella" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Ajustament de finestres invertit" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Fes estremir la finestra" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Assigna l'efecte" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Assigna l'efecte de la finestra" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Assigna tipus de finestres" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efecte de maximitzar" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Mida mínima de la graella" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Mida mínima de la graella del vèrtex" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Mou la finestra" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Estremeix" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Ajustament invertit" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Ajusta les finestres" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fricció d'elasticitat" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Constant elàstica" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Constant elàstica" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Commuta l'ajustament de finestres" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Utilitza el model d'elàstic per a l'efecte de finestra tremolosa" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Resolució de la graella del vèrtex" #: ../metadata/wobbly.xml.in.h:26 #, fuzzy msgid "Windows that should wobble when focused" msgstr "Tipus de finestres que hauran de tremolar quan rebin el focus" #: ../metadata/wobbly.xml.in.h:27 #, fuzzy msgid "Windows that should wobble when grabbed" msgstr "Tipus de finestres que hauran de tremolar quan s'agafin" #: ../metadata/wobbly.xml.in.h:28 #, fuzzy msgid "Windows that should wobble when mapped" msgstr "Tipus de finestres que hauran de tremolar quan s'assignin" #: ../metadata/wobbly.xml.in.h:29 #, fuzzy msgid "Windows that should wobble when moved" msgstr "Tipus de finestres que hauran de tremolar quan es moguin" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efecte de tremolor en maximitzar i desmaximitzar finestres" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Finestres tremoloses" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Línia d'ordres %d" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Executa l'ordre %d" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Línia d'ordres de captura de pantalla" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Línia d'ordres de captura de pantalla" #~ msgid "Filter Linear" #~ msgstr "Filtre lineal" #, fuzzy #~ msgid "Use linear filter when zoomed in" #~ msgstr "Utilitza el filtre lineal en ampliar el zoom" #~ msgid "Zoom Desktop" #~ msgstr "Fes zoom a l'escriptori" #~ msgid "Zoom In" #~ msgstr "Amplia el zoom" #~ msgid "Zoom Out" #~ msgstr "Allunya el zoom" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Amplia el zoom" #~ msgid "Zoom Speed" #~ msgstr "Velocitat del zoom" #~ msgid "Zoom Timestep" #~ msgstr "Etapa del zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Fes zoom i gira el cub de l'escriptori" #~ msgid "Zoom factor" #~ msgstr "Factor del zoom" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Amplia el zoom" #~ msgid "Decrease window opacity" #~ msgstr "Redueix l'opacitat de la finestra" #~ msgid "Increase window opacity" #~ msgstr "Augmenta l'opacitat de la finestra" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "Espai entre finestres" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Situa les finestres al cub" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Situa les finestres" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Gira cap a l'esquerra" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Gira cap a la dreta" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Situa les finestres" #, fuzzy #~ msgid "Plane down" #~ msgstr "Situa les finestres" #, fuzzy #~ msgid "Plane left" #~ msgstr "Gira cap a l'esquerra" #, fuzzy #~ msgid "Plane right" #~ msgstr "Gira cap a la dreta" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane up" #~ msgstr "Situa les finestres" #~ msgid "Open window menu" #~ msgstr "Obre el menú de la finestra" #~ msgid "Dock" #~ msgstr "Acoblament" #~ msgid "Toolbar" #~ msgstr "Barra d'eines" #~ msgid "Menu" #~ msgstr "Menú" #~ msgid "Utility" #~ msgstr "Utilitat" #~ msgid "Splash" #~ msgstr "Pantalla de presentació" #~ msgid "Dialog" #~ msgstr "Diàleg" #~ msgid "DropdownMenu" #~ msgstr "Menú desplegable" #~ msgid "PopupMenu" #~ msgstr "Menú emergent" #~ msgid "Tooltip" #~ msgstr "Indicador de funció" #~ msgid "Notification" #~ msgstr "Notificació" #~ msgid "Combo" #~ msgstr "Quadre combinat" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "Diàleg de mode" #~ msgid "Fullscreen" #~ msgstr "Pantalla completa" #~ msgid "Unknown" #~ msgstr "Desconeguda" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Quantitat de brillantor en percentatge" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Quantitat d'opacitat en percentatge" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Quantitat de saturació en percentatge" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Saturació" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Retard (en ms) entre cada gota de pluja" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "" #~ "Distància a la qual s'haurà d'allunyar el zoom de l'escriptori mentre es " #~ "canvia de finestra" #~ msgid "Do not modify" #~ msgstr "No modifiquis" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Desplaçament en X de l'ombra descendent" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Desplaçament en Y de l'ombra descendent" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Opacitat de l'ombra descendent" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Radi de l'ombra descendent" #, fuzzy #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Passa el focus a l'efecte de finestra" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Selecciona la finestra anterior" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Acceleració de plegament" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Velocitat de plegament" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Etapa de plegament" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "" #~ "Interval que ha de transcórrer abans d'elevar les finestres seleccionades" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Dissenya i inicia la transformació de les finestres de la sortida actual" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Assigna l'efecte de la finestra" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Minimitza la velocitat" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Minimitza l'etapa" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Mida mínima de la graella del vèrtex" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Nombre d'escriptoris virtuals" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Etapa de canvi d'opacitat" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Nivell d'opacitat de les finestres en moviment" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Nivell d'opacitat de les finestres en moviment" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "Superposa una icona a les finestres un cop se n'ha canviat la mida" #~ msgid "Plugins that this must load before" #~ msgstr "Connectors que ha de carregar prèviament" #~ msgid "Plugins that this requires" #~ msgstr "Connectors que necessita" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Fes sortir el canviador si no està visible i selecciona la següent de " #~ "totes les finestres" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Fes sortir el canviador si no està visible i selecciona la següent de " #~ "totes les finestres" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Fes sortir el canviador si no està visible i selecciona l'anterior de " #~ "totes les finestres" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Fes sortir el canviador si no està visible i selecciona l'anterior de " #~ "totes les finestres" # RU #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Acceleració de gir" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Velocitat del gir" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Etapa del gir" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Canvia la velocitat" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Canvia la mida de l'etapa" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "" #~ "Multiplicador de la mida de la pantalla per a la mida virtual horitzontal" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "" #~ "Multiplicador de la mida de la pantalla per a la mida virtual vertical" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Sensibilitat del moviment del punter" #, fuzzy #~ msgid "Shade resistance (0-100)" #~ msgstr "Resistència a l'ombra" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Espai entre finestres" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Fricció d'elasticitat" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Constant elàstica" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Velocitat del canviador" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Etapa del canviador" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Aplicació del filtre de textura" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "" #~ "Freqüència amb la qual es torna a representar la pantalla (vegades/segon)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Temps (en ms) abans de finalitzar el mode d'escala en passar el punter " #~ "per sobre una finestra" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Temps d'espera abans d'invertir l'àrea de visualització" #~ msgid "USe linear filter when zoomed in" #~ msgstr "Utilitza el filtre lineal en ampliar el zoom" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Resolució de la graella del vèrtex" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Escala de desplaçament d'aigua" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Velocitat d'esvaïment de la finestra" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Velocitat d'esvaïment de la finestra" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Tipus de finestres que s'hauran d'esvair" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Tipus de finestres que s'hauran d'esvair" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Tipus de finestres que s'hauran d'esvair" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Tipus de finestres que s'hauran d'esvair" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "" #~ "Tipus de finestres que s'hauran de canviar de mida en el mode d'escala" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Tipus de finestres que s'hauran de mostrar al canviador" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Tipus de finestres que s'hauran de transformar en minimitzar-se" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Tipus de finestres que s'hauran d'esvair" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Tipus de finestres que hauran de tremolar quan rebin el focus" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "Tipus de finestres que hauran de tremolar quan s'agafin" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Tipus de finestres que hauran de tremolar quan s'assignin" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Tipus de finestres que hauran de tremolar quan es moguin" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Velocitat del zoom" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Etapa del zoom" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Factor del zoom" #~ msgid "." #~ msgstr "," #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Gira cap a la cara %d amb la finestra" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #~ msgid "Rotate To Face %d" #~ msgstr "Gira cap a la cara %d" #~ msgid "Rotate to face %d" #~ msgstr "Gira cap a la cara %d" #~ msgid "Rotate To Face %d with Window" #~ msgstr "Gira cap a la cara %d amb la finestra" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #~ msgid "Move Window Types" #~ msgstr "Tipus de finestres de moviment" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Disquetera" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Iniciant el dimoni." #, fuzzy #~ msgid "Terminate" #~ msgstr "Terminals" compiz-0.9.11+14.04.20140409/po/et.po0000644000015301777760000022542712321343002017074 0ustar pbusernogroup00000000000000# translation of # Copyright (C) 2006 SUSE Linux Products GmbH. # Estonian message file for YaST2 (@memory@). # msgid "" msgstr "" "Project-Id-Version: autoinst.fi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2003-09-22 13:26+0200\n" "Last-Translator: Ain Vagula \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Töölauad" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Aken" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Puudub" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Vali &pilt" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "Mitteaktiivne vajutatud:" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Töölaua efektid" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Mitteaktiivne vajutatud:" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Aken" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Kiirus:" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Kas kasutada animeeritud aknaid?" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Lähtestamine" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Värvid" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Aktiivne vajutatud:" #: ../metadata/annotate.xml.in.h:5 #, fuzzy msgid "Clear" msgstr "P_uhasta" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Lähtestamine" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Käivita Windows" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Käivita Windows" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Lähtestamine" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Filtreeri seda kausta" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Käivita Windows" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Käivita Windows" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Määra filter" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Häälestamine" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Häälestamine" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Kiirus:" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Käivita Windows" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Häälestamine" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Käivita Windows" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "Käivita Windows" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Käivita Windows" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Vene" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Venemaa Föderatsioon" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Vene" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Venemaa Föderatsioon" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Vene" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 #, fuzzy msgid "Pulse effect" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windows NT" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Videorežiimi valimine" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Käsk tagastas '%1' : %2" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Käsk tagastas '%1' : %2" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Käsk tagastas '%1' : %2" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Käsk tagastas '%1' : %2" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Käsk tagastas '%1' : %2" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Tundmatu käsk " #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "Aktiivne vajutatud:" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "Failisüsteem" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 #, fuzzy msgid "Automatic detection of output devices" msgstr "Automaatne tuvastamine" #: ../metadata/core.xml.in.in.h:8 #, fuzzy msgid "Automatic detection of refresh rate" msgstr "Automaatne tuvastamine" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 #, fuzzy msgid "Close active window" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Vaikeruuting" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Töölauad" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "X Window süsteem" #: ../metadata/core.xml.in.in.h:25 #, fuzzy msgid "Focus Prevention Windows" msgstr "X Window süsteem" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "X Window süsteem" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Horisontaalne" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "ZEN-partitsiooni lubamine" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "Käivita Windows" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 #, fuzzy msgid "Maximize active window" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 #, fuzzy msgid "Minimize active window" msgstr "Mitteaktiivne vajutatud:" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normaalne" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "Kaugtöölaud" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Kaugtöölaud" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "Käivita Windows" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "Värskenda" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Töölauad" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Animatsioon" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Määra filter" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "Määra filter" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Määra filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 #, fuzzy msgid "Toggle Window Shaded" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 #, fuzzy msgid "Unmaximize active window" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D kiirenduse aktiveerimine" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 #, fuzzy msgid "Advance to next slide" msgstr "Täiustatud jõudluse kontroll" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Lähtestamine" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Värvid" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "Värvid" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Töölauad" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D kiirenduse aktiveerimine" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Kiirus:" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "Töölauad" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "Eelmine" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "tekstirežiim" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "Käivita Windows" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "Eelmine" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "Vali &pilt" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Vali &pilt" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Vali &pilt" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Kiirus:" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "Töölauad" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Käsku pole antud" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Käivita Windows" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "Käivita Windows" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Käivita Windows" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Venemaa Föderatsioon" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "Venemaa Föderatsioon" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Registreerimiskood" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Käivita Windows" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Töölauad" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Kiirus:" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Töölauad" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "Failisüsteem" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Käivita Windows" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Käivita Windows" #: ../metadata/fade.xml.in.h:16 #, fuzzy msgid "Fullscreen Visual Bell" msgstr "Ekraan" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows NT" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Lisa sündmus" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Lisa sündmus" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 #, fuzzy msgid "Open a terminal" msgstr "Käivitatakse terminalis" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 #, fuzzy msgid "Run Dialog" msgstr "Häälestusdialoog" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Käsku pole antud" #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "Käsku pole antud" #: ../metadata/gnomecompat.xml.in.h:8 #, fuzzy msgid "Show Main Menu" msgstr "Peamenüü" #: ../metadata/gnomecompat.xml.in.h:9 #, fuzzy msgid "Show Run Application dialog" msgstr "Käivita rakendus" #: ../metadata/gnomecompat.xml.in.h:10 #, fuzzy msgid "Show the main menu" msgstr "Teenuse URI näitamine" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Käsku pole antud" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "Mitteaktiivne vajutatud:" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "Mitteaktiivne vajutatud:" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "Mitteaktiivne vajutatud:" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "Käivita Windows" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "X Window süsteem" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "X Window süsteem" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "Käivita Windows" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "Käivita Windows" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Käivita Windows" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Heledus" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Heledus" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Heledus" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Heledus" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Käivita Windows" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Käivita Windows" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "Käivita Windows" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Käivita Windows" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Häälestamine" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Häälestamine" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Häälestamine" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Häälestamine" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Venemaa Föderatsioon" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows NT" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "X Window süsteem" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Aken" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "X Window süsteem" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Horisontaalne" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "Käivita Windows" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Horisontaalne" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "Venemaa Föderatsioon" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Venemaa Föderatsioon" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Horisontaalne" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Horisontaalne" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Värvid" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Värvid" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Värvid" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:19 #, fuzzy msgid "Rotate Flip Left" msgstr "Vasakule" #: ../metadata/rotate.xml.in.h:20 #, fuzzy msgid "Rotate Flip Right" msgstr "Paremale" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "Vasakule" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "Paremale" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "Paremale" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D kiirenduse aktiveerimine" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Registreerimiskood" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Töölauad" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Registreerimiskood" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Taaskäivituse kinnitus" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 #, fuzzy msgid "Zoom" msgstr "XF86ZoomIn" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Suur" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "Värviline taust" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:15 #, fuzzy msgid "Initiate Window Picker For All Windows" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:16 #, fuzzy msgid "Initiate Window Picker For Window Group" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:17 #, fuzzy msgid "Initiate Window Picker For Windows on Current Output" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Vali &pilt" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "Kiirus:" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "Vali &pilt" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Tühik" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 #, fuzzy msgid "Automatically open screenshot in this application" msgstr "Aplett käivitatakse sisselogimisel automaatselt" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Kataloog\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Videorežiimi valimine" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Käivita rakendus" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Ekraan" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Käsku pole antud" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Rakenduste sirvija" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Lähtestamine" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Toiming" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikoon" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "Mitteaktiivne vajutatud:" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Töölauad" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "tekstirežiim" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "tekstirežiim" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "tekstirežiim" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Eelmine" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Käivita Windows" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Käivita Windows" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Käivita Windows" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Käivita Windows" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "Kiirus:" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "Vali &pilt" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Käivita Windows" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "Lis&a link" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "Lisa sündmus" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 #, fuzzy msgid "Offset Scale" msgstr "Kaugus tiitlist:" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 #, fuzzy msgid "Title wave" msgstr "Tiitel: %1" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/water.xml.in.h:16 #, fuzzy msgid "Water Effect" msgstr "Töölaua efektid" #: ../metadata/water.xml.in.h:17 #, fuzzy msgid "Water offset scale" msgstr "Kaugus tiitlist:" #: ../metadata/water.xml.in.h:18 #, fuzzy msgid "Wave effect from window title" msgstr "kaugus tiitlist" #: ../metadata/wobbly.xml.in.h:1 #, fuzzy msgid "Focus Effect" msgstr "X Window süsteem" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "X Window süsteem" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "X Window süsteem" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Toiming" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "X Window süsteem" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Resolutsioon" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "Käivita Windows" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "Töölaua efektid" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Töölaua efektid" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "X Window süsteem" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "Töölaua efektid" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "X Window süsteem" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "Draiver" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Käivita Windows" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Toiming" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Tühik" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Toiming" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Resolutsioon" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Käivita Windows" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Käsk tagastas '%1' : %2" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Tundmatu käsk " #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Käsku pole antud" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Käsku pole antud" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filtreeri seda kausta" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Töölauad" #, fuzzy #~ msgid "Zoom In" #~ msgstr "XF86ZoomIn" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "XF86ZoomOut" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "XF86ZoomIn" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Kiirus:" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "Töölauad" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "XF86ZoomOut" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "XF86ZoomIn" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Käivita Windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "PgDn" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Vasakule" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Paremale" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane Up" #~ msgstr "PgUp" #, fuzzy #~ msgid "Plane down" #~ msgstr "Käivita Windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane right" #~ msgstr "Paremale" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane up" #~ msgstr "PgUp" #, fuzzy #~ msgid "Open window menu" #~ msgstr "Ava menüü" #, fuzzy #~ msgid "Toolbar" #~ msgstr "Tööriistad" #~ msgid "Menu" #~ msgstr "Menüü" #, fuzzy #~ msgid "Utility" #~ msgstr "KDE utiliidid" #, fuzzy #~ msgid "Splash" #~ msgstr "splash" #, fuzzy #~ msgid "Dialog" #~ msgstr "Häälestusdialoog" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Aken" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "Menüü" #, fuzzy #~ msgid "Tooltip" #~ msgstr "Tööriistad" #, fuzzy #~ msgid "Notification" #~ msgstr "Märguanded" #, fuzzy #~ msgid "Dnd" #~ msgstr "End" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Ekraan" #~ msgid "Unknown" #~ msgstr "Tundmatu" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Häälestamine" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "MShadow" #, fuzzy #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "X Window süsteem" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Käivita Windows" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D kiirenduse aktiveerimine" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Kiirus:" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Venemaa Föderatsioon" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Vene" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Töölaua efektid" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Mitteaktiivne vajutatud:" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Mitteaktiivne vajutatud:" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Kaugtöölaud" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Käivita Windows" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Käivita Windows" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D kiirenduse aktiveerimine" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Registreerimiskood" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Kiirus:" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Vali &pilt" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Käivita Windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Toiming" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Määra filter" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Resolutsioon" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Kaugus tiitlist:" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows NT" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows NT" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Kiirus:" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Töölauad" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "XF86ZoomOut" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "XF86RotateWindows" #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Rotate To Face %d with Window" #~ msgstr "XF86RotateWindows" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Käsku pole antud" #, fuzzy #~ msgid "Run command %d" #~ msgstr "Tundmatu käsk " #, fuzzy #~ msgid "Corners" #~ msgstr "Korni" #, fuzzy #~ msgid "Show switcher" #~ msgstr "&Näita muudatusi" #, fuzzy #~ msgid "Terminate" #~ msgstr "XF86Terminal" compiz-0.9.11+14.04.20140409/po/sl.po0000644000015301777760000023134412321343002017075 0ustar pbusernogroup00000000000000# Slovenian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2001 SuSE GmbH. # Janez Krek , 2001. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2008-06-12 01:19+0200\n" "Last-Translator: benjamin povirk \n" "Language-Team: Slovenian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" "%100==4 ? 2 : 3);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Namizje" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Upravljalnik oken" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "brez izbire" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "ZasenÄi" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "&SkrÄite Windows" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "&SkrÄite Windows" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "&SkrÄite Windows" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "&SkrÄite Windows" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Samodejno" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Okenski meni" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Izbran(i)" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Metacity tema motnost aktivnega okna" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Metacity tema motnost sence aktivnega okna" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity tema motnost" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity tema motnost senca" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Motnost za aktivna okna z metacity temo dekoracij" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Motnost za metacity temo dekoracij" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "ZasenÄi aktivna okna z metacity temo dekoracij od motne do prozorne" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "ZasenÄi okna z metacity temo dekoracij od motne do prozorne" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Akcija miÅ¡kinega kolesca na naslovni vrstici" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tip neaktivnosti uporabljen za dekoracije okna" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Uporabi metacity temo" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Uporabi metacity temo ko riÅ¡eÅ¡ dekoracije okna" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Zapri okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Odmaksimiziraj okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maksimiziraj okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimiziraj okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Postavi na vrh" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Prilepi" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "OdsenÄi" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Postavi iz ospredja" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Odlepi" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Okno \"%s\" se ne odziva" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Nasilno zaprtje te aplikacije lahko povzroÄi izgubo neshranjenih sprememb." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Nasilni izhod" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Init" # KM #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Barve" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Aktivni profil" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "PoÄisti" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "IzriÅ¡i" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "IzriÅ¡i z uporabo orodja" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Inicializiraj" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Init" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Init" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Inicializiraj izbris" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Å¡irina Ärte" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 #, fuzzy msgid "Stroke width" msgstr "Å¡irina Ärte" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xbilinearno" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Zamaži z transparenco" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Zamaži okna z transparenco" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filter madeža" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Madež absorpcije" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Madež zasiÄenosti" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Zamaži hitrost" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Zamaži okna" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Zamaži za prosojnimi deli oken" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Madež nasiÄenosti" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Zamaži okna" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Zamaži okna v ozadju" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Zamaži v ospredju" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Zamaži okna v ospredju" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gausova" # RU #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gausov radij" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gausova moÄ" # RU #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "gausov radij" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gausova moÄ" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mini zemljevid" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Lima" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "stopnja podrobnosti Mini zemljevida" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulz" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Pulz efekt" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Uporabi vse teksturne enote ki so na voljo, da ustvariÅ¡ karseda veliko " "neodvisnih novih tekstur." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Hitrost zamaznitve okna" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Init" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Ukaz '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Ukaz '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Ukaz '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Ukaz '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Ukaz: " #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "Aktivni profil" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "DatoteÄni &sistem" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "Samodejno" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Privzet odsek" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "Privzeti Datum I&zteka Veljavnosti" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Namizje" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "Izberi Posodobitev" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Navidezne naprave" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "OmogoÄi samodejno zaustavitev" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "Pisanje dnevnika" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "Seznam zaznanih tiskalnikov" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "Windows uporabljeno:" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "&SkrÄite Windows" #: ../metadata/core.xml.in.in.h:51 #, fuzzy msgid "Maximize Window Vertically" msgstr "&SkrÄite Windows" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Navaden" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "Namizje" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Namizje" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Zamik" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "&Radijska ura" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "Sprememba velikosti je bila neuspeÅ¡na." #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&Osveži seznam" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Namizje" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Prikaži vse razdelke" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "&Nastavi filter" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "&Nastavi filter" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "&Nastavi filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Navidezne naprave" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D pospeÅ¡evanje:" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sydney" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Samodejno" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" # KM #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Barve" # KM #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "Barve" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Namizje" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D pospeÅ¡evanje:" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Izbran(i)" # TL # fuzzy #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "Trst" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "Prejsne jedro" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "NeuspeÅ¡ne datoteke" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "Naslednja posodobitev" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "I&zbriÅ¡i Windows" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "Prejsne jedro" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "lokalni Äas" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sydney" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Sydney" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Izbran(i)" # TL # fuzzy #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "Trst" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Ukaz: " #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "I&zbriÅ¡i Windows" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "&Nizek nivo" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "&Nizek nivo" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Radius" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "&Nizek nivo" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "Radius" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "&SkrÄite Windows" #: ../metadata/decoration.xml.in.h:12 #, fuzzy msgid "Shadow Offset X" msgstr "&Nizek nivo" #: ../metadata/decoration.xml.in.h:13 #, fuzzy msgid "Shadow Offset Y" msgstr "&Nizek nivo" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "&Nizek nivo" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "Radius" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "&SkrÄite Windows" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Ni opisa" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind opcije" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" # TL # fuzzy #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Trst" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Vsebuje" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Sprememba velikosti je bila neuspeÅ¡na." #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Realni Äas" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Izbran(i)" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Realni Äas" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "DatoteÄni &sistem" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "I&zbriÅ¡i Windows" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "&SkrÄite Windows" #: ../metadata/fade.xml.in.h:16 #, fuzzy msgid "Fullscreen Visual Bell" msgstr "Zaslon na dotik" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows prosto (%1)" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Dodaj stik" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Dodaj stik" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 #, fuzzy msgid "Open a terminal" msgstr "Zaženi v terminalu" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Napaka pri razÄlenitvi ukazne vrstice." #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "Napaka pri razÄlenitvi ukazne vrstice." #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Napaka pri razÄlenitvi ukazne vrstice." #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "Ne beleži niÄesar" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "Ne beleži niÄesar" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "&SkrÄite Windows" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "&SkrÄite Windows" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "&SkrÄite Windows" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "&SkrÄite Windows" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "Vsebuje" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "Premakni &Dol" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Sprememba velikosti je bila neuspeÅ¡na." #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "Premakni &Dol" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "Premakni &Dol" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "&Nizek nivo" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "&SkrÄite Windows" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Most" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Most" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Most" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Most" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "&Nizek nivo" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "I&zbriÅ¡i Windows" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "&Nizek nivo" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind opcije" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows uporabljeno:" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windows uporabljeno:" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Upravljalnik oken" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "I&zbriÅ¡i Windows" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Navidezne naprave" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "I&zbriÅ¡i Windows" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Sprememba velikosti je bila neuspeÅ¡na." #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Navidezne naprave" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Sprememba velikosti je bila neuspeÅ¡na." #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind opcije" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind opcije" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "&Delovna skupina" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Sprememba velikosti je bila neuspeÅ¡na." #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Navidezne naprave" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Sprememba velikosti je bila neuspeÅ¡na." #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Navidezne naprave" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" # KM #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Barve" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" # KM #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Barve" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Init" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Init" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Init" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Init" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Init" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Sprememba velikosti je bila neuspeÅ¡na." # KM #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Barve" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Sprememba velikosti je bila neuspeÅ¡na." #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Sprememba velikosti je bila neuspeÅ¡na." #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Sprememba velikosti je bila neuspeÅ¡na." #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "Sprememba velikosti je bila neuspeÅ¡na." #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Sprememba velikosti je bila neuspeÅ¡na." #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "Realni Äas" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "Kazalec na %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "TiskalniÅ¡ka naprava" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "Oddaljeno podomrežje" #: ../metadata/rotate.xml.in.h:19 #, fuzzy msgid "Rotate Flip Left" msgstr "V desno" #: ../metadata/rotate.xml.in.h:20 #, fuzzy msgid "Rotate Flip Right" msgstr "V desno" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "Oddaljeno podomrežje" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "V desno" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Oddaljeno podomrežje" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Oddaljeno podomrežje" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "Oddaljeno podomrežje" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "V desno" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Premakni &Dol" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Zaganjam prikriti proces (daemon)." # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D pospeÅ¡evanje:" # TL # fuzzy #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Trst" # TL # fuzzy #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Trst" # TL # fuzzy #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Trst" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Poženi zaznavanje" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 #, fuzzy msgid "Zoom" msgstr "Odjava" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Velik" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "Ozadja" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Premakni &Dol" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "OptiÄni bralnik (scanner)" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "I&zbriÅ¡i Windows" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "lokalni Äas" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "lokalni Äas" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "I&zbriÅ¡i Windows" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "I&zbriÅ¡i Windows" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Å panija" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Imenik\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Init" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "PisarniÅ¡ke aplikacije" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Zaslon" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Napaka pri razÄlenitvi ukazne vrstice." #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Vrstni red uporabe" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Samodejno" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Med zagonom" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Ikonce" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "&SkrÄite Windows" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Namizje" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "I&zbriÅ¡i Windows" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "I&zbriÅ¡i Windows" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "I&zbriÅ¡i Windows" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Prejsne jedro" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Windows uporabljeno:" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Windows uporabljeno:" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Windows uporabljeno:" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "I&zbriÅ¡i Windows" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "&SkrÄite Windows" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "Skripta za zamenjavo" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "lokalni Äas" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "I&zbriÅ¡i Windows" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "Dod&aj povezavo" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "Dodaj stik" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Zamik" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "&Zamenjaj status" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "&Zamenjaj status" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "&Zamenjaj status" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "&Zamenjaj status" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Windows uporabljeno:" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "I&zbriÅ¡i Windows" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Akcija" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "I&zbriÅ¡i Windows" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "LoÄljivost" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "I&zbriÅ¡i Windows" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "Windows uporabljeno:" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windows uporabljeno:" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windows uporabljeno:" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "Windows uporabljeno:" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "NajveÄja velikost" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "NajveÄja velikost" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Premakni &Dol" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "Gonilnik" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "&SkrÄite Windows" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Akcija" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Stepping" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Stepping" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "I&zbriÅ¡i Windows" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Prepoznavanje strežnika" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Windows uporabljeno:" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Ukaz: " #, fuzzy #~ msgid "Run command 0" #~ msgstr "Ukaz '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Napaka pri razÄlenitvi ukazne vrstice." #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Napaka pri razÄlenitvi ukazne vrstice." #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filter: " #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Namizje" #, fuzzy #~ msgid "Zoom In" #~ msgstr "Odjava" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "Odjava" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Odjava" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Izbran(i)" # TL # fuzzy #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "Trst" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "Odjava" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Odjava" #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "V celoti &izbriÅ¡i Windows" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "I&zbriÅ¡i Windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "I&zbriÅ¡i Windows" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Oddaljeno podomrežje" #, fuzzy #~ msgid "Plane Right" #~ msgstr "V desno" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane Up" #~ msgstr "I&zbriÅ¡i Windows" #, fuzzy #~ msgid "Plane down" #~ msgstr "I&zbriÅ¡i Windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "Oddaljeno podomrežje" #, fuzzy #~ msgid "Plane right" #~ msgstr "V desno" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane up" #~ msgstr "I&zbriÅ¡i Windows" #, fuzzy #~ msgid "Toolbar" #~ msgstr "Orodja" #~ msgid "Menu" #~ msgstr "Menu" #, fuzzy #~ msgid "Utility" #~ msgstr "Disketa s priroÄnimi orodji..." #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Upravljalnik oken" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "Menu" #, fuzzy #~ msgid "Tooltip" #~ msgstr "Orodja" #, fuzzy #~ msgid "Notification" #~ msgstr "Akcija" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Zaslon na dotik" #~ msgid "Unknown" #~ msgstr "Neznano" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Trajanje" #, fuzzy #~ msgid "Do not modify" #~ msgstr "Ne beleži niÄesar" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "&Nizek nivo" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Radius" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Zaganjam prikriti proces (daemon)." # workflow: "3D Beschleunigung aktivieren" # -ke- #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D pospeÅ¡evanje: " # workflow: "3D Beschleunigung aktivieren" # -ke- #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D pospeÅ¡evanje: " # TL # fuzzy #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Trst" # RU #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Ruska federacija" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Ruska" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Windows uporabljeno:" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&SkrÄite Windows" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&SkrÄite Windows" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "NajveÄja velikost" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Namizje" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Zaganjam prikriti proces (daemon)." #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Zaganjam prikriti proces (daemon)." # workflow: "3D Beschleunigung aktivieren" # -ke- #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D pospeÅ¡evanje: " # TL # fuzzy #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Trst" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "lokalni Äas" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "lokalni Äas" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "I&zbriÅ¡i Windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Akcija" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Stepping" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Skripta za zamenjavo" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "&Nastavi filter" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Prepoznavanje strežnika" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows prosto (%1)" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows prosto (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Izbran(i)" # TL # fuzzy #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Trst" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Odjava" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Zaganjam prikriti proces (daemon)." #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Ukaz: " #, fuzzy #~ msgid "Run command %d" #~ msgstr "Ukaz: " #, fuzzy #~ msgid "Move Window Types" #~ msgstr "Tip ponudnika" #, fuzzy #~ msgid "Corners" #~ msgstr "KornÅ¡Äina" #, fuzzy #~ msgid "Show switcher" #~ msgstr "Pokaži spre&membe" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Disketa" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Zaganjam prikriti proces (daemon)." #, fuzzy #~ msgid "Terminate" #~ msgstr "Terminali" compiz-0.9.11+14.04.20140409/po/ta.po0000644000015301777760000017226412321343002017070 0ustar pbusernogroup00000000000000# Tamil message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2003 SuSE Linux AG. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2009-04-06 14:41+0200\n" "Last-Translator: Prem \n" "Language-Team: Tamil \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "நிழலாகà¯à®•à¯" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "பெரிதாகà¯à®•à¯" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "சிறிதாகà¯à®•à¯" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "உயரà¯à®¤à¯à®¤à¯" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" # IN #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "­ó¾¢Â¡" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" # IN #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "­ó¾¢Â¡" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" # IN #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "­ó¾¢Â¡" # IN #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "­ó¾¢Â¡" # IN #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "­ó¾¢Â¡" # IN #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "­ó¾¢Â¡" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "¯Õº¢Â" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "¯Õº¢Â" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "¯Õº¢Â" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "¯Õº¢Â" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "¯Õº¢Â" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" # IN #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "­ó¾¢Â¡" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" # IN #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "­ó¾¢Â¡" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" # IN #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "­ó¾¢Â¡" # IN #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "­ó¾¢Â¡" # IN #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "­ó¾¢Â¡" # IN #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "­ó¾¢Â¡" # IN #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "­ó¾¢Â¡" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" # IN #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "­ó¾¢Â¡" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" # IN #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "­ó¾¢Â¡" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" # IN #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "­ó¾¢Â¡" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" # IN #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "­ó¾¢Â¡" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" # ES #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "æÀ¢ý" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" # IN #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "­ó¾¢Â¡" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" # IN #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "­ó¾¢Â¡" # ES #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "æÀ¢ý" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" # ES #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "æÀ¢ý" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" # ES #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "æÀ¢ý" # ES #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "æÀ¢ý" # ES #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "æÀ¢ý" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "¯Õº¢Â" # ES #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "æÀ¢ý" # ES #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "æÀ¢ý" compiz-0.9.11+14.04.20140409/po/be.po0000644000015301777760000015170212321343002017044 0ustar pbusernogroup00000000000000# compiz be translation. # Copyright (C) 2008 compiz-fusion.org # This file is distributed under the same license as the compiz package. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.7.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-04-03 11:02+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4347 #: ../metadata/core.xml.in.h:24 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4369 #: ../metadata/core.xml.in.h:152 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4372 #: ../metadata/core.xml.in.h:84 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.h:90 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4531 #: ../metadata/core.xml.in.h:159 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4550 msgid "Shade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4570 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4596 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4616 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4636 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4662 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5019 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5028 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5043 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:11 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 ../metadata/zoom.xml.in.h:2 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:26 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:13 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/core.xml.in.h:1 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/core.xml.in.h:2 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/core.xml.in.h:3 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/core.xml.in.h:4 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/core.xml.in.h:5 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/core.xml.in.h:6 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/core.xml.in.h:7 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/core.xml.in.h:8 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/core.xml.in.h:9 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/core.xml.in.h:10 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/core.xml.in.h:11 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/core.xml.in.h:12 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/core.xml.in.h:13 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.h:14 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.h:15 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.h:16 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.h:17 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.h:18 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.h:19 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.h:20 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.h:21 msgid "Best" msgstr "" #: ../metadata/core.xml.in.h:22 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.h:23 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.h:25 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.h:26 msgid "Command line 0" msgstr "" #: ../metadata/core.xml.in.h:27 msgid "Command line 1" msgstr "" #: ../metadata/core.xml.in.h:28 msgid "Command line 10" msgstr "" #: ../metadata/core.xml.in.h:29 msgid "Command line 11" msgstr "" #: ../metadata/core.xml.in.h:30 msgid "Command line 2" msgstr "" #: ../metadata/core.xml.in.h:31 msgid "Command line 3" msgstr "" #: ../metadata/core.xml.in.h:32 msgid "Command line 4" msgstr "" #: ../metadata/core.xml.in.h:33 msgid "Command line 5" msgstr "" #: ../metadata/core.xml.in.h:34 msgid "Command line 6" msgstr "" #: ../metadata/core.xml.in.h:35 msgid "Command line 7" msgstr "" #: ../metadata/core.xml.in.h:36 msgid "Command line 8" msgstr "" #: ../metadata/core.xml.in.h:37 msgid "Command line 9" msgstr "" #: ../metadata/core.xml.in.h:38 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/core.xml.in.h:39 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/core.xml.in.h:40 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/core.xml.in.h:41 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/core.xml.in.h:42 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/core.xml.in.h:43 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/core.xml.in.h:44 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/core.xml.in.h:45 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/core.xml.in.h:46 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/core.xml.in.h:47 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/core.xml.in.h:48 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/core.xml.in.h:49 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/core.xml.in.h:50 msgid "Decrease Opacity" msgstr "" #: ../metadata/core.xml.in.h:51 msgid "Decrease window opacity" msgstr "" #: ../metadata/core.xml.in.h:52 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.h:53 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.h:54 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.h:55 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:56 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.h:57 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.h:58 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.h:59 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.h:60 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.h:61 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.h:62 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.h:63 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.h:64 msgid "Good" msgstr "" #: ../metadata/core.xml.in.h:65 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.h:66 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.h:67 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.h:68 msgid "High" msgstr "" #: ../metadata/core.xml.in.h:69 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:70 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.h:71 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.h:72 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.h:73 msgid "Increase Opacity" msgstr "" #: ../metadata/core.xml.in.h:74 msgid "Increase window opacity" msgstr "" #: ../metadata/core.xml.in.h:75 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.h:76 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.h:77 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.h:78 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.h:79 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.h:80 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.h:81 msgid "Low" msgstr "" #: ../metadata/core.xml.in.h:82 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.h:83 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.h:85 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.h:86 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.h:87 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.h:88 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.h:89 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.h:91 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.h:92 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.h:93 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.h:94 msgid "Off" msgstr "" #: ../metadata/core.xml.in.h:95 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.h:96 msgid "Opacity Step" msgstr "" #: ../metadata/core.xml.in.h:97 msgid "Opacity change step" msgstr "" #: ../metadata/core.xml.in.h:98 msgid "Opacity values for windows that should be translucent by default" msgstr "" #: ../metadata/core.xml.in.h:99 msgid "Opacity window values" msgstr "" #: ../metadata/core.xml.in.h:100 msgid "Opacity windows" msgstr "" #: ../metadata/core.xml.in.h:101 msgid "Open a terminal" msgstr "" #: ../metadata/core.xml.in.h:102 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.h:103 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.h:104 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.h:105 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.h:106 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.h:107 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.h:108 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.h:109 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.h:110 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.h:111 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.h:112 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:113 msgid "Run Dialog" msgstr "" #: ../metadata/core.xml.in.h:114 msgid "Run command 0" msgstr "" #: ../metadata/core.xml.in.h:115 msgid "Run command 1" msgstr "" #: ../metadata/core.xml.in.h:116 msgid "Run command 10" msgstr "" #: ../metadata/core.xml.in.h:117 msgid "Run command 11" msgstr "" #: ../metadata/core.xml.in.h:118 msgid "Run command 2" msgstr "" #: ../metadata/core.xml.in.h:119 msgid "Run command 3" msgstr "" #: ../metadata/core.xml.in.h:120 msgid "Run command 4" msgstr "" #: ../metadata/core.xml.in.h:121 msgid "Run command 5" msgstr "" #: ../metadata/core.xml.in.h:122 msgid "Run command 6" msgstr "" #: ../metadata/core.xml.in.h:123 msgid "Run command 7" msgstr "" #: ../metadata/core.xml.in.h:124 msgid "Run command 8" msgstr "" #: ../metadata/core.xml.in.h:125 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.h:126 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.h:127 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.h:128 msgid "Screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:129 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.h:130 msgid "Show Main Menu" msgstr "" #: ../metadata/core.xml.in.h:131 msgid "Show Run Application dialog" msgstr "" #: ../metadata/core.xml.in.h:132 msgid "Show the main menu" msgstr "" #: ../metadata/core.xml.in.h:133 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.h:134 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.h:135 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.h:136 msgid "Take a screenshot" msgstr "" #: ../metadata/core.xml.in.h:137 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/core.xml.in.h:138 msgid "Terminal command line" msgstr "" #: ../metadata/core.xml.in.h:139 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.h:140 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.h:141 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.h:142 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.h:143 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.h:144 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.h:145 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.h:146 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.h:147 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.h:148 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.h:149 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.h:150 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.h:151 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.h:153 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.h:154 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.h:155 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.h:156 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:157 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.h:158 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.h:160 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.h:161 msgid "Window menu key binding" msgstr "" #: ../metadata/core.xml.in.h:162 msgid "Window screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:163 msgid "Windows that should be translucent by default" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Background Images" msgstr "" #: ../metadata/cube.xml.in.h:9 msgid "Background images" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:18 ../metadata/switcher.xml.in.h:10 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:19 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:27 ../metadata/scale.xml.in.h:17 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:28 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:45 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:90 ../metadata/scale.xml.in.h:32 #: ../metadata/switcher.xml.in.h:31 ../metadata/zoom.xml.in.h:3 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:93 ../metadata/scale.xml.in.h:34 #: ../metadata/switcher.xml.in.h:35 ../metadata/zoom.xml.in.h:4 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:47 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:1 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:2 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Window fade speed" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/scale.xml.in.h:21 #: ../metadata/switcher.xml.in.h:17 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Maximize" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:9 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:10 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Y position values" msgstr "" #: ../metadata/plane.xml.in.h:1 msgid "Desktop Plane" msgstr "" #: ../metadata/plane.xml.in.h:2 msgid "Place windows on a plane" msgstr "" #: ../metadata/plane.xml.in.h:3 msgid "Plane Down" msgstr "" #: ../metadata/plane.xml.in.h:4 msgid "Plane Left" msgstr "" #: ../metadata/plane.xml.in.h:5 msgid "Plane Right" msgstr "" #: ../metadata/plane.xml.in.h:6 msgid "Plane To Face 1" msgstr "" #: ../metadata/plane.xml.in.h:7 msgid "Plane To Face 10" msgstr "" #: ../metadata/plane.xml.in.h:8 msgid "Plane To Face 11" msgstr "" #: ../metadata/plane.xml.in.h:9 msgid "Plane To Face 12" msgstr "" #: ../metadata/plane.xml.in.h:10 msgid "Plane To Face 2" msgstr "" #: ../metadata/plane.xml.in.h:11 msgid "Plane To Face 3" msgstr "" #: ../metadata/plane.xml.in.h:12 msgid "Plane To Face 4" msgstr "" #: ../metadata/plane.xml.in.h:13 msgid "Plane To Face 5" msgstr "" #: ../metadata/plane.xml.in.h:14 msgid "Plane To Face 6" msgstr "" #: ../metadata/plane.xml.in.h:15 msgid "Plane To Face 7" msgstr "" #: ../metadata/plane.xml.in.h:16 msgid "Plane To Face 8" msgstr "" #: ../metadata/plane.xml.in.h:17 msgid "Plane To Face 9" msgstr "" #: ../metadata/plane.xml.in.h:18 msgid "Plane Up" msgstr "" #: ../metadata/plane.xml.in.h:19 msgid "Plane down" msgstr "" #: ../metadata/plane.xml.in.h:20 msgid "Plane left" msgstr "" #: ../metadata/plane.xml.in.h:21 msgid "Plane right" msgstr "" #: ../metadata/plane.xml.in.h:22 msgid "Plane to face 1" msgstr "" #: ../metadata/plane.xml.in.h:23 msgid "Plane to face 10" msgstr "" #: ../metadata/plane.xml.in.h:24 msgid "Plane to face 11" msgstr "" #: ../metadata/plane.xml.in.h:25 msgid "Plane to face 12" msgstr "" #: ../metadata/plane.xml.in.h:26 msgid "Plane to face 2" msgstr "" #: ../metadata/plane.xml.in.h:27 msgid "Plane to face 3" msgstr "" #: ../metadata/plane.xml.in.h:28 msgid "Plane to face 4" msgstr "" #: ../metadata/plane.xml.in.h:29 msgid "Plane to face 5" msgstr "" #: ../metadata/plane.xml.in.h:30 msgid "Plane to face 6" msgstr "" #: ../metadata/plane.xml.in.h:31 msgid "Plane to face 7" msgstr "" #: ../metadata/plane.xml.in.h:32 msgid "Plane to face 8" msgstr "" #: ../metadata/plane.xml.in.h:33 msgid "Plane to face 9" msgstr "" #: ../metadata/plane.xml.in.h:34 msgid "Plane up" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Normal" msgstr "" #: ../metadata/resize.xml.in.h:13 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:2 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:12 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:94 ../metadata/switcher.xml.in.h:37 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:2 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:3 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:5 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:18 ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:24 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:25 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:28 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:6 msgid "Brightness" msgstr "" #: ../metadata/switcher.xml.in.h:7 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:11 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:14 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:19 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Saturation" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:29 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:36 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #: ../metadata/zoom.xml.in.h:1 msgid "Filter Linear" msgstr "" #: ../metadata/zoom.xml.in.h:5 msgid "Use linear filter when zoomed in" msgstr "" #: ../metadata/zoom.xml.in.h:6 msgid "Zoom Desktop" msgstr "" #: ../metadata/zoom.xml.in.h:7 msgid "Zoom In" msgstr "" #: ../metadata/zoom.xml.in.h:8 msgid "Zoom Out" msgstr "" #: ../metadata/zoom.xml.in.h:9 msgid "Zoom Pan" msgstr "" #: ../metadata/zoom.xml.in.h:10 msgid "Zoom Speed" msgstr "" #: ../metadata/zoom.xml.in.h:11 msgid "Zoom Timestep" msgstr "" #: ../metadata/zoom.xml.in.h:12 msgid "Zoom and pan desktop cube" msgstr "" #: ../metadata/zoom.xml.in.h:13 msgid "Zoom factor" msgstr "" #: ../metadata/zoom.xml.in.h:14 msgid "Zoom pan" msgstr "" compiz-0.9.11+14.04.20140409/po/en_US.po0000644000015301777760000015346712321343002017501 0ustar pbusernogroup00000000000000# English message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-07-09 16:58+0530\n" "PO-Revision-Date: 2002-07-18 14:04+0200\n" "Last-Translator: proofreader \n" "Language-Team: English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4417 #: ../metadata/core.xml.in.h:24 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.h:154 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4442 #: ../metadata/core.xml.in.h:85 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4484 #: ../metadata/core.xml.in.h:91 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4601 #: ../metadata/core.xml.in.h:161 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4620 msgid "Shade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4640 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4666 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4686 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4706 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4732 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5089 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5098 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5113 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:11 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 ../metadata/zoom.xml.in.h:2 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Previous" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Previous" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Previous" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Previous" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "Previous" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Previous" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:24 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:13 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 #, fuzzy msgid "Clone Output" msgstr "Terse output" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/core.xml.in.h:1 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/core.xml.in.h:2 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/core.xml.in.h:3 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/core.xml.in.h:4 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/core.xml.in.h:5 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/core.xml.in.h:6 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/core.xml.in.h:7 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/core.xml.in.h:8 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/core.xml.in.h:9 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/core.xml.in.h:10 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/core.xml.in.h:11 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/core.xml.in.h:12 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/core.xml.in.h:13 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.h:14 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.h:15 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.h:16 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.h:17 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.h:18 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.h:19 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.h:20 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.h:21 msgid "Best" msgstr "" #: ../metadata/core.xml.in.h:22 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.h:23 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.h:25 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.h:26 msgid "Command line 0" msgstr "" #: ../metadata/core.xml.in.h:27 msgid "Command line 1" msgstr "" #: ../metadata/core.xml.in.h:28 msgid "Command line 10" msgstr "" #: ../metadata/core.xml.in.h:29 msgid "Command line 11" msgstr "" #: ../metadata/core.xml.in.h:30 msgid "Command line 2" msgstr "" #: ../metadata/core.xml.in.h:31 msgid "Command line 3" msgstr "" #: ../metadata/core.xml.in.h:32 msgid "Command line 4" msgstr "" #: ../metadata/core.xml.in.h:33 msgid "Command line 5" msgstr "" #: ../metadata/core.xml.in.h:34 msgid "Command line 6" msgstr "" #: ../metadata/core.xml.in.h:35 msgid "Command line 7" msgstr "" #: ../metadata/core.xml.in.h:36 msgid "Command line 8" msgstr "" #: ../metadata/core.xml.in.h:37 msgid "Command line 9" msgstr "" #: ../metadata/core.xml.in.h:38 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/core.xml.in.h:39 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/core.xml.in.h:40 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/core.xml.in.h:41 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/core.xml.in.h:42 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/core.xml.in.h:43 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/core.xml.in.h:44 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/core.xml.in.h:45 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/core.xml.in.h:46 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/core.xml.in.h:47 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/core.xml.in.h:48 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/core.xml.in.h:49 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/core.xml.in.h:50 msgid "Decrease Opacity" msgstr "" #: ../metadata/core.xml.in.h:51 msgid "Decrease window opacity" msgstr "" #: ../metadata/core.xml.in.h:52 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.h:53 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.h:54 #, fuzzy msgid "Detect Outputs" msgstr "Terse output" #: ../metadata/core.xml.in.h:55 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:56 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.h:57 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.h:58 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.h:59 #, fuzzy msgid "Focus Prevention Level" msgstr "Previous" #: ../metadata/core.xml.in.h:60 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.h:61 #, fuzzy msgid "Focus prevention windows" msgstr "Previous" #: ../metadata/core.xml.in.h:62 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.h:63 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.h:64 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.h:65 msgid "Good" msgstr "" #: ../metadata/core.xml.in.h:66 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.h:67 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.h:68 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.h:69 msgid "High" msgstr "" #: ../metadata/core.xml.in.h:70 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:71 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.h:72 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.h:73 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.h:74 msgid "Increase Opacity" msgstr "" #: ../metadata/core.xml.in.h:75 msgid "Increase window opacity" msgstr "" #: ../metadata/core.xml.in.h:76 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.h:77 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.h:78 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.h:79 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.h:80 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.h:81 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.h:82 msgid "Low" msgstr "" #: ../metadata/core.xml.in.h:83 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.h:84 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.h:86 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.h:87 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.h:88 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.h:89 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.h:90 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.h:92 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.h:93 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.h:94 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.h:95 msgid "Off" msgstr "" #: ../metadata/core.xml.in.h:96 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.h:97 msgid "Opacity Step" msgstr "" #: ../metadata/core.xml.in.h:98 msgid "Opacity change step" msgstr "" #: ../metadata/core.xml.in.h:99 msgid "Opacity values for windows that should be translucent by default" msgstr "" #: ../metadata/core.xml.in.h:100 msgid "Opacity window values" msgstr "" #: ../metadata/core.xml.in.h:101 msgid "Opacity windows" msgstr "" #: ../metadata/core.xml.in.h:102 msgid "Open a terminal" msgstr "" #: ../metadata/core.xml.in.h:103 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.h:104 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.h:105 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.h:106 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.h:107 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.h:108 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.h:109 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.h:110 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.h:111 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.h:112 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.h:113 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.h:114 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:115 msgid "Run Dialog" msgstr "" #: ../metadata/core.xml.in.h:116 msgid "Run command 0" msgstr "" #: ../metadata/core.xml.in.h:117 msgid "Run command 1" msgstr "" #: ../metadata/core.xml.in.h:118 msgid "Run command 10" msgstr "" #: ../metadata/core.xml.in.h:119 msgid "Run command 11" msgstr "" #: ../metadata/core.xml.in.h:120 msgid "Run command 2" msgstr "" #: ../metadata/core.xml.in.h:121 msgid "Run command 3" msgstr "" #: ../metadata/core.xml.in.h:122 msgid "Run command 4" msgstr "" #: ../metadata/core.xml.in.h:123 msgid "Run command 5" msgstr "" #: ../metadata/core.xml.in.h:124 msgid "Run command 6" msgstr "" #: ../metadata/core.xml.in.h:125 msgid "Run command 7" msgstr "" #: ../metadata/core.xml.in.h:126 msgid "Run command 8" msgstr "" #: ../metadata/core.xml.in.h:127 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.h:128 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.h:129 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.h:130 msgid "Screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:131 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.h:132 msgid "Show Main Menu" msgstr "" #: ../metadata/core.xml.in.h:133 msgid "Show Run Application dialog" msgstr "" #: ../metadata/core.xml.in.h:134 msgid "Show the main menu" msgstr "" #: ../metadata/core.xml.in.h:135 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.h:136 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.h:137 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.h:138 msgid "Take a screenshot" msgstr "" #: ../metadata/core.xml.in.h:139 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/core.xml.in.h:140 msgid "Terminal command line" msgstr "" #: ../metadata/core.xml.in.h:141 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.h:142 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.h:143 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.h:144 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.h:145 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.h:146 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.h:147 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.h:148 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.h:149 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.h:150 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.h:151 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.h:152 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.h:153 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.h:155 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.h:156 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.h:157 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.h:158 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:159 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.h:160 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.h:162 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.h:163 msgid "Window menu key binding" msgstr "" #: ../metadata/core.xml.in.h:164 msgid "Window screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:165 msgid "Windows that should be translucent by default" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "Invalid relation" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:9 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Fold Acceleration" msgstr "Invalid relation" #: ../metadata/cube.xml.in.h:14 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:16 ../metadata/switcher.xml.in.h:10 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:19 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:25 ../metadata/place.xml.in.h:7 #: ../metadata/scale.xml.in.h:17 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:27 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:28 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:33 #, fuzzy msgid "Place windows on cube" msgstr "Previous" #: ../metadata/cube.xml.in.h:34 #, fuzzy msgid "Prev Slide" msgstr "Previous" #: ../metadata/cube.xml.in.h:35 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:43 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:90 ../metadata/scale.xml.in.h:32 #: ../metadata/switcher.xml.in.h:35 ../metadata/zoom.xml.in.h:3 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:44 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:93 ../metadata/scale.xml.in.h:34 #: ../metadata/switcher.xml.in.h:39 ../metadata/zoom.xml.in.h:4 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:46 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:47 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Previous" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Previous" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "Previous" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "Previous" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Previous" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:1 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:2 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:6 #, fuzzy msgid "Fade windows" msgstr "Previous" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fading Windows" msgstr "Previous" #: ../metadata/fade.xml.in.h:8 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Window fade speed" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Previous" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Previous" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "Previous" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "Previous" #: ../metadata/move.xml.in.h:8 ../metadata/scale.xml.in.h:21 #: ../metadata/switcher.xml.in.h:18 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "Previous" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Previous" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Force Placement Windows" msgstr "Previous" #: ../metadata/place.xml.in.h:5 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Maximize" msgstr "" #: ../metadata/place.xml.in.h:8 #, fuzzy msgid "Place Windows" msgstr "Previous" #: ../metadata/place.xml.in.h:9 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:10 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:12 #, fuzzy msgid "Positioned windows" msgstr "Previous" #: ../metadata/place.xml.in.h:13 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:20 #, fuzzy msgid "Viewport positioned windows" msgstr "Previous" #: ../metadata/place.xml.in.h:21 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:26 #, fuzzy msgid "X Positions" msgstr "Previous" #: ../metadata/place.xml.in.h:27 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:28 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:29 #, fuzzy msgid "Y Positions" msgstr "Previous" #: ../metadata/place.xml.in.h:30 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Normal" msgstr "" #: ../metadata/resize.xml.in.h:13 #, fuzzy msgid "Normal Resize Windows" msgstr "Previous" #: ../metadata/resize.xml.in.h:14 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline Resize Windows" msgstr "Previous" #: ../metadata/resize.xml.in.h:16 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:17 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Previous" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Resize Window" msgstr "Previous" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize window" msgstr "Previous" #: ../metadata/resize.xml.in.h:20 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window normally" msgstr "Previous" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window with outline" msgstr "Previous" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:26 #, fuzzy msgid "Stretch Resize Windows" msgstr "Previous" #: ../metadata/resize.xml.in.h:27 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:2 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:12 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate window" msgstr "Previous" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate with window" msgstr "Previous" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotation Acceleration" msgstr "Invalid relation" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotation Speed" msgstr "Registration key" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotation Timestep" msgstr "Registration key" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotation Zoom" msgstr "Registration key" #: ../metadata/rotate.xml.in.h:85 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:94 ../metadata/switcher.xml.in.h:41 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:2 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:3 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:5 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:18 ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:24 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:25 #, fuzzy msgid "Scale Windows" msgstr "Previous" #: ../metadata/scale.xml.in.h:26 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:28 #, fuzzy msgid "Scale windows" msgstr "Previous" #: ../metadata/scale.xml.in.h:29 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:30 #, fuzzy msgid "Space between windows" msgstr "Previous" #: ../metadata/scale.xml.in.h:31 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 #, fuzzy msgid "Put screenshot images in this directory" msgstr "Recurse into the directory" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:6 msgid "Brightness" msgstr "" #: ../metadata/switcher.xml.in.h:7 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:11 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:14 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next window" msgstr "Previous" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window (All windows)" msgstr "Previous" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (No popup)" msgstr "Previous" #: ../metadata/switcher.xml.in.h:19 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:23 #, fuzzy msgid "Prev Panel" msgstr "Previous" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev window" msgstr "Previous" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window (All windows)" msgstr "Previous" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (No popup)" msgstr "Previous" #: ../metadata/switcher.xml.in.h:27 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Saturation" msgstr "" #: ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Select next panel type window." msgstr "Previous" #: ../metadata/switcher.xml.in.h:30 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:31 #, fuzzy msgid "Select previous panel type window." msgstr "Previous" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:34 #, fuzzy msgid "Show minimized windows" msgstr "Previous" #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Switcher speed" msgstr "Previous" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher timestep" msgstr "Previous" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher windows" msgstr "Previous" #: ../metadata/switcher.xml.in.h:40 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "No confirmation" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Previous" #: ../metadata/zoom.xml.in.h:1 msgid "Filter Linear" msgstr "" #: ../metadata/zoom.xml.in.h:5 msgid "Use linear filter when zoomed in" msgstr "" #: ../metadata/zoom.xml.in.h:6 msgid "Zoom Desktop" msgstr "" #: ../metadata/zoom.xml.in.h:7 msgid "Zoom In" msgstr "" #: ../metadata/zoom.xml.in.h:8 msgid "Zoom Out" msgstr "" #: ../metadata/zoom.xml.in.h:9 msgid "Zoom Pan" msgstr "" #: ../metadata/zoom.xml.in.h:10 #, fuzzy msgid "Zoom Speed" msgstr "Registration key" #: ../metadata/zoom.xml.in.h:11 msgid "Zoom Timestep" msgstr "" #: ../metadata/zoom.xml.in.h:12 msgid "Zoom and pan desktop cube" msgstr "" #: ../metadata/zoom.xml.in.h:13 msgid "Zoom factor" msgstr "" #: ../metadata/zoom.xml.in.h:14 #, fuzzy msgid "Zoom pan" msgstr "Registration key" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Previous" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Previous" #, fuzzy #~ msgid "Plane down" #~ msgstr "Previous" #, fuzzy #~ msgid "Plane up" #~ msgstr "Terse output" #, fuzzy #~ msgid "Dialog" #~ msgstr "Catalog" #, fuzzy #~ msgid "Notification" #~ msgstr "No confirmation" #, fuzzy #~ msgid "Unknown" #~ msgstr "unknown" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Previous" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Invalid relation" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Registration key" compiz-0.9.11+14.04.20140409/po/zh_TW.po0000644000015301777760000036364612321343002017525 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2009-10-08 11:34+0200\n" "Last-Translator: Yichih Liu \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "桌é¢" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "視窗管ç†å“¡" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "ç„¡" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "é™°å½±" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "最大化" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "將視窗水平最大化" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "將視窗垂直最大化" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "最å°åŒ–" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "剿™¯è¦–窗" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "低" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "視窗é¸å–®" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "滑鼠滾輪在視窗標題列上的動作" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "柔化方å¼" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Metacity ä½ˆæ™¯ä¸»é¡Œä½¿ç”¨ä¸­çš„è¦–çª—é€æ˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity ä½ˆæ™¯ä¸»é¡Œä½¿ç”¨ä¸­çš„è¦–çª—é™°å½±é€æ˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity ä½ˆæ™¯ä¸»é¡Œé€æ˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity ä½ˆæ™¯ä¸»é¡Œçš„é™°å½±é€æ˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "使用 Metacity 視窗管ç†å“¡æ™‚ï¼Œä½œç”¨ä¸­è¦–çª—çš„é€æ˜Žåº¦ã€‚" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "使用 Metacity ä½ˆæ™¯ä¸»é¡Œçš„é€æ˜Žåº¦" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "使用 Metacity 佈景主題,從ä¸é€æ˜Žåˆ°åŠé€æ˜Žçš„作用中視窗陰影" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "使用 Metacity ä½ˆæ™¯ä¸»é¡Œï¼Œä¸¦æ·»åŠ å¾žé€æ˜Žåˆ°ä¸é€æ˜Žçš„æ¼¸è®Šæ•ˆæžœã€‚" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "標題列滑鼠滾輪動作" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "é‡å°è¦–窗è£é£¾çš„æ¨¡ç³Šæ–¹å¼" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "使用 metacity 主題" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "給視窗è£é£¾å¼•擎指定使用 metacity 佈景主題" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "關閉視窗" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "視窗解除最大化" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "最大化視窗" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "最å°åŒ–視窗" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "ä¿æŒè‡³é ‚" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "æ²¾é»è¦–窗" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "解除陰影" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "å–æ¶ˆè‡³é ‚" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "å–æ¶ˆæ²¾é»" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "視窗\"%s\"å·²ç¶“æ²’æœ‰åæ‡‰" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "強制離開這個應用程å¼ï¼Œæœƒå°Žè‡´æ‚¨å°šæœªå„²å­˜çš„資料éºå¤±ã€‚" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "強制離開" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "桌é¢ç•«ç­†" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "桌é¢ç•«ç­†è‰²å½©" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "桌é¢ç•«ç­†æè¿°è‰²å½©" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "桌é¢ç•«ç­†å¤–掛" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "清除桌é¢å¡—é´‰" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "ç•«" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "使用工具畫圖" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "ç•«ç­†è¦ç”¨çš„色彩" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "開始畫按éµ" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "開始使用桌é¢ç•«ç­†çš„æŒ‰éµè¨­å®š" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "桌é¢ç•«ç­†çš„æ©¡ç𮿓¦æŒ‰éµè¨­å®š" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "桌é¢ç•«ç­†æ©¡ç𮿓¦" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "ç·šæ¢å¯¬åº¦" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "桌é¢ç•«ç­†çš„ç·šæ¢å¯¬åº¦" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "桌é¢ç•«ç­†æè¿°é¡è‰²" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "桌é¢ç•«ç­†æè¿°å¯¬åº¦" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "桌é¢ç•«ç­†çš„æè¿°å¯¬åº¦" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xé›™ç·šæ€§éŽæ¿¾å™¨" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alpha柔化效果" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alpha柔化視窗" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "柔化濾é¡" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "柔化咬åˆ" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "柔化飽和度" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "柔化速度" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "柔化視窗" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "柔化在視窗後é¢åŠé€æ˜Žçš„部份" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "柔化飽和度" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "柔化視窗" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "å°éžå‰æ™¯çš„è¦–çª—æŽ¡å–æŸ”化處ç†" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "關閉其他視窗é®è”½èž¢å¹•å€åŸŸçš„æŸ”化功能" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "æ¨¡ç³ŠéŽæ¿¾å™¨çš„使用方å¼" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "焦點柔化" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "焦點柔化視窗" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "高斯柔化" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "高斯柔化åŠå¾‘" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "高斯柔化強度" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "高斯柔化åŠå¾‘" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "高斯柔化強度" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "æ“·å–ç¨ç«‹ç´‹ç†" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap 細節層次" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulse" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Pulse效果" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "ä½¿ç”¨ç¾æœ‰çš„æè³ªå–®å…ƒï¼Œåšç›¡å¯èƒ½å¤šçš„ç¨ç«‹ç´‹ç†æ“·å–" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "視窗柔化速度" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "應該被èšç„¦æŸ”化的視窗" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "視窗應以alpha柔化為é è¨­å€¼" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "多螢幕時相åŒè¼¸å‡º" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "啟動複製畫é¢é¸æ“‡" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "輸出複製畫é¢è™•ç†" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "當滑鼠按éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬0個shell指令。" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "當滑鼠按éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬1個shell指令。" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "當滑鼠按éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬10個shell指令。" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "當滑鼠按éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬11個shell指令。" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "當滑鼠按éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬2個shell指令。" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "當滑鼠按éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬3個shell指令。" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "當滑鼠按éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬4個shell指令。" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "當滑鼠按éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬5個shell指令。" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "當滑鼠按éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬6個shell指令。" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "當滑鼠按éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬7個shell指令。" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "當滑鼠按éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬8個shell指令。" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "當滑鼠按éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬9個shell指令。" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "ç•¶éµç›¤æŒ‰éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬0個shell指令。" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "ç•¶éµç›¤æŒ‰éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬1個shell指令。" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "ç•¶éµç›¤æŒ‰éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬10個shell指令。" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "ç•¶éµç›¤æŒ‰éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬11個shell指令。" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "ç•¶éµç›¤æŒ‰éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬2個shell指令。" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "ç•¶éµç›¤æŒ‰éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬3個shell指令。" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "ç•¶éµç›¤æŒ‰éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬4個shell指令。" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "ç•¶éµç›¤æŒ‰éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬5個shell指令。" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "ç•¶éµç›¤æŒ‰éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬6個shell指令。" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "ç•¶éµç›¤æŒ‰éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬7個shell指令。" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "ç•¶éµç›¤æŒ‰éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬8個shell指令。" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "ç•¶éµç›¤æŒ‰éµè¨­å®šå•Ÿç”¨ï¼Œå°‡æœƒåŸ·è¡Œç¬¬9個shell指令。" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第0個shell指令。" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第1個shell指令。" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第10個shell指令。" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第11個shell指令。" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第2個shell指令。" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第3個shell指令。" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第4個shell指令。" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第5個shell指令。" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第6個shell指令。" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第7個shell指令。" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第8個shell指令。" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第9個shell指令。" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "設定使用者定義的shell指令,å¯ä»¥ç”¨ä¸åŒçš„æ–¹å¼å•Ÿå‹•。" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "滑鼠與éµç›¤è¨­å®š" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "shell指令 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "shell指令 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "shell指令 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "shell指令 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "shell指令 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "shell指令 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "shell指令 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "shell指令 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "shell指令 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "shell指令 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "shell指令 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "shell指令 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "ç•¶shell指令0設定之後,將會在shellè£é¢åŸ·è¡Œé€™å€‹æŒ‡ä»¤ã€‚" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "ç•¶shell指令1設定之後,將會在shellè£é¢åŸ·è¡Œé€™å€‹æŒ‡ä»¤ã€‚" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "ç•¶shell指令10設定之後,將會在shellè£é¢åŸ·è¡Œé€™å€‹æŒ‡ä»¤ã€‚" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "ç•¶shell指令11設定之後,將會在shellè£é¢åŸ·è¡Œé€™å€‹æŒ‡ä»¤ã€‚" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "ç•¶shell指令2設定之後,將會在shellè£é¢åŸ·è¡Œé€™å€‹æŒ‡ä»¤ã€‚" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "ç•¶shell指令3設定之後,將會在shellè£é¢åŸ·è¡Œé€™å€‹æŒ‡ä»¤ã€‚" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "ç•¶shell指令4設定之後,將會在shellè£é¢åŸ·è¡Œé€™å€‹æŒ‡ä»¤ã€‚" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "ç•¶shell指令5設定之後,將會在shellè£é¢åŸ·è¡Œé€™å€‹æŒ‡ä»¤ã€‚" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "ç•¶shell指令6設定之後,將會在shellè£é¢åŸ·è¡Œé€™å€‹æŒ‡ä»¤ã€‚" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "ç•¶shell指令7設定之後,將會在shellè£é¢åŸ·è¡Œé€™å€‹æŒ‡ä»¤ã€‚" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "ç•¶shell指令8設定之後,將會在shellè£é¢åŸ·è¡Œé€™å€‹æŒ‡ä»¤ã€‚" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "ç•¶shell指令9設定之後,將會在shellè£é¢åŸ·è¡Œé€™å€‹æŒ‡ä»¤ã€‚" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "é è¨­æŒ‡ä»¤(Commands)" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "螢幕外緣啟動(Edge)設定" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "éµç›¤æŒ‰éµè¨­å®š" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "執行指令 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "執行指令 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "執行指令 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "執行指令 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "執行指令 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "執行指令 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "執行指令 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "執行指令 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "執行指令 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "執行指令 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "執行指令 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "執行指令 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "啟用外掛程å¼" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "使全螢幕的æç¹ªå‹•ä½œä¸æœƒé‡æ–°å°Žå‘到幕後åƒç´ æ˜ å°„" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "å¯ä»¥è½è¦‹éˆ´è²" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "å¯ä»¥è½è¦‹ç³»çµ±éˆ´è²" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "自動é¸å®šè¦–çª—åˆ°å‰æ™¯" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "自動é¸å®šè¦–çª—ç§»å‹•åˆ°å‰æ™¯çš„延鲿™‚é–“" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "è‡ªå‹•åµæ¸¬è¼¸å‡ºè¨­å‚™" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "è‡ªå‹•åµæ¸¬é‡æ–°æ•´ç†é€Ÿçއ" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "最佳" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "按一下視窗æ‰é¸å®šè©²è¦–窗" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "在視窗上按一下便å¯å°‡è¼¸å…¥ç„¦é»žç§»å‹•到該視窗(啟用此功能會導致下方「自動é¸å®šè¦–çª—åˆ°å‰æ™¯ã€åŠŸèƒ½å¤±æ•ˆ)" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "關閉作用中視窗" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "é è¨­åœ–示" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "é è¨­çš„視窗圖示影åƒ" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "è™›æ“¬æ¡Œé¢æ•¸é‡" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "嵿¸¬è¼¸å‡º" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "嵿¸¬é‡æ–°æ•´ç†é€Ÿçއ" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "顯示設定" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "螢幕外緣啟動(Edge)的延é²å•Ÿå‹•時間。" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "螢幕外緣啟動(Edge)å»¶é²" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "快速" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "定焦 & 剿™¯è¦–窗" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "防止定焦程度" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "防止定焦視窗" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "防止定焦視窗" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "å¼·åˆ¶å–®ç¨æç¹ªè¼¸å‡º" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "通用é¸é …" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "通用compizé¸é …" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "好" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "éš±è—è·³éŽå·¥ä½œåˆ—視窗" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "éš±è—全部視窗並定焦桌é¢" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "é€²å…¥é¡¯ç¤ºæ¡Œé¢æ¨¡å¼æ™‚éš±è—æœªåœ¨å·¥ä½œåˆ—的視窗" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "高" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "æ°´å¹³è™›æ“¬æ¡Œé¢æ•¸é‡" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "如果å¯èƒ½ï¼Œå¾žåœ–片影åƒç•¶ä¸­å–å¾—çš„ç´‹ç†æè³ªé€²è¡Œå£“ç¸®" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "最大化時忽略æç¤º" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "視窗最大化時忽略大å°å¢žé‡èˆ‡ç•«é¢æç¤º" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "在將é¸å®šçš„è¦–çª—ç§»åˆ°å‰æ™¯çš„ç·©è¡æ™‚é–“" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "在ping訊æ¯ä¹‹é–“çš„ç·©è¡æ™‚é–“" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "éµç›¤èˆ‡æ»‘鼠按éµè¨­å®š" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "é é˜²å®šç„¦ç¨‹åº¦" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "å…‰æº" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "顯示目å‰å•Ÿç”¨ä¸­çš„å¤–æŽ›ç¨‹å¼æ¸…å–®" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "æè¿°è¼¸å‡ºè¨­å‚™çš„字串清單" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "低" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "後景視窗" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "將視窗é™ä½Žåˆ°å…¶ä»–剿™¯è¦–窗之下" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "將視窗水平最大化" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "將視窗垂直最大化" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "最大化作用中視窗" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "將作用中視窗水平最大化" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "將作用中視窗垂直最大化" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "最å°åŒ–作用中視窗" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "一般" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "æ¡Œé¢æ•¸" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "è™›æ“¬æ¡Œé¢æ•¸" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "é—œ" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "åªåœ¨åž‚直空白期間執行螢幕更新" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "輸出" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "é‡ç–Šè¼¸å‡ºè™•ç†" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "繪製æ¯å€‹ç¨ç«‹çš„輸出è£ç½®ï¼Œå³ä½¿æ˜¯è¼¸å‡ºè£ç½®æœ‰é‡è¤‡" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Pingå»¶é²" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "首é¸å¤§çš„輸出" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "首é¸å°çš„輸出" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "按一下視窗時é¸å®šè©²è¦–çª—åˆ°å‰æ™¯" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "剿™¯è¦–窗" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "在設定的時間間隔後,將é¸å®šçš„è¦–çª—ç§»åˆ°å‰æ™¯" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "å°‡é¸å®šçš„視窗移到其他視窗最å‰é¢" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "在按一下時將é¸å®šçš„è¦–çª—æŽ’åˆ—åˆ°æœ€å‰æ™¯" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "釿–°æ•´ç†é€Ÿçއ" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "水平方å‘虛擬桌é¢çš„æ•¸é‡è¨­å®š" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "垂直方å‘虛擬桌é¢çš„æ•¸é‡è¨­å®š" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "顯示桌é¢" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "減慢動畫速度" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "è°æ˜Žæ¨¡å¼è‡ªå‹•調整" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "åŒæ­¥åŒ–到 VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "æè³ªå£“縮" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "æè³ªéŽæ¿¾å™¨" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "æè³ªç¯©é¸" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "èž¢å¹•é‡æ–°æç¹ªçš„速率 (次數/ç§’)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "將視窗切æ›åˆ°æœ€å¤§" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "將視窗水平切æ›åˆ°æœ€å¤§" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "將視窗垂直切æ›åˆ°æœ€å¤§" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "將視窗切æ›åˆ°é®è”½" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "將使用中視窗切æ›åˆ°æœ€å¤§" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "將使用中視窗水平切æ›åˆ°æœ€å¤§" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "將使用中視窗垂直切æ›åˆ°æœ€å¤§" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "將使用中視窗切æ›åˆ°é®è”½" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "切æ›ä½¿ç”¨æ¸›æ…¢å‹•畫速度" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "作用中視窗解除最大化" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "å…¨èž¢å¹•è¦–çª—è§£é™¤é‡æ–°å°Žå‘" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "åœ¨èž¢å¹•è½‰æ›æ™‚使用擴散光" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "åž‚ç›´è™›æ“¬æ¡Œé¢æ•¸é‡" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "éžå¸¸é«˜" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "設定哪個é‡ç–Šè¼¸å‡ºè£ç½®ç‚ºé¦–é¸" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "視窗é¸å–®æ»‘鼠按éµè¨­å®š" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "視窗é¸å–®éµç›¤æŒ‰éµè¨­å®š" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "加速" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "調整圖片" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "èª¿æ•´é ‚éƒ¨åœ–ç‰‡å½±åƒæ—‹è½‰" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "å‰é€²åˆ°ä¸‹ä¸€å€‹slide" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "天空頂動態展示" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "旋轉立方體時天空頂以動態展ç¾" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "外觀" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "自動" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "特性" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "立方體的頂é¢å’Œåº•é¢é¡è‰²" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "使用é¡è‰²é€æ¼¸è®ŠåŒ–的方å¼ï¼Œåˆ°åº•éƒ¨çµæŸé¡è‰²" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "使用é¡è‰²é€æ¼¸è®ŠåŒ–的方å¼ï¼Œåˆ°é ‚éƒ¨çµæŸé¡è‰²" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "立方體上蓋" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "立方體色彩" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "桌é¢ç«‹æ–¹é«”" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "摺疊加速" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "摺疊速度" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "摺疊時間間隔" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "有å¯èƒ½ç”¢ç”Ÿmipmaps來產生更高å“質的縮放" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "返回上一個slide" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "å½±åƒæª”" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "用來作為天空頂æè³ªçš„å½±åƒ" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "用滑鼠轉動立方體時展ç¾ç«‹æ–¹é«”逿˜ŽåŒ–效果" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "立方體內部" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "立方體內部" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "æ‡‰è©²è¦æç¹ªè‡³ç«‹æ–¹é«”é ‚é¢çš„ PNG å’Œ SVG 檔案清單" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "多é‡è¼¸å‡ºæ¨¡å¼" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "多é‡ç«‹æ–¹é«”" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "下一個slide" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "一個大的單ç¨ç«‹æ–¹é«”" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "æ—‹è½‰æ™‚çš„é€æ˜Žåº¦" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "éžæ—‹è½‰æ™‚çš„é€æ˜Žåº¦" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "桌é¢è¦–çª—åœ¨æ—‹è½‰æ™‚çš„é€æ˜Žåº¦" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "桌é¢è¦–çª—åœ¨æœªæ—‹è½‰æ™‚çš„é€æ˜Žåº¦" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "將視窗放到立方體" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "上一個Slide" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "æç¹ªå¤©ç©ºé ‚" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "èª¿æ•´å½±åƒæ¯”例" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "èª¿æ•´å½±åƒæ¯”例以覆蓋立方體頂é¢" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "鏿“‡ç«‹æ–¹é«”è¦å¦‚何顯示,如果有多個輸出è£ç½®å¯ä½¿ç”¨" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "天空頂" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "å¤©ç©ºé ‚æ¼¸å±¤çµæŸè‰²å½©" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "天空頂漸層開始色彩" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "天空頂影åƒ" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "速度" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "時間間隔" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "使用滑鼠旋轉時æ‰é€æ˜ŽåŒ–" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "逿˜Žç«‹æ–¹é«”" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "展開" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "展開立方體" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus控制å°" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "å…許è£é£¾ç´‹ç†æè³ªç”¢ç”Ÿmipmaps" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "指令" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "è£é£¾è¦–窗" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "如果沒有è£é£¾ç¨‹å¼æ­£åœ¨åŸ·è¡Œï¼Œå‰‡éœ€æŒ‡å®šè¦åŸ·è¡Œçš„視窗è£é£¾ç¨‹å¼æŒ‡ä»¤ã€‚" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "é™°å½± X 軸åç§»" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "é™°å½± Y 軸åç§»" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "設定陰影é¡è‰²" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "é™°å½±ä¸é€æ˜Žåº¦" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "é™°å½±åŠå¾‘" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "é™°å½±é¡è‰²" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "é™°å½±åç§» X 軸" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "é™°å½±åç§» Y 軸" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "é™°å½±ä¸é€æ˜Žåº¦" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "é™°å½±åŠå¾‘" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "陰影視窗" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "視窗è£é£¾" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "視窗è£é£¾" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "è¨­å®šå“ªäº›è¦–çª—çµæ§‹æ‡‰è©²è¢«è£é£¾" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "è¨­å®šå“ªäº›è¦–çª—çµæ§‹æ‡‰è©²æ“有陰影" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "未響應視窗亮度(%)" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "速度常數" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "時間常數" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "暗淡無響應視窗" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "æš—æ·¡åŒ–å°æ–¼è¦–窗管ç†å™¨æ²’æœ‰åæ‡‰çš„視窗" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "æ·¡å…¥/淡出模å¼" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "最å°åŒ–/開啟/關閉 視窗時淡入/淡出" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "æ·¡å…¥/淡出速度" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "æ·¡å…¥/淡出時間" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "ç•¶è¦–çª—æŽ¡å– æœ€å°åŒ–/開啟/關閉 的動作時,使用淡入/淡出特效" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "ç³»çµ±ç™¼å‡ºå—¶è²æ™‚啟用淡入/淡出特效" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "在映射時(mapped)淡入視窗,以åŠåœ¨è§£é™¤æ˜ å°„時淡出視窗" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "æ·¡å…¥/淡出視窗" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "視窗淡入/淡出中" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "全螢幕警示鈴è²" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "ç³»çµ±ç™¼å‡ºå—¶è²æ™‚啟用全螢幕淡出/淡入特效" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "ç„¡åæ‡‰è¦–窗的飽和度(以%來設定)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "ç„¡åæ‡‰è¦–窗的亮度" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "ç„¡åæ‡‰è¦–窗的飽和度" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "視覺鈴è²" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "視窗淡入/淡出模å¼" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "視窗淡入/æ·¡å‡ºé€Ÿåº¦ä»¥ã€Œé€Ÿåº¦å¸¸æ•¸ã€æ¨¡å¼é€²è¡Œ" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "視窗淡入/æ·¡å‡ºé€Ÿåº¦ä»¥ã€Œæ™‚é–“å¸¸æ•¸ã€æ¨¡å¼é€²è¡Œ(以ms毫秒為基數)" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "應該淡入/淡出的視窗類型" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Compiz的掛載ä½ç½®" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Compiz的掛載ä½ç½®" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "使用者紀錄放置ä½ç½®" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "使用者的紀錄放置ä½ç½®" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf 控制å°" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib main loop支æ´ã€‚(GLib為一個補助GTK+的函å¼åº«)" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome的相容性" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "開啟一個終端機執行" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "使Compiz能與Gnome桌é¢ç’°å¢ƒç›¸å®¹çš„環境設定" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "執行å°è©±æ–¹å¡Š" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "執行終端機指令" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "èž¢å¹•æ“·å–æŒ‡ä»¤" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "顯示主功能表" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "顯示執行應用程å¼å°è©±æ–¹å¡Š" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "顯示主功能表" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "æ“·å–螢幕畫é¢" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "æ“·å–視窗螢幕畫é¢" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "終端機的指令" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "è¦–çª—èž¢å¹•æ“·å–æŒ‡ä»¤" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini平颿ª”案控制å°" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "檔案被改變時警告外掛" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify檔案監控機制" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig控制å°" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "最å°åŒ–特效" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "最å°åŒ–視窗" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "最å°åŒ–速度" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "最å°åŒ–時間間隔" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "é®è”½é˜»åŠ›" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "é®è”½é˜»åŠ›" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "在最å°åŒ–和解除最å°åŒ–時變化視窗" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "最å°åŒ–時應該變化的視窗類型" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "等比縮放 Y 軸" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "等比縮放 Y è»¸å°æ‡‰åˆ°å·¥ä½œç’°å¢ƒå€åŸŸ" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "è¦–çª—ç§»å‹•çµæŸä¹‹å‰ä¸æ›´æ–°server端視窗的ä½ç½®" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "開始視窗移動" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "懶惰定ä½" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "移動視窗" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "移動視窗" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "ä¸é€æ˜Žåº¦" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "移動視窗的ä¸é€æ˜Žåº¦" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "在拖曳已最大化視窗時為其解除嵌入和自動解除最大化" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "解除嵌入最大化視窗" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "開始移動視窗" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "亮度" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "é™ä½Žäº®åº¦" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "增加亮度" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "亮度幅度" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "視窗的亮度值" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "減少" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "增加" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "ä¸é€æ˜Žåº¦æ¸›å°‘" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "ä¸é€æ˜Žåº¦å¢žåŠ " #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "ä¸é€æ˜Žåº¦å¹…度" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "視窗的ä¸é€æ˜Žåº¦" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "ä¸é€æ˜Žã€äº®åº¦èˆ‡é£½å’Œåº¦" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "ä¸é€æ˜Žã€äº®åº¦èˆ‡é£½å’Œåº¦èª¿æ•´" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "飽和度" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "飽和度é™ä½Ž" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "飽和度增加" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "飽和度幅度" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "視窗的飽和度" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "幅度" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "視窗的具體設定" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "幅度數值" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "何種視窗" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "é è¨­è¦–窗應該有一個ä¸åŒçš„亮度" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "é è¨­è¦–窗應該有一個ä¸åŒçš„ä¸é€æ˜Žåº¦" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "é è¨­è¦–窗應該有一個ä¸åŒçš„飽和度" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "視窗放置的使用方å¼" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "層疊" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "居中" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "固定視窗ä½ç½®" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "強制視窗ä½ç½®" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "水平視點ä½ç½®" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "ä¿æŒåœ¨å·¥ä½œå€åŸŸ" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "ä¿æŒåœ¨è¦–窗工作å€åŸŸï¼Œå³ä½¿èˆ‡æŒ‡å®šä½ç½®ä¸åŒ" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "放置視窗" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "放置在所有的輸出è£ç½®" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "在視窗æç¹ªæ™‚將視窗放置到é©ç•¶ä½ç½®" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "放置方法" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "視窗的部ä½" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "隨機亂數" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "如果有多個輸出è£ç½®å¯ä½¿ç”¨æ™‚,視窗è¦å¦‚何定ä½ã€‚" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "è°æ˜Žæ¨¡å¼" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "使用已使用中的輸出è£ç½®" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "使用已é¸è¦–窗的那個輸出è£ç½®" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "使用已é¸é»žé¸é‚£å€‹è¼¸å‡ºè£ç½®" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "垂直視點ä½ç½®" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "視窗的視點ä½ç½®" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "視窗ä½ç½®çš„解決方å¼" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "é è¨­çš„視窗ä½ç½®" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "é è¨­çš„自定義視窗視點ä½ç½®" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "å³ä½¿è¦–窗管ç†å“¡ç¦æ­¢æ”¾ç½®çš„å€åŸŸï¼Œä»ç„¶å¼·åˆ¶æ”¾ç½®è¦–窗" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "視窗以ä½ç½®æ–¹å¼å›ºå®š" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "視窗以視點方å¼å›ºå®š" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "視窗ä½ç½®è§£æ±ºæ–¹å¼" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X座標的ä½ç½®" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X座標視點的ä½ç½®" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X座標ä½ç½®çš„æ•¸å€¼" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y座標的ä½ç½®" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y座標視點的ä½ç½®" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y座標ä½ç½®çš„æ•¸å€¼" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png圖檔" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "讀å–Png影響圖檔" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "è¦å‰‡åŒ¹é…" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "è¦å‰‡è¦–窗匹é…" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "連çµ" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "邊框é¡è‰²" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "邊框é¡è‰²ç”¨æ–¼å¤–框與矩形調整模å¼" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "é è¨­èª¿æ•´å¤§å°æ–¹æ³•" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "調整視窗大å°çš„é è¨­æ–¹æ³•" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "填滿色彩" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "在矩型調整模å¼ä¸‹å¡«æ»¿è‰²å½©" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "開始調整視窗大å°" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "開始調整視窗外框大å°" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "開始調整矩型視窗大å°" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "開始拉伸視窗大å°" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "開始調整視窗大å°" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "正常的視窗調整" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "外框" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "調整視窗外框" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "矩形" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "矩型調整視窗" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "調整視窗大å°" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "調整視窗大å°" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "開始調整視窗大å°" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "開始使用拉伸方å¼èª¿æ•´è¦–窗大å°" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "開始正常調整視窗" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "開始調整視窗外框" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "開始調整視窗矩形" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "拉伸" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "拉伸調整視窗" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "正常視窗調整應該使用在" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "外框視窗調整應該使用在" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "矩形視窗調整應該使用在" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "拉伸視窗調整應該使用在" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "邊緣翻轉拖放" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "邊緣翻轉移動" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "邊緣翻轉點" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "翻轉時間" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "往左檢視å€ç¿»è½‰ä¸¦è·³èºæŒ‡æ¨™" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "將物件拖曳到螢幕邊緣時翻轉到下一個檢視å€" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "將指標移動到螢幕邊緣時翻轉到下一個檢視å€" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "將視窗移動到螢幕邊緣時翻轉到下一個檢視å€" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "往峿ª¢è¦–å€ç¿»è½‰ä¸¦è·³èºæŒ‡æ¨™" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "指標移動時的 Y 軸相å" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "指標 Y 軸相å" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "æŒ‡æ¨™éˆæ•度" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "在旋轉時æé«˜" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "在旋轉時æé«˜è¦–窗高度" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "旋轉立方體" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "往左旋轉翻轉" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "往峿—‹è½‰ç¿»è½‰" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "往左旋轉" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "視窗跟隨往左旋轉" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "往峿—‹è½‰" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "è¦–çª—è·Ÿéš¨å¾€å³æ—‹è½‰" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "旋轉至" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "旋轉到第1é¢" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "視窗跟隨旋轉到第1é¢" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "旋轉到第10é¢" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "視窗跟隨旋轉到第10é¢" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "旋轉到第11é¢" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "視窗跟隨旋轉到第11é¢" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "旋轉到第12é¢" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "視窗跟隨旋轉到第12é¢" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "旋轉到第2é¢" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "視窗跟隨旋轉到第2é¢" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "旋轉到第3é¢" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "視窗跟隨旋轉到第3é¢" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "旋轉到第4é¢" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "視窗跟隨旋轉到第4é¢" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "旋轉到第5é¢" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "視窗跟隨旋轉到第5é¢" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "旋轉到第6é¢" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "視窗跟隨旋轉到第6é¢" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "旋轉到第7é¢" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "視窗跟隨旋轉到第7é¢" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "旋轉到第8é¢" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "視窗跟隨旋轉到第8é¢" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "旋轉到第9é¢" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "視窗跟隨旋轉到第9é¢" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "旋轉立方體" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "旋轉桌é¢ç«‹æ–¹é«”" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "往左旋轉" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗往左旋轉" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "往峿—‹è½‰" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "連åŒç¾è¡Œçš„è¦–çª—å¾€å³æ—‹è½‰" # 轉到第1é¢ #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "旋轉到立方體到å¦ä¸€å€‹é¢" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "視窗隨著立方體旋轉到å¦ä¸€å€‹é¢" # 轉到第1é¢ #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "旋轉到第1é¢" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗旋轉到第1é¢" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "旋轉到第10é¢" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗旋轉到第10é¢" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "旋轉到第11é¢" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗旋轉到第11é¢" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "旋轉到第12é¢" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗旋轉到第12é¢" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "旋轉到第2é¢" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗旋轉到第2é¢" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "旋轉到第3é¢" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗旋轉到第3é¢" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "旋轉到第4é¢" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗旋轉到第4é¢" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "旋轉到第5é¢" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗旋轉到第5é¢" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "旋轉到第6é¢" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗旋轉到第6é¢" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "旋轉到第7é¢" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗旋轉到第7é¢" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "旋轉到第8é¢" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗旋轉到第8é¢" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "旋轉到第9é¢" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "連åŒç¾è¡Œçš„視窗旋轉到第9é¢" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "å¾€æª¢è¦–å€æ—‹è½‰" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "旋轉視窗" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "隨視窗旋轉" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "旋轉加速" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "旋轉速度" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "旋轉時間間隔" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "旋轉縮放" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "æŒ‡æ¨™ç§»å‹•éˆæ•度" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "å¸é™„立方體旋轉至下é¢" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "å¸é™„立方體旋轉至頂é¢" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "å¸é™„到下é¢" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "å¸é™„到上é¢" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "開始旋轉" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "翻轉視點å‰çš„逾時時間" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "縮放" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "ä¸é€æ˜Žåº¦æ¯”例" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "大" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "視窗縮放切æ›çš„æ»‘é¼ éµç›¤è¨­å®š" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "設定滑鼠與éµç›¤çš„æŒ‰éµï¼Œç•¶æŒ‰ä¸‹æ™‚é€²è¡Œè¦–çª—ç¸®æ”¾ï¼Œæ”¾é–‹ä¹‹å¾Œåœæ­¢è¦–窗縮放。" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "按下桌é¢ä¾†é¡¯ç¤ºæ¡Œé¢" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "暗化背景" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "調整視窗比例時暗化背景" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "象徵" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "在縮放時,點擊桌é¢å°‡æœƒé€²å…¥æ¡Œé¢é¡¯ç¤ºæ¨¡å¼" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "åœç•™æ™‚é–“" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "èµ·å§‹åŒ–è¦–çª—é¸æ“‡å™¨" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "å•Ÿå§‹åŒ–æ‰€æœ‰è¦–çª—çš„è¦–çª—é¸æ“‡å™¨" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "å•Ÿå§‹åŒ–è¦–çª—ç¾¤çµ„çš„è¦–çª—é¸æ“‡å™¨" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "在目å‰è¼¸å‡ºä¸­çš„è¦–çª—ä¸Šå•Ÿå§‹åŒ–è¦–çª—é¸æ“‡å™¨" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "設定éµç›¤è¯çµåˆ‡æ›ç¸®æ”¾æ¨¡å¼" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "éµç›¤çš„縮放è¯çµæŒ‰éµä»£æ›¿æ»‘鼠的縮放調整,當放開éµç›¤è¯çµæŒ‰éµä¹‹å¾Œï¼Œæœƒè‡ªå‹•關閉縮放調整。" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "é…ç½®ä¸¦é–‹å§‹è½‰æ›æ‰€æœ‰è¦–窗" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "é…置並開始轉æ›è¦–窗群組" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "é…置和開始轉æ›è¦–窗" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "在目å‰è¼¸å‡ºé…置並開始轉æ›è¦–窗" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "在所有的輸出è£ç½®ä¸Š" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "在目å‰è¼¸å‡ºè£ç½®ä¸Š" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "覆蓋圖示" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "縮放視窗時覆蓋圖示" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "調整比例" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "縮放視窗" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "縮放速度" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "縮放時間間隔" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "視窗縮放" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "å‡å¦‚已使用多個輸出è£ç½®æ™‚ï¼Œå‰‡é¸æ“‡åœ¨å“ªå€‹è¦–窗中縮放" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "視窗間隔" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "é–“è·" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "åœç•™åœ¨è¦–窗上多久 (毫秒) å¾Œåœæ­¢èª¿æ•´æ¯”例模å¼" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "縮放模å¼ä¸‹æ‡‰è©²ç¸®æ”¾çš„視窗類型" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "在這個應用程å¼ä¸­è‡ªå‹•開啟螢幕擷å–" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "目錄" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "å•Ÿç”¨çŸ©åž‹é¸æ“‡æ“·å–螢幕" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "啟動的應用程å¼" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "將螢幕擷å–çš„å½±åƒæ”¾ç½®åœ¨é€™å€‹ç›®éŒ„下" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "螢幕擷å–" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "螢幕擷å–外掛" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg 圖檔載入器" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "亮度比例" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "飽和度比例" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "應用程å¼åˆ‡æ›å™¨" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "自動輪æµè½‰æ›" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "æåˆ°æœ€ä¸Šå±¤" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "å°‡é¸å–視窗æåˆ°æœ€ä¸Šå±¤" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "切æ›è¦–çª—æ™‚æ¡Œé¢æ‡‰ç¸®å°çš„è·é›¢" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "圖示" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "最å°åŒ–" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "䏋䏀個颿¿" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "下一個視窗" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "下一個視窗(全部視窗)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "下一個視窗(沒有彈出)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "看ä¸åˆ°åˆ‡æ›å™¨æ™‚快顯切æ›å™¨ï¼Œä¸¦é¸å–下一個視窗" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "看ä¸åˆ°åˆ‡æ›å™¨æ™‚快顯切æ›å™¨ï¼Œä¸¦å¾žæ‰€æœ‰è¦–窗é¸å–下一個視窗" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "看ä¸åˆ°åˆ‡æ›å™¨æ™‚快顯切æ›å™¨ï¼Œä¸¦é¸å–上一個視窗" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "看ä¸åˆ°åˆ‡æ›å™¨æ™‚快顯切æ›å™¨ï¼Œä¸¦å¾žæ‰€æœ‰è¦–窗é¸å–上一個視窗" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "ä¸Šä¸€å€‹é¢æ¿" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "上一個視窗" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "上一個視窗(全部視窗)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "上一個視窗(沒有彈出)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "ç•¶åˆ‡æ›æ™‚äº¤æ›æ‰€é¸æ“‡çš„視窗" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "é¸å–ä¸‹ä¸€å€‹è¦–çª—é¢æ¿æ¨£å¼" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "é¸å–下一個視窗ä¸è¦é¡¯ç¤ºæç¤ºè¦–窗" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "é¸å–ä¸Šä¸€å€‹è¦–çª—é¢æ¿æ¨£å¼" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "é¸å–上一個視窗時ä¸è¦é¡¯ç¤ºå‡ºæç¤ºè¦–窗" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "顯示圖示於縮圖æ—" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "顯示最å°åŒ–的視窗" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "切æ›é€Ÿåº¦" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "åˆ‡æ›æ™‚é–“é–“éš”" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "切æ›è¦–窗" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "在切æ›ç•¶ä¸­è¦é¡¯ç¤ºè¦–窗" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "æä¾›YV12色彩空間的支æ´" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "å½±åƒæ’­æ”¾" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "å½±åƒæ’­æ”¾" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12色彩空間" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "新增線" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "新增點" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "新增水波特效到ä¸åŒçš„æ¡Œé¢å‹•作" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "æ¯æ»´é›¨ä¹‹é–“çš„å»¶é² (毫秒)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "啟用指標水波特效" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "ç·š" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "å移比例" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "點" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "下雨延é²" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "標題波紋" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "切æ›ä¸‹é›¨" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "切æ›ä¸‹é›¨ç‰¹æ•ˆ" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "切æ›é›¨åˆ·" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "切æ›é›¨åˆ·æ•ˆæžœ" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "水波特效" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "æ°´æ³¢å移比例" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "視窗標題的波紋效果" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "定焦特效" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "定焦視窗特效" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "視窗定焦" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "摩擦力" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "格線視窗" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "格線解æžåº¦" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "視窗åå‘å¸é™„" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "讓視窗晃動" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "映射特效" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "映射視窗特效" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "映射視窗" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "最大化特效" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "æœ€å°æ ¼ç·šå¤§å°" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "最å°é ‚點格線大å°" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "移動視窗" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "晃動" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "åå‘å¸é™„" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "視窗å¸é™„" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "彈簧摩擦力" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "彈簧 K 值" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "彈簧常數" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "切æ›è¦–窗å¸é™„" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "é‡å°æ–擺視窗特效使用彈簧模å¼" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "頂點格線解æžåº¦" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "è¦–çª—å®šç„¦æ™‚æ–æ“ºè¦–窗" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "抓å–è¦–çª—æ™‚æ–æ“ºè¦–窗" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "è¦–çª—æ˜ å°„æ™‚æ–æ“ºè¦–窗" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "ç§»å‹•è¦–çª—æ™‚æ–æ“ºè¦–窗" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "è¦–çª—æœ€å¤§åŒ–å’Œè§£é™¤æœ€å¤§åŒ–æ™‚å•Ÿç”¨æ–æ“ºç‰¹æ•ˆ" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "æ–æ“ºè¦–窗" #, fuzzy #~ msgid "Command line 0" #~ msgstr "指令行 10" #, fuzzy #~ msgid "Run command 0" #~ msgstr "執行指令 10" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "èž¢å¹•æ“·å–æŒ‡ä»¤è¡Œ" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "èž¢å¹•æ“·å–æŒ‡ä»¤è¡Œ" #~ msgid "Filter Linear" #~ msgstr "ç·šæ€§éŽæ¿¾å™¨" #, fuzzy #~ msgid "Use linear filter when zoomed in" #~ msgstr "åœ¨æ”¾å¤§æ™‚ä½¿ç”¨ç·šæ€§éŽæ¿¾å™¨" #~ msgid "Zoom Desktop" #~ msgstr "縮放桌é¢" #~ msgid "Zoom In" #~ msgstr "放大" #~ msgid "Zoom Out" #~ msgstr "縮å°" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "放大" #~ msgid "Zoom Speed" #~ msgstr "縮放速度" #~ msgid "Zoom Timestep" #~ msgstr "縮放時間間隔" #~ msgid "Zoom and pan desktop cube" #~ msgstr "縮放和平移桌é¢ç«‹æ–¹é«”" #~ msgid "Zoom factor" #~ msgstr "縮放å€çއ" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "放大" #~ msgid "Decrease window opacity" #~ msgstr "é™ä½Žè¦–窗ä¸é€æ˜Žåº¦" #~ msgid "Increase window opacity" #~ msgstr "æé«˜è¦–窗ä¸é€æ˜Žåº¦" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "視窗間隔" #~ msgid "Background Images" #~ msgstr "背景圖案" #~ msgid "Background images" #~ msgstr "背景圖案" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "將視窗放到立方體" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Page Down" #, fuzzy #~ msgid "Plane Left" #~ msgstr "往左旋轉" #, fuzzy #~ msgid "Plane Right" #~ msgstr "往峿—‹è½‰" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Page Up" #, fuzzy #~ msgid "Plane down" #~ msgstr "放置視窗" #, fuzzy #~ msgid "Plane left" #~ msgstr "往左旋轉" #, fuzzy #~ msgid "Plane right" #~ msgstr "往峿—‹è½‰" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane up" #~ msgstr "Page Up" #~ msgid "Open window menu" #~ msgstr "開啟視窗功能表" #~ msgid "Dock" #~ msgstr "é»åˆ" #~ msgid "Toolbar" #~ msgstr "工具列" #~ msgid "Menu" #~ msgstr "功能表" #~ msgid "Utility" #~ msgstr "公用程å¼" #~ msgid "Splash" #~ msgstr "開頭顯示畫é¢" #~ msgid "Dialog" #~ msgstr "å°è©±æ–¹å¡Š" #~ msgid "DropdownMenu" #~ msgstr "DropdownMenu" #~ msgid "PopupMenu" #~ msgstr "PopupMenu" #~ msgid "Tooltip" #~ msgstr "工具æç¤º" #~ msgid "Notification" #~ msgstr "通知" #~ msgid "Combo" #~ msgstr "組åˆ" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "ModalDialog" #~ msgid "Fullscreen" #~ msgstr "全螢幕" #~ msgid "Unknown" #~ msgstr "未知的" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command10 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command1 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command10 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command11 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command2 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command3 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command4 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command5 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command6 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command7 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command8 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command9 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #, fuzzy #~ msgid "" #~ "Add line (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Add point (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Advance to next slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "亮度比例" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "ä¸é€æ˜Žåº¦æ¯”例" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "飽和度比例" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "飽和度" #, fuzzy #~ msgid "" #~ "Clear (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Close active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Decrease window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "æ¯æ»´é›¨ä¹‹é–“çš„å»¶é² (毫秒)" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "切æ›è¦–çª—æ™‚æ¡Œé¢æ‡‰ç¸®å°çš„è·é›¢" #~ msgid "Do not modify" #~ msgstr "ä¸è¦ä¿®æ”¹" #, fuzzy #~ msgid "" #~ "Draw using tool (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "投影 X 軸åç§»" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "投影 Y 軸åç§»" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "投影åŠå¾‘ä¸é€æ˜Žåº¦" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "投影åŠå¾‘" #, fuzzy #~ msgid "" #~ "Enable pointer water effects (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Flip to left viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Flip to right viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "定焦視窗特效 (ç„¡ã€çž¬é–“)" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "é¸å–上一個視窗" #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "摺疊加速 (1.0-20.0)" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "摺疊速度 (0.1-50.0)" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "摺疊時間間隔 (0.1-50.0)" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "ä¿„ç¾…æ–¯è¯é‚¦" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "俄語" #, fuzzy #~ msgid "" #~ "Go back to previous slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Hide all windows and focus desktop (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Increase window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Initiate annotate drawing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Initiate annotate erasing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Initiate clone selection (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Initiate rectangle screenshot (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "æé«˜é¸å®šè¦–窗的時間間隔" #, fuzzy #~ msgid "" #~ "Layout and start transforming all windows (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Layout and start transforming window group (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "在目å‰è¼¸å‡ºé…置並開始轉æ›è¦–窗" #, fuzzy #~ msgid "" #~ "Lower window beneath other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Make window shiver (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "映射視窗特效 (ç„¡ã€çž¬é–“)" #, fuzzy #~ msgid "" #~ "Maximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Maximize active window horizontally (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Maximize active window vertically (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Minimize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "最å°åŒ–速度 (0.1-50.0)" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "最å°åŒ–速度 (0.1-50.0)" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "最å°é ‚點格線大å°" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "è™›æ“¬æ¡Œé¢æ•¸" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "ä¸é€æ˜Žåº¦è®Šæ›´é–“éš”" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "移動視窗的ä¸é€æ˜Žåº¦" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "移動視窗的ä¸é€æ˜Žåº¦" #, fuzzy #~ msgid "" #~ "Open a terminal (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Open window menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "調整視窗比例後在上é¢é‡ç–Šåœ–示" #, fuzzy #~ msgid "" #~ "Plane down (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Plane up (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #~ msgid "Plugins that this must load before" #~ msgstr "在此之å‰å¿…須先載入的外掛程å¼" #~ msgid "Plugins that this requires" #~ msgstr "這時需è¦çš„外掛程å¼" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "看ä¸åˆ°åˆ‡æ›å™¨æ™‚快顯切æ›å™¨ï¼Œä¸¦å¾žæ‰€æœ‰è¦–窗é¸å–下一個視窗" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "看ä¸åˆ°åˆ‡æ›å™¨æ™‚快顯切æ›å™¨ï¼Œä¸¦å¾žæ‰€æœ‰è¦–窗é¸å–下一個視窗" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "看ä¸åˆ°åˆ‡æ›å™¨æ™‚快顯切æ›å™¨ï¼Œä¸¦å¾žæ‰€æœ‰è¦–窗é¸å–上一個視窗" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "看ä¸åˆ°åˆ‡æ›å™¨æ™‚快顯切æ›å™¨ï¼Œä¸¦å¾žæ‰€æœ‰è¦–窗é¸å–上一個視窗" #, fuzzy #~ msgid "" #~ "Pulse effect (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Raise window above other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate left and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate right and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate to viewport (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Rotate with window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "摺疊加速 (1.0-20.0)" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "縮放速度 (0.1-50.0)" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "縮放時間間隔 (0.1-50.0)" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "調整比例速度 (0.1-50.0)" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "調整比例時間間隔 (0.1-50.0)" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "水平虛擬大å°çš„螢幕大å°å€æ•¸" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "垂直虛擬大å°çš„螢幕大å°å€æ•¸" #, fuzzy #~ msgid "" #~ "Select next window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Select previous window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "æŒ‡æ¨™ç§»å‹•éˆæ•度" #~ msgid "Shade resistance (0-100)" #~ msgstr "é®è”½é˜»åŠ› (0-100)" #, fuzzy #~ msgid "" #~ "Show Run Application dialog (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Show the main menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "視窗間隔" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "彈簧摩擦力" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "彈簧常數" #, fuzzy #~ msgid "" #~ "Start Rotation (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Start moving window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Start resizing window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "調整比例速度 (0.1-50.0)" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "調整比例時間間隔 (0.1-50.0)" #, fuzzy #~ msgid "" #~ "Take a screenshot (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Take a screenshot of a window (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "æè³ªç¯©é¸ (å¿«ã€å¥½ã€æœ€ä½³)" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "èž¢å¹•é‡æ–°æç¹ªçš„速率 (次數/ç§’)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "åœç•™åœ¨è¦–窗上多久 (毫秒) å¾Œåœæ­¢èª¿æ•´æ¯”例模å¼" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "逾時多久需翻轉檢視å€" #, fuzzy #~ msgid "" #~ "Toggle active window maximized (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized horizontally (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized vertically (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Toggle active window shaded (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Toggle rain effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Toggle use of slow animations (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Toggle window snapping (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Toggle wiper effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #~ msgid "USe linear filter when zoomed in" #~ msgstr "åœ¨æ”¾å¤§æ™‚ä½¿ç”¨ç·šæ€§éŽæ¿¾å™¨" #, fuzzy #~ msgid "" #~ "Unfold cube (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Unmaximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "頂點格線解æžåº¦" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "æ°´æ³¢å移比例" #, fuzzy #~ msgid "" #~ "Wave effect from window title (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Window 淡出/淡入速度" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Window 淡出/淡入速度" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "應該淡出/淡入的視窗類型" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "應該淡出/淡入的視窗類型" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "應該淡出/淡入的視窗類型" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "應該淡出/淡入的視窗類型" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "應該è¦åœ¨èª¿æ•´æ¯”例模å¼ä¸­èª¿æ•´æ¯”例的視窗類型" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "應該è¦é¡¯ç¤ºåœ¨åˆ‡æ›å™¨ä¸­çš„視窗類型" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "最å°åŒ–時應該轉æ›çš„視窗類型" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "應該淡出/淡入的視窗類型" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "應該è¦åœ¨å®šç„¦æ™‚æ–æ“ºçš„視窗類型" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "應該è¦åœ¨æŠ“å–æ™‚æ–æ“ºçš„視窗類型" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "應該è¦åœ¨æ˜ å°„æ™‚æ–æ“ºçš„視窗類型" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "應該è¦åœ¨ç§»å‹•æ™‚æ–æ“ºçš„視窗類型" #, fuzzy #~ msgid "" #~ "Zoom In (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "" #~ "Zoom Out (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該è¦èµ·å§‹åŒ–調整比例模å¼çš„熱角 (左上角ã€å³ä¸Šè§’ã€å·¦ä¸‹è§’ã€å³ä¸‹è§’)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "縮放速度 (0.1-50.0)" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "縮放時間間隔 (0.1-50.0)" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "縮放å€çއ" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "éš¨è¦–çª—å¾€é¢ %d 旋轉" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "å¾€é¢ %d 旋轉並隨åŒä½œç”¨ä¸­è¦–窗一起旋轉" #~ msgid "Rotate To Face %d" #~ msgstr "å¾€é¢ %d 旋轉" #~ msgid "Rotate to face %d" #~ msgstr "å¾€é¢ %d 旋轉" #~ msgid "Rotate To Face %d with Window" #~ msgstr "éš¨è¦–çª—å¾€é¢ %d 旋轉" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "å¾€é¢ %d 旋轉並隨åŒä½œç”¨ä¸­è¦–窗一起旋轉" #~ msgid "Command line %d" #~ msgstr "指令行 %d" #~ msgid "Command line to be executed in shell when run_command%d is invoked" #~ msgstr "啟用 run_command%d 時è¦åœ¨å¤–åœç¨‹åºä¸­åŸ·è¡Œçš„æŒ‡ä»¤è¡Œ" #~ msgid "Run command %d" #~ msgstr "執行指令 %d" #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command%d" #~ msgstr "啟用時將執行經 command%d 識別之外åœç¨‹åºæŒ‡ä»¤çš„æŒ‰éµçµ„åˆ" #~ msgid "Move Window Types" #~ msgstr "移動視窗類型" #~ msgid "Corners" #~ msgstr "è§’" #~ msgid "Focus window when mouse moves over them" #~ msgstr "在滑鼠移動到上方時啟用定焦視窗" #~ msgid "Initiate All Windows" #~ msgstr "起始化全部視窗" #~ msgid "Initiate Keyboard Window Move" #~ msgstr "啟始以éµç›¤ç§»å‹•視窗" #~ msgid "Initiate Keyboard Window Resize" #~ msgstr "啟始以éµç›¤èª¿æ•´è¦–窗大å°" #~ msgid "Initiate Window Switcher" #~ msgstr "起始化視窗切æ›å™¨" #~ msgid "Modifier to show switcher for all windows" #~ msgstr "å¯ä½¿æ‰€æœ‰è¦–窗顯示切æ›å™¨çš„修改éµ" #~ msgid "Return from scale view" #~ msgstr "從比例檢視返回" #~ msgid "Show switcher" #~ msgstr "顯示切æ›å™¨" #~ msgid "Sloppy Focus" #~ msgstr "寬鬆定焦" #~ msgid "Start moving window using keyboard" #~ msgstr "開始使用éµç›¤ç§»å‹•視窗" #~ msgid "Terminate" #~ msgstr "終止" #~ msgid "Water effect on system beep" #~ msgstr "ç³»çµ±ç™¼å‡ºå—¶è²æ™‚啟用水波特效" #~ msgid "" #~ "Window types that should be fading (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "æ‡‰è©²è¦æ·¡å‡ºçš„視窗類型 (桌é¢ã€åœé§ã€å·¥å…·åˆ—ã€åŠŸèƒ½è¡¨ã€å…¬ç”¨ç¨‹å¼ã€é–‹é ­é¡¯ç¤ºã€å°è©±" #~ "方塊ã€å¼·åˆ¶å›žæ‡‰å°è©±æ–¹å¡Šã€ä¸€èˆ¬ã€å…¨èž¢å¹•ã€æœªçŸ¥çš„)" #~ msgid "" #~ "Window types that should be transformed when minimized (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgstr "" #~ "應該è¦åœ¨æœ€å°åŒ–時轉æ›çš„視窗類型 (桌é¢ã€åœé§ã€å·¥å…·åˆ—ã€åŠŸèƒ½è¡¨ã€å…¬ç”¨ç¨‹å¼ã€é–‹é ­" #~ "顯示ã€å°è©±æ–¹å¡Šã€å¼·åˆ¶å›žæ‡‰å°è©±æ–¹å¡Šã€ä¸€èˆ¬ã€å…¨èž¢å¹•ã€æœªçŸ¥çš„)" #~ msgid "" #~ "Window types that should scaled in scale mode (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該è¦åœ¨èª¿æ•´æ¯”例模å¼ä¸­èª¿æ•´æ¯”例的視窗類型 (桌é¢ã€åœé§ã€å·¥å…·åˆ—ã€åŠŸèƒ½è¡¨ã€å…¬ç”¨" #~ "程å¼ã€é–‹é ­é¡¯ç¤ºã€å°è©±æ–¹å¡Šã€å¼·åˆ¶å›žæ‡‰å°è©±æ–¹å¡Šã€ä¸€èˆ¬ã€å…¨èž¢å¹•ã€æœªçŸ¥çš„)" #~ msgid "" #~ "Window types that should shown in switcher (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該è¦é¡¯ç¤ºåœ¨åˆ‡æ›å™¨ä¸­çš„視窗類型 (桌é¢ã€åœé§ã€å·¥å…·åˆ—ã€åŠŸèƒ½è¡¨ã€å…¬ç”¨ç¨‹å¼ã€é–‹é ­" #~ "顯示ã€å°è©±æ–¹å¡Šã€å¼·åˆ¶å›žæ‡‰å°è©±æ–¹å¡Šã€ä¸€èˆ¬ã€å…¨èž¢å¹•ã€æœªçŸ¥çš„)" #~ msgid "" #~ "Window types that should wobble when focused (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該è¦åœ¨å®šç„¦æ™‚æ–æ“ºçš„視窗類型 (桌é¢ã€åœé§ã€å·¥å…·åˆ—ã€åŠŸèƒ½è¡¨ã€å…¬ç”¨ç¨‹å¼ã€é–‹é ­é¡¯" #~ "示ã€å°è©±æ–¹å¡Šã€å¼·åˆ¶å›žæ‡‰å°è©±æ–¹å¡Šã€ä¸€èˆ¬ã€å…¨èž¢å¹•ã€æœªçŸ¥çš„)" #~ msgid "" #~ "Window types that should wobble when grabbed (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該è¦åœ¨æŠ“å–æ™‚æ–æ“ºçš„視窗類型 (桌é¢ã€åœé§ã€å·¥å…·åˆ—ã€åŠŸèƒ½è¡¨ã€å…¬ç”¨ç¨‹å¼ã€é–‹é ­é¡¯" #~ "示ã€å°è©±æ–¹å¡Šã€å¼·åˆ¶å›žæ‡‰å°è©±æ–¹å¡Šã€ä¸€èˆ¬ã€å…¨èž¢å¹•ã€æœªçŸ¥çš„)" #~ msgid "" #~ "Window types that should wobble when mapped (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該è¦åœ¨æ˜ å°„æ™‚æ–æ“ºçš„視窗類型 (桌é¢ã€åœé§ã€å·¥å…·åˆ—ã€åŠŸèƒ½è¡¨ã€å…¬ç”¨ç¨‹å¼ã€é–‹é ­é¡¯" #~ "示ã€å°è©±æ–¹å¡Šã€å¼·åˆ¶å›žæ‡‰å°è©±æ–¹å¡Šã€ä¸€èˆ¬ã€å…¨èž¢å¹•ã€æœªçŸ¥çš„)" #~ msgid "" #~ "Window types that should wobble when moved (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該è¦åœ¨ç§»å‹•æ™‚æ–æ“ºçš„視窗類型 (桌é¢ã€åœé§ã€å·¥å…·åˆ—ã€åŠŸèƒ½è¡¨ã€å…¬ç”¨ç¨‹å¼ã€é–‹é ­é¡¯" #~ "示ã€å°è©±æ–¹å¡Šã€å¼·åˆ¶å›žæ‡‰å°è©±æ–¹å¡Šã€ä¸€èˆ¬ã€å…¨èž¢å¹•ã€æœªçŸ¥çš„)" #~ msgid "Wobble effect on system beep" #~ msgstr "ç³»çµ±ç™¼å‡ºå—¶è²æ™‚å•Ÿç”¨æ–æ“ºç‰¹æ•ˆ" compiz-0.9.11+14.04.20140409/po/or.po0000644000015301777760000036545712321343002017114 0ustar pbusernogroup00000000000000# Hindi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Prasanth Kurian # msgid "" msgstr "" "Project-Id-Version: Oriya\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2007-12-16 01:13+0530\n" "Last-Translator: jayashree pujari \n" "Language-Team: gisti \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "X-Poedit-Language: Oriya\n" "X-Poedit-Country: India\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "ଡେସà­à¬•ଟପ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "ଉଇଣà­à¬¡à­‹ ପà­à¬°à¬¬à¬¨à­à¬§à¬¨" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "କମà­à¬ªà¬¿à¬œ" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "କିଛିନାହିà¬" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "ମାପକ" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "ସରà­à¬¬à¬¾à¬§à¬¿à¬• କର" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠଦିଗବଳୀଯଭାବରେ ସରà­à¬¬à¬¾à¬§à¬¿à¬• କର" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "ଦଣà­à¬¡à¬°à­à¬ªà¬°à­‡ ଉଇଣà­à¬¡à­‹à¬•ୠସରà­à¬¬à¬¾à¬§à¬¿à¬• କର" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "ନà­à¬¯à­à¬¨à¬¤à¬®à¬¹à­‹à¬‡à¬¥à¬¿à¬¬à¬¾" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "ସà­à¬¬à¬¤à¬ƒ-ଉତà­à¬¥à¬¾à¬¨" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "ଉଇଣà­à¬¡à­‹ ମେନà­" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "ଗୋଟିଠଉଇଣà­à¬¡à­‹ ଶୀରà­à¬·à¬• ବାରରେ ମାଉସ ଚକà­à¬°à¬•ୠଘà­à¬°à¬¾à¬‡à¬¬à¬¾ ବେଳେ କରାୟିବାକୠଥିବା କାରà­à­Ÿà­à¬¯" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "ଅସà­à¬ªà¬·à­à¬Ÿ ପà­à¬°à¬•ାର" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "ମେଟାସିଟି ଥିମ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹ ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "ମେଟାସିଟି ଥିମ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹ ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ଛାଯା" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "ମେଟାସିଟି ଥିମ ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "ମେଟାସିଟି ଥିମ ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ଛାଯା" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "ମେଟାସିଟି ଥିମ ଅଳଂକରଣଗà­à¬¡à¬¿à¬• ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹ ପାଇଠଉପୟୋଗ କରାୟିବାକୠଥିବା ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "ମେଟାସିଟି ଥିମ ଅଳଂକରଣଗà­à¬¡à¬¿à¬• ପାଇଠଉପୟୋଗ କରାୟିବାକୠଥିବା ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "ମେଟାସିଟି ଥିମ ଅଳଙà­à¬•ରଣଗà­à¬¡à¬¿à¬• ସହିତ ଛାଯା ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹ ଅସà­à¬¬à¬šà­à¬›à¬°à­ ସà­à¬¬à¬šà­à¬› ପରà­à­Ÿà­à¬¯à¬¨à­à¬¤ " #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "ମେଟାସିଟି ଥିମ ଅଳଙà­à¬•ରଣଗà­à¬¡à¬¿à¬• ସହିତ ଛାଯା, ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹ ଅସà­à¬¬à¬šà­à¬›à¬°à­ ସà­à¬¬à¬šà­à¬› ପରà­à­Ÿà­à¬¯à¬¨à­à¬¤ " #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "ଶୀରà­à¬·à¬• ବାର ମାଉସ ଚକà­à¬°à¬° କାରà­à­Ÿà­à¬¯" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "ଉଇଣà­à¬¡à­‹ ଅଳଙà­à¬•ରଣଗà­à¬¡à¬¿à¬• ପାଇଠଉପୟୋଗ ହୋଉଥିବା ଅସà­à¬ªà¬·à­à¬Ÿà¬¤à¬¾à¬° ପà­à¬°à¬•ାର" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "ମେଟାସିଟି ଥିମ ଉପୟୋଗକର" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "ଉଇଣà­à¬¡à­‹ ଅଳଙà­à¬•ରଣଗà­à¬¡à¬¿à¬•ୠଅଂକନ କରିବା ବେଳେ ମେଟାସିଟି ଥିମ ଉପୟୋଗ କର" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "ଉଇଣà­à¬¡à­‹ ବନà­à¬¦à¬•ର" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "ଅଣ-ସରà­à¬¬à¬¾à¬§à¬¿à¬• ଉଇଣà­à¬¡à­‹" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠସରà­à¬¬à¬¾à¬§à¬¿à¬• କର" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠନà­à¬¯à­à¬¨à¬¤à¬® କର" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "ବà­à¬¯à¬¾à¬–à­à¬¯à¬¾ କର" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "ରଙà­à¬— ପà­à¬°à¬£ ବà­à¬¯à¬¾à¬–à­à¬¯à¬¾à¬•ର" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "ଆଘାତ ରଙà­à¬—କୠବà­à¬¯à¬¾à¬–à­à¬¯à¬¾ କର" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "ପà­à¬²à¬—ଇନ ବà­à¬¯à¬¾à¬–à­à¬¯à¬¾à¬•ର" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "ପରିଷà­à¬•ାରକର" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "ଅଂକନକର" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "ସାଧନ ଉପୟୋଗକରି ଅଂକନକର" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "ବà­à¬¯à¬¾à¬–à­à¬¯à¬¾ ପାଇଠରଙà­à¬— ପà­à¬°à¬£à¬•ର" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "ପà­à¬°à¬¾à¬°à¬®à­à¬­ କର" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "ଚିତà­à¬°à¬¾à¬™à­à¬•ନ ବà­à¬¯à¬¾à¬–à­à¬¯à¬¾ ପà­à¬°à¬¾à¬°à¬®à­à¬­à¬•ର" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "ଲିଭାଇବା ବà­à¬¯à¬¾à¬–à­à¬¯à¬¾ ଆରମà­à¬­à¬•ର" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "ଲିଭାଇବା ପà­à¬°à¬¾à¬°à¬®à­à¬­ କର" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "ରେଖା ଦୈରà­à¬˜à­à¬¯" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "ବà­à¬¯à¬¾à¬–à­à¬¯à¬¾à¬—à­à¬¡à¬¿à¬• ପାଇଠରେଖା ଓସାର" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "ବà­à¬¯à¬¾à¬–à­à¬¯à¬¾à¬—à­à¬¡à¬¿à¬• ପାଇଠଆଘାତ ରଙà­à¬—" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "ଆଘାତ ଓସାର" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "ବà­à¬¯à¬¾à¬–à­à¬¯à¬¾à¬—à­à¬¡à¬¿à¬• ପାଇଠଆଘାତ ରଙà­à¬—" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xଦà­à¬¬à¬¿à¬°à­ˆà¬–ୀକ" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "ଆଲà­à¬«à¬¾ ଅସà­à¬«à¬·à­à¬Ÿ" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "ଆଲà­à¬«à¬¾ ଅସà­à¬ªà¬·à­à¬Ÿ ଉଇଣà­à¬¡à­‹" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "ଅସà­à¬ªà¬·à­à¬Ÿ ଫିଲà­à¬Ÿà¬°" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "ଅସà­à¬ªà¬·à­à¬Ÿ ଶୋଷଣ" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "ଅସà­à¬ªà¬·à­à¬Ÿ ସଂପୂରà­à¬£à­à¬£ ମିଶà­à¬°à¬£" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "ଅସà­à¬ªà¬·à­à¬Ÿ ଗତି" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "ଅସà­à¬ªà¬·à­à¬Ÿ ଉଇଣà­à¬¡à­‹" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "ଉଇଣà­à¬¡à­‹à¬° ସà­à¬¬à¬šà­à¬› ଅଂଶଗà­à¬¡à¬¿à¬• ପଛର ଅସà­à¬ªà¬·à­à¬Ÿà¬¤à¬¾" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "ଅସà­à¬ªà¬·à­à¬Ÿ ସଂପୂରà­à¬£à­à¬£ ମିଶà­à¬°à¬£" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "ଅସà­à¬ªà¬·à­à¬Ÿ ଉଇଣà­à¬¡à­‹" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "ଅସà­à¬ªà¬·à­à¬Ÿ ଉଇଣà­à¬¡à­‹ ୟାହାର ଲକà­à¬·à­à¬¯ ନାହିà¬" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "ଅନà­à¬¯ ଉଇଣà­à¬¡à­‹ ଦà­à¬¬à¬¾à¬°à¬¾ ଅନà­à¬§à¬•ାରମଯ କରାୟାଇଥିବା ସà­à¬•à­à¬°à¬¿à¬¨ ଅଂଚଳଗà­à¬¡à¬¿à¬•ର ଅସà­à¬ªà¬·à­à¬Ÿ କରିବାକୠଅକà­à¬·à¬®à¬•ର" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "ଅସà­à¬ªà¬·à­à¬Ÿà¬•ରିବା ପାଇଠଉପୟୋଗ ହେଉଥିବା ଫିଲà­à¬Ÿà¬° ପଦà­à¬§à¬¤à¬¿ " #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "ଲକà­à¬·à­à¬¯ ଅସà­à¬ªà¬·à­à¬Ÿ" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "ଲକà­à¬·à­à¬¯ ଅସà­à¬ªà¬·à­à¬Ÿ ଉଇଣà­à¬¡à­‹" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "ଗୌସିଆନ" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "ଗୌସିଆନ ବà­à¬¯à¬¾à¬¸à¬¾à¬°à­à¬¦à­à¬§" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "ଗୌସିଆନ ଶକà­à¬¤à¬¿" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "ଗୌସିଆନ ବà­à¬¯à¬¾à¬¸à¬¾à¬°à­à¬¦à­à¬§" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "ଗୌସିଆନ ଶକà­à¬¤à¬¿" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "ମିପୠମà­à¬¯à¬¾à¬ª" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "ମିପୠମà­à¬¯à¬¾à¬ª LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "ମିପà­â€Œà¬®à­à¬¯à¬¾à¬ª ବିବରଣୀର-ସà­à¬¤à¬°" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "ପଲà­à¬¸(ଗତି)" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "ପଲà­à¬¸ ପà­à¬°à¬­à¬¾à¬¬" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "ଉଇଣà­à¬¡à­‹ ଅସà­à¬ªà¬·à­à¬Ÿ ଗତି" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ଲକà­à¬·à­à¬¯ ଅସà­à¬ªà¬·à­à¬Ÿ ଦà­à¬¬à¬¾à¬°à¬¾ ପà­à¬°à¬­à¬¾à¬¬à¬¿à¬¤ ହେବା ଉଚିତ" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ଅଲà­à¬«à¬¾ ଅସà­à¬ªà¬·à­à¬Ÿà¬¤à¬¾ ଡିଫଲà­à¬Ÿà¬°à­‡ ଉପୟୋଗ କରିବା ଉଚିତ" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "କà­à¬²à­‹à¬¨ ଆଉଟପà­à¬Ÿ" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "କà­à¬²à­‹à¬¨ ମନୋନଯନ ପà­à¬°à¬¾à¬°à¬®à­à¬­ କର" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "ଆଉଟପà­à¬Ÿ କà­à¬²à­‹à¬¨ ପରିଚାଳକ" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ 0 ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­§ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­§à­¦ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­§à­§ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­¨ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­© ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­ª ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ୫ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­¬ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­­ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­® ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­¯ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ 0 ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­§ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­§à­¦ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­§à­§ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­¨ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­© ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­ª ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ୫ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­¬ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­­ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­® ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­¯ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ 0 ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­§ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­§à­¦ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­§à­§ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­¨ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­© ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­ª ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ୫ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­¬ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­­ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­® ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "ଗୋଟିଠକି-ବନà­à¬§à¬¨ ୟାହାକି ୟେବେ ଡକାୟାà¬, ଆଦେଶ à­¯ ଦà­à¬¬à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା ସେଲ ଆଦେଶକୠଚଳାଇବ " #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "ଆଦେଶ ରେଖା à­§" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "ଆଦେଶ ରେଖା à­§à­¦ " #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "ଆଦେଶ ରେଖା à­§à­§ " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "ଆଦେଶ ରେଖା à­§" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "ଆଦେଶ ରେଖା à­¨" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "ଆଦେଶ ରେଖା à­©" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "ଆଦେଶ ରେଖା à­ª" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "ଆଦେଶ ରେଖା à­«" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "ଆଦେଶ ରେଖା à­¬ " #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "ଆଦେଶ ରେଖା à­­" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "ଆଦେଶ ରେଖା à­®" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "ଆଦେଶ ରେଖା à­¯ " #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "ସେଲରେ କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହେବାକୠଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ 0 ଡକାୟାଇଥାଠ" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "ସେଲରେ କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହେବାକୠଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୧ ଡକାୟାଇଥାଠ" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "ସେଲରେ କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହେବାକୠଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ0୧୦ଡକାୟାଇଥାଠ" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "ସେଲରେ କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହେବାକୠଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୧୧ ଡକାୟାଇଥାଠ" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "ସେଲରେ କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହେବାକୠଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୨ ଡକାୟାଇଥାଠ" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "ସେଲରେ କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହେବାକୠଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୩ ଡକାୟାଇଥାଠ" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "ସେଲରେ କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହେବାକୠଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୪ ଡକାୟାଇଥାଠ" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "ସେଲରେ କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହେବାକୠଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୫ ଡକାୟାଇଥାଠ" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "ସେଲରେ କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହେବାକୠଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୬ ଡକାୟାଇଥାଠ" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "ସେଲରେ କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହେବାକୠଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୭ ଡକାୟାଇଥାଠ" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "ସେଲରେ କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହେବାକୠଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୮ ଡକାୟାଇଥାଠ" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "ସେଲରେ କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହେବାକୠଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୯ ଡକାୟାଇଥାଠ" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "ଆଦେଶ" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "ଚଳାଅ ଆଦେଶ à­§" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "ଚଳାଅ ଆଦେଶ à­§à­¦" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "ଚଳାଅ ଆଦେଶ à­§à­§" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "ଚଳାଅ ଆଦେଶ à­§" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "ଚଳାଅ ଆଦେଶ à­¨" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "ଚଳାଅ ଆଦେଶ à­©" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "ଚଳାଅ ଆଦେଶ à­ª" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "ଚଳାଅ ଆଦେଶ à­«" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "ଚଳାଅ ଆଦେଶ à­¬" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "ଚଳାଅ ଆଦେଶ à­­" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "ଚଳାଅ ଆଦେଶ à­®" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "ଚଳାଅ ଆଦେଶ à­¯" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "ସକà­à¬°à¬¿à¬¯ ପà­à¬²à¬—ଇନଗà­à¬¡à¬¿à¬•" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "ପୂରà­à¬£à­à¬£à¬¸à­à¬•à­à¬°à¬¿à¬¨ ଉଇଣà­à¬¡à­‹à¬° ଅଂକନକୠସà­à¬¬à­€à¬•ୃତି ଦିଅ, ଅଫà­à¬¸à­à¬•à­à¬°à¬¿à¬¨ ପିକà­à¬¸à¬®à­à¬¯à¬¾à¬ªà¬—à­à¬¡à¬¿à¬•ୠପà­à¬¨à¬ƒà¬¨à¬¿à¬°à­à¬¦à­à¬¦à­‡à¬¶à¬¿à¬¤ ହେବ ନାହିà¬" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "ଶà­à¬°à¬¬à¬£à­Ÿà­‹à¬—à­à¬¯ ଘଣà­à¬Ÿà¬¾" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "ଶà­à¬°à¬¬à¬£à­Ÿà­‹à¬—à­à¬¯ ସିଷà­à¬Ÿà¬® ବିପୠଶବà­à¬¦" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "ସà­à¬¬à¬¤à¬ƒ-ଉତà­à¬¥à¬¾à¬¨" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "ସà­à¬¬à¬¤à¬ƒ-ଉତà­à¬¥à¬¾à¬¨ ବିଳମà­à¬¬" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "ଆଉଟପà­à¬Ÿ ଉପକରଣର ସà­à¬¬à¬¯à¬‚ଚାଳିତ ଚିହà­à¬¨à¬Ÿà¬•ରଣ" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "ରିଫà­à¬°à­‡à¬¸ ଦରର ସà­à¬¬à¬¯à¬‚ଚାଳିତ ଚିହà­à¬¨à¬Ÿà¬•ରଣ" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "ଉତà­à¬¤à¬®" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ଲକà­à¬·à­à¬¯ କରିବା ପାଇଠକà­à¬²à¬¿à¬•କର" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "ଉଇଣà­à¬¡à­‹à¬°à­‡ କà­à¬²à¬¿à¬•, ଇନପà­à¬Ÿ ଲକà­à¬·à­à¬¯ à¬à¬¹à¬¾à¬‰à¬ªà¬°à¬•ୠଘà­à¬žà­à¬šà¬¾à¬ ।" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠବନà­à¬¦à¬•ର" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "ଡିଫଲà­à¬Ÿ ଆଇକନ" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "ଡିଫଲà­à¬Ÿ ଉଇଣà­à¬¡à­‹ ଆଇକନ ଚିତà­à¬°" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "ଡେସà­à¬•ଟପ ଘନକà­à¬·à­‡à¬¤à­à¬°" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "ଆଉଟପà­à¬Ÿà¬—à­à¬¡à¬¿à¬•ୠଚିହà­à¬¨à¬Ÿà¬•ର" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "ରିଫà­à¬°à­‡à¬¸ ଦର ଚିହà­à¬¨à¬Ÿà¬•ର" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "ଶୀଘà­à¬°" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "ଲକà­à¬·à­à¬¯ ବାଧାଦେବା ଉଇଣà­à¬¡à­‹" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "ଲକà­à¬·à­à¬¯ ବାଧାଦେବା ଉଇଣà­à¬¡à­‹" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "ଲକà­à¬·à­à¬¯ ବାଧାଦେବା ଉଇଣà­à¬¡à­‹" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "ସାଧାରଣ ବିକଳà­à¬ªà¬—à­à¬¡à¬¿à¬•" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "ସାଧାରଣ କମà­à¬ªà¬¿à¬œ ବିକଳà­à¬ªà¬—à­à¬¡à¬¿à¬•" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "ଉତà­à¬¤à¬®" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "ବାଦଦେବା ଟାସà­à¬•ବାର ଉଇଣà­à¬¡à­‹à¬•ୠଲà­à¬šà¬¾à¬…" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "ସବୠଉଇଣà­à¬¡à­‹à¬•ୠଲà­à¬šà¬¾à¬… à¬à¬¬à¬‚ ଡେସà­à¬•ଟପକୠଲକà­à¬·à­à¬¯à¬•ର" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "ଡେସà­à¬•ଟପ ମୋଡକୠଦେଖାଅ କୠପà­à¬°à¬¬à­‡à¬¶ କରିବା ବେଳେ ଉଇଣà­à¬¡à­‹à¬—à­à¬¡à¬¿à¬•ୠଲà­à¬šà¬¾à¬… ଟାସà­à¬•ବାରରେ ନà­à¬¹à­‡à¬" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "ଦିଗବଳୀଯ କଳà­à¬ªà¬¿à¬¤ ଆକାର" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "ୟେବେ ସରà­à¬¬à¬¾à¬§à¬¿à¬• ହୋଇଥାà¬, ସଂକେତସୂଚନାକୠଅବହେଳାକର" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "ୟେବେ ଉଇଣà­à¬¡à­‹ ସରà­à¬¬à¬¾à¬§à¬¿à¬• ହୋଇଥାଠଆକାର ବୃଦà­à¬§à¬¿à¬•ରିବା à¬à¬¬à¬‚ ଉଦà­à¬¦à­‡à¬¶à­à¬¯ ସଂକେତସୂଚନାକୠଅବହେଳାକର" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "ମନୋନୀତ ଉଇଣà­à¬¡à­‹ ଉତà­à¬¥à¬¾à¬¨ ପୂରà­à¬¬à¬°à­ ବà­à¬¯à¬¬à¬§à¬¾à¬¨" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "ପିଙà­à¬— ସଂଦେଶଗà­à¬¡à¬¿à¬• ମଧà­à¬¯à¬°à­‡ ବà­à¬¯à¬¬à¬§à¬¾à¬¨" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "ଆଲୋକିତକରିବା" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "ବରà­à¬¤à­à¬¤à¬®à¬¾à¬¨ ସକà­à¬°à¬¿à¬¯ ଥିବା ପà­à¬²à¬—ଇନଗà­à¬¡à¬¿à¬•ର ତାଲିକା" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "ଆଉଟପà­à¬Ÿ ଉପକରଣଗà­à¬¡à¬¿à¬•ୠବରà­à¬£à­à¬£à¬¨à¬¾ କରà­à¬¥à¬¿à¬¬à¬¾ ସà­à¬Ÿà­à¬°à¬¿à¬™à­à¬—ଗà­à¬¡à¬¿à¬•ର ତାଲିକା" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "ନିମà­à¬¨à¬¤à¬° ଉଇଣà­à¬¡à­‹" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "ଅନà­à¬¯ ଉଇଣà­à¬¡à­‹ ତଳକୠଉଇଣà­à¬¡à­‹à¬•ୠନିମà­à¬¨à¬¤à¬° କର" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠଦିଗବଳୀଯଭାବରେ ସରà­à¬¬à¬¾à¬§à¬¿à¬• କର" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "ଦଣà­à¬¡à¬°à­à¬ªà¬°à­‡ ଉଇଣà­à¬¡à­‹à¬•ୠସରà­à¬¬à¬¾à¬§à¬¿à¬• କର" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠସରà­à¬¬à¬¾à¬§à¬¿à¬• କର" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଦିଗବଳୀଯ ଭାବରେ ସରà­à¬¬à¬¾à¬§à¬¿à¬• କର" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "ଦଣà­à¬¡à¬°à­‚ପରେ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠସରà­à¬¬à¬¾à¬§à¬¿à¬• କର" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠନà­à¬¯à­à¬¨à¬¤à¬® କର" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "ସାମାନà­à¬¯" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "ଡେସà­à¬•ଟପଗà­à¬¡à¬¿à¬•ର ସଂଖà­à¬¯à¬¾" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "କଳà­à¬ªà¬¿à¬¤ ଡେସà­à¬•ଟପଗà­à¬¡à¬¿à¬•ର ସଂଖà­à¬¯à¬¾" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "ଦଣà­à¬¡à¬°à­‚ପ ଖାଲିକରିବା ଅବଧି ସମଯରେ କେବଳ ସà­à¬•à­à¬°à¬¿à¬¨ ଅପଡେଟଗà­à¬¡à¬¿à¬•ୠକର" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "ଆଉଟପà­à¬Ÿà¬—à­à¬¡à¬¿à¬•" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "ପିଙà­à¬— ବିଳମà­à¬¬" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "କà­à¬²à¬¿à¬•ରେ ଉତà­à¬¥à¬¾à¬¨à¬•ର" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠଉଠାଅ" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "ବà­à¬¯à¬¬à¬§à¬¾à¬¨ ପରେ ମନୋନୀତ ଉଇଣà­à¬¡à­‹à¬•ୠଉତà­à¬¥à¬¾à¬¨ କର" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "ଅନà­à¬¯ ଉଇଣà­à¬¡à­‹ ଗà­à¬¡à¬¿à¬• ଉପରକୠଉଠାଅ" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "ୟେବେ କà­à¬²à¬¿à¬• ହà­à¬ ଉଇଣà­à¬¡à­‹à¬•ୠଉତà­à¬¥à¬¾à¬¨à¬•ର" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "ରିଫà­à¬°à­‡à¬¸ ଦର" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "ଦିଗବଳୀଯ କଳà­à¬ªà¬¿à¬¤ ଆକାର ପାଇଠସà­à¬•à­à¬°à¬¿à¬¨ ଆକାର ଗà­à¬£à¬•" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "ଦଣà­à¬¡à¬°à­‚ପୀ କଳà­à¬ªà¬¿à¬¤ ଆକାର ପାଇଠସà­à¬•à­à¬°à¬¿à¬¨ ଆକାର ଗà­à¬£à¬•" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "ଡେସà­à¬•ଟପ ଦେଖାଅ" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "ଧୀର ଚଳଚà­à¬šà¬¿à¬¤à­à¬° " #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "ସà­à¬«à­à¬°à­à¬¤à­à¬¤à¬¿" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "ସିଙà­à¬• Vଖାଲିକà­" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "ଟେକà­à¬¸à¬Ÿà¬° ଫିଲà­à¬Ÿà¬° କରିବା" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "ଟେକà­à¬¸à¬šà¬° ଫିଲà­à¬Ÿà¬°" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "ଟେକà­à¬¸à¬Ÿà¬° ଫିଲà­à¬Ÿà¬° କରିବା" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "ଦର ୟେଉà¬à¬¥à¬¿à¬°à­‡ ସà­à¬•à­à¬°à¬¿à¬¨ ପà­à¬¨à¬ƒà¬…ଂକିତ ହୋଇଛି (ସମଯ/ସେକେଣà­à¬¡)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "ସରà­à¬¬à¬¾à¬§à¬¿à¬• ହୋଇଥିବା ଉଇଣà­à¬¡à­‹à¬•ୠଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "ଦିଗବଳୀଯଭାବରେ ସରà­à¬¬à¬¾à¬§à¬¿à¬• ହୋଇଥିବା ଉଇଣà­à¬¡à­‹à¬•ୠଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "ଦଣà­à¬¡ ଭାବରେ ସରà­à¬¬à¬¾à¬§à¬¿à¬• ହୋଇଥିବା ଉଇଣà­à¬¡à­‹à¬•ୠଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "ଛାଯାୟà­à¬•à­à¬¤ ଉଇଣà­à¬¡à­‹à¬•ୠଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "ସରà­à¬¬à¬¾à¬§à¬¿à¬• ହୋଇଥିବା ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "ଦିଗବଳୀଯଭାବରେ ସରà­à¬¬à¬¾à¬§à¬¿à¬• ହୋଇଥିବା ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "ଦଣà­à¬¡ ଭାବରେ ସରà­à¬¬à¬¾à¬§à¬¿à¬• ହୋଇଥିବା ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "ଛାଯାୟà­à¬•à­à¬¤ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "ଧୀର ଚଳଚିତà­à¬°à¬—à­à¬¡à¬¿à¬•ର ଉପୟୋଗକୠଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "ଅଣ-ସରà­à¬¬à¬¾à¬§à¬¿à¬• ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "ଅଣ-ପà­à¬¨à¬ƒà¬¨à¬¿à¬°à­à¬¦à­à¬¦à­‡à¬¶à¬¿à¬¤ ପୂରà­à¬£à­à¬£ ସà­à¬•à­à¬°à¬¿à¬¨ ଉଇଣà­à¬¡à­‹" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "ୟେବେ ସà­à¬•à­à¬°à¬¿à¬¨ ରୂପାନà­à¬¤à¬°à¬¿à¬¤ ହୋଇଥାà¬, ବିକà­à¬·à¬¿à¬ªà­à¬¤ ଆଲୋକ ଉପୟୋଗ କର" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "ଦଣà­à¬¡à¬°à­‚ପୀ କଳà­à¬ªà¬¿à¬¤ ଆକାର" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "ଉଇଣà­à¬¡à­‹ ମେନୠବଟନ ବନà­à¬§à¬¨" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "ଉଇଣà­à¬¡à­‹ ମେନୠକି ବନà­à¬§à¬¨" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "ବେଗବରà­à¬¦à­à¬§à¬¨" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "ଚିତà­à¬° ବà­à¬¯à¬¬à¬¸à­à¬¥à¬¾à¬•ର" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "ଘୂରà­à¬£à­à¬£à¬¨à¬•ୠଉପର ମୂହଠଚିତà­à¬°à¬•ୠବà­à¬¯à¬¬à¬¸à­à¬¥à¬¾à¬•ର" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "ପରବରà­à¬¤à­à¬¤à­€ ସà­à¬²à¬¾à¬‡à¬¡à¬•ୠଅଗà­à¬°à¬¸à¬° ହà­à¬…" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "ସà­à¬•ାଇଡୋମ ଚଳନà­à¬¤à¬¿à¬•ର" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "ଘନକà­à¬·à­‡à¬¤à­à¬°à¬•ୠଘୂରà­à¬£à­à¬£à¬¨ କରିବା ବେଳେ ସà­à¬•ାଇଡୋମ ଚଳନà­à¬¤à¬¿à¬•ର" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "ସà­à¬¬à¬¯à¬‚ଚାଳିତ" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "ଘନକà­à¬·à­‡à¬¤à­à¬°à¬° ଉପର à¬à¬¬à¬‚ ତଳପାରà­à¬¶à­à¬¬à¬° ରଙà­à¬—" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "ସà­à¬•ାଇଡୋମର ତଳ ରଙà­à¬—-ସà­à¬¥à¬¾à¬¨ ପାଇଠ- ପଶà­à¬šà¬¾à¬¤à¬ªà¬¤à­à¬¤à¬¨ କà­à¬°à¬®à¬¾à¬¬à¬¨à¬¤à¬¿ ପାଇଠଉପୟୋଗ ହେବାକୠଥିବା ରଙà­à¬—" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "ସà­à¬•ାଇଡୋମର ଉପର ରଙà­à¬—-ସà­à¬¥à¬¾à¬¨ ପାଇଠ- ପଶà­à¬šà¬¾à¬¤à¬ªà¬¤à­à¬¤à¬¨ କà­à¬°à¬®à¬¾à¬¬à¬¨à¬¤à¬¿ ପାଇଠଉପୟୋଗ ହେବାକୠଥିବା ରଙà­à¬—" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "ଘନକà­à¬·à­‡à¬¤à­à¬° ରଙà­à¬—" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "ଘନକà­à¬·à­‡à¬¤à­à¬° ରଙà­à¬—" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "ଡେସà­à¬•ଟପ ଘନକà­à¬·à­‡à¬¤à­à¬°" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "ବେଗବରà­à¬¦à­à¬§à¬¨ ଭାଙà­à¬—କର" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "ଗତି ଭାଙà­à¬—କର" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "ସମଯସୋପାନ ଭାଙà­à¬—କର" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "ଉଚà­à¬šà¬¤à¬° ଗà­à¬£à¬¬à¬¤à­à¬¤à¬¾ ମାପିବା ପାଇଠୟେବେ ସମà­à¬­à¬¬ ମିପୠମà­à¬¯à¬¾à¬ªà¬—à­à¬¡à¬¿à¬•ୠଉତà­à¬ªà¬¾à¬¦à¬¨à¬•ର" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "ପୂରà­à¬¬à¬¬à¬°à­à¬¤à­à¬¤à­€ ସà­à¬²à¬¾à¬‡à¬¡à¬•ୠୟାଅ" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "ଚିତà­à¬° ଫାଇଲଗà­à¬¡à¬¿à¬•" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "ସà­à¬•ାଇଡୋମ ପାଇଠଟେକà­à¬¸à¬šà¬° ପରି ଉପୟୋଗ ହେବାକୠଥିବା ଚିତà­à¬°" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "ୟଦି ଘୂରà­à¬£à­à¬£à¬¨ କେବଳ ମାଉସ ଦà­à¬¬à¬¾à¬°à¬¾ ଟଣାୟାଇଥାଠଘନକà­à¬·à­‡à¬¤à­à¬°à¬° ସà­à¬¬à¬šà­à¬›à¬¤à¬¾à¬•ୠପà­à¬°à¬¾à¬°à¬®à­à¬­ କରେ ।" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ଘନକà­à¬·à­‡à¬¤à­à¬° ଭିତରେ" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "ଘନକà­à¬·à­‡à¬¤à­à¬° ଭିତରେ" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr " PNG à¬à¬¬à¬‚ SVG ଫାଇଲଗà­à¬¡à¬¿à¬•ର ତାଲିକା ୟାହାକି ଘନକà­à¬·à­‡à¬¤à­à¬°à¬° ଉପର ମà­à¬¹à¬à¬°à­‡ ପà­à¬°à¬¦à¬¾à¬¨ ହେବା ଉଚିତ" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "ବହà­-ଆଉଟପà­à¬Ÿ ମୋଡ" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "ବହà­à¬¬à¬¿à¬§ ଘନକà­à¬·à­‡à¬¤à­à¬°à¬—à­à¬¡à¬¿à¬•" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "ପରବରà­à¬¤à­à¬¤à­€ ସà­à¬²à¬¾à¬‡à¬¡" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "ବଡ ଘନକà­à¬·à­‡à¬¤à­à¬°à¬°à­‡" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ଘà­à¬°à­à¬£à­à¬£à¬¨ ସମଯରେ ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "ଘୂରା ନୟିବା ବେଳେ ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ଘୂରà­à¬£à­à¬£à¬¨ ସମଯରେ ଡେସà­à¬•ଟପ ଉଇଣà­à¬¡à­‹à¬° ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "ଘà­à¬°à¬¾ ନୟିବା ବେଳେ ଡେସà­à¬•ଟପ ଉଇଣà­à¬¡à­‹à¬° ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "ଘନକà­à¬·à­‡à¬¤à­à¬°à¬°à­‡ ଉଇଣà­à¬¡à­‹à¬•ୠସà­à¬¥à¬¾à¬ªà¬¿à¬¤ କର" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "ପୂରà­à¬¬à¬¬à¬°à­à¬¤à­à¬¤à­€ ସà­à¬²à¬¾à¬‡à¬¡" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "ସà­à¬•ାଇଡୋମ ପà­à¬°à¬¦à¬¾à¬¨à¬•ର" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "ଚିତà­à¬° ମାପ" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "ଘନକà­à¬·à­‡à¬¤à­à¬°à¬° ଉପ ମୂହà¬à¬•ୠଆବୃତ କରିବା ପାଇଠଚିତà­à¬°à¬—à­à¬¡à¬¿à¬•ୠମାପ" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "ୟଦି ବହà­à¬¬à¬¿à¬§ ଆଉଟପà­à¬Ÿ ଉପକରଣଗà­à¬¡à¬¿à¬• ଉପୟୋଗ ହà­à¬…ନà­à¬¤à¬¿, ଘନକà­à¬·à­‡à¬¤à­à¬° କିପରି ପà­à¬°à¬¦à¬°à­à¬¶à¬¿à¬¤ ହେବ ମନୋନୀତ କରେ ।" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "ସà­à¬•ାଇଡୋମ" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "ସà­à¬•ାଇଡୋମ କà­à¬°à¬®à¬¾à¬¬à¬¨à¬¤à¬¿ ଶେଷ ରଙà­à¬—" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "ସà­à¬•ାଇଡୋମ କà­à¬°à¬®à¬¾à¬¬à¬¨à¬¤à¬¿ ଆରମà­à¬­ ରଙà­à¬—" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "ସà­à¬•ାଇଡୋମ ଚିତà­à¬°" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "ଗତି" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "ସମଯସୋପାନ" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "କେବଳ ମାଉସ ଘà­à¬°à¬¾à¬‡à¬¬à¬¾à¬°à­‡ ସà­à¬¬à¬šà­à¬›à¬¤à¬¾" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "ଭାଙà­à¬—ହୋଇନଥିବା" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "ଭାଙà­à¬—ହୋଇନଥିବା ଘନକà­à¬·à­‡à¬¤à­à¬°" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "ଡିବସà­" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "ଡିବସ ନିଯନà­à¬¤à­à¬°à¬£ ବà­à¬¯à¬¾à¬•à¬à¬£à­à¬¡" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "ଅଳଂକରଣ ଟେକà­à¬¸à¬Ÿà¬šà¬° ପାଇଠମିପୠମà­à¬¯à¬¾à¬ªà¬—à­à¬¡à¬¿à¬•ୠଉତà­à¬ªà¬¾à¬¦à¬¿à¬¤ ହେବା ସà­à¬¬à­€à¬•ୃତିଦିଅ" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "ଆଦେଶ" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "ଅଳଂକରଣ ଉଇଣà­à¬¡à­‹" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "ଅଳଂକୃତକାରୀ ଆଦେଶ ରେଖା କାରà­à­Ÿà­à¬¯à¬•ାରୀ ହୋଇଥାà¬, ୟଦି କୌଣସି ଅଳଂକୃତକାରୀ ପୂରà­à¬¬à¬°à­ ଚାଲà­à¬¨à¬¥à¬¾à¬ " #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "ଛାଯା X ଅଫà­à¬¸à­‡à¬Ÿ ପକାଅ" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "ଛାଯା Y ଅଫà­à¬¸à­‡à¬Ÿ ପକାଅ" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "ଛାଯା ରଙà­à¬— ପକାଅ" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "ଛାଯା ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ପକାଅ" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "ଛାଯା ବà­à¬¯à¬¾à¬¸à¬¾à¬°à­à¬¦à­à¬§ ପକାଅ" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "ଛାଯାରଙà­à¬—" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "ଛାଯା ଅଫୠସେଟ X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "ଛାଯା ଅଫୠସେଟ Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "ଛାଯା ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "ଛାଯା ବà­à¬¯à¬¾à¬¸à¬¾à¬°à­à¬¦à­à¬§" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "ଛାଯା ଉଇଣà­à¬¡à­‹" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "ଉଇଣà­à¬¡à­‹ ଅଳଂକରଣ" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "ଉଇଣà­à¬¡à­‹ ଅଳଂକରଣଗà­à¬¡à¬¿à¬•" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ଅଳଂକୃତ ହେବା ଉଚିତ" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାର କି ଗୋଟିଠଛାଯା ରହିବା ଉଚିତ" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "ଘୂରà­à¬£à­à¬£à¬¨ ଗତି" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "ଅବରୂଦà­à¬§Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "ସାମାନà­à¬¯ ପà­à¬¨à¬ƒà¬†à¬•ାର ଉଇଣà­à¬¡à­‹" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "ଫିକାହେବା ସମଯ" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "ନà­à¬¯à­à¬¨à¬¤à¬®à¬¹à­‡à¬¬à¬¾/ଖୋଲିବା/ବନà­à¬¦à¬¹à­‡à¬¬à¬¾ ରେ ଫିକା କର" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "ଫିକାହେବା ଗତି" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "ଫିକାହେବା ସମଯ" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "ନà­à¬¯à­à¬¨à¬¤à¬®à¬¹à­‡à¬¬à¬¾/ଖୋଲିବା/ବନà­à¬¦à¬¹à­‡à¬¬à¬¾ ଉଇଣà­à¬¡à­‹ ଘଟଣା ରେ ଫିକà­à¬•ା ପà­à¬°à¬­à¬¾à¬¬" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "ସିଷà­à¬Ÿà¬® ବିପ ଶବà­à¬¦à¬°à­‡ ଫିକାହେବା ପà­à¬°à¬­à¬¾à¬¬" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "ଉଇଣà­à¬¡à­‹ ଅଂକିତ ହେବା ସମଯରେ ରେ ଫିକà­à¬•ା ହେବା à¬à¬¬à¬‚ ଅଂକିତ ନହେବା ସମଯରେ ବାହାରେ ଫିକà­à¬•ା ହେବା" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "ଫିକା ଉଇଣà­à¬¡à­‹" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "ଉଇଣà­à¬¡à­‹ ଫିକାହେଉଛି" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "ପୂରà­à¬£à­à¬£ ସà­à¬•à­à¬°à¬¿à¬¨ ଦୃଶà­à¬¯à¬•à­à¬·à¬® ଘଣà­à¬Ÿà¬¾" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "ସିଷà­à¬Ÿà¬® ବିପ ଶବà­à¬¦à¬°à­‡ ପୂରà­à¬£à­à¬£ ସà­à¬•à­à¬°à¬¿à¬¨ ଫିକà­à¬•ା ପà­à¬°à¬­à¬¾à¬¬" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "ଦୃଶà­à¬¯à¬•à­à¬·à¬® ଘଣà­à¬Ÿà¬¾" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "ଉଇଣà­à¬¡à­‹ ଫିକା ହେବା ଗତି" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ମାପ ମୋଡରେ ମାପ ହେବା ଉଚିତ" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ଫିକà­à¬•ା ହେବା ଉଚିତ" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "ସà­à¬¥à¬¾à¬ªà¬¨ ବିନà­à¬¦à­" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "ସà­à¬¥à¬¾à¬ªà¬¨ ବିନà­à¬¦à­" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "ଉପୟୋଗକରà­à¬¤à­à¬¤à¬¾à¬…ନà­à¬¤à¬° ଫାଇଲ ସିଷà­à¬Ÿà¬®" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "ଉପୟୋଗକରà­à¬¤à­à¬¤à¬¾à¬…ନà­à¬¤à¬° ଫାଇଲ ସିଷà­à¬Ÿà¬®" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "Gକନà­à¬«" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "ଜିକନà­à¬« ନିଯନà­à¬¤à­à¬°à¬£ ବà­à¬¯à¬¾à¬•à¬à¬£à­à¬¡" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "ଜିଲିବà­" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "ଜିଲିବୠମୂଖà­à¬¯ ଲà­à¬ª ସମରà­à¬¥à¬¨" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "ଗୋଟିଠଟରà­à¬®à¬¿à¬¨à¬¾à¬² ଖୋଲ" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "ଚଳାଅ ଡାà¬à¬²à¬—" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "ଟରà­à¬®à¬¿à¬¨à¬¾à¬² ଆଦେଶ ରେଖା" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "ସà­à¬•à­à¬°à¬¿à¬¨à¬¸à¬Ÿ ଆଦେଶ ରେଖା" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "ମୂଖà­à¬¯ ମେନୠଦେଖାଅ" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "ଚାଳାଅ ପà­à¬°à¬¯à­‹à¬— ଡାà¬à¬²à¬—କୠଦେଖାଅ" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "ମୂଖà­à¬¯ ମେନà­à¬•ୠଦେଖାଅ" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "ଗୋଟିଠସà­à¬•à­à¬°à¬¿à¬¨à¬¸à¬Ÿ ନିଅ" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "ଗୋଟିଠଉଇଣà­à¬¡à­‹à¬° ସà­à¬•à­à¬°à¬¿à¬¨à¬¸à¬Ÿ ନିଅ" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "ଟରà­à¬®à¬¿à¬¨à¬¾à¬² ଆଦେଶ ରେଖା" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "ଉଇଣà­à¬¡à­‹ ସà­à¬•à­à¬°à¬¿à¬¨à¬¸à¬Ÿ ଆଦେଶ ରେଖା" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "ଇନି ଫà­à¬²à¬¾à¬Ÿ ଫାଇଲ ବà­à¬¯à¬¾à¬•à¬à¬£à­à¬¡" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ଫାଇଲ ପରିବରà­à¬¤à­à¬¤à¬¨ ବିଜà­à¬žà¬¾à¬ªà¬¨ ପà­à¬²à¬—ଇନ" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Iବିଜà­à¬žà¬¾à¬ªà­à¬¤à¬¿" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kକନଫିଗà­" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "K କନଫିଗୠନିଯନà­à¬¤à­à¬°à¬£ ବà­à¬¯à¬¾à¬•à¬à¬£à­à¬¡" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "ନà­à¬¯à­à¬¨à¬¤à¬® ପà­à¬°à¬­à¬¾à¬¬" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠନà­à¬¯à­à¬¨à¬¤à¬® କର" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "ଗତିକୠନà­à¬¯à­à¬¨à¬¤à¬®à¬•ର" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "ସମଯସୋପାନକୠନà­à¬¯à­à¬¨à¬¤à¬®à¬•ର" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "ଛାଯା ପà­à¬°à¬¤à¬¿à¬°à­‹à¬§à¬•" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "ଛାଯା ପà­à¬°à¬¤à¬¿à¬°à­‹à¬§à¬•" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "ଉଇଣà­à¬¡à­‹ ଗà­à¬¡à¬¿à¬•ୠରୂପାନà­à¬¤à¬° କର ୟେବେ ସେଗà­à¬¡à¬¿à¬• ନà­à¬¯à­à¬¨à¬¤à¬® କିମà­à¬¬à¬¾ ଅଣ-ନà­à¬¯à­à¬¨à¬¤à¬® ହà­à¬…ନà­à¬¤à¬¿ " #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ରୂପାନà­à¬¤à¬°à¬¿à¬¤ ହେବା ଉଚିତ ୟେବେ ନà­à¬¯à­à¬¨à¬¤à¬® ହୋଇଥାà¬" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "ଅବରୂଦà­à¬§Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Y ସହୟୋଗୀକୠକାରà­à­Ÿà­à¬¯à¬¸à­à¬¥à¬¾à¬¨ ଅଂଚଳକୠଅବରà­à¬¦à­à¬§à¬•ର" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "ଉଇଣà­à¬¡à­‹à¬° ସରଭର-ପଟ ସà­à¬¥à¬¾à¬¨à¬•ୠଅପଡେଟ କର ନାହିଠୟେଉà¬à¬ªà¬°à­à­Ÿà­à¬¯à¬¨à­à¬¤ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾ ଶେଷ ହୋଇ ନାହିଠ।" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "ଉଇଣà­à¬¡à­‹ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾ ଆରମà­à¬­ କର" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "ଆଳସà­à¬¯ ସà­à¬¥à¬¾à¬ªà¬¨ କରିବା" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠଘà­à¬žà­à¬šà¬¾à¬…" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠଘà­à¬žà­à¬šà¬¾à¬…" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "ଘà­à¬žà­à¬šà¬¾à­Ÿà¬¾à¬‰à¬¥à¬¿à¬¬à¬¾ ଉଇଣà­à¬¡à­‹à¬° ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ସà­à¬¤à¬°" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "ଟାଣିବା ବେଳେ ସରà­à¬¬à¬¾à¬§à¬¿à¬• ଉଇଣà­à¬¡à­‹à¬•ୠଛିନà­à¬¨à¬•ରିବା ବନà­à¬¦à¬•ର à¬à¬¬à¬‚ ସà­à¬¬à¬¤à¬ƒ ଅଣ-ସରà­à¬¬à¬¾à¬§à¬¿à¬• କର " #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "ସରà­à¬¬à¬¾à¬§à¬¿à¬• କରାୟାଇଥିବା ଉଇଣà­à¬¡à­‹à¬•ୠଛିନà­à¬¨ କର" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾ ଆରମà­à¬­à¬•ର" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "ଉଜà­à¬¬à¬³à¬¤à¬¾" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "ଉଜà­à¬¬à¬³à¬¤à¬¾" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "ଉଜà­à¬¬à¬³à¬¤à¬¾" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "ଉଜà­à¬¬à¬³à¬¤à¬¾" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ହà­à¬°à¬¾à¬¸à¬•ର" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾à¬•ୠବୃଦà­à¬§à¬¿à¬•ର" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ପରିବରà­à¬¤à­à¬¤à¬¨ ସୋପାନ" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ପରିବରà­à¬¤à­à¬¤à¬¨ ସୋପାନ" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ସୋପାନ" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "ଘà­à¬žà­à¬šà¬¾à­Ÿà¬¾à¬‰à¬¥à¬¿à¬¬à¬¾ ଉଇଣà­à¬¡à­‹à¬° ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ସà­à¬¤à¬°" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "ଘà­à¬°à­à¬£à­à¬£à¬¨ ସମଯରେ ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "ସଂପୂରà­à¬£à­à¬£ ମିଶà­à¬°à¬£" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "ସଂପୂରà­à¬£à­à¬£ ମିଶà­à¬°à¬£" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "ସଂପୂରà­à¬£à­à¬£ ମିଶà­à¬°à¬£" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "ସଂପୂରà­à¬£à­à¬£ ମିଶà­à¬°à¬£" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ଉଇଣà­à¬¡à­‹ ଅଳଂକରଣଗà­à¬¡à¬¿à¬•" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "windows" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "ଉଇଣà­à¬¡à­‹ ଗà­à¬¡à¬¿à¬•ୠଅଂକନକର" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ଡିଫଲà­à¬Ÿà¬°à­‡ ସà­à¬¥à¬¾à¬ªà¬¿à¬¤ ହେବା ଉଚିତ" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "ଉଇଣà­à¬¡à­‹à¬—à­à¬¡à¬¿à¬• ୟାହାକି ଡିଫଲà­à¬Ÿà¬°à­‡ ସà­à¬¬à¬šà­à¬› ହେବା ଉଚିତ" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ଡିଫଲà­à¬Ÿà¬°à­‡ ସà­à¬¥à¬¾à¬ªà¬¿à¬¤ ହେବା ଉଚିତ" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "ଉଇଣà­à¬¡à­‹ ସà­à¬¥à¬¾à¬ªà¬¨ ପାଇଠଉପୟୋଗ ହେବାକୠଥିବା ଆଲଗୋରିଥମ" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "କà­à¬¯à¬¾à¬¸à¬•େଡ" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "କେନà­à¬¦à­à¬°à¬¿à¬¤" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "ଉଇଣà­à¬¡à­‹ ପà­à¬°à¬¬à¬¨à­à¬§à¬¨" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "ଲକà­à¬·à­à¬¯ ବାଧାଦେବା ଉଇଣà­à¬¡à­‹" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "ଦିଗବଳାଯ ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿ ସà­à¬¥à¬¾à¬¨à¬—à­à¬¡à¬¿à¬•" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "ଉଇଣà­à¬¡à­‹ ସà­à¬¥à¬¾à¬ªà¬¿à¬¤à¬•ର" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "ଅଂକନ କରିବା ସମଯରେ ଉଇଣà­à¬¡à­‹à¬•ୠଗୋଟିଠଉପୟà­à¬•à­à¬¤ ସà­à¬¥à¬¾à¬¨à¬°à­‡ ସà­à¬¥à¬¾à¬ªà¬¿à¬¤ କର" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "ସà­à¬¥à¬¾à¬ªà¬¨ ମୋଡ" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "ସà­à¬¥à¬¾à¬ªà¬¿à¬¤ ଉଇଣà­à¬¡à­‹" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "କà­à¬°à¬®à¬¹à­€à¬¨" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "ଉଇଣà­à¬¡à­‹ ଗà­à¬¡à¬¿à¬• କେଉà¬à¬ à¬¾à¬°à­‡ ମାପ ହେବେ ମନୋନୀତ କରେ ୟଦି ବହà­à¬¬à¬¿à¬§ ଆଉଟପà­à¬Ÿ ଉପକରଣ ଉପୟୋଗ ହୋଇଥାଆନà­à¬¤à¬¿ ।" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "ସà­à¬«à­à¬°à­à¬¤à­à¬¤à¬¿" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "ସବୠଆଉଟପà­à¬Ÿ ଉପକରଣରେ" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "ଦଣà­à¬¡à¬°à­‚ପୀ ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿ ସà­à¬¥à¬¾à¬¨à¬—à­à¬¡à¬¿à¬•" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿ ସà­à¬¥à¬¾à¬ªà¬¿à¬¤ ଉଇଣà­à¬¡à­‹" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "ଉଇଣà­à¬¡à­‹ ସà­à¬¥à¬¾à¬ªà¬¨ ଚାରିପଟେକାମକରେ" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ଡିଫଲà­à¬Ÿà¬°à­‡ ସà­à¬¥à¬¾à¬ªà¬¿à¬¤ ହେବା ଉଚିତ" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ଡିଫଲà­à¬Ÿà¬°à­‡ ଗୋଟିଠନିରà­à¬¦à­à¬¦à¬¿à¬·à­à¬Ÿ ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿà¬°à­‡ ସà­à¬¥à¬¾à¬ªà¬¿à¬¤ ହେବା ଉଚିତ" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ଉଇଣà­à¬¡à­‹ ଅଳଂକରଣଗà­à¬¡à¬¿à¬•" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "ଚାରିପଟେକାମକରେ" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X ସà­à¬¥à¬¾à¬¨à¬—à­à¬¡à¬¿à¬•" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿ ସà­à¬¥à¬¾à¬¨à¬—à­à¬¡à¬¿à¬•" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X ସà­à¬¥à¬¾à¬¨ ମୂଲà­à¬¯à¬—à­à¬¡à¬¿à¬•" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y ସà­à¬¥à¬¾à¬¨à¬—à­à¬¡à¬¿à¬•" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿ ସà­à¬¥à¬¾à¬¨à¬—à­à¬¡à¬¿à¬•" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y ସà­à¬¥à¬¾à¬¨ ମୂଲà­à¬¯à¬—à­à¬¡à¬¿à¬•" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png ଚିତà­à¬° ଲୋଡ କାରୀ" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "ରିଜେକà­à¬¸ ମେଳଖାଇବା" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "ରିଜେକà­à¬¸ ଉଇଣà­à¬¡à­‹ ମେଳଖାଇବା" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "ସୀମାନà­à¬¤ ରଙà­à¬—" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "ବୋରà­à¬¡à¬° ରଙà­à¬— ବାହà­à¬¯à¬°à­‡à¬–ା à¬à¬¬à¬‚ ଆଯତାକାର ପà­à¬¨à¬ƒà¬†à¬•ାର ମୋଡଗà­à¬¡à¬¿à¬• ପାଇଠଉପୟୋଗ ହୋଇଥାଠ" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "ଡିଫଲà­à¬Ÿ ପà­à¬¨à¬ƒà¬†à¬•ାର ମୋଡ" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "ଡିଫଲà­à¬Ÿ ମୋଡ ଉଇଣà­à¬¡à­‹ ପà­à¬¨à¬ƒà¬†à¬•ାର ଦେବା ପାଇଠଉପୟୋଗ ହୋଇଥାà¬" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "ରଙà­à¬— ପà­à¬°à¬£à¬•ର" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "ଆଯତାକାର ପà­à¬¨à¬ƒà¬†à¬•ାର ମୋଡ ପାଇଠପà­à¬°à¬£ ରଙà­à¬— ଉପୟୋଗ ହୋଇଥାà¬" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "ସାମାନà­à¬¯ ଉଇଣà­à¬¡à­‹ ପà­à¬¨à¬ƒà¬†à¬•ାରଦେବା ପà­à¬°à¬¾à¬°à¬®à­à¬­ କର" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "ବାହà­à¬¯à¬°à­‡à¬–ା ଉଇଣà­à¬¡à­‹ ପà­à¬¨à¬ƒà¬†à¬•ାରଦେବା ପà­à¬°à¬¾à¬°à¬®à­à¬­ କର" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "ଆଯତକà­à¬·à­‡à¬¤à­à¬° ଉଇଣà­à¬¡à­‹ ପà­à¬¨à¬ƒà¬†à¬•ାରଦେବା ପà­à¬°à¬¾à¬°à¬®à­à¬­ କର" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "ବିସà­à¬¤à¬¾à¬°à¬¿à¬¤ ଉଇଣà­à¬¡à­‹ ପà­à¬¨à¬ƒà¬†à¬•ାରଦେବା ପà­à¬°à¬¾à¬°à¬®à­à¬­ କର" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "ଉଇଣà­à¬¡à­‹ ପà­à¬¨à¬ƒà¬†à¬•ାରଦେବା ପà­à¬°à¬¾à¬°à¬®à­à¬­ କର" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "ସାମାନà­à¬¯ ପà­à¬¨à¬ƒà¬†à¬•ାର ଉଇଣà­à¬¡à­‹" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "ବାହà­à¬¯à¬°à­‡à¬–ା" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "ବାହà­à¬¯à¬°à­‡à¬–ା ପà­à¬¨à¬ƒà¬†à¬•ାର ଉଇଣà­à¬¡à­‹" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "ଆଯତାକାର" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "ଆଯତାକାର ପà­à¬¨à¬ƒà¬†à¬•ାର ଉଇଣà­à¬¡à­‹" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠପà­à¬¨à¬ƒà¬†à¬•ାରଦିଅ" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠପà­à¬¨à¬ƒà¬†à¬•ାରଦିଅ" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠପà­à¬¨à¬ƒà¬†à¬•ାର ଦେବା ଆରମà­à¬­à¬•ର" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠବିସà­à¬¤à¬¾à¬° କରିବା ଦà­à¬¬à¬¾à¬°à¬¾ à¬à¬¹à¬¾à¬•ୠପà­à¬¨à¬ƒà¬†à¬•ାର ଦେବା ଆରମà­à¬­ କର" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "ସାମାନà­à¬¯ ଭାବରେ ଉଇଣà­à¬¡à­‹à¬•ୠପà­à¬¨à¬ƒà¬†à¬•ାର ଦେବା ଆରମà­à¬­à¬•ର" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "ବାହà­à¬¯à¬°à­‡à¬–ା ସହିତ ଉଇଣà­à¬¡à­‹à¬•ୠପà­à¬¨à¬ƒà¬†à¬•ାର ଦେବା ଆରମà­à¬­à¬•ର" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "ଆଯତାକାର ସହିତ ଉଇଣà­à¬¡à­‹à¬•ୠପà­à¬¨à¬ƒà¬†à¬•ାର ଦେବା ଆରମà­à¬­à¬•ର" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "ବିସà­à¬¤à¬¾à¬°à¬¿à¬¤" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "ପà­à¬¨à¬ƒà¬†à¬•ାର ଉଇଣà­à¬¡à­‹à¬—à­à¬¡à¬¿à¬•ୠଟାଣିଲମà­à¬¬à¬¾à¬•ର" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହା ପାଇଠସାମାନà­à¬¯ ପà­à¬¨à¬ƒà¬†à¬•ାର ଉପୟୋଗ ହେବା ଉଚିତ" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହା ପାଇଠବାହà­à¬¯à¬°à­‡à¬–ା ପà­à¬¨à¬ƒà¬†à¬•ାର ଉପୟୋଗ ହେବା ଉଚିତ" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହା ପାଇଠଆଯତାକାର ପà­à¬¨à¬ƒà¬†à¬•ାର ଉପୟୋଗ ହେବା ଉଚିତ" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହା ପାଇଠବିସà­à¬¤à¬¾à¬°à¬¿à¬¤ ପà­à¬¨à¬ƒà¬†à¬•ାର ଉପୟୋଗ ହେବା ଉଚିତ" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "ଧାର ବଦଳ DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "ଧାର ବଦଳ ଘà­à¬žà­à¬šà¬¿à¬¬à¬¾" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "ଧାର ବଦଳ ପà¬à¬£à­à¬Ÿà¬°" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "ସମଯ ବଦଳକର" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "ବାମ ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿà¬•ୠବଦଳ କର à¬à¬¬à¬‚ ପà¬à¬£à­à¬Ÿà¬°à¬•ୠବଙà­à¬•ାକର" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "ସà­à¬•à­à¬°à¬¿à¬¨à¬° ଧାରକୠବସà­à¬¤à­à¬•ୠଟାଣିବା ବେଳେ ପରବରà­à¬¤à­à¬¤à­€ ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿà¬•ୠବଦଳ କର" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "ସà­à¬•à­à¬°à¬¿à¬¨à¬° ଧାରକୠପà¬à¬£à­à¬Ÿà¬°à¬•ୠଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾ ବେଳେ ପରବରà­à¬¤à­à¬¤à­€ ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿà¬•ୠବଦଳ କର" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠସà­à¬•à­à¬°à¬¿à¬¨à¬° ଧାରକୠଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾ ବେଳେ ପରବରà­à¬¤à­à¬¤à­€ ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿà¬•ୠବଦଳ କର" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "ଡାହାଣ ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿà¬•ୠବଦଳ କର à¬à¬¬à¬‚ ପà¬à¬£à­à¬Ÿà¬°à¬•ୠବଙà­à¬•ାକର" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "ପà¬à¬£à­à¬Ÿà¬° ଚଳପà­à¬°à¬šà¬³ ପାଇଠY ଅକà­à¬·à¬•ୠଓଲଟାଅ" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "ପà¬à¬£à­à¬Ÿà¬° ଓଲଟାଅ Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "ପà¬à¬£à­à¬Ÿà¬° ସଂବେଦନଶୀଳତା" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "ଘà­à¬°à¬¾à¬‡à¬¬à¬¾à¬°à­‡ ଉଠାଅ" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "ଘà­à¬°à¬¾à¬‡à¬¬à¬¾ ବେଳେ ଉଇଣà­à¬¡à­‹à¬•ୠଉତà­à¬¥à¬¾à¬¨ କର" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "ଘନକà­à¬·à­‡à¬¤à­à¬°à¬•ୠଘà­à¬°à¬¾à¬… " #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "ଫà­à¬²à¬¿à¬ª ବାମକୠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "ଫà­à¬²à¬¿à¬ª ଡାହାଣକୠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "ବାମକୠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ବାମକୠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "ଡାହାଣକୠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ଡାହାଣକୠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "କୠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "୧କୠସମà­à¬®à­à¬–ୀନ ହେବାପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୧କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "୧୦କୠସମà­à¬®à­à¬–ୀନ ହେବାପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୧୦କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "୧୧କୠସମà­à¬®à­à¬–ୀନ ହେବାପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୧୧କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "୧୨କୠସମà­à¬®à­à¬–ୀନ ହେବାପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୧୨କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "୨କୠସମà­à¬®à­à¬–ୀନ ହେବାପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୨କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "୩କୠସମà­à¬®à­à¬–ୀନ ହେବାପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୩କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "୪କୠସମà­à¬®à­à¬–ୀନ ହେବାପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୪କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "୫କୠସମà­à¬®à­à¬–ୀନ ହେବାପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୫କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "୬କୠସମà­à¬®à­à¬–ୀନ ହେବାପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୬କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "୭କୠସମà­à¬®à­à¬–ୀନ ହେବାପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୭କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "୮କୠସମà­à¬®à­à¬–ୀନ ହେବାପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୮କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "୯କୠସମà­à¬®à­à¬–ୀନ ହେବାପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୯କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "ଘନକà­à¬·à­‡à¬¤à­à¬°à¬•ୠଘà­à¬°à¬¾à¬… " #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "ଡେସà­à¬•ଟପ କà­à¬¯à­à¬¬à­à¬•ୠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "ବାମକୠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "ବାମକୠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "ଡାହାଣକୠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "ଡାହାଣକୠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "୧କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… " #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ୧କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "୧କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… " #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "୧କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "୧୦କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… " #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "୧୦କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "୧୧କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "୧୧କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "୧୨କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… " #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "୧୨କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "୨କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "୨କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "୩କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "୩କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "୪କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "୪କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "୫କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "୫କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "୬କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "୬କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "୭କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "୭କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "୮କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "୮କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "୯କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "୯କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠଘà­à¬°à¬¾à¬… à¬à¬¬à¬‚ ସହିତ ସକà­à¬°à¬¿à¬¯ ଉଇଣà­à¬¡à­‹à¬•ୠଆଣ " #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿà¬•ୠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "ଉଇଣà­à¬¡à­‹ ସହିତ ଘà­à¬°à¬¾à¬…" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "ଘà­à¬°à­à¬£à­à¬£à¬¨ ଗତିବରà­à¬¦à­à¬§à¬¨" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "ଘୂରà­à¬£à­à¬£à¬¨ ଗତି" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "ଘà­à¬°à­à¬£à­à¬£à¬¨ ସମଯସୋପାନ" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "ଘà­à¬°à­à¬£à­à¬£à¬¨ ଜà­à¬®" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "ପà¬à¬£à­à¬Ÿà¬° ଚାଳନା ର ସମà­à¬¬à­‡à¬¦à¬¨à¬¶à­€à¬³à¬¤à¬¾" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "ଉପର ମୂହà¬à¬•ୠଘନକà­à¬·à­‡à¬¤à­à¬°à¬° ଘà­à¬°à­à¬£à­à¬£à¬¨ ଛିନà­à¬¨à¬•ର" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ଉପର ମୂହà¬à¬•ୠଘନକà­à¬·à­‡à¬¤à­à¬°à¬° ଘà­à¬°à­à¬£à­à¬£à¬¨ ଛିନà­à¬¨à¬•ର" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "ଉପର ମୂହà¬à¬•ୠଛିନà­à¬¨à¬•ର" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ଉପର ମୂହà¬à¬•ୠଛିନà­à¬¨à¬•ର" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "ଘà­à¬°à­à¬£à­à¬£à¬¨ ଆରମà­à¬­à¬•ର" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "ଦୃଶà­à¬¯à¬ªà­‹à¬°à­à¬Ÿà¬•ୠବଦଳ କରିବା ପୂରà­à¬¬à¬°à­ ସମଯଶେଷ" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "ଜà­à¬®à¬•ର(ବଡକର)" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "ଶତକଡାରେ ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾à¬° ପରିମାଣ" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "ବଡ" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "ଡେସà­à¬•ଟପକୠଦେଖାଇବା ପାଇଠଡେସà­à¬•ଟପକୠକà­à¬²à¬¿à¬• କର" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "ପୃଷà­à¬ à¬­à­‚ମିକୠଗାଢକର" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠମାପିବା ବେଳେ ପୃଷà­à¬ à¬­à­‚ମିକୠଗାଢ କର" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "ଚିହà­à¬¨" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "ମାପ ବେଳେ ୟେବେ ଡେସà­à¬•ଟପ କà­à¬²à¬¿à¬• ହୋଇଥାଠଡେସà­à¬•ଟପ ଦେଖାଅ ମୋଡକୠପà­à¬°à¬¬à­‡à¬¶ କର" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ହୋଭର ସମଯ" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "ଉଇଣà­à¬¡à­‹ ଗୋଟାଇବାକୠଆରମà­à¬­à¬•ର" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "ସବୠଉଇଣà­à¬¡à­‹ ପାଇଠଉଇଣà­à¬¡à­‹ ପିକà­à¬•ର ପà­à¬°à¬¾à¬°à¬®à­à¬­à¬•ର" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "ଉଇଣà­à¬¡à­‹ ସମୂହ ପାଇଠଉଇଣà­à¬¡à­‹ ପିକà­à¬•ର ପà­à¬°à¬¾à¬°à¬®à­à¬­ କର" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "ଚଳିତ ଆଉଟପà­à¬Ÿà¬°à­‡ ଉଇଣà­à¬¡à­‹ ପାଇଠଉଇଣà­à¬¡à­‹ ପିକà­à¬•ର ପà­à¬°à¬¾à¬°à¬®à­à¬­ କର" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "ବିରଚନା à¬à¬¬à¬‚ ଆରମà­à¬­ ସବୠଉଇଣà­à¬¡à­‹à¬•ୠରୂପାନà­à¬¤à¬°à¬¿à¬¤à¬•ରà­à¬›à¬¿ " #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "ବିରଚନା à¬à¬¬à¬‚ ଆରମà­à¬­ ଉଇଣà­à¬¡à­‹ ସମୂହକୠରୂପାନà­à¬¤à¬°à¬¿à¬¤ କରà­à¬›à¬¿" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "ବିରଚନା à¬à¬¬à¬‚ ଆରମà­à¬­ ଉଇଣà­à¬¡à­‹à¬•ୠରୂପାନà­à¬¤à¬°à¬¿à¬¤ କରà­à¬›à¬¿" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "ବିରଚନା à¬à¬¬à¬‚ ଆରମà­à¬­ ଚଳିତ ଆଉଟପà­à¬Ÿà¬°à­‡ ଉଇଣà­à¬¡à­‹à¬•ୠରୂପାନà­à¬¤à¬°à¬¿à¬¤ କରà­à¬›à¬¿" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "ସବୠଆଉଟପà­à¬Ÿ ଉପକରଣରେ" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "ଚଳିତ ଆଉଟପà­à¬Ÿ ଉପକରଣରେ" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ବିସà­à¬¤à­ƒà¬¤à¬•ରିବା ଆଇକନ" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "ଥରେ ସେଗà­à¬¡à¬¿à¬• ମାପ ହେବା ପରେ ଉଇଣà­à¬¡à­‹à¬°à­‡ ଗୋଟିଠଆଇକନକୠବିସà­à¬¤à­ƒà¬¤à¬•ର" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "ମାପକ" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠମାପ" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "ଗତି ମାପ" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "ସମଯସୋପାନକୠମାପ" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠମାପ" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "ଉଇଣà­à¬¡à­‹ ଗà­à¬¡à¬¿à¬• କେଉà¬à¬ à¬¾à¬°à­‡ ମାପ ହେବେ ମନୋନୀତ କରେ ୟଦି ବହà­à¬¬à¬¿à¬§ ଆଉଟପà­à¬Ÿ ଉପକରଣ ଉପୟୋଗ ହୋଇଥାଆନà­à¬¤à¬¿ ।" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "ଉଇଣà­à¬¡à­‹à¬—à­à¬¡à¬¿à¬• ମଧà­à¬¯à¬°à­‡ ଅନà­à¬¤à¬°" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "ଅନà­à¬¤à¬°à¬¦à­‡à¬¬à¬¾" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "ସମଯ (in ms)ମାପ ମୋଡ ପୂରà­à¬¬à¬°à­ ନଷà­à¬Ÿ ହୋଇଥାଠୟେବେ ଗୋଟିଠଉଇଣà­à¬¡à­‹ ଉପରେ ଦୋଳାଯମାନ ହà­à¬ " #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ମାପ ମୋଡରେ ମାପ ହେବା ଉଚିତ" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "à¬à¬¹à¬¿ ପà­à¬°à¬¯à­‹à¬—ରେ ସà­à¬¬à¬¯à¬‚ଚାଳିତଭାବରେ ସà­à¬•à­à¬°à¬¿à¬¨à¬¸à¬Ÿ ଖୋଲ" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "ବିବରଣୀପଞà­à¬œà¬¿à¬•ା" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "ଆଯତାକାର ସà­à¬•à­à¬°à¬¿à¬¸à¬Ÿà¬•ୠଆରମà­à¬­à¬•ର" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "ପà­à¬°à¬¾à¬°à¬®à­à¬­à¬•ରିବା ପà­à¬°à¬¯à­‹à¬—" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "à¬à¬¹à¬¿ ବିବରଣୀପଞà­à¬œà¬¿à¬•ାରେ ସà­à¬•à­à¬°à¬¿à¬¨à¬¸à¬Ÿ ଚିତà­à¬°à¬—à­à¬¡à¬¿à¬•ୠରଖ" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "ସà­à¬•à­à¬°à¬¿à¬¨ ସଟ" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "ସà­à¬•à­à¬°à¬¿à¬¨à¬¸à¬Ÿ ପà­à¬²à¬—ଇନ" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg ଚିତà­à¬° ଲୋଡକାରୀ" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "ଶତକଡାରେ ଉଜà­à¬¬à¬³à¬¤à¬¾à¬° ପରିମାଣ" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "ଶତକଡାରେ ସଂପୂରà­à¬£à­à¬£à¬®à¬¿à¬¶à­à¬°à¬£à¬° ପରିମାଣ" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "ପà­à¬°à¬¯à­‹à¬— ଅଦଳବଦଳକାରୀ" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "ସà­à¬¬à¬¤à¬ƒà¬˜à­à¬°à­à¬£à­à¬£à¬¨" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "ଆଗକୠଆଣ" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "ମନୋନୀତ ଉଇଣà­à¬¡à­‹à¬•ୠଆଗକୠଆଣ" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠଅଦଳବଦଳ କରିବା ବେଳେ ଦୂରତା ଡେସà­à¬•ଟପ ଜà­à¬® ଆଉଟ ହେବା ଉଚିତ" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "ଆଇକନ" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "ନà­à¬¯à­à¬¨à¬¤à¬®à¬¹à­‹à¬‡à¬¥à¬¿à¬¬à¬¾" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "ଡେସà­à¬•ଟପ ସମତଳ" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "ପରବରà­à¬¤à­à¬¤à­€ ଉଇଣà­à¬¡à­‹" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "ପରବରà­à¬¤à­à¬¤à­€ ଉଇଣà­à¬¡à­‹(ସବୠଉଇଣà­à¬¡à­‹)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "ପରବରà­à¬¤à­à¬¤à­€ ଉଇଣà­à¬¡à­‹(ପପà­à¬…ପ ନାହିà¬)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "ପପୠଅପ ବଦଳକାରୀ ୟଦି ଦୃଶà­à¬¯à¬®à¬¾à¬¨ ନ ଥାଠà¬à¬¬à¬‚ ପରବରà­à¬¤à­à¬¤à­€ ଉଇଣà­à¬¡à­‹à¬•ୠମନୋନୀତକର" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "ପପୠଅପ ବଦଳକାରୀ ୟଦି ଦୃଶà­à¬¯à¬®à¬¾à¬¨ ନ ଥାଠà¬à¬¬à¬‚ ସବୠଉଇଣà­à¬¡à­‹ ମଧà­à¬¯à¬°à­ ପରବରà­à¬¤à­à¬¤à­€ ଉଇଣà­à¬¡à­‹à¬•ୠମନୋନୀତକର" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "ପପୠଅପ ବଦଳକାରୀ ୟଦି ଦୃଶà­à¬¯à¬®à¬¾à¬¨ ନ ଥାଠà¬à¬¬à¬‚ ପୂରà­à¬¬à¬¬à¬°à­à¬¤à­à¬¤à­€ ଉଇଣà­à¬¡à­‹à¬•ୠମନୋନୀତକର" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "ପପୠଅପ ବଦଳକାରୀ ୟଦି ଦୃଶà­à¬¯à¬®à¬¾à¬¨ ନ ଥାଠà¬à¬¬à¬‚ ସବୠଉଇଣà­à¬¡à­‹ ମଧà­à¬¯à¬°à­ ପୂରà­à¬¬à¬¬à¬°à­à¬¤à­à¬¤à­€ ଉଇଣà­à¬¡à­‹à¬•ୠମନୋନୀତକର" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "ପୂରà­à¬¬à¬¬à¬°à­à¬¤à­à¬¤à­€ ସà­à¬²à¬¾à¬‡à¬¡" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "ପୂରà­à¬¬à¬¬à¬°à­à¬¤à­à¬¤à­€ ଉଇଣà­à¬¡à­‹" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "ପୂରà­à¬¬à¬¬à¬°à­à¬¤à­à¬¤à­€ ଉଇଣà­à¬¡à­‹( ସବୠଉଇଣà­à¬¡à­‹)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "ପୂରà­à¬¬à¬¬à¬°à­à¬¤à­à¬¤à­€ ଉଇଣà­à¬¡à­‹(ପପà­à¬…ପ ନାହିà¬)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "ବଦଳ କରିବା ବେଳେ ମନୋନୀତ ଉଇଣà­à¬¡à­‹à¬•ୠଘà­à¬°à¬¾à¬…" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "windows" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "ପପୠଅପ ଉଇଣà­à¬¡à­‹à¬•ୠବିନା ଦେଖାଇ ପରବରà­à¬¤à­à¬¤à­€ ଉଇଣà­à¬¡à­‹à¬•ୠମନୋନୀତକର" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "ପପୠଅପ ଉଇଣà­à¬¡à­‹à¬•ୠବିନା ଦେଖାଇ ପୂରà­à¬¬à¬¬à¬°à­à¬¤à­à¬¤à­€ ଉଇଣà­à¬¡à­‹à¬•ୠମନୋନୀତକର" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "ଥମନେଇଲ ନିକଟରେ ଥିବା ଆଇକନକୠଦେଖାଅ" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "ନà­à¬¯à­à¬¨à¬¤à¬® ହୋଇଥିବା ଉଇଣà­à¬¡à­‹à¬•ୠଦେଖାଅ" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "ଅଦଳବଦଳକାରୀ ଗତି" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "ଅଦଳବଦଳକାରୀ ସମଯସୋପାନ" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "ଉଇଣà­à¬¡à­‹ ଅଦଳବଦଳକାରୀ" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ବଦଳକାରୀରେ ଦେଖାଇବା ଉଚିତ" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 ରଙà­à¬—ସà­à¬¥à¬¾à¬¨ ସମରà­à¬¥à¬¨ ୟୋଗାଇଦିଅ" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "ଭିଡିଓ ପୃଷà­à¬ à¬—ାଯନ" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "ଭିଡିଓ ପୃଷà­à¬ à¬—ାଯନ" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 ରଙà­à¬—ସà­à¬¥à¬¾à¬¨" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "ରେଖା ୟୋଗକର" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "ବିନà­à¬¦à­ ୟୋଗକର" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "ବିଭିନà­à¬¨ ଡେସà­à¬•ଟପ କାରà­à­Ÿà­à¬¯à¬•ୠପାଣି ପà­à¬°à¬­à¬¾à¬¬ ୟୋଗକର" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "ପà­à¬°à¬¤à­à¬¯à­‡à¬• ବରà­à¬·à¬¾ ବିନà­à¬¦à­ ମଧà­à¬¯à¬°à­‡ ବିଳମà­à¬¬(in ms) " #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "ପà¬à¬£à­à¬Ÿà¬° ପାଣି ପà­à¬°à¬­à¬¾à¬¬à¬—à­à¬¡à¬¿à¬•ୠସକà­à¬·à¬® କର" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "ରେଖା" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "ଅଫୠସେଟ ମାପକ" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "ବିନà­à¬¦à­" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "ବରà­à¬·à¬¾ ବିଳମà­à¬¬" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "ଶୀରà­à¬·à¬• ତରଙà­à¬—" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "ବରà­à¬·à¬¾à¬•ୠଟେଗଲକର" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "ବରà­à¬·à¬¾ ପà­à¬°à¬­à¬¾à¬¬à¬•ୠଟେଗଲକର" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "ପୋଛିବା ଟୋଗଲକର" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "ପୋଛିବା ପà­à¬°à¬­à¬¾à¬¬à¬•ୠଟେଗଲକର" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "ପାଣି ପà­à¬°à¬­à¬¾à¬¬" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "ପାଣି ଅଫà­à¬¸à­‡à¬Ÿ ମାପକ" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "ଉଇଣà­à¬¡à­‹ ଶୀରà­à¬·à¬•ରୠତରଙà­à¬— ପà­à¬°à¬­à¬¾à¬¬" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "ଲକà­à¬·à­à¬¯ ପà­à¬°à¬­à¬¾à¬¬" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "ଲକà­à¬·à­à¬¯ ଉଇଣà­à¬¡à­‹ ପà­à¬°à¬­à¬¾à¬¬" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "ଲକà­à¬·à­à¬¯ ଉଇଣà­à¬¡à­‹" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "ଘରà­à¬·à¬£" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "ଉଇଣà­à¬¡à­‹ ଟାଣିନିଅ" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "ରିଜୋଲà­à¬¯à­à¬¸à¬¨" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "ଓଲଟାହୋଇଥିବା ଉଇଣà­à¬¡à­‹ ଛିନà­à¬¨à¬•ରିବା " #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "ଉଇଣà­à¬¡à­‹ ସିଭର କର" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "ପà­à¬°à¬­à¬¾à¬¬à¬•ୠଅଂକନକର" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "ଉଇଣà­à¬¡à­‹ ପà­à¬°à¬­à¬¾à¬¬à¬•ୠଅଂକନକର" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "ଉଇଣà­à¬¡à­‹ ଗà­à¬¡à¬¿à¬•ୠଅଂକନକର" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "ପà­à¬°à¬­à¬¾à¬¬à¬•ୠସରà­à¬¬à¬¾à¬§à¬¿à¬• କର" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "ନà­à¬¯à­à¬¨à¬¤à¬® ଗà­à¬°à­€à¬¡ ଆକାର" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "ନà­à¬¯à­à¬¨à¬¤à¬® ଭରà­à¬Ÿà­‡à¬•à­à¬¸ ଗà­à¬°à­€à¬¡ ଆକାର" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠଘà­à¬žà­à¬šà¬¾à¬…" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "ଥରିବା" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "ଛିନà­à¬¨à¬•ରିବା ଓଲଟାଗଲା" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "ଛିନà­à¬¨ ଉଇଣà­à¬¡à­‹" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "ସà­à¬ªà­à¬°à¬¿à¬™à­à¬— ଘରà­à¬·à¬£" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "ସà­à¬ªà­à¬°à¬¿à¬™à­à¬— K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "ସà­à¬ªà­à¬°à¬¿à¬™à­à¬— କନଷà­à¬Ÿà¬¾à¬£à­à¬Ÿ" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "ଉଇଣà­à¬¡à­‹ ଛିନà­à¬¨à¬•ରିବାକୠଟେଗଲକର" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "ଅସà­à¬¥à¬¿à¬° ଉଇଣà­à¬¡à­‹ ପà­à¬°à¬­à¬¾à¬¬ ପାଇଠସà­à¬ªà¬¿à¬™à­à¬— ମୋଡେଲ ଉପୟୋଗକର " #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "ଭରà­à¬Ÿà­‡à¬•à­à¬¸ ଗà­à¬°à­€à¬¡ ରିଡୋଲà­à¬¯à­à¬¸à¬¨" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ଲକà­à¬·à­à¬¯ କେନà­à¬¦à­à¬°à¬¿à¬¤ ହେବା ବେଳେ ଅସà­à¬¥à¬¿à¬° ହେବା ଉଚିତ" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ୟେବେ ଟଣାୟାଠଅସà­à¬¥à¬¿à¬° ହେବା ଉଚିତ" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ଅଂକନ ହେବା ବେଳେ ଅସà­à¬¥à¬¿à¬° ହେବା ଉଚିତ" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "ଉଇଣà­à¬¡à­‹ ୟାହାକି ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾ ବେଳେ ଅସà­à¬¥à¬¿à¬° ହେବା ଉଚିତ" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "ଉଇଣà­à¬¡à­‹à¬•ୠସରà­à¬¬à¬¾à¬§à¬¿à¬• କିମà­à¬¬à¬¾ ଅଣ-ସରà­à¬¬à¬¾à¬§à¬¿à¬• କରିବା ବେଳେ ଅସà­à¬¥à¬¿à¬° ପà­à¬°à¬­à¬¾à¬¬" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "ଅସà­à¬¥à¬¿à¬° ଉଇଣà­à¬¡à­‹" #~ msgid "Command line 0" #~ msgstr "ଆଦେଶ ରେଖା à­¦ " #~ msgid "Run command 0" #~ msgstr "ଚଳାଅ ଆଦେଶ à­¦" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "ସà­à¬•à­à¬°à¬¿à¬¨à¬¸à¬Ÿ ଆଦେଶ ରେଖା" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "ସà­à¬•à­à¬°à¬¿à¬¨à¬¸à¬Ÿ ଆଦେଶ ରେଖା" #~ msgid "Filter Linear" #~ msgstr "ଫିଲà­à¬Ÿà¬° ରୌଖୀକ:" #~ msgid "Use linear filter when zoomed in" #~ msgstr "ୟେବେ ବଡ ହୋଇଥାଠରୈଖୀକ ଫିଲà­à¬Ÿà¬° ଉପୟୋଗକର" #~ msgid "Zoom Desktop" #~ msgstr "ଡେସà­à¬•ଟପ ବଡକର" #~ msgid "Zoom In" #~ msgstr "ବଡକର" #~ msgid "Zoom Out" #~ msgstr "ଛୋଟ କର" #~ msgid "Zoom Pan" #~ msgstr "ଜà­à¬® ପାନ" #~ msgid "Zoom Speed" #~ msgstr "ଜà­à¬® ଗତି" #~ msgid "Zoom Timestep" #~ msgstr "ଜà­à¬® ସମଯସୋପାନ" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ଜà­à¬® à¬à¬¬à¬‚ ପà­à¬¯à¬¾à¬¨ ଡେସà­à¬•ଟପ ଘନକà­à¬·à­‡à¬¤à­à¬°" #~ msgid "Zoom factor" #~ msgstr "ଜà­à¬® କାରଣ" #~ msgid "Zoom pan" #~ msgstr "ଜà­à¬® ପାନ " #~ msgid "Decrease window opacity" #~ msgstr "ଉଇଣà­à¬¡à­‹ ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ହà­à¬°à¬¾à¬¸à¬•ର" #~ msgid "Increase window opacity" #~ msgstr "ଉଇଣà­à¬¡à­‹ ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ବୃଦà­à¬§à¬¿à¬•ର" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "ଉଇଣà­à¬¡à­‹ ପାଇଠଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ମୂଲà­à¬¯à¬—à­à¬¡à¬¿à¬• ୟାହାକି ଡିଫଲà­à¬Ÿà¬°à­‡ ସà­à¬¬à¬šà­à¬› ହେବା ଉଚିତ" #~ msgid "Opacity window values" #~ msgstr "ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ଉଇଣà­à¬¡à­‹ ମୂଲà­à¬¯à¬—à­à¬¡à¬¿à¬•" #~ msgid "Opacity windows" #~ msgstr "ଅସà­à¬¬à¬šà­à¬›à¬¤à¬¾ ଉଇଣà­à¬¡à­‹" #~ msgid "Background Images" #~ msgstr "ପୃଷà­à¬ à¬­à­‚ମି ଚିତà­à¬°à¬—à­à¬¡à¬¿à¬•" #~ msgid "Background images" #~ msgstr "ପୃଷà­à¬ à¬­à­‚ମି ଚିତà­à¬°à¬—à­à¬¡à¬¿à¬•" #~ msgid "Place windows on a plane" #~ msgstr "ଗୋଟିଠସମତଳରେ ଉଇଣà­à¬¡à­‹à¬•ୠସà­à¬¥à¬¾à¬ªà¬¨ କର" #~ msgid "Plane Down" #~ msgstr "ସମତଳ ତଳକà­" #~ msgid "Plane Left" #~ msgstr "ସମତଳ ବାମକà­" #~ msgid "Plane Right" #~ msgstr "ସମତଳ ଡାହାଣକà­" #~ msgid "Plane To Face 1" #~ msgstr "୧କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane To Face 10" #~ msgstr "୧୦କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane To Face 11" #~ msgstr "୧୧କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane To Face 12" #~ msgstr "୧୨କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane To Face 2" #~ msgstr "୨କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane To Face 3" #~ msgstr "୩କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane To Face 4" #~ msgstr "୪କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane To Face 5" #~ msgstr "୫କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane To Face 6" #~ msgstr "୬କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane To Face 7" #~ msgstr "୭କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane To Face 8" #~ msgstr "୮କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane To Face 9" #~ msgstr "୯କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane Up" #~ msgstr "ସମତଳ ଉପର" #~ msgid "Plane down" #~ msgstr "ସମତଳ ତଳକà­" #~ msgid "Plane left" #~ msgstr "ସମତଳ ବାମକà­" #~ msgid "Plane right" #~ msgstr "ସମତଳ ବାମକà­" #~ msgid "Plane to face 1" #~ msgstr "୧କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane to face 10" #~ msgstr "୧୦କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane to face 11" #~ msgstr "୧୧କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane to face 12" #~ msgstr "୧୨କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane to face 2" #~ msgstr "୨କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane to face 3" #~ msgstr "୩କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane to face 4" #~ msgstr "୪କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane to face 5" #~ msgstr "୫କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane to face 6" #~ msgstr "୬କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane to face 7" #~ msgstr "୭କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane to face 8" #~ msgstr "୮କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane to face 9" #~ msgstr "୯କୠସମà­à¬®à­à¬–ୀନ ହେବା ପାଇଠସମତଳ" #~ msgid "Plane up" #~ msgstr "ସମତଳ ଉପର" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ଡେସà­à¬•ଟପ ଉଇଣà­à¬¡à­‹ ଅସà­à¬¬à¬šà­à¬›à¬¾à¬¤à¬¾ ଫିକା ହେବା ସମଯ ।" #, fuzzy #~ msgid "Dialog" #~ msgstr "टोण डायलिनà¥à¤• (&T)" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "विनà¥à¤¡à¥‹ मैनेजर" #, fuzzy #~ msgid "Notification" #~ msgstr "कà¥à¤°à¤¿à¤¯à¤¾" #~ msgid "Unknown" #~ msgstr "अनंजान" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "अवधि" #, fuzzy #~ msgid "Do not modify" #~ msgstr "किसी को लोग न करें" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "तà¥à¤°à¤¿à¤œà¥à¤¯à¤¾" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D " #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "टाइम" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "windows" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "निमà¥à¤¨à¤¤à¤® &GID" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D " #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "टाइम" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "लोकल टाइम" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "लोकल टाइम" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "कà¥à¤°à¤¿à¤¯à¤¾" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "सà¥à¤Ÿà¥‡à¤ªà¤¿à¤—ं" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "फिलà¥à¤Ÿà¤° सैट करें" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "सेरà¥à¤µà¤° सार" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "windows" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "windows" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "छोडं दिया \n" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "टाइम" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Command line %d" #~ msgstr "कमांड:" #, fuzzy #~ msgid "Run command %d" #~ msgstr "कमांड:" #, fuzzy #~ msgid "Move Window Types" #~ msgstr "संभरक" #, fuzzy #~ msgid "Corners" #~ msgstr "कोरà¥à¤¨à¤¿à¤¶" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "फà¥à¤²à¥‹à¤ªà¥€ डिसà¥à¤•" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Terminate" #~ msgstr "टरà¥à¤®à¤¿à¤¨à¤²" compiz-0.9.11+14.04.20140409/po/gu.po0000644000015301777760000034441312321343002017074 0ustar pbusernogroup00000000000000# translation of compiz.po to Gujarati # Hindi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Prasanth Kurian # # Krunaliben Patel , 2007. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2007-12-17 12:25+0530\n" "Last-Translator: \n" "Language-Team: gist Gujarati team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "X-Generator: KBabel 1.11.4\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "ડેસà«àª•ટોપ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "વિનà«àª¡à«‹ વà«àª¯àªµàª¸à«àª¥àª¾àªªàª¨" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "કંઈ નહિં" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "માપદંડ" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "મહતà«àª¤àª® કરો" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "વિનà«àª¡à«‹àª¨à«‡ આડી રીતે મહતà«àª¤àª® બનાવો" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "વિનà«àª¡à«‹àª¨à«‡ ઊભી રીતે મહતà«àª¤àª® બનાવો" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "નà«àª¯à«‚નતમ કરેલ" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "આપોઆપ-વધારો" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "વિનà«àª¡à«‹àª¨à«àª‚ મેનà«" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "જà«àª¯àª¾àª°à«‡ વિનà«àª¡à«‹ શીરà«àª·àª• પટà«àªŸà«€ પર માઉસ પૈડà«àª‚ સરકાવી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ કરવાની કà«àª°àª¿àª¯àª¾." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "àªàª¾àª‚ખાપણાનો પà«àª°àª•ાર" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "મેટાસીટી થીમ સકà«àª°àª¿àª¯ વિનà«àª¡à«‹ અપારદરà«àª¶àª•તા" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "મેટાસીટી થીમ સકà«àª°àª¿àª¯ વિનà«àª¡à«‹ અપારદરà«àª¶àª•તા છાયા" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "મેટાસીટી થીમ અપારદરà«àª¶àª•તા" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "મેટાસીટી થીમ અપારદરà«àª¶àª•તા છાયા" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "મેટાસીટી થીમ શણગારો સાથે સકà«àª°àª¿àª¯ વિનà«àª¡à«‹ માટે વાપરવાની અપારદરà«àª¶àª•તા" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "મેટાસીટી થીમ શણગારો માટે વાપરવાની અપારદરà«àª¶àª•તા" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "સકà«àª°àª¿àª¯ વિનà«àª¡à«‹àª¨à«‡ મેટાસીટી થીમ શણગારો વડે અપારદરà«àª¶àª•માંથી દૃશà«àª¯àª®àª¾àª¨àª®àª¾àª‚ લાવવા માટે છાયાંકિત " "કરો" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "વિનà«àª¡à«‹àª¨à«‡ મેટાસીટી થીમ શણગારો વડે અપારદરà«àª¶àª•માંથી દૃશà«àª¯àª®àª¾àª¨àª®àª¾àª‚ લાવવા માટે છાયાંકિત કરો" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "શીરà«àª·àª• પટà«àªŸà«€ માઉસ પૈડà«àª‚ કà«àª°àª¿àª¯àª¾" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "વિનà«àª¡à«‹ શણગારો માટે વપરાતા àªàª¾àª‚ખાપણાનો પà«àª°àª•ાર" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "મેટાસીટી થીમ વાપરો" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "જà«àª¯àª¾àª°à«‡ વિનà«àª¡à«‹ શણગારો દોરી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ મેટાસીટી થીમ વાપરો" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "વિનà«àª¡à«‹ બંધ કરો" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "વિનà«àª¡à«‹àª¨à«‡ મહતà«àª¤àª® સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚થી પાછી લાવો" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "વિનà«àª¡à«‹àª¨à«‡ મહતà«àª¤àª® સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ લાવો" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "વિનà«àª¡à«‹àª¨à«‡ નà«àª¯à«‚નતà«àª¤àª® સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ લાવો" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "ભરવાના રંગની ટિપà«àªªàª£à«€" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "સà«àªŸà«àª°à«‹àª• રંગની ટિપà«àªªàª£à«€" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "સાફ કરો" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "દોરો" #: ../metadata/annotate.xml.in.h:7 #, fuzzy msgid "Draw using tool" msgstr "બà«àªŸ દરમિયાન" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "ટિપà«àªªàª£à«€àª“ માટે રંગ ભરો" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "લીટી પહોળાઈ" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "ટિપà«àªªàª£à«€àª“ માટે લીટી પહોળાઈ" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "ટિપà«àªªàª£à«€àª“ માટે સà«àªŸà«àª°à«‹àª• રંગ" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "સà«àªŸà«àª°à«‹àª• પહોળાઈ" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "ટિપà«àªªàª£à«€àª“ માટે સà«àªŸà«àª°à«‹àª• પહોળાઈ" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "૪xદà«àªµàª¿àª°à«‡àª–ીય" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "આલà«àª«àª¾ àªàª¾àª‚ખાપણà«àª‚" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "આલà«àª«àª¾ àªàª¾àª‚ખાપણà«àª‚ વિનà«àª¡à«‹" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "àªàª¾àª‚ખાપણà«àª‚ ગાળક" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "કનà«àª«àª¿àª—à«àª¯à«àª°à«‡àª¶àª¨ સાચવો" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "કનà«àª«àª¿àª—à«àª¯à«àª°à«‡àª¶àª¨ સાચવો" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "àªàª¾àª‚ખાપણાની àªàª¡àªª" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "વિનà«àª¡à«‹ àªàª¾àª‚ખી કરો" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "વિનà«àª¡à«‹àª¨àª¾ સà«àªªàª·à«àªŸ ભાગો પાછળ àªàª¾àª‚ખૠકરો" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "કનà«àª«àª¿àª—à«àª¯à«àª°à«‡àª¶àª¨ સાચવો" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "વિનà«àª¡à«‹ àªàª¾àª‚ખી કરો કે જેમને ફોકસ નથી" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "અનà«àª¯ વિનà«àª¡à«‹ દà«àªµàª¾àª°àª¾ ઢંકાઈ ગયેલ સà«àª•à«àª°à«€àª¨ વિસà«àª¤àª¾àª°à«‹ àªàª¾àª‚ખા કરવાનà«àª‚ નિષà«àª•à«àª°àª¿àª¯ કરો." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "àªàª¾àª‚ખૠકરવા માટે વપરાતી ગાળણ પદà«àª§àª¤àª¿" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "àªàª¾àª‚ખૠફોકસ કરો" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "ગોસીયન" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "ગોસિયન તà«àª°àª¿àªœà«àª¯àª¾" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "ગોસિયન મજબૂતાઈ" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "ગોસિયન તà«àª°àª¿àªœà«àª¯àª¾" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "ગોસિયન મજબૂતાઈ" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "મીપમેપ" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "મીપમેપ LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "મીપમેપ વિગત-નà«àª‚-સà«àª¤àª°" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "ધબકાર" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "ધબકાર અસર" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "વિનà«àª¡à«‹ àªàª¾àª‚ખાપણાની àªàª¡àªª" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "વિનà«àª¡à«‹ કે જેઓ ફોકસ àªàª¾àª‚ખાપણાથી અસર પામવા જોઈàª" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "વિનà«àª¡à«‹ કે જેઓ મૂળભૂત રીતે આલà«àª«àª¾ àªàª¾àª‚ખાપણાને વાપરતી હોવી જોઈàª" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "કà«àª²à«‹àª¨ આઉટપà«àªŸ" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "કેટાલોગ પસંદગી" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "આઉટપà«àª¨ કà«àª²à«‹àª¨ નિયંતà«àª°àª•" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command0 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command1 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command10 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command11 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command2 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command3 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command4 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command5 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command6 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command7 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command8 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command9 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command0 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command1 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command10 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command11 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command2 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command3 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command4 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command5 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command6 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command7 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command8 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command9 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command0 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command1 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command10 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command11 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command2 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command3 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command4 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command5 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command6 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command7 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command8 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "કીબાઈનà«àª¡à«€àª‚ કે જે જà«àª¯àª¾àª°à«‡ બોલાવવામાં આવી, તે command9 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "શેલમાં ચલાવવાનà«àª‚ આદેશ વાકà«àª¯ જà«àª¯àª¾àª°à«‡ run_command0 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "શેલમાં ચલાવવાનà«àª‚ આદેશ વાકà«àª¯ જà«àª¯àª¾àª°à«‡ run_command1 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "શેલમાં ચલાવવાનà«àª‚ આદેશ વાકà«àª¯ જà«àª¯àª¾àª°à«‡ run_command10 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "શેલમાં ચલાવવાનà«àª‚ આદેશ વાકà«àª¯ જà«àª¯àª¾àª°à«‡ run_command11 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "શેલમાં ચલાવવાનà«àª‚ આદેશ વાકà«àª¯ જà«àª¯àª¾àª°à«‡ run_command2 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "શેલમાં ચલાવવાનà«àª‚ આદેશ વાકà«àª¯ જà«àª¯àª¾àª°à«‡ run_command3 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "શેલમાં ચલાવવાનà«àª‚ આદેશ વાકà«àª¯ જà«àª¯àª¾àª°à«‡ run_command4 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "શેલમાં ચલાવવાનà«àª‚ આદેશ વાકà«àª¯ જà«àª¯àª¾àª°à«‡ run_command5 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "શેલમાં ચલાવવાનà«àª‚ આદેશ વાકà«àª¯ જà«àª¯àª¾àª°à«‡ run_command6 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "શેલમાં ચલાવવાનà«àª‚ આદેશ વાકà«àª¯ જà«àª¯àª¾àª°à«‡ run_command7 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "શેલમાં ચલાવવાનà«àª‚ આદેશ વાકà«àª¯ જà«àª¯àª¾àª°à«‡ run_command8 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "શેલમાં ચલાવવાનà«àª‚ આદેશ વાકà«àª¯ જà«àª¯àª¾àª°à«‡ run_command9 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "આદેશો :" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "આદેશ '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "સકà«àª°àª¿àª¯ પà«àª²àª—ઈનો" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "પૂરà«àª£àª¸à«àª•à«àª°à«€àª¨ વિનà«àª¡à«‹àª¨à«‡ દોરાવાની પરવાનગી આપવાનà«àª‚ ઓફસà«àª•à«àª°à«€àª¨ પિકà«àª¸àª®à«‡àªªàª®àª¾àª‚ પà«àª¨àªƒàª¦àª¿àª¶àª¾àª®àª¾àª¨ થયેલ નથી" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "સંભળાય તેવી ઘંટડી" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "સંભળાય તેવી સિસà«àªŸàª® ઘંટડી" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "આપોઆપ-વધારો" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "આપોઆપ-વધારો વિલંબ" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "આઉટપà«àªŸ ઉપકરણોની આપોઆપ શોધ" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "પà«àª¨àªƒàª¤àª¾àªœà«àª‚ કરવાના દરની આપોઆપ શોધ" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "શà«àª°à«‡àª·à«àª " #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ફોકસ કરવા માટે કà«àª²àª¿àª• કરો" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "વિનà«àª¡à«‹ પર કà«àª²àª¿àª• કરવાનà«àª‚ ઈનપà«àªŸ ફોકસને તેના પર ખસેડે છે" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "સકà«àª°àª¿àª¯ વિનà«àª¡à«‹ બંધ કરો" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "મૂળભૂત ચિહà«àª¨" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "મૂળભૂત વિનà«àª¡à«‹ ચિહà«àª¨ ચિતà«àª°" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "ડેસà«àª•ટોપ ઘન" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "આઉટપà«àªŸ શોધો" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "પà«àª¨àªƒàª¤àª¾àªœà«àª‚ કરવાનો દર શોધો" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "àªàª¡àªªà«€" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "બચાવ વિનà«àª¡à«‹ પર ફોકસ કરો" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "બચાવ વિનà«àª¡à«‹ પર ફોકસ કરો" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "સામાનà«àª¯ વિકલà«àªªà«‹" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "સામાનà«àª¯ compiz વિકલà«àªªà«‹" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "સરસ" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "કà«àª°àª¿àª¯àª¾àªªàªŸà«àªŸà«€ વિનà«àª¡à«‹ અવગણો છà«àªªàª¾àªµà«‹" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "બધી વિનà«àª¡à«‹àª¨à«‡ સંતાડીને ડેસà«àª•ટોપ પà«àª°àª•ાશન કરો" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "જà«àª¯àª¾àª°à«‡ ડેસà«àª•ટોપ બતાવો સà«àª¥àª¿àª¤àª¿ દાખલ કરી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ કà«àª°àª¿àª¯àª¾àªªàªŸà«àªŸà«€àª®àª¾àª‚ નહિં હોય તેવી વિનà«àª¡à«‹ " "છà«àªªàª¾àªµà«‹" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "આડà«àª‚ વરà«àªšà«àª¯à«àª…લ માપ" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "જà«àª¯àª¾àª°à«‡ મહતà«àª¤àª® થયેલ હોય તà«àª¯àª¾àª°à«‡ ઈશારાઓ અવગણો" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "માપ વધારવાનà«àª‚ અને àªàª¸à«àªªà«‡àª•à«àªŸ ઈશારાઓ અવગણો જà«àª¯àª¾àª°à«‡ વિનà«àª¡à«‹ મહતà«àª¤àª® થયેલ હોય" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "પસંદિત વિનà«àª¡à«‹ વધારવા પહેલાંનો અંતરાલ" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "પીંગ સંદેશાઓ વચà«àªšà«‡àª¨à«‹ અંતરાલ" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "પà«àª°àª•ાશન" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "વરà«àª¤àª®àª¾àª¨àª®àª¾àª‚ સકà«àª°àª¿àª¯ પà«àª²àª—ઈનોની યાદી" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "આઉટપà«àªŸ ઉપકરણો વરà«àª£àªµàª¤à«€ શબà«àª¦àª®àª¾àª³àª¾àª“ની યાદી" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "નીચી વિનà«àª¡à«‹" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "અનà«àª¯ વિનà«àª¡à«‹ હેઠળ નીચી વિનà«àª¡à«‹" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "વિનà«àª¡à«‹àª¨à«‡ આડી રીતે મહતà«àª¤àª® બનાવો" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "વિનà«àª¡à«‹àª¨à«‡ ઊભી રીતે મહતà«àª¤àª® બનાવો" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "સકà«àª°àª¿àª¯ વિનà«àª¡à«‹àª¨à«‡ મહતà«àª¤àª® સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ લાવો" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "સકà«àª°àª¿àª¯ વિનà«àª¡à«‹àª¨à«‡ આડી રીતે મહતà«àª¤àª® બનાવો" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "સકà«àª°àª¿àª¯ વિનà«àª¡à«‹àª¨à«‡ ઊભી રીતે મહતà«àª¤àª® બનાવો" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "સકà«àª°àª¿àª¯ વિનà«àª¡à«‹àª¨à«‡ નà«àª¯à«‚નતà«àª¤àª® સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ લાવો" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "સામાનà«àª¯" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "ડેસà«àª•ટોપની સંખà«àª¯àª¾" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "વરà«àªšà«àª¯à«àª…લ ડેસà«àª•ટોપની સંખà«àª¯àª¾" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "ઊભા કોરા સમયગાળા દરમà«àª¯àª¾àª¨ માતà«àª° સà«àª•à«àª°à«€àª¨ સà«àª§àª¾àª°àª¾àª“ જ કરે છે" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "આઉટપà«àªŸ" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "પીંગ વિલંબ" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "કà«àª²àª¿àª• કરવા પર વધારો" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "વિનà«àª¡à«‹ વધારો" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "પસંદિત વિનà«àª¡à«‹àª¨à«‡ અંતરાલ પછી વધારો" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "વિનà«àª¡à«‹àª¨à«‡ બીજી બધી વિનà«àª¡à«‹àª¨à«€ ઉપર લાવો" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "જà«àª¯àª¾àª°à«‡ કà«àª²àª¿àª• થાય તà«àª¯àª¾àª°à«‡ વિનà«àª¡à«‹ વધારો" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&રીફેશ" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "આડા વરà«àªšà«àª¯à«àª…લ માપ માટે સà«àª•à«àª°à«€àª¨ માપ ગà«àª£àª•" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "ઊભા વરà«àªšà«àª¯à«àª…લ માપ માટે સà«àª•à«àª°à«€àª¨ માપ ગà«àª£àª•" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "ડેસà«àª•ટોપ બતાવો" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "ધીમ àªàª¨à«€àª®à«‡àª¶àª¨à«‹" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "ચપળ" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank માં સà«àª®à«‡àª³ કરો" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "લખાણ ગાળણ" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "લખાણ ગાળક" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "લખાણ ગાળણ" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "દર કે જેનાથી સà«àª•à«àª°à«€àª¨ પà«àª¨àªƒàª¦à«‹àª°àª¾àª¯ છે (સમય/સેકનà«àª¡à«‹)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "વિનà«àª¡à«‹àª¨à«‡ મહતà«àª¤àª® કરેલ સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ બદલો" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "વિનà«àª¡à«‹ આડી રીતે મહતà«àª¤àª® કરેલ સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ બદલો" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "વિનà«àª¡à«‹ ઊભી રીતે મહતà«àª¤àª® કરેલ સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ બદલો" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "વિનà«àª¡à«‹ પડછાયાવાળી બદલો" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "સકà«àª°àª¿àª¯ વિનà«àª¡à«‹ મહતà«àª¤àª® કરેલ સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ બદલો" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "સકà«àª°àª¿àª¯ વિનà«àª¡à«‹ આડી રીતે મહતà«àª¤àª® કરેલ સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ બદલો" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "સકà«àª°àª¿àª¯ વિનà«àª¡à«‹ ઊભી રીતે મહતà«àª¤àª® કરેલ સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ બદલો" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "સકà«àª°àª¿àª¯ વિનà«àª¡à«‹ પડછાયાવાળી બદલો" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "ધીમા àªàª¨à«€àª®à«‡àª¶àª¨à«‹àª¨à«‹ વપરાશ બદલો" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "સકà«àª°àª¿àª¯ વિનà«àª¡à«‹àª¨à«‡ મહતà«àª¤àª® સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚થી પાછી લાવો" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "પૂરà«àª£àª¸à«àª•à«àª°à«€àª¨ વિનà«àª¡à«‹àª¨à«àª‚ પà«àª¨àªƒàª¦àª¿àª¶àª¾àª®àª¾àª¨ દૂર કરો" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "જà«àª¯àª¾àª°à«‡ સà«àª•à«àª°à«€àª¨ પરિવહન થઈ રહી હોય તà«àª¯àª¾àª°à«‡ આછો પà«àª°àª•ાશ વાપરો" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "ઊભà«àª‚ વરà«àªšà«àª¯à«àª…લ માપ" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "વિનà«àª¡à«‹ મેનૠબટન બાઈનà«àª¡à«€àª‚ગ" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "વિનà«àª¡à«‹ મેનૠકી બાઈનà«àª¡à«€àª‚ગ" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "પà«àª°àªµà«‡àª—" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "ચિતà«àª° સંતà«àª²àª¿àª¤ કરો" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "ટોચની બાજà«àª¨à«àª‚ ચિતà«àª° ફેરવવા માટે સંતà«àª²àª¿àª¤ કરો" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "આગળની સà«àª²àª¾àªˆàª¡ પર અદà«àª¯àª¤àª¨" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Skydome àªàª¨à«€àª®à«‡àªŸ કરો" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "જà«àª¯àª¾àª°à«‡ ઘન ફેરવી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ skydome ને àªàª¨à«€àª®à«‡àªŸ કરો" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "ઘનની ટોચ અને તળિયેની બાજà«àª¨àª¾ રંગ" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "skydome-fallback ઢાળના રંગ-અટકણ તળિયા માટે વાપરવાનો રંગ" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "skydome-fallback ઢાળના રંગ-અટકણ ટોચ માટે વાપરવાનો રંગ" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "ઘન રંગ" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "ઘન રંગ" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "ડેસà«àª•ટોપ ઘન" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "ફોલà«àª¡ પà«àª°àªµà«‡àª—" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "ફોલà«àª¡ àªàª¡àªª" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "ફોલà«àª¡ સમયપગલà«àª‚" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "મીપમેપ બનાવો જà«àª¯àª¾àª°à«‡ ઊંચી ગà«àª£àªµàª¤à«àª¤àª¾ ખેંચવા માટે શકà«àª¯ હોય" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "પહેલાંની સà«àª²àª¾àªˆàª¡ પર પાછા જાવ" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "ચિતà«àª° ફાઈલો" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "skydome માટે લખાણ તરીકે વાપરવાનà«àª‚ ચિતà«àª°" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "જો ફેરવવાનà«àª‚ માઉસથી કરવાનà«àª‚ હોય તો જ ઘન પારદરà«àª¶àª•તાનો આરંભ કરે છે." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ઘનની અંદર" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "ઘનની અંદર" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "PNG અને SVG ફાઈલોની યાદી કે જે ઘનની ટોચે રેનà«àª¡àª° થવી જોઈàª" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "વિવિધ આઉટપà«àªŸ સà«àª¥àª¿àª¤àª¿" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "વિવિધ ઘન" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "આગળની સà«àª²àª¾àªˆàª¡" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "મોટા ઘન પર" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ફેરવવા દરમà«àª¯àª¾àª¨ અપારદરà«àª¶àª•તા" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "જà«àª¯àª¾àª°à«‡ ફેરવી રહà«àª¯àª¾ નહિં હોય તà«àª¯àª¾àª°àª¨à«€ અપારદરà«àª¶àª•તા" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ફેરવવા દરમà«àª¯àª¾àª¨ ડેસà«àª•ટોપ વિનà«àª¡à«‹àª¨à«€ અપારદરà«àª¶àª•તા." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "જà«àª¯àª¾àª°à«‡ ફેરવી રહà«àª¯àª¾ નહિં હોય તà«àª¯àª¾àª°à«‡ ડેસà«àª•ટોપ વિનà«àª¡à«‹àª¨à«€ અપારદરà«àª¶àª•તા." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "વિનà«àª¡à«‹àª¨à«‡ ઘન પર મૂકો" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "પહેલાંની સà«àª²àª¾àªˆàª¡" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "skydome રેનà«àª¡àª° કરો" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "ચિતà«àª° ખેંચો" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "ઘનની ટોચની બાજૠઆવરવા માટે ચિતà«àª°à«‹ ખેંચો" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "જો ઘણાબધા આઉટપà«àªŸ ઉપકરણો વપરાતા હોય તો ઘન કેવી રીતે દરà«àª¶àª¾àªµàªµàª¾àª®àª¾àª‚ આવે છે તે પસંદ કરે છે." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Skydome ઢાળ અંત રંગ" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Skydome ઢાળ શરૂઆત રંગ" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Skydome ચિતà«àª°" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "àªàª¡àªª" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "સમયપગલà«àª‚" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "માતà«àª° માઉસ ફેરવવા પર જ પારદરà«àª¶àª•તા" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "ફોલà«àª¡ કરશો નહિં" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "ઘન ફોલà«àª¡ કરશો નહિં" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus નિયંતà«àª°àª£ પાશà«àªµàª­àª¾àª—" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "શણગાર લખાણો માટે મીપમેપને બનાવવા માટે પરવાનગી આપો" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "આદેશો :" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "શણગારનાર આદેશ વાકà«àª¯ કે જે ચલાવવામાં આવે છે જો કોઈ શણગારનાર પહેલાથી ચાલી રહà«àª¯à«‹ નહિં હોય" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "પડછાયા X ઓફસેટ મૂકો" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "પડછાયા Y ઓફસેટ મૂકો" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "પડછાયા રંગ મૂકો" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "પડછાયા અપારદરà«àª¶àª•તા મૂકો" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "પડછાયા તà«àª°àª¿àªœà«àª¯àª¾ મૂકો" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "પડછાયા રંગ" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "પડછાયા ઓફસેટ X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "પડછાયા ઓફસેટ Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "પડછાયા અપાદરà«àª¶àª•તા" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "પડછાયા તà«àª°àª¿àªœà«àª¯àª¾" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "વિનà«àª¡à«‹ શણગાર" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "વિનà«àª¡à«‹ શણગારો" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "વિનà«àª¡à«‹ કે જેને શણગાર થવો જોઈàª" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "વિનà«àª¡à«‹ કે જેને પડછાયો હોવો જોઈàª" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "સà«àª¥àª¾àªªàª¨ પૂરà«àª‚ થયà«àª‚" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "ચલ Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "આછાપણાનો સમય" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "નાનà«àª‚ કરવા પર/ખોલવા પર/બંધ કરવા પર આછà«àª‚ કરો" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "આછાપણાની àªàª¡àªª" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "આછાપણાનો સમય" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "વિનà«àª¡à«‹ નાનà«àª‚ કરો/ખોલો/બંધ કરો ઘટનાઓ પર આછાપણાની અસર" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "સિસà«àªŸàª® બીપ પર આછાપણાની અસર" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "વિનà«àª¡à«‹ આછી કરો જà«àª¯àª¾àª°à«‡ જોડાયેલ હોય અને જà«àª¯àª¾àª°à«‡ જોડાયેલ નહિં હોય તà«àª¯àª¾àª°à«‡ ઘાટી કરો" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "સંપૂરà«àª£àª¸à«àª•à«àª°à«€àª¨ દેખીતી ઘંટડી" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "સિસà«àªŸàª® બીપ પર સંપૂરà«àª£àª¸à«àª•à«àª°à«€àª¨ સà«àª•à«àª°à«€àª¨ આછાપણાની અસર" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "દૃશà«àª¯àª®àª¾àª¨ ઘંટડી" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "વિનà«àª¡à«‹ આછાપણાની àªàª¡àªª" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "વિનà«àª¡à«‹ કે જે ખેંચાણ સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ ખેંચાવી જોઈàª" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "વિનà«àª¡à«‹ કે જેઓ આછી થવી જોઈàª" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "માઉનà«àªŸ બિંદà«" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "માઉનà«àªŸ બિંદà«" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "વપરાશકરà«àª¤àª¾àªœàª—à«àª¯àª¾ ફાઈલ સિસà«àªŸàª®" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "વપરાશકરà«àª¤àª¾àªœàª—à«àª¯àª¾ ફાઈલ સિસà«àªŸàª®" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf નિયંતà«àª°àª£ બેકેનà«àª¡" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib મà«àª–à«àª¯ લà«àªª આધાર" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "ટરà«àª®àª¿àª¨àª² ખોલો" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "સંવાદ ચલાવો" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "આદેશ '%1'" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "સà«àª•à«àª°à«€àª¨àª¶à«‹àªŸ આદેશ વાકà«àª¯" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "મà«àª–à«àª¯ મેનૠબતાવો" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "કારà«àª¯àª•à«àª°àª® ચલાવો સંવાદ બતાવો" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "મà«àª–à«àª¯ મેનૠબતાવો" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "ફોટો લો" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "વિનà«àª¡à«‹àª¨à«‹ ફોટો લો" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "આદેશ '%1'" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "વિનà«àª¡à«‹ સà«àª•à«àª°à«€àª¨àª¶à«‹àªŸ આદેશ વાકà«àª¯" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini સપાટ ફાઈલ બેકેનà«àª¡" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ફાઈલ બદલી સૂચન પà«àª²àª—ઈન" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig નિયંતà«àª°àª£ બેકેનà«àª¡" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "નà«àª¯à«‚નતમ અસર" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "વિનà«àª¡à«‹ નà«àª¯à«‚નતમ કરો" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "નà«àª¯à«‚નતમ કરવાની àªàª¡àªª" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "સમયનોંધ નà«àª¯à«‚નતમ કરો" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "પડછાયા વિરોધી" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "પડછાયા વિરોધી" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "જà«àª¯àª¾àª°à«‡ વિનà«àª¡à«‹ નાની થાય અને નાનામાંથી પાછી આવે તà«àª¯àª¾àª°à«‡ પરિવહન કરવાની વિનà«àª¡à«‹" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "જà«àª¯àª¾àª°à«‡ નà«àª¯à«‚નતમ કરવાની હોય કે જેનà«àª‚ પરિવહન થવà«àª‚ જોઈઠતે વિનà«àª¡à«‹" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "ચલ Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "કારà«àª¯àª¸à«àª¥àª³ વિસà«àª¤àª¾àª°àª®àª¾àª‚ ચલ Y યામાકà«àª·" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "વિનà«àª¡à«‹àª¨à«àª‚ સરà«àªµàª°-બાજૠસà«àª¥àª¾àª¨ સà«àª§àª¾àª°àª¶à«‹ નહિં જà«àª¯àª¾àª‚ સà«àª§à«€ ખસેડવાનà«àª‚ સમાપà«àª¤ નહિં થાય" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "વિનà«àª¡à«‹ ખસેડવાનà«àª‚ આરંભ કરો" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "આળસૠસà«àª¥àª¾àª¨à«€àª•રણ" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "વિનà«àª¡à«‹ ખસેડો" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "વિનà«àª¡à«‹àª¨à«‡ ખસાડો" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "અપારદરà«àª¶àª•તા" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "ખસી રહેલ વિનà«àª¡à«‹àª¨à«€ અપારદરà«àª¶àª•તાનà«àª‚ સà«àª¤àª°" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "મહતà«àª¤àª® થયેલ વિનà«àª¡à«‹àª¨à«‡ ખેંચતી વખતે સà«àª¨à«‡àªªàª“ફ કરો અને આપોઆપ મહતà«àª¤àª® સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚થી પાછી લાવો" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "મહતà«àª¤àª® થયેલ વિનà«àª¡à«‹ સà«àª¨à«‡àªªàª“ફ કરો" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "વિનà«àª¡à«‹àª¨à«‡ ખસેડવાનà«àª‚ શરૂ કરો" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "તેજસà«àªµà«€àª¤àª¾" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "તેજસà«àªµà«€àª¤àª¾" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "તેજસà«àªµà«€àª¤àª¾" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "તેજસà«àªµà«€àª¤àª¾" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "અપારદરà«àª¶àª•તા ઘટાડો" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "અપારદરà«àª¶àª•તા વધારો" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "અપારદરà«àª¶àª•તા બદલો પગલà«àª‚" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "અપારદરà«àª¶àª•તા બદલો પગલà«àª‚" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "અપારદરà«àª¶àª•તા પગલà«àª‚" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "ખસી રહેલ વિનà«àª¡à«‹àª¨à«€ અપારદરà«àª¶àª•તાનà«àª‚ સà«àª¤àª°" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "ફેરવવા દરમà«àª¯àª¾àª¨ અપારદરà«àª¶àª•તા" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "કનà«àª«àª¿àª—à«àª¯à«àª°à«‡àª¶àª¨ સાચવો" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "કનà«àª«àª¿àª—à«àª¯à«àª°à«‡àª¶àª¨ સાચવો" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "કનà«àª«àª¿àª—à«àª¯à«àª°à«‡àª¶àª¨ સાચવો" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "કનà«àª«àª¿àª—à«àª¯à«àª°à«‡àª¶àª¨ સાચવો" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "વિનà«àª¡à«‹ શણગારો" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "અપારદરà«àª¶àª• વિનà«àª¡à«‹ કિંમતો" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "નકશા વિનà«àª¡à«‹" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "વિનà«àª¡à«‹ કે જેઓ મૂળભૂત રીતે ગોઠવાયેલ હોવી જોઈàª" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "વિનà«àª¡à«‹ કે જે મૂળભૂત રીતે અરà«àª§àªªàª¾àª°àª¦àª°à«àª¶àª• હોવી જોઈàª" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "વિનà«àª¡à«‹ કે જેઓ મૂળભૂત રીતે ગોઠવાયેલ હોવી જોઈàª" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "વિનà«àª¡à«‹ ગોઠવણી માટે વાપરવાનો અલગોરિધમ" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "ધોધવાળà«àª‚" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "કેનà«àª¦à«àª°àª¿àª¤ થયેલ" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "વિનà«àª¡à«‹ વà«àª¯àªµàª¸à«àª¥àª¾àªªàª¨" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "બચાવ વિનà«àª¡à«‹ પર ફોકસ કરો" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "આડા દૃશà«àª¯àªªà«‹àª°à«àªŸ સà«àª¥àª¾àª¨à«‹" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "વિનà«àª¡à«‹ મૂકો" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "વિનà«àª¡à«‹àª¨à«‡ જà«àª¯àª¾àª°à«‡ જોડાય તà«àª¯àª¾àª°à«‡ યોગà«àª¯ સà«àª¥àª¾àª¨à«‡ મૂકો" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "ગોઠવણી સà«àª¥àª¿àª¤àª¿" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "રેનà«àª¡àª®" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "જો વિવિધ આઉટપà«àªŸ ઉપકરણો વપરાય તો વિનà«àª¡à«‹ કà«àª¯àª¾àª‚ ખેંચાય તે પસંદ કરે છે." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "ચપળ" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "બધા આઉટપà«àªŸ ઉપકરણો પર" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "ઊભા દૃશà«àª¯àªªà«‹àª°à«àªŸ સà«àª¥àª¾àª¨à«‹" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "વિનà«àª¡à«‹ જગà«àª¯àª¾ ઉકેલો" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "વિનà«àª¡à«‹ કે જેઓ મૂળભૂત રીતે ગોઠવાયેલ હોવી જોઈàª" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "વિનà«àª¡à«‹ કે જે ચોકà«àª•સ દૃશà«àª¯àªªà«‹àª°à«àªŸàª®àª¾àª‚ મૂળભૂત રીતે ગોઠવાયેલ હોવા જોઈàª" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "વિનà«àª¡à«‹ શણગારો" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "ઉકેલો" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X સà«àª¥àª¾àª¨à«‹" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X દૃશà«àª¯àªªà«‹àª°à«àªŸ સà«àª¥àª¾àª¨à«‹" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X સà«àª¥àª¾àª¨ કિંમતો" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y સà«àª¥àª¾àª¨à«‹" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y દૃશà«àª¯àªªà«‹àª°à«àªŸ સà«àª¥àª¾àª¨à«‹" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y સà«àª¥àª¾àª¨ કિંમતો" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png ચિતà«àª° લાવનાર" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Regex જોડણી" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Regex વિનà«àª¡à«‹ જોડણી" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "કિનારી રંગ" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "બાહà«àª¯ કિનારી અને લંબચોરસ માપ સà«àª¥àª¿àª¤àª¿àª“ માટે વપરાતો કિનારી રંગ" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "મૂળભૂત માપ બદલવાની સà«àª¥àª¿àª¤àª¿" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "વિનà«àª¡à«‹àª¨à«àª‚ માપ બદલવા માટે વપરાતી મૂળભૂત સà«àª¥àª¿àª¤àª¿" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "રંગ ભરો" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "લંબચોરસ માપ બદલો સà«àª¥àª¿àª¤àª¿ માટે વપરાતો ભરવાનો રંગ" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "બાહà«àª¯ કિનારી" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "બાહà«àª¯ કિનારી માપ બદલો વિનà«àª¡à«‹" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "લંબચોરસ" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "લંબચોરસ માપ બદલો વિનà«àª¡à«‹" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "વિનà«àª¡à«‹àª¨à«àª‚ માપ બદલો" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "વિનà«àª¡à«‹àª¨à« માપ બદલો" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "વિનà«àª¡à«‹àª¨à«àª‚ માપ બદલવાનà«àª‚ શરૂ કરો" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "વિનà«àª¡à«‹àª¨à«‡ ખેંચીને તેનà«àª‚ માપ બદલવાનà«àª‚ શરૂ કરો" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "વિનà«àª¡à«‹àª¨à«àª‚ સામાનà«àª¯ રીતે માપ બદલવાનà«àª‚ શરૂ કરો" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "બાહà«àª¯ કિનારી સાથે વિનà«àª¡à«‹àª¨à«àª‚ માપ બદલવાનà«àª‚ શરૂ કરો" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "લંબચોરસ સાથે વિનà«àª¡à«‹àª¨à«àª‚ માપ બદલવાનà«àª‚ શરૂ કરો" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "ખેંચો" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "વિનà«àª¡à«‹àª¨à«àª‚ માપ બદલવા ખેંચો" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "વિનà«àª¡à«‹ કે જેના માટે સામાનà«àª¯ માપ બદલવાનà«àª‚ વપરાવà«àª‚ જોઈàª" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "વિનà«àª¡à«‹ કે બાહà«àª¯ કિનારીનà«àª‚ માપ બદલવા માટે વાપરવામાં આવવી જોઈàª" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "વિનà«àª¡à«‹ કે લંબચોરસનà«àª‚ માપ બદલવા માટે વાપરવામાં આવવી જોઈàª" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "વિનà«àª¡à«‹ કે ખેંચવાનà«àª‚ માપ બદલવા માટે વાપરવામાં આવવી જોઈàª" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "બાજૠપલટાવ DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "બાજૠપલટાવ ખસેડો" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "બાજૠપલટાવ નિરà«àª¦à«‡àª¶àª•" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "પલટાવ સમય" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "ડાબા દૃશà«àª¯àª®àª¾àª‚ પલટાવો અને નિરà«àª¦à«‡àª¶àª• લપેટો" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "આગળના દૃશà«àª¯ આગળ પલટાવ જà«àª¯àª¾àª°à«‡ ઓબà«àªœà«‡àª•à«àªŸàª¨à«‡ સà«àª•à«àª°à«€àª¨àª¨à«€ બાજૠપર ખેંચી રહà«àª¯àª¾ હોય" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "આગળના દૃશà«àª¯àª®àª¾àª‚ પલટાવો જà«àª¯àª¾àª°à«‡ નિરà«àª¦à«‡àª¶àª•ને સà«àª•à«àª°à«€àª¨àª¨à«€ બાજૠપર ખસેડી રહà«àª¯àª¾ હોય" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "આગળના દૃશà«àª¯ પર પલટાવો જà«àª¯àª¾àª°à«‡ વિનà«àª¡à«‹ સà«àª•à«àª°à«€àª¨àª¨à«€ બાજૠપર ખસેડી રહà«àª¯àª¾ હોય" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "જમણા દૃશà«àª¯àª®àª¾àª‚ પલટાવો અને નિરà«àª¦à«‡àª¶àª• લપેટો" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "નિરà«àª¦à«‡àª¶àª• ચાલ માટે ઉલટો Y અકà«àª·" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "નિરà«àª¦à«‡àª¶àª• ઉલટો Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "નિરà«àª¦à«‡àª¶àª• સંવેદનશીલતા" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "ફેરવવા પર વધારો" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "જà«àª¯àª¾àª°à«‡ ફેરવી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ વિનà«àª¡à«‹ વધારો" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "ઘન ફેરવો" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "ડાબે પલટાવો ફેરવો" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "પલટાવો જમણે ફેરવો" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "ડાબે ફેરવો" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "વિનà«àª¡à«‹ સાથે ડાબે ફેરવો" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "જમણે ફેરવો" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "વિનà«àª¡à«‹ સાથે જમણે ફેરવો" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "ચહેરા à«§ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«§ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "ચહેરા ૧૦ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા ૧૦ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "ચહેરા à«§à«§ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«§à«§ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "ચહેરા ૧૨ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા ૧૨ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "ચહેરા ૨ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા ૨ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "ચહેરા à«© તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«© તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "ચહેરા ૪ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા ૪ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "ચહેરા à«« તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«« તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "ચહેરા ૬ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા ૬ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "ચહેરા à«­ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«­ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "ચહેરા à«® તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«® તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "ચહેરા ૯ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા ૯ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "ઘન ફેરવો" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "ડેસà«àª•ટોપ ઘન ફેરવો" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "ડાબે ફેરવો" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ડાબે ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "જમણે ફેરવો" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે જમણે ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "ચહેરા à«§ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«§ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "ચહેરા à«§ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«§ તરફ ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "ચહેરા ૧૦ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા ૧૦ તરફ ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "ચહેરા à«§à«§ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«§à«§ તરફ ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "ચહેરા ૧૨ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા ૧૨ તરફ ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "ચહેરા ૨ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા ૨ તરફ ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "ચહેરા à«© તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«© તરફ ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "ચહેરા ૪ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા ૪ તરફ ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "ચહેરા à«« તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«« તરફ ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "ચહેરા ૬ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા ૬ તરફ ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "ચહેરા à«­ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«­ તરફ ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "ચહેરા à«® તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા à«® તરફ ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "ચહેરા ૯ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "વિનà«àª¡à«‹ સાથે ચહેરા ૯ તરફ ફેરવો અને સકà«àª°àª¿àª¯ લાવો" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "દૃશà«àª¯àª®àª¾àª‚ ફેરવો" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "સà«àª¥àª¾àªªàª¨ પૂરà«àª‚ થયà«àª‚" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "સà«àª¥àª¾àªªàª¨ પૂરà«àª‚ થયà«àª‚" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "સà«àª¥àª¾àªªàª¨ પૂરà«àª‚ થયà«àª‚" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "સà«àª¥àª¾àªªàª¨ પૂરà«àª‚ થયà«àª‚" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "નિરà«àª¦à«‡àª¶àª• ચાલની સંવેદનશીલતા" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "ટોચના ચહેરા ઉપર સà«àª¨à«‡àªª ઘન ફેરવવાનà«àª‚" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ટોચના ચહેરા ઉપર સà«àª¨à«‡àªª ઘન ફેરવવાનà«àª‚" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "ટોચના ચહેરા ઉપર સà«àª¨à«‡àªª" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ટોચના ચહેરા ઉપર સà«àª¨à«‡àªª" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "શોધી કાઢવાનà«àª‚ ફ&રીશરૂ થઇ રહà«àª¯à«àª‚ છે" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "દૃશà«àª¯ પલટાવવા પહેલાંનો સમયસમાપà«àª¤àª¿ ગાળો" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "નાનà«àª‚-મોટૠકરો" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "અપારદરà«àª¶àª•તાનો જથà«àª¥à«‹ ટકામાં" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "મોટà«àª‚" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "ડેસà«àª•ટોપ બતાવવા માટે ડેસà«àª•ટોપ કà«àª²àª¿àª• કરો" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "ઘાટà«àª‚ પાશà«àªµàª­àª¾àª—" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "જà«àª¯àª¾àª°à«‡ વિનà«àª¡à«‹ ખેંચી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ ઘાટà«àª‚ પાશà«àªµàª­àª¾àª—" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "સંજà«àªžàª¾" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "જà«àª¯àª¾àª°à«‡ ખેંચવા દરમà«àª¯àª¾àª¨ ડેસà«àª•ટોપ પર કà«àª²àª¿àª• થાય તà«àª¯àª¾àª°à«‡ ડેસà«àª•ટોપ બતાવો સà«àª¥àª¿àª¤àª¿ દાખલ કરો" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "રકà«àª·àª£ સમય" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "બધી વિનà«àª¡à«‹ માટે વિનà«àª¡à«‹ લેનારનો આરંભ કરો" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "વિનà«àª¡à«‹ જૂથ માટે વિનà«àª¡à«‹ લેનારનો આરંભ કરો" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "વરà«àª¤àª®àª¾àª¨ આઉટપà«àªŸ પર વિનà«àª¡à«‹ માટે વિનà«àª¡à«‹ લેનારનો આરંભ કરો" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "બધી વિનà«àª¡à«‹àª¨à«àª‚ રૂપાંતરણ અને લેઆઉટ શરૂ કરો" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "વિનà«àª¡à«‹ જૂથનà«àª‚ રૂપાંતરણ અને લેઆઉટ શરૂ કરો" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "દેખાવ અને વિનà«àª¡à«‹àª¨à«àª‚ રૂપાંતરણ શરૂ કરો" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "વરà«àª¤àª®àª¾àª¨ આઉટપà«àªŸ પર વિનà«àª¡à«‹àª¨à«àª‚ રૂપાંતરણ અને લેઆઉટ શરૂ કરો" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "બધા આઉટપà«àªŸ ઉપકરણો પર" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "વરà«àª¤àª®àª¾àª¨ આઉટપà«àªŸ ઉપકરણ પર" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ઓવરલે ચિહà«àª¨" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "વિનà«àª¡à«‹ પર ચિહà«àª¨ ઓવરલે કરો જà«àª¯àª¾àª°à«‡ તેઓ ખેંચાય" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "માપદંડ" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "વિનà«àª¡à«‹ ખેંચો" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "ખેંચાવાની àªàª¡àªª" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "ખેંચાવાનà«àª‚ સમયપગલà«àª‚" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "જો વિવિધ આઉટપà«àªŸ ઉપકરણો વપરાય તો વિનà«àª¡à«‹ કà«àª¯àª¾àª‚ ખેંચાય તે પસંદ કરે છે." #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "છોડેલી જગà«àª¯àª¾" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "જà«àª¯àª¾àª°à«‡ વિનà«àª¡à«‹ ઉપર ફરી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ ખેંચાણ સà«àª¥àª¿àª¤àª¿ બંધ થાય તે પહેલાંનો સમય (મિલિસેકનà«àª¡àª®àª¾àª‚)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "વિનà«àª¡à«‹ કે જે ખેંચાણ સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ ખેંચાવી જોઈàª" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "સà«àª•à«àª°à«€àª¨àª¶à«‹àªŸ આપોઆપ આ કારà«àª¯àª•à«àª°àª®àª®àª¾àª‚ ખોલો" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "&સà«àª¥àª¾àª¨àª¿àª• ડિરેકà«àªŸàª°à«€" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "કેટાલોગ પસંદગી" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "કારà«àª¯àª•à«àª°àª® લાવો" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "આ ડિરેકà«àªŸàª°à«€àª®àª¾àª‚ સà«àª•à«àª°à«€àª¨àª¶à«‹àªŸ ચિતà«àª°à«‹ મૂકો" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "સà«àª•à«àª°à«€àª¨àª¶à«‹àªŸ" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "સà«àª•à«àª°à«€àª¨àª¶à«‹àªŸ પà«àª²àª—ઈન" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg ચિતà«àª° લાવનાર" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "તેજસà«àªµà«€àª¤àª¾àª¨à«‹ જથà«àª¥à«‹ ટકામાં" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "સંતà«àª²àª¨àª¨à«‹ જથà«àª¥à«‹ ટકામાં" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "કારà«àª¯àª•à«àª°àª® બદલનાર" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "પà«àª°àª¾àª°àª‚ભ કરાઈ રહયà«àª‚ છે." #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "બà«àªŸ દરમિયાન" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "પસંદિત વિનà«àª¡à«‹àª¨à«‡ આગળ લાવો" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "વિનà«àª¡à«‹ બદલતી વખતે ડેસà«àª•ટોપ નાની કરતી વખતનà«àª‚ અતર" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "ચિહà«àª¨" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "નà«àª¯à«‚નતમ કરેલ" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "ડેસà«àª•ટોપ પà«àª²à«‡àª¨" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "પોપઅપ બદલનાર જો દેખીતà«àª‚ ના હોય અને આગળની વિનà«àª¡à«‹ પસંદ કરો" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "પોપઅપ બદલનાર જો દેખીતà«àª‚ ના હોય અને બધી વિનà«àª¡à«‹àª®àª¾àª‚થી આગળની વિનà«àª¡à«‹ પસંદ કરો" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "પોપઅપ બદલનાર જો દેખીતà«àª‚ ના હોય અને પહેલાંની વિનà«àª¡à«‹ પસંદ કરો" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "પોપઅપ બદલનાર જો દેખીતà«àª‚ ના હોય અને બધી વિનà«àª¡à«‹àª®àª¾àª‚થી પહેલાંની વિનà«àª¡à«‹ પસંદ કરો" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "પહેલાંની સà«àª²àª¾àªˆàª¡" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "પહેલાંની વિનà«àª¡à«‹" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "પહેલાંની વિનà«àª¡à«‹ (બધી વિનà«àª¡à«‹)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "પહેલાંની વિનà«àª¡à«‹ (કોઈ પોપઅપ નથી)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "જà«àª¯àª¾àª°à«‡ બદલી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ પસંદિત વિનà«àª¡à«‹ સà«àª§à«€ ફેરવો" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "પોપઅપ વિનà«àª¡à«‹ બતાવà«àª¯àª¾ વિના આગળની વિનà«àª¡à«‹ પસંદ કરો." #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "પોપઅપ વિનà«àª¡à«‹ બતાવà«àª¯àª¾ વિના પહેલાંની વિનà«àª¡à«‹ પસંદ કરો." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "થમà«àª¬àª¨à«‡àªˆàª² આગળ ચિહà«àª¨ બતાવો" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "નà«àª¯à«‚નતમ કરેલ વિનà«àª¡à«‹ બતાવો" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "બદલનારની àªàª¡àªª" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "બદલનાર સમયપગલà«àª‚" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "બદલનાર વિનà«àª¡à«‹" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "વિનà«àª¡à«‹ કે જે બદલનારમાં બતાવવી જોઈàª" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 રંગજગà«àª¯àª¾ આધાર પૂરો પાડો" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "વીડિયો પà«àª²à«‡àª¬à«‡àª•" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "વીડિયો પà«àª²à«‡àª¬à«‡àª•" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 રંગજગà«àª¯àª¾" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "લીટી ઉમેરો" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "બંદૠઉમેરો" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "અલગ ડેસà«àª•ટોપ કà«àª°àª¿àª¯àª¾àª“માં પાણી અસરો ઉમેરે છે" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "દરેક વરસાદ-પડવા વચà«àªšà«‡àª¨à«‹ વિલંબ (ms માં)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "નિરà«àª¦à«‡àª¶àª• પાણી અસરો સકà«àª°àª¿àª¯ કરો" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "લીટી" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "ઓફસેટ માપ" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "બિંદà«" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "વરસાદ વિલંબ" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "શીરà«àª·àª• તરંગ" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "વરસાદ બદલો" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "વરસાદ અસર બદલો" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "વાઈપર બદલો" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "વાઈપર અસર બદલો" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "પાણી અસર" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "પાણી ઓફસેટ માપ" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "વિનà«àª¡à«‹ શીરà«àª·àª•માંથી તરંગ અસર" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "ફોકસ અસર" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "વિનà«àª¡à«‹ ફોકસ અસર" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "ઘરà«àª·àª£" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "જાળી રીàªà«‹àª²à«àª¯à«àª¶àª¨" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "ઊલટાવાયેલ વિનà«àª¡à«‹ સà«àª¨à«‡àªªà«€àª‚ગ" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "વિનà«àª¡à«‹àª¨à«‡ ધà«àª°à«àªœàª¤à«€ બનાવો" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "નકશા અસર" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "નકશા વિનà«àª¡à«‹ અસર" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "નકશા વિનà«àª¡à«‹" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "મહતà«àª¤àª® કરો અસર" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "નà«àª¯à«‚નતમ જાળી માપ" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "નà«àª¯à«‚નતમ Vertex જાળી માપ" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "વિનà«àª¡à«‹ ખસેડો" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "ધà«àª°à«àªœàª¾àª°à«€" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "સà«àª¨à«‡àªª ઊલટાવાયેલ" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "àªàª•પણ પસંદ ન કરો" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "બà«àªŸ દરમિયાન" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "સà«àªªà«àª°à«€àª‚ગ K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "સà«àªªà«àª°à«€àª‚ગ અચળ" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "વિનà«àª¡à«‹ સà«àª¨à«‡àªªà«€àª‚ગ બદલો" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "વિનà«àª¡à«‹ વમળ અસર માટે સà«àªªà«àª°à«€àª‚ગ મોડેલ વાપરો" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Vertex જાળી રીàªà«‹àª²à«àª¯à«àª¶àª¨" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "વિનà«àª¡à«‹ કે જે ફોકસ થાય તà«àª¯àª¾àª°à«‡ વમળ થવી જોઈàª" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "વિનà«àª¡à«‹ કે જે મેળવાય તà«àª¯àª¾àª°à«‡ વમળ થવી જોઈàª" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "વિનà«àª¡à«‹ જà«àª¯àª¾àª°à«‡ નકશાવાળી થાય તà«àª¯àª¾àª°à«‡ વમળ થવી જોઈàª" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "વિનà«àª¡à«‹ કે જે ખસેચવામાં આવે તà«àª¯àª¾àª°à«‡ વમળ થવી જોઈàª" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" "વિનà«àª¡à«‹ જà«àª¯àª¾àª°à«‡ મહતà«àª¤àª® કરી રહà«àª¯àª¾ હોય અને મહતà«àª¤àª®àª®àª¾àª‚થી પાછા લાવી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ વમળ અસર" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "વિનà«àª¡à«‹ વમળ કરો" #, fuzzy #~ msgid "Command line 0" #~ msgstr "આદેશ '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "આદેશ '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "સà«àª•à«àª°à«€àª¨àª¶à«‹àªŸ આદેશ વાકà«àª¯" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "સà«àª•à«àª°à«€àª¨àª¶à«‹àªŸ આદેશ વાકà«àª¯" #~ msgid "Filter Linear" #~ msgstr "ગાળક રેખીય" #~ msgid "Use linear filter when zoomed in" #~ msgstr "જà«àª¯àª¾àª°à«‡ મોટà«àª‚ થાય તà«àª¯àª¾àª°à«‡ રેખીય ગાળણ વાપરો" #~ msgid "Zoom Desktop" #~ msgstr "ડેસà«àª•ટોપ નાનીમોટી કરો" #~ msgid "Zoom In" #~ msgstr "મોટૠકરો" #~ msgid "Zoom Out" #~ msgstr "નાનૠકરો" #~ msgid "Zoom Pan" #~ msgstr "પેન નાનà«àª‚મોટà«àª‚ કરો" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "સà«àª¥àª¾àªªàª¨ પૂરà«àª‚ થયà«àª‚" #~ msgid "Zoom Timestep" #~ msgstr "નાનામોટાપણાનà«àª‚ સમયપગલà«àª‚" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ડેસà«àª•ટોપ ઘન નાનà«àª‚મોટà«àª‚ કરો અને વિસà«àª¤àª¾àª°à«‹" #~ msgid "Zoom factor" #~ msgstr "નાનામોટાપણાનો અવયવ" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "સà«àª¥àª¾àªªàª¨ પૂરà«àª‚ થયà«àª‚" #~ msgid "Decrease window opacity" #~ msgstr "વિનà«àª¡à«‹ અપારદરà«àª¶àª•તા ઘટાડો" #~ msgid "Increase window opacity" #~ msgstr "વિનà«àª¡à«‹ અપારદરà«àª¶àª•તા વધારો" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "વિનà«àª¡à«‹ માટેની અપારદરà«àª¶àª•તા કિંમતો કે જેઓ મૂળભૂત રીતે અરà«àª§àªªàª¾àª°àª¦àª°à«àª¶àª• હોવી જોઈàª" #~ msgid "Opacity windows" #~ msgstr "અપારદરà«àª¶àª• વિનà«àª¡à«‹" #~ msgid "Background Images" #~ msgstr "પાશà«àªµàª­àª¾àª— ચિતà«àª°à«‹" #~ msgid "Background images" #~ msgstr "પાશà«àªµàª­àª¾àª— ચિતà«àª°à«‹" #~ msgid "Place windows on a plane" #~ msgstr "વિનà«àª¡à«‹àª¨à«‡ પà«àª²à«‡àª¨ પર મૂકો" #~ msgid "Plane Down" #~ msgstr "પà«àª²à«‡àª¨ નીચે" #~ msgid "Plane Left" #~ msgstr "પà«àª²à«‡àª¨ ડાબે" #~ msgid "Plane Right" #~ msgstr "પà«àª²à«‡àª¨ જમણે" #~ msgid "Plane To Face 1" #~ msgstr "ચહેરા à«§ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane To Face 10" #~ msgstr "ચહેરા ૧૦ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane To Face 11" #~ msgstr "ચહેરા à«§à«§ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane To Face 12" #~ msgstr "ચહેરા ૧૨ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane To Face 2" #~ msgstr "ચહેરા ૨ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane To Face 3" #~ msgstr "ચહેરા à«© આગળ પà«àª²à«‡àª¨" #~ msgid "Plane To Face 4" #~ msgstr "ચહેરા ૪ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane To Face 5" #~ msgstr "ચહેરા à«« આગળ પà«àª²à«‡àª¨" #~ msgid "Plane To Face 6" #~ msgstr "ચહેરા ૬ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane To Face 7" #~ msgstr "ચહેરા à«­ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane To Face 8" #~ msgstr "ચહેરા à«® આગળ પà«àª²à«‡àª¨" #~ msgid "Plane To Face 9" #~ msgstr "ચહેરા ૯ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane Up" #~ msgstr "પà«àª²à«‡àª¨ ઉપર" #~ msgid "Plane down" #~ msgstr "પà«àª²à«‡àª¨ નીચે" #~ msgid "Plane left" #~ msgstr "પà«àª²à«‡àª¨ ડાબે" #~ msgid "Plane right" #~ msgstr "પà«àª²à«‡àª¨ જમણે" #~ msgid "Plane to face 1" #~ msgstr "ચહેરા à«§ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane to face 10" #~ msgstr "ચહેરા ૧૦ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane to face 11" #~ msgstr "ચહેરા à«§à«§ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane to face 12" #~ msgstr "ચહેરા ૧૨ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane to face 2" #~ msgstr "ચહેરા ૨ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane to face 3" #~ msgstr "ચહેરા à«© આગળ પà«àª²à«‡àª¨" #~ msgid "Plane to face 4" #~ msgstr "ચહેરા ૪ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane to face 5" #~ msgstr "ચહેરા à«« આગળ પà«àª²à«‡àª¨" #~ msgid "Plane to face 6" #~ msgstr "ચહેરા ૬ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane to face 7" #~ msgstr "ચહેરા à«­ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane to face 8" #~ msgstr "ચહેરા à«® આગળ પà«àª²à«‡àª¨" #~ msgid "Plane to face 9" #~ msgstr "ચહેરા ૯ આગળ પà«àª²à«‡àª¨" #~ msgid "Plane up" #~ msgstr "પà«àª²à«‡àª¨ ઉપર" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ડેસà«àª•ટોપ વિનà«àª¡à«‹ અપાદરà«àª¶àª•તા આછાપણા સમય." #~ msgid "Unknown" #~ msgstr "અજાણી" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "કનà«àª«àª¿àª—à«àª¯à«àª°à«‡àª¶àª¨ સાચવો" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "સà«àª¥àª¾àªªàª¨ પૂરà«àª‚ થયà«àª‚" compiz-0.9.11+14.04.20140409/po/ka.po0000644000015301777760000017023012321343002017046 0ustar pbusernogroup00000000000000# Georgian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2005 SUSE Linux Products GmbH. # Aiet Kolkhi , 2005. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2005-05-18 10:33+0200\n" "Last-Translator: Aiet Kolkhi \n" "Language-Team: Georgian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" compiz-0.9.11+14.04.20140409/po/nb.po0000644000015301777760000025170312321343002017057 0ustar pbusernogroup00000000000000# Norwegian Bokmaal translation of Compiz Core. # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # This file is distributed under the same license as the compiz package. # Ketil W. Aanensen , 2007. # msgid "" msgstr "" "Project-Id-Version: Compiz 0.6.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2008-04-03 23:15+0200\n" "Last-Translator: Ketil Wendelbo Aanensen \n" "Language-Team: Norwegian Bokmaal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Skrivebord" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "VindushÃ¥ndtering" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ingen" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Skyggelegg" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maksimer" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maksimer vindu horisontalt" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maksimer vindu vertikalt" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimert" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Auto-hev" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Vindusmeny" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Hendelse Ã¥ sette i gang nÃ¥r man ruller musehjulet pÃ¥ et vindus tittellinje." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Sløringstype" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Dekkevne for aktive vinduer med Metacity-tema" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Dekkevne for aktive vinduer med Metacity-tema som er rullet opp" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Dekkevne for Metacity-tema" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Dekkevne ved opprulling med Metacity-tema" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Dekkevne Ã¥ bruke for aktive vinduer med Metacity temadekorasjoner" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Dekkevne Ã¥ bruke for Metacity temadekorasjoner" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Skyggelegg aktive vinuder med Metacity temadekorasjoner fra fulldekkende til " "gjennomsiktig" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Skyggelegg vinduer med Metacity temadekorasjoner fra fulldekkende til " "gjennomsiktig" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Musehjulshendelse for tittellinje" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Type sløring som brukes for vindusdekorasjoner" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Bruk Metacity-tema" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Bruk Metacity-tema nÃ¥r vindusdekorasjoner tegnes" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Lukk vindu" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Avmaksimer vindu" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maksimer vindu" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimer vindu" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Hold over" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Klistre" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Av-skyggelegg" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Ikke hold over" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Avklistre" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Vinduet \"%s\" svarer ikke." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Ã… tvinge denne applikasjonen til Ã¥ avslutte vil gjøre at du mister alle " "endringer som ikke er lagret." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Tving avslutt" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "PÃ¥før" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Fyllfarge for PÃ¥før" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Bestrykningsfarge for PÃ¥før" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "PÃ¥før-tillegg" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Rens" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Tegn" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Tegn ved hjelp av verktøy" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Fyllfarge for pÃ¥førte elementer" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Begynn" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Begynn PÃ¥før-tegning" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Begynn PÃ¥før-utvisking" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Begynn utvisking" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Linjebredde" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Linjebredde for pÃ¥føringer" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Bestrykningsfarge for pÃ¥førte elementer" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Bestrykningsbredde" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Bestrykningsbredde for pÃ¥førte elementer" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x bilineær" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alfatilslør" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alfatilslørte vinduer" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Tilsløringsfilter" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Tilstopping for tilsløring" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Metning for tilsløring" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Hastighet for tilsløring" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Tilslør vinduer" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Tilslør bak gjennomsiktige deler av vinduer" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Metning for tilsløring" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Tilslør vinduer" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Tilslør vinduer som ikke har fokus" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "SlÃ¥ av tilsløring av skjermomrÃ¥der som er dekket av andre vinduer." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Filtermetode brukt for tilsløring" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Fokustilsløring" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Fokustilslør vinduer" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussisk" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gaussisk radius" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gaussisk styrke" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Gaussisk radius" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gaussisk styrke" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Uavhengig teksturhenting" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "MIP-kart" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "MIP-kart detaljnivÃ¥" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "DetaljnivÃ¥ for MIP-kart" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Puls" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Pulseffekt" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Bruk de tilgjengelige teksturenhetene for Ã¥ gjøre sÃ¥ mange uavhengige " "teksturhentinger som mulig." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Hastighet for vindutilsløring" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Vinduer som skal pÃ¥virkes av fokustilsløring" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Vinduer som skal bruke alfatilsløring som standard" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Klone-utdata" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Begynn klonseleksjon" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "HÃ¥ndterer for klone-utdata" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando0" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando0" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "En hurtigtast som, nÃ¥r innhentet, vil kjøre konsollkommandoen identifisert " "som kommando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Kommandolinje 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Kommandolinje 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Kommandolinje 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Kommandolinje 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Kommandolinje 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Kommandolinje 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Kommandolinje 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Kommandolinje 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Kommandolinje 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Kommandolinje 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Kommandolinje 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Kommandolinje 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll nÃ¥r kjør_kommando0 blir innhentet" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll nÃ¥r kjør_kommando1 blir innhentet" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll nÃ¥r kjør_kommando10 blir innhentet" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll nÃ¥r kjør_kommando11 blir innhentet" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll nÃ¥r kjør_kommando2 blir innhentet" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll nÃ¥r kjør_kommando3 blir innhentet" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll nÃ¥r kjør_kommando4 blir innhentet" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll nÃ¥r kjør_kommando5 blir innhentet" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll nÃ¥r kjør_kommando6 blir innhentet" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll nÃ¥r kjør_kommando7 blir innhentet" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll nÃ¥r kjør_kommando8 blir innhentet" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll nÃ¥r kjør_kommando9 blir innhentet" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Kommando" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Kjør kommando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Kjør kommando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Kjør kommando 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Kjør kommando 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Kjør kommando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Kjør kommando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Kjør kommando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Kjør kommando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Kjør kommando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Kjør kommando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Kjør kommando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Kjør kommando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktive tillegg" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Tilatt tegning av fullskjermvinduer Ã¥ ikke bli omdirigert til bilder utenfor " "skjermen" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Hørbar bjelle" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Hørbart systempip" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Auto-hev" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Forsinkelse for auto-hev" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatisk gjenkjennelse av skjermenheter" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatisk gjenkjennelse av oppdateringshastighet" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Beste" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Klikk for fokus" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Klikk pÃ¥ vindu flytter inndatafokus til det" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Lukk aktivt vindu" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Standardikon" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Standard bilde for vindusikon" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Skrivebordskube" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Gjenkjenn utdata" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Gjenkjenn oppfriskingshastighet" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Varigheten musepekeren mÃ¥ hvile i en skjermkant før en kanthendelse utføres." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Forsinkelse for kantutløsning" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rask" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "FokusunngÃ¥ende nivÃ¥" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "FokusunngÃ¥ende vinduer" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "FokusunngÃ¥ende vinduer" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Generelle valg" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Generelle Compiz-valg" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "God" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Skjul vinduer som hopper over oppgavelinjen" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Skjul alle vinduer og fokuser pÃ¥ skrivebordet" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Skjul vinduer som ikke er i oppgavelinjen nÃ¥r Visskrivebord-modus startes" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Høy" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Horisontal virtuell størrelse" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Hvis mulig, bruk kompresjon for teksturer hentet fra bilder" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorer hint nÃ¥r maksimert" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Ignorer størrelsesøkning- og forholdshint nÃ¥r vinduet er maksimert" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervall før valgte vinduer heves" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervall mellom ping-beskjeder" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Lyn" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Liste over aktive tillegg nÃ¥" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Liste over strenger som beskriver skjermenheter" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Senk vindu" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Senk vindu under andre vinduer" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maksimer vindu horisontalt" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maksimer vindu vertikalt" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maksimer aktivt vindu" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maksimer aktivt vindu horisontalt" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maksimer aktivt vindu vertikalt" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimer aktivt vindu" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Antall skrivebord" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Antall viruelle skrivebord" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" # fuzzy #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Bare utfør skjermoppdateringer ved vertikale blankingsperioder" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Utdata" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Overlappende utdata-hÃ¥ndtering" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping-forsinkelse" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Foretrekk større utdata" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Foretrekk mindre utdata" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Hev ved klikk" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Hev vindu" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Hev valgt vindu etter intervall" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Hev vindu over andre vinduer" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Hev vinduer nÃ¥r de klikkes" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Oppfriskingsrate" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplikator for skjermstørrelse for horisontal virtuell størrelse" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplikator for skjermstørrelse for vertikal virtuell størrelse" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Vis skrivebord" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Trege animasjoner" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Smartmodus" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synkroniser til VBlank" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Teksturfiltrering" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Teksturfilter" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Teksturfiltrering" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Hastigheten for omtegning av skjermen (ganger/sekund)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Skru av/pÃ¥ maksimert vindu" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Skru av/pÃ¥ horisontalt maksimert vindu" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Skru av/pÃ¥ vertikalt maksimert vindu" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Skru av/pÃ¥ rull opp/ ned vindu" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Skru av/pÃ¥ maksimert aktivt vindu" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Skru av/pÃ¥ horisontalt maksimert aktivt vindu" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Skru av/pÃ¥ vertikalt maksimert aktivt vindu" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Skru av/pÃ¥ rull opp/ned vindu" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Skru av/pÃ¥ bruk av trege animasjoner" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Avmaksimer aktivt vindu" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Ikke-videresend vinduer i fullskjerm" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Bruk diffust lys nÃ¥r skjermen omdannes" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Vertikal virtuell størrelse" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Hvilken av de overlappende utdata-enhetene skal foretrekkes" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Snarvei for vindusmeny" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Hurtigtast for vindusmeny" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Akselerasjon" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Juster bilde" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Juster toppbilde til rotasjon" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "GÃ¥ videre til neste bilde" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animer himmelkuppel" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animer himmelkuppel nÃ¥r kuben roteres" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatisk" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Farge pÃ¥ kubens topp og bunn" # fuzzy #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Farge som skal brukes til bunnens fargestans av alternativet for " "fargeovergangen for himmelkuppel" # fuzzy #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Farge som skal brukes til toppens fargestans av alternativet for " "fargeovergangen for himmelkuppelen" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Kubefarge" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kubefarge" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Skrivebordskube" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Akselerasjon for bretting" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Brettehastighet" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Tidsskritt for bretting" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Lag MIP-kart nÃ¥r det er mulig, for skalering med høyere kvalitet" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "GÃ¥ tilbake til forrige bilde" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Bildefiler" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Bilde Ã¥ bruke som tekstur for himmelkuppelen" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Starter gjennomsiktighet for kube kun hvis rotasjonen er drevet av mus" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Innsiden av kuben" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Innsiden av kuben" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Liste over PNG- og SVG-filer som skal gjengis pÃ¥ toppen av kuben" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Flerskjermsmodus" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Flere kuber" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Neste bilde" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "Én stor kube" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Dekkevne ved rotasjon" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Dekkevne nÃ¥r det ikke roteres" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Skrivebordsvinduenes dekkevne ved rotasjon" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Skrivebordsvinduenes dekkevne nÃ¥r det ikke roteres" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Plasser vinduer pÃ¥ kuben" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Forrige bilde" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Gjengi himmelkuppel" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Skaler bilde" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Skaler bilder for Ã¥ dekke toppen av kuben" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Velger hvordan kuben vises hvis flere skjermenheter brukes." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Himmelkuppel" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Sluttfarge for himmelkuppelens fargeovergang" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Startfarge for himmelkuppelens fargeovergang" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Bilde for himmelkuppel" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Hastighet" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Tidsskritt" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Gjennomsiktighet kun ved muserotasjon" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Brett ut" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Brett ut kuben" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus kontrollmotor" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "La MIP-kart bli laget for dekorasjonstekstur" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Kommando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekorasjonsvinduer" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Kommandolinje for dekoratør som kjøres hvis ingen dekoratør allerede kjører" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Slippskyggens X-forskyvning" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Slippskyggens Y-forskyvning" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Farge for slippskygge" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Dekkevne for slippskygge" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Radius for slippskygge" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Skyggefarge" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Skyggens X-forskyvning" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Skyggens Y-forskyvning" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Dekkevne for skygge" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Skyggeradius" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Skyggevinduer" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Vindusdekor" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Vindusdekorasjoner" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Vinduer som skal dekoreres" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Vinduer som skal ha en skygge" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Rotasjonshastighet" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Hold tilbake Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Normal størrelsesemdring av vinduer" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Uttoningstid" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Ton ved minimer/Ã¥pne/lukk" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Toningshastighet" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Uttoningstid" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Toningseffekt pÃ¥ minimer/Ã¥pne/lukk" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Toningseffekt ved systempip" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Ton inn vinduer nÃ¥r de kartlegges og ton ut vinduer nÃ¥r de av-kartlegges" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Ton vinduer" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Inn- og uttonende vinduer" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Visuell bjelle i fullskjerm" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Fullskjerms toningseffekt ved systempip" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Visuell bjelle" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Hastighet for toning av vinduer" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Vinduer som skal skaleres i skalermodus" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Vinduer som skal tones" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Monteringspunkt" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Monteringspunkt" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Filsystem pÃ¥ brukeromrÃ¥de" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Filsystem pÃ¥ brukerens omrÃ¥de" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "Gconf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Gconf kontrollmotor" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "Glib" # fuzzy #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Glib støtte for hovedløkke" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Ã…pne en terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Kjør-dialog" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Kommandolinje for terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Kommandolinje for skjermbilde" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Vis hovedmeny" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Vis \"Kjør program\"-dialog" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Vis hovedmenyen" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Ta et skjermbilde" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Ta et skjermbilde av et vindu" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Kommandolinje for terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Kommandolinje for skjermbilde av vindu" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini flatfil-motor" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Varslingstilleg for filendringer" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig kontrollmotor" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimereffekt" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimer vinduer" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimeringshastighet" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Tidsskritt for minimering" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Skyggemotstand" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Skyggemotstand" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Omdann vinduer nÃ¥r de minimeres og avminimeres" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Vinduer som skal omdannes nÃ¥r de minimeres" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Hold tilbake Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Hold tilbake Y-koordinat til arbeidsomrÃ¥de" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Ikke oppdater vindusposisjonen pÃ¥ tjenerside før vinduene er ferdig med " "flytting" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Begynn vindusflytting" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Lat posisjonering" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Flytt vindu" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Flytt vindu" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Dekkevne" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "DekkevnenivÃ¥ for bevegende vinduer" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Smekk av og automatisk avmaksimer maksimerte vinduer nÃ¥r de trekkes" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Smekk av maksimerte vinduer" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Begynn Ã¥ bevege vindu" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Skarphet" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Skarphet" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Skarphet" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Skarphet" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Reduser dekkevne" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Øk dekkevne" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Endringssteg for dekkevne" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Endringssteg for dekkevne" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Steg for dekkevne" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "DekkevnenivÃ¥ for bevegende vinduer" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Dekkevne ved rotasjon" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Metning" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Metning" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Metning" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Metning" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Vindusdekorasjoner" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Dekkevneverdier for vinduer" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Kartlegg vinduer" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Vinduer som skal posisjoneres som standard" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Vinduer som skal være gjennomsiktige som standard" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Vinduer som skal posisjoneres som standard" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritme som brukes for plassering av vinduer" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Tett-i-tett" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Sentrert" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "VindushÃ¥ndtering" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "FokusunngÃ¥ende vinduer" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Horisontale posisjoner pÃ¥ arbeidsomrÃ¥de" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Plasser vinduer" #: ../metadata/place.xml.in.h:12 #, fuzzy msgid "Place across all outputs" msgstr "Foretrekk mindre utdata" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Plasser vinuder pÃ¥ passende posisjoner nÃ¥r de kartlegges" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Plasseringsmodus" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Posisjonerte vinduer" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Tilfeldig" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "Velge hvor vinduene skaleres hvis flere skjermenheter brukes." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Smart" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "PÃ¥ alle skjermenheter" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Vertikale posisjoner pÃ¥ arbeidsomrÃ¥de" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "ArbeidsomrÃ¥de-plasserte vinduer" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Omveier for vindusplassering" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Vinduer som skal posisjoneres som standard" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Vinduer som skal plasseres i spesifikke arbeidsomrÃ¥der som standard" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Vindusdekorasjoner" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Omveier" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X-posisjoner" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X-posisjoner pÃ¥ arbeidsomrÃ¥de" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Verdier for X-posisjon" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y-posisjoner" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y-posisjoner pÃ¥ arbeidsomrÃ¥de" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Verdier for Y-posisjon" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png-bildelaster" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Regex-samsvar" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Regex-samsvar mellom vinduer" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Kantfarge" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Kantfarge brukt for omriss og rektangel ved gjør-om-størrelse-modus" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Standardmodus for størrelsesendring" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Standard modus som brukes for størrelsesendring av vinduer" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Fyllfarge" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Fyllfarge brukt for omriss og rektangel ved gjør-om-størrelse-modus" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Begynn normal størrelsesendring av vindu" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Begynn omriss-størrelsesendring av vindu" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Begynn rektangulær størrelsesendring av vindu" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Begynn strekk-størrelsesendring av vindu" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Begynn størrelsesendring av vindu" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Normal størrelsesemdring av vinduer" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Omriss" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Omriss-størrelsesendring av vinduer" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rektangulær" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Rektangulær størrelsesendring av vinduer" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Endre størrelse pÃ¥ vindu" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Endre størrelse pÃ¥ vindu" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Begynn Ã¥ endre størrelse pÃ¥ vindu" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Begynn Ã¥ endre størrelse pÃ¥ vindu ved Ã¥ strekke det" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "begynn Ã¥ enre størrelse pÃ¥ vindu pÃ¥ normalt vis" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Begynn Ã¥ endre størrelse pÃ¥ vindu med omriss" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Begynn Ã¥ endre størrelse pÃ¥ vindu rekatngulært" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Strekk" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Strekk-størrelsesendring av vinduer" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Vinduer som skal endre størrelse pÃ¥ normalt vis" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Vinduer som skal endre størrelse med omriss" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Vinduer som skal endre størrelse rektangulært" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Vinduer som skal endre størrelse ved strekking" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Kantbytt dra-og-slipp" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Kantbytt flytt" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Kantbytt peker" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Byttetid" # fuzzy #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Bytt til venstre arbeidsomrÃ¥de og 'warp' musepeker" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "Bytt til neste arbeidsomrÃ¥de nÃ¥r objekter dras til skjermkanten" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "Bytt til neste arbeidsomrÃ¥de nÃ¥r musepekeren flyttes til skjermkanten" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Bytt til neste arbeidsomrÃ¥de nÃ¥r vinduer flyttes til skjermkanten" # fuzzy #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Bytt til høyre arbeidsomrÃ¥de og 'warp' musepeker" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "inverter Y-akse for musebevegelse" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Musepeker inverter Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Følsomhet for musepeker" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Hev ved rotasjon" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Hev vindu ved rotasjon" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Roter kuben" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Roter bytt venstre" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Roter bytt høyre" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Roter venstre" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Roter venstre med vindu" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Roter høyre" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Roter høyre med vindu" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Roter til" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Roter til ansikt 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Roter til ansikt 1 med vindu" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Roter til ansikt 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Roter til ansikt 10 med vindu" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Roter til ansikt 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Roter til ansikt 11 med vindu" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Roter til ansikt 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Roter til ansikt 12 med vindu" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Roter til ansikt 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Roter til ansikt 2 med vindu" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Roter til ansikt 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Roter til ansikt 3 med vindu" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Roter til ansikt 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Roter til ansikt 4 med vindu" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Roter til ansikt 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Roter til ansikt 5 med vindu" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Roter til ansikt 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Roter til ansikt 6 med vindu" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Roter til ansikt 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Roter til ansikt 7 med vindu" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Roter til ansikt 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Roter til ansikt 8 med vindu" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Roter til ansikt 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Roter til ansikt 9 med vindu" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Roter kuben" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Roter skrivebordskuben" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Roter venstre" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Roter venstre og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Roter høyre" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Roter høyre og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Roter til ansikt 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Roter til ansikt 1 med vindu" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Roter til ansikt 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Roter til ansikt 1 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Roter til ansikt 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Roter til ansikt 10 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Roter til ansikt 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Roter til ansikt 11 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Roter til ansikt 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Roter til ansikt 12 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Roter til ansikt 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Roter til ansikt 2 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Roter til ansikt 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Roter til ansikt 3 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Roter til ansikt 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Roter til ansikt 4 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Roter til ansikt 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Roter til ansikt 5 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Roter til ansikt 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Roter til ansikt 6 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Roter til ansikt 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Roter til ansikt 7 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Roter til ansikt 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Roter til ansikt 8 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Roter til ansikt 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Roter til ansikt 9 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Roter til arbeidsomrÃ¥de" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Roter vindu" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Roter med vinduer" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Akselerasjon for rotasjon" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Rotasjonshastighet" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Tidsskritt for rotasjon" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Rotasjonsforstørrelse" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Følsomhet for musepekers bevegelse" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Smekk kuberotasjon til bunnen" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Smekk kuberotasjon til toppen" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Smekk til bunn" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Smekk til topp" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Begynn rotasjon" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tidsavbrudd før arbeidsomrÃ¥de byttes" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Forstørr" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Dekkevne i prosent" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Stor" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Klikk skrivebord for Ã¥ vise skrivebord" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Gjør bakgrunn mørkere" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Gjør bakgrunn mørkere nÃ¥r vinduer skaleres" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Logo" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "Start Visskrivebord-modus nÃ¥r skrivebord klikkes mens skalering pÃ¥gÃ¥r" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Svevetid" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Begynn vindusplukker" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Begynn vindusplukker for alle vinduer" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Begynn vindusplukker for vindusgruppen" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Begynn vindusplukker for vinduer pÃ¥ denne skjermen" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Utform og start omdanning av alle vinduer" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Utform og start omdanning av vindusgruppe" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Utform og start omdanning av vinduer" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Utform og start omdanning av vinduer pÃ¥ denne skjermen" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "PÃ¥ alle skjermenheter" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "PÃ¥ nÃ¥værende skjermenhet" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Ikon for overlapp" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Legg et ikon pÃ¥ vinduer nÃ¥r de skaleres" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Skaler" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Skaler vinduer" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Skaleringshastighet" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Tidsskritt for skalering" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Skaler vinduer" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "Velge hvor vinduene skaleres hvis flere skjermenheter brukes." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Mellomrom mellom vinduer" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Mellomrom" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "Tid (i ms) før skaleringsmodus avsluttes nÃ¥r det sveves over et vindu" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Vinduer som skal skaleres i skalermodus" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Ã…pne skjermbilde automatisk med dette programmet" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Katalog" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Begynn rektangulært skjermbilde" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Kjør program" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Legg skjermbilder i denne katalogen" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Skjermbilde" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Tillegg for skjermbilde" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Innlaster for svg-bilde" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Mengde skarphet i prosent" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Mengde metning i prosent" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Programbytter" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Autoroter" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Hent til front" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Hent valgte vinduer til fornt" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Hvos mye skrivebordet skal forminskes ved vindusbytte" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikon" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimert" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Skrivebordsplan" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Neste vindu" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Neste vindu (alle vinduer)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Neste vindu (ikke sprett-opp)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Sprett opp skifter hvis ikke synlig og velg neste vindu" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Sprett opp skifter hvis ikke synlig og velg neste vindu blant alle vinduer" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Sprett opp skifter hvis ikke synlig og velg forrige vindu" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Sprett opp skifter hvis ikke synlig og velg forrige vindu blant alle vinduer" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Forrige bilde" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Forrige vindu" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Forrige vindu (alle vinduer)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Forrige vindu (ikke sprett-opp)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Roter til det valgte vinduent mens skifting" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Velg neste vindu uten Ã¥ vise oppsprettsvinduet" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Velg forrige vindu uten Ã¥ vise oppsprettsvinduet" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Velg forrige vindu uten Ã¥ vise oppsprettsvinduet" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Vis ikon ved siden av miniatyr" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Vis minimerte vinduer" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Hastighet for skifter" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Tisskritt for skifter" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Vinduer i skifteren" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Vinduer som skal vises i skifteren" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Sørg for støtte for YV12-fargeomrÃ¥de" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Videoavspilling" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Videoavspilling" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12-fargeomrÃ¥de" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Legg til linje" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Legg til punkt" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Legg til vanneffekter for forskjellige skrivebordshendelser" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Forsinkelse (i ms) mellom regndrÃ¥per" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Bruk vanneffekter for musepeker" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Linje" # fuzzy #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Skaleringsforskyvning" # fuzzy, "punkt" eller "pek" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punkt" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Forsinkelse for regn" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Tittelbølge" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Skru av/pÃ¥ regn" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Skru av/pÃ¥ regneffekten" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Skru av/pÃ¥ vindusvisker" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Skru av/pÃ¥ vindusviskereffekten" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Vanneffekt" # fuzzy #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Skaleringsforskyvning for vann" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Bølgeeffekt fra vindustittel" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Fokuseffekt" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Fokuseffekt for vindu" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Fokuser vinduer" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Friksjon" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Grip vinduer" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Oppløsning for rutenett" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Omvendt vindussmekking" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "La vindu skjelve" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Kartleggingseffekt" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Kartleggingseffekt for vinduer" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Kartlegg vinduer" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Maksimeringseffekt" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Minimumsstørrelse for rutenett" # fuzzy, hva i huleste er egentlig vertex? #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimums størrelse for rutenett-vertex" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Flytt vinduer" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Skjelv" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Smekk omvendt" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Smekk vinduer" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fjæringsfriksjon" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "K for fjær" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Fjæringskonstant" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Skru av/pÃ¥ vindussmekking" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Bruk fjæringsmodell for ustødighetseffekt for vinduer" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Oppløsning for rutenett-vertex" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Vinduer som skal være ustødige nÃ¥r de fokuseres" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Vinduer som skal være ustødige nÃ¥r de gripes" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Vinduer som skal være ustødige nÃ¥r de kartlegges" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Vinduer som skal være ustødige nÃ¥r de flyttes" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Ustødighetseffekt nÃ¥r vinduer maksimeres og avmaksimeres" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Ustødige vinduer" #~ msgid "Command line 0" #~ msgstr "Kommandolinje 0" #~ msgid "Run command 0" #~ msgstr "Kjør kommando 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Kommandolinje for skjermbilde" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Kommandolinje for skjermbilde" #~ msgid "Filter Linear" #~ msgstr "Filtrer lineært" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Bruk lineært filter nÃ¥r forstørret" #~ msgid "Zoom Desktop" #~ msgstr "Forstørr skrivebord" #~ msgid "Zoom In" #~ msgstr "Forstørr" #~ msgid "Zoom Out" #~ msgstr "Forminsk" #~ msgid "Zoom Pan" #~ msgstr "Panorer forstørrelse" #~ msgid "Zoom Speed" #~ msgstr "Forstørringshastighet" #~ msgid "Zoom Timestep" #~ msgstr "Tidsskritt for forstørrelse" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Forstørr og panorer skrivebordskuben" #~ msgid "Zoom factor" #~ msgstr "Forstørrelsesfaktor" #~ msgid "Zoom pan" #~ msgstr "Forstørrelsespanorering" #~ msgid "Decrease window opacity" #~ msgstr "Reduser vinduets dekkevne" #~ msgid "Increase window opacity" #~ msgstr "Øk vinduets dekkevne" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Dekkevneverdier for vinduer som skal være gjennomsiktige som standard" #~ msgid "Opacity windows" #~ msgstr "Vinduer som blir pÃ¥virket" #~ msgid "Background Images" #~ msgstr "Bakgrunnsbilder" #~ msgid "Background images" #~ msgstr "Bakgrunnsbilder" #~ msgid "Place windows on a plane" #~ msgstr "Plasser vinduer pÃ¥ et plan" #~ msgid "Plane Down" #~ msgstr "Plan ned" #~ msgid "Plane Left" #~ msgstr "Plan venstre" #~ msgid "Plane Right" #~ msgstr "Plan høyre" #~ msgid "Plane To Face 1" #~ msgstr "Plan til ansikt 1" #~ msgid "Plane To Face 10" #~ msgstr "Plan til ansikt 10" #~ msgid "Plane To Face 11" #~ msgstr "Plan til ansikt 11" #~ msgid "Plane To Face 12" #~ msgstr "Plan til ansikt 12" #~ msgid "Plane To Face 2" #~ msgstr "Plan til ansikt 2" #~ msgid "Plane To Face 3" #~ msgstr "Plan til ansikt 3" #~ msgid "Plane To Face 4" #~ msgstr "Plan til ansikt 4" #~ msgid "Plane To Face 5" #~ msgstr "Plan til ansikt 5" #~ msgid "Plane To Face 6" #~ msgstr "Plan til ansikt 6" #~ msgid "Plane To Face 7" #~ msgstr "Plan til ansikt 7" #~ msgid "Plane To Face 8" #~ msgstr "Plan til ansikt 8" #~ msgid "Plane To Face 9" #~ msgstr "Plan til ansikt 9" #~ msgid "Plane Up" #~ msgstr "Plan oppover" #~ msgid "Plane down" #~ msgstr "Plan nedover" #~ msgid "Plane left" #~ msgstr "Plan til venstre" #~ msgid "Plane right" #~ msgstr "Plan til høyre" #~ msgid "Plane to face 1" #~ msgstr "Plan til ansikt 1" #~ msgid "Plane to face 10" #~ msgstr "Plan til ansikt 10" #~ msgid "Plane to face 11" #~ msgstr "Plan til ansikt 11" #~ msgid "Plane to face 12" #~ msgstr "Plan til ansikt 12" #~ msgid "Plane to face 2" #~ msgstr "Plan til ansikt 2" #~ msgid "Plane to face 3" #~ msgstr "Plan til ansikt 3" #~ msgid "Plane to face 4" #~ msgstr "Plan til ansikt 4" #~ msgid "Plane to face 5" #~ msgstr "Plan til ansikt 5" #~ msgid "Plane to face 6" #~ msgstr "Plan til ansikt 6" #~ msgid "Plane to face 7" #~ msgstr "Plan til ansikt 7" #~ msgid "Plane to face 8" #~ msgstr "Plan til ansikt 8" #~ msgid "Plane to face 9" #~ msgstr "Plan til ansikt 9" #~ msgid "Plane up" #~ msgstr "Plan opp" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Uttoningstid for dekkevnen til skrivebordsvinduer" compiz-0.9.11+14.04.20140409/po/en_GB.po0000644000015301777760000022252712321343002017434 0ustar pbusernogroup00000000000000# English message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2000, 2001 SuSE GmbH. # James Ogley , 2000, 2001. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2001-07-17 16:27+0200\n" "Last-Translator: James Ogley \n" "Language-Team: English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Desktop" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Window Manager" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Scanner" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "&Shrink Windows" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "&Shrink Windows" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "&Shrink Windows" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "&Shrink Windows" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "AutoYast" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Window Manager" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Suspend" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "&Delete Windows completely" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "&Delete Windows completely" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "&Delete Windows" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 #, fuzzy msgid "Minimize Window" msgstr "&Shrink Windows" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Hittite" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Colours" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Active Profile" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Hittite" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Hittite" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Hittite" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Hittite" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Filter: " #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "&Delete Windows" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "&Delete Windows" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "&Set Filter" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Duration" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Duration" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Suspend" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "&Delete Windows" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Duration" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "&Delete Windows" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "&Delete Windows" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "&Delete Windows" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Russian" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Russian Federation" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Russian" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Russian Federation" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Russian" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "Mi'kmaq" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Mi'kmaq" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windows free (%1)" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Hittite" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Command: " #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Command: " #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Command: " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Command: " #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Command: " #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Command: " #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Command: " #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Command: " #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Command: " #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Command: " #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Command: " #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Command: " #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Command: " #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Command '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Command '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Command '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Command '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Command: " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Command: " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Command: " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Command: " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Command: " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Command: " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Command: " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Command: " #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "Active Profile" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "File system" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "AutoYast" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Default Section" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "Default domain" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "Select for Update" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Starting daemon." #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Starting daemon." #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Virtual Device" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "Logging" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "List only detected printers" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "Lower Sorbian" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "&Shrink Windows" #: ../metadata/core.xml.in.in.h:51 #, fuzzy msgid "Maximize Window Vertically" msgstr "&Shrink Windows" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Delay" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "&Radio Clock" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "Resize failed." #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "Refresh" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Show All Partitions" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "&Set Filter" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "&Set Filter" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "&Set Filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Virtual Device" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D Acceleration:" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 #, fuzzy msgid "Advance to next slide" msgstr "Advanced Options" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sydney" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "AutoYast" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Colours" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "Colours" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Desktop" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D Acceleration:" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Suspend" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "Test" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "&Previous" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "Failed files" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "New Size" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "&Delete Windows" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "&Previous" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "local time" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sydney" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Disk Image" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Suspend" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "Test" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Command: " #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "&Delete Windows" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "&Low Capacity" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "&Low Capacity" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Radius" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "&Low Capacity" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "Radius" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "&Shrink Windows" #: ../metadata/decoration.xml.in.h:12 #, fuzzy msgid "Shadow Offset X" msgstr "&Low Capacity" #: ../metadata/decoration.xml.in.h:13 #, fuzzy msgid "Shadow Offset Y" msgstr "&Low Capacity" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "&Low Capacity" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "Radius" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "&Shrink Windows" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "No Description" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind options" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Test" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Contains" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Resize failed." #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Real Time" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Suspend" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Real Time" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "File system" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "&Delete Windows" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "&Shrink Windows" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows free (%1)" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 #, fuzzy msgid "Run Dialog" msgstr "&Tone Dialling" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Error parsing command line." #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "Error parsing command line." #: ../metadata/gnomecompat.xml.in.h:8 #, fuzzy msgid "Show Main Menu" msgstr "&Show Boot Menu" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 #, fuzzy msgid "Show the main menu" msgstr "&Show Boot Menu" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Error parsing command line." #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "Do not log any" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "Do not log any" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "&Shrink Windows" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "&Shrink Windows" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "&Shrink Windows" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "&Shrink Windows" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "Contains" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "Move &Down" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Resize failed." #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "Move &Down" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "Move &Down" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "&Low Capacity" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "Starting daemon." #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "&Shrink Windows" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Starting daemon." #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Bridge" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Bridge" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Bridge" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Bridge" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Occitan (post 1500)" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Occitan (post 1500)" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "&Low Capacity" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Starting daemon." #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Duration" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Duration" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Duration" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Duration" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind options" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windows" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Window Manager" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "&Delete Windows" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Virtual Device" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "&Delete Windows" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Resize failed." #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Virtual Device" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Resize failed." #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind options" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind options" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "&Workgroup" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Resize failed." #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Virtual Device" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Resize failed." #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Virtual Device" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Colours" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Colours" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Initial RAM Disk" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Initial RAM Disk" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Initial RAM Disk" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Initial RAM Disk" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Initial RAM Disk" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Resize failed." #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Colours" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Resize failed." #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Resize failed." #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Resize failed." #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "Resize failed." #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Starting daemon." #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Starting daemon." #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Starting daemon." #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Starting daemon." #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Starting daemon." #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Resize failed." #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "Real Time" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "Pointer to %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "Printer &Description" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Move &Down" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D Acceleration:" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Test" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Test" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Test" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Start Detection" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 #, fuzzy msgid "Zoom" msgstr "Log Out" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "Background" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Initial RAM Disk" #: ../metadata/scale.xml.in.h:15 #, fuzzy msgid "Initiate Window Picker For All Windows" msgstr "Initial RAM Disk" #: ../metadata/scale.xml.in.h:16 #, fuzzy msgid "Initiate Window Picker For Window Group" msgstr "Initial RAM Disk" #: ../metadata/scale.xml.in.h:17 #, fuzzy msgid "Initiate Window Picker For Windows on Current Output" msgstr "Initial RAM Disk" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Scanner" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "&Delete Windows" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "local time" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "local time" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "&Delete Windows" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "&Delete Windows" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Spain" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Hittite" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Error parsing command line." #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Error parsing command line." #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Application Order" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "AutoYast" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "During Boot" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Icons" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "&Shrink Windows" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Desktop" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "&Delete Windows" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "&Delete Windows" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "&Delete Windows" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "&Previous" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Windows" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "&Delete Windows" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Starting daemon." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "&Shrink Windows" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "local time" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "local time" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "&Delete Windows" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Delay" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "Token ring" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "Token ring" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "Token ring" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "Token ring" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "&Delete Windows" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Action" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "&Delete Windows" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Resolution" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "&Delete Windows" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "Maximum Mail Size" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "Maximum Mail Size" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Move &Down" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "&Shrink Windows" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Action" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Skipping %1" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Skipping %1" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "&Delete Windows" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Server Resolution" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Windows" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Command: " #, fuzzy #~ msgid "Run command 0" #~ msgstr "Command '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Error parsing command line." #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Error parsing command line." #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filter: " #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Desktop" #, fuzzy #~ msgid "Zoom In" #~ msgstr "Log Out" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "Log Out" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Log Out" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Suspend" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "Test" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "Log Out" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Log Out" #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "&Delete Windows completely" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Remote Subnet" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Remote Subnet" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane Up" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Plane down" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "Remote Subnet" #, fuzzy #~ msgid "Plane right" #~ msgstr "Remote Subnet" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane up" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Dialog" #~ msgstr "&Tone Dialling" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Window Manager" #, fuzzy #~ msgid "Notification" #~ msgstr "Action" #, fuzzy #~ msgid "Unknown" #~ msgstr "unknown" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Duration" #, fuzzy #~ msgid "Do not modify" #~ msgstr "Do not log any" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "&Low Capacity" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Radius" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D Acceleration: " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D Acceleration: " #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Test" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Russian Federation" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Russian" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Windows" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&Shrink Windows" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&Shrink Windows" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Maximum Mail Size" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Desktop" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Occitan (post 1500)" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D Acceleration: " #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Test" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "local time" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "local time" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Action" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Skipping %1" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "&Set Filter" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Server Resolution" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows free (%1)" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows free (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Suspend" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Test" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Log Out" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Command line %d" #~ msgstr "Command: " #, fuzzy #~ msgid "Run command %d" #~ msgstr "Command: " #, fuzzy #~ msgid "Move Window Types" #~ msgstr "Provider Type" #, fuzzy #~ msgid "Corners" #~ msgstr "Cornish" #, fuzzy #~ msgid "Show switcher" #~ msgstr "Show c&hanges" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Floppy disk" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Terminate" #~ msgstr "Terminals" compiz-0.9.11+14.04.20140409/po/cs.po0000644000015301777760000037426612321343002017077 0ustar pbusernogroup00000000000000# translation of cs.po to # translation of compiz.po to # translation of cs.po to cs_CZ # This file is distributed under the same license as the PACKAGE package. # # Jakub Friedl, 2006. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. # Klara Cihlarova , 2006. # Jakub Friedl , 2006. msgid "" msgstr "" "Project-Id-Version: cs\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-02-11 17:23+0100\n" "Last-Translator: Tomas Hejatko \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Plocha" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Správce oken" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nic" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Měřítko" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximalizovat" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximalizovat okno horizontálnÄ›" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximalizovat okno vertikálnÄ›" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimalizované" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automaticky do popÅ™edí" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Nabídka okna" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Událost pÅ™i rolování nad titulkem okna" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Typ rozmazání" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Průhlednost aktivního okna" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Průhlednost stínu aktivního okna" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Průhlednost tématu metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Průhlednost stínu tématu metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Průhlednost pro aktivní okna s tématem metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Průhlednost pro témata metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Událost pÅ™i rolování nad titulkem okna" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Typ rozmazání použitého pro dekoraci oken" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Použít téma metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Použít téma metacity pro vykreslování dekorací oken" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Zavřít okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "ZruÅ¡it maximalizaci okna" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximalizovat okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimalizovat okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" # nebo nÄ›co jako vizuální doprovod, ukazovátko? #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Anotace" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Barva anotace" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Aktivní moduly" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Vymazat" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Vykreslit" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Vykreslit použitím nástroje" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Iniciovat" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Iniciovat zmÄ›nu velikosti okna" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Iniciovat zmÄ›nu velikosti okna" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Iniciovat" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Šířka linky" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Šířka linky pro anotaci" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Lineární filtr" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Å kálovat okna" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Å kálovat okna" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Filtr textur" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Sytost" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Sytost" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Rychlost sbalení" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Rozmístit okna" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Sytost" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Å kálovat okna" #: ../metadata/blur.xml.in.h:12 #, fuzzy msgid "Blur windows that doesn't have focus" msgstr "Typy oken, která se mají rozhoupat pÅ™i zaměření" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "Å kálovat okna" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Å kálovat okna" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 #, fuzzy msgid "Pulse effect" msgstr "Efekt zaměření" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Rychlost blednutí okna" #: ../metadata/blur.xml.in.h:30 #, fuzzy msgid "Windows that should be affected by focus blur" msgstr "Typy oken, která mohou blednout" #: ../metadata/blur.xml.in.h:31 #, fuzzy msgid "Windows that should be use alpha blur by default" msgstr "Typy oken, která mohou blednout" #: ../metadata/clone.xml.in.h:1 #, fuzzy msgid "Clone Output" msgstr "Výstupy" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Pořídit snímek obrazovky" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "Klávesové zkratky, které spustí příkaz urÄený command10" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "Klávesové zkratky, které spustí příkaz urÄený command1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "Klávesové zkratky, které spustí příkaz urÄený command10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "Klávesové zkratky, které spustí příkaz urÄený command11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "Klávesové zkratky, které spustí příkaz urÄený command2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "Klávesové zkratky, které spustí příkaz urÄený command3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "Klávesové zkratky, které spustí příkaz urÄený command4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "Klávesové zkratky, které spustí příkaz urÄený command5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "Klávesové zkratky, které spustí příkaz urÄený command6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "Klávesové zkratky, které spustí příkaz urÄený command7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "Klávesové zkratky, které spustí příkaz urÄený command8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "Klávesové zkratky, které spustí příkaz urÄený command9" #: ../metadata/commands.xml.in.h:13 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "Klávesové zkratky, které spustí příkaz urÄený command10" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "Klávesové zkratky, které spustí příkaz urÄený command1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "Klávesové zkratky, které spustí příkaz urÄený command10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "Klávesové zkratky, které spustí příkaz urÄený command11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "Klávesové zkratky, které spustí příkaz urÄený command2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "Klávesové zkratky, které spustí příkaz urÄený command3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "Klávesové zkratky, které spustí příkaz urÄený command4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "Klávesové zkratky, které spustí příkaz urÄený command5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "Klávesové zkratky, které spustí příkaz urÄený command6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "Klávesové zkratky, které spustí příkaz urÄený command7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "Klávesové zkratky, které spustí příkaz urÄený command8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "Klávesové zkratky, které spustí příkaz urÄený command9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "Klávesové zkratky, které spustí příkaz urÄený command10" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "Klávesové zkratky, které spustí příkaz urÄený command1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "Klávesové zkratky, které spustí příkaz urÄený command10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "Klávesové zkratky, které spustí příkaz urÄený command11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "Klávesové zkratky, které spustí příkaz urÄený command2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "Klávesové zkratky, které spustí příkaz urÄený command3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "Klávesové zkratky, které spustí příkaz urÄený command4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "Klávesové zkratky, které spustí příkaz urÄený command5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "Klávesové zkratky, které spustí příkaz urÄený command6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "Klávesové zkratky, které spustí příkaz urÄený command7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "Klávesové zkratky, které spustí příkaz urÄený command8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "Klávesové zkratky, které spustí příkaz urÄený command9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Příkazová řádka 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Příkazová řádka 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Příkazová řádka 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Příkazová řádka 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Příkazová řádka 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Příkazový řádek 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Příkazová řádka 3" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Příkazová řádka 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Příkazová řádka 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Příkazová řádka 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Příkazová řádka 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Příkazová řádka 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Příkaz" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Spustit příkaz 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Spustit příkaz 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Spustit příkaz 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Spustit příkaz 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Spustit příkaz 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Spustit příkaz 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Spustit příkaz 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Spustit příkaz 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Spustit příkaz 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Spustit příkaz 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Spustit příkaz 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Spustit příkaz 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktivní moduly" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Povolit vykreslování celoobrazovkových oken bez pÅ™esmÄ›rování do " "mimoobrazovkových pixmap" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Akustický zvonek" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "SlyÅ¡itelné systémové pípnutí" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automaticky do popÅ™edí" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Prodleva automatického pÅ™esunu do popÅ™edí" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatická detekce výstupních zařízení" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatická detekce obnovovací frekvence" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Nejlepší" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Kliknutí k zaměření" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Kliknutím na okno pÅ™esunout zaměření na okno" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Zavřít aktivní okno" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Výchozí ikona" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Výchozí ikona okna" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Kostka plochy" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detekovat výstupy" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Zjistit obnovovací frekvenci" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rychlé" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Typy okna pro efekt pÅ™i zaměření" #: ../metadata/core.xml.in.in.h:25 #, fuzzy msgid "Focus Prevention Windows" msgstr "Typy okna pro efekt pÅ™i zaměření" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Typy okna pro efekt pÅ™i zaměření" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Hlavní nastavení" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Hlavní nastavení compizu" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Dobré" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Skrýt okna nepřítomná v liÅ¡tÄ› úloh" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Skrýt vÅ¡echna okna a zaměřit na plochu" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Skrýt okna nepřítomná v liÅ¡tÄ› úloh pÅ™i vstupu do režimu zobrazení plochy" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Vodorovná virtuální velikost" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "PÅ™i maximalizaci ignorovat tipy" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "PÅ™i maximalizaci ignorovat tipy k přírůstku velikosti a pomÄ›ru" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Interval pÅ™ed pÅ™enesením vybraných oken do popÅ™edí" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Interval pro odeslání pingu" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "SvÄ›tlo" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Seznam právÄ› aktivních modulů" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Seznam Å™etÄ›zců, které popisují výstupní zařízení" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Dát okno do pozadí" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "PÅ™esunout okno do pozadí" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximalizovat okno horizontálnÄ›" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximalizovat okno vertikálnÄ›" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximalizovat aktivní okno" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximalizovat aktivní okno horizontálnÄ›" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximalizovat aktivní okno vertikálnÄ›" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimalizovat aktivní okno" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Běžná" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "PoÄet ploch" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "PoÄet virtuálních ploch" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "ProvádÄ›t aktualizace obrazovky pouze bÄ›hem intervalu vertikálního zatemnÄ›ní" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Výstupy" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Prodleva pingu" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Dát do popÅ™edí pÅ™i kliknutí" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "PÅ™enést okno do popÅ™edí" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Dát vybraná okna do popÅ™edí po uplynutí intervalu" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "PÅ™esunout okno nad ostatní okna" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Dát okna do popÅ™edí pÅ™i kliknutí" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Obnovovací frekvence" #: ../metadata/core.xml.in.in.h:74 #, fuzzy msgid "Screen size multiplier for horizontal virtual size" msgstr "Násobek vodorovné virtuální velikosti obrazovky" #: ../metadata/core.xml.in.in.h:75 #, fuzzy msgid "Screen size multiplier for vertical virtual size" msgstr "Násobek svislé virtuální velikosti obrazovky" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Zobrazit plochu" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Pomalé animace" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "Chytrý" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synchronizovat pÅ™i VBlank " #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Filtrování textur" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtr textur" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtrování textur" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Rychlost pÅ™ekreslování obrazovky (poÄet/s)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "PÅ™epnout maximalizaci okna" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "PÅ™epnout okno maximalizované horizontálnÄ›" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "PÅ™epnout okno maximalizované vertikálnÄ›" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "PÅ™epnout stínování okna" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "PÅ™epnout maximalizaci aktivního okna" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "PÅ™epnout horizontální maximalizaci aktivního okna" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "PÅ™epnout vertikální maximalizaci aktivního okna" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "PÅ™epnout stínování aktivního okna" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "PÅ™epnout použití pomalých animací" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "ZruÅ¡it maximalizaci aktivního okna" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Unredirect Fullscreen Windows" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Použít rozptýlené svÄ›tlo pÅ™i transformaci okna" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Svislá virtuální velikost" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Akcelerace" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "PÅ™izpůsobit obrázek" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "PÅ™izpůsobit vrchní obrázek rotaci" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Postoupit k dalšímu snímku" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animovat nebeskou báň" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animovat nebeskou báň pÅ™i rotaci kostky" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Automaticky do popÅ™edí" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Barva vrchní a spodní strany kostky" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Barva, která se použije na dolní Äást gradientu nebeské bánÄ›." #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Barva, která se použije na horní Äást gradientu nebeské bánÄ›." #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Barva kostky" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Barva kostky" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Kostka plochy" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Zrychlení sbalení" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Rychlost sbalení" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "ÄŒasový krok sbalení" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Jeli to možné, vytvářet pro kvalitní Å¡kálování mipmapy" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Jít zpÄ›t na pÅ™edchozí snímek" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Obrázkové soubory" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Obrázek pro texturu nebeské bánÄ›" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Iniciovat průhlednost kostky pouze pokud je rotace řízena myší" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "UvnitÅ™ kostky" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "V kostce" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Seznam PNG a SVG souborů, které mají být vykresleny na vrchu kostky" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Další snímek" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "V kostce" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Krytí bÄ›hem rotace" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Krytí bez rotace" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Krytí (neprůhlednost) ploch kostky bÄ›hem rotace." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Krytí (neprůhlednost) ploch kostky." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Rozmístit okna na kostku" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "PÅ™edchozí snímek" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Vykreslit nebeskou báň" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Å kálovat obrázek" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "ZmÄ›nit velikost obrázků podle vrchu kostky" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Možnosti zobrazení kostky, pokud je použito víc výstupních zařízení." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Nebeská báň" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "KoneÄná barva gradientu nebeské bánÄ›" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "PoÄáteÄní barva gradientu nebeské bánÄ›" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Obrázek nebeské bánÄ›" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Rychlost" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "ÄŒasový krok" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Průhlednot pouze pÅ™i rotování za pomoci myÅ¡i" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Rozbalit" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Rozbalit kostku" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Ovládací backend Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Příkaz" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekorovaná okna" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Příkazová řádka programu pro dekorace, která je spuÅ¡tÄ›na, pokud jeÅ¡tÄ› není " "spuÅ¡tÄ›n žádný program pro dekorace" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Posun vrženého stínu X" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Posun vrženého stínu Y" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Barva vrženého stínu" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Krytí vrženého stínu" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "PolomÄ›r vrženého stínu" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Barva stínu" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Posun stínu X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Posun stínu Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Krytí stínu" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "PolomÄ›r stínu" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Stínované okna" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Dekorace oken" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Dekorace oken" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Typy oken, která mohou být dekorovány" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Typy oken, která mohou mít stín" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Rychlost otáÄení" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Omezení Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "NormálnÄ› mÄ›nÄ›né okna" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Doba zprůhlednÄ›ní" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Slábnout pří minimalizaci/otevÅ™ení/zavÅ™ení" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Rychlost blednutí" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Doba zprůhlednÄ›ní" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Efekt slábnutí okna pří událostech : Minimalizace/OtevÅ™ení/ZavÅ™ení" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efekt blednutí pÅ™i systémovém pípnutí" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "Blednutí mapovaných oken a materializace oken nemapovaných" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Blednutí" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Slábnutí oken" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Celoobrazovkový vizuální zvonek" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Celoobrazovkový efekt slábnutí pÅ™i systémovém pípnutí" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Vizuální zvonek" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Rychlost blednutí okna" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Typy oken, které budou zobrazeny v režimu Å¡kálování" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Typy oken, která mohou blednout" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Přípojný bod" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Přípojný bod" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Uživatelský souborový systém" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Uživatelský souborový systém" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "Gconf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Kontrolní backend GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Podpora hlavního napojení na GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Otevřít terminál" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Spustit dialog" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Příkaz pro otevÅ™ení terminálu" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Screenshot command line" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Zobrazit hlavní nabídku" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Zobrazit dialog spouÅ¡tÄ›ní aplikace" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Zobrazit hlavní nabídku" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Pořídit snímek obrazovky" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Pořídit snímek okna" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Příkaz pro otevÅ™ení terminálu" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Window screenshot command line" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "NemÄ›nit" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Modul upozornÄ›ní zmÄ›ny soubou" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kontrolní backend Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efekt minimalizace" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimalizovatelná okna" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Rychlost minimalizace" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "ÄŒasový krok minimalizace" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Stálost stínu" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Stálost stínu" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformovat okna pÅ™i jejich minimalizaci a zruÅ¡ení minimalizace" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Typy oken, která se mají pÅ™i minimalizaci transformovat" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Omezení Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Omezení Y souÅ™adnice na pracovní prostor" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "Aktualizovat pozici okna až pÅ™i ukonÄení pÅ™esunu" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Iniciovat pÅ™esun okna" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "\"Líné\" pÅ™esouvání" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "PÅ™esunout okno" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "PÅ™esunout okno" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Krytí" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Úroveň krytí pÅ™esouvaných oken" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Snapoff and auto unmaximized maximized windows when dragging" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Odtrhávat maximalizovaná okna" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Zahájit pohyb okna" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Jas" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Jas" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Jas" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Jas" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Snížit krytí" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Zvýšit krytí" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Krok zmÄ›ny krytí" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Krok zmÄ›ny krytí" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Krok krytí" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Úroveň krytí pÅ™esouvaných oken" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Krytí bÄ›hem rotace" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Sytost" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Sytost" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Sytost" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Sytost" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Dekorace oken" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Typy oken" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Mapované" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Okna, které budou implicitnÄ› rozmístÄ›ny" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Typy oken, která mohou blednout" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Okna, které budou implicitnÄ› rozmístÄ›ny" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmus použitý pro rozmístÄ›ní oken" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Kaskáda" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centrovaný" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Správce oken" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Typy okna pro efekt pÅ™i zaměření" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Vodorovná virtuální velikost" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Rozmístit okna" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Umístit mapovaná okna na odpovídající pozice" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "RozmístÄ›ní oken" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Pozicované okna" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Náhodný" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Vyberte kde jsou okna zobrazeny, pokud je použito více výstupních zařízení" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Chytrý" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "Na vÅ¡ech výstupních výstupních zařízeních" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Vodorovná virtuální velikost" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Zobrazit minimalizovaná okna" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Nouzová Å™eÅ¡ení umístÄ›ní oken" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Okna, které budou implicitnÄ› rozmístÄ›ny" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Okna, které budou implicitnÄ› rozmístÄ›ny na urÄitou plochu" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Dekorace oken" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "ŘeÅ¡ení problémů" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Pozice X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Pozice plochy na ose X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Hodnoty pozice na ose X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Pozice Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Pozice plochy na ose Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Hodnoty pozice na ose Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Podpora obrázkového formátu PNG" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Regexpy" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Podpora regulárních výrazů pro urÄení typu oken" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Barva okraje" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Barva okraje použitá pro obrysové a pÅ™ekrývací typy zmÄ›ny velikosti" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Výchozí mód zmÄ›ny velikosti" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Vývhozí mód použití pÅ™i zmÄ›nÄ› velikosti oken" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Výplňová barva" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" "Barva použitá pro pÅ™ekrytí plochy okna pÅ™i použití obrysové zmÄ›ny velikosti " "okna" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Iniciovat normální zmÄ›nu velikosti okna" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Iniciovat obrysovou zmÄ›nu velikosti okna" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Iniciovat zmÄ›nu velikosti okna pÅ™ekrytím" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Iniciovat zmÄ›nu velikosti okna rozpÄ›tím" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Iniciovat zmÄ›nu velikosti okna" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "NormálnÄ› mÄ›nÄ›né okna" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Obrysové" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Obrysová zmÄ›na velikosti okna" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "PÅ™ekrytí" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "ZmÄ›nit velikost okna pÅ™ekrytím" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "ZmÄ›nit velikost okna" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "ZmÄ›nit velikost okna" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Zahájit zmÄ›nu velikosti okna" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Zahájit zmÄ›nu velikosti okna rozpÄ›tím" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Zahájit zmÄ›nu velikosti okna normálnÄ›" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Zahájit zmÄ›nu velikosti okna obrysem" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Zahájit zmÄ›nu velikosti okna pÅ™ekrytím" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "RozpÄ›tí" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "RozpÄ›tím zmÄ›nit velikost okna" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Typy oken, která budou mÄ›nit velikost normálnÄ›" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Typy oken, která budou mÄ›nit velikost s efektem obrysu" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Typy oken, která budou mÄ›nit velikost s efektem pÅ™ekrytí" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Typy oken, která budou mÄ›nit velikost s efektem rozpÄ›tí" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "PÅ™eklápÄ›ní hran DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "PÅ™eklápÄ›ní hran pÅ™i pÅ™esunu" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "PÅ™eklápÄ›ní hran ukazatelem" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Doba pÅ™eklopení" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "PÅ™eklopit na levé zorné pole a zdeformovat ukazatel" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "PÅ™eklopit na další viewport pÅ™i pÅ™etažení objektu na hranici obrazovky" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "PÅ™eklopit na další viewport pÅ™i umístÄ›ní ukazatele na hranici obrazovky" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "PÅ™eklopit na další viewport pÅ™i pÅ™esunu okna na hranici obrazovky" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "PÅ™eklopit na pravé zorné pole a zdeformovat ukazatel" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Invertovat osu Y pro pohyb ukazatele" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Pointer Invert Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Citlivost ukazatele" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 #, fuzzy msgid "Raise window when rotating" msgstr "Dát okna do popÅ™edí pÅ™i kliknutí" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "OtoÄit kostkou" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "OtoÄit pÅ™eklopením vlevo" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "OtoÄit pÅ™eklopením vpravo" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "OtoÄit vlevo" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "OtoÄit vlevo s oknem" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "OtoÄit vpravo" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "OtoÄit vpravo s oknem" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "OtoÄit na" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "OtoÄit na stranu 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Rotovat na stranu 1 s oknem" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "OtoÄit na stranu 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Rotovat na stranu 10 s oknem" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "OtoÄit na stranu 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "OtoÄit na stranu 11 s oknem" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "OtoÄit na stranu 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "OtoÄit na stranu 12 s oknem" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "OtoÄit na stranu 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "OtoÄit na stranu 2 s oknem" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "OtoÄit na stranu 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "OtoÄit na stranu 3 s oknem" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "OtoÄit na stranu 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "OtoÄit na stranu 4 s oknem" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "OtoÄit na stranu 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "OtoÄit na stranu 5 s oknem" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "OtoÄit na stranu 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "OtoÄit na stranu 6 s oknem" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "OtoÄit na stranu 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "OtoÄit na stranu 7 s oknem" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "OtoÄit na stranu 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "OtoÄit na stranu 8 s oknem" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "OtoÄit na stranu 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "OtoÄit na stranu 9 s oknem" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "OtoÄit kostkou" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "OtoÄit kostkou ploch" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "OtoÄit vlevo" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "OtoÄit vlevo a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "OtoÄit vpravo" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "OtoÄit vpravo a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "OtoÄit na stranu 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Rotovat na stranu 1 s oknem" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "OtoÄit na stranu 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "OtoÄit na stranu 1 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "OtoÄit na stranu 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "OtoÄit na stranu 10 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "OtoÄit na stranu 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "OtoÄit na stranu 11 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "OtoÄit na stranu 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "OtoÄit na stranu 12 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "OtoÄit na stranu 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "OtoÄit na stranu 2 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "OtoÄit na stranu 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "OtoÄit na stranu 3 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "OtoÄit na stranu 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "OtoÄit na stranu 4 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "OtoÄit na stranu 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "OtoÄit na stranu 5 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "OtoÄit na stranu 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "OtoÄit na stranu 6 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "OtoÄit na stranu 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "OtoÄit na stranu 7 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "OtoÄit na stranu 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "OtoÄit na stranu 8 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "OtoÄit na stranu 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "OtoÄit na stranu 9 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "OtoÄit na zorné pole" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "OtoÄit okno" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "OtoÄit s oknem" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Zrychlení otáÄení" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Rychlost otáÄení" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "ÄŒasový krok otáÄení" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Rychlost otáÄení" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Citlivost pohybu ukazatele" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "PÅ™ichytávat otáÄející se kostku za horní stranu" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "PÅ™ichytávat otáÄející se kostku za horní stranu" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "PÅ™ichytávat k horní stranÄ›" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "PÅ™ichytávat k horní stranÄ›" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Zahájit otáÄení" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "ÄŒasový limit pÅ™ed pÅ™eklopením zorného pole" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "ZvÄ›tÅ¡ení" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Hodnota krytí v procentech" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Velká" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Ztmavit pozadí" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Ztmavit pozadí pÅ™i Å¡kálování oken" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Symbol" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ÄŒas vznášení" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Spustit výbÄ›r oken" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Spustit výbÄ›r oken pro vÅ¡echna okna" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Spustit výbÄ›r oken pro skupinu oken" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Spustit výbÄ›r oken pro okna na aktuálním výstupu" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Rozvržení a poÄátek transformace vÅ¡ech oken" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Rozvržení a poÄátek transformace skupiny oken" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Rozvržení a poÄátek transformace oken" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Rozvržení a poÄátek transformace oken na aktuálním výstupu" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Na vÅ¡ech výstupních výstupních zařízeních" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Na aktuálním výstupním zařízení" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "PÅ™ekrýt ikonou" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "PÅ™ekrýt okna ikonou, pokud je zmÄ›nÄ›na jejich velikost" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Měřítko" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Å kálovatelné okna" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Rychlost zmÄ›ny velikosti" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "ÄŒasový krok zmÄ›ny velikosti" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Å kálovat okna" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Vyberte kde jsou okna zobrazeny, pokud je použito více výstupních zařízení" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Mezera mezi okny" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Mezery" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Udává dobu (v ms) pÅ™ed ukonÄením režimu zmÄ›ny velikosti, pokud je ukazatel " "umístÄ›n nad oknem" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Typy oken, které budou zobrazeny v režimu Å¡kálování" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Automaticky otevřít snímek v této aplikaci" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Adresář" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Pořídit snímek obrazovky" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Spustit aplikaci : " #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Uložit snímek obrazovky do této složky" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Snímek obrazovky" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Modul snímku obrazovky" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "SVG" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Podpora obrázkového formátu SVG" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Hodnota jasu v procentech" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Hodnota sytosti v procentech" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "PÅ™epínaÄ aplikací" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automaticky do popÅ™edí" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "PÅ™enést na popÅ™edí" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "PÅ™enést vybrané okno na popÅ™edí" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Vzdálená plocha může být pÅ™i pÅ™epínání oken oddálena" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikona" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimalizované" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Kostka plochy" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Další okno" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Další okno(vÅ¡echna okna)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Další okno (bez pÅ™epínaÄe)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Zobrazit pÅ™epínaÄ, pokud není viditelný, a vybrat další okno" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Zobrazit pÅ™epínaÄ, pokud není viditelný, a vybrat další okno ze vÅ¡ech oken" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Zobrazit pÅ™epínaÄ, pokud není viditelný, a vybrat pÅ™edchozí okno" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Zobrazit pÅ™epínaÄ, pokud není viditelný, a vybrat pÅ™edchozí okno ze vÅ¡ech " "oken" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "PÅ™edchozí snímek" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "PÅ™edchozí okno" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "PÅ™edchozí okno(vÅ¡echna okna)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "PÅ™edchozí okno (bez pÅ™epínaÄe)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Zobrazovat vybrané okna pÅ™i pÅ™epínání" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Vybrat další okno" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Vybrat další okno bez zobrazení pÅ™epínaÄe" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Vybrat pÅ™edchozí okno" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Vybrat pÅ™edchozí okno bez zobrazení pÅ™epínaÄe" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Zobrazit ikonu vedle náhledu" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Zobrazit minimalizovaná okna" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Rychlost pÅ™epínaÄe" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "ÄŒasový krok pÅ™epínaÄe" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Å kálovat okna" #: ../metadata/switcher.xml.in.h:41 #, fuzzy msgid "Windows that should be shown in switcher" msgstr "Typy oken, která mají být zobrazena v pÅ™epínaÄi" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "PÅ™ehrávání videa" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "PÅ™ehrávání videa" #: ../metadata/video.xml.in.h:4 #, fuzzy msgid "YV12 colorspace" msgstr "Barevné schéma YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "PÅ™idat Äáru" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "PÅ™idat bod" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Do různých akcí plochy pÅ™idává efekt vody" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "ZpoždÄ›ní (v ms) mezi jednotlivými kapkami" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Povolit vodní efekty ukazatele" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Čára" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Offset Scale" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Bod" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "ZpoždÄ›ní deÅ¡tÄ›" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Vlna v nadpisu" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "PÅ™epnout déšť" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "PÅ™epnout efekt deÅ¡tÄ›" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "PÅ™epnout stÄ›raÄ" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "PÅ™epnout efekt stÄ›raÄe" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Vodní efekt" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Měřítko odsazení vody" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efekt vlny v nadpisu okna" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efekt zaměření" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efekt zaměření oken" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Typy oken pro efekt pÅ™i zaměření" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "TÅ™ení" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Typy oken pro efekt pÅ™i uchopení" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "RozliÅ¡ení mřížky" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Invertované pÅ™ichytávání oken" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "RozechvÄ›t okno" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efekt mapování" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Efekt mapování oken" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Mapované" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efekt maximalizace" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Minimální velikost mřížky" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimální velikost vrcholů mřížky" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "PÅ™esunované" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "ChvÄ›ní" # 52895 AttribValues/label #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Invertované pÅ™ichytávání" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "PÅ™ichytávat okna" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "TÅ™ení pružiny" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Pružina K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Konstanta pružiny" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "PÅ™epnout pÅ™ichytávání oken" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Pro efekt rozhoupání okna použít pružinový model" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "RozliÅ¡ení vrcholů mřížky" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Typy oken, která se mají rozhoupat pÅ™i zaměření" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Typy oken, která se mají rozhoupat pÅ™i uchopení" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Typy oken, která se mají rozhoupat pÅ™i mapování" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Typy oken, která se mají rozhoupat pÅ™i pÅ™esunu" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Vlnivý efekt" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Vlnící se okna" #~ msgid "Command line 0" #~ msgstr "Příkazová řádka 0" #~ msgid "Run command 0" #~ msgstr "Spustit příkaz 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Screenshot command line" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Screenshot command line" #~ msgid "Filter Linear" #~ msgstr "Lineární filtr" #~ msgid "Use linear filter when zoomed in" #~ msgstr "PÅ™i pÅ™iblížení používat lineární filtr" #~ msgid "Zoom Desktop" #~ msgstr "PÅ™iblížit plochu" #~ msgid "Zoom In" #~ msgstr "PÅ™iblížit" #~ msgid "Zoom Out" #~ msgstr "Oddálit" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "PÅ™iblížit" #~ msgid "Zoom Speed" #~ msgstr "Rychlost pÅ™iblížení" #~ msgid "Zoom Timestep" #~ msgstr "ÄŒasový krok pÅ™iblížení" #~ msgid "Zoom and pan desktop cube" #~ msgstr "PÅ™iblížit a posunout kostku ploch" #~ msgid "Zoom factor" #~ msgstr "Násobek pÅ™iblížení" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "PÅ™iblížit" #~ msgid "Decrease window opacity" #~ msgstr "Snížit krytí oken" #~ msgid "Increase window opacity" #~ msgstr "Zvýšit krytí okna" #~ msgid "Opacity window values" #~ msgstr "Hodnoty průhlednosti pro okna" #~ msgid "Opacity windows" #~ msgstr "Průhledné okna" #~ msgid "Background Images" #~ msgstr "Obrázky pozadí" #~ msgid "Background images" #~ msgstr "Obrázky na pozadí" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Rozmístit okna na kostku" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Rozmístit okna" #, fuzzy #~ msgid "Plane Left" #~ msgstr "OtoÄit vlevo" #, fuzzy #~ msgid "Plane Right" #~ msgstr "OtoÄit vpravo" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Rozmístit okna" #, fuzzy #~ msgid "Plane down" #~ msgstr "Rozmístit okna" #, fuzzy #~ msgid "Plane left" #~ msgstr "OtoÄit vlevo" #, fuzzy #~ msgid "Plane right" #~ msgstr "OtoÄit vpravo" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane up" #~ msgstr "Rozmístit okna" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Doba, za kterou zprůhlední pozadí ploch kostky" #~ msgid "Open window menu" #~ msgstr "Otevřít nabídku okna" #~ msgid "Dock" #~ msgstr "Dok" #~ msgid "Toolbar" #~ msgstr "LiÅ¡ta nástrojů" #~ msgid "Menu" #~ msgstr "Nabídka" #~ msgid "Utility" #~ msgstr "Nástroj" #~ msgid "Splash" #~ msgstr "Úvodní okno" #~ msgid "Dialog" #~ msgstr "Dialogové okno" #~ msgid "DropdownMenu" #~ msgstr "Rozevírací nabídka" #~ msgid "PopupMenu" #~ msgstr "Místní nabídka" #~ msgid "Tooltip" #~ msgstr "Popisek" #~ msgid "Notification" #~ msgstr "Oznámení" #~ msgid "Combo" #~ msgstr "Pole se seznamem" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "Modální dialogové okno" #~ msgid "Fullscreen" #~ msgstr "Celá obrazovka" #~ msgid "Unknown" #~ msgstr "Neznámé" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command10" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command1" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command10" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command11" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command2" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command3" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command4" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command5" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command6" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command7" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command8" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command9" #, fuzzy #~ msgid "" #~ "Add line (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Add point (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Advance to next slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Hodnota jasu v procentech" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Hodnota krytí v procentech" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Hodnota sytosti v procentech" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Sytost" #, fuzzy #~ msgid "" #~ "Clear (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Close active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Decrease window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "ZpoždÄ›ní (v ms) mezi jednotlivými kapkami" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "Vzdálená plocha může být pÅ™i pÅ™epínání oken oddálena" #~ msgid "Do not modify" #~ msgstr "NemÄ›nit" #, fuzzy #~ msgid "" #~ "Draw using tool (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Posun vrženého stínu X" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Posun vrženého stínu Y" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Krytí vrženého stínu" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "PolomÄ›r vrženého stínu" #, fuzzy #~ msgid "" #~ "Enable pointer water effects (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Flip to left viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Flip to right viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Efekt pÅ™i zaměření okna (None, Shiver)" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Vybrat pÅ™edchozí okno" #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Zrychlení sbalení (1.0-20.0)" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Rychlost sbalení (0.1-50.0)" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "ÄŒasový krok sbalení (0.1-50.0)" #, fuzzy #~ msgid "" #~ "Go back to previous slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Hide all windows and focus desktop (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Increase window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Initiate annotate drawing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Initiate annotate erasing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Initiate clone selection (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Initiate rectangle screenshot (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "Interval pÅ™ed pÅ™enesením vybraných oken do popÅ™edí" #, fuzzy #~ msgid "" #~ "Layout and start transforming all windows (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Layout and start transforming window group (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "Rozvržení a poÄátek transformace oken na aktuálním výstupu" #, fuzzy #~ msgid "" #~ "Lower window beneath other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Make window shiver (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Efekt mapování okna (None, Shiver)" #, fuzzy #~ msgid "" #~ "Maximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Maximize active window horizontally (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Maximize active window vertically (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Minimize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Rychlost minimalizace (0.1-50.0)" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Rychlost minimalizace (0.1-50.0)" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Minimální velikost vrcholů mřížky" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "PoÄet virtuálních ploch" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Krok zmÄ›ny krytí" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Úroveň krytí pÅ™esouvaných oken" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Úroveň krytí pÅ™esouvaných oken" #, fuzzy #~ msgid "" #~ "Open a terminal (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Open window menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "PÅ™ekrýt okna ikonou, pokud je zmÄ›nÄ›na jejich velikost" #, fuzzy #~ msgid "" #~ "Plane down (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane up (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #~ msgid "Plugins that this must load before" #~ msgstr "Moduly, které musí být tímto pÅ™edem naÄteny" #~ msgid "Plugins that this requires" #~ msgstr "Moduly, které jsou tímto vyžadovány" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Zobrazit pÅ™epínaÄ, pokud není viditelný, a vybrat další okno ze vÅ¡ech oken" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Zobrazit pÅ™epínaÄ, pokud není viditelný, a vybrat další okno ze vÅ¡ech oken" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Zobrazit pÅ™epínaÄ, pokud není viditelný, a vybrat pÅ™edchozí okno ze vÅ¡ech " #~ "oken" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Zobrazit pÅ™epínaÄ, pokud není viditelný, a vybrat pÅ™edchozí okno ze vÅ¡ech " #~ "oken" #, fuzzy #~ msgid "" #~ "Pulse effect (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Raise window above other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate left and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate right and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to viewport (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate with window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Zrychlení sbalení (1.0-20.0)" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Rychlost pÅ™iblížení (0.1-50)" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "ÄŒasový krok pÅ™iblížení (0.1-50.0)" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Rychlost Å¡kálování (0.1-50.0)" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "ÄŒasový krok Å¡kálování (0.1-50.0)" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "Násobek vodorovné virtuální velikosti obrazovky" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "Násobek svislé virtuální velikosti obrazovky" #, fuzzy #~ msgid "" #~ "Select next window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Select previous window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Citlivost pohybu ukazatele" #~ msgid "Shade resistance (0-100)" #~ msgstr "Stálost stínu (0-100)" #, fuzzy #~ msgid "" #~ "Show Run Application dialog (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Show the main menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Mezera mezi okny" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "TÅ™ení pružiny" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Konstanta pružiny" #, fuzzy #~ msgid "" #~ "Start Rotation (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Start moving window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Start resizing window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Rychlost Å¡kálování (0.1-50.0)" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "ÄŒasový krok Å¡kálování (0.1-50.0)" #, fuzzy #~ msgid "" #~ "Take a screenshot (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Take a screenshot of a window (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Filtrování textur (Rychlé, Dobré, Nejlepší)" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "Rychlost pÅ™ekreslování obrazovky (poÄet/s)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Udává dobu (v ms) pÅ™ed ukonÄením režimu zmÄ›ny velikosti, pokud je " #~ "ukazatel umístÄ›n nad oknem" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "ÄŒasový limit pÅ™ed pÅ™eklopením zorného pole" #, fuzzy #~ msgid "" #~ "Toggle active window maximized (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized horizontally (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized vertically (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle active window shaded (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle rain effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle use of slow animations (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle window snapping (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle wiper effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #~ msgid "USe linear filter when zoomed in" #~ msgstr "PÅ™i pÅ™iblížení používat lineární filtr" #, fuzzy #~ msgid "" #~ "Unfold cube (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Unmaximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "RozliÅ¡ení vrcholů mřížky" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Měřítko odsazení vody" #, fuzzy #~ msgid "" #~ "Wave effect from window title (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Rychlost blednutí okna" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Rychlost blednutí okna" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Typy oken, která mohou blednout" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Typy oken, která mohou blednout" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Typy oken, která mohou blednout" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Typy oken, která mohou blednout" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "Typy oken, která mají mÄ›nit velikost v režimu zmÄ›ny velikosti" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Typy oken, která mají být zobrazena v pÅ™epínaÄi" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Typy oken, která se mají pÅ™i minimalizaci transformovat" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Typy oken, která mohou blednout" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Typy oken, která se mají rozhoupat pÅ™i zaměření" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "Typy oken, která se mají rozhoupat pÅ™i uchopení" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Typy oken, která se mají rozhoupat pÅ™i mapování" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Typy oken, která se mají rozhoupat pÅ™i pÅ™esunu" #, fuzzy #~ msgid "" #~ "Zoom In (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Zoom Out (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuÅ¡tÄ›ní režimu Å¡kálování (Vlevo nahoÅ™e, Vpravo nahoÅ™e, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Rychlost pÅ™iblížení (0.1-50)" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "ÄŒasový krok pÅ™iblížení (0.1-50.0)" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Násobek pÅ™iblížení" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "OtoÄit na stranu %d" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "OtoÄit na stranu %d s oknem" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "OtoÄit na stranu %d a pÅ™enést s sebou aktivní okno" #~ msgid "Rotate To Face %d" #~ msgstr "OtoÄit na stranu %d" #~ msgid "Rotate to face %d" #~ msgstr "OtoÄit na stranu %d" #~ msgid "Rotate To Face %d with Window" #~ msgstr "OtoÄit na stranu %d s oknem" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "OtoÄit na stranu %d a pÅ™enést s sebou aktivní okno" #~ msgid "Command line %d" #~ msgstr "Příkazová řádka %d" #~ msgid "Command line to be executed in shell when run_command%d is invoked" #~ msgstr "" #~ "Příkaz, který se vykoná, pokud je v shellu volán příkaz run_command%d" #~ msgid "Run command %d" #~ msgstr "Spustit příkaz %d" #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command%d" #~ msgstr "Klávesové zkratky, které spustí příkaz urÄený command%d" #~ msgid "Move Window Types" #~ msgstr "Typy oken pro efekt pÅ™i pÅ™esunu" #~ msgid "Corners" #~ msgstr "Rohy" #~ msgid "Focus window when mouse moves over them" #~ msgstr "Změřit okno, když se nad nÄ›j pÅ™esune myÅ¡" #~ msgid "Initiate All Windows" #~ msgstr "Iniciovat vÅ¡echna okna" #~ msgid "Initiate Keyboard Window Move" #~ msgstr "Iniciovat pÅ™esun okna klávesnice" #~ msgid "Initiate Keyboard Window Resize" #~ msgstr "Iniciovat zmÄ›nu velikosti okna klávesnice" #~ msgid "Initiate Window Switcher" #~ msgstr "Spustit pÅ™epínaÄ oken" #~ msgid "Modifier to show switcher for all windows" #~ msgstr "Modifikátor pro zobrazení pÅ™epínaÄe vÅ¡ech oken" #~ msgid "Return from scale view" #~ msgstr "Návrat ze Å¡kálovaného pohledu" #~ msgid "Show switcher" #~ msgstr "Zobrazit pÅ™epínaÄ" #~ msgid "Sloppy Focus" #~ msgstr "Sloppy Focus" #~ msgid "Start moving window using keyboard" #~ msgstr "Zahájit pohyb okna z klávesnice" #~ msgid "Terminate" #~ msgstr "UkonÄit" #~ msgid "Water effect on system beep" #~ msgstr "Vodní efekt pÅ™i systémovém zvonku" #~ msgid "" #~ "Window types that should be fading (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které mají blednout (Desktop, Dock, Toolbar, Menu, Utility, " #~ "Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgid "" #~ "Window types that should be transformed when minimized (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgstr "" #~ "Typy oken, které mají být transformovány pÅ™i minimalizaci (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgid "" #~ "Window types that should scaled in scale mode (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které mají být Å¡kálovány v režimu Å¡kálování (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgid "" #~ "Window types that should shown in switcher (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které mají být zobrazeny v pÅ™epínaÄi (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgid "" #~ "Window types that should wobble when focused (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které se pÅ™i zaměření mají rozhoupat (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgid "" #~ "Window types that should wobble when grabbed (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které se pÅ™i uchopení mají rozhoupat (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgid "" #~ "Window types that should wobble when mapped (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které se pÅ™i mapování mají rozhoupat (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgid "" #~ "Window types that should wobble when moved (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které se pÅ™i pÅ™esouvání mají rozhoupat (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgid "Wobble effect on system beep" #~ msgstr "Efekt rozhoupání pÅ™i systémovém pípnutí" compiz-0.9.11+14.04.20140409/po/ml_IN.po0000644000015301777760000017045012321343002017455 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2009-04-09 13:21+0200\n" "Last-Translator: Jesse P Francis \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "പണിയിടം" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 #, fuzzy msgid "Compiz" msgstr "കോമàµà´ªà´¿à´¸àµ" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "à´’à´¨àµà´¨àµà´®à´¿à´²àµà´²" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "ഉയരàµâ€à´¤àµà´¤àµà´•" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "താഴàµà´¤àµà´¤àµà´•" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" compiz-0.9.11+14.04.20140409/po/mr.po0000644000015301777760000016073312321343002017100 0ustar pbusernogroup00000000000000# Marathi message file for YaST2 (@memory@). # Copyright (C) 2006 SUSE Linux Products GmbH. # "( अमेय पाळंदे ) Ameya Palande" <2ameya@gmail.com> # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-07-09 17:00+0530\n" "PO-Revision-Date: 2005-07-29 15:37+0530\n" "Last-Translator: \"( अमेय पाळंदे ) Ameya Palande\" <2ameya@gmail.com>\n" "Language-Team: Marathi \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4417 #: ../metadata/core.xml.in.h:24 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.h:154 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4442 #: ../metadata/core.xml.in.h:85 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4484 #: ../metadata/core.xml.in.h:91 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4601 #: ../metadata/core.xml.in.h:161 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4620 msgid "Shade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4640 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4666 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4686 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4706 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4732 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5089 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5098 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5113 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 #, fuzzy msgid "Draw using tool" msgstr "सà¥à¤°à¥‚ होताना" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:11 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 ../metadata/zoom.xml.in.h:2 #, fuzzy msgid "Initiate" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "संरचना संचित करा" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "संरचना संचित करा" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "संरचना संचित करा" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "निवडा काही नाही" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "निवडा काही नाही" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "रषॴॖनॴ" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "रषॴॖनॴ" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "रषॴॖनॴ" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "रषॴॖनॴ" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "रषॴॖनॴ" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:24 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:13 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "नामावली निवड" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/core.xml.in.h:1 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/core.xml.in.h:2 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/core.xml.in.h:3 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/core.xml.in.h:4 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/core.xml.in.h:5 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/core.xml.in.h:6 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/core.xml.in.h:7 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/core.xml.in.h:8 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/core.xml.in.h:9 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/core.xml.in.h:10 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/core.xml.in.h:11 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/core.xml.in.h:12 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/core.xml.in.h:13 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.h:14 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.h:15 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.h:16 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.h:17 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.h:18 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.h:19 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.h:20 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.h:21 msgid "Best" msgstr "" #: ../metadata/core.xml.in.h:22 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.h:23 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.h:25 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.h:26 #, fuzzy msgid "Command line 0" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:27 #, fuzzy msgid "Command line 1" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:28 #, fuzzy msgid "Command line 10" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:29 #, fuzzy msgid "Command line 11" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:30 #, fuzzy msgid "Command line 2" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:31 #, fuzzy msgid "Command line 3" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:32 #, fuzzy msgid "Command line 4" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:33 #, fuzzy msgid "Command line 5" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:34 #, fuzzy msgid "Command line 6" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:35 #, fuzzy msgid "Command line 7" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:36 #, fuzzy msgid "Command line 8" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:37 #, fuzzy msgid "Command line 9" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:38 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/core.xml.in.h:39 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/core.xml.in.h:40 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/core.xml.in.h:41 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/core.xml.in.h:42 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/core.xml.in.h:43 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/core.xml.in.h:44 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/core.xml.in.h:45 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/core.xml.in.h:46 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/core.xml.in.h:47 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/core.xml.in.h:48 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/core.xml.in.h:49 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/core.xml.in.h:50 msgid "Decrease Opacity" msgstr "" #: ../metadata/core.xml.in.h:51 msgid "Decrease window opacity" msgstr "" #: ../metadata/core.xml.in.h:52 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.h:53 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.h:54 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.h:55 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:56 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.h:57 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.h:58 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.h:59 #, fuzzy msgid "Focus Prevention Level" msgstr "निवडा काही नाही" #: ../metadata/core.xml.in.h:60 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.h:61 #, fuzzy msgid "Focus prevention windows" msgstr "निवडा काही नाही" #: ../metadata/core.xml.in.h:62 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.h:63 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.h:64 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.h:65 msgid "Good" msgstr "" #: ../metadata/core.xml.in.h:66 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.h:67 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.h:68 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.h:69 msgid "High" msgstr "" #: ../metadata/core.xml.in.h:70 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:71 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.h:72 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.h:73 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.h:74 msgid "Increase Opacity" msgstr "" #: ../metadata/core.xml.in.h:75 msgid "Increase window opacity" msgstr "" #: ../metadata/core.xml.in.h:76 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.h:77 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.h:78 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.h:79 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.h:80 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.h:81 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.h:82 msgid "Low" msgstr "" #: ../metadata/core.xml.in.h:83 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.h:84 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.h:86 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.h:87 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.h:88 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.h:89 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.h:90 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.h:92 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.h:93 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.h:94 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.h:95 msgid "Off" msgstr "" #: ../metadata/core.xml.in.h:96 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.h:97 msgid "Opacity Step" msgstr "" #: ../metadata/core.xml.in.h:98 msgid "Opacity change step" msgstr "" #: ../metadata/core.xml.in.h:99 msgid "Opacity values for windows that should be translucent by default" msgstr "" #: ../metadata/core.xml.in.h:100 msgid "Opacity window values" msgstr "" #: ../metadata/core.xml.in.h:101 msgid "Opacity windows" msgstr "" #: ../metadata/core.xml.in.h:102 msgid "Open a terminal" msgstr "" #: ../metadata/core.xml.in.h:103 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.h:104 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.h:105 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.h:106 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.h:107 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.h:108 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.h:109 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.h:110 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.h:111 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.h:112 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.h:113 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.h:114 #, fuzzy msgid "Refresh Rate" msgstr "पà¥à¤¨à¥à¤¹à¤¾ सà¥à¤°à¥‚ करा" #: ../metadata/core.xml.in.h:115 msgid "Run Dialog" msgstr "" #: ../metadata/core.xml.in.h:116 #, fuzzy msgid "Run command 0" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:117 #, fuzzy msgid "Run command 1" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:118 #, fuzzy msgid "Run command 10" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:119 #, fuzzy msgid "Run command 11" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:120 #, fuzzy msgid "Run command 2" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:121 #, fuzzy msgid "Run command 3" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:122 #, fuzzy msgid "Run command 4" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:123 #, fuzzy msgid "Run command 5" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:124 #, fuzzy msgid "Run command 6" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:125 #, fuzzy msgid "Run command 7" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:126 #, fuzzy msgid "Run command 8" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:127 #, fuzzy msgid "Run command 9" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:128 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.h:129 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.h:130 msgid "Screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:131 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.h:132 msgid "Show Main Menu" msgstr "" #: ../metadata/core.xml.in.h:133 msgid "Show Run Application dialog" msgstr "" #: ../metadata/core.xml.in.h:134 msgid "Show the main menu" msgstr "" #: ../metadata/core.xml.in.h:135 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.h:136 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.h:137 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.h:138 msgid "Take a screenshot" msgstr "" #: ../metadata/core.xml.in.h:139 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/core.xml.in.h:140 #, fuzzy msgid "Terminal command line" msgstr "आजà¥à¤žà¤¾ '%1'" #: ../metadata/core.xml.in.h:141 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.h:142 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.h:143 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.h:144 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.h:145 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.h:146 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.h:147 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.h:148 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.h:149 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.h:150 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.h:151 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.h:152 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.h:153 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.h:155 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.h:156 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.h:157 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.h:158 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:159 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.h:160 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.h:162 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.h:163 msgid "Window menu key binding" msgstr "" #: ../metadata/core.xml.in.h:164 msgid "Window screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:165 msgid "Windows that should be translucent by default" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 #, fuzzy msgid "Automatic" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/cube.xml.in.h:8 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:9 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Fold Speed" msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Fold Timestep" msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #: ../metadata/cube.xml.in.h:16 ../metadata/switcher.xml.in.h:10 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:19 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:25 ../metadata/place.xml.in.h:7 #: ../metadata/scale.xml.in.h:17 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:27 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:28 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Scale image" msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #: ../metadata/cube.xml.in.h:37 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:43 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:90 ../metadata/scale.xml.in.h:32 #: ../metadata/switcher.xml.in.h:35 ../metadata/zoom.xml.in.h:3 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:44 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:93 ../metadata/scale.xml.in.h:34 #: ../metadata/switcher.xml.in.h:39 ../metadata/zoom.xml.in.h:4 #, fuzzy msgid "Timestep" msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #: ../metadata/cube.xml.in.h:45 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:46 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:47 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "आजà¥à¤žà¤¾:" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "निवडा काही नाही" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "निवडा काही नाही" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:1 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:2 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:6 #, fuzzy msgid "Fade windows" msgstr "निवडा काही नाही" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fading Windows" msgstr "निवडा काही नाही" #: ../metadata/fade.xml.in.h:8 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Window fade speed" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/scale.xml.in.h:21 #: ../metadata/switcher.xml.in.h:18 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Force Placement Windows" msgstr "निवडा काही नाही" #: ../metadata/place.xml.in.h:5 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Maximize" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:9 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:10 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:12 #, fuzzy msgid "Positioned windows" msgstr "निवडा काही नाही" #: ../metadata/place.xml.in.h:13 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:20 #, fuzzy msgid "Viewport positioned windows" msgstr "निवडा काही नाही" #: ../metadata/place.xml.in.h:21 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:28 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:7 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Window Resize" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/resize.xml.in.h:12 msgid "Normal" msgstr "" #: ../metadata/resize.xml.in.h:13 #, fuzzy msgid "Normal Resize Windows" msgstr "निवडा काही नाही" #: ../metadata/resize.xml.in.h:14 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:2 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:5 #, fuzzy msgid "Flip Time" msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #: ../metadata/rotate.xml.in.h:6 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:12 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate To" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate window" msgstr "निवडा काही नाही" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate with window" msgstr "निवडा काही नाही" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotation Acceleration" msgstr "सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ पूरà¥à¤£ à¤à¤¾à¤²à¥€" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotation Speed" msgstr "सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ पूरà¥à¤£ à¤à¤¾à¤²à¥€" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotation Timestep" msgstr "सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ पूरà¥à¤£ à¤à¤¾à¤²à¥€" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotation Zoom" msgstr "सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ पूरà¥à¤£ à¤à¤¾à¤²à¥€" #: ../metadata/rotate.xml.in.h:85 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 #, fuzzy msgid "Start Rotation" msgstr "इनà¥à¤¸à¥à¤Ÿà¥‰à¤²à¥‡à¤¶à¤¨ सà¥à¤°à¥ करत आहे..." #: ../metadata/rotate.xml.in.h:92 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:94 ../metadata/switcher.xml.in.h:41 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:2 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:3 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:5 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:8 #, fuzzy msgid "Hover Time" msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Initiate Window Picker" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/scale.xml.in.h:10 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:18 ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:24 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:25 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:26 #, fuzzy msgid "Scale speed" msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #: ../metadata/scale.xml.in.h:27 #, fuzzy msgid "Scale timestep" msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #: ../metadata/scale.xml.in.h:28 #, fuzzy msgid "Scale windows" msgstr "निवडा काही नाही" #: ../metadata/scale.xml.in.h:29 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:30 #, fuzzy msgid "Space between windows" msgstr "निवडा काही नाही" #: ../metadata/scale.xml.in.h:31 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• संचिका..." #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "नामावली निवड" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "सà¥à¤°à¥ करणे" #: ../metadata/switcher.xml.in.h:6 msgid "Brightness" msgstr "" #: ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Bring To Front" msgstr "सà¥à¤°à¥‚ होताना" #: ../metadata/switcher.xml.in.h:8 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:11 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:14 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next window" msgstr "निवडा काही नाही" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window (All windows)" msgstr "निवडा काही नाही" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (No popup)" msgstr "निवडा काही नाही" #: ../metadata/switcher.xml.in.h:19 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:28 #, fuzzy msgid "Saturation" msgstr "संरचना संचित करा" #: ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Select next panel type window." msgstr "निवडा काही नाही" #: ../metadata/switcher.xml.in.h:30 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:31 #, fuzzy msgid "Select previous panel type window." msgstr "निवडा काही नाही" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:36 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher timestep" msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:40 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "निवडा काही नाही" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "निवडा काही नाही" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "निवडा काही नाही" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "सà¥à¤°à¥‚ होताना" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #: ../metadata/zoom.xml.in.h:1 msgid "Filter Linear" msgstr "" #: ../metadata/zoom.xml.in.h:5 msgid "Use linear filter when zoomed in" msgstr "" #: ../metadata/zoom.xml.in.h:6 msgid "Zoom Desktop" msgstr "" #: ../metadata/zoom.xml.in.h:7 msgid "Zoom In" msgstr "" #: ../metadata/zoom.xml.in.h:8 msgid "Zoom Out" msgstr "" #: ../metadata/zoom.xml.in.h:9 msgid "Zoom Pan" msgstr "" #: ../metadata/zoom.xml.in.h:10 #, fuzzy msgid "Zoom Speed" msgstr "सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ पूरà¥à¤£ à¤à¤¾à¤²à¥€" #: ../metadata/zoom.xml.in.h:11 #, fuzzy msgid "Zoom Timestep" msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #: ../metadata/zoom.xml.in.h:12 msgid "Zoom and pan desktop cube" msgstr "" #: ../metadata/zoom.xml.in.h:13 msgid "Zoom factor" msgstr "" #: ../metadata/zoom.xml.in.h:14 #, fuzzy msgid "Zoom pan" msgstr "सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ पूरà¥à¤£ à¤à¤¾à¤²à¥€" #, fuzzy #~ msgid "Fade Time" #~ msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #, fuzzy #~ msgid "Dialog" #~ msgstr "तग॥लॲग" #~ msgid "Unknown" #~ msgstr "अजà¥à¤žà¤¾à¤¤" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "संरचना संचित करा" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "रषॴॖनॴ" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ पूरà¥à¤£ à¤à¤¾à¤²à¥€" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ" compiz-0.9.11+14.04.20140409/po/ar.po0000644000015301777760000017115012321343002017057 0ustar pbusernogroup00000000000000# @TITLE@ # Copyright (C) 2006, SUSE Linux GmbH, Nuremberg # FIRST AUTHOR , YEAR. # # This file is distributed under the same license as @PACKAGE@ package. FIRST # msgid "" msgstr "" "Project-Id-Version: @PACKAGE@\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-09-23 19:19+0200\n" "Last-Translator: Jibril ABDELAZIZ \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "سطح المكتب" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "إدارة Ø§Ù„Ù†ÙˆØ§ÙØ¯" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "بدون" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "ظل" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "تكبير" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "تكبير Ø£Ùقي" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "تكبير عمودي" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "تقليص" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "زيادة" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "نقصان" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "قائمة Ø§Ù„Ù†Ø§ÙØ¯Ø©" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "الإجراء المتخذ عند تحريك عجلة Ø§Ù„ÙØ£Ø±Ø© على شريط عنوان Ø§Ù„Ù†Ø§ÙØ¯Ø©." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "ﺔﻴﺳﻭﺭ" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "ﺔﻴﺳﻭﺭ" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "ﺔﻴﺳﻭﺭ" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "ﺔﻴﺳﻭﺭ" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "ﺔﻴﺳﻭﺭ" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "ﺔﻴﺳﻭﺭ" compiz-0.9.11+14.04.20140409/po/CMakeLists.txt0000644000015301777760000000314612321343002020654 0ustar pbusernogroup00000000000000project (po) find_program (_intltool_update intltool-update) if (NOT EXISTS "${_intltool_update}") message (SEND_ERROR "Missing intltool-update (try: sudo apt-get install intltool)") endif () find_program (_xgettext xgettext) mark_as_advanced (_xgettext) find_program (_msgmerge msgmerge) mark_as_advanced (_msgmerge) find_program(_msgfmt msgfmt) mark_as_advanced (k3d_msgfmt) set (compiz_catalogs ${ALL_LINGUAS}) set (compiz_catalog_targets) add_custom_target (nls-update-sources ${_intltool_update} -m WORKING_DIRECTORY ${po_SOURCE_DIR} ) add_custom_command ( OUTPUT ${po_SOURCE_DIR}/compiz.pot COMMAND ${_intltool_update} --gettext-package compiz --pot DEPENDS POTFILES.in WORKING_DIRECTORY ${po_SOURCE_DIR} ) foreach(catalog ${compiz_catalogs}) add_custom_target (nls-update-${catalog}.po ${_msgmerge} ${catalog} compiz -o ${catalog}.po --no-wrap DEPENDS ${po_SOURCE_DIR}/${catalog}.po WORKING_DIRECTORY ${po_SOURCE_DIR} ) file (MAKE_DIRECTORY "${po_BINARY_DIR}/${catalog}/LC_MESSAGES") add_custom_command ( OUTPUT ${po_BINARY_DIR}/${catalog}/LC_MESSAGES/compiz.mo COMMAND ${_msgfmt} -c -o ${po_BINARY_DIR}/${catalog}/LC_MESSAGES/compiz.mo ${po_SOURCE_DIR}/${catalog}.po DEPENDS ${po_SOURCE_DIR}/${catalog}.po ) install ( FILES ${po_BINARY_DIR}/${catalog}/LC_MESSAGES/compiz.mo DESTINATION ${datadir}/locale/${catalog}/LC_MESSAGES ) set (compiz_catalog_targets ${compiz_catalog_targets} ${po_BINARY_DIR}/${catalog}/LC_MESSAGES/compiz.mo) endforeach(catalog) add_custom_target(nls ALL DEPENDS ${po_SOURCE_DIR}/compiz.pot ${compiz_catalog_targets} ) compiz-0.9.11+14.04.20140409/po/fi.po0000644000015301777760000042112212321343002017050 0ustar pbusernogroup00000000000000# translation of compiz.po to Finnish # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2003 SuSE Linux AG. # # Michael Hintsala , 2003. 2001. # Jyri Palokangas , 2006. # Jouni Hätinen , 2006. # Jani-Matti Hätinen , 2006. # Jani Hyytiäinen , 2008. # Timo Jyrinki , 2008. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-08-13 10:05+0200\n" "Last-Translator: Timo Jyrinki \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Työpöytä" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Ikkunoiden hallinta" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ei mitään" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Näytä rullattuna" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Suurenna" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Suurenna vaakatasossa" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Suurenna pystytasossa" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Pienennä" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Nosta" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Laske" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Ikkunavalikko" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Suoritettava toiminto kun hiiren kiekkoa rullataan ikkunan otsikkopalkissa" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Sumennustyyppi" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" "Aktiivisen Metacity-ikkunan läpinäkyvyysMetacity-teeman aktiivisen ikkunan " "läpinäkyvyys" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity-teeman aktiivisen ikkunan läpinäkyvyyden varjo" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity-teeman läpinäkyvyys" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity-teeman läpinäkyvyyden varjo" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Läpinäkyvyys aktiivisessa ikkunassa käytettäessä Metacity-teemaa kehyksineen" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Metacity-teeman kehyksiin käytettävä läpinäkyvyys" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Varjosta aktiiviset ikkunat Metacity-teemaa kehyksineen käytettäessä " "läpikuultamattomasta läpikuultavaan" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Varjosta ikkunat Metacity-teemaa kehyksineen käytettäessä " "läpikuultamattomasta läpikuultavaan" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Hiiren rullan napsautuksen vaikutus ikkunan otsikkoon" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Sumennustyyppi ikkunan kehyksille" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Käytä Metacity-teemaa" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Käytä Metacity-teemaa ikkunoiden kehyksissä" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Sulje ikkuna" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Palauta suurennettu ikkuna" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Suurenna ikkuna" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Pienennä ikkuna" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Näytä päällimmäisenä" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Näytä kaikilla työpöydillä" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Älä näytä rullattuna" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Älä näytä päällimmäisenä" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Älä näytä kaikilla työpöydillä" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Ikkuna \"%s\" ei vastaa." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Tämän sovelluksen sulkeminen väkisin saa tallentamattomat muutokset " "katoamaan." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "Sulje _väkisin" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Piirros" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Piirroksen täyttöväri" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Piirroksen ääriviivojen väri" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Piirroksen liitännäiset" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Tyhjennä" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Piirrä" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Piirrä työkalulla" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Piirroksen väri" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Aktivoi" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Aktivoi piirtäminen" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Aktivoi piirtämisen pyyhkiminen" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Aktivoi pyyhkiminen" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Viivan leveys" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Viivan leveys piirroksiin" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Viivan väri piirroksiin" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Viivan leveys" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Viivan leveys piirroksiin" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xbilineaarinen" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alpha-sumennus" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Sumenna ikkunat alpha-sumennuksella" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Sumennuksen suodatin" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Sumennuksen purevuus" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Sumennuksen kylläisyys" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Sumennuksen nopeus" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Sumenna ikkunat" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Sumenna ikkunoiden läpinäkyvien osien takana" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Sumennuksen kylläisyys" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Sumennettavat ikkunatyypit" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Sumenna ikkunat joilla ei ole keskitystä" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Poista sumennuksen käyttö alueissa joista ikkunat ovat tehneet " "vaikeaselkoiset" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Sumentamiseen käytettävä suodatin" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Keskityksen sumennus" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Sumenna passiiviset ikkunat" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussian" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gaussin säde" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gaussin voimakkuus" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Gaussin säde" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gaussin voimakkuus" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Riippumaton tekstuurien nouto" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmapin yksityiskohtien taso" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap-kuvien yksityiskohtien tarkkuus" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Syke" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Syketehoste" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Käytä käytettävissä olevia teksturointiyksiköitä tekemään mahdollisimman " "monta riippumatonta tekstuurien noutoa." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Ikkunan sumennuksen nopeus" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Ikkunatyypit, joihin keskityksen sumennus vaikuttaa" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Ikkunatyypit, joiden tulisi käyttää alfa sumennusta oletuksena" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Ulostulon kloonaus" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Aktivoi kloonauksen valinta" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Ulostulon kloonauksen käsittelijä" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "Reuna, johon siirryttäessä ajetaan komento command0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "Reuna, johon siirryttäessä ajetaan komento command1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "Reuna, johon siirryttäessä ajetaan komento command10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "Reuna, johon siirryttäessä ajetaan komento command11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "Reuna, johon siirryttäessä ajetaan komento command2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "Reuna, johon siirryttäessä ajetaan komento command3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "Reuna, johon siirryttäessä ajetaan komento command4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "Reuna, johon siirryttäessä ajetaan komento command5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "Reuna, johon siirryttäessä ajetaan komento command6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "Reuna, johon siirryttäessä ajetaan komento command7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "Reuna, johon siirryttäessä ajetaan komento command8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "Reuna, johon siirryttäessä ajetaan komento command9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Luo sidoksia komentorivikomentoihin" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Näppäinsidokset" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Komentorivi 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Komentorivi 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Komentorivi 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Komentorivi 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Komentorivi 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Komentorivi 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Komentorivi 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Komentorivi 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Komentorivi 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Komentorivi 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Komentorivi 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Komentorivi 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Suoritettava komentorivi, kun run_command0 suoritetaan" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Suoritettava komentorivi, kun run_command1 suoritetaan" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Suoritettava komentorivi, kun run_command10 suoritetaan" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Suoritettava komentorivi, kun run_command11 suoritetaan" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Suoritettava komentorivi, kun run_command2 suoritetaan" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Suoritettava komentorivi, kun run_command3 suoritetaan" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Suoritettava komentorivi, kun run_command4 suoritetaan" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Suoritettava komentorivi, kun run_command5 suoritetaan" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Suoritettava komentorivi, kun run_command6 suoritetaan" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Suoritettava komentorivi, kun run_command7 suoritetaan" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Suoritettava komentorivi, kun run_command8 suoritetaan" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Suoritettava komentorivi, kun run_command9 suoritetaan" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Komennot" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Reunasidokset" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Näppäinsidokset" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Suorita komento 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Suorita komento 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Suorita komento 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Suorita komento 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Suorita komento 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Suorita komento 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Suorita komento 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Suorita komento 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Suorita komento 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Suorita komento 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Suorita komento 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Suorita komento 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Käytössä olevat liitännäiset" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "Kokoruutuikkunoita ei uudelleenohjata piilotetuille pikselikartoille" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Kuuluva äänimerkki" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Kuuluva järjestelmän huomautus" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automaattinosto" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Automaattinoston viive" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Ulostulolaitteiden automaattinen tunnistus" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Virkistystaajuuden automaattinen tunnistus" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Paras" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Tarkenna hiiren napsautuksesta" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Hiiren napsautus ikkunalla tarkentaa sen" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Sulje aktiivinen ikkuna" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Oletuskuvake" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Oletuskuva ikkunoille, joilla ei ole kuvaketta" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Työpöydän koko" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Tunnista ulostulot" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Tunnista virkistystaajuus" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Näyttöasetukset" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Osoittimen paikallaanoloaika näytön reunalla, ennen kuin reunatoiminto " "suoritetaan." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Reunaliipaisimen viive" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Nopea" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Kohdistus- ja nostokäyttäytyminen" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Kohdistuksen eston taso" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Keskityksen estäminen ikkunoissa" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Keskityksen estäminen ikkunoissa" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Pakota ulostulojen itsenäinen piirto." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Yleiset asetukset" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Yleiset Compizin asetukset" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Hyvä" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Piilota tehtäväpalkissa näkymättömät ikkunat" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Piilota kaikki ikkunat ja näytä työpöytä" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Piilota ikkunat jotka eivät ole ikkunaluettelossa, kun käytetään \"näytä " "työpöytä\" -toimintoa" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Korkea" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Virtuaalinen koko leveyssuunnassa" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Käytä pakkausta kuvista muunnetuille tekstuureille, jos mahdollista" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Jätä huomiotta vihjeet suurennettaessa" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Ohita kokolisäys- ja kuvasuhdevihjeet ikkunaa suurennettaessa" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Aikaväli ennen valittujen ikkunoiden nostamista" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Viive ping-viestien välillä" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Pikanäppäimet" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Kohdistuksen nappaamisen eston taso" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Valaistus" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista tällä hetkellä aktiivisista liitännäisistä" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Ulostulolaitteita kuvaavien merkkijonojen luettelo" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Matala" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Laske ikkuna" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Laske ikkuna taka-alalle" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Suurenna ikkunaa vaakatasossa" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Suurenna ikkunaa pystytasossa" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Suurenna aktiivinen ikkuna" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Suurenna aktiivista ikkunaa vaakatasossa" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Suurenna aktiivista ikkunaa pystytasossa" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Pienennä aktiivinen ikkuna" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Tavallinen" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Työtilojen lukumäärä" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Virtuaalityöpöytien lukumäärä" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Pois päältä" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Suorita vain näyttöpäivitykset pystytasossa tehtävän tyhjäyksen aikana" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Ulostulot" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Päällekkäisten ulostulojen käsittely" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Piirrä jokainen ulostulolaite itsenäisesti, vaikka ulostulolaitteet olisivat " "päällekkäin" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ikkunoiden tummentamisen viive" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Suosi suurempaa ulostuloa" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Suosi pienempää ulostuloa" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Nosta napsautuksesta" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Nosta ikkuna" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Nosta valittu ikkuna tietyn ajan jälkeen" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Nosta ikkuna muiden päälle" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Nosta ikkuna napsautuksesta" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Virkistystaajuus" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Näytön virtuaalikoon kerroin todelliseen kokoon leveyssuunnassa" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Näytön virtuaalikoon kerroin todelliseen kokoon pystysuunnassa" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Näytä työpöytä" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Hitaat animaatiot" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Älykäs tila" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synkronoi VBlankiin" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Tekstuurien pakkaus" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Tekstuurisuodatin" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Tekstuurisuodatus" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Kuinka usein ruutu päivitetään (1-200 krt/s)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Suurenna ikkuna" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Suurenna ikkuna vaakatasossa" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Suurenna ikkuna pystytasossa" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Pienennä ikkuna kehystilaan" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Suurenna aktiivinen ikkuna" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Suurenna aktiivinen ikkuna vaakatasossa" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Suurenna aktiivinen ikkuna pystytasossa" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Pienennä aktiivinen ikkuna kehystilaan" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Ota käyttöön hitaat animaatiot" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Palauta suurenettu aktiivinen ikkuna" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Kokoruutuikkunoita ei uudelleenohjata" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Käytä hajavaloa ruudun muuttuessa" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Pystysuuntainen virtuaalinen koko" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Hyvin korkea" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Mitä päällekkäisistä ulostulolaitteista suositaan" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Ikkunavalikon näppäinyhdistelmä" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" "Määrittää näppäinyhdistelmän ikkunavalikolle, joka saadaan myös klikkaamalla " "ikkunan kehystä vasemmalla hiiren painikkeella" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Kiihdytys" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Sovita kuva" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Sovita kannen ja pohjan kuva kuutiolle" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Etene seuraavaan diaan" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animoi Taivaankansi" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animoi taivaankansi työpöytäkuutiota kääntäessä" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Ulkoasu" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automaattinen" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Käyttäytyminen" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Kuution pohjan ja kannen väri" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Alin väri taivaankannen liukuvärissä" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Ylin väri taivaankannen liukuvärissä" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Kuution kannet" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kuution väri" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Työpöytäkuutio" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Kiihdytyskerroin" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Nopeuskerroin" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Aikaviivekerroin" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Luo mipmap skaalauksen laadun parantamiseksi mikäli se on mahdollista" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Takaisin edelliseen diaan" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Kuvatiedostot" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Taivaankannen tekstuurina käytettävä kuva" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Kuutio on läpinäkyvä vain kun sitä käännetään hiirellä" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Kuution sisäpinta" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Näyttää kuution sisäpinnan" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Lista kuution päälle asetettavista PNG- ja SVG-tiedostoista" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Useita ulostuloja" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Useita kuutioita" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Seuraava dia" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Yksi iso kuutio" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Läpikuultavuus pyörityksen aikana" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Läpikuultavuus kun kuutiota ei pyöritetä" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Työpöytien läpinäkyvyys pyörityksen aikana" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Työpöytien läpinäkyvyys kun kuutiota ei pyöritetä" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Asettele ikkunat työpöytäkuution pinnalle" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Edellinen dia" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Piirrä taivas" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Skaalaa kuvaa" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Skaalaa kuva kuution katon kokoiseksi" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Valitsee miten kuutio näyetään jos käyettään usempaa kuin yhtä ulostulo " "laitetta (näyttöä)" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Taivas" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Liukuvärin lopetusväri" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Liukuvärin aloitusväri" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Taivaan kuva" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Nopeus" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Aikaviive" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Läpinäkyvä vain hiirellä pyörittäessä" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Läpinäkyvä kuutio" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Avaa" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Avaa kuutio" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "D-Bus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "D-Bus-hallinnan taustaosa" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Salli mipmap kuvioiden käyttäminen kehysten tekstuureihin" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Komento" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Ikkunatyypit, joilla tulisi olla kehykset" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "Kehystyskomento, joka suoritetaan kehystimen puuttuessa" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Varjon X-poikkeama" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Varjon Y-poikkeama" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Varjon väri" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Varjon läpinäkyvyys" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Varjon säde" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Varjon väri" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Varjon X-poikkeama" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Varjon Y-poikkeama" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Varjon läpinäkyvyys" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Varjon säde" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Ikkunatyypit, joilla tulisi olla varjo" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Ikkunan kehykset" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Ikkunan kehyksen asetukset" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Ikkunatyypit, jotka tulisi kehystää" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Ikkunatyypit, joille tulisi lisätä varjo" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Kirkkaus prosenteissa ikkunoille, jotka eivät vastaa" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Vakionopeus" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Vakioaika" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Himmennä ikkunat, jotka eivät vastaa" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "Himmennä ikkunat, jotka eivät vastaa ikkunanhallinnan pyyntöihin" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Häivytystapa" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Häivytä pienentämisen, avaamisen ja sulkemisen yhteydessä" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Häivytyksen nopeus" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Häivytysviive" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Häivystehoste pienentämisen, avaamisen ja sulkemisen yhteydessä" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Häivitystehoste järjestelmän piipauksesta" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "Ikkunat häivytetään näkyvistä/näkyviin" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Häivytä ikkunat" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Ikkunoiden häivytys" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Kokoruudun näkyvä kello" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Kokoruudun häivytystehoste järjestelmän piippauksesta" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Värikylläisyys prosenteissa ikkunoille, jotka eivät vastaa" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Kirkkaus ikkunoille, jotka eivät vastaa" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Värikylläisyys ikkunoille, jotka eivät vastaa" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Näkyvä kello" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Ikkunan häivytystapa" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Ikkunan häivytysnopeus \"Vakionopeus\"-tilassa" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Ikkunan häivytysaika (millisekunneissa) \"Vakioaika\"-tilassa" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Ikkunatyypit, joita tulisi häivyttää" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Liitoskohta" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Liitoskohta" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Käyttäjätilan tiedostojärjestelmä" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Käyttäjätilan tiedostojärjestelmä" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf-tietokannan hallinta" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib-pääsilmukan tuki" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome-yhteensopivuus" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Avaa pääte" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Valinnat, joilla Compiz pidetään yhteensopivana Gnome-työpöytäympäristön " "kanssa" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Suorita komento -valintaikkuna" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Suorita päätekomento" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Kuvakaappauksen komento" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Näytä päävalikko" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Näytä Suorita komento -valintaikkuna" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Näytä päävalikko" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Ota kuvankaappaus" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Ota kuvankaappaus ikkunasta" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Päätteen komentorivi" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Ikkunan kuvakaappauksen komento" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Struktuurittomien Ini-viestien tietokannan hallinta" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Käyttäjätilan tiedostojärjestelmä" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig-tietokannan hallinta" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Pienennystehoste" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Pienennä ikkunat" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Pienennykseen käytetty aika" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Pienennyksen aikaväli" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Varjon vastussauma" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Varjon vastussauma" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Animoi ikkunoiden pienennys ja suurennus" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Ikkunatyypit, jotka tulisi muuntaa pienennettäessä" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Rajoita Y-koordinaatti" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Rajoita Y-koordinaatti työskentelyalueelle" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Älä päivitä serveripuolen sijaintia ikkunoissa kunnes siirtäminen on valmis" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Siirrä ikkunaa" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Laiska sijoittaminen" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Siirrä Ikkuna" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Ikkunan siirtäminen" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Läpinäkyvyys" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Liikkuvien ikkunoiden läpinäkyvyys" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Vapauta ja palauta suurennetut ikkunat automaattisesti siirrettäessä" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Vapauta suurennetut ikkunat" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Aloita ikkunan siirtäminen" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Kirkkaus" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Kirkkauden vähentäminen" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Kirkkauden lisääminen" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Kirkkauden säädön askel" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Kirkkausarvot ikkunoille" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Vähennä" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Lisää" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Peittävyyden vähentäminen" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Peittävyyden lisääminen" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Peittävyyden säädön askel" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Peittävyysarvot ikkunoille" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Peittävyys, kirkkaus ja värikylläisyys" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Peittävyyden, kirkkauden ja värikylläisyyden muuttaminen" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Kylläisyys" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Kylläisyyden vähentäminen" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Kylläisyyden lisääminen" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Kylläisyyden säädön askel" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Kylläisyysarvot ikkunoille" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Askel" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Ikkunakohtaiset asetukset" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Ikkunoiden arvot" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Ikkunat" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Ikkunat joilla tulisi oletuksena olla eriävä kirkkaus" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Ikkunat joilla tulisi oletuksena olla eriävä peittävyys" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Ikkunat joilla tulisi oletuksena olla eriävä värikylläisyys" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Ikkunan sijoittamiseen käyettettävä algoritmi" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Porrasta" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Keskitetty" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Määrätty ikkunoiden sijoittelu" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Pakotetun sijoittelun ikkunat" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Työpöytien vaakataso-sijainti" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Pidä työtilassa" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Pidä asetettu ikkuna työtilassa, vaikka se tarkoittaisi sijainnin eriävyyttä " "määritellystä sijainnista" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Sijoita ikkunat" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Sijoita kaikkien ulostulojen kesken" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Sijoita ikkunat sopiville paikoille niiden ilmestyessä" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Käyetettävä metodi sijoittamisessa" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Sijoitetut ikkunat" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Satunnainen" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Määrittää kuinka ikkunoiden sijoittelun tulisi toimia, jos valittuina on " "useita ulostuloja" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Älykäs" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Käytä aktiivista ulostulolaitetta" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Käytä kohdistetun ikkunan ulostulolaitetta" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Käytä osoittimen sisältämää ulostulolaitetta" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Työpöytien pystytaso-sijainti" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Tiettyyn työpöytään sijoitettavat ikkunat" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Poikkeukset ikkunoiden sijoittamisessa" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Ikkunatyypit, jotka tulisi sijoittaa oletuksena" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Ikkunatyypit, jotka tulisi sijoittaa tiettyyn työpöytään oletuksena" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Ikkunatyypit, jotka tulisi pakotetusti sijoittaa paikoilleen, vaikka ne " "kieltäisivät ikkunointiohjelmaa tekemästä niin." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Ikkunatyypit, joilla määrätyt sijainnit" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Ikkunatyypit, joilla määrätty työtila" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Poikkeukset" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X-sijainnit" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Näkymän X-sijainnit" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X-sijainnin arvot" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y-sijainnit" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Näkymän Y-sijainnit" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y-sijainnin arvot" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "PNG-kuvien lataaja" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Lauseketäsmäys" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Lausekkeen määrittelemien ikkunoiden täsmäys" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Pikanäppäimet" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Reunan väri" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Reunan väri, jota käytetätään Ääriviiva- ja Suorakulmio-venytys metodeille" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Koon muuttamisen oletustapa" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Ikkunan koon muuttamiseen käytettävä oletustapa" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Täyttöväri" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Täyttöväri suorakulmio-tapaan" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Aloita ikkunan koon muuttaminen tavallista tapaa käyttäen" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Aloita ikkunan koon muuttaminen ääriviiva-tapaa käyttäen" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Aloita ikkunan koon muuttaminen suorakulmio-tapaa käyttäen" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Aloita ikkunan koon muuttaminen venytys-tapaa käyttäen" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Muuta ikkunan kokoa" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Ikkunan koon muuttaminen tavallisesti" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Ääriviiva" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Ikkunan koon muuttaminen ääriviivoilla" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Suorakulmio" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Ikkunan koon muttaminen suorakulmiolla" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Muuta ikkunan kokoa" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Muuta ikkunan kokoa" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Aloita ikkunan koon muuttaminen" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Aloita ikkunan koon muuttaminen venyttämällä" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Aloita ikkunan koon muuttaminen tavallisesti" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Aloita ikkunan koon muuttaminen ääriviivaa käyttäen" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Aloita ikkunan koon muuttaminen suorakulmiota käyttäen" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Venytä" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Ikkunan koon muttaminen Venytä metodilla" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Ikkunat, joilla käytetään normaalia koon muuttamista" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Ikkunat, joilla käytetään ääriviivatapaa koon muuttamiseen" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Ikkunat, joilla käytetään suorakulmiota koon muuttamiseen" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Ikkunat, joilla käytetään venyttämistä koon muuttamista" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Käännä seuraavaan työpöytään siirtäessä objektia reunaan" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Käännä seuraavaan työpöytään siirtäessä ikkunan reunaan" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Käännä seuraavaan työpöytään siirtäessä osoitinta reunaan" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Käännön kesto" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Käännä vasempaan työtilaan ja siirrä osoitin" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Vaihda seuraavaan työpöytään vedettäessä objektia ruudun reunaa vasten." #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Vaihda seuraavaan työpöytään vedettäessä osoitinta ruudun reunaa vasten." #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Vaihda seuraavaan työpöytään vedettäessä ikkunaa ruudun reunaa vasten." #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Käännä oikeaan työtilaan ja siirrä osoitin" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Peilaa osoittimen Y-suuntainen liike" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Peilaa osoittimen Y-akseli" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Osoittimen herkkyys" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Nosta pyörittäessä" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Nosta ikkuna pyörittäessä" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Käännä kuutiota" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Kierrä vasemmalle" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Kierrä oikealle" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Käännä vasemmalle" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Käännä vasemmalle ikkunan kanssa" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Käännä oikealle" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Käännä oikealle ikkunan kanssa" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Käännä" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Käännä työpöydälle 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Käännä työpöydälle 1 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Käännä työpöydälle 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Käännä työpöydälle 10 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Käännä työpöydälle 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Käännä työpöydälle 11 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Käännä työpöydälle 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Käännä työpöydälle 12 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Käännä työpöydälle 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Käännä työpöydälle 2 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Käännä työpöydälle 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Käännä työpöydälle 3 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Käännä työpöydälle 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Käännä työpöydälle 4 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Käännä työpöydälle 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Käännä työpöydälle 5 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Käännä työpöydälle 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Käännä työpöydälle 6 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Käännä työpöydälle 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Käännä työpöydälle 7 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Käännä työpöydälle 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Käännä työpöydälle 8 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Käännä työpöydälle 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Käännä työpöydälle 9 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Kuution kääntö" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Käännä työpöytäkuutiota" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Kääntää kuution vasemmalle" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Kääntää kuution vasemmalle aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Kääntää kuution oikealle" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Kääntää kuution oikealle aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Käännä työpöydälle" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Käännä työpöydälle ikkunan kanssa" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Käännä työpöydälle 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Käännä työpöydälle 1 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Käännä työpöydälle 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Käännä työpöydälle 10 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Käännä työpöydälle 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Käännä työpöydälle 11 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Käännä työpöydälle 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Käännä työpöydälle 12 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Käännä työpöydälle 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Käännä työpöydälle 2 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Käännä työpöydälle 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Käännä työpöydälle 3 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Käännä työpöydälle 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Käännä työpöydälle 4 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Käännä työpöydälle 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Käännä työpöydälle 5 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Käännä työpöydälle 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Käännä työpöydälle 6 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Käännä työpöydälle 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Käännä työpöydälle 7 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Käännä työpöydälle 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Käännä työpöydälle 8 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Käännä työpöydälle 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Käännä työpöydälle 9 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Käännä näkymään" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Käännä ikkunaa" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Käännä ikkunan kanssa" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Kääntämiskiihdytys" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Kääntämisnopeus" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Kääntämisaikaväli" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoomaus käännettäessä" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Osoitinliikkeen herkkyys" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Kiinnitä kääntäminen kuution pohjaan" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Kiinnitä kääntäminen kuution kattoon" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Kiinnitä pohjaan" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Kiinnitä kattoon" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Aloita kääntäminen" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Aikakatkaisu ennen näkymän vaihtamista" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Läpinäkyvyys prosentteina" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Suuri" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Pikanäppäimet kytkevät skaalaustilan päälle/pois" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Pikanäppäimet vaihtavat skaalaustilaa sen sijaan että ottaisivat sen " "käyttöön painettaessa ja pois käytöstä vapautettaessa." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Näytä työpöytä siihen klikatessa" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Tummenna tausta" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Tummenna tausta ikkunoita skaalatessa" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Tunnus" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "Siirry työpöytätilaan kun työpöytää klikataan skaalauksen aikana" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Päälläoloaika" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Käynnistä ikkunavalitsin" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Aktivoi ikkunavalitsin kaikille ikkunoille" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Aktivoi ikkunavalitsin ikkunaryhmälle" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Aktivoi ikkunavalitsin ikkunoille nykyisessä ulostulossa" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Pikanäppäimet kytkevät skaalaustilan päälle/pois" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Pikanäppäimet vaihtavat skaalaustilaa sen sijaan että ottaisivat " "painettaessa käyttöön ja vapautettaessa pois käytöstä." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Asettele ja ala mukauttaa kaikkia ikkunoita" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Asettele ja ala mukauttaa ikkunaryhmää" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Asettele ja ala mukauttaa ikkunoita" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Asettele ja ala mukauttaa ikkunoita nykyisessä ulostulossa" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Kaikissa ulostulolaitteissa" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Vain nykyisessä ulostulolaitteessa" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Aseta kuvake päälle" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Asettaa kuvakkeen ikkunan päälle skaalaamisen jälkeen" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Skaalaus" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Ikkunoiden skaalaus" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Skaalausnopeus" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Skaalausaikaväli" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Määrittää ikkunatyypit, jotka tulisi skaalata skaalaustilassa" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Määrittää missä ikkunat skaalataan jos käytössä on useampi ulostulo laite" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Ikkunoiden välinen tila" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Tila" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Aika (ms), jonka jälkeen skaalaustila lopetetaan, kun ikkunan päälle " "asettaminen on käytössä" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Ikkunatyypit, jotka tulisi skaalata skaalaustilassa" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Ohjelma joka automaattisesti avaa kuvakaappauksen" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Hakemisto" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Käynnistä suorakulmion muotoinen kuvankaappaaja" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Suorita sovellus" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Tallenna kuvakaappaukset tähän hakemistoon" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Kuvakaappaus" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Kuvakaappaus-liitännäinen" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "SVG" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "SVG-kuvien lataaja" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Kirkkauden määrä prosentteina" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Kylläisyyden määrä prosentteina" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Sovellusten vaihtaja" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automaattinen kääntö" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Tuo etualalle" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Tuo aktiivinen ikkuna etualalle" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Etäisyys, jonka työpöydän tulisi olla loitonnettuna ikkunoita vaihdettaessa" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Kuvake" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Pienennetty" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Seuraava paneeli" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Seuraava ikkuna" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Seuraava ikkuna (kaikki ikkunat)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Seuraava ikkuna (ei ponnahdusikkunaa)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Ponnauta vaihtaja näkyviin jos ei ole ja valitse seuraava ikkuna" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Ponnauta vaihtaja näkyviin jos ei ole ja valitse edellinen ikkuna ja valitse " "seuraava ikkuna kaikista ikkunoista" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Ponnauta vaihtaja näkyviin jos ei ole ja valitse edellinen ikkuna" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Ponnauta vaihtaja näkyviin jos ei ole ja valitse edellinen ikkuna kaikista " "ikkunoista" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Edellinen paneeli" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Edellinen ikkuna" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Edellinen ikkuna (kaikki ikkunat)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Edellinen ikkuna (ei ponnahdusikkunaa)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Käännä valittuun ikkunaan vaihtaessa" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Valitse seuraava paneelityypin ikkuna." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Siirry seuraavaan ikkunaan ilman vaihtajan ponnahdusikkunaa" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Valitse edellinen paneelityypin ikkuna." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Siirry edelliseen ikkunaan ilman vaihtajaa ponnahdusikkunaa" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Näytä kuvake esikatselukuvan vieressä" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Näytä pienennetyt ikkunat" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Vaihtajanopeus" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Vaihtaja-aikaväli" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Ikkunoiden vaihtajassa näkyvät ikkunatyypit" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Määrittää ikkunatyypit, jotka näkyvät ikkunoiden vaihtajassa" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Lisää YV12-väriavaruuden tuen" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Videon toisto" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Mahdollistaa videon toiston" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12-väriavaruus" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Lisää viiva" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Lisää piste" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Lisää vesitehosteen erilaisille työpöydän toiminnoille" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Kunkin sadepisaran välinen viive (ms)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Ota käyttöön osoittimen vesitehosteet" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Viiva" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Vääristyksen skaala" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Piste" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Sateen viive" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Otsikon aalto" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Ota käyttöön sade" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Ota käyttöön sadetehoste" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Ota käyttöön pyyhkijä" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Ota käyttöön pyyhkijä" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Vesitehoste" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Määrittää vesipisaran alla olevan alueen vääristyksen" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Aaltotehoste ikkunan otsikosta" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Keskitystehoste" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Ikkunan keskitystehoste" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Ikkunatyypit, jotka huojuvat keskittäessä" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Kitka" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Ikkunatyypit, jotka huojuvat tartuttaessa" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Hilan tarkkuus" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Käänteinen ikkunoiden tarttuvuus" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Tee ikkunoista väriseviä" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Ilmestymistehoste" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Liitä ikkunatehoste" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Ikkunatyypit, jotka huojuvat ilmestyessä" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Suurennustehoste" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Pienin mahdollinen hilakoko" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Pienin mahdollinen kärkipisteen hilakoko" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Ikkunatyypit, jotka huojuvat siirrettäessä" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Värinä" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Kiinnitä käänteiset" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Kiinnitä ikkunat" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Jousikitka" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Jousivakio" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Määrittää jousen voimakkuuden" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Ota käyttöön tarttuvat ikkunat" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Käytä ikkunoiden joustavaa huojumistehostetta" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Kärkipisteen hilan tarkkuus" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Määrittää ikkunatyypit, joiden tulisi huojua kohdistettaessa" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Määrittää ikkunatyypit, joiden tulisi huojua tartuttaessa" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Määrittää ikkunatyypit, joiden tulisi huojua liitettäessä" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Määrittää ikkunatyypit, joiden tulisi huojua siirrettäessä" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Huojumistehoste ikkuna suurentaessa ja pienentäessä" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Huojuvat ikkunat" #~ msgid "Command line 0" #~ msgstr "Komentorivi 0" #~ msgid "Run command 0" #~ msgstr "Suorita komento 0" #~ msgid "Screenshot commands" #~ msgstr "Kuvakaappauksen komennot" #~ msgid "Screenshot key bindings" #~ msgstr "Kuvakaappauksen pikanäppäimet" #~ msgid "Filter Linear" #~ msgstr "Suodata lineaarisesti" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Käytä lineaarista suodatinta zoomin aikana" #~ msgid "Zoom Desktop" #~ msgstr "Työpöydän zoomaus" #~ msgid "Zoom In" #~ msgstr "Lähennys" #~ msgid "Zoom Out" #~ msgstr "Loitonnus" #~ msgid "Zoom Pan" #~ msgstr "Zoomin muutosarvo" #~ msgid "Zoom Speed" #~ msgstr "Zoomausnopeus" #~ msgid "Zoom Timestep" #~ msgstr "Zoomausaikaväli" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zoomaa ja panoroi työpöytää" #~ msgid "Zoom factor" #~ msgstr "Suurennuskerroin" #~ msgid "Zoom pan" #~ msgstr "Panorointi suurennettaessa" #~ msgid "Decrease window opacity" #~ msgstr "Vähennä ikkunan läpikuultavuutta" #~ msgid "Increase window opacity" #~ msgstr "Lisää ikkunan läpikuultavuutta" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "Läpinäkyvyyden arvot ikkunoille, jotka ovat läpinäkyviä oletuksena" #~ msgid "Opacity window values" #~ msgstr "Läpinäkyvien ikkunoiden arvot" #~ msgid "Opacity windows" #~ msgstr "Ikkunoiden läpinäkyvyys" #~ msgid "Background Images" #~ msgstr "Taustakuvat" #~ msgid "Background images" #~ msgstr "Taustakuvat" #~ msgid "Place windows on a plane" #~ msgstr "Asettele ikkunat työpöytätason pinnalle" #~ msgid "Plane Down" #~ msgstr "Siirry alas" #~ msgid "Plane Left" #~ msgstr "Siirry vasemmalle" #~ msgid "Plane Right" #~ msgstr "Siirry oikealle" #~ msgid "Plane To Face 1" #~ msgstr "Siirry tasolle 1" #~ msgid "Plane To Face 10" #~ msgstr "Siirry tasolle 10" #~ msgid "Plane To Face 11" #~ msgstr "Siirry tasolle 11" #~ msgid "Plane To Face 12" #~ msgstr "Siirry tasolle 12" #~ msgid "Plane To Face 2" #~ msgstr "Siirry tasolle 2" #~ msgid "Plane To Face 3" #~ msgstr "Siirry tasolle 3" #~ msgid "Plane To Face 4" #~ msgstr "Siirry tasolle 4" #~ msgid "Plane To Face 5" #~ msgstr "Siirry tasolle 5" #~ msgid "Plane To Face 6" #~ msgstr "Siirry tasolle 6" #~ msgid "Plane To Face 7" #~ msgstr "Siirry tasolle 7" #~ msgid "Plane To Face 8" #~ msgstr "Siirry tasolle 8" #~ msgid "Plane To Face 9" #~ msgstr "Siirry tasolle 9" #~ msgid "Plane Up" #~ msgstr "Siirry ylös" #~ msgid "Plane down" #~ msgstr "Siirry alas" #~ msgid "Plane left" #~ msgstr "Siirry vasemmalle" #~ msgid "Plane right" #~ msgstr "Siirry oikealle" #~ msgid "Plane to face 1" #~ msgstr "Siirry tasolle 1" #~ msgid "Plane to face 10" #~ msgstr "Siirry tasolle 10" #~ msgid "Plane to face 11" #~ msgstr "Siirry tasolle 11" #~ msgid "Plane to face 12" #~ msgstr "Siirry tasolle 12" #~ msgid "Plane to face 2" #~ msgstr "Siirry tasolle 2" #~ msgid "Plane to face 3" #~ msgstr "Siirry tasolle 3" #~ msgid "Plane to face 4" #~ msgstr "Siirry tasolle 4" #~ msgid "Plane to face 5" #~ msgstr "Siirry tasolle 5" #~ msgid "Plane to face 6" #~ msgstr "Siirry tasolle 6" #~ msgid "Plane to face 7" #~ msgstr "Siirry tasolle 7" #~ msgid "Plane to face 8" #~ msgstr "Siirry tasolle 8" #~ msgid "Plane to face 9" #~ msgstr "Siirry tasolle 9" #~ msgid "Plane up" #~ msgstr "Siirry ylös" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Kuution läpinäkyvyyden katoamiseen kestävä aika" #~ msgid "Open window menu" #~ msgstr "Avaa ikkunavalikko" #~ msgid "Dock" #~ msgstr "Telakointi" #~ msgid "Toolbar" #~ msgstr "Työkalupalkki" #~ msgid "Menu" #~ msgstr "Valikko" #~ msgid "Utility" #~ msgstr "Apuohjelma" #~ msgid "Splash" #~ msgstr "Splash" #~ msgid "Dialog" #~ msgstr "Valintaikkuna" #~ msgid "DropdownMenu" #~ msgstr "Avattava valikko" #~ msgid "PopupMenu" #~ msgstr "Ponnahdusvalikko" #~ msgid "Tooltip" #~ msgstr "Työkaluvihje" #~ msgid "Notification" #~ msgstr "Ilmoitus" #~ msgid "Combo" #~ msgstr "Yhdistelmä" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "Modaalinen valintaikkuna" #~ msgid "Fullscreen" #~ msgstr "Kokoruutu" #~ msgid "Unknown" #~ msgstr "Tuntematon" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command10 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command1 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command10 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command11 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command2 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command3 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command4 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command5 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command6 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command7 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command8 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command9 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "Add line (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Add point (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Advance to next slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Kirkkauden määrä prosentteina" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Läpikuultavuuden määrä prosentteina" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Kylläisyyden määrä prosentteina" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Kylläisyys" #, fuzzy #~ msgid "" #~ "Clear (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Close active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Decrease window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Kunkin sadepisaran välinen viive (ms)" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "" #~ "Etäisyys, jonka työpöydän tulisi olla loitonnettuna ikkunoita " #~ "vaihdettaessa" #~ msgid "Do not modify" #~ msgstr "Älä muuta" #, fuzzy #~ msgid "" #~ "Draw using tool (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Hylkää varjon poikkeama (X)" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Hylkää varjon poikkeama (Y)" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Hylkää varjon vahvuus" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Hylkää varjon säde" #, fuzzy #~ msgid "" #~ "Enable pointer water effects (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Flip to left viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Flip to right viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Ikkunan kohdistustehoste (ei mitään = None, vavistus = Shiver)" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Valitse edellinen ikkuna" # workflow: "3D Beschleunigung aktivieren" # -ke- #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Taittamisen kiihdytys (1.0-20.0)" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Taittamisen nopeus (0.1-50.0)" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Taittamisen aikaviive (0.1-50.0)" #, fuzzy #~ msgid "" #~ "Go back to previous slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Hide all windows and focus desktop (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Increase window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate annotate drawing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate annotate erasing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate clone selection (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate rectangle screenshot (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "Aikaväli ennen valittujen ikkunoiden nostamista" #, fuzzy #~ msgid "" #~ "Layout and start transforming all windows (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Layout and start transforming window group (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "Asettele tämänhetkisen kohteen ikkunat ja aloita niiden muunto" #, fuzzy #~ msgid "" #~ "Lower window beneath other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Make window shiver (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Ikkunoiden ilmestymistehoste (ei mitään = None, vavistus = Shiver)" #, fuzzy #~ msgid "" #~ "Maximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Maximize active window horizontally (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Maximize active window vertically (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Minimize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Pienennysnopeus (0.1-50.0)" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Pienennysnopeus (0.1-50.0)" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Pienin mahdollinen kärkipisteen hilakoko" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Virtuaalisten työpöytien määrä" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Läpikuultavuuden muutosväli" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Liikkuvien ikkunoiden läpikuultavuustaso" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Liikkuvien ikkunoiden läpikuultavuustaso" #, fuzzy #~ msgid "" #~ "Open a terminal (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Open window menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "Aseta kuvake päälle ikkunoihin, kun ne skaalataan" #, fuzzy #~ msgid "" #~ "Plane down (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane up (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #~ msgid "Plugins that this must load before" #~ msgstr "Etukäteen tätä varten ladattavat liitännäiset" #~ msgid "Plugins that this requires" #~ msgstr "Tähän vaadittavat liitännäiset" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Tuo vaihtaja ponnahdusikkunaan, jos se ei ole näkyvissä, ja valitse " #~ "seuraava ikkuna kaikista ikkunoista" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Tuo vaihtaja ponnahdusikkunaan, jos se ei ole näkyvissä, ja valitse " #~ "seuraava ikkuna kaikista ikkunoista" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Tuo vaihtaja ponnahdusikkunaan, jos se ei ole näkyvissä, ja valitse " #~ "edellinen ikkuna kaikista ikkunoista" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Tuo vaihtaja ponnahdusikkunaan, jos se ei ole näkyvissä, ja valitse " #~ "edellinen ikkuna kaikista ikkunoista" #, fuzzy #~ msgid "" #~ "Pulse effect (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Raise window above other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate left and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate right and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to viewport (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate with window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" # workflow: "3D Beschleunigung aktivieren" # -ke- #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Taittamisen kiihdytys (1.0-20.0)" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Zoomauksen nopeus (0.1-50.0)" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Zoomauksen aikaviive (0.1-50.0)" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Skaalauksen nopeus (0.1-50.0)" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Skaalauksen aikaviive (0.1-50.0)" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "Virtuaalisen vaakatasokoon näyttökokokerroin" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "Virtuaalisen pystytasokoon näyttökokokerroin" #, fuzzy #~ msgid "" #~ "Select next window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Select previous window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Osoitinliikkeen herkkyys" #, fuzzy #~ msgid "Shade resistance (0-100)" #~ msgstr "Varjon vastussauma" #, fuzzy #~ msgid "" #~ "Show Run Application dialog (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Show the main menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Ikkunoiden välinen tila" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Jousikitka" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Jousivakio" #, fuzzy #~ msgid "" #~ "Start Rotation (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Start moving window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Start resizing window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Skaalauksen nopeus (0.1-50.0)" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Skaalauksen aikaviive (0.1-50.0)" #, fuzzy #~ msgid "" #~ "Take a screenshot (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Take a screenshot of a window (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Tekstuurisuodin (nopea = Fast, hyvälaatuinen = Good, paras = Best)" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "Nopeus, jolla näyttö piirretään uudelleen (kertaa/sekunnissa)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Aika (ms), jonka jälkeen skaalaustila lopetetaan, kun ikkunan päälle " #~ "asettaminen on käytössä" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Aikakatkaisu ennen näkymän vaihtamista" #, fuzzy #~ msgid "" #~ "Toggle active window maximized (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized horizontally (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized vertically (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle active window shaded (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle rain effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle use of slow animations (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle window snapping (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle wiper effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #~ msgid "USe linear filter when zoomed in" #~ msgstr "Käytä lineaarista suodinta lähennettäessä" #, fuzzy #~ msgid "" #~ "Unfold cube (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Unmaximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Kärkipisteen hilan tarkkuus" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Vesisiirtymän skaala" #, fuzzy #~ msgid "" #~ "Wave effect from window title (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Ikkunan häivytyksen nopeus" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Ikkunan häivytyksen nopeus" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Ikkunatyypit, jotka tulisi häivyttää" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Ikkunatyypit, jotka tulisi häivyttää" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Ikkunatyypit, jotka tulisi häivyttää" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Ikkunatyypit, jotka tulisi häivyttää" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "Ikkunatyypit, jotka tulisi skaalata skaalaustilassa" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Ikkunatyypit, jotka tulisi näyttää vaihtajassa" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Ikkunatyypit, jotka tulisi muuntaa pienennettäessä" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Ikkunatyypit, jotka tulisi häivyttää" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Ikkunatyypit, joiden tulisi huojua kohdistettaessa" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "Ikkunatyypit, joiden tulisi huojua tartuttaessa" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Ikkunatyypit, joiden tulisi huojua liitettäessä" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Ikkunatyypit, joiden tulisi huojua siirrettäessä" #, fuzzy #~ msgid "" #~ "Zoom In (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Zoom Out (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Zoomauksen nopeus (0.1-50.0)" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Zoomauksen aikaviive (0.1-50.0)" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Zoomauskerroin" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Kierrä kohteen %d suuntaan" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Kierrä kohteen %d suuntaan" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Kierrä kohteen %d suuntaan ikkunan kanssa" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "Kierrä kohteen %d suuntaan ja tuo aktiivinen ikkuna mukana" #~ msgid "Rotate To Face %d" #~ msgstr "Kierrä kohteen %d suuntaan" #~ msgid "Rotate to face %d" #~ msgstr "Kierrä kohteen %d suuntaan" #~ msgid "Rotate To Face %d with Window" #~ msgstr "Kierrä kohteen %d suuntaan ikkunan kanssa" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "Kierrä kohteen %d suuntaan ja tuo aktiivinen ikkuna mukana" #~ msgid "Command line %d" #~ msgstr "Komentorivi %d" #~ msgid "Command line to be executed in shell when run_command%d is invoked" #~ msgstr "" #~ "Komentotulkissa suoritettava komentorivi, kun suorita_komento%d annetaan" #~ msgid "Run command %d" #~ msgstr "Suorita komento %d" #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command%d" #~ msgstr "" #~ "Pikanäppäin, joka kutsuttaessa suorittaa komentotulkin komennon komento%d" #~ msgid "Move Window Types" #~ msgstr "Siirrettäessä huojuvat ikkunatyypit" #~ msgid "Corners" #~ msgstr "Kulmat" #~ msgid "Focus window when mouse moves over them" #~ msgstr "Kohdista ikkunaan osoittimen liikkuessa sen päälle" #~ msgid "Initiate All Windows" #~ msgstr "Aktivoi kaikkien ikkunoiden ikkunanvaihtaja" #, fuzzy #~ msgid "Initiate Keyboard Window Move" #~ msgstr "Siirrä ikkunaa" #, fuzzy #~ msgid "Initiate Keyboard Window Resize" #~ msgstr "Muuta ikkunan kokoa" #~ msgid "Initiate Window Switcher" #~ msgstr "Aktivoi ikkunanvaihtaja" #~ msgid "Modifier to show switcher for all windows" #~ msgstr "Kaikkien ikkunoiden näyttämiseen käytettävä vaihtonäppäin" #~ msgid "Return from scale view" #~ msgstr "Poistu skaalausnäkymästä" #~ msgid "Show switcher" #~ msgstr "Näytä ikkunavaihtaja" #~ msgid "Sloppy Focus" #~ msgstr "Seuraava tarkennus" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Aloita ikkunan siirtäminen" #~ msgid "Terminate" #~ msgstr "Lopeta" #~ msgid "Water effect on system beep" #~ msgstr "Vesitehoste järjestelmän huomautuksessa" #~ msgid "" #~ "Window types that should be fading (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Häivytettävät ikkunatyypit (työpöytä = Desktop, paneeli = Dock, " #~ "työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should be transformed when minimized (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgstr "" #~ "Pienennettäessä animoitavat ikkunatyypit (työpöytä = Desktop, paneeli = " #~ "Dock, työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should scaled in scale mode (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Skaalautuvat ikkunatyypit (työpöytä = Desktop, paneeli = Dock, " #~ "työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should shown in switcher (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Ikkunavaihtajassa näkyvät ikkunatyypit(työpöytä = Desktop, paneeli = " #~ "Dock, työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should wobble when focused (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Ikkunatyypit, jotka huojuvat kohdistettaessa(työpöytä = Desktop, paneeli " #~ "= Dock, työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should wobble when grabbed (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Ikkunatyypit, jotka huojuvat tartuttaessa (työpöytä = Desktop, paneeli = " #~ "Dock, työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should wobble when mapped (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Ikkunatyypit, jotka huojuvat ilmestyessään (työpöytä = Desktop, paneeli = " #~ "Dock, työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should wobble when moved (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Ikkunatyypit, jotka huojuvat liikuteltaessa (työpöytä = Desktop, paneeli " #~ "= Dock, työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" # workflow: "3D Beschleunigung aktivieren" # -ke- #~ msgid "Wobble effect on system beep" #~ msgstr "Huojumistehoste järjestelmän huomautuksesta" compiz-0.9.11+14.04.20140409/po/eu.po0000644000015301777760000025030312321343002017064 0ustar pbusernogroup00000000000000# translation of eu-compiz.po to Basque # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Ander Elortondo , 2007, 2008. msgid "" msgstr "" "Project-Id-Version: eu-compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-06-23 15:38+0200\n" "Last-Translator: Ander Elortondo \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Mahaigaina" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Leiho kudeatzailea" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Bat ere ez" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Itzala" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximizatu" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Horizontalki maximizatu" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Bertikalki maximizatu" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Ikonotu" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Goratu" #: ../gtk/gnome/compiz-window-manager.c:433 #, fuzzy msgid "Lower" msgstr "Azpian" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Leiho Menua" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Leihoko titulu barra gainetik sagu gurpila biratzean hartu beharreko ekintza." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Lausotze mota" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Metacity gaian leiho aktiboko opakutasuna" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity gaian leiho aktiboko opakotasun itzala" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity gaiaren opakutasuna" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity gaiaren opakotasun itzala" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Metacity gaiaren dekorazioaetan erabili beharreko opakutasuna leiho " "aktiborako" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Metacity gaiaren dekorazioaetan erabili beharreko opakutasuna" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Itzaldu leiho aktiboa metacity dekorazio gaia erabiliz, opakutik " "transluzidora." #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Itzaldu leihoak metacity dekorazio gaia erabiliz, opakutik transluzidora." #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Sagu gurpil ekintza titulu-barran" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Leiho dekoraziorako lausotze mota" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Erabili metacity gaia" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Erabili metacity gaia leiho dekorazioa marraztean" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Itxi leihoa" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Leheneratu leihoa" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximizatu leihoa" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Leihoa Minimizatu" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Ezarri gainean" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Itsatsi" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Itzala kendu" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Gainean ezartzea kendu" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "itsastea kendu" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "\"%s\" leihoak ez du erantzuten." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Aplikazio honi irtetzera behartuz, gorde gabeko aldaketak galtzea ekar " "dezake." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Irtetzera behartu" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Oharrak idatzi" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Betetze kolorea oharretan" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Oharren marra kolorea" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Oharren plugina" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Garbitu" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Marraztu" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Marraztu tresna erabiliz" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Betetze kolorea oharrentzat" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Hasi" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Hasi oharren marraztea" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Hasi oharren ezabatzea" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Hasi ezabatzea" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Lerro zabalera" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Lerro zabalera oharrentzat" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Marra kolorea oharrenzat" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Marra zabalera" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Marra zabalera oharrentzat" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alfa lausotzea" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alfa lausotze leihoak" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Lausotze iragazkia" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Lausotze oklusioa" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Lausotze saturazioa" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Lausotze abiadura" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Lausotze leihoak" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Leiho atal transluzidoen atzeko lausotzea" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Lausotze saturazioa" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Lausotze leihoak" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Fokua ez duten leihoen lausotzea" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Beste leiho batek ilundutako pantaila eremuen lausotzea ezgaitu" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Lausotzerako erabilitako iragazki metodoa" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Fokoaren Lausotzea" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Leihoen foko lausotzea" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussiar" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gauss Erradioa" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gaussiar Indarra" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Gauss erradioa" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gaussiar indarra" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Testura independente lagina" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap DM" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap Detaile Maila" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pultso" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Pultso efektua" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Erabili testura eskuragarriak ahal bezain testura independente lagin " "sortzeko." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Leiho lausotze abiadura" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Foko lausotzeak eragina izango duen leihoak" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Alfa lausotzea lehenetsita izango duten leihoak" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Klonatu irteera" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Hasi klonatze hautapena" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Irteera klonatze kudeatzailea" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "Shell command0 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "Shell command1 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "Shell command10 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "Shell command11 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "Shell command2 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "Shell command3 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "Shell command4 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "Shell command5 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "Shell command6 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "Shell command7 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "Shell command8 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "Shell command9 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "Shell command0 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "Shell command1 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "Shell command10 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "Shell command11 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "Shell command2 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "Shell command3 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "Shell command4 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "Shell command5 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "Shell command6 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "Shell command7 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "Shell command8 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "Shell command9 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "Shell command0 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "Shell command1 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "Shell command10 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "Shell command11 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "Shell command2 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "Shell command3 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "Shell command4 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "Shell command5 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "Shell command6 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "Shell command7 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "Shell command8 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "Shell command9 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Esleitu laster-tekla hautazko komandori" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Botoi Laster-bideak" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "1 komando lerroa" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "10 komando lerroa" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "11 komando lerroa" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "12 komando lerroa" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "2 komando lerroa" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "3 komando lerroa" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "4 komando lerroa" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "5 komando lerroa" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "6 komando lerroa" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "7 komando lerroa" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "8 komando lerroa" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "9 komando lerroa" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_0komandoa abiaraztean" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_1komandoa abiaraztean" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_10komandoa abiaraztean" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_11komandoa abiaraztean" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_2komandoa abiaraztean" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_3komandoa abiaraztean" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_4komandoa abiaraztean" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_5komandoa abiaraztean" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_6komandoa abiaraztean" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_7komandoa abiaraztean" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_8komandoa abiaraztean" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_9komandoa abiaraztean" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Komandoak" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Ertzetako laster-bideak" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Laster-teklak" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Exekutatu 1 komandoa" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Exekutatu 10 komandoa" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Exekutatu 11 komandoa" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Exekutatu 12 komandoa" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Exekutatu 2 komandoa" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Exekutatu 3 komandoa" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Exekutatu 4 komandoa" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Exekutatu 5 komandoa" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Exekutatu 6 komandoa" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Exekutatu 7 komandoa" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Exekutatu 8 komandoa" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Exekutatu 9 komandoa" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Plugin aktiboak" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Gaitu pantaila osoa marraztean ez birbideratzea pantailaz kanpoko pixmapsera" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Kanpai entzungarri" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Sistemako beep entzungarri" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatikoki goratu" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Automatikoki goratzeraren atzerapena" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Irteera gailuen detekzio automatikoa" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Freskatze tasaren detekzio automatikoa" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Onena" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Klik enfokatzeko" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Leihoan klik egitean mugi sarrera fokua berari" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Itxi leiho aktiboa" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Lehenetsitako ikonoa" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Lehenetsitako leihoaren ikono irudia" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Mahaigain tamaina" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Irteerak detektatu" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Freskatze-tasa detektatu" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Erakutsi ezarpenak" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Saguaren erakuslea pantaila ertzean egon behar duen denbora akzioa hasi " "aurretik." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Ertz abiarazlearen atzerapen denbora" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Azkarra" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Foku Prebentzio maila" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Foku Prebentzioa Leihoak" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Foku prebentzioa leihoak" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Behartu irteera independenteko margotzea." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Aukera orokorrak" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Compiz aukera orokorrak" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Ona" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ezkutatu ataza-barran ez dauden leihoak" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Ezkutatu leiho guztiak eta mahaigaina enfokatu" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Gorde ataza-barran ez dauden leihoak mahaigain erakuste moduan sartzean" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Altura" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Horizontal tamaina birtuala" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Ahal denean erabili trinkotzea irudietatik eratorritako testurentzat" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ez ikusi iradokizunak maximizatua dagoenean" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ez ikusi tamaina handitze eta itxura iradokizunak leihoa maximizatua " "dagoenean" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Hautatutako leihoak goratu arretiko tartea" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Ping mezuen arteko tartea" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Laster-teklak" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Foku lapurtze prebentzio maila" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Argitasuna" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Orain aktibo dauden plugin zerrenda" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Irteera gailuak deskribatzeko kateen zerrenda" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Azpian" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Azpiko leihoa" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Azpiko leihoa beste leihoen atzean" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Horizontalki maximizatu leihoa" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Bertikalki maximizatu leihoa" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Leiho aktiboa maximizatu" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Leiho aktiboa horizontalki maximizatu" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Leiho aktiboa bertikalki maximizatu" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Leiho aktiboa minimizatu" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normala" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Mahaigain kopurua" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Mahaigain birtualen kopurua" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Itzali" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Pantaila eguneratzeak zuritze bertikalaren denboran bakarrik baimendu" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Irteerak" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Gainjartze irteeren kudeaketa" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Margotu gailu bakoitza independente, nahiz eta irteera gailuak gainjarri" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping atzerapena" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Hobetsi irteera handiagoa" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Hobetsi irteera txikiagoa" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Goratu klikatzean" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Goratu leihoa" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Goratu hautatutako leihoa denbora tarte baten ondoren" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Goratu leihoa beste leihoen gainetik" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Goratu leihoak klikatzean" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Freskatze-tasa" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Pantaila tamaina biderkatzailea tamaina horizontal birtualerako" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Pantaila tamaina biderkatzailea tamaina bertikal birtualerako" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Ikus mahaigaina" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Animazioak motel" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Modu adimentsua" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank-era sinkronizatu" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Testura trinkotzea" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Testura iragazkia" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Testura iragazten" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Pantaila marrazteko maiztasuna (aldiz/segunduko) " #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Gaitu/ezgaitu leihoa maximizatua" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Gaitu/ezgaitu leihoa maximizatua horizontalki" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Gaitu/ezgaitu leihoa maximizatua bertikalki" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Gaitu/ezgaitu leihoa itzalduta" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Gaitu/ezgaitu leiho aktiboa maximizatua" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Gaitu/ezgaitu leiho aktiboa maximizatua horizontalki" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Gaitu/ezgaitu leiho aktiboa maximizatua bertikalki" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Gaitu/ezgaitu leiho aktiboa itzaldua" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Gaitu/ezgaitu animazio motelen erabilpena" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Leheneratu leiho aktiboa" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Ez-birbideratu pantaila osoko leihoak" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Erabili argi barreiatua pantaila transformatzean" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Tamaina Birtual Bertikala" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Oso altua" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Gainjartze irteera gailuen artean hobetsiko dena" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Leiho menu tekla konbinazioa" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Leiho menu laster-tekla" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Azelerazioa" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Irudia doitu" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Goiko aurpegiko irudia doitu biratzeko" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Aurreratu hurrengo diapositibara" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Skydome animatu" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animatu skydome kuboa biratzean" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Itxura" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatiko" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Portaera" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Kuboaren goiko eta azpiko aurpegien kolorea" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "skydome atzera biratze gradientean, azpiko kolore-gelditzean erabili " "beharreko kolorea" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "skydome atzera biratze gradientean, goiko kolore-gelditzean erabili " "beharreko kolorea" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Kubo estalkiak" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kubo kolorea" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Mahaigain Kuboa" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Bueltatze azelerazioa" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Bueltatze abiadura" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Bueltatze denbora-pausoa" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Kalitate handiagoko eskalan sortu mipmaps posible denean" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Joan atzera aurreko diapositibara" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Irudi fitxategiak" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Skydomean testura bezala erabiltzeko irudia" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Kuboaren gardentasuna hasi, biratzea saguak gidatzen badu" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Kubo Barrua" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Kubo barrua" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Kuboko goi aurpegian errenderatuko diren PNG eta SVG irudien zerrenda" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Irteera anitzeko modua" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Kubo anitz" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Hurrengo diapositiba" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Kubo handian" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opakutasuna biratzean" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opakutasuna biratzen ez dabilenean" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Mahaigain leihoaren opakutasuna biratzean." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Mahaigain lehioaren opakutasuna biratzen ez dabilenean." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Kokatu leihoak kuboan" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Aurreko diapositiba" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Errendatu skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Irudia eskalatu" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Eskalatu irudia kuboaren goi aurpegia estaltzeko" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Hautatu nola erakutsi kuboa irteera anitzeko gailuak erabiltzean." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Skydomeko gradientearen amaiera kolorea" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Skydomeko gradientearen hasiera kolorea" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Skydome irudia" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Abiadura" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "denbora-pausoa" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Gardentasuna saguaz biratzean bakarrik" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Kubo gardena" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Zabaldu" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Zabaldu kuboa" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus kontrol tresna" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Gaitu mipmaps sortzea dekorazio testurentzat" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Komandoa" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekorazio leihoak" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Jadanik dekoratzailerik ez badago martxan, exekutatuko den komando lerroa" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Itzalaren X desplazamendua salto" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Itzalaren Y desplazamendua salto" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Itzalaren kolorea salto" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Itzalaren opakutasuna salto" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Itzalaren erradio salto" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Itzal Kolorea" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Itzalaren X desplazamendua" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Itzalaren Y desplazamendua" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Itzalaren opakutasuna" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Itzalaren Erradioa" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Leihoak itzaldu" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Leiho Dekorazioa" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Leiho dekorazioak" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Dekoratuko diren leihoak" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Itzala izango duten leihoak" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Distira (%tan) erantzuten ez duen leihoek" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Abiadura konstantea" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Denbora konstantea" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Erantzuten ez duten leihoen tamaina aldatu" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Leiho kudeatzailearen eskariei erantzuten ez duten leihoen tamaina aldatu" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Iraungitze modua" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Iraungi minimizatu/ireki/ixtean" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Iraungitze abiadura" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Iraungitze denbora" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Iraungitze efektua ondorengo leiho gertaeretan minimizatu/ireki/itxi" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Sistemako kanpaian iraungitze efektua" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Leihoak iraungiz agertu aukeratzean eta iraungiz desagertu aukeraketa " "galtzean" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Iraungi leihoak" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Leihoak iraungitzen" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Pantaila osoko ikus-kanpaia" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Pantaila osoko iraungitzea sistema kanpaiak jotzean" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Erantzuten ez duten leihoen saturazioa (%tan)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Erantzuten ez duen leiho distira" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Erantzuten ez duen leiho saturazioa" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Ikus-Kanpaia" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Leiho iraungitze modua" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Leiho iraungitze abiadura \"abiadura konstante\" moduan" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Leiho iraungitze denbora (ms) \"denbora konstante\" moduan" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Iraungitu beharreko leihoak" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Muntatze puntua" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Muntatze puntua" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Erabiltzailearen-espazio Fitxategi Sistema" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Erabiltzailearen-espazio fitxategi sistema" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf kontrol tresna" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib loop nagusiaren euskarria" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome bateragarritasuna" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Terminala zabaldu" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Compiz Gnome mahaigain inguruneaz bateragarriak egiten duten aukerak" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Exekuzio elkarrizketa" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Terminal komandoa exekutatu" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Pantaila-argazkia komando lerroa" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Ikus Menu Nagusia" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Ikus aplikazio exekuzio elkarrizketa" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Ikus menu nagusia" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Egin pantaila-argazkia" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Egin pantaila-argazkia leiho batena" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Terminal komando lerroa" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Leiho pantaila -argazki komando lerroa" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini fitxategi lauaren tresna" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Fitxategi aldaketaren jakinarazpen plugina" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig kontrol tresna" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Ikonotze Efektua" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Ikonotu leihoak" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Ikonotze abiadura" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Ikonotze denbora-pausoa" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Itzaltze Erresistentzia" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Itzaltze erresistentzia" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Eraldatu leihoak ikonotzean edo handitzean" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Leihoak ikonotzean eraldatuko dira" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Mugatu Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Mugatu Y koordenatua laneko areara" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "Ez eguneratu kokapena leiho zerbitzarian, mugitzen amaitu arte" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Hasi leiho mugimendua" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Kokapen alferra" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Leiho Mugimendua" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Leiho mugimendua" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opakutasuna" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Mugitzen ari diren leihoaen opakutasuna" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Maximizatutako leihoak arrastatzean automatikoki askatu eta desmaximizatu" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Askatu maximizatutako leihoak" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Hasi leihoa mugitzen" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Distira" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Distira txikitu" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Distira handitu" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Distira pausoa" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Distira balioak leihoentzat" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Txikitu" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Handitu" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Opakutasuna txikitu" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Opakutasuna handitu" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Opakotasun pausoa" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Opakutasun balioa leihoentzat" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Opakutasuna, distira eta saturazioa" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Opakutasun, distira eta saturazio doitzeak" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturazioa" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Saturazioa txikitu" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Saturazioa handitu" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Saturazio pausoa" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Saturazio balioa leihoentzat" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Pausoa" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Leiho zehatz ezarpenak" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Leihoaren balioak" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Leihoak" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Distira lehenetsi ezberdina izan behar duten leihoak" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Opakutasun lehenetsi ezberdina izan behar duten leihoak" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Saturazio lehenetsi ezberdina izan behar duten leihoak" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Leiho kokapenerako algoritmoa" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Kaskadan" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Zentratua" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Leiho kokapen antolatua" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Behartu leihoen kokatzea" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Mahaigain aurkezpen horizontalen kokapena" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Mantendu lan arean" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Mantendu leiho kokapena lan arean, nahiz eta kokapen hau ez etorri bat " "kokapen zehatzaz" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Kokatu leihoak" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Kokatu irteera guztietan zehar " #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Kokatu leihoak toki egokian mapeatzerakoan" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Kokapen Modua" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Kokatutako leihoak" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Ausaz" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Hautatu nola kokatuko diren leihoak hainbat irteera gailu erabiltzen badira." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Adimentsua" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Irteera gailu aktiboa erabili" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Fokua duen leihoaren irteera gailua erabili" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Aukeratu irteera gailuan erakusleaz" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Mahaigain aurkezpen bertikalen kokapenak" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Mahaigain aurkezpenan kokatutako leihoak" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Leihoak kokatzeko konponbideak" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Berez kokatuko diren leihoak" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Mahaigain aurkezpen konkretuan berez kokatuko diren leihoak" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Kokatzera behartuko diren leihoak, nahiz eta leiho kudeatzaileak horiek " "kokatzea saihestu " #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Posizio zehaztuko leihoak" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Mahaigain aurkezpen zehaztuko leihoak" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Konponbideak" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X kokapenak" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X mahaigain aurkezpen kokapenak" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X kokapen balioak" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y kokapenak" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y mahaigain aurkezpen kokapenak" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y kokapen balioak" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png irudi kargatzailea" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Regex parekatzea" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Regex leiho parekatzea" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Laster-bideak" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Ertz Kolorea" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Kanpoko-lerro eta lauki tamaina aldaketa moduan ertz kolorea" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Lehenetsitako Tamaina aldaketa Modua" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Lehenetsitako modua leiho tamaina aldaketan" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Betetze Kolorea" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Kanpoko-lerro eta lauki tamaina aldaketa moduan betetze kolorea" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Hasi leiho tamaina aldatze normala" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Hasi kanpoko-lerro leiho tamaina aldaketa" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Hasi lauki leiho tamaina aldaketa" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Hasi tiratze leiho tamaina aldaketa" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Hasi Lehio Tamaina-aldaketa" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Leihoak Normal Tamainaz-aldatu" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Kanpo-lerroa" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Kanpo-lerroaz Tamaina-aldatu Leihoei" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Laukia" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Laukiaz Tamaina-aldatu Leihoei" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Tamaina-aldatu Leihoari" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Tamaina-aldatu leihoari" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Hasi tamaina-aldatzen leihoari" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Hasi tamaina-aldatzen leihoari tiratuz" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Hasi tamaina-aldatzen leihoari normal" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Hasi tamaina-aldatzen leihoari kanpo-lerroaz" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Hasi tamaina-aldatzen leihoari laukiaz" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Tiratu" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Tamaina-aldatu leihoei tiratuz" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Tamaina-aldatze normala erabiliko duten leihoak" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Tamaina-aldatzea kanpo-lerroaz egingo duten leihoak" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Tamaina-aldatzea laukiaz egingo duten leihoak" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Tamaina-aldatzea tiratuz egingo duten leihoak" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD ertza irauli" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Mugitu Ertz Iraultzea" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Ertz Iraultze Erakuslea" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Iraultze Denbora" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Irauli ezkerreko mahaigain aurkezpen eta okertu erakuslea" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Irauli hurrengo mahaigain aurkezpenera, objektua pantaila ertzera " "arrastatzean" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Irauli hurrengo mahaigain aurkezpenera, erakuslea pantaila ertzera mugitzean" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Irauli hurrengo mahaigain aurkezpenera, leihoa pantaila ertzera mugitzean" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Irauli eskumako mahaigain aurkezpenera eta okertu erakuslea" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Alderantzikatu Y ardatza erakusle mugimendurako" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Alderantzikatu Y erakuslean" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Erakuslearen Sentikortasuna" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Altzatu biratzean" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Altzatu leihoa biratzean" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Biratu kuboa" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Biratu ezkerrera irauliz" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Biratu eskumara irauliz" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Ezkerrera biratu" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Ezkerrera biratu leihoaz" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Eskumara biratu" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Eskumara biratu leihoaz" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Nora Biratu" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "1 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "1 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "10 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "10 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "11 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "11 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "12 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "12 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "2 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "2 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "3 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "3 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "4 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "4 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "5 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "5 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "6 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "6 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "7 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "7 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "8 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "8 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "9 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "9 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Biratu kuboa" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Mahaigain kuboa biratu" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Ezkerrera biratu" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Ezkerrera biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Eskumara biratu" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Eskumara biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Biratu kubo aurpegira" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Biratu leihoa duen aurpegira" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "1 aurpegira biratu" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "1 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "10 aurpegira biratu" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "10 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "11 aurpegira biratu" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "11 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "12 aurpegira biratu" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "12 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "2 aurpegira biratu" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "2 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "3 aurpegira biratu" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "3 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "4 aurpegira biratu" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "4 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "5 aurpegira biratu" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "5 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "6 aurpegira biratu" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "6 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "7 aurpegira biratu" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "7 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "8 aurpegira biratu" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "8 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "9 aurpegira biratu" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "9 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Biratu mahaigain aurkezpena" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Biratu leihoa" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Biratu leihoaz" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Biratze azelerazioa" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Biratze abiadura" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Biratze denbora-pausua" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Biratze zoom" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Erakusle mugimenduaren sentikortasuna" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Atxiki kubo biratzea azpiko aurpegiari" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Atxiki kubo biratzea goiko aurpegiari" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Atxiki Azpiko Aurpegiari" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Atxiki Goiko Aurpegiari" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Hasi Biratzea" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Denbora-muga mahaigain aurkezpena irauli aurretik" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Opakutasun kopurua ehunekotan" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Handia" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Klikatu mahaigaina, mahaigaina ikusteko" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Ilundu atzeko-planoa" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Ilundu atzeko-planoa leihoak eskalatzean" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Ikurra" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "Sartu Mahaigain Ikusteko moduan, eskalatzean mahaigaina klikatzean" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Nabarmentze Denbora" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Abiarazi Leiho Hautatzailea" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Abiarazi leiho hautatzailea leiho guztientzat" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Abiarazi leiho hautatzailea leiho taldearentzat" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Abiarazi leiho hautatzailea uneko irteerako leihoentzat" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Diseinua eta transformatzen hasi leiho guztiak" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Diseinua eta transformatzen hasi leiho taldea" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Diseinua eta transformatzen hasi leihoak" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Diseinua eta transformatzen hasi uneko irteerako leihoak" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Irteera gailu guztietan" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Uneko irteera gailuan" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Gainjarri Ikonoa" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Gainjarri ikonoa leihoetan eskalatu eta gero" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Eskalatu" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Eskalatu Lehioak" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Eskalatze abiadura" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Eskalatze denbora-pausoa" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Eskalatu lehioak" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Hautatu non eskalatuko diren leihoak hainbat irteera gailu erabiltzen badira." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Leiho arteko tartea" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Tartea" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Denbora (ms) eskalatze modua amaitzeko, erakuslea leiho gainetik pasatzean" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Eskalatze moduan eskalatuko diren leihoak" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Auomatikoki ireki pantaila argazkia aplikazio honetan" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Direktorioa" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Hasi laukizuzen pantaila argazkia" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Abiarazi aplikazioa" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Pantaila argazkiak direktorio honetan sartu" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Pantaila argazkia" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Pantaila argazkia plugin" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg irudi kargatzailea" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Distira kopurua ehunekotan" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Saturazio kopurua ehunekotan" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Aplikazio Aldatzailea" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Auto-biratu" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Eraman aurrealdera" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Eraman hautatutako leihoak aurrealdera" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Leihoak aldatzerakoan hurruntze zooma mahaigainari" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikonoa" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Ikonotua" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Hurrengo panela" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Hurrengo leihoa" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Hurrengo leihoa (Leiho guztiak)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Hurrengo leihoa (popup ez)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Popup aldatzailea bistara ez badago eta hautatu hurrengo leihoa" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Popup aldatzailea bistara ez badago eta hautatu hurrengo leihoa, leiho " "guztien artean" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Popup aldatzailea bistara ez badago eta hautatu aurreko leihoa" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Popup aldatzailea bistara ez badago eta hautatu aurreko leihoa, leiho " "guztien artean" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Aurreko panela" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Aurreko leihoa" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Aurreko leihoa (leiho guztiak)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Aurreko leihoa (popup ez)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Biratu hautatutako leihoa aldatu bitartean" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Hautatu hurrengo paneleko leiho mota." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Hautatu hurrengo leihoa popup leihoa ikusi gabe." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Hautatu aurreko paneleko leiho mota." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Hautatu aurreko leihoa popup leihoa ikusi gabe." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Erakutsi ikonoa koadro txiki ondoan." #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Erakutsi txikitutako leihoak" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Aldatzailearen abiadura" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Aldatzailearen denbora-pausoa" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Leiho aldatzailea" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Aldatzailean erakutsiko diren leihoak" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "hornitu YV12 colorspace euskarria" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Bideo Playback" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Bideo playback" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 colorspace" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Gehitu lerroa" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Gehitu puntua" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Gehitu ur efektuak mahaigain ezberdinen akzioei" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Euri-tanten arteko denbora (ms)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Gaitu erakuslearen ur efektuak" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Lerroa" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Eskala desplazamendua" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Puntua" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Euri atzerapena" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Uhin titulua" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Gaitu/ezgaitu euria" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Gaitu/ezgaitu euri efektua" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Gaitu/ezgaitu wiper" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Gaitu/ezgaitu wiper efektua" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Ur efektua" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Ur desplazamendu eskala" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Uhin efektua leiho titulutik" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Foku efektua" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Leiho foku efektua" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Leihoak enfokatu " #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Marruskadura" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Harrapatu leihoak" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Sareta erresoluzioa" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Leiho atxikitze alderantzikatua " #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Leihoak dardara egin dezala" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Map Efektua" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Map leiho efektua" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Map leihoak" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Maximizatu efektua" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Sareta tamaina minimoa" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Vertex sareta tamaina minimoa" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Mugitu leihoak" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Dardara" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Atxikitze alderantzikatua" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Atxikitu leihoak" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Malguki marruskadura" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Malguki K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Malguki konstantea " #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Gaitu/ezgaitu leiho atxikitzea" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Erabili malguki modua dar-dar leiho efekturako" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Vertex sareta erresoluzioa" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Dar-dar egin behar duten leihoak enfokatzean" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Dar-dar egin behar duten leihoak eustean " #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Dar-dar egin behar duten leihoak mapatzean" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Dar-dar egin behar duten leihoak mugitzean" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Dar-dar efektua leihoak maximizatzean eta maximizatzea kentzean" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Dardara duten leihoak" #~ msgid "Command line 0" #~ msgstr "0 komando lerroa" #~ msgid "Run command 0" #~ msgstr "Exekutatu 0 komandoa" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Pantaila-argazkia komando lerroa" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Pantaila-argazkia komando lerroa" #~ msgid "Filter Linear" #~ msgstr "Iragazki lineala" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Erabili iragazki lineala zooma gerturatzean" #~ msgid "Zoom Desktop" #~ msgstr "Mahaigain zooma" #~ msgid "Zoom In" #~ msgstr "Zoom gerturatzea" #~ msgid "Zoom Out" #~ msgstr "Zoom urrundu" #~ msgid "Zoom Pan" #~ msgstr "Zoom pan" #~ msgid "Zoom Speed" #~ msgstr "Zoom abiadura" #~ msgid "Zoom Timestep" #~ msgstr "Zoom denbora-pausoa" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zoom eta pan mahaigain kuboa" #~ msgid "Zoom factor" #~ msgstr "Zoom faktorea" #~ msgid "Zoom pan" #~ msgstr "Zoom pan" #~ msgid "Decrease window opacity" #~ msgstr "Txikitu leiho opakutasuna" #~ msgid "Increase window opacity" #~ msgstr "Handitu leiho opakutasuna" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Lehenetsita transluzidoak izango diren leihoentzako opakutasun balioak" #~ msgid "Opacity windows" #~ msgstr "Leihoen opakutasuna" #~ msgid "Background Images" #~ msgstr "Atzeko plano Irudiak" #~ msgid "Background images" #~ msgstr "Atzeko plano irudiak" #~ msgid "Place windows on a plane" #~ msgstr "Kokatu leihoak planoan" #~ msgid "Plane Down" #~ msgstr "Planoa Behera" #~ msgid "Plane Left" #~ msgstr "Planoa Ezkerrera" #~ msgid "Plane Right" #~ msgstr "Planoa Eskumara" #~ msgid "Plane To Face 1" #~ msgstr "Planoa 1 Aurpegira" #~ msgid "Plane To Face 10" #~ msgstr "Planoa 10 Aurpegira" #~ msgid "Plane To Face 11" #~ msgstr "Planoa 11 Aurpegira" #~ msgid "Plane To Face 12" #~ msgstr "Planoa 12 Aurpegira" #~ msgid "Plane To Face 2" #~ msgstr "Planoa 2 Aurpegira" #~ msgid "Plane To Face 3" #~ msgstr "Planoa 3 Aurpegira" #~ msgid "Plane To Face 4" #~ msgstr "Planoa 4 Aurpegira" #~ msgid "Plane To Face 5" #~ msgstr "Planoa 5 Aurpegira" #~ msgid "Plane To Face 6" #~ msgstr "Planoa 6 Aurpegira" #~ msgid "Plane To Face 7" #~ msgstr "Planoa 7 Aurpegira" #~ msgid "Plane To Face 8" #~ msgstr "Planoa 8 Aurpegira" #~ msgid "Plane To Face 9" #~ msgstr "Planoa 9 Aurpegira" #~ msgid "Plane Up" #~ msgstr "Planoa Gora" #~ msgid "Plane down" #~ msgstr "Planoa behera" #~ msgid "Plane left" #~ msgstr "Planoa ezkerrera" #~ msgid "Plane right" #~ msgstr "Planoa eskumara" #~ msgid "Plane to face 1" #~ msgstr "Planoa 1 aurpegira" #~ msgid "Plane to face 10" #~ msgstr "Planoa 10 aurpegira" #~ msgid "Plane to face 11" #~ msgstr "Planoa 11 aurpegira" #~ msgid "Plane to face 12" #~ msgstr "Planoa 12 aurpegira" #~ msgid "Plane to face 2" #~ msgstr "Planoa 2 aurpegira" #~ msgid "Plane to face 3" #~ msgstr "Planoa 3 aurpegira" #~ msgid "Plane to face 4" #~ msgstr "Planoa 4 aurpegira" #~ msgid "Plane to face 5" #~ msgstr "Planoa 5 aurpegira" #~ msgid "Plane to face 6" #~ msgstr "Planoa 6 aurpegira" #~ msgid "Plane to face 7" #~ msgstr "Planoa 7 aurpegira" #~ msgid "Plane to face 8" #~ msgstr "Planoa 8 aurpegira" #~ msgid "Plane to face 9" #~ msgstr "Planoa 9 aurpegira" #~ msgid "Plane up" #~ msgstr "Planoa gora" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Mahaigain leiho opakotasun iraungitze denbora." compiz-0.9.11+14.04.20140409/po/lt.po0000644000015301777760000022700212321343002017072 0ustar pbusernogroup00000000000000# Lithuanian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2000, 2001 SuSE GmbH. # Jonas Gocentas , 2001. # Linas Spraunius , 2000. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2001-10-18 09:54+0200\n" "Last-Translator: Jonas Gocentas \n" "Language-Team: Lithuanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%" "100<10 || n%100>=20) ? 1 : 2;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Darbastaliai" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Window Manager" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nieko" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Skeneris" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "&Suspausti Windows" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "&Suspausti Windows" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "&Suspausti Windows" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "&Suspausti Windows" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "AutomatinÄ—" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Window Manager" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Praleistas\n" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "VisiÅ¡kai &iÅ¡trinti Windows" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "VisiÅ¡kai &iÅ¡trinti Windows" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "&IÅ¡trinti Windows" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 #, fuzzy msgid "Minimize Window" msgstr "&Suspausti Windows" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr " -- Inicializuoti" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Spalvos" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Aktyvus profailas" #: ../metadata/annotate.xml.in.h:5 #, fuzzy msgid "Clear" msgstr "_Valyti" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 #, fuzzy msgid "Fill color for annotations" msgstr "Sužinokite daugiau pasinaudojÄ™ dokumentacija" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr " -- Inicializuoti" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr " -- Inicializuoti" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr " -- Inicializuoti" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr " -- Inicializuoti" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 #, fuzzy msgid "Line width for annotations" msgstr "Sužinokite daugiau pasinaudojÄ™ dokumentacija" #: ../metadata/annotate.xml.in.h:15 #, fuzzy msgid "Stroke color for annotations" msgstr "Sužinokite daugiau pasinaudojÄ™ dokumentacija" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 #, fuzzy msgid "Stroke width for annotations" msgstr "Sužinokite daugiau pasinaudojÄ™ dokumentacija" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Filtras: " #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "&IÅ¡trinti Windows" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Nu&statyti filtrÄ…" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "TrukmÄ—" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "TrukmÄ—" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Praleistas\n" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "TrukmÄ—" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "&IÅ¡trinti Windows" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Rusų" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Rusijos Federacija" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Rusų" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Rusijos Federacija" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Rusų" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "Lima" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Lima" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windows laisva (%1)" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Video režimo pasirinkimas" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Komanda '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Komanda '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Komanda '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Komanda '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Komanda:" #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "Aktyvus profailas" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "Bylų &sistema" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "AutomatinÄ—" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Ä®prastas skyrius" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "Ä®prasta galiojimo pabaigos data" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Darbalaukis" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "Pasirinkite atnaujinimui" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Paleidžiamas demonas." #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Paleidžiamas demonas." #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "VirtualÅ«s pseudonimai" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "Ä®jungti ZEN skaidinį" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "Registravimas" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "IÅ¡vardinti tik detektuotus spausdintuvus" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "Windows" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "&Suspausti Windows" #: ../metadata/core.xml.in.in.h:51 #, fuzzy msgid "Maximize Window Vertically" msgstr "&Suspausti Windows" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normalus" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "NutolÄ™s darbastalis" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "NutolÄ™s darbastalis" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Uždelsimas" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "&Radijo laikrodis" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "Nepavyko pakeisti dydį." #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&Atnaujinti sÄ…rašą" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Darbalaukis" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Rodyti visus skaidinius" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Nu&statyti filtrÄ…" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "Nu&statyti filtrÄ…" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Nu&statyti filtrÄ…" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "VirtualÅ«s pseudonimai" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D spartinimas:" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "SidnÄ—jus" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "AutomatinÄ—" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Spalvos" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "Spalvos" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Darbalaukis" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D spartinimas:" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Praleistas\n" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "&Testas" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "Nepavykusios bylos" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "&IÅ¡trinti Windows" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "&IÅ¡trinti Windows" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "Windows" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "vietinis laikas" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "SidnÄ—jus" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "SidnÄ—jus" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Praleistas\n" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "&Testas" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Komanda:" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "VisiÅ¡kai &iÅ¡trinti Windows" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "VisiÅ¡kai &iÅ¡trinti Windows" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Radius" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "VisiÅ¡kai &iÅ¡trinti Windows" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "Radius" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "&Suspausti Windows" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "VisiÅ¡kai &iÅ¡trinti Windows" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "Radius" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "&Suspausti Windows" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "NÄ—ra apraÅ¡o" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind parametrai" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "&Testas" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Mountain" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Realaus laiko" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Praleistas\n" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Realaus laiko" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "Bylų &sistema" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "&Suspausti Windows" #: ../metadata/fade.xml.in.h:16 #, fuzzy msgid "Fullscreen Visual Bell" msgstr "Lytimasis ekranas" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows laisva (%1)" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "PridÄ—ti kontaktÄ…" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "PridÄ—ti kontaktÄ…" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 #, fuzzy msgid "Open a terminal" msgstr "Paleisti terminale" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "KomandinÄ—s eilutÄ—s nagrinÄ—jimo klaida." #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "KomandinÄ—s eilutÄ—s nagrinÄ—jimo klaida." #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "KomandinÄ—s eilutÄ—s nagrinÄ—jimo klaida." #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "&Suspausti Windows" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "&Suspausti Windows" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "&Suspausti Windows" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "&Suspausti Windows" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "Mountain" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "Ä® &apaÄiÄ…" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Nepavyko pakeisti dydį." #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "Ä® &apaÄiÄ…" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "Ä® &apaÄiÄ…" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "&IÅ¡trinti Windows" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "Paleidžiamas demonas." #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "&Suspausti Windows" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Paleidžiamas demonas." #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Tiltas" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Tiltas" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Tiltas" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Tiltas" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "&IÅ¡trinti Windows" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "&IÅ¡trinti Windows" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "&IÅ¡trinti Windows" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Paleidžiamas demonas." #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "TrukmÄ—" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "TrukmÄ—" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "TrukmÄ—" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "TrukmÄ—" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind parametrai" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windows" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Window Manager" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "VirtualÅ«s pseudonimai" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "VirtualÅ«s pseudonimai" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind parametrai" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind parametrai" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "&Darbo grupÄ—" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Nepavyko pakeisti dydį." #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "VirtualÅ«s pseudonimai" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Nepavyko pakeisti dydį." #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "VirtualÅ«s pseudonimai" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Spalvos" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Spalvos" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr " -- Inicializuoti" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr " -- Inicializuoti" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr " -- Inicializuoti" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr " -- Inicializuoti" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr " -- Inicializuoti" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Spalvos" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Nepavyko pakeisti dydį." #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "Nepavyko pakeisti dydį." #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Paleidžiamas demonas." #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Paleidžiamas demonas." #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Paleidžiamas demonas." #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Paleidžiamas demonas." #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Paleidžiamas demonas." #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "Realaus laiko" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "%1 rodyklÄ—" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "Spausdinimo įrenginys" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:19 #, fuzzy msgid "Rotate Flip Left" msgstr "Ä® deÅ¡inÄ™" #: ../metadata/rotate.xml.in.h:20 #, fuzzy msgid "Rotate Flip Right" msgstr "Ä® deÅ¡inÄ™" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "Ä® deÅ¡inÄ™" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "Ä® deÅ¡inÄ™" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Pasukti ekranÄ…" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Ä® &apaÄiÄ…" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D spartinimas:" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "&Testas" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "&Testas" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "&Testas" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "PradÄ—ti paieÅ¡kÄ…" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Didelis" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "Fonas" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Ä® &apaÄiÄ…" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Skeneris" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "vietinis laikas" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "vietinis laikas" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Ispanija" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Katalogas\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Video režimo pasirinkimas" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Programos" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Ekranas" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "KomandinÄ—s eilutÄ—s nagrinÄ—jimo klaida." #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Programos tvarka" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "AutomatinÄ—" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Veiksmo" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Piktogramos" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "&Suspausti Windows" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Darbalaukis" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "&IÅ¡trinti Windows" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "&IÅ¡trinti Windows" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "&IÅ¡trinti Windows" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Windows" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Windows" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "&IÅ¡trinti Windows" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Paleidžiamas demonas." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "&Suspausti Windows" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "vietinis laikas" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "vietinis laikas" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "PridÄ—ti plunksnÄ…" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "PridÄ—ti kontaktÄ…" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Uždelsimas" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "Pakeis&ti bÅ«senÄ…" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "Pakeis&ti bÅ«senÄ…" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "Pakeis&ti bÅ«senÄ…" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "Pakeis&ti bÅ«senÄ…" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Veiksmo" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "&IÅ¡trinti Windows" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "RaiÅ¡ka" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "&IÅ¡trinti Windows" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "Mažiausias &GUID" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "Mažiausias &GUID" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Ä® &apaÄiÄ…" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "TvarkyklÄ—" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "&Suspausti Windows" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Veiksmo" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Praleidžiamas %1" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Praleidžiamas %1" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "&IÅ¡trinti Windows" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Serverio rezoliucija" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Windows" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Komanda:" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Komanda '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "KomandinÄ—s eilutÄ—s nagrinÄ—jimo klaida." #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "KomandinÄ—s eilutÄ—s nagrinÄ—jimo klaida." #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filtras: " #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Darbalaukis" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "Darbalaukis" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Darbalaukis" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Praleistas\n" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "&Testas" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "Darbalaukis" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Praleistas\n" #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "VisiÅ¡kai &iÅ¡trinti Windows" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "&IÅ¡trinti Windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Page Down" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Ä® deÅ¡inÄ™" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Page Up" #, fuzzy #~ msgid "Plane down" #~ msgstr "&IÅ¡trinti Windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane right" #~ msgstr "Ä® deÅ¡inÄ™" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane up" #~ msgstr "Page Up" #, fuzzy #~ msgid "Toolbar" #~ msgstr "Ä®rankiai" #~ msgid "Menu" #~ msgstr "Meniu" #, fuzzy #~ msgid "Utility" #~ msgstr "Pagalbinis diskas..." #, fuzzy #~ msgid "Splash" #~ msgstr "splash=0" #, fuzzy #~ msgid "Dialog" #~ msgstr "KonfigÅ«ravimo dialogas" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Window Manager" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "Meniu" #, fuzzy #~ msgid "Tooltip" #~ msgstr "Ä®rankiai" #, fuzzy #~ msgid "Notification" #~ msgstr "PraneÅ¡imai" #, fuzzy #~ msgid "Dnd" #~ msgstr "End" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Lytimasis ekranas" #~ msgid "Unknown" #~ msgstr "Nežinoma" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "TrukmÄ—" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "VisiÅ¡kai &iÅ¡trinti Windows" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Radius" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Paleidžiamas demonas." #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D spartinimas:" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D spartinimas:" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "&Testas" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Rusijos Federacija" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Rusų" #, fuzzy #~ msgid "Line width for annotations (0.0-100.0)" #~ msgstr "Sužinokite daugiau pasinaudojÄ™ dokumentacija" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Windows" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&Suspausti Windows" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&Suspausti Windows" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Mažiausias &GUID" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "NutolÄ™s darbastalis" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Paleidžiamas demonas." #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Paleidžiamas demonas." #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D spartinimas:" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "&Testas" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "vietinis laikas" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "vietinis laikas" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "&IÅ¡trinti Windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Veiksmo" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Praleidžiamas %1" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Nu&statyti filtrÄ…" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Serverio rezoliucija" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows laisva (%1)" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows laisva (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Praleistas\n" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "&Testas" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Darbalaukis" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Paleidžiamas demonas." #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "Pasukti ekranÄ…" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Komanda:" #, fuzzy #~ msgid "Run command %d" #~ msgstr "Komanda:" #, fuzzy #~ msgid "Move Window Types" #~ msgstr "TeikÄ—jo tipas" #, fuzzy #~ msgid "Corners" #~ msgstr "Konverteriai" #, fuzzy #~ msgid "Show switcher" #~ msgstr "Rodyti pak&eitimus" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Diskelis" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Paleidžiamas demonas." #, fuzzy #~ msgid "Terminate" #~ msgstr "Terminalai" compiz-0.9.11+14.04.20140409/po/POTFILES.in0000644000015301777760000000211512321343002017664 0ustar pbusernogroup00000000000000gtk/gnome/compiz.desktop.in gtk/window-decorator/events.c gtk/window-decorator/forcequit.c gtk/window-decorator/gtk-window-decorator.c gtk/window-decorator/gwd.schemas.in gtk/gnome/50-compiz-navigation.xml.in gtk/gnome/50-compiz-windows.xml.in metadata/core.xml.in plugins/annotate/annotate.xml.in plugins/blur/blur.xml.in plugins/clone/clone.xml.in plugins/commands/commands.xml.in plugins/compiztoolbox/compiztoolbox.xml.in plugins/composite/composite.xml.in plugins/copytex/copytex.xml.in plugins/cube/cube.xml.in plugins/dbus/dbus.xml.in plugins/decor/decor.xml.in plugins/fade/fade.xml.in plugins/gnomecompat/gnomecompat.xml.in plugins/imgpng/imgpng.xml.in plugins/imgsvg/imgsvg.xml.in plugins/inotify/inotify.xml.in plugins/kde/kde.xml.in plugins/move/move.xml.in plugins/obs/obs.xml.in plugins/opengl/opengl.xml.in plugins/place/place.xml.in plugins/regex/regex.xml.in plugins/resize/resize.xml.in plugins/rotate/rotate.xml.in plugins/scale/scale.xml.in plugins/screenshot/screenshot.xml.in plugins/switcher/switcher.xml.in plugins/water/water.xml.in plugins/wobbly/wobbly.xml.in src/main.cpp compiz-0.9.11+14.04.20140409/po/cy.po0000644000015301777760000020163412321343002017071 0ustar pbusernogroup00000000000000# Welsh message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2003 SuSE Linux AG. # Kevin Donnelly , 2003. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2003-09-23 10:33+0200\n" "Last-Translator: Kevin Donnelly \n" "Language-Team: Welsh \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=5; plural=(n == 0 ? 0 : n == 1 ? 1 : n < 6 ? 2 : n == " "6 ? 3 : 4);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Windhoek" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Gwerth" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Windhoek" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Windhoek" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Hepgor\n" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Ymgychwyn" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Ymgychwyn" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Ymgychwyn" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Ymgychwyn" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Ymgychwyn" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Ymgychwyn" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Hepgor\n" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Cyfnod" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Cyfnod" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Hepgor\n" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Windhoek" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Cyfnod" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Windhoek" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "Lima" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Lima" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windhoek" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Ymgychwyn" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Gorchymyn '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Rhag&osod" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "Ymgychwyn trefnydd ffenestri rhagosod" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Disgiau Rhith" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Oedi" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "Cyfred&oli" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "&Profi" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Disgiau Rhith" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "Gweithred" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sydney" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Ymgychwyn" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "Gweithred" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Hepgor\n" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "&Profi" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "&Profi" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sydney" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Sydney" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Hepgor\n" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "&Profi" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Gorchymyn '%1'" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Windhoek" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "ffurfweddu inetd" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ffurfweddu inetd" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "&Profi" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Mountain" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "&Profi" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Hepgor\n" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "&Profi" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Windhoek" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "&Profi" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "Mountain" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "Windhoek" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "Windhoek" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Windhoek" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Cyfnod" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Cyfnod" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Cyfnod" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Cyfnod" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ffurfweddu inetd" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windhoek" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windhoek" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Windhoek" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Windhoek" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Disgiau Rhith" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "Windhoek" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Disgiau Rhith" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Disgiau Rhith" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ffurfweddu inetd" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Disgiau Rhith" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Disgiau Rhith" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Ymgychwyn" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Ymgychwyn" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Ymgychwyn" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Ymgychwyn" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Ymgychwyn" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "&Profi" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Ymgychwyn" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Ymgychwyn" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Gweithred" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "&Profi" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "&Profi" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "&Profi" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Ailddechrau &darganfod" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Ymgychwyn" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Gwerth" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Windhoek" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "Gwerth" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "&Profi" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Windhoek" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Sbaen" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Ymgychwyn" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Ymgychwyn" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Gweithred" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Gweithred" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "Gwerth" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "&Profi" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Oedi" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Gweithred" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Gweithred" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Sbaen" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Sbaen" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Windhoek" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Gorchymyn '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Gorchymyn '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "&Profi" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Hepgor\n" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "&Profi" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Hepgor\n" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Plane down" #~ msgstr "Windhoek" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Notification" #~ msgstr "Ffurweddiad" #~ msgid "Unknown" #~ msgstr "Anhysbys" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Cyfnod" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Gweithred" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Hepgor\n" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "&Profi" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Gweithred" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "&Profi" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Gwerth" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "&Profi" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Gweithred" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Sbaen" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Hepgor\n" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "&Profi" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Gorchymyn '%1'" #, fuzzy #~ msgid "Corners" #~ msgstr "Azores" compiz-0.9.11+14.04.20140409/po/sk.po0000644000015301777760000025565412321343002017106 0ustar pbusernogroup00000000000000# Slovak translation of compiz # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the compiz package. # Ivan Masár , 2008. # msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2008-05-17 10:28+0200\n" "Last-Translator: Brusnica P \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Pracovná plocha" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Správa okien" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Žiadna" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Tieň" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "MaximalizovaÅ¥" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "MaximalizovaÅ¥ okno vodorovne" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "MaximalizovaÅ¥ okno zvisle" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimalizované" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automaticky do popredia" #: ../gtk/gnome/compiz-window-manager.c:433 #, fuzzy msgid "Lower" msgstr "Nízke" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menu Okna" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Akcia, ktorá sa vykoná pri otáÄaní kolieskom myÅ¡i nad titulkom okna." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Typ rozostrenia" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "PriehľadnosÅ¥ aktívneho okna témy metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Tieň aktívneho okna témy metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "PriehľadnosÅ¥ témy metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Tieň témy metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "PriehľadnosÅ¥ pre aktívne okná s dekoráciami témy metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "PriehľadnosÅ¥ s dekoráciami témy metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "VytieňovaÅ¥ aktívne okná s dekoráciou témy metacity z nepriehľadnej do " "priehľadnej." #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "VytieňovaÅ¥ okná s dekoráciou témy metacity z nepriehľadnej do priehľadnej." #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Akcia pri rolovaní nad titulkom okna" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Typ rozostrenia použitej na dekoráciu okna" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "PoužiÅ¥ tému metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "PoužiÅ¥ tému metacity pri vykresľovaní dekorácií okna" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "ZatvoriÅ¥ okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "ZruÅ¡iÅ¥ maximalizáciu okna" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "MaximalizovaÅ¥ okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "MinimalizovaÅ¥ Okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "VykonaÅ¥ vyššie uvedené" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "PrilepiÅ¥" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "NetieňovaÅ¥" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "OdvolaÅ¥ vyššie uvedené" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "OdlepiÅ¥" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Okno „%s“ neodpovedá." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "Vynútené ukonÄenie tejto aplikácie spôsobí stratu neuložených zmien." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_VynútiÅ¥ ukonÄenie" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Poznámka" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Farba výplne poznámky" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Å týl Å¥ahu poznám" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Zásuvný modul poznámok" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "VyÄistiÅ¥" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "KresliÅ¥" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "VykresliÅ¥ použitím nástroja" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Farba výplne poznámok" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "ZaÄaÅ¥" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "ZaÄaÅ¥ kreslenie poznámky" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "ZaÄaÅ¥ mazanie poznámky" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "ZaÄaÅ¥ mazanie" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Šírka Äiary" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Šírka riadka pre komentáre" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Å týl Å¥ahu poznámok" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Šírka Å¥ahu" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Šírka Å¥ahu poznámok" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "Filter:" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Rozmaznie alfa" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alfa rozostrenie okien" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filter rozostrenia" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Oklúzia rozostrenia" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "SýtosÅ¥ rozostrenia" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "RýchlosÅ¥ rozostrenia" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "RozostrovaÅ¥ okná" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Rozmazanie za priehľadnými ÄasÅ¥ami okien" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "SýtosÅ¥ rozostrenia" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "RozostrovaÅ¥ okná" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "RozostrovaÅ¥ okná, ktoré nie sú aktívne" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "ZakázaÅ¥ rozmazanie Äastí obrazovky, ktoré sú zakryté inými oknami." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Metóda filtra použitá pre rozmazanie" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "RozmazaÅ¥ aktívne" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "RozmazaÅ¥ aktívne okná" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussovské rozostrenie" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Polomer gaussovského rozostrenia" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Sila gaussovského rozostrenia" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Polomer gaussovského rozostrenia" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Sila gausovského rozostrenia" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Nezávislé stiahnutia textúr" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmapy" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Úroveň detailu mipmáp" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Úroveň podrobností mipmáp" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulz" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efekt pulzu" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "PoužiÅ¥ dostupné jednotky textúr na vykonanie Äo najväÄÅ¡ieho poÄtu " "nezávislých stiahnutí textúr" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "RýchlosÅ¥ rozmazania okna" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Okná, ktoré majú byÅ¥ ovplyvnené rozmazaním" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Okná, ktoré by mali Å¡tandardne použiÅ¥ alfa rozmazanie" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "KlonovaÅ¥ výstup" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "ZaÄaÅ¥ klonovaÅ¥ výber" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Obsluha klonovania výstupu" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command0" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command0" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Príkazový riadok 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Príkazový riadok 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Príkazový riadok 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Príkazový riadok 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Príkazový riadok 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Príkazový riadok 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Príkazový riadok 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Príkazový riadok 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Príkazový riadok 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Príkazový riadok 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Príkazový riadok 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Príkazový riadok 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Príkaz" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "SpustiÅ¥ príkaz 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "SpustiÅ¥ príkaz 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "SpustiÅ¥ príkaz 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "SpustiÅ¥ príkaz 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "SpustiÅ¥ príkaz 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "SpustiÅ¥ príkaz 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "SpustiÅ¥ príkaz 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "SpustiÅ¥ príkaz 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "SpustiÅ¥ príkaz 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "SpustiÅ¥ príkaz 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "SpustiÅ¥ príkaz 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "SpustiÅ¥ príkaz 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktívne zásuvné moduly" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "PovoliÅ¥ vykresľovanie celoobrazovkových okien bez presmerovania do " "mimoobrazovkových pixmapov" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Akustický zvonÄek" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Akustické systémové pípnutie" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automaticky do popredia" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Oneskorenie automatického presunu do popredia" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatická detekcia výstupných zariadení" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatická detekcia obnovovacej frekvencie" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "NajlepÅ¡ie" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ZameraÅ¥ kliknutím" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Kliknutím na okno presunúť zameranie na okno" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "ZatvoriÅ¥ aktívne okno" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Východzia ikona" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Východzí obrázok ikony okna" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Kocka plochy" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "DetekovaÅ¥ výstupy" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Deteguj Obnovovaciu Frekvenciu" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Interval, poÄas ktorého musí ukazovateľ zostaÅ¥ na okraji obrazovky, než sa " "vykoná operácia." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Oneskorenie operácie na okraji" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rýchlo" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "PredchádzaÅ¥ ukradnutiu aktivity" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "PredchádzaÅ¥ zameraniu okien" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "PredchádzaÅ¥ zameraniu okien" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Vynútenie vykreslenia nezávislého výstupu" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "VÅ¡eobecné nastavenia" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "VÅ¡eobecné nastavenia Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "V poriadku" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "SkryÅ¥ okná neprítomné v liÅ¡te úloh" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "SkryÅ¥ vÅ¡etky okná a zobraziÅ¥ pracovnú plochu" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "SkryÅ¥ okná neprítomné v liÅ¡te úloh pri vstupe do režimu zobrazenia pracovnej " "plochy" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Vysoké" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Vodorovná virtuálna veľkosÅ¥" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Ak sa dá, použiÅ¥ kompresiu textúr, ktoré boli konvertované z obrázkov." #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Pri maximalizovaní ignorovaÅ¥ tipy" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Pri maximalizovaní okna ignorovaÅ¥ veľkosÅ¥ nárastu a vzhľad tipov" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Interval pred presunutím vybraných okien do popredia" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Interval medzi odosielaním pingu" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Úroveň prevencie pred ukradnutím aktivity okna" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Osvetlenie" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Zoznam práve aktívnych modulov" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Zoznam reÅ¥azcov popisujúcich výstupné zariadenia" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Nízke" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Presunúť okno do pozadia" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Presunúť okno do pozadia" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "MaximalizovaÅ¥ okno vodorovne" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "MaximalizovaÅ¥ okno zvisle" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "MaximalizovaÅ¥ aktívne okno" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "MaximalizovaÅ¥ aktívne okno vodorovne" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "MaximalizovaÅ¥ aktívne okno zvisle" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "MinimalizovaÅ¥ aktívne okno" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normálny" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "PoÄet Pracovných plôch" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "PoÄet virtuálnych pracovných plôch" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Vypnuté" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "VykonávaÅ¥ aktualizácie obrazovky poÄas intervalu vertikálneho zatemnenia" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Výstupy" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Obsluha prekrývajúceho sa výstupu" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Vykresli každý výstup zariadenia nezávisle aj keÄ sa výstupy zariadení " "prekrývajú" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Oneskorenie pingu" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "UprednostniÅ¥ väÄší výstup" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "UprednostniÅ¥ menší výstup" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Kliknutím daÅ¥ do popredia" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Presunúť okno do popredia" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Prepnúť vybrané okná do popredia po uplynutí intervalu" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Presunúť okno dopredu nad ostatné okná" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Presunúť okno do popredia po kliknutí" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Obnovovacia frekvencia" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Násobiteľ vodorovnej virtuálnej veľkosti obrazovky" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Násobiteľ zvislej virtuálnej veľkosti obrazovky" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "ZobraziÅ¥ Plochu" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Pomalé animácie" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Inteligentný režim" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "SynchronizovaÅ¥ pri VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Kompersia textúr" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filter textúr" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtrovanie textúr" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Frekvencia prekresľovania obrazovky v Hz" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Prepnúť maximalizáciu okna" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Prepnúť vodorovnú maximalizáciu okna" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Prepnúť zvislú maximalizáciu okna" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Prepnúť tieňovanie okna" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Prepnúť maximalizáciu aktívneho okna" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Prepnúť horizontálnu maximalizáciu aktívneho okna" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Prepnúť vertikálnu maximalizáciu aktívneho okna" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Prepnúť tieňovanie aktívneho okna" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Prepnúť použitie pomalých animácií" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "ZruÅ¡iÅ¥ maximalizáciu aktívneho okna" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "NepresmerovaÅ¥ okná v celoobrazovkovom režime" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "PoužiÅ¥ rozptýlené svetlo pri transformácii obrazovky" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Vertikálna Virtuálna VeľkosÅ¥" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Veľmi vysoké" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Ktoré z prekrývajúcich sa výstupných zariadení sa má uprednostniÅ¥" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Klávesová skratka tlaÄidla hlavnej ponuky okna" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Klávesová skratka hlavnej ponuky okna" # workflow: "3D Beschleunigung aktivieren" # -ke- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Akcelerácia" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "PrispôsobiÅ¥ obrázok" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "PrispôsobiÅ¥ vrchný obrázok otáÄaniu" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "PrejsÅ¥ na nasledujúcu snímku" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "AnimovaÅ¥ Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "AnimovaÅ¥ skydome pri rotácii kocky" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatický" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Farba vrchnej a spodnej strany kocky" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Farba, ktorá sa použije na dolnú ÄasÅ¥ gradientu skydome" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Farba, ktorá sa použije na hornú ÄasÅ¥ gradientu skydome" # KM #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Farba kocky" # KM #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Farba kocky" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Kocka plochy" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Zrýchlenie zloženia" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "RýchlosÅ¥ zloženia" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "ÄŒasový skok zloženia" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Ak je to možné, vytváraÅ¥ pre vysoko kvalitné modelovanie mipmapy" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "ChoÄ späť na predchádzajúci snímok" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Obrázkové súbory" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Obrázok, ktorý sa použije ako textúra pre skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Aktivuje priehľadnosÅ¥ kocky iba v prípade, ak je rotácia vykonaná pomocou " "myÅ¡i." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Vnútri kocky" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Vnútri kocky" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Zoznam PNG a SVG súborov, ktoré môžu byÅ¥ vykreslené na vrchu kocky" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Viacnásobný výstupný režim" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Viacnásobné kocky" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "ÄŽalÅ¡ia snímka" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Jedna veľká kocka" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "NepriehľadnosÅ¥ poÄas otáÄania" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "NepriehľadnosÅ¥ v prípade neotáÄania" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "NepriehľadnosÅ¥ plochy okna poÄas otáÄania." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "NepriehľadnosÅ¥ plochy okna poÄas neotáÄania." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "UmiestniÅ¥ okná na kocke" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Predchádzajúca snímka" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "VykresliÅ¥ Skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "ZmeniÅ¥ veľkosÅ¥ obrázka" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "ZmeniÅ¥ mierku obrázka aby pokrýval vrch kocky" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "ZvoliÅ¥ zobrazenie kocky v prípade, že budú použité viacnásobné výstupné " "zariadenia." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "KoneÄná farba gradientu Skydome" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "PoÄiatoÄná farba gradientu Skydome" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Obrázok Skydome" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "RýchlosÅ¥" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Krok" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "PriehľadnosÅ¥ iba v prípade otáÄania použitím myÅ¡i" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "RoztvoriÅ¥" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "RoztvoriÅ¥ kocku" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Backend pre riadenie Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "UmožniÅ¥ tvorbu mipmáp pre dekoraÄné textúry" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Príkaz" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekorované okná" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Príkazový riadok programu pre dekorácie, ktorý sa vykoná, pokiaľ nebude " "spustený žiadny program pre dekorácie" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Posun X vrhaného tieňa" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Posun Y vrhaného tieňa" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Farba vrhaného tieňa" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "NepriehľadnosÅ¥ vrhaného tieňa" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Polomer vrhaného tieňa" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Farba tieňa" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Posun tieňa X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Posun tieňa Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Krytie tieňa" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Polomer tieňa" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Tieňované okná" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Dekorácie okna" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Dekorácie okna" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Okná, ktoré by mali byÅ¥ dekorované" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Okná, ktoré by mali maÅ¥ tieň" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "RýchlosÅ¥ otáÄania" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Obmedzenie Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Normálna veľkosÅ¥ okien" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Doba stmavnutia" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "StmievaÅ¥ pri minimalizovaní/otvorení/zatvorení" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "RýchlosÅ¥ stmievania" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Doba stmavnutia" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Efekt stmievania pri minimalizovaní/otvorení/zatvorení okna" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efekt stmievania pri systémovom pípnutí" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "Rozsvecovanie okien pri mapovaní a stmievania pri odmapovaní" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Stmievanie okien" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Stmievanie okien" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Celoobrazovkový vizuálny zvonÄek" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Celoobrazovkový efekt blednutia pri systémovom pípnutí" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Vizuálny zvonÄek" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "RýchlosÅ¥ stmievania okna" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Okná, ktoré majú meniÅ¥ veľkosÅ¥ v režime zmeny mierky" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Okná, ktoré by mali blednúť" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Bod pripojenia" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Bod pripojenia" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Používateľský súborový systém" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Používateľský súborový systém" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Backend pre riadenie GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Podpora hlavného napojenia na GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "OtvoriÅ¥ terminál" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "SpustiÅ¥ Dialóg" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Príkaz pre terminál" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Príkaz pre snímanie obrazovky" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "ZobraziÅ¥ Hlavnú ponuku" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "ZobraziÅ¥ dialóg spustenia aplikácie" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "ZobraziÅ¥ hlavné menu" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "ZosnímaÅ¥ obrazovku" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "ZosnímaÅ¥ okno" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Príkaz pre terminál" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Príkazový na zosnímania okna" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Pozadie ini súboru" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Modul upozornenia zmeny súboru" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Backend pre riadenie Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efekt pri minimalizovaní" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "MinimalizovaÅ¥ okná" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "MinimalizovaÅ¥ rýchlosÅ¥" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "MinimalizovaÅ¥ Äasový krok" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "StálosÅ¥ tieňa" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "StálosÅ¥ tieňa" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "TransformovaÅ¥ okná pri ich minimalizovaní a spätnom obnovení" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Okná, ktoré by mali byÅ¥ transformované pri minimalizovaní" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Obmedzenie Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "ObmedziÅ¥ súradnicu Y na priestor pracovnej plochy" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "AktualizovaÅ¥ pozíciu okna až po dokonÄení presunu" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "ZahájiÅ¥ presun okna" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Lenivé presúvanie" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Presunúť okno" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Presunúť okno" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "NepriehľadnosÅ¥" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Úroveň nepriehľadnosti presúvaných okien" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "OdtrhávaÅ¥ a automaticky obnoviÅ¥ maximalizované okná poÄas Å¥ahania" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "OdtrhávaÅ¥ maximalizované okná" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "ZaÄaÅ¥ pohyb okna" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Jas" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Jas" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Jas" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Jas" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "ZnížiÅ¥ nepriehľadnosÅ¥" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "ZvýšiÅ¥ nepriehľadnosÅ¥" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Krok zmeny nepriehľadnosti" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Krok zmeny nepriehľadnosti" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Krok nepriehľadnosti" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Úroveň nepriehľadnosti presúvaných okien" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "NepriehľadnosÅ¥ poÄas otáÄania" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "SýtosÅ¥" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "SýtosÅ¥" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "SýtosÅ¥" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "SýtosÅ¥" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Dekorácie okna" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Hodnoty nepriehľadnosti okna" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Mapované okná" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Okná, ktoré by mali byÅ¥ Å¡tandardne umiestnené" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Okná, ktoré by mali byÅ¥ implicitne priehľadné" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Okná, ktoré by mali byÅ¥ Å¡tandardne umiestnené" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmus použitý pre rozmiestnenie okna" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Kaskáda" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Vystrednené" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Správa okien" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Vynútené umiestnenie okien" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Vodorovné pozície pohľadov" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "RozmiestniÅ¥ okná" #: ../metadata/place.xml.in.h:12 #, fuzzy msgid "Place across all outputs" msgstr "UprednostniÅ¥ menší výstup" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "UmiestniÅ¥ mapované okná na zodpovedajúce pozície" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Spôsob rozmiestnenia" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Umiestnené okná" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Náhodné" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "OznaÄuje ako by sa malo správaÅ¥ umiestňovanie okien ak je oznaÄených viacero " "výstupov" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Inteligentné" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "PoužiÅ¥ aktívne výstupné zariadenie" #: ../metadata/place.xml.in.h:20 #, fuzzy msgid "Use output device of focussed window" msgstr "PoužiÅ¥ výstupné zariadenie s ukazovateľom" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "PoužiÅ¥ výstupné zariadenie s ukazovateľom" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Zvislé pozície pohľadov" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Okná umiestnené v pohľadoch" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Núdzové rieÅ¡enia umiestnenia okna" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Okná, ktoré by mali byÅ¥ Å¡tandardne umiestnené" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Okná, ktoré by mali byÅ¥ Å¡tandardne umiestnené na konkrétnu plochu" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Okná ktoré by mali byÅ¥ nútene umiestnené aj keÄ by sa okenný manažér mal " "vyhnúť takémuto umiestneniu." #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Dekorácie okna" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Núdzové rieÅ¡enia" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Pozície X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Pozície plochy na osi X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Hodnoty pozíce na osi X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Pozície Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Pozície plochy na osi Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Hodnoty pozíce na osi Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr " NaÄítanie PNG obrázkov" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Vyhodnocovanie regulárnych výrazov" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Zodpovedajúce regulárne výrazy okna" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Farba ohraniÄenia" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Farba okraja, ktorý sa použije pri režimoch obrysov a zmeny veľkosti " "obdĺžnikom" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Å tandardný režim zmeny veľkosti" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Å tandardný režim použitý pre zmenu veľkosti okna" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Farba výplne" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Farba výplne použitá pre pravouhlú zmenu veľkosti" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "ZaÄaÅ¥ normálnu zmenu veľkosti okna" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "ZaÄaÅ¥ obrysovú zmenu veľkosti okna" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "ZaÄaÅ¥ zmenu veľkosti pravouhlého okna" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "ZaÄaÅ¥ zmenu veľkosti okna roztiahnutím" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "ZaÄaÅ¥ zmenu veľkosti okna" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Normálna veľkosÅ¥ okien" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Obrys" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Obrysová zmena veľkosti okien" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Obdĺžnik" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Pravouhlá zmena veľkosti okien" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "ZmeniÅ¥ veľkosÅ¥ okna" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "ZmeniÅ¥ veľkosÅ¥ okna" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "ZaÄaÅ¥ zmenu veľkosti okna" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "ZaÄaÅ¥ zmenu veľkosti okna roztiahnutím" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "ZaÄaÅ¥ normálnu zmenu veľkosti okna" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "ZaÄaÅ¥ zmenu veľkosti okna s obrysom" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "ZaÄaÅ¥ zmenu veľkosti okna obdĺžnikom" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Roztiahnutie" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Zmena veľkosti okien roztiahnutím" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Okná, pre ktoré bude použitá normálna zmena veľkosti" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Okná, pre ktoré bude použitá zmena veľkosti s efektom obrysu" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Okná, pre ktoré bude použitá zmena veľkosti s efektom obdĺžnika" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Okná, pre ktoré bude použitá zmena veľkosti s efektom roztiahnutia" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD pri prepínaní na hrane" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Pohyb pri prepínaní na hrane" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Ukazovateľ pri prepínaní na hrane" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Doba preklopenia" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Prepnúť na pohľad vľavo a preniesÅ¥ ukazovateľ" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "Prepnúť na Äalší pohľad pri Å¥ahaní okna na okraj obrazovky" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "Prepnúť na Äalší pohľad pri presunutí ukazovateľa na okraj obrazovky" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Prepnúť na Äalší pohľad pri presunutí okna na okraj obrazovky" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Prepnúť na pohľad vpravo a preniesÅ¥ ukazovateľ" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "PrevrátiÅ¥ os Y pre pohyb ukazateľa" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "InvertovaÅ¥ os Y ukazovateľa" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "CitlivosÅ¥ ukazateľa" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Aktivácia pri otáÄaní" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Pri otáÄaní prenášaÅ¥ okná do popredia" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "OtáÄaÅ¥ kockou" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "OtoÄiÅ¥ preklopením vľavo" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "OtoÄiÅ¥ preklopením vpravo" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "OtoÄiÅ¥ vľavo" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "OtoÄiÅ¥ vľavo s oknom" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "OtoÄiÅ¥ vpravo" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "OtoÄiÅ¥ vpravo s oknom" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "OtoÄiÅ¥ na" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "OtoÄiÅ¥ na stranu 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "OtoÄiÅ¥ na stranu 1 s oknom" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "OtoÄiÅ¥ na stranu 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "OtoÄiÅ¥ na stranu 10 s oknom" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "OtoÄiÅ¥ na stranu 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "OtoÄiÅ¥ na stranu 11 s oknom" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "OtoÄiÅ¥ na stranu 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "OtoÄiÅ¥ na stranu 12 s oknom" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "OtoÄiÅ¥ na stranu 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "OtoÄiÅ¥ na stranu 2 s oknom" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "OtoÄiÅ¥ na stranu 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "OtoÄiÅ¥ na stranu 3 s oknom" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "OtoÄiÅ¥ na stranu 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "OtoÄiÅ¥ na stranu 4 s oknom" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "OtoÄiÅ¥ na stranu 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "OtoÄiÅ¥ na stranu 5 s oknom" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "OtoÄiÅ¥ na stranu 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "OtoÄiÅ¥ na stranu 6 s oknom" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "OtoÄiÅ¥ na stranu 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "OtoÄiÅ¥ na stranu 7 s oknom" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "OtoÄiÅ¥ na stranu 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "OtoÄiÅ¥ na stranu 8 s oknom" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "OtoÄiÅ¥ na stranu 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "OtoÄiÅ¥ na stranu 9 s oknom" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "OtáÄaÅ¥ kockou" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "OtoÄiÅ¥ kocku pracovnej plochy" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "OtoÄiÅ¥ vľavo" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "OtoÄiÅ¥ vľavo a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "OtoÄiÅ¥ vpravo" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "OtoÄiÅ¥ vpravo a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "OtoÄiÅ¥ na stranu 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "OtoÄiÅ¥ na stranu 1 s oknom" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "OtoÄiÅ¥ na stranu 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "OtoÄiÅ¥ na stranu 1 a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "OtoÄiÅ¥ na stranu 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "OtoÄiÅ¥ na stranu 10 a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "OtoÄiÅ¥ na stranu 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "OtoÄiÅ¥ na stranu 11 a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "OtoÄiÅ¥ na stranu 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "OtoÄiÅ¥ na stranu 12 a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "OtoÄiÅ¥ na stranu 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "OtoÄiÅ¥ na stranu 2 a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "OtoÄiÅ¥ na stranu 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "OtoÄiÅ¥ na stranu 3 a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "OtoÄiÅ¥ na stranu 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "OtoÄiÅ¥ na stranu 4 a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "OtoÄiÅ¥ na stranu 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "OtoÄiÅ¥ na stranu 5 a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "OtoÄiÅ¥ na stranu 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "OtoÄiÅ¥ na stranu 6 a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "OtoÄiÅ¥ na stranu 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "OtoÄiÅ¥ na stranu 7 a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "OtoÄiÅ¥ na stranu 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "OtoÄiÅ¥ na stranu 8 a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "OtoÄiÅ¥ na stranu 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "OtoÄiÅ¥ na stranu 9 a vziaÅ¥ aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "OtoÄiÅ¥ na zorné pole" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "OtoÄiÅ¥ okno" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "OtoÄiÅ¥ s oknom" # workflow: "3D Beschleunigung aktivieren" # -ke- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Akcelerácia pri otáÄaní" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "RýchlosÅ¥ otáÄania" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "ÄŒasový krok otáÄania" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "RýchlosÅ¥ otáÄania" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "CitlivosÅ¥ pohybu ukazateľa" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "PrichytiÅ¥ otáÄajúcu sa kocku za dolnú stranu" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "PrichytiÅ¥ otáÄajúcu sa kocku za hornú stranu" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "PrichytiÅ¥ k dolnej strane" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "PrichytiÅ¥ k hornej strane" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "ZaÄaÅ¥ otáÄanie" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "ÄŒasový limit pred preklopením zorného poľa" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Priblíženie" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Miera nepriehľadnosti v percentách" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Veľký" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "ZobraziÅ¥ pracovnú plochu kliknutím na plochu" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "StmaviÅ¥ pozadie" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "StmaviÅ¥ pozadie pri vykreslovaní okien" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblém" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "VstúpiÅ¥ do režimu ZobraziÅ¥ plochu, keÄ sa na plochu klikne poÄas zmeny mierky" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ÄŒas vznášania" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "ZaÄaÅ¥ výber okna" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "ZaÄaÅ¥ výber okna pre vÅ¡etky okná" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "ZaÄaÅ¥ výber okna pre skupinu okien" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "SpustiÅ¥ vyberanie okien na Å¡tandardnom výstupe" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "RozložiÅ¥ a zaÄaÅ¥ transformáciu vÅ¡etkých okien" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "RozložiÅ¥ a zaÄaÅ¥ transformáciu skupiny okien" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Rozmiestnenie a zaÄiatok transformácie okien" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Rozmiestnenie a zaÄiatok transformácie okien na aktuálnom výstupe" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Na vÅ¡etkých výstupných zariadeniach" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Na aktuálnom výstupnom zariadení" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "PrekladaÅ¥ ikonou" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Pri zmene veľkosti okien prekladaÅ¥ okná ikonou" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Zmena mierky" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Zmena mierky okna" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "RýchlosÅ¥ zmeny mierky" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "ÄŒasový krok zmeny mierky" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "MeniÅ¥ mierku okien" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "ÄŒi sa mení veľkosÅ¥ okien pri použití viacerých výstupných zariadení." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Medzera medzi oknami" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "VzdialenosÅ¥" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "ÄŒas (v ms) pred ukonÄením režimu zmeny mierky pri kurzore nad oknom" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Okná, ktoré majú meniÅ¥ veľkosÅ¥ v režime zmeny mierky" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Automaticky otvoriÅ¥ snímku v tejto aplikácii" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "PrieÄinok" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "ZosnímaÅ¥ obrazovku" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "SpustiÅ¥ aplikáciu" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "VložiÅ¥ snímky obrazovky do tohto prieÄinka" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Snímka obrazovky" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Modul snímky obrazovky" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "SVG" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "NaÄítanie SVG obrázkov" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Hodnota jasu v percentách" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Hodnota sýtosti v percentách" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "PrepínaÄ aplikácií" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automatické otáÄanie" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "PreniesÅ¥ do popredia" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "PreniesÅ¥ vybrané okno do popredia" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "VzdialenosÅ¥, na ktorú by sa mala plocha oddialiÅ¥ poÄas prepínania okien" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikona" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimalizované" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Nasledujúca výplň" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Nasledujúce okno" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Nasledujúce okno (vÅ¡etky okná)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Nasledujúce okno (žiadne vyskakovacie okno)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "ZobraziÅ¥ prepínaÄ ak nie je viditeľný a vybraÅ¥ ÄalÅ¡ie okno" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "ZobraziÅ¥ prepínaÄ ak nie je viditeľný a vybraÅ¥ ÄalÅ¡ie okno spomedzi vÅ¡etkých " "okien" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "ZobraziÅ¥ prepínaÄ ak nie je viditeľný a vybraÅ¥ predchádzajúce okno" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "ZobraziÅ¥ prepínaÄ ak nie je viditeľný a vybraÅ¥ predchádzajúce okno zo " "vÅ¡etkých okien" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Predchádzajúca výplň" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Predchádzajúce okno" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Predchádzajúce okno (vÅ¡etky okná)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Predchádzajúce okno (žiadne vyskakovacie okno)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "OtoÄiÅ¥ na vybrané okno pri prepínaní" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "OznaÄ nasledujúci typ výplne okna" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "VybraÅ¥ ÄalÅ¡ie okno bez ukázania vyskakovacieho okna" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "VybraÅ¥ predchádzajúci typ výplne okna" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "VybraÅ¥ predchádzajúce okno bez ukázania vyskakovacieho okna" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "UkázaÅ¥ ikonu vedľa náhľadu" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "ZobraziÅ¥ minimalizované okná" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "RýchlosÅ¥ prepínaÄa" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "ÄŒasový krok prepínaÄa" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Okná prepínaÄa" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Okná, ktoré budú zobrazené v prepínaÄi" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Poskytnúť podporu farebného priestoru YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Prehrávanie videa" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Prehrávanie videa" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Farebný priestor YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "PridaÅ¥ Äiaru" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "PridaÅ¥ bod" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Do rôznych akcií plochy pridávaÅ¥ efekt vody" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Oneskorenie (v ms) medzi jednotlivými kvapkami" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "PovoliÅ¥ vodné efekty ukazateľa" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "ÄŒiara" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Mierka posunutia" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Bod" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Oneskorenie dažÄa" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Vlna v nadpise" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Prepnúť dážÄ" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Prepnúť efekt dažÄa" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Prepnúť stieraÄ" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Prepnúť efekt stieraÄa" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efekt vody" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Mierka posunutia vody" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efekt vlny v nadpise okna" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efekt zamerania" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efekt pri zameraní okna" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "ZameraÅ¥ okná" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Trenie" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "UchopiÅ¥ okná" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Rozlíšenie mriežky" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Obrátené prichytávanie okien" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "RozochvieÅ¥ okno" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efekt mapovania" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Efekt mapovania okna" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Mapované okná" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efekt maximalizácie" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Minimálna veľkosÅ¥ mriežky" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimálna veľkosÅ¥ vrcholu mriežky" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Presunúť okná" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Chvenie" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Obrátené prichytávanie" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "PrichytiÅ¥ okná" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Trenie pružiny" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Pružina K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "KonÅ¡tanta pružiny" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Prepnúť prichytávanie okien" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "PoužiÅ¥ na efekt chvenia pružinový model" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Rozlíšenie vrcholu mriežky" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Okná, ktoré by sa mali chvieÅ¥, keÄ sú aktivované" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Okná, ktoré by sa mali chvieÅ¥, keÄ sú zachytené" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Okná, ktoré by sa mali chvieÅ¥, keÄ sú mapované" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Okná, ktoré sa budú triasÅ¥ pri presune" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efekt trasúcich sa okien pri maximalizácii a späť" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Trasúce sa okná" #~ msgid "Command line 0" #~ msgstr "Príkazový riadok 0" #~ msgid "Run command 0" #~ msgstr "SpustiÅ¥ príkaz 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Príkaz pre snímanie obrazovky" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Príkaz pre snímanie obrazovky" #~ msgid "Filter Linear" #~ msgstr "Lineárny filter" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Pri priblížení použiÅ¥ lineárny filter" #~ msgid "Zoom Desktop" #~ msgstr "PriblížiÅ¥ plochu" #~ msgid "Zoom In" #~ msgstr "PriblížiÅ¥" #~ msgid "Zoom Out" #~ msgstr "OddialiÅ¥" #~ msgid "Zoom Pan" #~ msgstr "Posúvanie priblíženia" #~ msgid "Zoom Speed" #~ msgstr "RýchlosÅ¥ priblíženia" #~ msgid "Zoom Timestep" #~ msgstr "ÄŒasový krok priblíženia" #~ msgid "Zoom and pan desktop cube" #~ msgstr "PriblížiÅ¥ a posúvaÅ¥ kocku plochy" #~ msgid "Zoom factor" #~ msgstr "Pomer zväÄÅ¡enia" #~ msgid "Zoom pan" #~ msgstr "Posúvanie priblíženia" #~ msgid "Decrease window opacity" #~ msgstr "ZnížiÅ¥ nepriehľadnosÅ¥ okna" #~ msgid "Increase window opacity" #~ msgstr "ZvýšiÅ¥ nepriehľadnosÅ¥ okna" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Hodnoty nepriehľadnosti pre okná, ktoré by mali byÅ¥ implicitne priehľadné" #~ msgid "Opacity windows" #~ msgstr "Priehľadné okná" #~ msgid "Background Images" #~ msgstr "Obrázky pozadia" #~ msgid "Background images" #~ msgstr "Obrázky pozadia" #~ msgid "Place windows on a plane" #~ msgstr "UmiestniÅ¥ okná na rovinu" #~ msgid "Plane Down" #~ msgstr "Rovina dole" #~ msgid "Plane Left" #~ msgstr "Rovina vľavo" #~ msgid "Plane Right" #~ msgstr "Rovina vpravo" #~ msgid "Plane To Face 1" #~ msgstr "Rovina na stranu 1" #~ msgid "Plane To Face 10" #~ msgstr "Rovina na stranu 10" #~ msgid "Plane To Face 11" #~ msgstr "Rovina na stranu 11" #~ msgid "Plane To Face 12" #~ msgstr "Rovina na stranu 12" #~ msgid "Plane To Face 2" #~ msgstr "Rovina na stranu 2" #~ msgid "Plane To Face 3" #~ msgstr "Rovina na stranu 3" #~ msgid "Plane To Face 4" #~ msgstr "Rovina na stranu 4" #~ msgid "Plane To Face 5" #~ msgstr "Rovina na stranu 5" #~ msgid "Plane To Face 6" #~ msgstr "Rovina na stranu 6" #~ msgid "Plane To Face 7" #~ msgstr "Rovina na stranu 7" #~ msgid "Plane To Face 8" #~ msgstr "Rovina na stranu 8" #~ msgid "Plane To Face 9" #~ msgstr "Rovina na stranu 9" #~ msgid "Plane Up" #~ msgstr "Rovina hore" #~ msgid "Plane down" #~ msgstr "Rovina dole" #~ msgid "Plane left" #~ msgstr "Rovina vľavo" #~ msgid "Plane right" #~ msgstr "Rovina vpravo" #~ msgid "Plane to face 1" #~ msgstr "Rovina na stranu 1" #~ msgid "Plane to face 10" #~ msgstr "Rovina na stranu 10" #~ msgid "Plane to face 11" #~ msgstr "Rovina na stranu 11" #~ msgid "Plane to face 12" #~ msgstr "Rovina na stranu 12" #~ msgid "Plane to face 2" #~ msgstr "Rovina na stranu 2" #~ msgid "Plane to face 3" #~ msgstr "Rovina na stranu 3" #~ msgid "Plane to face 4" #~ msgstr "Rovina na stranu 4" #~ msgid "Plane to face 5" #~ msgstr "Rovina na stranu 5" #~ msgid "Plane to face 6" #~ msgstr "Rovina na stranu 6" #~ msgid "Plane to face 7" #~ msgstr "Rovina na stranu 7" #~ msgid "Plane to face 8" #~ msgstr "Rovina na stranu 8" #~ msgid "Plane to face 9" #~ msgstr "Rovina na stranu 9" #~ msgid "Plane up" #~ msgstr "Rovina hore" #~ msgid "Cursor size" #~ msgstr "VeľkosÅ¥ kurzora" #~ msgid "Cursor theme" #~ msgstr "Téma kurzora" #~ msgid "Cursor theme name" #~ msgstr "Názov témy kurzora" #~ msgid "Size of the cursor" #~ msgstr "VeľkosÅ¥ kurzora" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ÄŒas pozvolného miznutia nepriehľadnosÅ¥i okna." compiz-0.9.11+14.04.20140409/po/bn_IN.po0000644000015301777760000035741412321343002017453 0ustar pbusernogroup00000000000000# Hindi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Prasanth Kurian # msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-03-15 16:49+0100\n" "Last-Translator: biswajyoti mahanta \n" "Language-Team: gist bengali team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "ডেসà§à¦•টপ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "উইনà§à¦¡à§‹ পরিচালনা" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "কমপিজ" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "কিছৠনা" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "চেদ" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "বড় করা" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে অনà§à¦­à§‚মিকভাবে বড় করা" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে উলà§à¦²à¦®à§à¦¬à¦­à¦¾à¦¬à§‡ বড় করা" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "ছোট করা হয়েছে" # সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ আপডেট" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "উইনà§à¦¡à§‹ মেনà§" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "উইনà§à¦¡à§‹ শীরà§à¦·à¦¬à¦¾à¦°à§‡ মাউস হà§à¦‡à¦² সà§à¦•à§à¦°à¦² করার সময় কারà§à¦¯ করা হবে" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° পà§à¦°à¦•ৃতি" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "মেটাসিটি বিষয় সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "মেটাসিটি বিষয় সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° শেড" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "মেটাসিটি বিষয় অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "মেটাসিটি বিষয় অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° শেড" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "মেটাসিটি বিষয় অলঙà§à¦•রণ সহ সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à§Ÿ বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° জনà§à¦¯ অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "মেটাসিটি বিষয় অলঙà§à¦•রণে বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° জনà§à¦¯ অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "অসà§à¦¬à¦šà§à¦› থেকে অরà§à¦§à¦¸à§à¦¬à¦šà§à¦› মেটাসিটি বিষয় অলঙà§à¦•রণ সহ শেড সকà§à¦°à¦¿à§Ÿà¦•রণ" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "অসà§à¦¬à¦šà§à¦› থেকে অরà§à¦§à¦¸à§à¦¬à¦šà§à¦› মেটাসিটি বিষয় অলঙà§à¦•রণ সহ শেড সকà§à¦°à¦¿à§Ÿà¦•রণ" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "শীরà§à¦· বার মাউস হà§à¦‡à¦²à§‡à¦° কারà§à¦¯" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "উইনà§à¦¡à§‹ অলঙà§à¦•রণের সময় অসà§à¦ªà¦·à§à¦Ÿà¦¤à¦¾à¦° পà§à¦°à¦•ার" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "মেটাসিটি বিষয় বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "উইনà§à¦¡à§‹ অলঙà§à¦•রণ করার সময় মেটাসিটি বিষয় বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "উইনà§à¦¡à§‹ বনà§à¦§ করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "উইনà§à¦¡à§‹ সরà§à¦¬à¦¾à¦§à¦¿à¦• না করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "উইনà§à¦¡à§‹ বড় করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿ ছোট করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "উপরে আনোন" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "চেটে যাক" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "চেদ বাদ" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "উপরে আনো না" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "না চাটবে না" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, fuzzy, c-format msgid "The window \"%s\" is not responding." msgstr "The window \"%s\" পà§à¦°à¦¤à¦¿à¦•à§à¦°à¦¿à¦¯à¦¾ করছেনা" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "à¦à¦ªà§à¦²à¦¿à¦•েছন টি যোরকরে বনà§à¦§ করতে হবে আর আপনার সকল unsaved হারাটে হবে |" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "যোরকরে বনà§à¦§ করতে হবে" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦Ÿ" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦Ÿ ঠরঙ পূরà§à¦£ করোন" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦Ÿ ঠসà§à¦Ÿà§à¦°à§‹à¦•ের রঙ করোন" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦Ÿ পà§à¦²à¦¾à¦—িন" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "পরিষà§à¦•ার করো" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "অঙà§à¦•ন করো" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "টà§à¦²à§‡à¦° সাহাযà§à¦¯à§‡ অঙà§à¦•ন করা" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦Ÿà¦šà¦¨ ঠরঙ পূরà§à¦£ করো" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "শà§à¦°à§ " #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦Ÿà¦¨ ঠঅঙà§à¦•ন শà§à¦°à§ করো" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦Ÿà¦¨ ঠমোছটে শà§à¦°à§ করো" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "মোছটে শà§à¦°à§ করো" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "রেখার বিসà§à¦¤à¦¾à¦° (পà§à¦°à¦¸à§à¦¥)" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦¶à¦¨à§‡à¦° লাইনের পà§à¦°à¦¸à§à¦¥" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦¶à¦¨à§‡à¦° সà§à¦Ÿà§à¦°à§‹à¦•ের রঙ" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "সà§à¦Ÿà§à¦°à§‹à¦•ের পà§à¦°à¦¸à§à¦¥" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "অà§à¦¯à¦¾à¦¨à§‹à¦Ÿà§‡à¦¶à¦¨à§‡à¦° সà§à¦Ÿà§à¦°à§‹à¦•ের পà§à¦°à¦¸à§à¦¥" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "আলফা অসà§à¦ªà¦·à§à¦Ÿ" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "উনà§à¦¡à§‹à¦° বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "অসà§à¦ªà¦·à§à¦Ÿ টার ফিলটার" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "অসà§à¦ªà¦·à§à¦Ÿ দেখতে" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "অসà§à¦ªà¦·à§à¦Ÿ টা Saturation" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "অসà§à¦ªà¦·à§à¦Ÿ টা র গতি" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "অসà§à¦ªà¦·à§à¦Ÿ টা র উইনà§à¦¡à§‹" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "উইনà§à¦¡à§‹à¦° অরà§à¦§à¦¸à§à¦¬à¦šà§à¦› অংশের পিছনের অসà§à¦ªà¦·à§à¦Ÿà¦¤à¦¾" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦¤à§‡ ফোকাস নেই সেগà§à¦²à¦¿à¦•ে অসà§à¦ªà¦·à§à¦Ÿ করা " #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "অনà§à¦¯à¦¾à¦¨à§à¦¯ উইনà§à¦¡à§‹ দà§à¦¬à¦¾à¦°à¦¾ অসà§à¦ªà¦·à§à¦Ÿ করা সà§à¦•à§à¦°à¦¿à¦¨à§‡à¦° অংশগà§à¦²à¦¿à¦° অসà§à¦ªà¦·à§à¦Ÿà¦¤à¦¾à¦•ে অসমরà§à¦¥ করা." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "অসà§à¦ªà¦·à§à¦Ÿ করার জনà§à¦¯ ফিলà§à¦Ÿà¦¾à¦° করার পদà§à¦§à¦¤à¦¿" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "ফোকাস অসà§à¦ªà¦·à§à¦Ÿ" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "ফোকাস অসà§à¦ªà¦·à§à¦Ÿ করার উইনà§à¦¡à§‹" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "মিপমà§à¦¯à¦¾à¦ª" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "মিপমà§à¦¯à¦¾à¦ª LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "মিপমà§à¦¯à¦¾à¦ªà§‡à¦° বিশদরূপের-সà§à¦¤à¦°" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "পালস" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "পালস পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "উইনà§à¦¡à§‹à¦° অসà§à¦ªà¦·à§à¦Ÿà¦•রণের গতি" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "ফোকাস বার দà§à¦¬à¦¾à¦°à¦¾ যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ পà§à¦°à¦­à¦¾à¦¬à¦¿à¦¤ হবে" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ আলফা অসà§à¦ªà¦·à§à¦Ÿà¦¤à¦¾ বà§à¦¯à¦¬à¦¹à¦¾à¦° করবে" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "সমরূপ আউটপà§à¦Ÿ" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "ভারত" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "আউটপà§à¦Ÿ সমরূপ পরিচালক" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶ 0 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶1 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶10 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶11 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶ 2 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶3 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶4 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶5 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶6 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶7 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶8 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶9 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶ 0 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶1 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶10 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶11 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶ 2 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶3 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶4 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶5 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶6 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶7 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶8 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶9 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶ 0 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶1 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶10 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶11 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶ 2 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶3 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶4 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶5 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶6 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶7 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶8 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "যখন কোন কী বাইনà§à¦¡à¦¿à¦‚ চাওয়া হবে, নিরà§à¦¦à§‡à¦¶9 দà§à¦¬à¦¾à¦°à¦¾ চিহà§à¦¨à¦¿à¦¤ শেল নিরà§à¦¦à§‡à¦¶à¦Ÿà¦¿ চালনা করা হবে" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "যখন run_command0 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "যখন run_command1 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "যখন run_command10 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "যখন run_command11 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "যখন run_command2 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "যখন run_command3 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "যখন run_command4 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "যখন run_command5 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "যখন run_command6 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "যখন run_command7 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "যখন run_command8 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "যখন run_command9 চাওয়া হবে তখন শেলে নিরà§à¦¦à§‡à¦¶ লাইনটি সমà§à¦ªà¦¾à¦¦à¦¨ করা হবে" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "সকà§à¦°à¦¿à§Ÿ পà§à¦²à¦¾à¦—ইনগà§à¦²à¦¿" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "অফসà§à¦•à§à¦°à¦¿à¦¨ পিকà§à¦¸à¦®à§à¦¯à¦¾à¦ªà§‡ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¿à¦¤ না করার জনà§à¦¯ পূরà§à¦£à¦¸à§à¦•à§à¦°à¦¿à¦¨ উইনà§à¦¡à§‹ অঙà§à¦•ন সমà§à¦®à¦¤ করা" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "শà§à¦°à¦¬à¦£à¦¯à§‹à¦—à§à¦¯ বেল" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "শà§à¦°à¦¬à¦£à¦¯à§‹à¦—à§à¦¯ সিসà§à¦Ÿà§‡à¦® বিপ" # সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ আপডেট" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "সà§à¦¬à§Ÿà¦‚-বৃদà§à¦§à¦¿ বিলমà§à¦¬" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "আউটপà§à¦Ÿ ডিভাইসের সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿ সনà§à¦§à¦¾à¦¨" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "পà§à¦¨à¦ƒà¦¸à¦œà§€à¦¬ মাতà§à¦°à¦¾à¦° সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿ সনà§à¦§à¦¾à¦¨" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "সরà§à¦¬à§‹à¦¤à§à¦¤à¦®" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ফোকাসে কà§à¦²à¦¿à¦• করà§à¦¨" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "উইনà§à¦¡à§‹à§Ÿ কà§à¦²à¦¿à¦• করে তাতে ইনপà§à¦Ÿà§‡ ফোকাস করà§à¦¨" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ বনà§à¦§ করà§à¦¨" # button label #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "ডিফলà§à¦Ÿ (&e)" # progress stage title #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "ডিফলà§à¦Ÿ উইনà§à¦¡à§‹ মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦° আরামà§à¦­ করা হচà§à¦›à§‡" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "ডেসà§à¦•টপ ঘনক" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "আউটপà§à¦Ÿ সনà§à¦§à¦¾à¦¨" # headline for dialog "Select for update" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "পরিবরà§à¦§à¦¨à§‡à¦° জনà§à¦¯ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "দà§à¦°à§à¦¤" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "ফোকাস পà§à¦°à¦¤à¦¿à¦°à§‹à¦§à§‡à¦° উইনà§à¦¡à§‹" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "ফোকাস পà§à¦°à¦¤à¦¿à¦°à§‹à¦§à§‡à¦° উইনà§à¦¡à§‹" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "ফোকাস পà§à¦°à¦¤à¦¿à¦°à§‹à¦§à§‡à¦° উইনà§à¦¡à§‹" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "সাধারণ বিকলà§à¦ª" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "সাধারণ কমপিজ বিকলà§à¦ª" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "ভালো" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "টাসà§à¦•বার উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ বাদ দেওয়া গোপন করা" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "সব উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ গোপন করা à¦à¦¬à¦‚ ডেসà§à¦•টপে ফোকাস করা" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "ডেসà§à¦•টপ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ পà§à¦°à¦£à¦¾à¦²à§€à¦¤à§‡ পà§à¦°à¦¬à§‡à¦¶ করার সময় টাসà§à¦•বারে নেই à¦à¦°à¦•ম উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ গোপন করà§à¦¨" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "অনà§à¦­à§‚মিক ভারà§à¦šà§à§Ÿà¦¾à¦² আকার" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "বড় করার হলে ইঙà§à¦—িতগà§à¦²à¦¿ অগà§à¦°à¦¾à¦¹à§à¦¯ করা" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "উইনà§à¦¡à§‹ বড় করার সময় আকার বৃদà§à¦§à¦¿ à¦à¦¬à¦‚ আকৃতির ইঙà§à¦—িত অগà§à¦°à¦¾à¦¹à§à¦¯ করà§à¦¨" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦•ে তোলার আগে বà§à¦¯à¦¬à¦§à¦¾à¦¨" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "পিং বারà§à¦¤à¦¾à¦—à§à¦²à¦¿à¦° মধà§à¦¯à§‡ বà§à¦¯à¦¬à¦§à¦¾à¦¨" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "আলোকপাত" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "বরà§à¦¤à¦®à¦¾à¦¨à§‡ সকà§à¦°à¦¿à§Ÿ পà§à¦²à¦¾à¦—ইনের তালিকা" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "আউটপà§à¦Ÿ ডিভাইস বরà§à¦£à¦¨à¦¾à¦•ারী সà§à¦Ÿà§à¦°à¦¿à¦‚য়ের তালিকা" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "নিচের উইনà§à¦¡à§‹" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "অনà§à¦¯à¦¾à¦¨à§à¦¯ উইনà§à¦¡à¦—à§à¦²à¦¿à¦° নিচে উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে নামিয়ে দিন" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে অনà§à¦­à§‚মিকভাবে বড় করা" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে উলà§à¦²à¦®à§à¦¬à¦­à¦¾à¦¬à§‡ বড় করা" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ বড় করা" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে অনà§à¦­à§‚মিকভাবে বড় করা" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে উলà§à¦²à¦®à§à¦¬à¦­à¦¾à¦¬à§‡ বড় করা" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ ছোট করা" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "সà§à¦¬à¦¾à¦­à¦¾à¦¬à¦¿à¦•" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "ডেসà§à¦•টপের সংখà§à¦¯à¦¾" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "ভারà§à¦šà§à§Ÿà¦¾à¦² ডেসà§à¦•টপের সংখà§à¦¯à¦¾" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "উলà§à¦²à¦®à§à¦¬ ফাà¦à¦•া পরà§à¦¯à¦¾à§Ÿà§‡ শà§à¦§à§à¦®à¦¾à¦¤à§à¦° সà§à¦•à§à¦°à¦¿à¦¨ আপডেট সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "আউটপà§à¦Ÿà¦—à§à¦²à¦¿" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "পিং বিলমà§à¦¬" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "কà§à¦²à¦¿à¦• করে বৃদà§à¦§à¦¿ করà§à¦¨" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "উইনà§à¦¡à§‹ তà§à¦²à§‡ ধরা" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "বà§à¦¯à¦¬à¦§à¦¾à¦¨à§‡à¦° পরে নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে তà§à¦²à§‡ ধরà§à¦¨" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "অনà§à¦¯à¦¾à¦¨à§à¦¯ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° ওপরে উইনà§à¦¡à§‹ তà§à¦²à§‡ ধরা" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "কà§à¦²à¦¿à¦• করা হলে উইনà§à¦¡à§‹à¦Ÿà¦¿ তà§à¦²à§‡ ধরা" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "পà§à¦¨à¦°à¦¾à§Ÿ তালিকা পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করো (&R)" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "অনà§à¦­à§‚মিক ভারà§à¦šà§à§Ÿà¦¾à¦² আকারের জনà§à¦¯ সà§à¦•à§à¦°à¦¿à¦¨ আকারের গà§à¦£à¦¿à¦¤à¦•" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "উলà§à¦²à¦®à§à¦¬ ভারà§à¦šà§à§Ÿà¦¾à¦² আকারের জনà§à¦¯ সà§à¦•à§à¦°à¦¿à¦¨ আকারের গà§à¦£à¦¿à¦¤à¦•" # label text #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "সময়" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "সবগà§à¦²à§‹ পারà§à¦Ÿà¦¿à¦¶à¦¨ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করো" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "সà§à¦®à¦¾à¦°à§à¦Ÿ" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank ঠSync " #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "টেকà§à¦¸à¦šà¦¾à¦° ফিলà§à¦Ÿà¦¾à¦° করা" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "টেকà§à¦¸à¦šà¦¾à¦° ফিলà§à¦Ÿà¦¾à¦°" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "টেকà§à¦¸à¦šà¦¾à¦° ফিলà§à¦Ÿà¦¾à¦° করা" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "যে হারে সà§à¦•à§à¦°à¦¿à¦¨à¦Ÿà¦¿ পà§à¦¨à¦°à¦¾à§Ÿ অঙà§à¦•ন করা হবে (গà§à¦£/সেকেনà§à¦¡)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "সরà§à¦¬à¦¾à¦§à¦¿à¦• উইনà§à¦¡à§‹ টগল করা" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "অনà§à¦­à§‚মিকভাবে সরà§à¦¬à¦¾à¦§à¦¿à¦• উইনà§à¦¡à§‹ টগল করা" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "উলà§à¦²à¦®à§à¦¬à¦­à¦¾à¦¬à§‡ সরà§à¦¬à¦¾à¦§à¦¿à¦• উইনà§à¦¡à§‹ টগল করা" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "উইনà§à¦¡à§‹ শেড টগল করা" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "সরà§à¦¬à¦¾à¦§à¦¿à¦• সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ টগল করা" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "অনà§à¦­à§‚মিকভাবে সরà§à¦¬à¦¾à¦§à¦¿à¦• সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦•ে টগল করা" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "উলà§à¦²à¦®à§à¦¬à¦­à¦¾à¦¬à§‡ সরà§à¦¬à¦¾à¦§à¦¿à¦• সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦•ে টগল করা" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ শেড টগল করা" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "মনà§à¦¥à¦° অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à¦—à§à¦²à¦¿à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦° টগল করা" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ সরà§à¦¬à¦¾à¦§à¦¿à¦• না করা" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "পূরà§à¦£à¦¸à§à¦•à§à¦°à¦¿à¦¨à§‡à¦° উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶ না করা" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "সà§à¦•à§à¦°à¦¿à¦¨ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à¦¿à¦¤ করার সময় বিচà§à¦›à§à¦°à¦¿à¦¤ আলো পà§à¦°à§Ÿà§‹à¦— করà§à¦¨" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "উলà§à¦²à¦®à§à¦¬ ভারà§à¦šà§à§Ÿà¦¾à¦² আকার" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "উইনà§à¦¡à§‹à¦° মেনৠবোতাম বনà§à¦§à¦¨" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "উইনà§à¦¡à§‹à¦° কী বোতাম বনà§à¦§à¦¨" # নিরà§à¦¬à¦¾à¦šà¦¨ #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ " #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "চিতà§à¦° বিনà§à¦¯à¦¸à§à¦¤ করা" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "চিতà§à¦°à§‡à¦° ওপরের তলটি ঘোরানোয় বিনà§à¦¯à¦¸à§à¦¤ করা" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "পরবরà§à¦¤à§€ সà§à¦²à¦¾à¦‡à¦¡à§‡ à¦à¦—িয়ে যাওয়া" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "সà§à¦•াইডোম অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦Ÿ করা" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "ঘনক ঘোরানোর সময় সà§à¦•াইডোম অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦Ÿ করা" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" # সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ আপডেট" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "ঘনকের ওপর à¦à¦¬à¦‚ নিচের পà§à¦°à¦¾à¦¨à§à¦¤à§‡à¦° রঙ" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "সà§à¦•াইডোম-ফলবà§à¦¯à¦¾à¦• গà§à¦°à§à¦¯à¦¾à¦¡à¦¿à§Ÿà§‡à¦¨à§à¦Ÿà§‡à¦° নিচের কালার-সà§à¦Ÿà¦ªà§‡à¦° জনà§à¦¯ রঙ " #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "সà§à¦•াইডোম-ফলবà§à¦¯à¦¾à¦• গà§à¦°à§à¦¯à¦¾à¦¡à¦¿à§Ÿà§‡à¦¨à§à¦Ÿà§‡à¦° ওপরের কালার-সà§à¦Ÿà¦ªà§‡à¦° জনà§à¦¯ রঙ " #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "ঘনকের রঙ" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "ঘনকের রঙ" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "ডেসà§à¦•টপ ঘনক" # নিরà§à¦¬à¦¾à¦šà¦¨ #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ " #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "বাদ দেয়া হয়েছে\n" # label text #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "সময়" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "উনà§à¦¨à¦¤à¦¤à¦° সà§à¦•েলিং à¦à¦° জনà§à¦¯ mipmaps তৈরী করà§à¦¨" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ সà§à¦²à¦¾à¦‡à¦¡à§‡ ফিরে যান" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "ইমেজ ফাইল তৈরী করো" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "সà§à¦•াইডোমের টেকà§à¦¸à¦šà¦¾à¦° হিসাবে বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° জনà§à¦¯ চিতà§à¦°" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "যদি মাউস দিয়ে ঘোরানো হয় তাহলে ঘনকের সà§à¦¬à¦šà§à¦›à¦¤à¦¾ শà§à¦°à§ হবে." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ঘনকের অভà§à¦¯à¦¨à§à¦¤à¦°à§‡" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "ঘনকের অভà§à¦¯à¦¨à§à¦¤à¦°à§‡" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "ঘনকের উপরিতলে PNG à¦à¦¬à¦‚ SVG র যে তালিকা পà§à¦°à§Ÿà§‹à¦— করা হবে" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "বিবিধ আউটপà§à¦Ÿ পà§à¦°à¦£à¦¾à¦²à§€" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "বহà§à¦¬à¦¿à¦§ ঘনকগà§à¦²à¦¿" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "পরবরà§à¦¤à§€ সà§à¦²à¦¾à¦‡à¦¡" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "বড় ঘনকে" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ঘোরানোর সময় অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "না ঘোরানোর সময় অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ঘোরানোর সময় ডেসà§à¦•টপ উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "ঘোরানোর সময় ডেসà§à¦•টপ উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "ঘনকে উইনà§à¦¡à§‹ সà§à¦¥à¦¾à¦ªà¦¨ করা" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ সà§à¦²à¦¾à¦‡à¦¡" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Skydome পà§à¦°à§Ÿà§‹à¦— করা" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "ঘনকের ওপরের তল আবৃত করার জনà§à¦¯ চিতà§à¦° সà§à¦•েল করা" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "যদি à¦à¦•াধিক ডিভাইস বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হয় সেকà§à¦·à§‡à¦¤à§à¦°à§‡ ঘনকটি কিভাবে পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করা হবে তা " "নিরà§à¦¬à¦¾à¦šà¦¨ করে." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "সà§à¦•াইডোম" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "সà§à¦•াইডোম গà§à¦°à§à¦¯à¦¾à¦¡à¦¿à§Ÿà§‡à¦¨à§à¦Ÿ শেষের রঙ" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "সà§à¦•াইডোম গà§à¦°à§à¦¯à¦¾à¦¡à¦¿à§Ÿà§‡à¦¨à§à¦Ÿ আরমà§à¦­à§‡à¦° রঙ" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "সà§à¦•াইডোম চিতà§à¦°" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "বাদ দেয়া হয়েছে\n" # label text #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "সময়" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "মাউস ঘোরানোর সময় সà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "উনà§à¦®à§à¦•à§à¦¤ করা" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "ঘনকটি উনà§à¦®à§à¦•à§à¦¤ করা" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "ডিবাস" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "ডিবাস নিয়নà§à¦¤à§à¦°à¦£ বà§à¦¯à¦¾à¦•à¦à¦¨à§à¦¡" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "অলঙà§à¦•রণ টেকà§à¦¸à¦šà¦¾à¦°à§‡ মিপমà§à¦¯à¦¾à¦ª তৈরী করতে দিন" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "কমানà§à¦¡ '%1'" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "যদি কোন ডেকোরেটর আগে থেকে কাজ না করেন সেকà§à¦·à§‡à¦¤à§à¦°à§‡ যে ডেকোরেটর নিরà§à¦¦à§‡à¦¶ লাইন বà§à¦¯à¦¬à¦¹à§ƒà¦¤ " "হবে" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "পà§à¦°à¦šà§à¦›à¦¾à§Ÿà¦¾ অফসেট X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "পà§à¦°à¦šà§à¦›à¦¾à§Ÿà¦¾ অফসেট Y" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "উইনà§à¦¡à§‹ অলঙà§à¦•রণ" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "উইনà§à¦¡à§‹ অলঙà§à¦•রণ" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ অলঙà§à¦•রণ করা হবে" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ ছায়াযà§à¦•à§à¦¤ করা হবে" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" # label text #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "সময়" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "ধারন করে" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "সà§à¦¥à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "ছোট করা/খোলা/বনà§à¦§ করার ওপর মলিনতার পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "বাদ দেয়া হয়েছে\n" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "সà§à¦¥à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "উইনà§à¦¡à§‹ ছোট করা/খোলা/বনà§à¦§ করার ওপর মলিনতার পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "সিসà§à¦Ÿà§‡à¦® বিপে মলিনতার পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "মà§à¦¯à¦¾à¦ª করার সময় উইনà§à¦¡à§‹ ফেড ইন করা à¦à¦¬à¦‚ আনমà§à¦¯à¦¾à¦ª করার সময় উইনà§à¦¡à§‹ ফেড আউট করা" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "পূরà§à¦£à¦¸à§à¦•à§à¦°à¦¿à¦¨à§‡à¦° দৃশà§à¦¯à¦®à¦¾à¦¨ বেল" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "সিসà§à¦Ÿà§‡à¦® বিপে পূরà§à¦£ পরà§à¦¦à¦¾à¦° মলিন পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "দৃশà§à¦¯à¦®à¦¾à¦¨ বেল" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "উইনà§à¦¡à§‹ মলিন হওয়ার গতি" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "সà§à¦•েল পà§à¦°à¦£à¦¾à¦²à§€à¦¤à§‡ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ সà§à¦•েল করা" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ মলিন করা হবে" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "মাউনà§à¦Ÿ বিনà§à¦¦à§" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "মাউনà§à¦Ÿ বিনà§à¦¦à§" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "ইউজারসà§à¦ªà§‡à¦¸ ফাইল সিসà§à¦Ÿà§‡à¦®" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "ইউজারসà§à¦ªà§‡à¦¸ ফাইল সিসà§à¦Ÿà§‡à¦®" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf নিয়নà§à¦¤à§à¦°à¦£ বà§à¦¯à¦¾à¦•à¦à¦¨à§à¦¡" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib পà§à¦°à¦§à¦¾à¦¨ লà§à¦ª সমরà§à¦¥à¦¨" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "à¦à¦•টি টারà§à¦®à¦¿à¦¨à¦¾à¦² খà§à¦²à§à¦¨" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "ডায়ালগ চালনা করা" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "পà§à¦°à¦§à¦¾à¦¨ মেনৠপà§à¦°à¦¦à¦°à§à¦¶à¦¨ করা" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "চালনা করার অনà§à¦ªà§à¦°à§Ÿà§‹à¦— ডায়ালগ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করা" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "পà§à¦°à¦§à¦¾à¦¨ তালিকা পà§à¦°à¦¦à¦°à§à¦¶à¦¨" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "à¦à¦•টি সà§à¦•à§à¦°à¦¿à¦¨à¦¶à¦Ÿ নিন" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "উইনà§à¦¡à§‹à¦° à¦à¦•টি সà§à¦•à§à¦°à¦¿à¦¨à¦¶à¦Ÿ নিন" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "উইনà§à¦¡à§‹ সà§à¦•à§à¦°à¦¿à¦¨à¦¶à¦Ÿ নিরà§à¦¦à§‡à¦¶ লাইন" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini ফà§à¦²à§à¦¯à¦¾à¦Ÿ ফাইলের বà§à¦¯à¦¾à¦•à¦à¦¨à§à¦¡" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ফাইল পরিবরà§à¦¤à¦¨ ঘোষণাকারী পà§à¦²à¦¾à¦—ইন" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "আইনোটিফাই" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig নিয়নà§à¦¤à§à¦°à¦£ বà§à¦¯à¦¾à¦•à¦à¦¨à§à¦¡" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "পà§à¦°à¦­à¦¾à¦¬ সরà§à¦¬à¦¨à¦¿à¦®à§à¦¨ করা" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ ছোট করা" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "সরà§à¦¬à¦¨à¦¿à¦®à§à¦¨ করার গতি" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "শেড পà§à¦°à¦¤à¦¿à¦°à§‹à¦§" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "শেড পà§à¦°à¦¤à¦¿à¦°à§‹à¦§" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ ছোট à¦à¦¬à¦‚ বড় করার সময় সেগà§à¦²à¦¿ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à¦¿à¦¤ করে" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "উইনà§à¦¡à§‹ ছোট করার সময় যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à¦¿à¦¤ করা হবে" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "ধারন করে" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "ওয়ারà§à¦•সà§à¦ªà§‡à¦¸ কà§à¦·à§‡à¦¤à§à¦°à§‡ Y সà§à¦¥à¦¾à¦¨à¦¾à¦™à§à¦•কে সীমাবদà§à¦§ করà§à¦¨" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "সরানোর কারà§à¦¯à¦Ÿà¦¿ সমাপà§à¦¤ না হওয়া পরà§à¦¯à¦¨à§à¦¤ সারà§à¦­à¦¾à¦°à§‡à¦°-দিকে অবসà§à¦¥à¦¿à¦¤ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ আপডেট করবেন " "না" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "উইনà§à¦¡à§‹ সরানো আরমà§à¦­ করা" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "অলস অবসà§à¦¥à¦¾à¦¨ নিরà§à¦£à§Ÿ" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "উইনà§à¦¡à§‹ সরানো" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "চলমান উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° সà§à¦¤à¦°" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "টানার সময় বড় করা উইনà§à¦¡à§‹à¦•ে সà§à¦¨à§à¦¯à¦¾à¦ªà¦…ফ করা à¦à¦¬à¦‚ সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿà¦­à¦¾à¦¬à§‡ ছোট করা" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "সà§à¦¨à§à¦¯à¦¾à¦ªà¦…ফ সরà§à¦¬à¦¾à¦§à¦¿à¦• উইনà§à¦¡à§‹" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "বà§à¦°à¦¿à¦œ" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "বà§à¦°à¦¿à¦œ" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "বà§à¦°à¦¿à¦œ" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "বà§à¦°à¦¿à¦œ" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ হà§à¦°à¦¾à¦¸ করà§à¦¨" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ বৃদà§à¦§à¦¿ করà§à¦¨" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ পরিবরà§à¦¤à¦¨à§‡à¦° ধাপ" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ পরিবরà§à¦¤à¦¨à§‡à¦° ধাপ" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° ধাপ" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "চলমান উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° সà§à¦¤à¦°" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "ঘোরানোর সময় অসà§à¦¬à¦šà§à¦›à¦¤à¦¾" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "উইনà§à¦¡à§‹ অলঙà§à¦•রণ" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ উইনà§à¦¡à§‹à¦° মূলà§à¦¯à¦—à§à¦²à¦¿" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° অবসà§à¦¥à¦¾à¦¨ নিরà§à¦£à§Ÿ করা হবে" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ অরà§à¦§à¦¸à§à¦¬à¦šà§à¦› করা হবে" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° অবসà§à¦¥à¦¾à¦¨ নিরà§à¦£à§Ÿ করা হবে" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "উইনà§à¦¡à§‹ সà§à¦¥à¦¾à¦ªà¦¨à§‡à¦° জনà§à¦¯ বà§à¦¯à¦¬à¦¹à§ƒà¦¤ অà§à¦¯à¦¾à¦²à¦—োরিদম" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "কাসকেড" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "কেনà§à¦¦à§à¦°à§€à¦­à§‚ত" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "উইনà§à¦¡à§‹ পরিচালনা" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "ফোকাস পà§à¦°à¦¤à¦¿à¦°à§‹à¦§à§‡à¦° উইনà§à¦¡à§‹" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "অনà§à¦­à§‚মিক ভিউপোরà§à¦Ÿà§‡à¦° অবসà§à¦¥à¦¾à¦¨" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ সà§à¦¥à¦¾à¦ªà¦¨ করা" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "মà§à¦¯à¦¾à¦ª করার পর উপযà§à¦•à§à¦¤ সà§à¦¥à¦¾à¦¨à§‡ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨ পà§à¦°à¦£à¦¾à¦²à§€" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "অবসà§à¦¥à¦¾à¦¨à¦¯à§à¦•à§à¦¤ উইনà§à¦¡à§‹" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "ইচà§à¦›à¦¾à¦®à¦¤" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "যদি à¦à¦•াধিক আউটপà§à¦Ÿ ডিভাইস বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হয় তাহলে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ কোথায় সà§à¦•েল করা হবে তা " "নিরà§à¦¬à¦¾à¦šà¦¨ করে" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "সà§à¦®à¦¾à¦°à§à¦Ÿ" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "সব আউটপà§à¦Ÿ ডিভাইসে" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "উলà§à¦²à¦®à§à¦¬ ভিউপোরà§à¦Ÿ অবসà§à¦¥à¦¾à¦¨" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "ভিউপোরà§à¦Ÿ অবসà§à¦¥à¦¾à¦¨à§‡à¦° উইনà§à¦¡à§‹" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "উইনà§à¦¡à§‹ পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨ ওয়ারà§à¦•à¦à¦°à¦¾à¦‰à¦¨à§à¦¡" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° অবসà§à¦¥à¦¾à¦¨ নিরà§à¦£à§Ÿ করা হবে" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে যে ভিউপোরà§à¦Ÿà§‡ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ রাখা হবে " #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "উইনà§à¦¡à§‹ অলঙà§à¦•রণ" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "ওয়ারà§à¦•à¦à¦°à¦¾à¦‰à¦¨à§à¦¡" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X অবসà§à¦¥à¦¾à¦¨" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X ভিউপোরà§à¦Ÿ অবসà§à¦¥à¦¾à¦¨" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X অবসà§à¦¥à¦¾à¦¨à§‡à¦° মূলà§à¦¯" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y অবসà§à¦¥à¦¾à¦¨" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y ভিউপোরà§à¦Ÿ অবসà§à¦¥à¦¾à¦¨" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y অবসà§à¦¥à¦¾à¦¨à§‡à¦° মূলà§à¦¯" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png চিতà§à¦° লোডকারী" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "রিগেকà§à¦¸ মেলানো" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "রিগেকà§à¦¸ উইনà§à¦¡à§‹ মেলানো" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "পà§à¦°à¦¾à¦¨à§à¦¤à¦°à§‡à¦–ার রঙ" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "বহিরà§à¦°à§‡à¦–া à¦à¦¬à¦‚ আয়তাকার পà§à¦¨à¦°à¦¾à¦•ৃতি পà§à¦°à¦£à¦¾à¦²à§€à¦¤à§‡ বà§à¦¯à¦¬à¦¹à§ƒà¦¤ পà§à¦°à¦¾à¦¨à§à¦¤à¦°à§‡à¦–ার রঙ" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚প পà§à¦¨à¦°à¦¾à¦•ৃতির পà§à¦°à¦£à¦¾à¦²à§€" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "উইনà§à¦¡à§‹ পà§à¦¨à¦°à¦¾à¦•ৃতির জনà§à¦¯ পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚প পà§à¦°à¦£à¦¾à¦²à§€" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "রঙ পূরà§à¦£ করা" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "আয়তাকার পà§à¦¨à¦°à¦¾à¦•ৃতি পà§à¦°à¦£à¦¾à¦²à§€à¦° জনà§à¦¯ বà§à¦¯à¦¬à¦¹à§ƒà¦¤ পূরà§à¦£à¦•রণ রঙ" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "বহিরà§à¦°à§‡à¦–া" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "পà§à¦¨à¦°à¦¾à¦•ার উইনà§à¦¡à§‹à¦° বহিরà§à¦°à§‡à¦–া" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "আয়তকà§à¦·à§‡à¦¤à§à¦°" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "উইনà§à¦¡à§‹à¦° আকার পরিবরà§à¦¤à¦¨ করা" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "উইনà§à¦¡à§‹à¦° আকার পরিবরà§à¦¤à¦¨ করা" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "উইনà§à¦¡à§‹à¦° আকার পরিবরà§à¦¤à¦¨ শà§à¦°à§ করà§à¦¨" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿ বিসà§à¦¤à§ƒà¦¤ করে উইনà§à¦¡à§‹à¦° আকার পরিবরà§à¦¤à¦¨ শà§à¦°à§ করà§à¦¨" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "আয়তকà§à¦·à§‡à¦¤à§à¦° দিয়ে উইনà§à¦¡à§‹à¦° আকার পরিবরà§à¦¤à¦¨ শà§à¦°à§ করà§à¦¨" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "পà§à¦°à¦¸à¦¾à¦°à¦¿à¦¤ করা" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "যে উইনà§à¦¡à§‹à¦° জনà§à¦¯ সà§à¦¬à¦¾à¦­à¦¾à¦¬à¦¿à¦• পà§à¦¨à¦°à¦¾à¦•ৃতি পà§à¦°à§Ÿà§‹à¦— করা হবে" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "যে উইনà§à¦¡à§‹à¦° জনà§à¦¯ বহিরà§à¦°à§‡à¦–া পà§à¦¨à¦°à¦¾à¦•ৃতি পà§à¦°à§Ÿà§‹à¦— করা হবে" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "যে উইনà§à¦¡à§‹à¦° জনà§à¦¯ আয়তাকার পà§à¦¨à¦°à¦¾à¦•ৃতি পà§à¦°à§Ÿà§‹à¦— করা হবে" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "যে উইনà§à¦¡à§‹à¦° জনà§à¦¯ বিসà§à¦¤à§ƒà¦¤à¦¿ পà§à¦¨à¦°à¦¾à¦•ৃতি পà§à¦°à§Ÿà§‹à¦— করা হবে" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr " DnD পà§à¦°à¦¾à¦¨à§à¦¤ ফà§à¦²à¦¿à¦ª করা" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "পà§à¦°à¦¾à¦¨à§à¦¤à§‡à¦° ফà§à¦²à¦¿à¦ª সরানো" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "পà§à¦°à¦¾à¦¨à§à¦¤à§‡à¦° ফà§à¦²à¦¿à¦ª নিরà§à¦¦à§‡à¦¶à¦•" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "সà§à¦¥à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "বাà¦à¦¦à¦¿à¦•ের ভিউপোরà§à¦Ÿà§‡ ফà§à¦²à¦¿à¦ª করা à¦à¦¬à¦‚ নিরà§à¦¦à§‡à¦¶à¦•টি মà§à¦¡à¦¼à¦¿à§Ÿà§‡ দেওয়া " #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "বসà§à¦¤à§à¦Ÿà¦¿à¦•ে সà§à¦•à§à¦°à¦¿à¦¨à§‡à¦° পà§à¦°à¦¾à¦¨à§à¦¤à§‡ টানার সময় পরবরà§à¦¤à§€ ভিউপোরà§à¦Ÿà§‡ ফà§à¦²à¦¿à¦ª করà§à¦¨" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "নিরà§à¦¦à§‡à¦¶à¦•টিকে সà§à¦•à§à¦°à¦¿à¦¨à§‡à¦° পà§à¦°à¦¾à¦¨à§à¦¤à§‡ সরানোর সময় পরবরà§à¦¤à§€ ভিউপোরà§à¦Ÿà§‡ ফà§à¦²à¦¿à¦ª করà§à¦¨" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "নিরà§à¦¦à§‡à¦¶à¦•টিকে সà§à¦•à§à¦°à¦¿à¦¨à§‡à¦° পà§à¦°à¦¾à¦¨à§à¦¤à§‡ সরানোর সময় পরবরà§à¦¤à§€ ভিউপোরà§à¦Ÿà§‡ ফà§à¦²à¦¿à¦ª করà§à¦¨" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "ডানদিকের ভিউপোরà§à¦Ÿà§‡ ফà§à¦²à¦¿à¦ª করা à¦à¦¬à¦‚ নিরà§à¦¦à§‡à¦¶à¦•টি মà§à¦¡à¦¼à¦¿à§Ÿà§‡ দেওয়া " #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "নিরà§à¦¦à§‡à¦¶à¦• সরানোর জনà§à¦¯ Y অকà§à¦· উলà§à¦Ÿà§‡ দিন" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "নিরà§à¦¦à§‡à¦¶à¦• উলà§à¦Ÿà¦¾à¦¨à§‹ Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "নিরà§à¦¦à§‡à¦¶à¦• সংবেদনশীলতা" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "ঘোরানোর সময় তোলা" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "ঘোরানোর সময় উইনà§à¦¡à§‹à¦Ÿà¦¿ তোলা" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "ঘনক ঘোরানো" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "ফà§à¦²à¦¿à¦ª বাà¦à¦¦à¦¿à¦•ে ঘোরানো" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "ফà§à¦²à¦¿à¦ªà¦•ে ডানদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "বাà¦à¦¦à¦¿à¦•ে ঘোরানো" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "উইনà§à¦¡à§‹ সহ বাà¦à¦¦à¦¿à¦•ে ঘোরানো" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "ডানদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "উইনà§à¦¡à§‹ সহ ডানদিকে ঘোরানো" # সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ আপডেট" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "ফেস 1 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 1 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "ফেস 10 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 10 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "ফেস 11 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 11 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "ফেস 12 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 12 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "ফেস 2 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 2 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "ফেস 3 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 3 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "ফেস 4 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 4 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "ফেস 5 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 5 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "ফেস 6 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 6 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "ফেস 7 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 7 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "ফেস 8 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 8 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "ফেস 9 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 9 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "ঘনক ঘোরানো" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "ডেসà§à¦•টপ ঘনক ঘোরানো" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "বাà¦à¦¦à¦¿à¦•ে ঘোরানো" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "বাà¦à¦¦à¦¿à¦•ে ঘোরানো à¦à¦¬à¦‚ সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "ডানদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "ডানদিকে ঘোরানো à¦à¦¬à¦‚ সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "ফেস 1 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "উইনà§à¦¡à§‹ সহ ফেস 1 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "ফেস 1 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "ফেস 1 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "ফেস 10 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "ফেস 10 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "ফেস 11 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "ফেস 11 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "ফেস 12 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "ফেস 12 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "ফেস 2 ঠঘোরানো" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "ফেস 2 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "ফেস 3 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "ফেস 3 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "ফেস 4 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "ফেস 4 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "ফেস 5 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "ফেস 5 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "ফেস 6 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "ফেস 6 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "ফেস 7 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "ফেস 7 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "ফেস 8 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "ফেস 8 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "ফেস 9 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "ফেস 9 ঠঘোরান তারসঙà§à¦—ে সকà§à¦°à¦¿à§Ÿ উইনà§à¦¡à§‹à¦Ÿà¦¿ নিয়ে আসà§à¦¨" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "ভিউপোরà§à¦Ÿà§‡ ঘোরানো" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "উইনà§à¦¡à§‹ ঘোরানো" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "উইনà§à¦¡à§‹ দিয়ে ঘোরানো" # নিরà§à¦¬à¦¾à¦šà¦¨ #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ " # label text #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "সময়" # label text #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "সময়" # label text #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "সময়" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "নিরà§à¦¦à§‡à¦¶à¦•ের চলাচলের সংবেদনশীলতা " #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "ওপরের ফেসে ঘনক ঘোরানোকে সà§à¦¨à§à¦¯à¦¾à¦ª করা " #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ওপরের ফেসে ঘনক ঘোরানোকে সà§à¦¨à§à¦¯à¦¾à¦ª করা " #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "ওপরের ফেসে সà§à¦¨à§à¦¯à¦¾à¦ª করà§à¦¨" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ওপরের ফেসে সà§à¦¨à§à¦¯à¦¾à¦ª করà§à¦¨" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "ফà§à¦²à¦¿à¦ªà¦¿à¦‚ ভিউপোরà§à¦Ÿà§‡à¦° আগে সময়অতিকà§à¦°à¦¾à¦¨à§à¦¤ হয়েছে" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "জà§à¦®" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦° শতকরা পরিমাণ" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "বড়" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "ডেসà§à¦•টপ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করার জনà§à¦¯ ডেসà§à¦•টপে কà§à¦²à¦¿à¦• করà§à¦¨" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "পটভূমি গাঢ় করা" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "উইনà§à¦¡à§‹ সà§à¦•েল করার সময় পটভূমি গাঢ় করা" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "পà§à¦°à¦¤à§€à¦•" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "সà§à¦•েল করার সময় ডেসà§à¦•টপে যখন কà§à¦²à¦¿à¦• করা হবে তখন ডেসà§à¦•টপ পà§à¦°à¦£à¦¾à¦²à§€ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ পà§à¦°à¦¬à§‡à¦¶ করান " #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ঘà§à¦°à§‡ বেড়ানোর সময়" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "ভারত" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "সব উইনà§à¦¡à§‹à¦° জনà§à¦¯ উইনà§à¦¡à§‹ পিকার আরমà§à¦­ করা" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "সব উইনà§à¦¡à§‹ শà§à¦°à§‡à¦£à§€à¦° জনà§à¦¯ উইনà§à¦¡à§‹ পিকার আরমà§à¦­ করা" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "বরà§à¦¤à¦®à¦¾à¦¨ আউটপà§à¦Ÿà§‡à¦° উইনà§à¦¡à§‹à¦° জনà§à¦¯ উইনà§à¦¡à§‹ পিকার আরমà§à¦­ করা" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "সব উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° বিনà§à¦¯à¦¾à¦¸ করছে à¦à¦¬à¦‚ রূপানà§à¦¤à¦°à¦¿à¦¤ করছে" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "উইনà§à¦¡à§‹ শà§à¦°à§‡à¦£à§€à¦° বিনà§à¦¯à¦¾à¦¸ করছে à¦à¦¬à¦‚ রূপানà§à¦¤à¦°à¦¿à¦¤ করছে" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° বিনà§à¦¯à¦¾à¦¸ করছে à¦à¦¬à¦‚ রূপানà§à¦¤à¦°à¦¿à¦¤ করছে" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "বরà§à¦¤à¦®à¦¾à¦¨ আউটপà§à¦Ÿà§‡à¦° উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° বিনà§à¦¯à¦¾à¦¸ করা à¦à¦¬à¦‚ তার রূপানà§à¦¤à¦° শà§à¦°à§ করা" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "সব আউটপà§à¦Ÿ ডিভাইসে" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "বরà§à¦¤à¦®à¦¾à¦¨ আউটপà§à¦Ÿ ডিভাইসে" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ওভারলে চিতà§à¦°à¦¸à¦‚কেত" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦•ে সà§à¦•েল করার পর সেগà§à¦²à¦¿à¦° ওপর চিতà§à¦°à¦¸à¦‚কেত সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "সà§à¦•à§à¦¯à¦¾à¦¨à¦¾à¦°" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "যদি à¦à¦•াধিক আউটপà§à¦Ÿ ডিভাইস বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হয় তাহলে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ কোথায় সà§à¦•েল করা হবে তা " "নিরà§à¦¬à¦¾à¦šà¦¨ করে" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "সà§à¦ªà§‡à¦¨" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "উইনà§à¦¡à§‹à¦° ওপর ঘà§à¦°à§‡ বেড়ানোর সময় সà§à¦•েল পà§à¦°à¦£à¦¾à¦²à§€ বনà§à¦§ করার পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ সময় (মিনিটে)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "সà§à¦•েল পà§à¦°à¦£à¦¾à¦²à§€à¦¤à§‡ উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ সà§à¦•েল করা" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "à¦à¦‡ অনà§à¦ªà§à¦°à§Ÿà§‹à¦—ে সà§à¦•à§à¦°à¦¿à¦¨à¦¶à¦Ÿà¦—à§à¦²à¦¿ সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿà¦­à¦¾à¦¬à§‡ খà§à¦²à§‡ যায়" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "ডিরেকà§à¦Ÿà¦°à§€" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "ভারত" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "সà§à¦¥à¦¾à¦ªà¦¨à¦•ারà§à¦¯à§‡à¦° অনà§à¦ªà§à¦°à§Ÿà§‹à¦—" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "à¦à¦‡ ডিরেকà§à¦Ÿà¦°à§€à¦° সà§à¦•à§à¦°à¦¿à¦¨à¦¶à¦Ÿ চিতà§à¦°à¦—à§à¦²à¦¿ সà§à¦¥à¦¾à¦ªà¦¨ করা" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg " #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg চিতà§à¦° লোডার" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "উজà§à¦œà§à¦¬à¦²à¦¤à¦¾à¦° শতকরা পরিমাণ" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "সমà§à¦ªà§ƒà¦•à§à¦¤à¦¿à¦° শতকরা পরিমাণ" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "অনà§à¦ªà§à¦°à§Ÿà§‹à¦— পরিবরà§à¦¤à¦¨à¦•ারী" # সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à§€à§Ÿ আপডেট" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "বà§à¦Ÿà§‡à¦° সময়" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে সামনে নিয়ে আসা" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "উইনà§à¦¡à§‹ পরিবরà§à¦¤à¦¨ করার সময় দূরের ডেসà§à¦•টপটির জà§à¦® আউট করা হবে" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "চিতà§à¦°à¦¸à¦‚কেত" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "ছোট করা হয়েছে" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "ডেসà§à¦•টপ তল" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "পরবরà§à¦¤à§€ উইনà§à¦¡à§‹" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "পরবরà§à¦¤à§€ উইনà§à¦¡à§‹ (সব উইনà§à¦¡à§‹à¦—à§à¦²à¦¿)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "পরবরà§à¦¤à§€ উইনà§à¦¡à§‹ (কোন পপআপ নেই)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "পপআপ পরিবরà§à¦¤à¦¨à¦•ারী দেখা না গেলে পরবরà§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "পপআপ পরিবরà§à¦¤à¦¨à¦•ারী দেখা না গেলে সব উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° মধà§à¦¯à§‡ পরবরà§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "পপআপ পরিবরà§à¦¤à¦¨à¦•ারী দেখা না গেলে পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "পপআপ পরিবরà§à¦¤à¦¨à¦•ারী দেখা না গেলে সব উইনà§à¦¡à§‹à¦—à§à¦²à¦¿à¦° মধà§à¦¯à§‡ পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ সà§à¦²à¦¾à¦‡à¦¡" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ " #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ (সব উইনà§à¦¡à§‹à¦—à§à¦²à¦¿)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ (কোন পপআপ নেই)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "পরিবরà§à¦¤à¦¨ করার সময় নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ উইনà§à¦¡à§‹à¦Ÿà¦¿ ঘোরান" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "পপআপ উইনà§à¦¡à§‹ না দেখিয়ে পরবরà§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "পপআপ উইনà§à¦¡à§‹ না দেখিয়ে পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "পপআপ উইনà§à¦¡à§‹ না দেখিয়ে পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ উইনà§à¦¡à§‹ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "থামà§à¦¬à¦¨à§‡à¦²à§‡à¦° পরবরà§à¦¤à§€ চিতà§à¦°à¦¸à¦‚কেত পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করা" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "সà§à¦‡à¦šà¦¾à¦°à§‡ যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করা হবে" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 কালারসà§à¦ªà§‡à¦¸ সমরà§à¦¥à¦¨ পà§à¦°à¦¦à¦¾à¦¨ করা" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "ভিডিও পà§à¦²à§‡à¦¬à§à¦¯à¦¾à¦•" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "ভিডিও পà§à¦²à§‡à¦¬à§à¦¯à¦¾à¦•" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 কালারসà§à¦ªà§‡à¦¸" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "লাইন যà§à¦•à§à¦¤ করা" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "বিনà§à¦¦à§ যà§à¦•à§à¦¤ করা" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "বিভিনà§à¦¨ ডেসà§à¦•টপ কারà§à¦¯à¦¾à¦¬à¦²à§€à¦¤à§‡ জলের পà§à¦°à¦­à¦¾à¦¬ পà§à¦°à§Ÿà§‹à¦— করা" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "পà§à¦°à¦¤à§à¦¯à§‡à¦• বৃষà§à¦Ÿà¦¿à¦° ফোà¦à¦Ÿà¦¾à¦° মধà§à¦¯à§‡ বà§à¦¯à¦¬à¦§à¦¾à¦¨ (মিনিটে)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "পয়েনà§à¦Ÿà¦¾à¦° জলের পà§à¦°à¦­à¦¾à¦¬ সমরà§à¦¥ করা" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "লাইন" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "অফসেট সà§à¦•েল" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "বিনà§à¦¦à§" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "বৃষà§à¦Ÿà¦¿à¦° বিলমà§à¦¬" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "শীরà§à¦· তরঙà§à¦—" # why not "token ring"? #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "টোকেন রিং" # why not "token ring"? #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "টোকেন রিং" # why not "token ring"? #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "টোকেন রিং" # why not "token ring"? #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "টোকেন রিং" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "জলের পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "জলের অফসেট সà§à¦•েল" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "উইনà§à¦¡à§‹ শীরà§à¦· থেকে জলের পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "ফোকাসের পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "ফোকাস উইনà§à¦¡à§‹ পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "ফোকাস উইনà§à¦¡à§‹ " #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "পারà§à¦Ÿà¦¿à¦¶à¦¨" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" # দà§à¦¬à¦¨à§à¦¦à§à¦¬ #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "দà§à¦¬à¦¨à§à¦¦à§à¦¬ মীমাংসা:" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "উলà§à¦Ÿà§‹ উইনà§à¦¡à§‹ সà§à¦¨à§à¦¯à¦¾à¦ªà¦¿à¦‚" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "উইনà§à¦¡à§‹à¦Ÿà¦¿à¦•ে কাà¦à¦ªà¦¾à¦¨à§‹" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "মà§à¦¯à¦¾à¦ª পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "মà§à¦¯à¦¾à¦ª উইনà§à¦¡à§‹ পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "সরà§à¦¬à§‹à¦šà§à¦š পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "সরà§à¦¬à¦¨à¦¿à¦®à§à¦¨ গà§à¦°à¦¿à¦¡ আকার" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "সরà§à¦¬à¦¨à¦¿à¦®à§à¦¨ শীরà§à¦· গà§à¦°à¦¿à¦¡à§‡à¦° আকার" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "কমà§à¦ªà¦¨" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª উলà§à¦Ÿà¦¾à¦¨à§‹" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "পারà§à¦Ÿà¦¿à¦¶à¦¨" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "ধাপে ধাপে আগানো" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "ধাপে ধাপে আগানো" # why not "token ring"? #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "টোকেন রিং" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "টলমল উইনà§à¦¡à§‹ পà§à¦°à¦­à¦¾à¦¬à§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ সà§à¦ªà§à¦°à¦¿à¦‚ বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" # দà§à¦¬à¦¨à§à¦¦à§à¦¬ #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "দà§à¦¬à¦¨à§à¦¦à§à¦¬ মীমাংসা:" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "ফোকাস করার সময় যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ টলমল করবে" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "ধরার সময় যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ টলমল করবে" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "মà§à¦¯à¦¾à¦ª করার সময় যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ টলমল করবে" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "সরানোর সময় যে উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ টলমল করবে" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "উইনà§à¦¡à§‹à¦—à§à¦²à¦¿ সরà§à¦¬à¦¾à¦§à¦¿à¦• করা বা না করার সময় টলমল করার পà§à¦°à¦­à¦¾à¦¬" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "টলমলে উইনà§à¦¡à§‹" #, fuzzy #~ msgid "Command line 0" #~ msgstr "কমানà§à¦¡ '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "কমানà§à¦¡ '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "কমানà§à¦¡ লাইন পারà§à¦¸ করতে সমসà§à¦¯à¦¾à¥¤" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "ফিলà§à¦Ÿà¦¾à¦°:" #~ msgid "Use linear filter when zoomed in" #~ msgstr "জà§à¦® ইন করার সময় রৈখিক ফিলà§à¦Ÿà¦¾à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" # label text #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "সময়" #~ msgid "Zoom In" #~ msgstr "জà§à¦® ইন" #~ msgid "Zoom Out" #~ msgstr "জà§à¦® আউট" #~ msgid "Zoom Pan" #~ msgstr "জà§à¦® পà§à¦¯à¦¾à¦¨" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "বাদ দেয়া হয়েছে\n" # label text #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "সময়" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ডেসà§à¦•টপ ঘনক জà§à¦® করা à¦à¦¬à¦‚ পà§à¦¯à¦¾à¦¨ করা" #~ msgid "Zoom factor" #~ msgstr "জà§à¦® ফà§à¦¯à¦¾à¦•à§à¦Ÿà¦°" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "বাদ দেয়া হয়েছে\n" #~ msgid "Decrease window opacity" #~ msgstr "উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ হà§à¦°à¦¾à¦¸ করà§à¦¨" #~ msgid "Increase window opacity" #~ msgstr "উইনà§à¦¡à§‹à¦° অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ বৃদà§à¦§à¦¿ করà§à¦¨" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "উইনà§à¦¡à§‹à¦° যে অসà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦•ে পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚পভাবে অরà§à¦§à¦¸à§à¦¬à¦šà§à¦› করা হবে" #~ msgid "Opacity windows" #~ msgstr "অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ উইনà§à¦¡à§‹" #~ msgid "Background Images" #~ msgstr "পটভূমির চিতà§à¦°à¦—à§à¦²à¦¿" #~ msgid "Background images" #~ msgstr "পটভূমির চিতà§à¦°à¦—à§à¦²à¦¿" # why not "token ring"? #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "টোকেন রিং" #~ msgid "Plane Down" #~ msgstr "নিচের তল" #~ msgid "Plane Left" #~ msgstr "বাà¦à¦¦à¦¿à¦•ের তল" #~ msgid "Plane Right" #~ msgstr "ডানদিকের তল" #~ msgid "Plane To Face 1" #~ msgstr "তল থেকে ফেস 1" #~ msgid "Plane To Face 10" #~ msgstr "তল থেকে ফেস 10" #~ msgid "Plane To Face 11" #~ msgstr "তল থেকে ফেস 11" #~ msgid "Plane To Face 12" #~ msgstr "তল থেকে ফেস 12" #~ msgid "Plane To Face 2" #~ msgstr "তল থেকে ফেস 2" #~ msgid "Plane To Face 3" #~ msgstr "তল থেকে ফেস 3" #~ msgid "Plane To Face 4" #~ msgstr "তল থেকে ফেস 4" #~ msgid "Plane To Face 5" #~ msgstr "তল থেকে ফেস 5" #~ msgid "Plane To Face 6" #~ msgstr "তল থেকে ফেস 6" #~ msgid "Plane To Face 7" #~ msgstr "তল থেকে ফেস 7" #~ msgid "Plane To Face 8" #~ msgstr "তল থেকে ফেস 8" #~ msgid "Plane To Face 9" #~ msgstr "তল থেকে ফেস 9" #~ msgid "Plane Up" #~ msgstr "ওপরের তল" #~ msgid "Plane down" #~ msgstr "নিচের তল" #~ msgid "Plane left" #~ msgstr "বাà¦à¦¦à¦¿à¦•ের তল" #~ msgid "Plane right" #~ msgstr "ডানদিকের তল" #~ msgid "Plane to face 1" #~ msgstr "তল থেকে ফেস 1" #~ msgid "Plane to face 10" #~ msgstr "তল থেকে ফেস 10" #~ msgid "Plane to face 11" #~ msgstr "তল থেকে ফেস 11" #~ msgid "Plane to face 12" #~ msgstr "তল থেকে ফেস 12" #~ msgid "Plane to face 2" #~ msgstr "তল থেকে ফেস 2" #~ msgid "Plane to face 3" #~ msgstr "তল থেকে ফেস 3" #~ msgid "Plane to face 4" #~ msgstr "তল থেকে ফেস 4" #~ msgid "Plane to face 5" #~ msgstr "তল থেকে ফেস 5" #~ msgid "Plane to face 6" #~ msgstr "তল থেকে ফেস 6" #~ msgid "Plane to face 7" #~ msgstr "তল থেকে ফেস 7" #~ msgid "Plane to face 8" #~ msgstr "তল থেকে ফেস 8" #~ msgid "Plane to face 9" #~ msgstr "তল থেকে ফেস 9" #~ msgid "Plane up" #~ msgstr "ওপরের তল" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ডেসà§à¦•টপের উইনà§à¦¡à§‹ অসà§à¦¬à¦šà§à¦›à¦¤à¦¾ মলিন হওয়ার সময়." #, fuzzy #~ msgid "Notification" #~ msgstr "পারà§à¦Ÿà¦¿à¦¶à¦¨" # label for an unknown installed system # try to use simple words #~ msgid "Unknown" #~ msgstr "অজানা" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "অবসà§à¦¥à¦¾ সমà§à¦ªà¦°à§à¦•িত তথà§à¦¯ (&t)" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ দেখাও (&d)" # নিরà§à¦¬à¦¾à¦šà¦¨ #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "বাদ দেয়া হয়েছে\n" # label text #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "সময়" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "রাশিয়ান" # নিরà§à¦¬à¦¾à¦šà¦¨ #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ " # label text #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "সà§à¦¹à¦¾à¦¨à§€à§Ÿ সময়" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "পারà§à¦Ÿà¦¿à¦¶à¦¨" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ধাপে ধাপে আগানো" # দà§à¦¬à¦¨à§à¦¦à§à¦¬ #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "দà§à¦¬à¦¨à§à¦¦à§à¦¬ মীমাংসা:" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "বাদ দেয়া হয়েছে\n" # label text #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "সময়" #, fuzzy #~ msgid "Command line %d" #~ msgstr "কমানà§à¦¡ '%1'" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "ফà§à¦²à¦ªà¦¿ ডিসà§à¦•" #, fuzzy #~ msgid "Terminate" #~ msgstr "পà§à¦°à¦¿à¦¨à§à¦Ÿà¦¾à¦°" compiz-0.9.11+14.04.20140409/po/gl.po0000644000015301777760000026232712321343002017066 0ustar pbusernogroup00000000000000# translation of compiz.po to # traducción de gl-compiz.po to Galician # Compiz Core Galician Translation. # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # This file is distributed under the same license as the Compiz package. # # # Fran Diéguez (GLUG) , 2007, 2009. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-03-29 23:01+0200\n" "Last-Translator: \n" "Language-Team: en_US \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 0.3\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Escritorio" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Xestión de Fiestras" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ningún" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Sombra" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximizar" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Maximizar Horizontalmente" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Maximizar Verticalmente" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimizar" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Elevar" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Baixar" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menú da Fiestra" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Acción a levar a cabo cando se fai acciona a roda do rato na barra de título " "da xanela." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Tipo de desenfoque" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacidade da xanela activa no tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Opacidade da sombra da xanela activa no tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacidade do tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Opacidade da sombra do tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Opacidade a empregar para xanelas activas con decoracións metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacidade a empregar para decoracións metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Escurecer decoración de xanelas activas con temas metacity de opaco cara " "transparente" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Sombrear decoración de xanelas con temas metacity de opaco cara transparente" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Acción da roda do rato na barra de título" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tipo de desenfoque empregado para as decoracións" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Empregar tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Empregar tema metacity ao debuxar as decoracións das xanelas" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Pechar Fiestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Demaximizar Fiestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximizar Fiestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimizar Fiestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Sempre en Primeiro Plano" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Fixar" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Descurecer" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Desfacer Sempre en Primeiro Plano" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Desfixar" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "A xanela \"%s\" non está respondendo." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Se forzar a saída desta aplicación causará a perda dos cambios non gardados." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Forzar Saída" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Anotacións" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Cor de recheo das anotacións" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Cor do pincel das anotacións" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Complemento de Anotacións" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Limpar" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Debuxar" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Debuxar empregando a ferramenta" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Cor de recheo das anotacións" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Iniciar" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Iniciar debuxo das anotacións" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Iniciar goma de borrar das anotacións" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Iniciar goma de borrar" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Ancho da liña" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Ancho da liña para anotacións" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Cor do pincel para anotacións" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Ancho do pincel" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Ancho do pincel para as anotacións" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x Bilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Desenfoque Alfa" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Desenfoque alfa das xanelas" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtro de desenfoque" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Oclusión ou desenfoque" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturación do desenfoque" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Velocidade de desenfoque" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Desenfoque de xanelas" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Desenfocar na parte traseira das xanelas" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturación do desenfoque" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Desenfoca as xanelas" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Desenfocar as xanelas que non teñan foco" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Desactivar desenfoque de rexións de pantalla escurecidas por outras xanelas." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Método de filtrado empregado para desenfocar" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Desenfocar segundo o foco" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Desenfocar xanelas segundo o foco" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gausiano" # name for RUS #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Radio gausiano" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Forza gausiana" # name for RUS #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Radio gausiano" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Forza gausiana" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Recollida de textura independente" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mapa de Imaxe" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mapa de Imaxe LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Nivel de detalle do mapa de imaxe" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulso" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efecto pulso" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Empregar as unidades de textura dispoñibles para facer o maior número " "derecollidas de textura independentes posibles." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Velocidade de desenfoque das xanelas" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Fiestras afectadas polo desenfoque do foco" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Fiestras que deben empregar o-desenfoque alfa por omisión" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Clonación da Saída" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Iniciar selección clonada" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Xestor de clonación de saída" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de " "consolaidentificado polo comando1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de " "consolaidentificado polo comando10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de " "consolaidentificado polo comando11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de " "consolaidentificado polo comando2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Un botón de atalloque, cando é accionado, executa o comando de consola " "identificado polo comando6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de " "consolaidentificado polo comando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de " "consolaidentificado polo comando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de " "consolaidentificado polo comando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de " "consolaidentificado polo comando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Asigna atallos a comandos arbitrarios" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Botóns de atallo" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Liña de comando 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Liña de comando 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Liña de comando 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Liña de comando 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Liña de comando 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Liña de comando 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Liña de comando 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Liña de comando 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Liña de comando 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Liña de comando 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Liña de comando 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Liña de comando 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando0 sexa " "accionado" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando1 sexa " "accionado" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando10 sexa " "accionado" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando11 sexa " "accionado" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando2 sexa " "accionado" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando3 sexa " "accionado" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando4 sexa " "accionado" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando5 sexa " "accionado" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando6 sexa " "accionado" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando7 sexa " "accionado" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando8 sexa " "accionado" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando9 sexa " "accionado" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Comandos" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Atallos de Borde" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Atallos de Teclado" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Executar comando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Executar comando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Executar comando 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Executar comando 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Executar comando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Executar comando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Executar comando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Executar comando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Executar comando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Executar comando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Executar comando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Executar comando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Complementos Activos" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Permitir que o renderizado das xanelas a pantalla completa non sexa " "redirixido a mapas de imaxe fora da pantalla" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Campá audible" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Campá de sistema audible" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Elevación Automática" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Atraso na Elevación Automática" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Detección automática de dispositivos de saída" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Detección automática da taxa de actualización" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Mellor" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Faga Clic para Enfocar" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Ao facer clic na xanela transfírese o foco cara ela" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Pechar a xanela activa" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Icona por defecto" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Imaxe da icona da xanela por defecto" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Tamaño do Escritorio" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detectar Saídas" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detectar Taxa de Actualización" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Configuracións de Pantalla" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "O tempo que o punteiro debe estar no borde da pantalla antes de que acción " "do borde se leve a cabo." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Atraso do Disparador de Acción de Borde" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rápido" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Enfoque & Xestión de Comportamento" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Nivel de Prevención de Enfoque" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Prevención do Enfoque nas Fiestras" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Prevención do enfoque nas xanelas" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Forzar debuxado na saída independente" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Opcións Xerais" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Opcións xerais de compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bo" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ocultar Fiestras Ignorando a Barra de Tarefa" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Ocultar todas as xanelas e enfocar o escritorio" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Agochar as xanelas que non están na barra de tarefas ao entrar no modo " "amosar escritorio" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Alta" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Tamaño Virtual Horizontal" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Empregala compresión para as texturas convertidas dende imaxes" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorar os Consellos Cando Estea Maximizado" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignorar incremento de tamaño e aspecto dos consellos cando a xanela está " "maximizada" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervalo antes da elevación das xanelas seleccionadas" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervalo entre mensaxes ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Atallos de teclado" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Nivel de prevención da perda de enfoque" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Iluminación" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista de engadidos activados" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lista de cadeas que describen os dispositivos de saída" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Baixa" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Fiestra Máis Baixa" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Fiestra máis baixa por debaixo das outras xanelas" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximizar a Fiestra Horizontalmente" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximizar a Fiestra Verticalmente" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximiza a xanela activa" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximiza horizontalmente a xanela activa" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximiza verticalmente a xanela activa" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimiza a xanela activa" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Número de escritorios" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Número de escritorios virtuais" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Apagado" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Só actualizar a pantalla durante o período de limpeza vertical" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Saídas" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Xestión de Saídas Superpostas" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Debuxar cada dispositivo de saída de forma independente, aínda que o " "dispositivo de saída se superpoña" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Atraso de ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Preferir saída máis grande" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Preferir saída máis pequena" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Elevar con un Clic" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Elevar Fiestra" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Elevar xanelas seleccionadas despois dun intervalo de tempo" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Elevar xanela por enriba das restantes" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Elevar xanelas cando se faga clic nelas" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Taxa de Actualización" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplicador do tamaño da pantalla para o tamaño virtual horizontal" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicador do tamaño da pantalla para o tamaño virtual vertical" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Amosar Escritorio" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Animacións Lentas" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Modo intelixente" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sincronizar a VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Compresión de Texturas" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtro de Textura" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtro de Texturas" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Taxa de refresco da pantalla (veces/segundo) " #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Trocar Maximizado da Fiestra" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Trocar Maximizado Horizontal da Fiestra" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Trocar Maximizado Vertical da Fiestra" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Trocar Escurecemento da Fiestra" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Trocar Maximizado da Fiestra Actual" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Trocar Maximizado Horizontal da Fiestra Activa" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Trocar Maximizado Vertical da Fiestra Activa" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Trocar escurecemento da xanela activa" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Trocar o uso de animacións lentas" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Desmaximizar xanela activa" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Desredirección das Fiestras en Pantalla Completa" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Empregar luz difusa cando se transforma a pantalla" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Tamaño Vertical Virtual" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Moi Alta" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Cal dos dispositivos que se superpoñen debería ser o preferido" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Botón de atallo para menú da xanela" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Tecla de atallo para menú da xanela" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Aceleración" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Axustar Imaxe" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Axustar a cara superior á rotación" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avanzar á seguinte cara" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animar Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animar Skydome ao xirar o cubo" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Apariencia" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automático" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Comportamento" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Cor dos lados superior e inferior do cubo" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Cor a utilizar para a cor inferior do gradiente do skydome por omisión" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Cor a utilizar para cor superior do gradiente do skydome por omisión" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Tapas do Cubo" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Cor do Cubo" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cubo de escritorios" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Aceleración de dobrado" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Velocidade de dobrado" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Pasos de dobrado" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Xerar mapas cando sexa posíbel para dimensionado de mellor calidade" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Voltar á anterior cara" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Arquivos de imaxe" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Imaxe a empregar como textura no skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Iniciar transparencia do cubo só se a rotación é iniciada polo rato." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Interior do Cubo" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Interior do cubo" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista de arquivos PNG e SVG que deben ser empregan na cara superior do cubo" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Modo de saída múltiple" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Cubos múltiples" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Seguinte Cara" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Un cubo grande" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacidade Durante a Rotación" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacidade Mentres Non se Roda" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacidade da xanela do escritorio ao rodar" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacidade do escritorio cando non está rotando" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Dispón as xanelas nas caras dun cubo" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Cara Anterior" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Renderizar skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Escalar imaxe" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Escalar imaxes para cubrir a cara superior do cubo" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Seleccione como se mostra o cubo se se empregan dispositivos de saída " "múltiples" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Cor Final do gradiente Skydome" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Cor Inicial do gradiente Skydome" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Imaxe do Skydome" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Velocidade" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Saltos do tempo" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Activar Transparencia só ao rodar co rato" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Cubo Transparente" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Desdobrar" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Desdobrar cubo" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Backend de control do Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Permitir a xeración de mapas de imaxe para as texturas da decoración" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Comando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Activa a xestión da decoración das xanelas" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "Liña de comando a executar se non se está a executar ningún decorador" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Desprazamento X da sombra" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Desprazamento Y da sombra" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Cor da sombra" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacidade da sombra" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Radio da sombra" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Cor da sombra" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Desprazamento X da Sombra" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Desprazamento Y da Sombra" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacidade da Sombra" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Radio da Sombra" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Fiestras con sombra" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Decoración da Fiestra" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Decoracións das xanelas" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Fiestras que se deben decorar" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Fiestras que deben ter sombra" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Brillo (en %) das xanelas bloqueadas" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Velocidade constante" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Constante de tempo" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Escurecer as Fiestras que non Responden" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Escurecer as xanelas que non están a responder ao que o xestor de xanelas " "require" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Modo de Desvanecemento" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Aparecer ao Minimizar/Abrir/Pechar" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Velocidade de Desvanecemento" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Tempo de desvanecemento" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" "Realizar Efecto de Desvanecemento cos eventos de minimizar/abrir/pechar " "xanelas" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efecto de desvanecemento ao soar a campá do sistema" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Amosar as xanelas cando haxa mapeado e desvanecelas cando sexan desmapeadas" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Desvanecer xanelas" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Fiestras Desvanecidas" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Campá Visual a Pantalla Completa" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" "Efecto de desvanecemento da pantalla completa cando sona a campá do sistema" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Saturación das xanelas bloqueadas (en %)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Brillo das Fiestras Bloqueadas" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Saturación das Fiestras Bloqueadas" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Campá Visual" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Modo de desvanecemento das xanelas" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" "Modo \"Velocidade Constante\" para a Velocidade de Desvanecemento das " "Fiestras" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Modo \"Tempo constante\" para a Duración do Desvanecemento de Fiestra" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Fiestras que se deben desvanecer" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Punto de Montaxe" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Punto de montaxe" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Sistema de Ficheiros en Espazo de Usuario" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Sistema de ficheiros en espazo de usuario" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "Configurador de GNoME (GConf)" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Xestor de Configuracións GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Soporte ao bucle principal de GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Compatibilidade con Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Abrir unha terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Opcións para manter a compatibilidade de Compiz co entorno de escritorio " "Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Diálogo de Execución" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Executar comando de terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Capturar pantalla da liña de comando" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Amosar Menú Principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Amosar caixa de diálogo Executar Aplicativo" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Amosar o menú principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Facer unha capturar pantalla" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Facer captura de pantalla dunha xanela" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Liña de comando do terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Liña de comando para captura de pantalla de xanelas" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Xestor de configuracións simples con ficheiros Ini" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Engadido de notificación de cambios en ficheiros" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Xestor de Configuracións Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efecto ao Minimizar" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimizar as Fiestras" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Velocidade de minimizado" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Atraso no minimizado" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Resistencia da Sombra" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Resistencia que opón a sombra ao minimizar a súa xanela" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transforma as xanelas cando son minimizadas e restauradas" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Fiestras se deben transformar cando sexan minimizadas" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Restrinxir Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Restrinxir a coordenada Y á area de traballo" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Non actualizar a posición das xanelas no servidor ata acabar o movemento" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Iniciar Movemento de Fiestras" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Posicionamento preguizoso" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Mover Fiestra" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Atallos de teclado e rato para o movemento máis sinxelo das xanelas" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacidade" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Nivel de opacidade das xanelas en movemento" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Separar e restaurar as xanelas maximizaas cando se arrastren" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Separar as xanelas maximizadas" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Iniciar movemento da xanela" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Brillo" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Decrementar Brillo" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Incrementar Brillo" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Salto no Brillo" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Valores de Brillo para as xanelas" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Decrementar" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Incrementar" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Decrementar Opacidade" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Incrementar opacidade" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Etapa de Opacidade" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Valores de opacidade para as xanelas" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Opacidade, Brillo e Saturación" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Opacidade, Brillo e axustes de Saturación" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturación" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Decremenar Saturación" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Incrementar Saturación" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Salto na Saturación" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Valores de saturación para as xanelas" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Salto" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Opcións especificas para as xanelas" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Valores das xanelas" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Fiestras" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Fiestras que deben ter un brillo diferente por omisión" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Fiestras que deben ter unha opacidade diferente por omisión" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Fiestras que deben ter unha saturación diferente por omisión" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmo a empregar para posicionar as xanelas" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "En Cascada" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centrado" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Colocación de Fiestras Fixadas" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Forzar o colocado das xanelas" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Posicións de áreas de traballo horizontais" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Manter na Ãrea de Traballo" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Manter as xanelas colocadas na área de traballo, aínda que isto signifique " "que a posición poida diferir da posición especificada" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Colocación de Fiestras" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Colocar en tódalas saídas" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Coloca xanelas nas posicións axeitas cando sexan mapeadas" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Modo de Colocación" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Fiestras Colocadas" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Aleatorio" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Selecciona como se debe comportar a colocación de xanelas cando se " "seleccionan saídas múltiples" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Intelixente" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Empregar o dispositivo de saída activo" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Empregar o dispositivo de saída da xanela enfocada" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Empregar o dispositivo de saída co punteiro" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Posicións dos puntos de vista verticais" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Fiestras colocadas nas áreas de traballo" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Entornos de colocación de xanela" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Fiestras que se deben ser colocadas por omisión" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Fiestras que deben ser colocadas en áreas de traballo específicos por omisión" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Fiestras que se deben colocar obrigatoriamente, aínda que se indique no " "xestor de xanelas que se deben evitar a súa colocación" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Fiestras con posicións fixadas" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Fiestras con áreas de traballo fixado" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Entornos" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Posicións X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Posicións X da Ãrea de traballo" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Valores de posición X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Posicións Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Posicións Y da Ãrea de Traballo" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Valores de posición Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Cargador de imaxes Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Coincidencia Regex" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Coincidencia Regex das xanelas" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Atallos de teclado" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Cor do borde" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Cor do borde dos extremos e modos de dimesionado por rectángulos" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Modo de Dimensionado por Omisión" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Modo a empregar por omisión no dimensionado de xanelas" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Cor de recheo" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Cor de recheo empregada para o modo de dimensionado por rectángulo" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Iniciar o Dimensionado Normal de Fiestra" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Iniciar o Dimensionado de Fiestras co Borde" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Iniciar o Dimensionado de Fiestras co Rectángulo" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Iniciar Dimensionado Por Estirado de Fiestras" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Iniciar Dimensión de Fiestras" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Dimensionado Normal de Fiestras" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Contorno" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Dimensionado de Fiestras co Contorno" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rectángulo" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Dimensionado de Fiestras co Rectángulo" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Dimensionar Fiestra" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Dimensionar xanela" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Iniciar dimensionado de xanela" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Iniciar dimensionado de xanelas estirándoas" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Iniciar dimensionado normal da xanela" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Iniciar dimensionado de xanela empregando o contorno" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Iniciar dimensionado da xanela empregando un rectángulo" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Estirado" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Dimensionar Fiestras Estirándoas" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Fiestras que deben empregar dimensionado normal" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Fiestras que deben empregar dimensionado co contorno" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Fiestras que deben empregar o dimensionado por rectángulo" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Fiestras que deben empregar dimensionamento por estiramento" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Cambiar cando se Arrastra cara o Borde" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Xirar con Movemento cara o Borde" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Xirar cando estea o Punteiro no Borde" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Duración do Xiro" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Xirar á area de traballo da esquerda e manter punteiro" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Xirar á área de traballo seguinte ao arrastrar un obxecto cara o borde da " "pantalla" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Xirar á área de traballo seguinte ao mover o punteiro cara o borde da xanela" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Cambiar á área de traballo seguinte ao mover a xanela cara o borde da " "xanela" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Cambiar á área de traballo da dereita e manter punteiro" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inverter eixo Y do movemento do punteiro" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Inverter o eixo Y do Punteiro" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilidade do Punteiro" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Elevar ao accionar a roda do rato" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Elevar xanelas ao accionar a roda do rato" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Cubo xiratorio" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Xirar á Esquerda" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Xirar á Dereita" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Xirar á Esquerda" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Xirar á Esquerda coa Fiestra" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Xirar á Dereita" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Xirar á Dereita arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Xirar a" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Xirar á Cara 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Xirar á Cara 1 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Xirar á Cara 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Xirar á Cara 10 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Xirar á Cara 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Xirar á Cara 11 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Xirar á Cara 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Xirar á Cara 12 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Xirar á Cara 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Xirar á Cara 2 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Xirar á Cara 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Xirar á Cara 3 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Xirar á Cara 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Xirar á Cara 4 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Xirar á Cara 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Xirar á Cara 5 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Xirar á Cara 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Xirar á Cara 6 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Xirar á Cara 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Xirar á Cara 7 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Xirar á Cara 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Xirar á Cara 8 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Xirar á Cara 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Xirar á Cara 9 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Xirar Cubo" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Activa a rotación do cubo a través das áreas de traballo" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Xirar á esquerda" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Xirar á esquerda e arrastrar a xanela activa" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Xirar á dereita" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Xirar á dereita e arrastrar a xanela activa" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Xirar á cara do cubo" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Xirar á cara do cubo coa xanela" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Xirar á cara 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Xirar á cara 1 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Xirar á cara 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Xirar á cara 10 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Xirar á cara 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Xirar á cara 11 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Xirar á cara 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Xirar á cara 12 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Xirar á cara 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Xirar á cara 2 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Xirar á cara 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Xirar á cara 3 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Xirar á cara 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Xirar á cara 4 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Xirar á cara 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Xirar á cara 5 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Xirar á cara 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Xirar á cara 6 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Xirar á cara 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Xirar á cara 7 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Xirar á cara 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Xirar á cara 8 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Xirar á cara 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Xirar á cara 9 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Xirar á área de traballo" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Xirar xanela" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Xirar coa xanela" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Aceleración da Rotación" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Velocidade de Rotación" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Saltos de Tempo da Rotación" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoom da rotación" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilidade do movemento do punteiro" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Xirar o Cubo á Cara Inferior" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Xirar o Cubo á Cara Superior" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Xirar á Cara Inferior" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Xirar á Cara Superior" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Iniciar Rotación" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tempo de espera antes de rodar a área de traballo" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Nivel de Opacidade en porcentaxe" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Grande" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Atallos para Trocar o Modo de Escala" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Atallos de teclado para trocar o modo escala no canto de activalos cando son " "pulsados e desactivados cando se solta." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Facer Clic no Escritorio para Amosalo" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Escurecer Fondo" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Escurecer fondo ao escalar xanelas" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblema" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Entrar no modo Amosar Escritorio cando se faga clic no Escritorio durante o " "Escalado" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Tempo durante o cal se deixa o rato enriba" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Iniciar Selector de Fiestras" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Iniciar selector de xanelas Para Tódalas Fiestras" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Iniciar Selector de Fiestras para Grupos de Fiestras" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Iniciar Selector de Fiestras para Tódalas Fiestras na Saída Actual" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Atallos de teclado para Trocar o Modo Escala" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Os atallos de teclado trocan o modo de escala no canto de activalo cando é " "pulsado e desactivado cando é soltado." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Dispor todas as xanelas e iniciar súa transformación" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Dispor o grupo de xanelas e iniciar súa transformación" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Dispor as xanelas e iniciar súa transformación" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Dispor as xanelas na saída actual e iniciar a súa transformación" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "En tódolos dispositivos de saída" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Só no dispositivo de saída actual" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Icona Superposta" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Superpor un icona nas xanelas cando sexan escaladas" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Escalado" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Escalado de Fiestras" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Velocidade de Escalado" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Saltos na Escala" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Escala de Fiestras" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Selecciona cando son escaladasa xanelas se se empregan múltiples " "dispositivos de saída." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Espazo entre xanelas" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Espaciado" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Tempo (en ms) antes de que o modo de escalado se remate ao pasar sobre unha " "xanela" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Fiestras que deben ser escaladas en modo escala" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Abrir automaticamente a captura de pantalla con esta aplicación" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Cartafol" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Iniciar Rectángulo de Captura de Pantalla " #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Lanzar Aplicación" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Colocar capturas de pantalla neste directorio" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Captura de pantalla" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Complemento para a Captura de Pantalla" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Complemento que activa o soporte para o cargado de imaxes SVG" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Cantidade de brillo en porcentaxe" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Cantidade de saturación en porcentaxe" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Trocador de Aplicación" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Xirar Automaticamente" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Traer ao Frente" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Coloca a xanela seleccionada en primeiro plano" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Afastar o escritorio mentres se cambian as xanelas" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Icona" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimizado" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Seguinte Panel" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Seguinte xanela" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Seguinte Fiestra (Todas as xanelas)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Seguinte Fiestra (Sen xanela sobresaínte)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Amosar trocador se non está visíbel e seleccionar seguinte xanela" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Amosar trocador se non está visíbel e seleccionar a seguinte xanela de " "tódalas xanelas" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Amosar trocador se non está visíbel e seleccionar a xanela anterior" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Amosar trocador se non está visíbel e seleccionar a xanela anterior de todas" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Ant. Panel" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Ant. xanela" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Fiestra anterior (Todas as xanelas)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Fiestra anterior (Sen xanela sobresaínte)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Xirar á xanela seleccionada mentres se cambia" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Seleccionar seguinte xanela de tipo panel." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Seleccionar seguinte xanela sen amosar a xanela sobresaínte" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Seleccionar anterior xanela de tipo panel." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Seleccionar xanela anterior sen amosar a xanela sobresaínte." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Amosar icona ao lado da miniatura" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Amosar xanelas minimizadas" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Velocidade do Cambiador" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Salto do Cambiador" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Cambiador de xanelas" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Fiestras que deben ser amosadas no cambiador" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Se está activado proporciona soporte de espazo de cor YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Reproducción de Vídeo" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" "Aplica algúns cambios no Compiz para dar soporte á reproducción de vídeo sen " "problemas colaterais." #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Espazo de cor YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Engadir liña" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Engadir punto" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Engade efectos de auga a diferentes accións do escritorio" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Atraso (en ms) entre cada gota de chuvia" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Activar efectos de auga co punteiro" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Liña" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Desprazamento da Escala" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punto" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Atraso da chuvia" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Onda dende o título" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Trocar chuvia" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Trocar efecto de chuvia" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Trocar limpiaparabrisas" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Troca o efecto de limpiaparabrisas" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efecto de Auga" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Espaciado entre as ondas de auga" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efecto de onda dende o título da xanela" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efecto de Enfoque" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efecto de Enfoque da Fiestra" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Enfocar Fiestras" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Fricción" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Atracción das xanelas" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Resolución da Grella" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Axuste de xanelas invertido" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Fai que as xanelas semellen xelatina" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efecto ao colocar" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Efecto da Fiestra ao Colocala" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Colocar Fiestras" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efecto ao Maximizar" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Tamaño Mínimo da Grella" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Tamaño Mínimo da Grella Vertex" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Mover Fiestras" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Temblar" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Instantánea invertida" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Axustar xanelas" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fricción do mola" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "K do mola" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Constante do mola" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Trocar axuste de xanelas" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Empregar modelo de mola para simular o efecto xelatinoso nas xanelas" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Resolución da Grella Vertex" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Fiestras que deben semellar xelatina cando son enfocadas" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Fiestras que deben semellar xelatina cando son agarradas" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Fiestras que deben semellar xelatina cando son colocadas" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Fiestras que deben semellar xelatina cando son movidas" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Activar o efecto semellante á xelatina cando se maximizan ou minimizan as xanelas" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Fiestras xelatinosas" #~ msgid "Command line 0" #~ msgstr "Liña de comando 0" #~ msgid "Run command 0" #~ msgstr "Executar comando 0" #~ msgid "Screenshot commands" #~ msgstr "Comandos de Captura de pantalla" #~ msgid "Screenshot key bindings" #~ msgstr "Atallos de teclado para facer captura de pantalla" #~ msgid "Filter Linear" #~ msgstr "Filtro lineal" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Empregar o filtro lineal cando se fai zoom" #~ msgid "Zoom Desktop" #~ msgstr "Zoom do escritorio" #~ msgid "Zoom In" #~ msgstr "Acercar" #~ msgid "Zoom Out" #~ msgstr "Afastar" #~ msgid "Zoom Pan" #~ msgstr "Colocación do Zoom" #~ msgid "Zoom Speed" #~ msgstr "Velocidade de Zoom" #~ msgid "Zoom Timestep" #~ msgstr "Salto de tempo do Zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Afastar e mover cubo do escritorio" #~ msgid "Zoom factor" #~ msgstr "Factor de zoom" #~ msgid "Zoom pan" #~ msgstr "Colocación do Zoom" #~ msgid "Decrease window opacity" #~ msgstr "Reducir opacidade da xanela" #~ msgid "Increase window opacity" #~ msgstr "Aumentar opacidade da xanela" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valores de opacidade para xanelas que deben ser translúcidas por omisión" #~ msgid "Opacity windows" #~ msgstr "Opacidade de xanelas" #~ msgid "Background Images" #~ msgstr "Imaxes de fondo" #~ msgid "Background images" #~ msgstr "Imaxes de fondo" #~ msgid "Place windows on a plane" #~ msgstr "Colocar xanelas nun plano" #~ msgid "Plane Down" #~ msgstr "Plano Abaixo" #~ msgid "Plane Left" #~ msgstr "Plano á esquerda" #~ msgid "Plane Right" #~ msgstr "Plano á dereita" #~ msgid "Plane To Face 1" #~ msgstr "Plano á Cara 1" #~ msgid "Plane To Face 10" #~ msgstr "Plano á Cara 10" #~ msgid "Plane To Face 11" #~ msgstr "Plano á Cara 11" #~ msgid "Plane To Face 12" #~ msgstr "Plano á Cara 12" #~ msgid "Plane To Face 2" #~ msgstr "Plano á Cara 2" #~ msgid "Plane To Face 3" #~ msgstr "Plano á Cara 3" #~ msgid "Plane To Face 4" #~ msgstr "Plano á Cara 4" #~ msgid "Plane To Face 5" #~ msgstr "Plano á Cara 5" #~ msgid "Plane To Face 6" #~ msgstr "Plano á Cara 6" #~ msgid "Plane To Face 7" #~ msgstr "Plano á Cara 7" #~ msgid "Plane To Face 8" #~ msgstr "Plano á Cara 8" #~ msgid "Plane To Face 9" #~ msgstr "Plano á Cara 9" #~ msgid "Plane Up" #~ msgstr "Plano acima" #~ msgid "Plane down" #~ msgstr "Plano abaixo" #~ msgid "Plane left" #~ msgstr "Plano á esquerda" #~ msgid "Plane right" #~ msgstr "Plano á dereita" #~ msgid "Plane to face 1" #~ msgstr "Plano á cara 1" #~ msgid "Plane to face 10" #~ msgstr "Plano á cara 10" #~ msgid "Plane to face 11" #~ msgstr "Plano á cara 11" #~ msgid "Plane to face 12" #~ msgstr "Plano á cara 12" #~ msgid "Plane to face 2" #~ msgstr "Plano á cara 2" #~ msgid "Plane to face 3" #~ msgstr "Plano á cara 3" #~ msgid "Plane to face 4" #~ msgstr "Plano á cara 4" #~ msgid "Plane to face 5" #~ msgstr "Plano á cara 5" #~ msgid "Plane to face 6" #~ msgstr "Plano á cara 6" #~ msgid "Plane to face 7" #~ msgstr "Plano á cara 7" #~ msgid "Plane to face 8" #~ msgstr "Plano á cara 8" #~ msgid "Plane to face 9" #~ msgstr "Plano á cara 9" #~ msgid "Plane up" #~ msgstr "Plano á cima" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Tempo de desvanecemento da opacidade do escritorio" compiz-0.9.11+14.04.20140409/po/pt_BR.po0000644000015301777760000025541512321343002017472 0ustar pbusernogroup00000000000000# translation of compiz.po to Brazilian Portuguese # Compiz Core Brazilian Portuguese Translation. # Copyright (C) 2007 2007 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the compiz package. # # Novell Language , 2006,2007. # Joel Calado , 2007. # Nicolau Gonçalves , 2007. # Emerson Ribeiro de Mello , 2007. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2008-10-30 23:13+0100\n" "Last-Translator: Raylton P. Sousa \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Ambiente de trabalho" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Gerenciamento de janelas" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nenhum" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Dimensionar" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximizar" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximizar Janela Horizontalmente" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximizar Janela Verticalmente" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimizado" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Elevação Automática" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menu da Janela" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Ação a ser tomada ao girar a roda do mouse sobre a barra de título da janela." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Tipo de desfocagem" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacidade da janela ativa no tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Opacidade da sombra da janela ativa no tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacidade do tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Opacidade da sombra do tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Opacidade a ser usada para janelas ativas com decorações metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacidade a ser usada para decorações metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Sombrear decoração de janelas ativas com temas metacity de opaco para " "transparente" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Sombrear decoração de janelas com temas metacity de opaco para transparente" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Ação da roda do mouse no título da janela" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tipo de desfocagem usado para as decorações" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Usar tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Usar tema metacity ao desenhar as decorações das janelas" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Fechar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Desmaximizar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximizar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimizar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Fazer Acima" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Colar" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Desfazer sombreamento" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Desfazer acima" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Descolar" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "A janela \"% s\" não está respondendo." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forçar o fechamento deste aplicativo fará com que você perca todas as " "alterações não salvas " #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Forçar Saida" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Anotar" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Cor de preenchimento das anotações" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Cor do pincel das anotações" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Plugin de Anotações" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Limpar" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Desenhar" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Desenhar usando uma ferramenta" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Cor de preenchimento para anotações" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Iniciar" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Iniciar desenho de anotação" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Iniciar apagador de anotação" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Iniciar apagador" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Espessura da linha" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Espessura da linha para anotações" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Cor do pincel para anotações" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Largura do pincel" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Largura do pincel para anotações" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4X Bilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Desfocagem Alfa" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Desfocagem alfa das janelas" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtro de desfocagem" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Oclusão da desfocagem" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturação da desfocagem" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Velocidade de desfocagem" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Desfocar janelas" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Desfocar por trás de partes transparentes de janelas" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturação da desfocagem" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Desfocar janelas" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Desfocar janelas que não tenham foco" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Desativar desfocagem de regiões da tela obscurecidas por outras janelas." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Método de filtragem usado para desfocar" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Desfocar com base no foco" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Desfocar janelas com base na janela atual" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussiano" # name for RUS #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Raio gaussiano" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Força gaussiana" # name for RUS #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Raio gaussiano" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Força gaussiana" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "MipMap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Nível de detalhe mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulso" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efeito de pulso" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Velocidade de desfocagem das janelas" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Janelas que serão afetadas por desfocagem de foco" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Janelas que devem usar desfocagem alfa por padrão" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Clonar saída" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Iniciar seleção de clone" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Gestor de clonagem de saídas" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando0" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Uma tecla de atalho que, quando acionado, executa o comando identificado " "pelo comando1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Uma tecla de atalho que, quando acionado, executa o comando identificado " "pelo comando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando0" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Uma tecla de atalho que, quando acionado, executa o comando identificado " "pelo comando1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Linha de comando 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Linha de comando 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Linha de comando 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Linha de comando 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Linha de comando 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Linha de comando 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Linha de comando 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Linha de comando 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Linha de comando 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Linha de comando 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Linha de comando 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Linha de comando 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Linha de comando a ser executada quando run_command0 for acionado" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Linha de comando a ser executada quando run_command1 for acionado" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Linha de comando a ser executada quando run_command10 for acionado" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Linha de comando a ser executada quando run_command11 for acionado" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Linha de comando a ser executada quando run_command2 for acionado" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Linha de comando a ser executada quando run_command3 for acionado" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Linha de comando a ser executada quando run_command4 for acionado" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Linha de comando a ser executada quando run_command5 for acionado" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Linha de comando a ser executada quando run_command6 for acionado" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Linha de comando a ser executada quando run_command7 for acionado" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Linha de comando a ser executada quando run_command8 for acionado" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Linha de comando a ser executada quando run_command9 for acionado" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Comando" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Executar comando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Executar comando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Executar comando 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Executar comando 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Executar comando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Executar comando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Executar comando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Executar comando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Executar comando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Executar comando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Executar comando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Executar comando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Plugins Ativos" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Permitir que o desenho das janelas em tela inteira não seja redirecionado " "para pixmaps fora da tela" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Campainha Audível" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Bip audível do sistema " #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Elevação Automática" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Atraso na Elevação Automática" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Detecção automática de dispositivos de saída" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Detecção automática da taxa de atualização" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Melhor" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Clique para Posicionar o Foco" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "O clique na janela transfere o foco para ela" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Fechar a janela ativa" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Ãcone Padrão" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Imagem do ícone padrão da janela" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Cubo da Ãrea de Trabalho" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detectar Saídas" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detectar Taxa de Atualização" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rápido" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Janelas em Prevenção de Destaque" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Janelas em Prevenção de Destaque" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Janelas em prevenção de destaque" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Opções Gerais" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Opções gerais do compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bom" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ocultar Janelas Ignorar Barra de Tarefas" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Ocultar todas as janelas e enfocar área de trabalho" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Ocultar as janelas que não estão na barra de tarefas ao entrar no modo " "mostrar área de trabalho" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Tamanho Virtual Horizontal" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorar dicas quando maximizada" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Ignorar incremento de tamanho e aspecto quando a janela é maximizada" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervalo antes da elevação das janelas selecionadas" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervalo entre mensagens ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Iluminação" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista de plugins atualmente ativos" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lista de caracteres descrevendo os dispositivos de saída" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Janela Mais Baixa" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Janela mais baixa sob as demais janelas" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximizar Janela Horizontalmente" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximizar Janela Verticalmente" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximizar janela ativa" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximizar janela ativa horizontalmente" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximizar janela ativa verticalmente" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimizar janela ativa" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Número de áreas de trabalho" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Número de ambientes virtuais" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Apenas efetuar atualizações de tela durante o período de limpeza vertical" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Saídas" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Atraso de ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Elevar com um Clique" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Elevar janela" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Elevar janelas selecionadas após intervalo" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Elevar janela acima das restantes" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Elevar janelas quando clicadas" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Taxa de Atualização" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplicador de tamanho horizontal da tela para tamanho virtual" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicador de tamanho vertical da tela para tamanho virtual" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Mostrar Ãrea de Trabalho" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Animações Lentas" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "Inteligente" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sincronizar a VBlank" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Filtro de Texturas" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtro de Textura" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtro de Texturas" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Taxa em que a tela é redesenhada (vezes/segundo)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Alternar Janela Maximizada" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Alternar Janela Maximizada Horizontalmente" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Alternar Janela Maximizada Verticalmente" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Alternar Janela Sombreada" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Alternar janela ativa maximizada" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Alternar janela ativa maximizada horizontalmente" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Alternar janela ativa maximizada verticalmente" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Alternar janela ativa sombreada" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Alternar uso de animações lentas" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Desmaximizar janela ativa" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Anular redirecionamento de janelas de tela inteira" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Usar luz difusa quando a tela for transformada" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Tamanho Vertical Virtual" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Botão de atalho para menu da Janela" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Tecla de atalho para menu da Janela" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Aceleração" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Ajustar Imagem" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Ajustar imagem do topo à rotação" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avançar para a próxima lâmina" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animar Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animar Skydome ao girar o cubo" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automático" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Cor dos lados superior e inferior do cubo" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Cor padrão a ser usada no fundo para o gradiente do skydome" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Cor padrão a ser usada no topo para o gradiente do skydome" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Cor do Cubo" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Cor do Cubo" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cubo da Ãrea de Trabalho" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Aceleração de dobragem" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Velocidade de dobragem" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Intervalo de tempo de dobragem" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Gerar mapas quando possível para dimensionamento de melhor qualidade" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Voltar à lâmina anterior" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Arquivos de imagem" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Imagem para usar como textura no skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Iniciar transparência do cubo apenas se a rotação for conduzida pelo mouse." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Dentro do Cubo" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Dentro do cubo" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista de arquivos PNG e SVG que devem ser renderizados na face superior do " "cubo" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Modo de Multi Saída" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Múltiplos cubos" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Próxima Lâmina" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "Grande cubo" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacidade Durante Rotação" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacidade Enquanto Não Roda" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacidade do ambiente de trabalho ao rodar." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacidade do ambiente de trabalho quando estático." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Colocar janelas no cubo" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Lâmina Anterior" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Renderizar skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Dimensionar imagem" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Dimensionar imagens para cobertura da face superior do cubo" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Seleciona como o cubo é desenhado se existirem múltiplos dispositivos de " "saída." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Cor Final do gradiente Skydome" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Cor Inicial do gradiente Skydome" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Imagem do Skydome" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Velocidade" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Intervalo de tempo" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Transparência apenas ao rodar com o mouse" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Desdobrar" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Desdobrar cubo" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Programa interno de controle do Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Permitir a geração de mipmaps para texturas da decoração" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Comando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Decoração das janelas" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Linha de comando a ser executada se nenhum decorador estiver em execução" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Deslocamento X da sombra" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Deslocamento Y da sombra" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Cor da sombra" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacidade da sombra" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Raio da sombra" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Cor da sombra" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Deslocamento X da Sombra" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Deslocamento Y da Sombra" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacidade da Sombra" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Raio da Sombra" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Janelas com sombra" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Decoração da Janela" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Decorações das janelas" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Janelas que devem ser decoradas" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Janelas que devem ter sombra" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Velocidade da Rotação" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Restringir Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Redimensionamento Normal de Janelas" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Tempo de desvanecimento" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Desvanecer ao Minimizar/Abrir/Fechar" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Velocidade de Esmaecimento" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Tempo de desvanecimento" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Efeito de desvanecimento ao eventos de minimizar/abrir/fechar janelas" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efeito de desvanecimento no bip do sistema" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Revitalizar janelas quando houver mapeamento e esmaecê-las quando não houver " "mapeamento" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Desvanecer janelas" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Janelas Desvanecidas" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Campainha Visual de Tela Inteira" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Efeito de desvanecimento de tela inteira ao som de bip do sistema" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Campainha Visual" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Velocidade de desvanecimento das janelas" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Janelas a serem dimensionadas no modo Dimensionar" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Janelas que devem desvanecer" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Ponto de montagem" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Ponto de Montagem" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Sistema de arquivos Userspace" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Sistema de arquivos userspace" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Programa interno de controle do GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Suporte ao loop principal do GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Abrir um terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Caixa de Diálogo Executar" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Linha de comando do terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Capturar tela a partir da linha de comando" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Mostrar Menu Principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Mostrar caixa de diálogo Executar Aplicativo" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Mostrar o menu principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Efetuar uma captura de tela" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Efetuar captura de tela de uma janela" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Linha de comando do terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Linha de comando para captura de tela de janelas" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Programa interno para arquivos ini" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Plugin de notificação de modificação de arquivos" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Programa interno de controle do Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efeito ao Minimizar" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimizar Janelas" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Velocidade de minimização" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Intervalo de tempo de minimização" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Resistência de Sombra" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Resistência ao Sombrear" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformar janelas quando elas forem minimizadas e desminimizadas" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Janelas que devem ser transformadas quando minimizadas" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Restringir Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Restringir a coordenada Y conforme a área de trabalho" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Não atualizar a posição das janelas no lado do servidor até acabar de mover" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Iniciar Movimento de Janelas" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Posicionamento preguiçoso" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Mover Janela" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Mover janela" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacidade" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Nível de opacidade das janelas em movimento" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Janelas maximizadas quebradas e automaticamente desmaximizadas ao arrastar" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Janelas maximizadas quebradas" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Iniciar movimento da janela" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Brilho" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Brilho" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Brilho" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Brilho" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Reduzir Opacidade" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Aumentar Opacidade" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Etapa de mudança de opacidade" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Etapa de mudança de opacidade" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Etapa de Opacidade" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Nível de opacidade das janelas em movimento" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Opacidade Durante Rotação" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturação" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Saturação" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Saturação" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Saturação" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Decorações das janelas" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Valores de opacidade da janela" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Criar Janelas" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Janelas que devem ser posicionadas por padrão" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Janelas que devem ser translúcidas por padrão" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Janelas que devem ser posicionadas por padrão" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmo usado para a disposição das janelas" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Cascata" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centralizado" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Gerenciamento de janelas" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Janelas em Prevenção de Destaque" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Posições horizontais" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Colocar Janelas" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Colocar janelas nas posições apropriadas quando houver mapeamento" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Modo de disposição" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Janelas posicionadas" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Aleatório" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Seleciona onde as janelas são dimensionadas se existirem múltiplos " "dispositivos de saída." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Inteligente" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "Em todos os dispositivos de saída" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Posições verticais" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Janelas posicionadas na janela de visualização" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Soluções para disposição das janelas" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Janelas que devem ser posicionadas por padrão" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Janelas que devem ser posicionadas por padrão em janelas de visualização " "específicas" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Decorações das janelas" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Soluções" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Posições X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Posições X da janela de visualização" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Valores da posição X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Posições Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Posições Y da janela de visualização" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Valores da posição Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Carregar imagens Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Filtragem através de expressões regulares" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Filtragem de janelas através de expressões regulares" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Cor da borda" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Cor do contorno usado para o modo contorno e retangular de redimensionameto" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Modo padrão de redimensionamento" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Modo a usar por padrão para o redimensionamento de janelas" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Cor de preenchimento" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Cor de preenchimento usada para o modo retangular de redimensionamento" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Iniciar Redimensionamento Normal de Janelas" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Iniciar Redimensionamento do contorno de Janelas" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Iniciar Redimensionamento Retangular de Janelas" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Iniciar Redimensionamento Esticado de Janelas" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Iniciar Redimensionamento de Janelas" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Redimensionamento Normal de Janelas" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Contorno" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Redimensionar janelas pelo contorno" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Retângulo" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Redimensionar Janelas retangularmente" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Redimensionar Janela" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Redimensionar janela" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Iniciar redimensionamento da janela" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Iniciar redimensionamento da janela esticando-a" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Iniciar redimensionamento normal da janela" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Iniciar redimensionamento da janela usando o contorno" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Iniciar redimensionamento da janela usando um retângulo" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Esticar" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Redimensionar janelas esticando-as" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Janelas que devem usar redimensionamento normal" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Janelas que devem usar redimensionamento pelo contorno" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Janelas que devem usar redimensionamento retangular" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Janelas que devem usar redimensionamento por esticamento" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD de Inversão de Bordas" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Movimento de Inversão de Bordas" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Ponteiro de Inversão de Bordas" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Tempo de Inversão" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Rodar para a janela de visualização da esquerda e manter ponteiro" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Inverter para janela de visualização seguinte ao arrastar o objeto para a " "borda da tela" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Inverter para a janela de visualização seguinte ao mover o ponteiro para a " "borda da tela" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Inverter para janela de visualização seguinte ao mover a janela para a borda " "da tela" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Rodar para janela de visualização da direita e manter ponteiro" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inverter o eixo Y para movimento do ponteiro" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Inverter Y com o Ponteiro" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilidade do Ponteiro" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Elevar ao rodar" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Elevar janelas ao rodar" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Girar Cubo" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Girar para a Esquerda" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Girar para a Direita" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Girar para a Esquerda" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Girar para a Esquerda com Janela" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Girar para a Direita" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Girar para a Direita com Janela" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Girar para" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Girar para Face 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Girar para Face 1 com Janela" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Girar para a Face 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Girar para a Face 10 com Janela" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Girar para a Face 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Girar para a Face 11 com Janela" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Girar para a Face 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Girar para a Face 12 com Janela" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Girar para a Face 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Girar para a Face 2 com Janela" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Girar para a Face 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Girar para a Face 3 com Janela" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Girar para a Face 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Girar para a Face 4 com Janela" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Girar para a Face 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Girar para a Face 5 com Janela" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Girar para a Face 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Girar para a Face 6 com Janela" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Girar para a Face 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Girar para a Face 7 com Janela" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Girar para a Face 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Girar para a Face 8 com Janela" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Girar para a Face 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Girar para a Face 9 com Janela" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Girar Cubo" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Girar cubo da área de trabalho" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Girar para a esquerda" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Girar para a esquerda e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Girar para a direita" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Girar para a direita e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Girar para a face 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Girar para Face 1 com Janela" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Girar para a face 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Girar para a face 1 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Girar para a face 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Girar para a face 10 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Girar para a face 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Girar para a face 11 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Girar para a face 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Girar para a face 12 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Girar para a face 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Girar para a face 2 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Girar para a face 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Girar para a face 3 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Girar para a face 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Girar para a face 4 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Girar para a face 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Girar para a face 5 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Girar para a face 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Girar para a face 6 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Girar para a face 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Girar para a face 7 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Girar para a face 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Girar para a face 8 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Girar para a face 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Girar para a face 9 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Girar para a janela de visualização" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Girar janela" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Girar com janela" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Aceleração da Rotação" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Velocidade da Rotação" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Intervalo de tempo da Rotação" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoom da rotação" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilidade do movimento do ponteiro" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "Fechar a Rotação do Cubo na Face Superior" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Fechar a Rotação do Cubo na Face Superior" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "Fechar na Face Superior" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Fechar na Face Superior" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Iniciar Rotação" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tempo de espera até a rodar a janela de visualização" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Volume de opacidade em percentagem" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Grande" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Clicar na área de trabalho para mostrar a área de trabalho" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Escurecer Segundo Plano" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Escurecer segundo plano ao dimensionar janelas" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblema" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Entrar no modo Mostrar Ãrea de Trabalho quando o ambiente é clicado durante " "o dimensionamento" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Tempo a pairar" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Iniciar Seletor de Janelas" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Iniciar Selector de Janelas para Todas as Janelas" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Iniciar Selector de Janelas para Grupo de Janelas" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Iniciar Selector de Janelas para Todas as Janelas na Saída Atual" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Criar layout de todas as janelas e iniciar sua transformação" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Criar layout de grupo de janelas e iniciar sua transformação" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Criar layout das janelas e iniciar sua transformação" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Criar layout de janelas na saída atual e iniciar sua transformação" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Em todos os dispositivos de saída" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Apenas no dispositivo de saída atual" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Ãcone de sobreposição" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Sobrepor um ícone nas janelas quando elas são dimensionadas" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Dimensionar" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Janelas a dimensionar" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Velocidade de Dimensionamento" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Etapa de dimensionamento" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Dimensionar janelas" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Seleciona onde as janelas são dimensionadas se existirem múltiplos " "dispositivos de saída." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Espaço entre janelas" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Espaçamento" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Tempo (em ms) antes que o modo de dimensionar seja terminado ao pairar sobre " "uma janela" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Janelas a serem dimensionadas no modo Dimensionar" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Abrir automaticamente captura de tela nesta aplicação" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Diretório" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Captura de uma parte retangular da tela" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Iniciar Aplicação" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Colocar capturas de telas neste diretório" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Capturar tela" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Plugin de captura de tela" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Carregar imagens svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Quantidade de brilho em percentagem" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Quantidade de saturação em percentagem" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Alternador de Aplicativos" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Rodar Automaticamente" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Colocar em Primeiro Plano" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Colocar a janela selecionada em primeiro plano" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Distância a que o ambiente deve ficar reduzido ao alternar janelas" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ãcone" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimizado" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Plano da área de trabalho" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Próxima Janela" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Próxima Janela (Todas as janelas)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Próxima Janela (Sem popup)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Mostrar alternador se não estiver visível e selecionar próxima janela" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Mostrar alternador se não estiver visível e selecionar próxima janela de " "todas" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Mostrar alternador se não estiver visível e selecionar janela anterior" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Mostrar alternador se não estiver visível e selecionar janela anterior de " "todas" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Lâmina Anterior" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Janela anterior" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Janela anterior (Todas as janelas)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Janela anterior (Sem popup)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Rodar para a janela selecionada ao alternar" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Selecionar próxima janela sem mostrar o popup de janelas." #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Selecionar janela anterior sem mostrar o popup de janelas." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Selecionar janela anterior sem mostrar o popup de janelas." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Mostrar ícone ao lado da miniatura" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Mostrar janelas minimizadas" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Velocidade do alternador" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Intervalo de tempo do alternador" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Janelas a alternar" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Janelas que devem ser mostradas no alternador" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Proporciona suporte para o espaço de cor YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Reprodução Vídeo" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Reprodução de vídeos" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Espaço cor YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Adicionar linha" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Adicionar ponto" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Adiciona efeitos de água a diferentes ações no ambiente de trabalho" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Atraso (em ms) entre cada queda de gota de chuva" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Ativar efeitos de água no cursor" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Linha" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Distância do dimensionamento" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Ponto" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Atraso Chuva" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Onda do título" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Alternar chuva" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Ativar/desativar efeito chuva" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Ativar/desativar Limpador de parabrisas" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Ativar/desativar efeito Limpador de parabrisas" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efeito Ãgua" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Distância do dimensionamento durante efeito de água" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efeito de onda do título da janela" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efeito Foco" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efeito Focar Janela" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Focar Janelas" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Fricção" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Agarrar Janelas" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Resolução da grade" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Inverter o efeito de atração/resistência de janelas" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Faz tremer a janela" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efeito Criação" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Efeito Criação Janela" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Criar Janelas" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efeito Maximizar" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Tamanho mínimo da grade" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Tamanho mínimo do vértice da grade" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Mover Janelas" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Tremer" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Atração Invertida" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Atrair janelas" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fricção Mola" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Constante K Mola" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Constante Mola" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Alternar atração/resistência das janelas" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Usar um modelo de uma mola para o efeito de janelas gelatinosas" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Resolução do vértice da grade" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Janelas que devem ser gelatinosas quando focadas" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Janelas que devem ser gelatinosas quando agarradas" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Janelas que devem ser gelatinosas quando criadas" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Janelas que devem ser gelatinosas quando movidas" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efeito gelatina quando se maximizam e minimizam janelas" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Janelas Gelatinosas" #~ msgid "Command line 0" #~ msgstr "Linha de comando 0" #~ msgid "Run command 0" #~ msgstr "Executar comando 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Capturar tela a partir da linha de comando" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Capturar tela a partir da linha de comando" #~ msgid "Filter Linear" #~ msgstr "Filtro Linear" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Usar filtro linear quando ampliado" #~ msgid "Zoom Desktop" #~ msgstr "Zoom da Ãrea de Trabalho" #~ msgid "Zoom In" #~ msgstr "Mais Zoom" #~ msgid "Zoom Out" #~ msgstr "Menos Zoom" #~ msgid "Zoom Pan" #~ msgstr "Mover Zoom" #~ msgid "Zoom Speed" #~ msgstr "Velocidade do Zoom" #~ msgid "Zoom Timestep" #~ msgstr "Intervalo de tempo do Zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Ampliar e deslocar o cubo da área de trabalho" #~ msgid "Zoom factor" #~ msgstr "Fator de zoom" #~ msgid "Zoom pan" #~ msgstr "Deslocar zoom" #~ msgid "Decrease window opacity" #~ msgstr "Reduzir opacidade da janela" #~ msgid "Increase window opacity" #~ msgstr "Aumentar opacidade da janela" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valores de opacidade para janelas que devem ser translúcidas por padrão" #~ msgid "Opacity windows" #~ msgstr "Opacidade de janelas" #~ msgid "Background Images" #~ msgstr "Imagens de fundo" #~ msgid "Background images" #~ msgstr "Imagens de fundo" #~ msgid "Place windows on a plane" #~ msgstr "Colocar janelas num plano" #~ msgid "Plane Down" #~ msgstr "Plano Abaixo" #~ msgid "Plane Left" #~ msgstr "Plano à esquerda" #~ msgid "Plane Right" #~ msgstr "Plano à direita" #~ msgid "Plane To Face 1" #~ msgstr "Plano à Face 1" #~ msgid "Plane To Face 10" #~ msgstr "Plano à Face 10" #~ msgid "Plane To Face 11" #~ msgstr "Plano à Face 11" #~ msgid "Plane To Face 12" #~ msgstr "Plano à Face 12" #~ msgid "Plane To Face 2" #~ msgstr "Plano à Face 2" #~ msgid "Plane To Face 3" #~ msgstr "Plano à Face 3" #~ msgid "Plane To Face 4" #~ msgstr "Plano à Face 4" #~ msgid "Plane To Face 5" #~ msgstr "Plano à Face 5" #~ msgid "Plane To Face 6" #~ msgstr "Plano à Face 6" #~ msgid "Plane To Face 7" #~ msgstr "Plano à Face 7" #~ msgid "Plane To Face 8" #~ msgstr "Plano à Face 8" #~ msgid "Plane To Face 9" #~ msgstr "Plano à Face 9" #~ msgid "Plane Up" #~ msgstr "Plano acima" #~ msgid "Plane down" #~ msgstr "Plano abaixo" #~ msgid "Plane left" #~ msgstr "Plano à esquerda" #~ msgid "Plane right" #~ msgstr "Plano á direita" #~ msgid "Plane to face 1" #~ msgstr "Plano à face 1" #~ msgid "Plane to face 10" #~ msgstr "Plano à face 10" #~ msgid "Plane to face 11" #~ msgstr "Plano à face 11" #~ msgid "Plane to face 12" #~ msgstr "Plano à face 12" #~ msgid "Plane to face 2" #~ msgstr "Plano à face 2" #~ msgid "Plane to face 3" #~ msgstr "Plano à face 3" #~ msgid "Plane to face 4" #~ msgstr "Plano à face 4" #~ msgid "Plane to face 5" #~ msgstr "Plano à face 5" #~ msgid "Plane to face 6" #~ msgstr "Plano à face 6" #~ msgid "Plane to face 7" #~ msgstr "Plano à face 7" #~ msgid "Plane to face 8" #~ msgstr "Plano à face 8" #~ msgid "Plane to face 9" #~ msgstr "Plano à face 9" #~ msgid "Plane up" #~ msgstr "Plano acima" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Tempo de desvanecimento da opacidade do ambiente de trabalho" compiz-0.9.11+14.04.20140409/po/pt.po0000644000015301777760000026051012321343002017077 0ustar pbusernogroup00000000000000# Compiz Core Portuguese Translation. # Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Novell Language , 2006,2007. # Joel Calado , 2007. # Nicolau Gonçalves , 2007. # msgid "" msgstr "" "Project-Id-Version: Compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-04-07 09:33+0200\n" "Last-Translator: Nicolau Gonçalves \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Ambiente de trabalho" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Gestão de Janelas" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nenhum" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Encolher" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximizar" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Maximizar Horizontalmente" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Maximizar Verticalmente" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimizar" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Elevar" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Baixar" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menu da Janela" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Acção a tomar quando se move a roda do rato no título de uma janela." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Tipo de desfocagem" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacidade da janela activa no tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Opacidade da sombra da janela activa no tema do metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacidade do tema do metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Opacidade da sombra do tema do metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Opacidade a usar para janelas activas com decorações metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacidade a usar para decorações do metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Sombrear decoração de janelas activas com temas metacity de opaco para " "transparente" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Sombrear decoração de janelas com temas metacity de opaco para transparente" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Acção da roda do rato no título da janela" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tipo de desfocagem usado para as decorações" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Usar tema do metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Usar tema do metacity ao desenhar as decorações das janelas" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Fechar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Desmaximizar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximizar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimizar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Colocar no Topo" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Stick" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Desencolher" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Retirar do Topo" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Unstick" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "A janela \"%s\" não está a responder." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forçar a aplicação a terminar causará perda de alterações não guardadas." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Forçar saída" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Anotar" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Cor de preenchimento das anotações" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Cor do pincel das anotações" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Plugin de anotações" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Limpar" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Desenhar" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Desenhar usando uma ferramenta" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Cor de preenchimento para anotações" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Iniciar" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Iniciar desenho de anotação" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Iniciar apagador de anotação" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Iniciar apagador" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Esperssura da linha" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Espessura da linha para anotações" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Cor do pincel para anotações" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Largura do pincel" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Largura do pincel para anotações" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Desfocagem Alpha" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alpha-desfocar janelas" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtro de desfocagem" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Oclusão da desfocagem" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturação da desfocagem" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Velocidade de desfocagem" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Desfocar janelas" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Desfocar por trás de partes transparentes de janelas" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturação da desfocagem" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Desfocar janelas" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Desfocar janelas que não tenham foco" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Desactivar desfocagem de regiões de ecrã obscurecidas por outras janelas." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Método de filtragem usado para desfocar" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Desfocar com base no foco" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Desfocar janelas com base na janela actual" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussiano" # name for RUS #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Raio gaussiano" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Força gaussiana" # name for RUS #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Raio gaussiano" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Força gaussiana" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Obtenção de texturas independentes" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Nível de detalhe mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulso" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efeito de pulso" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Usar as unidades de textura disponíveis para obter o maior número possível " "de texturas independentes." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Velocidade de desfocagem das janelas" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Janelas que devem ser afectadas por desfocagem de foco" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Janelas que devem usar alfa-desfocagem por omissão" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Clonar saída" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Iniciar selecção de clone" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Gestor de clonagem de saídas" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Atribuir atalhos a comandos arbitrários" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Atalhos" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Linha de comando 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Linha de comando 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Linha de comando 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Linha de comando 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Linha de comando 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Linha de comando 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Linha de comando 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Linha de comando 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Linha de comando 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Linha de comando 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Linha de comando 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Linha de comando 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command0 for accionado" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command1 for acionado" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command10 for acionado" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command11 for acionado" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command2 for acionado" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command3 for acionado" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command4 for acionado" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command5 for acionado" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command6 for acionado" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command7 for acionado" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command8 for acionado" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command9 for acionado" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Comandos" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Atalhos de margem de ecrã" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Teclas de atalho" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Executar comando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Executar comando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Executar comando 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Executar comando 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Executar comando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Executar comando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Executar comando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Executar comando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Executar comando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Executar comando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Executar comando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Executar comando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Plug-ins Ativos" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Permitir que o desenho das janelas em tela inteira não seja redirecionado " "para pixmaps fora da tela" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Campainha Audível" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Bip audível do sistema" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Elevação Automática" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Atraso na Elevação Automática" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Detecção automática de dispositivos de saída" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Detecção automática da taxa de atualização" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Melhor" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Clique para Posicionar o Foco" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "O clique na janela transfere o foco para ela" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Fechar a janela activa" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Ãcone Padrão" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Imagem do ícone padrão da janela" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Tamanho da Ãrea de Trabalho" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detectar Saídas" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detectar Taxa de Atualização" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Definições do Ecrã" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Tempo que o cursor do rato deve estar na margem do ecrã antes de executar " "uma acção de margem." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Tempo Activação Margem" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rápido" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Comportamento de Focar e Elevar" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Nível Prevenção Foco" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Janelas em Prevenção de Destaque" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Janelas em prevenção de destaque" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Forçar desenho independente dos dispositivos de saída." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Opções Gerais" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Opções gerais do compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bom" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ocultar Janelas Ignorar Barra de Tarefas" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Esconder todas as janelas e colocar foco na área de trabalho" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Ocultar as janelas que não estão na barra de tarefas ao entrar no modo " "mostrar área de trabalho" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Alto" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Tamanho Virtual Horizontal" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Se disponível, usar compressão para texturas convertidas de imagens" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorar dicas quando maximizada" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Ignorar incremento de tamanho e aspecto quando a janela é maximizada" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervalo antes da elevação das janelas selecionadas" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervalo entre mensagens ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Teclas de atalho" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Nível de prevenção de roubo de foco" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Iluminação" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista de plug-ins atualmente ativos" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lista de strings descrevendo os dispositivos de saída" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Baixo" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Baixar a Janela" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Janela mais baixa sob as demais janelas" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximizar Janela Horizontalmente" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximizar Janela Verticalmente" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximizar janela activa" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximizar janela activa horizontalmente" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximizar janela activa verticalmente" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimizar janela activa" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Número de áreas de trabalho" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Número de ambientes virtuais" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Desligado" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Apenas efectuar actualizações de ecrã durante o período de limpeza vertical" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Saídas" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Gestão Saídas Sobrepostas" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Desenhar cada dispositivo de saída independentemente, mesmo que os " "dispositivos de saída se sobreponham" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Atraso de ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Preferir saída maior" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Preferir saída menor" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Elevar com um Clique" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Elevar janela" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Elevar janelas selecionadas após intervalo" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Elevar janela acima das restantes" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Elevar janelas quando clicadas" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Taxa de Atualização" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplicador de tamanho horizontal de ecrã para tamanho virtual" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicador de tamanho vertical de ecrã para tamanho virtual" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Mostrar Ãrea de Trabalho" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Animações Lentas" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Modo inteligente" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sincronizar a VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Compressão Texturas" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtro de Textura" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtro de texturas" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Taxa em que o ecrã é redesenhado (vezes/segundo)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Alternar Janela Maximizada" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Alternar Janela Maximizada Horizontalmente" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Alternar Janela Maximizada Verticalmente" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Alternar Janela Sombreada" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Alternar janela activa maximizada" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Alternar janela activa maximizada horizontalmente" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Alternar janela activa maximizada verticalmente" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Alternar janela activa sombreada" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Alternar uso de animações lentas" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Restaurar janela activa" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Anular redirecionamento de janelas de tela inteira" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Usar luz difusa quando a tela for transformada" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Tamanho Vertical Virtual" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Elevado" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Qual dos dispositivos de saída sobrepostos deve ser preferido" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Botão de atalho para menu da janela" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Tecla de atalho para menu da janela" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Aceleração" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Ajustar Imagem" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Ajustar imagem do topo à rotação" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avançar para o slide seguinte" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animar Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animar skydome ao girar o cubo" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Aparência" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automático" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Comportamento" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Cor dos lados superior e inferior do cubo" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Cor a utilizar para o fundo do gradiente por omissão do skydome" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Cor a utilizar para o topo do gradiente por omissão do skydome" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Topos Cubo" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Cor do Cubo" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cubo da Ãrea de Trabalho" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Aceleração de dobragem" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Velocidade de dobragem" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Timestep de dobragem" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Gerar mapas quando possível para dimensionamento de melhor qualidade" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Voltar ao slide anterior" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Arquivos de imagem" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Imagem a usar como textura no skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Iniciar transparência do cubo apenas se a rotação por conduzida pelo rato." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Dentro do Cubo" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Dentro do cubo" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista de arquivos PNG e SVG que devem ser renderizados na face superior do " "cubo" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Modo de Multi Saída" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Múltiplos cubos" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Próximo Slide" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Um cubo grande" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacidade Durante Rotação" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacidade Enquanto Não Roda" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacidade do ambiente de trabalho ao rodar." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacidade do ambiente de trabalho quando estático." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Colocar janelas no cubo" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Slide Anterior" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Renderizar skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Dimensionar imagem" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Dimensionar imagens para cobertura da face superior do cubo" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Selecciona como o cubo é desenhado se existirem múltiplos dispositivos de " "saída." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Cor Final do gradiente Skydome" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Cor Inicial do gradiente Skydome" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Imagem do Skydome" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Velocidade" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Espaço de tempo" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Transparência apenas ao rodar com o rato" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Cubo Transparente" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Desdobrar" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Desdobrar cubo" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Backend de controlo Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Permitir a geração de mipmaps para texturas da decoração" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Comando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Janelas a decorar" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "Linha de comando a executar se não estiver nenhum decorador a correr" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Deslocamento X da sombra" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Deslocamento Y da sombra" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Cor da sombra" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacidade da sombra" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Raio da sombra" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Cor da sombra" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Deslocamento X da Sombra" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Deslocamento Y da Sombra" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacidade da Sombra" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Raio da Sombra" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Janelas com sombra" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Decoração da Janela" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Decorações das janelas" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Janelas que devem ser decoradas" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Janelas que devem ter sombra" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Luminosidade (em %) de janelas que não respondem" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Velocidade constante" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Tempo constante" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Escurecer Janelas que Não Respondem" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "Escurece janelas que não respondem aos pedidos do gestor de janelas" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Velocidade de Esmaecimento" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Desvanecer ao Minimizar/Abrir/Fechar" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Velocidade de Esmaecimento" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Tempo de Esmaecimento" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Efeito de desvanecimento ao eventos de minimizar/abrir/fechar janelas" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efeito de esmaecimento no bip do sistema" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Avivar janelas quando houver mapeamento e esmaecê-las quando não houver " "mapeamento" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Desvanecer janelas" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Janelas Esmaecidas" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Campainha Visual de Tela Inteira" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Efeito de esmaecimento de tela inteira ao som de bip do sistema" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Saturação (em %) de janelas que não respondem" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Luminosidade Janelas que Não Respondem" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Saturação Janelas que Não Respondem" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Campainha Visual" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Modo de esvaecimento das janelas" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" "Velocidade de esmaecimento das janelas, em modo \"Velocidade constante\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" "Tempo de esmaecimento (em ms) das janelas, em modo \"Velocidade constante\"" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Janelas que devem desvanecer" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Ponto Montagem" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Ponto de montagem" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Sistema de Ficheiros Userspace" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Sistema de ficheiros userspace" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Backend de controlo do GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Suprte ao loop principal do GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Compatibilidade Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Abrir um terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Opções que mantêm o Compiz compatível com o ambiente de trabalho Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Caixa de Diálogo Executar" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Executar comando de terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Linha de comando para capturar ecrã" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Mostrar Menu Principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Mostrar caixa de diálogo Executar Aplicativo" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Mostrar o menu principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Efetuar uma captura de tela" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Efetuar captura de tela de uma janela" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Linha de comando do terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Linha de comando para captura de tela de janelas" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Backend de ficheiro simples ini" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Plugin de notificação de ficheiros" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Backend de controlo Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimizar Efeito" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimizar Janelas" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Velocidade de minimização" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Timestep de minimização" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Resistência de Sombra" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Resistência ao sombrear" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformar janelas quando elas forem minimizadas e desminimizadas" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Janelas que devem ser transformadas quando minimizadas" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Restringir Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Restringir a coordenada Y conforme a área de trabalho" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Não actualizar a posição das janelas no lado do servidor até acabar de mover" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Iniciar Movimento de Janelas" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Posicionamento preguiçoso" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Mover Janela" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Mover janela" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacidade" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Nível de opacidade das janelas em movimento" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Janelas maximizadas quebradas e automaticamente desmaximizadas ao arrastar" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Janelas maximizadas quebradas" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Iniciar movimento da janela" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Brilho" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Diminuir Brilho" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Aumentar Brilho" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Incremento Brilho" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Valores de brilho para janelas" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Diminuir" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Aumentar" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Diminuir Opacidade" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Aumentar Opacidade" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Etapa de Opacidade" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Valores de opacidade para janelas" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Opacidade, Brilho e Saturação" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Ajustes de Opacidade, Brilho e Saturação" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturação" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Diminuir Saturação" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Aumentar Saturação" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Incremento Saturação" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Valores de saturação para janelas" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Incremento" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Definições específicas de janelas" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Valores para a janela" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Janelas" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Janelas que devem ter um brilho diferente por omissão" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Janelas que devem ter uma opacidade diferente por omissão" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Janelas que devem ter uma saturação diferente por omissão" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmo usado para dispor janelas" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Cascata" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centrado" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Posicionamento Fixo de Janelas" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Forçar Colacação Janelas" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Posições horizontais" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Manter Na Ãrea Trabalho" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Manter janelas colocadas na área de trabalho, mesmo que isso signifique que " "a posição possa diferir da posição especificada" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Colocar Janelas" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Colocar em todos os dispositivos de saída" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Colocar janelas nas posições apropriadas quando houver mapeamento" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Modo de disposição" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Janelas posicionadas" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Aleatório" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Selecciona como a colocação de janelas se deve comportar se estiverem " "seleccionados múltiplos dispositivos de saída." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Inteligente" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Usar dispositivo de saída activo" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Usar dispositivo de saída da janela com foco" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Usar dispositivo de saída com cursor" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Posições verticais" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Janelas posicionadas no viewport" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Soluções para colocação de janelas" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Janelas que devem ser posicionadas por omissão" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Janelas que devem ser posicionadas em viewports específicos por omissão" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Janelas que devem ser posicionadas, mesmo que indiquem que o gestor de " "janelas deve evitar posicioná-las." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Janelas com posições fixas" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Janelas com viewport fixo" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Soluções" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Posições X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Posições X do viewport" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Valores de posição X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Posições Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Posições Y do viewport" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Valores de posição Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Carregar imagens png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Filtragem Regex" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Filtro regex de janelas" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Atalhos" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Cor da borda" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Cor do contorno usado para o modo contorno e rectangular de redimensionameto" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Modo de redimensionamento por omissão" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Modo a usar por omissão para redimensionamento de janelas" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Cor de preenchimento" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" "Cor de preenchimento usada para o modo rectangular de redimensionamento" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Iniciar Redimensionamento Normal de Janelas" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Iniciar Redimensionamento esqueleto de Janelas" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Iniciar Redimensionamento Rectangular de Janelas" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Iniciar Redimensionamento Esticado de Janelas" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Iniciar Redimensionamento de Janelas" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Redimensionamento Normal de Janelas" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Contorno" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Redimensionar janelas pelo contorno" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rectângulo" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Redimensionar Janelas rectangularmente" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Redimensionar Janela" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Redimensionar janela" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Iniciar redimensionamento da janela" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Iniciar redimensionamento da janela esticando-a" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Iniciar redimensionamento normal da janela" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Iniciar redimensionamento da janela usando o contorno" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Iniciar redimensionamento da janela usando um rectângulo" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Esticar" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Redimensionar janelas esticando-as" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Janelas que devem usar redimensionamento normal" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Janelas que devem usar redimensionamento pelo contorno" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Janelas que devem usar redimensionamento rectangular" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Janelas que devem usar redimensionamento por esticamento" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD de Inversão de Bordas" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Movimento de Inversão de Bordas" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Ponteiro de Inversão de Bordas" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Tempo de Inversão" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Rodar para o viewport da esquerda e manter ponteiro" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Inverter para o viewport seguinte ao arrastar o objeto para a borda da tela" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Inverter para o viewport seguinte ao mover o ponteiro para a borda da tela" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Inverter para o viewport seguinte ao mover a janela para a borda da tela" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Rodar para o viewport da direita e manter ponteiro" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inverter o eixo Y para movimento do ponteiro" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Inverter Y com o Ponteiro" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilidade do Ponteiro" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Elevar ao rodar" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Elevar janelas ao rodar" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Girar Cubo" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Rodar para a Esquerda" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Rodar para a Direita" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Girar para a Esquerda" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Girar para a Esquerda com Janela" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Girar para a Direita" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Girar para a Direita com Janela" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Rodar para" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Rodar para Face 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Rodar para Face 1 com Janela" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Girar para a Face 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Girar para a Face 10 com Janela" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Girar para a Face 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Girar para a Face 11 com Janela" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Girar para a Face 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Girar para a Face 12 com Janela" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Girar para a Face 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Girar para a Face 2 com Janela" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Girar para a Face 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Girar para a Face 3 com Janela" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Girar para a Face 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Girar para a Face 4 com Janela" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Girar para a Face 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Girar para a Face 5 com Janela" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Girar para a Face 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Girar para a Face 6 com Janela" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Girar para a Face 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Girar para a Face 7 com Janela" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Girar para a Face 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Girar para a Face 8 com Janela" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Girar para a Face 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Girar para a Face 9 com Janela" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Girar cubo" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Girar cubo da área de trabalho" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Girar para a esquerda" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Rodar para a esquerda e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Girar para a direita" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Rodar para a direita e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Rodar para face do cubo" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Rodar para face do cubo arrastando janela" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Rodar para a face 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Rodar para a face 1 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Girar para a face 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Girar para a face 10 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Girar para a face 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Girar para a face 11 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Girar para a face 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Girar para a face 12 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Girar para a face 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Girar para a face 2 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Girar para a face 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Girar para a face 3 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Girar para a face 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Girar para a face 4 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Girar para a face 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Girar para a face 5 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Girar para a face 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Girar para a face 6 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Girar para a face 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Girar para a face 7 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Girar para a face 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Girar para a face 8 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Girar para a face 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Girar para a face 9 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Rodar para o viewport" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Rodar janela" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Rodar com janela" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Aceleração da Rotação" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Velocidade da Rotação" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Timestep da Rotação" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoom da rotação" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilidade do movimento do ponteiro" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Fechar a Rotação do Cubo na Face Inferior" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Fechar a Rotação do Cubo na Face Superior" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Fechar na Face Inferior" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Fechar na Face Superior" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Iniciar Rotação" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tempo de espera até a rodar o viewport" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Volume de opacidade em percentagem" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Grande" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Botão de Atalho Alternar Modo Dimensionamento" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Botão de atalho que alterna o modo de dimensionamento em vez de o activar " "quando premido ou desactivar quando libertado." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Clicar área de trabalho para Mostrar Ãrea" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Escurecer Segundo Plano" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Escurecer segundo plano ao dimensionar janelas" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblema" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Entrar no modo Mostrar Ãrea de Trabalho quando o ambiente é clicado durante " "o dimensionamento" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Tempo a pairar" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Iniciar Seletor de Janelas" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Iniciar Selector de Janelas para Todas as Janelas" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Iniciar Selector de Janelas para Grupo de Janelas" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Iniciar Selector de Janelas para Todas as Janelas na Saída Actual" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Tecla de Atalho Alternar Modo Dimensionamento" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Tecla de atalho que alterna o modo de dimensionamento em vez de o activar " "quando premida e desactivar quando libertada." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Criar layout de todas as janelas e iniciar sua transformação" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Criar layout de grupo de janelas e iniciar sua transformação" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Criar layout das janelas e iniciar sua transformação" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Criar layout de janelas na saída actual e iniciar sua transformação" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Em todos os dispositivos de saída" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Apenas no dispositivo de saída actual" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Ãcone de Instalação Sobreposta" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Sobrepor um ícone nas janelas quando elas são dimensionadas" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Dimensionar" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Janelas a dimensionar" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Velocidade de dimensionamento" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Etapa de dimensionamento" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Dimensionar janelas" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Selecciona onde as janelas são dimensionadas se existirem múltiplos " "dispositivos de saída." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Espaço entre janelas" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Espaçamento" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Tempo (em ms) antes que o modo de dimensionar seja terminado ao pairar sobre " "uma janela" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Janelas a serem dimensionadas no modo dimensionar" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Abrir automaticamente captura de ecrã nesta aplicação" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Directório" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Captura de secção rectangular do ecrã" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Iniciar Aplicação" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Colocar capturas de ecrã neste directório" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Captura de ecrã" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Plugin de captura de ecrã" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Carregar imagens svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Quantidade de brilho em percentagem" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Quantidade de saturação em percentagem" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Alternador de Aplicativos" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Rodar Automaticamente" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Colocar em Primeiro Plano" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Colocar a janela selecionada em primeiro plano" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Distância a que o ambiente deve ficar reduzido ao alternar janelas" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ãcone" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimizado" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Painel Seguinte" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Próxima janela" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Próxima Janela (Todas as janelas)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Próxima Janela (Sem popup)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Mostrar alternador se não estiver visível e seleccionar próxima janela" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Mostrar alternador se não estiver visível e seleccionar próxima janela de " "todas" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" "Mostrar alternador se não estiver visível e seleccionar janela anterior" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Mostrar alternador se não estiver visível e seleccionar janela anterior de " "todas" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Painel Anterior" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Janela anterior" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Janela anterior (Todas as janelas)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Janela anterior (Sem popup)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Rodar para a janela seleccionada ao alternar" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Seleccionar tipo de janela do painel seguinte." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Seleccionar próxima janela sem mostrar o popup de janelas." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Seleccionar tipo de janela do painel anterior." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Seleccionar janela anterior sem mostrar o popup de janelas." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Mostrar ícone ao lado da miniatura" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Mostrar janelas minimizadas" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Velocidade do alternador" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Timestep do alternador" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Janelas a alternar" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Janelas que devem ser mostradas no alternador" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Proporciona suporte para o espaço de cor YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Reprodução Vídeo" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Reprodução de vídeos" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Espaço cor YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Adicionar linha" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Adicionar ponto" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Adiciona efeitos de água a diferentes acções no ambiente de trabalho" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Atraso (em ms) entre cada queda de gota de chuva" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Activar efeitos de água no cursor" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Linha" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Offset do escalamento" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Ponto" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Atraso Chuva" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Onda do título" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Alternar chuva" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Activar/desactivar efeito chuva" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Alternar limpapárabrisas" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Activar/desactivar efeito limpapárabrisas" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efeito Ãgua" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Offset do escalamento durante efeito de água" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efeito de onda do título da janela" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efeito Foco" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efeito Focar Janela" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Focar Janelas" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Fricção" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Agarrar Janelas" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Resolução Grelha" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Inverter o efeito de atracção/resistência de janelas" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Faz tremer a janela" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efeito Criação" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Efeito Criação Janela" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Criar Janelas" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efeito Maximizar" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Tamanho Grelha Mínimo" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Tamanho Mínimo da Grelha de Esquinas" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Mover Janelas" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Tremer" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Atracção Invertida" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Atrair janelas" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fricção Mola" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Constante K Mola" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Constante Mola" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Alternar atracção/resistència das janelas" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Usar um modelo de uma mola para o efeito de janelas gelatinosas" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Resolução Grelha Esquinas" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Janelas que devem ser gelatinosas quando focadas" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Janelas que devem ser gelatinosas quando agarradas" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Janelas que devem ser gelatinosas quando criadas" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Janelas que devem ser gelatinosas quando movidas" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efeito gelatina quando se maximizam e minimizam janelas" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Janelas Gelatinosas" #~ msgid "Command line 0" #~ msgstr "Linha de comando 0" #~ msgid "Run command 0" #~ msgstr "Executar comando 0" #~ msgid "Screenshot commands" #~ msgstr "Comandos para capturar ecrã" #~ msgid "Screenshot key bindings" #~ msgstr "Atalhos de teclado para capturar ecrã" #~ msgid "Filter Linear" #~ msgstr "Filtro Linear" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Usar filtro linear quando magnificado" #~ msgid "Zoom Desktop" #~ msgstr "Zoom Ãrea de Trabalho" #~ msgid "Zoom In" #~ msgstr "Mais Zoom" #~ msgid "Zoom Out" #~ msgstr "Menos Zoom" #~ msgid "Zoom Pan" #~ msgstr "Mover Zoom" #~ msgid "Zoom Speed" #~ msgstr "Velocidade Zoom" #~ msgid "Zoom Timestep" #~ msgstr "Salto Temporal Zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Magnificar e deslocar o cubo da área de trabalho" #~ msgid "Zoom factor" #~ msgstr "Fator de magnificação" #~ msgid "Zoom pan" #~ msgstr "Deslocar zoom" #~ msgid "Decrease window opacity" #~ msgstr "Reduzir opacidade da janela" #~ msgid "Increase window opacity" #~ msgstr "Aumentar opacidade da janela" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valores de opacidade para janelas que devem ser translúcidas por omissão" #~ msgid "Opacity windows" #~ msgstr "Opacidade de janelas" #~ msgid "Background Images" #~ msgstr "Imagens de fundo" #~ msgid "Background images" #~ msgstr "Imagens de fundo" #~ msgid "Place windows on a plane" #~ msgstr "Colocar janelas num plano" #~ msgid "Plane Down" #~ msgstr "Plano Abaixo" #~ msgid "Plane Left" #~ msgstr "Plano à esquerda" #~ msgid "Plane Right" #~ msgstr "Plano à direita" #~ msgid "Plane To Face 1" #~ msgstr "Plano à Face 1" #~ msgid "Plane To Face 10" #~ msgstr "Plano à Face 10" #~ msgid "Plane To Face 11" #~ msgstr "Plano à Face 11" #~ msgid "Plane To Face 12" #~ msgstr "Plano à Face 12" #~ msgid "Plane To Face 2" #~ msgstr "Plano à Face 2" #~ msgid "Plane To Face 3" #~ msgstr "Plano à Face 3" #~ msgid "Plane To Face 4" #~ msgstr "Plano à Face 4" #~ msgid "Plane To Face 5" #~ msgstr "Plano à Face 5" #~ msgid "Plane To Face 6" #~ msgstr "Plano à Face 6" #~ msgid "Plane To Face 7" #~ msgstr "Plano à Face 7" #~ msgid "Plane To Face 8" #~ msgstr "Plano à Face 8" #~ msgid "Plane To Face 9" #~ msgstr "Plano à Face 9" #~ msgid "Plane Up" #~ msgstr "Plano acima" #~ msgid "Plane down" #~ msgstr "Plano abaixo" #~ msgid "Plane left" #~ msgstr "Plano à esquerda" #~ msgid "Plane right" #~ msgstr "Plano á direita" #~ msgid "Plane to face 1" #~ msgstr "Plano à face 1" #~ msgid "Plane to face 10" #~ msgstr "Plano à face 10" #~ msgid "Plane to face 11" #~ msgstr "Plano à face 11" #~ msgid "Plane to face 12" #~ msgstr "Plano à face 12" #~ msgid "Plane to face 2" #~ msgstr "Plano à face 2" #~ msgid "Plane to face 3" #~ msgstr "Plano à face 3" #~ msgid "Plane to face 4" #~ msgstr "Plano à face 4" #~ msgid "Plane to face 5" #~ msgstr "Plano à face 5" #~ msgid "Plane to face 6" #~ msgstr "Plano à face 6" #~ msgid "Plane to face 7" #~ msgstr "Plano à face 7" #~ msgid "Plane to face 8" #~ msgstr "Plano à face 8" #~ msgid "Plane to face 9" #~ msgstr "Plano à face 9" #~ msgid "Plane up" #~ msgstr "Plano acima" #~ msgid "Desktop Window Opacity Fade Time.Fade Time" #~ msgstr "" #~ "Tempo de Desvanecimento da Opacidade do Ambiente de trabalho.Tempo de " #~ "desvanecimento" compiz-0.9.11+14.04.20140409/po/bs.po0000644000015301777760000020075012321343002017060 0ustar pbusernogroup00000000000000# Bosnian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2001 SuSE GmbH. # Copyright (C) 2002 SuSE Linux AG. # Damir Bjelobradic , 2001. # Amila Akagic , 2002. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2002-07-23 18:27+0200\n" "Last-Translator: Damir Bjelobradic \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Desktop postavke" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Windhoek" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nijedan" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Vrijednost" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Windhoek" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Windhoek" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "&Postavi filter" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Indija" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Indija" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Indija" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Indija" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Indija" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Indija" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Filter: %1" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "&Postavi filter" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Sajgon" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Sajgon" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "&Postavi filter" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Windhoek" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Sajgon" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Windhoek" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Ruski" # RU #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Ruska Federacija" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Ruski" # RU #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Ruska Federacija" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Ruski" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "Lima" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Lima" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windhoek" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Indija" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "&Podrazumjevani" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "Podrazumjevani datum &isteka" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Desktop postavke" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "Logging" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" # SH #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Saint Helena" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "Ponovi &mjeru" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Desktop postavke" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Konfiguracije" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "&Postavi filter" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "&Postavi filter" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "&Postavi filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D ubrzanje:" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sidnej" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Indija" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Desktop postavke" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D ubrzanje:" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "&Testiraj" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "&Testiraj" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "lokalno vrijeme" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sidnej" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Sidnej" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "lokalno vrijeme" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "&Testiraj" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Windhoek" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Bez opisa" # RU #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "Ruska Federacija" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "&Testiraj" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Mountain" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "&Testiraj" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "lokalno vrijeme" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "&Testiraj" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Windhoek" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "lokalno vrijeme" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "Mountain" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "Windhoek" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "Windhoek" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Windhoek" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Sajgon" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Sajgon" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Sajgon" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Sajgon" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" # RU #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Ruska Federacija" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windhoek" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windhoek" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Windhoek" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Windhoek" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "Windhoek" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" # RU #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "Ruska Federacija" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" # RU #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Ruska Federacija" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Indija" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Desktop postavke" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Desktop postavke" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Desktop postavke" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D ubrzanje:" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Pono&vo pokreni detekciju" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Indija" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Vrijednost" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Windhoek" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "lokalno vrijeme" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "lokalno vrijeme" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Windhoek" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Å panija" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Indija" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Indija" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Opis" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Desktop postavke" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "lokalno vrijeme" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "lokalno vrijeme" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" # SH #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Saint Helena" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Opis" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Rezolucije:" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Opis" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Å panija" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Å panija" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Rezolucije:" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Windhoek" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filter: %1" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Desktop postavke" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Plane down" #~ msgstr "Windhoek" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Notification" #~ msgstr "Opis" #~ msgid "Unknown" #~ msgstr "Nepoznato" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Sajgon" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D ubrzanje:" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "&Testiraj" # RU #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Ruska Federacija" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Ruski" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D ubrzanje:" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "lokalno vrijeme" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "lokalno vrijeme" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Opis" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Å panija" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "&Postavi filter" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Rezolucije:" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Corners" #~ msgstr "Å tampaÄi" compiz-0.9.11+14.04.20140409/po/fr.po0000644000015301777760000026762712321343002017103 0ustar pbusernogroup00000000000000# translation of compiz.po to fr-compiz.po # Copyright (C) 2007 compiz-fusion.org # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # This file is distributed under the same license as the Compiz package. # # Tristan RABLAT , 2007. # Bruno Patri , 2007. msgid "" msgstr "" "Project-Id-Version: fr-compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-06-24 17:17+0200\n" "Last-Translator: Alvin Meimoun \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Bureau" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Gestion des Fenêtres" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Aucun" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Ombrer" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximiser" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Maximiser horizontalement" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Maximiser verticalement" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimiser" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Augmenter" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Diminuer" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menu de la fenêtre" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Action à accomplir en tournant la molette de la souris sur la barre de titre " "d'une fenêtre" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Type de flou" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacité de la fenêtre active du thème Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Nuance de l'opacité de la fenêtre active du thème Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacité du thème Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Nuance de l'opacité du thème Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Opacité à utiliser pour les fenêtres actives avec les décorations des thèmes " "Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacité à utiliser pour les décorations des thèmes Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Nuancer les fenêtres actives avec les décorations du thème Metacity, " "d'opaque à transparent" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Nuancer les fenêtres avec les décorations du thème Metacity, d'opaque à " "transparent" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Action de la molette de souris sur la barre de titre" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Type de flou utilisé pour les décorations des fenêtres" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Utiliser le thème Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Utiliser le thème Metacity pour dessiner les décorations de fenêtres" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Fermer la fenêtre" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Restaurer la fenêtre" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Optimiser la fenêtre" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimiser la fenêtre" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Placer au dessus" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Coller" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Ne plus ombrer" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Ne plus placer au dessus" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Décoller" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "La fenêtre \"%s\" ne répond pas." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forcer cette application à quitter causera la perte de tout changement non " "enregistré." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Forcer à quitter" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Annoter" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Couleur de remplissage des annotations" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Couleur du contour des annotations" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Extension \"Annotation\"" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Effacer" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Dessiner" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Dessiner avec un outil" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Couleur de remplissage des annotations" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Lancer" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Lancer le dessin d'annotations" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Lancer l'effacement des annotations" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Lancer l'effacement" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Largeur de ligne" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Largeur de ligne des annotations" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Couleur du contour des annotations" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Largeur du contour" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Largeur du contour des annotations" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "Bilinéaire 4x" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Flou Alpha" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Flou Alpha Fenêtres" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtre flou" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Occlusion Floue" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturation du flou" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Vitesse de flou" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Flouter les fenêtres" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Flou derrière les parties transparentes des fenêtres" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturation du flou" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Flouter les fenêtres" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Flouter les fenêtres qui n'ont pas le focus" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Désactiver le flou des régions de l'écran obscurcies par d'autres fenêtres" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Méthode de filtrage utilisée pour le flou" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Flou du focus" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Le focus floute les fenêtres" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussien" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Rayon Gaussien" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Puissance Gaussienne" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Rayon Gaussien" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Puissance Gaussienne" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Récupérer la texture indépendante" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Niveau de détail des Mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulsation" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Effet de pulsation" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "utiliser les unités de texture disponible pour récupérer autant que possible " "la texture indépendante" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Vitesse de floutage de la fenêtre" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Types de fenêtres devant utiliser le flou du focus" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Types de fenêtres devant utiliser le fondu par défaut" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Cloner la sortie" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Sélection du mode vidéo (clône)" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Manipulateur de clône de sortie" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command0" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command0" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Assignation de commandes arbitraires" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Assignation des boutons" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Ligne de commande 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Ligne de commande 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Ligne de commande 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Ligne de commande 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Ligne de commande 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Ligne de commande 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Ligne de commande 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Ligne de commande 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Ligne de commande 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Ligne de commande 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Ligne de commande 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Ligne de commande 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command0 est appelé" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command1 est appelé" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command10 est appelé" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command11 est appelé" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command2 est appelé" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command3 est appelé" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command4 est appelé" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command5 est appelé" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command6 est appelé" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command7 est appelé" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command8 est appelé" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command9 est appelé" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Commandes" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Assignation des bords" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Assignation des touches" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Exécuter la commande 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Exécuter la commande 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Exécuter la commande 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Exécuter la commande 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Exécuter la commande 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Exécuter la commande 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Exécuter la commande 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Exécuter la commande 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Exécuter la commande 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Exécuter la commande 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Exécuter la commande 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Exécuter la commande 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Extensions actives" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Empêcher la redirection vers des pixmaps hors de l'écran lors de l'affichage " "des fenêtres plein écran" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Cloche audible" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Signal sonore du système audible" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Remontée automatique" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Délai de remontée automatique" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Détection automatiques des périphériques de sortie" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Détection automatique de la fréquence de rafraîchissement" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Meilleur" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Cliquer pour obtenir le focus" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Si vous cliquez sur la fenêtre, vous déplacez le focus dessus" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Fermer la fenêtre active" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Icône par défaut" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Image de l'icône de la fenêtre par défaut" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Taille du bureau" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Détection des sorties" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Détecter la fréquence de rafraîchissement" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Paramètres d'affichage" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Durée pendant laquelle le pointeur doit rester au bord de l'écran avant que " "l'action ait lieu." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Délai de déclenchement des bordures" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rapide" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Comportement de la prise de focus & de l'augmentation" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Niveau de sensibilité du Focus" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Fenêtres prévenues du Focus" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "fenêtres prévenues du focus" # coloration trouvé plus juste que peinture #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Forcer le rendement indépendant de coloration" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Options Générales" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Options Générales de Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bon" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Masquer les fenêtres de la barre des tâches" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Masquer toutes les fenêtres et afficher le bureau" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Masquer les fenêtres qui ne se trouvent pas dans la barre des tâches lorsque " "vous passez en mode d'affichage du bureau" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Élevé" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Taille virtuelle horizontale" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "Si elle est disponible, utiliser la compression des textures venant d'images " "converties" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorer les conseils lorsque la fenêtre est agrandie" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignorer l'incrément de taille et les conseils d'aspect lorsque la fenêtre " "est agrandie" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervalle avant de remonter les fenêtres sélectionnées" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervalle entre les messages ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Assignation des touches" # En français, on ne vole pas un focus mais je n'ai pas trouvé mieux. #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Niveau de sensibilité du vol de Focus" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Éclairage" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Liste des extensions (plugins) actuellement actives" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Liste des chaînes décrivant les périphériques de sortie" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Faible" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Abaisser la fenêtre" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Abaisser la fenêtre sous d'autres fenêtres" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Optimiser la fenêtre horizontalement" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Optimiser la fenêtre verticalement" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Optimiser la fenêtre active" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Optimiser la fenêtre active horizontalement" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Optimiser la fenêtre active verticalement" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimiser la fenêtre active" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Nombre de bureaux" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Nombre de bureaux virtuels" # En français, on/off est compris par tout le monde et on préfèreéviter de réutiliser le mot désactivé #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Off" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "N'effectuer les mises à jour de l'écran que lors de la période de vidage " "vertical" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Sorties" # Traduction très peu sûre #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Chevauchement de manipulations de sorties" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Peindre chaque sortie de périphérique indépendamment, même si elles se " "chevauchent." #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Délai du Ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Préférer une sortie plus grande" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Préférer une sortie plus petite" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Remonter au clic" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Remonter la fenêtre" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Remonter les fenêtres sélectionnées après l'intervalle" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Remonter la fenêtre au-dessus des autres" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Remonter les fenêtres lorsque vous cliquez dessus" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Fréquence de rafraîchissement" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplicateur de taille d'écran pour taille virtuelle horizontale" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicateur de taille d'écran pour taille virtuelle verticale" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Afficher le Bureau" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Ralentir les animations" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Mode Élégant" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sync vers VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Compression de texture" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtre de texture" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtrage de texture" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Vitesse à laquelle l'écran est redessiné (fois/seconde)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Basculer la fenêtre agrandie" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Basculer la fenêtre agrandie horizontalement" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Basculer la fenêtre agrandie verticalement" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Basculer la fenêtre ombrée" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Basculer la fenêtre active agrandie" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Basculer la fenêtre active agrandie horizontalement" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Basculer la fenêtre active agrandie verticalement" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Basculer la fenêtre active ombrée" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Basculer l'utilisation d'animations lentes" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Restaurer la fenêtre active" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Ne pas rediriger les fenêtres plein écran" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Utiliser la lumière diffuse lorsque l'écran est transformé" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Taille virtuelle verticale" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Très élevé" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Quel périphérique de sortie chevauchée devrait être préférée" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Bouton de racourci du menu de la fenêtre" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Touche de racourci du menu de la fenêtre" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Accélération" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Ajuster l'Image" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Ajuster l'image de la face supérieure à la rotation" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Passer à la diapositive suivante" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animer le Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animer le Skydome lors de la rotation de cube" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Apparence" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatique" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Comportement" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Couleur des côtés supérieur et inférieur du cube" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Couleur à utiliser pour l'arrêt de couleur inférieure du gradient de rappel " "de Skydome" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Couleur à utiliser pour l'arrêt de couleur supérieure du gradient de rappel " "de Skydome" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Habillage du cube" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Couleur du cube" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cube du Bureau" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Accélération de pliage" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Vitesse de pliage" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Intervalle de pliage" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "Générer des mipmaps dans la mesure du possible pour une mise à l'échelle de " "meilleure qualité" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Revenir à la diapositive précédente" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Fichiers image" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Image à utiliser comme texture pour le Skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Rendre le Cube transparent seulement si la rotation est contrôlée par la " "souris" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Vue de l'intérieur du Cube" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "À l'intérieur du cube" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Liste de fichiers PNG et SVG à afficher sur la face supérieure du cube" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Mode de sorties multiples" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Cubes multiples" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Diapositive suivante" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Un grand cube" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacité pendant la rotation" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacité à l'arrêt" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacité de la fenêtre du bureau pendant la rotation" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacité de la fenêtre du bureau à l'arrêt" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Placer des fenêtres sur le cube" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Diapositive précédente" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Afficher le Skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Mettre l'image à l'échelle" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Mettre les images à l'échelle pour couvrir la face supérieure du cube" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Choisir comment le cube est affiché si plusieurs périphériques de sortie " "sont utilisés" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Couleur de fin du gradient du Skydome" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Couleur de début du gradient du Skydome" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Image du Skydome" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Vitesse" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Intervalle" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Transparence seulement si la souris contrôle la rotation" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Cube transparent" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Déplier" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Déplier le cube" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "DBus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Backend de contrôle DBus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Permettre la génération de mipmaps pour les textures de décoration" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Commande" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Décoration des fenêtres" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Ligne de commande du décorateur qui est exécutée si aucun décorateur ne " "fonctionne" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Décalage X de l'ombre des gouttes" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Décalage Y de l'ombre des gouttes" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Couleur de l'ombre des gouttes" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacité de l'ombre des gouttes" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Rayon de l'ombre des gouttes" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Couleur de l'ombre" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Décalage X de l'ombre" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Décalage Y de l'ombre" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacité de l'ombre" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Rayon de l'ombre" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Ombrer les fenêtres" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Décoration de la fenêtre" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Décorations des fenêtres" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Types de fenêtres devant être décorées" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Types de fenêtres devant avoir une ombre" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Luminosité (en %) des fenêtres ne répondant pas" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Vitesse constante" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Temps constant" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Fenêtres ne répondant pas ternes" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Les Fenêtres ternes qui ne répondent pas aux requêtes du gestionnaire de " "fenêtres." #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Mode de Fondu" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Fondu quand une fenêtre est Minimisée/ouverte/fermée" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Vitesse de fondu" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Temps de Fondu" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Effet de fondu lors des événements Minimiser/Ouvrir/Fermer la fenêtre" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Effet de fondu au signal sonore du système" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "Apparition/disparition en fondu des fenêtres à l'ouverture/fermeture" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Fondu des Fenêtres" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Types de fenêtres à animer" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Cloche visuelle plein écran" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Effet de fondu plein écran au signal sonore du système" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Saturation (en %) des fenêtres ne répondant pas" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Luminosité d'une fenêtre ne répondant pas" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Saturation d'une fenêtre ne répondant pas" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Cloche visuelle" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Mode de fondu de la fenêtre" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Vitesse du fondu d'une fenêtre dans le mode de \"Vitesse constante\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" "Temps (en ms) du fondu d'une fenêtre dans le mode de \"Vitesse constante\"" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Types de Fenêtres devant utiliser le fondu" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Point de montage" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Point de montage" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Système de fichier de l'Espace Utilisateur" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Système de fichier de l'espace utilisateur" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Backend de contrôle GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Support de la boucle principale GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Compatibilité avec Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Ouvrir un terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Options qui rendent Compiz compatible avec l'environnement de bureau Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Boîte de dialogue d'exécution" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Commande pour lancer le Terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Ligne de commande de capture d'écran" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Afficher le menu principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Afficher la boîte de dialogue d'exécution de l'application" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Afficher le menu principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Faire une capture d'écran" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Faire une capture d'écran d'une fenêtre" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Commande à lancer pour le Terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Ligne de commande de capture de fenêtre" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini (Ne pas modifier)" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini Flat File Backend" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Extension pour la notification de modification de fichier" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Backend de contrôle Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Effet de Minimisation" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimiser la fenêtre" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Vitesse de minimisation" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Intervalle de minimisation" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Résistance de l'Ombre" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Résistance de l'ombre" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformer les fenêtres lorsqu'elles sont réduites ou agrandies" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Types de fenêtres à transformer lorsqu'elles sont réduites" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Contraindre Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Contraindre la coordonnée Y à être dans la zone de l'espace de travail" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Ne pas mettre à jour la position de la fenêtre coté serveur, tant que son " "mouvement n'est pas fini" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Lancer le déplacement de fenêtre" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Positionnement souple" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Déplacer la fenêtre" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Déplacer la fenêtre" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacité" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Niveau d'opacité pour déplacer des fenêtres" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Désactiver l'alignement et la démaximisation automatique des fenêtres " "lorsque vous les faites glisser" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Désactiver l'alignement des fenêtres agrandies" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Démarrer le déplacement de la fenêtre" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Luminosité" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Réduire la luminosité" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Augmenter la luminosité" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Incrément de luminosité" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Valeur de la luminosité des fenêtres" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Réduire" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Augmenter" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Réduire l'opacité" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Augmenter l'opacité" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Incrément d'opacité" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Valeurs d'opacité des fenêtres" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Opacité, luminosité et saturation" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Ajustement de l'opacité, de la luminosité et de la saturation" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturation" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Réduire la saturation" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Augmenter la saturation" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Incrément de la saturation" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Valeurs de saturation des fenêtres" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Incrément" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Réglages spécifiques des fenêtres" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Valeurs des fenêtres" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Fenêtres" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Fenêtres devant avoir une luminosité différente par défaut" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Fenêtres devant avoir une opacité différente par défaut" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Fenêtres devant avoir une saturation différente par défaut" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algorithme à utiliser pour le déplacement des fenêtres" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Cascade" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centré" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Placement des fenêtres fixes" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Forcer le Placement d'une fenêtre" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Positions du viewport horizontal" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Garder dans la Zone de Travail" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Garder la fenêtre dans la zone de travail, même si cela signifie que la " "position peut différer de celle spécifiée" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Placer des fenêtres" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Placer à travers toutes les sorties" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Placer des fenêtres aux positions correctes lorsqu'elles sont mappées" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Mode de placement" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Fenêtres positionnées" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Aléatoire" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Sélectionne comme un emplacement de fenêtre pourrait se comporter si " "plusieurs sorties sont sélectionnées" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Intelligent" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Utilise la périphérique de sortie actif" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Utilise la périphérique de sortie sur la fenêtre active" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Utilise la périphérique de sortie avec le pointeur" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Positions du viewport vertical" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Fenêtres positionnées sur un bureau" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Solutions de placement de fenêtre" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Fenêtres devant être positionnées par défaut" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Types de fenêtres qui devraient être positionnées sur un bureau spécifique " "par défaut" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Les fenêtres pourrait être forcées à se situer, même si elles indiquent que " "le gestionnaire de fenêtre pourrait éviter de les situer." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Fenêtres avec des positions fixes" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Fenêtres avec un \"viewport\" fixe" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Solutions" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Positions en X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Positions du viewport en X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Valeurs de la position en X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Positions en Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Positions du viewport en Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Valeurs de la position en Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Chargeur d'Images png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Correspondance Regex" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Correspondance Regex" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Assignations" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Couleur de Bordure" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Couleur de la bordure utilisée pour les modes de redimensionnement " "Rectangulaire et Contour" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Mode de redimensionnement par défaut" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Mode utilisé par défaut pour le redimentionnement de fenêtre" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Couleur de Remplissage" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Couleur de remplissage pour le mode de redimensionnement rectangulaire" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Lancer le redimensionnement de fenêtre Normal" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Lancer le redimensionnement de fenêtre Contour" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Lancer le redimensionnement de fenêtre Rectangle" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Lancer le redimensionnement de fenêtre Étiré" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Lancer le redimensionnement de fenêtre" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Redimensionne les fenêtres en mode Normal" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Contour" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Redimensionne les fenêtres en mode Contour" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rectangle" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Redimensionne les fenêtres en mode Rectangle" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Redimensionner la Fenêtre" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Redimensionner la fenêtre" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Commencer à redimensionner la fenêtre" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Commencer à redimensionner la fenêtre en l'étirant" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Commencer à redimensionner la fenêtre normalement" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Commencer à redimensionner la fenêtre avec le contour" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Commencer à redimensionner la fenêtre avec un rectangle" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Étirer" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Redimensionne les fenêtres en mode Étiré" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Types de fenêtres qui devraient utiliser le redimensionnement Normal" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Types de fenêtres qui devraient utiliser le redimensionnement Contour" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" "Types de fenêtres qui devraient utiliser le redimensionnement Rectangle" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Types de fenêtres qui devraient utiliser le redimensionnement Étiré" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Rotation de côté - Glissement-déplacement" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Rotation de côté - Déplacement" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Rotation de côté - Pointeur" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Temps de rotation" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Rotation sur le coté gauche avec le pointeur" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Rotation vers la face suivante - Glissement d'un objet vers le côté de " "l'écran" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Rotation vers la face suivante - Déplacement du pointeur vers le côté de " "l'écran" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Rotation vers la face suivante - Déplacement de la fenêtre vers le côté de " "l'écran" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Rotation sur le coté droit avec le pointeur" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Insérer l'axe Y pour le mouvement du pointeur" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Inversion Y du pointeur" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilité du pointeur" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Remonter lors de la rotation" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Remonter la fenêtre lors de la rotation" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Rotation du Cube" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Rotation sur le côté gauche" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Rotation sur le côté droit" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Rotation à gauche" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Rotation à gauche avec la fenêtre" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Rotation à droite" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Rotation à droite avec la fenêtre" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Rotation vers" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Rotation vers la face 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Rotation vers la face 1 avec la fenêtre" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Rotation vers la face 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Rotation vers la face 10 avec la fenêtre" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Rotation vers la face 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Rotation vers la face 11 avec la fenêtre" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Rotation vers la face 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Rotation vers la face 12 avec la fenêtre" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Rotation vers la face 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Rotation vers la face 2 avec la fenêtre" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Rotation vers la face 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Rotation vers la face 3 avec la fenêtre" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Rotation vers la face 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Rotation vers la face 4 avec la fenêtre" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Rotation vers la face 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Rotation vers la face 5 avec la fenêtre" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Rotation vers la face 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Rotation vers la face 6 avec la fenêtre" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Rotation vers la face 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Rotation vers la face 7 avec la fenêtre" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Rotation vers la face 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Rotation vers la face 8 avec la fenêtre" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Rotation vers la face 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Rotation vers la face 9 avec la fenêtre" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Rotation du Cube" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Rotation du cube de bureau" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Rotation à gauche" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Rotation à gauche avec la fenêtre active" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Rotation à droite" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Rotation à droite avec la fenêtre active" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Rotation vers la face du cube" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Rotation vers la face du cube avec fenêtre" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Rotation vers la face 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Rotation vers la face 1 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Rotation vers la face 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Rotation vers la face 10 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Rotation vers la face 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Rotation vers la face 11 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Rotation vers la face 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Rotation vers la face 12 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Rotation vers la face 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Rotation vers la face 2 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Rotation vers la face 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Rotation vers la face 3 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Rotation vers la face 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Rotation vers la face 4 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Rotation vers la face 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Rotation vers la face 5 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Rotation vers la face 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Rotation vers la face 6 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Rotation vers la face 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Rotation vers la face 7 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Rotation vers la face 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Rotation vers la face 8 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Rotation vers la face 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Rotation vers la face 9 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Rotation vers un bureau (une face)" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Rotation de la fenêtre" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Rotation avec la fenêtre" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Accélération de la rotation" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Vitesse de la rotation" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Intervalle de la rotation" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoom de la rotation" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilité du mouvement du pointeur" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Aligner la rotation du cube avec la face inférieure" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Aligner la rotation du cube avec la face supérieure" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Aligner avec la face inférieure" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Aligner avec la face supérieure" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Démarrer la rotation" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Délai avant la rotation du bureau" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Quantité d'opacité en pourcentage" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Grand" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Assignation des boutons de bascule du mode échelle" #: ../metadata/scale.xml.in.h:7 #, fuzzy msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Assignation des boutons de bascule du mode échelle au lieu de l'activer une " "fois pressé et de le désactiver une foi relâché" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Cliquez sur le Bureau pour l'afficher" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Assombrir l'arrière-plan" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Assombrir l'arrière-plan lors de la Mise à l'Échelle des fenêtres" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblème" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Entrer en mode Affichage Du Bureau quand celui-ci est cliqué pendant la Mise " "à l'Échelle" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Temps de survol" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Lancer le sélecteur de fenêtre" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Lancer le sélecteur de fenêtre pour toutes les fenêtres" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Lancer le sélecteur de fenêtre pour un groupe de fenêtres" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" "Lancer le sélecteur de fenêtre pour les fenêtres sur la sortie actuelle" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Assignation des touches de bascule du mode échelle" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Assignation des boutons de bascule du mode échelle au lieu de l'activer en " "pressant et le désactiver en relâchant." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Disposer et commencer à transformer toutes les fenêtres" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Disposer et commencer à transformer un groupe de fenêtres" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Disposer et commencer à transformer les fenêtres" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" "Disposer et commencer à transformer des fenêtres sur la sortie actuelle" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Sur tous les périphériques de sortie" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Sur le périphérique de sortie courant" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Superposer l'icône" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" "Superposer une icône sur les fenêtres lorsqu'elles ont été mises à l'échelle" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Échelle" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Mettre les fenêtres à l'échelle" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Vitesse de mise à l'échelle" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Intervalle de mise à l'échelle" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Mettre toutes les fenêtres à la même échelle" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Choisir où les fenêtres sont mises à l'échelle si plusieurs périphériques de " "sortie sont utilisés." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Espace entre les fenêtres" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Espacement" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Temps (en ms) avant que le mode Échelle soit terminé lors du survol au-" "dessus d'une fenêtre" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Types de fenêtres à mettre à l'échelle en mode Échelle" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Ouvrir automatiquement la capture d'écran dans cette application" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Répertoire" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Lancer une capture d'écran" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Lancer une Application" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Mettre les captures d'écran dans ce répertoire" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Capture d'écran" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Extension de capture d'écran" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Chargeur d'images Svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Quantité de luminosité en pourcentage" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Quantité de saturation en pourcentage" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Sélecteur d'Application" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Rotation automatique" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Placer au-dessus" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Placer la fenêtre sélectionnée au-dessus" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Le bureau à distance doit être en zoom arrière lors du passage d'une fenêtre " "à une autre" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Icône" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimisé" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Panneau Suivant" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Fenêtre suivante" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Fenêtre suivante (toutes les fenêtres)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Fenêtre suivante (pas de sélecteur)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" "Afficher le sélecteur s'il n'est pas visible et sélectionner la fenêtre " "suivante" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Afficher le sélecteur s'il n'est pas visible et sélectionner la fenêtre " "suivante parmi toutes les fenêtres" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" "Afficher le sélecteur s'il n'est pas visible et sélectionner la fenêtre " "précédente" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Afficher le sélecteur s'il n'est pas visible et sélectionner la fenêtre " "précédente parmi toutes les fenêtres" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Panneau Précédent" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Fenêtre précédente" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Fenêtre précédente (toutes les fenêtres)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Fenêtre précédente (pas de sélecteur)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Tourner vers la fenêtre sélectionnée pendant la commutation" # Ca ne veut rien dire... #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Sélectionner la prochaine fenêtre de la police du panneau" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Sélectionner la fenêtre suivante sans montrer le sélecteur" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Sélectionner la précédente fenêtre de la police du panneau" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Sélectionner la fenêtre précédente sans montrer le sélecteur" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Afficher l'icône à côté de la miniature" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Afficher des fenêtres réduites" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Vitesse du sélecteur" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Intervalle du sélecteur" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Types de fenêtres du sélecteur" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Types de fenêtres à afficher dans le sélecteur" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Fournir le support de l'espace colorimétrique YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Lecture Vidéo" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Lecture vidéo" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Espace colorimétrique YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Ajouter une ligne" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Ajouter un point" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Ajoute des effets d'eau à différentes opérations du bureau" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Délai (en ms) entre chaque goutte de pluie" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Activer les effets d'eau du pointeur" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Ligne" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Échelle de décalage" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Point" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Délai de pluie" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Vague sur le titre" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Activer/désactiver la pluie" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Activer/désactiver l'effet de pluie" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Activer/désactiver l'essuie-glace" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Activer/désactiver l'effet d'essuie-glace" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Effet d'eau" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Échelle de décalage d'eau" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Effet de vague sur le titre de la fenêtre" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Effet de focus" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Effet de focus de la fenêtre" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Focus sur les Fenêtres" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Friction" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Saisir les Fenêtres" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Résolution de la grille" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Alignement inversé de la fenêtre" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Déformer la fenêtre" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Mapper l'effet" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Mapper l'effet de la fenêtre" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Mapper les types de fenêtres" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Optimiser l'effet" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Taille de grille minimale" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Taille de grille de sommet minimale" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Déplacer les fenêtres" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Déformation" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Alignement inversé" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Aligner les fenêtres" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Friction ressort" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Ressort K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Constante de ressort" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Basculer l'alignement des fenêtres" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" "Utiliser le modèle physique du ressort pour créer un effet de déformation " "des fenêtres" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Résolution de la grille de sommets" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Types de fenêtres à déformer lorsque le focus est sur celles-ci" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Types de fenêtres à déformer lorsqu'elles sont saisies" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Types de fenêtres à déformer lorsqu'elles sont mappées" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Types de fenêtres à déformer lorsqu'elles sont déplacées" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" "Effet de déformation lors de la maximisation et de la démaximisation des " "fenêtres" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Déformer les Fenêtres" #~ msgid "Command line 0" #~ msgstr "Ligne de commande 0" #~ msgid "Run command 0" #~ msgstr "Exécuter la commande 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Ligne de commande de capture d'écran" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Ligne de commande de capture d'écran" #~ msgid "Filter Linear" #~ msgstr "Filtre linéaire" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Utiliser le filtre linéaire pour le zoom avant" #~ msgid "Zoom Desktop" #~ msgstr "Zoom du Bureau" #~ msgid "Zoom In" #~ msgstr "Zoom avant" #~ msgid "Zoom Out" #~ msgstr "Zoom arrière" #~ msgid "Zoom Pan" #~ msgstr "Zoom Panoramique" #~ msgid "Zoom Speed" #~ msgstr "Vitesse du zoom" #~ msgid "Zoom Timestep" #~ msgstr "Intervalle du zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zoom et panoramique du cube du bureau" #~ msgid "Zoom factor" #~ msgstr "Facteur de zoom" #~ msgid "Zoom pan" #~ msgstr "Zoom panoramique" #~ msgid "Decrease window opacity" #~ msgstr "Réduire l'opacité de la fenêtre" #~ msgid "Increase window opacity" #~ msgstr "Augmenter l'opacité de la fenêtre" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valeurs de l'opacité pour les fenêtres qui devraient être transparentes " #~ "par défaut" #~ msgid "Opacity windows" #~ msgstr "Transparence des fenêtres" #~ msgid "Background Images" #~ msgstr "Images de Fond" #~ msgid "Background images" #~ msgstr "Images de fond" #~ msgid "Place windows on a plane" #~ msgstr "Placer tous les bureaux sur un plan" #~ msgid "Plane Down" #~ msgstr "Planer vers le Bas" #~ msgid "Plane Left" #~ msgstr "Planer à Gauche" #~ msgid "Plane Right" #~ msgstr "Planer à Droite" #~ msgid "Plane To Face 1" #~ msgstr "Planer vers la Face 1" #~ msgid "Plane To Face 10" #~ msgstr "Planer vers la Face 10" #~ msgid "Plane To Face 11" #~ msgstr "Planer vers la Face 11" #~ msgid "Plane To Face 12" #~ msgstr "Planer vers la Face 12" #~ msgid "Plane To Face 2" #~ msgstr "Planer vers la Face 2" #~ msgid "Plane To Face 3" #~ msgstr "Planer vers la Face 3" #~ msgid "Plane To Face 4" #~ msgstr "Planer vers la Face 4" #~ msgid "Plane To Face 5" #~ msgstr "Planer vers la Face 5" #~ msgid "Plane To Face 6" #~ msgstr "Planer vers la Face 6" #~ msgid "Plane To Face 7" #~ msgstr "Planer vers la Face 7" #~ msgid "Plane To Face 8" #~ msgstr "Planer vers la Face 8" #~ msgid "Plane To Face 9" #~ msgstr "Planer vers la Face 9" #~ msgid "Plane Up" #~ msgstr "Planer vers le Haut" #~ msgid "Plane down" #~ msgstr "Faire glisser la vue vers le bureau inférieur" #~ msgid "Plane left" #~ msgstr "Faire glisser la vue vers le bureau de gauche" #~ msgid "Plane right" #~ msgstr "Faire glisser la vue vers le bureau de droite" #~ msgid "Plane to face 1" #~ msgstr "Faire glisser la vue vers la face 1" #~ msgid "Plane to face 10" #~ msgstr "Faire glisser la vue vers la face 10" #~ msgid "Plane to face 11" #~ msgstr "Faire glisser la vue vers la face 11" #~ msgid "Plane to face 12" #~ msgstr "Faire glisser la vue vers la face 12" #~ msgid "Plane to face 2" #~ msgstr "Faire glisser la vue vers la face 2" #~ msgid "Plane to face 3" #~ msgstr "Faire glisser la vue vers la face 3" #~ msgid "Plane to face 4" #~ msgstr "Faire glisser la vue vers la face 4" #~ msgid "Plane to face 5" #~ msgstr "Faire glisser la vue vers la face 5" #~ msgid "Plane to face 6" #~ msgstr "Faire glisser la vue vers la face 6" #~ msgid "Plane to face 7" #~ msgstr "Faire glisser la vue vers la face 7" #~ msgid "Plane to face 8" #~ msgstr "Faire glisser la vue vers la face 8" #~ msgid "Plane to face 9" #~ msgstr "Faire glisser la vue vers la face 9" #~ msgid "Plane up" #~ msgstr "Faire glisser la vue vers le bureau supérieur" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Temps de fondu de l'opacité de la fenêtre du bureau" compiz-0.9.11+14.04.20140409/po/vi.po0000644000015301777760000017023012321343002017071 0ustar pbusernogroup00000000000000# @TITLE@ # Copyright (C) 2006, SUSE Linux GmbH, Nuremberg # FIRST AUTHOR , YEAR. # # This file is distributed under the same license as @PACKAGE@ package. FIRST # msgid "" msgstr "" "Project-Id-Version: @PACKAGE@\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2006-07-12 07:32+0200\n" "Last-Translator: Phan VÄ©nh Thịnh \n" "Language-Team: Vietnamese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" compiz-0.9.11+14.04.20140409/po/km.po0000644000015301777760000025546712321343002017102 0ustar pbusernogroup00000000000000# Khmer message file for YaST2 (@memory@). # Copyright (C) 2006 SUSE Linux Products GmbH. # Leang Chumsoben , 2005, 2006. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2006-01-04 08:58+0100\n" "Last-Translator: Leang Chumsoben \n" "Language-Team: Khmer \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "ផ្ទៃážáž»" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "កម្មវិធីគ្រប់គ្រងបង្អួច" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "គ្មាន" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "ម៉ាស៊ីន​ស្កáŸáž“" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "AutoYast" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "កម្មវិធីគ្រប់គ្រងបង្អួច" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "បាន​ជ្រើស" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "លុប​វ៉ីនដូ​ទាំង​ស្រុង" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "លុប​វ៉ីនដូ​ទាំង​ស្រុង" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "លុប​វ៉ីនដូ​" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 #, fuzzy msgid "Minimize Window" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "អ៊ីទីážáŸ" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "ពណ៌" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "សកម្ម" #: ../metadata/annotate.xml.in.h:5 #, fuzzy msgid "Clear" msgstr "ជម្រះ" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "អ៊ីទីážáŸ" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "អ៊ីទីážáŸ" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "អ៊ីទីážáŸ" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "អ៊ីទីážáŸ" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "ážáž˜áŸ’រង ៖ " #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "កំណážáŸ‹â€‹ážáž˜áŸ’ážšáž„" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "ážáž·ážšážœáŸáž›áž¶" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "ážáž·ážšážœáŸáž›áž¶" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "បាន​ជ្រើស" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "ážáž·ážšážœáŸáž›áž¶" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "ម៊ិកម៉ា" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "ម៊ិកម៉ា" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "វ៉ីនដូ" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 #, fuzzy msgid "Clone Output" msgstr "លទ្ធផល​គឺ" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "អ៊ីទីážáŸ" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "ពាក្យបញ្ជា '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "ពាក្យបញ្ជា '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "ពាក្យបញ្ជា '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "ពាក្យបញ្ជា '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "សកម្ម" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "ប្រពáŸáž“្ធ​ឯកសារ" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "AutoYast" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "ដែន​លំនាំ​ដើម" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "ដែន​លំនាំ​ដើម" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "ផ្ទៃážáž»" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "ជ្រើស​ដើម្បី​ធ្វើ​ឲ្យ​ទាន់​សមáŸáž™" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "ឧបករណáŸâ€‹áž“ិម្មិáž" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "អនុញ្ញាážâ€‹áž²áŸ’យ​ផ្អាក​ស្វáŸáž™áž”្រវážáŸ’ážáž·" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "ការ​ចូល" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "រាយ​ážáŸ‚​ម៉ាស៊ីន​បោះពុម្ព​ដែល​បាន​រកឃើញ" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "សូរប៊ីយ៉ាន​ក្រោម" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/core.xml.in.in.h:51 #, fuzzy msgid "Maximize Window Vertically" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "ធម្មážáž¶" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "ផ្ទៃážáž»" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "ផ្ទៃážáž»" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 #, fuzzy msgid "Outputs" msgstr "លទ្ធផល​គឺ" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "ពន្យារពáŸáž›" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "នាឡិកា​វិទ្យុ" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "ធ្វើ​ឲ្យ​ស្រស់" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "ផ្ទៃážáž»" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "ការ​ធ្វើ​ážáž¶áž˜" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "កំណážáŸ‹â€‹ážáž˜áŸ’ážšáž„" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "កំណážáŸ‹â€‹ážáž˜áŸ’ážšáž„" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "កំណážáŸ‹â€‹ážáž˜áŸ’ážšáž„" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "ឧបករណáŸâ€‹áž“ិម្មិáž" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "ការ​បង្កើន​ល្បឿន 3D ៖ " #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 #, fuzzy msgid "Advance to next slide" msgstr "ជម្រើស​កម្រិážâ€‹ážáŸ’ពស់" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "AutoYast" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "ពណ៌" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "ពណ៌" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "ផ្ទៃážáž»" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "ការ​បង្កើន​ល្បឿន 3D ៖ " #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "បាន​ជ្រើស" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "សាកល្បង" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "មុន" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "ឯកសារ​រូបភាព ISO" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "ទំហំ​ážáŸ’មី" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "មុន" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "áž–áŸáž›ážœáŸáž›áž¶â€‹áž˜áž¼áž›ážŠáŸ’ឋាន" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "រូបភាព ISO" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "រូបភាព ISO" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "បាន​ជ្រើស" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "សាកល្បង" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "សមážáŸ’ážáž—ាព​ទាប" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "សមážáŸ’ážáž—ាព​ទាប" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "កាំ" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "សមážáŸ’ážáž—ាព​ទាប" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "កាំ" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/decoration.xml.in.h:12 #, fuzzy msgid "Shadow Offset X" msgstr "សមážáŸ’ážáž—ាព​ទាប" #: ../metadata/decoration.xml.in.h:13 #, fuzzy msgid "Shadow Offset Y" msgstr "សមážáŸ’ážáž—ាព​ទាប" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "សមážáŸ’ážáž—ាព​ទាប" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "កាំ" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "គ្មាន​សáŸáž…ក្ដី​ពណ៌នា" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ជម្រើស ypbind" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "សាកល្បង" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "មាន" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "áž–áŸáž›â€‹ážœáŸáž›áž¶â€‹áž–áž·ážâ€‹áž”្រាកដ" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "បាន​ជ្រើស" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "áž–áŸáž›â€‹ážœáŸáž›áž¶â€‹áž–áž·ážâ€‹áž”្រាកដ" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "ប្រពáŸáž“្ធ​ឯកសារ" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/fade.xml.in.h:16 #, fuzzy msgid "Fullscreen Visual Bell" msgstr "ឧបករណáŸâ€‹áž”៉ះអáŸáž€áŸ’រង់" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "វ៉ីនដូ" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "បន្ážáŸ‚ម​ទំនាក់​ទំនង" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "បន្ážáŸ‚ម​ទំនាក់​ទំនង" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 #, fuzzy msgid "Open a terminal" msgstr "ážšážáŸ‹â€‹áž€áŸ’នុង​ស្ážáž¶áž“ីយ" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 #, fuzzy msgid "Run Dialog" msgstr "ការ​ហៅ​ឮ​សម្លáŸáž„" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "មាន​កំហុស ážážŽáŸˆâ€‹áž–áŸáž›â€‹áž€áŸ†áž–ុង​ញែក​បន្ទាážáŸ‹â€‹áž–ាក្យ​បញ្ជា​។" #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "មាន​កំហុស ážážŽáŸˆâ€‹áž–áŸáž›â€‹áž€áŸ†áž–ុង​ញែក​បន្ទាážáŸ‹â€‹áž–ាក្យ​បញ្ជា​។" #: ../metadata/gnomecompat.xml.in.h:8 #, fuzzy msgid "Show Main Menu" msgstr "បង្កើážáž˜áŸ‰ážºáž“ុយ​ចាប់ផ្ដើម" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 #, fuzzy msgid "Show the main menu" msgstr "បង្កើážáž˜áŸ‰ážºáž“ុយ​ចាប់ផ្ដើម" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "មាន​កំហុស ážážŽáŸˆâ€‹áž–áŸáž›â€‹áž€áŸ†áž–ុង​ញែក​បន្ទាážáŸ‹â€‹áž–ាក្យ​បញ្ជា​។" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "កុំ​ចុះ​កំណážáŸ‹áž áŸážáž»â€‹áž¢áŸ’វី​ទាំងអស់" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "កុំ​ចុះ​កំណážáŸ‹áž áŸážáž»â€‹áž¢áŸ’វី​ទាំងអស់" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "មាន" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "XF86RotateWindows" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "ផ្លាស់​ប្ដូរ​ទំហំ" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "ផ្លាស់ទី​ចុះ​ក្រោម" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "ផ្លាស់ទី​ចុះ​ក្រោម" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "សមážáŸ’ážáž—ាព​ទាប" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Bridge" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Bridge" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Bridge" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Bridge" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "អុកស៊ីážáž„់ (ក្រោយ​ឆ្នាំ ១៥០០)" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "អុកស៊ីážáž„់ (ក្រោយ​ឆ្នាំ ១៥០០)" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "សមážáŸ’ážáž—ាព​ទាប" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "ážáž·ážšážœáŸáž›áž¶" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "ážáž·ážšážœáŸáž›áž¶" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "ážáž·ážšážœáŸáž›áž¶" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "ážáž·ážšážœáŸáž›áž¶" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ជម្រើស ypbind" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "វ៉ីនដូ" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "វ៉ីនដូ" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "កម្មវិធីគ្រប់គ្រងបង្អួច" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "ឧបករណáŸâ€‹áž“ិម្មិáž" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "ផ្លាស់​ប្ដូរ​ទំហំ" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "ឧបករណáŸâ€‹áž“ិម្មិáž" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "ផ្លាស់​ប្ដូរ​ទំហំ" #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ជម្រើស ypbind" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ជម្រើស ypbind" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "ក្រុម​ការងារ" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "ផ្លាស់​ប្ដូរ​ទំហំ" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "ឧបករណáŸâ€‹áž“ិម្មិáž" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "ផ្លាស់​ប្ដូរ​ទំហំ" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "ឧបករណáŸâ€‹áž“ិម្មិáž" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "ពណ៌" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "ពណ៌" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "ážáž¶ážŸâ€‹ážŸážáž·â€‹ážŠáŸ†áž”ូង" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "ážáž¶ážŸâ€‹ážŸážáž·â€‹ážŠáŸ†áž”ូង" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "ážáž¶ážŸâ€‹ážŸážáž·â€‹ážŠáŸ†áž”ូង" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "ážáž¶ážŸâ€‹ážŸážáž·â€‹ážŠáŸ†áž”ូង" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "ážáž¶ážŸâ€‹ážŸážáž·â€‹ážŠáŸ†áž”ូង" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "ពណ៌" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "ផ្លាស់​ប្ដូរ​ទំហំ" #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "áž–áŸáž›â€‹ážœáŸáž›áž¶â€‹áž–áž·ážâ€‹áž”្រាកដ" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "ទ្រនិចចង្អុរ​ទៅ %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "ការពិពណ៌នា​អំពី​ម៉ាស៊ីន​បោះពុម្ព" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "Subnet ពី​ចម្ងាយ" #: ../metadata/rotate.xml.in.h:19 #, fuzzy msgid "Rotate Flip Left" msgstr "ទៅ​ស្ដាំ" #: ../metadata/rotate.xml.in.h:20 #, fuzzy msgid "Rotate Flip Right" msgstr "ទៅ​ស្ដាំ" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "Subnet ពី​ចម្ងាយ" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "ទៅ​ស្ដាំ" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Subnet ពី​ចម្ងាយ" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Subnet ពី​ចម្ងាយ" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "Subnet ពី​ចម្ងាយ" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "ទៅ​ស្ដាំ" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "បង្វិល​អáŸáž€áŸ’រង់" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "ការ​បង្កើន​ល្បឿន 3D ៖ " #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "សាកល្បង" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "សាកល្បង" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "សាកល្បង" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "ចាប់ផ្ដើម​រក" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 #, fuzzy msgid "Zoom" msgstr "áž…áŸáž‰" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "ធំ" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "ផ្ទៃ​ážáž¶áž„​ក្រោយ" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "ážáž¶ážŸâ€‹ážŸážáž·â€‹ážŠáŸ†áž”ូង" #: ../metadata/scale.xml.in.h:15 #, fuzzy msgid "Initiate Window Picker For All Windows" msgstr "ážáž¶ážŸâ€‹ážŸážáž·â€‹ážŠáŸ†áž”ូង" #: ../metadata/scale.xml.in.h:16 #, fuzzy msgid "Initiate Window Picker For Window Group" msgstr "ážáž¶ážŸâ€‹ážŸážáž·â€‹ážŠáŸ†áž”ូង" #: ../metadata/scale.xml.in.h:17 #, fuzzy msgid "Initiate Window Picker For Windows on Current Output" msgstr "ážáž¶ážŸâ€‹ážŸážáž·â€‹ážŠáŸ†áž”ូង" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "ម៉ាស៊ីន​ស្កáŸáž“" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "áž–áŸáž›ážœáŸáž›áž¶â€‹áž˜áž¼áž›ážŠáŸ’ឋាន" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "áž–áŸáž›ážœáŸáž›áž¶â€‹áž˜áž¼áž›ážŠáŸ’ឋាន" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "អáŸážŸáŸ‰áŸ’បាញ" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "ážáž\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "អ៊ីទីážáŸ" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "បើក​កម្មវិធី​មួយ" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "អáŸáž€áŸ’រង់" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "មាន​កំហុស ážážŽáŸˆâ€‹áž–áŸáž›â€‹áž€áŸ†áž–ុង​ញែក​បន្ទាážáŸ‹â€‹áž–ាក្យ​បញ្ជា​។" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "លំដាប់​កម្មវិធី" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "AutoYast" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "កំឡុង​ពáŸáž›â€‹áž…ាប់ផ្ដើម​ឡើង" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "រូប​ážáŸ†ážŽáž¶áž„" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "ផ្ទៃážáž»" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "មុន" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "វ៉ីនដូ" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "វ៉ីនដូ" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "វ៉ីនដូ" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "លុប​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "ប្ដូរ​ស្គ្រីប" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "áž–áŸáž›ážœáŸáž›áž¶â€‹áž˜áž¼áž›ážŠáŸ’ឋាន" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "បន្ážáŸ‚ម​ážáŸ†ážŽ" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "បន្ážáŸ‚ម​ទំនាក់​ទំនង" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "ពន្យារពáŸáž›" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "Token ring" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "Token ring" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "Token ring" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "Token ring" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "វ៉ីនដូ" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "អំពើ" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "គុណភាព​បង្ហាញ" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "វ៉ីនដូ" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "វ៉ីនដូ" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "វ៉ីនដូ" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "វ៉ីនដូ" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "ទំហំ​សំបុážáŸ’រ​អážáž·áž”រមា" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "ទំហំ​សំបុážáŸ’រ​អážáž·áž”រមា" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "ផ្លាស់ទី​ចុះ​ក្រោម" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "កម្មវិធី​បញ្ជា" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "អំពើ" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "ការ​ចែក​រំលែក" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "ការ​ចែក​រំលែក" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "ដំណោះស្រាយ​ម៉ាស៊ីន​បម្រើ" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "វ៉ីនដូ" #, fuzzy #~ msgid "Command line 0" #~ msgstr "ពាក្យបញ្ជា ៖ " #, fuzzy #~ msgid "Run command 0" #~ msgstr "ពាក្យបញ្ជា '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "មាន​កំហុស ážážŽáŸˆâ€‹áž–áŸáž›â€‹áž€áŸ†áž–ុង​ញែក​បន្ទាážáŸ‹â€‹áž–ាក្យ​បញ្ជា​។" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "មាន​កំហុស ážážŽáŸˆâ€‹áž–áŸáž›â€‹áž€áŸ†áž–ុង​ញែក​បន្ទាážáŸ‹â€‹áž–ាក្យ​បញ្ជា​។" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "ážáž˜áŸ’រង ៖ " #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "ផ្ទៃážáž»" #, fuzzy #~ msgid "Zoom In" #~ msgstr "áž…áŸáž‰" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "áž…áŸáž‰" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "áž…áŸáž‰" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "បាន​ជ្រើស" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "សាកល្បង" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "áž…áŸáž‰" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "áž…áŸáž‰" #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "លុប​វ៉ីនដូ​ទាំង​ស្រុង" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Plane Down" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Subnet ពី​ចម្ងាយ" #, fuzzy #~ msgid "Plane Right" #~ msgstr "ទៅ​ស្ដាំ" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane Up" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Plane down" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Plane left" #~ msgstr "Subnet ពី​ចម្ងាយ" #, fuzzy #~ msgid "Plane right" #~ msgstr "ទៅ​ស្ដាំ" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane up" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Toolbar" #~ msgstr "ឧបករណáŸ" #~ msgid "Menu" #~ msgstr "ម៉ឺនុយ" #, fuzzy #~ msgid "Utility" #~ msgstr "ážáž¶ážŸâ€‹áž§áž”ករណáŸâ€‹áž”្រើប្រាស់..." #, fuzzy #~ msgid "Dialog" #~ msgstr "ការ​ហៅ​ឮ​សម្លáŸáž„" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "កម្មវិធីគ្រប់គ្រងបង្អួច" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "ម៉ឺនុយ" #, fuzzy #~ msgid "Tooltip" #~ msgstr "ឧបករណáŸ" #, fuzzy #~ msgid "Notification" #~ msgstr "ការ​ជូនដំណឹង" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "ឧបករណáŸâ€‹áž”៉ះអáŸáž€áŸ’រង់" #~ msgid "Unknown" #~ msgstr "មិន​ស្គាល់" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "ážáž·ážšážœáŸáž›áž¶" #, fuzzy #~ msgid "Do not modify" #~ msgstr "កុំ​ចុះ​កំណážáŸ‹áž áŸážáž»â€‹áž¢áŸ’វី​ទាំងអស់" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "សមážáŸ’ážáž—ាព​ទាប" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "កាំ" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "ការ​បង្កើន​ល្បឿន 3D ៖ " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "ការ​បង្កើន​ល្បឿន 3D ៖ " #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "សាកល្បង" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "វ៉ីនដូ" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "បន្ážáž™â€‹áž‘ំហំ​ភាគ​របស់​វ៉ីនដូ​" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "ទំហំ​សំបុážáŸ’រ​អážáž·áž”រមា" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "ផ្ទៃážáž»" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "អុកស៊ីážáž„់ (ក្រោយ​ឆ្នាំ ១៥០០)" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "ការ​បង្កើន​ល្បឿន 3D ៖ " #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "សាកល្បង" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "áž–áŸáž›ážœáŸáž›áž¶â€‹áž˜áž¼áž›ážŠáŸ’ឋាន" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "áž–áŸáž›ážœáŸáž›áž¶â€‹áž˜áž¼áž›ážŠáŸ’ឋាន" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "អំពើ" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ការ​ចែក​រំលែក" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "ប្ដូរ​ស្គ្រីប" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "កំណážáŸ‹â€‹ážáž˜áŸ’ážšáž„" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "ដំណោះស្រាយ​ម៉ាស៊ីន​បម្រើ" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "វ៉ីនដូ" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "វ៉ីនដូ" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "បាន​ជ្រើស" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "សាកល្បង" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "áž…áŸáž‰" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "បង្វិល​អáŸáž€áŸ’រង់" #, fuzzy #~ msgid "Command line %d" #~ msgstr "ពាក្យបញ្ជា ៖ " #, fuzzy #~ msgid "Run command %d" #~ msgstr "ពាក្យបញ្ជា ៖ " #, fuzzy #~ msgid "Move Window Types" #~ msgstr "ប្រភáŸáž‘​ក្រុមហ៊ុន​ផ្ដល់" #, fuzzy #~ msgid "Corners" #~ msgstr "កូនីស" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "ážáž¶ážŸâ€‹áž‘ន់" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "កំពុង​ចាប់ផ្ážáž¾áž˜â€‹ážŠáŸáž˜áž·áž“ ។" #, fuzzy #~ msgid "Terminate" #~ msgstr "ស្ážáž¶áž“ីយ" compiz-0.9.11+14.04.20140409/po/xh.po0000644000015301777760000017537312321343002017107 0ustar pbusernogroup00000000000000# Copyright (C) 2007 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the package. # msgid "" msgstr "" "Project-Id-Version: base\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2006-11-03 14:26\n" "Last-Translator: Novell Language \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Kuyandululwa" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Kuyandululwa" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Kuyandululwa" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Kuyandululwa" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Kuyandululwa" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Kuyandululwa" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Gcina ubumbeko" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Gcina ubumbeko" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Gcina ubumbeko" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Ukukhetha Ikhathalogu" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Umyalelo:" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Umyalelo '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Musa Ukukhetha &Nto" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&Hlaziya" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Kuyandululwa" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Umyalelo:" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Kugqityiwe Ukuhlohla" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Umyalelo '%1'" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Umyalelo '%1'" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Gcina ubumbeko" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Gcina ubumbeko" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Gcina ubumbeko" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Gcina ubumbeko" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Kuyandululwa" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Kuyandululwa" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Kuyandululwa" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Kuyandululwa" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Kuyandululwa" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Kuyandululwa" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Kuyandululwa" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Musa Ukukhetha &Nto" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Musa Ukukhetha &Nto" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Musa Ukukhetha &Nto" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Kugqityiwe Ukuhlohla" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Kugqityiwe Ukuhlohla" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Kugqityiwe Ukuhlohla" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Kugqityiwe Ukuhlohla" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Kuqaliswa Ukuhlohla..." #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Kuyandululwa" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "I-&Uvimba Weefayili Zendawo Ethile..." #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Ukukhetha Ikhathalogu" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Kuyandululwa" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Ngethuba Lokumisela Inkqubo" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "Musa Ukukhetha &Nto" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Musa Ukukhetha &Nto" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Musa Ukukhetha &Nto" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Musa Ukukhetha &Nto" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Musa Ukukhetha &Nto" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Ngethuba Lokumisela Inkqubo" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Umyalelo '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Umyalelo '%1'" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Kugqityiwe Ukuhlohla" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Kugqityiwe Ukuhlohla" #~ msgid "Unknown" #~ msgstr "Akwaziwa" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Gcina ubumbeko" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Kugqityiwe Ukuhlohla" compiz-0.9.11+14.04.20140409/po/el.po0000644000015301777760000034324312321343002017061 0ustar pbusernogroup00000000000000# Compiz Core Greek Translation. # Copyright (C) 2007 compiz-fusion.org # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # This file is distributed under the same license as the Compiz package. # ΔημήτÏης (djdoo) , 2007. # msgid "" msgstr "" "Project-Id-Version: Compiz 0.6.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-03-30 10:16+0200\n" "Last-Translator: Jim Dusis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Επιφάνεια εÏγασίας" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "ΔιαχείÏηση ΠαÏαθÏÏου" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Κανένα" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Σκίαση" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Μεγιστοποίησε" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Μεγιστοποίηση ΟÏιζόντια" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Μεγιστοποίηση Κάθετα" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Ελαχιστοποίηση" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "ΑνÏψωση" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "ΧαμηλότεÏο" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "ÎœÎµÎ½Î¿Ï Î Î±ÏαθÏÏου" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "ΕνέÏγεια που θα λάβει χώÏα όταν πεÏιστÏέφετε τη Ïόδα του Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Ï€Î¬Î½Ï‰ σε " "μια μπάÏα τίτλου ενός παÏαθÏÏου." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Είδος θολώματος" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Αδιαφάνεια θέματος ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου του Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Σκίαση αδιαφάνειας θέματος ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου του Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Αδιαφάνεια θέματος του Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Σκίαση αδιαφάνειας θέματος του Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Αδιαφάνεια για χÏήση στα ενεÏγά παÏάθυÏα με θέματα διακοσμήσεων του metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Αδιαφάνεια για χÏήση στα θέματα διακοσμήσεων του metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Σκίαση ενεÏγών παÏαθÏÏων με θέματα διακοσμήσεων του metacity από αδιαφανές " "σε διάφανο" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Σκίαση παÏαθÏÏων με θέματα διακοσμήσεων του metacity από αδιαφανές σε διάφανο" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "ΕνέÏγεια Ïόδας Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï ÏƒÏ„Î·Î½ μπάÏα τίτλου" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Είδος θολώματος για χÏήση στις διακοσμήσεις παÏαθÏÏων" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "ΧÏήση θέματος του metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" "ΧÏήση θέματος του metacity όταν ζωγÏαφίζονται οι διακοσμήσεις παÏαθÏÏων" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Κλείσιμο ΠαÏαθÏÏου" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Απομεγιστοποίηση ΠαÏαθÏÏου" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Μεγιστοποίηση ΠαÏαθÏÏου" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Ελαχιστοποίηση ΠαÏαθÏÏου" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Επικάλυψη" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "ΚαÏφίτσωμα" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Αποσκίαση" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Μη Επικάλυψη" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "ΞεκαÏφίτσωμα" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Το παÏάθυÏο \"%s\" δεν ανταποκÏίνεται." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Ο εξαναγκασμός αυτής της εφαÏμογής να τεÏματιστεί θα Ï€Ïοκαλέσει απώλεια των " "μη σωσμένων αλλαγών." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Εξαναγκασμός ΤεÏματισμοÏ" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Επισημείωση" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "ΧÏώμα Γεμίσματος Επισημείωσης" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "ΧÏώμα Πινελιάς Επισημείωσης" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "ΠÏόσθετο επισημείωση" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "ΚαθάÏισμα" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Σχεδίαση" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Σχεδίαση με εÏγαλείο" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Γέμισμα χÏώματος για επισημειώσεις" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Εκκίνηση" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Εκκίνηση ζωγÏαφίσματος επισημείωσης" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Εκκίνηση σβησίματος επισημείωσης" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Εκκίνηση σβησίματος" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Πλάτος γÏαμμής" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Πλάτος γÏαμμής για επισημειώσεις" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "ΧÏώμα πινελιάς για επισημειώσεις" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Πλάτος πινελιάς" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Πλάτος πινελιάς για επισημειώσεις" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Θόλωμα Άλφα" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Θόλωμα άλφα παÏαθÏÏων" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "ΦίλτÏο Θολώματος" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "ΦÏάξιμο Θολώματος" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "ΚοÏεσμός Θολώματος" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "ΤαχÏτητα Θολώματος" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Θόλωμα ΠαÏαθÏÏων" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Θόλωμα πίσω απ τα διάφανα τμήματα των παÏαθÏÏων" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "ΚοÏεσμός θολώματος" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Θόλωμα παÏαθÏÏων" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Θόλωμα μη εστιασμένων παÏαθÏÏων" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "ΑπενεÏγοποίηση του θολώματος των πεÏιοχών που καλυπτονται απο άλλα παÏαθυÏα" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Μέθοδος φιλταÏίσματος που χÏησιμοποιείται για θόλωμα" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Θόλωμα εστίασης" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Θόλωμα εστίασης" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussian" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Ακτίνα Gaussian" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "ΙσχÏÏ‚ Gaussian" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Ακτίνα gaussian" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "ΙσχÏÏ‚ gaussian" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Τέχνασμα ανεξάÏτητης υφής" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "ΕΛ Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Επίπεδο-λεπτομέÏειας mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Παλμός" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Εφέ παλμοÏ" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "ΧÏήση των διαθέσιμων μονάδων υφών για Ï€Ïαγματοποίηση όσο το δυνατό " "πεÏισσότεÏων τεχνασμάτων ανεξάÏτητης υφής." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "ΤαχÏτητα θολώματος παÏαθÏÏων" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να επηÏεαστοÏν απο το θολωμα εστίασης" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να χÏησιμοποιήσουν ως Ï€Ïοεπιλογή το θόλωμα αλφα" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Αποτέλεσμα Εξόδου Κλωνοποίησης" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Εκκίνηση επιλογής κλωνοποίησης" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "ΧειÏιστής αποτελέσματος εξόδου κλωνοποίησης" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Ένας συνδυασμός πλήκτÏων που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή κέλυφους " "αναγνωÏισμένη ως εντολή9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Ένας συνδυασμός άκÏης οθόνης που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή " "κέλυφους αναγνωÏισμένη ως εντολή0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Ένας συνδυασμός άκÏης οθόνης που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή " "κέλυφους αναγνωÏισμένη ως εντολή1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Ένας συνδυασμός άκÏης οθόνης που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή " "κέλυφους αναγνωÏισμένη ως εντολή10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Ένας συνδυασμός άκÏης οθόνης που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή " "κέλυφους αναγνωÏισμένη ως εντολή11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Ένας συνδυασμός άκÏης οθόνης που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή " "κέλυφους αναγνωÏισμένη ως εντολή2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Ένας συνδυασμός άκÏης οθόνης που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή " "κέλυφους αναγνωÏισμένη ως εντολή3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Ένας συνδυασμός άκÏης οθόνης που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή " "κέλυφους αναγνωÏισμένη ως εντολή4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Ένας συνδυασμός άκÏης οθόνης που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή " "κέλυφους αναγνωÏισμένη ως εντολή5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Ένας συνδυασμός άκÏης οθόνης που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή " "κέλυφους αναγνωÏισμένη ως εντολή6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Ένας συνδυασμός άκÏης οθόνης που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή " "κέλυφους αναγνωÏισμένη ως εντολή7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Ένας συνδυασμός άκÏης οθόνης που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή " "κέλυφους αναγνωÏισμένη ως εντολή8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Ένας συνδυασμός άκÏης οθόνης που όταν επικαλεσθεί, θα Ï„Ïέξει την εντολή " "κέλυφους αναγνωÏισμένη ως εντολή9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "ΟÏίζει συνδυασμοÏÏ‚ σε αυθαίÏετες εντολές" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Συνδυασμοί Κουμπιών" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "ΓÏαμμή εντολών 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "ΓÏαμμή εντολών 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "ΓÏαμμή εντολών 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "ΓÏαμμή εντολών 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "ΓÏαμμή εντολών 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "ΓÏαμμή εντολών 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "ΓÏαμμή εντολών 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "ΓÏαμμή εντολών 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "ΓÏαμμή εντολών 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "ΓÏαμμή εντολών 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "ΓÏαμμή εντολών 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "ΓÏαμμή εντολών 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "ΓÏαμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το Ï„Ïέξιμο_εντολής0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "ΓÏαμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το Ï„Ïέξιμο_εντολής1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "ΓÏαμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το Ï„Ïέξιμο_εντολής10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "ΓÏαμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το Ï„Ïέξιμο_εντολής11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "ΓÏαμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το Ï„Ïέξιμο_εντολής2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "ΓÏαμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το Ï„Ïέξιμο_εντολής3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "ΓÏαμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το Ï„Ïέξιμο_εντολής4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "ΓÏαμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το Ï„Ïέξιμο_εντολής5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "ΓÏαμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το Ï„Ïέξιμο_εντολής6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "ΓÏαμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το Ï„Ïέξιμο_εντολής7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "ΓÏαμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το Ï„Ïέξιμο_εντολής8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "ΓÏαμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το Ï„Ïέξιμο_εντολής9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Εντολές" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Συνδυασμοί ΆκÏων Οθόνης" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Συνδυασμοί ΠλήκτÏων" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "ΤÏέξιμο εντολής 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "ΤÏέξιμο εντολής 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "ΤÏέξιμο εντολής 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "ΤÏέξιμο εντολής 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "ΤÏέξιμο εντολής 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "ΤÏέξιμο εντολής 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "ΤÏέξιμο εντολής 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "ΤÏέξιμο εντολής 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "ΤÏέξιμο εντολής 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "ΤÏέξιμο εντολής 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "ΤÏέξιμο εντολής 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "ΤÏέξιμο εντολής 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "ΕνεÏγά ΠÏόσθετα" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "ΕπέτÏεψε τη σχεδίαση πλήÏους οθόνης παÏαθÏÏων να μην επανακατευθÏνονται στα " "εκτός οθόνης pixmaps" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Ηχητικό Καμπανάκι" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Ηχητικό μπιπ συστήματος" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Αυτόματη ΑνÏψωση" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "ΚαθυστέÏηση Αυτόματης ΑνÏψωσης" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Αυτόματος εντοπισμός των συσκευών εξόδου" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Αυτόματος εντοπισμός του ÏÏ…Î¸Î¼Î¿Ï Î±Î½Î±Î½Î­Ï‰ÏƒÎ·Ï‚" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Βέλτιστο" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Κλικ Για Εστίαση" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Κλικ σε παÏάθυÏο μεταφέÏει την εστίαση εισόδου σε αυτό" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Κλείσιμο ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "ΠÏοεπιλεγμένο Εικονίδιο" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "ΠÏοεπιλεγμένη εικόνα εικονιδίου παÏαθÏÏου" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Μέγεθος Επιφάνειας ΕÏγασίας" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Ανίχνευση Εξόδων" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Ανίχνευση Î¡Ï…Î¸Î¼Î¿Ï Î‘Î½Î±Î½Î­Ï‰ÏƒÎ·Ï‚" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Ρυθμίσεις Οθόνης" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "ΔιάÏκεια χÏόνου που Ï€Ïέπει ο δείκτης του Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Î½Î± παÏαμείνει σε μια " "γωνία της οθόνης Ï€Ïιν η ενέÏγεια που έχει οÏιστεί σ αυτή την άκÏη να " "Ï€Ïαγματοποιηθεί." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "ΚαθυστέÏηση Διακόπτη 'ΑκÏης" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "ΓÏήγοÏο" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Εστιάση & ΣυμπεÏιφοÏά ΑνÏψωσης" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Εστίαση ΠÏÎ¿Î»Î·Ï€Ï„Î¹ÎºÎ¿Ï Î•Ï€Î¹Ï€Î­Î´Î¿Ï…" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Εστίαση ΠÏοστατευμένων ΠαÏαθÏÏων" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Εστίαση Ï€Ïοστατευμένων παÏαθÏÏων" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Εξαναγκασμός ανεξάÏτητης απεικόνισης." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Γενικές Επιλογές" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Γενικές επιλογές του compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Καλό" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "ΑπόκÏυψη Αγνοημένων ΠαÏαθÏÏων ΓÏαμμής ΕÏγασιών" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "ΑπόκÏυψη όλων των παÏαθÏÏων και εστίαση στην επιφάνεια εÏγασίας" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "ΑπόκÏυψη παÏαθÏÏων που δεν βÏίσκονται στην γÏαμμή εÏγασιων κατα την μετάβαση " "στην κατάσταση εμφάνισης επιφάνειας εÏγασίας" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Υψηλό" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "ΟÏιζόντιο Εικονικό Μέγεθος" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "Εαν είναι διαθέσιμο χÏήση συμπίεσης για υφές που έχουν Ï€Ïοέλθει από εικόνες" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Αγνόηση Υποδείξεων Στη Μεγιστοποίηση" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Αγνόηση αÏξησης μεγέθους και υποδείξεων αναλογίας όταν το παÏάθυÏο " "μεγιστοποιείται" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Διάστημα Ï€Ïιν την ανÏψωση των επιλεγμένων παÏαθÏÏων" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Διάστημα Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ μηνυμάτων ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Συνδυασμοί πλήκτÏων" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Επίπεδο αποφυγής απόσπασης εστίασης" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Φωτισμός" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Λίστα των Ï„Ïέχοντων ενεÏγών Ï€Ïοσθέτων" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Λίστα με Ï€ÏοσδιοÏιστικά στÏινγκ για τις συσκευές εξόδου" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Χαμηλό" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Κατέβασμα ΠαÏαθÏÏου" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Κατέβασμα παÏαθÏÏου κάτω απ τα άλλα παÏάθυÏα" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Μεγιστοποίηση ΠαÏαθÏÏου ΟÏιζόντια" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Μεγιστοποίηση ΠαÏαθÏÏου Κάθετα" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Μεγιστοποίηση ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Μεγιστοποίηση ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου οÏιζόντια" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Μεγιστοποίηση ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κάθετα" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Ελαχιστοποίηση ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Κανονική" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "ΑÏιθμός Επιφανειών ΕÏγασίας" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "ΑÏιθμός ψεÏτικων επιφανειών εÏγασίας" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Κλειστό" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "ΠÏαγματοποίηση ανανεώσεων οθόνης μόνο κατα τη διάÏκεια της κάθετης " "πεÏιοδικής ανανέωσης" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Αποτελέσματα-Εξοδοι" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "ΧειÏισμός Επικάλλυψης ΑποτÏπωσης" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "ΔοÏλεψε κάθε οθόνη ανεξάÏτητα, ακόμα κ αν οι οθόνες επικαλÏπτονται" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "ΚαθυστέÏηση Ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "ΠÏοτίμηση μεγαλÏτεÏης απεικόνισης" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "ΠÏοτίμηση μικÏότεÏης απεικόνισης" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "ΑνÏψωση Με Κλικ" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "ΑνÏψωση ΠαÏαθÏÏου" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "ΑνÏψωση επιλεγμένων παÏαθÏÏων μετα απ το διάστημα" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "ΑνÏψωση παÏαθÏÏου πάνω απ τα άλλα παÏάθυÏα" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "ΑνÏψωση παÏαθÏÏων όταν κλικαÏιστοÏν" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Ρυθμός Ανανέωσης" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Πολλαπλασιαστής μεγέθους οθόνης για οÏιζόντιο εικονικό μέγεθος" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Πολλαπλασιαστής μεγέθους οθόνης για κάθετο εικονικό μέγεθος" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Εμφάνιση Επιφάνειας ΕÏγασίας" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "ΑÏγές ΓÏαφικές Απεικονίσεις" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Έξυπνη κατάσταση " #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "ΣυγχÏονισμός Στην Καθετη Ανανέωση" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Συμπίεση υφών" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "ΦίλτÏο Υφών" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "ΦιλτÏάÏισμα υφών" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Ο Ïυθμός κατα τον οποίο η οθόνη επανασχεδιάζεται (φοÏές/δευτεÏόλεπτο)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Εκκίνηση-Σταμάτημα Μεγιστοποίησης ΠαÏαθÏÏου" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Εκκίνηση-Σταμάτημα Μεγιστοποίησης ΠαÏαθÏÏου ΟÏιζόντια" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Εκκίνηση-Σταμάτημα Μεγιστοποίησης ΠαÏαθÏÏου Κάθετα" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Εκκίνηση-Σταμάτημα Σκίασης ΠαÏαθÏÏου" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Εκκίνηση-Σταμάτημα μεγιστοποίησης ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Εκκίνηση-Σταμάτημα μεγιστοποίησης ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου οÏιζόντια" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Εκκίνηση-Σταμάτημα μεγιστοποίησης ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κάθετα" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Εκκίνηση-Σταμάτημα σκίασης ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Εκκίνηση-Σταμάτημα της χÏήσης των αÏγών γÏαφικών απεικονίσεων" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Απομεγιστοποίηση ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Μη-επανακατεÏθυνση ΠαÏαθÏÏων ΠλήÏους Οθόνης" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "ΧÏήση διάχυτου φωτός όταν η οθόνη μεταμοÏφώνεται" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Κάθετο Εικονικό Μέγεθος" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Î Î¿Î»Ï Î¥ÏˆÎ·Î»ÏŒ" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Ποια απ τις επικαλλÏπτουσες οθόνες Ï€Ïέπει να Ï€Ïοτιμηθεί" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Συνδυασμός κουμπιών Î¼ÎµÎ½Î¿Ï Ï€Î±ÏαθÏÏου" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Συνδυασμός πλήκτÏων Î¼ÎµÎ½Î¿Ï Ï€Î±ÏαθÏÏου" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Επιτάχυνση" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "ΡÏθμιση Εικόνας" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "ΡÏθμιση εικόνας πάνω όψης για πεÏιστÏοφή" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "ΠÏοχώÏημα στο επόμενο σλάιντ" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Κίνηση Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Κίνηση skydome όταν πεÏιστÏέφεται ο κÏβος" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Εμφάνιση" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Αυτόματα" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "ΣυμπεÏιφοÏά" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "ΧÏώμα των πάνω κ κάτω πλευÏών του κÏβου" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "ΧÏώμα για χÏήση με το κάτω στοπ-χÏώματος της διαβάθμισης του skydome-fallback" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "ΧÏώμα για χÏήση με το κοÏυφαίο στοπ-χÏώματος της διαβάθμισης του skydome-" "fallback" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Καπάκια ΚÏβου" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "ΧÏώμα ΚÏβου" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "ΚÏβος Επιφάνειας ΕÏγασίας" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Επιτάχυνση Διπλώματος" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "ΤαχÏτητα Διπλώματος" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "ΧÏονικό Βήμα Διπλώματος" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "ΔημιουÏγία mipmaps όταν γίνεται για ανώτεÏη ποιότητα κλιμάκωσης" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Πήγαινε πίσω στο Ï€ÏοηγοÏμενο σλάιντ" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "ΑÏχεία εικόνας" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Εικόνα για χÏήση ως υφή για το skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Εκκινεί την διαφάνεια του ΚÏβου μόνο όταν η πεÏιστÏοφή οδηγηθεί από το " "ποντίκι" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ΕσωτεÏικός ΚÏβος" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "ΕσωτεÏικός κÏβος" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Λίστα από αÏχεία PNG και SVG που Ï€Ïέπει να εμφανίζονται στην πάνω όψη του " "κÏβου" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Kατάσταση Πολλαπλών Οθονών" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Πολλαπλοί κÏβοι" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Επόμενο Σλάιντ" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Ένας μεγάλος κÏβος" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Αδιαφάνεια Kατα την ΠεÏιστÏοφή" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Αδιαφάνεια Όταν Δεν Γίνεται ΠεÏιστÏοφή" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Αδιαφάνεια του παÏαθÏÏου στην επιφάνεια εÏγασίας κατα την πεÏιστÏοφή." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" "Αδιαφάνεια του παÏαθÏÏου στην επιφάνεια εÏγασίας όταν δεν γίνεται πεÏιστÏοφή." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Τοποθέτηση παÏαθÏÏων στον κÏβο" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "ΠÏοηγοÏμενο Σλάιντ" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Εμφάνιση skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Κλιμάκωση εικόνας" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Κλιμάκωση εικόνων για κάλυψη της πάνω όψης του κÏβου" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Επιλεγει το πως ο κÏβος θα εμφανίζεται εαν χÏησιμοποιηθοÏν πολλαπλές οθόνες." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Τελικό ΧÏώμα Διαβάθμισης Skydome" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "ΑÏχικό ΧÏώμα Διαβάθμισης Skydome" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Εικόνα Skydome" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "ΤαχÏτητα" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "ΧÏονικό Βήμα" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Διαφάνεια Μόνο στην ΠεÏιστÏοφή με το Ποντίκι" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Διάφανος ΚÏβος" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Ξεδίπλωμα" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Ξεδίπλωμα κÏβου" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "ΚÏÏια ΕφαÏμογή Ελέγχου του Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "ΕπιτÏέπει στα mipmaps να δημιουÏγοÏνται για υφές διακοσμήσεων" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Εντολή" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Διακοσμήσεις παÏαθÏÏων" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "ΓÏαμμή εντολών διακοσμητή που θα εκτελείται αν κανένας διακοσμητής δεν " "Ï„Ïέχει ήδη" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "ΑπόÏÏιψη μετάθεσης αÏχής σκιάς Χ" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "ΑπόÏÏιψη μετάθεσης αÏχής σκιάς Î¥" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "ΑπόÏÏιψη χÏώματος σκιάς" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "ΑπόÏÏιψη αδιαφάνειας σκιάς" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "ΑπόÏÏιψη ακτίνας σκιάς" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "ΧÏώμα Σκιάς" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Μετάθεση ΑÏχής X της Σκιάς" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Μετάθεση ΑÏχής Î¥ της Σκιάς" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Αδιαφάνεια Σκιάς" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Ακτίνα Σκιάς" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "ΠαÏάθυÏα με σκιά" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Διακοσμησή ΠαÏαθÏÏου" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Διακοσμήσεις παÏαθÏÏου" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να διακοσμηθοÏν" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να έχουν σκιά" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Φωτεινότητα (σε %) των μη-ανταποκÏινόμενων παÏαθÏÏων" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "ΣταθεÏή ταχÏτητα" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "ΣταθεÏός χÏόνος" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Σκοτείνιασμα Μη-ΑνταποκÏινόμενων ΠαÏαθÏÏων" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Σκοτείνιασμα παÏαθÏÏων που δεν ανταποκÏίνονται στις εντολές του διαχειÏιστή " "παÏαθÏÏων" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Είδος ΞεθωÏιάσματος" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "ΞεθώÏιασμα στο Άνοιγμα/Κλείσιμο/Ελαχιστοποίηση" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "ΤαχÏτητα ΞεθωÏιάσματος" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "ΧÏόνος ΞεθωÏιάσματος" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Εφέ ξεθωÏιάσματος στο άνοιγμα/κλείσιμο/ελαχιστοποίηση παÏαθÏÏων" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Εφέ ξεθωÏιάσματος στο μπίπ συστήματος" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "ΞεθώÏιασμα μέσα παÏαθÏÏων όταν χαÏτογÏαφοÏνται και ξεθώÏιασμα έξω όταν τα " "παÏάθυÏα αποχαÏτογÏαφοÏνται" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "ΞεθώÏιασμα παÏαθÏÏων" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "ΞεθωÏιάζοντας ΠαÏάθυÏα" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Οπτικό ΚουδοÏνι ΠλήÏους Οθόνης" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Εφέ ξεθωÏιάσματος πλήÏους οθόνης στο μπίπ συστήματος" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "ΚοÏεσμός (σε %) των μη-ανταποκÏινόμενων παÏαθÏÏων" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Φωτεινότητα Μη-ΑνταποκÏινόμενων ΠαÏαθÏÏων" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "ΚοÏεσμός Μή-ΑνταποκÏινόμενων ΠαÏαθÏÏων" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Οπτικό ΚουδοÏνι" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Είδος ξεθωÏιάσματος παÏαθÏÏου" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "ΤαχÏτητα ξεθωÏιάσματος παÏαθÏÏου στην κατάσταση \"ΣταθεÏής ταχÏτητας\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" "ΧÏόνος ξεθωÏιάσματος παÏαθÏÏου (σε ms) στην κατάσταση \"ΣταθεÏής ΤαχÏτητας\"" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να ξεθωÏιάζουν" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Σημείο ΠÏοσάÏτησης" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Σημείο Ï€ÏοσάÏτησης" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "ΣÏστημα ΑÏχείων Userspace" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "ΣÏστημα αÏχείων χÏήστη" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "ΚÏÏια ΕφαÏμογή Ελέγχου του GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "ΚÏÏιος βÏόγχος υποστήÏιξης GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Συμβατότητα με Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Ανοιγμα ενός τεÏματικοÏ" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Επιλογές που διατηÏοÏν το Compiz συμβατό με το πεÏιβάλλον επιφάνειας " "εÏγασίας Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "ΤÏέξιμο Διαλόγου" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "ΤÏέξε εντολή τεÏματικοÏ" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "ΓÏαμμή εντολών αÏπαγής οθόνης" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Εμφάνιση ΚÏÏιου ΜενοÏ" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Εμφάνιση διαλόγου ΤÏεξίματος ΕφαÏμογής" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Εμφάνιση του κÏÏιου μενοÏ" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "ΤÏάβα μια αÏπαγή οθόνης" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "ΤÏάβα μια αÏπαγή οθόνης ενός παÏαθÏÏου" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "ΓÏαμμή εντολών τεÏματικοÏ" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "ΓÏαμμή εντολών αÏπαγής οθόνης παÏαθÏÏου" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "ΕφαÏμογή Ελέγχου των Ini ΑÏχείων" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ΠÏόσθετο ειδοποίησης αλλαγής αÏχείου" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "ΚÏÏια ΕφαÏμογή ελέγχου του KConfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Εφέ Ελαχιστοποίησης" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Ελαχιστοποίηση ΠαÏαθÏÏων" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "ΤαχÏτητα ελαχιστοποίησης" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "ΧÏονικό βήμα ελαχιστοποίησης" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Αντίσταση στη Σκίαση" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Αντίσταση στη σκίαση" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" "ΜετατÏοπή παÏαθÏÏων όταν είναι ελαχιστοποιημένα και μή-ελαχιστοποιημένα" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "ΠαÏάθυÏα που θα μετατÏαποÏν οταν ελαχιστοποιηθοÏν" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "ΠεÏιοÏισμός Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "ΠεÏιοÏισμός Î¥ συντεταγμένης στην πεÏιοχή της επιφάνειας εÏγασίας" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Μην ενημεÏώνεις την θέση των παÏαθÏÏων στoν server μέχÏι το τέλος της " "μετακίνησης" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "ΈναÏξη Μετακίνησης ΠαÏαθÏÏου" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "ΟκνηÏός ΠÏοσδιοÏισμός Θεσης" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Μετακίνηση ΠαÏαθÏÏου" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Μετακίνηση παÏαθÏÏου" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Αδιαφάνεια" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Επίπεδο αδιαφάνειας των παÏαθÏÏων που μετακινοÏνται" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "ΑÏπαγή και αυτομάτως απομεγιστοποίηση μεγιστοποιημένων παÏαθÏÏων στο Ï„Ïάβηγμα" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "ΑÏπαγή μεγιστοποιημένων παÏαθÏÏων" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "ΈναÏξη μετακίνησης παÏαθÏÏου" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Φωτεινότητα" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Μείωση Φωτεινότητας" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "ΑÏξηση Φωτεινότητας" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Βήμα Φωτεινότητας" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Τιμές φωτεινότητας παÏαθÏÏων" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Μείωση" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "ΑÏξηση" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Μείωση αδιαφάνειας" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "ΑÏξηση αδιαφάνειας" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Βήμα Αδιαφάνειας" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Τιμές αδιαφάνειας παÏαθÏÏων" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Αδιαφάνεια, Φωτεινότητα και ΚοÏεσμός " #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Ρυθμίσεις Αδιαφάνειας, Φωτεινότητας και ΚοÏεσμοÏ" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "ΚοÏεσμός" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Μείωση ΚοÏεσμοÏ" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "ΑÏξηση ΚοÏεσμοÏ" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Βήμα ΚοÏεσμοÏ" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Τιμές κοÏÎµÏƒÎ¼Î¿Ï Ï€Î±ÏαθÏÏων" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Βήμα" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "ΣυγκεκÏιμένες Ïυθμίσεις παÏαθÏÏου" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Τιμές παÏαθÏÏου" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "ΠαÏάθυÏα" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να έχουν διαφοÏετική φωτεινότητα εξ' οÏισμοÏ" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να έχουν διαφοÏετική διαφάνεια εξ' οÏισμοÏ" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να έχουν διαφοÏετικό κοÏεσμό εξ' οÏισμοÏ" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "ΑλγόÏιθμος για τοποθέτηση των παÏαθÏÏων" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "ΚατταÏάκτης" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Στο ΚέντÏο" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "ΣταθεÏή Τοποθέτηση ΠαÏαθÏÏου" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Εξαναγκασμός Τοποθέτησης ΠαÏαθÏÏων" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "ΟÏιζόντιες θέσεις εικονικών επιφανειών εÏγασίας" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "ΔιατήÏηση Στον ΧώÏο ΕÏγασίας" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "ΔιατήÏηση του τοποθετημένου παÏαθÏÏου στον χώÏο εÏγασίας, ακόμα κ αν αυτό " "σημαίνει οτι η θέση του μποÏεί να διαφέÏει απο την καθοÏισμένη του θέση" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Τοποθέτηση ΠαÏαθÏÏων" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Τοποθέτηση σε όλες τις οθόνες" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Τοποθέτηση παÏαθÏÏων στις κατάλληλες θέσεις όταν ταξινομοÏνται" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "ΤÏόπος τοποθέτησης" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Τοποθετημένα παÏάθυÏα" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Τυχαία" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Επιλέγει το πως η τοποθέτηση παÏαθÏÏων θα συμπεÏιφεÏθεί αν γινει χÏήση " "πολλαπλών οθονών" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Έξυπνο" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "ΧÏήση της ενεÏγής συσκευής εξόδου" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "ΧÏήση της συσκευής εξόδου του εστιασμένου παÏαθÏÏου" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "ΧÏήση της συσκευής εξόδου με τον δείκτη" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Κάθετες θέσεις εικονικών επιφανειών εÏγασίας" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Τοποθετημένα παÏάθυÏα στις εικονικές επιφάνειες εÏγασίας" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Μοντίφες για τοποθέτηση παÏαθÏÏων" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να τοποθετηθοÏν εξ' οÏισμοÏ" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "ΠαÏάθυÏα που θα τοποθετηθοÏν σε συγκεκÏιμένες εικονικές επιφάνειες εÏγασίας " "εξ' οÏισμοÏ" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "ΠαÏάθυÏα που Ï€Ïέπει αναγκαστικά να τοποθετηθοÏν, ακόμα κ αν υποδεικνÏουν " "στον διαχειÏιστή παÏαθÏÏων οτι Ï€Ïέπει να αποφÏγει να τα τοποθετήσει." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "ΠαÏάθυÏα με σταθεÏές θέσεις" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "ΠαÏάθυÏα με σταθεÏές εικονικές επιφάνειες εÏγασίας" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Μοντίφες" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Θέσεις Χ" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Θέσεις Χ Εικονικών Επιφανειών ΕÏγασίας" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Τιμές θέσης Χ" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Θέσεις Î¥" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Θέσεις Î¥ Εικονικών Επιφανειών ΕÏγασίας" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Τιμές θέσης Î¥" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "ΦοÏτωτής εικόνων Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "ΤαίÏιαγμα Regex" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "ΤαίÏιαγμα παÏαθÏÏου regex" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Συνδυασμοί" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "ΧÏώμα ΟÏίου" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "ΧÏώμα οÏίου για τις καταστάσεις μοÏφοποίησης τετÏάγωνο και πεÏίγÏαμμα" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "ΠÏοκαθοÏισμένη Κατάσταση ΜοÏφοποίησης" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "ΠÏοκαθοÏισμένη κατάσταση για μοÏφοποιήση παÏαθÏÏου" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "ΧÏώμα Γεμίσματος" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "ΧÏώμα για χÏήση στην τετÏάγωνη κατάσταση μοÏφοποίησης" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Εκκίνηση Κανονικής ΜοÏφοποίησης ΠαÏαθÏÏου" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Εκκίνηση ΜοÏφής ΜοÏφοποίησης ΠεÏιγÏάμματος" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Εκκίνηση ΤετÏάγωνης ΜοÏφής ΜοÏφοποίησης" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Εκκίνηση ΜοÏφής ΜοÏφοποίησης ΠαÏαμοÏφώσεως" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Εκκίνηση ΜοÏφοποίησης ΠαÏαθÏÏου" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Κανονική ΜοÏφοποίηση ΠαÏαθÏÏων" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "ΠεÏίγÏαμμα" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "ΜοÏφοποίηση ΠεÏίγÏάμματος" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "ΤετÏάγωνο" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "ΤετÏάγωνη ΜοÏφοποίηση ΠαÏαθÏÏων" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "ΜοÏφοποίηση ΠαÏαθÏÏου" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "ΜοÏφοποίηση παÏαθÏÏου" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "ΈναÏξη μοÏφοποίησης παÏαθÏÏου" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "ΈναÏξη μοÏφοποίησης παÏαθÏÏου παÏαμοÏφώνοντάς το" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "ΈναÏξη μοÏφοποίησης παÏαθÏÏου κανονικά" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "ΈναÏξη μοÏφοποίησης παÏαθÏÏου με πεÏίγÏαμμα" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "ΈναÏξη μοÏφοποίησης παÏαθÏÏου με το τετÏάγωνο" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "ΠαÏαμόÏφωση" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "ΜοÏφοποίηση ΠαÏαθÏÏου με ΠαÏαμόÏφωση" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "ΠαÏάθυÏα στα οποία θα χÏησιμοποιηθεί κανονική μοÏφοποίηση" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "ΠαÏάθυÏα στα οποία θα χÏησιμοποιηθεί μοÏφοποίηση πεÏιγÏάμματος" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "ΠαÏάθυÏα στα οποία θα χÏησιμοποιηθεί τετÏαγωνική μοÏφοποίηση" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "ΠαÏάθυÏα στα οποία θα χÏησιμοποιηθεί μοÏφοποίηση με παÏαμόÏφωση" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "ΓÏÏισμα ΆκÏης DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "ΓÏÏισμα ΆκÏης με Μετακίνηση" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "ΓÏÏισμα ΆκÏης με Δείκτη" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "ΧÏόνος ΓυÏίσματος" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "ΓÏÏισμα στην αÏιστεÏή εικονική επιφάνεια εÏγασίας και Ï„Ïλιγμα δείκτη" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "ΓÏÏισμα στην επόμενη εικονική επιφάνεια εÏγασίας όταν Ï„Ïαβιέται αντικείμενο " "στην άκÏη της οθόνης" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "ΓÏÏισμα στην επόμενη εικονική επιφάνεια εÏγασίας όταν μετακινείται ο δείκτης " "στην άκÏη της οθόνης" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "ΓÏÏισμα στην επόμενη εικονική επιφάνεια εÏγασίας όταν μετακινείται " "παÏάθυÏοστην άκÏη της οθόνης" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "ΓÏÏισμα στην δεξιά εικονική επιφάνεια εÏγασίας και Ï„Ïλιγμα δείκτη" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "ΑναστÏοφή στον Î¥ άξονα για μετακίνηση του δείκτη" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "ΑναστÏοφή Î¥ Δείκτη" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Ευαισθησία Δείκτη" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "ΑνÏψωση στην πεÏιστÏοφή" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "ΑνÏψωση παÏαθÏÏου στην πεÏιστÏοφή" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "ΠεÏιστÏοφή ΚÏβου" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "ΠεÏιστÏοφή ΓÏÏισμα ΑÏιστεÏά" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "ΠεÏιστÏοφή ΓÏÏισμα Δεξιά" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "ΠεÏιστÏοφή ΑÏιστεÏά" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "ΠεÏιστÏοφή ΑÏιστεÏά με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "ΠεÏιστÏοφή Δεξιά" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "ΠεÏιστÏοφή Δεξιά με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "ΠεÏιστÏοφή Στο" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "ΠεÏιστÏοφή Στην Όψη 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "ΠεÏιστÏοφή Στην Όψη 1 με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "ΠεÏιστÏοφή Στην Όψη 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "ΠεÏιστÏοφή Στην Όψη 10 με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "ΠεÏιστÏοφή Στην Όψη 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "ΠεÏιστÏοφή Στην Όψη 11 με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "ΠεÏιστÏοφή Στην Όψη 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "ΠεÏιστÏοφή Στην Όψη 12 με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "ΠεÏιστÏοφή Στην Όψη 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "ΠεÏιστÏοφή Στην Όψη 2 με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "ΠεÏιστÏοφή Στην Όψη 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "ΠεÏιστÏοφή Στην Όψη 3 με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "ΠεÏιστÏοφή Στην Όψη 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "ΠεÏιστÏοφή Στην Όψη 4 με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "ΠεÏιστÏοφή Στην Όψη 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "ΠεÏιστÏοφή Στην Όψη 5 με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "ΠεÏιστÏοφή Στην Όψη 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "ΠεÏιστÏοφή Στην Όψη 6 με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "ΠεÏιστÏοφή Στην Όψη 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "ΠεÏιστÏοφή Στην Όψη 7 με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "ΠεÏιστÏοφή Στην Όψη 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "ΠεÏιστÏοφή Στην Όψη 8 με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "ΠεÏιστÏοφή Στην Όψη 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "ΠεÏιστÏοφή Στην Όψη 9 με ΠαÏάθυÏο" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "ΠεÏιστÏοφή του κÏβου" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "ΠεÏιστÏοφή κÏβου επιφάνειας εÏγασίας" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "ΠεÏιστÏοφή αÏιστεÏά" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "ΠεÏιστÏοφή αÏιστεÏά και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "ΠεÏιστÏοφή δεξιά" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "ΠεÏιστÏοφή δεξιά και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "ΠεÏιστÏοφή του κÏβου στην όψη 1" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "ΠεÏιστÏοφή του κÏβου στην όψη 1 με παÏάθυÏο" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "ΠεÏιστÏοφή στην όψη 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "ΠεÏιστÏοφή στην όψη 1 και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "ΠεÏιστÏοφή στην όψη 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "ΠεÏιστÏοφή στην όψη 10 και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "ΠεÏιστÏοφή στην όψη 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "ΠεÏιστÏοφή στην όψη 11 και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "ΠεÏιστÏοφή στην όψη 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "ΠεÏιστÏοφή στην όψη 12 και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "ΠεÏιστÏοφή στην όψη 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "ΠεÏιστÏοφή στην όψη 2 και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "ΠεÏιστÏοφή στην όψη 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "ΠεÏιστÏοφή στην όψη 3 και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "ΠεÏιστÏοφή στην όψη 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "ΠεÏιστÏοφή στην όψη 4 και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "ΠεÏιστÏοφή στην όψη 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "ΠεÏιστÏοφή στην όψη 5 και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "ΠεÏιστÏοφή στην όψη 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "ΠεÏιστÏοφή στην όψη 6 και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "ΠεÏιστÏοφή στην όψη 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "ΠεÏιστÏοφή στην όψη 7 και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "ΠεÏιστÏοφή στην όψη 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "ΠεÏιστÏοφή στην όψη 8 και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "ΠεÏιστÏοφή στην όψη 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "ΠεÏιστÏοφή στην όψη 9 και μεταφοÏά ενεÏÎ³Î¿Ï Ï€Î±ÏαθÏÏου κατα μήκος" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "ΠεÏιστÏοφή στην εικονική επιφάνεια εÏγασίας" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "ΠεÏιστÏοφή παÏαθÏÏου" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "ΠεÏιστÏοφή με παÏάθυÏο" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Επιτάχυνση ΠεÏιστÏοφής" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "ΤαχÏτητα ΠεÏιστÏοφής" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "ΧÏονικό Βήμα ΠεÏιστÏοφής" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Ζουμ ΠεÏιστÏοφής" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Ευαισθησία της μετακίνησης του δείκτη" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "ΑÏπαγή ΠεÏιστÏοφής ΚÏβου στην Κάτω Όψη" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ΑÏπαγή ΠεÏιστÏοφής ΚÏβου στην Πάνω Όψη" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "ΑÏπαγή Στην Κάτω Όψη" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ΑÏπαγή Στην Πάνω Όψη" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "ΈναÏξη ΠεÏιστÏοφής" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Τέλος χÏόνου Ï€Ïιν το γÏÏισμα της εικονικής επιφάνειας εÏγασίας" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Ζουμ" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Ποσοστό αδιαφάνειας επι της εκατό" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Μεγάλο" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Συνδυασμοί Κουμπιών για Εκκίνηση-Σταμάτημα Κατάστασης Κλιμάκωσης" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Συνδυασμοί κουμπιών που αντιθέτως λειτουÏγοÏν ως διακόπτης για την κατάσταση " "κλιμάκωσης την ενεÏγοποιοÏν όταν πατηθοÏν και απενεÏγοποιοÏν όταν αφεθοÏν." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Κλικ στην Επιφάνεια ΕÏγασίας για Εμφάνιση Επιφάνειας ΕÏγασίας" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Σκοτείνιασμα Φόντου" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Σκοτείνιασμα φόντου στην κλιμάκωση παÏαθÏÏων" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Έμβλημα" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Είσοδος στην κατάσταση Εμφάνισης Επιφάνειας ΕÏγασίας όταν η Επιφάνεια " "ΕÏγασίας κλικαÏιστεί κατα τη διάÏκεια της Κλιμάκωσης" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ΧÏόνος ΑιώÏησης" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Εκκίνηση Διαλογέα ΠαÏαθÏÏου" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Εκκίνηση Διαλογέα ΠαÏαθÏÏου Για Όλα τα ΠαÏάθυÏα" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Εκκίνηση Διαλογέα ΠαÏαθÏÏου Για Ομάδα ΠαÏαθÏÏων" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Εκκίνηση Διαλογέα ΠαÏαθÏÏου Για ΠαÏάθυÏα στην ΤÏέχουσα Έξοδο" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Συνδυασμοί ΠλήκτÏων για Εκκίνηση-Σταμάτημα Κατάστασης Κλιμάκωσης" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Συνδυασμοί πλήκτÏων που αντιθέτως λειτουÏγοÏν ως διακόπτης για την κατάσταση " "κλιμάκωσης ενεÏγοποιόντας την όταν πατηθοÏν και απενεÏγοποιόντας την όταν " "αφεθοÏν. " #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Διάταξη και μεταμόÏφωση όλων των παÏαθÏÏων" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Διάταξη και έναÏξη μεταμόÏφωσης ομάδας παÏαθÏÏων" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Διάταξη και έναÏξη μεταμόÏφωσης παÏαθÏÏων" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Διάταξη και έναÏξη μεταμόÏφωσης παÏαθÏÏων στην Ï„Ïέχουσα έξοδο" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Σε όλες τις συσκευές εξόδου" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Στην Ï„Ïέχουσα συσκευή εξόδου" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ΕπίστÏωση Εικονιδίου" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "ΕπίστÏωση ενός εικονιδίου στα παÏάθυÏα μόλις αυτά κλιμακωθοÏν" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Κλιμάκωση" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Κλιμάκωση ΠαÏαθÏÏων" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "ΤαχÏτητα κλιμάκωσης" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "ΧÏονικό βήμα κλιμάκωσης" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Κλιμάκωση παÏαθÏÏων" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Επιλέγει το αν τα παÏάθυÏα κλιμακωθοÏν αν γινει χÏήση πολλαπλών συσκευών " "εξόδου." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "ΧώÏος Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ παÏαθÏÏων" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "ΧωÏοταξία" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "ΧÏόνος (σε ms) Ï€Ïίν να τεÏματιστεί η κατάσταση κλιμάκωσης κατά τη διάÏκεια " "της αιώÏησης πάνω από ένα παÏάθυÏο" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να κλιμακωθοÏν σε κατάσταση κλιμάκωσης" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Αυτόματο άνοιγμα αÏπαγής οθόνης σε αυτή την εφαÏμογή" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "ΔιαδÏομή" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Εκκίνηση τετÏάγωνης αÏπαγής οθόνης" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Εκκίνηση ΕφαÏμογής" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Τοποθέτηση των εικόνων αÏπαγής οθόνης σε αυτή τη διαδÏομή" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "ΑÏπαγή Οθόνης" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "ΠÏόσθετο αÏπαγής οθόνης" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "ΦοÏτωτής εικόνας svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Ποσό φωτεινότητας σε ποσοστό επι της εκατό" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Ποσό κοÏÎµÏƒÎ¼Î¿Ï ÏƒÎµ ποσοστό επι της εκατό" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Επιλογέας ΕφαÏμογών" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Αυτόματη ΠεÏιστÏοφή" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "ΜεταφοÏά ΜπÏοστά" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "ΜεταφοÏά επιλεγμένου παÏάθυÏου μπÏοστά" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Η απόσταση της επιφάνειας εÏγασίας που Ï€Ïέπει να ζουμαÏιστεί έξω κατα την " "εναλλαγή παÏαθÏÏων" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Εικονίδιο" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Ελαχιστοποιημένο" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Επόμενο Πάνελ" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Επόμενο παÏάθυÏο" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Επόμενο παÏάθυÏο (Όλα τα παÏάθυÏα)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Επόμενο παÏάθυÏο (Οχι popup)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" "Κάνει popup τον επιλογέα αν δεν είναι οÏατός και επιλέγει το επόμενο παÏάθυÏο" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Κάνει popup τον επιλογέα αν δεν είναι οÏατός και επιλέγει το επόμενο " "παÏάθυÏο απο όλα τα παÏάθυÏα" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" "Κάνει popup τον επιλογέα αν δεν είναι οÏατός και επιλέγει το Ï€ÏοηγοÏμενο " "παÏάθυÏο" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Κάνει popup τον επιλογέα αν δεν είναι οÏατός και επιλέγει το Ï€ÏοηγοÏμενο " "παÏάθυÏο απο όλα τα παÏάθυÏα" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "ΠÏοηγοÏμενο Πάνελ" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "ΠÏοηγοÏμενο παÏάθυÏο" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "ΠÏοηγοÏμενο παÏάθυÏο (Όλα τα παÏάθυÏα)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "ΠÏοηγοÏμενο παÏάθυÏο (Οχι popup)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "ΠεÏιστÏοφή στο επιλεγμένο παÏάθυÏο κατα την εναλλαγή" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Επιλογή Ï„Ïπου παÏαθÏÏου του επόμενου πάνελ." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Επιλογή του επόμενου παÏαθÏÏου χωÏίς εμφάνιση του παÏαθÏÏου popup." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Επιλογή Ï„Ïπου παÏαθÏÏου του Ï€ÏοηγοÏμενου πάνελ." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Επιλογή του Ï€ÏοηγοÏμενου παÏαθÏÏου χωÏίς εμφάνιση του παÏαθÏÏου popup." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Εμφάνιση εικονιδίου δίπλα στη μικÏογÏαφία" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Εμφάνιση ελαχιστοποιημένων παÏαθÏÏων" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "ΤαχÏτητα επιλογέα" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "ΧÏονικό βήμα επιλογέα" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Επιλογέας παÏαθÏÏων" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "ΠαÏάθυÏα που δεν Ï€Ïέπει να εμφανίζονται στον επιλογέα" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "ΧοÏήγηση υποστήÏιξης YV12 χÏÏ‰Î¼Î±Ï„Î¹ÎºÎ¿Ï Î¼Î¿Î½Ï„Î­Î»Î¿Ï…" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Παίξιμο Βίντεο" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Παίξιμο βίντεο" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "ΧÏωματικό μοντέλο YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "ΠÏοσθήκη γÏαμμής" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "ΠÏοσθήκη σημείου" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "ΠÏοσθέτει τα εφέ νεÏÎ¿Ï ÏƒÎµ διαφοÏετικές ενέÏγειες επιφάνειας εÏγασίας" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "ΚαθυστέÏηση (σε χιλ.δευτεÏολέπτου) Î¼ÎµÏ„Î±Î¾Ï ÎºÎ¬Î¸Îµ σταγόνας βÏοχής" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "ΕνεÏγοποίηση των εφέ νεÏÎ¿Ï Î³Î¹Î± τον δείκτη" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "ΓÏαμμή" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Κλιμάκωση Μετάθεσης ΑÏχής" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Σημείο" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "ΚαθυστέÏηση Î’Ïοχής" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Τίτλος κÏματος" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Εκκίνηση-Σταμάτημα βÏοχής" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Εκκίνηση-Σταμάτημα εφέ βÏοχής" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Εκκίνηση-Σταμάτημα γυαλοκαθαÏιστήÏα" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Εκκίνηση-Σταμάτημα εφέ γυαλοκαθαÏιστήÏα" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Εφέ ÎεÏοÏ" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Κλιμάκωση μετάθεσης αÏχής νεÏοÏ" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Εφέ κÏματος από τον τίτλο παÏαθÏÏου" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Εφέ Εστίασης" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Εφέ Εστίασης ΠαÏαθÏÏου" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Εστιάζει ΠαÏάθυÏα" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "ΤÏιβή" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Πιάσιμο ΠαÏαθÏÏων" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Ανάλυση Πλέγματος" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "ΑντίστÏοφο άÏπαγμα παÏαθÏÏου" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Κάνει το παÏάθυÏο να Ï„Ïέμει" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Εφέ ΧαÏτογÏάφησης" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Εφέ ΧαÏτογÏάφησης ΠαÏαθÏÏου" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "ΧαÏτογÏάφηση ΠαÏαθÏÏων" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Εφέ Μεγιστοποίησης" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Ελάχιστο Μέγεθος Πλέγματος" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Ελάχιστο Μέγεθος ΚοÏυφαίου Πλέγματος" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Μετακίνηση ΠαÏαθÏÏων" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "ΤÏεμοÏλιασμα" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "ΑντίστÏοφο ΆÏπαγμα" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "ΆÏπαγμα παÏαθÏÏων" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "ΤÏιβή ΕλατηÏίου" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Κ ΕλατηÏίου" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "ΣταθεÏά ΕλατηÏίου" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Εκκίνηση-Σταμάτημα αÏπάγματος παÏαθÏÏου" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "ΧÏήση μοντέλου ελατηÏίου για το εφέ ταλάντωσης παÏαθÏÏου" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Ανάλυση ΚοÏυφαίου Πλέγματος" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να ταλαντευτοÏν όταν εστιαστοÏν" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να ταλαντευτοÏν όταν πιαστοÏν" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να ταλαντευτοÏν όταν χαÏτογÏαφηθοÏν" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "ΠαÏάθυÏα που Ï€Ïέπει να ταλαντευτοÏν όταν μετακινηθοÏν" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Εφέ ταλάντευσης όταν μεγιστοποιοÏνται και απομεγιστοποιοÏνται παÏάθυÏα" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Ταλαντευόμενα ΠαÏάθυÏα" #~ msgid "Command line 0" #~ msgstr "ΓÏαμμή εντολών 0" #~ msgid "Run command 0" #~ msgstr "ΤÏέξιμο εντολής 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "ΓÏαμμή εντολών αÏπαγής οθόνης" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "ΓÏαμμή εντολών αÏπαγής οθόνης" #~ msgid "Filter Linear" #~ msgstr "ΓÏαμμικό ΦιλτÏάÏισμα" #~ msgid "Use linear filter when zoomed in" #~ msgstr "ΧÏήση γÏÎ±Î¼Î¼Î¹ÎºÎ¿Ï Ï†Î¹Î»Ï„ÏαÏίσματος όταν ζουμάÏεται μέσα" #~ msgid "Zoom Desktop" #~ msgstr "ΖουμάÏισμα Επιφάνειας ΕÏγασίας" #~ msgid "Zoom In" #~ msgstr "Ζουμ Μέσα" #~ msgid "Zoom Out" #~ msgstr "Ζουμ Έξω" #~ msgid "Zoom Pan" #~ msgstr "Pan του ΖοÏμ" #~ msgid "Zoom Speed" #~ msgstr "ΤαχÏτητα Ζουμ" #~ msgid "Zoom Timestep" #~ msgstr "ΧÏονικό Βήμα Ζουμ" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Pan και ζοÏμ του κÏβου" #~ msgid "Zoom factor" #~ msgstr "ΠαÏάγοντας ζουμ" #~ msgid "Zoom pan" #~ msgstr "Pan του ζοÏμ" #~ msgid "Decrease window opacity" #~ msgstr "Μείωση αδιαφάνειας παÏαθÏÏου" #~ msgid "Increase window opacity" #~ msgstr "ΑÏξηση αδιαφάνειας παÏαθÏÏου" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Τιμές αδιαφάνειας για παÏάθυÏα που Ï€Ïέπει να είναι διάφανα απο Ï€Ïοεπιλογή" #~ msgid "Opacity windows" #~ msgstr "Αδιαφάνεια παÏαθÏÏων" #~ msgid "Background Images" #~ msgstr "Εικόνες Φόντου" #~ msgid "Background images" #~ msgstr "Εικόνες φόντου" #~ msgid "Place windows on a plane" #~ msgstr "Τοποθέτηση παÏαθÏÏων στο πλάνο" #~ msgid "Plane Down" #~ msgstr "Μετακίνηση Πλάνου Κάτω" #~ msgid "Plane Left" #~ msgstr "Μετακίνηση Πλάνου ΑÏιστεÏά" #~ msgid "Plane Right" #~ msgstr "Μετακίνηση Πλάνου Δεξιά" #~ msgid "Plane To Face 1" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 1" #~ msgid "Plane To Face 10" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 10" #~ msgid "Plane To Face 11" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 11" #~ msgid "Plane To Face 12" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 12" #~ msgid "Plane To Face 2" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 2" #~ msgid "Plane To Face 3" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 3" #~ msgid "Plane To Face 4" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 4" #~ msgid "Plane To Face 5" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 5" #~ msgid "Plane To Face 6" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 6" #~ msgid "Plane To Face 7" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 7" #~ msgid "Plane To Face 8" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 8" #~ msgid "Plane To Face 9" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 9" #~ msgid "Plane Up" #~ msgstr "Μετακίνηση Πλάνου Πάνω" #~ msgid "Plane down" #~ msgstr "Μετακίνηση πλάνου κάτω" #~ msgid "Plane left" #~ msgstr "Μετακίνηση πλάνου αÏιστεÏά" #~ msgid "Plane right" #~ msgstr "Μετακίνηση πλάνου δεξιά" #~ msgid "Plane to face 1" #~ msgstr "Μετακίνηση πλάνου στην όψη 1" #~ msgid "Plane to face 10" #~ msgstr "Μετακίνηση πλάνου στην όψη 10" #~ msgid "Plane to face 11" #~ msgstr "Μετακίνηση πλάνου στην όψη 11" #~ msgid "Plane to face 12" #~ msgstr "Μετακίνηση πλάνου στην όψη 12" #~ msgid "Plane to face 2" #~ msgstr "Μετακίνηση πλάνου στην όψη 2" #~ msgid "Plane to face 3" #~ msgstr "Μετακίνηση πλάνου στην όψη 3" #~ msgid "Plane to face 4" #~ msgstr "Μετακίνηση πλάνου στην όψη 4" #~ msgid "Plane to face 5" #~ msgstr "Μετακίνηση πλάνου στην όψη 5" #~ msgid "Plane to face 6" #~ msgstr "Μετακίνηση πλάνου στην όψη 6" #~ msgid "Plane to face 7" #~ msgstr "Μετακίνηση πλάνου στην όψη 7" #~ msgid "Plane to face 8" #~ msgstr "Μετακίνηση πλάνου στην όψη 8" #~ msgid "Plane to face 9" #~ msgstr "Μετακίνηση πλάνου στην όψη 9" #~ msgid "Plane up" #~ msgstr "Μετακίνηση πλάνου πάνω" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ΧÏόνος ΞεθωÏιάσματος Αδιαφάνειας ΠαÏαθÏÏου Επιφάνειας ΕÏγασίας." compiz-0.9.11+14.04.20140409/po/hi.po0000644000015301777760000034347712321343002017072 0ustar pbusernogroup00000000000000# translation of compiz.po to # Hindi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Prasanth Kurian # msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2007-12-16 17:03+0530\n" "Last-Translator: Sangeeta Kumari\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "X-Generator: KBabel 1.11.4\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "विनà¥à¤¡à¥‹ मैनेजर" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "कà¥à¤› नहीं" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "सà¥à¤•ैनर" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "windows" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "विंडो कà¥à¤·à¥ˆà¤¤à¤¿à¤œ रूप से अधिकतम करें" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "विंडो लंबवत रूप से अधिकतम करें" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "windows" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "विनà¥à¤¡à¥‹ मैनेजर" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "विंडो शीरà¥à¤·à¤• बार में माउस सà¥à¤•à¥à¤°à¥‰à¤² के दौरान ली जाने वाली कà¥à¤°à¤¿à¤¯à¤¾" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "छोडं दिया \n" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "मेटासिटी थीम सकà¥à¤°à¤¿à¤¯ विंडो अपारदरà¥à¤¶à¤¿à¤¤à¤¾" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "मेटासिटी थीम सकà¥à¤°à¤¿à¤¯ विंडो अपारदरà¥à¤¶à¤¿à¤¤à¤¾ छाया" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "मेटासिटी थीम अपारदरà¥à¤¶à¤¿à¤¤à¤¾" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "मेटासिटी थीम अपारदरà¥à¤¶à¤¿à¤¤à¤¾ छाया" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "मेटासिटी थीम सजावट के साथ सकà¥à¤°à¤¿à¤¯ विंडो के लिठपà¥à¤°à¤¯à¥‹à¤— करने के लिठअपारदरà¥à¤¶à¤¿à¤¤à¤¾" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "मेटासिटी थीम सजावट के लिठपà¥à¤°à¤¯à¥‹à¤— के लिठअपारदरà¥à¤¶à¤¿à¤¤à¤¾" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "अपारदरà¥à¤¶à¥€ से पारभासी में मेटासिटी थीम सजावट के साथ छाया सकà¥à¤°à¤¿à¤¯ विंडो" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "अपारदरà¥à¤¶à¥€ से पारभासी में मेटासिटी थीम सजावट के साथ छाया विंडो" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "शीरà¥à¤·à¤• बार माउस हà¥à¤µà¥€à¤² कà¥à¤°à¤¿à¤¯à¤¾" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "विंडो सजावट के लिठपà¥à¤°à¤¯à¥à¤•à¥à¤¤ बà¥à¤²à¤° का पà¥à¤°à¤•ार" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "मेटासिटी थीम का उपयोग करें" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "विंडो सजवाट खींचने के दौरान मेटासिटी थीम का उपयोग करें" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "windows" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "विंडो अधिकतम खतà¥à¤® करें" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "विंडो अधिकतम करें" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "विंडो नà¥à¤¯à¥‚नतम करें" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "भारत" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "रंग" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "सà¥à¤Ÿà¥à¤°à¥‹à¤• रंग की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "सकà¥à¤°à¤¿à¤¯" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "साफ करें" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "खीचें" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "औजार के पà¥à¤°à¤¯à¥‹à¤— से खीचें" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ के लिठरंग भरें" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "भारत" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "भारत" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "भारत" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "भारत" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "रेखा चौड़ाई" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ के लिठरेखा चौड़ाई" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ के लिठसà¥à¤Ÿà¥à¤°à¥‹à¤• रंग" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "सà¥à¤Ÿà¥à¤°à¥‹à¤• चौड़ाई" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ के लिठसà¥à¤Ÿà¥à¤°à¥‹à¤• चौड़ाई" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "फिलà¥à¤Ÿà¤°:" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "windows" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "windows" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "फिलà¥à¤Ÿà¤° सैट करें" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "अवधि" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "अवधि" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "छोडं दिया \n" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "windows" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "विंडो के पारदरà¥à¤¶à¥€ हिसà¥à¤¸à¥‡ को बà¥à¤²à¤° करें" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "अवधि" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "windows" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "विंडोज को धà¥à¤‚धला करें जो फोकस नहीं रखता है" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "दूसरे विंडो के दà¥à¤µà¤¾à¤°à¤¾ धà¥à¤‚धला बनाये गये सà¥à¤•à¥à¤°à¥€à¤¨ कà¥à¤·à¥‡à¤¤à¥à¤° के धà¥à¤‚धलेपन को निषà¥à¤•à¥à¤°à¤¿à¤¯ करें." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "धà¥à¤‚धलेपन के लिठपà¥à¤°à¤¯à¥à¤•à¥à¤¤ फिलà¥à¤Ÿà¤° विधि" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "windows" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "windows" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "गॉसियन" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "गॉसियन तà¥à¤°à¤¿à¤œà¥à¤¯à¤¾" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "गॉसियन शकà¥à¤¤à¤¿" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "गॉसियन तà¥à¤°à¤¿à¤œà¥à¤¯à¤¾" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "गॉसियन शकà¥à¤¤à¤¿" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "लीमा" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "लीमा" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "विसà¥à¤¤à¤¾à¤° का मिपमैप सà¥à¤¤à¤°" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "पलà¥à¤¸" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "पलà¥à¤¸ पà¥à¤°à¤­à¤¾à¤µ" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "windows" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "विंडोज़ को फोसक बà¥à¤²à¤° के दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ किया जाना चाहिà¤" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "विंडोज़ जिसे मूलभूत रूप से अलà¥à¤«à¤¾ धà¥à¤‚धला का पà¥à¤°à¤¯à¥‹à¤— करना चाहिà¤" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "कà¥à¤²à¥‹à¤¨ आउटपà¥à¤Ÿ" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "भारत" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "आउटपà¥à¤Ÿ कà¥à¤²à¥‹à¤¨ नियंतà¥à¤°à¤•" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand0 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand1 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand10 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand11 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand2 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand3 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand4 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand5 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand6 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand7 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand8 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand9 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand0 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand1 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand10 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand11 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand2 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand3 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand4 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand5 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand6 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand7 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand8 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand9 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand0 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand1 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand10 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand11 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand2 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand3 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand4 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand5 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand6 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand7 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand8 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "à¤à¤• कीबाइंडिंग को जब बà¥à¤²à¤¾à¤¯à¤¾ जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand9 के " "दà¥à¤µà¤¾à¤°à¤¾" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command0 को बà¥à¤²à¤¾à¤¯à¤¾ जाता है" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command1 को बà¥à¤²à¤¾à¤¯à¤¾ जाता है" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command10 को बà¥à¤²à¤¾à¤¯à¤¾ जाता है" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command11 को बà¥à¤²à¤¾à¤¯à¤¾ जाता है" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command2 को बà¥à¤²à¤¾à¤¯à¤¾ जाता है" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command3 को बà¥à¤²à¤¾à¤¯à¤¾ जाता है" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command4 को बà¥à¤²à¤¾à¤¯à¤¾ जाता है" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command5 को बà¥à¤²à¤¾à¤¯à¤¾ जाता है" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command6 को बà¥à¤²à¤¾à¤¯à¤¾ जाता है" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command7 को बà¥à¤²à¤¾à¤¯à¤¾ जाता है" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command8 को बà¥à¤²à¤¾à¤¯à¤¾ जाता है" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command9 को बà¥à¤²à¤¾à¤¯à¤¾ जाता है" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "कमानà¥à¤¡ '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "कमानà¥à¤¡ '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "कमानà¥à¤¡ '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "कमानà¥à¤¡ '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "कमांड:" #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "सकà¥à¤°à¤¿à¤¯" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "ऑफसà¥à¤•à¥à¤°à¥€à¤¨ पिकà¥à¤¸à¤®à¥ˆà¤ª में फिर नहीं निरà¥à¤¦à¥‡à¤¶à¤¿à¤¤ किठजाने के लिठपूरà¥à¤£à¤¸à¥à¤•à¥à¤°à¥€à¤£ विंडो के आरेख को सà¥à¤µà¥€à¤•ृति " "दें" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "सà¥à¤¨à¤¨à¥‡ योगà¥à¤¯ घंटी" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "फाइल सिसà¥à¤Ÿà¤®" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ उठान विलंब" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "आउटपà¥à¤Ÿ डिवायस की सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ जांच" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "ताज़ा दर की सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ जांच" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "सरà¥à¤µà¥‹à¤¤à¥à¤¤à¤®" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "फोकस में कà¥à¤²à¤¿à¤• करें" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "विंडो पर कà¥à¤²à¤¿à¤• करना इनपà¥à¤Ÿ फोकस को इसपर खिसकाता है" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "सकà¥à¤°à¤¿à¤¯ विंडो बनà¥à¤¦ करें" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "अकरण डोमैन" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "अकरण डोमैन" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "आउटपà¥à¤Ÿ जांचें" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "अपडेट के लिठचà¥à¤¨à¥‡à¤‚" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "तेज" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "फोकस बचाव विंडोज़" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "फोकस बचाव विंडोज़" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "सामानà¥à¤¯ विकलà¥à¤ª" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "सामानà¥à¤¯ कोंपिज विकलà¥à¤ª" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "अचà¥à¤›à¤¾" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "सà¥à¤•िप टासà¥à¤•बार विंडोज़ छिपायें" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "सभी विंडो छà¥à¤ªà¤¾à¤à¤ और डेसà¥à¤•टॉप पर फ़ोकस करें" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "जब दाखिल होने पर डेसà¥à¤•टॉप मोड दिखाता है टासà¥à¤•बार में विंडो छिपाà¤à¤‚" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "विरचयà¥à¤² उपकरण" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "अधिकतम करने पर संकेत नजरअंदाज करें" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "विंडो के अधिकतम किठजाने पर आकार बढ़त और पहलू संकेत नजरअंदाज करें" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "चयनित विंडो को बढ़ाने के पहले अंतराल" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "पिंग संदेश के बीच का अंतराल" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "लोगिगं" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "सिरà¥à¤« मिटाठगठपà¥à¤°à¤¿à¤‚टर कà¥à¤¯à¥‚ सूचीबदà¥à¤§ करेंदà¥à¤§ करें" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "आउटपà¥à¤Ÿ डिवायस को वरà¥à¤£à¤¨ करते सà¥à¤Ÿà¥à¤°à¤¿à¤‚ग की सूची" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "लोवर सोरà¥à¤¬à¤¿à¤¯à¤¨" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "अनà¥à¤¯ विंडो के नीचे निचला विंडो" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "विंडो कà¥à¤·à¥ˆà¤¤à¤¿à¤œ रूप से अधिकतम करें" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "विंडो लंबवत रूप से अधिकतम करें" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "सकà¥à¤°à¤¿à¤¯ विंडो अधिकतम करें" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "सकà¥à¤°à¤¿à¤¯ विंडो कà¥à¤·à¥ˆà¤¤à¤¿à¤œ रूप से अधिकतम करें" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "सकà¥à¤°à¤¿à¤¯ विंडो लंबवत रूप से अधिकतम करें" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "सकà¥à¤°à¤¿à¤¯ विंडो नà¥à¤¯à¥‚नतम करें" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "सामानà¥à¤¯" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "लंबवत रिकà¥à¤¤à¤¿ अवधि के दौरान सिरà¥à¤« सà¥à¤•à¥à¤°à¥€à¤¨ अदà¥à¤¯à¤¤à¤¨ निषà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "आउटपà¥à¤Ÿ" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "डिले" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "रेडियो कà¥à¤²à¥‹à¤• (&R)" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "windows" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "चयनित विंडो अंतराल के बाद उठाà¤à¤‚" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "विंडो को अनà¥à¤¯ विंडो के ऊपर रखें" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "कà¥à¤²à¤¿à¤• किये जाने पर विंडो उठाà¤à¤‚" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "ताजा करो" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "कà¥à¤·à¥ˆà¤¤à¤¿à¤œ वरà¥à¤šà¥à¤…ल आकार के लिठसà¥à¤•à¥à¤°à¥€à¤¨ आकार गà¥à¤£à¤•" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "लंबवत वरà¥à¤šà¥à¤…ल आकार के लिठसà¥à¤•à¥à¤°à¥€à¤¨ आकार गà¥à¤£à¤•" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "सिमà¥à¤²à¥‡à¤¶à¤¨" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "सà¥à¤®à¤¾à¤°à¥à¤Ÿ" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank में तà¥à¤²à¥à¤¯à¤•ालित करें" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "फिलà¥à¤Ÿà¤° सैट करें" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "फिलà¥à¤Ÿà¤° सैट करें" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "फिलà¥à¤Ÿà¤° सैट करें" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "दर जिसपर सà¥à¤•à¥à¤°à¥€à¤¨ फिर खीचा जाता है (समय/सेकेंड)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "विंडो अधिकतम पर टॉगल करें" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "विंडो अधिकतम पर कà¥à¤·à¥ˆà¤¤à¤¿à¤œ रूप से टॉगल करें" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "विंडो अधिकतम पर लंबवत रूप से टॉगल करें" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "विंडो छायांकित रूप में टॉगल करें" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "सकà¥à¤°à¤¿à¤¯ विंडो अधिकतम रूप में टॉगल करें" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "सकà¥à¤°à¤¿à¤¯ विंडो अधिकतम रूप में कà¥à¤·à¥ˆà¤¤à¤¿à¤œ पà¥à¤°à¤•ार से टॉगल करें" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "सकà¥à¤°à¤¿à¤¯ विंडो अधिकतम रूप में लंवबत पà¥à¤°à¤•ार से टॉगल करें" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "सकà¥à¤°à¤¿à¤¯ विंडो छायांकित रूप में टॉगल करें" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "धीमा संजीवन के पà¥à¤°à¤¯à¥‹à¤— को टॉगल करें" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "सकà¥à¤°à¤¿à¤¯ विंडो अधिकतम खतà¥à¤® करें" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "पूरà¥à¤£ सà¥à¤•à¥à¤°à¥€à¤¨ विंडोज़ को पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¿à¤¤ मत करें" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "सà¥à¤•à¥à¤°à¥€à¤¨ के बदले जाने पर विसरित पà¥à¤°à¤•ाश का पà¥à¤°à¤¯à¥‹à¤— करें" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "विरचयà¥à¤² उपकरण" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "विंडो मेनू बटन बाइंडिंग" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "विंडो मेनू की बाइंडिंग" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D " #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "चितà¥à¤° समायोजित करें" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "शीरà¥à¤· फेस चितà¥à¤° को घà¥à¤®à¤¾à¤¨à¥‡ के लिठसमायोजित करें" #: ../metadata/cube.xml.in.h:4 #, fuzzy msgid "Advance to next slide" msgstr "à¤à¤¡à¤µà¤¾à¤‚स विकलà¥à¤ª" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "सà¥à¤•ाइडोम à¤à¤¨à¤¿à¤®à¥‡à¤Ÿ करें" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "सà¥à¤•ाइडोम à¤à¤¨à¥€à¤®à¥‡à¤Ÿ करें जब घन को घà¥à¤®à¤¾à¤¯à¤¾ जा रहा है" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "घन के ऊपर और नीचे के हिसà¥à¤¸à¥‡ का रंग" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "सà¥à¤•ाइडोम फालबैक ढ़ाल के तलवरà¥à¤¤à¥€ रंग सà¥à¤Ÿà¥‰à¤ª के लिठपà¥à¤°à¤¯à¥‹à¤— का रंग" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "सà¥à¤•ाइडोम फालबैक ढ़ाल के शीरà¥à¤· रंग सà¥à¤Ÿà¥‰à¤ª के लिठपà¥à¤°à¤¯à¥‹à¤— का रंग" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "रंग" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "रंग" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D " #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "छोडं दिया \n" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "टाइम" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "उचà¥à¤šà¤¤à¤° गà¥à¤£à¤µà¤¤à¥à¤¤à¤¾ के सà¥à¤•ेलिंग के लिठमिपमैप बनाà¤à¤‚ जब संभव हो" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "पीछे का" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "डिसà¥à¤• इमेज फाइल" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "सà¥à¤•ाइडोम के लिठà¤à¤• बनावट के रूप में पà¥à¤°à¤¯à¥‹à¤— के लिठचितà¥à¤°" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "घन पारदरà¥à¤¶à¤¿à¤¤à¤¾ आरंभ करता है सिरà¥à¤« तभी जब घà¥à¤®à¤¾à¤µ माउस परिचालित है." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "भीतरी घन" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "भीतरी घन" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "PNG और SVG फाइलों की सूची जिसे घन के शीरà¥à¤· फेस में रेंडर किया होना चाहिà¤" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "मलà¥à¤Ÿà¥€ आउटपà¥à¤Ÿ पà¥à¤°à¤•ार" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "बहà¥à¤®à¥à¤–ी घन" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "अगला अपà¥à¤¡à¥‡à¤Ÿ " #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "बड़े घन पर शà¥à¤°à¥‚" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "घà¥à¤®à¤¾à¤µ के दौरान अपारदरà¥à¤¶à¤¿à¤¤à¤¾" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "नहीं घà¥à¤®à¤¾à¤µ के दौरान अपारदरà¥à¤¶à¤¿à¤¤à¤¾" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "घà¥à¤®à¤¾à¤µ के दौरान डेसà¥à¤•टॉप विंडो की अपारदरà¥à¤¶à¤¿à¤¤à¤¾" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "नहीं घà¥à¤®à¤¾à¤µ के दौरान डेसà¥à¤•टॉप विंडो की अपारदरà¥à¤¶à¤¿à¤¤à¤¾" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "windows" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "पीछे का" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "सà¥à¤•ाइडोम रेंडर करें" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "लोकल टाइम" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "घन के कवर शीरà¥à¤· फेस में चितà¥à¤°à¥‹à¤‚ को मापें" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "चà¥à¤¨à¤¤à¤¾ है कि कैसे घन पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ होता है यदि बहà¥à¤² आउटपà¥à¤Ÿ डिवायस पà¥à¤°à¤¯à¥à¤•à¥à¤¤ होता है." #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "डिसà¥à¤• इमेज" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "à¤à¥à¤•ाव ढाल अंत रंग" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "सà¥à¤•ाइडोम ढाल पà¥à¤°à¤¾à¤°à¤‚भ रंग" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "डिसà¥à¤• इमेज" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "छोडं दिया \n" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "टाइम" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "पारदरà¥à¤¶à¤¿à¤¤à¤¾ सिरà¥à¤« माउस घà¥à¤®à¤¾à¤µ पर" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "खोलें" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "घन खोलें" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus नियंतà¥à¤°à¤£ बैकेंड" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "सजावटी बनावट के लिठउतà¥à¤ªà¤¨à¥à¤¨ करने के लिठमिपमैप सà¥à¤µà¥€à¤•ारें" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "कमांड:" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "windows" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "सजावटी कमांड लाइन जो चलाया जाता है यदि कोई सजावटकरà¥à¤¤à¤¾ पहले से नहीं चल रहा है" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "तà¥à¤°à¤¿à¤œà¥à¤¯à¤¾" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "तà¥à¤°à¤¿à¤œà¥à¤¯à¤¾" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "तà¥à¤°à¤¿à¤œà¥à¤¯à¤¾" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "तà¥à¤°à¤¿à¤œà¥à¤¯à¤¾" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "तà¥à¤°à¤¿à¤œà¥à¤¯à¤¾" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "windows" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "छाया ऑफसेट X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "छाया ऑफसेट Y" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "तà¥à¤°à¤¿à¤œà¥à¤¯à¤¾" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "तà¥à¤°à¤¿à¤œà¥à¤¯à¤¾" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "windows" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "समनà¥à¤°à¥‚पण" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind विकलà¥à¤ª" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "विंडोज़ जिसे सजाया जाना चाहिà¤" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "विंडोज़ जिसे à¤à¤• छाया रखना चाहिà¤" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "टाइम" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "रखता है" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "windows" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "असली समय " #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "नà¥à¤¯à¥‚नतम/ खोलें/ बनà¥à¤¦ करें पर फीका कीजिये" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "छोडं दिया \n" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "असली समय " #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "विंडो घटना नà¥à¤¯à¥‚नतम/ खोलें /बंद करें पर फीका पà¥à¤°à¤­à¤¾à¤µ" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "फाइल सिसà¥à¤Ÿà¤®" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "मैप रहने पर फेड इन विंडोज और मैप नहीं रहने पर फीका बाहर विंडोज" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "windows" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "windows" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "पूरà¥à¤£ सà¥à¤•à¥à¤°à¥€à¤¨ दृशà¥à¤¯ बेल" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "सिसà¥à¤Ÿà¤® बीप पर पूरà¥à¤£ सà¥à¤•à¥à¤°à¥€à¤¨ फेड पà¥à¤°à¤­à¤¾à¤µ" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "दृशà¥à¤¯ बेल" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "windows" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "विंडो जिसे सà¥à¤•ेल मोड में सà¥à¤•ेल किया जाना चाहिà¤" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "विंडोज़ जिसे फेड करना चाहिà¤" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "आरोह बिंदà¥" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "आरोह बिंदà¥" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "यूजरसà¥à¤ªà¥‡à¤¸ फाइल सिसà¥à¤Ÿà¤®" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "यूजरसà¥à¤ªà¥‡à¤¸ फाइल सिसà¥à¤Ÿà¤®" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf नियंतà¥à¤°à¤£ बैकेंड" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib मà¥à¤–à¥à¤¯ लूप समरà¥à¤¥à¤¨" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "टरà¥à¤®à¤¿à¤¨à¤² खोलें" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 #, fuzzy msgid "Run Dialog" msgstr "टोण डायलिनà¥à¤• (&T)" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "कमाडं लैन पारà¥à¤¸ करने परà¥à¤¡ खराबी आ गया।" #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "कमाडं लैन पारà¥à¤¸ करने परà¥à¤¡ खराबी आ गया।" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "दिखाà¤à¤ मà¥à¤–à¥à¤¯ मेनू" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "रन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— संवाद दिखाà¤à¤" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "मà¥à¤–à¥à¤¯ मेनू दिखाà¤à¤" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "सà¥à¤•à¥à¤°à¥€à¤¨à¤¶à¥‰à¤Ÿ का चितà¥à¤° लें" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "विंडो का सà¥à¤•à¥à¤°à¥€à¤¨à¤¶à¥‰à¤Ÿ लें" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "कमाडं लैन पारà¥à¤¸ करने परà¥à¤¡ खराबी आ गया।" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "विंडो सà¥à¤•à¥à¤°à¥€à¤¨à¤¶à¥‰à¤Ÿ कमांड लाइन" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "किसी को लोग न करें" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini समतल फाइल बैकेंड" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "फाइल बदलाव अधिसूचना पà¥à¤²à¤—िन" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "किसी को लोग न करें" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig नियंतà¥à¤°à¤£ बैकेंड" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "windows" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "windows" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "windows" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "windows" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "छाया पà¥à¤°à¤¤à¤¿à¤°à¥‹à¤§" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "छाया पà¥à¤°à¤¤à¤¿à¤°à¥‹à¤§" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "विंडो बदलें जब वे नà¥à¤¯à¥‚नतम और अधिकतम किठजाते हैं" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "विंडोज़ जो नà¥à¤¯à¥‚नतम करने पर रूपांतरित किठजाने चाहिà¤" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "रखता है" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Y कोआरà¥à¤¡à¤¿à¤¨à¥‡à¤Ÿ को कारà¥à¤¯à¤¸à¥à¤¥à¤¾à¤¨ कà¥à¤·à¥‡à¤¤à¥à¤° में सीमित करें" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "विंडो के सरà¥à¤µà¤° साइड सà¥à¤¥à¤¿à¤¤à¤¿ को अदà¥à¤¯à¤¤à¤¨ मत करें जबतक कि खिसकाना समापà¥à¤¤ न हो" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "windows" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "windows" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "windows" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "windows" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "windows" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "खीचने पर सà¥à¤¨à¥ˆà¤ªà¤‘फ और सà¥à¤µà¤¤à¤ƒ गैर अधिकतम अधिकतम विंडो" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "windows" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "बà¥à¤°à¤¿à¤œ" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "बà¥à¤°à¤¿à¤œ" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "बà¥à¤°à¤¿à¤œ" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "बà¥à¤°à¤¿à¤œ" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "अपारदरà¥à¤¶à¤¿à¤¤à¤¾ घटायें" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "अपारदरà¥à¤¶à¤¿à¤¤à¤¾ बढायें" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "अपारदरà¥à¤¶à¤¿à¤¤à¤¾ बदलाव चरण" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "अपारदरà¥à¤¶à¤¿à¤¤à¤¾ बदलाव चरण" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "अपारदरà¥à¤¶à¤¿à¤¤à¤¾ चरण" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "घà¥à¤®à¤¾à¤µ के दौरान अपारदरà¥à¤¶à¤¿à¤¤à¤¾" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "अवधि" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "अवधि" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "अवधि" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "अवधि" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind विकलà¥à¤ª" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "windows" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "windows" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "विंडोज़ जिसे मूलभूत रूप से सà¥à¤¥à¤¿à¤¤à¤¿ पर रखा जाना चाहिà¤" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "विंडोज़ जिसे मूलभूत रूप से पारभासी होना चाहिà¤" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "विंडोज़ जिसे मूलभूत रूप से सà¥à¤¥à¤¿à¤¤à¤¿ पर रखा जाना चाहिà¤" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "विंडो सà¥à¤¥à¤¾à¤ªà¤¨ के लिठपà¥à¤°à¤¯à¥‹à¤— के लिठअलगोरिथम" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "पà¥à¤°à¤ªà¤¾à¤¤à¥€" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "केंदà¥à¤°à¤¿à¤¤" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "विनà¥à¤¡à¥‹ मैनेजर" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "फोकस बचाव विंडोज़" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "विरचयà¥à¤² उपकरण" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "windows" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "मैप किठजाने पर उचित सà¥à¤¥à¤¿à¤¤à¤¿ पर विंडो रखें" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "नियोजन पà¥à¤°à¤•ार" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "windows" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "कà¥à¤°à¤®à¤¹à¥€à¤¨" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "चà¥à¤¨à¥‡à¤‚ कि कहां विंडो को सà¥à¤•ेल किया जाता है यदि बहà¥à¤² आउटपà¥à¤Ÿ डिवायस पà¥à¤°à¤¯à¥‹à¤— किया जाता है." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "सà¥à¤®à¤¾à¤°à¥à¤Ÿ" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "सभी आउटपà¥à¤Ÿ डिवायस पर" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "विरचयà¥à¤² उपकरण" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "windows" #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind विकलà¥à¤ª" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "विंडोज़ जिसे मूलभूत रूप से सà¥à¤¥à¤¿à¤¤à¤¿ पर रखा जाना चाहिà¤" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "विंडोज़ जिसे मूलभूत रूप से विशेष वà¥à¤¯à¥‚पोरà¥à¤Ÿ में रखा जाना चाहिà¤" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind विकलà¥à¤ª" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "वरà¥à¤•गà¥à¤°à¥à¤ª " #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "windows" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "विरचयà¥à¤² उपकरण" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X सà¥à¤¥à¤¿à¤¤à¤¿ मान" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "windows" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "विरचयà¥à¤² उपकरण" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y सà¥à¤¥à¤¿à¤¤à¤¿ मान" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png चितà¥à¤° लोडर" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "रिजेकà¥à¤¸ मिलान" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "रिजेकà¥à¤¸ विंडो मिलान" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "रंग" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "खाके व आयताकार पà¥à¤¨à¤ƒ आकार मोड के लिठकिनारा रंग" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "मूलभूत आकार बदलाव पà¥à¤°à¤•ार" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "विंडो पà¥à¤¨à¤ƒ आकार के लिठपà¥à¤°à¤¯à¥à¤•à¥à¤¤ मूलभूत विधि" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "रंग" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "आयताकार पà¥à¤¨à¤ƒ आकार मोड के लिठपà¥à¤°à¤¯à¥à¤•à¥à¤¤ रंग" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "भारत" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "भारत" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "भारत" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "भारत" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "भारत" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "windows" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "रंग" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "windows" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "आयत" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "windows" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "windows" #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "windows" #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "विसà¥à¤¤à¤¾à¤°" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "windows" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "विंडोज़ जो सामानà¥à¤¯ आकार बदलाव के लिठपà¥à¤°à¤¯à¥‹à¤— किया जाना चाहिà¤" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "विंडोज़ जो खाका आकार बदलाव के लिठपà¥à¤°à¤¯à¥‹à¤— किया जाना चाहिà¤" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "विंडोज़ जो आयत आकार बदलाव के लिठपà¥à¤°à¤¯à¥‹à¤— किया जाना चाहिà¤" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "विंडोज़ जो विसà¥à¤¤à¤¾à¤° आकार बदलाव के लिठपà¥à¤°à¤¯à¥‹à¤— किया जाना चाहिà¤" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "किनारा à¤à¤Ÿà¤•ा DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "किनारा à¤à¤Ÿà¤•ा हटाà¤à¤‚" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "किनारा à¤à¤Ÿà¤•ा सूचक" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "असली समय " #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "बायें वà¥à¤¯à¥‚पोरà¥à¤Ÿ में जाà¤à¤‚ और संकेतक लपेटें" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "अगला वà¥à¤¯à¥‚पोरà¥à¤Ÿ में à¤à¤Ÿà¤•ें जब सà¥à¤•à¥à¤°à¥€à¤¨ किनारा में वसà¥à¤¤à¥ खींच रहा है" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "अगला वà¥à¤¯à¥‚पोरà¥à¤Ÿ में à¤à¤Ÿà¤•ें जब संकेतक को सà¥à¤•à¥à¤°à¥€à¤¨ किनारा में खिसका रहा है" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "अगला वà¥à¤¯à¥‚पोरà¥à¤Ÿ में à¤à¤Ÿà¤•ें जब सà¥à¤•à¥à¤°à¥€à¤¨ किनारा में विंडो खिसका रहा है" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "दायाठवà¥à¤¯à¥‚पोरà¥à¤Ÿ में à¤à¤Ÿà¤•ें और संकेतक लपेटें" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "संकेतक गति के लिठY अकà¥à¤· उलटें" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "पà¥à¤°à¤¿à¤‚टर का विवरण" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "पà¥à¤°à¤¿à¤‚टर विवरण" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "घà¥à¤®à¤¾à¤µ पर उठाà¤à¤‚" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "विंडो को घà¥à¤®à¤¾à¤¨à¥‡ के दौरान उठाà¤à¤‚" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "à¤à¤Ÿà¤•ा बायाठघà¥à¤®à¤¾à¤à¤" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "घà¥à¤®à¤¾à¤à¤ à¤à¤Ÿà¤•ें दाहिना" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "windows" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D " #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "टाइम" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "टाइम" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "टाइम" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "संकेतक गति की संवेदनशीलता" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "ऊपरी मà¥à¤–रे में घन घà¥à¤®à¤¾à¤µ सà¥à¤¨à¥ˆà¤ª करें" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ऊपरी मà¥à¤–रे में घन घà¥à¤®à¤¾à¤µ सà¥à¤¨à¥ˆà¤ª करें" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "ऊपरी मà¥à¤–रे में सà¥à¤¨à¥ˆà¤ª लें" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ऊपरी मà¥à¤–रे में सà¥à¤¨à¥ˆà¤ª लें" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "इंसटालेशन शà¥à¤°à¥ करें" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "वà¥à¤¯à¥‚पोरà¥à¤Ÿ à¤à¤Ÿà¤•ने के पहले समय समापà¥à¤¤à¤¿" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "ज़ूम" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "पà¥à¤°à¤¤à¤¿à¤¶à¤¤ में अपारदरà¥à¤¶à¤¿à¤¤à¤¾ की मातà¥à¤°à¤¾" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "बड़ा" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "डेसà¥à¤•टॉप दिखाने के लिठडेसà¥à¤•टॉप कà¥à¤²à¤¿à¤• करें" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "पृषà¥à¤ à¤­à¥‚मि" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "विंडो मापन के दौरान पृषà¥à¤ à¤­à¥‚मि गहरा करें" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "पà¥à¤°à¤¤à¥€à¤•" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "डेसà¥à¤•टॉप पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ मोड दाखिल करें जब डेसà¥à¤•टॉप मापक के दौरान कà¥à¤²à¤¿à¤• किया जाता है" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "समय आगे पीछे करें" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "windows" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "सभी विंडोज़ के लिठविंडो चयनक आरंभ करें" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "विंडो समूह के लिठविंडो चयनक आरंभ करें" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "मौज़ूदा आउटपà¥à¤Ÿ पर विंडो के लिठविंडो चयनक आरंभ करें" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "अभिनà¥à¤¯à¤¾à¤¸ और सभी विंडोज को बदलना आरंभ करें" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "अभिनà¥à¤¯à¤¾à¤¸ और विंडो समूह को रूपांतरित करना आरंभ करें" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "अभिनà¥à¤¯à¤¾à¤¸ और विंडोज को बदलना आरंभ करें" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "अभिनà¥à¤¯à¤¾à¤¸ और मौजूदा आउटपà¥à¤Ÿ पर विंडोज बदलना आरंभ करें" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "सभी आउटपà¥à¤Ÿ डिवायस पर" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "मौजूदा आउटपà¥à¤Ÿ डिवायस पर" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "पà¥à¤°à¤¤à¥€à¤• ढ़कें" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "विंडो पर पà¥à¤°à¤¤à¥€à¤• को ढ़कें जब वे सà¥à¤•ेल किये जाते हैं" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "सà¥à¤•ैनर" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "windows" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "लोकल टाइम" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "लोकल टाइम" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "windows" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "चà¥à¤¨à¥‡à¤‚ कि कहां विंडो को सà¥à¤•ेल किया जाता है यदि बहà¥à¤² आउटपà¥à¤Ÿ डिवायस पà¥à¤°à¤¯à¥‹à¤— किया जाता है." #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "windows" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "सà¥à¤ªà¥‡à¤¨" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "विंडो पर आचà¥à¤›à¤¾à¤¦à¤¿à¤¤ होने पर सà¥à¤•ेल मोड के खतà¥à¤® होने के पहले समय (ms में)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "विंडो जिसे सà¥à¤•ेल मोड में सà¥à¤•ेल किया जाना चाहिà¤" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "इस अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— में सà¥à¤µà¤¤à¤ƒ सà¥à¤•à¥à¤°à¥€à¤¨à¤¶à¥‰à¤Ÿ खोलें" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "निरà¥à¤¦à¥‡à¤¶à¤¿à¤•ा" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "भारत" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लांच करें" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "इस निरà¥à¤¦à¥‡à¤¶à¤¿à¤•ा में सà¥à¤•à¥à¤°à¥€à¤¨à¤¶à¥‰à¤Ÿ चितà¥à¤° रखें" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "कमाडं लैन पारà¥à¤¸ करने परà¥à¤¡ खराबी आ गया।" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "कमाडं लैन पारà¥à¤¸ करने परà¥à¤¡ खराबी आ गया।" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg चितà¥à¤° लोडर" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "पà¥à¤°à¤¤à¤¿à¤¶à¤¤ में चमकीलापन की मातà¥à¤°à¤¾" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "पà¥à¤°à¤¤à¤¿à¤¶à¤¤ में संतृपà¥à¤¤à¤¿ की मातà¥à¤°à¤¾" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "कमà¥à¤ªà¥à¤¯à¥‚टर पà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤® आडिट रिपोरà¥à¤Ÿ" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "बूट के दौरान" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "चयनित विंडो को सामने लायें" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "दूरी डेसà¥à¤•टॉप को जूम आउट किया जाना चाहिठजब विंडो में सà¥à¤µà¤¿à¤š कर रहे हों" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "आइकंशà¥à¤¶" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "windows" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "windows" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "windows" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "windows" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "पॉप अप सà¥à¤µà¤¿à¤šà¤° यदि दृषà¥à¤Ÿà¤¿à¤—ोच़र नहीं है और अगला विंडो चà¥à¤¨à¥‡à¤‚" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "पॉप अप सà¥à¤µà¤¿à¤šà¤° यदि दृषà¥à¤Ÿà¤¿à¤—ोच़र नहीं है और अगला विंडो सभी विंडो में से चà¥à¤¨à¥‡à¤‚" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "पॉप अप सà¥à¤µà¤¿à¤šà¤° यदि दृषà¥à¤Ÿà¤¿à¤—ोच़र नहीं है और पिछला विंडो चà¥à¤¨à¥‡à¤‚" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "पॉप अप सà¥à¤µà¤¿à¤šà¤° यदि दृषà¥à¤Ÿà¤¿à¤—ोच़र नहीं है और पिछला विंडो सभी विंडो में से चà¥à¤¨à¥‡à¤‚" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "पीछे का" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "windows" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "windows" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "windows" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "सà¥à¤µà¤¿à¤šà¤¿à¤‚ग के दौरान चयनित विंडो में घà¥à¤®à¤¾à¤à¤‚" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "windows" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "पॉपअप विंडो को बिना दिखाठअगले विंडो को चà¥à¤¨à¥‡à¤‚." #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "पॉपअप विंडो को बिना दिखाठपिछले विंडो को चà¥à¤¨à¥‡à¤‚." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "थंबनेल के बगल के पà¥à¤°à¤¤à¥€à¤• को दिखाà¤à¤‚" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "windows" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "लोकल टाइम" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "लोकल टाइम" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "windows" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "विंडोज जिसे सà¥à¤µà¤¿à¤šà¤° में दिखाया जाना चाहिà¤" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 रंगसà¥à¤ªà¥‡à¤¸ समरà¥à¤¥à¤¨ दें" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "वीडियो पà¥à¤²à¥‡à¤¬à¥ˆà¤•" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "वीडियो पà¥à¤²à¥‡à¤¬à¥ˆà¤•" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 रंगसà¥à¤ªà¥‡à¤¸" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "पंकà¥à¤¤à¤¿ जोड़ें" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "बिंदॠजोड़ें" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "विभिनà¥à¤¨ डेसà¥à¤•टॉप कà¥à¤°à¤¿à¤¯à¤¾ में जल पà¥à¤°à¤­à¤¾à¤µ जोड़ें" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "हर वरà¥à¤·à¤¾ बूंद के बीच विलंब (ms में)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "संकेतक जल चिहà¥à¤¨ सकà¥à¤°à¤¿à¤¯ करें" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "रेखा" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "ऑफसेट मापक" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "बिनà¥à¤¦à¥" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "डिले" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "शीरà¥à¤·à¤• तरंग" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "टोकन रिंग" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "टोकन रिंग" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "टोकन रिंग" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "टोकन रिंग" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "जल पà¥à¤°à¤­à¤¾à¤µ" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "जल ऑफसेट सà¥à¤•ेल" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "विंडो शीरà¥à¤·à¤• से लहर पà¥à¤°à¤­à¤¾à¤µ" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "पà¥à¤°à¤­à¤¾à¤µ फोकस करें" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "windows" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "windows" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "कà¥à¤°à¤¿à¤¯à¤¾" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "windows" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "रिजोलà¥à¤¯à¥‚शन" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "उलट विंडो सà¥à¤¨à¥ˆà¤ªà¤¿à¤‚ग" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "windows" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "windows" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "windows" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "windows" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "windows" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "निमà¥à¤¨à¤¤à¤® &GID" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "निमà¥à¤¨à¤¤à¤® &GID" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "windows" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "भà¥à¤°à¤­à¥à¤°à¤¾" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "सà¥à¤¨à¥ˆà¤ª उलटें" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "windows" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "कà¥à¤°à¤¿à¤¯à¤¾" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "सà¥à¤Ÿà¥‡à¤ªà¤¿à¤—ं" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "सà¥à¤Ÿà¥‡à¤ªà¤¿à¤—ं" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "windows" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "वूबली विंडो पà¥à¤°à¤­à¤¾à¤µ के लिठसà¥à¤ªà¥à¤°à¤¿à¤‚ग मॉडल का पà¥à¤°à¤¯à¥‹à¤— करें" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "सेरà¥à¤µà¤° सार" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "विंडोज़ जिसे बूबल करना चाहिठजब फोकस हो" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "विंडोज़ जिसे बूबल करना चाहिठजब पकड़ा जाà¤" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "विंडोज़ जिसे मैप करने वकà¥à¤¤ बूबल करना चाहिà¤" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "विंडोज़ जिसे खिसकाने वकà¥à¤¤ बूबल करना चाहिà¤" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "विंडो को अधिकतम व नà¥à¤¯à¥‚नतम करने के दौरान बूबल पà¥à¤°à¤­à¤¾à¤µ" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "windows" #, fuzzy #~ msgid "Command line 0" #~ msgstr "कमांड:" #, fuzzy #~ msgid "Run command 0" #~ msgstr "कमानà¥à¤¡ '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "कमाडं लैन पारà¥à¤¸ करने परà¥à¤¡ खराबी आ गया।" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "कमाडं लैन पारà¥à¤¸ करने परà¥à¤¡ खराबी आ गया।" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "फिलà¥à¤Ÿà¤°:" #~ msgid "Use linear filter when zoomed in" #~ msgstr "जूम इन करने के दौरान रैखिक फिलà¥à¤Ÿà¤° का पà¥à¤°à¤¯à¥‹à¤— करें" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #~ msgid "Zoom In" #~ msgstr "ज़ूम इन" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "छोडं दिया \n" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "टाइम" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ज़ूम और पैन डेसà¥à¤•टॉप घन" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "छोडं दिया \n" #~ msgid "Decrease window opacity" #~ msgstr "विंडो अपारदरà¥à¤¶à¤¿à¤¤à¤¾ घटायें" #~ msgid "Increase window opacity" #~ msgstr "विंडो अपारदरà¥à¤¶à¤¿à¤¤à¤¾ बढायें" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "विंडो के अपारदरà¥à¤¶à¤¿à¤¤à¤¾ मानजो कि मूलभूत रूप से पारभासी होना चाहिà¤" #~ msgid "Opacity window values" #~ msgstr "अपारदरà¥à¤¶à¤¿à¤¤à¤¾ विंडो मान" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "windows" #~ msgid "Background Images" #~ msgstr "पृषà¥à¤ à¤­à¥‚मि चितà¥à¤°" #~ msgid "Background images" #~ msgstr "पृषà¥à¤ à¤­à¥‚मि चितà¥à¤°" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "windows" #, fuzzy #~ msgid "Plane Left" #~ msgstr "रिमोट सबनेट:" #, fuzzy #~ msgid "Plane Right" #~ msgstr "रिमोट सबनेट:" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane Up" #~ msgstr "windows" #, fuzzy #~ msgid "Plane down" #~ msgstr "windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "रिमोट सबनेट:" #, fuzzy #~ msgid "Plane right" #~ msgstr "रिमोट सबनेट:" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Plane up" #~ msgstr "windows" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "डेसà¥à¤•टॉप विंडो अपारदरà¥à¤¶à¤¿à¤¤à¤¾ धà¥à¤‚धला समय." #, fuzzy #~ msgid "Dialog" #~ msgstr "टोण डायलिनà¥à¤• (&T)" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "विनà¥à¤¡à¥‹ मैनेजर" #, fuzzy #~ msgid "Notification" #~ msgstr "कà¥à¤°à¤¿à¤¯à¤¾" #~ msgid "Unknown" #~ msgstr "अनंजान" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "अवधि" #, fuzzy #~ msgid "Do not modify" #~ msgstr "किसी को लोग न करें" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "तà¥à¤°à¤¿à¤œà¥à¤¯à¤¾" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D " #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "टाइम" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "windows" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "निमà¥à¤¨à¤¤à¤® &GID" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D " #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "टाइम" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "लोकल टाइम" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "लोकल टाइम" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "कà¥à¤°à¤¿à¤¯à¤¾" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "सà¥à¤Ÿà¥‡à¤ªà¤¿à¤—ं" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "फिलà¥à¤Ÿà¤° सैट करें" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "सेरà¥à¤µà¤° सार" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "windows" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "windows" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "छोडं दिया \n" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "टाइम" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "डेसकà¥à¤Ÿà¤¾à¤ª" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Command line %d" #~ msgstr "कमांड:" #, fuzzy #~ msgid "Run command %d" #~ msgstr "कमांड:" #, fuzzy #~ msgid "Move Window Types" #~ msgstr "संभरक" #, fuzzy #~ msgid "Corners" #~ msgstr "कोरà¥à¤¨à¤¿à¤¶" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "फà¥à¤²à¥‹à¤ªà¥€ डिसà¥à¤•" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "डेइमण शà¥à¤°à¥‚ कर रहा हैं।" #, fuzzy #~ msgid "Terminate" #~ msgstr "टरà¥à¤®à¤¿à¤¨à¤²" compiz-0.9.11+14.04.20140409/po/hu.po0000644000015301777760000026022712321343002017075 0ustar pbusernogroup00000000000000# translation of compiz.po to Hungarian # This file is distributed under the same license as the PACKAGE package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. # # Kalman Kemenczy , 2006, 2007. # Gabor Kelemen , 2007. # KAMI911 , 2007-2008. msgid "" msgstr "" "Project-Id-Version: po_compiz-hu\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-03-25 09:09+0100\n" "Last-Translator: KAMI \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" "X-Launchpad-Export-Date: 2007-12-04 10:00+0000\n" "X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,-1,-1,490,-1\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Asztal" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Ablakkezelés" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Egyik sem" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Felgördítés" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximalizálás" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Ablak maximalizálása vízszintesen" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Ablak maximalizálása függÅ‘legesen" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Kis méret" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Növelés" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Alacsony" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Ablak menü" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Az ablak címsorán történÅ‘ egérgörgÅ‘-használat hatása." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Elmosás típusa" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Aktív ablak átlátszatlansága" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Felgördített aktív ablak átlátszatlansága" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Ablak átlátszatlansága" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Felgördített ablak átlátszatlansága" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Az aktív ablak átlátszatlansága a díszítÅ‘ elemekhez" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Az ablak átlátszatlansága a díszítÅ‘ elemekhez" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "Felgördített aktív ablak átlátszatlansága a díszítÅ‘ elemeknél" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "Felgördített ablak átlátszatlansága a díszítÅ‘ elemeknél" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "EgérgörgÅ‘ esemény a címsoron" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Az elmosás típusa a díszítÅ‘ elemekhez" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Metacity téma alkalmazása" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Metacity téma alkalmazása az ablakdíszítések rajzolásakor" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Ablak bezárása" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Ablak visszaállítása" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Ablak maximalizálása" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Ablak minimalizálása" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "ElÅ‘rehozás" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Rögzítés" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Legördítés" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Hátraküldés" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Rögzítés feloldása" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "A(z) „%s†ablak nem válaszol." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "A kilépés kényszerítésének hatására minden el nem mentett adat el fog veszni." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Kilépés kényszerítése" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Feljegyzés" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Feljegyzés kitöltÅ‘ színe" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Feljegyzés körvonalszíne" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Feljegyzés bÅ‘vítmény" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Törlés" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Rajzolás" # 58721 AttribValues/label #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Rajzolás eszközzel" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Feljegyzések kitöltÅ‘ színe" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Indítás" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Feljegyzésrajzolás indítása" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Feljegyzéstörlés indítása" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Törlés indítása" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Vonalvastagság" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Feljegyzések vonalvastagsága" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Feljegyzések körvonalának színe" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Körvonal vastagsága" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Feljegyzések körvonal-vastagsága" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x bilineáris" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alfa elmosás" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Ablakok elmosása" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "ElmosásszűrÅ‘" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Elmosás levágás" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Elmosás telítettség" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Elmosás sebessége" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Ablak elmosása" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Elmosás az ablakok áttetszÅ‘ részei mögött" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Elmosás telítettség" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Ablakok elmosása" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Fókusszal nem rendelkezÅ‘ ablakok elmosása" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Elmosás kikapcsolása a képernyÅ‘ más ablakok által kitakart részein." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Az elmosáshoz használt szűrÅ‘módszer" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Fókuszelmosás" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Ablakok elmosása" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gauss" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gauss-sugár" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gauss erÅ‘ssége" # RU #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Gauss-sugár" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gauss erÅ‘ssége" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Független textúra lekérés" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "MIP térkép" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "MIP térkép részletesség" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "MIP térkép részletesség szintje" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Impulzus" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Impulzus effektus" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Független textúra lekérések számának növelése az éppen nem használt " "textúrázó egységek használatával." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Ablak elmosásának sebessége" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Fókuszelmosással elmosandó ablaktípusok" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Alfaelmosással elmosandó ablaktípusok" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Kimenet klónozása" # /tmp/xapi:301 #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Klónkiválasztás indítása" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Kimenet klónkezelÅ‘je" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "A command0 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "A command1 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "A command10 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "A command11 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "A command2 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "A command3 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "A command4 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "A command5 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "A command6 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "A command7 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "A command8 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "A command9 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "A command0 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "A command1 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "A command10 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "A command11 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "A command2 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "A command3 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "A command4 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "A command5 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "A command6 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "A command7 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "A command8 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "A command9 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "A command0 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "A command1 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "A command10 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "A command11 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "A command2 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "A command3 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "A command4 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "A command5 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "A command6 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "A command7 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "A command8 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "A command9 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Parancsok hozzárendelése billentyűzetkombinációkhoz" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Gyorsbillentyűk" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "1. parancssor" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "10. parancssor" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "11. parancssor" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "12. parancssor" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "2. parancssor" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "3. parancssor" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "4. parancssor" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "5. parancssor" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "6. parancssor" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "7. parancssor" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "8. parancssor" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "9. parancssor" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "A run_command0 által elindított parancs" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "A run_command1 által elindított parancs" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "A run_command10 által elindított parancs" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "A run_command11 által elindított parancs" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "A run_command2 által elindított parancs" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "A run_command3 által elindított parancs" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "A run_command4 által elindított parancs" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "A run_command5 által elindított parancs" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "A run_command6 által elindított parancs" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "A run_command7 által elindított parancs" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "A run_command8 által elindított parancs" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "A run_command9 által elindított parancs" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Parancs" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Szegély" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Gyorsbillentyűk" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "1. parancs futtatása" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "10. parancs futtatása" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "11. parancs futtatása" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "12. parancs futtatása" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "2. parancs futtatása" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "3. parancs futtatása" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "4. parancs futtatása" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "5. parancs futtatása" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "6. parancs futtatása" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "7. parancs futtatása" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "8. parancs futtatása" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "9. parancs futtatása" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktív bÅ‘vítmények" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "A teljes méretű ablakok nem irányíthatók át képen kívüli pixeltérképekre" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Hallható csengÅ‘" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Hallható rendszercsengÅ‘" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatikus megnyitás" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Automatikus megnyitás késleltetése" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Kimeneti eszközök automatikus érzékelése" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Frissítési frekvencia automatikus érzékelése" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Legjobb" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Kattintson a fókuszáláshoz" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Az ablakra kattintással az ablakra irányítja a fókuszt" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Aktív ablak bezárása" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Alapértelmezett ikon" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Alapértelmezett ikon képe" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Munkaasztal mérete" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Kimenetek észlelése" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Frissítési frekvencia felismerése" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "KijelzÅ‘ beállítások" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Az az idÅ‘tartam, ameddig az egérmutatónak a képernyÅ‘n szélén kell állnia " "ahhoz, hogy a képernyÅ‘ széléhez társított művelet elinduljon." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "KépernyÅ‘ szélével indított műveletek indításának késleltetése" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Gyors" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Fókusz és növelés viselkedése" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "FókuszmegelÅ‘zés szintje" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "FókuszmegelÅ‘zés" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "FókuszmegelÅ‘zés" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Független kimenethasználat erÅ‘ltetése" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Ãltalános beállítások" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "A Compiz általános beállításai" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Jó" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Kihagyott tálcaablakok elrejtése" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Összes ablak elrejtése és fókuszálás a munkaasztalra" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Az asztal megjelenítése módba kapcsoláskor a tálcán nem lévÅ‘ ablakok " "elrejtése" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Magas" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Vízszintes virtuális méret" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "KépekbÅ‘l konvertált textúrák tömörítése, amennyiben az lehetséges" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Maximális méretben tanácsok figyelmen kívül hagyása" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Méretnövelési és méretezési tanácsok figyelmen kívül hagyása ha az ablak " "maximális méretű" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "A kiválasztott ablakok megnyitását megelÅ‘zÅ‘ intervallum" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Ping üzenetek közti idÅ‘köz" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Gyorsbillentyűk" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "FókuszmegelÅ‘zés szintje" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Világosítás" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Az aktuális bÅ‘vítmények listája" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Kimeneti eszközöket leíró karakterláncok listája" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Alacsony" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Alacsonyabb ablak" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Alacsonyabb ablak egy másik ablak alatt" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Ablak maximalizálása vízszintesen" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Ablak maximalizálása függÅ‘legesen" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Aktív ablak maximalizálása" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Aktív ablak maximalizálása vízszintesen" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Aktív ablak maximalizálása függÅ‘legesen" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Aktív ablak minimalizálása" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Szokványos" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Munkaasztalok száma" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Virtuális munkaasztalok száma" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Kikapcsolva" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "A képernyÅ‘-frissítések végrehajtása csak a függÅ‘leges törlési periódusban" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Kimenetek" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "ÃtfedÅ‘ kimenetek kezelése" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Összes kimenet független használata, még akkor is, ha a kimenetek átfedik " "egymást" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping késleltetése" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Nagyméretű kimenet használata" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Kisméretű kimenet használata" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Kattintás esetén megnyitás" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Ablak elÅ‘térbe hozása" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "A kijelölt ablak megnyitása ennyi idÅ‘ után" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Ablak másik ablakok fölé hozása" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Ablakok megnyitása kattintás esetén" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Frissítési frekvencia" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "KépernyÅ‘méret-szorzó a vízszintes virtuális mérethez" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "KépernyÅ‘méret-szorzó a virtuális mérethez" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Munkaasztal megjelenítése" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Lassú animációk" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Intelligens üzemmód" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Szinkronizálás VBlank jelre" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Textúratömörítés" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "TextúraszűrÅ‘" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Textúraszűrés" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "A képernyÅ‘-újrarajzolás gyakorisága (alkalom/másodperc)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Ablak maximális méret átkapcsolása" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Ablak vízszintes maximális méret átkapcsolása" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Ablak függÅ‘leges maximális méret átkapcsolása" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Ablak felgördítése" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Aktív ablak maximális méret átkapcsolása" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Aktív ablak vízszintes maximális méret átkapcsolása" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Aktív ablak függÅ‘leges maximális méret átkapcsolása" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Aktív ablak felgördítése" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "„Lassú animációk†effektus kapcsoló" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Aktív ablak visszaállítása" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Teljes méretű ablakok visszairányítása" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Szórt fény használata képernyÅ‘-transzformációnál" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "FüggÅ‘leges virtuális méret" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Nagyon magas" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" "Adja meg, hogy melyik átfedÅ‘ kimeneti eszköz legyen elÅ‘nyben részesítve." #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Window menü billentyűzetkombinációi" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Window menü billentyűzetkombinációi" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Gyorsítás" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Kép igazítása" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Kép igazítása forgatáshoz" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Továbblépés a következÅ‘ diára" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Kupola animálása" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Kupola animálása a kocka forgatásánál" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Megjelenés" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatikus" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Viselkedés" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "A kocka alsó és felsÅ‘ oldalának színe" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "A kupola tartalék színátmenet alsó színállomásához használandó szín" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "A kupola tartalék színátmenet felsÅ‘ színállomásához használandó szín" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Kocka fedÅ‘lapok" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kocka színe" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Munkaasztal kocka" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Hajtás gyorsulása" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Hajtás sebessége" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Hajtás idÅ‘köz" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "MIP térképek készítése, hacsak lehetséges, a jobb minÅ‘ségű átméretezés " "érdekében" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Visszatérés az elÅ‘zÅ‘ diára" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Képfájlok" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "A kupola textúrájaként használt kép" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "A kocka csak egérrel történÅ‘ forgatáskor válik átlátszóvá." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "A kocka belseje" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "A kocka belseje" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "A kocka tetejére kerülÅ‘ PNG és SVG fájlok listája" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Többkimenetes üzemmód" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Több kocka" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "KövetkezÅ‘ dia" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Egy nagy kocka" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Ãtlátszatlanság forgatás közben" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Ãtlátszatlanság alapállapotban" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Ablakok átlátszatlansága forgatás közben" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Ablakok átlátszatlansága alapállapotban" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Ablakok elhelyezése a kockán" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "ElÅ‘zÅ‘ dia" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Kupola leképzése" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Kép méretezése" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Kép méretezése a kocka tetejének lefedésére" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "A kocka megjelenítésének módja több kimeneti eszköz használata esetén." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Kupola" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Kupola színátmenetének záró színe" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Kupola színátmenetének induló színe" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Kupola képe" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Sebesség" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "IdÅ‘köz" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Ãtlátszóság csak egérrel forgatáskor" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "ÃttetszÅ‘ kocka" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Kibontás" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Kocka kibontása" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus vezérlés kiszolgálója" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "MIP térképek létrehozása a díszítÅ‘ textúrákhoz" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Parancs" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Ablakok díszítése" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "DíszítÅ‘ parancs, amely akkor kerül végrehajtásra, ha még nem fut díszítÅ‘" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Ãrnyék X eltolása" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Ãrnyék Y eltolása" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Ãrnyék színe" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Ãrnyék átlátszatlansága" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Ãrnyék átmérÅ‘je" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Ãrnyék színe" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Ãrnyék X eltolása" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Ãrnyék Y eltolása" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Ãrnyék átlátszatlansága" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Ãrnyék átmérÅ‘je" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Ablakok árnyékolása" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Ablakdíszítés" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Ablakdíszítések" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "DíszítendÅ‘ ablakok" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Ãrnyékolandó ablakok" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Nem válaszoló ablak fényerÅ‘ssége (százalékban megadva)" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Ãllandó sebesség" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Ãllandó útidÅ‘" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Nem válaszoló ablak elhalványítása" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Azon ablakok elhalványítása, amelyek nem válaszolnak az ablakkezelÅ‘ kéréseire" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Elhalványítási üzemmód" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Ablakelhalványítás minimalizáláskor, megnyitáskor és bezáráskor" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Elhalványulás sebessége" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Elhalványítási idÅ‘" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" "Ablakelhalványítási effektus alkalmazása minimalizáláskor, megnyitáskor és " "bezáráskor" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Elhalványulás effektus rendszerhang esetén" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "Leképezés esetén az ablak erÅ‘sítése, lecsatolás esetén elhalványítása" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Ablak elhalványítása" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Ablakok elhalványítása" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Teljes képernyÅ‘ vizuális csengÅ‘" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Teljes képernyÅ‘ halványuló effektus rendszercsengÅ‘ esetén" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Nem válaszoló ablak telítettsége (százalékban megadva)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Nem válaszoló ablak fényerÅ‘ssége" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Nem válaszoló ablak telítettsége" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Vizuális csengÅ‘" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Ablak elhalványulásának üzemmódja" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Ablak elhalványulásának sebessége „Ãllandó sebesség†módban" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Ablak elhalványulásának sebessége „Ãllandó útidő†módban" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Ablaktípusok, amelyek elhalványulhatnak" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Csatolási pont" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Csatolási pont" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Felhasználói módú fájlrendszer" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Felhasználói módú fájlrendszer" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf vezérlés kiszolgálója" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "Glib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Glib fÅ‘ciklus támogatása" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome kompatibilitás" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Terminál megnyitása" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Beállítás, amely a Compizt kompatibilissá teszi a Gnome asztali környezettel" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Párbeszéd futtatása" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Parancs futtatása terminálban" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "KépernyÅ‘kép parancssor" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "FÅ‘menü megjelenítése" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "„Alkalmazás futtatása†párbeszédablak megjelenítése" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "FÅ‘menü megjelenítése" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "KépernyÅ‘kép készítése" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "KépernyÅ‘kép készítése az ablakról" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Terminál parancssor" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Ablak képernyÅ‘kép parancssor" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "INI" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "INI szövegfájl" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Fájlváltozásról értesítÅ‘ bÅ‘vítmény" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig vezérlés kiszolgálója" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimalizálás effektus" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Ablak minimalizálása" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimalizálás sebessége" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Minimalizálási idÅ‘köz" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Felgördítés ellenállása" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Felgördítés ellenállása" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Ablakok átalakítása minimalizáláskor és visszaállításkor" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Minimalizált állapotban átalakítandó ablaktípusok" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Y megszorítás" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Y koordináta-megszorítás a munkafelületre" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Csak az ablakáthelyezés befejeztével frissítse az ablakpozíciót a kiszolgálón" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Ablakáthelyezés indítása" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Lusta elhelyezés" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Ablak áthelyezése" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Ablak áthelyezése" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Ãtlátszatlanság" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Ablakáthelyezés átlátszatlanságának szintje" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Ãthelyezéskor az ablakok azonnali, automatikus visszaállítása" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Maximalizált ablakok azonnali visszaállítása" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Ablakáthelyezés megkezdése" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "FényerÅ‘" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "FényerÅ‘ csökkentése" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "FényerÅ‘ növelése" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "FényerÅ‘ lépésköz" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "FényerÅ‘ értéke ablakokhoz" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Csökkentés" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Növelés" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Ãtlátszatlanság csökkentése" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Ãtlátszatlanság növelése" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Ãtlátszatlanság mértéke" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Ablakok átlátszatlansága" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Ãtlátszatlanság, fényerÅ‘, telítettség" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Ãtlátszatlanság, fényerÅ‘, telítettség beállítások" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Telítettség" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Színtelítettség csökkentése" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Színtelítettség növelése" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Telítettség változásának lépésköze" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Ablakok színtelítettsége" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Lépésköz" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Ablak beállítások" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Ablak tulajdonságok" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Ablakok" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "AlapértelmezettÅ‘l eltérÅ‘ fényerÅ‘vel rendelkezÅ‘ ablakok" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "AlapértelmezettÅ‘l eltérÅ‘ átlátszatlansággal rendelkezÅ‘ ablakok" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "AlapértelmezettÅ‘l eltérÅ‘ színtelítettséggel rendelkezÅ‘ ablakok" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Az ablakok elhelyezésére használt algoritmus" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "LépcsÅ‘zetes" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Középre" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Fix ablakelhelyezések" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Ablakelhelyezés erÅ‘ltetése" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Vízszintes munkalap pozíció" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Munkaasztalon tartás" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Ablakelhelyezés erÅ‘ltetésének felülbírálása úgy, hogy az ablak minden " "esetben a munkaasztalon maradjon" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Ablakok elhelyezése" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Összes kimenet használata" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Térképezés esetén az ablakok elhelyezése a megfelelÅ‘ pozícióba" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Elhelyezés módja" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Pozicionált ablakok" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Véletlen" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Megadja, hogy több kimeneti eszköz esetén, az ablakelhelyezés viselkedését" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Intelligens" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Aktív kimeneti eszköz használata" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Fókuszált ablakot megjelenítÅ‘ eszköz használata" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Egérmutatót megjelenítÅ‘ eszköz használata" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "FüggÅ‘leges munkalap pozíció" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Munkaterületen elhelyezett ablakok" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "KerülÅ‘megoldások az ablak elhelyezésére" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Alapértelmezés szerint pozicionálandó ablakok" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Alapértelmezés szerint megadott munkalapra pozicionálandó ablakok" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Ablakok, amelyek elhelyezését szabályozni kell, még akkor is, ha az " "ablakkezelÅ‘ úgy jelzi, hogy az adott ablakok elhelyezését nem szabad " "szabályozni." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Ablakok rögzített pozicióval" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Ablakok rögzített nézÅ‘ponttal" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "KerülÅ‘ megoldások" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Vízszintes pozíció" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Vízszintes munkalap pozíció" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Vízszintes pozíció" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "FüggÅ‘leges pozíció" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "FüggÅ‘leges munkalap pozíció" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "FüggÅ‘leges pozíció" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "PNG képbetöltÅ‘" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Reguláris kifejezés egyeztetés" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Reguláris kifejezéssel ablakegyeztetés" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Gyorsbillentyűk" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Kocka színe" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Az átméretezéshez használt körvonal és téglalap színe " #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Alapértelmezett átméretezési mód" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Alapértelmezett ablakátméretezési mód" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "KitöltÅ‘szín" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Téglalap átméretezés kitöltÅ‘ színe" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Hagyományos ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Körvonalas ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Téglalap ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Nyújtásos ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Hagyományos ablakátméretezés" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Körvonal" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Ãtméretezés az ablak körvonalával" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Téglalap" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Téglalap ablakátméretezés" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Ablak átméretezése" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Ablak átméretezése" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Ablak átméretezésének indítása" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Nyújtásos ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Hagyományos ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Körvonalas ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Téglalap ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Nyújtás" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Ãtméretezés az ablak nyújtásával" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Hagyományos ablakátméretezést használó ablakok" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Körvonalas ablakátméretezést használó ablakok" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Téglalap ablakátméretezést használó ablakok" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Nyújtásos ablakátméretezést használó ablakok" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Élforgatás egérművelet" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Élforgatás áthelyezés" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Élforgatás mutató" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Forgatási idÅ‘" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Forgatás a bal oldali nézÅ‘pontig és mutató léptetése" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "Objektum kép szélére húzása esetén forgatás a következÅ‘ nézÅ‘pontig" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "Mutató kép szélére húzása esetén forgatás a következÅ‘ nézÅ‘pontig" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Egy ablak kép szélére húzása esetén forgatás a következÅ‘ nézÅ‘pontig" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Forgatás a jobb oldali nézÅ‘pontig és mutató léptetése" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Y tengely átalakítása a mutató mozgásához" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Y mutató invertálása" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Mutató érzékenysége" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Kiemelés forgatáskor" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Ablakok megnyitása kattintás esetén" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Kocka forgatása" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Forgatás balra" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Forgatás jobbra" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Forgatás balra" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Forgatás balra az ablakkal együtt" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Forgatás jobbra" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Forgatás jobbra az ablakkal együtt" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Forgatás" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Forgatás az 1. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Forgatás az 1. elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Forgatás a 10. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Forgatás a 10. elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Forgatás a 11. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Forgatás a 11. elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Forgatás a 12. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Forgatás a 12. elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Forgatás a 2. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Forgatás a 2. elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Forgatás a 3. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Forgatás a 3. elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Forgatás a 4. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Forgatás a 4. elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Forgatás az 5. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Forgatás az 5. elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Forgatás a 6. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Forgatás a 6. elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Forgatás a 7. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Forgatás a 7. elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Forgatás a 8. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Forgatás a 8. elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Forgatás a 9. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Forgatás a 9. elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Kocka forgatása" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "A munkaasztalkocka forgatása" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Balra forgatás" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Balra forgatás az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Jobbra forgatás" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Jobbra forgatás az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Forgatás a kocka elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Forgatás a kocka elÅ‘lap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Forgatás az 1. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Forgatás az 1. elÅ‘lap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Forgatás a 10. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Forgatás a 10. elÅ‘lap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Forgatás a 11. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Forgatás a 11. elÅ‘lap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Forgatás a 12. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Forgatás a 12. elÅ‘lap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Forgatás a 2. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Forgatás a 2. elÅ‘lap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Forgatás a 3. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Forgatás a 3. elÅ‘lap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Forgatás a 4. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Forgatás a 4. elÅ‘lap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Forgatás az 5. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Forgatás az 5. elÅ‘lap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Forgatás a 6. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Forgatás a 6. elÅ‘lap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Forgatás a 7. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Forgatás a 7. elÅ‘lap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Forgatás a 8. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Forgatás a 8. elÅ‘lap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Forgatás a 9. elÅ‘lap felé" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Forgatás a 9. elÅ‘lap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Forgatás munkalapra" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Ablak forgatása" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Forgatás az ablakkal együtt" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Forgatás gyorsulása" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Forgatás sebessége" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Forgatás idÅ‘köze" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Forgatási nagyítás" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Mutatómozgatás érzékenysége" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Hirtelen kockaforgatás a also oldalra" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Hirtelen kockaforgatás a felsÅ‘ oldalra" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Alsó oldalhoz ugrás" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "FelsÅ‘ oldalhoz ugrás" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Forgatás indítása" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "A nézÅ‘pont váltása elÅ‘tti idÅ‘korlát" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Nagyítás" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Ãtlátszatlanság (0-100%)" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Nagy" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "ÃttekintÅ‘ üzemmódban marad" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Ãtváltás áttekintÅ‘ üzemmódba ahelyett, hogy a gomb megnyomásakor átváltana, " "majd elengedésekor vissza." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Asztalra kattintva az asztal megjelenítése" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "SötétülÅ‘ háttér" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "SötétülÅ‘ háttér az ablakok átméretezésekor" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Embléma" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "Asztalra kattintás esetén az asztal megjelenítése áttekintÅ‘ nézetben" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Mutatás ideje" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Ablakválasztó indítása" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Ablakválasztó indítása minden ablakhoz" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Ablakválasztó indítása ablakcsoporthoz" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Ablakválasztó indítása a jelenlegi kimenet ablakain" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "ÃttekintÅ‘ üzemmódban marad" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Ãtváltás áttekintÅ‘ üzemmódba ahelyett, hogy a gomb megnyomásakor átváltana, " "majd elengedésekor vissza." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Elrendezés és ablaktranszformáció indítása" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Elrendezés és ablakcsoport-transzformáció indítása" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Ablaktranszformáció és elrendezés indítása" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Elrendezés és a jelenlegi kimenet ablakai transzformációjának indítása" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Az összes kimeneti eszközön" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "A jelenlegi kimeneti eszközön" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ÃtfedÅ‘ ikon" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Ikon átfedése az ablakon átméretezéskor" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "ÃttekintÅ‘ nézet" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Ablakok áttekintÅ‘ nézete" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Ãttekintés sebessége" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Ãttekintés idÅ‘köze" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Ablakok áttekintése" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Megadja, hogy több kimeneti eszköz esetén melyik eszköz jelenítse meg az " "ablakok áttekintÅ‘ nézetét." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Ablakok közti távolság" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Távolság" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Az áttekintÅ‘ nézetbÅ‘l való kilépés elÅ‘tt eltöltött idÅ‘ (ezredmásodpercben) " "az ablakra mutatáskor" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Ablaktípusok, amelyek áttekintÅ‘ nézetben megjelennek" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "A automatikus indítása bejelentkezéskor" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Könyvtár" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Téglalap képernyÅ‘kép készítése" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Alkalmazás indítása" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "KépernyÅ‘képek elhelyezése ebbe a könyvtárba" # /tmp/intro:67 /tmp/xapi:379 #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "KépernyÅ‘kép" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "KépernyÅ‘kép bÅ‘vítmény" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "SVG" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "SVG képbetöltÅ‘" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "FényerÅ‘sség (0-100%)" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Telítettség (0-100%)" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Alkalmazásváltó" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automatikus forgatás" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "ElÅ‘rehozás" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "A kijelölt ablak az elÅ‘térbe hozása" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "A munkaasztal kinagyításának mértéke ablakváltás során" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikon" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimalizálva" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "KövetkezÅ‘ panel" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "KövetkezÅ‘ ablak" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "KövetkezÅ‘ ablak (minden ablak)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "KövetkezÅ‘ ablak (nincs elÅ‘ugró ablak)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" "Ablakváltó megjelenítése ha nem látható és a következÅ‘ ablak kiválasztása" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Ablakváltó megjelenítése ha nem látható és az összes ablak közül a következÅ‘ " "kiválasztása" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Ablakváltó megjelenítése ha nem látható és az elÅ‘zÅ‘ ablak kiválasztása" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Ablakváltó megjelenítése ha nem látható és az összes ablak közül az elÅ‘zÅ‘ " "kiválasztása" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "ElÅ‘zÅ‘ panel" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "ElÅ‘zÅ‘ ablak" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "ElÅ‘zÅ‘ ablak (minden ablak)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "ElÅ‘zÅ‘ ablak (nincs elÅ‘ugró ablak)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Forgatás a kiválasztott ablakra váltás közben" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Válassza ki a következÅ‘ paneltípus-ablakot." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "KövetkezÅ‘ ablak kiválasztása a felbukkanó ablak nélkül." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Válassza ki az elÅ‘zÅ‘ paneltípus-ablakot." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "ElÅ‘zÅ‘ ablak kiválasztása a felbukkanó ablak nélkül." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Ikon megjelenítése a miniatűr mellett" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Ikonizált ablakok megjelenítése" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Váltás sebessége" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Váltás idÅ‘köz" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Ablakváltó ablak" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Az ablakválasztóban megjelenítendÅ‘ ablaktípusok" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 színtértámogatás biztosítása" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Videólejátszás" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Videólejátszás" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 színtér" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Vonal hozzáadása" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Pont hozzáadása" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Víz effektus hozzáadása a különbözÅ‘ munkaasztal-műveletekhez" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "EsÅ‘cseppek közötti késleltetés (ms)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Mutató víz effektus bekapcsolása" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Vonal" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Eltolás skálája" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Pont" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "EsÅ‘ késleltetése" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Címhullám" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "„Eső†kapcsoló" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "„Eső†effektus kapcsoló" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "„Ablaktörlő†kapcsoló" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "„Ablaktörlő†effektus kapcsoló" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Víz effektus" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Víz eltolás mértéke" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Hullám effektus az ablakcímbÅ‘l" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Fókusz effektus" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Ablakfókusz-effektus" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Ablakfókusz-típusok" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Súrlódás" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Ablaktípusok érzékelése" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Rács felbontása" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Ablakok illesztése fordítva" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Ablak összetörése" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Térkép effektus" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Ablaktérkép-effektus" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Ablaktérkép-típusok" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Maximalizálás effektus" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Rács minimális mérete" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimum csúcs-rácspont mérete" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Ablak áthelyezése" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Összetörés" # 52895 AttribValues/label #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Illesztés fordítva" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Ablakok illesztése" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Rugó súrlódása" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Rugóállandó (K)" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Rugóállandó (K)" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "„Ablakok illesztése†effektus kapcsoló" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Rugómodell használata az imbolygó ablakeffektusnál" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Csúcspontrács felbontása" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Ablaktípusok, amelyek imbolyoghatnak fókuszáláskor" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Ablaktípusok, amelyek imbolyoghatnak megfogáskor" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Ablaktípusok, amelyek imbolyoghatnak, amikor térképezettek" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Ablaktípusok, amelyek imbolyoghatnak áthelyezéskor" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Imbolygás ablakok maximalizálásakor és visszaállításakor" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Imbolygó ablakok" #~ msgid "Command line 0" #~ msgstr "0. parancssor" #~ msgid "Run command 0" #~ msgstr "0. parancs futtatása" #~ msgid "Screenshot commands" #~ msgstr "KépernyÅ‘kép parancsok" #~ msgid "Screenshot key bindings" #~ msgstr "KépernyÅ‘kép gyorsbillentyű" #~ msgid "Filter Linear" #~ msgstr "Lineáris szűrÅ‘" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Lineáris szűrÅ‘ használata nagyításnál" #~ msgid "Zoom Desktop" #~ msgstr "Munkaasztal nagyítása" #~ msgid "Zoom In" #~ msgstr "Nagyítás" #~ msgid "Zoom Out" #~ msgstr "Kicsinyítés" #~ msgid "Zoom Pan" #~ msgstr "Nagyítás" #~ msgid "Zoom Speed" #~ msgstr "Nagyítás sebessége" #~ msgid "Zoom Timestep" #~ msgstr "Nagyítás idÅ‘köz" #~ msgid "Zoom and pan desktop cube" #~ msgstr "A munkaasztalkocka nagyítása és pásztázása" #~ msgid "Zoom factor" #~ msgstr "Nagyítási arány" #~ msgid "Zoom pan" #~ msgstr "Nagyítás" #~ msgid "Decrease window opacity" #~ msgstr "Ablak átlátszatlanságának csökkentése" #~ msgid "Increase window opacity" #~ msgstr "Ablak átlátszatlanság növelése" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "Ãtlátszatlansági értékek az alapértelmezésként átlátszó ablakokhoz" #~ msgid "Opacity windows" #~ msgstr "Ablakok átlátszatlansága" #~ msgid "Background Images" #~ msgstr "Háttérképek" #~ msgid "Background images" #~ msgstr "Háttérképek" #~ msgid "Place windows on a plane" #~ msgstr "Ablakok elhelyezése a síkon" #~ msgid "Plane Down" #~ msgstr "Gördítés le" #~ msgid "Plane Left" #~ msgstr "Gördítés balra" #~ msgid "Plane Right" #~ msgstr "Gördítés jobbra" #~ msgid "Plane To Face 1" #~ msgstr "Gördítés az 1. elÅ‘lap felé" #~ msgid "Plane To Face 10" #~ msgstr "Gördítés a 10. elÅ‘lap felé" #~ msgid "Plane To Face 11" #~ msgstr "Gördítés a 11. elÅ‘lap felé" #~ msgid "Plane To Face 12" #~ msgstr "Gördítés a 12. elÅ‘lap felé" #~ msgid "Plane To Face 2" #~ msgstr "Gördítés a 2. elÅ‘lap felé" #~ msgid "Plane To Face 3" #~ msgstr "Gördítés a 3. elÅ‘lap felé" #~ msgid "Plane To Face 4" #~ msgstr "Gördítés a 4. elÅ‘lap felé" #~ msgid "Plane To Face 5" #~ msgstr "Gördítés az 5. elÅ‘lap felé" #~ msgid "Plane To Face 6" #~ msgstr "Gördítés a 6. elÅ‘lap felé" #~ msgid "Plane To Face 7" #~ msgstr "Gördítés a 7. elÅ‘lap felé" #~ msgid "Plane To Face 8" #~ msgstr "Gördítés a 8. elÅ‘lap felé" #~ msgid "Plane To Face 9" #~ msgstr "Gördítés a 9. elÅ‘lap felé" #~ msgid "Plane Up" #~ msgstr "Gördítés fel" #~ msgid "Plane down" #~ msgstr "Gördítés le" #~ msgid "Plane left" #~ msgstr "Gördítés balra" #~ msgid "Plane right" #~ msgstr "Gördítés jobbra" #~ msgid "Plane to face 1" #~ msgstr "Gördítés az 1. elÅ‘lap felé" #~ msgid "Plane to face 10" #~ msgstr "Gördítés a 10. elÅ‘lap felé" #~ msgid "Plane to face 11" #~ msgstr "Gördítés a 11. elÅ‘lap felé" #~ msgid "Plane to face 12" #~ msgstr "Gördítés a 12. elÅ‘lap felé" #~ msgid "Plane to face 2" #~ msgstr "Gördítés a 2. elÅ‘lap felé" #~ msgid "Plane to face 3" #~ msgstr "Gördítés a 3. elÅ‘lap felé" #~ msgid "Plane to face 4" #~ msgstr "Gördítés a 4. elÅ‘lap felé" #~ msgid "Plane to face 5" #~ msgstr "Gördítés az 5. elÅ‘lap felé" #~ msgid "Plane to face 6" #~ msgstr "Gördítés a 6. elÅ‘lap felé" #~ msgid "Plane to face 7" #~ msgstr "Gördítés a 7. elÅ‘lap felé" #~ msgid "Plane to face 8" #~ msgstr "Gördítés a 8. elÅ‘lap felé" #~ msgid "Plane to face 9" #~ msgstr "Gördítés a 9. elÅ‘lap felé" #~ msgid "Plane up" #~ msgstr "Gördítés fel" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Munkaasztal ablakelhalványítási ideje" #~ msgid "Open window menu" #~ msgstr "Ablak menü megnyitása" compiz-0.9.11+14.04.20140409/po/ru.po0000644000015301777760000033167612321343002017116 0ustar pbusernogroup00000000000000# translation of compiz.po to Russian # Copyright (C) 2005, 2006 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # # Aleksey Osipov , 2005, 2006. # Aleksey Novodvorksy , 2000. # Eugene Osintsev , 1999, 2000. # Dimitriy Ryazantcev , 2008. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-10-03 16:47+0200\n" "Last-Translator: Shnatsel \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Рабочий Ñтол" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Управление Окнами" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ðикакой" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Свернуть в заголовок" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Развернуть" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Развернуть в ширину" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Развернуть в выÑоту" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Свернуть" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Развернуть" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "ОпуÑтить" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Меню окна" # ДейÑтвие при прокрутке колеÑика мыши на заголовке окна #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "ДейÑтвие при прокрутке колеÑика мыши на заголовке окна." # combo box item #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Тип размытиÑ" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "ПрозрачноÑть активного окна темы metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Затенение прозрачноÑти активного окна темы metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "ПрозрачноÑть темы metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Затенение прозрачноÑти темы metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "ПрозрачноÑть активных окон Ñ Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸ÐµÐ¼ темы metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "ПрозрачноÑть Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ÐºÐ¾Ð½ темы metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "ЗатенÑть активные окна Ñ Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸ÐµÐ¼ темы Ð´Ð»Ñ metacity от непрозрачного до " "полупрозрачного" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "ЗатенÑть окна Ñ Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸ÐµÐ¼ темы Ð´Ð»Ñ metacity от непрозрачного до " "полупрозрачного" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "ДейÑтвие, на колёÑико мыши на заголовке окна" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Тип размытиÑ, иÑпользуемый Ð´Ð»Ñ Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ð¹ окна" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "ИÑпользовать тему metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "ИÑпользовать тему metacity при отриÑовке декораций окон" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Закрыть окно" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Отменить полное развертывание окна" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Развернуть окно" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Свернуть окно" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Поверх вÑех" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Приклеить" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Развернуть из заголовка" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Ðе делать поверх вÑех" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Отклеить" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Окно \"%s\" не отвечает." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "УÑкоренное закрытие Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÑ‚ к потере не Ñохраненных изменений." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_УÑкоренный выход" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Заметка" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ¸" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Цвет черты заметки" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Модуль заметки" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "ОчиÑтить" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "РиÑовать" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "РиÑовать, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¸Ð½Ñтрумент" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Цвет заливки Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÑ‚Ð¾Ðº" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Инициировать" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Инициировать риÑование заметки" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Инициировать Ñтирание заметки" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Инициировать Ñтирание" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Ширина линии" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Ширина линии Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÑ‚Ð¾Ðº" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Цвет черты Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÑ‚Ð¾Ðº" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Ширина черты" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Ширина черты Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÑ‚Ð¾Ðº" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4-ÐºÑ€Ð°Ñ‚Ð½Ð°Ñ Ð±Ð¸Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Размытие по альфа-каналу" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Размытие окон по альфа-каналу" # MenuButton label # menubutton label #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Фильтр размытиÑ" # Table header 4/5 #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Преграждение размытиÑ" # Table header 4/5 #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "ÐаÑыщенноÑть размытиÑ" # combo box item #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "СкороÑть размытиÑ" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Размытие окон" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Размытие за прозрачными чаÑÑ‚Ñми окон" # Table header 4/5 #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "ÐаÑыщенноÑть размытиÑ" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Размытие окон" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Размытие окон, которые не активны" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Отключить размытие облаÑтей Ñкрана, Ñкрытых другими окнами." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Метод фильтра, иÑпользуемый Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Размытие активного" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Размытие активных окон" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "ГауÑÑово размытие" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Ð Ð°Ð´Ð¸ÑƒÑ Ñ€Ð°Ð·Ð¼Ñ‹Ñ‚Ð¸Ñ" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Сила размытиÑ" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Ð Ð°Ð´Ð¸ÑƒÑ Ñ€Ð°Ð·Ð¼Ñ‹Ñ‚Ð¸Ñ" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Сила размытиÑ" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "ÐезавиÑимое получение текÑтур" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "МипмÑппинг" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Уровень детализации мипмÑппинга" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Ð”ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼Ð¸Ð¿Ð¼Ñппинга" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "ПульÑ" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Эффект пульÑации" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "ИÑпользовать доÑтупное количеÑтво Ñлементов текÑтур Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÐºÐ°Ðº можно " "большего количеÑтва незавиÑимых текÑтур." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "СкороÑть Ñ€Ð°Ð·Ð¼Ñ‹Ñ‚Ð¸Ñ Ð¾ÐºÐ½Ð°" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Окна, на которые дейÑтвует размытие" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Окна, на которые дейÑтвует размытие по умолчанию" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Дублирование вывода" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Инициировать выбор дублированиÑ" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Обработчик дублированного вывода" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "ÐšÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ вызове, выполнит команду оболочки, " "идентифицируемую как команда9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Закрепление за гранью Ñкрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Закрепление за гранью Ñкрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Закрепление за гранью Ñкрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Закрепление за гранью Ñкрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Закрепление за гранью Ñкрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Закрепление за гранью Ñкрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Закрепление за гранью Ñкрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Закрепление за гранью Ñкрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Закрепление за гранью Ñкрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Закрепление за гранью Ñкрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Закрепление за гранью Ñкрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Закрепление за гранью Ñкрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Ðазначает Ð·Ð°ÐºÑ€ÐµÐ¿Ð»ÐµÐ½Ð¸Ñ Ð½Ð° выполнение команд" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Комбинации клавиш" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена в оболочке при вызове run_command0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена в оболочке при вызове run_command1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена в оболочке при вызове run_command10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена в оболочке при вызове run_command11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена в оболочке при вызове run_command2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена в оболочке при вызове run_command3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена в оболочке при вызове run_command4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена в оболочке при вызове run_command5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена в оболочке при вызове run_command6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена в оболочке при вызове run_command7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена в оболочке при вызове run_command8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена в оболочке при вызове run_command9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Команды" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Ð—Ð°ÐºÑ€ÐµÐ¿Ð»ÐµÐ½Ð¸Ñ Ð³Ñ€Ð°Ð½Ð¸" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Комбинации клавиш" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Выполнить команду 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Выполнить команду 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Выполнить команду 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Выполнить команду 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Выполнить команду 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Выполнить команду 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Выполнить команду 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Выполнить команду 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Выполнить команду 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Выполнить команду 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Выполнить команду 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Выполнить команду 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Ðктивные модули" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "ПозволÑет риÑовать окна в полноÑкранном режиме без Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² облаÑти " "раÑтрового Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð° пределами Ñкрана" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Слышимый Ñигнал" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Слышимый ÑиÑтемный звуковой Ñигнал" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "ÐвтораÑкрытие" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Задержка автораÑкрытиÑ" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "ÐвтоматичеÑкое определение уÑтройÑтв вывода" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "ÐвтоматичеÑкое определение чаÑтоты обновлениÑ" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Ðаилучшее" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Щелкните окно, чтобы передать ему Ñ„Ð¾ÐºÑƒÑ Ð²Ð²Ð¾Ð´Ð°" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Закрытие активного окна" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Значок по умолчанию" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Значок окна по умолчанию" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Размер рабочего Ñтола" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Определить уÑтройÑтва вывода" # headline for dialog "Select for update" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Определить чаÑтоту обновлениÑ" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "ÐаÑтройки отображениÑ" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Задержка ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ Ð¼Ñ‹ÑˆÐ¸ на краю Ñкрана перед тем, как будет Ñовершено " "дейÑтвие ÐºÑ€Ð°Ñ Ñкрана." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Задержка ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð½Ð° краю" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "БыÑтрое" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Поведение при развёртивании" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Уровень упреждающей фокуÑировки" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Ð£Ð¿Ñ€ÐµÐ¶Ð´Ð°ÑŽÑ‰Ð°Ñ Ñ„Ð¾ÐºÑƒÑировка окон" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Ð£Ð¿Ñ€ÐµÐ¶Ð´Ð°ÑŽÑ‰Ð°Ñ Ñ„Ð¾ÐºÑƒÑировка окон" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "ÐŸÑ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð½ÐµÐ·Ð°Ð²Ð¸ÑÐ¸Ð¼Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ñовка вывода." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Общие наÑтройки" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Общие наÑтройки Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Хорошее" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Скрыть вÑе, кроме окон панели задач" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Скрыть вÑе окна и передать Ñ„Ð¾ÐºÑƒÑ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ¼Ñƒ Ñтолу" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "При переходе в режим Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ Ñтола окна, отÑутÑтвующие на " "панели задач, не отображаютÑÑ" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Ð’Ñ‹Ñокий" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Виртуальный размер по горизонтали" # думаю так должно быть верно. #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "ИÑпользовать Ñжатие Ð´Ð»Ñ Ñ‚ÐµÐºÑтур, конвертированных от изображений, еÑли " "доÑтупно" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Игнорировать подÑказки в развернутом ÑоÑтоÑнии" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Игнорирование подÑказок ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¾Ð² и ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñторон Ð´Ð»Ñ " "развернутого окна" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Интервал времени до автораÑÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… окон" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Интервал между ÑообщениÑми отклика" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Ð¡Ð¾Ñ‡ÐµÑ‚Ð°Ð½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Уровень Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ñ…Ð¸Ñ‰ÐµÐ½Ð¸Ñ Ñ„Ð¾ÐºÑƒÑа" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "ОÑвещение" # command line help text for the 'list detected only' option #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "СпиÑок активных в данный момент модулей" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "СпиÑок Ñтрок, опиÑывающих уÑтройÑтва вывода" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Ðизкий" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "ПеремеÑтить окно на задний план" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "РаÑположение окна позади других окон" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Развернуть окно горизонтально" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Развернуть окно вертикально" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Развертывание активного окна" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Развертывание активного окна горизонтально" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Развертывание активного окна вертикально" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Свертывание активного окна" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Ðормальное" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "ЧиÑло рабочих Ñтолов" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "ЧиÑло виртуальных рабочих Ñтолов" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Отключить" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "ОбновлÑть Ñкран во Ð²Ñ€ÐµÐ¼Ñ Ð³Ð°ÑˆÐµÐ½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾Ð³Ð¾ хода луча кадровой развертки" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "УÑтройÑтва вывода" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Обработка перекрывающегоÑÑ Ð²Ñ‹Ð²Ð¾Ð´Ð°" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "ОтриÑовывать каждое уÑтройÑтво вывода незавиÑимо, даже еÑли уÑтройÑтва " "вывода перекрываютÑÑ" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Задержка отклика" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Предпочтение большему выводу" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Предпочтение меньшему выводу" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Вызвать щелчком" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Вызвать окно" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Вызов выбранных окон по иÑтечении интервала времени" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Вызов и размещение окна поверх других окон" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Вызов окон щелчком" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "ЧаÑтота обновлениÑ" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "КоÑффициент размера Ñкрана Ð´Ð»Ñ Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ размера по горизонтали" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "КоÑффициент размера Ñкрана Ð´Ð»Ñ Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ размера по вертикали" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Показать рабочий Ñтол" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Замедлить анимацию" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Умный режим" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Синхронизировать Ñ VBlank" # MenuButton label # menubutton label #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "КомпреÑÑÐ¸Ñ Ñ‚ÐµÐºÑтур" # MenuButton label # menubutton label #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Фильтр текÑтур" # MenuButton label # menubutton label #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Ð¤Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтур" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "ЧаÑтота, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ перериÑовываетÑÑ Ñодержимое Ñкрана (раз/Ñек)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Развертывать окно" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Развертывать окно по горизонтали" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Развертывать окно по вертикали" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Переключить Ñвертывание окна в полоÑку" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Развертывание активного окна" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Развертывание активного окна по горизонтали" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Развертывание активного окна по вертикали" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Переключение ÑÐ²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ окна в полоÑку" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Переключатель Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾Ð¹ анимации" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Отмена полного Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ окна" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Отменить перенаправление окон в полноÑкранном режиме" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "ИÑпользование раÑÑеÑнного Ñвета при преобразовании Ñкрана" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Виртуальный размер по вертикали" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Очень выÑокий" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Которое из перекрывающихÑÑ ÑƒÑтройÑтв вывода должно быть выбрано" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Сочетание кнопок меню окна" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Сочетание клавиш меню окна" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "УÑкорение" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "ÐаÑтройка изображениÑ" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "ÐаÑтройка Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° верхней грани куба" # this is a menu entry #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Переход к Ñледующему Ñлайду" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Ðнимировать фон" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Ðнимирование фона при вращении куба" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Внешний вид" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "ÐвтоматичеÑкий" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Поведение" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Цвет верхней и нижней граней куба" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Цвет, иÑпользуемый Ð´Ð»Ñ Ð½Ð¸Ð¶Ð½ÐµÐ¹ границы градиента фона" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Цвет, иÑпользуемый Ð´Ð»Ñ Ð²ÐµÑ€Ñ…Ð½ÐµÐ¹ границы градиента фона" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Шапка куба" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Цвета куба" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Куб рабочего Ñтола" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "УÑкорение ÑвертываниÑ" # combo box item #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "СкороÑть ÑвертываниÑ" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Шаг времени ÑвертываниÑ" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "По возможноÑти применÑть множеÑтвенное отображение Ð´Ð»Ñ Ð¼Ð°ÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ " "качеÑтва изображениÑ" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Возврат к предыдущему Ñлайду" # summary information text - header #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Файлы изображений" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Изображение, иÑпользуемое в качеÑтве текÑтуры Ð´Ð»Ñ Ñ„Ð¾Ð½Ð°" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "ПрозрачноÑть куба только во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¼Ñ‹ÑˆÑŒÑŽ." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ВнутреннÑÑ Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ð¾Ñть куба" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "ВнутреннÑÑ Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ð¾Ñть куба" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "СпиÑок PNG- и SVG-файлов, которые Ñледует отобразить на верхней грани куба" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Режим множеÑтвенного вывода" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "ÐеÑколько кубов" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Следующий Ñлайд" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Один большой куб" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ПрозрачноÑть во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "ПрозрачноÑть в Ñтатичном положении" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ПрозрачноÑть рабочего Ñтола во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "ПрозрачноÑть окон на рабочем Ñтоле в Ñтатичном положении." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Размещение окон на кубе" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Предыдущий Ñлайд" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "ОтриÑовка фона" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "МаÑштабировать изображение" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "МаÑштабировать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð²ÐµÑ€Ñ…Ð½ÐµÐ¹ грани куба" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Выбор Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐºÑƒÐ±Ð° при множеÑтвенном выводе." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Фон" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Конечный цвет градиента Ð´Ð»Ñ Ñ„Ð¾Ð½Ð°" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Ðачальный цвет градиента Ð´Ð»Ñ Ñ„Ð¾Ð½Ð°" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Изображение Ð´Ð»Ñ Ñ„Ð¾Ð½Ð°" # combo box item #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "СкороÑть" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Шаг времени" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "ПрозрачноÑть только при вращении мышью" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "ПрозрачноÑть куба" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Развертывание" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Развертывание куба" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Управление Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Разрешить генерацию мипмÑпов Ð´Ð»Ñ Ñ‚ÐµÐºÑтур оформлениÑ" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Команда" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Ð”ÐµÐºÐ¾Ñ€Ð°Ñ†Ð¸Ñ Ð¾ÐºÐ¾Ð½" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока декоратора, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÑетÑÑ, еÑли декоратор еще не " "запущен" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Смещение отбраÑываемой тени по оÑи X" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Смещение отбраÑываемой тени по оÑи Y" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Цвет отбраÑываемой тени" # int field #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "ПрозрачноÑть отбраÑываемой тени" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Ð Ð°Ð´Ð¸ÑƒÑ Ð¾Ñ‚Ð±Ñ€Ð°Ñываемой тени" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Цвет тени" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Смещение тени по оÑи X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Смещение тени по оÑи Y" # int field #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "ПрозрачноÑть тени" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Ð Ð°Ð´Ð¸ÑƒÑ Ñ‚ÐµÐ½Ð¸" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Тень окон" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Оформление окна" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Оформление окна" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Окна к которым будет применено оформление" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Окна которые будут отбраÑывать тень" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "ЯркоÑть (в %) неотвечающих окон" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "ПоÑтоÑÐ½Ð½Ð°Ñ ÑкороÑть" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "ПоÑтоÑнное времÑ" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Затемнение не отвечающего окна" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "Затемнение окна, которое не отвечает на запроÑÑ‹ менеджера окон" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "СкороÑть иÑчезновениÑ" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "ЗатенÑть при Ñвертывании/открытии/закрытии" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "СкороÑть затенениÑ" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¸ÑчезновениÑ" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Эффект Ð·Ð°Ñ‚ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ Ñвертывании/открытии/закрытии окон" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Эффект Ð·Ð°Ñ‚ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ ÑиÑтемном звуковом Ñигнале" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "ПоÑтепенное проÑвление окон при отображении и поÑтепенное иÑчезновение при " "отмене отображениÑ" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Затенение окон" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "ПроÑвление/иÑчезание окон" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "ПолноÑÐºÑ€Ð°Ð½Ð½Ð°Ñ Ð²Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¾Ð³Ð¾ Ñигнала" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" "ПолноÑкранный Ñффект проÑвлениÑ/иÑÑ‡ÐµÐ·Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ ÑиÑтемном звуковом Ñигнале" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "ÐаÑыщенноÑть (в %) не отвечающего окна" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "ЯркоÑть не отвечающего окна" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "ÐаÑыщенноÑть не отвечающего окна" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¾Ð³Ð¾ Ñигнала" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Режим проÑвлениÑ/иÑÑ‡ÐµÐ·Ð½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð°" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "СкороÑть иÑÑ‡ÐµÐ·Ð½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð° в режиме \"ПоÑтоÑÐ½Ð½Ð°Ñ ÑкороÑть\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¸ÑÑ‡ÐµÐ·Ð½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð° (в мÑ) в режиме \"ПоÑтоÑÐ½Ð½Ð°Ñ ÑкороÑть\"" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Окна, к которым Ñледует применÑть Ñффект проÑвлениÑ/иÑчезаниÑ" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Точка монтированиÑ" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Точка монтированиÑ" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема в пользовательÑком проÑтранÑтве (fuse)" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема в пользовательÑком проÑтранÑтве (fuse)" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Управление GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Поддержка оÑновного цикла GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "СовмеÑтимоÑть Ñ Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Открыть в терминале" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Опции, поддерживающие ÑовмеÑтимоÑть Compiz Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸ÐµÐ¼ рабочего Ñтола Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Диалоговое окно запуÑка" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "ЗапуÑтить команду в терминале" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока Ñнимка Ñкрана" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Отобразить главное меню" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Отображение диалогового окна запуÑка приложениÑ" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Отображение главного меню" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Сделать Ñнимок Ñкрана" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Сделать Ñнимок окна" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока терминала" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока Ñнимка окна" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð² проÑтом ini-файле" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Модуль Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð± изменении файла" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Управление Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Эффект ÑвертываниÑ" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Свернуть окна" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "СкороÑть ÑвертываниÑ" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Квант времени ÑвертываниÑ" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "УÑтойчивоÑть тени" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "УÑтойчивоÑть тени" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Преобразовывать окна при Ñвертывании и отмене ÑвертываниÑ" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Окна, которые должны быть преобразованы при Ñвертывании" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Ограничить Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Ограничение координаты Y пределами рабочей облаÑти" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Ðе обновлÑть Ñо Ñтороны Ñервера положение окон до Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Инициировать движение окна" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "\"Ленивое\" позиционирование" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "ПеремеÑтить окно" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "ПеремеÑтить окно" # int field #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "ПрозрачноÑть" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Степень прозрачноÑти движущихÑÑ Ð¾ÐºÐ¾Ð½" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Отмена привÑзки и автоматичеÑÐºÐ°Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð° Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ñтью развернутых " "окон при перетаÑкивании" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Отменить привÑзку полноÑтью развернутых окон" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "ЗапуÑк Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð°" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "ЯркоÑть" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Уменьшение ÑркоÑти" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Увеличение ÑркоÑти" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Шаг Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑркоÑти" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Значение ÑркоÑти Ð´Ð»Ñ Ð¾ÐºÐ¾Ð½" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Уменьшить" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Увеличить" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Уменьшение прозрачноÑти" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Увеличение прозрачноÑти" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Шаг прозрачноÑти" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Значение прозрачноÑти Ð´Ð»Ñ Ð¾ÐºÐ¾Ð½" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "ПрозрачноÑть, ÑркоÑть и наÑыщенноÑть" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Регулировки прозрачноÑти, ÑркоÑти и наÑыщенноÑти" # Table header 4/5 #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "ÐаÑыщенноÑть" # Table header 4/5 #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Уменьшение наÑыщенноÑти" # Table header 4/5 #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Увеличение наÑыщенноÑти" # Table header 4/5 #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Шаг Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°ÑыщенноÑти" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð°ÑыщенноÑти Ð´Ð»Ñ Ð¾ÐºÐ¾Ð½" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Шаг" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "СпецифичеÑкие наÑтройки окна" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾ÐºÐ½Ð°" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Окна" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Окна, которые должны иметь отличную(другую) ÑркоÑть по умолчанию" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Окна, которые должны иметь отличную(другую) прозрачноÑть по умолчанию" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Окна, которые должны иметь отличную(другую) наÑыщенноÑть по умолчанию" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Ðлгоритм, иÑпользуемый Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð°" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "КаÑкадом" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "По центру" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "ФикÑированное размещение окна" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Принудительное позиционирование окон" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Горизонтальные позиции видовых окон" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Держать в рабочей облаÑти" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "Предотвратить перемещение окон запределы Ñкрана" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Размещение окон" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Размещать на вÑех уÑтройÑтвах вывода" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "При отображении размеÑтите окна в нужных меÑтах" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Режим размещениÑ" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Спозиционированные окна" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Случайно" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Выбор как должно ÑÐµÐ±Ñ Ð²ÐµÑти позиционирование окон, еÑли иÑпользуетÑÑ " "неÑколько выводов" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Умный" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "ИÑпользовать активное уÑтройÑтво вывода" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "ИÑпользовать уÑтройÑтво вывода ÑфокуÑированного окна" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "ИÑпользовать уÑтройÑтво вывода Ñ ÐºÑƒÑ€Ñором" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Вертикальные позиции видовых окон" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Спозиционированные окна видового окна" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Обходные пути при размещении окна" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Окна, которые должны быть Ñпозиционированны по умолчанию" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Окна, которые должны быть Ñпозиционированны в определенном Ñкране по " "умолчанию" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Окна, которые должны быть Ñпозиционированы, даже еÑли они указывают, что " "Ñтого делать не нужно." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Окно Ñ Ñ„Ð¸ÐºÑированной позицией" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Окно Ñ Ñ„Ð¸ÐºÑированным видовым окном" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Обходные пути" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "ÐŸÐ¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "ÐŸÐ¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¾Ð²Ð¾Ð³Ð¾ окна по X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "ÐŸÐ¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "ÐŸÐ¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¾Ð²Ð¾Ð³Ð¾ окна по Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Загрузчик изображений Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "СоответÑтвие регулÑрными выражениÑми" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "СоответÑтвие окон Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ регулÑрных выражений" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Закрепление" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Цвет границы" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Цвет границы, иÑпользуемый Ð´Ð»Ñ Ð¾Ð±Ñ€Ð¸Ñовки контура и режимов Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ " "размеров прÑмоугольника" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Режим Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° по умолчанию" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Режим по умолчанию, иÑпользуемый Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° окна" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Цвет заливки" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" "Цвет заливки, иÑпользуемый Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¾Ð² прÑмоугольника" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Инициировать обычное изменение размеров окна" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Инициировать изменение размеров окна Граница" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Инициировать изменение размеров окна ПрÑмоугольник" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Инициировать изменение размеров окна РаÑÑ‚Ñжение" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Инициировать изменение размеров окна" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Ðормальное изменение размеров окна" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Граница" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Граница изменение размеров окна" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "ПрÑмоугольник" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "ПрÑмоугольник изменение размеров окна" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Изменение размеров окна" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Изменение размеров окна" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "ЗапуÑк Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¾Ð² окна" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "ЗапуÑк Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¾Ð² окна его раÑÑ‚Ñжением" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "ЗапуÑк обычного Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¾Ð² окна" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "ЗапуÑк Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¾Ð² окна Ñ Ð¿Ð¾ÐºÐ°Ð·Ð¾Ð¼ границы" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "ЗапуÑк Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¾Ð² окна Ñ Ð¿Ð¾ÐºÐ°Ð·Ð¾Ð¼ прÑмоугольника" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "РаÑÑ‚Ñнуть" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "РаÑÑ‚Ñжение изменение размеров окна" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" "Типы окон, которым Ñледует применÑть Ñффект нормального Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð°" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Типы окон, которым Ñледует применÑть Ñффект Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° граница" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" "Типы окон, которым Ñледует применÑть Ñффект Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° прÑмоугольник" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" "Типы окон, которым Ñледует применÑть Ñффект Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° раÑÑ‚Ñжение" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Отражение при перетаÑкивании к краю" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Отражение при перемещении к краю" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Отражение при курÑоре на краю" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Отражение в левое кадровое окно и иÑкажение курÑора" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Отражение на Ñледующее кадровое окно при перетаÑкивании объекта к краю Ñкрана" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Отражение на Ñледующее кадровое окно при Ñмещении курÑора к краю Ñкрана" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Отражение на Ñледующее кадровое окно при перемещении окна к краю Ñкрана" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Отражение в правое кадровое окно и иÑкажение курÑора" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Инвертировать оÑÑŒ Y Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ð¹ курÑора" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Инвертировать Ð´Ð»Ñ ÐºÑƒÑ€Ñора оÑÑŒ Y" # dialog caption #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "ЧувÑтвительноÑть курÑора" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Поднимать при вращении" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Поднимать окна при вращении" # Translators: text entry label #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Вращение куба" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Вращать Ñ Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ влево" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Вращать Ñ Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ вправо" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Вращать влево" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Вращать влево вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Вращать вправо" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Вращать вправо вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" # Translators: text entry label #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Вращать до" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Вращать до грани 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Вращать до грани 1 вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Вращать до грани 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Вращать до грани 10 вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Вращать до грани 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Вращать до грани 11 вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Вращать до грани 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Вращать до грани 12 вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Вращать до грани 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Вращать до грани 2 вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Вращать до грани 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Вращать до грани 3 вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Вращать до грани 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Вращать до грани 4 вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Вращать до грани 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Вращать до грани 5 вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Вращать до грани 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Вращать до грани 6 вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Вращать до грани 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Вращать до грани 7 вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Вращать до грани 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Вращать до грани 8 вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Вращать до грани 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Вращать до грани 9 вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" # Translators: text entry label #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Вращение куба" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Вращение куба рабочего Ñтола" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Вращение влево" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Вращение влево вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Вращение вправо" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Вращение вправо вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Вращение к лицу куба" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Вращать к лицу куба вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Вращение до грани 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Вращение до грани 1 вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Вращение до грани 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Вращение до грани 10 вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Вращение до грани 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Вращение до грани 11 вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Вращение до грани 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Вращение до грани 12 вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Вращение до грани 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Вращение до грани 2 вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Вращение до грани 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Вращение до грани 3 вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Вращение до грани 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Вращение до грани 4 вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Вращение до грани 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Вращение до грани 5 вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Вращение до грани 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Вращение до грани 6 вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Вращение до грани 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Вращение до грани 7 вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Вращение до грани 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Вращение до грани 8 вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Вращение до грани 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Вращение до грани 9 вмеÑте Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ окном" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Вращение до кадрового окна" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Вращать окно" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Вращение вмеÑте Ñ Ð¾ÐºÐ½Ð¾Ð¼" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "УÑкорение вращениÑ" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "СкороÑть вращениÑ" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Квант времени вращениÑ" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "МаÑштабирование вращениÑ" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "ЧувÑтвительноÑть к перемещениÑм курÑора" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "ПривÑзка Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ ÐºÑƒÐ±Ð° к нижней грани" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ПривÑзка Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ ÐºÑƒÐ±Ð° к верхней грани" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "ПривÑзать к нижней грани" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ПривÑзать к верхней грани" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "ЗапуÑк вращениÑ" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Задержка во времени до Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ°Ð´Ñ€Ð¾Ð²Ð¾Ð³Ð¾ окна" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Изменить маÑштаб" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Степень прозрачноÑти в процентах" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Большой" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Режим горÑчих клавиш Ñ Ð·Ð°Ð»Ð¸Ð¿Ð°Ð½Ð¸ÐµÐ¼" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "ИÑпользовать режим горÑчих клавиш Ñ Ð·Ð°Ð»Ð¸Ð¿Ð°Ð½Ð¸ÐµÐ¼ вмеÑто Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ нажатии " "и Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ отпуÑкании кнопок." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Щелкнуть на рабочем Ñтоле Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ Ñтола" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Затемнить фон" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Затемнение фона при маÑштабировании окон" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Эмблема" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Переход в режим Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ Ñтола при щелчке мышью на рабочем Ñтоле " "во Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð°ÑштабированиÑ" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ¸ при наведении" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Инициировать ÑредÑтво выбора окна" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Инициировать ÑредÑтво выбора окна Ð´Ð»Ñ Ð²Ñех окон" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Инициировать ÑредÑтво выбора окна Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ окон" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Инициировать ÑредÑтво выбора окна Ð´Ð»Ñ Ð¾ÐºÐ¾Ð½ текущего уÑтройÑтва вывода" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Режим Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ Ñ Ð·Ð°Ð»Ð¸Ð¿Ð°Ð½Ð¸ÐµÐ¼" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "ИÑпользовать режим горÑчих клавиш Ñ Ð·Ð°Ð»Ð¸Ð¿Ð°Ð½Ð¸ÐµÐ¼ вмеÑто Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ нажатии " "и Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ отпуÑкании кнопок." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Компоновка и запуÑк Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñех окон" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Компоновка и запуÑк Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ окон" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Компоновка и запуÑк Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÐºÐ¾Ð½" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Компоновка и запуÑк Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÐºÐ¾Ð½ текущего уÑтройÑтва вывода" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Ðа вÑе уÑтройÑтва вывода" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Ðа текущее уÑтройÑтво вывода" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Ðаложить значок" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Ðаложение значка на окна при их маÑштабировании" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "МаÑштабировать" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "МаÑштабирование окон" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "СкороÑть маÑштабированиÑ" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Квант времени маÑштабированиÑ" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "МаÑштабирование окон" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Выбрать, где маÑштабировать окна еÑли иÑпользуютÑÑ ÑƒÑтройÑтва множеÑтвенного " "вывода." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "РаÑÑтоÑние между окнами" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Интервал" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Ð’Ñ€ÐµÐ¼Ñ (в мÑ) до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ наведении ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° " "окно" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Типы окон, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… Ñледует применÑть режим маÑштабированиÑ" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "ÐвтоматичеÑки Ñнимок Ñкрана в Ñтой программе" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Каталог" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Сделать Ñнимок облаÑти" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "ЗапуÑтить приложение" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Помещать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñнимков Ñкрана в Ñтот каталог" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Снимок Ñкрана" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Модуль Ñнимка Ñкрана" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Загрузчик изображений Svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Уровень ÑркоÑти в процентах" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Уровень наÑыщенноÑти в процентах" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Переключатель приложений" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "ÐвтоматичеÑки переворачивать" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "ПеремеÑтить на передний план" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Перемещение выбранного окна на передний план" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "При переключении окон рабочий Ñтол на заднем плане должен быть уменьшен" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Значок" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Свернутые" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Следующее окно" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Следующее окно (Ð’Ñе окна)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Следующее окно (Ðе активируÑ)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Отображение Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡Ð°Ñ‚ÐµÐ»Ñ (еÑли он невидим) и выбор Ñледующего окна" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Отображение Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡Ð°Ñ‚ÐµÐ»Ñ (еÑли он невидим) и выбор Ñледующего окна из вÑех " "имеющихÑÑ" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Отображение Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡Ð°Ñ‚ÐµÐ»Ñ (еÑли он невидим) и выбор предыдущего окна" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Отображение Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡Ð°Ñ‚ÐµÐ»Ñ (еÑли он невидим) и выбор предыдущего окна из вÑех " "имеющихÑÑ" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Предыдущее окно" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Предыдущее окно (Ð’Ñе окна)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Предыдущее окно (Ðе активируÑ)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Вращать к выбранному окну при переключении" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Выбрать Ñледующее окно типа панель." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Выбрать Ñледующее окно без показа вÑплывающего окна." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Выбрать предыдущее окно типа панель." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Выбрать предыдущее окно без показа вÑплывающего окна." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Отображение значка Ñ€Ñдом Ñ ÑÑкизом" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Отображение Ñвернутых окон" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "СкороÑть переключателÑ" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Квант времени переключателÑ" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Переключатель окон" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Окна, которые должны быть отображены в переключателе" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "ОбеÑпечить поддержку цветового проÑтранÑтва YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "ВоÑпроизведение видео" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "ВоÑпроизведение видео" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Цветовое проÑтранÑтво YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Добавить линию" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Добавить точку" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Добавление Ñффектов воды к различным дейÑтвиÑм рабочего Ñтола" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Задержка (в мÑ) между каплÑми дождÑ" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Включить Ð´Ð»Ñ ÐºÑƒÑ€Ñора Ñффекты воды" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "ЛиниÑ" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "МаÑштаб ÑмещениÑ" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Точка" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Задержка дождÑ" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Волны заголовка" # translators: toggle button label #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Переключить дождь" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Включение или отключение Ñффекта дождÑ" # translators: toggle button label #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Переключить ÑтеклоочиÑтитель" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Включение или отключение Ñффекта ÑтеклоочиÑтителÑ" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Эффект воды" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "МаÑштаб ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð²Ð¾Ð´Ñ‹" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Эффект волн в заголовке окна" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Эффект фокуÑировки" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Эффект фокуÑировки окна" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Типы окон Ñ Ñ„Ð¾ÐºÑƒÑом" # Table header 5/5 #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Трение" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Типы окон при захвате" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Разрешение решетки" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Ð˜Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¸Ð²Ñзка окна" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Включить дрожание окна" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Эффект отражениÑ" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Эффект Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð°" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Типы Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð°" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Эффект развертываниÑ" # combo box item #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Минимальный размер решетки" # combo box item #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Минимальный размер решетки на вершинах" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "ПеремеÑтить окна" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Дрожание" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Ð˜Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¸Ð²Ñзка" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "ПривÑзка окон" # Table header 5/5 #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Упругое трение" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "K упругоÑти" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "КонÑтанта упругоÑти" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Переключение привÑзки окон" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "ИÑпользовать модель пружины в Ñффекте вÑзкого окна" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Разрешение решетки на вершинах" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Окна, ÑтановÑщиеÑÑ Ð²Ñзкими при фокуÑе" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Окна, ÑтановÑщиеÑÑ Ð²Ñзкими при захвате" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Окна, ÑтановÑщиеÑÑ Ð²Ñзкими при назначении" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Окна, ÑтановÑщиеÑÑ Ð²Ñзкими при перемещении" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Эффект вÑзкоÑти при развертывании и Ñвертывании окон" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Ð’Ñзкие окна" #~ msgid "Command line 0" #~ msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока 0" #~ msgid "Run command 0" #~ msgstr "Выполнить команду 0" #~ msgid "Screenshot commands" #~ msgstr "Команды Ñнимка Ñкрана" #~ msgid "Screenshot key bindings" #~ msgstr "ГорÑчие клавиши Ñнимка Ñкрана" #~ msgid "Filter Linear" #~ msgstr "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ" #~ msgid "Use linear filter when zoomed in" #~ msgstr "ИÑпользовать линейную фильтрацию при приближении" #~ msgid "Zoom Desktop" #~ msgstr "Изменить маÑштаб рабочего Ñтола" #~ msgid "Zoom In" #~ msgstr "Уменьшить" # combo box item #~ msgid "Zoom Out" #~ msgstr "Увеличить" #~ msgid "Zoom Pan" #~ msgstr "Панорамирование" # combo box item #~ msgid "Zoom Speed" #~ msgstr "СкороÑть Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð°Ñштаба" #~ msgid "Zoom Timestep" #~ msgstr "Квант времени Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð°Ñштаба" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Изменение маÑштаба и Ñдвига куба рабочего Ñтола" # combo box item #~ msgid "Zoom factor" #~ msgstr "КоÑффициент маÑштабированиÑ" #~ msgid "Zoom pan" #~ msgstr "Панорамирование маÑштабированиÑ" #~ msgid "Decrease window opacity" #~ msgstr "Уменьшить прозрачноÑть окна" #~ msgid "Increase window opacity" #~ msgstr "Увеличение прозрачноÑти окна" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Значение прозрачноÑти, Ð´Ð»Ñ Ð¾ÐºÐ¾Ð½ которые должны быть прозрачными по " #~ "умолчанию" #~ msgid "Opacity windows" #~ msgstr "ПрозрачноÑть окон" compiz-0.9.11+14.04.20140409/po/he.po0000644000015301777760000031000312321343002017041 0ustar pbusernogroup00000000000000# Hebrew message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2004 SuSE Linux AG. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-04-24 02:56+0200\n" "Last-Translator: Yotam Benshalom \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=0;\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "שולחן עבודה" # Label text #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "ניהול חלונות" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "קומפיז" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "לל×" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "גלול" # button text #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "הגדל למקסימו×" # button text #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "הרחב למקסימו×" # button text #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "הגבה למקסימו×" # button text #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "מזער" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "העלה" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "תחתון" # Label text #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "תפריט חלון" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "פעולה לביצוע בעת גלילת גלגלת העכבר על שורת הכותרת." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "סוג טשטוש" # Radio button for using an entire (Windows) partition for Linux #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "×טימות חלון פעיל על פי ערכת ×”× ×•×©× ×©×œ Metacity" # Radio button for using an entire (Windows) partition for Linux #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "הצללת ×טימות חלון פעיל על פי ערכת ×”× ×•×©× ×©×œ Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "×טימות ערכת ×”× ×•×©× ×©×œ Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "הצללת ×טימות ערכת ×”× ×•×©× ×©×œ Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "×טימות עבור חלונות ×¤×¢×™×œ×™× ×¢× ×ž×¡×’×¨×•×ª של ערכת ×”× ×•×©× ×©×œ Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "×טימות עבור מסגרות של ערכת ×”× ×•×©× ×©×œ Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "הצללת חלונות ×¤×¢×™×œ×™× ×¢× ×ž×¡×’×¨×•×ª של ערכת ×”× ×•×©× ×©×œ Metacity מ××˜×•× ×œ×©×§×•×£" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "הצללת חלונות ×¢× ×ž×¡×’×¨×•×ª של ערכת ×”× ×•×©× ×©×œ Metacity מ××˜×•× ×œ×©×§×•×£" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "פעולת גלגלת העכבר מעל פס הכותרת" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "סוג טשטוש עבור מסגרות חלון" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "השתמש בערכת ×”× ×•×©× ×©×œ Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "השתמש בערכת ×”× ×•×©× ×©×œ Metacity בעת ציור מסגרות חלון" # button text #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "סגור חלון" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "שחזר גודל חלון" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "הגדל חלון למקסימו×" # button text #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "מזער חלון" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "העבר למעלה" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "נעל במקו×" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "פרוס גלילה" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "בטל העברה למעלה" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "בטל נעילה במקו×" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "החלון \"%s\" ×ינו מגיב." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "סגירה כפויה של ×”×™×™×©×•× ×ª×‘×™× ×œ×ובדן ×©×™× ×•×™×™× ×©×œ× × ×©×ž×¨×•." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_סגור יישו×" # IN #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "ציור הערות" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "צבע מילוי עבור הערות" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "צבע מכחול עבור הערות" # IN #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "התקן ציור הערות" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "× ×§×”" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "צייר" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "צייר בעזרת כלי" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "צבע מילוי עבור הערות" # IN #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "התחל" # IN #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "התחל לצייר הערות" # IN #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "התחל למחוק הערות" # IN #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "התחל מחיקה" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "עובי קו" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "עובי קו עבור הערות" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "צבע מכחול עבור הערות" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "עובי מכחול" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "עובי מכחול עבור הערות" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4 x ביליני×רי" # button text #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "טשטוש ×לפ×" # button text #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "טשטוש ××œ×¤× ×œ×—×œ×•× ×•×ª" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "מסנן טשטוש" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "×טימה בטשטוש" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "רווית טשטוש" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "מהירות טשטוש" # button text #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "טשטוש חלונות" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "טשטוש מ×חורי חלקי חלון שקופי×" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "רווית טשטוש" # button text #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "טשטוש חלונות" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "טשטוש חלונות ×œ× ×ž×ž×•×§×“×™×" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "×ל תטשטש חלקי מסך ×”×ž×•×¡×ª×¨×™× ×¢×œ ידי חלונות ×חרי×." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "שיטת סינון עבור טשטוש" # button text #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "טשטוש מיקוד" # ×× ×™ ×œ× ×‘×˜×•×— למה הכוונה #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "טשטש מיקוד חלונות" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "×’×וס" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "רדיוס ×’×וס" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "עוצמת ×’×וס" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "רדיוס ×’×וס" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "עוצמת ×’×וס" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "×™×™×‘×•× ×¢×¦×ž××™ של טקסטורות" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "הפעלת Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "רמת פירוט Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "רמת הירידה ×œ×¤×¨×˜×™× ×©×œ Mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "הבהוב" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "×פקט הבהוב" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "השתמש ביחידות טקסטורה זמינות על מנת לבצע ×™×™×‘×•× ×¢×¦×ž××™ של טקסטורות רבות ככל " "×”×פשר." # label text, %1 is replaced by a unit value ("MB") # Labels for input fields. "%1" will be replaced with the current unit (MB). #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "מהירות טשטוש חלון" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "חלונות ×¢×œ×™×”× ×™×© להחיל טשטוש מיקוד" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "חלונות ×¢×œ×™×”× ×™×© להחיל טשטוש ××œ×¤× ×›×‘×¨×™×¨×ª מחדל" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "שיבוט פלט" # IN #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "התחל בחירת שיבוט" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "הליך טיפול בפלט משובט" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המזוהה על ידי פקודה0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "צירוף ×ž×§×©×™× ×œ×”×¤×¢×œ×ª פקודת המעטפת המזוהה על ידי פקודה0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "צירוף ×ž×§×©×™× ×œ×”×¤×¢×œ×ª פקודת המעטפת המוגדרת על ידי פקודה1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "צירוף ×ž×§×©×™× ×œ×”×¤×¢×œ×ª פקודת המעטפת המוגדרת על ידי פקודה10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "צירוף ×ž×§×©×™× ×œ×”×¤×¢×œ×ª פקודת המעטפת המוגדרת על ידי פקודה11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "צירוף ×ž×§×©×™× ×œ×”×¤×¢×œ×ª פקודת המעטפת המוגדרת על ידי פקודה2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "צירוף ×ž×§×©×™× ×œ×”×¤×¢×œ×ª פקודת המעטפת המוגדרת על ידי פקודה3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "צירוף ×ž×§×©×™× ×œ×”×¤×¢×œ×ª פקודת המעטפת המוגדרת על ידי פקודה4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "צירוף ×ž×§×©×™× ×œ×”×¤×¢×œ×ª פקודת המעטפת המוגדרת על ידי פקודה5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "צירוף ×ž×§×©×™× ×œ×”×¤×¢×œ×ª פקודת המעטפת המוגדרת על ידי פקודה6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "צירוף ×ž×§×©×™× ×œ×”×¤×¢×œ×ª פקודת המעטפת המוגדרת על ידי פקודה7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "צירוף ×ž×§×©×™× ×œ×”×¤×¢×œ×ª פקודת המעטפת המוגדרת על ידי פקודה8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "צירוף ×ž×§×©×™× ×œ×”×¤×¢×œ×ª פקודת המעטפת המוגדרת על ידי פקודה9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "קצה מסך להפעלת פקודת המעטפת המזוהה על ידי פקודה0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "הקצ×ת צירופי הפעלה לפקודות מוגדרות ×ישית" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "צירופי מקשי עכבר" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "שורת פקודה 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "שורת פקודה 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "שורת פקודה 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "שורת פקודה 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "שורת פקודה 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "שורת פקודה 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "שורת פקודה 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "שורת פקודה 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "שורת פקודה 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "שורת פקודה 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "שורת פקודה 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "שורת פקודה 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "פקודות" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "קצות מסך" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "צירופי מקשי×" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "הרץ פקודה 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "הרץ פקודה 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "הרץ פקודה 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "הרץ פקודה 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "הרץ פקודה 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "הרץ פקודה 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "הרץ פקודה 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "הרץ פקודה 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "הרץ פקודה 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "הרץ פקודה 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "הרץ פקודה 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "הרץ פקודה 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "×”×ª×§× ×™× ×ž×•×¤×¢×œ×™×" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "×ל תנתב חלונות במסך ×ž×œ× ×œ×ž×¤×•×ª ×¤×™×§×¡×œ×™× ×©×ž×—×•×¥ למסך" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "צלצול ניתן לשמיעה" # label text #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "צפצוף מערכת ניתן לשמיעה" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "העל××” ×וטומטית" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "השהייה לפני העל××” ×וטומטית" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "זיהוי ×וומטי של התקני פלט" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "זיהוי ×וטומטי של קצב רענון" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "מיטבי" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "הקלקה למיקוד" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "הקלקה על חלון תעביר ×ליו ×ת מוקד הקלט" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "סגירת חלון פעיל" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "צלמית ברירת מחדל" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "תמונת צלמית ברירת המחדל של חלון" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "גודל שולחן עבודה" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "×–×”×” סוגי פלט" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "×–×”×” קצב עדכון" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "הגדרות תצוגה" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "משך הזמן שבו מצביע העכבר ישהה בקצה המסך לפני הפעלת פעולת קצה מסך." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "השהיית הפעלת קצה מסך" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "מהיר" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "×ופן עליה וקבלת מוקד" # heading text #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "רמת מניעת מיקוד" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "חלונות מונעי מיקוד" # heading text #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "חלונות מונעי מיקוד" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "כפה צביעת פלט עצמ×ית." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "×פשרויות כלליות" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "×פשרויות כלליות של קומפיז" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "טוב" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "הסתרת חלונות ×”× ×¢×“×¨×™× ×ž×©×•×¨×ª המשימות" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "הסתר ×ת כל החלונות וגלה ×ת שולחן העבודה" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "הסתרת החלונות ש××™× × ×ž×•×¤×™×¢×™× ×‘×©×•×¨×ª המשימות בעת כניסה למצב גילוי שולחן עבודה" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "גבוהה" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "גודל ×ופקי וירטו×לי" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "×× × ×™×ª×Ÿ, השתמש בדחיסה עבור טקסטורות שהומרו מתמונות" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "×”×ª×¢×œ× ×ž×¨×ž×–×™× ×›×שר החלון מוגדל למקסימו×" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "×”×ª×¢×œ× ×ž×¨×ž×–×™× ×”× ×•×’×¢×™× ×œ×’×•×“×œ שגוי ול×ספקט ×›×שר החלון מוגדל למקסימו×" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "פסק זמן לפני העל×ת החלונות שנבחרו" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "פסק זמן בין מסרי פינג" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "צירופי מקשי×" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "רמת מניעת גניבת מיקוד" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "ת×ורה" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "רשימת ×”×”×ª×§× ×™× ×”×¤×¢×™×œ×™×" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "רשימת המחרוזות המת×רות התקני פלט" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "נמוכה" # label text #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "הורד חלון" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "הורד חלון ×ל מתחת לחלונות ×חרי×" # button text #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "הרחב ×ת החלון למקסימו×" # button text #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "הגבה ×ת החלון למקסימו×" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "הגדל חלון פעיל למקסימו×" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "הרחב חלון פעיל למקסימו×" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "הגבה חלון פעיל למקסימו×" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "מזער חלון פעיל" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "רגיל" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "מספר שולחנות עבודה" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "מספר שולחנות עבודה וירטו×ליי×" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "כבויה" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "בצע עדכוני מסך רק במשך המחיקות ×”×נכיות" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "פלטי×" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "טיפול בחפיפת פלט" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "צבע כל פלט כשלעצמו, ×פילו ×× ×”×ª×§× ×™ הפלט חופפי×" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "השהיית פינג" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "העדף פלט גדול יותר" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "העדף פלט קטן יותר" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "העלה בעת קליק" # heading text #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "העלה חלון" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "העלה ×ת החלונות שנבחרו ל×חר פסק זמן" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "העלה חלון מעל ליתר החלונות" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "העלה חלונות ×›×שר ×ž×§×œ×™×§×™× ×¢×œ×™×”×" # label text #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "קצב רענון" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "מכפיל גודל מסך עבור גודל וירטו×לי ×ופקי" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "מכפיל גודל מסך עבור גודל וירטו×לי ×× ×›×™" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "גלה שולחן עבודה" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "×נימציה ×יטית" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "מצב ×—×›×" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "סינכרון ×¢× VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "דחיסת טקסטורות" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "מסנן טקסטורות" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "סינון טקסטורות" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "הקצב שבו מתעדכן המסך (פעמי×\\שניה)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "הפעלת\\ניטרול גודל חלון מקסימלי" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "הפעלת\\ניטרול רוחב חלון מקסימלי" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "הפעלת\\ניטרול גובה חלון מקסימלי" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "הפעלת\\ניטרול גלילת חלון" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "הפעלת\\ניטרול גודל חלון פעיל מקסימלי" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "הפעלת\\ניטרול רוחב חלון פעיל מקסימלי" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "הפעלת\\ניטרול גובה חלון פעיל מקסימלי" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "הפעלת\\ניטרול חלון פעיל גלול" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "הפעלת\\ניטרול שימוש ב×נימציה ×יטית" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "שחזר גודל חלון פעיל" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "×ל תעביר חלונות במסך מל×" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "השתמש בפיזור ×ור בעת שינוי צורת מסך" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "גודל ×× ×›×™ וירטו×לי" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "גבוהה מ×וד" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "××™×–×” התקן פלט להעדיף מבין ×”×”×ª×§× ×™× ×”×—×•×¤×¤×™×" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "צירוף ×›×¤×ª×•×¨×™× ×¢×‘×•×¨ תפריט חלון" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "צירוף ×ž×§×©×™× ×¢×‘×•×¨ תפריט חלון" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "×”×צה" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "הת×× ×ª×ž×•× ×”" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "הת×× ×ת תמונת הפ××” העליונה לזווית הסיבוב" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "×”×ª×§×“× ×œ×©×§×•×¤×™×ª הב××”" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "כיפת-רקיע מונפשת" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "הנפש ×ת כיפת הרקיע בעת סיבוב הקוביה" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "מר××”" # IN #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "×וטומטי" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "×ופן" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "צבע הפ××” העליונה והפ××” התחתונה של הקוביה" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "צבע הקצה התחתון של כיפת-הרקיע - רקע הדרגתי כברירת מחדל" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "צבע הקצה העליון של כיפת-הרקיע - רקע הדרגתי כברירת מחדל" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "מכסי הקוביה" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "צבע הקוביה" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "שולחן קוביה" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "×”×צת קיפול" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "מהירות קיפול" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "יחידת זמן קיפול" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "במידת ×”×פשר צור mipmap עבור שינוי ×§× ×” מידה ב×יכות גבוהה" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "חזור לשקופית הקודמת" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "קבצי תמונה" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "תמונה שתשמש כטקסטורה עבור כיפת-הרקיע" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "השתמש בשקיפות הקוביה רק ×× ×”×¡×™×‘×•×‘ בוצע בעזרת העכבר." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "מבט מתוך הקוביה" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "מבט מתוך הקוביה" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "רשימת קבצי SVG ו-PNG שיוצגו על פ×ת הקוביה העליונה" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "מצב פלט מרובה" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "קוביות מרובות" # button text #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "השקופית הב××”" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "קוביה גדולה ×חת" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "×טימות בעת סיבוב" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "×טימות בעת מנוחה" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "×טימות שולחן העבודה בעת סיבוב." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "×טימות שולחן העבודה בעת מנוחה." # button text #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "×ž×§× ×ת החלונות על הקוביה" # label text #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "השקופית הקודמת" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "צייר כיפת-רקיע" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "הת×× ×ת מידות התמונה" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "הת×× ×ת מידות התמונות כדי שתכסינה ×ת פ×ת הקוביה העליונה" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "בחר ×ת ×ופן הצגת הקוביה בעת שימוש ביותר מהתקן פלט ×חד." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "כיפת-רקיע" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "צבע הדרגתי סופי של כיפת-הרקיע" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "צבע הדרגתי התחלי של כיפת-הרקיע" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "תמונת כיפת-הרקיע" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "מהירות" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "יחידת זמן" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "שקיפות רק בעת סיבוב עכבר" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "קוביה שקופה" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "פרוש קיפול" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "פרוש ×ת הקוביה" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus " #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "תשתית בקרת Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "×פשר ייצור mipmap עבור טקסטורות מסגרת" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "פקודה" # button text #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "חלונות מסגרת" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "שורת פקודה עבור צייר מסגרות ש×ותה יש להריץ ×× ×©×•× ×¦×™×™×¨ מסגרות ×ינו פעיל" # Radio button for using an entire (Windows) partition for Linux #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "הסטת X של צל חלון" # Radio button for using an entire (Windows) partition for Linux #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "הסטת Y של צל חלון" # Radio button for using an entire (Windows) partition for Linux #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "צבע צל חלון" # Radio button for using an entire (Windows) partition for Linux #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "שקיפות צל חלון" # Radio button for using an entire (Windows) partition for Linux #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "רדיוס צל חלון" # button text #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "צבע הצל" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "הסטת X של הצל" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "הסטת Y של הצל" # Radio button for using an entire (Windows) partition for Linux #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "×טימות צל" # button text #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "רדיוס צל" # button text #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "חלונות צל" # Label text #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "מסגור חלונות" # Label text #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "מסגרות לחלונות" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "חלונות ×¢×‘×•×¨× ×™×© לצייר מסגרת" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "חלונות ×”××ž×•×¨×™× ×œ×”×˜×™×œ צל" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "בהירות חלונות ש××™× × ×ž×’×™×‘×™× (ב×חוזי×)" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "מהירות קבועה" # header text #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "משך קבוע" # heading text #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "×¢×ž×¢× ×—×œ×•× ×•×ª ש××™× × ×ž×’×™×‘×™×" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "×¢×ž×¢× ×—×œ×•× ×•×ª ש××™× × ×ž×’×™×‘×™× ×œ×”×•×“×¢×•×ª מנהל החלונות" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "מצב עמעו×" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "×¢×ž×¢×•× ×‘×¢×ª מזעור\\פתיחה\\סגירה" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "מהירות עמעו×" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "משך עמעו×" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "×פקט ×¢×ž×¢×•× ×‘×¢×ª ×רועי מזעור, פתיחה וסגירה של חלון" # label text #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "×פקט ×¢×ž×¢×•× ×‘×¢×ª צפצוף מערכת" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "×¢×ž×¢×•× ×¤× ×™×ž×” לחלונות בעת מיפוי ×•×¢×ž×¢×•× ×”×—×•×¦×” לחלונות בעת מחיקה" # button text #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "×¢×ž×¢×•× ×—×œ×•× ×•×ª" # button text #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "×¢×ž×¢×•× ×—×œ×•× ×•×ª" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "פעמון חזותי במסך מל×" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "×פקט ×¢×ž×¢×•× ×‘×ž×¡×š ×ž×œ× ×‘×¢×ª צפצוף מערכת" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "רווית חלונות ש××™× × ×ž×’×™×‘×™× (ב×חוזי×)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "בהירות חלונות ש××™× × ×ž×’×™×‘×™×" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "רווית חלונות ש××™× × ×ž×’×™×‘×™×" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "פעמון חזותי" # label text, %1 is replaced by a unit value ("MB") # Labels for input fields. "%1" will be replaced with the current unit (MB). #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "מצב ×¢×ž×¢×•× ×—×œ×•×Ÿ" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "מהירות ×¢×ž×¢×•× ×—×œ×•×Ÿ במצב \"מהירות קבועה\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "משך ×¢×ž×¢×•× ×—×œ×•×Ÿ במצב \"משך קבוע\" (במילישניות)" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "חלונות ×”××ž×•×¨×™× ×œ×¢×‘×•×¨ עמעו×" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "נקודת עיגון" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "נקודת עיגון" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "מערכת ×§×‘×¦×™× ×‘×ž×¨×—×‘ המשתמש" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "מערכת ×§×‘×¦×™× ×‘×ž×¨×—×‘ המשתמש" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf " #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "תשתית בקרה של Gconf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib " #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "תמיכה בלול××” ר×שית של GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "ת×ימות לגנו×" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "פתח מסוף" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "×פשרויות להבטחת ת×ימות קומפיז לסביבת שולחן העבודה גנו×" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "די×לוג הרץ" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "הרץ פקודת מסוף" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "שורת פקודה ×œ×¦×™×œ×•× ×ž×¡×š" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "הצג תפריט ר×שי" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "הצג די×לוג הרץ יישו×" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "הצג ×ת התפריט הר×שי" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "צור ×¦×™×œ×•× ×ž×¡×š" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "צור ×¦×™×œ×•× ×ž×¡×š של חלון" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "שורת פקודה עבור מסוף" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "שורת פקודה ×œ×¦×™×œ×•× ×ž×¡×š של חלון" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini " #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "תשתית קובץ Ini שטוח" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "התקן הודעות על שינוי בקובץ" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "הודעות" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig " #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "תשתית בקרה של Kconfig" # button text #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "×פקט מזעור" # button text #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "מזעור חלונות" # button text #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "מהירות מזעור" # button text #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "יחידת זמן למזעור" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "התנגדות הצללה" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "התנגדות הצללה" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "שנה ×ת צורת החלונות בעת מזעור ושחזור" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "חלונות שיש לשנות ×ת ×¦×•×¨×ª× ×‘×¢×ª מזעור" # header text #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "מגבלת Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "קו×ורדינטת Y להגבלת משטח העבודה" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "×ל תעדכן ×ת ×ž×™×§×•× ×”×—×œ×•× ×•×ª בצד השרת עד שסיימו לזוז" # button text #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "התחל להזיז חלון" # heading text #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "×ž×™×§×•× 'עצל'" # button text #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "הזזת חלון" # button text #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "הזזת חלון" # button text #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "×טימות" # button text #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "רמת ×טימות של חלונות בתזוזה" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "שחזר ×וטומטית ×ת ×’×•×“×œ× ×©×œ חלונות שהוגדלו ×œ×ž×§×¡×™×ž×•× ×‘×¢×ª גרירה" # button text #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "שחזר חלונות שהוגדלו למקסימו×" # heading text #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "התחל להזיז חלון" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "בהירות" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "הפחת בהירות" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "הגבר בהירות" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "דרגת שינוי בהירות" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "ערכי בהירות לחלונות" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "הפחת" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "הגבר" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "הפחתת ×טימות" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "הגברת ×”×טימות" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "דרגת שינוי ×טימות" # button text #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "ערכי ×טימות לחלונות" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "×טימות, בהירות ורוויה" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "כוונון ×טימות, בהירות ורוויה" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "רווייה" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "הפחתת רווייה" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "הגברת רווייה" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "דרגת שינוי רווייה" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "ערכי רוויה לחלונות" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "דרגת שינוי" # Label text #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "הגדרות לחלונות מוגדרי×" # label text #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "ערכי חלונות" # label text #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "חלונות" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "חלונות בעלי בהירות שונה כברירת מחדל" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "חלונות בעלי ×טימות שונה כברירת מחדל" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "חלונות בעלי רוויה שונה כברירת מחדל" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "××œ×’×•×¨×™×ª× ×œ×§×‘×™×¢×ª ×ž×™×§×•× ×”×—×œ×•×Ÿ" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "דירוג" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "ממורכז" # Label text #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "הצבת חלונות ×‘×ž×™×§×•× ×§×‘×•×¢" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "כפה ×ž×™×§×•× ×¢×œ חלונות" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "מיקומי משטח ×ופקיי×" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "שמור בתוך משטח העבודה" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "שמור ×ת החלונות בתוך משטח העבודה ל×חר מיקו×, ×’× ×× ×™×© ×œ×”×¦×™×‘× ×œ×©× ×›×š ×‘×ž×™×§×•× " "שונה מזה המבוקש" # button text #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "×ž×§× ×—×œ×•× ×•×ª" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "×ž×§× ×œ×¨×•×—×‘ כל התקני הפלט" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "×ž×§× ×—×œ×•× ×•×ª ×‘×ž×§×•× ×”×ž×ª××™× ×‘×¢×ª מיפוי" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "מצב קביעת מיקו×" # heading text #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "חלונות ממוקמי×" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "×קר××™" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "קובע כיצד יש ×œ×ž×§× ×—×œ×•× ×•×ª ×× × ×‘×—×¨ יותר מהתקן פלט ×חד" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "×—×›×" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "השתמש בהתקן פלט פעיל" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "השתמש בהתקן הפלט של החלון הפעיל" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "השתמש בהתקן הפלט ×¢× ×”×¡×ž×Ÿ" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "מיקומי משטח ×× ×›×™×™×" # heading text #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "חלונות ×”×ž×ž×•×§×ž×™× ×¢×œ משטח" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "פתרונות מעקף למיקו×" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "חלונות שיש ×œ×ž×§×ž× ×›×‘×¨×™×¨×ª מחדל" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "חלונות שיש ×œ×ž×§×ž× ×‘×ž×©×˜×— ספציפי כברירת מחדל" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "חלונות שיש ×œ×ž×§×ž× ×‘×›×¤×™×™×”, ×’× ×× ×”× ×ž×‘×§×©×™× ×ž×ž× ×”×œ החלונות ×©×œ× ×œ×¢×©×•×ª ×–×ת." # Label text #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "חלונות בעלי ×ž×™×§×•× ×§×‘×•×¢" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "חלונות בעלי משטח עבודה קבוע" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "מעקפי×" # heading text #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "×ž×™×§×•× ×‘-X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "מיקומי משטח ב-X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "ערכי ×ž×™×§×•× ×‘-X" # heading text #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "×ž×™×§×•× ×‘-Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "מיקומי משטח ב-Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "ערכי ×ž×™×§×•× ×‘-Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "טוען תמונות Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "הת×מה לביטוי רגולרי" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "הת×מת חלונות לביטוי רגולרי" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "צירופי×" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "צבע גבול" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "צבע המסגרת עבור מצבי שינוי הגודל \"קו מת×ר\" ו-\"מרובע\"" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "מצב שינוי גודל" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "ברירת מחדל למצב שינוי גודל חלון" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "צבע מילוי" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "צבע מילוי עבור מצב שינוי גודל \"מרובע\"" # IN #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "התחל לשנות גודל חלון במצב רגיל" # IN #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "התחל לשנות גודל חלון במצב קו מת×ר" # IN #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "התחל לשנות גודל חלון במצב מרובע" # IN #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "התחל לשנות גודל חלון במצב מתיחה" # IN #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "התחל לשנות גודל חלון" # heading text #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "שינוי גודל חלונות במצב רגיל" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "קו מת×ר" # heading text #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "שינוי גודל חלונות במצב קו מת×ר" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "מרובע" # heading text #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "שינוי גודל חלונות במצב מרובע" # heading text #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "שינוי גודל חלון" # heading text #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "שינוי גודל חלון" # heading text #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "התחל לשנות ×ת גודל החלון" # heading text #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "התחל לשנות ×ת גודל החלון על ידי מתיחתו" # heading text #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "התחל לשנות ×ת גודל החלון ב×ופן רגיל" # heading text #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "התחל לשנות ×ת גודל החלון בעזרת קו מת×ר" # heading text #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "התחל לשנות ×ת גודל החלון בעזרת מרובע" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "מתיחה" # heading text #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "שינוי גודל חלונות במתיחה" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "חלונות ×¢×‘×•×¨× ×™×© להשתמש בשינוי גודל רגיל" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "חלונות ×¢×‘×•×¨× ×™×© להשתמש בשינוי גודל בעזרת קו מת×ר" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "חלונות ×¢×‘×•×¨× ×™×© להשתמש בשינוי גודל בעזרת מרובע" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "חלונות ×¢×‘×•×¨× ×™×© להשתמש בשינוי גודל בעזרת מתיחה" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "עלעול בגרירה לקצה מסך" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "עלעול בהזזה לקצה מסך" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "עלעול בהב×ת סמן לקצה מסך" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "משך עלעול" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "עלעל למשטח השמ×לי והקפץ ×ת הסמן" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "עלעל למשטח ×”×‘× ×‘×¢×ª גרירת ×¢×¦× ×œ×§×¦×” המסך" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "עלעל למשטח ×”×‘× ×‘×¢×ª הזזת הסמן לקצה המסך" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "עלעל למשטח ×”×‘× ×‘×¢×ª הזזת חלון לקצה המסך" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "עלעל למשטח הימני והקפץ ×ת הסמן" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "הפוך ×ת ציר Y לצורך הזזת הסמן" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Y הפוך עבור סמן" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "רגישות סמן" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "העלה בעת סיבוב" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "העלה ×ת החלון בעת סיבוב" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "סיבוב קוביה" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "עלעל בסיבוב שמ×לה" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "עלעל בסיבוב ימינה" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "סובב שמ×לה" # heading text #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "סובב שמ×לה ×¢× ×”×—×œ×•×Ÿ" # button text #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "סובב ימינה" # heading text #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "סובב ימינה ×¢× ×”×—×œ×•×Ÿ" # button text #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "סובב ×ל" # heading text #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "סובב ×ל פ××” 1" # heading text #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "סובב ×ל פ××” 1 ×¢× ×”×—×œ×•×Ÿ" # heading text #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "סובב ×ל פ××” 10" # heading text #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "סובב ×ל פ××” 10 ×¢× ×”×—×œ×•×Ÿ" # heading text #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "סובב ×ל פ××” 11" # heading text #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "סובב ×ל פ××” 11 ×¢× ×”×—×œ×•×Ÿ" # heading text #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "סובב ×ל פ××” 12" # heading text #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "סובב ×ל פ××” 12 ×¢× ×”×—×œ×•×Ÿ" # heading text #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "סובב ×ל פ××” 2" # heading text #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "סובב ×ל פ××” 2 ×¢× ×”×—×œ×•×Ÿ" # heading text #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "סובב ×ל פ××” 3" # heading text #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "סובב ×ל פ××” 3 ×¢× ×”×—×œ×•×Ÿ" # heading text #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "סובב ×ל פ××” 4" # heading text #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "סובב ×ל פ××” 4 ×¢× ×”×—×œ×•×Ÿ" # heading text #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "סובב ×ל פ××” 5" # heading text #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "סובב ×ל פ××” 5 ×¢× ×”×—×œ×•×Ÿ" # heading text #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "סובב ×ל פ××” 6" # heading text #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "סובב ×ל פ××” 6 ×¢× ×”×—×œ×•×Ÿ" # heading text #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "סובב ×ל פ××” 7" # heading text #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "סובב ×ל פ××” 7 ×¢× ×”×—×œ×•×Ÿ" # heading text #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "סובב ×ל פ××” 8" # heading text #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "סובב ×ל פ××” 8 ×¢× ×”×—×œ×•×Ÿ" # heading text #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "סובב ×ל פ××” 9" # heading text #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "סובב ×ל פ××” 9 ×¢× ×”×—×œ×•×Ÿ" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "סיבוב קוביה" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "סובב ×ת קובית שולחן העבודה" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "סובב שמ×לה" # heading text #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "סובב שמ×לה וקח ×ת ×ת החלון הפעיל" # button text #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "סובב ימינה" # heading text #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "סובב ימינה וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "סובב לפ×ת הקוביה" # heading text #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "סובב לפ×ת הקוביה ×¢× ×”×—×œ×•×Ÿ" # heading text #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "סובב לפ××” 1" # heading text #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "סובב לפ××” 1 וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "סובב לפ××” 10" # heading text #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "סובב לפ××” 10 וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "סובב לפ××” 11 " # heading text #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "סובב לפ××” 11 וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "סובב לפ××” 12" # heading text #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "סובב לפ××” 12 וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "סובב לפ××” 2" # heading text #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "סובב לפ××” 2 וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "סובב לפ××” 3" # heading text #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "סובב לפ××” 3 וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "סובב לפ××” 4" # heading text #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "סובב לפ××” 4 וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "סובב לפ××” 5" # heading text #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "סובב לפ××” 5 וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "סובב לפ××” 6" # heading text #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "סובב לפ××” 6 וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "סובב לפ××” 7" # heading text #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "סובב לפ××” 7 וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "סובב לפ××” 8" # heading text #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "סובב לפ××” 8 וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "סובב לפ××” 9" # heading text #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "סובב לפ××” 9 וקח ×ת החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "סובב למשטח" # button text #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "סובב חלון" # heading text #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "סובב ×¢× ×”×—×œ×•×Ÿ" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "ת×וצת סיבוב" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "מהירות סיבוב" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "יחידת זמן סיבוב" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "×–×•× ×¡×™×‘×•×‘" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "רגישות תנועת הסמן" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "×פשר הנחת הקוביה על הפ××” התחתונה" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "×פשר הנחת הקוביה על הפ××” העליונה" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "מנוחה על פ××” תחתונה" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "מנוחה על פ××” עליונה" # label text #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "התחל סיבוב" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "פסק זמן לפני עלעול למשטח" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "תקריב" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "×חוז ×”×טימות" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "גדול" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "צירוף הקלקות לשינוי מצב מבט על" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "צירוף ההקלקות משנה ×ת מצב מבט העל ×‘×ž×§×•× ×œ×”×¤×¢×™×œ×• בעת הלחיצה ולנטרלו בעת " "השחרור." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "הקלק על שולחן העבודה כדי להציגו" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "החשך רקע" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "החשך רקע בעת הפעלת מבט על" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "סמלון" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "היכנס למצב הצגת שולחן עבודה ×›×שר ×ž×§×œ×™×§×™× ×¢×œ×™×• בעת מבט על" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "משך ריחוף" # button text #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "הפעל בוחר חלונות" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "הפעל בוחר חלונות עבור כל החלונות" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "הפעל בוחר חלונות עבור קבוצת חלונות" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "הפעל בוחר חלונות עבור חלונות בהתקן הפלט הנוכחי" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "שנה מצב מבט על בעזרת צירוף המקשי×" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "צירוף ×”×ž×§×©×™× ×™×©× ×” ×ת מצב מבט העל ×‘×ž×§×•× ×œ×”×¤×¢×™×œ×• בעת הלחיצה ולנטרלו בעת השחרור." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "סדר ×ת כל החלונות והתחל לשנות ×ת גודל×" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "סדר ×ת החלונות שבקבוצה והתחל לשנות ×ת גודל×" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "סדר ×ת החלונות והתחל לשנות ×ת גודל×" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "סדר ×ת החלונות בהתקן הפלט הנוכחי והתחל לשנות ×ת גודל×" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "בכל התקני הפלט" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "בהתקן הפלט הנוכחי" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "צלמית מודבקת" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "הדבק צלמית על חלונות במבט על" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "מבט על" # button text #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "הצג חלונות במבט על" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "מהירות הפעלת מבט על" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "יחידת זמן של הפעלת מבט על" # button text #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "הצג חלונות במבט על" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "קובע היכן יש להציג חלונות במבט על ×× ×™×© יותר מהתקן פלט ×חד." # button text #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "רווח בין חלונות" # ES #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "ריווח" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "זמן (מילי-שניות) ליצי××” ממבט על כשהסמן מרחף על חלון" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "חלונות שיש ×œ×”×¦×™×’× ×‘×ž×‘×˜ על" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "פתח ×וטומטית צילומי מסך ×‘×™×™×©×•× ×–×”" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "ספריה" # IN #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "הפעל ×¦×™×œ×•× ×ž×¡×š של מרובע" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "שגר יישו×" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "שמור צילומי מסך בספריה זו" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "×¦×™×œ×•× ×ž×¡×š" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "התקן ×¦×™×œ×•× ×ž×¡×š" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg " #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "טוען תמונות Svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "×חוזי בהירות" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "×חוזי רווייה" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "מעביר יישומי×" # IN #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "סיבוב ×וטומטי" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "×”×‘× ×œ×—×–×™×ª" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "×”×‘× ×ת החלון הנבחר לחזית" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "מרחק ×”×–×•× ×©×œ שולחן העבודה בעת העברת חלונות" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "צלמית" # button text #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "ממוזערי×" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "הפ×נל הב×" # button text #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "החלון הב×" # button text #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "החלון ×”×‘× (כל החלונות)" # button text #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "החלון ×”×‘× (×œ×œ× ×—×œ×•× ×•×ª קופצי×)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "הקפץ ×ת המעביר ×× ×”×•× ×ž×•×¡×ª×¨ ובחר ×ת החלון הב×" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "הקפץ ×ת המעביר ×× ×”×•× ×ž×•×¡×ª×¨ ובחר ×ת החלון ×”×‘× ×ž×‘×™×Ÿ כל החלונות" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "הקפץ ×ת המעביר ×× ×”×•× ×ž×•×¡×ª×¨ ובחר ×ת החלון הקוד×" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "הקפץ ×ת המעביר ×× ×”×•× ×ž×•×¡×ª×¨ ובחר ×ת החלון ×”×§×•×“× ×ž×‘×™×Ÿ כל החלונות" # label text #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "הפ×נל הקוד×" # label text #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "חלון קוד×" # label text #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "חלון ×§×•×“× (כל החלונות)" # label text #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "חלון ×§×•×“× (×œ×œ× ×§×•×¤×¦×™×)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "סובב ×ל החלון הנבחר בעת העברה" # button text #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "בחר ×ת חלון הפ×נל הב×." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "בחר ×ת החלון ×”×‘× ×‘×œ×™ להר×ות ×ת החלון הקופץ." # heading text #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "בחר ×ת חלון הפ×נל הקוד×." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "בחר ×ת החלון ×”×§×•×“× ×‘×œ×™ להר×ות ×ת החלון הקופץ." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "הר××” צלמית לצד תמונה מוקטנת" # button text #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "הר××” חלונות ממוזערי×" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "מהירות המעביר" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "יחידת זמן של המעביר" # button text #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "חלונות המעביר" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "חלונות שיש להציג במעביר" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "תמוך בחלל-×¦×‘×¢×™× YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "ניגון ויד×ו" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "ניגון ויד×ו" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "חלל-×¦×‘×¢×™× YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "הוסף שורה" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "הוסף נקודה" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "מוסיף ×פקטי ×ž×™× ×œ×¤×¢×•×œ×•×ª שונות בשולחן העבודה" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "השהייה (במילי-שניות) לפני כל טיפת גש×" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "×פשר ×פקטי ×ž×™× ×œ×¡×ž×Ÿ" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "קו" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "השפעה על הרקע" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "נקודה" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "השהיית טפטוף" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "גל כותרת" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "הורד\\עצור גש×" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "הפעל\\הפסק ×פקט גש×" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "הפעל\\הפסק מגב" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "הפעל\\הפסק ×פקט מגב" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "×פקט מי×" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "השפעת ×”×ž×™× ×¢×œ הרקע מ×חוריה×" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "×פקט גל הבוקע ממסגרת החלון" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "×פקט מיקוד" # label text #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "×פקט מיקוד חלון" # button text #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "מיקוד חלונות" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "חיכוך" # button text #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "תפוס חלונות" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "×בחנת רשת" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "מגנוט הפוך" # button text #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "הרעד ×ת החלון" # label text #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "×פקט מיפוי" # label text #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "×פקט בעת מיפוי החלון" # label text #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "מיפוי חלונות" # label text #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "×פקט הגדלה למקסימו×" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "גודל רשת מזערי" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "גודל מזערי של רשת קודקודי×" # button text #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "הזזת חלונות" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "רעידה" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "מיגנוט הפוך" # button text #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "מיגנוט חלונות" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "חיכוך קפיץ" # ES #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "קבוע קפיץ" # ES #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "קבוע הקפיץ" # button text #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "הפעל\\הפסק מיגנוט חלון" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "השתמש במודל ×§×¤×™×¦×™× ×¢×‘×•×¨ ×פקט חלון מתנדנד" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "×בחנת רשת קודקודי×" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "חלונות ×”××ž×•×¨×™× ×œ×”×ª× ×“× ×“ בעת מיקוד" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "חלונות ×”××ž×•×¨×™× ×œ×”×ª× ×“× ×“ בעת תפיסת×" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "חלונות ×”××ž×•×¨×™× ×œ×”×ª× ×“× ×“ בעת מיפוי×" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "חלונות ×”××ž×•×¨×™× ×œ×”×ª× ×“× ×“ בעת הזזת×" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "×פקט נדנוד בעת הגדלה ×œ×ž×§×¡×™×ž×•× ×•×ž×–×¢×•×¨ חלונות" # label text #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "חלונות מתנדנדי×" #~ msgid "Command line 0" #~ msgstr "שורת פקודה 0" #~ msgid "Run command 0" #~ msgstr "הרץ פקודה 0" #~ msgid "Screenshot commands" #~ msgstr "פקודות ×œ×¦×™×œ×•× ×ž×¡×š" #~ msgid "Screenshot key bindings" #~ msgstr "צירופי ×ž×§×©×™× ×œ×¦×™×œ×•× ×ž×¡×š" #~ msgid "Filter Linear" #~ msgstr "פילטר לינ×רי" #~ msgid "Use linear filter when zoomed in" #~ msgstr "השתמש בפילטר לינ×רי בזמן תקריב הגדלה" #~ msgid "Zoom Desktop" #~ msgstr "תקריב" #~ msgid "Zoom In" #~ msgstr "תקריב הגדלה" #~ msgid "Zoom Out" #~ msgstr "תקריב הקטנה" #~ msgid "Zoom Pan" #~ msgstr "הטיית תקריב" #~ msgid "Zoom Speed" #~ msgstr "מהירות תקריב" #~ msgid "Zoom Timestep" #~ msgstr "יחידת זמן לתקריב" #~ msgid "Zoom and pan desktop cube" #~ msgstr "תקריב והטיה ×ל קובית שולחן העבודה" #~ msgid "Zoom factor" #~ msgstr "×ž×§×“× ×ª×§×¨×™×‘" #~ msgid "Zoom pan" #~ msgstr "הטיית תקריב" # Radio button for using an entire (Windows) partition for Linux #~ msgid "Decrease window opacity" #~ msgstr "הפחתת ×טימות החלון" #~ msgid "Increase window opacity" #~ msgstr "הגבר ×טימות חלון" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "ערכי ×טימות לחלונות ×”×©×§×•×¤×™× ×›×‘×¨×™×¨×ª מחדל" #~ msgid "Opacity window values" #~ msgstr "ערכי ×טימות חלון" # button text #~ msgid "Opacity windows" #~ msgstr "חלונות ×טימות" #~ msgid "Background Images" #~ msgstr "תמונות רקע" #~ msgid "Background images" #~ msgstr "תמונות רקע" # button text #~ msgid "Place windows on a plane" #~ msgstr "הצב חלונות על מישור" # button text #~ msgid "Plane Down" #~ msgstr "מישור למטה" # button text #~ msgid "Plane Left" #~ msgstr "מישור שמ×לה" # button text #~ msgid "Plane Right" #~ msgstr "מישור ימינה" # heading text #~ msgid "Plane To Face 1" #~ msgstr "מישור לפ××” 1" # heading text #~ msgid "Plane To Face 10" #~ msgstr "מישור לפ××” 10" # heading text #~ msgid "Plane To Face 11" #~ msgstr "מישור לפ××” 11" # heading text #~ msgid "Plane To Face 12" #~ msgstr "מישור לפ××” 12" # heading text #~ msgid "Plane To Face 2" #~ msgstr "מישור לפ××” 2" # heading text #~ msgid "Plane To Face 3" #~ msgstr "מישור לפ××” 3" # heading text #~ msgid "Plane To Face 4" #~ msgstr "מישור לפ××” 4" # heading text #~ msgid "Plane To Face 5" #~ msgstr "מישור לפ××” 5" # heading text #~ msgid "Plane To Face 6" #~ msgstr "מישור לפ××” 6" # heading text #~ msgid "Plane To Face 7" #~ msgstr "מישור לפ××” 7" # heading text #~ msgid "Plane To Face 8" #~ msgstr "מישור לפ××” 8" # heading text #~ msgid "Plane To Face 9" #~ msgstr "מישור לפ××” 9" # button text #~ msgid "Plane Up" #~ msgstr "מישור למעלה" # button text #~ msgid "Plane down" #~ msgstr "מישור למטה" # button text #~ msgid "Plane left" #~ msgstr "מישור שמ×לה" # button text #~ msgid "Plane right" #~ msgstr "מישור ימינה" # heading text #~ msgid "Plane to face 1" #~ msgstr "מישור לפ××” 1" # heading text #~ msgid "Plane to face 10" #~ msgstr "מישור לפ××” 10" # heading text #~ msgid "Plane to face 11" #~ msgstr "מישור לפ××” 11" # heading text #~ msgid "Plane to face 12" #~ msgstr "מישור לפ××” 12" # heading text #~ msgid "Plane to face 2" #~ msgstr "מישור לפ××” 2" # heading text #~ msgid "Plane to face 3" #~ msgstr "מישור לפ××” 3" # heading text #~ msgid "Plane to face 4" #~ msgstr "מישור לפ××” 4" # heading text #~ msgid "Plane to face 5" #~ msgstr "מישור לפ××” 5" # heading text #~ msgid "Plane to face 6" #~ msgstr "מישור לפ××” 6" # heading text #~ msgid "Plane to face 7" #~ msgstr "מישור לפ××” 7" # heading text #~ msgid "Plane to face 8" #~ msgstr "מישור לפ××” 8" # heading text #~ msgid "Plane to face 9" #~ msgstr "מישור לפ××” 9" # button text #~ msgid "Plane up" #~ msgstr "מישור למעלה" # Label text #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "חלונות השתמשה" #, fuzzy #~ msgid "Notification" #~ msgstr "פעולה" #~ msgid "Unknown" #~ msgstr "×œ× ×™×“×•×¢" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "×ורך" # Radio button for using an entire (Windows) partition for Linux #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "&מחק ×ת חלונות לגמרי" # heading text #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "שינוי גודל נכשל." #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "פעולה" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "×יות" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "&בחינה" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "רוסית" # label text #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "חלונות" # button text #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&כווץ ×ת חלונות" # button text #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&כווץ ×ת חלונות" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "פעולה" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "&בחינה" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "זמן מקומי" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "זמן מקומי" # button text #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "&מחק ×ת חלונות" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "פעולה" # ES #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ספרד" # label text, %1 is replaced by a unit value ("MB") # Labels for input fields. "%1" will be replaced with the current unit (MB). #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "חלונות פנוי (%1)" # label text, %1 is replaced by a unit value ("MB") # Labels for input fields. "%1" will be replaced with the current unit (MB). #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "חלונות פנוי (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "×יות" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "&בחינה" # heading text #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "שינוי גודל נכשל." #, fuzzy #~ msgid "Command line %d" #~ msgstr "פקודה:" #, fuzzy #~ msgid "Run command %d" #~ msgstr "פקודה:" #, fuzzy #~ msgid "Corners" #~ msgstr "ממירי×" # Radio button for using an entire (Windows) partition for Linux # button text # heading text # Label text # label text # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time # ES # label text, %1 is replaced by a unit value ("MB") # Labels for input fields. "%1" will be replaced with the current unit (MB). #, fuzzy #~ msgid "Terminate" #~ msgstr "טרמינלי×" compiz-0.9.11+14.04.20140409/images/0000755000015301777760000000000012321344021016741 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/images/icon.png0000644000015301777760000000102112321343002020367 0ustar pbusernogroup00000000000000‰PNG  IHDR00Wù‡sBIT|dˆtEXtSoftwarewww.inkscape.org›î<£IDAThí™AjÃ0E¿%¡†˜”ž£·(ô½@—%7(]…®½ñ¶'Èz2…¤‘gº°dã¸n U&èÁ {ñ¿¿$ K13$£c ø+â (ËòÕ9÷FD󨂯 µÞcÖ«ÕêÌŒ¢(vÖZ–‚µ–‹¢Ø1sͳ,ÃãË\UÅ~ÁƒÌ¦Ÿå3šÑb›‹lGÕ/ÐZµ®[–ùÍ¿Š9­ Ü.¤€2°@GÛÀÝ2Óeo-ôäDD„§‡ûtDtì·`!»p 0³!)„:E&’ˆM+p}½dzHC()ؤb ~ ¹žï@÷Æ%sCH DA¤ñ“8äzHßHˆBâù’؈7`€úÜu»ÝÎó<­gÖZh­÷€7`ŒYo6qÝ †–NUÿž˜ùvŠÚtS“Né š_ÈMËA‘¯Ê·Î÷]P{_Ÿ:h ÇŒòÂS}â›çúæW×@häàÅTÌ * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "decorator.h" #include "options.h" #include "utils.h" #include "kwinadaptor.h" #include const unsigned int ROOT_OFF_X = 8192; const unsigned int ROOT_OFF_Y = 8192; const unsigned short BLUR_TYPE_NONE = 0; const unsigned short BLUR_TYPE_TITLEBAR = 1; const unsigned short BLUR_TYPE_ALL = 2; static const float SHADOW_RADIUS = 8.0f; static const float SHADOW_OPACITY = 0.5f; static const unsigned short SHADOW_OFFSET_X = 1; static const unsigned short SHADOW_OFFSET_Y = 1; #define SHADOW_COLOR_RED 0x0000 #define SHADOW_COLOR_GREEN 0x0000 #define SHADOW_COLOR_BLUE 0x0000 static const char *KDED_SERVICE = "org.kde.kded"; static const char *KDED_APPMENU_PATH = "/modules/appmenu"; static const char *KDED_INTERFACE = "org.kde.kded"; int blurType = BLUR_TYPE_NONE; decor_shadow_t *KWD::Decorator::mNoBorderShadow = 0; KWD::PluginManager *KWD::Decorator::mPlugins = 0; KWD::Options *KWD::Decorator::mOptions = 0; NETRootInfo *KWD::Decorator::mRootInfo; WId KWD::Decorator::mActiveId; decor_shadow_options_t KWD::Decorator::mActiveShadowOptions; decor_shadow_options_t KWD::Decorator::mInactiveShadowOptions; KWD::Window *KWD::Decorator::mDecorNormal = NULL; KWD::Window *KWD::Decorator::mDecorActive = NULL; KWD::Decorator *KWD::Decorator::mSelf = NULL; struct _cursor cursors[3][3] = { { C (top_left_corner), C (top_side), C (top_right_corner) }, { C (left_side), C (left_ptr), C (right_side) }, { C (bottom_left_corner), C (bottom_side), C (bottom_right_corner) } }; KWD::PluginManager::PluginManager (KSharedConfigPtr config): KWD::KDecorationPlugins (config) { if (QPixmap::defaultDepth () > 8) defaultPlugin = "kwin3_oxygen"; else defaultPlugin = "kwin3_plastik"; } KWD::Decorator::Decorator () : KApplication (), mConfig (0), mCompositeWindow (0), mSwitcher (0) { XSetWindowAttributes attr; int i, j; mSelf = this; mRootInfo = new NETRootInfo (QX11Info::display (), 0); mActiveId = 0; KConfigGroup cfg (KSharedConfig::openConfig ("plasmarc"), QString ("Theme")); Plasma::Theme::defaultTheme ()->setThemeName (cfg.readEntry ("name")); Atoms::init (); new KWinAdaptor (this); mConfig = new KConfig ("kwinrc"); mOptions = new KWD::Options (mConfig); mPlugins = new PluginManager (KSharedConfig::openConfig ("kwinrc")); mActiveShadowOptions.shadow_radius = SHADOW_RADIUS; mActiveShadowOptions.shadow_opacity = SHADOW_OPACITY; mActiveShadowOptions.shadow_offset_x = SHADOW_OFFSET_X; mActiveShadowOptions.shadow_offset_y = SHADOW_OFFSET_Y; mActiveShadowOptions.shadow_color[0] = SHADOW_COLOR_RED; mActiveShadowOptions.shadow_color[1] = SHADOW_COLOR_GREEN; mActiveShadowOptions.shadow_color[2] = SHADOW_COLOR_BLUE; mInactiveShadowOptions.shadow_radius = SHADOW_RADIUS; mInactiveShadowOptions.shadow_opacity = SHADOW_OPACITY; mInactiveShadowOptions.shadow_offset_x = SHADOW_OFFSET_X; mInactiveShadowOptions.shadow_offset_y = SHADOW_OFFSET_Y; mInactiveShadowOptions.shadow_color[0] = SHADOW_COLOR_RED; mInactiveShadowOptions.shadow_color[1] = SHADOW_COLOR_GREEN; mInactiveShadowOptions.shadow_color[2] = SHADOW_COLOR_BLUE; updateShadowProperties (QX11Info::appRootWindow ()); for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { if (cursors[i][j].shape != XC_left_ptr) cursors[i][j].cursor = XCreateFontCursor (QX11Info::display (), cursors[i][j].shape); } } attr.override_redirect = True; mCompositeWindow = XCreateWindow (QX11Info::display (), QX11Info::appRootWindow (), -ROOT_OFF_X, -ROOT_OFF_Y, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect, &attr); long data = 1; XChangeProperty (QX11Info::display(), mCompositeWindow, Atoms::enlightmentDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1); XCompositeRedirectSubwindows (QX11Info::display (), mCompositeWindow, CompositeRedirectManual); XMapWindow (QX11Info::display (), mCompositeWindow); QDBusConnection dbus = QDBusConnection::sessionBus (); dbus.connect (KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "showRequest", this, SIGNAL (showRequest (qulonglong))); dbus.connect (KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "menuAvailable", this, SLOT (menuAvailable (qulonglong))); dbus.connect (KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "clearMenus", this, SLOT (clearMenus ())); dbus.connect (KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "menuHidden", this, SIGNAL (menuHidden ())); } KWD::Decorator::~Decorator (void) { QMap ::ConstIterator it; for (it = mClients.begin (); it != mClients.end (); ++it) delete (*it); if (mDecorNormal) delete mDecorNormal; if (mDecorActive) delete mDecorActive; if (mSwitcher) delete mSwitcher; XDestroyWindow (QX11Info::display (), mCompositeWindow); delete mOptions; delete mPlugins; delete mConfig; delete mRootInfo; } bool KWD::Decorator::enableDecorations (Time timestamp) { QList ::ConstIterator it; unsigned int nchildren; WId *children; WId root, parent; long int select; mDmSnTimestamp = timestamp; if (!pluginManager ()->loadPlugin ("")) return false; updateAllShadowOptions (); KWD::trapXError (); (void) QApplication::desktop (); // trigger creation of desktop widget KWD::popXError (); updateShadow (); /* FIXME: Implement proper decoration lists and remove this */ mDecorNormal = new KWD::Window (mCompositeWindow, QX11Info::appRootWindow (), 0, Window::Default); mDecorActive = new KWD::Window (mCompositeWindow, QX11Info::appRootWindow (), 0, Window::DefaultActive); mActiveId = KWindowSystem::activeWindow (); connect (KWindowSystem::self (), SIGNAL (windowAdded (WId)), SLOT (handleWindowAdded (WId))); connect (KWindowSystem::self (), SIGNAL (windowRemoved (WId)), SLOT (handleWindowRemoved (WId))); connect (KWindowSystem::self (), SIGNAL (activeWindowChanged (WId)), SLOT (handleActiveWindowChanged (WId))); connect (KWindowSystem::self (), SIGNAL (windowChanged (WId, const unsigned long *)), SLOT (handleWindowChanged (WId, const unsigned long *))); foreach (WId id, KWindowSystem::windows ()) handleWindowAdded (id); /* Find the switcher and add it too * FIXME: Doing XQueryTree and then * XGetWindowProperty on every window * like this is really expensive, surely * there is a better way to do this */ XQueryTree (QX11Info::display (), QX11Info::appRootWindow (), &root, &parent, &children, &nchildren); for (unsigned int i = 0; i < nchildren; ++i) { if (KWD::readWindowProperty (children[i], Atoms::switchSelectWindow, &select)) { handleWindowAdded(children[i]); break; } } connect (Plasma::Theme::defaultTheme (), SIGNAL (themeChanged ()), SLOT (plasmaThemeChanged ())); // select for client messages XSelectInput (QX11Info::display (), QX11Info::appRootWindow (), SubstructureNotifyMask | StructureNotifyMask | PropertyChangeMask); return true; } void KWD::Decorator::updateAllShadowOptions (void) { updateShadowProperties (QX11Info::appRootWindow ()); } void KWD::Decorator::changeShadowOptions (decor_shadow_options_t *aopt, decor_shadow_options_t *iopt) { bool changed = false; if (memcmp (aopt, &mActiveShadowOptions, sizeof (decor_shadow_options_t))) { mActiveShadowOptions = *aopt; changed = true; } if (memcmp (aopt, &mInactiveShadowOptions, sizeof (decor_shadow_options_t))) { mInactiveShadowOptions = *iopt; changed = true; } if (changed) updateShadow (); } void KWD::Decorator::updateShadow (void) { Display *xdisplay = QX11Info::display (); Screen *xscreen; decor_context_t context; xscreen = ScreenOfDisplay (xdisplay, QX11Info::appScreen ()); if (mNoBorderShadow) decor_shadow_destroy (xdisplay, mNoBorderShadow); mNoBorderShadow = decor_shadow_create (xdisplay, xscreen, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, &mActiveShadowOptions, &context, decor_draw_simple, 0); if (mNoBorderShadow) { decor_extents_t extents = { 0, 0, 0, 0 }; long *data; unsigned int n = 1, frame_type = 0, frame_state = 0, frame_actions = 0; decor_quad_t quads[N_QUADS_MAX]; int nQuad; decor_layout_t layout; decor_get_default_layout (&context, 1, 1, &layout); nQuad = decor_set_lSrStSbS_window_quads (quads, &context, &layout); data = decor_alloc_property (n, WINDOW_DECORATION_TYPE_PIXMAP); decor_quads_to_property (data, n - 1, mNoBorderShadow->pixmap, &extents, &extents, &extents, &extents, 0, 0, quads, nQuad, frame_type, frame_state, frame_actions); KWD::trapXError (); XChangeProperty (QX11Info::display (), QX11Info::appRootWindow (), Atoms::netWindowDecorBare, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); KWD::popXError (); free (data); } } void KWD::Decorator::updateShadowProperties (WId id) { int nItems; long *data; double aradius, aopacity; int axOffset, ayOffset; double iradius, iopacity; int ixOffset, iyOffset; QVector shadowColor; if (id != QX11Info::appRootWindow ()) return; void *propData = KWD::readXProperty (id, Atoms::compizShadowInfo, XA_INTEGER, &nItems); if (nItems != 4) return; data = reinterpret_cast (propData); aradius = data[0]; aopacity = data[1]; /* We multiplied by 1000 in compiz to keep * precision, now divide by that much */ aradius /= 1000; aopacity /= 1000; axOffset = data[2]; ayOffset = data[3]; iradius = data[4]; iopacity = data[5]; /* We multiplied by 1000 in compiz to keep * precision, now divide by that much */ iradius /= 1000; iopacity /= 1000; ixOffset = data[6]; iyOffset = data[7]; shadowRadiusChanged (aradius, iradius); shadowOpacityChanged (aopacity, iopacity); shadowXOffsetChanged (axOffset, ixOffset); shadowYOffsetChanged (ayOffset, iyOffset); shadowColor = KWD::readPropertyString (id, Atoms::compizShadowColor); if (shadowColor.size () == 2) shadowColorChanged (shadowColor.at (0), shadowColor.at (1)); XFree (propData); } bool KWD::Decorator::x11EventFilter (XEvent *xevent) { KWD::Window *client; int status; switch (xevent->type) { case ConfigureNotify: { XConfigureEvent *xce = reinterpret_cast (xevent); if (mFrames.contains (xce->window)) mFrames[xce->window]->updateFrame (xce->window); } break; case SelectionRequest: decor_handle_selection_request (QX11Info::display (), xevent, mDmSnTimestamp); break; case SelectionClear: status = decor_handle_selection_clear (QX11Info::display (), xevent, 0); if (status == DECOR_SELECTION_GIVE_UP) KApplication::exit (0); break; case CreateNotify: /* We only care about windows that aren't managed here */ if (!KWindowSystem::hasWId (xevent->xcreatewindow.window)) { WId select; KWD::trapXError (); XSelectInput (QX11Info::display (), xevent->xcreatewindow.window, StructureNotifyMask | PropertyChangeMask); KWD::popXError (); if (KWD::readWindowProperty (xevent->xcreatewindow.window, Atoms::switchSelectWindow, (long *) &select)) handleWindowAdded (xevent->xcreatewindow.window); } case PropertyNotify: if (xevent->xproperty.atom == Atoms::netInputFrameWindow) { handleWindowAdded (xevent->xproperty.window); } else if (xevent->xproperty.atom == Atoms::netOutputFrameWindow) { handleWindowAdded (xevent->xproperty.window); } else if (xevent->xproperty.atom == Atoms::compizShadowInfo || xevent->xproperty.atom == Atoms::compizShadowColor) { updateShadowProperties (xevent->xproperty.window); } else if (xevent->xproperty.atom == Atoms::switchSelectWindow) { WId id = xevent->xproperty.window; if (!mSwitcher || mSwitcher->xid () != id) handleWindowAdded (id); mSwitcher->update (); } else if (xevent->xproperty.atom == Atoms::netWmWindowOpacity) { if (mClients.contains (xevent->xproperty.window)) mClients[xevent->xproperty.window]->updateOpacity (); } break; case EnterNotify: { XCrossingEvent *xce = reinterpret_cast (xevent); QWidget *child; if (!mFrames.contains (xce->window)) break; client = mFrames[xce->window]; if (!client->decorWidget ()) break; child = client->childAt (xce->x, xce->y); if (child) { QEvent qe (QEvent::Enter); QApplication::sendEvent (child, &qe); client->setActiveChild (child); client->updateCursor (QPoint (xce->x, xce->y)); } } break; case LeaveNotify: { XCrossingEvent *xce = reinterpret_cast (xevent); if (mFrames.contains (xce->window)) { QEvent qe (QEvent::Leave); client = mFrames[xce->window]; if (client->activeChild ()) QApplication::sendEvent (client->activeChild (), &qe); XUndefineCursor (QX11Info::display (), client->frameId ()); } } break; case MotionNotify: { XMotionEvent *xme = reinterpret_cast (xevent); QWidget *child; if (!mFrames.contains (xme->window)) break; client = mFrames[xme->window]; if (!client->decorWidget ()) break; child = client->childAt (xme->x, xme->y); if (child) { QPoint qp (xme->x, xme->y); if (child != client->activeChild ()) { QEvent qee (QEvent::Enter); QEvent qle (QEvent::Leave); if (client->activeChild ()) QApplication::sendEvent (client->activeChild (), &qle); QApplication::sendEvent (child, &qee); client->setActiveChild (child); } if (client->decorWidget () != child) qp = child->mapFrom (client->decorWidget (), qp); QMouseEvent qme (QEvent::MouseMove, qp, Qt::NoButton, Qt::NoButton, Qt::NoModifier); QApplication::sendEvent (child, &qme); client->updateCursor (QPoint (xme->x, xme->y)); } } break; case ButtonPress: case ButtonRelease: { XButtonEvent *xbe = reinterpret_cast (xevent); QWidget *child; if (!mFrames.contains (xbe->window)) break; client = mFrames[xbe->window]; if (!client->decorWidget ()) break; child = client->childAt (xbe->x, xbe->y); if (child) { XButtonEvent xbe2 = *xbe; xbe2.window = child->winId (); QPoint p; p = client->mapToChildAt (QPoint (xbe->x, xbe->y)); xbe2.x = p.x (); xbe2.y = p.y (); p = child->mapToGlobal(p); xbe2.x_root = p.x (); xbe2.y_root = p.y (); client->setFakeRelease (false); QApplication::x11ProcessEvent ((XEvent *) &xbe2); /* We won't get a button release event, because of the screengrabs in compiz */ if (client->getFakeRelease () && xevent->type == ButtonPress) { xbe2.type = ButtonRelease; QApplication::x11ProcessEvent ((XEvent *) &xbe2); } return true; } } break; case ClientMessage: if (xevent->xclient.message_type == Atoms::toolkitActionAtom) { unsigned long action; action = xevent->xclient.data.l[0]; if (action == Atoms::toolkitActionWindowMenuAtom) { if (mClients.contains (xevent->xclient.window)) { QPoint pos; client = mClients[xevent->xclient.window]; if (xevent->xclient.data.l[2]) { pos = QPoint (xevent->xclient.data.l[3], xevent->xclient.data.l[4]); } else { pos = client->clientGeometry ().topLeft (); } client->showWindowMenu (pos); } } else if (action == Atoms::toolkitActionForceQuitDialogAtom) { if (mClients.contains (xevent->xclient.window)) { Time timestamp = xevent->xclient.data.l[1]; client = mClients[xevent->xclient.window]; if (xevent->xclient.data.l[2]) client->showKillProcessDialog (timestamp); else client->hideKillProcessDialog (); } } } break; default: break; } return KApplication::x11EventFilter (xevent); } void KWD::Decorator::reconfigure (void) { unsigned long changed; mConfig->reparseConfiguration (); changed = mOptions->updateSettings (); if (mPlugins->reset (changed)) { QMap < WId, KWD::Window * >::ConstIterator it; updateShadow (); mDecorNormal->reloadDecoration (); mDecorActive->reloadDecoration (); for (it = mClients.constBegin (); it != mClients.constEnd (); ++it) it.value ()->reloadDecoration (); mPlugins->destroyPreviousPlugin (); } } void KWD::Decorator::handleWindowAdded (WId id) { QMap ::ConstIterator it; KWD::Window *client = 0; WId select, frame = 0; WId oframe = 0, iframe = 0; KWD::Window::Type type = KWD::Window::Normal; QWidgetList widgets; QRect geometry; /* avoid adding any of our own top level windows */ foreach (QWidget *widget, QApplication::topLevelWidgets ()) { if (widget->winId () == id) return; } if (KWD::readWindowProperty (id, Atoms::switchSelectWindow, (long *) &select)) { if (!mSwitcher) mSwitcher = new Switcher (mCompositeWindow, id); if (mSwitcher->xid () != id) { delete mSwitcher; mSwitcher = new Switcher (mCompositeWindow, id); } geometry = mSwitcher->geometry (); frame = None; } else { KWindowInfo wInfo; KWD::trapXError (); wInfo = KWindowSystem::windowInfo (id, NET::WMGeometry); if (KWD::popXError ()) return; if (!wInfo.valid ()) return; KWD::readWindowProperty (id, Atoms::netInputFrameWindow, (long *) &iframe); KWD::readWindowProperty (id, Atoms::netOutputFrameWindow, (long *) &oframe); geometry = wInfo.geometry (); wInfo = KWindowSystem::windowInfo (id, NET::WMWindowType, 0); switch (wInfo.windowType (~0)) { case NET::Normal: case NET::Dialog: case NET::Toolbar: case NET::Menu: case NET::Utility: case NET::Splash: case NET::Unknown: /* decorate these window types */ break; default: return; } if (iframe) { type = KWD::Window::Normal; frame = iframe; } else { type = KWD::Window::Normal2D; frame = oframe; } } KWD::trapXError (); XSelectInput (QX11Info::display (), id, StructureNotifyMask | PropertyChangeMask); KWD::popXError (); if (frame) { XWindowAttributes attr; KWD::trapXError (); XGetWindowAttributes (QX11Info::display (), frame, &attr); if (KWD::popXError ()) frame = None; } if (frame) { if (!mClients.contains (id)) { client = new KWD::Window (mCompositeWindow, id, frame, type, geometry); mClients.insert (id, client); mFrames.insert (frame, client); } else { client = mClients[id]; mFrames.remove (client->frameId ()); mFrames.insert (frame, client); client->updateFrame (frame); } if (mWindowsMenu.removeOne (id)) mClients[id]->setAppMenuAvailable (); } else { if (mClients.contains (id)) client = mClients[id]; if (client) { mClients.remove (client->windowId ()); mFrames.remove (client->frameId ()); delete client; } } } void KWD::Decorator::handleWindowRemoved (WId id) { KWD::Window *window = 0; if (mClients.contains (id)) window = mClients[id]; else if (mFrames.contains (id)) window = mFrames[id]; if (window) { mClients.remove (window->windowId ()); mFrames.remove (window->frameId ()); delete window; } if (mSwitcher && mSwitcher->xid () == id) { delete mSwitcher; mSwitcher = NULL; } } void KWD::Decorator::handleActiveWindowChanged (WId id) { if (id != mActiveId) { KWD::Window *newActiveWindow = 0; KWD::Window *oldActiveWindow = 0; if (mClients.contains (id)) newActiveWindow = mClients[id]; if (mClients.contains (mActiveId)) oldActiveWindow = mClients[mActiveId]; mActiveId = id; if (oldActiveWindow) oldActiveWindow->handleActiveChange (); if (newActiveWindow) newActiveWindow->handleActiveChange (); } } void KWD::Decorator::handleWindowChanged (WId id, const unsigned long *properties) { KWD::Window *client; if (mSwitcher && mSwitcher->xid () == id) { if (properties[0] & NET::WMGeometry) mSwitcher->updateGeometry (); return; } if (!mClients.contains (id)) return; client = mClients[id]; if (properties[0] & NET::WMName) client->updateName (); if (properties[0] & NET::WMVisibleName) client->updateName (); if (properties[0] & NET::WMState) client->updateState (); if (properties[0] & NET::WMIcon) client->updateIcons (); if (properties[0] & NET::WMGeometry) client->updateWindowGeometry (); } void KWD::Decorator::sendClientMessage (WId eventWid, WId wid, Atom atom, Atom value, long data1, long data2, long data3) { XEvent ev; long mask = 0; memset (&ev, 0, sizeof (ev)); ev.xclient.type = ClientMessage; ev.xclient.window = wid; ev.xclient.message_type = atom; ev.xclient.format = 32; ev.xclient.data.l[0] = value; ev.xclient.data.l[1] = QX11Info::appTime (); ev.xclient.data.l[2] = data1; ev.xclient.data.l[3] = data2; ev.xclient.data.l[4] = data3; if (eventWid == QX11Info::appRootWindow ()) mask = SubstructureRedirectMask | SubstructureNotifyMask; KWD::trapXError (); XSendEvent (QX11Info::display (), eventWid, false, mask, &ev); KWD::popXError (); } void KWD::Decorator::shadowRadiusChanged (double value_active, double value_inactive) { decor_shadow_options_t aopt = *activeShadowOptions (); decor_shadow_options_t iopt = *inactiveShadowOptions (); aopt.shadow_radius = value_active; iopt.shadow_radius = value_inactive; changeShadowOptions (&aopt, &iopt); } void KWD::Decorator::shadowOpacityChanged (double value_active, double value_inactive) { decor_shadow_options_t aopt = *activeShadowOptions (); decor_shadow_options_t iopt = *inactiveShadowOptions (); aopt.shadow_opacity = value_active; iopt.shadow_opacity = value_inactive; changeShadowOptions (&aopt, &iopt); } void KWD::Decorator::shadowXOffsetChanged (int value_active, int value_inactive) { decor_shadow_options_t aopt = *activeShadowOptions (); decor_shadow_options_t iopt = *inactiveShadowOptions (); aopt.shadow_offset_x = value_active; iopt.shadow_offset_x = value_inactive; changeShadowOptions (&aopt, &iopt); } void KWD::Decorator::shadowYOffsetChanged (int value_active, double value_inactive) { decor_shadow_options_t aopt = *activeShadowOptions (); decor_shadow_options_t iopt = *inactiveShadowOptions (); aopt.shadow_offset_y = value_active; iopt.shadow_offset_y = value_inactive; changeShadowOptions (&aopt, &iopt); } void KWD::Decorator::shadowColorChanged (QString value_active, QString value_inactive) { decor_shadow_options_t aopt = *activeShadowOptions (); decor_shadow_options_t iopt = *inactiveShadowOptions (); int c[4]; if (sscanf (value_active.toAscii ().data (), "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4) { aopt.shadow_color[0] = c[0] << 8 | c[0]; aopt.shadow_color[1] = c[1] << 8 | c[1]; aopt.shadow_color[2] = c[2] << 8 | c[2]; } if (sscanf (value_inactive.toAscii ().data (), "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4) { iopt.shadow_color[0] = c[0] << 8 | c[0]; iopt.shadow_color[1] = c[1] << 8 | c[1]; iopt.shadow_color[2] = c[2] << 8 | c[2]; } changeShadowOptions (&aopt, &iopt); } void KWD::Decorator::plasmaThemeChanged () { if (mSwitcher) { WId win = mSwitcher->xid (); delete mSwitcher; mSwitcher = new Switcher (mCompositeWindow, win); } } void KWD::Decorator::showRequest (qulonglong id) { if (mClients.contains (id)) mClients[id]->emitShowRequest (); } void KWD::Decorator::menuAvailable (qulonglong id) { if (mClients.contains (id)) mClients[id]->setAppMenuAvailable (); else mWindowsMenu.append (id); } void KWD::Decorator::clearMenus () { QMap < WId, KWD::Window * >::ConstIterator it; for (it = mClients.constBegin (); it != mClients.constEnd (); ++it) it.value ()->setAppMenuUnavailable (); mWindowsMenu.clear (); } void KWD::Decorator::menuHidden (qulonglong id) { if (mClients.contains (id)) mClients[id]->emitMenuHidden (); } compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/org.kde.KWin.xml0000644000015301777760000000055112321343002025274 0ustar pbusernogroup00000000000000 compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/switcher.h0000644000015301777760000000335112321343002024354 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: Dennis Kasprzyk */ #ifndef _SWITCHER_H #define _SWITCHER_H #include #include #include #include #include namespace Plasma { class FrameSvg; } class QSpacerItem; class QLabel; class QVBoxLayout; namespace KWD { class Switcher { public: Switcher (WId parentId, WId id); ~Switcher (); void update (); void updateGeometry (); const QRect & geometry (); WId xid () const { return mId; } private: void updateWindowProperties (); void updateBlurProperty (int topOffset, int bottomOffset, int leftOffset, int rightOffset); void redrawPixmap (); private: WId mId; WId mSelected; QRect mGeometry; Plasma::FrameSvg *mBackground; QPixmap mPixmap; Pixmap mX11Pixmap; QPixmap mBackgroundPixmap; Pixmap mX11BackgroundPixmap; decor_layout_t mDecorLayout; decor_context_t mContext; decor_extents_t mBorder; }; } #endif compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/switcher.cpp0000644000015301777760000002276212321343002024716 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: Dennis Kasprzyk */ #include "switcher.h" #include "utils.h" #include "decorator.h" #include #include #include #include #include #include #include #include #include #include KWD::Switcher::Switcher (WId, WId id): mId (id), mX11Pixmap (0), mX11BackgroundPixmap (0) { QPalette palette; long prop[4]; QColor color; color = Plasma::Theme::defaultTheme ()->color (Plasma::Theme::TextColor); mBackground = new Plasma::FrameSvg (); mBackground->setImagePath ("dialogs/background"); mBackground->setEnabledBorders (Plasma::FrameSvg::AllBorders); mBorder.left = mBackground->marginSize (Plasma::LeftMargin); mBorder.right = mBackground->marginSize (Plasma::RightMargin); mBorder.top = mBackground->marginSize (Plasma::TopMargin); mBorder.bottom = mBackground->marginSize (Plasma::BottomMargin) + Plasma::Theme::defaultTheme ()->fontMetrics ().height () + 10; mContext.extents.left = mBorder.left; mContext.extents.right = mBorder.right; mContext.extents.top = mBorder.top; mContext.extents.bottom = mBorder.bottom; mContext.left_space = mBorder.left; mContext.right_space = mBorder.right; mContext.top_space = mBorder.top; mContext.bottom_space = mBorder.bottom; mContext.left_corner_space = 0; mContext.right_corner_space = 0; mContext.top_corner_space = 0; mContext.bottom_corner_space = 0; updateGeometry (); prop[0] = (color.red () * 256) + color.red (); prop[1] = (color.green () * 256) + color.green (); prop[2] = (color.blue () * 256) + color.blue (); prop[3] = (color.alpha () * 256) + color.alpha (); KWD::trapXError (); XChangeProperty (QX11Info::display (), id, Atoms::switchFgColor, XA_INTEGER, 32, PropModeReplace, (unsigned char *) prop, 4); KWD::popXError (); } KWD::Switcher::~Switcher () { if (mX11Pixmap) XFreePixmap (QX11Info::display (), mX11Pixmap); if (mX11BackgroundPixmap) XFreePixmap (QX11Info::display (), mX11BackgroundPixmap); delete mBackground; } void KWD::Switcher::updateGeometry () { int x, y; unsigned int width, height, border, depth; XID root; XGetGeometry (QX11Info::display (), mId, &root, &x, &y, &width, &height, &border, &depth); mGeometry = QRect (x, y, width, height); KWD::readWindowProperty (mId, Atoms::switchSelectWindow, (long *)&mSelected); if (mX11Pixmap) XFreePixmap (QX11Info::display (), mX11Pixmap); if (mX11BackgroundPixmap) XFreePixmap (QX11Info::display (), mX11BackgroundPixmap); #ifdef QT_45 mX11Pixmap = XCreatePixmap (QX11Info::display (), QX11Info::appRootWindow (), width + mBorder.left + mBorder.right, height + mBorder.top + mBorder.bottom, 32); mX11BackgroundPixmap = XCreatePixmap (QX11Info::display (), QX11Info::appRootWindow (), width, height, 32); mPixmap = QPixmap::fromX11Pixmap (mX11Pixmap, QPixmap::ExplicitlyShared); mBackgroundPixmap = QPixmap::fromX11Pixmap (mX11BackgroundPixmap, QPixmap::ExplicitlyShared); #else mPixmap = QPixmap (width + mBorder.left + mBorder.right, height + mBorder.top + mBorder.bottom); mBackgroundPixmap = QPixmap (width, height); #endif redrawPixmap (); update (); decor_get_default_layout (&mContext, mGeometry.width (), mGeometry.height (), &mDecorLayout); updateWindowProperties (); } const QRect & KWD::Switcher::geometry () { return mGeometry; } void KWD::Switcher::redrawPixmap () { QPainter p (&mPixmap); QPainter bp (&mBackgroundPixmap); const int contentWidth = mPixmap.width (); const int contentHeight = mPixmap.height (); mPixmap.fill (Qt::transparent); p.setCompositionMode (QPainter::CompositionMode_Source); p.setRenderHint (QPainter::SmoothPixmapTransform); mBackground->resizeFrame (QSizeF (contentWidth, contentHeight)); mBackground->paintFrame (&p, QRect (0, 0, contentWidth, contentHeight)); bp.setCompositionMode (QPainter::CompositionMode_Source); bp.drawPixmap (0, 0, mPixmap, mBorder.left, mBorder.top, mGeometry.width (), mGeometry.height ()); XSetWindowBackgroundPixmap (QX11Info::display (), mId, #ifdef QT_45 mX11BackgroundPixmap); #else mBackgroundPixmap.handle ()); #endif XClearWindow (QX11Info::display (), mId); } void KWD::Switcher::update () { QFontMetrics fm = Plasma::Theme::defaultTheme ()->fontMetrics (); QFont font (Plasma::Theme::defaultTheme ()-> font (Plasma::Theme::DefaultFont)); QString name; QPainter p (&mPixmap); KWD::readWindowProperty (mId, Atoms::switchSelectWindow, (long *)&mSelected); name = KWindowSystem::windowInfo (mSelected, NET::WMVisibleName, 0).visibleName (); while (fm.width (name) > mGeometry.width ()) { name.truncate (name.length () - 6); name += "..."; } p.setCompositionMode (QPainter::CompositionMode_Source); mBackground->paintFrame (&p, QRect (mBorder.left, mBorder.top + mGeometry.height () + 5, mGeometry.width (), fm.height ())); p.setFont (font); p.setPen (Plasma::Theme::defaultTheme ()->color (Plasma::Theme::TextColor)); p.drawText ((mPixmap.width () - fm.width (name)) / 2, mBorder.top + mGeometry.height () + 5 + fm.ascent (), name); } void KWD::Switcher::updateWindowProperties () { long *data = NULL; decor_quad_t quads[N_QUADS_MAX]; unsigned int nOffset = 1, frameType = 0, frameState = 0, frameActions = 0; int nQuad; int lh, rh; int w; lh = mDecorLayout.left.y2 - mDecorLayout.left.y1; rh = mDecorLayout.right.y2 - mDecorLayout.right.y1; w = mDecorLayout.top.x2 - mDecorLayout.top.x1 - mContext.left_space - mContext.right_space; data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_PIXMAP); nQuad = decor_set_lXrXtXbX_window_quads (quads, &mContext, &mDecorLayout, lh / 2, rh / 2, w, w / 2); #ifdef QT_45 decor_quads_to_property (data, nOffset - 1, mX11Pixmap, &mBorder, &mBorder, &mBorder, &mBorder, 0, 0, quads, nQuad, frameType, frameState, frameActions); #else decor_quads_to_property (data, nOffset - 1, mPixmap.handle (), &mBorder, &mBorder, &mBorder, &mBorder, 0, 0, quads, nQuad, frameType, frameState, frameActions); #endif KWD::trapXError (); XChangeProperty (QX11Info::display (), mId, Atoms::netWindowDecor, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); KWD::popXError (); free (data); updateBlurProperty (lh / 2, rh / 2, w / 2, w / 2); } void KWD::Switcher::updateBlurProperty (int topOffset, int bottomOffset, int leftOffset, int rightOffset) { Atom atom = Atoms::compizWindowBlurDecor; QRegion topQRegion, bottomQRegion, leftQRegion, rightQRegion; Region topRegion = NULL; Region bottomRegion = NULL; Region leftRegion = NULL; Region rightRegion = NULL; int size = 0; int w; w = mGeometry.width () + mContext.extents.left + mContext.extents.right; if (blurType != BLUR_TYPE_NONE) { QRegion r; topQRegion = QRegion (-mContext.extents.left, -mContext.extents.top, w, mContext.extents.top); topRegion = topQRegion.handle (); bottomQRegion = QRegion (-mContext.extents.left, 0, w, mContext.extents.bottom); bottomRegion = bottomQRegion.handle (); leftQRegion = QRegion (-mContext.extents.left, 0, mContext.extents.left, mGeometry.height ()); leftRegion = leftQRegion.handle (); rightQRegion = QRegion (0, 0, mContext.extents.right, mGeometry.height ()); rightRegion = rightQRegion.handle (); } if (topRegion) size += topRegion->numRects; if (bottomRegion) size += bottomRegion->numRects; if (leftRegion) size += leftRegion->numRects; if (rightRegion) size += rightRegion->numRects; if (size) { long data[size * 6 + 2]; decor_region_to_blur_property (data, 4, 0, mGeometry.width (), mGeometry.height (), topRegion, topOffset, bottomRegion, bottomOffset, leftRegion, leftOffset, rightRegion, rightOffset); KWD::trapXError (); XChangeProperty (QX11Info::display (), mId, atom, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, 2 + size * 6); KWD::popXError (); } else { KWD::trapXError (); XDeleteProperty (QX11Info::display (), mId, atom); KWD::popXError (); } } compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/Makefile.am0000644000015301777760000000226112321343002024406 0ustar pbusernogroup00000000000000if USE_KDE4 BUILDSOURCES = \ decorator.moc.cpp \ window.moc.cpp \ kwinadaptor.moc.cpp \ kwinadaptor.cpp \ kwinadaptor.h kde4_window_decorator_DEPENDENCIES = \ $(top_builddir)/libdecoration/libdecoration.la kde4_window_decorator_LDADD = \ $(top_builddir)/libdecoration/libdecoration.la \ @KDE4_WINDOW_DECORATOR_LIBS@ @KDE4_LIBS@ kde4_window_decorator_SOURCES = \ $(BUILDSOURCES) \ main.cpp \ utils.cpp \ utils.h \ decorator.cpp \ decorator.h \ window.cpp \ window.h \ options.cpp \ options.h \ kdecoration_plugins.cpp \ kdecoration_plugins.h \ switcher.cpp \ switcher.h \ org.kde.KWin.xml kde4_window_decorator_program = kde4-window-decorator INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include @KDE4_WINDOW_DECORATOR_CFLAGS@ @KDE4_CFLAGS@ bin_PROGRAMS = $(kde4_window_decorator_program) %.moc.cpp: %.h $(QT4_MOC) $< > $@ kwinadaptor.h: kwinadaptor.cpp kwinadaptor.cpp: org.kde.KWin.xml $(QDBUSXML2CPP) -a kwinadaptor -i decorator.h -l KWD::Decorator $< CLEANFILES = $(BUILDSOURCES) EXTRA_DIST = $(BUILDSOURCES) endif compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/options.cpp0000644000015301777760000001477312321343002024564 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #include "options.h" #include #include #include KWD::Options::Options (KConfig *config): KDecorationOptions (), mConfig (config) { updateSettings (); } unsigned long KWD::Options::updateSettings (void) { unsigned long changed = 0; KConfigGroup config = mConfig->group ("Windows"); changed |= KDecorationOptions::updateSettings (mConfig); OpTitlebarDblClick = windowOperation (config.readEntry ("TitlebarDoubleClickCommand", "Shade"), true); setOpMaxButtonLeftClick ( windowOperation (config.readEntry ("MaximizeButtonLeftClickCommand", "Maximize"), true)); setOpMaxButtonMiddleClick ( windowOperation (config.readEntry ("MaximizeButtonMiddleClickCommand", "Maximize (vertical only)"), true)); setOpMaxButtonRightClick ( windowOperation (config.readEntry ("MaximizeButtonRightClickCommand", "Maximize (horizontal only)"), true)); config = mConfig->group ("MouseBindings"); CmdActiveTitlebar1 = mouseCommand (config.readEntry ("CommandActiveTitlebar1", "Raise"), true); CmdActiveTitlebar2 = mouseCommand (config.readEntry ("CommandActiveTitlebar2", "Lower"), true); CmdActiveTitlebar3 = mouseCommand (config.readEntry ("CommandActiveTitlebar3", "Operations menu"), true); CmdInactiveTitlebar1 = mouseCommand (config.readEntry ("CommandInactiveTitlebar1", "Activate and raise"), true); CmdInactiveTitlebar2 = mouseCommand (config.readEntry ("CommandInactiveTitlebar2", "Activate and lower"), true); CmdInactiveTitlebar3 = mouseCommand (config.readEntry ("CommandInactiveTitlebar3", "Operations menu"), true); CmdTitlebarWheel = mouseWheelCommand (config.readEntry ("CommandTitlebarWheel", "Nothing")); return changed; } // restricted should be true for operations that the user may not be able to // repeat if the window is moved out of the workspace (e.g. if the user moves // a window by the titlebar, and moves it too high beneath Kicker at the top // edge, they may not be able to move it back, unless they know about Alt+LMB) KDecorationDefines::WindowOperation KWD::Options::windowOperation (const QString &name, bool restricted) { if (name == "Move") return restricted ? KWD::Options::MoveOp : KWD::Options::UnrestrictedMoveOp; else if (name == "Resize") return restricted ? KWD::Options::ResizeOp : KWD::Options::UnrestrictedResizeOp; else if (name == "Maximize") return KWD::Options::MaximizeOp; else if (name == "Minimize") return KWD::Options::MinimizeOp; else if (name == "Close") return KWD::Options::CloseOp; else if (name == "OnAllDesktops") return KWD::Options::OnAllDesktopsOp; else if (name == "Shade") return KWD::Options::ShadeOp; else if (name == "Operations") return KWD::Options::OperationsOp; else if (name == "Maximize (vertical only)") return KWD::Options::VMaximizeOp; else if (name == "Maximize (horizontal only)") return KWD::Options::HMaximizeOp; else if (name == "Lower") return KWD::Options::LowerOp; return KWD::Options::NoOp; } KWD::Options::MouseCommand KWD::Options::mouseCommand (const QString &name, bool restricted) { QString lowerName = name.toLower (); if (lowerName == "raise") return MouseRaise; if (lowerName == "lower") return MouseLower; if (lowerName == "operations menu") return MouseOperationsMenu; if (lowerName == "toggle raise and lower") return MouseToggleRaiseAndLower; if (lowerName == "activate and raise") return MouseActivateAndRaise; if (lowerName == "activate and lower") return MouseActivateAndLower; if (lowerName == "activate") return MouseActivate; if (lowerName == "activate, raise and pass click") return MouseActivateRaiseAndPassClick; if (lowerName == "activate and pass click") return MouseActivateAndPassClick; if (lowerName == "activate, raise and move") return restricted ? MouseActivateRaiseAndMove : MouseActivateRaiseAndUnrestrictedMove; if (lowerName == "move") return restricted ? MouseMove : MouseUnrestrictedMove; if (lowerName == "resize") return restricted ? MouseResize : MouseUnrestrictedResize; if (lowerName == "shade") return MouseShade; if (lowerName == "minimize") return MouseMinimize; if (lowerName == "nothing") return MouseNothing; return MouseNothing; } KWD::Options::MouseWheelCommand KWD::Options::mouseWheelCommand (const QString &name) { QString lowerName = name.toLower (); if (lowerName == "raise/lower") return MouseWheelRaiseLower; if (lowerName == "shade/unshade") return MouseWheelShadeUnshade; if (lowerName == "maximize/restore") return MouseWheelMaximizeRestore; if (lowerName == "above/below") return MouseWheelAboveBelow; if (lowerName == "previous/next desktop") return MouseWheelPreviousNextDesktop; if (lowerName == "change opacity") return MouseWheelChangeOpacity; return MouseWheelNothing; } KWD::Options::MouseCommand KWD::Options::wheelToMouseCommand (MouseWheelCommand com, int delta) { switch (com) { case MouseWheelRaiseLower: return delta > 0 ? MouseRaise : MouseLower; case MouseWheelShadeUnshade: return delta > 0 ? MouseSetShade : MouseUnsetShade; case MouseWheelMaximizeRestore: return delta > 0 ? MouseMaximize : MouseRestore; case MouseWheelAboveBelow: return delta > 0 ? MouseAbove : MouseBelow; case MouseWheelPreviousNextDesktop: return delta > 0 ? MousePreviousDesktop : MouseNextDesktop; case MouseWheelChangeOpacity: return delta > 0 ? MouseOpacityMore : MouseOpacityLess; default: return MouseNothing; } } compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/window.h0000644000015301777760000002012212321343013024030 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #ifndef _WINDOW_H #define _WINDOW_H #include #include #include #include #include #include #include #include #include "utils.h" #include "options.h" class QProcess; class KDecoration; class KActionCollection; class QMenu; namespace KWin { class PaintRedirector; } namespace KWD { class Window: public QObject, public KDecorationBridgeUnstable { Q_OBJECT public: enum Type { Normal2D, Normal, Default, DefaultActive }; public: Window (WId parentId, WId clientId, WId frame, Type type, QRect geometry = QRect ()); ~Window (void); virtual bool isActive (void) const; virtual bool isCloseable (void) const; virtual bool isMaximizable (void) const; virtual MaximizeMode maximizeMode (void) const; #if KDE_IS_VERSION(4,10,90) virtual QuickTileMode quickTileMode (void) const; #endif virtual bool isMinimizable (void) const; virtual bool providesContextHelp (void) const; virtual int desktop (void) const; virtual bool isModal (void) const; virtual bool isShadeable (void) const; virtual bool isShade (void) const; virtual bool isSetShade (void) const; virtual bool keepAbove (void) const; virtual bool keepBelow (void) const; virtual bool isMovable (void) const; virtual bool isResizable (void) const; virtual NET::WindowType windowType (unsigned long supported_types) const; virtual QIcon icon (void) const; virtual QIcon icon (int idx) const; virtual QString caption (void) const; virtual QString caption (int idx) const; virtual void processMousePressEvent (QMouseEvent *); virtual void showWindowMenu (const QRect &); virtual void showWindowMenu (const QPoint &); virtual void showWindowMenu (const QPoint &, long int id); virtual void showApplicationMenu (const QPoint &); virtual bool menuAvailable () const; virtual void performWindowOperation (WindowOperation); virtual void setMask (const QRegion &, int); virtual bool isPreview (void) const; virtual QRect geometry (void) const; virtual QRect iconGeometry (void) const; virtual QRegion unobscuredRegion (const QRegion & r) const; virtual WId windowId (void) const; virtual void closeWindow (void); virtual void maximize (MaximizeMode mode); virtual void minimize (void); virtual void showContextHelp (void); virtual void setDesktop (int desktop); virtual void titlebarDblClickOperation (void); virtual void titlebarMouseWheelOperation (int delta); virtual void setShade (bool set); virtual void setKeepAbove (bool); virtual void setKeepBelow (bool); virtual int currentDesktop (void) const; virtual QWidget *initialParentWidget (void) const; virtual Qt::WFlags initialWFlags (void) const; virtual void grabXServer (bool grab); /* unstable API */ virtual bool compositingActive () const; #if KDE_IS_VERSION(4,3,90) virtual QRect transparentRect () const; virtual bool isClientGroupActive (); virtual QList clientGroupItems () const; virtual long itemId (int index); virtual int visibleClientGroupItem (); virtual void setVisibleClientGroupItem (int index); virtual void moveItemInClientGroup (int index, int before); virtual void moveItemToClientGroup (long itemId, int before); virtual void removeFromClientGroup (int index, const QRect& newGeom); virtual void closeClientGroupItem (int index); virtual void closeAllInClientGroup (); virtual void displayClientMenu (int index, const QPoint& pos); virtual WindowOperation buttonToWindowOperation(Qt::MouseButtons button); #endif long tabId (int idx) const; long currentTabId () const; void setCurrentTab (long id); void tab_A_before_B (long A, long B); void tab_A_behind_B (long A, long B); void untab (long id, const QRect& newGeom); void closeTab (long id); void closeTabGroup (); int tabCount () const; void handleActiveChange (void); void updateFrame (WId frame); void updateWindowGeometry (void); void updateCursor (QPoint pos); void updateSelected (WId selected); WId frameId (void) const { return mFrame; } KDecoration *decoration (void) const { return mDecor; } QWidget *decorWidget (void) const; QWidget *childAt (int x, int y) const; QPoint mapToChildAt (QPoint p) const; QWidget *activeChild (void) const { return mActiveChild; } void setActiveChild (QWidget * child) { mActiveChild = child; } void moveWindow (QMouseEvent *qme); void reloadDecoration (void); void updateState (void); void updateName (void); void updateIcons (void); void updateOpacity (void) { mOpacity = readPropertyShort (mClientId, Atoms::netWmWindowOpacity, 0xffff); } Drawable pixmapId (void) const { return mPixmap; } decor_extents_t *border (void) { return &mBorder; } QRect clientGeometry (void); void showKillProcessDialog (Time timestamp); void hideKillProcessDialog (void); void setFakeRelease (bool fakeRelease) { mFakeRelease = fakeRelease; } bool getFakeRelease () { return mFakeRelease; } virtual bool eventFilter (QObject *o, QEvent *e); void emitShowRequest () { emit showRequest (); } void emitMenuHidden () { emit menuHidden (); } void setAppMenuAvailable (); void setAppMenuUnavailable (); private: void createDecoration (void); void resizeDecoration (bool force = false); void updateBlurProperty (int topOffset, int bottomOffset, int leftOffset, int rightOffset); long * updateProperty (long *, unsigned int); void getWindowProtocols (void); Options::MouseCommand buttonToCommand (Qt::MouseButtons button); void performMouseCommand (KWD::Options::MouseCommand command, QMouseEvent *qme); NET::Direction positionToDirection (int pos); Cursor positionToCursor (QPoint pos); private slots: void resizeDecorationTimeout (); void handlePopupActivated (QAction *action); void handleOpacityPopupActivated (QAction *action); void handleDesktopPopupActivated (QAction *action); void handlePopupAboutToShow (void); void decorRepaintPending (); signals: void showRequest (); void appMenuAvailable (); void appMenuUnavailable (); void menuHidden (); private: Type mType; WId mParentId; WId mFrame; WId mClientId; WId mSelectedId; QRect mGeometry; QString mName; QPixmap mIcon; QPixmap mMiniIcon; decor_extents_t mBorder; decor_extents_t mPadding; decor_extents_t mExtents; unsigned short mOpacity; KDecoration *mDecor; Pixmap mPixmap; QPixmap mPixmapQt; bool mUpdateProperty; bool mShapeSet; QRegion mShape; QWidget *mActiveChild; bool mSupportTakeFocus; bool mSupportContextHelp; QMenu *mPopup; QMenu *mAdvancedMenu; QMenu *mOpacityMenu; QMenu *mDesktopMenu; unsigned long mState; bool mAppMenuAvailable; QProcess mProcessKiller; KActionCollection mKeys; bool mFakeRelease; QAction *mResizeOpAction; QAction *mMoveOpAction; QAction *mMaximizeOpAction; QAction *mShadeOpAction; QAction *mKeepAboveOpAction; QAction *mKeepBelowOpAction; QAction *mFullScreenOpAction; QAction *mNoBorderOpAction; QAction *mMinimizeOpAction; QAction *mCloseOpAction; QAction *mDesktopOpAction; KWin::PaintRedirector *mPaintRedirector; }; } #endif compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/utils.h0000644000015301777760000000434412321343002023667 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #ifndef _UTILS_H #define _UTILS_H #include #include #include #include #if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) #define QT_45 #endif namespace KWD { namespace Atoms { extern Atom switchSelectWindow; extern Atom switchFgColor; extern Atom netWmWindowOpacity; extern Atom netInputFrameWindow; extern Atom netOutputFrameWindow; extern Atom compizShadowInfo; extern Atom compizShadowColor; extern Atom netWindowDecor; extern Atom netWindowDecorNormal; extern Atom netWindowDecorActive; extern Atom netWindowDecorBare; extern Atom wmTakeFocus; extern Atom netWmContextHelp; extern Atom wmProtocols; extern Atom toolkitActionAtom; extern Atom toolkitActionWindowMenuAtom; extern Atom toolkitActionForceQuitDialogAtom; extern Atom compizWindowBlurDecor; extern Atom enlightmentDesktop; void init (void); } void trapXError (void); int popXError (void); bool eventFilter (void *message, long *result); void *readXProperty (WId window, Atom property, Atom type, int *items); bool readWindowProperty (long wId, long property, long *value); QVector readPropertyString (Window WId, Atom property); unsigned short readPropertyShort (WId id, Atom property, unsigned short defaultValue); } #endif compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/paintredirector.h0000644000015301777760000000407212321343002025723 0ustar pbusernogroup00000000000000/***************************************************************** This file is part of the KDE project. Copyright (C) 2009 Lubos Lunak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************/ #ifndef PAINTREDIRECTOR_H #define PAINTREDIRECTOR_H #include #include #include namespace KWin { // This class redirects all painting of a given widget (including its children) // into a paint device (QPixmap). class PaintRedirector : public QObject { Q_OBJECT public: PaintRedirector( QWidget* widget ); virtual ~PaintRedirector() {} QPixmap performPendingPaint(); virtual bool eventFilter( QObject* o, QEvent* e ); QRegion pendingRegion() const; signals: void paintPending(); private: void added( QWidget* widget ); void removed( QWidget* widget ); bool isToolTip( QWidget* widget ) const; QWidget* widget; QRegion pending; bool recursionCheck; QTimer timer; }; } // namespace #endif compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/window.cpp0000644000015301777760000014631012321343013024373 0ustar pbusernogroup00000000000000/* * Copyright © 2009 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #include "window.h" #include "decorator.h" #include "options.h" #include "utils.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 #include #include "paintredirector.h" static const char *KDED_SERVICE = "org.kde.kded"; static const char *KDED_APPMENU_PATH = "/modules/appmenu"; static const char *KDED_INTERFACE = "org.kde.kded"; KWD::Window::Window (WId parentId, WId clientId, WId frame, Type type, QRect geometry) : mType (type), mParentId (parentId), mFrame (0), mClientId (clientId), mSelectedId (0), mDecor (0), mPixmap (0), mUpdateProperty (false), mShapeSet (false), mPopup (0), mAdvancedMenu (0), mOpacityMenu (0), mDesktopMenu (0), mAppMenuAvailable (false), mProcessKiller (this), mKeys (this), mResizeOpAction (0), mMoveOpAction (0), mMaximizeOpAction (0), mShadeOpAction (0), mKeepAboveOpAction (0), mKeepBelowOpAction (0), mFullScreenOpAction (0), mMinimizeOpAction (0), mCloseOpAction (0), mDesktopOpAction (0), mPaintRedirector (0) { memset (&mBorder, 0, sizeof (mBorder)); if (mType == Normal || mType == Normal2D) { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMState | NET::WMVisibleName, 0); mState = wInfo.state (); if (mType == Normal || mType == Normal2D) { mName = wInfo.visibleName (); mIcon = KWindowSystem::icon (mClientId, 32, 32, true, KWindowSystem::NETWM | KWindowSystem::WMHints ); mMiniIcon = KWindowSystem::icon (mClientId, 16, 16, true, KWindowSystem::NETWM | KWindowSystem::WMHints ); if (mIcon.isNull ()) { mIcon = KWindowSystem::icon (mClientId, 32, 32, true, KWindowSystem::ClassHint | KWindowSystem::XApp ); mMiniIcon = KWindowSystem::icon (mClientId, 16, 16, true, KWindowSystem::ClassHint | KWindowSystem::XApp ); } mOpacity = readPropertyShort (mClientId, Atoms::netWmWindowOpacity, 0xffff); } else { mIcon = QPixmap (); mMiniIcon = QPixmap (); mName = QString (""); } updateFrame (frame); mGeometry = geometry; getWindowProtocols (); } else { mIcon = QPixmap (); mMiniIcon = QPixmap (); mName = QString (""); mGeometry = QRect (50, 50, 30, 1); } createDecoration (); mActiveChild = NULL; } KWD::Window::~Window (void) { if (mPixmap) XFreePixmap (QX11Info::display(), mPixmap); if (mDecor) delete mDecor; if (mPopup) delete mPopup; if (mPaintRedirector) delete mPaintRedirector; if (mProcessKiller.state () == QProcess::Running) { mProcessKiller.terminate (); mProcessKiller.waitForFinished (10000); if (mProcessKiller.state () == QProcess::Running) { mProcessKiller.kill (); mProcessKiller.waitForFinished (5000); } } } bool KWD::Window::isActive (void) const { if (mType == DefaultActive) return true; else if (mType == Default) return false; return Decorator::activeId () == mClientId; } bool KWD::Window::isCloseable (void) const { KWindowInfo wInfo; if (mType != Normal && mType != Normal2D) return false; wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions); return wInfo.actionSupported (NET::ActionClose); } bool KWD::Window::isMaximizable (void) const { KWindowInfo wInfo; if (mType != Normal && mType != Normal2D) return false; wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions); return wInfo.actionSupported (NET::ActionMax); } #if KDE_IS_VERSION(4,10,90) KDecoration::QuickTileMode KWD::Window::quickTileMode (void) const { return QuickTileNone; } #endif KDecoration::MaximizeMode KWD::Window::maximizeMode (void) const { MaximizeMode mode = MaximizeRestore; if (mType != Normal && mType != Normal2D) return mode; mode = ((mState & NET::MaxVert) ? MaximizeVertical : MaximizeRestore) | ((mState & NET::MaxHoriz) ? MaximizeHorizontal : MaximizeRestore); return mode; } bool KWD::Window::isMinimizable (void) const { KWindowInfo wInfo; if (mType != Normal && mType != Normal2D) return false; wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions); return wInfo.actionSupported (NET::ActionMinimize); } bool KWD::Window::providesContextHelp (void) const { if (mType != Normal && mType != Normal2D) return false; return mSupportContextHelp; } int KWD::Window::desktop (void) const { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMDesktop, 0); return wInfo.desktop (); } bool KWD::Window::isModal (void) const { return mState & NET::Modal; } bool KWD::Window::isShadeable (void) const { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions); return wInfo.actionSupported (NET::ActionShade); } bool KWD::Window::isShade (void) const { if (mType != Normal && mType != Normal2D) return false; return (mState & NET::Shaded); } bool KWD::Window::isSetShade (void) const { return isShade (); } bool KWD::Window::keepAbove (void) const { if (mType != Normal && mType != Normal2D) return false; return (mState & NET::KeepAbove); } bool KWD::Window::keepBelow (void) const { if (mType != Normal && mType != Normal2D) return false; return (mState & NET::KeepBelow); } bool KWD::Window::isMovable (void) const { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions); return wInfo.actionSupported (NET::ActionMove); } NET::WindowType KWD::Window::windowType (unsigned long mask) const { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMWindowType, 0); return wInfo.windowType (mask); } bool KWD::Window::isResizable (void) const { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions); return wInfo.actionSupported (NET::ActionResize); } QIcon KWD::Window::icon (void) const { QIcon icon (mIcon); icon.addPixmap (mMiniIcon); return icon; } QIcon KWD::Window::icon (int idx) const { return icon (); } QString KWD::Window::caption (void) const { return mName; } QString KWD::Window::caption (int idx) const { return caption (); } int KWD::Window::tabCount () const { return 1; } long KWD::Window::tabId (int idx) const { return 0; } long KWD::Window::currentTabId () const { return 0; } void KWD::Window::setCurrentTab (long id) { } void KWD::Window::tab_A_before_B (long A, long B) { } void KWD::Window::tab_A_behind_B (long A, long B) { } void KWD::Window::untab (long id, const QRect& newGeom) { } void KWD::Window::closeTab (long id) { } void KWD::Window::closeTabGroup () { } /* TODO: We should use libtaskmanager, which is part of kdebase to create the window menu instead but the headers for that library are currently not installed. If kdebase could install those headers, we wouldn't have to have our own window menu implementaion here. */ void KWD::Window::showWindowMenu (const QPoint &pos) { if (!mPopup) { QAction *action; const int levels[] = { 100, 90, 75, 50, 25, 10 }; mPopup = new QMenu (); mPopup->setFont (KGlobalSettings::menuFont ()); connect (mPopup, SIGNAL (aboutToShow ()), SLOT (handlePopupAboutToShow ())); connect (mPopup, SIGNAL (triggered (QAction*)), SLOT (handlePopupActivated (QAction*))); mAdvancedMenu = new QMenu (mPopup); mAdvancedMenu->setFont (KGlobalSettings::menuFont ()); mKeepAboveOpAction = mAdvancedMenu->addAction (i18n ("Keep &Above Others")); mKeepAboveOpAction->setIcon (KIcon ("go-up")); KAction *kaction = qobject_cast (mKeys.action ("Window Above Other Windows")); if (kaction != 0) mKeepAboveOpAction->setShortcut (kaction->globalShortcut ().primary ()); mKeepAboveOpAction->setCheckable (true); mKeepAboveOpAction->setData (KDecorationDefines::KeepAboveOp); mKeepBelowOpAction = mAdvancedMenu->addAction (i18n ("Keep &Below Others")); mKeepBelowOpAction->setIcon (KIcon ("go-down")); kaction = qobject_cast (mKeys.action ("Window Below Other Windows")); if (kaction != 0) mKeepBelowOpAction->setShortcut (kaction->globalShortcut ().primary ()); mKeepBelowOpAction->setCheckable (true); mKeepBelowOpAction->setData (KDecorationDefines::KeepBelowOp); mFullScreenOpAction = mAdvancedMenu->addAction (i18n ("&Fullscreen")); mFullScreenOpAction->setIcon (KIcon ("view-fullscreen")); kaction = qobject_cast (mKeys.action ("Window Fullscreen")); if (kaction != 0) mFullScreenOpAction->setShortcut (kaction->globalShortcut ().primary ()); mFullScreenOpAction->setCheckable (true); mFullScreenOpAction->setData (KDecorationDefines::FullScreenOp); action = mPopup->addMenu (mAdvancedMenu); action->setText (i18n ("Ad&vanced")); mOpacityMenu = new QMenu (mPopup); mOpacityMenu->setFont (KGlobalSettings::menuFont ()); connect (mOpacityMenu, SIGNAL (triggered (QAction*)), SLOT (handleOpacityPopupActivated (QAction*))); for( unsigned int i = 0; i < sizeof (levels) / sizeof (levels[0]); ++i) { action = mOpacityMenu->addAction (QString::number (levels[i]) + "%"); action->setCheckable (true); action->setData (levels[i]); } action = mPopup->addMenu (mOpacityMenu); action->setText (i18n ("&Opacity")); mDesktopMenu = new QMenu (mPopup); mDesktopMenu->setFont (KGlobalSettings::menuFont ()); connect (mDesktopMenu, SIGNAL (triggered (QAction*)), SLOT (handleDesktopPopupActivated (QAction*))); mDesktopOpAction = mPopup->addMenu (mDesktopMenu); mDesktopOpAction->setText (i18n ("To &Desktop")); mMoveOpAction = mPopup->addAction (i18n ("&Move")); mMoveOpAction->setIcon (KIcon ("move")); kaction = qobject_cast (mKeys.action ("Window Move")); if (kaction != 0) mMoveOpAction->setShortcut (kaction->globalShortcut ().primary ()); mMoveOpAction->setData (KDecorationDefines::MoveOp); mResizeOpAction = mPopup->addAction (i18n ("Re&size")); kaction = qobject_cast (mKeys.action("Window Resize")); if (kaction != 0) mResizeOpAction->setShortcut (kaction->globalShortcut ().primary ()); mResizeOpAction->setData (KDecorationDefines::ResizeOp); mMinimizeOpAction = mPopup->addAction (i18n ("Mi&nimize")); kaction = qobject_cast (mKeys.action ("Window Minimize")); if (kaction != 0) mMinimizeOpAction->setShortcut (kaction->globalShortcut ().primary ()); mMinimizeOpAction->setData (KDecorationDefines::MinimizeOp); mMaximizeOpAction = mPopup->addAction (i18n ("Ma&ximize")); kaction = qobject_cast (mKeys.action ("Window Maximize")); if (kaction != 0) mMaximizeOpAction->setShortcut (kaction->globalShortcut ().primary ()); mMaximizeOpAction->setCheckable (true); mMaximizeOpAction->setData (KDecorationDefines::MaximizeOp); mShadeOpAction = mPopup->addAction (i18n ("Sh&ade")); kaction = qobject_cast (mKeys.action ("Window Shade")); if (kaction != 0) mShadeOpAction->setShortcut (kaction->globalShortcut ().primary ()); mShadeOpAction->setCheckable (true); mShadeOpAction->setData (KDecorationDefines::ShadeOp); mPopup->addSeparator (); mCloseOpAction = mPopup->addAction (i18n("&Close")); mCloseOpAction->setIcon (KIcon ("window-close" )); kaction = qobject_cast (mKeys.action("Window Close")); if (kaction != 0) mCloseOpAction->setShortcut (kaction->globalShortcut ().primary ()); mCloseOpAction->setData (KDecorationDefines::CloseOp); } QPoint pnt = mDecor->widget ()->mapFromGlobal (pos); pnt += QPoint (mGeometry.x () - mBorder.left - mPadding.left, mGeometry.y () - mBorder.top - mPadding.top); mPopup->exec (pnt); } void KWD::Window::showWindowMenu (const QPoint &pos, long id) { showWindowMenu (pos); } void KWD::Window::showWindowMenu (const QRect &pos) { showWindowMenu (pos.bottomLeft ()); } void KWD::Window::showApplicationMenu (const QPoint &p) { QPoint pnt = mDecor->widget ()->mapFromGlobal (p); pnt += QPoint (mGeometry.x () - mBorder.left - mPadding.left, mGeometry.y () - mBorder.top - mPadding.top); QList args = QList () << pnt.x () << pnt.y () << qulonglong (mClientId); QDBusMessage method = QDBusMessage::createMethodCall ( KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "showMenu"); method.setArguments (args); QDBusConnection::sessionBus ().asyncCall (method); } bool KWD::Window::menuAvailable () const { return mAppMenuAvailable; } void KWD::Window::setAppMenuAvailable () { mAppMenuAvailable = true; emit appMenuAvailable (); } void KWD::Window::setAppMenuUnavailable () { mAppMenuAvailable = false; emit appMenuUnavailable (); } KWD::Options::MouseCommand KWD::Window::buttonToCommand (Qt::MouseButtons button) { Options::MouseCommand com = Options::MouseNothing; bool active = isActive (); if (!mSupportTakeFocus) active = true; switch (button) { case Qt::LeftButton: com = active ? Decorator::options ()->commandActiveTitlebar1 () : Decorator::options()->commandInactiveTitlebar1 (); break; case Qt::MidButton: com = active ? Decorator::options ()->commandActiveTitlebar2 () : Decorator::options()->commandInactiveTitlebar2 (); break; case Qt::RightButton: com = active ? Decorator::options ()->commandActiveTitlebar3 () : Decorator::options()->commandInactiveTitlebar3 (); default: break; } return com; } void KWD::Window::processMousePressEvent (QMouseEvent *qme) { Options::MouseCommand com = buttonToCommand (qme->button ()); if (qme->button () == Qt::LeftButton) { // actions where it's not possible to get the matching release event if (com != Options::MouseOperationsMenu && com != Options::MouseMinimize) { moveWindow (qme); return; } } performMouseCommand (com, qme); } void KWD::Window::performWindowOperation (WindowOperation wo) { switch (wo) { case KDecoration::MaximizeOp: maximize (maximizeMode () == KDecoration::MaximizeFull ? KDecoration::MaximizeRestore : KDecoration::MaximizeFull); break; case KDecoration::HMaximizeOp: maximize (maximizeMode () ^ KDecoration::MaximizeHorizontal); break; case KDecoration::VMaximizeOp: maximize (maximizeMode () ^ KDecoration::MaximizeVertical); break; case KDecoration::MinimizeOp: minimize (); break; case KDecoration::ShadeOp: setShade (!isShade ()); break; case KDecoration::CloseOp: closeWindow (); break; case KDecoration::KeepAboveOp: setKeepAbove (!keepAbove ()); break; case KDecoration::KeepBelowOp: setKeepBelow (!keepBelow ()); break; case KDecoration::FullScreenOp: if (mState & NET::FullScreen) KWindowSystem::clearState (mClientId, NET::FullScreen); else KWindowSystem::setState (mClientId, NET::FullScreen); break; case KDecoration::MoveOp: Decorator::rootInfo ()->moveResizeRequest (mClientId, mGeometry.x () + mGeometry.width () / 2, mGeometry.y () + mGeometry.height () / 2, NET::KeyboardMove); break; case KDecoration::ResizeOp: Decorator::rootInfo ()->moveResizeRequest (mClientId, mGeometry.x () + mGeometry.width () / 2, mGeometry.y () + mGeometry.height () / 2, NET::KeyboardSize); default: break; } } bool KWD::Window::isPreview (void) const { return false; } QRect KWD::Window::geometry (void) const { QRect rect = mGeometry; return QRect (rect.x () - ROOT_OFF_X, rect.y () - ROOT_OFF_Y, rect.width (), rect.height ()); } QRect KWD::Window::iconGeometry (void) const { return QRect (); } QRect KWD::Window::clientGeometry (void) { return mGeometry; QRect frame = geometry (); return QRect (frame.x () + mBorder.left, frame.y () + mBorder.top, frame.width () - mBorder.left - mBorder.right, frame.height () - mBorder.top - mBorder.bottom); } QRegion KWD::Window::unobscuredRegion (const QRegion & r) const { return r; } WId KWD::Window::windowId (void) const { return mClientId; } void KWD::Window::closeWindow (void) { Decorator::rootInfo ()->closeWindowRequest (mClientId); } void KWD::Window::maximize (MaximizeMode mode) { KWindowSystem::setState (mClientId, ((mode & MaximizeVertical) ? NET::MaxVert : 0) | ((mode & MaximizeHorizontal) ? NET::MaxHoriz : 0)); KWindowSystem::clearState (mClientId, ((mode & MaximizeVertical) ? 0 : NET::MaxVert) | ((mode & MaximizeHorizontal) ? 0 : NET::MaxHoriz)); } void KWD::Window::minimize (void) { KWindowSystem::minimizeWindow (mClientId, false); } void KWD::Window::showContextHelp (void) { if (mSupportContextHelp) KWD::Decorator::sendClientMessage (mClientId, mClientId, Atoms::wmProtocols, Atoms::netWmContextHelp); } void KWD::Window::titlebarDblClickOperation (void) { WindowOperation op; op = KWD::Decorator::options ()->operationTitlebarDblClick (); performWindowOperation (op); } void KWD::Window::setDesktop (int desktop) { KWindowSystem::setOnDesktop (mClientId, desktop); } void KWD::Window::setKeepBelow (bool set) { if (set) { KWindowSystem::clearState (mClientId, NET::KeepAbove); KWindowSystem::setState (mClientId, NET::KeepBelow); } else { KWindowSystem::clearState (mClientId, NET::KeepBelow); } } void KWD::Window::setKeepAbove (bool set) { if (set) { KWindowSystem::clearState (mClientId, NET::KeepBelow); KWindowSystem::setState (mClientId, NET::KeepAbove); } else { KWindowSystem::clearState (mClientId, NET::KeepAbove); } } void KWD::Window::setShade (bool set) { if (set) KWindowSystem::setState (mClientId, NET::Shaded); else KWindowSystem::clearState (mClientId, NET::Shaded); mDecor->shadeChange (); } void KWD::Window::titlebarMouseWheelOperation (int delta) { Options::MouseCommand com; com = Decorator::options()->operationTitlebarMouseWheel (delta); performMouseCommand (com, 0); } int KWD::Window::currentDesktop (void) const { return KWindowSystem::currentDesktop (); } QWidget * KWD::Window::initialParentWidget (void) const { return 0; } Qt::WFlags KWD::Window::initialWFlags (void) const { return 0; } void KWD::Window::grabXServer (bool) { } bool KWD::Window::compositingActive (void) const { return (mType != Normal2D); } #if KDE_IS_VERSION(4,3,90) QRect KWD::Window::transparentRect () const { return QRect (); } bool KWD::Window::isClientGroupActive () { return false; } QList KWD::Window::clientGroupItems () const { QList items; QIcon icon (mIcon); icon.addPixmap (mMiniIcon); items.append (ClientGroupItem (mName, icon)); return items; } long KWD::Window::itemId (int /* index */) { return (long) mClientId; } int KWD::Window::visibleClientGroupItem () { return 0; } void KWD::Window::setVisibleClientGroupItem (int /* index */) { } void KWD::Window::moveItemInClientGroup (int /* index */, int /* before */) { } void KWD::Window::moveItemToClientGroup (long /* itemId */, int /* before */) { } void KWD::Window::removeFromClientGroup (int /* index */, const QRect& /* newGeom */) { } void KWD::Window::closeClientGroupItem (int /* index */) { closeWindow (); } void KWD::Window::closeAllInClientGroup () { closeWindow (); } void KWD::Window::displayClientMenu (int /* index */, const QPoint& pos) { showWindowMenu (pos); } KDecorationDefines::WindowOperation KWD::Window::buttonToWindowOperation(Qt::MouseButtons button) { Options::MouseCommand com = buttonToCommand (button); if (com == Options::MouseOperationsMenu) return KDecorationDefines::OperationsOp; return KDecorationDefines::NoOp; } #endif void KWD::Window::createDecoration (void) { if (mDecor) return; mDecor = Decorator::pluginManager ()->createDecoration (this); connect(this, SIGNAL(showRequest()), mDecor, SIGNAL(showRequest())); connect(this, SIGNAL(appMenuAvailable()), mDecor, SIGNAL(appMenuAvailable())); connect(this, SIGNAL(appMenuUnavailable()), mDecor, SIGNAL(appMenuUnavailable())); connect(this, SIGNAL(menuHidden()), mDecor, SIGNAL(menuHidden())); mDecor->init (); mDecor->widget ()->installEventFilter (this); if (mType != Normal2D) { mPaintRedirector = new KWin::PaintRedirector (mDecor->widget ()); connect (mPaintRedirector, SIGNAL (paintPending()), this, SLOT (decorRepaintPending ())); } mPadding.top = mPadding.bottom = mPadding.left = mPadding.right = 0; if (KDecorationUnstable *deco2 = dynamic_cast(mDecor)) deco2->padding (mPadding.left, mPadding.right, mPadding.top, mPadding.bottom); if (mType == Normal2D && mFrame) { XReparentWindow (QX11Info::display(), mDecor->widget ()->winId (), mFrame, 0, 0); XMoveWindow (QX11Info::display(), mDecor->widget ()->winId (), -mPadding.left, -mPadding.top); } else XReparentWindow (QX11Info::display(), mDecor->widget ()->winId (), mParentId, 0, 0); if (mType == Normal && mFrame) { KWD::trapXError (); XSelectInput (QX11Info::display(), mFrame, StructureNotifyMask | PropertyChangeMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | EnterWindowMask | LeaveWindowMask); if (KWD::popXError ()) return; } QTimer::singleShot (0, this, SLOT(resizeDecorationTimeout ())); } void KWD::Window::resizeDecorationTimeout () { resizeDecoration (true); } void KWD::Window::setMask (const QRegion ®ion, int) { if (region.isEmpty ()) { if (mFrame && mShapeSet) { QRegion r (0, 0, mGeometry.width () + mBorder.left + mBorder.right, mGeometry.height () + mBorder.top + mBorder.bottom); r -= QRegion (mBorder.left, mBorder.top, mGeometry.width (), mGeometry.height ()); KWD::trapXError (); XShapeCombineMask (QX11Info::display(), mFrame, (mType == Normal2D)? ShapeBounding : ShapeInput, 0, 0, None, ShapeSet); KWD::popXError (); } mShapeSet = false; return; } if (mShapeSet && region == mShape) return; mShape = region; mShapeSet = true; if (mFrame) { QRegion r = region.translated (-mPadding.left, -mPadding.top); r -= QRegion (mBorder.left, mBorder.top, mGeometry.width (), mGeometry.height ()); KWD::trapXError (); XShapeCombineRegion (QX11Info::display(), mFrame, (mType == Normal2D)? ShapeBounding : ShapeInput, 0, 0, r.handle (), ShapeSet); KWD::popXError (); } } void KWD::Window::resizeDecoration (bool force) { int w, h; if (KDecorationUnstable *deco2 = dynamic_cast(mDecor)) deco2->padding (mPadding.left, mPadding.right, mPadding.top, mPadding.bottom); mDecor->borders (mBorder.left, mBorder.right, mBorder.top, mBorder.bottom); mExtents.left = mBorder.left + mPadding.left; mExtents.right = mBorder.right + mPadding.right; mExtents.top = mBorder.top + mPadding.top; mExtents.bottom = mBorder.bottom + mPadding.bottom; if (mType != Normal && mType != Normal2D) { mGeometry = QRect (50, 50, 100, 100); } w = mGeometry.width () + mExtents.left + mExtents.right; h = mGeometry.height () + mExtents.top + mExtents.bottom; if (!force) { if (w == decorWidget ()->width () && h == decorWidget ()->height ()) return; } /* reset shape */ if (!force || w != decorWidget ()->width () || h != decorWidget ()->height ()) setMask (QRegion (), 0); if (mPixmap) { XFreePixmap (QX11Info::display(), mPixmap); mPixmap = None; } mDecor->resize (QSize (w, h)); mDecor->widget ()->show (); mDecor->widget ()->update (); mPixmap = XCreatePixmap (QX11Info::display(), QX11Info::appRootWindow (), qMax (w, mGeometry.height ()), mExtents.top + mExtents.bottom + mExtents.left + mExtents.right, 32); mPixmapQt = QPixmap::fromX11Pixmap (mPixmap, QPixmap::ExplicitlyShared); mPixmapQt.fill (Qt::transparent); if (mPaintRedirector) mUpdateProperty = true; else { long *data = NULL; unsigned int propSize = 0; KWD::Window *otherUpdate = NULL; if (mType == Default || mType == DefaultActive) { propSize = 2; data = decor_alloc_property (propSize, WINDOW_DECORATION_TYPE_PIXMAP); if (mType == Default) otherUpdate = KWD::Decorator::self ()->defaultActive (); else if (mType == DefaultActive) otherUpdate = KWD::Decorator::self ()->defaultNormal (); } data = updateProperty (data, propSize); if (otherUpdate && data) { otherUpdate->updateProperty (data, propSize); free (data); } } } void KWD::Window::updateBlurProperty (int topOffset, int bottomOffset, int leftOffset, int rightOffset) { Atom atom = Atoms::compizWindowBlurDecor; QRegion topQRegion, bottomQRegion, leftQRegion, rightQRegion; ::Region topRegion = NULL; ::Region bottomRegion = NULL; ::Region leftRegion = NULL; ::Region rightRegion = NULL; int size = 0; int w, h; w = mGeometry.width () + mBorder.left + mBorder.right; h = mGeometry.height () + mBorder.top + mBorder.bottom; if (blurType != BLUR_TYPE_NONE) { QRegion r, shape = QRegion (0, 0, w, h); if (mShapeSet) shape = mShape.translated (-mPadding.left, -mPadding.top); r = QRegion (0, 0, w, mBorder.top); topQRegion = r.intersect (shape); if (!topQRegion.isEmpty ()) { topQRegion.translate (-mBorder.left, -mBorder.top); topRegion = topQRegion.handle (); } if (blurType == BLUR_TYPE_ALL) { r = QRegion (0, h - mBorder.bottom, w, mBorder.bottom); bottomQRegion = r.intersect (shape); if (!bottomQRegion.isEmpty ()) { bottomQRegion.translate (-mBorder.left, -(h - mBorder.bottom)); bottomRegion = bottomQRegion.handle (); } r = QRegion (0, mBorder.top, mBorder.left, mGeometry.height ()); leftQRegion = r.intersect (shape); if (!leftQRegion.isEmpty ()) { leftQRegion.translate (-mBorder.left, -mBorder.top); leftRegion = leftQRegion.handle (); } r = QRegion (w - mBorder.right, mBorder.top, mBorder.right, mGeometry.height ()); rightQRegion = r.intersect (shape); if (!rightQRegion.isEmpty ()) { rightQRegion.translate (-(w - mBorder.right), -mBorder.top); rightRegion = rightQRegion.handle (); } } } if (topRegion) size += topRegion->numRects; if (bottomRegion) size += bottomRegion->numRects; if (leftRegion) size += leftRegion->numRects; if (rightRegion) size += rightRegion->numRects; if (size) { long data[size * 6 + 2]; decor_region_to_blur_property (data, 4, 0, mGeometry.width (), mGeometry.height (), topRegion, topOffset, bottomRegion, bottomOffset, leftRegion, leftOffset, rightRegion, rightOffset); KWD::trapXError (); XChangeProperty (QX11Info::display(), mClientId, atom, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, 2 + size * 6); KWD::popXError (); } else { KWD::trapXError (); XDeleteProperty (QX11Info::display(), mClientId, atom); KWD::popXError (); } } long * KWD::Window::updateProperty (long *data, unsigned int propSize) { Atom atom = Atoms::netWindowDecor; decor_extents_t maxExtents, normExtents; decor_quad_t quads[N_QUADS_MAX]; unsigned int nOffset = 1; unsigned int frameType = 0xffffff; unsigned int frameState = 0; unsigned int frameActions = 0; int left, right, top, bottom, width, height; unsigned int saveState; bool allocated = false; if (!propSize) propSize = nOffset; /* FIXME: This is essentially a hack to put the default * active and inactive decorations in the same property, * since we take an existing allocated property and return * the data in there and then pass it to the next KWD::Window * to update the property again. That's sub-optimal, but * its the best solution until we implement proper decoration * lists inside of kde4-window-decorator */ if (mType != Normal && mType != Normal2D) { atom = Atoms::netWindowDecorActive; if (mType == Default) { frameState &= ~(DECOR_WINDOW_STATE_FOCUS); nOffset = 2; } else if (mType == DefaultActive) { frameState |= DECOR_WINDOW_STATE_FOCUS; nOffset = 1; } } else if (!propSize) propSize = nOffset; saveState = mState; mState = NET::MaxVert | NET::MaxHoriz; mDecor->borders (maxExtents.left, maxExtents.right, maxExtents.top, maxExtents.bottom); mState = 0; mDecor->borders (normExtents.left, normExtents.right, normExtents.top, normExtents.bottom); mState = saveState; mState = saveState; mDecor->borders (mBorder.left, mBorder.right, mBorder.top, mBorder.bottom); left = mExtents.left; right = mExtents.right; top = mExtents.top; bottom = mExtents.bottom; width = mGeometry.width (); height = mGeometry.height (); if (mType != Normal2D) { int nQuad = 0; if (!data) { allocated = true; data = decor_alloc_property (propSize, WINDOW_DECORATION_TYPE_PIXMAP); } if (mType == Normal) { decor_quad_t *q = quads; int n = 0; int topXOffset = width; QWidget *widget = mDecor->widget (); if (widget) { int x; const QList children = widget->children (); foreach (QObject *obj, children) { QWidget *child; if (!obj->isWidgetType ()) continue; child = static_cast (obj); x = child->x () - mExtents.left - 2; if (x > width / 2 && x < topXOffset) topXOffset = x; } } // top quads n = decor_set_horz_quad_line (q, left, topXOffset, right, width - topXOffset - 1, -top, 0, GRAVITY_NORTH, left + right + width, -(width - topXOffset - 1), GRAVITY_EAST, 0, 0); q += n; nQuad += n; // bottom quads n = decor_set_horz_quad_line (q, left, width / 2, right, (width / 2) - 1, 0, bottom, GRAVITY_SOUTH, left + right + width, -((width / 2) - 1), GRAVITY_EAST, 0, top); q += n; nQuad += n; // left quads n = decor_set_vert_quad_row (q, 0, height / 2, 0, (height / 2) - 1, -left, 0, GRAVITY_WEST, height, -((height / 2) - 1), GRAVITY_SOUTH, 0, top + bottom, 1); q += n; nQuad += n; // right quads n = decor_set_vert_quad_row (q, 0, height / 2, 0, (height / 2) - 1, 0, right, GRAVITY_EAST, height, -((height / 2) - 1), GRAVITY_SOUTH, 0, top + bottom + left, 1); q += n; nQuad += n; updateBlurProperty (topXOffset, width / 2, height / 2, height / 2); } else { decor_quad_t *q = quads; int n = 0; // top n = decor_set_horz_quad_line (q, left, 0, right, 0, -top, 0, GRAVITY_NORTH, left + right + width, width / 2, 0, 0, 0); q += n; nQuad += n; // bottom n = decor_set_horz_quad_line (q, left, 0, right, 0, 0, bottom, GRAVITY_SOUTH, left + right + width, width / 2, 0, 0, top); q += n; nQuad += n; // left n = decor_set_vert_quad_row (q, 0, 0, 0, 0, -left, 0, GRAVITY_WEST, height, height / 2, 0, 0, top + bottom, 1); q += n; nQuad += n; // right n = decor_set_vert_quad_row (q, 0, 0, 0, 0, 0, right, GRAVITY_EAST, height, height / 2, 0, 0, top + bottom + left, 1); q += n; nQuad += n; } decor_quads_to_property (data, nOffset - 1, mPixmap, &mBorder, &mBorder, &maxExtents, &maxExtents, 1, 0, quads, nQuad, frameType, frameState, frameActions); } else { if (!data) { allocated = true; data = decor_alloc_property (propSize, WINDOW_DECORATION_TYPE_PIXMAP); } decor_gen_window_property (data, nOffset - 1, &normExtents, &maxExtents, 1, 0, frameType, frameState, frameActions); } KWD::trapXError (); XChangeProperty (QX11Info::display(), mClientId, atom, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, PROP_HEADER_SIZE + propSize * (BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX)); KWD::popXError (); if (allocated) { free (data); data = NULL; } mUpdateProperty = false; return data; } void KWD::Window::handleActiveChange (void) { mDecor->activeChange (); resizeDecoration (); } void KWD::Window::updateFrame (WId frame) { if (mType == Normal2D && frame != mFrame && mDecor) { reloadDecoration (); //XReparentWindow (QX11Info::display(), mDecor->widget ()->winId (), frame, 0, 0); //XMoveWindow (QX11Info::display(), mDecor->widget ()->winId (), -mPadding.left, -mPadding.top); } mFrame = frame; KWD::trapXError (); XSelectInput (QX11Info::display(), mFrame, StructureNotifyMask | PropertyChangeMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | EnterWindowMask | LeaveWindowMask); KWD::popXError (); } void KWD::Window::updateSelected (WId selectedId) { mSelectedId = selectedId; updateName (); } void KWD::Window::updateWindowGeometry (void) { KWD::trapXError (); KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMGeometry); KWD::popXError (); if (!wInfo.valid ()) return; QRect geometry = wInfo.geometry (); if (mGeometry.width () != geometry.width () || mGeometry.height () != geometry.height ()) { mGeometry = geometry; resizeDecoration (); } else if (mGeometry.x () != geometry.x () || mGeometry.y () != geometry.y ()) { mGeometry = geometry; } } void KWD::Window::reloadDecoration (void) { delete mDecor; mDecor = 0; delete mPaintRedirector; mPaintRedirector = 0; mShapeSet = false; createDecoration (); } Cursor KWD::Window::positionToCursor (QPoint pos) { switch (mDecor->mousePosition (pos + QPoint (mPadding.left, mPadding.top))) { case PositionCenter: return cursors[1][1].cursor; case PositionLeft: return cursors[1][0].cursor; case PositionRight: return cursors[1][2].cursor; case PositionTop: return cursors[0][1].cursor; case PositionBottom: return cursors[2][1].cursor; case PositionTopLeft: return cursors[0][0].cursor; case PositionTopRight: return cursors[0][2].cursor; case PositionBottomLeft: return cursors[2][0].cursor; case PositionBottomRight: return cursors[2][2].cursor; default: break; } return cursors[1][1].cursor; } void KWD::Window::updateCursor (QPoint pos) { KWD::trapXError (); if (mType == Normal2D && mDecor) XDefineCursor (QX11Info::display(), mDecor->widget ()->winId (), positionToCursor (pos)); else XDefineCursor (QX11Info::display(), mFrame, positionToCursor (pos)); KWD::popXError (); } void KWD::Window::getWindowProtocols (void) { Atom *p; int n; int status; mSupportTakeFocus = false; mSupportContextHelp = false; KWD::trapXError (); status = XGetWMProtocols (QX11Info::display(), mClientId, &p, &n); if (KWD::popXError ()) return; if (status) { for (int i = 0; i < n; ++i) { if (p[i] == Atoms::wmTakeFocus) mSupportTakeFocus = true; else if (p[i] == Atoms::netWmContextHelp) mSupportContextHelp = true; } if (n > 0) XFree (p); } } void KWD::Window::handlePopupActivated (QAction * action) { WindowOperation op = static_cast (action->data().toInt()); performWindowOperation (op); } void KWD::Window::handleOpacityPopupActivated (QAction *action) { int op = action->data().toInt(); op = op * 0xffff / 100; if (op != mOpacity) Decorator::sendClientMessage (QX11Info::appRootWindow(), mClientId, Atoms::netWmWindowOpacity, (op << 16) | op); } void KWD::Window::handleDesktopPopupActivated (QAction *action) { if (action->data().toInt()) setDesktop (action->data().toInt()); else KWindowSystem::setOnAllDesktops (mClientId, true); } void KWD::Window::handlePopupAboutToShow (void) { int numberOfDesktops; numberOfDesktops = KWindowSystem::numberOfDesktops (); if (numberOfDesktops > 1) { NETRootInfo *rootInfo = Decorator::rootInfo (); QString name; int winDesktop = desktop (); QAction *action; const int BASE = 10; mDesktopMenu->clear (); action = mDesktopMenu->addAction (i18n ("&All Desktops")); action->setData (0); action->setCheckable (true); action->setChecked (winDesktop == NET::OnAllDesktops); mDesktopMenu->addSeparator (); for (int i = 1; i <= numberOfDesktops; ++i) { QString basic_name ("%1 %2"); if (i < BASE) basic_name.prepend ('&'); basic_name = basic_name.arg (i).arg ( QString (rootInfo->desktopName (i)).replace ('&', "&&")); action = mDesktopMenu->addAction (basic_name); action->setData (i); action->setCheckable (true); action->setChecked (winDesktop == i); } mDesktopOpAction->setVisible (true); } else { mDesktopOpAction->setVisible (false); } mResizeOpAction->setEnabled (isResizable ()); mMoveOpAction->setEnabled (isMovable ()); mMaximizeOpAction->setEnabled (isMaximizable ()); mMaximizeOpAction->setChecked (maximizeMode () == MaximizeFull); mShadeOpAction->setChecked (isShade ()); mShadeOpAction->setEnabled (isShadeable ()); mKeepAboveOpAction->setChecked (keepAbove ()); mKeepBelowOpAction->setChecked (keepBelow ()); mFullScreenOpAction->setChecked (mState & NET::FullScreen); mMinimizeOpAction->setEnabled (isMinimizable ()); mCloseOpAction->setEnabled (isCloseable ()); foreach (QAction* action, mOpacityMenu->actions ()) { if(action->data ().toInt () == qRound ((float)mOpacity * 100.0 / 0xffff)) action->setChecked( true ); else action->setChecked( false ); } } void KWD::Window::updateState (void) { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMState, 0); unsigned long newState = wInfo.state (); unsigned long stateChange = mState ^ newState; mState = newState; if (stateChange & NET::Max) { mDecor->maximizeChange (); resizeDecoration (false); } if (stateChange & NET::KeepAbove && !(mState & NET::KeepAbove)) mDecor->emitKeepAboveChanged (mState & NET::KeepAbove); if (stateChange & NET::KeepBelow && !(mState & NET::KeepBelow)) mDecor->emitKeepBelowChanged (mState & NET::KeepBelow); if (stateChange & NET::KeepAbove && mState & NET::KeepAbove) mDecor->emitKeepAboveChanged (mState & NET::KeepAbove); if (stateChange & NET::KeepBelow && mState & NET::KeepBelow) mDecor->emitKeepBelowChanged (mState & NET::KeepBelow); if (stateChange & NET::Shaded) mDecor->shadeChange (); if (stateChange & NET::Sticky) mDecor->desktopChange (); } void KWD::Window::updateName (void) { KWindowInfo wInfo; wInfo = KWindowSystem::windowInfo (mClientId, NET::WMVisibleName, 0); mName = wInfo.visibleName (); mDecor->captionChange (); } void KWD::Window::updateIcons (void) { mIcon = KWindowSystem::icon (mClientId, 32, 32, true, KWindowSystem::NETWM | KWindowSystem::WMHints); mMiniIcon = KWindowSystem::icon (mClientId, 16, 16, true, KWindowSystem::NETWM | KWindowSystem::WMHints); if (mIcon.isNull ()) { mIcon = KWindowSystem::icon (mClientId, 32, 32, true, KWindowSystem::ClassHint | KWindowSystem::XApp ); mMiniIcon = KWindowSystem::icon (mClientId, 16, 16, true, KWindowSystem::ClassHint | KWindowSystem::XApp ); } mDecor->iconChange (); } NET::Direction KWD::Window::positionToDirection (int pos) { switch (pos) { case PositionLeft: return NET::Left; case PositionRight: return NET::Right; case PositionTop: return NET::Top; case PositionBottom: return NET::Bottom; case PositionTopLeft: return NET::TopLeft; case PositionTopRight: return NET::TopRight; case PositionBottomLeft: return NET::BottomLeft; case PositionBottomRight: return NET::BottomRight; default: break; } return NET::Move; } void KWD::Window::moveWindow (QMouseEvent *qme) { NET::Direction direction; direction = positionToDirection (mDecor->mousePosition (qme->pos ())); QPoint p (mGeometry.x () - mExtents.left, mGeometry.y () - mExtents.top); p += qme->pos (); XUngrabPointer (QX11Info::display(), CurrentTime); XUngrabKeyboard (QX11Info::display(), CurrentTime); Decorator::rootInfo ()->restackRequest (mClientId, NET::FromApplication, None, Above, QX11Info::appTime()); Decorator::rootInfo ()->moveResizeRequest (mClientId, p.x (), p.y (), direction); mFakeRelease = true; } #define OPACITY_STEP (0xffff / 10) void KWD::Window::performMouseCommand (Options::MouseCommand command, QMouseEvent *qme) { switch (command) { case Options::MouseRaise: KWindowSystem::raiseWindow (mClientId); break; case Options::MouseLower: KWindowSystem::lowerWindow (mClientId); break; case Options::MouseShade : setShade (!isShade ()); break; case Options::MouseSetShade: setShade (true); break; case Options::MouseUnsetShade: setShade (false); break; case Options::MouseOperationsMenu: showWindowMenu (mDecor->widget ()->mapToGlobal (qme->pos ())); break; case Options::MouseMaximize: maximize (KDecoration::MaximizeFull); break; case Options::MouseRestore: maximize (KDecoration::MaximizeRestore); break; case Options::MouseMinimize: minimize (); break; case Options::MouseAbove: if (keepBelow ()) setKeepBelow (false); else setKeepAbove (true); break; case Options::MouseBelow: if (keepAbove ()) setKeepAbove (false); else setKeepBelow (true); break; case Options::MousePreviousDesktop: break; case Options::MouseNextDesktop: break; case Options::MouseOpacityMore: { int opacity = mOpacity; if (opacity < 0xffff) { opacity += OPACITY_STEP; if (opacity > 0xffff) opacity = 0xffff; Decorator::sendClientMessage (QX11Info::appRootWindow(), mClientId, Atoms::netWmWindowOpacity, (opacity << 16) | opacity); } } break; case Options::MouseOpacityLess: { int opacity = mOpacity; if (opacity > OPACITY_STEP) { opacity -= OPACITY_STEP; if (opacity < OPACITY_STEP) opacity = OPACITY_STEP; Decorator::sendClientMessage (QX11Info::appRootWindow(), mClientId, Atoms::netWmWindowOpacity, (opacity << 16) | opacity); } } break; case Options::MouseActivateRaiseAndMove: case Options::MouseActivateRaiseAndUnrestrictedMove: case Options::MouseMove: case Options::MouseUnrestrictedMove: case Options::MouseResize: case Options::MouseUnrestrictedResize: if (qme) moveWindow (qme); case Options::MouseNothing: default: break; } } void KWD::Window::showKillProcessDialog (Time timestamp) { KWindowInfo kWinInfo = KWindowSystem::windowInfo (mClientId, 0, NET::WM2WindowClass | NET::WM2ClientMachine); NETWinInfo wInfo = NETWinInfo (QX11Info::display(), mClientId, QX11Info::appRootWindow(), NET::WMPid); QByteArray clientMachine, resourceClass; pid_t pid; char buf[257]; if (mProcessKiller.state () == QProcess::Running) return; clientMachine = kWinInfo.clientMachine (); resourceClass = kWinInfo.windowClassClass (); pid = wInfo.pid (); if (gethostname (buf, sizeof (buf) - 1) == 0) { if (strcmp (buf, clientMachine) == 0) clientMachine = "localhost"; } mProcessKiller.start (KStandardDirs::findExe ("kwin_killer_helper"), QStringList () << "--pid" << QByteArray ().setNum (pid) << "--hostname" << clientMachine << "--windowname" << mName.toUtf8 () << "--applicationname" << resourceClass << "--wid" << QByteArray ().setNum ((unsigned int) mClientId) << "--timestamp" << QByteArray ().setNum ((unsigned int) timestamp), QIODevice::NotOpen); } void KWD::Window::hideKillProcessDialog (void) { if (mProcessKiller.state () == QProcess::Running) { mProcessKiller.terminate (); } } void KWD::Window::decorRepaintPending () { if (!mPaintRedirector || !mPixmap) return; QRegion reg = mPaintRedirector->pendingRegion(); if (reg.isEmpty()) return; QRect bBox = reg.boundingRect(); if (mShapeSet) reg &= mShape; int l = mExtents.left; int r = mExtents.right; int t = mExtents.top; int b = mExtents.bottom; int w = mGeometry.width (); int h = mGeometry.height (); QRect top = QRect (0, 0, w + l + r, t); QRect bottom = QRect (0, t + h, w + l + r, b); QRect left = QRect (0, t, l, h); QRect right = QRect (l + w, t, r, h); QRegion rtop = reg & top; QRegion rbottom = reg & bottom; QRegion rleft = reg & left; QRegion rright = reg & right; QPixmap p = mPaintRedirector->performPendingPaint(); if (mType != Normal2D) { QPainter pt (&mPixmapQt); pt.setCompositionMode( QPainter::CompositionMode_Source ); pt.setClipRegion( reg ); QRect bb, pb; // Top if (!rtop.isEmpty ()) { bb = rtop.boundingRect(); pb = bb; pb.moveTo (bb.topLeft () - bBox.topLeft ()); pt.resetTransform (); pt.setClipRegion( reg ); pt.drawPixmap( bb.topLeft(), p, pb ); } // Bottom if (!rbottom.isEmpty ()) { bb = rbottom.boundingRect(); pb = bb; pb.moveTo (bb.topLeft () - bBox.topLeft ()); pt.resetTransform (); pt.translate(0, -h); pt.setClipRegion( reg ); pt.drawPixmap( bb.topLeft(), p, pb ); } // Left if (!rleft.isEmpty ()) { bb = rleft.boundingRect(); pb = bb; pb.moveTo (bb.topLeft () - bBox.topLeft ()); pt.resetTransform (); pt.translate(0, t + b); pt.rotate (90); pt.scale (1.0, -1.0); pt.translate(0, -t); pt.setClipRegion( reg ); pt.drawPixmap( bb.topLeft(), p, pb ); } // Right if (!rright.isEmpty ()) { bb = rright.boundingRect(); pb = bb; pb.moveTo (bb.topLeft () - bBox.topLeft ()); pt.resetTransform (); pt.translate(0, t + b + l); pt.rotate (90); pt.scale (1.0, -1.0); pt.translate(- (l + w), -t); pt.setClipRegion( reg ); pt.drawPixmap( bb.topLeft(), p, pb ); } } else { } if (mUpdateProperty) { long *data = NULL; unsigned int propSize = 0; KWD::Window *otherUpdate = NULL; if (mType == Default || mType == DefaultActive) { propSize = 2; data = decor_alloc_property (propSize, WINDOW_DECORATION_TYPE_PIXMAP); if (mType == Default) otherUpdate = KWD::Decorator::self ()->defaultActive (); else if (mType == DefaultActive) otherUpdate = KWD::Decorator::self ()->defaultNormal (); } data = updateProperty (data, propSize); if (otherUpdate && data) { otherUpdate->updateProperty (data, propSize); free (data); } } } QWidget * KWD::Window::decorWidget (void) const { if (!mDecor) return 0; return mDecor->widget (); } QWidget * KWD::Window::childAt (int x, int y) const { if (!mDecor) return 0; QWidget *child = mDecor->widget ()->childAt (x + mPadding.left, y + mPadding.top); return (child)? child : decorWidget (); } QPoint KWD::Window::mapToChildAt (QPoint p) const { if (!mDecor) return p; if (childAt (p.x (), p.y ()) == decorWidget ()) return p + QPoint (mPadding.left, mPadding.right); return childAt (p.x (), p.y ())->mapFrom (decorWidget (), p + QPoint (mPadding.left, mPadding.right)); } bool KWD::Window::eventFilter (QObject *o, QEvent *e) { if (!mDecor || o != mDecor->widget ()) return false; if (e->type () == QEvent::MouseMove) { QMouseEvent* ev = static_cast (e); updateCursor (QPoint (ev->x () - mPadding.left, ev->y () - mPadding.top)); } if (e->type() == QEvent::Resize) { QResizeEvent* ev = static_cast (e); // Filter out resize events that inform about size different than frame size. // This will ensure that mDecor->width() etc. and mDecor->widget()->width() will be in sync. // These events only seem to be delayed events from initial resizing before show() was called // on the decoration widget. if (ev->size () != (mGeometry.size () + QSize (mExtents.left + mExtents.right, mExtents.top + mExtents.bottom))) { int w = mGeometry.width () + mExtents.left + mExtents.right; int h = mGeometry.height () + mExtents.top + mExtents.bottom; mDecor->resize (QSize (w, h)); return true; } // HACK: Avoid decoration redraw delays. On resize Qt sets WA_WStateConfigPending // which delays all painting until a matching ConfigureNotify event comes. // But this process itself is the window manager, so it's not needed // to wait for that event, the geometry is known. // Note that if Qt in the future changes how this flag is handled and what it // triggers then this may potentionally break things. See mainly QETWidget::translateConfigEvent(). mDecor->widget()->setAttribute( Qt::WA_WState_ConfigPending, false ); mDecor->widget()->update(); return false; } return false; } compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/kdecoration_plugins.cpp0000644000015301777760000001416312321343002027125 0ustar pbusernogroup00000000000000/***************************************************************** This file is a copy of the KWin internal API. It allows the KDE4 window decorator the loading of KWin decoration plugins. Copyright © 2008 Dennis Kasprzyk ****************************************************************** This file is part of the KDE project. Copyright (C) 1999, 2000 Daniel M. Duley Copyright (C) 2003 Lubos Lunak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************/ #include "kdecoration_plugins.h" #include #include #include #include #include #include #include #include #include KWD::KDecorationPlugins::KDecorationPlugins(const KSharedConfigPtr &cfg) : create_ptr( NULL ), library( NULL ), fact( NULL ), old_library( NULL ), old_fact( NULL ), pluginStr( "kwin3_undefined " ), config( cfg ) { } KWD::KDecorationPlugins::~KDecorationPlugins() { if(library) { assert( fact != NULL ); delete fact; library->unload(); } if(old_library) { assert( old_fact != NULL ); delete old_fact; old_library->unload(); } } QString KWD::KDecorationPlugins::currentPlugin() { return pluginStr; } bool KWD::KDecorationPlugins::reset( unsigned long changed ) { QString oldPlugin = pluginStr; config->reparseConfiguration(); bool ret = false; if(( !loadPlugin( "" ) && library ) // "" = read the one in cfg file || oldPlugin == pluginStr ) { // no new plugin loaded, reset the old one assert( fact != NULL ); ret = fact->reset( changed ); } return ret || oldPlugin != pluginStr; } KDecorationFactory* KWD::KDecorationPlugins::factory() { return fact; } // convenience KDecoration* KWD::KDecorationPlugins::createDecoration( KDecorationBridge* bridge ) { if( fact != NULL ) return fact->createDecoration( bridge ); return NULL; } // returns true if plugin was loaded successfully bool KWD::KDecorationPlugins::loadPlugin( QString nameStr ) { if( nameStr.isEmpty()) { KConfigGroup group( config, QString("Style") ); nameStr = group.readEntry("PluginLib", defaultPlugin ); } // make sure people can switch between HEAD and kwin_iii branch if( nameStr.startsWith( "kwin_" )) nameStr = "kwin3_" + nameStr.mid( 5 ); KLibrary *oldLibrary = library; KDecorationFactory* oldFactory = fact; QString path = KLibLoader::findLibrary(nameStr); kDebug() << "kwin : path " << path << " for " << nameStr; // If the plugin was not found, try to find the default if (path.isEmpty()) { nameStr = defaultPlugin; path = KLibLoader::findLibrary(nameStr); } // If no library was found, exit kwin with an error message if (path.isEmpty()) { error( i18n("No window decoration plugin library was found." )); return false; } // Check if this library is not already loaded. if(pluginStr == nameStr) return true; // Try loading the requested plugin library = KLibLoader::self()->library(path); // If that fails, fall back to the default plugin if (!library) { kDebug() << " could not load library, try default plugin again"; nameStr = defaultPlugin; if ( pluginStr == nameStr ) return true; path = KLibLoader::findLibrary(nameStr); if (!path.isEmpty()) library = KLibLoader::self()->library(path); } if (!library) { error( i18n("The default decoration plugin is corrupt " "and could not be loaded." )); return false; } create_ptr = NULL; KLibrary::void_function_ptr create_func = library->resolveFunction("create_factory"); if(create_func) create_ptr = (KDecorationFactory* (*)())create_func; if(!create_ptr) { error( i18n( "The library %1 is not a KWin plugin.", path )); library->unload(); return false; } fact = create_ptr(); fact->checkRequirements( this ); // let it check what is supported pluginStr = nameStr; // For clients in kdeartwork QString catalog = nameStr; catalog.replace( "kwin3_", "kwin_" ); KGlobal::locale()->insertCatalog( catalog ); // For KCommonDecoration based clients KGlobal::locale()->insertCatalog( "kwin_lib" ); // For clients in kdebase KGlobal::locale()->insertCatalog( "kwin_clients" ); // For clients in kdeartwork KGlobal::locale()->insertCatalog( "kwin_art_clients" ); old_library = oldLibrary; // save for delayed destroying old_fact = oldFactory; return true; } void KWD::KDecorationPlugins::destroyPreviousPlugin() { // Destroy the old plugin if(old_library) { delete old_fact; old_fact = NULL; old_library->unload(); old_library = NULL; } } void KWD::KDecorationPlugins::error( const QString& ) { } compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/utils.cpp0000644000015301777760000001350212321343002024216 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #include "utils.h" #include #include #include #include #include #include static int trappedErrorCode = 0; namespace KWD { namespace Atoms { Atom switchSelectWindow; Atom switchFgColor; Atom netWmWindowOpacity; Atom netInputFrameWindow; Atom netOutputFrameWindow; Atom compizShadowInfo; Atom compizShadowColor; Atom netWindowDecor; Atom netWindowDecorNormal; Atom netWindowDecorActive; Atom netWindowDecorBare; Atom wmTakeFocus; Atom netWmContextHelp; Atom wmProtocols; Atom toolkitActionAtom; Atom toolkitActionWindowMenuAtom; Atom toolkitActionForceQuitDialogAtom; Atom compizWindowBlurDecor; Atom enlightmentDesktop; } } static int (*oldErrorHandler) (Display *display, XErrorEvent *error); static int xErrorHandler (Display *display, XErrorEvent *error) { (void) display; trappedErrorCode = error->error_code; return 0; } void KWD::trapXError (void) { trappedErrorCode = 0; oldErrorHandler = XSetErrorHandler (xErrorHandler); } int KWD::popXError (void) { XSync (QX11Info::display (), false); XSetErrorHandler (oldErrorHandler); return trappedErrorCode; } void * KWD::readXProperty (WId window, Atom property, Atom type, int *items) { long offset = 0, length = 2048L; Atom actualType; int format; unsigned long nItems, bytesRemaining; unsigned char *data = 0l; int result; KWD::trapXError (); result = XGetWindowProperty (QX11Info::display (), window, property, offset, length, false, type, &actualType, &format, &nItems, &bytesRemaining, &data); if (KWD::popXError ()) return NULL; if (result == Success && actualType == type && format == 32 && nItems > 0) { if (items) *items = nItems; return reinterpret_cast (data); } if (data) XFree (data); if (items) *items = 0; return NULL; } bool KWD::readWindowProperty (long window, long property, long *value) { void *data = readXProperty (window, property, XA_WINDOW, NULL); if (data) { if (value) *value = *reinterpret_cast (data); XFree (data); return true; } return false; } QVector KWD::readPropertyString (WId id, Atom property) { XTextProperty xtp; XGetTextProperty (QX11Info::display (), id, &xtp, property); QVector ret; if (xtp.value) { int retCount = 0; char **tData = NULL; XTextPropertyToStringList (&xtp, &tData, &retCount); for (unsigned int i = 0; i < (unsigned int) retCount; ++i) { QString str = QString (tData[i]); ret.push_back (str); } XFreeStringList (tData); } return ret; } unsigned short KWD::readPropertyShort (WId id, Atom property, unsigned short defaultValue) { Atom actual; int result, format; unsigned long n, left; unsigned char *data; KWD::trapXError (); result = XGetWindowProperty (QX11Info::display (), id, property, 0L, 1L, FALSE, XA_CARDINAL, &actual, &format, &n, &left, &data); if (KWD::popXError ()) return defaultValue; if (result == Success && n && data) { unsigned int value; memcpy (&value, data, sizeof (unsigned int)); XFree (data); return value >> 16; } return defaultValue; } void KWD::Atoms::init (void) { Display *xdisplay = QX11Info::display (); netInputFrameWindow = XInternAtom (xdisplay, DECOR_INPUT_FRAME_ATOM_NAME, false); netOutputFrameWindow = XInternAtom (xdisplay, DECOR_OUTPUT_FRAME_ATOM_NAME, false); compizShadowInfo = XInternAtom (xdisplay, "_COMPIZ_NET_CM_SHADOW_PROPERTIES", false); compizShadowColor = XInternAtom (xdisplay, "_COMPIZ_NET_CM_SHADOW_COLOR", false); netWindowDecor = XInternAtom (xdisplay, DECOR_WINDOW_ATOM_NAME, false); netWindowDecorActive = XInternAtom (xdisplay, DECOR_ACTIVE_ATOM_NAME, false); netWindowDecorBare = XInternAtom (xdisplay, DECOR_BARE_ATOM_NAME, false); switchSelectWindow = XInternAtom (xdisplay, DECOR_SWITCH_WINDOW_ATOM_NAME, false); switchFgColor = XInternAtom (xdisplay, DECOR_SWITCH_FOREGROUND_COLOR_ATOM_NAME, false); wmTakeFocus = XInternAtom (xdisplay, "WM_TAKE_FOCUS", false); netWmContextHelp = XInternAtom (xdisplay, "_NET_WM_CONTEXT_HELP", false); wmProtocols = XInternAtom (xdisplay, "WM_PROTOCOLS", false); netWmWindowOpacity = XInternAtom (xdisplay, "_NET_WM_WINDOW_OPACITY", false); toolkitActionAtom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION", false); toolkitActionWindowMenuAtom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION_WINDOW_MENU", false); toolkitActionForceQuitDialogAtom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION_FORCE_QUIT_DIALOG", false); compizWindowBlurDecor = XInternAtom (xdisplay, DECOR_BLUR_ATOM_NAME, false); enlightmentDesktop = XInternAtom (xdisplay, "ENLIGHTENMENT_DESKTOP", false); } compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/options.h0000644000015301777760000000666512321343002024232 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #ifndef _OPTIONS_H #define _OPTIONS_H #include class KConfig; namespace KWD { class Options : public KDecorationOptions { public: enum MouseCommand { MouseRaise, MouseLower, MouseOperationsMenu, MouseToggleRaiseAndLower, MouseActivateAndRaise, MouseActivateAndLower, MouseActivate, MouseActivateRaiseAndPassClick, MouseActivateAndPassClick, MouseMove, MouseUnrestrictedMove, MouseActivateRaiseAndMove, MouseActivateRaiseAndUnrestrictedMove, MouseResize, MouseUnrestrictedResize, MouseShade, MouseSetShade, MouseUnsetShade, MouseMaximize, MouseRestore, MouseMinimize, MouseNextDesktop, MousePreviousDesktop, MouseAbove, MouseBelow, MouseOpacityMore, MouseOpacityLess, MouseNothing }; enum MouseWheelCommand { MouseWheelRaiseLower, MouseWheelShadeUnshade, MouseWheelMaximizeRestore, MouseWheelAboveBelow, MouseWheelPreviousNextDesktop, MouseWheelChangeOpacity, MouseWheelNothing }; Options (KConfig *config); virtual ~Options () {} virtual unsigned long updateSettings (void); WindowOperation operationTitlebarDblClick (void) { return OpTitlebarDblClick; } MouseCommand commandActiveTitlebar1 (void) { return CmdActiveTitlebar1; } MouseCommand commandActiveTitlebar2 (void) { return CmdActiveTitlebar2; } MouseCommand commandActiveTitlebar3 (void) { return CmdActiveTitlebar3; } MouseCommand commandInactiveTitlebar1 (void) { return CmdInactiveTitlebar1; } MouseCommand commandInactiveTitlebar2 (void) { return CmdInactiveTitlebar2; } MouseCommand commandInactiveTitlebar3 (void) { return CmdInactiveTitlebar3; } MouseCommand operationTitlebarMouseWheel (int delta) { return wheelToMouseCommand (CmdTitlebarWheel, delta); } private: static KDecorationDefines::WindowOperation windowOperation (const QString &name, bool restricted); MouseCommand mouseCommand (const QString &name, bool restricted); MouseWheelCommand mouseWheelCommand (const QString &name); MouseCommand wheelToMouseCommand (MouseWheelCommand com, int delta); private: KDecorationDefines::WindowOperation OpTitlebarDblClick; MouseCommand CmdActiveTitlebar1; MouseCommand CmdActiveTitlebar2; MouseCommand CmdActiveTitlebar3; MouseCommand CmdInactiveTitlebar1; MouseCommand CmdInactiveTitlebar2; MouseCommand CmdInactiveTitlebar3; MouseWheelCommand CmdTitlebarWheel; KConfig *mConfig; }; } #endif compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/decorator.h0000644000015301777760000001110112321343002024476 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #ifndef _DECORATOR_H #define _DECORATOR_H #include #include #include #include #include #include #include #include #include #include "window.h" #include "switcher.h" #include "kdecoration_plugins.h" #include "utils.h" extern const unsigned int ROOT_OFF_X; extern const unsigned int ROOT_OFF_Y; #define C(name) { 0, XC_ ## name } struct _cursor { Cursor cursor; unsigned int shape; }; extern struct _cursor cursors[3][3]; extern const unsigned short BLUR_TYPE_NONE; extern const unsigned short BLUR_TYPE_TITLEBAR; extern const unsigned short BLUR_TYPE_ALL; extern int blurType; class KConfig; class KWindowSystem; namespace KWD { class Options; class PluginManager:public KDecorationPlugins { public: PluginManager (KSharedConfigPtr config); virtual bool provides (Requirement) { return false; } }; class Decorator:public KApplication { Q_OBJECT public: #ifdef QT_45 Decorator (); #else Decorator (Display* display, Qt::HANDLE visual, Qt::HANDLE colormap); #endif ~Decorator (void); static NETRootInfo *rootInfo (void) { return mRootInfo; } static PluginManager *pluginManager (void) { return mPlugins; } static KWD::Options *options (void) { return mOptions; } static WId activeId (void) { return mActiveId; } static decor_shadow_options_t *activeShadowOptions (void) { return &mActiveShadowOptions; } static decor_shadow_options_t *inactiveShadowOptions (void) { return &mInactiveShadowOptions; } static KWD::Window *defaultNormal () { return mDecorNormal; } static KWD::Window *defaultActive () { return mDecorActive; } static KWD::Decorator *self () { return mSelf; } static void sendClientMessage (WId eventWid, WId wid, Atom atom, Atom value, long data1 = 0, long data2 = 0, long data3 = 0); bool enableDecorations (Time timestamp); bool x11EventFilter (XEvent *xevent); void changeShadowOptions (decor_shadow_options_t *aopt, decor_shadow_options_t *iopt); public slots: void reconfigure (void); private: WId fetchFrame (WId window); void updateShadow (void); void updateAllShadowOptions (void); void updateShadowProperties (WId id); private slots: void handleWindowAdded (WId id); void handleWindowRemoved (WId id); void handleActiveWindowChanged (WId id); void handleWindowChanged (WId id, const unsigned long *properties); void shadowRadiusChanged (double value_active, double value_inactive); void shadowOpacityChanged (double value_active, double value_inactive); void shadowXOffsetChanged (int value_active, int value_inactive); void shadowYOffsetChanged (int value_active, double value_inactive); void shadowColorChanged (QString value_active, QString value_inactive); void plasmaThemeChanged (); void showRequest (qulonglong wid); void menuAvailable (qulonglong wid); void menuHidden (qulonglong wid); void clearMenus (); private: static PluginManager *mPlugins; static KWD::Options *mOptions; static decor_shadow_t *mNoBorderShadow; static decor_shadow_options_t mActiveShadowOptions; static decor_shadow_options_t mInactiveShadowOptions; static NETRootInfo *mRootInfo; static WId mActiveId; static KWD::Window *mDecorNormal; static KWD::Window *mDecorActive; QMap mClients; QMap mFrames; KConfig *mConfig; Time mDmSnTimestamp; WId mCompositeWindow; Switcher *mSwitcher; QList mWindowsMenu; static KWD::Decorator *mSelf; /* XXX: Remove */ }; } #endif compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/paintredirector.cpp0000644000015301777760000000766512321343002026271 0ustar pbusernogroup00000000000000/***************************************************************** This file is part of the KDE project. Copyright (C) 2009 Lubos Lunak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************/ #include "paintredirector.h" #include #include #include namespace KWin { PaintRedirector::PaintRedirector( QWidget* w ) : widget( w ) , recursionCheck( false ) { timer.setSingleShot( true ); connect( &timer, SIGNAL( timeout()), SIGNAL( paintPending())); added( w ); } QPixmap PaintRedirector::performPendingPaint() { //qDebug() << "### performing paint, pending:" << pending.boundingRect(); QPixmap pixmap( pending.boundingRect().size()); pixmap.fill( Qt::transparent ); recursionCheck = true; // do not use DrawWindowBackground, it's ok to be transparent widget->render( &pixmap, QPoint(), pending.boundingRect(), QWidget::DrawChildren ); recursionCheck = false; pending = QRegion(); return pixmap; } bool PaintRedirector::isToolTip( QWidget *object ) const { // ### We need a more reliable way of doing this return object->windowFlags() & Qt::ToolTip; } bool PaintRedirector::eventFilter( QObject* o, QEvent* e ) { switch( e->type()) { case QEvent::ChildAdded: { QChildEvent* c = static_cast< QChildEvent* >( e ); if( c->child()->isWidgetType() && !isToolTip( static_cast< QWidget* >( c->child() ) ) ) added( static_cast< QWidget* >( c->child())); break; } case QEvent::ChildRemoved: { QChildEvent* c = static_cast< QChildEvent* >( e ); if( c->child()->isWidgetType()) removed( static_cast< QWidget* >( c->child())); break; } case QEvent::Paint: { if( !recursionCheck ) { QPaintEvent* pe = static_cast< QPaintEvent* >( e ); QWidget* w = static_cast< QWidget* >( o ); pending |= pe->region().translated( w->mapTo( widget, QPoint( 0, 0 ))); timer.start( 0 ); return true; // filter out } } default: break; } return false; } QRegion PaintRedirector::pendingRegion() const { return pending; } void PaintRedirector::added( QWidget* w ) { w->installEventFilter( this ); foreach( QObject* o, w->children()) { if( o->isWidgetType() && !isToolTip( static_cast< QWidget* >( o ) ) ) added( static_cast< QWidget* >( o )); } } void PaintRedirector::removed( QWidget* w ) { foreach( QObject* o, w->children()) { if( o->isWidgetType()) removed( static_cast< QWidget* >( o )); } w->installEventFilter( this ); } } // namespace //#include "paintredirector.moc" compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/main.cpp0000644000015301777760000000747012321343002024011 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include "decorator.h" #include "utils.h" #include int main (int argc, char **argv) { KWD::Decorator *app; KCmdLineArgs *args; KCmdLineOptions options; int status; Time timestamp; QString appname; options.add ("replace", ki18n ("Replace existing window decorator")); options.add ("sm-disable", ki18n ("Disable connection to session manager")); options.add ("blur ", ki18n ("Blur type (none,titlebar,all)"), "none"); KAboutData about("kde-window-decorator", "kwin", ki18n ("KDE Window Decorator"), "0.0.1", KLocalizedString(), KAboutData::License_GPL, KLocalizedString(), KLocalizedString(), "https://launchpad.net/compiz", "dev@lists.compiz-fusion.org"); KCmdLineArgs::init (argc, argv, "kde-window-decorator", "kwin", ki18n ("KDE Window Decorator"), "0.0.1"); KCmdLineArgs::addCmdLineOptions (options); args = KCmdLineArgs::parsedArgs (); if (args->isSet ("blur")) { QString blur = args->getOption ("blur"); if (blur == QString ("titlebar")) blurType = BLUR_TYPE_TITLEBAR; else if (blur == QString ("all")) blurType = BLUR_TYPE_ALL; } app = new KWD::Decorator (); if (args->isSet ("sm-disable")) app->disableSessionManagement (); status = decor_acquire_dm_session (QX11Info::display (), QX11Info::appScreen (), "kwd", args->isSet ("replace"), ×tamp); if (status != DECOR_ACQUIRE_STATUS_SUCCESS) { if (status == DECOR_ACQUIRE_STATUS_FAILED) { fprintf (stderr, "%s: Could not acquire decoration manager " "selection on screen %d display \"%s\"\n", argv[0], QX11Info::appScreen (), DisplayString (QX11Info::display ())); } else if (status == DECOR_ACQUIRE_STATUS_OTHER_DM_RUNNING) { fprintf (stderr, "%s: Screen %d on display \"%s\" already " "has a decoration manager; try using the " "--replace option to replace the current " "decoration manager.\n", argv[0], QX11Info::appScreen (), DisplayString (QX11Info::display ())); } return 1; } decor_set_dm_check_hint (QX11Info::display (), QX11Info::appScreen (), WINDOW_DECORATION_TYPE_PIXMAP | WINDOW_DECORATION_TYPE_WINDOW); if (!app->enableDecorations (timestamp)) { fprintf (stderr, "%s: Could not enable decorations on display \"%s\"\n", argv[0], DisplayString (QX11Info::display ())); return 1; } if (QX11Info::appScreen () == 0) appname = "org.kde.kwin"; else appname.sprintf ("org.kde.kwin-screen-%d", QX11Info::appScreen ()); status = app->exec (); delete app; return status; } compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/CMakeLists.txt0000644000015301777760000000314112321343002025110 0ustar pbusernogroup00000000000000project (kde4-window-decorator) option (BUILD_KDE4 "Build KDE 4 window decorator" 1) compiz_set (USE_KDE4 ${BUILD_KDE4}) if (USE_KDE4) find_package(KDE4 4.3.0) find_package(KDE4Workspace) if (KDE4_FOUND AND KDE4Workspace_FOUND) include(KDE4Defaults) include(FindPkgConfig) include(MacroLibrary) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter") add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) qt4_add_dbus_adaptor (kwd4_SRCS org.kde.KWin.xml decorator.h KWD::Decorator kwinadaptor) pkg_check_modules (KWD4 REQUIRED xdamage xrender xcomposite xext) link_directories( ${KWD4_LIBRARY_DIRS} ) include_directories ( ${compiz_SOURCE_DIR}/include ${KWD4_INCLUDE_DIRS} ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${KDE4_PLASMA_INCLUDE_DIR} ${QT_INCLUDES} ) set (kwd4_SRCS main.cpp utils.cpp decorator.cpp window.cpp options.cpp kdecoration_plugins.cpp switcher.cpp paintredirector.cpp ${kwd4_SRCS} ) kde4_add_executable ( kde4-window-decorator ${kwd4_SRCS} ) set_target_properties ( kde4-window-decorator PROPERTIES INSTALL_RPATH_USE_LINK_PATH 0 ) target_link_libraries ( kde4-window-decorator decoration ${KWD4_LIBRARIES} ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBS} ${KDE4_PLASMA_LIBS} kdecorations ) install ( TARGETS kde4-window-decorator DESTINATION ${exec_prefix} ) else (KDE4_FOUND AND KDE4Workspace_FOUND) compiz_set (USE_KDE4 0) endif (KDE4_FOUND AND KDE4Workspace_FOUND) endif (USE_KDE4) compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/kdecorationbridge.h0000644000015301777760000001135412321343013026207 0ustar pbusernogroup00000000000000/***************************************************************** This file is part of the KDE project. Copyright (C) 2003 Lubos Lunak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************/ #ifndef KDECORATIONBRIDGE_H #define KDECORATIONBRIDGE_H #include "kdecoration.h" #include "kdeversion.h" #include /** * @short Bridge class for communicating between decorations and KWin core. * * This class allows communication between decorations and KWin core while allowing * to keep binary compatibility. Decorations do not need to use it directly at all. */ class KDecorationBridge : public KDecorationDefines { public: virtual ~KDecorationBridge() {} virtual bool isActive() const = 0; virtual bool isCloseable() const = 0; virtual bool isMaximizable() const = 0; virtual MaximizeMode maximizeMode() const = 0; #if KDE_IS_VERSION(4,10,90) virtual QuickTileMode quickTileMode() const = 0; #endif virtual bool isMinimizable() const = 0; virtual bool providesContextHelp() const = 0; virtual int desktop() const = 0; virtual bool isModal() const = 0; virtual bool isShadeable() const = 0; virtual bool isShade() const = 0; virtual bool isSetShade() const = 0; virtual bool keepAbove() const = 0; virtual bool keepBelow() const = 0; virtual bool isMovable() const = 0; virtual bool isResizable() const = 0; virtual NET::WindowType windowType(unsigned long supported_types) const = 0; virtual QIcon icon() const = 0; virtual QString caption() const = 0; virtual void processMousePressEvent(QMouseEvent*) = 0; virtual void showWindowMenu(const QRect &) = 0; virtual void showWindowMenu(const QPoint &) = 0; virtual void showApplicationMenu(const QPoint&) = 0; virtual bool menuAvailable() const = 0; virtual void performWindowOperation(WindowOperation) = 0; virtual void setMask(const QRegion&, int) = 0; virtual bool isPreview() const = 0; virtual QRect geometry() const = 0; virtual QRect iconGeometry() const = 0; virtual QRegion unobscuredRegion(const QRegion& r) const = 0; virtual WId windowId() const = 0; virtual void closeWindow() = 0; virtual void maximize(MaximizeMode mode) = 0; virtual void minimize() = 0; virtual void showContextHelp() = 0; virtual void setDesktop(int desktop) = 0; virtual void titlebarDblClickOperation() = 0; virtual void titlebarMouseWheelOperation(int delta) = 0; virtual void setShade(bool set) = 0; virtual void setKeepAbove(bool) = 0; virtual void setKeepBelow(bool) = 0; // not part of public API virtual int currentDesktop() const = 0; virtual QWidget* initialParentWidget() const = 0; virtual Qt::WFlags initialWFlags() const = 0; virtual void grabXServer(bool grab) = 0; }; class KDecorationBridgeUnstable : public KDecorationBridge { public: virtual bool compositingActive() const = 0; virtual QRect transparentRect() const = 0; // Window tabbing using KDecorationBridge::caption; virtual QString caption(int idx) const = 0; virtual void closeTab(long id) = 0; virtual void closeTabGroup() = 0; virtual long currentTabId() const = 0; using KDecorationBridge::icon; virtual QIcon icon(int idx) const = 0; virtual void setCurrentTab(long id) = 0; using KDecorationBridge::showWindowMenu; virtual void showWindowMenu(const QPoint& pos, long id) = 0; virtual void tab_A_before_B(long A, long B) = 0; virtual void tab_A_behind_B(long A, long B) = 0; virtual int tabCount() const = 0; virtual long tabId(int idx) const = 0; virtual void untab(long id, const QRect& newGeom) = 0; virtual WindowOperation buttonToWindowOperation(Qt::MouseButtons button) = 0; }; #endif compiz-0.9.11+14.04.20140409/kde/window-decorator-kde4/kdecoration_plugins.h0000644000015301777760000000544512321343002026575 0ustar pbusernogroup00000000000000/***************************************************************** This file is a copy of the KWin internal API. It allows the KDE4 window decorator the loading of KWin decoration plugins. Copyright © 2008 Dennis Kasprzyk ****************************************************************** This file is part of the KDE project. Copyright (C) 1999, 2000 Daniel M. Duley Copyright (C) 2003 Lubos Lunak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************/ #ifndef KWD_KDECORATION_PLUGINS_H #define KWD_KDECORATION_PLUGINS_H // // This header file is internal. I mean it. // #include #include #include "kdecoration.h" class KLibrary; class KDecoration; class KDecorationBridge; class KDecorationFactory; namespace KWD { class KDecorationPlugins : public KDecorationProvides { public: KDecorationPlugins(const KSharedConfigPtr &cfg); virtual ~KDecorationPlugins(); bool loadPlugin( QString name ); void destroyPreviousPlugin(); KDecorationFactory* factory(); KDecoration* createDecoration( KDecorationBridge* ); QString currentPlugin(); bool reset( unsigned long changed ); // returns true if decorations need to be recreated protected: virtual void error( const QString& error_msg ); QString defaultPlugin; // FRAME normalne protected? private: KDecorationFactory* (*create_ptr)(); KLibrary *library; KDecorationFactory* fact; KLibrary *old_library; KDecorationFactory* old_fact; QString pluginStr; KSharedConfigPtr config; }; /* Plugins API: KDecorationFactory* create_factory(); - called once after loading */ } /** @} */ #endif compiz-0.9.11+14.04.20140409/kde/CMakeLists.txt0000644000015301777760000000005012321343002020770 0ustar pbusernogroup00000000000000add_subdirectory (window-decorator-kde4)compiz-0.9.11+14.04.20140409/COPYING.MIT0000644000015301777760000000210512321343002017153 0ustar pbusernogroup00000000000000 Copyright © 2005 Novell, Inc. Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Novell, Inc. not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Novell, Inc. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.compiz-0.9.11+14.04.20140409/config.h.core.in0000644000015301777760000000020412321343002020440 0ustar pbusernogroup00000000000000#define PACKAGE_STRING "@_compiz_package_string@" #define PACKAGE "@_compiz_package@" #define GETTEXT_PACKAGE "@GETTEXT_PACKAGE@" compiz-0.9.11+14.04.20140409/ChangeLog0000644000015301777760000203312712321343002017254 0ustar pbusernogroup00000000000000Merge: 86bbd39 a7f5dbb Sam Spilsbury 2011-08-20 Merge upstream Sam Spilsbury 2011-08-20 Bump VERSION to reflect temporary release Sam Spilsbury 2011-08-20 Fix stray .reset () Merge: 1be316e 126f2a2 Sam Spilsbury 2011-08-20 Merge upstream Merge: 1852f86 1852f86 Sam Spilsbury 2011-08-20 Merge upstream Sam Spilsbury 2011-08-20 Bump VERSION Sam Spilsbury 2011-08-20 Update NEWS for 0.9.5.92 Merge: 8495379 825d16b Sam Spilsbury 2011-08-19 Merge upstream Merge: 825d16b c9b0a19 Sam Spilsbury 2011-08-19 Merge in lp:~compiz-team/compiz-core/compiz-core.add_doc_for_decor Merge: 41f088c c12c848 Sam Spilsbury 2011-08-19 Merge lp:~compiz-team/compiz-core/compiz-core.distortion_fixes Merge: b0a1b5e 3504586 Tim Penhey 2011-08-19 Merge lp:~thumper/compiz-core/fix-crash-on-event-source-cleanup Sam Spilsbury 2011-08-19 Fix some other places we were using priv->attrib incorrectly Sam Spilsbury 2011-08-19 Added comment explaining why we can't do that Merge: 01d92ab b0a1b5e Sam Spilsbury 2011-08-19 Merge trunk Tim Penhey 2011-08-19 Don't have a wrapped CompEventSource as there is a bug in the destruction code. Tim Penhey 2011-08-19 Explicit constructors only make a difference when there is the ability to pass in a single argument. Tim Penhey 2011-08-19 Header now says to create an unwrapped event source. Tim Penhey 2011-08-19 Create an unwrapped CompEventSource. Merge: ab71bc8 9f4cdd6 Sam Spilsbury 2011-08-19 Merge Merge: 9f4cdd6 a8d1bcd Sam Spilsbury 2011-08-19 Merge in ICCCM 4.1.4 support Sam Spilsbury 2011-08-18 Correctly support ICCCM Section 4.1.4 Sam Spilsbury 2011-08-13 Don't damage the paint rectangle in normal resize mode (fixed valgrind warning) Sam Spilsbury 2011-08-13 Use priv->geometry rather than priv->attrib, since priv->attrib could be updated by XGetWindowAttributes which is a synchronous operation Sam Spilsbury 2011-08-13 Don't check against the XWindowAttributes that are stored when sending resize notfications, since they could have been updated synchronously with XGetWindowAttributes and could be out of sync with the geometry last received from the server which is what we need to process requests based on. Fixes cases where plugins didn't get that geometry update because of this condition, which caused bugs like distorted windows in opengl since the window matrices were wrong Sam Spilsbury 2011-08-12 memset the active window history so that we aren't jumping on unitialized garbage in the array of windows Time Penhey 2011-08-12 Merge in flags change for dlopen () on debug builds (dlclosing () with valgrind is a bit useless) Time Penhey 2011-08-12 Merge in source reset change Merge: 28cab1d e6cb461 Sam Spilsbury 2011-08-12 Merge in GSettings CMake file change Sam Spilsbury 2011-08-10 Disable core-settings-schema too Sam Spilsbury 2011-08-10 Add option to disable GSettings schema generation Ville Syrjala 2011-08-02 [PATCH] Don't unredirect overlay windows until we have set the new bounding shape for the output window. Unredirecting them before this time meant that they were stacked underneath the overlay window and changing the bounding shape of the output window would cause an expose event to be sent to the overlay window causing a breif flicker as it redraws. Unredirecting after this means that no expose event is sent because the backing store is only set again after the bounding shape of the output window has been changed Merge: ceab806 f2b2dc4 Sam Spilsbury 2011-07-29 Merge trunk Merge: f2b2dc4 c9b0a19 Sam Spilsbury 2011-07-29 Merge in doc for decor Merge: 7347a7c 3bdb2ef Andrea Azzarone 2011-07-28 Merge in lp:~andyrock/compiz-core/fix-1309 Andrea Azzarone 2011-07-27 If an argument to a strcmp function has an invalid value (null pointer, etc.) the behavior is undefined. Merge: 3264985 4217940 Sam Spilsbury 2011-07-27 Merge Merge: a44844f 4bb1f70 Sam Spilsbury 2011-07-27 Merge in gsettings schema generation Sam Spilsbury 2011-07-26 Use relocatable keys Sam Spilsbury 2011-07-26 Merge in gsettings schema generation Scott Moreau 2011-07-14 Merge in default value change for obs Sam Spilsbury 2011-07-14 Fix typo, also add files that are being copied into staging Sam Spilsbury 2011-07-14 Bump VERSION Sam Spilsbury 2011-07-14 Update NEWS for 0.9.5.0 Sam Spilsbury 2011-07-14 Revert "Update NEWS for 0.9.5.0" This reverts commit a6e2ea3adf61e57bdcd4c5c957ce8e7223a9fb0b. Sam Spilsbury 2011-07-14 Revert "Bump VERSION" This reverts commit bedeff5d74a2786dd2751fab9e48bf3f96b7790e. Sam Spilsbury 2011-07-14 Revert "Update NEWS for 0.9.5.0" This reverts commit f37eda58232743ce28eb780075c1a4b73545a209. Merge: 2804807 bedeff5 Sam Spilsbury 2011-07-14 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-07-14 Bump VERSION Sam Spilsbury 2011-07-14 Update NEWS for 0.9.5.0 Sam Spilsbury 2011-07-14 Bump VERSION Sam Spilsbury 2011-07-14 Update NEWS for 0.9.5.0 Sam Spilsbury 2011-07-14 Merge in build fix and debug message removal Sam Spilsbury 2011-07-14 Fix for bad merge, unbreak plugin build Sam Spilsbury 2011-07-14 Merge in build changes Sam Spilsbury 2011-07-13 Disable BUILD_KDE4 in the distcheck target for now as upstream KDE has moved some header files around and this is breaking the build check Sam Spilsbury 2011-07-08 Merge in fix to ftbfs in some cases Merge: ee98496 e43159f Sam Spilsbury 2011-07-08 Merge in lp:~smspillaz/compiz-core/compiz-core.dist-buildsystem and turn CTest on by default for everything Sam Spilsbury 2011-07-08 Nitpicking and fix FTBFS on bzr Sam Spilsbury 2011-07-08 Drop support for bz2, add targets for release uploads, cleanup Sam Spilsbury 2011-07-07 Add various fixes for distcheck, source distributions without a VCS and non-C sources (eg python bindings where we can't do try_compile because C and CXX are not in the enabled languages) Sam Spilsbury 2011-07-07 Add a proper set of a release targets in the CMake buildsystem for all compiz projects to use make release-prep: generates NEWS ChangeLog and AUTHORS file make distcheck: generates a tarball make release-signoff: signs the tarball using the key in RELEASE_KEY and if in a git repository, creates tags and branches for that Sam Spilsbury 2011-07-07 Add VERSION file Merge: 0550e09 b9d6583 Sam Spilsbury 2011-07-07 Merge in lp:~unity-team/compiz-core/compiz-core.fix_706918 and hook PluginClassHandler tests into make test Merge: a1268e2 7844ea3 Sam Spilsbury 2011-07-07 Merge in lp:~unity-team/compiz-core/compiz-core.fix_722830 Merge: f914d15 ab21ddc Sam Spilsbury 2011-07-07 Merge in lp:~unity-team/compiz-core/compiz-core.fix_802373 Merge: faf527f 82a73b8 Sam Spilsbury 2011-07-07 Merge in lp:~smpillaz/compiz-core/compiz-core.fix_804683 Sam Spilsbury 2011-07-07 Remove debugging code Sam Spilsbury 2011-07-07 Move timer tests into tests/timer/ Sam Spilsbury 2011-07-07 Revamp the unit tests, split into four separate tests, one for implicit creation on get, one for construction, one for type names and one for index sanity checking Sam Spilsbury 2011-07-07 Initialize index even if allocating the plugin class failed due to a buggy base class Sam Spilsbury 2011-07-06 Add missing files Sam Spilsbury 2011-07-06 Remove useless #warning Sam Spilsbury 2011-07-06 Split tests up into files, poke timer.cpp, make test-timer link to the tests and enable CTest Sam Spilsbury 2011-07-06 Add missing file Sam Spilsbury 2011-07-05 Test for basic value modification Sam Spilsbury 2011-07-05 Return 1 on the program if the test fails Sam Spilsbury 2011-07-05 Add more tests for timers Sam Spilsbury 2011-07-05 Add unit tests for timers Sam Spilsbury 2011-07-05 Break the dependency between CompTimeoutSource and CompTimer Sam Spilsbury 2011-07-05 Use a private implementation for CompTimer Sam Spilsbury 2011-07-05 Further break the dependency of timers on screen Sam Spilsbury 2011-07-04 Break CompTimer's dependency on CompScreen Sam Spilsbury 2011-07-04 Avoid useless calls to ::stop (). Also put ::get_time after ::attach because the source must always be attached before the monotonic time can be retreived Sam Spilsbury 2011-07-04 Don't use clock_getttime () directly, as there are some cases where that clock can run backwards and cause our timers to mess up. GLib handles this case for us, use Glib::Source::get_time in that case Sam Spilsbury 2011-06-29 Added a distcheck target Sam Spilsbury 2011-06-29 Add a more comprehensive dist target which detects running in bzr, git, git with submodules and in no vcs and makes a tarball no matter what and the right way Sam Spilsbury 2011-06-27 Convert to bell option Sam Spilsbury 2011-06-25 Added PluginClassHandler test Sam Spilsbury 2011-06-25 Abstract out CompPrivate storage from CompScreen so we can make it testable Sam Spilsbury 2011-06-24 Use priv->border instead of priv->input as the EWMH says that applications which request to move their windows (through a normal ConfigureRequest) should take into account the decoration extents and not the border extents. Fixes LP#722830 Merge: d0f83cc 4d0f3bb Sam Spilsbury 2011-06-23 Merge in fix for LP#800592 Sam Spilsbury 2011-06-23 Fix double call to ::updateAttributes where raise on click is enabled and grabbing a window to move it would also raise the window Sam Spilsbury 2011-06-23 Fix warnings Sam Spilsbury 2011-06-23 Fix typo which caused docks to be stacked relative to override redirect windows and unmapped windows or other docks when shuffling stacking to be below fullscreen windows that are active Sam Spilsbury 2011-06-18 Add documentation for the decor plugin Merge: 291627c 40849c0 Sam Spilsbury 2011-06-18 Merge in fix for bad merge Sam Spilsbury 2011-06-18 Fix typo which caused decorations to be updated recursively because CompWindow::resize () would always send fake resize notify events to core which would then cause CompWindow::resize () to be called again with no geometry change etc etc Sam Spilsbury 2011-06-17 Refactor the code somewhat Sam Spilsbury 2011-06-17 Make ::get () return a new class instance and initialize the index if it hasn't been done already for this particular kind of class. Fixes LP#706918 Sam Spilsbury 2011-06-16 Fix typo which caused decorations to be updated recursively because CompWindow::resize () would always send fake resize notify events to core which would then cause CompWindow::resize () to be called again with no geometry change etc etc Merge: 6fc939d 9dfc108 Sam Spilsbury 2011-06-09 Fixes LP#795065 ------------- This line and the following will be ignored -------------- modified: src/window.cpp unknown: build/ po/compiz.pot pending merges: Sam Spilsbury 2011-05-25 Fix events going to frame windows when they sho... Merge: 9e6c11d a282aba Sam Spilsbury 2011-06-09 Fixes LP#761616 ------------ This line and the following will be ignored -------------- modified: src/screen.cpp src/window.cpp unknown: build/ po/compiz.pot pending merges: Sam Spilsbury 2011-05-25 Restore selected event masks already rather tha... Merge: 79fe2cd 08828ed Sam Spilsbury 2011-06-09 Merge in lp:~unity-team/compiz-core/compiz-core.one_property_decor Merge: 901d4a1 c6291da Sam Spilsbury 2011-06-09 Merge in ~unity-team/compiz-core/compiz-core.bits_and_pieces_2011_05_21 Merge: 2e57966 0545c16 Sam Spilsbury 2011-06-09 Merge in dock stacking fix Merge: 67e833c 32affe0 Sam Spilsbury 2011-06-09 Merge in emacs fix Merge: c6f456e a02b427 Sam Spilsbury 2011-06-09 Merge in Scott's change from upstream Merge: f3a1776 f3a1776 Sam Spilsbury 2011-06-09 Merge in relevant branches Scott Moreau 2011-05-27 Redetect devices unconditionally when handling ConfigureNotify event. This fixes the case where an output was moved but outputChangeNotify is not called. Merge: 2550d7e e6afcfd Sam Spilsbury 2011-06-01 Merge in bell fix Sam Spilsbury 2011-06-01 Fix typo in initBellValue which stopped bell actions from working Merge: 17a6530 b4d9e29 Sam Spilsbury 2011-05-31 Merge in from lp:compiz-core Merge: 763acbb 6e4da8c Sam Spilsbury 2011-05-31 Merge in frame fix for switcher decorations Merge: b4d9e29 a9ac70d Sam Spilsbury 2011-05-31 Merge to fix broken copytex plugin Merge: 698db76 dd8ec2a Sam Spilsbury 2011-05-31 Fix some tray icons appearing at 1px, check the override redirect state and window parent at unreparent and reparent time. Merge: a39f7e3 a39f7e3 Sam Spilsbury 2011-05-31 Merge Sam Spilsbury 2011-05-31 Fix crash with copytex. Use shared_ptr Sam Spilsbury 2011-05-30 Ensure the switcher window is unmapped after the switcher goes away Sam Spilsbury 2011-05-30 Fix windows appearing at small sizes Sam Spilsbury 2011-05-28 Fix typo in comment Sam Spilsbury 2011-05-28 Typo Sam Spilsbury 2011-05-28 Read the current override redirect state as the client may have changed it while CreateNotify is being processed and thus we could be reparenting and override redirect window. Also ensure that when unreparenting windows that their parent is still the wrapper window, otherwise don't bother to reparent them back into the root window, this will only cause trouble. Fixes LP#767095 Sam Spilsbury 2011-05-26 XSync right after configureXWindow in cases where we need to immediately reorder the window stack. This isn't a real fix, but at least fixes the following situation without breaking the API and ABI Windows stacked A, B, C Plugin does: C->raise (), B->raise (), A->raise () Window list should read at this point: ... C, B, A ... (screen->windows ()) However, the output buffer hasn't been flushed at this point so server side we will have A, B, C. Now if a sneaky client tries to restack A above C, we will get the ConfigureRequest for that, and instead of getting B, C, A like the client expects, we'll actually get C, B, A. The real solution is to have a list of windows last sent to the server and a list of windows last recieved by it. That way plugins can mess with the internal stack all they want, but when recieving events for X as to the actual state of things, they can restack relative to the server list. Sam Spilsbury 2011-05-25 Fix events going to frame windows when they shouldn't since the client is already unmapped and there is no reason a huge frame window should block input when the client is animating out anyways Sam Spilsbury 2011-05-25 Restore selected event masks already rather than using hardcoded ones Fixes LP #761616 where edge buttons wouldn't work because we'd select for button events and then they wouldn't get restored at all Merge: 342ad2f 3ea8ae7 Sam Spilsbury 2011-05-20 Merge git://git.compiz.org/compiz/core Scott Moreau 2011-05-17 Use CMAKE_PREFIX_PATH when searching for libraries. Scott Moreau 2011-05-13 * Bump version to 0.9.5 Sam Spilsbury 2011-05-08 Add hack to allow the KDE4 Window decorator to work correctly with the new decoration interface, until KDE4 Window decorator is re-written to allow for decoration lists. Note that this gives public access to KWD::Decorator, which is a bad thing. The way this works is to create two separate frames for inactive and active decoration, and when one property is written to update the other. Sam Spilsbury 2011-05-08 Remove setting of "_COMPIZ_WINDOW_DECOR_NORMAL" put decorations with state == ~DECOR_WINDOW_FOCUS in the default decorations list instead Sam Spilsbury 2011-05-08 Remove DECOR_NORMAL, just read all default decorations from a property and match the state Sam Spilsbury 2011-05-08 Remove DECOR_NORMAL_ATOM_NAME, the API is now to put all default decorations in a list in one property Scott Moreau 2011-05-06 Respect CMAKE_PREFIX_PATH and CMAKE_INCLUDE_PATH when searching for headers. Sam Spilsbury 2011-05-08 Place relative to frame size Sam Spilsbury 2011-05-08 Fix variable mismatch Sam Spilsbury 2011-05-08 Use bitwise or, not and. Sam Spilsbury 2011-05-07 Clean up type detection code, move into its own function Sam Spilsbury 2011-05-07 Check the actual decor properties on the window and not the default ones Sam Spilsbury 2011-05-07 Support -std=c++0x Sam Spilsbury 2011-05-07 Support new decoration API Sam Spilsbury 2011-05-07 Support different frame types, states and actions in frame properties Sam Spilsbury 2011-05-07 Support multiple frames and frames of different types, states, etc in the decor plugin Sam Spilsbury 2011-05-07 Bump decoration API Sam Spilsbury 2011-05-07 Update API to allow multiple frames in one property (frame caching, multiple default frame styles) and also to allow decorators to specify in the frame property which window types, states and actions the frames should apply to Sam Spilsbury 2011-05-04 Add modal dialog type and also fix typo Sam Spilsbury 2011-05-04 Fix warning Sam Spilsbury 2011-05-04 Restack docks primarily when the focus changes to support cases where we change viewports and dock windows need to be restacked even though the window that we switched to wasn't restacked. Also support always-on-top and fullscreen windows. Sam Spilsbury 2011-05-03 Send a fake configure notify event when the window size doesn't change on frame update since other plugins need to know when the client window changed geometry. Scott Moreau 2011-04-30 Add resize_from_center option. Scott Moreau 2011-04-30 Cleanup resize options. Sam Spilsbury 2011-05-01 Fix stupid porting bug that allowed windows like emacs to resize themselves off the edge of the screen Sam Spilsbury 2011-04-30 Use premultiplied alpha in resize outline and border Sam Spilsbury 2011-04-30 Check if ancestor to transient is allowed to have focus before granting focus to it. Some stupid apps like thunderbird unmap the transient parent before unmapping the child, so compiz will get all confused and try to give focus to the unmapped window Sam Spilsbury 2011-04-30 Track windows on CreateNotify again, don't rely on trying to beat the race condition by putting that on MapRequest, instead check at reparent time if the window has already been reparented server-side and don't reparent it again. Sam Spilsbury 2011-04-30 Don't crash if switch window can't be found Sam Spilsbury 2011-04-30 Set correct DISPLAY env when launching commands. Do not force :0 Sam Spilsbury 2011-04-30 Also take into account server border geometry when positioning Sam Spilsbury 2011-04-30 Always take into account border geometry when calculating actual window size since we make an XGetGeometry call and take into account the border when comparing sizes there. Fixes resize bugs with xterm Sam Spilsbury 2011-04-30 Release implicit grabs as soon as we handle events. Implicit keyboard grabs which are created by the pressing and holding of a key that was passively grabbed by XGrabKey are evil for a number of reasons.First of all, there isn't any way to track them or to track which window they are grabbed on so if a plugin makes an active grab and then releases it, the passive grab is released on release, which means there is an inconsistency between holding the key and having the grab. Secondly, if plugins actually need a grab on all keys, they are better switching to an active grab rather than relying on the passive one. Finally, if there is a passive grab by another application by a key-modifier combo which has the same modifier mask as the currently activated passive grab, then it means that this application won't get its grab activated as long as the modifier is held down. Sam Spilsbury 2011-04-30 Also check match options before defaulting to global option Sam Spilsbury 2011-04-30 Don't ignore the match value when setting centered on xkbevent Sam Spilsbury 2011-04-30 Fix indentation Sam Spilsbury 2011-04-30 Always monitor key events even when window isn't grabbed Sam Spilsbury 2011-03-23 Bump core ABI Sam Spilsbury 2011-03-23 Don't treat synthetic UnmapNotify the same as the real UnmapNotify ICCCM section 4.1.4 says that applications need to send us a synthetic UnmapNotify to tell us that the window has been withdrawn in all cases to cover the case where a window is already unmapped and then withdrawn. In this case we should handle the UnmapNotify as a request to withdraw the window, but we should only handle the *real* UnmapNotify request as a request to actually process the window being unmapped and withdraw it there, rather than processing both twice and withdrawing the window twice Sam Spilsbury 2011-03-22 Revert "If an unexpected window gets focus (e.g. by a client calling XSetInputFocus directly), make sure that moving the input focus to a default window still works when that window is closed." This reverts commit 1fb701594b78e950c031974d83c3566d1d648156. There are some problems created by this commit, reverting for now until they can be evauluated Conflicts: src/event.cpp Scott Moreau 2011-03-18 Remove unused macro. Sam Spilsbury 2011-03-18 Set unmanaging before managed Sam Spilsbury 2011-03-18 Only set w->unmanaging if the window was actually managed 84a27e08e8e2f6c3a70ee7966624411e0e330db4 to master Forward port Merge: 0b2ed28 08ba72d Sam Spilsbury 2011-03-18 Merge https://github.com/robtaylor/compiz Sam Spilsbury 2011-03-18 Fix warning Scott Moreau 2011-03-18 If the root window gets focus, unset activeWindow before calling focusDefaultWindow to make sure the latter really focusses another window. Forward port 33f695e7c6e4fb8ac627df0978fea7771fe1b3d5 to master Scott Moreau 2011-03-18 If an unexpected window gets focus (e.g. by a client calling XSetInputFocus directly), make sure that moving the input focus to a default window still works when that window is closed. 556b681adaab3fe27fa456037be82e902dd371be to master Forward port Scott Moreau 2011-03-18 Don't grant focus to override_redirect windows. Most other window managers don't even track override_redirect windows, so applications relying on the focus being granted to override_redirect windows are broken anyway. Forward port 30a92d8a060d79181a28840d7c66428ef431200c to master Scott Moreau 2011-03-18 Don't let focus stay on the root window. It may happen that the root window is focussed, e.g. by some client calling XSetInputFocus with the root window as target. As that most likely isn't what the user wants, focus the default window instead. Forward port a9a35b6034517404b0c3ed4296f0c33d7d8d1d11 to master Sam Spilsbury 2011-03-18 Make sure that window has the correct parent on unmanagement. Reparenting the window will cause an UnmapNotify to be sent whcih will cause us to unreparent the window and reparent it into the root window. In the case where the application wanted to reparent a toplevel window we need to make sure that we put the window back in the parent where the client actually requested it to go when we get the ReparentNotify Rob Taylor 2011-03-16 If there's a sesion manager, ask it to always restart compiz. Rob Taylor 2011-03-16 CompOption::Class had virtual functions without a virtual destructor. That's usually bad. Rob Taylor 2011-03-16 Region type in x is typedef struct _XRegion *Region. That means returning a const Regsion makes no sense - that's setting the returned pointer to const. Sam Spilsbury 2011-03-16 Also remove windows from createdWindows list if they were reparented into something else Sam Spilsbury 2011-03-15 Reflect difference between actual input frame geometry and border extents in the core API Sam Spilsbury 2011-03-13 Process changes to edge windows when skipping events on pointer warp There's a condition that can happen where we skip the events generated by XWarpPointer and this causes the edge window reference to stay on the same window, which is a problem when using edges since certain button bindings would stop working. The new behaviour is to always update the edge window reference whenever processing enter and leave events caused by pointer warps Merge: f777234 011a611 Sam Spilsbury 2011-03-12 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-03-12 Add support for a "focus on switch" option which toggles whether or not the window should appear focused when switching between windows Sam Spilsbury 2011-03-12 Don't trash the pixmaps of windows that were hidden but don't have mapNum == 0 since that case only happens where windows are actually closed or unmanaged Sam Spilsbury 2011-03-12 Don't need to modify priv->width, priv->height since those are representative of the server side window and not the pixmap size Sam Spilsbury 2011-03-11 Don't unreparent the window until plugins are finished with animations and such (eg, not while an unmap reference is held) and don't dump the pixmap of the window if it is resized and unreparented and the plugins hold a reference to it Sam Spilsbury 2011-03-11 Don't throw out the textures of windows that got resized or re/unreparented while plugins hold an unmap reference to them as it is pretty likely that those plugins need that data for animations Sam Spilsbury 2011-03-11 Don't update windows in some cases where there is an unmap reference since it is likely that plugins are using them for animations. However, do allow decorations to be changed where the dm asks us to. Also set frame extents to 0 explicitly when the window is unreparented Sam Spilsbury 2011-03-11 Revert "Don't refuse to update frame extents for windows that have an unmap reference" This reverts commit 86358da783bc7152c8fbe8a39d883ac922de5958. Sam Spilsbury 2011-03-11 Don't refuse to update frame extents for windows that have an unmap reference The previous rationale for not updating these extents is that doing so will cause a resizeNotify on windows that are currently being unmapped or that plugins have delayed from being unmapped and this will cause core to throw out the texture of those windows. A better solution here would be to not throw out the decoration pixmap and texture for windows that are currently being unmapped (and also not throwing out the pixmap in the composite plugin), since it would be likely that plugins are using them for animations Sam Spilsbury 2011-03-07 "Update CMake Version" Sam Spilsbury 2011-03-07 "Update news for 0.9.4 release" Sam Spilsbury 2011-02-28 Fix gtk-w-d crashing when removing decoration. Also try to detect when windows are modal and give them modal type decorations and move freedesktop.png to cube where it will actually be used Sam Spilsbury 2011-02-28 Fix the loading and installation of images - core images should be under the core plugin, freedesktop.png moved to cube and load images based on the actual install dirs Sam Spilsbury 2011-02-27 Don't pass uninitialized value to plugins needing to update output extents Plugins need to check against this value in order to see if they should change the extents of the decoration area on windows, don't send them uninitialized garbage when doing that. Sam Spilsbury 2011-02-24 Fix broken build Sam Spilsbury 2011-02-24 Specify plugin name when loading images to find the correct image loading dir for plugins which don't specify absolute paths to their images Sam Spilsbury 2011-02-24 Fix mismatched brace Merge: 1c9eb6d 9849ca3 Sam Spilsbury 2011-02-24 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-02-24 Remove debugging message Sam Spilsbury 2011-02-24 Don't override the user's PKG_CONFIG_PATH with the CMAKE_INSTALL_PATH unless the user explicitly changed the CMAKE_INSTALL_PATH. Rationale: If the user has their PKG_CONFIG_PATH set to /foo/bar they would expect that when doing things like, eg installing plugins locally (which ignores CMAKE_INSTALL_PREFIX), that the buildsystem would pick up pkg-config files from their PKG_CONFIG_PATH which they have specified themselves and not the default CMAKE_INSTALL_PREFIX, however when the user changes the CMAKE_INSTALL_PREFIX they need to have that be used for pkg-config purposes. Sam Spilsbury 2011-02-24 Track focus changes for destroyed windows too since we'll change the focus later anyways Sam Spilsbury 2011-02-24 Nuke warning Sam Spilsbury 2011-02-24 Preprocessor abuse to handle the Gtk+ 2.24 transition Merge: a30a8ee 54d17f0 Sam Spilsbury 2011-02-23 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-02-23 Check if we're resizing from a grab handle first (eg isConstrained) before using constraint area. Fixes crash when using alt + button2 to resize and hitting an edge Travis Watkins 2011-02-22 stop using deprecated gdk functions Merge: e2ead0a 3eda41c Sam Spilsbury 2011-02-23 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-02-23 Fix crash on exit Scott Moreau 2011-02-22 Use glib CLAMP macro. Scott Moreau 2011-02-22 Remove unnecessary definition. Sam Spilsbury 2011-02-22 Remove debug message Scott Moreau 2011-02-22 Avoid using reserved definition. Adam Williamson 2011-02-22 Generate GConf Schema files even if we don't want to install them Adam Williamson 2011-02-22 Import CFLAGS and CXXFLAGS env variables Sam Spilsbury 2011-02-22 s/Novell Inc./Canonical Ltd./ in eventsource.cpp copyright Merge: 7c0ba73 96eaecc Sam Spilsbury 2011-02-22 Merge branch 'master' of git://git.compiz.org/compiz/core Conflicts: gtk/window-decorator/decorator.c Sam Spilsbury 2011-02-21 Fix initial stacking issues Sam Spilsbury 2011-02-21 Fix down-left shift and wrong offsets for default decorations. Initialize settings before creating decoration frames Sam Spilsbury 2011-02-21 Relicence eventsource.cpp to MIT Sam Spilsbury 2011-02-21 Fix memory leaks - Use gtk_main_quit (); - Don't create gconf clients where we don't need to Sam Spilsbury 2011-02-21 Remove dead code Sam Spilsbury 2011-02-21 Update copyright info Sam Spilsbury 2011-02-21 Fix title scales not updating on theme change Sam Spilsbury 2011-02-21 Also store correct pointer type and unref on exit Sam Spilsbury 2011-02-21 Prevent spurious frame creation and deletion Bare, default and switcher decorations never change and they need to come and go, so keep references to them Sam Spilsbury 2011-02-21 Fix 2D Mode. Don't refresh shadow info (and check windows in paint list) if compositing is not active and set the border and max border properties for the default window type decoration (Without these properties, CompWindow::input () would return 0,0,0,0 and an output frame wouldn't be created) Sam Spilsbury 2011-02-21 Initialize variable. Fixes valgrind warning Sam Spilsbury 2011-02-21 Check if string is empty correctly. Fixes checks for CMAKE_BUILD_TYPE string being empty always returning true and thus the CMAKE_BUILD_TYPE being set to something the user didn't want Sam Spilsbury 2011-02-21 Read w->input () rather than the internal input extents. This provides information about the current state of the decoration extents in core, rather than our own information about the window decoration itself. Reverts part of 4ae95852e53075caed15586620127f0c1405fe474 Fixes unresponsive decorations in kde4-window-decorator and decorations initially "not responding" when you click on them (b.c.o #20) Sam Spilsbury 2011-02-20 Set default value for vpSize before loading plugins. There is a race where vpSize won't be updated to its "true value" until we reach core's option change callback or we read the value from the configuration plugin. Since we load all the plugins at once on screenInitPlugins on the command line, some plugins require that this value be set to *something* (It can be changed later) before they are initialized. Fixes incorrect vertex settings with cube, causing it to zoom out infinitely when switching viewports when loaded when compiz starts Sam Spilsbury 2011-02-19 Sync after ungrabbing the server. Turns out that XUngrabServer is not a synchronous call, so there is a race condition with the new startup order where the ungrab server request will sit in the output buffer waiting to be processed and the server won't actually be ungrabbed when we start loading plugins. This can have all kinds of side effects, for example when initializing GConf with GDBus, there will be a call to dbus-launch --autostart to try and get the session bus ID which will fail if there is still a server grab that hasn't been released (since it attempts to read X11 properties) Fixes LP: #691561 Sam Spilsbury 2011-02-19 Map and unmap the switcher window directly Sam Spilsbury 2011-02-19 Update TODO Sam Spilsbury 2011-02-19 Cleanup init_settings some more, move the switcher stuff out into the frame ctor and move USE_GCONF into one big ifdef Sam Spilsbury 2011-02-19 Store settings data in its own struct Prevents namespace issues and makes it more clear where to access this data. Sam Spilsbury 2011-02-18 Cleanup. Move things to where they should be, remove dead code Sam Spilsbury 2011-02-18 Add memory management to frames We don't need to keep all the frame definitions around in memory all the time, so refcount them and only add them if we actually need them. Sam Spilsbury 2011-02-17 Add frame types system, allocate to hash table and use them to manage frames Sam Spilsbury 2011-02-17 Add frames refcounting system Sam Spilsbury 2011-02-17 Cleanup meta_update_border_extents function Don't need to retrieve the frame all the time, just get it once Sam Spilsbury 2011-02-17 Cleanup decor_frame_type is available in decor_t now, so no need to get that manually Sam Spilsbury 2011-02-17 Added simple frames management system. Right now this just keeps the frames in a private area and returns a pre-allocated frame, but it will be expanded to allow reference counting on frames and allocation on-demand Sam Spilsbury 2011-02-17 Generalize shadow_only decoration into window decorations list Remove debug message Sam Spilsbury 2011-02-16 Remove more dead code Sam Spilsbury 2011-02-16 Generalize switcher into another decoration frame type Sam Spilsbury 2011-02-16 Move _default_decoration into another decor_frame_t in decor_frames No need to have another structure lying around for this ... Sam Spilsbury 2011-02-16 Fix shadows of non-default frame windows Include frame information when drawing the shadow outline and also get the metacity frame type from this information rather than the WnckWindow Sam Spilsbury 2011-02-16 Fix cairo mode * Make sure we set the theme fptrs for get_title_scale on startup * Use the frame reference in the decor_t since that works for default decorations too Sam Spilsbury 2011-02-15 Fix crash when changing theme Connect up the signal handler for the style change correctly. Sam Spilsbury 2011-02-15 Make the switcher a decoration frame. It is still separate to the normal "window type" decoration, but at least now it has access to everything it needs Sam Spilsbury 2011-02-15 Allow different font types in frames. Currently we used a single PangoContext and PangoFontDescription for everything ... this resulted in custom frames having the same titlebar size which wasn't any good. This commit changes a lot, namely: * Frame is now linked to the decoration object itself * Moved style windows into the frame * Moved font context and font description into the frame * Added API for getting the titlebar font size: obviously with the cairo decorations there isn't supposed to be any kind of visual difference here but with the metacity decorations we need to get that directly from libmetacity. It should be noted that these commits are in need of a cleanup ... which is coming in the next few commits. Sam Spilsbury 2011-02-14 Add frame management system There are different types of frames that we will need to support - like the GIMP's utility toolbox windows - we need to have stored separate frames in order to support them Sam Spilsbury 2011-02-14 Add definitions for different border types Sam Spilsbury 2011-02-14 Add support for drawing with different metacity theme types Sam Spilsbury 2011-02-13 Don't catch resize notifications on startup DecorWindow::update might call updateWindowOutputExtents which calls ::resizeNotify ... since this loops over all windows it is not safe to have this function called. Sam Spilsbury 2011-02-12 Remove debugging message Sam Spilsbury 2011-02-12 Slight optimization. Don't recalculate clip region on every paint, but only where it makes sense to. Sam Spilsbury 2011-02-12 Fix artefacts in shadow clipping. Intersect the clip region already computed by core with the output region of the window so that we don't display parts of the window that might be occluded Sam Spilsbury 2011-02-12 Clip shadows where it makes sense Merge: a88ce82 e1dc3f2 Sam Spilsbury 2011-02-11 Merge branch 'master' of git://git.compiz.org/compiz/core Conflicts: gtk/window-decorator/decorator.c Merge: bd14afd c68018c Sam Spilsbury 2011-02-11 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Merge: f5f41b9 09fe54a Sam Spilsbury 2011-02-11 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-02-11 Convert modifier masks from virtual to real ones before grabbing button. Also skip ignored modifier if it is also in the cleared ignored bits Sam Spilsbury 2011-02-11 Remove "semi-tracked" created windows on DestroyNotify. Fixes LP: #709461 Sam Spilsbury 2011-02-10 Make the switcher window being override redirect. Previously the switcher window was a normal managed window (which the switcher plugin actually lied about, see SwitchWindow::managed), such that the decorators could pick it up and draw the switcher decoration. However now with reparenting, this means that whenever we actually manage and unmanage the switcher window (eg with map and unmap) it means we must also reparent the window, which floods the server with requests and makes the switcher slow. Since we don't interact with the switcher window, it makes no sense to manage it like this, so make it override redirect Jason Smith 2011-02-05 Minor stacking fix Sam Spilsbury 2011-02-03 Use autogenerated options code to directly access option values rather than looking up the options Sam Spilsbury 2011-02-03 Be a little bit smarter about that - work with stretched windows too and don't accumulate pointer motion if the window is already constrained Sam Spilsbury 2011-02-03 Take up/down pointer motions as left and right if the cursor is at a screen edge This allows the resize borders to extend past the window somewhat and for the user to still resize windows to the edge of the screen Sam Spilsbury 2011-02-03 Explicitly include to avoid offset problems on amd64 Travis Watkins 2011-02-02 fix bcop code generation for colors Sam Spilsbury 2011-02-02 Initialize border Merge: ff085dc 4ae9585 Sam Spilsbury 2011-02-01 Merge branch 'master' of ../../../core Conflicts: include/core/core.h src/window.cpp Sam Spilsbury 2011-02-01 Allow semantic difference between frame window geometry and frame size. Rationale: some window decorators or themes might want to specify a border input area that is slightly larger than the visible borders on screen (eg for enhanced resize handles, a11y purposes, etc) or the theme might want to specify some additional decoration which should affect placement but should not be interacted with. In this case we have a priv->border and priv->input window property. priv->border specifies the actual semantic size of the window decoration that should affect placement and priv->input specifies the extents of the frame window past the client. Fixes LP: #710271 Sam Spilsbury 2011-01-28 Fix frame reference not going away on unreparent Sam Spilsbury 2011-01-28 Whitespace fix Sam Spilsbury 2011-01-28 Whitespace fix Sam Spilsbury 2011-01-28 Wait for reparent and configure operations to complete before destroying. We don't track frame and wrapper windows like normal windows, so if we want to restack relative to the frame window on unreparent then we need to ensure that the restack operation actually completed before destroying the window. Sam Spilsbury 2011-01-28 We don't care about events happening on the wrapper window during unreparent Listening for these events is only going to cause UnmapNotifies coming from our own XReparentWindow operation and XUnmapWindow operation on the frame window on the wrapper window, which will be handled by compiz making some windows appear to be unmapped when they were just unreparented. Fixes LP #682781 Sam Spilsbury 2011-01-27 Don't track window geometries or properties until they are actually managed. The window might get some ConfigureRequests which won't be reflected in PrivateWindow at MapRequest time. Fixes LP #707853 Sam Spilsbury 2011-01-26 Fix warning Sam Spilsbury 2011-01-26 Fix windows jumping around when clicking on parts that trigger move Since we no longer have an unconditional passive grab on Button1 for active and raised windows, we need to check if a client sent us a _NET_WM_MOVERESIZE ClientMessage and update the pointer buffer on that. Also clean up the pointer buffer handling code again - reduce the number of roundtrips required. Remove debug message. Merge: 1c8f44d 6d72a4e Sam Spilsbury 2011-01-26 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Merge: 793479d 081e136 Sam Spilsbury 2011-01-26 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2011-01-26 Cleanup reparenting code No need to use XGetGeometry since checking the return value of XGetWindowAttributes will determine if the window is destroyed. Also make sg a reference since copying serverGeometry is a bit useless Sam Spilsbury 2011-01-26 Set the vp size before initializing windows Merge: cd3aef5 41d6694 Sam Spilsbury 2011-01-25 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-01-25 Fix stacking madness 1) Don't create windows after registering for CreateNotify on the root window and then do XQueryTree after calling XCreateWindow since this will add the window to the internal stack twice (once for XQueryTree and once for the CreateNotify) 2) Enforce a full restack on all windows once we have decided what our initial stack order is - so that dock windows don't end up going underneath desktop windows 3) Immediately stack the frame window underneath the client and wait for the stacking operation to complete before reparenting since sometimes the frame window would be created and mapped at the top of the X11 stack whereas the client window would be tracked from the bottom of the stack. Remove hack to restack window within compiz since that didn't actually work. Travis Watkins 2011-01-24 fix build system so you can disable building decor plugin Merge: eef7eab 2b7e757 Sam Spilsbury 2011-01-24 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2011-01-24 Don't try to set target properties for blur if we disabled building it Sam Spilsbury 2011-01-24 Don't make if-statement depend on XWindowAttributes which might be garbage. The window could have been destroyed by the time we do XGetWindowAttributes on it, so we need to check if that's the case. We still add it to the tree anyways - but only because in between the time when we handle the DestroyNotify for it and the CreateNotify, some windows might have done a ConfigureRequest asking us to stack windows relative to it Sam Spilsbury 2011-01-24 Fix not tracking windows that became override-redirect after create. Some broken toolkits like QT change their override-redirectness after CreateNotify, which would cause us not to track them. Unfortunately this means that we need to track them on MapNotify, but that's not really a problem anyways since they are override-redirect Merge: eef7eab 7ce34ea Sam Spilsbury 2011-01-20 Merge branch 'master' of git://git.compiz.org/compiz/core Merge: 7194f67 af8424c Sam Spilsbury 2011-01-20 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Sam Spilsbury 2011-01-19 Update passive button grabs on reparent Sam Spilsbury 2011-01-19 Fix not tracking windows which get unmapped, not destroyed and then remapped Sam Spilsbury 2011-01-19 Revert "Don't stack mapping windows which requested no focus above the active window." This reverts commit ecc61dc04567947e92cbb9686c1041619abc05b1. Sam Spilsbury 2011-01-14 Track override redirect windows from the first CreateNotify. We don't get a MapRequest from these windows, so we need to track them from CreateNotify (which isn't really evil anyways since we aren't reparenting them) Fixes (most) issues with menus not appearing. Sam Spilsbury 2011-01-13 Update core ABI Travis Watkins 2011-01-12 fix logic craziness Stop screwing with my brain and put the code at the one place it will actually be used. Sam Spilsbury 2011-01-13 Don't create CompWindow and initialize plugins until MapRequest. Having all plugins track windows on CreateNotify doesn't make any sense because they are not visible, and the ones that they would need to track would be override-redirect anyways. Also tracking windows in this way broke reparenting in such a way that a number of buggy applications using xembed (eg gnome-panel applets and Adobe Flash would consistently crash). Sam Spilsbury 2011-01-12 Don't stack mapping windows which requested no focus above the active window. This adds a managing variable to PrivateWindow which represents the managing state of the window. In addition, ::updateAttributes did not stack windows below correctly if they were already directly on top of an active window (since it is not valid to stack a window below itself, and the algorithm would pass the below to the findValidStackSiblingBelow function as well as a pointer to the active window (== below)). The function now compares the below sibling to the window we want to be stacked. Merge: 78a5ebd ab1861b Sam Spilsbury 2011-01-11 Merge branch 'glibmm-experimental' Conflicts: src/screen.cpp Merge: aa8edad cf2117b Sam Spilsbury 2011-01-11 Merge git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2011-01-08 Fix grabs activating when we don't need them to, fixing some applications receiving wrong events Sam Spilsbury 2011-01-05 Also check for FocusChange events on windows of other screens. Don't continually set the input focus if it is already set - the focus can change to be on another screen, register for events to detect that case Sam Spilsbury 2011-01-05 Move sources around into relevant files Sam Spilsbury 2011-01-05 Remove glib plugin. It conflicts with this branch Sam Spilsbury 2011-01-05 Use clock_gettime and add a TIMESPECDIFF macro Sam Spilsbury 2011-01-05 Make the timeout for the zero-timer case 15, just so that we don't end up spamming things (15msec isn't that long) Sam Spilsbury 2011-01-04 We can have a brief spin-wait system in place for CompTimeoutSource since there isn't any case where we don't have timers running Sam Spilsbury 2011-01-04 Re-add paint-smartness to composite.cpp Sam Spilsbury 2011-01-04 Re-write timers to be a regular Glib::Source We previously used Glib::TimeoutSource but this one is broken for a number of usecases that we need, so create our own timeout source which is similar to the stock one, except that we only insert one source into the glib stack with grouped timeout times for the rest of our timers. Allows the use of setTimes () and setCallback () without glib becoming a disaster-zone. Also fixes a number of crashes related to the buggy glibmm implementation. Merge: 8649381 2ced0ab Sam Spilsbury 2011-01-02 Merge branch 'master' of git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2011-01-02 Only set unmanaging bit while window is actually being unmanaged. Also de-obfuscate gravity handling in _NET_WM_MOVERESIZE request Sam Spilsbury 2010-12-31 Fix crashes when loading plugins on the command line plugin.cpp:plugins is a reverse list, so iterate it in reverse Sam Spilsbury 2010-12-31 Raise window on move/resize initiation in raise-on-click mode. Forward port a32f5bf9cef3ec0c40c7ac60b8b87f4083016f98 to master Sam Spilsbury 2010-12-24 Allow plugins to initiate scale when initiated to change the match Sam Spilsbury 2010-12-24 Don't clear terminate state until action is actually finished clearing up. Clearing the terminate state before this will confuse other plugins which check activity states Merge: b3c2c22 07f258e Sam Spilsbury 2010-12-24 Merge branch 'master' of git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2010-12-23 Add signals for viewport change begin/end Sam Spilsbury 2010-12-19 Other mouse buttons should be allowed to change the selected window. But only button 1 should be able to select windows and terminate scale mode. Fixes incorrectly selected window when the mouse has not been moved after scale mode has been initiated and the mouse is hovering over an unselected window, and then Button2, or Button3 eg is pressed. This broke scaleaddon's pull window and close window bindings. Fixes LP #691087 Sam Spilsbury 2010-12-13 Cleanup Merge: af62da3 b2077af Sam Spilsbury 2010-12-13 Merge git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2010-12-13 Send window id in decoration notification Sam Spilsbury 2010-12-13 Fix unintialized variable usage Merge: abb0874 8dd7395 Sam Spilsbury 2010-12-13 Merge git://git.compiz.org/compiz/core into glibmm-experimental Merge: da624e3 8dd7395 Sam Spilsbury 2010-12-13 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-12-13 Also beautify Sam Spilsbury 2010-12-13 Break after updating after reparent Sam Spilsbury 2010-12-13 Add a compiz event for when we have been decorated Didier Roche 2010-12-13 package mode is release debug for plugins also ship the slipped gconf cmake helper Sam Spilsbury 2010-12-13 Fix buffer overflow on some platforms (Non NULL passed to XOpenDisplay) Sam Spilsbury 2010-12-11 Ensure decoration is updated on shade. Fixes artifacts. Previously we'd rely upon a change in winDecorAtom to tell us when to update the decoration, however now that we are reparenting we can't do that anymore so hook windowNotify to watch for shade and unshade and then force the decoration to be updated on resizeNotify if this is the case. Sam Spilsbury 2010-12-09 Fix some typoes and handle the case where the window is already under a dock Sam Spilsbury 2010-12-09 Be a little bit more clever about constraining resizes to workareas. Basically we want to constrain resizes to workareas, but not in the case where two outputs touch. In the case that two outputs touch they must be directly adjacent and there must not be a panel or dock in the way Merge: 9211a51 4666435 Sam Spilsbury 2010-12-08 Merge git://git.compiz.org/compiz/core into glibmm-experimental Conflicts: include/core/screen.h Sam Spilsbury 2010-12-07 Don't stack focus-denied windows in a disallowed position When a window is focus-stealing-prevented, we should only stack it below the active window if that is possible. If it's not (the window has the "Above" state, for example), then we should stack it at the normal location. http://bugs.opencompositing.org/show_bug.cgi?id=1304 Forward port 984bca5801d6179b9f8081c4b6c466063975d940 to master Sam Spilsbury 2010-12-07 Only reflect the decoration size in MapRequest gravity adjustment, not the whole window size. Forward port a86c461684f122fd286884c4ff28f6ea673fe669 Sam Spilsbury 2010-12-07 Also update desktop keys Sam Spilsbury 2010-12-07 Update path names in gconf keybindings Sam Spilsbury 2010-12-07 Cleanup key binding list from redundant and unneeded keys and add scale binding. Forward port c9993a7739e9bf6b595e5efa62605027241c3d7f to master Sam Spilsbury 2010-12-07 Also handle windows that have a server border set in pointer placement mode. Also fix typo. 1d5f80cd52274484ecb59a1c8f7e7b6cea3b1844 to master Forward port Sam Spilsbury 2010-12-07 Correctly reflect that the switcher window is managed. Forward port 46371f9172089a3e60648b834611d5694df2e80b to master Sam Spilsbury 2010-12-07 Make short descriptions in opacity a little more verbose Forward port f089351c2d6d62302e59f52a810b722808a4a574 to master Sam Spilsbury 2010-12-07 Move window position validation to validateWindowResizeRequest function. Forward port 2a37340f9610e7f80a66ed6ab48190c181784f6b to master Sam Spilsbury 2010-12-07 Don't make minimized windows unmanaged. Forward port 8dcfbb256322565228cbcda5230de95343887fac Sam Spilsbury 2010-12-07 Fix window offset at the start of close animation. Forward port 0a28ca484a8a72060b580e0ccc75ea20f3ddab1a Sam Spilsbury 2010-12-07 resize: Remove constrain_y, limit to work area instead of screen edges. Forward port 3075fa6eac1f4c7faa804b319f916899589702cc Sam Spilsbury 2010-12-07 resize: Fix typo Sam Spilsbury 2010-12-07 resize: Allow resizing outside screen edges when initiated with key. Forward port 6e281003bbcb01ac028aa963ab1bee0349c41376 to master Sam Spilsbury 2010-12-07 place: Fix typo (off by one error) Forward port 4832c514b0c460febc90720a61c11d6a0f64ec84 to master Sam Spilsbury 2010-12-07 Also set constrainY to FALSE if move is not loaded. Forward port 615d823f5edc26eaa12e83c97099c7ab0f017968 to master Sam Spilsbury 2010-12-07 Constrain resizes to screen edges and fix constraining. Forward port 6c12e5a60297143a72c4e4bb104b0c35102ff3f4 to master Sam Spilsbury 2010-12-07 resize: Obey move's constrain_y option Forward port 0d23e499774769d295509f189fbf4b7c21763ef6 to master Sam Spilsbury 2010-12-07 Fix typo Forward port 466184685e570b6736adce7800253815d72e1c02 to master Sam Spilsbury 2010-12-07 Fix assertion if core is specified as plugin on the command line. Forward port 2a0087732f23cd87284366ec0dc224cbd5fd68ec to master Sam Spilsbury 2010-12-07 scale: Properly remove closing window. Forward port 96e59168920650f49c5e79b342261c863694fb23 to master Sam Spilsbury 2010-12-07 Switcher: prevent simulataneous plugin uses that don't make sense. Forward port 1974f9b5bfbab24023a0a647b606eedccbb83d04 to master Sam Spilsbury 2010-12-07 Avoid adding core twice to plugin list Forward port 20cdf69d096616104cd26fc30c8efd7e4e4e164d to master Sam Spilsbury 2010-12-07 Fix sibling checking logic. Forward port f4af2061d93057843efd437b30b8199dc89defdd to master Sam Spilsbury 2010-12-07 Make sure findValidStackSibling below doesn't return a sibling that we're not allowed to stack under. Forward port 1baf514fefb9177764af99cf508596686583244e to master Sam Spilsbury 2010-12-07 Fix up coding style, add some comments. Forward port 24dd71f04892ddd031ac2bf7b166e10b74aa1bbd to master Sam Spilsbury 2010-12-07 Never unload plugins passed to the cmdline Forward port 27430deae222b4380c0e91da849f930a297afb73 to master Sam Spilsbury 2010-12-07 gnomecompat: Default to gnome-terminal for terminal keybinding. Forward port 060a99697cde9105c85623cb464a36b46da3bf97 to master Sam Spilsbury 2010-12-07 Revert gravity adjustment made at MapRequest time at UnmapNotify time Forward port a0be58f5e9f5e419af4f5f15505e9a9f6fe47bdd to master Sam Spilsbury 2010-12-07 Don't take screenshot if Escape was pressed. Forward port c9239e92fe0b2d6bfc674b523313617017ca062f to master Sam Spilsbury 2010-12-06 Revert "Fix windows being forever treated as "not managed" in focus () and not entering into scale mode, etc" This reverts commit 51e01727d309f39e3f42ecf6b53b4ebb31a385dc. There is a better way to do this Sam Spilsbury 2010-12-06 Fix startup order. Previously we were doing something like this: init -> screen init -> init core plugin screen -> create windows -> eventLoop -> updatePlugins -> initPlugin (initScreen (initWindow))). This order has a number of problems with it - namely that config plugins will be loaded on one full pass of the event loop and then core options are initialized, before which we were doing certain startup procedures on the default options, which resulted in strange race condition bugs. Also, if we are compositing we have a brief (visible) switch from 2D mode to 3D mode - in reality we want to be in 3D mode ASAP. The new order is init -> updatePlugins (load plugins specified on command line) -> screen init -> load command line plugins -> update plugins (load new plugins specified by config plugins on the command line) -> init screens -> create window (init plugins for window) -> eventLoop. This means that it takes longer for us to get to the event loop, but at least we can zip through the initialization phase quite quickly Merge: 89e6c77 a8ad8f2 Sam Spilsbury 2010-12-05 Merge commit 'a8ad8f2c28a95ee8ebc39d404069586942c2e292' into glibmm-experimental Merge: f4ae798 ce53cec Sam Spilsbury 2010-12-05 Merge commit 'ce53cec922f54c754e8c7eb19d786a2dffe0f496' into glibmm-experimental Merge: a26a16b a8ad8f2 Sam Spilsbury 2010-12-05 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Jason Smith 2010-12-04 Fix memory leaks introduced in last commit Sam Spilsbury 2010-12-05 Fix windows being forever treated as "not managed" in focus () and not entering into scale mode, etc We need to re-set unmanaging too once managed is set again Sam Spilsbury 2010-12-04 Fix windows consistently moving by gravity * window decoration extents. The behaviour from 0.8 was ported to update decoration windows on the window destructor, but because we are moving windows on a timer in order to handle reparenting issues when decorating them, this also causes the time to be destroyed when the CompWindow is, so the windows never actually get moved back into place correctly. FIXME: Timers should have a referencing system, it does not make sense that we have to preserve their scope Merge: 56b97b9 2d4b54b Sam Spilsbury 2010-12-04 Merge branch 'master' of git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2010-12-04 Fix typo Sam Spilsbury 2010-12-04 The window must always have a frame before we do anything with it Sam Spilsbury 2010-12-04 Wait until reparent to decorate Sam Spilsbury 2010-12-04 Fix typo which caused windows not to be recognized Sam Spilsbury 2010-12-04 Revert "Constrain windows to workArea when moving for decorations" This reverts commit d07d0103b7e76a10fb9b360d25c4ec32470eaa53. Jason Smith 2010-12-03 Fix compregion to be a more true to form wrapper of X11 region Merge: 80b1c01 4a5ec2b Sam Spilsbury 2010-12-03 Merge branch 'master' of git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2010-12-03 Fix typo which caused windows > screen height to be placed incorrectly Sam Spilsbury 2010-12-03 Fix typos Sam Spilsbury 2010-12-03 Fix window position validation for windows that change size without changing position. Previously, we left the position of windows that have USPosition set untouched, even if they didn't try to change position at all, but only changed size. This caused such windows to become partially offscreen e.g. if they were positioned at the lower edge of the work area before the size change and increased height afterwards. Forward port 3c16152938c44454f42d08a4b92cc46093c9a782 to master Sam Spilsbury 2010-12-03 Fix some focus issues: - Don't give soon-to-be-unmanaged windows focus when closing a window - Transfer focus to another window if a window that is about to get focus is closed Forward port 5a78a90a3ec9de02b8e52790fbc376a2502cead7 to master. Fixes gnome-do issue Sam Spilsbury 2010-12-03 Revert "Ensure that we can change the input focus, even if we requested a client to take focus and it failed to do it before it was unmapped" This reverts commit 1084f0be5c200d46ad3b4358a477963d31040736. Danny suggested a better way to do this from a commit to 0.8 Sam Spilsbury 2010-12-03 Add some documentation for decorator.c Sam Spilsbury 2010-12-03 Ensure that we can change the input focus, even if we requested a client to take focus and it failed to do it before it was unmapped Sam Spilsbury 2010-12-02 Make w->managed () wrapable Sam Spilsbury 2010-12-02 Fix debug message Merge: ef1399c 81c768f Unity 2010-12-02 Merge branch 'glibmm-experimental' of git://git.compiz.org/users/dbo/compiz-with-glib-mainloop into glibmm-experimental Sam Spilsbury 2010-12-02 Remove doPoll () and rewrite CompWatchFd to use Glib::IOSource This changes compiz to monitor file descriptors directly in the glib mainloop which fixes things like not exiting correctly with session managers and the like. Sam Spilsbury 2010-11-27 Fix switcher background drawing As the default composition mode is SourceOver and the old contents are uninitialized, all sorts of graphical corruption could occur. Fix that by using Source composition mode and thus not using the old contents for blending. Forward port 50c061b29c9fccdc937f0de92ba1edccab1a05a4 to master Sam Spilsbury 2010-11-27 No need to reset the source, it happens for us on destructor Sam Spilsbury 2010-11-27 Detect when glib is being stupid and calls ::internalCallback even though we asked for the source to be removed (prevents access to free'd memory once we delete a CompTimer) Merge: 2bb01fb 5170cb0 Sam Spilsbury 2010-11-27 Merge git://git.compiz.org/compiz/core into glibmm-experimental Merge: dbcb185 e9f553a Sam Spilsbury 2010-11-27 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Merge: 1730f6a e9f553a Sam Spilsbury 2010-11-27 Merge git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2010-11-27 Ensure that we check options nested in and tags too (eg add an extra "/") Didier Roche 2010-11-26 fix the gconf schema generation to compiz-1 Merge: 86074c1 cbd2c12 Sam Spilsbury 2010-11-25 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop into glibmm-experimental Sam Spilsbury 2010-11-25 Return false once we're done with the source Sam Spilsbury 2010-11-25 Fix hang on exit Merge: c26f860 7c7b898 Sam Spilsbury 2010-11-24 Merge branch 'master' of git://git.compiz.org/compiz/core Merge: 029817a 7c7b898 Sam Spilsbury 2010-11-24 Merge git://git.compiz.org/compiz/core into glibmm-experimental Didier Roche 2010-11-23 fix typos and leftover from previous commit Didier Roche 2010-11-23 add signals for the bailer plugin + hw rendering detection Merge: 2eda891 ce0a8bb Didier Roche 2010-11-23 Merge branch 'master' of git://anongit.compiz.org/compiz/core Sam Spilsbury 2010-11-23 Fix decoration flicker of switcher window. Previously, the pixmaps were recreated as soon as any property changed (and thus way too often), so it would happen that at the time the decoration plugin needs to access the pixmap, it would already have been destroyed. Avoid that by only recreating the pixmaps when needed. Forward port of edb51e95e959accd3873179a20bc4674c51f5efe to master Merge: 318465e a8737b6 Didier Roche 2010-11-22 Merge branch 'master' of git://anongit.compiz.org/compiz/core Sam Spilsbury 2010-11-22 Damage rectangles correctly when coming out of stretch resize mode from constrainment Sam Spilsbury 2010-11-21 Drop the individual bindings for resize modes and move to a mod mask system Sam Spilsbury 2010-11-21 Turn resize_from_center into a match Sam Spilsbury 2010-11-20 Add a short TODO Sam Spilsbury 2010-11-20 Only use ::reset for the RefPtr because that will automatically take care of destroying it for us Sam Spilsbury 2010-11-20 Port C based glib to C++ glibmm Didier Roche 2010-11-18 [PATCH] Fix keybinding window manager names in compiz-gnome Didier Roche 2010-11-18 Update the binding properties to compiz wm with gnome capplets As now the wmname is Compiz and not compiz, update to the new wmname. Sam Spilsbury 2010-11-18 Fix weird condition where gboolean != bool bitwise which caused timers to segfault on occasion Sam Spilsbury 2010-11-13 Split GConf schema generation into a plugin_extension Merge: 70e344e 868eeab Sam Spilsbury 2010-11-12 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2010-11-12 Use C++ false Sam Spilsbury 2010-11-12 Install plugin images and data to separate plugin-specific subdirectories (so that plugins can't overwrite other plugin's data). Also fix typo in CompizGenInstallData.cmake Sam Spilsbury 2010-11-12 Remove testing CompizGenPrintMessage.cmake Sam Spilsbury 2010-11-12 Add a CompizGenInstallImages.cmake extension, which installs images Sam Spilsbury 2010-11-12 Add CompizGenInstallData.cmake Sam Spilsbury 2010-11-12 Split plugin data file generation into cmake extension Sam Spilsbury 2010-11-12 Added a simple CMake buildsystem extensions system Didier Roche 2010-11-12 [PATCH] Cleanup cmake file. No need to get set var {var} CACHE Sam Spilsbury 2010-11-11 Spin the mainloop properly Sam Spilsbury 2010-11-11 Listen for FocusIn/FocusOut on NotifyGrab NotifyUngrab and set an internal bit that plugins can query Sam Spilsbury 2010-11-11 Make sure that we properly unregister actions when removing the option private with operator= Sam Spilsbury 2010-11-11 Bump core ABI Merge: 7c9baac 87a93df Sam Spilsbury 2010-11-11 Merge branch 'master' of git://git.compiz.org/compiz/core Merge: c297f4d e89d6d4 Sam Spilsbury 2010-11-09 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Danny Baumann 2010-11-09 [PATCH] Be a little bit more clever when handing option construction in handleActionEvent. Previously we would have a static CompAction::Vector which we would resize to lower sizes (so that triggerFooBindings doesn't die) but this causes us to be reconstruction CompOptions all the time which is expensive. Instead just reset the option to make it "dead" (eg keep it in memory for longer) but don't create and recreate them all the time Also copy the active state of a CompAction on copy-construct Didier Roche 2010-11-05 Fix COMPIZ_DEFAULT_PLUGINS to be really taken into account Jason Smith 2010-11-08 Remove clever timers for now to see if we cant help damage issues Dominique Leuenberger 2010-11-08 Require at leasst gtk 2.18.0. Sam Spilsbury 2010-11-08 Don't increase core action register reference counts if the same action was already registered Didier Roche 2010-11-08 Preserve DESTDIR if no override in COMPIZ_DESTDIR Dominique Leuenberger 2010-11-06 Install translations into LC_MESSAGES instead of lc_messages. Sam Spilsbury 2010-11-06 Don't increase leave pendingMaps at a non-zero number once the window is mapped. We used to assume that for every MapRequest event that we got for which we also sent an XMapWindow that we would get a MapNotify. According to the man XMapWindow this doesn't make any sense since trying calling XMapWindow on an already mapped window for which we have SubstructureRedirectMask set results in a NoOp anyways (so we'll only ever get one MapNotify and multiple MapRequests). This fixes a case where no input focus would be set on closing windows with multiple remaining pendingMaps since we don't move the input focus if this is the case Sam Spilsbury 2010-11-06 Revert "Don't increase leave pendingMaps at a non-zero number once the window is mapped." This reverts commit d5e0df487697855fc07e8176d8586b7b14f6f778. Sam Spilsbury 2010-11-06 Update NEWS for 0.9.2.1 Release Sam Spilsbury 2010-11-06 Update NEWS for 0.9.2.1 Release Sam Spilsbury 2010-11-06 Add COMPIZ_VERSION_MACRO and update to 0.9.2.1 Sam Spilsbury 2010-11-06 Don't increase leave pendingMaps at a non-zero number once the window is mapped. We used to assume that for every MapRequest event that we got for which we also sent an XMapWindow that we would get a MapNotify. According to the man XMapWindow this doesn't make any sense since trying calling XMapWindow on an already mapped window for which we have SubstructureRedirectMask set results in a NoOp anyways (so we'll only ever get one MapNotify and multiple MapRequests). This fixes a case where no input focus would be set on closing windows with multiple remaining pendingMaps since we don't move the input focus if this is the case Sam Spilsbury 2010-11-05 Release the connection name on unload so we don't cause dbus to get angry on ::updatePlugins Sam Spilsbury 2010-11-05 Revert "Don't queue incoming name requests and it is also safe to unref the bus" This reverts commit efcbe55d9fae7553acadf731bc3b15f46dae99cf. Sam Spilsbury 2010-11-05 Don't queue incoming name requests and it is also safe to unref the bus in the case that we aren't unreffing it due to plugin failure Merge: 267b9d1 773e8a0 Sam Spilsbury 2010-11-09 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Danny Baumann 2010-11-09 [PATCH] Be a little bit more clever when handing option construction in handleActionEvent. Previously we would have a static CompAction::Vector which we would resize to lower sizes (so that triggerFooBindings doesn't die) but this causes us to be reconstruction CompOptions all the time which is expensive. Instead just reset the option to make it "dead" (eg keep it in memory for longer) but don't create and recreate them all the time Also copy the active state of a CompAction on copy-construct Didier Roche 2010-11-05 Fix COMPIZ_DEFAULT_PLUGINS to be really taken into account Jason Smith 2010-11-08 Remove clever timers for now to see if we cant help damage issues Merge: e62dd35 86d92fd Dominique Leuenberger 2010-11-08 Merge branch 'master' of ssh://git.compiz.org/git/compiz/core Dominique Leuenberger 2010-11-08 Require at leasst gtk 2.18.0. Sam Spilsbury 2010-11-08 Don't increase core action register reference counts if the same action was already registered Didier Roche 2010-11-08 Preserve DESTDIR if no override in COMPIZ_DESTDIR Dominique Leuenberger 2010-11-06 Install translations into LC_MESSAGES instead of lc_messages. Sam Spilsbury 2010-11-06 Don't increase leave pendingMaps at a non-zero number once the window is mapped. We used to assume that for every MapRequest event that we got for which we also sent an XMapWindow that we would get a MapNotify. According to the man XMapWindow this doesn't make any sense since trying calling XMapWindow on an already mapped window for which we have SubstructureRedirectMask set results in a NoOp anyways (so we'll only ever get one MapNotify and multiple MapRequests). This fixes a case where no input focus would be set on closing windows with multiple remaining pendingMaps since we don't move the input focus if this is the case Sam Spilsbury 2010-11-06 Revert "Don't increase leave pendingMaps at a non-zero number once the window is mapped." This reverts commit d5e0df487697855fc07e8176d8586b7b14f6f778. Sam Spilsbury 2010-11-06 Update NEWS for 0.9.2.1 Release Sam Spilsbury 2010-11-06 Update NEWS for 0.9.2.1 Release Sam Spilsbury 2010-11-06 Add COMPIZ_VERSION_MACRO and update to 0.9.2.1 Sam Spilsbury 2010-11-06 Don't increase leave pendingMaps at a non-zero number once the window is mapped. We used to assume that for every MapRequest event that we got for which we also sent an XMapWindow that we would get a MapNotify. According to the man XMapWindow this doesn't make any sense since trying calling XMapWindow on an already mapped window for which we have SubstructureRedirectMask set results in a NoOp anyways (so we'll only ever get one MapNotify and multiple MapRequests). This fixes a case where no input focus would be set on closing windows with multiple remaining pendingMaps since we don't move the input focus if this is the case Sam Spilsbury 2010-11-05 Release the connection name on unload so we don't cause dbus to get angry on ::updatePlugins Sam Spilsbury 2010-11-05 Revert "Don't queue incoming name requests and it is also safe to unref the bus" This reverts commit efcbe55d9fae7553acadf731bc3b15f46dae99cf. Sam Spilsbury 2010-11-05 Don't queue incoming name requests and it is also safe to unref the bus in the case that we aren't unreffing it due to plugin failure Merge: 3a5c997 83ffe50 Sam Spilsbury 2010-11-04 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2010-11-01 Fix cairo decoration offsets Sam Spilsbury 2010-11-01 Fix decoration offsets in metacity 2D mode (hopefully for real this time) Sam Spilsbury 2010-11-01 Don't create window with shadow size in 2D Mode Merge: 2adde93 8c5348c Sam Spilsbury 2010-10-29 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-10-29 Bump version to 0.9.2 Sam Spilsbury 2010-10-29 Constrain windows to workArea when moving for decorations Since we move the window to account for adding the decorations on a zero timer (eg, after handleEvent, where windows have already been placed) we need to make sure we account for the workArea (so that we don't move windows below panels and offscreen) Sam Spilsbury 2010-10-29 Fix typos Merge: db5b0ff 709496d Danny Baumann 2010-10-27 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Danny Baumann 2010-10-27 Create cmake modules directory before copying file to it. Sam Spilsbury 2010-10-26 Fix out of bounds memory read / write Sam Spilsbury 2010-10-26 Change the match expression handler after Regex screen constructor. It is possible for RegexWindow::get () to be called from this wrapped function, which is wrong because memory for a RegexWindow hasn't yet been allocated. (CompScreen::matchExpHandlerChanged -> SomePlugin::CompMatch::Evaluate -> RegexExp::evaluate -> RegexWindow::get) Sam Spilsbury 2010-10-26 Check if header token matches part of another word. The prepending function would only check for the existence of part of the header op in the function string, and did not check if the matched string was actually part of another word. This caused fragment programs like this to fail: program name: temporary !!ARBfp1.0 TEMP temp, foo, bar; FOO temp, bar, temp; Which would be outputted like this: TEMP temporary_temp, temporary_foo, temporary_bar; FOO temporary_temporary_temp, bar, temporary_temporary_bar; (since "temp" was matched in "temporary" incorreclty). The new code now checks for a ".", ";" or "," or if the word is the last in the string before prepending it. This bug was most noticable in the colorfilter plugin, where one of the filters could be named "negative" with a temporary variable called "neg" Sam Spilsbury 2010-10-24 Fix omission in NEWS and fix date Sam Spilsbury 2010-10-24 Update NEWS for 0.9.2 release Sam Spilsbury 2010-10-24 Fix memory leak Sam Spilsbury 2010-10-24 Fix memory leak Sam Spilsbury 2010-10-24 Use XFreeStringList to recursively free the entire array Sam Spilsbury 2010-10-24 Cleanup (static analysis) Sam Spilsbury 2010-10-24 Fix some memory leaks (it looks like there are some more in XTextPropertyToStringList too) Sam Spilsbury 2010-10-23 scale: Reduce scope of variables where appropriate Sam Spilsbury 2010-10-19 composite.cpp: minor cleanup, don't keep things in scope if they don't need to be (static analysis) Sam Spilsbury 2010-10-19 compiztoolbox: make functions public Sam Spilsbury 2010-10-19 blur: minor code cleanup (static analysis) Sam Spilsbury 2010-10-19 opengl: minor style fixups (static analysis) Sam Spilsbury 2010-10-19 kde4-window-decorator: minor style related changed (static analysis) Sam Spilsbury 2010-10-19 core: general code cleanup (static analysis) Sam Spilsbury 2010-10-19 Avoid a roundtrip Sam Spilsbury 2010-10-18 Take into account the server border width when calculating the texture size Sam Spilsbury 2010-10-18 We need to make a temporary copy of the color string since it is free'd on the temporary function call's destructor. Sam Spilsbury 2010-10-03 Don't attempt to re-use buffer pixmaps. It's not safe to re-use these pixmaps, because there isn't any guaruntee that they haven't been nuked by compiz Sam Spilsbury 2010-10-03 Don't reparent so overzealously. Also tweak offset code to handle shadow offsets. Unfortunately this breaks some themes. However, the standard ones such as Clearlooks and friends should continue to work Merge: e9574b4 0301c9f Jason Smith 2010-10-15 Merge branch 'master' of ssh://anongit.compiz.org/git/compiz/core Scott Moreau 2010-10-14 Get rid of Prev/Next Slide since they are entirely unused. Scott Moreau 2010-10-14 Paint all viewports if caps are transparent. Jason Smith 2010-10-07 Ensure g type is setup Scott Moreau 2010-09-30 Remove unused variables to silence warnings. Scott Moreau 2010-09-30 Handle top and bottom cap colors separately. Scott Moreau 2010-09-30 Remove cap image settings since it's handled by cubeaddons. Jason Smith 2010-10-04 Ensure we dont end up processing extra mouse events for no reason Scott Moreau 2010-10-03 Fix porting bugs. Jason Smith 2010-10-03 Revert ugly event hack as workaround in plugin is found Scott Moreau 2010-10-03 Remove duplicate if statement. Scott Moreau 2010-09-30 Remove unused variables to silence warnings. Scott Moreau 2010-09-30 Handle top and bottom cap colors separately. Scott Moreau 2010-09-30 Remove cap image settings since it's handled by cubeaddons. Sam Spilsbury 2010-09-29 Update INSTALL file Scott Moreau 2010-09-28 Don't require both opengl and composite since opengl already requires composite. This can cause flicker or momentary black screen with some drivers. Dominique Leuenberger 2010-09-28 Do not use deprecated gdk_display macro. Dominique Leuenberger 2010-09-28 Do not use gdk_display, it's deprecated (one more place it was missed). Sam Spilsbury 2010-09-27 Don't attempt to write the property if the template was not read in the first place Sam Spilsbury 2010-09-27 Don't use deprecated gdk_display symbol Sam Spilsbury 2010-09-27 Move list of compiz libs to compizplugin. New DSO linking rules require that plugins be explcitly linked to all of the compiz dependencies. Jason Smith 2010-09-30 Ensure we get lots of events on input windows. This is likely evil and needs a better fix Sam Spilsbury 2010-09-30 Clean up isViewable Merge: 8942e33 912aac9 Sam Spilsbury 2010-09-29 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-09-29 Update INSTALL file Scott Moreau 2010-09-28 Don't require both opengl and composite since opengl already requires composite. This can cause flicker or momentary black screen with some drivers. Dominique Leuenberger 2010-09-28 Do not use deprecated gdk_display macro. Dominique Leuenberger 2010-09-28 Do not use gdk_display, it's deprecated (one more place it was missed). Sam Spilsbury 2010-09-27 Don't attempt to write the property if the template was not read in the first place Sam Spilsbury 2010-09-27 Don't use deprecated gdk_display symbol Sam Spilsbury 2010-09-27 Move list of compiz libs to compizplugin. New DSO linking rules require that plugins be explcitly linked to all of the compiz dependencies. Merge: 5967495 02dae69 Jason Smith 2010-09-14 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Conflicts: src/screen.cpp Jason Smith 2010-09-14 Remove spare ; Sam Spilsbury 2010-09-14 Cleanup Merge: fc6a55e 840cbcc Sam Spilsbury 2010-09-14 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Jason Smith 2010-09-13 Stop using gio for polling as it just doesn't seem to work as expected. Scrolling issues are now gone. Merge: 1fe1ac8 72d099a Sam Spilsbury 2010-09-11 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Jason Smith 2010-09-10 minor changes Sam Spilsbury 2010-09-09 Force input focus on button 1/2/3 press. Sometimes there is a case where the window is active on one screen already, and because compiz is not multi-screen aware, when another window is focussed on another screen, the window will continue to be "active" but not focussed. Previously, when clicking on this window again, the window would not be focussed again since it was already active. This commit forces input focus regardless of the "active" state Sam Spilsbury 2010-09-09 Also obey force placement match when validating ConfigureRequest events. Forward port of d01732e22007018ca54d4dfe810202ee4d3ee16 to master Sam Spilsbury 2010-09-08 compiztoolbox.cpp: Move input focus to highlighted windows so it is possible to alt-f4 them switcher.cpp: Move input focus back to last active window if switcher action is cancelled Danny Baumann 2010-09-06 [PATCH] Replace old gdk_draw_drawable method calls with cairo equivalents. Scott Moreau 2010-09-02 Add reszie_from_center option. Sam Spilsbury 2010-09-09 Force input focus on button 1/2/3 press. Sometimes there is a case where the window is active on one screen already, and because compiz is not multi-screen aware, when another window is focussed on another screen, the window will continue to be "active" but not focussed. Previously, when clicking on this window again, the window would not be focussed again since it was already active. This commit forces input focus regardless of the "active" state Sam Spilsbury 2010-09-09 Also obey force placement match when validating ConfigureRequest events. Forward port of d01732e22007018ca54d4dfe810202ee4d3ee16 to master Sam Spilsbury 2010-09-08 compiztoolbox.cpp: Move input focus to highlighted windows so it is possible to alt-f4 them switcher.cpp: Move input focus back to last active window if switcher action is cancelled Danny Baumann 2010-09-06 [PATCH] Replace old gdk_draw_drawable method calls with cairo equivalents. Scott Moreau 2010-09-02 Add reszie_from_center option. Sam Spilsbury 2010-09-09 Force input focus on button 1/2/3 press. Sometimes there is a case where the window is active on one screen already, and because compiz is not multi-screen aware, when another window is focussed on another screen, the window will continue to be "active" but not focussed. Previously, when clicking on this window again, the window would not be focussed again since it was already active. This commit forces input focus regardless of the "active" state Sam Spilsbury 2010-09-09 Also obey force placement match when validating ConfigureRequest events. Forward port of d01732e22007018ca54d4dfe810202ee4d3ee16 to master Sam Spilsbury 2010-09-08 compiztoolbox.cpp: Move input focus to highlighted windows so it is possible to alt-f4 them switcher.cpp: Move input focus back to last active window if switcher action is cancelled Merge: 64ee56f 8531355 Sam Spilsbury 2010-09-06 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Danny Baumann 2010-09-06 [PATCH] Replace old gdk_draw_drawable method calls with cairo equivalents. Sam Spilsbury 2010-09-03 Kick the event loop so that we get glib events Sam Spilsbury 2010-09-03 Minor cleanup - add onTimerTimeout as a friend, adapt to coding style, fix warnings etc Scott Moreau 2010-09-02 Add reszie_from_center option. Jason Smith 2010-09-02 Reduce CPU usage by utilizing max times a bit Jason Smith 2010-09-01 Minor cleanup and stop constant removal/addition of drawing timer to help improve performance. There is a wakeup issue remaining to be resolved Jason Smith 2010-08-31 Reduce CPU load, probably breaks certain damage event paints Jason Smith 2010-08-31 Compiz now works fast with glib Jason Smith 2010-08-31 Initial timer support. Compiz actually runs (very slow) with bugs Jason Smith 2010-08-31 First pass at glib loop, invariably breaking things Danny Baumann 2010-08-29 Fix property handling. Sam Spilsbury 2010-08-28 Check property size before reading Sam Spilsbury 2010-08-28 Better checking if the window is destroyed and use the default visual and colormap, unless the window has request an ARGB one, in which case use that (like metacity). This fixes problems with windows which set incorrect colormap/visual combinations in their XSetWindowAttribs, like some SDL windows such as frozen-bubble and SDL/testwm Merge: 4befd8b 9f936c2 Sam Spilsbury 2010-08-21 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-08-21 Don't declare metacity funcs if we aren't using it Scott Moreau 2010-08-20 Properly fix warnings. Scott Moreau 2010-08-20 Fix warnings. Scott Moreau 2010-08-20 Fix warnings. Scott Moreau 2010-08-20 Fix warning. Scott Moreau 2010-08-20 Fix warning. Scott Moreau 2010-08-20 Fix typo. Scott Moreau 2010-08-20 Fix warnings. Merge: d661a59 afe7893 Sam Spilsbury 2010-08-20 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-08-20 Use X11 Window Properties for Shadow Settings Storage / Retreival. Remove the DBUS and GConf based settings retreival. It was long broken and based on a bunch of old assumptions Jay Catherwood 2010-08-17 Don't give all windows struts Sam Spilsbury 2010-08-17 Use isViewable () rather than invisible () Sam Spilsbury 2010-08-17 Revert "Revert "Keep pixmaps of unmapped windows around if they are used for animations."" This reverts commit e37b87173812da4af24c480a1adc9f8075a05e98. Sam Spilsbury 2010-08-15 Update dbus settings paths. Sam Spilsbury 2010-08-15 Bump COMPIZ_CUBE_ABI Sam Spilsbury 2010-08-15 Kill paintAllViewports and make a new wrapable function cubeShouldPaintAllViewports Merge: d57e882 bfa9742 Sam Spilsbury 2010-08-14 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-08-14 Split gtk-window-decorator into files Jay Catherwood 2010-08-12 Fix tooltip open animations not firing Sometimes tooltip open animations do not fire because they are set to viewable early on. This patch runs a map window notification when map is called even if the window is already viewable. Sam Spilsbury 2010-08-13 Revert "Keep pixmaps of unmapped windows around if they are used for animations." This reverts commit 6c7d254d7f7b3706e9a6294a1c16c7cc9a05568f. Danny Baumann 2010-08-13 Check with wmType () if the window is really a Dock or a Desktop window; window->type () can be changed depending on the state of that window (eg dock + below = normal). This can cause some dock and desktop windows to be decorated when they shouldn't be. Sam Spilsbury 2010-08-13 Revert "Fix decoration of windows of the wrong type in the decor plugin" This reverts commit 11a42a7e3fb9d42b7623ac2e4f391482af6020b5. Merge: b613c2f 9dfda73 Sam Spilsbury 2010-08-13 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-08-13 Update DBUS strings to get shadow correctly Sam Spilsbury 2010-08-12 Fix decoration of windows of the wrong type in the decor plugin Scott Moreau 2010-08-10 Don't use bool as int. Fixes 'inside cube'. Sam Spilsbury 2010-08-11 Use restack () instead of restackBelow () to ensure stack synchronousity Merge: 8f8a983 ccde9fb Sam Spilsbury 2010-08-10 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-08-10 Don't free a local variable by creating a pointer to it and then not knowing whether that pointer is actually heap or stack memory Sam Spilsbury 2010-08-10 Also include frame region in input region shape Sam Spilsbury 2010-08-10 Make minimize, unminimize and minimized () functions wrappable Sam Spilsbury 2010-08-10 Revert "Call wrapped hide and show functions for minimize and unminimize and also" This reverts commit 4e0bad2e7f8a1e16cec41f6909c19bab33d93e17. Sam Spilsbury 2010-08-10 Call wrapped hide and show functions for minimize and unminimize and also unite frame region with input shaped region (so that decorations don't lose input) Sam Spilsbury 2010-08-10 Use anchor stacking point as either directly above or directly below window when reparenting windows Sam Spilsbury 2010-08-10 Fix typo Merge: 8ba8b19 4e1a665 Sam Spilsbury 2010-08-10 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-08-10 Handle the ShapeInput and ShapeBounding XShape regions Jay Catherwood 2010-08-09 Fix gimp layers window disappearing This fixes bug 1303. Under certain circumstances restack ends up being called with the window as its own aboveId, causing it to disappear. Sam Spilsbury 2010-08-08 Make minimization functions wrappable. Check return functions for minimized state rather than internal variables (since a plugin may want to change the reported state of minimization) Sam Spilsbury 2010-08-07 Export the CompWindow in ScaleWindowList and don't prevent the creation of a ScaleSlot for a window if one isn't already assigned (with setSlot ()) Bump COMPIZ_SCALE_ABI Sam Spilsbury 2010-07-31 Handle property data types other than XA_CARDINAL and XA_STRING. Fixes window hints not being written for other data types, such as XA_WINDOW which is used by compiztoolbox for switcher background drawing Guillaume Seguin 2010-07-29 Workaround CMake problem with -D_REENTRANT on TryCompile Guillaume Seguin 2010-07-29 Fix typo Sam Spilsbury 2010-07-29 Increment count Sam Spilsbury 2010-07-29 Initialize XPolygonRegion arguments and use WindingRule Merge: ffbb452 7200386 Sam Spilsbury 2010-07-25 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-07-25 Add a constructor to initialize a CompRegion from a series of CompPoint's, much like the XPolygonRegion construct allows for Sam Spilsbury 2010-07-25 PropertyWriter went into core a while ago, no need to depend on compiztoolbox Scott Moreau 2010-07-24 Fix warnings. Sam Spilsbury 2010-07-19 Set scale slot geometry correctly. Fixes keyboard focus moving incorrectly Sam Spilsbury 2010-07-12 Determine the id of the appropriate child window and pass that as "window" for xbutton events in button actions. The previous behaviour was to pass the xbutton.window, but this was usually the frame wrapper window, which meant calls to screen->findWindow () would fail since this window was not in screen->windows (); Sam Spilsbury 2010-07-04 Update NEWS for 0.9.0 release Sam Spilsbury 2010-07-04 Fix debugging prefix Sam Spilsbury 2010-07-04 Add NEWS changes from 0.7.8-0.8.6 Sam Spilsbury 2010-07-04 Install and load local information from XDG_HOME/.compiz-1 to prevent conflicts with compiz-0.8 Sam Spilsbury 2010-07-02 Fix warning in annotate Sam Spilsbury 2010-07-02 Simplify serialization interface Sam Spilsbury 2010-06-23 Kill debug message Sam Spilsbury 2010-06-23 Add install type package vars to avoid a bug where we might install into "/" on some systems Sam Spilsbury 2010-06-19 Revert "[PATCH] Handle dock windows with keep-below mask." This reverts commit 2fb7e4227d516cd2ba8b81e411bbfc0aca127943. Handling dock windows like this causes problems for docks that are set above windows (like plasma panel) we need to find a better way to handle these windows Sam Spilsbury 2010-06-18 Kill debug messages Sam Spilsbury 2010-06-18 Add COMPIZ_ENABLE_PACKAGING option so that distros with default settings for prefix, etc don't override what the use has specified with CMAKE_INSTALL_PREFIX Also remove install (libcompiz.so), we use compiz_opt_install_file anyways for it Sam Spilsbury 2010-06-13 Add missing files Sam Spilsbury 2010-06-12 A few big changes: * Rewrite PropertyWriter, move it out of compiztoolbox * Added CompPluginStateWriter, a serialization interface, which plugins inherit, and specify how to serialize their class members, which will be automatically unloaded and reloaded as plugins unload and reload. * Currently there are bugs with this interface, so it is disabled by default (mostly bugs to do with boost and libdl) * Depend on libboost-serialization * A few bugfixes Adel Gadllah 2010-06-05 Install locale in standard location Translations should be in ${datadir}/locale not ${datadir}/compiz/locale Dominique Leuenberger 2010-06-01 [PATCH] Cmake: give more control to packagers - allowing them to specify install Allows developers to specify libbdir, datadir and bindir, just as they are used from autotools based projects. Additionally, this removes the need for packagers to fiddle with LIB_SUFFIX. Sebasian Billaudelle 2010-05-25 [PATCH] Handle dock windows with keep-below mask. Sam Spilsbury 2010-05-25 Load after decor plugin where appropriate to prevent windows shifting on plugin load and unload Sam Spilsbury 2010-05-23 Don't dump the template once we delete a property Sam Spilsbury 2010-05-23 Sanity check Sam Spilsbury 2010-05-23 Add getReadTemplate function and make plugins use that. This avoids some repetitive coding when setting up values to input into the property. Sam Spilsbury 2010-05-23 Use PropertyWriter in plugins which set window properties Sam Spilsbury 2010-05-23 Don't require opengl or composite, but load after them if available Sam Spilsbury 2010-05-23 Added generic X11 Window Property handler class which reads and writes window properties on a template Sam Spilsbury 2010-05-22 compiz_opt_install_file already adds destdir, no need to double it Sam Spilsbury 2010-05-22 Don't generate files to COMPIZ_DESTDIR Sam Spilsbury 2010-05-21 Link Xext explicitly because distributions are moving in the direction of requiring strict DSO linking Sam Spilsbury 2010-05-19 COMPIZ_DESTDIR support for windowsettings xml Sam Spilsbury 2010-05-19 Fix DESTDIR related typo Ensure no rpath linkage in kde4-w-d gtk-w-d and blur Danny Baumann 2010-05-19 Return resName as CompString so it can't be modified by the caller. Travis Watkins 2010-05-18 add resName getter Sam Spilsbury 2010-05-18 Added DESTDIR support for packaging Sam Spilsbury 2010-05-18 Make full rpath support optional (for those who need to build in a non-standard path) Sam Spilsbury 2010-05-15 Add ability to have bindings toggle scale mode Sam Spilsbury 2010-05-15 Cleanup linkage handling and use rpath for plugins. rpath is generally bad because it results in stupid linkage which can break with distribution upgrades (which is the reason for previous commits which use ldconfig LIBDIR). However, it doesn't appear to be against any distribution's policy to use rpath for "internal" libraries such as plugins linking against each other - so instead of adding those rather generic names to the ld.so cache, just specify an rpath, since there is no way there would be multiple versions of a plugin at once (and even then plugins would have to manually link). This *does* stretch the boundaries allowed by distributions slightly however, since other plugins usually have to link with libcomposite and libopengl in order to load them, however we have our own system of safeguard checks to ensure that the right plugins are loaded in any case (since the linkage will change dynamically on dlopen () - the initial linkage is only there so that dlopen () will not complain when it can't find the composite and opengl libraries, but in that case, it wouldn't even matter anyways since those plugins have to be loaded in order to be useful) For distribution policy, see: http://wiki.debian.org/RpathIssue http://fedoraproject.org/wiki/Packaging/Guidelines#Beware_of_Rpath Sam Spilsbury 2010-05-15 Typofix Sam Spilsbury 2010-05-15 CompizToolbox depends on composite and opengl, although it really shouldn't Sam Spilsbury 2010-05-15 Added compiz_ensure_linkage function and dropped some more rpath stuff Sam Spilsbury 2010-05-15 Add necessary changes to compile without rpath usage Sam Spilsbury 2010-05-14 Fix another build related typo Sam Spilsbury 2010-05-14 Fix typo Sam Spilsbury 2010-05-14 Never skip rpath Sam Spilsbury 2010-05-14 To be similar to autofoo it should be "make dist" Travis Watkins 2010-05-13 add soversion for libdecoration Travis Watkins 2010-05-13 build fixes Sam Spilsbury 2010-05-14 Added more commands to commands plugin. Some people use compiz as a standalone WM and require some ridiculous number of command shortcuts. We like to put options in to facilitate those people because we are nice :). Sam Spilsbury 2010-05-13 Add compiz_add_git_dist macro to CompizCommon Sam Spilsbury 2010-05-13 Fix warning Merge: ae325b9 e682cc2 Sam Spilsbury 2010-05-13 Merge branch 'master' of git+ssh://smspillaz@git.compiz.org/git/compiz/core Sam Spilsbury 2010-05-13 Ensure that plugins get correctly loaded after composite and opengl. Some plugins had an oversight which caused them to not load correctly due to a missing tag. Also some plugins should have been loading after these plugins. This fixes a potential glitch in newer versions of libdri. It also fixes ugliness in the mass redirection/unredirection of windows when the opengl plugin is loaded/reloaded Travis Watkins 2010-05-12 add a simple `make dist` target Sam Spilsbury 2010-05-12 Use configureXWindow and XConfigureWindow respectively instead of ::resize. ::resize and XMoveResizeWindow are mostly functions for internal use and they don't correclty configure the window the way we need it. This results in some weird display artefacts with the switcher popup window Sam Spilsbury 2010-05-11 A slightly more detailed description of what "Hover Timeout" actually does Sam Spilsbury 2010-05-11 Fix conditional jump or move being based on uninitialized values Sam Spilsbury 2010-05-09 Read decoration settings from the decor plugin and not the decoration plugin Sam Spilsbury 2010-05-09 Don't use pkg-config to link blur with libdecoration. Set the install rpath so that blur can be linked locally with libdecoration. This fixes a case where pkg-config would import wrong include files if 0.8.x was installed. Sam Spilsbury 2010-05-06 Kill some debug messages Sam Spilsbury 2010-05-06 Check to see if switcher grab does NOT exist before focusing default window (Previous behaviour was most likely a typo) Sam Spilsbury 2010-05-05 Move dbus to utility Sam Spilsbury 2010-05-03 Use corect calculation Sam Spilsbury 2010-05-03 Typofix Danny Baumann 2010-05-02 Optionally traverse through ancestry when getting the client leader of a window which has no own client leader set. Sam Spilsbury 2010-04-29 dbus: Use C++ bool Merge: a4c0bd1 4719477 Danny Baumann 2010-04-28 Merge branch 'master' of git+ssh://git.compiz-fusion.org/git/compiz/core Danny Baumann 2010-04-28 Add some additional accessor functions for more consistent class usage. Sam Spilsbury 2010-04-27 blur: link correctly with libdecoration Sam Spilsbury 2010-04-23 Don't recursively add plugins in folder Sam Spilsbury 2010-04-23 Move some buildsystem defines into CompizCommon Sam Spilsbury 2010-04-23 Fix double define Sam Spilsbury 2010-04-23 Move certain defines to CompizCommon Sam Spilsbury 2010-04-23 Use CompizDefaults to export file locations instead Sam Spilsbury 2010-04-23 Revert "Exported some CMake definitions so they can be used by other compiz" This reverts commit 4bbdbba18af7023e39b1c3055db26b5408c07e63. This should better be done in CompizDefaults.cmake Merge: 4bbdbba b7cdb45 Sam Spilsbury 2010-04-22 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2010-04-22 Exported some CMake definitions so they can be used by other compiz modules using CMake to work out where compiz is installed (for linking etc) Dennis Kasprzyk 2010-04-18 Typo. Scott Moreau 2010-04-16 Add hint so image button appears in ccsm. Sam Spilsbury 2010-04-12 Remove unneeded assignment Sam Spilsbury 2010-04-11 Fix wrongly drawn window icon in 3D gtk mode Merge: a48e55b 6b01b85 Sam Spilsbury 2010-04-11 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2010-04-11 Try and load non-rendering plugins after opengl and composite. Loading them before opengl and composite doesn't do any harm, but it causes an ugly flash while windows are reparented/unreparented then redirected/unredirected when loading plugins if compiz decides to insert them before the rendering plugins (since the rendering plugins must first be unloaded then reloaded as they are popped off the stack) Danny Baumann 2010-04-07 Fixup coding style. Merge: e4d22a6 cf77c69 Sam Spilsbury 2010-04-05 Merge branch 'master' of git://git.compiz.org/compiz/core Sam 2010-04-05 Fix slightly offset window decorations with certain metacity themes Sam 2010-04-04 Give inotify a more meaningful name Sam 2010-04-04 Move D-Bus plugin to correct category Danny Baumann 2010-04-04 Avoid excessive casting. Merge: 9fe1e7f 44f71ba Danny Baumann 2010-04-04 Merge branch 'master' of git+ssh://git.compiz-fusion.org/git/compiz/core Sam Spilsbury 2010-04-04 Correctly handle weird icon sizes. iw * ih may overflow the value range of unsigned long if iw and ih are large enough, so check the single values as well. Forward port of 1bed3dbcea6473f84745ec7a1f936c4f5d3b3a01 to master Scott Moreau 2010-04-03 Fix build. Errors introduced by 69c7f0cf084359d666447f4573d7cc8d8b6420d0 Sam Spilsbury 2010-04-04 Cube documentation update Sam Spilsbury 2010-04-04 Update openGL Plugin documentation Sam Spilsbury 2010-04-03 Composite plugin documentation update Merge: 2f545ec 1c9d411 Sam Spilsbury 2010-04-03 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2010-04-02 Fix offset window buttons in 2D mode for both gtk and cairo Sam Spilsbury 2010-04-02 Fix offset event window positions in cairo 2D mode bug Sam Spilsbury 2010-04-02 Fix drawing issues on bottom in cairo mode Sam Spilsbury 2010-04-02 Fix mis-aligned frame event windows Sam Spilsbury 2010-04-02 Fix further 2D GTK drawing issues Sam Spilsbury 2010-04-02 Fix offset window buttons in 2D mode for both gtk and cairo Sam Spilsbury 2010-04-02 Fix offset event window positions in cairo 2D mode bug Sam Spilsbury 2010-04-02 Fix drawing issues on bottom in cairo mode Sam Spilsbury 2010-04-02 Fix mis-aligned frame event windows Sam Spilsbury 2010-04-02 Fix further 2D GTK drawing issues Danny Baumann 2010-03-29 Revert broken define usage. Sam Spilsbury 2010-03-28 Fix rendering and frame position inconsistencies. For metacity themes especially, we ned to use d->context to determine frame size. There was an API change with gdk_window_reparent, so update for that too Sam Spilsbury 2010-03-28 Fix wrong decoration position and event handling in 2D mode scott 2010-03-24 Fix typo. Sam Spilsbury 2010-03-25 Fix typo and cleanup Sam Spilsbury 2010-03-24 Revert "Fix window position validation for windows changing size but not position" This reverts commit aea1f07bd4c4d157a26ab8571250dfa0df904144. Conflicts: plugins/place/src/place.cpp Sam Spilsbury 2010-03-24 Fixed partial decorations on decor plugin reload bug Sam Spilsbury 2010-03-24 Fixed deprecated symbol in gtk-window-decorator Sam Spilsbury 2010-03-24 C++ port of the D-Bus Plugin With additional cleanup by Danny Baumann See http://git.compiz.org/~smspillaz/dbus/commit/?id=bd4f98234e2af517d023b0ae9501ee0a91732fc2 Sam Spilsbury 2010-03-24 Documentation update for CompIcon, ModifierHandler, CompOutput, PluginClassStorage, PluginClassIndex, CompPoint, CompRect, CompRegion and CompSize Sam Spilsbury 2010-03-24 Fixed some documentation Merge: 323c800 19e7e51 Sam Spilsbury 2010-03-24 Merge branch 'master' of ../compiz-core-doc Sam Spilsbury 2010-03-23 Fixed missing left/right bits on 3d mode metacity Danny Baumann 2010-03-19 Cleanup Sam Spilsbury 2010-03-19 Keep pixmaps around if window has been unmapped on resize. Merge: b4d3d4e b5e0fc0 Sam Spilsbury 2010-03-19 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-03-19 Cleanup Sam Spilsbury 2010-03-19 Added 2D Decoration mode to GTK Window Decorator Sam Spilsbury 2010-03-18 Fix typo Sam Spilsbury 2010-03-15 Keep pixmaps of unmapped windows around if they are used for animations. Previously, they were discarded if the window was resized right after being unmapped. As that might end close animations too early, keep the pixmap around until setting the internal state to 'unmapped'. For those cases, the pixmap size (width/height) will differ from the window geometry (attrib.width/attrib.height), though, so plugins should use the former values for animation purposes. Forward port of 54833da0e3d8efb946dcb38afe27914a47f1565f to master Sam Spilsbury 2010-03-15 Remove deprecated functions and replace them with their alive counterparts. Sam Spilsbury 2010-03-15 Also place windows that are marked unmovable. As we assign the window actions ourselves, there's no sense in obeying it during placement, which would (and did) essentially disable placement for certain window types. Forward port of 58f85693bc1f4e612aaf0b6f1759e1734752f1ff to master Sam Spilsbury 2010-03-15 Link required libraries explicitly. Sam Spilsbury 2010-03-15 Fix window position validation for windows changing size but not position Previously, we left the position of windows that have USPosition set untouched, even if they didn't try to change position at all, but only changed size. This caused such windows to become partially offscreen e.g. if they were positioned at the lower edge of the work area before the size change and increased height afterwards. Forward port of 3c16152938c44454f42d08a4b92cc46093c9a782 to master Merge: b5e0fc0 5c15458 Kristopher Ives 2010-03-11 Merge branch 'master' of /home/kris/workspace/compiz Conflicts: include/core/window.h plugins/composite/include/composite/composite.h Sam Spilsbury 2010-03-09 Cairo mode almost done. Fixed crash to do with incorrect iterator usage Scott Moreau 2010-02-22 Properly calculate damage region. Scott Moreau 2010-02-22 Draw more finely granulated ellipse outline. Scott Moreau 2010-02-22 Add option to change erase size. Scott Moreau 2010-02-22 Use the same width for all lines. Scott Moreau 2010-02-22 Make corners of rectangles square while dragging. Scott Moreau 2010-02-22 General reorganization and cleanup. Scott Moreau 2010-02-22 Add option to use initial click point as center for drawing shapes. Scott Moreau 2010-02-22 Add straight line drawing function. Scott Moreau 2010-02-22 Draw ellipses instead of circles. Scott Moreau 2010-02-15 Fix longstanding damage issue. Dennis Kasprzyk 2010-02-15 Revert "Fix longstanding damage issue." This reverts commit 6da1124112165f35bea278281e709d96066125fa. Scott Moreau 2010-02-15 Fix longstanding damage issue. Guillaume Seguin 2010-02-15 Cleaner Xext dep Guillaume Seguin 2010-02-15 Addd libXext and libdl to core links Merge: c4ed4c1 5aad838 Sam Spilsbury 2010-02-13 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-02-13 Initial reparenting support Scott Moreau 2010-02-13 Categorize resize options. Scott Moreau 2010-02-13 Categorize switcher options. Dennis Kasprzyk 2010-02-13 Fake enlightment desktop property to make qt ignore the composite window during frame calculations. Dennis Kasprzyk 2010-02-13 Better detection of tooltip windows (KDE backport). Dennis Kasprzyk 2010-02-12 Kde 4.4 support. Dennis Kasprzyk 2010-02-12 Place frame windows in correct stacking order. Dennis Kasprzyk 2010-02-12 Unmap also the frame of minimized windows. Sam Spilsbury 2010-02-11 Clients must specify position on _NET_MOVERESIZE_WINDOW ClientMessage Only accept ConfigureRequest / _NET_MOVERESIZE_WINDOW ClientMessage events as placement if the application indicates that it wants to specify the window position. Forward port of 65ed618a5f36b795dbef69ba04ebde6b911d228c to master. Sam Spilsbury 2010-02-11 Fix screen resolution change handling Dennis Kasprzyk 2010-02-10 Missing files. Dennis Kasprzyk 2010-02-10 Window position doesn't have to be synced to update frame window region. Dennis Kasprzyk 2010-02-10 Integrate the KDE/Qt event loop directly into compiz instead of using the glib main loop. Sam Spilsbury 2010-02-09 Fix typo Merge: 9c0f5ea 1fec37d Sam Spilsbury 2010-02-09 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Dennis Kasprzyk 2010-02-09 Don't break initial stacking order. Sam Spilsbury 2010-02-09 Load after decoration Sam Spilsbury 2010-02-09 Fix DIV 0 Merge: 1ecf6ce fb94b80 Sam Spilsbury 2010-02-08 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Dennis Kasprzyk 2010-02-08 Fixed fullscreen window handling. Danny Baumann 2010-02-07 Simplify window removal. Danny Baumann 2010-02-07 Simplify window removal. Danny Baumann 2010-02-06 Fix selection aquiring, cleanup. Sam Spilsbury 2010-02-06 Fix invalid read Sam Spilsbury 2010-02-06 Properly send ClientMessage event after aquiring selections. Send appropriate ClientMessage for both the compositing manager and the window manager. Also rework appropriate functions Forward port of e86e5bee8ee6f1f265a76fef5fb0dc4e2c56be06 to master Dennis Kasprzyk 2010-02-04 Typo. Dennis Kasprzyk 2010-02-04 Fixed missing variable. Dennis Kasprzyk 2010-02-04 Reparent managed windows directly. Dennis Kasprzyk 2010-02-04 Catch NULL pointers. Dennis Kasprzyk 2010-02-04 Fixed region handling of new windows. Sam Spilsbury 2010-02-05 plugins: fix warnings Sam Spilsbury 2010-02-05 Fix typo and fix more warnings Sam Spilsbury 2010-02-05 core: fix more warnings Sam Spilsbury 2010-02-05 core: fix warnings Merge: 08c22af d6769e8 Sam Spilsbury 2010-02-05 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Conflicts: plugins/place/src/place.cpp Sam Spilsbury 2010-02-04 place: Improve resolution change handling. Windows are now moved/resized in a better way when changing resolution. Also, old window position and size will be remembered, so that they can be restored when going back to the original resolution. API changes were necessary in core, the functions ::updateStruts and ::updateWorkarea were moved from Private* to Comp* Forward port of 4327a7c83dc6c1fe77891ba7c6bf5023d21dfde8 Danny Baumann 2010-02-03 Fix wrappable count. Danny Baumann 2010-02-03 Advertise support for _NET_REQUEST_FRAME_EXTENTS. Danny Baumann 2010-02-03 Improve API. Sam Spilsbury 2010-02-03 Support _NET_REQUEST_FRAME_EXTENTS client message. Forward port of ef68d2cab3598a78de9b836c86fda7741d842870 to master Sam Spilsbury 2010-02-03 Advertise full placement support. 4521a0297386e183eb0374321ad677b4b1aaee97 Forward port of commit Sam Spilsbury 2010-02-03 Make addSupportedAtoms wrappable and use std::vector Sam Spilsbury 2010-02-03 Pixmaps created using glXCreatePixmap must be destroyed using glXDestroyPixmap We previously used glXDestroyGLXPixmap but this is wrong (according to GLX 1.4 spec, section 3.4.2). Forward port of 208b459b141b6d49f48796231146bb33d5dc1d26 to master Sam Spilsbury 2010-02-03 Apply stacking changes after configure Merge: bc1d53a 55656e8 Sam Spilsbury 2010-02-03 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-02-03 Fix possible segfault on 64-bit arch. due to passing 0 to va_list and retrieving it as pointer. 5a6dbfdea66620b3a6ae50540a75714e0a975ce7 to master Forward port of commit Sam Spilsbury 2010-02-03 Short cut placement output determination if there is only one output. Forward port of c02145a304e58fc502cb85499a1bbaf0dd843cea to master Sam Spilsbury 2010-02-03 Added option for placing newly mapped windows under the pointer. Forward port of 89c5642c737bba9d653fa242d1e0dd03cebb8db6 to master Sam Spilsbury 2010-02-03 Disable texture compression by default Forward port of 7c7628f2b6ad644afa6282b96b67e74ba1c48c2b to master Sam Spilsbury 2010-02-03 Revert "Update client list after unhook/insert." This reverts commit 8c7459734c497d20fd8682b2268336ba31297f73. Sam Spilsbury 2010-02-03 Update client list after unhook/insert. Forward port of d8285f4f8c6ca50b69965a225c36cdad1e456d24 Sam Spilsbury 2010-02-03 Activate the topmost window when lowering a window, unless click-to-focus is off. Forward port of 85ba708cb894658c9bf9862a311010a9b79ec6f2 to master Sam Spilsbury 2010-02-03 Use NULL instead of 0. Using 0 is unsafe on 64bit Dennis Kasprzyk 2010-02-02 Fixed cmake cache problems. Sam Spilsbury 2010-02-03 Fix inaccessible windows when reducing num. of viewports. Forward port of 0b9c5efe8c2b6fe60780b8c3245b4aaa8ecdc943 to master Sam Spilsbury 2010-02-03 rotate: Fix lost window by preventing edge flip for sticky windows. Forward port d8ac316d2d5790544adcef44b66c6f9f915dc6f0 to master Sam Spilsbury 2010-02-03 Prevent sticky windows from moving off-screen. Forward port of f02bf9d435def37d4587014a4548e8d99401f19d to master Sam Spilsbury 2010-02-03 Fix lost window by bringing window made sticky to current viewport. Forward port of 4bc44131442e9dbefadcad1a46932aec44bbcada to master Sam Spilsbury 2010-02-03 Fix crash in multi-screen setups. Forward port 24dea72a395071b533dcf66b2eef37b20522cbba to master Sam Spilsbury 2010-02-03 Fix Gnome keybinding list. Forward port of : c409afbf928d67b4a87360ba44e5f3a1df5b471d to master Sam Spilsbury 2010-02-02 Revert "Correctly reflect that the switcher window is managed." This reverts commit b27402c2460592bc3ed6c41c2b7d5cae47e79079. We should not allow plugins to directly write to w->managed, some core event should be used to set managed and recalculate the window state. Sam Spilsbury 2010-02-02 Revert "Fix typo" This reverts commit cb117afd36fd3e9efd07c2801fc9f6d79e706928. Sam Spilsbury 2010-02-02 Fix gravity handling. Forward port of 510c24577c47eb9d373a3817e0475187631a71e8 Sam Spilsbury 2010-02-02 Only keep windows on-screen that were fully on-screen before. Forward port of 0b05a30cdc65c3abd2d1564667c954125d18514e to master Sam Spilsbury 2010-02-02 Fix typo Sam Spilsbury 2010-02-02 Correctly reflect that the switcher window is managed. Forward port of 46371f9172089a3e60648b834611d5694df2e80b to master Sam Spilsbury 2010-02-02 Fix icon property reading if the icon pixmap has a depth of 1 bit. Forward port of 4c7ffc4f1d82414a466fa0768d16fa96f30e3f7a to master Sam Spilsbury 2010-02-02 Fix window region calculation for windows that have border width set. Forward port of 79a275b240a98d9f64c8dd1e799e5d469ec8f204 to master Sam Spilsbury 2010-02-02 Fix Handling of windows that have a server border set. Merge: 9c8edd0 26bb656 Sam Spilsbury 2010-02-02 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-02-02 Fix crash on opening windows We must defer match evaluation until window initialization has finished for all plugins as match evaluation means wrapped function calls. Forward port of 43c269a377e7b446fb1bb70732835b7395ce9524 to master Scott Moreau 2010-02-01 Implement shape drawing interface. Scott Moreau 2010-01-07 Fix typo. Scott Moreau 2010-01-26 Get erase button working. Sam Spilsbury 2010-01-22 Fix character encoding issue Sam Spilsbury 2010-01-22 Add appropriate operator overloads to CompPoint Sam Spilsbury 2010-01-21 Add some documentation on how geometry () and serverGeometry () work Dennis Kasprzyk 2010-01-07 Stupid porting bug. Erkin Bahceci 2009-12-25 Paint switcher icons at the same size. Forward port of 06f538d460b72a044e3da72f01d385890da43e84. Erkin Bahceci 2009-12-25 Remove unused switcher constants. Erkin Bahceci 2009-12-25 screenshot: Ignore files with trailing characters in the name. e.g: screenshot2.png.sig Forward port of 13293a056bf9a559c3f173c08ac074e5d07e7065. Erkin Bahceci 2009-12-25 wobbly: Obey move's constrain_y option. Constrains window to work area when it's thrown. Forward port from 0d23e499774769d295509f189fbf4b7c21763ef6, d7e84d079ee28c3d55451d3d1aa647ce477d3169, 57c7609a9975d760bdfd93f21c9a3d92cda206eb, d591d12076ec7d7c595911fbb1ac11529b5557a5, 615d823f5edc26eaa12e83c97099c7ab0f017968, 24dea72a395071b533dcf66b2eef37b20522cbba. Erkin Bahceci 2009-12-25 move: Don't constrain y on key/button move. Forward port from 57c7609a9975d760bdfd93f21c9a3d92cda206eb. Erkin Bahceci 2009-12-24 Don't use mipmap for icons. Forward port of 0138d355b849d675a82d57a2c293a96fff2bcaa2. Erkin Bahceci 2009-12-18 Resize constraint and snap for combined work area. Allows resizing across monitors while snapping/constraining to monitor work area edges. Forward port of 93d8762391d7c2ffedaa31f5fbb03913089e44ac, 53976f1916a6659a75e0159a4dfbc1fb2188d34f, and 57c7609a9975d760bdfd93f21c9a3d92cda206eb. Erkin Bahceci 2009-12-18 Add another contains method to CompRegion. Erkin Bahceci 2009-12-18 Add CompWindowGrabExternalAppMask. Erkin Bahceci 2009-12-16 Add notification for "before map". Erkin Bahceci 2009-12-15 Various minor optimizations. Erkin Bahceci 2009-12-15 Use CountedList instead of std::list. Erkin Bahceci 2009-12-15 Add CountedList class, a wrapper for std::list. This std::list wrapper is to be used for cases where size() needs to be called, since std::list.size() has linear complexity in gcc, whereas CountedList::size() has constant complexity, as it keeps a counter. Erkin Bahceci 2009-12-14 Fix crash when first switching after a window is minimized. In that case, the crash happened when the minimized window was highlighted in the switcher window. Danny Baumann 2009-12-07 Consolidate icon related functions and move them to window class. Merge: 05f393a a34f26b Sam Spilsbury 2009-12-07 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2009-12-07 Add a showIconOnly () virtual function to BaseSwitchScreen so that switchers can show the icon of applications only when switching Scott Moreau 2009-12-05 Properly expand variables. Dennis Kasprzyk 2009-11-26 Save right cursor coordinates. Dennis Kasprzyk 2009-11-18 Fixed image paths. Dennis Kasprzyk 2009-11-18 Less mallocs. Dennis Kasprzyk 2009-11-18 Speedup. Dennis Kasprzyk 2009-11-18 Avoid unneeded mallocs. Dennis Kasprzyk 2009-11-18 More getters. Dennis Kasprzyk 2009-11-18 Fixed build type for plugins. Eduardo Gurgel Pinho 2009-11-16 Getters to Cube Gears plugin usage. Scott Moreau 2009-11-09 Reorganize scale options Dennis Kasprzyk 2009-11-16 Initialize decoration with correct geometry of a reparented window. Dennis Kasprzyk 2009-11-16 Show decoration in a timeout to make sure that Qt gets the Reparenting related events first. Dennis Kasprzyk 2009-11-16 Fixed edge flipping. Dennis Kasprzyk 2009-11-16 Fixed action option handling. Erkin Bahceci 2009-11-16 Fix selected window appearing below others while switching. Happens only in certain cases (e.g. after showing gnome-panel tooltips). Sam Spilsbury 2009-11-16 Check variables in the correct order to shut up valgrind Sam Spilsbury 2009-11-16 Revert "Ensure identity matrix is actually identity and not an uninitialized matrix" This reverts commit b9592cab7fc1632b98f62b3afb8e6cc773ee0d7f. Merge: b9592ca 3e17ace Sam Spilsbury 2009-11-14 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2009-11-14 Ensure identity matrix is actually identity and not an uninitialized matrix Erkin Bahceci 2009-11-13 Fix typo, which caused the disappearing window issue. Erkin Bahceci 2009-11-06 Add optional max grid size param. to glAddGeometry. Erkin Bahceci 2009-11-05 Fix return issues. Dennis Kasprzyk 2009-11-04 Fixed window paint offset handling. Merge: 9f97563 790e4b7 Kristopher Ives 2009-11-04 Merge branch 'master' of git://anongit.compiz.org/compiz/core Scott Moreau 2009-11-03 Reorganize core options Scott Moreau 2009-11-03 Move rotate to desktop category and reorganize options Scott Moreau 2009-11-03 Move cube to desktop category and reorganize options Dennis Kasprzyk 2009-11-03 Final fix for overlapping outputs. Dennis Kasprzyk 2009-11-03 Removed unneeded variable. Dennis Kasprzyk 2009-11-03 Check for overlapping Outputs. Dennis Kasprzyk 2009-11-03 Provide a cmake option to control -Wsign-conversion compile flag. -Wsign-conversion is now off by default. Dennis Kasprzyk 2009-11-03 Set cmake policy. Dennis Kasprzyk 2009-11-03 Rotate C++ port. Dennis Kasprzyk 2009-11-03 Cube C++ port. Kristopher Ives 2009-10-28 Deleted auto backup files again. Kristopher Ives 2009-10-25 Added documentation for some internal classes. Fixed some old comments. Kristopher Ives 2009-10-25 Excluded *Wrap* from Doxygen. Fixed some old comments. Kristopher Ives 2009-10-25 Fixed some old comments syntax. Added some docs for some internals to CompPlugin. Added some docs for some internals for CompAction. Kristopher Ives 2009-10-25 Fixed some old /// docs. Added class description docs for some structs and classes. Kristopher Ives 2009-10-25 Added early docs for CompTimer and it's methods. Kristopher Ives 2009-10-25 Added some preliminary doc for how CompMatch works. Kristopher Ives 2009-10-24 Added some TODO comments for WindowInterface and helper struct/enums. Kristopher Ives 2009-10-24 Updated Doxyfile to ignore "_" and "Private" structs/classes. Removed plugins/ from doc. Separate Doxfile and docs/plugins is warranted. Kristopher Ives 2009-10-22 Started documenting composite plugin. Kristopher Ives 2009-10-22 Trying to make sure I'm not versioning autobackup files. Kristopher Ives 2009-10-22 Added Doxyfile. Started documenting core. Erkin Bahceci 2009-10-19 switcher: Fix crash when a minimized window closes while switching with "show minimized" on. (Forward port of 354adbe10a18509e9ea736cb3ec37916524cf8c3). Erkin Bahceci 2009-10-18 Add missing file with translation. (from 62be1227b85284e7a937457aa57f591a890baa02) Guillaume Seguin 2009-10-14 Fix charsets in some po files (cherry picked from commit 9bacbcd32859d960fbeb67fc9acf7671313443db) Guillaume Seguin 2009-10-13 Update translations Sam Spilsbury 2009-10-13 Scale interface changes: Make the ScaleSlot, ScaleType definitions global and expose getters and setters to control slot state, animation and the hoveredWindow. Also make ScaleSlot derive from CompRect Sam Spilsbury 2009-10-12 Fix typo Merge: 70c3860 3244717 Sam Spilsbury 2009-10-12 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Erkin Bahceci 2009-10-01 Link pthread (protobuf >= 2.1.0 needs it). Dennis Kasprzyk 2009-09-29 Fixed initial size problems. Erkin Bahceci 2009-09-25 move: Fix memory leak. Erkin Bahceci 2009-09-25 Fix crash when glGenerateMipmapEXT is unavailable. Danny Baumann 2009-09-14 Check returned geometry for validity prior to using it. Merge: 9b88320 d5c476c Sam Spilsbury 2009-09-09 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Erkin Bahceci 2009-09-06 wobbly: Snap to work area edges instead of output edges. Joel Bosveld 2009-09-04 Include gconf directory when building gtk/gnome/compiz-window-manager.c Merge: 082bf8c c2ca12e Sam Spilsbury 2009-08-29 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Dennis Kasprzyk 2009-08-27 Don't forget to update mipmaps. Merge: 18fbaa1 a768bd3 Dennis Kasprzyk 2009-08-27 Merge branch 'master' of git+ssh://git.compiz-fusion.org/git/compiz/core Dennis Kasprzyk 2009-08-27 Fixed mouse wheel calculations by providing correct global position. Erkin Bahceci 2009-08-23 wobbly: Fix artifacts. Erkin Bahceci 2009-08-23 Let windows be opened above fullscreen windows. Erkin Bahceci 2009-08-23 Avoid setting XSelectInput to NoEventMask for grabWindow. Prevents compiz from getting stuck at termination in ~CompWindow(). Merge: 9ac4fd0 f03d305 Sam Spilsbury 2009-08-23 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Erkin Bahceci 2009-08-21 Silence some warnings. Erkin Bahceci 2009-08-21 Delete array with delete []. Erkin Bahceci 2009-08-21 Fix memory leaks. Erkin Bahceci 2009-08-21 Remove sequences at termination. Erkin Bahceci 2009-08-15 Unsigned int conversions. Erkin Bahceci 2009-08-14 compiztoolbox: Close the user-dirs file when the XDG variable is not found. Erkin Bahceci 2009-08-14 Remove unused member variable. Erkin Bahceci 2009-08-14 Delete arrays with delete []. Erkin Bahceci 2009-08-14 opengl: Fix uninitialized member variable. Erkin Bahceci 2009-08-14 copytex: Fix memory leak. Erkin Bahceci 2009-08-12 Fix possible infinite loop. Erkin Bahceci 2009-08-12 glib: Fix deallocation issues. Sam Spilsbury 2009-08-12 Remove annotate and clone from legacy Erkin Bahceci 2009-08-11 Revert "Fix panels starting below other windows." This reverts commit d6f56253b2d2ffd8be1f6283fac2a3e13a45130c. This didn't work as expected, as windows' input was still above panels even though windows looked like they were behind panels, whenever the problem happened. When fullscreen mode is initiated in evince, this commit also caused windows to have their input in front of evince's fullscreen window even though the fullscreen window appears to be in front of them. This in turn triggered a freeze when the user clicks on the screen in evince while in fullscreen mode. Merge: 2a4208d 02dee3b Sam Spilsbury 2009-08-11 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2009-08-11 C++ port of the clone plugin, thanks for Erkin Baceci for proofreading Erkin Bahceci 2009-08-08 wobbly: Move disabling window paint functions to preparePaint. Erkin Bahceci 2009-08-08 annotate: Require opengl plugin. Erkin Bahceci 2009-08-08 wobbly: Disable functions in donePaint instead of preparePaint. Erkin Bahceci 2009-08-08 water: Fix typo. Merge: 51675c3 25d96f4 Sam Spilsbury 2009-08-08 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2009-08-08 C++ port of the annotate plugin Erkin Bahceci 2009-08-08 Add plugin categories and required features. Sam Spilsbury 2009-08-08 Use Sam Spilsbury 2009-08-08 Revert "Use " This reverts commit 1234ee9de9950799cefd7e62e8dad2167c6ac9af. Sam Spilsbury 2009-08-08 Use Merge: 223b935 6f4df47 Sam Spilsbury 2009-08-08 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2009-08-08 Remove debug message Erkin Bahceci 2009-08-07 screenshot: Use correct desktop directory by default. When the directory option is set to empty string (the new default), screenshot now uses getXDGUserDir () in compiztoolbox to get the correct desktop directory (from $XDG_CONFIG_HOME/user-dirs.dirs). Erkin Bahceci 2009-08-07 compiztoolbox: Add function to get XDG user dirs. Dennis Kasprzyk 2009-08-07 KDE4 window decorator KDE 4.3 port. Dennis Kasprzyk 2009-08-07 Don't update region if geometry is not in sync. Erkin Bahceci 2009-08-05 wobbly: Update snapping when "snap inverted" option value changes. Dennis Kasprzyk 2009-08-04 Added KAboutData. Dennis Kasprzyk 2009-08-01 Added support for posix 2008 scandir definition Sam Spilsbury 2009-08-01 Include cstdio and others instead of their C counterparts for g++ 4.4 compatibilty Sam Spilsbury 2009-08-01 Add homogenize, normalize, norm functions to GLVector from compiz-0.8 Erkin Bahceci 2009-07-30 C++ port of wobbly plugin. Erkin Bahceci 2009-07-30 switcher: Fix sign warnings. Erkin Bahceci 2009-07-30 More unsigned int to int conversion. Dennis Kasprzyk 2009-07-31 Changed unsigned int to int to fix warnings Dennis Kasprzyk 2009-07-31 Handle signed/unsigned correctly Erkin Bahceci 2009-07-30 Use -Wsign-conversion for compiling. Erkin Bahceci 2009-07-30 compiztoolbox: Add library linker flag. Erkin Bahceci 2009-07-29 composite: Move getTimeToNextRedraw to PrivateCompositeScreen. Erkin Bahceci 2009-07-29 composite: Added FPS limiter modes and optimalRedrawTime (). Joel Bosveld 2009-07-24 Shaped windows may have only one rectangle which is smaller than window. Fixes bugzilla.gnome.org/show_bug.cgi?id=589472 Erkin Bahceci 2009-07-24 Fix long standing typo. Erkin Bahceci 2009-07-23 Refactor switcher, move parts into toolbox library plugin. Erkin Bahceci 2009-07-23 Add CompRect::operator= (). Erkin Bahceci 2009-07-23 Add CompScreen::normalCursor (). Erkin Bahceci 2009-07-21 C++ port of screenshot plugin. Erkin Bahceci 2009-07-17 Convert Bool -> bool, TRUE -> true, FALSE -> false. Dennis Kasprzyk 2009-07-17 Use -Wall for compiling. Erkin Bahceci 2009-07-15 Fix panels starting below other windows. Erkin Bahceci 2009-07-14 inotify: Fix equality check. Erkin Bahceci 2009-07-14 Fix some compiler warnings. Erkin Bahceci 2009-07-13 Add notifications for show desktop mode. Erkin Bahceci 2009-07-08 Add hasUnmapReference and use it in decor. This prevents a window's decoration to be updated early while it is closing, which isn't necessary anyway. This problem leads to a close animation with an empty frame. Erkin Bahceci 2009-07-08 switcher: Set XClassHint for popup window. Erkin Bahceci 2009-07-08 Move hide/show to PrivateWindow, add wrapper hide/show. The new hide/show are used by switcher, so that it doesn't call minimize/unminimize. Joel Bosveld 2009-07-07 scale: when only scaling windows on current output, only display on current one Joel Bosveld 2009-07-03 CompRect: add set{Left,Top,Right,Buttom} functions Sam Spilsbury 2009-07-01 Move modifier handling into a separate top level class exposed to plugins Sam Spilsbury 2009-06-04 Make bool CompWindow::isFocussable () wrappable Sam Spilsbury 2009-06-05 Make CompWindow::alpha () wrappable Danny Baumann 2009-06-04 Minor cleanup. Sam Spilsbury 2009-06-04 Use boost::bind to tell the callback function the resize mode, don't figure that out within the function itself Merge: f06dcdd b3a2649 Erkin Bahceci 2009-06-03 Merge branch 'master' of git+ssh://cornelius@git.compiz-fusion.org/git/compiz/core Sam Spilsbury 2009-06-03 resize: fix compositingActive check Erkin Bahceci 2009-06-02 Separate clientList. Add clientList accessor. Joel Bosveld 2009-05-07 Add comments for changes to window restacking Joel Bosveld 2009-04-07 Restack windows in reverse, and stack above correct window. Previously this worked due to the order that the events arived in, however, now we want it to be stacked above correct window straight away so that we do not restack it again when configureNotify event comes through Joel Bosveld 2009-04-07 Restack window list immediately when calling reconfigureXWindow Previously, trying to restack multiple windows wouldn't work as expected, as the window list wasn't restacked until the configureNotify was recieved, which lead to it stacking the window above the wrong window Erkin Bahceci 2009-04-24 Register toggle-slow-animations action callback. Erkin Bahceci 2009-04-19 Add notifications for (un)minimize, (un)shade, close. Danny Baumann 2009-04-10 Allow overriding placement mode on a per-window basis. Merge: dd6de55 d2d7783 Erkin Bahceci 2009-04-08 Merge branch 'master' of git+ssh://cornelius@git.compiz-fusion.org/git/compiz/core Joel Bosveld 2009-04-06 Add CompWindowNotifyFocusChange Erkin Bahceci 2009-04-03 Add CompWindowNotifyBeforeDestroy. Erkin Bahceci 2009-04-03 Add CompWindow::pendingMaps (). Erkin Bahceci 2009-04-03 Add CompWindowNotifyBeforeUnmap. Dennis Kasprzyk 2009-04-03 Don't send Hide notify if window is already hidden. Dennis Kasprzyk 2009-03-29 Resize on shade. Dennis Kasprzyk 2009-03-29 Unwrap wrapper on shade. Dennis Kasprzyk 2009-03-29 Clear always texture list on release. Dennis Kasprzyk 2009-03-29 Update frame after resize. Dennis Kasprzyk 2009-03-29 Handle cases correctly where a window should be unmapped but isn't because a plugin increased its unmapReference. Erkin Bahceci 2009-03-26 Initialize static member defaultPaintAttrib. Erkin Bahceci 2009-03-26 Add incrementUnmapReference and incrementDestroyReference. Merge: 7831ff4 bc4b825 Danny Baumann 2009-03-20 Merge branch 'master' of git+ssh://maniac@git.compiz-fusion.org/git/compiz/core Danny Baumann 2009-03-20 Use inputRect method. Danny Baumann 2009-03-20 Add methods to get server geometry including decorations. Danny Baumann 2009-03-20 Add methods to get the window geometry rectangle including decorations. Dennis Kasprzyk 2009-03-20 Register action callbacks. Erkin Bahceci 2009-03-18 Add operator= to GLFragment::Attrib. Danny Baumann 2009-03-18 Remove leftover of previous glib plugin code and improve coding style a bit. Dennis Kasprzyk 2009-03-17 Added KDE/Qt event loop plugin. Dennis Kasprzyk 2009-03-17 Added GLib event loop plugin. Dennis Kasprzyk 2009-03-17 Link with libdecoration.so Dennis Kasprzyk 2009-03-17 Set right property name. Dennis Kasprzyk 2009-03-17 Pass returned events to callback. Dennis Kasprzyk 2009-03-17 Update PKG_CONFIG_PATH correctly. Dennis Kasprzyk 2009-03-17 Fixed timer handling. Dennis Kasprzyk 2009-03-16 Comments Dennis Kasprzyk 2009-03-16 Added version check. Dennis Kasprzyk 2009-03-16 Better BOOST check. Dennis Kasprzyk 2009-03-16 Add always findcompiz_install target to allow updates of the FindCompiz macro. Dennis Kasprzyk 2009-03-16 Add instalation prefix pkg-config path also in FindCompiz macro. Dennis Kasprzyk 2009-03-16 Improved RPATH handling. Dennis Kasprzyk 2009-03-16 Install to right folder. Dennis Kasprzyk 2009-03-16 Added optional install, that will not abort installation if file can't be installed. Danny Baumann 2009-03-16 Whitespace fixes. Danny Baumann 2009-03-16 Expose setDesktop function. Danny Baumann 2009-03-16 Remove useless enum declaration. Danny Baumann 2009-03-16 Auto-update matches when needed. It makes no sense to require callers that do certain actions on matches to call update () when we can do so as well. Danny Baumann 2009-03-16 Build fixes. Dennis Kasprzyk 2009-03-16 Added "all plugins in folder" example CMakeLists.txt Dennis Kasprzyk 2009-03-16 Fixed option initalisation. Dennis Kasprzyk 2009-03-16 Set the right option. Dennis Kasprzyk 2009-03-16 Don't crash if PrivateScreen is not initialized. Set the right option. Dennis Kasprzyk 2009-03-16 Check CompOption::Value type before setting it as option value. Dennis Kasprzyk 2009-03-16 Fixed linking. Dennis Kasprzyk 2009-03-16 Install headers to right folder. Dennis Kasprzyk 2009-03-16 Support any path for plugins. Dennis Kasprzyk 2009-03-16 Drop CompMetadata. Dennis Kasprzyk 2009-03-16 Avoid unneeded recompilation after cmake execution. Dennis Kasprzyk 2009-03-16 Moved to legacy. Dennis Kasprzyk 2009-03-15 Track core changes. Use bcop. Dennis Kasprzyk 2009-03-15 Fix list initalisation. Dennis Kasprzyk 2009-03-15 Moved CompOption::Class to right class. Dennis Kasprzyk 2009-03-15 Track core changes. Use bcop. Dennis Kasprzyk 2009-03-15 Apply core changes. Use bcop. Dennis Kasprzyk 2009-03-15 Apply core changes. Use bcop. Dennis Kasprzyk 2009-03-15 Apply core changes. Use bcop. Dennis Kasprzyk 2009-03-15 Use bcop in core. Dennis Kasprzyk 2009-03-15 Removed const from getOptions. Dennis Kasprzyk 2009-03-15 Use CompOption::Class. Dennis Kasprzyk 2009-03-15 Drop CompMetadata from plugin vtable. Added getOptions and setOption functions to plugin vtable template class. Dennis Kasprzyk 2009-03-15 Added base class for get/setOption(s) functions. Dennis Kasprzyk 2009-03-15 Initialize options without CompMetadata. Dennis Kasprzyk 2009-03-15 Don't package legacy directory Dennis Kasprzyk 2009-03-15 Moved all not yet ported files into legacy directory. Merge: 163f6b6 47d457a Dennis Kasprzyk 2009-03-15 Merge branch 'master' of git+ssh://git.compiz-fusion.org/git/compiz/core Dennis Kasprzyk 2009-03-15 New generalized build system. Merge: e3f9970 90b5d26 Erkin Bahceci 2009-03-14 Merge branch 'master' of git+ssh://cornelius@git.compiz-fusion.org/git/compiz/core Erkin Bahceci 2009-03-14 Rename Private* -> PluginClass* where appropriate. To improve/correct the meaning of some class and file names, this commit renames: core/privatehandler.h -> core/pluginclasshandler.h core/privates.h -> core/pluginclasses.h CompPrivateStorage -> PluginClassStorage PrivateHandler -> PluginClassHandler *PrivateIndex -> *PluginClassIndex Danny Baumann 2009-03-14 Moving the rectangle origin should not change its size. Danny Baumann 2009-03-14 Catch broken plugins that try to start timers without callback. Joel Bosveld 2009-03-09 Change stringFromMetadataPathElement to return a CompString This fixes the bug where missing tags in type="float" will result in a default value of 0.0 instead of 0.1 which leads to problems when trying to get the value Danny Baumann 2009-03-11 Minor cleanup. Sam Spilsbury 2009-03-10 Added iconGeometry getter and convert priv->iconGeometry to CompRect Danny Baumann 2009-03-11 Derive CompWindow::Geometry from CompRect and improve CompRect usage. Danny Baumann 2009-03-11 Include some commonly used methods to rectangle class: - get center point - get area - set position and size using appropriate classes - emptiness check - intersection methods Dennis Kasprzyk 2009-03-10 Support also Qt 4.4 Dennis Kasprzyk 2009-03-10 Added support for QT 4.5 raster graphicssystem. Dennis Kasprzyk 2009-03-10 Blur CompRect changes. Eduardo Gurgel Pinho 2009-03-06 Applying CompRect changes Eduardo Gurgel Pinho 2009-03-06 Better definition to CompRect Christopher Williams 2009-03-09 When a user tries to resize by clicking on the center, don't pass the input down to the window. Dennis Kasprzyk 2009-03-09 Fixed bluring. Dennis Kasprzyk 2009-03-09 Fixed fragment program delection/deletion. Danny Baumann 2009-03-08 Build fixes. Danny Baumann 2009-03-08 Always register as "compiz" to the SM, even if that doesn't match the binary name. Danny Baumann 2009-03-08 SM spec says that SmUserID is a required property. Danny Baumann 2009-03-08 Also save process ID to session manager. Danny Baumann 2008-11-04 Bring desktop files in line with gnome-session 2.24 changes. Danny Baumann 2008-10-21 Fix whitespace. Danny Baumann 2008-10-21 Align window menu to the right for RTL languages. Danny Baumann 2008-10-21 Fix fix formatting for RTL languages. Danny Baumann 2008-10-21 Invert button layout for RTL languages. Danny Baumann 2009-03-08 Always set the LIBGL_ALWAYS_INDIRECT environment variable to 1 if indirect rendering was requested. All AIGLX drivers need that environment variable to return the correct set of extension strings. Other drivers probably ignore the variable, but setting it shouldn't harm in any case. If we don't set this environment variable from inside compiz, we're breaking being restored from a session manager for users of those drivers. Danny Baumann 2009-03-08 Load scale after fade. Danny Baumann 2008-10-06 active_window_changed only updates d->active if decorations are present, so setting d->active before creating decorations may lead to incorrect results. Danny Baumann 2009-03-08 Added 'obs' plugin that handles bindings and matches for changing opacity, brightness and saturation of a window. Danny Baumann 2009-03-08 Fix opacity changes for "constant fade speed" mode. Danny Baumann 2009-03-05 Improve session API. Danny Baumann 2009-03-05 Robustness fixes for "~/.compiz/options directory is deleted" case. Danny Baumann 2009-03-05 Fix parsing of button and key strings. Danny Baumann 2009-03-05 Added set method for point object. Danny Baumann 2009-03-05 Avoid trying to open the same file more than once. Danny Baumann 2009-03-05 blur needs to be linked against libdecoration. Danny Baumann 2009-03-05 Fix wrong assert. Danny Baumann 2009-03-05 Fix geometry of fullscreen output. Danny Baumann 2009-03-05 Fix steps calculation. Danny Baumann 2009-03-03 Minor fixes and optimizations. Danny Baumann 2009-03-03 Added missing metadata for new options. Danny Baumann 2009-03-03 Added opengl plugin requirement. Danny Baumann 2009-03-03 Fix option tags. Danny Baumann 2009-03-03 Remove unresponsive window fadeout from opengl plugin. Danny Baumann 2009-03-03 C++ port of fade plugin. Danny Baumann 2009-03-02 Fix dynamic linking for the "libGL is not in ordinary path" case. Danny Baumann 2009-03-02 Optimizations. Danny Baumann 2009-03-01 Distinguish between unset and not matching option type. Danny Baumann 2009-03-01 Properly set lists. Danny Baumann 2009-03-01 Revert "Avoid warnings about wrong option type." This reverts commit 2ae100045cf31029d4afa1d7b7f0164035ec3c01. Danny Baumann 2009-02-28 Avoid warnings about wrong option type. Not sure whether we really want these warnings in the long term, though... Danny Baumann 2009-02-28 Fix coding style. Merge: 751bec0 59423aa Danny Baumann 2009-02-28 Merge branch 'master' of git+ssh://maniac@git.compiz-fusion.org/git/compiz/core Dennis Kasprzyk 2009-02-27 Fixed wrong compare function (Fixes inifinite loop). Joel Bosveld 2009-02-27 Move CompOption::isAction to a static function and use in Value::action Joel Bosveld 2009-02-26 Warn if attempting to get wrong type from CompOption::Value Joel Bosveld 2009-02-26 Add conversion operators to CompOption::Value Danny Baumann 2009-02-27 Fix contains method and improve intersects method. Danny Baumann 2009-02-26 Fix excessive ping timer. Danny Baumann 2009-02-26 Store XWMHints structure and use it to fall back to legacy icon reading. Danny Baumann 2009-02-26 Coding style, optimizations. Danny Baumann 2009-02-26 Don't keep desktop hints set by last WM by default. Danny Baumann 2009-02-26 Prettify usage output. Danny Baumann 2009-02-26 Only use desktop from startup properties if it's actually set. Danny Baumann 2009-02-26 Remove key binding support from core. Danny Baumann 2009-02-26 Add missing metadata for gnomecompat plugin. Danny Baumann 2009-02-26 Add commands plugin which provides bindings for arbitrary commands. Danny Baumann 2009-02-26 Add missing methods. Danny Baumann 2009-02-26 Coding style improvements. Danny Baumann 2009-02-26 Pass reference instead of copying list. When copying the list, all autograb bindings are unregistered when the function is left. Danny Baumann 2009-02-26 Fix formatting of edge strings. Danny Baumann 2009-02-26 Add gnomecompat metadata to POTFILES.in Danny Baumann 2009-02-26 Adapt core for gnomecompat plugin addition. Danny Baumann 2009-02-26 Add Gnome compatibility plugin that receives key bindings only relevant for Gnome. Danny Baumann 2009-02-26 Make sure active fullscreen windows are always on top. Previously, this was not the case if e.g. a dock window with above state is present. Danny Baumann 2009-02-26 Improve strut handling. Danny Baumann 2009-02-26 Added support for _NET_WM_FULLSCREEN_MONITORS property. Danny Baumann 2009-02-25 Revert "Do not change input focus when EnterNotify event is generated from" This reverts commit e68eb0117b32fea441c662e621e998724281aa58. Rationale: When doing a drag-and-drop operation from one window to another, the drop target ends up without being focussed despite the mouse pointer being in it. This is unwanted and confusing behaviour. Danny Baumann 2009-02-06 Also set foreground color for switcher. Danny Baumann 2009-02-25 Re-sync place plugin to 0.8 branch. Danny Baumann 2009-02-25 Set libwnck client type to "pager" so "move to desktop x" works properly together with the constraining code in place plugin. Danny Baumann 2009-02-25 Coding style fixes. Danny Baumann 2009-02-25 Get plugin loading improvements from 0.8 branch and add --debug command line parameter that enables logging of CompLogLevelDebug messages on stdout. Danny Baumann 2009-02-25 Coding style improvements. Danny Baumann 2009-02-25 Add contains method that determines if a rect contains a given point. Danny Baumann 2009-02-25 Fix damage if no windows are left after relayouting. Danny Baumann 2009-02-25 Use references to pass around strings. Danny Baumann 2009-02-25 C++ port of regex plugin. Danny Baumann 2009-02-25 Fix &=, |=, | and & operators. Danny Baumann 2009-02-25 Fix crash and some memory leaks. Danny Baumann 2009-02-25 Add missing method declaration. Danny Baumann 2009-02-25 Fix ini file path creation. Danny Baumann 2009-02-25 ABI version 0 means "not loaded", so better use 1. Patrick Niklaus 2009-02-23 Add directory hint to screenshot metadata Danny Baumann 2009-02-22 Scale plugin API improvements: - Provide getters for state, grab, window list and custom (user provided) match - Provide getter for "window has slot" information - Make relayoutSlots () a method instead of an action and allow a match being passed to it. If a match is provided, it overrides scale's own match. Danny Baumann 2009-02-22 Improve const correctness. Danny Baumann 2009-02-22 Option API improvements: - Better reference usage - Improve const correctness Danny Baumann 2009-02-22 Match API improvements: - Provide != operator and emptiness check method - Provide empty match - Improve const correctness Merge: 2263479 27cc9c5 Dennis Kasprzyk 2009-02-13 Merge branch 'master' of git+ssh://git.compiz-fusion.org/git/compiz/core Dennis Kasprzyk 2009-02-13 Fixed readImageToTexture. Christopher Williams 2009-02-11 Fix compatibility with newer libmetacity-private versions. GtkStyle is colormap specific, so we can't use a new colormap each time we create a pixmap. Dennis Kasprzyk 2009-02-11 Little workaround for copy texture destruction after copytex plugin has been unloaded. Dennis Kasprzyk 2009-02-11 Fixed action initialisation without node. Danny Baumann 2009-02-02 Fix plugin names in metadata. Danny Baumann 2009-02-02 Rename metadata files of imgpng and imgsvg plugins correctly. Danny Baumann 2009-02-02 Added equality operator to CompPoint. Danny Baumann 2009-01-26 Use references for parameters of getAllowedActions function. Travis Watkins 2009-01-21 add xkbEvent getter Danny Baumann 2009-01-16 Optimization. Danny Baumann 2009-01-16 Fix plasma check (again). Dennis Kasprzyk 2009-01-16 Search for Plasma. Dennis Kasprzyk 2009-01-16 Added grabExist function. Dennis Kasprzyk 2009-01-15 Use infinite region for window type decorations of transformed windows. Dennis Kasprzyk 2009-01-15 Use infinite region for decorations of transformed windows. Dennis Kasprzyk 2009-01-15 Fixed iterator handling. Dennis Kasprzyk 2009-01-14 KDE 4.2 is not required to build compiz. Dennis Kasprzyk 2009-01-14 KDE 4.2 krunner dbus interface changes. Dennis Kasprzyk 2009-01-14 Fixed KWindowInfo::geometry usage. Dennis Kasprzyk 2009-01-14 Added support for changed KDE 4.2 decoration API. Dennis Kasprzyk 2009-01-14 KDE window decorator KDE 4.2 plasma support. Dennis Kasprzyk 2009-01-14 Wrap handleEvent. Dennis Kasprzyk 2009-01-12 Fixed pkg-config files for cross plugin linking. Dennis Kasprzyk 2009-01-06 Fixed pkg-config check. Dennis Kasprzyk 2008-12-22 Fixed plugin loader. Dennis Kasprzyk 2008-12-22 Added opengl dependency. Dennis Kasprzyk 2008-12-22 Compare actions before grab setting. Dennis Kasprzyk 2008-12-22 Handle unmap correctly. Dennis Kasprzyk 2008-12-22 Fixed problems with dynamic plugin loading. Dennis Kasprzyk 2008-12-22 Added opengl dependency. Dennis Kasprzyk 2008-12-22 Reset privates cache correctly. Dennis Kasprzyk 2008-12-22 Allow to set keycode/buttons/modifiers in CompAction. Dennis Kasprzyk 2008-12-22 Add/Remove screen actions in CompOption::set function. Dennis Kasprzyk 2008-12-17 Fixed plugin dependencies in metadata. Dennis Kasprzyk 2008-12-16 Install compiz-common.h Dennis Kasprzyk 2008-12-16 Fixed directory in pkg-config files. Dennis Kasprzyk 2008-12-16 Fixed dependencies in pkg-config. Dennis Kasprzyk 2008-12-16 Initialize variable. Dennis Kasprzyk 2008-12-16 Apply core changes. Dennis Kasprzyk 2008-12-16 New plugin loader system Dennis Kasprzyk 2008-12-16 No special handling of core metadata. Dennis Kasprzyk 2008-12-16 Added more flexibility to metadata initialisation. Dennis Kasprzyk 2008-12-15 Initial C++ port of the blur plugin. Dennis Kasprzyk 2008-12-15 Fixed private handling. Dennis Kasprzyk 2008-12-15 Delete array correctly. Dennis Kasprzyk 2008-12-15 Provide direct matrix element access. Dennis Kasprzyk 2008-12-15 Constructor to create a GLMatrix out of a float array. Dennis Kasprzyk 2008-12-15 Provide access to projection matrix. Dennis Kasprzyk 2008-12-15 Make Saturation weights public. Dennis Kasprzyk 2008-11-13 Provide last paint mask. Dennis Kasprzyk 2008-11-13 Privide current damage region. Dennis Kasprzyk 2008-11-13 Added shrink region functions. Dennis Kasprzyk 2008-11-04 Optimized wrapping. Dennis Kasprzyk 2008-11-04 C++ port of scale plugin (unfinished plugin plugin interface). Dennis Kasprzyk 2008-11-04 Provide XRectangle -> CompRect constructor. Dennis Kasprzyk 2008-10-29 Revert "Privode currentOutputDev." Merge mistake. This reverts commit bb9897ba04c4ac398c3218ab46d913338aeae94d. Merge: bb9897b a1bef18 Dennis Kasprzyk 2008-10-29 Merge branch 'compiz++' of git+ssh://git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-10-29 Privode currentOutputDev. Merge: b54d506 109cb2a Danny Baumann 2008-10-20 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Danny Baumann 2008-10-20 Fix typo. Danny Baumann 2008-10-20 Remove debug output. Danny Baumann 2008-10-20 C++ port of place plugin. Danny Baumann 2008-10-20 Provide initial viewport to plugins and improve const correctness. Danny Baumann 2008-10-20 Improve const correctness. Dennis Kasprzyk 2008-10-16 Rebuild plugin private index cache on plugin changes. Dennis Kasprzyk 2008-10-16 Fixed linking. Danny Baumann 2008-10-16 Made dependency on opengl plugin optional. Danny Baumann 2008-10-16 Simplify signatures of place and validateResizeRequest functions. Danny Baumann 2008-10-16 Reflect changes in screen class. Merge: 484e915 e5080c3 Danny Baumann 2008-10-16 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Danny Baumann 2008-10-16 C++ port of SVG plugin, untested so far. TODO: Make dependency on opengl plugin optional, so that images can be loaded without opengl plugin loaded. Danny Baumann 2008-10-16 Added rectangle equality operators. Danny Baumann 2008-10-16 Fix typo. Merge: 1d6177e 5e0264e Dennis Kasprzyk 2008-10-14 Merge branch 'compiz++' of git+ssh://git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-10-14 Made GLTexture derive from CompRect. Danny Baumann 2008-10-14 Remove inputHint function and expose helper functions that show if the window is mapped, viewable or focussable. Dennis Kasprzyk 2008-10-14 Provide convinence functions to access window geometry. Dennis Kasprzyk 2008-10-14 Made CompScreen derive from CompSize. Dennis Kasprzyk 2008-10-14 Made CompIcon derive from CompSize. Danny Baumann 2008-10-14 Revert "Wrap into damageWindowRect." This reverts commit b0cd1d11423061452d5d103afa9a4de6119c31a3. Dennis Kasprzyk 2008-10-14 Fixed match handling. Danny Baumann 2008-10-14 Wrap into damageWindowRect. Danny Baumann 2008-10-14 Fixed applying int options. Danny Baumann 2008-10-14 Define USE_METACITY and USE_GCONF in the source. Danny Baumann 2008-10-14 Fix plugin loading. Danny Baumann 2008-10-14 C++ port of PNG plugin. Danny Baumann 2008-10-14 Make updateDefaultIcon function public. Danny Baumann 2008-10-14 Better use of classes in icon and image handling. Dennis Kasprzyk 2008-10-14 Set raster position correctly. Dennis Kasprzyk 2008-10-14 Switch to a damage based texture rebind. Dennis Kasprzyk 2008-10-14 Optimized wrapped function usage. Dennis Kasprzyk 2008-10-14 C++ port of switcher plugin. Dennis Kasprzyk 2008-10-14 Don't allow empty icons. Dennis Kasprzyk 2008-10-14 Save texture size correctly. Dennis Kasprzyk 2008-10-14 Return new created icon. Dennis Kasprzyk 2008-10-14 Unmap frame together with window. Dennis Kasprzyk 2008-10-14 Link to currently installed libdecoration. Dennis Kasprzyk 2008-10-14 Allow changes of the default texture filter; Dennis Kasprzyk 2008-10-14 Drop never implemented direct base function call. Dennis Kasprzyk 2008-10-13 Provide window icons as texture. Dennis Kasprzyk 2008-10-13 Provide access to default icon. Dennis Kasprzyk 2008-10-13 CompIcon API cleanup. Dennis Kasprzyk 2008-10-13 Fixed header. Dennis Kasprzyk 2008-10-13 Getter for CompScreen activeNum. Dennis Kasprzyk 2008-10-13 Provide invisible cursor. Dennis Kasprzyk 2008-10-13 Added getter function for current output device. Dennis Kasprzyk 2008-10-13 Added inputHint getter function. Dennis Kasprzyk 2008-10-13 Added check for inotify header. Danny Baumann 2008-10-13 Conversion is successful if key or button bindings are equal to "Disabled". Danny Baumann 2008-10-13 Check conversion result. Danny Baumann 2008-10-13 Make CompAction *FromString functions return the information whether the conversion was successful or not. Danny Baumann 2008-10-13 Fix excessive writes. Danny Baumann 2008-10-13 Fix event pointer. Danny Baumann 2008-10-13 Fix option reading and don't try to read config files for plugins without options. Danny Baumann 2008-10-13 C++ port of inotify plugin (untested so far). Danny Baumann 2008-10-13 Added function for retrieving the file watches. Danny Baumann 2008-10-13 Misc. fixes. Dennis Kasprzyk 2008-10-13 Escape special characters in installation prefix for regular expression. Dennis Kasprzyk 2008-10-13 Enable wrapped screen interface functions by default. Danny Baumann 2008-10-13 Act on file changes. Danny Baumann 2008-10-13 C++ port of ini plugin. Danny Baumann 2008-10-10 Avoid exception if match is empty. Danny Baumann 2008-10-10 Minor cleanup. Dennis Kasprzyk 2008-10-09 Added missing license headers. Dennis Kasprzyk 2008-10-09 Removed last bits of old build system. Dennis Kasprzyk 2008-10-09 Removed old file. Dennis Kasprzyk 2008-10-09 Cleanup private headers. Dennis Kasprzyk 2008-10-09 Cleanup .gitignore Dennis Kasprzyk 2008-10-09 Cleanups. Dennis Kasprzyk 2008-10-09 Drop KDE3 configuration plugin. Dennis Kasprzyk 2008-10-09 Drop KDE3 window decorator. Dennis Kasprzyk 2008-10-09 Drop autoconf/make build system. Dennis Kasprzyk 2008-10-08 Enable functions only if needed. Dennis Kasprzyk 2008-10-08 C++ port of water plugin. Dennis Kasprzyk 2008-10-08 Fixed fragment interface. Dennis Kasprzyk 2008-10-07 Link compiz against xdamage and xcomposite to prevent segmentation faults on shutdown. Dennis Kasprzyk 2008-10-07 Enable functions only if needed. Dennis Kasprzyk 2008-10-07 Enable paint function only if needed. Dennis Kasprzyk 2008-10-07 Enable functions only if needed. Dennis Kasprzyk 2008-10-07 Allow disabled wraping. Dennis Kasprzyk 2008-10-07 Sleep instead of polling for short timer periods. Dennis Kasprzyk 2008-10-07 C++ port of zoom plugin. Dennis Kasprzyk 2008-10-07 Allso changes to screen filters. Dennis Kasprzyk 2008-10-07 Export redraw time and optimize redraw timer handling. Dennis Kasprzyk 2008-10-07 Added copytex to build system. Dennis Kasprzyk 2008-10-06 Added CMake package generation and fixed compiling Dennis Kasprzyk 2008-10-06 Support config.h in build directory. Dennis Kasprzyk 2008-10-06 Provide pkg config files for composite and opengl plugins. Dennis Kasprzyk 2008-10-06 Generate compiz.pc Dennis Kasprzyk 2008-10-06 Provide summary configure output and create compiz-common.h Dennis Kasprzyk 2008-10-06 Move gtk/gnome specific parts to gtk/CMakeLists.txt Dennis Kasprzyk 2008-10-06 Add uninstall cmake target. Dennis Kasprzyk 2008-10-06 Initial version of CMake build system. Dennis Kasprzyk 2008-10-06 Added missing header. Dennis Kasprzyk 2008-10-06 Added main.cpp to POTFILES.in Danny Baumann 2008-10-05 Handle desktops a bit better. Danny Baumann 2008-10-05 Also treat utility, menu and toolbar windows as group transients. Danny Baumann 2008-10-05 Make sure window state property is correct when mapping windows. Danny Baumann 2008-10-05 Use changeWindowState function. Danny Baumann 2008-10-05 Change state property only on managed windows. Danny Baumann 2008-10-05 Ignore _NET_WM_STATE_HIDDEN property changes as suggested by EWMH. Danny Baumann 2008-10-05 Ensure windows fit in the work area when placing them by calling the window sizing validation function. Danny Baumann 2008-10-04 Make viewportForGeometry not take the current viewport into account. As the geometry passed to viewportForGeometry is not necessarily a window, it doesn't make much sense to assume so. Instead, move the return-current-viewport-if-window-is-on-it logic to the defaultViewportForWindow function. Danny Baumann 2008-10-04 Make sure geometry rectangle is kept inside the screen area. Danny Baumann 2008-10-04 Fix a number of potential memleaks in XGetWindowProperty return value handling. If a property with 0 items was set, the return value was leaked. Danny Baumann 2008-10-04 Use timer to start decorator. When starting the decorator from initScreen, user changes to a default decorator command are not reflected correctly. When starting it _only_ from the option change notification, no decorator is started if the default is non-empty and the user never changed it. Compromise is using a timer and hoping that the configuration plugin has initialized all options at next mainloop iteration time (which is the case for all known configuration plugins). Danny Baumann 2008-10-04 Build fix. Danny Baumann 2008-10-04 Use pendingMaps variable to set w->managed on MapNotify. Danny Baumann 2008-10-04 Only decrement pendingMaps variable when there are actually pending maps. Danny Baumann 2008-10-04 Cleanup: pass button and key events directly (instead of generic XEvent) into action handlers. Danny Baumann 2008-10-04 Call terminate function also for bindings without modifiers. Danny Baumann 2008-10-03 Typo & build fixes. Danny Baumann 2008-10-03 When the startup ID of a window changes, move it to current viewport instead of changing to the viewport of the window. Danny Baumann 2008-10-03 Make sure RGBA matching is always present for shadows. If the user added RGBA expressions to the match, use those. If the user did not add any RGBA expressions, turn off shadows for RGBA windows. Danny Baumann 2008-10-03 Add support for matching a window's alpha channel availability. Danny Baumann 2008-10-03 There is no real reason to arbitrarily remove shadows on below state windows. Danny Baumann 2008-10-03 Fix memory leak. Danny Baumann 2008-10-03 Improve focus stealing prevention. - Allow window focus if currently no window or only the desktop window is focussed. - Rename mode "High" to "Normal" and introduce "High" mode that denies focus attempts of windows not belonging to the active application. - Allow focus attempts of windows of the same application in Low, Normal, High modes. Danny Baumann 2008-10-03 Allow mouse initiated resize not only in the 4 corners, but in all directions. Danny Baumann 2008-10-03 Limit number of damage rects in one screen repaint. If the number of rects grows too much, we're using more resources managing the damage than doing the actual drawing. Danny Baumann 2008-10-03 Replace return to exit loop by break. Danny Baumann 2008-10-03 Pass client type of _NET_MOVERESIZE_WINDOW message sender to validate function. Danny Baumann 2008-10-03 Add definitions for EWMH source indication values. Danny Baumann 2008-10-03 On selected window changes, always clear out label first to make sure a text-changed signal is emitted to atk. Danny Baumann 2008-10-03 Added support for _NET_WM_MOVERESIZE_CANCEL. Danny Baumann 2008-10-03 Try to find the window under the pointer through the server if d->below is not valid. This may happen e.g. if focusDefaultWindow() is called right after moveScreenViewport(), as the EnterNotify event hasn't arrived at that time yet. Danny Baumann 2008-10-03 Also update d->below variable when we have a grab, so that it has the correct value after grab end. Needed e.g. for focussing the correct default window after viewport changes with click_to_focus disabled. Dennis Kasprzyk 2008-10-02 Initialize texture matrices correctly. Dennis Kasprzyk 2008-10-02 Fixed decorations of initially maximized windows. Dennis Kasprzyk 2008-10-02 Switch to 2d only if bind failed. Dennis Kasprzyk 2008-10-02 Use server geometry for window reparent. Dennis Kasprzyk 2008-10-02 Switch to 2D decoration if pixmap decoration fails. Dennis Kasprzyk 2008-10-02 Removed debug code. Dennis Kasprzyk 2008-10-02 Fixed damage handling. Dennis Kasprzyk 2008-10-02 Added support for multiple textures in background painting. Dennis Kasprzyk 2008-10-02 Copy pixmap to texture plugin. Dennis Kasprzyk 2008-10-02 Support for painting of multiple textures and hook for external bind pixmap to texture functions. Dennis Kasprzyk 2008-10-02 Provide helper typedefs. Dennis Kasprzyk 2008-10-01 Provide texture size informations. Dennis Kasprzyk 2008-09-30 Initialize variable. Dennis Kasprzyk 2008-09-30 Initialize variables correctly. Dennis Kasprzyk 2008-09-30 Added initial support for bind pixmap/load image to multiple textures. Dennis Kasprzyk 2008-09-30 Simplified privates API. Merge: b059cc8 58617a5 Dennis Kasprzyk 2008-09-25 Merge branch 'compiz++' of git+ssh://git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-09-25 Silence compiler. Dennis Kasprzyk 2008-09-25 Fixed frame shape. Dennis Kasprzyk 2008-09-25 Apply core changes to plugins. Dennis Kasprzyk 2008-09-25 Destroy region if needed. Dennis Kasprzyk 2008-09-25 Use CompRegion in core. Dennis Kasprzyk 2008-09-25 More region operators. Dennis Kasprzyk 2008-09-25 Adden CompRegion class. Erkin Bahceci 2008-09-24 Don't damage window region on minimize/shade ending. Slightly improves performance by not damaging the full window region at the end of minimize and shade animations. Dennis Kasprzyk 2008-09-24 Relayout during maximize. Dennis Kasprzyk 2008-09-24 Added support for 2D decorations. Dennis Kasprzyk 2008-09-24 Apply libdecoration changes. Dennis Kasprzyk 2008-09-24 Apply libdecoration changes. Dennis Kasprzyk 2008-09-24 Move frame region. Dennis Kasprzyk 2008-09-24 Add only root child windows. Dennis Kasprzyk 2008-09-24 Added support for 2D decorations. Dennis Kasprzyk 2008-09-24 Access to window texture and matrix. Dennis Kasprzyk 2008-09-24 Added support for 2D decorations. Dennis Kasprzyk 2008-09-19 Don't remove screen actions on shutdown. Dennis Kasprzyk 2008-09-19 Use correct event type for selection clear. Dennis Kasprzyk 2008-09-19 Add actions to screen after initialization. Erkin Bahceci 2008-09-18 Fix reading of floats in metadata for some locales. Dennis Kasprzyk 2008-09-18 Fixed stacking of override redirect windows. Dennis Kasprzyk 2008-09-17 Move core headers into core subdirectory. Dennis Kasprzyk 2008-09-17 Optimize rect,point and size classes and move headers to core/* Dennis Kasprzyk 2008-09-17 Cleanup CompWindow public API and move header to core/window.h Dennis Kasprzyk 2008-09-17 Cleanup CompScreen public API and move header to core/screen.h Dennis Kasprzyk 2008-09-17 Handle frame as stacking sibling correctly. Dennis Kasprzyk 2008-09-17 Unload plugins correctly on shutdown. Dennis Kasprzyk 2008-09-16 Initialize variable. Dennis Kasprzyk 2008-09-16 Destroy frame region later, because it might still be used. Dennis Kasprzyk 2008-09-16 Fix log system. Dennis Kasprzyk 2008-09-16 Make frame not "override redirect". Dennis Kasprzyk 2008-09-16 Preserve focus during reparent. Dennis Kasprzyk 2008-09-16 Decorate only managed windows. Dennis Kasprzyk 2008-09-16 Fixed lasy positioning. Dennis Kasprzyk 2008-09-16 Fixed variable initialisation. Dennis Kasprzyk 2008-09-16 Initialize window in correct order. Dennis Kasprzyk 2008-09-16 Apply core changes to metadata convertors. Dennis Kasprzyk 2008-09-16 Fixed composite plugin metadata. Dennis Kasprzyk 2008-09-16 Merged display and screen in resize plugin. Dennis Kasprzyk 2008-09-16 Merged core, display and screen in decoration plugin. Dennis Kasprzyk 2008-09-16 Merged display and screen in move plugin. Dennis Kasprzyk 2008-09-16 Merge display and screen in opengl plugin. Dennis Kasprzyk 2008-09-16 Merge display and screen in composite plugin. Dennis Kasprzyk 2008-09-16 Fixed private fetching. Dennis Kasprzyk 2008-09-16 Provide a plugin option helper macro. Dennis Kasprzyk 2008-09-16 Fixed wrap system indices. Dennis Kasprzyk 2008-09-16 Fixed private handling. Dennis Kasprzyk 2008-09-16 Drop never finished object handling. Dennis Kasprzyk 2008-09-15 Merge CompCore and CompDisplay into CompScreen class. Danny Baumann 2008-09-15 Use attrib getters from within CompWindow class. Danny Baumann 2008-09-15 Remove getter for w->attrib and use member getters instead. Merge: 6a7aa0c b544f2d Danny Baumann 2008-09-15 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Merge: c18feef 951153a Erkin Bahceci 2008-09-14 Merge branch 'compiz++' of git+ssh://cornelius@git.compiz-fusion.org/private/compiz into compiz++ Erkin Bahceci 2008-09-14 Fix list loop. Merge: 87e2986 951153a Danny Baumann 2008-09-11 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-09-11 Handle non shaping decorators correctly. Dennis Kasprzyk 2008-09-11 Update frame region together with window region change. Dennis Kasprzyk 2008-09-10 Update frame region during frame resize. Dennis Kasprzyk 2008-09-10 Improved handling of the "process killer" process. Dennis Kasprzyk 2008-09-10 C++ port of the resize plugin. Erkin Bahceci 2008-09-06 Use CompPlugin::List. Erkin Bahceci 2008-09-07 Use plugin and window maps for more efficient search. Dennis Kasprzyk 2008-09-02 Use a timer to create decoration. Dennis Kasprzyk 2008-09-02 Move window in a timer to prevent racing conditions after a window reparent. Dennis Kasprzyk 2008-09-02 Update only valid windows on decoration manager change. Dennis Kasprzyk 2008-09-02 Reparent window instead of simple input frame window. Dennis Kasprzyk 2008-09-02 Synchronize decoration creation. Dennis Kasprzyk 2008-09-01 Provide a system to set the frame window region. Dennis Kasprzyk 2008-09-01 Update .gitignore Dennis Kasprzyk 2008-09-01 - Added a type field to the decoration property. - Use a separate frame window for decorations. Merge: 0f15e3b 1f6d68d Danny Baumann 2008-08-29 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-08-28 Send show and hide notifies at the right position. Dennis Kasprzyk 2008-08-28 More flexible and ABI stable wrap system. Dennis Kasprzyk 2008-08-28 Fixed group transient calculation. Dennis Kasprzyk 2008-08-28 Added automatic unwraping. Dennis Kasprzyk 2008-08-28 Add object to parent, after it has been initialized in other plugins. Dennis Kasprzyk 2008-08-28 C++ port of the decoration plugin. Dennis Kasprzyk 2008-08-28 Send core object remove notification only if removeFromParent gets called. Dennis Kasprzyk 2008-08-28 Provide XDamage event base. Dennis Kasprzyk 2008-08-28 Provide mwm informations. Dennis Kasprzyk 2008-08-28 Provide XShape and XRandr event bases. Dennis Kasprzyk 2008-08-28 Added missing macros. Dennis Kasprzyk 2008-08-28 Privide access to texture mipmap parameter. Dennis Kasprzyk 2008-08-27 Privide access to window vertices in a Geometry class. Merge: 812354d 86ebffd Danny Baumann 2008-08-27 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-08-27 Update paint attriubutes if window alive status changed. Dennis Kasprzyk 2008-08-27 Release texture on unmap. Dennis Kasprzyk 2008-08-27 Fixed window damage on unmap. Dennis Kasprzyk 2008-08-27 Added plugin initialisation helper macros. Merge: 7b2be44 ac82488 Danny Baumann 2008-08-27 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-08-27 Moved composite handling and opengl painting into separate plugins. Dennis Kasprzyk 2008-08-25 Typo. Dennis Kasprzyk 2008-08-25 Use PrivateHandler in move. Dennis Kasprzyk 2008-08-25 Added preprocessor/template based helper class to handle plugin privated in the background. Dennis Kasprzyk 2008-08-25 Added a "object" prefix to type/typename/name object functions. Dennis Kasprzyk 2008-08-25 Ignore more files. Merge: 899020f d9affe8 Dennis Kasprzyk 2008-08-25 Merge branch 'compiz++' of git+ssh://git.compiz-fusion.org/private/compiz into compiz++ Merge: 06aa2b6 01de7f7 Dennis Kasprzyk 2008-08-25 Merge branch 'compiz++' of git+ssh://git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-08-25 Shut up compiler warnings. Dennis Kasprzyk 2008-08-24 Save ABI in global map. Dennis Kasprzyk 2008-08-24 Added a global key/value storage to CompCore. Danny Baumann 2008-08-21 Shut up compiler. Dennis Kasprzyk 2008-08-21 Removed debug output. Dennis Kasprzyk 2008-08-21 Fix mem leaks. Dennis Kasprzyk 2008-08-21 Fixed segfaults. Dennis Kasprzyk 2008-08-21 Apply core changes to move plugin. Dennis Kasprzyk 2008-08-21 Shut up compiler warnings. Dennis Kasprzyk 2008-08-21 Cleanups. Dennis Kasprzyk 2008-08-21 Cleanup compiz[-core].h Dennis Kasprzyk 2008-08-20 Move Plugin related function into CompPlugin header. Dennis Kasprzyk 2008-08-20 Moved session related functions/structs into own header and namespace. Dennis Kasprzyk 2008-08-20 Store Windows in a STL list. Dennis Kasprzyk 2008-08-20 Store Screens in a STL list. Dennis Kasprzyk 2008-08-20 Store displays as STL list. Dennis Kasprzyk 2008-08-20 Store CompGroups in a list. Dennis Kasprzyk 2008-08-20 Renamed ScreenPaintAttrib to CompScreenPaintAttrib. Dennis Kasprzyk 2008-08-20 Renamed WindowPaintAttrib to CompWindowPaintAttrib. Dennis Kasprzyk 2008-08-20 Moved paint attributes to the right header files. Dennis Kasprzyk 2008-08-20 C++ port of CompMetadata. Merge: 94de9e6 cf58366 Dennis Kasprzyk 2008-08-20 Merge branch 'compiz++' of git+ssh://git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-08-20 Port of CompOption and CompAction to C++. Danny Baumann 2008-08-19 Fix return value. Danny Baumann 2008-08-19 Added missing file. Danny Baumann 2008-08-19 C++ implementation of matrix and vector. Merge: 3623907 79d78d3 Danny Baumann 2008-08-18 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-08-18 Fragment interface C++ port (not tested). Dennis Kasprzyk 2008-08-14 Implementation of CompMatch as C++ class. Dennis Kasprzyk 2008-08-13 Moved definitions from compiz-core.h to the right headers. Dennis Kasprzyk 2008-08-13 Improved texture reset and shared pointer using. Dennis Kasprzyk 2008-08-12 CompIcon class and CompTexture cleanup. Dennis Kasprzyk 2008-08-12 Removed unused software cursor support. Dennis Kasprzyk 2008-08-12 Implemented CompTexture as real class. Dennis Kasprzyk 2008-08-11 Use boost function & bind to support static function and class member function callbacks. Dennis Kasprzyk 2008-08-11 Add Boost dependency. Dennis Kasprzyk 2008-08-11 Fixed screen paint timer behavior. Dennis Kasprzyk 2008-08-11 Implement Timeouts as CompCore::Timer class. Dennis Kasprzyk 2008-08-11 Rename CompMatrix to CompTextureMatrix. Danny Baumann 2008-08-08 Re-sync to master. Danny Baumann 2008-08-08 Re-sync to master. Dennis Kasprzyk 2008-08-08 Added new object private handling system. Dennis Kasprzyk 2008-08-08 Make CompObject smarter. Dennis Kasprzyk 2008-08-07 Fix grab handling. Dennis Kasprzyk 2008-08-07 Fix base class handling. Dennis Kasprzyk 2008-08-07 Fixed output handling. Dennis Kasprzyk 2008-08-07 Handle passive grabs as STL lists. Dennis Kasprzyk 2008-08-06 Implement screen grabs as STL list. Dennis Kasprzyk 2008-08-06 Use STL list to handle expose events. Dennis Kasprzyk 2008-08-06 Xinerama screeninfo is now a STL vector. Dennis Kasprzyk 2008-08-06 More CompPoint usage. Dennis Kasprzyk 2008-08-06 Use CompPoint/CompSize in CompScreen. Dennis Kasprzyk 2008-08-06 Use CompWindow::Geometry. Dennis Kasprzyk 2008-08-06 Added new CompSize, CompPoint and CompWindow::Geometry classes. Dennis Kasprzyk 2008-08-06 CompRect class. Dennis Kasprzyk 2008-08-06 .gitignore Dennis Kasprzyk 2008-08-06 Implement CompOutput as class. Dennis Kasprzyk 2008-08-06 Missing file. Dennis Kasprzyk 2008-08-06 Conversion ob main classes to C++. Dennis Kasprzyk 2008-07-25 Switch to c++ and compile with a basic set of plugins. Merge: 7658928 1938bdf Danny Baumann 2008-07-18 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-07-18 Initialize option value correctly. C-F Language team 2008-07-09 new translations and updates Danny Baumann 2008-07-09 Fix typo. Merge: 63fd486 37e75d2 Danny Baumann 2008-07-03 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Erkin Bahceci 2008-06-21 Allow terminating scale mode while entering. Danny Baumann 2008-07-03 Only move focus to window on click if it wasn't focussed before. Danny Baumann 2008-07-03 Improve ABI version check printout. Danny Baumann 2008-06-25 Revert "Don't focus default window when rotating due to window activation." This reverts commit 680bac110dd60d17575078fb6ae6b76cc588cfd1. Merge: 4035546 9b3f805 Danny Baumann 2008-06-25 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-06-25 Add missing glib includes. Dennis Kasprzyk 2008-06-24 Use default icon, if no icon is stored in the window properties. Merge: 680bac1 4271289 Danny Baumann 2008-06-19 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-06-19 Don't focus default window when rotating due to window activation. Dennis Kasprzyk 2008-06-18 Added synhronized timers. compAddTimeout now has a minimal and a maximal timeout time. This allows compiz to execute multiple timers at once and prevents unnecessary wakeups. Dennis Kasprzyk 2008-06-18 Use a single shot timer to prevent recursive repaint calls, if a decoration sets its mask during repaint. Dennis Kasprzyk 2008-06-17 Update switcher text background correctly. Danny Baumann 2008-06-15 Fix some minor memory leaks. Michael Vogt 2008-06-10 Re-sync Metacity button parsing code with Metacity to support new "spacer" feature. Danny Baumann 2008-06-09 Use icon geometry stored in CompWindow struct. Danny Baumann 2008-06-09 Bump ABIVERSION. Danny Baumann 2008-06-09 Store icon geometry in CompWindow struct. Danny Baumann 2008-06-09 Evaluate window match only for non-panel selection mode. Danny Baumann 2008-06-09 Revert "Update default window match to account for panel selection mode." This reverts commit 61ae58d463aa9478b282bebc62d3586a25319322. Danny Baumann 2008-06-08 Warning fix. Danny Baumann 2008-06-08 Plug some minor memory leaks. Danny Baumann 2008-06-07 Fix another mem leak. Danny Baumann 2008-06-07 Minor cleanup. Merge: d694817 0fb90da Danny Baumann 2008-06-07 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-06-07 Fix a number of memory leaks. Danny Baumann 2008-06-06 Minor cleanup. Merge: 45caca2 9a6a515 Danny Baumann 2008-06-04 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-06-04 Only move placed windows on decoration size changes. The geometry of not yet placed windows gets adjusted in the main MapRequest handler in event.c, so if we additionally move the window in the decoration plugin, the gravity is adjusted twice. Dennis Kasprzyk 2008-06-03 Look for plasma header file in kde 4 check. Dennis Kasprzyk 2008-06-03 Revert "Look for plasma header file in kde 4 check." This reverts commit 530268326a5fd42c72f0d92a1e153d55fbb7bd96. Dennis Kasprzyk 2008-06-03 Look for plasma header file in kde 4 check. Dennis Kasprzyk 2008-05-29 Post release version increment. Dennis Kasprzyk 2008-05-29 Add NEWS entry and bump version for 0.7.6 release. Dennis Kasprzyk 2008-05-29 Applied libdecoration changes to gtk window decorator. Dennis Kasprzyk 2008-05-29 Applied libdecoration changes to kde4 window decorator. Dennis Kasprzyk 2008-05-29 Applied libdecoration changes to kde3 window decorator. Dennis Kasprzyk 2008-05-29 Merged decor_blend_(top|bottom|left|right)_border_picture function into one common function. The new ignore_src_alpha parameter tells libdecoration to ignore the alpha channel of the src picture. C-F Language team 2008-05-24 translation updates Danny Baumann 2008-05-24 Optimizations. Danny Baumann 2008-05-24 Remove useless checks. As w->alive is unconditionally set to true when adding windows, it makes no sense to check if it's true. Danny Baumann 2008-05-24 Coding style fixes. Owen W. Taylor 2008-05-23 Fix initial map handling of opacity/brightness/saturation Make the handling of properties for opacity, brightness, and saturation consistent between initial map and subsequent updates: honor the properties even when the window has the DOCK type or is override redirrect. http://bugs.opencompositing.org/show_bug.cgi?id=955 Dennis Kasprzyk 2008-05-21 Use CompTransform for rectangle/outline painting. Dennis Kasprzyk 2008-05-20 The decorator won't get a button release event after resize and move, so we have to fake one to make qt act correctly. Dennis Kasprzyk 2008-05-18 Removed debug output code. Dennis Kasprzyk 2008-05-18 Disable Qt 4.4 "window less child widgets" feature to make button drawing work correctly again. Danny Baumann 2008-05-14 Cleanup. Dennis Kasprzyk 2008-05-14 Fixed cube skydome rotation. Danny Baumann 2008-05-14 Try to follow multi output option as close as possible when placing centered on screen. Danny Baumann 2008-05-14 Added option to place on output the focussed window is on. Danny Baumann 2008-05-14 Added optional placement to fullscreen output, which makes sense especially for smart window placement. Reference: http://bugs.opencompositing.org/show_bug.cgi?id=643 Daniel Lea 2008-05-13 Fix skydome animation tilt behaviour. Danny Baumann 2008-05-13 Don't place windows that have dock or desktop type hint set. Danny Baumann 2008-05-13 Don't touch ConfigureRequest events of dock and desktop windows. Danny Baumann 2008-05-13 Minor coding style cleanup. Lubos Lunak 2008-05-13 Save program name to session manager. Don't save --replace command line argument. Merge: 40f876c 8b7d261 Danny Baumann 2008-05-10 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-05-10 Treat edge button bindings like edge bindings. Danny Baumann 2008-05-10 Make edge button bindings behave more meaningfully: If switching was initiated by an edge button, terminate switching on edge leave and proceed on each button press. Merge: 3b56af2 5ca3816 Danny Baumann 2008-05-09 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-05-09 Make corner resize behaviour consistent to Metacity. Danny Baumann 2008-05-09 Allow keyboard and window menu initiated resize being ended by a mouse button. Danny Baumann 2008-05-09 Initialize starting position correctly. Danny Baumann 2008-05-08 Don't set demands attention state on the active window. Dennis Kasprzyk 2008-05-06 Applied plasma API changes. Dennis Kasprzyk 2008-05-06 Paint cube caps if a plugin wishes it by setting cs->paintAllViewports. Dennis Kasprzyk 2008-05-06 Reset zoomout instead of progress for inside cube. C-F Language team 2008-05-02 translation updates Jigish Gohil 2008-05-02 remove plane from POTFILES.in Danny Baumann 2008-05-02 Only initiate window menu if we don't have an active grab. Otherwise, doing so might deadlock. Danny Baumann 2008-05-02 Added missing action check. Danny Baumann 2008-05-02 Allow minimizeWindow to minimize windows that don't have the minimize action set as this is desired e.g. for minimizing transients. Instead, check for the minimize action when minimization is triggered externally. Merge: cf34309 8a5eef9 Danny Baumann 2008-04-30 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-04-29 Added option for overriding USPosition and/or PPosition on certain windows. Danny Baumann 2008-04-29 Always accept PPosition hint. Dennis Kasprzyk 2008-04-26 Fallback to old texture target selection, to fix current broken tfp implementations. This workaround will be removed after the 0.8.0 release. Dennis Kasprzyk 2008-04-24 Bump core ABI. Dennis Kasprzyk 2008-04-24 Use full screen output if overlapping output devices have been detected. This prevents that parts of the screen get painted twice (xrandr clone modes). Dennis Kasprzyk 2008-04-24 Use PAINT_SCREEN_NO_BACKGROUND_MASK instead of wraping paintBackground. Dennis Kasprzyk 2008-04-24 Removed wrapable background painting. The core part of the background painting code stays as a fallback, if no desktop window is present and no other plugin provides a different background solution. Plugins can use the PAINT_SCREEN_NO_BACKGROUND_MASK screen mask to disable this fallback. Dennis Kasprzyk 2008-04-24 Removed background painting. The compiz fusion wallpaper plugin provides a better and more flexible for viewport independent background image solution. Dennis Kasprzyk 2008-04-24 Follow the "texture from pixmap" specification more strictly to avoid unnecessary calls to glxQueryDrawable during pixmap binding. Merge: b138660 56ddfec Danny Baumann 2008-04-24 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-04-24 Make adjustConfigureRequestForGravity return only the bits that were actually changed. Dennis Kasprzyk 2008-04-23 Do not try to generate mipmaps for TEXTURE_RECTANGLE targets, because the ext_frambuffer_object extension only allows this for TEXTURE_2D targets. Roland Bär 2008-03-20 Simplified, realloc on NULL is same as malloc Danny Baumann 2008-04-23 Make viewport placement options 1-based. Thus, the upper left viewport is (1|1) instead of (0|0), which is more intuitive. Danny Baumann 2008-04-23 Added sane minimum / maximum values for viewport placement. Danny Baumann 2008-04-23 Don't adjust configure requests of unmapped windows for gravity. Instead, apply gravity when mapping the window. Danny Baumann 2008-04-23 Only set CWX / CWY if the position was actually changed. Merge: e591ee8 f21c3b6 Danny Baumann 2008-04-22 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2008-04-22 Use fragment shader if a slightly saturated window texture is painted and lighting is enabled, because both can't be done with texture environments at the same time. Merge: 9bf73a1 9f12004 Danny Baumann 2008-04-21 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-04-21 Don't prevent focus for windows on other viewports if they are excluded from focus stealing prevention. Danny Baumann 2008-04-18 Don't allow to minimize/showdesktop unmanaged windows. Danny Baumann 2008-04-18 Remove plane plugin. The plane plugin has been superceded by the wall plugin in Compiz Fusion, which provides the same basic functionality as the plane plugin, but extends it by a lot more features. Current plane users are encouraged to use wall instead. Danny Baumann 2008-04-18 Disable resize handles for the directions the window is maximized to (leave only left and right enabled for vertically maximized windows, top and bottom for horizontally maximized windows). Dennis Kasprzyk 2008-04-16 Paint a viewport in cubePaintViewport instead of calling paintTransformedOutput and postPaintViewport. This allows plugins to do things before and after viewport painting. Danny Baumann 2008-04-15 Also use the multi output mode selection option when placing centered. Danny Baumann 2008-04-15 Only accept USPosition on non-normal windows during validation if workarounds are disabled. Decrease indention depth. Danny Baumann 2008-04-15 Only update accessibility helper label if switched window has actually changed. Show accessibility helper label by default. Danny Baumann 2008-04-15 Keep switcher window property at an invalid value as long as the switcher is not active. Danny Baumann 2008-04-15 Properly destroy popup windows on unload. Danny Baumann 2008-04-15 Cleanup. Danny Baumann 2008-04-15 Reduce code duplication. Danny Baumann 2008-04-15 Update default window match to account for panel selection mode. Danny Baumann 2008-04-15 Added panel selection mode to switcher plugin. Danny Baumann 2008-04-15 Minor cleanup. Danny Baumann 2008-04-15 Move style window offscreen to make sure it never is visible on screen. Guillaume Seguin 2008-04-14 Make gtk-window-decorator switcher window accessibility friendly Danny Baumann 2008-04-14 Fix whitespace. Danny Baumann 2008-04-14 Clamp new position if a viewport match was given. If the new position was outside the visible screen area before, the window would be placed on a viewport different to the one specified otherwise. Danny Baumann 2008-04-14 Make the placeGetPlacementOutput function return a CompOutput pointer. Danny Baumann 2008-04-14 Fix warning. Danny Baumann 2008-04-14 Place dialogs centered on current output device rather than centered on screen. Danny Baumann 2008-04-14 Added option for multi output behaviour of place and added a "Place on output which has the pointer" mode. Danny Baumann 2008-04-14 Improve readability of placement relevance helper macro. Danny Baumann 2008-04-14 Fix typo. Danny Baumann 2008-04-14 Initialize count variable correctly. Danny Baumann 2008-04-14 Add helper macro for looping over all placement relevant windows. Danny Baumann 2008-04-14 Pass work area into cascade placement functions. Danny Baumann 2008-04-14 Minor optimization. Danny Baumann 2008-04-14 Replace placeWin function by a better structured placeDoWindowPlacement function. Placement strategy ("What should placement do to this window?") and output determination as well as work area constraining have been factored out to separete functions. Danny Baumann 2008-04-14 Drop glib dependency of place plugin. Danny Baumann 2008-04-14 Factor out cascade placement into separate function. Danny Baumann 2008-04-14 Skip override_redirect windows during smart placement. Danny Baumann 2008-04-14 Consistently use Compiz coding style. Danny Baumann 2008-04-14 Improve looping over all visible windows. Danny Baumann 2008-04-14 window -> w Danny Baumann 2008-04-14 Improve macro usage. Danny Baumann 2008-04-14 Replace get_window_[width|height] functions by helper macros. Danny Baumann 2008-04-14 Improve define order. Danny Baumann 2008-04-14 Better function grouping / ordering. Danny Baumann 2008-04-14 Remove unused code. Danny Baumann 2008-04-13 Factor out adjustment of configure requests for gravity in a separate function and use this function to also adjust ConfigureRequest events of unmanaged windows for gravity. Dennis Kasprzyk 2008-04-10 Create vertices in different order to save some computations in other plugins (expo, cubeaddon). Dennis Kasprzyk 2008-04-10 Added screen mask to disable occlusion detection. Dennis Kasprzyk 2008-04-09 Combine projection results into one big rectangle, if vertex z values differ and only the vertex region extents get projected. Dennis Kasprzyk 2008-04-09 Disable backface culling during blur first pass rendering. Dennis Kasprzyk 2008-04-09 Moved viewport paint check into a wrapable function. Dennis Kasprzyk 2008-04-08 Flip cull face instead of disabling it. Dennis Kasprzyk 2008-04-08 Increased first pass shader buffer, to fix buffer overflows with gaussian shader radius bigger than 12. Dennis Kasprzyk 2008-04-08 Fetch blur texture in multiple indirection steps, if there aren't enough fragment shader temporaries. Dennis Kasprzyk 2008-04-08 Added glGetProgramiv to screen sturct to be able to get fragment program limitations. Dennis Kasprzyk 2008-04-07 Calculate rotation progress up to a finer level and damage screen if process is not zero. Dennis Kasprzyk 2008-04-07 Calulate cube opacity correctly on zoom out of manual rotation. Merge: b00ffee 2e1a5b0 Danny Baumann 2008-04-07 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-04-07 Above, shade, stick buttons are not available in Metacity <= 2.16. Dennis Kasprzyk 2008-04-04 C style comment. Dennis Kasprzyk 2008-04-04 Leave one free texture coordinate unit for fragment.position and use it also again in the blur shader. This should fix plugins that require fragment.position, if "independet texture fetch" is enabled in the blur plugin. Danny Baumann 2008-04-04 Keep Valgrind silent. Merge: f231964 5c0bad3 Danny Baumann 2008-04-04 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-04-04 If we got an empty rect, assume the button is not present. Danny Baumann 2008-04-04 Also set shaded flag. Danny Baumann 2008-04-04 Always also add the opposite button when adding a stick/above/shade button. Dennis Kasprzyk 2008-04-03 Post release version increment. Dennis Kasprzyk 2008-04-03 Add NEWS entry and bump version for 0.7.4 release. Danny Baumann 2008-04-03 Update German translation. C-F Language team 2008-04-03 translation updates Danny Baumann 2008-04-02 Remove some dead code. Danny Baumann 2008-04-02 Allow key and button bindings being used interchangably in move and resize plugins. This means it's now possible (again) to e.g. initiate move via a keyboard binding and terminate it using the mouse. Danny Baumann 2008-04-02 Allow shading for all kinds of decorated windows. Dennis Kasprzyk 2008-04-01 Bump core ABI. Erkin Bahceci 2008-04-01 Texture compression for image textures. Dennis Kasprzyk 2008-04-01 Reorder blur texture fetches, to fetch all pixels in one indirection step on radeon cards. Dennis Kasprzyk 2008-04-01 Added option for the independent texture fetch feature in blur. Dennis Kasprzyk 2008-04-01 Use constants in the shader code instead of program parameters. Dennis Kasprzyk 2008-04-01 Make as many as possible texture fetches independent in second pass of gaussian blur. Dennis Kasprzyk 2008-04-01 Make as many as possible texture fetches independent in first pass of gaussian blur. Dennis Kasprzyk 2008-04-01 Provide glMultiTexCoord2f in screen struct. Dennis Kasprzyk 2008-04-01 Bump cube ABI. Dennis Kasprzyk 2008-04-01 Moved multi output handling from rotate to cube to make it also work with inactive transparency. Dennis Kasprzyk 2008-04-01 Use cube progress to calculate cube transparency. Dennis Kasprzyk 2008-04-01 Pass cube progress in getRotation function. Dennis Kasprzyk 2008-04-01 Calculate a generic rotation progress value and use it to calculate the cube zoom out. Dennis Kasprzyk 2008-03-31 Typo. Merge: cf5c766 a1df59c Danny Baumann 2008-03-29 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-03-29 Avoid unnecessarily unloading plugins if the new plugin list does not contain the core plugin. Dennis Kasprzyk 2008-03-28 Enable "Drag and Drop" action state for rotate flip edges. Danny Baumann 2008-03-27 Also maximize too-big-for-workarea windows if their placement was skipped. Reference: http://bugs.opencompositing.org/show_bug.cgi?id=827 Danny Baumann 2008-03-27 Recalculate window actions on frame size and transient status changes as the available actions depend on both. Danny Baumann 2008-03-27 Allow minimization for all normal type windows. Danny Baumann 2008-03-26 If we couldn't get the timestamp for the window, try to get at least the timestamp of its transient parent for determining if the window should get focus or not. Danny Baumann 2008-03-25 Correctly unwrap on unload. Merge: fe7c303 b824c7f Danny Baumann 2008-03-25 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-03-25 Fix a number of damage issues. Danny Baumann 2008-03-25 Remove all clones on unload. Danny Baumann 2008-03-23 Don't allow minimization of windows that don't have the minimize action set and reduce code duplication. Danny Baumann 2008-03-17 Always recalculate window type and actions when changing window state. Danny Baumann 2008-03-17 Recalculate window type before updating window state. When not doing that, certain plugins that rely on w->type being correct in the state change notification may behave incorrectly. Danny Baumann 2008-03-17 Update saved window geometry when adding/removing decorations. Otherwise, fullscreened windows jump by the decoration size each time the window is unfullscreened. Danny Baumann 2008-03-17 Don't set mask in addWindowSizeChanges if the new geometry matches the old geometry. Danny Baumann 2008-03-17 Don't send out sync request when nothing changed. Danny Baumann 2008-03-17 Send sync request when changing window size due to updating window attributes. Danny Baumann 2008-03-17 Adjust ConfigureRequest geometry for decoration size. Reference: https://bugs.freedesktop.org/show_bug.cgi?id=13589 Danny Baumann 2008-03-17 Don't send sync requests from reconfigureXWindow function. This is done on the caller side. Reference: http://bugs.opencompositing.org/show_bug.cgi?id=793 Merge: d902325 bcf1058 Danny Baumann 2008-03-16 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-03-16 Use passed geometry for constraining min/max size rather than server geometry. The passed geometry might be different to the server geometry, so don't override the changes. Danny Baumann 2008-03-15 Improve comment and variable name. C-F Language team 2008-03-15 compiz translation updates Danny Baumann 2008-03-15 Also set w->managed on MapNotify event. When not doing that, w->managed can be wrongly set to FALSE on a mapped, non-override_redirect window if a client maps its window and unmaps it right after that. Scenario: - client calls XMapWindow and XUnmapWindow - we get MapRequest, set w->managed to true and map the window by calling XMapWindow - we get UnmapNotify (for client unmap) and set w->managed to false - we get MapNotify (for our map call) and don't set w->managed to true Danny Baumann 2008-03-15 Bump ABIVERSION. Danny Baumann 2008-03-15 Add nodelay hint to flip edges. Danny Baumann 2008-02-25 Also use screen edge delays for DnD actions. Danny Baumann 2008-03-15 Added screen edge trigger delay settings. Plugins intending to prevent edge delays should add the metadata hint to their edge options. Danny Baumann 2008-03-15 Add option for selecting the amount of focus stealing prevention. Danny Baumann 2008-03-15 The largedesktop plugins are responsible for switching viewports when a window is activated. Danny Baumann 2008-03-12 Switch viewports on window activation, not on focus change. Danny Baumann 2008-03-15 Make activateWindow function wrappable so plugins can react on window activation. Danny Baumann 2008-03-14 When a position match is given for a window, constrain the positiong to the output for the geometry given in the match instead of the current output. Danny Baumann 2008-03-13 Selected selected window when terminating scale instead of the last active window. When not doing that, selecting a window using the button binding would fail when click-to-focus is disabled. Jigish Gohil 2008-03-13 remove wrong be translation Dennis Kasprzyk 2008-03-12 Try to start decorator in initScreen because a value for DECOR_DISPLAY_OPTION_COMMAND might been already set in the xml metadata. Dennis Kasprzyk 2008-03-12 Use minimum and maximum "z" component for vertex projection. Dennis Kasprzyk 2008-03-12 Apply core changes to blur. Dennis Kasprzyk 2008-03-12 Use core changes in wobbly. Dennis Kasprzyk 2008-03-12 Use also "z" component in the vertex array, to ensure that plugins like blur that use the vertex array for calculations, can always work with all components. Dennis Kasprzyk 2008-03-12 Added vertexStride window variable. Dennis Kasprzyk 2008-03-12 Set and use w->texCoordSize; Dennis Kasprzyk 2008-03-12 Unredirect top most fullscreen window also if it only covers one output device. This also fixes unredirecting of applications/games that change the display resolution. Danny Baumann 2008-03-12 Remove sessionInit and sessionFini wrappable functions. They do not work as plugins may be (and most likely are) loaded after initializing the session. Replace their usage for retrieving the current and previous session ID with a getSessionClientId function. Store previous session ID for that. Danny Baumann 2008-03-10 Add another overlapping output handling mode "Smart". "Smart" basically is the old "Prefer larger" mode, selecting the output most part of the rectangle is on. "Prefer larger" and "Prefer smaller" only look for the rectangle center to determine the output. Danny Baumann 2008-03-10 Reduce duplicated code by reusing the outputDeviceForGeometry function to implement outputDeviceForPoint. For this, treat a point x,y just as a 1x1 sized rectangle which has its upper left corner at x,y. Danny Baumann 2008-03-10 Clamp point/geometry to compare to visible screen area. When not doing that, always the current output is returned for windows that aren't visible, which is not desired. Danny Baumann 2008-03-10 Make outputDeviceForGeometry behave smarter when dealing with overlapping outputs. Currently, the current output is returned if some part of the rectangle is on it; otherwise the output device the rectangle center is on is returned. This works fine for non-overlapping outputs, but with overlapping outputs, the window center may be on multiple outputs, making the determination ambiguous. This patch applies the following strategy instead: - Determine the output the largest part of the rectangle area is on. - If there are multiple outputs with equally large parts, return the best output based on a user-selectable strategy. - Otherwise, return the output that contains the largest part. This commit also reverts large parts of commit 1a233a20d1de2b504b707fe79ad36268e683eb5d. Dennis Kasprzyk 2008-03-10 Initialize output size correctly. Dennis Kasprzyk 2008-03-09 Added an option to control the selection of an output device, if the output regions overlap in the given point (xrandr 1.2 clone mode). Danny Baumann 2008-03-09 Minor coding style fix. Merge: 6c81f24 74c826b Danny Baumann 2008-03-09 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-03-09 Bump ABIVERSION. Danny Baumann 2008-03-09 Add a sessionInit and a sessionFini callback function. Use sessionInit to transmit information about client ids. Danny Baumann 2008-03-09 Generalize session event functions to have only one event function instead of four. Dennis Kasprzyk 2008-03-06 Post release version increment. Dennis Kasprzyk 2008-03-06 Add NEWS entry and bump version for 0.7.2 release. Roland Bär 2008-03-05 Avoid possible NULL pointer dereferences. Roland Bär 2008-03-03 Simplified logMessage() Merge: 34ea58c 9964fd9 Danny Baumann 2008-03-05 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-03-04 Invoke terminate function for edge buttons if button is released. Also set InitButton state for edge buttons. Danny Baumann 2008-03-04 Annotate draw is a dbus only action, reflect that in the metadata. Danny Baumann 2008-03-03 Don't switch viewports when a window requests to get focus. Instead, switch when the window actually got focus as its focus might have been prevented by focus stealing prevention, in which case the viewport change would be unexpected by the user. Danny Baumann 2008-03-02 Fix erase mode. This one improves the last attempt to fix the erase mode. Danny Baumann 2008-03-02 Revert "Fixed annotate erase mode." This reverts commit 40435f72073bb5747d1b63948807c207c31174b0. Danny Baumann 2008-03-02 Fixed annotate erase mode. Danny Baumann 2008-03-02 Always use the current window decoration extents instead of the custom decoration extents, which may not be currently used (e.g. if the window was excluded from decorations). Reference: http://bugs.opencompositing.org/show_bug.cgi?id=818 Danny Baumann 2008-03-01 Don't try to get button positions for undecorated windows. Reference: https://bugs.freedesktop.org/show_bug.cgi?id=14729 Danny Baumann 2008-03-01 Fixed annotate erase invocation and termination. Danny Baumann 2008-03-01 Correctly terminate move action if it was initiated by decoration button press and the button binding was not set to +Button1. Reference: http://bugs.opencompositing.org/show_bug.cgi?id=725 Danny Baumann 2008-03-01 Clear window input extents when removing decoration from a window. Reference: http://bugs.opencompositing.org/show_bug.cgi?id=818 Danny Baumann 2008-03-01 Make scaleSelectWindow wrappable so that subplugins can be notified of window selection. Merge: 965f77b ac4902c Danny Baumann 2008-02-27 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-02-27 Set cancel state when ending scale the same way as it was initiated. When not doing that, the last active window will be activated, which might be unintended, e.g. if the window is shaded. In general, we want scale to only activate windows if the user selected them by either using the mouse or the Return key. Danny Baumann 2008-02-27 Fix warning. Danny Baumann 2008-02-26 Correctly reflect changes to Gnome's DPI settings. Gtk+ emits a style-set signal in that case. Reference: http://bugs.opencompositing.org/show_bug.cgi?id=791 Merge: 84a105d 81a0ca4 Danny Baumann 2008-02-26 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-02-26 Update translatable files. Danny Baumann 2008-02-26 Use gettext to translate tooltips and dialog items of gtk-window-decorator. Dennis Kasprzyk 2008-02-26 Clear switcher content to make sure that the new background pixmap gets applied. Dennis Kasprzyk 2008-02-26 Rotate in right direction if hsize is 3. Patrick Niklaus 2008-02-25 Use visual and depth of the window to support RGBA. Danny Baumann 2008-02-24 Avoid possible NULL pointer dereferences. Roland Baer 2007-09-20 mem leak fix Merge: 3213fe9 7d2c53a Danny Baumann 2008-02-24 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-02-24 Make sure a window is selected after relayouting slots. Danny Baumann 2008-02-24 Revert "Select window under pointer right after ending the zoom out animation, so that a mouse move is not needed for that." This reverts commit e7f9fd9d0eed0ea2f661334fc8d8550da94be7ea. C-F Language team 2008-02-24 oops, readding deleted file C-F Language team 2008-02-23 translation update Danny Baumann 2008-02-23 Select window under pointer right after ending the zoom out animation, so that a mouse move is not needed for that. Shift around a few functions for that. Danny Baumann 2008-02-22 Don't change stacking order and focus if the user cancelled scale. Danny Baumann 2008-02-19 Updating the window size is sufficient to reflect workarea size changes. Danny Baumann 2008-02-19 Update maximized window's geometry if the screen workarea changed. Danny Baumann 2008-02-19 Prevent switcher window being re-placed by the decoration plugin by specificying a static window gravity. Danny Baumann 2008-02-19 Correctly unset TermButton / TermKey state. Dennis Kasprzyk 2008-02-18 Revert "Query bound pixmap texture target, if the fbconfig only reports rectangle texuture support, but the texture has power of two dimensions." This reverts commit 0686a202da4d949d668b2ad029a290659b86b777. This has been already fixed in the xserver for current AIGLX and the DRI2 TTM buffer object texture from pixmap implementation in the xserver will be also fixed before a release. Merge: a2bfb21 0686a20 Danny Baumann 2008-02-18 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-02-18 Fix saving session client id to session manager. Previously, it was not possible to simply omit the --sm-client-id when connecting to the SM as new client, which was needed to get Compiz connected to KDE's session manager. Now, the session id is always written to the SM and not only replaces the old session ID. Dennis Kasprzyk 2008-02-18 Query bound pixmap texture target, if the fbconfig only reports rectangle texuture support, but the texture has power of two dimensions. (known as the white shadows bug) Travis Watkins 2008-02-16 [PATCH] only allow rotate to faces that exist Danny Baumann 2008-02-15 Don't showdesktop grabbed windows. Danny Baumann 2008-02-15 Don't overwrite new client id with the one passed via command line. Danny Baumann 2008-02-14 Export session client id to sessionSaveYourself. Dennis Kasprzyk 2008-02-12 Do no register core path twice. Dennis Kasprzyk 2008-02-12 Do not try to produce broken introspection information for unknown option types. Christopher Williams 2008-02-08 Fix KDE3 and KDE4 configure checks. Danny Baumann 2008-02-08 Don't allow minimization of skip taskbar dialogs. Added a comment explaining why. Danny Baumann 2008-01-30 Added wrappable callback functions for session management events. Dennis Kasprzyk 2008-02-07 Post release version increment. Dennis Kasprzyk 2008-02-07 Add NEWS entry and bump version for 0.7.0 release. Danny Baumann 2008-02-07 Use outputDeviceForGeometry function for implementing outputDeviceForWindow to get rid of code duplication. Merge: c3f2d5e 155efce Danny Baumann 2008-02-07 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-02-07 Disable "Slow animations" key by default. This option has uses for debug and demo purposes only, but is not relevant for normal usage, so it should be unassigned by default. Dennis Kasprzyk 2008-02-07 Fixed handling of autogenerated files to make distcheck work again. Merge: d916969 a0d236e Danny Baumann 2008-02-04 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-02-04 Fixed list parsing. Danny Baumann 2008-02-04 Beautification. Randolph Chung 2008-02-04 Fix operator order. Dennis Kasprzyk 2008-02-01 Watch for plasma theme changes. Dennis Kasprzyk 2008-02-01 Set switcher backgound pixmap instead of only a color. Dennis Kasprzyk 2008-02-01 Use Plasma::Svg and some code from Plasma::Dialog to paint directly into a QPixmap. Dennis Kasprzyk 2008-02-01 Do not resize the decoration widget to the wrong dimensions first. Dennis Kasprzyk 2008-02-01 Set switcher selection color. Dennis Kasprzyk 2008-02-01 Allow the window decorator to change the selection rectangle color. Dennis Kasprzyk 2008-02-01 Add atom define that allows the decorator to change the color of the selection rectangle of the switcher window. Dennis Kasprzyk 2008-02-01 Removed old switcher code. Dennis Kasprzyk 2008-02-01 Include only needed headers. Dennis Kasprzyk 2008-02-01 Set blur property for the switcher window. Dennis Kasprzyk 2008-02-01 Use Plasma to draw the application switcher window. Dennis Kasprzyk 2008-02-01 Link against Plasma. Danny Baumann 2008-01-31 Give switcher window active window decorations. Danny Baumann 2008-01-31 Bump decorator interface version as decoration atom names changed. Danny Baumann 2008-01-31 Make decoration atom names part of the decoration interface. If those atom names do not match between decorator and decoration plugin, the decorator will be useless; so it makes sense to include them in the interface. Dennis Kasprzyk 2008-01-30 Use new atom names. Dennis Kasprzyk 2008-01-30 Use new atom names. Dennis Kasprzyk 2008-01-30 Update to new atom names. Dennis Kasprzyk 2008-01-30 Use _COMPIZ_ prefix for all decoration related atoms. Dennis Kasprzyk 2008-01-30 Use _COMPIZ_ prefix for all non stadardized decoration manager atom names. Dennis Kasprzyk 2008-01-30 Use _COMPIZ_ prefix to symbolize that this is a compiz private atom. Merge: 176a811 41b3fd8 Dennis Kasprzyk 2008-01-30 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2008-01-30 The KDE4 window decorator now only uses public KDE API (version >= 4.0.1) to build. Thanks to Lubos Lunak for making all needed parts public in KDE. C-F Language team 2008-01-29 translation update Merge: 327367d 3afa19f Dennis Kasprzyk 2008-01-28 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-01-28 Minor coding style enhancement. Guillaume Seguin 2007-07-28 * Add snap_bottom option * Do not snap when there are only 2 viewports Dennis Kasprzyk 2008-01-27 Check only for public KDE 4.0 decoration headers. (Will be available in 4.0.1 and 4.1) Merge: 0d27505 38e48f9 Dennis Kasprzyk 2008-01-24 Merge branch 'master' of git+ssh://onestone@git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2008-01-22 Added kde-window-decorator KDE 4 port. Dennis Kasprzyk 2008-01-22 Added KDE4 configure checks. Erkin Bahceci 2008-01-10 Do librsvg initialization/termination. Fixes the broken svg loading due to GLib-GObject-CRITICAL errors. Danny Baumann 2008-01-20 Allow minimizing non-transient dialog windows. Transient child dialog can be minimized by minimizing their parent, but non-transients can not; which is why we should allow them to be minimized. This change also allows that every window which has the minimize action allowed to be minimized by external applications (such as the decorator), which should be desired behaviour anyway. Danny Baumann 2008-01-20 Allow maximizing dialog windows. If the app doesn't intend to prevent size changes for the dialog (by setting minimum/maximum size constraints), there's no reason why we should prevent dialog maximization. Danny Baumann 2008-01-16 On shading, set input focus after setting the hidden state to make sure that the frame is properly focussed. Dennis Kasprzyk 2008-01-15 Wait for the proper configure (and map) events before rebinding the decoration pixmap. - On some systems the decoration widget window gets mapped first and resized after the map. KWD used a wrong window pixmap in this case. Compiz Fusion l10n team 2008-01-10 Translations update Michael Vogt 2008-01-08 [PATCH] metadata/schemas.xslt: - fix generation of the active_plugin list in the schema file C-F Language team 2007-12-22 translation updates Dennis Kasprzyk 2007-12-19 Decorate "menu" window type windows. Dennis Kasprzyk 2007-12-19 Add window actions "menu" type windows (ex. gimp detached menus). Dennis Kasprzyk 2007-12-19 Damage window extents correcly of windows with borders. Dennis Kasprzyk 2007-12-19 Draw cube caps correctly in inside cube mode. Merge: b762222 ceb2a71 Danny Baumann 2007-12-16 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-12-16 Change behaviour when an error on regex creation is encountered. Until now, on match handler was registered in that case. This leads to a compiz crash at the time the match is evaluated. Now, the handler is registered without regex data and the match is just evaluated to FALSE. C-F Language team 2007-12-12 translation updates Danny Baumann 2007-12-05 Correctly reset hoveredWindow variable on invoking scale. Merge: 079c30e a29c944 Danny Baumann 2007-12-04 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-12-04 Make sure that - transients and ancestors are always stacked correctly - sync requests are sent out appropriately whenever configureXWindow is called. Danny Baumann 2007-12-04 Only maximize windows that intend to be resized larger than the work area in both directions. David Reveman 2007-12-03 Add _NET_WM_STATE to _NET_SUPPORTED. Danny Baumann 2007-11-27 Fix calculations. Danny Baumann 2007-11-26 Cleanup. Also only clip placement on one side per direction. Windows that are outside the workarea on both sides can't be clipped properly anyways. Alyssa Hung 2007-11-25 * Also account for window borders when ensuring that transient windows are fully visible on the current workspace. Dennis Kasprzyk 2007-11-19 Use the kwin translation catalogue to provide a translated window menu. Jürgen Kreileder 2007-11-16 Fix copy'n'paste mistakes. Danny Baumann 2007-11-16 Make the window frame also process the configured actions for middle and right mouse button click, so that the frame behaves the same way as the title. Double click and scroll actions still are title-only as those actions are more "invasive" and might be confusing if triggerable from the frame. ΔημήτÏης (djdoo) 2007-11-15 el translation update ΔημήτÏης (djdoo) 2007-11-15 el translation update Jigish Gohil 2007-11-15 nb translation updated from Ketil W. Aanensen Jigish Gohil 2007-11-15 ko translation updates from Lee June Hee Jigish Gohil 2007-11-15 fr translation update from Tristan RABLAT Jigish Gohil 2007-11-15 pl translation from Maciej Warnecki Jürgen Kreileder 2007-11-15 Fix smart placement client size calculations. Danny Baumann 2007-11-13 NULL is allowed as sibling value, too. Merge: 58a6c8f 0c7c72a Danny Baumann 2007-11-12 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Roland Baer 2007-09-24 Return in out of mem condition Danny Baumann 2007-11-11 Give options passed over the command line priority over ones from gconf. To do that, store flags which options were passed and don't use the gconf values for those. Steven Robertson 2007-11-11 Fix window unsnapping for vertically arranged Xinerama heads. Danny Baumann 2007-11-11 Avoid possible dereference of NULL pointer; and fix duplicate variable declaration. Danny Baumann 2007-11-11 Fix dbus paths (shadow_offset_x/y -> shadow_x/y_offset). Danny Baumann 2007-11-11 Fix typos. Danny Baumann 2007-11-11 Wrap setOptionForPlugin function. Danny Baumann 2007-11-11 The display dbus path is now "display", no longer "allscreens". Danny Baumann 2007-11-09 The sibling found by findSIblingBelow might already be the active window, so include it in check. Danny Baumann 2007-11-08 Move restacking due to focus stealing prevention to updateWindowAttributes function. Rationale: This saves one unnecessary restack operation. Additionally, it has the advantage of automatically getting transient and ancestor stacking right without a separate decision tree. Danny Baumann 2007-11-08 Factor out retrieving the highest valid sibling under a given window into a separate function. Danny Baumann 2007-11-07 Don't restack ancestors on initial map. Rationale: A newly opened window most likely is put on top of the stack, thus the ancestors are raised. If the new window is denied focus later, the ancestors remain raised, which we do not want to happen. Danny Baumann 2007-11-05 tr translation update (closes #13094) Danny Baumann 2007-11-05 Fix whitespace. Roland Baer 2007-11-05 Removed dead condition/code Minor Danny Baumann 2007-11-05 Clip transient child placement to parent output instead of current output. Danny Baumann 2007-11-05 Minor optimization Danny Baumann 2007-11-03 Fix typo. Danny Baumann 2007-11-03 Prevent transient children being stacked below their parent if their focus was denied. Danny Baumann 2007-11-03 Bump ABIVERSION. Danny Baumann 2007-11-03 Whitespace fixes. Danny Baumann 2007-10-23 Avoid unnecessarily constraining window size. Danny Baumann 2007-10-22 Try to maximize window if it requested to be resized larger than the work area. Danny Baumann 2007-10-22 Improve calculations. Danny Baumann 2007-10-22 Added wrappable validateWindowResizeRequest function that can be used to adjust window resize request processing. Made place plugin wrap into this function and ensure the window remains inside the work area. Merge: 93d8d8b 868bb72 Danny Baumann 2007-11-01 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-11-01 Compare to wmType, not type variable. Docks that have below state flag shouldn't be hidden in showdesktop mode, so we have to have a look at the real window type. David Reveman 2007-10-30 Add --sm-disable option to kwd. David Reveman 2007-10-30 Reparent window just before mapping it and avoid hiding it when reloading decorations. David Reveman 2007-10-30 Don't remove WType_TopLevel bit when reloading decorations. David Reveman 2007-10-30 Make mCompositeWindow an X window instead of a QWidget. Merge: a0e5a42 168c7c3 David Reveman 2007-10-30 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-10-30 Remove whitespaces. David Reveman 2007-10-30 Reparent window instead of flipping the WType_TopLevel bit. Danny Baumann 2007-10-29 Fix call argument. Danny Baumann 2007-10-29 Move focusDefaultWindow function from display.c to screen.c. Danny Baumann 2007-10-29 Make focusDefaultWindow() take the screen as parameter. This avoids focus jumping between screens. Danny Baumann 2007-10-29 fr translation update (closes #12918). Danny Baumann 2007-10-29 pt_BR translation update (closes #12861). Danny Baumann 2007-10-24 Use CompVector. Danny Baumann 2007-10-24 Whitespacing. Danny Baumann 2007-10-27 Added CompVector type for describing vectors. Make the matrix and vector multiplication functions use CompTransform and CompVector as arguments. Danny Baumann 2007-10-24 Complete comment. Danny Baumann 2007-10-27 Added some matrix functions that can be useful for plugins. Danny Baumann 2007-10-24 Whitespacing. Danny Baumann 2007-10-24 Avoid duplicated defines. Danny Baumann 2007-10-23 Whitespace fixes. Danny Baumann 2007-10-23 Get rid of cached values for paint modifier options. Danny Baumann 2007-10-23 Allow DnD for scale edges. Danny Baumann 2007-10-23 Don't switch to selected window if switcher was cancelled. Danny Baumann 2007-10-19 Fix typo. Danny Baumann 2007-10-19 Also check if parent's Y coordinate is inside the current viewport. Danny Baumann 2007-10-19 We don't need to constrain y movement after placing transients. Danny Baumann 2007-10-19 Fix typo. Danny Baumann 2007-10-19 Set demands_attention hint everytime window focus was prevented. Merge: f0334e1 c9b1172 Danny Baumann 2007-10-18 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-10-18 Also set demands attention hint if focus was prevented because a window is on another viewport. Simplify code for setting demands attention if the focus stealing prevention match has applied. Danny Baumann 2007-10-18 Check inside of changeWindowState if state was actually changed instead of on the caller side. Danny Baumann 2007-10-17 Minor cleanup. Dennis Kasprzyk 2007-10-17 Use window Offsets to paint correct background. Danny Baumann 2007-10-17 Fix in-viewport calculation. Danny Baumann 2007-10-17 Prevent wobbling when shading maximized windows. Danny Baumann 2007-10-17 Added clear button option. Danny Baumann 2007-10-17 Added button options for minimize window and toggle window maximized. Danny Baumann 2007-10-17 Added close window button and raise/lower window key options. Danny Baumann 2007-10-17 Always allow focus for active window. Danny Baumann 2007-10-16 putenv doesn't work properly with dynamically allocated strings that are free'd right after the putenv call. Danny Baumann 2007-10-16 Run external commands with a DISPLAY string adjusted for the screen number that was passed to runCommand. Danny Baumann 2007-10-16 Get private pointer for the current screen. Tomas Carnecky 2007-10-12 Start window decorator on all screens. Danny Baumann 2007-10-16 Use real screen number rather than 0. Danny Baumann 2007-10-16 Use real screen number rather than 0. Merge: af11408 a999783 Danny Baumann 2007-10-16 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-10-15 Only send synthetic ConfigureNotify when ignoring ConfigureRequest events. We don't need to send a synthetic configure notify otherwise because we don't reparent. Danny Baumann 2007-10-15 Cleanup. Dennis Kasprzyk 2007-10-15 getWindowMovementForOffset should always return correct values, also for too big offsets. Danny Baumann 2007-10-15 We have to send the WM_TAKE_FOCUS message even if we directly set the input focus. Merge: 3a5a0c3 f26e7e6 Danny Baumann 2007-10-15 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-10-13 Clear all coordinates that match the server coordinates from the configure request mask to make sure a synthetic configure notify event is sent whenever needed. Merge: 8069a92 00e3b95 Danny Baumann 2007-10-12 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-10-11 Minor cleanup. Danny Baumann 2007-10-11 Update saved window coordinates when window is resized by some client. Danny Baumann 2007-10-11 We have a CompScreen* variable, use it. Danny Baumann 2007-10-11 Use client message timestamp rather than window user time when processing focus stealing prevention on _NET_ACTIVE_WINDOW messages. Danny Baumann 2007-10-11 Don't prevent focus for desktop and dock windows on arrival of a _NET_ACTIVE_WINDOW message. Danny Baumann 2007-10-10 Also update saved X position. Dennis Kasprzyk 2007-09-27 Fixed window offset calculation for multihead configurations. Dennis Kasprzyk 2007-09-27 Use setWindowPaintOffsets instead of moveScreenViewport in plane. Dennis Kasprzyk 2007-09-27 Use getWindowMovementForOffset in moveScreenViewport. Dennis Kasprzyk 2007-09-27 Use setWindowPaintOffsets instead of moveScreenViewport in cube. Dennis Kasprzyk 2007-09-27 Bump core ABI. Dennis Kasprzyk 2007-09-27 Added support for window paint offsets into painting system. Dennis Kasprzyk 2007-09-27 Added function to calculate window movement for a given offset. Dennis Kasprzyk 2007-09-27 Initialize windowOffsetX/windowOffsetY correctly. Dennis Kasprzyk 2007-09-27 Added new PAINT_WINDOW_WITH_OFFSET_MASK mask that indicates that a window will be painted with an offset. Dennis Kasprzyk 2007-09-27 Added setWindowPaintOffset function. Dennis Kasprzyk 2007-09-27 Use windowOnAllViewports in moveScreenViewport. Dennis Kasprzyk 2007-09-27 Added windowOnAllViewports function. Danny Baumann 2007-10-08 Fix typo. Danny Baumann 2007-10-08 Immediately update the internal stack representation on stack changes caused by MapRequest events. If we don't do that, the window is still at the top of the stack until the ConfigureNotify event arrives, which might be an invalid position. This could make subsequent stacking attempts (e.g. if there are more MapRequest events before the ConfigureNotify event) fail because the window might block other windows from getting their valid stack position. Danny Baumann 2007-10-06 Fix findLowestSiblingBelow function for desktop windows. No other windows are valid to be stacked below desktop windows. Merge: d54b5a5 674c062 Danny Baumann 2007-10-06 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-10-06 Correct handling of grab window in case it is destroyed. Danny Baumann 2007-10-06 Fix handling of ConfigureRequest events with CWStackMode set, but without CWSibling set. Danny Baumann 2007-10-04 Always use the old geometry passed to addWindowSizeChanges for comparisons. It's not guaranteed that the old geometry is exactly the same as the server geometry. Danny Baumann 2007-10-04 glGetString is allowed to return NULL in case an error happened, so avoid crashing in this case and bail out instead. Danny Baumann 2007-10-02 Remove initial stack sanitization. It's functionality is already done by addWindow (in case the window was mapped on startup) or the MapRequest handler. Danny Baumann 2007-10-02 Send synthetic configure notify events where needed according to ICCCM chapter 4.1.5. Specifically, we have to send them when a) moving or restacking a window without resizing it b) not reacting to ConfigureRequest events. Danny Baumann 2007-10-02 Don't touch override_redirect windows on initial sorting. Danny Baumann 2007-10-02 An aboveId of None means that the window was placed on bottom of the stack, so also update the linked list accordingly. Danny Baumann 2007-10-02 Don't restack desktop windows. They are placed correctly by updateWindowAttributes. Danny Baumann 2007-10-02 Fix variable naming. Danny Baumann 2007-10-02 Sort windows that are present before the WM starts. The sort is done according to a window layer check. Danny Baumann 2007-10-02 We always need to restack windows on map. Newly created windows are placed on top of the stack first, which is not desired for some windows that may be denied focus (such as desktop windows). This commit reverts commit 67648904b15c7781000a212a122b558a2d2afcf6. Danny Baumann 2007-10-01 Focus default window after switching viewports. Danny Baumann 2007-09-28 We don't need to care about converting the returned name string. This is done inside of KDE. Danny Baumann 2007-09-28 Move input (if desired) focus after mapping the window. Danny Baumann 2007-09-28 Use focus stealing prevention for application initiated active window change requests. Danny Baumann 2007-09-28 Delete property first and delete frame window after that to avoid race conditions. As the requests are processed in order by the server, otherwise other clients still may see a frame window ID in the property for a non-existing frame. Danny Baumann 2007-09-27 el translation update. Closes bug #12593. Danny Baumann 2007-09-27 Fix warning. Danny Baumann 2007-09-27 Fix full window frame being painted once after shading. Added commit explaining the workaround. Danny Baumann 2007-09-27 Fix map and restack ordering. unminimizeWindow already contains a XMapWindow call, so minimized windows that are unminimized and then restacked by the focus stealing prevention are first mapped, then restacked; which led to ugly flashing. The new code makes sure windows are always first restacked, then mapped. Danny Baumann 2007-09-27 Don't restack windows on map if their focus should be prevented. Danny Baumann 2007-09-27 Support restack requests in ConfigureRequest events. Danny Baumann 2007-09-27 Rename focusWindowOnMap to allowWindowFocus and make it use the current window viewport, not the initial one. Danny Baumann 2007-09-26 Update decoration with a timer after resize. decorWindowUpdate may call windowResizeNotify via calling updateWindowOutputExtents. Danny Baumann 2007-09-25 Sort LINGUAS list alphabetically and remove duplicate item. Danny Baumann 2007-09-25 Translation updates for gl, nb, sv and tr. Closes bug #12556. Dennis Kasprzyk 2007-09-24 Make sure that unredirected windows get redirected on unmap. Dennis Kasprzyk 2007-09-24 Make sure that everything is painted, if another plugin requests it. Danny Baumann 2007-09-24 Make sure the position is randomized only for windows that are smaller than the workarea. Otherwise, the mod operator may be called for numbers smaller or equal than 0, leading to a crash. Merge: fc9a738 27fe04f Danny Baumann 2007-09-22 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-09-22 Bump ABIVERSION. Danny Baumann 2007-09-22 Minor beautification. Danny Baumann 2007-09-22 Added paintAllViewports variable. Plugins hooking into cube can use this variable to force cube to paint all viewports. Danny Baumann 2007-09-22 Added CubePostPaintViewportProc. This function can be used by plugins that want to paint on the viewport transformed by cube. Danny Baumann 2007-09-21 Greek translation update by jimdusis@yahoo.gr. Danny Baumann 2007-09-21 Use matrixTranslate instead of ScreenPaintAttrib. Danny Baumann 2007-09-21 Use matrixTranslate instead of ScreenPaintAttrib. Danny Baumann 2007-09-21 Don't wrap into functions when not needed. Danny Baumann 2007-09-20 Fix whitespacing. Robert Noland 2007-09-19 Replace strndup with malloc and strncpy. FreeBSD doesn't support strndup. Danny Baumann 2007-09-20 Only apply clipping planes when the cube is actually rotated. Danny Baumann 2007-09-20 Add minimum and maximum restrictions for opacity values. Danny Baumann 2007-09-19 Minor cleanup. Danny Baumann 2007-09-19 Fix whitespace. Kristian Lyngstol 2007-09-18 [PATCH] Autoraise for transients too Dennis Kasprzyk 2007-09-18 Use KDE functions to get the visible window name. Dennis Kasprzyk 2007-09-18 Don't restack new "dock" type windows behind the active window. Dennis Kasprzyk 2007-09-17 Use current viewport for skydome rotation calculation. Dennis Kasprzyk 2007-09-17 Wrap enableOutputClipping to set correct clipping of the cube faces. Dennis Kasprzyk 2007-09-17 Added wrapable output clipping functions. Merge: ecbedd8 6368fdb Danny Baumann 2007-09-17 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-09-17 Include compiz-core.h before Xrender.h because newer versions of Xrender headers need Xlib.h included first. Danny Baumann 2007-09-16 Formatting fix. Danny Baumann 2007-09-16 Only copy structures when needed. Danny Baumann 2007-09-16 Whitespace and formatting improvements. Danny Baumann 2007-09-14 Bump ABIVERSION. Danny Baumann 2007-09-14 Allow plugins to not only clear allowed window actions, but also to add allowed actions. Danny Baumann 2007-09-14 Call matchPropertyChanged handler when the override_redirect flag changed. Danny Baumann 2007-09-14 Revert "Handle MapRequest event after core so that decorWindowUpdate sees window type and override_redirect state changes that might have happened during event processing." This reverts commit 8af9c24dee10bf827f1784db1590d0d9bcae9a93. The decoration must be added before core handles the map request so that it can be taken into consideration properly for the initial window placement. Danny Baumann 2007-09-12 Always update event windows when the allowed actions have changed. Danny Baumann 2007-09-12 Re-query Xinerama information on root window reshape. It might be very well possible that the root window was reshaped because of an output reconfiguration, e.g. using xrandr. Danny Baumann 2007-09-11 Handle MapRequest event after core so that decorWindowUpdate sees window type and override_redirect state changes that might have happened during event processing. Danny Baumann 2007-09-11 Recalculate window type and window actions if override_redirect state changed. Danny Baumann 2007-09-11 Check for changes to the override_redirect flag on window map. Rationale: Another client (such as Wine) might have changed it while the window was unmapped, and we are not guaranteed to get a configure notify event after map so it might happen that we don't treat the window correctly. Danny Baumann 2007-09-10 Translation update for it by Milo Casagrande. Danny Baumann 2007-09-10 Translation update for pt by Nicolau Goncalves. Danny Baumann 2007-09-10 Use normal mode for maximized windows. Rationale: Fully maximized windows can't be resized anyway, and showing the outline/rectangle when 'peeling' the window is visually distracting. Merge: c7fa428 a7e4007 Danny Baumann 2007-09-10 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Roland Bär 2007-09-10 Plug minor memleak. David Reveman 2007-09-10 Revert "Check d->base.parent to see if the object is properly" This reverts commit d7a6af1c6b86bb10eb672901fcddcb0e2d05f579. Using a timeout is not the proper solution but revert to this as a ExpHandlerChanged call before regex plugin has initialized all objects will definitely not work. A proper solution will be added once the new object system is fully in place. David Reveman 2007-09-09 Minor cleanup. David Reveman 2007-09-09 Remove whitespaces. Danny Baumann 2007-09-09 Properly remove window decorations on plugin unload. Danny Baumann 2007-09-09 XineramaQueryScreens is not guaranteed to set the number parameter to zero if it returns NULL, so better initialize the parameter properly. Danny Baumann 2007-09-09 Fixed Gconf setting parsing for title bar button actions. Danny Baumann 2007-09-09 Added minimization as title bar button action. Danny Baumann 2007-09-09 Correct default behaviour of middle mouse button: It should be lowering the window, not raising it. Danny Baumann 2007-09-09 Integrate Metacity's configurable middle and right click actions. Danny Baumann 2007-09-09 Added mouse wheel handling to g-w-d. The wheel handling is optional, with "No handling" and "Shade" being the only two options for the moment. Danny Baumann 2007-09-08 Remove Metacity bell settings integration. g-w-d should only integrate settings it uses itself (such as the used theme), all other settings should be handled inside compiz. Danny Baumann 2007-09-07 Minor cleanup. Danny Baumann 2007-09-07 Remove frame window property on removing the window frame. Danny Baumann 2007-09-07 Free core private index, not display private index. Merge: e24fa4b 0abec23 David Reveman 2007-09-06 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: include/compiz-scale.h David Reveman 2007-09-06 Check return status of dbus_message_iter_open_container. Roland Baer 2007-09-06 mods is useless or "modifiers" will not work David Reveman 2007-09-06 Bump ABI versions. David Reveman 2007-09-06 Fix a number of obvious memory leaks. David Reveman 2007-09-06 Fix memory leaks and clean up properly in gconf plugin. David Reveman 2007-09-06 Check d->base.parent to see if the object is properly initialized instead of using a timeout. David Reveman 2007-09-06 Cleanup file watches properly. David Reveman 2007-09-06 Free cs->vertices. David Reveman 2007-09-06 Unwrap setOptionForPlugin function. David Reveman 2007-09-06 Unwrap setOptionForPlugin function. David Reveman 2007-09-06 Free window private index. David Reveman 2007-09-05 Only call matchExpHandlerChanged if display has not been removed. David Reveman 2007-09-05 Remove windowAddNotify and windowRemoveNotify hooks. David Reveman 2007-09-05 Have blur plugin hook into objectAdd instead of windowAdd. David Reveman 2007-09-05 Free core private index in decorFini and not the display private index. David Reveman 2007-09-05 Call decorWindowAdd instead of decorWindowUpdate directly. David Reveman 2007-09-05 Use objectAdd/Remove interface instead of old WindowAdd/Remove interface in decoration plugin. David Reveman 2007-09-05 Hook into objectAdd and objectRemove functions. David Reveman 2007-09-05 Add objectAdd and objectRemove hooks to core. These are similar to windowAddNotify and windowRemoveNotify but provide the same functionality for all object types. The parent field in object struct is set by the core implementation of this function, which means that the parent field can be used to check if object is properly initialized or not. Objects with parent field not yet set must never be passed to a wrap-able function. Plugins should simple not call any core functions from the initObject function unless parent field has been set. David Reveman 2007-09-05 Make decoration plugin hook into windowRemoveNotify and remove any decorations when this function is called instead of from decorFiniWindow. Nicolas Viennot 2007-09-05 Add windowRemoveNotify function. Danny Baumann 2007-09-05 Fix copy'n'paste mistake. David Reveman 2007-09-05 Remove ping timeout when removing display. David Reveman 2007-09-05 Initialize display object for plugins properly. David Reveman 2007-09-05 Load core plugin when initializing core object. David Reveman 2007-09-05 Close display connection. David Reveman 2007-09-05 Remove displays before plugins. David Reveman 2007-09-05 Add multi-display support to eventLoop. David Reveman 2007-09-05 Move WatchFd variables into core object. David Reveman 2007-09-05 Move CompWatchFd struct into compiz-core.h. David Reveman 2007-09-05 Move outputRegion and tmpRegion into core object. David Reveman 2007-09-05 Move timeout variables into core object. David Reveman 2007-09-05 Move CompTimeout struct to compiz-core.h. David Reveman 2007-09-05 Remove trailing whitespaces. David Reveman 2007-09-05 Avoid waking up once every second. David Reveman 2007-09-05 Remove compDisplays variable and add comments to code which break support for multiple displays. David Reveman 2007-09-05 Move plugin and display removal to finiCore and call finiCore from main. David Reveman 2007-09-05 Remove display connection watch properly. David Reveman 2007-09-05 Destroy temporary regions properly. David Reveman 2007-09-05 Move shutdown code out of for loop. Danny Baumann 2007-09-05 Only assign the default shadow to windows which use default decorations. If we use the default shadow for other windows (such as maximized or utility ones), the decoration context doesn't match the border, leading to corrupted display of the decorations for this window. David Reveman 2007-09-05 Destroy damage, remove passive button grabs and remove event masks. David Reveman 2007-09-04 Ungrab keys, free buttonGrab and keyGrabs. David Reveman 2007-09-04 Add removeDisplay and use it before returning from event loop. David Reveman 2007-09-04 Remove whitespace. David Reveman 2007-09-04 Allocate display objects properly. David Reveman 2007-09-04 Keep track of display objects in core object. David Reveman 2007-09-04 Release overlay window in removeScreen. David Reveman 2007-09-04 Free options, damage region and startup notification context properly in freeScreen. David Reveman 2007-09-04 Free invisibleCursor when removing screen. David Reveman 2007-09-04 Destroy GLX context when removing screen. David Reveman 2007-09-04 Free background texture when removing screen. David Reveman 2007-09-04 Destroy screen edges and grab window when removing screen. David Reveman 2007-09-04 Move window restore functionality into removeWindow function where it's supposed to be. David Reveman 2007-09-04 Only update client list and workarea if window has been destroyed. David Reveman 2007-09-04 Remove all windows when removing screen. David Reveman 2007-09-04 Move window restore functions to screen.c. David Reveman 2007-09-04 Remove all screens before we return from event loop. David Reveman 2007-09-04 Add removeScreen function. David Reveman 2007-09-04 Add support for any kind of object type to gconf plugin. gconfKeyChanged still needs to be updated to support types other than display and screen but key names should preferably be changed before this is fixed. David Reveman 2007-09-04 Add support for any kind of object type to kconfig plugin. David Reveman 2007-09-04 Have compObjectForEachType take a parent argument to make it a bit more convenient to use. David Reveman 2007-09-04 Cleanup dbus plugin. David Reveman 2007-09-04 Allow key and button options in objects that are descendants of a display object. David Reveman 2007-09-04 Allow key and button options in objects that are descendants of a display object. David Reveman 2007-09-04 Fix typo. David Reveman 2007-09-04 Use 'base' as default name for base object instead of 'object'. David Reveman 2007-09-04 Add parent to object struct. David Reveman 2007-09-04 Add findObject function to object interface. David Reveman 2007-09-04 Remove setDisplayOptionForPlugin and setScreenOptionForPlugin functions. Add setOptionForPlugin to core object. Danny Baumann 2007-09-04 Re-add rotate_right_key option to metadata which was removed by accident. Danny Baumann 2007-09-04 Only show resize rectangle on the screen the resized window is on. Danny Baumann 2007-09-04 Added button bindings for rotating left/right. Danny Baumann 2007-09-04 Added button bindings for initiating scale. David Reveman 2007-09-04 Move file watch interface to core object. David Reveman 2007-09-04 Add nameObject function to object interface. David Reveman 2007-09-03 Add compObjectTypeName function. David Reveman 2007-09-03 Add name to object info struct. David Reveman 2007-09-03 Re-write object initialization code to properly handle new object model. David Reveman 2007-08-31 Use compObjectForEach for plugin initialization of window objects. David Reveman 2007-08-31 Add compObjectForEach function. David Reveman 2007-08-31 Rename ObjectCallbackProc to ObjectCallBackProc and add return value so that it is possible interrupt calls to forEachObject functions. David Reveman 2007-08-31 Add forEach functions to object interface. David Reveman 2007-08-31 Add core object type. David Reveman 2007-08-31 Add core object. David Reveman 2007-08-31 Adjust core option functions so they match the prototype used by plugins and use dispatch tables in plugin.c. David Reveman 2007-08-31 Add missing object.c. David Reveman 2007-08-30 Bump ABI versions. David Reveman 2007-08-30 Add plugin interface version number to getCompPluginInfo symbol. This makes sure that only plugins built with a matching plugin interface can be loaded. This version number must be updated every time the plugin interface changes. Each plugin needs to be manually updated to work with a new plugin interface version. David Reveman 2007-08-30 Remove duplicate error message. David Reveman 2007-08-30 Add simple object system, which generalize the privates mechanism and the plugin system. It will allow us share more code between display, screen and window objects. It also makes it possible to properly introduce new object types without changing the plugin interface or breaking the API. David Reveman 2007-08-29 Remove whitespaces. David Reveman 2007-08-29 ABIVERSION -> CORE_ABIVERSION. David Reveman 2007-08-29 Split compiz.h into compiz.h and compiz-core.h. Move all structures and most functions from compiz.h to compiz-core.h. compiz.h provides an API that is stable across releases with the same minor version number. It can be used to create plugins that will run across multiple core ABI versions. compiz-core.h contains all structures and hooks used by the core. A plugin that includes compiz-core.h is responsible for checking the core ABI version when being initialized. Remove deprecated function: compWindowTypeMaskFromStringList David Reveman 2007-08-28 Add COMPIZ_BEGIN|END_DECLS. David Reveman 2007-08-28 Add COMPIZ_BEGIN|END_DECLS. David Reveman 2007-08-28 Add proper preprocessor check to compiz-scale.h. David Reveman 2007-08-28 Add proper preprocessor check to compiz-cube.h. David Reveman 2007-08-28 Rename scale.h to compiz-scale.h. David Reveman 2007-08-28 Rename cube.h to compiz-cube.h. David Reveman 2007-08-28 Clean up. David Reveman 2007-08-28 Use compiz-common.h, move _CompPluginVTable struct to compiz-plugin.h and include it in appropriate source code files. David Reveman 2007-08-28 Install compiz-common.h. David Reveman 2007-08-28 Have the configure script generate a compiz-common.h file. David Reveman 2007-08-28 Remove getVersion function from plugin VTable. David Reveman 2007-08-28 Add core ABI version check to all plugins. Plugins are now resposible for checking core ABI version when being initialized. David Reveman 2007-08-28 Bump cube ABI version. David Reveman 2007-08-28 screenInode -> objectInode. David Reveman 2007-08-28 Minor clean up. David Reveman 2007-08-28 Bump ABI version. David Reveman 2007-08-28 Kill whitespaces. Merge: 92f1692 36575a3 David Reveman 2007-08-28 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: include/compiz.h David Reveman 2007-08-28 Add ABI option to core. David Reveman 2007-08-28 Make sure the core plugin is always loaded. Roland Baer 2007-08-28 realloc with correct size David Reveman 2007-08-28 Adjust metadata to have core plugin loaded by default. David Reveman 2007-08-28 Remove setScreenOption and make sure core plugin is loaded at startup. David Reveman 2007-08-27 Remove getDisplayOptions and setDisplayOption functions. David Reveman 2007-08-27 Hook up core options to core plugin. David Reveman 2007-08-27 Only allow loading of core plugin when trying to load plugin from current directory. David Reveman 2007-08-27 Pass NULL as path when listing plugins in current directory. David Reveman 2007-08-27 Fix typo. David Reveman 2007-08-27 Hook up core loader. Dennis Kasprzyk 2007-08-27 Draw cube caps only once per output, but allow plugin plugins to reset this handling. Fixes switcher with transparent cube. Dennis Kasprzyk 2007-08-27 Disable backface culling only for front-to-back painted transparent cube faces. David Reveman 2007-08-27 Add core plugin loader and core plugin code. Roland Bär 2007-08-27 Added sanity check for screenInode value. Danny Baumann 2007-08-27 Coding style adjustments. Roland Baer 2007-08-16 Storage of XGetVisualInfo() needs to be free()d Roland Baer 2007-08-17 Return value of XGetKeyboardMapping() has to be XFree()d, not to be ignored Danny Baumann 2007-08-27 Don't save last window state in CompWindow structure. Instead, pass the last state to the state change notification function. Danny Baumann 2007-08-27 Never modify w->state outside changeWindowState function. Danny Baumann 2007-08-24 Add edge action for "Show desktop". David Reveman 2007-08-23 Use new core utility functions in rotate plugin. David Reveman 2007-08-23 Add utility function getPluginDisplayIndex. David Reveman 2007-08-23 Add utility function checkPluginABI. Kristian Høgsberg 2007-08-14 Add run_command to keyboard shortcut list. Kristian Høgsberg 2007-08-21 Require 'compiz' not @COMPIZ_REQUIRES@ in plugin pkg-config files. Kristian Høgsberg 2007-08-21 Set SM restart style to SmRestartIfRunning on exit. Kristian Høgsberg 2007-08-14 Add back --with-default-plugins option. David Reveman 2007-08-22 Add getPluginABI utility function. David Reveman 2007-08-20 Post release version increment. David Reveman 2007-08-20 Add NEWS entry and bump version for 0.5.4 release. David Reveman 2007-08-20 Add metadata/kconfig.xml.in to POTFILES.in. David Reveman 2007-08-20 Fix typo. David Reveman 2007-08-20 Fix uninstall-local target. Roland Baer 2007-08-17 Removed effectivly unused stuff in gtk-window-decorator David Reveman 2007-08-19 Don't avoid sync to vblank when we have multiple outputs. David Reveman 2007-08-19 Include DESTDIR properly. David Reveman 2007-08-19 Fix typo. David Reveman 2007-08-19 Add missing metadata file for kconfig plugin. David Reveman 2007-08-19 Track change of schemas_files variable to schema_files. David Reveman 2007-08-19 Use install-data-local and uninstall-local hooks for installing kde config files. Merge: 11761f8 86b82d9 David Reveman 2007-08-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: metadata/rotate.xml.in David Reveman 2007-08-17 Generate entries in kcfg files with unique names and use the key attribute. Danny Baumann 2007-08-16 Fix typos. David Reveman 2007-08-15 Bump ABI version. David Reveman 2007-08-15 Add NULL checks. David Reveman 2007-08-15 GConf plugin re-write. David Reveman 2007-08-15 Add const modifier. David Reveman 2007-08-15 Fix optionTypeToString prototype. David Reveman 2007-08-15 fuseFiniValue -> compFiniOptionValue. David Reveman 2007-08-15 Return an empty string instead of NULL when edge mask is 0. Merge: 3d9be8a 275122e David Reveman 2007-08-15 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-08-15 Add kcfgdir to compiz-kconfig.pc. David Reveman 2007-08-15 Install compiz-kconfig.pc. David Reveman 2007-08-15 Install kcfg files and system-wide configuration file in default kde directories. David Reveman 2007-08-15 Add screen parameter to kcfg files and kconfig style-sheet. David Reveman 2007-08-14 Remove use of kcfg Enum type. David Reveman 2007-08-14 Add kconfig plugin and style-sheets that generate a default system-wide configuration and .kcfg files for each plugin. David Reveman 2007-08-14 Clean up. David Reveman 2007-08-14 Better default colors. David Reveman 2007-08-14 Check action type properly when comparing action values. David Reveman 2007-08-14 Add button action options for all switcher actions. David Reveman 2007-08-14 Button actions should be initialized with CompActionStateInitEdge so that edge events work properly. David Reveman 2007-08-14 Cleanup. David Reveman 2007-08-14 Use compFiniOptionValue in fuse plugin. David Reveman 2007-08-14 Make sure initiate, terminate and state variables in action option values are not changed. David Reveman 2007-08-14 Cleanup. David Reveman 2007-08-14 Free list option values properly. David Reveman 2007-08-14 Remove unused edgeButton variable from action struct. David Reveman 2007-08-14 Remove complex action option handling from fuse plugin. David Reveman 2007-08-14 Remove complex action option handling from dbus plugin. David Reveman 2007-08-14 Remove complex action option handling from ini plugin. David Reveman 2007-08-14 Avoid using binding type when determining if action value is equal to existing action value. David Reveman 2007-08-14 Trigger edge button events properly. David Reveman 2007-08-14 Update parsing of edge metadata. David Reveman 2007-08-14 Update edge option metadata. David Reveman 2007-08-14 Remove complex action option initialization. David Reveman 2007-08-14 Fix edge string parsing. David Reveman 2007-08-13 Print bell action type properly. David Reveman 2007-08-13 Action options should no longer be in the schemas files. David Reveman 2007-08-13 Remove duplicate initialization of option. David Reveman 2007-08-13 Remove complex action option handling from gconf plugin as plain action options are now non-configurable. David Reveman 2007-08-13 Use new action option types in zoom plugin. David Reveman 2007-08-13 Use new action option types in wobbly plugin. David Reveman 2007-08-13 Use new action option types in water plugin. David Reveman 2007-08-13 Use new action option types in switcher plugin. David Reveman 2007-08-13 Use new action option types in screenshot plugin. David Reveman 2007-08-13 Use new action option types in scale plugin. David Reveman 2007-08-13 Use new action option types in rotate plugin. David Reveman 2007-08-13 Use new action option types in resize plugin. David Reveman 2007-08-13 Use new action option types in plane plugin. David Reveman 2007-08-13 Use new action option types in move plugin. David Reveman 2007-08-13 Use new action option types in cube plugin. David Reveman 2007-08-13 Use new action option types in clone plugin. David Reveman 2007-08-13 Use new action option types in blur plugin. David Reveman 2007-08-13 Use new action option types in annotate plugin. David Reveman 2007-08-13 Switch to new action option types for all core options. Most options have been converted to key actions for now but button, edge and bell options that will trigger the same action can easily be added where it makes sense. David Reveman 2007-08-13 Add passive grabs and update event handling to trigger new action option types. David Reveman 2007-08-13 Add isActionOption function. David Reveman 2007-08-13 Handle new option types properly. David Reveman 2007-08-13 Add edge modifiers. Deprecates edge button functionality. David Reveman 2007-08-13 Add bell option, which is just a bell only action option. David Reveman 2007-08-13 Add edge option, which is just a edge only action option. David Reveman 2007-08-13 Add button-binding option, which is just a button-binding only action option. David Reveman 2007-08-13 Add key-binding option, which is just a key-binding only action option. David Reveman 2007-08-13 Default alpha value for color options is 1.0. David Reveman 2007-08-12 Fix event handle matching. This caused inotify plugin to not work at all unless the file watch handle happen to be the same as the inotify handle. David Reveman 2007-08-12 Use equalRange when checking if new value is equal to old value. David Reveman 2007-08-12 Make compInitOptionValue and compFiniOptionValue available to plugins. Danny Baumann 2007-08-09 Fix possible memleaks. Danny Baumann 2007-08-09 Formatting fixes. Danny Baumann 2007-08-09 Remove trailing whitespace. Roland Baer 2007-07-27 Added compFindOption return checks David Reveman 2007-08-09 Fix many function declarations that were missing the 'const' modifier. David Reveman 2007-08-09 Cleanup. David Reveman 2007-08-09 Rearrange some headers to avoid compile issues on solaris. David Reveman 2007-08-09 Avoid use of strcasestr and case insensitive matching of modifier strings. David Reveman 2007-08-08 Include proper compiler flags and link libdecoration to required libraries. David Reveman 2007-08-07 This should be taken care of by unhookWindowFromScreen. David Reveman 2007-08-07 Reduce code by using findWindowAtScreen in findTopLevelWindowAtScreen. David Reveman 2007-08-07 Avoid using lastFoundWindow in findWindowAtDisplay. David Reveman 2007-08-07 Usage of lastFoundWindow in findTopLevelWindowAtDisplay is broken. Preferred is to just have findTopLevelWindowAtDisplay call findTopLevelWindowAtScreen for each screen until a matching window is found. David Reveman 2007-08-07 Revert "Select for focus change events on frame windows." This reverts commit 55d3ca1913af4a76973804e29eb21ed62a21691c. David Reveman 2007-08-07 Select for focus change events on frame windows. David Reveman 2007-08-07 Add CompNoMask to REAL_MOD_MASK. REAL_MOD_MASK is used determine what bits of the modifier state that should match for an action to be triggered. Virtual modifiers without real modifiers assigned to them will use CompNoMask as real modifier. Hence, the CompNoMask bit must also be used to determine if the modifier state matches and should be considered a real modifier. Thanks to Andy Hefner. David Reveman 2007-08-06 Add XCB connection handle to CompDisplay. David Reveman 2007-08-06 Require x11-xcb. David Reveman 2007-08-06 Remove whitespaces. David Reveman 2007-08-03 Fix typo. David Reveman 2007-08-03 Post release version increment. David Reveman 2007-08-03 Add NEWS entry and bump version for 0.5.2 release. David Reveman 2007-08-03 make update-po David Reveman 2007-08-03 Add release documentation and makefile rules that will ease the release process (most of it stolen from cairo). David Reveman 2007-08-03 Remove .cvsignore files. David Reveman 2007-08-03 Remove whitespaces. David Reveman 2007-08-02 Fix default value of images option. David Reveman 2007-08-02 Fix initialization order of mClientId and mFrame. David Reveman 2007-08-02 Shut up compiler. David Reveman 2007-08-02 Avoid bad use of asprintf in a few cases. David Reveman 2007-08-02 Use gtk_style_attach properly in update_style. David Reveman 2007-08-02 Set decor object to NULL when closing a window and make sure that we're not using a closed in active_window_changed. David Reveman 2007-08-02 Add use of more compiler warnings. Roland Baer 2007-08-02 Various NULL checks Roland Baer 2007-08-01 removes an unused var Roland Baer 2007-08-01 Removed unused code Roland Baer 2007-08-01 Removed unused vars David Reveman 2007-07-31 Add po/.intltool-merge-cache and po/stamp-it to DISTCLEANFILES so that 'make distcheck' will pass. David Reveman 2007-07-31 Add intltool-extract, intltool-merge and intltool-update to EXTRA_DIST. David Reveman 2007-07-31 Enable SVG plugin by default. David Reveman 2007-07-31 Shut up compiler. David Reveman 2007-07-31 Add missing NULL check. Roland Baer 2007-07-31 Removed useless test David Reveman 2007-07-30 Replace move argument that was always true with an allowDecorations argument that can be used to remove any window decorations from decorFiniWindow. David Reveman 2007-07-30 move argument to decorWindowUpdate should always be true. David Reveman 2007-07-30 Have focusDefaultWindow try to focus the window under the pointer when click-to-focus isn't used. David Reveman 2007-07-30 Revert "First attempt to focus the window under the pointer if 'click to focus' is not enabled." This reverts commit bdb91a3bbc0419bba228f904804a4f74b84c2da7. David Reveman 2007-07-30 Make sure some window is focused properly at start up. David Reveman 2007-07-30 Clean up. David Reveman 2007-07-29 Restore window geometry of fullscreen and maximized windows before exiting. David Reveman 2007-07-29 Use configureXWindow to move the window as moveWindow function is broken and will be deprecated soon. David Reveman 2007-07-29 Initialize placed variable for initially mapped windows in addWindow instead of addScreen. David Reveman 2007-07-29 Use configureXWindow to move the window as moveWindow function is broken and will be deprecated soon. David Reveman 2007-07-29 Map hidden windows before exiting. David Reveman 2007-07-29 Shift client window position when adding and changing decorations. David Reveman 2007-07-29 Don't try to bind window again if it failed previously. David Reveman 2007-07-29 We can't unset the damaged flag just because the bind failed as it can result in damage tracking of decorations to get out of sync. David Reveman 2007-07-29 Make sure initially mapped windows are considered mapped and after that unmap and make sure state hint reflects the current state of the window in case supposed to be iconifyied. David Reveman 2007-07-29 Initialize iconifyied windows properly. David Reveman 2007-07-28 Avoid window that we're trying to restack, restackWindowBelow can only be used to lower windows otherwise. Danny Baumann 2007-07-28 Revert "Set 'cancel' flag if the resize geometry at termination matches the geometry at initiation." A better fix for the underlying problem has been implemented in commit 3cc932c2518be2d8b05f9b7ee7b0401d3113291c. This reverts commit 624b46a77bc9e3b1220023021c2c4f9cc0bddda2. David Reveman 2007-07-27 Fix type of path argument. David Reveman 2007-07-27 Fix type of name argument. David Reveman 2007-07-27 Make sure we damage screen correctly when done resizing. Merge: 651f5d5 2784e15 David Reveman 2007-07-27 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-07-27 Skip windows that we should avoid stacking relative to. Danny Baumann 2007-07-27 Fix descriptions. David Reveman 2007-07-26 Make sure restackWindowBelow is able to put a window at the bottom of the stack and that it never stacks a window above the specified sibling. Guillaume Seguin 2007-07-26 Add raise_on_rotate option. David Reveman 2007-07-25 Add lazy positioning option to move plugin and a bad implementation that will avoid a performance regression in upcoming release. The option should stay but the implementation should be replaced with a proper solution asap. David Reveman 2007-07-25 Get red/blue color components right. David Reveman 2007-07-24 Check for memory errors. David Reveman 2007-07-24 Clean up. David Reveman 2007-07-24 Build png plugin properly. David Reveman 2007-07-24 Make server-side RANDR support optional. Daniel Nylander 2007-07-24 Update swedish translation. Roland Baer 2007-07-19 Unsigned less than zero Roland Baer 2007-07-19 Null checks to prevent crashs Dennis Kasprzyk 2007-07-19 Name function correctly: clonePaintScreen -> clonePaintOutput Dennis Kasprzyk 2007-07-19 Work correctly with fullscreeOutput CompOutput. Roland Baer 2007-07-18 Removed unused variables Dennis Kasprzyk 2007-07-16 Revert of commit "Relation of type 'after' is unnecessary information when cube plugin is a requirement." An plugin requirement doesn't imply an "after" loading rule. David Reveman 2007-07-16 Fix parsing of screen edge metadata. David Reveman 2007-07-12 Remove features and dependencies from plugin VTable. David Reveman 2007-07-12 Remove plugin dependency checking from core. David Reveman 2007-07-12 Relation of type 'after' is unnecessary information when cube plugin is a requirement. David Reveman 2007-07-12 Clean up and indent metadata correctly. David Reveman 2007-07-12 Avoid unnecessary branching. Erkin Bahceci 2007-07-11 Fix timing of scale activate event ending. Danny Baumann 2007-07-12 Added case insensitive matching. Patrick Niklaus 2007-07-11 Add features to image plugin metadata. Merge: a5fbfa5 ec32ff5 David Reveman 2007-07-11 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Roland Bar 2007-07-11 Remove unused code Roland Bar 2007-07-11 use of already free'd pointers David Reveman 2007-07-11 Clean up and avoid some unnecessary heap allocation in addDataOpToFunctionData and addBlendOpToFunctionData. Danny Baumann 2007-07-11 Added support for UTF-8 encoded window title matching. Danny Baumann 2007-07-11 Trigger pointer based resize also if the resizing originally wasn't initiated by the mouse and determine the resize direction in that case by the pointer movement direction. This also fixes window menu initiated resizing. David Reveman 2007-07-10 More clean up. Setting d to compDisplays when it's NULL doesn't make sense. Always using the default logMessage function when d parameter is NULL is more appropriate if it should be allowed to call compLogMessage with d parameter set to NULL at all. David Reveman 2007-07-10 Clean up. David Reveman 2007-07-10 Have logLevelToString return a constant string and not a buffer that needs to be freed. Fixes logging memory leak. David Reveman 2007-07-10 Make sure logMessage function is initialized before compLogMessage is called. Dennis Kasprzyk 2007-07-11 Add input extents when placing window in "smart" mode to get correct position. David Reveman 2007-07-10 Fix typo. Dennis Kasprzyk 2007-07-11 Use correct input extents in "smart" mode calculation. David Reveman 2007-07-10 Update video interface by adding source dimensions. David Reveman 2007-07-10 Fix so that escape can be used again to terminate "snap top"-functionality. David Reveman 2007-07-10 Clean up. David Reveman 2007-07-10 Clean up. David Reveman 2007-07-10 Select for Expose events on output window. Dennis Kasprzyk 2007-07-10 Use fullscreen output in unfold cube mode. Dennis Kasprzyk 2007-07-09 Define template parameters correctly. Dennis Kasprzyk 2007-07-09 Handle translated option info as variable. Dennis Kasprzyk 2007-07-09 Translate int descriptions. Danny Baumann 2007-07-09 Fix missing damage at resize initiation. This caused the selection rectangle not being drawn properly when initiating resizing via keyboard. Danny Baumann 2007-07-06 Added action option that can be used for triggering a relayout of the slots. Danny Baumann 2007-07-06 Added wrap-able function that can be used for preventing scaled window drawing and adjusting paint attributes for scaled window drawing. Dennis Kasprzyk 2007-07-06 Added string formating to fragment functions. Dennis Kasprzyk 2007-06-25 Switch to fullscreen mode only if multiple outputs are detected. Dennis Kasprzyk 2007-06-25 Don't disort the screen if another plugin changes the output. Dennis Kasprzyk 2007-06-25 Switch to one output mode if cube uses "One big cube". Dennis Kasprzyk 2007-06-25 Added option to change multi output behavior. Merge: c8f36d4 7fae3ae David Reveman 2007-07-05 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-07-05 Keep point under cursor fixed when zooming in. Roland Bar 2007-07-05 Fix memory leak Roland Bar 2007-07-05 remove NULL check Roland Bar 2007-07-05 desktop is unsigned, always >= 0. David Reveman 2007-07-05 Remove unnecessary NULL check. Erkin Bahceci 2007-07-03 Add feature "windowanimations" to Minimize metadata. Dennis Kasprzyk 2007-07-05 Initialize edge button properly from metadata. Dennis Kasprzyk 2007-07-05 Edge button actions depend on CompActionStateInitEdge state. Danny Baumann 2007-07-04 Update window attributes at move termination. Danny Baumann 2007-07-04 Focus default window after ending show desktop mode. Danny Baumann 2007-07-03 Correctly add input extents to window width and height. Dennis Kasprzyk 2007-07-02 Handle window input extents correclty in smart mode. Dennis Kasprzyk 2007-07-02 Fixed smart window placing mode for multimonitor configurations. Dennis Kasprzyk 2007-07-02 Don't modify stencil buffer for not blured client regions. Danny Baumann 2007-06-29 Improve description. Merge: 624b46a 408fffe Danny Baumann 2007-06-27 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-27 Set 'cancel' flag if the resize geometry at termination matches the geometry at initiation. If we don't do this, the resize paint rectangle won't be damaged properly. Merge: efb5671 39cf1c7 Mike Dransfield 2007-06-27 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-06-27 This patch breaks --disable-gconf Revert "Move AM_GCONF_SOURCE_2 in to gconf conditional" This reverts commit 85a622ab0001821fbdb0136605fec219601dae01. Erkin Bahceci 2007-06-26 Scale z by 1 instead of 0. Bellegarde Cedric 2007-06-27 Fix placement mode option. Dennis Kasprzyk 2007-06-26 Fixed orientation calculation for "inside cube" mode. Roland Bar 2007-06-22 Fix memory leaks and remove dead code David Reveman 2007-06-21 Adjust libwnck backward compatibility so that the current code matches the current libwnck API. David Reveman 2007-06-21 WNCK_WINDOW_MODAL_DIALOG doesn't exist in libwnck 2.19.4 and later. David Reveman 2007-06-21 Use consistent preprocessor macros. Merge: a3e4204 37d0dd7 David Reveman 2007-06-21 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-06-21 Fix memory leak. David Reveman 2007-06-21 Fix memory leak. David Reveman 2007-06-21 Fix memory leak. Danny Baumann 2007-06-21 Disable cube transparency by default. Danny Baumann 2007-06-21 Fix 'Transparency on mouse initiated rotation only' option. Merge: a069bda 7f4ef98 Dennis Kasprzyk 2007-06-21 Merge branch 'master' of git+ssh://onestone@git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2007-06-21 Bump cube ABI version. Dennis Kasprzyk 2007-06-21 Combined checkFTB and capDirection into one checkOrientation function. Dennis Kasprzyk 2007-06-21 Added a wrapabble paintInside function to allow plugins to render something inside of the transparent cube. Dennis Kasprzyk 2007-06-21 Separated paintTopBottom into individual paintTop and paintBottom functions. Dennis Kasprzyk 2007-06-21 Made chackFTB wrapable. Dennis Kasprzyk 2007-06-21 Fixed FTB calculation for inside cube mode. Danny Baumann 2007-06-21 Fix minor typo. Danny Baumann 2007-06-21 Remove trailing whitespace. Roi Cohen 2007-06-12 Added option to enable cube transparency only on button binding initiated rotatation. Roi Cohen 2007-06-12 Add cube transparency. Danny Baumann 2007-06-21 Added rotation state. This variable should be set appropriately by plugins rotating the cube. Roi Cohen 2007-06-12 Improve cube paint order calculations. Merge: bcccfc0 bb7e30c Danny Baumann 2007-06-21 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-21 Re-order blur texture painting order to eliminate some Nvidia driver issues. Merge: a2f6b00 4158e16 David Reveman 2007-06-21 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-21 Hide windows on all outputs if all outputs are used for scaling. Merge: 6d1c026 5425a21 Danny Baumann 2007-06-21 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-21 Properly initialize and uninitialize custom match. Dennis Kasprzyk 2007-06-21 Fixed client resize problems with libwnck >= 2.19.4. Merge: fdfb327 4d53420 David Reveman 2007-06-20 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-06-20 Don't allow transients to be stacked above dock windows unless they are dock windows themselves. David Reveman 2007-06-20 libdecoration is now useed by svg plugin. David Reveman 2007-06-20 Add experimental support for svg objects. David Reveman 2007-06-20 Add some basic events that can be used by other plugins to track zoom region. David Reveman 2007-06-20 Do not fall-through if path isn't long enough to be an option message. Dennis Kasprzyk 2007-06-19 Don't ignore the linear filter zoom option. Merge: 85a622a 64fbb40 Robert Carr 2007-06-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Robert Carr 2007-06-17 Move AM_GCONF_SOURCE_2 in to gconf conditional David Reveman 2007-06-15 Set hoveredWindow more properly. David Reveman 2007-06-12 Make sure we free the window private index. Merge: 90ed941 64fbb40 David Reveman 2007-06-12 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2007-06-12 Initialize variables correctly. Dennis Kasprzyk 2007-06-12 Do not zoom when unfolded. Dennis Kasprzyk 2007-06-11 Add int descriptions to long option description. Dennis Kasprzyk 2007-06-11 Removed string description handling. Dennis Kasprzyk 2007-06-11 Ignore read_only options in schema creation. Dennis Kasprzyk 2007-06-11 Use texture matrix in skydome (Fixes GL_TEXTURE_RECTANGLE skydome images). Dennis Kasprzyk 2007-06-11 Initialize skydome texture matrix. Dennis Kasprzyk 2007-06-11 Use cs->invert directly. Dennis Kasprzyk 2007-06-11 Don't zoom in inside cube mode. Dennis Kasprzyk 2007-06-11 Added zoom out for mouse rotation. Dennis Kasprzyk 2007-06-11 Added zoom out for viewport change rotation. Dennis Kasprzyk 2007-06-11 Added metadata for rotate zoom option. Dennis Kasprzyk 2007-06-11 Added basic zoom out support to rotate. Dennis Kasprzyk 2007-06-11 Allow that cube caps get painted multiple times. Dennis Kasprzyk 2007-06-11 Fixed float rounding errors during option setting Danny Baumann 2007-06-10 Include severity level into default log message printout. Merge: 91b3ab8 9720213 Mike Dransfield 2007-06-09 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-06-09 Use fleur cursor for move. Patch from Treviño Merge: 8f9f119 97cefbc Danny Baumann 2007-06-09 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-09 Terminate scale mode when the last scaled window was closed. Merge: 714831c f5aae26 Mike Dransfield 2007-06-09 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-06-09 Use consistent variable naming conventions David Reveman 2007-06-08 Use pointerX and pointerY when initializing deltas. Merge: e1ad529 f5aae26 David Reveman 2007-06-08 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-08 Added compiz event indicating that switcher is active. While other plugins can also hook into the scale plugin to get this kind of information, that might be unwanted sometimes (e.g. to not introduce plugin dependencies). Because of that, it makes sense to have a inactive/active indicator independent of the hook interface. Mike Dransfield 2007-06-08 Tidy up Mike Dransfield 2007-06-08 Re-write options if there are new ones in the plugin Merge: 672ca9b 7bdb04d David Reveman 2007-06-07 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-07 Whitespace improvements. Danny Baumann 2007-06-07 Added hoveredWindow variable to ScaleDisplay that always indicates the window which is hovered with the pointer. Danny Baumann 2007-06-07 Change default keybinding for 'Initiate scale mode' to Shift+Alt+Up to avoid conflicts with the plane and wall plugins. Danny Baumann 2007-06-07 Added an option to select scale's behaviour if multiple outputs are used. Selections are 'Scale on current output' (previous behaviour) and 'Scale on all outputs'. David Reveman 2007-06-06 Use fleur cursor instead of plus cursor when moving windows. Mike Dransfield 2007-06-06 Remove string restrictions Merge: 2bc24b5 8d38c0d Mike Dransfield 2007-06-06 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-06-06 Remove the N_ macro and windowTypeString Danny Baumann 2007-06-06 Rename scale's displayPrivateIndex to scaleDisplayPrivateIndex so that wrapping plugins can have their own displayPrivateIndex. David Reveman 2007-06-05 Allow plugins to hook into scalePaintDecoration. David Reveman 2007-06-05 Move scale icon rendering into function. David Reveman 2007-06-05 Clean up. David Reveman 2007-06-05 Clean up. David Reveman 2007-06-05 Allow plugins to hook into layoutSlotsAndAssignWindows. David Reveman 2007-06-05 Create layoutSlotsAndAssignWindows function. David Reveman 2007-06-05 Add ABI and INDEX options to scale plugin. David Reveman 2007-06-05 Add pkg-config file for scale plugin. David Reveman 2007-06-05 Add scale.h. David Reveman 2007-06-05 Terminated scale mode when edge is triggered while already in scale mode. David Reveman 2007-06-05 Clean up. David Reveman 2007-06-05 Minor cleanup. Quinn Storm 2007-06-02 add option to turn off scale behaviour where a click on the desktop shows the desktop Danny Baumann 2007-06-05 Fix option type for int description options. Danny Baumann 2007-06-05 Convert usage of restricted string options to int descriptions in wobbly plugin. Danny Baumann 2007-06-05 Convert usage of restricted string options to int descriptions in scale plugin. Kristian Lyngstol 2007-06-04 Stop processing a keypress after a plugin has handled it. Dennis Kasprzyk 2007-06-04 Indention fix. Dennis Kasprzyk 2007-06-04 Use output->id. Dennis Kasprzyk 2007-06-04 Added "after decoration" rule to blur metadata to make decoration blur work correctly Mike Dransfield 2007-06-03 Use ints for place modes Danny Baumann 2007-06-02 The fullscreen output is not a real screen output, reflect that in its id. Merge: 857776f 0e01bec David Reveman 2007-06-01 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-06-01 Bump ABIVERSION. David Reveman 2007-06-01 Use new walk interface. David Reveman 2007-06-01 Add CompWalker interface. Merge: fe799b5 22481bc Mike Dransfield 2007-06-01 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-06-01 Code formatting David Reveman 2007-06-01 Bump ABIVERSION. David Reveman 2007-06-01 Move lastViewport into CompScreen struct as it's GL context dependent. David Reveman 2007-06-01 Clean up last viewport check. David Reveman 2007-06-01 Use output id. David Reveman 2007-06-01 Use output id. David Reveman 2007-06-01 Add output id. The id is always set to the output's index in the screen outputs list. The id must be set to ~0 if the output is not a real screen output. David Reveman 2007-05-31 Track output changes. Merge: b2f47aa 97a4a6c David Reveman 2007-05-31 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Merge: d3026e2 0a1e769 Dennis Kasprzyk 2007-06-01 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: include/compiz.h plugins/zoom.c Merge: 5ca24d1 0a1e769 David Reveman 2007-05-31 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-05-31 Add extensible logging framework Merge: 436c0e9 de76d33 David Reveman 2007-05-31 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2007-05-31 Do not UNWRAP a not wrapped function. David Reveman 2007-05-31 Remove whitespace. Dennis Kasprzyk 2007-05-31 Added a fullscreenOutput variable to CompScreen. Dennis Kasprzyk 2007-05-31 Handle glViewport change correctly. Dennis Kasprzyk 2007-05-31 Applied temporary changes to cube to make it work with lastest core changes. Dennis Kasprzyk 2007-05-31 Applied temporary changes to clone to make it work with lastest core changes. Dennis Kasprzyk 2007-05-31 Use new paintScreen function in screenshot. David Reveman 2007-05-31 Fix byte order check in imageBufferToTexture. Dennis Kasprzyk 2007-05-31 Applied lastest core changes to blur. Dennis Kasprzyk 2007-05-31 Applied lastest core changes to annotate, plane, resize, screenshot and switcher. Dennis Kasprzyk 2007-05-31 Applied lastest core changes to wobbly, minimize, rotate and scale. Dennis Kasprzyk 2007-05-31 Bump ABI version Dennis Kasprzyk 2007-05-31 Added a new wrapable paintScreen function to allow plugins to maniplulate output device dependent painting. Dennis Kasprzyk 2007-05-31 Renamed paint(Transformed)Screen to paint(Transfomed)Output. for FILE in `find . -name "*.[ch]"`; do BASE=`basename $FILE` cat $FILE | sed -e 's/aintScreen/aintOutput/g' -e 's/aintTransformedScreen/aintTransformedOutput/g' > /tmp/$BASE cat /tmp/$BASE | sed -e 's/parePaintOutput/parePaintScreen/g' -e 's/onePaintOutput/onePaintScreen/g' > $FILE rm /tmp/$BASE done David Reveman 2007-05-31 Clean up. David Reveman 2007-05-31 Allow modifier only bindings. David Reveman 2007-05-31 Clean up. David Reveman 2007-05-30 Set cs->bg to NULL. David Reveman 2007-05-30 Initialize pw and ph correctly. David Reveman 2007-05-29 Add pan support. David Reveman 2007-05-29 Remove zoom options that are no longer used. David Reveman 2007-05-29 Replace the existing zoom functionality with some more useful rectangle zoom functionality. Merge: 14da415 7db43c9 David Reveman 2007-05-24 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-24 Make it possible to hook into the top/bottom cube face drawing functionality. Mike Dransfield 2007-05-24 Check for supported ABI earlier and do not try to read any information which would cause a crash if unsupported Mike Dransfield 2007-05-24 Load plugins if not loaded to get plugin metadata Merge: 7da52b6 3650c8e Mike Dransfield 2007-05-24 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-05-24 Use correct variable naming conventions Danny Baumann 2007-05-24 Notify other clients of window resizing. To do that, we emit client messages containing the current resize geometry. Additionally, we set a window property on the resized window containing this information. David Reveman 2007-05-23 Move top/bottom cube face painting into function. David Reveman 2007-05-23 Make it possible to hook into the clear target output functionality in the cube plugin. David Reveman 2007-05-23 Move clear output code into function. David Reveman 2007-05-23 Remove whitespace. David Reveman 2007-05-23 Remove whitespaces. David Reveman 2007-05-23 Add GetRotationProc to cube plugin and have rotate plugin use it to apply the cube rotation. David Reveman 2007-05-23 Allow rotate plugin to hook into cube plugin. David Reveman 2007-05-23 Make cube ABI version and display private index available through read-only options. David Reveman 2007-05-23 There's no longer an optional svg feature. David Reveman 2007-05-23 Add compiz-cube pkg-config file. David Reveman 2007-05-23 Add cube.h. David Reveman 2007-05-23 displayPrivateIndex -> cubeDisplayPrivateIndex. David Reveman 2007-05-23 Only include the headers we need. David Reveman 2007-05-23 Remove SVG support from cube plugin. David Reveman 2007-05-22 Add a match option for each resize mode. They can be used to force a specific resize mode for certain windows. David Reveman 2007-05-22 Add actions for each resize mode. David Reveman 2007-05-22 Remove whitespaces. David Reveman 2007-05-21 Wrap windowAddNotify function where necessary, David Reveman 2007-05-21 Add WindowAddNotifyProc, which is required to initialize some plugins correctly. Mike Dransfield 2007-05-21 Allow core actions on edges where it makes sense Mike Dransfield 2007-05-21 Revert "Make minimize, maximize, unmaximize and close window actions" This reverts commit 1580a740c9871114e52c7322eefdd11b30e59b25. Mike Dransfield 2007-05-21 Revert "Use active window rather than the action window for scale_group" This reverts commit 7a7109529074bf06f0dedeeb3475b0d79e9c152b. Mike Dransfield 2007-05-21 Add event_window to list of options passed to an action initiate function. This contains the underlying event window. Window will now contain the active window if an action is initiated with edge + edgebutton Merge: fb75078 fa8a12e Mike Dransfield 2007-05-21 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-21 Handle hsize and vsize of 0 properly in moveWindowToViewportPosition. David Reveman 2007-05-21 Fix initialization of color option values. Alpha component should be 1 by default. David Reveman 2007-05-21 Revert "Don't make fill colors entirely transparent by default." This reverts commit 4a2e6ec5acb11800fd130e97ff91ed3a196f1261. Merge: 1bf8f93 4a2e6ec David Reveman 2007-05-20 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-20 Make sure background images are always mapped to cube faces. David Reveman 2007-05-20 Send glib notify after initiating display. David Reveman 2007-05-20 Make it possible to notify glib plugin about when new sources are added to the main loop. Danny Baumann 2007-05-20 Don't make fill colors entirely transparent by default. Merge: 0b2ea93 512dcfa Danny Baumann 2007-05-20 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-05-20 Track the first grabbed window, not the last one. Merge: a50d2f9 1013d0a David Reveman 2007-05-18 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-18 Remove timeout based iteration of GLib main loop and instead require glib plugin. David Reveman 2007-05-18 Add glib plugin. This plugin properly integrates the GLib main loop and makes sure that any plugins that use the default GLib main loop will be dispatched efficiently. David Reveman 2007-05-18 Add compWatchFdEvents function. Danny Baumann 2007-05-18 Fix typo. Danny Baumann 2007-05-18 Don't issue ungrab notify before server side processing is finished. David Reveman 2007-05-17 Turn the texture filter option into an integer option. Merge: f9d53e8 d11eb40 David Reveman 2007-05-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-17 Turn the mode option into an integer option. David Reveman 2007-05-17 Turn the filter option into an integer option. David Reveman 2007-05-17 Add macros that make it easier to use integer options as selections. Merge: 1e1a442 9c1902c Mike Dransfield 2007-05-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-05-17 Handle cases where there is no trailing newline in the option file Merge: 54649b7 bedcf71 David Reveman 2007-05-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-17 Add border_color and fill_color options. David Reveman 2007-05-17 Cleanup. David Reveman 2007-05-17 Cleanup. David Reveman 2007-05-17 Cleanup. David Reveman 2007-05-17 Add stretch resize mode. David Reveman 2007-05-17 Add rectangle resize mode. David Reveman 2007-05-17 Add outline resize mode. David Reveman 2007-05-16 Remove unnecessary code. David Reveman 2007-05-16 Make it possible to end resize when resize notify is received. David Reveman 2007-05-16 No need to check if only position changes as we'll never change the position without changing the size. David Reveman 2007-05-16 Update size even when pointerDx and pointerDy are 0. David Reveman 2007-05-16 Adjust position in motion handler. David Reveman 2007-05-16 Replace width, height with geometry and constrain window size in motion handler. David Reveman 2007-05-16 Remove ucWidth, ucHeight and use pointerDx, pointerDy instead. David Reveman 2007-05-16 Resize plugin should always use the server side window geometry. David Reveman 2007-05-16 Replace savedAttrib with savedGeometry rectangle. Dennis Kasprzyk 2007-05-16 Added dependency rules to blur metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to cube metadata David Reveman 2007-05-16 Add pointerDx and pointerDy. Dennis Kasprzyk 2007-05-16 Added dependency rules to decorations metadata David Reveman 2007-05-16 Track changes to constrainNewWindowSize. Dennis Kasprzyk 2007-05-16 Added dependency rules to fade metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to gconf metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to minimize metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to plane metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to rotate metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to water metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to wobbly metadata David Reveman 2007-05-16 Remove whitespaces. Danny Baumann 2007-05-16 Make constrainNewWindowSize return TRUE whenever constraining was applied. Mike Dransfield 2007-05-16 Make minimize, maximize, unmaximize and close window actions use the active window Merge: 95031b0 1e5ca8a Mike Dransfield 2007-05-16 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-15 Fix next/prev slide bindings in cube plugin. David Reveman 2007-05-15 Don't call initDisplay in initPluginForDisplay and don't call initScreen in initPluginForScreen as it breaks wrapping of those functions completely. Merge: 65f0ddb f647b95 David Reveman 2007-05-15 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-15 Fix size hint calculations. If a base size is not provided, the minimum size is to be used in its place and vice versa. Merge: 7a71095 5dba889 Mike Dransfield 2007-05-15 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-05-15 Use active window rather than the action window for scale_group and rotate with window options David Reveman 2007-05-15 Disable call to XFixesHideCursor until the software cursor code is actually used. Travis Watkins 2007-05-14 Check that xsltproc binary is present. David Reveman 2007-05-14 Make minimum rain delay 1. David Reveman 2007-05-14 Make sure key and button are not NULL. Erkin Bahceci 2007-05-13 Center title wave starting y (was 1/4 below). Erkin Bahceci 2007-05-13 Disable textures and texture targets properly. Erkin Bahceci 2007-05-12 Slightly speed up Water by replacing a SUB-MUL pair with MAD. David Reveman 2007-05-14 Require libxslt. Mike Dransfield 2007-05-13 Typo Mike Dransfield 2007-05-12 Send a blank string if shortDesc or longDesc are NULL David Reveman 2007-05-11 Add missing DISTCLEANFILES. David Reveman 2007-05-11 Fix installation of compiz.desktop and key-binding files. David Reveman 2007-05-11 schemas.xslt is located in the source directory. Merge: 92e6e2f 9a4705c David Reveman 2007-05-11 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Merge: 0609c16 48ddb2e Danny Baumann 2007-05-11 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-05-11 Fix typo. David Reveman 2007-05-10 Have the adjust image option behave as when it was previously turned off and make the default behavior keep the image oriented the same all the time. Merge: f527385 48ddb2e Mike Dransfield 2007-05-10 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-08 Add schema_files to EXTRA_DIST. David Reveman 2007-05-08 Fix typo. David Reveman 2007-05-08 Parse --replace option properly. David Reveman 2007-05-08 Fix typo. David Reveman 2007-05-08 Distribute schema files. David Reveman 2007-05-08 Add schemas.xslt to EXTRA_DIST. David Reveman 2007-05-07 Update po files. David Reveman 2007-05-07 Update POTFILES.in. David Reveman 2007-05-07 Update plane plugin to use new metadata system. Mike Dransfield 2007-05-08 Update ini to use metadata David Reveman 2007-05-06 Make freedesktop image default for top face. David Reveman 2007-05-06 Fix typo. David Reveman 2007-05-06 Remove getOuterRectOfWindow function from core. David Reveman 2007-05-06 Don't use getOuterRectOfWindow from core because it returns the visible geometry for a window, which doesn't include pending configure requests and those are important when placing windows. David Reveman 2007-05-04 Install stylesheet and compiz-gconf.pc. David Reveman 2007-05-04 Use compiz- prefix for all schema files. David Reveman 2007-05-04 Rename core metadata file to core.xml instead of compiz.xml. Merge: be66a46 d9bd3ba Mike Dransfield 2007-05-04 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-04 Cleanup. David Reveman 2007-05-04 Set type hint on switcher window properly. David Reveman 2007-05-04 Cleanup. Mike Dransfield 2007-05-04 Added comment about otherScreenGrabExist Danny Baumann 2007-05-04 First attempt to focus the window under the pointer if 'click to focus' is not enabled. If there is no such window, still focus the last active window. David Reveman 2007-05-03 Minor fix to have new schemas match old schemas. David Reveman 2007-05-03 Add passive_grab tag to snap action. David Reveman 2007-05-03 Update po files. David Reveman 2007-05-03 We're not using asprintf anymore. David Reveman 2007-05-03 Remove option descriptions from CompOption structure. David Reveman 2007-05-03 Remove plugin descriptions from VTable. David Reveman 2007-05-03 Remove gconf-dump plugin and old schema generation system. David Reveman 2007-05-03 Create gconf schemas from metadata files using XSLT stylesheet created by Dennis Kasprzyk. David Reveman 2007-05-03 Remove unnecessary variables. David Reveman 2007-05-03 Remove unnecessary variables. David Reveman 2007-05-03 Remove unnecessary variables. David Reveman 2007-05-03 Remove unnecessary variables. David Reveman 2007-05-03 Remove unnecessary variables. David Reveman 2007-05-03 Remove unnecessary variables. David Reveman 2007-05-03 Cleanup. David Reveman 2007-05-03 Cleanup. David Reveman 2007-05-03 Remove unnecessary variable. David Reveman 2007-05-03 More cleanup. David Reveman 2007-05-03 Cleanup. David Reveman 2007-05-03 Remove unnecessary checks. David Reveman 2007-05-03 Cleanup. David Reveman 2007-05-03 Cleanup. David Reveman 2007-05-03 Cleanup. David Reveman 2007-05-03 Remove trailing whitespaces. David Reveman 2007-05-03 Remove trailing whitespaces. David Reveman 2007-05-03 Remove trailing whitespace. Merge: dab181f b68ae0e David Reveman 2007-05-03 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: metadata/Makefile.am Merge: 851a217 9743dc7 Danny Baumann 2007-05-03 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-05-03 Fix some minor metadata errors. Merge: e3c0857 9743dc7 Mike Dransfield 2007-05-03 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Merge: 3e1ff3b a6df2f4 Mike Dransfield 2007-05-03 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-05-03 If event->len is 0 then send NULL instead of event->name David Reveman 2007-05-03 Update rotate plugin to use new metadata system. Merge: ba58439 5ac36f2 Danny Baumann 2007-05-03 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-05-03 Update scale plugin to use new metadata system. Dennis Kasprzyk 2007-05-03 Metadata of the fuse plugin has to be fs.xml not fuse.xml Danny Baumann 2007-05-03 Update screenshot plugin to use new metadata system. Danny Baumann 2007-05-03 Update svg plugin to use new metadata system. Danny Baumann 2007-05-03 Update switcher plguin to use new metadata system. Danny Baumann 2007-05-03 Make all option info structures const. Danny Baumann 2007-05-03 Fix typo. Danny Baumann 2007-05-03 Update video plugin to use new metadata system. Danny Baumann 2007-05-03 Update water plugin to use new metadata system. Danny Baumann 2007-05-03 Update wobbly plugin to use new metadata system. Danny Baumann 2007-05-03 Update zoom plugin to use new metadata system. David Reveman 2007-05-02 Have plugins update list of match options manually until we have a solution for automatic updates of new list items. David Reveman 2007-05-02 Update regex plugin to use new metadata system. David Reveman 2007-05-02 Remove trailing whitespace. David Reveman 2007-05-02 Remove trailing whitespace. David Reveman 2007-05-02 Update png plugin to use new metadata system. David Reveman 2007-05-02 Fix metadata description for minimize plugin. David Reveman 2007-05-02 Update place plugin to use new metadata system. David Reveman 2007-05-02 Update move plugin to use new metadata system. David Reveman 2007-05-02 Add missing calls to compAddMetadataFromFile. David Reveman 2007-05-02 Update minimize plugin to use new metadata system. David Reveman 2007-05-02 Update inotify plugin to use new metadata system. David Reveman 2007-05-02 Update gconf plugin to use new metadata system. David Reveman 2007-05-02 Update fuse plugin to use new metadata system. Merge: ba588c7 da84dad David Reveman 2007-05-02 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-02 Update fade plugin to use new metadata system. David Reveman 2007-05-02 Startup sequence workspace is only valid if it's greater or equal to 0. Mike Dransfield 2007-05-02 Code formatting and variable naming Mike Dransfield 2007-05-02 Code formatting Mike Dransfield 2007-05-02 Remove trailing whitespace Erkin Bahceci 2007-05-01 Add override_redirect matching support. David Reveman 2007-05-01 Only allow position to wrap around if virtual desktop dimension is greater than screen dimension. David Reveman 2007-05-01 Add metadata file for dbus plugin. David Reveman 2007-05-01 Update decoration plugin to use new metadata system. David Reveman 2007-05-01 Update dbus plugin to use new metadata system. David Reveman 2007-04-30 Add proper installation of custom gnome key-bindings. Merge: 4bd5286 572f759 David Reveman 2007-04-30 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-30 Update clube plugin to use new metadata system. David Reveman 2007-04-30 Check for passive_grab element when initializing action state. Merge: 82ab3b0 572f759 Mike Dransfield 2007-04-29 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-29 Change CompAction private to be a CompPrivate Merge: 5eb33b7 e49fbce Mike Dransfield 2007-04-29 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-27 Update clone plugin to use new metadata system. David Reveman 2007-04-27 Check if libwnck version is new enough to support ABOVE action. David Reveman 2007-04-25 Clean up. David Reveman 2007-04-25 Update blur plugin to use new metadata system. David Reveman 2007-04-25 Remove unnecessary call to addScreenAction. David Reveman 2007-04-25 Add missing call to compFiniDisplayOptions. Dennis Kasprzyk 2007-04-25 Moved private pointer variable to the CompAction struct Mike Dransfield 2007-04-25 Fix typo in function name Merge: 1b0ae38 7f518da Robert Carr 2007-04-25 Merge branch 'master' of git+ssh://racarr@git.freedesktop.org/git/xorg/app/compiz Robert Carr 2007-04-25 Add a priv entry to CompAction. For a use case see: compiz-scheme. It's neccesary to implement in a proper way actions that have to go through a wrapper C function. In general the idea of having Actions without an assosciated Option / Actions added at run time needs to be explored a bit more because the current code is not well suited for it. Merge: 08126fa 6ea8825 David Reveman 2007-04-25 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-25 Add resize mode option to resize plugin. David Reveman 2007-04-25 Update resize plugin to use new metadata system. David Reveman 2007-04-25 Remove code that will try to create both a direct rendering context and an indirect rendering context when GLX_EXT_tfp isn't supported. Danny Baumann 2007-04-25 Remove unneeded code. David Reveman 2007-04-24 Add adjust_image option to cube plugin. The rotation of the top face image will only be adjusted when this option is set to true. Default is now to use the same rotation for the image. Merge: a319d58 5a7eedc Mike Dransfield 2007-04-25 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-24 Use single precision version of sine and cosine functions. James Jones 2007-04-23 Fix unredirect fullscreen windows. In paint.c!paintScreenRegion(): -Need to subtract window's region from tmpRegion before checking if tmpRegion is NULL. -Don't try to draw the unredirected window, as it will be immediately redirected again by paint.c!drawWindow() James Jones 2007-04-23 Only use bindTexImage and releaseTexImage on textures that have associated pixmaps. David Reveman 2007-04-24 Remove unused definitions. David Reveman 2007-04-24 Initialize hsize and vsize from initial option values. David Reveman 2007-04-24 Remove opacityStep variable in CompScreen struct. David Reveman 2007-04-24 Remove unused variable. David Reveman 2007-04-24 Removed unused variables. David Reveman 2007-04-24 Use compSetDisplayOption. David Reveman 2007-04-24 Use compSetDisplayOption and compSetScreenOption. David Reveman 2007-04-24 Add compSetDisplayOption and compSetScreenOption. Merge: 4bc3c98 7f36a24 David Reveman 2007-04-24 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-24 Add CompActionStateAutoGrab action state, which isused to indicate that passive grabs for any key or mouse bindings in an action option should automatically be added and removed. Dennis Kasprzyk 2007-04-24 Added -L${libdir} to libdecoration pkg-config file to fix linking of other decorators David Reveman 2007-04-24 Add helper tag to match options. This tag can be used to indicate that the match object should not be automatically updated when initialized and when the option value changes. Danny Baumann 2007-04-24 Added an Y viewport parameter to the function moveWindowToViewportPosition. Merge: 910b041 701b49b Mike Dransfield 2007-04-23 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-23 Change compRemoveTimeout to return the closure David Reveman 2007-04-20 Remove C-style comment from configure.ac. Merge: 19de2f8 36ca8bf David Reveman 2007-04-20 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-20 Remove whitespaces. David Reveman 2007-04-20 Fix typo in amount of memory to allocate. Roi Cohen 2007-04-20 Fix screen transformation calculation. David Reveman 2007-04-20 Make sure background is painted properly when performing zoom effect. David Reveman 2007-04-20 Remove whitespace. David Reveman 2007-04-20 Only place window if it's not placed by someone else. David Reveman 2007-04-20 Declarations at top of scope. David Reveman 2007-04-20 Remove redundant code. David Reveman 2007-04-20 Move newX and newY variables to the scope where they are used. David Reveman 2007-04-20 Remove some whitespaces. Merge: 794a341 baed3a2 Mike Dransfield 2007-04-20 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Merge: 9727e91 c067ddf Danny Baumann 2007-04-20 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Conflicts: include/compiz.h Danny Baumann 2007-04-20 Added PlaceWindowProc function. Plugins that want to influence initial window placement can wrap into this function and adjust the window position. This change also fixes the place plugin for applications not supporting the sync request protocol. David Reveman 2007-04-20 Add basic background support to cube plugin. David Reveman 2007-04-19 Add support for _NET_WM_ACTION_ABOVE and _NET_WM_ACTION_BELOW. David Reveman 2007-04-19 Keep track of available texture targets and avoid calls to glXQueryDrawable when possible. Merge: aca8879 2ca7779 Mike Dransfield 2007-04-19 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-19 Always update event windows when state changes to make sure they are adjusted correctly for when a window gets shaded or un-shaded. David Reveman 2007-04-19 Adjust frame window properly when shaded. Danny Baumann 2007-04-19 Update decoration on map request before core handles the request. Merge: b05b63d 6f1b4d6 Mike Dransfield 2007-04-18 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-18 Update po files. David Reveman 2007-04-18 Make sure autogen.sh runs intltoolize. David Reveman 2007-04-18 Don't use config dir for autoconf config files as it doesn't seem to be working well with intltool. Merge: bb60bb9 68aa945 David Reveman 2007-04-18 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-18 Load both user and system metadata files. Danny Baumann 2007-04-18 Bump ABIVERSION due to warpPointer() changes. Kristian Lyngstol 2007-04-18 Do not use shareList. Do not attempt to share across screens/contexes. Make sure the current screen's context is current context before modifying textures. Kristian Lyngstol 2007-04-17 Change warpPointer() to take a CompScreen as argument. This is necesarry to avoid warping the pointer to the wrong screen, and also fixes what is known as "crazy spinning" in rotate. David Reveman 2007-04-17 Clean up. Merge: 294fd0a a447479 David Reveman 2007-04-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-17 Convert annotate plugin to use new metadata system and store default option values in an external xml file. David Reveman 2007-04-17 Improve option initialization and loading of hard coded metadata for core and plugins. Dennis Kasprzyk 2007-04-17 Update match during initialisation from metadata. Merge: 499ec53 90dd79d Mike Dransfield 2007-04-17 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2007-04-17 initialize float value correctly from metadata David Reveman 2007-04-16 Remove whitespace. David Reveman 2007-04-16 Add GetMetadata function to plugin VTable. David Reveman 2007-04-16 Clean up. Merge: e1b5900 912a2d7 David Reveman 2007-04-16 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-16 Use intltool for translations. David Reveman 2007-04-16 Use .xml file extensions for metadata files. Danny Baumann 2007-04-16 Fixed string length calculations. Danny Baumann 2007-04-16 Fix stack corruption caused by an insufficient size of an allocated buffer. Mike Dransfield 2007-04-15 Reinitialize variable Mike Dransfield 2007-04-15 Properly format code Merge: 58cf63b 376a94a Mike Dransfield 2007-04-15 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Patrick Niklaus 2007-04-13 Fixed bug with action parsing Danny Baumann 2007-04-15 Some beautification. Patrick Niklaus 2007-04-12 Fixed list parsing Patrick Niklaus 2007-04-12 Some minor cleanup in iniLoadOptionsFromFile Patrick Niklaus 2007-04-12 Cleaned up iniParseLine Patrick Niklaus 2007-04-12 Fixed list parsing (plugged a memory leak) Merge: dbbc119 5f0f272 David Reveman 2007-04-13 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-12 string -> value. David Reveman 2007-04-12 Add convenient option info structure and initialize all core options completely from metadata. David Reveman 2007-04-12 Initialize option descriptions. David Reveman 2007-04-12 Fix function declaration. David Reveman 2007-04-12 Failure to read additional metadata from file is not fatal. David Reveman 2007-04-12 Add hardcoded metadata for core. Merge: 7c4262b 5f0f272 Mike Dransfield 2007-04-12 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-12 Remove extra unneeded function Mike Dransfield 2007-04-12 Removed registration checks and unneeded variables David Reveman 2007-04-12 Update metadata.c header. David Reveman 2007-04-12 general -> core. David Reveman 2007-04-12 element -> value. David Reveman 2007-04-12 Update core metadata. David Reveman 2007-04-12 Clean up action edge initialization. David Reveman 2007-04-12 Clean up action bell initialization. Mike Dransfield 2007-04-12 Always send list values as an array David Reveman 2007-04-12 Clean up action key/button initialization. David Reveman 2007-04-12 Initialize action state properly. Mike Dransfield 2007-04-12 Unregister objects in correct order Mike Dransfield 2007-04-12 Register screen options properly David Reveman 2007-04-12 Use restrictions when initializing options. David Reveman 2007-04-12 Initialize restrictions before default value. David Reveman 2007-04-12 Fix so that string restrictions can be overloaded appropriately. Mike Dransfield 2007-04-12 Fix build error Mike Dransfield 2007-04-12 Use COMPIZ_DBUS_ROOT_PATH define David Reveman 2007-04-12 Fix so that int and float restrictions can be overloaded appropriately. Mike Dransfield 2007-04-12 Tiny typo David Reveman 2007-04-12 Add stringFromMetadataPathElement function. Merge: 518a9b4 7841367 Mike Dransfield 2007-04-12 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-12 Use correct variable naming conventions Mike Dransfield 2007-04-12 Changed registration system to re-register on active_plugins change David Reveman 2007-04-12 Update option initialization so that appropriate values can be overloaded by hardcoded metadata documents. Merge: 8ab3cf4 26b1edf Mike Dransfield 2007-04-12 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Merge: d9fd9c3 692c842 Mike Dransfield 2007-04-12 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-12 Remove trailing whitespace Danny Baumann 2007-04-12 Fix dangling comma in list writing. David Reveman 2007-04-11 Remove initOptionFromNode. David Reveman 2007-04-11 Clean up getOptionType function. David Reveman 2007-04-11 Node must contain at least one matching element. David Reveman 2007-04-11 Add initXPathFromMetadataPath, which searches all xml documents in metadata object for a match. David Reveman 2007-04-11 Allow one metadata object to contain multiple xml document references. David Reveman 2007-04-11 Make compAddMetadataFromFile add metadata file extension and search for file in the users home directory as well as the system wide metadata directory. David Reveman 2007-04-11 Clean up. David Reveman 2007-04-11 Move core metadata initialization to main.c. David Reveman 2007-04-11 Change so that heap allocated metadata objects are not required. David Reveman 2007-04-11 These kind of safety checks are bad and they don't belong in this code. David Reveman 2007-04-11 Store path instead of plugin name in metadata object. David Reveman 2007-04-11 compGetMetadataFromString should take a const char pointer. David Reveman 2007-04-11 Use datadir for metadata. David Reveman 2007-04-11 Remove some whitespace and place libxml-2.0 dependency before libstartup-notification-1.0 dependency so backslashes are aligned properly. David Reveman 2007-04-11 Clean up compiz.h. David Reveman 2007-04-11 Fix metadata code so it doesn't require external Display variable. David Reveman 2007-04-11 Fix typo in header. Dennis Kasprzyk 2007-04-11 initialize core options from metadata Dennis Kasprzyk 2007-04-11 fixed some xml parsing errors Dennis Kasprzyk 2007-04-11 added Metadata parsing system Merge: efcabb2 9b0eae5 Mike Dransfield 2007-04-11 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-11 Fix crash if config file contains invalid action options Merge: f2773cb 9b0eae5 Mike Dransfield 2007-04-11 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Merge: 9a65544 06fca54 Mike Dransfield 2007-04-11 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-11 Add Introspection support to dbus Danny Baumann 2007-04-11 Fix mem leaks Merge: d077219 a71a9b3 Mike Dransfield 2007-04-11 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-11 Code formatting changes Patrick Niklaus 2007-04-11 Improve action reading code David Reveman 2007-04-11 Add xml files for gnome keybinding capplet. Merge: 1b6bdc3 6878c70 Danny Baumann 2007-04-10 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-04-10 Raise windows whenever their fullscreen, above/below or maximization state changed. Mike Dransfield 2007-04-09 Made define name more consistent Merge: 59e9a3f 2a080b2 Mike Dransfield 2007-04-09 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-09 Regenerate schemas Mike Dransfield 2007-04-09 Regenerate schemas David Reveman 2007-04-09 Disable metacity and gnome when gtk is disabled. Merge: fe36623 cb9a43e David Reveman 2007-04-08 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-08 Avoid strict-aliasing violations. David Reveman 2007-04-08 Don't add -fno-strict-aliasing flag. Danny Baumann 2007-04-08 Added possibility to call updateWindowAttributes without requesting any stack changes. Also use this whereever appropriate to make sure no unwanted stack changes occur. David Reveman 2007-04-07 Report used buttons properly. David Reveman 2007-04-07 Require metacity 2.17.0 for META_FRAME_ABOVE flag. Merge: 252fbad 25ec830 David Reveman 2007-04-07 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Gerd Kohlberger 2007-04-07 Remove deprecated gdk API. David Reveman 2007-04-07 Require metacity 2.17.0 when building support for additional button types. David Reveman 2007-04-07 Never add shaded state. Danny Baumann 2007-04-07 Make gwd build without Metacity support. David Reveman 2007-04-06 Reduce code by using compSetOption. David Reveman 2007-04-06 Remove whitespaces. David Reveman 2007-04-06 Remove whitespaces. David Reveman 2007-04-06 Add break to last case section. Merge: 337d24c 55bd1bd David Reveman 2007-04-06 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-06 Reduce code by using compSetOption. David Reveman 2007-04-06 Reduce code by using compSetOption. David Reveman 2007-04-06 Add compSetOption function. Merge: c3a7fc2 1708507 Mike Dransfield 2007-04-06 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-06 Fix action options with long names David Reveman 2007-04-06 Ignore resize increment hint only for dimensions that are maximized. David Reveman 2007-04-06 Indent correctly. David Reveman 2007-04-06 Position action menu properly. David Reveman 2007-04-06 Add all button types that libmetacity support and make button layout configurable. David Reveman 2007-04-05 Avoid unnecessary work in kwd when window position changed. David Reveman 2007-04-05 Avoid unnecessary work in gwd when window position changed. David Reveman 2007-04-05 Update constrain region creation so that windows are constrained from being moved to screen regions that are not visible in any output. David Reveman 2007-04-05 Compare to and update server side position for each motion notify. Cedric 2007-04-05 Fix typo in matching code. Merge: a084d7d 932d9fe David Reveman 2007-04-05 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-04-05 Another attempt at correctly fixing the calculations in outputDeviceForGeometry. We also have to check the left window edge for equality as the output device regions right edge is 1-based. Danny Baumann 2007-04-05 Fix rectangle-in-range calculation for outputDeviceForGeometry. David Reveman 2007-04-05 Fall-back to default refresh rate if driver is reporting 0 as refresh rate. Danny Baumann 2007-04-05 Avoid explicit comparison with FALSE constant Erkin Bahceci 2007-04-04 Add open/close option. Merge: b698a6c 709d0ee David Reveman 2007-04-04 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Merge: 53c674c a303060 Danny Baumann 2007-04-04 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-04-04 Add 'group-drag' as an allowed screen grab for edge flipping. This screen grab is issued by the group plugin when tab bar slots are dragged to other tab bars. Danny Baumann 2007-04-04 Reflect minimum size hint when adding size changes. Danny Baumann 2007-04-04 Check for active screen grabs before unsnapping a maximized window. Mike Dransfield 2007-04-03 Bump ABI version Mike Dransfield 2007-04-03 Changed plugin vTable option functions to include a reference to the plugin as per other vTable functions. David Reveman 2007-04-02 Post release version increment. David Reveman 2007-04-02 Bump version. David Reveman 2007-04-02 Add NEWS entry for 0.5 release. Danny Baumann 2007-04-02 Update decorator version information. This change was missed when adding the quad stretching interface in commit 3c434da32d24b580d0bff968f302ead1781864e8. Merge: edf914f f6764b3 Danny Baumann 2007-04-02 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-04-02 Remove screen actions un plugin unload. Danny Baumann 2007-04-02 Free allocated cursors on plugin unload. Travis Watkins 2007-03-13 Register plugin, screen, and option objects. Travis Watkins 2007-03-13 Switch to object registration instead of message filtering. Travis Watkins 2007-03-13 Add dbus introspection generation functions. Travis Watkins 2007-03-13 Add libxml2 build dependency. Travis Watkins 2007-03-13 Add functions to generate dbus introspection XML. David Reveman 2007-04-01 make update-po. David Reveman 2007-04-01 Update POTFILES.in. David Reveman 2007-04-01 Add more translations. David Reveman 2007-04-01 Update translations. David Reveman 2007-03-30 Make sure that widget or children isn't 0. David Reveman 2007-03-30 Adjust metacity border region code so it matches latest version of metacity. Cedric 2007-03-30 Add Vertical/Horizontal maximization. David Reveman 2007-03-29 Remove signal handling from display.c. David Reveman 2007-03-29 Handle SIGINT and SIGTERM in main.c. David Reveman 2007-03-29 Restart if restartSignal is true. David Reveman 2007-03-29 Return from event loop instead of calling exit. Merge: 2087f96 de9ca3b David Reveman 2007-03-28 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2007-03-28 new imageDataToTexture function to specify gl format/type parameters (replaces fixedRGBA option) Merge: d7f7338 8e3b26f Mike Dransfield 2007-03-28 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-03-28 Make action options atomic Merge: 9c2b298 8e3b26f David Reveman 2007-03-28 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-03-28 Added possibility to load textures with fixed RGBA byte ordering from header files. Robert Carr 2007-03-27 Revert "Use glXQueryServerString for indirect rendering case." This reverts commit 3c434da32d24b580d0bff968f302ead1781864e8. Robert Carr 2007-03-27 Use glXQueryServerString for indirect rendering case. Merge: 8cdf7e9 f04dccc David Reveman 2007-03-26 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-03-25 Added Erkin to AUTHORS file Erkin Bahceci 2007-03-24 Added switcher activate event to notify other plugins when the switcher animation has started/finished. Erkin Bahceci 2007-03-24 Fix for negative float option values Gerd Kohlberger 2007-03-21 Remove unneeded function and variable mike@blueroot.co.uk 2007-01-27 Allow plugins to wrap enter/leaveShowDesktopMode Danny Baumann 2007-03-21 Added quad stretching interface to libdecoration. Decorators wanting to display stretched quads can set the q->stretch member accordingly. In this case, q->max_width / q->max_height should contain the size of the unstretched texture. Danny Baumann 2007-03-21 Fixed matrix calculations for xy and yx coordinates Merge: 3009849 f0e6238 Mike Dransfield 2007-03-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-03-17 Correct typo in comments David Reveman 2007-03-16 Expose edges as files with boolean values and add write support for them. David Reveman 2007-03-16 Add write support for list items in fuse plugin. David Reveman 2007-03-16 Avoid using variable name 'private' in compiz.h. David Reveman 2007-03-15 Only allow move with window when we're currently not moving. David Reveman 2007-03-15 Don't index past the end of the array. Mike Dransfield 2007-03-14 Prevent excessive reads and writes David Reveman 2007-03-14 Wrap matchPropertyChanged function and update window decorations when a property that might affect decoration matching changed. David Reveman 2007-03-14 Add shadow match option. David Reveman 2007-03-14 Add basic write support. List options and edges in action options are still read-only. Dennis Kasprzyk 2007-03-13 Replace shader based blending with hardware blending. David Reveman 2007-03-13 Fix so mipmap and 4xbilinear filters work again. David Reveman 2007-03-13 We have a screen variable, use it. David Reveman 2007-03-13 Place windows with an invalid desktop number on current desktop instead of all desktops. David Reveman 2007-03-13 Remove signal handling from fuse plugin. It's not longer needed as the core is now cleaning up plugins properly before exiting. David Reveman 2007-03-13 Clean up plugins before exiting. David Reveman 2007-03-13 Basic signal handling. David Reveman 2007-03-12 Some minor coding style changes and remove some whitespaces. Merge: e4a1fa4 43fadab David Reveman 2007-03-12 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2007-03-12 Added blur occlusion detection. This will disable multiple levels of blur on overlapping blur regions. Dennis Kasprzyk 2007-03-12 Save lastPaint and lastMask during occlusion detection. Dennis Kasprzyk 2007-03-12 Don't blur opaque windows if decorations are also blured. David Reveman 2007-03-12 Track changes to decoration plugin. Switcher window is a decorated window so motif hints that tell the WM not to decorate it shouldn't be set. The only problem with this is that the switcher window might appear with default decorations for short period before the decorator is able to update it with correct decorations. This is still much more correct than before and if the default decorations turns out to be a problem we'll come up with more correct solution for that. David Reveman 2007-03-12 Update decoration selection so it makes a bit more sense. The decorator shouldn't be able to override hints. David Reveman 2007-03-12 Add decoration match option. David Reveman 2007-03-12 Add option that makes it possible to turn off YV12 filter support. This is useful for hardware/drivers where software colorspace conversion is more efficient than using fragment programs. Cedric 2007-03-12 Respect allowed actions hint. David Reveman 2007-03-11 Check for sync alarm notify after core handleEvent function has been called as syncWait will always be true otherwise. David Reveman 2007-03-11 Create a pango layout for when drawing default decorations. Makes the default decorations more correct. David Reveman 2007-03-11 Set up clip planes so we're clipping to the region extents. Makes more sense than just clipping to the output extents and fixes some clipping issues with the cube plugin. David Reveman 2007-03-09 Call repaint to make sure decorations are updated properly when they are resized. David Reveman 2007-03-09 Some themes update the layout when the borders function is called so we should call it with the correct window state after we've used it for getting maximized border size. David Reveman 2007-03-09 Add fuse plugin. It provides a user space file-system with compiz information. E.g. all options are represented as directories and and current values can be retrieved by reading files in these directories. It's read-only right now but write support will be added soon and it will allow you to manipulate options by writing to files. David Reveman 2007-03-08 Rewrite restackWindowBelow. The old implementation was broken as it allowed stacking to positions where windows are not allowed to be. New implementation makes sure windows are always stacked at allowed positions. This issue caused windows being prevented from focus to sometimes be placed behind one of it's ancestors. David Reveman 2007-03-07 The active viewport coordinate solution is not good enough in a lot of cases where windows span more than one viewport. Replace most of it with a general active window history stored in the screen structure. David Reveman 2007-03-07 Add activeViewportX and activeViewportX members to the CompWindow struct to keep track of the viewport the window was last active in. This can be used to more properly calculate to which window the input focus should be moved to and the compareWindowActiveness function has been added to make this more convenient. David Reveman 2007-03-07 count should be incremented for each window. David Reveman 2007-03-07 Don't calculate available actions until plugins have initialized the window. recalcWindowType should never call recalcWindowActions. David Reveman 2007-03-07 Shut up compiler. Mike Dransfield 2007-03-07 Add flat file configuration backend. David Reveman 2007-03-06 Use findTopLevelWindowAtDisplay when receiving FocusIn events as the frame might be the window that got focused when the client window is shaded. David Reveman 2007-03-06 Windows can't occlude anything when shaded. Dennis Kasprzyk 2007-03-06 Splits bw->region into 5 regions (top, bottom, left, right and center) and projects each separately to avoid unnecessary work during first pass with gaussian filter. David Reveman 2007-03-06 Fix typo. David Reveman 2007-03-06 Add getAllowedActionsForWindow function that plugins can wrap to restrict available actions for a window. David Reveman 2007-03-06 Remove PAINT_WINDOW_CLIP_OPAQUE_MASK and PAINT_WINDOW_CLIP_TRANSLUCENT_MASK flags. The PAINT_WINDOW_OCCLUSION_DETECTION_MASK flag and the new occlusion detection code replaces them. David Reveman 2007-03-06 Add comment about occlusion detection. David Reveman 2007-03-06 Cleanup paintTransformedScreen a bit. David Reveman 2007-03-06 Really remove windowMask and backgroundMask from paintTransformedScreen. David Reveman 2007-03-06 Remove windowMask and backgroundMask from paintTransformedScreen. David Reveman 2007-03-06 Move cursor painting into paintScreenRegion. David Reveman 2007-03-06 Have paintTransformedScreen use paintScreenRegion. David Reveman 2007-03-06 Have paintScreenRegion accept a screen paint mask instead. David Reveman 2007-03-06 Have paintScreen always use paintScreenRegion. David Reveman 2007-03-06 No need to pass backgroundMask to paintScreenRegion. David Reveman 2007-03-06 Add unredirect fullscreen windows support to paintScreenRegion. David Reveman 2007-03-06 Move occlusion detection and window painting to static function. David Reveman 2007-03-06 Avoid some duplicate code. David Reveman 2007-03-06 Avoid overflow in opacity calculations by changing range of opacityFactor from 0-OPAQUE to 0-0xff. Dennis Kasprzyk 2007-03-06 Use occlusion detection on PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK. Dennis Kasprzyk 2007-03-06 Added occlusion detection for PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK screen paints. Dennis Kasprzyk 2007-03-06 Added occlusion detection handling to paintWindow. Dennis Kasprzyk 2007-03-06 Added occlusion detection window paint mask. Bellegarde Cedric 2007-03-05 Fix typo. David Reveman 2007-03-05 Bump ABI version. Danny Baumann 2007-03-05 Add grabbed variable to CompWindow struct. Danny Baumann 2007-03-05 Keep track of last state. Danny Baumann 2007-03-05 Add deltas to resize notify function. Bellegarde Cedric 2007-03-05 Add window position/viewport matching to place plugin. Bellegarde Cedric 2007-03-05 Check allowed actions before initiating move or resize. David Reveman 2007-03-05 Move windowStateChangeNotify call to changeWindowState function. David Reveman 2007-03-05 Use changeWindowState instead of setWindowState. David Reveman 2007-03-05 Add changeWindowState function. David Reveman 2007-03-05 Remove whitespaces. Per Wigren 2007-03-05 Add --only-current-screen option which tell compiz to only manage the screen defined by $DISPLAY and leave the others alone. Bellegarde Cedric 2007-03-05 Add window role matching to regex plugin. Bellegarde Cedric 2007-03-05 Remove focus prevention option. David Reveman 2007-03-05 Video plugin must be stacked above blur and water plugins. David Reveman 2007-03-05 Add direct composited video plugin. Using _COMPIZ_VIDEO property. RGB and YV12 image formats are currently supported. YV12 image format requires 8 bit alpha only GLX pixmap support. Known issues: Doesn't work with unredirect_fullscreen_windows option. David Reveman 2007-03-02 Add NOTIFY_MODIFY_MASK. dragoran 2007-03-02 Add --ignore-desktop-hints command line option, which can be used to make compiz not read "number of desktops" and "current desktop" hints left by previous WM. David Reveman 2007-03-01 Make addWindowSizeChanges use new window geometry for viewport and output as that makes it possible to move maximized and fullscreen windows to different viewports and outputs. David Reveman 2007-03-01 Move defaultViewportForWindow and outputDeviceForWindow implementation to screen.c. David Reveman 2007-03-01 Add fadeOut variable to keep track of windows that fade out. David Reveman 2007-03-01 Make sure we set state to Normal again when window is mapped. David Reveman 2007-03-01 Make sure mBorder gets initialized. David Reveman 2007-03-01 Set a top anchor when resizing a wobbly window. David Reveman 2007-03-01 Regen compiz.schemas.in. David Reveman 2007-03-01 Change default map effect to None. David Reveman 2007-03-01 Remove invalid window types and add Unknown. David Reveman 2007-03-01 Remove invalid window types. David Reveman 2007-03-01 Read current window position properly. David Reveman 2007-03-01 Add unknown window type to default window match. David Reveman 2007-03-01 Don't end zoom animation so quickly. David Reveman 2007-03-01 Perform zoom effect by translating screen instead of windows. David Reveman 2007-03-01 Only draw top/bottom face after clearing screen. David Reveman 2007-03-01 Make sure we don't clear an output more than once per screen updated. David Reveman 2007-03-01 No need to clear the stencil buffer. David Reveman 2007-02-28 Fix another typo in 4xBilinear filter. Offset parameter should be multiplied and then added to texture coordinate. David Reveman 2007-02-28 Fix typo in 4xBilinear filter code. David Reveman 2007-02-28 Enable the code in the placement plugin that maximize windows when they are too big for their work area. Bellegarde Cedric 2007-02-28 Add centered, smart, maximize and random placement modes. David Reveman 2007-02-28 Add opacity match options and improve the behavior of opacity increase/decrease actions. Increase/decrease actions will no longer modify the opacity property. David Reveman 2007-02-28 Fix initialization of regex plugin. Handler should not be registered until all screens and windows have been initialized. David Reveman 2007-02-28 Do not modify window paint struct, use destroyCnt unmapCnt instead. David Reveman 2007-02-28 Add bindFailed variable to CompWindow struct so we can handle cases where binding window to texture failed because window is no longer mapped properly. David Reveman 2007-02-27 Check for pending maps when trying to hide a window. David Reveman 2007-02-27 Do not change input focus when EnterNotify event is generated from an ungrab. This changes the behavior when not using click to focus and moving between viewports a bit. However, focusDefaultWindow should be modified instead if the old behavior made more sense. David Reveman 2007-02-27 Fix active window tracking. We're always setting the active window property so there's no need to monitor that property. David Reveman 2007-02-27 Only focus default window if switcher isn't active. Stjepan Glavina 2007-02-27 Add auto rotate option. David Reveman 2007-02-26 Reset rotation correctly when we receive a client message that cause us to move the viewport. Bellegarde Cedric 2007-02-26 Add translucent flag properly. David Reveman 2007-02-26 Make sure grab window is set. David Reveman 2007-02-25 Regen compiz.schemas.in. David Reveman 2007-02-25 Handle match options properly. David Reveman 2007-02-25 Add "|" symbol properly and don't add "&" or "|" if this is the first expression in this group. David Reveman 2007-02-25 Add match argument support to all initiate scale actions. David Reveman 2007-02-25 Use match option type if argument name is "match". David Reveman 2007-02-25 Add getMatchOptionNamed function. David Reveman 2007-02-25 We should try to return an empty string if the match object is empty instead of NULL. David Reveman 2007-02-25 Add alpha blur match option. It provides alpha blur for windows that don't have the blur property set. David Reveman 2007-02-25 Automatically update match options when they change. David Reveman 2007-02-25 Remove some whitespaces. David Reveman 2007-02-25 Add match option for per-window focus prevention control. David Reveman 2007-02-25 Add window ID match handler. David Reveman 2007-02-25 Use match options in wobbly plugin. David Reveman 2007-02-25 Use match option in switcher plugin. David Reveman 2007-02-25 Use match option in scale plugin. David Reveman 2007-02-25 Use match option for window matching. David Reveman 2007-02-25 Set correct option type. David Reveman 2007-02-25 Use match option for focus blur. David Reveman 2007-02-25 Switch to using a match option. David Reveman 2007-02-25 Add support for new match option type. David Reveman 2007-02-25 Add match option. David Reveman 2007-02-25 Shut up compiler. David Reveman 2007-02-25 Add matchToString function. David Reveman 2007-02-25 Use match object for minimize effect. David Reveman 2007-02-25 Use match object for window focus blur. David Reveman 2007-02-24 Add window state matching to core and rename compWindowTypeFromString function to windowTypeFromString. David Reveman 2007-02-24 Call matchPropertyChanged when wmType changed. David Reveman 2007-02-24 Fix name of match op flags. David Reveman 2007-02-24 Add proper parsing of match expressions and track changes in fade plugin. David Reveman 2007-02-24 Make string "any" match all window types. David Reveman 2007-02-24 Regen compiz.schemas.in. David Reveman 2007-02-24 Avoid using glPushAttrib. It's usually bad to use glPushAttrib as we don't know if the stack is full from other plugins pushing attributes to it. David Reveman 2007-02-23 Only create the gaussian kernel once and not everytime we draw. David Reveman 2007-02-23 Add sat variable when saturation is used. David Reveman 2007-02-23 Make saturation an integer option and remove blur from its name. Dennis Kasprzyk 2007-02-23 Add saturation option. Dennis Kasprzyk 2007-02-23 A strength option that interpolates between a linear blur (0.0) and soft gaussian blur (1.0). Dennis Kasprzyk 2007-02-23 Switch to a pascal triangle based blur kernel generation function which creates optimized texture fetch coordinates. Optimize shader code to use less temporary variables. Allows larger radius to be used with gaussian filter. David Reveman 2007-02-23 Avoid blurring opaque client windows. David Reveman 2007-02-23 Never blur windows when painting clipped opaque window regions. David Reveman 2007-02-23 Clean up and document window paint flags. TRANSLUCENT flag that was earlier used for both indicating that we're painting clipped translucent window regions and that blending is required. The read-only CLIP_TRANSLUCENT flag is now used to indicate that we're painting clipped translucent window regions. TRANSLUCENT flag now indicate that client window is translucent. BLEND flag indicates that blending should be used when rendering. David Reveman 2007-02-23 Add plugin that provides regular expression matching for window title, class and name. It can very easily be extended to provide matching of other window related strings. David Reveman 2007-02-23 Update to use match object for window matching. David Reveman 2007-02-23 Add extensible match interface. Match objects can be used for window matching but other objects than windows will likely be supported sometime soon. A match object contains a boolean tree of expressions and each expression can be implemented by a different plugin. The core interface only provides window type matching. Plugins can provide any kind of matching by wrapping the matchInitExp display function. When doing so they are responsible for calling the matchExpHandlerChange function when their ability to evaluate expressions changed (e.g. when being activated or deactivated). They should also call the matchPropertyChanged function when a window property that might affect evaluation of an expression changed. David Reveman 2007-02-21 Add infrastructure for software cursors but leave it disabled until proper server-side support has landed. David Reveman 2007-02-21 Only enable blur if GL_ARB_fragment_program is present. David Reveman 2007-02-21 Initialize watch pointer in inotify display struct properly. gandalfn 2007-02-21 Fix mouse move key name. Dennis Kasprzyk 2007-02-20 Raise window when titlebar is clicked. Dennis Kasprzyk 2007-02-20 Fix nasty server resource leak. David Reveman 2007-02-20 Allow destination blur on windows without alpha channel. David Reveman 2007-02-19 Offset blut regions correctly. David Reveman 2007-02-19 Offset blur regions correctly. David Reveman 2007-02-14 Fix description for disable-kde option. David Reveman 2007-02-14 Add missing calls to gdk_display_sync and replace all calls to XSync with calls to gdk_display_sync for consitancy. David Reveman 2007-02-13 Reset any window attributes that might have been changed. David Reveman 2007-02-13 Add window damage properly when opacity is less than 100. David Reveman 2007-02-13 Only include visible windows in output scale mode. David Reveman 2007-02-13 Regen compiz.schemas.in. David Reveman 2007-02-13 Make ping delay configurable. David Reveman 2007-02-13 Increase fade speed max. David Reveman 2007-02-13 Add missing files to POTFILES.in. David Reveman 2007-02-13 Edge names should not be translated. David Reveman 2007-02-13 Add demands attention state when focus on map was prevented. David Reveman 2007-02-13 Regen compiz.schemas.in. David Reveman 2007-02-13 Add gandalfn to AUTHORS file. gandalfn 2007-02-13 Add run terminal action. David Reveman 2007-02-13 Include mipmap filter. David Reveman 2007-02-12 Expand damage region properly and include gaussian filter. David Reveman 2007-02-12 Remove old stencil buffer workaround. David Reveman 2007-02-12 Expand region one pixel in each direction to make sure it covers the transformed window completely. David Reveman 2007-02-06 Make sure no core instance of window is painted after minimize animation. (bnc 240960) David Reveman 2007-02-06 Adjust moveScreenViewport function so that the same constraints are used as in ensureWindowVisibility. If the constraints don't match windows might be moved incorrectly by ensureWindowVisibility when being activated. Bellegarde Cedric 2007-02-01 Add option for disabling focus prevention. Mike Dransfield 2007-01-26 List options must be sent as arrays. David Reveman 2007-01-26 Add option to kwd for controlling decoration blurring. David Reveman 2007-01-26 Add option to gwd for controlling decoration blurring. David Reveman 2007-01-26 Add temporary fix to avoid transformed windows in switcher. David Reveman 2007-01-26 Add blur utility function to libdecoration. David Reveman 2007-01-26 drawWindowGeometry should not be a screen function. It's call-back to the function that generated the geometry so it should live where the geometry is stored, which is currently in CompWindow struct. David Reveman 2007-01-26 Disable texture coordinate array when stenciling. David Reveman 2007-01-26 Offset blur region correctly. David Reveman 2007-01-26 Make wobbly plugin use indexCount when storing number indices so that vCount is set properly to the number of vertices. Make sure indexCount is initialized properly everywhere addWindowGeometry is used. David Reveman 2007-01-26 Fix so that windows are centered properly in scale slots. David Reveman 2007-01-26 Fix issue with windows being maximized on incorrect output. David Reveman 2007-01-25 Add PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK flag when zooming to get clipping correct. David Reveman 2007-01-25 Track window size and adjust blur region properly. David Reveman 2007-01-25 Remove stencilRef from CompScreen struct and update so region based blur finally works properly in blur plugin. David Reveman 2007-01-25 No need to wrap paintBackground. David Reveman 2007-01-25 Remove PAINT_BACKGROUND_WITH_STENCIL_MASK. David Reveman 2007-01-25 Use clipping planes instead of stencil buffer to clip transformed windows when screen is transformed. David Reveman 2007-01-25 Move matrix manipulation out of GL as it makes a lot more sense to use the regular stack for this and it is required to fix vertex projection issues in blur plugin. David Reveman 2007-01-23 Fix blur region clipping and expose client and decoration texture blurring to applications using window properties. David Reveman 2007-01-23 Set stencilRef properly. It should be either 1 or 0. David Reveman 2007-01-23 Move applyGravity function into libdecoration. David Reveman 2007-01-23 stencilRef should initially be 0. David Reveman 2007-01-21 Don't pass window paint attribs to drawWindow function. All transformations must be done before calling drawWindow. Blur plugin is now performing destination fetching in drawWindow function before any window textures have been rendered. David Reveman 2007-01-19 No need for plugins to link to libraries that compiz is already linked to. David Reveman 2007-01-18 Add Julian. Julian Sikorski 2007-01-18 Use --install include option with kde-config to get kde include dir. David Reveman 2007-01-18 Don't allow plugin names to start with -. David Reveman 2007-01-18 Enable sync request protocol for override_redirect windows as commit 837bb9f5d4dfa0ee23fffabc800dccd68a7a2f35 likely fixed the issues seen previously. David Reveman 2007-01-18 Fix sync request issue that could caused windows to get into a state where they were never updated. David Reveman 2007-01-18 Position frame window properly. David Reveman 2007-01-18 Add state struct for individual window blurring. David Reveman 2007-01-16 Render decorations after client window so it's possible to have decorations that cover part of the client window. David Reveman 2007-01-16 Minor cleanup. David Reveman 2007-01-16 Project vertices and only update minimum required destination texture region. Some more optimizations should be done here but the current changes should still give a major performance improvement. David Reveman 2007-01-16 All matrix transformations must be applied when drawWindowTexture is called. Add pushWindowTransform, which pushes a matrix to the current matrix stack and applies any window transformations. David Reveman 2007-01-16 Basic focus prevention support. Merge: 6cceb17 bd1ec07 David Reveman 2007-01-14 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-01-14 Regen plugins/compiz.schemas.in. David Reveman 2007-01-14 Add addBlendOpToFunctionData function which can be used to indicate that some fragment function data is performing a blend operation. Functions for allocating fragment parameters and fragment texture units now take a integer parameter that specifies the number of units or parameters that should be allocated. Add initial destination blur support to blur plugin. The current state of destination blur is generally not considered usable. There's a few things that need to be added before it will scale and and perform properly. David Reveman 2007-01-13 Add session restart support. Søren Sandmann 2007-01-12 Terminate move state on button clicks. When choosing move from the window menu or the taskbar button, it is possible to move the window around with no mouse buttons pressed. In this state, mouse clicks should terminate the move, which this patch implements. David Reveman 2007-01-12 Add Gerd to AUTHORS file. Gerd Kohlberger 2007-01-12 Add launch application option. David Reveman 2007-01-11 Kill whitespace. David Reveman 2007-01-11 Use --sm-disable option when generating schemas. David Reveman 2007-01-11 Add filter option and 12x bilinear filter to blur plugin. David Reveman 2007-01-11 Set window type of switcher window to Util. David Reveman 2007-01-10 Update the text in COPYING file. The old text could have been read as if all code was dual licensed and that's not the case. Add COPYING.LGPL file, which was missing. David Reveman 2007-01-10 Regen compiz.schemas.in. David Reveman 2007-01-10 Add blur plugin. This plugin is currently only doing source blurring and the functionality is pretty limited but destination blurring and more functionality will be added be added shortly. However, even in it's current state it demonstrates how powerful the new fragment attribute interface is. David Reveman 2007-01-10 Keep track of temporary texcoord variables at all index levels to make sure we don't add duplicate variable names. Pass the correct offset variable to next index level. David Reveman 2007-01-10 Only add one fetch offset variable per index. Mike Dransfield 2007-01-10 Fix a few initiate functions that should steal events. David Reveman 2007-01-10 Add Fragment Attribute Interface. This interface (FAI) makes it possible for plugins to provide programmable per-fragment operations. Each plugin can add a set of fragment functions to the fragment attributes that are used for a drawing operation. A fragment function contains a set of data defined by some existing extension to OpenGL that provide programmable per-fragment operations. Current version of this interface only support GL_ARB_fragment_program but it is designed in such a way that it can very easily be extended to support other OpenGL extensions. The FAI also provide mechanisms which allow plugins to allocated texture units and parameters for private use. The fragment attribute implementation contains methods for combining a set fragment functions into a fragment program that can be used by OpenGL for per-fragment operations. The major benefit of the FAI is that it provides a pluggable way to use programmable per-fragment operations and will allow us to take advantage of the latest OpenGL extensions and create some really amazing effects while still making sure that everything integrate perfectly. David Reveman 2007-01-10 Fix memory leak. David Reveman 2007-01-06 Regen compiz.schemas.in. David Reveman 2007-01-06 Make sure scaleMoveFocusWindow moves input focus to some scaled window. David Reveman 2007-01-06 Remove whitespaces. David Reveman 2007-01-06 Remove sloppy focus option and use click to focus display option instead. David Reveman 2007-01-06 Add selected window variable that doesn't have to be the same as the currently active window. David Reveman 2007-01-04 Avoid adding any of our own top level windows and deleting the composite window widget. David Reveman 2007-01-04 Try to place titlebar stretch offset as far as possible to the left but not where any button is located. David Reveman 2007-01-03 Move return type above function name. David Reveman 2007-01-03 Do not force a resize when maximize state changes. David Reveman 2007-01-03 Check version of libXrender and workaround gradient issue if older than 0.9.3. See fdo bug 9526 for more info. David Reveman 2007-01-03 Send replies to all method calls unless the no_reply flag is set. David Reveman 2007-01-02 Parse list option parameters properly and allow 0 parameters for list options. David Reveman 2007-01-02 Never generate an error when option name and message parameters are valid. David Reveman 2007-01-02 Only update window position when no pending position changes exists. David Reveman 2007-01-02 Move away from having client side positioning of windows. Window size must be server side so to be able to do atomic move-resize operations position must also be server-side. This means that serverX and serverY fields in CompWindow struct has higher priority than attrib.x and attrib.y. attrib.x and attrib.y is still the client side position and any code dealing with the visible position of a window should use these. Code that needs to be aware of any pending position changes should look at serverX and serverY. David Reveman 2007-01-02 Make sure output devices are initialized. David Reveman 2006-12-31 Post release version increment. David Reveman 2006-12-31 Bump version. David Reveman 2006-12-31 make update-po. David Reveman 2006-12-31 Add entry for 0.3.6 release. David Reveman 2006-12-30 Update AUTHORS file. David Reveman 2006-12-30 Add comment about using libtaskmanager for creating the window menu. David Reveman 2006-12-30 Make sure decorations are updated properly when window state change. David Reveman 2006-12-30 Avoid overflow in tooltip delay code. David Reveman 2006-12-30 Add menu button support. Kristian Hogsberg 2006-12-30 Keep track of unconstrained size and have pointer motion events modify this size instead of the actual window size. David Reveman 2006-12-30 Save position properly. David Reveman 2006-12-30 Use configureXWindow instead of XConfigureWindow. David Reveman 2006-12-30 Revert "Call moveWindow and update frame position in configureXWindow to make sure" This reverts commit 94e8f94771426788a566f4e4fd7bb910aa6e55c7. David Reveman 2006-12-29 Update COW geometry to match root window geometry. David Reveman 2006-12-29 We have to detect outputs again when the screen size changes. David Reveman 2006-12-29 Regen compiz.schemas.in. David Reveman 2006-12-29 Set max number of desktops to 36 by default and add configure script option that can be used to adjust it. David Reveman 2006-12-29 Make usage of composite overlay window default. David Reveman 2006-12-29 Try both direct and indirect rendering contexts in case one of them fail to support GLX_EXT_texture_from_pixmap. David Reveman 2006-12-29 Make strict binding default. David Reveman 2006-12-29 Call moveWindow and update frame position in configureXWindow to make sure that window position in CompWindow struct is always up to date. David Reveman 2006-12-28 Add appropriate movement constraints. David Reveman 2006-12-28 Regen compiz.schemas.in. David Reveman 2006-12-28 Add next_no_popup and prev_no_popup actions. These actions can be used to switch between windows without the thumbnail popup window. David Reveman 2006-12-28 Revert "Add window_list option to switcher plugin. It can be used to turn off the" This reverts commit b307203c453a7463b94beabdd6ae9a86c92dc103. David Reveman 2006-12-28 Use correct data type for default shadow_color variable. David Reveman 2006-12-28 Free memory allocated earlier if out-of-memory. Very unlikely to happen. David Reveman 2006-12-28 Regen compiz.schemas.in. David Reveman 2006-12-28 Add window_list option to switcher plugin. It can be used to turn off the window list popup window. Based on patch by Bellegarde Cedric David Reveman 2006-12-28 Make getPluginMetadata method return an array of features as well. David Reveman 2006-12-28 Return plugin dependencies as an array. Mike Dransfield 2006-12-28 Return string restrictions as an array. David Reveman 2006-12-27 Update ABI version. David Reveman 2006-12-27 Fix unredirect of fullscreen windows when using overlay window for output. David Reveman 2006-12-27 Indent correctly. David Reveman 2006-12-26 Align option descriptions. David Reveman 2006-12-26 Add dbus support to gwd. David Reveman 2006-12-25 Watch plugin directories for changes and send "pluginsChanged" signal when the contents of a directory changes to indicate that the list of available plugins need to be updated. David Reveman 2006-12-25 Make gconf support in gwd optional. David Reveman 2006-12-25 Rename automake conditional GCONF_PLUGIN to USE_GCONF. David Reveman 2006-12-25 Add inotify plugin, which implements the previously added file notification API. David Reveman 2006-12-25 Add abstract file notification API. Needs plugin implementation. David Reveman 2006-12-24 Add getOutputExtentsForWindow screen function. Plugins that modify the window extents should wrap this function. An updateWindowOutputExtents function has also been added and it should be used to update the output extents in the CompWindow struct. Decoration plugin has been updated for these changes. David Reveman 2006-12-23 Remove SetWindowScaleProc type, which should have been removed when window scale attributes were removed. David Reveman 2006-12-23 Add 'GetPluginMetadata' method, which returns metadata for available plugins. David Reveman 2006-12-23 Add short comments and examples to 'List' and 'GetMetadata' methods. David Reveman 2006-12-23 Add "GetPlugins" method that can be used to retrieve a list of available plugins. David Reveman 2006-12-23 Add plugin loader function "listPlugins" and implement availablePlugins function. Plugin loaders that implement listPlugins should return an array of plugin names that can possible be loaded from the specified path. David Reveman 2006-12-22 Add author to some headers where it's missing. David Reveman 2006-12-22 Add desktop sub menu to window popup window. David Reveman 2006-12-21 Set backgroundLoaded to false when background property changed so that it gets reloaded when painting the background. David Reveman 2006-12-21 Fix typo. David Reveman 2006-12-21 Make sure we always have a reasonable geometry set. David Reveman 2006-12-21 Decorate windows with unknown window type. David Reveman 2006-12-21 Make screen edges 2 pixels thick as some DnD clients will not send xDnd events otherwise. David Reveman 2006-12-21 Remove background.png. David Reveman 2006-12-21 Check window type before adding decorations to a window. David Reveman 2006-12-21 Add support for force quit dialog. David Reveman 2006-12-21 Make sure we have a valid server time. David Reveman 2006-12-20 Add support for main menu toolkit action. David Reveman 2006-12-20 Add support for run dialog toolkit action. David Reveman 2006-12-20 Add initial toolkit action support and handle window menu toolkit action. David Reveman 2006-12-20 Remove ROOT_OFF_X and ROOT_OFF_Y from wiget geometry and add clientGeometry function which returns client window geometry. David Reveman 2006-12-20 Remove opacity menu. Consistency is more important than features. David Reveman 2006-12-20 geometry function should just return the parent widget geometry. David Reveman 2006-12-20 Remove default background image. David Reveman 2006-12-20 Handle the case where no background image can be loaded. David Reveman 2006-12-20 Check for shared object instead of libtool archive. David Reveman 2006-12-19 Hide button event windows for tiny windows where buttons are not visible. David Reveman 2006-12-19 Move xinerama clipping to right place. David Reveman 2006-12-19 Another go at getting the workarea computed correctly. Should be easier to get it right this time as struts are already clipped to xinerama edges. David Reveman 2006-12-19 Clip struts to xinerama edges. David Reveman 2006-12-19 Remove whitespace in header. David Reveman 2006-12-19 Handle floating and overlapping struts properly. David Reveman 2006-12-19 Fix license info. LGPL header was a cut-n-paste mistake. All kde window decorator code is GPL2. David Reveman 2006-12-18 Fix building of kde window decorator. David Reveman 2006-12-18 Obvious fix for point in rectangle calculation. David Reveman 2006-12-18 Kill whitespaces. David Reveman 2006-12-18 No need to set these to NULL in destructor. David Reveman 2006-12-18 Kill some whitespaces. David Reveman 2006-12-18 Add KDE window decorator. David Reveman 2006-12-18 Fix typo that caused shadow of right window border to sometimes be rendered wrong. David Reveman 2006-12-17 Regen compiz.schemas.in. David Reveman 2006-12-17 Add gwd.schemas.in to EXTRA_DIST. David Reveman 2006-12-16 Fix --no-detection option issue. David Reveman 2006-12-16 Add reference counting and fixup function names. David Reveman 2006-12-15 Move decor_destroy_shadow. David Reveman 2006-12-12 Fill with transparent black if there's no shadow picture. David Reveman 2006-12-12 Return early if there's no shadow picture. David Reveman 2006-12-12 Snap to output extents. David Reveman 2006-12-12 Fix some memory leaks. David Reveman 2006-12-12 Fix typo. David Reveman 2006-12-12 Compute edge start and end offsets correctly. David Reveman 2006-12-12 Fix typo that caused struts to be ignored. David Reveman 2006-12-12 Add PropertyChangeMask to event_mask for grabWindow so it can be used to get a valid server time stamp. David Reveman 2006-12-12 Don't use border_layout to figure out client window width as it might not be initialized when this function is called. David Reveman 2006-12-12 Snap to window struts instead of workarea. David Reveman 2006-12-12 Fix typo that caused glFinish to not be called before drawing of a new frame and made timing and frame rate throttling incorrect. Mike Cook 2006-12-12 Only hide windows on current output. Mike Cook 2006-12-12 Add initiate_output action, which initiates scale mode only for windows visible on current output. David Reveman 2006-12-11 Add svg plugin. David Reveman 2006-12-11 Remove extension from default image name. David Reveman 2006-12-11 Remove extension from default image name. David Reveman 2006-12-11 Add png to default plugin list. David Reveman 2006-12-11 Add png plugin. David Reveman 2006-12-11 Make image loading extensible. David Reveman 2006-12-10 Send error reply if option doesn't exist. David Reveman 2006-12-10 Send "chenged" signal when and option change value. David Reveman 2006-12-10 Unwrap display functions pointers when finishing. David Reveman 2006-12-10 Add "list" and "getMetadata" members. Always send replies. Based on patch by Mike Dransfield. David Reveman 2006-12-10 Build libdecoration before plugins. David Reveman 2006-12-10 Add optionTypeToString function. David Reveman 2006-12-09 Move decoration property decoding into libdecoration. David Reveman 2006-12-08 Use data structures from decoration.h. David Reveman 2006-12-07 Move DM selection code into libdecoration. David Reveman 2006-12-07 Check for other screen grabs before calling layoutThumbs. David Reveman 2006-12-07 Make sure the headers can be included in C++ code. David Reveman 2006-12-07 Fix source offset. David Reveman 2006-12-07 Add -ldecoration to Libs. David Reveman 2006-12-06 Simple optimization for metacity themes, only redraw shadow background when decoration size changed. David Reveman 2006-12-06 Compute button width properly and don't clip window title when metacity themes is used. David Reveman 2006-12-06 Move draw_simple_shape function into libdecoration. David Reveman 2006-12-06 Add CompActionStateTermEdge if initiated by edge. David Reveman 2006-12-06 Add missing CompActionStateInitButton to initiate actions. David Reveman 2006-12-06 Fix reading of action options. The complete option is now read before the updated value is written back. David Reveman 2006-12-06 Allow event window to be the root window if screen is grabbed. David Reveman 2006-12-05 Revert "Call updateWindowAttributes before windowStateChangeNotify." This reverts commit 19cc3e33baf4b760562b5654359f2a0bee6197d6. David Reveman 2006-12-05 Another try at making the maximize effect work properly. David Reveman 2006-12-05 Fix typo. David Reveman 2006-12-05 Update window size after changing input extents and use server width and height when updating frame window. David Reveman 2006-12-05 Regen compiz.schemas.in. David Reveman 2006-12-05 Make sure switcher window isn't added as a normal window. David Reveman 2006-12-05 Add mipmap option. David Reveman 2006-12-04 Make sure a picture is created for switcher decorations and set stretch offset a bit better. David Reveman 2006-12-04 Compute button locations and titlebar stretch offset correctly for metacity themes. David Reveman 2006-12-04 Stretch decorations from south-east instead. David Reveman 2006-12-04 Trigger maximize effect properly. David Reveman 2006-12-04 Compute window output extents properly. David Reveman 2006-12-04 Call updateWindowAttributes before windowStateChangeNotify. David Reveman 2006-12-04 Remove N_QUADS_MAX. David Reveman 2006-12-04 Finish libdecoration implementation and move gtk-window-decorator over to using it completely. David Reveman 2006-12-04 Apply alignment correctly. David Reveman 2006-11-30 Rewrote decoration opacity code and moved it to libdecoration. David Reveman 2006-11-30 No longer need cairo-xlib-xrender.h. David Reveman 2006-11-30 Rewrite and move a lot more code into libdecoration. David Reveman 2006-11-29 Improve shadow code performance by adding clipping and avoiding opacity step when possible. David Reveman 2006-11-29 Damage output extents correctly when window decorations change. David Reveman 2006-11-29 Move more code into libdecoration. David Reveman 2006-11-29 Do not ignore override_redirect windows. David Reveman 2006-11-29 Move damageWindowOutputExtents so that it's always called. David Reveman 2006-11-29 Use addWindowDamageRect. David Reveman 2006-11-28 Expose decor_shadow_t struct and add pixmap to this struct. David Reveman 2006-11-28 Use decor_context_t structs. David Reveman 2006-11-28 Withdrawn windows that are still visible should be moved. David Reveman 2006-11-28 Move drop-shadow code from gtk-window-decorator to libdecoration. David Reveman 2006-11-28 Regen compiz.schemas.in. David Reveman 2006-11-28 Add hover time option. David Reveman 2006-11-27 Add drag-n-drop hover support to scale plugin. David Reveman 2006-11-27 Add xdndStatusAtom and xdndDropAtom. David Reveman 2006-11-27 Fix placement of scaled icons. David Reveman 2006-11-27 Align. David Reveman 2006-11-27 Use libdecoration functions. David Reveman 2006-11-27 Use decor_set_vert_quad_row and decor_set_horz_quad_line. David Reveman 2006-11-26 Use decor_quads_to_property. David Reveman 2006-11-26 Link to libdecoration. David Reveman 2006-11-26 Use data types in decoration.h. David Reveman 2006-11-26 Add libdecoration and move some initial code from gtk-window-decorator into it. David Reveman 2006-11-25 glxcomp -> compiz. David Reveman 2006-11-22 Regen compiz.schemas.in. David Reveman 2006-11-22 Add initiate_group option. David Reveman 2006-11-22 Pass active window as "window" argument on screen edge events instead of screen edge windows. David Reveman 2006-11-22 Add ScaleType enum and use this enum instead of allWindows boolean. David Reveman 2006-11-22 Use addWindowDamageRect so that damage is reported properly for transformed windows. David Reveman 2006-11-22 Remove damageTransformedWindowRegion and damageWindowRegion. David Reveman 2006-11-22 Remove window scale. David Reveman 2006-11-22 Add addWindowDamageRect function. David Reveman 2006-11-22 Just move input focus when selecting window in scale mode. Activate window when leaving scale mode. David Reveman 2006-11-22 Update ABIVERSION. David Reveman 2006-11-22 Update switcher plugin to use drawWindow function for drawing thumbnails. Thumbnails now include decorations and shadows. David Reveman 2006-11-22 Use lastPaint as paint attributes for drawWindow. Fix thumbnail opacity calculations, current window opacity should not be used when computing new opacity value. David Reveman 2006-11-22 Use lastPaint for drawWindow paint attributes. David Reveman 2006-11-22 Applying fade values in drawWindow was a bad idea. Back out that change and be a bit more efficient and only compute new fade values if steps variable is non-zero. David Reveman 2006-11-22 Makes more sense to update lastPaint in paintWindow function. David Reveman 2006-11-22 Remove whitespaces. David Reveman 2006-11-22 Make thumbnail opacity behave a bit better. David Reveman 2006-11-22 Use drawWindow for window transformations. David Reveman 2006-11-22 Use drawWindow function for window transformations. David Reveman 2006-11-22 Hook into drawWindow and apply current fade values there. David Reveman 2006-11-21 Hook into drawWindow instead of paintWindow. David Reveman 2006-11-21 Add damageTransformedWindowRect function. David Reveman 2006-11-21 Add damageTransformedWindowRegion function. David Reveman 2006-11-21 Init xTranslate and yTranslate to 0.0. David Reveman 2006-11-21 Add xTranslate and yTranslate to WindowPaintAttrib struct. David Reveman 2006-11-21 Add PAINT_WINDOW_NO_CORE_INSTANCE_MASK. David Reveman 2006-11-21 Add drawWindow function. David Reveman 2006-11-21 Post release version increment. David Reveman 2006-11-21 Add entry for 0.3.4 release. David Reveman 2006-11-21 Bump version. David Reveman 2006-11-21 make update-po for upcoming release. David Reveman 2006-11-20 Bump ABI version. David Reveman 2006-11-20 Move input focus to closest ancestor if window doesn't accept focus. David Reveman 2006-11-20 Add pendingMaps variable, which is used to keep track of any pending map notify events. David Reveman 2006-11-20 Make sure any minimized ancestors are made visible when activating a window. David Reveman 2006-11-20 Do not require minimize action when minimizing transients. David Reveman 2006-11-16 Fix typo. David Reveman 2006-11-16 Mulitply matrix.xy and matrix.yx properly. David Reveman 2006-11-15 Regen compiz.schemas.in. Mike Dransfield 2006-11-15 Add a few new shapes to annotate plugin and an action option that can be used to draw these shapes. David Reveman 2006-11-15 Add getColorOptionNamed function. David Reveman 2006-11-14 If output is scaled, add destination output as damage. David Reveman 2006-11-14 Move front buffer update out of the output paint loop. David Reveman 2006-11-14 Remove whitespaces. David Reveman 2006-11-14 Add clearTargetOutput function. David Reveman 2006-11-13 Use clearTargetOutput instead of clearScreenOutput. David Reveman 2006-11-13 Add clearTargetOutput function. David Reveman 2006-11-13 Walk output list backwards in case they are overlapping. David Reveman 2006-11-13 Only move managed windows when switching viewport. David Reveman 2006-11-13 Update to use output workarea. David Reveman 2006-11-13 Fix typo. David Reveman 2006-11-13 Fix event window placement for metacity themes. David Reveman 2006-11-13 Keep line less than 80 columns. David Reveman 2006-11-12 Add support for new metacity theme version and add version checking that also allow us to support metacity versions < 2.15.21. David Reveman 2006-11-11 Check if we have visible region without output and clear color buffers before swapping if that is the case. David Reveman 2006-11-11 Remove cleared variable. David Reveman 2006-11-11 Switch to using clearScreenOutput. David Reveman 2006-11-11 Add clearScreenOutput function. Bellegarde Cedric 2006-11-11 Add zoom factor option. David Reveman 2006-11-11 Remove scale applied at the add geometry stage in wobblyDrawWindowTexture instead of in wobblyPaintWindow. David Reveman 2006-11-11 Use getWorkareaForOutput. David Reveman 2006-11-11 Avoid override redirect windows. David Reveman 2006-11-11 Bump ABI version number. David Reveman 2006-11-11 Regen compiz.schemas.in. David Reveman 2006-11-11 Use the --no-detection option when generating schemas. David Reveman 2006-11-11 Add no detection option. David Reveman 2006-11-11 Make outputs option a list of strings instead of a string. David Reveman 2006-11-11 Update current output after updating output devices. David Reveman 2006-11-11 Detect refresh rate and outputs before initializing plugins. David Reveman 2006-11-11 Move call to updateOutputDevices out of reshape function to avoid it being called twice at startup. David Reveman 2006-11-11 Make sure that refresh rate and outputs are detected when detect_refresh_rate and detect_outputs are set to true. David Reveman 2006-11-11 Compute per output workarea. David Reveman 2006-11-10 Never include override_redirect windows. David Reveman 2006-11-10 Allow moving of windows within the whole desktop area. David Reveman 2006-11-10 Only advance fade one step per time we paint the screen. David Reveman 2006-11-10 Add output offset when making window fullscreen. David Reveman 2006-11-10 Only do size changes on managed windows. David Reveman 2006-11-10 Both width and height must match. David Reveman 2006-11-10 Only sync position if state is SCALE_MODE_IN. David Reveman 2006-11-10 Only care about _NET_WM_STATE changes if window is not managed. David Reveman 2006-11-10 Allow fullscreen action on all windows with wmType Normal. (8958) David Reveman 2006-11-10 Constrain state when receiving property change notify. (8958) David Reveman 2006-11-10 Always avoid windows with wmType that is desktop or dock. David Reveman 2006-11-10 Always avoid windows with wmType that is desktop or dock. David Reveman 2006-11-10 Use wmType instead of type when forcing desktop and dock windows to be visible on all desktops. David Reveman 2006-11-10 showWindow and hideWindow should never do anything with unmanaged windows. Make sure desktop hint is set properly for initially mapped windows and desktop/dock windows. David Reveman 2006-11-09 Focus should only be moved to managed windows and when leaving showing desktop mode only unhide windows that are actually in showing desktop mode. This fixes a really nasty bug that appeared after adding support for multiple desktops. David Reveman 2006-11-09 Remove whitespaces. David Reveman 2006-11-09 Regen compiz.schemas.in. Diogo Ferreira 2006-11-09 Add color option to annotate plugin. David Reveman 2006-11-09 Update ABI version. David Reveman 2006-11-09 Handle output changes. David Reveman 2006-11-09 Call cubeLoadImg on output change notify. David Reveman 2006-11-09 Set fullscreenOutput variable properly. David Reveman 2006-11-09 Fix typo. David Reveman 2006-11-09 Handle output changes. David Reveman 2006-11-09 Add outputChangeNotify function. David Reveman 2006-11-09 Regen compiz.schemas.in. David Reveman 2006-11-09 Add fullscreenOutput variable which is used to determine if there's any output that only covers part of a cube side. David Reveman 2006-11-09 Fix some clone remove issues. David Reveman 2006-11-09 Make sure we grabbed the screen before we check if a window is a 'scale' window. David Reveman 2006-11-09 Use setDefaultViewport. David Reveman 2006-11-09 Make sure every output is within the screen region. David Reveman 2006-11-09 Add detect_outputs and outputs options, which gives full control over each outputs framebuffer region. Very useful for testing of multiple outputs. David Reveman 2006-11-09 Set struts on clone input stealing windows. David Reveman 2006-11-09 Make it so input only windows can internally have struts set. David Reveman 2006-11-08 Regen compiz.schemas.in. David Reveman 2006-11-08 Update ABI version. Mike Cook 2006-11-08 Compute xTranslate and yTranslate correctly for output specific zoom. David Reveman 2006-11-08 Scale all visible windows and not only those visible on the current output. David Reveman 2006-11-08 Switch between all visible windows and not only those visible on the current output. David Reveman 2006-11-08 Release grab on terminate action and handle window movement while in scale mode properly. David Reveman 2006-11-07 Send viewport move request if selected window is not on current viewport. David Reveman 2006-11-07 Add initiate_all option. David Reveman 2006-11-07 Fix typo. David Reveman 2006-11-07 Don't use gdk_color_parse as color string contains an alpha value. David Reveman 2006-11-07 Update current output when receiving MotionNotify events. David Reveman 2006-11-07 Regen compiz.schemas.in. Mirco Muller 2006-11-07 Add shadow color option. David Reveman 2006-11-07 Regen compiz.schemas.in. David Reveman 2006-11-07 Add clone plugin which can be used to clone outputs in a convenient way. Currently more of a prototype as we need randr++ and input transformation in the server to do this properly. David Reveman 2006-11-07 Add initial annotate plugin. David Reveman 2006-11-07 Remove whitespaces. David Reveman 2006-11-07 Fix so that screenshot plugin works with multiple outputs. David Reveman 2006-11-07 Track paintTransformedScreen changes. David Reveman 2006-11-07 Make zoom per output. David Reveman 2006-11-07 Add region to paintTransformedScreen arguments. Add ApplyScreenTransform function so that plugins can do more advanced transformations. Add cleared flag to keep track of if the screen has been cleared or not when painting multiple outputs. Update cube plugin to use these things and handle multiple outputs better. David Reveman 2006-11-07 Remove whitespaces. David Reveman 2006-11-07 Add getWorkareaForOutput and use it to maximize windows properly. David Reveman 2006-11-01 Set viewport correctly. David Reveman 2006-11-01 Remove --test-mode from usage message as it doesn't exist anymore. David Reveman 2006-11-01 Whitespace changes. David Reveman 2006-11-01 Whitespace changes. David Reveman 2006-11-01 Disable _NET_WM_SYNC_REQUEST protocol for override_redirect windows. David Reveman 2006-10-31 Increment ABI version. David Reveman 2006-10-31 Allow horizontal desktop size 2 and greater. David Reveman 2006-10-31 Add multi-head support and handle small desktop sizes better. David Reveman 2006-10-31 Handle multi-head better. David Reveman 2006-10-31 Handle multi-head better. David Reveman 2006-10-31 Add getCurrentOutputExtents function. David Reveman 2006-10-30 Use output->width and output->height. David Reveman 2006-10-30 Use output->width and output->height. David Reveman 2006-10-30 Add width and height fields to CompOutput. David Reveman 2006-10-30 Set viewport to output device region before painting each output and only call glClear once when painting multiple outputs. David Reveman 2006-10-30 Set output name correctly. David Reveman 2006-10-28 Fix handling of _NET_DESKTOP_GEOMETRY client messages. David Reveman 2006-10-27 Initial support for multiple desktops. David Reveman 2006-10-27 Fix DEFAULT_PLUGINS list. David Reveman 2006-10-27 Handle desktop width less than 4 times the screen better. David Reveman 2006-10-27 Make zoom plugin work without "largedesktop" feature. David Reveman 2006-10-27 Don't initiate any animations when desktop width is less then 4 times the screen. Mike Dransfield 2006-10-25 Add basic compiz event support. David Reveman 2006-10-25 Regen compiz.schemas.in. David Reveman 2006-10-25 Add edgeButton, which can be used to require a button press for edge actions to be triggered. David Reveman 2006-10-20 Post release version increment. David Reveman 2006-10-20 Update ABI version. David Reveman 2006-10-20 Add entry to NEWS file for upcoming release. David Reveman 2006-10-20 Bump version for upcoming release. David Reveman 2006-10-20 Make update-po for upcoming release. David Reveman 2006-10-20 Fix typo. David Reveman 2006-10-20 Grab the server to make sure that we send correct attributes to override redirect windows. Thierry Reding 2006-10-20 Make sure metacity theme could be loaded. David Reveman 2006-10-18 Make moveInputFocusToWindow handle WM_TAKE_FOCUS hint properly. Mirco Muller 2006-10-17 Start- and end-color-stop for the skydome fallback gradient options. David Reveman 2006-10-17 Create a new texture object everytime we release the window from the existing texture object. David Reveman 2006-10-17 Allocate texture objects separately from window objects. David Reveman 2006-10-17 Remove _NET_WM_STATE_DEMANDS_ATTENTION hint when window receives focus. David Reveman 2006-10-17 Add reference counting to texture objects. David Reveman 2006-10-17 Add createTexture and destroyTexture. David Reveman 2006-10-16 Update ABIVERSION. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use serverWidth and serverHeight. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use largest of 2D and RECT texture targets max size for maxTextureSize. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth in sendSyncRequest. David Reveman 2006-10-16 No need for a special case for override_redirect windows. David Reveman 2006-10-16 Use serverWidth, serverHeight, serverBorderWidth in moveResizeWindow. David Reveman 2006-10-16 Set serverWidth, serverHeight and serverBorderWidth of override_redirect windows when we get a ConfigureNotify. David Reveman 2006-10-16 Avoid unnessecary synchronization when sending synthetic configure notify events. David Reveman 2006-10-16 Add serverWidth serverHeight and serverBorderWidth, which are always updated when we send a configure request. David Reveman 2006-10-13 Less annoying defaults for rotate plugin. David Reveman 2006-10-13 Make sure invprec is greater than 0. David Reveman 2006-10-13 Add texCoordSize and indexCount to CompWindow struct. David Reveman 2006-10-11 Regen compiz.schemas.in. David Reveman 2006-10-11 Fix typo. David Reveman 2006-10-11 Don't allow maximize, minimize and fullscreen actions on util and toolbar windows. David Reveman 2006-10-11 Don't use versionsort. David Reveman 2006-10-11 Fix so that moveResizeWindow is allowed to do size changes for non-maximized windows without going through addWindowSizeChanges. Having all size changes go through addWindowSizeChanges is obviously wrong. David Reveman 2006-10-11 Regen compiz.schemas.in. David Reveman 2006-10-11 Fix typo. David Reveman 2006-10-11 Only allow size changes added by addWindowSizeChanges. David Reveman 2006-10-11 Add ignore_hints_when_maximized option, which makes compiz ignore size increment and aspect hints for maximized windows. Default value is 'true' as this behavior seems more common. Set to 'false' for previous behavior. David Reveman 2006-10-11 Add support for maximized frame layout when using metacity themes. David Reveman 2006-10-11 Wrap windowStateChangeNotify and update input extents properly. David Reveman 2006-10-11 Add windowStateChangeNotify function. David Reveman 2006-10-11 Add maximized input extents to decoration property. David Reveman 2006-10-11 Add version handling to decoration interface. moppsy 2006-10-11 Add raise_window option. David Reveman 2006-10-11 Add gwd.schemas.in. David Reveman 2006-10-10 Regen compiz.schemas.in. David Reveman 2006-10-10 Fix creation of schema file for gconf plugin. David Reveman 2006-10-10 Add opacity support to metacity theme implementation. David Reveman 2006-10-10 Kill whitespaces. Mike Dransfield 2006-10-10 Add deactivate member to dbus plugin. David Reveman 2006-10-09 Add 'command' option to decoration plugin. It can be used to automatically launch a decorator when one isn't already running. Guillaume 2006-10-09 Add plugin feature interface. David Reveman 2006-10-07 Don't unref the dbus connection returned by dbus_get_bus. David Reveman 2006-10-06 dbus_connection_close -> dbus_connection_unref. David Reveman 2006-10-06 Don't call updateWindowAttributes when motif hints change. David Reveman 2006-10-05 Add configuration support to dbus plugin. David Reveman 2006-10-05 int -> Bool David Reveman 2006-10-04 Use stringToColor and colorToString. David Reveman 2006-10-04 Add more utility functions. David Reveman 2006-10-04 Fix memory leak. David Reveman 2006-10-04 Remove gconf-compiz-utils.c and gconf-compiz-utils.h. David Reveman 2006-10-04 Remove use of gconf-compiz-utils.c. David Reveman 2006-10-04 Remove use of gconf-compiz-utils.c. David Reveman 2006-10-04 Add some string utility functions. David Reveman 2006-10-03 Add snap_inverted option to wobbly plugin. David Reveman 2006-10-03 post-release version increment. David Reveman 2006-10-02 Prepare for 0.2.0 release. David Reveman 2006-10-02 Use DESTDIR and add uninstall-local. David Reveman 2006-10-02 Fix minor memory leak. David Reveman 2006-10-02 Initialize decoration structure properly. David Reveman 2006-10-02 Require version 2.15.21 or greater of metacity for metacity theme support. David Reveman 2006-10-02 Only run install target when gnome support is built. Merge: 7467fff aa070f1 Kristian Høgsberg 2006-09-29 Merge branch 'master' of git.freedesktop.org:/git/xorg/app/compiz Kristian Høgsberg 2006-09-29 Regenerate compiz.schemas.in Had to hand-edit out plane from list of default plugins, since it conflicts with the cube plugin. David Reveman 2006-09-29 Fix typo. David Reveman 2006-09-29 make update-po David Reveman 2006-09-29 Remove old files from EXTRA_DIST. David Reveman 2006-09-29 Only install settings module and desktop file if file permissions allow it. David Reveman 2006-09-29 Don't build kde code by default. David Reveman 2006-09-29 Do correct placement of button event windows when using metacity themes. David Reveman 2006-09-29 Set decoration extents properly for metacity themes. David Reveman 2006-09-28 Don't try to build gnome or metacity support when gtk support is disabled. David Reveman 2006-09-28 Always invoke AM_GCONF_SOURCE_2 so that GCONF_SCHEMAS_INSTALL gets defined. David Reveman 2006-09-27 novell.png -> freedesktop.png Søren Sandmann 2006-09-27 Add 'plane' plugin. A new plugin that pans the viewport around a planar workspace instead of the cube. It's a more toned down transition effect and is more similar to the metacity workspace model. Kristian Høgsberg 2006-09-26 Prepares for workspace that's more than one viewport high. This patch adds an extra dimension to the viewport position. This allows plugins to pan the viewport vertically too. David Reveman 2006-09-26 Add output argument to PaintScreen and PaintTransformedScreen functions. David Reveman 2006-09-26 Paint each output device separately, this is the key to making it easy for plugins to do interesting things on multihead setups. David Reveman 2006-09-26 Add missing Makefile.am. David Reveman 2006-09-25 Change so that each output device contains a region instead of a rectangle. David Reveman 2006-09-25 Make placement plugin respect current output device. David Reveman 2006-09-25 Set current output device when receving button and key press events. David Reveman 2006-09-25 Initial support for multiple output devices. David Reveman 2006-09-25 Query xinerama info. David Reveman 2006-09-25 Add build option gtk. David Reveman 2006-09-22 Move gnome specific files into gtk/gnome directory. David Reveman 2006-09-22 Rename gnome directory to gtk. David Reveman 2006-09-22 Rename gnome-window-decorator to gtk-window-decorator. David Reveman 2006-09-22 Use libmetacity-private for metacity theme support. David Reveman 2006-09-22 Only build overlay window support if composite library version is greater than 0.3. Merge: 0d7895a 5399094 David Reveman 2006-09-21 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2006-09-21 Remove compiz.desktop, it shouldn't be in repository. David Reveman 2006-09-21 Add METACITY_THEME_DIR David Reveman 2006-09-21 Initial support for metacity themes. David Reveman 2006-09-21 Remove redundent code. David Reveman 2006-09-21 Add metacity theme support settings module David Reveman 2006-09-21 Get name right Kristian Høgsberg 2006-09-20 Only use fbconfigs that have a corresponding visual with matching depth. Kristian Høgsberg 2006-09-20 Drop minmized windows to the end of the window switcher list. Kristian Høgsberg 2006-09-20 Fix corner cases with big titlebar fonts. compiz misplaces the decoration input regions for big titlebar fonts. To reproduce this, try selecting a 20px titlebar font and notice that the upper or lower part of the titlebar does not receive input events. Kristian Høgsberg 2006-09-20 Tighten the double click criteria. If the distance between the two clicks are greater than 8 pixels it is not regarded as a double click. This is in line with how GTK+ detects double clicks. There's an X root window property or similar that defines the distance and ideally we should read that out, but for now the patch brings the behavior a little closer to what it should be. Kristian Høgsberg 2006-09-20 Only activate button actions on left click. Right now all mouse buttons activate the titlebar button action (minimize, maximize, close), which is a bit unusual. Metacity only activates the action on left click and opens the window menu for right clicks. This patch just disables the button actions for anything else but left clicks. Kristian Høgsberg 2006-09-20 Add support for the composite overlay window. Add support for using the composite overlay window for GL output instead of rendering to the root window. This is lets compiz run on AIGLX without the _COMPIZ_GL_INCLUDE_INFERIORS hack that we used to have. The patch defaults to using the root window but adds a '--use-cow' command line option to make compiz use the overlay window. David Reveman 2006-09-19 Get relative movement right. David Reveman 2006-09-19 syncWindowPosition should always send requests to the server as there might be pending configure requests that we have not got notifications for yet, hence no way that we can know if the server position is up to date. David Reveman 2006-09-19 Add Swedish translation. David Reveman 2006-09-19 Add version handling to plugin system. David Reveman 2006-09-15 Allow return key to still be used for key-bindings. David Reveman 2006-09-15 Replace novell logo image with freedesktop logo image. David Reveman 2006-09-15 Mark window as placed when we get a configure request with X, Y set. David Reveman 2006-09-15 Add sync to vblank support. David Reveman 2006-09-01 Check for C++ compiler, KDE decorator needs it. David Reveman 2006-09-01 Fix typo. Kristian Høgsberg 2006-08-22 Don't use cmSnAtom before it's initialized. Kristian Høgsberg 2006-08-17 Update keybindings for move and resize to work more like metacity. David Reveman 2006-08-22 Remove useless code. (bug 7833) David Reveman 2006-08-22 Fix typo. David Reveman 2006-08-22 Allow override-redirect windows to support sync request protocol. David Reveman 2006-08-22 Add writePngToFile function, which is used by screenshot plugin. David Reveman 2006-08-08 Switch to using librsvg instead of libsvg-cairo. David Reveman 2006-08-08 Add screenshot plugin. David Reveman 2006-08-08 Set tooltip window type hint when using gtk >= 2.10. David Reveman 2006-07-25 Regen compiz.schemas.in. David Reveman 2006-07-25 Make sure things work as before adding new override-redirect window types. David Reveman 2006-07-25 Make sure things work as before adding new override-redirect window types. David Reveman 2006-07-25 Make sure things work as before adding new override-redirect window types. David Reveman 2006-07-25 Get window type hint for override-redirect windows as well. David Reveman 2006-07-25 Fix typo. David Reveman 2006-07-25 Add new override-redirect window types. David Reveman 2006-07-24 Make it possible to wrap plugin loading functions. David Reveman 2006-07-24 Remove fd watch when being unloaded. David Reveman 2006-07-24 Regen compiz.schemas.in. David Reveman 2006-07-24 Add line action to water plugin. David Reveman 2006-07-24 Add point action to water plugin. David Reveman 2006-07-24 Add support for floating arguments. David Reveman 2006-07-24 Add basic dbus plugin. David Reveman 2006-07-24 Fix rotateToTithWindow action. David Reveman 2006-07-24 Use active window by default. David Reveman 2006-07-23 Regen compiz.schemas.in. David Reveman 2006-07-23 All binding options are now finally converted to action options, removing all code related to the old CompBinding option. David Reveman 2006-07-23 Convert all core bindings to actions. David Reveman 2006-07-23 Position window menu at top left corner of window when no button. David Reveman 2006-07-23 Check ROTATE_DISPLAY_OPTION_TO_12 as well. David Reveman 2006-07-23 Unsnap from top on global terminate. David Reveman 2006-07-22 Add shiver action and remove visual bell option. David Reveman 2006-07-22 Make wobbly plugin use new action system. David Reveman 2006-07-22 Make switcher plugin use new action system. David Reveman 2006-07-22 Make zoom plugin use new action system. David Reveman 2006-07-22 Release move window when initiating new rotation. Merge: ab1e71e 7e81888 David Reveman 2006-07-21 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: plugins/compiz.schemas.in.in plugins/cube.c plugins/rotate.c David Reveman 2006-07-21 Make rotate plugin use new action system. David Reveman 2006-07-21 Add CompActionStateInitEdgeDnd, CompActionStateTermEdgeDnd and make sure that actions are triggered correctly on edge-leave. David Reveman 2006-07-21 Make sure we don't configure not yet managed windows. Dan Winship 2006-07-20 Update new edges stuff for new l10n stuff and fix compiz.schemas to use the configure-specified scale corner again Merge: 43046fc 47f5066 Dan Winship 2006-07-20 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: plugins/compiz.schemas.in.in plugins/gconf-dump.c plugins/scale.c Dan Winship 2006-07-20 Improve the localization of compiz.schemas (bnc 176752) Instead of using intltool to parse and translate the generated compiz.schemas, we now mark the strings for translation in the code, and directly generate a localized schemas file, leaving untranslated the bits that need to be untranslated. David Reveman 2006-07-20 Make next_slide and prev_slide action options. David Reveman 2006-07-20 Fix typo David Reveman 2006-07-20 Make unfold binding in cube plugin an action option. David Reveman 2006-07-20 Read edge key when initializing action options. David Reveman 2006-07-19 Add screen edge bindings to action system and make scale plugin use it. David Reveman 2006-07-18 Change so that initiate action doesn't toggle scale mode and change default key-binding to ctrl-alt-up. David Reveman 2006-07-18 Make sure no other screen grab than rotate, switcher or cube exists before unfolding the cube. David Reveman 2006-07-18 Do not set WM_STATE hint on override redirect windows. This should fix issue with menus not showing up in QT4 apps. Merge: 9614f59 d4a51dd David Reveman 2006-07-18 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Quinn Storm 2006-07-18 Fix equality check for action options. David Reveman 2006-07-18 Don't free existingValue in switch statement. David Reveman 2006-07-18 Fix typo (Alp Toker) Dan Winship 2006-07-18 fix stacking logic so fullscreen windows still stay above dock when they have transients. David Reveman 2006-07-17 Initialize bind type correctly. David Reveman 2006-07-17 Index tail array correctly and move underscore to g_strdup_printf line. David Reveman 2006-07-17 Improve placement algorithm in scale plugin and make default spacing 10. David Reveman 2006-07-13 Only quit if selection clear event is for the decoration manager selection. David Reveman 2006-07-13 Don't run placement algorithm on windows that can't be moved by the user. David Reveman 2006-07-13 Add Mofif function hint support. David Reveman 2006-07-12 Don't call finiWindow or finiPluginForScreen in finiPlugin. These functions are now called from finiPluginForDisplay and finiPluginForScreen. David Reveman 2006-07-07 Add CM selection support. David Reveman 2006-07-07 Regen compiz.schemas.in.in. David Reveman 2006-07-07 Update scale plugin to use new action system. David Reveman 2006-07-06 Add wiper effect to water plugin. David Reveman 2006-07-06 Rearrange plugin initialization so that window are initialized in initPluginForScreen and screens are initialized in initPluginForDisplay. David Reveman 2006-07-05 Minor cleanup. David Reveman 2006-07-05 Implement gconf support for bell part of action system. David Reveman 2006-07-05 Check that bell is equal. David Reveman 2006-07-05 Fix typo David Reveman 2006-07-05 Make visual bell an normal action. David Reveman 2006-07-05 Handle bell notify events. David Reveman 2006-07-04 Add bell field to action option. David Reveman 2006-07-04 Update water plugin to use new action system. David Reveman 2006-07-04 Add root window option. David Reveman 2006-07-03 Update gconf code to handle CompAction options properly and regenerate compiz.schemas.in.in. David Reveman 2006-07-03 Update to use new action system. David Reveman 2006-07-03 Update move plugin to use new call-back based action system instead of the old deprecated binding system. David Reveman 2006-07-03 Add setDisplayAction function. David Reveman 2006-07-03 Implement call-back based key/button binding system. David Reveman 2006-07-03 Select for xkb state notify events. David Reveman 2006-07-03 Add getPlugins function. David Reveman 2006-07-03 Remove trailing whitespaces. David Reveman 2006-07-03 Add compSetActionOption. David Reveman 2006-07-03 Add addScreenAction and removeScreenAction functions. David Reveman 2006-07-03 Add escapeKeyCode to CompDisplay structure. David Reveman 2006-07-03 Add get-*-OptionNamed functions. David Reveman 2006-07-03 Add CompAction option. David Reveman 2006-07-03 Explicitly set CompBindingType enumeration values so it is clear that it can now be used as a bit mask. David Reveman 2006-07-03 Insert new screens at end. David Reveman 2006-07-03 Make eventLoop function handle multiple screens correctly. David Reveman 2006-07-03 Move screen specific variables into CompScreen structure. David Reveman 2006-07-03 Share textures and display lists with first context. Dan Winship 2006-06-29 update David Reveman 2006-06-21 Protect against circular transient dependencies David Reveman 2006-06-20 Constrain window dimensions David Reveman 2006-06-20 Trap X errors Dan Winship 2006-06-20 You forgot Poland. David Reveman 2006-06-16 Fix default window types in switcher and scale plugins David Reveman 2006-06-16 Handle motif WM hints better David Reveman 2006-06-15 Fix zooming in switcher plugin when cube plugin is not loaded David Reveman 2006-06-15 Add DM selection support and fix window button highlighting issue Dan Winship 2006-06-14 Mark cube as needing to load before switcher rather than marking switcher as requiring cube. bnc #183676. Output load_before and requires for all plugins, even if the list is empty, to ensure that an empty value in a new release overrides a non-empty value in an older release. regen Dan Winship 2006-06-09 add translations David Reveman 2006-06-09 Allow windows to be both maximized and shaded David Reveman 2006-06-09 constrain window geometry in configure requests correctly David Reveman 2006-06-08 Fix some shading restrictions David Reveman 2006-06-08 Handle initially shaded windows correctly David Reveman 2006-06-08 Fix issue that caused switcher window to sometimes not be visible David Reveman 2006-06-08 Handle quick unshade shade better David Reveman 2006-06-07 kill whitespace David Reveman 2006-06-07 Bump version David Reveman 2006-06-07 Add window shading David Reveman 2006-06-07 Regen compiz.schemas.in.in David Reveman 2006-06-07 Disable client-side texture coordinate arrays that are not used David Reveman 2006-06-07 Add initiate_keyboard bindings to move and resize plugins David Reveman 2006-06-06 Fix so switcher is not forcing fullscreen updates David Reveman 2006-06-06 Fix fullscreen window positioning issue David Reveman 2006-06-06 Clean up class hint handling David Reveman 2006-06-02 Bump version David Reveman 2006-06-02 Fix typo David Reveman 2006-06-02 Hide tooltips on NotifyGrab Dan Winship 2006-06-01 If we receive a _NET_SHOWING_DESKTOP request with no window set, set the flag on all screens. (Fixes the KDE "show desktop" applet.) Also, don't allow a client to change its _NET_WM_DESKTOP. Set _NET_WM_DESKTOP on all windows to 0; KDE's pager and tasklist require this to be set. (bnc 178320) David Reveman 2006-06-01 Add updateWindowClass David Reveman 2006-05-31 Save initial viewport when startup notification is received and add hide_skip_taskbar_windows option David Reveman 2006-05-31 Fix skydome animation David Reveman 2006-05-31 Fix clipping issue David Reveman 2006-05-31 Fix issue with moving windows using keyboard David Reveman 2006-05-31 Add GL_CFLAGS to INCLUDES Dan Winship 2006-05-30 call moveInputFocusToOtherWindow() before destroyWindow() when processing a DestroyNotify, or else the input focus can get stranded. Dan Winship 2006-05-30 Check libwnck for wnck_window_has_name (new in HEAD). #if HAVE_WNCK_WINDOW_HAS_NAME, redefine wnck_window_get_name to return NULL if the window only has a fallback name. bnc 173059. David Reveman 2006-05-26 Make sloppy focus default in scale mode David Reveman 2006-05-26 Handle dock windows with below state better David Reveman 2006-05-25 Make sure all visible cube sides are rendered when we have more than 4 sides David Reveman 2006-05-25 Regen compiz.schemas.in.in David Reveman 2006-05-25 Add missing changelog entry for last commit David Reveman 2006-05-25 Add maximize_window_horizontally, maximize_window_vertically, toggle_window_maximized, toggle_window_maximized_horizontally and toggle_window_maximized_vertically bindings David Reveman 2006-05-25 Make switcher plugin behave better when new windows appear and disappear David Reveman 2006-05-24 Fix key-navigation in scale plugin David Reveman 2006-05-23 Fix BigEndian issues Dan Winship 2006-05-23 use ss->windows here as well so that multiple activeNum==0 windows don't get skipped. (switchTerminate): Remove the screen grab right away so that keystrokes don't get dropped. bnc 177650 (switchPreparePaintScreen, switchPaintScreen, switchDonePaintScreen): update for that Dan Winship 2006-05-22 deal with both vertical and horizontal struts; but not when moving a dock window Dan Winship 2006-05-22 Check init_all binding before init, so you can bind "" to init_all and so end up with "Tab" being init_all rather than init (but with no way to get "init"...). bnc 173376 David Reveman 2006-05-21 Select for button events on root windows David Reveman 2006-05-21 Bump version David Reveman 2006-05-21 Fix shadow performance David Reveman 2006-05-21 Fix stacking and sync request issues David Reveman 2006-05-19 Allow use of larger window icons in switcher Dan Winship 2006-05-18 Set this to "None" to match wobblyInitScreen() so that it actually works right. regen Dan Winship 2006-05-18 s/compiz.schemas.in/compiz.schemas.in.in/ Dan Winship 2006-05-18 if we have a RestartCommand registered with the session manager, update the --sm-client-id in it to match the id we were assigned. bnc 176746 remove unused --sm-save-file arg and fix documentation of --sm-client-id. David Reveman 2006-05-17 Make default background black David Reveman 2006-05-17 Regen David Reveman 2006-05-17 Fix issue with switcher decorations David Reveman 2006-05-17 width and height should be unsiged David Reveman 2006-05-17 Add minimal option David Reveman 2006-05-17 Restore window position when transitioning to withdrawn state David Reveman 2006-05-17 Fix key-bindings and add icon support to switcher Dan Winship 2006-05-17 don't process exit-on-selection-clear until the event queue is empty, or else MapRequest and ConfigureRequest events could get lost. bnc 175558 David Reveman 2006-05-14 Fix unmap issue David Reveman 2006-05-12 Make handling of windows that go into withdrawn state a bit better and minor fixes to switcher and show desktop mode David Reveman 2006-05-12 Handle gravity correctly David Reveman 2006-05-11 Move server grab David Reveman 2006-05-11 Fix window positioning issue and un-maximize issue David Reveman 2006-05-11 Make sure title text fit in titlebar David Reveman 2006-05-11 Add missing ChangeLog entries David Reveman 2006-05-11 Fix window action menu issues Dan Winship 2006-05-11 Treat "" as meaning "disabled" David Reveman 2006-05-11 Fix window placement David Reveman 2006-05-09 Make sure window is mapped when getting the window pixmap David Reveman 2006-05-09 Fix mipmapping David Reveman 2006-05-08 Allow switcher to be initiated with prev bindings David Reveman 2006-05-07 Regen compiz.schemas.in.in David Reveman 2006-05-07 Minimized windows and icon support in switcher Dan Winship 2006-05-07 Add --with-scale-corner option and make compiz.schemas reflect it; the best corner to use depends on where the panels are and what's on them, so distros will want to override this to match their default panel layout. Dan Winship 2006-05-07 Fix the the "water plugin gets mysteriously activated when activating some other keybinding" bug. Dan Winship 2006-05-05 require intltool for option-description translation translate compiz.schemas.in into compiz.schemas Dan Winship 2006-05-05 Put numbers into the shortDescs of the command and run_command options Use Shift rather than Control, for consistency with Metacity, and to remove the ambiguity about whether Ctrl+Alt+Button1 should be "grab cube" or "move with snapping". (bnc 169402) regen David Reveman 2006-05-05 Regen compiz.schemas David Reveman 2006-05-05 Add audible and visual bell support David Reveman 2006-05-04 Fix issue with modal dialogs David Reveman 2006-05-03 Don't constrain the cursor David Reveman 2006-05-03 Add defaultViewportForWindow function David Reveman 2006-05-02 Minor fix to cube unfolding David Reveman 2006-05-02 Don't send synthetic ConfigureNotify events and handle ConfigureRequests correctly for withdrawn windows Dan Winship 2006-05-02 rewrite to make compiz.schema regeneration a little easier, and to make it possible to generate schema files for third-party plugins. Include plugin descriptions and dependency information in the schema. add a rule to generate compiz.schemas regen s/expose/scale/ in dependencies David Reveman 2006-05-02 Don't use glproto David Reveman 2006-05-02 Update to latest EXT_tfp spec David Reveman 2006-05-01 Fix window stacking bug David Reveman 2006-04-30 Raise-on-click option, DnD aware screen edges, zoom functionality in switcher, cube unfolding feature and some bug fixes David Reveman 2006-04-28 Add workaround for 64bit issue in libXrender David Reveman 2006-04-28 Back out type change in g-w-d David Reveman 2006-04-28 Add show desktop binding David Reveman 2006-04-28 Screen grab updates and reset timeout handle correctly in rotate plugin Dan Winship 2006-04-28 tweak eventMatches slightly to allow extra modifiers to be down when recognizing a modifier keypress. (Eg, don't require the user to release Alt before pressing Control to get window snapping.) Dan Winship 2006-04-28 new method that replaces EV_KEY and EV_BUTTON. Tests if an event matches a binding, being more precise about modifier state than EV_KEY and EV_BUTTON were. (eventTerminates): Tests if an event is "the opposite" of a binding. (Eg, button or modifier key release.) Replaces CompReleaseMask and "terminate" bindings. (handleEvent): Use eventMatches When passed a keybinding containing just modifiers, grab/ungrab every keypress event that would result in that modifier state (eg, both left and right modifier keys, and allow them to be pressed in any order). Remove CompPressMask from default bindings. (eventLoop): don't add virtual modifiers to event state. (updateModifierMappings): store the XModifierKeymap for later use. Use eventMatches and eventTerminates. Remove CompPressMask and "terminate" bindings (except from scale, which is different from the others). Make initiate_all be just the modifier key used in addition to the initiate binding (""). Remove next_window since it doesn't make a lot of sense to have it be different from initiate_all, and make prev_window be just a modifier key as well. (""). (SwitchScreen): add extra options to store the fully-composed initiate_all, prev, and prev_all bindings. (switchScreenInitOptions, switchSetScreenOption): Generate and regenerate initiate_all, prev, and prev_all bindings as needed. (switchHandleEvent): update Remove "" handling. regen, dropping the terminate bindings and updating a few others. remove CompPressMask, CompReleaseMask, EV_BUTTON, and EV_KEY. Add eventMatches, eventTerminates, and keycodeToModifiers. Add modMap field to CompDisplay. David Reveman 2006-04-28 Handle enter/leave notify events David Reveman 2006-04-28 Minor fix to decoration plugin David Reveman 2006-04-28 Lower xrender version requirement and fix 64bit issue in g-w-d David Reveman 2006-04-28 Shut up compiler Dan Winship 2006-04-27 for the rotate-to-specific-face keys, rotate counterclockwise when that's faster. (bnc 169427) Make the corners toggle scale mode rather than only activating it. (bnc 169408) David Reveman 2006-04-27 Bump version David Reveman 2006-04-27 Remove debug variable David Reveman 2006-04-27 Check if window is initially minimized David Reveman 2006-04-27 Add proper warp pointer interface and maximize effect to wobbly plugin Dan Winship 2006-04-26 activate window on Button2 click in addition to Button1 and Button3. Dan Winship 2006-04-26 gconf_value_compare against the old value for list-type options too. (gconfInitOption): Change the call to gconf_client_get_entry to request the default value again; the fix to gconfSetOption will prevent the infinite loops that happened before. David Reveman 2006-04-26 Remove comment David Reveman 2006-04-26 Maximized windows snap-off support and pointer warp fixes David Reveman 2006-04-25 Add clamp, min size to decoration property and make g-w-d use them David Reveman 2006-04-25 Click on background leaves scale mode and enters show desktop mode David Reveman 2006-04-25 Initialize scale and translate properly David Reveman 2006-04-25 Fix issue with _NET_SHOWING_DESKTOP support David Reveman 2006-04-24 Add missing break statement David Reveman 2006-04-24 Initialize rotateHandle David Reveman 2006-04-24 Another fix for paintScreen Dan Winship 2006-04-24 clarify the "initiate" descriptions regen David Reveman 2006-04-24 Fix window animation issue David Reveman 2006-04-24 Allow hiding of windows and use it in switcher plugin to avoid unnecessary redrawing of decorations David Reveman 2006-04-24 Add configurable drop-shadows Dan Winship 2006-04-20 add 12 go-directly-to-cube-face and 12 go-directly-to-cube-face-with-window bindings. fix the binding type on WINDOW_MENU. Regen. (lower_window, window_menu, scale_image, images, resize, flip_move, move_window_types, and the new rotate bindings) David Reveman 2006-04-20 Add force quit dialog David Reveman 2006-04-20 Add window menu binding David Reveman 2006-04-20 Add toolkit actions David Reveman 2006-04-20 Fix handling of modal dialogs David Reveman 2006-04-19 Fix gnome-theme-manager crash David Reveman 2006-04-18 Remove window-image option David Reveman 2006-04-18 Add strict-binding option Dan Winship 2006-04-18 Rearrange #includes to prevent warning about TRUE and FALSE being redefined Dan Winship 2006-04-18 Fix a crasher in the screenshot binding code (and rename some of the #defines to make them not so ridiculously long). Also temporarily hack around a bug in EV_KEY by putting the check for WINDOW_SCREENSHOT before the check for SCREENSHOT. Change the keybinding again, now to "Pause". (F11 is the "fullscreen mode" binding for many apps.) update Rearrange #includes to prevent warning about TRUE and FALSE being redefined David Reveman 2006-04-18 Changed default value of flip_move option David Reveman 2006-04-18 Dynamic positioning of title bar buttons David Reveman 2006-04-18 Fix typo David Reveman 2006-04-18 Fix typo David Reveman 2006-04-18 Fix window resizing issues David Reveman 2006-04-17 PNG on top face of cube by default David Reveman 2006-04-17 Remove window.png David Reveman 2006-04-17 Support for PNGs on top face of cube and an option for scaling the image or not David Reveman 2006-04-15 Fix default option in wobbly plugin David Reveman 2006-04-15 Fix crash in water plugins software backend Dan Winship 2006-04-14 add "water" to gconfDeps regen including the water options David Reveman 2006-04-14 Add support for automatic unredirecting of fullscreen windows David Reveman 2006-04-14 Do not initiate scale mode when no windows should be scaled David Reveman 2006-04-13 Allow 4-way resize Dan Winship 2006-04-13 Request the default value of the key from gconf, rather than initializing the key to the internal default value if it hasn't yet been set by the user. Notably, this makes it so that "compiz gconf" on a new account will use the default value of active_plugins rather than the (effectively empty) list of plugins on the command line. (It also makes it so that the sysadmin can override defaults via sabayon or whatever.) Dan Winship 2006-04-13 fix the gravity handling so self-resizing windows don't dance (although I'm pretty sure this is a symptom of mishandling gravity somewhere else). Dan Winship 2006-04-13 take a timestamp and pass that to the panel rather than using CurrentTime update for that David Reveman 2006-04-13 Disable draw synchronization on map David Reveman 2006-04-13 Enable draw synchronization on map David Reveman 2006-04-13 Patch from danw David Reveman 2006-04-11 Fix typo David Reveman 2006-04-10 Initial support for _NET_WM_USER_TIME, gconf updates and a focus fix David Reveman 2006-04-09 gconf updates David Reveman 2006-04-09 Remove test mode David Reveman 2006-04-09 Remove schema from CLEANFILES David Reveman 2006-04-09 Improve documentation for runcommand keys slightly David Reveman 2006-04-09 Switch to using GLX 1.3 David Reveman 2006-04-08 Add rain delay option David Reveman 2006-04-07 ChangeLog entry for last commit David Reveman 2006-04-07 Dump list options correctly David Reveman 2006-04-07 Add flip_move option to rotate plugin David Reveman 2006-04-07 Fix a few issues in scale plugin David Reveman 2006-04-07 Add gconf-compiz-utils.h to sources David Reveman 2006-04-07 Bump version David Reveman 2006-04-07 Schemas for gconf plugin and make key-button bindings display options instead of screen options David Reveman 2006-04-07 Add edge flipping to rotate plugin and hot corners to scale plugin David Reveman 2006-04-06 Add screen edges David Reveman 2006-04-06 Only stack normal windows above fullscreen windows when they are activated and fix issue in switcher plugin that could cause compiz to crash David Reveman 2006-04-05 Reset raster position when switching back to window system framebuffer David Reveman 2006-04-05 Add constrain_y option to move plugin David Reveman 2006-04-05 Fix focus issues when moving windows David Reveman 2006-04-03 Offset direction fix and offset scale option David Reveman 2006-04-03 Fix string types again David Reveman 2006-04-03 Fix string types David Reveman 2006-04-03 Bump version David Reveman 2006-04-03 Fix water effect on desaturated windows David Reveman 2006-04-02 Add rain effect to water plugin David Reveman 2006-04-02 Fix timeout handling David Reveman 2006-04-02 Water plugin updates David Reveman 2006-04-01 Fix typo David Reveman 2006-04-01 Add initiate-all binding to switcher plugin David Reveman 2006-03-31 Fix up show desktop mode and minimize David Reveman 2006-03-31 fboVertices should return 1 David Reveman 2006-03-30 Fix mipmap filter selection David Reveman 2006-03-29 Draw outline around window title text and buttons David Reveman 2006-03-29 Set allowed window actions more correctly David Reveman 2006-03-29 Add opacity option to move plugin David Reveman 2006-03-29 Add preliminary version of water plugin David Reveman 2006-03-21 Fix lower-window functionality in gnome-window-decorator David Reveman 2006-03-20 Fix typo David Reveman 2006-03-20 Fix client lists David Reveman 2006-03-20 Allow dialog window actions on util and toolbar windows David Reveman 2006-03-20 Window resize fixes Jeremy C. Reed 2006-03-18 Use same autogen.sh as rest of modular Xorg. This allows running it from alternative work directory. Jeremy C. Reed 2006-03-18 Mention "startup-notification" requirement. David Reveman 2006-03-17 Add opacity option to scale plugin David Reveman 2006-03-17 Bump version number David Reveman 2006-03-17 Io multiplexing and add all mandatory SM client callbacks David Reveman 2006-03-17 Improve restackWindowAbove, restackWindowBelow and add bring-to-front option to switcher plugin David Reveman 2006-03-16 Never raise desktop windows David Reveman 2006-03-16 Fix window state changes and sending of configure notify events David Reveman 2006-03-15 Fix paint attribute calculations David Reveman 2006-03-15 Add restackWindowBelow David Reveman 2006-03-14 Opacity, brightness and saturation as adjustable options in switcher plugin David Reveman 2006-03-14 Fix window movement using titlebar with sloppy focus David Reveman 2006-03-14 Fix window movement with sloppy focus David Reveman 2006-03-14 Unmap window fix David Reveman 2006-03-14 Fix lighting David Reveman 2006-03-14 Add command line option that prints version number David Reveman 2006-03-14 Add bindings for changing window opacity David Reveman 2006-03-14 Add minimize/maximize/unmaximize bindings David Reveman 2006-03-14 Add darken background option to scale plugin David Reveman 2006-03-13 Add CopySubBufferMESA support David Reveman 2006-03-07 Remove unused variable David Reveman 2006-03-07 Better window stacking support David Reveman 2006-03-06 Skydome update David Reveman 2006-03-06 Window visibility, close and decoration fixes David Reveman 2006-03-03 Skydome support in cube plugin David Reveman 2006-03-03 Fade plugin fixes David Reveman 2006-03-03 Add session.c David Reveman 2006-03-03 Fix issue with switcher and non-selectable window being active David Reveman 2006-03-03 Fix panel action issue David Reveman 2006-03-03 Minimal session support David Reveman 2006-03-02 Fix so we get correct cursor when changing active pointer grab David Reveman 2006-03-02 Fix pointer warping David Reveman 2006-03-02 Fix switching while rotating David Reveman 2006-03-02 Fix switcher opacity and lighting issue David Reveman 2006-03-01 Bump version number David Reveman 2006-03-01 Higher brightness David Reveman 2006-03-01 Add slow animations option and fix a number of issues exposed when using slow animations David Reveman 2006-03-01 Nicer drop shadow on windows without decorations and constrain window dimensions David Reveman 2006-03-01 Lighting support David Reveman 2006-02-23 Fix show desktop mode David Reveman 2006-02-23 Fix handling of scaled windows and add more options David Reveman 2006-02-23 Mipmap support and more run command options David Reveman 2006-02-22 Remove sync hack from decoration plugin and add prevous window binding to switcher plugin David Reveman 2006-02-22 Always use double buffering and remove sync hack David Reveman 2006-02-22 Update task switcher David Reveman 2006-02-20 Make sure windows that want a titlebar get decorated David Reveman 2006-02-20 Focus and client list fixes David Reveman 2006-02-17 Update zoom plugin David Reveman 2006-02-17 Fix drawing of cube with more than 4 sides Zack Rusin 2006-02-17 Detect mapped windows, try to figure out the frame set by compiz. Remove moc files, make the screen and window objects not qobject's. David Reveman 2006-02-16 Remove menu David Reveman 2006-02-16 Fix thumbnail drawing in switcher plugin and make sure window titles in gnome window decorator are only drawn when they fit in the titlebar Zack Rusin 2006-02-15 Patch from Michael Biebl to make sure moc sources are built reliably. Adding a warning that the Qt decorator is not ready David Reveman 2006-02-14 Handle clock rollback and minor icon fix David Reveman 2006-02-13 Remove menu check and require gtk+ 2.8.0 David Reveman 2006-02-12 Some work done on the flight back from xdevconf David Reveman 2006-02-10 Do not include Xevie.h Zack Rusin 2006-02-09 more magic Zack Rusin 2006-02-09 some window managment stubs Zack Rusin 2006-02-09 adding cvs ignores Zack Rusin 2006-02-09 first stab at kde support David Reveman 2006-02-09 Initial import David Reveman 2006-02-09 Initial revision compiz-0.9.11+14.04.20140409/CMakeLists.txt0000644000015301777760000001635212321343002020241 0ustar pbusernogroup00000000000000# # Main CMakeLists.txt for compiz # project (compiz C CXX) set (CMAKE_MODULE_PATH_ORIG ${CMAKE_MODULE_PATH}) set (COMPIZ_CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${COMPIZ_CMAKE_MODULE_PATH}) include (CTest) set (MEMORYCHECK_COMMAND_OPTIONS --trace-children=yes) set (MEMORYCHECK_SUPPRESSIONS_FILE ${CMAKE_SOURCE_DIR}/tests/experimental-memcheck/compiz.supp CACHE FILEPATH "" FORCE) include (Dart) # Common compiz CMake macros & functions. include (CompizCommon) # Packaging-specific CMake macros & functions. include (CompizPackage) # GSettings schema recompilation include (CompizGSettings) # Google Test and Xorg-GTest include (XorgGTest) include (cmake/base.cmake) # Check if specific function is present in library. include (CheckFunctionExists) enable_testing() # Import macro for doing coverage reporting include(EnableCoverageReport) ##################################################################### # Enable code coverage calculation with gcov/gcovr/lcov # Usage: # * Switch build type to coverage (use ccmake or cmake-gui) # * Invoke make, make test, make coverage # * Find html report in subdir coveragereport # * Find xml report feasible for jenkins in coverage.xml ##################################################################### IF(CMAKE_BUILD_TYPE MATCHES [cC][oO][vV][eE][rR][aA][gG][eE]) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftest-coverage -fprofile-arcs" ) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ftest-coverage -fprofile-arcs" ) SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -ftest-coverage -fprofile-arcs" ) SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -ftest-coverage -fprofile-arcs" ) ENDIF(CMAKE_BUILD_TYPE MATCHES [cC][oO][vV][eE][rR][aA][gG][eE]) #set (CMAKE_CONFIGURATION_TYPES "Debug;Release;RelWithDebInfo;MinSizeRe" CACHE INTERNAL "" FORCE) #if (NOT CMAKE_BUILD_TYPE) # set (CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (Debug/Release/RelWithDebInfo/MinSizeRe)" FORCE) #endif (NOT CMAKE_BUILD_TYPE) file (READ ${CMAKE_SOURCE_DIR}/VERSION COMPIZ_RELEASE_VERSION LIMIT 12 OFFSET 0) string (STRIP ${COMPIZ_RELEASE_VERSION} COMPIZ_RELEASE_VERSION) set (VERSION ${COMPIZ_RELEASE_VERSION}) set (DECOR_INTERFACE_VERSION 20110504) if (COMPIZ_PACKAGING_ENABLED) set (prefix ${CMAKE_INSTALL_PREFIX} CACHE PATH "prefix") set (exec_prefix ${CMAKE_INSTALL_PREFIX}/bin CACHE PATH "bindir") set (libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX} CACHE PATH "libdir") set (includedir ${CMAKE_INSTALL_PREFIX}/include CACHE PATH "includedir") set (datadir ${CMAKE_INSTALL_PREFIX}/share CACHE PATH "datadir") else (COMPIZ_PACKAGING_ENABLED) set (prefix ${CMAKE_INSTALL_PREFIX} ) set (exec_prefix ${CMAKE_INSTALL_PREFIX}/bin ) set (libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) set (includedir ${CMAKE_INSTALL_PREFIX}/include ) set (datadir ${CMAKE_INSTALL_PREFIX}/share ) endif (COMPIZ_PACKAGING_ENABLED) set (compiz_plugindir ${libdir}/compiz) set (compiz_sharedir ${datadir}/compiz/) set (compiz_metadatadir ${datadir}/compiz) set (COMPIZ_I18N_DIR ${CMAKE_SOURCE_DIR}/po) # Force re-generation of uninstall script compiz_set (_compiz_uninstall_rule_created FALSE) # Don't allow subdirectories to add schema recompile rule set_property (GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE TRUE) set_property (GLOBAL PROPERTY COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE TRUE) # Translation set (ALL_LINGUAS af ar bg bn bn_IN bs ca cs cy da de el en_GB en_US es eu et fi fr gl gu he hi hr hu id it ja ka km ko lo lt mk mr nb nl or pa pl pt pt_BR ro ru sk sl sr sv ta tr uk vi xh zh_CN zh_TW zu) set (GETTEXT_PACKAGE compiz) set (COMPIZ_REQUIRES x11 xext xdamage xcomposite x11-xcb xrandr xinerama xi ice sm libxml-2.0 libxslt glib-2.0 gio-2.0 glibmm-2.4 "libstartup-notification-1.0 >= 0.7" ) set (DECORATION_REQUIRES xrender) compiz_pkg_check_modules (COMPIZ REQUIRED ${COMPIZ_REQUIRES}) compiz_pkg_check_modules (LIBDECORATION REQUIRED ${DECORATION_REQUIRES}) include (CompizDefaults) set (_compiz_package_string "Compiz ${VERSION}") set (_compiz_package "Compiz") compiz_configure_file (${compiz_SOURCE_DIR}/config.h.core.in ${compiz_BINARY_DIR}/generated/config.h) compiz_configure_file ( ${CMAKE_SOURCE_DIR}/compiz.pc.in ${CMAKE_BINARY_DIR}/compiz.pc COMPIZ_REQUIRES COMPIZ_CFLAGS ) install ( FILES ${CMAKE_BINARY_DIR}/compiz.pc DESTINATION ${libdir}/pkgconfig ) set (COMPIZ_INTERNAL_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/timer/include ${CMAKE_CURRENT_SOURCE_DIR}/src/string/include ${CMAKE_CURRENT_SOURCE_DIR}/src/pluginclasshandler/include ${CMAKE_CURRENT_SOURCE_DIR}/src/point/include ${CMAKE_CURRENT_SOURCE_DIR}/src/rect/include ${CMAKE_CURRENT_SOURCE_DIR}/src/servergrab/include ${CMAKE_CURRENT_SOURCE_DIR}/src/region/include ${CMAKE_CURRENT_SOURCE_DIR}/src/window/geometry/include ${CMAKE_CURRENT_SOURCE_DIR}/src/window/geometry-saver/include ${CMAKE_CURRENT_SOURCE_DIR}/src/window/extents/include ${CMAKE_CURRENT_SOURCE_DIR}/src/window/constrainment/include ${CMAKE_CURRENT_SOURCE_DIR}/src/logmessage/include) if (COMPIZ_BUILD_TESTING) include (GoogleTest) if (GOOGLE_TEST_AND_MOCK_FOUND) if (BUILD_XORG_GTEST) find_package (XorgGTest) set (COMPIZ_XORG_GTEST_DIR ${CMAKE_BINARY_DIR}/__xorg_gtest CACHE PATH "Path to Xorg GTest build dir" FORCE) set (COMPIZ_XORG_GTEST_WRAPPER ${COMPIZ_XORG_GTEST_DIR}/xorg_gtest_wrapper CACHE PATH "Path to Xorg GTest wrapper" FORCE) if (XORG_GTEST_FOUND) build_xorg_gtest_locally (${CMAKE_BINARY_DIR}/__xorg_gtest) else (XORG_GTEST_FOUND) set (BUILD_XORG_GTEST FALSE) endif (XORG_GTEST_FOUND) endif (BUILD_XORG_GTEST) else (GOOGLE_TEST_AND_MOCK_FOUND) set (COMPIZ_BUILD_TESTING OFF CACHE BOOL "" FORCE) set (BUILD_XORG_GTEST OFF CACHE BOOL "" FORCE) endif (GOOGLE_TEST_AND_MOCK_FOUND) else (COMPIZ_BUILD_TESTING) set (BUILD_XORG_GTEST OFF CACHE BOOL "" FORCE) endif (COMPIZ_BUILD_TESTING) # Add the rest of compiz add_subdirectory (cmake) add_subdirectory (include) add_subdirectory (images) add_subdirectory (libdecoration) add_subdirectory (gtk) add_subdirectory (kde) add_subdirectory (po) add_subdirectory (metadata) add_subdirectory (src) add_subdirectory (compizconfig) add_subdirectory (xslt) add_subdirectory (plugins) add_subdirectory (tests) # Leave last - the cmake_install.cmake script is guaranteed # to run in a single job, and we need to force GSettings # schema recompilation to happen after all other install # targets (there is no way to set install target dependencies) # in CMake add_subdirectory (postinst) compiz_ensure_linkage () compiz_package_generation ("Compiz") compiz_add_uninstall () compiz_add_git_dist () compiz_add_distcheck () compiz_add_release () compiz_add_release_signoff () if (COMPIZ_BUILD_TESTING) compiz_generate_testfile_target () endif (COMPIZ_BUILD_TESTING) _print_configure_results () _check_compiz_cmake_macro (${CMAKE_MODULE_PATH_ORIG}) # Enable coverage reporting for compiz compiz_generate_coverage_report() compiz-0.9.11+14.04.20140409/COPYING0000644000015301777760000000042212321343002016523 0ustar pbusernogroup00000000000000Most of the code is MIT licensed, some code is instead licensed under the LGPL and some under the GPL. Each source code file contain a header that describes the license for the code in that specific file. For More information see COPYING.GPL, COPYING.LGPL and COPYING.MIT. compiz-0.9.11+14.04.20140409/src/0000755000015301777760000000000012321344021016263 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/global.cpp0000644000015301777760000000307012321343002020225 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Thomas Voss */ #include #include "core/string.h" class CompWindow; char *programName; char **programArgv; int programArgc; bool restartSignal = false; bool replaceCurrentWm = false; bool sendStartupMessage = false; bool useDesktopHints = false; bool debugOutput = false; bool synchronousX = false; std::list initialPlugins; unsigned int pluginClassHandlerIndex = 0; compiz-0.9.11+14.04.20140409/src/point/0000755000015301777760000000000012321344021017414 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/point/tests/0000755000015301777760000000000012321344021020556 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/point/tests/point/0000755000015301777760000000000012321344021021707 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/point/tests/point/src/0000755000015301777760000000000012321344021022476 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/point/tests/point/src/test-point.cpp0000644000015301777760000000355012321343002025311 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-point.h" class CompPointTestPoint : public CompWindowPointTest { public: CompPointTestPoint (); ~CompPointTestPoint (); protected: CompPoint p; }; CompPointTestPoint::CompPointTestPoint () : p (0, 0) { } CompPointTestPoint::~CompPointTestPoint () { } TEST_F(CompPointTestPoint, TestPoint) { p.setX (10); EXPECT_EQ (p.x (), 10); p.setY (10); EXPECT_EQ (p.y (), 10); EXPECT_EQ (p, CompPoint (10, 10)); EXPECT_TRUE (p == CompPoint (10, 10)); EXPECT_FALSE (p != CompPoint (10, 10)); p -= CompPoint (5, 5); EXPECT_EQ (p, CompPoint (5, 5)); p += CompPoint (3, 3); EXPECT_EQ (p, CompPoint (8, 8)); } compiz-0.9.11+14.04.20140409/src/point/tests/test-point.h0000644000015301777760000000301212321343002023027 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_WINDOW_GEOMETRY_H #define _COMPIZ_TEST_WINDOW_GEOMETRY_H #include #include #include #include class CompWindowPointTest : public ::testing::Test { public: CompWindowPointTest (); virtual ~CompWindowPointTest (); }; #endif compiz-0.9.11+14.04.20140409/src/point/tests/CMakeLists.txt0000644000015301777760000000102512321343002023312 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_point_test ${CMAKE_CURRENT_SOURCE_DIR}/test-point.cpp) add_executable (compiz_test_point ${CMAKE_CURRENT_SOURCE_DIR}/point/src/test-point.cpp) target_link_libraries (compiz_test_point compiz_point_test compiz_point ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_point COVERAGE compiz_point) compiz-0.9.11+14.04.20140409/src/point/tests/test-point.cpp0000644000015301777760000000251312321343002023367 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-point.h" CompWindowPointTest::CompWindowPointTest () { } CompWindowPointTest::~CompWindowPointTest () { } compiz-0.9.11+14.04.20140409/src/point/CMakeLists.txt0000644000015301777760000000145412321343002022156 0ustar pbusernogroup00000000000000pkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${compiz_SOURCE_DIR}/include/core/point.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/point.cpp ) ADD_LIBRARY( compiz_point STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_point PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_point ${GLIBMM_LIBRARIES} ) compiz-0.9.11+14.04.20140409/src/point/src/0000755000015301777760000000000012321344021020203 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/point/src/point.cpp0000644000015301777760000000424012321343002022036 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include CompPoint::CompPoint () : mX (0), mY (0) { } CompPoint::CompPoint (int x, int y) : mX (x), mY (y) { } void CompPoint::set (int x, int y) { mX = x; mY = y; } void CompPoint::setX (int x) { mX = x; } void CompPoint::setY (int y) { mY = y; } bool CompPoint::operator== (const CompPoint &point) const { return (mX == point.mX) && (mY == point.mY); } bool CompPoint::operator!= (const CompPoint &point) const { return !(*this == point); } CompPoint & CompPoint::operator+= (const CompPoint &point) { mX += point.mX; mY += point.mY; return *this; } CompPoint CompPoint::operator+ (const CompPoint &rhs) const { return CompPoint (mX + rhs.mX, mY + rhs.mY); } CompPoint & CompPoint::operator-= (const CompPoint &point) { mX -= point.mX; mY -= point.mY; return *this; } CompPoint CompPoint::operator- (const CompPoint &rhs) const { return CompPoint (mX - rhs.mX, mY - rhs.mY); } compiz-0.9.11+14.04.20140409/src/screen.cpp0000644000015301777760000036561412321343035020271 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define foreach BOOST_FOREACH #include #include #include #include #include #include #include #include #include #include #include #include "privatescreen.h" #include "privatewindow.h" #include "privateaction.h" #include "privatestackdebugger.h" template class WrapableInterface; CompOutput *targetOutput; int lastPointerX = 0; int lastPointerY = 0; unsigned int lastPointerMods = 0; int pointerX = 0; int pointerY = 0; unsigned int pointerMods = 0; namespace { bool inHandleEvent = false; bool screenInitalized = false; } #define MwmHintsFunctions (1L << 0) #define MwmHintsDecorations (1L << 1) static const unsigned short PropMotifWmHintElements = 3; typedef struct { unsigned long flags; unsigned long functions; unsigned long decorations; } MwmHints; namespace cps = compiz::private_screen; namespace ca = compiz::actions; CompScreen *screen; ModifierHandler *modHandler; PluginClassStorage::Indices screenPluginClassIndices (0); void CompScreenImpl::sizePluginClasses(unsigned int size) { if(size != pluginClasses.size ()) pluginClasses.resize (size); } void CompScreenImpl::setWindowState (unsigned int state, Window id) { privateScreen.setWindowState (state, id); } void CompScreenImpl::addToDestroyedWindows(CompWindow * cw) { windowManager.addToDestroyedWindows(cw); } void CompScreenImpl::processEvents () { privateScreen.processEvents (); } unsigned int CompScreen::allocPluginClassIndex () { unsigned int i = PluginClassStorage::allocatePluginClassIndex (screenPluginClassIndices); sizePluginClasses(screenPluginClassIndices.size()); return i; } void CompScreen::freePluginClassIndex (unsigned int index) { PluginClassStorage::freePluginClassIndex (screenPluginClassIndices, index); sizePluginClasses(screenPluginClassIndices.size()); } void cps::EventManager::handleSignal (int signum) { switch (signum) { case SIGINT: case SIGTERM: mainloop->quit (); break; case SIGHUP: restartSignal = true; mainloop->quit (); break; default: break; } mainloop->quit (); } void CompScreenImpl::eventLoop () { privateScreen.eventManager.startEventLoop (dpy()); } void cps::EventManager::startEventLoop(Display* dpy) { source = CompEventSource::create (); timeout = CompTimeoutSource::create (ctx); source->attach (ctx); XFlush (dpy); mainloop->run(); } CompFileWatchHandle CompScreenImpl::addFileWatch (const char *path, int mask, FileWatchCallBack callBack) { CompFileWatch *fileWatch = privateScreen.eventManager.addFileWatch (path, mask, callBack); if (!fileWatch) return 0; fileWatchAdded (fileWatch); return fileWatch->handle; } CompFileWatch* cps::EventManager::addFileWatch ( const char *path, int mask, FileWatchCallBack callBack) { CompFileWatch *fw = new CompFileWatch (); if (!fw) return 0; fw->path = path; fw->mask = mask; fw->callBack = callBack; fw->handle = lastFileWatchHandle++; if (lastFileWatchHandle == MAXSHORT) lastFileWatchHandle = 1; fileWatch.push_front (fw); return fw; } void CompScreenImpl::removeFileWatch (CompFileWatchHandle handle) { if (CompFileWatch* w = privateScreen.eventManager.removeFileWatch (handle)) { fileWatchRemoved (w); delete w; } } CompFileWatch* cps::EventManager::removeFileWatch (CompFileWatchHandle handle) { std::list::iterator it; for (it = fileWatch.begin (); it != fileWatch.end (); ++it) if ((*it)->handle == handle) break; if (it == fileWatch.end ()) return 0; CompFileWatch* w = (*it); fileWatch.erase (it); return w; } const CompFileWatchList & CompScreenImpl::getFileWatches () const { return privateScreen.eventManager.getFileWatches (); } const CompFileWatchList & cps::EventManager::getFileWatches () const { return fileWatch; } CompWatchFd::CompWatchFd (int fd, Glib::IOCondition events, FdWatchCallBack callback) : Glib::IOSource (fd, events), mFd (fd), mCallBack (callback), mForceFail (false), mExecuting (false) { connect (sigc::mem_fun (this, &CompWatchFd::internalCallback)); } CompWatchFd::~CompWatchFd () { } Glib::RefPtr CompWatchFd::create (int fd, Glib::IOCondition events, FdWatchCallBack callback) { return Glib::RefPtr (new CompWatchFd (fd, events, callback)); } CompWatchFdHandle CompScreenImpl::addWatchFd (int fd, short int events, FdWatchCallBack callBack) { return privateScreen.eventManager.addWatchFd (fd, events, callBack); } CompWatchFdHandle cps::EventManager::addWatchFd (int fd, short int events, FdWatchCallBack callBack) { Glib::IOCondition gEvents; memset (&gEvents, 0, sizeof (Glib::IOCondition)); if (events & POLLIN) gEvents |= Glib::IO_IN; if (events & POLLOUT) gEvents |= Glib::IO_OUT; if (events & POLLPRI) gEvents |= Glib::IO_PRI; if (events & POLLERR) gEvents |= Glib::IO_ERR; if (events & POLLHUP) gEvents |= Glib::IO_HUP; Glib::RefPtr watchFd = CompWatchFd::create (fd, gEvents, callBack); watchFd->attach (ctx); if (!watchFd) return 0; watchFd->mHandle = lastWatchFdHandle++; if (lastWatchFdHandle == MAXSHORT) lastWatchFdHandle = 1; watchFds.push_front (watchFd); return watchFd->mHandle; } void CompScreenImpl::removeWatchFd (CompWatchFdHandle handle) { privateScreen.eventManager.removeWatchFd (handle); } void cps::EventManager::removeWatchFd (CompWatchFdHandle handle) { std::list >::iterator it; Glib::RefPtr w; for (it = watchFds.begin(); it != watchFds.end (); ++it) { if ((*it)->mHandle == handle) break; } if (it == watchFds.end ()) return; w = (*it); if (w->mExecuting) { w->mForceFail = true; return; } watchFds.erase (it); } void CompScreenImpl::storeValue (CompString key, CompPrivate value) { ValueHolder::Default ()->storeValue (key, value); } bool CompScreenImpl::hasValue (CompString key) { return ValueHolder::Default ()->hasValue (key); } CompPrivate CompScreenImpl::getValue (CompString key) { return ValueHolder::Default ()->getValue (key); } bool CompWatchFd::internalCallback (Glib::IOCondition events) { short int revents = 0; if (events & Glib::IO_IN) revents |= POLLIN; if (events & Glib::IO_OUT) revents |= POLLOUT; if (events & Glib::IO_PRI) revents |= POLLPRI; if (events & Glib::IO_ERR) revents |= POLLERR; if (events & Glib::IO_HUP) revents |= POLLHUP; if (events & Glib::IO_NVAL) return false; mExecuting = true; mCallBack (revents); mExecuting = false; if (mForceFail) { /* FIXME: Need to find a way to properly remove the watchFd * from the internal list in core */ //screen->priv->watchFds.remove (this); return false; } return true; } void CompScreenImpl::eraseValue (CompString key) { ValueHolder::Default ()->eraseValue (key); } void CompScreen::fileWatchAdded (CompFileWatch *watch) { WRAPABLE_HND_FUNCTN (fileWatchAdded, watch); _fileWatchAdded (watch); } void CompScreenImpl::_fileWatchAdded (CompFileWatch *watch) { } void CompScreen::fileWatchRemoved (CompFileWatch *watch) { WRAPABLE_HND_FUNCTN (fileWatchRemoved, watch); _fileWatchRemoved (watch); } void CompScreenImpl::_fileWatchRemoved (CompFileWatch *watch) { } bool CompScreen::setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &value) { WRAPABLE_HND_FUNCTN_RETURN (bool, setOptionForPlugin, plugin, name, value) return _setOptionForPlugin(plugin, name, value); } bool CompScreenImpl::_setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &value) { CompPlugin *p = CompPlugin::find (plugin); if (p) return p->vTable->setOption (name, value); return false; } void CompScreen::sessionEvent (CompSession::Event event, CompOption::Vector &arguments) { WRAPABLE_HND_FUNCTN (sessionEvent, event, arguments); _sessionEvent(event, arguments); } void CompScreenImpl::_sessionEvent (CompSession::Event event, CompOption::Vector &arguments) { } void ScreenInterface::fileWatchAdded (CompFileWatch *watch) WRAPABLE_DEF (fileWatchAdded, watch) void ScreenInterface::fileWatchRemoved (CompFileWatch *watch) WRAPABLE_DEF (fileWatchRemoved, watch) bool ScreenInterface::initPluginForScreen (CompPlugin *plugin) WRAPABLE_DEF (initPluginForScreen, plugin) void ScreenInterface::finiPluginForScreen (CompPlugin *plugin) WRAPABLE_DEF (finiPluginForScreen, plugin) bool ScreenInterface::setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &value) WRAPABLE_DEF (setOptionForPlugin, plugin, name, value) void ScreenInterface::sessionEvent (CompSession::Event event, CompOption::Vector &arguments) WRAPABLE_DEF (sessionEvent, event, arguments) static int errors = 0; static int errorHandler (Display *dpy, XErrorEvent *e) { #ifdef DEBUG char str[128]; #endif errors++; #ifdef DEBUG XGetErrorDatabaseText (dpy, "XlibMessage", "XError", "", str, 128); fprintf (stderr, "%s", str); XGetErrorText (dpy, e->error_code, str, 128); fprintf (stderr, ": %s\n ", str); XGetErrorDatabaseText (dpy, "XlibMessage", "MajorCode", "%d", str, 128); fprintf (stderr, str, e->request_code); snprintf (str, 128, "%d", e->request_code); XGetErrorDatabaseText (dpy, "XRequest", str, "", str, 128); if (strcmp (str, "")) fprintf (stderr, " (%s)", str); fprintf (stderr, "\n "); XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "%d", str, 128); fprintf (stderr, str, e->minor_code); fprintf (stderr, "\n "); XGetErrorDatabaseText (dpy, "XlibMessage", "ResourceID", "%d", str, 128); fprintf (stderr, str, e->resourceid); fprintf (stderr, "\n"); /* abort (); */ #endif return 0; } int CompScreen::checkForError (Display *dpy) { int e; XSync (dpy, false); e = errors; errors = 0; return e; } Display * CompScreenImpl::dpy () { return privateScreen.dpy; } bool CompScreenImpl::XRandr () { return privateScreen.xRandr.isEnabled (); } int CompScreenImpl::randrEvent () { return privateScreen.xRandr.get (); } bool CompScreenImpl::XShape () { return privateScreen.xShape.isEnabled (); } int CompScreenImpl::shapeEvent () { return privateScreen.xShape.get (); } int CompScreenImpl::syncEvent () { return privateScreen.xSync.get (); } SnDisplay * CompScreenImpl::snDisplay () { return privateScreen.getSnDisplay (); } Window CompScreenImpl::activeWindow () { return privateScreen.orphanData.activeWindow; } Window CompScreenImpl::autoRaiseWindow () { return autoRaiseWindow_; } const char * CompScreenImpl::displayString () { return privateScreen.displayString (); } void PrivateScreen::updateScreenInfo () { if (xineramaExtension) { int nInfo; XineramaScreenInfo *info = XineramaQueryScreens (dpy, &nInfo); screenInfo = std::vector (info, info + nInfo); if (info) XFree (info); } } void PrivateScreen::setAudibleBell (bool audible) { if (xkbEvent.isEnabled()) XkbChangeEnabledControls (dpy, XkbUseCoreKbd, XkbAudibleBellMask, audible ? XkbAudibleBellMask : 0); } bool CompScreenImpl::handlePingTimeout () { return Ping::handlePingTimeout( windowManager.begin(), windowManager.end(), privateScreen.dpy); } bool cps::Ping::handlePingTimeout (WindowManager::iterator begin, WindowManager::iterator end, Display* dpy) { XEvent ev; int ping = lastPing_ + 1; ev.type = ClientMessage; ev.xclient.window = 0; ev.xclient.message_type = Atoms::wmProtocols; ev.xclient.format = 32; ev.xclient.data.l[0] = Atoms::wmPing; ev.xclient.data.l[1] = ping; ev.xclient.data.l[2] = 0; ev.xclient.data.l[3] = 0; ev.xclient.data.l[4] = 0; for (WindowManager::iterator i = begin; i != end; ++i) { CompWindow* const w(*i); if (w->priv->handlePingTimeout (lastPing_)) { ev.xclient.window = w->id (); ev.xclient.data.l[2] = w->id (); XSendEvent (dpy, w->id (), false, NoEventMask, &ev); } } lastPing_ = ping; return true; } CompOption::Vector & CompScreenImpl::getOptions () { return privateScreen.getOptions (); } bool CompScreenImpl::setOption (const CompString &name, CompOption::Value &value) { return privateScreen.setOption (name, value); } bool PrivateScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = CoreOptions::setOption (name, value); if (!rv) return false; if (!CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case CoreOptions::ActivePlugins: pluginManager.setDirtyPluginList (); break; case CoreOptions::PingDelay: pingTimer.setTimes (optionGetPingDelay (), optionGetPingDelay () + 500); break; case CoreOptions::AudibleBell: setAudibleBell (optionGetAudibleBell ()); break; case CoreOptions::DetectOutputs: if (optionGetDetectOutputs ()) detectOutputDevices (*this); break; case CoreOptions::Hsize: case CoreOptions::Vsize: if (optionGetHsize () * screen->width () > MAXSHORT) return false; if (optionGetVsize () * screen->height () > MAXSHORT) return false; setVirtualScreenSize (optionGetHsize (), optionGetVsize ()); break; case CoreOptions::NumberOfDesktops: setNumberOfDesktops (optionGetNumberOfDesktops ()); break; case CoreOptions::DefaultIcon: return screen->updateDefaultIcon (); break; case CoreOptions::Outputs: if (optionGetDetectOutputs ()) return false; updateOutputDevices (*this); break; default: break; } return rv; } bool PrivateScreen::getNextXEvent (XEvent &ev) { if (!XEventsQueued (dpy, QueuedAlready)) return false; XNextEvent (dpy, &ev); /* Skip to the last MotionNotify * event in this sequence */ if (ev.type == MotionNotify) { XEvent peekEvent; while (XPending (dpy)) { XPeekEvent (dpy, &peekEvent); if (peekEvent.type != MotionNotify) break; XNextEvent (dpy, &peekEvent); } } return true; } bool PrivateScreen::getNextEvent (XEvent &ev) { StackDebugger *dbg = StackDebugger::Default (); if (StackDebugger::Default ()) { return dbg->getNextEvent (ev); } else return getNextXEvent (ev); } void PrivateScreen::processEvents () { StackDebugger *dbg = StackDebugger::Default (); if (pluginManager.isDirtyPluginList ()) { eventManager.resetPossibleTap(); pluginManager.updatePlugins (screen, optionGetActivePlugins()); } windowManager.validateServerWindows(); if (dbg) { dbg->windowsChanged (false); dbg->serverWindowsChanged (false); dbg->loadStack (windowManager.getServerWindows()); } windowManager.invalidateServerWindows(); XEvent event; while (getNextEvent (event)) { switch (event.type) { case ButtonPress: case ButtonRelease: pointerX = event.xbutton.x_root; pointerY = event.xbutton.y_root; pointerMods = event.xbutton.state; break; case KeyPress: case KeyRelease: pointerX = event.xkey.x_root; pointerY = event.xkey.y_root; pointerMods = event.xkey.state; break; case MotionNotify: pointerX = event.xmotion.x_root; pointerY = event.xmotion.y_root; pointerMods = event.xmotion.state; break; case EnterNotify: case LeaveNotify: pointerX = event.xcrossing.x_root; pointerY = event.xcrossing.y_root; pointerMods = event.xcrossing.state; break; case ClientMessage: if (event.xclient.message_type == Atoms::xdndPosition) { pointerX = event.xclient.data.l[2] >> 16; pointerY = event.xclient.data.l[2] & 0xffff; /* FIXME: Xdnd provides us no way of getting the pointer mods * without doing XQueryPointer, which is a round-trip */ pointerMods = 0; } else if (event.xclient.message_type == Atoms::wmMoveResize) { int i; Window child, root; /* _NET_WM_MOVERESIZE is most often sent by clients who provide * a special "grab space" on a window for the user to initiate * adjustment by the window manager. Since we don't have a * passive grab on Button1 for active and raised windows, we * need to update the pointer buffer here */ XQueryPointer (screen->dpy (), screen->root (), &root, &child, &pointerX, &pointerY, &i, &i, &pointerMods); } break; default: break; } sn_display_process_event (snDisplay, &event); inHandleEvent = true; screen->alwaysHandleEvent (&event); inHandleEvent = false; XFlush (dpy); lastPointerX = pointerX; lastPointerY = pointerY; lastPointerMods = pointerMods; } /* remove destroyed windows */ windowManager.removeDestroyed (); if (dbg) { if (dbg->windowsChanged () && dbg->cmpStack (windowManager.getWindows(), windowManager.getServerWindows())) { compLogMessage ("core", CompLogLevelDebug, "stacks are out of sync"); if (dbg->timedOut ()) compLogMessage ("core", CompLogLevelDebug, "however, this may be a false positive"); } if (dbg->serverWindowsChanged () && dbg->checkSanity (windowManager.getWindows())) compLogMessage ("core", CompLogLevelDebug, "windows are stacked incorrectly"); } } void cps::WindowManager::validateServerWindows() { /* Restacks recently processed, ensure that * plugins use the stack last received from * the server */ if (stackIsFresh) { serverWindows.clear (); foreach (CompWindow *sw, windows) { sw->serverPrev = sw->prev; sw->serverNext = sw->next; serverWindows.push_back (sw); } } } void cps::WindowManager::invalidateServerWindows() { stackIsFresh = false; } void cps::WindowManager::clearFullscreenHints() const { /* clear out fullscreen monitor hints of all windows as suggested on monitor layout changes in EWMH */ for (iterator i = windows.begin(); i != windows.end(); ++i) { CompWindow* const w(*i); if (w->priv->fullscreenMonitorsSet) w->priv->setFullscreenMonitors (NULL); } } void cps::WindowManager::showOrHideForDesktop(unsigned int desktop) const { for (iterator i = windows.begin(); i != windows.end(); ++i) { CompWindow* const w(*i); if (w->desktop () == 0xffffffff) continue; if (w->desktop () == desktop) w->priv->show (); else w->priv->hide (); } } void cps::WindowManager::setWindowActiveness(cps::History& history) const { for (iterator i = windows.begin(); i != windows.end(); ++i) { CompWindow* const w(*i); if (w->isViewable ()) w->priv->activeNum = history.nextActiveNum (); } } void cps::WindowManager::setNumberOfDesktops(unsigned int desktops) const { for (iterator i = windows.begin(); i != windows.end(); ++i) { CompWindow* const w(*i); if (w->desktop () == 0xffffffff) continue; if (w->desktop () >= desktops) w->setDesktop (desktops - 1); } } void cps::WindowManager::updateWindowSizes() const { CompWindow::Geometry before, after; for (iterator i = windows.begin(); i != windows.end(); ++i) { CompWindow* const w(*i); before = w->priv->serverGeometry; w->priv->updateSize (); after = w->priv->serverGeometry; /* A maximized window was adjusted for the new workarea size */ if (before != after && (w->state () & CompWindowStateMaximizedVertMask || w->state () & CompWindowStateMaximizedHorzMask)) { w->priv->moved = true; } } } CompOption::Value::Vector cps::PluginManager::mergedPluginList (CompOption::Value::Vector const& extraPluginsRequested) const { CompOption::Value::Vector result; /* Must have core as first plugin */ result.push_back("core"); /* Add initial plugins */ foreach(CompString & p, initialPlugins) { if (p == "core") continue; if (blacklist.find (p) != blacklist.end ()) continue; result.push_back(p); } /* Add plugins not in the initial list */ foreach(CompOption::Value const& opt, extraPluginsRequested) { if (opt.s() == "core") continue; if (blacklist.find (opt.s()) != blacklist.end ()) continue; typedef std::list::iterator iterator; bool skip = false; for (iterator it = initialPlugins.begin(); it != initialPlugins.end(); ++it) { if ((*it) == opt.s()) { skip = true; break; } } if (!skip) { result.push_back(opt.s()); } } return result; } void cps::PluginManager::updatePlugins (CompScreen* screen, CompOption::Value::Vector const& extraPluginsRequested) { dirtyPluginList = false; CompOption::Value::Vector const desiredPlugins(mergedPluginList(extraPluginsRequested)); unsigned int pluginIndex; for (pluginIndex = 1; pluginIndex < plugin.list ().size () && pluginIndex < desiredPlugins.size (); pluginIndex++) { if (plugin.list ().at (pluginIndex).s () != desiredPlugins.at (pluginIndex).s ()) break; } unsigned int desireIndex = pluginIndex; // We have pluginIndex pointing at first difference (or end). // Now pop plugins off stack to this point, but keep track that they are loaded CompPlugin::List alreadyLoaded; if (const unsigned int nPop = plugin.list().size() - pluginIndex) { for (pluginIndex = 0; pluginIndex < nPop; pluginIndex++) { alreadyLoaded.push_back(CompPlugin::pop()); plugin.list().pop_back(); } } // Now work forward through requested plugins for (; desireIndex < desiredPlugins.size(); desireIndex++) { CompPlugin *p = NULL; bool failedPush = false; // If already loaded, just try to push it... foreach(CompPlugin * pp, alreadyLoaded) { if (desiredPlugins[desireIndex].s() == pp->vTable->name()) { if (CompPlugin::push (pp)) { p = pp; alreadyLoaded.erase( std::find(alreadyLoaded.begin(), alreadyLoaded.end(), pp)); break; } else { alreadyLoaded.erase( std::find(alreadyLoaded.begin(), alreadyLoaded.end(), pp)); blacklist.insert (desiredPlugins[desireIndex].s ()); CompPlugin::unload(pp); p = NULL; failedPush = true; break; } } } // ...otherwise, try to load and push if (p == 0 && !failedPush) { p = CompPlugin::load(desiredPlugins[desireIndex].s ().c_str ()); if (p) { if (!CompPlugin::push(p)) { blacklist.insert (desiredPlugins[desireIndex].s ()); CompPlugin::unload(p); p = 0; } } else { blacklist.insert (desiredPlugins[desireIndex].s ()); } } if (p) plugin.list().push_back(p->vTable->name()); } // Any plugins that are loaded, but were not re-initialized can be unloaded. foreach(CompPlugin * pp, alreadyLoaded) CompPlugin::unload (pp); if (!dirtyPluginList) screen->setOptionForPlugin ("core", "active_plugins", plugin); } /* from fvwm2, Copyright Matthias Clasen, Dominik Vogt */ static bool convertProperty (Display *dpy, Time time, Window w, Atom target, Atom property) { static const unsigned short N_TARGETS = 4; Atom conversionTargets[N_TARGETS]; conversionTargets[0] = Atoms::targets; conversionTargets[1] = Atoms::multiple; conversionTargets[2] = Atoms::timestamp; conversionTargets[3] = Atoms::version; if (target == Atoms::targets) XChangeProperty (dpy, w, property, XA_ATOM, 32, PropModeReplace, (unsigned char *) conversionTargets, N_TARGETS); else if (target == Atoms::timestamp) XChangeProperty (dpy, w, property, XA_INTEGER, 32, PropModeReplace, (unsigned char *) &time, 1); else if (target == Atoms::version) { long icccmVersion[] = { 2, 0 }; XChangeProperty (dpy, w, property, XA_INTEGER, 32, PropModeReplace, (unsigned char *) icccmVersion, 2); } else return false; /* Be sure the PropertyNotify has arrived so we * can send SelectionNotify */ XSync (dpy, false); return true; } /* from fvwm2, Copyright Matthias Clasen, Dominik Vogt */ void PrivateScreen::handleSelectionRequest (XEvent *event) { if (wmSnSelectionWindow != event->xselectionrequest.owner || wmSnAtom != event->xselectionrequest.selection) return; XSelectionEvent reply; reply.type = SelectionNotify; reply.display = dpy; reply.requestor = event->xselectionrequest.requestor; reply.selection = event->xselectionrequest.selection; reply.target = event->xselectionrequest.target; reply.property = None; reply.time = event->xselectionrequest.time; if (event->xselectionrequest.target == Atoms::multiple) { if (event->xselectionrequest.property != None) { Atom type, *adata; int i, format; unsigned long num, rest; unsigned char *data; if (XGetWindowProperty (dpy, event->xselectionrequest.requestor, event->xselectionrequest.property, 0, 256, false, Atoms::atomPair, &type, &format, &num, &rest, &data) != Success) return; /* FIXME: to be 100% correct, should deal with rest > 0, * but since we have 4 possible targets, we will hardly ever * meet multiple requests with a length > 8 */ adata = (Atom *) data; i = 0; while (i < (int) num) { if (!convertProperty (dpy, wmSnTimestamp, event->xselectionrequest.requestor, adata[i], adata[i + 1])) adata[i + 1] = None; i += 2; } XChangeProperty (dpy, event->xselectionrequest.requestor, event->xselectionrequest.property, Atoms::atomPair, 32, PropModeReplace, data, num); if (data) XFree (data); } } else { if (event->xselectionrequest.property == None) event->xselectionrequest.property = event->xselectionrequest.target; if (convertProperty (dpy, wmSnTimestamp, event->xselectionrequest.requestor, event->xselectionrequest.target, event->xselectionrequest.property)) reply.property = event->xselectionrequest.property; } XSendEvent (dpy, event->xselectionrequest.requestor, false, 0L, (XEvent *) &reply); } void PrivateScreen::handleSelectionClear (XEvent *event) { /* We need to unmanage the screen on which we lost the selection */ if (wmSnSelectionWindow != event->xselectionclear.window || wmSnAtom != event->xselectionclear.selection) return; eventManager.quit (); } static const std::string IMAGEDIR("images"); static const std::string HOMECOMPIZDIR(".compiz-1"); bool CompScreenImpl::readImageFromFile (CompString &name, CompString &pname, CompSize &size, void *&data) { bool status; int stride; status = fileToImage (name, size, stride, data); if (!status) { char *home = getenv ("HOME"); CompString path; if (home) { path = home; path += "/"; path += HOMECOMPIZDIR; path += "/"; path += pname; path += "/"; path += IMAGEDIR; path += "/"; path += name; status = fileToImage (path, size, stride, data); if (status) return true; } path = SHAREDIR; path += "/"; path += pname; path += "/"; path += IMAGEDIR; path += "/"; path += name; status = fileToImage (path, size, stride, data); } return status; } bool CompScreenImpl::writeImageToFile (CompString &path, const char *format, CompSize &size, void *data) { CompString formatString (format); return imageToFile (path, formatString, size, size.width () * 4, data); } Window PrivateScreen::getActiveWindow (Window root) { Atom actual; int result, format; unsigned long n, left; unsigned char *data; Window w = None; result = XGetWindowProperty (dpy, root, Atoms::winActive, 0L, 1L, false, XA_WINDOW, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) memcpy (&w, data, sizeof (Window)); XFree (data); } return w; } bool CompScreen::fileToImage (CompString &name, CompSize &size, int &stride, void *&data) { WRAPABLE_HND_FUNCTN_RETURN (bool, fileToImage, name, size, stride, data); return _fileToImage(name, size, stride, data); } bool CompScreenImpl::_fileToImage (CompString &name, CompSize &size, int &stride, void *&data) { return false; } bool CompScreen::imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data) { WRAPABLE_HND_FUNCTN_RETURN (bool, imageToFile, path, format, size, stride, data); return _imageToFile (path, format, size, stride, data); } bool CompScreenImpl::_imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data) { return false; } void CompScreen::logMessage (const char *componentName, CompLogLevel level, const char *message) { WRAPABLE_HND_FUNCTN (logMessage, componentName, level, message) _logMessage (componentName, level, message); } void CompScreenImpl::_logMessage (const char *componentName, CompLogLevel level, const char *message) { ::logMessage (componentName, level, message); } int cps::XWindowInfo::getWmState (Window id) { Atom actual; int result, format; unsigned long n, left; unsigned char *data; unsigned long state = NormalState; result = XGetWindowProperty (dpy, id, Atoms::wmState, 0L, 2L, false, Atoms::wmState, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) memcpy (&state, data, sizeof (unsigned long)); XFree ((void *) data); } return state; } void cps::XWindowInfo::setWmState (int state, Window id) const { unsigned long data[2]; data[0] = state; data[1] = None; XChangeProperty (dpy, id, Atoms::wmState, Atoms::wmState, 32, PropModeReplace, (unsigned char *) data, 2); } unsigned int cps::windowStateMask (Atom state) { if (state == Atoms::winStateModal) return CompWindowStateModalMask; else if (state == Atoms::winStateSticky) return CompWindowStateStickyMask; else if (state == Atoms::winStateMaximizedVert) return CompWindowStateMaximizedVertMask; else if (state == Atoms::winStateMaximizedHorz) return CompWindowStateMaximizedHorzMask; else if (state == Atoms::winStateShaded) return CompWindowStateShadedMask; else if (state == Atoms::winStateSkipTaskbar) return CompWindowStateSkipTaskbarMask; else if (state == Atoms::winStateSkipPager) return CompWindowStateSkipPagerMask; else if (state == Atoms::winStateHidden) return CompWindowStateHiddenMask; else if (state == Atoms::winStateFullscreen) return CompWindowStateFullscreenMask; else if (state == Atoms::winStateAbove) return CompWindowStateAboveMask; else if (state == Atoms::winStateBelow) return CompWindowStateBelowMask; else if (state == Atoms::winStateDemandsAttention) return CompWindowStateDemandsAttentionMask; else if (state == Atoms::winStateDisplayModal) return CompWindowStateDisplayModalMask; return 0; } unsigned int cps::windowStateFromString (const char *str) { if (strcasecmp (str, "modal") == 0) return CompWindowStateModalMask; else if (strcasecmp (str, "sticky") == 0) return CompWindowStateStickyMask; else if (strcasecmp (str, "maxvert") == 0) return CompWindowStateMaximizedVertMask; else if (strcasecmp (str, "maxhorz") == 0) return CompWindowStateMaximizedHorzMask; else if (strcasecmp (str, "shaded") == 0) return CompWindowStateShadedMask; else if (strcasecmp (str, "skiptaskbar") == 0) return CompWindowStateSkipTaskbarMask; else if (strcasecmp (str, "skippager") == 0) return CompWindowStateSkipPagerMask; else if (strcasecmp (str, "hidden") == 0) return CompWindowStateHiddenMask; else if (strcasecmp (str, "fullscreen") == 0) return CompWindowStateFullscreenMask; else if (strcasecmp (str, "above") == 0) return CompWindowStateAboveMask; else if (strcasecmp (str, "below") == 0) return CompWindowStateBelowMask; else if (strcasecmp (str, "demandsattention") == 0) return CompWindowStateDemandsAttentionMask; return 0; } unsigned int cps::XWindowInfo::getWindowState (Window id) { Atom actual; int result, format; unsigned long n, left; unsigned char *data; unsigned int state = 0; result = XGetWindowProperty (dpy, id, Atoms::winState, 0L, 1024L, false, XA_ATOM, &actual, &format, &n, &left, &data); if (result == Success && data) { Atom *a = (Atom *) data; while (n--) state |= cps::windowStateMask (*a++); XFree ((void *) data); } return state; } unsigned int compiz::window::fillStateData (unsigned int state, Atom *data) { int i = 0; if (state & CompWindowStateModalMask) data[i++] = Atoms::winStateModal; if (state & CompWindowStateStickyMask) data[i++] = Atoms::winStateSticky; if (state & CompWindowStateMaximizedVertMask) data[i++] = Atoms::winStateMaximizedVert; if (state & CompWindowStateMaximizedHorzMask) data[i++] = Atoms::winStateMaximizedHorz; if (state & CompWindowStateShadedMask) data[i++] = Atoms::winStateShaded; if (state & CompWindowStateSkipTaskbarMask) data[i++] = Atoms::winStateSkipTaskbar; if (state & CompWindowStateSkipPagerMask) data[i++] = Atoms::winStateSkipPager; if (state & CompWindowStateHiddenMask) data[i++] = Atoms::winStateHidden; if (state & CompWindowStateFullscreenMask) data[i++] = Atoms::winStateFullscreen; if (state & CompWindowStateAboveMask) data[i++] = Atoms::winStateAbove; if (state & CompWindowStateBelowMask) data[i++] = Atoms::winStateBelow; if (state & CompWindowStateDemandsAttentionMask) data[i++] = Atoms::winStateDemandsAttention; if (state & CompWindowStateDisplayModalMask) data[i++] = Atoms::winStateDisplayModal; if (state & CompWindowStateFocusedMask) data[i++] = Atoms::winStateFocused; return i; } void PrivateScreen::setWindowState (unsigned int state, Window id) { int i = 0; Atom data[32]; i = compiz::window::fillStateData (state, data); XChangeProperty (dpy, id, Atoms::winState, XA_ATOM, 32, PropModeReplace, (unsigned char *) data, i); } unsigned int cps::XWindowInfo::getWindowType (Window id) { Atom actual, a = None; int result, format; unsigned long n, left; unsigned char *data; result = XGetWindowProperty (dpy , id, Atoms::winType, 0L, 1L, false, XA_ATOM, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) memcpy (&a, data, sizeof (Atom)); XFree ((void *) data); } if (a) { if (a == Atoms::winTypeNormal) return CompWindowTypeNormalMask; else if (a == Atoms::winTypeMenu) return CompWindowTypeMenuMask; else if (a == Atoms::winTypeDesktop) return CompWindowTypeDesktopMask; else if (a == Atoms::winTypeDock) return CompWindowTypeDockMask; else if (a == Atoms::winTypeToolbar) return CompWindowTypeToolbarMask; else if (a == Atoms::winTypeUtil) return CompWindowTypeUtilMask; else if (a == Atoms::winTypeSplash) return CompWindowTypeSplashMask; else if (a == Atoms::winTypeDialog) return CompWindowTypeDialogMask; else if (a == Atoms::winTypeDropdownMenu) return CompWindowTypeDropdownMenuMask; else if (a == Atoms::winTypePopupMenu) return CompWindowTypePopupMenuMask; else if (a == Atoms::winTypeTooltip) return CompWindowTypeTooltipMask; else if (a == Atoms::winTypeNotification) return CompWindowTypeNotificationMask; else if (a == Atoms::winTypeCombo) return CompWindowTypeComboMask; else if (a == Atoms::winTypeDnd) return CompWindowTypeDndMask; } return CompWindowTypeUnknownMask; } void cps::XWindowInfo::getMwmHints (Window id, unsigned int *func, unsigned int *decor) const { Atom actual; int result, format; unsigned long n, left; unsigned char *data; *func = MwmFuncAll; *decor = MwmDecorAll; result = XGetWindowProperty (dpy, id, Atoms::mwmHints, 0L, 20L, false, Atoms::mwmHints, &actual, &format, &n, &left, &data); if (result == Success && data) { MwmHints *mwmHints = (MwmHints *) data; if (n >= PropMotifWmHintElements) { if (mwmHints->flags & MwmHintsDecorations) *decor = mwmHints->decorations; if (mwmHints->flags & MwmHintsFunctions) *func = mwmHints->functions; } XFree (data); } } unsigned int cps::XWindowInfo::getProtocols (Window id) { Atom *protocol; int count; unsigned int protocols = 0; if (XGetWMProtocols (dpy, id, &protocol, &count)) { for (int i = 0; i < count; i++) { if (protocol[i] == Atoms::wmDeleteWindow) protocols |= CompWindowProtocolDeleteMask; else if (protocol[i] == Atoms::wmTakeFocus) protocols |= CompWindowProtocolTakeFocusMask; else if (protocol[i] == Atoms::wmPing) protocols |= CompWindowProtocolPingMask; else if (protocol[i] == Atoms::wmSyncRequest) protocols |= CompWindowProtocolSyncRequestMask; } XFree (protocol); } return protocols; } unsigned int CompScreenImpl::getWindowProp (Window id, Atom property, unsigned int defaultValue) { Atom actual; int result, format; unsigned long n, left; unsigned char *data; unsigned int retval = defaultValue; result = XGetWindowProperty (privateScreen.dpy, id, property, 0L, 1L, false, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) { unsigned long value; memcpy (&value, data, sizeof (unsigned long)); retval = (unsigned int) value; } XFree (data); } return retval; } void CompScreenImpl::setWindowProp (Window id, Atom property, unsigned int value) { unsigned long data = value; XChangeProperty (privateScreen.dpy, id, property, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1); } bool PrivateScreen::readWindowProp32 (Window id, Atom property, unsigned short *returnValue) { Atom actual; int result, format; unsigned long n, left; unsigned char *data; bool retval = false; result = XGetWindowProperty (dpy, id, property, 0L, 1L, false, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) { CARD32 value; memcpy (&value, data, sizeof (CARD32)); retval = true; *returnValue = value >> 16; } XFree (data); } return retval; } unsigned short CompScreenImpl::getWindowProp32 (Window id, Atom property, unsigned short defaultValue) { unsigned short result; if (privateScreen.readWindowProp32 (id, property, &result)) return result; return defaultValue; } void CompScreenImpl::setWindowProp32 (Window id, Atom property, unsigned short value) { CARD32 value32; value32 = value << 16 | value; XChangeProperty (privateScreen.dpy, id, property, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &value32, 1); } void ScreenInterface::handleEvent (XEvent *event) WRAPABLE_DEF (handleEvent, event) void ScreenInterface::handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options) WRAPABLE_DEF (handleCompizEvent, plugin, event, options) bool ScreenInterface::fileToImage (CompString &name, CompSize &size, int &stride, void *&data) WRAPABLE_DEF (fileToImage, name, size, stride, data) bool ScreenInterface::imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data) WRAPABLE_DEF (imageToFile, path, format, size, stride, data) CompMatch::Expression * ScreenInterface::matchInitExp (const CompString& value) WRAPABLE_DEF (matchInitExp, value) void ScreenInterface::matchExpHandlerChanged () WRAPABLE_DEF (matchExpHandlerChanged) void ScreenInterface::matchPropertyChanged (CompWindow *window) WRAPABLE_DEF (matchPropertyChanged, window) void ScreenInterface::logMessage (const char *componentName, CompLogLevel level, const char *message) WRAPABLE_DEF (logMessage, componentName, level, message) bool PrivateScreen::desktopHintEqual (unsigned long *data, int size, int offset, int hintSize) { if (size != desktopHintSize) return false; if (memcmp (data + offset, desktopHintData + offset, hintSize * sizeof (unsigned long)) == 0) return true; return false; } void PrivateScreen::setDesktopHints () { unsigned long *data; int dSize = nDesktop * 2 + nDesktop * 2 + nDesktop * 4 + 1; data = (unsigned long *) malloc (sizeof (unsigned long) * dSize); if (!data) return; unsigned int i; int offset = 0; int hintSize = nDesktop * 2; for (i = 0; i < nDesktop; i++) { data[offset + i * 2 + 0] = viewPort.vp.x () * screen->width (); data[offset + i * 2 + 1] = viewPort.vp.y () * screen->height (); } if (!desktopHintEqual (data, dSize, offset, hintSize)) XChangeProperty (dpy, rootWindow(), Atoms::desktopViewport, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data[offset], hintSize); offset += hintSize; for (i = 0; i < nDesktop; i++) { data[offset + i * 2 + 0] = screen->width () * viewPort.vpSize.width (); data[offset + i * 2 + 1] = screen->height () * viewPort.vpSize.height (); } if (!desktopHintEqual (data, dSize, offset, hintSize)) XChangeProperty (dpy, rootWindow(), Atoms::desktopGeometry, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data[offset], hintSize); offset += hintSize; hintSize = nDesktop * 4; for (i = 0; i < nDesktop; i++) { data[offset + i * 4 + 0] = workArea.x (); data[offset + i * 4 + 1] = workArea.y (); data[offset + i * 4 + 2] = workArea.width (); data[offset + i * 4 + 3] = workArea.height (); } if (!desktopHintEqual (data, dSize, offset, hintSize)) XChangeProperty (dpy, rootWindow(), Atoms::workarea, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data[offset], hintSize); offset += hintSize; data[offset] = nDesktop; hintSize = 1; if (!desktopHintEqual (data, dSize, offset, hintSize)) XChangeProperty (dpy, rootWindow(), Atoms::numberOfDesktops, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data[offset], hintSize); if (desktopHintData) free (desktopHintData); desktopHintData = data; desktopHintSize = dSize; } void PrivateScreen::setVirtualScreenSize (int newh, int newv) { /* if newh or newv is being reduced */ if (newh < screen->vpSize ().width () || newv < screen->vpSize ().height ()) { int tx = 0; int ty = 0; if (screen->vp ().x () >= newh) tx = screen->vp ().x () - (newh - 1); if (screen->vp ().y () >= newv) ty = screen->vp ().y () - (newv - 1); if (tx != 0 || ty != 0) screen->moveViewport (tx, ty, TRUE); /* Move windows that were in one of the deleted viewports into the closest viewport */ foreach (CompWindow *w, screen->windows ()) { int moveX = 0; int moveY = 0; if (w->onAllViewports ()) continue; /* Find which viewport the (inner) window's top-left corner falls in, and check if it's outside the new viewport horizontal and vertical index range */ if (newh < screen->vpSize ().width ()) { int vpX; /* x index of a window's vp */ vpX = w->serverX () / screen->width (); if (w->serverX () < 0) vpX -= 1; vpX += screen->vp ().x (); /* Convert relative to absolute vp index */ /* Move windows too far right to left */ if (vpX >= newh) moveX = ((newh - 1) - vpX) * screen->width (); } if (newv < screen->vpSize ().height ()) { int vpY; /* y index of a window's vp */ vpY = w->serverY () / screen->height (); if (w->serverY () < 0) vpY -= 1; vpY += screen->vp ().y (); /* Convert relative to absolute vp index */ /* Move windows too far right to left */ if (vpY >= newv) moveY = ((newv - 1) - vpY) * screen->height (); } if (moveX != 0 || moveY != 0) { unsigned int valueMask = CWX | CWY; XWindowChanges xwc; xwc.x = w->serverGeometry ().x () + moveX; xwc.y = w->serverGeometry ().y () + moveY; w->configureXWindow (valueMask, &xwc); } } } viewPort.vpSize.setWidth (newh); viewPort.vpSize.setHeight (newv); setDesktopHints (); } void PrivateScreen::updateOutputDevices (CoreOptions& coreOptions) { outputDevices.updateOutputDevices(coreOptions, screen); windowManager.clearFullscreenHints(); screen->updateWorkarea (); screen->outputChangeNotify (); } void PrivateScreen::detectOutputDevices (CoreOptions& coreOptions) { if (coreOptions.optionGetDetectOutputs ()) { CompString name; CompOption::Value value; if (!screenInfo.empty ()) { CompOption::Value::Vector l; foreach (XineramaScreenInfo xi, screenInfo) { l.push_back (compPrintf ("%dx%d+%d+%d", xi.width, xi.height, xi.x_org, xi.y_org)); } value.set (CompOption::TypeString, l); } else { CompOption::Value::Vector l; l.push_back (compPrintf ("%dx%d+%d+%d", screen->width (), screen->height (), 0, 0)); value.set (CompOption::TypeString, l); } coreOptions.getOptions()[CoreOptions::DetectOutputs].value ().set (false); screen->setOptionForPlugin ("core", "outputs", value); coreOptions.getOptions()[CoreOptions::DetectOutputs].value ().set (true); } else { updateOutputDevices (coreOptions); } } void cps::StartupSequenceImpl::updateStartupFeedback () { if (priv->initialized) { if (!emptySequence()) XIDefineCursor (priv->dpy, priv->clientPointerDeviceId, priv->rootWindow(), priv->busyCursor); else XIDefineCursor (priv->dpy, priv->clientPointerDeviceId, priv->rootWindow(), priv->normalCursor); } } static const unsigned int STARTUP_TIMEOUT_DELAY = 15000; bool cps::StartupSequence::handleStartupSequenceTimeout () { struct timeval now, active; double elapsed; gettimeofday (&now, NULL); foreach (CompStartupSequence *s, startupSequences) { sn_startup_sequence_get_last_active_time (s->sequence, &active.tv_sec, &active.tv_usec); elapsed = ((((double) now.tv_sec - active.tv_sec) * 1000000.0 + (now.tv_usec - active.tv_usec))) / 1000.0; if (elapsed > STARTUP_TIMEOUT_DELAY) sn_startup_sequence_complete (s->sequence); } return true; } void cps::StartupSequence::addSequence (SnStartupSequence *sequence, CompPoint const& vp) { CompStartupSequence *s; s = new CompStartupSequence (); if (!s) return; sn_startup_sequence_ref (sequence); s->sequence = sequence; s->viewportX = vp.x (); s->viewportY = vp.y (); startupSequences.push_front (s); if (!startupSequenceTimer.active ()) startupSequenceTimer.start (); updateStartupFeedback (); } void cps::StartupSequence::removeSequence (SnStartupSequence *sequence) { CompStartupSequence *s = NULL; std::list::iterator it = startupSequences.begin (); for (; it != startupSequences.end (); ++it) { if ((*it)->sequence == sequence) { s = (*it); break; } } if (!s) return; sn_startup_sequence_unref (sequence); startupSequences.erase (it); delete s; if (startupSequences.empty () && startupSequenceTimer.active ()) startupSequenceTimer.stop (); updateStartupFeedback (); } void cps::StartupSequence::removeAllSequences () { foreach (CompStartupSequence *s, startupSequences) { sn_startup_sequence_unref (s->sequence); delete s; } startupSequences.clear (); if (startupSequenceTimer.active ()) startupSequenceTimer.stop (); updateStartupFeedback (); } void PrivateScreen::compScreenSnEvent (SnMonitorEvent *event, void *userData) { PrivateScreen *self = (PrivateScreen *) userData; SnStartupSequence *sequence; sequence = sn_monitor_event_get_startup_sequence (event); switch (sn_monitor_event_get_type (event)) { case SN_MONITOR_EVENT_INITIATED: self->startupSequence.addSequence (sequence, self->viewPort.vp); break; case SN_MONITOR_EVENT_COMPLETED: self->startupSequence.removeSequence (sequence); break; case SN_MONITOR_EVENT_CHANGED: case SN_MONITOR_EVENT_CANCELED: break; } } void PrivateScreen::updateScreenEdges () { struct screenEdgeGeometry { int xw, x0; int yh, y0; int ww, w0; int hh, h0; } geometry[SCREEN_EDGE_NUM] = { { 0, -1, 0, 2, 0, 2, 1, -4 }, /* left */ { 1, -1, 0, 2, 0, 2, 1, -4 }, /* right */ { 0, 2, 0, -1, 1, -4, 0, 2 }, /* top */ { 0, 2, 1, -1, 1, -4, 0, 2 }, /* bottom */ { 0, -1, 0, -1, 0, 2, 0, 2 }, /* top-left */ { 1, -1, 0, -1, 0, 2, 0, 2 }, /* top-right */ { 0, -1, 1, -1, 0, 2, 0, 2 }, /* bottom-left */ { 1, -1, 1, -1, 0, 2, 0, 2 } /* bottom-right */ }; for (int i = 0; i < SCREEN_EDGE_NUM; i++) { if (screenEdge[i].id) XMoveResizeWindow (dpy, screenEdge[i].id, geometry[i].xw * screen->width () + geometry[i].x0, geometry[i].yh * screen->height () + geometry[i].y0, geometry[i].ww * screen->width () + geometry[i].w0, geometry[i].hh * screen->height () + geometry[i].h0); } } void PrivateScreen::reshape (int w, int h) { updateScreenInfo (); region = CompRegion (0, 0, w, h); screen->setWidth (w); screen->setHeight (h); fullscreenOutput.setId ("fullscreen", ~0); fullscreenOutput.setGeometry (0, 0, w, h); updateScreenEdges (); } void PrivateScreen::configure (XConfigureEvent *ce) { if (attrib.width != ce->width || attrib.height != ce->height) { attrib.width = ce->width; attrib.height = ce->height; } reshape (ce->width, ce->height); detectOutputDevices (*this); updateOutputDevices (*this); } void cps::EventManager::setSupportingWmCheck (Display* dpy, Window root) { XChangeProperty (dpy, grabWindow, Atoms::supportingWmCheck, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &grabWindow, 1); XChangeProperty (dpy, grabWindow, Atoms::wmName, Atoms::utf8String, 8, PropModeReplace, (unsigned char *) PACKAGE, strlen (PACKAGE)); XChangeProperty (dpy, grabWindow, Atoms::winState, XA_ATOM, 32, PropModeReplace, (unsigned char *) &Atoms::winStateSkipTaskbar, 1); XChangeProperty (dpy, grabWindow, Atoms::winState, XA_ATOM, 32, PropModeAppend, (unsigned char *) &Atoms::winStateSkipPager, 1); XChangeProperty (dpy, grabWindow, Atoms::winState, XA_ATOM, 32, PropModeAppend, (unsigned char *) &Atoms::winStateHidden, 1); XChangeProperty (dpy, root, Atoms::supportingWmCheck, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &grabWindow, 1); } void cps::EventManager::createGrabWindow (Display* dpy, Window root, XSetWindowAttributes* attrib) { grabWindow = XCreateWindow (dpy, root, -100, -100, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect | CWEventMask, attrib); XMapWindow (dpy, grabWindow); } void CompScreenImpl::updateSupportedWmHints () { std::vector atoms; addSupportedAtoms (atoms); XChangeProperty (dpy (), root (), Atoms::supported, XA_ATOM, 32, PropModeReplace, (const unsigned char *) &atoms.at (0), atoms.size ()); } void CompScreen::addSupportedAtoms (std::vector &atoms) { WRAPABLE_HND_FUNCTN (addSupportedAtoms, atoms); _addSupportedAtoms (atoms); } void CompScreenImpl::_addSupportedAtoms (std::vector &atoms) { atoms.push_back (Atoms::supported); atoms.push_back (Atoms::supportingWmCheck); atoms.push_back (Atoms::utf8String); atoms.push_back (Atoms::clientList); atoms.push_back (Atoms::clientListStacking); atoms.push_back (Atoms::winActive); atoms.push_back (Atoms::desktopViewport); atoms.push_back (Atoms::desktopGeometry); atoms.push_back (Atoms::currentDesktop); atoms.push_back (Atoms::numberOfDesktops); atoms.push_back (Atoms::showingDesktop); atoms.push_back (Atoms::workarea); atoms.push_back (Atoms::wmName); /* atoms.push_back (Atoms::wmVisibleName); */ atoms.push_back (Atoms::wmStrut); atoms.push_back (Atoms::wmStrutPartial); /* atoms.push_back (Atoms::wmPid); */ atoms.push_back (Atoms::wmUserTime); atoms.push_back (Atoms::frameExtents); atoms.push_back (Atoms::frameWindow); atoms.push_back (Atoms::winState); atoms.push_back (Atoms::winStateModal); atoms.push_back (Atoms::winStateSticky); atoms.push_back (Atoms::winStateMaximizedVert); atoms.push_back (Atoms::winStateMaximizedHorz); atoms.push_back (Atoms::winStateShaded); atoms.push_back (Atoms::winStateSkipTaskbar); atoms.push_back (Atoms::winStateSkipPager); atoms.push_back (Atoms::winStateHidden); atoms.push_back (Atoms::winStateFullscreen); atoms.push_back (Atoms::winStateAbove); atoms.push_back (Atoms::winStateBelow); atoms.push_back (Atoms::winStateDemandsAttention); atoms.push_back (Atoms::winStateFocused); atoms.push_back (Atoms::winOpacity); atoms.push_back (Atoms::winBrightness); /* FIXME */ #if 0 if (canDoSaturated) { atoms.push_back (Atoms::winSaturation); atoms.push_back (Atoms::winStateDisplayModal); } #endif atoms.push_back (Atoms::wmAllowedActions); atoms.push_back (Atoms::winActionMove); atoms.push_back (Atoms::winActionResize); atoms.push_back (Atoms::winActionStick); atoms.push_back (Atoms::winActionMinimize); atoms.push_back (Atoms::winActionMaximizeHorz); atoms.push_back (Atoms::winActionMaximizeVert); atoms.push_back (Atoms::winActionFullscreen); atoms.push_back (Atoms::winActionClose); atoms.push_back (Atoms::winActionShade); atoms.push_back (Atoms::winActionChangeDesktop); atoms.push_back (Atoms::winActionAbove); atoms.push_back (Atoms::winActionBelow); atoms.push_back (Atoms::winType); atoms.push_back (Atoms::winTypeDesktop); atoms.push_back (Atoms::winTypeDock); atoms.push_back (Atoms::winTypeToolbar); atoms.push_back (Atoms::winTypeMenu); atoms.push_back (Atoms::winTypeSplash); atoms.push_back (Atoms::winTypeDialog); atoms.push_back (Atoms::winTypeUtil); atoms.push_back (Atoms::winTypeNormal); atoms.push_back (Atoms::wmDeleteWindow); atoms.push_back (Atoms::wmPing); atoms.push_back (Atoms::wmMoveResize); atoms.push_back (Atoms::moveResizeWindow); atoms.push_back (Atoms::restackWindow); atoms.push_back (Atoms::wmFullscreenMonitors); } void PrivateScreen::getDesktopHints (unsigned int showingDesktopMask) { unsigned long data[2]; Atom actual; int result, format; unsigned long n, left; unsigned char *propData; if (useDesktopHints) { result = XGetWindowProperty (dpy, rootWindow(), Atoms::numberOfDesktops, 0L, 1L, false, XA_CARDINAL, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (n) { memcpy (data, propData, sizeof (unsigned long)); if (data[0] > 0 && data[0] < 0xffffffff) nDesktop = data[0]; } XFree (propData); } result = XGetWindowProperty (dpy, rootWindow(), Atoms::desktopViewport, 0L, 2L, false, XA_CARDINAL, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (n == 2) { memcpy (data, propData, sizeof (unsigned long) * 2); if (data[0] / (unsigned int) screen->width () < (unsigned int) viewPort.vpSize.width () - 1) viewPort.vp.setX (data[0] / screen->width ()); if (data[1] / (unsigned int) screen->height () < (unsigned int) viewPort.vpSize.height () - 1) viewPort.vp.setY (data[1] / screen->height ()); } XFree (propData); } result = XGetWindowProperty (dpy, rootWindow(), Atoms::currentDesktop, 0L, 1L, false, XA_CARDINAL, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (n) { memcpy (data, propData, sizeof (unsigned long)); if (data[0] < nDesktop) currentDesktop = data[0]; } XFree (propData); } } result = XGetWindowProperty (dpy, rootWindow(), Atoms::showingDesktop, 0L, 1L, false, XA_CARDINAL, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (n) { memcpy (data, propData, sizeof (unsigned long)); if (data[0]) screen->enterShowDesktopMode (); } XFree (propData); } data[0] = currentDesktop; XChangeProperty (dpy, rootWindow(), Atoms::currentDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) data, 1); data[0] = showingDesktopMask ? true : false; XChangeProperty (dpy, rootWindow(), Atoms::showingDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) data, 1); } void CompScreen::enterShowDesktopMode () { WRAPABLE_HND_FUNCTN (enterShowDesktopMode) _enterShowDesktopMode (); } unsigned int CompScreenImpl::showingDesktopMask() const { return showingDesktopMask_; } bool CompScreenImpl::grabsEmpty() const { return privateScreen.eventManager.grabsEmpty(); } void CompScreenImpl::_enterShowDesktopMode () { unsigned long data = 1; int count = 0; bool st = privateScreen.optionGetHideSkipTaskbarWindows (); showingDesktopMask_ = ~(CompWindowTypeDesktopMask | CompWindowTypeDockMask); for (cps::WindowManager::iterator i = windowManager.begin(); i != windowManager.end(); ++i) { CompWindow* const w(*i); if ((showingDesktopMask_ & w->wmType ()) && (!(w->state () & CompWindowStateSkipTaskbarMask) || st)) { if (!w->inShowDesktopMode () && !w->grabbed () && w->managed () && w->focus ()) { w->setShowDesktopMode (true); w->windowNotify (CompWindowNotifyEnterShowDesktopMode); w->priv->hide (); } } if (w->inShowDesktopMode ()) count++; } if (!count) { showingDesktopMask_ = 0; data = 0; } XChangeProperty (privateScreen.dpy, privateScreen.rootWindow(), Atoms::showingDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1); } void CompScreen::leaveShowDesktopMode (CompWindow *window) { WRAPABLE_HND_FUNCTN (leaveShowDesktopMode, window) _leaveShowDesktopMode (window); } void CompScreenImpl::_leaveShowDesktopMode (CompWindow *window) { unsigned long data = 0; if (window) { if (!window->inShowDesktopMode ()) return; window->setShowDesktopMode (false); window->windowNotify (CompWindowNotifyLeaveShowDesktopMode); window->priv->show (); /* return if some other window is still in show desktop mode */ for (cps::WindowManager::iterator i = windowManager.begin(); i != windowManager.end(); ++i) { CompWindow* const w(*i); if (w->inShowDesktopMode ()) return; } showingDesktopMask_ = 0; } else { showingDesktopMask_ = 0; for (cps::WindowManager::iterator i = windowManager.begin(); i != windowManager.end(); ++i) { CompWindow* const w(*i); if (!w->inShowDesktopMode ()) continue; w->setShowDesktopMode (false); w->windowNotify (CompWindowNotifyLeaveShowDesktopMode); w->priv->show (); } /* focus default window - most likely this will be the window which had focus before entering showdesktop mode */ focusDefaultWindow (); } XChangeProperty (privateScreen.dpy, privateScreen.rootWindow(), Atoms::showingDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1); } void CompScreenImpl::forEachWindow (CompWindow::ForEach proc) { windowManager.forEachWindow(proc); } void CompScreenImpl::focusDefaultWindow () { CompWindow *w; CompWindow *focus = NULL; if (!privateScreen.optionGetClickToFocus ()) { w = findTopLevelWindow (below); if (w && w->focus ()) { if (!(w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) focus = w; } else { bool status; Window rootReturn, childReturn; int dummyInt; unsigned int dummyUInt; /* huh, we didn't find d->below ... perhaps it's out of date; try grabbing it through the server */ status = XQueryPointer (dpy (), privateScreen.rootWindow(), &rootReturn, &childReturn, &dummyInt, &dummyInt, &dummyInt, &dummyInt, &dummyUInt); if (status && rootReturn == privateScreen.rootWindow()) { w = findTopLevelWindow (childReturn); if (w && w->focus ()) { if (!(w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) focus = w; } } } } if (!focus) { /* Traverse down the stack */ for (cps::WindowManager::reverse_iterator rit = windowManager.rbegin(); rit != windowManager.rend(); ++rit) { w = (*rit); if (w->type () & CompWindowTypeDockMask) continue; if (w->focus ()) { if (focus) { if (w->type () & (CompWindowTypeNormalMask | CompWindowTypeDialogMask | CompWindowTypeModalDialogMask)) { if (!privateScreen.optionGetClickToFocus ()) { /* We should favor the more active window in the mouse focus * case since the user does not care if the focused window is on top */ if (PrivateWindow::compareWindowActiveness (focus, w) < 0) focus = w; } else { focus = w; break; } } } else { focus = w; if (privateScreen.optionGetClickToFocus ()) break; } } } } if (focus) { if (focus->id () != privateScreen.orphanData.activeWindow) focus->moveInputFocusTo (); } else { XSetInputFocus (privateScreen.dpy, privateScreen.rootWindow(), RevertToPointerRoot, CurrentTime); } } CompWindow * CompScreenImpl::findWindow (Window id) { return windowManager.findWindow (id); } CompWindow* cps::WindowManager::findWindow (Window id) const { if (lastFoundWindow && lastFoundWindow->id () == id) { return lastFoundWindow; } else { CompWindow::Map::const_iterator it = windowsMap.find (id); if (it != windowsMap.end ()) return (lastFoundWindow = it->second); } return 0; } CompWindow * CompScreenImpl::findTopLevelWindow (Window id, bool override_redirect) { CompWindow *w; w = findWindow (id); if (w) { if (w->overrideRedirect () && !override_redirect) return NULL; else return w; } for (cps::WindowManager::iterator i = windowManager.begin(); i != windowManager.end(); ++i) { CompWindow* const w(*i); if (w->priv->serverFrame == id) { if (w->overrideRedirect () && !override_redirect) return NULL; else return w; } } return NULL; } void CompScreenImpl::insertWindow (CompWindow *w, Window aboveId) { windowManager.insertWindow (w, aboveId); } void cps::WindowManager::insertWindow (CompWindow* w, Window aboveId) { StackDebugger *dbg = StackDebugger::Default (); if (dbg) dbg->windowsChanged (true); invalidateServerWindows(); w->prev = NULL; w->next = NULL; if (!aboveId || windows.empty ()) { if (!windows.empty ()) { windows.front ()->prev = w; w->next = windows.front (); } windows.push_front (w); addWindowToMap(w); return; } CompWindowList::iterator it = windows.begin (); while (it != windows.end ()) { if ((*it)->id () == aboveId || ((*it)->priv->frame && (*it)->priv->frame == aboveId)) { break; } ++it; } if (it == windows.end ()) { compLogMessage ("core", CompLogLevelDebug, "could not insert 0x%x above 0x%x", (unsigned int) w->priv->serverId, aboveId); #ifdef DEBUG abort (); #endif return; } w->next = (*it)->next; w->prev = (*it); (*it)->next = w; if (w->next) { w->next->prev = w; } windows.insert (++it, w); addWindowToMap(w); } void CompScreenImpl::insertServerWindow (CompWindow *w, Window aboveId) { windowManager.insertServerWindow(w, aboveId); } void cps::WindowManager::insertServerWindow(CompWindow* w, Window aboveId) { StackDebugger *dbg = StackDebugger::Default (); if (dbg) dbg->serverWindowsChanged (true); w->serverPrev = NULL; w->serverNext = NULL; if (!aboveId || serverWindows.empty ()) { if (!serverWindows.empty ()) { serverWindows.front ()->serverPrev = w; w->serverNext = serverWindows.front (); } serverWindows.push_front (w); return; } CompWindowList::iterator it = serverWindows.begin (); while (it != serverWindows.end ()) { if ((*it)->priv->serverId == aboveId || ((*it)->priv->serverFrame && (*it)->priv->serverFrame == aboveId)) { break; } ++it; } if (it == serverWindows.end ()) { compLogMessage ("core", CompLogLevelWarn, "could not insert 0x%x above 0x%x", (unsigned int) w->priv->serverId, aboveId); #ifdef DEBUG abort (); #endif return; } w->serverNext = (*it)->serverNext; w->serverPrev = (*it); (*it)->serverNext = w; if (w->serverNext) { w->serverNext->serverPrev = w; } serverWindows.insert (++it, w); } void cps::WindowManager::eraseWindowFromMap (Window id) { if (id != 1) windowsMap.erase (id); } void CompScreenImpl::unhookWindow (CompWindow *w) { windowManager.unhookWindow (w); } void cps::WindowManager::unhookWindow(CompWindow* w) { StackDebugger *dbg = StackDebugger::Default (); if (dbg) dbg->windowsChanged (true); CompWindowList::iterator it = std::find (windows.begin(), windows.end(), w); if (it == windows.end()) { compLogMessage ("core", CompLogLevelWarn, "a broken plugin tried to remove a window twice, we won't allow that!"); return; } windows.erase (it); eraseWindowFromMap (w->id ()); if (w->next) w->next->prev = w->prev; if (w->prev) w->prev->next = w->next; w->next = NULL; w->prev = NULL; removeFromFindWindowCache(w); } void CompScreenImpl::unhookServerWindow (CompWindow *w) { windowManager.unhookServerWindow (w); } void cps::WindowManager::unhookServerWindow (CompWindow *w) { StackDebugger *dbg = StackDebugger::Default (); if (dbg) dbg->serverWindowsChanged (true); CompWindowList::iterator it = std::find (serverWindows.begin (), serverWindows.end (), w); if (it == serverWindows.end ()) { compLogMessage ("core", CompLogLevelWarn, "a broken plugin tried to remove a window twice, we won't allow that!"); return; } serverWindows.erase (it); if (w->serverNext) w->serverNext->serverPrev = w->serverPrev; if (w->serverPrev) w->serverPrev->serverNext = w->serverNext; w->serverNext = NULL; w->serverPrev = NULL; } Cursor CompScreenImpl::normalCursor () { return privateScreen.normalCursor; } Cursor CompScreenImpl::invisibleCursor () { return privateScreen.invisibleCursor; } #define POINTER_GRAB_MASK (ButtonReleaseMask | \ ButtonPressMask | \ PointerMotionMask) CompScreenImpl::GrabHandle CompScreenImpl::pushGrab (Cursor cursor, const char *name) { if (privateScreen.eventManager.grabsEmpty ()) { int status; status = XGrabPointer (privateScreen.dpy, privateScreen.eventManager.getGrabWindow(), true, POINTER_GRAB_MASK, GrabModeAsync, GrabModeAsync, privateScreen.rootWindow(), cursor, CurrentTime); if (status == GrabSuccess) { status = XGrabKeyboard (privateScreen.dpy, privateScreen.eventManager.getGrabWindow(), true, GrabModeAsync, GrabModeAsync, CurrentTime); if (status != GrabSuccess) { XUngrabPointer (privateScreen.dpy, CurrentTime); return NULL; } } else return NULL; } else { XChangeActivePointerGrab (privateScreen.dpy, POINTER_GRAB_MASK, cursor, CurrentTime); } cps::Grab *grab = new cps::Grab (cursor, name); privateScreen.eventManager.grabsPush (grab); return grab; } void CompScreenImpl::updateGrab (CompScreen::GrabHandle handle, Cursor cursor) { if (!handle) return; XChangeActivePointerGrab (privateScreen.dpy, POINTER_GRAB_MASK, cursor, CurrentTime); handle->cursor = cursor; } void CompScreenImpl::removeGrab (CompScreen::GrabHandle handle, CompPoint *restorePointer) { if (!handle) return; privateScreen.eventManager.grabsRemove(handle); if (!privateScreen.eventManager.grabsEmpty ()) { XChangeActivePointerGrab (privateScreen.dpy, POINTER_GRAB_MASK, privateScreen.eventManager.grabsBack ()->cursor, CurrentTime); } else { if (restorePointer) warpPointer (restorePointer->x () - pointerX, restorePointer->y () - pointerY); XUngrabPointer (privateScreen.dpy, CurrentTime); XUngrabKeyboard (privateScreen.dpy, CurrentTime); } } void cps::GrabList::grabsRemove(Grab* handle) { GrabIterator it = std::find (grabsBegin (), grabsEnd (), handle); if (it != grabsEnd ()) { grabs.erase (it); delete (handle); } } /* otherScreenGrabExist takes a series of strings terminated by a NULL. It returns true if a grab exists but it is NOT held by one of the plugins listed, returns false otherwise. */ bool CompScreenImpl::otherGrabExist (const char *first, ...) { va_list ap; const char *name; std::list::iterator it; for (it = privateScreen.eventManager.grabsBegin (); it != privateScreen.eventManager.grabsEnd (); ++it) { va_start (ap, first); name = first; while (name) { if (strcmp (name, (*it)->name) == 0) break; name = va_arg (ap, const char *); } va_end (ap); if (!name) return true; } return false; } bool CompScreenImpl::grabExist (const char *grab) { return privateScreen.eventManager.grabExist (grab); } bool cps::GrabList::grabExist (const char *grab) { foreach (cps::Grab* g, grabs) { if (strcmp (g->name, grab) == 0) return true; } return false; } bool CompScreenImpl::grabbed () { return privateScreen.eventManager.isGrabbed(); } void cps::GrabManager::grabUngrabOneKey (unsigned int modifiers, int keycode, bool grab) { if (grab) { /* * Always grab the keyboard Sync-ronously. This is so that we can * choose to ReplayKeyboard in alwaysHandleEvent if need be. */ XGrabKey (screen->dpy(), keycode, modifiers, screen->root(), true, GrabModeAsync, GrabModeSync); } else { XUngrabKey (screen->dpy(), keycode, modifiers, screen->root()); } } bool cps::GrabManager::grabUngrabKeys (unsigned int modifiers, int keycode, bool grab) { int mod, k; unsigned int ignore; unsigned int modifierForKeycode; CompScreen::checkForError (screen->dpy()); for (ignore = 0; ignore <= modHandler->ignoredModMask (); ignore++) { if (ignore & ~modHandler->ignoredModMask ()) continue; if (keycode == 0) modifierForKeycode = 0; else modifierForKeycode = modHandler->keycodeToModifiers (keycode); if (keycode != 0 && modifierForKeycode == 0) { grabUngrabOneKey (modifiers | ignore, keycode, grab); } else { for (mod = 0; mod < 8; mod++) { if (modifiers & (1 << mod)) { for (k = mod * modHandler->modMap ()->max_keypermod; k < (mod + 1) * modHandler->modMap ()->max_keypermod; k++) { if (modHandler->modMap ()->modifiermap[k]) { grabUngrabOneKey ((modifiers & ~(1 << mod)) | modifierForKeycode | ignore, modHandler->modMap ()->modifiermap[k], grab); } } } else if (modifierForKeycode == (unsigned int) (1 << mod)) { grabUngrabOneKey (modifiers | ignore, keycode, grab); grabUngrabOneKey (modifiers | modifierForKeycode | ignore, keycode, grab); } } /* * keycode == 0 or modifierForKeycode != 0, so this is a * modifier-only keybinding. * Until now I have been trying to: * grabUngrabOneKey (modifiers | ignore, AnyKey, grab); * which does not seem to work at all. * However, binding to each keycode individually does work. * This is so that we can detect taps on individual modifier * keys, and know to cancel the tap if +k is pressed. */ if (!(currentState & CompAction::StateIgnoreTap)) { int minCode, maxCode; XDisplayKeycodes (screen->dpy(), &minCode, &maxCode); for (k = minCode; k <= maxCode; k++) grabUngrabOneKey (modifiers | modifierForKeycode | ignore, k, grab); } } if (CompScreen::checkForError (screen->dpy())) return false; } return true; } bool cps::GrabManager::addPassiveKeyGrab (CompAction::KeyBinding &key) { KeyGrab newKeyGrab; unsigned int mask; std::list::iterator it; mask = modHandler->virtualToRealModMask (key.modifiers ()); for (it = keyGrabs.begin (); it != keyGrabs.end (); ++it) { if (key.keycode () == (*it).keycode && mask == (*it).modifiers) { (*it).count++; return true; } } if (!(mask & CompNoMask)) { if (!grabUngrabKeys (mask, key.keycode (), true)) return false; } newKeyGrab.keycode = key.keycode (); newKeyGrab.modifiers = mask; newKeyGrab.count = 1; keyGrabs.push_back (newKeyGrab); return true; } void cps::GrabManager::removePassiveKeyGrab (CompAction::KeyBinding &key) { unsigned int mask; std::list::iterator it; mask = modHandler->virtualToRealModMask (key.modifiers ()); for (it = keyGrabs.begin (); it != keyGrabs.end (); ++it) { if (key.keycode () == (*it).keycode && mask == (*it).modifiers) { (*it).count--; if ((*it).count) return; it = keyGrabs.erase (it); if (!(mask & CompNoMask)) grabUngrabKeys (mask, key.keycode (), false); } } /* * Removing modifier-only grabs is tricky. Because it also removes grabs * for modifier+all_other_keys. See XDisplayKeycodes above to find out why. * So we need to refresh all grabs... */ if (!(mask & CompNoMask) && (key.keycode () == 0 || modHandler->keycodeToModifiers (key.keycode ()) != 0)) updatePassiveKeyGrabs (); } void cps::GrabManager::updatePassiveKeyGrabs () { std::list::iterator it; XUngrabKey (screen->dpy(), AnyKey, AnyModifier, screen->root()); for (it = keyGrabs.begin (); it != keyGrabs.end (); ++it) { if (!((*it).modifiers & CompNoMask)) { grabUngrabKeys ((*it).modifiers, (*it).keycode, true); } } } bool cps::GrabManager::addPassiveButtonGrab (CompAction::ButtonBinding &button) { ButtonGrab newButtonGrab; std::list::iterator it; for (it = buttonGrabs.begin (); it != buttonGrabs.end (); ++it) { if (button.button () == (*it).button && button.modifiers () == (*it).modifiers) { (*it).count++; return true; } } newButtonGrab.button = button.button (); newButtonGrab.modifiers = button.modifiers (); newButtonGrab.count = 1; buttonGrabs.push_back (newButtonGrab); foreach (CompWindow *w, screen->windows ()) w->priv->updatePassiveButtonGrabs (); return true; } void cps::GrabManager::updatePassiveButtonGrabs(Window serverFrame) { CompWindow *window = NULL; foreach (CompWindow *w, screen->windows ()) { if (w->frame () == serverFrame) { window = w; break; } } /* Grab only we have bindings on */ foreach (ButtonGrab &bind, buttonGrabs) { unsigned int mods = modHandler->virtualToRealModMask (bind.modifiers); if (mods & CompNoMask) continue; for (unsigned int ignore = 0; ignore <= modHandler->ignoredModMask (); ignore++) { if (ignore & ~modHandler->ignoredModMask ()) continue; /* Do not allow binding of the scroll wheel for windows other than the desktop * unless there is a modifier defined */ if (window && !(window->type () & CompWindowTypeDesktopMask) && bind.button > 3 && bind.button < 8 && !mods) continue; XGrabButton (screen->dpy(), bind.button, mods | ignore, serverFrame, false, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeSync, GrabModeAsync, None, None); } } } void cps::GrabManager::removePassiveButtonGrab (CompAction::ButtonBinding &button) { std::list::iterator it; for (it = buttonGrabs.begin (); it != buttonGrabs.end (); ++it) { if (button.button () == (*it).button && button.modifiers () == (*it).modifiers) { (*it).count--; if ((*it).count) return; it = buttonGrabs.erase (it); foreach (CompWindow *w, screen->windows ()) w->priv->updatePassiveButtonGrabs (); } } } void cps::GrabManager::setCurrentState (CompAction::State state) { currentState = state; } bool CompScreenImpl::addAction (CompAction *action) { assert (privateScreen.initialized); if (!privateScreen.initialized) return false; if (action->active ()) return false; grabManager.setCurrentState(action->state()); if (action->type () & CompAction::BindingTypeKey) { if (!grabManager.addPassiveKeyGrab (action->key ())) return false; } if (action->type () & CompAction::BindingTypeButton) { if (!grabManager.addPassiveButtonGrab (action->button ())) { if (action->type () & CompAction::BindingTypeKey) grabManager.removePassiveKeyGrab (action->key ()); return false; } } if (action->edgeMask ()) { for (int i = 0; i < SCREEN_EDGE_NUM; i++) if (action->edgeMask () & (1 << i)) privateScreen.enableEdge (i); } ca::setActionActiveState (*action, true); return true; } void CompScreenImpl::removeAction (CompAction *action) { if (!privateScreen.initialized || !action->active ()) return; grabManager.setCurrentState(action->state()); if (action->type () & CompAction::BindingTypeKey) grabManager.removePassiveKeyGrab (action->key ()); if (action->type () & CompAction::BindingTypeButton) grabManager.removePassiveButtonGrab (action->button ()); if (action->edgeMask ()) { for (int i = 0; i < SCREEN_EDGE_NUM; i++) if (action->edgeMask () & (1 << i)) privateScreen.disableEdge (i); } ca::setActionActiveState (*action, false); } void CompScreenImpl::updateWorkarea () { CompRect workArea; CompRegion allWorkArea = CompRegion (); bool workAreaChanged = false; privateScreen.outputDevices.computeWorkAreas( workArea, workAreaChanged, allWorkArea, windowManager.getWindows()); workArea = allWorkArea.boundingRect (); if (privateScreen.workArea != workArea) { workAreaChanged = true; privateScreen.workArea = workArea; privateScreen.setDesktopHints (); } if (workAreaChanged) { /* as work area changed, update all maximized windows on this screen to snap to the new work area */ windowManager.updateWindowSizes(); } } static bool isClientListWindow (CompWindow *w) { /* windows with client id less than 2 have been destroyed and only exists because some plugin keeps a reference to them. they should not be in client lists */ if (w->id () < 2) return false; if (w->overrideRedirect ()) return false; if (!w->isViewable ()) { if (!(w->state () & CompWindowStateHiddenMask)) return false; } return true; } static void countClientListWindow (CompWindow *w, int *n) { if (isClientListWindow (w)) { *n = *n + 1; } } static bool compareMappingOrder (const CompWindow *w1, const CompWindow *w2) { return w1->mapNum () < w2->mapNum (); } void cps::WindowManager::updateClientList (PrivateScreen& ps) { bool updateClientList = false; bool updateClientListStacking = false; int n = 0; screen->forEachWindow (boost::bind (countClientListWindow, _1, &n)); if (n == 0) { if ((unsigned int) n != clientList.size ()) { clientList.clear (); clientListStacking.clear (); clientIdList.clear (); clientIdListStacking.clear (); XChangeProperty (ps.dpy, ps.rootWindow(), Atoms::clientList, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &ps.eventManager.getGrabWindow(), 1); XChangeProperty (ps.dpy, ps.rootWindow(), Atoms::clientListStacking, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &ps.eventManager.getGrabWindow(), 1); } return; } if ((unsigned int) n != clientList.size ()) { clientIdList.resize (n); clientIdListStacking.resize (n); updateClientList = updateClientListStacking = true; } clientListStacking.clear (); for (iterator i = begin(); i != end(); ++i) { CompWindow* const w(*i); if (isClientListWindow (w)) clientListStacking.push_back (w); } /* clear clientList and copy clientListStacking into clientList */ clientList = clientListStacking; /* sort clientList in mapping order */ sort (clientList.begin (), clientList.end (), compareMappingOrder); /* make sure client id lists are up-to-date */ for (int i = 0; i < n; i++) { if (!updateClientList && clientIdList[i] != clientList[i]->id ()) { updateClientList = true; } clientIdList[i] = clientList[i]->id (); } for (int i = 0; i < n; i++) { if (!updateClientListStacking && clientIdListStacking[i] != clientListStacking[i]->id ()) { updateClientListStacking = true; } clientIdListStacking[i] = clientListStacking[i]->id (); } if (updateClientList) XChangeProperty (ps.dpy, ps.rootWindow(), Atoms::clientList, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &clientIdList.at (0), n); if (updateClientListStacking) XChangeProperty (ps.dpy, ps.rootWindow(), Atoms::clientListStacking, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &clientIdListStacking.at (0), n); } const CompWindowVector & CompScreenImpl::clientList (bool stackingOrder) { return stackingOrder ? windowManager.getClientListStacking() : windowManager.getClientList(); } void CompScreenImpl::toolkitAction (Atom toolkitAction, Time eventTime, Window window, long data0, long data1, long data2) { XEvent ev; ev.type = ClientMessage; ev.xclient.window = window; ev.xclient.message_type = Atoms::toolkitAction; ev.xclient.format = 32; ev.xclient.data.l[0] = toolkitAction; ev.xclient.data.l[1] = eventTime; ev.xclient.data.l[2] = data0; ev.xclient.data.l[3] = data1; ev.xclient.data.l[4] = data2; XUngrabPointer (privateScreen.dpy, CurrentTime); XUngrabKeyboard (privateScreen.dpy, CurrentTime); XSendEvent (privateScreen.dpy, privateScreen.rootWindow(), false, StructureNotifyMask, &ev); } void CompScreenImpl::runCommand (CompString command) { if (command.size () == 0) return; if (fork () == 0) { size_t pos; CompString env (privateScreen.displayString ()); setsid (); pos = env.find (':'); if (pos != std::string::npos) { size_t pointPos = env.find ('.', pos); if (pointPos != std::string::npos) { env.erase (pointPos); } else { unsigned int displayNum = atoi (env.substr (pos + 1).c_str ()); env.erase (pos); env.append (compPrintf (":%i", displayNum)); } } env.append (compPrintf (".%d", privateScreen.screenNum)); putenv (strdup (env.c_str ())); // parameter needs to be leaked! exit (execl ("/bin/sh", "/bin/sh", "-c", command.c_str (), NULL)); } } void CompScreenImpl::moveViewport (int tx, int ty, bool sync) { CompPoint pnt; tx = privateScreen.viewPort.vp.x () - tx; tx = compiz::core::screen::wraparound_mod (tx, privateScreen.viewPort.vpSize.width ()); tx -= privateScreen.viewPort.vp.x (); ty = privateScreen.viewPort.vp.y () - ty; ty = compiz::core::screen::wraparound_mod (ty, privateScreen.viewPort.vpSize.height ()); ty -= privateScreen.viewPort.vp.y (); if (!tx && !ty) return; privateScreen.viewPort.vp.setX (privateScreen.viewPort.vp.x () + tx); privateScreen.viewPort.vp.setY (privateScreen.viewPort.vp.y () + ty); tx *= -width (); ty *= -height (); for (cps::WindowManager::iterator i = windowManager.begin(); i != windowManager.end(); ++i) { CompWindow* const w(*i); unsigned int valueMask = CWX | CWY; XWindowChanges xwc= XWINDOWCHANGES_INIT; if (w->onAllViewports ()) continue; pnt = w->getMovementForOffset (CompPoint (tx, ty)); if (w->saveMask () & CWX) w->saveWc ().x += pnt.x (); if (w->saveMask () & CWY) w->saveWc ().y += pnt.y (); xwc.x = w->serverGeometry ().x () + pnt.x (); xwc.y = w->serverGeometry ().y () + pnt.y (); w->configureXWindow (valueMask, &xwc); } if (sync) { CompWindow *w; privateScreen.setDesktopHints (); setCurrentActiveWindowHistory (privateScreen.viewPort.vp.x (), privateScreen.viewPort.vp.y ()); w = findWindow (privateScreen.orphanData.activeWindow); if (w) { CompPoint dvp; dvp = w->defaultViewport (); /* add window to current history if it's default viewport is still the current one. */ if (privateScreen.viewPort.vp.x () == dvp.x () && privateScreen.viewPort.vp.y () == dvp.y ()) addToCurrentActiveWindowHistory (w->id ()); } } } CompGroup * cps::WindowManager::addGroup (Window id) { CompGroup *group = new CompGroup (); group->refCnt = 1; group->id = id; groups.push_back (group); return group; } void cps::WindowManager::removeGroup (CompGroup *group) { group->refCnt--; if (group->refCnt) return; std::list::iterator it = std::find (groups.begin (), groups.end (), group); if (it != groups.end ()) { groups.erase (it); } delete group; } CompGroup * cps::WindowManager::findGroup (Window id) { foreach (CompGroup *g, groups) if (g->id == id) return g; return NULL; } void cps::StartupSequence::applyStartupProperties (CompScreen* screen, CompWindow *window) { CompStartupSequence *s = NULL; const char *startupId = window->startupId (); if (!startupId) { CompWindow *leader; leader = screen->findWindow (window->clientLeader ()); if (leader) startupId = leader->startupId (); if (!startupId) return; } foreach (CompStartupSequence *ss, startupSequences) { const char *id; id = sn_startup_sequence_get_id (ss->sequence); if (strcmp (id, startupId) == 0) { s = ss; break; } } if (s) window->priv->applyStartupProperties (s); } void CompScreenImpl::sendWindowActivationRequest (Window id) { XEvent xev; xev.xclient.type = ClientMessage; xev.xclient.display = privateScreen.dpy; xev.xclient.format = 32; xev.xclient.message_type = Atoms::winActive; xev.xclient.window = id; xev.xclient.data.l[0] = ClientTypePager; xev.xclient.data.l[1] = 0; xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent (privateScreen.dpy, privateScreen.rootWindow(), false, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } /* These functions do not guard against negative decrements * as they are unable to determine the source of the reference * and as such they should only be called by functions that * actually determine the source of what was referencing the * edge and can guard against multiple-references-per-owner */ void PrivateScreen::enableEdge (int edge) { screenEdge[edge].count++; if (screenEdge[edge].count == 1) XMapRaised (dpy, screenEdge[edge].id); } void PrivateScreen::disableEdge (int edge) { screenEdge[edge].count--; if (screenEdge[edge].count == 0) XUnmapWindow (dpy, screenEdge[edge].id); } CompWindow * cps::WindowManager::getTopWindow() const { /* return first window that has not been destroyed */ if (!windows.empty ()) return windows.back (); return NULL; } CompWindow * cps::WindowManager::getTopServerWindow () const { if (!serverWindows.empty ()) return serverWindows.back (); return NULL; } int CompScreenImpl::outputDeviceForPoint (const CompPoint &point) { return outputDeviceForPoint (point.x (), point.y ()); } int CompScreenImpl::outputDeviceForPoint (int x, int y) { CompWindow::Geometry geom (x, y, 1, 1, 0); return outputDeviceForGeometry (geom); } CompRect CompScreenImpl::getCurrentOutputExtents () { return privateScreen.outputDevices.getCurrentOutputDev (); } void PrivateScreen::setNumberOfDesktops (unsigned int nDesktop) { if (nDesktop < 1 || nDesktop >= 0xffffffff || nDesktop == this->nDesktop) return; if (currentDesktop >= nDesktop) currentDesktop = nDesktop - 1; windowManager.setNumberOfDesktops(nDesktop); this->nDesktop = nDesktop; setDesktopHints (); } void PrivateScreen::setCurrentDesktop (unsigned int desktop) { if (desktop >= nDesktop || desktop == currentDesktop) return; currentDesktop = desktop; windowManager.showOrHideForDesktop(desktop); unsigned long data = desktop; XChangeProperty (dpy, rootWindow(), Atoms::currentDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1); } const CompRect& CompScreenImpl::getWorkareaForOutput (unsigned int outputNum) const { return privateScreen.outputDevices.getOutputDev (outputNum).workArea (); } void CompScreen::outputChangeNotify () { WRAPABLE_HND_FUNCTN (outputChangeNotify); _outputChangeNotify (); } void CompScreenImpl::_outputChangeNotify () { } /* Returns default viewport for some window geometry. If the window spans * more than one viewport the most appropriate viewport is returned. How the * most appropriate viewport is computed can be made optional if necessary. It * is currently computed as the viewport where the center of the window is * located. * * XXX: It is possible for this function to return a negative viewport, which * definitely feels wrong, however it seems that some plugins depend on this behaviour * so they need to be fixed first */ void compiz::private_screen::viewports::viewportForGeometry (const CompWindow::Geometry &gm, CompPoint &viewport, ViewportRetrievalInterface *viewports, const CompSize & screenSize) { CompRect rect (gm); int offset; const CompPoint &vp = viewports->getCurrentViewport (); const CompSize &vpSize = viewports->viewportDimensions (); rect.setWidth (gm.widthIncBorders ()); rect.setHeight (gm.heightIncBorders ()); offset = rect.centerX () < 0 ? -1 : 0; viewport.setX (vp.x () + ((rect.centerX () / screenSize.width ()) + offset) % vpSize.width ()); offset = rect.centerY () < 0 ? -1 : 0; viewport.setY (vp.y () + ((rect.centerY () / screenSize.height ()) + offset ) % vpSize.height ()); } void CompScreenImpl::viewportForGeometry (const CompWindow::Geometry& gm, CompPoint& viewport) { compiz::private_screen::viewports::viewportForGeometry (gm, viewport, &privateScreen.viewPort, *this); } int CompScreenImpl::outputDeviceForGeometry (const CompWindow::Geometry& gm) { return privateScreen.outputDevices.outputDeviceForGeometry (gm, privateScreen.optionGetOverlappingOutputs (), this); } CompIcon * CompScreenImpl::defaultIcon () const { return defaultIcon_; } bool CompScreenImpl::updateDefaultIcon () { CompString file = privateScreen.optionGetDefaultIcon (); CompString pname = "core/"; void *data; CompSize size; if (defaultIcon_) { delete defaultIcon_; defaultIcon_ = NULL; } if (!readImageFromFile (file, pname, size, data)) return false; defaultIcon_ = new CompIcon (size.width (), size.height ()); memcpy (defaultIcon_->data (), data, size.width () * size.height () * sizeof (CARD32)); free (data); return true; } void cps::History::setCurrentActiveWindowHistory (int x, int y) { int i, min = 0; for (i = 0; i < ACTIVE_WINDOW_HISTORY_NUM; i++) { if (history[i].x == x && history[i].y == y) { currentHistory_ = i; return; } } for (i = 1; i < ACTIVE_WINDOW_HISTORY_NUM; i++) if (history[i].activeNum < history[min].activeNum) min = i; currentHistory_ = min; history[min].activeNum = activeNum_; history[min].x = x; history[min].y = y; memset (history[min].id, 0, sizeof (history[min].id)); } void cps::History::addToCurrentActiveWindowHistory (Window id) { CompActiveWindowHistory *history = &this->history[currentHistory_]; Window tmp, next = id; /* walk and move history */ for (int i = 0; i < ACTIVE_WINDOW_HISTORY_SIZE; i++) { tmp = history->id[i]; history->id[i] = next; next = tmp; /* we're done when we find an old instance or an empty slot */ if (tmp == id || tmp == None) break; } history->activeNum = activeNum_; } void ScreenInterface::enterShowDesktopMode () WRAPABLE_DEF (enterShowDesktopMode) void ScreenInterface::leaveShowDesktopMode (CompWindow *window) WRAPABLE_DEF (leaveShowDesktopMode, window) void ScreenInterface::outputChangeNotify () WRAPABLE_DEF (outputChangeNotify) void ScreenInterface::addSupportedAtoms (std::vector& atoms) WRAPABLE_DEF (addSupportedAtoms, atoms) Window CompScreenImpl::root () { return privateScreen.rootWindow(); } int CompScreenImpl::xkbEvent () { return privateScreen.getXkbEvent (); } void PrivateScreen::identifyEdgeWindow(Window id) { edgeWindow = 0; for (unsigned int i = 0; i < SCREEN_EDGE_NUM; i++) { if (id == screenEdge[i].id) { edgeWindow = 1 << i; break; } } } void CompScreenImpl::warpPointer (int dx, int dy) { XEvent event; pointerX += dx; pointerY += dy; if (pointerX >= width ()) pointerX = width () - 1; else if (pointerX < 0) pointerX = 0; if (pointerY >= height ()) pointerY = height () - 1; else if (pointerY < 0) pointerY = 0; XWarpPointer (privateScreen.dpy, None, privateScreen.rootWindow(), 0, 0, 0, 0, pointerX, pointerY); XSync (privateScreen.dpy, false); /* XWarpPointer will generate Leave, Enter and PointerMotion * events as if the user had instantaneously moved the cursor * from one position to another. Because most of this is * useless to process, we just throw out the events and update * the pointer position. However, we do need to process some * crossing events since they tell us which edge windows are * hovered. Note that we don't actually trigger the bindings * in the case where we warped from one edge window to * another. * * FIXME: Probably don't need to process *all* the crossing * events here ... maybe there is a way to check only the last * event in the output buffer without roundtripping a lot */ while (XCheckMaskEvent (privateScreen.dpy, LeaveWindowMask | EnterWindowMask | PointerMotionMask, &event)) { if (event.type == EnterNotify) { if (event.xcrossing.mode != NotifyGrab || event.xcrossing.mode != NotifyUngrab || event.xcrossing.mode != NotifyInferior) { privateScreen.identifyEdgeWindow(event.xcrossing.window); } } } if (!inHandleEvent) { lastPointerX = pointerX; lastPointerY = pointerY; } } CompWindowList & CompScreenImpl::windows () { return windowManager.getWindows(); } CompWindowList & CompScreenImpl::serverWindows () { return windowManager.getServerWindows(); } CompWindowList & CompScreenImpl::destroyedWindows () { return windowManager.getDestroyedWindows(); } Time CompScreenImpl::getCurrentTime () { return privateScreen.eventManager.getCurrentTime (privateScreen.dpy); } Time cps::EventManager::getCurrentTime (Display* dpy) const { XEvent event; XChangeProperty (dpy, grabWindow, XA_PRIMARY, XA_STRING, 8, PropModeAppend, NULL, 0); XWindowEvent (dpy, grabWindow, PropertyChangeMask, &event); return event.xproperty.time; } Window CompScreenImpl::selectionWindow () { return privateScreen.wmSnSelectionWindow; } int CompScreenImpl::screenNum () { return privateScreen.screenNum; } const CompPoint & CompScreenImpl::vp () const { return privateScreen.viewPort.vp; } const CompSize & CompScreenImpl::vpSize () const { return privateScreen.viewPort.vpSize; } int cps::DesktopWindowCount::desktopWindowCount () { return count; } unsigned int cps::History::activeNum () const { return activeNum_; } CompOutput::vector & CompScreenImpl::outputDevs () { return privateScreen.outputDevices.getOutputDevs (); } CompOutput & CompScreenImpl::currentOutputDev () const { return const_cast(privateScreen).outputDevices.getCurrentOutputDev (); } const CompRect & CompScreenImpl::workArea () const { return privateScreen.workArea; } unsigned int CompScreenImpl::currentDesktop () { return privateScreen.currentDesktop; } unsigned int CompScreenImpl::nDesktop () { return privateScreen.nDesktop; } CompActiveWindowHistory* cps::History::currentHistory () { return history+currentHistory_; } bool CompScreenImpl::shouldSerializePlugins () { return privateScreen.optionGetDoSerialize (); } void cps::WindowManager::removeDestroyed () { while (pendingDestroys) { foreach (CompWindow *w, destroyedWindows) { if (w->destroyed ()) { delete w; break; } } pendingDestroys--; } } const CompRegion & CompScreenImpl::region () const { return privateScreen.getRegion (); } bool CompScreenImpl::hasOverlappingOutputs () { return privateScreen.outputDevices.hasOverlappingOutputs (); } CompOutput & CompScreenImpl::fullscreenOutput () { return privateScreen.fullscreenOutput; } XWindowAttributes CompScreenImpl::attrib () { return privateScreen.getAttrib (); } std::vector & CompScreenImpl::screenInfo () { return privateScreen.getScreenInfo (); } bool CompScreenImpl::createFailed () const { return !screenInitalized; } CompScreen::CompScreen (): PluginClassStorage (screenPluginClassIndices) { } CompScreenImpl::CompScreenImpl () : cps::XWindowInfo(privateScreen.dpy), below(), autoRaiseTimer_(), autoRaiseWindow_(0), defaultIcon_(0), grabManager (this), eventHandled (false), privateScreen(this, windowManager), showingDesktopMask_(0) { ValueHolder::SetDefault (&valueHolder); CompPrivate p; CompOption::Value::Vector vList; privateScreen.setPingTimerCallback( boost::bind (&CompScreenImpl::handlePingTimeout, this)); screenInitalized = true; CompPlugin* corePlugin = CompPlugin::load ("core"); if (!corePlugin) { compLogMessage ("core", CompLogLevelFatal, "Couldn't load core plugin"); screenInitalized = false; } if (!CompPlugin::push (corePlugin)) { compLogMessage ("core", CompLogLevelFatal, "Couldn't activate core plugin"); screenInitalized = false; } p.uval = CORE_ABIVERSION; storeValue ("core_ABI", p); vList.push_back ("core"); privateScreen.setPlugins (vList); } void PrivateScreen::setPlugins(CompOption::Value::Vector const& vList) { pluginManager.setPlugins(vList); } void PrivateScreen::initPlugins() { pluginManager.setDirtyPluginList (); pluginManager.updatePlugins (screen, optionGetActivePlugins()); } bool CompScreenImpl::init (const char *name) { privateScreen.eventManager.init(); if (privateScreen.initDisplay(name, *this, showingDesktopMask_)) { privateScreen.optionSetCloseWindowKeyInitiate (CompScreenImpl::closeWin); privateScreen.optionSetCloseWindowButtonInitiate (CompScreenImpl::closeWin); privateScreen.optionSetRaiseWindowKeyInitiate (CompScreenImpl::raiseWin); privateScreen.optionSetRaiseWindowButtonInitiate (CompScreenImpl::raiseWin); privateScreen.optionSetLowerWindowKeyInitiate (CompScreenImpl::lowerWin); privateScreen.optionSetLowerWindowButtonInitiate (CompScreenImpl::lowerWin); privateScreen.optionSetUnmaximizeWindowKeyInitiate (CompScreenImpl::unmaximizeWin); privateScreen.optionSetUnmaximizeOrMinimizeWindowKeyInitiate (CompScreenImpl::unmaximizeOrMinimizeWin); privateScreen.optionSetMinimizeWindowKeyInitiate (CompScreenImpl::minimizeWin); privateScreen.optionSetMinimizeWindowButtonInitiate (CompScreenImpl::minimizeWin); privateScreen.optionSetMaximizeWindowKeyInitiate (CompScreenImpl::maximizeWin); privateScreen.optionSetMaximizeWindowHorizontallyKeyInitiate ( CompScreenImpl::maximizeWinHorizontally); privateScreen.optionSetMaximizeWindowVerticallyKeyInitiate ( CompScreenImpl::maximizeWinVertically); privateScreen.optionSetWindowMenuKeyInitiate (CompScreenImpl::windowMenu); privateScreen.optionSetWindowMenuButtonInitiate (CompScreenImpl::windowMenu); privateScreen.optionSetShowDesktopKeyInitiate (CompScreenImpl::showDesktop); privateScreen.optionSetShowDesktopEdgeInitiate (CompScreenImpl::showDesktop); privateScreen.optionSetToggleWindowMaximizedKeyInitiate (CompScreenImpl::toggleWinMaximized); privateScreen.optionSetToggleWindowMaximizedButtonInitiate (CompScreenImpl::toggleWinMaximized); privateScreen.optionSetToggleWindowMaximizedHorizontallyKeyInitiate ( CompScreenImpl::toggleWinMaximizedHorizontally); privateScreen.optionSetToggleWindowMaximizedVerticallyKeyInitiate ( CompScreenImpl::toggleWinMaximizedVertically); privateScreen.optionSetToggleWindowShadedKeyInitiate (CompScreenImpl::shadeWin); privateScreen.initPlugins(); if (debugOutput) { StackDebugger::SetDefault ( new StackDebugger ( dpy (), root (), &privateScreen)); } return true; } return false; } void cps::EventManager::init () { ctx = Glib::MainContext::get_default (); mainloop = Glib::MainLoop::create (ctx, false); sighupSource = CompSignalSource::create (SIGHUP, boost::bind (&EventManager::handleSignal, this, _1)); sigintSource = CompSignalSource::create (SIGINT, boost::bind (&EventManager::handleSignal, this, _1)); sigtermSource = CompSignalSource::create (SIGTERM, boost::bind (&EventManager::handleSignal, this, _1)); } bool CompScreenImpl::displayInitialised() const { return privateScreen.initialized; } void CompScreenImpl::updatePassiveKeyGrabs () const { grabManager.updatePassiveKeyGrabs (); } void CompScreenImpl::applyStartupProperties (CompWindow *window) { privateScreen.startupSequence.applyStartupProperties (this, window); } void CompScreenImpl::updateClientList() { privateScreen.updateClientList (); } CompWindow * CompScreenImpl::getTopWindow() const { return windowManager.getTopWindow(); } CompWindow * CompScreenImpl::getTopServerWindow () const { return windowManager.getTopServerWindow(); } CoreOptions& CompScreenImpl::getCoreOptions() { return privateScreen; } Colormap CompScreenImpl::colormap() const { return privateScreen.colormap; } void CompScreenImpl::setCurrentDesktop (unsigned int desktop) { privateScreen.setCurrentDesktop(desktop); } Window CompScreenImpl::activeWindow() const { return privateScreen.orphanData.activeWindow; } void CompScreenImpl::updatePassiveButtonGrabs(Window serverFrame) { grabManager.updatePassiveButtonGrabs(serverFrame); } bool CompScreenImpl::grabWindowIsNot(Window w) const { return privateScreen.eventManager.notGrabWindow(w); } void CompScreenImpl::incrementPendingDestroys() { windowManager.incrementPendingDestroys(); } cps::DesktopWindowCount::DesktopWindowCount() : count(0) { } void cps::DesktopWindowCount::incrementDesktopWindowCount() { count++; } void cps::DesktopWindowCount::decrementDesktopWindowCount() { count--; } cps::MapNum::MapNum() : mapNum (1) { } unsigned int cps::MapNum::nextMapNum() { return mapNum++; } void CompScreenImpl::setNextActiveWindow(Window id) { privateScreen.orphanData.nextActiveWindow = id; } Window CompScreenImpl::getNextActiveWindow() const { return privateScreen.orphanData.nextActiveWindow; } namespace { void sendStartupMessageToClients (Display *dpy, bool success) { /* Send a client message indicating that our startup is complete if * we were asked to do so */ if (sendStartupMessage) { Atom startupMessageAtom = XInternAtom (dpy, "_COMPIZ_TESTING_STARTUP", FALSE); XEvent startupMessageEvent; Window root = DefaultRootWindow (dpy); startupMessageEvent.xclient.type = ClientMessage; startupMessageEvent.xclient.window = root; startupMessageEvent.xclient.message_type = startupMessageAtom; startupMessageEvent.xclient.format = 32; startupMessageEvent.xclient.data.l[0] = success ? 1 : 0; startupMessageEvent.xclient.data.l[1] = 0; startupMessageEvent.xclient.data.l[2] = 0; startupMessageEvent.xclient.data.l[3] = 0; startupMessageEvent.xclient.data.l[4] = 0; XSendEvent (dpy, root, FALSE, StructureNotifyMask, &startupMessageEvent); XFlush (dpy); } } } bool PrivateScreen::initDisplay (const char *name, cps::History& history, unsigned int showingDesktopMask) { dpy = XOpenDisplay (name); if (!dpy) { compLogMessage ("core", CompLogLevelFatal, "Couldn't open display %s", XDisplayName (name)); return false; } /* Use synchronous behaviour when running with --sync, useful * for getting stacktraces when X Errors occurr */ XSynchronize (dpy, synchronousX ? True : False); snprintf (displayString_, 255, "DISPLAY=%s", DisplayString (dpy)); Atoms::init (dpy); XSetErrorHandler (errorHandler); snDisplay = sn_display_new (dpy, NULL, NULL); if (!snDisplay) return true; if (!xSync.init (dpy)) { compLogMessage ("core", CompLogLevelFatal, "No sync extension"); sendStartupMessageToClients (dpy, false); return false; } xRandr.init (dpy); xShape.init (dpy); xkbEvent.init (dpy); if (xkbEvent.isEnabled ()) { XkbSelectEvents (dpy, XkbUseCoreKbd, XkbBellNotifyMask | XkbStateNotifyMask, XkbAllEventsMask); } else { compLogMessage ("core", CompLogLevelFatal, "No XKB extension"); } int xineramaError; int xineramaEvent; xineramaExtension = XineramaQueryExtension (dpy, &xineramaEvent, &xineramaError); updateScreenInfo (); escapeKeyCode = XKeysymToKeycode (dpy, XStringToKeysym ("Escape")); returnKeyCode = XKeysymToKeycode (dpy, XStringToKeysym ("Return")); modHandler->updateModifierMappings (); Window root_tmp = XRootWindow (dpy, DefaultScreen (dpy)); /* Don't select for SubstructureRedirectMask or * SubstructureNotifyMask yet since we need to * act in complete synchronization here when * doing the initial window init in order to ensure * that windows don't receive invalid stack positions * but we don't want to receive an invalid CreateNotify * when we create windows like edge windows here either */ XSelectInput (dpy, root_tmp, StructureNotifyMask | PropertyChangeMask | LeaveWindowMask | EnterWindowMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | FocusChangeMask | ExposureMask); /* We need to register for EnterWindowMask | * ButtonPressMask | FocusChangeMask on other * root windows as well because focus happens * on a display level and we need to check * if the screen we are running on lost focus */ for (int i = 0; i <= ScreenCount (dpy) - 1; i++) { Window rt = XRootWindow (dpy, i); if (rt == root_tmp) continue; XSelectInput (dpy, rt, FocusChangeMask | SubstructureNotifyMask); } for (int i = 0; i < SCREEN_EDGE_NUM; i++) { screenEdge[i].id = None; screenEdge[i].count = 0; } screenNum = DefaultScreen (dpy); colormap = DefaultColormap (dpy, screenNum); root = root_tmp; snContext = sn_monitor_context_new (snDisplay, screenNum, compScreenSnEvent, this, NULL); if (!XGetWindowAttributes (dpy, rootWindow(), &attrib)) return false; workArea.setWidth (attrib.width); workArea.setHeight (attrib.height); XVisualInfo templ; templ.visualid = XVisualIDFromVisual (attrib.visual); int nvisinfo; XVisualInfo* visinfo = XGetVisualInfo (dpy, VisualIDMask, &templ, &nvisinfo); if (!nvisinfo) { compLogMessage ("core", CompLogLevelFatal, "Couldn't get visual info for default visual"); sendStartupMessageToClients (dpy, false); return false; } XColor black; black.red = black.green = black.blue = 0; if (!XAllocColor (dpy, colormap, &black)) { compLogMessage ("core", CompLogLevelFatal, "Couldn't allocate color"); sendStartupMessageToClients (dpy, false); XFree (visinfo); return false; } static char data = 0; Pixmap bitmap = XCreateBitmapFromData (dpy, rootWindow(), &data, 1, 1); if (!bitmap) { compLogMessage ("core", CompLogLevelFatal, "Couldn't create bitmap"); sendStartupMessageToClients (dpy, false); XFree (visinfo); return false; } invisibleCursor = XCreatePixmapCursor (dpy, bitmap, bitmap, &black, &black, 0, 0); if (!invisibleCursor) { compLogMessage ("core", CompLogLevelFatal, "Couldn't create invisible cursor"); sendStartupMessageToClients (dpy, false); XFree (visinfo); return false; } XFreePixmap (dpy, bitmap); XFreeColors (dpy, colormap, &black.pixel, 1, 0); XFree (visinfo); reshape (attrib.width, attrib.height); initialized = true; initOptions (); detectOutputDevices (*this); updateOutputDevices (*this); getDesktopHints (showingDesktopMask); /* Check for other window managers */ char buf[128]; snprintf (buf, 128, "WM_S%d", DefaultScreen (dpy)); wmSnAtom = XInternAtom (dpy, buf, 0); Window currentWmSnOwner = XGetSelectionOwner (dpy, wmSnAtom); if (currentWmSnOwner != None) { if (!replaceCurrentWm) { compLogMessage ("core", CompLogLevelError, "Screen %d on display \"%s\" already " "has a window manager; try using the " "--replace option to replace the current " "window manager.", DefaultScreen (dpy), DisplayString (dpy)); sendStartupMessageToClients (dpy, false); return false; } XSelectInput (dpy, currentWmSnOwner, StructureNotifyMask); } XSetWindowAttributes attr; attr.override_redirect = true; attr.event_mask = PropertyChangeMask; Window newWmSnOwner = XCreateWindow (dpy, root_tmp, -100, -100, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); XChangeProperty (dpy, newWmSnOwner, Atoms::wmName, Atoms::utf8String, 8, PropModeReplace, (unsigned char *) PACKAGE, strlen (PACKAGE)); XEvent event; XWindowEvent (dpy, newWmSnOwner, PropertyChangeMask, &event); Time wmSnTimestamp = event.xproperty.time; XSetSelectionOwner (dpy, wmSnAtom, newWmSnOwner, wmSnTimestamp); if (XGetSelectionOwner (dpy, wmSnAtom) != newWmSnOwner) { compLogMessage ("core", CompLogLevelError, "Could not acquire window manager " "selection on screen %d display \"%s\"", DefaultScreen (dpy), DisplayString (dpy)); XDestroyWindow (dpy, newWmSnOwner); sendStartupMessageToClients (dpy, false); return false; } /* Send client message indicating that we are now the window manager */ event.xclient.type = ClientMessage; event.xclient.window = root_tmp; event.xclient.message_type = Atoms::manager; event.xclient.format = 32; event.xclient.data.l[0] = wmSnTimestamp; event.xclient.data.l[1] = wmSnAtom; event.xclient.data.l[2] = 0; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (dpy, root_tmp, FALSE, StructureNotifyMask, &event); /* Wait for old window manager to go away */ if (currentWmSnOwner != None) { do { XWindowEvent (dpy, currentWmSnOwner, StructureNotifyMask, &event); } while (event.type != DestroyNotify); } /* Server grab from here, we are creating windows */ XGrabServer (dpy); { XSetWindowAttributes attrib; attrib.override_redirect = 1; attrib.event_mask = PropertyChangeMask; eventManager.createGrabWindow(dpy, rootWindow(), &attrib); for (int i = 0; i < SCREEN_EDGE_NUM; i++) { long xdndVersion = 3; screenEdge[i].id = XCreateWindow (dpy, rootWindow(), -100, -100, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect, &attrib); XChangeProperty (dpy, screenEdge[i].id, Atoms::xdndAware, XA_ATOM, 32, PropModeReplace, (unsigned char *) &xdndVersion, 1); /* CompWindow::CompWindow will select for * crossing events when it gets called on * CreateNotify of this window, so no need * to select for them here */ XSelectInput (dpy, screenEdge[i].id, StructureNotifyMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask); } } updateScreenEdges (); eventManager.setSupportingWmCheck (dpy, rootWindow()); screen->updateSupportedWmHints (); XIGetClientPointer (dpy, None, &clientPointerDeviceId); normalCursor = XCreateFontCursor (dpy, XC_left_ptr); busyCursor = XCreateFontCursor (dpy, XC_watch); XIDefineCursor (dpy, clientPointerDeviceId, rootWindow(), normalCursor); /* Attempt to gain SubstructureRedirectMask */ CompScreenImpl::checkForError (dpy); /* We should get DestroyNotify events for any windows that were * destroyed while initializing windows here now */ XSelectInput (dpy, rootWindow(), attrib.your_event_mask | SubstructureRedirectMask | SubstructureNotifyMask); if (CompScreenImpl::checkForError (dpy)) { compLogMessage ("core", CompLogLevelError, "Another window manager is " "already running on screen: %d", DefaultScreen (dpy)); XUngrabServer (dpy); XSync (dpy, FALSE); sendStartupMessageToClients (dpy, false); return false; } wmSnSelectionWindow = newWmSnOwner; this->wmSnTimestamp = wmSnTimestamp; Window rootReturn, parentReturn; Window *children; unsigned int nchildren; XQueryTree (dpy, rootWindow(), &rootReturn, &parentReturn, &children, &nchildren); XUngrabServer (dpy); XSync (dpy, FALSE); /* Start initializing windows here */ for (unsigned int i = 0; i < nchildren; i++) { XWindowAttributes attrib; /* Failure means the window has been destroyed, do not * manage this window since we will not receive a DestroyNotify * for it */ if (!XGetWindowAttributes (screen->dpy (), children[i], &attrib)) setDefaultWindowAttributes(&attrib); Window topWindowInTree = i ? children[i - 1] : None; PrivateWindow::createCompWindow (topWindowInTree, topWindowInTree, attrib, children[i]); } /* enforce restack on all windows * using list last sent to server i = 0; for (CompWindowList::reverse_iterator rit = serverWindows.rbegin (); rit != serverWindows.rend (); rit++) children[i++] = ROOTPARENT ((*rit)); XRestackWindows (dpy, children, i); */ XFree (children); windowManager.setWindowActiveness(history); Window focus; int revertTo; XGetInputFocus (dpy, &focus, &revertTo); /* move input focus to root window so that we get a FocusIn event when moving it to the default window */ XSetInputFocus (dpy, rootWindow(), RevertToPointerRoot, CurrentTime); if (focus == None || focus == PointerRoot) { screen->focusDefaultWindow (); } else { CompWindow *w; w = screen->findWindow (focus); if (w) w->moveInputFocusTo (); else screen->focusDefaultWindow (); } /* Need to set a default here so that the value isn't uninitialized * when loading plugins FIXME: Should find a way to initialize options * first and then set this value, or better yet, tie this value directly * to the option */ viewPort.vpSize.setWidth (optionGetHsize ()); viewPort.vpSize.setHeight (optionGetVsize ()); /* TODO: Bailout properly when screenInitPlugins fails * TODO: It would be nicer if this line could mean * "init all the screens", but unfortunately it only inits * plugins loaded on the command line screen's and then * we need to call updatePlugins () to init the remaining * screens from option changes */ bool init_succeeded = CompPlugin::screenInitPlugins (screen); assert (init_succeeded); if (!init_succeeded) return false; /* The viewport geometry depends on the new new plugins loaded * especially those that modify option values */ viewPort.vpSize.setWidth (optionGetHsize ()); viewPort.vpSize.setHeight (optionGetVsize ()); setDesktopHints (); setAudibleBell (optionGetAudibleBell ()); pingTimer.setTimes (optionGetPingDelay (), optionGetPingDelay () + 500); pingTimer.start (); sendStartupMessageToClients (dpy, true); return true; } CompScreenImpl::~CompScreenImpl () { privateScreen.startupSequence.removeAllSequences (); while (!windowManager.getWindows().empty ()) delete windowManager.getWindows().front (); while (CompPlugin* p = CompPlugin::pop ()) CompPlugin::unload (p); screen = NULL; if (defaultIcon_) delete defaultIcon_; } cps::GrabManager::GrabManager (CompScreen *screen) : screen(screen), currentState(0), buttonGrabs (), keyGrabs () { } cps::ViewPort::ViewPort() : vp (0, 0), vpSize (1, 1) { } cps::StartupSequence::StartupSequence() : startupSequences (), startupSequenceTimer () { startupSequenceTimer.setCallback ( boost::bind (&cps::StartupSequence::handleStartupSequenceTimeout, this)); startupSequenceTimer.setTimes (1000, 1500); } PrivateScreen::PrivateScreen (CompScreen *screen, cps::WindowManager& windowManager) : CoreOptions(false), dpy (NULL), startupSequence(this), eventManager (), nDesktop (1), currentDesktop (0), wmSnSelectionWindow (None), clientPointerDeviceId (None), normalCursor (None), busyCursor (None), invisibleCursor (None), initialized (false), screen(screen), screenInfo (), snDisplay(0), root(None), snContext (0), wmSnAtom (None), desktopHintData (0), desktopHintSize (0), edgeWindow (None), edgeDelayTimer (), xdndWindow (None), windowManager(windowManager) { for (int i = 0; i < SCREEN_EDGE_NUM; i++) { screenEdge[i].id = None; screenEdge[i].count = 0; } } cps::History::History() : currentHistory_(0), activeNum_ (1) { memset (history, 0, sizeof history); } cps::WindowManager::WindowManager() : windows (), serverWindows (), destroyedWindows (), stackIsFresh (false), groups (0), pendingDestroys (0), lastFoundWindow(0) { } cps::PluginManager::PluginManager() : plugin (), dirtyPluginList (true) { } cps::EventManager::EventManager () : possibleTap(NULL), source(0), timeout(0), sighupSource(0), sigtermSource(0), sigintSource(0), fileWatch (0), lastFileWatchHandle (1), watchFds (0), lastWatchFdHandle (1), grabWindow (None) { TimeoutHandler *dTimeoutHandler = new TimeoutHandler (); TimeoutHandler::SetDefault (dTimeoutHandler); } cps::OrphanData::OrphanData() : activeWindow (0), nextActiveWindow(0) { } cps::OrphanData::~OrphanData() { } cps::EventManager::~EventManager () { /* Not guaranteed to be created by EventManager's constructor */ if (timeout) { g_source_destroy (timeout->gobj ()); } delete sigintSource; delete sigtermSource; delete sighupSource; /* Not guaranteed to be created by EventManager's constructor */ if (source) { g_source_destroy (source->gobj ()); } /* This will implicitly call ~CompWatchFd */ foreach (Glib::RefPtr fd, watchFds) g_source_destroy (fd->gobj ()); watchFds.clear (); } PrivateScreen::~PrivateScreen () { initialized = false; if (snContext) sn_monitor_context_unref (snContext); if (dpy != NULL) { XUngrabKey (dpy, AnyKey, AnyModifier, rootWindow()); for (int i = 0; i < SCREEN_EDGE_NUM; i++) { Window id = screenEdge[i].id; if (id != None) XDestroyWindow (dpy, id); } eventManager.destroyGrabWindow (dpy); if (normalCursor != None) XFreeCursor (dpy, normalCursor); if (busyCursor != None) XFreeCursor (dpy, busyCursor); if (invisibleCursor != None) XFreeCursor (dpy, invisibleCursor); /* Do not destroy wmSnSelectionWindow here. * * Because we haven't changed our active event mask * to remove SubstructureRedirectMask, other ICCCM * compliant window managers may receive a DestroyNotify * (eg, because we're blocked on XSync) before we get * a chance to close our display connection and remove * our SubstructureRedirectMask. That will cause them * to fail to start. * * The selection window is destroyed anyways when we * close our connection, and that is a very accurate * indicator to other WM's that we are well and truly * gone because the protocol requires the implementation * to remove all client event masks before destroying * windows */ XSync (dpy, False); // Redundant? XCloseDisplay (dpy); } if (desktopHintData) free (desktopHintData); if (snDisplay) sn_display_unref (snDisplay); } compiz-0.9.11+14.04.20140409/src/actions.cpp0000644000015301777760000001627612321343002020441 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include #include #include #include "privatescreen.h" #include "privatewindow.h" bool CompScreenImpl::closeWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); unsigned int time = CompOption::getIntOptionNamed (options, "time", CurrentTime); CompWindow *w = screen->findTopLevelWindow (xid); if (w && (w->priv->actions & CompWindowActionCloseMask)) w->close (time); return true; } bool CompScreenImpl::unmaximizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->maximize (0); return true; } bool CompScreenImpl::unmaximizeOrMinimizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) { if (w->priv->state & MAXIMIZE_STATE) w->maximize (0); else if (w->actions () & CompWindowActionMinimizeMask) w->minimize (); } return true; } bool CompScreenImpl::minimizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w && (w->actions () & CompWindowActionMinimizeMask)) w->minimize (); return true; } bool CompScreenImpl::maximizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->maximize (MAXIMIZE_STATE); return true; } bool CompScreenImpl::maximizeWinHorizontally (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->maximize (w->state () | CompWindowStateMaximizedHorzMask); return true; } bool CompScreenImpl::maximizeWinVertically (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->maximize (w->state () | CompWindowStateMaximizedVertMask); return true; } bool CompScreenImpl::showDesktop (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->showingDesktopMask() == 0) screen->enterShowDesktopMode (); else screen->leaveShowDesktopMode (NULL); return true; } bool CompScreenImpl::raiseWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->raise (); return true; } bool CompScreenImpl::lowerWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->lower (); return true; } bool CompScreenImpl::windowMenu (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w && screen->grabsEmpty ()) { Time time = CompOption::getIntOptionNamed (options, "time", CurrentTime); int button = CompOption::getIntOptionNamed (options, "button", 0); int x = CompOption::getIntOptionNamed (options, "x", w->geometry ().x ()); int y = CompOption::getIntOptionNamed (options, "y", w->geometry ().y ()); screen->toolkitAction (Atoms::toolkitActionWindowMenu, time, w->id (), button, x, y); } return true; } bool CompScreenImpl::toggleWinMaximized (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) { if ((w->priv->state & MAXIMIZE_STATE) == MAXIMIZE_STATE) w->maximize (0); else w->maximize (MAXIMIZE_STATE); } return true; } bool CompScreenImpl::toggleWinMaximizedHorizontally (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->maximize (w->priv->state ^ CompWindowStateMaximizedHorzMask); return true; } bool CompScreenImpl::toggleWinMaximizedVertically (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->maximize (w->priv->state ^ CompWindowStateMaximizedVertMask); return true; } bool CompScreenImpl::shadeWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w && (w->priv->actions & CompWindowActionShadeMask)) { w->priv->state ^= CompWindowStateShadedMask; w->updateAttributes (CompStackingUpdateModeNone); } return true; } compiz-0.9.11+14.04.20140409/src/region/0000755000015301777760000000000012321344021017546 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/region/tests/0000755000015301777760000000000012321344021020710 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/region/tests/test-region.cpp0000644000015301777760000004121312321343002023653 0ustar pbusernogroup00000000000000#include "core/region.h" #undef Bool #undef None #include #include #include namespace { int const x1(13); int const y1(11); int const width1(97); int const height1(93); int const x2(53); int const y2(47); int const width2(147); int const height2(157); CompRect rect1(x1, y1, width1, height1); CompRect rect2(x2, y2, width2, height2); int const dx(3); int const dy(5); TEST(RegionTest, create_and_destroy) { CompRegion default_ctor; CompRegion xywh_ctor(x1, y1, width1, height1); EXPECT_TRUE(default_ctor.isEmpty()); EXPECT_FALSE(xywh_ctor.isEmpty()); } TEST(RegionTest, create_from_points_and_destroy) { CompRegion rect_ctor(rect1); } TEST(RegionTest, create_compare_destroy1) { CompRegion expect(x1, y1, width1, height1); CompRegion actual(x1, y1, width1, height1); EXPECT_EQ(expect.boundingRect (), actual.boundingRect ()); EXPECT_EQ(expect.rects (), actual.rects ()); EXPECT_EQ(expect.isEmpty (), actual.isEmpty ()); EXPECT_EQ(expect.numRects (), actual.numRects ()); ASSERT_EQ(expect, actual); } TEST(RegionTest, create_compare_destroy2) { CompRegion expect(rect1); CompRegion actual(rect1); EXPECT_EQ(expect.boundingRect (), actual.boundingRect ()); EXPECT_EQ(expect.rects (), actual.rects ()); EXPECT_EQ(expect.isEmpty (), actual.isEmpty ()); EXPECT_EQ(expect.numRects (), actual.numRects ()); ASSERT_EQ(expect, actual); } TEST(RegionTest, create_copy_compare_destroy1) { CompRegion test(x1, y1, width1, height1); CompRegion copy(test); EXPECT_EQ(test.boundingRect (), copy.boundingRect ()); EXPECT_EQ(test.rects (), copy.rects ()); EXPECT_EQ(test.isEmpty (), copy.isEmpty ()); EXPECT_EQ(test.numRects (), copy.numRects ()); //ASSERT_EQ(test, copy); // TODO: find out why this doesn't work } TEST(RegionTest, create_copy_compare_destroy2) { CompRegion test(rect1); CompRegion copy(test); EXPECT_EQ(test.boundingRect (), copy.boundingRect ()); EXPECT_EQ(test.rects (), copy.rects ()); EXPECT_EQ(test.isEmpty (), copy.isEmpty ()); EXPECT_EQ(test.numRects (), copy.numRects ()); ASSERT_EQ(test, copy); } TEST(RegionTest, create_assign_compare_destroy1) { CompRegion test(x1, y1, width1, height1); CompRegion copy; copy = test; EXPECT_EQ(test.boundingRect (), copy.boundingRect ()); EXPECT_EQ(test.rects (), copy.rects ()); EXPECT_EQ(test.isEmpty (), copy.isEmpty ()); EXPECT_EQ(test.numRects (), copy.numRects ()); ASSERT_EQ(test, copy); } TEST(RegionTest, create_assign_compare_destroy2) { CompRegion test(rect1); CompRegion copy; copy = test; EXPECT_EQ(test.boundingRect (), copy.boundingRect ()); EXPECT_EQ(test.rects (), copy.rects ()); EXPECT_EQ(test.isEmpty (), copy.isEmpty ()); EXPECT_EQ(test.numRects (), copy.numRects ()); ASSERT_EQ(test, copy); } TEST(RegionTest, contains_points) { CompRegion r1(x1, y1, width1, height1); EXPECT_TRUE(r1.contains(CompPoint(x1, y1))); EXPECT_TRUE(r1.contains(CompPoint(x1, y1+height1-1))); EXPECT_TRUE(r1.contains(CompPoint(x1+width1-1, y1))); EXPECT_TRUE(r1.contains(CompPoint(x1+width1-1, y1+height1-1))); EXPECT_TRUE(r1.contains(CompPoint(x1+width1/2, y1+height1/2))); EXPECT_FALSE(r1.contains(CompPoint(x1-1, y1))); EXPECT_FALSE(r1.contains(CompPoint(x1, y1-1))); EXPECT_FALSE(r1.contains(CompPoint(x1+width1, y1))); EXPECT_FALSE(r1.contains(CompPoint(x1, y1+height1))); EXPECT_FALSE(r1.contains(CompPoint(x1+width1, y1+height1))); CompRegion r2(rect1); EXPECT_TRUE(r2.contains(CompPoint(x1, y1))); EXPECT_TRUE(r2.contains(CompPoint(x1, y1+height1-1))); EXPECT_TRUE(r2.contains(CompPoint(x1+width1-1, y1))); EXPECT_TRUE(r2.contains(CompPoint(x1+width1-1, y1+height1-1))); EXPECT_TRUE(r2.contains(CompPoint(x1+width1/2, y1+height1/2))); EXPECT_FALSE(r2.contains(CompPoint(x1-1, y1))); EXPECT_FALSE(r2.contains(CompPoint(x1, y1-1))); EXPECT_FALSE(r2.contains(CompPoint(x1+width1, y1))); EXPECT_FALSE(r2.contains(CompPoint(x1, y1+height1))); EXPECT_FALSE(r2.contains(CompPoint(x1+width1, y1+height1))); } TEST(RegionTest, contains_rects) { CompRegion r1(x1, y1, width1, height1); EXPECT_TRUE(r1.contains(CompRect(x1, y1, width1, height1))); EXPECT_TRUE(r1.contains(CompRect(x1, y1+1, width1, height1-1))); EXPECT_TRUE(r1.contains(CompRect(x1+1, y1, width1-1, height1))); EXPECT_TRUE(r1.contains(CompRect(x1, y1, width1-1, height1))); EXPECT_TRUE(r1.contains(CompRect(x1, y1, width1, height1-1))); EXPECT_FALSE(r1.contains(CompRect(x1+1, y1, width1, height1))); EXPECT_FALSE(r1.contains(CompRect(x1, y1+1, width1, height1))); EXPECT_FALSE(r1.contains(CompRect(x1, y1, width1+1, height1))); EXPECT_FALSE(r1.contains(CompRect(x1, y1, width1, height1+1))); EXPECT_FALSE(r1.contains(CompRect(x1-1, y1, width1, height1))); EXPECT_FALSE(r1.contains(CompRect(x1, y1-1, width1, height1))); CompRegion r2(rect1); EXPECT_TRUE(r2.contains(CompRect(x1, y1, width1, height1))); EXPECT_TRUE(r2.contains(CompRect(x1, y1+1, width1, height1-1))); EXPECT_TRUE(r2.contains(CompRect(x1+1, y1, width1-1, height1))); EXPECT_TRUE(r2.contains(CompRect(x1, y1, width1-1, height1))); EXPECT_TRUE(r2.contains(CompRect(x1, y1, width1, height1-1))); EXPECT_FALSE(r2.contains(CompRect(x1+1, y1, width1, height1))); EXPECT_FALSE(r2.contains(CompRect(x1, y1+1, width1, height1))); EXPECT_FALSE(r2.contains(CompRect(x1, y1, width1+1, height1))); EXPECT_FALSE(r2.contains(CompRect(x1, y1, width1, height1+1))); EXPECT_FALSE(r2.contains(CompRect(x1-1, y1, width1, height1))); EXPECT_FALSE(r2.contains(CompRect(x1, y1-1, width1, height1))); } TEST(RegionTest, contains_xywh) { CompRegion r1(x1, y1, width1, height1); EXPECT_TRUE(r1.contains(x1, y1, width1, height1)); EXPECT_TRUE(r1.contains(x1, y1+1, width1, height1-1)); EXPECT_TRUE(r1.contains(x1+1, y1, width1-1, height1)); EXPECT_TRUE(r1.contains(x1, y1, width1-1, height1)); EXPECT_TRUE(r1.contains(x1, y1, width1, height1-1)); EXPECT_FALSE(r1.contains(x1+1, y1, width1, height1)); EXPECT_FALSE(r1.contains(x1, y1+1, width1, height1)); EXPECT_FALSE(r1.contains(x1, y1, width1+1, height1)); EXPECT_FALSE(r1.contains(x1, y1, width1, height1+1)); EXPECT_FALSE(r1.contains(x1-1, y1, width1, height1)); EXPECT_FALSE(r1.contains(x1, y1-1, width1, height1)); CompRegion r2(rect1); EXPECT_TRUE(r2.contains(x1, y1, width1, height1)); EXPECT_TRUE(r2.contains(x1, y1+1, width1, height1-1)); EXPECT_TRUE(r2.contains(x1+1, y1, width1-1, height1)); EXPECT_TRUE(r2.contains(x1, y1, width1-1, height1)); EXPECT_TRUE(r2.contains(x1, y1, width1, height1-1)); EXPECT_FALSE(r2.contains(x1+1, y1, width1, height1)); EXPECT_FALSE(r2.contains(x1, y1+1, width1, height1)); EXPECT_FALSE(r2.contains(x1, y1, width1+1, height1)); EXPECT_FALSE(r2.contains(x1, y1, width1, height1+1)); EXPECT_FALSE(r2.contains(x1-1, y1, width1, height1)); EXPECT_FALSE(r2.contains(x1, y1-1, width1, height1)); } TEST(RegionTest, equivalent_creates_compare_equal) { CompRegion expect(x1, y1, width1, height1); CompRegion actual(rect1); EXPECT_EQ(expect.boundingRect (), actual.boundingRect ()); EXPECT_EQ(expect.rects (), actual.rects ()); EXPECT_EQ(expect.isEmpty (), actual.isEmpty ()); EXPECT_EQ(expect.numRects (), actual.numRects ()); ASSERT_EQ(expect, actual); } TEST(RegionTest, different_creates_compare_unequal) { CompRegion r1(x1, y1, width1, height1); CompRegion r2(x2, y2, width2, height2); EXPECT_NE(r1.boundingRect (), r2.boundingRect ()); EXPECT_NE(r1.rects (), r2.rects ()); EXPECT_EQ(r1.isEmpty (), r2.isEmpty ()); EXPECT_EQ(r1.numRects (), r2.numRects ()); ASSERT_NE(r1, r2); CompRegion r3(rect1); CompRegion r4(rect2); EXPECT_NE(r3.boundingRect (), r4.boundingRect ()); EXPECT_NE(r3.rects (), r4.rects ()); EXPECT_EQ(r3.isEmpty (), r4.isEmpty ()); EXPECT_EQ(r3.numRects (), r4.numRects ()); ASSERT_NE(r3, r4); } TEST(RegionTest, intersection) { CompRegion r1(x1, y1, width1, height1); CompRegion r2(x2, y2, width2, height2); EXPECT_TRUE(r1.intersects(r1)); EXPECT_TRUE(r1.intersects(r2)); EXPECT_TRUE(r2.intersects(r1)); EXPECT_TRUE(r2.intersects(r2)); EXPECT_TRUE(r1.intersects(rect1)); EXPECT_TRUE(r2.intersects(rect1)); EXPECT_TRUE(r1.intersects(rect2)); EXPECT_TRUE(r2.intersects(rect2)); CompRegion r1_self(r1.intersected(r1)); EXPECT_EQ(r1, r1_self); CompRegion r2_self(r2.intersected(r2)); EXPECT_EQ(r2, r2_self); CompRegion r1_r2(r1.intersected(r2)); CompRegion r2_r1(r2.intersected(r1)); EXPECT_EQ(r1_r2, r2_r1); EXPECT_TRUE(r1_r2.intersects(rect1)); EXPECT_TRUE(r1_r2.intersects(rect2)); EXPECT_TRUE(r2_r1.intersects(rect1)); EXPECT_TRUE(r2_r1.intersects(rect2)); CompRegion r1_rect1(r1.intersected(rect1)); EXPECT_EQ(r1, r1_rect1); CompRegion r2_rect2(r2.intersected(rect2)); EXPECT_EQ(r2, r2_rect2); CompRegion r1_rect2(r1.intersected(rect2)); CompRegion r2_rect1(r2.intersected(rect1)); EXPECT_EQ(r1_r2, r1_rect2); EXPECT_EQ(r1_r2, r2_rect1); CompRect expect(x2, y2, width1-(x2-x1), height1-(y2-y1)); EXPECT_EQ(expect, r1_r2.boundingRect()); } TEST(RegionTest, subtract) { CompRegion r1(x1, y1, width1, height1); CompRegion r2(x2, y2, width2, height2); CompRegion r1_r2(r1.subtracted(r2)); CompRegion r2_r1(r2.subtracted(r1)); EXPECT_FALSE(r1_r2.intersects(r2_r1)); EXPECT_NE(r1, r1_r2); EXPECT_NE(r2, r2_r1); EXPECT_EQ(r1.boundingRect(), r1_r2.boundingRect()); EXPECT_EQ(r2.boundingRect(), r2_r1.boundingRect()); EXPECT_TRUE(r1_r2.contains(CompPoint(x1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1+width1-1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1, y1+height1-1))); EXPECT_FALSE(r1_r2.contains(CompPoint(x2, y2))); EXPECT_FALSE(r1_r2.contains(rect1)); EXPECT_FALSE(r1_r2.contains(rect2)); EXPECT_EQ(2, r1_r2.numRects()); typedef std::vector vcr; { vcr const& rects = r1_r2.rects(); EXPECT_EQ(2, rects.size()); for(vcr::const_iterator i = rects.begin(); i !=rects.end(); ++i) { EXPECT_TRUE(r1.contains(*i)); EXPECT_FALSE(r2.contains(*i)); } } // Much the same with rects instead of regions CompRegion r1_rect2(r1.subtracted(rect2)); CompRegion r2_rect1(r2.subtracted(rect1)); EXPECT_FALSE(r1_rect2.intersects(r2_rect1)); EXPECT_NE(r1, r1_rect2); EXPECT_NE(r2, r2_rect1); EXPECT_EQ(r1.boundingRect(), r1_rect2.boundingRect()); EXPECT_EQ(r2.boundingRect(), r2_rect1.boundingRect()); EXPECT_TRUE(r1_rect2.contains(CompPoint(x1, y1))); EXPECT_TRUE(r1_rect2.contains(CompPoint(x1+width1-1, y1))); EXPECT_TRUE(r1_rect2.contains(CompPoint(x1, y1+height1-1))); EXPECT_FALSE(r1_rect2.contains(CompPoint(x2, y2))); EXPECT_FALSE(r1_rect2.contains(rect1)); EXPECT_FALSE(r1_rect2.contains(rect2)); EXPECT_EQ(2, r1_rect2.numRects()); typedef std::vector vcr; { vcr const& rects = r1_rect2.rects(); EXPECT_EQ(2, rects.size()); for(vcr::const_iterator i = rects.begin(); i !=rects.end(); ++i) { EXPECT_TRUE(r1.contains(*i)); EXPECT_FALSE(r2.contains(*i)); } } } TEST(RegionTest, translate) { CompRegion r1(CompRegion(x1, y1, width1, height1).subtracted(rect2)); CompRegion r2(r1.translated(dx, dy)); EXPECT_NE(r1, r2); // Bloody daft to use a "point" as a displacement CompRegion r3(r1.translated(CompPoint(dx, dy))); EXPECT_NE(r1, r3); EXPECT_EQ(r2, r3); r2.translate(-dx, -dy); EXPECT_EQ(r1, r2); // Bloody daft to use a "point" as a displacement r3.translate(CompPoint(-dx, -dy)); EXPECT_EQ(r1, r3); } TEST(RegionTest, shrink) { CompRegion r1(CompRegion(x1, y1, width1, height1).subtracted(rect2)); CompRegion r2(r1.shrinked(dx, dy)); EXPECT_NE(r1, r2); // Bloody daft to use a "point" as a boundary delta CompRegion r3(r1.shrinked(CompPoint(dx, dy))); EXPECT_NE(r1, r3); EXPECT_EQ(r2, r3); r2.shrink(-dx, -dy); EXPECT_EQ(r1, r2); // Bloody daft to use a "point" as a boundary delta r3.shrink(CompPoint(-dx, -dy)); EXPECT_EQ(r1, r3); } TEST(RegionTest, unite) { CompRegion r1(x1, y1, width1, height1); CompRegion r2(rect2); CompRegion r1_self(r1.united(r1)); EXPECT_EQ(r1, r1_self); CompRegion r2_self(r2.united(r2)); EXPECT_EQ(r2, r2_self); CompRegion r1_r2(r1.united(r2)); CompRegion r2_r1(r2.united(r1)); EXPECT_EQ(r1_r2, r2_r1); EXPECT_TRUE(r1_r2.contains(x1, y1, width1, height1)); EXPECT_TRUE(r1_r2.contains(rect2)); EXPECT_TRUE(r1_r2.contains(CompPoint(x1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1+width1-1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1, y1+height1-1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1+width1-1, y1+height1-1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x2, y2))); EXPECT_FALSE(r1_r2.contains(CompPoint(x1, y2+height2-1))); EXPECT_FALSE(r1_r2.contains(CompPoint(x2+width2-1, y1))); } TEST(RegionTest, xored) { CompRegion r1(x1, y1, width1, height1); CompRegion r2(rect2); CompRegion r1_self(r1.xored(r1)); EXPECT_NE(r1, r1_self); EXPECT_TRUE(r1_self.isEmpty()); CompRegion r2_self(r2.xored(r2)); EXPECT_NE(r2, r2_self); EXPECT_TRUE(r2_self.isEmpty()); CompRegion r1_r2(r1.xored(r2)); CompRegion r2_r1(r2.xored(r1)); EXPECT_EQ(r1_r2, r2_r1); EXPECT_FALSE(r1_r2.contains(x1, y1, width1, height1)); EXPECT_FALSE(r1_r2.contains(rect2)); EXPECT_TRUE(r1_r2.contains(CompPoint(x1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1+width1-1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1, y1+height1-1))); EXPECT_FALSE(r1_r2.contains(CompPoint(x1+width1-1, y1+height1-1))); EXPECT_FALSE(r1_r2.contains(CompPoint(x2, y2))); EXPECT_FALSE(r1_r2.contains(CompPoint(x1, y2+height2-1))); EXPECT_FALSE(r1_r2.contains(CompPoint(x2+width2-1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x2, y2+height2-1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x2+width2-1, y2))); EXPECT_TRUE(r1_r2.contains(CompPoint(x2+width2-1, y2+height2-1))); } // The operators should be non-members and syntactic sugar. But... TEST(RegionTest, operators) { CompRegion r1(rect1); CompRegion r2(rect2); { // operator&() varients CompRegion expect(r1.intersected(rect2)); EXPECT_EQ(expect, r1 & r2); EXPECT_EQ(expect, r1 & rect2); EXPECT_EQ(expect, CompRegion(r1) &= r2); EXPECT_EQ(expect, CompRegion(r1) &= rect2); } { // operator+() varients CompRegion expect(r1.united(rect2)); EXPECT_EQ(expect, r1 + r2); EXPECT_EQ(expect, r1 + rect2); EXPECT_EQ(expect, CompRegion(r1) += r2); EXPECT_EQ(expect, CompRegion(r1) += rect2); // operator|() varients EXPECT_EQ(expect, r1 | r2); EXPECT_EQ(expect, r1 | rect2); EXPECT_EQ(expect, CompRegion(r1) |= r2); EXPECT_EQ(expect, CompRegion(r1) |= rect2); } { // operator-() varients CompRegion expect(r1.subtracted(rect2)); EXPECT_EQ(expect, r1 - r2); EXPECT_EQ(expect, r1 - rect2); EXPECT_EQ(expect, CompRegion(r1) -= r2); EXPECT_EQ(expect, CompRegion(r1) -= rect2); } { // operator^() varients CompRegion expect(r1.xored(rect2)); EXPECT_EQ(expect, r1 ^ r2); EXPECT_EQ(expect, r1 ^ rect2); EXPECT_EQ(expect, CompRegion(r1) ^= r2); EXPECT_EQ(expect, CompRegion(r1) ^= rect2); } } TEST(RegionTest, external_refs) { CompRegion r1(rect1); CompRegion r2(rect2); CompRegionRef rr1(r1.handle()); CompRegionRef rr2(r2.handle()); { // Verify that the refs don't free the underlying Region. If they // do then the following EXPECT_EQ's should crash. CompRegionRef tmp1(r1.handle()); CompRegionRef tmp2(r2.handle()); } EXPECT_EQ(r1, rr1); EXPECT_EQ(r1.handle(), rr1.handle()); EXPECT_EQ(r2, rr2); EXPECT_EQ(r2.handle(), rr2.handle()); EXPECT_EQ(r1 & r2, rr1 & rr2); EXPECT_EQ(r1 & r2, rr1 & r2); EXPECT_EQ(r1 & rr2, rr1 & r2); EXPECT_EQ(r1 | r2, rr1 | rr2); EXPECT_EQ(r1 | r2, rr1 | r2); EXPECT_EQ(r1 | rr2, rr1 | r2); EXPECT_EQ(r1 - r2, rr1 - rr2); EXPECT_EQ(r1 - r2, rr1 - r2); EXPECT_EQ(r1 - rr2, rr1 - r2); EXPECT_EQ(r1 ^ r2, rr1 ^ rr2); EXPECT_EQ(r1 ^ r2, rr1 ^ r2); EXPECT_EQ(r1 ^ rr2, rr1 ^ r2); CompRegion *p = new CompRegion(r1); CompRegionRef *rp = new CompRegionRef(p->handle()); ASSERT_EQ(*rp, r1); delete rp; ASSERT_EQ(*p, r1); delete p; } } compiz-0.9.11+14.04.20140409/src/region/tests/CMakeLists.txt0000644000015301777760000000124212321343002023445 0ustar pbusernogroup00000000000000include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/region/include ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src ) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${compiz_plugindir}\\\" -DSHAREDIR=\\\"${compiz_sharedir}\\\" -DMETADATADIR=\\\"${compiz_metadatadir}\\\" ) add_executable( compiz_region_test ${CMAKE_CURRENT_SOURCE_DIR}/test-region.cpp ) target_link_libraries( compiz_region_test compiz_region compiz_rect compiz_point ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ) compiz_discover_tests (compiz_region_test COVERAGE compiz_region) compiz-0.9.11+14.04.20140409/src/region/CMakeLists.txt0000644000015301777760000000177012321343002022311 0ustar pbusernogroup00000000000000pkg_check_modules ( X11 REQUIRED x11 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${X11_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/region.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/region.cpp ) ADD_LIBRARY( compiz_region STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_region PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_region compiz_point compiz_rect ${X11_LIBRARIES} ) compiz-0.9.11+14.04.20140409/src/region/src/0000755000015301777760000000000012321344021020335 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/region/src/region.cpp0000644000015301777760000002114412321343002022324 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include "core/rect.h" #include "core/region.h" #include #include #include #include #include #include #define foreach BOOST_FOREACH template class std::vector; const CompRegion infiniteRegion (CompRect (MINSHORT, MINSHORT, MAXSHORT * 2, MAXSHORT * 2)); const CompRegion emptyRegion; /* Alternate emptyRegion, mostly just required to construct infiniteRegion when emptyRegion may still be uninitialized */ static const CompRegion & _emptyRegion () { static const CompRegion r; return r; } CompRegion::CompRegion () { init (); } CompRegion::CompRegion (const CompRegion &c) { init (); XUnionRegion (_emptyRegion ().handle (), c.handle (), handle ()); } CompRegion::CompRegion ( int x, int y, int w, int h) { init (); XRectangle rect; rect.x = x; rect.y = y; rect.width = w; rect.height = h; XUnionRectWithRegion (&rect, _emptyRegion ().handle (), handle ()); } CompRegion::CompRegion (const CompRect &r) { init (); XRectangle rect; rect.x = r.x (); rect.y = r.y (); rect.width = r.width (); rect.height = r.height (); XUnionRectWithRegion (&rect, _emptyRegion ().handle (), handle ()); } CompRegion::CompRegion (Region external) { priv = external; } CompRegionRef::CompRegionRef (Region external) : CompRegion (external) { } CompRegionRef::~CompRegionRef () { /* Ensure CompRegion::~CompRegion does not destroy the region, because it's external and we don't own it. */ priv = NULL; } CompRegion::~CompRegion () { if (priv) XDestroyRegion (static_cast (priv)); } void CompRegion::init () { assert (sizeof (Region) == sizeof (void*)); priv = XCreateRegion (); } Region CompRegion::handle () const { return static_cast (priv); } CompRegion & CompRegion::operator= (const CompRegion &c) { XUnionRegion (emptyRegion.handle (), c.handle (), handle ()); return *this; } bool CompRegion::operator== (const CompRegion &c) const { return XEqualRegion (handle (), c.handle ()); } bool CompRegion::operator!= (const CompRegion &c) const { return !(*this == c); } CompRect CompRegion::boundingRect () const { BOX b = handle ()->extents; return CompRect (b.x1, b.y1, b.x2 - b.x1, b.y2 - b.y1); } bool CompRegion::contains (const CompPoint &p) const { return XPointInRegion (handle (), p.x (), p.y ()); } bool CompRegion::contains (const CompRect &r) const { int result; result = XRectInRegion (handle (), r.x (), r.y (), r.width (), r.height ()); return result == RectangleIn; } bool CompRegion::contains (int x, int y, int width, int height) const { int result; result = XRectInRegion (handle (), x, y, width, height); return result == RectangleIn; } CompRegion CompRegion::intersected (const CompRegion &r) const { CompRegion reg (r); XIntersectRegion (reg.handle (), handle (), reg.handle ()); return reg; } CompRegion CompRegion::intersected (const CompRect &r) const { CompRegion reg (r); XIntersectRegion (reg.handle (), handle (), reg.handle ()); return reg; } bool CompRegion::intersects (const CompRegion &r) const { return !intersected (r).isEmpty (); } bool CompRegion::intersects (const CompRect &r) const { int result; result = XRectInRegion (handle (), r.x (), r.y (), r.width (), r.height ()); return result != RectangleOut; } bool CompRegion::isEmpty () const { return XEmptyRegion (handle ()); } int CompRegion::numRects () const { return handle ()->numRects; } CompRect::vector CompRegion::rects () const { CompRect::vector rv; if (!numRects ()) return rv; BOX b; for (int i = 0; i < handle ()->numRects; i++) { b = handle ()->rects[i]; rv.push_back (CompRect (b.x1, b.y1, b.x2 - b.x1, b.y2 - b.y1)); } return rv; } CompRegion CompRegion::subtracted (const CompRegion &r) const { CompRegion rv; XSubtractRegion (handle (), r.handle (), rv.handle ()); return rv; } CompRegion CompRegion::subtracted (const CompRect &r) const { CompRegion rv; XSubtractRegion (handle (), r.region (), rv.handle ()); return rv; } void CompRegion::translate (int dx, int dy) { XOffsetRegion (handle (), dx, dy); } void CompRegion::translate (const CompPoint &p) { translate (p.x (), p.y ()); } CompRegion CompRegion::translated (int dx, int dy) const { CompRegion rv (*this); rv.translate (dx, dy); return rv; } CompRegion CompRegion::translated (const CompPoint &p) const { CompRegion rv (*this); rv.translate (p); return rv; } void CompRegion::shrink (int dx, int dy) { XShrinkRegion (handle (), dx, dy); } void CompRegion::shrink (const CompPoint &p) { shrink (p.x (), p.y ()); } CompRegion CompRegion::shrinked (int dx, int dy) const { CompRegion rv (*this); rv.shrink (dx, dy); return rv; } CompRegion CompRegion::shrinked (const CompPoint &p) const { CompRegion rv (*this); rv.shrink (p); return rv; } CompRegion CompRegion::united (const CompRegion &r) const { CompRegion rv; XUnionRegion (handle (), r.handle (), rv.handle ()); return rv; } CompRegion CompRegion::united (const CompRect &r) const { CompRegion rv; XUnionRegion (handle (), r.region (), rv.handle ()); return rv; } CompRegion CompRegion::xored (const CompRegion &r) const { CompRegion rv; XXorRegion (handle (), r.handle (), rv.handle ()); return rv; } const CompRegion CompRegion::operator& (const CompRegion &r) const { return intersected (r); } const CompRegion CompRegion::operator& (const CompRect &r) const { return intersected (r); } CompRegion & CompRegion::operator&= (const CompRegion &r) { XIntersectRegion (r.handle (), handle (), handle ()); return *this; } CompRegion & CompRegion::operator&= (const CompRect &r) { CompRegionRef ref (r.region ()); XIntersectRegion (ref.handle (), handle (), handle ()); return *this; } const CompRegion CompRegion::operator+ (const CompRegion &r) const { return united (r); } const CompRegion CompRegion::operator+ (const CompRect &r) const { return united (r); } CompRegion & CompRegion::operator+= (const CompRegion &r) { XUnionRegion (handle (), r.handle (), handle ()); return *this; } CompRegion & CompRegion::operator+= (const CompRect &r) { CompRegionRef ref (r.region ()); XUnionRegion (handle (), ref.handle (), handle ()); return *this; } const CompRegion CompRegion::operator- (const CompRegion &r) const { return subtracted (r); } const CompRegion CompRegion::operator- (const CompRect &r) const { return subtracted (r); } CompRegion & CompRegion::operator-= (const CompRegion &r) { XSubtractRegion (handle (), r.handle (), handle ()); return *this; } CompRegion & CompRegion::operator-= (const CompRect &r) { CompRegionRef ref (r.region ()); XSubtractRegion (handle (), ref.handle (), handle ()); return *this; } const CompRegion CompRegion::operator^ (const CompRegion &r) const { return xored (r); } CompRegion & CompRegion::operator^= (const CompRegion &r) { XXorRegion (handle (), r.handle (), handle ()); return *this; } const CompRegion CompRegion::operator| (const CompRegion &r) const { return united (r); } CompRegion & CompRegion::operator|= (const CompRegion &r) { XUnionRegion (handle (), r.handle (), handle ()); return *this; } compiz-0.9.11+14.04.20140409/src/region/include/0000755000015301777760000000000012321344021021171 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/region/include/core/0000755000015301777760000000000012321344021022121 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/region/include/core/region.h0000644000015301777760000001373212321343002023561 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _COMPREGION_H #define _COMPREGION_H #include #include #include #include #include class CompRegion; COMPIZ_EXTERN_STD(vector) /** * A 2D region with an (x,y) position and arbitrary dimensions similar to * an XRegion. It's data membmers are private and must be manipulated with * set() methods. */ class CompRegion { public: typedef std::vector Vector; public: CompRegion (); CompRegion (const CompRegion &); CompRegion (int x, int y, int w, int h); CompRegion (const CompRect &); ~CompRegion (); /** * Returns a CompRect which encapsulates a given CompRegion */ CompRect boundingRect () const; bool isEmpty () const; /** * Returns the number of XRectangles in the XRegion handle */ int numRects () const; /** * Returns a vector of all the XRectangles in the XRegion handle */ CompRect::vector rects () const; /** * Returns the internal XRegion handle */ Region handle () const; /** * Returns true if the specified CompPoint falls within the * CompRegion */ bool contains (const CompPoint &) const; /** * Returns true if the specified CompRect falls within the * CompRegion */ bool contains (const CompRect &) const; /** * Returns true if the specified size falls withing the * CompRegion */ bool contains (int x, int y, int width, int height) const; /** * Returns a CompRegion that is the result of an intersect with * the specified CompRegion and the region */ CompRegion intersected (const CompRegion &) const; /** * Returns a CompRegion that is the result of an intersect with * the specified CompRect and the region */ CompRegion intersected (const CompRect &) const; /** * Returns true if a specified CompRegion intersects a region */ bool intersects (const CompRegion &) const; /** * Returns true if a specified CompRect intersects a region */ bool intersects (const CompRect &) const; /** * Returns a CompRegion covering the area of the region * and not including the area of the specified CompRegion */ CompRegion subtracted (const CompRegion &) const; /** * Returns a CompRegion covering the area of the region * and not including the area of the specified CompRect */ CompRegion subtracted (const CompRect &) const; /** * Moves a region by x and y amount */ void translate (int dx, int dy); /** * Moves a region by an amount specified by the co-ordinates of a * CompPoint */ void translate (const CompPoint &); /** * Returns a CompRegion which is the result of the region being moved * by dx and dy amount */ CompRegion translated (int, int) const; /** * Returns a CompRegion which is the result of the region being moved * by an amount specified by the co-ordinates of a CompPoint */ CompRegion translated (const CompPoint &) const; void shrink (int, int); void shrink (const CompPoint &); CompRegion shrinked (int, int) const; CompRegion shrinked (const CompPoint &) const; /** * Returns a CompRegion which is the result of the region joined * with a specified CompRegion */ CompRegion united (const CompRegion &) const; /** * Returns a CompRegion which is the result of the region joined * with a specified CompRect */ CompRegion united (const CompRect &) const; /** * Returns a CompRegion which is the result of the region joined * with a specified CompRegion, excluding the area in which * both regions intersect */ CompRegion xored (const CompRegion &) const; bool operator== (const CompRegion &) const; bool operator!= (const CompRegion &) const; const CompRegion operator& (const CompRegion &) const; const CompRegion operator& (const CompRect &) const; CompRegion & operator&= (const CompRegion &); CompRegion & operator&= (const CompRect &); const CompRegion operator+ (const CompRegion &) const; const CompRegion operator+ (const CompRect &) const; CompRegion & operator+= (const CompRegion &); CompRegion & operator+= (const CompRect &); const CompRegion operator- (const CompRegion &) const; const CompRegion operator- (const CompRect &) const; CompRegion & operator-= (const CompRegion &); CompRegion & operator-= (const CompRect &); CompRegion & operator= (const CompRegion &); const CompRegion operator^ (const CompRegion &) const; CompRegion & operator^= (const CompRegion &); const CompRegion operator| (const CompRegion &) const; CompRegion & operator|= (const CompRegion &); protected: /* Construct a CompRegion based on an externally managed Region */ explicit CompRegion (Region); void init (); void *priv; }; class CompRegionRef : public CompRegion { public: explicit CompRegionRef (Region); ~CompRegionRef (); }; extern const CompRegion infiniteRegion; extern const CompRegion emptyRegion; #endif compiz-0.9.11+14.04.20140409/src/size.cpp0000644000015301777760000000277112321343002017746 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include CompSize::CompSize () : mWidth (0), mHeight (0) { } CompSize::CompSize (int width, int height) : mWidth (width), mHeight (height) { } void CompSize::setWidth (int width) { mWidth = width; } void CompSize::setHeight (int height) { mHeight = height; } compiz-0.9.11+14.04.20140409/src/outputdevices_x11.cpp0000644000015301777760000001101512321343002022357 0ustar pbusernogroup00000000000000/* * Compiz Core: OutputDevices class (functions that link to core and/or X11) * * Copyright (c) 2012 Canonical Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "outputdevices.h" #include "core_options.h" namespace compiz { namespace core { CompRect OutputDevices::computeWorkareaForBox (const CompRect &box, CompWindowList const &windows) { CompRegion region; int x1, y1, x2, y2; region += box; foreach (CompWindow *w, windows) { if (!w->isMapped ()) continue; if (w->struts ()) { x1 = w->struts ()->left.x; y1 = w->struts ()->left.y; x2 = x1 + w->struts ()->left.width; y2 = y1 + w->struts ()->left.height; if (y1 < box.y2 () && y2 > box.y1 ()) region -= CompRect (x1, box.y1 (), x2 - x1, box.height ()); x1 = w->struts ()->right.x; y1 = w->struts ()->right.y; x2 = x1 + w->struts ()->right.width; y2 = y1 + w->struts ()->right.height; if (y1 < box.y2 () && y2 > box.y1 ()) region -= CompRect (x1, box.y1 (), x2 - x1, box.height ()); x1 = w->struts ()->top.x; y1 = w->struts ()->top.y; x2 = x1 + w->struts ()->top.width; y2 = y1 + w->struts ()->top.height; if (x1 < box.x2 () && x2 > box.x1 ()) region -= CompRect (box.x1 (), y1, box.width (), y2 - y1); x1 = w->struts ()->bottom.x; y1 = w->struts ()->bottom.y; x2 = x1 + w->struts ()->bottom.width; y2 = y1 + w->struts ()->bottom.height; if (x1 < box.x2 () && x2 > box.x1 ()) region -= CompRect (box.x1 (), y1, box.width (), y2 - y1); } } if (region.isEmpty ()) { compLogMessage ("core", CompLogLevelWarn, "Empty box after applying struts, ignoring struts"); return box; } return region.boundingRect (); } void OutputDevices::computeWorkAreas (CompRect &workArea, bool &workAreaChanged, CompRegion &allWorkArea, CompWindowList const &windows) { for (unsigned int i = 0; i < outputDevs.size(); ++i) { CompRect oldWorkArea = outputDevs[i].workArea (); workArea = computeWorkareaForBox (outputDevs[i], windows); if (workArea != oldWorkArea) { workAreaChanged = true; outputDevs[i].setWorkArea (workArea); } allWorkArea += workArea; } } void OutputDevices::updateOutputDevices (CoreOptions &coreOptions, CompSize *screen) { CompOption::Value::Vector &list = coreOptions.optionGetOutputs (); unsigned int nOutput = 0; int x, y, bits; unsigned int uWidth, uHeight; int width, height; int x1, y1, x2, y2; foreach (CompOption::Value &value, list) { x = 0; y = 0; uWidth = static_cast (screen->width ()); uHeight = static_cast (screen->height ()); bits = XParseGeometry(value.s ().c_str (), &x, &y, &uWidth, &uHeight); width = static_cast (uWidth); height = static_cast (uHeight); if (bits & XNegative) x = screen->width () + x - width; if (bits & YNegative) y = screen->height () + y - height; x1 = x; y1 = y; x2 = x + width; y2 = y + height; if (x1 < 0) x1 = 0; if (y1 < 0) y1 = 0; if (x2 > screen->width ()) x2 = screen->width (); if (y2 > screen->height ()) y2 = screen->height (); if (x1 < x2 && y1 < y2) { setGeometryOnDevice (nOutput, x1, y1, x2 - x1, y2 - y1); ++nOutput; } } adoptDevices (nOutput, screen); } } } // namespace compiz::core compiz-0.9.11+14.04.20140409/src/privateeventsource.h0000644000015301777760000000343412321343002022373 0ustar pbusernogroup00000000000000/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_PRIVATEEVENTSOURCE_H #define _COMPIZ_PRIVATEEVENTSOURCE_H #include #include class CompEventSource: public Glib::Source { public: virtual ~CompEventSource (); static Glib::RefPtr create (); sigc::connection connect (const sigc::slot &slot); protected: bool prepare (int &timeout); bool check (); bool dispatch (sigc::slot_base *slot); bool callback (); CompEventSource (Display *dpy, int fd); private: Display *mDpy; Glib::PollFD mPollFD; int mConnectionFD; }; #endif compiz-0.9.11+14.04.20140409/src/privatescreen/0000755000015301777760000000000012321344021021135 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/privatescreen/tests/0000755000015301777760000000000012321344021022277 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/privatescreen/tests/CMakeLists.txt0000644000015301777760000000234112321343002025035 0ustar pbusernogroup00000000000000include(CompizTesting) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${compiz_BINARY_DIR}/generated ${compiz_SOURCE_DIR}/build/generated ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/timer/include ${compiz_SOURCE_DIR}/src/timer/src ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/region/include ${compiz_SOURCE_DIR}/src/screen/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/src/screen/extents/include ${compiz_SOURCE_DIR}/src/servergrab/include ${compiz_SOURCE_DIR}/src/pluginclasshandler/include ${COMPIZ_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${compiz_plugindir}\\\" -DSHAREDIR=\\\"${compiz_sharedir}\\\" -DMETADATADIR=\\\"${compiz_metadatadir}\\\" ) add_executable( compiz_privatescreen_test ${CMAKE_CURRENT_SOURCE_DIR}/test-privatescreen.cpp ) target_link_libraries( compiz_privatescreen_test compiz_core compiz_window_constrainment compiz_logmessage ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ) compiz_discover_tests (compiz_privatescreen_test COVERAGE compiz_core) compiz-0.9.11+14.04.20140409/src/privatescreen/tests/test-privatescreen.cpp0000644000015301777760000014163212321343002026637 0ustar pbusernogroup00000000000000#include "privatescreen.h" #include "privateaction.h" #include "eventmanagement.h" // Get rid of stupid macro from X.h // Why, oh why, are we including X.h? #undef None #include #include #include using ::testing::Return; using ::testing::ReturnRef; using ::testing::_; namespace { const unsigned long None = 0; class MockCompScreen : public CompScreen { public: MockCompScreen() { // The PluginManager ctor uses screen->... (indirectly via CoreOptions) // We should kill this dependency screen = this; } ~MockCompScreen() { // Because of another indirect use of screen in PluginManager dtor // via option.cpp:finiOptionValue() screen = 0; } // Interface hoisted from CompScreen MOCK_METHOD0(updateDefaultIcon, bool ()); MOCK_METHOD0(dpy, Display * ()); MOCK_METHOD0(root, Window ()); MOCK_CONST_METHOD0(vpSize, const CompSize & () ); MOCK_METHOD1(forEachWindow, void (CompWindow::ForEach)); MOCK_METHOD0(windows, CompWindowList & ()); MOCK_METHOD3(moveViewport, void (int tx, int ty, bool sync)); MOCK_CONST_METHOD0(vp,const CompPoint & ()); MOCK_METHOD0(updateWorkarea, void ()); MOCK_METHOD1(addAction, bool (CompAction *action)); MOCK_METHOD1(findWindow, CompWindow * (Window id)); MOCK_METHOD2(findTopLevelWindow, CompWindow * ( Window id, bool override_redirect)); MOCK_METHOD6(toolkitAction, void ( Atom toolkitAction, Time eventTime, Window window, long data0, long data1, long data2)); MOCK_CONST_METHOD0(showingDesktopMask, unsigned int ()); MOCK_CONST_METHOD0(grabsEmpty, bool ()); MOCK_METHOD1(sizePluginClasses, void (unsigned int size)); MOCK_METHOD1(_initPluginForScreen, bool (CompPlugin *)); MOCK_METHOD1(_finiPluginForScreen, void (CompPlugin *)); MOCK_METHOD3(_setOptionForPlugin, bool (const char *, const char *, CompOption::Value &)); MOCK_METHOD1(_handleEvent, void (XEvent *event)); MOCK_METHOD3(_logMessage, void (const char *, CompLogLevel, const char*)); MOCK_METHOD0(_enterShowDesktopMode, void ()); MOCK_METHOD1(_leaveShowDesktopMode, void (CompWindow *)); MOCK_METHOD1(_addSupportedAtoms, void (std::vector& atoms)); MOCK_METHOD1(_fileWatchAdded, void (CompFileWatch *)); MOCK_METHOD1(_fileWatchRemoved, void (CompFileWatch *)); MOCK_METHOD2(_sessionEvent, void (CompSession::Event, CompOption::Vector &)); MOCK_METHOD3(_handleCompizEvent, void (const char *, const char *, CompOption::Vector &)); MOCK_METHOD4(_fileToImage, bool (CompString &, CompSize &, int &, void *&)); MOCK_METHOD5(_imageToFile, bool (CompString &, CompString &, CompSize &, int, void *)); MOCK_METHOD1(_matchInitExp, CompMatch::Expression * (const CompString&)); MOCK_METHOD0(_matchExpHandlerChanged, void ()); MOCK_METHOD1(_matchPropertyChanged, void (CompWindow *)); MOCK_METHOD0(_outputChangeNotify, void ()); MOCK_METHOD0(outputDevs, CompOutput::vector & ()); MOCK_METHOD2(setWindowState, void (unsigned int state, Window id)); MOCK_METHOD0(XShape, bool ()); MOCK_METHOD0(screenInfo, std::vector & ()); MOCK_METHOD0(serverWindows, CompWindowList & ()); MOCK_METHOD3(setWindowProp, void (Window id, Atom property, unsigned int value)); MOCK_METHOD0(activeWindow, Window ()); MOCK_METHOD0(currentDesktop, unsigned int ()); MOCK_METHOD0(currentHistory, CompActiveWindowHistory *()); MOCK_METHOD0(focusDefaultWindow, void ()); MOCK_METHOD0(getCurrentTime, Time ()); MOCK_METHOD3(getWindowProp, unsigned int (Window id, Atom property, unsigned int defaultValue)); MOCK_METHOD2(insertServerWindow, void (CompWindow *w, Window aboveId)); MOCK_METHOD2(insertWindow, void (CompWindow *w, Window aboveId)); MOCK_METHOD0(nDesktop, unsigned int ()); MOCK_METHOD1(outputDeviceForGeometry, int (const CompWindow::Geometry& gm)); MOCK_METHOD0(screenNum, int ()); MOCK_METHOD1(unhookServerWindow, void (CompWindow *w)); MOCK_METHOD1(unhookWindow, void (CompWindow *w)); MOCK_METHOD2(viewportForGeometry, void (const CompWindow::Geometry &gm, CompPoint &viewport)); MOCK_METHOD1(addToDestroyedWindows, void (CompWindow * cw)); MOCK_CONST_METHOD0(workArea, CompRect const& ()); MOCK_METHOD1(removeAction, void (CompAction *action)); MOCK_METHOD0(getOptions, CompOption::Vector & ()); MOCK_METHOD2(setOption, bool (const CompString &name, CompOption::Value &value)); MOCK_METHOD2(storeValue, void (CompString key, CompPrivate value)); MOCK_METHOD1(hasValue, bool (CompString key)); MOCK_METHOD1(getValue, CompPrivate (CompString key)); MOCK_METHOD1(eraseValue, void (CompString key)); MOCK_METHOD3(addWatchFd, CompWatchFdHandle (int fd, short int events, FdWatchCallBack callBack)); MOCK_METHOD1(removeWatchFd, void (CompWatchFdHandle handle)); MOCK_METHOD0(eventLoop, void ()); MOCK_METHOD3(addFileWatch, CompFileWatchHandle (const char *path, int mask, FileWatchCallBack callBack)); MOCK_METHOD1(removeFileWatch, void (CompFileWatchHandle handle)); MOCK_CONST_METHOD0(getFileWatches, const CompFileWatchList& ()); MOCK_METHOD0(updateSupportedWmHints, void ()); MOCK_METHOD0(destroyedWindows, CompWindowList & ()); MOCK_CONST_METHOD0(region, const CompRegion & ()); MOCK_METHOD0(hasOverlappingOutputs, bool ()); MOCK_METHOD0(fullscreenOutput, CompOutput & ()); MOCK_METHOD3(setWindowProp32, void (Window id, Atom property, unsigned short value)); MOCK_METHOD3(getWindowProp32, unsigned short (Window id, Atom property, unsigned short defaultValue)); MOCK_METHOD4(readImageFromFile, bool (CompString &name, CompString &pname, CompSize &size, void *&data)); MOCK_METHOD0(desktopWindowCount, int ()); MOCK_METHOD0(attrib, XWindowAttributes ()); MOCK_CONST_METHOD0(defaultIcon, CompIcon *()); virtual bool otherGrabExist (const char *, ...) { return false; } // TODO How to mock? MOCK_METHOD2(pushGrab, GrabHandle (Cursor cursor, const char *name)); MOCK_METHOD2(removeGrab, void (GrabHandle handle, CompPoint *restorePointer)); MOCK_METHOD4(writeImageToFile, bool (CompString &path, const char *format, CompSize &size, void *data)); MOCK_METHOD1(runCommand, void (CompString command)); MOCK_METHOD0(shouldSerializePlugins, bool ()); MOCK_CONST_METHOD1(getWorkareaForOutput, const CompRect & (unsigned int outputNum)); MOCK_CONST_METHOD0(currentOutputDev, CompOutput & ()); MOCK_METHOD1(grabExist, bool (const char *)); MOCK_METHOD0(invisibleCursor, Cursor ()); MOCK_CONST_METHOD0(activeNum, unsigned int ()); MOCK_METHOD1(sendWindowActivationRequest, void (Window id)); MOCK_METHOD1(clientList, const CompWindowVector & (bool stackingOrder)); MOCK_METHOD1(outputDeviceForPoint, int (const CompPoint &point)); MOCK_METHOD2(outputDeviceForPoint, int (int x, int y)); MOCK_METHOD0(xkbEvent, int ()); MOCK_METHOD2(warpPointer, void (int dx, int dy)); MOCK_METHOD2(updateGrab, void (GrabHandle handle, Cursor cursor)); MOCK_METHOD0(shapeEvent, int ()); MOCK_METHOD0(syncEvent, int ()); MOCK_METHOD0(autoRaiseWindow, Window ()); MOCK_METHOD0(processEvents, void ()); MOCK_METHOD1(alwaysHandleEvent, void (XEvent *event)); MOCK_METHOD0(displayString, const char * ()); MOCK_METHOD0(getCurrentOutputExtents, CompRect ()); MOCK_METHOD0(normalCursor, Cursor ()); MOCK_METHOD0(grabbed, bool ()); MOCK_METHOD0(snDisplay, SnDisplay * ()); MOCK_CONST_METHOD0(createFailed, bool ()); MOCK_METHOD0(incrementDesktopWindowCount, void ()); MOCK_METHOD0(decrementDesktopWindowCount, void ()); MOCK_METHOD0(nextMapNum, unsigned int ()); MOCK_CONST_METHOD0(updatePassiveKeyGrabs, void ()); MOCK_METHOD1(updatePassiveButtonGrabs, void (Window serverFrame)); MOCK_CONST_METHOD0(lastPing, unsigned int ()); MOCK_CONST_METHOD0(displayInitialised, bool ()); MOCK_METHOD1(applyStartupProperties, void (CompWindow *window)); MOCK_METHOD0(updateClientList, void ()); MOCK_CONST_METHOD0(getTopWindow, CompWindow * ()); MOCK_CONST_METHOD0(getTopServerWindow, CompWindow * ()); MOCK_METHOD0(getCoreOptions, CoreOptions& ()); MOCK_CONST_METHOD0(colormap, Colormap ()); MOCK_METHOD1(setCurrentDesktop, void (unsigned int desktop)); MOCK_CONST_METHOD0(activeWindow, Window ()); MOCK_CONST_METHOD1(grabWindowIsNot, bool (Window w)); MOCK_METHOD0(incrementPendingDestroys, void ()); MOCK_METHOD1(setNextActiveWindow, void (Window id)); MOCK_CONST_METHOD0(getNextActiveWindow, Window ()); MOCK_METHOD0(focusTopMostWindow, CompWindow* ()); MOCK_METHOD1(getWmState, int (Window id)); MOCK_CONST_METHOD2(setWmState, void (int state, Window id)); MOCK_CONST_METHOD3(getMwmHints, void (Window id, unsigned int *func, unsigned int *decor)); MOCK_METHOD1(getProtocols, unsigned int (Window id)); MOCK_METHOD1(getWindowType, unsigned int (Window id)); MOCK_METHOD1(getWindowState, unsigned int (Window id)); MOCK_METHOD0(grabServer, void ()); MOCK_METHOD0(ungrabServer, void ()); MOCK_METHOD0(syncServer, void ()); MOCK_METHOD0(serverGrabInterface, ServerGrabInterface * ()); }; class MockViewportRetreival : public compiz::private_screen::ViewportRetrievalInterface { public: MOCK_CONST_METHOD0(getCurrentViewport, const CompPoint & ()); MOCK_CONST_METHOD0(viewportDimensions, const CompSize & ()); }; class StubActivePluginsOption : public CoreOptions { public: StubActivePluginsOption() : CoreOptions(false) { CompOption::Vector& mOptions = getOptions (); CompOption::Value::Vector list; CompOption::Value value; // active_plugins mOptions[CoreOptions::ActivePlugins].setName ("active_plugins", CompOption::TypeList); list.clear (); value.set(CompString ("core")); list.push_back (value); } bool setActivePlugins(const char*, const char* key, CompOption::Value & value) { return setOption(key, value); } }; } // (anon) namespace namespace { class MockVTable: public CompPlugin::VTable { public: MockVTable (CompString const& name) { initVTable (name); } MOCK_METHOD0(init, bool ()); MOCK_METHOD0(fini, void ()); MOCK_METHOD0(markReadyToInstantiate, void ()); MOCK_METHOD0(markNoFurtherInstantiation, void ()); MOCK_METHOD1(initScreen, bool (CompScreen *s)); MOCK_METHOD1(finiScreen, void (CompScreen *s)); MOCK_METHOD1(initWindow, bool (CompWindow *w)); MOCK_METHOD1(finiWindow, void (CompWindow *w)); MOCK_METHOD0(getOptions, CompOption::Vector & ()); MOCK_METHOD2(setOption, bool (const CompString &name, CompOption::Value &value)); }; class PluginFilesystem { public: virtual bool LoadPlugin(CompPlugin *p, const char *path, const char *name) const = 0; virtual void UnloadPlugin(CompPlugin *p) const = 0; static PluginFilesystem const* instance; protected: PluginFilesystem(); virtual ~PluginFilesystem() {} }; class MockPluginFilesystem : public PluginFilesystem { public: MockVTable mockVtableOne; MockVTable mockVtableTwo; MockVTable mockVtableThree; MockVTable mockVtableFour; MockPluginFilesystem() : mockVtableOne("one"), mockVtableTwo("two"), mockVtableThree("three"), mockVtableFour("four") {} MOCK_CONST_METHOD3(LoadPlugin, bool (CompPlugin *, const char *, const char *)); MOCK_CONST_METHOD1(UnloadPlugin, void (CompPlugin *p)); bool DummyLoader(CompPlugin *p, const char * path, const char * name) { using namespace testing; if (strcmp(name, "one") == 0) { p->vTable = &mockVtableOne; } else if (strcmp(name, "two") == 0) { p->vTable = &mockVtableTwo; } else if (strcmp(name, "three") == 0) { p->vTable = &mockVtableThree; } else { p->vTable = &mockVtableFour; } return true; } }; bool ThunkLoadPluginProc(CompPlugin *p, const char *path_, const char *name) { return PluginFilesystem::instance->LoadPlugin(p, path_, name); } void ThunkUnloadPluginProc(CompPlugin *p) { PluginFilesystem::instance->UnloadPlugin(p); } PluginFilesystem::PluginFilesystem() { ::loaderLoadPlugin = ::ThunkLoadPluginProc; ::loaderUnloadPlugin = ::ThunkUnloadPluginProc; instance = this; } // tell GLib not to use the slice-allocator implementation // and avoid spurious valgrind reporting void glib_nice_for_valgrind() { setenv("G_SLICE", "always-malloc", true); } int const init = (glib_nice_for_valgrind(), 0); PluginFilesystem const* PluginFilesystem::instance = 0; } // (abstract) namespace namespace cps = compiz::private_screen; namespace ce = compiz::events; namespace ca = compiz::actions; TEST(privatescreen_PluginManagerTest, create_and_destroy) { using namespace testing; MockCompScreen comp_screen; cps::PluginManager ps; } TEST(privatescreen_PluginManagerTest, calling_updatePlugins_does_not_error) { using namespace testing; MockCompScreen comp_screen; cps::PluginManager ps; // Stuff that has to be done before calling updatePlugins() CompOption::Value::Vector values; values.push_back ("core"); ps.setPlugins (values); ps.setDirtyPluginList (); // Now we can call updatePlugins() without a segfault. Hoorah! EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Return(false)); ps.updatePlugins(&comp_screen, StubActivePluginsOption().optionGetActivePlugins()); } TEST(privatescreen_PluginManagerTest, calling_updatePlugins_after_setting_initialPlugins) { using namespace testing; MockCompScreen comp_screen; cps::PluginManager ps; // Stuff that has to be done before calling updatePlugins() CompOption::Value::Vector values; values.push_back ("core"); ps.setPlugins (values); ps.setDirtyPluginList (); std::list plugins; plugins.push_back ("one"); plugins.push_back ("two"); plugins.push_back ("three"); initialPlugins = plugins; MockPluginFilesystem mockfs; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("one"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableOne, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("two"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableTwo, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("three"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableThree, init()).WillOnce(Return(false)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); // Once for "three" which doesn't load EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Return(false)); ps.updatePlugins(&comp_screen, StubActivePluginsOption().optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); // TODO Some cleanup that probably ought to be automatic. EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(2); EXPECT_CALL(comp_screen, _finiPluginForScreen(Ne((void*)0))).Times(2); EXPECT_CALL(mockfs.mockVtableOne, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableOne, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableTwo, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableTwo, fini()).Times(1); for (CompPlugin* p; (p = CompPlugin::pop ()) != 0; CompPlugin::unload (p)); } TEST(privatescreen_PluginManagerTest, updating_when_failing_to_load_plugin_in_middle_of_list) { using namespace testing; MockCompScreen comp_screen; cps::PluginManager ps; StubActivePluginsOption sapo; CompOption::Value::Vector values; values.push_back ("core"); ps.setPlugins (values); ps.setDirtyPluginList (); std::list plugins; plugins.push_back ("one"); plugins.push_back ("three"); plugins.push_back ("four"); initialPlugins = plugins; MockPluginFilesystem mockfs; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("one"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableOne, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("three"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableThree, init()).WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("four"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableFour, init()).Times(1).WillRepeatedly(Return(true)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); // Once for "three" which doesn't load EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Return(true)); ps.updatePlugins(&comp_screen, sapo.optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Invoke(&sapo, &StubActivePluginsOption::setActivePlugins)); ps.updatePlugins(&comp_screen, sapo.optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); // TODO Some cleanup that probably ought to be automatic. EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(2); EXPECT_CALL(comp_screen, _finiPluginForScreen(Ne((void*)0))).Times(2); EXPECT_CALL(mockfs.mockVtableOne, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableOne, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableFour, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableFour, fini()).Times(1); for (CompPlugin* p; (p = CompPlugin::pop ()) != 0; CompPlugin::unload (p)); } TEST(privatescreen_PluginManagerTest, calling_updatePlugins_with_fewer_plugins) { using namespace testing; MockCompScreen comp_screen; cps::PluginManager ps; StubActivePluginsOption sapo; // Stuff that has to be done before calling updatePlugins() initialPlugins = std::list (); CompOption::Value::Vector values; values.push_back ("core"); ps.setPlugins (values); ps.setDirtyPluginList (); { CompOption::Value::Vector plugins; plugins.push_back ("one"); plugins.push_back ("two"); plugins.push_back ("three"); CompOption::Value v(plugins); sapo.setActivePlugins("core", "active_plugins", v); } MockPluginFilesystem mockfs; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("one"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableOne, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("two"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableTwo, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("three"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableThree, init()).WillOnce(Return(true)); EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Invoke(&sapo, &StubActivePluginsOption::setActivePlugins)); ps.updatePlugins(&comp_screen, sapo.optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); EXPECT_CALL(comp_screen, _finiPluginForScreen(Ne((void*)0))).Times(2); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); EXPECT_CALL(mockfs.mockVtableTwo, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableTwo, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableThree, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableThree, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableThree, init()).WillOnce(Return(true)); EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Invoke(&sapo, &StubActivePluginsOption::setActivePlugins)); { CompOption::Value::Vector plugins; plugins.push_back ("one"); plugins.push_back ("three"); CompOption::Value v(plugins); sapo.setActivePlugins("core", "active_plugins", v); } ps.updatePlugins(&comp_screen, sapo.optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); // TODO Some cleanup that probably ought to be automatic. EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(2); EXPECT_CALL(comp_screen, _finiPluginForScreen(Ne((void*)0))).Times(2); EXPECT_CALL(mockfs.mockVtableOne, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableOne, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableThree, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableThree, fini()).Times(1); for (CompPlugin* p; (p = CompPlugin::pop ()) != 0; CompPlugin::unload (p)); } // Verify plugin ordering, and verify that plugins not in availablePlugins // don't get dropped. Because availablePlugins is NOT a definitive list // of what the dynamic loader might be able to find in its path. TEST(privatescreen_PluginManagerTest, verify_plugin_ordering) { using namespace testing; cps::PluginManager ps; initialPlugins.clear(); initialPlugins.push_back("alice"); initialPlugins.push_back("bob"); initialPlugins.push_back("charlie"); CompOption::Value::Vector extra; extra.push_back("charlie"); extra.push_back("david"); extra.push_back("alice"); extra.push_back("eric"); CompOption::Value::Vector merged = ps.mergedPluginList(extra); ASSERT_EQ(merged.size(), 6); ASSERT_EQ(merged[0].s(), "core"); ASSERT_EQ(merged[1].s(), "alice"); ASSERT_EQ(merged[2].s(), "bob"); ASSERT_EQ(merged[3].s(), "charlie"); ASSERT_EQ(merged[4].s(), "david"); ASSERT_EQ(merged[5].s(), "eric"); } TEST(privatescreen_PluginManagerTest, calling_updatePlugins_with_additional_plugins) { using namespace testing; MockCompScreen comp_screen; cps::PluginManager ps; StubActivePluginsOption sapo; // Stuff that has to be done before calling updatePlugins() initialPlugins = std::list (); CompOption::Value::Vector values; values.push_back ("core"); ps.setPlugins (values); ps.setDirtyPluginList (); { CompOption::Value::Vector plugins; plugins.push_back ("one"); plugins.push_back ("two"); plugins.push_back ("four"); CompOption::Value v(plugins); sapo.setActivePlugins("core", "active_plugins", v); } MockPluginFilesystem mockfs; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("one"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableOne, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("two"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableTwo, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("four"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableFour, init()).WillOnce(Return(true)); EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Invoke(&sapo, &StubActivePluginsOption::setActivePlugins)); ps.updatePlugins(&comp_screen, sapo.optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); EXPECT_CALL(comp_screen, _finiPluginForScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableFour, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableFour, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("three"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableThree, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs.mockVtableFour, init()).WillOnce(Return(true)); EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Invoke(&sapo, &StubActivePluginsOption::setActivePlugins)); { CompOption::Value::Vector plugins; plugins.push_back ("one"); plugins.push_back ("two"); plugins.push_back ("three"); plugins.push_back ("four"); CompOption::Value v(plugins); sapo.setActivePlugins("core", "active_plugins", v); } ps.updatePlugins(&comp_screen, sapo.optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); // TODO Some cleanup that probably ought to be automatic. EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(4); EXPECT_CALL(comp_screen, _finiPluginForScreen(Ne((void*)0))).Times(4); EXPECT_CALL(mockfs.mockVtableFour, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableFour, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableThree, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableThree, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableTwo, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableTwo, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableOne, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableOne, fini()).Times(1); for (CompPlugin* p; (p = CompPlugin::pop ()) != 0; CompPlugin::unload (p)); } TEST(privatescreen_EventManagerTest, create_and_destroy) { using namespace testing; MockCompScreen comp_screen; cps::EventManager em; } TEST(privatescreen_EventManagerTest, init) { using namespace testing; MockCompScreen comp_screen; CompOption::Value::Vector values; values.push_back ("core"); initialPlugins = std::list (); EXPECT_CALL(comp_screen, addAction(_)).WillRepeatedly(Return(false)); EXPECT_CALL(comp_screen, removeAction(_)).WillRepeatedly(Return()); EXPECT_CALL(comp_screen, _matchInitExp(StrEq("any"))).WillRepeatedly(Return((CompMatch::Expression*)0)); // The PrivateScreen ctor indirectly calls screen->dpy(). // We should kill this dependency EXPECT_CALL(comp_screen, dpy()).WillRepeatedly(Return((Display*)(0))); cps::EventManager em; CoreOptions coreOptions(false); em.init(); } TEST(privatescreen_ViewportGeometryTest, PickCurrent) { CompPoint vp; compiz::window::Geometry g (250, 250, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 0); CompSize dimensions (1, 1); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 0)); } TEST(privatescreen_ViewportGeometryTest, PickRight) { CompPoint vp; compiz::window::Geometry g (1250, 0, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 0); CompSize dimensions (2, 1); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (1, 0)); } TEST(privatescreen_ViewportGeometryTest, PickLeft) { CompPoint vp; compiz::window::Geometry g (-750, 0, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (1, 0); CompSize dimensions (2, 1); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 0)); } TEST(privatescreen_ViewportGeometryTest, PickBottom) { CompPoint vp; compiz::window::Geometry g (0, 1250, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 0); CompSize dimensions (1, 2); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 1)); } TEST(privatescreen_ViewportGeometryTest, PickTop) { CompPoint vp; compiz::window::Geometry g (0, -750, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 1); CompSize dimensions (1, 2); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 0)); } TEST(privatescreen_ViewportGeometryTest, PickTopWhenJustAbove) { CompPoint vp; compiz::window::Geometry g (0, -251, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 1); CompSize dimensions (1, 2); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 0)); } TEST(privatescreen_ViewportGeometryTest, PickRightWhenJustRight) { CompPoint vp; compiz::window::Geometry g (751, 0, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 0); CompSize dimensions (2, 1); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (1, 0)); } TEST(privatescreen_ViewportGeometryTest, PickLeftWhenJustLeft) { CompPoint vp; compiz::window::Geometry g (-251, 0, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (1, 0); CompSize dimensions (2, 1); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 0)); } TEST(privatescreen_ViewportGeometryTest, PickBottomWhenJustBelow) { CompPoint vp; compiz::window::Geometry g (0, 751, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 0); CompSize dimensions (1, 2); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 1)); } namespace { const Window topLeftScreenEdge = 1; const Window topScreenEdge = 2; const Window topRightScreenEdge = 3; const Window rightScreenEdge = 4; const Window bottomRightScreenEdge = 5; const Window bottomScreenEdge = 6; const Window bottomLeftScreenEdge = 7; const Window leftScreenEdge = 8; const CompScreenEdge screenEdges[SCREEN_EDGE_NUM] = { { leftScreenEdge, SCREEN_EDGE_LEFT }, { rightScreenEdge, SCREEN_EDGE_RIGHT }, { topScreenEdge, SCREEN_EDGE_TOP }, { bottomScreenEdge , SCREEN_EDGE_BOTTOM }, { topLeftScreenEdge, SCREEN_EDGE_TOPLEFT }, { topRightScreenEdge, SCREEN_EDGE_TOPRIGHT }, { bottomLeftScreenEdge, SCREEN_EDGE_BOTTOMLEFT }, { bottomRightScreenEdge, SCREEN_EDGE_BOTTOMRIGHT} }; } TEST (privatescreen_ButtonPressEdgeEventManagementTest, IgnoreWhenEventAndRootWindowMismatch) { const Window rootWindow = 1; const Window edgeWindow = topScreenEdge; cps::OrphanData orphanData; cps::GrabList grabList; EXPECT_EQ (ce::processButtonPressOnEdgeWindow (edgeWindow, rootWindow, 0, 0, grabList, screenEdges), -1); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, IgnoreWhenEventMismatchAndNoGrabs) { const Window rootWindow = 1; const Window edgeWindow = topScreenEdge; cps::OrphanData orphanData; cps::GrabList grabList; EXPECT_EQ (ce::processButtonPressOnEdgeWindow (edgeWindow, rootWindow, 0, rootWindow, grabList, screenEdges), -1); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, AllowWhenEventButNotRootWindowMismatchWhileGrabbed) { const Window rootWindow = 1; const Window edgeWindow = topScreenEdge; unsigned int topEdgeMask = 1 << SCREEN_EDGE_TOP; cps::OrphanData orphanData; cps::GrabList grabList; grabList.grabsPush (new cps::Grab (None, "Nil")); EXPECT_EQ (ce::processButtonPressOnEdgeWindow (edgeWindow, rootWindow, 0, rootWindow, grabList, screenEdges), topEdgeMask); grabList.grabsRemove (grabList.grabsBack ()); } TEST (privatescreen_ButtonPressEventManagementTest, SetEventWindowArgument) { const Window activeWindow = 1; ce::EventArguments arguments (2); ce::setEventWindowInButtonPressArguments (arguments, activeWindow); EXPECT_EQ (arguments[1].value ().i (), activeWindow); } namespace { class MockTriggerableAction { public: MOCK_METHOD2 (matchEventState, bool (unsigned int, unsigned int)); MOCK_METHOD3 (initiate, bool (CompAction *, CompAction::State , CompOption::Vector &)); MOCK_METHOD3 (terminate, bool (CompAction *, CompAction::State , CompOption::Vector &)); }; const unsigned int testingButtonNumber = 1; const unsigned int testingButtonState = (1 << 1); ce::ActionModsMatchesEventStateFunc GetMatchEventStateFuncForMock (MockTriggerableAction &triggerableAction) { return boost::bind (&MockTriggerableAction::matchEventState, &triggerableAction, _1, _2); } CompAction::CallBack GetInitiateForMock (MockTriggerableAction &triggerableAction) { return boost::bind (&MockTriggerableAction::initiate, &triggerableAction, _1, _2, _3); } } bool operator== (const CompOption &lhs, const CompOption &rhs) { if (lhs.type () != rhs.type ()) return false; return lhs.value () == rhs.value (); } TEST (privatescreen_ButtonPressEventManagementTest, NoTriggerOnUnboundAction) { CompAction action; CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; MockTriggerableAction triggerableAction; ce::EventArguments arguments; option.set (value); const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); EXPECT_FALSE (ce::activateButtonPressOnWindowBindingOption (option, testingButtonNumber, testingButtonState, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEventManagementTest, NoTriggerOnUnboundInactiveAction) { CompAction action; MockTriggerableAction triggerableAction; int edgeMask = 1 << SCREEN_EDGE_TOP; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); action.setEdgeMask (edgeMask); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; option.set (value); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), false); EXPECT_FALSE (ce::activateButtonPressOnEdgeBindingOption (option, testingButtonNumber, testingButtonState, edgeMask, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEventManagementTest, NoTriggerOnMismatchedButtonNumber) { CompAction action; MockTriggerableAction triggerableAction; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; option.set (value); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, initiate (_, _, _)).Times (0); EXPECT_FALSE (ce::activateButtonPressOnWindowBindingOption (option, 0, testingButtonState, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEventManagementTest, NoTriggerOnMismatchedButtonState) { CompAction action; MockTriggerableAction triggerableAction; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; option.set (value); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, matchEventState (testingButtonState, 0)) .WillOnce (Return (false)); EXPECT_CALL (triggerableAction, initiate (_, _, _)).Times (0); EXPECT_FALSE (ce::activateButtonPressOnWindowBindingOption (option, testingButtonNumber, 0, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEventManagementTest, TriggerWhenStateAndButtonMatch) { CompAction action; MockTriggerableAction triggerableAction; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; option.set (value); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, matchEventState (testingButtonState, testingButtonState)) .WillOnce (Return (true)); EXPECT_CALL (triggerableAction, initiate (&option.value ().action (), CompAction::StateInitButton, arguments)).WillOnce (Return (true)); EXPECT_TRUE (ce::activateButtonPressOnWindowBindingOption (option, testingButtonNumber, testingButtonState, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, NoTriggerOnInvalidEdge) { CompAction action; CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; MockTriggerableAction triggerableAction; ce::EventArguments arguments; int edgeMask = -1; option.set (value); const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); EXPECT_FALSE (ce::activateButtonPressOnEdgeBindingOption (option, testingButtonNumber, testingButtonState, edgeMask, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, NoTriggerOnUnboundAction) { CompAction action; CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; MockTriggerableAction triggerableAction; ce::EventArguments arguments; int edgeMask = 1 << SCREEN_EDGE_TOP; option.set (value); const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); EXPECT_FALSE (ce::activateButtonPressOnEdgeBindingOption (option, testingButtonNumber, testingButtonState, edgeMask, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, NoTriggerOnMismatchedEdgeMask) { CompAction action; MockTriggerableAction triggerableAction; int edgeMask = 1 << SCREEN_EDGE_TOP; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); action.setEdgeMask (edgeMask); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; option.set (value); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, initiate (_, _, _)).Times (0); EXPECT_FALSE (ce::activateButtonPressOnEdgeBindingOption (option, testingButtonNumber, testingButtonState, 0, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, NoTriggerOnMismatchedButtonNumber) { CompAction action; MockTriggerableAction triggerableAction; int edgeMask = 1 << SCREEN_EDGE_TOP; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); action.setEdgeMask (edgeMask); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; option.set (value); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, initiate (_, _, _)).Times (0); EXPECT_FALSE (ce::activateButtonPressOnEdgeBindingOption (option, 0, testingButtonState, edgeMask, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, NoTriggerOnMismatchedButtonState) { CompAction action; MockTriggerableAction triggerableAction; int edgeMask = 1 << SCREEN_EDGE_TOP; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); action.setEdgeMask (edgeMask); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; option.set (value); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, matchEventState (testingButtonState, 0)) .WillOnce (Return (false)); EXPECT_CALL (triggerableAction, initiate (_, _, _)).Times (0); EXPECT_FALSE (ce::activateButtonPressOnEdgeBindingOption (option, testingButtonNumber, 0, edgeMask, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, TriggerWhenStateButtonAndEdgeMaskMatch) { CompAction action; MockTriggerableAction triggerableAction; int edgeMask = 1 << SCREEN_EDGE_TOP; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); action.setEdgeMask (edgeMask); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; option.set (value); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton | CompAction::StateInitEdge); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, matchEventState (testingButtonState, testingButtonState)) .WillOnce (Return (true)); EXPECT_CALL (triggerableAction, initiate (&option.value ().action (), CompAction::StateInitButton | CompAction::StateInitEdge, arguments)).WillOnce (Return (true)); EXPECT_TRUE (ce::activateButtonPressOnEdgeBindingOption (option, testingButtonNumber, testingButtonState, edgeMask, eventManager, matchEventState, arguments)); } TEST (privatescreen_ActionActiveTest, TestMakeActionActive) { CompAction action; ASSERT_EQ (action.active (), false); ca::setActionActiveState (action, true); ASSERT_EQ (action.active (), true); ca::setActionActiveState (action, false); ASSERT_EQ (action.active (), false); } compiz-0.9.11+14.04.20140409/src/rect/0000755000015301777760000000000012321344021017220 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/rect/tests/0000755000015301777760000000000012321344021020362 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/rect/tests/rect/0000755000015301777760000000000012321344021021317 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/rect/tests/rect/src/0000755000015301777760000000000012321344021022106 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/rect/tests/rect/src/test-rect.cpp0000644000015301777760000000541412321343002024526 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include TEST_F(CompRectTest, TestRect) { ASSERT_EQ (mRect, CompRect (0, 0, 0, 0)); mRect = CompRect (100, 100, 400, 300); EXPECT_EQ (mRect.x (), 100); EXPECT_EQ (mRect.y (), 100); EXPECT_EQ (mRect.width (), 400); EXPECT_EQ (mRect.height (), 300); EXPECT_EQ (mRect.x2 (), 500); EXPECT_EQ (mRect.y2 (), 400); EXPECT_EQ (mRect.left (), 100); EXPECT_EQ (mRect.right (), 500); EXPECT_EQ (mRect.top (), 100); EXPECT_EQ (mRect.bottom (), 400); EXPECT_EQ (mRect.centerX (), 300); EXPECT_EQ (mRect.centerY (), 250); EXPECT_EQ (mRect.center (), CompPoint (300, 250)); EXPECT_EQ (mRect.pos (), CompPoint (100, 100)); EXPECT_EQ (mRect.area (), 120000); mRect.setWidth (-1); mRect.setHeight (-1); EXPECT_EQ (mRect.area (), 0); mRect = CompRect (0, 0, 0, 0); EXPECT_TRUE (mRect.isEmpty ()); mRect.setRight (500); mRect.setLeft (100); mRect.setTop (50); mRect.setBottom (450); EXPECT_EQ (mRect, CompRect (100, 50, 400, 400)); mRect.setLeft (600); EXPECT_TRUE (mRect.isEmpty ()); EXPECT_EQ (mRect.right (), 600); mRect.setRight (1000); EXPECT_TRUE (mRect.contains (CompPoint (601, 100))); EXPECT_TRUE (mRect.contains (CompRect (601, 51, 300, 350))); EXPECT_FALSE (mRect.contains (CompRect (601, 41, 900, 500))); EXPECT_TRUE (mRect.intersects (CompRect (601, 41, 300, 400))); /* Intersection */ mRect &= CompRect (700, 100, 400, 100); EXPECT_EQ (mRect, CompRect (700, 100, 300, 100)); } compiz-0.9.11+14.04.20140409/src/rect/tests/test-rect.h0000644000015301777760000000270112321343002022443 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_TIMER_H #define _COMPIZ_TEST_TIMER_H #include #include class CompRectTest : public ::testing::Test { public: virtual ~CompRectTest () = 0; protected: CompRect mRect; }; #endif compiz-0.9.11+14.04.20140409/src/rect/tests/wraparound_point/0000755000015301777760000000000012321344021023755 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/rect/tests/wraparound_point/src/0000755000015301777760000000000012321344021024544 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/rect/tests/wraparound_point/src/test-rect-wraparound-point.cpp0000644000015301777760000000465212321343002032476 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include class CompRectTestWraparound : public CompRectTest { public: CompRectTestWraparound (); ~CompRectTestWraparound (); }; CompRectTestWraparound::CompRectTestWraparound () { /* x1: -500 * x2: 750 * y1: -400 * y2: 800 */ mRect = CompRect (-500, -400, 1250, 1200); } CompRectTestWraparound::~CompRectTestWraparound () { } TEST_F(CompRectTestWraparound, TestWraparound) { CompPoint outsider = CompPoint (2501, 2401); CompPoint inside = CompPoint (); inside = compiz::rect::wraparoundPoint (mRect, outsider); RecordProperty ("OutsidePointX", outsider.x ()); RecordProperty ("OutsidePointY", outsider.y ()); RecordProperty ("InsidePointX", inside.x ()); RecordProperty ("InsidePointY", inside.y ()); EXPECT_EQ (inside, CompPoint (-499, -399)); outsider = CompPoint (-1751, -1601); inside = compiz::rect::wraparoundPoint (mRect, outsider); RecordProperty ("OutsidePointX", outsider.x ()); RecordProperty ("OutsidePointY", outsider.y ()); RecordProperty ("InsidePointX", inside.x ()); RecordProperty ("InsidePoinY", inside.y ()); EXPECT_EQ (inside, CompPoint (749, 799)); } compiz-0.9.11+14.04.20140409/src/rect/tests/CMakeLists.txt0000644000015301777760000000173512321343002023126 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_rect_test ${CMAKE_CURRENT_SOURCE_DIR}/test-rect.cpp) add_executable (compiz_test_rect ${CMAKE_CURRENT_SOURCE_DIR}/rect/src/test-rect.cpp) add_executable (compiz_test_rect_wraparound_point ${CMAKE_CURRENT_SOURCE_DIR}/wraparound_point/src/test-rect-wraparound-point.cpp) target_link_libraries (compiz_test_rect compiz_rect_test compiz_rect ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) target_link_libraries (compiz_test_rect_wraparound_point compiz_rect_test compiz_rect ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_rect COVERAGE compiz_rect) compiz_discover_tests (compiz_test_rect_wraparound_point COVERAGE compiz_rect) compiz-0.9.11+14.04.20140409/src/rect/tests/test-rect.cpp0000644000015301777760000000241312321343002022776 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-rect.h" CompRectTest::~CompRectTest () { } compiz-0.9.11+14.04.20140409/src/rect/CMakeLists.txt0000644000015301777760000000166512321343002021766 0ustar pbusernogroup00000000000000pkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/rect.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/rect.cpp ) ADD_LIBRARY( compiz_rect STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_rect PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_rect compiz_point ${GLIBMM_LIBRARIES} ) compiz-0.9.11+14.04.20140409/src/rect/src/0000755000015301777760000000000012321344021020007 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/rect/src/rect.cpp0000644000015301777760000001526612321343002021460 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include #include #include #include #include template class std::vector; CompRect::CompRect () { mRegion.rects = &mRegion.extents; mRegion.numRects = 1; mRegion.extents.x1 = 0; mRegion.extents.x2 = 0; mRegion.extents.y1 = 0; mRegion.extents.y2 = 0; } CompRect::CompRect (int x, int y, int width, int height) { mRegion.rects = &mRegion.extents; mRegion.numRects = 1; mRegion.extents.x1 = x; mRegion.extents.y1 = y; mRegion.extents.x2 = x + width; mRegion.extents.y2 = y + height; } CompRect::CompRect (const CompRect& r) { mRegion = r.mRegion; mRegion.rects = &mRegion.extents; } CompRect::CompRect (const XRectangle xr) { mRegion.rects = &mRegion.extents; mRegion.numRects = 1; mRegion.extents.x1 = xr.x; mRegion.extents.y1 = xr.y; mRegion.extents.x2 = xr.x + xr.width; mRegion.extents.y2 = xr.y + xr.height; } CompPoint compiz::rect::wraparoundPoint (const CompRect &bounds, const CompPoint &p) { CompPoint r (p); if (p.x () > bounds.x2 ()) r.setX ((p.x () % bounds.width ()) + bounds.x1 ()); else if (p.x () < bounds.x1 ()) r.setX (bounds.width () - (abs (p.x ()) % bounds.width ())); if (p.y () > bounds.y2 ()) r.setY ((p.y () % bounds.height ()) + bounds.y1 ()); else if (p.y () < bounds.y1 ()) r.setY (bounds.height () - (abs (p.y ()) % bounds.height ())); return r; } Region CompRect::region () const { return const_cast (&mRegion); } void CompRect::setGeometry (int x, int y, int width, int height) { mRegion.extents.x1 = x; mRegion.extents.y1 = y; mRegion.extents.x2 = x + width; mRegion.extents.y2 = y + height; } void CompRect::setX (int x) { int width = mRegion.extents.x2 - mRegion.extents.x1; mRegion.extents.x1 = x; mRegion.extents.x2 = x + width; } void CompRect::setY (int y) { int height = mRegion.extents.y2 - mRegion.extents.y1; mRegion.extents.y1 = y; mRegion.extents.y2 = y + height; } void CompRect::setPos (const CompPoint& pos) { setX (pos.x ()); setY (pos.y ()); } void CompRect::setWidth (int width) { mRegion.extents.x2 = mRegion.extents.x1 + width; } void CompRect::setHeight (int height) { mRegion.extents.y2 = mRegion.extents.y1 + height; } void CompRect::setSize (const CompSize& size) { mRegion.extents.x2 = mRegion.extents.x1 + size.width (); mRegion.extents.y2 = mRegion.extents.y1 + size.height (); } void CompRect::setLeft (int x1) { mRegion.extents.x1 = x1; if (mRegion.extents.x2 < x1) mRegion.extents.x2 = x1; } void CompRect::setTop (int y1) { mRegion.extents.y1 = y1; if (mRegion.extents.y2 < y1) mRegion.extents.y2 = y1; } void CompRect::setRight (int x2) { mRegion.extents.x2 = x2; if (mRegion.extents.x1 > x2) mRegion.extents.x1 = x2; } void CompRect::setBottom (int y2) { mRegion.extents.y2 = y2; if (mRegion.extents.y1 > y2) mRegion.extents.y1 = y2; } bool CompRect::contains (const CompPoint& point) const { if (point.x () < x1 ()) return false; if (point.x () > x2 ()) return false; if (point.y () < y1 ()) return false; if (point.y () > y2 ()) return false; return true; } bool CompRect::contains (const CompRect& rect) const { if (rect.x1 () < x1 ()) return false; if (rect.x2 () > x2 ()) return false; if (rect.y1 () < y1 ()) return false; if (rect.y2 () > y2 ()) return false; return true; } bool CompRect::intersects (const CompRect& rect) const { int l, r, t, b; /* extents of overlapping rectangle */ l = MAX (left (), rect.left ()); r = MIN (right (), rect.right ()); t = MAX (top (), rect.top ()); b = MIN (bottom (), rect.bottom ()); return (l < r) && (t < b); } bool CompRect::isEmpty () const { return mRegion.extents.x1 == mRegion.extents.x2 || mRegion.extents.y1 == mRegion.extents.y2; } int CompRect::area () const { if (mRegion.extents.x2 < mRegion.extents.x1) return 0; if (mRegion.extents.y2 < mRegion.extents.y1) return 0; return (mRegion.extents.x2 - mRegion.extents.x1) * (mRegion.extents.y2 - mRegion.extents.y1); } bool CompRect::operator== (const CompRect &rect) const { if (mRegion.extents.x1 != rect.mRegion.extents.x1) return false; if (mRegion.extents.y1 != rect.mRegion.extents.y1) return false; if (mRegion.extents.x2 != rect.mRegion.extents.x2) return false; if (mRegion.extents.y2 != rect.mRegion.extents.y2) return false; return true; } bool CompRect::operator!= (const CompRect &rect) const { return !(*this == rect); } CompRect CompRect::operator& (const CompRect &rect) const { CompRect result (*this); result &= rect; return result; } CompRect& CompRect::operator&= (const CompRect &rect) { int l, r, t, b; /* extents of overlapping rectangle */ l = MAX (left (), rect.left ()); r = MIN (right (), rect.right ()); t = MAX (top (), rect.top ()); b = MIN (bottom (), rect.bottom ()); mRegion.extents.x1 = l; mRegion.extents.x2 = r; mRegion.extents.y1 = t; mRegion.extents.y2 = b; /* FIXME: This can result in negative widths * and heights, which makes no sense */ return *this; } CompRect & CompRect::operator= (const CompRect &rect) { mRegion.extents.x1 = rect.mRegion.extents.x1; mRegion.extents.y1 = rect.mRegion.extents.y1; mRegion.extents.x2 = rect.mRegion.extents.x2; mRegion.extents.y2 = rect.mRegion.extents.y2; return *this; } compiz-0.9.11+14.04.20140409/src/rect/include/0000755000015301777760000000000012321344021020643 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/rect/include/core/0000755000015301777760000000000012321344021021573 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/rect/include/core/rect.h0000644000015301777760000001156212321343002022704 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _COMPRECT_H #define _COMPRECT_H #include #include #include #include #include #include #include #include "core/point.h" /** * A 2D rectangle, which is likely in screen space. It's data is * isolated and can only be mutated with set() methods. */ class CompRect { public: CompRect (); CompRect (int x, int y, int width, int height); CompRect (const CompRect&); CompRect (const XRectangle); int x () const; int y () const; CompPoint pos () const; int width () const; int height () const; int x1 () const; int y1 () const; int x2 () const; int y2 () const; int left () const; int right () const; int top () const; int bottom () const; int centerX () const; int centerY () const; CompPoint center () const; int area () const; /** * Returns an X region handle for the CompRect */ Region region () const; void setGeometry (int x, int y, int width, int height); void setX (int); void setY (int); void setWidth (int); void setHeight (int); void setPos (const CompPoint&); void setSize (const CompSize&); /** * Sets the left edge position * * Setting an edge past it's opposite edge will result in both edges * being set to the new value */ void setLeft (int); /** * Sets the top edge position * * Setting an edge past it's opposite edge will result in both edges * being set to the new value */ void setTop (int); /** * Sets the right edge position * * Setting an edge past it's opposite edge will result in both edges * being set to the new value */ void setRight (int); /** * Sets the bottom edge position * * Setting an edge past it's opposite edge will result in both edges * being set to the new value */ void setBottom (int); bool contains (const CompPoint &) const; bool contains (const CompRect &) const; bool intersects (const CompRect &) const; bool isEmpty () const; bool operator== (const CompRect &) const; bool operator!= (const CompRect &) const; /* FIXME: Implement operator|= */ CompRect operator& (const CompRect &) const; CompRect& operator&= (const CompRect &); CompRect& operator= (const CompRect &); typedef std::vector vector; private: REGION mRegion; }; COMPIZ_EXTERN_STD(vector) namespace compiz { namespace rect { CompPoint wraparoundPoint (const CompRect &bounds, const CompPoint &p); } } inline int CompRect::x () const { return mRegion.extents.x1; } inline int CompRect::y () const { return mRegion.extents.y1; } inline CompPoint CompRect::pos () const { return CompPoint (x (), y ()); } inline int CompRect::width () const { return mRegion.extents.x2 - mRegion.extents.x1; } inline int CompRect::height () const { return mRegion.extents.y2 - mRegion.extents.y1; } inline int CompRect::x1 () const { return mRegion.extents.x1; } inline int CompRect::y1 () const { return mRegion.extents.y1; } inline int CompRect::x2 () const { return mRegion.extents.x2; } inline int CompRect::y2 () const { return mRegion.extents.y2; } inline int CompRect::left () const { return mRegion.extents.x1; } inline int CompRect::right () const { return mRegion.extents.x2; } inline int CompRect::top () const { return mRegion.extents.y1; } inline int CompRect::bottom () const { return mRegion.extents.y2; } inline int CompRect::centerX () const { return x () + width () / 2; } inline int CompRect::centerY () const { return y () + height () / 2; } inline CompPoint CompRect::center () const { return CompPoint (centerX (), centerY ()); } #endif compiz-0.9.11+14.04.20140409/src/privatesignalsource.h0000644000015301777760000000330312321343002022522 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical, Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical, Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical, Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL Canonical, Ltd. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #include #include class CompSignalSource { public: ~CompSignalSource (); typedef boost::function callbackFunc; static CompSignalSource * create (int signum, const callbackFunc &); protected: explicit CompSignalSource (int signum, const callbackFunc &); private: static gboolean callback (gpointer user_data); static void destroyed (gpointer user_data); callbackFunc mFunc; int mSignal; gint mSource; }; compiz-0.9.11+14.04.20140409/src/tests/0000755000015301777760000000000012321344021017425 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/tests/test_configurerequestbuffer.cpp0000644000015301777760000004275212321343002025764 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include #include #include #include #include "configurerequestbuffer-impl.h" #include "asyncserverwindow.h" namespace crb = compiz::window::configure_buffers; namespace cw = compiz::window; using testing::_; using testing::NiceMock; using testing::Return; using testing::Invoke; using testing::WithArgs; using testing::SetArgReferee; using testing::DoAll; using testing::InSequence; using testing::ReturnNull; using testing::IsNull; class MockAsyncServerWindow : public cw::AsyncServerWindow { public: MOCK_METHOD2 (requestConfigureOnClient, int (const XWindowChanges &, unsigned int)); MOCK_METHOD2 (requestConfigureOnFrame, int (const XWindowChanges &, unsigned int)); MOCK_METHOD2 (requestConfigureOnWrapper, int (const XWindowChanges &, unsigned int)); MOCK_METHOD0 (sendSyntheticConfigureNotify, void ()); MOCK_CONST_METHOD0 (hasCustomShape, bool ()); }; class MockSyncServerWindow : public cw::SyncServerWindow { public: MOCK_METHOD1 (queryAttributes, bool (XWindowAttributes &)); MOCK_METHOD1 (queryFrameAttributes, bool (XWindowAttributes &)); MOCK_METHOD3 (queryShapeRectangles, XRectangle * (int, int *, int *)); }; namespace { int REQUEST_X = 1; int REQUEST_Y = 2; int REQUEST_WIDTH = 3; int REQUEST_HEIGHT = 4; int REQUEST_BORDER = 5; Window REQUEST_ABOVE = 6; unsigned int REQUEST_MODE = 7; crb::BufferLock::Ptr CreateNormalLock (crb::CountedFreeze *cf) { return boost::make_shared (cf); } } MATCHER_P2 (MaskXWC, xwc, vm, "Matches XWindowChanges") { if (vm & CWX) if (xwc.x != arg.x) return false; if (vm & CWY) if (xwc.y != arg.y) return false; if (vm & CWWidth) if (xwc.width != arg.width) return false; if (vm & CWHeight) if (xwc.height != arg.height) return false; if (vm & CWBorderWidth) if (xwc.border_width != arg.border_width) return false; if (vm & CWStackMode) if (xwc.stack_mode != arg.stack_mode) return false; if (vm & CWSibling) if (xwc.sibling != arg.sibling) return false; return true; } class ConfigureRequestBuffer : public testing::Test { public: ConfigureRequestBuffer () { /* Initialize xwc, we control it * through the value masks */ xwc.x = REQUEST_X; xwc.y = REQUEST_Y; xwc.width = REQUEST_WIDTH; xwc.height = REQUEST_HEIGHT; xwc.border_width = REQUEST_BORDER; xwc.sibling = REQUEST_ABOVE; xwc.stack_mode = REQUEST_MODE; } protected: XWindowChanges xwc; MockAsyncServerWindow asyncServerWindow; MockSyncServerWindow syncServerWindow; }; class ConfigureRequestBufferDispatch : public ConfigureRequestBuffer { protected: ConfigureRequestBufferDispatch () : ConfigureRequestBuffer (), factory (boost::bind (CreateNormalLock, _1)), buffer ( crb::ConfigureRequestBuffer::Create (&asyncServerWindow, &syncServerWindow, factory)) { } crb::ConfigureRequestBuffer::LockFactory factory; crb::Buffer::Ptr buffer; }; TEST_F (ConfigureRequestBufferDispatch, PushDirectSyntheticConfigureNotify) { EXPECT_CALL (asyncServerWindow, sendSyntheticConfigureNotify ()); buffer->pushSyntheticConfigureNotify (); } TEST_F (ConfigureRequestBufferDispatch, PushDirectClientUpdate) { unsigned int valueMask = CWX | CWY | CWBorderWidth | CWSibling | CWStackMode; EXPECT_CALL (asyncServerWindow, requestConfigureOnClient (MaskXWC (xwc, valueMask), valueMask)); buffer->pushClientRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, PushDirectWrapperUpdate) { unsigned int valueMask = CWX | CWY | CWBorderWidth | CWSibling | CWStackMode; EXPECT_CALL (asyncServerWindow, requestConfigureOnWrapper (MaskXWC (xwc, valueMask), valueMask)); buffer->pushWrapperRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, PushDirectFrameUpdate) { unsigned int valueMask = CWX | CWY | CWBorderWidth | CWSibling | CWStackMode; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); buffer->pushFrameRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, PushUpdateLocked) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = 0; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, PushCombinedUpdateLocked) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWX; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); valueMask |= CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); lock->release (); } /* * This test is disabled until we can expose the QueryShapeRectangles API * to plugins */ TEST_F (ConfigureRequestBufferDispatch, DISABLED_PushUpdateLockedReleaseInOrder) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); EXPECT_CALL (asyncServerWindow, requestConfigureOnWrapper (_, _)).Times (0); EXPECT_CALL (asyncServerWindow, requestConfigureOnClient (_, _)).Times (0); buffer->pushClientRequest (xwc, valueMask); buffer->pushWrapperRequest (xwc, 0); buffer->pushFrameRequest (xwc, 0); InSequence s; /* Always frame -> wrapper -> client */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); EXPECT_CALL (asyncServerWindow, requestConfigureOnWrapper (MaskXWC (xwc, valueMask), valueMask)); EXPECT_CALL (asyncServerWindow, requestConfigureOnClient (MaskXWC (xwc, valueMask), valueMask)); lock->release (); } TEST_F (ConfigureRequestBufferDispatch, UnlockBuffer) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); lock->release (); } TEST_F (ConfigureRequestBufferDispatch, ImplicitUnlockBuffer) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); } TEST_F (ConfigureRequestBufferDispatch, ForceImmediateConfigureOnRestack) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWStackMode | CWSibling; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); buffer->pushFrameRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, ForceImmediateConfigureOnWindowSizeChange) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWWidth | CWHeight | CWBorderWidth; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); buffer->pushFrameRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, ForceImmediateConfigureOnClientReposition) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnClient (MaskXWC (xwc, valueMask), valueMask)); buffer->pushClientRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, ForceImmediateConfigureOnWrapperReposition) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnWrapper (MaskXWC (xwc, valueMask), valueMask)); buffer->pushWrapperRequest (xwc, valueMask); } namespace { class MockLock : public crb::BufferLock { public: /* We're currently importing the locks statefulness and coupling * the caller with that */ MockLock () : armed (false) { ON_CALL (*this, lock ()).WillByDefault ( Invoke (this, &MockLock::FreezeIfUnarmed)); ON_CALL (*this, release ()).WillByDefault ( Invoke (this, &MockLock::ReleaseIfArmed)); } void OperateOver (crb::CountedFreeze *cf) { countedFreeze = cf; } void FreezeIfUnarmed () { if (!armed) { countedFreeze->freeze (); armed = true; } } void ReleaseIfArmed () { if (armed) { countedFreeze->release (); armed = false; } } typedef boost::shared_ptr Ptr; MOCK_METHOD0 (lock, void ()); MOCK_METHOD0 (release, void ()); private: crb::CountedFreeze *countedFreeze; bool armed; }; class MockLockFactory { public: crb::BufferLock::Ptr CreateMockLock (crb::CountedFreeze *cf) { MockLock::Ptr mockLock (locks.front ()); mockLock->OperateOver (cf); locks.pop_front (); return mockLock; } void QueueLockForCreation (const MockLock::Ptr &lock) { locks.push_back (lock); } private: std::deque locks; }; } class ConfigureRequestBufferLockBehaviour : public ConfigureRequestBuffer { public: ConfigureRequestBufferLockBehaviour () : ConfigureRequestBuffer (), lock (boost::make_shared ()), factory ( boost::bind (&MockLockFactory::CreateMockLock, &mockLockFactory, _1)), buffer ( crb::ConfigureRequestBuffer::Create ( &asyncServerWindow, &syncServerWindow, factory)) { mockLockFactory.QueueLockForCreation (lock); } protected: typedef NiceMock NiceServerWindow; typedef crb::ConfigureRequestBuffer::LockFactory LockFactory; MockLock::Ptr lock; MockLockFactory mockLockFactory; LockFactory factory; crb::Buffer::Ptr buffer; }; TEST_F (ConfigureRequestBufferLockBehaviour, RearmBufferLockOnRelease) { EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); /* We are releasing this lock */ EXPECT_CALL (*lock, release ()); /* Now the buffer will dispatch is configure request */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)); /* Rearm locks on release */ EXPECT_CALL (*lock, lock ()); /* Directly release the queue */ releasable->release (); } TEST_F (ConfigureRequestBufferLockBehaviour, NoRearmBufferLockNoReleaseRequired) { /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); /* No call to requestConfigureOnFrame if there's nothing to be configured */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); /* We are releasing this lock */ EXPECT_CALL (*lock, release ()); /* No rearm - we haven't released the whole buffer */ EXPECT_CALL (*lock, lock ()).Times (0); /* Directly release the queue */ releasable->release (); } TEST_F (ConfigureRequestBufferLockBehaviour, RearmWhenPushReady) { /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); /* We are releasing this lock */ EXPECT_CALL (*lock, release ()); /* No call to requestConfigureOnFrame if there's nothing to be configured */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); /* No rearm - we haven't released it */ EXPECT_CALL (*lock, lock ()).Times (0); /* Directly release the queue */ releasable->release (); /* Since we're now going to push something to a queue * that's effectively not locked, the locks should now * be released */ unsigned int valueMask = CWX | CWY; /* Now rearm it */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)); EXPECT_CALL (*lock, lock ()); buffer->pushFrameRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferLockBehaviour, NoRearmBufferLockOnNoRelease) { MockLock::Ptr second (boost::make_shared ()); mockLockFactory.QueueLockForCreation (second); /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); EXPECT_CALL (*second, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); crb::Releasable::Ptr otherReleasable (buffer->obtainLock ()); /* We are releasing this lock */ EXPECT_CALL (*lock, release ()); /* No call to requestConfigureOnFrame if there's nothing to be configured */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); /* No rearm - we haven't released it */ EXPECT_CALL (*lock, lock ()).Times (0); releasable->release (); } TEST_F (ConfigureRequestBufferLockBehaviour, QueryAttributesDispatchAndRearm) { /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; /* Queue locked */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); /* Queue forceably unlocked, locks rearmed */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)); EXPECT_CALL (*lock, lock ()); /* Expect a call to XGetWindowAttributes */ EXPECT_CALL (syncServerWindow, queryShapeRectangles (_, _, _)) .WillOnce ( ReturnNull ()); int a, b; EXPECT_THAT (buffer->queryShapeRectangles (0, &a, &b), IsNull ()); } TEST_F (ConfigureRequestBufferLockBehaviour, QueryFrameAttributesDispatchAndRearm) { /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; /* Queue locked */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); /* Queue forceably unlocked, locks rearmed */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)); EXPECT_CALL (*lock, lock ()); /* Expect a call to XGetWindowAttributes */ XWindowAttributes xwa; EXPECT_CALL (syncServerWindow, queryFrameAttributes (_)) .WillOnce ( DoAll ( SetArgReferee <0> (xwa), Return (true))); buffer->queryFrameAttributes (xwa); } TEST_F (ConfigureRequestBufferLockBehaviour, QueryShapeRectanglesDispatchAndRearm) { /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; /* Queue locked */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); /* Queue forceably unlocked, locks rearmed */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)); EXPECT_CALL (*lock, lock ()); /* Expect a call to XGetWindowAttributes */ XWindowAttributes xwa; EXPECT_CALL (syncServerWindow, queryFrameAttributes (_)) .WillOnce ( DoAll ( SetArgReferee <0> (xwa), Return (true))); buffer->queryFrameAttributes (xwa); } TEST_F (ConfigureRequestBufferLockBehaviour, ForceReleaseDispatchAndRearm) { /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; /* Queue locked */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); /* Queue forceably unlocked, locks rearmed */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)); EXPECT_CALL (*lock, lock ()); /* Force release */ buffer->forceRelease (); } compiz-0.9.11+14.04.20140409/src/tests/test_outputdevices.cpp0000644000015301777760000001230212321343002024067 0ustar pbusernogroup00000000000000/* * Compiz Core: OutputDevices class: Unit tests * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "gtest/gtest.h" #include "outputdevices.h" using namespace compiz::core; TEST (OutputDevices, TrivialSingleMonitor) { OutputDevices d; CompSize s (1024, 768); CompWindow::Geometry w; d.setGeometryOnDevice (0, 0, 0, 1024, 768); w.set (50, 50, 100, 100, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-50, 50, 10, 10, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-50, 50, 100, 10, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-10, -10, 1034, 778, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (99999, 100, 123, 456, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); } TEST (OutputDevices, SideBySide) { OutputDevices d; CompSize s (2048, 768); CompWindow::Geometry w; d.setGeometryOnDevice (0, 0, 0, 1024, 768); d.setGeometryOnDevice (1, 1024, 0, 1024, 768); w.set (50, 50, 100, 100, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-50, 50, 10, 10, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-50, 50, 100, 10, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-10, -10, 1034, 778, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (10, 0, 3000, 768, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); // Way off-screen to the right. Both outputs match equally with an area // of zero. We don't care about distance so just choose the first. w.set (99999, 100, 123, 456, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (1500, 100, 2000, 456, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); w.set (0, 0, 2048, 768, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); } TEST (OutputDevices, LaptopBelowMonitor) { OutputDevices d; CompSize s (1920, 2100); CompWindow::Geometry w; d.setGeometryOnDevice (0, 0, 0, 1920, 1200); d.setGeometryOnDevice (1, 160, 1200, 1600, 900); w.set (50, 50, 100, 100, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-50, 50, 100, 10, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-10, -10, 1034, 778, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (200, 1500, 20, 20, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); w.set (100, 1800, 700, 700, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); } TEST (OutputDevices, LaptopNextToMonitor) { OutputDevices d; CompSize s (3200, 1200); CompWindow::Geometry w; d.setGeometryOnDevice (0, 0, 400, 1280, 800); d.setGeometryOnDevice (1, 1280, 0, 1920, 1200); w.set (-10, -10, 1034, 778, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (200, 300, 20, 20, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); w.set (-10, 10, 1500, 500, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (900, 50, 3000, 20, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); w.set (10, 500, 2542, 100, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); } TEST (OutputDevices, FourSquare) { OutputDevices d; CompSize s (2000, 2000); CompWindow::Geometry w; d.setGeometryOnDevice (0, 0, 0, 1000, 1000); d.setGeometryOnDevice (1, 1000, 0, 1000, 1000); d.setGeometryOnDevice (2, 0, 1000, 1000, 1000); d.setGeometryOnDevice (3, 1000, 1000, 1000, 1000); w.set (-10, -10, 1034, 778, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (900, 300, 300, 200, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); w.set (900, 900, 201, 201, 0); EXPECT_EQ (3, d.outputDeviceForGeometry (w, 0, &s)); w.set (-10, 1010, 2000, 500, 0); EXPECT_EQ (2, d.outputDeviceForGeometry (w, 0, &s)); // When there are multiple canidates with equal scores, choose the first: w.set (-5, -5, 3000, 3000, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); } compiz-0.9.11+14.04.20140409/src/tests/CMakeLists.txt0000644000015301777760000000231012321343002022157 0ustar pbusernogroup00000000000000add_executable (compiz_test_outputdevices test_outputdevices.cpp ) include_directories ( ${COMPIZ_MAIN_SOURCE_DIR} ${COMPIZ_MAIN_SOURCE_DIR}/rect/include ${COMPIZ_MAIN_SOURCE_DIR}/region/include ${COMPIZ_MAIN_SOURCE_DIR}/timer/include ${COMPIZ_MAIN_SOURCE_DIR}/pluginclasshandler/include ${COMPIZ_MAIN_SOURCE_DIR}/window/geometry/include ${COMPIZ_MAIN_SOURCE_DIR}/window/extents/include ${COMPIZ_MAIN_SOURCE_DIR}/servergrab/include ${COMPIZ_INCLUDE_DIRS} ) link_directories (${COMPIZ_MAIN_BINARY_DIR}) target_link_libraries (compiz_test_outputdevices -Wl,-start-group compiz_size compiz_output compiz_outputdevices compiz_rect compiz_region compiz_window_geometry -Wl,-end-group ${GTEST_BOTH_LIBRARIES} ) compiz_discover_tests(compiz_test_outputdevices COVERAGE compiz_core) add_executable (compiz_test_configurerequestbuffer test_configurerequestbuffer.cpp) target_link_libraries (compiz_test_configurerequestbuffer compiz_configurerequestbuffer ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} ) compiz_discover_tests(compiz_test_configurerequestbuffer COVERAGE compiz_configurerequestbuffer) compiz-0.9.11+14.04.20140409/src/outputdevices.h0000644000015301777760000000605012321343002021336 0ustar pbusernogroup00000000000000/* * Compiz Core: OutputDevices class * * Copyright (c) 2012 Canonical Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include /* XXX: Including screen.h includes window.h and other unnecessary * headers which cause cascading header dependencies. We should seek to * eliminate this dependency */ #include namespace compiz { namespace core { class OutputDevices { public: OutputDevices (); void setCurrentOutput (unsigned int outputNum); CompOutput& getCurrentOutputDev () { return outputDevs[currentOutputDev]; } bool hasOverlappingOutputs () const { return overlappingOutputs; } void computeWorkAreas (CompRect &workArea, bool &workAreaChanged, CompRegion &allWorkArea, const CompWindowList &windows); const CompOutput &getOutputDev (unsigned int outputNum) const { return outputDevs[outputNum]; } // TODO breaks encapsulation horribly ought to be const at least // Even better, use begin() and end() return const_iterators // BUT this is exported directly through API - which makes changing // it a PITA. CompOutput::vector &getOutputDevs () { return outputDevs; } int outputDeviceForGeometry (const CompWindow::Geometry &gm, int strategy, CompSize *screen) const; void updateOutputDevices (CoreOptions &coreOptions, CompSize *screen); void setGeometryOnDevice (unsigned int nOutput, int x, int y, const int width, const int height); void adoptDevices (unsigned int nOutput, CompSize *screen); private: static CompRect computeWorkareaForBox (const CompRect &box, const CompWindowList &windows); CompOutput::vector outputDevs; bool overlappingOutputs; int currentOutputDev; }; } // namespace core } // namespace compiz compiz-0.9.11+14.04.20140409/src/serverwindow.h0000644000015301777760000000000012321343002021156 0ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/eventmanagement.h0000644000015301777760000000544412321343002021617 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical, Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical, Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical, Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL Canonical, Ltd. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #ifndef _COMPIZ_EVENT_MANAGEMENT_H #define _COMPIZ_EVENT_MANAGEMENT_H #include struct CompScreenEdge; class CompOption; namespace compiz { namespace private_screen { class GrabList; class EventManager; } namespace events { namespace cps = compiz::private_screen; typedef std::vector EventArguments; typedef boost::function ActionModsMatchesEventStateFunc; int processButtonPressOnEdgeWindow (Window edgeWindow, Window root, Window eventWindow, Window eventRoot, cps::GrabList &grabList, const CompScreenEdge *screenEdge); void setEventWindowInButtonPressArguments (EventArguments &arguments, Window eventWindow); bool activateButtonPressOnWindowBindingOption (CompOption &option, unsigned int eventButton, unsigned int eventState, cps::EventManager &eventManager, const ActionModsMatchesEventStateFunc &matchEventState, EventArguments &arguments); bool activateButtonPressOnEdgeBindingOption (CompOption &option, unsigned int eventButton, unsigned int eventState, int edge, cps::EventManager &eventManager, const ActionModsMatchesEventStateFunc &matchEventState, EventArguments &arguments); } } #endif compiz-0.9.11+14.04.20140409/src/eventsource.cpp0000644000015301777760000000466012321343002021335 0ustar pbusernogroup00000000000000/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Jason Smith * : Sam Spilsbury */ #include "privateeventsource.h" #include "core/screen.h" Glib::RefPtr CompEventSource::create () { return Glib::RefPtr (new CompEventSource (screen->dpy (), ConnectionNumber (screen->dpy ()))); } sigc::connection CompEventSource::connect (const sigc::slot &slot) { return connect_generic (slot); } CompEventSource::CompEventSource (Display *dpy, int fd) : Glib::Source (), mDpy (dpy), mConnectionFD (fd) { mPollFD.set_fd (mConnectionFD); mPollFD.set_events (Glib::IO_IN); set_priority (G_PRIORITY_DEFAULT); add_poll (mPollFD); set_can_recurse (true); connect (sigc::mem_fun (this, &CompEventSource::callback)); } CompEventSource::~CompEventSource () { } bool CompEventSource::callback () { screen->processEvents (); return true; } bool CompEventSource::prepare (int &timeout) { timeout = -1; return XPending (mDpy); } bool CompEventSource::check () { if (mPollFD.get_revents () & Glib::IO_IN) return XPending (mDpy); return false; } bool CompEventSource::dispatch (sigc::slot_base *slot) { return (*static_cast *> (slot)) (); } compiz-0.9.11+14.04.20140409/src/window.cpp0000644000015301777760000053377612321343035020327 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "core/windowconstrainment.h" #include "privatewindow.h" #include "privatescreen.h" #include "privatestackdebugger.h" #include "configurerequestbuffer-impl.h" #include namespace crb = compiz::window::configure_buffers; namespace cw = compiz::window; template class WrapableInterface; PluginClassStorage::Indices windowPluginClassIndices (0); unsigned int CompWindow::allocPluginClassIndex () { unsigned int i = PluginClassStorage::allocatePluginClassIndex (windowPluginClassIndices); foreach (CompWindow *w, screen->windows ()) if (windowPluginClassIndices.size () != w->pluginClasses.size ()) w->pluginClasses.resize (windowPluginClassIndices.size ()); return i; } void CompWindow::freePluginClassIndex (unsigned int index) { PluginClassStorage::freePluginClassIndex (windowPluginClassIndices, index); foreach (CompWindow *w, ::screen->windows ()) if (windowPluginClassIndices.size () != w->pluginClasses.size ()) w->pluginClasses.resize (windowPluginClassIndices.size ()); } inline bool PrivateWindow::isInvisible() const { return attrib.map_state != IsViewable || attrib.x + geometry.width () + output.right <= 0 || attrib.y + geometry.height () + output.bottom <= 0 || attrib.x - output.left >= (int) screen->width () || attrib.y - output.top >= (int) screen->height (); } bool PrivateWindow::isAncestorTo (CompWindow *transient, CompWindow *ancestor) { if (transient->priv->transientFor) { if (transient->priv->transientFor == ancestor->priv->id) return true; transient = screen->findWindow (transient->priv->transientFor); if (transient) return isAncestorTo (transient, ancestor); } return false; } void PrivateWindow::recalcNormalHints () { /* FIXME to max Texture size */ int maxSize = MAXSHORT; maxSize -= serverGeometry.border () * 2; sizeHints.x = serverGeometry.x (); sizeHints.y = serverGeometry.y (); sizeHints.width = serverGeometry.width (); sizeHints.height = serverGeometry.height (); if (!(sizeHints.flags & PBaseSize)) { if (sizeHints.flags & PMinSize) { sizeHints.base_width = sizeHints.min_width; sizeHints.base_height = sizeHints.min_height; } else { sizeHints.base_width = 0; sizeHints.base_height = 0; } sizeHints.flags |= PBaseSize; } if (!(sizeHints.flags & PMinSize)) { sizeHints.min_width = sizeHints.base_width; sizeHints.min_height = sizeHints.base_height; sizeHints.flags |= PMinSize; } if (!(sizeHints.flags & PMaxSize)) { sizeHints.max_width = 65535; sizeHints.max_height = 65535; sizeHints.flags |= PMaxSize; } if (sizeHints.max_width < sizeHints.min_width) sizeHints.max_width = sizeHints.min_width; if (sizeHints.max_height < sizeHints.min_height) sizeHints.max_height = sizeHints.min_height; if (sizeHints.min_width < 1) sizeHints.min_width = 1; if (sizeHints.max_width < 1) sizeHints.max_width = 1; if (sizeHints.min_height < 1) sizeHints.min_height = 1; if (sizeHints.max_height < 1) sizeHints.max_height = 1; if (sizeHints.max_width > maxSize) sizeHints.max_width = maxSize; if (sizeHints.max_height > maxSize) sizeHints.max_height = maxSize; if (sizeHints.min_width > maxSize) sizeHints.min_width = maxSize; if (sizeHints.min_height > maxSize) sizeHints.min_height = maxSize; if (sizeHints.base_width > maxSize) sizeHints.base_width = maxSize; if (sizeHints.base_height > maxSize) sizeHints.base_height = maxSize; if (sizeHints.flags & PResizeInc) { if (sizeHints.width_inc == 0) sizeHints.width_inc = 1; if (sizeHints.height_inc == 0) sizeHints.height_inc = 1; } else { sizeHints.width_inc = 1; sizeHints.height_inc = 1; sizeHints.flags |= PResizeInc; } if (sizeHints.flags & PAspect) { /* don't divide by 0 */ if (sizeHints.min_aspect.y < 1) sizeHints.min_aspect.y = 1; if (sizeHints.max_aspect.y < 1) sizeHints.max_aspect.y = 1; } else { sizeHints.min_aspect.x = 1; sizeHints.min_aspect.y = 65535; sizeHints.max_aspect.x = 65535; sizeHints.max_aspect.y = 1; sizeHints.flags |= PAspect; } if (!(sizeHints.flags & PWinGravity)) { sizeHints.win_gravity = NorthWestGravity; sizeHints.flags |= PWinGravity; } } void PrivateWindow::updateNormalHints () { long supplied; Status status = XGetWMNormalHints (screen->dpy (), priv->id, &priv->sizeHints, &supplied); if (!status) priv->sizeHints.flags = 0; priv->recalcNormalHints (); } void PrivateWindow::updateWmHints () { long dFlags = 0; bool iconChanged; if (hints) dFlags = hints->flags; inputHint = true; XWMHints *newHints = XGetWMHints (screen->dpy (), id); if (newHints) { dFlags ^= newHints->flags; if (newHints->flags & InputHint) inputHint = newHints->input; if (hints) { if ((newHints->flags & IconPixmapHint) && (hints->icon_pixmap != newHints->icon_pixmap)) iconChanged = true; else if ((newHints->flags & IconMaskHint) && (hints->icon_mask != newHints->icon_mask)) iconChanged = true; } } iconChanged |= (dFlags & (IconPixmapHint | IconMaskHint)); if (iconChanged) freeIcons (); if (hints) XFree (hints); hints = newHints; } void PrivateWindow::updateClassHints () { if (priv->resName) { free (priv->resName); priv->resName = NULL; } if (priv->resClass) { free (priv->resClass); priv->resClass = NULL; } XClassHint classHint; int status = XGetClassHint (screen->dpy (), priv->id, &classHint); if (status) { if (classHint.res_name) { priv->resName = strdup (classHint.res_name); XFree (classHint.res_name); } if (classHint.res_class) { priv->resClass = strdup (classHint.res_class); XFree (classHint.res_class); } } } void PrivateWindow::updateTransientHint () { Window transientFor; priv->transientFor = None; Status status = XGetTransientForHint (screen->dpy (), priv->id, &transientFor); if (status) { CompWindow *ancestor = screen->findWindow (transientFor); if (!ancestor) return; /* protect against circular transient dependencies */ if (transientFor == priv->id || PrivateWindow::isAncestorTo (ancestor, window)) return; priv->transientFor = transientFor; } } void PrivateWindow::updateIconGeometry () { Atom actual; int format; unsigned long n, left; unsigned char *data; priv->iconGeometry.setGeometry (0, 0, 0, 0); int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::wmIconGeometry, 0L, 1024L, False, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n == 4) { unsigned long *geometry = (unsigned long *) data; priv->iconGeometry.setX (geometry[0]); priv->iconGeometry.setY (geometry[1]); priv->iconGeometry.setWidth (geometry[2]); priv->iconGeometry.setHeight (geometry[3]); } XFree (data); } } Window PrivateWindow::getClientLeaderOfAncestor () { if (transientFor) { CompWindow *w = screen->findWindow (transientFor); if (w) { if (w->priv->clientLeader) return w->priv->clientLeader; return w->priv->getClientLeaderOfAncestor (); } } return None; } Window PrivateWindow::getClientLeader () { Atom actual; int format; unsigned long n, left; unsigned char *data; int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::wmClientLeader, 0L, 1L, False, XA_WINDOW, &actual, &format, &n, &left, &data); if (result == Success && data) { Window win = None; if (n) memcpy (&win, data, sizeof (Window)); XFree ((void *) data); if (win) return win; } return priv->getClientLeaderOfAncestor (); } char * PrivateWindow::getStartupId () { Atom actual; int format; unsigned long n, left; unsigned char *data; int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::startupId, 0L, 1024L, False, Atoms::utf8String, &actual, &format, &n, &left, &data); if (result == Success && data) { char *id = NULL; if (n) id = strdup ((char *) data); XFree ((void *) data); return id; } return NULL; } void PrivateWindow::setFullscreenMonitors (CompFullscreenMonitorSet *monitors) { bool hadFsMonitors = fullscreenMonitorsSet; unsigned int outputs = screen->outputDevs ().size (); fullscreenMonitorsSet = false; if (monitors && (unsigned int) monitors->left < outputs && (unsigned int) monitors->right < outputs && (unsigned int) monitors->top < outputs && (unsigned int) monitors->bottom < outputs) { CompRect fsRect (screen->outputDevs ()[monitors->left].x1 (), screen->outputDevs ()[monitors->top].y1 (), screen->outputDevs ()[monitors->right].x2 (), screen->outputDevs ()[monitors->bottom].y2 ()); if (fsRect.x1 () < fsRect.x2 () && fsRect.y1 () < fsRect.y2 ()) { fullscreenMonitorsSet = true; fullscreenMonitorRect = fsRect; } } if (fullscreenMonitorsSet) { long data[4]; data[0] = monitors->top; data[1] = monitors->bottom; data[2] = monitors->left; data[3] = monitors->right; XChangeProperty (screen->dpy (), id, Atoms::wmFullscreenMonitors, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) data, 4); } else if (hadFsMonitors) XDeleteProperty (screen->dpy (), id, Atoms::wmFullscreenMonitors); if (state & CompWindowStateFullscreenMask && (fullscreenMonitorsSet || hadFsMonitors)) window->updateAttributes (CompStackingUpdateModeNone); } void CompWindow::changeState (unsigned int newState) { if (priv->state == newState) return; unsigned int oldState = priv->state; priv->state = newState; recalcType (); recalcActions (); if (priv->managed) screen->setWindowState (priv->state, priv->id); stateChangeNotify (oldState); screen->matchPropertyChanged (this); } static void setWindowActions (CompScreen *s, unsigned int actions, Window id) { Atom data[32]; int i = 0; if (actions & CompWindowActionMoveMask) data[i++] = Atoms::winActionMove; if (actions & CompWindowActionResizeMask) data[i++] = Atoms::winActionResize; if (actions & CompWindowActionStickMask) data[i++] = Atoms::winActionStick; if (actions & CompWindowActionMinimizeMask) data[i++] = Atoms::winActionMinimize; if (actions & CompWindowActionMaximizeHorzMask) data[i++] = Atoms::winActionMaximizeHorz; if (actions & CompWindowActionMaximizeVertMask) data[i++] = Atoms::winActionMaximizeVert; if (actions & CompWindowActionFullscreenMask) data[i++] = Atoms::winActionFullscreen; if (actions & CompWindowActionCloseMask) data[i++] = Atoms::winActionClose; if (actions & CompWindowActionShadeMask) data[i++] = Atoms::winActionShade; if (actions & CompWindowActionChangeDesktopMask) data[i++] = Atoms::winActionChangeDesktop; if (actions & CompWindowActionAboveMask) data[i++] = Atoms::winActionAbove; if (actions & CompWindowActionBelowMask) data[i++] = Atoms::winActionBelow; XChangeProperty (s->dpy (), id, Atoms::wmAllowedActions, XA_ATOM, 32, PropModeReplace, (unsigned char *) data, i); } void CompWindow::recalcActions () { unsigned int actions = 0; unsigned int setActions, clearActions; switch (priv->type) { case CompWindowTypeFullscreenMask: case CompWindowTypeNormalMask: actions = CompWindowActionMaximizeHorzMask | CompWindowActionMaximizeVertMask | CompWindowActionFullscreenMask | CompWindowActionMoveMask | CompWindowActionResizeMask | CompWindowActionStickMask | CompWindowActionMinimizeMask | CompWindowActionCloseMask | CompWindowActionChangeDesktopMask; break; case CompWindowTypeUtilMask: case CompWindowTypeMenuMask: case CompWindowTypeToolbarMask: actions = CompWindowActionMoveMask | CompWindowActionResizeMask | CompWindowActionStickMask | CompWindowActionCloseMask | CompWindowActionChangeDesktopMask; break; case CompWindowTypeDialogMask: case CompWindowTypeModalDialogMask: actions = CompWindowActionMaximizeHorzMask | CompWindowActionMaximizeVertMask | CompWindowActionMoveMask | CompWindowActionResizeMask | CompWindowActionStickMask | CompWindowActionCloseMask | CompWindowActionChangeDesktopMask; /* allow minimization for dialog windows if they: * a) are not a transient (transients can be minimized * with their parent) * b) don't have the skip taskbar hint set (as those * have no target to be minimized to) */ if (!priv->transientFor && !(priv->state & CompWindowStateSkipTaskbarMask)) actions |= CompWindowActionMinimizeMask; break; default: break; } if (priv->serverInput.top) actions |= CompWindowActionShadeMask; actions |= (CompWindowActionAboveMask | CompWindowActionBelowMask); switch (priv->wmType) { case CompWindowTypeNormalMask: actions |= CompWindowActionFullscreenMask | CompWindowActionMinimizeMask; break; default: break; } if (priv->sizeHints.min_width == priv->sizeHints.max_width && priv->sizeHints.min_height == priv->sizeHints.max_height) actions &= ~(CompWindowActionResizeMask | CompWindowActionMaximizeHorzMask | CompWindowActionMaximizeVertMask | CompWindowActionFullscreenMask); /* Don't allow maximization or fullscreen * of windows which are too big to fit * the screen */ bool foundVert = false; bool foundHorz = false; bool foundFull = false; foreach (CompOutput &o, screen->outputDevs ()) { if (o.width () >= (priv->sizeHints.min_width + priv->border.left + priv->border.right)) foundHorz = true; if (o.height () >= (priv->sizeHints.min_height + priv->border.top + priv->border.bottom)) foundVert = true; /* Fullscreen windows don't need to fit borders... */ if (o.width () >= priv->sizeHints.min_width && o.height () >= priv->sizeHints.min_height) foundFull = true; } if (!foundHorz) actions &= ~CompWindowActionMaximizeHorzMask; if (!foundVert) actions &= ~CompWindowActionMaximizeVertMask; if (!foundFull) actions &= ~CompWindowActionFullscreenMask; if (!(priv->mwmFunc & MwmFuncAll)) { if (!(priv->mwmFunc & MwmFuncResize)) actions &= ~(CompWindowActionResizeMask | CompWindowActionMaximizeHorzMask | CompWindowActionMaximizeVertMask | CompWindowActionFullscreenMask); if (!(priv->mwmFunc & MwmFuncMove)) actions &= ~(CompWindowActionMoveMask | CompWindowActionMaximizeHorzMask | CompWindowActionMaximizeVertMask | CompWindowActionFullscreenMask); if (!(priv->mwmFunc & MwmFuncIconify)) actions &= ~CompWindowActionMinimizeMask; if (!(priv->mwmFunc & MwmFuncClose)) actions &= ~CompWindowActionCloseMask; } getAllowedActions (setActions, clearActions); actions &= ~clearActions; actions |= setActions; if (actions != priv->actions) { priv->actions = actions; setWindowActions (screen, actions, priv->id); } } void CompWindow::getAllowedActions (unsigned int &setActions, unsigned int &clearActions) { WRAPABLE_HND_FUNCTN (getAllowedActions, setActions, clearActions) setActions = 0; clearActions = 0; } unsigned int CompWindow::constrainWindowState (unsigned int state, unsigned int actions) { if (!(actions & CompWindowActionMaximizeHorzMask)) state &= ~CompWindowStateMaximizedHorzMask; if (!(actions & CompWindowActionMaximizeVertMask)) state &= ~CompWindowStateMaximizedVertMask; if (!(actions & CompWindowActionShadeMask)) state &= ~CompWindowStateShadedMask; if (!(actions & CompWindowActionFullscreenMask)) state &= ~CompWindowStateFullscreenMask; return state; } unsigned int PrivateWindow::windowTypeFromString (const char *str) { if (strcasecmp (str, "desktop") == 0) return CompWindowTypeDesktopMask; else if (strcasecmp (str, "dock") == 0) return CompWindowTypeDockMask; else if (strcasecmp (str, "toolbar") == 0) return CompWindowTypeToolbarMask; else if (strcasecmp (str, "menu") == 0) return CompWindowTypeMenuMask; else if (strcasecmp (str, "utility") == 0) return CompWindowTypeUtilMask; else if (strcasecmp (str, "splash") == 0) return CompWindowTypeSplashMask; else if (strcasecmp (str, "dialog") == 0) return CompWindowTypeDialogMask; else if (strcasecmp (str, "normal") == 0) return CompWindowTypeNormalMask; else if (strcasecmp (str, "dropdownmenu") == 0) return CompWindowTypeDropdownMenuMask; else if (strcasecmp (str, "popupmenu") == 0) return CompWindowTypePopupMenuMask; else if (strcasecmp (str, "tooltip") == 0) return CompWindowTypeTooltipMask; else if (strcasecmp (str, "notification") == 0) return CompWindowTypeNotificationMask; else if (strcasecmp (str, "combo") == 0) return CompWindowTypeComboMask; else if (strcasecmp (str, "dnd") == 0) return CompWindowTypeDndMask; else if (strcasecmp (str, "modaldialog") == 0) return CompWindowTypeModalDialogMask; else if (strcasecmp (str, "fullscreen") == 0) return CompWindowTypeFullscreenMask; else if (strcasecmp (str, "unknown") == 0) return CompWindowTypeUnknownMask; else if (strcasecmp (str, "any") == 0) return ~0; return 0; } void CompWindow::recalcType () { unsigned int type = priv->wmType; if (!overrideRedirect () && priv->wmType == CompWindowTypeUnknownMask) type = CompWindowTypeNormalMask; if (priv->state & CompWindowStateFullscreenMask) type = CompWindowTypeFullscreenMask; if (type == CompWindowTypeNormalMask && priv->transientFor) type = CompWindowTypeDialogMask; if (type == CompWindowTypeDockMask && (priv->state & CompWindowStateBelowMask)) type = CompWindowTypeNormalMask; if ((type & (CompWindowTypeNormalMask | CompWindowTypeDialogMask)) && (priv->state & CompWindowStateModalMask)) type = CompWindowTypeModalDialogMask; priv->type = type; } bool PrivateWindow::updateFrameWindow () { if (!serverFrame) return false; XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int valueMask = CWX | CWY | CWWidth | CWHeight; xwc.x = serverGeometry.x (); xwc.y = serverGeometry.y (); xwc.width = serverGeometry.width (); xwc.height = serverGeometry.height (); xwc.border_width = serverGeometry.border (); window->configureXWindow (valueMask, &xwc); window->windowNotify (CompWindowNotifyFrameUpdate); window->recalcActions (); return true; } void CompWindow::updateWindowOutputExtents () { CompWindowExtents output (priv->output); getOutputExtents (output); if (output.left != priv->output.left || output.right != priv->output.right || output.top != priv->output.top || output.bottom != priv->output.bottom) { priv->output = output; resizeNotify (0, 0, 0, 0); } } void CompWindow::getOutputExtents (CompWindowExtents& output) { WRAPABLE_HND_FUNCTN (getOutputExtents, output) output.left = 0; output.right = 0; output.top = 0; output.bottom = 0; } CompRegion PrivateWindow::rectsToRegion (unsigned int n, XRectangle *rects) { CompRegion ret; int x1, x2, y1, y2; const CompWindow::Geometry &geom = attrib.override_redirect ? priv->geometry : priv->serverGeometry; for (unsigned int i = 0; i < n; ++i) { x1 = rects[i].x + geom.border (); y1 = rects[i].y + geom.border (); x2 = x1 + rects[i].width; y2 = y1 + rects[i].height; if (x1 < 0) x1 = 0; if (y1 < 0) y1 = 0; if (x2 > geom.width ()) x2 = geom.width (); if (y2 > geom.height ()) y2 = geom.height (); if (y1 < y2 && x1 < x2) { x1 += geom.x (); y1 += geom.y (); x2 += geom.x (); y2 += geom.y (); ret += CompRect (x1, y1, x2 - x1, y2 - y1); } } return ret; } /* TODO: This function should be able to check the XShape event * kind and only get/set shape rectangles for either ShapeInput * or ShapeBounding, but not both at the same time */ void PrivateWindow::updateRegion () { XRectangle r, *boundingShapeRects = NULL; XRectangle *inputShapeRects = NULL; int nBounding = 0, nInput = 0; const CompWindow::Geometry &geom = attrib.override_redirect ? priv->geometry : priv->serverGeometry; priv->region = priv->inputRegion = emptyRegion; r.x = -geom.border (); r.y = -geom.border (); r.width = geom.widthIncBorders (); r.height = geom.heightIncBorders (); if (screen->XShape ()) { int order; /* We should update the server here */ XSync (screen->dpy (), false); boundingShapeRects = XShapeGetRectangles (screen->dpy (), priv->id, ShapeBounding, &nBounding, &order); inputShapeRects = XShapeGetRectangles (screen->dpy (), priv->id, ShapeInput, &nInput, &order); } else { boundingShapeRects = &r; nBounding = 1; inputShapeRects = &r; nInput = 1; } priv->region += rectsToRegion (nBounding, boundingShapeRects); priv->inputRegion += rectsToRegion (nInput, inputShapeRects); if (boundingShapeRects && boundingShapeRects != &r) XFree (boundingShapeRects); if (inputShapeRects && inputShapeRects != &r) XFree (inputShapeRects); window->updateFrameRegion (); } bool CompWindow::updateStruts () { Atom actual; int format; unsigned long n, left; unsigned char *data; bool hasOld; CompStruts oldStrut, newStrut; if (priv->struts) { hasOld = true; oldStrut.left = priv->struts->left; oldStrut.right = priv->struts->right; oldStrut.top = priv->struts->top; oldStrut.bottom = priv->struts->bottom; } else hasOld = false; bool hasNew = false; newStrut.left.x = 0; newStrut.left.y = 0; newStrut.left.width = 0; newStrut.left.height = screen->height (); newStrut.right.x = screen->width (); newStrut.right.y = 0; newStrut.right.width = 0; newStrut.right.height = screen->height (); newStrut.top.x = 0; newStrut.top.y = 0; newStrut.top.width = screen->width (); newStrut.top.height = 0; newStrut.bottom.x = 0; newStrut.bottom.y = screen->height (); newStrut.bottom.width = screen->width (); newStrut.bottom.height = 0; int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::wmStrutPartial, 0L, 12L, false, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { unsigned long *struts = (unsigned long *) data; if (n == 12) { hasNew = true; newStrut.left.y = struts[4]; newStrut.left.width = struts[0]; newStrut.left.height = struts[5] - newStrut.left.y + 1; newStrut.right.width = struts[1]; newStrut.right.x = screen->width () - newStrut.right.width; newStrut.right.y = struts[6]; newStrut.right.height = struts[7] - newStrut.right.y + 1; newStrut.top.x = struts[8]; newStrut.top.width = struts[9] - newStrut.top.x + 1; newStrut.top.height = struts[2]; newStrut.bottom.x = struts[10]; newStrut.bottom.width = struts[11] - newStrut.bottom.x + 1; newStrut.bottom.height = struts[3]; newStrut.bottom.y = screen->height () - newStrut.bottom.height; } XFree (data); } if (!hasNew) { result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::wmStrut, 0L, 4L, false, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { unsigned long *struts = (unsigned long *) data; if (n == 4) { hasNew = true; newStrut.left.x = 0; newStrut.left.width = struts[0]; newStrut.right.width = struts[1]; newStrut.right.x = screen->width () - newStrut.right.width; newStrut.top.y = 0; newStrut.top.height = struts[2]; newStrut.bottom.height = struts[3]; newStrut.bottom.y = screen->height () - newStrut.bottom.height; } XFree (data); } } if (hasNew) { int strutX1, strutY1, strutX2, strutY2; int x1, y1, x2, y2; /* applications expect us to clip struts to xinerama edges */ for (unsigned int i = 0; i < screen->screenInfo ().size (); ++i) { x1 = screen->screenInfo ()[i].x_org; y1 = screen->screenInfo ()[i].y_org; x2 = x1 + screen->screenInfo ()[i].width; y2 = y1 + screen->screenInfo ()[i].height; strutX1 = newStrut.left.x; strutX2 = strutX1 + newStrut.left.width; strutY1 = newStrut.left.y; strutY2 = strutY1 + newStrut.left.height; if (strutX2 > x1 && strutX2 <= x2 && strutY1 < y2 && strutY2 > y1) { newStrut.left.x = x1; newStrut.left.width = strutX2 - x1; } strutX1 = newStrut.right.x; strutX2 = strutX1 + newStrut.right.width; strutY1 = newStrut.right.y; strutY2 = strutY1 + newStrut.right.height; if (strutX1 > x1 && strutX1 <= x2 && strutY1 < y2 && strutY2 > y1) { newStrut.right.x = strutX1; newStrut.right.width = x2 - strutX1; } strutX1 = newStrut.top.x; strutX2 = strutX1 + newStrut.top.width; strutY1 = newStrut.top.y; strutY2 = strutY1 + newStrut.top.height; if (strutX1 < x2 && strutX2 > x1 && strutY2 > y1 && strutY2 <= y2) { newStrut.top.y = y1; newStrut.top.height = strutY2 - y1; } strutX1 = newStrut.bottom.x; strutX2 = strutX1 + newStrut.bottom.width; strutY1 = newStrut.bottom.y; strutY2 = strutY1 + newStrut.bottom.height; if (strutX1 < x2 && strutX2 > x1 && strutY1 > y1 && strutY1 <= y2) { newStrut.bottom.y = strutY1; newStrut.bottom.height = y2 - strutY1; } } } if (hasOld != hasNew || (hasNew && hasOld && memcmp (&newStrut, &oldStrut, sizeof (CompStruts)))) { if (hasNew) { if (!priv->struts) { priv->struts = (CompStruts *) malloc (sizeof (CompStruts)); if (!priv->struts) return false; } *priv->struts = newStrut; } else { free (priv->struts); priv->struts = NULL; } return true; } return false; } void CompWindow::incrementDestroyReference () { ++priv->destroyRefCnt; } void CompWindow::destroy () { if (priv->id) { StackDebugger *dbg = StackDebugger::Default (); windowNotify (CompWindowNotifyBeforeDestroy); /* Don't allow frame windows to block input */ if (priv->serverFrame) XUnmapWindow (screen->dpy (), priv->serverFrame); if (priv->wrapper) XUnmapWindow (screen->dpy (), priv->wrapper); CompWindow *oldServerNext = serverNext; CompWindow *oldServerPrev = serverPrev; CompWindow *oldNext = next; CompWindow *oldPrev = prev; priv->manageFrameWindowSeparately (); /* Immediately unhook the window once destroyed * as the stacking order will be invalid if we don't * and will continue to be invalid for the period * that we keep it around in the stack. Instead, push * it to another stack and keep the next and prev members * in tact, letting plugins sort out where those windows * might be in case they need to use them relative to * other windows */ screen->unhookWindow (this); screen->unhookServerWindow (this); /* We must immediately insert the window into the debugging * stack */ if (dbg) dbg->removeServerWindow (id ()); /* Unhooking the window will also NULL the next/prev * linked list links but we don't want that so don't * do that */ next = oldNext; prev = oldPrev; serverNext = oldServerNext; serverPrev = oldServerPrev; screen->addToDestroyedWindows (this); /* We must set the xid of this window * to zero as it no longer references * a valid window */ priv->mapNum = 0; priv->id = 0; priv->frame = 0; priv->serverFrame = 0; priv->managed = false; } --priv->destroyRefCnt; if (priv->destroyRefCnt) return; if (!priv->destroyed) { if (!priv->serverFrame) { StackDebugger *dbg = StackDebugger::Default (); if (dbg) dbg->addDestroyedFrame (priv->serverId); } priv->destroyed = true; screen->incrementPendingDestroys(); } } void CompWindow::sendConfigureNotify () { XConfigureEvent xev; xev.type = ConfigureNotify; xev.event = priv->id; xev.window = priv->id; xev.x = priv->serverGeometry.x (); xev.y = priv->serverGeometry.y (); xev.width = priv->serverGeometry.width (); xev.height = priv->serverGeometry.height (); xev.border_width = priv->serverGeometry.border (); xev.override_redirect = priv->attrib.override_redirect; /* These used to be based on the actual sibling of the window * (eg, obtained using XQueryTree), but they are now zeroed out. * * The ICCCM is a big unclear on what these should be - it * requires that after the client attempts to configure a window * we should issue a synthetic ConfigureNotify to work around * the change of co-ordinates due to reparenting: * * "A client will receive a synthetic ConfigureNotify event * following the change that describes the new geometry of the window" * * However there is an acknowledgement on stacking order: * * "Not changing the size, location, border width, * or stacking order of the window at all." * * Since there isn't any advice as to what to set the above and * detail members, the only choices are to either grab the server * and query it for the sibling to the window's parent, or to just * set them to zero. * * An evaluation of other window managers showed that they just set * these fields to zero. This is probably a safe option and justifies * the potential performance tradeoff that we get out of not having * to grab the server, query window attributes and children and * translate co-ordinates every time a window is moved */ xev.above = None; XSendEvent (screen->dpy (), priv->id, false, StructureNotifyMask, (XEvent *) &xev); } void CompWindow::map () { windowNotify (CompWindowNotifyBeforeMap); /* Previously not viewable */ if (!isViewable ()) { if (priv->pendingMaps > 0) priv->pendingMaps = 0; priv->mapNum = screen->nextMapNum(); if (priv->struts) screen->updateWorkarea (); if (windowClass () == InputOnly) return; priv->unmapRefCnt = 1; priv->attrib.map_state = IsViewable; if (!overrideRedirect ()) screen->setWmState (NormalState, priv->id); priv->invisible = priv->isInvisible (); priv->alive = true; priv->lastPong = screen->lastPing (); priv->updateRegion (); priv->updateSize (); screen->updateClientList (); if (priv->type & CompWindowTypeDesktopMask) screen->incrementDesktopWindowCount(); if (priv->protocols & CompWindowProtocolSyncRequestMask) { sendSyncRequest (); sendConfigureNotify (); } if (!overrideRedirect () && priv->shaded) // been shaded { priv->shaded = false; priv->updateFrameWindow (); } } windowNotify (CompWindowNotifyMap); /* Send a resizeNotify to plugins to indicate * that the map is complete */ resizeNotify (0, 0, 0, 0); } void CompWindow::incrementUnmapReference () { ++priv->unmapRefCnt; } void CompWindow::unmap () { if (priv->mapNum) priv->mapNum = 0; windowNotify (CompWindowNotifyBeforeUnmap); /* Even though we're still keeping the backing * pixmap of the window around, it's safe to * unmap the frame window since there's no use * for it at this point anyways and it just blocks * input, but keep it around if shaded */ XUnmapWindow (screen->dpy (), priv->wrapper); if (!priv->shaded) XUnmapWindow (screen->dpy (), priv->serverFrame); --priv->unmapRefCnt; if (priv->unmapRefCnt > 0) return; if (priv->unmanaging) { XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int xwcm; int gravity = priv->sizeHints.win_gravity; /* revert gravity adjustment made at MapNotify time */ xwc.x = priv->serverGeometry.x (); xwc.y = priv->serverGeometry.y (); xwc.width = 0; xwc.height = 0; xwcm = priv->adjustConfigureRequestForGravity (&xwc, CWX | CWY, gravity, -1); if (xwcm) configureXWindow (xwcm, &xwc); priv->unmanaging = false; } if (priv->serverFrame && !priv->shaded) priv->unreparent (); if (priv->struts) screen->updateWorkarea (); if (priv->attrib.map_state != IsViewable) return; if (priv->type == CompWindowTypeDesktopMask) screen->decrementDesktopWindowCount(); priv->attrib.map_state = IsUnmapped; priv->invisible = true; if (priv->shaded) priv->updateFrameWindow (); screen->updateClientList (); windowNotify (CompWindowNotifyUnmap); } void PrivateWindow::withdraw () { if (!attrib.override_redirect) screen->setWmState (WithdrawnState, id); placed = false; unmanaging = managed; managed = false; } bool PrivateWindow::restack (Window aboveId) { if (aboveId && (aboveId == id || aboveId == serverFrame)) // Don't try to raise a window above itself return false; else if (window->prev) { if (aboveId && (aboveId == window->prev->id () || aboveId == window->prev->priv->frame)) return false; } else if (aboveId == None && !window->next) return false; if (aboveId && !screen->findTopLevelWindow (aboveId, true)) return false; screen->unhookWindow (window); screen->insertWindow (window, aboveId); /* Update the server side window list for * override redirect windows immediately * since there is no opportunity to update * the server side list when we configure them * since we never get a ConfigureRequest for those */ if (attrib.override_redirect != 0) { StackDebugger *dbg = StackDebugger::Default (); screen->unhookServerWindow (window); screen->insertServerWindow (window, aboveId); if (dbg) dbg->overrideRedirectRestack (window->id (), aboveId); } screen->updateClientList (); window->windowNotify (CompWindowNotifyRestack); return true; } bool CompWindow::resize (XWindowAttributes attr) { return resize (Geometry (attr.x, attr.y, attr.width, attr.height, attr.border_width)); } bool CompWindow::resize (int x, int y, int width, int height, int border) { return resize (Geometry (x, y, width, height, border)); } bool PrivateWindow::resize (const CompWindow::Geometry &gm) { /* Input extents are now the last thing sent * from the server. This might not work in some * cases though because setWindowFrameExtents may * be called more than once in an event processing * cycle so every set of input extents up until the * last one will be invalid. The real solution * here is to handle ConfigureNotify events on * frame windows and client windows separately */ priv->input = priv->serverInput; if (priv->geometry.width () != gm.width () || priv->geometry.height () != gm.height () || priv->geometry.border () != gm.border ()) { int dx = gm.x () - priv->geometry.x (); int dy = gm.y () - priv->geometry.y (); int dwidth = gm.width () - priv->geometry.width (); int dheight = gm.height () - priv->geometry.height (); priv->geometry.set (gm.x (), gm.y (), gm.width (), gm.height (), gm.border ()); priv->invisible = priv->isInvisible (); if (priv->attrib.override_redirect) { priv->serverGeometry = priv->geometry; priv->serverFrameGeometry = priv->frameGeometry; if (priv->mapNum) priv->updateRegion (); window->resizeNotify (dx, dy, dwidth, dheight); } } else if (priv->geometry.x () != gm.x () || priv->geometry.y () != gm.y ()) move (gm.x () - priv->geometry.x (), gm.y () - priv->geometry.y (), true); return true; } bool PrivateWindow::resize (const XWindowAttributes &attr) { return resize (CompWindow::Geometry (attr.x, attr.y, attr.width, attr.height, attr.border_width)); } bool PrivateWindow::resize (int x, int y, int width, int height, int border) { return resize (CompWindow::Geometry (x, y, width, height, border)); } bool CompWindow::resize (CompWindow::Geometry gm) { XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int valueMask = CWX | CWY | CWWidth | CWHeight | CWBorderWidth; xwc.x = gm.x (); xwc.y = gm.y (); xwc.width = gm.width (); xwc.height = gm.height (); xwc.border_width = gm.border (); configureXWindow (valueMask, &xwc); return true; } static void syncValueIncrement (XSyncValue *value) { XSyncValue one; int overflow; XSyncIntToValue (&one, 1); XSyncValueAdd (value, *value, one, &overflow); } bool PrivateWindow::initializeSyncCounter () { if (syncCounter) return syncAlarm != None; if (!(protocols & CompWindowProtocolSyncRequestMask)) return false; Atom actual; int format; unsigned long n, left; unsigned char *data; int result = XGetWindowProperty (screen->dpy (), id, Atoms::wmSyncRequestCounter, 0L, 1L, false, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && n && data) { unsigned long *counter = (unsigned long *) data; syncCounter = *counter; XFree (data); XSyncIntsToValue (&syncValue, (unsigned int) rand (), 0); XSyncSetCounter (screen->dpy (), syncCounter, syncValue); syncValueIncrement (&syncValue); XSyncAlarmAttributes values; values.events = true; values.trigger.counter = syncCounter; values.trigger.wait_value = syncValue; values.trigger.value_type = XSyncAbsolute; values.trigger.test_type = XSyncPositiveComparison; XSyncIntToValue (&values.delta, 1); values.events = true; CompScreenImpl::checkForError (screen->dpy ()); /* Note that by default, the alarm increments the trigger value * when it fires until the condition (counter.value < trigger.value) * is false again. */ syncAlarm = XSyncCreateAlarm (screen->dpy (), XSyncCACounter | XSyncCAValue | XSyncCAValueType | XSyncCATestType | XSyncCADelta | XSyncCAEvents, &values); if (CompScreenImpl::checkForError (screen->dpy ())) return true; XSyncDestroyAlarm (screen->dpy (), syncAlarm); syncAlarm = None; } else if (result == Success && data) XFree (data); return false; } void CompWindow::sendSyncRequest () { if (priv->syncWait || !priv->initializeSyncCounter ()) return; XClientMessageEvent xev; xev.type = ClientMessage; xev.window = priv->id; xev.message_type = Atoms::wmProtocols; xev.format = 32; xev.data.l[0] = Atoms::wmSyncRequest; xev.data.l[1] = CurrentTime; xev.data.l[2] = XSyncValueLow32 (priv->syncValue); xev.data.l[3] = XSyncValueHigh32 (priv->syncValue); xev.data.l[4] = 0; syncValueIncrement (&priv->syncValue); XSendEvent (screen->dpy (), priv->id, false, 0, (XEvent *) &xev); priv->syncWait = true; priv->syncGeometry = priv->serverGeometry; if (!priv->syncWaitTimer.active ()) priv->syncWaitTimer.start (); } void PrivateWindow::configure (XConfigureEvent *ce) { if (priv->frame) return; unsigned int valueMask = 0; /* remove configure event from pending configures */ if (priv->geometry.x () != ce->x) valueMask |= CWX; if (priv->geometry.y () != ce->y) valueMask |= CWY; if (priv->geometry.width () != ce->width) valueMask |= CWWidth; if (priv->geometry.height () != ce->height) valueMask |= CWHeight; if (priv->geometry.border () != ce->border_width) valueMask |= CWBorderWidth; if (window->prev) { if (ROOTPARENT (window->prev) != ce->above) valueMask |= CWSibling | CWStackMode; } else if (ce->above != 0) valueMask |= CWSibling | CWStackMode; priv->attrib.override_redirect = ce->override_redirect; priv->frameGeometry.set (ce->x, ce->y, ce->width, ce->height, ce->border_width); if (priv->syncWait) priv->syncGeometry.set (ce->x, ce->y, ce->width, ce->height, ce->border_width); else resize (ce->x, ce->y, ce->width, ce->height, ce->border_width); if (ce->event == screen->root ()) priv->restack (ce->above); } void PrivateWindow::configureFrame (XConfigureEvent *ce) { if (!priv->frame) return; int height; CompWindow *above; unsigned int valueMask = 0; /* remove configure event from pending configures */ if (priv->frameGeometry.x () != ce->x) valueMask |= CWX; if (priv->frameGeometry.y () != ce->y) valueMask |= CWY; if (priv->frameGeometry.width () != ce->width) valueMask |= CWWidth; if (priv->frameGeometry.height () != ce->height) valueMask |= CWHeight; if (priv->frameGeometry.border () != ce->border_width) valueMask |= CWBorderWidth; if (window->prev) { if (ROOTPARENT (window->prev) != ce->above) valueMask |= CWSibling | CWStackMode; } else if (ce->above != 0) valueMask |= CWSibling | CWStackMode; if (!pendingConfigures.match ((XEvent *) ce)) { compLogMessage ("core", CompLogLevelWarn, "unhandled ConfigureNotify on 0x%x!", serverFrame); compLogMessage ("core", CompLogLevelWarn, "this should never happen. you should "\ "probably file a bug about this."); #ifdef DEBUG abort (); #else pendingConfigures.clear (); #endif } /* subtract the input extents last sent to the * server to calculate the client size and then * re-sync the input extents and extents last * sent to server on resize () */ int x = ce->x + priv->serverInput.left; int y = ce->y + priv->serverInput.top; int width = ce->width - priv->serverGeometry.border () * 2 - priv->serverInput.left - priv->serverInput.right; /* Don't use the server side frame geometry * to determine the geometry of shaded * windows since we didn't resize them * on configureXWindow */ if (priv->shaded) height = priv->serverGeometry.heightIncBorders () - priv->serverInput.top - priv->serverInput.bottom; else height = ce->height + priv->serverGeometry.border () * 2 - priv->serverInput.top - priv->serverInput.bottom; /* set the frame geometry */ priv->frameGeometry.set (ce->x, ce->y, ce->width, ce->height, ce->border_width); if (priv->syncWait) priv->syncGeometry.set (x, y, width, height, ce->border_width); else resize (x, y, width, height, ce->border_width); if (priv->restack (ce->above)) priv->updatePassiveButtonGrabs (); above = screen->findWindow (ce->above); if (above) above->priv->updatePassiveButtonGrabs (); } void PrivateWindow::circulate (XCirculateEvent *ce) { Window newAboveId; if (ce->place == PlaceOnTop) { CompWindow *newAbove = screen->getTopWindow (); newAboveId = newAbove ? newAbove->id () : None; } else newAboveId = 0; priv->restack (newAboveId); } void CompWindow::move (int dx, int dy, bool immediate) { if (dx || dy) { XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int valueMask = CWX | CWY; xwc.x = priv->serverGeometry.x () + dx; xwc.y = priv->serverGeometry.y () + dy; priv->nextMoveImmediate = immediate; configureXWindow (valueMask, &xwc); } } void PrivateWindow::move (int dx, int dy, bool immediate) { if (dx || dy) { priv->geometry.setX (priv->geometry.x () + dx); priv->geometry.setY (priv->geometry.y () + dy); priv->frameGeometry.setX (priv->frameGeometry.x () + dx); priv->frameGeometry.setY (priv->frameGeometry.y () + dy); if (priv->attrib.override_redirect) { priv->serverGeometry = priv->geometry; priv->serverFrameGeometry = priv->frameGeometry; priv->region.translate (dx, dy); priv->inputRegion.translate (dx, dy); if (!priv->frameRegion.isEmpty ()) priv->frameRegion.translate (dx, dy); priv->invisible = priv->isInvisible (); window->moveNotify (dx, dy, true); } } } bool compiz::X11::PendingEventQueue::pending () { return !mEvents.empty (); } void compiz::X11::PendingEventQueue::add (PendingEvent::Ptr p) { compLogMessage ("core", CompLogLevelDebug, "pending request:"); p->dump (); mEvents.push_back (p); } bool compiz::X11::PendingEventQueue::removeIfMatching (const PendingEvent::Ptr &p, XEvent *event) { if (p->match (event)) { compLogMessage ("core", CompLogLevelDebug, "received event:"); p->dump (); return true; } return false; } void compiz::X11::PendingEvent::dump () { compLogMessage ("core", CompLogLevelDebug, "- event serial: %i", mSerial); compLogMessage ("core", CompLogLevelDebug, "- event window 0x%x", mWindow); } void compiz::X11::PendingConfigureEvent::dump () { compiz::X11::PendingEvent::dump (); compLogMessage ("core", CompLogLevelDebug, "- x: %i y: %i width: %i height: %i "\ "border: %i, sibling: 0x%x", mXwc.x, mXwc.y, mXwc.width, mXwc.height, mXwc.border_width, mXwc.sibling); } bool compiz::X11::PendingEventQueue::match (XEvent *event) { unsigned int lastSize = mEvents.size (); mEvents.erase (std::remove_if (mEvents.begin (), mEvents.end (), boost::bind (&compiz::X11::PendingEventQueue::removeIfMatching, this, _1, event)), mEvents.end ()); return lastSize != mEvents.size (); } bool compiz::X11::PendingEventQueue::forEachIf (boost::function f) { foreach (compiz::X11::PendingEvent::Ptr p, mEvents) if (f (p)) return true; return false; } void compiz::X11::PendingEventQueue::dump () { foreach (compiz::X11::PendingEvent::Ptr p, mEvents) p->dump (); } compiz::X11::PendingEventQueue::PendingEventQueue (Display *d) { /* mClearCheckTimeout.setTimes (0, 0) * * XXX: For whatever reason, calling setTimes (0, 0) here causes * the destructor of the timer object to be called twice later on * in execution and the stack gets smashed. This could be a * compiler bug, but requires further investigation */ } compiz::X11::PendingEventQueue::~PendingEventQueue () { } Window compiz::X11::PendingEvent::getEventWindow (XEvent *event) { return event->xany.window; } bool compiz::X11::PendingEvent::match (XEvent *event) { if (event->xany.serial != mSerial || getEventWindow (event)!= mWindow) return false; return true; } compiz::X11::PendingEvent::PendingEvent (Display *d, Window w) : mSerial (XNextRequest (d)), mWindow (w) { } compiz::X11::PendingEvent::~PendingEvent () { } Window compiz::X11::PendingConfigureEvent::getEventWindow (XEvent *event) { return event->xconfigure.window; } bool compiz::X11::PendingConfigureEvent::matchVM (unsigned int valueMask) { unsigned int result = mValueMask != 0 ? valueMask & mValueMask : 1; return result != 0; } bool compiz::X11::PendingConfigureEvent::matchRequest (XWindowChanges &xwc, unsigned int valueMask) { if (matchVM (valueMask)) { if ((valueMask & CWX && xwc.x != mXwc.x) || (valueMask & CWY && xwc.y != mXwc.y) || (valueMask & CWWidth && xwc.width != mXwc.width) || (valueMask & CWHeight && xwc.height != mXwc.height) || (valueMask & CWBorderWidth && xwc.border_width != mXwc.border_width) || (valueMask & (CWStackMode | CWSibling) && xwc.sibling != mXwc.sibling)) return false; return true; } return false; } bool compiz::X11::PendingConfigureEvent::match (XEvent *event) { XConfigureEvent *ce = (XConfigureEvent *) event; bool matched = true; if (!compiz::X11::PendingEvent::match (event)) return false; XWindowChanges xwc = XWINDOWCHANGES_INIT; xwc.x = ce->x; xwc.y = ce->y; xwc.width = ce->width; xwc.height = ce->height; xwc.border_width = ce->border_width; xwc.sibling = ce->above; matched = matchRequest (xwc, mValueMask); /* Remove events from the queue * even if they didn't match what * we expected them to be, but still * complain about it */ if (!matched) { compLogMessage ("core", CompLogLevelWarn, "no exact match for ConfigureNotify on 0x%x!", mWindow); compLogMessage ("core", CompLogLevelWarn, "expected the following changes:"); if (mValueMask & CWX) compLogMessage ("core", CompLogLevelWarn, "x: %i", mXwc.x); if (mValueMask & CWY) compLogMessage ("core", CompLogLevelWarn, "y: %i", mXwc.y); if (mValueMask & CWWidth) compLogMessage ("core", CompLogLevelWarn, "width: %i", mXwc.width); if (mValueMask & CWHeight) compLogMessage ("core", CompLogLevelWarn, "height: %i", mXwc.height); if (mValueMask & CWBorderWidth) compLogMessage ("core", CompLogLevelWarn, "border: %i", mXwc.border_width); if (mValueMask & (CWStackMode | CWSibling)) compLogMessage ("core", CompLogLevelWarn, "sibling: 0x%x", mXwc.sibling); compLogMessage ("core", CompLogLevelWarn, "instead got:"); compLogMessage ("core", CompLogLevelWarn, "x: %i", ce->x); compLogMessage ("core", CompLogLevelWarn, "y: %i", ce->y); compLogMessage ("core", CompLogLevelWarn, "width: %i", ce->width); compLogMessage ("core", CompLogLevelWarn, "height: %i", ce->height); compLogMessage ("core", CompLogLevelWarn, "above: %i", ce->above); compLogMessage ("core", CompLogLevelWarn, "this should never happen. you should "\ "probably file a bug about this."); } return true; } compiz::X11::PendingConfigureEvent::PendingConfigureEvent (Display *d, Window w, unsigned int valueMask, XWindowChanges *xwc) : compiz::X11::PendingEvent::PendingEvent (d, w), mValueMask (valueMask), mXwc (*xwc) { } compiz::X11::PendingConfigureEvent::~PendingConfigureEvent () { } bool CompWindow::focus () { WRAPABLE_HND_FUNCTN_RETURN (bool, focus) if (overrideRedirect () || !priv->managed || priv->unmanaging || !onCurrentDesktop () || priv->destroyed || (!priv->shaded && (priv->state & CompWindowStateHiddenMask)) || priv->serverGeometry.x () + priv->serverGeometry.width () <= 0 || priv->serverGeometry.y () + priv->serverGeometry.height () <= 0 || priv->serverGeometry.x () >= (int) screen->width () || priv->serverGeometry.y () >= (int) screen->height ()) return false; return true; } bool CompWindow::place (CompPoint &pos) { WRAPABLE_HND_FUNCTN_RETURN (bool, place, pos) return false; } void CompWindow::validateResizeRequest (unsigned int &mask, XWindowChanges *xwc, unsigned int source) { WRAPABLE_HND_FUNCTN (validateResizeRequest, mask, xwc, source) if (!(priv->type & (CompWindowTypeDockMask | CompWindowTypeFullscreenMask | CompWindowTypeUnknownMask))) { if (mask & CWY) { int min = screen->workArea ().y () + priv->input.top; int max = screen->workArea ().bottom (); if (priv->state & CompWindowStateStickyMask && (xwc->y < min || xwc->y > max)) xwc->y = priv->serverGeometry.y (); else { min -= screen->vp ().y () * screen->height (); max += (screen->vpSize ().height () - screen->vp ().y () - 1) * screen->height (); if (xwc->y < min) xwc->y = min; else if (xwc->y > max) xwc->y = max; } } if (mask & CWX) { int min = screen->workArea ().x () + priv->input.left; int max = screen->workArea ().right (); if (priv->state & CompWindowStateStickyMask && (xwc->x < min || xwc->x > max)) xwc->x = priv->serverGeometry.x (); else { min -= screen->vp ().x () * screen->width (); max += (screen->vpSize ().width () - screen->vp ().x () - 1) * screen->width (); if (xwc->x < min) xwc->x = min; else if (xwc->x > max) xwc->x = max; } } } } void CompWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) WRAPABLE_HND_FUNCTN (resizeNotify, dx, dy, dwidth, dheight) void CompWindow::moveNotify (int dx, int dy, bool immediate) WRAPABLE_HND_FUNCTN (moveNotify, dx, dy, immediate) void CompWindow::windowNotify (CompWindowNotify n) WRAPABLE_HND_FUNCTN (windowNotify, n) void CompWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { WRAPABLE_HND_FUNCTN (grabNotify, x, y, state, mask) priv->grabbed = true; } void CompWindow::ungrabNotify () { WRAPABLE_HND_FUNCTN (ungrabNotify) priv->grabbed = false; } void CompWindow::stateChangeNotify (unsigned int lastState) { WRAPABLE_HND_FUNCTN (stateChangeNotify, lastState); /* if being made sticky */ if (!(lastState & CompWindowStateStickyMask) && (priv->state & CompWindowStateStickyMask)) { /* Find which viewport the window falls in, and check if it's the current viewport */ CompPoint vp = defaultViewport (); /* index of the window's vp */ if (screen->vp () != vp) { unsigned int valueMask = CWX | CWY; XWindowChanges xwc = XWINDOWCHANGES_INIT; xwc.x = serverGeometry ().x () + (screen->vp ().x () - vp.x ()) * screen->width (); xwc.y = serverGeometry ().y () + (screen->vp ().y () - vp.y ()) * screen->height (); configureXWindow (valueMask, &xwc); } } } bool PrivateWindow::isGroupTransient (Window clientLeader) { if (!clientLeader) return false; if ((transientFor == None || transientFor == screen->root ()) && (type & (CompWindowTypeUtilMask | CompWindowTypeToolbarMask | CompWindowTypeMenuMask | CompWindowTypeDialogMask | CompWindowTypeModalDialogMask) && this->clientLeader == clientLeader)) return true; return false; } CompWindow * PrivateWindow::getModalTransient () { CompWindow *w, *modalTransient; modalTransient = window; for (w = screen->windows ().back (); w; w = w->prev) { if (w == modalTransient || w->priv->mapNum == 0) continue; if (w->priv->transientFor == modalTransient->priv->id && w->priv->state & CompWindowStateModalMask) { modalTransient = w; w = screen->windows ().back (); } } if (modalTransient == window) { /* don't look for group transients with modal state if current window has modal state */ if (state & CompWindowStateModalMask) return NULL; for (w = screen->windows ().back (); w; w = w->prev) { if (w == modalTransient || w->priv->mapNum == 0 || isAncestorTo (modalTransient, w)) continue; if (w->priv->isGroupTransient (modalTransient->priv->clientLeader) && w->priv->state & CompWindowStateModalMask) { modalTransient = w; w = w->priv->getModalTransient (); if (w) modalTransient = w; break; } } } if (modalTransient == window) modalTransient = NULL; return modalTransient; } void CompWindow::moveInputFocusTo () { CompScreen *s = screen; CompWindow *modalTransient = priv->getModalTransient (); if (modalTransient) return modalTransient->moveInputFocusTo (); /* If the window is still hidden but not shaded * it probably meant that a plugin overloaded * CompWindow::focus to allow the focus to go * to this window, so only move the input focus * to the frame if the window is shaded */ if (shaded ()) { XSetInputFocus (s->dpy (), priv->serverFrame, RevertToPointerRoot, CurrentTime); XChangeProperty (s->dpy (), s->root (), Atoms::winActive, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &priv->id, 1); screen->setNextActiveWindow(priv->serverFrame); } else { bool setFocus = false; if (priv->inputHint) { XSetInputFocus (s->dpy (), priv->id, RevertToPointerRoot, CurrentTime); setFocus = true; } if (priv->protocols & CompWindowProtocolTakeFocusMask) { XEvent ev; ev.type = ClientMessage; ev.xclient.window = priv->id; ev.xclient.message_type = Atoms::wmProtocols; ev.xclient.format = 32; ev.xclient.data.l[0] = Atoms::wmTakeFocus; ev.xclient.data.l[1] = s->getCurrentTime (); ev.xclient.data.l[2] = 0; ev.xclient.data.l[3] = 0; ev.xclient.data.l[4] = 0; XSendEvent (s->dpy (), priv->id, false, NoEventMask, &ev); setFocus = true; } if (setFocus) screen->setNextActiveWindow(priv->id); if (!setFocus && !modalTransient) { CompWindow *ancestor; /* move input to closest ancestor */ for (ancestor = s->windows ().front (); ancestor; ancestor = ancestor->next) { if (PrivateWindow::isAncestorTo (this, ancestor)) { ancestor->moveInputFocusTo (); break; } } } } } void CompWindow::moveInputFocusToOtherWindow () { if (priv->id == screen->activeWindow () || priv->id == screen->getNextActiveWindow()) { CompWindow *nextActive = screen->findWindow (screen->getNextActiveWindow ()); /* Window pending focus */ if (priv->id != screen->getNextActiveWindow () && nextActive && nextActive->focus ()) nextActive->moveInputFocusTo (); else if (priv->transientFor && priv->transientFor != screen->root ()) { CompWindow *ancestor = screen->findWindow (priv->transientFor); if (ancestor && ancestor->focus () && !(ancestor->priv->type & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) ancestor->moveInputFocusTo (); else screen->focusDefaultWindow (); } else if (priv->type & (CompWindowTypeDialogMask | CompWindowTypeModalDialogMask)) { CompWindow *a, *focus = NULL; for (a = screen->windows ().back (); a; a = a->prev) { if (a->priv->clientLeader == priv->clientLeader) { if (a->focus ()) { if (focus) { if (a->priv->type & (CompWindowTypeNormalMask | CompWindowTypeDialogMask | CompWindowTypeModalDialogMask)) { if (priv->compareWindowActiveness (focus, a) < 0) focus = a; } } else focus = a; } } } if (focus && !(focus->priv->type & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) focus->moveInputFocusTo (); else screen->focusDefaultWindow (); } else screen->focusDefaultWindow (); } } namespace { /* There is a race condition where we can request to restack * a window relative to a sibling that's been destroyed on * the server side, but not yet on the client side (eg DestroyNotify). * In that case the server will report a BadWindow error and refuse * to process the ConfigureRequest event. This leaves * serverWindows in an indeterminate state, because we've * effectively recorded that we successfully put the window * in a new stack position, even though it will fail later on * and leave the window in the same stack position. That leaves * the door open for cascading errors, where other windows successfully * stack on top of the window which was not successfully restacked, so * they will all receive invalid stack positions. * * In order to alleviate that condition, we need to hold a server grab to * ensure that the window cannot be destroyed while we are stacking another * window relative to it, or, if it was destroyed to ensure that querying * whether or not it exists will return a useful value * * Any function which walks the window stack to determine an appropriate * sibling should always employ this as the last check before returning * that sibling or considering other windows. It is never a good idea * to restack relative to a sibling that could have been destroyed. As * a side effect of this function requiring a ServerLock, any other function * that uses this one will also require one, and the caller should keep * the same ServerLock alive when calling through to * CompWindow::restackAndConfigureXWindow */ bool existsOnServer (CompWindow *window, const ServerLock &lock) { /* We only stack relative to frame windows, and we know * whether or not they exist on the server side, don't * query whether or not they do */ if (window->frame ()) return true; else { XWindowAttributes attrib; if (!XGetWindowAttributes (screen->dpy (), ROOTPARENT (window), &attrib)) return false; } return true; } } bool PrivateWindow::stackLayerCheck (CompWindow *w, Window clientLeader, CompWindow *below, const ServerLock &lock) { if (isAncestorTo (w, below)) return true; if (isAncestorTo (below, w)) return false; if (clientLeader && below->priv->clientLeader == clientLeader && below->priv->isGroupTransient (clientLeader)) return false; if (w->priv->state & CompWindowStateAboveMask) return true; else if (w->priv->state & CompWindowStateBelowMask) { if (below->priv->state & CompWindowStateBelowMask) return true; } else if (!(below->priv->state & CompWindowStateAboveMask)) return true; return false; } bool PrivateWindow::avoidStackingRelativeTo (CompWindow *w, const ServerLock &lock) { bool allowRelativeToUnmapped = w->priv->receivedMapRequestAndAwaitingMap || w->priv->shaded || w->priv->pendingMaps; if ((w->overrideRedirect () || w->destroyed ()) || (!allowRelativeToUnmapped && (!w->isViewable () || !w->isMapped ()))) return true; return false; } /* goes through the stack, top-down until we find a window we should stack above, normal windows can be stacked above fullscreen windows (and fullscreen windows over others in their layer) if aboveFs is true. */ CompWindow * PrivateWindow::findSiblingBelow (CompWindow *w, bool aboveFs, const ServerLock &lock) { CompWindow *below; CompWindow *t = screen->findWindow (w->transientFor ()); Window clientLeader = w->priv->clientLeader; unsigned int type = w->priv->type; unsigned int belowMask; if (aboveFs) belowMask = CompWindowTypeDockMask; else belowMask = CompWindowTypeDockMask | CompWindowTypeFullscreenMask; /* normal stacking of fullscreen windows with below state */ if ((type & CompWindowTypeFullscreenMask) && (w->priv->state & CompWindowStateBelowMask)) type = CompWindowTypeNormalMask; while (t && type != CompWindowTypeDockMask) { /* dock stacking of transients for docks */ if (t->type () & CompWindowTypeDockMask) type = CompWindowTypeDockMask; t = screen->findWindow (t->transientFor ()); } if (w->priv->transientFor || w->priv->isGroupTransient (clientLeader)) clientLeader = None; for (below = screen->serverWindows ().back (); below; below = below->serverPrev) { if (below == w || avoidStackingRelativeTo (below, lock)) continue; /* always above desktop windows */ if (below->priv->type & CompWindowTypeDesktopMask) return below; switch (type) { case CompWindowTypeDesktopMask: /* desktop window layer */ break; case CompWindowTypeFullscreenMask: if (aboveFs) return below; /* otherwise fall-through */ case CompWindowTypeDockMask: /* fullscreen and dock layer */ if (below->priv->type & (CompWindowTypeFullscreenMask | CompWindowTypeDockMask)) { if (stackLayerCheck (w, clientLeader, below, lock) && existsOnServer (below, lock)) return below; } else return below; break; default: { bool allowedRelativeToLayer = !(below->priv->type & belowMask); if (aboveFs && below->priv->type & CompWindowTypeFullscreenMask && !below->focus ()) break; t = screen->findWindow (below->transientFor ()); while (t && allowedRelativeToLayer) { /* dock stacking of transients for docks */ allowedRelativeToLayer = !(t->priv->type & belowMask); t = screen->findWindow (t->transientFor ()); } /* fullscreen and normal layer */ if (allowedRelativeToLayer && stackLayerCheck (w, clientLeader, below, lock) && existsOnServer (below, lock)) return below; break; } } } return NULL; } /* goes through the stack, top-down and returns the lowest window we can stack above. */ CompWindow * PrivateWindow::findLowestSiblingBelow (CompWindow *w, const ServerLock &lock) { CompWindow *below, *lowest = screen->serverWindows ().back (); CompWindow *t = screen->findWindow (w->transientFor ()); Window clientLeader = w->priv->clientLeader; unsigned int type = w->priv->type; /* normal stacking fullscreen windows with below state */ if (type & CompWindowTypeFullscreenMask && w->priv->state & CompWindowStateBelowMask) type = CompWindowTypeNormalMask; while (t && type != CompWindowTypeDockMask) { /* dock stacking of transients for docks */ if (t->type () & CompWindowTypeDockMask) type = CompWindowTypeDockMask; t = screen->findWindow (t->transientFor ()); } if (w->priv->transientFor || w->priv->isGroupTransient (clientLeader)) clientLeader = None; for (below = screen->serverWindows ().back (); below; below = below->serverPrev) { if (below == w || avoidStackingRelativeTo (below, lock)) continue; /* always above desktop windows */ if (below->priv->type & CompWindowTypeDesktopMask && existsOnServer (below, lock)) return below; switch (type) { case CompWindowTypeDesktopMask: /* desktop window layer - desktop windows always should be stacked at the bottom; no other window should be below them */ return NULL; break; case CompWindowTypeFullscreenMask: case CompWindowTypeDockMask: /* fullscreen and dock layer */ if (below->priv->type & (CompWindowTypeFullscreenMask | CompWindowTypeDockMask)) { if (!stackLayerCheck (below, clientLeader, w, lock) && existsOnServer (lowest, lock)) return lowest; } else if (existsOnServer (lowest, lock)) return lowest; break; default: { bool allowedRelativeToLayer = !(below->priv->type & CompWindowTypeDockMask); t = screen->findWindow (below->transientFor ()); while (t && allowedRelativeToLayer) { /* dock stacking of transients for docks */ allowedRelativeToLayer = !(t->priv->type & CompWindowTypeDockMask); t = screen->findWindow (t->transientFor ()); } /* fullscreen and normal layer */ if (allowedRelativeToLayer && !stackLayerCheck (below, clientLeader, w, lock) && existsOnServer (lowest, lock)) return lowest; break; } } lowest = below; } if (existsOnServer (lowest, lock)) return lowest; else { compLogMessage ("core", CompLogLevelDebug, "couldn't find window to stack above"); return NULL; } } bool PrivateWindow::validSiblingBelow (CompWindow *w, CompWindow *sibling, const ServerLock &lock) { CompWindow *t = screen->findWindow (w->transientFor ()); Window clientLeader = w->priv->clientLeader; unsigned int type = w->priv->type; /* normal stacking fullscreen windows with below state */ if ((type & CompWindowTypeFullscreenMask) && (w->priv->state & CompWindowStateBelowMask)) type = CompWindowTypeNormalMask; while (t && type != CompWindowTypeDockMask) { /* dock stacking of transients for docks */ if (t->type () & CompWindowTypeDockMask) type = CompWindowTypeDockMask; t = screen->findWindow (t->transientFor ()); } if (w->priv->transientFor || w->priv->isGroupTransient (clientLeader)) clientLeader = None; if (sibling == w || avoidStackingRelativeTo (sibling, lock)) return false; /* always above desktop windows */ if (sibling->priv->type & CompWindowTypeDesktopMask) return true; switch (type) { case CompWindowTypeDesktopMask: /* desktop window layer */ break; case CompWindowTypeFullscreenMask: case CompWindowTypeDockMask: /* fullscreen and dock layer */ if (sibling->priv->type & (CompWindowTypeFullscreenMask | CompWindowTypeDockMask)) { if (stackLayerCheck (w, clientLeader, sibling, lock) && existsOnServer (sibling, lock)) return true; } else if (existsOnServer (sibling, lock)) return true; break; default: { bool allowedRelativeToLayer = !(sibling->priv->type & CompWindowTypeDockMask); t = screen->findWindow (sibling->transientFor ()); while (t && allowedRelativeToLayer) { /* dock stacking of transients for docks */ allowedRelativeToLayer = !(t->priv->type & CompWindowTypeDockMask); t = screen->findWindow (t->transientFor ()); } /* fullscreen and normal layer */ if (allowedRelativeToLayer && stackLayerCheck (w, clientLeader, sibling, lock) && existsOnServer (sibling, lock)) return true; break; } } return false; } void PrivateWindow::saveGeometry (int mask) { /* only save geometry if window has been placed */ if (!placed) return; int m = mask & ~saveMask; /* The saved window geometry is always saved in terms of the non-decorated * geometry as we may need to restore it with a different decoration size */ if (m & CWX) saveWc.x = serverGeometry.x () - window->border ().left; if (m & CWY) saveWc.y = serverGeometry.y () - window->border ().top; if (m & CWWidth) saveWc.width = serverGeometry.width () + (window->border ().left + window->border ().right); if (m & CWHeight) saveWc.height = serverGeometry.height () + (window->border ().top + window->border ().bottom); if (m & CWBorderWidth) saveWc.border_width = serverGeometry.border (); saveMask |= m; } int PrivateWindow::restoreGeometry (XWindowChanges *xwc, int mask) { int m = mask & saveMask; if (m & CWX) xwc->x = saveWc.x + window->border ().left; if (m & CWY) xwc->y = saveWc.y + window->border ().top; if (m & CWWidth) xwc->width = saveWc.width - (window->border ().left + window->border ().right); if (m & CWHeight) xwc->height = saveWc.height - (window->border ().top + window->border ().bottom); if (m & CWBorderWidth) xwc->border_width = saveWc.border_width; saveMask &= ~mask; return m; } static bool isPendingRestack (const compiz::X11::PendingEvent::Ptr &p) { compiz::X11::PendingConfigureEvent::Ptr pc = boost::static_pointer_cast (p); return pc->matchVM (CWStackMode | CWSibling); } static bool isExistingRequest (const compiz::X11::PendingEvent::Ptr &p, XWindowChanges &xwc, unsigned int valueMask) { compiz::X11::PendingConfigureEvent::Ptr pc = boost::static_pointer_cast (p); return pc->matchRequest (xwc, valueMask); } bool PrivateWindow::queryAttributes (XWindowAttributes &attrib) { return configureBuffer->queryAttributes (attrib); } bool PrivateWindow::queryFrameAttributes (XWindowAttributes &attrib) { return configureBuffer->queryFrameAttributes (attrib); } XRectangle * PrivateWindow::queryShapeRectangles (int kind, int *count, int *ordering) { return configureBuffer->queryShapeRectangles (kind, count, ordering); } int PrivateWindow::requestConfigureOnClient (const XWindowChanges &xwc, unsigned int valueMask) { return XConfigureWindow (screen->dpy (), id, valueMask, const_cast (&xwc)); } int PrivateWindow::requestConfigureOnWrapper (const XWindowChanges &xwc, unsigned int valueMask) { return XConfigureWindow (screen->dpy (), wrapper, valueMask, const_cast (&xwc)); } int PrivateWindow::requestConfigureOnFrame (const XWindowChanges &xwc, unsigned int frameValueMask) { XWindowChanges wc = xwc; wc.x = serverFrameGeometry.x (); wc.y = serverFrameGeometry.y (); wc.width = serverFrameGeometry.width (); wc.height = serverFrameGeometry.height (); compiz::X11::PendingEvent::Ptr pc ( new compiz::X11::PendingConfigureEvent ( screen->dpy (), priv->serverFrame, frameValueMask, &wc)); pendingConfigures.add (pc); return XConfigureWindow (screen->dpy (), serverFrame, frameValueMask, &wc); } void PrivateWindow::sendSyntheticConfigureNotify () { window->sendConfigureNotify (); } bool PrivateWindow::hasCustomShape () const { return false; } void PrivateWindow::reconfigureXWindow (unsigned int valueMask, XWindowChanges *xwc) { if (id == screen->root ()) { compLogMessage ("core", CompLogLevelWarn, "attempted to reconfigure root window"); return; } unsigned int frameValueMask = 0; /* Remove redundant bits */ xwc->x = valueMask & CWX ? xwc->x : serverGeometry.x (); xwc->y = valueMask & CWY ? xwc->y : serverGeometry.y (); xwc->width = valueMask & CWWidth ? xwc->width : serverGeometry.width (); xwc->height = valueMask & CWHeight ? xwc->height : serverGeometry.height (); xwc->border_width = valueMask & CWBorderWidth ? xwc->border_width : serverGeometry.border (); /* Don't allow anything that might generate a BadValue */ if (valueMask & CWWidth && !xwc->width) { compLogMessage ("core", CompLogLevelWarn, "Attempted to set < 1 width on a window"); xwc->width = 1; } if (valueMask & CWHeight && !xwc->height) { compLogMessage ("core", CompLogLevelWarn, "Attempted to set < 1 height on a window"); xwc->height = 1; } int dx = valueMask & CWX ? xwc->x - serverGeometry.x () : 0; int dy = valueMask & CWY ? xwc->y - serverGeometry.y () : 0; int dwidth = valueMask & CWWidth ? xwc->width - serverGeometry.width () : 0; int dheight = valueMask & CWHeight ? xwc->height - serverGeometry.height () : 0; /* FIXME: This is a total fallacy for the reparenting case * at least since the client doesn't actually move here, it only * moves within the frame */ if (valueMask & CWX && serverGeometry.x () == xwc->x) valueMask &= ~(CWX); if (valueMask & CWY && serverGeometry.y () == xwc->y) valueMask &= ~(CWY); if (valueMask & CWWidth && serverGeometry.width () == xwc->width) valueMask &= ~(CWWidth); if (valueMask & CWHeight && serverGeometry.height () == xwc->height) valueMask &= ~(CWHeight); if (valueMask & CWBorderWidth && serverGeometry.border () == xwc->border_width) valueMask &= ~(CWBorderWidth); /* check if the sibling is also pending a restack, * if not, then setting this bit is useless */ if (valueMask & CWSibling && window->serverPrev && ROOTPARENT (window->serverPrev) == xwc->sibling) { bool matchingRequest = priv->pendingConfigures.forEachIf (boost::bind (isExistingRequest, _1, *xwc, valueMask)); bool restackPending = window->serverPrev->priv->pendingConfigures.forEachIf (boost::bind (isPendingRestack, _1)); bool remove = matchingRequest; if (!remove) remove = !restackPending; if (remove) valueMask &= ~(CWSibling | CWStackMode); } if (valueMask & CWBorderWidth) serverGeometry.setBorder (xwc->border_width); if (valueMask & CWX) serverGeometry.setX (xwc->x); if (valueMask & CWY) serverGeometry.setY (xwc->y); if (valueMask & CWWidth) serverGeometry.setWidth (xwc->width); if (valueMask & CWHeight) serverGeometry.setHeight (xwc->height); /* Update the server side window list on raise, lower and restack functions. * This function should only recieve stack_mode == Above * but warn incase something else does get through, to make the cause * of any potential misbehaviour obvious. */ if (valueMask & (CWSibling | CWStackMode)) { if (xwc->stack_mode == Above) { if (xwc->sibling) { screen->unhookServerWindow (window); screen->insertServerWindow (window, xwc->sibling); } } else compLogMessage ("core", CompLogLevelWarn, "restack_mode not Above"); } frameValueMask = CWX | CWY | CWWidth | CWHeight | (valueMask & (CWStackMode | CWSibling)); if (serverFrameGeometry.x () == xwc->x - serverGeometry.border () - serverInput.left) frameValueMask &= ~(CWX); if (serverFrameGeometry.y () == xwc->y - serverGeometry.border () - serverInput.top) frameValueMask &= ~(CWY); if (serverFrameGeometry.width () == xwc->width + serverGeometry.border () * 2 + serverInput.left + serverInput.right) frameValueMask &= ~(CWWidth); /* shaded windows are not allowed to have their frame window * height changed (but are allowed to have their client height * changed */ if (shaded) { if (serverFrameGeometry.height () == serverGeometry.border () * 2 + serverInput.top + serverInput.bottom) frameValueMask &= ~(CWHeight); } else { if (serverFrameGeometry.height () == xwc->height + serverGeometry.border () * 2 + serverInput.top + serverInput.bottom) frameValueMask &= ~(CWHeight); } if (valueMask & CWStackMode && xwc->stack_mode != TopIf && xwc->stack_mode != BottomIf && xwc->stack_mode != Opposite && xwc->stack_mode != Above && xwc->stack_mode != Below) { compLogMessage ("core", CompLogLevelWarn, "Invalid stack mode %i", xwc->stack_mode); valueMask &= ~(CWStackMode | CWSibling); } /* Don't allow anything that might cause a BadMatch error */ if (valueMask & CWSibling && !(valueMask & CWStackMode)) { compLogMessage ("core", CompLogLevelWarn, "Didn't specify a CWStackMode for CWSibling"); valueMask &= ~CWSibling; } if (valueMask & CWSibling && xwc->sibling == (serverFrame ? serverFrame : id)) { compLogMessage ("core", CompLogLevelWarn, "Can't restack a window relative to itself"); valueMask &= ~CWSibling; } if (valueMask & CWBorderWidth && attrib.c_class == InputOnly) { compLogMessage ("core", CompLogLevelWarn, "Cannot set border_width of an input_only window"); valueMask &= ~CWBorderWidth; } if (valueMask & CWSibling) { CompWindow *sibling = screen->findTopLevelWindow (xwc->sibling); if (!sibling) { compLogMessage ("core", CompLogLevelWarn, "Attempted to restack relative to 0x%x which is "\ "not a child of the root window or a window compiz owns", static_cast (xwc->sibling)); valueMask &= ~(CWSibling | CWStackMode); } else if (sibling->frame () && xwc->sibling != sibling->frame ()) { compLogMessage ("core", CompLogLevelWarn, "Attempted to restack relative to 0x%x which is "\ "not a child of the root window", static_cast (xwc->sibling)); valueMask &= ~(CWSibling | CWStackMode); } } /* Can't set the border width of frame windows */ frameValueMask &= ~(CWBorderWidth); if (frameValueMask & CWX) serverFrameGeometry.setX (xwc->x - serverGeometry.border () - serverInput.left); if (frameValueMask & CWY) serverFrameGeometry.setY (xwc->y -serverGeometry.border () - serverInput.top); if (frameValueMask & CWWidth) serverFrameGeometry.setWidth (xwc->width + serverGeometry.border () * 2 + serverInput.left + serverInput.right); if (shaded) { if (frameValueMask & CWHeight) serverFrameGeometry.setHeight (serverGeometry.border () * 2 + serverInput.top + serverInput.bottom); } else if (frameValueMask & CWHeight) serverFrameGeometry.setHeight (xwc->height + serverGeometry.border () * 2 + serverInput.top + serverInput.bottom); if (serverFrame) { if (frameValueMask) priv->configureBuffer->pushFrameRequest (*xwc, frameValueMask); valueMask = frameValueMask & (CWWidth | CWHeight); /* If the frame has changed position (eg, serverInput.top * or serverInput.left have changed) then we also need to * update the client and wrapper position */ if (lastServerInput.left != serverInput.left) valueMask |= CWX; if (lastServerInput.top != serverInput.top) valueMask |= CWY; /* Calculate frame extents and protect against underflow */ const unsigned int lastWrapperWidth = std::max (0, serverFrameGeometry.width () - (lastServerInput.right + lastServerInput.left)); const unsigned int lastWrapperHeight = std::max (0, serverFrameGeometry.height () - (lastServerInput.bottom + lastServerInput.top)); const unsigned int wrapperWidth = std::max (0, serverFrameGeometry.width () - (serverInput.right + serverInput.left)); const unsigned int wrapperHeight = std::max (0, serverFrameGeometry.height () - (serverInput.bottom + serverInput.top)); if (lastWrapperWidth != wrapperWidth) valueMask |= CWWidth; if (lastWrapperHeight != wrapperHeight) valueMask |= CWHeight; if (valueMask) { xwc->x = serverInput.left; xwc->y = serverInput.top; priv->configureBuffer->pushWrapperRequest (*xwc, valueMask); } } /* Client is reparented, the only things that can change * are the width, height and border width */ if (serverFrame) valueMask &= (CWWidth | CWHeight | CWBorderWidth); if (valueMask) priv->configureBuffer->pushClientRequest (*xwc, valueMask); /* Send the synthetic configure notify * after the real configure notify arrives * (ICCCM s4.1.5) */ if (serverFrame) window->sendConfigureNotify (); /* When updating plugins we care about * the absolute position */ if (dx) valueMask |= CWX; if (dy) valueMask |= CWY; if (dwidth) valueMask |= CWWidth; if (dheight) valueMask |= CWHeight; if (!attrib.override_redirect) { if (valueMask & (CWWidth | CWHeight)) { updateRegion (); window->resizeNotify (dx, dy, dwidth, dheight); } else if (valueMask & (CWX | CWY)) { region.translate (dx, dy); inputRegion.translate (dx, dy); if (!frameRegion.isEmpty ()) frameRegion.translate (dx, dy); if (dx || dy) { window->moveNotify (dx, dy, priv->nextMoveImmediate); priv->nextMoveImmediate = true; } } } } bool PrivateWindow::stackDocks (CompWindow *w, CompWindowList &updateList, XWindowChanges *xwc, unsigned int *mask, const ServerLock &lock) { CompWindow *firstFullscreenWindow = NULL; CompWindow *belowDocks = NULL; bool currentlyManaged, visible, ancestorToClient, acceptableType; foreach (CompWindow *dw, screen->serverWindows ()) { /* fullscreen window found */ if (firstFullscreenWindow) { currentlyManaged = dw->priv->managed && !dw->priv->unmanaging; visible = !(dw->state () & CompWindowStateHiddenMask); ancestorToClient = PrivateWindow::isAncestorTo (w, dw); acceptableType = !(dw->type () & (CompWindowTypeFullscreenMask | CompWindowTypeDockMask)); /* If there is another toplevel window above the fullscreen one * then we need to stack above that */ if (currentlyManaged && visible && acceptableType && !ancestorToClient && !dw->overrideRedirect () && dw->isViewable () && existsOnServer (dw, lock)) belowDocks = dw; } else if (dw->type () & CompWindowTypeFullscreenMask) { /* First fullscreen window found when checking up the stack * now go back down to find a suitable candidate client * window to put the docks above */ firstFullscreenWindow = dw; for (CompWindow *dww = dw->serverPrev; dww; dww = dww->serverPrev) { currentlyManaged = dw->priv->managed && !dw->priv->unmanaging; visible = !(dw->state () & CompWindowStateHiddenMask); acceptableType = !(dw->type () & (CompWindowTypeFullscreenMask | CompWindowTypeDockMask)); if (currentlyManaged && visible && acceptableType && !dww->overrideRedirect () && dww->isViewable () && existsOnServer (dww, lock)) { belowDocks = dww; break; } } } } if (belowDocks) { *mask = CWSibling | CWStackMode; xwc->sibling = ROOTPARENT (belowDocks); /* Collect all dock windows first */ foreach (CompWindow *dw, screen->serverWindows ()) if (dw->priv->type & CompWindowTypeDockMask) updateList.push_front (dw); return true; } return false; } bool PrivateWindow::stackTransients (CompWindow *w, CompWindow *avoid, XWindowChanges *xwc, CompWindowList &updateList, const ServerLock &lock) { Window clientLeader = w->priv->clientLeader; if (w->priv->transientFor || w->priv->isGroupTransient (clientLeader)) clientLeader = None; for (CompWindow *t = screen->serverWindows ().back (); t; t = t->serverPrev) { if (t == w || t == avoid) continue; if (t->priv->transientFor == w->priv->id || t->priv->isGroupTransient (clientLeader)) { if (!stackTransients (t, avoid, xwc, updateList, lock) || xwc->sibling == t->priv->id || (t->priv->serverFrame && xwc->sibling == t->priv->serverFrame)) return false; if ((t->priv->mapNum || t->priv->pendingMaps) && existsOnServer (t, lock)) updateList.push_back (t); } } return true; } void PrivateWindow::stackAncestors (CompWindow *w, XWindowChanges *xwc, CompWindowList &updateList, const ServerLock &lock) { CompWindow *transient = NULL; if (w->priv->transientFor) transient = screen->findWindow (w->priv->transientFor); if (transient && xwc->sibling != transient->priv->id && (!transient->priv->serverFrame || xwc->sibling != transient->priv->serverFrame)) { CompWindow *ancestor = screen->findWindow (w->priv->transientFor); if (ancestor) { if (!stackTransients (ancestor, w, xwc, updateList, lock) || ancestor->priv->type & CompWindowTypeDesktopMask || (ancestor->priv->type & CompWindowTypeDockMask && !(w->priv->type & CompWindowTypeDockMask))) return; if ((ancestor->priv->mapNum || ancestor->priv->pendingMaps) && existsOnServer (ancestor, lock)) updateList.push_back (ancestor); stackAncestors (ancestor, xwc, updateList, lock); } } else if (w->priv->isGroupTransient (w->priv->clientLeader)) { for (CompWindow *a = screen->serverWindows ().back (); a; a = a->serverPrev) { if (a->priv->clientLeader == w->priv->clientLeader && a->priv->transientFor == None && !a->priv->isGroupTransient (w->priv->clientLeader)) { if (xwc->sibling == a->priv->id || (a->priv->serverFrame && xwc->sibling == a->priv->serverFrame) || !stackTransients (a, w, xwc, updateList, lock)) break; if (a->priv->type & CompWindowTypeDesktopMask) continue; if (a->priv->type & CompWindowTypeDockMask && !(w->priv->type & CompWindowTypeDockMask)) break; if ((a->priv->mapNum || a->priv->pendingMaps) && existsOnServer (a, lock)) updateList.push_back (a); } } } } void CompWindow::configureXWindow (unsigned int valueMask, XWindowChanges *xwc) { if (valueMask & (CWSibling | CWStackMode)) compLogMessage ("core", CompLogLevelWarn, "use CompWindow::restackAndConfigureXWindow " \ "while holding a ServerLock from the time the "\ "sibling is determined to the end of that operation "\ "to avoid race conditions when restacking relative "\ "to destroyed windows for which we have not yet "\ "received a DestroyNotify for"); if (priv->id) priv->reconfigureXWindow (valueMask, xwc); } void CompWindow::restackAndConfigureXWindow (unsigned int valueMask, XWindowChanges *xwc, const ServerLock &lock) { if (priv->managed && (valueMask & (CWSibling | CWStackMode))) { CompWindowList transients; CompWindowList ancestors; CompWindowList docks; /* Since the window list is being reordered in reconfigureXWindow the list of windows which need to be restacked must be stored first. The windows are stacked in the opposite order than they were previously stacked, in order that they are above xwc->sibling so that when compiz gets the ConfigureNotify event it doesn't have to restack all the windows again. */ /* transient children above */ if (PrivateWindow::stackTransients (this, NULL, xwc, transients, lock)) { /* ancestors, siblings and sibling transients below */ PrivateWindow::stackAncestors (this, xwc, ancestors, lock); for (CompWindowList::reverse_iterator w = ancestors.rbegin (); w != ancestors.rend (); ++w) { (*w)->priv->reconfigureXWindow (CWSibling | CWStackMode, xwc); xwc->sibling = ROOTPARENT (*w); } this->priv->reconfigureXWindow (valueMask, xwc); xwc->sibling = ROOTPARENT (this); for (CompWindowList::reverse_iterator w = transients.rbegin (); w != transients.rend (); ++w) { (*w)->priv->reconfigureXWindow (CWSibling | CWStackMode, xwc); xwc->sibling = ROOTPARENT (*w); } if (PrivateWindow::stackDocks (this, docks, xwc, &valueMask, lock)) { Window sibling = xwc->sibling; xwc->stack_mode = Above; /* Then update the dock windows */ foreach (CompWindow *dw, docks) { xwc->sibling = sibling; dw->priv->reconfigureXWindow (valueMask, xwc); } } } } else if (priv->id) priv->reconfigureXWindow (valueMask, xwc); } int PrivateWindow::addWindowSizeChanges (XWindowChanges *xwc, CompWindow::Geometry old) { int mask = 0; CompPoint viewport; if (old.intersects (CompRect (0, 0, screen->width (), screen->height ()))) viewport = screen->vp (); else screen->viewportForGeometry (old, viewport); int x = (viewport.x () - screen->vp ().x ()) * screen->width (); int y = (viewport.y () - screen->vp ().y ()) * screen->height (); CompOutput *output = &screen->outputDevs ().at (screen->outputDeviceForGeometry (old)); /* * output is now the correct output for the given geometry. * There used to be a lot more logic here to handle the rare special * case of maximizing a window whose hints say it is too large to fit * the output and choose a different one. However that logic was a bad * idea because: * (1) It's confusing to the user to auto-magically move a window * between monitors when they didn't ask for it. So don't. * (2) In the worst case where the window can't go small enough to fit * the output, they can simply move it with Alt+drag, Alt+F7 or * expo. * Not moving the window at all is much less annoying than moving it when * the user never asked to. */ CompRect workArea = output->workArea (); if (type & CompWindowTypeFullscreenMask) { saveGeometry (CWX | CWY | CWWidth | CWHeight | CWBorderWidth); if (fullscreenMonitorsSet) { xwc->x = x + fullscreenMonitorRect.x (); xwc->y = y + fullscreenMonitorRect.y (); xwc->width = fullscreenMonitorRect.width (); xwc->height = fullscreenMonitorRect.height (); } else { xwc->x = x + output->x (); xwc->y = y + output->y (); xwc->width = output->width (); xwc->height = output->height (); } xwc->border_width = 0; mask |= CWX | CWY | CWWidth | CWHeight | CWBorderWidth; } else { mask |= restoreGeometry (xwc, CWBorderWidth); if (state & CompWindowStateMaximizedVertMask) { saveGeometry (CWY | CWHeight); xwc->height = workArea.height () - border.top - border.bottom - old.border () * 2; mask |= CWHeight; } else mask |= restoreGeometry (xwc, CWY | CWHeight); if (state & CompWindowStateMaximizedHorzMask) { saveGeometry (CWX | CWWidth); xwc->width = workArea.width () - border.left - border.right - old.border () * 2; mask |= CWWidth; } else mask |= restoreGeometry (xwc, CWX | CWWidth); /* Check to see if a monitor has disappeared that had a maximized window and if so, * adjust the window to restore in the current viewport instead of the * coordinates of a different viewport. */ if (window->moved () && !(state & CompWindowStateMaximizedVertMask || state & CompWindowStateMaximizedHorzMask)) { if (xwc->x > screen->width () || xwc->y > screen->height ()) { /* The removed monitor may have had a much different resolution than the * the current monitor, so let's just orient the window in the top left * of the workarea. */ xwc->x = workArea.x () + window->border ().left; xwc->y = workArea.y () + window->border ().top; if (xwc->width > workArea.width ()) xwc->width = workArea.width () - (window->border ().left + window->border ().right); if (xwc->height > workArea.height ()) xwc->height = workArea.height () - (window->border ().top + window->border ().bottom); } window->priv->moved = false; } /* constrain window width if smaller than minimum width */ if (!(mask & CWWidth) && (int) old.width () < sizeHints.min_width) { xwc->width = sizeHints.min_width; mask |= CWWidth; } /* constrain window width if greater than maximum width */ if (!(mask & CWWidth) && (int) old.width () > sizeHints.max_width) { xwc->width = sizeHints.max_width; mask |= CWWidth; } /* constrain window height if smaller than minimum height */ if (!(mask & CWHeight) && (int) old.height () < sizeHints.min_height) { xwc->height = sizeHints.min_height; mask |= CWHeight; } /* constrain window height if greater than maximum height */ if (!(mask & CWHeight) && (int) old.height () > sizeHints.max_height) { xwc->height = sizeHints.max_height; mask |= CWHeight; } if (mask & (CWWidth | CWHeight)) { int max; int width = (mask & CWWidth) ? xwc->width : old.width (); int height = (mask & CWHeight) ? xwc->height : old.height (); xwc->width = old.width (); xwc->height = old.height (); window->constrainNewWindowSize (width, height, &width, &height); if (width != (int) old.width ()) { mask |= CWWidth; xwc->width = width; } else mask &= ~CWWidth; if (height != (int) old.height ()) { mask |= CWHeight; xwc->height = height; } else mask &= ~CWHeight; if (state & CompWindowStateMaximizedVertMask) { /* If the window is still offscreen, then we need to constrain it * by the gravity value (so that the corner that the gravity specifies * is 'anchored' to that edge of the workarea) */ xwc->y = y + workArea.y () + border.top; mask |= CWY; switch (priv->sizeHints.win_gravity) { case SouthWestGravity: case SouthEastGravity: case SouthGravity: /* Shift the window so that the bottom meets the top of the bottom */ height = xwc->height + old.border () * 2; max = y + workArea.bottom (); if (xwc->y + xwc->height + border.bottom > max) { xwc->y = max - height - border.bottom; mask |= CWY; } break; /* TODO: check if this is correct: * For EastGravity, WestGravity and CenterGravity we default to the top * of the window since the user should at least be able to close it * (but not for SouthGravity, SouthWestGravity and SouthEastGravity since * that indicates that the application has requested positioning in that area) */ case EastGravity: case WestGravity: case CenterGravity: case NorthWestGravity: case NorthEastGravity: case NorthGravity: default: /* Shift the window so that the top meets the top of the screen */ break; } } if (state & CompWindowStateMaximizedHorzMask) { xwc->x = x + workArea.x () + border.left; mask |= CWX; switch (priv->sizeHints.win_gravity) { case NorthEastGravity: case SouthEastGravity: case EastGravity: width = xwc->width + old.border () * 2; max = x + workArea.right (); if (old.x () + (int) old.width () + border.right > max) { xwc->x = max - width - border.right; mask |= CWX; } else if (old.x () + width + border.right > max) { xwc->x = x + workArea.x () + (workArea.width () - border.left - width - border.right) / 2 + border.left; mask |= CWX; } /* TODO: check if this is correct, note that there is no break here: * For NorthGravity, SouthGravity and CenterGravity we default to the top * of the window since the user should at least be able to close it * (but not for SouthGravity, SouthWestGravity and SouthEastGravity since * that indicates that the application has requested positioning in that area) */ case NorthGravity: case SouthGravity: case CenterGravity: case NorthWestGravity: case SouthWestGravity: case WestGravity: default: break; } } } } if ((mask & CWX) && (xwc->x == old.x ())) mask &= ~CWX; if ((mask & CWY) && (xwc->y == old.y ())) mask &= ~CWY; if ((mask & CWWidth) && (xwc->width == (int) old.width ())) mask &= ~CWWidth; if ((mask & CWHeight) && (xwc->height == (int) old.height ())) mask &= ~CWHeight; return mask; } unsigned int PrivateWindow::adjustConfigureRequestForGravity (XWindowChanges *xwc, unsigned int xwcm, int gravity, int direction) { unsigned int mask = 0; int newX = xwc->x; int newY = xwc->y; if (xwcm & (CWX | CWWidth)) { switch (gravity) { case NorthWestGravity: case WestGravity: case SouthWestGravity: if (xwcm & CWX) newX += priv->border.left * direction; break; case NorthGravity: case CenterGravity: case SouthGravity: if (xwcm & CWX) newX -= (xwc->width / 2 - priv->border.left + (priv->border.left + priv->border.right) / 2) * direction; else newX -= (xwc->width - priv->serverGeometry.width ()) * direction; break; case NorthEastGravity: case EastGravity: case SouthEastGravity: if (xwcm & CWX) newX -= xwc->width + priv->border.right * direction; else newX -= (xwc->width - priv->serverGeometry.width ()) * direction; break; case StaticGravity: default: break; } } if (xwcm & (CWY | CWHeight)) { switch (gravity) { case NorthWestGravity: case NorthGravity: case NorthEastGravity: if (xwcm & CWY) newY = xwc->y + priv->border.top * direction; break; case WestGravity: case CenterGravity: case EastGravity: if (xwcm & CWY) newY -= (xwc->height / 2 - priv->border.top + (priv->border.top + priv->border.bottom) / 2) * direction; else newY -= ((xwc->height - priv->serverGeometry.height ()) / 2) * direction; break; case SouthWestGravity: case SouthGravity: case SouthEastGravity: if (xwcm & CWY) newY -= xwc->height + priv->border.bottom * direction; else newY -= (xwc->height - priv->serverGeometry.height ()) * direction; break; case StaticGravity: default: break; } } if (newX != xwc->x) { xwc->x += (newX - xwc->x); mask |= CWX; } if (newY != xwc->y) { xwc->y += (newY - xwc->y); mask |= CWY; } return mask; } void CompWindow::moveResize (XWindowChanges *xwc, unsigned int xwcm, int gravity, unsigned int source) { bool placed = false; xwcm &= (CWX | CWY | CWWidth | CWHeight | CWBorderWidth); if (xwcm & (CWX | CWY) && priv->sizeHints.flags & (USPosition | PPosition)) placed = true; if (gravity == 0) gravity = priv->sizeHints.win_gravity; if (!(xwcm & CWX)) xwc->x = priv->serverGeometry.x (); if (!(xwcm & CWY)) xwc->y = priv->serverGeometry.y (); if (!(xwcm & CWWidth)) xwc->width = priv->serverGeometry.width (); if (!(xwcm & CWHeight)) xwc->height = priv->serverGeometry.height (); if (xwcm & (CWWidth | CWHeight)) { int width, height; if (constrainNewWindowSize (xwc->width, xwc->height, &width, &height)) { if (width != xwc->width) xwcm |= CWWidth; if (height != xwc->height) xwcm |= CWHeight; xwc->width = width; xwc->height = height; } } xwcm |= priv->adjustConfigureRequestForGravity (xwc, xwcm, gravity, 1); validateResizeRequest (xwcm, xwc, source); /* when horizontally maximized only allow width changes added by addWindowSizeChanges */ if (priv->state & CompWindowStateMaximizedHorzMask) xwcm &= ~CWWidth; /* when vertically maximized only allow height changes added by addWindowSizeChanges */ if (priv->state & CompWindowStateMaximizedVertMask) xwcm &= ~CWHeight; xwcm |= priv->addWindowSizeChanges (xwc, Geometry (xwc->x, xwc->y, xwc->width, xwc->height, xwc->border_width)); /* check if the new coordinates are useful and valid (different to current size); if not, we have to clear them to make sure we send a synthetic ConfigureNotify event if all coordinates match the server coordinates */ if (xwc->x == priv->serverGeometry.x ()) xwcm &= ~CWX; if (xwc->y == priv->serverGeometry.y ()) xwcm &= ~CWY; if (xwc->width == (int) priv->serverGeometry.width ()) xwcm &= ~CWWidth; if (xwc->height == (int) priv->serverGeometry.height ()) xwcm &= ~CWHeight; if (xwc->border_width == (int) priv->serverGeometry.border ()) xwcm &= ~CWBorderWidth; /* update saved window coordinates - if CWX or CWY is set for fullscreen or maximized windows after addWindowSizeChanges, it should be pretty safe to assume that the saved coordinates should be updated too, e.g. because the window was moved to another viewport by some client */ if ((xwcm & CWX) && (priv->saveMask & CWX)) priv->saveWc.x += (xwc->x - priv->serverGeometry.x ()); if ((xwcm & CWY) && (priv->saveMask & CWY)) priv->saveWc.y += (xwc->y - priv->serverGeometry.y ()); if (priv->mapNum && (xwcm & (CWWidth | CWHeight))) sendSyncRequest (); if (xwcm) configureXWindow (xwcm, xwc); else /* we have to send a configure notify on ConfigureRequest events if we decide not to do anything according to ICCCM 4.1.5 */ sendConfigureNotify (); if (placed) priv->placed = true; } bool PrivateWindow::updateSize () { if (window->overrideRedirect () || !managed) return false; XWindowChanges xwc = XWINDOWCHANGES_INIT; int mask = priv->addWindowSizeChanges (&xwc, priv->serverGeometry); if (mask) { if (priv->mapNum && (mask & (CWWidth | CWHeight))) window->sendSyncRequest (); window->configureXWindow (mask, &xwc); return true; } return false; } int PrivateWindow::addWindowStackChanges (XWindowChanges *xwc, CompWindow *sibling, const ServerLock &lock) { int mask = 0; if (!sibling || sibling->priv->id != id) { /* Alow requests to go on top of serverPrev * if serverPrev was recently restacked */ if (window->serverPrev) { if (!sibling && id) { XWindowChanges lxwc = XWINDOWCHANGES_INIT; unsigned int valueMask = CWStackMode; lxwc.stack_mode = Below; if (serverFrame) { compiz::X11::PendingEvent::Ptr pc (new compiz::X11::PendingConfigureEvent ( screen->dpy (), serverFrame, valueMask, &lxwc)); pendingConfigures.add (pc); } /* Below with no sibling puts the window at the bottom * of the stack */ XConfigureWindow (screen->dpy (), ROOTPARENT (window), valueMask, &lxwc); /* Update the list of windows last sent to the server */ screen->unhookServerWindow (window); screen->insertServerWindow (window, 0); } else if (sibling) { bool matchingRequest = priv->pendingConfigures.forEachIf (boost::bind (isExistingRequest, _1, *xwc, (CWStackMode | CWSibling))); bool restackPending = window->serverPrev->priv->pendingConfigures.forEachIf (boost::bind (isPendingRestack, _1)); bool processAnyways = restackPending; if (matchingRequest) processAnyways = false; if (sibling->priv->id != window->serverPrev->priv->id || processAnyways) { mask |= CWSibling | CWStackMode; xwc->stack_mode = Above; xwc->sibling = ROOTPARENT (sibling); } } } else if (sibling) { mask |= CWSibling | CWStackMode; xwc->stack_mode = Above; xwc->sibling = ROOTPARENT (sibling); } } return mask; } void CompWindow::raise () { XWindowChanges xwc = XWINDOWCHANGES_INIT; int mask; bool aboveFs = false; /* an active fullscreen window should be raised over all other windows in its layer */ if (priv->type & CompWindowTypeFullscreenMask && priv->id == screen->activeWindow ()) aboveFs = true; for (CompWindow *pw = serverPrev; pw; pw = pw->serverPrev) if (pw->priv->type & CompWindowTypeFullscreenMask && priv->id == screen->activeWindow ()) aboveFs = true; else break; ServerLock lock (screen->serverGrabInterface ()); mask = priv->addWindowStackChanges (&xwc, PrivateWindow::findSiblingBelow (this, aboveFs, lock), lock); if (mask) restackAndConfigureXWindow (mask, &xwc, lock); } CompWindow * CompScreenImpl::focusTopMostWindow () { using ::compiz::private_screen::WindowManager; CompWindow *focus = NULL; WindowManager::reverse_iterator it = windowManager.rserverBegin (); for (; it != windowManager.rserverEnd (); ++it) { CompWindow *w = *it; if (w->type () & CompWindowTypeDockMask) continue; if (w->focus ()) { focus = w; break; } } if (focus) { if (focus->id () != privateScreen.orphanData.activeWindow) focus->moveInputFocusTo (); } else XSetInputFocus (privateScreen.dpy, privateScreen.rootWindow (), RevertToPointerRoot, CurrentTime); return focus; } void CompWindow::lower () { XWindowChanges xwc = XWINDOWCHANGES_INIT; ServerLock lock (screen->serverGrabInterface ()); int mask = priv->addWindowStackChanges (&xwc, PrivateWindow::findLowestSiblingBelow (this, lock), lock); if (mask) restackAndConfigureXWindow (mask, &xwc, lock); /* when lowering a window, focus the topmost window if the click-to-focus option is on */ if ((screen->getCoreOptions ().optionGetClickToFocus ())) { CompWindow *focusedWindow = screen->focusTopMostWindow (); /* if the newly focused window is a desktop window, give the focus back to w */ if (focusedWindow && focusedWindow->type () & CompWindowTypeDesktopMask) moveInputFocusTo (); } } void CompWindow::restackAbove (CompWindow *sibling) { ServerLock lock (screen->serverGrabInterface ()); for (; sibling; sibling = sibling->serverNext) if (PrivateWindow::validSiblingBelow (this, sibling, lock)) break; if (sibling) { XWindowChanges xwc = XWINDOWCHANGES_INIT; int mask = priv->addWindowStackChanges (&xwc, sibling, lock); if (mask) restackAndConfigureXWindow (mask, &xwc, lock); } } /* finds the highest window under sibling we can stack above */ CompWindow * PrivateWindow::findValidStackSiblingBelow (CompWindow *w, CompWindow *sibling, const ServerLock &lock) { CompWindow *lowest, *last, *p; /* check whether we're allowed to stack under a sibling by finding * the above 'sibling' and checking whether or not we're allowed * to stack under that - if not, then there is no valid sibling * underneath it */ for (p = sibling; p; p = p->serverNext) if (!avoidStackingRelativeTo (p, lock) && !validSiblingBelow (p, w, lock)) return NULL; else break; /* get lowest sibling we're allowed to stack above */ lowest = last = findLowestSiblingBelow (w, lock); /* walk from bottom up */ for (p = screen->serverWindows ().front (); p; p = p->serverNext) { /* stop walking when we reach the sibling we should try to stack below */ if (p == sibling) return lowest; /* skip windows that we should avoid */ if (w == p || avoidStackingRelativeTo (p, lock)) continue; if (validSiblingBelow (w, p, lock) && last == lowest) /* update lowest as we find windows below sibling that we're allowed to stack above. last window must be equal to the lowest as we shouldn't update lowest if we passed an invalid window */ lowest = p; /* update last pointer */ last = p; } return lowest; } void CompWindow::restackBelow (CompWindow *sibling) { XWindowChanges xwc = XWINDOWCHANGES_INIT; ServerLock lock (screen->serverGrabInterface ()); unsigned int mask = priv->addWindowStackChanges (&xwc, PrivateWindow::findValidStackSiblingBelow (this, sibling, lock), lock); if (mask) restackAndConfigureXWindow (mask, &xwc, lock); } namespace { void addSizeChangesSyncAndReconfigure (PrivateWindow *priv, XWindowChanges &xwc, unsigned int mask, ServerLock *lock) { mask |= priv->addWindowSizeChanges (&xwc, priv->serverGeometry); if (priv->mapNum && (mask & (CWWidth | CWHeight))) priv->window->sendSyncRequest (); if (mask) { if (lock) priv->window->restackAndConfigureXWindow (mask, &xwc, *lock); else priv->window->configureXWindow (mask, &xwc); } } } void CompWindow::updateAttributes (CompStackingUpdateMode stackingMode) { if (overrideRedirect () || !priv->managed) return; XWindowChanges xwc = XWINDOWCHANGES_INIT; int mask = 0; if (priv->state & CompWindowStateShadedMask && !priv->shaded) { windowNotify (CompWindowNotifyShade); priv->hide (); } else if (priv->shaded) { windowNotify (CompWindowNotifyUnshade); priv->show (); } if (stackingMode != CompStackingUpdateModeNone) { CompWindow *sibling; bool aboveFs = (stackingMode == CompStackingUpdateModeAboveFullscreen); if (priv->type & CompWindowTypeFullscreenMask && /* put active or soon-to-be-active fullscreen windows over all others in their layer */ (priv->id == screen->activeWindow () || priv->id == screen->getNextActiveWindow ())) aboveFs = true; /* put windows that are just mapped, over fullscreen windows */ if (stackingMode == CompStackingUpdateModeInitialMap) aboveFs = true; ServerLock lock (screen->serverGrabInterface ()); sibling = PrivateWindow::findSiblingBelow (this, aboveFs, lock); if (sibling && (stackingMode == CompStackingUpdateModeInitialMapDeniedFocus)) { CompWindow *p; for (p = sibling; p; p = p->serverPrev) if (p->priv->id == screen->activeWindow ()) break; /* window is above active window so we should lower it, * assuing that is allowed (if, for example, our window has * the "above" state, then lowering beneath the active * window may not be allowed). */ if (p && PrivateWindow::validSiblingBelow (p, this, lock)) { p = PrivateWindow::findValidStackSiblingBelow (this, p, lock); /* if we found a valid sibling under the active window, it's our new sibling we want to stack above */ if (p) sibling = p; } } /* If sibling is NULL, then this window will go on the bottom * of the stack */ mask |= priv->addWindowStackChanges (&xwc, sibling, lock); addSizeChangesSyncAndReconfigure (priv, xwc, mask, &lock); } else addSizeChangesSyncAndReconfigure (priv, xwc, mask, NULL); } void PrivateWindow::ensureWindowVisibility () { if (struts || attrib.override_redirect) return; if (type & (CompWindowTypeDockMask | CompWindowTypeFullscreenMask | CompWindowTypeUnknownMask)) return; int x1 = screen->workArea ().x () - screen->width () * screen->vp ().x (); int y1 = screen->workArea ().y () - screen->height () * screen->vp ().y (); int x2 = x1 + screen->workArea ().width () + screen->vpSize ().width () * screen->width (); int y2 = y1 + screen->workArea ().height () + screen->vpSize ().height () * screen->height (); int dx = 0; int width = serverGeometry.widthIncBorders (); // TODO: Eliminate those magic numbers below if (serverGeometry.x () - serverInput.left >= x2) dx = (x2 - 25) - serverGeometry.x (); else if (serverGeometry.x () + width + serverInput.right <= x1) dx = (x1 + 25) - (serverGeometry.x () + width); int dy = 0; int height = serverGeometry.heightIncBorders (); if (serverGeometry.y () - serverInput.top >= y2) dy = (y2 - 25) - serverGeometry.y (); else if (serverGeometry.y () + height + serverInput.bottom <= y1) dy = (y1 + 25) - (serverGeometry.y () + height); if (dx || dy) { XWindowChanges xwc = XWINDOWCHANGES_INIT; xwc.x = serverGeometry.x () + dx; xwc.y = serverGeometry.y () + dy; window->configureXWindow (CWX | CWY, &xwc); } } void PrivateWindow::reveal () { if (window->minimized ()) window->unminimize (); } void PrivateWindow::revealAncestors (CompWindow *w, CompWindow *transient) { if (isAncestorTo (transient, w)) { screen->forEachWindow (boost::bind (revealAncestors, _1, w)); w->priv->reveal (); } } void CompWindow::activate () { WRAPABLE_HND_FUNCTN (activate) screen->setCurrentDesktop (priv->desktop); screen->forEachWindow (boost::bind (PrivateWindow::revealAncestors, _1, this)); priv->reveal (); screen->leaveShowDesktopMode (this); if (priv->state & CompWindowStateHiddenMask) { priv->state &= ~CompWindowStateShadedMask; if (priv->shaded) priv->show (); } if (priv->state & CompWindowStateHiddenMask || !onCurrentDesktop ()) return; priv->ensureWindowVisibility (); updateAttributes (CompStackingUpdateModeAboveFullscreen); moveInputFocusTo (); } #define PVertResizeInc (1 << 0) #define PHorzResizeInc (1 << 1) bool CompWindow::constrainNewWindowSize (int width, int height, int *newWidth, int *newHeight) { CompSize size (width, height); long ignoredHints = 0; long ignoredResizeHints = 0; if (screen->getCoreOptions ().optionGetIgnoreHintsWhenMaximized ()) { ignoredHints |= PAspect; if (priv->state & CompWindowStateMaximizedHorzMask) ignoredResizeHints |= PHorzResizeInc; if (priv->state & CompWindowStateMaximizedVertMask) ignoredResizeHints |= PVertResizeInc; } CompSize ret = compiz::window::constrainment::constrainToHints (priv->sizeHints, size, ignoredHints, ignoredResizeHints); *newWidth = ret.width (); *newHeight = ret.height (); return ret != size; } void CompWindow::hide () { priv->hidden = true; priv->hide (); } void CompWindow::show () { priv->hidden = false; priv->show (); } void PrivateWindow::hide () { if (!managed) return; bool onDesktop = window->onCurrentDesktop (); if (!window->minimized () && !inShowDesktopMode && !hidden && onDesktop) { if (state & CompWindowStateShadedMask) shaded = true; else return; } else { shaded = false; if ((state & CompWindowStateShadedMask) && serverFrame) XUnmapWindow (screen->dpy (), serverFrame); } if (!pendingMaps && !window->isViewable ()) return; window->windowNotify (CompWindowNotifyHide); ++pendingUnmaps; if (serverFrame && !shaded) XUnmapWindow (screen->dpy (), serverFrame); XUnmapWindow (screen->dpy (), id); if (window->minimized () || inShowDesktopMode || hidden || shaded) window->changeState (state | CompWindowStateHiddenMask); if (shaded && id == screen->activeWindow ()) window->moveInputFocusTo (); } void PrivateWindow::show () { if (!managed) return; bool onDesktop = window->onCurrentDesktop (); if (minimized || inShowDesktopMode || hidden || !onDesktop) { /* no longer hidden but not on current desktop */ if (!minimized && !inShowDesktopMode && !hidden) window->changeState (state & ~CompWindowStateHiddenMask); return; } /* transition from minimized to shaded */ if (state & CompWindowStateShadedMask) { shaded = true; if (serverFrame) XMapWindow (screen->dpy (), serverFrame); updateFrameWindow (); return; } window->windowNotify (CompWindowNotifyShow); ++pendingMaps; if (serverFrame) { XMapWindow (screen->dpy (), serverFrame); XMapWindow (screen->dpy (), wrapper); } XMapWindow (screen->dpy (), id); window->changeState (state & ~CompWindowStateHiddenMask); screen->setWindowState (state, id); } void PrivateWindow::minimizeTransients (CompWindow *w, CompWindow *ancestor) { if (w->priv->transientFor == ancestor->priv->id || w->priv->isGroupTransient (ancestor->priv->clientLeader)) w->minimize (); } void CompWindow::minimize () { WRAPABLE_HND_FUNCTN (minimize); if (!priv->managed) return; if (!priv->minimized) { windowNotify (CompWindowNotifyMinimize); priv->minimized = true; screen->forEachWindow ( boost::bind (PrivateWindow::minimizeTransients, _1, this)); priv->hide (); } } void PrivateWindow::unminimizeTransients (CompWindow *w, CompWindow *ancestor) { if (w->priv->transientFor == ancestor->priv->id || w->priv->isGroupTransient (ancestor->priv->clientLeader)) w->unminimize (); } void CompWindow::unminimize () { WRAPABLE_HND_FUNCTN (unminimize); if (priv->minimized) { windowNotify (CompWindowNotifyUnminimize); priv->minimized = false; priv->show (); screen->forEachWindow ( boost::bind (PrivateWindow::unminimizeTransients, _1, this)); } } void CompWindow::maximize (unsigned int state) { if (overrideRedirect ()) return; state = constrainWindowState (state, priv->actions); state &= MAXIMIZE_STATE; if (state == (priv->state & MAXIMIZE_STATE)) return; state |= (priv->state & ~MAXIMIZE_STATE); changeState (state); updateAttributes (CompStackingUpdateModeNone); } bool PrivateWindow::getUserTime (Time& time) { Atom actual; int format; unsigned long n, left; unsigned char *data; bool retval = false; int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::wmUserTime, 0L, 1L, False, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) { CARD32 value; memcpy (&value, data, sizeof (CARD32)); retval = true; time = (Time) value; } XFree ((void *) data); } return retval; } void PrivateWindow::setUserTime (Time time) { CARD32 value = (CARD32) time; XChangeProperty (screen->dpy (), priv->id, Atoms::wmUserTime, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &value, 1); } /* * Macros from metacity * * Xserver time can wraparound, thus comparing two timestamps needs to * take this into account. Here's a little macro to help out. If no * wraparound has occurred, this is equivalent to * time1 < time2 * Of course, the rest of the ugliness of this macro comes from * accounting for the fact that wraparound can occur and the fact that * a timestamp of 0 must be special-cased since it means older than * anything else. * * Note that this is NOT an equivalent for time1 <= time2; if that's * what you need then you'll need to swap the order of the arguments * and negate the result. */ #define XSERVER_TIME_IS_BEFORE_ASSUMING_REAL_TIMESTAMPS(time1, time2) \ ( (( (time1) < (time2) ) && \ ( (time2) - (time1) < ((unsigned long) -1) / 2 )) || \ (( (time1) > (time2) ) && \ ( (time1) - (time2) > ((unsigned long) -1) / 2 )) \ ) #define XSERVER_TIME_IS_BEFORE(time1, time2) \ ( (time1) == 0 || \ (XSERVER_TIME_IS_BEFORE_ASSUMING_REAL_TIMESTAMPS (time1, time2) && \ (time2) != 0) \ ) bool PrivateWindow::getUsageTimestamp (Time& timestamp) { if (getUserTime (timestamp)) return true; if (initialTimestampSet) { timestamp = initialTimestamp; return true; } return false; } bool PrivateWindow::isWindowFocusAllowed (Time timestamp) { CompScreen *s = screen; CompWindow *active; Time wUserTime, aUserTime; bool gotTimestamp = false; CompPoint dvp; int level = s->getCoreOptions ().optionGetFocusPreventionLevel (); if (level == CoreOptions::FocusPreventionLevelOff) return true; if (timestamp) { /* the caller passed a timestamp, so use that instead of the window's user time */ wUserTime = timestamp; gotTimestamp = true; } else gotTimestamp = getUsageTimestamp (wUserTime); /* if we got no timestamp for the window, try to get at least a timestamp for its transient parent, if any */ if (!gotTimestamp && transientFor) { CompWindow *parent = screen->findWindow (transientFor); if (parent) gotTimestamp = parent->priv->getUsageTimestamp (wUserTime); } if (gotTimestamp && !wUserTime) /* window explicitly requested no focus */ return false; /* allow focus for excluded windows */ CompMatch &match = s->getCoreOptions ().optionGetFocusPreventionMatch (); if (!match.evaluate (window)) return true; if (level == CoreOptions::FocusPreventionLevelVeryHigh) return false; active = s->findWindow (s->activeWindow ()); /* no active window */ if (!active || (active->type () & CompWindowTypeDesktopMask) || /* active window belongs to same application */ window->clientLeader () == active->clientLeader ()) return true; if (level == CoreOptions::FocusPreventionLevelHigh) return false; /* not in current viewport or desktop */ if (!window->onCurrentDesktop ()) return false; dvp = window->defaultViewport (); if (dvp.x () != s->vp ().x () || dvp.y () != s->vp ().y ()) return false; if (!gotTimestamp) { /* unsure as we have nothing to compare - allow focus in low level, don't allow in normal level */ if (level == CoreOptions::FocusPreventionLevelNormal) return false; return true; } /* can't get user time for active window */ if (!active->priv->getUserTime (aUserTime)) return true; if (XSERVER_TIME_IS_BEFORE (wUserTime, aUserTime)) return false; return true; } bool PrivateWindow::allowWindowFocus (unsigned int noFocusMask, Time timestamp) { if (priv->id == screen->activeWindow ()) return true; /* do not focus windows of these types */ if (priv->type & noFocusMask || /* window doesn't take focus */ !(priv->inputHint || priv->protocols & CompWindowProtocolTakeFocusMask)) return false; bool retval = priv->isWindowFocusAllowed (timestamp); /* add demands attention state if focus was prevented */ if (!retval) window->changeState (priv->state | CompWindowStateDemandsAttentionMask); return retval; } CompPoint CompWindow::defaultViewport () const { CompPoint viewport; if (priv->serverGeometry.x () < (int) screen->width () && priv->serverGeometry.y () < (int) screen->height () && priv->serverGeometry.x () + priv->serverGeometry.width () > 0 && priv->serverGeometry.y () + priv->serverGeometry.height () > 0) return screen->vp (); screen->viewportForGeometry (priv->serverGeometry, viewport); return viewport; } const CompPoint & CompWindow::initialViewport () const { return priv->initialViewport; } void PrivateWindow::readIconHint () { XImage *maskImage = NULL; Display *dpy = screen->dpy (); unsigned int width, height, dummy; unsigned int i, j; int iDummy; Window wDummy; if (!XGetGeometry (dpy, hints->icon_pixmap, &wDummy, &iDummy, &iDummy, &width, &height, &dummy, &dummy)) return; XImage *image = XGetImage (dpy, hints->icon_pixmap, 0, 0, width, height, AllPlanes, ZPixmap); if (!image) return; boost::scoped_array colors(new XColor[width * height]); if (!colors) { XDestroyImage (image); return; } unsigned int k = 0; for (j = 0; j < height; ++j) for (i = 0; i < width; ++i) colors[k++].pixel = XGetPixel (image, i, j); for (i = 0; i < k; i += 256) XQueryColors (dpy, screen->colormap (), &colors[i], MIN (k - i, 256)); XDestroyImage (image); CompIcon *icon = new CompIcon (width, height); if (!icon) return; if (hints->flags & IconMaskHint) maskImage = XGetImage (dpy, hints->icon_mask, 0, 0, width, height, AllPlanes, ZPixmap); k = 0; CARD32 *p = (CARD32 *) icon->data (); for (j = 0; j < height; ++j) { for (i = 0; i < width; ++i) { if (maskImage && !XGetPixel (maskImage, i, j)) *p++ = 0; else if (image->depth == 1) /* white : black */ *p++ = colors[k].pixel ? 0xffffffff : 0xff000000; else *p++ = 0xff000000 | /* alpha */ (((colors[k].red >> 8) & 0xff) << 16) | /* red */ (((colors[k].green >> 8) & 0xff) << 8) | /* green */ ((colors[k].blue >> 8) & 0xff); /* blue */ ++k; } } if (maskImage) XDestroyImage (maskImage); icons.push_back (icon); } /* returns icon with dimensions as close as possible to width and height but never greater. */ CompIcon * CompWindow::getIcon (int width, int height) { CompIcon *icon; int wh, diff, oldDiff; unsigned int i; /* need to fetch icon property */ if (priv->icons.size () == 0 && !priv->noIcons) { Atom actual; int format; unsigned long n, left; unsigned char *data; int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::wmIcon, 0L, 65536L, false, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { CARD32 *p; CARD32 alpha, red, green, blue; unsigned long iw, ih; unsigned long *idata; for (i = 0; i + 2 < n; i += iw * ih + 2) { idata = (unsigned long *) data; iw = idata[i]; ih = idata[i + 1]; /* iw * ih may be larger than the value range of unsigned * long, so better do some checking for extremely weird * icon sizes first */ if (iw > 2048 || ih > 2048 || iw * ih + 2 > n - i) break; if (iw && ih) { icon = new CompIcon (iw, ih); if (!icon) continue; priv->icons.push_back (icon); p = (CARD32 *) (icon->data ()); /* EWMH doesn't say if icon data is premultiplied or not but most applications seem to assume data should be unpremultiplied. */ for (unsigned long j = 0; j < iw * ih; ++j) { alpha = (idata[i + j + 2] >> 24) & 0xff; red = (idata[i + j + 2] >> 16) & 0xff; green = (idata[i + j + 2] >> 8) & 0xff; blue = (idata[i + j + 2] >> 0) & 0xff; red = (red * alpha) >> 8; green = (green * alpha) >> 8; blue = (blue * alpha) >> 8; p[j] = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); } } } XFree (data); } else if (priv->hints && (priv->hints->flags & IconPixmapHint)) priv->readIconHint (); /* don't fetch property again */ if (priv->icons.size () == 0) priv->noIcons = true; } /* no icons available for this window */ if (priv->noIcons) return NULL; icon = NULL; wh = width + height; for (i = 0; i < priv->icons.size (); ++i) { const CompSize iconSize = *priv->icons[i]; if ((int) iconSize.width () > width || (int) iconSize.height () > height) continue; if (icon) { diff = wh - (iconSize.width () + iconSize.height ()); oldDiff = wh - (icon->width () + icon->height ()); if (diff < oldDiff) icon = priv->icons[i]; } else icon = priv->icons[i]; } return icon; } const CompRect& CompWindow::iconGeometry () const { return priv->iconGeometry; } void PrivateWindow::freeIcons () { for (unsigned int i = 0; i < priv->icons.size (); ++i) delete priv->icons[i]; priv->icons.resize (0); priv->noIcons = false; } int CompWindow::outputDevice () const { return screen->outputDeviceForGeometry (priv->serverGeometry); } bool CompWindow::onCurrentDesktop () const { if (priv->desktop == 0xffffffff || priv->desktop == screen->currentDesktop ()) return true; return false; } void CompWindow::setDesktop (unsigned int desktop) { if (desktop != 0xffffffff && (priv->type & (CompWindowTypeDesktopMask | CompWindowTypeDockMask) || desktop >= screen->nDesktop ())) return; if (desktop == priv->desktop) return; priv->desktop = desktop; if (desktop == 0xffffffff || desktop == screen->currentDesktop ()) priv->show (); else priv->hide (); screen->setWindowProp (priv->id, Atoms::winDesktop, priv->desktop); } /* The compareWindowActiveness function compares the two windows 'w1' and 'w2'. It returns an integer less than, equal to, or greater than zero if 'w1' is found, respectively, to activated longer time ago than, to be activated at the same time, or be activated more recently than 'w2'. */ int PrivateWindow::compareWindowActiveness (CompWindow *w1, CompWindow *w2) { CompActiveWindowHistory *history = screen->currentHistory (); /* check current window history first */ for (int i = 0; i < ACTIVE_WINDOW_HISTORY_SIZE; ++i) { if (history->id[i] == w1->priv->id) return 1; if (history->id[i] == w2->priv->id) return -1; if (!history->id[i]) break; } return w1->priv->activeNum - w2->priv->activeNum; } bool CompWindow::onAllViewports () const { if (overrideRedirect () || (!priv->managed && !isViewable ()) || priv->type & (CompWindowTypeDesktopMask | CompWindowTypeDockMask) || priv->state & CompWindowStateStickyMask) return true; return false; } CompPoint CompWindow::getMovementForOffset (const CompPoint &offset) const { CompScreen *s = screen; int m; int offX = offset.x (), offY = offset.y (); CompPoint rv; int vWidth = s->width () * s->vpSize ().width (); int vHeight = s->height () * s->vpSize ().height (); offX %= vWidth; offY %= vHeight; /* x */ if (s->vpSize ().width () == 1) rv.setX (offX); else { m = priv->serverGeometry.x () + offX; if (m - priv->serverInput.left < (int) s->width () - vWidth) rv.setX (offX + vWidth); else if (m + priv->serverGeometry.width () + priv->serverInput.right > vWidth) rv.setX (offX - vWidth); else rv.setX (offX); } if (s->vpSize ().height () == 1) rv.setY (offY); else { m = priv->serverGeometry.y () + offY; if (m - priv->serverInput.top < (int) s->height () - vHeight) rv.setY (offY + vHeight); else if (m + priv->serverGeometry.height () + priv->serverInput.bottom > vHeight) rv.setY (offY - vHeight); else rv.setY (offY); } return rv; } void WindowInterface::getOutputExtents (CompWindowExtents& output) WRAPABLE_DEF (getOutputExtents, output) void WindowInterface::getAllowedActions (unsigned int &setActions, unsigned int &clearActions) WRAPABLE_DEF (getAllowedActions, setActions, clearActions) bool WindowInterface::focus () WRAPABLE_DEF (focus) void WindowInterface::activate () WRAPABLE_DEF (activate) bool WindowInterface::place (CompPoint &pos) WRAPABLE_DEF (place, pos) void WindowInterface::validateResizeRequest (unsigned int &mask, XWindowChanges *xwc, unsigned int source) WRAPABLE_DEF (validateResizeRequest, mask, xwc, source) void WindowInterface::resizeNotify (int dx, int dy, int dwidth, int dheight) WRAPABLE_DEF (resizeNotify, dx, dy, dwidth, dheight) void WindowInterface::moveNotify (int dx, int dy, bool immediate) WRAPABLE_DEF (moveNotify, dx, dy, immediate) void WindowInterface::windowNotify (CompWindowNotify n) WRAPABLE_DEF (windowNotify, n) void WindowInterface::grabNotify (int x, int y, unsigned int state, unsigned int mask) WRAPABLE_DEF (grabNotify, x, y, state, mask) void WindowInterface::ungrabNotify () WRAPABLE_DEF (ungrabNotify) void WindowInterface::stateChangeNotify (unsigned int lastState) WRAPABLE_DEF (stateChangeNotify, lastState) void WindowInterface::updateFrameRegion (CompRegion ®ion) WRAPABLE_DEF (updateFrameRegion, region) void WindowInterface::minimize () WRAPABLE_DEF (minimize); void WindowInterface::unminimize () WRAPABLE_DEF (unminimize); bool WindowInterface::minimized () const WRAPABLE_DEF (minimized); bool WindowInterface::alpha () const WRAPABLE_DEF (alpha); bool WindowInterface::isFocussable () const WRAPABLE_DEF (isFocussable); bool WindowInterface::managed () const WRAPABLE_DEF (managed); bool WindowInterface::focused () const WRAPABLE_DEF (focused); Window CompWindow::id () const { return priv->id; } unsigned int CompWindow::type () const { return priv->type; } unsigned int & CompWindow::state () const { return priv->state; } unsigned int CompWindow::actions () const { return priv->actions; } unsigned int & CompWindow::protocols () const { return priv->protocols; } void CompWindow::close (Time serverTime) { if (serverTime == 0) serverTime = screen->getCurrentTime (); if (priv->alive) { if (priv->protocols & CompWindowProtocolDeleteMask) { XEvent ev; ev.type = ClientMessage; ev.xclient.window = priv->id; ev.xclient.message_type = Atoms::wmProtocols; ev.xclient.format = 32; ev.xclient.data.l[0] = Atoms::wmDeleteWindow; ev.xclient.data.l[1] = serverTime; ev.xclient.data.l[2] = 0; ev.xclient.data.l[3] = 0; ev.xclient.data.l[4] = 0; XSendEvent (screen->dpy (), priv->id, false, NoEventMask, &ev); } else XKillClient (screen->dpy (), priv->id); ++priv->closeRequests; } else screen->toolkitAction (Atoms::toolkitActionForceQuitDialog, serverTime, priv->id, true, 0, 0); priv->lastCloseRequestTime = serverTime; } bool PrivateWindow::handlePingTimeout (unsigned int lastPing) { if (!window->isViewable () || !(priv->type & CompWindowTypeNormalMask)) return false; if (priv->protocols & CompWindowProtocolPingMask) { if (priv->transientFor) return false; if (priv->lastPong < lastPing && priv->alive) { priv->alive = false; window->windowNotify (CompWindowNotifyAliveChanged); if (priv->closeRequests) { screen->toolkitAction (Atoms::toolkitActionForceQuitDialog, priv->lastCloseRequestTime, priv->id, true, 0, 0); priv->closeRequests = 0; } } return true; } return false; } void PrivateWindow::handlePing (int lastPing) { if (!priv->alive) { priv->alive = true; window->windowNotify (CompWindowNotifyAliveChanged); if (priv->lastCloseRequestTime) { screen->toolkitAction (Atoms::toolkitActionForceQuitDialog, priv->lastCloseRequestTime, priv->id, false, 0, 0); priv->lastCloseRequestTime = 0; } } priv->lastPong = lastPing; } void PrivateWindow::processMap () { priv->initialViewport = screen->vp (); priv->initialTimestampSet = false; screen->applyStartupProperties (window); bool initiallyMinimized = (priv->hints && priv->hints->initial_state == IconicState && !window->minimized ()); if (!serverFrame && !initiallyMinimized) reparent (); priv->managed = true; if (!initiallyMinimized && !(priv->state & CompWindowStateHiddenMask)) receivedMapRequestAndAwaitingMap = true; if (!priv->placed) { int gravity = priv->sizeHints.win_gravity; XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int xwcm; /* adjust for gravity, but only for frame size */ xwc.x = priv->serverGeometry.x () - priv->border.left; xwc.y = priv->serverGeometry.y () - priv->border.top; xwc.width = 0; xwc.height = 0; xwcm = adjustConfigureRequestForGravity (&xwc, CWX | CWY, gravity, 1); xwc.width = priv->serverGeometry.width (); xwc.height = priv->serverGeometry.height (); /* Validate size */ xwcm |= CWWidth | CWHeight; window->validateResizeRequest (xwcm, &xwc, ClientTypeApplication); CompPoint pos (xwc.x, xwc.y); if (window->place (pos)) { xwc.x = pos.x (); xwc.y = pos.y (); xwcm |= CWX | CWY; } if (xwcm) window->configureXWindow (xwcm, &xwc); priv->placed = true; } CompStackingUpdateMode stackingMode; bool allowFocus = allowWindowFocus (NO_FOCUS_MASK, 0); if (!allowFocus && (priv->type & ~NO_FOCUS_MASK)) stackingMode = CompStackingUpdateModeInitialMapDeniedFocus; else stackingMode = CompStackingUpdateModeInitialMap; window->updateAttributes (stackingMode); if (window->minimized () && !initiallyMinimized) window->unminimize (); screen->leaveShowDesktopMode (window); if (!initiallyMinimized) { if (allowFocus && !window->onCurrentDesktop ()) screen->setCurrentDesktop (priv->desktop); if (!(priv->state & CompWindowStateHiddenMask)) { show (); receivedMapRequestAndAwaitingMap = false; } if (allowFocus) { window->moveInputFocusTo (); if (!window->onCurrentDesktop ()) screen->setCurrentDesktop (priv->desktop); } } else { window->minimize (); window->changeState (window->state () | CompWindowStateHiddenMask); } screen->updateClientList (); } /* * PrivateWindow::updatePassiveButtonGrabs * * Updates the passive button grabs for a window. When * one of the specified button + modifier combinations * for this window is activated, compiz will be given * an active grab for the window (which we can turn off * by calling XAllowEvents later in ::handleEvent) * * NOTE: ICCCM says that we are only allowed to grab * windows that we actually own as a client, so only * grab the frame window. Additionally, although there * isn't anything in the ICCCM that says we cannot * grab every button, some clients do not interpret * EnterNotify and LeaveNotify events caused by the * activation of the grab correctly, so ungrab button * and modifier combinations that we do not need on * active windows (but in reality we shouldn't be grabbing * for buttons that we don't actually need at that point * anyways) */ class DummyServerGrab : public ServerGrabInterface { public: void grabServer () {} void syncServer () {} void ungrabServer () {} }; void PrivateWindow::updatePassiveButtonGrabs () { if (!priv->frame) return; bool onlyActions = (priv->id == screen->activeWindow () || !screen->getCoreOptions ().optionGetClickToFocus ()); /* Ungrab everything */ XUngrabButton (screen->dpy (), AnyButton, AnyModifier, frame); /* We don't need the full grab in the following cases: * - This window has the focus and either * - it is raised or * - we don't want click raise */ if (onlyActions) { if (screen->getCoreOptions ().optionGetRaiseOnClick ()) { /* We do not actually need a server grab here since * there is no risk to our internal state */ DummyServerGrab grab; ServerLock lock (&grab); CompWindow *highestSibling = PrivateWindow::findSiblingBelow (window, true, lock); /* Check if this window is permitted to be raised */ for (CompWindow *above = window->serverNext; above != NULL; above = above->serverNext) { if (highestSibling == above) { onlyActions = false; break; } } } } if (onlyActions) screen->updatePassiveButtonGrabs(serverFrame); else { /* Grab all buttons */ XGrabButton (screen->dpy (), AnyButton, AnyModifier, serverFrame, false, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeSync, GrabModeAsync, None, None); if (!(priv->type & CompWindowTypeDesktopMask)) { /* Ungrab Buttons 4-7 for scrolling if the window is not the desktop window */ for (int i = 4; i <= 7; i++) XUngrabButton (screen->dpy (), i, AnyModifier, frame); } } } const CompRegion & CompWindow::region () const { return priv->region; } const CompRegion & CompWindow::frameRegion () const { return priv->frameRegion; } bool CompWindow::inShowDesktopMode () const { return priv->inShowDesktopMode; } void CompWindow::setShowDesktopMode (bool value) { priv->inShowDesktopMode = value; } bool CompWindow::managed () const { WRAPABLE_HND_FUNCTN_RETURN (bool, managed); return priv->managed; } bool CompWindow::focused () const { WRAPABLE_HND_FUNCTN_RETURN (bool, focused); return screen->activeWindow () == id (); } bool CompWindow::grabbed () const { return priv->grabbed; } int CompWindow::pendingMaps () const { return priv->pendingMaps; } unsigned int & CompWindow::wmType () const { return priv->wmType; } unsigned int CompWindow::activeNum () const { return priv->activeNum; } Window CompWindow::frame () const { return priv->serverFrame; } CompString CompWindow::resName () const { if (priv->resName) return priv->resName; return CompString (); } int CompWindow::mapNum () const { return priv->mapNum; } const CompStruts * CompWindow::struts () const { return priv->struts; } bool CompWindow::queryAttributes (XWindowAttributes &attrib) { return priv->queryAttributes (attrib); } bool CompWindow::queryFrameAttributes (XWindowAttributes &attrib) { return priv->queryFrameAttributes (attrib); } crb::Releasable::Ptr CompWindow::obtainLockOnConfigureRequests () { return priv->configureBuffer->obtainLock (); } int & CompWindow::saveMask () const { return priv->saveMask; } XWindowChanges & CompWindow::saveWc () { return priv->saveWc; } void CompWindow::moveToViewportPosition (int x, int y, bool sync) { int vWidth = screen->width () * screen->vpSize ().width (); int vHeight = screen->height () * screen->vpSize ().height (); if (screen->vpSize ().width () != 1) { x += screen->vp ().x () * screen->width (); x = compiz::core::screen::wraparound_mod (x, vWidth); x -= screen->vp ().x () * screen->width (); } if (screen->vpSize ().height () != 1) { y += screen->vp ().y () * screen->height (); y = compiz::core::screen::wraparound_mod (y, vHeight); y -= screen->vp ().y () * screen->height (); } int tx = x - priv->serverGeometry.x (); int ty = y - priv->serverGeometry.y (); if (tx || ty) { unsigned int valueMask = CWX | CWY; XWindowChanges xwc = XWINDOWCHANGES_INIT; if (!priv->managed || priv->type & (CompWindowTypeDesktopMask | CompWindowTypeDockMask) || priv->state & CompWindowStateStickyMask) return; int wx = tx; int wy = ty; int m; if (screen->vpSize ().width ()!= 1) { m = priv->serverGeometry.x () + tx; if (m - priv->output.left < (int) screen->width () - vWidth) wx = tx + vWidth; else if (m + priv->serverGeometry.width () + priv->output.right > vWidth) wx = tx - vWidth; } if (screen->vpSize ().height () != 1) { m = priv->serverGeometry.y () + ty; if (m - priv->output.top < (int) screen->height () - vHeight) wy = ty + vHeight; else if (m + priv->serverGeometry.height () + priv->output.bottom > vHeight) wy = ty - vHeight; } if (priv->saveMask & CWX) priv->saveWc.x += wx; if (priv->saveMask & CWY) priv->saveWc.y += wy; xwc.x = serverGeometry ().x () + wx; xwc.y = serverGeometry ().y () + wy; configureXWindow (valueMask, &xwc); } } const char * CompWindow::startupId () const { return priv->startupId; } void PrivateWindow::applyStartupProperties (CompStartupSequence *s) { priv->initialViewport.setX (s->viewportX); priv->initialViewport.setY (s->viewportY); int workspace = sn_startup_sequence_get_workspace (s->sequence); if (workspace >= 0) window->setDesktop (workspace); priv->initialTimestamp = sn_startup_sequence_get_timestamp (s->sequence); priv->initialTimestampSet = true; } unsigned int CompWindow::desktop () const { return priv->desktop; } Window CompWindow::clientLeader (bool checkAncestor) const { if (priv->clientLeader) return priv->clientLeader; if (checkAncestor) return priv->getClientLeaderOfAncestor (); return None; } Window CompWindow::transientFor () const { return priv->transientFor; } int CompWindow::pendingUnmaps () const { return priv->pendingUnmaps; } bool CompWindow::minimized () const { WRAPABLE_HND_FUNCTN_RETURN (bool, minimized); return priv->minimized; } bool CompWindow::placed () const { return priv->placed; } bool CompWindow::shaded () const { return priv->shaded; } const CompWindowExtents & CompWindow::border () const { return priv->border; } const CompWindowExtents & CompWindow::input () const { return priv->serverInput; } const CompWindowExtents & CompWindow::output () const { return priv->output; } XSizeHints & CompWindow::sizeHints () const { return priv->sizeHints; } void PrivateWindow::updateMwmHints () { screen->getMwmHints (priv->id, &priv->mwmFunc, &priv->mwmDecor); window->recalcActions (); } void PrivateWindow::updateStartupId () { char *oldId = startupId; bool newId = true; startupId = getStartupId (); if (oldId && startupId && strcmp (startupId, oldId) == 0) newId = false; if (managed && startupId && newId) { Time timestamp = 0; initialTimestampSet = false; screen->applyStartupProperties (window); if (initialTimestampSet) timestamp = initialTimestamp; /* as the viewport can't be transmitted via startup notification, assume the client changing the ID wanted to activate the window on the current viewport */ CompPoint vp = window->defaultViewport (); CompPoint svp = screen->vp (); CompSize size = *screen; int x = window->serverGeometry ().x () + (svp.x () - vp.x ()) * size.width (); int y = window->serverGeometry ().y () + (svp.y () - vp.y ()) * size.height (); window->moveToViewportPosition (x, y, true); if (allowWindowFocus (0, timestamp)) window->activate (); } if (oldId) free (oldId); } bool CompWindow::destroyed () const { return priv->destroyed; } bool CompWindow::invisible () const { return priv->invisible; } XSyncAlarm CompWindow::syncAlarm () const { return priv->syncAlarm; } CompWindow * PrivateWindow::createCompWindow (Window aboveId, Window aboveServerId, XWindowAttributes &wa, Window id) { PrivateWindow* priv(new PrivateWindow ()); priv->id = id; priv->serverId = id; CompWindow *fw = new CompWindow (aboveId, aboveServerId, wa, priv); return fw; } CompWindow::CompWindow (Window aboveId, Window aboveServerId, XWindowAttributes &wa, PrivateWindow *priv) : PluginClassStorage (windowPluginClassIndices), priv (priv) { StackDebugger *dbg = StackDebugger::Default (); // TODO: Reparent first! priv->window = this; screen->insertWindow (this, aboveId); screen->insertServerWindow (this, aboveServerId); /* We must immediately insert the window into the debugging * stack */ if (dbg) dbg->overrideRedirectRestack (priv->id, aboveId); priv->attrib = wa; priv->serverGeometry.set (priv->attrib.x, priv->attrib.y, priv->attrib.width, priv->attrib.height, priv->attrib.border_width); priv->serverFrameGeometry = priv->frameGeometry = priv->syncGeometry = priv->geometry = priv->serverGeometry; priv->sizeHints.flags = 0; priv->recalcNormalHints (); priv->transientFor = None; priv->clientLeader = None; XSelectInput (screen->dpy (), priv->id, wa.your_event_mask | PropertyChangeMask | EnterWindowMask | FocusChangeMask); priv->alpha = (priv->attrib.depth == 32); priv->lastPong = screen->lastPing (); if (screen->XShape ()) XShapeSelectInput (screen->dpy (), priv->id, ShapeNotifyMask); if (priv->attrib.c_class != InputOnly) { priv->region = CompRegion (priv->serverGeometry); priv->inputRegion = priv->region; /* need to check for DisplayModal state on all windows */ priv->state = screen->getWindowState (priv->id); priv->updateClassHints (); } else priv->attrib.map_state = IsUnmapped; priv->wmType = screen->getWindowType (priv->id); priv->protocols = screen->getProtocols (priv->id); if (!overrideRedirect ()) { priv->updateNormalHints (); updateStruts (); priv->updateWmHints (); priv->updateTransientHint (); priv->clientLeader = priv->getClientLeader (); priv->startupId = priv->getStartupId (); recalcType (); screen->getMwmHints (priv->id, &priv->mwmFunc, &priv->mwmDecor); if (!(priv->type & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) { priv->desktop = screen->getWindowProp (priv->id, Atoms::winDesktop, priv->desktop); if (priv->desktop != 0xffffffff && priv->desktop >= screen->nDesktop ()) priv->desktop = screen->currentDesktop (); } } else recalcType (); if (priv->attrib.map_state == IsViewable) { priv->placed = true; if (!overrideRedirect ()) { // needs to happen right after maprequest if (!priv->serverFrame) priv->reparent (); priv->managed = true; if (screen->getWmState (priv->id) == IconicState) { if (priv->state & CompWindowStateShadedMask) priv->shaded = true; else priv->minimized = true; } else { if (priv->wmType & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) setDesktop (0xffffffff); else { if (priv->desktop != 0xffffffff) priv->desktop = screen->currentDesktop (); screen->setWindowProp (priv->id, Atoms::winDesktop, priv->desktop); } } } priv->attrib.map_state = IsUnmapped; ++priv->pendingMaps; map (); updateAttributes (CompStackingUpdateModeNormal); if (priv->minimized || priv->inShowDesktopMode || priv->hidden || priv->shaded) { priv->state |= CompWindowStateHiddenMask; ++priv->pendingUnmaps; if (priv->serverFrame && !priv->shaded) XUnmapWindow (screen->dpy (), priv->serverFrame); XUnmapWindow (screen->dpy (), priv->id); screen->setWindowState (priv->state, priv->id); } } else if (!overrideRedirect () && screen->getWmState (priv->id) == IconicState) { // before everything else in maprequest if (!priv->serverFrame) priv->reparent (); priv->managed = true; priv->placed = true; if (priv->state & CompWindowStateHiddenMask) { if (priv->state & CompWindowStateShadedMask) priv->shaded = true; else priv->minimized = true; } } /* TODO: bailout properly when objectInitPlugins fails */ bool init_succeeded = CompPlugin::windowInitPlugins (this); assert (init_succeeded); if (!init_succeeded) return; recalcActions (); priv->updateIconGeometry (); if (priv->shaded) priv->updateFrameWindow (); if (priv->attrib.map_state == IsViewable) priv->invisible = priv->isInvisible (); } CompWindow::~CompWindow () { if (priv->serverFrame) priv->unreparent (); /* Update the references of other windows * pending destroy if this was a sibling * of one of those */ screen->destroyedWindows ().remove (this); foreach (CompWindow *dw, screen->destroyedWindows ()) { if (dw->next == this) dw->next = this->next; if (dw->prev == this) dw->prev = this->prev; if (dw->serverNext == this) dw->serverNext = this->serverNext; if (dw->serverPrev == this) dw->serverPrev = this->serverPrev; } if (!priv->destroyed) { CompWindowExtents empty; setWindowFrameExtents (&empty, &empty); StackDebugger *dbg = StackDebugger::Default (); screen->unhookWindow (this); screen->unhookServerWindow (this); /* We must immediately insert the window into the debugging * stack */ if (dbg) dbg->removeServerWindow (id ()); /* restore saved geometry and map if hidden */ if (!priv->attrib.override_redirect) { if (priv->saveMask) XConfigureWindow (screen->dpy (), priv->id, priv->saveMask, &priv->saveWc); if (!priv->hidden && priv->state & CompWindowStateHiddenMask) XMapWindow (screen->dpy (), priv->id); } if (screen->XShape ()) XShapeSelectInput (screen->dpy (), priv->id, NoEventMask); if (screen->grabWindowIsNot(priv->id)) XSelectInput (screen->dpy (), priv->id, NoEventMask); XUngrabButton (screen->dpy (), AnyButton, AnyModifier, priv->id); } if (priv->attrib.map_state == IsViewable) { if (priv->type == CompWindowTypeDesktopMask) screen->decrementDesktopWindowCount (); if (priv->destroyed && priv->struts) screen->updateWorkarea (); } if (priv->destroyed) screen->updateClientList (); CompPlugin::windowFiniPlugins (this); delete priv; } X11SyncServerWindow::X11SyncServerWindow (Display *dpy, const Window *w, const Window *frame) : mDpy (dpy), mWindow (w), mFrame (frame) { } bool X11SyncServerWindow::queryAttributes (XWindowAttributes &attrib) { if (XGetWindowAttributes (mDpy, *mWindow, &attrib)) return true; return false; } bool X11SyncServerWindow::queryFrameAttributes (XWindowAttributes &attrib) { Window w = *mFrame ? *mFrame : *mWindow; if (XGetWindowAttributes (mDpy, w, &attrib)) return true; return false; } XRectangle * X11SyncServerWindow::queryShapeRectangles (int kind, int *count, int *ordering) { return XShapeGetRectangles (mDpy, *mWindow, kind, count, ordering); } namespace { class NullConfigureBufferLock : public crb::BufferLock { public: NullConfigureBufferLock (crb::CountedFreeze *cf) {} void lock () {} void release () {} }; crb::BufferLock::Ptr createConfigureBufferLock (crb::CountedFreeze *cf) { /* Return an implementation that does nothing if the user explicitly * disabled buffer locks for this running instance */ if (getenv ("COMPIZ_NO_CONFIGURE_BUFFER_LOCKS")) return boost::make_shared (cf); return boost::make_shared (cf); } } PrivateWindow::PrivateWindow () : priv (this), refcnt (1), id (None), serverFrame (None), frame (None), wrapper (None), mapNum (0), activeNum (0), transientFor (None), clientLeader (None), hints (NULL), inputHint (true), alpha (false), region (), wmType (0), type (CompWindowTypeUnknownMask), state (0), actions (0), protocols (0), mwmDecor (MwmDecorAll), mwmFunc (MwmFuncAll), invisible (true), destroyed (false), managed (false), unmanaging (false), destroyRefCnt (1), unmapRefCnt (1), initialViewport (0, 0), initialTimestamp (0), initialTimestampSet (false), fullscreenMonitorsSet (false), placed (false), minimized (false), inShowDesktopMode (false), shaded (false), hidden (false), grabbed (false), alreadyDecorated (false), desktop (0), pendingUnmaps (0), pendingMaps (0), pendingConfigures (screen->dpy ()), receivedMapRequestAndAwaitingMap (false), startupId (0), resName (0), resClass (0), group (0), lastPong (0), alive (true), moved (false), struts (0), icons (0), noIcons (false), saveMask (0), syncCounter (0), syncAlarm (None), syncWaitTimer (), syncWait (false), closeRequests (false), lastCloseRequestTime (0), syncServerWindow (screen->dpy (), &id, &serverFrame), configureBuffer ( crb::ConfigureRequestBuffer::Create ( this, &syncServerWindow, boost::bind (createConfigureBufferLock, _1))) { input.left = 0; input.right = 0; input.top = 0; input.bottom = 0; /* Zero initialize */ serverInput = input; lastServerInput = input; border = input; output = input; syncWaitTimer.setTimes (1000, 1200); syncWaitTimer.setCallback (boost::bind (&PrivateWindow::handleSyncAlarm, this)); } PrivateWindow::~PrivateWindow () { if (syncAlarm) XSyncDestroyAlarm (screen->dpy (), syncAlarm); syncWaitTimer.stop (); if (serverFrame) XDestroyWindow (screen->dpy (), serverFrame); else if (frame) XDestroyWindow (screen->dpy (), frame); if (struts) free (struts); if (hints) XFree (hints); if (icons.size ()) freeIcons (); if (startupId) free (startupId); if (resName) free (resName); if (resClass) free (resClass); } bool CompWindow::syncWait () const { return priv->syncWait; } bool CompWindow::alpha () const { WRAPABLE_HND_FUNCTN_RETURN (bool, alpha); return priv->alpha; } bool CompWindow::overrideRedirect () const { return priv->attrib.override_redirect; } void PrivateWindow::setOverrideRedirect (bool overrideRedirect) { if (overrideRedirect == window->overrideRedirect ()) return; priv->attrib.override_redirect = overrideRedirect ? 1 : 0; window->recalcType (); window->recalcActions (); screen->matchPropertyChanged (window); } bool CompWindow::isMapped () const { return priv->mapNum > 0; } bool CompWindow::isViewable () const { return (priv->attrib.map_state == IsViewable); } bool CompWindow::isFocussable () const { WRAPABLE_HND_FUNCTN_RETURN (bool, isFocussable); if (priv->inputHint || priv->protocols & CompWindowProtocolTakeFocusMask) return true; return false; } int CompWindow::windowClass () const { return priv->attrib.c_class; } unsigned int CompWindow::depth () const { return priv->attrib.depth; } bool CompWindow::alive () const { return priv->alive; } bool CompWindow::moved () const { return priv->moved; } unsigned int CompWindow::mwmDecor () const { return priv->mwmDecor; } unsigned int CompWindow::mwmFunc () const { return priv->mwmFunc; } /* TODO: This function should be able to check the XShape event * kind and only get/set shape rectangles for either ShapeInput * or ShapeBounding, but not both at the same time */ void CompWindow::updateFrameRegion () { if (priv->serverFrame) { priv->frameRegion = emptyRegion; updateFrameRegion (priv->frameRegion); if (!shaded ()) { CompRect r = priv->region.boundingRect (); priv->frameRegion -= r; r.setGeometry (r.x1 () - priv->serverInput.left, r.y1 () - priv->serverInput.top, r.width () + priv->serverInput.right + priv->serverInput.left, r.height () + priv->serverInput.bottom + priv->serverInput.top); priv->frameRegion &= CompRegion (r); } int x = priv->serverGeometry.x () - priv->serverInput.left; int y = priv->serverGeometry.y () - priv->serverInput.top; XShapeCombineRegion (screen->dpy (), priv->serverFrame, ShapeBounding, -x, -y, priv->frameRegion.united (priv->region).handle (), ShapeSet); XShapeCombineRegion (screen->dpy (), priv->serverFrame, ShapeInput, -x, -y, priv->frameRegion.united (priv->inputRegion).handle (), ShapeSet); } } void CompWindow::setWindowFrameExtents (const CompWindowExtents *b, const CompWindowExtents *i) { /* override redirect windows can't have frame extents */ if (priv->attrib.override_redirect) return; /* Input extents are used for frame size, * Border extents used for placement. */ if (!i) i = b; if (priv->serverInput.left != i->left || priv->serverInput.right != i->right || priv->serverInput.top != i->top || priv->serverInput.bottom != i->bottom || priv->border.left != b->left || priv->border.right != b->right || priv->border.top != b->top || priv->border.bottom != b->bottom) { CompPoint movement = compiz::window::extents::shift (*b, priv->sizeHints.win_gravity) - compiz::window::extents::shift (priv->border, priv->sizeHints.win_gravity); CompSize sizeDelta; /* We don't want to change the size of the window in general, but this is * needed in case the window was maximized or fullscreen, so that it * will be extended to use the whole available space. */ if ((priv->state & MAXIMIZE_STATE) == MAXIMIZE_STATE || (priv->state & CompWindowStateFullscreenMask) || (priv->type & CompWindowTypeFullscreenMask)) { sizeDelta.setWidth (-((b->left + b->right) - (priv->border.left + priv->border.right))); sizeDelta.setHeight (-((b->top + b->bottom) - (priv->border.top + priv->border.bottom))); } /* Offset client for any new decoration size */ XWindowChanges xwc; xwc.x = movement.x () + priv->serverGeometry.x (); xwc.y = movement.y () + priv->serverGeometry.y (); xwc.width = sizeDelta.width () + priv->serverGeometry.width (); xwc.height = sizeDelta.height () + priv->serverGeometry.height (); if (!priv->alreadyDecorated) { /* Make sure we don't move the window outside the workarea */ CompRect const& workarea = screen->getWorkareaForOutput (outputDevice ()); CompPoint boffset((b->left + b->right) - (priv->border.left + priv->border.right), (b->top + b->bottom) - (priv->border.top + priv->border.bottom)); if (xwc.x + xwc.width > workarea.x2 ()) { xwc.x -= boffset.x (); if (xwc.x < workarea.x ()) xwc.x = workarea.x () + movement.x (); } if (xwc.y + xwc.height > workarea.y2 ()) { xwc.y -= boffset.y (); if (xwc.y < workarea.y ()) xwc.y = workarea.y () + movement.y (); } if (priv->actions & CompWindowActionResizeMask) { if (xwc.width + boffset.x () > workarea.width ()) xwc.width = workarea.width () - boffset.x (); if (xwc.height + boffset.y () > workarea.height ()) xwc.height = workarea.height () - boffset.y (); } priv->alreadyDecorated = true; } priv->serverInput = *i; priv->border = *b; configureXWindow (CWX | CWY | CWWidth | CWHeight, &xwc); windowNotify (CompWindowNotifyFrameUpdate); recalcActions (); /* Always send a moveNotify * whenever the frame extents update * so that plugins can re-position appropriately */ moveNotify (0, 0, true); /* Once we have updated everything, re-set lastServerInput */ priv->lastServerInput = priv->serverInput; } /* Use b for _NET_WM_FRAME_EXTENTS here because * that is the representation of the actual decoration * around the window that the user sees and should * be used for placement and such */ /* Also update frame extents regardless of whether or not * the frame extents actually changed, eg, a plugin could * suggest that a window has no frame extents and that it * might later get frame extents - this is mandatory if we * say that we support it, so set them * additionaly some applications might request frame extents * and we must respond by setting the property - ideally * this should only ever be done when some plugin actually * need to change the frame extents or the applications * requested it */ unsigned long data[4]; data[0] = b->left; data[1] = b->right; data[2] = b->top; data[3] = b->bottom; XChangeProperty (screen->dpy (), priv->id, Atoms::frameExtents, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) data, 4); } bool CompWindow::hasUnmapReference () const { return (priv && priv->unmapRefCnt > 1); } void CompWindow::updateFrameRegion (CompRegion& region) WRAPABLE_HND_FUNCTN (updateFrameRegion, region) bool PrivateWindow::reparent () { if (serverFrame) return false; XSetWindowAttributes attr; XWindowAttributes wa; XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int nchildren; Window *children, root_return, parent_return; Display *dpy = screen->dpy (); Visual *visual = DefaultVisual (screen->dpy (), screen->screenNum ()); Colormap cmap = DefaultColormap (screen->dpy (), screen->screenNum ()); XSync (dpy, false); XGrabServer (dpy); /* We need to flush all queued up requests */ foreach (CompWindow *w, screen->windows ()) w->priv->configureBuffer->forceRelease (); if (!window->priv->queryAttributes (wa)) { XUngrabServer (dpy); XSync (dpy, false); return false; } if (wa.override_redirect) return false; /* Don't ever reparent windows which have ended up * reparented themselves on the server side but not * on the client side */ XQueryTree (dpy, id, &root_return, &parent_return, &children, &nchildren); if (parent_return != root_return) { XFree (children); XUngrabServer (dpy); XSync (dpy, false); return false; } XFree (children); XQueryTree (dpy, root_return, &root_return, &parent_return, &children, &nchildren); XChangeSaveSet (dpy, id, SetModeInsert); /* Force border width to 0 */ xwc.border_width = 0; XConfigureWindow (dpy, id, CWBorderWidth, &xwc); priv->serverGeometry.setBorder (0); int mask = CWBorderPixel | CWColormap | CWBackPixmap | CWOverrideRedirect; if (wa.depth == 32) { cmap = wa.colormap; visual = wa.visual; } attr.background_pixmap = None; attr.border_pixel = 0; attr.colormap = cmap; attr.override_redirect = true; /* We need to know when the frame window is created * but that's all */ XSelectInput (dpy, screen->root (), SubstructureNotifyMask); /* Gravity here is assumed to be SouthEast, clients can update * that if need be */ serverFrameGeometry.set (serverInput.left - border.left, serverInput.top - border.top, wa.width + (serverInput.left + serverInput.right), wa.height + (serverInput.top + serverInput.bottom), 0); /* Awaiting a new frame to be given to us */ frame = None; serverFrame = XCreateWindow (dpy, screen->root (), serverFrameGeometry.x (), serverFrameGeometry.y (), serverFrameGeometry.width (), serverFrameGeometry.height (), serverFrameGeometry.border (), wa.depth, InputOutput, visual, mask, &attr); /* Do not get any events from here on */ XSelectInput (dpy, screen->root (), NoEventMask); /* If we have some frame extents, we should apply them here and * set lastFrameExtents */ wrapper = XCreateWindow (dpy, serverFrame, serverInput.left, serverInput.top, wa.width, wa.height, 0, wa.depth, InputOutput, visual, mask, &attr); lastServerInput = serverInput; xwc.stack_mode = Above; /* Look for the client in the current server side stacking * order and put the frame above what the client is above */ if (nchildren && children[0] == id) { /* client at the bottom */ xwc.stack_mode = Below; xwc.sibling = id; } else { for (unsigned int i = 0; i < nchildren; ++i) { if (i < nchildren - 1) { if (children[i + 1] == id) { xwc.sibling = children[i]; break; } } else /* client on top */ xwc.sibling = children[i]; } } XFree (children); /* Make sure the frame is underneath the client */ XConfigureWindow (dpy, serverFrame, CWSibling | CWStackMode, &xwc); /* Wait for the restacking to finish */ XSync (dpy, false); /* Always need to have the wrapper window mapped */ XMapWindow (dpy, wrapper); /* Reparent the client into the wrapper window */ XReparentWindow (dpy, id, wrapper, 0, 0); /* Restore events */ attr.event_mask = wa.your_event_mask; /* We don't care about client events on the frame, and listening for them * will probably end up fighting the client anyways, so disable them */ attr.do_not_propagate_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | Button1MotionMask | Button2MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask | ButtonMotionMask | KeymapStateMask | ExposureMask | VisibilityChangeMask | StructureNotifyMask | ResizeRedirectMask | SubstructureNotifyMask | SubstructureRedirectMask | FocusChangeMask | PropertyChangeMask | ColormapChangeMask | OwnerGrabButtonMask; XChangeWindowAttributes (dpy, id, CWEventMask | CWDontPropagate, &attr); if (wa.map_state == IsViewable || shaded) XMapWindow (dpy, serverFrame); attr.event_mask = SubstructureRedirectMask | SubstructureNotifyMask | EnterWindowMask | LeaveWindowMask; XChangeWindowAttributes (dpy, serverFrame, CWEventMask, &attr); XChangeWindowAttributes (dpy, wrapper, CWEventMask, &attr); XSelectInput (dpy, screen->root (), SubstructureRedirectMask | SubstructureNotifyMask | StructureNotifyMask | PropertyChangeMask | LeaveWindowMask | EnterWindowMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | FocusChangeMask | ExposureMask); XUngrabServer (dpy); XSync (dpy, false); window->windowNotify (CompWindowNotifyReparent); return true; } void PrivateWindow::manageFrameWindowSeparately () { /* This is where things get tricky ... it is possible * to receive a ConfigureNotify relative to a frame window * for a destroyed window in case we process a ConfigureRequest * for the destroyed window and then a DestroyNotify for it directly * afterwards. In that case, we will receive the ConfigureNotify * for the XConfigureWindow request we made relative to that frame * window. Because of this, we must keep the frame window in the stack * as a new toplevel window so that the ConfigureNotify will be processed * properly until it too receives a DestroyNotify * * We only wish to do this if we have recieved a CreateNotify for the * frame window. If we have not, then there will be no stacking operations * dependent on it and we should wait until CreateNotify in order to manage * it normally */ if (frame) { XWindowAttributes attrib; /* It's possible that the frame window was already destroyed because * the client was unreparented before it was destroyed (eg * UnmapNotify before DestroyNotify). In that case the frame window * is going to be an invalid window but since we haven't received * a DestroyNotify for it yet, it is possible that restacking * operations could occurr relative to it so we need to hold it * in the stack for now. Ensure that it is marked override redirect */ window->priv->queryFrameAttributes (attrib); /* Put the frame window "above" the client window * in the stack */ PrivateWindow::createCompWindow (id, id, attrib, frame); } } void PrivateWindow::unreparent () { if (!serverFrame) return; Display *dpy = screen->dpy (); XEvent e; bool alive = true; XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int nchildren; Window *children = NULL, root_return, parent_return; XWindowAttributes wa; StackDebugger *dbg = StackDebugger::Default (); XSync (dpy, false); if (XCheckTypedWindowEvent (dpy, id, DestroyNotify, &e)) { XPutBackEvent (dpy, &e); alive = false; } else if (!XGetWindowAttributes (dpy, id, &wa)) alive = false; /* Also don't reparent back into root windows that have ended up * reparented into other windows (and as such we are unmanaging them) */ if (alive) { XQueryTree (dpy, id, &root_return, &parent_return, &children, &nchildren); if (parent_return != wrapper) alive = false; } if ((!destroyed) && alive) { XGrabServer (dpy); XChangeSaveSet (dpy, id, SetModeDelete); XSelectInput (dpy, serverFrame, NoEventMask); XSelectInput (dpy, wrapper, NoEventMask); XSelectInput (dpy, id, NoEventMask); XSelectInput (dpy, screen->root (), NoEventMask); XReparentWindow (dpy, id, screen->root (), 0, 0); /* Wait for the reparent to finish */ XSync (dpy, false); xwc.x = serverGeometry.xMinusBorder (); xwc.y = serverGeometry.yMinusBorder (); xwc.width = serverGeometry.widthIncBorders (); xwc.height = serverGeometry.heightIncBorders (); XConfigureWindow (dpy, serverFrame, CWX | CWY | CWWidth | CWHeight, &xwc); xwc.stack_mode = Below; xwc.sibling = serverFrame; XConfigureWindow (dpy, id, CWSibling | CWStackMode, &xwc); /* Wait for the window to be restacked */ XSync (dpy, false); XUnmapWindow (dpy, serverFrame); XSelectInput (dpy, id, wa.your_event_mask); XSelectInput (dpy, screen->root (), SubstructureRedirectMask | SubstructureNotifyMask | StructureNotifyMask | PropertyChangeMask | LeaveWindowMask | EnterWindowMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | FocusChangeMask | ExposureMask); XUngrabServer (dpy); XSync (dpy, false); XMoveWindow (dpy, id, serverGeometry.x (), serverGeometry.y ()); } if (children) XFree (children); if (dbg) dbg->addDestroyedFrame (serverFrame); manageFrameWindowSeparately (); /* Issue a DestroyNotify */ XDestroyWindow (screen->dpy (), serverFrame); XDestroyWindow (screen->dpy (), wrapper); /* This window is no longer "managed" in the * reparenting sense so clear its pending event * queue ... though maybe in future it would * be better to bookeep these events too and * handle the ReparentNotify */ pendingConfigures.clear (); frame = None; wrapper = None; serverFrame = None; // Finally, (i.e. after updating state) notify the change window->windowNotify (CompWindowNotifyUnreparent); } compiz-0.9.11+14.04.20140409/src/string/0000755000015301777760000000000012321344021017571 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/string/tests/0000755000015301777760000000000012321344021020733 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/string/tests/test-string.h0000644000015301777760000000304412321343002023366 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_STRING_H #define _COMPIZ_TEST_STRING_H #include class CompStringTest { public: CompStringTest (); virtual ~CompStringTest (); virtual bool test () = 0; }; class CompStringTestPrintf : public CompStringTest { public: bool test (); }; CompStringTest * getTestObject (); #endif compiz-0.9.11+14.04.20140409/src/string/tests/test-string.cpp0000644000015301777760000000300512321343002023716 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-string.h" CompStringTest::CompStringTest () { } CompStringTest::~CompStringTest () { } int main (int argc, char **argv) { CompStringTest *cst = static_cast (getTestObject ()); bool ret = false; ret = cst->test (); delete cst; return ret ? 0 : 1; } compiz-0.9.11+14.04.20140409/src/string/tests/printf/0000755000015301777760000000000012321344021022235 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/string/tests/printf/src/0000755000015301777760000000000012321344021023024 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/string/tests/printf/src/test-string-printf.cpp0000644000015301777760000001002212321343002027304 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include #include #include #include namespace compiz { namespace string { namespace printf_test { class Value { public: virtual ~Value (); typedef boost::shared_ptr Ptr; protected: Value () { } ; void *v; }; template class TValue: public Value { public: TValue (const T &); ~TValue (); const T & value (); }; template TValue::TValue (const T &av) { v = new T(av); } template TValue::~TValue () { delete (reinterpret_cast(v)); } template const T & TValue::value () { return *(reinterpret_cast(v)); } Value::~Value () { } CompString get_format (const CompString &fmt, Value::Ptr v) { if (fmt == "%i" || fmt == "%d") return compPrintf(fmt.c_str(), (boost::static_pointer_cast >(v))->value()); if (fmt == "%f") return compPrintf(fmt.c_str(), (boost::static_pointer_cast >(v))->value()); if (fmt == "%s") return compPrintf( fmt.c_str(), (boost::static_pointer_cast >(v))->value().c_str()); if (fmt == "%x") return compPrintf(fmt.c_str(), (boost::static_pointer_cast >(v))->value()); return "not_reached"; } } } } TEST(CompizString,PrintfTest) { CompString s1; CompString s2; std::map formatValues; std::map formatStrings; s1 = "foo"; const char *other_foo = "foo"; s2 = compPrintf ("%s", other_foo); ASSERT_EQ(s1, s2); s1 = "3"; s2 = compPrintf ("%i", 3, NULL); ASSERT_EQ(s1, s2); s1 = "3.012600"; s2 = compPrintf ("%f", 3.0126, NULL); ASSERT_EQ(s1, s2); s1 = "0x4f567"; s2 = compPrintf ("0x%x", 0x4f567, NULL); ASSERT_EQ(s1, s2); formatValues["%i"] = compiz::string::printf_test::Value::Ptr (new compiz::string::printf_test::TValue (6)); formatStrings["%i"] = CompString ("6"); formatValues["%f"] = compiz::string::printf_test::Value::Ptr (new compiz::string::printf_test::TValue (6.532)); formatStrings["%f"] = CompString ("6.532000"); formatValues["%x"] = compiz::string::printf_test::Value::Ptr (new compiz::string::printf_test::TValue (0x34fe5aa)); formatStrings["%x"] = CompString ("34fe5aa"); formatValues["%d"] = compiz::string::printf_test::Value::Ptr (new compiz::string::printf_test::TValue (2)); formatStrings["%d"] = CompString ("2"); for (std::map ::iterator it = formatStrings.begin (); it != formatStrings.end (); it++) { CompString str = compiz::string::printf_test::get_format (it->first, formatValues[it->first]); ASSERT_EQ(str, it->second); } } compiz-0.9.11+14.04.20140409/src/string/tests/CMakeLists.txt0000644000015301777760000000050712321343002023473 0ustar pbusernogroup00000000000000include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ) add_executable( compiz_string_test ${CMAKE_CURRENT_SOURCE_DIR}/printf/src/test-string-printf.cpp ) target_link_libraries( compiz_string_test compiz_string ${GTEST_BOTH_LIBRARIES} ) compiz_discover_tests (compiz_string_test COVERAGE compiz_string) compiz-0.9.11+14.04.20140409/src/string/CMakeLists.txt0000644000015301777760000000112312321343002022324 0ustar pbusernogroup00000000000000INCLUDE_DIRECTORIES( ${compiz_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ) SET( PUBLIC_HEADERS ) SET( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/string.cpp ) ADD_LIBRARY( compiz_string STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_string PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) compiz-0.9.11+14.04.20140409/src/string/src/0000755000015301777760000000000012321344021020360 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/string/src/string.cpp0000644000015301777760000000447512321343002022402 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include #include #include #include CompString compPrintf (const char *format, ...) { va_list ap; CompString rv; va_start (ap, format); rv = compPrintf (format, ap); va_end (ap); return rv; } CompString compPrintf (const char *format, va_list ap) { va_list aq; int n; char *str; if (!format) return CompString (""); unsigned int size = strlen (format) + 1; str = new char[size]; if (!str) return CompString (""); while (1) { /* Try to print in the allocated space. */ va_copy (aq, ap); n = vsnprintf (str, size, format, aq); va_end (aq); /* If that worked, leave the loop. */ if (n > -1 && n < (int) size) break; /* Else try again with more space. */ if (n > -1) /* glibc 2.1 */ size = n + 1; /* precisely what is needed */ else /* glibc 2.0 */ size++; /* one more than the old size */ delete [] str; str = new char[size]; if (!str) { return CompString (""); } } CompString rv (str); delete [] str; return rv; } compiz-0.9.11+14.04.20140409/src/string/include/0000755000015301777760000000000012321344021021214 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/session.cpp0000644000015301777760000002526512321343002020462 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Radek Doulik */ #include "core/session.h" #include "core/screen.h" #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include #define SM_DEBUG(x) static SmcConn smcConnection; static CompWatchFdHandle iceWatchFdHandle; static bool connected = false; static bool iceConnected = false; static char *smClientId, *smPrevClientId; static void iceInit (void); static void setStringListProperty (SmcConn connection, const char *name, const char **values, int nValues) { SmProp prop, *pProp; prop.name = (char *) name; prop.type = const_cast (SmLISTofARRAY8); prop.vals = (SmPropValue *) malloc (nValues * sizeof (SmPropValue)); if (!prop.vals) return; for (int i = 0; i < nValues; ++i) { prop.vals[i].value = (char *) values[i]; prop.vals[i].length = strlen (values[i]); } prop.num_vals = nValues; pProp = ∝ SmcSetProperties (connection, 1, &pProp); free (prop.vals); } static void setCloneRestartCommands (SmcConn connection) { /* at maximum, we pass our old arguments + our new client id to the SM, so allocate for that case */ const char **args = (const char **) malloc ((programArgc + 2) * sizeof (char *)); if (!args) return; int i, count = 0; for (i = 0; i < programArgc; ++i) { if (strcmp (programArgv[i], "--sm-client-id") == 0) ++i; /* skip old client id, we'll add the new one later */ else if (strcmp (programArgv[i], "--replace") == 0) continue; /* there's nothing to replace when starting session */ else args[count++] = programArgv[i]; } setStringListProperty (connection, SmCloneCommand, args, count); /* insert new client id at position 1 and 2; position 0 is the executable name */ for (i = count - 1; i >= 1; i--) args[i + 2] = args[i]; args[1] = "--sm-client-id"; args[2] = smClientId; count += 2; setStringListProperty (connection, SmRestartCommand, args, count); free (args); } static void setRestartStyle (SmcConn connection, char hint) { SmProp prop, *pProp; SmPropValue propVal; prop.name = const_cast (SmRestartStyleHint); prop.type = const_cast (SmCARD8); prop.num_vals = 1; prop.vals = &propVal; propVal.value = &hint; propVal.length = 1; pProp = ∝ SmcSetProperties (connection, 1, &pProp); } static void setProgramInfo (SmcConn connection, pid_t pid, uid_t uid) { SmProp progProp, pidProp, userProp; SmPropValue progVal, pidVal, userVal; SmProp *props[3]; char pidBuffer[32]; unsigned int count = 0; struct passwd *pw; progProp.name = const_cast (SmProgram); progProp.type = const_cast (SmARRAY8); progProp.num_vals = 1; progProp.vals = &progVal; progVal.value = (SmPointer) "compiz"; progVal.length = strlen ((char *) progVal.value); props[count++] = &progProp; snprintf (pidBuffer, sizeof (pidBuffer), "%d", pid); pidProp.name = const_cast (SmProcessID); pidProp.type = const_cast (SmARRAY8); pidProp.num_vals = 1; pidProp.vals = &pidVal; pidVal.value = (SmPointer) pidBuffer; pidVal.length = strlen (pidBuffer); props[count++] = &pidProp; pw = getpwuid (uid); if (pw) { userProp.name = const_cast (SmUserID); userProp.type = const_cast (SmARRAY8); userProp.num_vals = 1; userProp.vals = &userVal; userVal.value = (SmPointer) pw->pw_name; userVal.length = strlen (pw->pw_name); props[count++] = &userProp; } SmcSetProperties (connection, count, props); } static void saveYourselfCallback (SmcConn connection, SmPointer client_data, int saveType, Bool shutdown, int interact_Style, Bool fast) { CompOption::Vector args; args.push_back (CompOption ("save_type", CompOption::TypeInt)); args.push_back (CompOption ("shutdown", CompOption::TypeBool)); args.push_back (CompOption ("interact_style", CompOption::TypeInt)); args.push_back (CompOption ("fast", CompOption::TypeBool)); args[0].value ().set (saveType); args[1].value ().set ((bool) shutdown); args[2].value ().set (interact_Style); args[3].value ().set ((bool) fast); screen->sessionEvent (CompSession::EventSaveYourself, args); setCloneRestartCommands (connection); setRestartStyle (connection, SmRestartImmediately); setProgramInfo (connection, getpid (), getuid ()); SmcSaveYourselfDone (connection, 1); } static void dieCallback (SmcConn connection, SmPointer clientData) { screen->sessionEvent (CompSession::EventDie, noOptions ()); CompSession::close (); exit (0); } static void saveCompleteCallback (SmcConn connection, SmPointer clientData) { screen->sessionEvent (CompSession::EventSaveComplete, noOptions ()); } static void shutdownCancelledCallback (SmcConn connection, SmPointer clientData) { screen->sessionEvent (CompSession::EventShutdownCancelled, noOptions ()); } void CompSession::init (char *prevClientId) { static SmcCallbacks callbacks; if (getenv ("SESSION_MANAGER")) { char errorBuffer[1024]; iceInit (); callbacks.save_yourself.callback = saveYourselfCallback; callbacks.save_yourself.client_data = NULL; callbacks.die.callback = dieCallback; callbacks.die.client_data = NULL; callbacks.save_complete.callback = saveCompleteCallback; callbacks.save_complete.client_data = NULL; callbacks.shutdown_cancelled.callback = shutdownCancelledCallback; callbacks.shutdown_cancelled.client_data = NULL; smcConnection = SmcOpenConnection (NULL, NULL, SmProtoMajor, SmProtoMinor, SmcSaveYourselfProcMask | SmcDieProcMask | SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask, &callbacks, prevClientId, &smClientId, sizeof (errorBuffer), errorBuffer); if (!smcConnection) compLogMessage ("core", CompLogLevelWarn, "SmcOpenConnection failed: %s", errorBuffer); else { connected = true; if (prevClientId) smPrevClientId = strdup (prevClientId); setRestartStyle (smcConnection, SmRestartImmediately); } } } void CompSession::close () { if (connected) { setRestartStyle (smcConnection, SmRestartIfRunning); if (SmcCloseConnection (smcConnection, 0, NULL) != SmcConnectionInUse) connected = false; if (smClientId) { free (smClientId); smClientId = NULL; } if (smPrevClientId) { free (smPrevClientId); smPrevClientId = NULL; } } } CompString CompSession::getClientId (CompSession::ClientIdType type) { if (!connected) return ""; switch (type) { case CompSession::ClientId: if (smClientId) return smClientId; break; case CompSession::PrevClientId: if (smPrevClientId) return smPrevClientId; break; default: break; } return ""; } /* ice connection handling taken and updated from gnome-ice.c * original gnome-ice.c code written by Tom Tromey */ /* This is called when data is available on an ICE connection. */ static bool iceProcessMessages (IceConn connection) { SM_DEBUG (printf ("ICE connection process messages\n")); IceProcessMessagesStatus status = IceProcessMessages (connection, NULL, NULL); if (status == IceProcessMessagesIOError) { SM_DEBUG (printf ("ICE connection process messages" " - error => shutting down the connection\n")); IceSetShutdownNegotiation (connection, False); IceCloseConnection (connection); } return 1; } /* This is called when a new ICE connection is made. It arranges for the ICE connection to be handled via the event loop. */ static void iceNewConnection (IceConn connection, IcePointer clientData, Bool opening, IcePointer *watchData) { if (opening) { SM_DEBUG (printf ("ICE connection opening\n")); /* Make sure we don't pass on these file descriptors to any exec'ed children */ fcntl (IceConnectionNumber (connection), F_SETFD, fcntl (IceConnectionNumber (connection), F_GETFD,0) | FD_CLOEXEC); iceWatchFdHandle = screen->addWatchFd (IceConnectionNumber (connection), POLLIN | POLLPRI | POLLHUP | POLLERR, boost::bind (iceProcessMessages, connection)); iceConnected = true; } else { SM_DEBUG (printf ("ICE connection closing\n")); if (iceConnected) { screen->removeWatchFd (iceWatchFdHandle); iceWatchFdHandle = 0; iceConnected = false; } } } static IceIOErrorHandler oldIceHandler; static void iceErrorHandler (IceConn connection) { if (oldIceHandler) (*oldIceHandler) (connection); } /* We call any handler installed before (or after) iceInit but avoid calling the default libICE handler which does an exit() */ static void iceInit (void) { static bool iceInitialized = false; if (!iceInitialized) { IceIOErrorHandler defaultIceHandler; oldIceHandler = IceSetIOErrorHandler (NULL); defaultIceHandler = IceSetIOErrorHandler (iceErrorHandler); if (oldIceHandler == defaultIceHandler) oldIceHandler = NULL; IceAddConnectionWatch (iceNewConnection, NULL); iceInitialized = true; } } compiz-0.9.11+14.04.20140409/src/configurerequestbuffer-impl.h0000644000015301777760000000731112321343002024157 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_GEOMETRY_UPDATE_QUEUE_H #define _COMPIZ_GEOMETRY_UPDATE_QUEUE_H #include #include #include #include #include #include #include namespace compiz { namespace window { class AsyncServerWindow; namespace configure_buffers { class Lockable { public: typedef boost::shared_ptr Ptr; typedef boost::weak_ptr Weak; virtual ~Lockable () {} virtual void lock () = 0; }; class BufferLock : public Lockable, public Releasable { public: typedef boost::shared_ptr Ptr; virtual ~BufferLock () {} }; class CountedFreeze { public: virtual ~CountedFreeze () {} virtual void freeze () = 0; virtual void release () = 0; virtual void untrackLock (compiz::window::configure_buffers::BufferLock *lock) = 0; }; class ConfigureRequestBuffer : public CountedFreeze, public Buffer { public: typedef boost::function LockFactory; void freeze (); void release (); void untrackLock (compiz::window::configure_buffers::BufferLock *lock); void pushClientRequest (const XWindowChanges &xwc, unsigned int mask); void pushWrapperRequest (const XWindowChanges &xwc, unsigned int mask); void pushFrameRequest (const XWindowChanges &xwc, unsigned int mask); void pushSyntheticConfigureNotify (); compiz::window::configure_buffers::Releasable::Ptr obtainLock (); /* Implement getAttributes and require that * the queue is released before calling through * to the SyncServerWindow */ bool queryAttributes (XWindowAttributes &attrib); bool queryFrameAttributes (XWindowAttributes &attrib); XRectangle * queryShapeRectangles (int kind, int *count, int *ordering); void forceRelease (); static compiz::window::configure_buffers::Buffer::Ptr Create (AsyncServerWindow *asyncServerWindow, SyncServerWindow *syncServerWindow, const LockFactory &factory); private: ConfigureRequestBuffer (AsyncServerWindow *asyncServerWindow, SyncServerWindow *syncServerWindow, const LockFactory &factory); class Private; std::auto_ptr priv; }; class ConfigureBufferLock : public compiz::window::configure_buffers::BufferLock { public: typedef boost::shared_ptr Ptr; ConfigureBufferLock (CountedFreeze *); ~ConfigureBufferLock (); void lock (); void release (); private: class Private; std::auto_ptr priv; }; } } } #endif compiz-0.9.11+14.04.20140409/src/wrapsystem/0000755000015301777760000000000012321344021020501 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/wrapsystem/tests/0000755000015301777760000000000012321344021021643 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/wrapsystem/tests/test-wrapsystem.cpp0000644000015301777760000001347212321343002025547 0ustar pbusernogroup00000000000000#include "core/wrapsystem.h" #include //#define TEST_OLD_MACROS namespace { class TestImplementation; class TestInterface : public WrapableInterface { public: TestInterface(); ~TestInterface(); virtual void testMethodReturningVoid() /* const */ = 0; virtual int testMethodReturningInt(int i) /* const */ = 0; static int testMethodReturningVoidCalls; static int testMethodReturningIntCalls; private: TestInterface(TestInterface const&); TestInterface& operator=(TestInterface const&); }; // Needs a magic number for the count of "wrappable" functions class TestImplementation : public WrapableHandler { public: // 1. need for magic numbers // 2. why can't we just pass &TestInterface::testMethod (and deduce return etc. // 3. relies on __VA_ARGS__ when an extra set of parentheses would be enough WRAPABLE_HND (0, TestInterface, void, testMethodReturningVoid) WRAPABLE_HND (1, TestInterface, int, testMethodReturningInt, int) static int testMethodReturningVoidCalls; static int testMethodReturningIntCalls; }; class TestWrapper : public TestInterface { TestImplementation& impl; public: TestWrapper(TestImplementation& impl) : impl(impl) { setHandler(&impl, true); } // The need to remember this is a PITA ~TestWrapper() { setHandler(&impl, false); } // The need to remember this is a PITA virtual void testMethodReturningVoid(); virtual int testMethodReturningInt(int i); static int testMethodReturningVoidCalls; static int testMethodReturningIntCalls; void disableTestMethodReturningVoid() { impl.testMethodReturningVoidSetEnabled (this, false); } }; } // (abstract) namespace int TestWrapper::testMethodReturningVoidCalls = 0; int TestInterface::testMethodReturningVoidCalls = 0; int TestImplementation::testMethodReturningVoidCalls = 0; int TestWrapper::testMethodReturningIntCalls = 0; int TestInterface::testMethodReturningIntCalls = 0; int TestImplementation::testMethodReturningIntCalls = 0; // A pain these need definition after TestImplementation definition TestInterface::TestInterface() {} TestInterface::~TestInterface() {} void TestInterface::testMethodReturningVoid() /* const */ { WRAPABLE_DEF (testMethodReturningVoid); testMethodReturningVoidCalls++; } int TestInterface::testMethodReturningInt(int i) { WRAPABLE_DEF (testMethodReturningInt, i); testMethodReturningIntCalls++; return i; } void TestImplementation::testMethodReturningVoid() { #ifdef TEST_OLD_MACROS WRAPABLE_HND_FUNC(0, testMethodReturningVoid) // Magic number needs to match class definition #else WRAPABLE_HND_FUNCTN(testMethodReturningVoid) #endif testMethodReturningVoidCalls++; } int TestImplementation::testMethodReturningInt(int i) { #ifdef TEST_OLD_MACROS WRAPABLE_HND_FUNC_RETURN(1, int, testMethodReturningInt, i) // Magic number needs to match class definition #else WRAPABLE_HND_FUNCTN_RETURN(int, testMethodReturningInt, i) #endif testMethodReturningIntCalls++; return i; } void TestWrapper::testMethodReturningVoid() { impl.testMethodReturningVoid(); testMethodReturningVoidCalls++; } int TestWrapper::testMethodReturningInt(int i) { testMethodReturningIntCalls++; return impl.testMethodReturningInt(i); } TEST(WrapSystem, an_interface_never_gets_functions_called) { TestInterface::testMethodReturningIntCalls = 0; TestImplementation imp; imp.testMethodReturningInt(1); ASSERT_EQ(0, TestInterface::testMethodReturningIntCalls); { TestWrapper wrap(imp); imp.testMethodReturningInt(1); ASSERT_EQ(0, TestInterface::testMethodReturningIntCalls); } imp.testMethodReturningInt(1); ASSERT_EQ(0, TestInterface::testMethodReturningIntCalls); } TEST(WrapSystem, an_interface_never_gets_void_functions_called) { TestInterface::testMethodReturningVoidCalls = 0; TestImplementation imp; imp.testMethodReturningVoid(); ASSERT_EQ(0, TestInterface::testMethodReturningVoidCalls); { TestWrapper wrap(imp); imp.testMethodReturningVoid(); ASSERT_EQ(0, TestInterface::testMethodReturningVoidCalls); } imp.testMethodReturningVoid(); ASSERT_EQ(0, TestInterface::testMethodReturningVoidCalls); } TEST(WrapSystem, an_implementation_gets_functions_called) { TestImplementation::testMethodReturningVoidCalls = 0; TestImplementation imp; { TestWrapper wrap(imp); imp.testMethodReturningVoid(); ASSERT_EQ(1, TestImplementation::testMethodReturningVoidCalls); } imp.testMethodReturningVoid(); ASSERT_EQ(2, TestImplementation::testMethodReturningVoidCalls); } TEST(WrapSystem, a_wrapper_gets_its_functions_called) { TestWrapper::testMethodReturningVoidCalls = 0; TestImplementation imp; { TestWrapper wrap(imp); imp.testMethodReturningVoid(); ASSERT_EQ(1, TestWrapper::testMethodReturningVoidCalls); } imp.testMethodReturningVoid(); ASSERT_EQ(1, TestWrapper::testMethodReturningVoidCalls); } TEST(WrapSystem, a_wrapper_doesnt_get_disabled_functions_called) { TestWrapper::testMethodReturningVoidCalls = 0; TestImplementation imp; { TestWrapper wrap(imp); wrap.disableTestMethodReturningVoid(); imp.testMethodReturningVoid(); ASSERT_EQ(0, TestWrapper::testMethodReturningVoidCalls); } } TEST(WrapSystem, two_wrappers_get_their_functions_called) { TestWrapper::testMethodReturningVoidCalls = 0; TestImplementation imp; { TestWrapper wrap1(imp); TestWrapper wrap2(imp); imp.testMethodReturningVoid(); ASSERT_EQ(2, TestWrapper::testMethodReturningVoidCalls); } imp.testMethodReturningVoid(); ASSERT_EQ(2, TestWrapper::testMethodReturningVoidCalls); } compiz-0.9.11+14.04.20140409/src/wrapsystem/tests/CMakeLists.txt0000644000015301777760000000047612321343002024410 0ustar pbusernogroup00000000000000include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../../include ) add_executable( compiz_wrapsystem_test ${CMAKE_CURRENT_SOURCE_DIR}/test-wrapsystem.cpp ) target_link_libraries( compiz_wrapsystem_test ${GTEST_BOTH_LIBRARIES} ) compiz_discover_tests (compiz_wrapsystem_test COVERAGE compiz_core)compiz-0.9.11+14.04.20140409/src/option.cpp0000644000015301777760000003542012321343002020301 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #define foreach BOOST_FOREACH #include #include "privateoption.h" #include #include #include template class std::vector; template class std::vector; template class std::vector; namespace { CompOption::Value::Vector & emptyList () { static CompOption::Value::Vector v; return v; } CompString & emptyString () { static CompString v; return v; } CompMatch & emptyMatch () { static CompMatch v; return v; } CompAction & emptyAction () { static CompAction v; return v; } unsigned short * emptyColor () { static unsigned short v[4] = { 0, 0, 0, 0 }; return v; } template::type & (*get_default)()> struct get_or_default_call : public boost::static_visitor { TargetType& operator()(TargetType& a) { return a; } template TargetType& operator()(T&) { return get_default(); } }; template::type Default> struct get_or_default_val : public boost::static_visitor { TargetType operator()(TargetType& a) { return a; } template TargetType operator()(T&) { return Default; } }; struct get_float : public boost::static_visitor { float operator()(float const& a) { return a; } template float operator()(T&) { return 0.0; } }; } CompOption::Vector & noOptions () { static CompOption::Vector v; return v; } static bool checkIsAction (CompOption::Type type) { switch (type) { case CompOption::TypeAction: case CompOption::TypeKey: case CompOption::TypeButton: case CompOption::TypeEdge: case CompOption::TypeBell: return true; default: break; } return false; } CompOption::Value::~Value() { } void CompOption::Value::set (Type t, const CompOption::Value::Vector & v) { mListType = t; mValue = v; } bool CompOption::Value::b () const { get_or_default_val tmp; return boost::apply_visitor(tmp, mValue); } int CompOption::Value::i () const { get_or_default_val tmp; return boost::apply_visitor(tmp, mValue); } float CompOption::Value::f () const { get_float tmp; return boost::apply_visitor(tmp, mValue); } unsigned short* CompOption::Value::c () const { try { return const_cast (&((boost::get(mValue))[0])); } catch (...) { return emptyColor (); } } const CompString & CompOption::Value::s () const { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } CompString & CompOption::Value::s () { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } const CompMatch & CompOption::Value::match () const { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } CompMatch & CompOption::Value::match () { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } const CompAction & CompOption::Value::action () const { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } CompAction & CompOption::Value::action () { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } // Type listType () const; const CompOption::Value::Vector & CompOption::Value::list () const { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } CompOption::Value::Vector & CompOption::Value::list () { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } bool CompOption::Value::operator== (const Value & rhs) const { return mValue == rhs.mValue; } bool CompOption::Value::operator!= (const Value & rhs) const { return !(mValue == rhs.mValue); } CompOption::Restriction::Restriction () : priv (new PrivateRestriction ()) { } CompOption::Restriction::Restriction (const CompOption::Restriction &r) : priv (new PrivateRestriction (*r.priv)) { } CompOption::Restriction::~Restriction () { delete priv; } int CompOption::Restriction::iMin () { if (priv->type == CompOption::TypeInt) return priv->rest.i.min; return MINSHORT; } int CompOption::Restriction::iMax () { if (priv->type == CompOption::TypeInt) return priv->rest.i.max; return MAXSHORT; } float CompOption::Restriction::fMin () { if (priv->type == CompOption::TypeFloat) return priv->rest.f.min; return MINSHORT; } float CompOption::Restriction::fMax () { if (priv->type == CompOption::TypeFloat) return priv->rest.f.min; return MINSHORT; } float CompOption::Restriction::fPrecision () { if (priv->type == CompOption::TypeFloat) return priv->rest.f.precision; return 0.1f; } void CompOption::Restriction::set (int min, int max) { priv->type = CompOption::TypeInt; priv->rest.i.min = min; priv->rest.i.max = max; } void CompOption::Restriction::set (float min, float max, float precision) { priv->type = CompOption::TypeFloat; priv->rest.f.min = min; priv->rest.f.max = max; priv->rest.f.precision = precision; } bool CompOption::Restriction::inRange (int i) { if (priv->type != CompOption::TypeInt) return true; if (i < priv->rest.i.min) return false; if (i > priv->rest.i.max) return false; return true; } bool CompOption::Restriction::inRange (float f) { if (priv->type != CompOption::TypeFloat) return true; if (f < priv->rest.f.min) return false; if (f > priv->rest.f.max) return false; return true; } CompOption::Restriction & CompOption::Restriction::operator= (const CompOption::Restriction &rest) { if (this == &rest) return *this; delete priv; priv = new PrivateRestriction (*rest.priv); return *this; } CompOption * CompOption::Class::getOption (const CompString &name) { CompOption *o = CompOption::findOption (getOptions (), name); return o; } CompOption * CompOption::findOption (CompOption::Vector &options, CompString name, unsigned int *index) { for (unsigned int i = 0; i < options.size (); i++) { if (options[i].priv->name == name) { if (index) *index = i; return &options[i]; } } return NULL; } CompOption::CompOption () : priv (new PrivateOption ()) { } CompOption::CompOption (const CompOption &o) : priv (new PrivateOption (*o.priv)) { } CompOption::CompOption (CompString name, CompOption::Type type) : priv (new PrivateOption ()) { setName (name, type); } CompOption::~CompOption () { /* Remove any added actions */ try { CompAction &action = value ().action (); if (action.active () && screen) screen->removeAction (&action); } catch (...) { } delete priv; } void CompOption::reset () { priv->name = ""; priv->type = TypeUnset; } void CompOption::setName (CompString name, CompOption::Type type) { priv->name = name; priv->type = type; } void CompOption::setName (const char *name, CompOption::Type type) { if (!name && !priv->name.empty ()) priv->name.clear (); else if (name && priv->name != name) priv->name = name; priv->type = type; } const CompString & CompOption::name () const { return priv->name; } CompOption::Type CompOption::type () const { return priv->type; } CompOption::Value & CompOption::value () { return priv->value; } const CompOption::Value & CompOption::value () const { return priv->value; } CompOption::Restriction & CompOption::rest () { return priv->rest; } bool CompOption::set (CompOption::Value &val) { /* XXX: It is uncertain as to why this is done. The only * logical reason would be that actions are stateful and * we don't want to care about the old state from the * action that we're setting this value to, so we're just * clearing that state and starting over, however copyState * does a lot more than that */ if (isAction () && priv->type != CompOption::TypeAction) val.action ().copyState (priv->value.action ()); if (priv->type != val.type () && (!isAction () || !checkIsAction (val.type ()))) { compLogMessage ("core", CompLogLevelWarn, "Can't set Value with type %d to " "option \"%s\" with type %d", val.type (), priv->name.c_str (), priv->type); return false; } if (priv->value == val) return false; if (isAction () && priv->value.action ().state () & CompAction::StateAutoGrab && screen) { if (!screen->addAction (&val.action ())) return false; else screen->removeAction (&priv->value.action ()); } switch (priv->type) { case CompOption::TypeInt: if (!priv->rest.inRange (val.i ())) return false; break; case CompOption::TypeFloat: { float v, p; int sign = (val.f () < 0 ? -1 : 1); if (!priv->rest.inRange (val.f ())) return false; p = 1.0f / priv->rest.fPrecision (); v = ((int) (val.f () * p + sign * 0.5f)) / p; priv->value.set (v); return true; } case CompOption::TypeAction: return false; case CompOption::TypeKey: if (val.action ().type () == value().action ().type () && !(val.action ().type () & CompAction::BindingTypeKey)) return false; break; case CompOption::TypeButton: if (val.action ().type () == value().action ().type () && !(val.action ().type () & (CompAction::BindingTypeButton | CompAction::BindingTypeEdgeButton))) return false; break; default: break; } priv->value = val; return true; } bool CompOption::isAction () const { return checkIsAction (priv->type); } CompOption & CompOption::operator= (const CompOption &option) { if (this == &option) return *this; delete priv; priv = new PrivateOption (*option.priv); return *this; } bool CompOption::getBoolOptionNamed (const Vector& options, const CompString& name, bool defaultValue) { foreach (const CompOption &o, options) if (o.priv->type == CompOption::TypeBool && o.priv->name == name) return o.priv->value.b (); return defaultValue; } int CompOption::getIntOptionNamed (const Vector& options, const CompString& name, int defaultValue) { foreach (const CompOption &o, options) if (o.priv->type == CompOption::TypeInt && o.priv->name == name) return o.priv->value.i (); return defaultValue; } float CompOption::getFloatOptionNamed (const Vector& options, const CompString& name, const float& defaultValue) { foreach (const CompOption &o, options) if (o.priv->type == CompOption::TypeFloat && o.priv->name == name) return o.priv->value.f (); return defaultValue; } CompString CompOption::getStringOptionNamed (const Vector& options, const CompString& name, const CompString& defaultValue) { foreach (const CompOption &o, options) if (o.priv->type == CompOption::TypeString && o.priv->name == name) return o.priv->value.s (); return defaultValue; } unsigned short * CompOption::getColorOptionNamed (const Vector& options, const CompString& name, unsigned short *defaultValue) { foreach (const CompOption &o, options) if (o.priv->type == CompOption::TypeColor && o.priv->name == name) return o.priv->value.c (); return defaultValue; } CompMatch CompOption::getMatchOptionNamed (const Vector& options, const CompString& name, const CompMatch& defaultValue) { foreach (const CompOption &o, options) if (o.priv->type == CompOption::TypeMatch && o.priv->name == name) return o.priv->value.match (); return defaultValue; } bool CompOption::stringToColor (CompString color, unsigned short *rgba) { int c[4]; if (sscanf (color.c_str (), "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4) { rgba[0] = c[0] << 8 | c[0]; rgba[1] = c[1] << 8 | c[1]; rgba[2] = c[2] << 8 | c[2]; rgba[3] = c[3] << 8 | c[3]; return true; } return false; } CompString CompOption::colorToString (unsigned short *rgba) { return compPrintf ("#%.2x%.2x%.2x%.2x", rgba[0] / 256, rgba[1] / 256, rgba[2] / 256, rgba[3] / 256); } CompString CompOption::typeToString (CompOption::Type type) { switch (type) { case CompOption::TypeBool: return "bool"; case CompOption::TypeInt: return "int"; case CompOption::TypeFloat: return "float"; case CompOption::TypeString: return "string"; case CompOption::TypeColor: return "color"; case CompOption::TypeAction: return "action"; case CompOption::TypeKey: return "key"; case CompOption::TypeButton: return "button"; case CompOption::TypeEdge: return "edge"; case CompOption::TypeBell: return "bell"; case CompOption::TypeMatch: return "match"; case CompOption::TypeList: return "list"; default: break; } return "unknown"; } bool CompOption::setOption (CompOption &o, CompOption::Value &value) { return o.set (value); } PrivateOption::PrivateOption () : name (""), type (CompOption::TypeUnset), value (), rest () { } PrivateOption::PrivateOption (const PrivateOption &p) : name (p.name), type (p.type), value (p.value), rest (p.rest) { } compiz-0.9.11+14.04.20140409/src/option/0000755000015301777760000000000012321344021017573 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/option/tests/0000755000015301777760000000000012321344021020735 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/option/tests/option.cpp0000644000015301777760000001456012321343002022755 0ustar pbusernogroup00000000000000#include /* XXX: including core.h means that we pull in * both window.h and screen.h which are cascading * includes. We should eliminate this dependency */ #include "core/core.h" #include "core/action.h" #include "core/match.h" #include "core/option.h" namespace { template void check_type_value(CompOption::Type type, const T & value) { CompOption::Value v; v.set(value); ASSERT_EQ(v.type(),type); ASSERT_EQ (v.get(),value); } template<> void check_type_value(CompOption::Type type, const unsigned short (& value)[4]) { CompOption::Value v; v.set(value); ASSERT_EQ(v.type(),type); unsigned short * color = v.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(value[i], color[i]); } unsigned short testColor[4] = {255, 0, 255, 0}; unsigned short testColor2[4] = {0, 255, 0, 255}; template void check_list_type(CompOption::Type listType, CompOption::Value::Vector &list) { CompOption::Value vl; vl.set (list); ASSERT_EQ (vl.type (), CompOption::TypeList); ASSERT_EQ (vl.get (), list); for (CompOption::Value::Vector::const_iterator it = vl.get ().begin (); it != vl.get ().end (); it++) { T inst; CompOption::Value value (inst); const CompOption::Value &v (*it); ASSERT_EQ (v.type (), value.type ()); } } } TEST(CompOption,Value) { check_type_value (CompOption::TypeBool, true); check_type_value (CompOption::TypeBool, false); check_type_value (CompOption::TypeInt, 1); check_type_value (CompOption::TypeFloat, 1.f); check_type_value (CompOption::TypeString, CompString ("Check")); check_type_value (CompOption::TypeString, "core"); check_type_value (CompOption::TypeAction, CompAction()); check_type_value (CompOption::TypeMatch, CompMatch()); check_type_value (CompOption::TypeColor, testColor); check_type_value (CompOption::TypeList, CompOption::Value::Vector(5)); CompOption::Value v1, v2; ASSERT_EQ (v1,v2); v1.set (CompString("SomeString")); ASSERT_TRUE(v1 != v2); CompOption::Value::Vector vec; CompOption::Value v; v.set (true); vec.push_back (v); vec.push_back (v); check_list_type (CompOption::TypeBool, vec); vec.clear (); v.set (CompString ("foo")); vec.push_back (v); vec.push_back (v); check_list_type (CompOption::TypeString, vec); } TEST(CompOption,Color) { CompOption::Value value(testColor); unsigned short * color = value.c(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor[i], color[i]); color = value.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor[i], color[i]); value.set(testColor2); color = value.c(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor2[i], color[i]); color = value.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor2[i], color[i]); CompOption::Value v; v.set (testColor); color = v.c(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor[i], color[i]); color = v.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor[i], color[i]); v.set(testColor2); color = v.c(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor2[i], color[i]); color = v.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor2[i], color[i]); v.set (static_cast (testColor)); color = v.c(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor[i], color[i]); color = v.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor[i], color[i]); v.set(testColor2); color = v.c(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor2[i], color[i]); color = v.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor2[i], color[i]); } TEST(CompOption, Const) { CompOption::Value non_const; CompOption::Value const& as_const(non_const); { CompString const expectOne("one"); CompString const expectTwo("two"); non_const = expectOne; ASSERT_EQ(expectOne, non_const.s()); ASSERT_EQ(expectOne, as_const.s()); non_const = expectTwo; ASSERT_EQ(expectTwo, non_const.s()); ASSERT_EQ(expectTwo, as_const.s()); } { bool const expectOne = true; bool const expectTwo = false; non_const = expectOne; ASSERT_EQ(expectOne, non_const.b()); ASSERT_EQ(expectOne, as_const.b()); non_const = expectTwo; EXPECT_FALSE (non_const.b()); EXPECT_FALSE (as_const.b()); } { float const expectOne = 0.0; float const expectTwo = 42.0; non_const = expectOne; ASSERT_EQ(expectOne, non_const.f()); ASSERT_EQ(expectOne, as_const.f()); non_const = expectTwo; ASSERT_EQ(expectTwo, non_const.f()); ASSERT_EQ(expectTwo, as_const.f()); } } TEST (CompOption, AssignDefaultActionValueToUnsetTypeClearsOldStateKeepsInfo) { /* Value is unset at this point */ CompOption option ("testing", CompOption::TypeKey); CompAction action; /* We need to set up the state here as * the CompOption::Value constructor makes * a copy of the action */ action.setState (CompAction::StateInitKey); action.setButton (CompAction::ButtonBinding (1, 1 << 1)); CompOption::Value value (action); ASSERT_EQ (value.action ().state (), CompAction::StateInitKey); /* Actually set the action value, this will * overwrite the internal value */ option.set (value); /* We don't care about the old action's state, so get * rid of it */ ASSERT_EQ (option.value ().action ().state (), 0); /* We do want to keep the non-stateful data which is * pure info */ ASSERT_EQ (option.value ().action ().button ().button (), 1); ASSERT_EQ (option.value ().action ().button ().modifiers (), 1 << 1); } compiz-0.9.11+14.04.20140409/src/option/tests/CMakeLists.txt0000644000015301777760000000145212321343002023475 0ustar pbusernogroup00000000000000include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src/pluginclasshandler/include ${compiz_SOURCE_DIR}/src/timer/include ${compiz_SOURCE_DIR}/src/logmessage/include ${compiz_SOURCE_DIR}/src/string/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/region/include ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/src/servergrab/include ${COMPIZ_INCLUDE_DIRS} ) add_executable( compiz_option_test ${CMAKE_CURRENT_SOURCE_DIR}/option.cpp ) target_link_libraries( compiz_option_test compiz_core ${GTEST_BOTH_LIBRARIES} ) compiz_discover_tests ( compiz_option_test COVERAGE compiz_core ) compiz-0.9.11+14.04.20140409/src/logmessage/0000755000015301777760000000000012321344021020411 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/logmessage/tests/0000755000015301777760000000000012321344021021553 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/logmessage/tests/test-logmessage.cpp0000644000015301777760000000000012321343002025346 0ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/logmessage/tests/CMakeLists.txt0000644000015301777760000000000012321343002024277 0ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/logmessage/CMakeLists.txt0000644000015301777760000000054412321343002023152 0ustar pbusernogroup00000000000000INCLUDE_DIRECTORIES( ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/logmessage.cpp ) ADD_LIBRARY( compiz_logmessage STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) compiz-0.9.11+14.04.20140409/src/logmessage/src/0000755000015301777760000000000012321344021021200 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/logmessage/src/logmessage.cpp0000644000015301777760000000450712321343002024036 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECI<<<< */ #include #include #include #include const char * logLevelToString (CompLogLevel level) { switch (level) { case CompLogLevelFatal: return "Fatal"; case CompLogLevelError: return "Error"; case CompLogLevelWarn: return "Warn"; case CompLogLevelInfo: return "Info"; case CompLogLevelDebug: return "Debug"; default: break; } return "Unknown"; } void logMessage (const char *componentName, CompLogLevel level, const char *message) { if (!debugOutput && level >= CompLogLevelDebug) return; fprintf (stderr, "%s (%s) - %s: %s\n", programName, componentName, logLevelToString (level), message); } void compLogMessage (const char *componentName, CompLogLevel level, const char *format, ...) { va_list args; char message[2048]; va_start (args, format); vsnprintf (message, 2048, format, args); /* FIXME: That's wrong */ #if 0 if (screen) screen->logMessage (componentName, level, message); else #endif logMessage (componentName, level, message); va_end (args); } compiz-0.9.11+14.04.20140409/src/privateaction.h0000644000015301777760000000376212321343002021312 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _PRIVATEACTION_H #define _PRIVATEACTION_H namespace compiz { namespace actions { class BoundAction { public: virtual ~BoundAction () {} virtual void setActive (bool) = 0; }; void setActionActiveState (const CompAction &action, bool active); } } class PrivateAction : public compiz::actions::BoundAction { public: PrivateAction (); PrivateAction (const PrivateAction&); void setActive (bool); CompAction::CallBack initiate; CompAction::CallBack terminate; CompAction::State state; CompAction::BindingType type; CompAction::KeyBinding key; CompAction::ButtonBinding button; bool bell; unsigned int edgeMask; bool active; CompPrivate priv; }; #endif compiz-0.9.11+14.04.20140409/src/timer/0000755000015301777760000000000012321344021017403 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/timer/tests/0000755000015301777760000000000012321344021020545 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/timer/tests/diffs/0000755000015301777760000000000012321344021021640 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/timer/tests/diffs/src/0000755000015301777760000000000012321344021022427 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/timer/tests/diffs/src/test-timer-diffs.cpp0000644000015301777760000000630012321343002026316 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-timer.h" #include class CompTimerTestDiffs: public CompTimerTest { protected: static void* run (void* cb) { if (cb == NULL) { return NULL; } static_cast(cb)->ml->run(); return NULL; } pthread_t mmainLoopThread; std::list mtriggeredTimers; bool cb (int timernum, CompTimer* t1, CompTimer* t2, CompTimer* t3) { if (timernum == 1 || timernum == 2 || timernum == 3) { RecordProperty("executing timer", timernum); RecordProperty("t1->minLeft", t1->minLeft()); RecordProperty("t1->maxLeft", t1->maxLeft()); RecordProperty("t1->minTime", t1->minTime()); RecordProperty("t1->maxTime", t1->maxTime()); RecordProperty("t3->minLeft", t3->minLeft()); RecordProperty("t3->maxLeft", t3->maxLeft()); RecordProperty("t3->minTime", t3->minTime()); RecordProperty("t3->maxTime", t3->maxTime()); RecordProperty("t3->minLeft", t3->minLeft()); RecordProperty("t3->maxLeft", t3->maxLeft()); RecordProperty("t3->minTime", t3->minTime()); RecordProperty("t3->maxTime", t3->maxTime()); } return false; } void SetUp () { CompTimerTest::SetUp(); mtriggeredTimers.clear(); CompTimer *t1, *t2, *t3; t1 = new CompTimer(); t2 = new CompTimer(); t3 = new CompTimer(); timers.push_back(t1); timers.push_back(t2); timers.push_back(t3); t1->setCallback( boost::bind(&CompTimerTestDiffs::cb, this, 1, t1, t2, t3)); t1->setTimes(1000, 1100); t1->start(); t2->setCallback( boost::bind(&CompTimerTestDiffs::cb, this, 2, t1, t2, t3)); t2->setTimes(2000, 2100); t2->start(); t3->setCallback( boost::bind(&CompTimerTestDiffs::cb, this, 3, t1, t2, t3)); t3->setTimes(3000, 3100); t3->start(); ASSERT_EQ( 0, pthread_create(&mmainLoopThread, NULL, CompTimerTestDiffs::run, this)); ::sleep(4); } void TearDown () { ml->quit(); pthread_join(mmainLoopThread, NULL); CompTimerTest::TearDown(); } }; TEST_F(CompTimerTestDiffs,TimerDiffs) {} compiz-0.9.11+14.04.20140409/src/timer/tests/test-timer.h0000644000015301777760000000351712321343002023017 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_TIMER_H #define _COMPIZ_TEST_TIMER_H #include #include #include #include #include #include #include #include #include class CompTimerTest : public ::testing::Test { public: CompTimerTest (); virtual ~CompTimerTest (); virtual void SetUp (); Glib::RefPtr mc; Glib::RefPtr ml; Glib::RefPtr ts; std::deque timers; int lastTimerTriggered; }; #endif compiz-0.9.11+14.04.20140409/src/timer/tests/test-timer.cpp0000644000015301777760000000372412321343002023352 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-timer.h" CompTimerTest::CompTimerTest () : mc(Glib::MainContext::get_default()), ml(Glib::MainLoop::create(mc, false)), ts(CompTimeoutSource::create(mc)), lastTimerTriggered(0) { } CompTimerTest::~CompTimerTest () { while (timers.size()) { CompTimer *t = timers.front(); timers.pop_front(); delete t; } TimeoutHandler::SetDefault (NULL); ts->destroy (); // calls delete this. Seriously. } class ForceGSliceMalloc { public: ForceGSliceMalloc () { setenv ("G_SLICE", "always-malloc", 1); } ~ForceGSliceMalloc () { unsetenv ("G_SLICE"); } }; namespace { ForceGSliceMalloc fgm; } void CompTimerTest::SetUp () { TimeoutHandler *th = new TimeoutHandler(); TimeoutHandler::SetDefault(th); } compiz-0.9.11+14.04.20140409/src/timer/tests/while-calling/0000755000015301777760000000000012321344021023264 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/timer/tests/while-calling/src/0000755000015301777760000000000012321344021024053 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000014600000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/src/timer/tests/while-calling/src/test-timer-set-times-while-calling.cppcompiz-0.9.11+14.04.20140409/src/timer/tests/while-calling/src/test-timer-set-times-while-calling.cp0000644000015301777760000000752312321343002033126 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-timer.h" #include class CompTimerTestSetTimes: public CompTimerTest { protected: int mlastTimerTriggered; static void* run (void* cb) { if (cb == NULL) { return NULL; } static_cast(cb)->ml->run(); return NULL; } pthread_t mmainLoopThread; std::list mtriggeredTimers; void recordTimers () { for (std::list::iterator it = TimeoutHandler::Default()->timers().begin(); it != TimeoutHandler::Default()->timers().end(); ++it) { CompTimer *t = (*it); RecordProperty("minLeft", t->minLeft()); RecordProperty("maxLeft", t->maxLeft()); RecordProperty("minTime", t->minTime()); RecordProperty("maxTime", t->maxTime()); } } bool cb (int timernum, CompTimer* t1, CompTimer* t2, CompTimer* t3) { cb_(timernum,t1,t2,t3); return(true); } void cb_ (int timernum, CompTimer* t1, CompTimer* t2, CompTimer* t3) { recordTimers(); if (mlastTimerTriggered == 0 && timernum == 1) { /* Change the timeout time of the second timer to be after the third */ t2->setTimes(4000, 4100); recordTimers(); /* Check if it is now at the back of the timeout list */ ASSERT_EQ( TimeoutHandler::Default()->timers().back(), t2 ); } else if (mlastTimerTriggered == 1 && timernum == 2) { recordTimers(); FAIL() << "timer with a higher timeout time got triggered " "before a timer with a lower timeout time"; } else if (mlastTimerTriggered == 2 && timernum != 1) { recordTimers(); FAIL() << "timer with higher timeout time didn't get " "triggered after a lower timeout time"; } mlastTimerTriggered = timernum; } void SetUp () { CompTimerTest::SetUp(); mlastTimerTriggered = 0; CompTimer *t1, *t2, *t3; t1 = new CompTimer(); t2 = new CompTimer(); t3 = new CompTimer(); timers.push_back(t1); timers.push_back(t2); timers.push_back(t3); t1->setCallback( boost::bind(&CompTimerTestSetTimes::cb, this, 1, t1, t2, t3)); t1->setTimes(1000, 1100); t1->start(); t2->setCallback( boost::bind(&CompTimerTestSetTimes::cb, this, 2, t1, t2, t3)); t2->setTimes(2000, 2100); t2->start(); t3->setCallback( boost::bind(&CompTimerTestSetTimes::cb, this, 3, t1, t2, t3)); t3->setTimes(3000, 3100); t3->start(); ASSERT_EQ( 0, pthread_create(&mmainLoopThread, NULL, CompTimerTestSetTimes::run, this)); } void TearDown () { ml->quit(); pthread_join(mmainLoopThread, NULL); CompTimerTest::TearDown(); } }; TEST_F(CompTimerTestSetTimes, SetTimesWhileCalling) { ::sleep(4); // Just a dummy forcing instantiation of fixture. } compiz-0.9.11+14.04.20140409/src/timer/tests/set-values/0000755000015301777760000000000012321344021022635 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/timer/tests/set-values/src/0000755000015301777760000000000012321344021023424 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/timer/tests/set-values/src/test-timer-set-values.cpp0000644000015301777760000000331612321343002030314 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-timer.h" #include TEST_F(CompTimerTest, TimerSetValues) { CompTimer* t1 = new CompTimer (); t1->setTimes (100, 90); t1->start (); usleep (100000); /* minLeft and maxLeft are now * real-time, so wait the guaranteed * expiry time in order to check them * for an accurate value of zero */ ASSERT_EQ (t1->minTime(), 100); ASSERT_EQ (t1->maxTime(), 100); ASSERT_EQ (t1->minLeft(), 0); ASSERT_EQ (t1->maxLeft(), 0); delete t1; } compiz-0.9.11+14.04.20140409/src/timer/tests/CMakeLists.txt0000644000015301777760000000346712321343002023315 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_timer_test ${CMAKE_CURRENT_SOURCE_DIR}/test-timer.cpp) add_executable (compiz_timer_callbacks ${CMAKE_CURRENT_SOURCE_DIR}/callbacks/src/test-timer-callbacks.cpp) add_executable (compiz_timer_diffs ${CMAKE_CURRENT_SOURCE_DIR}/diffs/src/test-timer-diffs.cpp) add_executable (compiz_timer_set-values ${CMAKE_CURRENT_SOURCE_DIR}/set-values/src/test-timer-set-values.cpp) add_executable (compiz_timer_while-calling ${CMAKE_CURRENT_SOURCE_DIR}/while-calling/src/test-timer-set-times-while-calling.cpp) target_link_libraries (compiz_timer_callbacks compiz_timer_test compiz_timer ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) target_link_libraries (compiz_timer_diffs compiz_timer_test compiz_timer ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) target_link_libraries (compiz_timer_set-values compiz_timer_test compiz_timer ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) target_link_libraries (compiz_timer_while-calling compiz_timer_test compiz_timer ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_timer_callbacks COVERAGE compiz_timer) compiz_discover_tests (compiz_timer_diffs COVERAGE compiz_timer) compiz_discover_tests (compiz_timer_set-values COVERAGE compiz_timer) compiz_discover_tests (compiz_timer_while-calling COVERAGE compiz_timer) compiz-0.9.11+14.04.20140409/src/timer/tests/callbacks/0000755000015301777760000000000012321344021022464 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/timer/tests/callbacks/src/0000755000015301777760000000000012321344021023253 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/timer/tests/callbacks/src/test-timer-callbacks.cpp0000644000015301777760000001727212321343002030000 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-timer.h" #include #include using ::testing::InSequence; using ::testing::Invoke; using ::testing::_; using ::testing::AtLeast; namespace { class CompTimerTestCallbackDispatchTable { public: CompTimerTestCallbackDispatchTable () {}; virtual ~CompTimerTestCallbackDispatchTable () {}; virtual bool callback1 (unsigned int num) = 0; virtual bool callback2 (unsigned int num) = 0; virtual bool callback3 (unsigned int num) = 0; protected: }; class MockCompTimerTestCallbackDispatchTable : public CompTimerTestCallbackDispatchTable, boost::noncopyable { public: MOCK_METHOD1 (callback1, bool (unsigned int)); MOCK_METHOD1 (callback2, bool (unsigned int)); MOCK_METHOD1 (callback3, bool (unsigned int)); MockCompTimerTestCallbackDispatchTable (const Glib::RefPtr &ml) : CompTimerTestCallbackDispatchTable (), mMainLoop (ml) { memset (&mCallsCounter, 0, sizeof (mCallsCounter)); ON_CALL (*this, callback1 (_)).WillByDefault (Invoke (this, &MockCompTimerTestCallbackDispatchTable::QuitIfLast)); ON_CALL (*this, callback2 (_)).WillByDefault (Invoke (this, &MockCompTimerTestCallbackDispatchTable::QuitIfLast)); ON_CALL (*this, callback3 (_)).WillByDefault (Invoke (this, &MockCompTimerTestCallbackDispatchTable::QuitIfLast)); }; void setMax (unsigned int timerId, int maxCalls) { mCallsCounter[timerId].maxCalls = maxCalls; } private: Glib::RefPtr mMainLoop; class _counter { public: unsigned int calls; int maxCalls; } mCallsCounter[3]; bool QuitIfLast (unsigned int num) { mCallsCounter[num].calls++; if (mCallsCounter[num].maxCalls < 0 || static_cast (mCallsCounter[num].maxCalls) == mCallsCounter[num].calls) { /* We are the last timer, quit the main loop */ if (TimeoutHandler::Default ()->timers ().size () == 0) { mMainLoop->quit (); return false; } else if (mCallsCounter[num].maxCalls) return false; } return true; }; }; class CompTimerTestCallback: public CompTimerTest { public: CompTimerTestCallback () : mLastAdded (0), mDispatchTable (new MockCompTimerTestCallbackDispatchTable (ml)) { } ~CompTimerTestCallback () { delete mDispatchTable; } protected: unsigned int mLastAdded; MockCompTimerTestCallbackDispatchTable *mDispatchTable; void AddTimer (unsigned int min, unsigned int max, const boost::function &callback, int maxAllowedCalls) { timers.push_back (new CompTimer ()); timers.back ()->setTimes (min, max); timers.back ()->setCallback (callback); ASSERT_FALSE (callback.empty ()); /* TimeoutHandler::timers should be empty */ EXPECT_TRUE (TimeoutHandler::Default ()->timers ().empty ()) << "timers list is not empty"; mDispatchTable->setMax (mLastAdded, maxAllowedCalls); mLastAdded++; } void Run () { for (std::deque ::iterator it = timers.begin (); it != timers.end (); ++it) (*it)->start (); /* TimeoutHandler::timers should have the timer that * is going to trigger first at the front of the * list and the last timer at the back */ if (TimeoutHandler::Default ()->timers ().front () != timers.back ()) { RecordProperty ("TimeoutHandler::Default ().size", TimeoutHandler::Default ()->timers ().size ()); RecordProperty ("TimeoutHandler::Default ().front->minLeft", TimeoutHandler::Default ()->timers ().front ()->minLeft()); RecordProperty ("TimeoutHandler::Default ().front->maxLeft", TimeoutHandler::Default ()->timers ().front ()->maxLeft()); RecordProperty ("TimeoutHandler::Default ().front->minTime", TimeoutHandler::Default ()->timers ().front ()->minTime()); RecordProperty ("TimeoutHandler::Default ().front->maxTime", TimeoutHandler::Default ()->timers ().front ()->maxTime()); RecordProperty ("TimeoutHandler::Default ().back->minLeft", TimeoutHandler::Default ()->timers ().back ()->minLeft()); RecordProperty ("TimeoutHandler::Default ().back->maxLeft", TimeoutHandler::Default ()->timers ().back ()->maxLeft()); RecordProperty ("TimeoutHandler::Default ().back->minTime", TimeoutHandler::Default ()->timers ().back ()->minTime()); RecordProperty ("TimeoutHandler::Default ().back->maxTime", TimeoutHandler::Default ()->timers ().back ()->maxTime()); FAIL () << "timer with the least time is not at the front"; } if (TimeoutHandler::Default ()->timers ().back () != timers.front ()) { FAIL () << "timer with the most time is not at the back"; } ml->run (); } void SetUp () { CompTimerTest::SetUp (); ::sleep (1); } void TearDown () { CompTimerTest::TearDown (); } }; TEST_F(CompTimerTestCallback, TimerOrder) { AddTimer (1000, 1100, boost::bind (&MockCompTimerTestCallbackDispatchTable::callback1, mDispatchTable, 0), 3); AddTimer (500, 900, boost::bind (&MockCompTimerTestCallbackDispatchTable::callback2, mDispatchTable, 1), 6); AddTimer (0, 0, boost::bind (&MockCompTimerTestCallbackDispatchTable::callback3, mDispatchTable, 2), 10); /* TimeoutHandler::timers should be empty since no timers have started */ ASSERT_TRUE (TimeoutHandler::Default ()->timers ().empty ()) << "timers list is not empty"; InSequence s; EXPECT_CALL (*mDispatchTable, callback3 (2)).Times (10); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); EXPECT_CALL (*mDispatchTable, callback1 (0)).Times (1); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); EXPECT_CALL (*mDispatchTable, callback1 (0)).Times (1); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); EXPECT_CALL (*mDispatchTable, callback1 (0)).Times (1); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); Run (); } TEST_F(CompTimerTestCallback, NoZeroStarvation) { AddTimer (100, 110, boost::bind (&MockCompTimerTestCallbackDispatchTable::callback1, mDispatchTable, 0), 1); AddTimer (50, 90, boost::bind (&MockCompTimerTestCallbackDispatchTable::callback2, mDispatchTable, 1), 1); AddTimer (0, 0, boost::bind (&MockCompTimerTestCallbackDispatchTable::callback3, mDispatchTable, 2), -1); EXPECT_CALL (*mDispatchTable, callback3 (2)).Times (AtLeast (1)); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); EXPECT_CALL (*mDispatchTable, callback1 (0)).Times (1); Run (); } } compiz-0.9.11+14.04.20140409/src/timer/CMakeLists.txt0000644000015301777760000000222312321343002022140 0ustar pbusernogroup00000000000000pkg_check_modules( GLIBMM REQUIRED glibmm-2.4 ) INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/timer.h ${CMAKE_CURRENT_SOURCE_DIR}/include/core/timeouthandler.h ) SET( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/privatetimeouthandler.h ${CMAKE_CURRENT_SOURCE_DIR}/src/privatetimeoutsource.h ${CMAKE_CURRENT_SOURCE_DIR}/src/privatetimer.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/timeouthandler.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/timer.cpp ) ADD_LIBRARY( compiz_timer STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_timer PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_timer ${GLIBMM_LIBRARIES} ) compiz-0.9.11+14.04.20140409/src/timer/src/0000755000015301777760000000000012321344021020172 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/timer/src/privatetimeoutsource.h0000644000015301777760000000351712321343002024651 0ustar pbusernogroup00000000000000/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #ifndef _COMPIZ_PRIVATETIMEOUTSOURCE_H #define _COMPIZ_PRIVATETIMEOUTSOURCE_H class CompTimeoutSource : public Glib::Source { public: virtual ~CompTimeoutSource (); static Glib::RefPtr create (Glib::RefPtr &ctx); sigc::connection connect (const sigc::slot &slot); protected: bool prepare (int &timeout); bool check (); bool dispatch (sigc::slot_base *slot); bool callback (); explicit CompTimeoutSource (Glib::RefPtr &ctx); friend class CompTimer; }; #endif compiz-0.9.11+14.04.20140409/src/timer/src/privatetimeouthandler.h0000644000015301777760000000263112321343002024762 0ustar pbusernogroup00000000000000/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_PRIVATETIMEOUTHANDLER_H #define _COMPIZ_PRIVATETIMEOUTHANDLER_H #include class PrivateTimeoutHandler { public: std::list mTimers; }; #endif compiz-0.9.11+14.04.20140409/src/timer/src/timer.cpp0000644000015301777760000001627112321343002022023 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include #include #include "privatetimeoutsource.h" #include "privatetimer.h" #define foreach BOOST_FOREACH CompTimeoutSource::CompTimeoutSource (Glib::RefPtr &ctx) : Glib::Source () { /* * Compiz MUST use priority G_PRIORITY_DEFAULT because that's the same * as GDK_PRIORITY_EVENTS. * * Any higher priority than that and you will starve the glib event loop * of X events. That causes stuttering and even complete starvation * can cause compiz to hang inside X11/GLX functions indefinitely. * In the best case, GLX functions would be slowed down by their messages * being prioritized lower than us. * * Any lower priority than that and screen redraws can lag behind * important things like dragging windows around. * * We have an "unfair" scheduling algorithm in the glib main event loop * to thank for all this. Ideally, compiz should be threaded so it never * slows down the handling of X11/GLX messages in the glib main loop, or * vice-versa. */ set_priority (G_PRIORITY_DEFAULT); attach (ctx); connect (sigc::mem_fun (this, &CompTimeoutSource::callback)); } CompTimeoutSource::~CompTimeoutSource () { } sigc::connection CompTimeoutSource::connect (const sigc::slot &slot) { return connect_generic (slot); } Glib::RefPtr CompTimeoutSource::create (Glib::RefPtr &ctx) { return Glib::RefPtr (new CompTimeoutSource (ctx)); } static const unsigned short COMPIZ_TIMEOUT_WAIT = 15; bool CompTimeoutSource::prepare (int &timeout) { /* Determine time to wait */ if (TimeoutHandler::Default ()->timers ().empty ()) { /* This kind of sucks, but we have to do it, considering * that glib provides us no safe way to remove the source - * thankfully we shouldn't ever be hitting this case since * we create the source after we start pingTimer * and that doesn't stop until compiz does */ timeout = COMPIZ_TIMEOUT_WAIT; return true; } if (TimeoutHandler::Default ()->timers ().front ()->minLeft () > 0) { std::list::iterator it = TimeoutHandler::Default ()->timers ().begin (); CompTimer *t = (*it); timeout = t->maxLeft (); while (it != TimeoutHandler::Default ()->timers ().end ()) { t = (*it); if (t->minLeft () >= (unsigned int) timeout) break; if (t->maxLeft () < (unsigned int) timeout) timeout = (int) t->maxLeft (); ++it; } } else { timeout = 0; } return timeout <= 0; } bool CompTimeoutSource::check () { return (!TimeoutHandler::Default ()->timers ().empty () && TimeoutHandler::Default ()->timers ().front ()->minLeft () <= 0); } bool CompTimeoutSource::dispatch (sigc::slot_base *slot) { (*static_cast *> (slot)) (); return true; } bool CompTimeoutSource::callback () { TimeoutHandler *handler = TimeoutHandler::Default (); std::list requeue, &timers = handler->timers (); while (!timers.empty ()) { CompTimer *t = timers.front (); if (t->minLeft () > 0) break; timers.pop_front (); t->setActive (false); if (t->triggerCallback ()) requeue.push_back (t); } std::list::const_iterator i = requeue.begin (); for (; i != requeue.end (); ++i) { CompTimer *t = *i; handler->addTimer (t); t->setActive (true); } return !timers.empty (); } PrivateTimer::PrivateTimer () : mActive (false), mMinTime (0), mMaxTime (0), mMinDeadline (0), mMaxDeadline (0), mCallBack (NULL) { } PrivateTimer::~PrivateTimer () { } CompTimer::CompTimer () : priv (new PrivateTimer ()) { assert (priv); } CompTimer::~CompTimer () { TimeoutHandler::Default ()->removeTimer (this); delete priv; } void CompTimer::setTimes (unsigned int min, unsigned int max) { bool wasActive = priv->mActive; if (priv->mActive) stop (); priv->mMinTime = min; priv->mMaxTime = (min <= max)? max : min; if (wasActive) start (); } void CompTimer::setExpiryTimes (unsigned int min, unsigned int max) { gint64 now = g_get_monotonic_time (); priv->mMinDeadline = now + (static_cast (min) * 1000); priv->mMaxDeadline = now + (static_cast (max >= min ? max : min) * 1000); } void CompTimer::decrement (unsigned int diff) { /* deprecated */ } void CompTimer::setActive (bool active) { priv->mActive = active; } bool CompTimer::triggerCallback () { return priv->mCallBack (); } void CompTimer::setCallback (CompTimer::CallBack callback) { bool wasActive = priv->mActive; if (priv->mActive) stop (); priv->mCallBack = callback; if (wasActive) start (); } void CompTimer::start () { stop (); if (priv->mCallBack.empty ()) { /* FIXME: compLogMessage needs to be testable */ #if 0 compLogMessage ("core", CompLogLevelWarn, "Attempted to start timer without callback."); #endif return; } priv->mActive = true; TimeoutHandler::Default ()->addTimer (this); } void CompTimer::start (unsigned int min, unsigned int max) { setTimes (min, max); start (); } void CompTimer::start (CompTimer::CallBack callback, unsigned int min, unsigned int max) { setTimes (min, max); setCallback (callback); start (); } void CompTimer::stop () { priv->mActive = false; TimeoutHandler::Default ()->removeTimer (this); } unsigned int CompTimer::minTime () { return priv->mMinTime; } unsigned int CompTimer::maxTime () { return priv->mMaxTime; } unsigned int CompTimer::minLeft () { gint64 now = g_get_monotonic_time (); return (priv->mMinDeadline > now) ? (unsigned int)(priv->mMinDeadline - now + 500) / 1000 : 0; } unsigned int CompTimer::maxLeft () { gint64 now = g_get_monotonic_time (); return (priv->mMaxDeadline > now) ? (unsigned int)(priv->mMaxDeadline - now + 500) / 1000 : 0; } bool CompTimer::active () { return priv->mActive; } compiz-0.9.11+14.04.20140409/src/timer/src/privatetimer.h0000644000015301777760000000306412321343002023057 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include #ifndef _PRIVATETIMER_H #define _PRIVATETIMER_H class PrivateTimer { public: PrivateTimer (); ~PrivateTimer (); bool mActive; unsigned int mMinTime; unsigned int mMaxTime; gint64 mMinDeadline; gint64 mMaxDeadline; CompTimer::CallBack mCallBack; }; #endif compiz-0.9.11+14.04.20140409/src/timer/src/timeouthandler.cpp0000644000015301777760000000477212321343002023732 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "privatetimeouthandler.h" #include "core/timer.h" #include #include namespace { static boost::scoped_ptr gDefault; } TimeoutHandler::TimeoutHandler () : priv (new PrivateTimeoutHandler ()) { } TimeoutHandler::~TimeoutHandler () { delete priv; } void TimeoutHandler::addTimer (CompTimer *timer) { std::list::iterator it; it = std::find (priv->mTimers.begin (), priv->mTimers.end (), timer); if (it != priv->mTimers.end ()) return; for (it = priv->mTimers.begin (); it != priv->mTimers.end (); ++it) { if (timer->minTime () < (*it)->minLeft ()) break; } timer->setExpiryTimes (timer->minTime (), timer->maxTime ()); priv->mTimers.insert (it, timer); } void TimeoutHandler::removeTimer (CompTimer *timer) { std::list::iterator it; it = std::find (priv->mTimers.begin (), priv->mTimers.end (), timer); if (it == priv->mTimers.end ()) return; priv->mTimers.erase (it); } std::list & TimeoutHandler::timers () { return priv->mTimers; } TimeoutHandler * TimeoutHandler::Default () { return gDefault.get(); } void TimeoutHandler::SetDefault (TimeoutHandler *instance) { gDefault.reset(instance); } compiz-0.9.11+14.04.20140409/src/timer/include/0000755000015301777760000000000012321344021021026 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/timer/include/core/0000755000015301777760000000000012321344021021756 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/timer/include/core/timeouthandler.h0000644000015301777760000000332512321343002025154 0ustar pbusernogroup00000000000000/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TIMEOUTHANDLER_H #define _COMPIZ_TIMEOUTHANDLER_H #include #include class PrivateTimeoutHandler; class CompTimer; class TimeoutHandler : boost::noncopyable { public: TimeoutHandler (); ~TimeoutHandler (); void addTimer (CompTimer *timer); void removeTimer (CompTimer *timer); std::list & timers (); static TimeoutHandler * Default (); static void SetDefault (TimeoutHandler *); private: PrivateTimeoutHandler *priv; }; #endif compiz-0.9.11+14.04.20140409/src/timer/include/core/timer.h0000644000015301777760000000716212321343002023253 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _TIMER_H #define _TIMER_H #include #include #include class CompTimeoutSource; class PrivateTimer; namespace compiz { namespace core { namespace timer { inline int timeval_diff (struct timeval *tv1, struct timeval *tv2) { if (tv1->tv_sec == tv2->tv_sec || tv1->tv_usec >= tv2->tv_usec) return (((tv1->tv_sec - tv2->tv_sec) * 1000000) + (tv1->tv_usec - tv2->tv_usec)) / 1000; else return (((tv1->tv_sec - 1 - tv2->tv_sec) * 1000000) + (1000000 + tv1->tv_usec - tv2->tv_usec)) / 1000; } } } } /** * A simple timer for use with invoking a CallBack during a timed duration. */ class CompTimer { public: typedef boost::function CallBack; /** * Empty constructor setting everything to zero and NULL. */ CompTimer (); /** * Frees the private data for this timer and any information about it's * context. */ ~CompTimer (); /** * Checks if this timer is active and will have it's CallBack invoked. */ bool active (); unsigned int minTime (); unsigned int maxTime (); unsigned int minLeft (); unsigned int maxLeft (); /** * FIXME: Remove from the public API */ void setExpiryTimes (unsigned int min, unsigned int max = 0); /** * FIXME: Remove from the public API */ void decrement (unsigned int diff); /** * FIXME: Remove from the public API */ void setActive (bool active); /** * FIXME: Remove from the public API */ bool triggerCallback (); /** * Sets the timing durations of this timer. */ void setTimes (unsigned int min, unsigned int max = 0); /** * Sets the callback function to invoke for this timer. This defaults * to NULL. */ void setCallback (CallBack callback); /** * Starts this timer without modifying any of it's parameters. The timer is * stop()'d before this occurs. */ void start (); /** * Starts this timer setting the paramters with setTimes(). The timer is stop()'d * before this occurs. */ void start (unsigned int min, unsigned int max = 0); /** * Starts this timer setting the parameters with setTimes() and setCallback(). The timer is * stop()'d before this occurs. */ void start (CallBack callback, unsigned int min, unsigned int max = 0); /** * Stops this timer. After this the timer should not be active() and it's CallBack shouldn't * be invoked. */ void stop (); private: PrivateTimer *priv; }; #endif compiz-0.9.11+14.04.20140409/src/plugin.cpp0000644000015301777760000003117012321343002020265 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "core/plugin.h" /* XXX: This dependency needs to go away */ #include "privatescreen.h" #include #include #include #include #include #include #include #include #include #include #include #define foreach BOOST_FOREACH static const char here[] = "core"; CompPlugin::Map pluginsMap; CompPlugin::List plugins; class CorePluginVTable : public CompPlugin::VTable { public: bool init (); void markReadyToInstantiate (); void markNoFurtherInstantiation (); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); }; COMPIZ_PLUGIN_20090315 (core, CorePluginVTable) CompPlugin::VTable * getCoreVTable () { if (!coreVTable) { return getCompPluginVTable20090315_core (); } return coreVTable; } bool CorePluginVTable::init () { return true; } void CorePluginVTable::markReadyToInstantiate () { } void CorePluginVTable::markNoFurtherInstantiation () { } CompOption::Vector & CorePluginVTable::getOptions () { return screen->getOptions (); } bool CorePluginVTable::setOption (const CompString &name, CompOption::Value &value) { return screen->setOption (name, value); } static bool cloaderLoadPlugin (CompPlugin *p, const char *path, const char *name) { if (path) return false; if (strcmp (name, getCoreVTable ()->name ().c_str ())) return false; p->vTable = getCoreVTable (); p->devPrivate.ptr = NULL; p->devType = "cloader"; return true; } static void cloaderUnloadPlugin (CompPlugin *p) { delete p->vTable; } static bool dlloaderLoadPlugin (CompPlugin *p, const char *path, const char *name) { CompString file; void *dlhand; bool loaded = false; if (cloaderLoadPlugin (p, path, name)) return true; if (path) { file = path; file += "/"; } file += "lib"; file += name; file += ".so"; compLogMessage (here, CompLogLevelDebug, "Trying to load %s from: %s", name, file.c_str ()); int open_flags = RTLD_NOW; #ifdef DEBUG // Do not unload the library during dlclose. open_flags |= RTLD_NODELETE; // Make the symbols available globally open_flags |= RTLD_GLOBAL; #endif dlhand = dlopen (file.c_str (), open_flags); if (dlhand) { PluginGetInfoProc getInfo; char *error; char sym[1024]; compLogMessage (here, CompLogLevelDebug, "Opened library: %s", file.c_str ()); dlerror (); snprintf (sym, 1024, "getCompPluginVTable20090315_%s", name); getInfo = (PluginGetInfoProc) dlsym (dlhand, sym); error = dlerror (); if (error) { compLogMessage (here, CompLogLevelError, "dlsym: %s", error); getInfo = 0; } if (getInfo) { p->vTable = (*getInfo) (); if (!p->vTable) { compLogMessage (here, CompLogLevelError, "Couldn't get vtable from '%s' plugin", file.c_str ()); } else { p->devPrivate.ptr = dlhand; p->devType = "dlloader"; loaded = true; compLogMessage (here, CompLogLevelDebug, "Loaded plugin %s from: %s", name, file.c_str ()); } } } else { compLogMessage (here, CompLogLevelDebug, "dlopen failed: %s", dlerror ()); } if (!loaded && dlhand) dlclose (dlhand); return loaded; } static void dlloaderUnloadPlugin (CompPlugin *p) { if (p->devType == "dlloader") { const char *name = p->vTable->name ().c_str (); compLogMessage (here, CompLogLevelDebug, "Closing library: %s", name); delete p->vTable; dlclose (p->devPrivate.ptr); } else cloaderUnloadPlugin (p); } LoadPluginProc loaderLoadPlugin = dlloaderLoadPlugin; UnloadPluginProc loaderUnloadPlugin = dlloaderUnloadPlugin; bool CompManager::initPlugin (CompPlugin *p) { const char *name = p->vTable->name ().c_str (); if (!p->vTable->init ()) { compLogMessage (here, CompLogLevelError, "Plugin init failed: %s", name); return false; } p->vTable->markReadyToInstantiate (); if (screen && screen->displayInitialised()) { if (!p->vTable->initScreen (screen)) { compLogMessage (here, CompLogLevelError, "Plugin initScreen failed: %s", name); p->vTable->fini (); return false; } if (!screen->initPluginForScreen (p)) { compLogMessage (here, CompLogLevelError, "initPluginForScreen failed: %s", name); p->vTable->fini (); return false; } } return true; } void CompManager::finiPlugin (CompPlugin *p) { if (screen) { screen->finiPluginForScreen (p); p->vTable->finiScreen (screen); } p->vTable->fini (); p->vTable->markNoFurtherInstantiation (); } bool CompScreen::initPluginForScreen (CompPlugin *p) { WRAPABLE_HND_FUNCTN_RETURN (bool, initPluginForScreen, p) return _initPluginForScreen (p); } bool CompScreenImpl::_initPluginForScreen (CompPlugin *p) { using compiz::private_screen::WindowManager; bool status = true; WindowManager::iterator it, fail; CompWindow *w; it = fail = windowManager.begin (); for (;it != windowManager.end (); ++it) { w = *it; if (!p->vTable->initWindow (w)) { const char *name = p->vTable->name ().c_str (); compLogMessage (here, CompLogLevelError, "initWindow failed for %s", name); fail = it; status = false; break; } } it = windowManager.begin (); for (;it != fail; ++it) { w = *it; p->vTable->finiWindow (w); } return status; } void CompScreen::finiPluginForScreen (CompPlugin *p) { WRAPABLE_HND_FUNCTN (finiPluginForScreen, p) _finiPluginForScreen (p); } void CompScreenImpl::_finiPluginForScreen (CompPlugin *p) { windowManager.forEachWindow(boost::bind(&CompPlugin::VTable::finiWindow, p->vTable, _1)); } bool CompPlugin::screenInitPlugins (CompScreen *s) { CompPlugin::List::reverse_iterator it = plugins.rbegin (); CompPlugin *p = NULL; /* Plugins is a btf list, so iterate it in reverse */ while (it != plugins.rend ()) { p = (*it); if (p->vTable->initScreen (s)) s->initPluginForScreen (p); ++it; } return true; } void CompPlugin::screenFiniPlugins (CompScreen *s) { foreach (CompPlugin *p, plugins) { s->finiPluginForScreen (p); p->vTable->finiScreen (s); } } bool CompPlugin::windowInitPlugins (CompWindow *w) { bool status = true; for (List::reverse_iterator rit = plugins.rbegin (); rit != plugins.rend (); ++rit) { status &= (*rit)->vTable->initWindow (w); } return status; } void CompPlugin::windowFiniPlugins (CompWindow *w) { foreach (CompPlugin *p, plugins) { p->vTable->finiWindow (w); } } CompPlugin * CompPlugin::find (const char *name) { CompPlugin::Map::iterator it = pluginsMap.find (name); if (it != pluginsMap.end ()) return it->second; return NULL; } void CompPlugin::unload (CompPlugin *p) { if (p->vTable) { const char *name = p->vTable->name ().c_str (); compLogMessage (here, CompLogLevelInfo, "Unloading plugin: %s", name); } loaderUnloadPlugin (p); delete p; } CompPlugin * CompPlugin::load (const char *name) { char *compiz_plugin_dir_override = getenv ("COMPIZ_PLUGIN_DIR"); std::auto_ptrp(new CompPlugin ()); p->devPrivate.uval = 0; p->devType = ""; p->vTable = 0; compLogMessage (here, CompLogLevelInfo, "Loading plugin: %s", name); if (compiz_plugin_dir_override) { std::vector paths; boost::split (paths, compiz_plugin_dir_override, boost::is_any_of (":")); foreach (const std::string &path, paths) { if (path.empty ()) continue; if (loaderLoadPlugin (p.get (), path.c_str (), name)) return p.release (); } } if (char* home = getenv ("HOME")) { boost::scoped_array plugindir(new char [strlen (home) + strlen (HOME_PLUGINDIR) + 3]); sprintf (plugindir.get(), "%s/%s", home, HOME_PLUGINDIR); if (loaderLoadPlugin (p.get(), plugindir.get(), name)) return p.release(); } if (loaderLoadPlugin (p.get(), PLUGINDIR, name)) return p.release(); if (loaderLoadPlugin (p.get(), NULL, name)) return p.release(); compLogMessage (here, CompLogLevelError, "Failed to load plugin: %s", name); return 0; } bool CompPlugin::push (CompPlugin *p) { const CompString &name = p->vTable->name (); std::pair insertRet = pluginsMap.insert (std::make_pair (name, p)); if (!insertRet.second) { compLogMessage (here, CompLogLevelWarn, "Plugin '%s' already active", name.c_str ()); return false; } plugins.push_front (p); compLogMessage (here, CompLogLevelInfo, "Starting plugin: %s", name.c_str ()); if (CompManager::initPlugin (p)) { compLogMessage (here, CompLogLevelDebug, "Started plugin: %s", name.c_str ()); } else { compLogMessage (here, CompLogLevelError, "Failed to start plugin: %s", name.c_str ()); pluginsMap.erase (name); plugins.pop_front (); return false; } return true; } CompPlugin * CompPlugin::pop (void) { if (plugins.empty ()) return NULL; CompPlugin *p = plugins.front (); if (!p) return 0; const CompString &name = p->vTable->name (); pluginsMap.erase (name); compLogMessage (here, CompLogLevelInfo, "Stopping plugin: %s", name.c_str ()); CompManager::finiPlugin (p); compLogMessage (here, CompLogLevelDebug, "Stopped plugin: %s", name.c_str ()); plugins.pop_front (); return p; } CompPlugin::List & CompPlugin::getPlugins (void) { return plugins; } int CompPlugin::getPluginABI (const char *name) { CompPlugin *p = find (name); CompString s = name; if (!p) return 0; s += "_ABI"; if (!screen->hasValue (s)) return 0; return screen->getValue (s).uval; } bool CompPlugin::checkPluginABI (const char *name, int abi) { int pluginABI; pluginABI = getPluginABI (name); if (!pluginABI) { compLogMessage (here, CompLogLevelError, "Plugin '%s' not loaded.\n", name); return false; } else if (pluginABI != abi) { compLogMessage (here, CompLogLevelError, "Plugin '%s' has ABI version '%d', expected " "ABI version '%d'.\n", name, pluginABI, abi); return false; } return true; } CompPlugin::VTable::VTable () : mName (""), mSelf (NULL) { } CompPlugin::VTable::~VTable () { if (mSelf) *mSelf = NULL; } void CompPlugin::VTable::initVTable (CompString name, CompPlugin::VTable **self) { mName = name; if (self) { mSelf = self; *mSelf = this; } } const CompString& CompPlugin::VTable::name () const { return mName; } void CompPlugin::VTable::fini () { } bool CompPlugin::VTable::initScreen (CompScreen *) { return true; } void CompPlugin::VTable::finiScreen (CompScreen *) { } bool CompPlugin::VTable::initWindow (CompWindow *) { return true; } void CompPlugin::VTable::finiWindow (CompWindow *) { } CompOption::Vector & CompPlugin::VTable::getOptions () { return noOptions (); } bool CompPlugin::VTable::setOption (const CompString &name, CompOption::Value &value) { return false; } CompAction::Vector & CompPlugin::VTable::getActions () { return noActions (); } compiz-0.9.11+14.04.20140409/src/window/0000755000015301777760000000000012321344021017572 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/constrainment/0000755000015301777760000000000012321344021022456 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/constrainment/tests/0000755000015301777760000000000012321344021023620 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/constrainment/tests/test-window-constrainment.h0000644000015301777760000000300012321343002031126 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_WINDOW_CONSTRAINMENT_H #define _COMPIZ_TEST_WINDOW_CONSTRAINMENT_H #include #include #include #include #include class CompWindowConstrainmentTest : public ::testing::Test { }; #endif compiz-0.9.11+14.04.20140409/src/window/constrainment/tests/to-hints/0000755000015301777760000000000012321344021025365 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/constrainment/tests/to-hints/src/0000755000015301777760000000000012321344021026154 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000016000000000000011212 Lustar 00000000000000compiz-0.9.11+14.04.20140409/src/window/constrainment/tests/to-hints/src/test-window-constrainment-to-hints.cppcompiz-0.9.11+14.04.20140409/src/window/constrainment/tests/to-hints/src/test-window-constrainment-t0000644000015301777760000001437512321343002033516 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-constrainment.h" #include class CompWindowConstrainmentTestToHints : public CompWindowConstrainmentTest { }; TEST_F(CompWindowConstrainmentTestToHints, ToHints) { /* No hints, size is the same */ XSizeHints hints; CompSize size (1000, 1000); memset (&hints, 0, sizeof (XSizeHints)); size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (1000, 1000)); /* Minimum size specified, constrain to minimum size */ size = CompSize (100, 100); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PMinSize; hints.min_width = 500; hints.min_height = 500; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (500, 500)); /* Base size specified, constrain to base size as minimum size */ size = CompSize (100, 100); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize; hints.base_width = 500; hints.base_height = 500; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (500, 500)); /* Minimum and base size specified, constrain to min size as minimum size */ size = CompSize (100, 100); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize | PMinSize; hints.base_width = 700; hints.base_height = 700; hints.min_width = 500; hints.min_height = 500; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (500, 500)); /* Maximum size specified, constrain to minimum size */ size = CompSize (1000, 1000); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PMaxSize; hints.max_width = 500; hints.max_height = 500; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (500, 500)); /* Resize flags specified, constrain to closest low step of * increments for size specified */ size = CompSize (1002, 1002); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize | PResizeInc; hints.base_width = 500; hints.base_height = 500; hints.width_inc = 5; hints.height_inc = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (1000, 1000)); /* Resize flags specified, constrain to closest low step of * increments for size specified */ size = CompSize (1004, 1004); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize | PResizeInc; hints.base_width = 500; hints.base_height = 500; hints.width_inc = 5; hints.height_inc = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (1000, 1000)); /* Resize flags specified, constrain to closest low step of * increments for size specified */ size = CompSize (1006, 1006); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize | PResizeInc; hints.base_width = 500; hints.base_height = 500; hints.width_inc = 5; hints.height_inc = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (1005, 1005)); /* Don't require constrainment on width */ size = CompSize (1002, 1002); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize | PResizeInc; hints.base_width = 500; hints.base_height = 500; hints.width_inc = 5; hints.height_inc = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, compiz::window::constrainment::PHorzResizeInc); EXPECT_EQ (size, CompSize (1002, 1000)); /* Don't require constrainment on height */ size = CompSize (1002, 1002); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize | PResizeInc; hints.base_width = 500; hints.base_height = 500; hints.width_inc = 5; hints.height_inc = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, compiz::window::constrainment::PVertResizeInc); EXPECT_EQ (size, CompSize (1000, 1002)); /* Aspect ratios - don't allow sizes less than 1:2 or more than 2:5 * clamping to the largest size */ size = CompSize (4000, 5000); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PAspect; hints.min_aspect.x = 1; hints.min_aspect.y = 2; hints.max_aspect.x = 2; hints.max_aspect.y = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (2000, 5000)); /* Aspect ratios - don't allow sizes less than 1:2 or more than 2:5 * clamping to the largest size */ size = CompSize (12, 20); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PAspect; hints.min_aspect.x = 1; hints.min_aspect.y = 2; hints.max_aspect.x = 2; hints.max_aspect.y = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (8, 20)); } compiz-0.9.11+14.04.20140409/src/window/constrainment/tests/CMakeLists.txt0000644000015301777760000000134712321343002026363 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_window_constrainment_test ${CMAKE_CURRENT_SOURCE_DIR}/test-window-constrainment.cpp) add_executable (compiz_test_window_constrainment_to_hints ${CMAKE_CURRENT_SOURCE_DIR}/to-hints/src/test-window-constrainment-to-hints.cpp ${compiz_SOURCE_DIR}/src/size.cpp) target_link_libraries (compiz_test_window_constrainment_to_hints compiz_window_constrainment_test compiz_window_constrainment ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_window_constrainment_to_hints COVERAGE compiz_window_constrainment) compiz-0.9.11+14.04.20140409/src/window/constrainment/tests/test-window-constrainment.cpp0000644000015301777760000000236712321343002031500 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-constrainment.h" compiz-0.9.11+14.04.20140409/src/window/constrainment/CMakeLists.txt0000644000015301777760000000230012321343002025207 0ustar pbusernogroup00000000000000pkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry-saver/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/windowconstrainment.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/windowconstrainment.cpp ) ADD_LIBRARY( compiz_window_constrainment STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_window_constrainment PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_window_constrainment compiz_window_geometry compiz_point compiz_rect ${GLIBMM_LIBRARIES} ) compiz-0.9.11+14.04.20140409/src/window/constrainment/src/0000755000015301777760000000000012321344021023245 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/constrainment/src/windowconstrainment.cpp0000644000015301777760000001243412321343002030067 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include static inline int constrainmentFloor (int value, int base) { return (value / base) * base; } static inline uint64_t constrainment64Floor (uint64_t value, uint64_t base) { return (value / base) * base; } static inline float constrainmentClamp(float x, float a, float b) { return x < a ? a : (x > b ? b : x); } CompSize compiz::window::constrainment::constrainToHints (const XSizeHints &hints, const CompSize &size, long ignoreHints, long resizeIgnoreHints) { int width = size.width (); int height = size.height (); int min_width = 1; int min_height = 1; int base_width = 1; int base_height = 1; int xinc = 1; int yinc = 1; int max_width = std::numeric_limits ::max (); int max_height = std::numeric_limits ::max (); long flags = hints.flags & ~ignoreHints; long resizeIncFlags = (flags & PResizeInc) ? ((PHorzResizeInc | PVertResizeInc) & ~resizeIgnoreHints) : 0; /* Ater gdk_window_constrain_size(), which is partially borrowed from fvwm. * * Copyright 1993, Robert Nation * You may use this code for any purpose, as long as the original * copyright remains in the source code and all documentation * * which in turn borrows parts of the algorithm from uwm */ if ((flags & PBaseSize) && (flags & PMinSize)) { base_width = std::max (1, hints.base_width); base_height = std::max (1, hints.base_height); min_width = std::max (1, hints.min_width); min_height = std::max (1, hints.min_height); } else if (flags & PBaseSize) { base_width = std::max (1, hints.base_width); base_height = std::max (1, hints.base_height); min_width = std::max (1, hints.base_width); min_height = std::max (1, hints.base_height); } else if (flags & PMinSize) { base_width = std::max (1, hints.min_width); base_height = std::max (1, hints.min_height); min_width = std::max (1, hints.min_width); min_height = std::max (1, hints.min_height); } if (flags & PMaxSize) { max_width = std::max (1, hints.max_width); max_height = std::max (1, hints.max_height); } if (resizeIncFlags & PHorzResizeInc) xinc = std::max (xinc, hints.width_inc); if (resizeIncFlags & PVertResizeInc) yinc = std::max (yinc, hints.height_inc); /* clamp width and height to min and max values */ width = constrainmentClamp (width, min_width, max_width); height = constrainmentClamp (height, min_height, max_height); /* shrink to base + N * inc */ width = base_width + constrainmentFloor (width - base_width, xinc); height = base_height + constrainmentFloor (height - base_height, yinc); /* constrain aspect ratio, according to: * * min_aspect.x width max_aspect.x * ------------ <= -------- <= ----------- * min_aspect.y height max_aspect.y */ if ((flags & PAspect) && hints.min_aspect.y > 0 && hints.max_aspect.x > 0) { /* Use 64 bit arithmetic to prevent overflow */ uint64_t min_aspect_x = hints.min_aspect.x; uint64_t min_aspect_y = hints.min_aspect.y; uint64_t max_aspect_x = hints.max_aspect.x; uint64_t max_aspect_y = hints.max_aspect.y; uint64_t delta; if (min_aspect_x * height > width * min_aspect_y) { delta = constrainment64Floor (height - width * min_aspect_y / min_aspect_x, yinc); if (height - (int) delta >= min_height) height -= delta; else { delta = constrainment64Floor (height * min_aspect_x / min_aspect_y - width, xinc); if (width + (int) delta <= max_width) width += delta; } } if (width * max_aspect_y > max_aspect_x * height) { delta = constrainment64Floor (width - height * max_aspect_x / max_aspect_y, xinc); if (width - (int) delta >= min_width) width -= delta; else { delta = constrainment64Floor (width * min_aspect_y / min_aspect_x - height, yinc); if (height + (int) delta <= max_height) height += delta; } } } return CompSize (width, height); } compiz-0.9.11+14.04.20140409/src/window/constrainment/include/0000755000015301777760000000000012321344021024101 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/constrainment/include/core/0000755000015301777760000000000012321344021025031 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/constrainment/include/core/windowconstrainment.h0000644000015301777760000000344112321343002031316 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPWINDOWCONSTRAINMENT_H #define _COMPWINDOWCONSTRAINMENT_H #include #include #include #include #include #include namespace compiz { namespace window { namespace constrainment { const unsigned int PVertResizeInc = (1 << 0); const unsigned int PHorzResizeInc = (1 << 1); CompSize constrainToHints (const XSizeHints &hints, const CompSize &size, long ignoreHints, long resizeIgnoreHints); } } } #endif compiz-0.9.11+14.04.20140409/src/window/geometry/0000755000015301777760000000000012321344021021425 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry/tests/0000755000015301777760000000000012321344021022567 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry/tests/test-window-geometry.cpp0000644000015301777760000000236212321343002027411 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-geometry.h" compiz-0.9.11+14.04.20140409/src/window/geometry/tests/window-geometry/0000755000015301777760000000000012321344021025727 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry/tests/window-geometry/src/0000755000015301777760000000000012321344021026516 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry/tests/window-geometry/src/test-window-geometry.cpp0000644000015301777760000000611112321343002033334 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-geometry.h" class CompWindowGeometryTestGeometry : public CompWindowGeometryTest { public: CompWindowGeometryTestGeometry (); ~CompWindowGeometryTestGeometry (); protected: compiz::window::Geometry g; }; CompWindowGeometryTestGeometry::CompWindowGeometryTestGeometry () : g (50, 100, 200, 300, 5) { } CompWindowGeometryTestGeometry::~CompWindowGeometryTestGeometry () { } TEST_F(CompWindowGeometryTestGeometry, TestGeometry) { /* apply x only */ compiz::window::Geometry rg = compiz::window::Geometry (); rg.applyChange (g, CHANGE_X); EXPECT_EQ (rg, compiz::window::Geometry (50, 0, 0, 0, 0)); /* apply y only */ rg = compiz::window::Geometry (); rg.applyChange (g, CHANGE_Y); EXPECT_EQ (rg, compiz::window::Geometry (0, 100, 0, 0, 0)); /* apply width only */ rg = compiz::window::Geometry (); rg.applyChange (g, CHANGE_WIDTH); EXPECT_EQ (rg, compiz::window::Geometry (0, 0, 200, 0, 0)); /* apply height only */ rg = compiz::window::Geometry (); rg.applyChange (g, CHANGE_HEIGHT); EXPECT_EQ (rg, compiz::window::Geometry (0, 0, 0, 300, 0)); /* apply width | height */ rg = compiz::window::Geometry (); rg.applyChange (g, CHANGE_WIDTH | CHANGE_HEIGHT); EXPECT_EQ (rg, compiz::window::Geometry (0, 0, 200, 300, 0)); /* change mask for x | y | width | height */ rg = compiz::window::Geometry (49, 99, 199, 299, 5); unsigned int mask = rg.changeMask (g); EXPECT_EQ (rg, compiz::window::Geometry (49, 99, 199, 299, 5)); EXPECT_EQ (mask, CHANGE_X | CHANGE_Y | CHANGE_WIDTH | CHANGE_HEIGHT); } TEST_F(CompWindowGeometryTestGeometry, TestBorders) { compiz::window::Geometry g (1, 1, 1, 1, 1); EXPECT_EQ (g.xMinusBorder (), 0); EXPECT_EQ (g.yMinusBorder (), 0); EXPECT_EQ (g.widthIncBorders (), 3); EXPECT_EQ (g.heightIncBorders (), 3); } compiz-0.9.11+14.04.20140409/src/window/geometry/tests/test-window-geometry.h0000644000015301777760000000274212321343002027060 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_WINDOW_GEOMETRY_H #define _COMPIZ_TEST_WINDOW_GEOMETRY_H #include #include #include #include #include class CompWindowGeometryTest : public ::testing::Test { }; #endif compiz-0.9.11+14.04.20140409/src/window/geometry/tests/CMakeLists.txt0000644000015301777760000000117112321343002025325 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_window_geometry_test ${CMAKE_CURRENT_SOURCE_DIR}/test-window-geometry.cpp) add_executable (compiz_test_window_geometry ${CMAKE_CURRENT_SOURCE_DIR}/window-geometry/src/test-window-geometry.cpp) target_link_libraries (compiz_test_window_geometry compiz_window_geometry_test compiz_window_geometry ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_window_geometry COVERAGE compiz_window_geometry) compiz-0.9.11+14.04.20140409/src/window/geometry/CMakeLists.txt0000644000015301777760000000204012321343002024157 0ustar pbusernogroup00000000000000pkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/windowgeometry.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/windowgeometry.cpp ) ADD_LIBRARY( compiz_window_geometry STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_window_geometry PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_window_geometry compiz_point compiz_rect ${GLIBMM_LIBRARIES} ) compiz-0.9.11+14.04.20140409/src/window/geometry/src/0000755000015301777760000000000012321344021022214 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry/src/windowgeometry.cpp0000644000015301777760000000541012321343002026001 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include compiz::window::Geometry::Geometry () : mBorder (0) { } compiz::window::Geometry::Geometry (int x, int y, int width, int height, int border) : CompRect (x, y, width, height), mBorder (border) { } int compiz::window::Geometry::border () const { return mBorder; } void compiz::window::Geometry::setBorder (int border) { mBorder = border; } void compiz::window::Geometry::set (int x, int y, int width, int height, int border) { setX (x); setY (y); setWidth (width); setHeight (height); mBorder = border; } unsigned int compiz::window::Geometry::changeMask (const compiz::window::Geometry &g) const { unsigned int mask = 0; if (g.x () != x ()) mask |= CHANGE_X; if (g.y () != y ()) mask |= CHANGE_Y; if (g.width () != width ()) mask |= CHANGE_WIDTH; if (g.height () != height ()) mask |= CHANGE_HEIGHT; if (g.border () != border ()) mask |= CHANGE_BORDER; return mask; } compiz::window::Geometry compiz::window::Geometry::change (const compiz::window::Geometry &g, unsigned int mask) const { compiz::window::Geometry rg = *this; rg.applyChange (g, mask); return rg; } void compiz::window::Geometry::applyChange (const compiz::window::Geometry &g, unsigned int mask) { if (mask & CHANGE_X) setX (g.x ()); if (mask & CHANGE_Y) setY (g.y ()); if (mask & CHANGE_WIDTH) setWidth (g.width ()); if (mask & CHANGE_HEIGHT) setHeight (g.height ()); if (mask & CHANGE_BORDER) setBorder (g.border ()); } compiz-0.9.11+14.04.20140409/src/window/geometry/include/0000755000015301777760000000000012321344021023050 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry/include/core/0000755000015301777760000000000012321344021024000 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry/include/core/windowgeometry.h0000644000015301777760000000474312321343002027242 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPWINDOWGEOMETRY_H #define _COMPWINDOWGEOMETRY_H #include enum ChangeMask { CHANGE_X = 1 << 0, CHANGE_Y = 1 << 1, CHANGE_WIDTH = 1 << 2, CHANGE_HEIGHT = 1 << 3, CHANGE_BORDER = 1 << 4 }; namespace compiz { namespace window { /** * A mutable object about the dimensions and location of a CompWindow. */ class Geometry : public CompRect { public: Geometry (); Geometry (int x, int y, int width, int height, int border); int border () const; void set (int x, int y, int width, int height, int border); void setBorder (int border); unsigned int changeMask (const compiz::window::Geometry &g) const; compiz::window::Geometry change (const compiz::window::Geometry &g, unsigned int mask) const; void applyChange (const compiz::window::Geometry &g, unsigned int mask); int xMinusBorder () const { return x () - mBorder; } int yMinusBorder () const { return y () - mBorder; } unsigned int widthIncBorders () const { return width () + mBorder * 2; } unsigned int heightIncBorders () const { return height () + mBorder * 2; } private: int mBorder; }; } } #endif compiz-0.9.11+14.04.20140409/src/window/extents/0000755000015301777760000000000012321344021021264 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/extents/tests/0000755000015301777760000000000012321344021022426 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/extents/tests/test-window-extents.cpp0000644000015301777760000000236112321343002027106 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-extents.h" compiz-0.9.11+14.04.20140409/src/window/extents/tests/test-window-extents.h0000644000015301777760000000270712321343002026557 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_WINDOW_EXTENTS_H #define _COMPIZ_TEST_WINDOW_EXTENTS_H #include #include #include #include class CompWindowExtentsTest : public ::testing::Test { }; #endif compiz-0.9.11+14.04.20140409/src/window/extents/tests/shift/0000755000015301777760000000000012321344021023543 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/extents/tests/shift/src/0000755000015301777760000000000012321344021024332 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/extents/tests/shift/src/test-window-extents-shift.cpp0000644000015301777760000000465712321343002032137 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-extents.h" #include #include class CompWindowExtentsTestShift : public CompWindowExtentsTest { protected: compiz::window::extents::Extents e; }; TEST_F(CompWindowExtentsTestShift, TestShift) { CompPoint rp; e.left = 5; e.right = 7; e.top = 10; e.bottom = 7; /* Check each gravity */ rp = compiz::window::extents::shift (e, NorthGravity); EXPECT_EQ (rp, CompPoint (0, e.top)); rp = compiz::window::extents::shift (e, NorthWestGravity); EXPECT_EQ (rp, CompPoint (e.left, e.top)); rp = compiz::window::extents::shift (e, NorthEastGravity); EXPECT_EQ (rp, CompPoint (-e.right, e.top)); rp = compiz::window::extents::shift (e, EastGravity); EXPECT_EQ (rp, CompPoint (-e.right, 0)); rp = compiz::window::extents::shift (e, WestGravity); EXPECT_EQ (rp, CompPoint (e.left, 0)); rp = compiz::window::extents::shift (e, SouthGravity); EXPECT_EQ (rp, CompPoint (0, -e.bottom)); rp = compiz::window::extents::shift (e, SouthWestGravity); EXPECT_EQ (rp, CompPoint (e.left, -e.bottom)); rp = compiz::window::extents::shift (e, SouthEastGravity); EXPECT_EQ (rp, CompPoint (-e.right, -e.bottom)); } compiz-0.9.11+14.04.20140409/src/window/extents/tests/CMakeLists.txt0000644000015301777760000000117612321343002025171 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_window_extents_test ${CMAKE_CURRENT_SOURCE_DIR}/test-window-extents.cpp) add_executable (compiz_test_window_extents_shift ${CMAKE_CURRENT_SOURCE_DIR}/shift/src/test-window-extents-shift.cpp) target_link_libraries (compiz_test_window_extents_shift compiz_window_extents_test compiz_window_extents ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_window_extents_shift COVERAGE compiz_window_extents) compiz-0.9.11+14.04.20140409/src/window/extents/CMakeLists.txt0000644000015301777760000000175212321343002024027 0ustar pbusernogroup00000000000000pkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src/point/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/windowextents.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/windowextents.cpp ) ADD_LIBRARY( compiz_window_extents STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_window_extents PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_window_extents compiz_point ${GLIBMM_LIBRARIES} ) compiz-0.9.11+14.04.20140409/src/window/extents/src/0000755000015301777760000000000012321344021022053 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/extents/src/windowextents.cpp0000644000015301777760000000656412321343002025512 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include CompPoint compiz::window::extents::shift (const CompWindowExtents &extents, unsigned int gravity) { CompPoint rv = CompPoint (); switch (gravity) { /* We treat StaticGravity like NorthWestGravity here * as when decorating / undecorating the window we * really do need to move it in order to handle * any cases where it goes offscreen */ case StaticGravity: case NorthGravity: case NorthWestGravity: case NorthEastGravity: rv.setY (extents.top); break; case SouthGravity: case SouthWestGravity: case SouthEastGravity: rv.setY (-extents.bottom); break; default: break; } switch (gravity) { /* We treat StaticGravity like NorthWestGravity here * as when decorating / undecorating the window we * really do need to move it in order to handle * any cases where it goes offscreen */ case StaticGravity: case WestGravity: case NorthWestGravity: case SouthWestGravity: rv.setX (extents.left); break; case EastGravity: case NorthEastGravity: case SouthEastGravity: rv.setX (-extents.right); break; } return rv; } compiz::window::extents::Extents::Extents () : left (0), right (0), top (0), bottom (0) {} compiz::window::extents::Extents::Extents (int left, int right, int top, int bottom) : left (left), right (right), top (top), bottom (bottom) {} /* Just here to keep ABI compatability */ bool compiz::window::extents::Extents::operator== (const Extents &other) { const Extents &self = const_cast (*this); return self == other; } bool compiz::window::extents::Extents::operator== (const Extents &other) const { return this->left == other.left && this->right == other.right && this->top == other.top && this->bottom == other.bottom; } /* Just here to keep ABI compatability */ bool compiz::window::extents::Extents::operator!= (const Extents &other) { const Extents &self = const_cast (*this); return self != other; } bool compiz::window::extents::Extents::operator!= (const Extents &other) const { return !(*this == other); } compiz-0.9.11+14.04.20140409/src/window/extents/include/0000755000015301777760000000000012321344021022707 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/extents/include/core/0000755000015301777760000000000012321344021023637 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/extents/include/core/windowextents.h0000644000015301777760000000405112321343002026730 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPWINDOWEXTENTS_H #define _COMPWINDOWEXTENTS_H #include namespace compiz { namespace window { namespace extents { /** * Specifies the left, right, top and bottom positions of a window's * geometry */ class Extents { public: Extents (); Extents (int left, int right, int top, int bottom); int left; int right; int top; int bottom; bool operator== (const Extents &other) const; bool operator!= (const Extents &other) const; /* Only here for ABI compatability */ bool operator== (const Extents &other); bool operator!= (const Extents &other); }; CompPoint shift (const Extents &extents, unsigned int gravity = 0); } } } typedef compiz::window::extents::Extents CompWindowExtents; #endif compiz-0.9.11+14.04.20140409/src/window/CMakeLists.txt0000644000015301777760000000017212321343002022330 0ustar pbusernogroup00000000000000add_subdirectory (geometry) add_subdirectory (geometry-saver) add_subdirectory (extents) add_subdirectory (constrainment) compiz-0.9.11+14.04.20140409/src/window/geometry-saver/0000755000015301777760000000000012321344021022543 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry-saver/tests/0000755000015301777760000000000012321344021023705 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry-saver/tests/test-window-geometry-saver.cpp0000644000015301777760000000237012321343002031644 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-geometry-saver.h" compiz-0.9.11+14.04.20140409/src/window/geometry-saver/tests/window-geometry-saver/0000755000015301777760000000000012321344021030163 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry-saver/tests/window-geometry-saver/src/0000755000015301777760000000000012321344021030752 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000016600000000000011220 Lustar 00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry-saver/tests/window-geometry-saver/src/test-window-geometry-saver.cppcompiz-0.9.11+14.04.20140409/src/window/geometry-saver/tests/window-geometry-saver/src/test-window-g0000644000015301777760000000712112321343002033404 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-geometry-saver.h" class CompWindowGeometryTestSaver : public CompWindowGeometryTest { public: CompWindowGeometryTestSaver (); virtual ~CompWindowGeometryTestSaver (); protected: compiz::window::Geometry g; compiz::window::GeometrySaver saver; }; CompWindowGeometryTestSaver::CompWindowGeometryTestSaver () : g (100, 100, 300, 300, 5), saver (g) { } CompWindowGeometryTestSaver::~CompWindowGeometryTestSaver () { } TEST_F(CompWindowGeometryTestSaver, TestSaver) { /* g by default */ compiz::window::Geometry rg; unsigned int mask = saver.get (rg); EXPECT_EQ (mask, 0); EXPECT_EQ (rg, compiz::window::Geometry (100, 100, 300, 300, 5)); /* Push X value on to the saved geometry */ saver.push (g, CHANGE_X); mask = saver.get (rg); EXPECT_EQ (mask, CHANGE_X); EXPECT_EQ (rg, compiz::window::Geometry (100, 100, 300, 300, 5)); /* Push Y and Width values on to the saved geometry */ saver.push (g, CHANGE_Y | CHANGE_WIDTH); mask = saver.get (rg); EXPECT_EQ (mask, CHANGE_X | CHANGE_Y | CHANGE_WIDTH); EXPECT_EQ (rg, compiz::window::Geometry (100, 100, 300, 300, 5)); /* Pop Y value off the saved geoemtry */ rg = compiz::window::Geometry (); mask = saver.pop (rg, CHANGE_Y); EXPECT_EQ (mask, CHANGE_Y); EXPECT_EQ (rg, compiz::window::Geometry (0, 100, 0, 0, 0)); /* Attempt to pop X Y and Height off the saved geometry, * but since Y is not saved, only expect X */ rg = compiz::window::Geometry (); mask = saver.pop (rg, CHANGE_X | CHANGE_Y | CHANGE_HEIGHT); EXPECT_EQ (mask, CHANGE_X); EXPECT_EQ (rg, compiz::window::Geometry (100, 0, 0, 0, 0)); /* Update the saved geometry (eg, workspace change) and * pop the new value off */ rg = compiz::window::Geometry (); g.setWidth (1200); saver.update (g, CHANGE_WIDTH); mask = saver.pop (rg, CHANGE_WIDTH); EXPECT_EQ (mask, CHANGE_WIDTH); EXPECT_EQ (rg, compiz::window::Geometry (0, 0, 1200, 0, 0)); /* Try to push twice, only allow the first value to be popped off */ rg = compiz::window::Geometry (); g.setWidth (1000); saver.push (g, CHANGE_WIDTH); g.setWidth (1200); saver.push (g, CHANGE_WIDTH); mask = saver.pop (rg, CHANGE_WIDTH); EXPECT_EQ (mask, CHANGE_WIDTH); EXPECT_EQ (rg, compiz::window::Geometry (0, 0, 1000, 0, 0)); } compiz-0.9.11+14.04.20140409/src/window/geometry-saver/tests/CMakeLists.txt0000644000015301777760000000126512321343002026447 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_window_geometry_saver_test ${CMAKE_CURRENT_SOURCE_DIR}/test-window-geometry-saver.cpp) add_executable (compiz_test_window_geometry_saver ${CMAKE_CURRENT_SOURCE_DIR}/window-geometry-saver/src/test-window-geometry-saver.cpp) target_link_libraries (compiz_test_window_geometry_saver compiz_window_geometry_saver_test compiz_window_geometry_saver ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_window_geometry_saver COVERAGE compiz_window_geometry_saver) compiz-0.9.11+14.04.20140409/src/window/geometry-saver/tests/test-window-geometry-saver.h0000644000015301777760000000274712321343002031321 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_WINDOW_GEOMETRY_H #define _COMPIZ_TEST_WINDOW_GEOMETRY_H #include #include #include #include #include class CompWindowGeometryTest : public ::testing::Test { }; #endif compiz-0.9.11+14.04.20140409/src/window/geometry-saver/CMakeLists.txt0000644000015301777760000000215412321343002025303 0ustar pbusernogroup00000000000000pkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/windowgeometrysaver.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/geometrysaver.cpp ) ADD_LIBRARY( compiz_window_geometry_saver STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_window_geometry_saver PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES ( compiz_window_geometry_saver compiz_window_geometry ${GLIBMM_LIBRARIES} ) compiz-0.9.11+14.04.20140409/src/window/geometry-saver/src/0000755000015301777760000000000012321344021023332 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry-saver/src/geometrysaver.cpp0000644000015301777760000000442312321343002026733 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include compiz::window::GeometrySaver::GeometrySaver (const Geometry &g) : mGeometry (g), mMask (0) { } unsigned int compiz::window::GeometrySaver::push (const Geometry &g, unsigned int mask) { /* Don't allow overwriting of any already set geometry */ unsigned int useMask = mask & ~mMask; mMask |= useMask; mGeometry.applyChange (g, useMask); return useMask; } unsigned int compiz::window::GeometrySaver::pop (Geometry &g, unsigned int mask) { unsigned int restoreMask = mask & mMask; mMask &= ~restoreMask; g.applyChange (mGeometry, restoreMask); return restoreMask; } void compiz::window::GeometrySaver::update (const Geometry &g, unsigned int mask) { /* By default, only update bits that have not been saved */ unsigned int updateMask = ~mMask; /* But also update bits that we are forcing an update on */ updateMask |= mask; mGeometry.applyChange (g, updateMask); } unsigned int compiz::window::GeometrySaver::get (Geometry &g) { g = mGeometry; return mMask; } compiz-0.9.11+14.04.20140409/src/window/geometry-saver/include/0000755000015301777760000000000012321344021024166 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry-saver/include/core/0000755000015301777760000000000012321344021025116 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/window/geometry-saver/include/core/windowgeometrysaver.h0000644000015301777760000000560212321343002031414 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPWINDOWGEOMETRYSAVER_H #define _COMPWINDOWGEOMETRYSAVER_H #include #include namespace compiz { namespace window { /** * A one-level push-pop stack for saving window geometry * parameters, eg, to maximize and demaximize windows * and make sure they are restored to the same place * relative to the window */ class GeometrySaver { public: GeometrySaver (const Geometry &g); /** * Push some new geometry into the saved bits * * @param g a const compiz::window::Geometry & of the geometry * you wish to push * @param mask an unsigned int indicating which bits of the * specified geometry should be saved * @return the bits actually saved */ unsigned int push (const Geometry &g, unsigned int mask); /** * Restore saved geometry * * @param g a compiz::window::Geometry & of the geometry * which should be written into * @param mask an unsigned int indicating which bits of the * geometry should be restored * @return the bits actually restored */ unsigned int pop (Geometry &g, unsigned int mask); /** * Force update certain saved geometry bits * * @param g a const compiz::window::Geometry & of the geometry * you wish to update * @param mask an unsigned int indicating which bits of the * specified geometry should be updated */ void update (const Geometry &g, unsigned int mask); unsigned int get (Geometry &g); private: Geometry mGeometry; unsigned int mMask; }; } } #endif compiz-0.9.11+14.04.20140409/src/signalsource.cpp0000644000015301777760000000435712321343002021474 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical, Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical, Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical, Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL Canonical, Ltd. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #include "privatesignalsource.h" /* Add missing decls: https://bugzilla.gnome.org/show_bug.cgi?id=663880 */ #include G_BEGIN_DECLS #include G_END_DECLS CompSignalSource * CompSignalSource::create (int signum, const callbackFunc &f) { return new CompSignalSource (signum, f); } CompSignalSource::CompSignalSource (int signum, const callbackFunc &f) : mFunc (f), mSignal (signum), mSource (g_unix_signal_add_full (G_PRIORITY_HIGH, signum, CompSignalSource::callback, this, CompSignalSource::destroyed)) { } gboolean CompSignalSource::callback (gpointer user_data) { CompSignalSource *self = static_cast (user_data); self->mFunc (self->mSignal); return TRUE; } void CompSignalSource::destroyed (gpointer user_data) { CompSignalSource *self = static_cast (user_data); self->mSource = 0; } CompSignalSource::~CompSignalSource () { /* Do not remove, see LP: #1085590 */ if (mSource) g_source_remove (mSource); } compiz-0.9.11+14.04.20140409/src/atoms.cpp0000644000015301777760000002472412321343002020121 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include namespace Atoms { Atom supported; Atom supportingWmCheck; Atom utf8String; Atom wmName; Atom winType; Atom winTypeDesktop; Atom winTypeDock; Atom winTypeToolbar; Atom winTypeMenu; Atom winTypeUtil; Atom winTypeSplash; Atom winTypeDialog; Atom winTypeNormal; Atom winTypeDropdownMenu; Atom winTypePopupMenu; Atom winTypeTooltip; Atom winTypeNotification; Atom winTypeCombo; Atom winTypeDnd; Atom winOpacity; Atom winBrightness; Atom winSaturation; Atom winActive; Atom winDesktop; Atom workarea; Atom desktopViewport; Atom desktopGeometry; Atom currentDesktop; Atom numberOfDesktops; Atom winState; Atom winStateModal; Atom winStateSticky; Atom winStateMaximizedVert; Atom winStateMaximizedHorz; Atom winStateShaded; Atom winStateSkipTaskbar; Atom winStateSkipPager; Atom winStateHidden; Atom winStateFullscreen; Atom winStateAbove; Atom winStateBelow; Atom winStateDemandsAttention; Atom winStateDisplayModal; Atom winStateFocused; Atom winActionMove; Atom winActionResize; Atom winActionStick; Atom winActionMinimize; Atom winActionMaximizeHorz; Atom winActionMaximizeVert; Atom winActionFullscreen; Atom winActionClose; Atom winActionShade; Atom winActionChangeDesktop; Atom winActionAbove; Atom winActionBelow; Atom wmAllowedActions; Atom wmStrut; Atom wmStrutPartial; Atom wmUserTime; Atom wmIcon; Atom wmIconGeometry; Atom clientList; Atom clientListStacking; Atom frameExtents; Atom frameWindow; Atom wmState; Atom wmChangeState; Atom wmProtocols; Atom wmClientLeader; Atom wmDeleteWindow; Atom wmTakeFocus; Atom wmPing; Atom wmSyncRequest; Atom wmSyncRequestCounter; Atom wmFullscreenMonitors; Atom closeWindow; Atom wmMoveResize; Atom moveResizeWindow; Atom restackWindow; Atom showingDesktop; Atom xBackground[2]; Atom toolkitAction; Atom toolkitActionWindowMenu; Atom toolkitActionForceQuitDialog; Atom mwmHints; Atom xdndAware; Atom xdndEnter; Atom xdndLeave; Atom xdndPosition; Atom xdndStatus; Atom xdndDrop; Atom manager; Atom targets; Atom multiple; Atom timestamp; Atom version; Atom atomPair; Atom startupId; void init (Display *dpy) { supported = XInternAtom (dpy, "_NET_SUPPORTED", 0); supportingWmCheck = XInternAtom (dpy, "_NET_SUPPORTING_WM_CHECK", 0); utf8String = XInternAtom (dpy, "UTF8_STRING", 0); wmName = XInternAtom (dpy, "_NET_WM_NAME", 0); winType = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE", 0); winTypeDesktop = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DESKTOP", 0); winTypeDock = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DOCK", 0); winTypeToolbar = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_TOOLBAR", 0); winTypeMenu = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_MENU", 0); winTypeUtil = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_UTILITY", 0); winTypeSplash = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_SPLASH", 0); winTypeDialog = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DIALOG", 0); winTypeNormal = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_NORMAL", 0); winTypeDropdownMenu = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", 0); winTypePopupMenu = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_POPUP_MENU", 0); winTypeTooltip = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_TOOLTIP", 0); winTypeNotification = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_NOTIFICATION", 0); winTypeCombo = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_COMBO", 0); winTypeDnd = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DND", 0); winOpacity = XInternAtom (dpy, "_NET_WM_WINDOW_OPACITY", 0); winBrightness = XInternAtom (dpy, "_NET_WM_WINDOW_BRIGHTNESS", 0); winSaturation = XInternAtom (dpy, "_NET_WM_WINDOW_SATURATION", 0); winActive = XInternAtom (dpy, "_NET_ACTIVE_WINDOW", 0); winDesktop = XInternAtom (dpy, "_NET_WM_DESKTOP", 0); workarea = XInternAtom (dpy, "_NET_WORKAREA", 0); desktopViewport = XInternAtom (dpy, "_NET_DESKTOP_VIEWPORT", 0); desktopGeometry = XInternAtom (dpy, "_NET_DESKTOP_GEOMETRY", 0); currentDesktop = XInternAtom (dpy, "_NET_CURRENT_DESKTOP", 0); numberOfDesktops = XInternAtom (dpy, "_NET_NUMBER_OF_DESKTOPS", 0); winState = XInternAtom (dpy, "_NET_WM_STATE", 0); winStateModal = XInternAtom (dpy, "_NET_WM_STATE_MODAL", 0); winStateSticky = XInternAtom (dpy, "_NET_WM_STATE_STICKY", 0); winStateMaximizedVert = XInternAtom (dpy, "_NET_WM_STATE_MAXIMIZED_VERT", 0); winStateMaximizedHorz = XInternAtom (dpy, "_NET_WM_STATE_MAXIMIZED_HORZ", 0); winStateShaded = XInternAtom (dpy, "_NET_WM_STATE_SHADED", 0); winStateSkipTaskbar = XInternAtom (dpy, "_NET_WM_STATE_SKIP_TASKBAR", 0); winStateSkipPager = XInternAtom (dpy, "_NET_WM_STATE_SKIP_PAGER", 0); winStateHidden = XInternAtom (dpy, "_NET_WM_STATE_HIDDEN", 0); winStateFullscreen = XInternAtom (dpy, "_NET_WM_STATE_FULLSCREEN", 0); winStateAbove = XInternAtom (dpy, "_NET_WM_STATE_ABOVE", 0); winStateBelow = XInternAtom (dpy, "_NET_WM_STATE_BELOW", 0); winStateDemandsAttention = XInternAtom (dpy, "_NET_WM_STATE_DEMANDS_ATTENTION", 0); winStateDisplayModal = XInternAtom (dpy, "_NET_WM_STATE_DISPLAY_MODAL", 0); winStateFocused = XInternAtom (dpy, "_NET_WM_STATE_FOCUSED", 0); winActionMove = XInternAtom (dpy, "_NET_WM_ACTION_MOVE", 0); winActionResize = XInternAtom (dpy, "_NET_WM_ACTION_RESIZE", 0); winActionStick = XInternAtom (dpy, "_NET_WM_ACTION_STICK", 0); winActionMinimize = XInternAtom (dpy, "_NET_WM_ACTION_MINIMIZE", 0); winActionMaximizeHorz = XInternAtom (dpy, "_NET_WM_ACTION_MAXIMIZE_HORZ", 0); winActionMaximizeVert = XInternAtom (dpy, "_NET_WM_ACTION_MAXIMIZE_VERT", 0); winActionFullscreen = XInternAtom (dpy, "_NET_WM_ACTION_FULLSCREEN", 0); winActionClose = XInternAtom (dpy, "_NET_WM_ACTION_CLOSE", 0); winActionShade = XInternAtom (dpy, "_NET_WM_ACTION_SHADE", 0); winActionChangeDesktop = XInternAtom (dpy, "_NET_WM_ACTION_CHANGE_DESKTOP", 0); winActionAbove = XInternAtom (dpy, "_NET_WM_ACTION_ABOVE", 0); winActionBelow = XInternAtom (dpy, "_NET_WM_ACTION_BELOW", 0); wmAllowedActions = XInternAtom (dpy, "_NET_WM_ALLOWED_ACTIONS", 0); wmStrut = XInternAtom (dpy, "_NET_WM_STRUT", 0); wmStrutPartial = XInternAtom (dpy, "_NET_WM_STRUT_PARTIAL", 0); wmUserTime = XInternAtom (dpy, "_NET_WM_USER_TIME", 0); wmIcon = XInternAtom (dpy,"_NET_WM_ICON", 0); wmIconGeometry = XInternAtom (dpy, "_NET_WM_ICON_GEOMETRY", 0); clientList = XInternAtom (dpy, "_NET_CLIENT_LIST", 0); clientListStacking = XInternAtom (dpy, "_NET_CLIENT_LIST_STACKING", 0); frameExtents = XInternAtom (dpy, "_NET_FRAME_EXTENTS", 0); frameWindow = XInternAtom (dpy, "_NET_FRAME_WINDOW", 0); wmState = XInternAtom (dpy, "WM_STATE", 0); wmChangeState = XInternAtom (dpy, "WM_CHANGE_STATE", 0); wmProtocols = XInternAtom (dpy, "WM_PROTOCOLS", 0); wmClientLeader = XInternAtom (dpy, "WM_CLIENT_LEADER", 0); wmDeleteWindow = XInternAtom (dpy, "WM_DELETE_WINDOW", 0); wmTakeFocus = XInternAtom (dpy, "WM_TAKE_FOCUS", 0); wmPing = XInternAtom (dpy, "_NET_WM_PING", 0); wmSyncRequest = XInternAtom (dpy, "_NET_WM_SYNC_REQUEST", 0); wmSyncRequestCounter = XInternAtom (dpy, "_NET_WM_SYNC_REQUEST_COUNTER", 0); wmFullscreenMonitors = XInternAtom (dpy, "_NET_WM_FULLSCREEN_MONITORS", 0); closeWindow = XInternAtom (dpy, "_NET_CLOSE_WINDOW", 0); wmMoveResize = XInternAtom (dpy, "_NET_WM_MOVERESIZE", 0); moveResizeWindow = XInternAtom (dpy, "_NET_MOVERESIZE_WINDOW", 0); restackWindow = XInternAtom (dpy, "_NET_RESTACK_WINDOW", 0); showingDesktop = XInternAtom (dpy, "_NET_SHOWING_DESKTOP", 0); xBackground[0] = XInternAtom (dpy, "_XSETROOT_ID", 0); xBackground[1] = XInternAtom (dpy, "_XROOTPMAP_ID", 0); toolkitAction = XInternAtom (dpy, "_COMPIZ_TOOLKIT_ACTION", 0); toolkitActionWindowMenu = XInternAtom (dpy, "_COMPIZ_TOOLKIT_ACTION_WINDOW_MENU", 0); toolkitActionForceQuitDialog = XInternAtom (dpy, "_COMPIZ_TOOLKIT_ACTION_FORCE_QUIT_DIALOG", 0); mwmHints = XInternAtom (dpy, "_MOTIF_WM_HINTS", 0); xdndAware = XInternAtom (dpy, "XdndAware", 0); xdndEnter = XInternAtom (dpy, "XdndEnter", 0); xdndLeave = XInternAtom (dpy, "XdndLeave", 0); xdndPosition = XInternAtom (dpy, "XdndPosition", 0); xdndStatus = XInternAtom (dpy, "XdndStatus", 0); xdndDrop = XInternAtom (dpy, "XdndDrop", 0); manager = XInternAtom (dpy, "MANAGER", 0); targets = XInternAtom (dpy, "TARGETS", 0); multiple = XInternAtom (dpy, "MULTIPLE", 0); timestamp = XInternAtom (dpy, "TIMESTAMP", 0); version = XInternAtom (dpy, "VERSION", 0); atomPair = XInternAtom (dpy, "ATOM_PAIR", 0); startupId = XInternAtom (dpy, "_NET_STARTUP_ID", 0); } }; compiz-0.9.11+14.04.20140409/src/match.cpp0000644000015301777760000003331412321343002020065 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #define foreach BOOST_FOREACH #include #include #include #include #include "privatematch.h" #include "privatescreen.h" #include "privatewindow.h" const CompMatch CompMatch::emptyMatch; class CoreExp : public CompMatch::Expression { public: virtual ~CoreExp () {}; typedef enum { TypeXid, TypeState, TypeOverride, TypeRGBA, TypeType } Type; CoreExp (const CompString& str) { if (str.compare (0, 4, "xid=") == 0) { mType = TypeXid; priv.val = strtol (str.substr (4).c_str (), NULL, 0); } else if (str.compare (0, 6, "state=") == 0) { using ::compiz::private_screen::windowStateFromString; mType = TypeState; priv.uval = windowStateFromString(str.substr (6).c_str ()); } else if (str.compare (0, 18, "override_redirect=") == 0) { mType = TypeOverride; priv.val = strtol (str.substr (18).c_str (), NULL, 0); } else if (str.compare (0, 5, "rgba=") == 0) { mType = TypeRGBA; priv.val = strtol (str.substr (5).c_str (), NULL, 0); } else { size_t offset = (str.compare (0, 5, "type=") == 0) ? 5 : 0; mType = TypeType; priv.uval = PrivateWindow::windowTypeFromString ( str.substr (offset).c_str ()); } } bool evaluate (const CompWindow *w) const { switch (mType) { case TypeXid: return ((unsigned int) priv.val == w->id ()); case TypeState: return (priv.uval & w->state ()); case TypeOverride: { bool overrideRedirect = w->overrideRedirect (); return ((priv.val == 1 && overrideRedirect) || (priv.val == 0 && !overrideRedirect)); } case TypeRGBA: return ((priv.val && w->alpha ()) || (!priv.val && !w->alpha ())); case TypeType: return (priv.uval & w->wmType ()); } return true; } Type mType; CompPrivate priv; }; CompMatch::Expression * CompScreen::matchInitExp (const CompString& str) { WRAPABLE_HND_FUNCTN_RETURN (CompMatch::Expression *, matchInitExp, str); return _matchInitExp (str); } CompMatch::Expression * CompScreenImpl::_matchInitExp (const CompString& str) { return new CoreExp (str); } static void matchUpdateMatchOptions (CompOption::Vector& options) { foreach (CompOption &option, options) { switch (option.type ()) { case CompOption::TypeMatch: option.value ().match ().update (); break; case CompOption::TypeList: if (option.value ().listType () == CompOption::TypeMatch) { foreach (CompOption::Value &value, option.value ().list ()) value.match ().update (); } default: break; } } } void CompScreen::matchExpHandlerChanged () { WRAPABLE_HND_FUNCTN (matchExpHandlerChanged); _matchExpHandlerChanged (); } void CompScreenImpl::_matchExpHandlerChanged () { foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); matchUpdateMatchOptions (options); } } void CompScreen::matchPropertyChanged (CompWindow *w) { WRAPABLE_HND_FUNCTN (matchPropertyChanged, w); _matchPropertyChanged (w); } void CompScreenImpl::_matchPropertyChanged (CompWindow *w) { } static void matchResetOps (MatchOp::List &list) { MatchExpOp *exp; foreach (MatchOp *op, list) { switch (op->type ()) { case MatchOp::TypeGroup: matchResetOps (dynamic_cast (op)->op); break; case MatchOp::TypeExp: exp = dynamic_cast (op); if (exp && exp->e) exp->e.reset (); break; default: break; } } } static bool matchOpsEqual (MatchOp::List &list1, MatchOp::List &list2) { MatchGroupOp *g1, *g2; MatchExpOp *e1, *e2; MatchOp::List::iterator it1 = list1.begin (), it2 = list2.begin (); if (list1.size () != list2.size ()) return false; while (it1 != list1.end ()) { if ((*it1)->type () != (*it2)->type ()) return false; if ((*it1)->flags != (*it2)->flags) return false; switch ((*it1)->type ()) { case MatchOp::TypeGroup: g1 = dynamic_cast (*it1); g2 = dynamic_cast (*it2); if (!matchOpsEqual (g1->op, g2->op)) return false; break; case MatchOp::TypeExp: e1 = dynamic_cast (*it1); e2 = dynamic_cast (*it2); if (e1->value != e2->value) return false; break; default: break; } ++it1; ++it2; } return true; } static unsigned int nextIndex (CompString &str, unsigned int i) { while (str[i] == '\\') if (str[++i] != '\0') i++; return i; } static CompString strndupValue (CompString str) { CompString value; unsigned int i, j, n = str.length (); /* count trialing white spaces */ i = j = 0; while (i < n) { if (str[i] != ' ') { j = 0; if (str[i] == '\\') i++; } else { j++; } i++; } /* remove trialing white spaces */ n -= j; i = j = 0; for (;;) { if (str[i] == '\\') i++; value += str[i++]; if (i >= n) { return value; } } } /* Add match expressions from string. Special characters are '(', ')', '!', '&', '|'. Escape character is '\'. Example: "type=desktop | !type=dock" "!type=dock & (state=fullscreen | state=shaded)" */ static void matchAddFromString (MatchOp::List &list, CompString str) { CompString value; int j, i = 0; int flags = 0; str += "\0"; while (str[i] != '\0') { while (str[i] == ' ') i++; if (str[i] == '!') { flags |= MATCH_OP_NOT_MASK; i++; while (str[i] == ' ') i++; } if (str[i] == '(') { int level = 1; int length; j = ++i; while (str[j] != '\0') { if (str[j] == '(') { level++; } else if (str[j] == ')') { level--; if (level == 0) break; } j = nextIndex (str, ++j); } length = j - i; MatchGroupOp *group = new MatchGroupOp (); matchAddFromString (group->op, str.substr (i, length)); group->flags = flags; list.push_back (group); while (str[j] != '\0' && str[j] != '|' && str[j] != '&') j++; } else { j = i; while (str[j] != '\0' && str[j] != '|' && str[j] != '&') j = nextIndex (str, ++j); if (j > i) { MatchExpOp *exp = new MatchExpOp (); exp->value = strndupValue (str.substr (i, j - i)); exp->flags = flags; list.push_back (exp); } } i = j; if (str[i] != '\0') { if (str[i] == '&') flags = MATCH_OP_AND_MASK; i++; } } if (!list.empty ()) list.front ()->flags &= ~MATCH_OP_AND_MASK; } static CompString matchOpsToString (MatchOp::List &list) { CompString value (""), group; foreach (MatchOp *op, list) { switch (op->type ()) { case MatchOp::TypeGroup: group = matchOpsToString (dynamic_cast (op)->op); if (group.length ()) { if (value.length ()) { value += ((op->flags & MATCH_OP_AND_MASK) ? "& " : "| "); } if (op->flags & MATCH_OP_NOT_MASK) value += "!"; value += "(" + group + ") "; } break; case MatchOp::TypeExp: if (value.length ()) value += ((op->flags & MATCH_OP_AND_MASK) ? "& " : "| "); if (op->flags & MATCH_OP_NOT_MASK) value += "!"; value += dynamic_cast (op)->value; value += " "; break; default: break; } } if (!value.empty ()) value.erase (value.length () - 1); return value; } static void matchUpdateOps (MatchOp::List &list) { MatchExpOp *exp; foreach (MatchOp *op, list) { switch (op->type ()) { case MatchOp::TypeGroup: matchUpdateOps (dynamic_cast (op)->op); break; case MatchOp::TypeExp: exp = dynamic_cast (op); if (exp && screen) exp->e.reset (screen->matchInitExp (exp->value)); break; default: break; } } } static bool matchEvalOps (MatchOp::List &list, const CompWindow *w) { bool value, result = false; MatchExpOp *exp; foreach (MatchOp *op, list) { /* fast evaluation */ if (op->flags & MATCH_OP_AND_MASK) { /* result will never be true */ if (!result) return false; } else { /* result will always be true */ if (result) return true; } switch (op->type ()) { case MatchOp::TypeGroup: value = matchEvalOps (dynamic_cast (op)->op, w); break; case MatchOp::TypeExp: exp = dynamic_cast (op); if (exp->e.get ()) value = exp->e->evaluate (w); else value = true; break; default: value = true; break; } if (op->flags & MATCH_OP_NOT_MASK) value = !value; if (op->flags & MATCH_OP_AND_MASK) result = (result && value); else result = (result || value); } return result; } MatchOp::MatchOp () : flags (0) { } MatchOp::~MatchOp () { } MatchExpOp::MatchExpOp () : value (""), e () { } MatchExpOp::MatchExpOp (const MatchExpOp &ex) : value (ex.value), e (ex.e) { flags = ex.flags; } MatchGroupOp::MatchGroupOp () : op (0) { } MatchGroupOp::MatchGroupOp (const MatchGroupOp &gr) : op (0) { *this = gr; flags = gr.flags; } MatchGroupOp::~MatchGroupOp () { foreach (MatchOp *o, op) delete o; } MatchGroupOp & MatchGroupOp::operator= (const MatchGroupOp &gr) { MatchGroupOp *gop; MatchExpOp *eop; foreach (MatchOp *o, op) delete o; op.clear (); foreach (MatchOp *o, gr.op) { switch (o->type ()) { case MatchOp::TypeGroup: gop = new MatchGroupOp (dynamic_cast (*o)); op.push_back (gop); break; case MatchOp::TypeExp: eop = new MatchExpOp (dynamic_cast (*o)); op.push_back (eop); break; default: break; } } return *this; } PrivateMatch::PrivateMatch () : op () { } CompMatch::CompMatch () : priv (new PrivateMatch ()) { } CompMatch::CompMatch (const CompString str) : priv (new PrivateMatch ()) { matchAddFromString (priv->op.op, str); update (); } CompMatch::CompMatch (const CompMatch &match) : priv (new PrivateMatch ()) { priv->op = match.priv->op; update (); } CompMatch::~CompMatch () { delete priv; } void CompMatch::update () { matchResetOps (priv->op.op); matchUpdateOps (priv->op.op); } bool CompMatch::evaluate (const CompWindow *window) const { return matchEvalOps (priv->op.op, window); } CompString CompMatch::toString () const { return matchOpsToString (priv->op.op); } bool CompMatch::isEmpty () const { return (*this == emptyMatch); } CompMatch & CompMatch::operator= (const CompMatch &match) { priv->op = match.priv->op; update (); return *this; } CompMatch & CompMatch::operator&= (const CompMatch &match) { MatchGroupOp *g1 = new MatchGroupOp (priv->op); MatchGroupOp *g2 = new MatchGroupOp (match.priv->op); g2->flags = MATCH_OP_AND_MASK; priv->op = MatchGroupOp (); priv->op.op.push_back (g1); priv->op.op.push_back (g2); update (); return *this; } CompMatch & CompMatch::operator|= (const CompMatch &match) { MatchGroupOp *g1 = new MatchGroupOp (priv->op); MatchGroupOp *g2 = new MatchGroupOp (match.priv->op); priv->op = MatchGroupOp (); priv->op.op.push_back (g1); priv->op.op.push_back (g2); update (); return *this; } const CompMatch & CompMatch::operator& (const CompMatch &match) { return CompMatch (*this) &= match; } const CompMatch & CompMatch::operator| (const CompMatch &match) { return CompMatch (*this) |= match; } const CompMatch & CompMatch::operator! () { MatchGroupOp *g = new MatchGroupOp (priv->op); g->flags ^= MATCH_OP_NOT_MASK; priv->op = MatchGroupOp (); priv->op.op.push_back (g); update (); return *this; } CompMatch & CompMatch::operator= (const CompString &str) { priv->op = MatchGroupOp (); matchAddFromString (priv->op.op, str); update (); return *this; } CompMatch & CompMatch::operator&= (const CompString &str) { *this &= CompMatch (str); return *this; } CompMatch & CompMatch::operator|= (const CompString &str) { *this |= CompMatch (str); return *this; } const CompMatch & CompMatch::operator& (const CompString &str) { *this &= str; return *this; } const CompMatch & CompMatch::operator| (const CompString &str) { *this |= str; return *this; } bool CompMatch::operator== (const CompMatch &match) const { return matchOpsEqual (priv->op.op, match.priv->op.op); } bool CompMatch::operator!= (const CompMatch &match) const { return !(*this == match); } compiz-0.9.11+14.04.20140409/src/servergrab/0000755000015301777760000000000012321344021020425 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/servergrab/tests/0000755000015301777760000000000012321344021021567 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/servergrab/tests/test-servergrab.cpp0000644000015301777760000000335512321343002025416 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include class MockServerGrab : public ServerGrabInterface { public: MOCK_METHOD0 (grabServer, void ()); MOCK_METHOD0 (ungrabServer, void ()); MOCK_METHOD0 (syncServer, void ()); }; class ServerGrabTest : public ::testing::Test { }; TEST(ServerGrabTest, TestServerGrab) { MockServerGrab msg; EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); ServerLock l (&msg); EXPECT_CALL (msg, ungrabServer ()); } compiz-0.9.11+14.04.20140409/src/servergrab/tests/CMakeLists.txt0000644000015301777760000000064612321343002024333 0ustar pbusernogroup00000000000000include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_executable (compiz_test_servergrab ${CMAKE_CURRENT_SOURCE_DIR}/test-servergrab.cpp) target_link_libraries (compiz_test_servergrab compiz_servergrab ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_servergrab COVERAGE compiz_servergrab) compiz-0.9.11+14.04.20140409/src/servergrab/CMakeLists.txt0000644000015301777760000000132412321343002023163 0ustar pbusernogroup00000000000000INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/servergrab.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/servergrab.cpp ) ADD_LIBRARY( compiz_servergrab STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_servergrab PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) compiz-0.9.11+14.04.20140409/src/servergrab/src/0000755000015301777760000000000012321344021021214 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/servergrab/src/servergrab.cpp0000644000015301777760000000273212321343002024064 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include ServerLock::ServerLock (ServerGrabInterface *i) : mServerGrab (i) { mServerGrab->grabServer (); mServerGrab->syncServer (); } ServerLock::~ServerLock () { mServerGrab->ungrabServer (); mServerGrab->syncServer (); } compiz-0.9.11+14.04.20140409/src/servergrab/include/0000755000015301777760000000000012321344021022050 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/servergrab/include/core/0000755000015301777760000000000012321344021023000 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/servergrab/include/core/servergrab.h0000644000015301777760000000312312321343002025310 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMP_SERVER_GRAB_H #define _COMP_SERVER_GRAB_H class ServerGrabInterface { public: virtual ~ServerGrabInterface () {} virtual void grabServer () = 0; virtual void ungrabServer () = 0; virtual void syncServer () = 0; }; class ServerLock { public: ServerLock (ServerGrabInterface *i); ~ServerLock (); private: ServerGrabInterface *mServerGrab; }; #endif compiz-0.9.11+14.04.20140409/src/privateoption.h0000644000015301777760000000402612321343002021337 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _PRIVATEOPTION_H #define _PRIVATEOPTION_H #include #include #include #include typedef struct _CompOptionIntRestriction { int min; int max; } IntRestriction; typedef struct _CompOptionFloatRestriction { float min; float max; float precision; } FloatRestriction; typedef union { IntRestriction i; FloatRestriction f; } RestrictionUnion; class PrivateRestriction { public: CompOption::Type type; RestrictionUnion rest; }; class PrivateOption { public: PrivateOption (); PrivateOption (const PrivateOption &); CompString name; CompOption::Type type; CompOption::Value value; CompOption::Restriction rest; }; #endif compiz-0.9.11+14.04.20140409/src/asyncserverwindow.h0000644000015301777760000000354012321343002022230 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_ASYNC_SERVER_WINDOW_H #define _COMPIZ_ASYNC_SERVER_WINDOW_H #include namespace compiz { namespace window { class AsyncServerWindow { public: virtual ~AsyncServerWindow () {}; virtual int requestConfigureOnClient (const XWindowChanges &xwc, unsigned int valueMask) = 0; virtual int requestConfigureOnWrapper (const XWindowChanges &xwc, unsigned int valueMask) = 0; virtual int requestConfigureOnFrame (const XWindowChanges &xwc, unsigned int valueMask) = 0; virtual void sendSyntheticConfigureNotify () = 0; virtual bool hasCustomShape () const = 0; }; } } #endif compiz-0.9.11+14.04.20140409/src/modifierhandler.cpp0000644000015301777760000001152212321343002022122 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman * Sam Spilsbury */ #include #include "privatewindow.h" const unsigned int ModifierHandler::virtualModMask[7] = { CompAltMask, CompMetaMask, CompSuperMask, CompHyperMask, CompModeSwitchMask, CompNumLockMask, CompScrollLockMask }; const int ModifierHandler::maskTable[8] = { ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask }; unsigned int ModifierHandler::ignoredModMask () { return mIgnoredModMask; } const XModifierKeymap * ModifierHandler::modMap () { return mModMap; } void ModifierHandler::updateModifierMappings () { unsigned int modMask[CompModNum]; int i, minKeycode, maxKeycode, keysymsPerKeycode = 0; KeySym* key; for (i = 0; i < CompModNum; i++) modMask[i] = 0; XDisplayKeycodes (screen->dpy (), &minKeycode, &maxKeycode); key = XGetKeyboardMapping (screen->dpy (), minKeycode, (maxKeycode - minKeycode + 1), &keysymsPerKeycode); if (mModMap) XFreeModifiermap (mModMap); mModMap = XGetModifierMapping (screen->dpy ()); if (mModMap && mModMap->max_keypermod > 0) { KeySym keysym; int index, size, mask; size = maskTableSize * mModMap->max_keypermod; for (i = 0; i < size; i++) { if (!mModMap->modifiermap[i]) continue; index = 0; do { keysym = XKeycodeToKeysym (screen->dpy (), mModMap->modifiermap[i], index++); } while (!keysym && index < keysymsPerKeycode); if (keysym) { mask = maskTable[i / mModMap->max_keypermod]; if (keysym == XK_Alt_L || keysym == XK_Alt_R) { modMask[CompModAlt] |= mask; } else if (keysym == XK_Meta_L || keysym == XK_Meta_R) { modMask[CompModMeta] |= mask; } else if (keysym == XK_Super_L || keysym == XK_Super_R) { modMask[CompModSuper] |= mask; } else if (keysym == XK_Hyper_L || keysym == XK_Hyper_R) { modMask[CompModHyper] |= mask; } else if (keysym == XK_Mode_switch) { modMask[CompModModeSwitch] |= mask; } else if (keysym == XK_Scroll_Lock) { modMask[CompModScrollLock] |= mask; } else if (keysym == XK_Num_Lock) { modMask[CompModNumLock] |= mask; } } } for (i = 0; i < CompModNum; i++) { if (!modMask[i]) modMask[i] = CompNoMask; } if (memcmp (modMask, mModMask, sizeof (modMask))) { memcpy (mModMask, modMask, sizeof (modMask)); mIgnoredModMask = LockMask | (modMask[CompModNumLock] & ~CompNoMask) | (modMask[CompModScrollLock] & ~CompNoMask); screen->updatePassiveKeyGrabs (); foreach (CompWindow *w, screen->windows ()) w->priv->updatePassiveButtonGrabs (); } } if (key) XFree (key); } unsigned int ModifierHandler::virtualToRealModMask (unsigned int modMask) { for (int i = 0; i < CompModNum; i++) { if (modMask & virtualModMask[i]) { modMask &= ~virtualModMask[i]; modMask |= mModMask[i]; } } return modMask; } unsigned int ModifierHandler::keycodeToModifiers (int keycode) { unsigned int mods = 0; int mod, k; for (mod = 0; mod < maskTableSize; mod++) { for (k = 0; k < mModMap->max_keypermod; k++) { if (mModMap->modifiermap[mod * mModMap->max_keypermod + k] == keycode) mods |= maskTable[mod]; } } return mods; } ModifierHandler::ModifierHandler () : mIgnoredModMask (LockMask), mModMap (0) { for (int i = 0; i < ModNum; i++) mModMask[i] = NoMask; } ModifierHandler::~ModifierHandler () { if (mModMap) XFreeModifiermap (mModMap); mModMap = NULL; } compiz-0.9.11+14.04.20140409/src/privateiosource.h0000644000015301777760000000372012321343002021657 0ustar pbusernogroup00000000000000/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_PRIVATEIOSOURCE_H #define _COMPIZ_PRIVATEIOSOURCE_H #include typedef boost::function FdWatchCallBack; typedef int CompWatchFdHandle; namespace compiz { namespace private_screen { class EventManager; } } class CompWatchFd : public Glib::IOSource { public: virtual ~CompWatchFd (); static Glib::RefPtr create (int, Glib::IOCondition, FdWatchCallBack); protected: explicit CompWatchFd (int, Glib::IOCondition, FdWatchCallBack); bool internalCallback (Glib::IOCondition); private: int mFd; FdWatchCallBack mCallBack; CompWatchFdHandle mHandle; bool mForceFail; bool mExecuting; friend class ::compiz::private_screen::EventManager; }; #endif compiz-0.9.11+14.04.20140409/src/action.cpp0000644000015301777760000003301312321343002020242 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include "privateaction.h" namespace ca = compiz::actions; struct _Modifier { const char *name; int modifier; } modifiers[] = { { "", ShiftMask }, { "", ControlMask }, { "", ControlMask }, { "", ControlMask }, { "", Mod1Mask }, { "", Mod2Mask }, { "", Mod3Mask }, { "", Mod4Mask }, { "", Mod5Mask }, { "", CompAltMask }, { "", CompMetaMask }, { "", CompSuperMask }, { "", CompHyperMask }, { "", CompModeSwitchMask } }; #define N_MODIFIERS (sizeof (modifiers) / sizeof (struct _Modifier)) struct _Edge { const char *name; const char *modifierName; } edges[] = { { "Left", "" }, { "Right", "" }, { "Top", "" }, { "Bottom", "" }, { "TopLeft", "" }, { "TopRight", "" }, { "BottomLeft", "" }, { "BottomRight", "" } }; static CompString modifiersToString (unsigned int modMask) { CompString binding; for (unsigned int i = 0; i < N_MODIFIERS; ++i) { if (modMask & modifiers[i].modifier) { binding += modifiers[i].name; modMask &= ~modifiers[i].modifier; } } return binding; } static unsigned int stringToModifiers (const CompString &str) { unsigned int mods = 0; for (unsigned int i = 0; i < N_MODIFIERS; ++i) if (str.find (modifiers[i].name) != std::string::npos) mods |= modifiers[i].modifier; return mods; } static unsigned int bindingStringToEdgeMask (CompString str) { unsigned int edgeMask = 0; for (int i = 0; i < SCREEN_EDGE_NUM; ++i) if (str.find (edges[i].modifierName) != std::string::npos) edgeMask |= 1 << i; return edgeMask; } static CompString edgeMaskToBindingString (unsigned int edgeMask) { CompString binding; for (int i = 0; i < SCREEN_EDGE_NUM; ++i) if (edgeMask & (1 << i)) binding += edges[i].modifierName; return binding; } CompAction::KeyBinding::KeyBinding () : mModifiers (0), mKeycode (0) { } CompAction::KeyBinding::KeyBinding (const KeyBinding& k) : mModifiers (k.mModifiers), mKeycode (k.mKeycode) { } CompAction::KeyBinding::KeyBinding (int keycode, unsigned int modifiers) : mModifiers (modifiers), mKeycode (keycode) { } unsigned int CompAction::KeyBinding::modifiers () const { return mModifiers; } int CompAction::KeyBinding::keycode () const { return mKeycode; } bool CompAction::KeyBinding::fromString (const CompString &str) { /* This assertion is a regression test for LP: #930412 */ assert (screen); if (!screen) return false; unsigned int mods = stringToModifiers (str); size_t start = 0; size_t pos = str.rfind ('>'); if (pos != std::string::npos) start = pos + 1; while (start < str.size () && !isalnum (str[start])) ++start; if (start == str.size ()) { if (mods) { mKeycode = 0; mModifiers = mods; return true; } return false; } CompString sStr = str.substr (start); KeySym keysym = XStringToKeysym (sStr.c_str ()); if (keysym != NoSymbol) { KeyCode keycode; keycode = XKeysymToKeycode (screen->dpy (), keysym); if (keycode) { mKeycode = keycode; mModifiers = mods; return true; } } if (sStr.compare (0, 2, "0x") == 0) { mKeycode = strtol (sStr.c_str (), NULL, 0); mModifiers = mods; return true; } return false; } CompString CompAction::KeyBinding::toString () const { if (!screen) return ""; CompString binding = modifiersToString (mModifiers); if (mKeycode != 0) { KeySym keysym = XKeycodeToKeysym (screen->dpy (), mKeycode, 0); char *keyname = XKeysymToString (keysym); if (keyname) binding += keyname; else binding += compPrintf ("0x%x", mKeycode); } return binding; } bool CompAction::KeyBinding::operator== (const KeyBinding &k) const { return mKeycode == k.mKeycode && mModifiers == k.mModifiers; } bool CompAction::KeyBinding::operator!= (const KeyBinding &k) const { return !(*this == k); } CompAction::ButtonBinding::ButtonBinding () : mModifiers (0), mButton (0) { } CompAction::ButtonBinding::ButtonBinding (const ButtonBinding& b) : mModifiers (b.mModifiers), mButton (b.mButton) { } CompAction::ButtonBinding::ButtonBinding (int button, unsigned int modifiers) : mModifiers (modifiers), mButton (button) { } unsigned int CompAction::ButtonBinding::modifiers () const { return mModifiers; } int CompAction::ButtonBinding::button () const { return mButton; } bool CompAction::ButtonBinding::fromString (const CompString &str) { unsigned int mods = stringToModifiers (str); size_t start = 0; size_t pos = str.rfind ('>'); if (pos != std::string::npos) start = pos + 1; while (start < str.size () && !isalnum (str[start])) ++start; if (start != str.size () && str.compare (start, 6, "Button") == 0) { int buttonNum; if (sscanf (str.substr (start + 6).c_str (), "%d", &buttonNum) == 1) { mButton = buttonNum; mModifiers = mods; return true; } } return false; } CompString CompAction::ButtonBinding::toString () const { if (!mModifiers && !mButton) return ""; CompString binding = modifiersToString (mModifiers); binding += compPrintf ("Button%d", mButton); return binding; } bool CompAction::ButtonBinding::operator== (const ButtonBinding &b) const { return mButton == b.mButton && mModifiers == b.mModifiers; } bool CompAction::ButtonBinding::operator!= (const ButtonBinding &b) const { return !(*this == b); } CompAction::CompAction () : priv (new PrivateAction ()) { } CompAction::CompAction (const CompAction & a) : priv (new PrivateAction (*a.priv)) { } CompAction::~CompAction () { delete priv; } CompAction::CallBack CompAction::initiate () const { return priv->initiate; } CompAction::CallBack CompAction::terminate () const { return priv->terminate; } void CompAction::setInitiate (const CompAction::CallBack &initiate) { priv->initiate = initiate; } void CompAction::setTerminate (const CompAction::CallBack &terminate) { priv->terminate = terminate; } CompAction::State CompAction::state () const { return priv->state; } CompAction::BindingType CompAction::type () const { return priv->type; } CompAction::KeyBinding & CompAction::key () { return priv->key; } const CompAction::KeyBinding & CompAction::key () const { return priv->key; } void CompAction::setKey (const CompAction::KeyBinding &key) { priv->key = key; if (key.modifiers () || key.keycode ()) priv->type = CompAction::BindingTypeKey; else priv->type = CompAction::BindingTypeNone; } CompAction::ButtonBinding & CompAction::button () { return priv->button; } const CompAction::ButtonBinding & CompAction::button () const { return priv->button; } void CompAction::setButton (const CompAction::ButtonBinding &button) { priv->button = button; if (button.modifiers () || button.button ()) { if (priv->edgeMask) priv->type = CompAction::BindingTypeEdgeButton; else priv->type = CompAction::BindingTypeButton; } else priv->type = CompAction::BindingTypeNone; } unsigned int CompAction::edgeMask () const { return priv->edgeMask; } void CompAction::setEdgeMask (unsigned int edge) { priv->edgeMask = edge; if (priv->type == CompAction::BindingTypeEdgeButton || priv->type == CompAction::BindingTypeButton) { if (priv->edgeMask) priv->type = CompAction::BindingTypeEdgeButton; else priv->type = CompAction::BindingTypeButton; } } bool CompAction::bell () const { return priv->bell; } void CompAction::setBell (bool bell) { priv->bell = bell; } void CompAction::setState (CompAction::State state) { priv->state = state; } void CompAction::copyState (const CompAction &action) { priv->initiate = action.priv->initiate; priv->terminate = action.priv->terminate; priv->state = action.priv->state; memcpy (&priv->priv, &action.priv->priv, sizeof (CompPrivate)); } bool CompAction::operator== (const CompAction& val) const { if (priv->state != val.priv->state || priv->type != val.priv->type || priv->key.modifiers () != val.priv->key.modifiers () || priv->key.keycode () != val.priv->key.keycode () || priv->button.modifiers () != val.priv->button.modifiers () || priv->button.button () != val.priv->button.button () || priv->bell != val.priv->bell || priv->edgeMask != val.priv->edgeMask || memcmp (&priv->priv, &val.priv->priv, sizeof (CompPrivate)) != 0) return false; return true; } CompAction & CompAction::operator= (const CompAction &action) { if (this == &action) return *this; delete priv; priv = new PrivateAction (*action.priv); return *this; } bool CompAction::keyFromString (const CompString &str) { bool retval = priv->key.fromString (str); if (retval) priv->type = CompAction::BindingTypeKey; else { priv->type = CompAction::BindingTypeNone; if (str == "Disabled") retval = true; } return retval; } bool CompAction::buttonFromString (const CompString &str) { bool retval = priv->button.fromString (str); if (retval) { priv->edgeMask = bindingStringToEdgeMask (str); if (priv->edgeMask) priv->type = CompAction::BindingTypeEdgeButton; else priv->type = CompAction::BindingTypeButton; } else { priv->type = CompAction::BindingTypeNone; if (str == "Disabled") retval = true; } return retval; } bool CompAction::edgeMaskFromString (const CompString &str) { unsigned int edgeMask = 0; size_t pos; for (int i = 0; i < SCREEN_EDGE_NUM; ++i) { pos = 0; while ((pos = str.find (edgeToString (i), pos)) != std::string::npos) { if (pos > 0 && isalnum (str[pos - 1])) { ++pos; continue; } pos += edgeToString (i).size (); if (pos < str.size () && isalnum (str[pos])) continue; edgeMask |= 1 << i; } } priv->edgeMask = edgeMask; return (edgeMask != 0 || str.empty ()); } CompString CompAction::keyToString () const { CompString binding = priv->key.toString (); if (!binding.size ()) return "Disabled"; return binding; } CompString CompAction::buttonToString () const { CompString edge; CompString binding = modifiersToString (priv->button.modifiers ()); binding += edgeMaskToBindingString (priv->edgeMask); binding += compPrintf ("Button%d", priv->button.button ()); if (!priv->button.button ()) return "Disabled"; return binding; } CompString CompAction::edgeMaskToString () const { CompString edge; for (int i = 0; i < SCREEN_EDGE_NUM; ++i) { if (priv->edgeMask & (1 << i)) { if (!edge.empty ()) edge += " | "; edge += edgeToString (i); } } return edge; } CompString CompAction::edgeToString (unsigned int edge) { return edges[edge].name; } bool CompAction::active () const { return priv->active; } void PrivateAction::setActive (bool a) { active = a; } void ca::setActionActiveState (const CompAction &action, bool active) { action.priv->setActive (active); } PrivateAction::PrivateAction () : initiate (), terminate (), state (0), type (0), key (), button (), bell (false), edgeMask (0), active (false) { memset (&priv, 0, sizeof (CompPrivate)); } PrivateAction::PrivateAction (const PrivateAction &a) : initiate (a.initiate), terminate (a.terminate), state (a.state), type (a.type), key (a.key), button (a.button), bell (a.bell), edgeMask (a.edgeMask), active (a.active) { memcpy (&priv, &a.priv, sizeof (CompPrivate)); } CompAction::Vector & noActions () { static CompAction::Vector v; return v; } compiz-0.9.11+14.04.20140409/src/plugin/0000755000015301777760000000000012321344021017561 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/plugin/tests/0000755000015301777760000000000012321344021020723 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/plugin/tests/test-plugin.cpp0000644000015301777760000003726212321343002023712 0ustar pbusernogroup00000000000000#include #include #define foreach BOOST_FOREACH #include "core/plugin.h" // Get rid of stupid macro from X.h // Why, oh why, are we including X.h? #undef None #include #include #include #include class CompMatch { }; namespace { class PluginFilesystem { public: virtual bool LoadPlugin(CompPlugin *p, const char *path, const char *name) const = 0; virtual void UnloadPlugin(CompPlugin *p) const = 0; static PluginFilesystem const* instance; protected: PluginFilesystem(); virtual ~PluginFilesystem() {} }; class MockPluginFilesystem : public PluginFilesystem { public: MOCK_CONST_METHOD3(LoadPlugin, bool (CompPlugin *, const char *, const char *)); MOCK_CONST_METHOD1(UnloadPlugin, void (CompPlugin *p)); }; class MockVTable : public CompPlugin::VTable { public: MOCK_METHOD0(init, bool ()); MOCK_METHOD0(markReadyToInstantiate, void ()); MOCK_METHOD0(markNoFurtherInstantiation, void ()); }; bool ThunkLoadPluginProc(CompPlugin *p, const char *path_, const char *name) { return PluginFilesystem::instance->LoadPlugin(p, path_, name); } void ThunkUnloadPluginProc(CompPlugin *p) { PluginFilesystem::instance->UnloadPlugin(p); } PluginFilesystem::PluginFilesystem() { ::loaderLoadPlugin = ::ThunkLoadPluginProc; ::loaderUnloadPlugin = ::ThunkUnloadPluginProc; instance = this; } PluginFilesystem const* PluginFilesystem::instance = 0; } // (abstract) namespace class PluginTest : public ::testing::Test { public: MockPluginFilesystem mockfs; }; TEST_F (PluginTest, load_non_existant_plugin_must_fail) { using namespace testing; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(PLUGINDIR), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), Eq((void*)0), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(AtMost(0)); ASSERT_EQ(0, CompPlugin::load("dummy")); } TEST_F (PluginTest, load_plugin_from_HOME_PLUGINDIR_succeeds) { using namespace testing; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))). WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(PLUGINDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), Eq((void*)0), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); CompPlugin* cp = CompPlugin::load("dummy"); ASSERT_NE((void*)0, cp); CompPlugin::unload(cp); } TEST_F (PluginTest, load_plugin_from_PLUGINDIR_succeeds) { using namespace testing; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(PLUGINDIR), StrEq("dummy"))). WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), Eq((void*)0), StrEq("dummy"))). Times(AtMost(0));; EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); CompPlugin* cp = CompPlugin::load("dummy"); ASSERT_NE((void*)0, cp); CompPlugin::unload(cp); } TEST_F (PluginTest, load_plugin_from_COMPIZ_PLUGIN_DIR_env_succeeds) { const char *COMPIZ_PLUGIN_DIR_VALUE = "/path/to/plugin/dir"; TmpEnv env ("COMPIZ_PLUGIN_DIR", COMPIZ_PLUGIN_DIR_VALUE); using namespace testing; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(COMPIZ_PLUGIN_DIR_VALUE), StrEq("dummy"))). WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(PLUGINDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), Eq((void*)0), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); CompPlugin* cp = CompPlugin::load("dummy"); ASSERT_NE((void*)0, cp); CompPlugin::unload(cp); } TEST_F (PluginTest, load_plugin_from_multi_COMPIZ_PLUGIN_DIR_env_succeeds) { std::string COMPIZ_PLUGIN_DIR_PART1 = "/path/to/plugin/dir"; std::string COMPIZ_PLUGIN_DIR_PART2 = "/dir/plugin/to/path"; std::string COMPIZ_PLUGIN_DIR_VALUE = COMPIZ_PLUGIN_DIR_PART1 + ":" + COMPIZ_PLUGIN_DIR_PART2; TmpEnv env ("COMPIZ_PLUGIN_DIR", COMPIZ_PLUGIN_DIR_VALUE.c_str ()); using namespace testing; EXPECT_CALL(mockfs, LoadPlugin(_, EndsWith(COMPIZ_PLUGIN_DIR_PART1), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), StrEq(COMPIZ_PLUGIN_DIR_PART2), StrEq("dummy"))). WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(PLUGINDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), Eq((void*)0), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); CompPlugin* cp = CompPlugin::load("dummy"); ASSERT_NE((void*)0, cp); CompPlugin::unload(cp); } TEST_F (PluginTest, load_plugin_from_void_succeeds) { using namespace testing; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(PLUGINDIR), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), Eq((void*)0), StrEq("dummy"))). WillOnce(Return(true)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); CompPlugin* cp = CompPlugin::load("dummy"); ASSERT_NE((void*)0, cp); CompPlugin::unload(cp); } TEST_F (PluginTest, when_we_load_plugin_init_load_is_called_without_null_pointer) { using namespace testing; EXPECT_CALL (mockfs, LoadPlugin (NotNull (), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))) .Times (1) .WillOnce (Return (true)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(AtLeast (0)); CompPlugin* cp = CompPlugin::load("dummy"); CompPlugin::unload(cp); } TEST_F (PluginTest, when_we_push_plugin_init_is_called) { using namespace testing; EXPECT_CALL (mockfs, LoadPlugin (_, _, _)).Times (AtLeast (0)); EXPECT_CALL (mockfs, UnloadPlugin(_)).Times (AtLeast (0)); ON_CALL(mockfs, LoadPlugin (_, _, _)). WillByDefault (Return (true)); MockVTable mockVtable; EXPECT_CALL (mockVtable, markReadyToInstantiate ()).Times (AtLeast (0)); EXPECT_CALL (mockVtable, markNoFurtherInstantiation ()) .Times (AtLeast (0)); EXPECT_CALL (mockVtable, init ()).WillOnce (Return (true)); CompPlugin* cp = CompPlugin::load("dummy"); cp->vTable = &mockVtable; CompPlugin::push(cp); CompPlugin::pop (); CompPlugin::unload(cp); } TEST_F (PluginTest, when_we_push_plugin_mark_ready_to_instantiate_is_called) { using namespace testing; EXPECT_CALL (mockfs, LoadPlugin (_, _, _)).Times (AtLeast (0)); EXPECT_CALL (mockfs, UnloadPlugin(_)).Times (AtLeast (0)); ON_CALL(mockfs, LoadPlugin (_, _, _)). WillByDefault (Return (true)); MockVTable mockVtable; EXPECT_CALL (mockVtable, init ()) .Times (AtLeast (0)) .WillOnce (Return (true)); EXPECT_CALL (mockVtable, markReadyToInstantiate ()).Times (1); EXPECT_CALL (mockVtable, markNoFurtherInstantiation ()) .Times (AtLeast (0)); CompPlugin* cp = CompPlugin::load("dummy"); cp->vTable = &mockVtable; CompPlugin::push(cp); CompPlugin::pop (); CompPlugin::unload(cp); } TEST_F (PluginTest, when_we_pop_plugin_mark_no_further_instantiation_is_called) { using namespace testing; EXPECT_CALL (mockfs, LoadPlugin (_, _, _)).Times (AtLeast (0)); EXPECT_CALL (mockfs, UnloadPlugin(_)).Times (AtLeast (0)); ON_CALL(mockfs, LoadPlugin (_, _, _)). WillByDefault (Return (true)); MockVTable mockVtable; EXPECT_CALL (mockVtable, init ()) .Times (AtLeast (0)) .WillOnce (Return (true)); EXPECT_CALL (mockVtable, markReadyToInstantiate ()).Times (AtLeast (0)); CompPlugin* cp = CompPlugin::load("dummy"); cp->vTable = &mockVtable; CompPlugin::push(cp); EXPECT_CALL (mockVtable, markNoFurtherInstantiation ()) .Times (1); CompPlugin::pop (); CompPlugin::unload(cp); } TEST_F (PluginTest, pop_returns_plugin_pointer) { using namespace testing; EXPECT_CALL (mockfs, LoadPlugin (_, _, _)).Times (AtLeast (0)); EXPECT_CALL (mockfs, UnloadPlugin(_)).Times (AtLeast (0)); ON_CALL(mockfs, LoadPlugin (_, _, _)). WillByDefault (Return (true)); MockVTable mockVtable; EXPECT_CALL (mockVtable, init ()) .Times (AtLeast (0)) .WillOnce (Return (true)); EXPECT_CALL (mockVtable, markReadyToInstantiate ()) .Times (AtLeast (0)); EXPECT_CALL (mockVtable, markNoFurtherInstantiation ()) .Times (AtLeast (0)); CompPlugin* cp = CompPlugin::load("dummy"); cp->vTable = &mockVtable; CompPlugin::push(cp); EXPECT_EQ (cp, CompPlugin::pop ()); CompPlugin::unload(cp); } TEST_F (PluginTest, unload_calls_unload_on_fs) { using namespace testing; EXPECT_CALL (mockfs, LoadPlugin (_, _, _)).Times (AtLeast (0)); ON_CALL(mockfs, LoadPlugin (_, _, _)). WillByDefault (Return (true)); CompPlugin* cp = CompPlugin::load("dummy"); EXPECT_CALL (mockfs, UnloadPlugin (cp)).Times (1); CompPlugin::unload(cp); } namespace { /* TODO (cleanup): Extract this into a separate library because it * duplicates what's in test-pluginclasshandler */ template class Base : public PluginClassStorage { public: typedef BaseType Type; Base (); ~Base (); static unsigned int allocPluginClassIndex (); static void freePluginClassIndex (unsigned int index); private: static PluginClassStorage::Indices indices; static std::list bases; }; template PluginClassStorage::Indices Base ::indices; template std::list * > Base ::bases; template Base ::Base () : PluginClassStorage (indices) { bases.push_back (this); } template Base ::~Base () { bases.remove (this); } template unsigned int Base ::allocPluginClassIndex () { unsigned int i = PluginClassStorage::allocatePluginClassIndex (indices); foreach (Base *b, bases) { if (indices.size () != b->pluginClasses.size ()) b->pluginClasses.resize (indices.size ()); } return i; } template void Base ::freePluginClassIndex (unsigned int index) { PluginClassStorage::freePluginClassIndex (indices, index); foreach (Base *b, bases) { if (indices.size () != b->pluginClasses.size ()) b->pluginClasses.resize (indices.size ()); } } class BaseScreen : public Base { }; class BaseWindow : public Base { }; class DestructionVerifier { public: DestructionVerifier (); virtual ~DestructionVerifier (); MOCK_METHOD0 (destroy, void ()); }; DestructionVerifier::DestructionVerifier () { using namespace testing; /* By default we don't care */ EXPECT_CALL (*this, destroy ()).Times (AtLeast (0)); } DestructionVerifier::~DestructionVerifier () { destroy (); } class PluginScreen : public PluginClassHandler , public DestructionVerifier { public: PluginScreen (BaseScreen *s); }; class PluginWindow : public PluginClassHandler , public DestructionVerifier { public: virtual ~PluginWindow () {} PluginWindow (BaseWindow *s); }; PluginScreen::PluginScreen (BaseScreen *s) : PluginClassHandler (s) { } PluginWindow::PluginWindow (BaseWindow *w) : PluginClassHandler (w) { } class MockScreenAndWindowVTable : public CompPlugin::VTableForScreenAndWindow { public: MOCK_METHOD0 (init, bool ()); }; template class PluginClassIntegrationTest : public PluginTest { public: PluginClassIntegrationTest (); ~PluginClassIntegrationTest (); boost::shared_ptr LoadPlugin (MockScreenAndWindowVTable &); MockPluginFilesystem mockfs; ValueHolder *valueHolder; }; void PopAndUnloadPlugin (CompPlugin *p) { ASSERT_EQ (p, CompPlugin::pop ()); CompPlugin::unload (p); } template boost::shared_ptr PluginClassIntegrationTest ::LoadPlugin (MockScreenAndWindowVTable &v) { typedef PluginClassIntegrationTest TestParam; using namespace testing; EXPECT_CALL (TestParam::mockfs, LoadPlugin (_, _, _)) .Times (AtLeast (0)) .WillOnce (Return (true)); EXPECT_CALL (TestParam::mockfs, UnloadPlugin(_)) .Times (AtLeast (0)); /* Load a plugin, we'll assign the vtable later */ CompPlugin *cp = CompPlugin::load("dummy"); cp->vTable = &v; EXPECT_CALL (v, init ()) .Times (AtLeast (0)) .WillOnce (Return (true)); CompPlugin::push(cp); return AutoDestroy (cp, PopAndUnloadPlugin); } template PluginClassIntegrationTest ::PluginClassIntegrationTest () { valueHolder = new ValueHolder (); ValueHolder::SetDefault (valueHolder); } template PluginClassIntegrationTest ::~PluginClassIntegrationTest () { delete valueHolder; ValueHolder::SetDefault (NULL); } template class BasePluginTemplate { public: typedef BaseType Base; typedef PluginType Plugin; }; typedef BasePluginTemplate BasePluginScreen; typedef BasePluginTemplate BasePluginWindow; } /* TODO: Extract actual interfaces out of CompScreen * and CompWindow that can be passed to the vTables without * using a link-seam like this one */ class CompScreen : public BaseScreen { }; class CompWindow : public BaseWindow { }; typedef ::testing::Types PluginTypes; TYPED_TEST_CASE (PluginClassIntegrationTest, PluginTypes); TYPED_TEST (PluginClassIntegrationTest, get_plugin_structure_null_on_not_loaded) { using namespace testing; /* Can't figure out how to get this out of TestParam::base at the moment */ typename TypeParam::Base base; typename TypeParam::Plugin *p = TypeParam::Plugin::get (&base); EXPECT_THAT (p, IsNull ()); } TYPED_TEST (PluginClassIntegrationTest, get_plugin_structure_nonnull_on_loaded) { using namespace testing; typedef PluginClassIntegrationTest TestParam; MockScreenAndWindowVTable vTable; boost::shared_ptr cp (TestParam::LoadPlugin (vTable)); typename TypeParam::Base base; typedef boost::shared_ptr PluginPtr; /* Because CompScreen is not available, we just need to delete * the plugin structure ourselves */ PluginPtr p (TypeParam::Plugin::get (&base)); EXPECT_THAT (p.get (), NotNull ()); } TYPED_TEST (PluginClassIntegrationTest, plugin_class_destroyed_when_vtable_is) { using namespace testing; typedef PluginClassIntegrationTest TestParam; MockScreenAndWindowVTable vTable; boost::shared_ptr cp (TestParam::LoadPlugin (vTable)); typename TypeParam::Base base; typedef boost::shared_ptr PluginPtr; /* Because CompScreen is not available, we just need to delete * the plugin structure ourselves */ PluginPtr p (TypeParam::Plugin::get (&base)); EXPECT_CALL (*p, destroy ()).Times (1); } compiz-0.9.11+14.04.20140409/src/plugin/tests/CMakeLists.txt0000644000015301777760000000121412321343002023457 0ustar pbusernogroup00000000000000include(CompizTesting) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/tests/shared ) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${compiz_plugindir}\\\" -DSHAREDIR=\\\"${compiz_sharedir}\\\" -DMETADATADIR=\\\"${compiz_metadatadir}\\\" ) add_executable( compiz_plugin_test ${CMAKE_CURRENT_SOURCE_DIR}/test-plugin.cpp ) target_link_libraries( compiz_plugin_test compiz_plugin compiz_core ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ) compiz_discover_tests ( compiz_plugin_test COVERAGE compiz_plugin compiz_core ) compiz-0.9.11+14.04.20140409/src/plugin/CMakeLists.txt0000644000015301777760000000220712321343002022320 0ustar pbusernogroup00000000000000include (CompizDefaults) include (CompizCommon) INCLUDE_DIRECTORIES( ${compiz_BINARY_DIR}/generated ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src/timer/include ${compiz_SOURCE_DIR}/src/timer/src ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/region/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/src/pluginclasshandler/include ${compiz_SOURCE_DIR}/src/servergrab/include ${COMPIZ_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) SET( PUBLIC_HEADERS ) SET( PRIVATE_HEADERS ) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${compiz_plugindir}\\\" -DSHAREDIR=\\\"${compiz_sharedir}\\\" -DMETADATADIR=\\\"${compiz_metadatadir}\\\" ) SET( SRCS ${compiz_SOURCE_DIR}/src/plugin.cpp ) ADD_LIBRARY( compiz_plugin STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) TARGET_LINK_LIBRARIES( compiz_plugin dl ) add_dependencies (compiz_plugin core-options) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) SET_TARGET_PROPERTIES( compiz_plugin PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) compiz-0.9.11+14.04.20140409/src/main.cpp0000644000015301777760000001316312321343002017715 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include "privatescreen.h" #include "privatestackdebugger.h" void CompManager::usage () { printf ("Usage: %s [OPTIONS] [PLUGINS ...]\n" "Options:\n" " --replace Replace any existing window managers\n" " --display DISPLAY Connect to X display DISPLAY (instead of $DISPLAY)\n" " --sm-disable Disable session management\n" " --sm-client-id ID Session management client ID\n" " --keep-desktop-hints Retain existing desktop hints\n" " --sync Make all X calls synchronous\n" " --debug Enable debug mode\n" " --version Show the program version\n" " --help Show this summary\n" , programName); } static void chldSignalHandler (int sig) { int status; switch (sig) { case SIGCHLD: waitpid (-1, &status, WNOHANG | WUNTRACED); break; } } bool CompManager::parseArguments (int argc, char **argv) { for (int i = 1; i < argc; i++) { if (!strcmp (argv[i], "--help")) { usage (); return false; } else if (!strcmp (argv[i], "--version")) { printf (PACKAGE_STRING "\n"); return false; } else if (!strcmp (argv[i], "--debug")) { debugOutput = true; } else if (!strcmp (argv[i], "--sync")) { synchronousX = true; } else if (!strcmp (argv[i], "--display")) { if (i + 1 < argc) displayName = argv[++i]; } else if (!strcmp (argv[i], "--keep-desktop-hints")) { useDesktopHints = true; } else if (!strcmp (argv[i], "--replace")) { replaceCurrentWm = true; } else if (!strcmp (argv[i], "--send-startup-message")) { sendStartupMessage = true; } else if (!strcmp (argv[i], "--sm-disable")) { disableSm = true; } else if (!strcmp (argv[i], "--sm-client-id")) { if (i + 1 < argc) clientId = argv[++i]; } else if (*argv[i] == '-') { compLogMessage ("core", CompLogLevelWarn, "Unknown option '%s'\n", argv[i]); } else { initialPlugins.push_back (argv[i]); } } return true; } CompManager::CompManager () : disableSm (false), clientId (NULL), displayName (NULL) { } bool CompManager::init () { std::auto_ptr screen(new CompScreenImpl ()); if (screen->createFailed ()) { return false; } ::screen = screen.get(); modHandler = new ModifierHandler (); if (!screen->init (displayName)) return false; if (!disableSm) { if (clientId == NULL) { char *desktop_autostart_id = getenv ("DESKTOP_AUTOSTART_ID"); if (desktop_autostart_id != NULL) clientId = strdup (desktop_autostart_id); unsetenv ("DESKTOP_AUTOSTART_ID"); } CompSession::init (clientId); } screen.release (); return true; } void CompManager::run () { screen->eventLoop (); } void CompManager::fini () { if (!disableSm) CompSession::close (); StackDebugger::SetDefault (NULL); delete screen; delete modHandler; } /* * Try to detect the true bin directory compiz was run from and store it * in environment variable COMPIZ_BIN_PATH. If all else fails, don't define it. */ static void detectCompizBinPath (char **argv) { const char *bin = argv[0]; #ifdef __linux__ char exe[PATH_MAX]; ssize_t len = readlink ("/proc/self/exe", exe, sizeof(exe)-1); if (len > 0) { exe[len] = '\0'; bin = exe; } #endif if (strchr (bin, '/')) // dirname needs a '/' to work reliably { // We need a private copy for dirname() to modify char *tmpBin = strdup (bin); if (tmpBin) { const char *binDir = dirname (tmpBin); if (binDir) { char env[PATH_MAX]; snprintf (env, sizeof(env)-1, "COMPIZ_BIN_PATH=%s/", binDir); putenv (strdup (env)); // parameter needs to be leaked! } free (tmpBin); } } } int main (int argc, char **argv) { CompManager manager; programName = argv[0]; programArgc = argc; programArgv = argv; detectCompizBinPath (argv); signal (SIGCHLD, chldSignalHandler); if (!manager.parseArguments (argc, argv)) return 0; if (!manager.init ()) return 1; manager.run (); manager.fini (); if (restartSignal) { execvp (programName, programArgv); return 1; } return 0; } compiz-0.9.11+14.04.20140409/src/output.cpp0000644000015301777760000000436712321343002020337 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include CompOutput::CompOutput () { mName = ""; mId = ~0; } CompString CompOutput::name () const { return mName; } unsigned int CompOutput::id () const { return mId; } const CompRect& CompOutput::workArea () const { return mWorkArea; } void CompOutput::setWorkArea (const CompRect &workarea) { mWorkArea = workarea; if (workarea.x () < static_cast (x1 ())) mWorkArea.setX (x1 ()); if (workarea.y () < static_cast (y1 ())) mWorkArea.setY (y1 ()); if (workarea.x2 () > static_cast (x2 ())) mWorkArea.setWidth (x2 () - mWorkArea.x ()); if (workarea.y2 () > static_cast (y2 ())) mWorkArea.setHeight (y2 () - mWorkArea.y ()); } void CompOutput::setGeometry (int x, int y, int width, int height) { CompRect::setGeometry (x, y, width, height); mWorkArea = *this; } void CompOutput::setId (CompString name, unsigned int id) { mName = name; mId = id; } compiz-0.9.11+14.04.20140409/src/CMakeLists.txt0000644000015301777760000001341612321343002021026 0ustar pbusernogroup00000000000000set (COMPIZ_MAIN_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set (COMPIZ_MAIN_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) include (CompizBcop) add_subdirectory( string ) add_subdirectory( logmessage ) add_subdirectory( timer ) add_subdirectory( pluginclasshandler ) add_subdirectory( point ) add_subdirectory( rect ) add_subdirectory( region ) add_subdirectory( window ) add_subdirectory( servergrab ) IF (COMPIZ_BUILD_TESTING) add_subdirectory( privatescreen/tests ) add_subdirectory( wrapsystem/tests ) add_subdirectory( plugin ) add_subdirectory( option/tests ) add_subdirectory( tests ) ENDIF (COMPIZ_BUILD_TESTING) compiz_add_bcop_targets ( core ${compiz_BINARY_DIR}/generated/core.xml.in _bcop_sources ) get_property (CORE_MOD_INCLUDE_DIRS GLOBAL PROPERTY CORE_MOD_INCLUDE_DIRS) include_directories ( ${compiz_SOURCE_DIR}/include ${compiz_BINARY_DIR} ${compiz_BINARY_DIR}/generated ${COMPIZ_INCLUDE_DIRS} ${CMAKE_PREFIX_PATH}/include ${CMAKE_INCLUDE_PATH} ${CORE_MOD_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR} # Module specific include dirs ${CMAKE_CURRENT_SOURCE_DIR}/string/include ${CMAKE_CURRENT_SOURCE_DIR}/string/src ${CMAKE_CURRENT_SOURCE_DIR}/logmessage/include ${CMAKE_CURRENT_SOURCE_DIR}/logmessage/src ${CMAKE_CURRENT_SOURCE_DIR}/timer/include ${CMAKE_CURRENT_SOURCE_DIR}/timer/src ${CMAKE_CURRENT_SOURCE_DIR}/pluginclasshandler/include ${CMAKE_CURRENT_SOURCE_DIR}/pluginclasshandler/src ${CMAKE_CURRENT_SOURCE_DIR}/point/include ${CMAKE_CURRENT_SOURCE_DIR}/point/src ${CMAKE_CURRENT_SOURCE_DIR}/rect/include ${CMAKE_CURRENT_SOURCE_DIR}/rect/src ${CMAKE_CURRENT_SOURCE_DIR}/servergrab/include ${CMAKE_CURRENT_SOURCE_DIR}/servergrab/src ${CMAKE_CURRENT_SOURCE_DIR}/region/include ${CMAKE_CURRENT_SOURCE_DIR}/region/src ${CMAKE_CURRENT_SOURCE_DIR}/window/geometry/include ${CMAKE_CURRENT_SOURCE_DIR}/window/geometry/src ${CMAKE_CURRENT_SOURCE_DIR}/window/geometry-saver/include ${CMAKE_CURRENT_SOURCE_DIR}/window/geometry-saver/src ${CMAKE_CURRENT_SOURCE_DIR}/window/extents/include ${CMAKE_CURRENT_SOURCE_DIR}/window/extents/src ${CMAKE_CURRENT_SOURCE_DIR}/window/constrainment/include ${CMAKE_CURRENT_SOURCE_DIR}/window/constrainment/src ) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${compiz_plugindir}\\\" -DSHAREDIR=\\\"${compiz_sharedir}\\\" -DMETADATADIR=\\\"${compiz_metadatadir}\\\" ) get_property (CORE_MOD_LIBRARY_DIRS GLOBAL PROPERTY CORE_MOD_LIBRARY_DIRS) link_directories ( ${COMPIZ_LINK_DIRS} ${CORE_MOD_LIBRARY_DIRS} ${libdir} ) add_library (compiz_core SHARED ${CMAKE_CURRENT_SOURCE_DIR}/global.cpp ${CMAKE_CURRENT_SOURCE_DIR}/atoms.cpp ${CMAKE_CURRENT_SOURCE_DIR}/actions.cpp ${CMAKE_CURRENT_SOURCE_DIR}/screen.cpp ${CMAKE_CURRENT_SOURCE_DIR}/window.cpp ${CMAKE_CURRENT_SOURCE_DIR}/action.cpp ${CMAKE_CURRENT_SOURCE_DIR}/option.cpp ${CMAKE_CURRENT_SOURCE_DIR}/match.cpp ${CMAKE_CURRENT_SOURCE_DIR}/event.cpp ${CMAKE_CURRENT_SOURCE_DIR}/plugin.cpp ${CMAKE_CURRENT_SOURCE_DIR}/session.cpp ${CMAKE_CURRENT_SOURCE_DIR}/windowgeometry.cpp ${CMAKE_CURRENT_SOURCE_DIR}/icon.cpp ${CMAKE_CURRENT_SOURCE_DIR}/modifierhandler.cpp ${CMAKE_CURRENT_SOURCE_DIR}/propertywriter.cpp ${CMAKE_CURRENT_SOURCE_DIR}/eventsource.cpp ${CMAKE_CURRENT_SOURCE_DIR}/signalsource.cpp ${CMAKE_CURRENT_SOURCE_DIR}/stackdebugger.cpp ${_bcop_sources} ) add_dependencies (core-options core-xml-file) add_dependencies (compiz_core core-options) # # Normal libraries use the major version number of the library as their # ABI version. But compiz uses funky date numbers for ABI revisions instead. # set (abiversion_h "${compiz_SOURCE_DIR}/include/core/abiversion.h") file (STRINGS ${abiversion_h} abiline REGEX "^#define +CORE_ABIVERSION .+$") string (REGEX REPLACE "#define +CORE_ABIVERSION +" "" abiversion "${abiline}") set_target_properties (compiz_core PROPERTIES VERSION ${VERSION} SOVERSION "ABI-${abiversion}" ) add_executable (compiz ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp ) add_library (compiz_size STATIC size.cpp ) add_library (compiz_output STATIC output.cpp ) add_library (compiz_outputdevices STATIC outputdevices.cpp outputdevices_x11.cpp ) add_dependencies (compiz_outputdevices core-options compiz_size compiz_output compiz_rect compiz_region compiz_window_geometry ) add_library (compiz_configurerequestbuffer STATIC configurerequestbuffer.cpp) target_link_libraries (compiz_configurerequestbuffer compiz_window_geometry) # workaround for build race add_dependencies (compiz core-xml-file) get_property (CORE_MOD_LIBRARIES GLOBAL PROPERTY CORE_MOD_LIBRARIES) target_link_libraries ( compiz_core ${COMPIZ_LIBRARIES} m pthread dl -Wl,-whole-archive compiz_size compiz_string compiz_timer compiz_logmessage compiz_pluginclasshandler compiz_point compiz_rect compiz_region compiz_window_geometry compiz_window_geometry_saver compiz_window_extents compiz_window_constrainment compiz_servergrab compiz_output compiz_outputdevices compiz_configurerequestbuffer -Wl,-no-whole-archive # ${CORE_MOD_LIBRARIES} ) # # Tell CMake that targets using compiz_core should NOT re-import the # libraries that compiz_core depends on (contains). # set_target_properties (compiz_core PROPERTIES LINK_INTERFACE_LIBRARIES "" ) target_link_libraries ( compiz compiz_core ) install ( TARGETS compiz_core LIBRARY DESTINATION ${libdir} ) install ( TARGETS compiz RUNTIME DESTINATION ${exec_prefix} ) enable_coverage_report( TARGETS compiz ) compiz-0.9.11+14.04.20140409/src/propertywriter.cpp0000644000015301777760000001254312321343002022113 0ustar pbusernogroup00000000000000/* * Copyright © 2010 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Sam Spilsbury */ #include #include PropertyWriter::PropertyWriter () { } PropertyWriter::PropertyWriter (CompString propName, CompOption::Vector &readTemplate) { mPropertyValues = readTemplate; mAtom = XInternAtom (screen->dpy (), propName.c_str (), 0); } void PropertyWriter::setReadTemplate (const CompOption::Vector &readTemplate) { mPropertyValues = readTemplate; } const CompOption::Vector & PropertyWriter::getReadTemplate () { return mPropertyValues; } bool PropertyWriter::updateProperty (Window id, CompOption::Vector &propertyData, int type) { int count = 0; if (type != XA_STRING) { long int data[propertyData.size ()]; foreach (CompOption &o, propertyData) { switch (o.type ()) { case CompOption::TypeBool: data[count] = o.value ().b (); break; case CompOption::TypeInt: data[count] = o.value ().i (); break; default: data[count] = 0; break; } count++; } XChangeProperty (screen->dpy (), id, mAtom, type, 32, PropModeReplace, (unsigned char *)data, propertyData.size ()); } else { char * data[propertyData.size ()]; XTextProperty prop; bool ok = true; foreach (CompOption &o, propertyData) { switch (o.type ()) { case CompOption::TypeString: data[count] = (char *) o.value ().s ().c_str (); break; default: data[count] = NULL; break; } count++; } for (int i = 0; i < count; i++) { if (data[i] == NULL) { ok = false; } } if (ok) { if (XStringListToTextProperty (data, count, &prop)) { XSetTextProperty (screen->dpy (), id, &prop, mAtom); XFree (prop.value); } } } return true; } void PropertyWriter::deleteProperty (Window id) { XDeleteProperty (screen->dpy (), id, mAtom); } const CompOption::Vector & PropertyWriter::readProperty (Window id) { Atom type; int retval, fmt; unsigned long nitems, exbyte; long int *data; if (mPropertyValues.empty ()) return mPropertyValues; retval = XGetWindowProperty (screen->dpy (), id, mAtom, 0, mPropertyValues.size (), False, XA_CARDINAL, &type, &fmt, &nitems, &exbyte, (unsigned char **)&data); if (retval == Success && !mPropertyValues.empty ()) { int count = 0; if (type == XA_CARDINAL && fmt == 32 && nitems == mPropertyValues.size ()) { foreach (CompOption &o, mPropertyValues) { CompOption::Value tmpVal; switch (mPropertyValues.at (count).type ()) { case CompOption::TypeBool: tmpVal = CompOption::Value ((bool) data[count]); o.set (tmpVal); break; case CompOption::TypeInt: tmpVal = CompOption::Value ((int) data[count]); o.set (tmpVal); break; default: tmpVal = CompOption::Value (CompOption::Value (0)); o.set (tmpVal); break; } count++; } XFree (data); return mPropertyValues; } else if (type == XA_STRING && fmt == 8) { XTextProperty tProp; retval = XGetTextProperty (screen->dpy (), id, &tProp, mAtom); if (tProp.value) { int retCount = 0; char **tData = NULL; XTextPropertyToStringList (&tProp, &tData, &retCount); if (retCount == (int) mPropertyValues.size ()) { foreach (CompOption &o, mPropertyValues) { CompOption::Value tmpVal; tmpVal = CompOption::Value (CompString ((char *) tData[count])); o.set (tmpVal); count++; } XFreeStringList (tData); XFree (data); XFree (tProp.value); return mPropertyValues; } else { XFreeStringList (tData); XFree (data); XFree (tProp.value); return nilValues; } } else { XFree (data); XFree (tProp.value); return nilValues; } } else if (fmt != 0) { XFree (data); } } else { return mPropertyValues; } return mPropertyValues; } compiz-0.9.11+14.04.20140409/src/privatescreen.h0000644000015301777760000007444212321343002021317 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _PRIVATESCREEN_H #define _PRIVATESCREEN_H #include #include #include #include #include #include #include #include #include #include "privatetimeoutsource.h" #include "privateiosource.h" #include "privateeventsource.h" #include "privatesignalsource.h" #include "outputdevices.h" #include "core_options.h" #include CompPlugin::VTable * getCoreVTable (); class CoreWindow; extern bool shutDown; extern bool restartSignal; extern bool useDesktopHints; extern std::list initialPlugins; typedef struct _CompDelayedEdgeSettings { CompAction::CallBack initiate; CompAction::CallBack terminate; unsigned int edge; unsigned int state; CompOption::Vector options; } CompDelayedEdgeSettings; struct CompScreenEdge { Window id; unsigned int count; }; struct CompGroup { unsigned int refCnt; Window id; }; struct CompStartupSequence { SnStartupSequence *sequence; unsigned int viewportX; unsigned int viewportY; }; namespace compiz { namespace core { namespace screen { inline int wraparound_mod (int a, int b) { if (a < 0) return (b - ((-a - 1) % (b))) - 1; else return a % b; }; } } } namespace compiz { namespace private_screen { class History; class WindowManager : boost::noncopyable { public: typedef CompWindow::ForEach Functor; WindowManager(); CompGroup * addGroup (Window id); void removeGroup (CompGroup *group); CompGroup * findGroup (Window id); void eraseWindowFromMap (Window id); void removeDestroyed (); void updateClientList (PrivateScreen& ps); void addToDestroyedWindows(CompWindow * cw) { destroyedWindows.push_back (cw); } void incrementPendingDestroys() { pendingDestroys++; } const CompWindowVector& getClientList () const { return clientList; } const CompWindowVector& getClientListStacking () const { return clientListStacking; } CompWindow * findWindow (Window id) const; CompWindow * getTopWindow() const; CompWindow * getTopServerWindow() const; void removeFromFindWindowCache(CompWindow* w) { if (w == lastFoundWindow) lastFoundWindow = 0; } void addWindowToMap(CompWindow* w) { if (w->id () != 1) windowsMap[w->id ()] = w; } void validateServerWindows(); void invalidateServerWindows(); void insertWindow (CompWindow* w, Window aboveId); void unhookWindow (CompWindow *w); CompWindowList& getWindows() { return windows; } CompWindowList& getDestroyedWindows() { return destroyedWindows; } void insertServerWindow(CompWindow* w, Window aboveId); void unhookServerWindow(CompWindow *w); CompWindowList& getServerWindows() { return serverWindows; } typedef CompWindowList::const_iterator iterator; typedef CompWindowList::const_reverse_iterator reverse_iterator; iterator begin() const { return windows.begin(); } iterator end() const { return windows.end(); } reverse_iterator rbegin() const { return windows.rbegin(); } reverse_iterator rend() const { return windows.rend(); } iterator serverBegin() const { return serverWindows.begin(); } iterator serverEnd() const { return serverWindows.end(); } reverse_iterator rserverBegin() const { return serverWindows.rbegin(); } reverse_iterator rserverEnd() const { return serverWindows.rend(); } void clearFullscreenHints() const; void showOrHideForDesktop(unsigned int desktop) const; void setWindowActiveness(::compiz::private_screen::History& history) const; void setNumberOfDesktops (unsigned int nDesktop) const; void updateWindowSizes() const; void forEachWindow(Functor const& f) const { std::for_each(windows.begin(), windows.end(), f); } private: CompWindowList windows; CompWindowList serverWindows; CompWindowList destroyedWindows; bool stackIsFresh; CompWindow::Map windowsMap; std::list groups; CompWindowVector clientList; /* clients in mapping order */ CompWindowVector clientListStacking; /* clients in stacking order */ std::vector clientIdList; /* client ids in mapping order */ std::vector clientIdListStacking;/* client ids in stacking order */ unsigned int pendingDestroys; mutable CompWindow* lastFoundWindow; }; unsigned int windowStateFromString (const char *str); class PluginManager { public: PluginManager(); void updatePlugins (CompScreen* screen, CompOption::Value::Vector const& extraPluginsRequested); void setPlugins(CompOption::Value::Vector const& vList) { plugin.set (CompOption::TypeString, vList); } bool isDirtyPluginList () const { return dirtyPluginList; } void setDirtyPluginList () { dirtyPluginList = true; } CompOption::Value::Vector mergedPluginList(CompOption::Value::Vector const& extraPluginsRequested) const; private: CompOption::Value plugin; bool dirtyPluginList; typedef std::set CompStringSet; CompStringSet blacklist; }; class GrabList { // TODO: std::list is almost certainly the wrong data // structure. Probably better as std::vector - many fewer // memory allocations and releases. typedef std::list GrabPtrList; public: typedef GrabPtrList::iterator GrabIterator; bool grabsEmpty() const { return grabs.empty(); } void grabsPush(Grab* grab) { grabs.push_back (grab); } GrabIterator grabsBegin() { return grabs.begin(); } GrabIterator grabsEnd() { return grabs.end(); } void grabsRemove(Grab* grab); bool grabExist (const char *grab); Grab* grabsBack() { return grabs.back (); } private: GrabPtrList grabs; }; class EventManager : public GrabList { public: EventManager (); ~EventManager (); void init (); void handleSignal (int signum); bool triggerPress (CompAction *action, CompAction::State state, CompOption::Vector &arguments); bool triggerRelease (CompAction *action, CompAction::State state, CompOption::Vector &arguments); void startEventLoop(Display* dpy); void quit() { mainloop->quit(); } CompWatchFdHandle addWatchFd ( int fd, short int events, FdWatchCallBack callBack); void removeWatchFd (CompWatchFdHandle handle); CompFileWatch* addFileWatch ( const char *path, int mask, FileWatchCallBack callBack); CompFileWatch* removeFileWatch (CompFileWatchHandle handle); const CompFileWatchList& getFileWatches () const; void grabNotified() { grabbed = true; } void ungrabNotified() { grabbed = false; } bool isGrabbed() const { return grabbed; } void setSupportingWmCheck (Display* dpy, Window root); bool notGrabWindow(Window w) const { return w != grabWindow; } void createGrabWindow (Display* dpy, Window root, XSetWindowAttributes* attrib); void destroyGrabWindow (Display* dpy) { XDestroyWindow (dpy, grabWindow); } Time getCurrentTime (Display* dpy) const; Window const& getGrabWindow() const { return grabWindow; } void resetPossibleTap() { possibleTap = 0; } private: void *possibleTap; Glib::RefPtr mainloop; Glib::RefPtr source; Glib::RefPtr timeout; CompSignalSource *sighupSource; CompSignalSource *sigtermSource; CompSignalSource *sigintSource; Glib::RefPtr ctx; CompFileWatchList fileWatch; CompFileWatchHandle lastFileWatchHandle; // TODO - almost certainly the wrong data structure // Why not a std::map? std::list > watchFds; CompWatchFdHandle lastWatchFdHandle; bool grabbed; /* true once we receive a GrabNotify on FocusOut and false on UngrabNotify from FocusIn */ Window grabWindow; }; class KeyGrab { public: int keycode; unsigned int modifiers; int count; }; class ButtonGrab { public: int button; unsigned int modifiers; int count; }; struct Grab { Grab(Cursor cursor, const char *name) : cursor(cursor), name(name) {} Cursor cursor; const char *name; }; // data members that don't belong (these probably belong // in CompScreenImpl as PrivateScreen doesn't use them) struct OrphanData : boost::noncopyable { OrphanData(); ~OrphanData(); Window activeWindow; Window nextActiveWindow; }; class GrabManager : boost::noncopyable { public: GrabManager(CompScreen *screen); bool addPassiveKeyGrab (CompAction::KeyBinding &key); void removePassiveKeyGrab (CompAction::KeyBinding &key); bool addPassiveButtonGrab (CompAction::ButtonBinding &button); void removePassiveButtonGrab (CompAction::ButtonBinding &button); void grabUngrabOneKey (unsigned int modifiers, int keycode, bool grab); bool grabUngrabKeys (unsigned int modifiers, int keycode, bool grab); void updatePassiveKeyGrabs (); void updatePassiveButtonGrabs(Window serverFrame); void setCurrentState(CompAction::State state); private: CompScreen * const screen; CompAction::State currentState; std::list buttonGrabs; std::list keyGrabs; }; class History : public virtual ::compiz::History, boost::noncopyable { public: History(); virtual ~History () {} void setCurrentActiveWindowHistory (int x, int y); void addToCurrentActiveWindowHistory (Window id); CompActiveWindowHistory* currentHistory (); unsigned int nextActiveNum () { return activeNum_++; } unsigned int activeNum () const; private: CompActiveWindowHistory history[ACTIVE_WINDOW_HISTORY_NUM]; int currentHistory_; unsigned int activeNum_; }; class ViewportRetrievalInterface { public: virtual ~ViewportRetrievalInterface () {} virtual const CompPoint & getCurrentViewport () const = 0; virtual const CompSize & viewportDimensions () const = 0; }; // Apart from a use by StartupSequence::addSequence this data // is only used by CompScreenImpl - like the OrphanData struct struct ViewPort : public ViewportRetrievalInterface { public: ViewPort(); CompPoint vp; CompSize vpSize; private: const CompPoint & getCurrentViewport () const { return vp; } const CompSize & viewportDimensions () const { return vpSize; } }; namespace viewports { void viewportForGeometry (const CompWindow::Geometry &gm, CompPoint &viewport, ViewportRetrievalInterface *viewports, const CompSize &screenSize); } class StartupSequence : boost::noncopyable { public: StartupSequence(); virtual ~StartupSequence() {} void addSequence (SnStartupSequence *sequence, CompPoint const& vp); void removeSequence (SnStartupSequence *sequence); void removeAllSequences (); void applyStartupProperties (CompScreen* screen, CompWindow *window); bool handleStartupSequenceTimeout (); virtual void updateStartupFeedback () = 0; bool emptySequence() const { return startupSequences.empty(); } private: std::list startupSequences; CompTimer startupSequenceTimer; }; // Implemented as a separate class to break dependency on PrivateScreen & XWindows class StartupSequenceImpl : public StartupSequence { public: StartupSequenceImpl(PrivateScreen* priv) : priv(priv) {} virtual void updateStartupFeedback (); private: PrivateScreen* const priv; }; class Extension { public: Extension() : is_enabled(), extension() {} template bool init(Display * dpy) { int error; is_enabled = ExtensionQuery(dpy, &extension, &error); return is_enabled; } template bool init(Display * dpy) { int opcode; int error; is_enabled = ExtensionQuery(dpy, &opcode, &extension, &error, NULL, NULL); if (!is_enabled) extension = -1; return is_enabled; } int isEnabled () const { return is_enabled; } int get () const { return extension; } private: bool is_enabled; int extension; }; class Ping : public virtual ::compiz::Ping { public: Ping() : lastPing_(1) {} virtual ~Ping() {} bool handlePingTimeout (WindowManager::iterator begin, WindowManager::iterator end, Display* dpy); unsigned int lastPing () const { return lastPing_; } private: unsigned int lastPing_; }; class DesktopWindowCount : public virtual ::compiz::DesktopWindowCount { public: DesktopWindowCount(); virtual ~DesktopWindowCount() {} virtual void incrementDesktopWindowCount(); virtual void decrementDesktopWindowCount(); virtual int desktopWindowCount(); private: int count; }; class MapNum : public virtual ::compiz::MapNum { public: MapNum(); virtual ~MapNum() {} virtual unsigned int nextMapNum(); private: unsigned int mapNum; }; class XWindowInfo : public virtual ::compiz::XWindowInfo { public: XWindowInfo(Display* const& dpy) : dpy(dpy) {} virtual ~XWindowInfo() {} virtual int getWmState (Window id); virtual void setWmState (int state, Window id) const; virtual void getMwmHints (Window id, unsigned int *func, unsigned int *decor) const; virtual unsigned int getProtocols (Window id); virtual unsigned int getWindowType (Window id); virtual unsigned int getWindowState (Window id); private: Display* const& dpy; }; unsigned int windowStateMask (Atom state); }} // namespace compiz::private_screen class FetchXEventInterface { public: virtual ~FetchXEventInterface () {} virtual bool getNextXEvent (XEvent &) = 0; }; class FetchEventInterface { public: virtual ~FetchEventInterface () {} virtual bool getNextEvent (XEvent &) = 0; }; class PrivateScreen : public CoreOptions, public FetchXEventInterface, public FetchEventInterface { public: PrivateScreen (CompScreen *screen, compiz::private_screen::WindowManager& windowManager); ~PrivateScreen (); bool initDisplay ( const char *name, compiz::private_screen::History& history, unsigned int showingDesktopMask); bool setOption (const CompString &name, CompOption::Value &value); bool getNextEvent (XEvent &); bool getNextXEvent (XEvent &); void processEvents (); bool triggerButtonPressBindings (CompOption::Vector &options, XButtonEvent *event, CompOption::Vector &arguments); bool triggerButtonReleaseBindings (CompOption::Vector &options, XButtonEvent *event, CompOption::Vector &arguments); bool shouldTriggerKeyPressAction (CompAction *action, XKeyEvent *event); bool shouldTriggerKeyReleaseAction (CompAction *action, XKeyEvent *event); bool shouldTriggerModifierPressAction (CompAction *action, XkbStateNotifyEvent *event); bool shouldTriggerModifierReleaseAction (CompAction *action, XkbStateNotifyEvent *event); bool triggerKeyPressBindings (CompOption::Vector &options, CompAction::Vector &actions, XKeyEvent *event, CompOption::Vector &arguments); bool triggerKeyReleaseBindings (CompOption::Vector &options, CompAction::Vector &actions, XKeyEvent *event, CompOption::Vector &arguments); bool triggerStateNotifyBindings (CompOption::Vector &options, CompAction::Vector &actions, XkbStateNotifyEvent *event, CompOption::Vector &arguments); bool triggerEdgeEnter (unsigned int edge, CompAction::State state, CompOption::Vector &arguments); void setAudibleBell (bool audible); bool handleActionEvent (XEvent *event); void handleSelectionRequest (XEvent *event); void handleSelectionClear (XEvent *event); bool desktopHintEqual (unsigned long *data, int size, int offset, int hintSize); void setDesktopHints (); void setVirtualScreenSize (int hsize, int vsize); void updateScreenEdges (); void reshape (int w, int h); void getDesktopHints (unsigned int showingDesktopMask); void updateScreenInfo (); Window getActiveWindow (Window root); void setWindowState (unsigned int state, Window id); bool readWindowProp32 (Window id, Atom property, unsigned short *returnValue); void configure (XConfigureEvent *ce); void setNumberOfDesktops (unsigned int nDesktop); void setCurrentDesktop (unsigned int desktop); void enableEdge (int edge); void disableEdge (int edge); void setDefaultWindowAttributes (XWindowAttributes *); static void compScreenSnEvent (SnMonitorEvent *event, void *userData); int getXkbEvent() const { return xkbEvent.get(); } std::vector& getScreenInfo () { return screenInfo; } SnDisplay* getSnDisplay () const { return snDisplay; } const char* displayString() const { return displayString_; } const CompRegion& getRegion() const { return region; } const XWindowAttributes& getAttrib() const { return attrib; } Window rootWindow() const { return root; } void identifyEdgeWindow(Window id); void setPlugins(const CompOption::Value::Vector& vList); void initPlugins(); void updateClientList() { windowManager.updateClientList(*this); } void detectOutputDevices(CoreOptions& coreOptions); void updateOutputDevices(CoreOptions& coreOptions); void setPingTimerCallback(CompTimer::CallBack const& callback) { pingTimer.setCallback(callback); } public: Display* dpy; compiz::private_screen::Extension xSync; compiz::private_screen::Extension xRandr; compiz::private_screen::Extension xShape; compiz::private_screen::ViewPort viewPort; compiz::private_screen::StartupSequenceImpl startupSequence; compiz::private_screen::EventManager eventManager; compiz::private_screen::OrphanData orphanData; compiz::core::OutputDevices outputDevices; Colormap colormap; int screenNum; unsigned int nDesktop; unsigned int currentDesktop; CompOutput fullscreenOutput; CompScreenEdge screenEdge[SCREEN_EDGE_NUM]; Window wmSnSelectionWindow; int clientPointerDeviceId; Cursor normalCursor; Cursor busyCursor; Cursor invisibleCursor; CompRect workArea; bool initialized; private: CompScreen* screen; compiz::private_screen::Extension xkbEvent; //TODO? Pull these two out as a class? bool xineramaExtension; std::vector screenInfo; SnDisplay* snDisplay; char displayString_[256]; KeyCode escapeKeyCode; KeyCode returnKeyCode; CompRegion region; Window root; XWindowAttributes attrib; SnMonitorContext* snContext; Atom wmSnAtom; Time wmSnTimestamp; unsigned long *desktopHintData; int desktopHintSize; Window edgeWindow; CompTimer pingTimer; CompTimer edgeDelayTimer; CompDelayedEdgeSettings edgeDelaySettings; Window xdndWindow; compiz::private_screen::PluginManager pluginManager; compiz::private_screen::WindowManager& windowManager; }; class CompManager { public: CompManager (); bool init (); void run (); void fini (); bool parseArguments (int, char **); void usage (); static bool initPlugin (CompPlugin *p); static void finiPlugin (CompPlugin *p); private: bool disableSm; char *clientId; char *displayName; }; /** * A wrapping of the X display screen. This takes care of communication to the * X server. */ class CompScreenImpl : public CompScreen, public ServerGrabInterface, ::compiz::private_screen::DesktopWindowCount, ::compiz::private_screen::MapNum, ::compiz::private_screen::Ping, ::compiz::private_screen::XWindowInfo, ::compiz::private_screen::History { public: CompScreenImpl (); ~CompScreenImpl (); bool init (const char *name); void eventLoop (); CompFileWatchHandle addFileWatch (const char *path, int mask, FileWatchCallBack callBack); void removeFileWatch (CompFileWatchHandle handle); const CompFileWatchList& getFileWatches () const; CompWatchFdHandle addWatchFd (int fd, short int events, FdWatchCallBack callBack); void removeWatchFd (CompWatchFdHandle handle); void storeValue (CompString key, CompPrivate value); bool hasValue (CompString key); CompPrivate getValue (CompString key); void eraseValue (CompString key); Display * dpy (); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); bool XRandr (); int randrEvent (); bool XShape (); int shapeEvent (); int syncEvent (); SnDisplay * snDisplay (); Window activeWindow (); Window autoRaiseWindow (); const char * displayString (); CompWindow * findWindow (Window id); CompWindow * findTopLevelWindow (Window id, bool override_redirect = false); bool readImageFromFile (CompString &name, CompString &pname, CompSize &size, void *&data); bool writeImageToFile (CompString &path, const char *format, CompSize &size, void *data); unsigned int getWindowProp (Window id, Atom property, unsigned int defaultValue); void setWindowProp (Window id, Atom property, unsigned int value); unsigned short getWindowProp32 (Window id, Atom property, unsigned short defaultValue); void setWindowProp32 (Window id, Atom property, unsigned short value); Window root (); int xkbEvent (); XWindowAttributes attrib (); int screenNum (); CompWindowList & windows (); CompWindowList & serverWindows (); CompWindowList & destroyedWindows (); void warpPointer (int dx, int dy); Time getCurrentTime (); Window selectionWindow (); void forEachWindow (CompWindow::ForEach); void focusDefaultWindow (); void insertWindow (CompWindow *w, Window aboveId); void unhookWindow (CompWindow *w); void insertServerWindow (CompWindow *w, Window aboveId); void unhookServerWindow (CompWindow *w); Cursor normalCursor (); Cursor invisibleCursor (); /* Adds an X Pointer and Keyboard grab to the stack. Since * compiz as a client only need to grab once, multiple clients * can call this and all get events, but the pointer will * be grabbed once and the actual grab refcounted */ GrabHandle pushGrab (Cursor cursor, const char *name); /* Allows you to change the pointer of your grab */ void updateGrab (GrabHandle handle, Cursor cursor); /* Removes your grab from the stack. Once the internal refcount * reaches zero, the X Pointer and Keyboard are both ungrabbed */ void removeGrab (GrabHandle handle, CompPoint *restorePointer); /* Returns true if a grab other than the grabs specified here * exists */ bool otherGrabExist (const char *, ...); /* Returns true if the specified grab exists */ bool grabExist (const char *); /* Returns true if the X Pointer and / or Keyboard is grabbed * by anything (another application, pluigins etc) */ bool grabbed (); const CompWindowVector & clientList (bool stackingOrder); bool addAction (CompAction *action); void removeAction (CompAction *action); void updateWorkarea (); void toolkitAction (Atom toolkitAction, Time eventTime, Window window, long data0, long data1, long data2); void runCommand (CompString command); void moveViewport (int tx, int ty, bool sync); void sendWindowActivationRequest (Window id); int outputDeviceForPoint (int x, int y); int outputDeviceForPoint (const CompPoint &point); CompRect getCurrentOutputExtents (); const CompRect & getWorkareaForOutput (unsigned int outputNum) const; void viewportForGeometry (const CompWindow::Geometry &gm, CompPoint &viewport); int outputDeviceForGeometry (const CompWindow::Geometry& gm); const CompPoint & vp () const; const CompSize & vpSize () const; CompOutput::vector & outputDevs (); CompOutput & currentOutputDev () const; const CompRect & workArea () const; unsigned int currentDesktop (); unsigned int nDesktop (); bool shouldSerializePlugins () ; const CompRegion & region () const; bool hasOverlappingOutputs (); CompOutput & fullscreenOutput (); std::vector & screenInfo (); CompIcon *defaultIcon () const; bool updateDefaultIcon (); void updateSupportedWmHints (); unsigned int showingDesktopMask() const; virtual bool grabsEmpty() const; virtual void sizePluginClasses(unsigned int size); virtual void setWindowState (unsigned int state, Window id); virtual void addToDestroyedWindows(CompWindow * cw); virtual void processEvents (); virtual void alwaysHandleEvent (XEvent *event); virtual ServerGrabInterface * serverGrabInterface (); virtual void updatePassiveKeyGrabs () const; virtual void updatePassiveButtonGrabs(Window serverFrame); virtual bool displayInitialised() const; virtual void applyStartupProperties (CompWindow *window); virtual void updateClientList(); virtual CompWindow * getTopWindow() const; virtual CompWindow * getTopServerWindow() const; virtual CoreOptions& getCoreOptions(); virtual Colormap colormap() const; virtual void setCurrentDesktop (unsigned int desktop); virtual Window activeWindow() const; virtual bool grabWindowIsNot(Window w) const; virtual void incrementPendingDestroys(); virtual void setNextActiveWindow(Window id); virtual Window getNextActiveWindow() const; virtual CompWindow * focusTopMostWindow (); public : static bool showDesktop (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool windowMenu (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool closeWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool unmaximizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool unmaximizeOrMinimizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool minimizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool maximizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool maximizeWinHorizontally (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool maximizeWinVertically (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool raiseWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool lowerWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleWinMaximized (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleWinMaximizedHorizontally (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleWinMaximizedVertically (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool shadeWin (CompAction *action, CompAction::State state, CompOption::Vector &options); bool createFailed () const; private: virtual bool _setOptionForPlugin(const char *, const char *, CompOption::Value &); virtual bool _initPluginForScreen(CompPlugin *); virtual void _finiPluginForScreen(CompPlugin *); virtual void _handleEvent(XEvent *event); virtual void _logMessage(const char *, CompLogLevel, const char*); virtual void _enterShowDesktopMode(); virtual void _leaveShowDesktopMode(CompWindow *); virtual void _addSupportedAtoms(std::vector& atoms); // These are stubs - but allow mocking of AbstractCompWindow virtual void _fileWatchAdded(CompFileWatch *); virtual void _fileWatchRemoved(CompFileWatch *); virtual void _sessionEvent(CompSession::Event, CompOption::Vector &); virtual void _handleCompizEvent(const char *, const char *, CompOption::Vector &); virtual bool _fileToImage(CompString &, CompSize &, int &, void *&); virtual bool _imageToFile(CompString &, CompString &, CompSize &, int, void *); virtual CompMatch::Expression * _matchInitExp(const CompString&); virtual void _matchExpHandlerChanged(); virtual void _matchPropertyChanged(CompWindow *); virtual void _outputChangeNotify(); void grabServer (); void ungrabServer (); void syncServer (); bool handlePingTimeout(); Window below; CompTimer autoRaiseTimer_; Window autoRaiseWindow_; CompIcon *defaultIcon_; compiz::private_screen::GrabManager mutable grabManager; ValueHolder valueHolder; bool eventHandled; PrivateScreen privateScreen; compiz::private_screen::WindowManager windowManager; unsigned int showingDesktopMask_; }; #endif compiz-0.9.11+14.04.20140409/src/stackdebugger.cpp0000644000015301777760000003357112321343002021610 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "privatestackdebugger.h" #include "privatescreen.h" #include "privatewindow.h" #include namespace { StackDebugger * gStackDebugger = NULL; } StackDebugger * StackDebugger::Default () { return gStackDebugger; } void StackDebugger::SetDefault (StackDebugger *dbg) { if (gStackDebugger) delete gStackDebugger; gStackDebugger = dbg; } StackDebugger::StackDebugger (Display *dpy, Window root, FetchXEventInterface *fetchXEvent) : mServerNChildren (0), mServerChildren (NULL), mWindowsChanged (false), mServerWindowsChanged (false), mRoot (root), mDpy (dpy), mFetchXEvent (fetchXEvent), mTimeoutRequired (false) { } StackDebugger::~StackDebugger () { if (mServerChildren) { XFree (mServerChildren); mServerChildren = NULL; mServerNChildren = 0; } } bool StackDebugger::timedOut () { return mTimeoutRequired; } void StackDebugger::removeServerWindow (Window id) { /* Find the toplevel window in the list and remove it */ for (CompWindowList::iterator it = mLastServerWindows.begin (); it != mLastServerWindows.end (); ++it) { if ((*it)->id () == id) { mLastServerWindows.erase (it); break; } } } void StackDebugger::overrideRedirectRestack (Window toplevel, Window sibling) { CompWindow *tl = screen->findWindow (toplevel); removeServerWindow (toplevel); /* Find the sibling of this window and insert above it or at * the bottom if the sibling is 0 */ if (sibling) { for (CompWindowList::iterator it = mLastServerWindows.begin (); it != mLastServerWindows.end (); ++it) { if (sibling == (*it)->id () || sibling == (*it)->frame ()) { mLastServerWindows.insert (++it, tl); break; } } } else mLastServerWindows.push_front (tl); } bool StackDebugger::getNextEvent (XEvent &ev) { if (mEvents.empty ()) return false; ev = mEvents.front (); mEvents.pop_front (); return true; } void StackDebugger::loadStack (CompWindowList &serverWindows, bool wait) { Window rootRet, parentRet; if (mServerChildren) XFree (mServerChildren); XSync (mDpy, FALSE); XGrabServer (mDpy); XQueryTree (mDpy, mRoot, &rootRet, &parentRet, &mServerChildren, &mServerNChildren); unsigned int n = XEventsQueued (mDpy, QueuedAfterFlush); mEvents.clear (); mEvents.resize (n); std::list ::iterator it = mEvents.begin (); while (it != mEvents.end ()) { mFetchXEvent->getNextXEvent ((*it)); ++it; } XSync (mDpy, FALSE); /* It is possible that X might not be keeping up with us, so * we should give it about 300 ms in case the stacks are out of sync * in order to deliver any more events that might be pending */ mTimeoutRequired = false; mLastServerWindows = serverWindows; if (mServerNChildren != serverWindows.size () && wait) { struct pollfd pfd; pfd.events = POLLIN; pfd.revents = 0; pfd.fd = ConnectionNumber (mDpy); poll (&pfd, 1, 300); XEvent e; while (mFetchXEvent->getNextXEvent (e)) mEvents.push_back (e); mTimeoutRequired = true; } mDestroyedFrames.clear (); XUngrabServer (mDpy); XSync (mDpy, FALSE); } void StackDebugger::addDestroyedFrame (Window f) { mDestroyedFrames.push_back (f); } void StackDebugger::removeDestroyedFrame (Window f) { mDestroyedFrames.remove (f); } bool StackDebugger::cmpStack (CompWindowList &windows, CompWindowList &serverWindows, bool verbose) { std::vector serverSideWindows; CompWindowList::reverse_iterator lrrit = windows.rbegin (); CompWindowList::reverse_iterator lsrit = mLastServerWindows.rbegin (); unsigned int i = 0; bool err = false; for (unsigned int n = 0; n < mServerNChildren; n++) { if (std::find (mDestroyedFrames.begin (), mDestroyedFrames.end (), mServerChildren[n]) == mDestroyedFrames.end ()) serverSideWindows.push_back (mServerChildren[n]); } if (verbose) compLogMessage ("core", CompLogLevelDebug, "sent | recv | server |"); for (;(lrrit != windows.rend () || lsrit != mLastServerWindows.rend () || i != serverSideWindows.size ());) { Window lrXid = 0; Window lsXid = 0; Window sXid = 0; if (lrrit != windows.rend ()) lrXid = (*lrrit)->priv->frame ? (*lrrit)->priv->frame : (*lrrit)->id (); if (lsrit != mLastServerWindows.rend ()) lsXid = (*lsrit)->priv->frame ? (*lsrit)->priv->frame : (*lsrit)->id (); if (i != serverSideWindows.size ()) sXid = serverSideWindows[serverSideWindows.size () - (i + 1)]; if (verbose) compLogMessage ("core", CompLogLevelDebug, "id 0x%x id 0x%x id 0x%x %s", (unsigned int) lsXid, (unsigned int) lrXid, (unsigned int) sXid, (lrXid != sXid) ? " /!\\ " : ""); if (lrXid != sXid) err = true; if (lrrit != windows.rend ()) ++lrrit; if (lsrit != mLastServerWindows.rend()) ++lsrit; if (i != serverSideWindows.size ()) i++; } return err; } /* Checks the sanity of the list of windows last sent to the server. * * There are a few stacking "layers" here. From top to bottom: * - 1) Docks stacked above toplevel windows which are stacked * above fullscreen windows * - 2) "Keep above" toplevel windows above fullscreen windows * where a toplevel is in focus * - 3) Toplevel windows in focus above fullscreen windows * - 4) Fullscreen windows * - 5) Dock windows * - 6) Keep above windows * - 7) Toplevel windows * - 8) Docks which are marked "Keep Below" * - 9) "Keep Below" windows * - 10) Desktop windows * * There are also a few rules which apply here: * - 1) Dock windows should always be above normal windows * except if marked keep below on any layer. * - 2) Dock windows should ONLY be on one layer at a time, * eg if they are on layer 1 then there cannot * also be dock windows on layer 5 (except in the * case of below dock windows on layer 8) * - 3) Fullscreen windows must always be above docks when in * focus, no matter if there is another window with "Keep Above" * - 4) Focused windows take priority over fullscreen windows and * docks must always be above them (see rule 1) * * As we pass through each layer, this function flags each one from * lowest being the most bits set to highest being the least bits * set. If a window violates this it raises a warning */ #define DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN 0xffffffff >> 1 #define KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN 0xffffffff >> 2 #define TOPLEVELS_ABOVE_FULLSCREEN 0xffffffff >> 3 #define FULLSCREEN 0xffffffff >> 4 #define DOCKS 0xffffffff >> 5 #define KEEP_ABOVE 0xffffffff >> 6 #define TOPLEVELS 0xffffffff >> 7 #define DOCKS_BELOW 0xffffffff >> 8 #define KEEP_BELOW 0xffffffff >> 9 #define DESKTOP 0xffffffff >> 10 namespace { bool setCurrentLayer (Window requestingWindow, int layer, int ¤t) { bool ret = false; /* Only allow steps down */ if ((current & layer) != layer) { ret = true; compLogMessage ("stackdebugger", CompLogLevelWarn, "0x%x requested invalid layer 0x%x", requestingWindow, layer, current); } current = layer; return ret; } } bool StackDebugger::checkSanity (CompWindowList &serverWindows, bool verbose) { int current = 0xffffffff; int oldCurrent = current; bool err = false; if (verbose) compLogMessage ("stackdebugger", CompLogLevelDebug, "processing new stack --------"); /* go backwards down the stack */ for (CompWindowList::reverse_iterator rit = serverWindows.rbegin (); rit != serverWindows.rend (); ++rit) { CompWindow *w = (*rit); /* Override redirect windows set all kinds * of crazy stuff and are required to stack * themselves so skip those */ if (w->overrideRedirect ()) continue; /* ignore non-override redirect unmanaged windows */ if (!w->managed ()) continue; /* ignore any windows that just got created */ if (!w->mapNum ()) continue; /* determine the current layer */ if (w->type () == CompWindowTypeDockMask) { if ((current & DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) == DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) { bool fullscreenWindow = false; /* search down the stack to check if there is a fullscreen * window, otherwise we are not on the fullscreen layer */ for (CompWindow *rw = w->prev; rw; rw = rw->prev) { if (rw->type () & CompWindowTypeFullscreenMask) { fullscreenWindow = true; break; } } /* if there is no fullscreen window, change the layer */ if (!fullscreenWindow) err |= setCurrentLayer (w->id (), DOCKS, current); else err |= setCurrentLayer (w->id (), DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN, current); } else if (w->state () & CompWindowStateBelowMask) err |= setCurrentLayer (w->id (), DOCKS_BELOW, current); else err |= setCurrentLayer (w->id (), DOCKS, current); } else if (w->type () == CompWindowTypeFullscreenMask) { err |= setCurrentLayer (w->id (), FULLSCREEN, current); } else if (w->type () == CompWindowTypeDesktopMask) { err |= setCurrentLayer (w->id (), DESKTOP, current); } /* everything else that is not a fullscreen window or a desktop */ else { if (w->state () & CompWindowStateAboveMask) { if ((current & KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) == KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) { bool fullscreenWindow = false; /* search down the stack to check if there is a fullscreen * window, otherwise we are not on the fullscreen layer */ for (CompWindow *rw = w->prev; rw; rw = rw->prev) { if (rw->type () & CompWindowTypeFullscreenMask) { fullscreenWindow = true; break; } } if (!fullscreenWindow) err |= setCurrentLayer (w->id (), KEEP_ABOVE, current); else err |= setCurrentLayer (w->id (), KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN, current); } else err |= setCurrentLayer (w->id (), KEEP_ABOVE, current); } else if (w->state () & CompWindowStateBelowMask) err |= setCurrentLayer (w->id (), KEEP_BELOW, current); else { if ((current & TOPLEVELS_ABOVE_FULLSCREEN) == TOPLEVELS_ABOVE_FULLSCREEN) { bool fullscreenWindow = false; /* search down the stack to check if there is a fullscreen * window, otherwise we are not on the fullscreen layer */ for (CompWindow *rw = w->prev; rw; rw = rw->prev) { if (rw->type () & CompWindowTypeFullscreenMask) { fullscreenWindow = true; break; } } if (!fullscreenWindow) err |= setCurrentLayer (w->id (), TOPLEVELS, current); else err |= setCurrentLayer (w->id (), TOPLEVELS_ABOVE_FULLSCREEN, current); } else err |= setCurrentLayer (w->id (), TOPLEVELS, current); } } if ((current & DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) == DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN"); } else if ((current & KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) == KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN"); } else if ((current & TOPLEVELS_ABOVE_FULLSCREEN) == TOPLEVELS_ABOVE_FULLSCREEN) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer TOPLEVELS_ABOVE_FULLSCREEN"); } else if ((current & FULLSCREEN) == FULLSCREEN) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer FULLSCREEN"); } else if ((current & DOCKS) == DOCKS) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer DOCKS"); } else if ((current & KEEP_ABOVE) == KEEP_ABOVE) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer KEEP_ABOVE"); } else if ((current & TOPLEVELS) == TOPLEVELS) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer TOPLEVELS"); } else if ((current & DOCKS_BELOW) == DOCKS_BELOW) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer DOCKS_BELOW"); } else if ((current & KEEP_BELOW) == KEEP_BELOW) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer KEEP_BELOW"); } else if ((current & DESKTOP) == DESKTOP) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer DESKTOP"); } oldCurrent = current; } return err; } compiz-0.9.11+14.04.20140409/src/privatematch.h0000644000015301777760000000440312321343002021122 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _PRIVATEMATCH_H #define _PRIVATEMATCH_H #include #include #define MATCH_OP_AND_MASK (1 << 0) #define MATCH_OP_NOT_MASK (1 << 1) class MatchOp { public: typedef enum { TypeNone, TypeGroup, TypeExp } Type; typedef std::list List; MatchOp (); virtual ~MatchOp (); virtual Type type () { return TypeNone; }; unsigned int flags; }; class MatchExpOp : public MatchOp { public: MatchExpOp (); MatchExpOp (const MatchExpOp &); MatchOp::Type type () { return MatchOp::TypeExp; }; CompString value; boost::shared_ptr e; }; class MatchGroupOp : public MatchOp { public: MatchGroupOp (); ~MatchGroupOp (); MatchGroupOp (const MatchGroupOp &); MatchGroupOp & operator= (const MatchGroupOp &); MatchOp::Type type () { return MatchOp::TypeGroup; }; MatchOp::List op; }; class PrivateMatch { public: PrivateMatch (); public: MatchGroupOp op; }; #endif compiz-0.9.11+14.04.20140409/src/privatestackdebugger.h0000644000015301777760000000546212321343002022646 0ustar pbusernogroup00000000000000/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ /* FIXME: Define CompWindowList somewhere else * so that this can be come a truly standalone * object */ #include #include #ifndef _COMPIZ_PRIVATESTACKDEBUGGER_H #define _COMPIZ_PRIVATESTACKDEBUGGER_H class FetchXEventInterface; class StackDebugger { public: typedef std::vector eventList; StackDebugger (Display *, Window, FetchXEventInterface *fetchXEvent); ~StackDebugger (); void loadStack (CompWindowList &serverWindows, bool wait = false); void windowsChanged (bool change) { mWindowsChanged = change; }; void serverWindowsChanged (bool change) { mServerWindowsChanged = change; }; bool windowsChanged () { return mWindowsChanged; } bool serverWindowsChanged () { return mServerWindowsChanged; } void overrideRedirectRestack (Window toplevel, Window sibling); void removeServerWindow (Window); void addDestroyedFrame (Window); void removeDestroyedFrame (Window); bool stackChange (); bool cmpStack (CompWindowList &windows, CompWindowList &serverWindows, bool verbose = false); bool timedOut (); bool getNextEvent (XEvent &); bool checkSanity (CompWindowList &serverWindows, bool verbose = false); static StackDebugger * Default (); static void SetDefault (StackDebugger *); private: std::list mDestroyedFrames; unsigned int mServerNChildren; Window *mServerChildren; bool mWindowsChanged; bool mServerWindowsChanged; Window mRoot; Display *mDpy; FetchXEventInterface *mFetchXEvent; bool mTimeoutRequired; CompWindowList mLastServerWindows; std::list mEvents; }; #endif compiz-0.9.11+14.04.20140409/src/windowgeometry.cpp0000644000015301777760000001147712321343002022062 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include "privatewindow.h" #include "core/window.h" const CompWindow::Geometry & CompWindow::serverGeometry () const { return priv->attrib.override_redirect ? priv->geometry : priv->serverGeometry; } const CompWindow::Geometry & CompWindow::geometry () const { return priv->attrib.override_redirect ? priv->geometry : priv->serverGeometry; } int CompWindow::x () const { return geometry ().x (); } int CompWindow::y () const { return geometry ().y (); } CompPoint CompWindow::pos () const { return CompPoint (geometry ().x (), geometry ().y ()); } /* With border */ int CompWindow::width () const { return geometry ().widthIncBorders (); } int CompWindow::height () const { return geometry ().heightIncBorders (); } CompSize CompWindow::size () const { return CompSize (width (), height ()); } int CompWindow::serverX () const { return serverGeometry ().x (); } int CompWindow::serverY () const { return serverGeometry ().y (); } CompPoint CompWindow::serverPos () const { return CompPoint (serverGeometry ().x (), serverGeometry ().y ()); } /* With border */ int CompWindow::serverWidth () const { return serverGeometry ().widthIncBorders (); } int CompWindow::serverHeight () const { return serverGeometry ().heightIncBorders (); } const CompSize CompWindow::serverSize () const { return CompSize (serverGeometry ().widthIncBorders (), serverGeometry ().heightIncBorders ()); } CompRect CompWindow::borderRect () const { return CompRect (geometry ().xMinusBorder () - priv->border.left, geometry ().yMinusBorder () - priv->border.top, geometry ().widthIncBorders () + priv->border.left + priv->border.right, geometry ().heightIncBorders () + priv->border.top + priv->border.bottom); } CompRect CompWindow::serverBorderRect () const { return CompRect (serverGeometry ().xMinusBorder () - priv->border.left, serverGeometry ().yMinusBorder () - priv->border.top, serverGeometry ().widthIncBorders () + priv->border.left + priv->border.right, serverGeometry ().heightIncBorders() + priv->border.top + priv->border.bottom); } CompRect CompWindow::inputRect () const { return CompRect (geometry ().xMinusBorder () - priv->serverInput.left, geometry ().yMinusBorder () - priv->serverInput.top, geometry ().widthIncBorders () + priv->serverInput.left + priv->serverInput.right, geometry ().heightIncBorders () + priv->serverInput.top + priv->serverInput.bottom); } CompRect CompWindow::serverInputRect () const { return CompRect (serverGeometry ().xMinusBorder () - priv->serverInput.left, serverGeometry ().yMinusBorder () - priv->serverInput.top, serverGeometry ().widthIncBorders () + priv->serverInput.left + priv->serverInput.right, serverGeometry ().heightIncBorders () + priv->serverInput.top + priv->serverInput.bottom); } CompRect CompWindow::outputRect () const { return CompRect (geometry ().xMinusBorder ()- priv->output.left, geometry ().yMinusBorder () - priv->output.top, geometry ().widthIncBorders () + priv->output.left + priv->output.right, geometry ().heightIncBorders () + priv->output.top + priv->output.bottom); } CompRect CompWindow::serverOutputRect () const { return CompRect (serverGeometry ().xMinusBorder () - priv->output.left, serverGeometry ().yMinusBorder () - priv->output.top, serverGeometry ().widthIncBorders () + priv->output.left + priv->output.right, serverGeometry ().heightIncBorders () + priv->output.top + priv->output.bottom); } compiz-0.9.11+14.04.20140409/src/privatewindow.h0000644000015301777760000002564612321343002021351 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _PRIVATEWINDOW_H #define _PRIVATEWINDOW_H #include #include #include #include #include #include #include "syncserverwindow.h" #include "asyncserverwindow.h" #define XWINDOWCHANGES_INIT {0, 0, 0, 0, 0, None, 0} namespace compiz {namespace X11 { class PendingEvent { public: PendingEvent (Display *, Window); virtual ~PendingEvent (); virtual bool match (XEvent *); unsigned int serial () { return mSerial; } // HACK: will be removed virtual void dump (); typedef boost::shared_ptr Ptr; protected: virtual Window getEventWindow (XEvent *); unsigned int mSerial; Window mWindow; }; class PendingConfigureEvent : public PendingEvent { public: PendingConfigureEvent (Display *, Window, unsigned int, XWindowChanges *); virtual ~PendingConfigureEvent (); virtual bool match (XEvent *); bool matchVM (unsigned int valueMask); bool matchRequest (XWindowChanges &xwc, unsigned int); virtual void dump (); typedef boost::shared_ptr Ptr; protected: virtual Window getEventWindow (XEvent *); private: unsigned int mValueMask; XWindowChanges mXwc; }; class PendingEventQueue { public: PendingEventQueue (Display *); virtual ~PendingEventQueue (); void add (PendingEvent::Ptr p); bool match (XEvent *); bool pending (); bool forEachIf (boost::function ); void clear () { mEvents.clear (); } // HACK will be removed void dump (); protected: bool removeIfMatching (const PendingEvent::Ptr &p, XEvent *); private: std::list mEvents; }; }} struct CompGroup; typedef CompWindowExtents CompFullscreenMonitorSet; class X11SyncServerWindow : public compiz::window::SyncServerWindow { public: X11SyncServerWindow (Display *dpy, const Window *w, const Window *frame); bool queryAttributes (XWindowAttributes &attrib); bool queryFrameAttributes (XWindowAttributes &attrib); XRectangle * queryShapeRectangles(int kind, int *count, int *ordering); private: Display *mDpy; const Window *mWindow; const Window *mFrame; }; class PrivateWindow : public compiz::window::SyncServerWindow, public compiz::window::AsyncServerWindow { public: PrivateWindow (); ~PrivateWindow (); bool queryAttributes (XWindowAttributes &attrib); bool queryFrameAttributes (XWindowAttributes &attrib); XRectangle * queryShapeRectangles (int kind, int *count, int *ordering); int requestConfigureOnClient (const XWindowChanges &xwc, unsigned int valueMask); int requestConfigureOnWrapper (const XWindowChanges &xwc, unsigned int valueMask); int requestConfigureOnFrame (const XWindowChanges &xwc, unsigned int valueMask); void sendSyntheticConfigureNotify (); bool hasCustomShape () const; void recalcNormalHints (); bool updateFrameWindow (); void setWindowMatrix (); bool restack (Window aboveId); bool initializeSyncCounter (); bool isGroupTransient (Window clientLeader); bool isInvisible() const; static bool stackLayerCheck (CompWindow *w, Window clientLeader, CompWindow *below, const ServerLock &lock); static bool avoidStackingRelativeTo (CompWindow *w, const ServerLock &lock); static CompWindow * findSiblingBelow (CompWindow *w, bool aboveFs, const ServerLock &lock); static CompWindow * findLowestSiblingBelow (CompWindow *w, const ServerLock &lock); static bool validSiblingBelow (CompWindow *w, CompWindow *sibling, const ServerLock &lock); void saveGeometry (int mask); int restoreGeometry (XWindowChanges *xwc, int mask); void reconfigureXWindow (unsigned int valueMask, XWindowChanges *xwc); static bool stackDocks (CompWindow *w, CompWindowList &updateList, XWindowChanges *xwc, unsigned int *mask, const ServerLock &lock); static bool stackTransients (CompWindow *w, CompWindow *avoid, XWindowChanges *xwc, CompWindowList &updateList, const ServerLock &lock); static void stackAncestors (CompWindow *w, XWindowChanges *xwc, CompWindowList &updateList, const ServerLock &lock); static bool isAncestorTo (CompWindow *transient, CompWindow *ancestor); Window getClientLeaderOfAncestor (); CompWindow * getModalTransient (); int addWindowSizeChanges (XWindowChanges *xwc, CompWindow::Geometry old); int addWindowStackChanges (XWindowChanges *xwc, CompWindow *sibling, const ServerLock &lock); static CompWindow * findValidStackSiblingBelow (CompWindow *w, CompWindow *sibling, const ServerLock &lock); void ensureWindowVisibility (); void reveal (); static void revealAncestors (CompWindow *w, CompWindow *transient); static void minimizeTransients (CompWindow *w, CompWindow *ancestor); static void unminimizeTransients (CompWindow *w, CompWindow *ancestor); bool getUsageTimestamp (Time& timestamp); bool isWindowFocusAllowed (Time timestamp); static void handleDamageRect (CompWindow *w, int x, int y, int width, int height); bool reparent (); void unreparent (); void manageFrameWindowSeparately (); void hide (); void show (); void withdraw (); bool handlePingTimeout (unsigned int lastPing); void handlePing (int lastPing); void applyStartupProperties (CompStartupSequence *s); void updateNormalHints (); void updateWmHints (); void updateClassHints (); void updateTransientHint (); void updateIconGeometry (); Window getClientLeader (); char * getStartupId (); CompRegion rectsToRegion (unsigned int, XRectangle *); void updateRegion (); bool handleSyncAlarm (); void move (int dx, int dy, bool sync); bool resize (int dx, int dy, int dwidth, int dheight, int dborder); bool resize (const CompWindow::Geometry &g); bool resize (const XWindowAttributes &attrib); void configure (XConfigureEvent *ce); void configureFrame (XConfigureEvent *ce); void circulate (XCirculateEvent *ce); unsigned int adjustConfigureRequestForGravity (XWindowChanges *xwc, unsigned int xwcm, int gravity, int direction); bool updateSize (); bool getUserTime (Time& time); void setUserTime (Time time); bool allowWindowFocus (unsigned int noFocusMask, Time timestamp); void freeIcons (); void updateMwmHints (); void updateStartupId (); void processMap (); void updatePassiveButtonGrabs (); void setFullscreenMonitors (CompFullscreenMonitorSet *monitors); static unsigned int windowTypeFromString (const char *str); static int compareWindowActiveness (CompWindow *w1, CompWindow *w2); void setOverrideRedirect (bool overrideRedirect); void readIconHint (); bool checkClear (); static CompWindow* createCompWindow (Window aboveId, Window aboveServerId, XWindowAttributes &wa, Window id); public: PrivateWindow *priv; CompWindow *window; int refcnt; Window serverId; Window id; Window serverFrame; Window frame; Window wrapper; unsigned int mapNum; unsigned int activeNum; /* Don't use this for determining * the window geometry because we * read into this out of sync with * ConfigureNotify events to determine * the class and override redirect state */ XWindowAttributes attrib; CompWindow::Geometry geometry; CompWindow::Geometry serverGeometry; CompWindow::Geometry frameGeometry; CompWindow::Geometry serverFrameGeometry; Window transientFor; Window clientLeader; XSizeHints sizeHints; XWMHints *hints; bool inputHint; bool alpha; CompRegion region; CompRegion inputRegion; CompRegion frameRegion; unsigned int wmType; unsigned int type; unsigned int state; unsigned int actions; unsigned int protocols; unsigned int mwmDecor; unsigned int mwmFunc; bool invisible; bool destroyed; bool managed; bool unmanaging; int destroyRefCnt; int unmapRefCnt; CompPoint initialViewport; Time initialTimestamp; bool initialTimestampSet; bool fullscreenMonitorsSet; CompRect fullscreenMonitorRect; bool placed; bool minimized; bool inShowDesktopMode; bool shaded; bool hidden; bool grabbed; bool alreadyDecorated; unsigned int desktop; int pendingUnmaps; int pendingMaps; typedef std::pair XWCValueMask; compiz::X11::PendingEventQueue pendingConfigures; bool receivedMapRequestAndAwaitingMap; char *startupId; char *resName; char *resClass; CompGroup *group; unsigned int lastPong; bool alive; bool moved; CompWindowExtents input; CompWindowExtents serverInput; CompWindowExtents lastServerInput; CompWindowExtents border; CompWindowExtents output; CompStruts *struts; std::vector icons; bool noIcons; CompRect iconGeometry; XWindowChanges saveWc; int saveMask; XSyncCounter syncCounter; XSyncValue syncValue; XSyncAlarm syncAlarm; CompTimer syncWaitTimer; bool syncWait; CompWindow::Geometry syncGeometry; int closeRequests; Time lastCloseRequestTime; bool nextMoveImmediate; X11SyncServerWindow syncServerWindow; compiz::window::configure_buffers::Buffer::Ptr configureBuffer; }; #endif compiz-0.9.11+14.04.20140409/src/icon.cpp0000644000015301777760000000306712321343002017723 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include CompIcon::CompIcon (unsigned int width, unsigned int height) : mSize (width, height), mData (new unsigned char[width * height * 4]) { } CompIcon::~CompIcon () { delete [] mData; } unsigned char* CompIcon::data () { return mData; } compiz-0.9.11+14.04.20140409/src/event.cpp0000644000015301777760000017274112321343002020122 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #define foreach BOOST_FOREACH #include #include #include #include #include #include #include #include "privatescreen.h" #include "privatewindow.h" #include "privatestackdebugger.h" #include "eventmanagement.h" namespace cps = compiz::private_screen; namespace ce = compiz::events; namespace { Window CompWindowToWindow (CompWindow *window) { return window ? window->id () : None; } } bool PrivateWindow::handleSyncAlarm () { if (priv->syncWait) { priv->syncWait = false; if (window->resize (priv->syncGeometry)) { window->windowNotify (CompWindowNotifySyncAlarm); } else { /* resizeWindow failing means that there is another pending resize and we must send a new sync request to the client */ window->sendSyncRequest (); } } return false; } static bool autoRaiseTimeout (CompScreen *screen) { CompWindow *w = screen->findWindow (screen->activeWindow ()); if (screen->autoRaiseWindow () == screen->activeWindow () || (w && (screen->autoRaiseWindow () == w->transientFor ()))) { w = screen->findWindow (screen->autoRaiseWindow ()); if (w) w->updateAttributes (CompStackingUpdateModeNormal); } return false; } #define REAL_MOD_MASK (ShiftMask | ControlMask | Mod1Mask | Mod2Mask | \ Mod3Mask | Mod4Mask | Mod5Mask | CompNoMask) static bool isCallBackBinding (CompAction &action, CompAction::BindingType type, CompAction::State state) { if (!(action.type () & type)) return false; if (!(action.state () & state)) return false; if (!action.active ()) return false; return true; } static bool isCallBackBinding (CompOption &option, CompAction::BindingType type, CompAction::State state) { if (!option.isAction ()) return false; return isCallBackBinding (option.value ().action (), type, state); } static bool isInitiateBinding (CompOption &option, CompAction::BindingType type, CompAction::State state, CompAction **action) { if (!isCallBackBinding (option, type, state)) return false; if (option.value ().action ().initiate ().empty ()) return false; *action = &option.value ().action (); return true; } static bool isBound (CompAction &action, CompAction::BindingType type, CompAction::State state) { return isCallBackBinding (action, type, state); } static bool isBound (CompOption &option, CompAction::BindingType type, CompAction::State state, CompAction **action) { if (!isCallBackBinding (option, type, state)) return false; *action = &option.value ().action (); return true; } bool cps::EventManager::triggerPress (CompAction *action, CompAction::State state, CompOption::Vector &arguments) { bool actionEventHandled = false; if (state == CompAction::StateInitKey && grabsEmpty ()) { possibleTap = action; } if (!action->initiate ().empty ()) { if (action->initiate () (action, state, arguments)) actionEventHandled = true; } else if (!action->terminate ().empty ()) { /* Default Initiate implementation for plugins that only provide a Terminate callback */ if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); } return actionEventHandled; } bool cps::EventManager::triggerRelease (CompAction *action, CompAction::State state, CompOption::Vector &arguments) { if (action == possibleTap) { state |= CompAction::StateTermTapped; possibleTap = NULL; } if (!action->terminate ().empty () && action->terminate () (action, state, arguments)) return true; return false; } int ce::processButtonPressOnEdgeWindow (Window edgeWindow, Window root, Window eventWindow, Window eventRoot, cps::GrabList &grabList, const CompScreenEdge *screenEdge) { int edge = -1; if (eventRoot != root) return edge; if (eventWindow != edgeWindow) { if (grabList.grabsEmpty () || eventRoot != root) return edge; } for (unsigned int i = 0; i < SCREEN_EDGE_NUM; i++) { if (edgeWindow == screenEdge[i].id) { edge = 1 << i; break; } } return edge; } void ce::setEventWindowInButtonPressArguments (ce::EventArguments &arguments, Window eventWindow) { arguments[1].value ().set ((int) eventWindow); } namespace { bool buttonActionModifiersMatchEventState (unsigned int actionModifiers, unsigned int eventState) { const unsigned int ignored = modHandler->ignoredModMask (); const unsigned int modMask = REAL_MOD_MASK & ~ignored; const unsigned int bindMods = modHandler->virtualToRealModMask (actionModifiers); return (bindMods & modMask) == (eventState & modMask); } } bool ce::activateButtonPressOnWindowBindingOption (CompOption &option, unsigned int eventButton, unsigned int eventState, cps::EventManager &eventManager, const ActionModsMatchesEventStateFunc &matchEventState, ce::EventArguments &arguments) { CompAction *action; const CompAction::State state = CompAction::StateInitButton; if (isBound (option, CompAction::BindingTypeButton, state, &action)) { if (action->button ().button () == (int) eventButton) { if (matchEventState (action->button ().modifiers (), eventState)) { if (eventManager.triggerPress (action, state, arguments)) return true; } } } return false; } bool ce::activateButtonPressOnEdgeBindingOption (CompOption &option, unsigned int eventButton, unsigned int eventState, int edge, cps::EventManager &eventManager, const ActionModsMatchesEventStateFunc &matchEventState, ce::EventArguments &arguments) { CompAction *action; const CompAction::State state = CompAction::StateInitButton | CompAction::StateInitEdge; if (edge != -1) { if (isInitiateBinding (option, CompAction::BindingTypeEdgeButton, state, &action)) { if ((action->button ().button () == (int) eventButton) && (action->edgeMask () & edge)) { if (matchEventState (action->button ().modifiers (), eventState)) if (action->initiate () (action, state, arguments)) return true; } } } return false; } bool PrivateScreen::triggerButtonPressBindings (CompOption::Vector &options, XButtonEvent *event, CompOption::Vector &arguments) { int edge = -1; static const ce::ActionModsMatchesEventStateFunc matchEventState ( boost::bind (buttonActionModifiersMatchEventState, _1, _2)); if (edgeWindow) edge = ce::processButtonPressOnEdgeWindow (edgeWindow, screen->root (), event->window, event->root, eventManager, screenEdge); if (edge != -1) ce::setEventWindowInButtonPressArguments (arguments, orphanData.activeWindow); foreach (CompOption &option, options) { if (ce::activateButtonPressOnWindowBindingOption (option, event->button, event->state, eventManager, matchEventState, arguments)) return true; if (ce::activateButtonPressOnEdgeBindingOption (option, event->button, event->state, edge, eventManager, matchEventState, arguments)) return true; } return false; } bool PrivateScreen::triggerButtonReleaseBindings (CompOption::Vector &options, XButtonEvent *event, CompOption::Vector &arguments) { CompAction::State state = CompAction::StateTermButton; CompAction::BindingType type = CompAction::BindingTypeButton | CompAction::BindingTypeEdgeButton; CompAction *action; foreach (CompOption &option, options) { if (isBound (option, type, state, &action)) { if (action->button ().button () == (int) event->button) { if (eventManager.triggerRelease (action, state, arguments)) return true; } } } return false; } bool PrivateScreen::shouldTriggerKeyPressAction (CompAction *action, XKeyEvent *event) { unsigned int modMask = REAL_MOD_MASK & ~modHandler->ignoredModMask (); unsigned int bindMods = modHandler->virtualToRealModMask (action->key ().modifiers ()); int bindCode = action->key ().keycode (); unsigned int bindCodeMod = bindCode ? modHandler->keycodeToModifiers (bindCode) : 0; unsigned int eventMods = event->state & modMask; if (bindCode == (int) event->keycode) return (bindMods & modMask) == eventMods; else if (!xkbEvent.get() && bindCode == 0) return bindMods == eventMods; else if (bindCodeMod != 0) { for (int mod = 0; mod < 8; mod++) { int mask = 1 << mod; if ((bindMods & mask) == 0) continue; for (int k = mod * modHandler->modMap ()->max_keypermod; k < (mod + 1) * modHandler->modMap ()->max_keypermod; k++) { if (modHandler->modMap ()->modifiermap[k] == event->keycode) { if ((((bindMods & ~mask) | bindCodeMod) & modMask) == eventMods) return true; break; } } } } return false; } bool PrivateScreen::triggerKeyPressBindings (CompOption::Vector &options, CompAction::Vector &actions, XKeyEvent *event, CompOption::Vector &arguments) { CompAction::State state = 0; if (event->keycode == escapeKeyCode) state = CompAction::StateCancel; else if (event->keycode == returnKeyCode) state = CompAction::StateCommit; if (state) { foreach (CompOption &o, options) { if (o.isAction ()) { if (!o.value ().action ().terminate ().empty ()) o.value ().action ().terminate () (&o.value ().action (), state, noOptions ()); } } foreach (CompAction &a, actions) { if (!a.terminate ().empty ()) a.terminate () (&a, state, noOptions ()); } if (state == CompAction::StateCancel) return false; } state = CompAction::StateInitKey; foreach (CompOption &option, options) { CompAction *action; if (isBound (option, CompAction::BindingTypeKey, state, &action) && shouldTriggerKeyPressAction (action, event) && eventManager.triggerPress (action, state, arguments)) return true; } foreach (CompAction &action, actions) { if (isBound (action, CompAction::BindingTypeKey, state) && shouldTriggerKeyPressAction (&action, event) && eventManager.triggerPress (&action, state, arguments)) return true; } return false; } bool PrivateScreen::shouldTriggerKeyReleaseAction (CompAction *action, XKeyEvent *event) { unsigned int modMask = REAL_MOD_MASK & ~modHandler->ignoredModMask (); unsigned int bindMods = modHandler->virtualToRealModMask (action->key ().modifiers ()); if ((bindMods & modMask) == 0) return (unsigned int) action->key ().keycode () == event->keycode; unsigned int mods = modHandler->keycodeToModifiers (event->keycode); return !xkbEvent.get() && ((mods & modMask & bindMods) != bindMods); } bool PrivateScreen::triggerKeyReleaseBindings (CompOption::Vector &options, CompAction::Vector &actions, XKeyEvent *event, CompOption::Vector &arguments) { CompAction::State state = CompAction::StateTermKey; if (!xkbEvent.get() && !modHandler->keycodeToModifiers (event->keycode)) return false; bool handled = false; foreach (CompOption &option, options) { CompAction *action; if (isBound (option, CompAction::BindingTypeKey, state, &action) && shouldTriggerKeyReleaseAction (action, event)) handled |= eventManager.triggerRelease (action, state, arguments); } foreach (CompAction &action, actions) { if (isBound (action, CompAction::BindingTypeKey, state) && shouldTriggerKeyReleaseAction (&action, event)) handled |= eventManager.triggerRelease (&action, state, arguments); } return handled; } bool PrivateScreen::shouldTriggerModifierPressAction (CompAction *action, XkbStateNotifyEvent *event) { if (action->key ().keycode ()) return false; unsigned int modMask = REAL_MOD_MASK & ~modHandler->ignoredModMask (); unsigned int bindMods = modHandler->virtualToRealModMask (action->key ().modifiers ()); unsigned int eventMods = event->mods & modMask; return eventMods == bindMods; } bool PrivateScreen::shouldTriggerModifierReleaseAction (CompAction *action, XkbStateNotifyEvent *event) { unsigned int modMask = REAL_MOD_MASK & ~modHandler->ignoredModMask (); unsigned int bindMods = modHandler->virtualToRealModMask (action->key ().modifiers ()); if (event->mods && ((event->mods & modMask) != bindMods)) return true; unsigned int eventCodeMod = modHandler->keycodeToModifiers (event->keycode); if (!event->mods && (eventCodeMod == bindMods)) return true; int bindCode = action->key ().keycode (); unsigned int bindCodeMod = bindCode ? modHandler->keycodeToModifiers (bindCode) : 0; return bindCodeMod && event->keycode == bindCode && ((bindMods | bindCodeMod) == ((event->mods & modMask) | eventCodeMod)); } bool PrivateScreen::triggerStateNotifyBindings (CompOption::Vector &options, CompAction::Vector &actions, XkbStateNotifyEvent *event, CompOption::Vector &arguments) { CompAction::State state; if (event->event_type == KeyPress) { state = CompAction::StateInitKey; foreach (CompOption &option, options) { CompAction *action; if (isBound (option, CompAction::BindingTypeKey, state, &action) && shouldTriggerModifierPressAction (action, event) && eventManager.triggerPress (action, state, arguments)) return true; } foreach (CompAction &action, actions) { if (isBound (action, CompAction::BindingTypeKey, state) && shouldTriggerModifierPressAction (&action, event) && eventManager.triggerPress (&action, state, arguments)) return true; } } else if (event->event_type == KeyRelease) { state = CompAction::StateTermKey; bool handled = false; foreach (CompOption &option, options) { CompAction *action; if (isBound (option, CompAction::BindingTypeKey, state, &action) && shouldTriggerModifierReleaseAction (action, event)) handled |= eventManager.triggerRelease (action, state, arguments); } foreach (CompAction &action, actions) { if (isBound (action, CompAction::BindingTypeKey, state) && shouldTriggerModifierReleaseAction (&action, event)) handled |= eventManager.triggerRelease (&action, state, arguments); } if (handled) return true; } return false; } static bool isBellAction (CompOption &option, CompAction::State state, CompAction **action) { if (option.type () != CompOption::TypeAction && option.type () != CompOption::TypeBell) return false; if (!option.value ().action ().bell ()) return false; if (!(option.value ().action ().state () & state)) return false; if (option.value ().action ().initiate ().empty ()) return false; *action = &option.value ().action (); return true; } static bool triggerBellNotifyBindings (CompOption::Vector &options, CompOption::Vector &arguments) { CompAction::State state = CompAction::StateInitBell; CompAction *action; foreach (CompOption &option, options) { if (isBellAction (option, state, &action)) { if (action->initiate () (action, state, arguments)) return true; } } return false; } static bool isEdgeAction (CompOption &option, CompAction::State state, unsigned int edge) { if (option.type () != CompOption::TypeAction && option.type () != CompOption::TypeButton && option.type () != CompOption::TypeEdge) return false; if (!(option.value ().action ().edgeMask () & edge)) return false; if (!(option.value ().action ().state () & state)) return false; return true; } static bool isEdgeEnterAction (CompOption &option, CompAction::State state, CompAction::State delayState, unsigned int edge, CompAction **action) { if (!isEdgeAction (option, state, edge)) return false; if (option.value ().action ().type () & CompAction::BindingTypeEdgeButton) return false; if (option.value ().action ().initiate ().empty ()) return false; if (delayState) { if ((option.value ().action ().state () & CompAction::StateNoEdgeDelay) != (delayState & CompAction::StateNoEdgeDelay)) { /* ignore edge actions which shouldn't be delayed when invoking undelayed edges (or vice versa) */ return false; } } *action = &option.value ().action (); return true; } static bool isEdgeLeaveAction (CompOption &option, CompAction::State state, unsigned int edge, CompAction **action) { if (!isEdgeAction (option, state, edge)) return false; if (option.value ().action ().terminate ().empty ()) return false; *action = &option.value ().action (); return true; } static bool triggerEdgeEnterBindings (CompOption::Vector &options, CompAction::State state, CompAction::State delayState, unsigned int edge, CompOption::Vector &arguments) { CompAction *action; foreach (CompOption &option, options) { if (isEdgeEnterAction (option, state, delayState, edge, &action)) { if (action->initiate () (action, state, arguments)) return true; } } return false; } static bool triggerEdgeLeaveBindings (CompOption::Vector &options, CompAction::State state, unsigned int edge, CompOption::Vector &arguments) { CompAction *action; foreach (CompOption &option, options) { if (isEdgeLeaveAction (option, state, edge, &action)) { if (action->terminate () (action, state, arguments)) return true; } } return false; } static bool triggerAllEdgeEnterBindings (CompAction::State state, CompAction::State delayState, unsigned int edge, CompOption::Vector &arguments) { foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); if (triggerEdgeEnterBindings (options, state, delayState, edge, arguments)) { return true; } } return false; } static bool delayedEdgeTimeout (CompDelayedEdgeSettings *settings) { triggerAllEdgeEnterBindings (settings->state, ~CompAction::StateNoEdgeDelay, settings->edge, settings->options); return false; } bool PrivateScreen::triggerEdgeEnter (unsigned int edge, CompAction::State state, CompOption::Vector &arguments) { int delay; delay = optionGetEdgeDelay (); if (delay > 0) { CompAction::State delayState; edgeDelaySettings.edge = edge; edgeDelaySettings.state = state; edgeDelaySettings.options = arguments; edgeDelayTimer.start ( boost::bind (delayedEdgeTimeout, &edgeDelaySettings), delay, (unsigned int) ((float) delay * 1.2)); delayState = CompAction::StateNoEdgeDelay; if (triggerAllEdgeEnterBindings (state, delayState, edge, arguments)) return true; } else { if (triggerAllEdgeEnterBindings (state, 0, edge, arguments)) return true; } return false; } bool PrivateScreen::handleActionEvent (XEvent *event) { static CompOption::Vector o; Window xid; if (o.empty ()) { o.resize (8); o[0].setName ("event_window", CompOption::TypeInt); o[1].setName ("window", CompOption::TypeInt); o[2].setName ("modifiers", CompOption::TypeInt); o[3].setName ("x", CompOption::TypeInt); o[4].setName ("y", CompOption::TypeInt); o[5].setName ("root", CompOption::TypeInt); } else { o[6].reset (); o[7].reset (); } switch (event->type) { case ButtonPress: /* We need to determine if we clicked on a parent frame * window, if so, pass the appropriate child window as * "window" and the frame as "event_window" */ xid = event->xbutton.window; foreach (CompWindow *w, screen->windows ()) { if (w->priv->frame == xid) xid = w->id (); } o[0].value ().set ((int) event->xbutton.window); o[1].value ().set ((int) xid); o[2].value ().set ((int) event->xbutton.state); o[3].value ().set ((int) event->xbutton.x_root); o[4].value ().set ((int) event->xbutton.y_root); o[5].value ().set ((int) event->xbutton.root); o[6].setName ("button", CompOption::TypeInt); o[7].setName ("time", CompOption::TypeInt); o[6].value ().set ((int) event->xbutton.button); o[7].value ().set ((int) event->xbutton.time); eventManager.resetPossibleTap(); foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); if (triggerButtonPressBindings (options, &event->xbutton, o)) return true; } break; case ButtonRelease: o[0].value ().set ((int) event->xbutton.window); o[1].value ().set ((int) event->xbutton.window); o[2].value ().set ((int) event->xbutton.state); o[3].value ().set ((int) event->xbutton.x_root); o[4].value ().set ((int) event->xbutton.y_root); o[5].value ().set ((int) event->xbutton.root); o[6].setName ("button", CompOption::TypeInt); o[7].setName ("time", CompOption::TypeInt); o[6].value ().set ((int) event->xbutton.button); o[7].value ().set ((int) event->xbutton.time); foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); if (triggerButtonReleaseBindings (options, &event->xbutton, o)) return true; } break; case KeyPress: o[0].value ().set ((int) event->xkey.window); o[1].value ().set ((int) orphanData.activeWindow); o[2].value ().set ((int) event->xkey.state); o[3].value ().set ((int) event->xkey.x_root); o[4].value ().set ((int) event->xkey.y_root); o[5].value ().set ((int) event->xkey.root); o[6].setName ("keycode", CompOption::TypeInt); o[7].setName ("time", CompOption::TypeInt); o[6].value ().set ((int) event->xkey.keycode); o[7].value ().set ((int) event->xkey.time); eventManager.resetPossibleTap(); foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); CompAction::Vector &actions = p->vTable->getActions (); if (triggerKeyPressBindings (options, actions, &event->xkey, o)) return true; } break; case KeyRelease: { o[0].value ().set ((int) event->xkey.window); o[1].value ().set ((int) orphanData.activeWindow); o[2].value ().set ((int) event->xkey.state); o[3].value ().set ((int) event->xkey.x_root); o[4].value ().set ((int) event->xkey.y_root); o[5].value ().set ((int) event->xkey.root); o[6].setName ("keycode", CompOption::TypeInt); o[7].setName ("time", CompOption::TypeInt); o[6].value ().set ((int) event->xkey.keycode); o[7].value ().set ((int) event->xkey.time); bool handled = false; foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); CompAction::Vector &actions = p->vTable->getActions (); handled |= triggerKeyReleaseBindings (options, actions, &event->xkey, o); } if (handled) return true; break; } case EnterNotify: if (event->xcrossing.mode != NotifyGrab && event->xcrossing.mode != NotifyUngrab && event->xcrossing.detail != NotifyInferior) { unsigned int edge, i; CompAction::State state; if (event->xcrossing.root != rootWindow()) return false; if (edgeDelayTimer.active ()) edgeDelayTimer.stop (); if (edgeWindow && edgeWindow != event->xcrossing.window) { state = CompAction::StateTermEdge; edge = 0; for (i = 0; i < SCREEN_EDGE_NUM; i++) { if (edgeWindow == screenEdge[i].id) { edge = 1 << i; break; } } edgeWindow = None; o[0].value ().set ((int) event->xcrossing.window); o[1].value ().set ((int) orphanData.activeWindow); o[2].value ().set ((int) event->xcrossing.state); o[3].value ().set ((int) event->xcrossing.x_root); o[4].value ().set ((int) event->xcrossing.y_root); o[5].value ().set ((int) event->xcrossing.root); o[6].setName ("time", CompOption::TypeInt); o[6].value ().set ((int) event->xcrossing.time); foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); if (triggerEdgeLeaveBindings (options, state, edge, o)) return true; } } edge = 0; for (i = 0; i < SCREEN_EDGE_NUM; i++) { if (event->xcrossing.window == screenEdge[i].id) { edge = 1 << i; break; } } if (edge) { state = CompAction::StateInitEdge; edgeWindow = event->xcrossing.window; o[0].value ().set ((int) event->xcrossing.window); o[1].value ().set ((int) orphanData.activeWindow); o[2].value ().set ((int) event->xcrossing.state); o[3].value ().set ((int) event->xcrossing.x_root); o[4].value ().set ((int) event->xcrossing.y_root); o[5].value ().set ((int) event->xcrossing.root); o[6].setName ("time", CompOption::TypeInt); o[6].value ().set ((int) event->xcrossing.time); if (triggerEdgeEnter (edge, state, o)) return true; } } break; case ClientMessage: if (event->xclient.message_type == Atoms::xdndEnter) { xdndWindow = event->xclient.window; } else if (event->xclient.message_type == Atoms::xdndLeave) { unsigned int edge = 0; CompAction::State state; if (!xdndWindow) { CompWindow *w; w = screen->findWindow (event->xclient.window); if (w) { for (unsigned int i = 0; i < SCREEN_EDGE_NUM; i++) { if (event->xclient.window == screenEdge[i].id) { edge = 1 << i; break; } } } } if (edge) { state = CompAction::StateTermEdgeDnd; o[0].value ().set ((int) event->xclient.window); o[1].value ().set ((int) orphanData.activeWindow); o[2].value ().set ((int) 0); /* fixme */ o[3].value ().set ((int) 0); /* fixme */ o[4].value ().set ((int) 0); /* fixme */ o[5].value ().set ((int) rootWindow()); foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); if (triggerEdgeLeaveBindings (options, state, edge, o)) return true; } } } else if (event->xclient.message_type == Atoms::xdndPosition) { unsigned int edge = 0; CompAction::State state; if (xdndWindow == event->xclient.window) { CompWindow *w; w = screen->findWindow (event->xclient.window); if (w) { for (unsigned int i = 0; i < SCREEN_EDGE_NUM; i++) { if (xdndWindow == screenEdge[i].id) { edge = 1 << i; break; } } } } if (edge) { state = CompAction::StateInitEdgeDnd; o[0].value ().set ((int) event->xclient.window); o[1].value ().set ((int) orphanData.activeWindow); o[2].value ().set ((int) 0); /* fixme */ o[3].value ().set ((int) event->xclient.data.l[2] >> 16); o[4].value ().set ((int) event->xclient.data.l[2] & 0xffff); o[5].value ().set ((int) rootWindow()); if (triggerEdgeEnter (edge, state, o)) return true; } xdndWindow = None; } break; default: if (event->type == xkbEvent.get()) { XkbAnyEvent *xkbEvent = (XkbAnyEvent *) event; static CompOption::Vector arg; if (arg.empty ()) { arg.resize (8); arg[0].setName ("event_window", CompOption::TypeInt); arg[1].setName ("window", CompOption::TypeInt); } if (xkbEvent->xkb_type == XkbStateNotify) { XkbStateNotifyEvent *stateEvent = (XkbStateNotifyEvent *) event; arg[0].value ().set ((int) orphanData.activeWindow); arg[1].value ().set ((int) orphanData.activeWindow); arg[2].setName ("modifiers", CompOption::TypeInt); arg[2].value ().set ((int) stateEvent->mods); arg[3].setName ("time", CompOption::TypeInt); arg[3].value ().set ((int) xkbEvent->time); arg[7].value ().set ((int) xkbEvent->time); bool handled = false; foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); CompAction::Vector &actions = p->vTable->getActions (); handled |= triggerStateNotifyBindings (options, actions, stateEvent, arg); } if (handled) return true; } else if (xkbEvent->xkb_type == XkbBellNotify) { arg[0].value ().set ((int) orphanData.activeWindow); arg[1].value ().set ((int) orphanData.activeWindow); arg[2].setName ("time", CompOption::TypeInt); arg[2].value ().set ((int) xkbEvent->time); arg[3].reset (); arg[7].reset (); foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); if (triggerBellNotifyBindings (options, arg)) return true; } } } break; } return false; } void PrivateScreen::setDefaultWindowAttributes (XWindowAttributes *wa) { wa->x = 0; wa->y = 0; wa->width = 1; wa->height = 1; wa->border_width = 0; wa->depth = 0; wa->visual = NULL; wa->root = rootWindow(); wa->c_class = InputOnly; wa->bit_gravity = NorthWestGravity; wa->win_gravity = NorthWestGravity; wa->backing_store = NotUseful; wa->backing_planes = 0; wa->backing_pixel = 0; wa->save_under = false; wa->colormap = None; wa->map_installed = false; wa->map_state = IsUnviewable; wa->all_event_masks = 0; wa->your_event_mask = 0; wa->do_not_propagate_mask = 0; wa->override_redirect = true; wa->screen = ScreenOfDisplay (dpy, screenNum); } void CompScreen::handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options) { WRAPABLE_HND_FUNCTN (handleCompizEvent, plugin, event, options); _handleCompizEvent (plugin, event, options); } void CompScreenImpl::_handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options) { } void CompScreen::handleEvent (XEvent *event) { WRAPABLE_HND_FUNCTN (handleEvent, event) _handleEvent (event); } void CompScreenImpl::alwaysHandleEvent (XEvent *event) { /* * Critical event handling that cannot be overridden by plugins */ if (event->type == ButtonPress || event->type == KeyPress) privateScreen.eventManager.resetPossibleTap(); eventHandled = true; // if we return inside WRAPABLE_HND_FUNCTN handleEvent (event); bool keyEvent = (event->type == KeyPress || event->type == KeyRelease); /* Always either replay the keyboard or consume the key * event on keypresses */ if (keyEvent) { int mode = eventHandled ? AsyncKeyboard : ReplayKeyboard; XAllowEvents (privateScreen.dpy, mode, event->xkey.time); } if (privateScreen.eventManager.grabsEmpty () && event->type == KeyPress) { XUngrabKeyboard (privateScreen.dpy, event->xkey.time); } } ServerGrabInterface * CompScreenImpl::serverGrabInterface () { return static_cast (this); } void CompScreenImpl::grabServer () { XGrabServer (privateScreen.dpy); } void CompScreenImpl::syncServer () { XSync (privateScreen.dpy, false); } void CompScreenImpl::ungrabServer () { XUngrabServer (privateScreen.dpy); } void CompScreenImpl::_handleEvent (XEvent *event) { /* * Non-critical event handling that might be overridden by plugins */ CompWindow *w = NULL; XWindowAttributes wa; switch (event->type) { case ButtonPress: if (event->xbutton.root == privateScreen.rootWindow()) privateScreen.outputDevices.setCurrentOutput ( outputDeviceForPoint (event->xbutton.x_root, event->xbutton.y_root)); break; case MotionNotify: if (event->xmotion.root == privateScreen.rootWindow()) privateScreen.outputDevices.setCurrentOutput ( outputDeviceForPoint (event->xmotion.x_root, event->xmotion.y_root)); break; case KeyPress: w = findWindow (privateScreen.orphanData.activeWindow); if (w) privateScreen.outputDevices.setCurrentOutput (w->outputDevice ()); break; default: break; } eventHandled = privateScreen.handleActionEvent (event); if (eventHandled) { if (privateScreen.eventManager.grabsEmpty ()) XAllowEvents (privateScreen.dpy, AsyncPointer, event->xbutton.time); return; } switch (event->type) { case SelectionRequest: privateScreen.handleSelectionRequest (event); break; case SelectionClear: privateScreen.handleSelectionClear (event); break; case ConfigureNotify: w = findWindow (event->xconfigure.window); if (w && !w->priv->frame) { w->priv->configure (&event->xconfigure); } else { w = findTopLevelWindow (event->xconfigure.window); if (w && w->priv->frame == event->xconfigure.window) w->priv->configureFrame (&event->xconfigure); else { if (event->xconfigure.window == privateScreen.rootWindow()) privateScreen.configure (&event->xconfigure); } } break; case CreateNotify: { bool create = true; /* Failure means that window has been destroyed. We still have to add * the window to the window list as we might get configure requests * which require us to stack other windows relative to it. Setting * some default values if this is the case. */ if (!XGetWindowAttributes (privateScreen.dpy, event->xcreatewindow.window, &wa)) { privateScreen.setDefaultWindowAttributes (&wa); /* That being said, we should store as much information as possible * about it. There may be requests relative to this window that could * use the data in the XCreateWindowEvent structure, especially the * override redirect state */ wa.x = event->xcreatewindow.x; wa.y = event->xcreatewindow.y; wa.width = event->xcreatewindow.width; wa.height = event->xcreatewindow.height; wa.border_width = event->xcreatewindow.border_width; wa.override_redirect = event->xcreatewindow.override_redirect; } foreach (CompWindow *w, screen->windows ()) { if (w->priv->serverFrame == event->xcreatewindow.window) { w->priv->frame = event->xcreatewindow.window; w->priv->updatePassiveButtonGrabs (); create = false; } } foreach (CompWindow *w, destroyedWindows()) { if (w->priv->serverId == event->xcreatewindow.window) { /* Previously destroyed window * plugins were keeping around * in order to avoid an xid conflict, * destroy it right away and manage * the new window */ StackDebugger *dbg = StackDebugger::Default (); while (w->priv->destroyRefCnt) w->destroy (); if (dbg) dbg->removeDestroyedFrame (event->xcreatewindow.window); } } if (wa.root != event->xcreatewindow.parent) create = false; if (create) { /* Track the window if it was created on this * screen, otherwise we still need to register * for FocusChangeMask. Also, we don't want to * manage it straight away - in reality we want * that to wait until the map request */ if (wa.root == privateScreen.rootWindow()) { Window top = CompWindowToWindow (getTopWindow ()); Window topServer = CompWindowToWindow (getTopServerWindow ()); PrivateWindow::createCompWindow (top, topServer, wa, event->xcreatewindow.window); } else XSelectInput (privateScreen.dpy, event->xcreatewindow.window, FocusChangeMask); } else compLogMessage ("core", CompLogLevelDebug, "refusing to manage window 0x%x", (unsigned int) event->xcreatewindow.window); break; } case DestroyNotify: w = findWindow (event->xdestroywindow.window); /* It is possible that some plugin might call * w->destroy () before the window actually receives * its first DestroyNotify event which would mean * that it is already in the list of destroyed * windows, so check that list too */ if (!w) { foreach (CompWindow *dw, destroyedWindows()) { if (dw->priv->serverId == event->xdestroywindow.window) { w = dw; break; } } } if (w) { w->moveInputFocusToOtherWindow (); w->destroy (); } break; case MapNotify: /* Search in already-created windows for this window */ if (!w) w = findWindow (event->xmap.window); if (w) { if (w->priv->pendingMaps) { /* The only case where this happens * is where the window unmaps itself * but doesn't get destroyed so when * it re-maps we need to reparent it */ if (!w->priv->serverFrame) w->priv->reparent (); w->priv->managed = true; } /* been shaded */ if (w->shaded ()) { if (w->id () == privateScreen.orphanData.activeWindow) w->moveInputFocusTo (); } w->map (); } break; case UnmapNotify: w = findWindow (event->xunmap.window); if (w) { /* Normal -> Iconic */ if (w->pendingUnmaps ()) { setWmState (IconicState, w->id ()); w->priv->pendingUnmaps--; } else /* X -> Withdrawn */ { /* Iconic -> Withdrawn: * * The window is already unmapped so we need to check the * synthetic UnmapNotify that comes and withdraw the window here */ if (w->state () & CompWindowStateHiddenMask) { w->priv->minimized = false; w->changeState (w->state () & ~CompWindowStateHiddenMask); privateScreen.updateClientList (); w->priv->withdraw (); } /* Closing: * * ICCCM Section 4.1.4 says that clients need to send * a synthetic UnmapNotify for every real unmap * in order to reflect the change in state, but * since we already withdraw the window on the real * UnmapNotify, no need to do it again on the synthetic * one. */ else if (!event->xunmap.send_event) { w->windowNotify (CompWindowNotifyClose); w->priv->withdraw (); } } if (!event->xunmap.send_event) { w->unmap (); if (!w->shaded () && !w->priv->pendingMaps) w->moveInputFocusToOtherWindow (); } } break; case ReparentNotify: w = findWindow (event->xreparent.window); /* If this window isn't part of our tracked window * list and was reparented into the root window then * we need to track it */ if (!w) { if (event->xreparent.parent == privateScreen.rootWindow()) { /* Failure means that window has been destroyed. We still have to add * the window to the window list as we might get configure requests * which require us to stack other windows relative to it. Setting * some default values if this is the case. */ if (!XGetWindowAttributes (privateScreen.dpy, event->xcreatewindow.window, &wa)) { privateScreen.setDefaultWindowAttributes (&wa); /* That being said, we should store as much information as possible * about it. There may be requests relative to this window that could * use the data in the XCreateWindowEvent structure, especially the * override redirect state */ wa.x = event->xreparent.x; wa.y = event->xreparent.y; wa.override_redirect = event->xreparent.override_redirect; } PrivateWindow::createCompWindow (getTopWindow ()->id (), getTopServerWindow ()->id (), wa, event->xreparent.window); break; } else { /* It is possible that some plugin might call * w->destroy () before the window actually receives * its first ReparentNotify event which would mean * that it is already in the list of destroyed * windows, so check that list too */ foreach (CompWindow *dw, destroyedWindows()) { if (dw->priv->serverId == event->xreparent.window) { w = dw; break; } } } } /* This is the only case where a window is removed but not destroyed. We must remove our event mask and all passive grabs. */ if (w) { if ((w->priv->wrapper && event->xreparent.parent != w->priv->wrapper) || (!w->priv->wrapper && event->xreparent.parent != privateScreen.rootWindow ())) { w->moveInputFocusToOtherWindow (); w->destroy (); XSelectInput (privateScreen.dpy, w->id (), NoEventMask); XShapeSelectInput (privateScreen.dpy, w->id (), NoEventMask); XUngrabButton (privateScreen.dpy, AnyButton, AnyModifier, w->id ()); } } break; case CirculateNotify: w = findWindow (event->xcirculate.window); if (w) w->priv->circulate (&event->xcirculate); break; case ButtonPress: if (event->xbutton.button == Button1 || event->xbutton.button == Button2 || event->xbutton.button == Button3) { w = findTopLevelWindow (event->xbutton.window); if (w) { if (privateScreen.optionGetRaiseOnClick ()) { w->updateAttributes (CompStackingUpdateModeAboveFullscreen); } if (w->id () != privateScreen.orphanData.activeWindow) if (!(w->type () & CompWindowTypeDockMask)) if (w->focus ()) w->moveInputFocusTo (); } } if (privateScreen.eventManager.grabsEmpty ()) XAllowEvents (privateScreen.dpy, ReplayPointer, event->xbutton.time); break; case PropertyNotify: if (event->xproperty.atom == Atoms::winType) { w = findWindow (event->xproperty.window); if (w) { unsigned int type; type = getWindowType (w->id ()); if (type != w->wmType ()) { if (w->isViewable ()) { if (w->type () == CompWindowTypeDesktopMask) decrementDesktopWindowCount(); else if (type == CompWindowTypeDesktopMask) incrementDesktopWindowCount(); } w->wmType () = type; w->recalcType (); w->recalcActions (); if (type & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) w->setDesktop (0xffffffff); privateScreen.updateClientList (); matchPropertyChanged (w); } } } else if (event->xproperty.atom == Atoms::winState) { w = findWindow (event->xproperty.window); if (w && !w->managed ()) { unsigned int state; state = getWindowState (w->id ()); state = CompWindow::constrainWindowState (state, w->actions ()); /* EWMH suggests that we ignore changes to _NET_WM_STATE_HIDDEN */ if (w->state () & CompWindowStateHiddenMask) state |= CompWindowStateHiddenMask; else state &= ~CompWindowStateHiddenMask; w->changeState (state); } } else if (event->xproperty.atom == XA_WM_NORMAL_HINTS) { w = findWindow (event->xproperty.window); if (w) { w->priv->updateNormalHints (); w->recalcActions (); } } else if (event->xproperty.atom == XA_WM_HINTS) { w = findWindow (event->xproperty.window); if (w) w->priv->updateWmHints (); } else if (event->xproperty.atom == XA_WM_TRANSIENT_FOR) { w = findWindow (event->xproperty.window); if (w) { w->priv->updateTransientHint (); w->recalcActions (); } } else if (event->xproperty.atom == Atoms::wmClientLeader) { w = findWindow (event->xproperty.window); if (w) w->priv->clientLeader = w->priv->getClientLeader (); } else if (event->xproperty.atom == Atoms::wmIconGeometry) { w = findWindow (event->xproperty.window); if (w) w->priv->updateIconGeometry (); } else if (event->xproperty.atom == Atoms::wmStrut || event->xproperty.atom == Atoms::wmStrutPartial) { w = findWindow (event->xproperty.window); if (w) { if (w->updateStruts ()) updateWorkarea (); } } else if (event->xproperty.atom == Atoms::mwmHints) { w = findWindow (event->xproperty.window); if (w) w->priv->updateMwmHints (); } else if (event->xproperty.atom == Atoms::wmProtocols) { w = findWindow (event->xproperty.window); if (w) w->priv->protocols = getProtocols (w->id ()); } else if (event->xproperty.atom == Atoms::wmIcon) { w = findWindow (event->xproperty.window); if (w) w->priv->freeIcons (); } else if (event->xproperty.atom == Atoms::startupId) { w = findWindow (event->xproperty.window); if (w) w->priv->updateStartupId (); } else if (event->xproperty.atom == XA_WM_CLASS) { w = findWindow (event->xproperty.window); if (w) w->priv->updateClassHints (); } break; case MotionNotify: break; case ClientMessage: if (event->xclient.message_type == Atoms::winActive) { w = findTopLevelWindow (event->xclient.window); if (w) { /* use focus stealing prevention if request came from an application */ if (event->xclient.data.l[0] != ClientTypeApplication || w->priv->allowWindowFocus (0, event->xclient.data.l[1])) { w->activate (); } } } else if (event->xclient.message_type == Atoms::winState) { w = findWindow (event->xclient.window); if (w) { unsigned long wState, state; wState = w->state (); for (int i = 1; i < 3; i++) { state = cps::windowStateMask (event->xclient.data.l[i]); if (state & ~CompWindowStateHiddenMask) { static const unsigned short _NET_WM_STATE_REMOVE = 0; static const unsigned short _NET_WM_STATE_ADD = 1; static const unsigned short _NET_WM_STATE_TOGGLE = 2; switch (event->xclient.data.l[0]) { case _NET_WM_STATE_REMOVE: wState &= ~state; break; case _NET_WM_STATE_ADD: wState |= state; break; case _NET_WM_STATE_TOGGLE: wState ^= state; break; } } } wState = CompWindow::constrainWindowState (wState, w->actions ()); if (w->id () == privateScreen.orphanData.activeWindow) wState &= ~CompWindowStateDemandsAttentionMask; if (wState != w->state ()) { CompStackingUpdateMode stackingUpdateMode; unsigned long dState = wState ^ w->state (); stackingUpdateMode = CompStackingUpdateModeNone; /* raise the window whenever its fullscreen state, above/below state or maximization state changed */ if (dState & (CompWindowStateFullscreenMask | CompWindowStateAboveMask | CompWindowStateBelowMask | CompWindowStateMaximizedHorzMask | CompWindowStateMaximizedVertMask)) stackingUpdateMode = CompStackingUpdateModeNormal; w->changeState (wState); w->updateAttributes (stackingUpdateMode); } } } else if (event->xclient.message_type == Atoms::wmProtocols) { if ((unsigned long) event->xclient.data.l[0] == Atoms::wmPing) { w = findWindow (event->xclient.data.l[2]); if (w) w->priv->handlePing (lastPing ()); } } else if (event->xclient.message_type == Atoms::closeWindow) { w = findWindow (event->xclient.window); if (w) w->close (event->xclient.data.l[0]); } else if (event->xclient.message_type == Atoms::desktopGeometry) { if (event->xclient.window == privateScreen.rootWindow()) { CompOption::Value value; value.set ((int) (event->xclient.data.l[0] / width ())); setOptionForPlugin ("core", "hsize", value); value.set ((int) (event->xclient.data.l[1] / height ())); setOptionForPlugin ("core", "vsize", value); } } else if (event->xclient.message_type == Atoms::moveResizeWindow) { w = findWindow (event->xclient.window); if (w) { unsigned int xwcm = 0; XWindowChanges xwc; int gravity; int value_mask; unsigned int source; gravity = (event->xclient.data.l[0] & 0xFF); value_mask = (event->xclient.data.l[0] & 0xF00) >> 8; source = (event->xclient.data.l[0] & 0xF000) >> 12; memset (&xwc, 0, sizeof (xwc)); if (value_mask & CWX) { xwcm |= CWX; xwc.x = event->xclient.data.l[1]; } if (value_mask & CWY) { xwcm |= CWY; xwc.y = event->xclient.data.l[2]; } if (value_mask & CWWidth) { xwcm |= CWWidth; xwc.width = event->xclient.data.l[3]; } if (value_mask & CWHeight) { xwcm |= CWHeight; xwc.height = event->xclient.data.l[4]; } w->moveResize (&xwc, xwcm, gravity, source); } } else if (event->xclient.message_type == Atoms::restackWindow) { w = findWindow (event->xclient.window); if (w) { /* TODO: other stack modes than Above and Below */ if (event->xclient.data.l[1]) { CompWindow *sibling; sibling = findWindow (event->xclient.data.l[1]); if (sibling) { if (event->xclient.data.l[2] == Above) w->restackAbove (sibling); else if (event->xclient.data.l[2] == Below) w->restackBelow (sibling); } } else { if (event->xclient.data.l[2] == Above) w->raise (); else if (event->xclient.data.l[2] == Below) w->lower (); } } } else if (event->xclient.message_type == Atoms::wmChangeState) { w = findWindow (event->xclient.window); if (w) { if (event->xclient.data.l[0] == IconicState) { if (w->actions () & CompWindowActionMinimizeMask) w->minimize (); } else if (event->xclient.data.l[0] == NormalState) { w->unminimize (); } } } else if (event->xclient.message_type == Atoms::showingDesktop) { if (event->xclient.window == privateScreen.rootWindow() || event->xclient.window == None) { if (event->xclient.data.l[0]) enterShowDesktopMode (); else leaveShowDesktopMode (NULL); } } else if (event->xclient.message_type == Atoms::numberOfDesktops) { if (event->xclient.window == privateScreen.rootWindow()) { CompOption::Value value; value.set ((int) event->xclient.data.l[0]); setOptionForPlugin ("core", "number_of_desktops", value); } } else if (event->xclient.message_type == Atoms::currentDesktop) { if (event->xclient.window == privateScreen.rootWindow()) privateScreen.setCurrentDesktop (event->xclient.data.l[0]); } else if (event->xclient.message_type == Atoms::winDesktop) { w = findWindow (event->xclient.window); if (w) w->setDesktop (event->xclient.data.l[0]); } else if (event->xclient.message_type == Atoms::wmFullscreenMonitors) { w = findWindow (event->xclient.window); if (w) { CompFullscreenMonitorSet monitors; monitors.top = event->xclient.data.l[0]; monitors.bottom = event->xclient.data.l[1]; monitors.left = event->xclient.data.l[2]; monitors.right = event->xclient.data.l[3]; w->priv->setFullscreenMonitors (&monitors); } } break; case MappingNotify: modHandler->updateModifierMappings (); break; case MapRequest: w = screen->findWindow (event->xmaprequest.window); if (w) { XWindowAttributes attr; bool doMapProcessing = true; /* We should check the override_redirect flag here, because the client might have changed it while being unmapped. */ if (w->queryAttributes (attr)) w->priv->setOverrideRedirect (attr.override_redirect != 0); if (w->state () & CompWindowStateHiddenMask) if (!w->minimized () && !w->inShowDesktopMode ()) doMapProcessing = false; if (doMapProcessing) w->priv->processMap (); w->priv->managed = true; setWindowProp (w->id (), Atoms::winDesktop, w->desktop ()); } else { XMapWindow (privateScreen.dpy, event->xmaprequest.window); } break; case ConfigureRequest: w = findWindow (event->xconfigurerequest.window); if (w && w->managed ()) { XWindowChanges xwc; memset (&xwc, 0, sizeof (xwc)); xwc.x = event->xconfigurerequest.x; xwc.y = event->xconfigurerequest.y; xwc.width = event->xconfigurerequest.width; xwc.height = event->xconfigurerequest.height; xwc.border_width = event->xconfigurerequest.border_width; w->moveResize (&xwc, event->xconfigurerequest.value_mask, 0, ClientTypeUnknown); if (event->xconfigurerequest.value_mask & CWStackMode) { Window above = None; CompWindow *sibling = NULL; if (event->xconfigurerequest.value_mask & CWSibling) { above = event->xconfigurerequest.above; sibling = findTopLevelWindow (above); } switch (event->xconfigurerequest.detail) { case Above: if (w->priv->allowWindowFocus (NO_FOCUS_MASK, 0)) { if (above) { if (sibling) w->restackAbove (sibling); } else w->raise (); } break; case Below: if (above) { if (sibling) w->restackBelow (sibling); } else w->lower (); break; default: /* no handling of the TopIf, BottomIf, Opposite cases - there will hardly be any client using that */ break; } } } else { XWindowChanges xwc; unsigned int xwcm; xwcm = event->xconfigurerequest.value_mask & (CWX | CWY | CWWidth | CWHeight | CWBorderWidth); xwc.x = event->xconfigurerequest.x; xwc.y = event->xconfigurerequest.y; xwc.width = event->xconfigurerequest.width; xwc.height = event->xconfigurerequest.height; xwc.border_width = event->xconfigurerequest.border_width; if (w) { /* Any window that receives a ConfigureRequest * is not override redirect, and may have changed * to being not override redirect */ w->priv->setOverrideRedirect (false); w->configureXWindow (xwcm, &xwc); } else XConfigureWindow (privateScreen.dpy, event->xconfigurerequest.window, xwcm, &xwc); } break; case CirculateRequest: break; case FocusIn: { if (!XGetWindowAttributes (privateScreen.dpy, event->xfocus.window, &wa)) privateScreen.setDefaultWindowAttributes (&wa); /* If the call to XGetWindowAttributes failed it means * the window was destroyed, so track the focus change * anyways since we need to increment activeNum * and the passive button grabs and then we will * get the DestroyNotify later and change the focus * there */ if (wa.root == privateScreen.rootWindow()) { if (event->xfocus.mode == NotifyGrab) privateScreen.eventManager.grabNotified (); else if (event->xfocus.mode == NotifyUngrab) privateScreen.eventManager.ungrabNotified (); else { CompWindowList dockWindows; XWindowChanges xwc; unsigned int mask; w = findTopLevelWindow (event->xfocus.window); if (w && w->managed ()) { unsigned int state = w->state (); if (getNextActiveWindow() == event->xfocus.window) setNextActiveWindow(None); if (w->id () != privateScreen.orphanData.activeWindow) { CompWindow *active = screen->findWindow (privateScreen.orphanData.activeWindow); privateScreen.orphanData.activeWindow = w->id (); w->priv->activeNum = nextActiveNum(); if (active) { CompWindowList windowsLostFocus; /* If this window lost focus and was above a fullscreen window * and is no longer capable of being focused (eg, it is * not visible on this viewport) then we need to check if * any other windows below it are also now no longer capable * of being focused and restack them in the highest position * below docks that they are allowed to take */ if (!active->focus ()) { windowsLostFocus.push_back (active); for (CompWindow *fsw = active->prev; fsw; fsw = fsw->prev) { if (!fsw->focus () && fsw->managed () && !(fsw->type () & (CompWindowTypeDockMask | CompWindowTypeFullscreenMask)) && !fsw->overrideRedirect ()) windowsLostFocus.push_back (fsw); if (fsw->type () & CompWindowTypeFullscreenMask) { ServerLock lock (screen->serverGrabInterface ()); /* This will be the window that we must lower relative to */ CompWindow *sibling = PrivateWindow::findValidStackSiblingBelow (active, fsw, lock); if (sibling) { for (CompWindowList::reverse_iterator rit = windowsLostFocus.rbegin (); rit != windowsLostFocus.rend (); ++rit) { (*rit)->restackAbove (sibling); } } break; } } } active->changeState (active->focused () ? active->state () | CompWindowStateFocusedMask : active->state () & ~CompWindowStateFocusedMask); active->priv->updatePassiveButtonGrabs (); } if (w->focused ()) state |= w->state () | CompWindowStateFocusedMask; else state &= w->state () & ~CompWindowStateFocusedMask; w->priv->updatePassiveButtonGrabs (); addToCurrentActiveWindowHistory (w->id ()); XChangeProperty (privateScreen.dpy , privateScreen.rootWindow(), Atoms::winActive, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &privateScreen.orphanData.activeWindow, 1); w->windowNotify (CompWindowNotifyFocusChange); } state &= ~CompWindowStateDemandsAttentionMask; w->changeState (state); } else if (event->xfocus.window == privateScreen.rootWindow()) { /* Don't ever let the focus go to the root * window except in grab cases * * FIXME: There might be a case where we have to * handle root windows of other screens here, but * the other window managers should handle that */ if (event->xfocus.detail == NotifyDetailNone || (event->xfocus.mode == NotifyNormal && event->xfocus.detail == NotifyInferior)) { privateScreen.orphanData.activeWindow = None; if (event->xfocus.detail == NotifyDetailNone || (event->xfocus.mode == NotifyNormal && event->xfocus.detail == NotifyInferior)) { screen->focusDefaultWindow (); } } } /* Ensure that docks are stacked in the right place * * When a normal window gets the focus and is above a * fullscreen window, restack the docks to be above * the highest level mapped and visible normal window, * otherwise put them above the highest fullscreen window */ if (w) { ServerLock lock (screen->serverGrabInterface ()); if (PrivateWindow::stackDocks (w, dockWindows, &xwc, &mask, lock)) { Window sibling = xwc.sibling; xwc.stack_mode = Above; /* Then update the dock windows */ foreach (CompWindow *dw, dockWindows) { xwc.sibling = sibling; dw->restackAndConfigureXWindow (mask, &xwc, lock); } } } } } else { CompWindow *w; w = screen->findWindow (privateScreen.orphanData.activeWindow); setNextActiveWindow(None); privateScreen.orphanData.activeWindow = None; if (w) w->priv->updatePassiveButtonGrabs (); } } break; case FocusOut: if (event->xfocus.mode == NotifyUngrab) privateScreen.eventManager.ungrabNotified (); break; case EnterNotify: if (event->xcrossing.root == privateScreen.rootWindow()) w = findTopLevelWindow (event->xcrossing.window); else w = NULL; if (w && w->id () != below) { below = w->id (); if (!privateScreen.optionGetClickToFocus () && privateScreen.eventManager.grabsEmpty () && event->xcrossing.mode != NotifyGrab && event->xcrossing.detail != NotifyInferior) { bool raise; int delay; raise = privateScreen.optionGetAutoraise (); delay = privateScreen.optionGetAutoraiseDelay (); if (autoRaiseTimer_.active () && autoRaiseWindow_ != w->id ()) { autoRaiseTimer_.stop (); } if (w->type () & ~(CompWindowTypeDockMask | CompWindowTypeDesktopMask)) { w->moveInputFocusTo (); if (raise) { if (delay > 0) { autoRaiseWindow_ = w->id (); autoRaiseTimer_.start ( boost::bind (autoRaiseTimeout, this), delay, (unsigned int) ((float) delay * 1.2)); } else { CompStackingUpdateMode mode = CompStackingUpdateModeNormal; w->updateAttributes (mode); } } } } } break; case LeaveNotify: if (event->xcrossing.detail != NotifyInferior) { if (event->xcrossing.window == below) below = None; } break; default: if (privateScreen.xShape.isEnabled () && event->type == privateScreen.xShape.get () + ShapeNotify) { w = findWindow (((XShapeEvent *) event)->window); if (w) { if (w->mapNum ()) w->priv->updateRegion (); } } else if (event->type == privateScreen.xSync.get () + XSyncAlarmNotify) { XSyncAlarmNotifyEvent *sa; sa = (XSyncAlarmNotifyEvent *) event; for (cps::WindowManager::iterator i = windowManager.begin(); i != windowManager.end(); ++i) { CompWindow* const w(*i); if (w->priv->syncAlarm == sa->alarm) { w->priv->handleSyncAlarm (); break; } } } break; } } compiz-0.9.11+14.04.20140409/src/configurerequestbuffer.cpp0000644000015301777760000002242012321343002023551 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include #include #include "asyncserverwindow.h" #include "configurerequestbuffer-impl.h" #ifndef foreach #define foreach BOOST_FOREACH #endif namespace crb = compiz::window::configure_buffers; namespace cw = compiz::window; class crb::ConfigureRequestBuffer::Private { public: typedef crb::Lockable::Weak LockObserver; Private (cw::AsyncServerWindow *asyncServerWindow, cw::SyncServerWindow *syncServerWindow, const crb::ConfigureRequestBuffer::LockFactory &lockFactory) : clientChangeMask (0), wrapperChangeMask (0), frameChangeMask (0), sendSyntheticConfigure (false), lockCount (0), asyncServerWindow (asyncServerWindow), syncServerWindow (syncServerWindow), lockFactory (lockFactory) { } void dispatchConfigure (bool force = false); XWindowChanges clientChanges; unsigned int clientChangeMask; XWindowChanges wrapperChanges; unsigned int wrapperChangeMask; XWindowChanges frameChanges; unsigned int frameChangeMask; bool sendSyntheticConfigure; unsigned int lockCount; cw::AsyncServerWindow *asyncServerWindow; cw::SyncServerWindow *syncServerWindow; crb::ConfigureRequestBuffer::LockFactory lockFactory; std::vector locks; }; void crb::ConfigureRequestBuffer::Private::dispatchConfigure (bool force) { const unsigned int allEventMasks = 0x7f; bool immediate = frameChangeMask & (CWStackMode | CWSibling); /* This is a stop-gap solution for not having a plugin API to * query the window shape. Once we have that, we can safely * remove these and require the queue to be unlocked when that * happens. Its a separate unit of work for improving resize * performance anyways. */ immediate |= (frameChangeMask & (CWWidth | CWHeight | CWBorderWidth)); immediate |= (wrapperChangeMask & (CWWidth | CWHeight | CWBorderWidth | CWX | CWY)); immediate |= (clientChangeMask & (CWWidth | CWHeight | CWBorderWidth | CWX | CWY)); immediate |= force; bool clientDispatch = (clientChangeMask & allEventMasks); bool wrapperDispatch = (wrapperChangeMask & allEventMasks); bool frameDispatch = (frameChangeMask & allEventMasks); bool dispatch = !lockCount && (clientDispatch || wrapperDispatch || frameDispatch || sendSyntheticConfigure); if (dispatch || immediate) { if (frameDispatch) { asyncServerWindow->requestConfigureOnFrame (frameChanges, frameChangeMask); frameChangeMask = 0; } if (wrapperDispatch) { asyncServerWindow->requestConfigureOnWrapper (wrapperChanges, wrapperChangeMask); wrapperChangeMask = 0; } if (clientDispatch) { asyncServerWindow->requestConfigureOnClient (clientChanges, clientChangeMask); clientChangeMask = 0; } if (sendSyntheticConfigure) { asyncServerWindow->sendSyntheticConfigureNotify (); sendSyntheticConfigure = false; } foreach (const LockObserver &lock, locks) { crb::Lockable::Ptr strongLock (lock.lock ()); /* We might be in a lock's destructor so check * if this can really be re-locked, if not, its * no big deal as the lock is going away anyways */ if (strongLock) strongLock->lock (); } } } void crb::ConfigureRequestBuffer::freeze () { priv->lockCount++; assert (priv->lockCount <= priv->locks.size ()); } void crb::ConfigureRequestBuffer::release () { assert (priv->lockCount); priv->lockCount--; priv->dispatchConfigure (); } namespace { void applyChangeToXWC (const XWindowChanges &from, XWindowChanges &to, unsigned int mask) { if (mask & CWX) to.x = from.x; if (mask & CWY) to.y = from.y; if (mask & CWWidth) to.width = from.width; if (mask & CWHeight) to.height = from.height; if (mask & CWBorderWidth) to.border_width = from.border_width; if (mask & CWSibling) to.sibling = from.sibling; if (mask & CWStackMode) to.stack_mode = from.stack_mode; } } void crb::ConfigureRequestBuffer::pushClientRequest (const XWindowChanges &xwc, unsigned int mask) { applyChangeToXWC (xwc, priv->clientChanges, mask); priv->clientChangeMask |= mask; priv->dispatchConfigure (); } void crb::ConfigureRequestBuffer::pushWrapperRequest (const XWindowChanges &xwc, unsigned int mask) { applyChangeToXWC (xwc, priv->wrapperChanges, mask); priv->wrapperChangeMask |= mask; priv->dispatchConfigure (); } void crb::ConfigureRequestBuffer::pushFrameRequest (const XWindowChanges &xwc, unsigned int mask) { applyChangeToXWC (xwc, priv->frameChanges, mask); priv->frameChangeMask |= mask; priv->dispatchConfigure (); } void crb::ConfigureRequestBuffer::pushSyntheticConfigureNotify () { priv->sendSyntheticConfigure = true; priv->dispatchConfigure (); } crb::Releasable::Ptr crb::ConfigureRequestBuffer::obtainLock () { crb::BufferLock::Ptr lock (priv->lockFactory (this)); priv->locks.push_back (crb::Lockable::Weak (lock)); lock->lock (); return lock; } namespace { bool isLock (const crb::Lockable::Weak &lockable, crb::BufferLock *lock) { crb::Lockable::Ptr strongLockable (lockable.lock ()); /* Asserting that the lock did not go away without telling * us first */ assert (strongLockable.get ()); if (strongLockable.get () == lock) return true; return false; } } void crb::ConfigureRequestBuffer::untrackLock (crb::BufferLock *lock) { std::remove_if (priv->locks.begin (), priv->locks.end (), boost::bind (isLock, _1, lock)); } bool crb::ConfigureRequestBuffer::queryAttributes (XWindowAttributes &attrib) { priv->dispatchConfigure (true); return priv->syncServerWindow->queryAttributes (attrib); } bool crb::ConfigureRequestBuffer::queryFrameAttributes (XWindowAttributes &attrib) { priv->dispatchConfigure (true); return priv->syncServerWindow->queryFrameAttributes (attrib); } /* This is more or less of a stop-gap for the fact that * when resizing window we re-query the window shape * and apply that to the frame. That's a separate unit of * work and should be dealt with separately. For now, force * a release of the queue whenever we do that so that * XShapeGetRectangles doesn't return an unexpected value */ XRectangle * crb::ConfigureRequestBuffer::queryShapeRectangles (int kind, int *count, int *ordering) { priv->dispatchConfigure (true); return priv->syncServerWindow->queryShapeRectangles (kind, count, ordering); } void crb::ConfigureRequestBuffer::forceRelease () { priv->dispatchConfigure (true); } crb::ConfigureRequestBuffer::ConfigureRequestBuffer (AsyncServerWindow *asyncServerWindow, SyncServerWindow *syncServerWindow, const crb::ConfigureRequestBuffer::LockFactory &factory) : priv (new crb::ConfigureRequestBuffer::Private (asyncServerWindow, syncServerWindow, factory)) { } compiz::window::configure_buffers::Buffer::Ptr crb::ConfigureRequestBuffer::Create (AsyncServerWindow *asyncServerWindow, SyncServerWindow *syncServerWindow, const LockFactory &factory) { return crb::Buffer::Ptr (new crb::ConfigureRequestBuffer (asyncServerWindow, syncServerWindow, factory)); } class crb::ConfigureBufferLock::Private { public: Private (crb::CountedFreeze *freezable) : freezable (freezable), armed (false) { } crb::CountedFreeze *freezable; bool armed; }; crb::ConfigureBufferLock::ConfigureBufferLock (crb::CountedFreeze *freezable) : priv (new crb::ConfigureBufferLock::Private (freezable)) { } crb::ConfigureBufferLock::~ConfigureBufferLock () { release (); } void crb::ConfigureBufferLock::lock () { if (!priv->armed) priv->freezable->freeze (); priv->armed = true; } void crb::ConfigureBufferLock::release () { if (priv->armed) priv->freezable->release (); priv->armed = false; } compiz-0.9.11+14.04.20140409/src/syncserverwindow.h0000644000015301777760000000322012321343002022062 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_SYNC_SERVER_WINDOW_H #define _COMPIZ_SYNC_SERVER_WINDOW_H #include namespace compiz { namespace window { class SyncServerWindow { public: virtual ~SyncServerWindow () {} virtual bool queryAttributes (XWindowAttributes &attrib) = 0; virtual bool queryFrameAttributes (XWindowAttributes &attrib) = 0; virtual XRectangle * queryShapeRectangles (int kind, int *count, int *ordering) = 0; }; } } #endif compiz-0.9.11+14.04.20140409/src/pluginclasshandler/0000755000015301777760000000000012321344021022145 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/0000755000015301777760000000000012321344021023307 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/test-pluginclasshandler.h0000644000015301777760000000211512321343002030314 0ustar pbusernogroup00000000000000#include #include #include #include #include extern PluginClassStorage::Indices globalPluginClassIndices; extern unsigned int pluginClassHandlerIndex; extern bool debugOutput; extern char *programName; class Base; class Global: public ValueHolder { public: Global (); std::list bases; }; class Base: public PluginClassStorage { public: Base (); virtual ~Base (); static unsigned int allocPluginClassIndex (); static void freePluginClassIndex (unsigned int index); }; class Plugin { public: Plugin (Base *); virtual ~Plugin (); Base *b; }; namespace compiz { namespace plugin { namespace internal { /* The version available in the tests is * readily constructed */ class PluginKey { }; } } } class CompizPCHTest : public ::testing::Test { public: CompizPCHTest (); virtual ~CompizPCHTest (); Global *global; std::list bases; std::list plugins; compiz::plugin::internal::PluginKey key; }; compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/get/0000755000015301777760000000000012321344021024066 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/get/src/0000755000015301777760000000000012321344021024655 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/get/src/test-pch-get.cpp0000644000015301777760000000354712321343002027674 0ustar pbusernogroup00000000000000#include namespace cpi = compiz::plugin::internal; using ::testing::IsNull; class GetPlugin : public Plugin, public PluginClassHandler { public: GetPlugin (Base *); }; GetPlugin::GetPlugin (Base *base): Plugin (base), PluginClassHandler (base) { } class PluginClassHandlerGet : public CompizPCHTest { public: PluginClassHandlerGet (); ~PluginClassHandlerGet (); }; PluginClassHandlerGet::PluginClassHandlerGet () { cpi::LoadedPluginClassBridge ::allowInstantiations (key); } PluginClassHandlerGet::~PluginClassHandlerGet () { cpi::LoadedPluginClassBridge ::disallowInstantiations (key); } TEST_F (PluginClassHandlerGet, TestGet) { Plugin *p; bases.push_back (new Base ()); plugins.push_back (new GetPlugin (bases.back ())); bases.push_back (new Base ()); plugins.push_back (new GetPlugin (bases.back ())); p = GetPlugin::get (bases.front ()); if (p != plugins.front ()) { FAIL() << "Returned Plugin * is not plugins.front ()"; } p = GetPlugin::get (bases.back ()); if (p != plugins.back ()) { FAIL() << "Returned Plugin * is not plugins.back ()"; } /* Now create a third base and check if plugin is implicitly created */ bases.push_back (new Base ()); plugins.push_back (GetPlugin::get (bases.back ())); p = plugins.back (); if (p->b != bases.back ()) { FAIL() << "Returned Plugin * is not the plugin for bases.back ()"; } } TEST_F (PluginClassHandlerGet, TestGetNoInstantiationsAllowed) { cpi::LoadedPluginClassBridge ::disallowInstantiations (key); Plugin *p; bases.push_back (new Base ()); plugins.push_back (new GetPlugin (bases.back ())); p = GetPlugin::get (bases.front ()); EXPECT_THAT (p, IsNull ()); } compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/indexes/0000755000015301777760000000000012321344021024746 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/indexes/src/0000755000015301777760000000000012321344021025535 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/indexes/src/test-pch-indexes.cpp0000644000015301777760000002262712321343002031434 0ustar pbusernogroup00000000000000#include #include class IndexesPlugin; typedef PluginClassHandler IPBHandler; class IndexesPlugin : public Plugin, public IPBHandler { public: IndexesPlugin (Base *); ~IndexesPlugin (); }; class IndexesPlugin2; typedef PluginClassHandler IPB2Handler; class IndexesPlugin2 : public Plugin, public IPB2Handler { public: IndexesPlugin2 (Base *); }; class IndexesPlugin3; typedef PluginClassHandler IPB3Handler; class IndexesPlugin3 : public Plugin, public IPB3Handler { public: IndexesPlugin3 (Base *); }; class FailingBase: public PluginClassStorage { public: FailingBase (); virtual ~FailingBase (); static unsigned int allocPluginClassIndex (); static void freePluginClassIndex (unsigned int index); }; class FailingIndexesPlugin; typedef PluginClassHandler FIPBHandler; class FailingIndexesPlugin : public FIPBHandler { public: FailingIndexesPlugin (FailingBase *); }; unsigned int FailingBase::allocPluginClassIndex () { /* Always fails */ return (unsigned int) ~0; } void FailingBase::freePluginClassIndex (unsigned int index) { /* Does nothing, since this base is made of fail */ } FailingBase::FailingBase () : PluginClassStorage (globalPluginClassIndices) { } FailingBase::~FailingBase () { } IndexesPlugin::IndexesPlugin (Base *base): Plugin (base), IPBHandler (base) { } IndexesPlugin::~IndexesPlugin () { } IndexesPlugin2::IndexesPlugin2 (Base *base): Plugin (base), IPB2Handler (base) { } IndexesPlugin3::IndexesPlugin3 (Base *base): Plugin (base), IPB3Handler (base) { setFailed (); } FailingIndexesPlugin::FailingIndexesPlugin (FailingBase *base): FIPBHandler (base) { } class CompizPCHTestIndexes : public CompizPCHTest { public: void run (); template void printFailure (I *); public: unsigned int ePluginClassHandlerIndex; unsigned int eIndex; int eRefCount; bool eInitiated; bool eFailed; bool ePcFailed; unsigned int ePcIndex; bool eLoadFailed; }; template void CompizPCHTestIndexes::printFailure (I *i) { std::cout << "FAIL: index value does not match!" << std::endl; std::cout << "INFO: Values of " << std::hex << (void *) i << " are " << std::endl; std::cout << "INFO: pluginClassHandlerIndex is " << pluginClassHandlerIndex << std::endl; std::cout << "INFO: mIndex.refCount " << i->mIndex.refCount << std::endl; std::cout << "INFO: mIndex.initiated " << i->mIndex.initiated << std::endl; std::cout << "INFO: mIndex.failed " << i->mIndex.failed << std::endl; std::cout << "INFO: mIndex.pcFailed " << i->mIndex.pcFailed << std::endl; std::cout << "INFO: mIndex.pcIndex " << i->mIndex.pcIndex << std::endl; std::cout << "INFO: loadFailed " << (i->loadFailed () ? 1 : 0) << std::endl; std::cout << "INFO: Values of " << std::hex << (void *) i << " should be " << std::endl; std::cout << "INFO: pluginClassHandlerIndex is " << ePluginClassHandlerIndex << std::endl; std::cout << "INFO: mIndex.index " << eIndex << std::endl; std::cout << "INFO: mIndex.refCount " << eRefCount << std::endl; std::cout << "INFO: mIndex.initiated " << eInitiated << std::endl; std::cout << "INFO: mIndex.failed " << eFailed << std::endl; std::cout << "INFO: mIndex.pcFailed " << ePcFailed << std::endl; std::cout << "INFO: mIndex.pcIndex " << ePcIndex << std::endl; std::cout << "INFO: loadFailed " << (eLoadFailed ? 1 : 0) << std::endl; } #define INDEX_INCORRECT(i) \ pluginClassHandlerIndex != ePluginClassHandlerIndex || \ i->mIndex.index != eIndex || \ i->mIndex.refCount != eRefCount || \ i->mIndex.initiated != eInitiated || \ i->mIndex.failed != eFailed || \ i->mIndex.pcFailed != ePcFailed || \ i->mIndex.pcIndex != ePcIndex TEST_F( CompizPCHTestIndexes, TestIndexes ) { Plugin *p; Base *b; FailingBase *fb; FailingIndexesPlugin *fp; IPBHandler *ipbhandler_p; IPB2Handler *ipbhandler_p2; IPB3Handler *ipbhandler_p3; FIPBHandler *fipbhandler_p; bases.push_back (new Base ()); plugins.push_back (new IndexesPlugin (bases.back ())); p = plugins.back (); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 1; eIndex = 0; eRefCount = 1; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 0; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } bases.push_back (new Base ()); plugins.push_back (new IndexesPlugin (bases.back ())); p = plugins.back (); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 1; eIndex = 0; eRefCount = 2; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 0; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } bases.push_back (new Base ()); plugins.push_back (new IndexesPlugin2 (bases.back ())); p = plugins.back (); ipbhandler_p2 = (IPB2Handler *) p; ePluginClassHandlerIndex = 2; eIndex = 1; eRefCount = 1; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 1; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p2)) { printFailure (ipbhandler_p2); exit (1); } plugins.pop_back (); delete p; b = bases.back (); bases.pop_back (); delete b; p = plugins.back (); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 3; eIndex = 0; eRefCount = 2; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 0; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } plugins.pop_back (); delete p; b = bases.back (); bases.pop_back (); delete b; p = plugins.back (); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 3; eIndex = 0; eRefCount = 1; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 0; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } p = IndexesPlugin::get (bases.back ()); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 3; eIndex = 0; eRefCount = 1; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 3; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } bases.push_back (new Base ()); plugins.push_back (new IndexesPlugin3 (bases.back ())); p = plugins.back (); ipbhandler_p3 = (IPB3Handler *) p; ePluginClassHandlerIndex = 4; eIndex = 1; eRefCount = 1; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 0; eLoadFailed = true; /* * This seems to be broken on some compilers * disable this test for now * * if (INDEX_INCORRECT (ipbhandler_p3)) * { * printFailure (ipbhandler_p3); * exit (1); * } */ bases.push_back (new Base ()); plugins.push_back (new IndexesPlugin (bases.back ())); p = plugins.back (); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 4; eIndex = 0; eRefCount = 2; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 3; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } plugins.push_back (new IndexesPlugin2 (bases.back ())); p = plugins.back (); ipbhandler_p2 = (IPB2Handler *) p; ePluginClassHandlerIndex = 5; eIndex = 2; eRefCount = 1; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 4; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p2)) { printFailure (ipbhandler_p2); FAIL(); } /* Now call ::get on the first one to reset the pluginClassHandlerIndex */ p = IndexesPlugin::get (bases.back ()); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 5; eIndex = 0; eRefCount = 2; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 5; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } /* Now erase the key that was used by the second plugin so subsequent attempts to ::get * will fail */ p = plugins.back (); ipbhandler_p2 = (IPB2Handler *) p; ValueHolder::Default ()->eraseValue (ipbhandler_p2->keyName ()); p = IndexesPlugin2::get (bases.back ()); ePluginClassHandlerIndex = 5; eIndex = 2; eRefCount = 1; eInitiated = false; eFailed = true; ePcFailed = false; ePcIndex = 5; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p2)) { printFailure (ipbhandler_p2); FAIL(); } fb = new FailingBase (); fp = new FailingIndexesPlugin (fb); fipbhandler_p = (FIPBHandler *) fp; ePluginClassHandlerIndex = 5; eIndex = 0; eRefCount = 0; eInitiated = false; eFailed = true; ePcFailed = true; ePcIndex = 5; eLoadFailed = false; if (INDEX_INCORRECT (fipbhandler_p)) { printFailure (fipbhandler_p); FAIL(); } delete fp; delete fb; } compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/CMakeLists.txt0000644000015301777760000000273012321343002026047 0ustar pbusernogroup00000000000000include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ) add_library( compiz_pch_test STATIC test-pluginclasshandler.cpp ) add_executable( compiz_pch_construct ${CMAKE_CURRENT_SOURCE_DIR}/construct/src/test-pch-construct.cpp ) add_executable( compiz_pch_get ${CMAKE_CURRENT_SOURCE_DIR}/get/src/test-pch-get.cpp ) #add_executable( # compiz_pch_indexes # # ${CMAKE_CURRENT_SOURCE_DIR}/indexes/src/test-pch-indexes.cpp #) add_executable( compiz_pch_typenames ${CMAKE_CURRENT_SOURCE_DIR}/typenames/src/test-pch-typenames.cpp ) target_link_libraries( compiz_pch_construct compiz_pch_test compiz_logmessage compiz_pluginclasshandler compiz_string ${GTEST_BOTH_LIBRARIES} ) target_link_libraries( compiz_pch_get compiz_pch_test compiz_logmessage compiz_pluginclasshandler compiz_string ${GTEST_BOTH_LIBRARIES} ) target_link_libraries( compiz_pch_typenames compiz_pch_test compiz_logmessage compiz_pluginclasshandler compiz_string ${GTEST_BOTH_LIBRARIES} ) # Not compilable #target_link_libraries( # compiz_pch_indexes # compiz_pch_test # # compiz_pluginclasshandler # compiz_string # # gtest # gtest_main #) compiz_discover_tests (compiz_pch_construct COVERAGE compiz_pluginclasshandler) compiz_discover_tests (compiz_pch_get COVERAGE compiz_pluginclasshandler) #add_test( compiz_pch_indexes compiz_pch_indexes ) compiz_discover_tests (compiz_pch_typenames COVERAGE compiz_pluginclasshandler) compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/construct/0000755000015301777760000000000012321344021025333 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/construct/src/0000755000015301777760000000000012321344021026122 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/construct/src/test-pch-construct.cpp0000644000015301777760000000344112321343002032377 0ustar pbusernogroup00000000000000#include class BuildPlugin: public Plugin, public PluginClassHandler { public: BuildPlugin (Base *base) : Plugin(base), PluginClassHandler (base) { } }; class PluginClassHandlerConstruction : public CompizPCHTest { public: PluginClassHandlerConstruction (); ~PluginClassHandlerConstruction (); }; PluginClassHandlerConstruction::PluginClassHandlerConstruction () { namespace cpi = compiz::plugin::internal; cpi::LoadedPluginClassBridge ::allowInstantiations (key); } PluginClassHandlerConstruction::~PluginClassHandlerConstruction () { namespace cpi = compiz::plugin::internal; cpi::LoadedPluginClassBridge ::disallowInstantiations (key); } TEST_F (PluginClassHandlerConstruction, TestConstruction) { Plugin *p; bases.push_back(new Base()); plugins.push_back(static_cast(new BuildPlugin(bases.back()))); bases.push_back(new Base()); plugins.push_back(static_cast(new BuildPlugin(bases.back()))); if (bases.front()->pluginClasses.size() != globalPluginClassIndices.size()) { FAIL() << "allocated number of plugin classes is not the same as the" " global number of allocated plugin classes"; } if (!ValueHolder::Default()->hasValue( compPrintf("%s_index_%lu", typeid(BuildPlugin).name(), 0))) { FAIL() << "ValueHolder does not have value " << compPrintf("%s_index_%lu", typeid(BuildPlugin).name(), 0); } p = BuildPlugin::get(bases.front()); if (p != plugins.front()) { FAIL() << "Returned Plugin * is not plugins.front ()"; } p = BuildPlugin::get(bases.back()); if (p != plugins.back()) { FAIL() << "Returned Plugin * is not plugins.back ()"; } } compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/typenames/0000755000015301777760000000000012321344021025314 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/typenames/src/0000755000015301777760000000000012321344021026103 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/typenames/src/test-pch-typenames.cpp0000644000015301777760000000364412321343002032346 0ustar pbusernogroup00000000000000#include class TypenamesPlugin: public Plugin, public PluginClassHandler { public: TypenamesPlugin (Base *); }; class TypenamesPluginABI1: public Plugin, public PluginClassHandler< TypenamesPluginABI1, Base, 1> { public: TypenamesPluginABI1 (Base *); }; class TypenamesPluginABI2: public Plugin, public PluginClassHandler< TypenamesPluginABI2, Base, 2> { public: TypenamesPluginABI2 (Base *); }; TypenamesPlugin::TypenamesPlugin (Base *base) : Plugin(base), PluginClassHandler(base) { } TypenamesPluginABI1::TypenamesPluginABI1 (Base *base) : Plugin(base), PluginClassHandler(base) { } TypenamesPluginABI2::TypenamesPluginABI2 (Base *base) : Plugin(base), PluginClassHandler(base) { } TEST_F( CompizPCHTest, TestTypenames) { std::list::iterator it; bases.push_back(new Base()); plugins.push_back(new TypenamesPlugin(bases.back())); bases.push_back(new Base()); plugins.push_back(new TypenamesPluginABI1(bases.back())); bases.push_back(new Base()); plugins.push_back(new TypenamesPluginABI2(bases.back())); if (!ValueHolder::Default()->hasValue( compPrintf("%s_index_%lu", typeid(TypenamesPlugin).name(), 0))) { FAIL() << "ValueHolder does not have value " << compPrintf("%s_index_%lu", typeid(TypenamesPlugin).name(), 0); } if (!ValueHolder::Default()->hasValue( compPrintf("%s_index_%lu", typeid(TypenamesPluginABI1).name(), 1))) { FAIL() << "ValueHolder does not have value " << compPrintf("%s_index_%lu", typeid(TypenamesPluginABI1).name(), 0); } if (!ValueHolder::Default()->hasValue( compPrintf("%s_index_%lu", typeid(TypenamesPluginABI2).name(), 2))) { FAIL() << "FAIL: ValueHolder does not have value " << compPrintf("%s_index_%lu", typeid(TypenamesPluginABI2).name(), 2); } } compiz-0.9.11+14.04.20140409/src/pluginclasshandler/tests/test-pluginclasshandler.cpp0000644000015301777760000000303112321343002030645 0ustar pbusernogroup00000000000000#include "test-pluginclasshandler.h" #include #define foreach BOOST_FOREACH PluginClassStorage::Indices globalPluginClassIndices (0); unsigned int pluginClassHandlerIndex = 0; bool debugOutput; char *programName; namespace { static CompizPCHTest *gTest; }; Global::Global () { } unsigned int Base::allocPluginClassIndex () { unsigned int i = PluginClassStorage::allocatePluginClassIndex (globalPluginClassIndices); foreach (Base *b, gTest->global->bases) { if (globalPluginClassIndices.size () != b->pluginClasses.size ()) b->pluginClasses.resize (globalPluginClassIndices.size ()); } return i; } void Base::freePluginClassIndex (unsigned int index) { PluginClassStorage::freePluginClassIndex (globalPluginClassIndices, index); foreach (Base *b, gTest->global->bases) { if (globalPluginClassIndices.size () != b->pluginClasses.size ()) b->pluginClasses.resize (globalPluginClassIndices.size ()); } } Base::Base () : PluginClassStorage (globalPluginClassIndices) { gTest->global->bases.push_back (this); } Base::~Base () { gTest->global->bases.remove (this); } Plugin::Plugin (Base *base) : b (base) { } Plugin::~Plugin () { } CompizPCHTest::CompizPCHTest () : global (new Global()) { ValueHolder::SetDefault (static_cast (global)); gTest = this; } CompizPCHTest::~CompizPCHTest () { foreach (Plugin *p, plugins) { delete p; } foreach (Base *b, bases) { delete b; } delete global; } compiz-0.9.11+14.04.20140409/src/pluginclasshandler/CMakeLists.txt0000644000015301777760000000164012321343002024704 0ustar pbusernogroup00000000000000 INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}../logmessage/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ) SET( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/pluginclasses.h ${CMAKE_CURRENT_SOURCE_DIR}/include/core/pluginclasshandler.h ${CMAKE_CURRENT_SOURCE_DIR}/include/core/valueholder.h ) SET( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/valueholder.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/pluginclasses.cpp ) ADD_LIBRARY( compiz_pluginclasshandler STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_pluginclasshandler PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) compiz-0.9.11+14.04.20140409/src/pluginclasshandler/src/0000755000015301777760000000000012321344021022734 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/src/pluginclasses.cpp0000644000015301777760000000414112321343002026312 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include PluginClassStorage::PluginClassStorage (PluginClassStorage::Indices& iList) : pluginClasses (0) { if (iList.size () > 0) pluginClasses.resize (iList.size ()); } unsigned int PluginClassStorage::allocatePluginClassIndex (PluginClassStorage::Indices& iList) { unsigned int i; for (i = 0; i < iList.size (); i++) { if (!iList.at (i)) { iList.at (i) = true; return i; } } i = iList.size (); iList.resize (i + 1); iList.at (i) = true; return i; } void PluginClassStorage::freePluginClassIndex (PluginClassStorage::Indices& iList, unsigned int idx) { unsigned int size = iList.size (); if (idx >= size) return; if (idx < size - 1) { iList.at (idx) = false; return; } iList.resize (size - 1); } compiz-0.9.11+14.04.20140409/src/pluginclasshandler/src/valueholder.cpp0000644000015301777760000000504612321343002025755 0ustar pbusernogroup00000000000000/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include namespace { static ValueHolder *gDefault; } class PrivateValueHolder { public: std::map valueMap; }; ValueHolder::ValueHolder () : priv (new PrivateValueHolder) { } ValueHolder::~ValueHolder () { delete priv; } ValueHolder * ValueHolder::Default () { return gDefault; } void ValueHolder::SetDefault (ValueHolder *v) { gDefault = v; } void ValueHolder::storeValue (CompString key, CompPrivate value) { std::map::iterator it; it = priv->valueMap.find (key); if (it != priv->valueMap.end ()) { it->second = value; } else { priv->valueMap.insert (std::pair (key, value)); } } void ValueHolder::eraseValue (CompString key) { std::map::iterator it; it = priv->valueMap.find (key); if (it != priv->valueMap.end ()) { priv->valueMap.erase (key); } } bool ValueHolder::hasValue (CompString key) { return (priv->valueMap.find (key) != priv->valueMap.end ()); } CompPrivate ValueHolder::getValue (CompString key) { CompPrivate p; std::map::iterator it; it = priv->valueMap.find (key); if (it != priv->valueMap.end ()) { return it->second; } else { p.uval = 0; return p; } } compiz-0.9.11+14.04.20140409/src/pluginclasshandler/include/0000755000015301777760000000000012321344021023570 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/include/core/0000755000015301777760000000000012321344021024520 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/src/pluginclasshandler/include/core/valueholder.h0000644000015301777760000000343512321343002027206 0ustar pbusernogroup00000000000000/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_VALUEHOLDER_H #define _COMPIZ_VALUEHOLDER_H #include #include #include #include class PrivateValueHolder; class ValueHolder : boost::noncopyable { public: ValueHolder (); ~ValueHolder (); void eraseValue (CompString key); bool hasValue (CompString key); void storeValue (CompString key, CompPrivate value); CompPrivate getValue (CompString key); static ValueHolder * Default (); static void SetDefault (ValueHolder *); private: PrivateValueHolder *priv; }; #endif compiz-0.9.11+14.04.20140409/src/pluginclasshandler/include/core/pluginclasshandler.h0000644000015301777760000002473412321343002030563 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _COMPPLUGINCLASSHANDLER_H #define _COMPPLUGINCLASSHANDLER_H #include #include #include #include #include /* Continuously increments every time a new * plugin class is added, guaranteed to be * the same as the pcIndex of the most up-to-date * PluginClassHandler index. Any index that * hold the same value this value is safe to * use to retreive the plugin class for a base * class (and as such we don't need to constantly * re-query ValueHolder for the index of this plugin * on the base class) */ extern unsigned int pluginClassHandlerIndex; namespace compiz { namespace plugin { namespace internal { class PluginKey; /** * LoadedPluginClassBridge * * This template essentially exists so that we can reduce the * scope of functions which are allowed to mark plugin classes * as instantiatable as we can't really inject the interface * from PluginClassHandler to do that anywhere. We also can't * forward declare a nested class declaration, but we can forward * declare PluginKey, which users should inherit from and take * it by reference. If the class we're depending on can only be * defined in one other place along with a private constructor * accessible only to a friend it means that we've effectively * limited the scope of users of this class. */ template class LoadedPluginClassBridge { public: static void allowInstantiations (const PluginKey &); static void disallowInstantiations (const PluginKey &); }; } } } template class PluginClassHandler { public: typedef Tp ClassPluginType; typedef Tb ClassPluginBaseType; PluginClassHandler (Tb *); ~PluginClassHandler (); /** * Changes this PluginClassHandler's state to "failed" */ void setFailed () { mFailed = true; }; /** * Checks to see if this plugin class failed to load for * whatever reason, so that instantiation of the class * can be aborted */ bool loadFailed () { return mFailed; }; /** * Returns the unique instance of the plugin class * for this base class */ Tb * get () { return mBase; }; static Tp * get (Tb *); static const Tp * get (const Tb *); private: /** * Returns the unique string identifying this plugin type with it's * ABI */ static CompString keyName () { return compPrintf ("%s_index_%lu", typeid (Tp).name (), ABI); } /** * Actually initializes the index of this plugin class * by allocating a new index for plugin class storage * on this base class if there wasn't one already and then * storing that index inside of ValueHolder */ static bool initializeIndex (Tb *base); static inline Tp * getInstance (Tb *base); static void allowInstantiations (); static void disallowInstantiations (); template friend class compiz::plugin::internal::LoadedPluginClassBridge; private: bool mFailed; Tb *mBase; static PluginClassIndex mIndex; static bool mPluginLoaded; }; namespace compiz { namespace plugin { namespace internal { template void LoadedPluginClassBridge ::allowInstantiations (const PluginKey &) { PluginClassHandler ::allowInstantiations (); } template void LoadedPluginClassBridge ::disallowInstantiations (const PluginKey &) { PluginClassHandler ::disallowInstantiations (); } } } } template PluginClassIndex PluginClassHandler::mIndex; template bool PluginClassHandler::mPluginLoaded = false; /** * Attaches a unique instance of the specified plugin class to a * unique instance of a specified base class */ template PluginClassHandler::PluginClassHandler (Tb *base) : mFailed (false), mBase (base) { /* If allocating plugin class indices for this base has * already failed once don't bother to allocate more for * this plugin class, just instantly fail */ if (mIndex.pcFailed) { mFailed = true; } else { /* The index for this plugin class hasn't been initiated * so do that (done once per plugin) */ if (!mIndex.initiated) mFailed = !initializeIndex (base); /* Increase the reference count of this plugin class index * for this plugin on this base object for each attached * plugin class and set the index pointer */ if (!mIndex.failed) { mIndex.refCount++; mBase->pluginClasses[mIndex.index] = static_cast (this); } } } template bool PluginClassHandler::initializeIndex (Tb *base) { /* Allocate a new storage space index in the array of CompPrivate's * specified in the base class */ mIndex.index = base->allocPluginClassIndex (); if (mIndex.index != (unsigned)~0) { /* Allocation was successful, this is the most recently allocated * plugin class index so it is fresh to use */ mIndex.initiated = true; mIndex.failed = false; mIndex.pcIndex = pluginClassHandlerIndex; CompPrivate p; p.uval = mIndex.index; /* Also store the index value inside of ValueHolder for this plugin-base * combination so that we can fetch it later should the index location * change */ if (!ValueHolder::Default ()->hasValue (keyName ())) { ValueHolder::Default ()->storeValue (keyName (), p); pluginClassHandlerIndex++; } else { compLogMessage ("core", CompLogLevelFatal, "Private index value \"%s\" already stored in screen.", keyName ().c_str ()); } return true; } else { mIndex.index = 0; mIndex.failed = true; mIndex.initiated = false; mIndex.pcFailed = true; mIndex.pcIndex = pluginClassHandlerIndex; return false; } } template PluginClassHandler::~PluginClassHandler () { /* Only bother to destroy the static mIndex if plugin * class allocation was actually successful */ if (!mIndex.pcFailed) { mIndex.refCount--; /* Once this index's reference count hits zero it * means that there are no more plugin classes attached * to the base class, so other plugins are free to use our * index and we can erase our data from ValueHolder * (also increment pluginClassHandlerIndex since after doing * this operation, all the other indexes with the same pcIndex * won't be fresh) */ if (mIndex.refCount == 0) { mBase->freePluginClassIndex (mIndex.index); mIndex.initiated = false; mIndex.failed = false; mIndex.pcIndex = pluginClassHandlerIndex; ValueHolder::Default ()->eraseValue (keyName ()); pluginClassHandlerIndex++; } } } template Tp * PluginClassHandler::getInstance (Tb *base) { /* Return the plugin class found at index if it exists * otherwise spawn a new one implicitly (objects should * never expect ::get () to fail, unless the plugin class * fails to instantiate or the underlying base object * does not take plugin classes of this type) */ if (base->pluginClasses[mIndex.index]) return static_cast (base->pluginClasses[mIndex.index]); else { /* mIndex.index will be implicitly set by * the constructor */ Tp *pc = new Tp (base); if (!pc) return NULL; /* FIXME: If a plugin class fails to load for * whatever reason, then ::get is going to return * NULL, which is unsafe in cases that aren't * initScreen and initWindow */ if (pc->loadFailed ()) { delete pc; return NULL; } return static_cast (base->pluginClasses[mIndex.index]); } } template const Tp * PluginClassHandler::get (const Tb *base) { return get (const_cast (base)); } template Tp * PluginClassHandler::get (Tb *base) { /* Never instantiate an instance of this class * if the relevant plugin has not been loaded */ if (!mPluginLoaded) return NULL; /* Always ensure that the index is initialized before * calls to ::get */ if (!mIndex.initiated) initializeIndex (base); /* If pluginClassHandlerIndex == mIndex.pcIndex it means that our * mIndex.index is fresh and can be used directly without needing * to fetch it from ValueHolder */ if (mIndex.initiated && pluginClassHandlerIndex == mIndex.pcIndex) return getInstance (base); /* If allocating or getting the updated index failed at any point * then just return NULL we don't know where our private data is stored */ if (mIndex.failed && pluginClassHandlerIndex == mIndex.pcIndex) return NULL; if (ValueHolder::Default ()->hasValue (keyName ())) { mIndex.index = ValueHolder::Default ()->getValue (keyName ()).uval; mIndex.initiated = true; mIndex.failed = false; mIndex.pcIndex = pluginClassHandlerIndex; return getInstance (base); } else { mIndex.initiated = false; mIndex.failed = true; mIndex.pcIndex = pluginClassHandlerIndex; return NULL; } } template void PluginClassHandler::allowInstantiations () { mPluginLoaded = true; } template void PluginClassHandler::disallowInstantiations () { mPluginLoaded = false; } #endif compiz-0.9.11+14.04.20140409/src/pluginclasshandler/include/core/pluginclasses.h0000644000015301777760000000424212321343002027545 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _PLUGINCLASSES_H #define _PLUGINCLASSES_H #include /** * Represents the index of a plugin's object classes */ class PluginClassIndex { public: PluginClassIndex () : index ((unsigned)~0), refCount (0), initiated (false), failed (false), pcFailed (false), pcIndex (0) {} unsigned int index; int refCount; bool initiated; bool failed; bool pcFailed; unsigned int pcIndex; }; /** * Represents some storage of a plugin class on a core object, * usually some pointer (void *) */ class PluginClassStorage { public: typedef std::vector Indices; public: PluginClassStorage (Indices& iList); public: std::vector pluginClasses; protected: static unsigned int allocatePluginClassIndex (Indices& iList); static void freePluginClassIndex (Indices& iList, unsigned int idx); }; #endif compiz-0.9.11+14.04.20140409/src/outputdevices.cpp0000644000015301777760000001206412321343002021673 0ustar pbusernogroup00000000000000/* * Compiz Core: OutputDevices class * * Copyright (c) 2012 Canonical Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include "outputdevices.h" #include "core_options.h" namespace compiz { namespace core { OutputDevices::OutputDevices () : outputDevs (), overlappingOutputs (false), currentOutputDev (0) { } void OutputDevices::setGeometryOnDevice (unsigned int const nOutput, int x, int y, const int width, const int height) { if (outputDevs.size() < nOutput + 1) outputDevs.resize (nOutput + 1); outputDevs[nOutput].setGeometry (x, y, width, height); } void OutputDevices::adoptDevices (unsigned int nOutput, CompSize *screen) { /* make sure we have at least one output */ if (!nOutput) { setGeometryOnDevice (nOutput, 0, 0, screen->width (), screen->height ()); ++nOutput; } if (outputDevs.size () > nOutput) outputDevs.resize (nOutput); char str[10]; /* set name, width, height and update rect pointers in all regions */ for (unsigned int i = 0; i < nOutput; ++i) { snprintf(str, 10, "Output %u", i); outputDevs[i].setId (str, i); } overlappingOutputs = false; setCurrentOutput (currentOutputDev); for (unsigned int i = 0; i < nOutput - 1; ++i) for (unsigned int j = i + 1; j < nOutput; ++j) if (outputDevs[i].intersects (outputDevs[j])) overlappingOutputs = true; } void OutputDevices::setCurrentOutput (unsigned int outputNum) { if (outputNum >= outputDevs.size ()) outputNum = 0; currentOutputDev = outputNum; } int OutputDevices::outputDeviceForGeometry (const CompWindow::Geometry &gm, int strategy, CompSize *screen) const { if (outputDevs.size () == 1) return 0; int overlapAreas[outputDevs.size ()]; int highest, seen, highestScore; unsigned int i; CompRect geomRect, overlap; if (strategy == CoreOptions::OverlappingOutputsSmartMode) { /* We're only going to use geomRect for overlapping area calculations, so the window rectangle is enough. We don't need to consider anything more like the border because it will never be significant to the result */ geomRect = gm; } else { /* for biggest/smallest modes, only use the window center to determine the correct output device */ int x = (gm.x () + (gm.width () / 2) + gm.border ()) % screen->width (); if (x < 0) x += screen->width (); int y = (gm.y () + (gm.height () / 2) + gm.border ()) % screen->height (); if (y < 0) y += screen->height (); geomRect.setGeometry (x, y, 1, 1); } /* get amount of overlap on all output devices */ for (i = 0; i < outputDevs.size (); ++i) { overlap = outputDevs[i] & geomRect; overlapAreas[i] = overlap.area (); } /* find output with largest overlap */ for (i = 0, highest = 0, highestScore = 0; i < outputDevs.size (); ++i) { if (overlapAreas[i] > highestScore) { highest = i; highestScore = overlapAreas[i]; } } /* look if the highest score is unique */ for (i = 0, seen = 0; i < outputDevs.size (); ++i) if (overlapAreas[i] == highestScore) ++seen; if (seen > 1) { /* it's not unique, select one output of the matching ones and use the user preferred strategy for that */ unsigned int currentSize, bestOutputSize; bool bestFit; bool searchLargest = (strategy != CoreOptions::OverlappingOutputsPreferSmallerOutput); if (searchLargest) bestOutputSize = 0; else bestOutputSize = UINT_MAX; for (i = 0, highest = 0; i < outputDevs.size (); ++i) { if (overlapAreas[i] == highestScore) { currentSize = outputDevs[i].area (); if (searchLargest) bestFit = (currentSize > bestOutputSize); else bestFit = (currentSize < bestOutputSize); if (bestFit) { highest = i; bestOutputSize = currentSize; } } } } return highest; } } // namespace core } // namespace compiz compiz-0.9.11+14.04.20140409/include/0000755000015301777760000000000012321344021017117 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/include/core/0000755000015301777760000000000012321344021020047 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/include/core/wrapsystem.h0000644000015301777760000001346312321343002022443 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _COMPWRAPSYSTEM_H_ #define _COMPWRAPSYSTEM_H_ #include #include #include #define WRAPABLE_DEF(func, ...) \ { \ mHandler-> func ## SetEnabled (this, false); \ return mHandler-> func (__VA_ARGS__); \ } #define WRAPABLE_HND(num, itype, rtype, func, ...) \ WRAPABLE_HND_ANY(num, itype, rtype, func,, __VA_ARGS__) #define WRAPABLE_HND_CONST(num, itype, rtype, func, ...) \ WRAPABLE_HND_ANY(num, itype, rtype, func, const, __VA_ARGS__) #define WRAPABLE_HND_ANY(num, itype, rtype, func, cons, ...) \ rtype func (__VA_ARGS__) cons; \ void func ## SetEnabled (cons itype *obj, bool enabled) \ { \ functionSetEnabled ((itype*)obj, num, enabled); \ } \ unsigned int func ## GetCurrentIndex () const \ { \ return mCurrFunction[num]; \ } \ void func ## SetCurrentIndex (unsigned int index) \ { \ mCurrFunction[num] = index; \ } \ enum { func ## Index = num }; // For compatability ignore num and forward #define WRAPABLE_HND_FUNC(num, func, ...) \ WRAPABLE_HND_FUNCTN(func, __VA_ARGS__) // New macro that doesn't need magic number #define WRAPABLE_HND_FUNCTN(func, ...) \ { \ enum { num = func ## Index }; \ unsigned int curr = mCurrFunction[num]; \ while (mCurrFunction[num] < mInterface.size () && \ !mInterface[mCurrFunction[num]].enabled[num]) \ ++mCurrFunction[num]; \ if (mCurrFunction[num] < mInterface.size ()) \ { \ mInterface[mCurrFunction[num]++].obj-> func (__VA_ARGS__); \ mCurrFunction[num] = curr; \ return; \ } \ mCurrFunction[num] = curr; \ } // For compatability ignore num and forward #define WRAPABLE_HND_FUNC_RETURN(num, rtype, func, ...) \ WRAPABLE_HND_FUNCTN_RETURN(rtype, func, __VA_ARGS__) // New macro that doesn't need magic number #define WRAPABLE_HND_FUNCTN_RETURN(rtype, func, ...) \ { \ enum { num = func ## Index }; \ unsigned int curr = mCurrFunction[num]; \ while (mCurrFunction[num] < mInterface.size () && \ !mInterface[mCurrFunction[num]].enabled[num]) \ ++mCurrFunction[num]; \ if (mCurrFunction[num] < mInterface.size ()) \ { \ rtype rv = mInterface[mCurrFunction[num]++].obj-> func (__VA_ARGS__); \ mCurrFunction[num] = curr; \ return rv; \ } \ mCurrFunction[num] = curr; \ } template class WrapableInterface { protected: WrapableInterface () : mHandler (0) {} virtual ~WrapableInterface () { if (mHandler) mHandler->unregisterWrap (static_cast (this)); } void setHandler (T *handler, bool enabled = true) { if (mHandler) mHandler->unregisterWrap (static_cast (this)); if (handler) handler->registerWrap (static_cast (this), enabled); mHandler = handler; } T *mHandler; }; template class WrapableHandler : public T { public: void registerWrap (T *, bool); void unregisterWrap (T *); unsigned int numWrapClients () { return mInterface.size (); } protected: struct Interface { Interface(T *obj, bool enable) : obj(obj) { std::fill_n(this->enabled, N, enable); } T *obj; bool enabled[N]; }; WrapableHandler () : mInterface () { std::fill_n(mCurrFunction, N, 0); } ~WrapableHandler () { mInterface.clear (); } void functionSetEnabled (T *, unsigned int, bool); mutable unsigned int mCurrFunction[N]; std::vector mInterface; }; template void WrapableHandler::registerWrap (T *obj, bool enabled) { mInterface.insert (mInterface.begin (), Interface(obj, enabled)); } template void WrapableHandler::unregisterWrap (T *obj) { typedef typename std::vector::iterator iterator; for (iterator it = mInterface.begin (); it != mInterface.end (); ++it) { if (it->obj == obj) { mInterface.erase (it); break; } } } template void WrapableHandler::functionSetEnabled (T *obj, unsigned int num, bool enabled) { typedef typename std::vector::iterator iterator; for (iterator it = mInterface.begin (); it != mInterface.end (); ++it) { if (it->obj == obj) { it->enabled[num] = enabled; break; } } } #endif compiz-0.9.11+14.04.20140409/include/core/logmessage.h0000644000015301777760000000321612321343002022346 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_LOGMESSAGE_H #define _COMPIZ_LOGMESSAGE_H typedef enum { CompLogLevelFatal = 0, CompLogLevelError, CompLogLevelWarn, CompLogLevelInfo, CompLogLevelDebug } CompLogLevel; void logMessage (const char *componentName, CompLogLevel level, const char *message); void compLogMessage (const char *componentName, CompLogLevel level, const char *format, ...); const char * logLevelToString (CompLogLevel level); #endif compiz-0.9.11+14.04.20140409/include/core/plugin.h0000644000015301777760000003011212321343002021511 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_PLUGIN_H #define _COMPIZ_PLUGIN_H #include #include #include #include #include #include class CompScreen; extern CompScreen *screen; #include #define HOME_PLUGINDIR ".compiz-1/plugins" #define COMPIZ_PLUGIN_20090315(name, classname) \ CompPlugin::VTable * name##VTable = NULL; \ extern "C" { \ CompPlugin::VTable * getCompPluginVTable20090315_##name () \ { \ if (!name##VTable) \ { \ name##VTable = new classname (); \ name##VTable->initVTable (TOSTRING (name), &name##VTable);\ return name##VTable; \ } \ else \ return name##VTable; \ } \ } class CompPlugin; class CompWindow; typedef bool (*LoadPluginProc) (CompPlugin *p, const char *path, const char *name); typedef void (*UnloadPluginProc) (CompPlugin *p); typedef CompStringList (*ListPluginsProc) (const char *path); extern LoadPluginProc loaderLoadPlugin; extern UnloadPluginProc loaderUnloadPlugin; extern ListPluginsProc loaderListPlugins; namespace compiz { namespace plugin { namespace internal { class VTableBase; /** * Provide a definition for PluginKey, with a protected * constructor which is a friend of VTableBase */ class PluginKey { protected: PluginKey () {} friend class VTableBase; }; class VTableBase : public PluginKey { public: virtual ~VTableBase () {}; }; } } } /** * Base plug-in interface for Compiz. All plugins must implement this * interface, which provides basics for loading, unloading, options, * and linking together the plugin and Screen(s). */ class CompPlugin { public: class VTable : public compiz::plugin::internal::VTableBase { public: VTable (); virtual ~VTable (); void initVTable (CompString name, CompPlugin::VTable **self = NULL); /** * Gets the name of this compiz plugin */ const CompString &name () const; virtual bool init () = 0; virtual void fini (); /* Mark the plugin as ready to be instantiated */ virtual void markReadyToInstantiate () = 0; /* Mark the plugin as disallowing further instantiation */ virtual void markNoFurtherInstantiation () = 0; virtual bool initScreen (CompScreen *s); virtual void finiScreen (CompScreen *s); virtual bool initWindow (CompWindow *w); virtual void finiWindow (CompWindow *w); virtual CompOption::Vector & getOptions (); virtual bool setOption (const CompString &name, CompOption::Value &value); virtual CompAction::Vector & getActions (); private: CompString mName; VTable **mSelf; }; /** * TODO (or not?) */ template class VTableForScreenAndWindow : public VTable { public: bool initScreen (CompScreen *s); void finiScreen (CompScreen *s); bool initWindow (CompWindow *w); void finiWindow (CompWindow *w); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); CompAction::Vector & getActions (); private: /* Mark the plugin as ready to be instantiated */ void markReadyToInstantiate (); /* Mark the plugin as disallowing further instantiation */ void markNoFurtherInstantiation (); }; /** * TODO (or not?) */ template class VTableForScreen : public VTable { public: bool initScreen (CompScreen *s); void finiScreen (CompScreen *s); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); CompAction::Vector & getActions (); private: /* Mark the plugin as ready to be instantiated */ void markReadyToInstantiate (); /* Mark the plugin as disallowing further instantiation */ void markNoFurtherInstantiation (); }; typedef std::map Map; typedef std::list List; public: CompPrivate devPrivate; CompString devType; VTable *vTable; public: static bool screenInitPlugins (CompScreen *s); static void screenFiniPlugins (CompScreen *s); static bool windowInitPlugins (CompWindow *w); static void windowFiniPlugins (CompWindow *w); /** * Finds a plugin by name. (TODO Does it have to be loaded?) */ static CompPlugin *find (const char *name); /** * Load a compiz plugin. Loading a plugin that has * already been loaded will return the existing instance. */ static CompPlugin *load (const char *plugin); /** * Unload a compiz plugin. Unloading a plugin multiple times has no * effect, and you can't unload a plugin that hasn't been loaded already * with CompPlugin::load() */ static void unload (CompPlugin *p); /** * Adds a plugin onto the working set of active plugins. If the plugin fails to initPlugin * this will return false and the plugin will not be added to the working set. */ static bool push (CompPlugin *p); /** * Removes the last activated plugin with CompPlugin::push() and returns * the removed plugin, or NULL if there was none. */ static CompPlugin *pop (void); /** * Gets a list of the working set of plugins that have been CompPlugin::push() but not * CompPlugin::pop()'d. */ static List & getPlugins (); /** * Gets the Application Binary Interface (ABI) version of a (un)loaded plugin. */ static int getPluginABI (const char *name); /** * Verifies a signature to ensure that the plugin conforms to the Application Binary * Interface (ABI) */ static bool checkPluginABI (const char *name, int abi); }; /** * Mark the plugin class handlers as ready to be initialized */ template void CompPlugin::VTableForScreenAndWindow::markReadyToInstantiate () { namespace cpi = compiz::plugin::internal; typedef typename T::ClassPluginBaseType ScreenBase; typedef typename T2::ClassPluginBaseType WindowBase; typedef cpi::LoadedPluginClassBridge ScreenBridge; typedef cpi::LoadedPluginClassBridge WindowBridge; ScreenBridge::allowInstantiations (*this); WindowBridge::allowInstantiations (*this); } /** * Allow no further class handler initialization */ template void CompPlugin::VTableForScreenAndWindow::markNoFurtherInstantiation () { namespace cpi = compiz::plugin::internal; typedef typename T::ClassPluginBaseType ScreenBase; typedef typename T2::ClassPluginBaseType WindowBase; typedef cpi::LoadedPluginClassBridge ScreenBridge; typedef cpi::LoadedPluginClassBridge WindowBridge; ScreenBridge::disallowInstantiations (*this); WindowBridge::disallowInstantiations (*this); } template bool CompPlugin::VTableForScreenAndWindow::initScreen (CompScreen *s) { T * ps = T::get (s); if (!ps) return false; return true; } template void CompPlugin::VTableForScreenAndWindow::finiScreen (CompScreen *s) { T * ps = T::get (s); delete ps; } template bool CompPlugin::VTableForScreenAndWindow::initWindow (CompWindow *w) { T2 * pw = T2::get (w); if (!pw) return false; return true; } template void CompPlugin::VTableForScreenAndWindow::finiWindow (CompWindow *w) { T2 * pw = T2::get (w); delete pw; } template CompOption::Vector & CompPlugin::VTableForScreenAndWindow::getOptions () { CompOption::Class *oc = dynamic_cast (T::get (screen)); if (!oc) return noOptions (); return oc->getOptions (); } template bool CompPlugin::VTableForScreenAndWindow::setOption (const CompString &name, CompOption::Value &value) { CompOption::Class *oc = dynamic_cast (T::get (screen)); if (!oc) return false; return oc->setOption (name, value); } template CompAction::Vector & CompPlugin::VTableForScreenAndWindow::getActions () { CompAction::Container *ac = dynamic_cast (T::get (screen)); if (!ac) return noActions (); return ac->getActions (); } /** * Mark the plugin class handlers as ready to be initialized */ template void CompPlugin::VTableForScreen::markReadyToInstantiate () { namespace cpi = compiz::plugin::internal; typedef typename T::ClassPluginBaseType ScreenBase; typedef cpi::LoadedPluginClassBridge ScreenBridge; ScreenBridge::allowInstantiations (*this); } /** * Allow no further class handler initialization */ template void CompPlugin::VTableForScreen::markNoFurtherInstantiation () { namespace cpi = compiz::plugin::internal; typedef typename T::ClassPluginBaseType ScreenBase; typedef cpi::LoadedPluginClassBridge ScreenBridge; ScreenBridge::disallowInstantiations (*this); } template bool CompPlugin::VTableForScreen::initScreen (CompScreen *s) { T * ps = new T (s); if (ps->loadFailed ()) { delete ps; return false; } return true; } template void CompPlugin::VTableForScreen::finiScreen (CompScreen *s) { T * ps = T::get (s); delete ps; } template CompOption::Vector & CompPlugin::VTableForScreen::getOptions () { CompOption::Class *oc = dynamic_cast (T::get (screen)); if (!oc) return noOptions (); return oc->getOptions (); } template bool CompPlugin::VTableForScreen::setOption (const CompString &name, CompOption::Value &value) { CompOption::Class *oc = dynamic_cast (T::get (screen)); if (!oc) return false; return oc->setOption (name, value); } template CompAction::Vector & CompPlugin::VTableForScreen::getActions () { CompAction::Container *ac = dynamic_cast (T::get (screen)); if (!ac) return noActions (); return ac->getActions (); } typedef CompPlugin::VTable *(*PluginGetInfoProc) (void); #endif compiz-0.9.11+14.04.20140409/include/core/countedlist.h0000644000015301777760000000577312321343002022567 0ustar pbusernogroup00000000000000/* * countedlist.h * * Created on: Dec 15, 2009 * Author: erkin */ #ifndef COUNTEDLIST_H_ #define COUNTEDLIST_H_ #include template > class CountedList : protected std::list { public: typedef std::list Base; typedef typename Base::size_type size_type; typedef typename Base::iterator iterator; typedef typename Base::const_iterator const_iterator; typedef typename Base::reverse_iterator reverse_iterator; typedef typename Base::const_reverse_iterator const_reverse_iterator; typedef typename Base::reference reference; typedef typename Base::const_reference const_reference; CountedList () : Base (), mCount (0) { } // Overriden std::list methods bool empty () const { return Base::empty (); } size_type size () const { return mCount; } size_type max_size() const { return Base::max_size(); } iterator begin () { return Base::begin (); } const_iterator begin () const { return Base::begin (); } iterator end () { return Base::end (); } const_iterator end () const { return Base::end (); } reverse_iterator rbegin () { return Base::rbegin (); } const_reverse_iterator rbegin () const { return Base::rbegin (); } reverse_iterator rend () { return Base::rend (); } const_reverse_iterator rend () const { return Base::rend (); } reference front () { return Base::front (); } const_reference front () const { return Base::front (); } reference back () { return Base::back (); } const_reference back () const { return Base::back (); } void reverse () { Base::reverse (); } void sort () { Base::sort (); } template void sort(_StrictWeakOrdering __comp) { Base::sort (__comp); } void resize (size_type __new_size, value_type __x = value_type ()) { mCount = __new_size; Base::resize (__new_size, __x); } void clear () { mCount = 0; Base::clear (); } void push_front (const value_type& __x) { ++mCount; Base::push_front (__x); } void push_back (const value_type& __x) { ++mCount; Base::push_back (__x); } void pop_front () { if (mCount > 0) --mCount; Base::pop_front (); } void pop_back () { if (mCount > 0) --mCount; Base::pop_back (); } iterator insert (iterator __position, const value_type& __x) { ++mCount; return Base::insert (__position, __x); } void insert (iterator __position, size_type __n, const value_type& __x) { mCount += __n; Base::insert (__position, __n, __x); } iterator erase (iterator __position) { if (mCount > 0) --mCount; return Base::erase (__position); } void remove (const value_type& __value) { if (mCount > 0) --mCount; Base::remove (__value); } protected: size_type mCount; }; #endif /* COUNTEDLIST_H_ */ compiz-0.9.11+14.04.20140409/include/core/templates.h0000644000015301777760000000057712321343002022225 0ustar pbusernogroup00000000000000#ifndef _COMPIZ_TEMPLATES_H #define _COMPIZ_TEMPLATES_H #ifdef __GXX_EXPERIMENTAL_CXX0X__ // Compiz core is built for C++98. If you're not then get your own templates... #define COMPIZ_EXTERN_STD(_c) #else #define COMPIZ_EXTERN_STD(_c) extern template class std::_c; #endif // Non-std templates are unaffected by C++0x #define COMPIZ_EXTERN(_c) extern template class _c; #endif compiz-0.9.11+14.04.20140409/include/core/global.h0000644000015301777760000000272112321343002021460 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_GLOBAL_H #define _COMPIZ_GLOBAL_H /** * Flag indicating whether to produce debug output */ extern bool debugOutput; extern bool synchronousX; extern char *programName; extern char **programArgv; extern int programArgc; #endif // _COMPIZ_GLOBAL_H compiz-0.9.11+14.04.20140409/include/core/size.h0000644000015301777760000000364012321343002021173 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _COMPSIZE_H #define _COMPSIZE_H /** * A 2D size (likely in screen space) that can only be mutated with set() methods, * since it'd data members are private. */ class CompSize { public: CompSize (); CompSize (int, int); int width () const; int height () const; void setWidth (int); void setHeight (int); bool operator== (const CompSize &other) const { return (this->mWidth == other.mWidth && this->mHeight == other.mHeight); } bool operator!= (const CompSize &other) const { return !(*this == other); } private: int mWidth, mHeight; }; inline int CompSize::width () const { return mWidth; } inline int CompSize::height () const { return mHeight; } #endif compiz-0.9.11+14.04.20140409/include/core/session.h0000644000015301777760000000314112321343002021700 0ustar pbusernogroup00000000000000/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Radek Doulik */ #ifndef _COMPSESSION_H #define _COMPSESSION_H #define SN_API_NOT_YET_FROZEN #include #include namespace CompSession { enum Event { EventSaveYourself = 0, EventSaveComplete, EventDie, EventShutdownCancelled }; enum ClientIdType { ClientId = 0, PrevClientId }; void init (char *prevClientId); void close (); CompString getClientId (ClientIdType type); }; #endif compiz-0.9.11+14.04.20140409/include/core/window.h0000644000015301777760000004005412321343002021530 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPWINDOW_H #define _COMPWINDOW_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class CompWindow; class CompIcon; class PrivateWindow; struct CompStartupSequence; namespace compiz { namespace window { namespace configure_buffers { class Releasable; typedef boost::shared_ptr ReleasablePtr; } } namespace private_screen { class Ping; class GrabManager; class OutputDevices; class WindowManager; class StartupSequence; } } #define ROOTPARENT(x) (((x)->frame ()) ? (x)->frame () : (x)->id ()) #define CompWindowProtocolDeleteMask (1 << 0) #define CompWindowProtocolTakeFocusMask (1 << 1) #define CompWindowProtocolPingMask (1 << 2) #define CompWindowProtocolSyncRequestMask (1 << 3) #define CompWindowTypeDesktopMask (1 << 0) #define CompWindowTypeDockMask (1 << 1) #define CompWindowTypeToolbarMask (1 << 2) #define CompWindowTypeMenuMask (1 << 3) #define CompWindowTypeUtilMask (1 << 4) #define CompWindowTypeSplashMask (1 << 5) #define CompWindowTypeDialogMask (1 << 6) #define CompWindowTypeNormalMask (1 << 7) #define CompWindowTypeDropdownMenuMask (1 << 8) #define CompWindowTypePopupMenuMask (1 << 9) #define CompWindowTypeTooltipMask (1 << 10) #define CompWindowTypeNotificationMask (1 << 11) #define CompWindowTypeComboMask (1 << 12) #define CompWindowTypeDndMask (1 << 13) #define CompWindowTypeModalDialogMask (1 << 14) #define CompWindowTypeFullscreenMask (1 << 15) #define CompWindowTypeUnknownMask (1 << 16) #define NO_FOCUS_MASK (CompWindowTypeDesktopMask | \ CompWindowTypeDockMask | \ CompWindowTypeSplashMask) #define CompWindowStateModalMask (1 << 0) #define CompWindowStateStickyMask (1 << 1) #define CompWindowStateMaximizedVertMask (1 << 2) #define CompWindowStateMaximizedHorzMask (1 << 3) #define CompWindowStateShadedMask (1 << 4) #define CompWindowStateSkipTaskbarMask (1 << 5) #define CompWindowStateSkipPagerMask (1 << 6) #define CompWindowStateHiddenMask (1 << 7) #define CompWindowStateFullscreenMask (1 << 8) #define CompWindowStateAboveMask (1 << 9) #define CompWindowStateBelowMask (1 << 10) #define CompWindowStateDemandsAttentionMask (1 << 11) #define CompWindowStateDisplayModalMask (1 << 12) #define CompWindowStateFocusedMask (1 << 13) #define MAXIMIZE_STATE (CompWindowStateMaximizedHorzMask | \ CompWindowStateMaximizedVertMask) #define CompWindowActionMoveMask (1 << 0) #define CompWindowActionResizeMask (1 << 1) #define CompWindowActionStickMask (1 << 2) #define CompWindowActionMinimizeMask (1 << 3) #define CompWindowActionMaximizeHorzMask (1 << 4) #define CompWindowActionMaximizeVertMask (1 << 5) #define CompWindowActionFullscreenMask (1 << 6) #define CompWindowActionCloseMask (1 << 7) #define CompWindowActionShadeMask (1 << 8) #define CompWindowActionChangeDesktopMask (1 << 9) #define CompWindowActionAboveMask (1 << 10) #define CompWindowActionBelowMask (1 << 11) #define MwmFuncAll (1L << 0) #define MwmFuncResize (1L << 1) #define MwmFuncMove (1L << 2) #define MwmFuncIconify (1L << 3) #define MwmFuncMaximize (1L << 4) #define MwmFuncClose (1L << 5) #define MwmDecorHandle (1L << 2) #define MwmDecorTitle (1L << 3) #define MwmDecorMenu (1L << 4) #define MwmDecorMinimize (1L << 5) #define MwmDecorMaximize (1L << 6) #define MwmDecorAll (1L << 0) #define MwmDecorBorder (1L << 1) #define MwmDecorHandle (1L << 2) #define MwmDecorTitle (1L << 3) #define MwmDecorMenu (1L << 4) #define MwmDecorMinimize (1L << 5) #define MwmDecorMaximize (1L << 6) #define WmMoveResizeSizeTopLeft 0 #define WmMoveResizeSizeTop 1 #define WmMoveResizeSizeTopRight 2 #define WmMoveResizeSizeRight 3 #define WmMoveResizeSizeBottomRight 4 #define WmMoveResizeSizeBottom 5 #define WmMoveResizeSizeBottomLeft 6 #define WmMoveResizeSizeLeft 7 #define WmMoveResizeMove 8 #define WmMoveResizeSizeKeyboard 9 #define WmMoveResizeMoveKeyboard 10 #define WmMoveResizeCancel 11 /* EWMH source indication client types */ #define ClientTypeUnknown 0 #define ClientTypeApplication 1 #define ClientTypePager 2 #define CompWindowGrabKeyMask (1 << 0) #define CompWindowGrabButtonMask (1 << 1) #define CompWindowGrabMoveMask (1 << 2) #define CompWindowGrabResizeMask (1 << 3) #define CompWindowGrabExternalAppMask (1 << 4) /** * Enumeration value which represents * how a window will be stacked by compiz */ enum CompStackingUpdateMode { CompStackingUpdateModeNone = 0, CompStackingUpdateModeNormal, CompStackingUpdateModeAboveFullscreen, CompStackingUpdateModeInitialMap, CompStackingUpdateModeInitialMapDeniedFocus }; /** * Enumeration value used by CompWindow::windowNotify * which specifies the type of event that occured. */ enum CompWindowNotify { CompWindowNotifyMap, CompWindowNotifyUnmap, CompWindowNotifyRestack, CompWindowNotifyHide, CompWindowNotifyShow, CompWindowNotifyAliveChanged, CompWindowNotifySyncAlarm, CompWindowNotifyReparent, CompWindowNotifyUnreparent, CompWindowNotifyFrameUpdate, CompWindowNotifyFocusChange, CompWindowNotifyBeforeUnmap, CompWindowNotifyBeforeDestroy, CompWindowNotifyClose, CompWindowNotifyMinimize, CompWindowNotifyUnminimize, CompWindowNotifyShade, CompWindowNotifyUnshade, CompWindowNotifyEnterShowDesktopMode, CompWindowNotifyLeaveShowDesktopMode, CompWindowNotifyBeforeMap }; /** * Specifies the left, right, top and bottom positions of a window's * geometry */ typedef compiz::window::extents::Extents CompWindowExtents; namespace compiz { namespace window { unsigned int fillStateData (unsigned int state, Atom *data); } } /** * Specifies the area of the screen taken up by strut windows */ struct CompStruts { XRectangle left; XRectangle right; XRectangle top; XRectangle bottom; }; class WindowInterface; extern template class WrapableInterface; /** * Wrappable core window functions. Derive from this class * and overload these functions in order to have your function called * after a core CompWindow function is called with the same name. */ class WindowInterface : public WrapableInterface { public: virtual void getOutputExtents (CompWindowExtents& output); virtual void getAllowedActions (unsigned int &setActions, unsigned int &clearActions); virtual bool focus (); virtual void activate (); virtual bool place (CompPoint &pos); virtual void validateResizeRequest (unsigned int &mask, XWindowChanges *xwc, unsigned int source); virtual void resizeNotify (int dx, int dy, int dwidth, int dheight); virtual void moveNotify (int dx, int dy, bool immediate); virtual void windowNotify (CompWindowNotify n); virtual void grabNotify (int x, int y, unsigned int state, unsigned int mask); virtual void ungrabNotify (); virtual void stateChangeNotify (unsigned int lastState); virtual void updateFrameRegion (CompRegion ®ion); virtual void minimize (); virtual void unminimize (); virtual bool minimized () const; virtual bool alpha () const; virtual bool isFocussable () const; virtual bool managed () const; virtual bool focused () const; }; /** * An Window object that wraps an X window. This handles snychronization of * window state, geometry, etc. between Compiz and the X server. */ class CompWindow : public WrapableHandler, public PluginClassStorage { public: typedef compiz::window::Geometry Geometry; typedef boost::function ForEach; typedef std::map Map; public: CompWindow *next; CompWindow *prev; CompWindow *serverNext; CompWindow *serverPrev; public: ~CompWindow (); /** * Geometry retrieved from the * last ConfigureNotify event received */ const Geometry & geometry () const; int x () const; int y () const; CompPoint pos () const; /* With border */ int width () const; int height () const; CompSize size () const; /** * Geometry last sent to the server */ const Geometry & serverGeometry () const; int serverX () const; int serverY () const; CompPoint serverPos () const; /* With border */ int serverWidth () const; int serverHeight () const; const CompSize serverSize () const; /* effective decoration extents */ CompRect borderRect () const; CompRect serverBorderRect () const; /* frame window geometry */ CompRect inputRect () const; CompRect serverInputRect () const; /* includes decorations and shadows */ CompRect outputRect () const; CompRect serverOutputRect () const; Window id () const; Window frame () const; CompString resName () const; const CompRegion & region () const; const CompRegion & frameRegion () const; void updateFrameRegion (); void setWindowFrameExtents (const CompWindowExtents *border, const CompWindowExtents *frame = NULL); unsigned int & wmType () const; unsigned int type () const; unsigned int & state () const; unsigned int actions () const; unsigned int & protocols () const; void close (Time serverTime); bool inShowDesktopMode () const; void setShowDesktopMode (bool); bool grabbed () const; int pendingMaps () const; unsigned int activeNum () const; int mapNum () const; int & saveMask () const; XWindowChanges & saveWc (); void moveToViewportPosition (int x, int y, bool sync); const char * startupId () const; unsigned int desktop () const; Window clientLeader (bool checkAncestor = false) const; void changeState (unsigned int newState); void recalcActions (); void recalcType (); void updateWindowOutputExtents (); void destroy (); void sendConfigureNotify (); void sendSyncRequest (); XSyncAlarm syncAlarm () const; void map (); void unmap (); void incrementUnmapReference (); void incrementDestroyReference (); bool hasUnmapReference () const; bool resize (XWindowAttributes); bool resize (Geometry); bool resize (int x, int y, int width, int height, int border = 0); void move (int dx, int dy, bool immediate = true); void moveInputFocusTo (); void moveInputFocusToOtherWindow (); /* wraps XConfigureWindow and updates serverGeometry */ void configureXWindow (unsigned int valueMask, XWindowChanges *xwc); void restackAndConfigureXWindow (unsigned int valueMask, XWindowChanges *xwc, const ServerLock &lock); void moveResize (XWindowChanges *xwc, unsigned int xwcm, int gravity, unsigned int source); void raise (); void lower (); void restackAbove (CompWindow *sibling); void restackBelow (CompWindow *sibling); void updateAttributes (CompStackingUpdateMode stackingMode); void hide (); void show (); void maximize (unsigned int state = 0); CompPoint defaultViewport () const; const CompPoint & initialViewport () const; CompIcon * getIcon (int width, int height); const CompRect & iconGeometry () const; int outputDevice () const; void setDesktop (unsigned int desktop); bool onCurrentDesktop () const; bool onAllViewports () const; CompPoint getMovementForOffset (const CompPoint &offset) const; Window transientFor () const; int pendingUnmaps () const; bool placed () const; bool shaded () const; const CompWindowExtents & border () const; const CompWindowExtents & input () const; const CompWindowExtents & output () const; // FIXME: This should return a const reference but grid needs fixing... XSizeHints & sizeHints () const; bool destroyed () const; bool invisible () const; bool syncWait () const; bool alive () const; bool moved () const; bool overrideRedirect () const; bool isMapped () const; bool isViewable () const; int windowClass () const; unsigned int depth () const; unsigned int mwmDecor () const; unsigned int mwmFunc () const; bool constrainNewWindowSize (int width, int height, int *newWidth, int *newHeight); static unsigned int constrainWindowState (unsigned int state, unsigned int actions); static unsigned int allocPluginClassIndex (); static void freePluginClassIndex (unsigned int index); bool updateStruts (); const CompStruts *struts () const; bool queryAttributes (XWindowAttributes &); bool queryFrameAttributes (XWindowAttributes &); compiz::window::configure_buffers::ReleasablePtr obtainLockOnConfigureRequests (); WRAPABLE_HND (0, WindowInterface, void, getOutputExtents, CompWindowExtents&); WRAPABLE_HND (1, WindowInterface, void, getAllowedActions, unsigned int &, unsigned int &); WRAPABLE_HND (2, WindowInterface, bool, focus); WRAPABLE_HND (3, WindowInterface, void, activate); WRAPABLE_HND (4, WindowInterface, bool, place, CompPoint &); WRAPABLE_HND (5, WindowInterface, void, validateResizeRequest, unsigned int &, XWindowChanges *, unsigned int); WRAPABLE_HND (6, WindowInterface, void, resizeNotify, int, int, int, int); WRAPABLE_HND (7, WindowInterface, void, moveNotify, int, int, bool); WRAPABLE_HND (8, WindowInterface, void, windowNotify, CompWindowNotify); WRAPABLE_HND (9, WindowInterface, void, grabNotify, int, int, unsigned int, unsigned int); WRAPABLE_HND (10, WindowInterface, void, ungrabNotify); WRAPABLE_HND (11, WindowInterface, void, stateChangeNotify, unsigned int); WRAPABLE_HND (12, WindowInterface, void, updateFrameRegion, CompRegion &); WRAPABLE_HND (13, WindowInterface, void, minimize); WRAPABLE_HND (14, WindowInterface, void, unminimize); WRAPABLE_HND_CONST (15, WindowInterface, bool, minimized); WRAPABLE_HND_CONST (16, WindowInterface, bool, alpha); WRAPABLE_HND_CONST (17, WindowInterface, bool, isFocussable); WRAPABLE_HND_CONST (18, WindowInterface, bool, managed); WRAPABLE_HND_CONST (19, WindowInterface, bool, focused); friend class PrivateWindow; friend class CompScreenImpl; friend class PrivateScreen; friend class compiz::private_screen::Ping; friend class compiz::private_screen::GrabManager; friend class compiz::private_screen::OutputDevices; friend class compiz::private_screen::WindowManager; friend class compiz::private_screen::StartupSequence; friend class ModifierHandler; friend class CoreWindow; friend class StackDebugger; private: CompWindow (Window aboveId, Window aboveServerId, XWindowAttributes &wa, PrivateWindow *priv); PrivateWindow *priv; }; #endif compiz-0.9.11+14.04.20140409/include/core/abiversion.h0000644000015301777760000000031412321343002022355 0ustar pbusernogroup00000000000000#ifndef COMPIZ_ABIVERSION_H #define COMPIZ_ABIVERSION_H #ifdef CORE_ABIVERSION # error Conflicting definitions of CORE_ABIVERSION #endif #define CORE_ABIVERSION 20140123 #endif // COMPIZ_ABIVERSION_H compiz-0.9.11+14.04.20140409/include/core/modifierhandler.h0000644000015301777760000000557312321343002023364 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman * Sam Spilsbury */ #include /** * Toplevel class which provides access to display * level modifier information */ class ModifierHandler { public: ModifierHandler (); ~ModifierHandler (); typedef enum { Alt = 1, Meta, Super, Hyper, ModeSwitch, NumLock, ScrollLock, ModNum } Modifier; typedef enum { AltMask = (1 << 16), MetaMask = (1 << 17), SuperMask = (1 << 18), HyperMask = (1 << 19), ModeSwitchMask = (1 << 20), NumLockMask = (1 << 21), ScrollLockMask = (1 << 22), NoMask = (1 << 25), } ModMask; public: /** * Takes an X11 Keycode and returns a bitmask * with modifiers that have been pressed */ unsigned int keycodeToModifiers (int keycode); /** * Updates X11 Modifier mappings */ void updateModifierMappings (); /** * Takes a virtual modMask and returns a real modifier mask * by removing unused bits */ unsigned int virtualToRealModMask (unsigned int modMask); /** * Returns a bit modifier mask for a Motifier enum */ unsigned int modMask (Modifier); /** * Returns a const bit modifier mask for what should be ignored */ unsigned int ignoredModMask (); /** * Returns a const XModifierKeymap for compiz */ const XModifierKeymap * modMap (); friend class CompScreenImpl; private: static const unsigned int virtualModMask[7]; static const int maskTable[8]; static const int maskTableSize = 8; ModMask mModMask[ModNum]; unsigned int mIgnoredModMask; XModifierKeymap *mModMap; }; compiz-0.9.11+14.04.20140409/include/core/output.h0000644000015301777760000000426512321343002021565 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPOUTPUT_H #define _COMPOUTPUT_H #include "core/rect.h" #include "core/string.h" #include #include /** * Represents a phisically attached screen in Compiz, where this * phisical screen is part of an X11 screen in a configuration such * as Xinerama, XRandR, TwinView or MergedFB */ class CompOutput : public CompRect { public: CompOutput (); CompString name () const; unsigned int id () const; /** * Returns a "working area" of the screen, which the geometry * which is not covered by strut windows (such as panels) */ const CompRect& workArea () const; void setWorkArea (const CompRect&); void setGeometry (int x, int y, int width, int height); void setId (CompString, unsigned int); typedef std::vector vector; typedef std::list ptrList; private: CompString mName; unsigned int mId; CompRect mWorkArea; }; #endif compiz-0.9.11+14.04.20140409/include/core/string.h0000644000015301777760000000273612321343002021534 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_STRING_H #define _COMPIZ_STRING_H #include #include #include typedef std::string CompString; typedef std::list CompStringList; CompString compPrintf (const char *format, ...); CompString compPrintf (const char *format, va_list ap); #endif compiz-0.9.11+14.04.20140409/include/core/icon.h0000644000015301777760000000357712321343002021162 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPICON_H #define _COMPICON_H #include #include /** * Wraps an application icon pixel map and it's meta information (such as dimensions) */ class CompIcon : boost::noncopyable { public: CompIcon (unsigned width, unsigned int height); ~CompIcon (); int width () const { return mSize.width(); } int height () const { return mSize.height(); } operator CompSize const&() const { return mSize; } /** * Gets a pointer to the pixel data for this icon. */ unsigned char* data (); private: CompSize mSize; unsigned char *mData; }; #endif compiz-0.9.11+14.04.20140409/include/core/match.h0000644000015301777760000000541412321343002021316 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPMATCH_H #define _COMPMATCH_H #include class PrivateMatch; class CompWindow; class CompDisplay; /** * Object which represents a series of window properties * that can be matched in a window. Used for determining which * windows to operate on, in core or in plugins */ class CompMatch { public: /** * TODO */ class Expression { public: virtual ~Expression () {}; virtual bool evaluate (const CompWindow *window) const = 0; }; public: CompMatch (); CompMatch (const CompString); CompMatch (const CompMatch &); ~CompMatch (); static const CompMatch emptyMatch; void update (); /** * Returns true if the specified CompWindow has the properties * specified in the match object */ bool evaluate (const CompWindow *window) const; CompString toString () const; bool isEmpty () const; CompMatch & operator= (const CompMatch &); CompMatch & operator&= (const CompMatch &); CompMatch & operator|= (const CompMatch &); const CompMatch & operator& (const CompMatch &); const CompMatch & operator| (const CompMatch &); const CompMatch & operator! (); CompMatch & operator= (const CompString &); CompMatch & operator&= (const CompString &); CompMatch & operator|= (const CompString &); const CompMatch & operator& (const CompString &); const CompMatch & operator| (const CompString &); bool operator== (const CompMatch &) const; bool operator!= (const CompMatch &) const; private: PrivateMatch *priv; }; #endif compiz-0.9.11+14.04.20140409/include/core/propertywriter.h0000644000015301777760000000352112321343002023340 0ustar pbusernogroup00000000000000/* * Copyright © 2010 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Sam Spilsbury */ #ifndef _COMPPROPERTYWRITER_H #define _COMPPROPERTYWRITER_H #include "core/option.h" #include "core/string.h" #include #include static const CompOption::Vector nilValues; class PropertyWriter { public: PropertyWriter (); PropertyWriter (CompString propName, CompOption::Vector &readTemplate); bool updateProperty (Window, CompOption::Vector &, int); void deleteProperty (Window); const CompOption::Vector & readProperty (Window); void setReadTemplate (const CompOption::Vector &); const CompOption::Vector & getReadTemplate (); private: CompOption::Vector mPropertyValues; Atom mAtom; }; #endif compiz-0.9.11+14.04.20140409/include/core/screen.h0000644000015301777760000003750712321343002021511 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPSCREEN_H #define _COMPSCREEN_H #include #include #include #include #include #include #include #include #include #include class CompScreenImpl; class PrivateScreen; class CompManager; class CoreWindow; class CoreOptions; class ServerGrabInterface; typedef std::list CompWindowList; typedef std::vector CompWindowVector; extern bool replaceCurrentWm; extern bool debugOutput; extern bool sendStartupMessage; extern CompScreen *screen; extern ModifierHandler *modHandler; extern int lastPointerX; extern int lastPointerY; extern unsigned int lastPointerMods; extern int pointerX; extern int pointerY; extern unsigned int pointerMods; #define NOTIFY_CREATE_MASK (1 << 0) #define NOTIFY_DELETE_MASK (1 << 1) #define NOTIFY_MOVE_MASK (1 << 2) #define NOTIFY_MODIFY_MASK (1 << 3) #define SCREEN_EDGE_LEFT 0 #define SCREEN_EDGE_RIGHT 1 #define SCREEN_EDGE_TOP 2 #define SCREEN_EDGE_BOTTOM 3 #define SCREEN_EDGE_TOPLEFT 4 #define SCREEN_EDGE_TOPRIGHT 5 #define SCREEN_EDGE_BOTTOMLEFT 6 #define SCREEN_EDGE_BOTTOMRIGHT 7 #define SCREEN_EDGE_NUM 8 typedef boost::function FdWatchCallBack; typedef boost::function FileWatchCallBack; typedef int CompFileWatchHandle; typedef int CompWatchFdHandle; /** * Information needed to invoke a CallBack when a file changes. */ struct CompFileWatch { CompString path; int mask; FileWatchCallBack callBack; CompFileWatchHandle handle; }; typedef std::list CompFileWatchList; #define ACTIVE_WINDOW_HISTORY_SIZE 64 #define ACTIVE_WINDOW_HISTORY_NUM 32 /** * Information about the last activity with a window. */ struct CompActiveWindowHistory { Window id[ACTIVE_WINDOW_HISTORY_SIZE]; int x; int y; int activeNum; }; class ScreenInterface; extern template class WrapableInterface; /** * Interface to an abstract screen. */ class ScreenInterface : public WrapableInterface { public: virtual void fileWatchAdded (CompFileWatch *fw); virtual void fileWatchRemoved (CompFileWatch *fw); virtual bool initPluginForScreen (CompPlugin *p); virtual void finiPluginForScreen (CompPlugin *p); virtual bool setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &v); virtual void sessionEvent (CompSession::Event event, CompOption::Vector &options); virtual void handleEvent (XEvent *event); virtual void handleCompizEvent (const char * plugin, const char *event, CompOption::Vector &options); virtual bool fileToImage (CompString &path, CompSize &size, int &stride, void *&data); virtual bool imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data); virtual CompMatch::Expression *matchInitExp (const CompString& value); virtual void matchExpHandlerChanged (); virtual void matchPropertyChanged (CompWindow *window); virtual void logMessage (const char *componentName, CompLogLevel level, const char *message); virtual void enterShowDesktopMode (); virtual void leaveShowDesktopMode (CompWindow *window); virtual void outputChangeNotify (); virtual void addSupportedAtoms (std::vector& atoms); }; namespace compiz { namespace private_screen { struct Grab; class EventManager; class Ping; }} namespace compiz { class DesktopWindowCount { public: virtual void incrementDesktopWindowCount() = 0; virtual void decrementDesktopWindowCount() = 0; virtual int desktopWindowCount() = 0; protected: ~DesktopWindowCount() {} }; class MapNum { public: virtual unsigned int nextMapNum() = 0; protected: ~MapNum() {} }; class Ping { public: virtual unsigned int lastPing () const = 0; protected: ~Ping() {} }; class XWindowInfo { public: virtual int getWmState (Window id) = 0; virtual void setWmState (int state, Window id) const = 0; virtual void getMwmHints (Window id, unsigned int *func, unsigned int *decor) const = 0; virtual unsigned int getProtocols (Window id) = 0; virtual unsigned int getWindowType (Window id) = 0; virtual unsigned int getWindowState (Window id) = 0; protected: ~XWindowInfo() {} }; class History { public: virtual unsigned int activeNum () const = 0; virtual CompActiveWindowHistory *currentHistory () = 0; protected: ~History() {} }; } class CompScreen : public WrapableHandler, public PluginClassStorage, // TODO should be an interface here public CompSize, public virtual ::compiz::DesktopWindowCount, public virtual ::compiz::MapNum, public virtual ::compiz::Ping, public virtual ::compiz::XWindowInfo, public virtual ::compiz::History, public CompOption::Class // TODO should be an interface here { public: typedef compiz::private_screen::Grab* GrabHandle; WRAPABLE_HND (0, ScreenInterface, void, fileWatchAdded, CompFileWatch *) WRAPABLE_HND (1, ScreenInterface, void, fileWatchRemoved, CompFileWatch *) WRAPABLE_HND (2, ScreenInterface, bool, initPluginForScreen, CompPlugin *) WRAPABLE_HND (3, ScreenInterface, void, finiPluginForScreen, CompPlugin *) WRAPABLE_HND (4, ScreenInterface, bool, setOptionForPlugin, const char *, const char *, CompOption::Value &) WRAPABLE_HND (5, ScreenInterface, void, sessionEvent, CompSession::Event, CompOption::Vector &) WRAPABLE_HND (6, ScreenInterface, void, handleEvent, XEvent *event) WRAPABLE_HND (7, ScreenInterface, void, handleCompizEvent, const char *, const char *, CompOption::Vector &) WRAPABLE_HND (8, ScreenInterface, bool, fileToImage, CompString &, CompSize &, int &, void *&); WRAPABLE_HND (9, ScreenInterface, bool, imageToFile, CompString &, CompString &, CompSize &, int, void *); WRAPABLE_HND (10, ScreenInterface, CompMatch::Expression *, matchInitExp, const CompString&); WRAPABLE_HND (11, ScreenInterface, void, matchExpHandlerChanged) WRAPABLE_HND (12, ScreenInterface, void, matchPropertyChanged, CompWindow *) WRAPABLE_HND (13, ScreenInterface, void, logMessage, const char *, CompLogLevel, const char*) WRAPABLE_HND (14, ScreenInterface, void, enterShowDesktopMode); WRAPABLE_HND (15, ScreenInterface, void, leaveShowDesktopMode, CompWindow *); WRAPABLE_HND (16, ScreenInterface, void, outputChangeNotify); WRAPABLE_HND (17, ScreenInterface, void, addSupportedAtoms, std::vector& atoms); unsigned int allocPluginClassIndex (); void freePluginClassIndex (unsigned int index); static int checkForError (Display *dpy); // Interface hoisted from CompScreen virtual bool updateDefaultIcon () = 0; virtual Display * dpy () = 0; virtual Window root () = 0; virtual const CompSize & vpSize () const = 0; virtual void forEachWindow (CompWindow::ForEach) =0; virtual CompWindowList & windows () = 0; virtual void moveViewport (int tx, int ty, bool sync) = 0; virtual const CompPoint & vp () const = 0; virtual void updateWorkarea () = 0; virtual bool addAction (CompAction *action) = 0; virtual CompWindow * findWindow (Window id) = 0; virtual CompWindow * findTopLevelWindow ( Window id, bool override_redirect = false) = 0; virtual void toolkitAction ( Atom toolkitAction, Time eventTime, Window window, long data0, long data1, long data2) = 0; virtual unsigned int showingDesktopMask() const = 0; virtual bool grabsEmpty() const = 0; virtual void sizePluginClasses(unsigned int size) = 0; virtual CompOutput::vector & outputDevs () = 0; virtual void setWindowState (unsigned int state, Window id) = 0; virtual bool XShape () = 0; virtual std::vector & screenInfo () = 0; virtual CompWindowList & serverWindows () = 0; virtual void setWindowProp (Window id, Atom property, unsigned int value) = 0; virtual Window activeWindow () = 0; virtual unsigned int currentDesktop () = 0; virtual void focusDefaultWindow () = 0; virtual Time getCurrentTime () = 0; virtual unsigned int getWindowProp (Window id, Atom property, unsigned int defaultValue) = 0; virtual void insertServerWindow (CompWindow *w, Window aboveId) = 0; virtual void insertWindow (CompWindow *w, Window aboveId) = 0; virtual unsigned int nDesktop () = 0; virtual int outputDeviceForGeometry (const CompWindow::Geometry& gm) = 0; virtual int screenNum () = 0; virtual void unhookServerWindow (CompWindow *w) = 0; virtual void unhookWindow (CompWindow *w) = 0; virtual void viewportForGeometry (const CompWindow::Geometry &gm, CompPoint &viewport) = 0; virtual void addToDestroyedWindows(CompWindow * cw) = 0; virtual const CompRect & workArea () const = 0; virtual void removeAction (CompAction *action) = 0; virtual CompOption::Vector & getOptions () = 0; virtual bool setOption (const CompString &name, CompOption::Value &value) = 0; virtual void storeValue (CompString key, CompPrivate value) = 0; virtual bool hasValue (CompString key) = 0; virtual CompPrivate getValue (CompString key) = 0; virtual void eraseValue (CompString key) = 0; virtual CompWatchFdHandle addWatchFd (int fd, short int events, FdWatchCallBack callBack) = 0; virtual void removeWatchFd (CompWatchFdHandle handle) = 0; virtual void eventLoop () = 0; virtual CompFileWatchHandle addFileWatch (const char *path, int mask, FileWatchCallBack callBack) = 0; virtual void removeFileWatch (CompFileWatchHandle handle) = 0; virtual const CompFileWatchList& getFileWatches () const = 0; virtual void updateSupportedWmHints () = 0; virtual CompWindowList & destroyedWindows () = 0; virtual const CompRegion & region () const = 0; virtual bool hasOverlappingOutputs () = 0; virtual CompOutput & fullscreenOutput () = 0; virtual void setWindowProp32 (Window id, Atom property, unsigned short value) = 0; virtual unsigned short getWindowProp32 (Window id, Atom property, unsigned short defaultValue) = 0; virtual bool readImageFromFile (CompString &name, CompString &pname, CompSize &size, void *&data) = 0; virtual XWindowAttributes attrib () = 0; virtual CompIcon *defaultIcon () const = 0; virtual bool otherGrabExist (const char *, ...) = 0; virtual GrabHandle pushGrab (Cursor cursor, const char *name) = 0; virtual void removeGrab (GrabHandle handle, CompPoint *restorePointer) = 0; virtual bool writeImageToFile (CompString &path, const char *format, CompSize &size, void *data) = 0; virtual void runCommand (CompString command) = 0; virtual bool shouldSerializePlugins () = 0; virtual const CompRect & getWorkareaForOutput (unsigned int outputNum) const = 0; virtual CompOutput & currentOutputDev () const = 0; virtual bool grabExist (const char *) = 0; virtual Cursor invisibleCursor () = 0; virtual void sendWindowActivationRequest (Window id) = 0; virtual const CompWindowVector & clientList (bool stackingOrder = true) = 0; virtual int outputDeviceForPoint (const CompPoint &point) = 0; virtual int outputDeviceForPoint (int x, int y) = 0; virtual int xkbEvent () = 0; virtual void warpPointer (int dx, int dy) = 0; virtual void updateGrab (GrabHandle handle, Cursor cursor) = 0; virtual int shapeEvent () = 0; virtual int syncEvent () = 0; virtual Window autoRaiseWindow () = 0; virtual const char * displayString () = 0; virtual CompRect getCurrentOutputExtents () = 0; virtual Cursor normalCursor () = 0; virtual bool grabbed () = 0; virtual SnDisplay * snDisplay () = 0; virtual void processEvents () = 0; virtual void alwaysHandleEvent (XEvent *event) = 0; virtual ServerGrabInterface * serverGrabInterface () = 0; // Replacements for friends accessing priv. They are declared virtual to // ensure the ABI is stable if/when they are moved to CompScreenImpl. // They are only intended for use within compiz-core virtual bool displayInitialised() const = 0; virtual void updatePassiveKeyGrabs () const = 0; virtual void applyStartupProperties (CompWindow *window) = 0; virtual void updateClientList() = 0; virtual CompWindow * getTopWindow() const = 0; virtual CompWindow * getTopServerWindow() const = 0; virtual CoreOptions& getCoreOptions() = 0; virtual Colormap colormap() const = 0; virtual void setCurrentDesktop (unsigned int desktop) = 0; virtual Window activeWindow() const = 0; virtual void updatePassiveButtonGrabs(Window serverFrame) = 0; virtual bool grabWindowIsNot(Window w) const = 0; virtual void incrementPendingDestroys() = 0; virtual void setNextActiveWindow(Window id) = 0; virtual Window getNextActiveWindow() const = 0; virtual CompWindow * focusTopMostWindow () = 0; // End of "internal use only" functions protected: CompScreen(); private: // The "wrapable" functions delegate to these (for mocking) virtual bool _initPluginForScreen(CompPlugin *) = 0; virtual void _finiPluginForScreen(CompPlugin *) = 0; virtual bool _setOptionForPlugin(const char *, const char *, CompOption::Value &) = 0; virtual void _handleEvent(XEvent *event) = 0; virtual void _logMessage(const char *, CompLogLevel, const char*) = 0; virtual void _enterShowDesktopMode() = 0; virtual void _leaveShowDesktopMode(CompWindow *) = 0; virtual void _addSupportedAtoms(std::vector& atoms) = 0; virtual void _fileWatchAdded(CompFileWatch *) = 0; virtual void _fileWatchRemoved(CompFileWatch *) = 0; virtual void _sessionEvent(CompSession::Event, CompOption::Vector &) = 0; virtual void _handleCompizEvent(const char *, const char *, CompOption::Vector &) = 0; virtual bool _fileToImage(CompString &, CompSize &, int &, void *&) = 0; virtual bool _imageToFile(CompString &, CompString &, CompSize &, int, void *) = 0; virtual CompMatch::Expression * _matchInitExp(const CompString&) = 0; virtual void _matchExpHandlerChanged() = 0; virtual void _matchPropertyChanged(CompWindow *) = 0; virtual void _outputChangeNotify() = 0; }; #endif compiz-0.9.11+14.04.20140409/include/core/configurerequestbuffer.h0000644000015301777760000000440712321343002025007 0ustar pbusernogroup00000000000000/* * Copyright © 2012 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_CONFIGURE_REQUEST_BUFFER_H #define _COMPIZ_CONFIGURE_REQUEST_BUFFER_H #include #include #include namespace compiz { namespace window { namespace configure_buffers { class Releasable { public: virtual ~Releasable () {} typedef boost::shared_ptr Ptr; virtual void release () = 0; }; class Buffer : public SyncServerWindow { public: typedef boost::shared_ptr Ptr; virtual ~Buffer () {} virtual void pushClientRequest (const XWindowChanges &xwc, unsigned int mask) = 0; virtual void pushWrapperRequest (const XWindowChanges &xwc, unsigned int mask) = 0; virtual void pushFrameRequest (const XWindowChanges &xwc, unsigned int mask) = 0; virtual void pushSyntheticConfigureNotify () = 0; virtual Releasable::Ptr obtainLock () = 0; /* This API will all configure requests to be * released. It should only be used in situations * where you have a server grab and need * to have complete sync with the server */ virtual void forceRelease () = 0; }; } } } #endif compiz-0.9.11+14.04.20140409/include/core/CMakeLists.txt0000644000015301777760000000066312321343002022612 0ustar pbusernogroup00000000000000set (_headers action.h atoms.h configurerequestbuffer.h core.h countedlist.h global.h icon.h logmessage.h match.h modifierhandler.h option.h output.h plugin.h propertywriter.h privateunion.h screen.h session.h size.h string.h templates.h window.h wrapsystem.h abiversion.h ) install (FILES ${_headers} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) compiz-0.9.11+14.04.20140409/include/core/option.h0000644000015301777760000001716212321343002021535 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPOPTION_H #define _COMPOPTION_H #include #include #include #include class PrivateOption; class PrivateValue; class PrivateRestriction; class CompAction; class CompMatch; class CompScreenImpl; /** * A configuration option with boolean, int, float, String, Color, Key, Button, * Edge, Bell, or List. */ class CompOption { /** * Option data types */ public: typedef enum { TypeBool, TypeInt, TypeFloat, TypeString, TypeColor, TypeAction, TypeMatch, TypeList, TypeKey, TypeButton, TypeEdge, TypeBell, /* internal use only */ TypeUnset } Type; /** * A value of an Option */ class Value { public: typedef std::vector ColorVector; typedef boost::variant< bool, int, float, CompString, boost::recursive_wrapper, boost::recursive_wrapper, boost::recursive_wrapper, boost::recursive_wrapper > > variant_type; typedef std::vector Vector; public: Value () : mListType(TypeUnset) { } template Value( const T & t ); Value( unsigned short const (&color)[4] ) : mListType(TypeUnset), mValue (ColorVector (color, color + 4)) { } Value( const char *c ) : mListType (TypeUnset), mValue (CompString (c)) { } ~Value(); Type type () const { return static_cast(mValue.which()); } Type listType () const { return mListType; } template void set (const T & t); void set( unsigned short const (&color)[4] ) { mValue = ColorVector (color, color + 4); } void set (const char *c) { mValue = CompString (c); } template const T & get () const; void set (Type t, const Vector & v); bool b () const; int i () const; float f () const; unsigned short* c () const; const CompString & s () const; CompString & s (); const CompMatch & match () const; CompMatch & match (); const CompAction & action () const; CompAction & action (); const Vector & list () const; Vector & list (); bool operator== (const Value & rhs) const; bool operator!= (const Value & rhs) const; private: Type mListType; variant_type mValue; }; /** * TODO */ class Restriction { public: Restriction (); Restriction (const Restriction &); ~Restriction (); int iMin (); int iMax (); float fMin (); float fMax (); float fPrecision (); void set (int, int); void set (float, float, float); bool inRange (int); bool inRange (float); Restriction & operator= (const Restriction &rest); private: PrivateRestriction *priv; }; typedef std::vector Vector; /** * TODO */ class Class { public: virtual ~Class() {} virtual Vector & getOptions () = 0; virtual CompOption * getOption (const CompString &name); virtual bool setOption (const CompString &name, Value &value) = 0; }; public: CompOption (); CompOption (const CompOption &); CompOption (CompString name, Type type); ~CompOption (); void setName (CompString name, Type type); void setName (const char *name, Type type); void reset (); const CompString & name () const; Type type () const; Value & value (); const Value & value () const; Restriction & rest (); bool set (Value &val); bool isAction () const; CompOption & operator= (const CompOption &option); public: static CompOption * findOption (Vector &options, CompString name, unsigned int *index = NULL); static bool getBoolOptionNamed (const Vector& options, const CompString& name, bool defaultValue = false); static int getIntOptionNamed (const Vector& options, const CompString& name, int defaultValue = 0); static float getFloatOptionNamed (const Vector& options, const CompString& name, const float& defaultValue = 0.0); static CompString getStringOptionNamed (const Vector& options, const CompString& name, const CompString& defaultValue = ""); static unsigned short * getColorOptionNamed (const Vector& options, const CompString& name, unsigned short *defaultValue); static CompMatch getMatchOptionNamed (const Vector& options, const CompString& name, const CompMatch& defaultValue); static CompString typeToString (Type type); static bool stringToColor (CompString color, unsigned short *rgba); static CompString colorToString (unsigned short *rgba); static bool setOption (CompOption &o, Value &value); private: PrivateOption *priv; }; COMPIZ_EXTERN_STD(vector) COMPIZ_EXTERN_STD(vector) COMPIZ_EXTERN_STD(vector) namespace compiz { namespace detail { template inline Type const& CompOption_Value_get(CompOption::Value::variant_type const& mValue) { try { return boost::get (mValue); } catch (...) { static Type inst; return inst; } } template<> inline short unsigned int * const& CompOption_Value_get(CompOption::Value::variant_type const& mValue) { try { static short unsigned int * some = 0; CompOption::Value::ColorVector const& tmp(boost::get(mValue)); some = const_cast (&(tmp[0])); return some; } catch (...) { static short unsigned int * none = 0; return none; } } template inline void CompOption_Value_set (CompOption::Value::variant_type & mValue, Type &t) { mValue = t; } template <> inline void CompOption_Value_set (CompOption::Value::variant_type & mValue, unsigned short * &t) { mValue = CompOption::Value::ColorVector (t, t + 4); } } } template inline const T & CompOption::Value::get () const { return compiz::detail::CompOption_Value_get(mValue); } template inline void CompOption::Value::set (const T & t) { return compiz::detail::CompOption_Value_set(mValue, const_cast (t)); } template inline CompOption::Value::Value (const T & t) : mListType (CompOption::TypeUnset) { set (t); } CompOption::Vector & noOptions (); #endif compiz-0.9.11+14.04.20140409/include/core/core.h0000644000015301777760000000530312321343002021147 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_CORE_H #define _COMPIZ_CORE_H #include "abiversion.h" #include #include #include #include #include #include #include #include #include #include #include #include // X11 Bool defination breaks BOOST_FOREACH. Convert it to a typedef */ #ifdef Bool typedef Bool XBool; #undef Bool typedef XBool Bool; #endif #include #include #include #define foreach BOOST_FOREACH /* * WORDS_BIGENDIAN should be defined before including this file for * IMAGE_BYTE_ORDER and BITMAP_BIT_ORDER to be set correctly. */ #define LSBFirst 0 #define MSBFirst 1 #ifdef WORDS_BIGENDIAN # define IMAGE_BYTE_ORDER MSBFirst # define BITMAP_BIT_ORDER MSBFirst #else # define IMAGE_BYTE_ORDER LSBFirst # define BITMAP_BIT_ORDER LSBFirst #endif #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY (x) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif compiz-0.9.11+14.04.20140409/include/core/action.h0000644000015301777760000001275312321343002021503 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPACTION_H #define _COMPACTION_H #include "core/option.h" #include namespace compiz { namespace actions { void setActionActiveState (const CompAction &action, bool active); } } class PrivateAction; #define CompModAlt 0 #define CompModMeta 1 #define CompModSuper 2 #define CompModHyper 3 #define CompModModeSwitch 4 #define CompModNumLock 5 #define CompModScrollLock 6 #define CompModNum 7 #define CompAltMask (1 << 16) #define CompMetaMask (1 << 17) #define CompSuperMask (1 << 18) #define CompHyperMask (1 << 19) #define CompModeSwitchMask (1 << 20) #define CompNumLockMask (1 << 21) #define CompScrollLockMask (1 << 22) #define CompNoMask (1 << 25) /** * Context of an event occuring. */ class CompAction { public: typedef enum { StateInitKey = 1 << 0, StateTermKey = 1 << 1, StateInitButton = 1 << 2, StateTermButton = 1 << 3, StateInitBell = 1 << 4, StateInitEdge = 1 << 5, StateTermEdge = 1 << 6, StateInitEdgeDnd = 1 << 7, StateTermEdgeDnd = 1 << 8, StateCommit = 1 << 9, StateCancel = 1 << 10, StateAutoGrab = 1 << 11, StateNoEdgeDelay = 1 << 12, StateTermTapped = 1 << 13, StateIgnoreTap = 1 << 14 } StateEnum; /** * Type of event a CompAction is bound to. */ typedef enum { BindingTypeNone = 0, BindingTypeKey = 1 << 0, BindingTypeButton = 1 << 1, BindingTypeEdgeButton = 1 << 2 } BindingTypeEnum; class KeyBinding { public: KeyBinding (); KeyBinding (const KeyBinding&); KeyBinding (int keycode, unsigned int modifiers = 0); unsigned int modifiers () const; int keycode () const; bool fromString (const CompString &str); CompString toString () const; bool operator== (const KeyBinding &k) const; bool operator!= (const KeyBinding &k) const; private: unsigned int mModifiers; int mKeycode; }; class ButtonBinding { public: ButtonBinding (); ButtonBinding (const ButtonBinding&); ButtonBinding (int button, unsigned int modifiers = 0); unsigned int modifiers () const; int button () const; bool fromString (const CompString &str); CompString toString () const; bool operator== (const ButtonBinding &b) const; bool operator!= (const ButtonBinding &b) const; private: unsigned int mModifiers; int mButton; }; typedef unsigned int State; typedef unsigned int BindingType; typedef std::vector Vector; typedef boost::function CallBack; class Container { public: virtual ~Container() {} virtual Vector & getActions () = 0; }; public: CompAction (); CompAction (const CompAction &); ~CompAction (); CallBack initiate () const; CallBack terminate () const; void setInitiate (const CallBack &initiate); void setTerminate (const CallBack &terminate); State state () const; BindingType type () const; KeyBinding & key (); const KeyBinding & key () const; void setKey (const KeyBinding &key); ButtonBinding & button (); const ButtonBinding & button () const; void setButton (const ButtonBinding &button); unsigned int edgeMask () const; void setEdgeMask (unsigned int edge); bool bell () const; void setBell (bool bell); void setState (State state); void copyState (const CompAction &action); bool operator== (const CompAction& val) const; CompAction & operator= (const CompAction &action); bool keyFromString (const CompString &str); bool buttonFromString (const CompString &str); bool edgeMaskFromString (const CompString &str); CompString keyToString () const; CompString buttonToString () const; CompString edgeMaskToString () const; static CompString edgeToString (unsigned int edge); bool active () const; /* CompAction should be a pure virtual class so * that we can pass the interface required to for setActionActiveState * directly rather than using friends */ friend void compiz::actions::setActionActiveState (const CompAction &action, bool active); private: PrivateAction *priv; }; CompAction::Vector & noActions (); #endif compiz-0.9.11+14.04.20140409/include/core/point.h0000644000015301777760000000456512321343002021361 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _COMPPOINT_H #define _COMPPOINT_H /** * A 2D coordinate (likely in screen space) that can only be mutated * through set() methods, since it's data members are private. */ class CompPoint { public: CompPoint (); CompPoint (int, int); /** * Get the x coordinate of this point */ int x () const; /** * Get the y coordinate of this point */ int y () const; /** * Set the x and y coordinate of this point */ void set (int, int); /** * Set the x coordinate of this point */ void setX (int); /** * Set the y coordinate of this point */ void setY (int); bool operator== (const CompPoint &) const; bool operator!= (const CompPoint &) const; /** * Takes from both co-ordinates */ CompPoint & operator-= (const CompPoint &); /** * Adds to both co-ordinates */ CompPoint & operator+= (const CompPoint &); /** * Retuns an added point */ CompPoint operator+ (const CompPoint &) const; /** * Returns a subtracted point */ CompPoint operator- (const CompPoint &) const; private: int mX, mY; }; inline int CompPoint::x () const { return mX; } inline int CompPoint::y () const { return mY; } #endif compiz-0.9.11+14.04.20140409/include/core/atoms.h0000644000015301777760000001071512321343002021345 0ustar pbusernogroup00000000000000/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _ATOMS_H #define _ATOMS_H #include namespace Atoms { extern Atom supported; extern Atom supportingWmCheck; extern Atom utf8String; extern Atom wmName; extern Atom winType; extern Atom winTypeDesktop; extern Atom winTypeDock; extern Atom winTypeToolbar; extern Atom winTypeMenu; extern Atom winTypeUtil; extern Atom winTypeSplash; extern Atom winTypeDialog; extern Atom winTypeNormal; extern Atom winTypeDropdownMenu; extern Atom winTypePopupMenu; extern Atom winTypeTooltip; extern Atom winTypeNotification; extern Atom winTypeCombo; extern Atom winTypeDnd; extern Atom winOpacity; extern Atom winBrightness; extern Atom winSaturation; extern Atom winActive; extern Atom winDesktop; extern Atom workarea; extern Atom desktopViewport; extern Atom desktopGeometry; extern Atom currentDesktop; extern Atom numberOfDesktops; extern Atom winState; extern Atom winStateModal; extern Atom winStateSticky; extern Atom winStateMaximizedVert; extern Atom winStateMaximizedHorz; extern Atom winStateShaded; extern Atom winStateSkipTaskbar; extern Atom winStateSkipPager; extern Atom winStateHidden; extern Atom winStateFullscreen; extern Atom winStateAbove; extern Atom winStateBelow; extern Atom winStateDemandsAttention; extern Atom winStateDisplayModal; extern Atom winStateFocused; extern Atom winActionMove; extern Atom winActionResize; extern Atom winActionStick; extern Atom winActionMinimize; extern Atom winActionMaximizeHorz; extern Atom winActionMaximizeVert; extern Atom winActionFullscreen; extern Atom winActionClose; extern Atom winActionShade; extern Atom winActionChangeDesktop; extern Atom winActionAbove; extern Atom winActionBelow; extern Atom wmAllowedActions; extern Atom wmStrut; extern Atom wmStrutPartial; extern Atom wmUserTime; extern Atom wmIcon; extern Atom wmIconGeometry; extern Atom clientList; extern Atom clientListStacking; extern Atom frameExtents; extern Atom frameWindow; extern Atom wmState; extern Atom wmChangeState; extern Atom wmProtocols; extern Atom wmClientLeader; extern Atom wmDeleteWindow; extern Atom wmTakeFocus; extern Atom wmPing; extern Atom wmSyncRequest; extern Atom wmSyncRequestCounter; extern Atom wmFullscreenMonitors; extern Atom closeWindow; extern Atom wmMoveResize; extern Atom moveResizeWindow; extern Atom restackWindow; extern Atom showingDesktop; extern Atom xBackground[2]; extern Atom toolkitAction; extern Atom toolkitActionWindowMenu; extern Atom toolkitActionForceQuitDialog; extern Atom mwmHints; extern Atom xdndAware; extern Atom xdndEnter; extern Atom xdndLeave; extern Atom xdndPosition; extern Atom xdndStatus; extern Atom xdndDrop; extern Atom manager; extern Atom targets; extern Atom multiple; extern Atom timestamp; extern Atom version; extern Atom atomPair; extern Atom startupId; void init (Display *dpy); }; #endif compiz-0.9.11+14.04.20140409/include/core/privateunion.h0000644000015301777760000000254712321343002022751 0ustar pbusernogroup00000000000000/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_PRIVATEUNION_H #define _COMPIZ_PRIVATEUNION_H union CompPrivate { void *ptr; long val; unsigned long uval; void *(*fptr) (void); }; #endifcompiz-0.9.11+14.04.20140409/include/CMakeLists.txt0000644000015301777760000000020212321343002021647 0ustar pbusernogroup00000000000000set (_headers decoration.h ) install ( FILES ${_headers} DESTINATION ${includedir}/compiz ) add_subdirectory (core) compiz-0.9.11+14.04.20140409/include/decoration.h0000644000015301777760000003303612321343002021422 0ustar pbusernogroup00000000000000/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _DECORATION_H #define _DECORATION_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif #define DECOR_SUPPORTING_DM_CHECK_ATOM_NAME "_COMPIZ_SUPPORTING_DM_CHECK" #define DECOR_BARE_ATOM_NAME "_COMPIZ_WINDOW_DECOR_BARE" #define DECOR_ACTIVE_ATOM_NAME "_COMPIZ_WINDOW_DECOR_ACTIVE" #define DECOR_WINDOW_ATOM_NAME "_COMPIZ_WINDOW_DECOR" #define DECOR_BLUR_ATOM_NAME "_COMPIZ_WM_WINDOW_BLUR_DECOR" #define DECOR_SWITCH_WINDOW_ATOM_NAME "_COMPIZ_SWITCH_SELECT_WINDOW" #define DECOR_SWITCH_FOREGROUND_COLOR_ATOM_NAME "_COMPIZ_SWITCH_FOREGROUND_COLOR" #define DECOR_INPUT_FRAME_ATOM_NAME "_COMPIZ_WINDOW_DECOR_INPUT_FRAME" #define DECOR_OUTPUT_FRAME_ATOM_NAME "_COMPIZ_WINDOW_DECOR_OUTPUT_FRAME" #define DECOR_TYPE_ATOM_NAME "_COMPIZ_WINDOW_DECOR_TYPE" #define DECOR_TYPE_PIXMAP_ATOM_NAME "_COMPIZ_WINDOW_DECOR_TYPE_PIXMAP" #define DECOR_TYPE_WINDOW_ATOM_NAME "_COMPIZ_WINDOW_DECOR_TYPE_WINDOW" #define DECOR_REQUEST_PIXMAP_ATOM_NAME "_COMPIZ_DECOR_REQUEST" #define DECOR_PIXMAP_PENDING_ATOM_NAME "_COMPIZ_DECOR_PENDING" #define DECOR_DELETE_PIXMAP_ATOM_NAME "_COMPIZ_DECOR_DELETE_PIXMAP" #define WINDOW_DECORATION_TYPE_PIXMAP (1 << 0) #define WINDOW_DECORATION_TYPE_WINDOW (1 << 1) #define GRAVITY_WEST (1 << 0) #define GRAVITY_EAST (1 << 1) #define GRAVITY_NORTH (1 << 2) #define GRAVITY_SOUTH (1 << 3) #define ALIGN_LEFT (0) #define ALIGN_RIGHT (1 << 0) #define ALIGN_TOP (0) #define ALIGN_BOTTOM (1 << 1) #define CLAMP_HORZ (1 << 0) #define CLAMP_VERT (1 << 1) #define STRETCH_X (1 << 0) #define STRETCH_Y (1 << 1) #define XX_MASK (1 << 16) #define XY_MASK (1 << 17) #define YX_MASK (1 << 18) #define YY_MASK (1 << 19) #define PAD_TOP (1 << 0) #define PAD_BOTTOM (1 << 1) #define PAD_LEFT (1 << 2) #define PAD_RIGHT (1 << 3) #define DECOR_WINDOW_STATE_FOCUS (1 << 0) #define DECOR_WINDOW_STATE_MAXIMIZED_VERT (1 << 1) #define DECOR_WINDOW_STATE_MAXIMIZED_HORZ (1 << 2) #define DECOR_WINDOW_STATE_SHADED (1 << 3) #define DECOR_WINDOW_TYPE_NORMAL (1 << 0) #define DECOR_WINDOW_TYPE_DIALOG (1 << 1) #define DECOR_WINDOW_TYPE_MODAL_DIALOG (1 << 2) #define DECOR_WINDOW_TYPE_MENU (1 << 3) #define DECOR_WINDOW_TYPE_UTILITY (1 << 4) #define DECOR_WINDOW_ACTION_RESIZE_HORZ (1 << 0) #define DECOR_WINDOW_ACTION_RESIZE_VERT (1 << 1) #define DECOR_WINDOW_ACTION_CLOSE (1 << 2) #define DECOR_WINDOW_ACTION_MINIMIZE (1 << 3) #define DECOR_WINDOW_ACTION_UNMINIMIZE (1 << 4) #define DECOR_WINDOW_ACTION_MAXIMIZE_HORZ (1 << 5) #define DECOR_WINDOW_ACTION_MAXIMIZE_VERT (1 << 6) #define DECOR_WINDOW_ACTION_UNMAXIMIZE_HORZ (1 << 7) #define DECOR_WINDOW_ACTION_UNMAXIMIZE_VERT (1 << 8) #define DECOR_WINDOW_ACTION_SHADE (1 << 9) #define DECOR_WINDOW_ACTION_UNSHADE (1 << 10) #define DECOR_WINDOW_ACTION_STICK (1 << 11) #define DECOR_WINDOW_ACTION_UNSTICK (1 << 12) #define DECOR_WINDOW_ACTION_FULLSCREEN (1 << 13) #define DECOR_WINDOW_ACTION_ABOVE (1 << 14) #define DECOR_WINDOW_ACTION_BELOW (1 << 15) #define BORDER_TOP 0 #define BORDER_BOTTOM 1 #define BORDER_LEFT 2 #define BORDER_RIGHT 3 typedef struct _decor_point { int x; int y; int gravity; } decor_point_t; typedef struct _decor_matrix { double xx; double yx; double xy; double yy; double x0; double y0; } decor_matrix_t; typedef struct _decor_quad { decor_point_t p1; decor_point_t p2; int max_width; int max_height; int align; int clamp; int stretch; decor_matrix_t m; } decor_quad_t; typedef struct _decor_extents { int left; int right; int top; int bottom; } decor_extents_t; typedef struct _decor_context { decor_extents_t extents; int left_space; int right_space; int top_space; int bottom_space; int left_corner_space; int right_corner_space; int top_corner_space; int bottom_corner_space; } decor_context_t; typedef struct _decor_box { int x1; int y1; int x2; int y2; int pad; } decor_box_t; typedef struct _decor_layout { int width; int height; decor_box_t left; decor_box_t right; decor_box_t top; decor_box_t bottom; int rotation; } decor_layout_t; typedef struct _decor_shadow_options { double shadow_radius; double shadow_opacity; unsigned short shadow_color[3]; int shadow_offset_x; int shadow_offset_y; } decor_shadow_options_t; typedef struct _decor_shadow { int ref_count; Pixmap pixmap; Picture picture; int width; int height; } decor_shadow_t; typedef void (*decor_draw_func_t) (Display *xdisplay, Pixmap pixmap, Picture picture, int width, int height, decor_context_t *context, void *closure); #define PROP_HEADER_SIZE 3 #define WINDOW_PROP_SIZE 12 #define BASE_PROP_SIZE 22 #define QUAD_PROP_SIZE 9 #define N_QUADS_MAX 24 int decor_version (void); long * decor_alloc_property (unsigned int n, unsigned int type); void decor_quads_to_property (long *data, unsigned int n, Pixmap pixmap, decor_extents_t *frame, decor_extents_t *border, decor_extents_t *max_frame, decor_extents_t *max_border, int min_width, int min_height, decor_quad_t *quad, int nQuad, unsigned int frame_state, unsigned int frame_type, unsigned int frame_actions); void decor_gen_window_property (long *data, unsigned int n, decor_extents_t *input, decor_extents_t *max_input, int min_width, int min_height, unsigned int frame_state, unsigned int frame_type, unsigned int frame_actions); int decor_property_get_version (long *data); int decor_property_get_type (long *data); int decor_property_get_num (long *data); int decor_pixmap_property_to_quads (long *data, unsigned int n, int size, Pixmap *pixmap, decor_extents_t *frame_input, decor_extents_t *input, decor_extents_t *frame_max_input, decor_extents_t *max_input, int *min_width, int *min_height, unsigned int *frame_type, unsigned int *frame_state, unsigned int *frame_actions, decor_quad_t *quad); int decor_match_pixmap (long *data, int size, Pixmap *pixmap, decor_extents_t *frame, decor_extents_t *border, decor_extents_t *max_frame, decor_extents_t *max_border, int min_width, int min_height, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions, decor_quad_t *quad, unsigned int n_quad); int decor_window_property (long *data, unsigned int n, int size, decor_extents_t *input, decor_extents_t *max_input, int *min_width, int *min_height, unsigned int *frame_type, unsigned int *frame_state, unsigned int *frame_actions); void decor_region_to_blur_property (long *data, int threshold, int filter, int width, int height, Region topRegion, int topOffset, Region bottomRegion, int bottomOffset, Region leftRegion, int leftOffset, Region rightRegion, int rightOffset); void decor_apply_gravity (int gravity, int x, int y, int width, int height, int *return_x, int *return_y); int decor_set_vert_quad_row (decor_quad_t *q, int top, int top_corner, int bottom, int bottom_corner, int left, int right, int gravity, int height, int splitY, int splitGravity, double x0, double y0, int rotation); int decor_set_horz_quad_line (decor_quad_t *q, int left, int left_corner, int right, int right_corner, int top, int bottom, int gravity, int width, int splitX, int splitGravity, double x0, double y0); int decor_set_lSrS_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l); int decor_set_lSrStSbS_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l); int decor_set_lSrStXbS_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l, int top_stretch_offset); int decor_set_lSrStSbX_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l, int bottom_stretch_offset); int decor_set_lXrXtXbX_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l, int left_stretch_offset, int right_stretch_offset, int top_stretch_offset, int bottom_stretch_offset); decor_shadow_t * decor_shadow_create (Display *xdisplay, Screen *screen, int width, int height, int left, int right, int top, int bottom, int solid_left, int solid_right, int solid_top, int solid_bottom, decor_shadow_options_t *opt, decor_context_t *context, decor_draw_func_t draw, void *closure); void decor_shadow_destroy (Display *xdisplay, decor_shadow_t *shadow); void decor_shadow_reference (decor_shadow_t *shadow); void decor_shadow (Display *xdisplay, decor_shadow_t *shadow); void decor_draw_simple (Display *xdisplay, Pixmap pixmap, Picture picture, int width, int height, decor_context_t *c, void *closure); void decor_get_default_layout (decor_context_t *c, int width, int height, decor_layout_t *layout); void decor_get_best_layout (decor_context_t *c, int width, int height, decor_layout_t *layout); void decor_fill_picture_extents_with_shadow (Display *xdisplay, decor_shadow_t *shadow, decor_context_t *context, Picture picture, decor_layout_t *layout); void decor_blend_transform_picture (Display *xdisplay, decor_context_t *context, Picture src, int xSrc, int ySrc, Picture dst, decor_layout_t *layout, Region region, unsigned short alpha, int shade_alpha); void decor_blend_border_picture (Display *xdisplay, decor_context_t *context, Picture src, int xSrc, int ySrc, Picture dst, decor_layout_t *layout, unsigned int border, Region region, unsigned short alpha, int shade_alpha, int ignore_src_alpha); #define DECOR_ACQUIRE_STATUS_SUCCESS 0 #define DECOR_ACQUIRE_STATUS_FAILED 1 #define DECOR_ACQUIRE_STATUS_OTHER_DM_RUNNING 2 int decor_acquire_dm_session (Display *xdisplay, int screen, const char *name, int replace_current_dm, Time *timestamp); void decor_set_dm_check_hint (Display *xdisplay, int screen, int supports); #define DECOR_SELECTION_KEEP 0 #define DECOR_SELECTION_GIVE_UP 1 int decor_handle_selection_clear (Display *xdisplay, XEvent *xevent, int screen); void decor_handle_selection_request (Display *xdisplay, XEvent *event, Time dm_sn_timestamp); int decor_post_pending (Display *xdisplay, Window client, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions); int decor_post_delete_pixmap (Display *xdisplay, Window window, Pixmap pixmap); int decor_post_generate_request (Display *xdisplay, Window client, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions); int decor_extents_cmp (const decor_extents_t *a, const decor_extents_t *b); int decor_shadow_options_cmp (const decor_shadow_options_t *a, const decor_shadow_options_t *b); #ifdef __cplusplus } #endif #endif compiz-0.9.11+14.04.20140409/scripts/0000755000015301777760000000000012321344021017163 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/scripts/release.py0000644000015301777760000001321412321343002021154 0ustar pbusernogroup00000000000000#!/usr/env/python # Usage: release.py VERSION. Creates a new compiz release and bumps VERSION # to the next release # # Copyright (c) Sam Spilsbury # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA import sys import os import bzrlib.branch import bzrlib.workingtree import bzrlib.errors as errors from launchpadlib.launchpad import Launchpad import datetime def usage (): print ("release.py VERSION") print ("Make a release and bump version to VERSION") sys.exit (1) if len(sys.argv) != 2: usage () if not "release.py" in os.listdir ("."): print ("Working directory must contain this script") sys.exit (1) editor = "" try: editor = os.environ["EDITOR"] except KeyError: print ("EDITOR must be set") sys.exit (1) if len (editor) == 0: print ("EDITOR must be set") sys.exit (1) bzrlib.initialize () compiz_branch = bzrlib.branch.Branch.open ("..") compiz_branch.lock_read () tags = compiz_branch.tags.get_tag_dict ().items () most_recent_revision = 0 # Find the last tagged revision for tag, revid in tags: try: revision = compiz_branch.revision_id_to_dotted_revno (revid)[0] if int (revision) > most_recent_revision: most_recent_revision = revision except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno, errors.UnsupportedOperation): pass repo = compiz_branch.repository release_revisions = [] # Find all revisions since that one for revision_id in repo.get_revisions (repo.all_revision_ids ()): try: revno = compiz_branch.revision_id_to_dotted_revno (revision_id.revision_id)[0] if revno > most_recent_revision: release_revisions.append (revision_id) except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno, errors.UnsupportedOperation): pass # Find all fixed bugs in those revisions bugs = [] for rev in release_revisions: for bug in rev.iter_bugs(): bugs.append (bug[0][27:]) bugs = sorted (bugs) # Connect to launchpad lp = Launchpad.login_anonymously ("Compiz Release Script", "production") # Create a pretty looking formatted list of bugs bugs_formatted = [] for bug in bugs: lpBug = lp.bugs[bug] bugTitle = lpBug.title bugTitleWords = bugTitle.split (" ") maximumLineLength = 65 currentLineLength = 0 line = 0 lineParts = [""] for word in bugTitleWords: wordLength = len (word) + 1 if wordLength + currentLineLength > maximumLineLength: lineParts.append ("") line = line + 1 currentLineLength = 0 elif currentLineLength != 0: lineParts[line] += " " currentLineLength += wordLength lineParts[line] += (word) bugs_formatted.append ((bug, lineParts)) # Pretty-print the bugs bugs_formatted_msg = "" for bug, lines in bugs_formatted: whitespace = " " * (12 - len (bug)) bugs_formatted_msg += whitespace + bug + " - " + lines[0] + "\n" if len (lines) > 1: for i in range (1, len (lines)): whitespace = " " * 15 bugs_formatted_msg += whitespace + lines[i] + "\n" # Get the version version_file = open ("../VERSION", "r") version = version_file.readlines ()[0][:-1] version_file.close () # Get the date date = datetime.datetime.now () date_formatted = str(date.year) + "-" + str(date.month) + "-" + str(date.day) # Create release message release_msg = "Release " + version + " (" + date_formatted + " NAME )\n" release_msg += "=" * 77 + "\n\n" release_msg += "Highlights\n\n" release_msg += "Bugs Fixed (https://launchpad.net/compiz/+milestone/" + version + ")\n\n" release_msg += bugs_formatted_msg print release_msg # Edit release message news_update_file = open (".release-script-" + version, "w+") news_update_file.write (release_msg.encode ("utf8")) news_update_file.close () os.system (editor + " .release-script-" + version) # Open NEWS news_file = open ("../NEWS", "r") news_lines = news_file.readlines () news_prepend_file = open (".release-script-" + version, "r") news_prepend_lines = news_prepend_file.readlines () for i in range (0, len (news_prepend_lines)): news_prepend_lines[i] = news_prepend_lines[i].decode ("utf8") news_prepend_lines.append ("\n") for line in news_lines: news_prepend_lines.append (line.decode ("utf8")) news = "" for line in news_prepend_lines: news += line news_file.close () news_prepend_file.close () news_file = open ("../NEWS", "w") news_file.write (news.encode ("utf8")) news_file.close () # Commit compiz_tree = bzrlib.workingtree.WorkingTree.open ("..") compiz_tree.commit ("Release version " + version) # Create a tag compiz_branch.unlock () compiz_branch.lock_write () compiz_branch.tags.set_tag ("v" + version, compiz_branch.last_revision ()) compiz_branch.unlock () # Update version version_file = open ("../VERSION", "w") version_file.write (sys.argv[1] + "\n") version_file.close () # Commit compiz_tree = bzrlib.workingtree.WorkingTree.open ("..") compiz_tree.commit ("Bump VERSION to " + sys.argv[1]) compiz-0.9.11+14.04.20140409/scripts/run-with-xvfb.sh0000644000015301777760000000257312321343002022244 0ustar pbusernogroup00000000000000#!/bin/sh # Usage: /bin/sh run-with-xvfb.sh # # Creates Xvfb instance and runs program in that instance. Shuts down Xvfb when done. if [ $# -ne 1 ]; then echo "Usage /bin/sh run-with-xvfb.sh " exit 1 fi # The script should still pass if you have a real Xserver and no Xvfb if [ ! -z "$DISPLAY" ]; then echo "Note: You are already running an Xserver." $1 else xvfb=`which Xvfb` if [ ! -x "$xvfb" ]; then echo "Error: Xvfb does not seem to be installed." exit 1 fi Xvfb -ac -noreset -screen 0 1024x768x16 -help 2>/dev/null 1>&2 XID=`for id in 101 102 103 104 105 106 107 197 199 211 223 227 293 307 308 309 310 311 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 4703 4721 4723 4729 4733 4751 9973 9974 9975 9976 9977 9978 9979 9980 9981 9982 9983 9984 9985 9986 9987 9988 9989 9990 9991 9992 9993 9994 9995 9996 9997 9998 9999 ; do test -e /tmp/.X$id-lock || { echo $id; exit 0; }; done; echo "No Display ports available, quit."; exit 1` { Xvfb -ac -noreset -screen 0 1024x768x16 :$XID -nolisten tcp -auth /dev/null >/dev/null 2>&1 & trap "kill -15 $! " 0 HUP INT QUIT TRAP USR1 PIPE TERM ; } || { echo "Gtk+Tests:ERROR: Failed to start Xvfb environment for X11 target tests."; exit 1; } DISPLAY=:$XID $1 fi compiz-0.9.11+14.04.20140409/AUTHORS0000644000015301777760000001175212321343002016550 0ustar pbusernogroup00000000000000Adam Williamson Adel Gadllah Alan Bell Alan Griffiths Alan Griffiths Albert Astals Alexandros Frantzis Alyssa Hung Andrea Azzarone Andrea Azzarone Bellegarde Cedric Bellegarde Cedric Brandon Schaefer Bryan Nguyen Cedric C-F Language team Christopher Williams Christopher Williams compiz Compiz Fusion l10n team Daniel d'Andrada Daniel Lea Daniel Nylander Daniel van Vugt Daniel van Vugt Danny Baumann Danny Baumann Danny Baumann Dan Winship Dan Winship David Reveman David Reveman Dennis Kasprzyk Dennis Kasprzyk Dennis Kasprzyk Didier Roche Didier Roche Diogo Ferreira Dominique Leuenberger Dominique Leuenberger Dominique Leuenberger dragoran Eduardo Gurgel Pinho Erkin Bahceci Gabor Kelemen gandalfn Gerd Kohlberger Guillaume Guillaume Seguin G. Uitslag Hu Kang Iven Hsu James Jones Jason Smith Jay Catherwood Jeremy C. Reed Jigish Gohil Jigish Gohil Joel Bosveld Joel Bosveld Julian Sikorski Jürgen Kreileder Jussi Pakkanen Keith Madill Kristian Hogsberg Kristian Høgsberg Kristian Lyngstol Kristian Lyngstol Kristopher Ives Kristopher Ives Lubos Lunak Åukasz 'sil2100' Zemczak Marco Trevisan (Treviño) Matija Skala MC Return Michael Terry Michael Vogt Michail Bitzes mike@blueroot.co.uk Mike Cook Mike Dransfield Mikkel Kamstrup Erlandsen Mirco Muller moppsy Nicolas Delvaux Nicolas Viennot Owen W. Taylor Patrick Niklaus Patrick Niklaus Patrick Niklaus Per Wigren Quinn Storm Quinn Storm Randolph Chung Renato Araujo Oliveira Filho Robert Ancell Robert Carr Robert Carr Robert M Robert Noland Rob Taylor Rock Roi Cohen Roi Cohen Roland Bär Sampo555 Sam Spilsbury Sam Spilsbury Scott Moreau scott Sebasian Billaudelle Sebastien Bacher smspillaz Søren Sandmann Stephen M. Webb Steven Robertson Stjepan Glavina Thierry Reding Thomas Thurman Thomas Voß Timo Jyrinki Tim Penhey Tomas Carnecky Travis Watkins Ugo Riboni Unity Ville Syrjala Zack Rusin ΔημήτÏης (djdoo) compiz-0.9.11+14.04.20140409/postinst/0000755000015301777760000000000012321344021017357 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/postinst/migration-scripts/0000755000015301777760000000000012321344021023035 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/postinst/migration-scripts/02_migrate_to_gsettings.py0000755000015301777760000000523312321343002030135 0ustar pbusernogroup00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright (C) 2012 Canonical # # Authors: # Åukasz 'sil2100' Zemczak # Didier Roche # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; version 3. # # This program is distributed in the hope that it will be useful, but WITHOUTa # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA import gconf import glib import subprocess import os.path # this should point to the directory where all the .convert files are stored CONVERT_PATH = "/usr/lib/compiz/migration/" def migrate_file(convert_file): subprocess.Popen(["gsettings-data-convert", "--file={}{}".format(CONVERT_PATH, convert_file)]).communicate() def migrate_gconf_to_gsettings(): client = gconf.client_get_default() if not client: print "WARNING: no gconf client found. No transitionning will be done" return # get current compiz profile to know if we need to switch or not # as compiz is setting that as a default key schema each time you # change the profile, the key isn't straightforward to get and set # as compiz set a new schema instead of a value.. try: current_profile_schema = client.get_schema("/apps/compizconfig-1/current_profile") except (glib.GError, AttributeError): print "No current profile set, no migration needed" return if current_profile_schema: current_profile_gconfvalue = current_profile_schema.get_default_value() current_profile_str = current_profile_gconfvalue.get_string() else: print "No current profile set, no migration needed" return # depending what current profile is set, migrate using specific .convert files if current_profile_str == 'unity': print "Will migrate 'unity' as the active profile" migrate_file('compiz-profile-active-unity.convert') migrate_file('compiz-profile-Default.convert') else: print "Will migrate 'Default' as the active profile" migrate_file('compiz-profile-active-Default.convert') if os.path.exists(CONVERT_PATH + 'compiz-profile-unity.convert'): migrate_file('compiz-profile-unity.convert') if __name__ == '__main__': migrate_gconf_to_gsettings () compiz-0.9.11+14.04.20140409/postinst/migration-scripts/03_migrate_profile_independent.py0000755000015301777760000000276112321343002031445 0ustar pbusernogroup00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright (C) 2012 Canonical # # Authors: # Åukasz 'sil2100' Zemczak # Didier Roche # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; version 3. # # This program is distributed in the hope that it will be useful, but WITHOUTa # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA import gconf import glib import subprocess import os.path # this should point to the directory where all the .convert files are stored CONVERT_PATH = "/usr/lib/compiz/migration/" def migrate_file(convert_file): subprocess.Popen(["gsettings-data-convert", "--file={}{}".format(CONVERT_PATH, convert_file)]).communicate() def migrate_gconf_to_gsettings(): client = gconf.client_get_default() if not client: print "WARNING: no gconf client found. No transitionning will be done" sys.exit(1) print "Will migrate profile independent keys" migrate_file('compiz-profile-independent-keys.convert') if __name__ == '__main__': migrate_gconf_to_gsettings () compiz-0.9.11+14.04.20140409/postinst/CMakeLists.txt0000644000015301777760000000065312321343002022121 0ustar pbusernogroup00000000000000# Allow setting the recompile rule again set_property (GLOBAL PROPERTY COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE FALSE) set_property (GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE FALSE) if (USE_GSETTINGS) compiz_add_install_recompile_gsettings_schemas (${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas) add_all_gsettings_schemas_to_local_recompilation_rule () endif (USE_GSETTINGS) compiz-0.9.11+14.04.20140409/postinst/convert-files/0000755000015301777760000000000012321344021022137 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/postinst/convert-files/compiz-profile-independent-keys.convert0000644000015301777760000000710012321343002031740 0ustar pbusernogroup00000000000000[org.gnome.desktop.wm.keybindings] move-to-workspace-1 = /apps/metacity/window_keybindings/move_to_workspace_1 move-to-workspace-2 = /apps/metacity/window_keybindings/move_to_workspace_2 move-to-workspace-3 = /apps/metacity/window_keybindings/move_to_workspace_3 move-to-workspace-4 = /apps/metacity/window_keybindings/move_to_workspace_4 move-to-workspace-5 = /apps/metacity/window_keybindings/move_to_workspace_5 move-to-workspace-6 = /apps/metacity/window_keybindings/move_to_workspace_6 move-to-workspace-7 = /apps/metacity/window_keybindings/move_to_workspace_7 move-to-workspace-8 = /apps/metacity/window_keybindings/move_to_workspace_8 move-to-workspace-9 = /apps/metacity/window_keybindings/move_to_workspace_9 move-to-workspace-10 = /apps/metacity/window_keybindings/move_to_workspace_10 move-to-workspace-11 = /apps/metacity/window_keybindings/move_to_workspace_11 move-to-workspace-12 = /apps/metacity/window_keybindings/move_to_workspace_12 move-to-workspace-left = /apps/metacity/window_keybindings/move_to_workspace_left move-to-workspace-right = /apps/metacity/window_keybindings/move_to_workspace_right move-to-workspace-up = /apps/metacity/window_keybindings/move_to_workspace_up move-to-workspace-down = /apps/metacity/window_keybindings/move_to_workspace_down switch-windows = /apps/metacity/global_keybindings/switch_windows switch-group = /apps/metacity/global_keybindings/switch_group show-desktop = /apps/metacity/global_keybindings/show_desktop switch-to-workspace-1 = /apps/metacity/global_keybindings/switch_to_workspace_1 switch-to-workspace-2 = /apps/metacity/global_keybindings/switch_to_workspace_2 switch-to-workspace-3 = /apps/metacity/global_keybindings/switch_to_workspace_3 switch-to-workspace-4 = /apps/metacity/global_keybindings/switch_to_workspace_4 switch-to-workspace-5 = /apps/metacity/global_keybindings/switch_to_workspace_5 switch-to-workspace-6 = /apps/metacity/global_keybindings/switch_to_workspace_6 switch-to-workspace-7 = /apps/metacity/global_keybindings/switch_to_workspace_7 switch-to-workspace-8 = /apps/metacity/global_keybindings/switch_to_workspace_8 switch-to-workspace-9 = /apps/metacity/global_keybindings/switch_to_workspace_9 switch-to-workspace-10 = /apps/metacity/global_keybindings/switch_to_workspace_10 switch-to-workspace-11 = /apps/metacity/global_keybindings/switch_to_workspace_11 switch-to-workspace-12 = /apps/metacity/global_keybindings/switch_to_workspace_12 switch-to-workspace-left = /apps/metacity/global_keybindings/switch_to_workspace_left switch-to-workspace-right = /apps/metacity/global_keybindings/switch_to_workspace_right switch-to-workspace-up = /apps/metacity/global_keybindings/switch_to_workspace_up switch-to-workspace-down = /apps/metacity/global_keybindings/switch_to_workspace_down activate-window-menu = /apps/metacity/window_keybindings/activate_window_menu toggle-fullscreen = /apps/metacity/window_keybindings/toggle_fullscreen toggle-maximized = /apps/metacity/window_keybindings/toggle_maximized maximize = /apps/metacity/window_keybindings/maximize unmaximize = /apps/metacity/window_keybindings/unmaximize toggle-shaded = /apps/metacity/window_keybindings/toggle_shaded close = /apps/metacity/window_keybindings/close minimize = /apps/metacity/window_keybindings/minimize begin-move = /apps/metacity/window_keybindings/begin_move begin-resize = /apps/metacity/window_keybindings/begin_resize raise = /apps/metacity/window_keybindings/raise lower = /apps/metacity/window_keybindings/lower maximize-vertically = /apps/metacity/window_keybindings/maximize_vertically maximize-horizontally = /apps/metacity/window_keybindings/maximize_horizontally compiz-0.9.11+14.04.20140409/postinst/convert-files/compiz-profile-Default.convert0000644000015301777760000002300412321343002030057 0ustar pbusernogroup00000000000000[org.compiz.core:/org/compiz/profiles/Default/plugins/core/] active-plugins = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/active_plugins vsize = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/vsize hsize = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/vsize close-window-button = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/close_window_button close-window-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/close_window_key lower-window-button = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/lower_window_button lower-window-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/lower_window_key maximize-window-horizontally-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/maximize_window_horizontally_key maximize-window-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/maximize_window_key maximize-window-vertically-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/maximize_window_vertically_key minimize-window-button = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/minimize_window_button minimize-window-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/minimize_window_key raise-window-button = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/raise_window_button raise-window-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/raise_window_key show-desktop-edge = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/show_desktop_edge show-desktop-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/show_desktop_key toggle-window-maximized-button = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/toggle_window_maximized_button toggle-window-maximized-horizontally-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/toggle_window_maximized_horizontally_key toggle-window-maximized-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/toggle_window_maximized_key toggle-window-maximized-vertically-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/toggle_window_maximized_vertically_key toggle-window-shaded-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/toggle_window_shaded_key unmaximize-window-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/unmaximize_window_key window-menu-button = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/window_menu_button window-menu-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/window_menu_key [org.compiz.composite:/org/compiz/profiles/Default/plugins/composite/] detect-refresh-rate = /apps/compizconfig-1/profiles/Default/plugins/composite/screen0/options/detect_refresh_rate refresh-rate = /apps/compizconfig-1/profiles/Default/plugins/composite/screen0/options/refresh_rate [org.compiz.opengl:/org/compiz/profiles/Default/plugins/opengl/] lighting = /apps/compizconfig-1/profiles/Default/plugins/opengl/screen0/options/lighting sync-to-vblank = /apps/compizconfig-1/profiles/Default/plugins/opengl/screen0/options/sync_to_vblank texture-compression = /apps/compizconfig-1/profiles/Default/plugins/opengl/screen0/options/texture_compression texture-filter = /apps/compizconfig-1/profiles/Default/plugins/opengl/screen0/options/texture_filter [org.compiz.wall:/org/compiz/profiles/Default/plugins/wall/] down-button = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/down_button down-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/down_button down-window-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/down_button edgeflip-dnd = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/edgeflip_dnd edgeflip-move = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/edgeflip_move edgeflip-pointer = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/edgeflip_pointer edge-radius = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/edge_radius flip-down-edge = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/flip_down_edge flip-left-edge = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/flip_left_edge flip-right-edge = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/flip_right_edge flip-up-edge = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/flip_up_edge left-button = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/left_button left-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/left_key left-window-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/left_window_key next-button = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/next_button next-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/next_key prev-button = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/prev_button prev-key =/apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/prev_key right-button = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/right_button right-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/right_key right-window-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/right_window_key up-button = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/up_button up-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/up_key up-window-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/up_window_key [org.compiz.expo:/org/compiz/profiles/Default/plugins/expo/] exit-button = /apps/compizconfig-1/profiles/Default/plugins/expo/screen0/options/exit_button expo-edge = /apps/compizconfig-1/profiles/Default/plugins/expo/screen0/options/expo_edge expo-key = /apps/compizconfig-1/profiles/Default/plugins/expo/screen0/options/expo_key expo-immediate-move = /apps/compizconfig-1/profiles/Default/plugins/expo/screen0/options/expo_immediate_move next-vp-button = /apps/compizconfig-1/profiles/Default/plugins/expo/screen0/options/next_vp_button prev-vp-button = /apps/compizconfig-1/profiles/Default/plugins/expo/screen0/options/prev_vp_button [org.compiz.move:/org/compiz/profiles/Default/plugins/move/] initiate-button = /apps/compizconfig-1/profiles/Default/plugins/move/screen0/options/initiate_button initiate-key = /apps/compizconfig-1/profiles/Default/plugins/move/screen0/options/initiate_key [org.compiz.grid:/org/compiz/profiles/Default/plugins/grid/] bottom-edge-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/bottom_edge_action bottom-edge-threshold = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/bottom_edge_threshold bottom-left-corner-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/bottom_left_corner_action bottom-right-corner-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/bottom_right_corner_action draw-indicator = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/draw_indicator fill-color = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/fill_color left-edge-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/left_edge_action left-edge-threshold = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/left_edge_threshold outline-color = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/outline_color put-bottom-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_bottom_key put-bottomleft-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_bottomleft_key put-bottomright-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_bottomright_key put-center-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_center_key put-left-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_left_key put-maximize-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_maximize_key put-restore-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_restore_key put-right-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_right_key put-top-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_top_key put-topleft-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_topleft_key put-topright-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_topright_key right-edge-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/right_edge_action right-edge-threshold = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/right_edge_threshold snapback-windows = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/snapback_windows snapoff-maximized = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/snapoff_maximized top-edge-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/top_edge_action top-edge-threshold = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/top_edge_threshold top-left-corner-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/top_left_corner_action top-right-corner-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/top_right_corner_action compiz-0.9.11+14.04.20140409/postinst/convert-files/compiz-profile-active-Default.convert0000644000015301777760000001675612321343002031350 0ustar pbusernogroup00000000000000[org.compiz.core:/org/compiz/profiles/Default/plugins/core/] active-plugins = /apps/compiz-1/plugins/core/screen0/options/active_plugins vsize = /apps/compiz-1/plugins/core/screen0/options/vsize hsize = /apps/compiz-1/plugins/core/screen0/options/vsize close-window-button = /apps/compiz-1/plugins/core/screen0/options/close_window_button close-window-key = /apps/compiz-1/plugins/core/screen0/options/close_window_key lower-window-button = /apps/compiz-1/plugins/core/screen0/options/lower_window_button lower-window-key = /apps/compiz-1/plugins/core/screen0/options/lower_window_key maximize-window-horizontally-key = /apps/compiz-1/plugins/core/screen0/options/maximize_window_horizontally_key maximize-window-key = /apps/compiz-1/plugins/core/screen0/options/maximize_window_key maximize-window-vertically-key = /apps/compiz-1/plugins/core/screen0/options/maximize_window_vertically_key minimize-window-button = /apps/compiz-1/plugins/core/screen0/options/minimize_window_button minimize-window-key = /apps/compiz-1/plugins/core/screen0/options/minimize_window_key raise-window-button = /apps/compiz-1/plugins/core/screen0/options/raise_window_button raise-window-key = /apps/compiz-1/plugins/core/screen0/options/raise_window_key show-desktop-edge = /apps/compiz-1/plugins/core/screen0/options/show_desktop_edge show-desktop-key = /apps/compiz-1/plugins/core/screen0/options/show_desktop_key toggle-window-maximized-button = /apps/compiz-1/plugins/core/screen0/options/toggle_window_maximized_button toggle-window-maximized-horizontally-key = /apps/compiz-1/plugins/core/screen0/options/toggle_window_maximized_horizontally_key toggle-window-maximized-key = /apps/compiz-1/plugins/core/screen0/options/toggle_window_maximized_key toggle-window-maximized-vertically-key = /apps/compiz-1/plugins/core/screen0/options/toggle_window_maximized_vertically_key toggle-window-shaded-key = /apps/compiz-1/plugins/core/screen0/options/toggle_window_shaded_key unmaximize-window-key = /apps/compiz-1/plugins/core/screen0/options/unmaximize_window_key window-menu-button = /apps/compiz-1/plugins/core/screen0/options/window_menu_button window-menu-key = /apps/compiz-1/plugins/core/screen0/options/window_menu_key [org.compiz.composite:/org/compiz/profiles/Default/plugins/composite/] detect-refresh-rate = /apps/compiz-1/plugins/composite/screen0/options/detect_refresh_rate refresh-rate = /apps/compiz-1/plugins/composite/screen0/options/refresh_rate [org.compiz.opengl:/org/compiz/profiles/Default/plugins/opengl/] lighting = /apps/compiz-1/plugins/opengl/screen0/options/lighting sync-to-vblank = /apps/compiz-1/plugins/opengl/screen0/options/sync_to_vblank texture-compression = /apps/compiz-1/plugins/opengl/screen0/options/texture_compression texture-filter = /apps/compiz-1/plugins/opengl/screen0/options/texture_filter [org.compiz.wall:/org/compiz/profiles/Default/plugins/wall/] down-button = /apps/compiz-1/plugins/wall/screen0/options/down_button down-key = /apps/compiz-1/plugins/wall/screen0/options/down_button down-window-key = /apps/compiz-1/plugins/wall/screen0/options/down_button edgeflip-dnd = /apps/compiz-1/plugins/wall/screen0/options/edgeflip_dnd edgeflip-move = /apps/compiz-1/plugins/wall/screen0/options/edgeflip_move edgeflip-pointer = /apps/compiz-1/plugins/wall/screen0/options/edgeflip_pointer edge-radius = /apps/compiz-1/plugins/wall/screen0/options/edge_radius flip-down-edge = /apps/compiz-1/plugins/wall/screen0/options/flip_down_edge flip-left-edge = /apps/compiz-1/plugins/wall/screen0/options/flip_left_edge flip-right-edge = /apps/compiz-1/plugins/wall/screen0/options/flip_right_edge flip-up-edge = /apps/compiz-1/plugins/wall/screen0/options/flip_up_edge left-button = /apps/compiz-1/plugins/wall/screen0/options/left_button left-key = /apps/compiz-1/plugins/wall/screen0/options/left_key left-window-key = /apps/compiz-1/plugins/wall/screen0/options/left_window_key next-button = /apps/compiz-1/plugins/wall/screen0/options/next_button next-key = /apps/compiz-1/plugins/wall/screen0/options/next_key prev-button = /apps/compiz-1/plugins/wall/screen0/options/prev_button prev-key =/apps/compiz-1/plugins/wall/screen0/options/prev_key right-button = /apps/compiz-1/plugins/wall/screen0/options/right_button right-key = /apps/compiz-1/plugins/wall/screen0/options/right_key right-window-key = /apps/compiz-1/plugins/wall/screen0/options/right_window_key up-button = /apps/compiz-1/plugins/wall/screen0/options/up_button up-key = /apps/compiz-1/plugins/wall/screen0/options/up_key up-window-key = /apps/compiz-1/plugins/wall/screen0/options/up_window_key [org.compiz.expo:/org/compiz/profiles/Default/plugins/expo/] exit-button = /apps/compiz-1/plugins/expo/screen0/options/exit_button expo-edge = /apps/compiz-1/plugins/expo/screen0/options/expo_edge expo-key = /apps/compiz-1/plugins/expo/screen0/options/expo_key expo-immediate-move = /apps/compiz-1/plugins/expo/screen0/options/expo_immediate_move next-vp-button = /apps/compiz-1/plugins/expo/screen0/options/next_vp_button prev-vp-button = /apps/compiz-1/plugins/expo/screen0/options/prev_vp_button [org.compiz.move:/org/compiz/profiles/Default/plugins/move/] initiate-button = /apps/compiz-1/plugins/move/screen0/options/initiate_button initiate-key = /apps/compiz-1/plugins/move/screen0/options/initiate_key [org.compiz.grid:/org/compiz/profiles/Default/plugins/grid/] bottom-edge-action = /apps/compiz-1/plugins/grid/screen0/options/bottom_edge_action bottom-edge-threshold = /apps/compiz-1/plugins/grid/screen0/options/bottom_edge_threshold bottom-left-corner-action = /apps/compiz-1/plugins/grid/screen0/options/bottom_left_corner_action bottom-right-corner-action = /apps/compiz-1/plugins/grid/screen0/options/bottom_right_corner_action draw-indicator = /apps/compiz-1/plugins/grid/screen0/options/draw_indicator fill-color = /apps/compiz-1/plugins/grid/screen0/options/fill_color left-edge-action = /apps/compiz-1/plugins/grid/screen0/options/left_edge_action left-edge-threshold = /apps/compiz-1/plugins/grid/screen0/options/left_edge_threshold outline-color = /apps/compiz-1/plugins/grid/screen0/options/outline_color put-bottom-key = /apps/compiz-1/plugins/grid/screen0/options/put_bottom_key put-bottomleft-key = /apps/compiz-1/plugins/grid/screen0/options/put_bottomleft_key put-bottomright-key = /apps/compiz-1/plugins/grid/screen0/options/put_bottomright_key put-center-key = /apps/compiz-1/plugins/grid/screen0/options/put_center_key put-left-key = /apps/compiz-1/plugins/grid/screen0/options/put_left_key put-maximize-key = /apps/compiz-1/plugins/grid/screen0/options/put_maximize_key put-restore-key = /apps/compiz-1/plugins/grid/screen0/options/put_restore_key put-right-key = /apps/compiz-1/plugins/grid/screen0/options/put_right_key put-top-key = /apps/compiz-1/plugins/grid/screen0/options/put_top_key put-topleft-key = /apps/compiz-1/plugins/grid/screen0/options/put_topleft_key put-topright-key = /apps/compiz-1/plugins/grid/screen0/options/put_topright_key right-edge-action = /apps/compiz-1/plugins/grid/screen0/options/right_edge_action right-edge-threshold = /apps/compiz-1/plugins/grid/screen0/options/right_edge_threshold snapback-windows = /apps/compiz-1/plugins/grid/screen0/options/snapback_windows snapoff-maximized = /apps/compiz-1/plugins/grid/screen0/options/snapoff_maximized top-edge-action = /apps/compiz-1/plugins/grid/screen0/options/top_edge_action top-edge-threshold = /apps/compiz-1/plugins/grid/screen0/options/top_edge_threshold top-left-corner-action = /apps/compiz-1/plugins/grid/screen0/options/top_left_corner_action top-right-corner-action = /apps/compiz-1/plugins/grid/screen0/options/top_right_corner_action compiz-0.9.11+14.04.20140409/compiz.pc.in0000644000015301777760000000037112321343002017725 0ustar pbusernogroup00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz Description: OpenGL compositing manager Version: @VERSION@ Requires: @COMPIZ_REQUIRES@ Libs: -L${libdir} Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compiz compiz-0.9.11+14.04.20140409/README0000644000015301777760000000046712321343002016361 0ustar pbusernogroup00000000000000compiz - OpenGL window and compositing manager Compiz is an OpenGL compositing manager that use GLX_EXT_texture_from_pixmap for binding redirected top-level windows to texture objects. It has a flexible plug-in system and it is designed to run well on most graphics hardware. David Reveman davidr@novell.com compiz-0.9.11+14.04.20140409/COPYING.LGPL0000644000015301777760000006364012321343002017273 0ustar pbusernogroup00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 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. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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 with this License. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; 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. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! compiz-0.9.11+14.04.20140409/compizconfig/0000755000015301777760000000000012321344021020163 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/cmake/0000755000015301777760000000000012321344021021243 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/cmake/exec_setup_py_with_destdir.cmake0000644000015301777760000000130712321343002027671 0ustar pbusernogroup00000000000000set (WDIR "" CACHE FORCE "Working Directory") set (PREFIX "" CACHE FORCE "Prefix") set (SETUP "" CACHE FORCE "Path to setup.py") set (VERSION "" CACHE FORCE "Version") set (EXTRAARGS "") set (BUILD_DEB $ENV{COMPIZ_DEB_BUILD}) set (INSTALL_ROOT $ENV{DESTDIR}) if (INSTALL_ROOT) set (INSTALL_ROOT_ARGS "--root=$ENV{DESTDIR}") else (INSTALL_ROOT) set (INSTALL_ROOT_ARGS "") endif (INSTALL_ROOT) cmake_policy (SET CMP0012 NEW) if (BUILD_DEB) message ("Installing Debian Format") set (EXTRAARGS "--install-layout=deb") endif (BUILD_DEB) execute_process (COMMAND python ${SETUP} install ${EXTRAARGS} --prefix=${PREFIX} --version=${VERSION} ${INSTALL_ROOT_ARGS} WORKING_DIRECTORY ${WDIR}) compiz-0.9.11+14.04.20140409/compizconfig/gconf/0000755000015301777760000000000012321344021021257 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gconf/INSTALL0000644000015301777760000002243212321343002022311 0ustar pbusernogroup00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Here is a another example: /bin/bash ./configure CONFIG_SHELL=/bin/bash Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent configuration-related scripts to be executed by `/bin/bash'. `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. compiz-0.9.11+14.04.20140409/compizconfig/gconf/CMakeLists.txt0000644000015301777760000000120712321343002024015 0ustar pbusernogroup00000000000000if (USE_GCONF) find_package (CompizConfig REQUIRED) include (LibCompizConfigCommon) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/gconf/include) link_directories (${CMAKE_BINARY_DIR}/compizconfig/integration/gnome ${CMAKE_BINARY_DIR}/compizconfig/integration/gnome/gconf) compizconfig_backend (gconf PKGDEPS glib-2.0 gconf-2.0 LIBRARIES compizconfig_gnome_integration compizconfig_gnome_integration_gconf_setting_factory compizconfig_gnome_integration_gconf_integrated_setting) endif (USE_GCONF) compiz-0.9.11+14.04.20140409/compizconfig/gconf/COPYING0000644000015301777760000004312212321343002022312 0ustar pbusernogroup00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. compiz-0.9.11+14.04.20140409/compizconfig/gconf/src/0000755000015301777760000000000012321344021022046 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gconf/src/gconf.c0000644000015301777760000006743112321343002023317 0ustar pbusernogroup00000000000000/** * * GConf libccs backend * * gconf.c * * Copyright (c) 2007 Danny Baumann * * Parts of this code are taken from libberylsettings * gconf backend, written by: * * Copyright (c) 2006 Robert Carr * Copyright (c) 2007 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #define CCS_LOG_DOMAIN "gconf" #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ccs_gnome_integration.h" #include "ccs_gnome_integration_gconf_integrated_setting_factory.h" #define COMPIZ "/apps/compiz-1" #define COMPIZCONFIG "/apps/compizconfig-1" #define PROFILEPATH COMPIZCONFIG "/profiles" #define DEFAULTPROF "Default" #define CORE_NAME "core" #define BUFSIZE 512 #define KEYNAME(sn) char keyName[BUFSIZE]; \ snprintf (keyName, BUFSIZE, "screen%i", sn); #define PATHNAME char pathName[BUFSIZE]; \ if (!ccsPluginGetName (ccsSettingGetParent (setting)) || \ strcmp (ccsPluginGetName (ccsSettingGetParent (setting)), "core") == 0) \ snprintf (pathName, BUFSIZE, \ "%s/general/%s/options/%s", COMPIZ, \ keyName, ccsSettingGetName (setting)); \ else \ snprintf(pathName, BUFSIZE, \ "%s/plugins/%s/%s/options/%s", COMPIZ, \ ccsPluginGetName (ccsSettingGetParent (setting)), keyName, ccsSettingGetName (setting)); static GConfClient *client = NULL; static GConfEngine *conf = NULL; static guint compizNotifyId; static char *currentProfile = NULL; static CCSGNOMEValueChangeData valueChangeData = { NULL, NULL, NULL, NULL }; /* some forward declarations */ static Bool readInit (CCSBackend *backend, CCSContext * context); static void readSetting (CCSBackend *backend, CCSContext * context, CCSSetting * setting); static Bool readOption (CCSSetting * setting); static Bool writeInit (CCSBackend *backend, CCSContext * context); static void writeIntegratedOption (CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integrated); static Bool isIntegratedOption (CCSSetting *setting, CCSIntegratedSetting **integrated) { CCSPlugin *plugin = ccsSettingGetParent (setting); const char *pluginName = ccsPluginGetName (plugin); const char *settingName = ccsSettingGetName (setting); CCSIntegratedSetting *tmp = ccsIntegrationGetIntegratedSetting (valueChangeData.integration, pluginName, settingName); if (integrated) *integrated = tmp; return tmp != NULL; } static void updateSetting (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) { CCSIntegratedSetting *integrated; readInit (backend, context); if (!readOption (setting)) ccsResetToDefault (setting, TRUE); if (ccsGetIntegrationEnabled (context) && isIntegratedOption (setting, &integrated)) { writeInit (backend, context); writeIntegratedOption (context, setting, integrated); } } static void valueChanged (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer user_data) { CCSContext *context = (CCSContext *)user_data; char *keyName = (char*) gconf_entry_get_key (entry); char *pluginName; char *token; unsigned int screenNum; CCSPlugin *plugin; CCSSetting *setting; keyName += strlen (COMPIZ) + 1; token = strsep (&keyName, "/"); /* plugin */ if (!token) return; if (strcmp (token, "general") == 0) { pluginName = "core"; } else { token = strsep (&keyName, "/"); if (!token) return; pluginName = token; } plugin = ccsFindPlugin (context, pluginName); if (!plugin) return; token = strsep (&keyName, "/"); if (!token) return; sscanf (token, "screen%d", &screenNum); token = strsep (&keyName, "/"); /* 'options' */ if (!token) return; token = strsep (&keyName, "/"); if (!token) return; setting = ccsFindSetting (plugin, token); if (!setting) return; /* Passing null here is not optimal, but we are not * maintaining gconf actively here */ updateSetting (NULL, context, plugin, setting); } static void initClient (CCSBackend *backend, CCSContext *context) { client = gconf_client_get_for_engine (conf); valueChangeData.context = context; valueChangeData.storage = ccsIntegratedSettingsStorageDefaultImplNew (&ccsDefaultObjectAllocator); valueChangeData.factory = ccsGConfIntegratedSettingFactoryNew (client, &valueChangeData, &ccsDefaultObjectAllocator); valueChangeData.integration = ccsGNOMEIntegrationBackendNew (backend, context, valueChangeData.factory, valueChangeData.storage, &ccsDefaultObjectAllocator); compizNotifyId = gconf_client_notify_add (client, COMPIZ, valueChanged, context, NULL, NULL); gconf_client_add_dir (client, COMPIZ, GCONF_CLIENT_PRELOAD_NONE, NULL); } static void finiClient (void) { ccsIntegrationUnref (valueChangeData.integration); if (compizNotifyId) { gconf_client_notify_remove (client, compizNotifyId); compizNotifyId = 0; } gconf_client_remove_dir (client, COMPIZ, NULL); gconf_client_suggest_sync (client, NULL); g_object_unref (client); client = NULL; memset (&valueChangeData, 0, sizeof (CCSGNOMEValueChangeData)); } static void copyGconfValues (GConfEngine *conf, const gchar *from, const gchar *to, Bool associate, const gchar *schemaPath) { GSList *values, *tmp; GError *err = NULL; values = gconf_engine_all_entries (conf, from, &err); tmp = values; while (tmp) { GConfEntry *entry = tmp->data; const char *key = gconf_entry_get_key (entry); char *name, *newKey, *newSchema = NULL; name = strrchr (key, '/'); if (!name) continue; if (to) { GConfValue *value; if (asprintf (&newKey, "%s/%s", to, name + 1) == -1) newKey = NULL; if (associate && schemaPath) if (asprintf (&newSchema, "%s/%s", schemaPath, name + 1) == -1) newSchema = NULL; if (newKey && newSchema) gconf_engine_associate_schema (conf, newKey, newSchema, NULL); if (newKey) { value = gconf_engine_get_without_default (conf, key, NULL); if (value) { gconf_engine_set (conf, newKey, value, NULL); gconf_value_free (value); } } if (newSchema) free (newSchema); if (newKey) free (newKey); } else { if (associate) gconf_engine_associate_schema (conf, key, NULL, NULL); gconf_engine_unset (conf, key, NULL); } gconf_entry_unref (entry); tmp = g_slist_next (tmp); } if (values) g_slist_free (values); } static void copyGconfRecursively (GConfEngine *conf, GSList *subdirs, const gchar *to, Bool associate, const gchar *schemaPath) { GSList* tmp; tmp = subdirs; while (tmp) { gchar *path = tmp->data; char *newKey, *newSchema = NULL, *name; name = strrchr (path, '/'); if (name) { if (!(to && asprintf (&newKey, "%s/%s", to, name + 1) != -1)) newKey = NULL; if (associate && schemaPath) if (asprintf (&newSchema, "%s/%s", schemaPath, name + 1) == -1) newSchema = NULL; copyGconfValues (conf, path, newKey, associate, newSchema); copyGconfRecursively (conf, gconf_engine_all_dirs (conf, path, NULL), newKey, associate, newSchema); if (newSchema) free (newSchema); if (newKey) free (newKey); if (!to) gconf_engine_remove_dir (conf, path, NULL); } g_free (path); tmp = g_slist_next (tmp); } if (subdirs) g_slist_free (subdirs); } static void copyGconfTree (CCSBackend *backend, CCSContext *context, const gchar *from, const gchar *to, Bool associate, const gchar *schemaPath) { GSList* subdirs; /* we aren't allowed to have an open GConfClient object while using GConfEngine, so shut it down and open it again afterwards */ finiClient (); subdirs = gconf_engine_all_dirs (conf, from, NULL); gconf_engine_suggest_sync (conf, NULL); copyGconfRecursively (conf, subdirs, to, associate, schemaPath); gconf_engine_suggest_sync (conf, NULL); initClient (backend, context); } static Bool readListValue (CCSSetting *setting, GConfValue *gconfValue) { GConfValueType valueType; unsigned int nItems, i = 0; CCSSettingValueList list = NULL; GSList *valueList = NULL; switch (ccsSettingGetInfo (setting)->forList.listType) { case TypeString: case TypeMatch: case TypeColor: valueType = GCONF_VALUE_STRING; break; case TypeBool: valueType = GCONF_VALUE_BOOL; break; case TypeInt: valueType = GCONF_VALUE_INT; break; case TypeFloat: valueType = GCONF_VALUE_FLOAT; break; default: valueType = GCONF_VALUE_INVALID; break; } if (valueType == GCONF_VALUE_INVALID) return FALSE; if (valueType != gconf_value_get_list_type (gconfValue)) return FALSE; valueList = gconf_value_get_list (gconfValue); if (!valueList) { ccsSetList (setting, NULL, TRUE); return TRUE; } nItems = g_slist_length (valueList); switch (ccsSettingGetInfo (setting)->forList.listType) { case TypeBool: { Bool *array = malloc (nItems * sizeof (Bool)); if (!array) break; for (; valueList; valueList = valueList->next, ++i) array[i] = gconf_value_get_bool (valueList->data) ? TRUE : FALSE; list = ccsGetValueListFromBoolArray (array, nItems, setting); free (array); } break; case TypeInt: { int *array = malloc (nItems * sizeof (int)); if (!array) break; for (; valueList; valueList = valueList->next, ++i) array[i] = gconf_value_get_int (valueList->data); list = ccsGetValueListFromIntArray (array, nItems, setting); free (array); } break; case TypeFloat: { float *array = malloc (nItems * sizeof (float)); if (!array) break; for (; valueList; valueList = valueList->next, ++i) array[i] = gconf_value_get_float (valueList->data); list = ccsGetValueListFromFloatArray (array, nItems, setting); free (array); } break; case TypeString: case TypeMatch: { gchar **array = malloc ((nItems + 1) * sizeof (char*)); if (!array) break; for (; valueList; valueList = valueList->next, ++i) array[i] = strdup (gconf_value_get_string (valueList->data)); array[nItems] = NULL; list = ccsGetValueListFromStringArray ((const char **) array, nItems, setting); g_strfreev (array); } break; case TypeColor: { CCSSettingColorValue *array; array = malloc (nItems * sizeof (CCSSettingColorValue)); if (!array) break; for (; valueList; valueList = valueList->next, ++i) { memset (&array[i], 0, sizeof (CCSSettingColorValue)); ccsStringToColor (gconf_value_get_string (valueList->data), &array[i]); } list = ccsGetValueListFromColorArray (array, nItems, setting); free (array); } break; default: break; } if (list) { ccsSetList (setting, list, TRUE); ccsSettingValueListFree (list, TRUE); return TRUE; } return FALSE; } static Bool readIntegratedOption (CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integrated) { return ccsIntegrationReadOptionIntoSetting (valueChangeData.integration, context, setting, integrated); } static Bool readOption (CCSSetting * setting) { GConfValue *gconfValue = NULL; GError *err = NULL; Bool ret = FALSE; Bool valid = TRUE; KEYNAME (ccsContextGetScreenNum (ccsPluginGetContext (ccsSettingGetParent (setting)))); PATHNAME; /* first check if the key is set */ gconfValue = gconf_client_get_without_default (client, pathName, &err); if (err) { g_error_free (err); return FALSE; } if (!gconfValue) /* value is not set */ return FALSE; /* setting type sanity check */ switch (ccsSettingGetType (setting)) { case TypeString: case TypeMatch: case TypeColor: case TypeKey: case TypeButton: case TypeEdge: valid = (gconfValue->type == GCONF_VALUE_STRING); break; case TypeInt: valid = (gconfValue->type == GCONF_VALUE_INT); break; case TypeBool: case TypeBell: valid = (gconfValue->type == GCONF_VALUE_BOOL); break; case TypeFloat: valid = (gconfValue->type == GCONF_VALUE_FLOAT); break; case TypeList: valid = (gconfValue->type == GCONF_VALUE_LIST); break; default: break; } if (!valid) { ccsWarning ("There is an unsupported value at path %s. " "Settings from this path won't be read. Try to remove " "that value so that operation can continue properly.", pathName); return FALSE; } switch (ccsSettingGetType (setting)) { case TypeString: { const char *value; value = gconf_value_get_string (gconfValue); if (value) { ccsSetString (setting, value, TRUE); ret = TRUE; } } break; case TypeMatch: { const char * value; value = gconf_value_get_string (gconfValue); if (value) { ccsSetMatch (setting, value, TRUE); ret = TRUE; } } break; case TypeInt: { int value; value = gconf_value_get_int (gconfValue); ccsSetInt (setting, value, TRUE); ret = TRUE; } break; case TypeBool: { gboolean value; value = gconf_value_get_bool (gconfValue); ccsSetBool (setting, value ? TRUE : FALSE, TRUE); ret = TRUE; } break; case TypeFloat: { double value; value = gconf_value_get_float (gconfValue); ccsSetFloat (setting, (float)value, TRUE); ret = TRUE; } break; case TypeColor: { const char *value; CCSSettingColorValue color; value = gconf_value_get_string (gconfValue); if (value && ccsStringToColor (value, &color)) { ccsSetColor (setting, color, TRUE); ret = TRUE; } } break; case TypeKey: { const char *value; CCSSettingKeyValue key; value = gconf_value_get_string (gconfValue); if (value && ccsStringToKeyBinding (value, &key)) { ccsSetKey (setting, key, TRUE); ret = TRUE; } } break; case TypeButton: { const char *value; CCSSettingButtonValue button; value = gconf_value_get_string (gconfValue); if (value && ccsStringToButtonBinding (value, &button)) { ccsSetButton (setting, button, TRUE); ret = TRUE; } } break; case TypeEdge: { const char *value; value = gconf_value_get_string (gconfValue); if (value) { unsigned int edges; edges = ccsStringToEdges (value); ccsSetEdge (setting, edges, TRUE); ret = TRUE; } } break; case TypeBell: { gboolean value; value = gconf_value_get_bool (gconfValue); ccsSetBell (setting, value ? TRUE : FALSE, TRUE); ret = TRUE; } break; case TypeList: ret = readListValue (setting, gconfValue); break; default: ccsWarning ("Attempt to read unsupported setting type %d from path %s!", ccsSettingGetType (setting), pathName); break; } if (gconfValue) gconf_value_free (gconfValue); return ret; } static void writeListValue (CCSSetting *setting, char *pathName) { GSList *valueList = NULL; GConfValueType valueType; Bool freeItems = FALSE; CCSSettingValueList list; gpointer data; if (!ccsGetList (setting, &list)) return; switch (ccsSettingGetInfo (setting)->forList.listType) { case TypeBool: { while (list) { data = GINT_TO_POINTER (list->data->value.asBool); valueList = g_slist_append (valueList, data); list = list->next; } valueType = GCONF_VALUE_BOOL; } break; case TypeInt: { while (list) { data = GINT_TO_POINTER (list->data->value.asInt); valueList = g_slist_append(valueList, data); list = list->next; } valueType = GCONF_VALUE_INT; } break; case TypeFloat: { gdouble *item; while (list) { item = malloc (sizeof (gdouble)); if (item) { *item = list->data->value.asFloat; valueList = g_slist_append (valueList, item); } list = list->next; } freeItems = TRUE; valueType = GCONF_VALUE_FLOAT; } break; case TypeString: { while (list) { valueList = g_slist_append(valueList, list->data->value.asString); list = list->next; } valueType = GCONF_VALUE_STRING; } break; case TypeMatch: { while (list) { valueList = g_slist_append(valueList, list->data->value.asMatch); list = list->next; } valueType = GCONF_VALUE_STRING; } break; case TypeColor: { char *item; while (list) { item = ccsColorToString (&list->data->value.asColor); valueList = g_slist_append (valueList, item); list = list->next; } freeItems = TRUE; valueType = GCONF_VALUE_STRING; } break; default: ccsWarning ("Attempt to write unsupported list type %d at path %s!", ccsSettingGetInfo (setting)->forList.listType, pathName); valueType = GCONF_VALUE_INVALID; break; } if (valueType != GCONF_VALUE_INVALID) { gconf_client_set_list (client, pathName, valueType, valueList, NULL); if (freeItems) { GSList *tmpList = valueList; for (; tmpList; tmpList = tmpList->next) if (tmpList->data) free (tmpList->data); } } if (valueList) g_slist_free (valueList); } static void writeIntegratedOption (CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integrated) { ccsIntegrationWriteSettingIntoOption (valueChangeData.integration, context, setting, integrated); } static void resetOptionToDefault (CCSSetting * setting) { KEYNAME (ccsContextGetScreenNum (ccsPluginGetContext (ccsSettingGetParent (setting)))); PATHNAME; gconf_client_recursive_unset (client, pathName, 0, NULL); gconf_client_suggest_sync (client, NULL); } static void writeOption (CCSSetting * setting) { KEYNAME (ccsContextGetScreenNum (ccsPluginGetContext (ccsSettingGetParent (setting)))); PATHNAME; switch (ccsSettingGetType (setting)) { case TypeString: { const char *value; if (ccsGetString (setting, &value)) gconf_client_set_string (client, pathName, value, NULL); } break; case TypeMatch: { const char *value; if (ccsGetMatch (setting, &value)) gconf_client_set_string (client, pathName, value, NULL); } case TypeFloat: { float value; if (ccsGetFloat (setting, &value)) gconf_client_set_float (client, pathName, value, NULL); } break; case TypeInt: { int value; if (ccsGetInt (setting, &value)) gconf_client_set_int (client, pathName, value, NULL); } break; case TypeBool: { Bool value; if (ccsGetBool (setting, &value)) gconf_client_set_bool (client, pathName, value, NULL); } break; case TypeColor: { CCSSettingColorValue value; char *colString; if (!ccsGetColor (setting, &value)) break; colString = ccsColorToString (&value); if (!colString) break; gconf_client_set_string (client, pathName, colString, NULL); free (colString); } break; case TypeKey: { CCSSettingKeyValue key; char *keyString; if (!ccsGetKey (setting, &key)) break; keyString = ccsKeyBindingToString (&key); if (!keyString) break; gconf_client_set_string (client, pathName, keyString, NULL); free (keyString); } break; case TypeButton: { CCSSettingButtonValue button; char *buttonString; if (!ccsGetButton (setting, &button)) break; buttonString = ccsButtonBindingToString (&button); if (!buttonString) break; gconf_client_set_string (client, pathName, buttonString, NULL); free (buttonString); } break; case TypeEdge: { unsigned int edges; char *edgeString; if (!ccsGetEdge (setting, &edges)) break; edgeString = ccsEdgesToString (edges); if (!edgeString) break; gconf_client_set_string (client, pathName, edgeString, NULL); free (edgeString); } break; case TypeBell: { Bool value; if (ccsGetBell (setting, &value)) gconf_client_set_bool (client, pathName, value, NULL); } break; case TypeList: writeListValue (setting, pathName); break; default: ccsWarning ("Attempt to write unsupported setting type %d", ccsSettingGetType (setting)); break; } } static void updateCurrentProfileName (char *profile) { GConfSchema *schema; GConfValue *value; schema = gconf_schema_new (); if (!schema) return; value = gconf_value_new (GCONF_VALUE_STRING); if (!value) { gconf_schema_free (schema); return; } gconf_schema_set_type (schema, GCONF_VALUE_STRING); gconf_schema_set_locale (schema, "C"); gconf_schema_set_short_desc (schema, "Current profile"); gconf_schema_set_long_desc (schema, "Current profile of gconf backend"); gconf_schema_set_owner (schema, "compizconfig-1"); gconf_value_set_string (value, profile); gconf_schema_set_default_value (schema, value); gconf_client_set_schema (client, COMPIZCONFIG "/current_profile", schema, NULL); gconf_schema_free (schema); gconf_value_free (value); } static char* getCurrentProfileName (void) { GConfSchema *schema = NULL; schema = gconf_client_get_schema (client, COMPIZCONFIG "/current_profile", NULL); if (schema) { GConfValue *value; char *ret = NULL; value = gconf_schema_get_default_value (schema); if (value) ret = strdup (gconf_value_get_string (value)); gconf_schema_free (schema); return ret; } return NULL; } static Bool checkProfile (CCSBackend *backend, CCSContext *context) { const char *profileCCS; char *lastProfile; lastProfile = currentProfile; profileCCS = ccsGetProfile (context); if (!profileCCS || !strlen (profileCCS)) currentProfile = strdup (DEFAULTPROF); else currentProfile = strdup (profileCCS); if (!lastProfile || strcmp (lastProfile, currentProfile) != 0) { char *pathName; if (lastProfile) { /* copy /apps/compiz-1 tree to profile path */ if (asprintf (&pathName, "%s/%s", PROFILEPATH, lastProfile) == -1) pathName = NULL; if (pathName) { copyGconfTree (backend, context, COMPIZ, pathName, TRUE, "/schemas" COMPIZ); free (pathName); } } /* reset /apps/compiz-1 tree */ gconf_client_recursive_unset (client, COMPIZ, 0, NULL); /* copy new profile tree to /apps/compiz-1 */ if (asprintf (&pathName, "%s/%s", PROFILEPATH, currentProfile) == -1) pathName = NULL; if (pathName) { copyGconfTree (backend, context, pathName, COMPIZ, FALSE, NULL); /* delete the new profile tree in /apps/compizconfig-1 to avoid user modification in the wrong tree */ copyGconfTree (backend, context, pathName, NULL, TRUE, NULL); free (pathName); } /* update current profile name */ updateCurrentProfileName (currentProfile); } if (lastProfile) free (lastProfile); return TRUE; } static void processEvents (CCSBackend *backend, unsigned int flags) { if (!(flags & ProcessEventsNoGlibMainLoopMask)) { while (g_main_context_pending(NULL)) g_main_context_iteration(NULL, FALSE); } } static Bool initBackend (CCSBackend *backend, CCSContext * context) { g_type_init (); conf = gconf_engine_get_default (); initClient (backend, context); currentProfile = getCurrentProfileName (); return TRUE; } static Bool finiBackend (CCSBackend *backend) { gconf_client_clear_cache (client); finiClient (); if (currentProfile) { free (currentProfile); currentProfile = NULL; } gconf_engine_unref (conf); conf = NULL; return TRUE; } static Bool readInit (CCSBackend *backend, CCSContext * context) { return checkProfile (backend, context); } static void readSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { Bool status; CCSIntegratedSetting *integrated; if (ccsGetIntegrationEnabled (context) && isIntegratedOption (setting, &integrated)) { status = readIntegratedOption (context, setting, integrated); } else status = readOption (setting); if (!status) ccsResetToDefault (setting, TRUE); } static Bool writeInit (CCSBackend *backend, CCSContext * context) { return checkProfile (backend, context); } static void writeSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { CCSIntegratedSetting *integrated; if (ccsGetIntegrationEnabled (context) && isIntegratedOption (setting, &integrated)) { writeIntegratedOption (context, setting, integrated); } else if (ccsSettingGetIsDefault (setting)) { resetOptionToDefault (setting); } else writeOption (setting); } static Bool getSettingIsIntegrated (CCSBackend *backend, CCSSetting * setting) { if (!ccsGetIntegrationEnabled (ccsPluginGetContext (ccsSettingGetParent (setting)))) return FALSE; if (!isIntegratedOption (setting, NULL)) return FALSE; return TRUE; } static Bool getSettingIsReadOnly (CCSBackend *backend, CCSSetting * setting) { /* FIXME */ return FALSE; } static CCSStringList getExistingProfiles (CCSBackend *backend, CCSContext *context) { GSList *data, *tmp; CCSStringList ret = NULL; char *name; gconf_client_suggest_sync (client, NULL); data = gconf_client_all_dirs (client, PROFILEPATH, NULL); for (tmp = data; tmp; tmp = g_slist_next (tmp)) { name = strrchr (tmp->data, '/'); if (name && (strcmp (name + 1, DEFAULTPROF) != 0)) { CCSString *str = calloc (1, sizeof (CCSString)); str->value = strdup (name + 1); ret = ccsStringListAppend (ret, str); } g_free (tmp->data); } g_slist_free (data); name = getCurrentProfileName (); if (name && strcmp (name, DEFAULTPROF) != 0) { CCSString *str = calloc (1, sizeof (CCSString)); str->value = name; ret = ccsStringListAppend (ret, str); } else if (name) free (name); return ret; } static Bool deleteProfile (CCSBackend *backend, CCSContext *context, char *profile) { char path[BUFSIZE]; gboolean status = FALSE; checkProfile (backend, context); snprintf (path, BUFSIZE, "%s/%s", PROFILEPATH, profile); if (gconf_client_dir_exists (client, path, NULL)) { status = gconf_client_recursive_unset (client, path, GCONF_UNSET_INCLUDING_SCHEMA_NAMES, NULL); gconf_client_suggest_sync (client, NULL); } return status; } const CCSBackendInfo gconfBackendInfo = { "gconf", "GConf Configuration Backend", "GConf Configuration Backend for libccs", TRUE, TRUE, 1 }; static const CCSBackendInfo * getInfo (CCSBackend *backend) { return &gconfBackendInfo; } static CCSBackendInterface gconfVTable = { getInfo, processEvents, initBackend, finiBackend, readInit, readSetting, 0, writeInit, writeSetting, 0, updateSetting, getSettingIsIntegrated, getSettingIsReadOnly, getExistingProfiles, deleteProfile }; CCSBackendInterface * getBackendInfo (void) { return &gconfVTable; } compiz-0.9.11+14.04.20140409/compizconfig/gconf/README0000644000015301777760000000000012321343002022123 0ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/0000755000015301777760000000000012321344021022172 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/org.compiz.gschema.xml0000644000015301777760000000145412321343002026413 0ustar pbusernogroup00000000000000 'Default' Current Profile Describes the current profile ['Default'] Existing Profiles Profiles available for the GSettings backend to use [] Plugins with set keys Plugins which have set keys compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/0000755000015301777760000000000012321344021023334 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/test_gsettings_tests.h0000644000015301777760000000650712321343002030003 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_TEST_GSETTINGS_TESTS_H #define _COMPIZCONFIG_TEST_GSETTINGS_TESTS_H #include #include #include #include #include #include using ::testing::TestWithParam; class CCSGSettingsTeardownSetupInterface { public: virtual ~CCSGSettingsTeardownSetupInterface () {} virtual void SetUp () = 0; virtual void TearDown () = 0; }; class CCSGSettingsTestingEnv { public: virtual ~CCSGSettingsTestingEnv () {} virtual void SetUpEnv () { gsliceEnv.SetUpEnv (); g_type_init (); } virtual void TearDownEnv () { gsliceEnv.TearDownEnv (); } private: CompizGLibGSliceOffEnv gsliceEnv; }; class CCSGSettingsMemoryBackendTestingEnv : public CCSGSettingsTestingEnv { public: virtual ~CCSGSettingsMemoryBackendTestingEnv () {} virtual void SetUpEnv () { CCSGSettingsTestingEnv::SetUpEnv (); gsettingsEnv.SetUpEnv (MOCK_PATH); } virtual void TearDownEnv () { gsettingsEnv.TearDownEnv (); CCSGSettingsTestingEnv::TearDownEnv (); } private: CompizGLibGSettingsMemoryBackendTestingEnv gsettingsEnv; }; class CCSGSettingsTestCommon : public ::testing::Test { public: virtual void SetUp () { env.SetUpEnv (); } virtual void TearDown () { env.TearDownEnv (); } private: CompizGLibGSliceOffEnv env; }; class CCSGSettingsTest : public CCSGSettingsTestCommon, public ::testing::WithParamInterface { public: CCSGSettingsTest () : mFuncs (GetParam ()) { } virtual void SetUp () { CCSGSettingsTestCommon::SetUp (); mFuncs->SetUp (); } virtual void TearDown () { CCSGSettingsTestCommon::TearDown (); mFuncs->TearDown (); } private: CCSGSettingsTeardownSetupInterface *mFuncs; }; class CCSGSettingsTestIndependent : public CCSGSettingsTestCommon { public: virtual void SetUp () { CCSGSettingsTestCommon::SetUp (); g_type_init (); } virtual void TearDown () { CCSGSettingsTestCommon::TearDown (); } }; class CCSGSettingsTestWithMemoryBackend : public CCSGSettingsTestIndependent { public: virtual void SetUp () { CCSGSettingsTestIndependent::SetUp (); env.SetUpEnv (MOCK_PATH); } virtual void TearDown () { env.TearDownEnv (); } private: CompizGLibGSettingsMemoryBackendTestingEnv env; }; #endif compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/test_gsettings_conformance.cpp0000644000015301777760000003420612321343002031463 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "backend-conformance-config.h" #include "gsettings-mock-schemas-config.h" #include #include #include #include #include #include #include "gtest_shared_autodestroy.h" #include "test_gsettings_tests.h" #include "compizconfig_ccs_gsettings_settings_env_test.h" #include "compizconfig_ccs_integration_mock.h" using ::testing::AtLeast; using ::testing::Pointee; using ::testing::ReturnNull; namespace cci = compiz::config::impl; class CCSGSettingsBackendEnv : public CCSBackendConceptTestEnvironmentInterface, public CCSGSettingsMemoryBackendTestingEnv { private: virtual void SetUp () { } virtual void TearDown () { } public: CCSGSettingsBackendEnv () : mLoader (AutoDestroy (ccsSharedLibBackendLoaderNew (&ccsDefaultObjectAllocator), ccsBackendLoaderUnref)), pluginToMatch ("mock") { } /* A wrapper to prevent signals from being added */ static void connectToSignalWrapper (CCSBackend *backend, CCSGSettingsWrapper *wrapper) { }; const CCSBackendInfo * GetInfo () { return &gsettingsBackendInfo; } CCSBackend * BackendSetUp (CCSContext *context, CCSContextGMock *gmockContext) { CCSGSettingsBackendInterface *overloadedInterface = NULL; SetUpEnv (); g_setenv ("LIBCOMPIZCONFIG_BACKEND_PATH", BACKEND_BINARY_PATH, true); mContext = context; std::string path ("gsettings"); mBackend = reinterpret_cast (ccsBackendLoaderLoadBackend (mLoader.get (), &ccsDefaultInterfaceTable, mContext, path.c_str ())); EXPECT_TRUE (mBackend); mGSettingsBackend = ccsDynamicBackendGetRawBackend (mBackend); CCSBackendInitFunc backendInit = (GET_INTERFACE (CCSBackendInterface, mBackend))->backendInit; if (backendInit) (*backendInit) ((CCSBackend *) mBackend, mContext); /* Set the new integration, drop our reference on it */ CCSIntegration *integration = ccsMockIntegrationBackendNew (&ccsDefaultObjectAllocator); CCSIntegrationGMock *gmockIntegration = reinterpret_cast (ccsObjectGetPrivate (integration)); EXPECT_CALL (*gmockIntegration, getIntegratedOptionIndex (_, _)).WillRepeatedly (ReturnNull ()); ccsBackendSetIntegration ((CCSBackend *) mBackend, integration); ccsIntegrationUnref (integration); overloadedInterface = GET_INTERFACE (CCSGSettingsBackendInterface, mGSettingsBackend); overloadedInterface->gsettingsBackendConnectToChangedSignal = CCSGSettingsBackendEnv::connectToSignalWrapper; mSettings = ccsGSettingsGetSettingsObjectForPluginWithPath (mGSettingsBackend, "mock", CharacterWrapper (makeCompizPluginPath (profileName.c_str (), "mock")), mContext); mStorage.reset (new CCSGSettingsStorageEnv (mSettings, profileName)); ON_CALL (*gmockContext, getProfile ()).WillByDefault (Return (profileName.c_str ())); return (CCSBackend *) mBackend; } void BackendTearDown (CCSBackend *) { GVariantBuilder noProfilesBuilder; g_variant_builder_init (&noProfilesBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&noProfilesBuilder, "s", "Default"); GVariant *noProfiles = g_variant_builder_end (&noProfilesBuilder); GVariantBuilder pluginKeysBuilder; g_variant_builder_init (&pluginKeysBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&pluginKeysBuilder, "s", "mock"); GVariant *pluginKeys = g_variant_builder_end (&pluginKeysBuilder); ccsGSettingsBackendUnsetAllChangedPluginKeysInProfile (mGSettingsBackend, mContext, pluginKeys, ccsGSettingsBackendGetCurrentProfile ( mGSettingsBackend)); ccsGSettingsBackendClearPluginsWithSetKeys (mGSettingsBackend); ccsGSettingsBackendSetExistingProfiles (mGSettingsBackend, noProfiles); ccsGSettingsBackendSetCurrentProfile (mGSettingsBackend, "Default"); ccsFreeDynamicBackend (mBackend); mStorage.reset (); g_variant_unref (pluginKeys); TearDownEnv (); g_unsetenv ("LIBCOMPIZCONFIG_BACKEND_PATH"); } void AddProfile (const std::string &profile) { ccsGSettingsBackendAddProfile (mGSettingsBackend, profile.c_str ()); } void SetGetExistingProfilesExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*gmockContext, getProfile ()).Times (AtLeast (1)); } void SetDeleteProfileExpectation (const std::string &profileToDelete, CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*gmockContext, getProfile ()).Times (AtLeast (1)); } void SetReadInitExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*gmockContext, getProfile ()).WillOnce (Return (profileName.c_str ())); } void SetReadDoneExpectation (CCSContext *context, CCSContextGMock *gmockContext) { } void SetWriteInitExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*gmockContext, getProfile ()).WillOnce (Return (profileName.c_str ())); } void SetWriteDoneExpectation (CCSContext *context, CCSContextGMock *gmockContext) { } void PreWrite (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { EXPECT_CALL (*gmockContext, getIntegrationEnabled ()).WillRepeatedly (Return (FALSE)); EXPECT_CALL (*gmockPlugin, getContext ()).Times (AtLeast (1)); EXPECT_CALL (*gmockPlugin, getName ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getType ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getName ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getParent ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getIsDefault ()).WillRepeatedly (Return (FALSE)); if (type == TypeList) EXPECT_CALL (*gmockSetting, getDefaultValue ()).WillRepeatedly (ReturnNull ()); } void PostWrite (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) {} void PreRead (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { EXPECT_CALL (*gmockContext, getIntegrationEnabled ()).WillOnce (Return (FALSE)); EXPECT_CALL (*gmockPlugin, getContext ()).Times (AtLeast (1)); EXPECT_CALL (*gmockPlugin, getName ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getType ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getName ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getParent ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, isReadableByBackend ()).WillRepeatedly (Return (TRUE)); if (type == TypeList) { EXPECT_CALL (*gmockSetting, getInfo ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getDefaultValue ()).WillRepeatedly (ReturnNull ()); } } void PostRead (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) {} void PreUpdate (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { EXPECT_CALL (*gmockContext, getIntegrationEnabled ()).WillOnce (Return (FALSE)); EXPECT_CALL (*gmockPlugin, getContext ()).Times (AtLeast (1)); EXPECT_CALL (*gmockPlugin, getName ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getType ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getName ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getParent ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, isReadableByBackend ()).WillRepeatedly (Return (TRUE)); if (type == TypeList) { EXPECT_CALL (*gmockSetting, getInfo ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getDefaultValue ()).WillRepeatedly (ReturnNull ()); } EXPECT_CALL (*gmockContext, getProfile ()); } void PostUpdate (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) {} bool UpdateSettingAtKey (const std::string &plugin, const std::string &setting) { CharacterWrapper keyName (translateKeyForGSettings (setting.c_str ())); if (updateSettingWithGSettingsKeyName (reinterpret_cast (mGSettingsBackend), mSettings, keyName, ccsBackendUpdateSetting)) return true; return false; } void WriteBoolAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteBoolAtKey (plugin, key, value); } void WriteIntegerAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteIntegerAtKey (plugin, key, value); } void WriteFloatAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteFloatAtKey (plugin, key, value); } void WriteStringAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteStringAtKey (plugin, key, value); } void WriteColorAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteColorAtKey (plugin, key, value); } void WriteKeyAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteKeyAtKey (plugin, key, value); } void WriteButtonAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteButtonAtKey (plugin, key, value); } void WriteEdgeAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteEdgeAtKey (plugin, key, value); } void WriteMatchAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteMatchAtKey (plugin, key, value); } void WriteBellAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteBellAtKey (plugin, key, value); } void WriteListAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteListAtKey (plugin, key, value); } Bool ReadBoolAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadBoolAtKey (plugin, key); } int ReadIntegerAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadIntegerAtKey (plugin, key); } float ReadFloatAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadFloatAtKey (plugin, key); } const char * ReadStringAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadStringAtKey (plugin, key); } CCSSettingColorValue ReadColorAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadColorAtKey (plugin, key); } CCSSettingKeyValue ReadKeyAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadKeyAtKey (plugin, key); } CCSSettingButtonValue ReadButtonAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadButtonAtKey (plugin, key); } unsigned int ReadEdgeAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadEdgeAtKey (plugin, key); } const char * ReadMatchAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadMatchAtKey (plugin, key); } Bool ReadBellAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadBellAtKey (plugin, key); } CCSSettingValueList ReadListAtKey (const std::string &plugin, const std::string &key, CCSSetting *setting) { return mStorage->ReadListAtKey (plugin, key, setting); } private: boost::shared_ptr mLoader; CCSGSettingsWrapper *mSettings; boost::shared_ptr mStorage; CCSContext *mContext; CCSDynamicBackend *mBackend; CCSBackend *mGSettingsBackend; std::string pluginToMatch; static const std::string profileName; }; const std::string CCSGSettingsBackendEnv::profileName = "mock"; INSTANTIATE_TEST_CASE_P (CCSGSettingsBackendConcept, CCSBackendConformanceTestReadWrite, compizconfig::test::GenerateTestingParametersForBackendInterface ()); INSTANTIATE_TEST_CASE_P (CCSGSettingsBackendConcept, CCSBackendConformanceTestInfo, compizconfig::test::GenerateTestingEnvFactoryBackendInterface ()); INSTANTIATE_TEST_CASE_P (CCSGSettingsBackendConcept, CCSBackendConformanceTestInitFiniFuncs, compizconfig::test::GenerateTestingEnvFactoryBackendInterface ()); INSTANTIATE_TEST_CASE_P (CCSGSettingsBackendConcept, CCSBackendConformanceTestProfileHandling, compizconfig::test::GenerateTestingEnvFactoryBackendInterface ()); ././@LongLink0000000000000000000000000000015300000000000011214 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/compizconfig_ccs_gsettings_settings_env_test.cppcompiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/compizconfig_ccs_gsettings_settings_env_te0000644000015301777760000002432612321343002034152 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include "test_gsettings_tests.h" #include #include #include "compizconfig_ccs_gsettings_settings_env_test.h" #include "backend-conformance-config.h" #include "gsettings-mock-schemas-config.h" namespace cci = compiz::config::impl; namespace cct = compizconfig::test; class PrivateCCSGSettingsStorageEnv { public: PrivateCCSGSettingsStorageEnv (CCSGSettingsWrapper *settings, const std::string &profileName); CCSGSettingsWrapper *mSettings; std::string profileName; }; void CCSGSettingsStorageEnv::WriteBoolAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeBoolToVariant (cct::boolToBool (boost::get (value)), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteIntegerAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeIntToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteFloatAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeFloatToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteStringAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeStringToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteColorAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeColorToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteKeyAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeKeyToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteButtonAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeButtonToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteEdgeAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeEdgeToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteMatchAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeStringToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteBellAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeBoolToVariant (cct::boolToBool (boost::get (value)), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteListAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; const cci::SettingValueListWrapper::Ptr &lw (boost::get (value)); if (writeListValue (*lw, lw->type (), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } Bool CCSGSettingsStorageEnv::ReadBoolAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeBool)); return readBoolFromVariant (variant.get ()); } int CCSGSettingsStorageEnv::ReadIntegerAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeInt)); return readIntFromVariant (variant.get ()); } float CCSGSettingsStorageEnv::ReadFloatAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeFloat)); return readFloatFromVariant (variant.get ()); } const char * CCSGSettingsStorageEnv::ReadStringAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeString)); return readStringFromVariant (variant.get ()); } CCSSettingColorValue CCSGSettingsStorageEnv::ReadColorAtKey (const std::string &plugin, const std::string &key) { Bool success = FALSE; GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeColor)); CCSSettingColorValue value = readColorFromVariant (variant.get (), &success); EXPECT_TRUE (success); return value; } CCSSettingKeyValue CCSGSettingsStorageEnv::ReadKeyAtKey (const std::string &plugin, const std::string &key) { Bool success = FALSE; GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeKey)); CCSSettingKeyValue value = readKeyFromVariant (variant.get (), &success); EXPECT_TRUE (success); return value; } CCSSettingButtonValue CCSGSettingsStorageEnv::ReadButtonAtKey (const std::string &plugin, const std::string &key) { Bool success = FALSE; GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeButton)); CCSSettingButtonValue value = readButtonFromVariant (variant.get (), &success); EXPECT_TRUE (success); return value; } unsigned int CCSGSettingsStorageEnv::ReadEdgeAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeEdge)); return readEdgeFromVariant (variant.get ()); } const char * CCSGSettingsStorageEnv::ReadMatchAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeMatch)); return readStringFromVariant (variant.get ()); } Bool CCSGSettingsStorageEnv::ReadBellAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeBell)); return readBoolFromVariant (variant.get ()); } CCSSettingValueList CCSGSettingsStorageEnv::ReadListAtKey (const std::string &plugin, const std::string &key, CCSSetting *setting) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeList)); return readListValue (variant.get (), setting, &ccsDefaultObjectAllocator); } GVariantShared CCSGSettingsStorageEnv::ReadVariantAtKeyToShared (const std::string &plugin, const std::string &key, CCSSettingType type) { CharacterWrapper translatedKey (translateKeyForGSettings (key.c_str ())); CharacterWrapper pluginPath (makeCompizPluginPath (priv->profileName.c_str (), plugin.c_str ())); GVariant *rawVariant = getVariantAtKey (priv->mSettings, translatedKey, pluginPath, type); GVariantShared shared (AutoDestroy (rawVariant, g_variant_unref)); return shared; } PrivateCCSGSettingsStorageEnv::PrivateCCSGSettingsStorageEnv (CCSGSettingsWrapper *settings, const std::string &profileName) : mSettings (settings), profileName (profileName) { } CCSGSettingsStorageEnv::CCSGSettingsStorageEnv (CCSGSettingsWrapper *settings, const std::string &profileName) : priv (new PrivateCCSGSettingsStorageEnv (settings, profileName)) { } ././@LongLink0000000000000000000000000000015100000000000011212 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/compizconfig_ccs_gsettings_settings_env_test.hcompiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/compizconfig_ccs_gsettings_settings_env_te0000644000015301777760000001016612321343002034147 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_GSETTINGS_SETTINGS_ENV_TEST_H #define _COMPIZCONFIG_CCS_GSETTINGS_SETTINGS_ENV_TEST_H #include #include #include "compizconfig_ccs_settings_test_fixture.h" typedef boost::shared_ptr GVariantShared; typedef struct _CCSSetting CCSSetting; typedef struct _CCSGSettingsWrapper CCSGSettingsWrapper; typedef enum _CCSSettingType CCSSettingType; class PrivateCCSGSettingsStorageEnv; class CCSGSettingsStorageEnv : public CCSSettingsConceptTestEnvironmentInterface { public: virtual ~CCSGSettingsStorageEnv () {} virtual void SetUp () {} virtual void TearDown () {} CCSGSettingsStorageEnv (CCSGSettingsWrapper *settings, const std::string &profileName); void WriteBoolAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteIntegerAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteFloatAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteStringAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteColorAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteKeyAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteButtonAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteEdgeAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteMatchAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteBellAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteListAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); Bool ReadBoolAtKey (const std::string &plugin, const std::string &key); int ReadIntegerAtKey (const std::string &plugin, const std::string &key); float ReadFloatAtKey (const std::string &plugin, const std::string &key); const char * ReadStringAtKey (const std::string &plugin, const std::string &key); CCSSettingColorValue ReadColorAtKey (const std::string &plugin, const std::string &key); CCSSettingKeyValue ReadKeyAtKey (const std::string &plugin, const std::string &key); CCSSettingButtonValue ReadButtonAtKey (const std::string &plugin, const std::string &key); unsigned int ReadEdgeAtKey (const std::string &plugin, const std::string &key); const char * ReadMatchAtKey (const std::string &plugin, const std::string &key); Bool ReadBellAtKey (const std::string &plugin, const std::string &key); CCSSettingValueList ReadListAtKey (const std::string &plugin, const std::string &key, CCSSetting *setting); private: GVariantShared ReadVariantAtKeyToShared (const std::string &plugin, const std::string &key, CCSSettingType type); std::auto_ptr priv; }; #endif compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/org.compiz.mock.gschema.xml0000644000015301777760000000263512321343002030507 0ustar pbusernogroup00000000000000 0 false 0.0 "" "" false "" "" "" "" [0] [0.0] [true] [""] [""] [""] compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/test_gsettings_tests.cpp0000644000015301777760000022740012321343002030333 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include "gtest_shared_autodestroy.h" #include "gtest_unspecified_bool_type_matcher.h" #include "test_gsettings_tests.h" #include "gsettings.h" #include "ccs_gsettings_backend.h" #include "ccs_gsettings_backend_interface.h" #include "ccs_gsettings_backend_mock.h" #include "compizconfig_ccs_context_mock.h" #include "compizconfig_ccs_plugin_mock.h" #include "compizconfig_ccs_setting_mock.h" #include "compizconfig_ccs_integration_mock.h" #include "ccs_gsettings_wrapper_mock.h" #include "ccs_gsettings_wrapper_factory_mock.h" #include "ccs_gsettings_wrapper_factory_interface.h" #include "ccs_gnome_integration.h" #include "gtest_shared_characterwrapper.h" #include "compizconfig_test_value_combiners.h" #include "compizconfig_ccs_mocked_allocator.h" #include "gsettings_shared.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_wrapper_mock.h" using ::testing::Values; using ::testing::ValuesIn; using ::testing::Return; using ::testing::ReturnNull; using ::testing::Invoke; using ::testing::WithArgs; using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::AllOf; using ::testing::Not; using ::testing::NotNull; using ::testing::Matcher; using ::testing::Eq; using ::testing::NiceMock; using ::testing::StrictMock; using ::testing::IsNull; class GVariantSubtypeMatcher : public ::testing::MatcherInterface { public: GVariantSubtypeMatcher (const std::string &type) : mType (type) { } virtual ~GVariantSubtypeMatcher () {} virtual bool MatchAndExplain (GVariant *x, MatchResultListener *listener) const { return g_variant_type_is_subtype_of (G_VARIANT_TYPE (mType.c_str ()), g_variant_get_type (x)); } virtual void DescribeTo (std::ostream *os) const { *os << "is subtype of " << mType; } private: std::string mType; }; template class GVariantHasValueInArrayMatcher : public ::testing::MatcherInterface { public: GVariantHasValueInArrayMatcher (const std::string &type, const T &t, const boost::function &eq) : mType (type), mT (t), mEq (eq) { } virtual ~GVariantHasValueInArrayMatcher () {} virtual bool MatchAndExplain (GVariant *x, MatchResultListener *listener) const { GVariantIter iter; T match; bool found = false; g_variant_iter_init (&iter, x); while (g_variant_iter_loop (&iter, mType.c_str (), &match)) { if (mEq (match, mT)) found = true; } return found; } virtual void DescribeTo (std::ostream *os) const { *os << "contains " << mT; } private: std::string mType; T mT; boost::function mEq; }; template inline Matcher GVariantHasValueInArray (const std::string &type, const T &t, const boost::function &eq) { return MakeMatcher (new GVariantHasValueInArrayMatcher (type, t, eq)); } inline Matcher IsVariantSubtypeOf (const std::string &type) { return MakeMatcher (new GVariantSubtypeMatcher (type)); } TEST_P(CCSGSettingsTest, TestTestFixtures) { } TEST_F(CCSGSettingsTestIndependent, TestTest) { } namespace { bool streq (const char * const &s1, const char * const &s2) { return g_str_equal (s1, s2); } } class CCSGSettingsTestProfiles : public CCSGSettingsTestIndependent { public: static const std::string newProfileName; static const std::string existingProfileName; }; const std::string CCSGSettingsTestProfiles::existingProfileName ("ExistingProfile"); const std::string CCSGSettingsTestProfiles::newProfileName ("NewProfile"); TEST_F(CCSGSettingsTestProfiles, TestAddProfile) { boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (backend.get ())); GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&builder, "s", existingProfileName.c_str ()); GVariant *existingProfiles = g_variant_builder_end (&builder); EXPECT_CALL (*gmock, getExistingProfiles ()).WillOnce (Return (existingProfiles)); EXPECT_CALL (*gmock, setExistingProfiles (AllOf (IsVariantSubtypeOf ("as"), GVariantHasValueInArray ("s", newProfileName.c_str (), boost::bind (streq, _1, _2))))) .WillOnce (WithArgs <0> (Invoke (g_variant_unref))); ccsGSettingsBackendAddProfileDefault (backend.get (), newProfileName.c_str ()); } TEST_F(CCSGSettingsTestProfiles, TestUpdateCurrentProfileNameAppendNew) { boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (backend.get ())); EXPECT_CALL (*gmock, addProfile (Eq (newProfileName))); EXPECT_CALL (*gmock, setCurrentProfile (Eq (newProfileName))); ccsGSettingsBackendUpdateCurrentProfileNameDefault (backend.get (), newProfileName.c_str ()); } TEST_F(CCSGSettingsTestProfiles, TestUpdateCurrentProfileNameExisting) { boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (backend.get ())); EXPECT_CALL (*gmock, addProfile (Eq (existingProfileName))); EXPECT_CALL (*gmock, setCurrentProfile (Eq (existingProfileName))); ccsGSettingsBackendUpdateCurrentProfileNameDefault (backend.get (), existingProfileName.c_str ()); } TEST_F(CCSGSettingsTestProfiles, TestDeleteProfileExistingProfile) { boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)); boost::shared_ptr context (ccsMockContextNew (), boost::bind (ccsFreeMockContext, _1)); CCSGSettingsBackendGMock *mockBackend = reinterpret_cast (ccsObjectGetPrivate (backend.get ())); std::string currentProfile ("foo"); std::string otherProfile ("other"); GVariant *existingProfiles = NULL; GVariantBuilder existingProfilesBuilder; g_variant_builder_init (&existingProfilesBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&existingProfilesBuilder, "s", currentProfile.c_str ()); g_variant_builder_add (&existingProfilesBuilder, "s", otherProfile.c_str ()); existingProfiles = g_variant_builder_end (&existingProfilesBuilder); EXPECT_CALL (*mockBackend, getPluginsWithSetKeys ()).WillOnce (ReturnNull ()); EXPECT_CALL (*mockBackend, unsetAllChangedPluginKeysInProfile (context.get (), NULL, Eq (currentProfile))); EXPECT_CALL (*mockBackend, clearPluginsWithSetKeys ()); EXPECT_CALL (*mockBackend, getCurrentProfile ()).WillOnce (Return (currentProfile.c_str ())); EXPECT_CALL (*mockBackend, getExistingProfiles ()).WillOnce (Return (existingProfiles)); EXPECT_CALL (*mockBackend, setExistingProfiles (AllOf (IsVariantSubtypeOf ("as"), Not (GVariantHasValueInArray ("s", currentProfile.c_str (), boost::bind (streq, _1, _2))), GVariantHasValueInArray ("s", otherProfile.c_str (), boost::bind (streq, _1, _2))))) .WillOnce (WithArgs <0> (Invoke (g_variant_unref))); EXPECT_CALL (*mockBackend, updateProfile (context.get ())); deleteProfile (backend.get (), context.get (), currentProfile.c_str ()); } TEST_F(CCSGSettingsTestIndependent, TestWriteVariantToKeyReturnsFalseForNullWrapper) { CCSGSettingsWrapper *wrapper = NULL; boost::shared_ptr v (AutoDestroy (g_variant_new_int32 (1), g_variant_unref)); EXPECT_THAT (writeVariantToKey (wrapper, "foo", v.get ()), IsFalse ()); } TEST_F(CCSGSettingsTestIndependent, TestGetSchemaNameForPlugin) { const gchar *plugin = "foo"; gchar *schemaName = getSchemaNameForPlugin (plugin); std::string schemaNameStr (schemaName); size_t pos = schemaNameStr.find (PLUGIN_SCHEMA_ID_PREFIX, 0); EXPECT_EQ (pos, 0); g_free (schemaName); } TEST_F(CCSGSettingsTestIndependent, TestTruncateKeyForGSettingsOver) { const unsigned int OVER_KEY_SIZE = MAX_GSETTINGS_KEY_SIZE + 1; std::string keyname; for (unsigned int i = 0; i <= OVER_KEY_SIZE - 1; ++i) keyname.push_back ('a'); ASSERT_EQ (keyname.size (), OVER_KEY_SIZE); gchar *truncated = truncateKeyForGSettings (keyname.c_str ()); EXPECT_EQ (std::string (truncated).size (), MAX_GSETTINGS_KEY_SIZE); g_free (truncated); } TEST_F(CCSGSettingsTestIndependent, TestTruncateKeyForGSettingsUnder) { const unsigned int UNDER_KEY_SIZE = MAX_GSETTINGS_KEY_SIZE - 1; std::string keyname; for (unsigned int i = 0; i <= UNDER_KEY_SIZE - 1; ++i) keyname.push_back ('a'); ASSERT_EQ (keyname.size (), UNDER_KEY_SIZE); gchar *truncated = truncateKeyForGSettings (keyname.c_str ()); EXPECT_EQ (std::string (truncated).size (), UNDER_KEY_SIZE); g_free (truncated); } TEST_F(CCSGSettingsTestIndependent, TestTranslateUnderscoresToDashesForGSettings) { std::string keyname ("plugin_option"); gchar *translated = translateUnderscoresToDashesForGSettings (keyname.c_str ()); std::string translatedKeyname (translated); EXPECT_EQ (translatedKeyname, std::string ("plugin-option")); g_free (translated); } TEST_F(CCSGSettingsTestIndependent, TestTranslateUpperToLowerForGSettings) { gchar keyname[] = "PLUGIN-OPTION"; translateToLowercaseForGSettings (keyname); EXPECT_EQ (std::string (keyname), "plugin-option"); } TEST_F(CCSGSettingsTestIndependent, TestTranslateKeyForGSettingsNoTrunc) { std::string keyname ("FoO_BaR"); std::string expected ("foo-bar"); CharacterWrapper translated (translateKeyForGSettings (keyname.c_str ())); EXPECT_EQ (std::string (translated), expected); } TEST_F(CCSGSettingsTestIndependent, TestTranslateKeyForGSettingsTrunc) { const unsigned int OVER_KEY_SIZE = MAX_GSETTINGS_KEY_SIZE + 1; std::string keyname; for (unsigned int i = 0; i <= OVER_KEY_SIZE - 1; ++i) keyname.push_back ('a'); ASSERT_EQ (keyname.size (), OVER_KEY_SIZE); CharacterWrapper translated (translateKeyForGSettings (keyname.c_str ())); std::string stringOfTranslated (translated); EXPECT_EQ (stringOfTranslated.size (), MAX_GSETTINGS_KEY_SIZE); } TEST_F(CCSGSettingsTestIndependent, TestTranslateKeyForCCS) { std::string keyname ("plugin-option"); gchar *translated = translateKeyForCCS (keyname.c_str ()); EXPECT_EQ (std::string (translated), "plugin_option"); free (translated); } struct CCSTypeIsVariantType { CCSSettingType settingType; bool isVariantType; }; class CCSGSettingsTestVariantTypeFixture : public ::testing::TestWithParam , public CCSGSettingsTestingEnv { public: virtual void SetUp () { CCSGSettingsTestingEnv::SetUpEnv (); mType = GetParam (); } virtual void TearDown () { CCSGSettingsTestingEnv::TearDownEnv (); } protected: CCSTypeIsVariantType mType; }; TEST_P(CCSGSettingsTestVariantTypeFixture, TestVariantType) { EXPECT_EQ (mType.isVariantType, compizconfigTypeHasVariantType (mType.settingType)); } namespace { CCSTypeIsVariantType type[TypeNum + 1] = { { TypeBool, true }, { TypeInt, true }, { TypeFloat, true }, { TypeString, true }, { TypeColor, true }, { TypeAction, false }, /* Cannot read raw actions */ { TypeKey, false }, /* No actions in lists */ { TypeButton, false }, /* No actions in lists */ { TypeEdge, false }, /* No actions in lists */ { TypeBell, false }, /* No actions in lists */ { TypeMatch, true }, { TypeList, false }, /* No lists in lists */ { TypeNum, false } }; } INSTANTIATE_TEST_CASE_P (CCSGSettingsTestVariantTypeInstantiation, CCSGSettingsTestVariantTypeFixture, ValuesIn (type)); TEST_F(CCSGSettingsTestIndependent, TestDecomposeGSettingsPath) { std::string compiz_gsettings_path (PROFILE_PATH_PREFIX); std::string fake_option_path ("PROFILENAME/plugins/PLUGINNAME"); compiz_gsettings_path += fake_option_path; char *pluginName; unsigned int screenNum; ASSERT_TRUE (decomposeGSettingsPath (compiz_gsettings_path.c_str (), &pluginName, &screenNum)); EXPECT_EQ (std::string (pluginName), "PLUGINNAME"); EXPECT_EQ (screenNum, 0); g_free (pluginName); } TEST_F(CCSGSettingsTestIndependent, TestDecomposeGSettingsPathBadPathname) { std::string compiz_gsettings_path ("org/this/path/is/wrong/"); std::string fake_option_path ("PROFILENAME/plugins/PLUGINNAME"); compiz_gsettings_path += fake_option_path; CharacterWrapper pluginName (strdup ("aaa")); char *pluginNameC = pluginName; unsigned int screenNum = 1; EXPECT_FALSE (decomposeGSettingsPath (compiz_gsettings_path.c_str (), &pluginNameC, &screenNum)); EXPECT_EQ (std::string (pluginNameC), "aaa"); EXPECT_EQ (screenNum, 1); } TEST_F(CCSGSettingsTestIndependent, TestMakeCompizProfilePath) { gchar *a = makeCompizProfilePath ("alpha"); ASSERT_TRUE (a != NULL); EXPECT_EQ (std::string (a), "/org/compiz/profiles/alpha/"); g_free (a); gchar *b = makeCompizProfilePath ("beta/"); ASSERT_TRUE (b != NULL); EXPECT_EQ (std::string (b), "/org/compiz/profiles/beta/"); g_free (b); gchar *c = makeCompizProfilePath ("/gamma"); ASSERT_TRUE (c != NULL); EXPECT_EQ (std::string (c), "/org/compiz/profiles/gamma/"); g_free (c); gchar *d = makeCompizProfilePath ("/delta"); ASSERT_TRUE (d != NULL); EXPECT_EQ (std::string (d), "/org/compiz/profiles/delta/"); g_free (d); } TEST_F(CCSGSettingsTestIndependent, TestMakeCompizPluginPath) { gchar *x = makeCompizPluginPath ("one", "two"); ASSERT_TRUE (x != NULL); EXPECT_EQ (std::string (x), "/org/compiz/profiles/one/plugins/two/"); g_free (x); gchar *y = makeCompizPluginPath ("/three", "four/"); ASSERT_TRUE (y != NULL); EXPECT_EQ (std::string (y), "/org/compiz/profiles/three/plugins/four/"); g_free (y); } namespace GVariantSubtypeWrappers { typedef gboolean (*IsSubtype) (GVariant *v); gboolean boolean (GVariant *v) { return g_variant_type_is_subtype_of (G_VARIANT_TYPE_BOOLEAN, g_variant_get_type (v)); } gboolean bell (GVariant *v) { return boolean (v); } gboolean string (GVariant *v) { return g_variant_type_is_subtype_of (G_VARIANT_TYPE_STRING, g_variant_get_type (v)); } gboolean match (GVariant *v) { return string (v); } gboolean color (GVariant *v) { return string (v); } gboolean key (GVariant *v) { return string (v); } gboolean button (GVariant *v) { return string (v); } gboolean edge (GVariant *v) { return string (v); } gboolean integer (GVariant *v) { return g_variant_type_is_subtype_of (G_VARIANT_TYPE_INT32, g_variant_get_type (v)); } gboolean doubleprecision (GVariant *v) { return g_variant_type_is_subtype_of (G_VARIANT_TYPE_DOUBLE, g_variant_get_type (v)); } gboolean list (GVariant *v) { return g_variant_type_is_array (g_variant_get_type (v)); } gboolean unknown (GVariant *) { return FALSE; } } struct ArrayVariantInfo { GVariantSubtypeWrappers::IsSubtype func; CCSSettingType ccsType; const char *vType; }; namespace { const char *vBoolean = "b"; const char *vString = "s"; const char *vInt = "i"; const char *vDouble = "d"; const char *vArray = "as"; const char *vUnknown = ""; ArrayVariantInfo arrayVariantInfo[] = { { &GVariantSubtypeWrappers::boolean, TypeBool, vBoolean }, { &GVariantSubtypeWrappers::bell, TypeBell, vBoolean }, { &GVariantSubtypeWrappers::string, TypeString, vString }, { &GVariantSubtypeWrappers::match, TypeMatch, vString }, { &GVariantSubtypeWrappers::color, TypeColor, vString }, { &GVariantSubtypeWrappers::key, TypeKey, vString }, { &GVariantSubtypeWrappers::button, TypeButton, vString }, { &GVariantSubtypeWrappers::edge, TypeEdge, vString }, { &GVariantSubtypeWrappers::integer, TypeInt, vInt }, { &GVariantSubtypeWrappers::doubleprecision, TypeFloat, vDouble }, { &GVariantSubtypeWrappers::list, TypeList, vArray }, { &GVariantSubtypeWrappers::unknown, TypeNum, vUnknown } }; } class CCSGSettingsTestArrayVariantSubTypeFixture : public ::testing::TestWithParam , public CCSGSettingsTestingEnv { public: virtual void SetUp () { CCSGSettingsTestingEnv::SetUpEnv (); mAVInfo = GetParam (); } virtual void TearDown () { CCSGSettingsTestingEnv::TearDownEnv (); g_variant_unref (v); } protected: ArrayVariantInfo mAVInfo; GVariant *v; }; TEST_P(CCSGSettingsTestArrayVariantSubTypeFixture, TestArrayVariantValidForCCSTypeBool) { v = g_variant_new (vBoolean, TRUE); EXPECT_EQ ((*mAVInfo.func) (v), variantIsValidForCCSType (v, mAVInfo.ccsType)); } TEST_P(CCSGSettingsTestArrayVariantSubTypeFixture, TestArrayVariantValidForCCSTypeString) { v = g_variant_new (vString, "foo"); EXPECT_EQ ((*mAVInfo.func) (v), variantIsValidForCCSType (v, mAVInfo.ccsType)); } TEST_P(CCSGSettingsTestArrayVariantSubTypeFixture, TestArrayVariantValidForCCSTypeInt) { v = g_variant_new (vInt, 1); EXPECT_EQ ((*mAVInfo.func) (v), variantIsValidForCCSType (v, mAVInfo.ccsType)); } TEST_P(CCSGSettingsTestArrayVariantSubTypeFixture, TestArrayVariantValidForCCSTypeDouble) { v = g_variant_new (vDouble, 2.0); EXPECT_EQ ((*mAVInfo.func) (v), variantIsValidForCCSType (v, mAVInfo.ccsType)); } TEST_P(CCSGSettingsTestArrayVariantSubTypeFixture, TestArrayVariantValidForCCSTypeArray) { GVariantBuilder vb; g_variant_builder_init (&vb, G_VARIANT_TYPE (vArray)); g_variant_builder_add (&vb, "s", "foo"); g_variant_builder_add (&vb, "s", "bar"); v = g_variant_builder_end (&vb); EXPECT_EQ ((*mAVInfo.func) (v), variantIsValidForCCSType (v, mAVInfo.ccsType)); } INSTANTIATE_TEST_CASE_P (CCSGSettingsTestArrayVariantSubTypeInstantiation, CCSGSettingsTestArrayVariantSubTypeFixture, ValuesIn (arrayVariantInfo)); class CCSGSettingsTestPluginsWithSetKeysGVariantSetup : public CCSGSettingsTestIndependent { public: virtual void SetUp () { CCSGSettingsTestIndependent::SetUp (); GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&builder, "s", "foo"); g_variant_builder_add (&builder, "s", "bar"); writtenPlugins = g_variant_builder_end (&builder); newWrittenPlugins = NULL; newWrittenPluginsSize = 0; } virtual void TearDown () { g_variant_unref (writtenPlugins); g_strfreev (newWrittenPlugins); CCSGSettingsTestIndependent::TearDown (); } protected: GVariantBuilder *builder; GVariant *writtenPlugins; char **newWrittenPlugins; gsize newWrittenPluginsSize; }; TEST_F(CCSGSettingsTestPluginsWithSetKeysGVariantSetup, TestAppendToPluginsWithSetKeysListNewItem) { EXPECT_TRUE (appendToPluginsWithSetKeysList ("plugin", writtenPlugins, &newWrittenPlugins, &newWrittenPluginsSize)); EXPECT_EQ (newWrittenPluginsSize, 3); EXPECT_EQ (std::string (newWrittenPlugins[0]), std::string ("foo")); EXPECT_EQ (std::string (newWrittenPlugins[1]), std::string ("bar")); EXPECT_EQ (std::string (newWrittenPlugins[2]), std::string ("plugin")); } TEST_F(CCSGSettingsTestPluginsWithSetKeysGVariantSetup, TestAppendToPluginsWithSetKeysListExistingItem) { EXPECT_FALSE (appendToPluginsWithSetKeysList ("foo", writtenPlugins, &newWrittenPlugins, &newWrittenPluginsSize)); EXPECT_EQ (newWrittenPluginsSize, 2); EXPECT_EQ (std::string (newWrittenPlugins[0]), std::string ("foo")); EXPECT_EQ (std::string (newWrittenPlugins[1]), std::string ("bar")); } class CCSGSettingsTestGSettingsWrapperWithSchemaName : public CCSGSettingsTestIndependent { public: typedef std::tr1::tuple , CCSGSettingsWrapperGMock *> WrapperMock; CCSGSettingsTestGSettingsWrapperWithSchemaName () : objectSchemaGList (NULL) { CCSGSettingsTestIndependent::SetUp (); } ~CCSGSettingsTestGSettingsWrapperWithSchemaName () { g_list_free (objectSchemaGList); CCSGSettingsTestIndependent::TearDown (); } WrapperMock AddObject () { boost::shared_ptr wrapper (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)); CCSGSettingsWrapperGMock *gmockWrapper = reinterpret_cast (ccsObjectGetPrivate (wrapper.get ())); objectSchemaGList = g_list_append (objectSchemaGList, wrapper.get ()); objectSchemaList.push_back (wrapper); return WrapperMock (wrapper, gmockWrapper); } static const std::string VALUE_FOO; static const std::string VALUE_BAR; static const std::string VALUE_BAZ; protected: GList *objectSchemaGList; std::vector > objectSchemaList; }; const std::string CCSGSettingsTestGSettingsWrapperWithSchemaName::VALUE_FOO = "foo"; const std::string CCSGSettingsTestGSettingsWrapperWithSchemaName::VALUE_BAR = "bar"; const std::string CCSGSettingsTestGSettingsWrapperWithSchemaName::VALUE_BAZ = "baz"; TEST_F(CCSGSettingsTestGSettingsWrapperWithSchemaName, TestFindExistingObjectWithSchema) { WrapperMock wr1 (AddObject ()); WrapperMock wr2 (AddObject ()); EXPECT_CALL (*(std::tr1::get <1> (wr1)), getSchemaName ()).WillRepeatedly (Return (VALUE_BAR.c_str ())); EXPECT_CALL (*(std::tr1::get <1> (wr2)), getSchemaName ()).WillRepeatedly (Return (VALUE_FOO.c_str ())); EXPECT_EQ (findCCSGSettingsWrapperBySchemaName (VALUE_FOO.c_str (), objectSchemaGList), (std::tr1::get <0> (wr2)).get ()); } TEST_F(CCSGSettingsTestGSettingsWrapperWithSchemaName, TestNoFindNonexistingObjectWithSchema) { WrapperMock wr1 (AddObject ()); WrapperMock wr2 (AddObject ()); EXPECT_CALL (*(std::tr1::get <1> (wr1)), getSchemaName ()).WillRepeatedly (Return (VALUE_BAR.c_str ())); EXPECT_CALL (*(std::tr1::get <1> (wr2)), getSchemaName ()).WillRepeatedly (Return (VALUE_BAZ.c_str ())); EXPECT_THAT (findCCSGSettingsWrapperBySchemaName (VALUE_FOO.c_str (), objectSchemaGList), IsNull ()); } class CCSGSettingsTestFindSettingLossy : public CCSGSettingsTestIndependent { public: virtual void SetUp () { CCSGSettingsTestIndependent::SetUp (); settingList = NULL; } virtual void TearDown () { ccsSettingListFree (settingList, TRUE); settingList = NULL; CCSGSettingsTestIndependent::TearDown (); } CCSSetting * AddMockSettingWithNameAndType (char *name, CCSSettingType type) { CCSSetting *mockSetting = ccsMockSettingNew (); settingList = ccsSettingListAppend (settingList, mockSetting); CCSSettingGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (mockSetting)); ON_CALL (*gmock, getName ()).WillByDefault (Return (name)); ON_CALL (*gmock, getType ()).WillByDefault (Return (type)); return mockSetting; } void ExpectNameCallOnSetting (CCSSetting *setting) { CCSSettingGMock *gs = reinterpret_cast (ccsObjectGetPrivate (setting)); EXPECT_CALL (*gs, getName ()); } void ExpectTypeCallOnSetting (CCSSetting *setting) { CCSSettingGMock *gs = reinterpret_cast (ccsObjectGetPrivate (setting)); EXPECT_CALL (*gs, getType ()); } protected: CCSSettingList settingList; }; TEST_F(CCSGSettingsTestFindSettingLossy, TestFilterAvailableSettingsByType) { char *name1 = strdup ("foo_bar_baz"); char *name2 = strdup ("foo_bar-baz"); CCSSetting *s1 = AddMockSettingWithNameAndType (name1, TypeInt); CCSSetting *s2 = AddMockSettingWithNameAndType (name2, TypeBool); ExpectTypeCallOnSetting (s1); ExpectTypeCallOnSetting (s2); CCSSettingList filteredList = filterAllSettingsMatchingType (TypeInt, settingList); /* Needs to be expressed in terms of a boolean expression */ ASSERT_THAT (filteredList, NotNull ()); EXPECT_EQ (ccsSettingListLength (filteredList), 1); EXPECT_EQ (filteredList->data, s1); EXPECT_NE (filteredList->data, s2); EXPECT_EQ (NULL, filteredList->next); free (name2); free (name1); ccsSettingListFree (filteredList, FALSE); } TEST_F(CCSGSettingsTestFindSettingLossy, TestFilterAvailableSettingsMatchingPartOfStringIgnoringDashesUnderscoresAndCase) { char *name1 = strdup ("foo_bar_baz_bob"); char *name2 = strdup ("FOO_bar_baz_fred"); char *name3 = strdup ("foo-bar"); CCSSetting *s1 = AddMockSettingWithNameAndType (name1, TypeInt); CCSSetting *s2 = AddMockSettingWithNameAndType (name2, TypeInt); CCSSetting *s3 = AddMockSettingWithNameAndType (name3, TypeInt); ExpectNameCallOnSetting (s1); ExpectNameCallOnSetting (s2); ExpectNameCallOnSetting (s3); CCSSettingList filteredList = filterAllSettingsMatchingPartOfStringIgnoringDashesUnderscoresAndCase ("foo-bar-baz", settingList); ASSERT_THAT (filteredList, NotNull ()); ASSERT_EQ (ccsSettingListLength (filteredList), 2); EXPECT_EQ (filteredList->data, s1); EXPECT_NE (filteredList->data, s3); ASSERT_THAT (filteredList->next, NotNull ()); EXPECT_EQ (filteredList->next->data, s2); EXPECT_NE (filteredList->data, s3); EXPECT_EQ (NULL, filteredList->next->next); free (name1); free (name2); free (name3); ccsSettingListFree (filteredList, FALSE); } TEST_F(CCSGSettingsTestFindSettingLossy, TestAttemptToFindCCSSettingFromLossyNameSuccess) { char *name1 = strdup ("foo_bar_baz_bob"); char *name2 = strdup ("FOO_bar_baz_bob-fred"); char *name3 = strdup ("foo-bar"); char *name4 = strdup ("FOO_bar_baz_bob-fred"); CCSSetting *s1 = AddMockSettingWithNameAndType (name1, TypeInt); CCSSetting *s2 = AddMockSettingWithNameAndType (name2, TypeInt); CCSSetting *s3 = AddMockSettingWithNameAndType (name3, TypeInt); CCSSetting *s4 = AddMockSettingWithNameAndType (name4, TypeString); ExpectNameCallOnSetting (s1); ExpectNameCallOnSetting (s2); ExpectNameCallOnSetting (s3); ExpectTypeCallOnSetting (s1); ExpectTypeCallOnSetting (s2); ExpectTypeCallOnSetting (s3); ExpectTypeCallOnSetting (s4); CCSSetting *found = attemptToFindCCSSettingFromLossyName (settingList, "foo-bar-baz-bob-fred", TypeInt); EXPECT_EQ (found, s2); EXPECT_NE (found, s1); EXPECT_NE (found, s3); EXPECT_NE (found, s4); free (name1); free (name2); free (name3); free (name4); } TEST_F(CCSGSettingsTestFindSettingLossy, TestAttemptToFindCCSSettingFromLossyNameFailTooMany) { char *name1 = strdup ("foo_bar_baz_bob"); char *name2 = strdup ("FOO_bar_baz_bob-fred"); char *name3 = strdup ("FOO_BAR_baz_bob-fred"); char *name4 = strdup ("foo-bar"); char *name5 = strdup ("FOO_bar_baz_bob-fred"); CCSSetting *s1 = AddMockSettingWithNameAndType (name1, TypeInt); CCSSetting *s2 = AddMockSettingWithNameAndType (name2, TypeInt); CCSSetting *s3 = AddMockSettingWithNameAndType (name3, TypeInt); CCSSetting *s4 = AddMockSettingWithNameAndType (name4, TypeInt); CCSSetting *s5 = AddMockSettingWithNameAndType (name5, TypeString); ExpectNameCallOnSetting (s1); ExpectNameCallOnSetting (s2); ExpectNameCallOnSetting (s3); ExpectNameCallOnSetting (s4); ExpectTypeCallOnSetting (s1); ExpectTypeCallOnSetting (s2); ExpectTypeCallOnSetting (s3); ExpectTypeCallOnSetting (s4); ExpectTypeCallOnSetting (s5); CCSSetting *found = attemptToFindCCSSettingFromLossyName (settingList, "foo-bar-baz-bob-fred", TypeInt); ASSERT_FALSE (found); EXPECT_NE (found, s1); EXPECT_NE (found, s2); EXPECT_NE (found, s3); EXPECT_NE (found, s4); EXPECT_NE (found, s5); free (name1); free (name2); free (name3); free (name4); free (name5); } TEST_F(CCSGSettingsTestFindSettingLossy, TestAttemptToFindCCSSettingFromLossyNameFailNoMatches) { char *name1 = strdup ("foo_bar_baz_bob"); char *name2 = strdup ("FOO_bar_baz_bob-richard"); char *name3 = strdup ("foo-bar"); char *name4 = strdup ("FOO_bar_baz_bob-richard"); CCSSetting *s1 = AddMockSettingWithNameAndType (name1, TypeInt); CCSSetting *s2 = AddMockSettingWithNameAndType (name2, TypeInt); CCSSetting *s3 = AddMockSettingWithNameAndType (name3, TypeInt); CCSSetting *s4 = AddMockSettingWithNameAndType (name4, TypeString); ExpectNameCallOnSetting (s1); ExpectNameCallOnSetting (s2); ExpectNameCallOnSetting (s3); ExpectTypeCallOnSetting (s1); ExpectTypeCallOnSetting (s2); ExpectTypeCallOnSetting (s3); ExpectTypeCallOnSetting (s4); CCSSetting *found = attemptToFindCCSSettingFromLossyName (settingList, "foo-bar-baz-bob-fred", TypeInt); ASSERT_FALSE (found); EXPECT_NE (found, s1); EXPECT_NE (found, s2); EXPECT_NE (found, s3); EXPECT_NE (found, s4); free (name1); free (name2); free (name3); free (name4); } namespace { class GListContainerEqualityInterface { public: virtual ~GListContainerEqualityInterface () {} virtual bool operator== (GList *) const = 0; bool operator!= (GList *l) const { return !(*this == l); } }; class GListContainerEqualityBase : public GListContainerEqualityInterface { public: typedef boost::function PopulateFunc; GListContainerEqualityBase (const PopulateFunc &populateGList) { g_setenv ("G_SLICE", "always-malloc", 1); mList = populateGList (); g_unsetenv ("G_SLICE"); } GListContainerEqualityBase (const GListContainerEqualityBase &other) { g_setenv ("G_SLICE", "always-malloc", 1); mList = g_list_copy (other.mList); g_unsetenv ("G_SLICE"); } GListContainerEqualityBase & operator= (GListContainerEqualityBase &other) { if (this == &other) return *this; GListContainerEqualityBase tmp (other); tmp.swap (*this); return *this; } void swap (GListContainerEqualityBase &other) { std::swap (this->mList, other.mList); } bool operator== (GList *other) const { unsigned int numInternal = g_list_length (mList); unsigned int numOther = g_list_length (other); if (numInternal != numOther) return false; GList *iterOther = other; GList *iterInternal = mList; for (unsigned int i = 0; i < numInternal; ++i) { if (static_cast (GPOINTER_TO_INT (iterOther->data)) != static_cast (GPOINTER_TO_INT (iterInternal->data))) return false; iterOther = g_list_next (iterOther); iterInternal = g_list_next (iterInternal); } return true; } ~GListContainerEqualityBase () { g_list_free (mList); } private: GList *mList; }; GList * populateBoolCCSTypes () { GList *ret = NULL; ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeBool))); ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeBell))); return ret; } GList * populateStringCCSTypes () { GList *ret = NULL; ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeString))); ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeColor))); ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeKey))); ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeButton))); ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeEdge))); ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeMatch))); return ret; } GList * populateIntCCSTypes () { GList *ret = NULL; ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeInt))); return ret; } GList * populateDoubleCCSTypes () { GList *ret = NULL; ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeFloat))); return ret; } GList * populateArrayCCSTypes () { GList *ret = NULL; ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeList))); return ret; } struct GListContainerVariantTypeWrapper { const gchar *variantType; GListContainerEqualityBase listOfCCSTypes; }; GListContainerVariantTypeWrapper variantTypeToListOfCCSTypes[] = { { "b", GListContainerEqualityBase (boost::bind (populateBoolCCSTypes)) }, { "s", GListContainerEqualityBase (boost::bind (populateStringCCSTypes)) }, { "i", GListContainerEqualityBase (boost::bind (populateIntCCSTypes)) }, { "d", GListContainerEqualityBase (boost::bind (populateDoubleCCSTypes)) }, { "a", GListContainerEqualityBase (boost::bind (populateArrayCCSTypes)) } }; } class CCSGSettingsTestVariantTypeToCCSTypeListFixture : public ::testing::TestWithParam , public CCSGSettingsTestingEnv { public: CCSGSettingsTestVariantTypeToCCSTypeListFixture () : mListContainer (GetParam ()) { } virtual void SetUp () { CCSGSettingsTestingEnv::SetUpEnv (); } virtual void TearDown () { CCSGSettingsTestingEnv::TearDownEnv (); } protected: GListContainerVariantTypeWrapper mListContainer; }; TEST_P(CCSGSettingsTestVariantTypeToCCSTypeListFixture, TestVariantTypesInListTemplate) { GList *potentialTypeList = variantTypeToPossibleSettingType (mListContainer.variantType); EXPECT_EQ (mListContainer.listOfCCSTypes, potentialTypeList); g_list_free (potentialTypeList); } INSTANTIATE_TEST_CASE_P(CCSGSettingsTestVariantTypeToCCSTypeListInstantiation, CCSGSettingsTestVariantTypeToCCSTypeListFixture, ValuesIn (variantTypeToListOfCCSTypes)); TEST_F(CCSGSettingsTestIndependent, TestGetNameForCCSSetting) { CCSSetting *setting = ccsMockSettingNew (); CCSSettingGMock *gmock = (CCSSettingGMock *) ccsObjectGetPrivate (setting); char *rawSettingName = strdup ("FoO_BaR"); char *properSettingName = translateKeyForGSettings (rawSettingName); EXPECT_CALL (*gmock, getName ()).WillOnce (Return (rawSettingName)); char *translatedSettingName = getNameForCCSSetting (setting); EXPECT_EQ (std::string (translatedSettingName), std::string (properSettingName)); EXPECT_NE (std::string (translatedSettingName), std::string (rawSettingName)); free (translatedSettingName); free (properSettingName); free (rawSettingName); ccsSettingUnref (setting); } TEST_F(CCSGSettingsTestIndependent, TestReadVariantIsValidNULL) { EXPECT_FALSE (checkReadVariantIsValid (NULL, TypeNum, "foo/bar")); } TEST_F(CCSGSettingsTestIndependent, TestReadVariantIsValidTypeBad) { GVariant *v = g_variant_new ("i", 1); EXPECT_FALSE (checkReadVariantIsValid (v, TypeString, "foo/bar")); g_variant_unref (v); } TEST_F(CCSGSettingsTestIndependent, TestReadVariantIsValidTypeGood) { GVariant *v = g_variant_new ("i", 1); EXPECT_TRUE (checkReadVariantIsValid (v, TypeInt, "foo/bar")); g_variant_unref (v); } typedef CCSSettingValueList (*ReadValueListOfDataTypeFunc) (GVariantIter *, guint nItems, CCSSetting *setting); class ReadListValueTypeTestParam { public: typedef boost::function ReadValueListFunc; typedef boost::function GVariantPopulator; typedef boost::function CCSSettingValueListPopulator; ReadListValueTypeTestParam (const ReadValueListFunc &readFunc, const GVariantPopulator &variantPopulator, const CCSSettingValueListPopulator &listPopulator, const CCSSettingType &type) : mReadFunc (readFunc), mVariantPopulator (variantPopulator), mListPopulator (listPopulator), mType (type) { } CCSSettingValueList read (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *allocator) const { return mReadFunc (iter, nItems, setting, allocator); } boost::shared_ptr populateVariant () const { return boost::shared_ptr (mVariantPopulator (), boost::bind (g_variant_unref, _1)); } boost::shared_ptr <_CCSSettingValueList> populateList (CCSSetting *setting) const { return boost::shared_ptr <_CCSSettingValueList> (mListPopulator (setting), boost::bind (ccsSettingValueListFree, _1, TRUE)); } CCSSettingType type () const { return mType; } private: ReadValueListFunc mReadFunc; GVariantPopulator mVariantPopulator; CCSSettingValueListPopulator mListPopulator; CCSSettingType mType; }; namespace compizconfig { namespace test { namespace impl { namespace populators { namespace variant { GVariant * boolean () { GVariantBuilder vb; g_variant_builder_init (&vb, G_VARIANT_TYPE ("ab")); g_variant_builder_add (&vb, "b", boolValues[0]); g_variant_builder_add (&vb, "b", boolValues[1]); g_variant_builder_add (&vb, "b", boolValues[2]); return g_variant_builder_end (&vb); } GVariant * integer () { GVariantBuilder vb; g_variant_builder_init (&vb, G_VARIANT_TYPE ("ai")); g_variant_builder_add (&vb, "i", intValues[0]); g_variant_builder_add (&vb, "i", intValues[1]); g_variant_builder_add (&vb, "i", intValues[2]); return g_variant_builder_end (&vb); } GVariant * doubleprecision () { GVariantBuilder vb; g_variant_builder_init (&vb, G_VARIANT_TYPE ("ad")); g_variant_builder_add (&vb, "d", floatValues[0]); g_variant_builder_add (&vb, "d", floatValues[1]); g_variant_builder_add (&vb, "d", floatValues[2]); return g_variant_builder_end (&vb); } GVariant * string () { GVariantBuilder vb; g_variant_builder_init (&vb, G_VARIANT_TYPE ("as")); g_variant_builder_add (&vb, "s", stringValues[0]); g_variant_builder_add (&vb, "s", stringValues[1]); g_variant_builder_add (&vb, "s", stringValues[2]); return g_variant_builder_end (&vb); } GVariant * color () { GVariantBuilder vb; CharacterWrapper s1 (ccsColorToString (&(getColorValueList ()[0]))); CharacterWrapper s2 (ccsColorToString (&(getColorValueList ()[1]))); CharacterWrapper s3 (ccsColorToString (&(getColorValueList ()[2]))); char * c1 = s1; char * c2 = s2; char * c3 = s3; g_variant_builder_init (&vb, G_VARIANT_TYPE ("as")); g_variant_builder_add (&vb, "s", c1); g_variant_builder_add (&vb, "s", c2); g_variant_builder_add (&vb, "s", c3); return g_variant_builder_end (&vb); } } } } } } class CCSGSettingsTestReadListValueTypes : public ::testing::TestWithParam { }; TEST_P(CCSGSettingsTestReadListValueTypes, TestListValueGoodAllocation) { boost::shared_ptr variant = GetParam ().populateVariant (); boost::shared_ptr mockSetting (ccsNiceMockSettingNew (), boost::bind (ccsFreeMockSetting, _1)); NiceMock *gmockSetting = reinterpret_cast *> (ccsObjectGetPrivate (mockSetting.get ())); ON_CALL (*gmockSetting, getType ()).WillByDefault (Return (TypeList)); CCSSettingInfo info; info.forList.listType = GetParam ().type (); boost::shared_ptr <_CCSSettingValueList> valueList (GetParam ().populateList (mockSetting.get ())); GVariantIter iter; g_variant_iter_init (&iter, variant.get ()); ON_CALL (*gmockSetting, getInfo ()).WillByDefault (Return (&info)); ON_CALL (*gmockSetting, getDefaultValue ()).WillByDefault (ReturnNull ()); boost::shared_ptr <_CCSSettingValueList> readValueList (GetParam ().read (&iter, 3, mockSetting.get (), &ccsDefaultObjectAllocator), boost::bind (ccsSettingValueListFree, _1, TRUE)); EXPECT_TRUE (ccsCompareLists (valueList.get (), readValueList.get (), info.forList)); } TEST_P(CCSGSettingsTestReadListValueTypes, TestListValueThroughListValueDispatch) { boost::shared_ptr variant = GetParam ().populateVariant (); boost::shared_ptr mockSetting (ccsNiceMockSettingNew (), boost::bind (ccsFreeMockSetting, _1)); NiceMock *gmockSetting = reinterpret_cast *> (ccsObjectGetPrivate (mockSetting.get ())); ON_CALL (*gmockSetting, getType ()).WillByDefault (Return (TypeList)); CCSSettingInfo info; info.forList.listType = GetParam ().type (); boost::shared_ptr <_CCSSettingValueList> valueList (GetParam ().populateList (mockSetting.get ())); GVariantIter iter; g_variant_iter_init (&iter, variant.get ()); ON_CALL (*gmockSetting, getInfo ()).WillByDefault (Return (&info)); ON_CALL (*gmockSetting, getDefaultValue ()).WillByDefault (ReturnNull ()); boost::shared_ptr <_CCSSettingValueList> readValueList (readListValue (variant.get (), mockSetting.get (), &ccsDefaultObjectAllocator), boost::bind (ccsSettingValueListFree, _1, TRUE)); EXPECT_TRUE (ccsCompareLists (valueList.get (), readValueList.get (), info.forList)); } TEST_P(CCSGSettingsTestReadListValueTypes, TestListValueBadAllocation) { boost::shared_ptr variant = GetParam ().populateVariant (); boost::shared_ptr mockSetting (ccsNiceMockSettingNew (), boost::bind (ccsFreeMockSetting, _1)); NiceMock *gmockSetting = reinterpret_cast *> (ccsObjectGetPrivate (mockSetting.get ())); StrictMock objectAllocationGMock; FailingObjectAllocation fakeFailingAllocator; CCSObjectAllocationInterface failingAllocatorGMock = failingAllocator; failingAllocatorGMock.allocator = reinterpret_cast (&objectAllocationGMock); ON_CALL (*gmockSetting, getType ()).WillByDefault (Return (TypeList)); GVariantIter iter; g_variant_iter_init (&iter, variant.get ()); EXPECT_CALL (objectAllocationGMock, calloc_ (_, _)).WillOnce (Invoke (&fakeFailingAllocator, &FailingObjectAllocation::calloc_)); boost::shared_ptr <_CCSSettingValueList> readValueList (GetParam ().read (&iter, 3, mockSetting.get (), &failingAllocatorGMock)); EXPECT_THAT (readValueList.get (), IsNull ()); } namespace variant_populators = compizconfig::test::impl::populators::variant; namespace list_populators = compizconfig::test::impl::populators::list; ReadListValueTypeTestParam readListValueTypeTestParam[] = { ReadListValueTypeTestParam (boost::bind (readBoolListValue, _1, _2, _3, _4), boost::bind (variant_populators::boolean), boost::bind (list_populators::boolean, _1), TypeBool), ReadListValueTypeTestParam (boost::bind (readIntListValue, _1, _2, _3, _4), boost::bind (variant_populators::integer), boost::bind (list_populators::integer, _1), TypeInt), ReadListValueTypeTestParam (boost::bind (readFloatListValue, _1, _2, _3, _4), boost::bind (variant_populators::doubleprecision), boost::bind (list_populators::doubleprecision, _1), TypeFloat), ReadListValueTypeTestParam (boost::bind (readStringListValue, _1, _2, _3, _4), boost::bind (variant_populators::string), boost::bind (list_populators::string, _1), TypeString), ReadListValueTypeTestParam (boost::bind (readColorListValue, _1, _2, _3, _4), boost::bind (variant_populators::color), boost::bind (list_populators::color, _1), TypeColor) }; INSTANTIATE_TEST_CASE_P (TestGSettingsReadListValueParameterized, CCSGSettingsTestReadListValueTypes, ::testing::ValuesIn (readListValueTypeTestParam)); class CCSGSettingsBackendReadListValueBadTypesTest : public ::testing::TestWithParam { }; TEST_P (CCSGSettingsBackendReadListValueBadTypesTest, TestGSettingsReadListValueFailsOnNonVariantTypes) { GVariant *variant = NULL; boost::shared_ptr mockSetting (ccsNiceMockSettingNew (), boost::bind (ccsFreeMockSetting, _1)); NiceMock *gmockSetting = reinterpret_cast *> (ccsObjectGetPrivate (mockSetting.get ())); ON_CALL (*gmockSetting, getType ()).WillByDefault (Return (TypeList)); CCSSettingInfo info; info.forList.listType = GetParam (); ON_CALL (*gmockSetting, getInfo ()).WillByDefault (Return (&info)); EXPECT_THAT (readListValue (variant, mockSetting.get (), &ccsDefaultObjectAllocator), IsNull ()); } CCSSettingType readListValueNonVariantTypes[] = { TypeAction, TypeKey, TypeButton, TypeEdge, TypeBell, TypeList, TypeNum }; INSTANTIATE_TEST_CASE_P (CCSGSettingsBackendReadListValueBadTypesTestParameterized, CCSGSettingsBackendReadListValueBadTypesTest, ::testing::ValuesIn (readListValueNonVariantTypes)); TEST_F (CCSGSettingsTestIndependent, TestUpdateProfileDefaultImplCurrentProfile) { boost::shared_ptr context (ccsMockContextNew (), boost::bind (&ccsFreeMockContext, _1)); boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (&ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmockGSettingsBackend = reinterpret_cast (ccsObjectGetPrivate (backend)); CCSContextGMock *gmockContext = reinterpret_cast (ccsObjectGetPrivate (context)); std::string currentProfile ("mock"); EXPECT_CALL (*gmockGSettingsBackend, getCurrentProfile ()).WillOnce (Return (currentProfile.c_str ())); EXPECT_CALL (*gmockContext, getProfile ()).WillOnce (Return (currentProfile.c_str ())); ccsGSettingsBackendUpdateProfileDefault (backend.get (), context.get ()); } TEST_F (CCSGSettingsTestIndependent, TestUpdateProfileDefaultImplDifferentProfile) { boost::shared_ptr context (ccsMockContextNew (), boost::bind (&ccsFreeMockContext, _1)); boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (&ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmockGSettingsBackend = reinterpret_cast (ccsObjectGetPrivate (backend)); CCSContextGMock *gmockContext = reinterpret_cast (ccsObjectGetPrivate (context)); std::string currentProfile ("mock"); std::string otherProfile ("other"); EXPECT_CALL (*gmockGSettingsBackend, getCurrentProfile ()).WillOnce (Return (currentProfile.c_str ())); EXPECT_CALL (*gmockContext, getProfile ()).WillOnce (Return (otherProfile.c_str ())); EXPECT_CALL (*gmockGSettingsBackend, updateCurrentProfileName (Eq (otherProfile))); ccsGSettingsBackendUpdateProfileDefault (backend.get (), context.get ()); } TEST_F (CCSGSettingsTestIndependent, TestUpdateProfileDefaultImplNullProfile) { boost::shared_ptr context (ccsMockContextNew (), boost::bind (&ccsFreeMockContext, _1)); boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (&ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmockGSettingsBackend = reinterpret_cast (ccsObjectGetPrivate (backend)); CCSContextGMock *gmockContext = reinterpret_cast (ccsObjectGetPrivate (context)); std::string currentProfile ("mock"); std::string otherProfile ("other"); EXPECT_CALL (*gmockGSettingsBackend, getCurrentProfile ()).WillOnce (Return (currentProfile.c_str ())); EXPECT_CALL (*gmockContext, getProfile ()).WillOnce (ReturnNull ()); EXPECT_CALL (*gmockGSettingsBackend, updateCurrentProfileName (Eq (std::string (DEFAULTPROF)))); ccsGSettingsBackendUpdateProfileDefault (backend.get (), context.get ()); } TEST_F (CCSGSettingsTestIndependent, TestUpdateProfileDefaultImplEmptyStringProfile) { boost::shared_ptr context (ccsMockContextNew (), boost::bind (&ccsFreeMockContext, _1)); boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (&ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmockGSettingsBackend = reinterpret_cast (ccsObjectGetPrivate (backend)); CCSContextGMock *gmockContext = reinterpret_cast (ccsObjectGetPrivate (context)); std::string currentProfile ("mock"); std::string otherProfile (""); EXPECT_CALL (*gmockGSettingsBackend, getCurrentProfile ()).WillOnce (Return (currentProfile.c_str ())); EXPECT_CALL (*gmockContext, getProfile ()).WillOnce (Return (otherProfile.c_str ())); EXPECT_CALL (*gmockGSettingsBackend, updateCurrentProfileName (Eq (std::string (DEFAULTPROF)))); ccsGSettingsBackendUpdateProfileDefault (backend.get (), context.get ()); } class CCSGSettingsUpdateHandlersTest : public CCSGSettingsTestIndependent { public: CCSGSettingsUpdateHandlersTest () : gsettingsBackend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)), gmockBackend (reinterpret_cast (ccsObjectGetPrivate (gsettingsBackend.get ()))), wrapper (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)), gmockWrapper (reinterpret_cast (ccsObjectGetPrivate (wrapper.get ()))), context (ccsMockContextNew (), boost::bind (ccsFreeMockContext, _1)), gmockContext (reinterpret_cast (ccsObjectGetPrivate (context.get ()))), plugin (NULL), setting (NULL), uncleanKeyName (NULL) { } ~CCSGSettingsUpdateHandlersTest () { if (plugin) ccsPluginUnref (plugin); if (setting) ccsSettingUnref (setting); if (uncleanKeyName) free (uncleanKeyName); } void SetPathAndKeyname (const std::string &setPath, const std::string &setKeyName) { path = setPath; keyName = setKeyName; } protected: boost::shared_ptr gsettingsBackend; CCSGSettingsBackendGMock *gmockBackend; boost::shared_ptr wrapper; CCSGSettingsWrapperGMock *gmockWrapper; boost::shared_ptr context; CCSContextGMock *gmockContext; std::string path; std::string keyName; CCSPlugin *plugin; CCSSetting *setting; char *uncleanKeyName; }; TEST_F (CCSGSettingsUpdateHandlersTest, TestBadPath) { SetPathAndKeyname ("/wrong", "foo"); EXPECT_FALSE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_THAT (plugin, IsNull ()); EXPECT_THAT (setting, IsNull ()); EXPECT_THAT (uncleanKeyName, IsNull ()); } TEST_F (CCSGSettingsUpdateHandlersTest, TestNoPluginFound) { SetPathAndKeyname ("/org/compiz/profiles/baz/plugins/bar", "foo-bar"); EXPECT_CALL (*gmockContext, findPlugin (Eq (std::string ("bar")))).WillOnce (ReturnNull ()); EXPECT_FALSE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_THAT (plugin, IsNull ()); EXPECT_THAT (setting, IsNull ()); EXPECT_THAT (uncleanKeyName, IsNull ()); } TEST_F (CCSGSettingsUpdateHandlersTest, TestNoSettingFound) { CCSPlugin *mockPlugin = ccsMockPluginNew (); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (mockPlugin)); std::string gKeyName ("foo-bar"); SetPathAndKeyname ("/org/compiz/profiles/baz/plugins/bar", gKeyName.c_str ()); CharacterWrapper translated (translateKeyForCCS (gKeyName.c_str ())); EXPECT_CALL (*gmockContext, findPlugin (Eq (std::string ("bar")))).WillOnce (Return (mockPlugin)); EXPECT_CALL (*gmockPlugin, findSetting (Eq (std::string (translated)))).WillOnce (ReturnNull ()); EXPECT_CALL (*gmockWrapper, getValue (Eq (std::string (gKeyName.c_str ())))).WillOnce (ReturnNull ()); EXPECT_FALSE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_EQ (plugin, mockPlugin); EXPECT_THAT (setting, IsNull ()); EXPECT_THAT (uncleanKeyName, Eq (std::string (translated))); } TEST_F (CCSGSettingsUpdateHandlersTest, TestSettingNotFoundAndNoTypeMatches) { GVariant *value = g_variant_new_int16 (2); CCSPlugin *mockPlugin = ccsMockPluginNew (); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (mockPlugin)); std::string gKeyName ("foo-bar"); SetPathAndKeyname ("/org/compiz/profiles/baz/plugins/bar", gKeyName.c_str ()); CharacterWrapper translated (translateKeyForCCS (gKeyName.c_str ())); EXPECT_CALL (*gmockContext, findPlugin (Eq (std::string ("bar")))).WillOnce (Return (mockPlugin)); EXPECT_CALL (*gmockPlugin, findSetting (Eq (std::string (translated)))).WillOnce (ReturnNull ()); EXPECT_CALL (*gmockWrapper, getValue (Eq (std::string (gKeyName.c_str ())))).WillOnce (Return (value)); EXPECT_FALSE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_EQ (plugin, mockPlugin); EXPECT_THAT (setting, IsNull ()); EXPECT_THAT (uncleanKeyName, Eq (std::string (translated))); } TEST_F (CCSGSettingsUpdateHandlersTest, TestSettingNotFoundAndNoSettingMatches) { GVariant *value = g_variant_new_int32 (2); CCSPlugin *mockPlugin = ccsMockPluginNew (); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (mockPlugin)); boost::shared_ptr mockSetting (ccsMockSettingNew (), boost::bind (ccsSettingUnref, _1)); CCSSettingGMock *gmockSetting = reinterpret_cast (ccsObjectGetPrivate (mockSetting)); std::string gKeyName ("foo-bar"); SetPathAndKeyname ("/org/compiz/profiles/baz/plugins/bar", gKeyName.c_str ()); /* Maybe we should fix ccsSettingGetName to return * const char * instead of char * */ CharacterWrapper settingNameInList (strdup ("fbrarr")); char *settingNameInListC = settingNameInList; CharacterWrapper translated (translateKeyForCCS (gKeyName.c_str ())); boost::shared_ptr <_CCSSettingList> settingList (ccsSettingListAppend (NULL, mockSetting.get ()), boost::bind (ccsSettingListFree, _1, FALSE)); EXPECT_CALL (*gmockContext, findPlugin (Eq (std::string ("bar")))).WillOnce (Return (mockPlugin)); EXPECT_CALL (*gmockPlugin, findSetting (Eq (std::string (translated)))).WillOnce (ReturnNull ()); EXPECT_CALL (*gmockWrapper, getValue (Eq (std::string (gKeyName.c_str ())))).WillOnce (Return (value)); EXPECT_CALL (*gmockPlugin, getPluginSettings ()).WillOnce (Return (settingList.get ())); EXPECT_CALL (*gmockSetting, getType ()).WillRepeatedly (Return (TypeInt)); EXPECT_CALL (*gmockSetting, getName ()).WillRepeatedly (Return (settingNameInListC)); EXPECT_FALSE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_EQ (plugin, mockPlugin); EXPECT_THAT (setting, IsNull ()); EXPECT_THAT (uncleanKeyName, Eq (std::string (translated))); } TEST_F (CCSGSettingsUpdateHandlersTest, TestSettingMatches) { CCSPlugin *mockPlugin = ccsMockPluginNew (); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (mockPlugin)); CCSSetting *mockSetting = ccsMockSettingNew (); std::string gKeyName ("foo-bar"); SetPathAndKeyname ("/org/compiz/profiles/baz/plugins/bar", gKeyName.c_str ()); CharacterWrapper translated (translateKeyForCCS (gKeyName.c_str ())); EXPECT_CALL (*gmockContext, findPlugin (Eq (std::string ("bar")))).WillOnce (Return (mockPlugin)); EXPECT_CALL (*gmockPlugin, findSetting (Eq (std::string (translated)))).WillOnce (Return (mockSetting)); EXPECT_TRUE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_EQ (plugin, mockPlugin); EXPECT_THAT (setting, mockSetting); EXPECT_THAT (uncleanKeyName, Eq (std::string (translated))); } TEST_F (CCSGSettingsUpdateHandlersTest, TestFoundSetting) { GVariant *value = g_variant_new_int32 (2); CCSPlugin *mockPlugin = ccsMockPluginNew (); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (mockPlugin)); CCSSetting *mockSetting = ccsMockSettingNew (); CCSSettingGMock *gmockSetting = reinterpret_cast (ccsObjectGetPrivate (mockSetting)); std::string gKeyName ("foo-bar"); SetPathAndKeyname ("/org/compiz/profiles/baz/plugins/bar", gKeyName.c_str ()); /* Maybe we should fix ccsSettingGetName to return * const char * instead of char * */ CharacterWrapper settingNameInList (strdup ("foo_bar")); char *settingNameInListC = settingNameInList; CharacterWrapper translated (translateKeyForCCS (gKeyName.c_str ())); boost::shared_ptr <_CCSSettingList> settingList (ccsSettingListAppend (NULL, mockSetting), boost::bind (ccsSettingListFree, _1, FALSE)); EXPECT_CALL (*gmockContext, findPlugin (Eq (std::string ("bar")))).WillOnce (Return (mockPlugin)); EXPECT_CALL (*gmockPlugin, findSetting (Eq (std::string (translated)))).WillOnce (ReturnNull ()); EXPECT_CALL (*gmockWrapper, getValue (Eq (std::string (gKeyName.c_str ())))).WillOnce (Return (value)); EXPECT_CALL (*gmockPlugin, getPluginSettings ()).WillOnce (Return (settingList.get ())); EXPECT_CALL (*gmockSetting, getType ()).WillRepeatedly (Return (TypeInt)); EXPECT_CALL (*gmockSetting, getName ()).WillRepeatedly (Return (settingNameInListC)); EXPECT_TRUE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_EQ (plugin, mockPlugin); EXPECT_THAT (setting, mockSetting); EXPECT_THAT (uncleanKeyName, Eq (std::string (translated))); } TEST_F (CCSGSettingsUpdateHandlersTest, TestUnfindableSettingToUpdateSetttingsWithGSettingsKeyName) { SetPathAndKeyname ("/wrong", "bad-key"); EXPECT_CALL (*gmockBackend, getContext ()).WillOnce (Return (context.get ())); EXPECT_CALL (*gmockWrapper, getPath ()).WillOnce (Return (path.c_str ())); EXPECT_FALSE (updateSettingWithGSettingsKeyName (gsettingsBackend.get (), wrapper.get (), keyName.c_str (), NULL)); } TEST_F (CCSGSettingsTestIndependent, TestGetVariantAtKeySuccess) { CCSSettingType TYPE = TypeInt; const std::string KEY ("good-key"); const std::string PATH ("/org/compiz/mock/plugins/mock"); boost::shared_ptr wrapper (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)); boost::shared_ptr value (g_variant_ref_sink (g_variant_new_int32 (2)), boost::bind (g_variant_unref, _1)); CCSGSettingsWrapperGMock *gmockWrapper = reinterpret_cast (ccsObjectGetPrivate (wrapper.get ())); EXPECT_CALL (*gmockWrapper, getValue (Eq (KEY))).WillOnce (Return (value.get ())); EXPECT_EQ (getVariantAtKey (wrapper.get (), KEY.c_str (), PATH.c_str (), TYPE), value.get ()); } TEST_F (CCSGSettingsTestIndependent, TestGetVariantAtKeyFailure) { CCSSettingType TYPE = TypeString; const std::string KEY ("good-key"); const std::string PATH ("/org/compiz/mock/plugins/mock"); boost::shared_ptr wrapper (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)); GVariant *value = g_variant_new_int32 (2); CCSGSettingsWrapperGMock *gmockWrapper = reinterpret_cast (ccsObjectGetPrivate (wrapper.get ())); EXPECT_CALL (*gmockWrapper, getValue (Eq (KEY))).WillOnce (Return (value)); EXPECT_THAT (getVariantAtKey (wrapper.get (), KEY.c_str (), PATH.c_str (), TYPE), IsNull ()); } TEST_F (CCSGSettingsTestIndependent, TestMakeSettingPath) { CharacterWrapper PLUGIN (strdup ("mock")); char *PLUGIN_STR = PLUGIN; std::string PROFILE ("mock"); std::string EXPECTED_PATH ("/org/compiz/profiles/mock/plugins/mock/"); boost::shared_ptr plugin (ccsMockPluginNew (), boost::bind (ccsPluginUnref, _1)); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (plugin)); boost::shared_ptr setting (ccsMockSettingNew (), boost::bind (ccsSettingUnref, _1)); CCSSettingGMock *gmockSetting = reinterpret_cast (ccsObjectGetPrivate (setting)); EXPECT_CALL (*gmockSetting, getParent ()).WillOnce (Return (plugin.get ())); EXPECT_CALL (*gmockPlugin, getName ()).WillOnce (Return (PLUGIN_STR)); CharacterWrapper path (makeSettingPath (PROFILE.c_str (), setting.get ())); std::string pathString (path); EXPECT_EQ (pathString, EXPECTED_PATH); } TEST_F (CCSGSettingsTestIndependent, TestFindSettingsObject) { CharacterWrapper PLUGIN (strdup ("mock")); char *PLUGIN_STR = PLUGIN; std::string PROFILE ("mock"); std::string EXPECTED_PATH ("/org/compiz/profiles/mock/plugins/mock/"); boost::shared_ptr plugin (ccsMockPluginNew (), boost::bind (ccsPluginUnref, _1)); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (plugin)); boost::shared_ptr setting (ccsMockSettingNew (), boost::bind (ccsSettingUnref, _1)); CCSSettingGMock *gmockSetting = reinterpret_cast (ccsObjectGetPrivate (setting)); EXPECT_CALL (*gmockSetting, getParent ()).WillOnce (Return (plugin.get ())); EXPECT_CALL (*gmockPlugin, getName ()).WillOnce (Return (PLUGIN_STR)); CharacterWrapper path (makeSettingPath (PROFILE.c_str (), setting.get ())); std::string pathString (path); EXPECT_EQ (pathString, EXPECTED_PATH); } TEST_F (CCSGSettingsTestIndependent, TestResetOptionToDefault) { CharacterWrapper SETTING_NAME (strdup ("Mock_setting")); char *SETTING_NAME_STR = SETTING_NAME; CharacterWrapper TRANSLATED_SETTING_NAME (translateKeyForGSettings (SETTING_NAME)); CharacterWrapper PLUGIN (strdup ("mock")); char *PLUGIN_STR = PLUGIN; std::string PROFILE ("mock"); boost::shared_ptr wrapper (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)); CCSGSettingsWrapperGMock *gmockWrapper = reinterpret_cast (ccsObjectGetPrivate (wrapper.get ())); boost::shared_ptr plugin (ccsMockPluginNew (), boost::bind (ccsPluginUnref, _1)); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (plugin)); boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmockBackend = reinterpret_cast (ccsObjectGetPrivate (backend.get ())); boost::shared_ptr setting (ccsMockSettingNew (), boost::bind (ccsSettingUnref, _1)); CCSSettingGMock *gmockSetting = reinterpret_cast (ccsObjectGetPrivate (setting.get ())); EXPECT_CALL (*gmockSetting, getName ()).WillRepeatedly (Return (SETTING_NAME_STR)); EXPECT_CALL (*gmockSetting, getParent ()).WillRepeatedly (Return (plugin.get ())); EXPECT_CALL (*gmockPlugin, getName ()).WillRepeatedly (Return (PLUGIN_STR)); EXPECT_CALL (*gmockPlugin, getContext ()).WillRepeatedly (ReturnNull ()); EXPECT_CALL (*gmockBackend, getCurrentProfile ()).WillRepeatedly (Return (PROFILE.c_str ())); EXPECT_CALL (*gmockBackend, getSettingsObjectForPluginWithPath (Eq (std::string (PLUGIN)), _, IsNull ())).WillOnce (Return (wrapper.get ())); EXPECT_CALL (*gmockWrapper, resetKey (Eq (std::string (TRANSLATED_SETTING_NAME)))); resetOptionToDefault (backend.get (), setting.get ()); } TEST_F (CCSGSettingsTestIndependent, TestUnsetAllChangedPluginKeysInProfileDefaultImpl) { std::string PLUGIN_FOO ("foo"); std::string PLUGIN_BAR ("bar"); std::string KEY_EXAMPLE_ONE ("example-one"); std::string KEY_EXAMPLE_TWO ("example-two"); std::string KEY_EXAMPLE_THREE ("example-three"); boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmockBackend = reinterpret_cast (ccsObjectGetPrivate (backend.get ())); boost::shared_ptr context (ccsMockContextNew (), boost::bind (ccsFreeMockContext, _1)); const unsigned short NUM_KEYS = 3; gchar ** fooKeys = (gchar **) calloc (1, sizeof (char *) * (NUM_KEYS + 1)); fooKeys[0] = g_strdup (KEY_EXAMPLE_ONE.c_str ()); fooKeys[1] = g_strdup (KEY_EXAMPLE_TWO.c_str ()); fooKeys[2] = g_strdup (KEY_EXAMPLE_THREE.c_str ()); fooKeys[3] = NULL; gchar ** barKeys = (gchar **) calloc (1, sizeof (char *) * (NUM_KEYS + 1)); barKeys[0] = g_strdup (KEY_EXAMPLE_ONE.c_str ()); barKeys[1] = g_strdup (KEY_EXAMPLE_TWO.c_str ()); barKeys[2] = g_strdup (KEY_EXAMPLE_THREE.c_str ()); barKeys[3] = NULL; GVariantBuilder pluginsWithChangedKeysBuilder; g_variant_builder_init (&pluginsWithChangedKeysBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&pluginsWithChangedKeysBuilder, "s", PLUGIN_FOO.c_str ()); g_variant_builder_add (&pluginsWithChangedKeysBuilder, "s", PLUGIN_BAR.c_str ()); boost::shared_ptr pluginsWithChangedKeys (g_variant_ref_sink (g_variant_builder_end (&pluginsWithChangedKeysBuilder)), boost::bind (g_variant_unref, _1)); boost::shared_ptr wrapperForFoo (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)); CCSGSettingsWrapperGMock *gmockWrapperForFoo = reinterpret_cast (ccsObjectGetPrivate (wrapperForFoo.get ())); boost::shared_ptr wrapperForBar (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)); CCSGSettingsWrapperGMock *gmockWrapperForBar = reinterpret_cast (ccsObjectGetPrivate (wrapperForBar.get ())); /* Get the settings wrapper */ EXPECT_CALL (*gmockBackend, getSettingsObjectForPluginWithPath (Eq (PLUGIN_FOO), _, context.get ())).WillOnce (Return (wrapperForFoo.get ())); /* List the keys */ EXPECT_CALL (*gmockWrapperForFoo, listKeys ()).WillOnce (Return (fooKeys)); /* Unset all the keys */ EXPECT_CALL (*gmockWrapperForFoo, resetKey (Eq (KEY_EXAMPLE_ONE))); EXPECT_CALL (*gmockWrapperForFoo, resetKey (Eq (KEY_EXAMPLE_TWO))); EXPECT_CALL (*gmockWrapperForFoo, resetKey (Eq (KEY_EXAMPLE_THREE))); /* Get the settings wrapper */ EXPECT_CALL (*gmockBackend, getSettingsObjectForPluginWithPath (Eq (PLUGIN_BAR), _, context.get ())).WillOnce (Return (wrapperForBar.get ())); /* List the keys */ EXPECT_CALL (*gmockWrapperForBar, listKeys ()).WillOnce (Return (barKeys)); /* Unset all the keys */ EXPECT_CALL (*gmockWrapperForBar, resetKey (Eq (KEY_EXAMPLE_ONE))); EXPECT_CALL (*gmockWrapperForBar, resetKey (Eq (KEY_EXAMPLE_TWO))); EXPECT_CALL (*gmockWrapperForBar, resetKey (Eq (KEY_EXAMPLE_THREE))); ccsGSettingsBackendUnsetAllChangedPluginKeysInProfileDefault (backend.get (), context.get (), pluginsWithChangedKeys.get (), "mock"); } namespace { const CCSBackendInfo stubBackendInfo = { "stub", "stub", "stub", FALSE, FALSE }; const CCSBackendInfo * stubBackendGetInfo (CCSBackend *backend) { return &stubBackendInfo; } Bool stubBackendInit (CCSBackend *backend, CCSContext *context) { return TRUE; } Bool stubBackendFini (CCSBackend *backend) { return TRUE; } CCSBackendInterface stubBackendInterface = { stubBackendGetInfo, NULL, stubBackendInit, stubBackendFini, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; } namespace { const std::string MOCK_PLUGIN_NAME ("mock"); const std::string MOCK_SCHEMA_NAME ("org.compiz.mock"); const std::string MOCK_PROFILE_NAME ("mock"); const std::string MOCK_GSCHEMA_PATH ("/org/compiz/profiles/mock/plugins/mock"); const std::string PLUGINS_WITH_SET_KEYS ("plugins-with-set-keys"); boost::shared_ptr GetEmptyPluginsWithSetKeys () { GVariantBuilder pluginsWithChangedKeysBuilder; g_variant_builder_init (&pluginsWithChangedKeysBuilder, G_VARIANT_TYPE ("as")); return AutoDestroy (g_variant_ref_sink (g_variant_builder_end (&pluginsWithChangedKeysBuilder)), g_variant_unref); } } class CCSGSettingsTestCCSGSettingsBackend : public CCSGSettingsTestIndependent { public: CCSGSettingsTestCCSGSettingsBackend () : mockContext (AutoDestroy (ccsMockContextNew (), ccsFreeMockContext)), stubBackend (AutoDestroy (ccsBackendNewWithDynamicInterface (mockContext.get (), &stubBackendInterface), ccsBackendUnref)), mockCompizconfigSettings (ccsMockGSettingsWrapperNew ()), mockCurrentProfileSettings (ccsMockGSettingsWrapperNew ()), mockWrapperFactory (ccsMockGSettingsWrapperFactoryNew ()), mockIntegration (ccsMockIntegrationBackendNew (&ccsDefaultObjectAllocator)), valueChangeData (reinterpret_cast (calloc (1, sizeof (CCSGNOMEValueChangeData)))), currentProfile (strdup (MOCK_PROFILE_NAME.c_str ())), mockMockPluginWrapper (ccsMockGSettingsWrapperNew ()), gmockWrapperFactory (reinterpret_cast (ccsObjectGetPrivate (mockWrapperFactory))), gmockWrapper (reinterpret_cast (ccsObjectGetPrivate (mockMockPluginWrapper))), gmockCurrentProfileSettings (reinterpret_cast (ccsObjectGetPrivate (mockCurrentProfileSettings))) { valueChangeData->integration = mockIntegration; valueChangeData->factory = NULL; valueChangeData->storage = NULL; valueChangeData->context = mockContext.get (); if (!ccsGSettingsBackendAttachNewToBackend (stubBackend.get (), mockContext.get (), mockCompizconfigSettings, mockCurrentProfileSettings, mockWrapperFactory, mockIntegration, valueChangeData, currentProfile)) throw std::runtime_error ("Failed to attach GSettings backend"); } virtual void TearDown () { ccsGSettingsBackendDetachFromBackend (stubBackend.get ()); CCSGSettingsTestIndependent::TearDown (); } boost::shared_ptr mockContext; boost::shared_ptr stubBackend; CCSGSettingsWrapper *mockCompizconfigSettings; CCSGSettingsWrapper *mockCurrentProfileSettings; CCSGSettingsWrapperFactory *mockWrapperFactory; CCSIntegration *mockIntegration; CCSGNOMEValueChangeData *valueChangeData; char *currentProfile; CCSGSettingsWrapper *mockMockPluginWrapper; CCSGSettingsWrapperFactoryGMock *gmockWrapperFactory; CCSGSettingsWrapperGMock *gmockWrapper; CCSGSettingsWrapperGMock *gmockCurrentProfileSettings; }; TEST_F (CCSGSettingsTestCCSGSettingsBackend, TestWriteOutSetKeysOnGetSettingsObject) { /* Should create a new wrapper for this "plugin" */ EXPECT_CALL (*gmockWrapperFactory, newGSettingsWrapperWithPath (Eq (MOCK_SCHEMA_NAME), Eq (MOCK_GSCHEMA_PATH), _)).WillOnce (Return (mockMockPluginWrapper)); EXPECT_CALL (*gmockWrapper, connectToChangedSignal (_, stubBackend.get ())); boost::shared_ptr pluginsWithSetKeysVariantEmpty (GetEmptyPluginsWithSetKeys ()); /* Should now get the value of plugins-with-set-keys from * mockCurrentProfileSettings */ EXPECT_CALL (*gmockCurrentProfileSettings, getValue (Eq (PLUGINS_WITH_SET_KEYS))) .WillOnce (Return (g_variant_ref (pluginsWithSetKeysVariantEmpty.get ()))); /* Should acknowledge that we wrote to this schema */ EXPECT_CALL (*gmockCurrentProfileSettings, setValue (Eq (PLUGINS_WITH_SET_KEYS), GVariantHasValueInArray ("s", MOCK_PLUGIN_NAME.c_str (), boost::bind (streq, _1, _2)))) .WillOnce (WithArgs <1> (Invoke (g_variant_unref)));; CCSGSettingsWrapper *wrapper = ccsGSettingsGetSettingsObjectForPluginWithPath (stubBackend.get (), MOCK_PLUGIN_NAME.c_str (), MOCK_GSCHEMA_PATH.c_str (), mockContext.get ()); EXPECT_EQ (wrapper, mockMockPluginWrapper); } TEST_F (CCSGSettingsTestCCSGSettingsBackend, TestNoWriteOutSetKeysOnGetSettingsObjectIfAlreadyWritten) { /* Should create a new wrapper for this "plugin" */ EXPECT_CALL (*gmockWrapperFactory, newGSettingsWrapperWithPath (Eq (MOCK_SCHEMA_NAME), Eq (MOCK_GSCHEMA_PATH), _)).WillOnce (Return (mockMockPluginWrapper)); EXPECT_CALL (*gmockWrapper, connectToChangedSignal (_, stubBackend.get ())); GVariantBuilder pluginsWithChangedKeysBuilder; g_variant_builder_init (&pluginsWithChangedKeysBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&pluginsWithChangedKeysBuilder, "s", MOCK_PLUGIN_NAME.c_str ()); boost::shared_ptr pluginsWithSetKeysVariantNonEmpty (AutoDestroy (g_variant_ref_sink (g_variant_builder_end (&pluginsWithChangedKeysBuilder)), g_variant_unref)); /* Should now get the value of plugins-with-set-keys from * mockCurrentProfileSettings */ EXPECT_CALL (*gmockCurrentProfileSettings, getValue (Eq (PLUGINS_WITH_SET_KEYS))) .WillOnce (Return (g_variant_ref (pluginsWithSetKeysVariantNonEmpty.get ()))); /* No acknowledgement */ EXPECT_CALL (*gmockCurrentProfileSettings, setValue (_, _)).Times (0); CCSGSettingsWrapper *wrapper = ccsGSettingsGetSettingsObjectForPluginWithPath (stubBackend.get (), MOCK_PLUGIN_NAME.c_str (), MOCK_GSCHEMA_PATH.c_str (), mockContext.get ()); EXPECT_EQ (wrapper, mockMockPluginWrapper); } TEST_F (CCSGSettingsTestCCSGSettingsBackend, TestReturnExistingWrapper) { /* Should create a new wrapper for this "plugin" */ EXPECT_CALL (*gmockWrapperFactory, newGSettingsWrapperWithPath (Eq (MOCK_SCHEMA_NAME), Eq (MOCK_GSCHEMA_PATH), _)).WillOnce (Return (mockMockPluginWrapper)); EXPECT_CALL (*gmockWrapper, connectToChangedSignal (_, stubBackend.get ())); boost::shared_ptr pluginsWithSetKeysVariantEmpty (GetEmptyPluginsWithSetKeys ()); /* Should now get the value of plugins-with-set-keys from * mockCurrentProfileSettings */ EXPECT_CALL (*gmockCurrentProfileSettings, getValue (Eq (PLUGINS_WITH_SET_KEYS))) .WillOnce (Return (g_variant_ref (pluginsWithSetKeysVariantEmpty.get ()))); /* Should acknowledge that we wrote to this schema */ EXPECT_CALL (*gmockCurrentProfileSettings, setValue (Eq (PLUGINS_WITH_SET_KEYS), _)) .WillOnce (WithArgs <1> (Invoke (g_variant_unref))); CCSGSettingsWrapper *wrapper = ccsGSettingsGetSettingsObjectForPluginWithPath (stubBackend.get (), MOCK_PLUGIN_NAME.c_str (), MOCK_GSCHEMA_PATH.c_str (), mockContext.get ()); EXPECT_CALL (*gmockWrapper, getSchemaName ()).WillOnce (Return (MOCK_SCHEMA_NAME.c_str ())); /* Shouldn't be called again */ EXPECT_CALL (*gmockWrapperFactory, newGSettingsWrapperWithPath (_, _, _)).Times (0); wrapper = ccsGSettingsGetSettingsObjectForPluginWithPath (stubBackend.get (), MOCK_PLUGIN_NAME.c_str (), MOCK_GSCHEMA_PATH.c_str (), mockContext.get ()); /* It should return the cached one */ EXPECT_EQ (mockMockPluginWrapper, wrapper); } compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/CMakeLists.txt0000644000015301777760000000753112321343002026100 0ustar pbusernogroup00000000000000include (FindPkgConfig) include (CompizGSettings) include_directories (${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../mocks ${CMAKE_CURRENT_SOURCE_DIR}/../testenvironments ${CMAKE_CURRENT_SOURCE_DIR}/../src ${CMAKE_CURRENT_SOURCE_DIR}/../../libcompizconfig/src ${CMAKE_CURRENT_SOURCE_DIR}/../../libcompizconfig/tests ${CMAKE_CURRENT_SOURCE_DIR}/../../mocks/libcompizconfig ${CMAKE_CURRENT_SOURCE_DIR}/../../tests ${CMAKE_SOURCE_DIR}/tests/shared ${CMAKE_SOURCE_DIR}/tests/shared/glib) pkg_check_modules (COMPIZCONFIG_TEST_GSETTINGS gio-2.0 glib-2.0) if (COMPIZCONFIG_TEST_GSETTINGS_FOUND) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../libcompizconfig/tests) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../testenvironments) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../mocks) add_library (compizconfig_gsettings_settings_test_env STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_gsettings_settings_env_test.cpp) add_executable (compizconfig_test_gsettings ${CMAKE_CURRENT_SOURCE_DIR}/test_gsettings_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_gsettings_wrapper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_gsettings.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_gsettings_tests.h) add_executable (compizconfig_test_gsettings_conformance ${CMAKE_CURRENT_SOURCE_DIR}/test_gsettings_conformance.cpp) target_link_libraries (compizconfig_test_gsettings compizconfig_gsettings_backend compizconfig_ccs_setting_mock compizconfig_ccs_plugin_mock compizconfig_ccs_context_mock compizconfig_ccs_integration_mock compizconfig_ccs_gsettings_backend_mock compizconfig_ccs_gsettings_wrapper_mock compizconfig_ccs_gsettings_wrapper_factory_mock compizconfig_ccs_test_value_combinations ${COMPIZCONFIG_TEST_GSETTINGS_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY}) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/gsettings-mock-schemas-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/gsettings-mock-schemas-config.h) add_custom_command (OUTPUT ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/org.compiz.mock.gschema.xml COMMAND cp -r ${CMAKE_CURRENT_SOURCE_DIR}/org.compiz.mock.gschema.xml ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/org.compiz.mock.gschema.xml DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/org.compiz.mock.gschema.xml VERBATIM) add_custom_target (compiz_gsettings_mock_schema ALL DEPENDS ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/org.compiz.mock.gschema.xml) add_gsettings_schema_to_recompilation_list (compiz_gsettings_mock_schema) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/backend-conformance-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/backend-conformance-config.h) target_link_libraries (compizconfig_test_gsettings_conformance compizconfig_gsettings_settings_test_env compizconfig_gsettings_backend compizconfig_ccs_setting_mock compizconfig_ccs_plugin_mock compizconfig_ccs_context_mock compizconfig_ccs_item_in_list_matcher compizconfig_ccs_list_equality compizconfig_ccs_list_wrapper compizconfig_ccs_backend_conformance_test compizconfig_ccs_setting_value_operators compizconfig_ccs_test_value_combinations compizconfig_ccs_integration_mock compizconfig ${COMPIZCONFIG_TEST_GSETTINGS_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compizconfig_test_gsettings COVERAGE compizconfig_gsettings_backend) compiz_discover_tests (compizconfig_test_gsettings_conformance COVERAGE compizconfig_gsettings_backend gsettings) endif (COMPIZCONFIG_TEST_GSETTINGS_FOUND) compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/test_gsettings.cpp0000644000015301777760000000104612321343002027105 0ustar pbusernogroup00000000000000#include "test_gsettings_tests.h" using ::testing::Values; class CCSGSettingsTestWithMocks : public CCSGSettingsTeardownSetupInterface { public: void SetUp () {} void TearDown () {} }; class CCSGSettingsTestWithSystem : public CCSGSettingsTeardownSetupInterface { public: void SetUp () {} void TearDown () {} }; namespace { CCSGSettingsTestWithMocks withMocks; CCSGSettingsTestWithSystem withSystem; } INSTANTIATE_TEST_CASE_P(CompizConfigGSettingsTestWithMocks, CCSGSettingsTest, Values (&withMocks, &withSystem)); compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/test_gsettings_wrapper.cpp0000644000015301777760000002016712321343002030652 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include #include #include #include #include #include "test_gsettings_tests.h" using ::testing::NotNull; using ::testing::IsNull; using ::testing::Eq; using ::testing::_; class CCSGSettingsWrapperTest : public CCSGSettingsTestWithMemoryBackend { public: CCSGSettingsWrapperTest () : mockSchema ("org.compiz.mock"), mockPath ("/org/compiz/mock/mock/") { } virtual CCSObjectAllocationInterface * GetAllocator () = 0; virtual void SetUp () { CCSGSettingsTestWithMemoryBackend::SetUp (); } virtual void TearDown () { CCSGSettingsTestWithMemoryBackend::TearDown (); } protected: std::string mockSchema; std::string mockPath; boost::shared_ptr wrapper; GSettings *settings; }; class CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest : public CCSGSettingsWrapperTest { protected: CCSObjectAllocationInterface * GetAllocator () { return &ccsDefaultObjectAllocator; } }; class CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest : public CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest { public: virtual void SetUp () { CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest::SetUp (); wrapper.reset (ccsGSettingsWrapperNewForSchemaWithPath (mockSchema.c_str (), mockPath.c_str (), GetAllocator ()), boost::bind (ccsFreeGSettingsWrapper, _1)); ASSERT_THAT (wrapper.get (), NotNull ()); settings = ccsGSettingsWrapperGetGSettings (wrapper.get ()); ASSERT_THAT (settings, NotNull ()); } }; TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest, TestWrapperConstructionWithBadSchemaReturnsNull) { const std::string badSchema ("org.compiz.invalid"); EXPECT_THAT (ccsGSettingsWrapperNewForSchemaWithPath (badSchema.c_str (), mockPath.c_str (), &ccsDefaultObjectAllocator), IsNull ()); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest, TestWrapperConstructionWithPathForNonrelocableSchemaNull) { const std::string badSchema ("org.compiz"); EXPECT_THAT (ccsGSettingsWrapperNewForSchemaWithPath (badSchema.c_str (), mockPath.c_str (), &ccsDefaultObjectAllocator), IsNull ()); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest, TestWrapperConstruction) { const std::string nonrelocatableSchema ("org.compiz"); boost::shared_ptr wrapper (ccsGSettingsWrapperNewForSchema (nonrelocatableSchema.c_str (), &ccsDefaultObjectAllocator), boost::bind (ccsFreeGSettingsWrapper, _1)); EXPECT_THAT (wrapper.get (), NotNull ()); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest, TestWrapperConstructionWithPath) { boost::shared_ptr wrapper (ccsGSettingsWrapperNewForSchemaWithPath (mockSchema.c_str (), mockPath.c_str (), &ccsDefaultObjectAllocator), boost::bind (ccsFreeGSettingsWrapper, _1)); EXPECT_THAT (wrapper.get (), NotNull ()); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest, TestGetGSettingsWrapper) { boost::shared_ptr wrapper (ccsGSettingsWrapperNewForSchemaWithPath (mockSchema.c_str (), mockPath.c_str (), &ccsDefaultObjectAllocator), boost::bind (ccsFreeGSettingsWrapper, _1)); ASSERT_THAT (wrapper.get (), NotNull ()); EXPECT_THAT (ccsGSettingsWrapperGetGSettings (wrapper.get ()), NotNull ()); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestSetValueOnWrapper) { const unsigned int VALUE = 2; const std::string KEY ("integer-setting"); boost::shared_ptr variant (g_variant_new ("i", VALUE, NULL), boost::bind (g_variant_unref, _1)); ccsGSettingsWrapperSetValue (wrapper.get (), KEY.c_str (), variant.get ()); boost::shared_ptr value (g_settings_get_value (settings, KEY.c_str ()), boost::bind (g_variant_unref, _1)); int v = g_variant_get_int32 (value.get ()); EXPECT_EQ (VALUE, v); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestGetValueOnWrapper) { const double VALUE = 3.0; const std::string KEY ("float-setting"); boost::shared_ptr variant (g_variant_new ("d", VALUE, NULL), boost::bind (g_variant_unref, _1)); g_settings_set_value (settings, KEY.c_str (), variant.get ()); boost::shared_ptr value (ccsGSettingsWrapperGetValue (wrapper.get (), KEY.c_str ()), boost::bind (g_variant_unref, _1)); double v = (double) g_variant_get_double (value.get ()); EXPECT_EQ (VALUE, v); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestResetKeyOnWrapper) { const char * DEFAULT = ""; const char * VALUE = "foo"; const std::string KEY ("string-setting"); GVariant *variant = g_variant_new ("s", VALUE); ccsGSettingsWrapperSetValue (wrapper.get (), KEY.c_str (), variant); boost::shared_ptr value (g_settings_get_value (settings, KEY.c_str ()), boost::bind (g_variant_unref, _1)); gsize length; std::string v (g_variant_get_string (value.get (), &length)); ASSERT_EQ (strlen (VALUE), length); ASSERT_THAT (v, Eq (VALUE)); ccsGSettingsWrapperResetKey (wrapper.get (), KEY.c_str ()); value.reset (g_settings_get_value (settings, KEY.c_str ()), boost::bind (g_variant_unref, _1)); v = std::string (g_variant_get_string (value.get (), &length)); ASSERT_EQ (strlen (DEFAULT), length); ASSERT_THAT (v, Eq (DEFAULT)); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestListKeysOnWrapper) { const char * EXPECTED_KEYS[] = { "bell-setting", "bool-list-setting", "boolean-setting", "button-setting", "color-list-setting", "color-setting", "edge-setting", "float-list-setting", "float-setting", "int-list-setting", "integer-setting", "key-setting", "match-list-setting", "match-setting", "string-list-setting", "string-setting" }; boost::shared_ptr keys (ccsGSettingsWrapperListKeys (wrapper.get ()), boost::bind (g_strfreev, _1)); ASSERT_EQ (g_strv_length (keys.get ()), sizeof (EXPECTED_KEYS) / sizeof (EXPECTED_KEYS[0])); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestGetSchemaName) { EXPECT_THAT (ccsGSettingsWrapperGetSchemaName (wrapper.get ()), Eq (mockSchema)); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestGetPath) { EXPECT_THAT (ccsGSettingsWrapperGetPath (wrapper.get ()), Eq (mockPath)); } namespace signal_test { class VerificationInterface { public: virtual ~VerificationInterface () {} virtual void Verify (GSettings *settings, gchar *keyname) = 0; }; class VerificationMock : public VerificationInterface { public: MOCK_METHOD2 (Verify, void (GSettings *settings, gchar *keyname)); }; void dummyChangedSignal (GSettings *s, gchar *keyName, gpointer user_data) { VerificationInterface *verifier = reinterpret_cast (user_data); verifier->Verify (s, keyName); } } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestConnectToChangedSignal) { std::string keyname ("int-setting"); signal_test::VerificationMock mv; /* We're not able to verify the keyname * at the moment, need a person who knows * GSignal better than I do to figure this * one out */ EXPECT_CALL (mv, Verify (settings, _)); ccsGSettingsWrapperConnectToChangedSignal (wrapper.get (), (GCallback) signal_test::dummyChangedSignal, (gpointer) static_cast (&mv)); g_signal_emit_by_name (G_OBJECT (settings), "changed", settings, keyname.c_str (), NULL); } compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/backend-conformance-config.h.in0000644000015301777760000000011012321343002031222 0ustar pbusernogroup00000000000000#define BACKEND_BINARY_PATH "@CMAKE_BINARY_DIR@/compizconfig/gsettings" compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/gsettings-mock-schemas-config.h.in0000644000015301777760000000050312321343002031730 0ustar pbusernogroup00000000000000#ifndef _COMPIZCONFIG_GSETTINGS_MOCK_SCHEMAS_CONFIG_H #define _COMPIZCONFIG_GSETTINGS_MOCK_SCHEMAS_CONFIG_H #define MOCK_SCHEMA_PATH "@CMAKE_BINARY_DIR@/generated/glib-2.0/schemas" #include namespace { const std::string MOCK_SCHEMA ("org.compiz.mock"); const std::string MOCK_PATH (MOCK_SCHEMA_PATH); } #endif compiz-0.9.11+14.04.20140409/compizconfig/gsettings/tests/gsettings_settings_test_fixture.h0000644000015301777760000000207512321343002032243 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_GSETTINGS_SETTINGS_TEST_FIXTURE_H #define _COMPIZCONFIG_GSETTINGS_SETTINGS_TEST_FIXTURE_H #include #include #endif compiz-0.9.11+14.04.20140409/compizconfig/gsettings/INSTALL0000644000015301777760000002243212321343002023224 0ustar pbusernogroup00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Here is a another example: /bin/bash ./configure CONFIG_SHELL=/bin/bash Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent configuration-related scripts to be executed by `/bin/bash'. `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/0000755000015301777760000000000012321344021027176 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/gsettings_shared.h0000644000015301777760000000121012321343002032674 0ustar pbusernogroup00000000000000#ifndef _COMPIZCONFIG_GSETTINGS_SHARED_H #define _COMPIZCONFIG_GSETTINGS_SHARED_H #include G_BEGIN_DECLS #include #include #include #include #include #include #include "gsettings_util.h" extern const char * const PLUGIN_SCHEMA_ID_PREFIX; extern const char * const COMPIZCONFIG_SCHEMA_ID; extern const char * const COMPIZCONFIG_PATH; extern const char * const PROFILE_SCHEMA_ID; extern const char * const PROFILE_PATH_PREFIX; extern const char * const DEFAULTPROF; extern const unsigned int MAX_GSETTINGS_KEY_SIZE; extern const unsigned int BUFSIZE; G_END_DECLS #endif ././@LongLink0000000000000000000000000000015700000000000011220 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend_interface.ccompiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend_i0000644000015301777760000000741312321343002033742 0ustar pbusernogroup00000000000000#include #include "ccs_gsettings_backend_interface.h" INTERFACE_TYPE (CCSGSettingsBackendInterface); CCSContext * ccsGSettingsBackendGetContext (CCSBackend *backend) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendGetContext) (backend); } void ccsGSettingsBackendConnectToChangedSignal (CCSBackend *backend, CCSGSettingsWrapper *object) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendConnectToChangedSignal) (backend, object); } CCSGSettingsWrapper * ccsGSettingsGetSettingsObjectForPluginWithPath (CCSBackend *backend, const char *plugin, const char *path, CCSContext *context) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendGetSettingsObjectForPluginWithPath) (backend, plugin, path, context); } const char * ccsGSettingsBackendGetCurrentProfile (CCSBackend *backend) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendGetCurrentProfile) (backend); } GVariant * ccsGSettingsBackendGetExistingProfiles (CCSBackend *backend) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendGetExistingProfiles) (backend); } void ccsGSettingsBackendSetExistingProfiles (CCSBackend *backend, GVariant *value) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendSetExistingProfiles) (backend, value); } void ccsGSettingsBackendSetCurrentProfile (CCSBackend *backend, const gchar *value) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendSetCurrentProfile) (backend, value); } GVariant * ccsGSettingsBackendGetPluginsWithSetKeys (CCSBackend *backend) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendGetPluginsWithSetKeys) (backend); } void ccsGSettingsBackendClearPluginsWithSetKeys (CCSBackend *backend) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendClearPluginsWithSetKeys) (backend); } void ccsGSettingsBackendUnsetAllChangedPluginKeysInProfile (CCSBackend *backend, CCSContext *context, GVariant *pluginKeys, const char *profile) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendUnsetAllChangedPluginKeysInProfile) (backend, context, pluginKeys, profile); } gboolean ccsGSettingsBackendUpdateProfile (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendUpdateProfile) (backend, context); } void ccsGSettingsBackendUpdateCurrentProfileName (CCSBackend *backend, const char *profile) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendUpdateCurrentProfileName) (backend, profile); } void ccsGSettingsBackendAddProfile (CCSBackend *backend, const char *profile) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendAddProfile) (backend, profile); } CCSIntegratedSetting * ccsGSettingsBackendGetIntegratedSetting (CCSBackend *backend, CCSSetting *setting) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendGetIntegratedSetting) (backend, setting); } Bool ccsGSettingsBackendReadIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendReadIntegratedOption) (backend, setting, integrated); } void ccsGSettingsBackendWriteIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendWriteIntegratedOption) (backend, setting, integrated); } compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/gsettings_util.c0000644000015301777760000006465112321343002032420 0ustar pbusernogroup00000000000000#define CCS_LOG_DOMAIN "gsettings" #include #include #include #include "gsettings_shared.h" #include "ccs_gsettings_backend.h" #include "ccs_gsettings_backend_interface.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_interface_wrapper.h" const CCSBackendInfo gsettingsBackendInfo = { "gsettings", "GSettings Configuration Backend", "GSettings Configuration Backend for libccs", TRUE, TRUE, 1 }; GList * variantTypeToPossibleSettingType (const gchar *vt) { struct _variantTypeCCSType { char variantType; CCSSettingType ccsType; }; static const struct _variantTypeCCSType vCCSType[] = { { 'b', TypeBool }, { 'i', TypeInt }, { 'd', TypeFloat }, { 's', TypeString }, { 's', TypeColor }, { 's', TypeKey }, { 's', TypeButton }, { 's', TypeEdge }, { 'b', TypeBell }, { 's', TypeMatch }, { 'a', TypeList } }; GList *possibleTypesList = NULL; unsigned int i = 0; for (; i < (sizeof (vCCSType) / sizeof (vCCSType[0])); ++i) { if (vt[0] == vCCSType[i].variantType) possibleTypesList = g_list_append (possibleTypesList, GINT_TO_POINTER ((gint) vCCSType[i].ccsType)); } return possibleTypesList; } CCSGSettingsWrapper * findCCSGSettingsWrapperBySchemaName (const gchar *schemaName, GList *iter) { while (iter) { CCSGSettingsWrapper *obj = iter->data; const gchar *name = ccsGSettingsWrapperGetSchemaName (obj); if (g_strcmp0 (name, schemaName) != 0) obj = NULL; if (obj) return obj; else iter = g_list_next (iter); } return NULL; } gchar * getSchemaNameForPlugin (const char *plugin) { gchar *schemaName = NULL; schemaName = g_strconcat (PLUGIN_SCHEMA_ID_PREFIX, plugin, NULL); return schemaName; } char * truncateKeyForGSettings (const char *gsettingName) { /* Truncate */ gchar *truncated = g_strndup (gsettingName, MAX_GSETTINGS_KEY_SIZE); return truncated; } char * translateUnderscoresToDashesForGSettings (const char *truncated) { gchar *clean = NULL; gchar **delimited = NULL; /* Replace underscores with dashes */ delimited = g_strsplit (truncated, "_", 0); clean = g_strjoinv ("-", delimited); g_strfreev (delimited); return clean; } void translateToLowercaseForGSettings (char *name) { unsigned int i; /* Everything must be lowercase */ for (i = 0; i < strlen (name); ++i) name[i] = g_ascii_tolower (name[i]); } char * translateKeyForGSettings (const char *gsettingName) { char *truncated = truncateKeyForGSettings (gsettingName); char *translated = translateUnderscoresToDashesForGSettings (truncated); translateToLowercaseForGSettings (translated); if (strlen (gsettingName) > MAX_GSETTINGS_KEY_SIZE) ccsWarning ("Key name %s is not valid in GSettings, it was changed to %s, this may cause problems!", gsettingName, translated); g_free (truncated); return translated; } gchar * translateKeyForCCS (const char *gsettingName) { gchar *clean = NULL; gchar **delimited = NULL; /* Replace dashes with underscores */ delimited = g_strsplit (gsettingName, "-", 0); clean = g_strjoinv ("_", delimited); g_strfreev (delimited); return clean; } gboolean compizconfigTypeHasVariantType (CCSSettingType type) { gint i = 0; static const unsigned int nVariantTypes = 6; static const CCSSettingType variantTypes[] = { TypeString, TypeMatch, TypeColor, TypeBool, TypeInt, TypeFloat }; for (; i < nVariantTypes; ++i) { if (variantTypes[i] == type) return TRUE; } return FALSE; } gboolean decomposeGSettingsPath (const char *pathInput, char **pluginName, unsigned int *screenNum) { const char *path = pathInput; const int prefixLen = strlen (PROFILE_PATH_PREFIX); char pluginBuf[1024]; if (strncmp (path, PROFILE_PATH_PREFIX, prefixLen)) return FALSE; path += prefixLen; *pluginName = NULL; *screenNum = 0; /* Can't overflow, limit is 1023 chars */ if (sscanf (path, "%*[^/]/plugins/%1023[^/]", pluginBuf) == 1) { pluginBuf[1023] = '\0'; *pluginName = g_strdup (pluginBuf); return TRUE; } return FALSE; } gboolean variantIsValidForCCSType (GVariant *gsettingsValue, CCSSettingType settingType) { gboolean valid = FALSE; switch (settingType) { case TypeString: case TypeMatch: case TypeColor: case TypeKey: case TypeButton: case TypeEdge: valid = (g_variant_type_is_subtype_of (G_VARIANT_TYPE_STRING, g_variant_get_type (gsettingsValue))); break; case TypeInt: valid = (g_variant_type_is_subtype_of (G_VARIANT_TYPE_INT32, g_variant_get_type (gsettingsValue))); break; case TypeBool: case TypeBell: valid = (g_variant_type_is_subtype_of (G_VARIANT_TYPE_BOOLEAN, g_variant_get_type (gsettingsValue))); break; case TypeFloat: valid = (g_variant_type_is_subtype_of (G_VARIANT_TYPE_DOUBLE, g_variant_get_type (gsettingsValue))); break; case TypeList: valid = (g_variant_type_is_array (g_variant_get_type (gsettingsValue))); break; default: break; } return valid; } Bool updateSettingWithGSettingsKeyName (CCSBackend *backend, CCSGSettingsWrapper *settings, const gchar *keyName, CCSBackendUpdateFunc updateSetting) { CCSContext *context = ccsGSettingsBackendGetContext (backend); char *uncleanKeyName = NULL; char *pathOrig; CCSPlugin *plugin; CCSSetting *setting; Bool ret = TRUE; pathOrig = strdup (ccsGSettingsWrapperGetPath (settings)); if (findSettingAndPluginToUpdateFromPath (settings, pathOrig, keyName, context, &plugin, &setting, &uncleanKeyName)) (*updateSetting) (backend, context, plugin, setting); else { /* We hit a situation where either the key stored in GSettings couldn't be * matched at all to a key in the xml file, or where there were multiple matches. * Unfortunately, there isn't much we can do about this, other than try * and warn the user and bail out. It just means that if the key was updated * externally we won't know about the change until the next reload of settings */ ccsWarning ("Unable to find setting %s, for path %s", uncleanKeyName, pathOrig); ret = FALSE; } free (pathOrig); if (uncleanKeyName) g_free (uncleanKeyName); return ret; } Bool appendToPluginsWithSetKeysList (const gchar *plugin, GVariant *writtenPlugins, char ***newWrittenPlugins, gsize *newWrittenPluginsSize) { gsize writtenPluginsLen = 0; Bool found = FALSE; char *plug; GVariantIter iter; g_variant_iter_init (&iter, writtenPlugins); *newWrittenPluginsSize = g_variant_iter_n_children (&iter); while (g_variant_iter_loop (&iter, "s", &plug)) { if (!found) found = (g_strcmp0 (plug, plugin) == 0); } if (!found) ++(*newWrittenPluginsSize); *newWrittenPlugins = g_variant_dup_strv (writtenPlugins, &writtenPluginsLen); if (*newWrittenPluginsSize > writtenPluginsLen) { *newWrittenPlugins = g_realloc (*newWrittenPlugins, (*newWrittenPluginsSize + 1) * sizeof (gchar *)); /* Next item becomes plugin */ (*newWrittenPlugins)[writtenPluginsLen] = g_strdup (plugin); /* Last item becomes NULL */ (*newWrittenPlugins)[*newWrittenPluginsSize] = NULL; } return !found; } CCSSettingList filterAllSettingsMatchingType (CCSSettingType type, CCSSettingList settingList) { CCSSettingList filteredList = NULL; CCSSettingList iter = settingList; while (iter) { CCSSetting *s = (CCSSetting *) iter->data; if (ccsSettingGetType (s) == type) filteredList = ccsSettingListAppend (filteredList, s); iter = iter->next; } return filteredList; } CCSSettingList filterAllSettingsMatchingPartOfStringIgnoringDashesUnderscoresAndCase (const gchar *keyName, CCSSettingList settingList) { CCSSettingList filteredList = NULL; CCSSettingList iter = settingList; while (iter) { CCSSetting *s = (CCSSetting *) iter->data; const char *name = ccsSettingGetName (s); char *underscores_as_dashes = translateUnderscoresToDashesForGSettings (name); if (g_ascii_strncasecmp (underscores_as_dashes, keyName, strlen (keyName)) == 0) filteredList = ccsSettingListAppend (filteredList, s); g_free (underscores_as_dashes); iter = iter->next; } return filteredList; } CCSSetting * attemptToFindCCSSettingFromLossyName (CCSSettingList settingList, const gchar *lossyName, CCSSettingType type) { CCSSettingList ofThatType = filterAllSettingsMatchingType (type, settingList); CCSSettingList lossyMatchingName = filterAllSettingsMatchingPartOfStringIgnoringDashesUnderscoresAndCase (lossyName, ofThatType); CCSSetting *found = NULL; if (ccsSettingListLength (lossyMatchingName) == 1) found = lossyMatchingName->data; ccsSettingListFree (ofThatType, FALSE); ccsSettingListFree (lossyMatchingName, FALSE); return found; } Bool findSettingAndPluginToUpdateFromPath (CCSGSettingsWrapper *settings, const char *path, const gchar *keyName, CCSContext *context, CCSPlugin **plugin, CCSSetting **setting, char **uncleanKeyName) { char *pluginName; unsigned int screenNum; if (!decomposeGSettingsPath (path, &pluginName, &screenNum)) return FALSE; *plugin = ccsFindPlugin (context, pluginName); if (*plugin) { *uncleanKeyName = translateKeyForCCS (keyName); *setting = ccsFindSetting (*plugin, *uncleanKeyName); if (!*setting) { /* Couldn't find setting straight off the bat, * try and find the best match */ GVariant *value = ccsGSettingsWrapperGetValue (settings, keyName); if (value) { GList *possibleSettingTypes = variantTypeToPossibleSettingType (g_variant_get_type_string (value)); GList *iter = possibleSettingTypes; while (iter) { *setting = attemptToFindCCSSettingFromLossyName (ccsGetPluginSettings (*plugin), keyName, (CCSSettingType) GPOINTER_TO_INT (iter->data)); if (*setting) break; iter = iter->next; } g_list_free (possibleSettingTypes); g_variant_unref (value); } } } g_free (pluginName); if (!*plugin || !*setting) return FALSE; return TRUE; } gchar * makeCompizProfilePath (const gchar *profilename) { return g_build_path ("/", PROFILE_PATH_PREFIX, profilename, "/", NULL); } gchar * makeCompizPluginPath (const gchar *profileName, const gchar *pluginName) { return g_build_path ("/", PROFILE_PATH_PREFIX, profileName, "plugins", pluginName, "/", NULL); } gchar * getNameForCCSSetting (CCSSetting *setting) { return translateKeyForGSettings (ccsSettingGetName (setting)); } Bool checkReadVariantIsValid (GVariant *gsettingsValue, CCSSettingType type, const gchar *pathName) { /* first check if the key is set */ if (!gsettingsValue) { ccsWarning ("There is no key at the path %s. " "Settings from this path won't be read. Try to remove " "that value so that operation can continue properly.", pathName); return FALSE; } if (!variantIsValidForCCSType (gsettingsValue, type)) { ccsWarning ("There is an unsupported value at path %s. " "Settings from this path won't be read. Try to remove " "that value so that operation can continue properly.", pathName); return FALSE; } return TRUE; } GVariant * getVariantAtKey (CCSGSettingsWrapper *settings, const char *key, const char *pathName, CCSSettingType type) { GVariant *gsettingsValue = ccsGSettingsWrapperGetValue (settings, key); if (!checkReadVariantIsValid (gsettingsValue, type, pathName)) { g_variant_unref (gsettingsValue); return NULL; } return gsettingsValue; } CCSSettingValueList readBoolListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *ai) { CCSSettingValueList list = NULL; Bool *array = (*ai->calloc_) (ai->allocator, 1, nItems * sizeof (Bool)); Bool *arrayCounter = array; gboolean value; if (!array) return NULL; /* Reads each item from the variant into arrayCounter */ while (g_variant_iter_loop (iter, "b", &value)) *arrayCounter++ = value ? TRUE : FALSE; list = ccsGetValueListFromBoolArray (array, nItems, setting); free (array); return list; } CCSSettingValueList readIntListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *ai) { CCSSettingValueList list = NULL; int *array = (*ai->calloc_) (ai->allocator, 1, nItems * sizeof (int)); int *arrayCounter = array; gint value; if (!array) return NULL; /* Reads each item from the variant into arrayCounter */ while (g_variant_iter_loop (iter, "i", &value)) *arrayCounter++ = value; list = ccsGetValueListFromIntArray (array, nItems, setting); free (array); return list; } CCSSettingValueList readFloatListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *ai) { CCSSettingValueList list = NULL; float *array = (*ai->calloc_) (ai->allocator, 1, nItems * sizeof (float)); float *arrayCounter = array; gdouble value; if (!array) return NULL; /* Reads each item from the variant into arrayCounter */ while (g_variant_iter_loop (iter, "d", &value)) *arrayCounter++ = value; list = ccsGetValueListFromFloatArray (array, nItems, setting); free (array); return list; } CCSSettingValueList readStringListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *ai) { CCSSettingValueList list = NULL; gchar **array = (*ai->calloc_) (ai->allocator, 1, (nItems + 1) * sizeof (gchar *)); gchar **arrayCounter = array; gchar *value; if (!array) return NULL; array[nItems] = NULL; /* Reads each item from the variant into arrayCounter */ while (g_variant_iter_next (iter, "s", &value)) *arrayCounter++ = value; list = ccsGetValueListFromStringArray ((const gchar **) array, nItems, setting); g_strfreev (array); return list; } CCSSettingValueList readColorListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *ai) { CCSSettingValueList list = NULL; char *colorValue; CCSSettingColorValue *array = (*ai->calloc_) (ai->allocator, 1, nItems * sizeof (CCSSettingColorValue)); unsigned int i = 0; if (!array) return NULL; while (g_variant_iter_loop (iter, "s", &colorValue)) { ccsStringToColor (colorValue, &array[i]); ++i; } list = ccsGetValueListFromColorArray (array, nItems, setting); free (array); return list; } CCSSettingValueList readListValue (GVariant *gsettingsValue, CCSSetting *setting, CCSObjectAllocationInterface *ai) { CCSSettingType listType = ccsSettingGetInfo (setting)->forList.listType; gboolean hasVariantType; unsigned int nItems; CCSSettingValueList list = NULL; GVariantIter iter; hasVariantType = compizconfigTypeHasVariantType (listType); if (!hasVariantType) return NULL; g_variant_iter_init (&iter, gsettingsValue); nItems = g_variant_iter_n_children (&iter); switch (listType) { case TypeBool: list = readBoolListValue (&iter, nItems, setting, ai); break; case TypeInt: list = readIntListValue (&iter, nItems, setting, ai); break; case TypeFloat: list = readFloatListValue (&iter, nItems, setting, ai); break; case TypeString: case TypeMatch: list = readStringListValue (&iter, nItems, setting, ai); break; case TypeColor: list = readColorListValue (&iter, nItems, setting, ai); break; default: break; } return list; } const char * readStringFromVariant (GVariant *gsettingsValue) { return g_variant_get_string (gsettingsValue, NULL); } int readIntFromVariant (GVariant *gsettingsValue) { return g_variant_get_int32 (gsettingsValue); } Bool readBoolFromVariant (GVariant *gsettingsValue) { return g_variant_get_boolean (gsettingsValue) ? TRUE : FALSE; } float readFloatFromVariant (GVariant *gsettingsValue) { return (float) g_variant_get_double (gsettingsValue); } CCSSettingColorValue readColorFromVariant (GVariant *gsettingsValue, Bool *success) { const char *value; CCSSettingColorValue color; value = g_variant_get_string (gsettingsValue, NULL); if (value) *success = ccsStringToColor (value, &color); else *success = FALSE; return color; } CCSSettingKeyValue readKeyFromVariant (GVariant *gsettingsValue, Bool *success) { const char *value; CCSSettingKeyValue key; value = g_variant_get_string (gsettingsValue, NULL); if (value) *success = ccsStringToKeyBinding (value, &key); else *success = FALSE; return key; } CCSSettingButtonValue readButtonFromVariant (GVariant *gsettingsValue, Bool *success) { const char *value; CCSSettingButtonValue button; value = g_variant_get_string (gsettingsValue, NULL); if (value) *success = ccsStringToButtonBinding (value, &button); else *success = FALSE; return button; } unsigned int readEdgeFromVariant (GVariant *gsettingsValue) { const char *value; value = g_variant_get_string (gsettingsValue, NULL); if (value) return ccsStringToEdges (value); return 0; } GVariant * writeBoolListValue (CCSSettingValueList list) { GVariant *value = NULL; GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("ab")); while (list) { g_variant_builder_add (builder, "b", list->data->value.asBool); list = list->next; } value = g_variant_new ("ab", builder); g_variant_builder_unref (builder); return value; } GVariant * writeIntListValue (CCSSettingValueList list) { GVariant *value = NULL; GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("ai")); while (list) { g_variant_builder_add (builder, "i", list->data->value.asInt); list = list->next; } value = g_variant_new ("ai", builder); g_variant_builder_unref (builder); return value; } GVariant * writeFloatListValue (CCSSettingValueList list) { GVariant *value = NULL; GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("ad")); while (list) { g_variant_builder_add (builder, "d", (gdouble) list->data->value.asFloat); list = list->next; } value = g_variant_new ("ad", builder); g_variant_builder_unref (builder); return value; } GVariant * writeStringListValue (CCSSettingValueList list) { GVariant *value = NULL; GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("as")); while (list) { g_variant_builder_add (builder, "s", list->data->value.asString); list = list->next; } value = g_variant_new ("as", builder); g_variant_builder_unref (builder); return value; } GVariant * writeMatchListValue (CCSSettingValueList list) { GVariant *value = NULL; GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("as")); while (list) { g_variant_builder_add (builder, "s", list->data->value.asMatch); list = list->next; } value = g_variant_new ("as", builder); g_variant_builder_unref (builder); return value; } GVariant * writeColorListValue (CCSSettingValueList list) { GVariant *value = NULL; GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("as")); char *item; while (list) { item = ccsColorToString (&list->data->value.asColor); g_variant_builder_add (builder, "s", item); g_free (item); list = list->next; } value = g_variant_new ("as", builder); g_variant_builder_unref (builder); return value; } Bool writeListValue (CCSSettingValueList list, CCSSettingType listType, GVariant **gsettingsValue) { GVariant *value = NULL; switch (listType) { case TypeBool: value = writeBoolListValue (list); break; case TypeInt: value = writeIntListValue (list); break; case TypeFloat: value = writeFloatListValue (list); break; case TypeString: value = writeStringListValue (list); break; case TypeMatch: value = writeMatchListValue (list); break; case TypeColor: value = writeColorListValue (list); break; default: ccsWarning ("Attempt to write unsupported list type %d!", listType); return FALSE; break; } *gsettingsValue = value; return TRUE; } Bool writeStringToVariant (const char *value, GVariant **variant) { *variant = g_variant_new_string (value); return TRUE; } Bool writeFloatToVariant (float value, GVariant **variant) { *variant = g_variant_new_double ((double) value); return TRUE; } Bool writeIntToVariant (int value, GVariant **variant) { *variant = g_variant_new_int32 (value); return TRUE; } Bool writeBoolToVariant (Bool value, GVariant **variant) { *variant = g_variant_new_boolean (value); return TRUE; } Bool writeColorToVariant (CCSSettingColorValue value, GVariant **variant) { char *colString; colString = ccsColorToString (&value); if (!colString) return FALSE; *variant = g_variant_new_string (colString); free (colString); return TRUE; } Bool writeKeyToVariant (CCSSettingKeyValue key, GVariant **variant) { char *keyString; keyString = ccsKeyBindingToString (&key); if (!keyString) return FALSE; *variant = g_variant_new_string (keyString); free (keyString); return TRUE; } Bool writeButtonToVariant (CCSSettingButtonValue button, GVariant **variant) { char *buttonString; buttonString = ccsButtonBindingToString (&button); if (!buttonString) return FALSE; *variant = g_variant_new_string (buttonString); free (buttonString); return TRUE; } Bool writeEdgeToVariant (unsigned int edges, GVariant **variant) { char *edgeString; edgeString = ccsEdgesToString (edges); if (!edgeString) return FALSE; *variant = g_variant_new_string (edgeString); free (edgeString); return TRUE; } Bool writeVariantToKey (CCSGSettingsWrapper *settings, const char *key, GVariant *value) { if (settings) { ccsGSettingsWrapperSetValue (settings, key, value); return TRUE; } else { ccsWarning ("attempted to write without a schema"); return FALSE; } } typedef void (*VariantItemCheckAndInsertFunc) (GVariantBuilder *, const char *item, void *userData); typedef struct _FindItemInVariantData { gboolean found; const char *item; } FindItemInVariantData; typedef struct _InsertIfNotEqualData { gboolean skipped; const char *item; } InsertIfNotEqualData; static void insertIfNotEqual (GVariantBuilder *builder, const char *item, void *userData) { InsertIfNotEqualData *data = (InsertIfNotEqualData *) userData; if (g_strcmp0 (item, data->item)) g_variant_builder_add (builder, "s", item); else data->skipped = TRUE; } static void findItemForVariantData (GVariantBuilder *builder, const char *item, void *userData) { FindItemInVariantData *data = (FindItemInVariantData *) userData; if (!data->found) data->found = g_str_equal (data->item, item); g_variant_builder_add (builder, "s", item); } static void rebuildVariant (GVariantBuilder *builder, GVariant *originalVariant, VariantItemCheckAndInsertFunc checkAndInsert, void *userData) { GVariantIter iter; char *str; g_variant_iter_init (&iter, originalVariant); while (g_variant_iter_loop (&iter, "s", &str)) { (*checkAndInsert) (builder, str, userData); } } gboolean appendStringToVariantIfUnique (GVariant **variant, const char *string) { GVariantBuilder newVariantBuilder; FindItemInVariantData findItemData; memset (&findItemData, 0, sizeof (FindItemInVariantData)); g_variant_builder_init (&newVariantBuilder, G_VARIANT_TYPE ("as")); findItemData.item = string; rebuildVariant (&newVariantBuilder, *variant, findItemForVariantData, &findItemData); if (!findItemData.found) g_variant_builder_add (&newVariantBuilder, "s", string); g_variant_unref (*variant); *variant = g_variant_builder_end (&newVariantBuilder); return !findItemData.found; } gboolean removeItemFromVariant (GVariant **variant, const char *string) { GVariantBuilder newVariantBuilder; InsertIfNotEqualData data = { FALSE, string }; g_variant_builder_init (&newVariantBuilder, G_VARIANT_TYPE ("as")); rebuildVariant (&newVariantBuilder, *variant, insertIfNotEqual, (void *) &data); g_variant_unref (*variant); *variant = g_variant_builder_end (&newVariantBuilder); return data.skipped; } void resetOptionToDefault (CCSBackend *backend, CCSSetting * setting) { CCSGSettingsWrapper *settings = getSettingsObjectForCCSSetting (backend, setting); char *cleanSettingName = translateKeyForGSettings (ccsSettingGetName (setting)); ccsGSettingsWrapperResetKey (settings, cleanSettingName); free (cleanSettingName); } gchar * makeSettingPath (const char *currentProfile, CCSSetting *setting) { return makeCompizPluginPath (currentProfile, ccsPluginGetName (ccsSettingGetParent (setting))); } CCSGSettingsWrapper * getSettingsObjectForCCSSetting (CCSBackend *backend, CCSSetting *setting) { CCSGSettingsWrapper *ret = NULL; gchar *pathName = makeSettingPath (ccsGSettingsBackendGetCurrentProfile (backend), setting); ret = ccsGSettingsGetSettingsObjectForPluginWithPath (backend, ccsPluginGetName (ccsSettingGetParent (setting)), pathName, ccsPluginGetContext (ccsSettingGetParent (setting))); g_free (pathName); return ret; } gboolean deleteProfile (CCSBackend *backend, CCSContext *context, const char *profile) { GVariant *plugins; GVariant *profiles; const char *currentProfile = ccsGSettingsBackendGetCurrentProfile (backend); gboolean ret = FALSE; plugins = ccsGSettingsBackendGetPluginsWithSetKeys (backend); profiles = ccsGSettingsBackendGetExistingProfiles (backend); ccsGSettingsBackendUnsetAllChangedPluginKeysInProfile (backend, context, plugins, currentProfile); ccsGSettingsBackendClearPluginsWithSetKeys (backend); ret = removeItemFromVariant (&profiles, profile); /* Remove the profile from existing-profiles */ ccsGSettingsBackendSetExistingProfiles (backend, profiles); ccsGSettingsBackendUpdateProfile (backend, context); /* Since we do not call g_settings_set_value on * plugins, we must also unref the variant */ g_variant_unref (plugins); return ret; } ././@LongLink0000000000000000000000000000014700000000000011217 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_interface.ccompiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_interface0000644000015301777760000000372612321343002034006 0ustar pbusernogroup00000000000000#include #include "ccs_gsettings_interface.h" INTERFACE_TYPE (CCSGSettingsWrapperInterface); CCSREF_OBJ (GSettingsWrapper, CCSGSettingsWrapper); void ccsGSettingsWrapperSetValue (CCSGSettingsWrapper *wrapper, const char *key, GVariant *value) { (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperSetValue) (wrapper, key, value); } GVariant * ccsGSettingsWrapperGetValue (CCSGSettingsWrapper *wrapper, const char *key) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperGetValue) (wrapper, key); } void ccsGSettingsWrapperResetKey (CCSGSettingsWrapper *wrapper, const char *key) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperResetKey) (wrapper, key); } char ** ccsGSettingsWrapperListKeys (CCSGSettingsWrapper *wrapper) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperListKeys) (wrapper); } GSettings * ccsGSettingsWrapperGetGSettings (CCSGSettingsWrapper *wrapper) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperGetGSettings) (wrapper); } const char * ccsGSettingsWrapperGetSchemaName (CCSGSettingsWrapper *wrapper) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperGetSchemaName) (wrapper); } const char * ccsGSettingsWrapperGetPath (CCSGSettingsWrapper *wrapper) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperGetPath) (wrapper); } void ccsGSettingsWrapperConnectToChangedSignal (CCSGSettingsWrapper *wrapper, GCallback callback, gpointer data) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperConnectToChangedSignal) (wrapper, callback, data); } void ccsFreeGSettingsWrapper (CCSGSettingsWrapper *wrapper) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperFree) (wrapper); } ././@LongLink0000000000000000000000000000015700000000000011220 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_interface_wrapper.hcompiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_interface0000644000015301777760000000075412321343002034004 0ustar pbusernogroup00000000000000#ifndef _CCS_GSETTINGS_INTERFACE_WRAPPER_H #define _CCS_GSETTINGS_INTERFACE_WRAPPER_H #include #include #include COMPIZCONFIG_BEGIN_DECLS CCSGSettingsWrapper * ccsGSettingsWrapperNewForSchemaWithPath (const char *schema, const char *path, CCSObjectAllocationInterface *ai); CCSGSettingsWrapper * ccsGSettingsWrapperNewForSchema (const char *schema, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ././@LongLink0000000000000000000000000000016700000000000011221 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_wrapper_factory_interface.ccompiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_wrapper_f0000644000015301777760000000344512321343002034031 0ustar pbusernogroup00000000000000/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory_interface.c * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #include #include "ccs_gsettings_wrapper_factory_interface.h" INTERFACE_TYPE (CCSGSettingsWrapperFactoryInterface); CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapper (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, CCSObjectAllocationInterface *ai) { return (*(GET_INTERFACE (CCSGSettingsWrapperFactoryInterface, factory))->newGSettingsWrapper) (factory, schemaName, ai); } CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, const gchar *path, CCSObjectAllocationInterface *ai) { return (*(GET_INTERFACE (CCSGSettingsWrapperFactoryInterface, factory))->newGSettingsWrapperWithPath) (factory, schemaName, path, ai); } void ccsFreeGSettingsWrapperFactory (CCSGSettingsWrapperFactory *factory) { return (*(GET_INTERFACE (CCSGSettingsWrapperFactoryInterface, factory))->free) (factory); } CCSREF_OBJ (GSettingsWrapperFactory, CCSGSettingsWrapperFactory) compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/gsettings_constants.c0000644000015301777760000000072012321343002033442 0ustar pbusernogroup00000000000000#include "gsettings_shared.h" const unsigned int BUFSIZE = 512; const char * const COMPIZCONFIG_SCHEMA_ID = "org.compiz"; const char * const COMPIZCONFIG_PATH = "/org/compiz/"; const char * const PLUGIN_SCHEMA_ID_PREFIX = "org.compiz."; const char * const PROFILE_SCHEMA_ID = "org.compiz.profile"; const char * const PROFILE_PATH_PREFIX = "/org/compiz/profiles/"; const char * const DEFAULTPROF = "Default"; const unsigned int MAX_GSETTINGS_KEY_SIZE = 1024; compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend.h0000644000015301777760000000266712321343002033666 0ustar pbusernogroup00000000000000#ifndef _COMPIZCONFIG_CCS_GSETTINGS_BACKEND_H #define _COMPIZCONFIG_CCS_GSETTINGS_BACKEND_H #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS Bool ccsGSettingsBackendAttachNewToBackend (CCSBackend *backend, CCSContext *context, CCSGSettingsWrapper *compizconfigSettings, CCSGSettingsWrapper *currentProfileSettings, CCSGSettingsWrapperFactory *wrapperFactory, CCSIntegration *integration, CCSGNOMEValueChangeData *valueChangeData, char *currentProfile); void ccsGSettingsBackendDetachFromBackend (CCSBackend *backend); /* Default implementations, should be moved */ void ccsGSettingsBackendUpdateCurrentProfileNameDefault (CCSBackend *backend, const char *profile); gboolean ccsGSettingsBackendUpdateProfileDefault (CCSBackend *backend, CCSContext *context); void ccsGSettingsBackendUnsetAllChangedPluginKeysInProfileDefault (CCSBackend *backend, CCSContext *context, GVariant *pluginsWithChangedKeys, const char * profile); gboolean ccsGSettingsBackendAddProfileDefault (CCSBackend *backend, const char *profile); void ccsGSettingsSetIntegration (CCSBackend *backend, CCSIntegration *integration); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/gsettings_util.h0000644000015301777760000001322212321343002032411 0ustar pbusernogroup00000000000000#ifndef _COMPIZ_GSETTINGS_UTIL_H #define _COMPIZ_GSETTINGS_UTIL_H #include #include COMPIZCONFIG_BEGIN_DECLS #include #include #include /* some forward declarations */ void ccsGSettingsValueChanged (GSettings *settings, gchar *keyname, gpointer user_data); void ccsGSettingsWriteIntegratedOption (CCSBackend *backend, CCSContext *context, CCSSetting *setting, int index); CCSStringList ccsGSettingsGetExistingProfiles (CCSBackend *backend, CCSContext *context); void ccsGSettingsSetIntegration (CCSBackend *backend, CCSIntegration *integration); typedef struct _CCSGSettingsBackendPrivate CCSGSettingsBackendPrivate; extern const CCSBackendInfo gsettingsBackendInfo; gchar * getSchemaNameForPlugin (const char *plugin); char * truncateKeyForGSettings (const char *gsettingName); char * translateUnderscoresToDashesForGSettings (const char *truncated); void translateToLowercaseForGSettings (char *name); gchar * translateKeyForGSettings (const char *gsettingName); gchar * translateKeyForCCS (const char *gsettingName); gboolean compizconfigTypeHasVariantType (CCSSettingType t); gboolean decomposeGSettingsPath (const char *path, char **pluginName, unsigned int *screenNum); gboolean variantIsValidForCCSType (GVariant *gsettingsValue, CCSSettingType settingType); Bool appendToPluginsWithSetKeysList (const gchar *plugin, GVariant *writtenPlugins, char ***newWrittenPlugins, gsize *newWrittenPluginsSize); CCSGSettingsWrapper * findCCSGSettingsWrapperBySchemaName (const gchar *schemaName, GList *iter); CCSSettingList filterAllSettingsMatchingType (CCSSettingType type, CCSSettingList settingList); CCSSettingList filterAllSettingsMatchingPartOfStringIgnoringDashesUnderscoresAndCase (const gchar *keyName, CCSSettingList sList); CCSSetting * attemptToFindCCSSettingFromLossyName (CCSSettingList settingList, const gchar *lossyName, CCSSettingType type); Bool findSettingAndPluginToUpdateFromPath (CCSGSettingsWrapper *settings, const char *path, const gchar *keyName, CCSContext *context, CCSPlugin **plugin, CCSSetting **setting, char **uncleanKeyName); Bool updateSettingWithGSettingsKeyName (CCSBackend *backend, CCSGSettingsWrapper *settings, const gchar *keyName, CCSBackendUpdateFunc updateSetting); GList * variantTypeToPossibleSettingType (const gchar *vt); gchar * makeCompizProfilePath (const gchar *profilename); gchar * makeCompizPluginPath (const gchar *profileName, const gchar *pluginName); gchar * getNameForCCSSetting (CCSSetting *setting); Bool checkReadVariantIsValid (GVariant *gsettingsValue, CCSSettingType type, const gchar *pathName); GVariant * getVariantAtKey (CCSGSettingsWrapper *settings, const char *key, const char *pathName, CCSSettingType type); const char * readStringFromVariant (GVariant *gsettingsValue); int readIntFromVariant (GVariant *gsettingsValue); Bool readBoolFromVariant (GVariant *gsettingsValue); float readFloatFromVariant (GVariant *gsettingsValue); CCSSettingColorValue readColorFromVariant (GVariant *gsettingsValue, Bool *success); CCSSettingKeyValue readKeyFromVariant (GVariant *gsettingsValue, Bool *success); CCSSettingButtonValue readButtonFromVariant (GVariant *gsettingsValue, Bool *success); unsigned int readEdgeFromVariant (GVariant *gsettingsValue); CCSSettingValueList readListValue (GVariant *gsettingsValue, CCSSetting *setting, CCSObjectAllocationInterface *allocator); Bool writeListValue (CCSSettingValueList list, CCSSettingType listType, GVariant **gsettingsValue); Bool writeStringToVariant (const char *value, GVariant **variant); Bool writeFloatToVariant (float value, GVariant **variant); Bool writeIntToVariant (int value, GVariant **variant); Bool writeBoolToVariant (Bool value, GVariant **variant); Bool writeColorToVariant (CCSSettingColorValue value, GVariant **variant); Bool writeKeyToVariant (CCSSettingKeyValue key, GVariant **variant); Bool writeButtonToVariant (CCSSettingButtonValue button, GVariant **variant); Bool writeEdgeToVariant (unsigned int edges, GVariant **variant); Bool writeVariantToKey (CCSGSettingsWrapper *settings, const char *key, GVariant *value); typedef int (*ComparisonPredicate) (const void *s1, const void *s2); int voidcmp0 (const void *v1, const void *v2); gboolean deleteProfile (CCSBackend *backend, CCSContext *context, const char *profile); gboolean appendStringToVariantIfUnique (GVariant **variant, const char *string); gboolean removeItemFromVariant (GVariant **variant, const char *string); CCSSettingValueList readBoolListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *allocator); CCSSettingValueList readIntListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *allocator); CCSSettingValueList readFloatListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *allocator); CCSSettingValueList readStringListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *allocator); CCSSettingValueList readColorListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *allocator); gchar * makeSettingPath (const char *currentProfile, CCSSetting *setting); CCSGSettingsWrapper * getSettingsObjectForCCSSetting (CCSBackend *backend, CCSSetting *setting); void resetOptionToDefault (CCSBackend *backend, CCSSetting * setting); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend.c0000644000015301777760000003413112321343002033650 0ustar pbusernogroup00000000000000#include #include #include #include #include "ccs_gsettings_backend.h" #include "ccs_gsettings_backend_interface.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_interface_wrapper.h" #include "ccs_gsettings_wrapper_factory_interface.h" #include "ccs_gnome_integration.h" #include "ccs_gnome_integration_gsettings_integrated_setting_factory.h" #include "gsettings_shared.h" struct _CCSGSettingsBackendPrivate { GList *settingsList; CCSGSettingsWrapper *compizconfigSettings; CCSGSettingsWrapper *currentProfileSettings; CCSGSettingsWrapperFactory *wrapperFactory; char *currentProfile; CCSContext *context; CCSIntegration *integration; CCSGNOMEValueChangeData *valueChangeData; }; void ccsGSettingsSetIntegration (CCSBackend *backend, CCSIntegration *integration) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); if (priv->integration) ccsIntegrationUnref (priv->integration); priv->integration = integration; ccsIntegrationRef (integration); } CCSStringList ccsGSettingsGetExistingProfiles (CCSBackend *backend, CCSContext *context) { GVariant *value; char *profile; GVariantIter iter; CCSStringList ret = NULL; CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); ccsGSettingsBackendUpdateProfile (backend, context); value = ccsGSettingsWrapperGetValue (priv->compizconfigSettings, "existing-profiles"); g_variant_iter_init (&iter, value); while (g_variant_iter_loop (&iter, "s", &profile)) { CCSString *str = calloc (1, sizeof (CCSString)); str->value = strdup (profile); ccsStringRef (str); ret = ccsStringListAppend (ret, str); } g_variant_unref (value); return ret; } void ccsGSettingsValueChanged (GSettings *settings, gchar *keyName, gpointer user_data) { CCSBackend *backend = (CCSBackend *)user_data; GValue schemaNameValue = G_VALUE_INIT; CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); CCSBackendInterface *backendInterface = (CCSBackendInterface *) GET_INTERFACE (CCSBackendInterface, backend); g_value_init (&schemaNameValue, G_TYPE_STRING); g_object_get_property (G_OBJECT (settings), "schema-id", &schemaNameValue); const char *schemaName = g_value_get_string (&schemaNameValue); CCSGSettingsWrapper *wrapper = findCCSGSettingsWrapperBySchemaName (schemaName, priv->settingsList); g_value_unset (&schemaNameValue); updateSettingWithGSettingsKeyName (backend, wrapper, keyName, backendInterface->updateSetting); } static CCSGSettingsWrapper * ccsGSettingsBackendGetSettingsObjectForPluginWithPathDefault (CCSBackend *backend, const char *plugin, const char *path, CCSContext *context) { CCSGSettingsWrapper *settingsObj = NULL; gchar *schemaName = getSchemaNameForPlugin (plugin); GVariant *writtenPlugins; gsize newWrittenPluginsSize; gchar **newWrittenPlugins; CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); settingsObj = findCCSGSettingsWrapperBySchemaName (schemaName, priv->settingsList); if (settingsObj) { g_free (schemaName); return settingsObj; } /* No existing settings object found for this schema, create one */ settingsObj = ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath (priv->wrapperFactory, schemaName, path, &ccsDefaultObjectAllocator); /* Couldn't allocate one */ if (!settingsObj) return NULL; ccsGSettingsBackendConnectToChangedSignal (backend, settingsObj); priv->settingsList = g_list_append (priv->settingsList, (void *) settingsObj); /* Also write the plugin name to the list of modified plugins so * that when we delete the profile the keys for that profile are also * unset FIXME: This could be a little more efficient, like we could * store keys that have changed from their defaults ... though * gsettings doesn't seem to give you a way to get all of the schemas */ writtenPlugins = ccsGSettingsWrapperGetValue (priv->currentProfileSettings, "plugins-with-set-keys"); if (appendToPluginsWithSetKeysList (plugin, writtenPlugins, &newWrittenPlugins, &newWrittenPluginsSize)) { GVariant *newWrittenPluginsVariant = g_variant_new_strv ((const gchar * const *) newWrittenPlugins, newWrittenPluginsSize); ccsGSettingsWrapperSetValue (priv->currentProfileSettings, "plugins-with-set-keys", newWrittenPluginsVariant); } g_variant_unref (writtenPlugins); g_free (schemaName); g_strfreev (newWrittenPlugins); return settingsObj; } gboolean ccsGSettingsBackendAddProfileDefault (CCSBackend *backend, const char *profile) { GVariant *profiles; gboolean ret = FALSE; profiles = ccsGSettingsBackendGetExistingProfiles (backend); if (appendStringToVariantIfUnique (&profiles, profile)) { ret = TRUE; ccsGSettingsBackendSetExistingProfiles (backend, profiles); } else g_variant_unref (profiles); return ret; } void ccsGSettingsBackendUpdateCurrentProfileNameDefault (CCSBackend *backend, const char *profile) { ccsGSettingsBackendAddProfile (backend, profile); ccsGSettingsBackendSetCurrentProfile (backend, profile); } gboolean ccsGSettingsBackendUpdateProfileDefault (CCSBackend *backend, CCSContext *context) { const char *currentProfile = ccsGSettingsBackendGetCurrentProfile (backend); const char *ccsProfile = ccsGetProfile (context); char *profile = NULL; if (!ccsProfile) profile = strdup (DEFAULTPROF); else profile = strdup (ccsProfile); if (!strlen (profile)) { free (profile); profile = strdup (DEFAULTPROF); } if (g_strcmp0 (profile, currentProfile)) ccsGSettingsBackendUpdateCurrentProfileName (backend, profile); free (profile); return TRUE; } void ccsGSettingsBackendUnsetAllChangedPluginKeysInProfileDefault (CCSBackend *backend, CCSContext *context, GVariant *pluginsWithChangedKeys, const char * profile) { GVariantIter iter; char *plugin; g_variant_iter_init (&iter, pluginsWithChangedKeys); while (g_variant_iter_loop (&iter, "s", &plugin)) { CCSGSettingsWrapper *settings; gchar *pathName = makeCompizPluginPath (profile, plugin); settings = ccsGSettingsGetSettingsObjectForPluginWithPath (backend, plugin, pathName, context); g_free (pathName); /* The GSettings documentation says not to use this API * because we should know our own schema ... though really * we don't because we autogenerate schemas ... */ if (settings) { char **keys = ccsGSettingsWrapperListKeys (settings); char **key_ptr; /* Unset all the keys */ for (key_ptr = keys; *key_ptr; ++key_ptr) ccsGSettingsWrapperResetKey (settings, *key_ptr); g_strfreev (keys); } } } static CCSContext * ccsGSettingsBackendGetContextDefault (CCSBackend *backend) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); return priv->context; } static void ccsGSettingsBackendConnectToValueChangedSignalDefault (CCSBackend *backend, CCSGSettingsWrapper *wrapper) { ccsGSettingsWrapperConnectToChangedSignal (wrapper, (GCallback) ccsGSettingsValueChanged, (gpointer) backend); } static const char * ccsGSettingsBackendGetCurrentProfileDefault (CCSBackend *backend) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); return priv->currentProfile; } static GVariant * ccsGSettingsBackendGetExistingProfilesDefault (CCSBackend *backend) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); return ccsGSettingsWrapperGetValue (priv->compizconfigSettings, "existing-profiles"); } static void ccsGSettingsBackendSetExistingProfilesDefault (CCSBackend *backend, GVariant *value) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); ccsGSettingsWrapperSetValue (priv->compizconfigSettings, "existing-profiles", value); } static void ccsGSettingsBackendSetCurrentProfileDefault (CCSBackend *backend, const gchar *value) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); gchar *profilePath = makeCompizProfilePath (value); /* Change the current profile and current profile settings */ if (priv->currentProfile) free (priv->currentProfile); if (priv->currentProfileSettings) ccsGSettingsWrapperUnref (priv->currentProfileSettings); priv->currentProfile = strdup (value); priv->currentProfileSettings = ccsGSettingsWrapperNewForSchemaWithPath (PROFILE_SCHEMA_ID, profilePath, backend->object.object_allocation); GVariant *currentProfileVariant = g_variant_new ("s", value, NULL); ccsGSettingsWrapperSetValue (priv->compizconfigSettings, "current-profile", currentProfileVariant); g_free (profilePath); } GVariant * ccsGSettingsBackendGetPluginsWithSetKeysDefault (CCSBackend *backend) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); return ccsGSettingsWrapperGetValue (priv->currentProfileSettings, "plugins-with-set-keys"); } void ccsGSettingsBackendClearPluginsWithSetKeysDefault (CCSBackend *backend) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); ccsGSettingsWrapperResetKey (priv->currentProfileSettings, "plugins-with-set-keys"); } CCSIntegratedSetting * ccsGSettingsBackendGetIntegratedOptionIndexDefault (CCSBackend *backend, CCSSetting *setting) { CCSPlugin *plugin = ccsSettingGetParent (setting); const char *pluginName = ccsPluginGetName (plugin); const char *settingName = ccsSettingGetName (setting); CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); return ccsIntegrationGetIntegratedSetting (priv->integration, pluginName, settingName); } Bool ccsGSettingsBackendReadIntegratedOptionDefault (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); return ccsIntegrationReadOptionIntoSetting (priv->integration, priv->context, setting, integrated); } void ccsGSettingsBackendWriteIntegratedOptionDefault (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); ccsIntegrationWriteSettingIntoOption (priv->integration, priv->context, setting, integrated); } static CCSGSettingsBackendInterface gsettingsAdditionalDefaultInterface = { ccsGSettingsBackendGetContextDefault, ccsGSettingsBackendConnectToValueChangedSignalDefault, ccsGSettingsBackendGetSettingsObjectForPluginWithPathDefault, ccsGSettingsBackendGetCurrentProfileDefault, ccsGSettingsBackendGetExistingProfilesDefault, ccsGSettingsBackendSetExistingProfilesDefault, ccsGSettingsBackendSetCurrentProfileDefault, ccsGSettingsBackendGetPluginsWithSetKeysDefault, ccsGSettingsBackendClearPluginsWithSetKeysDefault, ccsGSettingsBackendUnsetAllChangedPluginKeysInProfileDefault, ccsGSettingsBackendUpdateProfileDefault, ccsGSettingsBackendUpdateCurrentProfileNameDefault, ccsGSettingsBackendAddProfileDefault, ccsGSettingsBackendGetIntegratedOptionIndexDefault, ccsGSettingsBackendReadIntegratedOptionDefault, ccsGSettingsBackendWriteIntegratedOptionDefault }; static CCSGSettingsBackendPrivate * addPrivateToBackend (CCSBackend *backend, CCSObjectAllocationInterface *ai) { CCSGSettingsBackendPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsBackendPrivate)); if (!priv) { ccsObjectRemoveInterface (backend, GET_INTERFACE_TYPE (CCSGSettingsBackendInterface)); return NULL; } ccsObjectSetPrivate (backend, (CCSPrivate *) priv); return priv; } static void ccsGSettingsWrapperDestroyNotify (gpointer o) { ccsGSettingsWrapperUnref ((CCSGSettingsWrapper *) o); } void ccsGSettingsBackendDetachFromBackend (CCSBackend *backend) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); if (priv->currentProfile) { free (priv->currentProfile); priv->currentProfile = NULL; } g_list_free_full (priv->settingsList, ccsGSettingsWrapperDestroyNotify); priv->settingsList = NULL; if (priv->currentProfileSettings) { ccsGSettingsWrapperUnref (priv->currentProfileSettings); priv->currentProfileSettings = NULL; } ccsGSettingsWrapperUnref (priv->compizconfigSettings); priv->compizconfigSettings = NULL; ccsIntegrationUnref (priv->integration); ccsGSettingsWrapperFactoryUnref (priv->wrapperFactory); free (priv->valueChangeData); free (priv); ccsObjectSetPrivate (backend, NULL); } Bool ccsGSettingsBackendAttachNewToBackend (CCSBackend *backend, CCSContext *context, CCSGSettingsWrapper *compizconfigSettings, CCSGSettingsWrapper *currentProfileSettings, CCSGSettingsWrapperFactory *wrapperFactory, CCSIntegration *integration, CCSGNOMEValueChangeData *valueChangeData, char *currentProfile) { ccsObjectAddInterface (backend, (CCSInterface *) &gsettingsAdditionalDefaultInterface, GET_INTERFACE_TYPE (CCSGSettingsBackendInterface)); CCSGSettingsBackendPrivate *priv = addPrivateToBackend (backend, backend->object.object_allocation); priv->compizconfigSettings = compizconfigSettings; priv->currentProfile = currentProfile; priv->currentProfileSettings = currentProfileSettings; priv->context = context; priv->valueChangeData = valueChangeData; priv->integration = integration; priv->wrapperFactory = wrapperFactory; return TRUE; } ././@LongLink0000000000000000000000000000015500000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_wrapper_factory.hcompiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_wrapper_f0000644000015301777760000000200612321343002034021 0ustar pbusernogroup00000000000000/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory.h * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #ifndef _CCS_GSETTINGS_WRAPPER_FACTORY_H #define _CCS_GSETTINGS_WRAPPER_FACTORY_H #include COMPIZCONFIG_BEGIN_DECLS #include #include CCSGSettingsWrapperFactory * ccsGSettingsWrapperFactoryDefaultImplNew (CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ././@LongLink0000000000000000000000000000015100000000000011212 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend_fwd.hcompiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend_f0000644000015301777760000000055712321343002033741 0ustar pbusernogroup00000000000000#ifndef _COMPIZCONFIG_CCS_GSETTINGS_BACKEND_FWD_H #define _COMPIZCONFIG_CCS_GSETTINGS_BACKEND_FWD_H #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSGSettingsWrapper CCSGSettingsWrapper; typedef struct _CCSGSettingsBackend CCSGSettingsBackend; typedef struct _CCSGSettingsWrapperFactory CCSGSettingsWrapperFactory; COMPIZCONFIG_END_DECLS #endif ././@LongLink0000000000000000000000000000016700000000000011221 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_wrapper_factory_interface.hcompiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_wrapper_f0000644000015301777760000000525312321343002034030 0ustar pbusernogroup00000000000000/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory_interface.h * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #ifndef _CCS_GSETTINGS_WRAPPER_FACTORY_INTERFACE_H #define _CCS_GSETTINGS_WRAPPER_FACTORY_INTERFACE_H #include COMPIZCONFIG_BEGIN_DECLS #include #include #include #include typedef struct _CCSGSettingsWrapperFactoryInterface CCSGSettingsWrapperFactoryInterface; typedef CCSGSettingsWrapper * (*CCSGSettingsWrapperFactoryNewGSettingsWrapper) (CCSGSettingsWrapperFactory *wrapperFactory, const gchar *schema, CCSObjectAllocationInterface *ai); typedef CCSGSettingsWrapper * (*CCSGSettingsWrapperFactoryNewGSettingsWrapperWithPath) (CCSGSettingsWrapperFactory *wrapperFactory, const gchar *schema, const gchar *path, CCSObjectAllocationInterface *ai); typedef void (*CCSGSettingsWrapperFactoryFree) (CCSGSettingsWrapperFactory *wrapperFactory); struct _CCSGSettingsWrapperFactoryInterface { CCSGSettingsWrapperFactoryNewGSettingsWrapper newGSettingsWrapper; CCSGSettingsWrapperFactoryNewGSettingsWrapperWithPath newGSettingsWrapperWithPath; CCSGSettingsWrapperFactoryFree free; }; /** * @brief The _CCSGSettingsWrapperFactory struct * * Will create new CCSGSettingsIntegratedSetting objects on demand */ struct _CCSGSettingsWrapperFactory { CCSObject object; }; unsigned int ccsCCSGSettingsWrapperFactoryInterfaceGetType (); CCSREF_HDR (GSettingsWrapperFactory, CCSGSettingsWrapperFactory); CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapper (CCSGSettingsWrapperFactory *wrapperFactory, const gchar *schema, CCSObjectAllocationInterface *ai); CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, const gchar *path, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/CMakeLists.txt0000644000015301777760000000663212321343002031743 0ustar pbusernogroup00000000000000include (FindPkgConfig) compiz_pkg_check_modules (GSETTINGS_UTIL ${_deps}) if (GSETTINGS_UTIL_FOUND) set (GSETTINGS_UTIL_LIB_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/gconf/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/gsettings/include ${compiz_SOURCE_DIR}/compizconfig/libcompizconfig/include ${GSETTINGS_UTIL_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/../src) include_directories (${GSETTINGS_UTIL_LIB_INCLUDES}) link_directories (${GSETTINGS_UTIL_LIBRARY_DIRS} ${compiz_BINARY_DIR}/compizconfig/libcompizconfig ${compiz_BINARY_DIR}/compizconfig/integration/gnome ${CMAKE_BINARY_DIR}/compizconfig/integration/gnome/gconf ${CMAKE_BINARY_DIR}/compizconfig/integration/gnome/gsettings) add_library (compizconfig_gsettings_backend_interface STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_backend_interface.c) add_library (compizconfig_gsettings_wrapper_factory_interface STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_wrapper_factory_interface.c) add_library (compizconfig_gsettings_wrapper_factory STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_wrapper_factory.c) add_library (compizconfig_gsettings_wrapper_interface STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_interface.c) add_library (compizconfig_gsettings_wrapper STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_interface_wrapper.c) target_link_libraries (compizconfig_gsettings_wrapper compizconfig ${GSETTINGS_UTIL_LIBRARIES}) add_library (compizconfig_gsettings_util STATIC ${CMAKE_CURRENT_SOURCE_DIR}/gsettings_constants.c ${CMAKE_CURRENT_SOURCE_DIR}/gsettings_util.c) target_link_libraries (compizconfig_gsettings_util compizconfig_gsettings_backend_interface compizconfig_gsettings_wrapper_interface compizconfig ${GSETTINGS_UTIL_LIBRARIES}) add_library (compizconfig_gsettings_backend SHARED ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_backend.c) set (GSETTINGS_BACKEND_SHARED_ADDITIONAL_LIBRARIES compizconfig_gsettings_backend_interface compizconfig_gsettings_util compizconfig_gsettings_wrapper compizconfig_gnome_integration compizconfig_gnome_integration_gsettings_integrated_setting compizconfig_gnome_integration_gsettings_setting_factory compizconfig_gnome_integration_gsettings_wrapper_factory compizconfig_gsettings_wrapper_factory_interface compizconfig_gsettings_wrapper_factory compizconfig) if (USE_GCONF) list (APPEND GSETTINGS_BACKEND_SHARED_ADDITIONAL_LIBRARIES compizconfig_gnome_integration_gconf_setting_factory) list (APPEND GSETTINGS_BACKEND_SHARED_ADDITIONAL_LIBRARIES compizconfig_gnome_integration_gconf_integrated_setting) endif (USE_GCONF) target_link_libraries (compizconfig_gsettings_backend ${GSETTINGS_BACKEND_SHARED_ADDITIONAL_LIBRARIES} ${GSETTINGS_UTIL_LIBRARIES}) install (TARGETS compizconfig_gsettings_backend DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) endif (GSETTINGS_UTIL_FOUND) ././@LongLink0000000000000000000000000000015500000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_wrapper_factory.ccompiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_wrapper_f0000644000015301777760000000620012321343002034021 0ustar pbusernogroup00000000000000/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory.c * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #include #include "ccs_gsettings_wrapper_factory.h" #include "ccs_gsettings_wrapper_factory_interface.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_interface_wrapper.h" /* CCSGSettingsWrapperFactory implementation */ typedef struct _CCSGSettingsWrapperFactoryPrivate CCSGSettingsWrapperFactoryPrivate; struct _CCSGSettingsWrapperFactoryPrivate { }; static void ccsGSettingsWrapperDefaultImplFree (CCSGSettingsWrapperFactory *wrapperFactory) { ccsObjectFinalize (wrapperFactory); (*wrapperFactory->object.object_allocation->free_) (wrapperFactory->object.object_allocation->allocator, wrapperFactory); } static CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapperDefault (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, CCSObjectAllocationInterface *ai) { CCSGSettingsWrapper *wrapper = ccsGSettingsWrapperNewForSchema (schemaName, ai); return wrapper; } CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPathDefault (CCSGSettingsWrapperFactory *wrapperFactory, const gchar *schemaName, const gchar *path, CCSObjectAllocationInterface *ai) { CCSGSettingsWrapper *wrapper = ccsGSettingsWrapperNewForSchemaWithPath (schemaName, path, ai); return wrapper; } const CCSGSettingsWrapperFactoryInterface ccsGSettingsWrapperFactoryInterface = { ccsGSettingsWrapperFactoryNewGSettingsWrapperDefault, ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPathDefault, ccsGSettingsWrapperDefaultImplFree }; CCSGSettingsWrapperFactory * ccsGSettingsWrapperFactoryDefaultImplNew (CCSObjectAllocationInterface *ai) { CCSGSettingsWrapperFactory *wrapperFactory = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsWrapperFactory)); if (!wrapperFactory) return NULL; CCSGSettingsWrapperFactoryPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsWrapperFactoryPrivate)); if (!priv) { (*ai->free_) (ai->allocator, wrapperFactory); return NULL; } ccsObjectInit (wrapperFactory, ai); ccsObjectAddInterface (wrapperFactory, (const CCSInterface *) &ccsGSettingsWrapperFactoryInterface, GET_INTERFACE_TYPE (CCSGSettingsWrapperFactoryInterface)); ccsObjectSetPrivate (wrapperFactory, (CCSPrivate *) priv); ccsGSettingsWrapperFactoryRef (wrapperFactory); return wrapperFactory; } ././@LongLink0000000000000000000000000000014700000000000011217 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_interface.hcompiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_interface0000644000015301777760000000547112321343002034005 0ustar pbusernogroup00000000000000#ifndef _CCS_GSETTINGS_INTERFACE_H #define _CCS_GSETTINGS_INTERFACE_H #include COMPIZCONFIG_BEGIN_DECLS #include #include #include #include typedef struct _CCSGSettingsWrapperInterface CCSGSettingsWrapperInterface; typedef void (*CCSGSettingsWrapperSetValue) (CCSGSettingsWrapper *, const char *, GVariant *); typedef GVariant * (*CCSGSettingsWrapperGetValue) (CCSGSettingsWrapper *, const char *); typedef void (*CCSGSettingsWrapperResetKey) (CCSGSettingsWrapper *, const char *); typedef char ** (*CCSGSettingsWrapperListKeys) (CCSGSettingsWrapper *); typedef GSettings * (*CCSGSettingsWrapperGetGSettings) (CCSGSettingsWrapper *); typedef const char * (*CCSGSettingsWrapperGetSchemaName) (CCSGSettingsWrapper *); typedef const char * (*CCSGSettingsWrapperGetPath) (CCSGSettingsWrapper *); typedef void (*CCSGSettingsWrapperConnectToChangedSignal) (CCSGSettingsWrapper *, GCallback, gpointer); typedef void (*CCSGSettingsWrapperFree) (CCSGSettingsWrapper *); struct _CCSGSettingsWrapperInterface { CCSGSettingsWrapperSetValue gsettingsWrapperSetValue; CCSGSettingsWrapperGetValue gsettingsWrapperGetValue; CCSGSettingsWrapperResetKey gsettingsWrapperResetKey; CCSGSettingsWrapperListKeys gsettingsWrapperListKeys; CCSGSettingsWrapperGetGSettings gsettingsWrapperGetGSettings; CCSGSettingsWrapperGetSchemaName gsettingsWrapperGetSchemaName; CCSGSettingsWrapperGetPath gsettingsWrapperGetPath; CCSGSettingsWrapperConnectToChangedSignal gsettingsWrapperConnectToChangedSignal; CCSGSettingsWrapperFree gsettingsWrapperFree; }; /** * @brief The _CCSGSettingsWrapper struct * * A wrapper around GSettings. * * This wrapper exists for testing purposes and presents the subset * of interface that we wish to use from GSettings anways. It does not * have any of the typed functions and it is the programmer's responsibility * to supply a GVariant to setValue and getValue that is valid. */ struct _CCSGSettingsWrapper { CCSObject object; }; void ccsGSettingsWrapperSetValue (CCSGSettingsWrapper *, const char *, GVariant *); GVariant * ccsGSettingsWrapperGetValue (CCSGSettingsWrapper *, const char *); void ccsGSettingsWrapperResetKey (CCSGSettingsWrapper *, const char *); char **ccsGSettingsWrapperListKeys (CCSGSettingsWrapper *); GSettings * ccsGSettingsWrapperGetGSettings (CCSGSettingsWrapper *); const char * ccsGSettingsWrapperGetSchemaName (CCSGSettingsWrapper *); const char * ccsGSettingsWrapperGetPath (CCSGSettingsWrapper *); void ccsGSettingsWrapperConnectToChangedSignal (CCSGSettingsWrapper *, GCallback, gpointer); void ccsFreeGSettingsWrapper (CCSGSettingsWrapper *wrapper); unsigned int ccsCCSGSettingsWrapperInterfaceGetType (); CCSREF_HDR (GSettingsWrapper, CCSGSettingsWrapper); COMPIZCONFIG_END_DECLS #endif ././@LongLink0000000000000000000000000000015700000000000011220 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend_interface.hcompiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend_i0000644000015301777760000001311512321343002033736 0ustar pbusernogroup00000000000000#ifndef _COMPIZCONFIG_GSETTINGS_BACKEND_INTERFACE_H #define _COMPIZCONFIG_GSETTINGS_BACKEND_INTERFACE_H #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSGSettingsBackendInterface CCSGSettingsBackendInterface; typedef CCSContext * (*CCSGSettingsBackendGetContext) (CCSBackend *); typedef void (*CCSGSettingsBackendConnectToChangedSignal) (CCSBackend *, CCSGSettingsWrapper *); typedef CCSGSettingsWrapper * (*CCSGSettingsBackendGetSettingsObjectForPluginWithPath) (CCSBackend *backend, const char *plugin, const char *path, CCSContext *context); typedef const char * (*CCSGSettingsBackendGetCurrentProfile) (CCSBackend *backend); typedef GVariant * (*CCSGSettingsBackendGetExistingProfiles) (CCSBackend *backend); typedef void (*CCSGSettingsBackendSetExistingProfiles) (CCSBackend *backend, GVariant *value); typedef void (*CCSGSettingsBackendSetCurrentProfile) (CCSBackend *backend, const gchar *value); typedef GVariant * (*CCSGSettingsBackendGetPluginsWithSetKeys) (CCSBackend *backend); typedef void (*CCSGSettingsBackendClearPluginsWithSetKeys) (CCSBackend *backend); typedef void (*CCSGSettingsBackendUnsetAllChangedPluginKeysInProfile) (CCSBackend *backend, CCSContext *, GVariant *, const char *); typedef gboolean (*CCSGSettingsBackendUpdateProfile) (CCSBackend *, CCSContext *); typedef void (*CCSGSettingsBackendUpdateCurrentProfileName) (CCSBackend *backend, const char *profile); typedef gboolean (*CCSGSettingsBackendAddProfile) (CCSBackend *backend, const char *profile); typedef CCSIntegratedSetting * (*CCSGSettingsBackendGetIntegratedSetting) (CCSBackend *backend, CCSSetting *setting); typedef Bool (*CCSGSettingsBackendReadIntegratedOption) (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *); typedef void (*CCSGSettingsBackendWriteIntegratedOption) (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *); /** * @brief The _CCSGSettingsBackendInterface struct * * This interface represents a loaded CCSGSettingsBackend and some of the * special operations that go with it. It is mainly an interface that * exists for testing purposes - there are some operations which we * want to mock out or replace since they can't be done in testing mode. * * CCSGSettingsBackendInterface isn't an interface that is implemented * by any objects itself - it is attached to an existing CCSBackend * at runtime, and the CCSBackend is passed to any utility functions in * the GSettings backend. */ struct _CCSGSettingsBackendInterface { CCSGSettingsBackendGetContext gsettingsBackendGetContext; CCSGSettingsBackendConnectToChangedSignal gsettingsBackendConnectToChangedSignal; CCSGSettingsBackendGetSettingsObjectForPluginWithPath gsettingsBackendGetSettingsObjectForPluginWithPath; CCSGSettingsBackendGetCurrentProfile gsettingsBackendGetCurrentProfile; CCSGSettingsBackendGetExistingProfiles gsettingsBackendGetExistingProfiles; CCSGSettingsBackendSetExistingProfiles gsettingsBackendSetExistingProfiles; CCSGSettingsBackendSetCurrentProfile gsettingsBackendSetCurrentProfile; CCSGSettingsBackendGetPluginsWithSetKeys gsettingsBackendGetPluginsWithSetKeys; CCSGSettingsBackendClearPluginsWithSetKeys gsettingsBackendClearPluginsWithSetKeys; CCSGSettingsBackendUnsetAllChangedPluginKeysInProfile gsettingsBackendUnsetAllChangedPluginKeysInProfile; CCSGSettingsBackendUpdateProfile gsettingsBackendUpdateProfile; CCSGSettingsBackendUpdateCurrentProfileName gsettingsBackendUpdateCurrentProfileName; CCSGSettingsBackendAddProfile gsettingsBackendAddProfile; CCSGSettingsBackendGetIntegratedSetting gsettingsBackendGetIntegratedSetting; CCSGSettingsBackendReadIntegratedOption gsettingsBackendReadIntegratedOption; CCSGSettingsBackendWriteIntegratedOption gsettingsBackendWriteIntegratedOption; }; unsigned int ccsCCSGSettingsBackendInterfaceGetType (); gboolean ccsGSettingsBackendUpdateProfile (CCSBackend *backend, CCSContext *context); void ccsGSettingsBackendUpdateCurrentProfileName (CCSBackend *backend, const char *profile); CCSContext * ccsGSettingsBackendGetContext (CCSBackend *backend); void ccsGSettingsBackendConnectToChangedSignal (CCSBackend *backend, CCSGSettingsWrapper *object); CCSGSettingsWrapper * ccsGSettingsGetSettingsObjectForPluginWithPath (CCSBackend *backend, const char *plugin, const char *path, CCSContext *context); const char * ccsGSettingsBackendGetCurrentProfile (CCSBackend *backend); GVariant * ccsGSettingsBackendGetExistingProfiles (CCSBackend *backend); void ccsGSettingsBackendSetExistingProfiles (CCSBackend *backend, GVariant *value); void ccsGSettingsBackendSetCurrentProfile (CCSBackend *backend, const gchar *value); GVariant * ccsGSettingsBackendGetPluginsWithSetKeys (CCSBackend *backend); void ccsGSettingsBackendClearPluginsWithSetKeys (CCSBackend *backend); void ccsGSettingsBackendUnsetAllChangedPluginKeysInProfile (CCSBackend *backend, CCSContext *context, GVariant *pluginKeys, const char *profile); void ccsGSettingsBackendAddProfile (CCSBackend *backend, const char *profile); CCSIntegratedSetting * ccsGSettingsBackendGetIntegratedSetting (CCSBackend *backend, CCSSetting *setting); Bool ccsGSettingsBackendReadIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated); void ccsGSettingsBackendWriteIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated); COMPIZCONFIG_END_DECLS #endif ././@LongLink0000000000000000000000000000015700000000000011220 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_interface_wrapper.ccompiz-0.9.11+14.04.20140409/compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_interface0000644000015301777760000002167512321343002034011 0ustar pbusernogroup00000000000000#include #include #include "ccs_gsettings_interface_wrapper.h" #include "ccs_gsettings_interface.h" typedef struct _CCSGSettingsWrapperPrivate CCSGSettingsWrapperPrivate; struct _CCSGSettingsWrapperPrivate { GSettings *settings; char *schema; char *path; }; #define GSETTINGS_WRAPPER_PRIVATE(w) \ CCSGSettingsWrapperPrivate *gswPrivate = (CCSGSettingsWrapperPrivate *) ccsObjectGetPrivate (w); static GVariant * ccsGSettingsWrapperGetValueDefault (CCSGSettingsWrapper *wrapper, const char *key) { GSETTINGS_WRAPPER_PRIVATE (wrapper); return g_settings_get_value (gswPrivate->settings, key); } static void ccsGSettingsWrapperSetValueDefault (CCSGSettingsWrapper *wrapper, const char *key, GVariant *variant) { GSETTINGS_WRAPPER_PRIVATE (wrapper); g_settings_set_value (gswPrivate->settings, key, variant); } static void ccsGSettingsWrapperResetKeyDefault (CCSGSettingsWrapper *wrapper, const char *key) { GSETTINGS_WRAPPER_PRIVATE (wrapper); g_settings_reset (gswPrivate->settings, key); } static char ** ccsGSettingsWrapperListKeysDefault (CCSGSettingsWrapper *wrapper) { GSETTINGS_WRAPPER_PRIVATE (wrapper); return g_settings_list_keys (gswPrivate->settings); } static GSettings * ccsGSettingsWrapperGetGSettingsDefault (CCSGSettingsWrapper *wrapper) { GSETTINGS_WRAPPER_PRIVATE (wrapper); return gswPrivate->settings; } static const char * ccsGSettingsWrapperGetSchemaNameDefault (CCSGSettingsWrapper *wrapper) { GSETTINGS_WRAPPER_PRIVATE (wrapper); return gswPrivate->schema; } static const char * ccsGSettingsWrapperGetPathDefault (CCSGSettingsWrapper *wrapper) { GSETTINGS_WRAPPER_PRIVATE (wrapper); return gswPrivate->path; } void ccsGSettingsWrapperConnectToChangedSignalDefault (CCSGSettingsWrapper *wrapper, GCallback callback, gpointer data) { GSETTINGS_WRAPPER_PRIVATE (wrapper); g_signal_connect (gswPrivate->settings, "changed", callback, data); } static void ccsFreeGSettingsWrapperDefault (CCSGSettingsWrapper *wrapper) { GSETTINGS_WRAPPER_PRIVATE (wrapper); if (gswPrivate->settings) g_object_unref (gswPrivate->settings); if (gswPrivate->path) (*wrapper->object.object_allocation->free_) (wrapper->object.object_allocation->allocator, gswPrivate->path); if (gswPrivate->schema) (*wrapper->object.object_allocation->free_) (wrapper->object.object_allocation->allocator, gswPrivate->schema); ccsObjectFinalize (wrapper); (*wrapper->object.object_allocation->free_) (wrapper->object.object_allocation->allocator, wrapper); } const CCSGSettingsWrapperInterface interface = { ccsGSettingsWrapperSetValueDefault, ccsGSettingsWrapperGetValueDefault, ccsGSettingsWrapperResetKeyDefault, ccsGSettingsWrapperListKeysDefault, ccsGSettingsWrapperGetGSettingsDefault, ccsGSettingsWrapperGetSchemaNameDefault, ccsGSettingsWrapperGetPathDefault, ccsGSettingsWrapperConnectToChangedSignalDefault, ccsFreeGSettingsWrapperDefault }; static CCSGSettingsWrapperPrivate * allocatePrivateWrapper (CCSObjectAllocationInterface *ai, CCSGSettingsWrapper *wrapper) { CCSGSettingsWrapperPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsWrapper)); if (!priv) { (*ai->free_) (ai->allocator, wrapper); return NULL; } return priv; } static CCSGSettingsWrapper * allocateWrapper (CCSObjectAllocationInterface *ai) { CCSGSettingsWrapper *wrapper = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsWrapper)); if (!wrapper) return NULL; return wrapper; } static void freeWrapperAndPriv (CCSGSettingsWrapper *wrapper, CCSGSettingsWrapperPrivate *priv, CCSObjectAllocationInterface *ai) { (*ai->free_) (ai->allocator, priv); (*ai->free_) (ai->allocator, wrapper); } static gpointer listAllRelocatableSchemas (gpointer data) { return (gpointer) g_settings_list_relocatable_schemas (); } static inline const gchar * const * listAllRelocatableSchemasOnce () { static GOnce get_settings_once = G_ONCE_INIT; g_once (&get_settings_once, listAllRelocatableSchemas, NULL); return (const gchar * const *) get_settings_once.retval; } static gpointer listAllSchemas (gpointer data) { return (gpointer) g_settings_list_schemas (); } static inline const gchar * const * listAllSchemasOnce () { static GOnce get_settings_once = G_ONCE_INIT; g_once (&get_settings_once, listAllSchemas, NULL); return (const gchar * const *) get_settings_once.retval; } typedef void * GSettingsConstructorFuncUserData; typedef GSettings * (*GSettingsConstructorFunc) (const gchar *, GSettingsConstructorFuncUserData); static inline GSettings * ccsGSettingsNewNoPath (const gchar *schema, GSettingsConstructorFuncUserData data) { (void) data; return g_settings_new (schema); } static inline GSettings * ccsGSettingsNewWithPathFromUserData (const gchar *schema, GSettingsConstructorFuncUserData data) { return g_settings_new_with_path (schema, (const gchar *) data); } static inline GSettings * ccsGSettingsNewGSettingsFuncNoAbort (const gchar *schema, const gchar * const *schemas, GSettingsConstructorFunc func, GSettingsConstructorFuncUserData data) { guint i = 0; for (; schemas[i]; ++i) if (g_strcmp0 (schema, schemas[i]) == 0) return (*func) (schema, data); return NULL; } static inline GSettings * ccsGSettingsNewGSettingsWithPathNoAbort (const gchar *schema, const gchar *path) { const gchar * const *schemas = listAllRelocatableSchemasOnce (); return ccsGSettingsNewGSettingsFuncNoAbort (schema, schemas, ccsGSettingsNewWithPathFromUserData, (GSettingsConstructorFuncUserData) path); } static inline GSettings * ccsGSettingsNewGSettingsNoAbort (const gchar *schema) { const gchar * const *schemas = listAllSchemasOnce (); return ccsGSettingsNewGSettingsFuncNoAbort (schema, schemas, ccsGSettingsNewNoPath, NULL); } static GSettings * newGSettingsWithPath (const char *schema, const char *path, CCSGSettingsWrapper *wrapper, CCSGSettingsWrapperPrivate *priv, CCSObjectAllocationInterface *ai) { GSettings *settings = ccsGSettingsNewGSettingsWithPathNoAbort (schema, path); if (!settings) { freeWrapperAndPriv (wrapper, priv, ai); return NULL; } return settings; } static GSettings * newGSettings (const char *schema, CCSGSettingsWrapper *wrapper, CCSGSettingsWrapperPrivate *priv, CCSObjectAllocationInterface *ai) { GSettings *settings = ccsGSettingsNewGSettingsNoAbort (schema); if (!settings) { freeWrapperAndPriv (wrapper, priv, ai); return NULL; } return settings; } static Bool allocateWrapperData (CCSObjectAllocationInterface *ai, CCSGSettingsWrapper **wrapper, CCSGSettingsWrapperPrivate **priv) { *wrapper = allocateWrapper (ai); if (!*wrapper) return FALSE; *priv = allocatePrivateWrapper (ai, *wrapper); if (!*priv) return FALSE; return TRUE; } static void initCCSGSettingsWrapperObject (CCSGSettingsWrapper *wrapper, CCSGSettingsWrapperPrivate *priv, CCSObjectAllocationInterface *ai) { ccsObjectInit (wrapper, ai); ccsObjectAddInterface (wrapper, (const CCSInterface *) &interface, GET_INTERFACE_TYPE (CCSGSettingsWrapperInterface)); ccsObjectSetPrivate (wrapper, (CCSPrivate *) priv); ccsGSettingsWrapperRef (wrapper); } CCSGSettingsWrapper * ccsGSettingsWrapperNewForSchemaWithPath (const char *schema, const char *path, CCSObjectAllocationInterface *ai) { CCSGSettingsWrapper *wrapper = NULL; CCSGSettingsWrapperPrivate *priv = NULL; GSettings *settings = NULL; if (!allocateWrapperData (ai, &wrapper, &priv)) return NULL; settings = newGSettingsWithPath (schema, path, wrapper, priv, ai); if (!settings) return NULL; priv->schema = g_strdup (schema); priv->path = g_strdup (path); priv->settings = settings; initCCSGSettingsWrapperObject (wrapper, priv, ai); return wrapper; } CCSGSettingsWrapper * ccsGSettingsWrapperNewForSchema (const char *schema, CCSObjectAllocationInterface *ai) { CCSGSettingsWrapper *wrapper = NULL; CCSGSettingsWrapperPrivate *priv = NULL; GSettings *settings = NULL; if (!allocateWrapperData (ai, &wrapper, &priv)) return NULL; settings = newGSettings (schema, wrapper, priv, ai); if (!settings) return NULL; priv->schema = g_strdup (schema); priv->settings = settings; GValue pathValue = G_VALUE_INIT; g_value_init (&pathValue, G_TYPE_STRING); g_object_get_property (G_OBJECT (priv->settings), "path", &pathValue); priv->path = g_value_dup_string (&pathValue); g_value_unset (&pathValue); initCCSGSettingsWrapperObject (wrapper, priv, ai); return wrapper; } compiz-0.9.11+14.04.20140409/compizconfig/gsettings/mocks/0000755000015301777760000000000012321344021023306 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/mocks/ccs_gsettings_wrapper_mock.cpp0000644000015301777760000000312112321343002031415 0ustar pbusernogroup00000000000000#include const CCSGSettingsWrapperInterface mockInterface = { CCSGSettingsWrapperGMock::ccsGSettingsWrapperSetValue, CCSGSettingsWrapperGMock::ccsGSettingsWrapperGetValue, CCSGSettingsWrapperGMock::ccsGSettingsWrapperResetKey, CCSGSettingsWrapperGMock::ccsGSettingsWrapperListKeys, CCSGSettingsWrapperGMock::ccsGSettingsWrapperGetGSettings, CCSGSettingsWrapperGMock::ccsGSettingsWrapperGetSchemaName, CCSGSettingsWrapperGMock::ccsGSettingsWrapperGetPath, CCSGSettingsWrapperGMock::ccsGSettingsWrapperConnectToChangedSignal, CCSGSettingsWrapperGMock::ccsFreeGSettingsWrapper }; CCSGSettingsWrapper * ccsMockGSettingsWrapperNew () { CCSGSettingsWrapper *wrapper = (CCSGSettingsWrapper *) calloc (1, sizeof (CCSGSettingsWrapper)); if (!wrapper) return NULL; CCSGSettingsWrapperGMock *gmockWrapper = new CCSGSettingsWrapperGMock (wrapper); if (!gmockWrapper) { free (wrapper); return NULL; } ccsObjectInit (wrapper, &ccsDefaultObjectAllocator); ccsObjectAddInterface (wrapper, (const CCSInterface *) &mockInterface, GET_INTERFACE_TYPE (CCSGSettingsWrapperInterface)); ccsObjectSetPrivate (wrapper, (CCSPrivate *) gmockWrapper); ccsGSettingsWrapperRef (wrapper); return wrapper; } void ccsMockGSettingsWrapperFree (CCSGSettingsWrapper *wrapper) { CCSGSettingsWrapperGMock *gmockWrapper = reinterpret_cast (ccsObjectGetPrivate (wrapper)); delete gmockWrapper; ccsObjectSetPrivate (wrapper, NULL); ccsObjectFinalize (wrapper); free (wrapper); } compiz-0.9.11+14.04.20140409/compizconfig/gsettings/mocks/ccs_gsettings_wrapper_mock.h0000644000015301777760000000641612321343002031074 0ustar pbusernogroup00000000000000#ifndef _COMPIZCONFIG_CCS_GSETTINGS_WRAPPER_MOCK #define _COMPIZCONFIG_CCS_GSETTINGS_WRAPPER_MOCK #include #include #include CCSGSettingsWrapper * ccsMockGSettingsWrapperNew (); void ccsMockGSettingsWrapperFree (CCSGSettingsWrapper *); class CCSGSettingsWrapperMockInterface { public: virtual ~CCSGSettingsWrapperMockInterface () {} virtual void setValue (const char *, GVariant *) = 0; virtual GVariant * getValue (const char *) = 0; virtual void resetKey (const char *) = 0; virtual char ** listKeys () = 0; virtual GSettings * getGSettings () = 0; virtual const char * getSchemaName () = 0; virtual const char * getPath () = 0; virtual void connectToChangedSignal (GCallback, gpointer) = 0; }; class CCSGSettingsWrapperGMock : public CCSGSettingsWrapperMockInterface { public: CCSGSettingsWrapperGMock (CCSGSettingsWrapper *wrapper) : mWrapper (wrapper) { } MOCK_METHOD2 (setValue, void (const char *, GVariant *)); MOCK_METHOD1 (getValue, GVariant * (const char *)); MOCK_METHOD1 (resetKey, void (const char *)); MOCK_METHOD0 (listKeys, char ** ()); MOCK_METHOD0 (getGSettings, GSettings * ()); MOCK_METHOD0 (getSchemaName, const char * ()); MOCK_METHOD0 (getPath, const char * ()); MOCK_METHOD2 (connectToChangedSignal, void (GCallback, gpointer)); private: CCSGSettingsWrapper *mWrapper; public: static void ccsGSettingsWrapperSetValue (CCSGSettingsWrapper *wrapper, const char *key, GVariant *value) { reinterpret_cast (ccsObjectGetPrivate (wrapper))->setValue (key, value); } static GVariant * ccsGSettingsWrapperGetValue (CCSGSettingsWrapper *wrapper, const char *key) { return reinterpret_cast (ccsObjectGetPrivate (wrapper))->getValue (key); } static void ccsGSettingsWrapperResetKey (CCSGSettingsWrapper *wrapper, const char *key) { reinterpret_cast (ccsObjectGetPrivate (wrapper))->resetKey (key); } static char ** ccsGSettingsWrapperListKeys (CCSGSettingsWrapper *wrapper) { return reinterpret_cast (ccsObjectGetPrivate (wrapper))->listKeys (); } static GSettings * ccsGSettingsWrapperGetGSettings (CCSGSettingsWrapper *wrapper) { return reinterpret_cast (ccsObjectGetPrivate (wrapper))->getGSettings (); } static const char * ccsGSettingsWrapperGetSchemaName (CCSGSettingsWrapper *wrapper) { return reinterpret_cast (ccsObjectGetPrivate (wrapper))->getSchemaName (); } static const char * ccsGSettingsWrapperGetPath (CCSGSettingsWrapper *wrapper) { return reinterpret_cast (ccsObjectGetPrivate (wrapper))->getPath (); } static void ccsGSettingsWrapperConnectToChangedSignal (CCSGSettingsWrapper *wrapper, GCallback callback, gpointer data) { reinterpret_cast (ccsObjectGetPrivate (wrapper))->connectToChangedSignal (callback, data); } static void ccsFreeGSettingsWrapper (CCSGSettingsWrapper *wrapper) { ccsMockGSettingsWrapperFree (wrapper); } }; #endif compiz-0.9.11+14.04.20140409/compizconfig/gsettings/mocks/CMakeLists.txt0000644000015301777760000000174212321343002026050 0ustar pbusernogroup00000000000000pkg_check_modules (GLIB glib-2.0) if (GLIB_FOUND) include_directories (${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../../libcompizconfig/include ${CMAKE_CURRENT_SOURCE_DIR}/../gsettings_backend_shared ${GLIB_INCLUDE_DIRS}) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") add_library (compizconfig_ccs_gsettings_wrapper_mock STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_wrapper_mock.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_wrapper_mock.h) add_library (compizconfig_ccs_gsettings_wrapper_factory_mock STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_wrapper_factory_mock.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_wrapper_factory_mock.h) add_library (compizconfig_ccs_gsettings_backend_mock STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_backend_mock.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_backend_mock.h) endif (GLIB_FOUND) compiz-0.9.11+14.04.20140409/compizconfig/gsettings/mocks/ccs_gsettings_backend_mock.h0000644000015301777760000001525712321343002031006 0ustar pbusernogroup00000000000000#ifndef _COMPIZCONFIG_CCS_GSETTINGS_BACKEND_MOCK #define _COMPIZCONFIG_CCS_GSETTINGS_BACKEND_MOCK #include #include #include #include "ccs_gsettings_backend_interface.h" using ::testing::_; using ::testing::Return; CCSBackend * ccsGSettingsBackendGMockNew (); void ccsGSettingsBackendGMockFree (CCSBackend *backend); class CCSGSettingsBackendGMockInterface { public: virtual ~CCSGSettingsBackendGMockInterface () {} virtual CCSContext * getContext () = 0; virtual void connectToChangedSignal (CCSGSettingsWrapper *) = 0; virtual CCSGSettingsWrapper * getSettingsObjectForPluginWithPath (const char * plugin, const char * path, CCSContext * context) = 0; virtual const char * getCurrentProfile () = 0; virtual GVariant * getExistingProfiles () = 0; virtual void setExistingProfiles (GVariant *) = 0; virtual void setCurrentProfile (const gchar *) = 0; virtual GVariant * getPluginsWithSetKeys () = 0; virtual void clearPluginsWithSetKeys () = 0; virtual void unsetAllChangedPluginKeysInProfile (CCSContext *, GVariant *, const char *) = 0; virtual gboolean updateProfile (CCSContext *) = 0; virtual void updateCurrentProfileName (const char *) = 0; virtual gboolean addProfile (const char *) = 0; virtual CCSIntegratedSetting * getIntegratedSetting (CCSSetting *) = 0; virtual Bool readIntegratedOption (CCSSetting *, CCSIntegratedSetting *) = 0; virtual void writeIntegratedOption (CCSSetting *, CCSIntegratedSetting *) = 0; }; class CCSGSettingsBackendGMock : public CCSGSettingsBackendGMockInterface { public: CCSGSettingsBackendGMock (CCSBackend *backend) : mBackend (backend) { } MOCK_METHOD0 (getContext, CCSContext * ()); MOCK_METHOD1 (connectToChangedSignal, void (CCSGSettingsWrapper *)); MOCK_METHOD3 (getSettingsObjectForPluginWithPath, CCSGSettingsWrapper * (const char * plugin, const char * path, CCSContext * context)); MOCK_METHOD0 (getCurrentProfile, const char * ()); MOCK_METHOD0 (getExistingProfiles, GVariant * ()); MOCK_METHOD1 (setExistingProfiles, void (GVariant *)); MOCK_METHOD1 (setCurrentProfile, void (const gchar *)); MOCK_METHOD0 (getPluginsWithSetKeys, GVariant * ()); MOCK_METHOD0 (clearPluginsWithSetKeys, void ()); MOCK_METHOD3 (unsetAllChangedPluginKeysInProfile, void (CCSContext *, GVariant *, const char *)); MOCK_METHOD1 (updateProfile, gboolean (CCSContext *)); MOCK_METHOD1 (updateCurrentProfileName, void (const char *)); MOCK_METHOD1 (addProfile, gboolean (const char *)); MOCK_METHOD1 (getIntegratedSetting, CCSIntegratedSetting * (CCSSetting *)); MOCK_METHOD2 (readIntegratedOption, Bool (CCSSetting *, CCSIntegratedSetting *)); MOCK_METHOD2 (writeIntegratedOption, void (CCSSetting *, CCSIntegratedSetting *)); CCSBackend * getBackend () { return mBackend; } private: CCSBackend *mBackend; public: static CCSContext * ccsGSettingsBackendGetContext (CCSBackend *backend) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->getContext (); } static void ccsGSettingsBackendConnectToValueChangedSignal (CCSBackend *backend, CCSGSettingsWrapper *object) { (reinterpret_cast (ccsObjectGetPrivate (backend)))->connectToChangedSignal(object); } static CCSGSettingsWrapper * ccsGSettingsBackendGetSettingsObjectForPluginWithPath (CCSBackend *backend, const char *plugin, const char *path, CCSContext *context) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->getSettingsObjectForPluginWithPath (plugin, path, context); } static const char * ccsGSettingsBackendGetCurrentProfile (CCSBackend *backend) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->getCurrentProfile (); } static GVariant * ccsGSettingsBackendGetExistingProfiles (CCSBackend *backend) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->getExistingProfiles (); } static void ccsGSettingsBackendSetExistingProfiles (CCSBackend *backend, GVariant *value) { (reinterpret_cast (ccsObjectGetPrivate (backend)))->setExistingProfiles (value); } static void ccsGSettingsBackendSetCurrentProfile (CCSBackend *backend, const gchar *value) { (reinterpret_cast (ccsObjectGetPrivate (backend)))->setCurrentProfile (value); } static GVariant * ccsGSettingsBackendGetPluginsWithSetKeys (CCSBackend *backend) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->getPluginsWithSetKeys (); } static void ccsGSettingsBackendClearPluginsWithSetKeys (CCSBackend *backend) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->clearPluginsWithSetKeys (); } static void ccsGSettingsBackendUnsetAllChangedPluginKeysInProfile (CCSBackend *backend, CCSContext *context, GVariant *pluginKeys, const char *profile) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->unsetAllChangedPluginKeysInProfile (context, pluginKeys, profile); } static gboolean ccsGSettingsBackendUpdateProfile (CCSBackend *backend, CCSContext *context) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->updateProfile (context); } static void ccsGSettingsBackendUpdateCurrentProfileName (CCSBackend *backend, const char *profile) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->updateCurrentProfileName (profile); } static gboolean ccsGSettingsBackendAddProfile (CCSBackend *backend, const char *profile) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->addProfile (profile); } static CCSIntegratedSetting * ccsGSettingsBackendGetIntegratedSetting (CCSBackend *backend, CCSSetting *setting) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->getIntegratedSetting (setting); } static Bool ccsGSettingsBackendReadIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->readIntegratedOption (setting, integrated); } static void ccsGSettingsBackendWriteIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { (reinterpret_cast (ccsObjectGetPrivate (backend)))->writeIntegratedOption (setting, integrated); } }; #endif compiz-0.9.11+14.04.20140409/compizconfig/gsettings/mocks/ccs_gsettings_backend_mock.cpp0000644000015301777760000000424412321343002031333 0ustar pbusernogroup00000000000000#include #include #include #include "ccs_gsettings_backend_mock.h" CCSGSettingsBackendInterface ccsGSettingsBackendGMockInterface = { CCSGSettingsBackendGMock::ccsGSettingsBackendGetContext, CCSGSettingsBackendGMock::ccsGSettingsBackendConnectToValueChangedSignal, CCSGSettingsBackendGMock::ccsGSettingsBackendGetSettingsObjectForPluginWithPath, CCSGSettingsBackendGMock::ccsGSettingsBackendGetCurrentProfile, CCSGSettingsBackendGMock::ccsGSettingsBackendGetExistingProfiles, CCSGSettingsBackendGMock::ccsGSettingsBackendSetExistingProfiles, CCSGSettingsBackendGMock::ccsGSettingsBackendSetCurrentProfile, CCSGSettingsBackendGMock::ccsGSettingsBackendGetPluginsWithSetKeys, CCSGSettingsBackendGMock::ccsGSettingsBackendClearPluginsWithSetKeys, CCSGSettingsBackendGMock::ccsGSettingsBackendUnsetAllChangedPluginKeysInProfile, CCSGSettingsBackendGMock::ccsGSettingsBackendUpdateProfile, CCSGSettingsBackendGMock::ccsGSettingsBackendUpdateCurrentProfileName, CCSGSettingsBackendGMock::ccsGSettingsBackendAddProfile, CCSGSettingsBackendGMock::ccsGSettingsBackendGetIntegratedSetting, CCSGSettingsBackendGMock::ccsGSettingsBackendReadIntegratedOption, CCSGSettingsBackendGMock::ccsGSettingsBackendWriteIntegratedOption }; CCSBackend * ccsGSettingsBackendGMockNew () { CCSBackend *backend = (CCSBackend *) calloc (1, sizeof (CCSBackend)); if (!backend) return NULL; CCSGSettingsBackendGMock *gmock = new CCSGSettingsBackendGMock (backend); if (!gmock) { free (backend); return NULL; } ccsObjectInit (backend, &ccsDefaultObjectAllocator); ccsObjectAddInterface (backend, (const CCSInterface *) &ccsGSettingsBackendGMockInterface, GET_INTERFACE_TYPE (CCSGSettingsBackendInterface)); ccsObjectSetPrivate (backend, reinterpret_cast (gmock)); return backend; } void ccsGSettingsBackendGMockFree (CCSBackend *backend) { CCSGSettingsBackendGMock *mock = reinterpret_cast (ccsObjectGetPrivate (backend)); delete mock; ccsObjectSetPrivate (backend, NULL); ccsObjectFinalize (backend); free (backend); } compiz-0.9.11+14.04.20140409/compizconfig/gsettings/mocks/ccs_gsettings_wrapper_factory_mock.cpp0000644000015301777760000000264312321343002033154 0ustar pbusernogroup00000000000000#include #include const CCSGSettingsWrapperFactoryInterface mockInterface = { CCSGSettingsWrapperFactoryGMock::ccsGSettingsWrapperFactoryNewGSettingsWrapper, CCSGSettingsWrapperFactoryGMock::ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath, CCSGSettingsWrapperFactoryGMock::ccsFreeGSettingsWrapperFactory }; CCSGSettingsWrapperFactory * ccsMockGSettingsWrapperFactoryNew () { CCSGSettingsWrapperFactory *wrapper = (CCSGSettingsWrapperFactory *) calloc (1, sizeof (CCSGSettingsWrapperFactory)); if (!wrapper) return NULL; CCSGSettingsWrapperFactoryGMock *gmockWrapper = new CCSGSettingsWrapperFactoryGMock (wrapper); if (!gmockWrapper) { free (wrapper); return NULL; } ccsObjectInit (wrapper, &ccsDefaultObjectAllocator); ccsObjectAddInterface (wrapper, (const CCSInterface *) &mockInterface, GET_INTERFACE_TYPE (CCSGSettingsWrapperFactoryInterface)); ccsObjectSetPrivate (wrapper, (CCSPrivate *) gmockWrapper); ccsGSettingsWrapperFactoryRef (wrapper); return wrapper; } void ccsMockGSettingsWrapperFactoryFree (CCSGSettingsWrapperFactory *wrapper) { CCSGSettingsWrapperFactoryGMock *gmockWrapper = reinterpret_cast (ccsObjectGetPrivate (wrapper)); delete gmockWrapper; ccsObjectSetPrivate (wrapper, NULL); ccsObjectFinalize (wrapper); free (wrapper); } compiz-0.9.11+14.04.20140409/compizconfig/gsettings/mocks/ccs_gsettings_wrapper_factory_mock.h0000644000015301777760000000607212321343002032621 0ustar pbusernogroup00000000000000/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory_mock.h * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #ifndef _COMPIZCONFIG_CCS_GSETTINGS_WRAPPER_FACTORY_MOCK #define _COMPIZCONFIG_CCS_GSETTINGS_WRAPPER_FACTORY_MOCK #include #include #include CCSGSettingsWrapperFactory * ccsMockGSettingsWrapperFactoryNew (); void ccsMockGSettingsWrapperFactoryFree (CCSGSettingsWrapperFactory *); class CCSGSettingsWrapperFactoryMockInterface { public: virtual ~CCSGSettingsWrapperFactoryMockInterface () {} virtual CCSGSettingsWrapper * newGSettingsWrapper (const gchar *schema, CCSObjectAllocationInterface *ai) = 0; virtual CCSGSettingsWrapper * newGSettingsWrapperWithPath (const gchar *schema, const gchar *path, CCSObjectAllocationInterface *ai) = 0; }; class CCSGSettingsWrapperFactoryGMock : public CCSGSettingsWrapperFactoryMockInterface { public: CCSGSettingsWrapperFactoryGMock (CCSGSettingsWrapperFactory *wrapper) : mWrapper (wrapper) { } MOCK_METHOD2 (newGSettingsWrapper, CCSGSettingsWrapper * (const gchar *schema, CCSObjectAllocationInterface *ai)); MOCK_METHOD3 (newGSettingsWrapperWithPath, CCSGSettingsWrapper * (const gchar *schema, const gchar *path, CCSObjectAllocationInterface *ai)); private: CCSGSettingsWrapperFactory *mWrapper; public: static CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapper (CCSGSettingsWrapperFactory *wrapperFactory, const gchar *schema, CCSObjectAllocationInterface *ai) { return reinterpret_cast (ccsObjectGetPrivate (wrapperFactory))->newGSettingsWrapper (schema, ai); } static CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath (CCSGSettingsWrapperFactory *wrapperFactory, const gchar *schema, const gchar *path, CCSObjectAllocationInterface *ai) { return reinterpret_cast (ccsObjectGetPrivate (wrapperFactory))->newGSettingsWrapperWithPath (schema, path, ai); } static void ccsFreeGSettingsWrapperFactory (CCSGSettingsWrapperFactory *wrapperFactory) { ccsMockGSettingsWrapperFactoryFree (wrapperFactory); } }; #endif compiz-0.9.11+14.04.20140409/compizconfig/gsettings/CMakeLists.txt0000644000015301777760000000406012321343002024730 0ustar pbusernogroup00000000000000project (compizconfig-backend-gsettings) find_package (CompizConfig REQUIRED) include (LibCompizConfigCommon) include (CompizGSettings) set (_deps glib-2.0>=2.20.0 gio-2.0>=2.25.0) if (USE_GCONF) list (APPEND _deps gconf-2.0>=2.31.1) add_definitions (-DUSE_GCONF) endif (USE_GCONF) if (COMPIZ_BUILD_TESTING) add_subdirectory (mocks) endif (COMPIZ_BUILD_TESTING) add_subdirectory (gsettings_backend_shared) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/gsettings_backend_shared ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/gsettings/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/include) set (COMPIZCONFIG_GSETTINGS_BACKEND_LIBRARIES compizconfig_gsettings_backend) compizconfig_backend (gsettings PKGDEPS ${_deps} LIBRARIES ${COMPIZCONFIG_GSETTINGS_BACKEND_LIBRARIES}) find_program (GLIB_COMPILE_SCHEMAS glib-compile-schemas) if (GLIB_COMPILE_SCHEMAS) set (_top_gschema org.compiz) set (_top_gschema_file ${_top_gschema}.gschema.xml) set (_top_gschema_src ${CMAKE_CURRENT_SOURCE_DIR}/${_top_gschema_file}) set (_top_gschema_dest ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/${_top_gschema_file}) set (_top_gschema_inst ${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas/) configure_file (${_top_gschema_src} ${_top_gschema_dest}) add_custom_command ( OUTPUT ${CMAKE_BINARY_DIR}/glib-2.0/schemas/gschemas.compiled COMMAND ${GLIB_COMPILE_SCHEMAS} --targetdir=${CMAKE_BINARY_DIR}/glib-2.0/schemas/ ${CMAKE_BINARY_DIR}/glib-2.0/schemas/ ) add_custom_command (OUTPUT ${_top_gschema_dest} COMMAND cp -r ${_top_gschema_src} ${_top_gschema_dest} DEPENDS ${_top_gschema_src} VERBATIM) add_custom_target (compiz_gsettings_schema DEPENDS ${_top_gschema_dest}) add_gsettings_schema_to_recompilation_list (compiz_gsettings_schema) compiz_install_gsettings_schema (${_top_gschema_dest} ${_top_gschema_inst}) endif (GLIB_COMPILE_SCHEMAS) if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) compiz-0.9.11+14.04.20140409/compizconfig/gsettings/COPYING0000644000015301777760000004312212321343002023225 0ustar pbusernogroup00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. compiz-0.9.11+14.04.20140409/compizconfig/gsettings/src/0000755000015301777760000000000012321344021022761 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/gsettings/src/gsettings.c0000644000015301777760000003301312321343002025132 0ustar pbusernogroup00000000000000/** * * GSettings libccs backend * * gsettings.c * * Copyright (c) 2011 Canonical Ltd * * Based on the original compizconfig-backend-gconf * * Copyright (c) 2007 Danny Baumann * * Parts of this code are taken from libberylsettings * gconf backend, written by: * * Copyright (c) 2006 Robert Carr * Copyright (c) 2007 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #define CCS_LOG_DOMAIN "gsettings" #include "gsettings.h" #include "gsettings_shared.h" #include "ccs_gsettings_backend_interface.h" #include "ccs_gsettings_backend.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_interface_wrapper.h" #include "ccs_gsettings_wrapper_factory_interface.h" #include "ccs_gsettings_wrapper_factory.h" #include "ccs_gnome_integration_gsettings_wrapper_factory.h" #include "ccs_gnome_integration_gsettings_integrated_setting_factory.h" #include "ccs_gnome_integration.h" GVariant * getVariantForCCSSetting (CCSBackend *backend, CCSSetting *setting) { CCSGSettingsWrapper *settings = getSettingsObjectForCCSSetting (backend, setting); if (!settings) return NULL; char *cleanSettingName = getNameForCCSSetting (setting); gchar *pathName = makeSettingPath (ccsGSettingsBackendGetCurrentProfile (backend), setting); GVariant *gsettingsValue = getVariantAtKey (settings, cleanSettingName, pathName, ccsSettingGetType (setting)); free (cleanSettingName); g_free (pathName); return gsettingsValue; } static Bool readIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { return ccsGSettingsBackendReadIntegratedOption (backend, setting, integrated); } Bool readOption (CCSBackend *backend, CCSSetting * setting) { Bool ret = FALSE; GVariant *gsettingsValue = NULL; /* It is impossible for certain settings to have a schema, * such as actions and read only settings, so in that case * just return FALSE since compizconfig doesn't expect us * to read them anyways */ if (!ccsSettingIsReadableByBackend (setting)) return FALSE; gsettingsValue = getVariantForCCSSetting (backend, setting); if (!gsettingsValue) return FALSE; switch (ccsSettingGetType (setting)) { case TypeString: { const char *value; value = readStringFromVariant (gsettingsValue); if (value) { ccsSetString (setting, value, TRUE); ret = TRUE; } } break; case TypeMatch: { const char * value; value = readStringFromVariant (gsettingsValue); if (value) { ccsSetMatch (setting, value, TRUE); ret = TRUE; } } break; case TypeInt: { int value; value = readIntFromVariant (gsettingsValue); ccsSetInt (setting, value, TRUE); ret = TRUE; } break; case TypeBool: { Bool value; value = readBoolFromVariant (gsettingsValue); ccsSetBool (setting, value, TRUE); ret = TRUE; } break; case TypeFloat: { float value; value = readFloatFromVariant (gsettingsValue); ccsSetFloat (setting, value, TRUE); ret = TRUE; } break; case TypeColor: { Bool success = FALSE; CCSSettingColorValue color = readColorFromVariant (gsettingsValue, &success); if (success) { ccsSetColor (setting, color, TRUE); ret = TRUE; } } break; case TypeKey: { Bool success = FALSE; CCSSettingKeyValue key = readKeyFromVariant (gsettingsValue, &success); if (success) { ccsSetKey (setting, key, TRUE); ret = TRUE; } } break; case TypeButton: { Bool success = FALSE; CCSSettingButtonValue button = readButtonFromVariant (gsettingsValue, &success); if (success) { ccsSetButton (setting, button, TRUE); ret = TRUE; } } break; case TypeEdge: { unsigned int edges = readEdgeFromVariant (gsettingsValue); ccsSetEdge (setting, edges, TRUE); ret = TRUE; } break; case TypeBell: { Bool value; value = readBoolFromVariant (gsettingsValue); ccsSetBell (setting, value, TRUE); ret = TRUE; } break; case TypeList: { CCSSettingValueList list = readListValue (gsettingsValue, setting, &ccsDefaultObjectAllocator); if (list) { CCSSettingValueList iter = list; while (iter) { ((CCSSettingValue *) iter->data)->parent = setting; iter = iter->next; } ccsSetList (setting, list, TRUE); ccsSettingValueListFree (list, TRUE); ret = TRUE; } } break; default: ccsWarning ("Attempt to read unsupported setting type %d!", ccsSettingGetType (setting)); break; } g_variant_unref (gsettingsValue); return ret; } static void writeIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { ccsGSettingsBackendWriteIntegratedOption (backend, setting, integrated); } void writeOption (CCSBackend *backend, CCSSetting *setting) { CCSGSettingsWrapper *settings = getSettingsObjectForCCSSetting (backend, setting); char *cleanSettingName = translateKeyForGSettings (ccsSettingGetName (setting)); GVariant *gsettingsValue = NULL; Bool success = FALSE; switch (ccsSettingGetType (setting)) { case TypeString: { const char *value; if (ccsGetString (setting, &value)) { success = writeStringToVariant (value, &gsettingsValue); } } break; case TypeMatch: { const char *value; if (ccsGetMatch (setting, &value)) { success = writeStringToVariant (value, &gsettingsValue); } } break; case TypeFloat: { float value; if (ccsGetFloat (setting, &value)) { success = writeFloatToVariant (value, &gsettingsValue); } } break; case TypeInt: { int value; if (ccsGetInt (setting, &value)) { success = writeIntToVariant (value, &gsettingsValue); } } break; case TypeBool: { Bool value; if (ccsGetBool (setting, &value)) { success = writeBoolToVariant (value, &gsettingsValue); } } break; case TypeColor: { CCSSettingColorValue value; if (!ccsGetColor (setting, &value)) break; success = writeColorToVariant (value, &gsettingsValue); } break; case TypeKey: { CCSSettingKeyValue key; if (!ccsGetKey (setting, &key)) break; success = writeKeyToVariant (key, &gsettingsValue); } break; case TypeButton: { CCSSettingButtonValue button; if (!ccsGetButton (setting, &button)) break; success = writeButtonToVariant (button, &gsettingsValue); } break; case TypeEdge: { unsigned int edges; if (!ccsGetEdge (setting, &edges)) break; success = writeEdgeToVariant (edges, &gsettingsValue); } break; case TypeBell: { Bool value; if (ccsGetBell (setting, &value)) { success = writeBoolToVariant (value, &gsettingsValue); } } break; case TypeList: { CCSSettingValueList list = NULL; if (!ccsGetList (setting, &list)) return; success = writeListValue (list, ccsSettingGetInfo (setting)->forList.listType, &gsettingsValue); } break; default: ccsWarning ("Attempt to write unsupported setting type %d", ccsSettingGetType (setting)); break; } if (success && gsettingsValue) { /* g_settings_set_value will consume the reference * so there is no need to unref value here */ writeVariantToKey (settings, cleanSettingName, gsettingsValue); } free (cleanSettingName); } Bool readInit (CCSBackend *backend, CCSContext * context) { return ccsGSettingsBackendUpdateProfile (backend, context); } void readSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { Bool status; CCSIntegratedSetting *integrated = ccsGSettingsBackendGetIntegratedSetting (backend, setting); if (ccsGetIntegrationEnabled (context) && integrated) { status = readIntegratedOption (backend, setting, integrated); } else status = readOption (backend, setting); if (!status) ccsResetToDefault (setting, TRUE); } Bool writeInit (CCSBackend *backend, CCSContext * context) { return ccsGSettingsBackendUpdateProfile (backend, context); } void writeSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { CCSIntegratedSetting *integrated = ccsGSettingsBackendGetIntegratedSetting (backend, setting); if (ccsGetIntegrationEnabled (context) && integrated) { writeIntegratedOption (backend, setting, integrated); } else if (ccsSettingGetIsDefault (setting)) { resetOptionToDefault (backend, setting); } else writeOption (backend, setting); } static void updateSetting (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) { CCSIntegratedSetting *integrated = ccsGSettingsBackendGetIntegratedSetting (backend, setting); ccsBackendReadInit (backend, context); if (!readOption (backend, setting)) { ccsResetToDefault (setting, TRUE); } if (ccsGetIntegrationEnabled (context) && integrated) { ccsBackendWriteInit (backend, context); ccsGSettingsBackendWriteIntegratedOption (backend, setting, integrated); } } static void processEvents (CCSBackend *backend, unsigned int flags) { if (!(flags & ProcessEventsNoGlibMainLoopMask)) { while (g_main_context_pending(NULL)) g_main_context_iteration(NULL, FALSE); } } static char * getCurrentProfileName (CCSGSettingsWrapper *compizconfigSettings) { GVariant *value; char *ret = NULL; value = ccsGSettingsWrapperGetValue (compizconfigSettings, "current-profile"); if (value) ret = strdup (g_variant_get_string (value, NULL)); else ret = strdup (DEFAULTPROF); g_variant_unref (value); return ret; } static Bool initBackend (CCSBackend *backend, CCSContext * context) { g_type_init (); CCSGSettingsWrapper *compizconfigSettings = ccsGSettingsWrapperNewForSchema (COMPIZCONFIG_SCHEMA_ID, backend->object.object_allocation); char *currentProfile = getCurrentProfileName (compizconfigSettings); char *currentProfilePath = makeCompizProfilePath (currentProfile); CCSGSettingsWrapper *currentProfileSettings = ccsGSettingsWrapperNewForSchemaWithPath (PROFILE_SCHEMA_ID, currentProfilePath, backend->object.object_allocation); CCSGNOMEValueChangeData *valueChangeData = calloc (1, sizeof (CCSGNOMEValueChangeData)); CCSGSettingsWrapperFactory *wrapperFactory = ccsGSettingsWrapperFactoryDefaultImplNew (backend->object.object_allocation); CCSGSettingsWrapperFactory *gnomeWrapperFactory = ccsGNOMEIntegrationGSettingsWrapperFactoryDefaultImplNew (backend->object.object_allocation, wrapperFactory, ccsGSettingsIntegratedSettingsChangeCallback (), valueChangeData); CCSIntegratedSettingsStorage *storage = ccsIntegratedSettingsStorageDefaultImplNew (backend->object.object_allocation); valueChangeData->storage = storage; valueChangeData->context = context; CCSIntegratedSettingFactory *factory = ccsGSettingsIntegratedSettingFactoryNew (gnomeWrapperFactory, valueChangeData, backend->object.object_allocation); valueChangeData->factory = factory; CCSIntegration *integration = ccsGNOMEIntegrationBackendNew (backend, context, factory, storage, backend->object.object_allocation); valueChangeData->integration = integration; g_free (currentProfilePath); /* Drop our reference to the wrapper factory */ ccsGSettingsWrapperFactoryUnref (gnomeWrapperFactory); return ccsGSettingsBackendAttachNewToBackend (backend, context, compizconfigSettings, currentProfileSettings, wrapperFactory, integration, valueChangeData, currentProfile); } static Bool finiBackend (CCSBackend *backend) { ccsGSettingsBackendDetachFromBackend (backend); return TRUE; } static Bool getSettingIsIntegrated (CCSBackend *backend, CCSSetting * setting) { if (!ccsGetIntegrationEnabled (ccsPluginGetContext (ccsSettingGetParent (setting)))) return FALSE; if (!ccsGSettingsBackendGetIntegratedSetting (backend, setting)) return FALSE; return TRUE; } static Bool getSettingIsReadOnly (CCSBackend *backend, CCSSetting * setting) { /* FIXME */ return FALSE; } static const CCSBackendInfo * getInfo (CCSBackend *backend) { return &gsettingsBackendInfo; } static Bool ccsGSettingsWrapDeleteProfile (CCSBackend *backend, CCSContext *context, char *profile) { return deleteProfile (backend, context, profile); } static CCSBackendInterface gsettingsVTable = { getInfo, processEvents, initBackend, finiBackend, readInit, readSetting, 0, writeInit, writeSetting, 0, updateSetting, getSettingIsIntegrated, getSettingIsReadOnly, ccsGSettingsGetExistingProfiles, ccsGSettingsWrapDeleteProfile, ccsGSettingsSetIntegration }; CCSBackendInterface * getBackendInfo (void) { return &gsettingsVTable; } compiz-0.9.11+14.04.20140409/compizconfig/gsettings/src/gsettings.h0000644000015301777760000000233212321343002025137 0ustar pbusernogroup00000000000000/** * * GSettings libccs backend * * gsettings.h * * Copyright (c) 2011 Canonical Ltd * * Based on the original compizconfig-backend-gconf * * Copyright (c) 2007 Danny Baumann * * Parts of this code are taken from libberylsettings * gconf backend, written by: * * Copyright (c) 2006 Robert Carr * Copyright (c) 2007 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #ifndef _COMPIZCONFIG_BACKEND_GSETTINGS_GSETTINGS_H #define _COMPIZCONFIG_BACKEND_GSETTINGS_GSETTINGS_H #include #include #include #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #endif compiz-0.9.11+14.04.20140409/compizconfig/gsettings/README0000644000015301777760000000000012321343002023036 0ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/tests/0000755000015301777760000000000012321344021021325 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_list_wrapper.cpp0000644000015301777760000000573512321343002030153 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include namespace cci = compiz::config::impl; namespace cc = compiz::config; namespace compiz { namespace config { namespace impl { class PrivateSettingValueListWrapper { public: PrivateSettingValueListWrapper (CCSSettingValueList list, cci::ListStorageType storageType, CCSSettingType type, const boost::shared_ptr &settingReference) : mType (type), mSettingReference (settingReference), mListWrapper (list, ccsSettingValueListFree, ccsSettingValueListAppend, ccsSettingValueListRemove, storageType) { } CCSSettingType mType; boost::shared_ptr mSettingReference; SettingValueListWrapper::InternalWrapperImpl mListWrapper; }; } } } cci::SettingValueListWrapper::SettingValueListWrapper (CCSSettingValueList list, cci::ListStorageType storageType, CCSSettingType type, const boost::shared_ptr &settingReference) : priv (new cci::PrivateSettingValueListWrapper (list, storageType, type, settingReference)) { } CCSSettingType cci::SettingValueListWrapper::type () { return priv->mType; } cci::SettingValueListWrapper::InternalWrapper & cci::SettingValueListWrapper::append (CCSSettingValue * const &value) { return priv->mListWrapper.append (value); } cci::SettingValueListWrapper::InternalWrapper & cci::SettingValueListWrapper::remove (CCSSettingValue * const &value) { return priv->mListWrapper.remove (value); } cci::SettingValueListWrapper::operator const CCSSettingValueList & () const { return priv->mListWrapper; } cci::SettingValueListWrapper::operator CCSSettingValueList & () { return priv->mListWrapper; } const boost::shared_ptr & cci::SettingValueListWrapper::setting () { return priv->mSettingReference; } compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_item_in_list_matcher.h0000644000015301777760000000523712321343002031264 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_ITEM_IN_LIST_MATCHER_H #define _COMPIZCONFIG_CCS_ITEM_IN_LIST_MATCHER_H #include #include #include using ::testing::Matcher; using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::MakeMatcher; template class ItemInCCSListMatcher : public ::testing::MatcherInterface { public: ItemInCCSListMatcher (const Matcher &matcher) : mMatcher (matcher) { } virtual ~ItemInCCSListMatcher() {} virtual bool MatchAndExplain (L list, MatchResultListener *listener) const { L iter = list; while (iter) { const I &i = *(reinterpret_cast (iter->data)); if (mMatcher.MatchAndExplain (i, listener)) return true; iter = iter->next; } return false; } virtual void DescribeTo (std::ostream *os) const { *os << "found in list ("; mMatcher.DescribeTo (os); *os << ")"; } virtual void DescribeNegationTo (std::ostream *os) const { *os << "not found in list ("; mMatcher.DescribeNegationTo (os); *os << ")"; } private: Matcher mMatcher; }; template Matcher IsItemInCCSList (const Matcher &matcher) { return MakeMatcher (new ItemInCCSListMatcher (matcher)); } typedef struct _CCSString CCSString; typedef struct _CCSStringList * CCSStringList; typedef struct _CCSSettingValue CCSSettingValue; typedef struct _CCSSettingValueList * CCSSettingValueList; /* A workaround for templates inside of macros not * expanding correctly */ Matcher IsStringItemInStringCCSList (const Matcher &matcher); Matcher IsSettingValueInSettingValueCCSList (const Matcher &matcher); #endif compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_setting_value_operators.h0000644000015301777760000000505012321343002032042 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_SETTING_VALUE_OPERATORS_H #define _COMPIZCONFIG_CCS_SETTING_VALUE_OPERATORS_H #include #include typedef struct _CCSSettingValueList * CCSSettingValueList; typedef union _CCSSettingColorValue CCSSettingColorValue; typedef struct _CCSSettingKeyValue CCSSettingKeyValue; typedef struct _CCSSettingButtonValue CCSSettingButtonValue; typedef struct _CCSString CCSString; bool operator== (const CCSSettingColorValue &lhs, const CCSSettingColorValue &rhs); std::ostream & operator<< (std::ostream &os, const CCSSettingColorValue &v); bool operator== (const CCSSettingKeyValue &lhs, const CCSSettingKeyValue &rhs); std::ostream & operator<< (std::ostream &os, const CCSSettingKeyValue &v); bool operator== (const CCSSettingButtonValue &lhs, const CCSSettingButtonValue &rhs); std::ostream & operator<< (std::ostream &os, const CCSSettingButtonValue &v); bool operator== (const CCSString &lhs, const std::string &rhs); bool operator== (const std::string &lhs, const CCSString &rhs); bool operator== (const std::string &rhs, CCSString *lhs); std::ostream & operator<< (std::ostream &os, CCSString &string); namespace compiz { namespace config { namespace test { std::ostream & DescribeSettingValueTo (std::ostream &os, CCSSettingType type, const CCSSettingValue &value); std::ostream & DescribeSettingListTo (std::ostream &os, CCSSettingType type, CCSSettingValueList list); } } } std::ostream & operator<< (std::ostream &os, const CCSSettingValue &v); std::ostream & operator<< (std::ostream &os, CCSSettingValueList l); #endif compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_list_equality.h0000644000015301777760000000351612321343002027770 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_LIST_EQUALITY_H #define _COMPIZCONFIG_CCS_LIST_EQUALITY_H #include #include #include #include using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::Matcher; typedef struct _CCSSettingValueList * CCSSettingValueList; typedef struct _CCSSettingListInfo CCSSettingListInfo; class PrivateListEqualityMatcher; class ListEqualityMatcher : public MatcherInterface { public: ListEqualityMatcher (CCSSettingListInfo *info, CCSSettingValueList cmp); virtual bool MatchAndExplain (CCSSettingValueList x, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; virtual void DescribeNegationTo (std::ostream *os) const; private: std::auto_ptr priv; }; Matcher ListEqual (CCSSettingListInfo *info, CCSSettingValueList cmp); #endif compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_setting_value_matcher.cpp0000644000015301777760000000403712321343002032006 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_setting_value_matcher.h" #include "compizconfig_ccs_setting_value_operators.h" namespace cct = compiz::config::test; CCSSettingValueMatcher::CCSSettingValueMatcher (const CCSSettingValue &match, CCSSettingType type, CCSSettingInfo *info) : mMatch (match), mType (type), mInfo (info) { } bool CCSSettingValueMatcher::MatchAndExplain (CCSSettingValue x, MatchResultListener *listener) const { if (ccsCheckValueEq (&x, mType, mInfo, &mMatch, mType, mInfo)) return true; return false; } void CCSSettingValueMatcher::DescribeTo (std::ostream *os) const { *os << "Value Matches "; cct::DescribeSettingValueTo (*os, mType, mMatch); } void CCSSettingValueMatcher::DescribeNegationTo (std::ostream *os) const { *os << "Value does not Match "; cct::DescribeSettingValueTo (*os, mType, mMatch); } Matcher SettingValueMatch (const CCSSettingValue &match, CCSSettingType type, CCSSettingInfo *info) { return MakeMatcher (new CCSSettingValueMatcher (match, type, info)); } compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_backend_concept_test.h0000644000015301777760000011362712321343002030416 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_BACKEND_CONCEPT_TEST #define _COMPIZCONFIG_CCS_BACKEND_CONCEPT_TEST #ifdef __clang__ #include #if BOOST_VERSION < 104700 #error "Boost 1.47 or later is required (http://clang.llvm.org/compatibility.html#deleted-special-func)" #endif /* Work around a bug in clang which marks functions used by * uninstantiated templates as unused */ #define COMPIZ_TEMPLATE_EXPECTATION_CHECK COMPIZ_TEMPLATE_EXPECTATION_CHECK #else #define COMPIZ_TEMPLATE_EXPECTATION_CHECK #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gtest_shared_characterwrapper.h" #include "gtest_unspecified_bool_type_matcher.h" #include "compizconfig_test_value_combiners.h" #include "compizconfig_ccs_setting_value_operators.h" #include "compizconfig_ccs_item_in_list_matcher.h" #include "compizconfig_ccs_list_equality.h" #include "compizconfig_ccs_list_wrapper.h" #include "compizconfig_ccs_variant_types.h" #include "compizconfig_backend_concept_test_internal.h" #include "compizconfig_backend_concept_test_environment_interface.h" namespace cci = compiz::config::impl; namespace cc = compiz::config; class CCSBackendConceptTestEnvironmentFactoryInterface { public: typedef boost::shared_ptr Ptr; virtual ~CCSBackendConceptTestEnvironmentFactoryInterface () {} virtual CCSBackendConceptTestEnvironmentInterface::Ptr ConstructTestEnv () = 0; }; template class CCSBackendConceptTestEnvironmentFactory : public CCSBackendConceptTestEnvironmentFactoryInterface { public: CCSBackendConceptTestEnvironmentInterface::Ptr ConstructTestEnv () { return boost::make_shared (); } }; namespace compizconfig { namespace test { typedef boost::function WriteFunc; typedef boost::function ConstructorFunc; cci::SettingValueListWrapper::Ptr CCSListConstructionExpectationsSetter (const ConstructorFunc &c, CCSSettingType type, cci::ListStorageType storageType); CCSSettingGMock * getSettingGMockFromSetting (const boost::shared_ptr &setting); void SetIntWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetBoolWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetFloatWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetStringWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetColorWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetKeyWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetButtonWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetEdgeWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetBellWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetMatchWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetListWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetIntReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetBoolReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetBellReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetFloatReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetStringReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetMatchReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetColorReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetKeyReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetButtonReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetEdgeReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetListReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); } } using ::testing::AtLeast; using ::testing::DoAll; using ::testing::Eq; using ::testing::IsNull; using ::testing::MakeMatcher; using ::testing::Matcher; using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::NiceMock; using ::testing::NotNull; using ::testing::Return; using ::testing::ReturnNull; using ::testing::SetArgPointee; namespace cci = compiz::config::impl; namespace cc = compiz::config; typedef boost::variant VariantTypes; class CCSBackendConceptTestParamInterface { public: virtual ~CCSBackendConceptTestParamInterface () {} typedef boost::shared_ptr Ptr; typedef void (CCSBackendConceptTestEnvironmentInterface::*NativeWriteMethod) (const std::string &plugin, const std::string &keyname, const VariantTypes &value); typedef boost::function SetReadExpectation; typedef boost::function &, const compizconfig::test::WriteFunc &, const CCSBackendConceptTestEnvironmentInterface::Ptr &)> SetWriteExpectation; virtual void BackendTearDown (CCSBackend *) = 0; virtual CCSBackendConceptTestEnvironmentInterface::Ptr testEnv () = 0; virtual VariantTypes & value () = 0; virtual void nativeWrite (const CCSBackendConceptTestEnvironmentInterface::Ptr &iface, const std::string &plugin, const std::string &keyname, const VariantTypes &value) = 0; virtual CCSSettingType & type () = 0; virtual std::string & keyname () = 0; virtual SetWriteExpectation & setWriteExpectationAndWrite () = 0; virtual SetReadExpectation & setReadExpectation () = 0; virtual std::string & what () = 0; }; template class CCSBackendConceptTestParam : public CCSBackendConceptTestParamInterface { public: virtual ~CCSBackendConceptTestParam () {} typedef boost::shared_ptr > Ptr; CCSBackendConceptTestParam (CCSBackendConceptTestEnvironmentFactoryInterface *testEnvFactory, const VariantTypes &value, const NativeWriteMethod &write, const CCSSettingType &type, const std::string &keyname, const SetReadExpectation &setReadExpectation, const SetWriteExpectation &setWriteExpectation, const std::string &what) : mTestEnvFactory (testEnvFactory), mTestEnv (), mValue (value), mNativeWrite (write), mType (type), mKeyname (keyname), mSetReadExpectation (setReadExpectation), mSetWriteExpectation (setWriteExpectation), mWhat (what) { } void BackendTearDown (CCSBackend *b) { if (mTestEnv) mTestEnv->BackendTearDown (b); mTestEnv.reset (); } CCSBackendConceptTestEnvironmentInterface::Ptr testEnv () { if (!mTestEnv) mTestEnv = mTestEnvFactory->ConstructTestEnv (); return mTestEnv; } VariantTypes & value () { return mValue; } void nativeWrite (const CCSBackendConceptTestEnvironmentInterface::Ptr & iface, const std::string &plugin, const std::string &keyname, const VariantTypes &value) { return ((iface.get ())->*mNativeWrite) (plugin, keyname, value); } CCSSettingType & type () { return mType; } std::string & keyname () { return mKeyname; } CCSBackendConceptTestParamInterface::SetReadExpectation & setReadExpectation () { return mSetReadExpectation; } CCSBackendConceptTestParamInterface::SetWriteExpectation & setWriteExpectationAndWrite () { return mSetWriteExpectation; } std::string & what () { return mWhat; } private: CCSBackendConceptTestEnvironmentFactoryInterface *mTestEnvFactory; CCSBackendConceptTestEnvironmentInterface::Ptr mTestEnv; VariantTypes mValue; NativeWriteMethod mNativeWrite; CCSSettingType mType; std::string mKeyname; SetReadExpectation mSetReadExpectation; SetWriteExpectation mSetWriteExpectation; std::string mWhat; }; class CCSBackendConformanceSpawnObjectsTestFixtureBase { protected: CCSBackendConformanceSpawnObjectsTestFixtureBase () : profileName ("mock") { } virtual ~CCSBackendConformanceSpawnObjectsTestFixtureBase () { } /* Having the returned context, setting and plugin * as out params is awkward, but GTest doesn't let * you use ASSERT_* unless the function returns void */ void SpawnContext (boost::shared_ptr &context) { context.reset (ccsMockContextNew (), boost::bind (ccsFreeMockContext, _1)); } void SpawnPlugin (const std::string &name, const boost::shared_ptr &context, boost::shared_ptr &plugin) { plugin.reset (ccsMockPluginNew (), boost::bind (ccsFreeMockPlugin, _1)); CCSPluginGMock *gmockPlugin = (CCSPluginGMock *) ccsObjectGetPrivate (plugin.get ()); ASSERT_FALSE (name.empty ()); ASSERT_THAT (context.get (), NotNull ()); ON_CALL (*gmockPlugin, getName ()).WillByDefault (Return ((char *) name.c_str ())); ON_CALL (*gmockPlugin, getContext ()).WillByDefault (Return (context.get ())); } void SpawnSetting (const std::string &name, CCSSettingType type, const boost::shared_ptr &plugin, boost::shared_ptr &setting) { setting.reset (ccsMockSettingNew (), boost::bind (ccsFreeMockSetting, _1)); mSpawnedSettingInfo.push_back (CCSSettingInfo ()); CCSSettingGMock *gmockSetting = (CCSSettingGMock *) ccsObjectGetPrivate (setting.get ()); ASSERT_FALSE (name.empty ()); ASSERT_NE (type, TypeNum); ASSERT_THAT (plugin.get (), NotNull ()); ON_CALL (*gmockSetting, getName ()).WillByDefault (Return ((char *) name.c_str ())); ON_CALL (*gmockSetting, getType ()).WillByDefault (Return (type)); ON_CALL (*gmockSetting, getParent ()).WillByDefault (Return (plugin.get ())); ON_CALL (*gmockSetting, getInfo ()).WillByDefault (Return (&(mSpawnedSettingInfo.back ()))); } void SetupContext () { SpawnContext (context); gmockContext = (CCSContextGMock *) ccsObjectGetPrivate (context.get ()); ON_CALL (*gmockContext, getProfile ()).WillByDefault (Return (profileName.c_str ())); } CCSBackend * GetBackend () { return mBackend; } boost::shared_ptr context; CCSContextGMock *gmockContext; CCSBackend *mBackend; private: std::vector mSpawnedSettingInfo; std::string profileName; }; class CCSBackendConformanceTestParameterizedByBackendFixture : public CCSBackendConformanceSpawnObjectsTestFixtureBase, public ::testing::TestWithParam { public: CCSBackendConformanceTestParameterizedByBackendFixture () : mTestEnv (GetParam ()->ConstructTestEnv ()) { } virtual void SetUp () { SetupContext (); mBackend = mTestEnv->BackendSetUp (context.get (), gmockContext); } virtual void TearDown () { if (mTestEnv) mTestEnv->BackendTearDown (mBackend); mTestEnv.reset (); } protected: CCSBackendConceptTestEnvironmentInterface::Ptr mTestEnv; }; class CCSBackendConformanceTestParameterized : public CCSBackendConformanceSpawnObjectsTestFixtureBase, public ::testing::TestWithParam { public: virtual ~CCSBackendConformanceTestParameterized () {} virtual void SetUp () { SetupContext (); mBackend = GetParam ()->testEnv ()->BackendSetUp (context.get (), gmockContext); } virtual void TearDown () { CCSBackendConformanceTestParameterized::GetParam ()->BackendTearDown (mBackend); } }; namespace compizconfig { namespace test { namespace list_populators = impl::populators::list; typedef boost::function ConstructorFunc; cci::SettingValueListWrapper::Ptr CCSListConstructionExpectationsSetter (const ConstructorFunc &c, CCSSettingType type, cci::ListStorageType storageType); template ::testing::internal::ParamGenerator GenerateTestingParametersForBackendInterface () { static CCSBackendConceptTestEnvironmentFactory interfaceFactory; static CCSBackendConceptTestEnvironmentFactoryInterface *backendEnvFactory = &interfaceFactory; typedef CCSBackendConceptTestParam ConceptParam; static typename CCSBackendConceptTestParamInterface::Ptr testParam[] = { boost::make_shared (backendEnvFactory, VariantTypes (1), &CCSBackendConceptTestEnvironmentInterface::WriteIntegerAtKey, TypeInt, "integer_setting", boost::bind (SetIntReadExpectation, _1, _2), boost::bind (SetIntWriteExpectation, _1, _2, _3, _4, _5, _6), "TestInt"), boost::make_shared (backendEnvFactory, VariantTypes (true), &CCSBackendConceptTestEnvironmentInterface::WriteBoolAtKey, TypeBool, "boolean_setting", boost::bind (SetBoolReadExpectation, _1, _2), boost::bind (SetBoolWriteExpectation, _1, _2, _3, _4, _5, _6), "TestBool"), boost::make_shared (backendEnvFactory, VariantTypes (static_cast (3.0)), &CCSBackendConceptTestEnvironmentInterface::WriteFloatAtKey, TypeFloat, "float_setting", boost::bind (SetFloatReadExpectation, _1, _2), boost::bind (SetFloatWriteExpectation, _1, _2, _3, _4, _5, _6), "TestFloat"), boost::make_shared (backendEnvFactory, VariantTypes (static_cast ("foo")), &CCSBackendConceptTestEnvironmentInterface::WriteStringAtKey, TypeString, "string_setting", boost::bind (SetStringReadExpectation, _1, _2), boost::bind (SetStringWriteExpectation, _1, _2, _3, _4, _5, _6), "TestString"), boost::make_shared (backendEnvFactory, VariantTypes (static_cast ("foo=bar")), &CCSBackendConceptTestEnvironmentInterface::WriteMatchAtKey, TypeMatch, "match_setting", boost::bind (SetMatchReadExpectation, _1, _2), boost::bind (SetMatchWriteExpectation, _1, _2, _3, _4, _5, _6), "TestMatch"), boost::make_shared (backendEnvFactory, VariantTypes (true), &CCSBackendConceptTestEnvironmentInterface::WriteBellAtKey, TypeBell, "bell_setting", boost::bind (SetBellReadExpectation, _1, _2), boost::bind (SetBellWriteExpectation, _1, _2, _3, _4, _5, _6), "TestBell"), boost::make_shared (backendEnvFactory, VariantTypes (impl::getColorValueList ()[0]), &CCSBackendConceptTestEnvironmentInterface::WriteColorAtKey, TypeColor, "color_setting", boost::bind (SetColorReadExpectation, _1, _2), boost::bind (SetColorWriteExpectation, _1, _2, _3, _4, _5, _6), "TestColor"), boost::make_shared (backendEnvFactory, VariantTypes (impl::keyValue), &CCSBackendConceptTestEnvironmentInterface::WriteKeyAtKey, TypeKey, "key_setting", boost::bind (SetKeyReadExpectation, _1, _2), boost::bind (SetKeyWriteExpectation, _1, _2, _3, _4, _5, _6), "TestKey"), boost::make_shared (backendEnvFactory, VariantTypes (impl::buttonValue), &CCSBackendConceptTestEnvironmentInterface::WriteButtonAtKey, TypeButton, "button_setting", boost::bind (SetButtonReadExpectation, _1, _2), boost::bind (SetButtonWriteExpectation, _1, _2, _3, _4, _5, _6), "TestButton"), boost::make_shared (backendEnvFactory, VariantTypes (static_cast (1)), &CCSBackendConceptTestEnvironmentInterface::WriteEdgeAtKey, TypeEdge, "edge_setting", boost::bind (SetEdgeReadExpectation, _1, _2), boost::bind (SetEdgeWriteExpectation, _1, _2, _3, _4, _5, _6), "TestEdge"), boost::make_shared (backendEnvFactory, VariantTypes (CCSListConstructionExpectationsSetter (boost::bind (list_populators::integer, _1), TypeInt, cci::Deep)), &CCSBackendConceptTestEnvironmentInterface::WriteListAtKey, TypeList, "int_list_setting", boost::bind (SetListReadExpectation, _1, _2), boost::bind (SetListWriteExpectation, _1, _2, _3, _4, _5, _6), "TestListInt"), boost::make_shared (backendEnvFactory, VariantTypes (CCSListConstructionExpectationsSetter (boost::bind (list_populators::doubleprecision, _1), TypeFloat, cci::Deep)), &CCSBackendConceptTestEnvironmentInterface::WriteListAtKey, TypeList, "float_list_setting", boost::bind (SetListReadExpectation, _1, _2), boost::bind (SetListWriteExpectation, _1, _2, _3, _4, _5, _6), "TestListFloat"), boost::make_shared (backendEnvFactory, VariantTypes (CCSListConstructionExpectationsSetter (boost::bind (list_populators::boolean, _1), TypeBool, cci::Deep)), &CCSBackendConceptTestEnvironmentInterface::WriteListAtKey, TypeList, "bool_list_setting", boost::bind (SetListReadExpectation, _1, _2), boost::bind (SetListWriteExpectation, _1, _2, _3, _4, _5, _6), "TestListBool"), boost::make_shared (backendEnvFactory, VariantTypes (CCSListConstructionExpectationsSetter (boost::bind (list_populators::string, _1), TypeString, cci::Deep)), &CCSBackendConceptTestEnvironmentInterface::WriteListAtKey, TypeList, "string_list_setting", boost::bind (SetListReadExpectation, _1, _2), boost::bind (SetListWriteExpectation, _1, _2, _3, _4, _5, _6), "TestListString"), boost::make_shared (backendEnvFactory, VariantTypes (CCSListConstructionExpectationsSetter (boost::bind (list_populators::match, _1), TypeMatch, cci::Deep)), &CCSBackendConceptTestEnvironmentInterface::WriteListAtKey, TypeList, "match_list_setting", boost::bind (SetListReadExpectation, _1, _2), boost::bind (SetListWriteExpectation, _1, _2, _3, _4, _5, _6), "TestListMatch"), boost::make_shared (backendEnvFactory, VariantTypes (CCSListConstructionExpectationsSetter (boost::bind (list_populators::color, _1), TypeColor, cci::Deep)), &CCSBackendConceptTestEnvironmentInterface::WriteListAtKey, TypeList, "color_list_setting", boost::bind (SetListReadExpectation, _1, _2), boost::bind (SetListWriteExpectation, _1, _2, _3, _4, _5, _6), "TestListColor") }; return ::testing::ValuesIn (testParam); } template ::testing::internal::ParamGenerator GenerateTestingEnvFactoryBackendInterface () { boost::shared_ptr f (boost::make_shared > ()); return ::testing::Values (f); } } } class CCSBackendConformanceTestReadWrite : public CCSBackendConformanceTestParameterized { public: virtual ~CCSBackendConformanceTestReadWrite () {} virtual void SetUp () { CCSBackendConformanceTestParameterized::SetUp (); pluginName = "mock"; settingName = GetParam ()->keyname (); VALUE = GetParam ()->value (); CCSBackendConformanceTestParameterized::SpawnPlugin (pluginName, context, plugin); CCSBackendConformanceTestParameterized::SpawnSetting (settingName, GetParam ()->type (), plugin, setting); gmockPlugin = (CCSPluginGMock *) ccsObjectGetPrivate (plugin.get ()); gmockSetting = (CCSSettingGMock *) ccsObjectGetPrivate (setting.get ()); } virtual void TearDown () { CCSBackendConformanceTestParameterized::TearDown (); } protected: std::string pluginName; std::string settingName; VariantTypes VALUE; boost::shared_ptr plugin; boost::shared_ptr setting; CCSPluginGMock *gmockPlugin; CCSSettingGMock *gmockSetting; }; TEST_P (CCSBackendConformanceTestReadWrite, TestReadValue) { SCOPED_TRACE (CCSBackendConformanceTestParameterized::GetParam ()->what () + "Read"); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PreRead (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->nativeWrite (CCSBackendConformanceTestParameterized::GetParam ()->testEnv (), pluginName, settingName, VALUE); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PostRead (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->setReadExpectation () (gmockSetting, VALUE); ccsBackendReadSetting (CCSBackendConformanceTestParameterized::GetBackend (), context.get (), setting.get ()); } TEST_P (CCSBackendConformanceTestReadWrite, TestUpdateMockedValue) { SCOPED_TRACE (CCSBackendConformanceTestParameterized::GetParam ()->what () + "UpdateMocked"); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PreUpdate (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->nativeWrite (CCSBackendConformanceTestParameterized::GetParam ()->testEnv (), pluginName, settingName, VALUE); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PostUpdate (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->setReadExpectation () (gmockSetting, VALUE); ccsBackendUpdateSetting (CCSBackendConformanceTestParameterized::GetBackend (), context.get (), plugin.get (), setting.get ()); } TEST_P (CCSBackendConformanceTestReadWrite, TestUpdateKeyedValue) { SCOPED_TRACE (CCSBackendConformanceTestParameterized::GetParam ()->what () + "UpdateKeyed"); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PreUpdate (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->nativeWrite (CCSBackendConformanceTestParameterized::GetParam ()->testEnv (), pluginName, settingName, VALUE); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PostUpdate (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->setReadExpectation () (gmockSetting, VALUE); EXPECT_CALL (*gmockContext, findPlugin (_)).WillOnce (Return (plugin.get ())); EXPECT_CALL (*gmockPlugin, findSetting (_)).WillOnce (Return (setting.get ())); EXPECT_TRUE (CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->UpdateSettingAtKey (pluginName, settingName)); } TEST_P (CCSBackendConformanceTestReadWrite, TestWriteValue) { SCOPED_TRACE (CCSBackendConformanceTestParameterized::GetParam ()->what () + "Write"); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PreWrite (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->setWriteExpectationAndWrite () (pluginName, settingName, VALUE, setting, boost::bind (ccsBackendWriteSetting, CCSBackendConformanceTestParameterized::GetBackend (), context.get (), setting.get ()), GetParam ()->testEnv ()); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PostWrite (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); } class CCSBackendConformanceTestInfo : public CCSBackendConformanceTestParameterizedByBackendFixture { }; TEST_P (CCSBackendConformanceTestInfo, TestGetInfo) { const CCSBackendInfo *knownBackendInfo = mTestEnv->GetInfo (); const CCSBackendInfo *retreivedBackendInfo = ccsBackendGetInfo (GetBackend ()); EXPECT_THAT (retreivedBackendInfo->name, Eq (knownBackendInfo->name)); EXPECT_THAT (retreivedBackendInfo->shortDesc, Eq (knownBackendInfo->shortDesc)); EXPECT_THAT (retreivedBackendInfo->longDesc, Eq (knownBackendInfo->longDesc)); if (knownBackendInfo->profileSupport) EXPECT_TRUE (retreivedBackendInfo->profileSupport); else EXPECT_FALSE (retreivedBackendInfo->profileSupport); if (knownBackendInfo->integrationSupport) EXPECT_TRUE (retreivedBackendInfo->integrationSupport); else EXPECT_FALSE (retreivedBackendInfo->integrationSupport); } class CCSBackendConformanceTestInitFiniFuncs : public CCSBackendConformanceTestParameterizedByBackendFixture { }; TEST_P (CCSBackendConformanceTestInitFiniFuncs, TestReadInit) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->readInit) { mTestEnv->SetReadInitExpectation (context.get (), gmockContext); ccsBackendReadInit (backend, context.get ()); } } TEST_P (CCSBackendConformanceTestInitFiniFuncs, TestReadDone) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->readDone) { mTestEnv->SetReadDoneExpectation (context.get (), gmockContext); ccsBackendReadDone (backend, context.get ()); } } TEST_P (CCSBackendConformanceTestInitFiniFuncs, TestWriteInit) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->writeInit) { mTestEnv->SetWriteInitExpectation (context.get (), gmockContext); ccsBackendWriteInit (backend, context.get ()); } } TEST_P (CCSBackendConformanceTestInitFiniFuncs, TestWriteDone) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->writeDone) { mTestEnv->SetWriteDoneExpectation (context.get (), gmockContext); ccsBackendWriteDone (backend, context.get ()); } } class CCSBackendConformanceTestProfileHandling : public CCSBackendConformanceTestParameterizedByBackendFixture { public: static const std::string PROFILE_MOCK; static const std::string PROFILE_DEFAULT; static const std::string PROFILE_FOO; static const std::string PROFILE_BAR; static const std::string PROFILE_BAZ; }; const std::string CCSBackendConformanceTestProfileHandling::PROFILE_MOCK ("mock"); const std::string CCSBackendConformanceTestProfileHandling::PROFILE_DEFAULT ("Default"); const std::string CCSBackendConformanceTestProfileHandling::PROFILE_FOO ("foo"); const std::string CCSBackendConformanceTestProfileHandling::PROFILE_BAR ("bar"); const std::string CCSBackendConformanceTestProfileHandling::PROFILE_BAZ ("baz"); TEST_P (CCSBackendConformanceTestProfileHandling, TestGetExistingProfiles) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->getExistingProfiles) { mTestEnv->AddProfile (PROFILE_FOO); mTestEnv->AddProfile (PROFILE_BAR); mTestEnv->SetGetExistingProfilesExpectation (context.get (), gmockContext); boost::shared_ptr <_CCSStringList> existingProfiles (ccsBackendGetExistingProfiles (backend, context.get ()), boost::bind (ccsStringListFree, _1, TRUE)); ASSERT_EQ (ccsStringListLength (existingProfiles.get ()), 4); /* Default profile must always be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_DEFAULT))); /* Current profile should also be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_MOCK))); EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_FOO))); EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_BAR))); EXPECT_THAT (existingProfiles.get (), Not (IsStringItemInStringCCSList (Eq (PROFILE_BAZ)))); } } TEST_P (CCSBackendConformanceTestProfileHandling, TestDeleteNonCurrentProfile) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->getExistingProfiles) { mTestEnv->AddProfile (PROFILE_FOO); mTestEnv->AddProfile (PROFILE_BAR); CharacterWrapper PROFILE_BAR_CHAR (strdup (PROFILE_BAR.c_str ())); mTestEnv->SetDeleteProfileExpectation (PROFILE_BAR, context.get (), gmockContext); EXPECT_TRUE (ccsBackendDeleteProfile (backend, context.get (), PROFILE_BAR_CHAR)); /* Check to make sure that the profile is no longer there */ mTestEnv->SetGetExistingProfilesExpectation (context.get (), gmockContext); boost::shared_ptr <_CCSStringList> existingProfiles (ccsBackendGetExistingProfiles (backend, context.get ()), boost::bind (ccsStringListFree, _1, TRUE)); ASSERT_EQ (ccsStringListLength (existingProfiles.get ()), 3); /* Default profile must always be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_DEFAULT))); /* Current profile should also be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_MOCK))); EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_FOO))); /* PROFILE_BAR was deleted */ EXPECT_THAT (existingProfiles.get (), Not (IsStringItemInStringCCSList (Eq (PROFILE_BAR)))); EXPECT_THAT (existingProfiles.get (), Not (IsStringItemInStringCCSList (Eq (PROFILE_BAZ)))); } } TEST_P (CCSBackendConformanceTestProfileHandling, TestDeleteNonExistantCurrentProfile) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->getExistingProfiles) { mTestEnv->AddProfile (PROFILE_FOO); mTestEnv->AddProfile (PROFILE_BAR); CharacterWrapper PROFILE_BAZ_CHAR (strdup (PROFILE_BAZ.c_str ())); mTestEnv->SetDeleteProfileExpectation (PROFILE_BAZ, context.get (), gmockContext); EXPECT_FALSE (ccsBackendDeleteProfile (backend, context.get (), PROFILE_BAZ_CHAR)); /* Check to make sure that the profile is no longer there */ mTestEnv->SetGetExistingProfilesExpectation (context.get (), gmockContext); boost::shared_ptr <_CCSStringList> existingProfiles (ccsBackendGetExistingProfiles (backend, context.get ()), boost::bind (ccsStringListFree, _1, TRUE)); ASSERT_EQ (ccsStringListLength (existingProfiles.get ()), 4); /* Default profile must always be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_DEFAULT))); /* Current profile should also be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_MOCK))); EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_FOO))); EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_BAR))); EXPECT_THAT (existingProfiles.get (), Not (IsStringItemInStringCCSList (Eq (PROFILE_BAZ)))); } } TEST_P (CCSBackendConformanceTestProfileHandling, TestDeleteCurrentProfile) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->getExistingProfiles) { mTestEnv->AddProfile (PROFILE_FOO); mTestEnv->AddProfile (PROFILE_BAR); CharacterWrapper PROFILE_BAR_CHAR (strdup (PROFILE_BAR.c_str ())); /* Make sure that backends know what profile is being deleted */ ON_CALL (*gmockContext, getProfile ()).WillByDefault (Return (PROFILE_BAR.c_str ())); mTestEnv->SetDeleteProfileExpectation (PROFILE_BAR, context.get (), gmockContext); /* Before deleting the profile, getProfile can no longer refer to it */ ON_CALL (*gmockContext, getProfile ()).WillByDefault (Return (PROFILE_FOO.c_str ())); EXPECT_TRUE (ccsBackendDeleteProfile (backend, context.get (), PROFILE_BAR_CHAR)); /* Check to make sure that the profile is no longer there */ mTestEnv->SetGetExistingProfilesExpectation (context.get (), gmockContext); boost::shared_ptr <_CCSStringList> existingProfiles (ccsBackendGetExistingProfiles (backend, context.get ()), boost::bind (ccsStringListFree, _1, TRUE)); ASSERT_EQ (ccsStringListLength (existingProfiles.get ()), 2); /* Default profile must always be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_DEFAULT))); /* Old current profile shouldn't be there */ EXPECT_THAT (existingProfiles.get (), Not (IsStringItemInStringCCSList (Eq (PROFILE_BAR)))); /* New current profile should be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_FOO))); EXPECT_THAT (existingProfiles.get (), Not (IsStringItemInStringCCSList (Eq (PROFILE_BAZ)))); } } #endif compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_backend_concept_test_internal.h0000644000015301777760000002143712321343002032307 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_BACKEND_CONCEPT_TEST_INTERNAL_H #define _COMPIZCONFIG_CCS_BACKEND_CONCEPT_TEST_INTERNAL_H #include #include #include #include #include #include #include #include "gtest_shared_characterwrapper.h" #include "compizconfig_test_value_combiners.h" #include "compizconfig_ccs_setting_value_operators.h" #include "compizconfig_ccs_item_in_list_matcher.h" #include "compizconfig_ccs_list_equality.h" #include "compizconfig_ccs_list_wrapper.h" #include "compizconfig_ccs_variant_types.h" #include "compizconfig_ccs_settings_test_fixture.h" namespace cci = compiz::config::impl; namespace cc = compiz::config; class CCSBackendConceptTestEnvironmentInterface; class CCSSettingGMock; namespace compizconfig { namespace test { typedef boost::function WriteFunc; typedef boost::function ConstructorFunc; cci::SettingValueListWrapper::Ptr CCSListConstructionExpectationsSetter (const ConstructorFunc &c, CCSSettingType type, cci::ListStorageType storageType); Bool boolToBool (bool v); CCSSettingGMock * getSettingGMockFromSetting (const boost::shared_ptr &setting); void SetIntWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetBoolWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetFloatWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetStringWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetColorWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetKeyWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetButtonWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetEdgeWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetBellWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetMatchWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetListWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetIntReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetBoolReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetBellReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetFloatReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetStringReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetMatchReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetColorReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetKeyReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetButtonReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetEdgeReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetListReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); } } #endif compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_variant_types.h0000644000015301777760000000244312321343002027766 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_VARIANT_TYPES_H #define _COMPIZCONFIG_CCS_VARIANT_TYPES_H #include #include #include "compizconfig_ccs_list_wrapper.h" typedef boost::variant VariantTypes; #endif compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_test_value_combiners.cpp0000644000015301777760000001015212321343002031011 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include namespace compizconfig { namespace test { namespace impl { Bool boolValues[] = { TRUE, FALSE, TRUE }; int intValues[] = { 1, 2, 3 }; float floatValues[] = { 1.0, 2.0, 3.0 }; const char * stringValues[] = { "foo", "grill", "bar" }; const char * matchValues[] = { "type=foo", "class=bar", "xid=42" }; const unsigned int NUM_COLOR_VALUES = 3; CCSSettingKeyValue keyValue = { XK_A, (1 << 0)}; CCSSettingButtonValue buttonValue = { 1, (1 << 0), (1 << 1) }; CCSSettingColorValue * getColorValueList (); } } } namespace cctesti = compizconfig::test::impl; namespace cclistpopulatorsi = compizconfig::test::impl::populators::list; CCSSettingColorValue * cctesti::getColorValueList () { static const unsigned short max = std::numeric_limits ::max (); static const unsigned short maxD2 = max / 2; static const unsigned short maxD4 = max / 4; static const unsigned short maxD8 = max / 8; static bool colorValueListInitialized = false; static CCSSettingColorValue colorValues[NUM_COLOR_VALUES]; if (!colorValueListInitialized) { colorValues[0].color.red = maxD2; colorValues[0].color.blue = maxD4; colorValues[0].color.green = maxD8; colorValues[0].color.alpha = max; colorValues[1].color.red = maxD8; colorValues[1].color.blue = maxD4; colorValues[1].color.green = maxD2; colorValues[1].color.alpha = max; colorValues[1].color.red = max; colorValues[1].color.blue = maxD4; colorValues[1].color.green = maxD2; colorValues[1].color.alpha = maxD8; for (unsigned int i = 0; i < NUM_COLOR_VALUES; ++i) { CharacterWrapper s (ccsColorToString (&colorValues[i])); ccsStringToColor (s, &colorValues[i]); } colorValueListInitialized = true; } return colorValues; } CCSSettingValueList cclistpopulatorsi::boolean (CCSSetting *setting) { return ccsGetValueListFromBoolArray (cctesti::boolValues, sizeof (cctesti::boolValues) / sizeof (cctesti::boolValues[0]), setting); } CCSSettingValueList cclistpopulatorsi::integer (CCSSetting *setting) { return ccsGetValueListFromIntArray (cctesti::intValues, sizeof (cctesti::intValues) / sizeof (cctesti::intValues[0]), setting); } CCSSettingValueList cclistpopulatorsi::doubleprecision (CCSSetting *setting) { return ccsGetValueListFromFloatArray (cctesti::floatValues, sizeof (cctesti::floatValues) / sizeof (cctesti::floatValues[0]), setting); } CCSSettingValueList cclistpopulatorsi::string (CCSSetting *setting) { return ccsGetValueListFromStringArray (cctesti::stringValues, sizeof (cctesti::stringValues) / sizeof (cctesti::stringValues[0]), setting); } CCSSettingValueList cclistpopulatorsi::match (CCSSetting *setting) { return ccsGetValueListFromMatchArray (cctesti::matchValues, sizeof (cctesti::matchValues) / sizeof (cctesti::matchValues[0]), setting); } CCSSettingValueList cclistpopulatorsi::color (CCSSetting *setting) { return ccsGetValueListFromColorArray (cctesti::getColorValueList (), cctesti::NUM_COLOR_VALUES, setting); } compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_mocked_allocator.h0000644000015301777760000000611112321343002030374 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_MOCKED_ALLOCATION_H #define _COMPIZCONFIG_CCS_MOCKED_ALLOCATION_H #include #include class AllocationInterface { public: virtual ~AllocationInterface() {} virtual void * realloc_ (void *, size_t) = 0; virtual void * malloc_ (size_t) = 0; virtual void * calloc_ (size_t, size_t) = 0; virtual void free_ (void *) = 0; public: static void * wrapRealloc (void *o, void *a , size_t b) { AllocationInterface *ao = static_cast (o); return ao->realloc_ (a, b); } static void * wrapMalloc (void *o, size_t a) { AllocationInterface *ao = static_cast (o); return ao->malloc_ (a); } static void * wrapCalloc (void *o, size_t a, size_t b) { AllocationInterface *ao = static_cast (o); return ao->calloc_ (a, b); } static void wrapFree (void *o, void *a) { AllocationInterface *ao = static_cast (o); ao->free_ (a); } }; class ObjectAllocationGMock : public AllocationInterface { public: MOCK_METHOD2 (realloc_, void * (void *, size_t)); MOCK_METHOD1 (malloc_, void * (size_t)); MOCK_METHOD2 (calloc_, void * (size_t, size_t)); MOCK_METHOD1 (free_, void (void *)); }; class FailingObjectReallocation : public AllocationInterface { public: FailingObjectReallocation (unsigned int sc) : successCount (sc) { } void * realloc_ (void *a, size_t b) { unsigned int c = successCount--; if (c) return realloc (a, b); else return NULL; } void * malloc_ (size_t a) { return malloc (a); } void * calloc_ (size_t n, size_t a) { return calloc (n, a); } void free_ (void *a) { free (a); } private: unsigned int successCount; }; class FailingObjectAllocation : public AllocationInterface { public: void * realloc_ (void *a, size_t b) { return NULL; } void * malloc_ (size_t a) { return NULL; } void * calloc_ (size_t n, size_t a) { return NULL; } void free_ (void *a) { } }; CCSObjectAllocationInterface failingAllocator = { AllocationInterface::wrapRealloc, AllocationInterface::wrapMalloc, AllocationInterface::wrapCalloc, AllocationInterface::wrapFree, NULL }; #endif compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_setting_value_matcher.h0000644000015301777760000000365012321343002031453 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_SETTING_VALUE_MATCHER_H #define _COMPIZCONFIG_CCS_SETTING_VALUE_MATCHER_H #include #include #include #include using ::testing::MatcherInterface; using ::testing::Matcher; using ::testing::MatchResultListener; typedef struct _CCSSettingValue CCSSettingValue; typedef union _CCSSettingInfo CCSSettingInfo; class CCSSettingValueMatcher : public ::testing::MatcherInterface { public: CCSSettingValueMatcher (const CCSSettingValue &match, CCSSettingType type, CCSSettingInfo *info); virtual bool MatchAndExplain (CCSSettingValue x, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; virtual void DescribeNegationTo (std::ostream *os) const; private: const CCSSettingValue &mMatch; CCSSettingType mType; CCSSettingInfo *mInfo; }; Matcher SettingValueMatch (const CCSSettingValue &match, CCSSettingType type, CCSSettingInfo *info); #endif compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_backend_concept_test.cpp0000644000015301777760000003444312321343002030747 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include using ::testing::NiceMock; using ::testing::Return; using ::testing::ReturnNull; using ::testing::SetArgPointee; using ::testing::DoAll; using ::testing::AtLeast; using ::testing::Eq; namespace cct = compizconfig::test; Bool cct::boolToBool (bool v) { return v ? TRUE : FALSE; } cci::SettingValueListWrapper::Ptr cct::CCSListConstructionExpectationsSetter (const cct::ConstructorFunc &c, CCSSettingType type, cci::ListStorageType storageType) { CCSSettingInfo listInfo; listInfo.forList.listType = type; listInfo.forList.listInfo = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); boost::function f (boost::bind (ccsSettingUnref, _1)); boost::shared_ptr stubSetting (ccsSettingTypeStubNew (TypeList, TRUE, TRUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &listInfo, &ccsDefaultObjectAllocator), f); ccsCleanupSettingInfo (&listInfo, TypeList); return boost::make_shared (c (stubSetting.get ()), storageType, type, stubSetting); } CCSSettingGMock * cct::getSettingGMockFromSetting (const boost::shared_ptr &setting) { return reinterpret_cast (ccsObjectGetPrivate (setting.get ())); } void cct::SetIntWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getInt (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boost::get (value)), Return (TRUE))); write (); EXPECT_EQ (env->ReadIntegerAtKey (plugin, key), boost::get (value)); } void cct::SetBoolWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getBool (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boolToBool (boost::get (value))), Return (TRUE))); write (); bool v (boost::get (value)); if (v) EXPECT_THAT (env->ReadBoolAtKey (plugin, key), IsTrue ()); else EXPECT_THAT (env->ReadBoolAtKey (plugin, key), IsFalse ()); } void cct::SetFloatWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getFloat (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boost::get (value)), Return (TRUE))); write (); EXPECT_EQ (env->ReadFloatAtKey (plugin, key), boost::get (value)); } void cct::SetStringWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getString (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( const_cast (boost::get (value))), Return (TRUE))); write (); EXPECT_EQ (std::string (env->ReadStringAtKey (plugin, key)), std::string (boost::get (value))); } void cct::SetColorWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getColor (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boost::get (value)), Return (TRUE))); write (); EXPECT_EQ (env->ReadColorAtKey (plugin, key), boost::get (value)); } void cct::SetKeyWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getKey (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boost::get (value)), Return (TRUE))); write (); EXPECT_EQ (env->ReadKeyAtKey (plugin, key), boost::get (value)); } void cct::SetButtonWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getButton (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boost::get (value)), Return (TRUE))); write (); EXPECT_EQ (env->ReadButtonAtKey (plugin, key), boost::get (value)); } void cct::SetEdgeWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getEdge (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boost::get (value)), Return (TRUE))); write (); EXPECT_EQ (env->ReadEdgeAtKey (plugin, key), boost::get (value)); } void cct::SetBellWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getBell (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boolToBool (boost::get (value))), Return (TRUE))); write (); bool v (boost::get (value)); if (v) EXPECT_THAT (env->ReadBellAtKey (plugin, key), IsTrue ()); else EXPECT_THAT (env->ReadBellAtKey (plugin, key), IsFalse ()); } void cct::SetMatchWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getMatch (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( const_cast ( boost::get ( value))), Return (TRUE))); write (); EXPECT_EQ (std::string (env->ReadMatchAtKey (plugin, key)), std::string (boost::get (value))); } void cct::SetListWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); CCSSettingValueList list = *(boost::get > (value)); EXPECT_CALL (*gmock, getInfo ()); CCSSettingInfo *info = ccsSettingGetInfo (setting.get ()); info->forList.listType = (boost::get > (value))->type (); EXPECT_CALL (*gmock, getInfo ()).Times (AtLeast (1)); EXPECT_CALL (*gmock, getList (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( list), Return (TRUE))); write (); EXPECT_THAT (cci::SettingValueListWrapper (env->ReadListAtKey (plugin, key, setting.get ()), cci::Deep, info->forList.listType, setting), ListEqual (&info->forList, list)); } void cct::SetIntReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setInt (boost::get (value), _)); } void cct::SetBoolReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { bool v (boost::get (value)); if (v) EXPECT_CALL (*gmock, setBool (IsTrue (), _)); else EXPECT_CALL (*gmock, setBool (IsFalse (), _)); } void cct::SetBellReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { bool v (boost::get (value)); if (v) EXPECT_CALL (*gmock, setBell (IsTrue (), _)); else EXPECT_CALL (*gmock, setBell (IsFalse (), _)); } void cct::SetFloatReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setFloat (boost::get (value), _)); } void cct::SetStringReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setString (Eq (std::string (boost::get (value))), _)); } void cct::SetMatchReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setMatch (Eq (std::string (boost::get (value))), _)); } void cct::SetColorReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setColor (boost::get (value), _)); } void cct::SetKeyReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setKey (boost::get (value), _)); } void cct::SetButtonReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setButton (boost::get (value), _)); } void cct::SetEdgeReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setEdge (boost::get (value), _)); } void cct::SetListReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { static CCSSettingInfo globalListInfo; globalListInfo.forList.listType = (boost::get > (value))->type (); globalListInfo.forList.listInfo = NULL; ON_CALL (*gmock, getInfo ()).WillByDefault (Return (&globalListInfo)); EXPECT_CALL (*gmock, setList ( ListEqual ( &globalListInfo.forList, *(boost::get > (value))), _)); } compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_list_equality.cpp0000644000015301777760000000364412321343002030325 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include using ::testing::MakeMatcher; class PrivateListEqualityMatcher { public: PrivateListEqualityMatcher (CCSSettingListInfo *info, CCSSettingValueList cmp) : mInfo (info), mCmp (cmp) { } CCSSettingListInfo *mInfo; CCSSettingValueList mCmp; }; ListEqualityMatcher::ListEqualityMatcher (CCSSettingListInfo *info, CCSSettingValueList cmp) : priv (new PrivateListEqualityMatcher (info, cmp)) { } bool ListEqualityMatcher::MatchAndExplain (CCSSettingValueList x, MatchResultListener *listener) const { return ccsCompareLists (x, priv->mCmp, *priv->mInfo); } void ListEqualityMatcher::DescribeTo (std::ostream *os) const { *os << "lists are equal"; } void ListEqualityMatcher::DescribeNegationTo (std::ostream *os) const { *os << "lists are not equal"; } Matcher ListEqual (CCSSettingListInfo *info, CCSSettingValueList cmp) { return MakeMatcher (new ListEqualityMatcher (info, cmp)); } compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_list_wrapper.h0000644000015301777760000001057712321343002027620 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_LIST_WRAPPER_H #define _COMPIZCONFIG_CCS_LIST_WRAPPER_H #include #include #include #include typedef struct _CCSSettingValueList * CCSSettingValueList; typedef struct _CCSSetting CCSSetting; typedef union _CCSSettingInfo CCSSettingInfo; typedef struct _CCSSettingValue CCSSettingValue; namespace compiz { namespace config { template class ListWrapper : boost::noncopyable { public: virtual ~ListWrapper () {} virtual ListWrapper & append (const DataType &) = 0; virtual ListWrapper & remove (const DataType &) = 0; virtual operator const ListType & () const = 0; virtual operator ListType & () = 0; }; namespace impl { namespace cc = compiz::config; namespace cci = compiz::config::impl; typedef enum _ListStorageType { Shallow = 0, Deep = 1 } ListStorageType; template class ListWrapper : public cc::ListWrapper { public: typedef ListType (*ListTypeFreeFunc) (ListType, Bool); typedef ListType (*ListTypeAppendFunc) (ListType, DataType); typedef ListType (*ListTypeRemoveFunc) (ListType, DataType, Bool); ListWrapper (const ListType &list, ListTypeFreeFunc freeFunc, ListTypeAppendFunc appendFunc, ListTypeRemoveFunc removeFunc, ListStorageType storageType) : mList (list), mFree (freeFunc), mAppend (appendFunc), mRemove (removeFunc), mStorageType (storageType) { }; cc::ListWrapper & append (DataType const &data) { mList = (*mAppend) (mList, data); return *this; } cc::ListWrapper & remove (DataType const &data) { Bool freeObj = (mStorageType == Deep); mList = (*mRemove) (mList, data, freeObj); return *this; } operator const ListType & () const { return mList; } operator ListType & () { return mList; } ~ListWrapper () { Bool freeObj = (mStorageType == Deep); (*mFree) (mList, freeObj); } private: ListType mList; ListTypeFreeFunc mFree; ListTypeAppendFunc mAppend; ListTypeRemoveFunc mRemove; ListStorageType mStorageType; }; class PrivateSettingValueListWrapper; class SettingValueListWrapper : public compiz::config::ListWrapper { public: typedef boost::shared_ptr Ptr; typedef compiz::config::ListWrapper InternalWrapper; typedef compiz::config::impl::ListWrapper InternalWrapperImpl; SettingValueListWrapper (CCSSettingValueList list, ListStorageType storageType, CCSSettingType type, const boost::shared_ptr &settingReference); CCSSettingType type (); InternalWrapper & append (CCSSettingValue * const &value); InternalWrapper & remove (CCSSettingValue * const &value); operator const CCSSettingValueList & () const; operator CCSSettingValueList & (); const boost::shared_ptr & setting (); private: boost::shared_ptr priv; }; } } } #endif compiz-0.9.11+14.04.20140409/compizconfig/tests/CMakeLists.txt0000644000015301777760000000537512321343002024075 0ustar pbusernogroup00000000000000include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../libcompizconfig/include ${CMAKE_CURRENT_SOURCE_DIR}/../mocks/libcompizconfig ${CMAKE_SOURCE_DIR}/tests/shared ${CMAKE_CURRENT_SOURCE_DIR}) add_library (compizconfig_ccs_item_in_list_matcher STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_item_in_list_matcher.cpp) target_link_libraries (compizconfig_ccs_item_in_list_matcher ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig) add_library (compizconfig_ccs_list_equality STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_list_equality.cpp) target_link_libraries (compizconfig_ccs_list_equality ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig) add_library (compizconfig_ccs_list_wrapper STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_list_wrapper.cpp) target_link_libraries (compizconfig_ccs_list_wrapper ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig) add_library (compizconfig_ccs_setting_value_operators STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_setting_value_operators.cpp) target_link_libraries (compizconfig_ccs_setting_value_operators ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig) add_library (compizconfig_ccs_setting_value_matcher STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_setting_value_matcher.cpp) target_link_libraries (compizconfig_ccs_setting_value_matcher ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig compizconfig_ccs_setting_value_operators) add_library (compizconfig_ccs_test_value_combinations STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_value_combiners.cpp) target_link_libraries (compizconfig_ccs_test_value_combinations ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig) add_library (compizconfig_ccs_backend_conformance_test STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_backend_concept_test.cpp) target_link_libraries (compizconfig_ccs_backend_conformance_test ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig compizconfig_ccs_test_value_combinations compizconfig_ccs_setting_value_operators compizconfig_ccs_list_equality compizconfig_ccs_item_in_list_matcher compizconfig_ccs_setting_stub) compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_item_in_list_matcher.cpp0000644000015301777760000000241612321343002031613 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include Matcher IsStringItemInStringCCSList (const Matcher &matcher) { return IsItemInCCSList (matcher); } Matcher IsSettingValueInSettingValueCCSList (const Matcher &matcher) { return IsItemInCCSList (matcher); } compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_test_value_combiners.h0000644000015301777760000000362012321343002030460 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_TEST_VALUE_COMBINERS_H #define _COMPIZCONFIG_TEST_VALUE_COMBINERS_H #include #include #include namespace compizconfig { namespace test { namespace impl { extern Bool boolValues[]; extern int intValues[]; extern float floatValues[]; extern const char * stringValues[]; extern const char * matchValues[]; extern CCSSettingKeyValue keyValue; extern CCSSettingButtonValue buttonValue; extern const unsigned int NUM_COLOR_VALUES; CCSSettingColorValue * getColorValueList (); namespace populators { namespace list { CCSSettingValueList boolean (CCSSetting *setting); CCSSettingValueList integer (CCSSetting *setting); CCSSettingValueList doubleprecision (CCSSetting *setting); CCSSettingValueList string (CCSSetting *setting); CCSSettingValueList match (CCSSetting *setting); CCSSettingValueList color (CCSSetting *setting); } } } } } #endif compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_settings_test_fixture.h0000644000015301777760000001000112321343002031530 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_SETTINGS_TEST_FIXTURE_H #define _COMPIZCONFIG_CCS_SETTINGS_TEST_FIXTURE_H #include #include #include "compizconfig_ccs_variant_types.h" typedef enum _CCSSettingType CCSSettingType; typedef struct _CCSSetting CCSSetting; namespace compizconfig { namespace test { Bool boolToBool (bool v); } } class CCSSettingsConceptTestEnvironmentInterface { public: virtual ~CCSSettingsConceptTestEnvironmentInterface () {} virtual void SetUp () = 0; virtual void TearDown () = 0; virtual void WriteBoolAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteIntegerAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteFloatAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteStringAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteColorAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteKeyAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteButtonAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteEdgeAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteMatchAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteBellAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteListAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual Bool ReadBoolAtKey (const std::string &plugin, const std::string &key) = 0; virtual int ReadIntegerAtKey (const std::string &plugin, const std::string &key) = 0; virtual float ReadFloatAtKey (const std::string &plugin, const std::string &key) = 0; virtual const char * ReadStringAtKey (const std::string &plugin, const std::string &key) = 0; virtual CCSSettingColorValue ReadColorAtKey (const std::string &plugin, const std::string &key) = 0; virtual CCSSettingKeyValue ReadKeyAtKey (const std::string &plugin, const std::string &key) = 0; virtual CCSSettingButtonValue ReadButtonAtKey (const std::string &plugin, const std::string &key) = 0; virtual unsigned int ReadEdgeAtKey (const std::string &plugin, const std::string &key) = 0; virtual const char * ReadMatchAtKey (const std::string &plugin, const std::string &key) = 0; virtual Bool ReadBellAtKey (const std::string &plugin, const std::string &key) = 0; virtual CCSSettingValueList ReadListAtKey (const std::string &plugin, const std::string &key, CCSSetting *setting) = 0; }; #endif compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_ccs_setting_value_operators.cpp0000644000015301777760000001204712321343002032401 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include namespace cct = compiz::config::test; bool operator== (const CCSSettingColorValue &lhs, const CCSSettingColorValue &rhs) { if (ccsIsEqualColor (lhs, rhs)) return true; return false; } std::ostream & operator<< (std::ostream &os, const CCSSettingColorValue &v) { return os << "Red: " << std::hex << v.color.red << "Blue: " << std::hex << v.color.blue << "Green: " << v.color.green << "Alpha: " << v.color.alpha << std::dec << std::endl; } bool operator== (const CCSSettingKeyValue &lhs, const CCSSettingKeyValue &rhs) { if (ccsIsEqualKey (lhs, rhs)) return true; return false; } std::ostream & operator<< (std::ostream &os, const CCSSettingKeyValue &v) { return os << "Keysym: " << v.keysym << " KeyModMask " << std::hex << v.keyModMask << std::dec << std::endl; } bool operator== (const CCSSettingButtonValue &lhs, const CCSSettingButtonValue &rhs) { if (ccsIsEqualButton (lhs, rhs)) return true; return false; } std::ostream & operator<< (std::ostream &os, const CCSSettingButtonValue &v) { return os << "Button " << v.button << "Button Key Mask: " << std::hex << v.buttonModMask << "Edge Mask: " << v.edgeMask << std::dec << std::endl; } bool operator== (const CCSString &lhs, const std::string &rhs) { if (rhs == lhs.value) return true; return false; } bool operator== (const std::string &lhs, const CCSString &rhs) { return rhs == lhs; } bool operator== (const std::string &rhs, CCSString *lhs) { return *lhs == rhs; } std::ostream & operator<< (std::ostream &os, CCSString &string) { os << string.value << std::endl; return os; } std::ostream & cct::DescribeSettingValueTo (std::ostream &os, CCSSettingType type, const CCSSettingValue &value) { switch (type) { case TypeBool: return os << value.value.asBool; break; case TypeInt: return os << value.value.asInt; break; case TypeFloat: return os << value.value.asFloat; break; case TypeString: return os << value.value.asString; break; case TypeColor: return os << value.value.asColor; break; case TypeAction: return os << "An action value"; break; case TypeKey: return os << value.value.asKey; break; case TypeButton: return os << value.value.asButton; break; case TypeEdge: return os << value.value.asEdge; break; case TypeBell: return os << value.value.asBell; break; case TypeMatch: return os << value.value.asMatch; break; case TypeList: return os << value.value.asList; break; default: return os << "No available descriptor, type not known"; break; } return os; } std::ostream & cct::DescribeSettingListTo (std::ostream &os, CCSSettingType type, CCSSettingValueList list) { unsigned int count = 0; while (list) { os << "Item " << count << " "; cct::DescribeSettingValueTo (os, type, *list->data); list = list->next; ++count; } return os; } std::ostream & operator<< (std::ostream &os, const CCSSettingValue &v) { os << "Possible values in CCSSetting :" << std::endl; const unsigned int finalType = static_cast (TypeNum); for (unsigned int i = 0; i < finalType; ++i) { /* We cannot print list values as there's no guarantee * this is actually a list */ if (static_cast (i) == TypeList) os << "A list value" << std::endl; else cct::DescribeSettingValueTo (os, static_cast (i), v) << std::endl; } return os; } std::ostream & operator<< (std::ostream &os, CCSSettingValueList l) { os << "Possible list values :" << std::endl; const unsigned int finalType = static_cast (TypeNum); for (unsigned int i = 0; i < finalType; ++i) { /* We cannot print list values as there's no guarantee * this is actually a list */ if (static_cast (i) == TypeList) os << "A list value" << std::endl; else cct::DescribeSettingListTo (os, static_cast (i), l) << std::endl; } return os; } ././@LongLink0000000000000000000000000000015200000000000011213 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_backend_concept_test_environment_interface.hcompiz-0.9.11+14.04.20140409/compizconfig/tests/compizconfig_backend_concept_test_environment_interf0000644000015301777760000000632512321343002034157 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_BACKEND_CONCEPT_TEST_ENVIRONMENT_INTERFACE_H #define _COMPIZCONFIG_CCS_BACKEND_CONCEPT_TEST_ENVIRONMENT_INTERFACE_H #include #include #include "compizconfig_ccs_settings_test_fixture.h" typedef struct _CCSContext CCSContext; typedef struct _CCSBackendInfo CCSBackendInfo; class CCSContextGMock; class CCSPluginGMock; class CCSSettingGMock; class CCSBackendConceptTestEnvironmentInterface : public CCSSettingsConceptTestEnvironmentInterface { public: typedef boost::shared_ptr Ptr; virtual ~CCSBackendConceptTestEnvironmentInterface () {}; virtual CCSBackend * BackendSetUp (CCSContext *context, CCSContextGMock *gmockContext) = 0; virtual void BackendTearDown (CCSBackend *) = 0; virtual void AddProfile (const std::string &profile) = 0; virtual void SetGetExistingProfilesExpectation (CCSContext *, CCSContextGMock *) = 0; virtual void SetDeleteProfileExpectation (const std::string &, CCSContext *, CCSContextGMock *) = 0; virtual void SetReadInitExpectation (CCSContext *, CCSContextGMock *) = 0; virtual void SetReadDoneExpectation (CCSContext *, CCSContextGMock *) = 0; virtual void SetWriteInitExpectation (CCSContext *, CCSContextGMock *) = 0; virtual void SetWriteDoneExpectation (CCSContext *, CCSContextGMock *) = 0; virtual const CCSBackendInfo * GetInfo () = 0; virtual void PreWrite (CCSContextGMock *, CCSPluginGMock *, CCSSettingGMock *, CCSSettingType) = 0; virtual void PostWrite (CCSContextGMock *, CCSPluginGMock *, CCSSettingGMock *, CCSSettingType) = 0; virtual void PreRead (CCSContextGMock *, CCSPluginGMock *, CCSSettingGMock *, CCSSettingType) = 0; virtual void PostRead (CCSContextGMock *, CCSPluginGMock *, CCSSettingGMock *, CCSSettingType) = 0; virtual void PreUpdate (CCSContextGMock *, CCSPluginGMock *, CCSSettingGMock *, CCSSettingType) = 0; virtual void PostUpdate (CCSContextGMock *, CCSPluginGMock *, CCSSettingGMock *, CCSSettingType) = 0; virtual bool UpdateSettingAtKey (const std::string &plugin, const std::string &setting) = 0; }; #endif compiz-0.9.11+14.04.20140409/compizconfig/integration/0000755000015301777760000000000012321344021022506 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/0000755000015301777760000000000012321344021023613 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gconf/0000755000015301777760000000000012321344021024707 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gconf/CMakeLists.txt0000644000015301777760000000332112321343002027444 0ustar pbusernogroup00000000000000include (FindPkgConfig) if (USE_GCONF) set (_deps glib-2.0>=2.20.0 gio-2.0>=2.25.0 gconf-2.0>=2.31.1) compiz_pkg_check_modules (COMPIZCONFIG_GNOME_GCONF_INTEGRATION ${_deps}) if (COMPIZCONFIG_GNOME_GCONF_INTEGRATION_FOUND) add_definitions (-DUSE_GCONF) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/libcompizconfig/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/gconf/include ${COMPIZCONFIG_GNOME_GCONF_INTEGRATION_INCLUDE_DIRS}) link_directories (${CMAKE_BINARY_DIR}/compizconfig/libcompizconfig ${CMAKE_BINARY_DIR}/compizconfig/integration/gnome ${COMPIZCONFIG_GNOME_GCONF_INTEGRATION_LIBRARY_DIRS}) add_library (compizconfig_gnome_integration_gconf_integrated_setting STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integration_gconf_integrated_setting.c) target_link_libraries (compizconfig_gnome_integration_gconf_integrated_setting compizconfig_gnome_integrated_setting compizconfig_gnome_integration_constants compizconfig ${COMPIZCONFIG_GNOME_GCONF_INTEGRATION_LIBRARIES}) add_library (compizconfig_gnome_integration_gconf_setting_factory STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integration_gconf_integrated_setting_factory.c) target_link_libraries (compizconfig_gnome_integration_gconf_setting_factory compizconfig_gnome_integration_constants compizconfig_gnome_integrated_setting compizconfig_gnome_integration_gconf_integrated_setting compizconfig ${COMPIZCONFIG_GNOME_GCONF_INTEGRATION_LIBRARIES}) endif (COMPIZCONFIG_GNOME_GCONF_INTEGRATION_FOUND) endif (USE_GCONF) compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gconf/src/0000755000015301777760000000000012321344021025476 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000016700000000000011221 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gconf/src/ccs_gnome_integration_gconf_integrated_setting.ccompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gconf/src/ccs_gnome_integration_gconf_in0000644000015301777760000002033712321343002033626 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include #include #include "ccs_gnome_integration_gconf_integrated_setting.h" #include "ccs_gnome_integrated_setting.h" #include "ccs_gnome_integration_constants.h" /* CCSGConfIntegratedSetting implementation */ typedef struct _CCSGConfIntegratedSettingPrivate CCSGConfIntegratedSettingPrivate; struct _CCSGConfIntegratedSettingPrivate { CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSettingInfo; GConfClient *client; const char *sectionName; }; SpecialOptionType ccsGConfIntegratedSettingGetSpecialOptionType (CCSGNOMEIntegratedSettingInfo *setting) { CCSGConfIntegratedSettingPrivate *priv = (CCSGConfIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsGNOMEIntegratedSettingInfoGetSpecialOptionType (priv->gnomeIntegratedSettingInfo); } const char * ccsGConfIntegratedSettingGetGNOMEName (CCSGNOMEIntegratedSettingInfo *setting) { CCSGConfIntegratedSettingPrivate *priv = (CCSGConfIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsGNOMEIntegratedSettingInfoGetGNOMEName (priv->gnomeIntegratedSettingInfo); } CCSSettingValue * ccsGConfIntegratedSettingReadValue (CCSIntegratedSetting *setting, CCSSettingType type) { CCSGConfIntegratedSettingPrivate *priv = (CCSGConfIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); CCSSettingValue *v = calloc (1, sizeof (CCSSettingValue)); const char *gnomeKeyName = ccsGNOMEIntegratedSettingInfoGetGNOMEName ((CCSGNOMEIntegratedSettingInfo *) setting); char *gnomeKeyPath = g_strconcat (priv->sectionName, gnomeKeyName, NULL); v->isListChild = FALSE; v->parent = NULL; v->refCount = 1; GConfValue *gconfValue; GError *err = NULL; gconfValue = gconf_client_get (priv->client, gnomeKeyPath, &err); if (!gconfValue) { ccsError ("NULL encountered while reading GConf setting"); free (gnomeKeyPath); free (v); return NULL; } if (err) { ccsError ("%s", err->message); g_error_free (err); free (gnomeKeyPath); free (v); return NULL; } switch (type) { case TypeInt: if (gconfValue->type != GCONF_VALUE_INT) { ccsError ("Expected integer value"); free (v); v = NULL; break; } v->value.asInt = gconf_value_get_int (gconfValue); break; case TypeBool: if (gconfValue->type != GCONF_VALUE_BOOL) { ccsError ("Expected boolean value"); free (v); v = NULL; break; } v->value.asBool = gconf_value_get_bool (gconfValue) ? TRUE : FALSE; break; case TypeString: case TypeKey: if (gconfValue->type != GCONF_VALUE_STRING) { ccsError ("Expected string value"); free (v); v = NULL; break; } const char *str = gconf_value_get_string (gconfValue); v->value.asString = strdup (str ? str : ""); break; default: g_assert_not_reached (); } gconf_value_free (gconfValue); free (gnomeKeyPath); return v; } void ccsGConfIntegratedSettingWriteValue (CCSIntegratedSetting *setting, CCSSettingValue *v, CCSSettingType type) { CCSGConfIntegratedSettingPrivate *priv = (CCSGConfIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); const char *gnomeKeyName = ccsGNOMEIntegratedSettingInfoGetGNOMEName ((CCSGNOMEIntegratedSettingInfo *) setting); char *gnomeKeyPath = g_strconcat (priv->sectionName, gnomeKeyName, NULL); GError *err = NULL; switch (type) { case TypeInt: { int currentValue = gconf_client_get_int (priv->client, gnomeKeyPath, &err); if (!err && (currentValue != v->value.asInt)) gconf_client_set_int(priv->client, gnomeKeyPath, v->value.asInt, NULL); } break; case TypeBool: { Bool newValue = v->value.asBool; gboolean currentValue; currentValue = gconf_client_get_bool (priv->client, gnomeKeyPath, &err); if (!err && ((currentValue && !newValue) || (!currentValue && newValue))) gconf_client_set_bool (priv->client, gnomeKeyPath, newValue, NULL); } break; case TypeString: case TypeKey: { char *newValue = v->value.asString; gchar *currentValue; currentValue = gconf_client_get_string (priv->client, gnomeKeyPath, &err); if (!err && currentValue) { if (strcmp (currentValue, newValue) != 0) gconf_client_set_string (priv->client, gnomeKeyPath, newValue, NULL); g_free (currentValue); } } break; default: g_assert_not_reached (); break; } if (err) { ccsError ("%s", err->message); g_error_free (err); } free (gnomeKeyPath); } const char * ccsGConfIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *info) { CCSGConfIntegratedSettingPrivate *priv = (CCSGConfIntegratedSettingPrivate *) ccsObjectGetPrivate (info); return ccsIntegratedSettingInfoPluginName ((CCSIntegratedSettingInfo *) priv->gnomeIntegratedSettingInfo); } const char * ccsGConfIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *info) { CCSGConfIntegratedSettingPrivate *priv = (CCSGConfIntegratedSettingPrivate *) ccsObjectGetPrivate (info); return ccsIntegratedSettingInfoSettingName ((CCSIntegratedSettingInfo *) priv->gnomeIntegratedSettingInfo); } CCSSettingType ccsGConfIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *info) { CCSGConfIntegratedSettingPrivate *priv = (CCSGConfIntegratedSettingPrivate *) ccsObjectGetPrivate (info); return ccsIntegratedSettingInfoGetType ((CCSIntegratedSettingInfo *) priv->gnomeIntegratedSettingInfo); } void ccsGConfIntegratedSettingFree (CCSIntegratedSetting *setting) { CCSGConfIntegratedSettingPrivate *priv = (CCSGConfIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); ccsIntegratedSettingInfoUnref ((CCSIntegratedSettingInfo *) priv->gnomeIntegratedSettingInfo); ccsObjectFinalize (setting); (*setting->object.object_allocation->free_) (setting->object.object_allocation->allocator, setting); } void ccsGConfIntegratedSettingInfoFree (CCSIntegratedSettingInfo *info) { ccsGConfIntegratedSettingFree ((CCSIntegratedSetting *) info); } void ccsGConfGNOMEIntegratedSettingInfoFree (CCSGNOMEIntegratedSettingInfo *info) { ccsGConfIntegratedSettingFree ((CCSIntegratedSetting *) info); } const CCSGNOMEIntegratedSettingInfoInterface ccsGConfGNOMEIntegratedSettingInfoInterface = { ccsGConfIntegratedSettingGetSpecialOptionType, ccsGConfIntegratedSettingGetGNOMEName, ccsGConfGNOMEIntegratedSettingInfoFree }; const CCSIntegratedSettingInterface ccsGConfIntegratedSettingInterface = { ccsGConfIntegratedSettingReadValue, ccsGConfIntegratedSettingWriteValue, ccsGConfIntegratedSettingFree }; const CCSIntegratedSettingInfoInterface ccsGConfIntegratedSettingInfoInterface = { ccsGConfIntegratedSettingInfoPluginName, ccsGConfIntegratedSettingInfoSettingName, ccsGConfIntegratedSettingInfoGetType, ccsGConfIntegratedSettingInfoFree }; CCSIntegratedSetting * ccsGConfIntegratedSettingNew (CCSGNOMEIntegratedSettingInfo *base, GConfClient *client, const char *section, CCSObjectAllocationInterface *ai) { CCSIntegratedSetting *setting = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSetting)); if (!setting) return NULL; CCSGConfIntegratedSettingPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGConfIntegratedSettingPrivate)); if (!priv) { (*ai->free_) (ai->allocator, priv); return NULL; } priv->gnomeIntegratedSettingInfo = base; priv->client = client; priv->sectionName = section; ccsObjectInit (setting, ai); ccsObjectSetPrivate (setting, (CCSPrivate *) priv); ccsObjectAddInterface (setting, (const CCSInterface *) &ccsGConfIntegratedSettingInfoInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInfoInterface)); ccsObjectAddInterface (setting, (const CCSInterface *) &ccsGConfIntegratedSettingInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInterface)); ccsObjectAddInterface (setting, (const CCSInterface *) &ccsGConfGNOMEIntegratedSettingInfoInterface, GET_INTERFACE_TYPE (CCSGNOMEIntegratedSettingInfoInterface)); ccsIntegratedSettingRef (setting); return setting; } ././@LongLink0000000000000000000000000000017700000000000011222 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gconf/src/ccs_gnome_integration_gconf_integrated_setting_factory.ccompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gconf/src/ccs_gnome_integration_gconf_in0000644000015301777760000002017712321343002033630 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include #include #include "ccs_gnome_integration.h" #include "ccs_gnome_integrated_setting.h" #include "ccs_gnome_integration_constants.h" #include "ccs_gnome_integration_gconf_integrated_setting.h" typedef struct _CCSGConfIntegratedSettingFactoryPrivate CCSGConfIntegratedSettingFactoryPrivate; struct _CCSGConfIntegratedSettingFactoryPrivate { GConfClient *client; guint gnomeGConfNotifyIds[NUM_WATCHED_DIRS]; GHashTable *pluginsToSettingsSectionsHashTable; GHashTable *pluginsToSettingsSpecialTypesHashTable; GHashTable *pluginsToSettingNameGNOMENameHashTable; CCSGNOMEValueChangeData *valueChangedData; }; static void gnomeGConfValueChanged (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer user_data) { CCSGNOMEValueChangeData *data = (CCSGNOMEValueChangeData *) user_data; const gchar *keyName = gconf_entry_get_key (entry); gchar *baseName = g_path_get_basename (keyName); /* We don't care if integration is not enabled */ if (!ccsGetIntegrationEnabled (data->context)) return; CCSIntegratedSettingList settingList = ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate (data->storage, ccsGNOMEIntegrationFindSettingsMatchingPredicate, baseName); ccsIntegrationUpdateIntegratedSettings (data->integration, data->context, settingList); g_free (baseName); } static CCSIntegratedSetting * createNewGConfIntegratedSetting (GConfClient *client, const char *sectionName, const char *gnomeName, const char *pluginName, const char *settingName, CCSSettingType type, SpecialOptionType specialOptionType, CCSObjectAllocationInterface *ai) { CCSIntegratedSettingInfo *sharedIntegratedSettingInfo = ccsSharedIntegratedSettingInfoNew (pluginName, settingName, type, ai); if (!sharedIntegratedSettingInfo) return NULL; CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSettingInfo = ccsGNOMEIntegratedSettingInfoNew (sharedIntegratedSettingInfo, specialOptionType, gnomeName, ai); if (!gnomeIntegratedSettingInfo) { ccsIntegratedSettingInfoUnref (sharedIntegratedSettingInfo); return NULL; } CCSIntegratedSetting *gconfIntegratedSetting = ccsGConfIntegratedSettingNew (gnomeIntegratedSettingInfo, client, sectionName, ai); if (!gconfIntegratedSetting) { ccsIntegratedSettingInfoUnref ((CCSIntegratedSettingInfo *) gnomeIntegratedSettingInfo); return NULL; } return gconfIntegratedSetting; } static void finiGConfClient (GConfClient *client, guint *gnomeGConfNotifyIds) { int i; gconf_client_clear_cache (client); for (i = 0; i < NUM_WATCHED_DIRS; ++i) { if (gnomeGConfNotifyIds[i]) { gconf_client_notify_remove (client, gnomeGConfNotifyIds[0]); gnomeGConfNotifyIds[i] = 0; } gconf_client_remove_dir (client, watchedGConfGnomeDirectories[i], NULL); } gconf_client_suggest_sync (client, NULL); g_object_unref (client); } static void registerGConfClient (GConfClient *client, guint *gnomeGConfNotifyIds, CCSGNOMEValueChangeData *data, GConfClientNotifyFunc func) { int i; for (i = 0; i < NUM_WATCHED_DIRS; ++i) gnomeGConfNotifyIds[i] = gconf_client_notify_add (client, watchedGConfGnomeDirectories[i], func, (gpointer) data, NULL, NULL); } static void initGConfClient (CCSIntegratedSettingFactory *factory) { int i; CCSGConfIntegratedSettingFactoryPrivate *priv = (CCSGConfIntegratedSettingFactoryPrivate *) ccsObjectGetPrivate (factory); priv->client = gconf_client_get_default (); for (i = 0; i < NUM_WATCHED_DIRS; ++i) gconf_client_add_dir (priv->client, watchedGConfGnomeDirectories[i], GCONF_CLIENT_PRELOAD_NONE, NULL); } CCSIntegratedSetting * ccsGConfIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (CCSIntegratedSettingFactory *factory, CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type) { CCSGConfIntegratedSettingFactoryPrivate *priv = (CCSGConfIntegratedSettingFactoryPrivate *) ccsObjectGetPrivate (factory); GHashTable *settingsSectionsHashTable = g_hash_table_lookup (priv->pluginsToSettingsSectionsHashTable, pluginName); GHashTable *settingsSpecialTypesHashTable = g_hash_table_lookup (priv->pluginsToSettingsSpecialTypesHashTable, pluginName); GHashTable *settingsSettingNameGNOMENameHashTable = g_hash_table_lookup (priv->pluginsToSettingNameGNOMENameHashTable, pluginName); if (!priv->client) initGConfClient (factory); if (!priv->gnomeGConfNotifyIds[0]) registerGConfClient (priv->client, priv->gnomeGConfNotifyIds, priv->valueChangedData, gnomeGConfValueChanged); if (settingsSectionsHashTable && settingsSpecialTypesHashTable && settingsSettingNameGNOMENameHashTable) { const gchar *sectionName = g_hash_table_lookup (settingsSectionsHashTable, settingName); SpecialOptionType specialType = (SpecialOptionType) GPOINTER_TO_INT (g_hash_table_lookup (settingsSpecialTypesHashTable, settingName)); const gchar *integratedName = g_hash_table_lookup (settingsSettingNameGNOMENameHashTable, settingName); return createNewGConfIntegratedSetting (priv->client, sectionName, integratedName, pluginName, settingName, type, specialType, factory->object.object_allocation); } return NULL; } void ccsGConfIntegratedSettingFactoryFree (CCSIntegratedSettingFactory *factory) { CCSGConfIntegratedSettingFactoryPrivate *priv = (CCSGConfIntegratedSettingFactoryPrivate *) ccsObjectGetPrivate (factory); if (priv->client) finiGConfClient (priv->client, priv->gnomeGConfNotifyIds); if (priv->pluginsToSettingsSectionsHashTable) g_hash_table_unref (priv->pluginsToSettingsSectionsHashTable); if (priv->pluginsToSettingsSpecialTypesHashTable) g_hash_table_unref (priv->pluginsToSettingsSpecialTypesHashTable); if (priv->pluginsToSettingNameGNOMENameHashTable) g_hash_table_unref (priv->pluginsToSettingNameGNOMENameHashTable); ccsObjectFinalize (factory); (*factory->object.object_allocation->free_) (factory->object.object_allocation->allocator, factory); } const CCSIntegratedSettingFactoryInterface ccsGConfIntegratedSettingFactoryInterface = { ccsGConfIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType, ccsGConfIntegratedSettingFactoryFree }; CCSIntegratedSettingFactory * ccsGConfIntegratedSettingFactoryNew (GConfClient *client, CCSGNOMEValueChangeData *valueChangedData, CCSObjectAllocationInterface *ai) { CCSIntegratedSettingFactory *factory = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingFactory)); if (!factory) return NULL; CCSGConfIntegratedSettingFactoryPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGConfIntegratedSettingFactoryPrivate)); if (!priv) { (*ai->free_) (ai->allocator, factory); return NULL; } if (client) { int i; priv->client = (GConfClient *) g_object_ref (client); for (i = 0; i < NUM_WATCHED_DIRS; ++i) gconf_client_add_dir (priv->client, watchedGConfGnomeDirectories[i], GCONF_CLIENT_PRELOAD_NONE, NULL); } else priv->client = NULL; priv->pluginsToSettingsSectionsHashTable = ccsGNOMEIntegrationPopulateCategoriesHashTables (); priv->pluginsToSettingsSpecialTypesHashTable = ccsGNOMEIntegrationPopulateSpecialTypesHashTables (); priv->pluginsToSettingNameGNOMENameHashTable = ccsGNOMEIntegrationPopulateSettingNameToGNOMENameHashTables (); priv->valueChangedData = valueChangedData; ccsObjectInit (factory, ai); ccsObjectSetPrivate (factory, (CCSPrivate *) priv); ccsObjectAddInterface (factory, (const CCSInterface *) &ccsGConfIntegratedSettingFactoryInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingFactoryInterface)); ccsIntegratedSettingFactoryRef (factory); return factory; } compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gconf/include/0000755000015301777760000000000012321344021026332 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000017300000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gconf/include/ccs_gnome_integration_gconf_integrated_setting.hcompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gconf/include/ccs_gnome_integration_gcon0000644000015301777760000000143312321343002033622 0ustar pbusernogroup00000000000000#ifndef _CCS_GNOME_GCONF_INTEGRATED_SETTING_H #define _CCS_GNOME_GCONF_INTEGRATED_SETTING_H #include #include #include #include COMPIZCONFIG_BEGIN_DECLS /** * @brief ccsGConfIntegratedSettingNew * @param base a CCSGNOMEIntegratedSetting * @param client a GConfClient * @param section the preceeding path to the keyname * @param ai a CCSObjectAllocationInterface * @return * * Creates the GConf implementation of a CCSIntegratedSetting, which will * write to GConf keys when necessary. */ CCSIntegratedSetting * ccsGConfIntegratedSettingNew (CCSGNOMEIntegratedSettingInfo *base, GConfClient *client, const char *section, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ././@LongLink0000000000000000000000000000020300000000000011210 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gconf/include/ccs_gnome_integration_gconf_integrated_setting_factory.hcompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gconf/include/ccs_gnome_integration_gcon0000644000015301777760000000157712321343002033633 0ustar pbusernogroup00000000000000#ifndef _CCS_GNOME_GCONF_INTEGRATED_SETTING_FACTORY_H #define _CCS_GNOME_GCONF_INTEGRATED_SETTING_FACTORY_H #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS /** * @brief ccsGConfIntegratedSettingFactoryNew * @param client an existing GConfClient or NULL * @param data some data to pass to the change callback * @param ai a CCSObjectAllocationInterface * @return a new CCSIntegratedSettingFactory * * CCSGConfIntegratedSettingFactory implements CCSIntegratedSettingFactory * * and will create CCSGConfIntegratedSetting objects (which implement * CCSIntegratedSetting). */ CCSIntegratedSettingFactory * ccsGConfIntegratedSettingFactoryNew (GConfClient *client, CCSGNOMEValueChangeData *data, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/0000755000015301777760000000000012321344021025622 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/tests/0000755000015301777760000000000012321344021026764 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000021100000000000011207 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/tests/compizconfig_test_ccs_gnome_gsettings_integrated_setting.cppcompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/tests/compizconfig_test_ccs_gn0000644000015301777760000003053012321343002033750 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include using ::testing::Combine; using ::testing::Return; using ::testing::IsNull; using ::testing::ValuesIn; using ::testing::Values; using ::testing::Eq; using ::testing::WithArgs; using ::testing::_; namespace compiz { namespace config { namespace integration { namespace test { const std::string KEYBINDING_ONE = "keybinding_one"; const std::string KEYBINDING_TWO = "keybinding_two"; const std::string STRING = "string"; const Bool BOOLEAN = TRUE; const int INTEGER = 2; const std::string STRING_ALT = "string_alt"; const Bool BOOLEAN_ALT = FALSE; const int INTEGER_ALT = 1; namespace variant_generators { GVariant * i (); GVariant * s (); GVariant * b (); GVariant * as (); GVariant * fromValue (CCSSettingValue *v, CCSSettingType type); } namespace value_generators { CCSSettingValue * integer (); CCSSettingValue * string (); CCSSettingValue * key (); CCSSettingValue * boolean (); } namespace expectations { void integer (CCSSettingValue *); void string (CCSSettingValue *); void boolean (CCSSettingValue *); void key (CCSSettingValue *); void integerVariant (GVariant *, int); void stringVariant (GVariant *, const std::string &); void booleanVariant (GVariant *, bool); void keyVariant (GVariant *, const std::string &); } typedef GVariant * (*VariantGenerator) (); typedef CCSSettingValue * (*ValueGenerator) (); typedef void (*Expectation) (CCSSettingValue *); struct GSettingsIntegratedSettingInfo { VariantGenerator variantGenerator; ValueGenerator valueGenerator; Expectation expectation; CCSSettingType settingType; CCSSettingType returnType; }; namespace impl { namespace ccit = compiz::config::integration::test; namespace vg = compiz::config::integration::test::variant_generators; namespace cvg = compiz::config::integration::test::value_generators; namespace ex = compiz::config::integration::test::expectations; ccit::GSettingsIntegratedSettingInfo settingsInfo[] = { { vg::i, cvg::integer, ex::integer, TypeInt, TypeInt }, { vg::b, cvg::boolean, ex::boolean, TypeBool, TypeBool }, { vg::s, cvg::string, ex::string, TypeString, TypeString }, { vg::as, cvg::key, ex::key, TypeKey, TypeString } }; } } } } } MATCHER_P (VariantEqual, lhs, "Variants Equal") { return g_variant_equal (lhs, arg); } namespace { std::map & ccsTypeToSpecialType () { static std::map types; static bool initialized = false; if (!initialized) { types[TypeInt] = OptionInt; types[TypeBool] = OptionBool; types[TypeString] = OptionString; types[TypeKey] = OptionKey; } return types; } } namespace ccit = compiz::config::integration::test; namespace cciti = compiz::config::integration::test::impl; namespace ccvg = compiz::config::integration::test::variant_generators; namespace ccvalg = compiz::config::integration::test::value_generators; namespace ccex = compiz::config::integration::test::expectations; typedef std::tr1::tuple CCSGSettingsIntegratedSettingTestInfo; class CCSGSettingsIntegratedSettingTest : public ::testing::TestWithParam { public: virtual void SetUp (); virtual void TearDown (); protected: CompizGLibGSliceOffEnv env; boost::shared_ptr mWrapper; CCSGSettingsWrapperGMock *mWrapperMock; }; GVariant * ccvg::fromValue (CCSSettingValue *v, CCSSettingType type) { switch (type) { case TypeInt: return g_variant_new ("i", v->value.asInt); break; case TypeBool: return g_variant_new ("b", v->value.asBool); break; case TypeString: return g_variant_new ("s", v->value.asString); break; case TypeKey: { GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); /* Represented internally as strings */ std::string kb (v->value.asString); if (kb == "Disabled") kb[0] = 'd'; g_variant_builder_add (&builder, "s", kb.c_str ()); return g_variant_builder_end (&builder); } default: break; } return NULL; } GVariant * ccvg::as () { GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&builder, "s", ccit::KEYBINDING_ONE.c_str ()); g_variant_builder_add (&builder, "s", ccit::KEYBINDING_TWO.c_str ()); return g_variant_builder_end (&builder); } GVariant * ccvg::i () { return g_variant_new ("i", ccit::INTEGER); } GVariant * ccvg::b () { return g_variant_new ("b", ccit::BOOLEAN); } GVariant * ccvg::s () { return g_variant_new ("s", ccit::STRING.c_str ()); } namespace { CCSSettingValue * createSettingValue () { CCSSettingValue *v = reinterpret_cast (calloc (1, sizeof (CCSSettingValue))); v->isListChild = FALSE; v->parent = NULL; v->refCount = 1; return v; } } CCSSettingValue * ccvalg::integer () { CCSSettingValue *v = createSettingValue (); v->value.asInt = ccit::INTEGER_ALT; return v; } CCSSettingValue * ccvalg::string () { CCSSettingValue *v = createSettingValue (); v->value.asString = strdup (ccit::STRING_ALT.c_str ()); return v; } CCSSettingValue * ccvalg::key () { CCSSettingValue *v = createSettingValue (); v->value.asString = strdup (ccit::KEYBINDING_TWO.c_str ()); return v; } CCSSettingValue * ccvalg::boolean () { CCSSettingValue *v = createSettingValue (); v->value.asBool = ccit::BOOLEAN_ALT; return v; } void ccex::boolean (CCSSettingValue *v) { EXPECT_EQ (v->value.asBool, ccit::BOOLEAN); } void ccex::integer (CCSSettingValue *v) { EXPECT_EQ (v->value.asInt, ccit::INTEGER); } void ccex::string (CCSSettingValue *v) { EXPECT_EQ (v->value.asString, ccit::STRING); } void ccex::key (CCSSettingValue *v) { EXPECT_EQ (v->value.asString, ccit::KEYBINDING_ONE); } void ccex::integerVariant (GVariant *v , int i) { EXPECT_EQ (g_variant_get_int32 (v), i); } void ccex::stringVariant (GVariant *v, const std::string &s) { gsize len; EXPECT_EQ (g_variant_get_string (v, &len), s); } void ccex::booleanVariant (GVariant *v, bool b) { EXPECT_EQ (g_variant_get_boolean (v), b); } void ccex::keyVariant (GVariant *v, const std::string &s) { gsize len; const gchar * const *strv = g_variant_get_strv (v, &len); EXPECT_EQ (strv[0], s); } void CCSGSettingsIntegratedSettingTest::SetUp () { env.SetUpEnv (); mWrapper.reset (ccsMockGSettingsWrapperNew (), boost::bind (ccsMockGSettingsWrapperFree, _1)); mWrapperMock = reinterpret_cast ( ccsObjectGetPrivate (mWrapper.get ())); } void CCSGSettingsIntegratedSettingTest::TearDown () { mWrapper.reset (); mWrapperMock = NULL; env.TearDownEnv (); } TEST_P (CCSGSettingsIntegratedSettingTest, MatchedTypesReturnValueMismatchedTypesReturnNull) { const std::string keyName ("mock"); const ccit::GSettingsIntegratedSettingInfo &integratedSettingInfo = std::tr1::get <1> (GetParam ()); const CCSSettingType createSettingType = std::tr1::get <0> (GetParam ()); /* The GSettings Integrated setting takes ownership of these */ CCSIntegratedSettingInfo *integratedSetting = ccsSharedIntegratedSettingInfoNew (keyName.c_str (), keyName.c_str (), integratedSettingInfo.settingType, &ccsDefaultObjectAllocator); SpecialOptionType specialType = ccsTypeToSpecialType ()[integratedSettingInfo.settingType]; CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSetting = ccsGNOMEIntegratedSettingInfoNew (integratedSetting, specialType, keyName.c_str (), &ccsDefaultObjectAllocator); boost::shared_ptr gsettingsIntegrated (AutoDestroy (ccsGSettingsIntegratedSettingNew (gnomeIntegratedSetting, mWrapper.get (), &ccsDefaultObjectAllocator), ccsIntegratedSettingUnref)); GVariant *variant = (*integratedSettingInfo.variantGenerator) (); EXPECT_CALL (*mWrapperMock, getValue (Eq (keyName))).WillOnce (Return (variant)); CCSSettingValue *value = ccsIntegratedSettingReadValue (gsettingsIntegrated.get (), createSettingType); if (createSettingType == integratedSettingInfo.settingType) (*integratedSettingInfo.expectation) (value); else EXPECT_THAT (value, IsNull ()); if (value) ccsFreeSettingValueWithType (value, integratedSettingInfo.returnType); } ACTION (FreeVariant) { g_variant_unref (arg0); } TEST_P (CCSGSettingsIntegratedSettingTest, MatchedTypesReturnValueMismatchedTypesResetOrWrite) { const std::string keyName ("mock"); const ccit::GSettingsIntegratedSettingInfo &integratedSettingInfo = std::tr1::get <1> (GetParam ()); const CCSSettingType createSettingType = std::tr1::get <0> (GetParam ()); CCSIntegratedSettingInfo *integratedSetting = ccsSharedIntegratedSettingInfoNew (keyName.c_str (), keyName.c_str (), integratedSettingInfo.settingType, &ccsDefaultObjectAllocator); SpecialOptionType specialType = ccsTypeToSpecialType ()[integratedSettingInfo.settingType]; CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSetting = ccsGNOMEIntegratedSettingInfoNew (integratedSetting, specialType, keyName.c_str (), &ccsDefaultObjectAllocator); boost::shared_ptr gsettingsIntegrated (AutoDestroy (ccsGSettingsIntegratedSettingNew (gnomeIntegratedSetting, mWrapper.get (), &ccsDefaultObjectAllocator), ccsIntegratedSettingUnref)); boost::shared_ptr value ((*integratedSettingInfo.valueGenerator) (), boost::bind (ccsFreeSettingValueWithType, _1, integratedSettingInfo.returnType)); boost::shared_ptr variant = AutoDestroy (g_variant_ref ((*integratedSettingInfo.variantGenerator) ()), g_variant_unref); boost::shared_ptr newVariant = AutoDestroy (ccvg::fromValue (value.get (), integratedSettingInfo.settingType), g_variant_unref); EXPECT_CALL (*mWrapperMock, getValue (Eq (keyName))).WillOnce (Return (variant.get ())); if (createSettingType == integratedSettingInfo.settingType) EXPECT_CALL (*mWrapperMock, setValue (Eq (keyName), VariantEqual (newVariant.get ()))) .WillOnce (WithArgs <1> (FreeVariant ())); else EXPECT_CALL (*mWrapperMock, resetKey (Eq (keyName))); ccsIntegratedSettingWriteValue (gsettingsIntegrated.get (), value.get (), createSettingType); } INSTANTIATE_TEST_CASE_P (CCSGSettingsIntegratedSettingTestMismatchedValues, CCSGSettingsIntegratedSettingTest, Combine (Values (TypeInt, TypeString, TypeBool, TypeKey), ValuesIn (cciti::settingsInfo))); compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/tests/CMakeLists.txt0000644000015301777760000000307512321343002031527 0ustar pbusernogroup00000000000000include_directories (${GTEST_INCLUDE_DIRS}) include_directories (${CMAKE_SOURCE_DIR}/include) include_directories (${CMAKE_SOURCE_DIR}/tests/shared) include_directories (${CMAKE_SOURCE_DIR}/tests/shared/glib) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../../mocks/libcompizconfig) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../../gsettings/tests) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../../gsettings/mocks) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/tests) link_directories (${CMAKE_INSTALL_PREFIX}/lib) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../mocks/libcompizconfig) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../tests/) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../src/) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") add_executable (compizconfig_test_ccs_gnome_gsettings_integrated_setting ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_gnome_gsettings_integrated_setting.cpp) target_link_libraries (compizconfig_test_ccs_gnome_gsettings_integrated_setting ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_gsettings_settings_test_env compizconfig_ccs_gsettings_wrapper_mock compizconfig_gnome_integration_gsettings_integrated_setting compizconfig_gsettings_backend_interface) compiz_discover_tests (compizconfig_test_ccs_gnome_gsettings_integrated_setting COVERAGE compizconfig_gnome_integration_gsettings_integrated_setting) ././@LongLink0000000000000000000000000000015000000000000011211 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/org.compiz.integrated.gschema.xmlcompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/org.compiz.integrated.gschema.0000644000015301777760000000443212321343002033446 0ustar pbusernogroup00000000000000 true "gnome-screenshot -w" "gnome-screenshot" ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] "" "" "" "" "" "" "" "" "" "" "" "" ["<Alt>"] compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/CMakeLists.txt0000644000015301777760000000716112321343002030365 0ustar pbusernogroup00000000000000include (FindPkgConfig) if (USE_GSETTINGS) set (_deps glib-2.0>=2.20.0 gio-2.0>=2.25.0) compiz_pkg_check_modules (COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION ${_deps}) if (COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_FOUND) add_definitions (-DUSE_GCONF) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/libcompizconfig/include ${CMAKE_SOURCE_DIR}/compizconfig/gsettings/gsettings_backend_shared ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/gsettings/include ${COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_INCLUDE_DIRS}) link_directories (${CMAKE_BINARY_DIR}/compizconfig/libcompizconfig ${CMAKE_BINARY_DIR}/compizconfig/gsettings/gsettings_backend_shared ${CMAKE_BINARY_DIR}/compizconfig/integration/gnome ${COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_LIBRARY_DIRS}) add_library (compizconfig_gnome_integration_gsettings_integrated_setting STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integration_gsettings_integrated_setting.c) target_link_libraries (compizconfig_gnome_integration_gsettings_integrated_setting compizconfig_gnome_integrated_setting compizconfig_gnome_integration_constants compizconfig compizconfig_gsettings_util ${COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_LIBRARIES}) add_library (compizconfig_gnome_integration_gsettings_setting_factory STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integration_gsettings_integrated_setting_factory.c) target_link_libraries (compizconfig_gnome_integration_gsettings_setting_factory compizconfig_gsettings_wrapper_factory_interface compizconfig_gnome_integration_constants compizconfig_gnome_integrated_setting compizconfig_gnome_integration_gsettings_integrated_setting compizconfig compizconfig_gsettings_util ${COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_LIBRARIES}) add_library (compizconfig_gnome_integration_gsettings_wrapper_factory STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integration_gsettings_wrapper_factory.c) target_link_libraries (compizconfig_gnome_integration_gsettings_setting_factory compizconfig_gsettings_wrapper_factory_interface compizconfig ${COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_LIBRARIES}) find_program (GLIB_COMPILE_SCHEMAS glib-compile-schemas) if (GLIB_COMPILE_SCHEMAS) set (_integrated_gschema org.compiz.integrated) set (_integrated_gschema_file ${_integrated_gschema}.gschema.xml) set (_integrated_gschema_src ${CMAKE_CURRENT_SOURCE_DIR}/${_integrated_gschema_file}) set (_integrated_gschema_dest ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/${_integrated_gschema_file}) configure_file (${_integrated_gschema_src} ${_integrated_gschema_dest}) add_custom_command ( OUTPUT ${CMAKE_BINARY_DIR}/glib-2.0/schemas/gschemas.compiled COMMAND ${GLIB_COMPILE_SCHEMAS} --targetdir=${CMAKE_BINARY_DIR}/glib-2.0/schemas/ ${CMAKE_BINARY_DIR}/glib-2.0/schemas/ ) add_custom_target (compiz_gsettings_integrated_settings_schema ALL DEPENDS ${_integrated_gschema_src}) add_gsettings_schema_to_recompilation_list (compiz_gsettings_integrated_settings_schema) compiz_install_gsettings_schema (${_integrated_gschema_dest} ${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas) endif (GLIB_COMPILE_SCHEMAS) if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) endif (COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_FOUND) endif (USE_GSETTINGS) compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/src/0000755000015301777760000000000012321344021026411 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000017400000000000011217 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/src/ccs_gnome_integration_gsettings_wrapper_factory.ccompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/src/ccs_gnome_integration_gset0000644000015301777760000001161112321343002033714 0ustar pbusernogroup00000000000000/** * * GSettings libcompizconfig backend * * ccs_gnome_integration_gsettings_wrapper_factory.c * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #include #include "ccs_gsettings_wrapper_factory.h" #include "ccs_gsettings_wrapper_factory_interface.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_interface_wrapper.h" #include "ccs_gnome_integration_gsettings_wrapper_factory.h" /* CCSGSettingsWrapperFactory implementation */ typedef struct _CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate; struct _CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate { CCSGSettingsWrapperFactory *wrapperFactory; GCallback callback; /* This is expected to stay alive during the * lifetime of this object */ CCSGNOMEValueChangeData *data; }; static void ccsGNOMEIntegrationGSettingsWrapperFree (CCSGSettingsWrapperFactory *wrapperFactory) { CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate *priv = GET_PRIVATE (CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate, wrapperFactory); ccsGSettingsWrapperFactoryUnref (priv->wrapperFactory); ccsObjectFinalize (wrapperFactory); (*wrapperFactory->object.object_allocation->free_) (wrapperFactory->object.object_allocation->allocator, wrapperFactory); } static void connectWrapperToChangedSignal (CCSGSettingsWrapper *wrapper, CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate *priv) { ccsGSettingsWrapperConnectToChangedSignal (wrapper, priv->callback, priv->data); } static CCSGSettingsWrapper * ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapper (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, CCSObjectAllocationInterface *ai) { CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate *priv = GET_PRIVATE (CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate, factory); CCSGSettingsWrapper *wrapper = ccsGSettingsWrapperFactoryNewGSettingsWrapper (priv->wrapperFactory, schemaName, factory->object.object_allocation); if (wrapper != NULL) connectWrapperToChangedSignal (wrapper, priv); return wrapper; } static CCSGSettingsWrapper * ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapperWithPath (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, const gchar *path, CCSObjectAllocationInterface *ai) { CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate *priv = GET_PRIVATE (CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate, factory); CCSGSettingsWrapper *wrapper = ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath (priv->wrapperFactory, schemaName, path, factory->object.object_allocation); connectWrapperToChangedSignal (wrapper, priv); return wrapper; } const CCSGSettingsWrapperFactoryInterface ccsGNOMEIntegrationGSettingsWrapperFactoryInterface = { ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapper, ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapperWithPath, ccsGNOMEIntegrationGSettingsWrapperFree }; CCSGSettingsWrapperFactory * ccsGNOMEIntegrationGSettingsWrapperFactoryDefaultImplNew (CCSObjectAllocationInterface *ai, CCSGSettingsWrapperFactory *factory, GCallback callback, CCSGNOMEValueChangeData *data) { CCSGSettingsWrapperFactory *wrapperFactory = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsWrapperFactory)); if (!wrapperFactory) return NULL; CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate)); if (!priv) { (*ai->free_) (ai->allocator, wrapperFactory); return NULL; } ccsGSettingsWrapperFactoryRef (factory); priv->wrapperFactory = factory; priv->callback = callback; priv->data = data; ccsObjectInit (wrapperFactory, ai); ccsObjectAddInterface (wrapperFactory, (const CCSInterface *) &ccsGNOMEIntegrationGSettingsWrapperFactoryInterface, GET_INTERFACE_TYPE (CCSGSettingsWrapperFactoryInterface)); ccsObjectSetPrivate (wrapperFactory, (CCSPrivate *) priv); ccsGSettingsWrapperFactoryRef (wrapperFactory); return wrapperFactory; } ././@LongLink0000000000000000000000000000017700000000000011222 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/src/ccs_gnome_integration_gsettings_integrated_setting.ccompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/src/ccs_gnome_integration_gset0000644000015301777760000002476612321343002033733 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include #include #include "ccs_gnome_integration_gsettings_integrated_setting.h" #include "ccs_gnome_integrated_setting.h" #include "ccs_gnome_integration_constants.h" /* CCSGSettingsIntegratedSetting implementation */ typedef struct _CCSGSettingsIntegratedSettingPrivate CCSGSettingsIntegratedSettingPrivate; struct _CCSGSettingsIntegratedSettingPrivate { CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSetting; CCSGSettingsWrapper *wrapper; }; char * ccsGSettingsIntegratedSettingsTranslateOldGNOMEKeyForGSettings (const char *key) { char *newKey = translateKeyForGSettings (key); if (g_strcmp0 (newKey, "run-command-screenshot") == 0) { free (newKey); newKey = strdup ("screenshot"); } else if (g_strcmp0 (newKey, "run-command-window-screenshot") == 0) { free (newKey); newKey = strdup ("window-screenshot"); } else if (g_strcmp0 (newKey, "run-command-terminal") == 0) { free (newKey); newKey = strdup ("terminal"); } return newKey; } SpecialOptionType ccsGSettingsIntegratedSettingGetSpecialOptionType (CCSGNOMEIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsGNOMEIntegratedSettingInfoGetSpecialOptionType (priv->gnomeIntegratedSetting); } const char * ccsGSettingsIntegratedSettingGetGNOMEName (CCSGNOMEIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsGNOMEIntegratedSettingInfoGetGNOMEName (priv->gnomeIntegratedSetting); } CCSSettingValue * ccsGSettingsIntegratedSettingReadValue (CCSIntegratedSetting *setting, CCSSettingType type) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); CCSSettingValue *v = calloc (1, sizeof (CCSSettingValue)); const char *gnomeKeyName = ccsGNOMEIntegratedSettingInfoGetGNOMEName ((CCSGNOMEIntegratedSettingInfo *) setting); char *gsettingsTranslatedName = ccsGSettingsIntegratedSettingsTranslateOldGNOMEKeyForGSettings (gnomeKeyName); v->isListChild = FALSE; v->parent = NULL; v->refCount = 1; GVariant *variant = ccsGSettingsWrapperGetValue (priv->wrapper, gsettingsTranslatedName); if (!variant) { free (gsettingsTranslatedName); free (v); return NULL; } const GVariantType *variantType = G_VARIANT_TYPE (g_variant_get_type_string (variant)); switch (type) { case TypeInt: if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_INT32)) { ccsError ("Expected integer value"); free (v); v = NULL; break; } v->value.asInt = readIntFromVariant (variant); break; case TypeBool: if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_BOOLEAN)) { ccsError ("Expected boolean value"); free (v); v = NULL; break; } v->value.asBool = readBoolFromVariant (variant); break; case TypeString: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_STRING)) { ccsError ("Expected string value"); free (v); v = NULL; break; } const char *str = readStringFromVariant (variant); v->value.asString = strdup (str ? str : ""); break; } case TypeKey: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE ("as"))) { ccsError ("Expected array-of-string value"); free (v); v = NULL; break; } gsize len; const gchar **strv = g_variant_get_strv (variant, &len); if (strv) v->value.asString = strdup (strv[0] ? strv[0] : ""); else v->value.asString = strdup (""); g_free (strv); break; } default: g_assert_not_reached (); } g_variant_unref (variant); free (gsettingsTranslatedName); return v; } void ccsGSettingsIntegratedSettingWriteValue (CCSIntegratedSetting *setting, CCSSettingValue *v, CCSSettingType type) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); const char *gnomeKeyName = ccsGNOMEIntegratedSettingInfoGetGNOMEName ((CCSGNOMEIntegratedSettingInfo *) setting); char *gsettingsTranslatedName = ccsGSettingsIntegratedSettingsTranslateOldGNOMEKeyForGSettings (gnomeKeyName); GVariant *variant = ccsGSettingsWrapperGetValue (priv->wrapper, gsettingsTranslatedName); const GVariantType *variantType = g_variant_get_type (variant); GVariant *newVariant = NULL; if (!variant) { ccsError ("NULL encountered while reading GSettings value"); free (gsettingsTranslatedName); return; } switch (type) { case TypeInt: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_INT32)) ccsError ("Expected integer value"); else { int currentValue = readIntFromVariant (variant); if ((currentValue != v->value.asInt)) writeIntToVariant (v->value.asInt, &newVariant); } } break; case TypeBool: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_BOOLEAN)) ccsError ("Expected boolean value"); else { gboolean currentValue = readBoolFromVariant (variant); if ((currentValue != v->value.asBool)) writeBoolToVariant (v->value.asBool, &newVariant); } } break; case TypeString: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_STRING)) ccsError ("Expected string value"); else { const char *defaultValue = ""; const char *newValue = v->value.asString ? v->value.asString : defaultValue; gsize len = 0; const gchar *currentValue = g_variant_get_string (variant, &len); if (currentValue) { if (strcmp (currentValue, newValue) != 0) writeStringToVariant (newValue, &newVariant); } } } break; case TypeKey: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE ("as"))) ccsError ("Expected array-of-string value"); else { const char *defaultValue = ""; GVariantBuilder strvBuilder; g_variant_builder_init (&strvBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&strvBuilder, "s", v->value.asString ? v->value.asString : defaultValue); newVariant = g_variant_builder_end (&strvBuilder); } } break; default: g_assert_not_reached (); break; } /* g_settings_set_value consumes the reference */ if (newVariant) ccsGSettingsWrapperSetValue (priv->wrapper, gsettingsTranslatedName, newVariant); else ccsGSettingsWrapperResetKey (priv->wrapper, gsettingsTranslatedName); g_variant_unref (variant); free (gsettingsTranslatedName); } const char * ccsGSettingsIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsIntegratedSettingInfoPluginName ((CCSIntegratedSettingInfo *) priv->gnomeIntegratedSetting); } const char * ccsGSettingsIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsIntegratedSettingInfoSettingName ((CCSIntegratedSettingInfo *) priv->gnomeIntegratedSetting); } CCSSettingType ccsGSettingsIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsIntegratedSettingInfoGetType ((CCSIntegratedSettingInfo *) priv->gnomeIntegratedSetting); } void ccsGSettingsIntegratedSettingFree (CCSIntegratedSetting *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); if (priv->wrapper) ccsGSettingsWrapperUnref (priv->wrapper); ccsIntegratedSettingInfoUnref ((CCSIntegratedSettingInfo *) priv->gnomeIntegratedSetting); ccsObjectFinalize (setting); (*setting->object.object_allocation->free_) (setting->object.object_allocation->allocator, setting); } void ccsGSettingsIntegratedSettingInfoFree (CCSIntegratedSettingInfo *info) { return ccsGSettingsIntegratedSettingFree ((CCSIntegratedSetting *) info); } void ccsGSettingsGNOMEIntegratedSettingInfoFree (CCSGNOMEIntegratedSettingInfo *info) { return ccsGSettingsIntegratedSettingFree ((CCSIntegratedSetting *) info); } const CCSGNOMEIntegratedSettingInfoInterface ccsGSettingsGNOMEIntegratedSettingInterface = { ccsGSettingsIntegratedSettingGetSpecialOptionType, ccsGSettingsIntegratedSettingGetGNOMEName, ccsGSettingsGNOMEIntegratedSettingInfoFree }; const CCSIntegratedSettingInterface ccsGSettingsIntegratedSettingInterface = { ccsGSettingsIntegratedSettingReadValue, ccsGSettingsIntegratedSettingWriteValue, ccsGSettingsIntegratedSettingFree }; const CCSIntegratedSettingInfoInterface ccsGSettingsIntegratedSettingInfoInterface = { ccsGSettingsIntegratedSettingInfoPluginName, ccsGSettingsIntegratedSettingInfoSettingName, ccsGSettingsIntegratedSettingInfoGetType, ccsGSettingsIntegratedSettingInfoFree }; CCSIntegratedSetting * ccsGSettingsIntegratedSettingNew (CCSGNOMEIntegratedSettingInfo *base, CCSGSettingsWrapper *wrapper, CCSObjectAllocationInterface *ai) { CCSIntegratedSetting *setting = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSetting)); if (!setting) return NULL; CCSGSettingsIntegratedSettingPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsIntegratedSettingPrivate)); if (!priv) { (*ai->free_) (ai->allocator, priv); return NULL; } priv->gnomeIntegratedSetting = base; priv->wrapper = wrapper; ccsGSettingsWrapperRef (priv->wrapper); ccsObjectInit (setting, ai); ccsObjectSetPrivate (setting, (CCSPrivate *) priv); ccsObjectAddInterface (setting, (const CCSInterface *) &ccsGSettingsIntegratedSettingInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInterface)); ccsObjectAddInterface (setting, (const CCSInterface *) &ccsGSettingsIntegratedSettingInfoInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInfoInterface)); ccsObjectAddInterface (setting, (const CCSInterface *) &ccsGSettingsGNOMEIntegratedSettingInterface, GET_INTERFACE_TYPE (CCSGNOMEIntegratedSettingInfoInterface)); ccsIntegratedSettingRef (setting); return setting; } ././@LongLink0000000000000000000000000000020700000000000011214 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/src/ccs_gnome_integration_gsettings_integrated_setting_factory.ccompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/src/ccs_gnome_integration_gset0000644000015301777760000002366212321343002033725 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include #include #include #include #include "ccs_gnome_integration.h" #include "ccs_gnome_integrated_setting.h" #include "ccs_gnome_integration_constants.h" #include "ccs_gnome_integration_types.h" #include "ccs_gnome_integration_gsettings_integrated_setting.h" #include "ccs_gnome_integration_gsettings_integrated_setting_factory.h" char * ccsGSettingsIntegratedSettingsTranslateNewGNOMEKeyForCCS (const char *key) { char *newKey = translateKeyForCCS (key); if (g_strcmp0 (newKey, "screenshot") == 0) { free (newKey); newKey = strdup ("run_command_screenshot"); } else if (g_strcmp0 (newKey, "window_screenshot") == 0) { free (newKey); newKey = strdup ("run_command_window_screenshot"); } else if (g_strcmp0 (newKey, "terminal") == 0) { free (newKey); newKey = strdup ("run_command_terminal"); } return newKey; } typedef struct _CCSGSettingsIntegratedSettingFactoryPrivate CCSGSettingsIntegratedSettingFactoryPrivate; struct _CCSGSettingsIntegratedSettingFactoryPrivate { CCSGSettingsWrapperFactory *wrapperFactory; GHashTable *pluginsToSettingsGSettingsWrapperQuarksHashTable; GHashTable *quarksToGSettingsWrappersHashTable; GHashTable *pluginsToSettingsSpecialTypesHashTable; GHashTable *pluginsToSettingNameGNOMENameHashTable; CCSGNOMEValueChangeData *valueChangeData; }; static void gnomeGSettingsValueChanged (GSettings *settings, gchar *key, gpointer user_data) { CCSGNOMEValueChangeData *data = (CCSGNOMEValueChangeData *) user_data; char *baseName = ccsGSettingsIntegratedSettingsTranslateNewGNOMEKeyForCCS (key); /* We don't care if integration is not enabled */ if (!ccsGetIntegrationEnabled (data->context)) return; CCSIntegratedSettingList settingList = ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate (data->storage, ccsGNOMEIntegrationFindSettingsMatchingPredicate, baseName); ccsIntegrationUpdateIntegratedSettings (data->integration, data->context, settingList); g_free (baseName); } GCallback ccsGSettingsIntegratedSettingsChangeCallback () { return (GCallback) gnomeGSettingsValueChanged; } static CCSIntegratedSetting * createNewGSettingsIntegratedSetting (CCSGSettingsWrapper *wrapper, const char *gnomeName, const char *pluginName, const char *settingName, CCSSettingType type, SpecialOptionType specialOptionType, CCSObjectAllocationInterface *ai) { CCSIntegratedSettingInfo *sharedIntegratedSettingInfo = ccsSharedIntegratedSettingInfoNew (pluginName, settingName, type, ai); if (!sharedIntegratedSettingInfo) return NULL; CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSettingInfo = ccsGNOMEIntegratedSettingInfoNew (sharedIntegratedSettingInfo, specialOptionType, gnomeName, ai); if (!gnomeIntegratedSettingInfo) { ccsIntegratedSettingInfoUnref (sharedIntegratedSettingInfo); return NULL; } CCSIntegratedSetting *gsettingsIntegratedSetting = ccsGSettingsIntegratedSettingNew (gnomeIntegratedSettingInfo, wrapper, ai); if (!gsettingsIntegratedSetting) { ccsIntegratedSettingInfoUnref ((CCSIntegratedSettingInfo *) gnomeIntegratedSettingInfo); return NULL; } return gsettingsIntegratedSetting; } static void ccsGSettingsWrapperUnrefWrapper (gpointer wrapper) { ccsGSettingsWrapperUnref ((CCSGSettingsWrapper *) wrapper); } static GHashTable * initializeGSettingsWrappers (CCSGSettingsWrapperFactory *factory) { const CCSGSettingsWrapperIntegratedSchemasQuarks *quarks = ccsGNOMEGSettingsWrapperQuarks (); GHashTable *quarksToGSettingsWrappers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, ccsGSettingsWrapperUnrefWrapper); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_COMPIZ_INTEGRATED), factory->object.object_allocation)); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS), factory->object.object_allocation)); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES), factory->object.object_allocation)); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL), factory->object.object_allocation)); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS), factory->object.object_allocation)); return quarksToGSettingsWrappers; } CCSIntegratedSetting * ccsGSettingsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (CCSIntegratedSettingFactory *factory, CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type) { CCSGSettingsIntegratedSettingFactoryPrivate *priv = (CCSGSettingsIntegratedSettingFactoryPrivate *) ccsObjectGetPrivate (factory); GHashTable *settingsGSettingsWrapperQuarksHashTable = g_hash_table_lookup (priv->pluginsToSettingsGSettingsWrapperQuarksHashTable, pluginName); GHashTable *settingsSpecialTypesHashTable = g_hash_table_lookup (priv->pluginsToSettingsSpecialTypesHashTable, pluginName); GHashTable *settingsSettingNameGNOMENameHashTable = g_hash_table_lookup (priv->pluginsToSettingNameGNOMENameHashTable, pluginName); if (!priv->quarksToGSettingsWrappersHashTable) priv->quarksToGSettingsWrappersHashTable = initializeGSettingsWrappers (priv->wrapperFactory); if (settingsGSettingsWrapperQuarksHashTable && settingsSpecialTypesHashTable && settingsSettingNameGNOMENameHashTable) { GQuark wrapperQuark = GPOINTER_TO_INT (g_hash_table_lookup (settingsGSettingsWrapperQuarksHashTable, settingName)); CCSGSettingsWrapper *wrapper = g_hash_table_lookup (priv->quarksToGSettingsWrappersHashTable, GINT_TO_POINTER (wrapperQuark)); SpecialOptionType specialType = (SpecialOptionType) GPOINTER_TO_INT (g_hash_table_lookup (settingsSpecialTypesHashTable, settingName)); const gchar *integratedName = g_hash_table_lookup (settingsSettingNameGNOMENameHashTable, settingName); if (wrapper == NULL) return NULL; return createNewGSettingsIntegratedSetting (wrapper, integratedName, pluginName, settingName, type, specialType, factory->object.object_allocation); } return NULL; } void ccsGSettingsIntegratedSettingFactoryFree (CCSIntegratedSettingFactory *factory) { CCSGSettingsIntegratedSettingFactoryPrivate *priv = (CCSGSettingsIntegratedSettingFactoryPrivate *) ccsObjectGetPrivate (factory); if (priv->pluginsToSettingsGSettingsWrapperQuarksHashTable) g_hash_table_unref (priv->pluginsToSettingsGSettingsWrapperQuarksHashTable); if (priv->quarksToGSettingsWrappersHashTable) g_hash_table_unref (priv->quarksToGSettingsWrappersHashTable); if (priv->pluginsToSettingsSpecialTypesHashTable) g_hash_table_unref (priv->pluginsToSettingsSpecialTypesHashTable); if (priv->pluginsToSettingNameGNOMENameHashTable) g_hash_table_unref (priv->pluginsToSettingNameGNOMENameHashTable); ccsGSettingsWrapperFactoryUnref (priv->wrapperFactory); ccsObjectFinalize (factory); (*factory->object.object_allocation->free_) (factory->object.object_allocation->allocator, factory); } const CCSIntegratedSettingFactoryInterface ccsGSettingsIntegratedSettingFactoryInterface = { ccsGSettingsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType, ccsGSettingsIntegratedSettingFactoryFree }; CCSIntegratedSettingFactory * ccsGSettingsIntegratedSettingFactoryNew (CCSGSettingsWrapperFactory *wrapperFactory, CCSGNOMEValueChangeData *valueChangeData, CCSObjectAllocationInterface *ai) { CCSIntegratedSettingFactory *factory = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingFactory)); if (!factory) return NULL; CCSGSettingsIntegratedSettingFactoryPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsIntegratedSettingFactoryPrivate)); if (!priv) { (*ai->free_) (ai->allocator, factory); return NULL; } ccsGSettingsWrapperFactoryRef (wrapperFactory); priv->wrapperFactory = wrapperFactory; priv->pluginsToSettingsGSettingsWrapperQuarksHashTable = ccsGNOMEGSettingsIntegrationPopulateSettingNameToIntegratedSchemasQuarksHashTable (); priv->pluginsToSettingsSpecialTypesHashTable = ccsGNOMEIntegrationPopulateSpecialTypesHashTables (); priv->pluginsToSettingNameGNOMENameHashTable = ccsGNOMEIntegrationPopulateSettingNameToGNOMENameHashTables (); priv->valueChangeData = valueChangeData; ccsObjectInit (factory, ai); ccsObjectSetPrivate (factory, (CCSPrivate *) priv); ccsObjectAddInterface (factory, (const CCSInterface *) &ccsGSettingsIntegratedSettingFactoryInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingFactoryInterface)); ccsObjectRef (factory); return factory; } compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/include/0000755000015301777760000000000012321344021027245 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000020000000000000011205 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/include/ccs_gnome_integration_gsettings_wrapper_factory.hcompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/include/ccs_gnome_integration_0000644000015301777760000000237012321343002033667 0ustar pbusernogroup00000000000000/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory.h * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #ifndef _CCS_GNOME_INTEGRATION_GSETTINGS_WRAPPER_FACTORY_H #define _CCS_GNOME_INTEGRATION_GSETTINGS_WRAPPER_FACTORY_H #include COMPIZCONFIG_BEGIN_DECLS #include #include #include #include CCSGSettingsWrapperFactory * ccsGNOMEIntegrationGSettingsWrapperFactoryDefaultImplNew (CCSObjectAllocationInterface *ai, CCSGSettingsWrapperFactory *factory, GCallback callback, CCSGNOMEValueChangeData *data); COMPIZCONFIG_END_DECLS #endif ././@LongLink0000000000000000000000000000020300000000000011210 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/include/ccs_gnome_integration_gsettings_integrated_setting.hcompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/include/ccs_gnome_integration_0000644000015301777760000000210712321343002033665 0ustar pbusernogroup00000000000000#ifndef _CCS_GNOME_GSETTINGS_INTEGRATED_SETTING_H #define _CCS_GNOME_GSETTINGS_INTEGRATED_SETTING_H #include #include #include #include COMPIZCONFIG_BEGIN_DECLS /** * @brief ccsGSettingsIntegratedSettingNew * @param base * @param wrapper * @param ai * @return * * The GSettings implementation of CCSIntegratedSetting *, which will * write using a CCSGSettingsWrapper * object when the read and write * methods are called. */ CCSIntegratedSetting * ccsGSettingsIntegratedSettingNew (CCSGNOMEIntegratedSettingInfo *base, CCSGSettingsWrapper *wrapper, CCSObjectAllocationInterface *ai); /** * @brief ccsGSettingsIntegratedSettingsTranslateOldGNOMEKeyForGSettings * @param key the old style gnome key to translate * @return new-style key. Caller should free * * This translates old style keys (eg foo_bar) to new style keys * foo-bar and special cases a few keys */ char * ccsGSettingsIntegratedSettingsTranslateOldGNOMEKeyForGSettings (const char *key); COMPIZCONFIG_END_DECLS #endif ././@LongLink0000000000000000000000000000021300000000000011211 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/include/ccs_gnome_integration_gsettings_integrated_setting_factory.hcompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/gsettings/include/ccs_gnome_integration_0000644000015301777760000000252212321343002033666 0ustar pbusernogroup00000000000000#ifndef _CCS_GNOME_GSETTINGS_INTEGRATED_SETTING_FACTORY_H #define _CCS_GNOME_GSETTINGS_INTEGRATED_SETTING_FACTORY_H #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS /** * @brief ccsGSettingsIntegratedSettingsTranslateNewGNOMEKeyForCCS * @param key the old style gnome key to translate * @return new-style key. Caller should free * * This translates new style keys (eg foo-bar) to old style keys * foo_bar and special cases a few keys */ char * ccsGSettingsIntegratedSettingsTranslateNewGNOMEKeyForCCS (const char *key); /** * @brief ccsGSettingsIntegratedSettingsChangeCallback * @return callback for settings change data * * This returns the default callback used for settings changes * * TODO: This API doesn't make a whole lot of sense, but we need * it if we want to inject CCSGSettingsWrapperFactory into * ccsGSettingsIntegratedSettingFactoryNew. * * The return type is GCallback to hide the details of this function * from callers */ GCallback ccsGSettingsIntegratedSettingsChangeCallback (); CCSIntegratedSettingFactory * ccsGSettingsIntegratedSettingFactoryNew (CCSGSettingsWrapperFactory *wrapperFactory, CCSGNOMEValueChangeData *data, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/tests/0000755000015301777760000000000012321344021024755 5ustar pbusernogroup00000000000000././@LongLink0000000000000000000000000000017700000000000011222 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/tests/compizconfig_ccs_mock_gnome_integrated_setting_composition.hcompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/tests/compizconfig_ccs_mock_gnome_integr0000644000015301777760000000261412321343002033766 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_MOCK_GNOME_INTEGRATED_SETTING_COMPOSITION_H #define _COMPIZCONFIG_CCS_MOCK_GNOME_INTEGRATED_SETTING_COMPOSITION_H #include #include #include COMPIZCONFIG_BEGIN_DECLS CCSIntegratedSetting * ccsMockCompositionIntegratedSettingNew (CCSIntegratedSetting *integratedSetting, CCSGNOMEIntegratedSettingInfo *gnomeInfo, CCSIntegratedSettingInfo *settingInfo, CCSObjectAllocationInterface *allocator); COMPIZCONFIG_END_DECLS #endif ././@LongLink0000000000000000000000000000015600000000000011217 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/tests/compizconfig_test_ccs_gnome_integration.cppcompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/tests/compizconfig_test_ccs_gnome_integr0000644000015301777760000011265712321343002034025 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "compizconfig_ccs_mock_gnome_integrated_setting_composition.h" #include "compizconfig_ccs_setting_value_matcher.h" namespace cc = compiz::config; namespace cci = compiz::config::impl; using ::testing::Pointee; using ::testing::Eq; using ::testing::Return; using ::testing::ReturnNull; using ::testing::SetArgPointee; using ::testing::DoAll; using ::testing::Values; using ::testing::WithParamInterface; using ::testing::_; namespace { typedef std::tr1::tuple > IntegratedSettingWithMock; typedef boost::shared_ptr IntegratedSettingWithMockPtr; IntegratedSettingWithMockPtr createIntegratedSettingCompositionFromMock (const std::string &plugin, const std::string &setting, CCSSettingType type, SpecialOptionType gnomeType, const std::string &gnomeName, CCSObjectAllocationInterface *allocator) { CCSIntegratedSettingInfo *integratedSettingInfo = ccsSharedIntegratedSettingInfoNew (plugin.c_str (), setting.c_str (), type, allocator); /* This takes ownership of integratedSettingInfo */ CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSettingInfo = ccsGNOMEIntegratedSettingInfoNew (integratedSettingInfo, gnomeType, gnomeName.c_str (), allocator); CCSIntegratedSetting *integratedSetting = ccsMockIntegratedSettingNew (allocator); CCSIntegratedSettingGMock *mockPtr = GET_PRIVATE (CCSIntegratedSettingGMock, integratedSetting) CCSIntegratedSettingGMock &mock (*mockPtr); boost::shared_ptr composition = AutoDestroy (ccsMockCompositionIntegratedSettingNew (integratedSetting, gnomeIntegratedSettingInfo, integratedSettingInfo, allocator), ccsIntegratedSettingUnref); /* We want the composition to take ownership here, so unref the * original members of the composition */ ccsGNOMEIntegratedSettingInfoUnref (gnomeIntegratedSettingInfo); ccsIntegratedSettingUnref (integratedSetting); return boost::make_shared (mock, composition); } CCSIntegratedSettingGMock & Mock (IntegratedSettingWithMock &integratedSettingWithMocks) { return std::tr1::get <0> (integratedSettingWithMocks); } CCSIntegratedSetting * Real (IntegratedSettingWithMock &integratedSettingWithMocks) { return std::tr1::get <1> (integratedSettingWithMocks).get (); } typedef std::tr1::tuple , boost::shared_ptr , CCSIntegratedSettingsStorage *, CCSIntegratedSettingFactory *, boost::shared_ptr > CCSGNOMEIntegrationWithMocks; CCSGNOMEIntegrationWithMocks createIntegrationWithMocks (CCSObjectAllocationInterface *ai) { boost::shared_ptr context (AutoDestroy (ccsMockContextNew (), ccsFreeContext)); boost::shared_ptr backend (AutoDestroy (ccsMockBackendNew (), ccsFreeMockBackend)); /* The GNOME Integration backend takes ownership of these two */ CCSIntegratedSettingsStorage *storage (ccsMockIntegratedSettingsStorageNew (ai)); CCSIntegratedSettingFactory *factory (ccsMockIntegratedSettingFactoryNew (ai)); boost::shared_ptr integration (AutoDestroy (ccsGNOMEIntegrationBackendNew (backend.get (), context.get (), factory, storage, ai), ccsIntegrationUnref)); CCSContextGMock &gmockContext = *(reinterpret_cast (ccsObjectGetPrivate (context.get ()))); CCSBackendGMock &gmockBackend = *(reinterpret_cast (ccsObjectGetPrivate (backend.get ()))); CCSIntegratedSettingsStorageGMock &gmockStorage = *(reinterpret_cast (ccsObjectGetPrivate (storage))); CCSIntegratedSettingFactoryGMock &gmockFactory = *(reinterpret_cast (ccsObjectGetPrivate (factory))); return CCSGNOMEIntegrationWithMocks (gmockContext, gmockBackend, gmockStorage, gmockFactory, context, backend, storage, factory, integration); } CCSIntegration * Real (CCSGNOMEIntegrationWithMocks &integrationWithMocks) { return std::tr1::get <8> (integrationWithMocks).get (); } CCSContextGMock & MockContext (CCSGNOMEIntegrationWithMocks &integrationWithMocks) { return std::tr1::get <0> (integrationWithMocks); } CCSIntegratedSettingsStorageGMock & MockStorage (CCSGNOMEIntegrationWithMocks &integrationWithMocks) { return std::tr1::get <2> (integrationWithMocks); } void IgnoreRegistration (CCSIntegratedSettingsStorageGMock &storage) { EXPECT_CALL (storage, empty ()).WillOnce (Return (FALSE)); } void AllowReadability (CCSSettingGMock &setting) { EXPECT_CALL (setting, isReadableByBackend ()).WillOnce (Return (TRUE)); } void ExpectWriteSettings (CCSContextGMock &context) { EXPECT_CALL (context, writeChangedSettings ()); } void SetNames (CCSSettingGMock &setting, CCSPluginGMock &plugin, const std::string &settingName, const std::string &pluginName) { EXPECT_CALL (setting, getName ()).WillOnce (Return (settingName.c_str ())); EXPECT_CALL (setting, getParent ()); EXPECT_CALL (plugin, getName ()).WillOnce (Return (pluginName.c_str ())); } void SetTypeInfo (CCSSettingGMock &setting, CCSSettingType type, CCSSettingInfo *info) { EXPECT_CALL (setting, getType ()).WillOnce (Return (type)); EXPECT_CALL (setting, getInfo ()).WillOnce (Return (info)); } CCSSettingValue * MakeSettingValue () { CCSSettingValue *v = reinterpret_cast (calloc (1, sizeof (CCSSettingValue))); v->parent = NULL; v->isListChild = FALSE; v->refCount = 1; return v; } boost::shared_ptr MakeAutoDestroySettingValue (CCSSettingType type) { CCSSettingValue *v = reinterpret_cast (calloc (1, sizeof (CCSSettingValue))); v->parent = NULL; v->isListChild = FALSE; v->refCount = 1; return boost::shared_ptr (v, boost::bind (ccsFreeSettingValueWithType, _1, type)); } const std::string MOCK_PLUGIN ("mock"); const std::string MOCK_SETTING ("mock"); const std::string MOCK_GNOME_NAME ("mock"); const CCSSettingType MOCK_SETTING_TYPE = TypeInt; const SpecialOptionType MOCK_GNOME_SETTING_TYPE = OptionInt; } TEST (CCSGNOMEIntegrationTest, TestConstructComposition) { IntegratedSettingWithMockPtr settingWithMock ( createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, MOCK_SETTING, MOCK_SETTING_TYPE, MOCK_GNOME_SETTING_TYPE, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator)); } class CCSGNOMEIntegrationTestWithMocks : public ::testing::Test { public: CCSGNOMEIntegrationTestWithMocks () : mIntegration (createIntegrationWithMocks (&ccsDefaultObjectAllocator)), mSetting (AutoDestroy (ccsMockSettingNew (), ccsSettingUnref)), mSettingMock ((*(reinterpret_cast (ccsObjectGetPrivate (mSetting.get ()))))), mIntegratedSetting (), mPlugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), mPluginMock ((*(reinterpret_cast (ccsObjectGetPrivate (mPlugin.get ()))))) { ON_CALL (mSettingMock, getParent ()).WillByDefault (Return (mPlugin.get ())); } protected: CCSGNOMEIntegrationWithMocks mIntegration; boost::shared_ptr mSetting; CCSSettingGMock &mSettingMock; IntegratedSettingWithMockPtr mIntegratedSetting; boost::shared_ptr mPlugin; CCSPluginGMock &mPluginMock; }; class CCSGNOMEIntegrationTestReadIntegrated : public CCSGNOMEIntegrationTestWithMocks { public: virtual void SetUp () { IgnoreRegistration (MockStorage (mIntegration)); AllowReadability (mSettingMock); } }; class CCSGNOMEIntegrationTestWriteIntegrated : public CCSGNOMEIntegrationTestWithMocks { public: virtual void SetUp () { IgnoreRegistration (MockStorage (mIntegration)); ExpectWriteSettings (MockContext (mIntegration)); } }; TEST_F (CCSGNOMEIntegrationTestWithMocks, TestConstructGNOMEIntegration) { } TEST_F (CCSGNOMEIntegrationTestWithMocks, TestGetIntegratedSettingFromStorage) { mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, MOCK_SETTING, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); CCSIntegratedSettingList returnIntegratedSettings = ccsIntegratedSettingListAppend (NULL, Real (*mIntegratedSetting)); CCSIntegratedSettingsStorageGMock &mockStorage (MockStorage (mIntegration)); EXPECT_CALL (mockStorage, empty ()).WillOnce (Return (FALSE)); EXPECT_CALL (mockStorage, findMatchingSettingsByPluginAndSettingName (Eq (MOCK_PLUGIN), Eq (MOCK_SETTING))) .WillOnce (Return (returnIntegratedSettings)); EXPECT_EQ (Real (*mIntegratedSetting), ccsIntegrationGetIntegratedSetting (Real (mIntegration), MOCK_PLUGIN.c_str (), MOCK_SETTING.c_str ())); } TEST_F (CCSGNOMEIntegrationTestReadIntegrated, TestReadInKeyOption) { CCSSettingValue *v = MakeSettingValue (); v->value.asString = strdup ("a"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, MOCK_SETTING, TypeKey, OptionKey, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); CCSSettingKeyValue keyValue; ASSERT_TRUE (ccsStringToKeyBinding (v->value.asString, &keyValue)); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeKey)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setKey (Eq (keyValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSGNOMEIntegrationTestReadIntegrated, TestReadInSpecialOptionCurrentViewport) { const std::string settingName ("current_viewport"); CCSSettingValue *v = MakeSettingValue (); v->value.asBool = FALSE; mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeBool)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setBool (IsTrue (), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSGNOMEIntegrationTestReadIntegrated, TestReadInSpecialOptionFullscreenVisualBell) { const std::string settingName ("fullscreen_visual_bell"); CCSSettingValue *v = MakeSettingValue (); v->value.asString = strdup ("fullscreen"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeString, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeString)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setBool (IsTrue (), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSGNOMEIntegrationTestReadIntegrated, TestReadInSpecialOptionClickToFocus) { const std::string settingName ("click_to_focus"); CCSSettingValue *v = MakeSettingValue (); v->value.asString = strdup ("click"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeString, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeString)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setBool (IsTrue (), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } namespace { struct IntegratedMediaKeysParam { public: IntegratedMediaKeysParam (const std::string &settingName, const std::string &integratedName, const std::string &keyValueString) : settingName (settingName), integratedName (integratedName), keyValueString (keyValueString) { EXPECT_TRUE (ccsStringToKeyBinding (keyValueString.c_str (), &keyValue)); } const std::string settingName; const std::string integratedName; const std::string keyValueString; CCSSettingKeyValue keyValue; }; } namespace { std::string RUN_COMMAND_SCREENSHOT_KEY ("run_command_screenshot_key"); std::string SCREENSHOT ("screenshot"); std::string SCREENSHOT_BINDING ("Print"); std::string RUN_COMMAND_WINDOW_SCREENSHOT_KEY ("run_command_window_screenshot_key"); std::string WINDOW_SCREENSHOT ("window_screenshot"); std::string WINDOW_SCREENSHOT_BINDING ("Print"); std::string RUN_COMMAND_TERMINAL_KEY ("run_command_terminal_key"); std::string TERMINAL ("terminal"); std::string TERMINAL_BINDING ("t"); } class CCSGNOMEIntegrationTestReadIntegratedMediaKeys : public CCSGNOMEIntegrationTestReadIntegrated, public WithParamInterface { }; TEST_P (CCSGNOMEIntegrationTestReadIntegratedMediaKeys, TestReadIntegratedMediaKey) { const std::string settingName (GetParam ().settingName); CCSSettingValue *v = MakeSettingValue (); v->value.asString = strdup (GetParam ().keyValueString.c_str ()); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeString, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeString)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setKey (Eq (GetParam ().keyValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } INSTANTIATE_TEST_CASE_P (CCSGNOMEMediaKeys, CCSGNOMEIntegrationTestReadIntegratedMediaKeys, Values (IntegratedMediaKeysParam (RUN_COMMAND_SCREENSHOT_KEY, SCREENSHOT, SCREENSHOT_BINDING), IntegratedMediaKeysParam (RUN_COMMAND_WINDOW_SCREENSHOT_KEY, WINDOW_SCREENSHOT, WINDOW_SCREENSHOT_BINDING), IntegratedMediaKeysParam (RUN_COMMAND_TERMINAL_KEY, TERMINAL, TERMINAL_BINDING))); namespace { const std::string DEFAULT_MOUSE_BUTTON_MODIFIERS_STRING (""); const std::string GNOME_MOUSE_BUTTON_MODIFIERS_STRING (""); const unsigned int DEFAULT_MOUSE_BUTTON_MODIFIERS = ccsStringToModifiers (DEFAULT_MOUSE_BUTTON_MODIFIERS_STRING.c_str ()); const unsigned int GNOME_MOUSE_BUTTON_MODIFIERS = ccsStringToModifiers (GNOME_MOUSE_BUTTON_MODIFIERS_STRING.c_str ()); const unsigned int LEFT_BUTTON = 1; const unsigned int MIDDLE_BUTTON = 2; const unsigned int RIGHT_BUTTON = 3; } class CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers { public: virtual ~CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers () {} CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers () : mIntegratedSettingMBM (AutoDestroy (ccsMockIntegratedSettingNew (&ccsDefaultObjectAllocator), ccsIntegratedSettingUnref)), mIntegratedSettingMBMMock (*(reinterpret_cast (ccsObjectGetPrivate (mIntegratedSettingMBM.get ())))), mIntegratedSettingResizeWithRB (AutoDestroy (ccsMockIntegratedSettingNew (&ccsDefaultObjectAllocator), ccsIntegratedSettingUnref)), mIntegratedSettingResizeWithRBMock (*(reinterpret_cast (ccsObjectGetPrivate (mIntegratedSettingResizeWithRB.get ())))) { memset (&mButtonValue, 0, sizeof (CCSSettingButtonValue)); mButtonValue.button = MIDDLE_BUTTON; mButtonValue.buttonModMask = DEFAULT_MOUSE_BUTTON_MODIFIERS; mButtonValue.edgeMask = 0; } virtual void GnomeSetUp (CCSGNOMEIntegrationWithMocks &integration) { /* Create new lists as we expect the caller to free them once it * has retreived them */ CCSIntegratedSettingList integratedSettingsMBM = ccsIntegratedSettingListAppend (NULL, mIntegratedSettingMBM.get ()); CCSIntegratedSettingList integratedSettingsResizeWithRB = ccsIntegratedSettingListAppend (NULL, mIntegratedSettingResizeWithRB.get ()); EXPECT_CALL (MockStorage (integration), findMatchingSettingsByPluginAndSettingName (Eq (std::string (ccsGNOMEIntegratedPluginNames.SPECIAL)), Eq (std::string (ccsGNOMEIntegratedSettingNames.NULL_MOUSE_BUTTON_MODIFIER.compizName)))) .WillOnce (Return (integratedSettingsMBM)); EXPECT_CALL (MockStorage (integration), findMatchingSettingsByPluginAndSettingName (Eq (std::string (ccsGNOMEIntegratedPluginNames.SPECIAL)), Eq (std::string (ccsGNOMEIntegratedSettingNames.NULL_RESIZE_WITH_RIGHT_BUTTON.compizName)))) .WillOnce (Return (integratedSettingsResizeWithRB)); } protected: boost::shared_ptr mIntegratedSettingMBM; CCSIntegratedSettingGMock &mIntegratedSettingMBMMock; boost::shared_ptr mIntegratedSettingResizeWithRB; CCSIntegratedSettingGMock &mIntegratedSettingResizeWithRBMock; CCSSettingButtonValue mButtonValue; }; class CCSGNOMEIntegrationTestWithMocksReadIntegratedMouseButtonModifiers : public CCSGNOMEIntegrationTestReadIntegrated, public CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers { public: virtual void SetUp () { CCSSettingValue *vRB = MakeSettingValue (); CCSSettingValue *vMBM = MakeSettingValue (); vRB->value.asBool = TRUE; vMBM->value.asString = strdup (GNOME_MOUSE_BUTTON_MODIFIERS_STRING.c_str ()); CCSGNOMEIntegrationTestReadIntegrated::SetUp (); CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers::GnomeSetUp (mIntegration); EXPECT_CALL (mSettingMock, getButton (_)) .WillOnce (DoAll ( SetArgPointee <0> ( mButtonValue), Return (TRUE))); /* Get the GNOME Mouse button modifier */ EXPECT_CALL (mIntegratedSettingMBMMock, readValue (TypeString)).WillOnce (Return (vMBM)); EXPECT_CALL (mIntegratedSettingResizeWithRBMock, readValue (TypeBool)).WillOnce (Return (vRB)); } }; class CCSGNOMEIntegrationTestWithMocksWriteIntegratedMouseButtonModifiers : public CCSGNOMEIntegrationTestWriteIntegrated, public CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers { public: CCSGNOMEIntegrationTestWithMocksWriteIntegratedMouseButtonModifiers () : corePlugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), corePluginMock (*(reinterpret_cast (ccsObjectGetPrivate (corePlugin.get ())))), resizePlugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), resizePluginMock (*(reinterpret_cast (ccsObjectGetPrivate (resizePlugin.get ())))), movePlugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), movePluginMock (*(reinterpret_cast (ccsObjectGetPrivate (movePlugin.get ())))), resizeInitiateButtonSetting (AutoDestroy (ccsMockSettingNew (), ccsSettingUnref)), resizeInitiateButtonSettingMock (*(reinterpret_cast (ccsObjectGetPrivate (resizeInitiateButtonSetting.get ())))), moveInitiateButtonSetting (AutoDestroy (ccsMockSettingNew (), ccsSettingUnref)), moveInitiateButtonSettingMock (*(reinterpret_cast (ccsObjectGetPrivate (moveInitiateButtonSetting.get ())))), coreWindowMenuSetting (AutoDestroy (ccsMockSettingNew (), ccsSettingUnref)), coreWindowMenuSettingMock (*(reinterpret_cast (ccsObjectGetPrivate (coreWindowMenuSetting.get ())))), resizeInitiateButton (MakeAutoDestroySettingValue (TypeButton)), moveInitiateButton (MakeAutoDestroySettingValue (TypeButton)), coreWindowMenuButton (MakeAutoDestroySettingValue (TypeButton)) { resizeInitiateButton->value.asButton.button = LEFT_BUTTON; resizeInitiateButton->value.asButton.buttonModMask = 0; resizeInitiateButton->value.asButton.edgeMask = 0; moveInitiateButton->value.asButton.button = LEFT_BUTTON; moveInitiateButton->value.asButton.buttonModMask = DEFAULT_MOUSE_BUTTON_MODIFIERS; moveInitiateButton->value.asButton.edgeMask = 0; coreWindowMenuButton->value.asButton.button = MIDDLE_BUTTON; coreWindowMenuButton->value.asButton.buttonModMask = 0; coreWindowMenuButton->value.asButton.edgeMask = 0; } virtual void SetUp () { CCSGNOMEIntegrationTestWriteIntegrated::SetUp (); CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers::GnomeSetUp (mIntegration); } protected: boost::shared_ptr corePlugin; CCSPluginGMock &corePluginMock; boost::shared_ptr resizePlugin; CCSPluginGMock &resizePluginMock; boost::shared_ptr movePlugin; CCSPluginGMock &movePluginMock; boost::shared_ptr resizeInitiateButtonSetting; CCSSettingGMock &resizeInitiateButtonSettingMock; boost::shared_ptr moveInitiateButtonSetting; CCSSettingGMock &moveInitiateButtonSettingMock; boost::shared_ptr coreWindowMenuSetting; CCSSettingGMock &coreWindowMenuSettingMock; boost::shared_ptr resizeInitiateButton; boost::shared_ptr moveInitiateButton; boost::shared_ptr coreWindowMenuButton; }; TEST_F (CCSGNOMEIntegrationTestWithMocksReadIntegratedMouseButtonModifiers, TestReadInSpecialOptionMoveInitiateButton) { const std::string settingName ("initiate_button"); const std::string pluginName ("move"); CCSSettingButtonValue newButtonValue = mButtonValue; newButtonValue.button = LEFT_BUTTON; newButtonValue.buttonModMask = GNOME_MOUSE_BUTTON_MODIFIERS; mIntegratedSetting = createIntegratedSettingCompositionFromMock (pluginName, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, pluginName); /* Set the new mouse button modifier */ EXPECT_CALL (mSettingMock, setButton (Eq (newButtonValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSGNOMEIntegrationTestWithMocksReadIntegratedMouseButtonModifiers, TestReadInSpecialOptionResizeInitiateButton) { const std::string settingName ("initiate_button"); const std::string pluginName ("resize"); CCSSettingButtonValue newButtonValue = mButtonValue; newButtonValue.button = RIGHT_BUTTON; newButtonValue.buttonModMask = GNOME_MOUSE_BUTTON_MODIFIERS; mIntegratedSetting = createIntegratedSettingCompositionFromMock (pluginName, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, pluginName); /* Set the new mouse button modifier */ EXPECT_CALL (mSettingMock, setButton (Eq (newButtonValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSGNOMEIntegrationTestWithMocksReadIntegratedMouseButtonModifiers, TestReadInSpecialOptionWhereIntegratedOptionReturnsNull) { const std::string settingName ("initiate_button"); const std::string pluginName ("move"); CCSSettingButtonValue newButtonValue = mButtonValue; newButtonValue.button = LEFT_BUTTON; /* Reading the gnome mouse button modifiers failed, so default to zero */ newButtonValue.buttonModMask = 0; /* Clear the old expectation */ ccsFreeSettingValueWithType (ccsIntegratedSettingReadValue (mIntegratedSettingMBM.get (), TypeString), TypeString); /* Now return null */ EXPECT_CALL (mIntegratedSettingMBMMock, readValue (TypeString)).WillOnce (ReturnNull ()); mIntegratedSetting = createIntegratedSettingCompositionFromMock (pluginName, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, pluginName); /* Set the new mouse button modifier */ EXPECT_CALL (mSettingMock, setButton (Eq (newButtonValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSGNOMEIntegrationTestWriteIntegrated, TestWriteCurrentViewport) { const std::string settingName ("current_viewport"); boost::shared_ptr compizValue (MakeAutoDestroySettingValue (TypeBool)); boost::shared_ptr gnomeValue (MakeAutoDestroySettingValue (TypeBool)); CCSSettingInfo info; compizValue->value.asBool = TRUE; gnomeValue->value.asBool = FALSE; mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); SetTypeInfo (mSettingMock, TypeBool, &info); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (compizValue.get ())); EXPECT_CALL (Mock (*mIntegratedSetting), writeValue (Pointee (SettingValueMatch (*gnomeValue, TypeBool, &info)), TypeBool)); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } TEST_F (CCSGNOMEIntegrationTestWriteIntegrated, TestWriteFullscreenVisualBell) { const std::string settingName ("fullscreen_visual_bell"); boost::shared_ptr compizValue (MakeAutoDestroySettingValue (TypeBool)); boost::shared_ptr gnomeValue (MakeAutoDestroySettingValue (TypeString)); CCSSettingInfo info; compizValue->value.asBool = TRUE; gnomeValue->value.asString = strdup ("fullscreen"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); SetTypeInfo (mSettingMock, TypeBool, &info); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (compizValue.get ())); EXPECT_CALL (Mock (*mIntegratedSetting), writeValue (Pointee (SettingValueMatch (*gnomeValue, TypeString, &info)), TypeString)); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } TEST_F (CCSGNOMEIntegrationTestWriteIntegrated, TestWriteClickToFocus) { const std::string settingName ("click_to_focus"); boost::shared_ptr compizValue (MakeAutoDestroySettingValue (TypeBool)); boost::shared_ptr gnomeValue (MakeAutoDestroySettingValue (TypeString)); CCSSettingInfo info; compizValue->value.asBool = TRUE; gnomeValue->value.asString = strdup ("click"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); SetTypeInfo (mSettingMock, TypeBool, &info); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (compizValue.get ())); EXPECT_CALL (Mock (*mIntegratedSetting), writeValue (Pointee (SettingValueMatch (*gnomeValue, TypeString, &info)), TypeString)); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } class CCSGNOMEIntegrationTestWriteIntegratedMediaKeys : public CCSGNOMEIntegrationTestWriteIntegrated, public WithParamInterface { }; TEST_P (CCSGNOMEIntegrationTestWriteIntegratedMediaKeys, TestWriteIntegratedMediaKey) { const std::string settingName (GetParam ().settingName); boost::shared_ptr compizValue (MakeAutoDestroySettingValue (TypeKey)); boost::shared_ptr gnomeValue (MakeAutoDestroySettingValue (TypeString)); CCSSettingInfo info; compizValue->value.asKey = GetParam ().keyValue; gnomeValue->value.asString = strdup (GetParam ().keyValueString.c_str ()); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeString, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); SetTypeInfo (mSettingMock, TypeKey, &info); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (compizValue.get ())); EXPECT_CALL (Mock (*mIntegratedSetting), writeValue (Pointee (SettingValueMatch (*gnomeValue, TypeString, &info)), TypeString)); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } INSTANTIATE_TEST_CASE_P (CCSGNOMEMediaKeys, CCSGNOMEIntegrationTestWriteIntegratedMediaKeys, Values (IntegratedMediaKeysParam (RUN_COMMAND_SCREENSHOT_KEY, SCREENSHOT, SCREENSHOT_BINDING), IntegratedMediaKeysParam (RUN_COMMAND_WINDOW_SCREENSHOT_KEY, WINDOW_SCREENSHOT, WINDOW_SCREENSHOT_BINDING), IntegratedMediaKeysParam (RUN_COMMAND_TERMINAL_KEY, TERMINAL, TERMINAL_BINDING))); /* * TODO: Break up the function that this test covers. Its way too complicated */ TEST_F (CCSGNOMEIntegrationTestWithMocksWriteIntegratedMouseButtonModifiers, TestWriteMouseButtonModifier) { const std::string moveSettingName ("initiate_button"); const std::string movePluginName ("move"); const std::string resizeSettingName ("initiate_button"); const std::string resizePluginName ("resize"); const std::string coreSettingName ("window_menu_button"); const std::string corePluginName ("core"); const std::string settingName (moveSettingName); const std::string pluginName (movePluginName); CCSSettingInfo info; mIntegratedSetting = createIntegratedSettingCompositionFromMock (pluginName, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, pluginName); SetTypeInfo (mSettingMock, TypeButton, &info); EXPECT_CALL (MockContext (mIntegration), findPlugin (Eq (movePluginName))).WillRepeatedly (Return (movePlugin.get ())); EXPECT_CALL (movePluginMock, findSetting (Eq (moveSettingName))).WillRepeatedly (Return (moveInitiateButtonSetting.get ())); EXPECT_CALL (moveInitiateButtonSettingMock, getType ()).WillRepeatedly (Return (TypeButton)); EXPECT_CALL (moveInitiateButtonSettingMock, getValue ()).WillRepeatedly (Return (moveInitiateButton.get ())); EXPECT_CALL (MockContext (mIntegration), findPlugin (Eq (resizePluginName))).WillRepeatedly (Return (resizePlugin.get ())); EXPECT_CALL (resizePluginMock, findSetting (Eq (resizeSettingName))).WillRepeatedly (Return (resizeInitiateButtonSetting.get ())); EXPECT_CALL (resizeInitiateButtonSettingMock, getType ()).WillRepeatedly (Return (TypeButton)); EXPECT_CALL (resizeInitiateButtonSettingMock, getValue ()).WillRepeatedly (Return (resizeInitiateButton.get ())); EXPECT_CALL (MockContext (mIntegration), findPlugin (Eq (corePluginName))).WillRepeatedly (Return (corePlugin.get ())); EXPECT_CALL (corePluginMock, findSetting (Eq (coreSettingName))).WillRepeatedly (Return (coreWindowMenuSetting.get ())); EXPECT_CALL (coreWindowMenuSettingMock, getType ()).WillRepeatedly (Return (TypeButton)); EXPECT_CALL (coreWindowMenuSettingMock, getValue ()).WillRepeatedly (Return (coreWindowMenuButton.get ())); boost::shared_ptr newResizeWithRBValue (MakeAutoDestroySettingValue (TypeBool)); newResizeWithRBValue->value.asBool = TRUE; EXPECT_CALL (mIntegratedSettingResizeWithRBMock, writeValue (Pointee (SettingValueMatch (*newResizeWithRBValue, TypeBool, &info)), TypeBool)); boost::shared_ptr newMBMValue (MakeAutoDestroySettingValue (TypeString)); newMBMValue->value.asString = strdup (DEFAULT_MOUSE_BUTTON_MODIFIERS_STRING.c_str ()); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (moveInitiateButton.get ())); EXPECT_CALL (mIntegratedSettingMBMMock, writeValue (Pointee (SettingValueMatch (*newMBMValue, TypeString, &info)), TypeString)); unsigned int modifiers = moveInitiateButton->value.asButton.buttonModMask; CCSSettingButtonValue newResizeInitiateButton; CCSSettingButtonValue newMoveInitiateButton; CCSSettingButtonValue newWindowMenuButton; memset (&newResizeInitiateButton, 0, sizeof (CCSSettingButtonValue)); memset (&newMoveInitiateButton, 0, sizeof (CCSSettingButtonValue)); memset (&newWindowMenuButton, 0, sizeof (CCSSettingButtonValue)); newResizeInitiateButton.button = RIGHT_BUTTON; newResizeInitiateButton.buttonModMask = modifiers; newMoveInitiateButton.button = LEFT_BUTTON; newMoveInitiateButton.buttonModMask = modifiers; newWindowMenuButton.button = MIDDLE_BUTTON; newWindowMenuButton.buttonModMask = modifiers; EXPECT_CALL (resizeInitiateButtonSettingMock, setButton (Eq (newResizeInitiateButton), IsTrue ())); /* The move button is exactly the same, so it is not updated */ EXPECT_CALL (moveInitiateButtonSettingMock, setButton (Eq (newMoveInitiateButton), IsTrue ())).Times (0); EXPECT_CALL (coreWindowMenuSettingMock, setButton (Eq (newWindowMenuButton), IsTrue ())); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/tests/CMakeLists.txt0000644000015301777760000000401512321343002027513 0ustar pbusernogroup00000000000000include_directories (${GTEST_INCLUDE_DIRS}) include_directories (${CMAKE_SOURCE_DIR}/include) include_directories (${CMAKE_SOURCE_DIR}/tests/shared) include_directories (${CMAKE_SOURCE_DIR}/tests/shared/glib) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../mocks/libcompizconfig) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../gsettings/tests) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../gsettings/mocks) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/tests) link_directories (${CMAKE_INSTALL_PREFIX}/lib) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") add_library (compizconfig_ccs_mock_gnome_integrated_setting_composition ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_mock_gnome_integrated_setting_composition.c) target_link_libraries (compizconfig_ccs_mock_gnome_integrated_setting_composition compizconfig_ccs_integrated_setting_mock compizconfig_gnome_integrated_setting compizconfig) add_executable (compizconfig_test_ccs_gnome_integration ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_gnome_integration.cpp) target_link_libraries (compizconfig_test_ccs_gnome_integration ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_backend_mock compizconfig_ccs_setting_mock compizconfig_ccs_plugin_mock compizconfig_ccs_list_wrapper compizconfig_ccs_setting_value_operators compizconfig_ccs_setting_value_matcher compizconfig_ccs_integrated_setting_mock compizconfig_ccs_integrated_setting_factory_mock compizconfig_ccs_integrated_setting_storage_mock compizconfig_ccs_mock_gnome_integrated_setting_composition compizconfig_gnome_integration) compiz_discover_tests (compizconfig_test_ccs_gnome_integration COVERAGE compizconfig_gnome_integration compizconfig_gnome_integration_constants) ././@LongLink0000000000000000000000000000017700000000000011222 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/tests/compizconfig_ccs_mock_gnome_integrated_setting_composition.ccompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/tests/compizconfig_ccs_mock_gnome_integr0000644000015301777760000001736712321343002034001 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_mock_gnome_integrated_setting_composition.h" typedef struct _CCSMockGNOMEIntegratedSettingCompositionPrivate { CCSIntegratedSetting *integratedSetting; CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSettingInfo; CCSIntegratedSettingInfo *integratedSettingInfo; } CCSMockGNOMEIntegratedSettingCompositionPrivate; static CCSIntegratedSetting * allocateCCSIntegratedSetting (CCSObjectAllocationInterface *allocator) { CCSIntegratedSetting *setting = (*allocator->calloc_) (allocator->allocator, 1, sizeof (CCSIntegratedSetting)); ccsObjectInit (setting, allocator); return setting; } static CCSMockGNOMEIntegratedSettingCompositionPrivate * allocatePrivate (CCSIntegratedSetting *integratedSetting, CCSObjectAllocationInterface *allocator) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = (*allocator->calloc_) (allocator->allocator, 1, sizeof (CCSMockGNOMEIntegratedSettingCompositionPrivate)); if (!priv) { ccsObjectFinalize (integratedSetting); (*allocator->free_) (allocator->allocator, integratedSetting); return NULL; } return priv; } static SpecialOptionType ccsMockCompositionIntegratedSettingGetSpecialOptionType (CCSGNOMEIntegratedSettingInfo *setting) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); return ccsGNOMEIntegratedSettingInfoGetSpecialOptionType (priv->gnomeIntegratedSettingInfo); } static const char * ccsMockCompositionIntegratedSettingGetGNOMEName (CCSGNOMEIntegratedSettingInfo *setting) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); return ccsGNOMEIntegratedSettingInfoGetGNOMEName (priv->gnomeIntegratedSettingInfo); } static CCSSettingValue * ccsMockCompositionIntegratedSettingReadValue (CCSIntegratedSetting *setting, CCSSettingType type) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); return ccsIntegratedSettingReadValue (priv->integratedSetting, type); } static void ccsMockCompositionIntegratedSettingWriteValue (CCSIntegratedSetting *setting, CCSSettingValue *v, CCSSettingType type) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); ccsIntegratedSettingWriteValue (priv->integratedSetting, v, type); } static const char * ccsMockCompositionIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *setting) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); return ccsIntegratedSettingInfoPluginName (priv->integratedSettingInfo); } static const char * ccsMockCompositionIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *setting) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); return ccsIntegratedSettingInfoSettingName (priv->integratedSettingInfo); } static CCSSettingType ccsMockCompositionIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *setting) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); return ccsIntegratedSettingInfoGetType (priv->integratedSettingInfo); } static void ccsMockCompositionIntegratedSettingFree (CCSIntegratedSetting *integratedSetting) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, integratedSetting); ccsIntegratedSettingUnref (priv->integratedSetting); ccsGNOMEIntegratedSettingInfoUnref (priv->gnomeIntegratedSettingInfo); ccsObjectFinalize (integratedSetting); (*integratedSetting->object.object_allocation->free_) (integratedSetting->object.object_allocation->allocator, integratedSetting); } static void ccsMockCompositionIntegratedSettingInfoFree (CCSIntegratedSettingInfo *info) { return ccsMockCompositionIntegratedSettingFree ((CCSIntegratedSetting *) info); } static void ccsMockCompositionGNOMEIntegratedSettingInfoFree (CCSGNOMEIntegratedSettingInfo *info) { return ccsMockCompositionIntegratedSettingFree ((CCSIntegratedSetting *) info); } const CCSGNOMEIntegratedSettingInfoInterface ccsMockCompositionGNOMEIntegratedSettingInfo = { ccsMockCompositionIntegratedSettingGetSpecialOptionType, ccsMockCompositionIntegratedSettingGetGNOMEName, ccsMockCompositionGNOMEIntegratedSettingInfoFree }; const CCSIntegratedSettingInterface ccsMockCompositionIntegratedSetting = { ccsMockCompositionIntegratedSettingReadValue, ccsMockCompositionIntegratedSettingWriteValue, ccsMockCompositionIntegratedSettingFree }; const CCSIntegratedSettingInfoInterface ccsMockCompositionIntegratedSettingInfo = { ccsMockCompositionIntegratedSettingInfoPluginName, ccsMockCompositionIntegratedSettingInfoSettingName, ccsMockCompositionIntegratedSettingInfoGetType, ccsMockCompositionIntegratedSettingInfoFree }; CCSIntegratedSetting * ccsMockCompositionIntegratedSettingNew (CCSIntegratedSetting *integratedSetting, CCSGNOMEIntegratedSettingInfo *gnomeInfo, CCSIntegratedSettingInfo *settingInfo, CCSObjectAllocationInterface *allocator) { CCSIntegratedSetting *composition = allocateCCSIntegratedSetting (allocator); if (!composition) return NULL; CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = allocatePrivate (composition, allocator); if (!priv) return NULL; const CCSInterface *integratedSettingImpl = (const CCSInterface *) (&ccsMockCompositionIntegratedSetting); const CCSInterface *integratedSettingInfoImpl = (const CCSInterface *) (&ccsMockCompositionIntegratedSettingInfo); const CCSInterface *gnomeSettingImpl = (const CCSInterface *) (&ccsMockCompositionGNOMEIntegratedSettingInfo); priv->integratedSetting = integratedSetting; priv->gnomeIntegratedSettingInfo = gnomeInfo; priv->integratedSettingInfo = settingInfo; ccsIntegratedSettingRef (priv->integratedSetting); ccsGNOMEIntegratedSettingInfoRef (priv->gnomeIntegratedSettingInfo); ccsObjectSetPrivate (composition, (CCSPrivate *) (priv)); ccsObjectAddInterface (composition, integratedSettingImpl, GET_INTERFACE_TYPE (CCSIntegratedSettingInterface)); ccsObjectAddInterface (composition, integratedSettingInfoImpl, GET_INTERFACE_TYPE (CCSIntegratedSettingInfoInterface)); ccsObjectAddInterface (composition, gnomeSettingImpl, GET_INTERFACE_TYPE (CCSGNOMEIntegratedSettingInfoInterface)); ccsObjectRef (composition); return composition; } compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/CMakeLists.txt0000644000015301777760000000272212321343002026354 0ustar pbusernogroup00000000000000include (FindPkgConfig) add_subdirectory (gconf) add_subdirectory (gsettings) set (_deps glib-2.0>=2.20.0 gio-2.0>=2.25.0) compiz_pkg_check_modules (COMPIZCONFIG_GNOME_INTEGRATION ${_deps}) if (COMPIZCONFIG_GNOME_INTEGRATION_FOUND) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/libcompizconfig/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/include ${COMPIZCONFIG_GNOME_INTEGRATION_INCLUDE_DIRS}) link_directories (${CMAKE_BINARY_DIR}/compizconfig/libcompizconfig ${COMPIZCONFIG_GNOME_INTEGRATION_LIBRARY_DIRS}) add_library (compizconfig_gnome_integration_constants STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integration_constants.c) add_library (compizconfig_gnome_integration STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integration.c) target_link_libraries (compizconfig_gnome_integration compizconfig_gnome_integration_constants compizconfig_gnome_integrated_setting compizconfig ${COMPIZCONFIG_GNOME_INTEGRATION_LIBRARIES}) add_library (compizconfig_gnome_integrated_setting STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integrated_setting.c) target_link_libraries (compizconfig_gnome_integrated_setting compizconfig_gnome_integration_constants compizconfig ${COMPIZCONFIG_GNOME_INTEGRATION_LIBRARIES}) if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) endif (COMPIZCONFIG_GNOME_INTEGRATION_FOUND) compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/src/0000755000015301777760000000000012321344021024402 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/src/ccs_gnome_integration.c0000644000015301777760000005574512321343002031124 0ustar pbusernogroup00000000000000/** * * compizconfig gnome integration backend * * gnome-integration.c * * Copyright (c) 2011 Canonical Ltd * * Based on the original compizconfig-backend-gconf * * Copyright (c) 2007 Danny Baumann * * Parts of this code are taken from libberylsettings * gconf backend, written by: * * Copyright (c) 2006 Robert Carr * Copyright (c) 2007 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #include #include #include #include #include #include #include "ccs_gnome_integration.h" #include "ccs_gnome_integration_constants.h" #include "ccs_gnome_integrated_setting.h" typedef struct _CCSGNOMEIntegrationBackendPrivate CCGNOMEIntegrationBackendPrivate; struct _CCSGNOMEIntegrationBackendPrivate { CCSBackend *backend; CCSContext *context; CCSIntegratedSettingFactory *factory; CCSIntegratedSettingsStorage *storage; Bool noWrites; }; static CCSSetting * findDisplaySettingForPlugin (CCSContext *context, const char *plugin, const char *setting) { CCSPlugin *p; CCSSetting *s; p = ccsFindPlugin (context, plugin); if (!p) return NULL; s = ccsFindSetting (p, setting); if (!s) return NULL; return s; } static void unregisterAllIntegratedOptions (CCSIntegration *integration) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (priv->storage) ccsIntegratedSettingsStorageUnref (priv->storage); if (priv->factory) ccsIntegratedSettingFactoryUnref (priv->factory); priv->storage = NULL; priv->factory = NULL; } static void registerAllIntegratedOptions (CCSIntegration *integration) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); unsigned int i = 0; const CCSGNOMEIntegratedSettingsList *array = ccsGNOMEIntegratedSettingsList (); for (; i < CCS_GNOME_INTEGRATED_SETTINGS_LIST_SIZE; ++i) { CCSIntegratedSetting *setting = ccsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (priv->factory, integration, array[i].pluginName, array[i].settingName, TypeInt); ccsIntegratedSettingsStorageAddSetting (priv->storage, setting); } } static CCSIntegratedSetting * ccsGNOMEIntegrationBackendGetIntegratedSetting (CCSIntegration *integration, const char *pluginName, const char *settingName) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (ccsIntegratedSettingsStorageEmpty (priv->storage)) registerAllIntegratedOptions (integration); CCSIntegratedSettingList integratedSettings = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, pluginName, settingName); if (integratedSettings) { /* At the moment, we only support the first setting out of * the list. Assert the returned size is one */ g_assert (ccsIntegratedSettingListLength (integratedSettings) == 1); CCSIntegratedSetting *integratedSetting = integratedSettings->data; ccsIntegratedSettingListFree (integratedSettings, FALSE); return integratedSetting; } return NULL; } static unsigned int getGnomeMouseButtonModifier (CCSIntegratedSetting *mouseButtonModifierSetting) { unsigned int modMask = 0; CCSSettingType type = TypeString; CCSSettingValue *v = ccsIntegratedSettingReadValue (mouseButtonModifierSetting, type); if (v) { modMask = ccsStringToModifiers (v->value.asString); ccsFreeSettingValueWithType (v, type); } return modMask; } static unsigned int getButtonBindingForSetting (CCSContext *context, const char *plugin, const char *setting) { CCSSetting *s; s = findDisplaySettingForPlugin (context, plugin, setting); if (!s) return 0; if (ccsSettingGetType (s) != TypeButton) return 0; return ccsSettingGetValue (s)->value.asButton.button; } static Bool ccsGNOMEIntegrationBackendReadISAndSetSettingForType (CCSIntegratedSetting *integratedSetting, CCSSetting *setting, CCSSettingValue **v, CCSSettingType sourceType, CCSSettingType destinationType) { *v = ccsIntegratedSettingReadValue (integratedSetting, sourceType); if (*v != NULL && (*v)->value.asString) { /* Conversion to key type option necessary */ if (destinationType == TypeKey) { CCSSettingKeyValue key; memset (&key, 0, sizeof (CCSSettingKeyValue)); if (ccsStringToKeyBinding ((*v)->value.asString, &key)) { /* Since we effectively change the type of the value here * we need to free the old string value */ free ((*v)->value.asString); ccsSetKey (setting, key, TRUE); return TRUE; } else { /* We were not successful at converting strings to keybindings * but we must free the string value anyways as we present * this value to ccsSettingValueFreeWithType as a TypeKey * intentionally made empty */ free ((*v)->value.asString); return FALSE; } } return TRUE; } return FALSE; } static Bool ccsGNOMEIntegrationBackendReadOptionIntoSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting) { Bool ret = FALSE; CCSSettingValue *v = NULL; CCSSettingType type = TypeNum; CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (ccsIntegratedSettingsStorageEmpty (priv->storage)) registerAllIntegratedOptions (integration); if (!ccsSettingIsReadableByBackend (setting)) return FALSE; switch (ccsGNOMEIntegratedSettingInfoGetSpecialOptionType ((CCSGNOMEIntegratedSettingInfo *) integratedSetting)) { case OptionInt: { type = TypeInt; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; ccsSetInt (setting, v->value.asInt, TRUE); ret = TRUE; } break; case OptionBool: { type = TypeBool; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; ccsSetBool (setting, v->value.asBool, TRUE); ret = TRUE; } break; case OptionString: { type = TypeString; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; char *str = v->value.asString; ccsSetString (setting, str, TRUE); ret = TRUE; } break; case OptionKey: { /* Some backends store keys differently so we need to let the backend know * that we really intend to read a key and let it handle the conversion */ type = TypeKey; if (ccsGNOMEIntegrationBackendReadISAndSetSettingForType (integratedSetting, setting, &v, TypeKey, type)) ret = TRUE; } break; case OptionSpecial: { const char *settingName = ccsSettingGetName (setting); const char *pluginName = ccsPluginGetName (ccsSettingGetParent (setting)); if (strcmp (settingName, "current_viewport") == 0) { type = TypeBool; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; Bool showAll = v->value.asBool; ccsSetBool (setting, !showAll, TRUE); ret = TRUE; } else if (strcmp (settingName, "fullscreen_visual_bell") == 0) { type = TypeString; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; const char *value = v->value.asString; if (value) { Bool fullscreen; fullscreen = strcmp (value, "fullscreen") == 0; ccsSetBool (setting, fullscreen, TRUE); ret = TRUE; } } else if (strcmp (settingName, "click_to_focus") == 0) { type = TypeString; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; const char *focusMode = v->value.asString; if (focusMode) { Bool clickToFocus = (strcmp (focusMode, "click") == 0); ccsSetBool (setting, clickToFocus, TRUE); ret = TRUE; } } else if ((strcmp (settingName, "run_command_screenshot_key") == 0 || strcmp (settingName, "run_command_window_screenshot_key") == 0 || strcmp (settingName, "run_command_terminal_key") == 0)) { /* These are always stored as strings, no matter what the backend is * so the source type should be string */ type = TypeKey; if (ccsGNOMEIntegrationBackendReadISAndSetSettingForType (integratedSetting, setting, &v, TypeString, type)) ret = TRUE; } else if (((strcmp (settingName, "initiate_button") == 0) && ((strcmp (pluginName, "move") == 0) || (strcmp (pluginName, "resize") == 0))) || ((strcmp (settingName, "window_menu_button") == 0) && (strcmp (pluginName, "core") == 0))) { gboolean resizeWithRightButton; CCSSettingButtonValue button; memset (&button, 0, sizeof (CCSSettingButtonValue)); ccsGetButton (setting, &button); CCSIntegratedSettingList mouseModifierSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsGNOMEIntegratedPluginNames.SPECIAL, ccsGNOMEIntegratedSettingNames.NULL_MOUSE_BUTTON_MODIFIER.compizName); button.buttonModMask = getGnomeMouseButtonModifier (mouseModifierSetting->data); CCSIntegratedSettingList resizeButtonSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsGNOMEIntegratedPluginNames.SPECIAL, ccsGNOMEIntegratedSettingNames.NULL_RESIZE_WITH_RIGHT_BUTTON.compizName); type = TypeBool; v = ccsIntegratedSettingReadValue (resizeButtonSetting->data, type); resizeWithRightButton = v->value.asBool; if (strcmp (settingName, "window_menu_button") == 0) button.button = resizeWithRightButton ? 2 : 3; else if (strcmp (pluginName, "resize") == 0) button.button = resizeWithRightButton ? 3 : 2; else button.button = 1; ccsSetButton (setting, button, TRUE); ret = TRUE; /* Free the returned lists */ ccsIntegratedSettingListFree (mouseModifierSetting, FALSE); ccsIntegratedSettingListFree (resizeButtonSetting, FALSE); } } break; default: break; } if (v) ccsFreeSettingValueWithType (v, type); return ret; } static Bool setGnomeMouseButtonModifier (CCSIntegratedSetting *setting, unsigned int modMask) { char *modifiers; CCSSettingValue *v = calloc (1, sizeof (CCSSettingValue)); v->isListChild = FALSE; v->parent = NULL; v->refCount = 1; modifiers = ccsModifiersToString (modMask); if (!modifiers) { ccsFreeSettingValueWithType (v, TypeString); return FALSE; } v->value.asString = modifiers; ccsIntegratedSettingWriteValue (setting, v, TypeString); ccsFreeSettingValueWithType (v, TypeString); return TRUE; } static void setButtonBindingForSetting (CCSContext *context, const char *plugin, const char *setting, unsigned int button, unsigned int buttonModMask) { CCSSetting *s; s = findDisplaySettingForPlugin (context, plugin, setting); if (!s) return; if (ccsSettingGetType (s) != TypeButton) return; CCSSettingButtonValue value = ccsSettingGetValue (s)->value.asButton; if ((value.button != button) || (value.buttonModMask != buttonModMask)) { value.button = button; value.buttonModMask = buttonModMask; ccsSetButton (s, value, TRUE); } } static Bool ccsGNOMEIntegrationBackendKeyValueToStringValue (CCSSettingValue *keyValue, CCSSettingValue *stringValue) { char *newValue; newValue = ccsKeyBindingToString (&keyValue->value.asKey); if (newValue) { if (strcmp (newValue, "Disabled") == 0) { /* Metacity doesn't like "Disabled", it wants "disabled" */ newValue[0] = 'd'; } stringValue->value.asString = newValue; return TRUE; } return FALSE; } static void ccsGNOMEIntegrationBackendWriteOptionFromSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting) { GError *err = NULL; CCSSettingType type = TypeNum; CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (ccsIntegratedSettingsStorageEmpty (priv->storage)) registerAllIntegratedOptions (integration); if (priv->noWrites) return; /* Do not allow recursing back into writeIntegratedSetting */ ccsIntegrationDisallowIntegratedWrites (integration); CCSSettingType sType = ccsSettingGetType (setting); CCSSettingInfo *sInfo = ccsSettingGetInfo (setting); CCSSettingValue *vSetting = ccsSettingGetValue (setting); CCSSettingValue *v = ccsCopyValue (vSetting, sType, sInfo); if (!v) return; switch (ccsGNOMEIntegratedSettingInfoGetSpecialOptionType ((CCSGNOMEIntegratedSettingInfo *) integratedSetting)) { case OptionInt: ccsIntegratedSettingWriteValue (integratedSetting, v, TypeInt); break; case OptionBool: ccsIntegratedSettingWriteValue (integratedSetting, v, TypeBool); break; case OptionString: ccsIntegratedSettingWriteValue (integratedSetting, v, TypeString); break; case OptionKey: { CCSSettingValue *newValue = calloc (1, sizeof (CCSSettingValue)); newValue->isListChild = FALSE; newValue->parent = NULL; newValue->refCount = 1; if (ccsGNOMEIntegrationBackendKeyValueToStringValue (v, newValue)) { /* Really this is a lie - the writer expects a string * but it needs to know if its a key or a string */ type = TypeKey; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } if (newValue) ccsFreeSettingValueWithType (newValue, TypeString); } break; case OptionSpecial: { const char *settingName = ccsSettingGetName (setting); const char *pluginName = ccsPluginGetName (ccsSettingGetParent (setting)); CCSSettingValue *newValue = calloc (1, sizeof (CCSSettingValue)); newValue->isListChild = FALSE; newValue->parent = NULL; newValue->refCount = 1; if (strcmp (settingName, "current_viewport") == 0) { newValue->value.asBool = !v->value.asBool; type = TypeBool; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } else if (strcmp (settingName, "fullscreen_visual_bell") == 0) { const char *newValueString = v->value.asBool ? "fullscreen" : "frame_flash"; newValue->value.asString = strdup (newValueString); type = TypeString; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } else if (strcmp (settingName, "click_to_focus") == 0) { const char *newValueString = v->value.asBool ? "click" : "sloppy"; newValue->value.asString = strdup (newValueString); type = TypeString; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } else if ((strcmp (settingName, "run_command_screenshot_key") == 0 || strcmp (settingName, "run_command_window_screenshot_key") == 0 || strcmp (settingName, "run_command_terminal_key") == 0)) { if (ccsGNOMEIntegrationBackendKeyValueToStringValue (v, newValue)) { /* These are actually stored as strings in the schemas */ type = TypeString; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } } else if (((strcmp (settingName, "initiate_button") == 0) && ((strcmp (pluginName, "move") == 0) || (strcmp (pluginName, "resize") == 0))) || ((strcmp (settingName, "window_menu_button") == 0) && (strcmp (pluginName, "core") == 0))) { unsigned int modMask; Bool resizeWithRightButton = FALSE; if ((getButtonBindingForSetting (priv->context, "resize", "initiate_button") == 3) || (getButtonBindingForSetting (priv->context, "core", "window_menu_button") == 2)) { resizeWithRightButton = TRUE; } CCSIntegratedSettingList resizeButtonSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsGNOMEIntegratedPluginNames.SPECIAL, ccsGNOMEIntegratedSettingNames.NULL_RESIZE_WITH_RIGHT_BUTTON.compizName); newValue->value.asBool = resizeWithRightButton; type = TypeBool; ccsIntegratedSettingWriteValue (resizeButtonSetting->data, newValue, type); CCSIntegratedSettingList mouseModifierSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsGNOMEIntegratedPluginNames.SPECIAL, ccsGNOMEIntegratedSettingNames.NULL_MOUSE_BUTTON_MODIFIER.compizName); modMask = v->value.asButton.buttonModMask; if (setGnomeMouseButtonModifier (mouseModifierSetting->data, modMask)) { setButtonBindingForSetting (priv->context, "move", "initiate_button", 1, modMask); setButtonBindingForSetting (priv->context, "resize", "initiate_button", resizeWithRightButton ? 3 : 2, modMask); setButtonBindingForSetting (priv->context, "core", "window_menu_button", resizeWithRightButton ? 2 : 3, modMask); } /* We own the returned lists, so free them */ ccsIntegratedSettingListFree (resizeButtonSetting, FALSE); ccsIntegratedSettingListFree (mouseModifierSetting, FALSE); } if (newValue) ccsFreeSettingValueWithType (newValue, type); } break; } if (err) { ccsError ("%s", err->message); g_error_free (err); } if (v) ccsFreeSettingValueWithType (v, sType); /* we should immediately write changed settings */ ccsWriteChangedSettings (priv->context); ccsIntegrationAllowIntegratedWrites (integration); } static void ccsGNOMEIntegrationBackendUpdateIntegratedSettings (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList integratedSettings) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); Bool needInit = TRUE; CCSIntegratedSettingList iter = integratedSettings; while (iter) { CCSIntegratedSetting *integrated = iter->data; const char *settingName = ccsIntegratedSettingInfoSettingName ((CCSIntegratedSettingInfo *)integrated); const char *pluginName = ccsIntegratedSettingInfoPluginName ((CCSIntegratedSettingInfo *) integrated); /* Special case for mouse button modifier etc */ if ((strcmp (settingName, "mouse_button_modifier") == 0) || (strcmp (settingName, "resize_with_right_button") == 0)) { CCSSetting *s; if (needInit) { ccsBackendReadInit (priv->backend, priv->context); needInit = FALSE; } s = findDisplaySettingForPlugin (priv->context, "core", "window_menu_button"); if (s) ccsBackendReadSetting (priv->backend, priv->context, s); s = findDisplaySettingForPlugin (priv->context, "move", "initiate_button"); if (s) ccsBackendReadSetting (priv->backend, priv->context, s); s = findDisplaySettingForPlugin (priv->context, "resize", "initiate_button"); if (s) ccsBackendReadSetting (priv->backend, priv->context, s); } else { CCSPlugin *plugin = NULL; plugin = ccsFindPlugin (priv->context, pluginName); if (plugin) { CCSSetting *setting; setting = ccsFindSetting (plugin, settingName); if (setting) { if (needInit) { ccsBackendReadInit (priv->backend, priv->context); needInit = FALSE; } ccsBackendReadSetting (priv->backend, priv->context, setting); } } } iter = iter->next; } } static void ccsGNOMEIntegrationDisallowIntegratedWrites (CCSIntegration *integration) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); priv->noWrites = TRUE; } static void ccsGNOMEIntegrationAllowIntegratedWrites (CCSIntegration *integration) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); priv->noWrites = FALSE; } static void ccsGNOMEIntegrationBackendFree (CCSIntegration *integration) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); unregisterAllIntegratedOptions (integration); priv->backend = NULL; ccsObjectFinalize (integration); free (integration); } const CCSIntegrationInterface ccsGNOMEIntegrationBackendInterface = { ccsGNOMEIntegrationBackendGetIntegratedSetting, ccsGNOMEIntegrationBackendReadOptionIntoSetting, ccsGNOMEIntegrationBackendWriteOptionFromSetting, ccsGNOMEIntegrationBackendUpdateIntegratedSettings, ccsGNOMEIntegrationDisallowIntegratedWrites, ccsGNOMEIntegrationAllowIntegratedWrites, ccsGNOMEIntegrationBackendFree }; static CCGNOMEIntegrationBackendPrivate * addPrivate (CCSIntegration *backend, CCSObjectAllocationInterface *ai) { CCGNOMEIntegrationBackendPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCGNOMEIntegrationBackendPrivate)); if (!priv) { ccsObjectFinalize (backend); free (backend); } ccsObjectSetPrivate (backend, (CCSPrivate *) priv); return priv; } static CCSIntegration * ccsGNOMEIntegrationBackendNewCommon (CCSBackend *backend, CCSContext *context, CCSIntegratedSettingFactory *factory, CCSIntegratedSettingsStorage *storage, CCSObjectAllocationInterface *ai) { CCSIntegration *integration = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegration)); if (!integration) return NULL; ccsObjectInit (integration, ai); CCGNOMEIntegrationBackendPrivate *priv = addPrivate (integration, ai); priv->backend = backend; priv->context = context; priv->factory = factory; priv->storage = storage; priv->noWrites = FALSE; ccsObjectAddInterface (integration, (const CCSInterface *) &ccsGNOMEIntegrationBackendInterface, GET_INTERFACE_TYPE (CCSIntegrationInterface)); ccsIntegrationRef (integration); return integration; } CCSIntegration * ccsGNOMEIntegrationBackendNew (CCSBackend *backend, CCSContext *context, CCSIntegratedSettingFactory *factory, CCSIntegratedSettingsStorage *storage, CCSObjectAllocationInterface *ai) { return ccsGNOMEIntegrationBackendNewCommon (backend, context, factory, storage, ai); } compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/src/ccs_gnome_integrated_setting.c0000644000015301777760000001250412321343002032446 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include "ccs_gnome_integrated_setting.h" #include "ccs_gnome_integration_constants.h" INTERFACE_TYPE (CCSGNOMEIntegratedSettingInfoInterface); CCSREF_OBJ (GNOMEIntegratedSettingInfo, CCSGNOMEIntegratedSettingInfo); SpecialOptionType ccsGNOMEIntegratedSettingInfoGetSpecialOptionType (CCSGNOMEIntegratedSettingInfo *info) { return (*(GET_INTERFACE (CCSGNOMEIntegratedSettingInfoInterface, info))->getSpecialOptionType) (info); } const char * ccsGNOMEIntegratedSettingInfoGetGNOMEName (CCSGNOMEIntegratedSettingInfo *info) { return (*(GET_INTERFACE (CCSGNOMEIntegratedSettingInfoInterface, info))->getGNOMEName) (info); } /* CCSGNOMEIntegratedSettingDefaultImpl implementation */ typedef struct _CCSGNOMEIntegratedSettingInfoDefaultImplPrivate CCSGNOMEIntegratedSettingInfoDefaultImplPrivate; struct _CCSGNOMEIntegratedSettingInfoDefaultImplPrivate { SpecialOptionType type; const char *gnomeName; CCSIntegratedSettingInfo *sharedIntegratedSettingInfo; }; Bool ccsGNOMEIntegrationFindSettingsMatchingPredicate (CCSIntegratedSetting *setting, void *userData) { const char *findGnomeName = (const char *) userData; const char *gnomeNameOfSetting = ccsGNOMEIntegratedSettingInfoGetGNOMEName ((CCSGNOMEIntegratedSettingInfo *) setting); if (strcmp (findGnomeName, gnomeNameOfSetting) == 0) return TRUE; return FALSE; } SpecialOptionType ccsGNOMEIntegratedSettingGetSpecialOptionDefault (CCSGNOMEIntegratedSettingInfo *info) { CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return priv->type; } const char * ccsGNOMEIntegratedSettingGetGNOMENameDefault (CCSGNOMEIntegratedSettingInfo *info) { CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return priv->gnomeName; } const char * ccsGNOMEIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *info) { CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return ccsIntegratedSettingInfoPluginName (priv->sharedIntegratedSettingInfo); } const char * ccsGNOMEIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *info) { CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return ccsIntegratedSettingInfoSettingName (priv->sharedIntegratedSettingInfo); } CCSSettingType ccsGNOMEIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *info) { CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return ccsIntegratedSettingInfoGetType (priv->sharedIntegratedSettingInfo); } void ccsGNOMESharedIntegratedSettingInfoFree (CCSIntegratedSettingInfo *info) { CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); ccsIntegratedSettingInfoUnref (priv->sharedIntegratedSettingInfo); ccsObjectFinalize (info); (*info->object.object_allocation->free_) (info->object.object_allocation->allocator, info); } static void ccsGNOMEIntegratedSettingInfoFree (CCSGNOMEIntegratedSettingInfo *info) { ccsGNOMESharedIntegratedSettingInfoFree ((CCSIntegratedSettingInfo *) info); } CCSGNOMEIntegratedSettingInfoInterface ccsGNOMEIntegratedSettingInfoDefaultImplInterface = { ccsGNOMEIntegratedSettingGetSpecialOptionDefault, ccsGNOMEIntegratedSettingGetGNOMENameDefault, ccsGNOMEIntegratedSettingInfoFree }; const CCSIntegratedSettingInfoInterface ccsGNOMEIntegratedSettingInfoInterface = { ccsGNOMEIntegratedSettingInfoPluginName, ccsGNOMEIntegratedSettingInfoSettingName, ccsGNOMEIntegratedSettingInfoGetType, ccsGNOMESharedIntegratedSettingInfoFree }; void ccsFreeGNOMEIntegratedSettingInfo (CCSGNOMEIntegratedSettingInfo *info) { (*(GET_INTERFACE (CCSGNOMEIntegratedSettingInfoInterface, info))->free) (info); } CCSGNOMEIntegratedSettingInfo * ccsGNOMEIntegratedSettingInfoNew (CCSIntegratedSettingInfo *base, SpecialOptionType type, const char *gnomeName, CCSObjectAllocationInterface *ai) { CCSGNOMEIntegratedSettingInfo *info = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGNOMEIntegratedSettingInfo)); if (!info) return NULL; CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate)); if (!priv) { (*ai->free_) (ai->allocator, info); return NULL; } priv->sharedIntegratedSettingInfo = base; priv->gnomeName = gnomeName; priv->type = type; ccsObjectInit (info, ai); ccsObjectSetPrivate (info, (CCSPrivate *) priv); ccsObjectAddInterface (info, (const CCSInterface *) &ccsGNOMEIntegratedSettingInfoInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInfoInterface)); ccsObjectAddInterface (info, (const CCSInterface *) &ccsGNOMEIntegratedSettingInfoDefaultImplInterface, GET_INTERFACE_TYPE (CCSGNOMEIntegratedSettingInfoInterface)); ccsIntegratedSettingInfoRef ((CCSIntegratedSettingInfo *) info); return info; } compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/src/ccs_gnome_integration_constants.c0000644000015301777760000031367012321343002033212 0ustar pbusernogroup00000000000000#include #include "ccs_gnome_integration_constants.h" const char * watchedGConfGnomeDirectories[] = { METACITY, "/desktop/gnome/applications/terminal", "/apps/panel/applets/window_list/prefs" }; const CCSGNOMEIntegratedSettingNames ccsGNOMEIntegratedSettingNames = { { "audible_bell", "audible_bell" }, { "click_to_focus", "focus_mode" }, { "raise_on_click", "raise_on_click" }, { "autoraise_delay", "auto_raise_delay" }, { "autoraise", "auto_raise" }, { "current_viewport", "display_all_workspaces" }, { "command_terminal", "exec" }, { "command_window_screenshot", "command_window_screenshot" }, { "command_screenshot", "command_screenshot" }, { "rotate_right_window_key", "move_to_workspace_right" }, { "rotate_left_window_key", "move_to_workspace_left" }, { "rotate_to_12_window_key", "move_to_workspace_12" }, { "rotate_to_11_window_key", "move_to_workspace_11" }, { "rotate_to_10_window_key", "move_to_workspace_10" }, { "rotate_to_9_window_key", "move_to_workspace_9" }, { "rotate_to_8_window_key", "move_to_workspace_8" }, { "rotate_to_7_window_key", "move_to_workspace_7" }, { "rotate_to_6_window_key", "move_to_workspace_6" }, { "rotate_to_5_window_key", "move_to_workspace_5" }, { "rotate_to_4_window_key", "move_to_workspace_4" }, { "rotate_to_3_window_key", "move_to_workspace_3" }, { "rotate_to_2_window_key", "move_to_workspace_2" }, { "rotate_to_1_window_key", "move_to_workspace_1" }, { "put_bottom_key", "move_to_side_s" }, { "put_top_key", "move_to_side_n" }, { "put_right_key", "move_to_side_e" }, { "put_left_key", "move_to_side_w" }, { "put_bottomright_key", "move_to_corner_se" }, { "put_bottomleft_key", "move_to_corner_sw" }, { "put_topright_key", "move_to_corner_ne" }, { "put_topleft_key", "move_to_corner_nw" }, { "down_window_key", "move_to_workspace_down" }, { "up_window_key", "move_to_workspace_up" }, { "right_window_key", "move_to_workspace_right" }, { "left_window_key", "move_to_workspace_left" }, { "right_key", "switch_to_workspace_right" }, { "left_key", "switch_to_workspace_left" }, { "down_key", "switch_to_workspace_down" }, { "up_key", "switch_to_workspace_up" }, { "switch_to_12_key", "switch_to_workspace_12" }, { "switch_to_11_key", "switch_to_workspace_11" }, { "switch_to_10_key", "switch_to_workspace_10" }, { "switch_to_9_key", "switch_to_workspace_9" }, { "switch_to_8_key", "switch_to_workspace_8" }, { "switch_to_7_key", "switch_to_workspace_7" }, { "switch_to_6_key", "switch_to_workspace_6" }, { "switch_to_5_key", "switch_to_workspace_5" }, { "switch_to_4_key", "switch_to_workspace_4" }, { "switch_to_3_key", "switch_to_workspace_3" }, { "switch_to_2_key", "switch_to_workspace_2" }, { "switch_to_1_key", "switch_to_workspace_1" }, { "rotate_right_key", "switch_to_workspace_right" }, { "rotate_left_key", "switch_to_workspace_left" }, { "rotate_to_12_key", "switch_to_workspace_12" }, { "rotate_to_11_key", "switch_to_workspace_11" }, { "rotate_to_10_key", "switch_to_workspace_10" }, { "rotate_to_9_key", "switch_to_workspace_9" }, { "rotate_to_8_key", "switch_to_workspace_8" }, { "rotate_to_7_key", "switch_to_workspace_7" }, { "rotate_to_6_key", "switch_to_workspace_6" }, { "rotate_to_5_key", "switch_to_workspace_5" }, { "rotate_to_4_key", "switch_to_workspace_4" }, { "rotate_to_3_key", "switch_to_workspace_3" }, { "rotate_to_2_key", "switch_to_workspace_2" }, { "rotate_to_1_key", "switch_to_workspace_1" }, { "run_command11_key", "run_command_12" }, { "run_command10_key", "run_command_11" }, { "run_command9_key", "run_command_10" }, { "run_command8_key", "run_command_9" }, { "run_command7_key", "run_command_8" }, { "run_command6_key", "run_command_7" }, { "run_command5_key", "run_command_6" }, { "run_command4_key", "run_command_5" }, { "run_command3_key", "run_command_4" }, { "run_command2_key", "run_command_3" }, { "run_command1_key", "run_command_2" }, { "run_command0_key", "run_command_1" }, { "command11", "command_12" }, { "command10", "command_11" }, { "command9", "command_10" }, { "command8", "command_9" }, { "command7", "command_8" }, { "command6", "command_7" }, { "command5", "command_6" }, { "command4", "command_5" }, { "command3", "command_4" }, { "command2", "command_3" }, { "command1", "command_2" }, { "command0", "command_1" }, { "toggle_fullscreen_key", "toggle_fullscreen" }, { "toggle_sticky_key", "toggle_on_all_workspaces" }, { "prev_key", "switch_windows_backward" }, { "next_key", "switch_windows" }, { "fullscreen_visual_bell", "visual_bell_type" }, { "visual_bell", "visual_bell" }, { "resize_with_right_button", "resize_with_right_button" }, { "mouse_button_modifier", "mouse_button_modifier" }, { "window_menu_button", "activate_window_menu" }, { "initiate_button", "begin_resize" }, { "initiate_button", "begin_move" }, { "window_menu_key", "activate_window_menu" }, { "initiate_key", "begin_resize" }, { "initiate_key", "begin_move" }, { "show_desktop_key", "show_desktop" }, { "toggle_window_shaded_key", "toggle_shaded" }, { "close_window_key", "close" }, { "lower_window_key", "lower" }, { "raise_window_key", "raise" }, { "maximize_window_vertically_key", "maximize_vertically" }, { "maximize_window_horizontally_key", "maximize_horizontally" }, { "unmaximize_or_minimize_window_key", "unmaximize" }, { "maximize_window_key", "maximize" }, { "minimize_window_key", "minimize" }, { "toggle_window_maximized_key", "toggle_maximized" }, { "run_command_terminal_key", "run_command_terminal" }, { "run_command_window_screenshot_key", "run_command_window_screenshot" }, { "run_command_screenshot_key", "run_command_screenshot" }, { "main_menu_key", "panel_main_menu" }, { "run_key", "panel_run_dialog" }, { "show_hud", "show_hud" } }; const CCSGConfIntegrationCategories ccsGConfIntegrationCategories = { METACITY "/general/", "/apps/panel/applets/window_list/prefs/", "/desktop/gnome/applications/terminal/", METACITY "/keybinding_commands/", METACITY "/window_keybindings/", METACITY "/global_keybindings/" }; const CCSGNOMEIntegratedPluginNames ccsGNOMEIntegratedPluginNames = { "core", "thumbnail", "gnomecompat", "rotate", "put", "wall", "vpswitch", "commands", "extrawm", "resize", "move", "staticswitcher", "fade", "unityshell", "__special" }; static gpointer ccsGNOMEIntegrationInitializeIntegratedSettingsList (gpointer data) { CCSGNOMEIntegratedSettingsList *array = (CCSGNOMEIntegratedSettingsList *) data; const CCSGNOMEIntegratedPluginNames *plugins = &ccsGNOMEIntegratedPluginNames; const CCSGNOMEIntegratedSettingNames *settings = &ccsGNOMEIntegratedSettingNames; array[0].pluginName = plugins->CORE; array[0].settingName = settings->CORE_AUDIBLE_BELL.compizName; array[1].pluginName = plugins->CORE; array[1].settingName = settings->CORE_CLICK_TO_FOCUS.compizName; array[2].pluginName = plugins->CORE; array[2].settingName = settings->CORE_RAISE_ON_CLICK.compizName; array[3].pluginName = plugins->CORE; array[3].settingName = settings->CORE_AUTORAISE_DELAY.compizName; array[4].pluginName = plugins->CORE; array[4].settingName = settings->CORE_AUTORAISE.compizName; array[5].pluginName = plugins->THUMBNAIL; array[5].settingName = settings->THUMBNAIL_CURRENT_VIEWPORT.compizName; array[6].pluginName = plugins->GNOMECOMPAT; array[6].settingName = settings->GNOMECOMPAT_COMMAND_TERMINAL.compizName; array[7].pluginName = plugins->GNOMECOMPAT; array[7].settingName = settings->GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName; array[8].pluginName = plugins->GNOMECOMPAT; array[8].settingName = settings->GNOMECOMPAT_COMMAND_SCREENSHOT.compizName; array[9].pluginName = plugins->ROTATE; array[9].settingName = settings->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName; array[10].pluginName = plugins->ROTATE; array[10].settingName = settings->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName; array[11].pluginName = plugins->ROTATE; array[11].settingName = settings->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName; array[12].pluginName = plugins->ROTATE; array[12].settingName = settings->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName; array[13].pluginName = plugins->ROTATE; array[13].settingName = settings->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName; array[14].pluginName = plugins->ROTATE; array[14].settingName = settings->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName; array[15].pluginName = plugins->ROTATE; array[15].settingName = settings->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName; array[16].pluginName = plugins->ROTATE; array[16].settingName = settings->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName; array[17].pluginName = plugins->ROTATE; array[17].settingName = settings->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName; array[18].pluginName = plugins->ROTATE; array[18].settingName = settings->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName; array[19].pluginName = plugins->ROTATE; array[19].settingName = settings->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName; array[20].pluginName = plugins->ROTATE; array[20].settingName = settings->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName; array[21].pluginName = plugins->ROTATE; array[21].settingName = settings->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName; array[22].pluginName = plugins->ROTATE; array[22].settingName = settings->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName; array[23].pluginName = plugins->PUT; array[23].settingName = settings->PUT_PUT_BOTTOM_KEY.compizName; array[24].pluginName = plugins->PUT; array[24].settingName = settings->PUT_PUT_TOP_KEY.compizName; array[25].pluginName = plugins->PUT; array[25].settingName = settings->PUT_PUT_RIGHT_KEY.compizName; array[26].pluginName = plugins->PUT; array[26].settingName = settings->PUT_PUT_LEFT_KEY.compizName; array[27].pluginName = plugins->PUT; array[27].settingName = settings->PUT_PUT_BOTTOMRIGHT_KEY.compizName; array[28].pluginName = plugins->PUT; array[28].settingName = settings->PUT_PUT_BOTTOMLEFT_KEY.compizName; array[29].pluginName = plugins->PUT; array[29].settingName = settings->PUT_PUT_TOPRIGHT_KEY.compizName; array[30].pluginName = plugins->PUT; array[30].settingName = settings->PUT_PUT_TOPLEFT_KEY.compizName; array[31].pluginName = plugins->WALL; array[31].settingName = settings->WALL_DOWN_WINDOW_KEY.compizName; array[32].pluginName = plugins->WALL; array[32].settingName = settings->WALL_UP_WINDOW_KEY.compizName; array[33].pluginName = plugins->WALL; array[33].settingName = settings->WALL_RIGHT_WINDOW_KEY.compizName; array[34].pluginName = plugins->WALL; array[34].settingName = settings->WALL_LEFT_WINDOW_KEY.compizName; array[35].pluginName = plugins->WALL; array[35].settingName = settings->WALL_RIGHT_KEY.compizName; array[36].pluginName = plugins->WALL; array[36].settingName = settings->WALL_LEFT_KEY.compizName; array[37].pluginName = plugins->WALL; array[37].settingName = settings->WALL_DOWN_KEY.compizName; array[38].pluginName = plugins->WALL; array[38].settingName = settings->WALL_UP_KEY.compizName; array[39].pluginName = plugins->VPSWITCH; array[39].settingName = settings->VPSWITCH_SWITCH_TO_12_KEY.compizName; array[40].pluginName = plugins->VPSWITCH; array[40].settingName = settings->VPSWITCH_SWITCH_TO_11_KEY.compizName; array[41].pluginName = plugins->VPSWITCH; array[41].settingName = settings->VPSWITCH_SWITCH_TO_10_KEY.compizName; array[42].pluginName = plugins->VPSWITCH; array[42].settingName = settings->VPSWITCH_SWITCH_TO_9_KEY.compizName; array[43].pluginName = plugins->VPSWITCH; array[43].settingName = settings->VPSWITCH_SWITCH_TO_8_KEY.compizName; array[44].pluginName = plugins->VPSWITCH; array[44].settingName = settings->VPSWITCH_SWITCH_TO_7_KEY.compizName; array[45].pluginName = plugins->VPSWITCH; array[45].settingName = settings->VPSWITCH_SWITCH_TO_6_KEY.compizName; array[46].pluginName = plugins->VPSWITCH; array[46].settingName = settings->VPSWITCH_SWITCH_TO_5_KEY.compizName; array[47].pluginName = plugins->VPSWITCH; array[47].settingName = settings->VPSWITCH_SWITCH_TO_4_KEY.compizName; array[48].pluginName = plugins->VPSWITCH; array[48].settingName = settings->VPSWITCH_SWITCH_TO_3_KEY.compizName; array[49].pluginName = plugins->VPSWITCH; array[49].settingName = settings->VPSWITCH_SWITCH_TO_2_KEY.compizName; array[50].pluginName = plugins->VPSWITCH; array[50].settingName = settings->VPSWITCH_SWITCH_TO_1_KEY.compizName; array[51].pluginName = plugins->ROTATE; array[51].settingName = settings->ROTATE_ROTATE_RIGHT_KEY.compizName; array[52].pluginName = plugins->ROTATE; array[52].settingName = settings->ROTATE_ROTATE_LEFT_KEY.compizName; array[53].pluginName = plugins->ROTATE; array[53].settingName = settings->ROTATE_ROTATE_TO_12_KEY.compizName; array[54].pluginName = plugins->ROTATE; array[54].settingName = settings->ROTATE_ROTATE_TO_11_KEY.compizName; array[55].pluginName = plugins->ROTATE; array[55].settingName = settings->ROTATE_ROTATE_TO_10_KEY.compizName; array[56].pluginName = plugins->ROTATE; array[56].settingName = settings->ROTATE_ROTATE_TO_9_KEY.compizName; array[57].pluginName = plugins->ROTATE; array[57].settingName = settings->ROTATE_ROTATE_TO_8_KEY.compizName; array[58].pluginName = plugins->ROTATE; array[58].settingName = settings->ROTATE_ROTATE_TO_7_KEY.compizName; array[59].pluginName = plugins->ROTATE; array[59].settingName = settings->ROTATE_ROTATE_TO_6_KEY.compizName; array[60].pluginName = plugins->ROTATE; array[60].settingName = settings->ROTATE_ROTATE_TO_5_KEY.compizName; array[61].pluginName = plugins->ROTATE; array[61].settingName = settings->ROTATE_ROTATE_TO_4_KEY.compizName; array[62].pluginName = plugins->ROTATE; array[62].settingName = settings->ROTATE_ROTATE_TO_3_KEY.compizName; array[63].pluginName = plugins->ROTATE; array[63].settingName = settings->ROTATE_ROTATE_TO_2_KEY.compizName; array[64].pluginName = plugins->ROTATE; array[64].settingName = settings->ROTATE_ROTATE_TO_1_KEY.compizName; array[65].pluginName = plugins->COMMANDS; array[65].settingName = settings->COMMANDS_RUN_COMMAND11_KEY.compizName; array[66].pluginName = plugins->COMMANDS; array[66].settingName = settings->COMMANDS_RUN_COMMAND10_KEY.compizName; array[67].pluginName = plugins->COMMANDS; array[67].settingName = settings->COMMANDS_RUN_COMMAND9_KEY.compizName; array[68].pluginName = plugins->COMMANDS; array[68].settingName = settings->COMMANDS_RUN_COMMAND8_KEY.compizName; array[69].pluginName = plugins->COMMANDS; array[69].settingName = settings->COMMANDS_RUN_COMMAND7_KEY.compizName; array[70].pluginName = plugins->COMMANDS; array[70].settingName = settings->COMMANDS_RUN_COMMAND6_KEY.compizName; array[71].pluginName = plugins->COMMANDS; array[71].settingName = settings->COMMANDS_RUN_COMMAND5_KEY.compizName; array[72].pluginName = plugins->COMMANDS; array[72].settingName = settings->COMMANDS_RUN_COMMAND4_KEY.compizName; array[73].pluginName = plugins->COMMANDS; array[73].settingName = settings->COMMANDS_RUN_COMMAND3_KEY.compizName; array[74].pluginName = plugins->COMMANDS; array[74].settingName = settings->COMMANDS_RUN_COMMAND2_KEY.compizName; array[75].pluginName = plugins->COMMANDS; array[75].settingName = settings->COMMANDS_RUN_COMMAND1_KEY.compizName; array[76].pluginName = plugins->COMMANDS; array[76].settingName = settings->COMMANDS_RUN_COMMAND0_KEY.compizName; array[77].pluginName = plugins->COMMANDS; array[77].settingName = settings->COMMANDS_COMMAND11.compizName; array[78].pluginName = plugins->COMMANDS; array[78].settingName = settings->COMMANDS_COMMAND10.compizName; array[79].pluginName = plugins->COMMANDS; array[79].settingName = settings->COMMANDS_COMMAND9.compizName; array[80].pluginName = plugins->COMMANDS; array[80].settingName = settings->COMMANDS_COMMAND8.compizName; array[81].pluginName = plugins->COMMANDS; array[81].settingName = settings->COMMANDS_COMMAND7.compizName; array[82].pluginName = plugins->COMMANDS; array[82].settingName = settings->COMMANDS_COMMAND6.compizName; array[83].pluginName = plugins->COMMANDS; array[83].settingName = settings->COMMANDS_COMMAND5.compizName; array[84].pluginName = plugins->COMMANDS; array[84].settingName = settings->COMMANDS_COMMAND4.compizName; array[85].pluginName = plugins->COMMANDS; array[85].settingName = settings->COMMANDS_COMMAND3.compizName; array[86].pluginName = plugins->COMMANDS; array[86].settingName = settings->COMMANDS_COMMAND2.compizName; array[87].pluginName = plugins->COMMANDS; array[87].settingName = settings->COMMANDS_COMMAND1.compizName; array[88].pluginName = plugins->COMMANDS; array[88].settingName = settings->COMMANDS_COMMAND0.compizName; array[89].pluginName = plugins->EXTRAWM; array[89].settingName = settings->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName; array[90].pluginName = plugins->EXTRAWM; array[90].settingName = settings->EXTRAWM_TOGGLE_STICKY_KEY.compizName; array[91].pluginName = plugins->STATICSWITCHER; array[91].settingName = settings->STATICSWITCHER_PREV_KEY.compizName; array[92].pluginName = plugins->STATICSWITCHER; array[92].settingName = settings->STATICSWITCHER_NEXT_KEY.compizName; array[93].pluginName = plugins->FADE; array[93].settingName = settings->FADE_FULLSCREEN_VISUAL_BELL.compizName; array[94].pluginName = plugins->FADE; array[94].settingName = settings->FADE_VISUAL_BELL.compizName; array[95].pluginName = plugins->SPECIAL; array[95].settingName = settings->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName; array[96].pluginName = plugins->SPECIAL; array[96].settingName = settings->NULL_MOUSE_BUTTON_MODIFIER.compizName; array[97].pluginName = plugins->CORE; array[97].settingName = settings->CORE_WINDOW_MENU_BUTTON.compizName; array[98].pluginName = plugins->RESIZE; array[98].settingName = settings->RESIZE_INITIATE_BUTTON.compizName; array[99].pluginName = plugins->MOVE; array[99].settingName = settings->MOVE_INITIATE_BUTTON.compizName; array[100].pluginName = plugins->CORE; array[100].settingName = settings->CORE_WINDOW_MENU_KEY.compizName; array[101].pluginName = plugins->RESIZE; array[101].settingName = settings->RESIZE_INITIATE_KEY.compizName; array[102].pluginName = plugins->MOVE; array[102].settingName = settings->MOVE_INITIATE_KEY.compizName; array[103].pluginName = plugins->CORE; array[103].settingName = settings->CORE_SHOW_DESKTOP_KEY.compizName; array[104].pluginName = plugins->CORE; array[104].settingName = settings->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName; array[105].pluginName = plugins->CORE; array[105].settingName = settings->CORE_CLOSE_WINDOW_KEY.compizName; array[106].pluginName = plugins->CORE; array[106].settingName = settings->CORE_LOWER_WINDOW_KEY.compizName; array[107].pluginName = plugins->CORE; array[107].settingName = settings->CORE_RAISE_WINDOW_KEY.compizName; array[108].pluginName = plugins->CORE; array[108].settingName = settings->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName; array[109].pluginName = plugins->CORE; array[109].settingName = settings->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName; array[110].pluginName = plugins->CORE; array[110].settingName = settings->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName; array[111].pluginName = plugins->CORE; array[111].settingName = settings->CORE_MAXIMIZE_WINDOW_KEY.compizName; array[112].pluginName = plugins->CORE; array[112].settingName = settings->CORE_MINIMIZE_WINDOW_KEY.compizName; array[113].pluginName = plugins->CORE; array[113].settingName = settings->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName; array[114].pluginName = plugins->GNOMECOMPAT; array[114].settingName = settings->GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName; array[115].pluginName = plugins->GNOMECOMPAT; array[115].settingName = settings->GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName; array[116].pluginName = plugins->GNOMECOMPAT; array[116].settingName = settings->GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName; array[117].pluginName = plugins->GNOMECOMPAT; array[117].settingName = settings->GNOMECOMPAT_MAIN_MENU_KEY.compizName; array[118].pluginName = plugins->GNOMECOMPAT; array[118].settingName = settings->GNOMECOMPAT_RUN_KEY.compizName; array[119].pluginName = plugins->UNITYSHELL; array[119].settingName = settings->UNITYSHELL_SHOW_HUD.compizName; return NULL; } const CCSGNOMEIntegratedSettingsList * ccsGNOMEIntegratedSettingsList () { static GOnce initIntegratedSettings = G_ONCE_INIT; static CCSGNOMEIntegratedSettingsList settings[CCS_GNOME_INTEGRATED_SETTINGS_LIST_SIZE]; g_once (&initIntegratedSettings, ccsGNOMEIntegrationInitializeIntegratedSettingsList, (gpointer) settings); return settings; } gpointer ccsGNOMEGSettingsIntegrationInitializeIntegratedSchemasQuarks (gpointer data) { CCSGSettingsWrapperIntegratedSchemasQuarks *quarks = (CCSGSettingsWrapperIntegratedSchemasQuarks *) data; static const char *org_compiz_integrated = "org.compiz.integrated"; static const char *org_gnome_desktop_wm_keybindings = "org.gnome.desktop.wm.keybindings"; static const char *org_gnome_desktop_wm_preferences = "org.gnome.desktop.wm.preferences"; static const char *org_gnome_settings_daemon_plugins_media_keys = "org.gnome.settings-daemon.plugins.media-keys"; static const char *org_gnome_desktop_default_applications_terminal = "org.gnome.desktop.default-applications.terminal"; quarks->ORG_COMPIZ_INTEGRATED = g_quark_from_string (org_compiz_integrated); quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS = g_quark_from_string (org_gnome_desktop_wm_keybindings); quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES = g_quark_from_string (org_gnome_desktop_wm_preferences); quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS = g_quark_from_string (org_gnome_settings_daemon_plugins_media_keys); quarks->ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL = g_quark_from_string (org_gnome_desktop_default_applications_terminal); return NULL; } const CCSGSettingsWrapperIntegratedSchemasQuarks * ccsGNOMEGSettingsWrapperQuarks () { static GOnce initIntegratedSchemaQuarks = G_ONCE_INIT; static CCSGSettingsWrapperIntegratedSchemasQuarks quarks; g_once (&initIntegratedSchemaQuarks, ccsGNOMEGSettingsIntegrationInitializeIntegratedSchemasQuarks, (gpointer) &quarks); return &quarks; } static void destroyHashTableInternal (void *ht) { g_hash_table_unref ((GHashTable *) ht); } GHashTable * ccsGNOMEGSettingsIntegrationPopulateSettingNameToIntegratedSchemasQuarksHashTable () { GHashTable *masterHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroyHashTableInternal); GHashTable *coreHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *thumbnailHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *gnomecompatHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *rotateHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *putHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *wallHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *vpswitchHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *commandsHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *extrawmHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *resizeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *moveHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *staticswitcherHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *fadeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *unityshellHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *specialHashTable = g_hash_table_new (g_str_hash, g_str_equal); const CCSGNOMEIntegratedSettingNames *names = &ccsGNOMEIntegratedSettingNames; const CCSGNOMEIntegratedPluginNames *plugins = &ccsGNOMEIntegratedPluginNames; const CCSGSettingsWrapperIntegratedSchemasQuarks *quarks = ccsGNOMEGSettingsWrapperQuarks (); g_hash_table_insert (masterHashTable, (gpointer) plugins->CORE, coreHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->THUMBNAIL, thumbnailHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->GNOMECOMPAT, gnomecompatHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->ROTATE, rotateHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->PUT, putHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->WALL, wallHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->VPSWITCH, vpswitchHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->COMMANDS, commandsHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->EXTRAWM, extrawmHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->STATICSWITCHER, staticswitcherHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->FADE, fadeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->RESIZE, resizeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MOVE, moveHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->UNITYSHELL, unityshellHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->SPECIAL, specialHashTable); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUDIBLE_BELL.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLICK_TO_FOCUS.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_ON_CLICK.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE_DELAY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (thumbnailHashTable, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_TERMINAL.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_SCREENSHOT.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOM_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOP_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_RIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_LEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPLEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND11.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND10.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND9.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND8.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND7.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND6.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND5.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND4.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND3.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND2.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND1.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND0.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_PREV_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_NEXT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_VISUAL_BELL.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_BUTTON.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_BUTTON.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_BUTTON.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_SHOW_DESKTOP_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLOSE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_LOWER_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_MAIN_MENU_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (unityshellHashTable, (gpointer) names->UNITYSHELL_SHOW_HUD.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); return masterHashTable; } GHashTable * ccsGNOMEIntegrationPopulateCategoriesHashTables () { GHashTable *masterHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroyHashTableInternal); GHashTable *coreHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *thumbnailHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *gnomecompatHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *rotateHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *putHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *wallHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *vpswitchHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *commandsHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *extrawmHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *resizeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *moveHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *staticswitcherHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *fadeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *unityshellHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *specialHashTable = g_hash_table_new (g_str_hash, g_str_equal); const CCSGNOMEIntegratedSettingNames *names = &ccsGNOMEIntegratedSettingNames; const CCSGConfIntegrationCategories *categories = &ccsGConfIntegrationCategories; const CCSGNOMEIntegratedPluginNames *plugins = &ccsGNOMEIntegratedPluginNames; g_hash_table_insert (masterHashTable, (gpointer) plugins->CORE, coreHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->THUMBNAIL, thumbnailHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->GNOMECOMPAT, gnomecompatHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->ROTATE, rotateHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->PUT, putHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->WALL, wallHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->VPSWITCH, vpswitchHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->COMMANDS, commandsHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->EXTRAWM, extrawmHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->STATICSWITCHER, staticswitcherHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->FADE, fadeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->RESIZE, resizeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MOVE, moveHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->UNITYSHELL, unityshellHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->SPECIAL, specialHashTable); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUDIBLE_BELL.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLICK_TO_FOCUS.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_ON_CLICK.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE_DELAY.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (thumbnailHashTable, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.compizName, (gpointer) categories->APPS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_TERMINAL.compizName, (gpointer) categories->DESKTOP); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_SCREENSHOT.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOM_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOP_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_RIGHT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_LEFT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPLEFT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND11.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND10.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND9.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND8.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND7.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND6.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND5.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND4.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND3.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND2.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND1.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND0.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_PREV_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_NEXT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_VISUAL_BELL.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_BUTTON.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_BUTTON.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_BUTTON.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_SHOW_DESKTOP_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLOSE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_LOWER_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_MAIN_MENU_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (unityshellHashTable, (gpointer) names->UNITYSHELL_SHOW_HUD.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); return masterHashTable; } GHashTable * ccsGNOMEIntegrationPopulateSpecialTypesHashTables () { GHashTable *masterHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroyHashTableInternal); GHashTable *coreHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *thumbnailHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *gnomecompatHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *rotateHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *putHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *wallHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *vpswitchHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *commandsHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *extrawmHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *resizeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *moveHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *staticswitcherHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *fadeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *unityshellHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *specialHashTable = g_hash_table_new (g_str_hash, g_str_equal); const CCSGNOMEIntegratedSettingNames *names = &ccsGNOMEIntegratedSettingNames; const CCSGNOMEIntegratedPluginNames *plugins = &ccsGNOMEIntegratedPluginNames; g_hash_table_insert (masterHashTable, (gpointer) plugins->CORE, coreHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->THUMBNAIL, thumbnailHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->GNOMECOMPAT, gnomecompatHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->ROTATE, rotateHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->PUT, putHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->WALL, wallHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->VPSWITCH, vpswitchHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->COMMANDS, commandsHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->EXTRAWM, extrawmHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->STATICSWITCHER, staticswitcherHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->FADE, fadeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->RESIZE, resizeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MOVE, moveHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->UNITYSHELL, unityshellHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->SPECIAL, specialHashTable); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUDIBLE_BELL.compizName, GINT_TO_POINTER (OptionBool)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLICK_TO_FOCUS.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_ON_CLICK.compizName, GINT_TO_POINTER (OptionBool)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE_DELAY.compizName, GINT_TO_POINTER (OptionInt)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE.compizName, GINT_TO_POINTER (OptionBool)); g_hash_table_insert (thumbnailHashTable, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_TERMINAL.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_SCREENSHOT.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOM_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOP_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_RIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_LEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPLEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND11.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND10.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND9.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND8.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND7.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND6.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND5.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND4.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND3.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND2.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND1.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND0.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_PREV_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_NEXT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_VISUAL_BELL.compizName, GINT_TO_POINTER (OptionBool)); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_BUTTON.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_BUTTON.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_BUTTON.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_SHOW_DESKTOP_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLOSE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_LOWER_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_MAIN_MENU_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (unityshellHashTable, (gpointer) names->UNITYSHELL_SHOW_HUD.compizName, GINT_TO_POINTER (OptionKey)); return masterHashTable; } GHashTable * ccsGNOMEIntegrationPopulateSettingNameToGNOMENameHashTables () { GHashTable *masterHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroyHashTableInternal); GHashTable *coreHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *thumbnailHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *gnomecompatHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *rotateHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *putHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *wallHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *vpswitchHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *commandsHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *extrawmHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *resizeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *moveHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *staticswitcherHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *fadeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *unityshellHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *specialHashTable = g_hash_table_new (g_str_hash, g_str_equal); const CCSGNOMEIntegratedSettingNames *names = &ccsGNOMEIntegratedSettingNames; const CCSGNOMEIntegratedPluginNames *plugins = &ccsGNOMEIntegratedPluginNames; g_hash_table_insert (masterHashTable, (gpointer) plugins->CORE, coreHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->THUMBNAIL, thumbnailHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->GNOMECOMPAT, gnomecompatHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->ROTATE, rotateHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->PUT, putHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->WALL, wallHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->VPSWITCH, vpswitchHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->COMMANDS, commandsHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->EXTRAWM, extrawmHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->STATICSWITCHER, staticswitcherHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->FADE, fadeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->RESIZE, resizeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MOVE, moveHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->UNITYSHELL, unityshellHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->SPECIAL, specialHashTable); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUDIBLE_BELL.compizName, (gpointer) names->CORE_AUDIBLE_BELL.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLICK_TO_FOCUS.compizName, (gpointer) names->CORE_CLICK_TO_FOCUS.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_ON_CLICK.compizName, (gpointer) names->CORE_RAISE_ON_CLICK.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE_DELAY.compizName, (gpointer) names->CORE_AUTORAISE_DELAY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE.compizName, (gpointer) names->CORE_AUTORAISE.gnomeName); g_hash_table_insert (thumbnailHashTable, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.compizName, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_TERMINAL.compizName, (gpointer) names->GNOMECOMPAT_COMMAND_TERMINAL.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName, (gpointer) names->GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_SCREENSHOT.compizName, (gpointer) names->GNOMECOMPAT_COMMAND_SCREENSHOT.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOM_KEY.compizName, (gpointer) names->PUT_PUT_BOTTOM_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOP_KEY.compizName, (gpointer) names->PUT_PUT_TOP_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_RIGHT_KEY.compizName, (gpointer) names->PUT_PUT_RIGHT_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_LEFT_KEY.compizName, (gpointer) names->PUT_PUT_LEFT_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.compizName, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.compizName, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.compizName, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPLEFT_KEY.compizName, (gpointer) names->PUT_PUT_TOPLEFT_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_WINDOW_KEY.compizName, (gpointer) names->WALL_DOWN_WINDOW_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_WINDOW_KEY.compizName, (gpointer) names->WALL_UP_WINDOW_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_WINDOW_KEY.compizName, (gpointer) names->WALL_RIGHT_WINDOW_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_WINDOW_KEY.compizName, (gpointer) names->WALL_LEFT_WINDOW_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_KEY.compizName, (gpointer) names->WALL_RIGHT_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_KEY.compizName, (gpointer) names->WALL_LEFT_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_KEY.compizName, (gpointer) names->WALL_DOWN_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_KEY.compizName, (gpointer) names->WALL_UP_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.compizName, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.compizName, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND11.compizName, (gpointer) names->COMMANDS_COMMAND11.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND10.compizName, (gpointer) names->COMMANDS_COMMAND10.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND9.compizName, (gpointer) names->COMMANDS_COMMAND9.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND8.compizName, (gpointer) names->COMMANDS_COMMAND8.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND7.compizName, (gpointer) names->COMMANDS_COMMAND7.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND6.compizName, (gpointer) names->COMMANDS_COMMAND6.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND5.compizName, (gpointer) names->COMMANDS_COMMAND5.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND4.compizName, (gpointer) names->COMMANDS_COMMAND4.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND3.compizName, (gpointer) names->COMMANDS_COMMAND3.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND2.compizName, (gpointer) names->COMMANDS_COMMAND2.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND1.compizName, (gpointer) names->COMMANDS_COMMAND1.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND0.compizName, (gpointer) names->COMMANDS_COMMAND0.gnomeName); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.gnomeName); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.compizName, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.gnomeName); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_PREV_KEY.compizName, (gpointer) names->STATICSWITCHER_PREV_KEY.gnomeName); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_NEXT_KEY.compizName, (gpointer) names->STATICSWITCHER_NEXT_KEY.gnomeName); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.compizName, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.gnomeName); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_VISUAL_BELL.compizName, (gpointer) names->FADE_VISUAL_BELL.gnomeName); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.gnomeName); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.compizName, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_BUTTON.compizName, (gpointer) names->CORE_WINDOW_MENU_BUTTON.gnomeName); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_BUTTON.compizName, (gpointer) names->RESIZE_INITIATE_BUTTON.gnomeName); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_BUTTON.compizName, (gpointer) names->MOVE_INITIATE_BUTTON.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_KEY.compizName, (gpointer) names->CORE_WINDOW_MENU_KEY.gnomeName); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_KEY.compizName, (gpointer) names->RESIZE_INITIATE_KEY.gnomeName); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_KEY.compizName, (gpointer) names->MOVE_INITIATE_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_SHOW_DESKTOP_KEY.compizName, (gpointer) names->CORE_SHOW_DESKTOP_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLOSE_WINDOW_KEY.compizName, (gpointer) names->CORE_CLOSE_WINDOW_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_LOWER_WINDOW_KEY.compizName, (gpointer) names->CORE_LOWER_WINDOW_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_WINDOW_KEY.compizName, (gpointer) names->CORE_RAISE_WINDOW_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.compizName, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.compizName, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_MAIN_MENU_KEY.compizName, (gpointer) names->GNOMECOMPAT_MAIN_MENU_KEY.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_KEY.compizName, (gpointer) names->GNOMECOMPAT_RUN_KEY.gnomeName); g_hash_table_insert (unityshellHashTable, (gpointer) names->UNITYSHELL_SHOW_HUD.compizName, (gpointer) names->UNITYSHELL_SHOW_HUD.gnomeName); return masterHashTable; } compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/include/0000755000015301777760000000000012321344021025236 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/include/ccs_gnome_integrated_setting.h0000644000015301777760000000410112321343002033301 0ustar pbusernogroup00000000000000#ifndef _CCS_GNOME_INTEGRATED_SETTING_H #define _CCS_GNOME_INTEGRATED_SETTING_H #include #include #include #include "ccs_gnome_integration_types.h" COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSGNOMEIntegratedSettingInfoInterface CCSGNOMEIntegratedSettingInfoInterface; typedef SpecialOptionType (*CCSGNOMEIntegratedSettingInfoGetSpecialOptionType) (CCSGNOMEIntegratedSettingInfo *); typedef const char * (*CCSGNOMEIntegratedSettingInfoGetGNOMEName) (CCSGNOMEIntegratedSettingInfo *); typedef void (*CCSGNOMEIntegratedSettingInfoFree) (CCSGNOMEIntegratedSettingInfo *); struct _CCSGNOMEIntegratedSettingInfoInterface { CCSGNOMEIntegratedSettingInfoGetSpecialOptionType getSpecialOptionType; CCSGNOMEIntegratedSettingInfoGetGNOMEName getGNOMEName; CCSGNOMEIntegratedSettingInfoFree free; }; /** * @brief The _CCSGNOMEIntegratedSetting struct * * CCSGNOMEIntegratedSetting represents an integrated setting in * GNOME - it builds upon CCSSharedIntegratedSetting (which it composes * and implements) and also adds the concept of an GNOME side keyname * and option type for that keyname (as the types do not match 1-1) */ struct _CCSGNOMEIntegratedSettingInfo { CCSObject object; }; unsigned int ccsCCSGNOMEIntegratedSettingInfoInterfaceGetType (); Bool ccsGNOMEIntegrationFindSettingsMatchingPredicate (CCSIntegratedSetting *setting, void *userData); SpecialOptionType ccsGNOMEIntegratedSettingInfoGetSpecialOptionType (CCSGNOMEIntegratedSettingInfo *); const char * ccsGNOMEIntegratedSettingInfoGetGNOMEName (CCSGNOMEIntegratedSettingInfo *); CCSGNOMEIntegratedSettingInfo * ccsGNOMEIntegratedSettingInfoNew (CCSIntegratedSettingInfo *base, SpecialOptionType type, const char *gnomeName, CCSObjectAllocationInterface *ai); void ccsFreeGNOMEIntegratedSettingInfo (CCSGNOMEIntegratedSettingInfo *); CCSREF_HDR (GNOMEIntegratedSettingInfo, CCSGNOMEIntegratedSettingInfo); CCSLIST_HDR (GNOMEIntegratedSettingInfo, CCSGNOMEIntegratedSettingInfo); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/include/ccs_gnome_fwd.h0000644000015301777760000000045212321343002030203 0ustar pbusernogroup00000000000000#ifndef _CCS_GNOME_INTEGRATION_FWD_H #define _CCS_GNOME_INTEGRATION_FWD_H #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSGNOMEIntegratedSettingInfo CCSGNOMEIntegratedSettingInfo; typedef struct _CCSGNOMEValueChangeData CCSGNOMEValueChangeData; COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/include/ccs_gnome_integration_types.h0000644000015301777760000000043012321343002033166 0ustar pbusernogroup00000000000000#ifndef _CCS_GNOME_INTEGRATION_TYPES_H #define _CCS_GNOME_INTEGRATION_TYPES_H #include COMPIZCONFIG_BEGIN_DECLS typedef enum { OptionInt, OptionBool, OptionKey, OptionString, OptionSpecial, } SpecialOptionType; COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/include/ccs_gnome_integration.h0000644000015301777760000000235012321343002031745 0ustar pbusernogroup00000000000000#ifndef _CCS_COMPIZCONFIG_GNOME_GCONF_INTEGRATION #define _CCS_COMPIZCONFIG_GNOME_GCONF_INTEGRATION #include #include #include #include "ccs_gnome_integration_types.h" COMPIZCONFIG_BEGIN_DECLS struct _CCSGNOMEValueChangeData { CCSIntegration *integration; CCSIntegratedSettingsStorage *storage; CCSIntegratedSettingFactory *factory; CCSContext *context; }; /** * @brief ccsGNOMEIntegrationBackendNew * @param backend * @param context * @param factory * @param storage * @param ai * @return A new CCSIntegration * * The GNOME implementation of desktop environment integration - requires * a method to create new integrated settings, and a method to store them * as well. * * CCSGNOMEIntegration is a pure composition in most respects - it just * represents the process as to which settings should be written to * what keys and vice versa, it doesn't represent how those keys should * be written. */ CCSIntegration * ccsGNOMEIntegrationBackendNew (CCSBackend *backend, CCSContext *context, CCSIntegratedSettingFactory *factory, CCSIntegratedSettingsStorage *storage, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ././@LongLink0000000000000000000000000000014600000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/include/ccs_gnome_integration_constants.hcompiz-0.9.11+14.04.20140409/compizconfig/integration/gnome/include/ccs_gnome_integration_constants.0000644000015301777760000002371312321343002033677 0ustar pbusernogroup00000000000000#ifndef _CCS_GNOME_INTEGRATION_CONSTANTS_H #define _CCS_GNOME_INTEGRATION_CONSTANTS_H #include #include COMPIZCONFIG_BEGIN_DECLS #include #define METACITY "/apps/metacity" #define NUM_WATCHED_DIRS 3 typedef struct _CCSSettingIntegratedSettingPair CCSSettingIntegratedSettingPair; struct _CCSSettingIntegratedSettingPair { const char *compizName; const char *gnomeName; }; typedef struct _CCSGNOMEIntegratedSettingNames CCSGNOMEIntegratedSettingNames; struct _CCSGNOMEIntegratedSettingNames { CCSSettingIntegratedSettingPair CORE_AUDIBLE_BELL; CCSSettingIntegratedSettingPair CORE_CLICK_TO_FOCUS; CCSSettingIntegratedSettingPair CORE_RAISE_ON_CLICK; CCSSettingIntegratedSettingPair CORE_AUTORAISE_DELAY; CCSSettingIntegratedSettingPair CORE_AUTORAISE; CCSSettingIntegratedSettingPair THUMBNAIL_CURRENT_VIEWPORT; CCSSettingIntegratedSettingPair GNOMECOMPAT_COMMAND_TERMINAL; CCSSettingIntegratedSettingPair GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT; CCSSettingIntegratedSettingPair GNOMECOMPAT_COMMAND_SCREENSHOT; CCSSettingIntegratedSettingPair ROTATE_ROTATE_RIGHT_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_LEFT_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_12_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_11_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_10_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_9_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_8_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_7_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_6_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_5_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_4_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_3_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_2_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_1_WINDOW_KEY; CCSSettingIntegratedSettingPair PUT_PUT_BOTTOM_KEY; CCSSettingIntegratedSettingPair PUT_PUT_TOP_KEY; CCSSettingIntegratedSettingPair PUT_PUT_RIGHT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_LEFT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_BOTTOMRIGHT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_BOTTOMLEFT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_TOPRIGHT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_TOPLEFT_KEY; CCSSettingIntegratedSettingPair WALL_DOWN_WINDOW_KEY; CCSSettingIntegratedSettingPair WALL_UP_WINDOW_KEY; CCSSettingIntegratedSettingPair WALL_RIGHT_WINDOW_KEY; CCSSettingIntegratedSettingPair WALL_LEFT_WINDOW_KEY; CCSSettingIntegratedSettingPair WALL_RIGHT_KEY; CCSSettingIntegratedSettingPair WALL_LEFT_KEY; CCSSettingIntegratedSettingPair WALL_DOWN_KEY; CCSSettingIntegratedSettingPair WALL_UP_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_12_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_11_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_10_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_9_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_8_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_7_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_6_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_5_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_4_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_3_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_2_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_1_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_RIGHT_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_LEFT_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_12_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_11_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_10_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_9_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_8_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_7_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_6_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_5_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_4_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_3_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_2_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_1_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND11_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND10_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND9_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND8_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND7_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND6_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND5_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND4_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND3_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND2_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND1_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND0_KEY; CCSSettingIntegratedSettingPair COMMANDS_COMMAND11; CCSSettingIntegratedSettingPair COMMANDS_COMMAND10; CCSSettingIntegratedSettingPair COMMANDS_COMMAND9; CCSSettingIntegratedSettingPair COMMANDS_COMMAND8; CCSSettingIntegratedSettingPair COMMANDS_COMMAND7; CCSSettingIntegratedSettingPair COMMANDS_COMMAND6; CCSSettingIntegratedSettingPair COMMANDS_COMMAND5; CCSSettingIntegratedSettingPair COMMANDS_COMMAND4; CCSSettingIntegratedSettingPair COMMANDS_COMMAND3; CCSSettingIntegratedSettingPair COMMANDS_COMMAND2; CCSSettingIntegratedSettingPair COMMANDS_COMMAND1; CCSSettingIntegratedSettingPair COMMANDS_COMMAND0; CCSSettingIntegratedSettingPair EXTRAWM_TOGGLE_FULLSCREEN_KEY; CCSSettingIntegratedSettingPair EXTRAWM_TOGGLE_STICKY_KEY; CCSSettingIntegratedSettingPair STATICSWITCHER_PREV_KEY; CCSSettingIntegratedSettingPair STATICSWITCHER_NEXT_KEY; CCSSettingIntegratedSettingPair FADE_FULLSCREEN_VISUAL_BELL; CCSSettingIntegratedSettingPair FADE_VISUAL_BELL; CCSSettingIntegratedSettingPair NULL_RESIZE_WITH_RIGHT_BUTTON; CCSSettingIntegratedSettingPair NULL_MOUSE_BUTTON_MODIFIER; CCSSettingIntegratedSettingPair CORE_WINDOW_MENU_BUTTON; CCSSettingIntegratedSettingPair RESIZE_INITIATE_BUTTON; CCSSettingIntegratedSettingPair MOVE_INITIATE_BUTTON; CCSSettingIntegratedSettingPair CORE_WINDOW_MENU_KEY; CCSSettingIntegratedSettingPair RESIZE_INITIATE_KEY; CCSSettingIntegratedSettingPair MOVE_INITIATE_KEY; CCSSettingIntegratedSettingPair CORE_SHOW_DESKTOP_KEY; CCSSettingIntegratedSettingPair CORE_TOGGLE_WINDOW_SHADED_KEY; CCSSettingIntegratedSettingPair CORE_CLOSE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_LOWER_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_RAISE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY; CCSSettingIntegratedSettingPair CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY; CCSSettingIntegratedSettingPair CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_MAXIMIZE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_MINIMIZE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_TOGGLE_WINDOW_MAXIMIZED_KEY; CCSSettingIntegratedSettingPair GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY; CCSSettingIntegratedSettingPair GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY; CCSSettingIntegratedSettingPair GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY; CCSSettingIntegratedSettingPair GNOMECOMPAT_MAIN_MENU_KEY; CCSSettingIntegratedSettingPair GNOMECOMPAT_RUN_KEY; CCSSettingIntegratedSettingPair UNITYSHELL_SHOW_HUD; }; extern const CCSGNOMEIntegratedSettingNames ccsGNOMEIntegratedSettingNames; typedef struct _CCSGConfIntegrationCategoires CCSGConfIntegrationCategories; struct _CCSGConfIntegrationCategoires { const char *GENERAL; const char *APPS; const char *DESKTOP; const char *KEYBINDING_COMMANDS; const char *WINDOW_KEYBINDINGS; const char *GLOBAL_KEYBINDINGS; }; extern const CCSGConfIntegrationCategories ccsGConfIntegrationCategories; typedef struct _CCSGNOMEIntegratedPluginNames CCSGNOMEIntegratedPluginNames; struct _CCSGNOMEIntegratedPluginNames { const char *CORE; const char *THUMBNAIL; const char *GNOMECOMPAT; const char *ROTATE; const char *PUT; const char *WALL; const char *VPSWITCH; const char *COMMANDS; const char *EXTRAWM; const char *RESIZE; const char *MOVE; const char *STATICSWITCHER; const char *FADE; const char *UNITYSHELL; const char *SPECIAL; }; extern const CCSGNOMEIntegratedPluginNames ccsGNOMEIntegratedPluginNames; extern const char* watchedGConfGnomeDirectories[]; typedef struct _CCSGSettingsWrapperIntegratedSchemasQuarks { GQuark ORG_GNOME_DESKTOP_WM_PREFERENCES; GQuark ORG_GNOME_DESKTOP_WM_KEYBINDINGS; GQuark ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS; GQuark ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL; GQuark ORG_COMPIZ_INTEGRATED; } CCSGSettingsWrapperIntegratedSchemasQuarks; const CCSGSettingsWrapperIntegratedSchemasQuarks *ccsGNOMEGSettingsWrapperQuarks (); GHashTable * ccsGNOMEIntegrationPopulateCategoriesHashTables (); GHashTable * ccsGNOMEIntegrationPopulateSpecialTypesHashTables (); GHashTable * ccsGNOMEIntegrationPopulateSettingNameToGNOMENameHashTables (); GHashTable * ccsGNOMEGSettingsIntegrationPopulateSettingNameToIntegratedSchemasQuarksHashTable (); /* We only have to use the #define here because * C doesn't have a concept of "constants" setting * the array size ... */ #define CCS_GNOME_INTEGRATED_SETTINGS_LIST_SIZE 120 typedef struct _CCSGNOMEIntegratedSettingsList { const char *pluginName; const char *settingName; } CCSGNOMEIntegratedSettingsList; const CCSGNOMEIntegratedSettingsList * ccsGNOMEIntegratedSettingsList (); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/integration/CMakeLists.txt0000644000015301777760000000003112321343002025236 0ustar pbusernogroup00000000000000add_subdirectory (gnome) compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/0000755000015301777760000000000012321344021023341 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/cmake/0000755000015301777760000000000012321344021024421 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/cmake/LibCompizConfigCommon.cmake0000644000015301777760000000725512321343002031621 0ustar pbusernogroup00000000000000find_package (Compiz REQUIRED) include (CompizCommon) include (CompizPackage) file (READ ${CMAKE_SOURCE_DIR}/VERSION COMPIZ_RELEASE_VERSION LIMIT 12 OFFSET 0) string (STRIP ${COMPIZ_RELEASE_VERSION} COMPIZ_RELEASE_VERSION) set (VERSION ${COMPIZ_RELEASE_VERSION}) macro (_get_backend_parameters _prefix) set (_current_var _foo) set (_supported_var PKGDEPS LDFLAGSADD CFLAGSADD LIBRARIES LIBDIRS INCDIRS) foreach (_val ${_supported_var}) set (${_prefix}_${_val}) endforeach (_val) foreach (_val ${ARGN}) set (_found FALSE) foreach (_find ${_supported_var}) if ("${_find}" STREQUAL "${_val}") set (_found TRUE) endif ("${_find}" STREQUAL "${_val}") endforeach (_find) if (_found) set (_current_var ${_prefix}_${_val}) else (_found) list (APPEND ${_current_var} ${_val}) endif (_found) endforeach (_val) endmacro (_get_backend_parameters) # check pkgconfig dependencies macro (_check_backend_pkg_deps _prefix) set (${_prefix}_HAS_PKG_DEPS TRUE) foreach (_val ${ARGN}) string (REGEX REPLACE "[<>=\\.]" "_" _name ${_val}) string (TOUPPER ${_name} _name) compiz_pkg_check_modules (_${_name} ${_val}) if (_${_name}_FOUND) list (APPEND ${_prefix}_PKG_LIBDIRS "${_${_name}_LIBRARY_DIRS}") list (APPEND ${_prefix}_PKG_LIBRARIES "${_${_name}_LIBRARIES}") list (APPEND ${_prefix}_PKG_INCDIRS "${_${_name}_INCLUDE_DIRS}") else () set (${_prefix}_HAS_PKG_DEPS FALSE) compiz_set (COMPIZCONFIG_${_prefix}_MISSING_DEPS "${COMPIZCONFIG_${_prefix}_MISSING_DEPS} ${_val}") set(__pkg_config_checked__${_name} 0 CACHE INTERNAL "" FORCE) endif () endforeach () endmacro () function (compizconfig_backend bname) string (TOUPPER ${bname} _BACKEND) project (compizconfig_${_BACKEND}) _get_backend_parameters (compizconfig_${_BACKEND} ${ARGN}) _check_backend_pkg_deps (compizconfig_${_BACKEND} ${compizconfig_${_BACKEND}_PKGDEPS}) include_directories ( ${CMAKE_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${BACKEND_INCLUDE_DIRS} ${compizconfig_${_BACKEND}_LOCAL_INCDIRS} ${compizconfig_${_BACKEND}_PKG_INCDIRS} ${compizconfig_${_BACKEND}_INCDIRS} ${COMPIZCONFIG_INCLUDE_DIRS} ) link_directories ( ${compizconfig_${_BACKEND}_PKG_LIBDIRS} ${COMPIZCONFIG_LIBRARY_DIRS} ) set (BACKEND_LIBS "") foreach (_val ${BACKEND_LDFLAGS}) set (BACKEND_LIBS "${BACKEND_LIBS}${_val} ") endforeach (_val ${BACKEND_LDFLAGS}) set (BACKEND_CFLAGS "") foreach (_val ${LIBBACKEND_CFLAGS}) set (BACKEND_CFLAGS "${BACKEND_CFLAGS}${_val} ") endforeach (_val ${LIBBACKEND_CFLAGS}) file (GLOB _h_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h") file (GLOB _cpp_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp") file (GLOB _c_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c") add_library ( ${bname} SHARED ${_cpp_files} ${_h_files} ${_c_files}) target_link_libraries ( ${bname} compizconfig ${compizconfig_${_BACKEND}_LOCAL_LIBRARIES} ${compizconfig_${_BACKEND}_PKG_LIBRARIES} ${compizconfig_${_BACKEND}_LIBRARIES} ) if (COMPIZ_BUILD_WITH_RPATH) set_target_properties ( ${bname} PROPERTIES INSTALL_RPATH "${libcompizconfig_libdir}" COMPILE_FLAGS "${${_BACKEND}_CFLAGSADD}" LINK_FLAGS "${${_BACKEND}_LDFLAGSADD}" ) else (COMPIZ_BUILD_WITH_RPATH) set_target_properties ( ${bname} PROPERTIES COMPILE_FLAGS "${${_BACKEND}_CFLAGSADD}" LINK_FLAGS "${${_BACKEND}_LDFLAGSADD}" ) endif () install ( TARGETS ${bname} DESTINATION ${libcompizconfig_libdir}/compizconfig/backends ) endfunction (compizconfig_backend bname) compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/cmake/FindCompizConfig.cmake0000644000015301777760000000647012321343002030620 0ustar pbusernogroup00000000000000################################################################################ # # FindCompizConfig # # This module finds LibCompizConfig (https://launchpad.net/compiz). It uses FindPkgConfig to # locate CompizConfig and adds the CompizConfig CMake module path to the CMake # module path. It also loads the LibCompizConfigDefaults that sets all variables # to compile Compiz modules. # # This module sets the following variables: # COMPIZCONFIG_FOUND ... set to true if compiz and its CompizDefaults macro # is found # # Variables set by the FindPkgConfig macro for compiz # COMPIZCONFIG_LIBRARY_DIRS ... the paths of the libraries (w/o the '-L') # COMPIZCONFIG_LDFLAGS ... all required linker flags # COMPIZCONFIG_LDFLAGS_OTHER ... all other linker flags # COMPIZCONFIG_INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I') # COMPIZCONFIG_CFLAGS ... all required cflags # COMPIZCONFIG_CFLAGS_OTHER ... the other compiler flags # COMPIZCONFIG_VERSION ... version of the module # COMPIZCONFIG_PREFIX ... prefix-directory of the module # COMPIZCONFIG_INCLUDEDIR ... include-dir of the module # COMPIZCONFIG_LIBDIR ... lib-dir of the module # # If the _COMPIZCONFIG_INTERNAL variable is set to true, then this module will do # nothing. This is required for the Compiz core package build system. # # Author: Dennis Kasprzyk # ################################################################################ if (NOT _COMPIZCONFIG_INTERNAL) if (CompizConfig_FIND_REQUIRED) set (_req REQUIRED) endif () # look for pkg-config find_package (PkgConfig ${_req}) if (PKG_CONFIG_FOUND) # do we need to look for a specified version? set (_comp_ver) if (CompizConfig_FIND_VERSION) if (CompizConfig_FIND_VERSION_EXACT) set (_comp_ver "=${CompizConfig_FIND_VERSION}") else () set (_comp_ver ">=${CompizConfig_FIND_VERSION}") endif () endif () # add install prefix to pkgconfig search path if needed string (REGEX REPLACE "([\\+\\(\\)\\^\\\$\\.\\-\\*\\?\\|])" "\\\\\\1" PKGCONFIG_REGEX ${CMAKE_INSTALL_PREFIX}) set (PKGCONFIG_REGEX ".*${PKGCONFIG_REGEX}/lib/pkgconfig:${PKGCONFIG_REGEX}/share/pkgconfig.*") if (NOT "$ENV{PKG_CONFIG_PATH}" MATCHES "${PKGCONFIG_REGEX}") if ("" STREQUAL "$ENV{PKG_CONFIG_PATH}") set (ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/share/pkgconfig") else () set (ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/share/pkgconfig:$ENV{PKG_CONFIG_PATH}") endif () endif () # look for compiz pkg_check_modules (COMPIZCONFIG ${_req} "libcompizconfig") # is the LibCompizConfigCommon module installed? find_path(_compiz_def_macro LibCompizConfigCommon.cmake ${COMPIZCONFIG_PREFIX}/share/compiz/cmake) if (COMPIZCONFIG_FOUND AND _compiz_def_macro) # everything found. Set module path and include defaults module set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${COMPIZCONFIG_PREFIX}/share/compiz/cmake) include (LibCompizConfigCommon) else () set (COMPIZCONFIG_FOUND 0) endif () if (Compiz_FIND_REQUIRED AND NOT COMPIZCONFIG_FOUND) message (FATAL_ERROR "Unable to find CompizConfig ${_comp_ver}") endif () endif () endif () compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/cmake/CMakeLists.txt0000644000015301777760000000021212321343002027152 0ustar pbusernogroup00000000000000set (_files LibCompizConfigCommon.cmake ) install ( FILES ${_files} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/compiz/cmake ) compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/backend/0000755000015301777760000000000012321344021024730 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/backend/CMakeLists.txt0000644000015301777760000000052212321343002027465 0ustar pbusernogroup00000000000000set (CMAKE_MODULE_PATH_ORIG ${CMAKE_MODULE_PATH}) set (LIBCOMPIZCONFIG_CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LIBCOMPIZCONFIGZ_CMAKE_MODULE_PATH}) # Sorry for the kittens include (${CMAKE_CURRENT_SOURCE_DIR}/../cmake/LibCompizConfigCommon.cmake) compizconfig_backend (ini) compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/backend/src/0000755000015301777760000000000012321344021025517 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/backend/src/ini.c0000644000015301777760000003575012321343002026452 0ustar pbusernogroup00000000000000/** * * INI libccs backend * * ini.c * * Copyright (c) 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEFAULTPROF "Default" #define SETTINGPATH "compiz-1/compizconfig" typedef struct _IniPrivData { CCSContext *context; char * lastProfile; IniDictionary * iniFile; unsigned int iniWatchId; } IniPrivData; /* forward declaration */ static void setProfile (IniPrivData *data, char *profile); static char* getIniFileName (char *profile) { char *configDir = NULL; char *fileName = NULL; configDir = getenv ("XDG_CONFIG_HOME"); if (configDir && strlen (configDir)) { if (asprintf (&fileName, "%s/%s/%s.ini", configDir, SETTINGPATH, profile) == -1) return NULL; return fileName; } configDir = getenv ("HOME"); if (configDir && strlen (configDir)) { if (asprintf (&fileName, "%s/.config/%s/%s.ini", configDir, SETTINGPATH, profile) == -1) return NULL; return fileName; } return NULL; } static void processFileEvent (unsigned int watchId, void *closure) { IniPrivData *data = (IniPrivData *) closure; char *fileName; /* our ini file has been modified, reload it */ if (data->iniFile) ccsIniClose (data->iniFile); fileName = getIniFileName (data->lastProfile); if (!fileName) return; data->iniFile = ccsIniOpen (fileName); ccsReadSettings (data->context); free (fileName); } static void setProfile (IniPrivData *data, char *profile) { char *fileName; struct stat fileStat; if (data->iniFile) ccsIniClose (data->iniFile); if (data->iniWatchId) ccsRemoveFileWatch (data->iniWatchId); data->iniFile = NULL; data->iniWatchId = 0; /* first we need to find the file name */ fileName = getIniFileName (profile); if (!fileName) return; /* if the file does not exist, we have to create it */ if (stat (fileName, &fileStat) == -1) { if (errno == ENOENT) { FILE *file; file = fopen (fileName, "w"); if (!file) { free (fileName); return; } fclose (file); } else { free (fileName); return; } } data->iniWatchId = ccsAddFileWatch (fileName, TRUE, processFileEvent, data); /* load the data from the file */ data->iniFile = ccsIniOpen (fileName); free (fileName); } static Bool initBackend (CCSBackend *backend, CCSContext * context) { IniPrivData *newData; newData = calloc (1, sizeof (IniPrivData)); /* initialize the newly allocated part */ newData->context = context; ccsObjectSetPrivate (backend, (CCSPrivate *) newData); return TRUE; } static Bool finiBackend (CCSBackend * backend) { IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return FALSE; if (data->iniFile) ccsIniClose (data->iniFile); if (data->iniWatchId) ccsRemoveFileWatch (data->iniWatchId); if (data->lastProfile) free (data->lastProfile); free (data); ccsObjectSetPrivate (backend, NULL); return TRUE; } static Bool readInit (CCSBackend *backend, CCSContext * context) { const char *currentProfileCCS; char *currentProfile; IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return FALSE; currentProfileCCS = ccsGetProfile (context); if (!currentProfileCCS || !strlen (currentProfileCCS)) currentProfile = strdup (DEFAULTPROF); else currentProfile = strdup (currentProfileCCS); if (!data->lastProfile || (strcmp (data->lastProfile, currentProfile) != 0)) setProfile (data, currentProfile); if (data->lastProfile) free (data->lastProfile); data->lastProfile = currentProfile; return (data->iniFile != NULL); } static void readSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { Bool status = FALSE; char *keyName; IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return; if (asprintf (&keyName, "s%d_%s", ccsContextGetScreenNum (context), ccsSettingGetName (setting)) == -1) return; switch (ccsSettingGetType (setting)) { case TypeString: { char *value; if (ccsIniGetString (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetString (setting, value, TRUE); free (value); status = TRUE; } } break; case TypeMatch: { char *value; if (ccsIniGetString (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetMatch (setting, value, TRUE); free (value); status = TRUE; } } break; case TypeInt: { int value; if (ccsIniGetInt (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetInt (setting, value, TRUE); status = TRUE; } } break; case TypeBool: { Bool value; if (ccsIniGetBool (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetBool (setting, (value != 0), TRUE); status = TRUE; } } break; case TypeFloat: { float value; if (ccsIniGetFloat (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetFloat (setting, value, TRUE); status = TRUE; } } break; case TypeColor: { CCSSettingColorValue color; if (ccsIniGetColor (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &color)) { ccsSetColor (setting, color, TRUE); status = TRUE; } } break; case TypeKey: { CCSSettingKeyValue key; if (ccsIniGetKey (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &key)) { ccsSetKey (setting, key, TRUE); status = TRUE; } } break; case TypeButton: { CCSSettingButtonValue button; if (ccsIniGetButton (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &button)) { ccsSetButton (setting, button, TRUE); status = TRUE; } } break; case TypeEdge: { unsigned int edges; if (ccsIniGetEdge (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &edges)) { ccsSetEdge (setting, edges, TRUE); status = TRUE; } } break; case TypeBell: { Bool bell; if (ccsIniGetBell (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &bell)) { ccsSetBell (setting, bell, TRUE); status = TRUE; } } break; case TypeList: { CCSSettingValueList value; if (ccsIniGetList (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value, setting)) { ccsSetList (setting, value, TRUE); ccsSettingValueListFree (value, TRUE); status = TRUE; } } break; default: break; } if (!status) { /* reset setting to default if it could not be read */ ccsResetToDefault (setting, TRUE); } if (keyName) free (keyName); } static void readDone (CCSBackend *backend, CCSContext * context) { } static Bool writeInit (CCSBackend *backend, CCSContext * context) { const char *currentProfileCCS; char *currentProfile; IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return FALSE; currentProfileCCS = ccsGetProfile (context); if (!currentProfileCCS || !strlen (currentProfileCCS)) currentProfile = strdup (DEFAULTPROF); else currentProfile = strdup (currentProfileCCS); if (!data->lastProfile || (strcmp (data->lastProfile, currentProfile) != 0)) setProfile (data, currentProfile); if (data->lastProfile) free (data->lastProfile); ccsDisableFileWatch (data->iniWatchId); data->lastProfile = currentProfile; return (data->iniFile != NULL); } static void writeSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { char *keyName; IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return; if (asprintf (&keyName, "s%d_%s", ccsContextGetScreenNum (context), ccsSettingGetName (setting)) == -1) return; if (ccsSettingGetIsDefault (setting)) { ccsIniRemoveEntry (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName); free (keyName); return; } switch (ccsSettingGetType (setting)) { case TypeString: { char *value; if (ccsGetString (setting, (const char **) &value)) ccsIniSetString (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeMatch: { char *value; if (ccsGetMatch (setting, (const char **) &value)) ccsIniSetString (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeInt: { int value; if (ccsGetInt (setting, &value)) ccsIniSetInt (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeFloat: { float value; if (ccsGetFloat (setting, &value)) ccsIniSetFloat (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeBool: { Bool value; if (ccsGetBool (setting, &value)) ccsIniSetBool (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeColor: { CCSSettingColorValue value; if (ccsGetColor (setting, &value)) ccsIniSetColor (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeKey: { CCSSettingKeyValue value; if (ccsGetKey (setting, &value)) ccsIniSetKey (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeButton: { CCSSettingButtonValue value; if (ccsGetButton (setting, &value)) ccsIniSetButton (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeEdge: { unsigned int value; if (ccsGetEdge (setting, &value)) ccsIniSetEdge (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeBell: { Bool value; if (ccsGetBell (setting, &value)) ccsIniSetBell (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeList: { CCSSettingValueList value; if (ccsGetList (setting, &value)) ccsIniSetList (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value, ccsSettingGetInfo (setting)->forList.listType); } break; default: break; } if (keyName) free (keyName); } static void writeDone (CCSBackend *backend, CCSContext * context) { /* export the data to ensure the changes are on disk */ char *fileName; const char *currentProfileCCS; char *currentProfile; IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return; currentProfileCCS = ccsGetProfile (context); if (!currentProfileCCS || !strlen (currentProfileCCS)) currentProfile = strdup (DEFAULTPROF); else currentProfile = strdup (currentProfileCCS); fileName = getIniFileName (currentProfile); free (currentProfile); ccsIniSave (data->iniFile, fileName); ccsEnableFileWatch (data->iniWatchId); free (fileName); } static void updateSetting (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) { if (readInit (backend, context)) { readSetting (backend, context, setting); readDone (backend, context); } } static Bool getSettingIsReadOnly (CCSBackend *backend, CCSSetting * setting) { /* FIXME */ return FALSE; } static int profileNameFilter (const struct dirent *name) { int length = strlen (name->d_name); if (strncmp (name->d_name + length - 6, ".ini++", 6)) return 0; return 1; } static CCSStringList scanConfigDir (char * filePath) { CCSStringList ret = NULL; struct dirent **nameList; char *pos; int nFile, i; nFile = scandir (filePath, &nameList, profileNameFilter, NULL); if (nFile <= 0) return NULL; for (i = 0; i < nFile; ++i) { pos = strrchr (nameList[i]->d_name, '.'); if (pos) { CCSString *pString = malloc (sizeof (CCSString)); *pos = 0; pString->value = strdup (nameList[i]->d_name); pString->refCount = 1; if (strcmp (nameList[i]->d_name, DEFAULTPROF) != 0) ret = ccsStringListAppend (ret, pString); } free (nameList[i]); } free (nameList); return ret; } static CCSStringList getExistingProfiles (CCSBackend *backend, CCSContext * context) { CCSStringList ret = NULL; char *filePath = NULL; char *homeDir = NULL; char *configDir = NULL; configDir = getenv ("XDG_CONFIG_HOME"); if (configDir && strlen (configDir)) { if (asprintf (&filePath, "%s/%s", configDir, SETTINGPATH) == -1) return NULL; ret = scanConfigDir(filePath); free(filePath); if (ret) return ret; } homeDir = getenv ("HOME"); if (!homeDir) return NULL; if (asprintf (&filePath, "%s/.config/%s", homeDir, SETTINGPATH) == -1) filePath = NULL; if (!filePath) return NULL; ret = scanConfigDir(filePath); free(filePath); return ret; } static Bool deleteProfile (CCSBackend *backend, CCSContext * context, char * profile) { char *fileName; fileName = getIniFileName (profile); if (!fileName) return FALSE; remove (fileName); free (fileName); return TRUE; } const CCSBackendInfo iniBackendInfo = { "ini", "Flat-file Configuration Backend", "Flat file Configuration Backend for libccs", FALSE, TRUE, 1 }; static const CCSBackendInfo * getInfo (CCSBackend *backend) { return &iniBackendInfo; } static CCSBackendInterface iniVTable = { getInfo, NULL, initBackend, finiBackend, readInit, readSetting, readDone, writeInit, writeSetting, writeDone, updateSetting, NULL, getSettingIsReadOnly, getExistingProfiles, deleteProfile }; CCSBackendInterface * getBackendInfo (void) { return &iniVTable; } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/libcompizconfig.pc.in0000644000015301777760000000051712321343002027451 0ustar pbusernogroup00000000000000prefix=@libcompizconfig_prefix@ exec_prefix=@libcompizconfig_exec_prefix@ libdir=@libcompizconfig_libdir@ includedir=@libcompizconfig_includedir@ Name: libcompizconfig Description: Compiz configuration system Version: @VERSION@ Requires: compiz Libs: -L@libcompizconfig_libdir@ -lcompizconfig Cflags: -I@libcompizconfig_includedir@ compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/0000755000015301777760000000000012321344021024503 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_util.cpp0000644000015301777760000002306712321343002032630 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include #include #include #include #include using ::testing::WithParamInterface; namespace { const std::string firstBindingString = ""; const std::string secondBindingString = ""; const unsigned int firstBindingMask = (1 << 0); const unsigned int secondBindingMask = (1 << 1); } TEST (CCSUtilTest, TestAddKeybindingMaskToStringInitial) { char *bindingStringChar = NULL; unsigned int addedBindingMask = 0; ccsAddKeybindingMaskToString (&bindingStringChar, firstBindingMask, &addedBindingMask, firstBindingMask, firstBindingString.c_str ()); CharacterWrapper bindingString (bindingStringChar); EXPECT_EQ (firstBindingString, bindingStringChar); EXPECT_EQ (addedBindingMask, firstBindingMask); } TEST (CCSUtilTest, TestAddKeybindingMaskToStringNoDuplicates) { char *bindingStringChar = NULL; unsigned int addedBindingMask = 0; ccsAddKeybindingMaskToString (&bindingStringChar, firstBindingMask, &addedBindingMask, firstBindingMask, firstBindingString.c_str ()); ccsAddKeybindingMaskToString (&bindingStringChar, firstBindingMask, &addedBindingMask, firstBindingMask, secondBindingString.c_str ()); CharacterWrapper bindingString (bindingStringChar); EXPECT_EQ (firstBindingString, bindingStringChar); EXPECT_EQ (addedBindingMask, firstBindingMask); } TEST (CCSUtilTest, TestAddStringToKeybindingMask) { unsigned int bindingMask = 0; ccsAddStringToKeybindingMask (&bindingMask, firstBindingString.c_str (), firstBindingMask, firstBindingString.c_str ()); EXPECT_EQ (bindingMask, firstBindingMask); } namespace { class ModifierParam { public: ModifierParam (const char *modifierString, unsigned int modifierMask, bool match) : mModifierString (modifierString), mModifierMask (modifierMask), mMatch (match) { } ModifierParam (const ModifierParam ¶m) : mModifierString (param.mModifierString), mModifierMask (param.mModifierMask), mMatch (param.mMatch) { } friend void swap (ModifierParam &lhs, ModifierParam &rhs) { using std::swap; swap (lhs.mMatch, rhs.mMatch); swap (lhs.mModifierMask, rhs.mModifierMask); swap (lhs.mModifierString, rhs.mModifierString); } ModifierParam & operator= (const ModifierParam &other) { ModifierParam to (other); swap (*this, to); return *this; } std::string mModifierString; unsigned int mModifierMask; bool mMatch; }; ::testing::internal::ParamGenerator GenerateModifierParams () { std::vector params; params.reserve (ccsInternalUtilNumModifiers () * ccsInternalUtilNumModifiers ()); for (unsigned int i = 0; i < ccsInternalUtilNumModifiers (); ++i) { if (modifierList[i].name == std::string ("")) continue; for (unsigned int j = 0; j < ccsInternalUtilNumModifiers (); ++j) { const bool modifierMatch = modifierList[i].modifier == modifierList[j].modifier; params.push_back (ModifierParam (modifierList[i].name, modifierList[j].modifier, modifierMatch)); } } return ::testing::ValuesIn (params); } bool CheckModifierListSanity () { return (modifierList[0].modifier != modifierList[1].modifier) && (std::string (modifierList[0].name) != std::string (modifierList[1].name)); } const char *modifierSanityMsg = "This test requires the name and modifier " \ "value in modifierList[0] and " \ "modifierList[1] to be different " \ "to work correctly"; } class CCSUtilModifiersTest : public ::testing::Test, public WithParamInterface { }; TEST_P (CCSUtilModifiersTest, TestModifiersToString) { CharacterWrapper modifierString (ccsModifiersToString (GetParam ().mModifierMask)); char *modifierStringChar = modifierString; /* Force "" to test as "" as "" * should never be reachable */ const std::string expectedModifierString (GetParam ().mModifierString != std::string ("") ? GetParam ().mModifierString : ""); if (GetParam ().mMatch) EXPECT_EQ (expectedModifierString, modifierStringChar); else EXPECT_NE (expectedModifierString, modifierStringChar); } TEST_P (CCSUtilModifiersTest, TestStringToModifiers) { unsigned int modifierMask (ccsStringToModifiers (GetParam ().mModifierString.c_str ())); if (GetParam ().mMatch) EXPECT_EQ (GetParam ().mModifierMask, modifierMask); else EXPECT_NE (GetParam ().mModifierMask, modifierMask); } INSTANTIATE_TEST_CASE_P (CCSRealModifiers, CCSUtilModifiersTest, GenerateModifierParams ()); TEST (CCSUtilModifierTest, TestMultiModifierToString) { ASSERT_TRUE (CheckModifierListSanity ()) << modifierSanityMsg; const unsigned int modifierMask = modifierList[0].modifier | modifierList[1].modifier; const std::string expectedModifierString = std::string (modifierList[0].name) + std::string (modifierList[1].name); CharacterWrapper modifierString (ccsModifiersToString (modifierMask)); const char *modifierStringChar = modifierString; EXPECT_EQ (expectedModifierString, modifierStringChar); } TEST (CCSUtilModifierTest, TestMultiStringToModifier) { ASSERT_TRUE (CheckModifierListSanity ()) << modifierSanityMsg; const unsigned int expectedModifierMask = modifierList[0].modifier | modifierList[1].modifier; const std::string modifierString = std::string (modifierList[0].name) + std::string (modifierList[1].name); unsigned int modifierMask = (ccsStringToModifiers (modifierString.c_str ())); EXPECT_EQ (expectedModifierMask, modifierMask); } namespace { static const std::string emptyProfileName (""); static const std::string globalTestProfileName ("test"); static const std::string globalGeneralProfileSection ("general"); static const std::string globalGeneralProfileSectionUnderscore ("general_"); static const std::string globalTestGeneralProfileSection (globalGeneralProfileSectionUnderscore + globalTestProfileName); static const std::string globalGNOMEProfileSection ("gnome_session"); static const std::string globalKDE4ProfileSection ("kde4_session"); static const std::string globalKDE3ProfileSection ("kde_session"); static const std::string four ("4"); static const std::string trueStr ("true"); const char * getConstCharFromCharacterWrapper (const CharacterWrapper &wrap) { return wrap; } } std::ostream & operator<< (std::ostream &os, const CharacterWrapper &wrap) { return os << getConstCharFromCharacterWrapper (wrap); } bool operator== (const std::string &str, const CharacterWrapper &wrap) { return str == getConstCharFromCharacterWrapper (wrap); } class CCSUtilProfileSelection : public ::testing::Test { public: CCSUtilProfileSelection () : ccsEnv ("COMPIZ_CONFIG_PROFILE", NULL), gnomeEnv ("GNOME_DESKTOP_SESSION_ID", NULL), kde4Env ("KDE_SESSION_VERSION", NULL), kdeEnv ("KDE_FULL_SESSION", NULL) { } private: TmpEnv ccsEnv; TmpEnv gnomeEnv; TmpEnv kde4Env; TmpEnv kdeEnv; }; TEST_F (CCSUtilProfileSelection, OverrideWithName) { TmpEnv env ("COMPIZ_CONFIG_PROFILE", globalTestProfileName.c_str ()); CharacterWrapper sName (getSectionName ()); EXPECT_EQ (globalTestGeneralProfileSection, sName); } TEST_F (CCSUtilProfileSelection, OverrideWithNoName) { TmpEnv env ("COMPIZ_CONFIG_PROFILE", emptyProfileName.c_str ()); CharacterWrapper sName (getSectionName ()); EXPECT_EQ (globalGeneralProfileSection, sName); } TEST_F (CCSUtilProfileSelection, NoOverrideInGNOME) { TmpEnv env ("GNOME_DESKTOP_SESSION_ID", globalTestProfileName.c_str ()); CharacterWrapper sName (getSectionName ()); EXPECT_EQ (globalGNOMEProfileSection, sName); } TEST_F (CCSUtilProfileSelection, NoOverrideInKDE4) { TmpEnv env ("KDE_SESSION_VERSION", four.c_str ()); CharacterWrapper sName (getSectionName ()); EXPECT_EQ (globalKDE4ProfileSection, sName); } TEST_F (CCSUtilProfileSelection, NoOverrideInKDE3) { TmpEnv env ("KDE_FULL_SESSION", trueStr.c_str ()); CharacterWrapper sName (getSectionName ()); EXPECT_EQ (globalKDE3ProfileSection, sName); } TEST_F (CCSUtilProfileSelection, Fallback) { CharacterWrapper sName (getSectionName ()); EXPECT_EQ (globalGeneralProfileSection, sName); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_setting.cpp0000644000015301777760000013461112321343002033326 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd * Copyright (C) 2012 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include #include #include #include #include "compizconfig_ccs_setting_mock.h" #include "compizconfig_ccs_plugin_mock.h" #include "compizconfig_ccs_list_wrapper.h" namespace cci = compiz::config::impl; namespace cc = compiz::config; using ::testing::_; using ::testing::Return; using ::testing::InSequence; using ::testing::WithArgs; using ::testing::WithParamInterface; using ::testing::Invoke; using ::testing::ReturnNull; using ::testing::Values; using ::testing::Combine; TEST(CCSSettingTest, TestMock) { CCSSetting *setting = ccsMockSettingNew (); CCSSettingGMock *mock = (CCSSettingGMock *) ccsObjectGetPrivate (setting); EXPECT_CALL (*mock, getName ()); EXPECT_CALL (*mock, getShortDesc ()); EXPECT_CALL (*mock, getLongDesc ()); EXPECT_CALL (*mock, getType ()); EXPECT_CALL (*mock, getInfo ()); EXPECT_CALL (*mock, getGroup ()); EXPECT_CALL (*mock, getSubGroup ()); EXPECT_CALL (*mock, getHints ()); EXPECT_CALL (*mock, getDefaultValue ()); EXPECT_CALL (*mock, getValue ()); EXPECT_CALL (*mock, getIsDefault ()); EXPECT_CALL (*mock, getParent ()); EXPECT_CALL (*mock, getPrivatePtr ()); EXPECT_CALL (*mock, setPrivatePtr (_)); EXPECT_CALL (*mock, setInt (_, _)); EXPECT_CALL (*mock, setFloat (_, _)); EXPECT_CALL (*mock, setBool (_, _)); EXPECT_CALL (*mock, setString (_, _)); EXPECT_CALL (*mock, setColor (_, _)); EXPECT_CALL (*mock, setMatch (_, _)); EXPECT_CALL (*mock, setKey (_, _)); EXPECT_CALL (*mock, setButton (_, _)); EXPECT_CALL (*mock, setEdge (_, _)); EXPECT_CALL (*mock, setBell (_, _)); EXPECT_CALL (*mock, setList (_, _)); EXPECT_CALL (*mock, setValue (_, _)); EXPECT_CALL (*mock, getInt (_)); EXPECT_CALL (*mock, getFloat (_)); EXPECT_CALL (*mock, getBool (_)); EXPECT_CALL (*mock, getString (_)); EXPECT_CALL (*mock, getColor (_)); EXPECT_CALL (*mock, getMatch (_)); EXPECT_CALL (*mock, getKey (_)); EXPECT_CALL (*mock, getButton (_)); EXPECT_CALL (*mock, getEdge (_)); EXPECT_CALL (*mock, getBell (_)); EXPECT_CALL (*mock, getList (_)); EXPECT_CALL (*mock, resetToDefault (_)); EXPECT_CALL (*mock, isIntegrated ()); EXPECT_CALL (*mock, isReadOnly ()); EXPECT_CALL (*mock, isReadableByBackend ()); CCSSettingColorValue cv; CCSSettingKeyValue kv; CCSSettingButtonValue bv; CCSSettingValueList lv = NULL; ccsSettingGetName (setting); ccsSettingGetShortDesc (setting); ccsSettingGetLongDesc (setting); ccsSettingGetType (setting); ccsSettingGetInfo (setting); ccsSettingGetGroup (setting); ccsSettingGetSubGroup (setting); ccsSettingGetHints (setting); ccsSettingGetDefaultValue (setting); ccsSettingGetValue (setting); ccsSettingGetIsDefault (setting); ccsSettingGetParent (setting); ccsSettingGetPrivatePtr (setting); ccsSettingSetPrivatePtr (setting, NULL); ccsSetInt (setting, 1, FALSE); ccsSetFloat (setting, 1.0, FALSE); ccsSetBool (setting, TRUE, FALSE); ccsSetString (setting, "foo", FALSE); ccsSetColor (setting, cv, FALSE); ccsSetMatch (setting, "bar", FALSE); ccsSetKey (setting, kv, FALSE); ccsSetButton (setting, bv, FALSE); ccsSetEdge (setting, 1, FALSE); ccsSetBell (setting, TRUE, FALSE); ccsSetList (setting, lv, FALSE); ccsSetValue (setting, NULL, FALSE); ccsGetInt (setting, NULL); ccsGetFloat (setting, NULL); ccsGetBool (setting, NULL); ccsGetString (setting, NULL); ccsGetColor (setting, NULL); ccsGetMatch (setting, NULL); ccsGetKey (setting, NULL); ccsGetButton (setting, NULL); ccsGetEdge (setting, NULL); ccsGetBell (setting, NULL); ccsGetList (setting, NULL); ccsResetToDefault (setting, FALSE); ccsSettingIsIntegrated (setting); ccsSettingIsReadOnly (setting); ccsSettingIsReadableByBackend (setting); ccsSettingUnref (setting); } namespace { typedef boost::shared_ptr CCSSettingInfoPtr; typedef boost::shared_ptr CCSSettingValuePtr; typedef boost::shared_ptr CCSSettingPtr; class MockInitFuncs { public: MOCK_METHOD3 (initInfo, void (CCSSettingType, CCSSettingInfo *, void *)); MOCK_METHOD4 (initDefaultValue, void (CCSSettingType, CCSSettingInfo *, CCSSettingValue *, void *)); static void wrapInitInfo (CCSSettingType type, CCSSettingInfo *info, void *data) { MockInitFuncs &funcs (*(reinterpret_cast (data))); funcs.initInfo (type, info, data); } static void wrapInitValue (CCSSettingType type, CCSSettingInfo *info, CCSSettingValue *value, void *data) { MockInitFuncs &funcs (*(reinterpret_cast (data))); funcs.initDefaultValue (type, info, value, data); } }; const std::string SETTING_NAME = "setting_name"; const std::string SETTING_SHORT_DESC = "Short Description"; const std::string SETTING_LONG_DESC = "Long Description"; const std::string SETTING_GROUP = "Group"; const std::string SETTING_SUBGROUP = "Sub Group"; const std::string SETTING_HINTS = "Hints"; const CCSSettingType SETTING_TYPE = TypeInt; class CCSSettingDefaultImplTest : public ::testing::Test { public: CCSSettingDefaultImplTest () : plugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), gmockPlugin (reinterpret_cast (ccsObjectGetPrivate (plugin.get ()))) { } virtual void SetUpSetting (MockInitFuncs &funcs) { void *vFuncs = reinterpret_cast (&funcs); /* Info must be initialized before the value */ InSequence s; EXPECT_CALL (funcs, initInfo (GetSettingType (), _, vFuncs)); EXPECT_CALL (funcs, initDefaultValue (GetSettingType (), _, _, vFuncs)); setting = AutoDestroy (ccsSettingDefaultImplNew (plugin.get (), SETTING_NAME.c_str (), GetSettingType (), SETTING_SHORT_DESC.c_str (), SETTING_LONG_DESC.c_str (), SETTING_HINTS.c_str (), SETTING_GROUP.c_str (), SETTING_SUBGROUP.c_str (), MockInitFuncs::wrapInitValue, vFuncs, MockInitFuncs::wrapInitInfo, vFuncs, &ccsDefaultObjectAllocator, &ccsDefaultInterfaceTable), ccsSettingUnref); } virtual void SetUp () { MockInitFuncs funcs; SetUpSetting (funcs); } virtual CCSSettingType GetSettingType () { return SETTING_TYPE; } boost::shared_ptr plugin; CCSPluginGMock *gmockPlugin; boost::shared_ptr setting; }; } TEST_F (CCSSettingDefaultImplTest, Construction) { EXPECT_EQ (SETTING_TYPE, ccsSettingGetType (setting.get ())); EXPECT_EQ (SETTING_NAME, ccsSettingGetName (setting.get ())); EXPECT_EQ (SETTING_SHORT_DESC, ccsSettingGetShortDesc (setting.get ())); EXPECT_EQ (SETTING_LONG_DESC, ccsSettingGetLongDesc (setting.get ())); EXPECT_EQ (SETTING_GROUP, ccsSettingGetGroup (setting.get ())); EXPECT_EQ (SETTING_SUBGROUP, ccsSettingGetSubGroup (setting.get ())); EXPECT_EQ (SETTING_HINTS, ccsSettingGetHints (setting.get ())); /* Pointer Equality */ EXPECT_EQ (ccsSettingGetDefaultValue (setting.get ()), ccsSettingGetValue (setting.get ())); /* Actual Equality */ EXPECT_TRUE (ccsCheckValueEq (ccsSettingGetDefaultValue (setting.get ()), ccsSettingGetType (setting.get ()), ccsSettingGetInfo (setting.get ()), ccsSettingGetValue (setting.get ()), ccsSettingGetType (setting.get ()), ccsSettingGetInfo (setting.get ()))); EXPECT_EQ (ccsSettingGetParent (setting.get ()), plugin.get ()); } namespace { /* Testing values */ const int INTEGER_MIN = std::numeric_limits ::min () + 1; const int INTEGER_MAX = std::numeric_limits ::max () - 1; const int INTEGER_VALUE = 5; const int INTEGER_DEFAULT_VALUE = 2; const float FLOAT_MIN = std::numeric_limits ::min () + 1.0f; const float FLOAT_MAX = std::numeric_limits ::max () - 1.0f; const float FLOAT_VALUE = 5.0; const float FLOAT_DEFAULT_VALUE = 2.0; const char *STRING_VALUE = "string_nondefault_value"; const char *STRING_DEFAULT_VALUE = "string"; const char *MATCH_VALUE = "match_nondefault_value"; const char *MATCH_DEFAULT_VALUE = "match"; const Bool BOOL_VALUE = TRUE; const Bool BOOL_DEFAULT_VALUE = FALSE; CCSSettingColorValue getColorValue (unsigned short r, unsigned short g, unsigned short b, unsigned short a) { CCSSettingColorValue value; value.color.red = r; value.color.green = g; value.color.blue = b; value.color.alpha = a; return value; } CCSSettingKeyValue getKeyValue (int keysym, unsigned int modMask) { CCSSettingKeyValue value; value.keysym = keysym; value.keyModMask = modMask; return value; } CCSSettingButtonValue getButtonValue (int button, unsigned int modMask, unsigned int edgeMask) { CCSSettingButtonValue value; value.button = button; value.buttonModMask = modMask; value.edgeMask = edgeMask; return value; } const int VALUE_KEYSYM = XStringToKeysym ("a"); const int VALUE_DEFAULT_KEYSYM = XStringToKeysym ("1"); const unsigned int VALUE_MODMASK = ShiftMask | ControlMask; const unsigned int VALUE_DEFAULT_MODMASK = ControlMask; const int VALUE_BUTTON = 1; const int VALUE_DEFAULT_BUTTON = 3; const unsigned int VALUE_EDGEMASK = 1 | 2; const unsigned int VALUE_DEFAULT_EDGEMASK = 2 | 3; const CCSSettingColorValue COLOR_VALUE = getColorValue (255, 255, 255, 255); const CCSSettingColorValue COLOR_DEFAULT_VALUE = getColorValue (0, 0, 0, 0); const CCSSettingKeyValue KEY_VALUE = getKeyValue (VALUE_KEYSYM, VALUE_MODMASK); const CCSSettingKeyValue KEY_DEFAULT_VALUE = getKeyValue (VALUE_DEFAULT_KEYSYM, VALUE_DEFAULT_MODMASK); const CCSSettingButtonValue BUTTON_VALUE = getButtonValue (VALUE_BUTTON, VALUE_MODMASK, VALUE_EDGEMASK); const CCSSettingButtonValue BUTTON_DEFAULT_VALUE = getButtonValue (VALUE_DEFAULT_BUTTON, VALUE_DEFAULT_MODMASK, VALUE_DEFAULT_EDGEMASK); const unsigned int EDGE_VALUE = 1; const unsigned int EDGE_DEFAULT_VALUE = 2; const Bool BELL_VALUE = BOOL_VALUE; const Bool BELL_DEFAULT_VALUE = BOOL_DEFAULT_VALUE; /* Test CCSSettingInfo */ CCSSettingInfo * NewCCSSettingInfo () { return reinterpret_cast (calloc (1, sizeof (CCSSettingInfo))); } void FreeAndCleanupInfo (CCSSettingInfo *info, CCSSettingType type) { ccsCleanupSettingInfo (info, type); free (info); } CCSSettingInfoPtr AutoDestroyInfo (CCSSettingInfo *info, CCSSettingType type) { return CCSSettingInfoPtr (info, boost::bind (FreeAndCleanupInfo, info, type)); } CCSSettingInfo * getGenericInfo (CCSSettingType type) { return NewCCSSettingInfo (); } CCSSettingInfo * getIntInfo () { CCSSettingInfo *info (getGenericInfo (TypeInt)); info->forInt.max = INTEGER_MAX; info->forInt.min = INTEGER_MIN; return info; } CCSSettingInfo * getFloatInfo () { CCSSettingInfo *info (getGenericInfo (TypeFloat)); info->forFloat.max = FLOAT_MAX; info->forFloat.min = FLOAT_MIN; return info; } CCSSettingInfo * getStringInfo () { CCSSettingInfo *info (getGenericInfo (TypeString)); info->forString.restriction = NULL; info->forString.sortStartsAt = 1; info->forString.extensible = FALSE; return info; } CCSSettingInfo * getActionInfo (CCSSettingType actionType) { EXPECT_TRUE ((actionType == TypeAction || actionType == TypeKey || actionType == TypeButton || actionType == TypeEdge || actionType == TypeBell)); CCSSettingInfo *info (getGenericInfo (actionType)); info->forAction.internal = FALSE; return info; } CCSSettingInfoPtr getListInfo (CCSSettingType type, CCSSettingInfo *childrenInfo) { CCSSettingInfo *info = getGenericInfo (TypeList); info->forList.listType = type; info->forList.listInfo = childrenInfo; return AutoDestroyInfo (info, TypeList); } /* Used to copy different raw values */ template class CopyRawValueBase { public: CopyRawValueBase (const SettingValueType &value) : mValue (value) { } protected: const SettingValueType &mValue; }; template class CopyRawValue : public CopyRawValueBase { public: typedef SettingValueType ReturnType; typedef CopyRawValueBase Parent; CopyRawValue (const SettingValueType &value) : CopyRawValueBase (value) { } SettingValueType operator () () { return Parent::mValue; } }; template <> class CopyRawValue : public CopyRawValueBase { public: typedef const char * ReturnType; typedef CopyRawValueBase Parent; CopyRawValue (const char * value) : CopyRawValueBase (ptr), ptr (value) { } ReturnType operator () () { /* Passing an illegal value is okay */ if (Parent::mValue) return strdup (Parent::mValue); else return NULL; } private: // mValue is a reference so it needs a persistent variable to point at const char *ptr; }; template <> class CopyRawValue : public CopyRawValueBase { public: typedef CCSSettingValueList ReturnType; typedef CopyRawValueBase Parent; CopyRawValue (const cci::SettingValueListWrapper::Ptr &value) : CopyRawValueBase (value) { } ReturnType operator () () { if (Parent::mValue) return ccsCopyList (*Parent::mValue, Parent::mValue->setting ().get ()); else return NULL; } }; CCSSettingValue * NewCCSSettingValue () { CCSSettingValue *value = reinterpret_cast ( calloc (1, sizeof (CCSSettingValue))); value->refCount = 1; return value; } template CCSSettingValue * RawValueToCCSValue (const SettingValueType &value) { typedef typename CopyRawValue ::ReturnType UnionType; CCSSettingValue *settingValue = NewCCSSettingValue (); UnionType *unionMember = reinterpret_cast (&settingValue->value); *unionMember = (CopyRawValue (value)) (); return settingValue; } class ContainedValueGenerator { private: const CCSSettingValuePtr & InitValue (const CCSSettingValuePtr &value, CCSSettingType type, const CCSSettingInfoPtr &info) { const CCSSettingPtr &setting (GetSetting (type, info)); value->parent = setting.get (); mValues.push_back (value); return mValues.back (); } public: template const CCSSettingValuePtr & SpawnValue (const SettingValueType &rawValue, CCSSettingType type, const CCSSettingInfoPtr &info) { CCSSettingValuePtr value (AutoDestroy (RawValueToCCSValue (rawValue), ccsSettingValueUnref)); return InitValue (value, type, info); } const CCSSettingPtr & GetSetting (CCSSettingType type, const CCSSettingInfoPtr &info) { if (!mSetting) SetupMockSetting (type, info); return mSetting; } private: void SetupMockSetting (CCSSettingType type, const CCSSettingInfoPtr &info) { mSetting = AutoDestroy (ccsMockSettingNew (), ccsSettingUnref); CCSSettingGMock *settingMock = reinterpret_cast ( ccsObjectGetPrivate (mSetting.get ())); EXPECT_CALL (*settingMock, getType ()) .WillRepeatedly (Return (type)); EXPECT_CALL (*settingMock, getInfo ()) .WillRepeatedly (Return (info.get ())); EXPECT_CALL (*settingMock, getDefaultValue ()) .WillRepeatedly (ReturnNull ()); } /* This must always be before the value * as the values hold a weak reference to * it */ CCSSettingPtr mSetting; std::vector mValues; }; template class ValueContainer { public: virtual ~ValueContainer () {} typedef boost::shared_ptr Ptr; virtual const SettingValueType & getRawValue (CCSSettingType type, const CCSSettingInfoPtr &info) = 0; virtual const CCSSettingValuePtr & getContainedValue (CCSSettingType type, const CCSSettingInfoPtr &info) = 0; }; class NormalValueContainerBase { protected: ContainedValueGenerator mGenerator; CCSSettingValuePtr mValue; }; template class NormalValueContainer : public NormalValueContainerBase, public ValueContainer { public: NormalValueContainer (const SettingValueType &value) : mRawValue (value) { } const SettingValueType & getRawValue (CCSSettingType type, const CCSSettingInfoPtr &info) { return mRawValue; } const CCSSettingValuePtr & getContainedValue (CCSSettingType type, const CCSSettingInfoPtr &info) { if (!mValue) mValue = mGenerator.SpawnValue (mRawValue, type, info); return mValue; } private: const SettingValueType &mRawValue; }; template typename NormalValueContainer ::Ptr ContainNormal (const SettingValueType &value) { return boost::make_shared > (value); } class ListValueContainerBase : public ValueContainer { public: virtual ~ListValueContainerBase () {} protected: const CCSSettingValuePtr & getContainedValue (CCSSettingType type, const CCSSettingInfoPtr &info) { if (!mContainedWrapper) { const cci::SettingValueListWrapper::Ptr &wrapper (SetupWrapper (type, info)); mContainedWrapper = mContainedValueGenerator.SpawnValue (wrapper, type, info); } return mContainedWrapper; } const CCSSettingValueList & getRawValue (CCSSettingType type, const CCSSettingInfoPtr &info) { const cci::SettingValueListWrapper::Ptr &wrapper (SetupWrapper (type, info)); return *wrapper; } cci::SettingValueListWrapper::Ptr mWrapper; /* ccsFreeSettingValue has an implicit * dependency on mWrapper (CCSSettingValue -> CCSSetting -> * CCSSettingInfo -> cci::SettingValueListWrapper), these should * be kept after mWrapper here */ ContainedValueGenerator mContainedValueGenerator; CCSSettingValuePtr mContainedWrapper; private: virtual const cci::SettingValueListWrapper::Ptr & SetupWrapper (CCSSettingType type, const CCSSettingInfoPtr &info) = 0; }; class ListValueContainerFromChildValueBase : public ListValueContainerBase { private: virtual const cci::SettingValueListWrapper::Ptr & SetupWrapper (CCSSettingType type, const CCSSettingInfoPtr &info) { if (!mWrapper) { const CCSSettingPtr &setting (mContainedValueGenerator.GetSetting (type, info)); CCSSettingValue *value = GetValueForListWrapper (); value->parent = setting.get (); value->isListChild = TRUE; mWrapper.reset (new cci::SettingValueListWrapper (NULL, cci::Deep, type, setting)); mWrapper->append (value); } return mWrapper; } virtual CCSSettingValue * GetValueForListWrapper () = 0; }; class ListValueContainerFromList : public ListValueContainerBase { public: ListValueContainerFromList (CCSSettingValueList rawValueList) : mRawValueList (rawValueList) { } private: const cci::SettingValueListWrapper::Ptr & SetupWrapper (CCSSettingType type, const CCSSettingInfoPtr &info) { if (!mWrapper) { const CCSSettingPtr &setting (mContainedValueGenerator.GetSetting (type, info)); mWrapper.reset (new cci::SettingValueListWrapper (ccsCopyList (mRawValueList, setting.get ()), cci::Deep, type, setting)); } return mWrapper; } CCSSettingValueList mRawValueList; }; template class ChildValueListValueContainer : public ListValueContainerFromChildValueBase { public: ChildValueListValueContainer (const SettingValueType &value) : mRawChildValue (value) { } virtual ~ChildValueListValueContainer () {} private: CCSSettingValue * GetValueForListWrapper () { return RawValueToCCSValue (mRawChildValue); } const SettingValueType &mRawChildValue; }; template typename ValueContainer ::Ptr ContainList (const SettingValueType &value) { return boost::make_shared > (value); } typename ValueContainer ::Ptr ContainPrexistingList (const CCSSettingValueList &value) { return boost::make_shared (value); } template struct SettingMutators { typedef CCSSetStatus (*SetFunction) (CCSSetting *setting, SettingValueType data, Bool); typedef Bool (*GetFunction) (CCSSetting *setting, SettingValueType *); }; typedef enum _SetMethod { ThroughRaw, ThroughValue } SetMethod; template CCSSetStatus performRawSet (const SettingValueType &rawValue, const CCSSettingPtr &setting, typename SettingMutators::SetFunction setFunction) { return (*setFunction) (setting.get (), rawValue, FALSE); } template class RawValueContainmentPacker { public: RawValueContainmentPacker (const SettingValueType &value) : mValue (value) { } typename ValueContainer ::Ptr operator () () { return ContainNormal (mValue); } private: const SettingValueType &mValue; }; template <> class RawValueContainmentPacker { public: RawValueContainmentPacker (const CCSSettingValueList &value) : mValue (value) { } typename ValueContainer ::Ptr operator () () { return ContainPrexistingList (mValue); } private: const CCSSettingValueList &mValue; }; template typename ValueContainer ::Ptr ContainRawValue (const SettingValueType &value) { return RawValueContainmentPacker (value) (); } template CCSSetStatus performValueSet (const SettingValueType &rawValue, const CCSSettingInfoPtr &info, CCSSettingType type, const CCSSettingPtr &setting) { typename ValueContainer ::Ptr container (ContainRawValue (rawValue)); const CCSSettingValuePtr &value (container->getContainedValue (type, info)); return ccsSetValue (setting.get (), value.get (), FALSE); } template CCSSetStatus performSet (const SettingValueType &rawValue, const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type, typename SettingMutators::SetFunction setFunction, SetMethod method) { /* XXX: * This is really bad design because it effectively involves runtime * switching on types. Unfortunately, there doesn't seem to be a better * way to do this that's not hugely verbose - injecting the method * as a class or a function would mean that we'd have to expose * template parameters to areas where we can't do that because we * want the tests to run once for ccsSetValue and once for * ccsSet* . If we did that, we'd have to either write the tests * twice, or write the INSTANTIATE_TEST_CASE_P sections twice and * both are 200+ lines of copy-and-paste as opposed to this type-switch * here */ switch (method) { case ThroughRaw: return performRawSet (rawValue, setting, setFunction); break; case ThroughValue: return performValueSet (rawValue, info, type, setting); break; default: throw std::runtime_error ("called perfomSet with unknown SetMethod"); } throw std::runtime_error ("Unreachable"); } class SetParam { public: typedef boost::shared_ptr Ptr; typedef boost::function SetUpSettingFunc; virtual ~SetParam () {}; virtual void SetUpSetting (const SetUpSettingFunc &func) = 0; virtual void TearDownSetting () = 0; virtual CCSSettingType GetSettingType () = 0; virtual void SetUpParam (const CCSSettingPtr &) = 0; virtual CCSSetStatus setWithInvalidType (SetMethod) = 0; virtual CCSSetStatus setToFailValue (SetMethod) = 0; virtual CCSSetStatus setToNonDefaultValue (SetMethod) = 0; virtual CCSSetStatus setToDefaultValue (SetMethod) = 0; }; void stubInitInfo (CCSSettingType type, CCSSettingInfo *dst, void *data) { CCSSettingInfo *src = reinterpret_cast (data); ccsCopyInfo (src, dst, type); } void stubInitDefaultValue (CCSSettingType type, CCSSettingInfo *info, CCSSettingValue *dest, void *data) { CCSSettingValue *src = reinterpret_cast (data); CCSSetting *oldDestParent = src->parent; /* Change the parent to this setting that's being initialized * as that needs to go into the setting's default value as * the parent entry */ src->parent = dest->parent; ccsCopyValueInto (src, dest, type, info); /* Restore the old parent */ src->parent = oldDestParent; } class StubInitFuncs : public MockInitFuncs { public: StubInitFuncs (CCSSettingInfo *info, CCSSettingValue *value) : MockInitFuncs (), mInfo (info), mValue (value) { ON_CALL (*this, initInfo (_, _, _)) .WillByDefault (WithArgs <0, 1> ( Invoke (this, &StubInitFuncs::initInfo))); ON_CALL (*this, initDefaultValue (_, _, _, _)) .WillByDefault (WithArgs <0, 1, 2> ( Invoke (this, &StubInitFuncs::initializeValue))); } void initInfo (CCSSettingType type, CCSSettingInfo *info) { stubInitInfo (type, info, reinterpret_cast (mInfo)); } void initializeValue (CCSSettingType type, CCSSettingInfo *info, CCSSettingValue *value) { stubInitDefaultValue (type, info, value, reinterpret_cast (mValue)); } CCSSettingInfo *mInfo; CCSSettingValue *mValue; }; class InternalSetParam : public SetParam { protected: InternalSetParam (const CCSSettingInfoPtr &info, CCSSettingType type) : mInfo (info), mType (type) { } virtual void TearDownSetting () { } void InitDefaultsForSetting (const SetUpSettingFunc &func) { StubInitFuncs stubInitializers (mInfo.get (), mValue.get ()); func (stubInitializers); } void TakeReferenceToCreatedSetting (const CCSSettingPtr &setting) { mSetting = setting; } const CCSSettingInterface * RedirectSettingInterface () { const CCSSettingInterface *settingInterface = GET_INTERFACE (CCSSettingInterface, mSetting.get ()); CCSSettingInterface *tmpSettingInterface = new CCSSettingInterface; *tmpSettingInterface = *settingInterface; tmpSettingInterface->settingGetType = InternalSetParam::returnIncorrectSettingType; ccsObjectRemoveInterface (mSetting.get (), GET_INTERFACE_TYPE (CCSSettingInterface)); ccsObjectAddInterface (mSetting.get (), (const CCSInterface *) tmpSettingInterface, GET_INTERFACE_TYPE (CCSSettingInterface)); return settingInterface; } void RestoreSettingInterface (const CCSSettingInterface *settingInterface) { /* Restore the old interface */ const CCSSettingInterface *oldSettingInterface = GET_INTERFACE (CCSSettingInterface, mSetting.get ()); ccsObjectRemoveInterface (mSetting.get (), GET_INTERFACE_TYPE (CCSSettingInterface)); delete oldSettingInterface; ccsObjectAddInterface (mSetting.get (), (const CCSInterface *) settingInterface, GET_INTERFACE_TYPE (CCSSettingInterface)); } virtual CCSSetStatus setToFailValue (SetMethod method) { return SetFailed; } virtual CCSSettingType GetSettingType () { return mType; } protected: CCSSettingInfoPtr mInfo; CCSSettingValuePtr mValue; CCSSettingType mType; CCSSettingPtr mSetting; CCSSettingInterface tmpSettingInterface; private: static const CCSSettingType incorrectSettingType = TypeNum; static CCSSettingType returnIncorrectSettingType (CCSSetting *setting) { return incorrectSettingType; } }; template class SetParamContainerStorage { protected: typedef typename ValueContainer ::Ptr ValueContainerPtr; SetParamContainerStorage (const ValueContainerPtr &defaultValue, const ValueContainerPtr &nonDefaultValue) : mDefault (defaultValue), mNonDefault (nonDefaultValue) { } ValueContainerPtr mDefault; ValueContainerPtr mNonDefault; }; template class TypedSetParam : /* Do not change the order of inheritance here, DefaultImplSetParamTemplatedBase * must be destroyed after DefaultImplSetParamBase as DefaultImplSetParamBase * has indirect weak references to variables in DefaultImplSetParamTemplatedBase */ private SetParamContainerStorage , public InternalSetParam { public: typedef typename SettingMutators ::SetFunction SetFunction; typedef typename SettingMutators ::GetFunction GetFunction; typedef typename ValueContainer ::Ptr ValueContainerPtr; typedef SetParamContainerStorage TemplateParent; TypedSetParam (const ValueContainerPtr &defaultValue, CCSSettingType type, SetFunction setFunction, GetFunction getFunction, const CCSSettingInfoPtr &info, const ValueContainerPtr &nonDefaultValue) : SetParamContainerStorage (defaultValue, nonDefaultValue), InternalSetParam (info, type), mSetFunction (setFunction), mGetFunction (getFunction) { } virtual void SetUpSetting (const SetUpSettingFunc &func) { /* Do delayed setup here */ mValue = TemplateParent::mDefault->getContainedValue (mType, mInfo); mNonDefaultValue = TemplateParent::mNonDefault->getRawValue (mType, mInfo); InitDefaultsForSetting (func); } virtual void SetUpParam (const CCSSettingPtr &setting) { ASSERT_TRUE ((*mGetFunction) (setting.get (), &mDefaultValue)); TakeReferenceToCreatedSetting (setting); } virtual CCSSetStatus setWithInvalidType (SetMethod method) { /* Temporarily redirect the setting interface to * our own with an overloaded settingGetType function */ const CCSSettingInterface *iface = RedirectSettingInterface (); CCSSetStatus ret = performSet (mNonDefaultValue, mSetting, mInfo, mType, mSetFunction, method); RestoreSettingInterface (iface); return ret; } virtual CCSSetStatus setToNonDefaultValue (SetMethod method) { return performSet (mNonDefaultValue, mSetting, mInfo, mType, mSetFunction, method); } virtual CCSSetStatus setToDefaultValue (SetMethod method) { return performSet (mDefaultValue, mSetting, mInfo, mType, mSetFunction, method); } private: SettingValueType mDefaultValue; SettingValueType mNonDefaultValue; protected: SetFunction mSetFunction; GetFunction mGetFunction; }; class SetWithDisallowedValueBase { protected: SetWithDisallowedValueBase (const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type) : mSetting (setting), mInfo (info), mType (type) { } CCSSettingPtr mSetting; CCSSettingInfoPtr mInfo; CCSSettingType mType; }; template class SetWithDisallowedValueTemplatedBase : public SetWithDisallowedValueBase { protected: typedef typename SettingMutators ::SetFunction SetFunction; SetWithDisallowedValueTemplatedBase (SetFunction setFunction, const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type) : SetWithDisallowedValueBase (setting, info, type), mSetFunction (setFunction) { } SetFunction mSetFunction; }; template class SetWithDisallowedValue : public SetWithDisallowedValueTemplatedBase { public: typedef typename SettingMutators ::SetFunction SetFunction; SetWithDisallowedValue (SetFunction setFunction, const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type) : SetWithDisallowedValueTemplatedBase (setFunction, setting, info, type) { } CCSSetStatus operator () (SetMethod method) { return SetFailed; } }; template <> class SetWithDisallowedValue : public SetWithDisallowedValueTemplatedBase { public: typedef typename SettingMutators ::SetFunction SetFunction; typedef SetWithDisallowedValueTemplatedBase Parent; SetWithDisallowedValue (SetFunction setFunction, const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type) : SetWithDisallowedValueTemplatedBase (setFunction, setting, info, type) { } CCSSetStatus operator () (SetMethod method) { return performSet (Parent::mInfo->forInt.min - 1, Parent::mSetting, Parent::mInfo, Parent::mType, Parent::mSetFunction, method); } }; template <> class SetWithDisallowedValue : public SetWithDisallowedValueTemplatedBase { public: typedef typename SettingMutators ::SetFunction SetFunction; typedef SetWithDisallowedValueTemplatedBase Parent; SetWithDisallowedValue (SetFunction setFunction, const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type) : SetWithDisallowedValueTemplatedBase (setFunction, setting, info, type) { } CCSSetStatus operator () (SetMethod method) { return performSet (Parent::mInfo->forFloat.min - 1.0f, Parent::mSetting, Parent::mInfo, Parent::mType, Parent::mSetFunction, method); } }; template <> class SetWithDisallowedValue : public SetWithDisallowedValueTemplatedBase { public: typedef typename SettingMutators ::SetFunction SetFunction; typedef SetWithDisallowedValueTemplatedBase Parent; SetWithDisallowedValue (SetFunction setFunction, const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type) : SetWithDisallowedValueTemplatedBase (setFunction, setting, info, type) { } CCSSetStatus operator () (SetMethod method) { return performSet (NULL, Parent::mSetting, Parent::mInfo, Parent::mType, Parent::mSetFunction, method); } }; template class SetFailureParam : public TypedSetParam { public: typedef TypedSetParam Parent; typedef typename TypedSetParam ::SetFunction SetFunction; typedef typename TypedSetParam ::GetFunction GetFunction; typedef typename TypedSetParam ::ValueContainerPtr ValueContainerPtr; SetFailureParam (const ValueContainerPtr &defaultValue, CCSSettingType type, SetFunction setFunction, GetFunction getFunction, const CCSSettingInfoPtr &info, const ValueContainerPtr &nonDefault) : TypedSetParam (defaultValue, type, setFunction, getFunction, info, nonDefault) { } virtual ~SetFailureParam () {} virtual CCSSetStatus setToFailValue (SetMethod method) { typedef TypedSetParam Parent; return SetWithDisallowedValue (Parent::mSetFunction, Parent::mSetting, Parent::mInfo, Parent::mType) (method); } }; template SetParam::Ptr SParam (const typename ValueContainer ::Ptr &defaultValue, CCSSettingType type, typename SettingMutators::SetFunction setFunc, typename SettingMutators::GetFunction getFunc, const CCSSettingInfoPtr &settingInfo, const typename ValueContainer ::Ptr &changeTo) { return boost::make_shared > (defaultValue, type, setFunc, getFunc, settingInfo, changeTo); } template SetParam::Ptr FailSParam (const typename ValueContainer ::Ptr &defaultValue, CCSSettingType type, typename SettingMutators::SetFunction setFunc, typename SettingMutators::GetFunction getFunc, const CCSSettingInfoPtr &settingInfo, const typename ValueContainer ::Ptr &changeTo) { return boost::make_shared > (defaultValue, type, setFunc, getFunc, settingInfo, changeTo); } typedef std::tr1::tuple SettingDefaultImplSetParamType; class SettingDefaultImplSet : public CCSSettingDefaultImplTest, public WithParamInterface { public: SettingDefaultImplSet () : setHarness (std::tr1::get <0> (GetParam ())), setMethod (std::tr1::get <1> (GetParam ())) { } virtual void SetUp () { setHarness->SetUpSetting (boost::bind (&CCSSettingDefaultImplTest::SetUpSetting, this, _1)); setHarness->SetUpParam (setting); } virtual void TearDown () { setHarness->TearDownSetting (); } CCSSettingType GetSettingType () { return setHarness->GetSettingType (); } protected: SetParam::Ptr setHarness; SetMethod setMethod; }; class SettingDefaulImplSetFailure : public SettingDefaultImplSet { }; } /* Tests */ TEST_P (SettingDefaultImplSet, Construction) { } TEST_P (SettingDefaultImplSet, WithInvalidType) { EXPECT_EQ (SetFailed, setHarness->setWithInvalidType (setMethod)); } TEST_P (SettingDefaultImplSet, ToNewValue) { EXPECT_EQ (SetToNewValue, setHarness->setToNonDefaultValue (setMethod)); } TEST_P (SettingDefaultImplSet, ToSameValue) { EXPECT_EQ (SetToNewValue, setHarness->setToNonDefaultValue (setMethod)); EXPECT_EQ (SetToSameValue, setHarness->setToNonDefaultValue (setMethod)); } TEST_P (SettingDefaultImplSet, ToDefaultValue) { EXPECT_EQ (SetToNewValue, setHarness->setToNonDefaultValue (setMethod)); EXPECT_EQ (SetToDefault, setHarness->setToDefaultValue (setMethod)); } TEST_P (SettingDefaultImplSet, IsDefaultValue) { EXPECT_EQ (SetToNewValue, setHarness->setToNonDefaultValue (setMethod)); EXPECT_EQ (SetToDefault, setHarness->setToDefaultValue (setMethod)); EXPECT_EQ (SetIsDefault, setHarness->setToDefaultValue (setMethod)); } TEST_P (SettingDefaulImplSetFailure, ToFailValue) { EXPECT_EQ (SetFailed, setHarness->setToFailValue (setMethod)); } #define VALUE_TEST INSTANTIATE_TEST_CASE_P VALUE_TEST (SetSemantics, SettingDefaulImplSetFailure, Combine ( Values (FailSParam (ContainNormal (INTEGER_DEFAULT_VALUE), TypeInt, ccsSetInt, ccsGetInt, AutoDestroyInfo (getIntInfo (), TypeInt), ContainNormal (INTEGER_VALUE)), FailSParam (ContainNormal (FLOAT_DEFAULT_VALUE), TypeFloat, ccsSetFloat, ccsGetFloat, AutoDestroyInfo (getFloatInfo (), TypeFloat), ContainNormal (FLOAT_VALUE)), FailSParam (ContainNormal (STRING_DEFAULT_VALUE), TypeString, ccsSetString, ccsGetString, AutoDestroyInfo (getGenericInfo (TypeString), TypeMatch), ContainNormal (STRING_VALUE)), FailSParam (ContainNormal (MATCH_DEFAULT_VALUE), TypeMatch, ccsSetMatch, ccsGetMatch, AutoDestroyInfo (getGenericInfo (TypeMatch), TypeMatch), ContainNormal (MATCH_VALUE))), Values (ThroughRaw, ThroughValue))); VALUE_TEST (SetSemantics, SettingDefaultImplSet, Combine ( Values (SParam (ContainNormal (INTEGER_DEFAULT_VALUE), TypeInt, ccsSetInt, ccsGetInt, AutoDestroyInfo (getIntInfo (), TypeInt), ContainNormal (INTEGER_VALUE)), SParam (ContainNormal (FLOAT_DEFAULT_VALUE), TypeFloat, ccsSetFloat, ccsGetFloat, AutoDestroyInfo (getFloatInfo (), TypeFloat), ContainNormal (FLOAT_VALUE)), SParam (ContainNormal (BOOL_DEFAULT_VALUE), TypeBool, ccsSetBool, ccsGetBool, AutoDestroyInfo (getGenericInfo (TypeBool), TypeBool), ContainNormal (BOOL_VALUE)), SParam (ContainNormal (STRING_DEFAULT_VALUE), TypeString, ccsSetString, ccsGetString, AutoDestroyInfo (getStringInfo (), TypeBool), ContainNormal (STRING_VALUE)), SParam (ContainNormal (MATCH_DEFAULT_VALUE), TypeMatch, ccsSetMatch, ccsGetMatch, AutoDestroyInfo (getGenericInfo (TypeMatch), TypeMatch), ContainNormal (MATCH_VALUE)), SParam (ContainNormal (COLOR_DEFAULT_VALUE), TypeColor, ccsSetColor, ccsGetColor, AutoDestroyInfo (getGenericInfo (TypeColor), TypeColor), ContainNormal (COLOR_VALUE)), SParam (ContainNormal (KEY_DEFAULT_VALUE), TypeKey, ccsSetKey, ccsGetKey, AutoDestroyInfo (getActionInfo (TypeKey), TypeKey), ContainNormal (KEY_VALUE)), SParam (ContainNormal (BUTTON_DEFAULT_VALUE), TypeButton, ccsSetButton, ccsGetButton, AutoDestroyInfo (getActionInfo (TypeButton), TypeButton), ContainNormal (BUTTON_VALUE)), SParam (ContainNormal (EDGE_DEFAULT_VALUE), TypeEdge, ccsSetEdge, ccsGetEdge, AutoDestroyInfo (getActionInfo (TypeEdge), TypeEdge), ContainNormal (EDGE_VALUE)), SParam (ContainNormal (BELL_DEFAULT_VALUE), TypeBell, ccsSetBell, ccsGetBell, AutoDestroyInfo (getGenericInfo (TypeBell), TypeBell), ContainNormal (BELL_VALUE)), SParam (ContainList (INTEGER_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeInt, getIntInfo ()), ContainList (INTEGER_VALUE)), SParam (ContainList (FLOAT_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeFloat, getFloatInfo ()), ContainList (FLOAT_VALUE)), SParam (ContainList (BOOL_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeBool, getGenericInfo (TypeBool)), ContainList (BOOL_VALUE)), SParam (ContainList (STRING_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeString, getGenericInfo (TypeMatch)), ContainList (STRING_VALUE)), SParam (ContainList (MATCH_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeMatch, getGenericInfo (TypeMatch)), ContainList (MATCH_VALUE)), SParam (ContainList (COLOR_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeColor, getGenericInfo (TypeColor)), ContainList (COLOR_VALUE)), SParam (ContainList (KEY_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeKey, getActionInfo (TypeKey)), ContainList (KEY_VALUE)), SParam (ContainList (BUTTON_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeButton, getActionInfo (TypeButton)), ContainList (BUTTON_VALUE)), SParam (ContainList (EDGE_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeEdge, getIntInfo ()), ContainList (EDGE_VALUE)), SParam (ContainList (BELL_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeBell, getActionInfo (TypeBell)), ContainList (BELL_VALUE))), Values (ThroughRaw, ThroughValue))); ././@LongLink0000000000000000000000000000016400000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_settings_upgrade_internal.cppcompiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_settings_upgra0000644000015301777760000007060412321343002034127 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include "compizconfig_ccs_context_mock.h" #include "compizconfig_ccs_plugin_mock.h" #include "compizconfig_ccs_setting_mock.h" #include "ccs_settings_upgrade_internal.h" #include "gtest_shared_characterwrapper.h" #include "gtest_shared_autodestroy.h" #include "gtest_unspecified_bool_type_matcher.h" #include "compizconfig_ccs_list_equality.h" #include "compizconfig_ccs_item_in_list_matcher.h" #include "compizconfig_ccs_list_wrapper.h" #include "compizconfig_ccs_setting_value_operators.h" #include "compizconfig_ccs_setting_value_matcher.h" using ::testing::IsNull; using ::testing::Eq; using ::testing::Return; using ::testing::AtLeast; using ::testing::_; using ::testing::AllOf; using ::testing::Not; using ::testing::Matcher; using ::testing::MakeMatcher; using ::testing::MatcherInterface; using ::testing::Pointee; using ::testing::PrintToString; namespace cc = compiz::config; namespace cci = compiz::config::impl; class CCSSettingsUpgradeInternalTest : public ::testing::Test { }; namespace { static const std::string CCS_SETTINGS_UPGRADE_TEST_CORRECT_FILENAME = "org.compiz.general.1.upgrade"; static const std::string CCS_SETTINGS_UPGRADE_TEST_INCORRECT_FILENAME = "1.upgra"; static const std::string CCS_SETTINGS_UPGRADE_TEST_VERY_INCORRECT_FILENAME = "1"; static const std::string CCS_SETTINGS_UPGRADE_TEST_CORRECT_DOMAIN = "org.compiz"; static const std::string CCS_SETTINGS_UPGRADE_TEST_CORRECT_PROFILE = "general"; static const unsigned int CCS_SETTINGS_UPGRADE_TEST_CORRECT_NUM = 1; } TEST (CCSSettingsUpgradeInternalTest, TestDetokenizeAndSetValues) { char *profileName = NULL; char *domainName = NULL; unsigned int num; EXPECT_THAT (ccsUpgradeGetDomainNumAndProfile (CCS_SETTINGS_UPGRADE_TEST_CORRECT_FILENAME.c_str (), &domainName, &num, &profileName), IsTrue ()); CharacterWrapper profileNameC (profileName); CharacterWrapper domainNameC (domainName); EXPECT_EQ (CCS_SETTINGS_UPGRADE_TEST_CORRECT_PROFILE, profileName); EXPECT_EQ (CCS_SETTINGS_UPGRADE_TEST_CORRECT_DOMAIN, domainName); EXPECT_EQ (num, CCS_SETTINGS_UPGRADE_TEST_CORRECT_NUM); } TEST (CCSSettingsUpgradeInternalTest, TestDetokenizeAndSetValuesReturnsFalseIfInvalid) { char *profileName = NULL; char *domainName = NULL; unsigned int num; EXPECT_THAT (ccsUpgradeGetDomainNumAndProfile (CCS_SETTINGS_UPGRADE_TEST_INCORRECT_FILENAME.c_str (), &domainName, &num, &profileName), IsFalse ()); EXPECT_THAT (profileName, IsNull ()); EXPECT_THAT (domainName, IsNull ()); EXPECT_THAT (ccsUpgradeGetDomainNumAndProfile (CCS_SETTINGS_UPGRADE_TEST_VERY_INCORRECT_FILENAME.c_str (), &domainName, &num, &profileName), IsFalse ()); EXPECT_THAT (profileName, IsNull ()); EXPECT_THAT (domainName, IsNull ()); } TEST (CCSSettingsUpgradeInternalTest, TestDetokenizeAndReturnTrueForUpgradeFileName) { EXPECT_THAT (ccsUpgradeNameFilter (CCS_SETTINGS_UPGRADE_TEST_CORRECT_FILENAME.c_str ()), IsTrue ()); } TEST (CCSSettingsUpgradeInternalTest, TestDetokenizeAndReturnFalseForNoUpgradeFileName) { EXPECT_THAT (ccsUpgradeNameFilter (CCS_SETTINGS_UPGRADE_TEST_INCORRECT_FILENAME.c_str ()), IsFalse ()); EXPECT_THAT (ccsUpgradeNameFilter (CCS_SETTINGS_UPGRADE_TEST_VERY_INCORRECT_FILENAME.c_str ()), IsFalse ()); } namespace { const std::string CCS_SETTINGS_UPGRADE_TEST_MOCK_PLUGIN_NAME = "mock"; const std::string CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE = "setting_one"; const std::string CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_TWO = "setting_two"; typedef std::tr1::tuple , CCSSettingGMock *> MockedSetting; inline CCSSetting * Real (MockedSetting &ms) { return (std::tr1::get <0> (ms)).get (); } inline CCSSettingGMock & Mock (MockedSetting &ms) { return *(std::tr1::get <1> (ms)); } } class CCSSettingsUpgradeTestWithMockContext : public ::testing::Test { public: typedef enum _AddMode { DoNotAddSettingToPlugin, AddSettingToPlugin } AddMode; virtual void SetUp () { context = AutoDestroy (ccsMockContextNew (), ccsFreeMockContext); plugin = AutoDestroy (ccsMockPluginNew (), ccsFreeMockPlugin); ON_CALL (MockPlugin (), getName ()) .WillByDefault ( Return ( CCS_SETTINGS_UPGRADE_TEST_MOCK_PLUGIN_NAME.c_str ())); ON_CALL (MockPlugin (), getContext ()) .WillByDefault ( Return ( context.get ())); } CCSPluginGMock & MockPlugin () { return *(reinterpret_cast (ccsObjectGetPrivate (plugin.get ()))); } CCSContextGMock & MockContext () { return *(reinterpret_cast (ccsObjectGetPrivate (context.get ()))); } void InitializeValueCommon (CCSSettingValue &value, CCSSetting *setting) { value.parent = setting; value.refCount = 1; } void InitializeValueForSetting (CCSSettingValue &value, CCSSetting *setting) { InitializeValueCommon (value, setting); value.isListChild = FALSE; } MockedSetting SpawnSetting (const std::string &name, CCSSettingType type, AddMode addMode = AddSettingToPlugin) { boost::shared_ptr setting (ccsMockSettingNew (), ccsSettingUnref); CCSSettingGMock *gmockSetting = reinterpret_cast (ccsObjectGetPrivate (setting.get ())); ON_CALL (*gmockSetting, getName ()) .WillByDefault ( Return ( name.c_str ())); ON_CALL (*gmockSetting, getType ()) .WillByDefault ( Return ( type)); ON_CALL (*gmockSetting, getParent ()) .WillByDefault ( Return ( plugin.get ())); if (addMode == AddSettingToPlugin) { ON_CALL (MockPlugin (), findSetting (Eq (name.c_str ()))) .WillByDefault ( Return ( setting.get ())); } return MockedSetting (setting, gmockSetting); } private: boost::shared_ptr context; boost::shared_ptr plugin; }; namespace { typedef boost::shared_ptr > CCSSettingListWrapperPtr; CCSSettingListWrapperPtr constructSettingListWrapper (CCSSettingList list, cci::ListStorageType storageType) { return boost::make_shared > (list, ccsSettingListFree, ccsSettingListAppend, ccsSettingListRemove, storageType); } } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestNoClearValuesSettingNotFound) { MockedSetting settingOne (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))); EXPECT_CALL (Mock (settingOne), getParent ()); EXPECT_CALL (Mock (settingOne), getName ()); CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (settingOne)), cci::Shallow)); ccsUpgradeClearValues (*list); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestClearValuesInListNonListType) { MockedSetting resetSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting settingToReset (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt)); CCSSettingValue valueToReset; CCSSettingValue valueResetIdentifier; InitializeValueForSetting (valueToReset, Real (settingToReset)); InitializeValueForSetting (valueResetIdentifier, Real (resetSettingIdentifier)); valueToReset.value.asInt = 7; valueResetIdentifier.value.asInt = 7; CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (resetSettingIdentifier)), cci::Shallow)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToReset))); EXPECT_CALL (Mock (resetSettingIdentifier), getParent ()); EXPECT_CALL (Mock (resetSettingIdentifier), getName ()); CCSSettingInfo info; info.forInt.max = 0; info.forInt.min = 10; /* ccsCheckValueEq needs to know the type and info about this type */ EXPECT_CALL (Mock (settingToReset), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (resetSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToReset), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (resetSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (resetSettingIdentifier), getValue ()).WillOnce (Return (&valueResetIdentifier)); EXPECT_CALL (Mock (settingToReset), getValue ()).WillOnce (Return (&valueToReset)); EXPECT_CALL (Mock (settingToReset), resetToDefault (IsTrue ())); ccsUpgradeClearValues (*list); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestClearValuesInListNonListTypeNotMatched) { MockedSetting resetSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting settingToReset (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt)); CCSSettingValue valueToReset; CCSSettingValue valueResetIdentifier; InitializeValueForSetting (valueToReset, Real (settingToReset)); InitializeValueForSetting (valueResetIdentifier, Real (resetSettingIdentifier)); valueToReset.value.asInt = 2; valueResetIdentifier.value.asInt = 7; CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (resetSettingIdentifier)), cci::Shallow)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToReset))); EXPECT_CALL (Mock (resetSettingIdentifier), getParent ()); EXPECT_CALL (Mock (resetSettingIdentifier), getName ()); CCSSettingInfo info; info.forInt.max = 0; info.forInt.min = 10; /* ccsCheckValueEq needs to know the type and info about this type */ EXPECT_CALL (Mock (settingToReset), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (resetSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToReset), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (resetSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (resetSettingIdentifier), getValue ()).WillOnce (Return (&valueResetIdentifier)); EXPECT_CALL (Mock (settingToReset), getValue ()).WillOnce (Return (&valueToReset)); ccsUpgradeClearValues (*list); } /* This actually copies the value, but its harmless */ MATCHER_P (CheckValueParent, expectedParent, std::string ("Value parent is ") + PrintToString (expectedParent)) { return arg.parent == expectedParent; } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestNoAddValuesSettingNotFound) { MockedSetting settingOne (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))); EXPECT_CALL (Mock (settingOne), getParent ()); EXPECT_CALL (Mock (settingOne), getName ()); CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (settingOne)), cci::Shallow)); ccsUpgradeAddValues (*list); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestAddValuesInListNonListType) { MockedSetting addSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting settingToBeChanged (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt)); CCSSettingValue valueToReset; CCSSettingValue valueResetIdentifier; InitializeValueForSetting (valueToReset, Real (settingToBeChanged)); InitializeValueForSetting (valueResetIdentifier, Real (addSettingIdentifier)); valueToReset.value.asInt = 7; valueResetIdentifier.value.asInt = 7; CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (addSettingIdentifier)), cci::Shallow)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToBeChanged))); EXPECT_CALL (Mock (addSettingIdentifier), getParent ()); EXPECT_CALL (Mock (addSettingIdentifier), getName ()); CCSSettingInfo info; info.forInt.max = 0; info.forInt.min = 10; /* ccsCheckValueEq needs to know the type and info about this type */ EXPECT_CALL (Mock (settingToBeChanged), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (addSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToBeChanged), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (addSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (addSettingIdentifier), getValue ()).WillOnce (Return (&valueResetIdentifier)); EXPECT_CALL (Mock (settingToBeChanged), setValue (Pointee (SettingValueMatch (valueResetIdentifier, TypeInt, &info)), IsTrue ())); ccsUpgradeAddValues (*list); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestNoReplaceValuesSettingNotFound) { MockedSetting fromSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting toSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))); EXPECT_CALL (Mock (fromSettingIdentifier), getParent ()); EXPECT_CALL (Mock (fromSettingIdentifier), getName ()); CCSSettingListWrapperPtr replaceFromValueSettings (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (fromSettingIdentifier)), cci::Shallow)); CCSSettingListWrapperPtr replaceToValueSettings (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (toSettingIdentifier)), cci::Shallow)); ccsUpgradeReplaceValues (*replaceFromValueSettings, *replaceToValueSettings); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestReplaceValuesInListNonListType) { MockedSetting fromSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting toSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting settingToBeChanged (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt)); CCSSettingValue settingToBeChangedValue; CCSSettingValue fromSettingIdentifierValue; CCSSettingValue toSettingIdentifierValue; InitializeValueForSetting (settingToBeChangedValue, Real (settingToBeChanged)); InitializeValueForSetting (fromSettingIdentifierValue, Real (fromSettingIdentifier)); InitializeValueForSetting (toSettingIdentifierValue, Real (toSettingIdentifier)); settingToBeChangedValue.value.asInt = 7; fromSettingIdentifierValue.value.asInt = 7; toSettingIdentifierValue.value.asInt = 8; CCSSettingListWrapperPtr replaceFromValueSettings (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (fromSettingIdentifier)), cci::Shallow)); CCSSettingListWrapperPtr replaceToValueSettings (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (toSettingIdentifier)), cci::Shallow)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToBeChanged))); EXPECT_CALL (Mock (fromSettingIdentifier), getParent ()); EXPECT_CALL (Mock (fromSettingIdentifier), getName ()); EXPECT_CALL (Mock (toSettingIdentifier), getName ()); CCSSettingInfo info; info.forInt.max = 0; info.forInt.min = 10; /* ccsCheckValueEq needs to know the type and info about this type */ EXPECT_CALL (Mock (settingToBeChanged), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (fromSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToBeChanged), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (fromSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (toSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (settingToBeChanged), getValue ()).WillOnce (Return (&settingToBeChangedValue)); EXPECT_CALL (Mock (fromSettingIdentifier), getValue ()).WillOnce (Return (&fromSettingIdentifierValue)); EXPECT_CALL (Mock (toSettingIdentifier), getValue ()).WillOnce (Return (&toSettingIdentifierValue)); EXPECT_CALL (Mock (settingToBeChanged), setValue (Pointee (SettingValueMatch (toSettingIdentifierValue, TypeInt, &info)), IsTrue ())); ccsUpgradeReplaceValues (*replaceFromValueSettings, *replaceToValueSettings); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestReplaceValuesInListNonListTypeNoMatch) { MockedSetting fromSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting toSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting settingToBeChanged (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt)); CCSSettingValue settingToBeChangedValue; CCSSettingValue fromSettingIdentifierValue; CCSSettingValue toSettingIdentifierValue; InitializeValueForSetting (settingToBeChangedValue, Real (settingToBeChanged)); InitializeValueForSetting (fromSettingIdentifierValue, Real (fromSettingIdentifier)); InitializeValueForSetting (toSettingIdentifierValue, Real (toSettingIdentifier)); settingToBeChangedValue.value.asInt = 6; fromSettingIdentifierValue.value.asInt = 7; toSettingIdentifierValue.value.asInt = 8; CCSSettingListWrapperPtr replaceFromValueSettings (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (fromSettingIdentifier)), cci::Shallow)); CCSSettingListWrapperPtr replaceToValueSettings (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (toSettingIdentifier)), cci::Shallow)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToBeChanged))); EXPECT_CALL (Mock (fromSettingIdentifier), getParent ()); EXPECT_CALL (Mock (fromSettingIdentifier), getName ()); CCSSettingInfo info; info.forInt.max = 0; info.forInt.min = 10; /* ccsCheckValueEq needs to know the type and info about this type */ EXPECT_CALL (Mock (settingToBeChanged), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (fromSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToBeChanged), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (fromSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (toSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (settingToBeChanged), getValue ()).WillOnce (Return (&settingToBeChangedValue)); EXPECT_CALL (Mock (fromSettingIdentifier), getValue ()).WillOnce (Return (&fromSettingIdentifierValue)); ccsUpgradeReplaceValues (*replaceFromValueSettings, *replaceToValueSettings); } namespace { boost::shared_ptr newOwnedCCSStringFromStaticCharArray (const char *cStr) { CCSString *string = reinterpret_cast (calloc (1, sizeof (CCSString))); boost::shared_ptr str (string, ccsStringUnref); str->value = strdup (cStr); ccsStringRef (str.get ()); return str; } void ccsSettingValueListDeepFree (CCSSettingValueList list) { ccsSettingValueListFree (list, TRUE); } typedef boost::shared_ptr > CCSStringListWrapperPtr; CCSStringListWrapperPtr constructStrListWrapper (CCSStringList list, cci::ListStorageType storageType) { return boost::make_shared > (list, ccsStringListFree, ccsStringListAppend, ccsStringListRemove, storageType); } } /* TODO: These tests need to be cleaned up. There are multiple asserts per-test here */ TEST_F (CCSSettingsUpgradeTestWithMockContext, TestAddValuesInListAppendsValuesToListFromList) { const std::string valueOne ("value_one"); const std::string valueThree ("value_three"); MockedSetting appendSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeList, DoNotAddSettingToPlugin)); MockedSetting settingToAppendValuesTo (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeList)); boost::shared_ptr stringToAppendOne (newOwnedCCSStringFromStaticCharArray (valueOne.c_str ())); boost::shared_ptr stringInBothLists (newOwnedCCSStringFromStaticCharArray (valueThree.c_str ())); CCSStringListWrapperPtr settingsStrList (constructStrListWrapper (ccsStringListAppend (NULL, stringInBothLists.get ()), cci::Shallow)); boost::shared_ptr <_CCSSettingValueList> settingStrValueList (AutoDestroy (ccsGetValueListFromStringList (*settingsStrList, Real (settingToAppendValuesTo)), ccsSettingValueListDeepFree)); CCSStringListWrapperPtr appendStrList (constructStrListWrapper (ccsStringListAppend (NULL, stringInBothLists.get ()), cci::Shallow)); appendStrList->append (stringToAppendOne.get ()); boost::shared_ptr <_CCSSettingValueList> appendStrValueList (AutoDestroy (ccsGetValueListFromStringList (*appendStrList, Real (appendSettingIdentifier)), ccsSettingValueListDeepFree)); CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (appendSettingIdentifier)), cci::Shallow)); CCSSettingValue valueToHaveSubValuesAdded; CCSSettingValue valueSubValuesAddIdentifiers; InitializeValueForSetting (valueToHaveSubValuesAdded, Real (settingToAppendValuesTo)); InitializeValueForSetting (valueSubValuesAddIdentifiers, Real (appendSettingIdentifier)); valueToHaveSubValuesAdded.value.asList = settingStrValueList.get (); valueSubValuesAddIdentifiers.value.asList = appendStrValueList.get (); CCSSettingInfo info; info.forList.listType = TypeString; EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToAppendValuesTo))); EXPECT_CALL (Mock (appendSettingIdentifier), getParent ()); EXPECT_CALL (Mock (appendSettingIdentifier), getName ()); EXPECT_CALL (Mock (appendSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToAppendValuesTo), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (appendSettingIdentifier), getValue ()).WillOnce (Return (&valueSubValuesAddIdentifiers)); EXPECT_CALL (Mock (settingToAppendValuesTo), getValue ()).WillOnce (Return (&valueToHaveSubValuesAdded)); EXPECT_CALL (Mock (settingToAppendValuesTo), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (appendSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); const CCSSettingValue &appendedStringInListValue = *appendStrValueList->next->data; EXPECT_CALL (Mock (settingToAppendValuesTo), setList ( IsSettingValueInSettingValueCCSList ( AllOf (SettingValueMatch (appendedStringInListValue, TypeString, &info), CheckValueParent (Real (settingToAppendValuesTo)))), IsTrue ())); ccsUpgradeAddValues (*list); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestClearValuesInListRemovesValuesFromList) { const std::string valueOne ("value_one"); const std::string valueThree ("value_three"); MockedSetting resetSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeList, DoNotAddSettingToPlugin)); MockedSetting settingToRemoveValuesFrom (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeList)); boost::shared_ptr stringForRemovalOne (newOwnedCCSStringFromStaticCharArray (valueOne.c_str ())); boost::shared_ptr stringNotRemoved (newOwnedCCSStringFromStaticCharArray (valueThree.c_str ())); CCSStringListWrapperPtr settingsStrList (constructStrListWrapper (ccsStringListAppend (NULL, stringForRemovalOne.get ()), cci::Shallow)); settingsStrList->append (stringNotRemoved.get ()); boost::shared_ptr <_CCSSettingValueList> settingStrValueList (AutoDestroy (ccsGetValueListFromStringList (*settingsStrList, Real (settingToRemoveValuesFrom)), ccsSettingValueListDeepFree)); CCSStringListWrapperPtr removeStrList (constructStrListWrapper (ccsStringListAppend (NULL, stringForRemovalOne.get ()), cci::Shallow)); boost::shared_ptr <_CCSSettingValueList> removeStrValueList (AutoDestroy (ccsGetValueListFromStringList (*removeStrList, Real (resetSettingIdentifier)), ccsSettingValueListDeepFree)); CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (resetSettingIdentifier)), cci::Shallow)); CCSSettingValue valueToHaveSubValuesRemoved; CCSSettingValue valueSubValuesResetIdentifiers; InitializeValueForSetting (valueToHaveSubValuesRemoved, Real (settingToRemoveValuesFrom)); InitializeValueForSetting (valueSubValuesResetIdentifiers, Real (resetSettingIdentifier)); valueToHaveSubValuesRemoved.value.asList = settingStrValueList.get (); valueSubValuesResetIdentifiers.value.asList = removeStrValueList.get (); CCSSettingInfo info; info.forList.listType = TypeString; EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToRemoveValuesFrom))); EXPECT_CALL (Mock (resetSettingIdentifier), getParent ()); EXPECT_CALL (Mock (resetSettingIdentifier), getName ()); EXPECT_CALL (Mock (resetSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToRemoveValuesFrom), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (resetSettingIdentifier), getValue ()).WillOnce (Return (&valueSubValuesResetIdentifiers)); EXPECT_CALL (Mock (settingToRemoveValuesFrom), getValue ()).WillOnce (Return (&valueToHaveSubValuesRemoved)); EXPECT_CALL (Mock (settingToRemoveValuesFrom), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (resetSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); const CCSSettingValue &removedStringInListValue = *removeStrValueList->data; EXPECT_CALL (Mock (settingToRemoveValuesFrom), setList ( Not ( IsSettingValueInSettingValueCCSList ( SettingValueMatch (removedStringInListValue, TypeString, &info))), IsTrue ())); ccsUpgradeClearValues (*list); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_text_file.cpp0000644000015301777760000000275412321343002033636 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include "ccs_text_file_interface.h" #include "compizconfig_ccs_text_file_mock.h" #include #include using ::testing::_; using ::testing::Return; using ::testing::Eq; class CCSTextFileTest : public ::testing::Test { }; namespace { const std::string CCS_TEXT_FILE_TESTING_CONTENTS; const std::string CCS_TEXT_FILE_APPEND_CONTENTS; } MATCHER(BoolTrue, "Boolean True") { if (arg) return true; else return false; } TEST(CCSTextFileTest, TestMock) { boost::shared_ptr textFile (AutoDestroy (ccsMockTextFileNew (&ccsDefaultObjectAllocator), ccsTextFileUnref)); CCSTextFileGMock *mock = reinterpret_cast (ccsObjectGetPrivate (textFile)); CharacterWrapper temporaryFileContents (strdup (CCS_TEXT_FILE_TESTING_CONTENTS.c_str ())); char *temporaryFileContentsC = temporaryFileContents; EXPECT_CALL (*mock, readFromStart ()).WillOnce (Return (temporaryFileContentsC)); EXPECT_CALL (*mock, appendString (Eq (CCS_TEXT_FILE_APPEND_CONTENTS))).WillOnce (Return (TRUE)); EXPECT_CALL (*mock, free ()); EXPECT_THAT (ccsTextFileReadFromStart (textFile.get ()), Eq (CCS_TEXT_FILE_TESTING_CONTENTS)); EXPECT_THAT (ccsTextFileAppendString (textFile.get (), CCS_TEXT_FILE_APPEND_CONTENTS.c_str ()), BoolTrue ()); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_context.cpp0000644000015301777760000002654412321343002033342 0ustar pbusernogroup00000000000000#include #include #include #include #include #include "ccs_backend_loader_interface.h" #include "ccs_backend_loader.h" #include "ccs_config_file_interface.h" #include "ccs_config_file.h" #include "ccs-backend.h" #include "ccs-private.h" #include "compizconfig_ccs_config_file_mock.h" #include "compizconfig_ccs_backend_loader_mock.h" #include "compizconfig_ccs_backend_mock.h" #include "compizconfig_ccs_context_mock.h" using ::testing::_; using ::testing::AtLeast; using ::testing::SetArgPointee; using ::testing::Return; using ::testing::DoAll; using ::testing::Eq; class CCSContextTest : public ::testing::Test { }; TEST_F(CCSContextTest, TestMock) { CCSContext *context = ccsMockContextNew (); CCSContextGMock *mock = (CCSContextGMock *) ccsObjectGetPrivate (context); EXPECT_CALL (*mock, getPlugins ()); EXPECT_CALL (*mock, getCategories ()); EXPECT_CALL (*mock, getChangedSettings ()); EXPECT_CALL (*mock, getScreenNum ()); EXPECT_CALL (*mock, addChangedSetting (_)); EXPECT_CALL (*mock, clearChangedSettings ()); EXPECT_CALL (*mock, stealChangedSettings ()); EXPECT_CALL (*mock, getPrivatePtr ()); EXPECT_CALL (*mock, setPrivatePtr (_)); EXPECT_CALL (*mock, loadPlugin (_)); EXPECT_CALL (*mock, findPlugin (_)); EXPECT_CALL (*mock, pluginIsActive (_)); EXPECT_CALL (*mock, getActivePluginList ()); EXPECT_CALL (*mock, getSortedPluginStringList ()); EXPECT_CALL (*mock, setBackend (_)); EXPECT_CALL (*mock, getBackend ()); EXPECT_CALL (*mock, setIntegrationEnabled (_)); EXPECT_CALL (*mock, setProfile (_)); EXPECT_CALL (*mock, setPluginListAutoSort (_)); EXPECT_CALL (*mock, getIntegrationEnabled ()); EXPECT_CALL (*mock, getProfile ()); EXPECT_CALL (*mock, getPluginListAutoSort ()); EXPECT_CALL (*mock, processEvents (_)); EXPECT_CALL (*mock, readSettings ()); EXPECT_CALL (*mock, writeSettings ()); EXPECT_CALL (*mock, writeChangedSettings ()); EXPECT_CALL (*mock, exportToFile (_, _)); EXPECT_CALL (*mock, importFromFile (_, _)); EXPECT_CALL (*mock, canEnablePlugin (_)); EXPECT_CALL (*mock, canDisablePlugin (_)); EXPECT_CALL (*mock, getExistingProfiles ()); EXPECT_CALL (*mock, deleteProfile (_)); char *foo = strdup ("foo"); char *bar = strdup ("bar"); ccsContextGetPlugins (context); ccsContextGetCategories (context); ccsContextGetChangedSettings (context); ccsContextGetScreenNum (context); ccsContextAddChangedSetting (context, NULL); ccsContextClearChangedSettings (context); ccsContextStealChangedSettings (context); ccsContextGetPrivatePtr (context); ccsContextSetPrivatePtr (context, NULL); ccsLoadPlugin (context, foo); ccsFindPlugin (context, foo); ccsPluginIsActive (context, foo); ccsGetActivePluginList (context); ccsGetSortedPluginStringList (context); ccsSetBackend (context, bar); ccsGetBackend (context); ccsSetIntegrationEnabled (context, TRUE); ccsSetProfile (context, foo); ccsSetPluginListAutoSort (context, TRUE); ccsGetIntegrationEnabled (context); ccsGetProfile (context); ccsGetPluginListAutoSort (context); ccsProcessEvents (context, 0); ccsReadSettings (context); ccsWriteSettings (context); ccsWriteChangedSettings (context); ccsExportToFile (context, bar, TRUE); ccsImportFromFile (context, foo, FALSE); ccsCanEnablePlugin (context, NULL); ccsCanDisablePlugin (context, NULL); ccsGetExistingProfiles (context); ccsDeleteProfile (context, foo); free (foo); free (bar); ccsFreeContext (context); } const CCSInterfaceTable ccsMockInterfaceTable = { &ccsDefaultContextInterface, NULL, NULL, NULL, NULL }; class CCSContextTestWithMockedBackendProfile : public ::testing::Test { public: CCSContextTestWithMockedBackendProfile () : loader (ccsMockBackendLoaderNew (&ccsDefaultObjectAllocator)), config (ccsMockConfigFileNew (&ccsDefaultObjectAllocator)), backend (AutoDestroy (ccsMockBackendNew (), ccsFreeMockBackend)), mockLoader (reinterpret_cast (ccsObjectGetPrivate (loader))), mockConfig (reinterpret_cast (ccsObjectGetPrivate (config))), mockBackend (reinterpret_cast (ccsObjectGetPrivate (backend.get ()))), mockBackendStr ("mock"), availableProfileStr ("available"), unavailableProfileStr ("unavailable") { inst = this; /* Insert a stub dynamic backend interface into the mock backend */ CCSDynamicBackendInterface backendIface = { CCSContextTestWithMockedBackendProfile::GetMockBackendName, CCSContextTestWithMockedBackendProfile::GetMockBackendSupportRead, CCSContextTestWithMockedBackendProfile::GetMockBackendSupportWrite, CCSContextTestWithMockedBackendProfile::GetMockBackendSupportProfiles, CCSContextTestWithMockedBackendProfile::GetMockBackendSupportIntegration, CCSContextTestWithMockedBackendProfile::GetMockBackendSupportRaw }; stubDynamicBackend = backendIface; ccsObjectAddInterface (backend.get (), (const CCSInterface *) &stubDynamicBackend, GET_INTERFACE_TYPE (CCSDynamicBackendInterface)); char *mockBackendCopy = strdup (mockBackendStr.c_str ()); EXPECT_CALL (*mockConfig, readConfigOption (_, _)).Times (AtLeast (0)); EXPECT_CALL (*mockConfig, writeConfigOption (_, _)).Times (AtLeast (0)); EXPECT_CALL (*mockConfig, setConfigWatchCallback (_, _)).Times (AtLeast (0)); EXPECT_CALL (*mockLoader, loadBackend (_, _, _)).Times (AtLeast (0)); EXPECT_CALL (*mockBackend, init (_)).Times (AtLeast (0)); EXPECT_CALL (*mockBackend, getExistingProfiles (_)).Times (AtLeast (0)); ON_CALL (*mockConfig, readConfigOption (OptionBackend, _)) .WillByDefault (DoAll (SetArgPointee <1> (mockBackendCopy), Return (1))); ON_CALL (*mockLoader, loadBackend (_, _, Eq (mockBackendStr))) .WillByDefault (Return (backend.get ())); /* We are using ccsFreeContext instead of ccsContextDestroy as that does not * free the backend as well */ context = AutoDestroy (ccsEmptyContextNew (0, CCSContextTestWithMockedBackendProfile::ImportProfile, CCSContextTestWithMockedBackendProfile::AvailableProfiles, loader, config, &ccsMockInterfaceTable), ccsFreeContext); } ~CCSContextTestWithMockedBackendProfile () { inst = NULL; } protected: void AddAvailableSysconfProfile (const std::string &profile) { availableProfiles.push_back (profile); } void ExistingProfile (const std::string &profile) { CCSString *string = reinterpret_cast (calloc (1, sizeof (CCSString))); string->value = strdup (profile.c_str ()); ccsStringRef (string); CCSStringList existing (ccsStringListAppend (NULL, string)); ON_CALL (*mockBackend, getExistingProfiles (_)).WillByDefault (Return (existing)); } private: static CCSStringList AvailableProfiles (const char *directory) { CCSStringList list = NULL; for (std::vector ::iterator it = inst->availableProfiles.begin (); it != inst->availableProfiles.end (); ++it) { CCSString *string = reinterpret_cast (calloc (1, sizeof (CCSString))); ccsStringRef (string); string->value = strdup (it->c_str ()); list = ccsStringListAppend (list, string); } return list; } static Bool ImportProfile (CCSContext *context, const char *fileName, Bool overwriteNonDefault) { return inst->ImportProfileVerify (context, fileName, overwriteNonDefault); } static const char * GetMockBackendName (CCSDynamicBackend *backend) { return inst->mockBackendStr.c_str (); } static Bool GetMockBackendSupportRead (CCSDynamicBackend *backend) { return TRUE; } static Bool GetMockBackendSupportWrite (CCSDynamicBackend *backend) { return TRUE; } static Bool GetMockBackendSupportIntegration (CCSDynamicBackend *backend) { return FALSE; } static Bool GetMockBackendSupportProfiles (CCSDynamicBackend *backend) { return TRUE; } static CCSBackend * GetMockBackendSupportRaw (CCSDynamicBackend *backend) { return inst->backend.get (); } protected: MOCK_METHOD3 (ImportProfileVerify, Bool (CCSContext *, const char*, Bool)); CCSBackendLoader *loader; CCSConfigFile *config; /* This is not managed by the context */ boost::shared_ptr backend; CCSBackendLoaderGMock *mockLoader; CCSConfigFileGMock *mockConfig; CCSBackendGMock *mockBackend; const std::string mockBackendStr; const std::string availableProfileStr; const std::string unavailableProfileStr; CCSDynamicBackendInterface stubDynamicBackend; boost::shared_ptr context; private: std::vector availableProfiles; protected: static CCSContextTestWithMockedBackendProfile *inst; }; CCSContextTestWithMockedBackendProfile * CCSContextTestWithMockedBackendProfile::inst = NULL; TEST_F (CCSContextTestWithMockedBackendProfile, TestSetup) { } /* We should always import any new profiles that we encounter which are not * available from the backend. The reason for this being that we don't want to * just load the profile and end up with an empty config */ TEST_F (CCSContextTestWithMockedBackendProfile, ImportProfileIfNotAvailableInBackend) { const std::string sysconfProfile (std::string (SYSCONFDIR) + "/compizconfig/" + unavailableProfileStr); ExistingProfile (availableProfileStr); AddAvailableSysconfProfile (sysconfProfile); EXPECT_CALL (*this, ImportProfileVerify (_, Eq (sysconfProfile), _)) .WillOnce (Return (TRUE)); ccsSetProfile (context.get (), unavailableProfileStr.c_str ()); } TEST_F (CCSContextTestWithMockedBackendProfile, ImportProfileDotIni) { const std::string sysconfProfile (std::string (SYSCONFDIR) + "/compizconfig/" + unavailableProfileStr + ".ini"); ExistingProfile (availableProfileStr); AddAvailableSysconfProfile (sysconfProfile); EXPECT_CALL (*this, ImportProfileVerify (_, Eq (sysconfProfile), _)) .WillOnce (Return (TRUE)); ccsSetProfile (context.get (), unavailableProfileStr.c_str ()); } TEST_F (CCSContextTestWithMockedBackendProfile, ImportProfileDotProfile) { const std::string sysconfProfile (std::string (SYSCONFDIR) + "/compizconfig/" + unavailableProfileStr + ".profile"); ExistingProfile (availableProfileStr); AddAvailableSysconfProfile (sysconfProfile); EXPECT_CALL (*this, ImportProfileVerify (_, Eq (sysconfProfile), _)) .WillOnce (Return (TRUE)); ccsSetProfile (context.get (), unavailableProfileStr.c_str ()); } /* Not when available in both */ TEST_F (CCSContextTestWithMockedBackendProfile, NoImportProfileIfAvailableInBackend) { ExistingProfile (availableProfileStr); AddAvailableSysconfProfile (availableProfileStr); EXPECT_CALL (*this, ImportProfileVerify (_, _, _)).Times (0); ccsSetProfile (context.get (), availableProfileStr.c_str ()); } /* Not when ther selected profile isn't in sysconfdir */ TEST_F (CCSContextTestWithMockedBackendProfile, NoImportProfileIfNotInDir) { ExistingProfile (availableProfileStr); AddAvailableSysconfProfile (availableProfileStr); EXPECT_CALL (*this, ImportProfileVerify (_, _, _)).Times (0); ccsSetProfile (context.get (), unavailableProfileStr.c_str ()); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_plugin.cpp0000644000015301777760000000351112321343002033141 0ustar pbusernogroup00000000000000#include #include #include #include "compizconfig_ccs_plugin_mock.h" using ::testing::_; using ::testing::Return; class CCSPluginTest : public ::testing::Test { }; TEST(CCSPluginTest, TestMock) { CCSPlugin *plugin = ccsMockPluginNew (); CCSPluginGMock *mock = (CCSPluginGMock *) ccsObjectGetPrivate (plugin); EXPECT_CALL (*mock, getName ()); EXPECT_CALL (*mock, getShortDesc ()); EXPECT_CALL (*mock, getLongDesc ()); EXPECT_CALL (*mock, getHints ()); EXPECT_CALL (*mock, getCategory ()); EXPECT_CALL (*mock, getLoadAfter ()); EXPECT_CALL (*mock, getLoadBefore ()); EXPECT_CALL (*mock, getRequiresPlugins ()); EXPECT_CALL (*mock, getConflictPlugins ()); EXPECT_CALL (*mock, getProvidesFeatures ()); EXPECT_CALL (*mock, getRequiresFeatures ()); EXPECT_CALL (*mock, getPrivatePtr ()); EXPECT_CALL (*mock, setPrivatePtr (_)); EXPECT_CALL (*mock, getContext ()); EXPECT_CALL (*mock, findSetting (_)); EXPECT_CALL (*mock, getPluginGroups ()); EXPECT_CALL (*mock, readPluginSettings ()); EXPECT_CALL (*mock, getPluginStrExtensions ()); ccsPluginGetName (plugin); ccsPluginGetShortDesc (plugin); ccsPluginGetLongDesc (plugin); ccsPluginGetHints (plugin); ccsPluginGetCategory (plugin); ccsPluginGetLoadAfter (plugin); ccsPluginGetLoadBefore (plugin); ccsPluginGetRequiresPlugins (plugin); ccsPluginGetConflictPlugins (plugin); ccsPluginGetProvidesFeatures (plugin); ccsPluginGetRequiresFeatures (plugin); ccsPluginGetPrivatePtr (plugin); ccsPluginSetPrivatePtr (plugin, NULL); ccsPluginGetContext (plugin); ccsFindSetting (plugin, "foo"); ccsGetPluginGroups (plugin); ccsReadPluginSettings (plugin); ccsGetPluginStrExtensions (plugin); ccsPluginUnref (plugin); } ././@LongLink0000000000000000000000000000016300000000000011215 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_mock_backend_conformance.cppcompiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_mock_backend_c0000644000015301777760000005322712321343002033775 0ustar pbusernogroup00000000000000#include #include #include #include #include #include "compizconfig_ccs_backend_mock.h" using ::testing::_; using ::testing::Return; using ::testing::Invoke; using ::testing::WithArgs; using ::testing::Combine; using ::testing::ValuesIn; using ::testing::Values; using ::testing::AtLeast; namespace { std::string keynameFromPluginKey (const std::string &plugin, const std::string &key) { return plugin + "/" + key; } } template class ValueForKeyRetreival { public: T GetValueForKey (const std::string &key, const std::map &map) { std::map ::const_iterator it = map.find (key); if (it != map.end ()) return boost::get (it->second); else throw std::exception (); } }; namespace { void doNothingWithCCSSetting (CCSSetting *) {}; const CCSBackendInfo mockBackendInfo = { "mock", "Mock Backend", "Mock Backend for libccs", TRUE, TRUE }; } class MockCCSSettingsTestEnvironment : public CCSSettingsConceptTestEnvironmentInterface { public: virtual void SetUp () { } virtual void TearDown () { } void WriteBoolAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteIntegerAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteFloatAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteMatchAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteStringAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteColorAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteKeyAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteButtonAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteEdgeAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteBellAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteListAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } virtual Bool ReadBoolAtKey (const std::string &plugin, const std::string &key) { return compizconfig::test::boolToBool ( ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues)); } virtual int ReadIntegerAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual float ReadFloatAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual const char * ReadStringAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual CCSSettingColorValue ReadColorAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual CCSSettingKeyValue ReadKeyAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual CCSSettingButtonValue ReadButtonAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual unsigned int ReadEdgeAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual const char * ReadMatchAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual Bool ReadBellAtKey (const std::string &plugin, const std::string &key) { return compizconfig::test::boolToBool ( ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues)); } virtual CCSSettingValueList ReadListAtKey (const std::string &plugin, const std::string &key, CCSSetting *setting) { cci::SettingValueListWrapper::Ptr lw (ValueForKeyRetreival > ().GetValueForKey (keynameFromPluginKey (plugin, key), mValues)); return ccsCopyList (*lw, lw->setting ().get ()); } private: std::map mValues; }; class MockCCSBackendConceptTestEnvironment : public CCSBackendConceptTestEnvironmentInterface { private: virtual void SetUp () { mMockCCSSettingTestEnvironment.SetUp (); } virtual void TearDown () { mMockCCSSettingTestEnvironment.SetUp (); } public: CCSBackend * BackendSetUp (CCSContext *context, CCSContextGMock *gmockContext) { mContext = context; mBackend = ccsMockBackendNew (); mBackendGMock = (CCSBackendGMock *) ccsObjectGetPrivate (mBackend); ON_CALL (*mBackendGMock, readSetting (_, _)) .WillByDefault ( WithArgs<1> ( Invoke ( this, &MockCCSBackendConceptTestEnvironment::ReadValueIntoSetting))); ON_CALL (*mBackendGMock, updateSetting (_, _, _)) .WillByDefault ( WithArgs<2> ( Invoke ( this, &MockCCSBackendConceptTestEnvironment::ReadValueIntoSetting))); ON_CALL (*mBackendGMock, writeSetting (_, _)) .WillByDefault ( WithArgs<1> ( Invoke ( this, &MockCCSBackendConceptTestEnvironment::WriteValueToMap))); ON_CALL (*mBackendGMock, deleteProfile (_, _)) .WillByDefault ( WithArgs <1> ( Invoke ( this, &MockCCSBackendConceptTestEnvironment::DeleteProfile))); return mBackend; } const CCSBackendInfo * GetInfo () { EXPECT_CALL (*mBackendGMock, getInfo ()).WillOnce (Return (&mockBackendInfo)); return &mockBackendInfo; } void BackendTearDown (CCSBackend *backend) { ccsFreeMockBackend (backend); } void AddProfile (const std::string &profile) { mProfiles.push_back (profile); } void SetGetExistingProfilesExpectation (CCSContext *context, CCSContextGMock *gmockContext) { CCSStringList stringList = NULL; CCSString *defaultProfile = reinterpret_cast (calloc (1, sizeof (CCSString))); CCSString *currentProfile = reinterpret_cast (calloc (1, sizeof (CCSString))); EXPECT_CALL (*gmockContext, getProfile ()); defaultProfile->value = strdup ("Default"); currentProfile->value = strdup (ccsGetProfile (context)); ccsStringRef (defaultProfile); ccsStringRef (currentProfile); stringList = ccsStringListAppend (stringList, defaultProfile); stringList = ccsStringListAppend (stringList, currentProfile); for (std::vector ::iterator it = mProfiles.begin (); it != mProfiles.end (); ++it) { if (*it == defaultProfile->value || *it == currentProfile->value) continue; CCSString *string = reinterpret_cast (calloc (1, sizeof (CCSString))); string->value = strdup ((*it).c_str ()); ccsStringRef (string); stringList = ccsStringListAppend (stringList, string); } EXPECT_CALL (*mBackendGMock, getExistingProfiles (context)).WillOnce (Return (stringList)); } void SetDeleteProfileExpectation (const std::string &profileForDeletion, CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*mBackendGMock, deleteProfile (context, Eq (profileForDeletion))); } void SetReadInitExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*mBackendGMock, readInit (context)).WillOnce (Return (TRUE)); } void SetReadDoneExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*mBackendGMock, readDone (context)); } void SetWriteInitExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*mBackendGMock, writeInit (context)).WillOnce (Return (TRUE)); } void SetWriteDoneExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*mBackendGMock, writeDone (context)); } void PreWrite (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { EXPECT_CALL (*mBackendGMock, writeSetting (_, _)); EXPECT_CALL (*gmockPlugin, getName ()); EXPECT_CALL (*gmockSetting, getName ()); EXPECT_CALL (*gmockSetting, getParent ()); testing::Cardinality cardinality; if (type == TypeList) cardinality = ::testing::AtLeast (1); else cardinality = ::testing::AtMost (1); EXPECT_CALL (*gmockSetting, getType ()).Times (cardinality); } void PostWrite (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { } void PreRead (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { EXPECT_CALL (*mBackendGMock, readSetting (_, _)); EXPECT_CALL (*gmockPlugin, getName ()); EXPECT_CALL (*gmockSetting, getName ()); EXPECT_CALL (*gmockSetting, getParent ()); if (type == TypeList) { EXPECT_CALL (*gmockSetting, getType ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getInfo ()).Times (AtLeast (1)); } else { EXPECT_CALL (*gmockSetting, getType ()); } } void PostRead (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { } void PreUpdate (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { EXPECT_CALL (*mBackendGMock, updateSetting (_, _, _)); EXPECT_CALL (*gmockPlugin, getName ()); EXPECT_CALL (*gmockSetting, getName ()); EXPECT_CALL (*gmockSetting, getParent ()); if (type == TypeList) { EXPECT_CALL (*gmockSetting, getType ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getInfo ()).Times (AtLeast (1)); } else { EXPECT_CALL (*gmockSetting, getType ()); } } void PostUpdate (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { } bool UpdateSettingAtKey (const std::string &plugin, const std::string &setting) { CCSPlugin *cplugin = ccsFindPlugin (mContext, plugin.c_str ()); if (!cplugin) return false; CCSSetting *csetting = ccsFindSetting (cplugin, setting.c_str ()); if (!csetting) return false; ccsBackendUpdateSetting (mBackend, mContext, cplugin, csetting); return true; } void WriteBoolAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteBoolAtKey (plugin, key, value); } void WriteIntegerAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteIntegerAtKey (plugin, key, value); } void WriteFloatAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteFloatAtKey (plugin, key, value); } void WriteMatchAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteMatchAtKey (plugin, key, value);; } void WriteStringAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteStringAtKey (plugin, key, value); } void WriteColorAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteColorAtKey (plugin, key, value); } void WriteKeyAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteKeyAtKey (plugin, key, value); } void WriteButtonAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteButtonAtKey (plugin, key, value); } void WriteEdgeAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteEdgeAtKey (plugin, key, value); } void WriteBellAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteBellAtKey (plugin, key, value); } void WriteListAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteListAtKey (plugin, key, value); } virtual Bool ReadBoolAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadBoolAtKey (plugin, key); } virtual int ReadIntegerAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadIntegerAtKey (plugin, key); } virtual float ReadFloatAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadFloatAtKey (plugin, key);; } virtual const char * ReadStringAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadStringAtKey (plugin, key); } virtual CCSSettingColorValue ReadColorAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadColorAtKey (plugin, key); } virtual CCSSettingKeyValue ReadKeyAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadKeyAtKey (plugin, key); } virtual CCSSettingButtonValue ReadButtonAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadButtonAtKey (plugin, key); } virtual unsigned int ReadEdgeAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadEdgeAtKey (plugin, key); } virtual const char * ReadMatchAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadMatchAtKey (plugin, key); } virtual Bool ReadBellAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadBellAtKey (plugin, key); } virtual CCSSettingValueList ReadListAtKey (const std::string &plugin, const std::string &key, CCSSetting *setting) { return mMockCCSSettingTestEnvironment.ReadListAtKey (plugin, key, setting); } protected: bool DeleteProfile (const std::string &profileToDelete) { std::vector ::iterator it = std::find (mProfiles.begin (), mProfiles.end (), profileToDelete); if (it != mProfiles.end ()) { mProfiles.erase (it); return true; } else { return false; } } private: void ReadValueIntoSetting (CCSSetting *setting) { std::string plugin (ccsPluginGetName (ccsSettingGetParent (setting))); std::string key (ccsSettingGetName (setting)); switch (ccsSettingGetType (setting)) { case TypeBool: ccsSetBool (setting, ReadBoolAtKey (plugin, key), FALSE); break; case TypeInt: ccsSetInt (setting, ReadIntegerAtKey (plugin, key), FALSE); break; case TypeFloat: ccsSetFloat (setting, ReadFloatAtKey (plugin, key), FALSE); break; case TypeString: ccsSetString (setting, ReadStringAtKey (plugin, key), FALSE); break; case TypeMatch: ccsSetMatch (setting, ReadMatchAtKey (plugin, key), FALSE); break; case TypeColor: ccsSetColor (setting, ReadColorAtKey (plugin, key), FALSE); break; case TypeKey: ccsSetKey (setting, ReadKeyAtKey (plugin, key), FALSE); break; case TypeButton: ccsSetButton (setting, ReadButtonAtKey (plugin, key), FALSE); break; case TypeEdge: ccsSetEdge (setting, ReadEdgeAtKey (plugin, key), FALSE); break; case TypeBell: ccsSetBell (setting, ReadBellAtKey (plugin, key), FALSE); break; case TypeList: ccsSetList (setting, cci::SettingValueListWrapper (ReadListAtKey (plugin, key, setting), cci::Deep, ccsSettingGetInfo (setting)->forList.listType, boost::shared_ptr (setting, boost::bind (doNothingWithCCSSetting, _1))), FALSE); break; default: throw std::exception (); } } void WriteValueToMap (CCSSetting *setting) { std::string plugin (ccsPluginGetName (ccsSettingGetParent (setting))); std::string key (ccsSettingGetName (setting)); Bool vBool; int vInt; float vFloat; const char *vString; CCSSettingColorValue vColor; CCSSettingKeyValue vKey; CCSSettingButtonValue vButton; unsigned int vEdge; CCSSettingValueList vList; switch (ccsSettingGetType (setting)) { case TypeBool: ccsGetBool (setting, &vBool); WriteBoolAtKey (plugin, key, VariantTypes (vBool ? true : false)); break; case TypeInt: ccsGetInt (setting, &vInt); WriteIntegerAtKey (plugin, key, VariantTypes (vInt)); break; case TypeFloat: ccsGetFloat (setting, &vFloat); WriteFloatAtKey (plugin, key, VariantTypes (vFloat)); break; case TypeString: ccsGetString (setting, &vString); WriteStringAtKey (plugin, key, VariantTypes (static_cast (vString))); break; case TypeMatch: ccsGetMatch (setting, &vString); WriteStringAtKey (plugin, key, VariantTypes (static_cast (vString))); break; case TypeColor: ccsGetColor (setting, &vColor); WriteColorAtKey (plugin, key, VariantTypes (vColor)); break; case TypeKey: ccsGetKey (setting, &vKey); WriteKeyAtKey (plugin, key, VariantTypes (vKey)); break; case TypeButton: ccsGetButton (setting, &vButton); WriteButtonAtKey (plugin, key, VariantTypes (vButton)); break; case TypeEdge: ccsGetEdge (setting, &vEdge); WriteEdgeAtKey (plugin, key, VariantTypes (vEdge)); break; case TypeBell: ccsGetBell (setting, &vBool); WriteBellAtKey (plugin, key, VariantTypes (vBool ? true : false)); break; case TypeList: { CCSSettingValueList listCopy = NULL; ccsGetList (setting, &vList); listCopy = ccsCopyList (vList, setting); WriteListAtKey (plugin, key, VariantTypes (boost::make_shared (listCopy, cci::Deep, ccsSettingGetInfo (setting)->forList.listType, boost::shared_ptr (setting, boost::bind (doNothingWithCCSSetting, _1))))); break; } default: throw std::exception (); } } private: MockCCSSettingsTestEnvironment mMockCCSSettingTestEnvironment; CCSBackend *mBackend; CCSBackendGMock *mBackendGMock; CCSContext *mContext; std::vector mProfiles; }; INSTANTIATE_TEST_CASE_P (MockCCSBackendConcept, CCSBackendConformanceTestReadWrite, compizconfig::test::GenerateTestingParametersForBackendInterface ()); INSTANTIATE_TEST_CASE_P (MockCCSBackendConcept, CCSBackendConformanceTestInfo, compizconfig::test::GenerateTestingEnvFactoryBackendInterface ()); INSTANTIATE_TEST_CASE_P (MockCCSBackendConcept, CCSBackendConformanceTestInitFiniFuncs, compizconfig::test::GenerateTestingEnvFactoryBackendInterface ()); INSTANTIATE_TEST_CASE_P (MockCCSBackendConcept, CCSBackendConformanceTestProfileHandling, compizconfig::test::GenerateTestingEnvFactoryBackendInterface ()); compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/CMakeLists.txt0000644000015301777760000001377612321343002027257 0ustar pbusernogroup00000000000000include_directories (${GTEST_INCLUDE_DIRS}) include_directories (${CMAKE_SOURCE_DIR}/include) include_directories (${CMAKE_SOURCE_DIR}/tests/shared) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../mocks/libcompizconfig) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../src) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/tests) link_directories (${CMAKE_INSTALL_PREFIX}/lib) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../mocks/libcompizconfig) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../tests/) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../src/) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") add_definitions (-DSYSCONFDIR=\\\"${COMPIZ_SYSCONFDIR}\\\") add_executable (compizconfig_test_ccs_object ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_object.cpp) add_executable (compizconfig_test_ccs_context ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_context.cpp) add_executable (compizconfig_test_ccs_plugin ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_plugin.cpp) add_executable (compizconfig_test_ccs_setting ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_setting.cpp) add_executable (compizconfig_test_ccs_backend ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_backend.cpp) add_executable (compizconfig_test_ccs_text_file ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_text_file.cpp) add_executable (compizconfig_test_ccs_mock_backend_conformance ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_mock_backend_conformance.cpp) add_executable (compizconfig_test_ccs_util ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_util.cpp) add_executable (compizconfig_test_ccs_upgrade_internal ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_settings_upgrade_internal.cpp) if (HAVE_PROTOBUF) set (LIBCOMPIZCONFIG_LIBRARIES ${LIBCOMPIZCONFIG_LIBRARIES} protobuf) endif (HAVE_PROTOBUF) target_link_libraries (compizconfig_test_ccs_object ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig) target_link_libraries (compizconfig_test_ccs_context ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_plugin_mock compizconfig_ccs_setting_mock compizconfig_ccs_config_file_mock compizconfig_ccs_backend_loader_mock compizconfig_ccs_backend_mock) target_link_libraries (compizconfig_test_ccs_plugin ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_plugin_mock compizconfig_ccs_setting_mock) target_link_libraries (compizconfig_test_ccs_backend ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_plugin_mock compizconfig_ccs_setting_mock compizconfig_ccs_backend_mock) target_link_libraries (compizconfig_test_ccs_mock_backend_conformance ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_plugin_mock compizconfig_ccs_setting_mock compizconfig_ccs_backend_mock compizconfig_ccs_backend_conformance_test compizconfig_ccs_item_in_list_matcher compizconfig_ccs_list_equality compizconfig_ccs_list_wrapper compizconfig_ccs_setting_value_operators compizconfig_ccs_test_value_combinations) target_link_libraries (compizconfig_test_ccs_setting ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_plugin_mock compizconfig_ccs_setting_mock compizconfig_ccs_list_wrapper) target_link_libraries (compizconfig_test_ccs_text_file ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} ccs_text_file_interface compizconfig_ccs_text_file_mock compizconfig) target_link_libraries (compizconfig_test_ccs_upgrade_internal ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ccs_settings_upgrade_internal compizconfig compizconfig_ccs_context_mock compizconfig_ccs_plugin_mock compizconfig_ccs_setting_mock compizconfig_ccs_item_in_list_matcher compizconfig_ccs_setting_value_matcher ) target_link_libraries (compizconfig_test_ccs_util ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig ) compiz_discover_tests (compizconfig_test_ccs_object COVERAGE compizconfig) compiz_discover_tests (compizconfig_test_ccs_context COVERAGE compizconfig_ccs_context_mock) compiz_discover_tests (compizconfig_test_ccs_plugin COVERAGE compizconfig_ccs_plugin_mock) compiz_discover_tests (compizconfig_test_ccs_setting COVERAGE compizconfig_ccs_setting_mock) compiz_discover_tests (compizconfig_test_ccs_mock_backend_conformance COVERAGE compizconfig_ccs_backend_mock) compiz_discover_tests (compizconfig_test_ccs_text_file COVERAGE ccs_text_file_interface compizconfig_ccs_text_file_mock) compiz_discover_tests (compizconfig_test_ccs_upgrade_internal COVERAGE ccs_settings_upgrade_internal) compiz_discover_tests (compizconfig_test_ccs_util COVERAGE compizconfig) compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_object.cpp0000644000015301777760000002317012321343002033114 0ustar pbusernogroup00000000000000#include #include #include #include #include #include #include using ::testing::_; using ::testing::Return; using ::testing::StrictMock; using ::testing::Invoke; class GoogleMockDummy; class CCSObjectTest : public ::testing::Test { }; struct TestingObjectWrapper { CCSObject object; }; typedef void (*dummyFunc) (GoogleMockDummy *); struct DummyInterface { dummyFunc dummy; }; struct Dummy2Interface { dummyFunc dummy; }; class GoogleMockDummyInterface { public: virtual ~GoogleMockDummyInterface () {}; virtual void dummyFunc () = 0; virtual void freeTestingObjectWrapper (TestingObjectWrapper *) = 0; }; class GoogleMockDummy : public GoogleMockDummyInterface { public: MOCK_METHOD0 (dummyFunc, void ()); MOCK_METHOD1 (freeTestingObjectWrapper, void (TestingObjectWrapper *)); public: static void thunkDummyFunc (GoogleMockDummy *mock); }; void GoogleMockDummy::thunkDummyFunc (GoogleMockDummy *mock) { mock->dummyFunc (); } const struct DummyInterface SomeDummyInterface = { GoogleMockDummy::thunkDummyFunc }; #define CCS_INTERFACE_TYPE_DUMMY GET_INTERFACE_TYPE (DummyInterface) #define CCS_INTERFACE_TYPE_DUMMY2 GET_INTERFACE_TYPE (Dummy2Interface) INTERFACE_TYPE (DummyInterface) INTERFACE_TYPE (Dummy2Interface) TEST(CCSObjectTest, TestTypeAllocation) { unsigned int i = CCS_INTERFACE_TYPE_DUMMY; unsigned int j = CCS_INTERFACE_TYPE_DUMMY; unsigned int k = CCS_INTERFACE_TYPE_DUMMY2; EXPECT_EQ (i, 1); EXPECT_EQ (j ,1); EXPECT_EQ (k, 2); } TEST(CCSObjectTest, InterfaceAdd) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 1); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 1); EXPECT_EQ (*((CCSObject *) to)->interface_types, 1); ccsObjectFinalize (to); free (to); } TEST(CCSObjectTest, GetInterface) { TestingObjectWrapper *to = reinterpret_cast (calloc (1, sizeof (TestingObjectWrapper))); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, reinterpret_cast (&SomeDummyInterface), CCS_INTERFACE_TYPE_DUMMY); DummyInterface *interface = GET_INTERFACE (DummyInterface, to); EXPECT_EQ (interface, &SomeDummyInterface); ccsObjectRemoveInterface (to, CCS_INTERFACE_TYPE_DUMMY); free (to); } TEST(CCSObjectDeathTest, GetInterface) { TestingObjectWrapper *to = reinterpret_cast (calloc (1, sizeof (TestingObjectWrapper))); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, reinterpret_cast (&SomeDummyInterface), CCS_INTERFACE_TYPE_DUMMY); Dummy2Interface *i = NULL; ASSERT_DEATH ({ i = GET_INTERFACE (Dummy2Interface, to); }, "Unable to find interface type*"); EXPECT_EQ (NULL, i); // Avoid warnings/errors about i being unused. ccsObjectRemoveInterface (to, CCS_INTERFACE_TYPE_DUMMY); free (to); } TEST(CCSObjectTest, InterfaceRemove) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 1); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 1); EXPECT_EQ (*((CCSObject *) to)->interface_types, 1); ccsObjectRemoveInterface (to, 1); EXPECT_EQ (NULL, ((CCSObject *) to)->interfaces); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 0); EXPECT_EQ (NULL, ((CCSObject *) to)->interface_types); free (to); } TEST(CCSObjectTest, InterfaceFetchCall) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 1); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 1); EXPECT_EQ (*((CCSObject *) to)->interface_types, 1); const DummyInterface *myDummyInterface = (const DummyInterface *) ccsObjectGetInterface (to, 1); GoogleMockDummy mockDummy; EXPECT_CALL (mockDummy, dummyFunc ()); (*myDummyInterface->dummy) (&mockDummy); ccsObjectRemoveInterface (to, 1); EXPECT_EQ (NULL, ((CCSObject *) to)->interfaces); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 0); EXPECT_EQ (NULL, ((CCSObject *) to)->interface_types); free (to); } TEST(CCSObjectTest, SetPrivateGetPrivate) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); int i = 1; ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectSetPrivate (to, (CCSPrivate *) &i); CCSPrivate *p = ccsObjectGetPrivate (to); EXPECT_EQ (&i, (int *) p); EXPECT_EQ (i, (*((int *) p))); free (to); } void ccsFreeTestingObjectWrapper (TestingObjectWrapper *wrapper) { GoogleMockDummy *dummy = reinterpret_cast (reinterpret_cast (ccsObjectGetPrivate (wrapper))); dummy->freeTestingObjectWrapper (wrapper); } #define CCSREF_OBJ(type,dtype) \ void ccs##type##Ref (dtype *d) \ { \ ccsObjectRef (d); \ } \ \ void ccs##type##Unref (dtype *d) \ { \ ccsObjectUnref (d, ccsFree##type); \ } \ CCSREF_HDR(TestingObjectWrapper, TestingObjectWrapper); CCSREF_OBJ(TestingObjectWrapper, TestingObjectWrapper); TEST(CCSObjectTest, TestRefUnrefFreesObject) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); GoogleMockDummy dummy; ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectSetPrivate (to, reinterpret_cast (&dummy)); ccsTestingObjectWrapperRef (to); EXPECT_CALL (dummy, freeTestingObjectWrapper (to)); ccsTestingObjectWrapperUnref (to); free (to); } TEST(CCSObjectTest, TestFinalizeFreesEverything) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 1); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 1); EXPECT_EQ (*((CCSObject *) to)->interface_types, 1); int *i = (int *) malloc (sizeof (int)); *i = 1; ccsObjectSetPrivate (to, (CCSPrivate *) i); CCSPrivate *p = ccsObjectGetPrivate (to); EXPECT_EQ (i, (int *) p); EXPECT_EQ (*i, (*((int *) p))); ccsObjectFinalize (to); EXPECT_EQ (NULL, ((CCSObject *) to)->priv); EXPECT_EQ (NULL, ((CCSObject *) to)->interfaces); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 0); EXPECT_EQ (NULL, ((CCSObject *) to)->interface_types); free (to); } TEST(CCSObjectTest, TestReallocFailures) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); StrictMock objectAllocationGMock; FailingObjectReallocation fakeFailingAllocator (1); CCSObjectAllocationInterface failingAllocatorGMock = failingAllocator; failingAllocatorGMock.allocator = static_cast (&objectAllocationGMock); ccsObjectInit (to, &failingAllocatorGMock); EXPECT_CALL (objectAllocationGMock, realloc_ (_, _)) .WillOnce (Invoke (&fakeFailingAllocator, &FailingObjectReallocation::realloc_)) .WillOnce (Invoke (&fakeFailingAllocator, &FailingObjectReallocation::realloc_)); EXPECT_CALL (objectAllocationGMock, free_ (_)) .WillOnce (Invoke (&fakeFailingAllocator, &FailingObjectReallocation::free_)); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 1); EXPECT_EQ (NULL, ((CCSObject *) to)->interfaces); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 0); EXPECT_EQ (NULL, ((CCSObject *) to)->interface_types); free (to); } TEST(CCSObjectTest, TestAllocatedMemoryOnRemove) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 1); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 1); EXPECT_EQ (*((CCSObject *) to)->interface_types, 1); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 2); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 2); EXPECT_EQ (*((CCSObject *) to)->interface_types, 1); ccsObjectRemoveInterface (to, 1); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 1); EXPECT_EQ (((CCSObject *) to)->n_allocated_interfaces, 2); EXPECT_EQ (*((CCSObject *) to)->interface_types, 2); ccsObjectRemoveInterface (to, 2); EXPECT_EQ (NULL, ((CCSObject *) to)->interfaces); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 0); EXPECT_EQ (((CCSObject *) to)->n_allocated_interfaces, 0); EXPECT_EQ (NULL, ((CCSObject *) to)->interface_types); free (to); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_backend.cpp0000644000015301777760000000317212321343002033235 0ustar pbusernogroup00000000000000#include #include #include #include "compizconfig_ccs_backend_mock.h" using ::testing::_; using ::testing::ReturnNull; class CCSBackendTest : public ::testing::Test { }; TEST(CCSBackendTest, TestMock) { CCSBackend *backend = ccsMockBackendNew (); CCSBackendGMock *mock = (CCSBackendGMock *) ccsObjectGetPrivate (backend); EXPECT_CALL (*mock, getInfo ()); EXPECT_CALL (*mock, executeEvents (_)); EXPECT_CALL (*mock, init (_)); EXPECT_CALL (*mock, fini ()); EXPECT_CALL (*mock, readInit (_)); EXPECT_CALL (*mock, readSetting (_,_)); EXPECT_CALL (*mock, readDone (_)); EXPECT_CALL (*mock, writeInit (_)); EXPECT_CALL (*mock, writeSetting (_, _)); EXPECT_CALL (*mock, writeDone (_)); EXPECT_CALL (*mock, getSettingIsIntegrated (_)); EXPECT_CALL (*mock, getSettingIsReadOnly (_)); EXPECT_CALL (*mock, getExistingProfiles (_)).WillRepeatedly (ReturnNull ()); EXPECT_CALL (*mock, deleteProfile (_, _)); ccsBackendGetInfo (backend); ccsBackendExecuteEvents (backend, 0); ccsBackendInit (backend, NULL); ccsBackendFini (backend); ccsBackendReadInit (backend, NULL); ccsBackendReadSetting (backend, NULL, NULL); ccsBackendReadDone (backend, NULL); ccsBackendWriteInit (backend, NULL); ccsBackendWriteSetting (backend, NULL, NULL); ccsBackendWriteDone (backend, NULL); ccsBackendGetSettingIsIntegrated (backend, NULL); ccsBackendGetSettingIsReadOnly (backend, NULL); ccsBackendGetExistingProfiles (backend, NULL); ccsBackendDeleteProfile (backend, NULL, NULL); ccsFreeMockBackend (backend); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/LICENSE.gpl0000644000015301777760000004310312321343002025126 0ustar pbusernogroup00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/LICENSE.lgpl0000644000015301777760000006350412321343002025311 0ustar pbusernogroup00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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 with this License. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/config/0000755000015301777760000000000012321344021024606 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/config/config0000644000015301777760000000045112321343002025774 0ustar pbusernogroup00000000000000[kde4_session] backend = kconfig4 integration = true plugin_list_autosort = true [kde_session] backend = kconfig integration = true plugin_list_autosort = true [gnome_session] backend = gconf integration = true plugin_list_autosort = true [general] backend = ini plugin_list_autosort = true compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/config/CMakeLists.txt0000644000015301777760000000076512321343002027354 0ustar pbusernogroup00000000000000set (_config_file config) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/config_test ${CMAKE_CURRENT_BINARY_DIR}/compiz-1/compizconfig/config) compiz_opt_install_file (${CMAKE_CURRENT_SOURCE_DIR}/${_config_file} ${COMPIZ_SYSCONFDIR}/compizconfig/${_config_file}) add_custom_target ( config_install ${CMAKE_COMMAND} -E make_directory ${CMAKE_ROOT}/Modules && ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/config/${_config_file} ${COMPIZ_SYSCONFDIR}/compizconfig/${_config_file} ) compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/config/config_test0000644000015301777760000000006412321343002027033 0ustar pbusernogroup00000000000000[general] backend = ini plugin_list_autosort = true compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/config.h.in0000644000015301777760000000022612321343002025362 0ustar pbusernogroup00000000000000#define PACKAGE_STRING "@_libcompizconfig_package_string@" #define PACKAGE "@_libcompizconfig_package@" #define GETTEXT_PACKAGE "@GETTEXT_PACKAGE@" compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/INSTALL0000644000015301777760000000052012321343002024365 0ustar pbusernogroup00000000000000libcompizconfig uses out-of-tree builds with cmake, in order to generate the Makefiles for compiz use: $ mkdir build $ cd build $ cmake .. After that, standard build procedures apply: $ make # make install In order to build other backends, you will need to install the compizconfig cmake set # make findcompizconfig_install compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/TODO0000644000015301777760000000033112321343002024024 0ustar pbusernogroup00000000000000 - write a simple ini file implementation to read/write general options without glib (maybe for inport/export of setting too) - python bindings (and beryl-settings then) - port ini, gconf backend - settings plugin compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/CMakeLists.txt0000644000015301777760000000730312321343002026102 0ustar pbusernogroup00000000000000project (libcompizconfig) set (COMPIZ_CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${COMPIZ_CMAKE_MODULE_PATH}) include (CompizDefaults) include (CompizCommon) include (CompizPackage) include (CheckLibraryExists) include (CheckIncludeFile) set (CMAKE_MODULE_PATH_ORIG ${CMAKE_MODULE_PATH}) set (LIBCOMPIZCONFIG_CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LIBCOMPIZCONFIG_CMAKE_MODULE_PATH}) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) set (ALL_LINGUAS af ar bg bn bn_IN bs ca cs cy da de el en_GB en_US es eu et fi fr gl gu he hi hr hu id it ja ka km ko lo lt mk mr nb nl or pa pl pt pt_BR ro ru sk sl sr sv ta tr uk vi xh zh_CN zh_TW zu) set (GETTEXT_PACKAGE libcompizconfig) file (READ ${CMAKE_SOURCE_DIR}/VERSION COMPIZ_RELEASE_VERSION LIMIT 12 OFFSET 0) string (STRIP ${COMPIZ_RELEASE_VERSION} COMPIZ_RELEASE_VERSION) set (VERSION ${COMPIZ_RELEASE_VERSION}) configure_file ( "${CMAKE_CURRENT_SOURCE_DIR}/config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/config.h" ) include_directories ( "include" ) set (COMPIZ_SYSCONFDIR "/etc" CACHE PATH "/etc") option (USE_PROTOBUF "Use Google Protocol Buffers library for faster XML loading" ON ) set (PROTOC_ERROR_MESSAGE "\nWARNING: You need to install Protocol Buffers to get faster program startup.\n" "Sources are available at http://code.google.com/p/protobuf/downloads/list\n" "Package names for Ubuntu/Debian: libprotobuf0, libprotobuf-dev, protobuf-compiler\n" "Package names for other distributions: protobuf, protobuf-devel\n" "Disabling protobuf.\n" ) set (LIBCOMPIZCONFIG_PROTOBUF protobuf) if (USE_PROTOBUF) find_program (HAVE_PROTOC protoc) if (HAVE_PROTOC) if (USE_PROTOBUF) pkg_check_modules (PROTOBUF protobuf) if (PROTOBUF_FOUND) else () message (${PROTOC_ERROR_MESSAGE}) set (USE_PROTOBUF false ) endif (PROTOBUF_FOUND) endif (USE_PROTOBUF) else () message (${PROTOC_ERROR_MESSAGE}) set (USE_PROTOBUF false ) endif (HAVE_PROTOC) endif (USE_PROTOBUF) if (USE_PROTOBUF) set (HAVE_PROTOBUF TRUE) endif (USE_PROTOBUF) check_include_file ("sys/inotify.h" HAVE_INOTIFY) set (INOTIFY_WARNING_MESSAGE "NOTE\n ======\n Inotify header files not found. While this library might work \n without them, user experience is degraded as settings won't be\n applied instantly. We strongly suggest installing the inotify\n header files.\n") if (HAVE_INOTIFY) else () message (${INOTIFY_WARNING_MESSAGE}) endif (HAVE_INOTIFY) set (COMPIZCONFIG_LIBDIR ${libdir}) set (LIBCOMPIZCONFIG_REQUIRES x11 libxml-2.0 libxslt ) if (HAVE_PROTOBUF) set (LIBCOMPIZCONFIG_REQUIRES ${LIBCOMPIZCONFIG_REQUIRES} protobuf) endif () compiz_pkg_check_modules (LIBCOMPIZCONFIG REQUIRED ${LIBCOMPIZCONFIG_REQUIRES}) list (APPEND LIBCOMPIZCONFIG_LIBRARIES ${COMPIZ_LIBRARIES}) list (APPEND LIBCOMPIZCONFIG_LIBRARY_DIRS ${COMPIZ_LIBRARY_DIRS}) list (APPEND LIBCOMPIZCONFIG_INCLUDE_DIRS ${COMPIZ_INCLUDE_DIRS}) compiz_configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/libcompizconfig.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libcompizconfig.pc ) compiz_configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/libcompizconfig_internal.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libcompizconfig_internal.pc ) install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/libcompizconfig.pc DESTINATION ${libdir}/pkgconfig ) add_subdirectory (config) add_subdirectory (backend) add_subdirectory (src) add_subdirectory (include) add_subdirectory (cmake) if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/COPYING0000644000015301777760000004312212321343002024374 0ustar pbusernogroup00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/0000755000015301777760000000000012321344021024130 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/config.c0000644000015301777760000000346112321343002025543 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define _GNU_SOURCE #include #include #include #include #include "ccs-config-private.h" char * getSectionName (void) { const char *profile; char *section; profile = getenv ("COMPIZ_CONFIG_PROFILE"); if (profile) { if (strlen (profile)) { if (asprintf (§ion, "general_%s", profile) == -1) section = NULL; } else { section = strdup ("general"); } return section; } profile = getenv ("GNOME_DESKTOP_SESSION_ID"); if (profile && strlen (profile)) return strdup ("gnome_session"); profile = getenv ("KDE_SESSION_VERSION"); if (profile && strlen (profile) && strcasecmp (profile, "4") == 0) return strdup ("kde4_session"); profile = getenv ("KDE_FULL_SESSION"); if (profile && strlen (profile) && strcasecmp (profile, "true") == 0) return strdup ("kde_session"); return strdup ("general"); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs-private.h0000644000015301777760000001341212321343002026520 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CCS_PRIVATE_H #define CSS_PRIVATE_H #include COMPIZCONFIG_BEGIN_DECLS #include #include extern Bool basicMetadata; typedef struct _CCSContextPrivate { /* Some helper function pointers that can be replaced * in a test scenario */ CCSContextImportFromFile importFromFile; CCSScanForProfilesProc scanForProfiles; CCSBackendLoader *backendLoader; CCSDynamicBackend *backend; CCSPluginList plugins; /* list of plugins settings were loaded for */ CCSPluginCategory *categories; /* list of plugin categories */ void *privatePtr; /* private pointer that can be used by the caller */ char *profile; Bool deIntegration; Bool pluginListAutoSort; CCSConfigFile *configFile; CCSSettingList changedSettings; /* list of settings changed since last settings write */ unsigned int screenNum; /* screen number this context is assigned to */ const CCSInterfaceTable *object_interfaces; } CCSContextPrivate; typedef struct _CCSPluginPrivate { char *name; /* plugin name */ char *shortDesc; /* plugin short description */ char *longDesc; /* plugin long description */ char *hints; /* currently unused */ char *category; /* plugin category name */ CCSStringList loadAfter; /* list of plugin names this plugin needs to be loaded after */ CCSStringList loadBefore; /* list of plugin names this plugin needs to be loaded before */ CCSStringList requiresPlugin; /* list of plugin names this plugin requires */ CCSStringList conflictPlugin; /* list of plugin names this plugin conflicts with */ CCSStringList conflictFeature; /* list of feature names this plugin conflicts with */ CCSStringList providesFeature; /* list of feature names this plugin provides */ CCSStringList requiresFeature; /* list of feature names this plugin requires */ void *privatePtr; /* private pointer that can be used by the caller */ CCSContext *context; /* context this plugin belongs to */ CCSSettingList settings; CCSGroupList groups; Bool loaded; Bool active; char * xmlFile; char * xmlPath; #ifdef USE_PROTOBUF char * pbFilePath; #endif CCSStrExtensionList stringExtensions; } CCSPluginPrivate; typedef struct _CCSSettingPrivate { char *name; /* setting name */ char *shortDesc; /* setting short description in current locale */ char *longDesc; /* setting long description in current locale */ CCSSettingType type; /* setting type */ CCSSettingInfo info; /* information assigned to this setting, valid if the setting is an int, float, string or list setting */ char *group; /* group name in current locale */ char *subGroup; /* sub group name in current locale */ char *hints; /* hints in current locale */ CCSSettingValue defaultValue; /* default value of this setting */ CCSSettingValue *value; /* actual value of this setting */ Bool isDefault; /* does the actual value match the default value? */ CCSPlugin *parent; /* plugin this setting belongs to */ void *privatePtr; /* private pointer for usage by the caller */ } CCSSettingPrivate; typedef struct _CCSDynamicBackendPrivate { void *dlhand; CCSBackend *backend; } CCSDynamicBackendPrivate; typedef struct _CCSSettingsUpgrade { char *profile; char *file; char *domain; unsigned int num; CCSSettingList changedSettings; CCSSettingList addValueSettings; CCSSettingList clearValueSettings; CCSSettingList replaceFromValueSettings; CCSSettingList replaceToValueSettings; } CCSSettingsUpgrade; Bool ccsCheckForSettingsUpgrade (CCSContext *context); void ccsLoadPlugins (CCSContext * context); void ccsLoadPluginSettings (CCSPlugin * plugin); void collateGroups (CCSPluginPrivate * p); Bool ccsLoadPluginDefault (CCSContext *context, char *name); void ccsLoadPluginsDefault (CCSContext *context); void ccsCheckFileWatches (void); void ccsAddKeybindingMaskToString (char **bindingString, unsigned int matchBindingMask, unsigned int *addedBindingMask, unsigned int addBindingMask, const char *addBindingString); void ccsAddStringToKeybindingMask (unsigned int *bindingMask, const char *bindingString, unsigned int addBindingMask, const char *addBindingString); extern const CCSContextInterface ccsDefaultContextInterface; COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_backend_loader.c0000644000015301777760000001364312321343002030046 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * ccs_backend_loader.c * * Copyright (C) 2013 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #include #include #include #include #include typedef struct _CCSShraedLibBackendLoaderPrivate CCSShraedLibBackendLoaderPrivate; struct _CCSShraedLibBackendLoaderPrivate { }; static void * openBackend (const char *backend) { const char *home = getenv ("HOME"); const char *override_backend = getenv ("LIBCOMPIZCONFIG_BACKEND_PATH"); void *dlhand = NULL; char *dlname = NULL; char *err = NULL; if (override_backend && strlen (override_backend)) { if (asprintf (&dlname, "%s/lib%s.so", override_backend, backend) == -1) dlname = NULL; dlerror (); dlhand = dlopen (dlname, RTLD_NOW | RTLD_NODELETE | RTLD_LOCAL); err = dlerror (); } if (!dlhand && home && strlen (home)) { if (dlname) free (dlname); if (asprintf (&dlname, "%s/.compizconfig/backends/lib%s.so", home, backend) == -1) dlname = NULL; dlerror (); dlhand = dlopen (dlname, RTLD_NOW | RTLD_NODELETE | RTLD_LOCAL); err = dlerror (); } if (!dlhand) { if (dlname) free (dlname); if (asprintf (&dlname, "%s/compizconfig/backends/lib%s.so", LIBDIR, backend) == -1) dlname = NULL; dlhand = dlopen (dlname, RTLD_NOW | RTLD_NODELETE | RTLD_LOCAL); err = dlerror (); } free (dlname); if (err) { ccsError ("dlopen: %s", err); } return dlhand; } static CCSDynamicBackend * ccsDynamicBackendWrapLoadedBackend (const CCSInterfaceTable *interfaces, CCSBackend *backend, void *dlhand) { CCSDynamicBackend *dynamicBackend = calloc (1, sizeof (CCSDynamicBackend)); CCSDynamicBackendPrivate *dbPrivate = NULL; if (!dynamicBackend) return NULL; ccsObjectInit (dynamicBackend, &ccsDefaultObjectAllocator); ccsDynamicBackendRef (dynamicBackend); dbPrivate = calloc (1, sizeof (CCSDynamicBackendPrivate)); if (!dbPrivate) { ccsDynamicBackendUnref (dynamicBackend); return NULL; } dbPrivate->dlhand = dlhand; dbPrivate->backend = backend; ccsObjectSetPrivate (dynamicBackend, (CCSPrivate *) dbPrivate); ccsObjectAddInterface (dynamicBackend, (CCSInterface *) interfaces->dynamicBackendWrapperInterface, GET_INTERFACE_TYPE (CCSBackendInterface)); ccsObjectAddInterface (dynamicBackend, (CCSInterface *) interfaces->dynamicBackendInterface, GET_INTERFACE_TYPE (CCSDynamicBackendInterface)); return dynamicBackend; } static CCSBackend * ccsSharedLibBackendLoaderLoadBackend (CCSBackendLoader *loader, const CCSInterfaceTable *interfaces, CCSContext *context, const char *name) { CCSBackendInterface *vt; void *dlhand = openBackend (name); if (!dlhand) return NULL; BackendGetInfoProc getInfo = dlsym (dlhand, "getBackendInfo"); if (!getInfo) { dlclose (dlhand); return NULL; } vt = getInfo (); if (!vt) { dlclose (dlhand); return NULL; } CCSBackend *backend = ccsBackendNewWithDynamicInterface (context, vt); if (!backend) { dlclose (dlhand); return NULL; } CCSDynamicBackend *backendWrapper = ccsDynamicBackendWrapLoadedBackend (interfaces, backend, dlhand); if (!backendWrapper) { dlclose (dlhand); ccsBackendUnref (backend); return NULL; } return (CCSBackend *) backendWrapper; } static void freeAndFinalizeLoader (CCSBackendLoader *loader, CCSObjectAllocationInterface *ai) { ccsObjectFinalize (loader); (*ai->free_) (ai->allocator, loader); } static void ccsSharedLibBackendLoaderFree (CCSBackendLoader *loader) { freeAndFinalizeLoader (loader, loader->object.object_allocation); } const CCSBackendLoaderInterface ccsSharedLibBackendLoaderInterface = { ccsSharedLibBackendLoaderLoadBackend, ccsSharedLibBackendLoaderFree }; static CCSBackendLoader * allocateLoader (CCSObjectAllocationInterface *ai) { CCSBackendLoader *loader = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSBackendLoader)); if (!loader) return NULL; ccsObjectInit (loader, ai); return loader; } static CCSShraedLibBackendLoaderPrivate * allocatePrivate (CCSBackendLoader *loader, CCSObjectAllocationInterface *ai) { CCSShraedLibBackendLoaderPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSShraedLibBackendLoaderPrivate)); if (!priv) { freeAndFinalizeLoader (loader, ai); return NULL; } return priv; } CCSBackendLoader * ccsSharedLibBackendLoaderNew (CCSObjectAllocationInterface *ai) { CCSBackendLoader *loader = allocateLoader (ai); if (!loader) return NULL; CCSShraedLibBackendLoaderPrivate *priv = allocatePrivate (loader, ai); if (!priv) return NULL; ccsObjectSetPrivate (loader, (CCSPrivate *) (priv)); ccsObjectAddInterface (loader, (const CCSInterface *) &ccsSharedLibBackendLoaderInterface, GET_INTERFACE_TYPE (CCSBackendLoaderInterface)); ccsObjectRef (loader); return loader; } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_text_file_interface.c0000644000015301777760000000276612321343002031140 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * ccs_text_file_interface.c * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include INTERFACE_TYPE (CCSTextFileInterface); CCSREF_OBJ (TextFile, CCSTextFile); char * ccsTextFileReadFromStart (CCSTextFile *file) { return (*(GET_INTERFACE (CCSTextFileInterface, file))->readFromStart) (file); } Bool ccsTextFileAppendString (CCSTextFile *file, const char *str) { return (*(GET_INTERFACE (CCSTextFileInterface, file))->appendString) (file, str); } void ccsFreeTextFile (CCSTextFile *file) { return (*(GET_INTERFACE (CCSTextFileInterface, file))->free) (file); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_settings_upgrade_internal.h0000644000015301777760000000276112321343002032400 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_SETTINGS_UPGRADE_INTERNAL_H #define _COMPIZCONFIG_CCS_SETTINGS_UPGRADE_INTERNAL_H #include #include COMPIZCONFIG_BEGIN_DECLS Bool ccsUpgradeGetDomainNumAndProfile (const char *name, char **domain, unsigned int *num, char **profile); int ccsUpgradeNameFilter (const char *name); void ccsUpgradeClearValues (CCSSettingList clearSettings); void ccsUpgradeAddValues (CCSSettingList addSettings); void ccsUpgradeReplaceValues (CCSSettingList replaceFromValueSettings, CCSSettingList replaceToValueSettings); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_config_file.c0000644000015301777760000001752612321343002027401 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * ccs_config_file.c * * Copyright (C) 2013 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #include #include #include #include #define SETTINGPATH "compiz-1/compizconfig" typedef struct _CCSIniConfigFilePrivate CCSIniConfigFilePrivate; struct _CCSIniConfigFilePrivate { int configWatch; }; static char* getConfigFileName (void) { char *configDir = NULL; char *fileName = NULL; configDir = getenv ("XDG_CONFIG_HOME"); if (configDir && strlen (configDir)) { if (asprintf (&fileName, "%s/%s/config", configDir, SETTINGPATH) == -1) fileName = NULL; return fileName; } configDir = getenv ("HOME"); if (configDir && strlen (configDir)) { if (asprintf (&fileName, "%s/.config/%s/config", configDir, SETTINGPATH) == -1) fileName = NULL; return fileName; } return NULL; } static IniDictionary* getConfigFile (void) { char *fileName; IniDictionary *iniFile; fileName = getConfigFileName(); if (!fileName) return NULL; iniFile = ccsIniOpen (fileName); free (fileName); return iniFile; } static Bool ccsReadGlobalConfig (ConfigOption option, char **value) { IniDictionary *iniFile; char *entry = NULL; char *section; Bool ret; FILE *fp; /* check if the global config file exists - if it doesn't, exit to avoid it being created by ccsIniOpen */ fp = fopen (SYSCONFDIR "/compizconfig/config", "r"); if (!fp) return FALSE; fclose (fp); iniFile = ccsIniOpen (SYSCONFDIR "/compizconfig/config"); if (!iniFile) return FALSE; switch (option) { case OptionProfile: entry = "profile"; break; case OptionBackend: entry = "backend"; break; case OptionIntegration: entry = "integration"; break; case OptionAutoSort: entry = "plugin_list_autosort"; break; default: break; } if (!entry) { ccsIniClose (iniFile); return FALSE; } *value = NULL; section = getSectionName(); ret = ccsIniGetString (iniFile, section, entry, value); free (section); ccsIniClose (iniFile); return ret; } static Bool ccsIniConfigFileReadConfigOption (CCSConfigFile *config, ConfigOption option, char **value) { IniDictionary *iniFile; char *entry = NULL; char *section; Bool ret; iniFile = getConfigFile(); if (!iniFile) return ccsReadGlobalConfig (option, value); switch (option) { case OptionProfile: entry = "profile"; break; case OptionBackend: entry = "backend"; break; case OptionIntegration: entry = "integration"; break; case OptionAutoSort: entry = "plugin_list_autosort"; break; default: break; } if (!entry) { ccsIniClose (iniFile); return FALSE; } *value = NULL; section = getSectionName(); ret = ccsIniGetString (iniFile, section, entry, value); free (section); ccsIniClose (iniFile); if (!ret) ret = ccsReadGlobalConfig (option, value); return ret; } static Bool ccsIniConfigFileWriteConfigOption (CCSConfigFile *config, ConfigOption option, const char *value) { CCSIniConfigFilePrivate *priv = GET_PRIVATE (CCSIniConfigFilePrivate, config); IniDictionary *iniFile; char *entry = NULL; char *section = NULL; char *fileName = NULL; char *curVal = NULL; Bool changed = TRUE; ccsDisableFileWatch (priv->configWatch); /* don't change config if nothing changed */ if (ccsIniConfigFileReadConfigOption (config, option, &curVal)) { changed = (strcmp (value, curVal) != 0); if (curVal) free (curVal); } if (!changed) { ccsEnableFileWatch (priv->configWatch); return TRUE; } iniFile = getConfigFile(); if (!iniFile) { ccsEnableFileWatch (priv->configWatch); return FALSE; } switch (option) { case OptionProfile: entry = "profile"; break; case OptionBackend: entry = "backend"; break; case OptionIntegration: entry = "integration"; break; case OptionAutoSort: entry = "plugin_list_autosort"; break; default: break; } if (!entry) { ccsIniClose (iniFile); ccsEnableFileWatch (priv->configWatch); return FALSE; } section = getSectionName(); ccsIniSetString (iniFile, section, entry, value); free (section); fileName = getConfigFileName(); if (!fileName) { ccsIniClose (iniFile); ccsEnableFileWatch (priv->configWatch); return FALSE; } ccsIniSave (iniFile, fileName); ccsIniClose (iniFile); free (fileName); ccsEnableFileWatch (priv->configWatch); return TRUE; } static void ccsSetIniConfigWatchCallback (CCSConfigFile *config, ConfigChangeCallbackProc callback, void *data) { CCSIniConfigFilePrivate *priv = GET_PRIVATE (CCSIniConfigFilePrivate, config); char *fileName; fileName = getConfigFileName(); if (!fileName) return; priv->configWatch = ccsAddFileWatch (fileName, TRUE, (FileWatchCallbackProc) callback, data); free (fileName); return; } static void freeAndFinalizeConfigFile (CCSConfigFile *config, CCSObjectAllocationInterface *ai) { CCSIniConfigFilePrivate *priv = GET_PRIVATE (CCSIniConfigFilePrivate, config); if (priv) { if (priv->configWatch) ccsRemoveFileWatch (priv->configWatch); } ccsObjectFinalize (config); (*ai->free_) (ai->allocator, config); } static void ccsIniConfigFileFree (CCSConfigFile *config) { freeAndFinalizeConfigFile (config, config->object.object_allocation); } const CCSConfigFileInterface ccsIniConfigFileInterface = { ccsIniConfigFileReadConfigOption, ccsIniConfigFileWriteConfigOption, ccsSetIniConfigWatchCallback, ccsIniConfigFileFree }; static CCSConfigFile * allocateConfigFile (CCSObjectAllocationInterface *ai) { CCSConfigFile *loader = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSConfigFile)); if (!loader) return NULL; ccsObjectInit (loader, ai); return loader; } static CCSIniConfigFilePrivate * allocatePrivate (CCSConfigFile *config, CCSObjectAllocationInterface *ai) { CCSIniConfigFilePrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIniConfigFilePrivate)); if (!priv) { freeAndFinalizeConfigFile (config, ai); return NULL; } return priv; } CCSConfigFile * ccsInternalConfigFileNew (CCSObjectAllocationInterface *ai) { CCSConfigFile *loader = allocateConfigFile (ai); if (!loader) return NULL; CCSIniConfigFilePrivate *priv = allocatePrivate (loader, ai); if (!priv) return NULL; priv->configWatch = -1; ccsObjectSetPrivate (loader, (CCSPrivate *) (priv)); ccsObjectAddInterface (loader, (const CCSInterface *) &ccsIniConfigFileInterface, GET_INTERFACE_TYPE (CCSConfigFileInterface)); ccsObjectRef (loader); return loader; } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_text_file_interface.h0000644000015301777760000000346012321343002031135 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * ccs_text_file_interface.h * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef CCS_TEXT_FILE_INTERFACE_H #define CCS_TEXT_FILE_INTERFACE_H #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSTextFile CCSTextFile; typedef struct _CCSTextFileInterface CCSTextFileInterface; typedef char * (*CCSReadTextFileFromStart) (CCSTextFile *file); typedef Bool (*CCSAppendStringToTextFile) (CCSTextFile *file, const char *str); typedef void (*CCSFreeTextFile) (CCSTextFile *file); struct _CCSTextFileInterface { CCSReadTextFileFromStart readFromStart; CCSAppendStringToTextFile appendString; CCSFreeTextFile free; }; struct _CCSTextFile { CCSObject object; }; CCSREF_HDR (TextFile, CCSTextFile); char * ccsTextFileReadFromStart (CCSTextFile *); Bool ccsTextFileAppendString (CCSTextFile *, const char *); void ccsFreeTextFile (CCSTextFile *); unsigned int ccsCCSTextFileInterfaceGetType (); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_backend_loader_interface.c0000644000015301777760000000303412321343002032057 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * ccs_backend_loader_interface.c * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include INTERFACE_TYPE (CCSBackendLoaderInterface); CCSREF_OBJ (BackendLoader, CCSBackendLoader); CCSBackend * ccsBackendLoaderLoadBackend (CCSBackendLoader *loader, const CCSInterfaceTable *interfaces, CCSContext *context, const char *name) { return (*(GET_INTERFACE (CCSBackendLoaderInterface, loader))->loadBackend) (loader, interfaces, context, name); } void ccsFreeBackendLoader (CCSBackendLoader *file) { return (*(GET_INTERFACE (CCSBackendLoaderInterface, file))->free) (file); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/bindings.c0000644000015301777760000002224612321343002026075 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* * Based on Compiz option.c * Copyright © 2005 Novell, Inc. * Author: David Reveman */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #define SCREEN_EDGE_LEFT (1 << 0) #define SCREEN_EDGE_RIGHT (1 << 1) #define SCREEN_EDGE_TOP (1 << 2) #define SCREEN_EDGE_BOTTOM (1 << 3) #define SCREEN_EDGE_TOPLEFT (1 << 4) #define SCREEN_EDGE_TOPRIGHT (1 << 5) #define SCREEN_EDGE_BOTTOMLEFT (1 << 6) #define SCREEN_EDGE_BOTTOMRIGHT (1 << 7) struct _Modifier modifierList[] = { { "", ShiftMask }, { "", ControlMask }, { "", ControlMask }, { "", Mod1Mask }, { "", Mod2Mask }, { "", Mod3Mask }, { "", Mod4Mask }, { "", Mod5Mask }, { "", CompAltMask }, { "", CompMetaMask }, { "", CompSuperMask }, { "", CompHyperMask }, { "", CompModeSwitchMask }, }; struct _Edge { char *name; char *modName; int modifier; } edgeList[] = { { "Left", "", SCREEN_EDGE_LEFT }, { "Right", "", SCREEN_EDGE_RIGHT }, { "Top", "", SCREEN_EDGE_TOP }, { "Bottom", "", SCREEN_EDGE_BOTTOM }, { "TopLeft", "", SCREEN_EDGE_TOPLEFT }, { "TopRight", "", SCREEN_EDGE_TOPRIGHT }, { "BottomLeft", "", SCREEN_EDGE_BOTTOMLEFT }, { "BottomRight", "", SCREEN_EDGE_BOTTOMRIGHT } }; #define N_EDGES (sizeof (edgeList) / sizeof (edgeList[0])) unsigned int ccsInternalUtilNumModifiers () { return sizeof (modifierList) / sizeof (struct _Modifier); } static char * stringAppend (char *s, const char *a) { char *r; int len; if (!a) return s; len = strlen (a); if (s) len += strlen (s); r = malloc (len + 1); if (r) { if (s) { sprintf (r, "%s%s", s, a); free (s); } else { sprintf (r, "%s", a); } s = r; } return s; } void ccsAddKeybindingMaskToString (char **bindingString, unsigned int matchBindingMask, unsigned int *addedBindingMask, unsigned int addBindingMask, const char *addBindingString) { if (addBindingMask & matchBindingMask && !(*addedBindingMask & addBindingMask)) { *bindingString = stringAppend (*bindingString, addBindingString); *addedBindingMask |= addBindingMask; } } void ccsAddStringToKeybindingMask (unsigned int *bindingMask, const char *bindingString, unsigned int addBindingMask, const char *addBindingString) { if (strcasestr (bindingString, addBindingString)) { *bindingMask |= addBindingMask; } } char * ccsModifiersToString (unsigned int modMask) { char *binding = NULL; unsigned int addedBindings = 0; int i; for (i = 0; i < ccsInternalUtilNumModifiers (); ++i) { ccsAddKeybindingMaskToString (&binding, modMask, &addedBindings, modifierList[i].modifier, modifierList[i].name); } return binding; } char * ccsEdgesToModString (unsigned int edgeMask) { char *binding = NULL; int i; for (i = 0; i < N_EDGES; ++i) { if (edgeMask & edgeList[i].modifier) binding = stringAppend (binding, edgeList[i].modName); } return binding; } char * ccsEdgesToString (unsigned int edgeMask) { char *binding = NULL; int i; for (i = 0; i < N_EDGES; ++i) { if (edgeMask & edgeList[i].modifier) { if (binding) binding = stringAppend (binding, "|"); binding = stringAppend (binding, edgeList[i].name); } } if (!binding) return strdup (""); return binding; } char * ccsKeyBindingToString (CCSSettingKeyValue *key) { char *binding; binding = ccsModifiersToString (key->keyModMask); if (key->keysym != NoSymbol) { char *keyname; keyname = XKeysymToString (key->keysym); if (keyname) { binding = stringAppend (binding, keyname); } } if (!binding) return strdup ("Disabled"); return binding; } char * ccsButtonBindingToString (CCSSettingButtonValue *button) { char *binding; char *edges; edges = ccsEdgesToModString (button->edgeMask); binding = stringAppend (edges, ccsModifiersToString (button->buttonModMask)); if (button->button) { char buttonStr[256]; snprintf (buttonStr, 256, "Button%d", button->button); binding = stringAppend (binding, buttonStr); } if (!binding) return strdup ("Disabled"); return binding; } unsigned int ccsStringToModifiers (const char *binding) { unsigned int mods = 0; int i; for (i = 0; i < ccsInternalUtilNumModifiers (); ++i) { ccsAddStringToKeybindingMask (&mods, binding, modifierList[i].modifier, modifierList[i].name); } return mods; } unsigned int ccsStringToEdges (const char *binding) { unsigned int edgeMask = 0; const char *needle; int i; for (i = 0; i < N_EDGES; ++i) { int edgeLen = strlen (edgeList[i].name); /* Look for all occurrences of edgeList[i].name in binding */ needle = binding; while ((needle = strstr (needle, edgeList[i].name)) != NULL) { if (needle != binding && isalnum (*(needle - 1))) { needle += edgeLen; continue; } needle += edgeLen; if (*needle && isalnum (*needle)) continue; edgeMask |= 1 << i; } } return edgeMask; } unsigned int ccsModStringToEdges (const char *binding) { unsigned int mods = 0; int i; for (i = 0; i < N_EDGES; ++i) { if (strcasestr (binding, edgeList[i].modName)) mods |= edgeList[i].modifier; } return mods; } Bool ccsStringToKeyBinding (const char *binding, CCSSettingKeyValue *value) { char *ptr; unsigned int mods; KeySym keysym; if (!binding || !strlen(binding) || strncasecmp (binding, "Disabled", strlen ("Disabled")) == 0) { value->keysym = 0; value->keyModMask = 0; return TRUE; } mods = ccsStringToModifiers (binding); ptr = strrchr (binding, '>'); if (ptr) binding = ptr + 1; while (*binding && !isalnum (*binding)) ++binding; if (!*binding) { if (mods) { value->keysym = 0; value->keyModMask = mods; return TRUE; } return FALSE; } keysym = XStringToKeysym (binding); if (keysym != NoSymbol) { value->keysym = keysym; value->keyModMask = mods; return TRUE; } return FALSE; } Bool ccsStringToButtonBinding (const char *binding, CCSSettingButtonValue *value) { char *ptr; unsigned int mods; unsigned int edges; if (!binding || !strlen(binding) || strncmp (binding, "Disabled", strlen ("Disabled")) == 0) { value->button = 0; value->buttonModMask = 0; value->edgeMask = 0; return TRUE; } mods = ccsStringToModifiers (binding); edges = ccsModStringToEdges (binding); ptr = strrchr (binding, '>'); if (ptr) binding = ptr + 1; while (*binding && !isalnum (*binding)) ++binding; if (strncmp (binding, "Button", strlen ("Button")) == 0) { int buttonNum; if (sscanf (binding + strlen ("Button"), "%d", &buttonNum) == 1) { value->button = buttonNum; value->buttonModMask = mods; value->edgeMask = edges; return TRUE; } } return FALSE; } Bool ccsStringToColor (const char *value, CCSSettingColorValue *color) { int c[4]; if (sscanf (value, "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4) { color->color.red = c[0] << 8 | c[0]; color->color.green = c[1] << 8 | c[1]; color->color.blue = c[2] << 8 | c[2]; color->color.alpha = c[3] << 8 | c[3]; return TRUE; } return FALSE; } char * ccsColorToString (CCSSettingColorValue *color) { char tmp[256]; snprintf (tmp, 256, "#%.2x%.2x%.2x%.2x", color->color.red >> 8, color->color.green >> 8, color->color.blue >> 8, color->color.alpha >> 8); return strdup (tmp); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/log.c0000644000015301777760000000437112321343002025060 0ustar pbusernogroup00000000000000/* * Logging, Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * Author: Daniel van Vugt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "ccs.h" /* * Only Info level or higher messages will be output by default. To see Debug * messages too, you must use: env CCS_LOG_LEVEL=Debug ... */ static CCSLogLevel minLevel = _ccsLogLevels; void ccsLog (const char *domain, CCSLogLevel level, const char *fmt, ...) { static const char * const levelName[_ccsLogLevels] = CCSLOGLEVEL_NAMES; if (minLevel == _ccsLogLevels) { const char *env = getenv ("CCS_LOG_LEVEL"); minLevel = ccsLogInfo; if (env != NULL) { int i = 0; while (i < _ccsLogLevels && strcmp (levelName[i], env)) ++i; if (i < _ccsLogLevels) minLevel = (CCSLogLevel)i; } } if (level >= minLevel && level < _ccsLogLevels) { FILE *file = (level >= ccsLogWarning) ? stderr : stdout; va_list va; va_start (va, fmt); /* I'm not a huge fan of this log format, but it matches compiz */ fprintf (file, "compizconfig%s%s%s%s: ", domain != NULL ? " (" : " ", domain != NULL ? domain : "", domain != NULL ? ") - " : "- ", levelName[level]); vfprintf (file, fmt, va); if (fmt[strlen(fmt)-1] != '\n') fprintf (file, "\n"); va_end (va); } } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs-config-private.h0000644000015301777760000000232112321343002027760 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef COMPIZCONFIG_CCS_CONFIG_PRIVATE_H #define COMPIZCONFIG_CCS_CONFIG_PRIVATE_H #include COMPIZCONFIG_BEGIN_DECLS char * getSectionName (void); typedef enum { OptionProfile, OptionBackend, OptionIntegration, OptionAutoSort } ConfigOption; COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/compizconfig.proto0000644000015301777760000000664112321343002027711 0ustar pbusernogroup00000000000000package metadata; option optimize_for = SPEED; message PluginInfo { required sint32 pb_abi_version = 1; required string locale = 2; required uint64 time = 3; // modification time of source .xml file // true if container is missing options and extensions, and only includes // plugin info required bool brief_metadata = 4; // true if container is missing extensions, string restrictions, and // short/long descriptions for the plugin and its options required bool basic_metadata = 5; required string name = 6; optional string short_desc = 7; optional string long_desc = 8; optional string category = 9; repeated string feature = 10; message Dependencies { repeated string after_plugin = 1; repeated string before_plugin = 2; repeated string require_plugin = 3; repeated string require_feature = 4; repeated string conflict_plugin = 5; repeated string conflict_feature = 6; } optional Dependencies deps = 11; } message PluginBrief { required PluginInfo info = 1; } message Plugin { required PluginInfo info = 1; message Option { enum Type // This needs to be in the same order as CCSSettingType. { BOOL = 0; INT = 1; FLOAT = 2; STRING = 3; COLOR = 4; ACTION = 5; KEY = 6; BUTTON = 7; EDGE = 8; BELL = 9; MATCH = 10; LIST = 11; } required string name = 1; required Type type = 2; optional Type list_type = 3; optional string short_desc = 4; optional string long_desc = 5; optional sint32 group_id = 6 [default = -1]; optional sint32 subgroup_id = 7 [default = -1]; optional bool read_only = 8; optional bool extensible = 9; optional sint32 sort_start = 10 [default = -1]; message ColorValue { optional string red = 1 [default = '0x0000']; optional string green = 2 [default = '0x0000']; optional string blue = 3 [default = '0x0000']; optional string alpha = 4 [default = '0xffff']; } message GenericValue { optional bool bool_value = 1; // for bool and bell types optional sint32 int_value = 2; optional float float_value = 3; optional ColorValue color_value = 4; optional uint32 edge_value = 5; // for all types other than bool/int/float/color/edge/bell optional string string_value = 6; } repeated GenericValue default_value = 11; // for int optional sint32 int_min = 12; optional sint32 int_max = 13; message IntDescription { required sint32 value = 1; required string name = 2; } repeated IntDescription int_desc = 14; // for float optional float float_min = 15; optional float float_max = 16; optional float precision = 17; message StringRestriction { required string value = 1; required string name = 2; } repeated StringRestriction str_restriction = 18; optional string hints = 19; optional bool passive_grab = 20; optional bool internal = 21; optional bool nodelay = 22; } message Extension { required string base_plugin = 1; repeated string base_option = 2; repeated Option.StringRestriction str_restriction = 3; } message Screen { repeated Option option = 1; repeated string group_desc = 2; repeated string subgroup_desc = 3; } optional Screen screen = 2; repeated Extension extension = 3; } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/lists.c0000644000015301777760000002657712321343002025451 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define _GNU_SOURCE #include #include #include #include #include "ccs-private.h" typedef void (*freeFunc) (void *ptr); #define CCSLIST(type,dtype,ocomp,compfunc) \ \ CCS##type##List ccs##type##ListAppend (CCS##type##List list, dtype *data) \ { \ CCS##type##List l = list; \ CCS##type##List ne = malloc(sizeof(struct _CCS##type##List)); \ if (!ne) \ return list; \ ne->data = data; \ ne->next = NULL; \ if (!list) \ return ne; \ while (l->next) l = l->next; \ l->next = ne; \ return list; \ } \ \ CCS##type##List ccs##type##ListPrepend (CCS##type##List list, dtype *data) \ { \ CCS##type##List ne = malloc(sizeof(struct _CCS##type##List)); \ if (!ne) \ return list; \ ne->data = data; \ ne->next = list; \ return ne; \ } \ \ CCS##type##List ccs##type##ListInsert (CCS##type##List list, dtype *data, int position) \ { \ CCS##type##List l = list; \ CCS##type##List ne = malloc(sizeof(struct _CCS##type##List)); \ if (!ne) \ return list; \ ne->data = data; \ ne->next = list; \ if (!list || !position) \ return ne; \ --position; \ while (l->next && position) \ { \ l = l->next; \ --position; \ } \ ne->next = l->next; \ l->next = ne; \ return list; \ } \ \ CCS##type##List ccs##type##ListInsertBefore (CCS##type##List list, CCS##type##List sibling, dtype *data) \ { \ CCS##type##List l = list; \ CCS##type##List ne = malloc(sizeof(struct _CCS##type##List)); \ if (!ne) \ return list; \ while (l && (l != sibling)) l = l->next; \ ne->data = data; \ ne->next = l; \ return ne; \ } \ \ unsigned int ccs##type##ListLength (CCS##type##List list) \ { \ unsigned int count = 0; \ CCS##type##List l = list; \ while (l) \ { \ l = l->next; \ ++count; \ } \ return count; \ } \ \ CCS##type##List ccs##type##ListFind (CCS##type##List list, dtype *data) \ { \ CCS##type##List l = list; \ while (l) \ { \ if (!data && !l->data) break; \ if ((ocomp)?(compfunc):(memcmp(l->data, data, sizeof(dtype)) == 0)) break; \ l = l->next; \ } \ return l; \ } \ \ CCS##type##List ccs##type##ListGetItem (CCS##type##List list, unsigned int index) \ { \ CCS##type##List l = list; \ while (l && index) \ { \ l = l->next; \ --index; \ } \ return l; \ } \ \ CCS##type##List ccs##type##ListRemove (CCS##type##List list, dtype *data, Bool freeObj) \ { \ CCS##type##List l = list; \ CCS##type##List prev = NULL; \ Bool found = FALSE; \ if (!data) \ return list; \ while (l) \ { \ if (!l->data) continue; \ if ((ocomp)?(compfunc):(memcmp(l->data, data, sizeof(dtype)) == 0)) \ { \ found = TRUE; \ break; \ } \ prev = l; \ l = l->next; \ } \ if (!found) \ return list; \ if (l) \ { \ if (prev) prev->next = l->next; \ else list = l->next; \ if (freeObj) \ ccs##type##Unref (l->data); \ free (l); \ } \ return list; \ } \ \ CCS##type##List ccs##type##ListFree (CCS##type##List list, Bool freeObj) \ { \ CCS##type##List l = list; \ CCS##type##List le = NULL; \ while (l) \ { \ le = l; \ l = l->next; \ if (freeObj) \ ccs##type##Unref (le->data); \ free(le); \ } \ return NULL; \ } CCSLIST (Plugin, CCSPlugin, FALSE, 0) CCSLIST (Setting, CCSSetting, FALSE, 0) CCSLIST (String, CCSString, TRUE, strcmp (((CCSString *)data)->value, ((CCSString *)l->data)->value) == 0) CCSLIST (Group, CCSGroup, FALSE, 0) CCSLIST (SubGroup, CCSSubGroup, FALSE, 0) CCSLIST (SettingValue, CCSSettingValue, FALSE, 0) CCSLIST (PluginConflict, CCSPluginConflict, FALSE, 0) CCSLIST (BackendInfo, CCSBackendInfo, FALSE, 0) CCSLIST (IntDesc, CCSIntDesc, FALSE, 0) CCSLIST (StrRestriction, CCSStrRestriction, FALSE, 0) CCSLIST (StrExtension, CCSStrExtension, FALSE, 0) CCSLIST (IntegratedSetting, CCSIntegratedSetting, FALSE, 0) CCSSettingValueList ccsGetValueListFromStringList (CCSStringList list, CCSSetting *parent) { CCSSettingValueList rv = NULL; while (list) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return rv; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asString = strdup (((CCSString *)list->data)->value); rv = ccsSettingValueListAppend (rv, value); list = list->next; } return rv; } CCSStringList ccsGetStringListFromValueList (CCSSettingValueList list) { CCSStringList rv = NULL; while (list) { CCSString *str = calloc (1, sizeof (CCSString)); str->value = strdup (list->data->value.asString); str->refCount = 1; rv = ccsStringListAppend (rv, str); list = list->next; } return rv; } char ** ccsGetStringArrayFromList (CCSStringList list, int *num) { char ** rv = NULL; int length = ccsStringListLength (list); int i; if (length) { rv = calloc (length, sizeof (char *)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) { rv[i] = strdup (((CCSString *)list->data)->value); } *num = length; return rv; } CCSStringList ccsGetListFromStringArray (char ** array, int num) { CCSStringList rv = NULL; int i; for (i = 0; i < num; ++i) { CCSString *str = calloc (1, sizeof (CCSString)); str->value = strdup (array[i]); str->refCount = 1; rv = ccsStringListAppend (rv, str); } return rv; } char ** ccsGetStringArrayFromValueList (CCSSettingValueList list, int *num) { char ** rv = NULL; int length = ccsSettingValueListLength (list); int i; if (length) { rv = calloc (length, sizeof (char *)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) rv[i] = strdup (list->data->value.asString); *num = length; return rv; } char ** ccsGetMatchArrayFromValueList (CCSSettingValueList list, int *num) { char ** rv = NULL; int length = ccsSettingValueListLength (list); int i; if (length) { rv = calloc (length, sizeof (char *)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) rv[i] = strdup (list->data->value.asMatch); *num = length; return rv; } int * ccsGetIntArrayFromValueList (CCSSettingValueList list, int *num) { int * rv = NULL; int length = ccsSettingValueListLength (list); int i; if (length) { rv = calloc (length, sizeof (int)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) rv[i] = list->data->value.asInt; *num = length; return rv; } float * ccsGetFloatArrayFromValueList (CCSSettingValueList list, int *num) { float * rv = NULL; int length = ccsSettingValueListLength (list); int i; if (length) { rv = calloc (length, sizeof (float)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) rv[i] = list->data->value.asFloat; *num = length; return rv; } Bool * ccsGetBoolArrayFromValueList (CCSSettingValueList list, int *num) { Bool * rv = NULL; int length = ccsSettingValueListLength (list); int i; if (length) { rv = calloc (length, sizeof (Bool)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) rv[i] = list->data->value.asBool; *num = length; return rv; } CCSSettingColorValue * ccsGetColorArrayFromValueList (CCSSettingValueList list, int *num) { CCSSettingColorValue * rv = NULL; int length = ccsSettingValueListLength (list); int i; if (length) { rv = calloc (length, sizeof (CCSSettingColorValue)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) memcpy (&rv[i], &list->data->value.asColor, sizeof (CCSSettingColorValue)); *num = length; return rv; } CCSSettingValueList ccsGetValueListFromStringArray (const char ** array, int num, CCSSetting *parent) { CCSSettingValueList l = NULL; int i; for (i = 0; i < num; ++i) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return l; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asString = strdup (array[i]); l = ccsSettingValueListAppend (l, value); } return l; } CCSSettingValueList ccsGetValueListFromMatchArray (const char ** array, int num, CCSSetting *parent) { CCSSettingValueList l = NULL; int i; for (i = 0; i < num; ++i) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return l; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asMatch = strdup (array[i]); l = ccsSettingValueListAppend (l, value); } return l; } CCSSettingValueList ccsGetValueListFromIntArray (int * array, int num, CCSSetting *parent) { CCSSettingValueList l = NULL; int i; for (i = 0; i < num; ++i) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return l; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asInt = array[i]; l = ccsSettingValueListAppend (l, value); } return l; } CCSSettingValueList ccsGetValueListFromFloatArray (float * array, int num, CCSSetting *parent) { CCSSettingValueList l = NULL; int i; for (i = 0; i < num; ++i) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return l; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asFloat = array[i]; l = ccsSettingValueListAppend (l, value); } return l; } CCSSettingValueList ccsGetValueListFromBoolArray (Bool * array, int num, CCSSetting *parent) { CCSSettingValueList l = NULL; int i; for (i = 0; i < num; ++i) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return l; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asBool = array[i]; l = ccsSettingValueListAppend (l, value); } return l; } CCSSettingValueList ccsGetValueListFromColorArray (CCSSettingColorValue * array, int num, CCSSetting *parent) { CCSSettingValueList l = NULL; int i; for (i = 0; i < num; ++i) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return l; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asColor = array[i]; l = ccsSettingValueListAppend (l, value); } return l; } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/iniparser.c0000644000015301777760000005410412321343002026272 0ustar pbusernogroup00000000000000/* Modified for libcompizconfig usage, by Sam Spilsbury (smspillaz@gmail.com) Based upon libiniparser, by Nicolas Devillard Hacked into 1 file (m-iniparser) by Freek/2005 Original terms following: -- - Copyright (c) 2000 by Nicolas Devillard (ndevilla AT free DOT fr). Written by Nicolas Devillard. Not derived from licensed software. Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. The author is not responsible for the consequences of use of this software, no matter how awful, even if they arise from defects in it. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. This notice may not be removed or altered. */ #include #include #include #include #include #include #include #include #include #include "iniparser.h" #ifdef __cplusplus extern "C" { #endif /* lock INI file access against concurrent access */ static FileLock* ini_file_lock (const char *fileName, Bool exclusive) { int fd; FileLock *lock; struct flock lockinfo; if (exclusive) fd = open (fileName, O_WRONLY | O_CREAT | O_TRUNC, 0666); else fd = open (fileName, O_RDONLY | O_CREAT, 0666); if (fd < 0) return NULL; lock = malloc (sizeof (FileLock)); if (!lock) return NULL; lock->fd = fd; memset (&lockinfo, 0, sizeof (struct flock)); if (exclusive) lockinfo.l_type = F_WRLCK; else lockinfo.l_type = F_RDLCK; lockinfo.l_pid = getpid(); fcntl (fd, F_SETLKW, &lockinfo); return lock; } static void ini_file_unlock (FileLock *lock) { struct flock lockinfo; memset (&lockinfo, 0, sizeof (struct flock)); lockinfo.l_type = F_UNLCK; lockinfo.l_pid = getpid(); fcntl (lock ->fd, F_SETLKW, &lockinfo); close (lock ->fd); free (lock ); } /* strlib.c following */ #define ASCIILINESZ 1024 /*-------------------------------------------------------------------------*/ /** @brief Convert a string to lowercase. @param s String to convert. @return ptr to statically allocated string. This function returns a pointer to a statically allocated string containing a lowercased version of the input string. Do not free or modify the returned string! Since the returned string is statically allocated, it will be modified at each function call (not re-entrant). */ /*--------------------------------------------------------------------------*/ static char* strlwc (char * s) { static char l[ASCIILINESZ+1]; int i; if (!s) return NULL; memset (l, 0, ASCIILINESZ + 1); i = 0; while (i < ASCIILINESZ && s[i]) { l[i] = (char) tolower ((int) s[i]); ++i; } l[ASCIILINESZ] = (char) 0; return l; } /*-------------------------------------------------------------------------*/ /** @brief Skip blanks until the first non-blank character. @param s String to parse. @return Pointer to char inside given string. This function returns a pointer to the first non-blank character in the given string. */ /*--------------------------------------------------------------------------*/ static char* strskp (char * s) { char * skip = s; if (!s) return NULL; while (isspace ((int) *skip) && *skip) ++skip; return skip; } /*-------------------------------------------------------------------------*/ /** @brief Remove blanks at the end of a string. @param s String to parse. @return ptr to statically allocated string. This function returns a pointer to a statically allocated string, which is identical to the input string, except that all blank characters at the end of the string have been removed. Do not free or modify the returned string! Since the returned string is statically allocated, it will be modified at each function call (not re-entrant). */ /*--------------------------------------------------------------------------*/ static char* strcrop (char * s) { static char l[ASCIILINESZ+1]; char *last; if (!s) return NULL; memset (l, 0, ASCIILINESZ + 1); strcpy (l, s); last = l + strlen (l); while (last > l) { if (!isspace ((int) * (last - 1))) break; --last; } *last = (char) 0; return l; } /* dictionary.c.c following */ /** Maximum value size for integers and doubles. */ #define MAXVALSZ 1024 /** Minimal allocated number of entries in a dictionary */ #define DICTMINSZ 128 /** Invalid key token */ #define DICT_INVALID_KEY ((char*)-1) /* Doubles the allocated size associated to a pointer 'size' is the current allocated size. */ static void* mem_double (void * ptr, int size) { void *newptr; newptr = calloc (2 * size, 1); if (!newptr) return NULL; memcpy (newptr, ptr, size); free (ptr); return newptr; } /*--------------------------------------------------------------------------- Function codes ---------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/ /** @brief Compute the hash key for a string. @param key Character string to use for key. @return 1 unsigned int on at least 32 bits. This hash function has been taken from an Article in Dr Dobbs Journal. This is normally a collision-free function, distributing keys evenly. The key is stored anyway in the struct so that collision can be avoided by comparing the key itself in last resort. */ /*--------------------------------------------------------------------------*/ static unsigned dictionary_hash (char * key) { int len; unsigned hash; int i; len = strlen (key); for (hash = 0, i = 0; i < len; ++i) { hash += (unsigned) key[i]; hash += (hash << 10); hash ^= (hash >> 6); } hash += (hash << 3); hash ^= (hash >> 11); hash += (hash << 15); return hash; } /*-------------------------------------------------------------------------*/ /** @brief Create a new dictionary object. @param size Optional initial size of the dictionary. @return 1 newly allocated dictionary objet. This function allocates a new dictionary object of given size and returns it. If you do not know in advance (roughly) the number of entries in the dictionary, give size=0. */ /*--------------------------------------------------------------------------*/ dictionary* dictionary_new (int size) { dictionary *d; /* If no size was specified, allocate space for DICTMINSZ */ if (size < DICTMINSZ) size = DICTMINSZ; d = (dictionary *) calloc (1, sizeof (dictionary)); if (!d) return NULL; d->size = size; d->val = (char **) calloc (size, sizeof (char*)); if (!d->val) { free (d); return NULL; } d->key = (char **) calloc (size, sizeof (char*)); if (!d->key) { free (d->val); free (d); return NULL; } d->hash = (unsigned int *) calloc (size, sizeof (unsigned)); if (!d->hash) { free (d->key); free (d->val); free (d); return NULL; } return d; } /*-------------------------------------------------------------------------*/ /** @brief Delete a dictionary object @param d dictionary object to deallocate. @return void Deallocate a dictionary object and all memory associated to it. */ /*--------------------------------------------------------------------------*/ static void dictionary_del (dictionary * d) { int i; if (!d) return; for (i = 0; i < d->size; ++i) { if (d->key[i]) free (d->key[i]); if (d->val[i]) free (d->val[i]); } free (d->val); free (d->key); free (d->hash); free (d); return; } /*-------------------------------------------------------------------------*/ /** @brief Get a value from a dictionary. @param d dictionary object to search. @param key Key to look for in the dictionary. @param def Default value to return if key not found. @return 1 pointer to internally allocated character string. This function locates a key in a dictionary and returns a pointer to its value, or the passed 'def' pointer if no such key can be found in dictionary. The returned character pointer points to data internal to the dictionary object, you should not try to free it or modify it. */ /*--------------------------------------------------------------------------*/ static char* dictionary_get (dictionary * d, char * key, char * def) { unsigned hash; int i; hash = dictionary_hash (key); for (i = 0; i < d->size; ++i) { if (!d->key) continue; /* Compare hash */ if (hash == d->hash[i]) { /* Compare string, to avoid hash collisions */ if (!strcmp (key, d->key[i])) { return d->val[i]; } } } return def; } /*-------------------------------------------------------------------------*/ /** @brief Set a value in a dictionary. @param d dictionary object to modify. @param key Key to modify or add. @param val Value to add. @return void If the given key is found in the dictionary, the associated value is replaced by the provided one. If the key cannot be found in the dictionary, it is added to it. It is Ok to provide a NULL value for val, but NULL values for the dictionary or the key are considered as errors: the function will return immediately in such a case. Notice that if you dictionary_set a variable to NULL, a call to dictionary_get will return a NULL value: the variable will be found, and its value (NULL) is returned. In other words, setting the variable content to NULL is equivalent to deleting the variable from the dictionary. It is not possible (in this implementation) to have a key in the dictionary without value. */ /*--------------------------------------------------------------------------*/ static void dictionary_set (dictionary * d, char * key, char * val) { int i; unsigned hash; if (!d || !key) return; /* Compute hash for this key */ hash = dictionary_hash (key); /* Find if value is already in blackboard */ if (d->n > 0) { for (i = 0; i < d->size; ++i) { if (!d->key[i]) continue; if (hash == d->hash[i]) { /* Same hash value */ if (!strcmp (key, d->key[i])) { /* Same key */ /* Found a value: modify and return */ if (d->val[i]) free (d->val[i]); d->val[i] = val ? strdup (val) : NULL; /* Value has been modified: return */ return; } } } } /* Add a new value */ /* See if dictionary needs to grow */ if (d->n == d->size) { /* Reached maximum size: reallocate blackboard */ d->val = (char **) mem_double (d->val, d->size * sizeof (char*)); d->key = (char **) mem_double (d->key, d->size * sizeof (char*)); d->hash = (unsigned int *) mem_double (d->hash, d->size * sizeof (unsigned)); /* Double size */ d->size *= 2; } /* Insert key in the first empty slot */ for (i = 0; i < d->size; ++i) { if (!d->key[i]) { /* Add key here */ break; } } /* Copy key */ d->key[i] = strdup (key); d->val[i] = val ? strdup (val) : NULL; d->hash[i] = hash; ++d->n; } /*-------------------------------------------------------------------------*/ /** @brief Delete a key in a dictionary @param d dictionary object to modify. @param key Key to remove. @return void This function deletes a key in a dictionary. Nothing is done if the key cannot be found. */ /*--------------------------------------------------------------------------*/ static void dictionary_unset (dictionary * d, char * key) { unsigned hash; int i; hash = dictionary_hash (key); for (i = 0; i < d->size; ++i) { if (!d->key[i]) continue; /* Compare hash */ if (hash == d->hash[i]) { /* Compare string, to avoid hash collisions */ if (!strcmp (key, d->key[i])) { /* Found key */ break; } } } if (i >= d->size) /* Key not found */ return; free (d->key[i]); d->key[i] = NULL; if (d->val[i]) { free (d->val[i]); d->val[i] = NULL; } d->hash[i] = 0; --d->n; } /* iniparser.c.c following */ #define ASCIILINESZ 1024 #define INI_INVALID_KEY ((char*)-1) /* Private: add an entry to the dictionary */ void iniparser_add_entry (dictionary * d, char * sec, char * key, char * val) { char longkey[2*ASCIILINESZ+1]; /* Make a key as section:keyword */ if (key) sprintf (longkey, "%s:%s", sec, key); else strcpy (longkey, sec); /* Add (key,val) to dictionary */ dictionary_set (d, longkey, val); } /*-------------------------------------------------------------------------*/ /** @brief Get number of sections in a dictionary @param d Dictionary to examine @return int Number of sections found in dictionary This function returns the number of sections found in a dictionary. The test to recognize sections is done on the string stored in the dictionary: a section name is given as "section" whereas a key is stored as "section:key", thus the test looks for entries that do not contain a colon. This clearly fails in the case a section name contains a colon, but this should simply be avoided. This function returns -1 in case of error. */ /*--------------------------------------------------------------------------*/ int iniparser_getnsec (dictionary * d) { int i; int nsec; if (!d) return -1; nsec = 0; for (i = 0; i < d->size; ++i) { if (!d->key[i]) continue; if (!strchr (d->key[i], ':')) ++nsec; } return nsec; } /*-------------------------------------------------------------------------*/ /** @brief Get name for section n in a dictionary. @param d Dictionary to examine @param n Section number (from 0 to nsec-1). @return Pointer to char string This function locates the n-th section in a dictionary and returns its name as a pointer to a string statically allocated inside the dictionary. Do not free or modify the returned string! This function returns NULL in case of error. */ /*--------------------------------------------------------------------------*/ char* iniparser_getsecname (dictionary * d, int n) { int i; int foundsec; if (!d || n < 0) return NULL; foundsec = 0; for (i = 0; i < d->size; ++i) { if (!d->key[i]) continue; if (!strchr (d->key[i], ':')) { ++foundsec; if (foundsec > n) break; } } if (foundsec <= n) return NULL; return d->key[i]; } /*-------------------------------------------------------------------------*/ /** @brief Save a dictionary to a loadable ini file @param d Dictionary to dump @param f Opened file pointer to dump to @return void This function dumps a given dictionary into a loadable ini file. It is Ok to specify @c stderr or @c stdout as output files. */ /*--------------------------------------------------------------------------*/ void iniparser_dump_ini (dictionary * d, const char * file_name) { int i, j; char keym[ASCIILINESZ+1]; int nsec; char * secname; int seclen; FILE * f; FileLock *lock; if (!d) return; lock = ini_file_lock (file_name, TRUE); if (!lock) return; f = fdopen (lock->fd, "w"); if (!f) { ini_file_unlock (lock); return; } nsec = iniparser_getnsec (d); if (nsec < 1) { /* No section in file: dump all keys as they are */ for (i = 0; i < d->size; ++i) { if (!d->key[i]) continue; fprintf (f, "%s = %s\n", d->key[i], d->val[i]); } fflush (f); fclose (f); ini_file_unlock (lock); return; } for (i = 0; i < nsec; ++i) { secname = iniparser_getsecname (d, i); seclen = (int) strlen (secname); fprintf (f, "[%s]\n", secname); sprintf (keym, "%s:", secname); for (j = 0; j < d->size; ++j) { if (!d->key[j]) continue; if (!strncmp (d->key[j], keym, seclen + 1)) { fprintf (f, "%s = %s\n", d->key[j] + seclen + 1, d->val[j] ? d->val[j] : ""); } } fprintf (f, "\n"); } fflush (f); fclose (f); ini_file_unlock (lock ); } /*-------------------------------------------------------------------------*/ /** @brief Get the string associated to a key @param d Dictionary to search @param key Key string to look for @param def Default value to return if key not found. @return pointer to statically allocated character string This function queries a dictionary for a key. A key as read from an ini file is given as "section:key". If the key cannot be found, the pointer passed as 'def' is returned. The returned char pointer is pointing to a string allocated in the dictionary, do not free or modify it. */ /*--------------------------------------------------------------------------*/ char* iniparser_getstring (dictionary * d, char * key, char * def) { char * lc_key; char * sval; if (!d || !key) return def; lc_key = strdup (strlwc (key)); sval = dictionary_get (d, lc_key, def); free (lc_key); return sval; } /*-------------------------------------------------------------------------*/ /** @brief Finds out if a given entry exists in a dictionary @param ini Dictionary to search @param entry Name of the entry to look for @return integer 1 if entry exists, 0 otherwise Finds out if a given entry exists in the dictionary. Since sections are stored as keys with NULL associated values, this is the only way of querying for the presence of sections in a dictionary. */ /*--------------------------------------------------------------------------*/ int iniparser_find_entry (dictionary *ini, char *entry) { int found = 0; if (iniparser_getstring (ini, entry, INI_INVALID_KEY) != INI_INVALID_KEY) { found = 1; } return found; } /*-------------------------------------------------------------------------*/ /** @brief Set an entry in a dictionary. @param ini Dictionary to modify. @param entry Entry to modify (entry name) @param val New value to associate to the entry. @return int 0 if Ok, -1 otherwise. If the given entry can be found in the dictionary, it is modified to contain the provided value. If it cannot be found, -1 is returned. It is Ok to set val to NULL. */ /*--------------------------------------------------------------------------*/ int iniparser_setstr (dictionary * ini, char * entry, char * val) { dictionary_set (ini, strlwc (entry), val); return 0; } /*-------------------------------------------------------------------------*/ /** @brief Delete an entry in a dictionary @param ini Dictionary to modify @param entry Entry to delete (entry name) @return void If the given entry can be found, it is deleted from the dictionary. */ /*--------------------------------------------------------------------------*/ void iniparser_unset (dictionary * ini, char * entry) { dictionary_unset (ini, strlwc (entry)); } /*-------------------------------------------------------------------------*/ /** @brief Parse an ini file and return an allocated dictionary object @param ininame Name of the ini file to read. @return Pointer to newly allocated dictionary This is the parser for ini files. This function is called, providing the name of the file to be read. It returns a dictionary object that should not be accessed directly, but through accessor functions instead. The returned dictionary must be freed using iniparser_free(). */ /*--------------------------------------------------------------------------*/ dictionary* iniparser_new (char *ininame) { dictionary * d; char lin[ASCIILINESZ+1]; char sec[ASCIILINESZ+1]; char key[ASCIILINESZ+1]; char val[ASCIILINESZ+1]; char * where; FILE * ini; int lineno; FileLock * lock; lock = ini_file_lock (ininame, FALSE); if (!lock) ccsWarning ("unable to lock file %s, reads may conflict", ininame); ini = fopen (ininame, "r"); if (!ini) { if (lock) ini_file_unlock (lock ); return NULL; } sec[0] = 0; /* * Initialize a new dictionary entry */ d = dictionary_new (0); lineno = 0; while (fgets (lin, ASCIILINESZ, ini) != NULL) { ++lineno; where = strskp (lin); /* Skip leading spaces */ if (*where == ';' || *where == '#' || *where == 0) continue; /* Comment lines */ else { val[0] = '\0'; if (sscanf (where, "[%[^]]", sec) == 1) { /* Valid section name */ strcpy (sec, strlwc (sec)); iniparser_add_entry (d, sec, NULL, NULL); } else if (sscanf (where, "%[^=] = \"%[^\"]\"", key, val) == 2 || sscanf (where, "%[^=] = '%[^\']'", key, val) == 2 || sscanf (where, "%[^=] = %[^\n]", key, val) >= 1) { strcpy (key, strlwc (strcrop (key))); /* * sscanf cannot handle "" or '' as empty value, * this is done here */ if (!strcmp (val, "\"\"") || !strcmp (val, "''")) { val[0] = (char) 0; } else { strcpy (val, strcrop (val)); } iniparser_add_entry (d, sec, key, val); } } } fclose (ini); if (lock) ini_file_unlock (lock ); return d; } /*-------------------------------------------------------------------------*/ /** @brief Free all memory associated to an ini dictionary @param d Dictionary to free @return void Free all memory associated to an ini dictionary. It is mandatory to call this function before the dictionary object gets out of the current context. */ /*--------------------------------------------------------------------------*/ void iniparser_free (dictionary * d) { dictionary_del (d); } #ifdef __cplusplus } #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_settings_upgrade_internal.c0000644000015301777760000002305412321343002032371 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include "ccs_settings_upgrade_internal.h" #include #include #include #include #include typedef Bool (*CCSProcessTokenizedUpgradeFileFunc) (const char *name, int length, const char *tokenOne, const char *tokenTwo, const char *tokenThree, int foundNumber, void *userData); static Bool isUpgrade (const char *name, int length, const char *tokenOne, const char *tokenTwo, const char *tokenThree, int foundNumber, void *userData) { static const char *upgrade = "upgrade"; static const unsigned int upgrade_str_len = 7; return strncmp (tokenThree, upgrade, upgrade_str_len) == 0; } typedef struct _FillDomainNumAndProfileData { char **domain; char **profile; unsigned int *num; } FillDomainNumAndProfileData; static int fillDomainNumAndProfile (const char *name, int length, const char *tokenOne, const char *tokenTwo, const char *tokenThree, int foundNumber, void *userData) { FillDomainNumAndProfileData *data = (FillDomainNumAndProfileData *) userData; *data->domain = strndup (name, length - (strlen (tokenOne) + 1)); /* profile.n.upgrade */ *data->profile = strndup (tokenOne, strlen (tokenOne) - (strlen (tokenTwo) + 1)); *data->num = foundNumber; return 1; } static Bool ccsDetokenizeUpgradeDomainAndExecuteUserFunc (const char *name, CCSProcessTokenizedUpgradeFileFunc func, void *userData) { int length = strlen (name); const char *tok = name; Bool success = FALSE; /* Keep removing domains and other bits * until we hit a number that we can parse */ while (tok) { long int numTmp = 0; char *nexttok = strchr (tok, '.'); char *nextnexttok = NULL; char *bit = NULL; if (!nexttok) return FALSE; ++nexttok; nextnexttok = strchr (nexttok, '.'); if (!nextnexttok) return FALSE; ++nextnexttok; bit = strndup (nexttok, strlen (nexttok) - (strlen (nextnexttok) + 1)); if (sscanf (bit, "%ld", &numTmp) == 1) { if ((*func) (name, length, tok, nexttok, nextnexttok, numTmp, userData)) success = TRUE; } tok = nexttok; free (bit); if (success) return TRUE; } return FALSE; } Bool ccsUpgradeGetDomainNumAndProfile (const char *name, char **domain, unsigned int *num, char **profile) { FillDomainNumAndProfileData data = { domain, profile, num }; return ccsDetokenizeUpgradeDomainAndExecuteUserFunc (name, fillDomainNumAndProfile, (void *) &data); } int ccsUpgradeNameFilter (const char *name) { Bool result = FALSE; int length = strlen (name); if (length < 7) return 0; result = ccsDetokenizeUpgradeDomainAndExecuteUserFunc (name, isUpgrade, NULL); if (result) return 1; return 0; } void ccsUpgradeClearValues (CCSSettingList clearSettings) { CCSSettingList sl = clearSettings; while (sl) { CCSSetting *tempSetting = (CCSSetting *) sl->data; CCSSetting *setting; CCSPlugin *plugin = ccsSettingGetParent (tempSetting); const char *name = ccsSettingGetName (tempSetting); setting = ccsFindSetting (plugin, name); if (setting) { CCSSettingInfo *tempInfo = ccsSettingGetInfo (tempSetting); CCSSettingType tType = ccsSettingGetType (tempSetting); CCSSettingType sType = ccsSettingGetType (setting); CCSSettingInfo *info = ccsSettingGetInfo (setting); if (sType != tType) { ccsWarning ("Attempted to upgrade setting %s with wrong type", name); sl = sl->next; continue; } if (sType != TypeList) { if (ccsCheckValueEq (ccsSettingGetValue (setting), sType, info, ccsSettingGetValue (tempSetting), tType, tempInfo)) { ccsDebug ("Resetting %s to default", name); ccsResetToDefault (setting, TRUE); } else { ccsDebug ("Skipping processing of %s", name); } } else { unsigned int count = 0; /* Try and remove any specified items from the list */ CCSSettingValueList l = ccsSettingGetValue (tempSetting)->value.asList; CCSSettingValueList nl = ccsCopyList (ccsSettingGetValue (setting)->value.asList, setting); CCSSettingInfo *info = ccsSettingGetInfo (setting); while (l) { CCSSettingValueList olv = nl; while (olv) { CCSSettingValue *lv = (CCSSettingValue *) l->data; CCSSettingValue *olvv = (CCSSettingValue *) olv->data; /* Break if we found a matching value, so that we can * remove it from the list */ if (ccsCheckValueEq (lv, info->forList.listType, info, olvv, info->forList.listType, info)) break; olv = olv->next; } /* We found a matching value, remove it */ if (olv) { ++count; nl = ccsSettingValueListRemove (nl, olv->data, TRUE); } l = l->next; } ccsDebug ("Removed %i items from %s", count, name); ccsSetList (setting, nl, TRUE); ccsSettingValueListFree (nl, TRUE); } } sl = sl->next; } } void ccsUpgradeAddValues (CCSSettingList addSettings) { CCSSettingList sl = addSettings; while (sl) { CCSSetting *tempSetting = (CCSSetting *) sl->data; CCSSetting *setting; CCSPlugin *plugin = ccsSettingGetParent (tempSetting); const char *name = ccsSettingGetName (tempSetting); setting = ccsFindSetting (plugin, name); if (setting) { const CCSSettingType tempSettingType = ccsSettingGetType (tempSetting); const CCSSettingType actualSettingType = ccsSettingGetType (setting); if (tempSettingType != actualSettingType) { ccsWarning ("Attempted to upgrade setting %s with wrong type", name); sl = sl->next; continue; } ccsDebug ("Overriding value %s", name); if (tempSettingType != TypeList) ccsSetValue (setting, ccsSettingGetValue (tempSetting), TRUE); else { unsigned int count = 0; /* Try and apppend any new items to the list */ CCSSettingValueList l = ccsSettingGetValue (tempSetting)->value.asList; CCSSettingValueList nl = ccsCopyList (ccsSettingGetValue (setting)->value.asList, setting); CCSSettingInfo *info = ccsSettingGetInfo (setting); while (l) { CCSSettingValueList olv = nl; while (olv) { CCSSettingValue *lv = (CCSSettingValue *) l->data; CCSSettingValue *olvv = (CCSSettingValue *) olv->data; /* Break if we find the same value, as it was in the list * already */ if (ccsCheckValueEq (lv, info->forList.listType, info, olvv, info->forList.listType, info)) break; olv = olv->next; } /* If olv is NULL then the value was not in the original * list and we should append the value to nl */ if (!olv) { ++count; /* Before we do that, make sure that the setting parent * is set to the real setting, so that it behaves * correctly later on */ l->data->parent = setting; nl = ccsSettingValueListAppend (nl, l->data); } l = l->next; } ccsDebug ("Appending %i items to %s", count, name); ccsSetList (setting, nl, TRUE); } } else { ccsDebug ("Value %s not found!", name); } sl = sl->next; } } void ccsUpgradeReplaceValues (CCSSettingList replaceFromValueSettings, CCSSettingList replaceToValueSettings) { CCSSettingList sl = replaceFromValueSettings; while (sl) { CCSSetting *tempSetting = (CCSSetting *) sl->data; CCSSetting *setting; CCSPlugin *plugin = ccsSettingGetParent (tempSetting); const char *name = ccsSettingGetName (tempSetting); setting = ccsFindSetting (plugin, name); if (setting) { CCSSettingValue *value = ccsSettingGetValue (setting); CCSSettingType realType = ccsSettingGetType (setting); CCSSettingInfo *realInfo = ccsSettingGetInfo (setting); CCSSettingValue *tempValue = ccsSettingGetValue (tempSetting); CCSSettingType tempType = ccsSettingGetType (tempSetting); CCSSettingInfo *tempInfo = ccsSettingGetInfo (tempSetting); if (ccsCheckValueEq (value, realType, realInfo, tempValue, tempType, tempInfo)) { CCSSettingList rl = replaceToValueSettings; while (rl) { CCSSetting *rsetting = (CCSSetting *) rl->data; const char *replaceToSettingName = ccsSettingGetName (rsetting); if (strcmp (replaceToSettingName, name) == 0) { ccsDebug ("Matched and replaced %s", name); ccsSetValue (setting, ccsSettingGetValue (rsetting), TRUE); break; } rl = rl->next; } } else { ccsDebug ("Skipping processing of %s", name); } } sl = sl->next; } } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_config_file_interface.c0000644000015301777760000000351612321343002031413 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * ccs_config_file_interface.c * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include INTERFACE_TYPE (CCSConfigFileInterface); CCSREF_OBJ (ConfigFile, CCSConfigFile); Bool ccsConfigFileReadConfigOption (CCSConfigFile *config, ConfigOption opt, char **value) { return (*(GET_INTERFACE (CCSConfigFileInterface, config))->readConfigOption) (config, opt, value); } Bool ccsConfigFileWriteConfigOption (CCSConfigFile *config, ConfigOption opt, const char *value) { return (*(GET_INTERFACE (CCSConfigFileInterface, config))->writeConfigOption) (config, opt, value); } void ccsSetConfigWatchCallback (CCSConfigFile *config, ConfigChangeCallbackProc callback, void *closure) { (*(GET_INTERFACE (CCSConfigFileInterface, config))->setConfigWatchCallback) (config, callback, closure); } void ccsFreeConfigFile (CCSConfigFile *config) { return (*(GET_INTERFACE (CCSConfigFileInterface, config))->free) (config); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_backend_loader_interface.h0000644000015301777760000000350212321343002032064 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * ccs_backend_loader_interface.h * * Copyright (C) 2013 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef CCS_BACKEND_LOADER_INTERFACE_H #define CCS_BACKEND_LOADER_INTERFACE_H #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSBackendLoaderInterface CCSBackendLoaderInterface; typedef CCSBackend * (*CCSLoadBackend) (CCSBackendLoader *, const CCSInterfaceTable *interfaces, CCSContext *, const char *); typedef void (*CCSFreeBackendLoader) (CCSBackendLoader *); struct _CCSBackendLoaderInterface { CCSLoadBackend loadBackend; CCSFreeBackendLoader free; }; struct _CCSBackendLoader { CCSObject object; }; CCSREF_HDR (BackendLoader, CCSBackendLoader); CCSBackend * ccsBackendLoaderLoadBackend (CCSBackendLoader *loader, const CCSInterfaceTable *interfaces, CCSContext *context, const char *); void ccsFreeBackendLoader (CCSBackendLoader *); unsigned int ccsCCSBackendLoaderInterfaceGetType (); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_backend_loader.h0000644000015301777760000000226012321343002030044 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * ccs_backend_loader.h * * Copyright (C) 2013 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef CCS_BACKEND_LOADER_H #define CCS_BACKEND_LOADER_H #include #include #include "ccs_backend_loader_interface.h" COMPIZCONFIG_BEGIN_DECLS CCSBackendLoader * ccsSharedLibBackendLoaderNew (CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_config_file_interface.h0000644000015301777760000000440512321343002031416 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * ccs_config_file_interface.h * * Copyright (C) 2013 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef CCS_CONFIG_FILE_INTERFACE_H #define CCS_CONFIG_FILE_INTERFACE_H #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSConfigFile CCSConfigFile; typedef struct _CCSConfigFileInterface CCSConfigFileInterface; typedef void (*ConfigChangeCallbackProc) (unsigned int watchId, void *closure); typedef Bool (*CCSReadConfigOption) (CCSConfigFile *, ConfigOption, char **value); typedef Bool (*CCSWriteConfigOption) (CCSConfigFile *, ConfigOption, const char *value); typedef void (*CCSSetConfigWatchCallback) (CCSConfigFile *, ConfigChangeCallbackProc, void *closure); typedef void (*CCSFreeConfigFile) (CCSConfigFile *file); struct _CCSConfigFileInterface { CCSReadConfigOption readConfigOption; CCSWriteConfigOption writeConfigOption; CCSSetConfigWatchCallback setConfigWatchCallback; CCSFreeConfigFile free; }; struct _CCSConfigFile { CCSObject object; }; CCSREF_HDR (ConfigFile, CCSConfigFile); Bool ccsConfigFileReadConfigOption (CCSConfigFile *, ConfigOption, char **value); Bool ccsConfigFileWriteConfigOption (CCSConfigFile *, ConfigOption, const char *); void ccsSetConfigWatchCallback (CCSConfigFile *, ConfigChangeCallbackProc, void *); void ccsFreeConfigFile (CCSConfigFile *); unsigned int ccsCCSConfigFileInterfaceGetType (); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/main.c0000644000015301777760000046161312321343002025231 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H # include "../config.h" #endif #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include "ccs-private.h" #include "iniparser.h" #include "ccs_settings_upgrade_internal.h" #include "ccs_text_file_interface.h" #include "ccs_text_file.h" #include "ccs_backend_loader_interface.h" #include "ccs_backend_loader.h" #include "ccs_config_file_interface.h" #include "ccs_config_file.h" static void * wrapRealloc (void *o, void *a , size_t b) { return realloc (a, b); } static void * wrapMalloc (void *o, size_t a) { return malloc (a); } static void * wrapCalloc (void *o, size_t a, size_t b) { return calloc (a, b); } static void wrapFree (void *o, void *a) { free (a); } CCSObjectAllocationInterface ccsDefaultObjectAllocator = { wrapRealloc, wrapMalloc, wrapCalloc, wrapFree, NULL }; /* CCSObject stuff */ Bool ccsObjectInit_(CCSObject *object, CCSObjectAllocationInterface *object_allocation) { object->priv = NULL; object->n_interfaces = 0; object->n_allocated_interfaces = 0; object->interfaces = NULL; object->interface_types = NULL; object->object_allocation = object_allocation; object->refcnt = 0; return TRUE; } Bool ccsObjectAddInterface_(CCSObject *object, const CCSInterface *interface, int interface_type) { ++object->n_interfaces; if (object->n_allocated_interfaces < object->n_interfaces) { unsigned int old_allocated_interfaces = object->n_allocated_interfaces; object->n_allocated_interfaces = object->n_interfaces; CCSInterface **ifaces = (*object->object_allocation->realloc_) (object->object_allocation->allocator, object->interfaces, object->n_allocated_interfaces * sizeof (CCSInterface *)); int *iface_types = (*object->object_allocation->realloc_) (object->object_allocation->allocator, object->interface_types, object->n_allocated_interfaces * sizeof (int)); if (!ifaces || !iface_types) { if (ifaces) (*object->object_allocation->free_) (object->object_allocation->allocator, ifaces); if (iface_types) (*object->object_allocation->free_) (object->object_allocation->allocator, iface_types); --object->n_interfaces; object->n_allocated_interfaces = old_allocated_interfaces; return FALSE; } else { object->interfaces = (const CCSInterface **) ifaces; object->interface_types = iface_types; } } object->interfaces[object->n_interfaces - 1] = interface; object->interface_types[object->n_interfaces - 1] = interface_type; return TRUE; } Bool ccsObjectRemoveInterface_(CCSObject *object, int interface_type) { unsigned int i = 0; if (!object->n_interfaces) return FALSE; const CCSInterface **o = object->interfaces; int *type = object->interface_types; for (; i < object->n_interfaces; ++i, ++o, ++type) { if (object->interface_types[i] == interface_type) break; } if (i >= object->n_interfaces) return FALSE; /* Now clear this section and move everything back */ object->interfaces[i] = NULL; ++i; const CCSInterface **oLast = o; int *typeLast = type; ++o; ++type; memmove ((void *) oLast, (void *)o, (object->n_interfaces - i) * sizeof (CCSInterface *)); memmove ((void *) typeLast, (void *) type, (object->n_interfaces - i) * sizeof (int)); --object->n_interfaces; if (!object->n_interfaces) { free (object->interfaces); free (object->interface_types); object->interfaces = NULL; object->interface_types = NULL; object->n_allocated_interfaces = 0; } return TRUE; } const CCSInterface * ccsObjectGetInterface_(CCSObject *object, int interface_type) { unsigned int i = 0; for (; i < object->n_interfaces; ++i) { if (object->interface_types[i] == interface_type) return object->interfaces[i]; } ccsError ("Unable to find interface type %i on %p\n" "This is either a programmer error or more than one static library \n" "defining this interface has been linked in\n" "Unable to continue, please file a bug about this\n", interface_type, object); abort (); return NULL; } CCSPrivate * ccsObjectGetPrivate_(CCSObject *object) { return object->priv; } void ccsObjectSetPrivate_(CCSObject *object, CCSPrivate *priv) { object->priv = priv; } void ccsObjectFinalize_(CCSObject *object) { if (object->priv) { (*object->object_allocation->free_) (object->object_allocation->allocator, object->priv); object->priv = NULL; } if (object->interfaces) { (*object->object_allocation->free_) (object->object_allocation->allocator, object->interfaces); object->interfaces = NULL; } if (object->interface_types) { (*object->object_allocation->free_) (object->object_allocation->allocator, object->interface_types); object->interface_types = NULL; } object->n_interfaces = 0; } unsigned int ccsAllocateType () { static unsigned int start = 0; ++start; return start; } INTERFACE_TYPE (CCSContextInterface) INTERFACE_TYPE (CCSPluginInterface) INTERFACE_TYPE (CCSSettingInterface) INTERFACE_TYPE (CCSBackendInterface); INTERFACE_TYPE (CCSDynamicBackendInterface); INTERFACE_TYPE (CCSIntegrationInterface); INTERFACE_TYPE (CCSIntegratedSettingInfoInterface); INTERFACE_TYPE (CCSIntegratedSettingInterface); INTERFACE_TYPE (CCSIntegratedSettingsStorageInterface); INTERFACE_TYPE (CCSIntegratedSettingFactoryInterface); Bool basicMetadata = FALSE; void ccsSetBasicMetadata (Bool value) { basicMetadata = value; } static void initGeneralOptions (CCSContext * context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); char *val = NULL; if (ccsConfigFileReadConfigOption (cPrivate->configFile, OptionBackend, &val)) { ccsSetBackend (context, val); if (val) free (val); } else ccsSetBackend (context, "ini"); if (ccsConfigFileReadConfigOption (cPrivate->configFile, OptionProfile, &val)) { ccsSetProfile (context, val); if (val) free (val); } else ccsSetProfile (context, ""); if (ccsConfigFileReadConfigOption (cPrivate->configFile, OptionIntegration, &val)) { ccsSetIntegrationEnabled (context, !strcasecmp (val, "true")); if (val) free (val); } else ccsSetIntegrationEnabled (context, TRUE); if (ccsConfigFileReadConfigOption (cPrivate->configFile, OptionAutoSort, &val)) { ccsSetPluginListAutoSort (context, !strcasecmp (val, "true")); if (val) free (val); } else ccsSetPluginListAutoSort (context, TRUE); } static void configChangeNotify (unsigned int watchId, void *closure) { CCSContext *context = (CCSContext *) closure; initGeneralOptions (context); ccsReadSettings (context); } CCSContext * ccsEmptyContextNew (unsigned int screenNum, CCSContextImportFromFile importFromFile, CCSScanForProfilesProc scanForProfiles, CCSBackendLoader *loader, CCSConfigFile *config, const CCSInterfaceTable *object_interfaces) { CCSContext *context; context = calloc (1, sizeof (CCSContext)); if (!context) return NULL; ccsObjectInit (context, &ccsDefaultObjectAllocator); CCSContextPrivate *ccsPrivate = calloc (1, sizeof (CCSContextPrivate)); if (!ccsPrivate) { free (context); return NULL; } ccsObjectSetPrivate (context, (CCSPrivate *) ccsPrivate); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); cPrivate->importFromFile = importFromFile; cPrivate->scanForProfiles = scanForProfiles; cPrivate->object_interfaces = object_interfaces; cPrivate->screenNum = screenNum; cPrivate->backendLoader = loader; cPrivate->configFile = config; ccsObjectAddInterface (context, (CCSInterface *) object_interfaces->contextInterface, GET_INTERFACE_TYPE (CCSContextInterface)); initGeneralOptions (context); ccsSetConfigWatchCallback (cPrivate->configFile, configChangeNotify, context); if (cPrivate->backend) ccsInfo ("Backend : %s", ccsDynamicBackendGetBackendName (cPrivate->backend)); ccsInfo ("Integration : %s", cPrivate->deIntegration ? "true" : "false"); ccsInfo ("Profile : %s", (cPrivate->profile && strlen (cPrivate->profile)) ? cPrivate->profile : "default"); return context; } static void * ccsContextGetPrivatePtrDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->privatePtr; } static void ccsContextSetPrivatePtrDefault (CCSContext *context, void *ptr) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); cPrivate->privatePtr = ptr; } static CCSPluginList ccsContextGetPluginsDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->plugins; } static CCSPluginCategory * ccsContextGetCategoriesDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->categories; } static CCSSettingList ccsContextGetChangedSettingsDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->changedSettings; } static unsigned int ccsContextGetScreenNumDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->screenNum; } static Bool ccsContextAddChangedSettingDefault (CCSContext *context, CCSSetting *setting) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); cPrivate->changedSettings = ccsSettingListAppend (cPrivate->changedSettings, setting); return TRUE; } static Bool ccsContextClearChangedSettingsDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); cPrivate->changedSettings = ccsSettingListFree (cPrivate->changedSettings, FALSE); return TRUE; } static CCSSettingList ccsContextStealChangedSettingsDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); CCSSettingList l = cPrivate->changedSettings; cPrivate->changedSettings = NULL; return l; } CCSPluginList ccsContextGetPlugins (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetPlugins) (context); } CCSPluginCategory * ccsContextGetCategories (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetCategories) (context); } CCSSettingList ccsContextGetChangedSettings (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetChangedSettings) (context); } unsigned int ccsContextGetScreenNum (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetScreenNum) (context); } Bool ccsContextAddChangedSetting (CCSContext *context, CCSSetting *setting) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextAddChangedSetting) (context, setting); } Bool ccsContextClearChangedSettings (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextClearChangedSettings) (context); } CCSSettingList ccsContextStealChangedSettings (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextStealChangedSettings) (context); } void * ccsContextGetPrivatePtr (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetPrivatePtr) (context); } void ccsContextSetPrivatePtr (CCSContext *context, void *ptr) { (*(GET_INTERFACE (CCSContextInterface, context))->contextSetPrivatePtr) (context, ptr); } void * ccsContextGetPluginsBindable (CCSContext *context) { return (void *) ccsContextGetPlugins (context); } void * ccsContextStealChangedSettingsBindable (CCSContext *context) { return (void *) ccsContextStealChangedSettings (context); } void * ccsContextGetChangedSettingsBindable (CCSContext *context) { return (void *) ccsContextGetChangedSettings (context); } static void ccsSetActivePluginList (CCSContext * context, CCSStringList list) { CCSPluginList l; CCSPlugin *plugin; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); for (l = cPrivate->plugins; l; l = l->next) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, l->data); pPrivate->active = FALSE; } for (; list; list = list->next) { plugin = ccsFindPlugin (context, ((CCSString *)list->data)->value); if (plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); pPrivate->active = TRUE; } } /* core plugin is always active */ plugin = ccsFindPlugin (context, "core"); if (plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); pPrivate->active = TRUE; } } static int profileNameFilter (const struct dirent *item) { int len = strlen (item->d_name); const char *lastEight = item->d_name + (len - 8); const char *lastFour = item->d_name + (len - 4); if (strcmp (lastFour, ".ini") == 0) return 1; if (strcmp (lastEight, item->d_name) == 0) return 1; return 0; } static CCSStringList scanDirectoryForProfiles (const char *directory) { struct dirent **nameList; int num = scandir (directory, &nameList, profileNameFilter, alphasort); if (num == -1) ccsError ("error occurred during scandir: %s", strerror (errno)); else if (num == 0) return NULL; else if (num > 0) { CCSStringList list = NULL; int i = 0; for (; i < num; ++i) { CCSString *string = calloc (1, sizeof (CCSString)); ccsStringRef (string); string->value = strdup (nameList[i]->d_name); list = ccsStringListAppend (list, string); free (nameList[i]); } free (nameList); return list; } return NULL; } CCSContext * ccsContextNew (unsigned int screenNum, const CCSInterfaceTable *iface) { CCSPlugin *p; CCSBackendLoader *loader = ccsSharedLibBackendLoaderNew (&ccsDefaultObjectAllocator); if (!loader) return NULL; CCSConfigFile *config = ccsInternalConfigFileNew (&ccsDefaultObjectAllocator); CCSContext *context = ccsEmptyContextNew (screenNum, ccsImportFromFile, scanDirectoryForProfiles, loader, config, iface); if (!context) return NULL; ccsLoadPlugins (context); /* Do settings upgrades */ ccsCheckForSettingsUpgrade (context); p = ccsFindPlugin (context, "core"); if (p) { CCSSetting *s; ccsLoadPluginSettings (p); /* initialize plugin->active values */ s = ccsFindSetting (p, "active_plugins"); if (s) { CCSStringList list; CCSSettingValueList vl; ccsGetList (s, &vl); list = ccsGetStringListFromValueList (vl); ccsSetActivePluginList (context, list); ccsStringListFree (list, TRUE); } } return context; } CCSPlugin * ccsFindPluginDefault (CCSContext * context, const char *name) { if (!name) name = ""; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); CCSPluginList l = cPrivate->plugins; while (l) { if (!strcmp (ccsPluginGetName (l->data), name)) return l->data; l = l->next; } return NULL; } CCSPlugin * ccsFindPlugin (CCSContext *context, const char *name) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextFindPlugin) (context, name); } CCSSetting * ccsFindSettingDefault (CCSPlugin * plugin, const char *name) { if (!plugin) return NULL; CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (!name) name = ""; if (!pPrivate->loaded) ccsLoadPluginSettings (plugin); CCSSettingList l = pPrivate->settings; while (l) { if (!strcmp (ccsSettingGetName (l->data), name)) return l->data; l = l->next; } return NULL; } CCSSetting * ccsFindSetting (CCSPlugin *plugin, const char *name) { if (!plugin) return NULL; return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginFindSetting) (plugin, name); } Bool ccsPluginIsActiveDefault (CCSContext * context, const char *name) { CCSPlugin *plugin; plugin = ccsFindPlugin (context, name); if (!plugin) return FALSE; CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->active; } Bool ccsPluginIsActive (CCSContext *context, const char *name) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextPluginIsActive) (context, name); } static void subGroupAdd (CCSSetting * setting, CCSGroup * group) { CCSSubGroupList l = group->subGroups; CCSSubGroup *subGroup; while (l) { if (!strcmp (l->data->name, ccsSettingGetSubGroup (setting))) { l->data->settings = ccsSettingListAppend (l->data->settings, setting); return; } l = l->next; } subGroup = calloc (1, sizeof (CCSSubGroup)); subGroup->refCount = 1; if (subGroup) { group->subGroups = ccsSubGroupListAppend (group->subGroups, subGroup); subGroup->name = strdup (ccsSettingGetSubGroup (setting)); subGroup->settings = ccsSettingListAppend (subGroup->settings, setting); } } static void groupAdd (CCSSetting * setting, CCSPluginPrivate * p) { CCSGroupList l = p->groups; CCSGroup *group; while (l) { if (!strcmp (l->data->name, ccsSettingGetGroup (setting))) { subGroupAdd (setting, l->data); return; } l = l->next; } group = calloc (1, sizeof (CCSGroup)); if (group) { group->refCount = 1; p->groups = ccsGroupListAppend (p->groups, group); group->name = strdup (ccsSettingGetGroup (setting)); subGroupAdd (setting, group); } } void collateGroups (CCSPluginPrivate * p) { CCSSettingList l = p->settings; while (l) { groupAdd (l->data, p); l = l->next; } } void ccsFreeContext (CCSContext *c) { if (!c) return; (*(GET_INTERFACE (CCSContextInterface, c))->contextDestructor) (c); } static void ccsFreeContextDefault (CCSContext * c) { if (!c) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, c); if (cPrivate->profile) free (cPrivate->profile); if (cPrivate->changedSettings) cPrivate->changedSettings = ccsSettingListFree (cPrivate->changedSettings, FALSE); if (cPrivate->backendLoader) ccsBackendLoaderUnref (cPrivate->backendLoader); if (cPrivate->configFile) ccsConfigFileUnref (cPrivate->configFile); ccsPluginListFree (cPrivate->plugins, TRUE); ccsObjectFinalize (c); free (c); } void ccsFreePlugin (CCSPlugin *p) { if (!p) return; (*(GET_INTERFACE (CCSPluginInterface, p))->pluginDestructor) (p); } static void ccsFreePluginDefault (CCSPlugin * p) { if (!p) return; CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, p); free (pPrivate->name); free (pPrivate->shortDesc); free (pPrivate->longDesc); free (pPrivate->hints); free (pPrivate->category); ccsStringListFree (pPrivate->loadAfter, TRUE); ccsStringListFree (pPrivate->loadBefore, TRUE); ccsStringListFree (pPrivate->requiresPlugin, TRUE); ccsStringListFree (pPrivate->conflictPlugin, TRUE); ccsStringListFree (pPrivate->conflictFeature, TRUE); ccsStringListFree (pPrivate->providesFeature, TRUE); ccsStringListFree (pPrivate->requiresFeature, TRUE); ccsSettingListFree (pPrivate->settings, TRUE); ccsGroupListFree (pPrivate->groups, TRUE); ccsStrExtensionListFree (pPrivate->stringExtensions, TRUE); if (pPrivate->xmlFile) free (pPrivate->xmlFile); if (pPrivate->xmlPath) free (pPrivate->xmlPath); #ifdef USE_PROTOBUF if (pPrivate->pbFilePath) free (pPrivate->pbFilePath); #endif ccsObjectFinalize (p); free (p); } void ccsCleanupSettingInfo (CCSSettingInfo *info, CCSSettingType type) { switch (type) { case TypeInt: ccsIntDescListFree (info->forInt.desc, TRUE); break; case TypeString: ccsStrRestrictionListFree (info->forString.restriction, TRUE); break; case TypeList: if (info->forList.listType == TypeInt) ccsIntDescListFree (info->forList.listInfo-> forInt.desc, TRUE); free (info->forList.listInfo); break; default: break; } } static void ccsFreeSettingDefault (CCSSetting *s) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, s); free (sPrivate->name); free (sPrivate->shortDesc); free (sPrivate->longDesc); free (sPrivate->group); free (sPrivate->subGroup); free (sPrivate->hints); if (&sPrivate->defaultValue != sPrivate->value) { ccsFreeSettingValue (sPrivate->value); } ccsCleanupSettingInfo (&sPrivate->info, sPrivate->type); ccsFreeSettingValue (&sPrivate->defaultValue); ccsObjectFinalize (s); free (s); } void ccsFreeSetting (CCSSetting * s) { if (!s) return; (*(GET_INTERFACE (CCSSettingInterface, s))->settingDestructor) (s); } void ccsFreeGroup (CCSGroup * g) { if (!g) return; free (g->name); ccsSubGroupListFree (g->subGroups, TRUE); free (g); } void ccsFreeSubGroup (CCSSubGroup * s) { if (!s) return; free (s->name); ccsSettingListFree (s->settings, FALSE); free (s); } static void ccsFreeSettingValueCommon (CCSSettingValue *v, CCSSettingType type) { switch (type) { case TypeString: free (v->value.asString); break; case TypeMatch: free (v->value.asMatch); break; case TypeList: if (!v->isListChild) ccsSettingValueListFree (v->value.asList, TRUE); break; default: break; } } void ccsFreeSettingValue (CCSSettingValue * v) { if (!v) return; if (!v->parent) { ccsError ("cannot free value without parent - use ccsFreeSettingValueWithType and specify type instead"); return; } CCSSettingType type = ccsSettingGetType (v->parent); if (v->isListChild) type = ccsSettingGetInfo (v->parent)->forList.listType; ccsFreeSettingValueCommon (v, type); /* List children cannot be a default value */ if (v->isListChild || v != ccsSettingGetDefaultValue (v->parent)) free (v); } void ccsFreeSettingValueWithType (CCSSettingValue *v, CCSSettingType type) { ccsFreeSettingValueCommon (v, type); free (v); } void ccsFreePluginConflict (CCSPluginConflict * c) { if (!c) return; free (c->value); ccsPluginListFree (c->plugins, FALSE); free (c); } CCSBackendInfo * ccsCopyBackendInfoFromBackend (CCSBackend *backend, const CCSBackendInterface *interface) { const CCSBackendInfo *backendInfo = (*interface->backendGetInfo) (backend); if (!backendInfo) return NULL; CCSBackendInfo *info = calloc (1, sizeof (CCSBackendInfo)); if (!info) return NULL; memcpy (info, backendInfo, sizeof (CCSBackendInfo)); /* This is an abuse here - * in order to minimize code duplication ccsGetBackendInfo returns * const static data, but when we're dealing with the copies we're * dealing with heap allocated memory, since you can't access the * const data in the case that the libraries are not open. * Thus the cast. */ info->name = (const char *) strdup (backendInfo->name); info->shortDesc = (const char *) strdup (backendInfo->shortDesc); info->longDesc = (const char *) strdup (backendInfo->longDesc); return info; } void ccsFreeBackendInfo (CCSBackendInfo *b) { if (b->name) free ((char *) b->name); if (b->shortDesc) free ((char *) b->shortDesc); if (b->longDesc) free ((char *) b->longDesc); free (b); } void ccsFreeIntDesc (CCSIntDesc * i) { if (!i) return; if (i->name) free (i->name); free (i); } void ccsFreeStrRestriction (CCSStrRestriction * r) { if (!r) return; if (r->name) free (r->name); if (r->value) free (r->value); free (r); } void ccsFreeStrExtension (CCSStrExtension *e) { if (!e) return; if (e->basePlugin) free (e->basePlugin); ccsStringListFree (e->baseSettings, TRUE); ccsStrRestrictionListFree (e->restriction, TRUE); free (e); } void ccsFreeString (CCSString *str) { if (str->value) free (str->value); free (str); } CCSREF (String, CCSString) CCSREF (Group, CCSGroup) CCSREF (SubGroup, CCSSubGroup) CCSREF (SettingValue, CCSSettingValue) CCSREF (PluginConflict, CCSPluginConflict) CCSREF (BackendInfo, CCSBackendInfo) CCSREF (IntDesc, CCSIntDesc) CCSREF (StrRestriction, CCSStrRestriction) CCSREF (StrExtension, CCSStrExtension) CCSREF_OBJ (Plugin, CCSPlugin) CCSREF_OBJ (Setting, CCSSetting) CCSREF_OBJ (Backend, CCSBackend) CCSREF_OBJ (DynamicBackend, CCSDynamicBackend) CCSREF_OBJ (Integration, CCSIntegration) CCSREF_OBJ (IntegratedSetting, CCSIntegratedSetting); CCSREF_OBJ (IntegratedSettingInfo, CCSIntegratedSettingInfo); CCSREF_OBJ (IntegratedSettingFactory, CCSIntegratedSettingFactory); CCSREF_OBJ (IntegratedSettingsStorage, CCSIntegratedSettingsStorage); void ccsFreeBackend (CCSBackend *backend) { ccsObjectFinalize (backend); free (backend); } void ccsFreeDynamicBackend (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); ccsBackendFini (dbPrivate->backend); ccsBackendUnref (dbPrivate->backend); if (dbPrivate->dlhand) dlclose (dbPrivate->dlhand); ccsObjectFinalize (backend); free (backend); } CCSBackend * ccsBackendNewWithDynamicInterface (CCSContext *context, const CCSBackendInterface *interface) { CCSBackend *backend = calloc (1, sizeof (CCSBackend)); ccsObjectInit (backend, &ccsDefaultObjectAllocator); ccsBackendRef (backend); ccsObjectAddInterface (backend, (CCSInterface *) interface, GET_INTERFACE_TYPE (CCSBackendInterface)); return backend; } Bool ccsSetBackendDefault (CCSContext * context, char *name) { Bool fallbackMode = FALSE; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (cPrivate->backend) { /* no action needed if the backend is the same */ if (strcmp (ccsDynamicBackendGetBackendName (cPrivate->backend), name) == 0) return TRUE; ccsDynamicBackendUnref (cPrivate->backend); cPrivate->backend = NULL; } CCSBackend *backend = ccsBackendLoaderLoadBackend (cPrivate->backendLoader, cPrivate->object_interfaces, context, name); if (!backend) { ccsWarning ("unable to open backend %s, falling back to ini", name); backend = ccsBackendLoaderLoadBackend (cPrivate->backendLoader, cPrivate->object_interfaces, context, "ini"); if (!backend) { ccsError ("failed to open any backends, aborting"); abort (); } fallbackMode = TRUE; } cPrivate->backend = (CCSDynamicBackend *) backend; CCSBackendInitFunc backendInit = (GET_INTERFACE (CCSBackendInterface, cPrivate->backend))->backendInit; if (backendInit) (*backendInit) ((CCSBackend *) cPrivate->backend, context); if (!fallbackMode) ccsConfigFileWriteConfigOption (cPrivate->configFile, OptionBackend, name); return TRUE; } Bool ccsSetBackend (CCSContext *context, char *name) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextSetBackend) (context, name); } CCSIntegratedSetting * ccsIntegrationGetIntegratedSetting (CCSIntegration *integration, const char *pluginName, const char *settingName) { return (*(GET_INTERFACE (CCSIntegrationInterface, integration))->getIntegratedSetting) (integration, pluginName, settingName); } Bool ccsIntegrationReadOptionIntoSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting) { return (*(GET_INTERFACE (CCSIntegrationInterface, integration))->readOptionIntoSetting) (integration, context, setting, integratedSetting); } void ccsIntegrationWriteSettingIntoOption (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting) { (*(GET_INTERFACE (CCSIntegrationInterface, integration))->writeSettingIntoOption) (integration, context, setting, integratedSetting); } void ccsIntegrationUpdateIntegratedSettings (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList integratedSettings) { (*(GET_INTERFACE (CCSIntegrationInterface, integration))->updateIntegratedSettings) (integration, context, integratedSettings); } void ccsIntegrationDisallowIntegratedWrites (CCSIntegration *integration) { (*(GET_INTERFACE (CCSIntegrationInterface, integration))->disallowIntegratedWrites) (integration); } void ccsIntegrationAllowIntegratedWrites (CCSIntegration *integration) { (*(GET_INTERFACE (CCSIntegrationInterface, integration))->allowIntegratedWrites) (integration); } void ccsFreeIntegration (CCSIntegration *integration) { (*(GET_INTERFACE (CCSIntegrationInterface, integration))->freeIntegrationBackend) (integration); } static CCSIntegratedSetting * ccsNullIntegrationBackendGetIntegratedSetting (CCSIntegration *integration, const char *pluginName, const char *settingName) { return NULL; } static Bool ccsNullIntegrationBackendReadOptionIntoSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integrated) { return FALSE; } static void ccsNullIntegrationBackendWriteSettingIntoOption (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integrated) { } static void ccsNullIntegrationBackendUpdateIntegratedSettings (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList settings) { } void ccsNullIntegrationBackendFree (CCSIntegration *integration) { ccsObjectFinalize (integration); (*integration->object.object_allocation->free_) (integration->object.object_allocation->allocator, integration); } const CCSIntegrationInterface ccsNullIntegrationBackendInterface = { ccsNullIntegrationBackendGetIntegratedSetting, ccsNullIntegrationBackendReadOptionIntoSetting, ccsNullIntegrationBackendWriteSettingIntoOption, ccsNullIntegrationBackendUpdateIntegratedSettings, ccsNullIntegrationBackendFree }; CCSIntegration * ccsNullIntegrationBackendNew (CCSObjectAllocationInterface *ai) { CCSIntegration *integration = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegration)); if (!integration) return NULL; ccsObjectInit (integration, ai); ccsObjectAddInterface (integration, (const CCSInterface *) &ccsNullIntegrationBackendInterface, GET_INTERFACE_TYPE (CCSIntegrationInterface)); return integration; } const CCSBackendInfo * ccsBackendGetInfo (CCSBackend *backend) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->backendGetInfo) (backend); } static Bool ccsDynamicBackendSupportsIntegrationDefault (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendGetInfo (dbPrivate->backend)->integrationSupport; } const char * ccsDynamicBackendGetBackendName (CCSDynamicBackend *backend) { return (*(GET_INTERFACE (CCSDynamicBackendInterface, backend))->getBackendName) (backend); } Bool ccsDynamicBackendSupportsRead (CCSDynamicBackend *backend) { return (*(GET_INTERFACE (CCSDynamicBackendInterface, backend))->supportsRead) (backend); } Bool ccsDynamicBackendSupportsWrite (CCSDynamicBackend *backend) { return (*(GET_INTERFACE (CCSDynamicBackendInterface, backend))->supportsWrite) (backend); } Bool ccsDynamicBackendSupportsProfiles (CCSDynamicBackend *backend) { return (*(GET_INTERFACE (CCSDynamicBackendInterface, backend))->supportsProfiles) (backend); } Bool ccsDynamicBackendSupportsIntegration (CCSDynamicBackend *backend) { return (*(GET_INTERFACE (CCSDynamicBackendInterface, backend))->supportsIntegration) (backend); } CCSBackend * ccsDynamicBackendGetRawBackend (CCSDynamicBackend *backend) { return (*(GET_INTERFACE (CCSDynamicBackendInterface, backend))->getRawBackend) (backend); } Bool ccsBackendHasExecuteEvents (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->executeEvents != NULL; } void ccsBackendExecuteEvents (CCSBackend *backend, unsigned int flags) { (*(GET_INTERFACE (CCSBackendInterface, backend))->executeEvents) (backend, flags); } Bool ccsBackendInit (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->backendInit) (backend, context); } Bool ccsBackendFini (CCSBackend *backend) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->backendFini) (backend); } static Bool ccsBackendHasReadInit (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->readInit != NULL; } Bool ccsBackendReadInit (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->readInit) (backend, context); } static Bool ccsBackendHasReadSetting (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->readSetting != NULL; } void ccsBackendReadSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { (*(GET_INTERFACE (CCSBackendInterface, backend))->readSetting) (backend, context, setting); } static Bool ccsBackendHasReadDone (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->readDone != NULL; } void ccsBackendReadDone (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->readDone) (backend, context); } static Bool ccsBackendHasWriteInit (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->writeInit != NULL; } Bool ccsBackendWriteInit (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->writeInit) (backend, context); } static Bool ccsBackendHasWriteSetting (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->writeSetting != NULL; } void ccsBackendWriteSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { (*(GET_INTERFACE (CCSBackendInterface, backend))->writeSetting) (backend, context, setting); } static Bool ccsBackendHasWriteDone (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->writeDone != NULL; } void ccsBackendWriteDone (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->writeDone) (backend, context); } static Bool ccsBackendHasUpdateSetting (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->updateSetting != NULL; } void ccsBackendUpdateSetting (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->updateSetting) (backend, context, plugin, setting); } static Bool ccsBackendHasGetSettingIsIntegrated (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->getSettingIsIntegrated != NULL; } Bool ccsBackendGetSettingIsIntegrated (CCSBackend *backend, CCSSetting *setting) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->getSettingIsIntegrated) (backend, setting); } static Bool ccsBackendHasGetSettingIsReadOnly (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->getSettingIsReadOnly != NULL; } Bool ccsBackendGetSettingIsReadOnly (CCSBackend *backend, CCSSetting *setting) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->getSettingIsReadOnly) (backend, setting); } static Bool ccsBackendHasGetExistingProfiles (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->getExistingProfiles != NULL; } CCSStringList ccsBackendGetExistingProfiles (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->getExistingProfiles) (backend, context); } static Bool ccsBackendHasDeleteProfile (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->deleteProfile != NULL; } Bool ccsBackendDeleteProfile (CCSBackend *backend, CCSContext *context, char *name) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->deleteProfile) (backend, context, name); } static Bool ccsBackendHasSetIntegration (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->setIntegration != NULL; } void ccsBackendSetIntegration (CCSBackend *backend, CCSIntegration *integration) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->setIntegration) (backend, integration); } static const char * ccsDynamicBackendGetBackendNameDefault (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendGetInfo (dbPrivate->backend)->name; } static Bool ccsDynamicBackendSupportsReadDefault (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendHasReadSetting (dbPrivate->backend); } static Bool ccsDynamicBackendSupportsWriteDefault (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendHasWriteSetting (dbPrivate->backend); } static Bool ccsDynamicBackendSupportsProfilesDefault (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendGetInfo (dbPrivate->backend)->profileSupport; } static CCSBackend * ccsDynamicBackendGetRawBackendDefault (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return dbPrivate->backend; } static const CCSBackendInfo * ccsDynamicBackendGetInfoWrapper (CCSBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendGetInfo (dbPrivate->backend); } static Bool ccsDynamicBackendInitWrapper (CCSBackend *backend, CCSContext *context) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendInit (dbPrivate->backend, context); } static Bool ccsDynamicBackendFiniWrapper (CCSBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendFini (dbPrivate->backend); } static void ccsDynamicBackendExecuteEventsWrapper (CCSBackend *backend, unsigned int flags) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasExecuteEvents (dbPrivate->backend)) ccsBackendExecuteEvents (dbPrivate->backend, flags); } static Bool ccsDynamicBackendReadInitWrapper (CCSBackend *backend, CCSContext *context) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasReadInit (dbPrivate->backend)) return ccsBackendReadInit (dbPrivate->backend, context); return TRUE; } static void ccsDynamicBackendReadSettingWrapper (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasReadSetting (dbPrivate->backend)) ccsBackendReadSetting (dbPrivate->backend, context, setting); } static void ccsDynamicBackendReadDoneWrapper (CCSBackend *backend, CCSContext *context) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasReadDone (dbPrivate->backend)) ccsBackendReadDone (dbPrivate->backend, context); } static Bool ccsDynamicBackendWriteInitWrapper (CCSBackend *backend, CCSContext *context) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasWriteInit (dbPrivate->backend)) return ccsBackendWriteInit (dbPrivate->backend, context); return TRUE; } static void ccsDynamicBackendWriteSettingWrapper (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasWriteSetting (dbPrivate->backend)) ccsBackendWriteSetting (dbPrivate->backend, context, setting); } static void ccsDynamicBackendWriteDoneWrapper (CCSBackend *backend, CCSContext *context) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasWriteDone (dbPrivate->backend)) ccsBackendWriteDone (dbPrivate->backend, context); } static void ccsDynamicBackendUpdateSettingWrapper (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasUpdateSetting (dbPrivate->backend)) ccsBackendUpdateSetting (dbPrivate->backend, context, plugin, setting); } static Bool ccsDynamicBackendGetSettingIsIntegratedWrapper (CCSBackend *backend, CCSSetting *setting) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasGetSettingIsIntegrated (dbPrivate->backend) && ccsDynamicBackendSupportsIntegration ((CCSDynamicBackend *) backend)) return ccsBackendGetSettingIsIntegrated (dbPrivate->backend, setting); return FALSE; } static Bool ccsDynamicBackendGetSettingIsReadOnlyWrapper (CCSBackend *backend, CCSSetting *setting) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasGetSettingIsReadOnly (dbPrivate->backend)) return ccsBackendGetSettingIsReadOnly (dbPrivate->backend, setting); return FALSE; } static CCSStringList ccsDynamicBackendGetExistingProfilesWrapper (CCSBackend *backend, CCSContext *context) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasGetExistingProfiles (dbPrivate->backend) && ccsDynamicBackendSupportsProfiles ((CCSDynamicBackend *) backend)) return ccsBackendGetExistingProfiles (dbPrivate->backend, context); static CCSStringList sl = NULL; return sl; } static Bool ccsDynamicBackendDeleteProfileWrapper (CCSBackend *backend, CCSContext *context, char *profile) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasDeleteProfile (dbPrivate->backend) && ccsDynamicBackendSupportsProfiles ((CCSDynamicBackend *) backend)) return ccsBackendDeleteProfile (dbPrivate->backend, context, profile); return FALSE; } static void ccsDynamicBackendSetIntegrationWrapper (CCSBackend *backend, CCSIntegration *integration) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasSetIntegration (backend) && ccsDynamicBackendSupportsIntegration ((CCSDynamicBackend *) backend)) return ccsBackendSetIntegration (dbPrivate->backend, integration); } Bool ccsCompareLists (CCSSettingValueList l1, CCSSettingValueList l2, CCSSettingListInfo info) { while (l1 && l2) { switch (info.listType) { case TypeInt: if (l1->data->value.asInt != l2->data->value.asInt) return FALSE; break; case TypeBool: { Bool bothTrue = (l1->data->value.asBool && l2->data->value.asBool); Bool bothFalse = (!l1->data->value.asBool && !l2->data->value.asBool); /* Use the boolean operators as TRUE/FALSE can be redefined */ if (!bothTrue && !bothFalse) return FALSE; } break; case TypeFloat: if (l1->data->value.asFloat != l2->data->value.asFloat) return FALSE; break; case TypeString: if (strcmp (l1->data->value.asString, l2->data->value.asString)) return FALSE; break; case TypeMatch: if (strcmp (l1->data->value.asMatch, l2->data->value.asMatch)) return FALSE; break; case TypeKey: if (!ccsIsEqualKey (l1->data->value.asKey, l2->data->value.asKey)) return FALSE; break; case TypeButton: if (!ccsIsEqualButton (l1->data->value.asButton, l2->data->value.asButton)) return FALSE; break; case TypeEdge: if (l1->data->value.asEdge != l2->data->value.asEdge) return FALSE; break; case TypeBell: if (l1->data->value.asBell != l2->data->value.asBell) return FALSE; break; case TypeColor: if (!ccsIsEqualColor (l1->data->value.asColor, l2->data->value.asColor)) return FALSE; break; default: return FALSE; break; } l1 = l1->next; l2 = l2->next; } if ((!l1 && l2) || (l1 && !l2)) return FALSE; return TRUE; } void ccsCopyInfo (const CCSSettingInfo *from, CCSSettingInfo *to, CCSSettingType type) { memcpy (to, from, sizeof (CCSSettingInfo)); switch (type) { case TypeInt: { CCSIntDescList idl = from->forInt.desc; to->forInt = from->forInt; to->forInt.desc = NULL; while (idl) { CCSIntDesc *id = malloc (sizeof (CCSIntDesc)); if (!idl->data) { free (id); idl = idl->next; continue; } memcpy (id, idl->data, sizeof (CCSIntDesc)); id->name = strdup (idl->data->name); id->refCount = 1; to->forInt.desc = ccsIntDescListAppend (to->forInt.desc, id); idl = idl->next; } break; } case TypeFloat: to->forFloat = from->forFloat; break; case TypeString: { CCSStrRestrictionList srl = from->forString.restriction; to->forString = from->forString; to->forString.restriction = NULL; while (srl) { CCSStrRestriction *sr = malloc (sizeof (CCSStrRestriction)); if (!srl->data) { srl = srl->next; free (sr); continue; } memcpy (sr, srl->data, sizeof (CCSStrRestriction)); sr->name = strdup (srl->data->name); sr->value = strdup (srl->data->value); sr->refCount = 1; to->forString.restriction = ccsStrRestrictionListAppend (to->forString.restriction, sr); srl = srl->next; } break; } case TypeList: { if (from->forList.listInfo) { to->forList.listInfo = calloc (1, sizeof (CCSSettingInfo)); ccsCopyInfo (from->forList.listInfo, to->forList.listInfo, from->forList.listType); } break; } case TypeAction: to->forAction.internal = from->forAction.internal; break; default: break; } } static void copyValue (CCSSettingValue * from, CCSSettingValue * to) { memcpy (to, from, sizeof (CCSSettingValue)); CCSSettingType type = ccsSettingGetType (from->parent); if (from->isListChild) type = ccsSettingGetInfo (from->parent)->forList.listType; switch (type) { case TypeString: to->value.asString = strdup (from->value.asString); break; case TypeMatch: to->value.asMatch = strdup (from->value.asMatch); break; case TypeList: to->value.asList = NULL; CCSSettingValueList l = from->value.asList; while (l) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) break; copyValue (l->data, value); value->refCount = 1; to->value.asList = ccsSettingValueListAppend (to->value.asList, value); l = l->next; } break; default: break; } } /* TODO: CCSSetting is not meant to be copyable ... remove */ static void copySetting (CCSSetting *from, CCSSetting *to) { /* Allocate a new private ptr for the new setting */ CCSSettingPrivate *ccsPrivate = calloc (1, sizeof (CCSSettingPrivate)); ccsObjectSetPrivate (to, (CCSPrivate *) ccsPrivate); unsigned int i = 0; /* copy interfaces */ for (; i < from->object.n_interfaces; ++i) ccsObjectAddInterface (to, from->object.interfaces[i], from->object.interface_types[i]); CCSSettingPrivate *fromPrivate = (CCSSettingPrivate *) ccsObjectGetPrivate (from); CCSSettingPrivate *toPrivate = (CCSSettingPrivate *) ccsObjectGetPrivate (to); /* copy from fromPrivate to toPrivate for now, and replace all * fields that should be replaced */ memcpy (toPrivate, fromPrivate, sizeof (CCSSettingPrivate)); if (fromPrivate->name) toPrivate->name = strdup (fromPrivate->name); if (fromPrivate->shortDesc) toPrivate->shortDesc = strdup (fromPrivate->shortDesc); if (fromPrivate->longDesc) toPrivate->longDesc = strdup (fromPrivate->longDesc); if (fromPrivate->group) toPrivate->group = strdup (fromPrivate->group); if (fromPrivate->subGroup) toPrivate->subGroup = strdup (fromPrivate->subGroup); if (fromPrivate->hints) toPrivate->hints = strdup (fromPrivate->hints); if (fromPrivate->value) { toPrivate->value = malloc (sizeof (CCSSettingValue)); if (!fromPrivate->value) return; copyValue (fromPrivate->value, toPrivate->value); toPrivate->value->refCount = 1; toPrivate->value->parent = to; } copyValue (&fromPrivate->defaultValue, &toPrivate->defaultValue); ccsCopyInfo (&fromPrivate->info, &toPrivate->info, fromPrivate->type); toPrivate->defaultValue.parent = to; toPrivate->privatePtr = NULL; ccsSettingRef (to); } static void copyFromDefault (CCSSetting * setting) { CCSSettingValue *value; CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (sPrivate->value != &sPrivate->defaultValue) ccsFreeSettingValue (sPrivate->value); value = calloc (1, sizeof (CCSSettingValue)); if (!value) { sPrivate->value = &sPrivate->defaultValue; sPrivate->isDefault = TRUE; return; } value->refCount = 1; copyValue (&sPrivate->defaultValue, value); sPrivate->value = value; sPrivate->isDefault = FALSE; } void ccsSettingResetToDefaultDefault (CCSSetting * setting, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->value != &sPrivate->defaultValue) { ccsFreeSettingValue (sPrivate->value); if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); } sPrivate->value = &sPrivate->defaultValue; sPrivate->isDefault = TRUE; } Bool ccsCheckValueEq (const CCSSettingValue *rhs, CCSSettingType rhsType, CCSSettingInfo *rhsInfo, const CCSSettingValue *lhs, CCSSettingType lhsType, CCSSettingInfo *lhsInfo) { CCSSettingType type; if (rhsType != lhsType) { ccsWarning ("Attempted to check equality between mismatched types!"); return FALSE; } if (rhs->isListChild) type = rhsInfo->forList.listType; else type = rhsType; switch (type) { case TypeInt: return lhs->value.asInt == rhs->value.asInt; case TypeBool: return lhs->value.asBool == rhs->value.asBool; case TypeFloat: return lhs->value.asFloat == rhs->value.asFloat; case TypeMatch: return strcmp (lhs->value.asMatch, rhs->value.asMatch) == 0; case TypeString: return strcmp (lhs->value.asString, rhs->value.asString) == 0; case TypeColor: return ccsIsEqualColor (lhs->value.asColor, rhs->value.asColor); case TypeKey: return ccsIsEqualKey (lhs->value.asKey, rhs->value.asKey); case TypeButton: return ccsIsEqualButton (lhs->value.asButton, rhs->value.asButton); case TypeEdge: return lhs->value.asEdge == rhs->value.asEdge; case TypeBell: return lhs->value.asBell == rhs->value.asBell; case TypeAction: ccsWarning ("Actions are not comparable!"); return FALSE; case TypeList: { return ccsCompareLists (lhs->value.asList, rhs->value.asList, lhsInfo->forList); } default: break; } ccsWarning ("Failed to check equality for value with type %i", lhsType); return FALSE; } /* FIXME: That's a lot of code for the sake of type switching ... * maybe we need to switch to C++ here and use templates ... */ CCSSetStatus ccsSettingSetIntDefault (CCSSetting * setting, int data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (ccsSettingGetType (setting) != TypeInt) return SetFailed; if (sPrivate->isDefault && (sPrivate->defaultValue.value.asInt == data)) return SetIsDefault; if (!sPrivate->isDefault && (sPrivate->defaultValue.value.asInt == data)) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (sPrivate->value->value.asInt == data) return SetToSameValue; if ((data < sPrivate->info.forInt.min) || (data > sPrivate->info.forInt.max)) return SetFailed; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asInt = data; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetFloatDefault (CCSSetting * setting, float data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (ccsSettingGetType (setting) != TypeFloat) return SetFailed; if (sPrivate->isDefault && (sPrivate->defaultValue.value.asFloat == data)) return SetIsDefault; if (!sPrivate->isDefault && (sPrivate->defaultValue.value.asFloat == data)) { ccsResetToDefault (setting, processChanged); return SetToDefault; } /* allow the values to differ a tiny bit because of possible rounding / precision issues */ if (fabs (sPrivate->value->value.asFloat - data) < 1e-5) return SetToSameValue; if ((data < sPrivate->info.forFloat.min) || (data > sPrivate->info.forFloat.max)) return SetFailed; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asFloat = data; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetBoolDefault (CCSSetting * setting, Bool data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (ccsSettingGetType (setting) != TypeBool) return SetFailed; if (sPrivate->isDefault && ((sPrivate->defaultValue.value.asBool && data) || (!sPrivate->defaultValue.value.asBool && !data))) return SetIsDefault; if (!sPrivate->isDefault && ((sPrivate->defaultValue.value.asBool && data) || (!sPrivate->defaultValue.value.asBool && !data))) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if ((sPrivate->value->value.asBool && data) || (!sPrivate->value->value.asBool && !data)) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asBool = data; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetStringDefault (CCSSetting * setting, const char *data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (ccsSettingGetType (setting) != TypeString) return SetFailed; if (!data) return SetFailed; Bool isDefault = strcmp (sPrivate->defaultValue.value.asString, data) == 0; if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (!strcmp (sPrivate->value->value.asString, data)) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); free (sPrivate->value->value.asString); sPrivate->value->value.asString = strdup (data); if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetColorDefault (CCSSetting * setting, CCSSettingColorValue data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (ccsSettingGetType (setting) != TypeColor) return SetFailed; CCSSettingColorValue defValue = sPrivate->defaultValue.value.asColor; Bool isDefault = ccsIsEqualColor (defValue, data); if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (ccsIsEqualColor (sPrivate->value->value.asColor, data)) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asColor = data; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetMatchDefault (CCSSetting * setting, const char *data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (ccsSettingGetType (setting) != TypeMatch) return SetFailed; if (!data) return SetFailed; Bool isDefault = strcmp (sPrivate->defaultValue.value.asMatch, data) == 0; if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (!strcmp (sPrivate->value->value.asMatch, data)) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); free (sPrivate->value->value.asMatch); sPrivate->value->value.asMatch = strdup (data); if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetKeyDefault (CCSSetting * setting, CCSSettingKeyValue data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (ccsSettingGetType (setting) != TypeKey) return SetFailed; CCSSettingKeyValue defValue = sPrivate->defaultValue.value.asKey; Bool isDefault = ccsIsEqualKey (data, defValue); if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (ccsIsEqualKey (sPrivate->value->value.asKey, data)) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asKey.keysym = data.keysym; sPrivate->value->value.asKey.keyModMask = data.keyModMask; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetButtonDefault (CCSSetting * setting, CCSSettingButtonValue data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (ccsSettingGetType (setting) != TypeButton) return SetFailed; CCSSettingButtonValue defValue = sPrivate->defaultValue.value.asButton; Bool isDefault = ccsIsEqualButton (data, defValue); if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (ccsIsEqualButton (sPrivate->value->value.asButton, data)) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asButton.button = data.button; sPrivate->value->value.asButton.buttonModMask = data.buttonModMask; sPrivate->value->value.asButton.edgeMask = data.edgeMask; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetEdgeDefault (CCSSetting * setting, unsigned int data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (ccsSettingGetType (setting) != TypeEdge) return SetFailed; Bool isDefault = (data == sPrivate->defaultValue.value.asEdge); if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (sPrivate->value->value.asEdge == data) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asEdge = data; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetBellDefault (CCSSetting * setting, Bool data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (ccsSettingGetType (setting) != TypeBell) return SetFailed; Bool isDefault = (data == sPrivate->defaultValue.value.asBool); if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (sPrivate->value->value.asBell == data) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asBell = data; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } Bool ccsCopyValueInto (const CCSSettingValue *from, CCSSettingValue *to, CCSSettingType type, CCSSettingInfo *info) { to->parent = from->parent; to->isListChild = from->isListChild; CCSSettingType vType = to->isListChild ? info->forList.listType : type; switch (vType) { case TypeInt: to->value.asInt = from->value.asInt; break; case TypeBool: to->value.asBool = from->value.asBool; break; case TypeFloat: to->value.asFloat = from->value.asFloat; break; case TypeString: to->value.asString = strdup (from->value.asString); break; case TypeMatch: to->value.asMatch = strdup (from->value.asMatch); break; case TypeKey: memcpy (&to->value.asKey, &from->value.asKey, sizeof (CCSSettingKeyValue)); break; case TypeButton: memcpy (&to->value.asButton, &from->value.asButton, sizeof (CCSSettingButtonValue)); break; case TypeEdge: to->value.asEdge = from->value.asEdge; break; case TypeBell: to->value.asBell = from->value.asBell; break; case TypeColor: memcpy (&to->value.asColor, &from->value.asColor, sizeof (CCSSettingColorValue)); break; case TypeList: assert (from->parent != NULL); to->value.asList = ccsCopyList (from->value.asList, from->parent); break; default: ccsError ("unexpected setting type in ccsCopyValueInto"); return FALSE; break; } return TRUE; } CCSSettingValue * ccsCopyValue (const CCSSettingValue *orig, CCSSettingType type, CCSSettingInfo *info) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return NULL; value->refCount = 1; if (!ccsCopyValueInto (orig, value, type, info)) { free (value); return NULL; } return value; } CCSSettingValueList ccsCopyList (CCSSettingValueList l1, CCSSetting * setting) { CCSSettingInfo *info = ccsSettingGetInfo (setting); CCSSettingType type = ccsSettingGetType (setting); CCSSettingValueList l2 = NULL; while (l1) { CCSSettingValue *value = ccsCopyValue (l1->data, type, info); /* FIXME If l2 != NULL, we leak l2 */ if (!value) return l2; l2 = ccsSettingValueListAppend (l2, value); l1 = l1->next; } return l2; } CCSSetStatus ccsSettingSetListDefault (CCSSetting * setting, CCSSettingValueList data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (ccsSettingGetType (setting) != TypeList) return SetFailed; Bool isDefault = ccsCompareLists (sPrivate->defaultValue.value.asList, data, sPrivate->info.forList); /* Don't need to worry about default values * when processChanged is off since use of that * API wants direct access to ths list for * temporary storage */ if (!processChanged) { if (sPrivate->isDefault && isDefault) { return SetIsDefault; } if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } } if (ccsCompareLists (sPrivate->value->value.asList, data, sPrivate->info.forList)) { return SetToSameValue; } if (sPrivate->isDefault) copyFromDefault (setting); ccsSettingValueListFree (sPrivate->value->value.asList, TRUE); sPrivate->value->value.asList = ccsCopyList (data, setting); if ((strcmp (sPrivate->name, "active_plugins") == 0) && (strcmp (ccsPluginGetName (sPrivate->parent), "core") == 0) && processChanged) { CCSStringList list; list = ccsGetStringListFromValueList (sPrivate->value->value.asList); ccsSetActivePluginList (ccsPluginGetContext (sPrivate->parent), list); ccsStringListFree (list, TRUE); } if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetValueDefault (CCSSetting * setting, CCSSettingValue * data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); switch (sPrivate->type) { case TypeInt: return ccsSetInt (setting, data->value.asInt, processChanged); break; case TypeFloat: return ccsSetFloat (setting, data->value.asFloat, processChanged); break; case TypeBool: return ccsSetBool (setting, data->value.asBool, processChanged); break; case TypeColor: return ccsSetColor (setting, data->value.asColor, processChanged); break; case TypeString: return ccsSetString (setting, data->value.asString, processChanged); break; case TypeMatch: return ccsSetMatch (setting, data->value.asMatch, processChanged); break; case TypeKey: return ccsSetKey (setting, data->value.asKey, processChanged); break; case TypeButton: return ccsSetButton (setting, data->value.asButton, processChanged); break; case TypeEdge: return ccsSetEdge (setting, data->value.asEdge, processChanged); break; case TypeBell: return ccsSetBell (setting, data->value.asBell, processChanged); break; case TypeList: return ccsSetList (setting, data->value.asList, processChanged); default: break; } return SetFailed; } Bool ccsSettingGetIntDefault (CCSSetting * setting, int *data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (sPrivate->type != TypeInt) return FALSE; *data = sPrivate->value->value.asInt; return TRUE; } Bool ccsSettingGetFloatDefault (CCSSetting * setting, float *data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeFloat) return FALSE; *data = sPrivate->value->value.asFloat; return TRUE; } Bool ccsSettingGetBoolDefault (CCSSetting * setting, Bool * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeBool) return FALSE; *data = sPrivate->value->value.asBool; return TRUE; } Bool ccsSettingGetStringDefault (CCSSetting * setting, const char **data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeString) return FALSE; *data = sPrivate->value->value.asString; return TRUE; } Bool ccsSettingGetColorDefault (CCSSetting * setting, CCSSettingColorValue * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeColor) return TRUE; *data = sPrivate->value->value.asColor; return TRUE; } Bool ccsSettingGetMatchDefault (CCSSetting * setting, const char **data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeMatch) return FALSE; *data = sPrivate->value->value.asMatch; return TRUE; } Bool ccsSettingGetKeyDefault (CCSSetting * setting, CCSSettingKeyValue * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeKey) return FALSE; *data = sPrivate->value->value.asKey; return TRUE; } Bool ccsSettingGetButtonDefault (CCSSetting * setting, CCSSettingButtonValue * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeButton) return FALSE; *data = sPrivate->value->value.asButton; return TRUE; } Bool ccsSettingGetEdgeDefault (CCSSetting * setting, unsigned int * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeEdge) return FALSE; *data = sPrivate->value->value.asEdge; return TRUE; } Bool ccsSettingGetBellDefault (CCSSetting * setting, Bool * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeBell) return FALSE; *data = sPrivate->value->value.asBell; return TRUE; } Bool ccsSettingGetListDefault (CCSSetting * setting, CCSSettingValueList * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeList) return FALSE; *data = sPrivate->value->value.asList; return TRUE; } Bool ccsGetInt (CCSSetting *setting, int *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetInt) (setting, data); } Bool ccsGetFloat (CCSSetting *setting, float *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetFloat) (setting, data); } Bool ccsGetBool (CCSSetting *setting, Bool *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetBool) (setting, data); } Bool ccsGetString (CCSSetting *setting, const char **data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetString) (setting, data); } Bool ccsGetColor (CCSSetting *setting, CCSSettingColorValue *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetColor) (setting, data); } Bool ccsGetMatch (CCSSetting *setting, const char **data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetMatch) (setting, data); } Bool ccsGetKey (CCSSetting *setting, CCSSettingKeyValue *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetKey) (setting, data); } Bool ccsGetButton (CCSSetting *setting, CCSSettingButtonValue *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetButton) (setting, data); } Bool ccsGetEdge (CCSSetting *setting, unsigned int *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetEdge) (setting, data); } Bool ccsGetBell (CCSSetting *setting, Bool *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetBell) (setting, data); } Bool ccsGetList (CCSSetting *setting, CCSSettingValueList *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetList) (setting, data); } CCSSetStatus ccsSetInt (CCSSetting *setting, int data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetInt) (setting, data, processChanged); } CCSSetStatus ccsSetFloat (CCSSetting *setting, float data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetFloat) (setting, data, processChanged); } CCSSetStatus ccsSetBool (CCSSetting *setting, Bool data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetBool) (setting, data, processChanged); } CCSSetStatus ccsSetString (CCSSetting *setting, const char *data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetString) (setting, data, processChanged); } CCSSetStatus ccsSetColor (CCSSetting *setting, CCSSettingColorValue data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetColor) (setting, data, processChanged); } CCSSetStatus ccsSetMatch (CCSSetting *setting, const char *data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetMatch) (setting, data, processChanged); } CCSSetStatus ccsSetKey (CCSSetting *setting, CCSSettingKeyValue data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetKey) (setting, data, processChanged); } CCSSetStatus ccsSetButton (CCSSetting *setting, CCSSettingButtonValue data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetButton) (setting, data, processChanged); } CCSSetStatus ccsSetEdge (CCSSetting *setting, unsigned int data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetEdge) (setting, data, processChanged); } CCSSetStatus ccsSetBell (CCSSetting *setting, Bool data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetBell) (setting, data, processChanged); } CCSSetStatus ccsSetList (CCSSetting *setting, CCSSettingValueList data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetList) (setting, data, processChanged); } CCSSetStatus ccsSetValue (CCSSetting *setting, CCSSettingValue *data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetValue) (setting, data, processChanged); } void ccsResetToDefault (CCSSetting * setting, Bool processChanged) { (*(GET_INTERFACE (CCSSettingInterface, setting))->settingResetToDefault) (setting, processChanged); } Bool ccsSettingIsIntegrated (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingIsIntegrated) (setting); } Bool ccsSettingIsReadOnly (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingIsReadOnly) (setting); } Bool ccsSettingIsReadableByBackend (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingIsReadableByBackend) (setting); } void ccsContextDestroy (CCSContext * context) { if (!context) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (cPrivate->backend) { ccsDynamicBackendUnref (cPrivate->backend); cPrivate->backend = NULL; } ccsFreeContext (context); } CCSPluginList ccsGetActivePluginListDefault (CCSContext * context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); CCSPluginList rv = NULL; CCSPluginList l = cPrivate->plugins; while (l) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, l->data); if (pPrivate->active && strcmp (ccsPluginGetName (l->data), "ccp")) { rv = ccsPluginListAppend (rv, l->data); } l = l->next; } return rv; } CCSPluginList ccsGetActivePluginList (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetActivePluginList) (context); } static CCSPlugin * findPluginInList (CCSPluginList list, char *name) { if (!name || !strlen (name)) return NULL; while (list) { if (!strcmp (ccsPluginGetName (list->data), name)) return list->data; list = list->next; } return NULL; } typedef struct _PluginSortHelper { CCSPlugin *plugin; CCSPluginList after; } PluginSortHelper; CCSStringList ccsGetSortedPluginStringListDefault (CCSContext * context) { CCSPluginList ap = ccsGetActivePluginList (context); CCSPluginList list; CCSPlugin *p = NULL; CCSString *strCore = calloc (1, sizeof (CCSString)); strCore->value = strdup ("core"); strCore->refCount = 1; CCSStringList rv = ccsStringListAppend (NULL, strCore); PluginSortHelper *ph = NULL; p = findPluginInList (ap, "core"); if (p) ap = ccsPluginListRemove (ap, p, FALSE); int len = ccsPluginListLength (ap); if (len == 0) { ccsStringListFree (rv, TRUE); return NULL; } int i, j; /* TODO: conflict handling */ PluginSortHelper *plugins = calloc (1, len * sizeof (PluginSortHelper)); if (!plugins) { ccsStringListFree (rv, TRUE); return NULL; } for (i = 0, list = ap; i < len; i++, list = list->next) { plugins[i].plugin = list->data; plugins[i].after = NULL; } for (i = 0; i < len; ++i) { CCSStringList l = ccsPluginGetLoadAfter (plugins[i].plugin); while (l) { p = findPluginInList (ap, ((CCSString *)l->data)->value); if (p && !ccsPluginListFind (plugins[i].after, p)) plugins[i].after = ccsPluginListAppend (plugins[i].after, p); l = l->next; } l = ccsPluginGetRequiresPlugins (plugins[i].plugin); while (l) { Bool found = FALSE; p = findPluginInList (ap, ((CCSString *)l->data)->value); CCSStringList l2 = ccsPluginGetLoadBefore (plugins[i].plugin); while (l2) { if (strcmp (((CCSString *)l2->data)->value, ((CCSString *)l->data)->value) == 0) found = TRUE; l2 = l2->next; } if (p && !ccsPluginListFind (plugins[i].after, p) && !found) plugins[i].after = ccsPluginListAppend (plugins[i].after, p); l = l->next; } l = ccsPluginGetLoadBefore (plugins[i].plugin); while (l) { p = findPluginInList (ap, ((CCSString *)l->data)->value); if (p) { ph = NULL; for (j = 0; j < len; ++j) if (p == plugins[j].plugin) ph = &plugins[j]; if (ph && !ccsPluginListFind (ph->after, plugins[i].plugin)) ph->after = ccsPluginListAppend (ph->after, plugins[i].plugin); } l = l->next; } } ccsPluginListFree (ap, FALSE); Bool error = FALSE; int removed = 0; Bool found; while (!error && removed < len) { found = FALSE; for (i = 0; i < len; ++i) { CCSString *strPluginName; if (!plugins[i].plugin) continue; if (plugins[i].after) continue; /* This is a special case to ensure that bench is the last plugin */ if (len - removed > 1 && strcmp (ccsPluginGetName (plugins[i].plugin), "bench") == 0) continue; found = TRUE; ++removed; p = plugins[i].plugin; plugins[i].plugin = NULL; for (j = 0; j < len; ++j) plugins[j].after = ccsPluginListRemove (plugins[j].after, p, FALSE); strPluginName = calloc (1, sizeof (CCSString)); strPluginName->value = strdup (ccsPluginGetName (p)); strPluginName->refCount = 1; rv = ccsStringListAppend (rv, strPluginName); } if (!found) error = TRUE; } if (error) { ccsError ("Unable to generate sorted plugin list"); for (i = 0; i < len; ++i) { ccsPluginListFree (plugins[i].after, FALSE); } ccsStringListFree (rv, TRUE); rv = NULL; } free (plugins); return rv; } CCSStringList ccsGetSortedPluginStringList (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetSortedPluginStringList) (context); } const char * ccsGetBackendDefault (CCSContext * context) { if (!context) return NULL; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return NULL; return ccsDynamicBackendGetBackendName (cPrivate->backend); } const char * ccsGetBackend (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetBackend) (context); } Bool ccsGetIntegrationEnabledDefault (CCSContext * context) { if (!context) return FALSE; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->deIntegration; } Bool ccsGetIntegrationEnabled (CCSContext *context) { if (!context) return FALSE; return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetIntegrationEnabled) (context); } const char * ccsGetProfileDefault (CCSContext * context) { if (!context) return NULL; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->profile; } const char * ccsGetProfile (CCSContext *context) { if (!context) return NULL; return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetProfile) (context); } Bool ccsGetPluginListAutoSortDefault (CCSContext * context) { if (!context) return FALSE; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->pluginListAutoSort; } Bool ccsGetPluginListAutoSort (CCSContext *context) { if (!context) return FALSE; return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetPluginListAutoSort) (context); } void ccsSetIntegrationEnabledDefault (CCSContext * context, Bool value) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); /* no action required if nothing changed */ if ((!cPrivate->deIntegration && !value) || (cPrivate->deIntegration && value)) return; cPrivate->deIntegration = value; ccsConfigFileWriteConfigOption (cPrivate->configFile, OptionIntegration, (value) ? "true" : "false"); } void ccsSetIntegrationEnabled (CCSContext *context, Bool value) { (*(GET_INTERFACE (CCSContextInterface, context))->contextSetIntegrationEnabled) (context, value); } static void ccsWriteAutoSortedPluginList (CCSContext *context) { CCSStringList list; CCSPlugin *p; list = ccsGetSortedPluginStringList (context); p = ccsFindPlugin (context, "core"); if (p) { CCSSetting *s; s = ccsFindSetting (p, "active_plugins"); if (s) { CCSSettingValueList vl; vl = ccsGetValueListFromStringList (list, s); ccsSetList (s, vl, TRUE); ccsSettingValueListFree (vl, TRUE); ccsWriteChangedSettings (context); } } ccsStringListFree (list, TRUE); } void ccsSetPluginListAutoSortDefault (CCSContext * context, Bool value) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); /* no action required if nothing changed */ if ((!cPrivate->pluginListAutoSort && !value) || (cPrivate->pluginListAutoSort && value)) return; cPrivate->pluginListAutoSort = value; ccsConfigFileWriteConfigOption (cPrivate->configFile,OptionAutoSort, (value) ? "true" : "false"); if (value) ccsWriteAutoSortedPluginList (context); } void ccsSetPluginListAutoSort (CCSContext *context, Bool value) { (*(GET_INTERFACE (CCSContextInterface, context))->contextSetPluginListAutoSort) (context, value); } void ccsSetProfileDefault (CCSContext * context, const char *name) { const char *globalProfileDir = SYSCONFDIR "/compizconfig"; CCSStringList availableInBackend = NULL; CCSStringList availableInSysconfDir = NULL; if (!name) name = ""; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); /* no action required if profile stays the same */ if (cPrivate->profile && (strcmp (cPrivate->profile, name) == 0)) return; /* Check what profiles are available before changing it so that we * know what the backends need to know */ if (cPrivate->backend && cPrivate->scanForProfiles) { availableInSysconfDir = (*cPrivate->scanForProfiles) (globalProfileDir); availableInBackend = ccsBackendGetExistingProfiles ((CCSBackend *) cPrivate->backend, context); } if (cPrivate->profile) free (cPrivate->profile); cPrivate->profile = strdup (name); /* We may need to force-import this profile. Have a look * in SYSCONFDIR/compizconfig/ for profiles with this name * and see if the backend knows about it. If the backend * doesn't know about it, then we'll need to force import * it if available */ char *importProfileName = NULL; if (availableInSysconfDir) { CCSStringList sysconfProfile = availableInSysconfDir; while (sysconfProfile) { char *sysconfProfileFullCopy; char *sysconfProfileFull = sysconfProfileFullCopy = strdup (sysconfProfile->data->value); char *sysconfProfileBasename = basename (sysconfProfileFullCopy); char *sysconfProfileBase = NULL; /* No preceeding path */ if (!strlen (sysconfProfileBasename)) sysconfProfileBasename = sysconfProfileFullCopy; if (strstr (sysconfProfileBasename, ".ini")) sysconfProfileBase = strndup (sysconfProfileBasename, strlen (sysconfProfileBasename) - 4); else if (strstr (sysconfProfileBasename, ".profile")) sysconfProfileBase = strndup (sysconfProfileBasename, strlen (sysconfProfileBasename) - 8); else sysconfProfileBase = strdup (sysconfProfileBasename); /* We found this profile in SYSCONFDIR. We will need to import * it if it is not also available in the backend */ if (strcmp (sysconfProfileBase, cPrivate->profile) == 0) { importProfileName = strdup (sysconfProfileBasename); CCSStringList backendProfile = availableInBackend; while (backendProfile) { if (strcmp (sysconfProfileBase, backendProfile->data->value) == 0) { free (importProfileName); importProfileName = NULL; break; } backendProfile = backendProfile->next; } free (sysconfProfileFull); free (sysconfProfileBase); break; } free (sysconfProfileFull); free (sysconfProfileBase); sysconfProfile = sysconfProfile->next; } if (importProfileName) { /* Add path */ size_t importProfilePathLength = strlen (importProfileName) + strlen (globalProfileDir) + 2; char *importProfilePath = calloc (1, sizeof (char) * importProfilePathLength); snprintf (importProfilePath, importProfilePathLength, "%s/%s", globalProfileDir, importProfileName); (*cPrivate->importFromFile) (context, importProfilePath, TRUE); free (importProfilePath); free (importProfileName); } } if (availableInSysconfDir) ccsStringListFree (availableInSysconfDir, TRUE); if (availableInBackend) ccsStringListFree (availableInBackend, TRUE); ccsConfigFileWriteConfigOption (cPrivate->configFile, OptionProfile, cPrivate->profile); } void ccsSetProfile (CCSContext *context, const char *name) { (*(GET_INTERFACE (CCSContextInterface, context))->contextSetProfile) (context, name); } void ccsProcessEventsDefault (CCSContext * context, unsigned int flags) { if (!context) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); ccsCheckFileWatches (); if (cPrivate->backend) ccsBackendExecuteEvents ((CCSBackend *) cPrivate->backend, flags); } void ccsProcessEvents (CCSContext *context, unsigned int flags) { if (!context) return; (*(GET_INTERFACE (CCSContextInterface, context))->contextProcessEvents) (context, flags); } void ccsReadSettingsDefault (CCSContext * context) { if (!context) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return; if (!ccsDynamicBackendSupportsRead (cPrivate->backend)) return; if (!ccsBackendReadInit ((CCSBackend *) cPrivate->backend, context)) return; CCSPluginList pl = cPrivate->plugins; while (pl) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, pl->data); CCSSettingList sl = pPrivate->settings; while (sl) { ccsBackendReadSetting ((CCSBackend *) cPrivate->backend, context, sl->data); sl = sl->next; } pl = pl->next; } ccsBackendReadDone ((CCSBackend *) cPrivate->backend, context); } void ccsReadSettings (CCSContext *context) { if (!context) return; (*(GET_INTERFACE (CCSContextInterface, context))->contextReadSettings) (context); } void ccsReadPluginSettingsDefault (CCSPlugin * plugin) { if (!plugin || !ccsPluginGetContext (plugin)) return; CCSContext *context = ccsPluginGetContext (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return; if (!ccsDynamicBackendSupportsRead (cPrivate->backend)) return; if (!ccsBackendReadInit ((CCSBackend *) cPrivate->backend, ccsPluginGetContext (plugin))) return; CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); CCSSettingList sl = pPrivate->settings; while (sl) { ccsBackendReadSetting ((CCSBackend *) cPrivate->backend, ccsPluginGetContext (plugin), sl->data); sl = sl->next; } ccsBackendReadDone ((CCSBackend *) cPrivate->backend, ccsPluginGetContext (plugin)); } void ccsReadPluginSettings (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginReadPluginSettings) (plugin); } void ccsWriteSettingsDefault (CCSContext * context) { if (!context) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return; if (!ccsDynamicBackendSupportsWrite (cPrivate->backend)) return; if (!ccsBackendWriteInit ((CCSBackend *) cPrivate->backend, context)) return; CCSPluginList pl = cPrivate->plugins; while (pl) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, pl->data); CCSSettingList sl = pPrivate->settings; while (sl) { ccsBackendWriteSetting ((CCSBackend *) cPrivate->backend, context, sl->data); sl = sl->next; } pl = pl->next; } ccsBackendWriteDone ((CCSBackend *) cPrivate->backend, context); cPrivate->changedSettings = ccsSettingListFree (cPrivate->changedSettings, FALSE); } void ccsWriteSettings (CCSContext *context) { if (!context) return; (*(GET_INTERFACE (CCSContextInterface, context))->contextWriteSettings) (context); } void ccsWriteChangedSettingsDefault (CCSContext * context) { if (!context) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return; if (!ccsDynamicBackendSupportsWrite (cPrivate->backend)) return; if (!ccsBackendWriteInit ((CCSBackend *) cPrivate->backend, context)) return; /* We must immediately steal the changed settings list * if we recurse into this function */ CCSSettingList changedSettings = ccsContextStealChangedSettings (context); if (ccsSettingListLength (changedSettings)) { CCSSettingList l = changedSettings; while (l) { ccsBackendWriteSetting ((CCSBackend *) cPrivate->backend, context, l->data); l = l->next; } } ccsBackendWriteDone ((CCSBackend *) cPrivate->backend,context); ccsSettingListFree (changedSettings, FALSE); } void ccsWriteChangedSettings (CCSContext *context) { if (!context) return; (*(GET_INTERFACE (CCSContextInterface, context))->contextWriteChangedSettings) (context); } Bool ccsIsEqualColor (CCSSettingColorValue c1, CCSSettingColorValue c2) { if (c1.color.red == c2.color.red && c1.color.green == c2.color.green && c1.color.blue == c2.color.blue && c1.color.alpha == c2.color.alpha) { return TRUE; } return FALSE; } Bool ccsIsEqualKey (CCSSettingKeyValue c1, CCSSettingKeyValue c2) { if (c1.keysym == c2.keysym && c1.keyModMask == c2.keyModMask) return TRUE; return FALSE; } Bool ccsIsEqualButton (CCSSettingButtonValue c1, CCSSettingButtonValue c2) { if (c1.button == c2.button && c1.buttonModMask == c2.buttonModMask && c1.edgeMask == c2.edgeMask) return TRUE; return FALSE; } Bool ccsPluginSetActive (CCSPlugin * plugin, Bool value) { if (!plugin) return FALSE; CCSContext *context = ccsPluginGetContext (plugin); CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); pPrivate->active = value; if (cPrivate->pluginListAutoSort) ccsWriteAutoSortedPluginList (ccsPluginGetContext (plugin)); return TRUE; } CCSPluginConflictList ccsCanEnablePluginDefault (CCSContext * context, CCSPlugin * plugin) { CCSPluginConflictList list = NULL; CCSPluginList pl, pl2; CCSStringList sl; /* look if the plugin to be loaded requires a plugin not present */ sl = ccsPluginGetRequiresPlugins (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); while (sl) { if (!ccsFindPlugin (context, ((CCSString *)sl->data)->value)) { CCSPluginConflict *conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictPluginError; conflict->plugins = NULL; list = ccsPluginConflictListAppend (list, conflict); } } else if (!ccsPluginIsActive (context, ((CCSString *)sl->data)->value)) { /* we've not seen a matching plugin */ CCSPluginConflict *conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictRequiresPlugin; conflict->plugins = ccsPluginListAppend (conflict->plugins, ccsFindPlugin (context, ((CCSString *)sl->data)->value)); list = ccsPluginConflictListAppend (list, conflict); } } sl = sl->next; } /* look if the new plugin wants a non-present feature */ sl = ccsPluginGetRequiresFeatures (plugin); while (sl) { pl = cPrivate->plugins; pl2 = NULL; while (pl) { CCSStringList featureList = ccsPluginGetProvidesFeatures (pl->data); while (featureList) { if (strcmp (((CCSString *) sl->data)->value, ((CCSString *)featureList->data)->value) == 0) { pl2 = ccsPluginListAppend (pl2, pl->data); break; } featureList = featureList->next; } pl = pl->next; } pl = pl2; while (pl) { if (ccsPluginIsActive (context, ccsPluginGetName (pl->data))) { ccsPluginListFree (pl2, FALSE); break; } pl = pl->next; } if (!pl) { /* no plugin provides that feature */ CCSPluginConflict *conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictRequiresFeature; conflict->plugins = pl2; list = ccsPluginConflictListAppend (list, conflict); } } sl = sl->next; } /* look if another plugin provides the same feature */ sl = ccsPluginGetProvidesFeatures (plugin); while (sl) { pl = cPrivate->plugins; CCSPluginConflict *conflict = NULL; while (pl) { if (ccsPluginIsActive (context, ccsPluginGetName (pl->data))) { CCSStringList featureList = ccsPluginGetProvidesFeatures (pl->data); while (featureList) { if (strcmp (((CCSString *)sl->data)->value, ((CCSString *)featureList->data)->value) == 0) { if (!conflict) { conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictFeature; } } if (conflict) conflict->plugins = ccsPluginListAppend (conflict->plugins, pl->data); } featureList = featureList->next; } } pl = pl->next; } if (conflict) list = ccsPluginConflictListAppend (list, conflict); sl = sl->next; } /* look if another plugin provides a conflicting feature*/ sl = ccsPluginGetProvidesFeatures (plugin); while (sl) { pl = cPrivate->plugins; CCSPluginConflict *conflict = NULL; while (pl) { if (ccsPluginIsActive (context, ccsPluginGetName (pl->data))) { CCSStringList featureList = ccsPluginGetProvidesFeatures (pl->data); while (featureList) { if (strcmp (((CCSString *)sl->data)->value, ((CCSString *)featureList->data)->value) == 0) { if (!conflict) { conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictFeature; } } if (conflict) conflict->plugins = ccsPluginListAppend (conflict->plugins, pl->data); } featureList = featureList->next; } } pl = pl->next; } if (conflict) list = ccsPluginConflictListAppend (list, conflict); sl = sl->next; } /* look if the plugin to be loaded conflict with a loaded plugin */ sl = ccsPluginGetConflictPlugins (plugin); while (sl) { if (ccsPluginIsActive (context, ((CCSString *)sl->data)->value)) { CCSPluginConflict *conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictPlugin; conflict->plugins = ccsPluginListAppend (conflict->plugins, ccsFindPlugin (context, ((CCSString *)sl->data)->value)); list = ccsPluginConflictListAppend (list, conflict); } } sl = sl->next; } return list; } CCSPluginConflictList ccsCanEnablePlugin (CCSContext *context, CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextCanEnablePlugin) (context, plugin); } CCSPluginConflictList ccsCanDisablePluginDefault (CCSContext * context, CCSPlugin * plugin) { CCSPluginConflictList list = NULL; CCSPluginConflict *conflict = NULL; CCSPluginList pl; CCSStringList sl; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); /* look if the plugin to be unloaded is required by another plugin */ pl = cPrivate->plugins; for (; pl; pl = pl->next) { CCSStringList pluginList; if (pl->data == plugin) continue; if (!ccsPluginIsActive (context, ccsPluginGetName (pl->data))) continue; pluginList = ccsPluginGetRequiresPlugins (pl->data); while (pluginList) { if (strcmp (ccsPluginGetName (plugin), ((CCSString *)pluginList->data)->value) == 0) { if (!conflict) { conflict = calloc (1, sizeof (CCSPluginConflict)); conflict->refCount = 1; if (conflict) { conflict->value = strdup (ccsPluginGetName (plugin)); conflict->type = ConflictPluginNeeded; } } if (conflict) conflict->plugins = ccsPluginListAppend (conflict->plugins, pl->data); break; } pluginList = pluginList->next; } } if (conflict) { list = ccsPluginConflictListAppend (list, conflict); conflict = NULL; } /* look if a feature provided is required by another plugin */ sl = ccsPluginGetProvidesFeatures (plugin); while (sl) { pl = cPrivate->plugins; for (; pl; pl = pl->next) { CCSStringList pluginList; if (pl->data == plugin) continue; if (!ccsPluginIsActive (context, ccsPluginGetName (pl->data))) continue; pluginList = ccsPluginGetRequiresFeatures (pl->data); while (pluginList) { if (strcmp (((CCSString *)sl->data)->value, ((CCSString *)pluginList->data)->value) == 0) { if (!conflict) { conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictFeatureNeeded; } } if (conflict) conflict->plugins = ccsPluginListAppend (conflict->plugins, pl->data); } pluginList = pluginList->next; } } if (conflict) list = ccsPluginConflictListAppend (list, conflict); conflict = NULL; sl = sl->next; } return list; } CCSPluginConflictList ccsCanDisablePlugin (CCSContext *context, CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextCanDisablePlugin) (context, plugin); } CCSStringList ccsGetExistingProfilesDefault (CCSContext * context) { if (!context) return NULL; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return NULL; if (ccsDynamicBackendSupportsProfiles (cPrivate->backend)) return ccsBackendGetExistingProfiles ((CCSBackend *) cPrivate->backend, context); return NULL; } CCSStringList ccsGetExistingProfiles (CCSContext *context) { if (!context) return NULL; return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetExistingProfiles) (context); } void ccsDeleteProfileDefault (CCSContext * context, char *name) { if (!context) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return; if (!ccsDynamicBackendSupportsProfiles (cPrivate->backend)) return; /* never ever delete default profile */ if (!name || !strlen (name)) return; /* if the current profile should be deleted, switch to default profile first */ if (strcmp (cPrivate->profile, name) == 0) ccsSetProfile (context, ""); ccsBackendDeleteProfile ((CCSBackend *) cPrivate->backend, context, name); } void ccsDeleteProfile (CCSContext *context, char *name) { if (!context) return; (*(GET_INTERFACE (CCSContextInterface, context))->contextDeleteProfile) (context, name); } static void addBackendInfo (CCSBackendInfoList * bl, char *file) { void *dlhand = NULL; char *err = NULL; Bool found = FALSE; dlerror (); dlhand = dlopen (file, RTLD_LAZY | RTLD_LOCAL); err = dlerror (); if (err || !dlhand) return; BackendGetInfoProc getInfo = dlsym (dlhand, "getBackendInfo"); if (!getInfo) { dlclose (dlhand); return; } CCSBackendInterface *vt = getInfo (); if (!vt) { dlclose (dlhand); return; } CCSBackendInfo *info = ccsCopyBackendInfoFromBackend (NULL, vt); if (!info) { dlclose (dlhand); return; } CCSBackendInfoList l = *bl; while (l) { if (!strcmp (l->data->name, info->name)) { found = TRUE; break; } l = l->next; } if (found) { dlclose (dlhand); return; } *bl = ccsBackendInfoListAppend (*bl, info); dlclose (dlhand); } static int backendNameFilter (const struct dirent *name) { int length = strlen (name->d_name); if (length < 7) return 0; if (strncmp (name->d_name, "lib", 3) || strncmp (name->d_name + length - 3, ".so", 3)) return 0; return 1; } static void getBackendInfoFromDir (CCSBackendInfoList * bl, char *path, const char *currentBackend) { struct dirent **nameList; int nFile, i; if (!path) return; nFile = scandir (path, &nameList, backendNameFilter, NULL); if (nFile <= 0) return; for (i = 0; i < nFile; ++i) { if (strncmp (currentBackend, &(nameList[i]->d_name[3]), strlen (currentBackend)) == 0) continue; char file[1024]; sprintf (file, "%s/%s", path, nameList[i]->d_name); addBackendInfo (bl, file); free (nameList[i]); } free (nameList); } CCSBackendInfoList ccsGetExistingBackends (CCSContext *context) { CCSBackendInfoList rv = NULL; const char *home = getenv ("HOME"); const char *overrideBackend = getenv ("LIBCOMPIZCONFIG_BACKEND_PATH"); char *backenddir; const char *currentBackend = ccsGetBackend (context); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); const CCSBackendInterface *currentBackendInterface = GET_INTERFACE (CCSBackendInterface, cPrivate->backend); rv = ccsBackendInfoListAppend (rv, ccsCopyBackendInfoFromBackend ((CCSBackend *) cPrivate->backend, currentBackendInterface)); if (overrideBackend && strlen (overrideBackend)) { if (asprintf (&backenddir, "%s", overrideBackend) == -1) backenddir = NULL; if (backenddir) { getBackendInfoFromDir (&rv, backenddir, currentBackend); free (backenddir); } } else { if (home && strlen (home)) { if (asprintf (&backenddir, "%s/.compizconfig/backends", home) == -1) backenddir = NULL; if (backenddir) { getBackendInfoFromDir (&rv, backenddir, currentBackend); free (backenddir); } } if (asprintf (&backenddir, "%s/compizconfig/backends", LIBDIR) == -1) backenddir = NULL; if (backenddir) { getBackendInfoFromDir (&rv, backenddir, currentBackend); free (backenddir); } } return rv; } Bool ccsExportToFileDefault (CCSContext *context, const char *fileName, Bool skipDefaults) { IniDictionary *exportFile; CCSPluginList p; CCSSettingList s; CCSPlugin *plugin; CCSSetting *setting; char *keyName; exportFile = ccsIniNew (); if (!exportFile) return FALSE; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); for (p = cPrivate->plugins; p; p = p->next) { plugin = p->data; CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (!pPrivate->loaded) ccsLoadPluginSettings (plugin); for (s = pPrivate->settings; s; s = s->next) { setting = s->data; if (skipDefaults && ccsSettingGetIsDefault (setting)) continue; if (asprintf (&keyName, "s%d_%s", cPrivate->screenNum, ccsSettingGetName (setting)) == -1) return FALSE; switch (ccsSettingGetType (setting)) { case TypeBool: ccsIniSetBool (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asBool); break; case TypeInt: ccsIniSetInt (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asInt); break; case TypeFloat: ccsIniSetFloat (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asFloat); break; case TypeString: ccsIniSetString (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asString); break; case TypeKey: ccsIniSetKey (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asKey); break; case TypeButton: ccsIniSetButton (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asButton); break; case TypeEdge: ccsIniSetEdge (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asEdge); break; case TypeBell: ccsIniSetBell (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asBell); break; case TypeColor: ccsIniSetColor (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asColor); break; case TypeMatch: ccsIniSetString (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asMatch); break; case TypeList: ccsIniSetList (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asList, ccsSettingGetInfo (setting)->forList.listType); break; default: break; } free (keyName); } } ccsIniSave (exportFile, fileName); ccsIniClose (exportFile); return TRUE; } Bool ccsExportToFile (CCSContext *context, const char *fileName, Bool skipDefaults) { if (!context) return FALSE; return (*(GET_INTERFACE (CCSContextInterface, context))->contextExportToFile) (context, fileName, skipDefaults); } /* + with a value will attempt to append or overwrite that value if there is no - * - with a value will attempt to clear any value set to that to the default * if there is no + * - with a value and + with a value will replace one with the other * - without a value and + with a value will ensure that + overwrites the setting */ static Bool ccsProcessSettingPlus (IniDictionary *dict, CCSContext *context, CCSSettingsUpgrade *upgrade, CCSSetting *setting) { char *keyName = NULL; char *sectionName = strdup (ccsPluginGetName (ccsSettingGetParent (setting))); char *iniValue = NULL; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (asprintf (&keyName, "+s%d_%s", cPrivate->screenNum, ccsSettingGetName (setting)) == -1) { free (sectionName); return FALSE; } if (ccsIniGetString (dict, sectionName, keyName, &iniValue)) { CCSSetting *newSetting = malloc (sizeof (CCSSetting)); if (!newSetting) { free (sectionName); free (keyName); free (iniValue); return FALSE; } ccsObjectInit (newSetting, &ccsDefaultObjectAllocator); copySetting (setting, newSetting); switch (ccsSettingGetType (newSetting)) { case TypeInt: { int value; ccsIniParseInt (iniValue, &value); ccsSetInt (newSetting, value, FALSE); break; } case TypeBool: { Bool value; ccsIniParseBool (iniValue, &value); ccsSetBool (newSetting, value, FALSE); break; } case TypeFloat: { float value; ccsIniParseFloat (iniValue, &value); ccsSetFloat (newSetting, value, FALSE); break; } case TypeString: { char *value; ccsIniParseString (iniValue, &value); ccsSetString (newSetting, value, FALSE); free (value); break; } case TypeColor: { CCSSettingColorValue value; ccsIniParseColor (iniValue, &value); ccsSetColor (newSetting, value, FALSE); break; } case TypeKey: { CCSSettingKeyValue value; ccsIniParseKey (iniValue, &value); ccsSetKey (newSetting, value, FALSE); break; } case TypeButton: { CCSSettingButtonValue value; ccsIniParseButton (iniValue, &value); ccsSetButton (newSetting, value, FALSE); break; } case TypeEdge: { unsigned int value; ccsIniParseEdge (iniValue, &value); ccsSetEdge (newSetting, value, FALSE); break; } case TypeBell: { Bool value; ccsIniParseBool (iniValue, &value); ccsSetBell (newSetting, value, FALSE); break; } case TypeMatch: { char *value; ccsIniParseString (iniValue, &value); ccsSetMatch (newSetting, value, FALSE); free (value); break; } case TypeList: { CCSSettingValueList value; ccsIniParseList (iniValue, &value, newSetting); ccsSetList (newSetting, value, FALSE); ccsSettingValueListFree (value, TRUE); break; } case TypeAction: default: { free (newSetting); free (sectionName); free (keyName); free (iniValue); return FALSE; } } CCSSettingList listIter = upgrade->clearValueSettings; while (listIter) { CCSSetting *s = (CCSSetting *) listIter->data; if (strcmp (ccsSettingGetName (s), ccsSettingGetName (newSetting)) == 0) { upgrade->replaceToValueSettings = ccsSettingListAppend (upgrade->replaceToValueSettings, (void *) newSetting); upgrade->replaceFromValueSettings = ccsSettingListAppend (upgrade->replaceFromValueSettings, (void *) s); upgrade->clearValueSettings = ccsSettingListRemove (upgrade->clearValueSettings, (void *) s, FALSE); break; } listIter = listIter->next; } if (!listIter) upgrade->addValueSettings = ccsSettingListAppend (upgrade->addValueSettings, (void *) newSetting); free (keyName); free (sectionName); free (iniValue); return TRUE; } free (keyName); free (sectionName); free (iniValue); return FALSE; } static Bool ccsProcessSettingMinus (IniDictionary *dict, CCSContext *context, CCSSettingsUpgrade *upgrade, CCSSetting *setting) { char *keyName = NULL; char *sectionName = strdup (ccsPluginGetName (ccsSettingGetParent (setting))); char *iniValue = NULL; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (asprintf (&keyName, "-s%d_%s", cPrivate->screenNum, ccsSettingGetName (setting)) == -1) { free (sectionName); return FALSE; } if (ccsIniGetString (dict, sectionName, keyName, &iniValue)) { CCSSetting *newSetting = malloc (sizeof (CCSSetting)); if (!newSetting) { free (sectionName); free (keyName); free (iniValue); return FALSE; } ccsObjectInit (newSetting, &ccsDefaultObjectAllocator); copySetting (setting, newSetting); switch (ccsSettingGetType (newSetting)) { case TypeInt: { int value; ccsIniParseInt (iniValue, &value); ccsSetInt (newSetting, value, FALSE); break; } case TypeBool: { Bool value; ccsIniParseBool (iniValue, &value); ccsSetBool (newSetting, value, FALSE); break; } case TypeFloat: { float value; ccsIniParseFloat (iniValue, &value); ccsSetFloat (newSetting, value, FALSE); break; } case TypeString: { char *value; ccsIniParseString (iniValue, &value); ccsSetString (newSetting, value, FALSE); free (value); break; } case TypeColor: { CCSSettingColorValue value; ccsIniParseColor (iniValue, &value); ccsSetColor (newSetting, value, FALSE); break; } case TypeKey: { CCSSettingKeyValue value; ccsIniParseKey (iniValue, &value); ccsSetKey (newSetting, value, FALSE); break; } case TypeButton: { CCSSettingButtonValue value; ccsIniParseButton (iniValue, &value); ccsSetButton (newSetting, value, FALSE); break; } case TypeEdge: { unsigned int value; ccsIniParseEdge (iniValue, &value); ccsSetEdge (newSetting, value, FALSE); break; } case TypeBell: { Bool value; ccsIniParseBool (iniValue, &value); ccsSetBell (newSetting, value, FALSE); break; } case TypeMatch: { char *value; ccsIniParseString (iniValue, &value); ccsSetMatch (newSetting, value, FALSE); free (value); break; } case TypeList: { CCSSettingValueList value; ccsIniParseList (iniValue, &value, newSetting); ccsSetList (newSetting, value, FALSE); ccsSettingValueListFree (value, TRUE); break; } case TypeAction: default: { free (newSetting); free (sectionName); free (keyName); free (iniValue); return FALSE; } } CCSSettingList listIter = upgrade->addValueSettings; while (listIter) { CCSSetting *s = (CCSSetting *) listIter->data; if (strcmp (ccsSettingGetName (s), ccsSettingGetName (newSetting)) == 0) { upgrade->replaceFromValueSettings = ccsSettingListAppend (upgrade->replaceFromValueSettings, (void *) newSetting); upgrade->replaceToValueSettings = ccsSettingListAppend (upgrade->replaceToValueSettings, (void *) s); upgrade->addValueSettings = ccsSettingListRemove (upgrade->addValueSettings, (void *) s, FALSE); break; } listIter = listIter->next; } if (!listIter) upgrade->clearValueSettings = ccsSettingListAppend (upgrade->clearValueSettings, (void *) newSetting); free (keyName); free (sectionName); free (iniValue); return TRUE; } free (keyName); free (sectionName); free (iniValue); return FALSE; } void ccsCollectSettingsToUpgrade (CCSContext *context, IniDictionary *dict, CCSSettingsUpgrade *upgrade) { CCSPluginList pl = ccsContextGetPlugins (context); while (pl) { CCSPlugin *plugin = (CCSPlugin *) pl->data; CCSSettingList sl = ccsGetPluginSettings (plugin); while (sl) { CCSSetting *setting = sl->data; ccsProcessSettingMinus (dict, context, upgrade, setting); ccsProcessSettingPlus (dict, context, upgrade, setting); sl = sl->next; } pl = pl->next; } } Bool ccsProcessUpgrade (CCSContext *context, CCSSettingsUpgrade *upgrade) { IniDictionary *dict = ccsIniOpen (upgrade->file); ccsSetProfile (context, upgrade->profile); ccsCollectSettingsToUpgrade (context, dict, upgrade); ccsUpgradeClearValues (upgrade->clearValueSettings); ccsUpgradeAddValues (upgrade->addValueSettings); ccsUpgradeReplaceValues (upgrade->replaceFromValueSettings, upgrade->replaceToValueSettings); upgrade->clearValueSettings = ccsSettingListFree (upgrade->clearValueSettings, TRUE); upgrade->addValueSettings = ccsSettingListFree (upgrade->addValueSettings, TRUE); upgrade->replaceFromValueSettings = ccsSettingListFree (upgrade->replaceFromValueSettings, TRUE); upgrade->replaceToValueSettings = ccsSettingListFree (upgrade->replaceToValueSettings, TRUE); ccsIniClose (dict); return TRUE; } static int upgradeNameFilter (const struct dirent *name) { return ccsUpgradeNameFilter (name->d_name); } void ccsFreeUpgrade (CCSSettingsUpgrade *upgrade) { if (upgrade->profile) free (upgrade->profile); if (upgrade->domain) free (upgrade->domain); if (upgrade->file) free (upgrade->file); free (upgrade); } /* * Process a filename into the properties * for a settings upgrade * eg * * org.freedesktop.compiz.Default.01.upgrade * * gives us: * domain: org.freedesktop.compiz * number: 1 * profile: Default * */ CCSSettingsUpgrade * ccsSettingsUpgradeNew (const char *path, const char *name) { CCSSettingsUpgrade *upgrade = calloc (1, sizeof (CCSSettingsUpgrade)); char *upgradeName = strdup (name); unsigned int fnlen = strlen (path) + strlen (name) + 1; upgrade->file = calloc (fnlen + 1, sizeof (char)); sprintf (upgrade->file, "%s/%s", path, name); upgradeName = strdup (name); if (!ccsUpgradeGetDomainNumAndProfile (upgradeName, &upgrade->domain, &upgrade->num, &upgrade->profile)) { ccsFreeUpgrade (upgrade); upgrade = NULL; } free (upgradeName); return upgrade; } static CCSTextFile * ccsUnixOpenDoneSettingsUpgradeFile (const char *path) { return ccsUnixTextFileNew (path, ReadWriteCreate, &ccsDefaultObjectAllocator); } static CCSTextFile * ccsGetDoneSettingsUpgradeFile (const char *home) { char *dupath = NULL; CCSTextFile *completedUpgrades = NULL; if (asprintf (&dupath, "%s/.config/compiz-1/compizconfig/done_upgrades", home) == -1) return NULL; completedUpgrades = ccsUnixOpenDoneSettingsUpgradeFile (dupath); free (dupath); return completedUpgrades; } static char * ccsReadCompletedUpgradesIntoString (CCSTextFile *completedUpgrades) { return ccsTextFileReadFromStart (completedUpgrades); } static unsigned int ccsGetUpgradeFilesForProcessing (const char *upgradePath, struct dirent ***passedNameList) { struct dirent **nameList = NULL; unsigned int nFile = scandir (upgradePath, &nameList, upgradeNameFilter, alphasort); if (!nFile) return 0; *passedNameList = nameList; return nFile; } static Bool ccsShouldSkipUpgrade (const char *upgrade, const char *skipBuffer) { char *matched = strstr (skipBuffer, upgrade); if (matched != NULL) { ccsDebug ("Skipping upgrade %s", upgrade); return TRUE; } return FALSE; } static void ccsProcessUpgradeOnce (CCSContext *context, CCSSettingsUpgrade *upgrade, const char *upgradeName, CCSTextFile *completedUpgrades) { ccsDebug ("Processing upgrade %s\n profile: %s\n number: %i\n domain: %s", upgradeName, upgrade->profile, upgrade->num, upgrade->domain); ccsProcessUpgrade (context, upgrade); ccsWriteChangedSettings (context); ccsWriteAutoSortedPluginList (context); ccsDebug ("Completed upgrade %s", upgradeName); ccsTextFileAppendString (completedUpgrades, upgradeName); ccsFreeUpgrade (upgrade); } static const char * CCS_UPGRADE_PATH = DATADIR "/compizconfig/upgrades"; static void ccsApplyUnappliedUpgrades (CCSContext *context, struct dirent **nameList, unsigned int nFile, const char *completedUpradesContents, CCSTextFile *completedUpgrades) { int i = 0; const char *path = CCS_UPGRADE_PATH; for (i = 0; i < nFile; ++i) { CCSSettingsUpgrade *upgrade = NULL; const char *upgradeName = nameList[i]->d_name; if (ccsShouldSkipUpgrade (upgradeName, completedUpradesContents)) continue; upgrade = ccsSettingsUpgradeNew (path, upgradeName); ccsProcessUpgradeOnce (context, upgrade, upgradeName, completedUpgrades); free (nameList[i]); } } Bool ccsCheckForSettingsUpgradeDefault (CCSContext *context) { struct dirent **nameList = NULL; int nFile; const char *path = CCS_UPGRADE_PATH; CCSTextFile *completedUpgrades; char *cuBuffer = NULL; const char *home = getenv ("HOME"); if (!home) return FALSE; completedUpgrades = ccsGetDoneSettingsUpgradeFile (home); if (!completedUpgrades) return FALSE; cuBuffer = ccsReadCompletedUpgradesIntoString (completedUpgrades); if (!cuBuffer) { ccsTextFileUnref (completedUpgrades); ccsWarning ("Error opening done_upgrades"); return FALSE; } nFile = ccsGetUpgradeFilesForProcessing (path, &nameList); if (!nFile || !nameList) { free (cuBuffer); ccsTextFileUnref (completedUpgrades); return FALSE; } ccsApplyUnappliedUpgrades (context, nameList, nFile, cuBuffer, completedUpgrades); ccsTextFileUnref (completedUpgrades); free (cuBuffer); if (nameList != NULL) free (nameList); return TRUE; } Bool ccsImportFromFileDefault (CCSContext *context, const char *fileName, Bool overwriteNonDefault) { IniDictionary *importFile; CCSPluginList p; CCSSettingList s; CCSPlugin *plugin; CCSSetting *setting; char *keyName; FILE *fp; /* check if the file exists first */ fp = fopen (fileName, "r"); if (!fp) return FALSE; fclose (fp); importFile = iniparser_new ((char *) fileName); if (!importFile) return FALSE; ccsLoadPlugins (context); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); for (p = cPrivate->plugins; p; p = p->next) { plugin = p->data; CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (!pPrivate->loaded) ccsLoadPluginSettings (plugin); for (s = pPrivate->settings; s; s = s->next) { setting = s->data; if (!ccsSettingGetIsDefault (setting) && !overwriteNonDefault) continue; if (asprintf (&keyName, "s%d_%s", cPrivate->screenNum, ccsSettingGetName (setting)) == -1) return FALSE; switch (ccsSettingGetType (setting)) { case TypeBool: { Bool value; if (ccsIniGetBool (importFile, ccsPluginGetName (plugin), keyName, &value)) { ccsSetBool (setting, value, TRUE); } } break; case TypeInt: { int value; if (ccsIniGetInt (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetInt (setting, value, TRUE); } break; case TypeFloat: { float value; if (ccsIniGetFloat (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetFloat (setting, value, TRUE); } break; case TypeString: { char *value; if (ccsIniGetString (importFile, ccsPluginGetName (plugin), keyName, &value)) { ccsSetString (setting, value, TRUE); free (value); } } break; case TypeKey: { CCSSettingKeyValue value; if (ccsIniGetKey (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetKey (setting, value, TRUE); } break; case TypeButton: { CCSSettingButtonValue value; if (ccsIniGetButton (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetButton (setting, value, TRUE); } break; case TypeEdge: { unsigned int value; if (ccsIniGetEdge (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetEdge (setting, value, TRUE); } break; case TypeBell: { Bool value; if (ccsIniGetBell (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetBell (setting, value, TRUE); } break; case TypeColor: { CCSSettingColorValue value; if (ccsIniGetColor (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetColor (setting, value, TRUE); } break; case TypeMatch: { char *value; if (ccsIniGetString (importFile, ccsPluginGetName (plugin), keyName, &value)) { ccsSetMatch (setting, value, TRUE); free (value); } } break; case TypeList: { CCSSettingValueList value; if (ccsIniGetList (importFile, ccsPluginGetName (plugin), keyName, &value, setting)) { ccsSetList (setting, value, TRUE); ccsSettingValueListFree (value, TRUE); } } break; default: break; } free (keyName); } } /* We might be doing this from within compiz so make sure * to write out the new values */ ccsWriteChangedSettings (context); ccsIniClose (importFile); return TRUE; } Bool ccsCheckForSettingsUpgrade (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextCheckForSettingsUpgrade) (context); } Bool ccsImportFromFile (CCSContext *context, const char *fileName, Bool overwriteNonDefault) { if (!context) return FALSE; return (*(GET_INTERFACE (CCSContextInterface, context))->contextImportFromFile) (context, fileName, overwriteNonDefault); } const char * ccsPluginGetNameDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->name; } const char * ccsPluginGetShortDescDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->shortDesc; } const char * ccsPluginGetLongDescDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->longDesc; } const char * ccsPluginGetHintsDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->hints; } const char * ccsPluginGetCategoryDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->category; } CCSStringList ccsPluginGetLoadAfterDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->loadAfter; } CCSStringList ccsPluginGetLoadBeforeDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->loadBefore; } CCSStringList ccsPluginGetRequiresPluginsDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->requiresPlugin; } CCSStringList ccsPluginGetConflictPluginsDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->conflictPlugin; } CCSStringList ccsPluginGetProvidesFeaturesDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->providesFeature; } void * ccsPluginGetProvidesFeaturesBindable (CCSPlugin *plugin) { return (void *) ccsPluginGetProvidesFeatures (plugin); } CCSStringList ccsPluginGetRequiresFeaturesDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->requiresFeature; } void * ccsPluginGetPrivatePtrDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->privatePtr; } void ccsPluginSetPrivatePtrDefault (CCSPlugin *plugin, void *ptr) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); pPrivate->privatePtr = ptr; } CCSContext * ccsPluginGetContextDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->context; } /* CCSPlugin accessor functions */ const char * ccsPluginGetName (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetName) (plugin); } const char * ccsPluginGetShortDesc (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetShortDesc) (plugin); } const char * ccsPluginGetLongDesc (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetLongDesc) (plugin); } const char * ccsPluginGetHints (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetHints) (plugin); } const char * ccsPluginGetCategory (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetCategory) (plugin); } CCSStringList ccsPluginGetLoadAfter (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetLoadAfter) (plugin); } CCSStringList ccsPluginGetLoadBefore (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetLoadBefore) (plugin); } CCSStringList ccsPluginGetRequiresPlugins (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetRequiresPlugins) (plugin); } CCSStringList ccsPluginGetConflictPlugins (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetConflictPlugins) (plugin); } CCSStringList ccsPluginGetProvidesFeatures (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetProvidesFeatures) (plugin); } CCSStringList ccsPluginGetRequiresFeatures (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetRequiresFeatures) (plugin); } void * ccsPluginGetPrivatePtr (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetPrivatePtr) (plugin); } void ccsPluginSetPrivatePtr (CCSPlugin *plugin, void *ptr) { (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginSetPrivatePtr) (plugin, ptr); } CCSContext * ccsPluginGetContext (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetContext) (plugin); } CCSSettingList ccsGetPluginSettingsDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (!pPrivate->loaded) ccsLoadPluginSettings (plugin); return pPrivate->settings; } CCSSettingList ccsGetPluginSettings (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetPluginSettings) (plugin); } CCSGroupList ccsGetPluginGroupsDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (!pPrivate->loaded) ccsLoadPluginSettings (plugin); return pPrivate->groups; } CCSGroupList ccsGetPluginGroups (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetPluginGroups) (plugin); } const char * ccsSettingGetName (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetName) (setting); } const char * ccsSettingGetShortDesc (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetShortDesc) (setting); } const char * ccsSettingGetLongDesc (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetLongDesc) (setting); } CCSSettingType ccsSettingGetType (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetType) (setting); } CCSSettingInfo * ccsSettingGetInfo (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetInfo) (setting); } const char * ccsSettingGetGroup (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetGroup) (setting); } const char * ccsSettingGetSubGroup (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetSubGroup) (setting); } const char * ccsSettingGetHints (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetHints) (setting); } CCSSettingValue * ccsSettingGetDefaultValue (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetDefaultValue) (setting); } CCSSettingValue *ccsSettingGetValue (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetValue) (setting); } Bool ccsSettingGetIsDefault (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetIsDefault) (setting); } CCSPlugin * ccsSettingGetParent (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetParent) (setting); } void * ccsSettingGetPrivatePtr (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetPrivatePtr) (setting); } void ccsSettingSetPrivatePtr (CCSSetting *setting, void *ptr) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetPrivatePtr) (setting, ptr); } Bool ccsSettingGetIsIntegratedDefault (CCSSetting *setting) { if (!setting) return FALSE; CCSPlugin *plugin = ccsSettingGetParent (setting); CCSContext *context = ccsPluginGetContext (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return FALSE; if (ccsDynamicBackendSupportsIntegration (cPrivate->backend)) return ccsBackendGetSettingIsIntegrated ((CCSBackend *) cPrivate->backend, setting); return FALSE; } Bool ccsSettingGetIsReadOnlyDefault (CCSSetting *setting) { if (!setting) return FALSE; CCSPlugin *plugin = ccsSettingGetParent (setting); CCSContext *context = ccsPluginGetContext (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return FALSE; return ccsBackendGetSettingIsReadOnly ((CCSBackend *) cPrivate->backend, setting); } Bool ccsSettingGetIsReadableByBackendDefault (CCSSetting *setting) { static const CCSSettingType readableSettingTypes[] = { TypeBool, TypeInt, TypeFloat, TypeString, TypeColor, TypeKey, TypeButton, TypeEdge, TypeBell, TypeMatch, TypeList }; static const unsigned int readableSettingTypesNum = sizeof (readableSettingTypes) / sizeof (readableSettingTypes[0]); int i = 0; Bool isReadableType = FALSE; CCSSettingType type; CCSPlugin *plugin = ccsSettingGetParent (setting); CCSContext *context = ccsPluginGetContext (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return FALSE; type = ccsSettingGetType (setting); /* It is impossible for certain settings to have a schema, * such as actions and read only settings, so in that case * just return FALSE since compizconfig doesn't expect us * to read them anyways */ for (i = 0; i < readableSettingTypesNum; ++i) { if (readableSettingTypes[i] == type) { isReadableType = TRUE; break; } } if (isReadableType && !ccsSettingIsReadOnly (setting)) { return TRUE; } return FALSE; } /* Interface for CCSSetting */ const char * ccsSettingGetNameDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->name; } const char * ccsSettingGetShortDescDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->shortDesc; } const char * ccsSettingGetLongDescDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->longDesc; } CCSSettingType ccsSettingGetTypeDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->type; } CCSSettingInfo * ccsSettingGetInfoDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return &sPrivate->info; } const char * ccsSettingGetGroupDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->group; } const char * ccsSettingGetSubGroupDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->subGroup; } const char * ccsSettingGetHintsDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->hints; } CCSSettingValue * ccsSettingGetDefaultValueDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return &sPrivate->defaultValue; } CCSSettingValue * ccsSettingGetValueDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->value; } Bool ccsSettingGetIsDefaultDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->isDefault; } CCSPlugin * ccsSettingGetParentDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->parent; } void * ccsSettingGetPrivatePtrDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->privatePtr; } void ccsSettingSetPrivatePtrDefault (CCSSetting *setting, void *ptr) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); sPrivate->privatePtr = ptr; } CCSStrExtensionList ccsGetPluginStrExtensionsDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (!pPrivate->loaded) ccsLoadPluginSettings (plugin); return pPrivate->stringExtensions; } CCSStrExtensionList ccsGetPluginStrExtensions (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetPluginStrExtensions) (plugin); } CCSSettingValue * ccsIntegratedSettingReadValue (CCSIntegratedSetting *setting, CCSSettingType type) { return (*(GET_INTERFACE (CCSIntegratedSettingInterface, setting))->readValue) (setting, type); } void ccsIntegratedSettingWriteValue (CCSIntegratedSetting *setting, CCSSettingValue *value, CCSSettingType type) { (*(GET_INTERFACE (CCSIntegratedSettingInterface, setting))->writeValue) (setting, value, type); } const char * ccsIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *info) { return (*(GET_INTERFACE (CCSIntegratedSettingInfoInterface, info))->pluginName) (info); } const char * ccsIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *info) { return (*(GET_INTERFACE (CCSIntegratedSettingInfoInterface, info))->settingName) (info); } CCSSettingType ccsIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *info) { return (*(GET_INTERFACE (CCSIntegratedSettingInfoInterface, info))->getType) (info); } void ccsFreeIntegratedSettingInfo (CCSIntegratedSettingInfo *info) { (*(GET_INTERFACE (CCSIntegratedSettingInfoInterface, info))->free) (info); } void ccsFreeIntegratedSetting (CCSIntegratedSetting *setting) { (*(GET_INTERFACE (CCSIntegratedSettingInterface, setting))->free) (setting); } CCSSetting * ccsSettingDefaultImplNew (CCSPlugin *plugin, const char *name, CCSSettingType type, const char *shortDesc, const char *longDesc, const char *hints, const char *group, const char *subGroup, CCSSettingDefaultValueInitializerFunc valueInit, void *valueInitData, CCSSettingInfoInitializerFunc infoInit, void *infoInitData, CCSObjectAllocationInterface *ai, const CCSInterfaceTable *interfaces) { CCSSetting *setting = (CCSSetting *) calloc (1, sizeof (CCSSetting)); if (!setting) return NULL; ccsObjectInit (setting, ai); CCSSettingPrivate *sPrivate = (CCSSettingPrivate *) (*ai->calloc_) (ai->allocator, 1, sizeof (CCSSettingPrivate)); if (!sPrivate) { free (setting); return NULL; } ccsObjectSetPrivate (setting, (CCSPrivate *) sPrivate); ccsObjectAddInterface (setting, (CCSInterface *) interfaces->settingInterface, GET_INTERFACE_TYPE (CCSSettingInterface)); ccsSettingRef (setting); sPrivate->parent = plugin; sPrivate->isDefault = TRUE; sPrivate->name = strdup (name); sPrivate->shortDesc = strdup (shortDesc); sPrivate->longDesc = strdup (longDesc); sPrivate->group = strdup (group); sPrivate->hints = strdup (hints); sPrivate->subGroup = strdup (subGroup); sPrivate->type = type; sPrivate->value = &sPrivate->defaultValue; sPrivate->defaultValue.parent = setting; (*infoInit) (type, &sPrivate->info, infoInitData); (*valueInit) (type, &sPrivate->info, &sPrivate->defaultValue, valueInitData); return setting; } /* CCSSharedIntegratedSettingInfo implementation */ typedef struct _CCSSharedIntegratedSettingInfoPrivate CCSSharedIntegratedSettingInfoPrivate; struct _CCSSharedIntegratedSettingInfoPrivate { const char *pluginName; const char *settingName; CCSSettingType type; }; static const char * ccsSharedIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *setting) { CCSSharedIntegratedSettingInfoPrivate *priv = (CCSSharedIntegratedSettingInfoPrivate *) ccsObjectGetPrivate (setting); return priv->settingName; } static const char * ccsSharedIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *setting) { CCSSharedIntegratedSettingInfoPrivate *priv = (CCSSharedIntegratedSettingInfoPrivate *) ccsObjectGetPrivate (setting); return priv->pluginName; } static CCSSettingType ccsSharedIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *setting) { CCSSharedIntegratedSettingInfoPrivate *priv = (CCSSharedIntegratedSettingInfoPrivate *) ccsObjectGetPrivate (setting); return priv->type; } static void ccsSharedIntegratedSettingInfoFree (CCSIntegratedSettingInfo *setting) { ccsObjectFinalize (setting); (*setting->object.object_allocation->free_) (setting->object.object_allocation->allocator, setting); } const CCSIntegratedSettingInfoInterface ccsSharedIntegratedSettingInfoInterface = { ccsSharedIntegratedSettingInfoPluginName, ccsSharedIntegratedSettingInfoSettingName, ccsSharedIntegratedSettingInfoGetType, ccsSharedIntegratedSettingInfoFree }; CCSIntegratedSettingInfo * ccsSharedIntegratedSettingInfoNew (const char *pluginName, const char *settingName, CCSSettingType type, CCSObjectAllocationInterface *ai) { CCSIntegratedSettingInfo *info = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSetting)); if (!info) return NULL; CCSSharedIntegratedSettingInfoPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSSharedIntegratedSettingInfoPrivate)); if (!priv) { (*ai->free_) (ai->allocator, info); return NULL; } priv->pluginName = pluginName; priv->settingName = settingName; priv->type = type; ccsObjectInit (info, ai); ccsObjectSetPrivate (info, (CCSPrivate *) priv); ccsObjectAddInterface (info, (const CCSInterface *) &ccsSharedIntegratedSettingInfoInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInfoInterface)); ccsIntegratedSettingInfoRef (info); return info; } CCSIntegratedSettingList ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate (CCSIntegratedSettingsStorage *storage, CCSIntegratedSettingsStorageFindPredicate pred, void *data) { return (*(GET_INTERFACE (CCSIntegratedSettingsStorageInterface, storage))->findMatchingSettingsByPredicate) (storage, pred, data); } CCSIntegratedSettingList ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (CCSIntegratedSettingsStorage *storage, const char *pluginName, const char *settingName) { return (*(GET_INTERFACE (CCSIntegratedSettingsStorageInterface, storage))->findMatchingSettingsByPluginAndSettingName) (storage, pluginName, settingName); } void ccsIntegratedSettingsStorageAddSetting (CCSIntegratedSettingsStorage *storage, CCSIntegratedSetting *setting) { (*(GET_INTERFACE (CCSIntegratedSettingsStorageInterface, storage))->addSetting) (storage, setting); } Bool ccsIntegratedSettingsStorageEmpty (CCSIntegratedSettingsStorage *storage) { return (*(GET_INTERFACE (CCSIntegratedSettingsStorageInterface, storage))->empty) (storage); } void ccsFreeIntegratedSettingsStorage (CCSIntegratedSettingsStorage *storage) { (*(GET_INTERFACE (CCSIntegratedSettingsStorageInterface, storage))->free) (storage); } /* CCSIntegratedSettingsStorageDefault implementation */ typedef struct _CCSIntegratedSettingsStorageDefaultPrivate CCSIntegratedSettingsStorageDefaultPrivate; struct _CCSIntegratedSettingsStorageDefaultPrivate { CCSIntegratedSettingList settingList; }; typedef struct _CCSIntegratedSettingsStorageFindByNamesData { const char *pluginName; const char *settingName; } CCSIntegratedSettingsStorageFindByNamesData; static Bool ccsIntegratedSettingsStorageFindByNamesPredicate (CCSIntegratedSetting *setting, void *data) { CCSIntegratedSettingsStorageFindByNamesData *findNamesData = (CCSIntegratedSettingsStorageFindByNamesData *) data; const char *sPluginName = ccsIntegratedSettingInfoPluginName ((CCSIntegratedSettingInfo *) setting); const char *sSettingName = ccsIntegratedSettingInfoSettingName ((CCSIntegratedSettingInfo *) setting); if (strcmp (sPluginName, findNamesData->pluginName) == 0 && strcmp (sSettingName, findNamesData->settingName) == 0) { return TRUE; } return FALSE; } CCSIntegratedSettingList ccsIntegratedSettingsStorageDefaultFindMatchingSettingsByPredicate (CCSIntegratedSettingsStorage *storage, CCSIntegratedSettingsStorageFindPredicate pred, void *data) { CCSIntegratedSettingsStorageDefaultPrivate *priv = (CCSIntegratedSettingsStorageDefaultPrivate *) ccsObjectGetPrivate (storage); CCSIntegratedSettingList returnList = NULL; CCSIntegratedSettingList iter = priv->settingList; while (iter) { if (iter->data != NULL && pred (iter->data, data)) returnList = ccsIntegratedSettingListAppend (returnList, iter->data); iter = iter->next; } return returnList; } CCSIntegratedSettingList ccsIntegratedSettingsStorageDefaultFindMatchingSettingsByPluginAndSettingName (CCSIntegratedSettingsStorage *storage, const char *pluginName, const char *settingName) { CCSIntegratedSettingsStorageFindByNamesData data = { pluginName, settingName }; return ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate (storage, ccsIntegratedSettingsStorageFindByNamesPredicate, (void *) &data); } void ccsIntegratedSettingsStorageDefaultAddSetting (CCSIntegratedSettingsStorage *storage, CCSIntegratedSetting *setting) { CCSIntegratedSettingsStorageDefaultPrivate *priv = (CCSIntegratedSettingsStorageDefaultPrivate *) ccsObjectGetPrivate (storage); priv->settingList = ccsIntegratedSettingListAppend (priv->settingList, setting); } Bool ccsIntegratedSettingsStorageDefaultEmpty (CCSIntegratedSettingsStorage *storage) { CCSIntegratedSettingsStorageDefaultPrivate *priv = (CCSIntegratedSettingsStorageDefaultPrivate *) ccsObjectGetPrivate (storage); return priv->settingList == NULL; } void ccsIntegratedSettingsStorageDefaultImplFree (CCSIntegratedSettingsStorage *storage) { CCSIntegratedSettingsStorageDefaultPrivate *priv = (CCSIntegratedSettingsStorageDefaultPrivate *) ccsObjectGetPrivate (storage); if (priv->settingList) ccsIntegratedSettingListFree (priv->settingList, TRUE); ccsObjectFinalize (storage); (*storage->object.object_allocation->free_) (storage->object.object_allocation->allocator, storage); } const CCSIntegratedSettingsStorageInterface ccsIntegratedSettingsStorageDefaultImplInterface = { ccsIntegratedSettingsStorageDefaultFindMatchingSettingsByPredicate, ccsIntegratedSettingsStorageDefaultFindMatchingSettingsByPluginAndSettingName, ccsIntegratedSettingsStorageDefaultAddSetting, ccsIntegratedSettingsStorageDefaultEmpty, ccsIntegratedSettingsStorageDefaultImplFree }; CCSIntegratedSettingsStorage * ccsIntegratedSettingsStorageDefaultImplNew (CCSObjectAllocationInterface *ai) { CCSIntegratedSettingsStorage *storage = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingsStorage)); if (!storage) return NULL; CCSIntegratedSettingsStorageDefaultPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingsStorageDefaultPrivate)); if (!priv) { (*ai->free_) (ai->allocator, storage); return NULL; } ccsObjectInit (storage, ai); ccsObjectSetPrivate (storage, (CCSPrivate *) priv); ccsObjectAddInterface (storage, (const CCSInterface *) &ccsIntegratedSettingsStorageDefaultImplInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingsStorageInterface)); ccsIntegratedSettingsStorageRef (storage); return storage; } CCSIntegratedSetting * ccsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (CCSIntegratedSettingFactory *factory, CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type) { return (*(GET_INTERFACE (CCSIntegratedSettingFactoryInterface, factory))->createIntegratedSettingForCCSSettingNameAndType) (factory, integration, pluginName, settingName, type); } void ccsFreeIntegratedSettingFactory (CCSIntegratedSettingFactory *factory) { (*(GET_INTERFACE (CCSIntegratedSettingFactoryInterface, factory))->free) (factory); } static const CCSPluginInterface ccsDefaultPluginInterface = { ccsPluginGetNameDefault, ccsPluginGetShortDescDefault, ccsPluginGetLongDescDefault, ccsPluginGetHintsDefault, ccsPluginGetCategoryDefault, ccsPluginGetLoadAfterDefault, ccsPluginGetLoadBeforeDefault, ccsPluginGetRequiresPluginsDefault, ccsPluginGetConflictPluginsDefault, ccsPluginGetProvidesFeaturesDefault, ccsPluginGetRequiresFeaturesDefault, ccsPluginGetPrivatePtrDefault, ccsPluginSetPrivatePtrDefault, ccsPluginGetContextDefault, ccsFindSettingDefault, ccsGetPluginSettingsDefault, ccsGetPluginGroupsDefault, ccsReadPluginSettingsDefault, ccsGetPluginStrExtensionsDefault, ccsFreePluginDefault }; const CCSContextInterface ccsDefaultContextInterface = { ccsContextGetPluginsDefault, ccsContextGetCategoriesDefault, ccsContextGetChangedSettingsDefault, ccsContextGetScreenNumDefault, ccsContextAddChangedSettingDefault, ccsContextClearChangedSettingsDefault, ccsContextStealChangedSettingsDefault, ccsContextGetPrivatePtrDefault, ccsContextSetPrivatePtrDefault, ccsLoadPluginDefault, ccsFindPluginDefault, ccsPluginIsActiveDefault, ccsGetActivePluginListDefault, ccsGetSortedPluginStringListDefault, ccsSetBackendDefault, ccsGetBackendDefault, ccsSetIntegrationEnabledDefault, ccsSetProfileDefault, ccsSetPluginListAutoSortDefault, ccsGetProfileDefault, ccsGetIntegrationEnabledDefault, ccsGetPluginListAutoSortDefault, ccsProcessEventsDefault, ccsReadSettingsDefault, ccsWriteSettingsDefault, ccsWriteChangedSettingsDefault, ccsExportToFileDefault, ccsImportFromFileDefault, ccsCanEnablePluginDefault, ccsCanDisablePluginDefault, ccsGetExistingProfilesDefault, ccsDeleteProfileDefault, ccsCheckForSettingsUpgradeDefault, ccsLoadPluginsDefault, ccsFreeContextDefault }; static const CCSSettingInterface ccsDefaultSettingInterface = { ccsSettingGetNameDefault, ccsSettingGetShortDescDefault, ccsSettingGetLongDescDefault, ccsSettingGetTypeDefault, ccsSettingGetInfoDefault, ccsSettingGetGroupDefault, ccsSettingGetSubGroupDefault, ccsSettingGetHintsDefault, ccsSettingGetDefaultValueDefault, ccsSettingGetValueDefault, ccsSettingGetIsDefaultDefault, ccsSettingGetParentDefault, ccsSettingGetPrivatePtrDefault, ccsSettingSetPrivatePtrDefault, ccsSettingSetIntDefault, ccsSettingSetFloatDefault, ccsSettingSetBoolDefault, ccsSettingSetStringDefault, ccsSettingSetColorDefault, ccsSettingSetMatchDefault, ccsSettingSetKeyDefault, ccsSettingSetButtonDefault, ccsSettingSetEdgeDefault, ccsSettingSetBellDefault, ccsSettingSetListDefault, ccsSettingSetValueDefault, ccsSettingGetIntDefault, ccsSettingGetFloatDefault, ccsSettingGetBoolDefault, ccsSettingGetStringDefault, ccsSettingGetColorDefault, ccsSettingGetMatchDefault, ccsSettingGetKeyDefault, ccsSettingGetButtonDefault, ccsSettingGetEdgeDefault, ccsSettingGetBellDefault, ccsSettingGetListDefault, ccsSettingResetToDefaultDefault, ccsSettingGetIsIntegratedDefault, ccsSettingGetIsReadOnlyDefault, ccsSettingGetIsReadableByBackendDefault, ccsFreeSettingDefault }; const CCSBackendInterface ccsDynamicBackendInterfaceWrapper = { ccsDynamicBackendGetInfoWrapper, ccsDynamicBackendExecuteEventsWrapper, ccsDynamicBackendInitWrapper, ccsDynamicBackendFiniWrapper, ccsDynamicBackendReadInitWrapper, ccsDynamicBackendReadSettingWrapper, ccsDynamicBackendReadDoneWrapper, ccsDynamicBackendWriteInitWrapper, ccsDynamicBackendWriteSettingWrapper, ccsDynamicBackendWriteDoneWrapper, ccsDynamicBackendUpdateSettingWrapper, ccsDynamicBackendGetSettingIsIntegratedWrapper, ccsDynamicBackendGetSettingIsReadOnlyWrapper, ccsDynamicBackendGetExistingProfilesWrapper, ccsDynamicBackendDeleteProfileWrapper, ccsDynamicBackendSetIntegrationWrapper }; const CCSDynamicBackendInterface ccsDefaultDynamicBackendInterface = { ccsDynamicBackendGetBackendNameDefault, ccsDynamicBackendSupportsReadDefault, ccsDynamicBackendSupportsWriteDefault, ccsDynamicBackendSupportsIntegrationDefault, ccsDynamicBackendSupportsProfilesDefault, ccsDynamicBackendGetRawBackendDefault }; const CCSInterfaceTable ccsDefaultInterfaceTable = { &ccsDefaultContextInterface, &ccsDefaultPluginInterface, &ccsDefaultSettingInterface, &ccsDynamicBackendInterfaceWrapper, &ccsDefaultDynamicBackendInterface }; compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_config_file.h0000644000015301777760000000224612321343002027377 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * ccs_config_file.h * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef CCS_CONFIG_FILE_H #define CCS_CONFIG_FILE_H #include #include #include "ccs_config_file_interface.h" COMPIZCONFIG_BEGIN_DECLS CCSConfigFile * ccsInternalConfigFileNew (CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_text_file.c0000644000015301777760000001165012321343002027110 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * ccs_text_file.c * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include typedef struct _CCSUnixTextFilePrivate CCSUnixTextFilePrivate; struct _CCSUnixTextFilePrivate { FILE *unixFile; }; static void freeAndFinalizeCCSTextFile (CCSTextFile *file, CCSObjectAllocationInterface *ai) { ccsObjectFinalize (file); (*ai->free_) (ai->allocator, file); } static char * ccsUnixTextFileReadFromStart (CCSTextFile *textFile) { CCSUnixTextFilePrivate *priv = GET_PRIVATE (CCSUnixTextFilePrivate, textFile); FILE *completedUpgrades = priv->unixFile; char *cuBuffer; unsigned int cuSize; size_t cuReadSize; fseek (completedUpgrades, 0, SEEK_END); cuSize = ftell (completedUpgrades); rewind (completedUpgrades); cuBuffer = calloc (cuSize + 1, sizeof (char)); if (!cuBuffer) return NULL; cuReadSize = fread (cuBuffer, 1, cuSize, completedUpgrades); /* ccsWarning ("Couldn't read completed upgrades file!"); */ if (cuReadSize != cuSize) { free (cuBuffer); return NULL; } cuBuffer[cuSize] = '\0'; return cuBuffer; } static Bool ccsUnixTextFileAppendString (CCSTextFile *textFile, const char *str) { CCSUnixTextFilePrivate *priv = GET_PRIVATE (CCSUnixTextFilePrivate, textFile); FILE *completedUpgrades = priv->unixFile; fprintf (completedUpgrades, "%s\n", str); return TRUE; } static void ccsUnixFreeTextFile (CCSTextFile *textFile) { CCSUnixTextFilePrivate *priv = GET_PRIVATE (CCSUnixTextFilePrivate, textFile); fclose (priv->unixFile); priv->unixFile = NULL; freeAndFinalizeCCSTextFile (textFile, textFile->object.object_allocation); } CCSTextFileInterface ccsUnixTextFileInterface = { ccsUnixTextFileReadFromStart, ccsUnixTextFileAppendString, ccsUnixFreeTextFile }; const char * CCS_UNIX_TEXT_FILE_OPEN_MODE_READONLY = "r"; const char * CCS_UNIX_TEXT_FILE_OPEN_MODE_READWRITE = "r+"; const char * CCS_UNIX_TEXT_FILE_OPEN_MODE_READWRITECREATE = "a+"; static FILE * openUnixFile (CCSTextFile *textFile, CCSObjectAllocationInterface *ai, const char *path, const char *openMode) { FILE *file = fopen (path, openMode); if (!file) { ccsObjectFinalize (textFile); (*ai->free_) (ai->allocator, textFile); return NULL; } return file; } static CCSUnixTextFilePrivate * allocateCCSUnixTextFilePrivate (CCSTextFile *file, CCSObjectAllocationInterface *ai) { CCSUnixTextFilePrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSUnixTextFilePrivate)); if (!priv) { freeAndFinalizeCCSTextFile (file, ai); return NULL; } return priv; } static CCSTextFile * allocateCCSTextFile (CCSObjectAllocationInterface *ai) { CCSTextFile *textFile = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSTextFile)); if (!textFile) return NULL; ccsObjectInit (textFile, ai); return textFile; } CCSTextFile * ccsUnixTextFileNew (const char *path, CCSTextFileOpenMode openMode, CCSObjectAllocationInterface *ai) { const char *fopenMode = NULL; switch (openMode) { case ReadOnly: fopenMode = CCS_UNIX_TEXT_FILE_OPEN_MODE_READONLY; break; case ReadWrite: fopenMode = CCS_UNIX_TEXT_FILE_OPEN_MODE_READWRITE; break; case ReadWriteCreate: fopenMode = CCS_UNIX_TEXT_FILE_OPEN_MODE_READWRITECREATE; break; } CCSTextFile *textFile = allocateCCSTextFile (ai); if (!textFile) return NULL; CCSUnixTextFilePrivate *priv = allocateCCSUnixTextFilePrivate (textFile, ai); if (!priv) return NULL; ccsObjectSetPrivate (textFile, (CCSPrivate *) priv); FILE *unixFile = openUnixFile (textFile, ai, path, fopenMode); if (!unixFile) return NULL; priv->unixFile = unixFile; ccsObjectAddInterface (textFile, (const CCSInterface *) &ccsUnixTextFileInterface, GET_INTERFACE_TYPE (CCSTextFileInterface)); ccsObjectRef (textFile); return textFile; } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/CMakeLists.txt0000644000015301777760000000510312321343002026665 0ustar pbusernogroup00000000000000include_directories ( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${LIBCOMPIZCONFIG_INCLUDE_DIRS} ) set (LIBCOMPIZCONFIG_FILES bindings.c ccs-private.h compiz.cpp config.c filewatch.c ini.c iniparser.c iniparser.h lists.c main.c log.c ccs_config_file.c ccs_config_file_interface.c ccs_backend_loader.c ccs_backend_loader_interface.c ) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${COMPIZ_PLUGINDIR}\\\" -DIMAGEDIR=\\\"${COMPIZ_IMAGEDIR}\\\" -DMETADATADIR=\\\"${COMPIZ_METADATADIR}\\\" -DSYSCONFDIR=\\\"${COMPIZ_SYSCONFDIR}\\\" -DDATADIR=\\\"${COMPIZ_DATADIR}\\\" -DLIBDIR=\\\"${COMPIZ_LIBDIR}\\\" ) if (HAVE_PROTOBUF) add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/compizconfig.pb.cc COMMAND ${HAVE_PROTOC} ARGS --cpp_out=${CMAKE_CURRENT_BINARY_DIR} compizconfig.proto WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set (LIBCOMPIZCONFIG_FILES ${LIBCOMPIZCONFIG_FILES} ${CMAKE_CURRENT_BINARY_DIR}/compizconfig.pb.cc ) set (LIBCOMPIZCONFIG_LIBRARIES ${LIBCOMPIZCONFIG_LIBRARIES} protobuf) add_definitions ( -DUSE_PROTOBUF ) endif (HAVE_PROTOBUF) if (HAVE_INOTIFY) add_definitions ( -DHAVE_SYS_INOTIFY_H ) endif (HAVE_INOTIFY) add_library ( ccs_text_file_interface STATIC ccs_text_file_interface.c ) add_library ( ccs_text_file STATIC ccs_text_file.c ) target_link_libraries ( ccs_text_file ccs_text_file_interface ) add_library ( ccs_settings_upgrade_internal STATIC ccs_settings_upgrade_internal.c ) add_library ( compizconfig SHARED ${LIBCOMPIZCONFIG_FILES} ) set_target_properties (compizconfig PROPERTIES VERSION 0.0.0 SOVERSION 0 ) link_directories ( ${LIBCOMPIZCONFIG_LINK_DIRS} ) target_link_libraries ( compizconfig ${LIBCOMPIZCONFIG_LIBRARIES} m pthread dl ccs_settings_upgrade_internal ccs_text_file ) # # Tell CMake that targets using compizconfig should NOT re-import the # libraries that compizconfig depends on (contains). # set_target_properties (compizconfig PROPERTIES LINK_INTERFACE_LIBRARIES "" ) set (COMPIZCONFIG_LIBS "") foreach (_val ${LIBCOMPIZCONFIG_LDFLAGS}) set (COMPIZCONFIG_LIBS "${COMPIZCONFIG_LIBS}${_val} ") endforeach (_val ${LIBCOMPIZCONFIG_LDFLAGS}) set (COMPIZCONFIG_CFLAGS "") foreach (_val ${LIBCOMPIZCONFIG_CFLAGS}) set (COMPIZCONFIG_CFLAGS "${COMPIZCONFIG_CFLAGS}${_val} ") endforeach (_val ${LIBCOMPIZCONFIG_CFLAGS}) install ( TARGETS compizconfig DESTINATION ${libcompizconfig_libdir} ) compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs-modifier-list-inl.h0000644000015301777760000000265112321343002030400 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _CCS_MODIFIER_LIST_INL_H #define _CCS_MODIFIER_LIST_INL_H #include COMPIZCONFIG_BEGIN_DECLS #include #include #define CompAltMask (1 << 16) #define CompMetaMask (1 << 17) #define CompSuperMask (1 << 18) #define CompHyperMask (1 << 19) #define CompModeSwitchMask (1 << 20) #define CompNumLockMask (1 << 21) #define CompScrollLockMask (1 << 22) struct _Modifier { char *name; int modifier; }; extern struct _Modifier modifierList[]; unsigned int ccsInternalUtilNumModifiers (); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ccs_text_file.h0000644000015301777760000000251412321343002027114 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * ccs_text_file.h * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef CCS_TEXT_FILE_H #define CCS_TEXT_FILE_H #include #include #include "ccs_text_file_interface.h" COMPIZCONFIG_BEGIN_DECLS typedef enum _CCSTextFileOpenMode { ReadOnly = 1, ReadWrite = 2, ReadWriteCreate = 3 } CCSTextFileOpenMode; CCSTextFile * ccsUnixTextFileNew (const char *path, CCSTextFileOpenMode openMode, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/filewatch.c0000644000015301777760000001141712321343002026244 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H # include "../config.h" #endif #define _GNU_SOURCE #include #include #include #include #include #if HAVE_SYS_INOTIFY_H #include #endif #include #include #include "ccs-private.h" typedef struct _FilewatchData { char *fileName; int watchDesc; unsigned int watchId; FileWatchCallbackProc callback; void *closure; } FilewatchData; static FilewatchData *fwData = NULL; static int fwDataSize = 0; static int inotifyFd = 0; static inline int findDataIndexById (unsigned int watchId) { int i, index = -1; for (i = 0; i < fwDataSize; ++i) if (fwData[i].watchId == watchId) { index = i; break; } return index; } void ccsCheckFileWatches (void) { #if HAVE_SYS_INOTIFY_H char buf[256 * (sizeof (struct inotify_event) + 16)]; struct inotify_event *event; int len, i = 0, j; if (!inotifyFd) return; len = read (inotifyFd, buf, sizeof (buf)); if (len < 0) return; while (i < len) { event = (struct inotify_event *) & buf[i]; for (j = 0; j < fwDataSize; ++j) if ((fwData[j].watchDesc == event->wd) && fwData[j].callback) (*fwData[j].callback) (fwData[j].watchId, fwData[j].closure); i += sizeof (*event) + event->len; } #endif } unsigned int ccsAddFileWatch (const char *fileName, Bool enable, FileWatchCallbackProc callback, void *closure) { unsigned int i, maxWatchId = 0; #if HAVE_SYS_INOTIFY_H if (!inotifyFd) { inotifyFd = inotify_init (); fcntl (inotifyFd, F_SETFL, O_NONBLOCK); } #endif fwData = realloc (fwData, (fwDataSize + 1) * sizeof (FilewatchData)); if (!fwData) { fwDataSize = 0; return 0; } fwData[fwDataSize].fileName = strdup (fileName); #if HAVE_SYS_INOTIFY_H if (enable) fwData[fwDataSize].watchDesc = inotify_add_watch (inotifyFd, fileName, IN_MODIFY | IN_MOVE | IN_MOVE_SELF | IN_DELETE_SELF | IN_CREATE | IN_DELETE); else #endif fwData[fwDataSize].watchDesc = 0; fwData[fwDataSize].callback = callback; fwData[fwDataSize].closure = closure; /* determine current highest ID */ for (i = 0; i < fwDataSize; ++i) if (fwData[i].watchId > maxWatchId) maxWatchId = fwData[i].watchId; fwData[fwDataSize].watchId = maxWatchId + 1; ++fwDataSize; return (maxWatchId + 1); } void ccsRemoveFileWatch (unsigned int watchId) { int selectedIndex, i; selectedIndex = findDataIndexById (watchId); /* not found */ if (selectedIndex < 0) return; /* clear entry */ free (fwData[selectedIndex].fileName); #if HAVE_SYS_INOTIFY_H if (fwData[selectedIndex].watchDesc) inotify_rm_watch (inotifyFd, fwData[selectedIndex].watchDesc); #endif /* shrink array */ for (i = selectedIndex; i < (fwDataSize - 1); ++i) fwData[i] = fwData[i+1]; --fwDataSize; if (fwDataSize > 0) { fwData = realloc (fwData, fwDataSize * sizeof (FilewatchData)); if (!fwData) fwDataSize = 0; } else { free (fwData); fwData = NULL; } if (!fwDataSize) { if (inotifyFd) close (inotifyFd); inotifyFd = 0; } } void ccsDisableFileWatch (unsigned int watchId) { int index; index = findDataIndexById (watchId); if (index < 0) return; #if HAVE_SYS_INOTIFY_H if (fwData[index].watchDesc) { inotify_rm_watch (inotifyFd, fwData[index].watchDesc); fwData[index].watchDesc = 0; } #endif } void ccsEnableFileWatch (unsigned int watchId) { int index; index = findDataIndexById (watchId); if (index < 0) return; #if HAVE_SYS_INOTIFY_H if (!fwData[index].watchDesc) fwData[index].watchDesc = inotify_add_watch (inotifyFd, fwData[index].fileName, IN_MODIFY | IN_MOVE | IN_MOVE_SELF | IN_DELETE_SELF | IN_CREATE | IN_DELETE); #endif } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/iniparser.h0000644000015301777760000000332712321343002026300 0ustar pbusernogroup00000000000000/* Based upon libiniparser, by Nicolas Devillard Hacked into 1 file (m-iniparser) by Freek/2005 Original terms following: -- - Copyright (c) 2000 by Nicolas Devillard (ndevilla AT free DOT fr). Written by Nicolas Devillard. Not derived from licensed software. Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. The author is not responsible for the consequences of use of this software, no matter how awful, even if they arise from defects in it. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. This notice may not be removed or altered. */ #ifndef _INIPARSER_H_ #define _INIPARSER_H_ #include #include #include #include #include #include typedef IniDictionary dictionary; typedef struct _FileLock { int fd; } FileLock; /* generated by genproto */ dictionary * iniparser_new(char *ininame); dictionary * dictionary_new(int size); void iniparser_free(dictionary * d); int iniparser_getnsec(dictionary * d); char * iniparser_getsecname(dictionary * d, int n); void iniparser_dump_ini(dictionary * d, const char * file_name); char * iniparser_getstring(dictionary * d, char * key, char * def); void iniparser_add_entry(dictionary * d, char * sec, char * key, char * val); int iniparser_find_entry(dictionary * ini, char * entry); int iniparser_setstr(dictionary * ini, char * entry, char * val); void iniparser_unset(dictionary * ini, char * entry); #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/ini.c0000644000015301777760000004155212321343002025060 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define _GNU_SOURCE #include #include #include #include #include #include "iniparser.h" /** * Creates the parent directory for @fileName, recursively creating a directory * tree if necessary. * * @param fileName: The absolute path to the desired file * @return: True if the parent directory of the file now exists **/ Bool ccsCreateDirFor (const char *fileName) { char *path, *delim; Bool success; delim = strrchr (fileName, '/'); if (!delim) return FALSE; /* Input string is not a valid absolue path! */ path = malloc (delim - fileName + 1); if (!path) return FALSE; strncpy (path, fileName, delim - fileName); path[delim - fileName] = '\0'; success = !mkdir (path, 0700); /* Mkdir returns 0 on success */ success |= (errno == EEXIST); if (!success && (errno == ENOENT)) /* ENOENT means we must recursively */ { /* create the parent's parent */ if (ccsCreateDirFor (path)) success = !mkdir (path, 0700); } free (path); return success; } IniDictionary * ccsIniOpen (const char * fileName) { FILE *file; if (!ccsCreateDirFor(fileName)) return NULL; /* create file if it doesn't exist or is desired */ file = fopen (fileName, "a+"); if (file) fclose (file); return iniparser_new ((char*) fileName); } IniDictionary* ccsIniNew (void) { return dictionary_new (0); } void ccsIniClose (IniDictionary *dictionary) { iniparser_free (dictionary); } void ccsIniSave (IniDictionary *dictionary, const char *fileName) { if (!ccsCreateDirFor (fileName)) return; iniparser_dump_ini (dictionary, fileName); } static char* getIniString (IniDictionary *dictionary, const char *section, const char *entry) { char *sectionName; char *retValue; if (asprintf (§ionName, "%s:%s", section, entry) == -1) return NULL; retValue = iniparser_getstring (dictionary, sectionName, NULL); free (sectionName); return retValue; } static void setIniString (IniDictionary *dictionary, const char *section, const char *entry, const char *value) { char *sectionName; if (asprintf (§ionName, "%s:%s", section, entry) == -1) return; if (!iniparser_find_entry (dictionary, (char*) section)) iniparser_add_entry (dictionary, (char*) section, NULL, NULL); iniparser_setstr (dictionary, sectionName, (char*) value); free (sectionName); } Bool ccsIniParseString (char *str, char **value) { *value = strdup (str); return TRUE; } Bool ccsIniGetString (IniDictionary *dictionary, const char *section, const char *entry, char **value) { char *retValue; retValue = getIniString (dictionary, section, entry); if (retValue) { ccsIniParseString (retValue, value); return TRUE; } else return FALSE; } Bool ccsIniParseInt (const char *str, int *value) { *value = strtoul (str, NULL, 10); return TRUE; } Bool ccsIniGetInt (IniDictionary *dictionary, const char *section, const char *entry, int *value) { char *retValue; retValue = getIniString (dictionary, section, entry); if (retValue) { ccsIniParseInt (retValue, value); return TRUE; } else return FALSE; } Bool ccsIniParseFloat (const char *str, float *value) { if (str) { *value = (float) strtod (str, NULL); return TRUE; } else return FALSE; } Bool ccsIniGetFloat (IniDictionary *dictionary, const char *section, const char *entry, float *value) { char *retValue = getIniString (dictionary, section, entry); return ccsIniParseFloat (retValue, value); } Bool ccsIniParseBool (const char *str, Bool *value) { if (str) { if ((str[0] == 't') || (str[0] == 'T') || (str[0] == 'y') || (str[0] == 'Y') || (str[0] == '1')) { *value = TRUE; } else *value = FALSE; return TRUE; } else return FALSE; } Bool ccsIniGetBool (IniDictionary *dictionary, const char *section, const char *entry, Bool *value) { char *retValue = getIniString (dictionary, section, entry); return ccsIniParseBool (retValue, value); } Bool ccsIniParseColor (const char *str, CCSSettingColorValue *value) { if (str && ccsStringToColor (str, value)) return TRUE; else return FALSE; } Bool ccsIniGetColor (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingColorValue *value) { char *retValue = getIniString (dictionary, section, entry); return ccsIniParseColor (retValue, value); } Bool ccsIniParseKey (const char *str, CCSSettingKeyValue *value) { if (str) return ccsStringToKeyBinding (str, value); return FALSE; } Bool ccsIniGetKey (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingKeyValue *value) { char *retValue = getIniString (dictionary, section, entry); return ccsIniParseKey (retValue, value); } Bool ccsIniParseButton (const char *str, CCSSettingButtonValue *value) { if (str) return ccsStringToButtonBinding (str, value); else return FALSE; } Bool ccsIniGetButton (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingButtonValue *value) { char *retValue = getIniString (dictionary, section, entry); return ccsIniParseButton (retValue, value); } Bool ccsIniParseEdge (const char *str, unsigned int *value) { if (str) { *value = ccsStringToEdges (str); return TRUE; } else return FALSE; } Bool ccsIniGetEdge (IniDictionary *dictionary, const char *section, const char *entry, unsigned int *value) { char *retValue = getIniString (dictionary, section, entry); return ccsIniParseEdge (retValue, value); } Bool ccsIniGetBell (IniDictionary *dictionary, const char *section, const char *entry, Bool *value) { return ccsIniGetBool (dictionary, section, entry, value); } static Bool isEmptyString (char *value) { int len, i = 0; len = strlen (value); for (i = 0; i < len; ++i) { if (!isblank (value[i])) return FALSE; } return TRUE; } Bool ccsIniParseList (const char *str, CCSSettingValueList *value, CCSSetting *parent) { CCSSettingValueList list = NULL; char *valueString, *valueStart; char *token; int nItems = 1, i = 0, len; valueString = strdup (str); valueStart = valueString; /* remove trailing semicolon that we added to be able to differentiate between an empty list and a list with one empty item */ len = strlen (valueString); if (valueString[len - 1] == ';') valueString[len - 1] = 0; token = strchr (valueString, ';'); while (token) { token = strchr (token + 1, ';'); ++nItems; } token = strsep (&valueString, ";"); switch (ccsSettingGetInfo (parent)->forList.listType) { case TypeString: case TypeMatch: { char **array = malloc (nItems * sizeof (char*)); if (!array) break; while (token) { array[i++] = strdup (token); token = strsep (&valueString, ";"); } list = ccsGetValueListFromStringArray ((const char **) array, nItems, parent); for (i = 0; i < nItems; ++i) free (array[i]); free (array); } break; case TypeColor: { CCSSettingColorValue *array; array = malloc (nItems * sizeof (CCSSettingColorValue)); if (!array) break; while (token) { memset (&array[i], 0, sizeof (CCSSettingColorValue)); ccsStringToColor (token, &array[i]); token = strsep (&valueString, ";"); ++i; } list = ccsGetValueListFromColorArray (array, nItems, parent); free (array); } break; case TypeBool: { Bool *array = malloc (nItems * sizeof (Bool)); Bool isTrue; if (!array) break; while (token) { isTrue = (token[0] == 'y' || token[0] == 'Y' || token[0] == '1' || token[0] == 't' || token[0] == 'T'); array[i++] = isTrue; token = strsep (&valueString, ";"); } list = ccsGetValueListFromBoolArray (array, nItems, parent); free (array); } break; case TypeInt: { int *array = malloc (nItems * sizeof (int)); if (!array) break; while (token) { array[i++] = strtoul (token, NULL, 10); token = strsep (&valueString, ";"); } list = ccsGetValueListFromIntArray (array, nItems, parent); free (array); } break; case TypeFloat: { float *array = malloc (nItems * sizeof (float)); if (!array) break; while (token) { array[i++] = strtod (token, NULL); token = strsep (&valueString, ";"); } list = ccsGetValueListFromFloatArray (array, nItems, parent); free (array); } break; case TypeKey: { CCSSettingValue *val = NULL; list = NULL; while (token) { val = malloc (sizeof (CCSSettingValue)); if (!val) break; val->refCount = 1; if (ccsStringToKeyBinding (token, &val->value.asKey)) list = ccsSettingValueListAppend (list, val); else free (val); token = strsep (&valueString, ";"); } } break; case TypeButton: { CCSSettingValue *val = NULL; list = NULL; while (token) { val = malloc (sizeof (CCSSettingValue)); if (!val) break; val->refCount = 1; if (ccsStringToButtonBinding (token, &val->value.asButton)) list = ccsSettingValueListAppend (list, val); else free (val); token = strsep (&valueString, ";"); } } break; case TypeEdge: { CCSSettingValue *val = NULL; list = NULL; while (token) { val = malloc (sizeof (CCSSettingValue)); if (!val) break; val->refCount = 1; val->value.asEdge = ccsStringToEdges (token); list = ccsSettingValueListAppend (list, val); token = strsep (&valueString, ";"); } } break; case TypeBell: { CCSSettingValue *val = NULL; list = NULL; Bool isTrue; while (token) { val = malloc (sizeof (CCSSettingValue)); if (!val) break; isTrue = (token[0] == 'y' || token[0] == 'Y' || token[0] == '1' || token[0] == 't' || token[0] == 'T'); val->value.asBell = isTrue; val->refCount = 1; list = ccsSettingValueListAppend (list, val); token = strsep (&valueString, ";"); } } break; default: break; } *value = list; free (valueStart); return TRUE; } Bool ccsIniGetList (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingValueList *value, CCSSetting *parent) { char *valString = getIniString (dictionary, section, entry); if (!valString) return FALSE; if (isEmptyString (valString)) { *value = NULL; return TRUE; } return ccsIniParseList (valString, value, parent); } void ccsIniSetString (IniDictionary * dictionary, const char * section, const char * entry, const char * value) { setIniString (dictionary, section, entry, value); } void ccsIniSetInt (IniDictionary *dictionary, const char *section, const char *entry, int value) { char *string = NULL; if (asprintf (&string, "%i", value) == -1) string = NULL; if (string) { setIniString (dictionary, section, entry, string); free (string); } } void ccsIniSetFloat (IniDictionary *dictionary, const char *section, const char *entry, float value) { char *string = NULL; if (asprintf (&string, "%f", value) == -1) string = NULL; if (string) { setIniString (dictionary, section, entry, string); free (string); } } void ccsIniSetBool (IniDictionary *dictionary, const char *section, const char *entry, Bool value) { setIniString (dictionary, section, entry, value ? "true" : "false"); } void ccsIniSetColor (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingColorValue value) { char *string; string = ccsColorToString (&value); if (string) { setIniString (dictionary, section, entry, string); free (string); } } void ccsIniSetKey (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingKeyValue value) { char *str; str = ccsKeyBindingToString (&value); if (str) { setIniString (dictionary, section, entry, str); free (str); } } void ccsIniSetButton (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingButtonValue value) { char *str; str = ccsButtonBindingToString (&value); if (str) { setIniString (dictionary, section, entry, str); free (str); } } void ccsIniSetEdge (IniDictionary *dictionary, const char *section, const char *entry, unsigned int value) { char *str; str = ccsEdgesToString (value); if (str) { setIniString (dictionary, section, entry, str); free (str); } } void ccsIniSetBell (IniDictionary *dictionary, const char *section, const char *entry, Bool value) { ccsIniSetBool (dictionary, section, entry, value); } void ccsIniSetList (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingValueList value, CCSSettingType listType) { char *stringBuffer, *valueString; char valueBuffer[100]; unsigned int bufferSize = 1024, fill; stringBuffer = calloc (1, bufferSize); if (!stringBuffer) return; while (value) { switch (listType) { case TypeString: valueString = value->data->value.asString; break; case TypeMatch: valueString = value->data->value.asMatch; break; case TypeInt: snprintf (valueBuffer, 100, "%d", value->data->value.asInt); valueString = valueBuffer; break; case TypeBool: strncpy (valueBuffer, (value->data->value.asBool) ? "true" : "false", 100); valueString = valueBuffer; break; case TypeFloat: snprintf (valueBuffer, 100, "%f", value->data->value.asFloat); valueString = valueBuffer; break; case TypeColor: valueString = ccsColorToString (&value->data->value.asColor); break; case TypeKey: valueString = ccsKeyBindingToString (&value->data->value.asKey); break; case TypeButton: valueString = ccsButtonBindingToString (&value->data->value.asButton); break; case TypeEdge: valueString = ccsEdgesToString (value->data->value.asEdge); break; case TypeBell: strncpy (valueBuffer, (value->data->value.asBell) ? "true" : "false", 100); valueString = valueBuffer; break; default: valueString = NULL; break; } if (!valueString) return; fill = strlen (stringBuffer); /* the + 1 is the semicolon we're going to add */ if ((fill + strlen (valueString) + 1) >= bufferSize) { /* buffer is too small, make it larger */ bufferSize *= 2; stringBuffer = realloc (stringBuffer, bufferSize); if (!stringBuffer) return; /* properly NULL terminate it */ stringBuffer[fill] = 0; } /* we made sure that the buffer is large enough before, so there is no need for strncat */ strcat (stringBuffer, valueString); strcat (stringBuffer, ";"); if (listType == TypeColor || listType == TypeKey || listType == TypeButton || listType == TypeEdge) { free (valueString); } value = value->next; } setIniString (dictionary, section, entry, stringBuffer); free (stringBuffer); } void ccsIniRemoveEntry (IniDictionary * dictionary, const char * section, const char * entry) { char *sectionName; if (asprintf (§ionName, "%s:%s", section, entry) == -1) return; iniparser_unset (dictionary, sectionName); free (sectionName); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/src/compiz.cpp0000644000015301777760000022445312321343002026145 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #ifdef USE_PROTOBUF #include "compizconfig.pb.h" #include #endif extern "C" { #ifdef HAVE_CONFIG_H # include "../config.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include "ccs-private.h" } #include namespace { class SetNumericLocale { public: SetNumericLocale() : locale_set(false) { char* current_locale = ::setlocale (LC_NUMERIC, NULL); // If current_locale is NULL, the method failed to get the current locale. // We can't store a null locale inside the std::string, so we have a bool // to let us know that we have a valid old locale. if (current_locale) { locale_set = true; old_locale = current_locale; } // The reason we store the old_locale in a std::string is to make a real // copy of it. The char* that is returned from setlocale is being freed // when we call the next setlocale (to "C"). ::setlocale (LC_NUMERIC, "C"); } ~SetNumericLocale() { if (locale_set) { ::setlocale (LC_NUMERIC, old_locale.c_str ()); } } private: bool locale_set; std::string old_locale; }; } extern int xmlLoadExtDtdDefaultValue; static const char * getLocale () { char *lang = getenv ("LC_ALL"); if (!lang || !strlen (lang)) lang = getenv ("LC_MESSAGES"); if (!lang || !strlen (lang)) lang = getenv ("LANG"); return lang ? lang : ""; } #ifdef USE_PROTOBUF Bool usingProtobuf = TRUE; #define PB_ABI_VERSION 20090314 typedef metadata::PluginInfo PluginInfoMetadata; typedef metadata::PluginBrief PluginBriefMetadata; typedef metadata::Plugin PluginMetadata; typedef PluginInfoMetadata::Dependencies DependenciesMetadata; typedef PluginMetadata::Screen ScreenMetadata; typedef PluginMetadata::Option OptionMetadata; typedef PluginMetadata::Extension ExtensionMetadata; typedef OptionMetadata::GenericValue GenericValueMetadata; typedef google::protobuf::RepeatedPtrField< std::string > StringList; PluginBriefMetadata persistentPluginBriefPB; PluginMetadata persistentPluginPB; // Made global so that it gets reused, // for better performance (to avoid // mem alloc/free for each plugin) std::string metadataCacheDir = ""; std::string curLocale = std::string (getLocale ()); std::string shortLocale = curLocale.find ('.') == std::string::npos ? curLocale : curLocale.substr (0, curLocale.find ('.')); #endif static void ccsAddRestrictionToStringInfo (CCSSettingStringInfo *forString, const char *name, const char *value) { CCSStrRestriction *restriction; restriction = (CCSStrRestriction *) calloc (1, sizeof (CCSStrRestriction)); if (restriction) { restriction->refCount = 1; restriction->name = strdup (name); restriction->value = strdup (value); forString->restriction = ccsStrRestrictionListAppend (forString->restriction, restriction); } } static void ccsAddRestrictionToStringExtension (CCSStrExtension *extension, const char *name, const char *value) { CCSStrRestriction *restriction; restriction = (CCSStrRestriction *) calloc (1, sizeof (CCSStrRestriction)); if (restriction) { restriction->refCount = 1; restriction->name = strdup (name); restriction->value = strdup (value); extension->restriction = ccsStrRestrictionListAppend (extension->restriction, restriction); } } #ifdef USE_PROTOBUF static void initBoolValuePB (CCSSettingValue * v, const GenericValueMetadata & value) { v->value.asBool = FALSE; if (value.has_bool_value ()) { v->value.asBool = value.bool_value (); } } static void initIntValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { v->value.asInt = (i->forInt.min + i->forInt.max) / 2; if (value.has_int_value ()) { int val = value.int_value (); if (val >= i->forInt.min && val <= i->forInt.max) v->value.asInt = val; } } static void initFloatValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { v->value.asFloat = (i->forFloat.min + i->forFloat.max) / 2; if (value.has_float_value ()) { float val = value.float_value (); if (val >= i->forFloat.min && val <= i->forFloat.max) v->value.asFloat = val; } } static void initStringValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { free (v->value.asString); if (value.has_string_value ()) v->value.asString = strdup (value.string_value ().c_str ()); else v->value.asString = strdup (""); } static void initColorValuePB (CCSSettingValue * v, const GenericValueMetadata & value) { memset (&v->value.asColor, 0, sizeof (v->value.asColor)); v->value.asColor.color.alpha = 0xffff; if (!value.has_color_value ()) return; const OptionMetadata::ColorValue &val = value.color_value (); if (val.has_red ()) { int color = strtol ((char *) val.red ().c_str (), NULL, 0); v->value.asColor.color.red = MAX (0, MIN (0xffff, color)); } if (val.has_green ()) { int color = strtol ((char *) val.green ().c_str (), NULL, 0); v->value.asColor.color.green = MAX (0, MIN (0xffff, color)); } if (val.has_blue ()) { int color = strtol ((char *) val.blue ().c_str (), NULL, 0); v->value.asColor.color.blue = MAX (0, MIN (0xffff, color)); } if (val.has_alpha ()) { int color = strtol ((char *) val.alpha ().c_str (), NULL, 0); v->value.asColor.color.alpha = MAX (0, MIN (0xffff, color)); } } static void initMatchValuePB (CCSSettingValue * v, const GenericValueMetadata & value) { free (v->value.asMatch); if (value.has_string_value ()) v->value.asMatch = strdup (value.string_value ().c_str ()); else v->value.asMatch = strdup (""); } static void initKeyValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { memset (&v->value.asKey, 0, sizeof (v->value.asKey)); if (value.has_string_value ()) { std::string const& value_string = value.string_value(); if (value_string != "disabled") { ccsStringToKeyBinding(value_string.c_str(), &v->value.asKey); } } } static void initButtonValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { memset (&v->value.asButton, 0, sizeof (v->value.asButton)); if (value.has_string_value ()) { const char * val = value.string_value ().c_str (); if (strcasecmp (val, "disabled")) { ccsStringToButtonBinding (val, &v->value.asButton); } } } static void initEdgeValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { v->value.asEdge = 0; if (value.has_edge_value ()) v->value.asEdge = value.edge_value (); } static void initBellValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { v->value.asBell = FALSE; if (value.has_bool_value ()) v->value.asBell = value.bool_value (); } static void initListValuePB (CCSSettingValue * v, CCSSettingInfo * i, const OptionMetadata & option) { int num; num = option.default_value_size (); if (num) { for (int j = 0; j < num; ++j) { CCSSettingValue *val; val = (CCSSettingValue *) calloc (1, sizeof (CCSSettingValue)); if (!val) continue; val->refCount = 1; val->parent = v->parent; val->isListChild = TRUE; switch (i->forList.listType) { case TypeBool: initBoolValuePB (val, option.default_value (j)); break; case TypeInt: initIntValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeFloat: initFloatValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeString: initStringValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeColor: initColorValuePB (val, option.default_value (j)); break; case TypeKey: initKeyValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeButton: initButtonValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeEdge: initEdgeValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeBell: initBellValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeMatch: initMatchValuePB (val, option.default_value (j)); default: break; } v->value.asList = ccsSettingValueListAppend (v->value.asList, val); } } } static void initIntInfoPB (CCSSettingInfo * i, const OptionMetadata & option) { i->forInt.min = std::numeric_limits ::min (); i->forInt.max = std::numeric_limits ::max (); i->forInt.desc = NULL; if (option.has_int_min ()) i->forInt.min = option.int_min (); if (option.has_int_max ()) i->forInt.max = option.int_max (); if (!basicMetadata) { int j, num = option.int_desc_size (); for (j = 0; j < num; ++j) { const OptionMetadata::IntDescription & intDescMetadata = option.int_desc (j); int val = intDescMetadata.value (); if (val >= i->forInt.min && val <= i->forInt.max) { CCSIntDesc *intDesc; intDesc = (CCSIntDesc *) calloc (1, sizeof (CCSIntDesc)); if (intDesc) { intDesc->refCount = 1; intDesc->name = strdup (intDescMetadata.name ().c_str ()); intDesc->value = val; i->forInt.desc = ccsIntDescListAppend (i->forInt.desc, intDesc); } } } } } static void initFloatInfoPB (CCSSettingInfo * i, const OptionMetadata & option) { i->forFloat.min = std::numeric_limits ::min (); i->forFloat.max = std::numeric_limits ::max (); i->forFloat.precision = 0.1f; if (option.has_float_min ()) i->forFloat.min = option.float_min (); if (option.has_float_max ()) i->forFloat.max = option.float_max (); if (option.precision ()) i->forFloat.precision = option.precision (); } static void initStringInfoPB (CCSSettingInfo * i, const OptionMetadata & option) { i->forString.restriction = NULL; i->forString.sortStartsAt = -1; i->forString.extensible = FALSE; if (!basicMetadata) { if (option.has_extensible () && option.extensible ()) i->forString.extensible = TRUE; if (option.has_sort_start ()) i->forString.sortStartsAt = option.sort_start (); int j, num = option.str_restriction_size (); for (j = 0; j < num; ++j) { const OptionMetadata::StringRestriction & restrictionMetadata = option.str_restriction (j); const char *value = restrictionMetadata.value ().c_str (); const char *name = restrictionMetadata.name ().c_str (); ccsAddRestrictionToStringInfo (&i->forString, value, name); } } } static void initListInfoPB (CCSSettingInfo * i, const OptionMetadata & option) { CCSSettingInfo *info; i->forList.listType = TypeBool; i->forList.listInfo = NULL; if (option.has_list_type ()) { i->forList.listType = (CCSSettingType) option.list_type (); } switch (i->forList.listType) { case TypeInt: { info = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); if (info) initIntInfoPB (info, option); i->forList.listInfo = info; } break; case TypeFloat: { info = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); if (info) initFloatInfoPB (info, option); i->forList.listInfo = info; } break; case TypeString: { info = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); if (info) initStringInfoPB (info, option); i->forList.listInfo = info; } break; default: break; } } static void initActionInfoPB (CCSSettingInfo * i, const OptionMetadata & option) { i->forAction.internal = FALSE; if (option.has_internal () && option.internal ()) i->forAction.internal = TRUE; } static void ccsSettingInfoPBInitializer (CCSSettingType type, CCSSettingInfo *info, void *data) { const OptionMetadata &option (*((const OptionMetadata *) data)); switch (type) { case TypeInt: initIntInfoPB (info, option); break; case TypeFloat: initFloatInfoPB (info, option); break; case TypeString: initStringInfoPB (info, option); break; case TypeList: initListInfoPB (info, option); break; case TypeKey: case TypeButton: case TypeEdge: case TypeBell: initActionInfoPB (info, option); break; case TypeAction: // do nothing and fall through default: break; } } static void ccsSettingDefaultValuePBInitializer (CCSSettingType type, CCSSettingInfo *info, CCSSettingValue *value, void *data) { const OptionMetadata &option (*((const OptionMetadata *) data)); switch (type) { case TypeInt: initIntValuePB (value, info, option.default_value (0)); break; case TypeBool: initBoolValuePB (value, option.default_value (0)); break; case TypeFloat: initFloatValuePB (value, info, option.default_value (0)); break; case TypeString: initStringValuePB (value, info, option.default_value (0)); break; case TypeColor: initColorValuePB (value, option.default_value (0)); break; case TypeKey: initKeyValuePB (value, info, option.default_value (0)); break; case TypeButton: initButtonValuePB (value, info, option.default_value (0)); break; case TypeEdge: initEdgeValuePB (value, info, option.default_value (0)); break; case TypeBell: initBellValuePB (value, info, option.default_value (0)); break; case TypeMatch: initMatchValuePB (value, option.default_value (0)); break; case TypeList: initListValuePB (value, info, option); break; case TypeAction: // do nothing and fall through default: break; } } static void ccsSettingDefaultValueEmptyInitializer (CCSSettingType type, CCSSettingInfo *info, CCSSettingValue *value, void *data) { /* if we have no set defaults, we have at least to set the string defaults to empty strings */ switch (type) { case TypeString: value->value.asString = strdup (""); break; case TypeMatch: value->value.asMatch = strdup (""); break; default: break; } } static void addOptionForPluginPB (CCSPlugin * plugin, const char * name, const StringList & groups, const StringList & subgroups, const OptionMetadata & option) { if (ccsFindSetting (plugin, name)) { ccsError ("Option \"%s\" already defined", name); return; } const char *shortDesc = name; const char *longDesc = ""; const char *group = ""; const char *hints = ""; const char *subGroup = ""; CCSSettingType type = (CCSSettingType) option.type (); if (!basicMetadata) { shortDesc = option.has_short_desc () ? option.short_desc ().c_str () : name; longDesc = option.has_long_desc () ? option.long_desc ().c_str () : name; hints = option.has_hints () ? option.hints ().c_str () : name; group = option.group_id () >= 0 ? groups.Get (option.group_id ()).c_str () : ""; subGroup = option.subgroup_id () >= 0 ? subgroups.Get (option.subgroup_id ()).c_str () : ""; } CCSContext *context = ccsPluginGetContext (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); CCSSetting *setting = ccsSettingDefaultImplNew (plugin, name, type, shortDesc, longDesc, hints, group, subGroup, option.default_value_size () > 0 ? ccsSettingDefaultValuePBInitializer : ccsSettingDefaultValueEmptyInitializer, (void *) &option, ccsSettingInfoPBInitializer, (void *) &option, plugin->object.object_allocation, cPrivate->object_interfaces); pPrivate->settings = ccsSettingListAppend (pPrivate->settings, setting); } static void addOptionFromPB (CCSPlugin * plugin, const StringList & groups, const StringList & subgroups, const OptionMetadata & option) { const char *name; name = option.name ().c_str (); Bool readonly = option.has_read_only () && option.read_only (); if (!strlen (name) || readonly) return; addOptionForPluginPB (plugin, name, groups, subgroups, option); } static void initOptionsFromPB (CCSPlugin * plugin, const PluginMetadata & pluginPB) { if (pluginPB.has_screen ()) { const ScreenMetadata &screenPB = pluginPB.screen (); // Screen options int i, numOpt = screenPB.option_size (); for (i = 0; i < numOpt; ++i) addOptionFromPB (plugin, screenPB.group_desc (), screenPB.subgroup_desc (), screenPB.option (i)); } } static void addStringsFromPB (CCSStringList * list, const StringList & strings) { StringList::const_iterator it; for (it = strings.begin (); it != strings.end (); ++it) { const char *value = (*it).c_str (); if (strlen (value)) { CCSString *str = (CCSString *) calloc (1, sizeof (CCSString)); str->value = strdup (value); str->refCount = 1; *list = ccsStringListAppend (*list, str); } } } static void addStringExtensionFromPB (CCSPlugin * plugin, const ExtensionMetadata & extensionPB) { CCSStrExtension *extension; extension = (CCSStrExtension *) calloc (1, sizeof (CCSStrExtension)); if (!extension) return; extension->refCount = 1; extension->restriction = NULL; extension->basePlugin = strdup (extensionPB.base_plugin ().c_str ()); addStringsFromPB (&extension->baseSettings, extensionPB.base_option ()); int numRestrictions = extensionPB.str_restriction_size (); if (!numRestrictions) { free (extension); return; } for (int j = 0; j < numRestrictions; ++j) { const OptionMetadata::StringRestriction & restrictionPB = extensionPB.str_restriction (j); const char *value = restrictionPB.value ().c_str (); const char *name = restrictionPB.name ().c_str (); ccsAddRestrictionToStringExtension (extension, name, value); } CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); pPrivate->stringExtensions = ccsStrExtensionListAppend (pPrivate->stringExtensions, extension); } static void initStringExtensionsFromPB (CCSPlugin * plugin, const PluginMetadata & pluginPB) { int numExtensions; numExtensions = pluginPB.extension_size (); for (int i = 0; i < numExtensions; ++i) addStringExtensionFromPB (plugin, pluginPB.extension (i)); } static void initRulesFromPB (CCSPlugin * plugin, const PluginInfoMetadata & pluginInfoPB) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin) addStringsFromPB (&pPrivate->providesFeature, pluginInfoPB.feature ()); if (!pluginInfoPB.has_deps ()) return; const DependenciesMetadata & deps = pluginInfoPB.deps (); addStringsFromPB (&pPrivate->loadAfter, deps.after_plugin ()); addStringsFromPB (&pPrivate->loadBefore, deps.before_plugin ()); addStringsFromPB (&pPrivate->requiresPlugin, deps.require_plugin ()); addStringsFromPB (&pPrivate->requiresFeature, deps.require_feature ()); addStringsFromPB (&pPrivate->conflictPlugin, deps.conflict_plugin ()); addStringsFromPB (&pPrivate->conflictFeature, deps.conflict_feature ()); } static void addPluginFromPB (CCSContext * context, const PluginInfoMetadata & pluginInfoPB, char *file, char *xmlFile) { const char *name; CCSPlugin *plugin; CCSPluginPrivate *pPrivate; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); name = pluginInfoPB.name ().c_str (); if (!strlen (name)) return; if (ccsFindPlugin (context, name)) return; if (!strcmp (name, "ini") || !strcmp (name, "gconf") || !strcmp (name, "ccp") || !strcmp (name, "kconfig")) return; plugin = (CCSPlugin *) calloc (1, sizeof (CCSPlugin)); if (!plugin) return; ccsObjectInit (plugin, &ccsDefaultObjectAllocator); ccsPluginRef (plugin); pPrivate = (CCSPluginPrivate *) calloc (1, sizeof (CCSPluginPrivate)); if (!pPrivate) { free (plugin); return; } pPrivate->loaded = FALSE; ccsObjectSetPrivate (plugin, (CCSPrivate *) pPrivate); ccsObjectAddInterface (plugin, (CCSInterface *) cPrivate->object_interfaces->pluginInterface, GET_INTERFACE_TYPE (CCSPluginInterface)); if (file) pPrivate->pbFilePath = strdup (file); if (xmlFile) { pPrivate->xmlFile = strdup (xmlFile); if (asprintf (&pPrivate->xmlPath, "/compiz/plugin[@name = '%s']", name) == -1) pPrivate->xmlPath = NULL; } pPrivate->context = context; pPrivate->name = strdup (name); if (!basicMetadata) { pPrivate->shortDesc = strdup (pluginInfoPB.has_short_desc () ? pluginInfoPB.short_desc ().c_str () : name); pPrivate->longDesc = strdup (pluginInfoPB.has_long_desc () ? pluginInfoPB.long_desc ().c_str () : name); pPrivate->category = strdup (pluginInfoPB.has_category () ? pluginInfoPB.category ().c_str () : ""); } else { pPrivate->shortDesc = strdup (name); pPrivate->longDesc = strdup (name); pPrivate->category = strdup (""); } initRulesFromPB (plugin, pluginInfoPB); cPrivate->plugins = ccsPluginListAppend (cPrivate->plugins, plugin); } static void addCoreSettingsFromPB (CCSContext * context, const PluginInfoMetadata & pluginInfoPB, char *file, char *xmlFile) { CCSPlugin *plugin; CCSPluginPrivate *pPrivate; if (ccsFindPlugin (context, "core")) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); plugin = (CCSPlugin*) calloc (1, sizeof (CCSPlugin)); if (!plugin) return; ccsObjectInit (plugin, &ccsDefaultObjectAllocator); ccsPluginRef (plugin); pPrivate = (CCSPluginPrivate *) calloc (1, sizeof (CCSPluginPrivate)); if (!pPrivate) { free (plugin); return; } ccsObjectSetPrivate (plugin, (CCSPrivate *) pPrivate); ccsObjectAddInterface (plugin, (CCSInterface *) cPrivate->object_interfaces->pluginInterface, GET_INTERFACE_TYPE (CCSPluginInterface)); if (file) pPrivate->pbFilePath = strdup (file); if (xmlFile) { pPrivate->xmlFile = strdup (xmlFile); pPrivate->xmlPath = strdup ("/compiz/core"); } pPrivate->context = context; pPrivate->name = strdup ("core"); pPrivate->category = strdup ("General"); if (!basicMetadata) { pPrivate->shortDesc = strdup (pluginInfoPB.has_short_desc () ? pluginInfoPB.short_desc ().c_str () : "General Options"); pPrivate->longDesc = strdup (pluginInfoPB.has_long_desc () ? pluginInfoPB.long_desc ().c_str () : "General Compiz Options"); } else { pPrivate->shortDesc = strdup ("General Options"); pPrivate->longDesc = strdup ("General Compiz Options"); } initRulesFromPB (plugin, pluginInfoPB); cPrivate->plugins = ccsPluginListAppend (cPrivate->plugins, plugin); } #endif static int pluginNameFilter (const struct dirent *name) { int length = strlen (name->d_name); if (length < 7) return 0; if (strncmp (name->d_name, "lib", 3) || strncmp (name->d_name + length - 3, ".so", 3)) return 0; return 1; } static int pluginXMLFilter (const struct dirent *name) { int length = strlen (name->d_name); if (length < 5) return 0; if (strncmp (name->d_name + length - 4, ".xml", 4)) return 0; return 1; } /* XML parsing */ static CCSSettingType getOptionType (const char *name) { static struct _TypeMap { const char *name; CCSSettingType type; } map[] = { { "bool", TypeBool }, { "int", TypeInt }, { "float", TypeFloat }, { "string", TypeString }, { "color", TypeColor }, { "action", TypeAction }, { "key", TypeKey }, { "button", TypeButton }, { "edge", TypeEdge }, { "bell", TypeBell }, { "match", TypeMatch }, { "list", TypeList } }; for (unsigned i = 0; i < sizeof (map) / sizeof (map[0]); ++i) if (strcasecmp (name, map[i].name) == 0) return map[i].type; return TypeNum; } static char * getStringFromXPath (xmlDoc * doc, xmlNode * base, const char *path) { xmlXPathObjectPtr xpathObj; xmlXPathContextPtr xpathCtx; char *rv = NULL; xpathCtx = xmlXPathNewContext (doc); if (!xpathCtx) return NULL; if (base) xpathCtx->node = base; xpathObj = xmlXPathEvalExpression (BAD_CAST path, xpathCtx); if (!xpathObj) { xmlXPathFreeContext (xpathCtx); return NULL; } xpathObj = xmlXPathConvertString (xpathObj); if (xpathObj->type == XPATH_STRING && xpathObj->stringval && strlen ((char *) xpathObj->stringval)) { rv = strdup ((char *) xpathObj->stringval); } xmlXPathFreeObject (xpathObj); xmlXPathFreeContext (xpathCtx); return rv; } static xmlNode ** getNodesFromXPath (xmlDoc * doc, xmlNode * base, const char *path, int *num) { xmlXPathObjectPtr xpathObj; xmlXPathContextPtr xpathCtx; xmlNode **rv = NULL; int size; *num = 0; xpathCtx = xmlXPathNewContext (doc); if (!xpathCtx) return NULL; if (base) xpathCtx->node = base; xpathObj = xmlXPathEvalExpression (BAD_CAST path, xpathCtx); if (!xpathObj) { xmlXPathFreeContext (xpathCtx); return NULL; } size = (xpathObj->nodesetval) ? xpathObj->nodesetval->nodeNr : 0; if (!size) { xmlXPathFreeObject (xpathObj); xmlXPathFreeContext (xpathCtx); return NULL; } rv = (xmlNode **) malloc (size * sizeof (xmlNode *)); if (!rv) { xmlXPathFreeObject (xpathObj); xmlXPathFreeContext (xpathCtx); return NULL; } *num = size; for (int i = 0; i < size; ++i) rv[i] = xpathObj->nodesetval->nodeTab[i]; xmlXPathFreeObject (xpathObj); xmlXPathFreeContext (xpathCtx); return rv; } static Bool nodeExists (xmlNode * node, const char *path) { xmlNode **nodes = NULL; int num; nodes = getNodesFromXPath (node->doc, node, path, &num); if (num) { free (nodes); return TRUE; } return FALSE; } static char * stringFromNodeDef (xmlNode * node, const char *path, const char *def) { char *val; char *rv = NULL; val = getStringFromXPath (node->doc, node, path); if (val) { rv = strdup (val); free (val); } else if (def) rv = strdup (def); return rv; } static char * stringFromNodeDefTrans (xmlNode * node, const char *path, const char *def) { const char *lang = getLocale (); char newPath[1024]; char *rv = NULL; if (!lang || !strlen (lang)) return stringFromNodeDef (node, path, def); snprintf (newPath, 1023, "%s[lang('%s')]", path, lang); rv = stringFromNodeDef (node, newPath, NULL); if (rv) return rv; snprintf (newPath, 1023, "%s[lang(substring-before('%s','.'))]", path, lang); rv = stringFromNodeDef (node, newPath, NULL); if (rv) return rv; snprintf (newPath, 1023, "%s[lang(substring-before('%s','_'))]", path, lang); rv = stringFromNodeDef (node, newPath, NULL); if (rv) return rv; snprintf (newPath, 1023, "%s[lang('C')]", path); rv = stringFromNodeDef (node, newPath, NULL); if (rv) return rv; return stringFromNodeDef (node, path, def); } static void initBoolValue (CCSSettingValue * v, xmlNode * node, void * valuePBv) { char *value; v->value.asBool = FALSE; value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { if (strcasecmp ((char *) value, "true") == 0) { v->value.asBool = TRUE; #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_bool_value (TRUE); #endif } free (value); } } static void initIntValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { char *value; v->value.asInt = (i->forInt.min + i->forInt.max) / 2; value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { int val = strtol ((char *) value, NULL, 0); if (val >= i->forInt.min && val <= i->forInt.max) { v->value.asInt = val; #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_int_value (val); #endif } free (value); } } static void initFloatValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { char *value; SetNumericLocale numeric_locale; v->value.asFloat = (i->forFloat.min + i->forFloat.max) / 2; value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { float val = strtod ((char *) value, NULL); if (val >= i->forFloat.min && val <= i->forFloat.max) { v->value.asFloat = val; #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_float_value (val); #endif } free (value); } } static void initStringValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { char *value; value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { free (v->value.asString); v->value.asString = strdup (value); #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_string_value (value); #endif free (value); } else v->value.asString = strdup (""); } static void initColorValue (CCSSettingValue * v, xmlNode * node, void * valuePBv) { char *value; memset (&v->value.asColor, 0, sizeof (v->value.asColor)); v->value.asColor.color.alpha = 0xffff; #ifdef USE_PROTOBUF OptionMetadata::ColorValue *colorPB = NULL; if (valuePBv) colorPB = ((GenericValueMetadata *) valuePBv)->mutable_color_value (); #endif value = getStringFromXPath (node->doc, node, "red/child::text()"); if (value) { int color = strtol ((char *) value, NULL, 0); v->value.asColor.color.red = MAX (0, MIN (0xffff, color)); #ifdef USE_PROTOBUF if (colorPB) colorPB->set_red (value); #endif free (value); } value = getStringFromXPath (node->doc, node, "green/child::text()"); if (value) { int color = strtol ((char *) value, NULL, 0); v->value.asColor.color.green = MAX (0, MIN (0xffff, color)); #ifdef USE_PROTOBUF if (colorPB) colorPB->set_green (value); #endif free (value); } value = getStringFromXPath (node->doc, node, "blue/child::text()"); if (value) { int color = strtol ((char *) value, NULL, 0); v->value.asColor.color.blue = MAX (0, MIN (0xffff, color)); #ifdef USE_PROTOBUF if (colorPB) colorPB->set_blue (value); #endif free (value); } value = getStringFromXPath (node->doc, node, "alpha/child::text()"); if (value) { int color = strtol (value, NULL, 0); v->value.asColor.color.alpha = MAX (0, MIN (0xffff, color)); #ifdef USE_PROTOBUF if (colorPB) colorPB->set_alpha (value); #endif free (value); } } static void initMatchValue (CCSSettingValue * v, xmlNode * node, void * valuePBv) { char *value; value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { free (v->value.asMatch); v->value.asMatch = strdup (value); #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_string_value (value); #endif free (value); } else v->value.asMatch = strdup (""); } static void initKeyValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { char *value; memset (&v->value.asKey, 0, sizeof (v->value.asKey)); value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_string_value (value); #endif if (strcasecmp (value, "disabled")) { ccsStringToKeyBinding (value, &v->value.asKey); } free (value); } } static void initButtonValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { char *value; memset (&v->value.asButton, 0, sizeof (v->value.asButton)); value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_string_value (value); #endif if (strcasecmp (value, "disabled")) { ccsStringToButtonBinding (value, &v->value.asButton); } free (value); } } static void initEdgeValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { xmlNode **nodes; char *value; int k, num; v->value.asEdge = 0; static const char *edge[] = { "Left", "Right", "Top", "Bottom", "TopLeft", "TopRight", "BottomLeft", "BottomRight" }; nodes = getNodesFromXPath (node->doc, node, "edge", &num); for (k = 0; k < num; ++k) { value = getStringFromXPath (node->doc, nodes[k], "@name"); if (value) { for (unsigned j = 0; j < sizeof (edge) / sizeof (edge[0]); ++j) { if (strcasecmp ((char *) value, edge[j]) == 0) v->value.asEdge |= (1 << j); } free (value); } } if (num) free (nodes); #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_edge_value (v->value.asEdge); #endif } static void initBellValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { char *value; v->value.asBell = FALSE; value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { if (!strcasecmp (value, "true")) { v->value.asBell = TRUE; #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_bool_value (TRUE); #endif } free (value); } } static void initListValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * optionPBv) { xmlNode **nodes; int num; nodes = getNodesFromXPath (node->doc, node, "value", &num); if (num) { for (int j = 0; j < num; ++j) { void *valuePBv = NULL; #ifdef USE_PROTOBUF if (optionPBv) valuePBv = ((OptionMetadata *) optionPBv)->add_default_value (); #endif CCSSettingValue *val; val = (CCSSettingValue *) calloc (1, sizeof (CCSSettingValue)); if (!val) continue; val->refCount = 1; val->parent = v->parent; val->isListChild = TRUE; switch (i->forList.listType) { case TypeBool: initBoolValue (val, nodes[j], valuePBv); break; case TypeInt: initIntValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeFloat: initFloatValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeString: initStringValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeColor: initColorValue (val, nodes[j], valuePBv); break; case TypeKey: initKeyValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeButton: initButtonValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeEdge: initEdgeValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeBell: initBellValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeMatch: initMatchValue (val, nodes[j], valuePBv); default: break; } v->value.asList = ccsSettingValueListAppend (v->value.asList, val); } free (nodes); } } static void initIntInfo (CCSSettingInfo * i, xmlNode * node, void * optionPBv) { char *value; int num; i->forInt.min = std::numeric_limits ::min (); i->forInt.max = std::numeric_limits ::max (); i->forInt.desc = NULL; value = getStringFromXPath (node->doc, node, "min/child::text()"); if (value) { int val = strtol (value, NULL, 0); i->forInt.min = val; free (value); #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_int_min (val); #endif } value = getStringFromXPath (node->doc, node, "max/child::text()"); if (value) { int val = strtol (value, NULL, 0); i->forInt.max = val; free (value); #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_int_max (val); #endif } if (!basicMetadata) { xmlNode **nodes; nodes = getNodesFromXPath (node->doc, node, "desc", &num); if (num) { char *name; for (int j = 0; j < num; ++j) { value = getStringFromXPath (node->doc, nodes[j], "value/child::text()"); if (value) { int val = strtol (value, NULL, 0); free (value); if (val >= i->forInt.min && val <= i->forInt.max) { name = stringFromNodeDefTrans (nodes[j], "name/child::text()", NULL); if (name) { CCSIntDesc *intDesc; intDesc = (CCSIntDesc *) calloc (1, sizeof (CCSIntDesc)); if (intDesc) { intDesc->refCount = 1; intDesc->name = strdup (name); intDesc->value = val; i->forInt.desc = ccsIntDescListAppend (i->forInt.desc, intDesc); #ifdef USE_PROTOBUF if (optionPBv) { OptionMetadata::IntDescription *intDescPB = ((OptionMetadata *) optionPBv)-> add_int_desc (); intDescPB->set_value (val); intDescPB->set_name (name); } #endif } free (name); } } } } free (nodes); } } } static void initFloatInfo (CCSSettingInfo * i, xmlNode * node, void * optionPBv) { char *value; SetNumericLocale numeric_locale; i->forFloat.min = std::numeric_limits ::min (); i->forFloat.max = std::numeric_limits ::max (); i->forFloat.precision = 0.1f; value = getStringFromXPath (node->doc, node, "min/child::text()"); if (value) { float val = strtod (value, NULL); i->forFloat.min = val; free (value); #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_float_min (val); #endif } value = getStringFromXPath (node->doc, node, "max/child::text()"); if (value) { float val = strtod (value, NULL); i->forFloat.max = val; free (value); #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_float_max (val); #endif } value = getStringFromXPath (node->doc, node, "precision/child::text()"); if (value) { float val = strtod (value, NULL); i->forFloat.precision = val; free (value); #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_precision (val); #endif } } static void initStringInfo (CCSSettingInfo * i, xmlNode * node, void * optionPBv) { int num; i->forString.restriction = NULL; i->forString.sortStartsAt = -1; i->forString.extensible = FALSE; if (!basicMetadata) { if (nodeExists (node, "extensible")) { i->forString.extensible = TRUE; #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_extensible (TRUE); #endif } xmlNode **nodes; nodes = getNodesFromXPath (node->doc, node, "sort", &num); if (num) { char *value; int val = 0; /* Start sorting at 0 unless otherwise specified. */ value = getStringFromXPath (node->doc, nodes[0], "@start"); if (value) { /* Custom starting value specified. */ val = strtol (value, NULL, 0); if (val < 0) val = 0; free (value); } i->forString.sortStartsAt = val; #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_sort_start (val); #endif free (nodes); } nodes = getNodesFromXPath (node->doc, node, "restriction", &num); if (num) { char *name, *value; for (int j = 0; j < num; ++j) { #ifdef USE_PROTOBUF OptionMetadata::StringRestriction * strRestrictionPB = NULL; if (optionPBv) strRestrictionPB = ((OptionMetadata *) optionPBv)->add_str_restriction (); #endif value = getStringFromXPath (node->doc, nodes[j], "value/child::text()"); if (value) { name = stringFromNodeDefTrans (nodes[j], "name/child::text()", NULL); if (name) { ccsAddRestrictionToStringInfo (&i->forString, name, value); #ifdef USE_PROTOBUF if (strRestrictionPB) { strRestrictionPB->set_value (value); strRestrictionPB->set_name (name); } #endif free (name); } free (value); } } free (nodes); } } } static void initListInfo (CCSSettingInfo * i, xmlNode * node, void * optionPBv) { char *value; CCSSettingInfo *info; i->forList.listType = TypeBool; i->forList.listInfo = NULL; value = getStringFromXPath (node->doc, node, "type/child::text()"); if (!value) return; i->forList.listType = getOptionType (value); #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_list_type ((OptionMetadata::Type) i->forList.listType); #endif free (value); switch (i->forList.listType) { case TypeInt: { info = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); if (info) initIntInfo (info, node, optionPBv); i->forList.listInfo = info; } break; case TypeFloat: { info = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); if (info) initFloatInfo (info, node, optionPBv); i->forList.listInfo = info; } break; case TypeString: { info = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); if (info) initStringInfo (info, node, optionPBv); i->forList.listInfo = info; } break; default: break; } } static void initActionInfo (CCSSettingInfo * i, xmlNode * node, void * optionPBv) { char *value; i->forAction.internal = FALSE; value = getStringFromXPath (node->doc, node, "internal/child::text()"); if (value) { if (strcasecmp (value, "true") == 0) { i->forAction.internal = TRUE; #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_internal (TRUE); #endif } free (value); return; } if (nodeExists (node, "internal")) { i->forAction.internal = TRUE; #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_internal (TRUE); #endif } } #ifdef USE_PROTOBUF static void checkAddGroupSubgroup (OptionMetadata *optPB, StringList *descList, char *name, Bool isGroup) { // Check if group has the same name as the last group in the groups list int len = descList->size (); if (len > 0 && strcmp (name, descList->Get (len - 1).c_str ()) == 0) { if (isGroup) optPB->set_group_id (len - 1); else optPB->set_subgroup_id (len - 1); } else { // Add new group to the list descList->Add ()->assign (name); if (isGroup) optPB->set_group_id (len); else optPB->set_subgroup_id (len); } } static Bool createProtoBufCacheDir () { if (metadataCacheDir.length () > 0) { // Cache dir must have been created already, since otherwise it would // be "". So we can return here. return TRUE; } char *cacheBaseDir = NULL; char *cacheHome = getenv ("XDG_CACHE_HOME"); if (cacheHome && strlen (cacheHome)) { if (asprintf (&cacheBaseDir, "%s", cacheHome) == -1) cacheBaseDir = NULL; } else { char *home = getenv ("HOME"); if (home && strlen (home)) { if (asprintf (&cacheBaseDir, "%s/.cache", home) == -1) cacheBaseDir = NULL; } } if (cacheBaseDir) { metadataCacheDir = cacheBaseDir; if (metadataCacheDir[metadataCacheDir.length () - 1] != '/') metadataCacheDir += "/"; metadataCacheDir += "compizconfig-1"; std::string metadataCacheFileDummy = metadataCacheDir + "/dummy"; // Create cache dir Bool success = ccsCreateDirFor (metadataCacheFileDummy.c_str ()); if (!success) ccsError ("Error creating directory \"%s\"", metadataCacheDir.c_str ()); free (cacheBaseDir); if (success) return TRUE; // metadataCacheDir will be used later in this case metadataCacheDir = ""; // invalidate metadataCacheDir } usingProtobuf = FALSE; // Disable protobuf if cache dir cannot be created return FALSE; } #endif static void addOptionForPlugin (CCSPlugin * plugin, char * name, char * type, Bool isReadonly, xmlNode * node, void * groupListPBv, void * subgroupListPBv, void * optionPBv) { xmlNode **nodes; int num = 0; CCSSetting *setting; if (ccsFindSetting (plugin, name)) { ccsError ("Option \"%s\" already defined", name); return; } if (getOptionType (type) == TypeNum) return; CCSContext *context = ccsPluginGetContext (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); setting = (CCSSetting *) calloc (1, sizeof (CCSSetting)); if (!setting) return; ccsObjectInit (setting, &ccsDefaultObjectAllocator); CCSSettingPrivate *ccsPrivate = (CCSSettingPrivate *) calloc (1, sizeof (CCSSettingPrivate)); if (!ccsPrivate) { free (setting); return; } ccsObjectSetPrivate (setting, (CCSPrivate *) ccsPrivate); ccsObjectAddInterface (setting, (CCSInterface *) cPrivate->object_interfaces->settingInterface, GET_INTERFACE_TYPE (CCSSettingInterface)); ccsSettingRef (setting); CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) sPrivate->parent = plugin; sPrivate->isDefault = TRUE; sPrivate->name = strdup (name); if (!basicMetadata) { sPrivate->shortDesc = stringFromNodeDefTrans (node, "short/child::text()", name); sPrivate->longDesc = stringFromNodeDefTrans (node, "long/child::text()", ""); sPrivate->hints = stringFromNodeDef (node, "hints/child::text()", ""); sPrivate->group = stringFromNodeDefTrans (node, "ancestor::group/short/child::text()", ""); sPrivate->subGroup = stringFromNodeDefTrans (node, "ancestor::subgroup/short/child::text()", ""); } else { sPrivate->shortDesc = strdup (name); sPrivate->longDesc = strdup (""); sPrivate->hints = strdup (""); sPrivate->group = strdup (""); sPrivate->subGroup = strdup (""); } sPrivate->type = getOptionType (type); #ifdef USE_PROTOBUF OptionMetadata *optPB = NULL; if (optionPBv) { optPB = (OptionMetadata *) optionPBv; optPB->set_name (name); optPB->set_type ((OptionMetadata::Type) sPrivate->type); if (isReadonly) optPB->set_read_only (isReadonly); optPB->set_short_desc (sPrivate->shortDesc); optPB->set_long_desc (sPrivate->longDesc); if (strlen (sPrivate->hints) > 0) optPB->set_hints (sPrivate->hints); if (groupListPBv && strlen (sPrivate->group) > 0) checkAddGroupSubgroup (optPB, (StringList *) groupListPBv, sPrivate->group, TRUE); if (subgroupListPBv && strlen (sPrivate->subGroup) > 0) checkAddGroupSubgroup (optPB, (StringList *) subgroupListPBv, sPrivate->subGroup, FALSE); } #endif sPrivate->value = &sPrivate->defaultValue; sPrivate->defaultValue.parent = setting; switch (sPrivate->type) { case TypeInt: initIntInfo (&sPrivate->info, node, optionPBv); break; case TypeFloat: initFloatInfo (&sPrivate->info, node, optionPBv); break; case TypeString: initStringInfo (&sPrivate->info, node, optionPBv); break; case TypeList: initListInfo (&sPrivate->info, node, optionPBv); break; case TypeKey: case TypeButton: case TypeEdge: case TypeBell: initActionInfo (&sPrivate->info, node, optionPBv); break; default: break; } nodes = getNodesFromXPath (node->doc, node, "default", &num); if (num) { void * valuePBv = NULL; #ifdef USE_PROTOBUF if (optPB && sPrivate->type != TypeList) valuePBv = optPB->add_default_value (); #endif switch (sPrivate->type) { case TypeInt: initIntValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeBool: initBoolValue (&sPrivate->defaultValue, nodes[0], valuePBv); break; case TypeFloat: initFloatValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeString: initStringValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeColor: initColorValue (&sPrivate->defaultValue, nodes[0], valuePBv); break; case TypeKey: initKeyValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeButton: initButtonValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeEdge: initEdgeValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeBell: initBellValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeMatch: initMatchValue (&sPrivate->defaultValue, nodes[0], valuePBv); break; case TypeList: initListValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], optionPBv); break; default: break; } } else { /* if we have no set defaults, we have at least to set the string defaults to empty strings */ switch (sPrivate->type) { case TypeString: sPrivate->defaultValue.value.asString = strdup (""); break; case TypeMatch: sPrivate->defaultValue.value.asMatch = strdup (""); break; default: break; } } if (nodes) free (nodes); if (isReadonly) { // Will come here only when protobuf is enabled ccsFreeSetting (setting); return; } // printSetting (setting); CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); pPrivate->settings = ccsSettingListAppend (pPrivate->settings, setting); } static void addOptionFromXMLNode (CCSPlugin * plugin, xmlNode * node, void * groupListPBv, void * subgroupListPBv, void * optionPBv) { char *name; char *type; char *readonly; Bool isReadonly; if (!node) return; name = getStringFromXPath (node->doc, node, "@name"); type = getStringFromXPath (node->doc, node, "@type"); readonly = getStringFromXPath (node->doc, node, "@read_only"); isReadonly = readonly && !strcmp (readonly, "true"); // If optionPBv is non-NULL, we still want to get the option info to write // to .pb file, so we don't return immediately in that case. if (!name || !strlen (name) || !type || !strlen (type) || (!optionPBv && isReadonly)) { if (name) free (name); if (type) free (type); if (readonly) free (readonly); return; } addOptionForPlugin (plugin, name, type, isReadonly, node, groupListPBv, subgroupListPBv, optionPBv); free (name); free (type); if (readonly) free (readonly); } static void initScreenFromRootNode (CCSPlugin * plugin, xmlNode * node, void * pluginPBv) { xmlNode **nodes; xmlNode **optNodes; int num; void *groupListPBv = NULL; void *subgroupListPBv = NULL; nodes = getNodesFromXPath (node->doc, node, "options", &num); if (!num) return; #ifdef USE_PROTOBUF ScreenMetadata *screenPB = NULL; if (pluginPBv) { PluginMetadata *pluginPB = (PluginMetadata *) pluginPBv; screenPB = pluginPB->mutable_screen (); groupListPBv = screenPB->mutable_group_desc (); subgroupListPBv = screenPB->mutable_subgroup_desc (); } #endif optNodes = getNodesFromXPath (node->doc, nodes[0], "option | group/subgroup/option | group/option | subgroup/option", &num); if (num) { for (int i = 0; i < num; ++i) { void *optionPBv = NULL; #ifdef USE_PROTOBUF if (screenPB) optionPBv = screenPB->add_option (); #endif addOptionFromXMLNode (plugin, optNodes[i], groupListPBv, subgroupListPBv, optionPBv); } free (optNodes); } free (nodes); } static inline void initOptionsFromRootNode (CCSPlugin * plugin, xmlNode * node, void * pluginPBv) { // For all optiond initScreenFromRootNode (plugin, node, pluginPBv); } static void addStringsFromPath (CCSStringList * list, const char * path, xmlNode * node, void * stringListPBv) { xmlNode **nodes; int num; nodes = getNodesFromXPath (node->doc, node, path, &num); if (num) { for (int i = 0; i < num; ++i) { char *value = stringFromNodeDef (nodes[i], "child::text()", NULL); if (value && strlen (value)) { CCSString *str = (CCSString *) calloc (1, sizeof (CCSString)); str->value = value; str->refCount = 1; *list = ccsStringListAppend (*list, str); #ifdef USE_PROTOBUF if (stringListPBv) ((StringList *) stringListPBv)->Add ()->assign (value); #endif } if (value && !strlen (value)) free (value); } free (nodes); } } static void addStringExtensionFromXMLNode (CCSPlugin * plugin, xmlNode * node, void * extensionPBv) { xmlNode **nodes; int num; CCSStrExtension *extension; char *name; char *value; void * stringListPBv = NULL; extension = (CCSStrExtension *) calloc (1, sizeof (CCSStrExtension)); if (!extension) return; extension->refCount = 1; extension->restriction = NULL; extension->basePlugin = getStringFromXPath (node->doc, node, "@base_plugin"); if (!extension->basePlugin) extension->basePlugin = strdup (""); #ifdef USE_PROTOBUF ExtensionMetadata * extensionPB = NULL; if (extensionPBv) { extensionPB = (ExtensionMetadata *) extensionPBv; extensionPB->set_base_plugin (extension->basePlugin); stringListPBv = extensionPB->mutable_base_option (); } #endif addStringsFromPath (&extension->baseSettings, "base_option", node, stringListPBv); nodes = getNodesFromXPath (node->doc, node, "restriction", &num); if (!num) { free (extension); return; } for (int j = 0; j < num; ++j) { value = getStringFromXPath (node->doc, nodes[j], "value/child::text()"); if (value) { name = stringFromNodeDefTrans (nodes[j], "name/child::text()", NULL); if (name) { ccsAddRestrictionToStringExtension (extension, name, value); #ifdef USE_PROTOBUF if (extensionPB) { OptionMetadata::StringRestriction *strRestrictionPB = extensionPB->add_str_restriction (); strRestrictionPB->set_value (value); strRestrictionPB->set_name (name); } #endif free (name); } free (value); } } free (nodes); CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); pPrivate->stringExtensions = ccsStrExtensionListAppend (pPrivate->stringExtensions, extension); } static void initStringExtensionsFromRootNode (CCSPlugin * plugin, xmlNode * node, void * pluginPBv) { xmlNode **nodes; int num; nodes = getNodesFromXPath (node->doc, node, "/compiz/*/extension", &num); for (int i = 0; i < num; ++i) { void *extensionPBv = NULL; #ifdef USE_PROTOBUF if (pluginPBv) { PluginMetadata *pluginPB = (PluginMetadata *) pluginPBv; extensionPBv = pluginPB->add_extension (); } #endif addStringExtensionFromXMLNode (plugin, nodes[i], extensionPBv); } free (nodes); } static void initRulesFromRootNode (CCSPlugin * plugin, xmlNode * node, void * pluginInfoPBv) { void *featureListPBv = NULL; void *pluginAfterListPBv = NULL; void *pluginBeforeListPBv = NULL; void *requirePluginListPBv = NULL; void *requireFeatureListPBv = NULL; void *conflictPluginListPBv = NULL; void *conflictFeatureListPBv = NULL; #ifdef USE_PROTOBUF if (pluginInfoPBv) { PluginInfoMetadata *pluginInfoPB = (PluginInfoMetadata *) pluginInfoPBv; featureListPBv = pluginInfoPB->mutable_feature (); DependenciesMetadata *deps = pluginInfoPB->mutable_deps (); pluginAfterListPBv = deps->mutable_after_plugin (); pluginBeforeListPBv = deps->mutable_before_plugin (); requirePluginListPBv = deps->mutable_require_plugin (); requireFeatureListPBv = deps->mutable_require_feature (); conflictPluginListPBv = deps->mutable_conflict_plugin (); conflictFeatureListPBv = deps->mutable_conflict_feature (); } #endif CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); addStringsFromPath (&pPrivate->providesFeature, "feature", node, featureListPBv); addStringsFromPath (&pPrivate->loadAfter, "deps/relation[@type = 'after']/plugin", node, pluginAfterListPBv); addStringsFromPath (&pPrivate->loadBefore, "deps/relation[@type = 'before']/plugin", node, pluginBeforeListPBv); addStringsFromPath (&pPrivate->requiresPlugin, "deps/requirement/plugin", node, requirePluginListPBv); addStringsFromPath (&pPrivate->requiresFeature, "deps/requirement/feature", node, requireFeatureListPBv); addStringsFromPath (&pPrivate->conflictPlugin, "deps/conflict/plugin", node, conflictPluginListPBv); addStringsFromPath (&pPrivate->conflictFeature, "deps/conflict/feature", node, conflictFeatureListPBv); } #ifdef USE_PROTOBUF static void fillBasicInfoIntoPB (CCSPlugin *plugin, PluginInfoMetadata *pluginInfoPB) { if (!pluginInfoPB) return; pluginInfoPB->set_name (ccsPluginGetName (plugin)); pluginInfoPB->set_short_desc (ccsPluginGetShortDesc (plugin)); pluginInfoPB->set_long_desc (ccsPluginGetLongDesc (plugin)); pluginInfoPB->set_category (ccsPluginGetCategory (plugin)); } #endif /* Returns TRUE on success. */ static Bool addPluginFromXMLNode (CCSContext * context, xmlNode * node, char * file, void * pluginInfoPBv) { char *name; CCSPlugin *plugin; CCSPluginPrivate *pPrivate; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!node) return FALSE; name = getStringFromXPath (node->doc, node, "@name"); if (!name || !strlen (name)) { if (name) free (name); return FALSE; } if (!strcmp (name, "ini") || !strcmp (name, "gconf") || !strcmp (name, "ccp") || !strcmp (name, "kconfig")) { free (name); return FALSE; } if (ccsFindPlugin (context, name)) { free (name); return FALSE; } plugin = (CCSPlugin *) calloc (1, sizeof (CCSPlugin)); if (!plugin) return FALSE; ccsObjectInit (plugin, &ccsDefaultObjectAllocator); ccsPluginRef (plugin); pPrivate = (CCSPluginPrivate *) calloc (1, sizeof (CCSPluginPrivate)); if (!pPrivate) { free (plugin); return FALSE; } ccsObjectSetPrivate (plugin, (CCSPrivate *) pPrivate); ccsObjectAddInterface (plugin, (CCSInterface *) cPrivate->object_interfaces->pluginInterface, GET_INTERFACE_TYPE (CCSPluginInterface)); if (file) pPrivate->xmlFile = strdup (file); if (asprintf (&pPrivate->xmlPath, "/compiz/plugin[@name = '%s']", name) == -1) pPrivate->xmlPath = NULL; pPrivate->context = context; pPrivate->name = strdup (name); if (!basicMetadata) { pPrivate->shortDesc = stringFromNodeDefTrans (node, "short/child::text()", name); pPrivate->longDesc = stringFromNodeDefTrans (node, "long/child::text()", name); pPrivate->category = stringFromNodeDef (node, "category/child::text()", ""); } else { pPrivate->shortDesc = strdup (name); pPrivate->longDesc = strdup (name); pPrivate->category = strdup (""); } #ifdef USE_PROTOBUF fillBasicInfoIntoPB (plugin, (PluginInfoMetadata *) pluginInfoPBv); #endif initRulesFromRootNode (plugin, node, pluginInfoPBv); cPrivate->plugins = ccsPluginListAppend (cPrivate->plugins, plugin); free (name); return TRUE; } /* Returns TRUE on success. */ static Bool addCoreSettingsFromXMLNode (CCSContext * context, xmlNode * node, char *file, void * pluginInfoPBv) { CCSPlugin *plugin; CCSPluginPrivate *pPrivate; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!node) return FALSE; if (ccsFindPlugin (context, "core")) return FALSE; plugin = (CCSPlugin *) calloc (1, sizeof (CCSPlugin)); if (!plugin) return FALSE; ccsObjectInit (plugin, &ccsDefaultObjectAllocator); ccsPluginRef (plugin); pPrivate = (CCSPluginPrivate *) calloc (1, sizeof (CCSPluginPrivate)); if (!pPrivate) { free (plugin); return FALSE; } ccsObjectSetPrivate (plugin, (CCSPrivate *) pPrivate); ccsObjectAddInterface (plugin, (CCSInterface *) cPrivate->object_interfaces->pluginInterface, GET_INTERFACE_TYPE (CCSPluginInterface)); if (file) pPrivate->xmlFile = strdup (file); pPrivate->xmlPath = strdup ("/compiz/plugin[@name='core']"); pPrivate->context = context; pPrivate->name = strdup ("core"); pPrivate->category = strdup ("General"); if (!basicMetadata) { pPrivate->shortDesc = stringFromNodeDefTrans (node, "short/child::text()", "General Options"); pPrivate->longDesc = stringFromNodeDefTrans (node, "long/child::text()", "General Compiz Options"); } else { pPrivate->shortDesc = strdup ("General Options"); pPrivate->longDesc = strdup ("General Compiz Options"); } #ifdef USE_PROTOBUF fillBasicInfoIntoPB (plugin, (PluginInfoMetadata *) pluginInfoPBv); #endif initRulesFromRootNode (plugin, node, pluginInfoPBv); cPrivate->plugins = ccsPluginListAppend (cPrivate->plugins, plugin); return TRUE; } /* End of XML parsing */ #ifdef USE_PROTOBUF // Either pluginMinMetadata or pluginMetadata should be non-NULL static Bool loadPluginMetadataFromProtoBuf (char *pbPath, PluginBriefMetadata *pluginMinMetadata, PluginMetadata *pluginMetadata) { Bool success = FALSE; FILE *pbFile = fopen (pbPath, "rb"); if (pbFile) { google::protobuf::io::FileInputStream inputStream (fileno (pbFile)); if ((pluginMinMetadata && pluginMinMetadata->ParseFromZeroCopyStream (&inputStream)) || (pluginMetadata && pluginMetadata->ParseFromZeroCopyStream (&inputStream))) success = TRUE; inputStream.Close (); fclose (pbFile); } return success; } // Returns TRUE if successfully loads .pb file and .pb is up to date. static Bool checkAndLoadProtoBuf (char *pbPath, struct stat *pbStat, struct stat *xmlStat, PluginBriefMetadata *pluginBriefPB) { const PluginInfoMetadata &pluginInfoPB = pluginBriefPB->info (); if (pbStat->st_mtime < xmlStat->st_mtime || // is .pb older than .xml? !loadPluginMetadataFromProtoBuf (pbPath, pluginBriefPB, NULL) || (!basicMetadata && pluginBriefPB->info ().basic_metadata ()) || pluginInfoPB.pb_abi_version () != PB_ABI_VERSION || pluginInfoPB.time () != (unsigned long)xmlStat->st_mtime || // xml modification time mismatch? (pluginInfoPB.locale () != "NONE" && pluginInfoPB.locale () != shortLocale)) { // .pb needs update return FALSE; } return TRUE; } // Write .pb data to .pb file static void writePBFile (char *pbFilePath, PluginMetadata *pluginPB, PluginBriefMetadata *pluginBriefPB, struct stat *xmlStat) { if (!createProtoBufCacheDir ()) return; PluginInfoMetadata *pluginInfoPB; if (pluginPB) { pluginInfoPB = pluginPB->mutable_info (); pluginInfoPB->set_brief_metadata (FALSE); } else { pluginInfoPB = pluginBriefPB->mutable_info (); pluginInfoPB->set_pb_abi_version (PB_ABI_VERSION); pluginInfoPB->set_locale (shortLocale); pluginInfoPB->set_time ((unsigned long)xmlStat->st_mtime); pluginInfoPB->set_brief_metadata (TRUE); } pluginInfoPB->set_basic_metadata (basicMetadata); FILE *pbFile = fopen (pbFilePath, "wb"); if (pbFile) { google::protobuf::io::FileOutputStream outputStream (fileno (pbFile)); if (pluginPB) pluginPB->SerializeToZeroCopyStream (&outputStream); else pluginBriefPB->SerializeToZeroCopyStream (&outputStream); outputStream.Close (); fclose (pbFile); } } #endif /* Returns TRUE on success. */ static Bool loadPluginFromXML (CCSContext * context, xmlDoc * doc, char *filename, void * pluginInfoPBv) { xmlNode **nodes; int num; Bool success = FALSE; nodes = getNodesFromXPath (doc, NULL, "/compiz/plugin[@name='core']", &num); if (num) { success = addCoreSettingsFromXMLNode (context, nodes[0], filename, pluginInfoPBv); free (nodes); return success; } nodes = getNodesFromXPath (doc, NULL, "/compiz/plugin", &num); if (num) { success = addPluginFromXMLNode (context, nodes[0], filename, pluginInfoPBv); free (nodes); } return success; } #ifdef USE_PROTOBUF static void updatePBFilePath (CCSContext * context, char *name, char *pbFilePath) { CCSPlugin *plugin = ccsFindPlugin (context, name); if (plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (pPrivate->pbFilePath) free (pPrivate->pbFilePath); pPrivate->pbFilePath = strdup (pbFilePath); } } #endif static void loadPluginFromXMLFile (CCSContext * context, char *xmlName, char *xmlDirPath) { char *xmlFilePath = NULL; void *pluginInfoPBv = NULL; if (asprintf (&xmlFilePath, "%s/%s", xmlDirPath, xmlName) == -1) xmlFilePath = NULL; if (!xmlFilePath) { ccsError ("Can't allocate memory"); return; } #ifdef USE_PROTOBUF char *name = NULL; char *pbFilePath = NULL; struct stat xmlStat; Bool removePB = FALSE; if (usingProtobuf) { if (stat (xmlFilePath, &xmlStat)) { free (xmlFilePath); return; } // Check if the corresponding .pb exists in cache Bool error = TRUE; struct stat pbStat; name = strndup (xmlName, strlen (xmlName) - 4); if (!name) { ccsError ("Can't allocate memory"); free (xmlFilePath); return; } if (createProtoBufCacheDir () && metadataCacheDir.length () > 0) { if (asprintf (&pbFilePath, "%s/%s.pb", metadataCacheDir.c_str (), name) == -1) pbFilePath = NULL; if (!pbFilePath) { ccsError ("Can't allocate memory"); free (xmlFilePath); free (name); return; } error = stat (pbFilePath, &pbStat); } if (!error) { if (checkAndLoadProtoBuf (pbFilePath, &pbStat, &xmlStat, &persistentPluginBriefPB)) { // Found and loaded .pb if (!strcmp (name, "core")) addCoreSettingsFromPB (context, persistentPluginBriefPB.info (), pbFilePath, xmlFilePath); else addPluginFromPB (context, persistentPluginBriefPB.info (), pbFilePath, xmlFilePath); updatePBFilePath (context, name, pbFilePath); free (xmlFilePath); free (pbFilePath); free (name); return; } else { removePB = TRUE; } } persistentPluginBriefPB.Clear (); pluginInfoPBv = persistentPluginBriefPB.mutable_info (); } #endif // Load from .xml FILE *fp = fopen (xmlFilePath, "r"); #ifdef USE_PROTOBUF Bool xmlLoaded = FALSE; #endif if (fp) { fclose (fp); xmlDoc *doc = xmlReadFile (xmlFilePath, NULL, 0); if (doc) { #ifdef USE_PROTOBUF xmlLoaded = #endif loadPluginFromXML (context, doc, xmlFilePath, pluginInfoPBv); xmlFreeDoc (doc); } } free (xmlFilePath); #ifdef USE_PROTOBUF if (usingProtobuf && xmlLoaded) { if (removePB) remove (pbFilePath); // Attempt to remove .pb writePBFile (pbFilePath, NULL, &persistentPluginBriefPB, &xmlStat); updatePBFilePath (context, name, pbFilePath); } if (pbFilePath) free (pbFilePath); if (name) free (name); #endif } static void loadPluginsFromXMLFiles (CCSContext * context, char *path) { struct dirent **nameList; int nFile; if (!path) return; #if defined(HAVE_SCANDIR_POSIX) // POSIX (2008) defines the comparison function like this: #define scandir(a,b,c,d) scandir((a), (b), (c), (int(*)(const dirent **, const dirent **))(d)); #else #define scandir(a,b,c,d) scandir((a), (b), (c), (int(*)(const void*,const void*))(d)); #endif nFile = scandir (path, &nameList, pluginXMLFilter, NULL); if (nFile <= 0) return; for (int i = 0; i < nFile; ++i) { loadPluginFromXMLFile (context, nameList[i]->d_name, path); free (nameList[i]); } free (nameList); } static void addPluginNamed (CCSContext * context, char *name) { CCSPlugin *plugin; CCSPluginPrivate *pPrivate; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (ccsFindPlugin (context, name)) return; if (!strcmp (name, "ini") || !strcmp (name, "gconf") || !strcmp (name, "ccp") || !strcmp (name, "kconfig")) return; plugin = (CCSPlugin *) calloc (1, sizeof (CCSPlugin)); if (!plugin) return; ccsObjectInit (plugin, &ccsDefaultObjectAllocator); ccsPluginRef (plugin); pPrivate = (CCSPluginPrivate *) calloc (1, sizeof (CCSPluginPrivate)); if (!pPrivate) { free (plugin); return; } ccsObjectSetPrivate (plugin, (CCSPrivate *) pPrivate); ccsObjectAddInterface (plugin, (CCSInterface *) cPrivate->object_interfaces->pluginInterface, GET_INTERFACE_TYPE (CCSPluginInterface)); pPrivate->context = context; pPrivate->name = strdup (name); if (!pPrivate->shortDesc) pPrivate->shortDesc = strdup (name); if (!pPrivate->longDesc) pPrivate->longDesc = strdup (name); if (!pPrivate->category) pPrivate->category = strdup (""); pPrivate->loaded = TRUE; collateGroups (pPrivate); cPrivate->plugins = ccsPluginListAppend (cPrivate->plugins, plugin); } static void loadPluginsFromName (CCSContext * context, char *path) { struct dirent **nameList; int nFile; if (!path) return; nFile = scandir (path, &nameList, pluginNameFilter, NULL); if (nFile <= 0) return; for (int i = 0; i < nFile; ++i) { char name[1024]; sscanf (nameList[i]->d_name, "lib%s", name); if (strlen (name) > 3) name[strlen (name) - 3] = 0; free (nameList[i]); addPluginNamed (context, name); } free (nameList); } #ifdef USE_PROTOBUF static inline void initPBLoading () { // Update usingProtobuf with the COMPIZ_NO_PROTOBUF environment variable char *compizNoProtobuf = getenv ("COMPIZ_NO_PROTOBUF"); usingProtobuf = !(compizNoProtobuf && (strcasecmp (compizNoProtobuf, "1") == 0 || strcasecmp (compizNoProtobuf, "yes") == 0 || strcasecmp (compizNoProtobuf, "true") == 0)); if (usingProtobuf) { // Verify that the version of the library that we linked against is // compatible with the version of the headers we compiled against. GOOGLE_PROTOBUF_VERIFY_VERSION; } } #endif Bool ccsLoadPluginDefault (CCSContext * context, char *name) { #ifdef USE_PROTOBUF initPBLoading (); #endif char *xmlDirPath = NULL; char *xmlName = NULL; if (asprintf (&xmlName, "%s.xml", name) == -1) xmlName = NULL; if (xmlName) { char *home = getenv ("HOME"); if (home && strlen (home)) { if (asprintf (&xmlDirPath, "%s/.compiz-1/metadata", home) == -1) xmlDirPath = NULL; if (xmlDirPath) { loadPluginFromXMLFile (context, xmlName, xmlDirPath); free (xmlDirPath); } } loadPluginFromXMLFile (context, xmlName, (char *) METADATADIR); free (xmlName); } return (ccsFindPlugin (context, name) != NULL); } Bool ccsLoadPlugin (CCSContext *context, char *name) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextLoadPlugin) (context, name); } void ccsLoadPluginsDefault (CCSContext * context) { ccsDebug ("Adding plugins"); #ifdef USE_PROTOBUF initPBLoading (); #endif char *home = getenv ("HOME"); char *overload_metadata = getenv ("COMPIZ_METADATA_PATH"); if (overload_metadata && strlen (overload_metadata)) { char *overloadmetaplugins = NULL; if (asprintf (&overloadmetaplugins, "%s", overload_metadata) == -1) overloadmetaplugins = NULL; if (overloadmetaplugins) { loadPluginsFromXMLFiles (context, overloadmetaplugins); free (overloadmetaplugins); } } if (home && strlen (home)) { char *homeplugins = NULL; if (asprintf (&homeplugins, "%s/.compiz-1/metadata", home) == -1) homeplugins = NULL; if (homeplugins) { loadPluginsFromXMLFiles (context, homeplugins); free (homeplugins); } } loadPluginsFromXMLFiles (context, (char *)METADATADIR); if (home && strlen (home)) { char *homeplugins = NULL; if (asprintf (&homeplugins, "%s/.compiz-1/plugins", home) == -1) homeplugins = NULL; if (homeplugins) { loadPluginsFromName (context, homeplugins); free (homeplugins); } } loadPluginsFromName (context, (char *)PLUGINDIR); } void ccsLoadPlugins (CCSContext *context) { (*(GET_INTERFACE (CCSContextInterface, context))->contextLoadPlugins) (context); } static void loadOptionsStringExtensionsFromXML (CCSPlugin * plugin, void * pluginPBv, struct stat *xmlStat) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); xmlDoc *doc = NULL; xmlNode **nodes; int num; if (stat (pPrivate->xmlFile, xmlStat)) return; FILE *fp = fopen (pPrivate->xmlFile, "r"); if (!fp) return; fclose (fp); doc = xmlReadFile (pPrivate->xmlFile, NULL, 0); nodes = getNodesFromXPath (doc, NULL, pPrivate->xmlPath, &num); if (num) { initOptionsFromRootNode (plugin, nodes[0], pluginPBv); if (!basicMetadata) initStringExtensionsFromRootNode (plugin, nodes[0], pluginPBv); free (nodes); } if (doc) xmlFreeDoc (doc); } void ccsLoadPluginSettings (CCSPlugin * plugin) { Bool ignoreXML = FALSE; void *pluginPBToWrite = NULL; #ifdef USE_PROTOBUF Bool loadedAtLeastBriefPB = FALSE; initPBLoading (); #endif CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (pPrivate->loaded) return; pPrivate->loaded = TRUE; ccsDebug ("Initializing %s options...", pPrivate->name); #ifdef USE_PROTOBUF if (usingProtobuf && pPrivate->pbFilePath) { loadedAtLeastBriefPB = loadPluginMetadataFromProtoBuf (pPrivate->pbFilePath, NULL, &persistentPluginPB); if (loadedAtLeastBriefPB) { if (!persistentPluginPB.info ().brief_metadata () && (basicMetadata || !persistentPluginPB.info ().basic_metadata ())) { initOptionsFromPB (plugin, persistentPluginPB); if (!basicMetadata) initStringExtensionsFromPB (plugin, persistentPluginPB); ignoreXML = TRUE; } else pluginPBToWrite = &persistentPluginPB; } else pluginPBToWrite = &persistentPluginPB; } #endif struct stat xmlStat; // Load from .xml if (!ignoreXML && pPrivate->xmlFile) loadOptionsStringExtensionsFromXML (plugin, pluginPBToWrite, &xmlStat); #ifdef USE_PROTOBUF if (pluginPBToWrite && pPrivate->pbFilePath && loadedAtLeastBriefPB) writePBFile (pPrivate->pbFilePath, (PluginMetadata *) pluginPBToWrite, NULL, &xmlStat); #endif ccsDebug ("done"); collateGroups (pPrivate); ccsReadPluginSettings (plugin); } compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/include/0000755000015301777760000000000012321344021024764 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/include/ccs-string.h0000644000015301777760000000247712321343002027221 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _CCS_STRING_H #define _CCS_STRING_H /* Doesn't seem to make sense to have this header * dependency, but we can only declare a typed list * once */ #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSString CCSString; struct _CCSString { char *value; unsigned int refCount; }; void ccsFreeString (CCSString *str); CCSLIST_HDR (String, CCSString); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/include/ccs-setting-types.h0000644000015301777760000000257012321343002030524 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _COMPIZCONFIG_CCS_SETTING_TYPES #define _COMPIZCONFIG_CCS_SETTING_TYPES #include COMPIZCONFIG_BEGIN_DECLS typedef enum _CCSSettingType { /* This needs to be in the same order as CompOptionType for consistency */ TypeBool, TypeInt, TypeFloat, TypeString, TypeColor, TypeAction, TypeKey, TypeButton, TypeEdge, TypeBell, TypeMatch, TypeList, TypeNum } CCSSettingType; COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/include/ccs-object.h0000644000015301777760000001552412321343002027156 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: Sam Spilsbury */ #ifndef _CCS_OBJECT_H #define _CCS_OBJECT_H #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSInterface CCSInterface; /* Dummy typedef */ typedef struct _CCSPrivate CCSPrivate; /* Dummy typedef */ typedef void * (*reallocObjectProc) (void *, void *, size_t); typedef void * (*mallocObjectProc) (void *, size_t); typedef void * (*callocObjectProc) (void *, size_t, size_t); typedef void (*freeObjectProc) (void *, void *); /** * An interface which specifies how objects should be allocated * * The purpose of this interface is to provide wrappers around * the standard realloc, malloc, calloc and free functions. * * ccsObjectInit takes this allocation interface as a means of * being able to test what happens when an allocation fails. * * Any other objects which implement CCSObject should also take * this interface and pass it to ccsObjectInit. They should also * use this interface as a means to allocate their own data so * that tests for those objects can test allocation failures */ struct _CCSObjectAllocationInterface { reallocObjectProc realloc_; mallocObjectProc malloc_; callocObjectProc calloc_; freeObjectProc free_; void *allocator; }; extern CCSObjectAllocationInterface ccsDefaultObjectAllocator; /** * * CCSObject - a generic C based object * * CCSObject is a generic C based object system for compizconfig. * Any structure that wishes to behave in an object oriented way * should have a CCSObject as its first and only member, and with * the name "object". (The macros that use CCSObject require this * in order to use it safely). * * CCSObject only provides two facilites to clients - implementation * of interfaces (which are just structs of function pointers) and * private data storage. * * They can also be refcounted, however, this is only ever done safely * if the object implements a virtual destructor method in its interface * so that the macro CCSREF_OBJ knows what to destroy first. * * CCSObjects must be initialized before they are used. This can be * done by calling ccsObjectInit and passing in the allocated memory * block containing the object and a CCSObjectAllocationInterface * which * ccsObjectInit will store in the object and use for all future * allocations. * * Objects can implement interfaces by storing a struct of function pointers * pertaining to that interface associated with that interface's unique type * id generated at runtime. Eg * * ccsObjectAddInterface (object, (const CCSInterface *) &interface, * GET_INTERFACE_TYPE (Interface)); * * Then you can retreive that interface and access its methods as follows: * * GET_INTERFACE (Interface, object)->method * * Objects also have one pointer available for private storage. It is * recommended that all nonvirtual data lives in such storage. Add * a private using: * * ccsObjectSetPrivate (object, (CCSPrivate *) priv); * * Setting a private member does NOT free the existing private member if * it is set. It is the object's responsibility to do this if it wishes * to set a new private member, or set the existing one to NULL. * * To finalize an object and free all related data, use ccsObjectFinalize * * ccsObjectFinalize (object); * * This will free all private data, interface arrays and other data * using the provided CCSObjectAllocationInterface on ccsObjectInit. */ struct _CCSObject { CCSPrivate *priv; /* Private pointer for object storage */ const CCSInterface **interfaces; /* An array of interfaces that this object implements */ int *interface_types; /* An array of interface types */ unsigned int n_interfaces; unsigned int n_allocated_interfaces; CCSObjectAllocationInterface *object_allocation; unsigned int refcnt; /* Reference count of this object */ }; Bool ccsObjectInit_ (CCSObject *object, CCSObjectAllocationInterface *interface); #define ccsObjectInit(o, interface) (ccsObjectInit_) (&(o)->object, interface) Bool ccsObjectAddInterface_ (CCSObject *object, const CCSInterface *interface, int interface_type); #define ccsObjectAddInterface(o, interface, type) (ccsObjectAddInterface_) (&(o)->object, interface, type); Bool ccsObjectRemoveInterface_ (CCSObject *object, int interface_type); #define ccsObjectRemoveInterface(o, interface_type) (ccsObjectRemoveInterface_) (&(o)->object, interface_type); const CCSInterface * ccsObjectGetInterface_ (CCSObject *object, int interface_type); #define ccsObjectGetInterface(o, interface_type) (ccsObjectGetInterface_) (&(o)->object, interface_type) #define ccsObjectRef(o) \ do { ++((o)->object).refcnt; } while (FALSE) #define ccsObjectUnref(o, freeFunc) \ do \ { \ --((o)->object).refcnt; \ if (!((o)->object).refcnt) \ freeFunc (o); \ } while (FALSE) CCSPrivate * ccsObjectGetPrivate_ (CCSObject *object); #define ccsObjectGetPrivate(o) (ccsObjectGetPrivate_) (&(o)->object) void ccsObjectSetPrivate_ (CCSObject *object, CCSPrivate *priv); #define ccsObjectSetPrivate(o, priv) (ccsObjectSetPrivate_) (&(o)->object, priv) void ccsObjectFinalize_ (CCSObject *object); #define ccsObjectFinalize(o) (ccsObjectFinalize_) (&(o)->object) /** * Internal method to allocate a type. * * @brief ccsAllocateType * @return a new type */ unsigned int ccsAllocateType (); #define GET_INTERFACE_TYPE(Interface) \ ccs##Interface##GetType () /** * Used to define a new interface type - you should do this if any CCSObject * is to implement this interface */ #define INTERFACE_TYPE(Interface) \ unsigned int ccs##Interface##GetType () \ { \ static unsigned int type_id = 0; \ if (!type_id) \ type_id = ccsAllocateType (); \ \ return type_id; \ } #define GET_INTERFACE(CType, o) (CType *) ccsObjectGetInterface (o, GET_INTERFACE_TYPE(CType)) #define CCSREF_OBJ(type,dtype) \ void ccs##type##Ref (dtype *d) \ { \ ccsObjectRef (d); \ } \ \ void ccs##type##Unref (dtype *d) \ { \ ccsObjectUnref (d, ccsFree##type); \ } \ COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/include/ccs-backend.h0000644000015301777760000005047112321343002027277 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CCS_BACKEND_H #define CCS_BACKEND_H #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSIntegratedSettingInfoInterface CCSIntegratedSettingInfoInterface; typedef const char * (*CCSIntegratedSettingInfoPluginName) (CCSIntegratedSettingInfo *); typedef const char * (*CCSIntegratedSettingInfoSettingName) (CCSIntegratedSettingInfo *); typedef CCSSettingType (*CCSIntegratedSettingInfoGetType) (CCSIntegratedSettingInfo *); typedef void (*CCSIntegratedSettingInfoFree) (CCSIntegratedSettingInfo *); struct _CCSIntegratedSettingInfoInterface { CCSIntegratedSettingInfoPluginName pluginName; CCSIntegratedSettingInfoSettingName settingName; CCSIntegratedSettingInfoGetType getType; CCSIntegratedSettingInfoFree free; }; /** * @brief The _CCSIntegratedSettingInfo struct * * This interface represents some basic information about a DE * integrated setting, it cannot be operated upon itself */ struct _CCSIntegratedSettingInfo { CCSObject object; }; typedef struct _CCSIntegratedSettingInterface CCSIntegratedSettingInterface; typedef CCSSettingValue * (*CCSIntegratedSettingReadValue) (CCSIntegratedSetting *, CCSSettingType); typedef void (*CCSIntegratedSettingWriteValue) (CCSIntegratedSetting *, CCSSettingValue *, CCSSettingType); typedef void (*CCSIntegratedSettingFree) (CCSIntegratedSetting *); struct _CCSIntegratedSettingInterface { CCSIntegratedSettingReadValue readValue; CCSIntegratedSettingWriteValue writeValue; CCSIntegratedSettingFree free; }; const char * ccsIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *); const char * ccsIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *); CCSSettingType ccsIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *); void ccsFreeIntegratedSettingInfo (CCSIntegratedSettingInfo *); CCSREF_HDR (IntegratedSettingInfo, CCSIntegratedSettingInfo); CCSLIST_HDR (IntegratedSettingInfo, CCSIntegratedSettingInfo); unsigned int ccsCCSIntegratedSettingInfoInterfaceGetType (); /** * @brief The _CCSIntegratedSetting struct * * A CCSIntegratedSetting represents an desktop environment setting which * we are "integrated" with - its functionality is more or less a subset * of CCSSetting, values can be written and read from it but not much else. */ struct _CCSIntegratedSetting { CCSObject object; }; CCSSettingValue * ccsIntegratedSettingReadValue(CCSIntegratedSetting *, CCSSettingType); void ccsIntegratedSettingWriteValue (CCSIntegratedSetting *, CCSSettingValue *, CCSSettingType); void ccsFreeIntegratedSetting (CCSIntegratedSetting *); CCSREF_HDR (IntegratedSetting, CCSIntegratedSetting); CCSLIST_HDR (IntegratedSetting, CCSIntegratedSetting); unsigned int ccsCCSIntegratedSettingInterfaceGetType (); /** * @brief ccsSharedIntegratedInfoSettingNew * @param pluginName Plugin name of the integrated setting * @param settingName Compiz name of the integrated setting * @param type A CCSSettingType * @param ai A CCSObjectAllocationInterface * * @return a new CCSIntegratedSettingInfo * * ccsSharedIntegratedSettingInfoNew () returns the most fundamental * implementation of a CCSIntegratedSettingInfo *, which is basic * information about it, the plugin name, setting name, and type. */ CCSIntegratedSettingInfo * ccsSharedIntegratedSettingInfoNew (const char *pluginName, const char *settingName, CCSSettingType type, CCSObjectAllocationInterface *ai); typedef struct _CCSIntegratedSettingsStorageInterface CCSIntegratedSettingsStorageInterface; /** * A predicate definition to find a CCSIntegratedSetting in a * CCSIntegratedSettingStorage object. Returns true if the user * predicate matches. The void * is some user-specified data */ typedef Bool (*CCSIntegratedSettingsStorageFindPredicate) (CCSIntegratedSetting *, void *); typedef CCSIntegratedSettingList (*CCSIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName) (CCSIntegratedSettingsStorage *storage, const char *pluginName, const char *settingName); typedef void (*CCSIntegratedSettingsStorageAddSetting) (CCSIntegratedSettingsStorage *storage, CCSIntegratedSetting *setting); typedef CCSIntegratedSettingList (*CCSIntegratedSettingsStorageFindMatchingSettingsByPredicate) (CCSIntegratedSettingsStorage *storage, CCSIntegratedSettingsStorageFindPredicate pred, void *data); typedef Bool (*CCSIntegratedSettingsStorageEmpty) (CCSIntegratedSettingsStorage *storage); typedef void (*CCSIntegratedSettingsStorageFree) (CCSIntegratedSettingsStorage *storage); struct _CCSIntegratedSettingsStorageInterface { CCSIntegratedSettingsStorageFindMatchingSettingsByPredicate findMatchingSettingsByPredicate; CCSIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName findMatchingSettingsByPluginAndSettingName; CCSIntegratedSettingsStorageAddSetting addSetting; CCSIntegratedSettingsStorageEmpty empty; CCSIntegratedSettingsStorageFree free; }; /** * @brief The _CCSIntegratedSettingsStorage struct * * CCSIntegratedSettingsStorage represents a list of currently active integrated * DE settings. Access is restricted such that settings can only be added and * the list can only be searched by predicates. */ struct _CCSIntegratedSettingsStorage { CCSObject object; }; CCSREF_HDR (IntegratedSettingsStorage, CCSIntegratedSettingsStorage); /** * @brief ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate * @param storage * @param pred * @param data * @return a CCSIntegratedSettingList of CCSIntegratedSetting objects * matching CCSIntegratedSettingsStorageFindPredicate */ CCSIntegratedSettingList ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate (CCSIntegratedSettingsStorage *storage, CCSIntegratedSettingsStorageFindPredicate pred, void *data); /** * @brief ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName * @param storage * @param pluginName * @param settingName * @return a CCSIntegratedSettingList of CCSIntegratedSetting objects * with the specified plugin and setting names. */ CCSIntegratedSettingList ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (CCSIntegratedSettingsStorage *storage, const char *pluginName, const char *settingName); void ccsIntegratedSettingsStorageAddSetting (CCSIntegratedSettingsStorage *storage, CCSIntegratedSetting *setting); Bool ccsIntegratedSettingsStorageEmpty (CCSIntegratedSettingsStorage *storage); void ccsFreeIntegratedSettingsStorage (CCSIntegratedSettingsStorage *storage); unsigned int ccsCCSIntegratedSettingsStorageInterfaceGetType (); CCSIntegratedSettingsStorage * ccsIntegratedSettingsStorageDefaultImplNew (CCSObjectAllocationInterface *ai); typedef struct _CCSIntegratedSettingFactoryInterface CCSIntegratedSettingFactoryInterface; typedef CCSIntegratedSetting * (*CCSIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType) (CCSIntegratedSettingFactory *factory, CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type); typedef void (*CCSIntegratedSettingFactoryFree) (CCSIntegratedSettingFactory *); struct _CCSIntegratedSettingFactoryInterface { CCSIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType createIntegratedSettingForCCSSettingNameAndType; CCSIntegratedSettingFactoryFree free; }; /** * @brief The _CCSIntegratedSettingFactory struct * * CCSIntegratedSettingFactory is an interface for creating a CCSIntegratedSetting * for a particular integration backend when appropriate. It doesn't make sense to load * such information on startup until we need it as we might never write to these settings * and loading them is an expensive process. In addition, we need to allow a place * for testing code to prevent CCSIntegratedSetting objects from pulling * in dependencies that they shouldn't. */ struct _CCSIntegratedSettingFactory { CCSObject object; }; CCSREF_HDR (IntegratedSettingFactory, CCSIntegratedSettingFactory); unsigned int ccsCCSIntegratedSettingFactoryInterfaceGetType (); CCSIntegratedSetting * ccsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (CCSIntegratedSettingFactory *factory, CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type); void ccsFreeIntegratedSettingFactory (CCSIntegratedSettingFactory *factory); typedef struct _CCSIntegrationInterface CCSIntegrationInterface; typedef CCSIntegratedSetting * (*CCSIntegrationGetIntegratedSetting) (CCSIntegration *integration, const char *pluginName, const char *settingName); typedef Bool (*CCSIntegrationReadOptionIntoSetting) (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting); typedef void (*CCSIntegrationWriteSettingIntoOption) (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting); typedef void (*CCSIntegrationUpdateIntegratedSettings) (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList integratedSettings); typedef void (*CCSIntegrationDisallowIntegratedWrites) (CCSIntegration *integration); typedef void (*CCSIntegrationAllowIntegratedWrites) (CCSIntegration *integration); typedef void (*CCSFreeIntegrationBackend) (CCSIntegration *integration); struct _CCSIntegrationInterface { CCSIntegrationGetIntegratedSetting getIntegratedSetting; CCSIntegrationReadOptionIntoSetting readOptionIntoSetting; CCSIntegrationWriteSettingIntoOption writeSettingIntoOption; CCSIntegrationUpdateIntegratedSettings updateIntegratedSettings; CCSIntegrationDisallowIntegratedWrites disallowIntegratedWrites; CCSIntegrationAllowIntegratedWrites allowIntegratedWrites; CCSFreeIntegrationBackend freeIntegrationBackend; }; /** * @brief The _CCSIntegration struct * * An object that represents integration with a desktop environment. Generally * these objects store a list of hardcoded settings that can be retrieved using * ccsIntegrationGetIntegratedOptionIndex and then written to and read * from using the readOptionIntoSetting and writeOptionIntoSetting. */ struct _CCSIntegration { CCSObject object; }; CCSREF_HDR (Integration, CCSIntegration) unsigned int ccsCCSIntegrationInterfaceGetType (); CCSIntegratedSetting * ccsIntegrationGetIntegratedSetting (CCSIntegration *integration, const char *pluginName, const char *settingName); Bool ccsIntegrationReadOptionIntoSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting); void ccsIntegrationWriteSettingIntoOption (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting); void ccsIntegrationUpdateIntegratedSettings (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList integratedSettings); void ccsIntegrationDisallowIntegratedWrites (CCSIntegration *integration); void ccsIntegrationAllowIntegratedWrites (CCSIntegration *integration); void ccsFreeIntegration (CCSIntegration *integration); CCSIntegration * ccsNullIntegrationBackendNew (CCSObjectAllocationInterface *ai); /** * @brief CCSBackend * * This object represents CCSBackend directly in memory. It does * not represent the details that come with a loaded backend. * * Backends are capable of reading, writing and updating settings * from intergrated locations. Clients should check if these functions * are supported first as the function pointers are permitted to be NULL. */ struct _CCSBackend { CCSObject object; }; struct _CCSBackendInfo { const char *name; /* name of the backend */ const char *shortDesc; /* backend's short description */ const char *longDesc; /* backend's long description */ Bool integrationSupport; /* does the backend support DE integration? */ Bool profileSupport; /* does the backend support profiles? */ unsigned int refCount; /* reference count */ }; typedef void (*CCSBackendExecuteEventsFunc) (CCSBackend *backend, unsigned int flags); typedef Bool (*CCSBackendInitFunc) (CCSBackend *, CCSContext * context); typedef Bool (*CCSBackendFiniFunc) (CCSBackend *); typedef Bool (*CCSBackendReadInitFunc) (CCSBackend *, CCSContext * context); typedef void (*CCSBackendReadSettingFunc) (CCSBackend *, CCSContext * context, CCSSetting * setting); typedef void (*CCSBackendReadDoneFunc) (CCSBackend *backend, CCSContext * context); typedef Bool (*CCSBackendWriteInitFunc) (CCSBackend *backend, CCSContext * context); typedef void (*CCSBackendWriteSettingFunc) (CCSBackend *, CCSContext * context, CCSSetting * setting); typedef void (*CCSBackendWriteDoneFunc) (CCSBackend *, CCSContext * context); typedef void (*CCSBackendUpdateFunc) (CCSBackend *, CCSContext *, CCSPlugin *, CCSSetting *); typedef Bool (*CCSBackendGetSettingIsIntegratedFunc) (CCSBackend *, CCSSetting * setting); typedef Bool (*CCSBackendGetSettingIsReadOnlyFunc) (CCSBackend *, CCSSetting * setting); typedef CCSStringList (*CCSBackendGetExistingProfilesFunc) (CCSBackend *, CCSContext * context); typedef Bool (*CCSBackendDeleteProfileFunc) (CCSBackend *, CCSContext * context, char * name); typedef void (*CCSBackendSetIntegration) (CCSBackend *, CCSIntegration *); typedef const CCSBackendInfo * (*CCSBackendGetInfoFunc) (CCSBackend *); struct _CCSBackendInterface { CCSBackendGetInfoFunc backendGetInfo; /* something like a event loop call for the backend, so it can check for file changes (gconf changes in the gconf backend) no need for reload settings signals anymore */ CCSBackendExecuteEventsFunc executeEvents; CCSBackendInitFunc backendInit; CCSBackendFiniFunc backendFini; CCSBackendReadInitFunc readInit; CCSBackendReadSettingFunc readSetting; CCSBackendReadDoneFunc readDone; CCSBackendWriteInitFunc writeInit; CCSBackendWriteSettingFunc writeSetting; CCSBackendWriteDoneFunc writeDone; CCSBackendUpdateFunc updateSetting; CCSBackendGetSettingIsIntegratedFunc getSettingIsIntegrated; CCSBackendGetSettingIsReadOnlyFunc getSettingIsReadOnly; CCSBackendGetExistingProfilesFunc getExistingProfiles; CCSBackendDeleteProfileFunc deleteProfile; CCSBackendSetIntegration setIntegration; }; unsigned int ccsCCSBackendInterfaceGetType (); /** * @brief ccsBackendGetInfo * @param backend a CCSBackend * * @return a const CCSBackendInfo * for this backend * * This function returns some basic info about this backend, what its * name is, what it suppoirts etc */ const CCSBackendInfo * ccsBackendGetInfo (CCSBackend *backend); /** * @brief ccsBackendExecuteEvents * @param backend a CCSBackend * * @param flags ProcessEventsGlibMainLoopMask or 0 * * something like a event loop call for the backend, * so it can check for file changes (gconf changes in the gconf backend) */ void ccsBackendExecuteEvents (CCSBackend *backend, unsigned int flags); /** * @brief ccsBackendInit * @param backend * @param context * @return * * Initializes a backend for a context */ Bool ccsBackendInit (CCSBackend *backend, CCSContext *context); /** * @brief ccsBackendFini * @param backend * @param context * @return * * Cleans up the backend */ Bool ccsBackendFini (CCSBackend *backend); Bool ccsBackendReadInit (CCSBackend *backend, CCSContext *context); void ccsBackendReadSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting); void ccsBackendReadDone (CCSBackend *backend, CCSContext *context); Bool ccsBackendWriteInit (CCSBackend *backend, CCSContext *context); void ccsBackendWriteSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting); void ccsBackendWriteDone (CCSBackend *backend, CCSContext *context); /** * @brief ccsBackendUpdateSetting * @param backend The backend on which the update should be processed * @param context The context on which the backend resides. * @param plugin The plugin for the setting * @param setting The setting itself. * * This causes the specified setting to be re-read from the configuration * database and re-written to any integrated keys. It should genrally * be called by calback functions which know that the value * has changed. */ void ccsBackendUpdateSetting (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting); Bool ccsBackendGetSettingIsIntegrated (CCSBackend *backend, CCSSetting *setting); Bool ccsBackendGetSettingIsReadOnly (CCSBackend *backend, CCSSetting *setting); /** * @brief ccsBackendGetExistingProfiles * @param backend * @param context * @return a CCSStringist of available profiles for this backend */ CCSStringList ccsBackendGetExistingProfiles (CCSBackend *backend, CCSContext *context); Bool ccsBackendDeleteProfile (CCSBackend *backend, CCSContext *context, char *name); void ccsBackendSetIntegration (CCSBackend *backend, CCSIntegration *integration); void ccsFreeBackend (CCSBackend *backend); typedef struct _CCSDynamicBackendInterface CCSDynamicBackendInterface; /** * @brief The _CCSDynamicBackend struct * * This object represents a CCSBackend loaded in memory as a dlopen * object. It implements the CCSBackend interface and provides an * interface of its own for managing the dynamic backend and checking * its capabilities. * * All function pointers are fully implemented and are safe to call */ struct _CCSDynamicBackend { CCSObject object; }; typedef const char * (*CCSDynamicBackendGetBackendName) (CCSDynamicBackend *); typedef Bool (*CCSDynamicBackendSupportsRead) (CCSDynamicBackend *); typedef Bool (*CCSDynamicBackendSupportsWrite) (CCSDynamicBackend *); typedef Bool (*CCSDynamicBackendSupportsProfiles) (CCSDynamicBackend *); typedef Bool (*CCSDynamicBackendSupportsIntegration) (CCSDynamicBackend *); typedef CCSBackend * (*CCSDynamicBackendGetRawBackend) (CCSDynamicBackend *); struct _CCSDynamicBackendInterface { CCSDynamicBackendGetBackendName getBackendName; CCSDynamicBackendSupportsRead supportsRead; CCSDynamicBackendSupportsWrite supportsWrite; CCSDynamicBackendSupportsProfiles supportsProfiles; CCSDynamicBackendSupportsIntegration supportsIntegration; CCSDynamicBackendGetRawBackend getRawBackend; }; const char * ccsDynamicBackendGetBackendName (CCSDynamicBackend *); Bool ccsDynamicBackendSupportsRead (CCSDynamicBackend *); Bool ccsDynamicBackendSupportsWrite (CCSDynamicBackend *); Bool ccsDynamicBackendSupportsProfiles (CCSDynamicBackend *); Bool ccsDynamicBackendSupportsIntegration (CCSDynamicBackend *); CCSBackend * ccsDynamicBackendGetRawBackend (CCSDynamicBackend *); unsigned int ccsCCSDynamicBackendInterfaceGetType (); void ccsFreeDynamicBackend (CCSDynamicBackend *); /** * @brief ccsBackendNewWithDynamicInterface * @param context * @param interface * @param dlhand * @return * * Creates a new CCSBackend for a CCSBackendInterface and dlopen handle * dlhand */ CCSBackend * ccsBackendNewWithDynamicInterface (CCSContext *context, const CCSBackendInterface *interface); CCSBackendInterface* getBackendInfo (void); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/include/ccs.h0000644000015301777760000012571412321343002025715 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _CSS_H #define _CSS_H #include /* for NULL */ #include #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS #ifndef CCS_LOG_DOMAIN #define CCS_LOG_DOMAIN NULL #endif #ifdef __GNUC__ #define ccsDebug(fmt, args...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogDebug, fmt, ##args) #define ccsInfo(fmt, args...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogInfo, fmt, ##args) #define ccsWarning(fmt, args...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogWarning, fmt, ##args) #define ccsError(fmt, args...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogError, fmt, ##args) #elif __STDC_VERSION__ >= 199901L #define ccsDebug(fmt, ...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogDebug, fmt, __VA_ARGS__) #define ccsInfo(fmt, ...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogInfo, fmt, __VA_ARGS__) #define ccsWarning(fmt, ...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogWarning, fmt, __VA_ARGS__) #define ccsError(fmt, ...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogError, fmt, __VA_ARGS__) #endif typedef enum { ccsLogDebug, ccsLogInfo, ccsLogWarning, ccsLogError, _ccsLogLevels } CCSLogLevel; #define CCSLOGLEVEL_NAMES {"Debug", "Info", "Warning", "Error"} void ccsLog (const char *domain, CCSLogLevel level, const char *fmt, ...); typedef struct _CCSGroup CCSGroup; typedef struct _CCSSubGroup CCSSubGroup; typedef struct _CCSPluginCategory CCSPluginCategory; typedef struct _CCSPluginConflict CCSPluginConflict; typedef struct _CCSIntDesc CCSIntDesc; typedef struct _CCSStrRestriction CCSStrRestriction; typedef struct _CCSStrExtension CCSStrExtension; CCSLIST_HDR (Plugin, CCSPlugin) CCSLIST_HDR (Setting, CCSSetting) CCSLIST_HDR (Group, CCSGroup) CCSLIST_HDR (SubGroup, CCSSubGroup) CCSLIST_HDR (SettingValue, CCSSettingValue) CCSLIST_HDR (PluginConflict, CCSPluginConflict) CCSLIST_HDR (BackendInfo, CCSBackendInfo) CCSLIST_HDR (IntDesc, CCSIntDesc) CCSLIST_HDR (StrRestriction, CCSStrRestriction) CCSLIST_HDR (StrExtension, CCSStrExtension) CCSREF_HDR (Plugin, CCSPlugin) CCSREF_HDR (Setting, CCSSetting) CCSREF_HDR (String, CCSString) CCSREF_HDR (Backend, CCSBackend) CCSREF_HDR (DynamicBackend, CCSDynamicBackend) CCSREF_HDR (Group, CCSGroup) CCSREF_HDR (SubGroup, CCSSubGroup) CCSREF_HDR (SettingValue, CCSSettingValue) CCSREF_HDR (PluginConflict, CCSPluginConflict) CCSREF_HDR (BackendInfo, CCSBackendInfo) CCSREF_HDR (IntDesc, CCSIntDesc) CCSREF_HDR (StrRestriction, CCSStrRestriction) CCSREF_HDR (StrExtension, CCSStrExtension) typedef struct _CCSContextInterface CCSContextInterface; typedef struct _CCSPluginInterface CCSPluginInterface; typedef struct _CCSSettingInterface CCSSettingInterface; struct _CCSInterfaceTable { const CCSContextInterface *contextInterface; const CCSPluginInterface *pluginInterface; const CCSSettingInterface *settingInterface; const CCSBackendInterface *dynamicBackendWrapperInterface; const CCSDynamicBackendInterface *dynamicBackendInterface; }; extern const CCSInterfaceTable ccsDefaultInterfaceTable; /* CCSContext interface */ typedef CCSPluginList (*CCSContextGetPluginsProc) (CCSContext *context); typedef CCSPluginCategory * (*CCSContextGetCategories) (CCSContext *context); typedef CCSSettingList (*CCSContextGetChangedSettings) (CCSContext *context); typedef unsigned int (*CCSContextGetScreenNum) (CCSContext *context); typedef Bool (*CCSContextAddChangedSetting) (CCSContext *context, CCSSetting *setting); typedef Bool (*CCSContextClearChangedSettings) (CCSContext *context); typedef CCSSettingList (*CCSContextStealChangedSettings) (CCSContext *context); typedef void * (*CCSContextGetPrivatePtr) (CCSContext *context); typedef void (*CCSContextSetPrivatePtr) (CCSContext *context, void *ptr); typedef Bool (*CCSContextLoadPlugin) (CCSContext *context, char *name); typedef CCSPlugin * (*CCSContextFindPlugin) (CCSContext *context, const char *name); typedef Bool (*CCSContextPluginIsActive) (CCSContext *context, const char *name); typedef CCSPluginList (*CCSContextGetActivePluginList) (CCSContext *context); typedef CCSStringList (*CCSContextGetSortedPluginStringList) (CCSContext *context); typedef Bool (*CCSContextSetBackend) (CCSContext *context, char *name); typedef const char * (*CCSContextGetBackend) (CCSContext *context); typedef void (*CCSContextSetIntegrationEnabled) (CCSContext *context, Bool value); typedef void (*CCSContextSetProfile) (CCSContext *context, const char *name); typedef void (*CCSContextSetPluginListAutoSort) (CCSContext *context, Bool value); typedef const char * (*CCSContextGetProfile) (CCSContext *context); typedef Bool (*CCSContextGetIntegrationEnabled) (CCSContext *context); typedef Bool (*CCSContextGetPluginListAutoSort) (CCSContext *context); typedef void (*CCSContextProcessEvents) (CCSContext *context, unsigned int flags); typedef void (*CCSContextReadSettings) (CCSContext *context); typedef void (*CCSContextWriteSettings) (CCSContext *context); typedef void (*CCSContextWriteChangedSettings) (CCSContext *context); typedef Bool (*CCSContextExportToFile) (CCSContext *context, const char *fileName, Bool skipDefaults); typedef Bool (*CCSContextImportFromFile) (CCSContext *context, const char *fileName, Bool overwriteNonDefault); typedef CCSPluginConflictList (*CCSContextCanEnablePlugin) (CCSContext *context, CCSPlugin *plugin); typedef CCSPluginConflictList (*CCSContextCanDisablePlugin) (CCSContext *context, CCSPlugin *plugin); typedef CCSStringList (*CCSContextGetExistingProfiles) (CCSContext *context); typedef void (*CCSContextDeleteProfile) (CCSContext *context, char *name); typedef Bool (*CCSContextCheckForSettingsUpgrade) (CCSContext *context); typedef void (*CCSContextLoadPlugins) (CCSContext *context); typedef void (*CCSContextDestructor) (CCSContext *context); struct _CCSContextInterface { CCSContextGetPluginsProc contextGetPlugins; CCSContextGetCategories contextGetCategories; CCSContextGetChangedSettings contextGetChangedSettings; CCSContextGetScreenNum contextGetScreenNum; CCSContextAddChangedSetting contextAddChangedSetting; CCSContextClearChangedSettings contextClearChangedSettings; CCSContextStealChangedSettings contextStealChangedSettings; CCSContextGetPrivatePtr contextGetPrivatePtr; CCSContextSetPrivatePtr contextSetPrivatePtr; CCSContextLoadPlugin contextLoadPlugin; CCSContextFindPlugin contextFindPlugin; CCSContextPluginIsActive contextPluginIsActive; CCSContextGetActivePluginList contextGetActivePluginList; CCSContextGetSortedPluginStringList contextGetSortedPluginStringList; CCSContextSetBackend contextSetBackend; CCSContextGetBackend contextGetBackend; CCSContextSetIntegrationEnabled contextSetIntegrationEnabled; CCSContextSetProfile contextSetProfile; CCSContextSetPluginListAutoSort contextSetPluginListAutoSort; CCSContextGetProfile contextGetProfile; CCSContextGetIntegrationEnabled contextGetIntegrationEnabled; CCSContextGetPluginListAutoSort contextGetPluginListAutoSort; CCSContextProcessEvents contextProcessEvents; CCSContextReadSettings contextReadSettings; CCSContextWriteSettings contextWriteSettings; CCSContextWriteChangedSettings contextWriteChangedSettings; CCSContextExportToFile contextExportToFile; CCSContextImportFromFile contextImportFromFile; CCSContextCanEnablePlugin contextCanEnablePlugin; CCSContextCanDisablePlugin contextCanDisablePlugin; CCSContextGetExistingProfiles contextGetExistingProfiles; CCSContextDeleteProfile contextDeleteProfile; CCSContextCheckForSettingsUpgrade contextCheckForSettingsUpgrade; CCSContextLoadPlugins contextLoadPlugins; CCSContextDestructor contextDestructor; }; unsigned int ccsCCSContextInterfaceGetType (); /* CCSContext accessor functions */ CCSPluginList ccsContextGetPlugins (CCSContext *); CCSPluginCategory * ccsContextGetCategories (CCSContext *); CCSSettingList ccsContextGetChangedSettings (CCSContext *); unsigned int ccsContextGetScreenNum (CCSContext *); Bool ccsContextAddChangedSetting (CCSContext *context, CCSSetting *setting); Bool ccsContextClearChangedSettings (CCSContext *context); CCSSettingList ccsContextStealChangedSettings (CCSContext *context); void * ccsContextGetPrivatePtr (CCSContext *context); void ccsContextSetPrivatePtr (CCSContext *context, void *ptr); /* only for bindings */ void * ccsContextGetPluginsBindable (CCSContext *context); void * ccsContextStealChangedSettingsBindable (CCSContext *context); void * ccsContextGetChangedSettingsBindable (CCSContext *context); struct _CCSContext { CCSObject object; }; /* CCSPluginInterface */ typedef const char * (*CCSPluginGetName) (CCSPlugin *plugin); typedef const char * (*CCSPluginGetShortDesc) (CCSPlugin *plugin); typedef const char * (*CCSPluginGetLongDesc) (CCSPlugin *plugin); typedef const char * (*CCSPluginGetHints) (CCSPlugin *plugin); typedef const char * (*CCSPluginGetCategory) (CCSPlugin *plugin); typedef CCSStringList (*CCSPluginGetLoadAfter) (CCSPlugin *plugin); typedef CCSStringList (*CCSPluginGetLoadBefore) (CCSPlugin *plugin); typedef CCSStringList (*CCSPluginGetRequiresPlugins) (CCSPlugin *plugin); typedef CCSStringList (*CCSPluginGetConflictPlugins) (CCSPlugin *plugin); typedef CCSStringList (*CCSPluginGetProvidesFeatures) (CCSPlugin *plugin); typedef CCSStringList (*CCSPluginGetRequiresFeatures) (CCSPlugin *plugin); typedef void * (*CCSPluginGetPrivatePtr) (CCSPlugin *plugin); typedef void (*CCSPluginSetPrivatePtr) (CCSPlugin *plugin, void *); typedef CCSContext * (*CCSPluginGetContext) (CCSPlugin *plugin); typedef CCSSetting * (*CCSPluginFindSetting) (CCSPlugin *plugin, const char *name); typedef CCSSettingList (*CCSPluginGetPluginSettings) (CCSPlugin *plugin); typedef CCSGroupList (*CCSPluginGetPluginGroups) (CCSPlugin *plugin); typedef void (*CCSPluginReadPluginSettings) (CCSPlugin *plugin); typedef CCSStrExtensionList (*CCSPluginGetPluginStrExtensions) (CCSPlugin *plugin); typedef void (*CCSPluginDestructor) (CCSPlugin *plugin); unsigned int ccsCCSPluginInterfaceGetType (); struct _CCSPluginInterface { CCSPluginGetName pluginGetName; CCSPluginGetShortDesc pluginGetShortDesc; CCSPluginGetLongDesc pluginGetLongDesc; CCSPluginGetHints pluginGetHints; CCSPluginGetCategory pluginGetCategory; CCSPluginGetLoadAfter pluginGetLoadAfter; CCSPluginGetLoadBefore pluginGetLoadBefore; CCSPluginGetRequiresPlugins pluginGetRequiresPlugins; CCSPluginGetConflictPlugins pluginGetConflictPlugins; CCSPluginGetProvidesFeatures pluginGetProvidesFeatures; CCSPluginGetRequiresFeatures pluginGetRequiresFeatures; CCSPluginGetPrivatePtr pluginGetPrivatePtr; CCSPluginSetPrivatePtr pluginSetPrivatePtr; CCSPluginGetContext pluginGetContext; CCSPluginFindSetting pluginFindSetting; CCSPluginGetPluginSettings pluginGetPluginSettings; CCSPluginGetPluginGroups pluginGetPluginGroups; CCSPluginReadPluginSettings pluginReadPluginSettings; CCSPluginGetPluginStrExtensions pluginGetPluginStrExtensions; CCSPluginDestructor pluginDestructor; }; /* CCSPlugin accessor functions */ const char * ccsPluginGetName (CCSPlugin *plugin); const char * ccsPluginGetShortDesc (CCSPlugin *plugin); const char * ccsPluginGetLongDesc (CCSPlugin *plugin); const char * ccsPluginGetHints (CCSPlugin *plugin); const char * ccsPluginGetCategory (CCSPlugin *plugin); CCSStringList ccsPluginGetLoadAfter (CCSPlugin *plugin); CCSStringList ccsPluginGetLoadBefore (CCSPlugin *plugin); CCSStringList ccsPluginGetRequiresPlugins (CCSPlugin *plugin); CCSStringList ccsPluginGetConflictPlugins (CCSPlugin *plugin); CCSStringList ccsPluginGetProvidesFeatures (CCSPlugin *plugin); CCSStringList ccsPluginGetRequiresFeatures (CCSPlugin *plugin); void * ccsPluginGetPrivatePtr (CCSPlugin *plugin); void ccsPluginSetPrivatePtr (CCSPlugin *plugin, void *ptr); CCSContext * ccsPluginGetContext (CCSPlugin *plugin); void * ccsPluginGetProvidesFeaturesBindable (CCSPlugin *plugin); struct _CCSPlugin { CCSObject object; }; struct _CCSSubGroup { char *name; /* sub group name in current locale */ CCSSettingList settings; /* list of settings in this sub group */ unsigned int refCount; /* reference count */ }; struct _CCSGroup { char *name; /* group name in current locale */ CCSSubGroupList subGroups; /* list of sub groups in this group */ unsigned int refCount; /* reference count */ }; typedef enum _CCSPluginConflictType { /* produced on plugin activation */ ConflictRequiresPlugin, ConflictRequiresFeature, ConflictFeature, ConflictPlugin, /* produced on plugin deactivation */ ConflictFeatureNeeded, ConflictPluginNeeded, ConflictPluginError, } CCSPluginConflictType; struct _CCSPluginConflict { char * value; /* item (plugin / feature) name that caused the conflict */ CCSPluginConflictType type; /* type of the conflict */ CCSPluginList plugins; /* list of conflicting plugins */ unsigned int refCount; /* reference count */ }; union _CCSSettingInfo; struct _CCSIntDesc { int value; /* value the description is assigned to */ char *name; /* description */ unsigned int refCount; /* reference count */ }; struct _CCSStrRestriction { char *value; /* value the restriction is assigned to */ char *name; /* description */ unsigned int refCount; /* reference count */ }; struct _CCSStrExtension { char *basePlugin; /* plugin this extension extends */ CCSStringList baseSettings; /* list of settings this extension extends */ CCSStrRestrictionList restriction; /* list of added restriction items */ unsigned int refCount; /* reference count */ }; typedef struct _CCSSettingIntInfo { int min; /* minimum value for this setting */ int max; /* maximum value */ CCSIntDescList desc; /* list of item descriptions */ } CCSSettingIntInfo; typedef struct _CCSSettingFloatInfo { float min; /* minimum value for this setting */ float max; /* maximum value */ float precision; /* precision (allowed increment) */ } CCSSettingFloatInfo; typedef struct _CCSSettingStringInfo { CCSStrRestrictionList restriction; /* list of restriction items */ int sortStartsAt; /* the restriction index to start sorting at (defaults to -1 for no sorting) */ Bool extensible; /* whether extension is allowed for this setting */ } CCSSettingStringInfo; typedef struct _CCSSettingListInfo { CCSSettingType listType; /* type of setting this list contains */ union _CCSSettingInfo *listInfo; /* list of settings */ } CCSSettingListInfo; typedef struct _CCSSettingActionInfo { Bool internal; /* is this binding global or plugin internal*/ } CCSSettingActionInfo; typedef union _CCSSettingInfo { CCSSettingIntInfo forInt; CCSSettingFloatInfo forFloat; CCSSettingStringInfo forString; CCSSettingListInfo forList; CCSSettingActionInfo forAction; } CCSSettingInfo; typedef struct _CCSSettingColorValueColor { unsigned short red; unsigned short green; unsigned short blue; unsigned short alpha; } CCSSettingColorValueColor; typedef struct _CCSSettingColorValueArray { unsigned short array[4]; } CCSSettingColorValueArray; typedef union _CCSSettingColorValue { CCSSettingColorValueColor color; CCSSettingColorValueArray array; } CCSSettingColorValue; typedef struct _CCSSettingKeyValue { int keysym; unsigned int keyModMask; } CCSSettingKeyValue; typedef struct _CCSSettingButtonValue { int button; unsigned int buttonModMask; unsigned int edgeMask; } CCSSettingButtonValue; typedef union _CCSSettingValueUnion { Bool asBool; int asInt; float asFloat; char * asString; char * asMatch; CCSSettingColorValue asColor; CCSSettingValueList asList; CCSSettingKeyValue asKey; CCSSettingButtonValue asButton; unsigned int asEdge; Bool asBell; } CCSSettingValueUnion; struct _CCSSettingValue { CCSSettingValueUnion value; CCSSetting * parent; Bool isListChild; unsigned int refCount; /* reference count */ }; /* Interface for CCSSetting */ const char * ccsSettingGetName (CCSSetting *setting); const char * ccsSettingGetShortDesc (CCSSetting *setting); const char * ccsSettingGetLongDesc (CCSSetting *setting); CCSSettingType ccsSettingGetType (CCSSetting *setting); CCSSettingInfo * ccsSettingGetInfo (CCSSetting *setting); const char * ccsSettingGetGroup (CCSSetting *setting); const char * ccsSettingGetSubGroup (CCSSetting *setting); const char * ccsSettingGetHints (CCSSetting *setting); CCSSettingValue * ccsSettingGetDefaultValue (CCSSetting *setting); CCSSettingValue *ccsSettingGetValue (CCSSetting *setting); Bool ccsSettingGetIsDefault (CCSSetting *setting); CCSPlugin * ccsSettingGetParent (CCSSetting *setting); void * ccsSettingGetPrivatePtr (CCSSetting *setting); void ccsSettingSetPrivatePtr (CCSSetting *setting, void *ptr); /* Setting getters. Returns TRUE if the setting value was successfully copied into , FALSE otherwise. */ Bool ccsGetInt (CCSSetting *setting, int *data); Bool ccsGetFloat (CCSSetting *setting, float *data); Bool ccsGetBool (CCSSetting *setting, Bool *data); Bool ccsGetString (CCSSetting *setting, const char **data); Bool ccsGetColor (CCSSetting *setting, CCSSettingColorValue *data); Bool ccsGetMatch (CCSSetting *setting, const char **data); Bool ccsGetKey (CCSSetting *setting, CCSSettingKeyValue *data); Bool ccsGetButton (CCSSetting *setting, CCSSettingButtonValue *data); Bool ccsGetEdge (CCSSetting *setting, unsigned int *data); Bool ccsGetBell (CCSSetting *setting, Bool *data); Bool ccsGetList (CCSSetting *setting, CCSSettingValueList *data); typedef enum _CCSSetStatus { SetFailed = -1, SetToDefault = 1, SetIsDefault = 2, SetToSameValue = 3, SetToNewValue = 4 } CCSSetStatus; /* Setting setters. Set to value . Return TRUE if new value matches data. If the new value doesn't match the old value, the setting is added to the context's changedSettings list. */ CCSSetStatus ccsSetInt (CCSSetting *setting, int data, Bool processChanged); CCSSetStatus ccsSetFloat (CCSSetting *setting, float data, Bool processChanged); CCSSetStatus ccsSetBool (CCSSetting *setting, Bool data, Bool processChanged); CCSSetStatus ccsSetString (CCSSetting *setting, const char *data, Bool processChanged); CCSSetStatus ccsSetColor (CCSSetting *setting, CCSSettingColorValue data, Bool processChanged); CCSSetStatus ccsSetMatch (CCSSetting *setting, const char *data, Bool processChanged); CCSSetStatus ccsSetKey (CCSSetting *setting, CCSSettingKeyValue data, Bool processChanged); CCSSetStatus ccsSetButton (CCSSetting *setting, CCSSettingButtonValue data, Bool processChanged); CCSSetStatus ccsSetEdge (CCSSetting *setting, unsigned int data, Bool processChanged); CCSSetStatus ccsSetBell (CCSSetting *setting, Bool data, Bool processChanged); CCSSetStatus ccsSetList (CCSSetting *setting, CCSSettingValueList data, Bool processChanged); CCSSetStatus ccsSetValue (CCSSetting *setting, CCSSettingValue *data, Bool processChanged); /* Reset all settings to defaults. Settings that were non-default previously are added to the changedSettings list of the context. */ void ccsResetToDefault (CCSSetting * setting, Bool processChanged); /* Checks if a given setting is integrated in the desktop environment. */ Bool ccsSettingIsIntegrated (CCSSetting *setting); /* Checks if a given setting is read-only. */ Bool ccsSettingIsReadOnly (CCSSetting *setting); /* Checks if a setting is readable by backends */ Bool ccsSettingIsReadableByBackend (CCSSetting *setting); typedef const char * (*CCSSettingGetName) (CCSSetting *); typedef const char * (*CCSSettingGetShortDesc) (CCSSetting *); typedef const char * (*CCSSettingGetLongDesc) (CCSSetting *); typedef CCSSettingType (*CCSSettingGetType) (CCSSetting *); typedef CCSSettingInfo * (*CCSSettingGetInfo) (CCSSetting *); typedef const char * (*CCSSettingGetGroup) (CCSSetting *); typedef const char * (*CCSSettingGetSubGroup) (CCSSetting *); typedef const char * (*CCSSettingGetHints) (CCSSetting *); typedef CCSSettingValue * (*CCSSettingGetDefaultValue) (CCSSetting *setting); typedef CCSSettingValue * (*CCSSettingGetValue) (CCSSetting *setting); typedef Bool (*CCSSettingGetIsDefault) (CCSSetting *); typedef CCSPlugin * (*CCSSettingGetParent) (CCSSetting *); typedef void * (*CCSSettingGetPrivatePtr) (CCSSetting *); typedef void (*CCSSettingSetPrivatePtr) (CCSSetting *, void *); typedef CCSSetStatus (*CCSSettingSetInt) (CCSSetting *setting, int data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetFloat) (CCSSetting *setting, float data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetBool) (CCSSetting *setting, Bool data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetString) (CCSSetting *setting, const char * data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetColor) (CCSSetting *setting, CCSSettingColorValue data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetMatch) (CCSSetting *setting, const char * data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetKey) (CCSSetting *setting, CCSSettingKeyValue data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetButton) (CCSSetting *setting, CCSSettingButtonValue data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetEdge) (CCSSetting *setting, unsigned int data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetBell) (CCSSetting *setting, Bool data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetList) (CCSSetting *setting, CCSSettingValueList data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetValue) (CCSSetting *setting, CCSSettingValue *data, Bool processChanged); typedef Bool (*CCSSettingGetInt) (CCSSetting *setting, int *data); typedef Bool (*CCSSettingGetFloat) (CCSSetting *setting, float *data); typedef Bool (*CCSSettingGetBool) (CCSSetting *setting, Bool *data); typedef Bool (*CCSSettingGetString) (CCSSetting *setting, const char **data); typedef Bool (*CCSSettingGetColor) (CCSSetting *setting, CCSSettingColorValue *data); typedef Bool (*CCSSettingGetMatch) (CCSSetting *setting, const char **data); typedef Bool (*CCSSettingGetKey) (CCSSetting *setting, CCSSettingKeyValue *data); typedef Bool (*CCSSettingGetButton) (CCSSetting *setting, CCSSettingButtonValue *data); typedef Bool (*CCSSettingGetEdge) (CCSSetting *setting, unsigned int *data); typedef Bool (*CCSSettingGetBell) (CCSSetting *setting, Bool *data); typedef Bool (*CCSSettingGetList) (CCSSetting *setting, CCSSettingValueList *data); typedef void (*CCSSettingResetToDefault) (CCSSetting *setting, Bool processChanged); typedef Bool (*CCSSettingIsIntegrated) (CCSSetting *setting); typedef Bool (*CCSSettingIsReadOnly) (CCSSetting *setting); typedef Bool (*CCSSettingIsReadableByBackend) (CCSSetting *setting); typedef void (*CCSSettingDestructor) (CCSSetting *setting); unsigned int ccsCCSSettingInterfaceGetType (); struct _CCSSettingInterface { CCSSettingGetName settingGetName; CCSSettingGetShortDesc settingGetShortDesc; CCSSettingGetLongDesc settingGetLongDesc; CCSSettingGetType settingGetType; CCSSettingGetInfo settingGetInfo; CCSSettingGetGroup settingGetGroup; CCSSettingGetSubGroup settingGetSubGroup; CCSSettingGetHints settingGetHints; CCSSettingGetDefaultValue settingGetDefaultValue; CCSSettingGetValue settingGetValue; CCSSettingGetIsDefault settingGetIsDefault; CCSSettingGetParent settingGetParent; CCSSettingGetPrivatePtr settingGetPrivatePtr; CCSSettingSetPrivatePtr settingSetPrivatePtr; CCSSettingSetInt settingSetInt; CCSSettingSetFloat settingSetFloat; CCSSettingSetBool settingSetBool; CCSSettingSetString settingSetString; CCSSettingSetColor settingSetColor; CCSSettingSetMatch settingSetMatch; CCSSettingSetKey settingSetKey; CCSSettingSetButton settingSetButton; CCSSettingSetEdge settingSetEdge; CCSSettingSetBell settingSetBell; CCSSettingSetList settingSetList; CCSSettingSetValue settingSetValue; CCSSettingGetInt settingGetInt; CCSSettingGetFloat settingGetFloat; CCSSettingGetBool settingGetBool; CCSSettingGetString settingGetString; CCSSettingGetColor settingGetColor; CCSSettingGetMatch settingGetMatch; CCSSettingGetKey settingGetKey; CCSSettingGetButton settingGetButton; CCSSettingGetEdge settingGetEdge; CCSSettingGetBell settingGetBell; CCSSettingGetList settingGetList; CCSSettingResetToDefault settingResetToDefault; CCSSettingIsIntegrated settingIsIntegrated; CCSSettingIsReadOnly settingIsReadOnly; CCSSettingIsReadableByBackend settingIsReadableByBackend; CCSSettingDestructor settingDestructor; }; struct _CCSSetting { CCSObject object; }; typedef void (*CCSSettingDefaultValueInitializerFunc) (CCSSettingType type, CCSSettingInfo *info, CCSSettingValue *value, void *data); typedef void (*CCSSettingInfoInitializerFunc) (CCSSettingType type, CCSSettingInfo *info, void *data); CCSSetting * ccsSettingDefaultImplNew (CCSPlugin *plugin, const char *name, CCSSettingType type, const char *shortDesc, const char *longDesc, const char *hints, const char *group, const char *subGroup, CCSSettingDefaultValueInitializerFunc valueInit, void *valueInitData, CCSSettingInfoInitializerFunc infoInit, void *infoInitData, CCSObjectAllocationInterface *ai, const CCSInterfaceTable *interfaces); struct _CCSPluginCategory { const char *name; /* plugin category name */ const char *shortDesc; /* plugin category short description */ const char *longDesc; /* plugin category long description */ CCSStringList plugins; /* list of plugins in this category */ unsigned int refCount; /* reference count */ }; /* set basic metadata to TRUE and no additional metadata informations will be parsed */ void ccsSetBasicMetadata (Bool value); /* Creates a new context for the given screen. All plugin settings are automatically enumerated. */ CCSContext* ccsContextNew (unsigned int screenNum, const CCSInterfaceTable *); /* Function pointers for the input/export functions. Usually you * should just provide ccsImportFromFile and ccsExportToFile * * TODO: Using this as a crutch to isolate testing is not great * we should really replace it with a real separate class in future * but that is a lot of work and not really worth it for our purposes */ typedef CCSStringList (*CCSScanForProfilesProc) (const char *directory); /* Creates a new context without auto-enumerating any plugin or setting. Behaves otherwise exactly like ccsContextNew. */ CCSContext* ccsEmptyContextNew (unsigned int screenNum, CCSContextImportFromFile importFromFile, CCSScanForProfilesProc scanForProfiles, CCSBackendLoader *loader, CCSConfigFile *config, const CCSInterfaceTable *); /* Destroys the allocated context. */ void ccsContextDestroy (CCSContext * context); /* Load the plugin and setting metadata for a given plugin. Returns TRUE on success, FALSE otherwise. */ Bool ccsLoadPlugin (CCSContext *context, char *name); /* Searches for a plugin identified by its name in the context. Returns the plugin struct if it could be found, NULL otherwise. */ CCSPlugin* ccsFindPlugin (CCSContext *context, const char *name); /* Searches for a setting in a plugin. Returns the setting struct if the search was successful (setting with name found), NULL otherwise. */ CCSSetting* ccsFindSetting (CCSPlugin *plugin, const char *name); /* Returns TRUE if the named plugin is in the context and marked as currently active in Compiz, FALSE otherwise. */ Bool ccsPluginIsActive(CCSContext *context, const char *name); void ccsFreeContext (CCSContext *context); void ccsFreePlugin (CCSPlugin *plugin); void ccsFreeSetting (CCSSetting *setting); void ccsFreeGroup (CCSGroup *group); void ccsFreeSubGroup (CCSSubGroup *subGroup); void ccsCleanupSettingInfo (CCSSettingInfo *info, CCSSettingType type); void ccsFreeSettingValue (CCSSettingValue *value); void ccsFreeSettingValueWithType (CCSSettingValue *v, CCSSettingType type); void ccsFreePluginConflict (CCSPluginConflict *value); void ccsFreeBackendInfo (CCSBackendInfo *value); void ccsFreeIntDesc (CCSIntDesc *value); void ccsFreeStrRestriction (CCSStrRestriction *restriction); void ccsFreeStrExtension (CCSStrExtension *extension); /* Compares two setting values. Returns TRUE if values match, FALSE otherwise. */ Bool ccsIsEqualColor (CCSSettingColorValue c1, CCSSettingColorValue c2); Bool ccsIsEqualKey (CCSSettingKeyValue c1, CCSSettingKeyValue c2); Bool ccsIsEqualButton (CCSSettingButtonValue c1, CCSSettingButtonValue c2); /* Compares lists */ Bool ccsCompareLists (CCSSettingValueList l1, CCSSettingValueList l2, CCSSettingListInfo info); /* Retrieves a list of settings in a plugin */ CCSSettingList ccsGetPluginSettings (CCSPlugin *plugin); /* Retrieves a list of setting groups in a plugin */ CCSGroupList ccsGetPluginGroups (CCSPlugin *plugin); /* Converts a string list into a list of string settings. Return value needs to be freed by the caller. */ CCSSettingValueList ccsGetValueListFromStringList (CCSStringList list, CCSSetting *parent); /* Converts a string setting value list into a string list. Return value needs to be freed by the caller. */ CCSStringList ccsGetStringListFromValueList (CCSSettingValueList list); /* Converts a string list into a string array. If the return value is not NULL, the item count is copied into . Return value needs to be freed by the caller. */ char** ccsGetStringArrayFromList (CCSStringList list, int *num); /* Converts a string array with items into a string list. Return value needs to be freed by the caller. */ CCSStringList ccsGetListFromStringArray (char **array, int num); /* Converts a setting value list into an array of the setting item data type. Behaves similar to ccsGetStringArrayFromList. */ char** ccsGetStringArrayFromValueList (CCSSettingValueList list, int *num); char** ccsGetMatchArrayFromValueList (CCSSettingValueList list, int *num); int* ccsGetIntArrayFromValueList (CCSSettingValueList list, int *num); float* ccsGetFloatArrayFromValueList (CCSSettingValueList list, int *num); Bool * ccsGetBoolArrayFromValueList (CCSSettingValueList list, int *num); CCSSettingColorValue* ccsGetColorArrayFromValueList (CCSSettingValueList list, int *num); /* Deep copies value lists */ CCSSettingValueList ccsCopyList (CCSSettingValueList l1, CCSSetting * setting); /* Deep copy setting value */ CCSSettingValue * ccsCopyValue (const CCSSettingValue *orig, CCSSettingType type, CCSSettingInfo *info); Bool ccsCopyValueInto (const CCSSettingValue *from, CCSSettingValue *to, CCSSettingType type, CCSSettingInfo *info); /* Deep copy setting info */ void ccsCopyInfo (const CCSSettingInfo *from, CCSSettingInfo *to, CCSSettingType type); /* Converts an array of data items to a setting value list. Behaves similar to ccsGetListFromStringArray */ CCSSettingValueList ccsGetValueListFromStringArray (const char **array, int num, CCSSetting *parent); CCSSettingValueList ccsGetValueListFromMatchArray (const char **array, int num, CCSSetting *parent); CCSSettingValueList ccsGetValueListFromIntArray (int *array, int num, CCSSetting *parent); CCSSettingValueList ccsGetValueListFromFloatArray (float *array, int num, CCSSetting *parent); CCSSettingValueList ccsGetValueListFromBoolArray (Bool *array, int num, CCSSetting *parent); CCSSettingValueList ccsGetValueListFromColorArray (CCSSettingColorValue *array, int num, CCSSetting *parent); /* Retrieves a list of plugins marked as active in Compiz for this context */ CCSPluginList ccsGetActivePluginList (CCSContext *context); /* Retrieves a list of plugin names which are active in Compiz for a given context, sorted as needed according to load after/before/etc. rules */ CCSStringList ccsGetSortedPluginStringList (CCSContext *context); /* Switches the backend for a context. Returns TRUE on successful switch, FALSE otherwise. */ Bool ccsSetBackend (CCSContext *context, char *name); /* Retrieves the name of the backend active for the context. */ const char * ccsGetBackend (CCSContext *context); /* Enable/disable DE integration for a context. */ void ccsSetIntegrationEnabled (CCSContext *context, Bool value); /* Sets the profile for a context. */ void ccsSetProfile (CCSContext *context, const char *name); /* Set plugin list autosort for a context. */ void ccsSetPluginListAutoSort (CCSContext *context, Bool value); /* Retrieve current profile of the context. */ const char * ccsGetProfile (CCSContext *context); /* Retrieves current DE integration status for a context */ Bool ccsGetIntegrationEnabled (CCSContext *context); /* Retrieves the autosort setting for a context. */ Bool ccsGetPluginListAutoSort (CCSContext *context); /* Changes the plugin activeness status in compiz. If plugin list autosort is enabled, automatically writes a new sorted plugin list to the active_plugins setting. If autosort is disabled, it's up to the caller to do that. */ Bool ccsPluginSetActive (CCSPlugin *plugin, Bool value); /* functions parsing/creating an action string - the returned strings must be free'd after usage! */ char * ccsModifiersToString (unsigned int modMask); char * ccsEdgesToString (unsigned int edge); char * ccsEdgesToModString (unsigned int edge); char * ccsKeyBindingToString (CCSSettingKeyValue *key); char * ccsButtonBindingToString (CCSSettingButtonValue *button); char * ccsColorToString (CCSSettingColorValue *color); unsigned int ccsStringToModifiers (const char *binding); unsigned int ccsStringToEdges (const char *edge); unsigned int ccsModStringToEdges (const char *edge); Bool ccsStringToKeyBinding (const char *binding, CCSSettingKeyValue *key); Bool ccsStringToButtonBinding (const char *binding, CCSSettingButtonValue *button); Bool ccsStringToColor (const char *value, CCSSettingColorValue *color); /* flag values for ccsProcessEvents */ #define ProcessEventsNoGlibMainLoopMask (1 << 0) void ccsProcessEvents (CCSContext *context, unsigned int flags); /* Read all setting values from disk */ void ccsReadSettings (CCSContext *context); /* Read setting values for a given plugin */ void ccsReadPluginSettings (CCSPlugin *plugin); /* Write all settings to disk */ void ccsWriteSettings (CCSContext *context); /* Write changed settings to disk */ void ccsWriteChangedSettings (CCSContext *context); /* Exports a profile to a file. If skipDefaults is TRUE, only exports non-default settings. Returns TRUE on successful export, FALSE otherwise. */ Bool ccsExportToFile (CCSContext *context, const char *fileName, Bool skipDefaults); /* Imports a profile from a file. If overwriteNonDefault is TRUE, also overwrites settings that were non-default before. Returns TRUE on success, FALSE otherwise. */ Bool ccsImportFromFile (CCSContext *context, const char *fileName, Bool overwriteNonDefault); /* File watch stuff */ typedef void (*FileWatchCallbackProc) (unsigned int watchId, void *closure); unsigned int ccsAddFileWatch (const char *fileName, Bool enable, FileWatchCallbackProc callback, void *closure); void ccsRemoveFileWatch (unsigned int watchId); void ccsDisableFileWatch (unsigned int watchId); void ccsEnableFileWatch (unsigned int watchId); /* INI file stuff * FIXME: This should not be part of the * public API */ typedef struct _dictionary_ { /** Number of entries in dictionary */ int n; /** Storage size */ int size; /** List of string values */ char **val; /** List of string keys */ char **key ; /** List of hash values for keys */ unsigned *hash; } IniDictionary; IniDictionary* ccsIniNew (void); IniDictionary* ccsIniOpen (const char *fileName); void ccsIniClose (IniDictionary *dictionary); void ccsIniSave (IniDictionary *dictionary, const char *fileName); Bool ccsCreateDirFor (const char *fileName); Bool ccsIniParseString (char *str, char **value); Bool ccsIniGetString (IniDictionary *dictionary, const char *section, const char *entry, char **value); Bool ccsIniParseInt (const char *str, int *value); Bool ccsIniGetInt (IniDictionary *dictionary, const char *section, const char *entry, int *value); Bool ccsIniParseFloat (const char *str, float *value); Bool ccsIniGetFloat (IniDictionary *dictionary, const char *section, const char *entry, float *value); Bool ccsIniParseBool (const char *str, Bool *value); Bool ccsIniGetBool (IniDictionary *dictionary, const char *section, const char *entry, Bool *value); Bool ccsIniParseColor (const char *str, CCSSettingColorValue *value); Bool ccsIniGetColor (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingColorValue *value); Bool ccsIniParseKey (const char *str, CCSSettingKeyValue *value); Bool ccsIniGetKey (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingKeyValue *value); Bool ccsIniParseButton (const char *str, CCSSettingButtonValue *value); Bool ccsIniGetButton (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingButtonValue *value); Bool ccsIniParseEdge (const char *str, unsigned int *value); Bool ccsIniGetEdge (IniDictionary *dictionary, const char *section, const char *entry, unsigned int *value); Bool ccsIniGetBell (IniDictionary *dictionary, const char *section, const char *entry, Bool *value); Bool ccsIniParseList (const char *str, CCSSettingValueList *value, CCSSetting *parent); Bool ccsIniGetList (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingValueList *value, CCSSetting *parent); void ccsIniSetString (IniDictionary *dictionary, const char *section, const char *entry, const char *value); void ccsIniSetInt (IniDictionary *dictionary, const char *section, const char *entry, int value); void ccsIniSetFloat (IniDictionary *dictionary, const char *section, const char *entry, float value); void ccsIniSetBool (IniDictionary *dictionary, const char *section, const char *entry, Bool value); void ccsIniSetColor (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingColorValue value); void ccsIniSetKey (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingKeyValue value); void ccsIniSetButton (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingButtonValue value); void ccsIniSetEdge (IniDictionary *dictionary, const char *section, const char *entry, unsigned int value); void ccsIniSetBell (IniDictionary *dictionary, const char *section, const char *entry, Bool value); void ccsIniSetList (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingValueList value, CCSSettingType listType); void ccsIniRemoveEntry (IniDictionary *dictionary, const char *section, const char *entry); /* Checks if a plugin can be enabled. Returns a list of conflicts that would occur when loading the plugin. A return value of NULL means that the plugin can be enabled without problems. */ CCSPluginConflictList ccsCanEnablePlugin (CCSContext *context, CCSPlugin *plugin); /* Checks if a plugin can be disabled. The meaning of the return value is the same as for ccsCanEnablePlugin */ CCSPluginConflictList ccsCanDisablePlugin (CCSContext *context, CCSPlugin *plugin); /* Enumerates the available profiles for the current backend. */ CCSStringList ccsGetExistingProfiles (CCSContext * context); /* Deletes the profile with the given name. */ void ccsDeleteProfile (CCSContext *context, char *name); /* Copies backend info out from backend */ CCSBackendInfo * ccsCopyBackendInfoFromBackend (CCSBackend *backend, const CCSBackendInterface *backendInterface); /* Enumerates the available backends. */ CCSBackendInfoList ccsGetExistingBackends (CCSContext *); CCSStrExtensionList ccsGetPluginStrExtensions (CCSPlugin *plugin); Bool ccsCheckValueEq (const CCSSettingValue *rhs, CCSSettingType rhsType, CCSSettingInfo *rhsInfo, const CCSSettingValue *lhs, CCSSettingType lhsType, CCSSettingInfo *lhsInfo); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/include/ccs-defs.h0000644000015301777760000000440312321343002026623 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _CCS_DEFS_H #define _CCS_DEFS_H #include /* for NULL */ #ifdef __cplusplus # define COMPIZCONFIG_BEGIN_DECLS extern "C" { # define COMPIZCONFIG_END_DECLS } #else # define COMPIZCONFIG_BEGIN_DECLS # define COMPIZCONFIG_END_DECLS #endif COMPIZCONFIG_BEGIN_DECLS #ifndef Bool #define Bool int #endif #ifndef TRUE #define TRUE ~0 #endif #ifndef FALSE #define FALSE 0 #endif /** * reference counting * * ccsSettingRef * References the settings object so it can be kept in a list and * unreferenced later with freeObj (mixed with objects that need * to be freed and need not be freed) * * ccsSettingUnref * Unreferences the settings object, when the reference count reaches * zero, the object is freed * */ #define CCSREF_HDR(type,dtype) \ void ccs##type##Ref (dtype *); \ void ccs##type##Unref (dtype *); #define CCSREF_OBJ(type,dtype) \ void ccs##type##Ref (dtype *d) \ { \ ccsObjectRef (d); \ } \ \ void ccs##type##Unref (dtype *d) \ { \ ccsObjectUnref (d, ccsFree##type); \ } \ #define CCSREF(type,dtype) \ void ccs##type##Ref (dtype *d) \ { \ ++d->refCount; \ } \ void ccs##type##Unref (dtype *d) \ { \ --d->refCount; \ if (d->refCount == 0) \ ccsFree##type (d); \ } \ #define GET_PRIVATE(Private, obj) \ (Private *) ccsObjectGetPrivate (obj); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/include/CMakeLists.txt0000644000015301777760000000034212321343002027521 0ustar pbusernogroup00000000000000set (_headers ccs-backend.h ccs-defs.h ccs-fwd.h ccs-list.h ccs-object.h ccs-string.h ccs-setting-types.h ccs.h ) install ( FILES ${_headers} DESTINATION ${libcompizconfig_includedir} ) compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/include/ccs-fwd.h0000644000015301777760000000426512321343002026470 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #ifndef _CSS_FWD_H #define _CSS_FWD_H COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSObject CCSObject; typedef struct _CCSObjectAllocationInterface CCSObjectAllocationInterface; typedef struct _CCSSetting CCSSetting; typedef struct _CCSPlugin CCSPlugin; typedef struct _CCSContext CCSContext; typedef struct _CCSBackend CCSBackend; typedef struct _CCSBackendInfo CCSBackendInfo; typedef struct _CCSBackendInterface CCSBackendInterface; typedef struct _CCSBackendLoader CCSBackendLoader; typedef struct _CCSDynamicBackend CCSDynamicBackend; typedef struct _CCSConfigFile CCSConfigFile; typedef struct _CCSIntegration CCSIntegration; typedef struct _CCSSettingValue CCSSettingValue; typedef struct _CCSIntegratedSettingInfo CCSIntegratedSettingInfo; typedef struct _CCSIntegratedSetting CCSIntegratedSetting; typedef struct _CCSIntegratedSettingFactory CCSIntegratedSettingFactory; typedef struct _CCSIntegratedSettingsStorage CCSIntegratedSettingsStorage; typedef struct _CCSInterfaceTable CCSInterfaceTable; typedef CCSBackendInterface * (*BackendGetInfoProc) (void); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/include/ccs-list.h0000644000015301777760000000651112321343002026657 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _CCS_LIST_H #define _CCS_LIST_H #include COMPIZCONFIG_BEGIN_DECLS /** * list functions: * for each list there is a set of functions, explained using String as example * * ccsStringListAppend (list, item) * Adds an item at the end of the list. Returns the new list. * * ccsStringListPrepend (list, item) * Adds an item at the beginning of the list. Returns the new list. * * ccsStringListInsert (list, item, position) * Adds an item at a given position. Position is 0-based. If position is * larger than the amount of items in the list, the item is inserted at the * end of the list. Returns the new list. * * ccsStringListInsertBefore (list, sibling, item) * Inserts item before sibling into the list. If sibling is no list member, * item is inserted at the end. Returns the new list. * * ccsStringListLength (list) * Returns the amount of items in list. * * ccsStringListFind (list, item) * Finds and returns an item matching . If nothing is found, returns NULL. * * ccsStringListGetItem (list, index) * Returns the list item at position . If index is larger than the * amount of items in the list, returns NULL. * * ccsStringListRemove (list, item, freeObj) * Removes item from the list. If freeObj is TRUE, also frees the data item. * Returns the new list. * * ccsStringListFree (list, freeObj) * Frees the complete list. If freeObj is TRUE, also frees the data items. * Returns the new list (NULL). */ #define CCSLIST_HDR(type,dtype) \ typedef struct _CCS##type##List * CCS##type##List;\ struct _CCS##type##List \ { \ dtype * data; \ CCS##type##List next; \ }; \ CCS##type##List ccs##type##ListAppend (CCS##type##List list, dtype *data); \ CCS##type##List ccs##type##ListPrepend (CCS##type##List list, dtype *data); \ CCS##type##List ccs##type##ListInsert (CCS##type##List list, dtype *data, int position); \ CCS##type##List ccs##type##ListInsertBefore (CCS##type##List list, CCS##type##List sibling, dtype *data); \ unsigned int ccs##type##ListLength (CCS##type##List list); \ CCS##type##List ccs##type##ListFind (CCS##type##List list, dtype *data); \ CCS##type##List ccs##type##ListGetItem (CCS##type##List list, unsigned int index); \ CCS##type##List ccs##type##ListRemove (CCS##type##List list, dtype *data, Bool freeObj); \ CCS##type##List ccs##type##ListFree (CCS##type##List list, Bool freeObj); COMPIZCONFIG_END_DECLS #endif compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/libcompizconfig_internal.pc.in0000644000015301777760000000056512321343002031350 0ustar pbusernogroup00000000000000prefix=@CMAKE_CURRENT_BINARY_DIR@/src/ exec_prefix=@CMAKE_CURRENT_BINARY_DIR@/src/ libdir=@CMAKE_CURRENT_BINARY_DIR@/src/ includedir=@CMAKE_CURRENT_SOURCE_DIR@/include Name: libcompizconfig_internal Description: Compiz configuration system (internal) Version: @VERSION@ Libs: -L@CMAKE_CURRENT_BINARY_DIR@/src/ -lcompizconfig Cflags: -I@CMAKE_CURRENT_SOURCE_DIR@/include compiz-0.9.11+14.04.20140409/compizconfig/libcompizconfig/README0000644000015301777760000000000012321343002024205 0ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/0000755000015301777760000000000012321344021024171 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/setup.py0000644000015301777760000001125612321343002025706 0ustar pbusernogroup00000000000000# -*- coding: utf-8 -*- from distutils.core import setup, Command from distutils.command.build import build as _build from distutils.command.install import install as _install from distutils.command.install_data import install_data as _install_data from distutils.command.sdist import sdist as _sdist import os import subprocess import sys import unittest pkg_config_environ = os.environ pkg_config_environ["PKG_CONFIG_PATH"] = os.getcwd () + "/../libcompizconfig:" + os.environ.get ("PKG_CONFIG_PATH", '') pkgconfig_libs = subprocess.Popen (["pkg-config", "--libs", "libcompizconfig_internal"], stdout=subprocess.PIPE, env=pkg_config_environ, stderr=open(os.devnull, 'w')).communicate ()[0] if len (pkgconfig_libs) is 0: print ("CompizConfig Python [ERROR]: No libcompizconfig_internal.pc found in the pkg-config search path") print ("Ensure that libcompizonfig is installed or libcompizconfig.pc is in your $PKG_CONFIG_PATH") exit (1); libs = pkgconfig_libs[2:].split (" ")[0] INSTALLED_FILES = "installed_files" for arg in sys.argv: if "--version" in arg: VERSION = arg.split ("=")[1] class build (_build): user_options = _build.user_options[:] user_options.extend ([('version=', None, "Version of the package")]) def initialize_options(self): self.version = None _build.initialize_options (self) def finalize_options(self): _build.finalize_options (self) class install (_install): user_options = _install.user_options[:] user_options.extend ([('version=', None, "Version of the package")]) def initialize_options(self): self.version = None _install.initialize_options (self) def finalize_options(self): _install.finalize_options (self) def run (self): _install.run (self) outputs = self.get_outputs () length = 0 if self.root: length += len (self.root) if self.prefix: length += len (self.prefix) if length: for counter in xrange (len (outputs)): outputs[counter] = outputs[counter][length:] data = "\n".join (outputs) try: file = open (INSTALLED_FILES, "w") except: self.warn ("Could not write installed files list %s" % \ INSTALLED_FILES) return file.write (data) file.close () class install_data (_install_data): def run (self): def chmod_data_file (file): try: os.chmod (file, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) except: self.warn ("Could not chmod data file %s" % file) _install_data.run (self) map (chmod_data_file, self.get_outputs ()) class uninstall (_install): user_options = _install.user_options[:] user_options.extend ([('version=', None, "Version of the package")]) def initialize_options(self): self.version = None _install.initialize_options (self) def finalize_options(self): _install.finalize_options (self) def run (self): try: file = open (INSTALLED_FILES, "r") except: self.warn ("Could not read installed files list %s" % \ INSTALLED_FILES) return files = file.readlines () file.close () prepend = "" if self.root: prepend += self.root if self.prefix: prepend += self.prefix if len (prepend): for counter in xrange (len (files)): files[counter] = prepend + files[counter].rstrip () for file in files: print ("Uninstalling %s" % file) try: os.unlink (file) except: self.warn ("Could not remove file %s" % file) class test (Command): description = "run tests" user_options = [] def initialize_options (self): self.cwd = None def finalize_options (self): self.cwd = os.getcwd () def run (self): assert os.getcwd () == self.cwd, 'Must be in package root: %s' % self.cwd loader = unittest.TestLoader () tests = loader.discover (os.getcwd (), pattern='test*') result = unittest.TestResult () unittest.TextTestRunner (verbosity=2).run (tests) setup ( name = "compizconfig-python", version = VERSION, description = "CompizConfig Python", url = "https://launchpad.net/compiz", license = "GPL", maintainer = "Guillaume Seguin", maintainer_email = "guillaume@segu.in", cmdclass = {"uninstall" : uninstall, "install" : install, "install_data" : install_data, "build" : build, "test" : test} ) compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/Makefile0000644000015301777760000000027512321343002025633 0ustar pbusernogroup00000000000000all: @python setup.py build --prefix=${PREFIX} install: all @python setup.py install --prefix=${PREFIX} uninstall: @python setup.py uninstall --prefix=${PREFIX} clean: rm -rf build/ compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/tests/0000755000015301777760000000000012321344021025333 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/tests/mock.xml0000644000015301777760000000100012321343002026773 0ustar pbusernogroup00000000000000 Mock Mock plugin Mocks mocking A Mock Group A Mock Subgroup compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/tests/test_backend.py0000644000015301777760000000105412321343002030331 0ustar pbusernogroup00000000000000import compiz_config_test import unittest class CompizConfigTestBackend (compiz_config_test.CompizConfigTest): def runTest (self): info = ["ini", "Ini Backend", "Flat File Backend", True, False] backend = self.ccs.Backend (self.context, info) self.assertEqual (backend.Name, "ini") self.assertEqual (backend.ShortDesc, "Ini Backend") self.assertEqual (backend.LongDesc, "Flat File Backend") self.assertEqual (backend.IntegrationSupport, False) self.assertEqual (backend.ProfileSupport, True) if __name__ == '__main__': unittest.main() compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/tests/__init__.py0000644000015301777760000000042412321343002027442 0ustar pbusernogroup00000000000000import unittest import compizconfig import os def load_tests (loader, tests, pattern): tests = loader.discover (os.getcwd (), pattern='test_*.py') return tests if __name__ == "__main__": loader = unittest.defaultTestLoader unittest.main (testLoader=loader) compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/tests/test_plugin.py0000644000015301777760000000116312321343002030241 0ustar pbusernogroup00000000000000import compiz_config_test import unittest class CompizConfigTestPlugin (compiz_config_test.CompizConfigTest): def runTest (self): plugin = self.ccs.Plugin (self.context, "mock") plugin.Update () self.assertEqual (plugin.Context, self.context) self.assertTrue ("A Mock Group" in plugin.Groups) self.assertTrue (plugin.Screen is not None) self.assertEqual (plugin.Name, "mock") self.assertEqual (plugin.ShortDesc, "Mock") self.assertEqual (plugin.LongDesc, "Mock plugin") self.assertEqual (plugin.Category, "Mocks") self.assertEqual (plugin.Features, ["mocking"]) if __name__ == '__main__': unittest.main() compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/tests/compiz_config_test.py0000644000015301777760000000131412321343002031567 0ustar pbusernogroup00000000000000import os import sys import subprocess arch = subprocess.Popen (["uname", "-p"], stdout=subprocess.PIPE).communicate ()[0][:-1] os.environ["G_SLICE"] = "always-malloc" os.environ["COMPIZ_METADATA_PATH"] = "compizconfig/compizconfig-python/" os.environ["COMPIZ_CONFIG_PROFILE"] = "" os.environ["XDG_CONFIG_HOME"] = "compizconfig/libcompizconfig/config" os.environ["LIBCOMPIZCONFIG_BACKEND_PATH"] = "compizconfig/libcompizconfig/backend/" os.environ["XDG_DATA_DIRS"] = "generated/" sys.path.insert (0, "compizconfig/compizconfig-python") import unittest import compizconfig class CompizConfigTest (unittest.TestCase): ccs = compizconfig def setUp (self): self.context = compizconfig.Context () compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/tests/test_profile.py0000644000015301777760000000116212321343002030402 0ustar pbusernogroup00000000000000import compiz_config_test import unittest class CompizConfigProfileTest (compiz_config_test.CompizConfigTest): def runTest (self): profile = self.ccs.Profile (self.context, "compizconfig") self.assertEqual (profile.Name, "compizconfig", 'wrong profile name') profile1 = self.ccs.Profile (self.context, "compizconfig2") self.assertEqual (profile1.Name, "compizconfig2", 'wrong profile name') profile2 = self.ccs.Profile (self.context, "compizconfig3") self.assertEqual (profile2.Name, "compizconfig3", 'wrong profile name') if __name__ == '__main__': unittest.main() compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/tests/test_setting.py0000644000015301777760000000151412321343002030420 0ustar pbusernogroup00000000000000import compiz_config_test import unittest class CompizConfigTestSetting (compiz_config_test.CompizConfigTest): def runTest (self): plugin = self.context.Plugins["mock"] setting = self.ccs.Setting (plugin, "mock") self.assertEqual (setting.Plugin, plugin) self.assertEqual (setting.Name, "mock") self.assertEqual (setting.ShortDesc, "Mock Setting") self.assertEqual (setting.LongDesc, "A Mock Setting") self.assertEqual (setting.Group, "A Mock Group") self.assertEqual (setting.SubGroup, "A Mock Subgroup") self.assertEqual (setting.Type, "String") self.assertEqual (setting.Hints, []) self.assertEqual (setting.DefaultValue, "Mock Value") self.assertEqual (setting.Value, "Mock Value") self.assertEqual (setting.Integrated, False) self.assertEqual (setting.ReadOnly, False) if __name__ == '__main__': unittest.main() compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/INSTALL0000644000015301777760000000221412321343002025217 0ustar pbusernogroup00000000000000Installation Instructions ************************* Copyright (C) 2010 Sam Spilsbury. This file is free documentation under the GNU GFDL; I hereby give unlimited permission to copy, distribute and modify it. Basic Installation ================== CompizConfig Python Bindings use the distutils buildsystem to translate, build and install the bindings. See the Distutils documentation for more information on how to use the specifics of the buildsystem. At the moment, you probably just want to issue something like: # python setup.py install Command Line Arguments ====================== If you want to install to a particular prefix (eg /opt) then you would use the '--prefix' switch: # python setup.py install --prefix=/opt Environment Variables ===================== CompizConfig Python Bindings might require some environment variables if you installed LibCompizConfig to a non-standard location. Currently, only PKG_CONFIG_PATH is supported, and this is used to find the pkgconfig file to determine the libcompizconfig install location for linking # PKG_CONFIG_PATH=/opt/lib/pkgconfig python setup.py install compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/TODO0000644000015301777760000000000012321343002024645 0ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/compizconfig-python.pc.in0000644000015301777760000000047612321343002031135 0ustar pbusernogroup00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ pyexecdir=@pyexecdir@ Name: compizconfig-python Version: @VERSION@ Description: Compiz configuration system bindings Requires: @CCS_REQUIRES@ Libs: @CCS_LIBS@ -L@libdir@ -lcompizconfig Cflags: @CCS_CFLAGS@ -I@includedir@/compizconfig compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/CMakeLists.txt0000644000015301777760000001325612321343002026736 0ustar pbusernogroup00000000000000# Hack set (CMAKE_PROJECT_NAME compizconfig-python) # Get arch execute_process (COMMAND uname -p OUTPUT_VARIABLE PROC_ARCH) # Get Python Version execute_process (COMMAND python -c "import sys; print str (sys.version_info[0]) + '.' + str (sys.version_info[1])" OUTPUT_VARIABLE PY_VERSION) include (FindPkgConfig) pkg_check_modules (PYTHON python-2.7) # This is a workaround for a broken FindPythonLibs always finding the # wrong library version because PYTHON_LIBRARY is in the cache and # can't be overwritten string (REGEX REPLACE "^([0-9]+\\.[0-9]+).*" "\\1" PYTHON_CURRENT_VERSION ${PY_VERSION}) string (REPLACE "." "" PYTHON_CURRENT_VERSION_NO_DOTS ${PYTHON_CURRENT_VERSION}) find_library (PYTHON_LIBRARY_LOCAL NAMES python${PYTHON_CURRENT_VERSION_NO_DOTS} python${PYTHON_CURRENT_VERSION} PATH_SUFFIXES python${PYTHON_CURRENT_VERSION}/config) set (COMPIZCONFIG_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/compizconfig/libcompizconfig/include) string (REPLACE "\n" "" PROC_ARCH ${PROC_ARCH}) string (REPLACE "\n" "" PY_VERSION ${PY_VERSION}) set (PY_BUILD_DIR lib.linux-${PROC_ARCH}-${PY_VERSION}) set (PY_SCRIPTS_DIR scripts-${PY_VERSION}) set (PY_COMPIZCONFIG_SRC ${CMAKE_CURRENT_BINARY_DIR}/compizconfig.c) set (PY_COMPIZCONFIG_PYREX ${CMAKE_CURRENT_SOURCE_DIR}/src/compizconfig.pyx) find_program(PYREXC_BIN pyrexc) if(NOT PYREXC_BIN) message(FATAL_ERROR "Can not build because pyrexc binary not found.") endif() add_custom_command (OUTPUT ${PY_COMPIZCONFIG_SRC} COMMAND ${PYREXC_BIN} -o ${PY_COMPIZCONFIG_SRC} ${PY_COMPIZCONFIG_PYREX} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${PY_COMPIZCONFIG_PYREX}) file (READ ${CMAKE_SOURCE_DIR}/VERSION COMPIZ_RELEASE_VERSION LIMIT 12 OFFSET 0) string (STRIP ${COMPIZ_RELEASE_VERSION} COMPIZ_RELEASE_VERSION) set (VERSION ${COMPIZ_RELEASE_VERSION}) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/compizconfig-python.pc.in ${CMAKE_CURRENT_BINARY_DIR}/compizconfig-python.pc) include_directories (${PYTHON_INCLUDE_DIRS} ${COMPIZCONFIG_INCLUDE_DIRS}) # pyrex generates code that does type-punning, this trips # up -Werror set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-strict-aliasing") # We need to remove the "lib" set (CMAKE_SHARED_LIBRARY_PREFIX "") # We must build the python module using CMake instead of distutils. # # The only way in which the python module can be built using distutils # is by using add_custom_command to "generate" it into existence. # Unfortunately this has drawbacks. Namely, it is not possible for # add_custom_command to depend on library targets. Because of that, there's # no way that we can guarantee that libcompizconfig.so will be linked # before compizconfig.so (which is required). The best that we can do # there is to use add_custom_target, and make that target depend on the # file, add_library (compizconfig_python_module SHARED ${PY_COMPIZCONFIG_SRC}) set_target_properties (compizconfig_python_module PROPERTIES OUTPUT_NAME compizconfig) target_link_libraries (compizconfig_python_module ${PYTHON_LIBRARY_LOCAL} compizconfig) set (UNINSTALL_COMMAND "python ${CMAKE_CURRENT_SOURCE_DIR}/setup.py uninstall --prefix=${CMAKE_INSTALL_PREFIX} --version=${VERSION}") compiz_add_code_to_uninstall_target (${UNINSTALL_COMMAND} ${CMAKE_CURRENT_BINARY_DIR}) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/compizconfig-python.pc DESTINATION ${libdir}/pkgconfig) # This is probably not very portable, but we can't install using distutils # as we cannot build with it safely if ($ENV{COMPIZ_DEB_BUILD}) set (INSTALL_LAYOUT_DIR dist-packages) else ($ENV{COMPIZ_DEB_BUILD}) set (INSTALL_LAYOUT_DIR site-packages) endif ($ENV{COMPIZ_DEB_BUILD}) set (PYTHON_MODULE_DIR ${libdir}/python${PY_VERSION}/${INSTALL_LAYOUT_DIR}) install (TARGETS compizconfig_python_module DESTINATION ${PYTHON_MODULE_DIR}) install (CODE "message (\"Installing python files\") execute_process (COMMAND cmake -DSETUP=${CMAKE_CURRENT_SOURCE_DIR}/setup.py -DPREFIX=${CMAKE_INSTALL_PREFIX} -DWDIR=${CMAKE_CURRENT_BINARY_DIR} -DVERSION=${VERSION} -P ${compiz_SOURCE_DIR}/compizconfig/cmake/exec_setup_py_with_destdir.cmake)") if (COMPIZ_BUILD_TESTING) find_program (BASH_EXECUTABLE bash) find_program (PYTHON_EXECUTABLE python) mark_as_advanced (FORCE PYTHON_EXECUTABLE) file (GLOB PYTHON_TESTS "tests/test_*.py") if (PYTHON_EXECUTABLE AND BASH_EXECUTABLE) set (MOCK_XML_SRC ${CMAKE_CURRENT_SOURCE_DIR}/tests/mock.xml) set (MOCK_XML_FILE ${CMAKE_CURRENT_BINARY_DIR}/mock.xml) add_custom_command (OUTPUT ${MOCK_XML_FILE} COMMAND cp ${MOCK_XML_SRC} ${MOCK_XML_FILE} COMMENT "Copying mock.xml file into testing directory" DEPENDS ${MOCK_XML_SRC}) add_custom_target (compizconfig_python_test_mock_xml_file ALL DEPENDS ${MOCK_XML_FILE}) # For testing purposes we need the ini backend add_dependencies (compizconfig_python_module ini compizconfig_python_test_mock_xml_file) foreach (PYTHON_TEST_FILE ${PYTHON_TESTS}) get_filename_component (PYTHON_TEST ${PYTHON_TEST_FILE} NAME_WE) message (STATUS "Adding test " ${PYTHON_TEST}) add_test (NAME CompizConfigPython.${PYTHON_TEST} WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" COMMAND ${BASH_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/util/run_with_ld_library_path.sh ${CMAKE_BINARY_DIR}/compizconfig/libcompizconfig/src ${PYTHON_EXECUTABLE} ${PYTHON_TEST_FILE}) endforeach (PYTHON_TEST_FILE) endif (PYTHON_EXECUTABLE AND BASH_EXECUTABLE) endif (COMPIZ_BUILD_TESTING) compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/COPYING0000644000015301777760000004311012321343002025221 0ustar pbusernogroup00000000000000 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. compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/src/0000755000015301777760000000000012321344021024760 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/src/compizconfig.pyx0000644000015301777760000012454112321343002030216 0ustar pbusernogroup00000000000000''' This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Authors: Quinn Storm (quinn@beryl-project.org) Patrick Niklaus (marex@opencompositing.org) Guillaume Seguin (guillaume@segu.in) Copyright (C) 2007 Quinn Storm ''' import operator StringSettingKeyFunc = operator.itemgetter (1) ctypedef unsigned int Bool cdef struct CCSInterfaceTable: void *contextInterface cdef extern CCSInterfaceTable ccsDefaultInterfaceTable cdef enum CCSSettingType: TypeBool TypeInt TypeFloat TypeString TypeColor TypeAction TypeKey TypeButton TypeEdge TypeBell TypeMatch TypeList TypeNum cdef enum CCSPluginConflictType: # produced on plugin activation ConflictRequiresPlugin, ConflictRequiresFeature, ConflictFeature, ConflictPlugin, # produced on plugin deactivation ConflictFeatureNeeded, ConflictPluginNeeded, ConflictPluginError SettingTypeString = [ "Bool", "Int", "Float", "String", "Color", "Action", "Key", "Button", "Edge", "Bell", "Match", "List", "Invalid" ] ConflictTypeString = [ "RequiresPlugin", #A "RequiresFeature", #A "ConflictFeature", #A "ConflictPlugin", #A "FeatureNeeded", #D "PluginNeeded", #D "PluginError" ] cdef struct CCSList: void * data CCSList * next ctypedef CCSList CCSSettingList ctypedef CCSList CCSPluginList ctypedef CCSList CCSStringList ctypedef CCSList CCSGroupList ctypedef CCSList CCSSubGroupList ctypedef CCSList CCSPluginConflictList ctypedef CCSList CCSSettingValueList ctypedef CCSList CCSBackendInfoList ctypedef CCSList CCSIntDescList ctypedef CCSList CCSStrRestrictionList ctypedef CCSList CCSStrExtensionList cdef struct CCSBackendInfo: char * name char * shortDesc char * longDesc Bool integrationSupport Bool profileSupport unsigned int refCount cdef struct CCSSettingKeyValue: int keysym unsigned int keyModMask cdef struct CCSSettingButtonValue: int button unsigned int buttonModMask int edgeMask cdef struct CCSSettingColorValueColor: unsigned short red unsigned short green unsigned short blue unsigned short alpha cdef union CCSSettingColorValue: CCSSettingColorValueColor color unsigned short array[4] cdef union CCSSettingValueUnion: Bool asBool int asInt float asFloat char * asString char * asMatch CCSSettingColorValue asColor CCSSettingValueList * asList CCSSettingKeyValue asKey CCSSettingButtonValue asButton unsigned int asEdge Bool asBell cdef struct CCSIntDesc: int value char * name unsigned int refCount cdef struct CCSStrRestriction: char * value char * name unsigned int refCount cdef struct CCSSettingIntInfo: int min int max CCSIntDescList * desc cdef struct CCSSettingFloatInfo: float min float max float precision cdef struct CCSSettingStringInfo: CCSStrRestrictionList * restriction int sortStartsAt Bool extensible cdef struct CCSSettingListInfo: CCSSettingType listType void * listInfo # actually CCSSettingInfo *, works around pyrex cdef struct CCSSettingActionInfo: Bool internal cdef union CCSSettingInfo: CCSSettingIntInfo forInt CCSSettingFloatInfo forFloat CCSSettingStringInfo forString CCSSettingListInfo forList CCSSettingActionInfo forAction cdef struct CCSSettingValue: CCSSettingValueUnion value void * parent Bool isListChild unsigned int refCount cdef struct CCSGroup: char * name CCSSubGroupList * subGroups unsigned int refCount cdef struct CCSSubGroup: char * name CCSSettingList * settings unsigned int refCount cdef struct CCSPluginCategory: char * name char * shortDesc char * longDesc CCSStringList * plugins cdef struct CCSContext cdef struct CCSPlugin cdef struct CCSSetting cdef struct CCSStrExtension: char * basePlugin CCSSettingList * baseSettings CCSStrRestrictionList * restriction unsigned int refCount cdef struct CCSPlugin: void * ccsPrivate unsigned int refCount cdef struct CCSPluginConflict: char * value CCSPluginConflictType type CCSPluginList * plugins unsigned int refCount cdef struct CCSString: char * value unsigned int refCount '''Context functions''' cdef extern void ccsSetBasicMetadata (Bool value) cdef extern CCSContext * ccsContextNew (unsigned int screenNum, CCSInterfaceTable *) cdef extern CCSContext * ccsEmptyContextNew (unsigned int screenNum, CCSInterfaceTable *) cdef extern void ccsContextDestroy (CCSContext * context) cdef extern CCSPluginList ccsContextGetPlugins (CCSContext *context) cdef extern CCSPluginCategory * ccsContextGetCategories (CCSContext *context) cdef extern CCSSettingList ccsContextGetChangedSettings (CCSContext *context) cdef extern unsigned int ccsContextGetScreenNum (CCSContext *context) cdef extern Bool ccsContextAddChangedSetting (CCSContext *context, CCSSetting *setting) cdef extern Bool ccsContextClearChangedSettings (CCSContext *context) cdef extern CCSSettingList ccsContextStealChangedSettings (CCSContext *context) cdef extern void * ccsContextGetPrivatePtr (CCSContext *context) cdef extern void ccsContextSetPrivatePtr (CCSContext *context, void *) cdef extern void * ccsContextGetPluginsBindable (CCSContext *context) cdef extern void * ccsContextStealChangedSettingsBindable (CCSContext *context) cdef extern void * ccsContextGetChangedSettingsBindable (CCSContext *context) '''Plugin functions''' cdef extern Bool ccsLoadPlugin (CCSContext * context, char * name) cdef extern CCSPlugin * ccsFindPlugin (CCSContext * context, char * name) cdef extern CCSSetting * ccsFindSetting (CCSPlugin * plugin, char * name) cdef extern CCSSettingList * ccsGetPluginSettings (CCSPlugin * plugin) cdef extern CCSGroupList * ccsGetPluginGroups (CCSPlugin * plugin) cdef extern char * ccsPluginGetName (CCSPlugin *plugin) cdef extern char * ccsPluginGetShortDesc (CCSPlugin *plugin) cdef extern char * ccsPluginGetLongDesc (CCSPlugin *plugin) cdef extern char * ccsPluginGetHints (CCSPlugin *plugin) cdef extern char * ccsPluginGetCategory (CCSPlugin *plugin) cdef extern CCSStringList ccsPluginGetLoadAfter (CCSPlugin *plugin) cdef extern CCSStringList ccsPluginGetLoadBefore (CCSPlugin *plugin) cdef extern CCSStringList ccsPluginGetRequiresPlugins (CCSPlugin *plugin) cdef extern CCSStringList ccsPluginGetConflictPlugins (CCSPlugin *plugin) cdef extern CCSStringList ccsPluginGetProvidesFeatures (CCSPlugin *plugin) cdef extern CCSStringList ccsPluginGetRequiresFeatures (CCSPlugin *plugin) cdef extern void * ccsPluginGetProvidesFeaturesBindable (CCSPlugin *plugin) cdef extern void * ccsPluginGetPrivatePtr (CCSPlugin *plugin) cdef extern void ccsPluginSetPrivatePtr (CCSPlugin *plugin, void *ptr) cdef extern CCSContext * ccsPluginGetContext (CCSPlugin *plugin) '''Action => String''' cdef extern char * ccsModifiersToString (unsigned int modMask) cdef extern char * ccsEdgesToString (unsigned int edge) cdef extern char * ccsEdgesToModString (unsigned int edge) cdef extern char * ccsKeyBindingToString (CCSSettingKeyValue *key) cdef extern char * ccsButtonBindingToString (CCSSettingButtonValue *button) '''String utils''' cdef extern from 'string.h': ctypedef int size_t cdef extern char * strdup (char * s) cdef extern void memset (void * s, int c, size_t n) cdef extern void free (void * f) cdef extern void * malloc (size_t s) '''String => Action''' cdef extern unsigned int ccsStringToModifiers (char *binding) cdef extern unsigned int ccsStringToEdges (char *edge) cdef extern unsigned int ccsModStringToEdges (char *edge) cdef extern Bool ccsStringToKeyBinding (char * binding, CCSSettingKeyValue * key) cdef extern Bool ccsStringToButtonBinding (char * binding, CCSSettingButtonValue * button) '''General settings handling''' cdef extern Bool ccsSetValue (CCSSetting * setting, CCSSettingValue * value, Bool processChanged) cdef extern void ccsFreeSettingValue (CCSSettingValue * value) cdef extern CCSSettingValueList * ccsSettingValueListAppend ( CCSSettingValueList * l, CCSSettingValue * v) cdef extern CCSSettingList *ccsSettingListFree (CCSSettingList * list, Bool freeObj) '''Profiles''' cdef extern CCSStringList * ccsGetExistingProfiles (CCSContext * context) cdef extern void ccsDeleteProfile (CCSContext * context, char * name) cdef extern void ccsSetProfile (CCSContext * context, char * name) cdef extern char* ccsGetProfile (CCSContext * context) '''Backends''' cdef extern CCSBackendInfoList * ccsGetExistingBackends (CCSContext *) cdef extern void ccsBackendInfoListFree (CCSBackendInfoList *, Bool freeObj) cdef extern Bool ccsSetBackend (CCSContext * context, char * name) cdef extern char* ccsGetBackend (CCSContext * context) '''Sorting''' cdef extern void ccsSetPluginListAutoSort (CCSContext *context, Bool value) cdef extern Bool ccsGetPluginListAutoSort (CCSContext *context) '''Integration''' cdef extern void ccsSetIntegrationEnabled (CCSContext * context, Bool value) cdef extern Bool ccsGetIntegrationEnabled (CCSContext * context) '''IO handling''' cdef extern void ccsReadSettings (CCSContext * c) cdef extern void ccsWriteSettings (CCSContext * c) cdef extern void ccsWriteChangedSettings (CCSContext * c) cdef extern void ccsResetToDefault (CCSSetting * s, Bool processChanged) '''Event loop''' ProcessEventsNoGlibMainLoopMask = (1 << 0) cdef extern void ccsProcessEvents (CCSContext * context, unsigned int flags) '''Import/export''' cdef extern Bool ccsExportToFile (CCSContext * context, char * fileName, Bool skipDefaults) cdef extern Bool ccsImportFromFile (CCSContext * context, char * fileName, Bool overwrite) '''Misc. Plugin/Setting utils''' cdef extern Bool ccsSettingIsReadOnly (CCSSetting * setting) cdef extern Bool ccsSettingIsIntegrated (CCSSetting * setting) cdef extern char * ccsSettingGetName (CCSSetting *) cdef extern char * ccsSettingGetShortDesc (CCSSetting *) cdef extern char * ccsSettingGetLongDesc (CCSSetting *) cdef extern CCSSettingType ccsSettingGetType (CCSSetting *) cdef extern CCSSettingInfo * ccsSettingGetInfo (CCSSetting *) cdef extern char * ccsSettingGetGroup (CCSSetting *) cdef extern char * ccsSettingGetSubGroup (CCSSetting *) cdef extern char * ccsSettingGetHints (CCSSetting *) cdef extern CCSSettingValue * ccsSettingGetDefaultValue (CCSSetting *) cdef extern CCSSettingValue *ccsSettingGetValue (CCSSetting *) cdef extern Bool ccsSettingGetIsDefault (CCSSetting *) cdef extern CCSPlugin * ccsSettingGetParent (CCSSetting *) cdef extern void * ccsSettingGetPrivatePtr (CCSSetting *) cdef extern void ccsSettingSetPrivatePtr (CCSSetting *, void *) cdef extern void ccsPluginConflictListFree (CCSPluginConflictList * l, Bool freeObj) cdef extern CCSPluginConflictList * ccsCanEnablePlugin (CCSContext * c, CCSPlugin * p) cdef extern CCSPluginConflictList * ccsCanDisablePlugin (CCSContext * c, CCSPlugin * p) cdef extern Bool ccsPluginSetActive (CCSPlugin * p, Bool v) cdef extern Bool ccsPluginIsActive (CCSContext * c, char * n) cdef extern CCSStrExtensionList * ccsGetPluginStrExtensions (CCSPlugin * plugin) cdef class Context cdef class Plugin cdef class Setting cdef CCSSettingType GetType (CCSSettingValue * value): if value.isListChild: return ccsSettingGetInfo (( value.parent)).forList.listType else: return ccsSettingGetType (( value.parent)) cdef object StringListToList (CCSList * stringList): cdef CCSString * string list = [] while stringList: string = stringList.data; item = string.value list.append (item) stringList = stringList.next return list cdef CCSSettingList * ListToSettingList (object list): if len (list) <= 0: return NULL cdef CCSSettingList * listStart cdef CCSSettingList * settingList cdef CCSSettingList * prev cdef Setting setting listStart = malloc (sizeof (CCSSettingList)) setting = list[0] listStart.data = setting.ccsSetting listStart.next = NULL prev = listStart for l in list[1:]: settingList = malloc (sizeof (CCSSettingList)) setting = l settingList.data = setting.ccsSetting settingList.next = NULL prev.next = settingList prev = settingList return listStart cdef object SettingListToList (Context context, CCSList * settingList): cdef CCSSetting * ccsSetting list = [] while settingList: ccsSetting = settingList.data setting = None plugin = context.Plugins[ccsPluginGetName (ccsSettingGetParent (ccsSetting))] setting = plugin.Screen[ccsSettingGetName (ccsSetting)] list.append (setting) settingList = settingList.next return list cdef object IntDescListToDict (CCSIntDescList * intDescList): cdef CCSIntDesc * desc dict = {} while intDescList: desc = intDescList.data dict[desc.name] = desc.value intDescList = intDescList.next return dict cdef object StrRestrictionListToDict (CCSStrRestrictionList * restrictionList, object initialDict): cdef CCSStrRestriction * restriction dict = initialDict listOfAddedItems = [] while restrictionList: restriction = restrictionList.data dict[restriction.name] = restriction.value listOfAddedItems.append ((restriction.name, restriction.value)) restrictionList = restrictionList.next return (dict, listOfAddedItems) cdef CCSSettingValue * EncodeValue (object data, CCSSetting * setting, Bool isListChild): cdef CCSSettingValue * bv cdef CCSSettingType t cdef CCSList * l bv = malloc (sizeof (CCSSettingValue)) memset (bv, 0, sizeof (CCSSettingValue)) bv.isListChild = isListChild bv.parent = setting if isListChild: t = ccsSettingGetInfo (setting).forList.listType else: t = ccsSettingGetType (setting) if t == TypeString: bv.value.asString = strdup (data) elif t == TypeMatch: bv.value.asMatch = strdup (data) elif t == TypeInt: bv.value.asInt = data elif t == TypeFloat: bv.value.asFloat = data elif t == TypeBool: if data: bv.value.asBool = 1 else: bv.value.asBool = 0 elif t == TypeColor: bv.value.asColor.color.red = data[0] bv.value.asColor.color.green = data[1] bv.value.asColor.color.blue = data[2] bv.value.asColor.color.alpha = data[3] elif t == TypeKey: ccsStringToKeyBinding (data, &bv.value.asKey) elif t == TypeButton: ccsStringToButtonBinding (data, &bv.value.asButton) elif t == TypeEdge: bv.value.asEdge = ccsStringToEdges (data) elif t == TypeBell: if (data): bv.value.asBell = 1 else: bv.value.asBell = 0 elif t == TypeList: l = NULL for item in data: l = ccsSettingValueListAppend (l, EncodeValue (item, setting, 1)) bv.value.asList = l return bv cdef object DecodeValue (CCSSettingValue * value): cdef CCSSettingType t cdef char * s cdef CCSList * l cdef object cs cdef object ks cdef object bs cdef object es cdef object eb t = GetType (value) if t == TypeString: return value.value.asString elif t == TypeMatch: return value.value.asMatch elif t == TypeBool: if value.value.asBool: return True return False elif t == TypeInt: return value.value.asInt elif t == TypeFloat: return value.value.asFloat elif t == TypeColor: return [value.value.asColor.color.red, value.value.asColor.color.green, value.value.asColor.color.blue, value.value.asColor.color.alpha] elif t == TypeKey: s = ccsKeyBindingToString (&value.value.asKey) if s != NULL: ks = s free (s) else: ks = "None" return ks elif t == TypeButton: s = ccsButtonBindingToString (&value.value.asButton) if s != NULL: bs = s free (s) else: bs = "None" if bs == "Button0": bs = "None" return bs elif t == TypeEdge: s = ccsEdgesToString (value.value.asEdge) if s != NULL: es = s free (s) else: es = "None" return es elif t == TypeBell: bb = False if value.value.asBell: bb = True return bb elif t == TypeList: lret = [] l = value.value.asList while l != NULL: lret.append (DecodeValue ( l.data)) l = l.next return lret return "Unhandled" cdef class Setting: """A python representation of a CCSSetting. You should not construct this object directly. Use plugin.Screen['settingname'] instead """ cdef CCSSetting * ccsSetting cdef object info cdef Plugin plugin cdef object extendedStrRestrictions cdef object baseStrRestrictions def __cinit__ (self, Plugin plugin, name): cdef CCSSettingType t cdef CCSSettingInfo * i self.ccsSetting = ccsFindSetting (plugin.ccsPlugin, name) self.plugin = plugin self.extendedStrRestrictions = None self.baseStrRestrictions = None info = () t = ccsSettingGetType (self.ccsSetting) i = ccsSettingGetInfo (self.ccsSetting) if t == TypeList: t = ccsSettingGetInfo (self.ccsSetting).forList.listType i = ccsSettingGetInfo (self.ccsSetting).forList.listInfo if t == TypeInt: desc = IntDescListToDict (i.forInt.desc) info = (i.forInt.min, i.forInt.max, desc) elif t == TypeFloat: info = (i.forFloat.min, i.forFloat.max, i.forFloat.precision) elif t == TypeString: # info is filled later in Plugin.SortSingleStringSetting info = ({}, {}, []) self.baseStrRestrictions = [] self.extendedStrRestrictions = {} elif t in (TypeKey, TypeButton, TypeEdge, TypeBell): info = (bool (i.forAction.internal),) if ccsSettingGetType (self.ccsSetting) == TypeList: info = (SettingTypeString[t], info) self.info = info def Reset (self): ccsResetToDefault (self.ccsSetting, 1) property Plugin: def __get__ (self): return self.plugin property Name: def __get__ (self): return ccsSettingGetName (self.ccsSetting) property ShortDesc: def __get__ (self): return ccsSettingGetShortDesc (self.ccsSetting) property LongDesc: def __get__ (self): return ccsSettingGetLongDesc (self.ccsSetting) property Group: def __get__ (self): return ccsSettingGetGroup (self.ccsSetting) property SubGroup: def __get__ (self): return ccsSettingGetSubGroup (self.ccsSetting) property Type: def __get__ (self): return SettingTypeString[ccsSettingGetType (self.ccsSetting)] property Info: def __get__ (self): return self.info property Hints: def __get__ (self): if not ccsSettingGetHints (self.ccsSetting): return [] else: return str (ccsSettingGetHints (self.ccsSetting)).split (";")[:-1] property IsDefault: def __get__ (self): if ccsSettingGetIsDefault (self.ccsSetting): return True return False property DefaultValue: def __get__ (self): return DecodeValue (ccsSettingGetDefaultValue (self.ccsSetting)) property Value: def __get__ (self): return DecodeValue (ccsSettingGetValue (self.ccsSetting)) def __set__ (self, value): cdef CCSSettingValue * sv sv = EncodeValue (value, self.ccsSetting, 0) ccsSetValue (self.ccsSetting, sv, 1) ccsFreeSettingValue (sv) property Integrated: def __get__ (self): return bool (ccsSettingIsIntegrated (self.ccsSetting)) property ReadOnly: def __get__ (self): return bool (ccsSettingIsReadOnly (self.ccsSetting)) cdef class SSGroup: cdef object screen def __cinit__ (self, screen): self.screen = screen property Screen: def __get__ (self): return self.screen def __set__ (self, value): self.screen = value cdef class Plugin: """A python representation of a CCSPlugin. You should not construct this object directly. Use context.Plugins['pluginname'] instead """ cdef CCSPlugin * ccsPlugin cdef Context context cdef object screen cdef object groups cdef object loaded cdef object ranking cdef object hasExtendedString def __cinit__ (self, Context context, name): self.ccsPlugin = ccsFindPlugin (context.ccsContext, name) self.context = context self.screen = {} self.groups = {} self.loaded = False self.ranking = {} self.hasExtendedString = False def Update (self): cdef CCSList * setlist cdef CCSList * glist cdef CCSList * sglist cdef CCSSetting * sett cdef CCSGroup * gr cdef CCSSubGroup * sgr cdef CCSSettingType t cdef CCSSettingInfo * i groupIndex = 0 glist = ccsGetPluginGroups (self.ccsPlugin) while glist != NULL: gr = glist.data self.groups[gr.name] = (groupIndex, {}) subGroupIndex = 0 sglist = gr.subGroups while sglist != NULL: sgr = sglist.data self.groups[gr.name][1][sgr.name] = (subGroupIndex, SSGroup ({})) subGroupIndex = subGroupIndex + 1 sglist = sglist.next groupIndex = groupIndex + 1 glist = glist.next setlist = ccsGetPluginSettings (self.ccsPlugin) self.hasExtendedString = False rank = 0 while setlist != NULL: sett = setlist.data subgroup = self.groups[ccsSettingGetGroup (sett)][1][ccsSettingGetSubGroup (sett)][1] setting = Setting (self, ccsSettingGetName (sett)) self.screen[ccsSettingGetName (sett)] = setting subgroup.Screen[ccsSettingGetName (sett)] = setting t = ccsSettingGetType (sett) i = ccsSettingGetInfo (sett) if t == TypeList: t = i.forList.listType i = i.forList.listInfo if t == TypeString and i.forString.extensible: self.hasExtendedString = True if not self.ranking.has_key (ccsSettingGetName (sett)): self.ranking[ccsSettingGetName (sett)] = rank rank = rank + 1 setlist = setlist.next self.loaded = True self.ApplyStringExtensions (True, self.Enabled) self.SortStringSettings () def SortStringSettings (self): for name, setting in self.Screen.items (): self.SortSingleStringSetting (setting) def SortSingleStringSetting (self, Setting setting): cdef CCSSettingType t cdef CCSSettingInfo * i t = ccsSettingGetType (setting.ccsSetting) i = ccsSettingGetInfo (setting.ccsSetting) if t == TypeList: t = i.forList.listType i = i.forList.listInfo if t != TypeString: return (itemsByName, listOfAddedItems) = \ StrRestrictionListToDict (i.forString.restriction, setting.extendedStrRestrictions) # Let base string restrictions be the ones given in the option metadata # in the base plugin plus the ones found in the extensions in the same # plugin. setting.baseStrRestrictions = \ listOfAddedItems + setting.baseStrRestrictions if i.forString.sortStartsAt < 0: # don't sort sortedItems = itemsByName.items () elif i.forString.sortStartsAt == 0: # Sort all items by value sortedItems = sorted (itemsByName.items (), key=StringSettingKeyFunc) else: # Sort first sortStartsAt many items by value and # the remaining ones by name itemsNotSorted = \ setting.baseStrRestrictions[:i.forString.sortStartsAt] itemsNotSortedSet = set (itemsNotSorted) allItemsSet = set (itemsByName.items ()) itemsSortedByName = sorted (list (allItemsSet - itemsNotSortedSet), key=operator.itemgetter (0)) sortedItems = itemsNotSorted + itemsSortedByName itemsByValue = {} for (index, (name, value)) in enumerate (sortedItems): itemsByValue[value] = (name, index) # Insert itemsByName and sortedItems into setting.info if ccsSettingGetType (setting.ccsSetting) == TypeList: setting.info = (setting.info[0], (itemsByName, itemsByValue, sortedItems)) else: setting.info = (itemsByName, itemsByValue, sortedItems) def ApplyStringExtensions (self, sortBaseSetting, extendOthersToo): cdef CCSStrExtensionList * extList cdef CCSStrExtension * ext cdef CCSString * baseSettingName cdef char * baseSettingNameValue cdef CCSStringList * baseSettingList cdef CCSSettingType t cdef CCSSettingInfo * i cdef CCSStrRestrictionList * restrictionList cdef CCSStrRestriction * restriction cdef Plugin basePlugin cdef Setting setting extList = ccsGetPluginStrExtensions (self.ccsPlugin) while extList: ext = extList.data # If not extending others and extension base is not self, skip if (not (extendOthersToo or ext.basePlugin == self.Name)) or \ ext.basePlugin not in self.context.Plugins: extList = extList.next continue basePlugin = self.context.Plugins[ext.basePlugin] baseSettingList = ext.baseSettings while baseSettingList: baseSettingName = baseSettingList.data baseSettingNameValue = baseSettingName.value settings = [basePlugin.Screen[baseSettingNameValue]] for settingItem in settings: setting = settingItem t = ccsSettingGetType (setting.ccsSetting) i = ccsSettingGetInfo (setting.ccsSetting) if t == TypeList: t = i.forList.listType i = i.forList.listInfo if not (t == TypeString and i.forString.extensible): return restrictionList = ext.restriction # Add each item in restriction list to the setting while restrictionList != NULL: restriction = restrictionList.data setting.extendedStrRestrictions[restriction.name] = \ restriction.value if ext.basePlugin == self.Name: setting.baseStrRestrictions.append ((restriction.name, restriction.value)) restrictionList = restrictionList.next if sortBaseSetting: basePlugin.SortSingleStringSetting (setting) baseSettingList = baseSettingList.next extList = extList.next def GetExtensionBasePlugins (self): cdef CCSStrExtensionList * extList cdef CCSStrExtension * ext basePlugins = set ([]) extList = ccsGetPluginStrExtensions (self.ccsPlugin) while extList: ext = extList.data basePlugins.add (self.context.Plugins[ext.basePlugin]) extList = extList.next return list (basePlugins) property Context: def __get__ (self): return self.context property Groups: def __get__ (self): if not self.loaded: self.Update () return self.groups property Screen: def __get__ (self): if not self.loaded: self.Update () return self.screen property Ranking: def __get__ (self): if not self.loaded: self.Update () return self.ranking property Name: def __get__ (self): return ccsPluginGetName (self.ccsPlugin) property ShortDesc: def __get__ (self): return ccsPluginGetShortDesc (self.ccsPlugin) property LongDesc: def __get__ (self): return ccsPluginGetLongDesc (self.ccsPlugin) property Category: def __get__ (self): return ccsPluginGetCategory (self.ccsPlugin) property Features: def __get__ (self): features = StringListToList ( ccsPluginGetProvidesFeaturesBindable (self.ccsPlugin)) return features property Initialized: def __get__ (self): return bool (self.loaded) property Enabled: def __get__ (self): return bool (ccsPluginIsActive (self.context.ccsContext, ccsPluginGetName (self.ccsPlugin))) def __set__ (self, val): if val: if len (self.EnableConflicts): return ccsPluginSetActive (self.ccsPlugin, True) else: if len (self.DisableConflicts): return ccsPluginSetActive (self.ccsPlugin, False) property EnableConflicts: def __get__ (self): cdef CCSPluginConflictList * pl, * pls cdef CCSPluginConflict * pc cdef CCSPluginList * ppl cdef CCSPlugin * plg if self.Enabled: return [] ret = [] pl = ccsCanEnablePlugin (self.context.ccsContext, self.ccsPlugin) pls = pl while pls != NULL: pc = pls.data rpl = [] ppl = pc.plugins while ppl != NULL: plg = ppl.data rpl.append (self.context.Plugins[ccsPluginGetName (plg)]) ppl = ppl.next ret.append ((ConflictTypeString[pc.type], pc.value, rpl)) pls = pls.next if pl != NULL: ccsPluginConflictListFree (pl, True) return ret property DisableConflicts: def __get__ (self): cdef CCSPluginConflictList * pl, * pls cdef CCSPluginConflict * pc cdef CCSPluginList * ppl cdef CCSPlugin * plg if not self.Enabled: return [] ret = [] pl = ccsCanDisablePlugin (self.context.ccsContext, self.ccsPlugin) pls = pl while pls != NULL: pc = pls.data rpl = [] ppl = pc.plugins while ppl != NULL: plg = ppl.data rpl.append (self.context.Plugins[ccsPluginGetName (plg)]) ppl = ppl.next ret.append ((ConflictTypeString[pc.type], pc.value, rpl)) pls = pls.next if pl != NULL: ccsPluginConflictListFree (pl, True) return ret cdef class Profile: cdef Context context cdef char * name def __cinit__ (self, Context context, name): self.context = context self.name = strdup (name) def __dealloc__ (self): free (self.name) def Delete (self): ccsDeleteProfile (self.context.ccsContext, self.name) property Name: def __get__ (self): return self.name cdef class Backend: cdef Context context cdef char * name cdef char * shortDesc cdef char * longDesc cdef Bool profileSupport cdef Bool integrationSupport def __cinit__ (self, Context context, info): self.context = context self.name = strdup (info[0]) self.shortDesc = strdup (info[1]) self.longDesc = strdup (info[2]) self.profileSupport = bool (info[3]) self.integrationSupport = bool (info[4]) def __dealloc__ (self): free (self.name) free (self.shortDesc) free (self.longDesc) property Name: def __get__ (self): return self.name property ShortDesc: def __get__ (self): return self.shortDesc property LongDesc: def __get__ (self): return self.longDesc property IntegrationSupport: def __get__ (self): return self.integrationSupport property ProfileSupport: def __get__ (self): return self.profileSupport cdef class Context: """A python representation of a CCSContext. This is the main entry-point into the compizconfig module. Typical usage: >>> context = Context() >>> plugin = context.Plugins['core'] >>> setting = plugin.Screen['number_of_desktops'] >>> print setting.Value 1 """ cdef CCSContext * ccsContext cdef object plugins cdef object categories cdef object profiles cdef object currentProfile cdef object backends cdef object currentBackend cdef Bool integration def __cinit__ (self, screenNum = 0, plugins = [], basic_metadata = False): cdef CCSPlugin * pl cdef CCSList * pll if basic_metadata: ccsSetBasicMetadata (True) self.plugins = {} if not len (plugins): self.ccsContext = ccsContextNew (screenNum, &ccsDefaultInterfaceTable) else: self.ccsContext = ccsEmptyContextNew (screenNum, &ccsDefaultInterfaceTable) for plugin in plugins: self.LoadPlugin (plugin) ccsReadSettings (self.ccsContext) pll = ccsContextGetPluginsBindable (self.ccsContext) self.categories = {} while pll != NULL: pl = pll.data self.plugins[ccsPluginGetName (pl)] = Plugin (self, ccsPluginGetName (pl)) if ccsPluginGetCategory (pl) == NULL: cat = '' else: cat = ccsPluginGetCategory (pl) if not self.categories.has_key (cat): self.categories[cat] = [] self.categories[cat].append (self.plugins[ccsPluginGetName (pl)]) pll = pll.next self.integration = ccsGetIntegrationEnabled (self.ccsContext) self.UpdateProfiles () def UpdateExtensiblePlugins (self): cdef Plugin plugin # Reset all extensible plugins for name, pluginItem in self.plugins.items (): plugin = pluginItem if plugin.hasExtendedString: plugin.Update () # Apply restricted string extensions for name, pluginItem in self.plugins.items (): plugin = pluginItem if plugin.Enabled: plugin.ApplyStringExtensions (False, True) # Sort restricted string settings for name, pluginItem in self.plugins.items (): plugin = pluginItem if plugin.Enabled and plugin.hasExtendedString: plugin.SortStringSettings () def __dealloc__ (self): ccsContextDestroy (self.ccsContext) def LoadPlugin (self, plugin): return ccsLoadPlugin (self.ccsContext, plugin) # Returns the settings that should be updated def ProcessEvents (self, flags = 0): ccsProcessEvents (self.ccsContext, flags) if len (self.ChangedSettings): self.Read () return True return False def Write (self, onlyChanged = True): if onlyChanged: ccsWriteChangedSettings (self.ccsContext) else: ccsWriteSettings (self.ccsContext) def Read (self): ccsReadSettings (self.ccsContext) def UpdateProfiles (self): self.profiles = {} self.currentProfile = Profile (self, ccsGetProfile (self.ccsContext)) cdef CCSStringList * profileList cdef CCSString * profileNameString cdef char * profileName profileList = ccsGetExistingProfiles (self.ccsContext) while profileList != NULL: profileNameString = profileList.data profileName = profileNameString.value self.profiles[profileName] = Profile (self, profileName) profileList = profileList.next self.backends = {} cdef CCSBackendInfoList * backendList cdef CCSBackendInfoList * origBackendList cdef CCSBackendInfo * backendInfo origBackendList = backendList = ccsGetExistingBackends (self.ccsContext) while backendList != NULL: backendInfo = backendList.data info = (backendInfo.name, backendInfo.shortDesc, backendInfo.longDesc, backendInfo.profileSupport, backendInfo.integrationSupport) self.backends[backendInfo.name] = Backend (self, info) backendList = backendList.next ccsBackendInfoListFree (origBackendList, True) self.currentBackend = self.backends[ccsGetBackend (self.ccsContext)] def ResetProfile (self): self.currentProfile = Profile (self, "") ccsSetProfile (self.ccsContext, "") ccsReadSettings (self.ccsContext) def Import (self, path, autoSave = True): ret = bool (ccsImportFromFile (self.ccsContext, path, True)) if autoSave: ccsWriteSettings (self.ccsContext) return ret def Export (self, path, skipDefaults = False): return bool (ccsExportToFile (self.ccsContext, path, skipDefaults)) property Plugins: def __get__ (self): return self.plugins property Categories: def __get__ (self): return self.categories property CurrentProfile: def __get__ (self): return self.currentProfile def __set__ (self, profile): self.currentProfile = profile ccsSetProfile (self.ccsContext, profile.Name) ccsReadSettings (self.ccsContext) property Profiles: def __get__ (self): return self.profiles property CurrentBackend: def __get__ (self): return self.currentBackend def __set__ (self, backend): self.currentBackend = backend ccsSetBackend (self.ccsContext, backend.Name) ccsReadSettings (self.ccsContext) property Backends: def __get__ (self): return self.backends property ChangedSettings: def __get__ (self): return SettingListToList (self, ccsContextGetChangedSettingsBindable (self.ccsContext)) def __set__ (self, value): cdef CCSSettingList * settingList cdef CCSSettingList * l cdef CCSSetting * setting ccsContextClearChangedSettings (self.ccsContext) if value != None and len (value) != 0: settingList = ListToSettingList (value) l = settingList while l: setting = l.data ccsContextAddChangedSetting (self.ccsContext, setting) l = l.next ccsSettingListFree (settingList, False) property AutoSort: def __get__ (self): return bool (ccsGetPluginListAutoSort (self.ccsContext)) def __set__ (self, value): ccsSetPluginListAutoSort (self.ccsContext, bool (value)) property Integration: def __get__ (self): return bool (self.integration) def __set__ (self, value): self.integration = value ccsSetIntegrationEnabled (self.ccsContext, value) ccsReadSettings (self.ccsContext) compiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/MANIFEST.in0000644000015301777760000000013712321343002025726 0ustar pbusernogroup00000000000000include TODO README INSTALL AUTHORS COPYING NEWS VERSION ChangeLog include Makefile MANIFEST.incompiz-0.9.11+14.04.20140409/compizconfig/compizconfig-python/README0000644000015301777760000000000012321343002025035 0ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/0000755000015301777760000000000012321344021021110 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/setup.py0000755000015301777760000001661612321343002022635 0ustar pbusernogroup00000000000000#!/usr/bin/env python import sys, os, glob import subprocess from stat import * from distutils.core import setup from distutils.command.install import install as _install from distutils.command.build import build as _build from distutils.command.install_data import install_data as _install_data INSTALLED_FILES = "installed_files" class build (_build): user_options = _build.user_options[:] user_options.extend ([('version=', None, "Version of the package")]) def initialize_options(self): self.version = None _build.initialize_options (self) def finalize_options(self): _build.finalize_options (self) class install (_install): user_options = _install.user_options[:] user_options.extend ([('version=', None, "Version of the package")]) def initialize_options(self): self.version = None _install.initialize_options (self) def finalize_options(self): _install.finalize_options (self) def run (self): _install.run (self) icon_prefix = '%s/share/ccsm/icons/hicolor' % prefix icon_theme_cache = '%s/icon-theme.cache' % icon_prefix print ("icon_prefix ", icon_prefix) print ("icon_theme_cache ", icon_theme_cache) outputs = self.get_outputs () # Update icon cache gtk_update_icon_cache = '''gtk-update-icon-cache -f -t \ %s''' % icon_prefix root_specified = len (filter (lambda s: s.startswith ("--root"), sys.argv)) > 0 if not root_specified: print "Updating Gtk icon cache." os.system (gtk_update_icon_cache) outputs.append (icon_theme_cache) else: print '''*** Icon cache not updated. After install, run this: *** %s''' % gtk_update_icon_cache length = 0 if self.root: length += len (self.root) if self.prefix: length += len (self.prefix) if length: for counter in xrange (len (outputs)): outputs[counter] = outputs[counter][length:] data = "\n".join (outputs) try: file = open (INSTALLED_FILES, "w") except: self.warn ("Could not write installed files list %s" % \ INSTALLED_FILES) return file.write (data) file.close () class install_data (_install_data): def run (self): def chmod_data_file (file): try: os.chmod (file, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) except: self.warn ("Could not chmod data file %s" % file) _install_data.run (self) map (chmod_data_file, self.get_outputs ()) class uninstall (_install): user_options = _install.user_options[:] user_options.extend ([('version=', None, "Version of the package")]) def initialize_options(self): self.version = None _install.initialize_options (self) def finalize_options(self): _install.finalize_options (self) def run (self): try: file = open (INSTALLED_FILES, "r") except: self.warn ("Could not read installed files list %s" % \ INSTALLED_FILES) return files = file.readlines () file.close () prepend = "" if self.root: prepend += self.root if self.prefix: prepend += self.prefix if len (prepend): for counter in xrange (len (files)): files[counter] = prepend + files[counter].rstrip () for file in files: print "Uninstalling %s" % file try: os.unlink (file) except: self.warn ("Could not remove file %s" % file) ops = ("install", "build", "sdist", "uninstall", "clean") if len (sys.argv) < 2 or sys.argv[1] not in ops: print "Please specify operation : %s" % " | ".join (ops) raise SystemExit prefix = None if len (sys.argv) > 2: i = 0 for o in sys.argv: if o.startswith ("--prefix"): if o == "--prefix": if len (sys.argv) >= i: prefix = sys.argv[i + 1] sys.argv.remove (prefix) elif o.startswith ("--prefix=") and len (o[9:]): prefix = o[9:] sys.argv.remove (o) break i += 1 if not prefix and "PREFIX" in os.environ: prefix = os.environ["PREFIX"] if not prefix or not len (prefix): prefix = "/usr/local" if sys.argv[1] in ("install", "uninstall") and len (prefix): sys.argv += ["--prefix", prefix] for arg in sys.argv: if "--version" in arg: VERSION = arg.split ("=")[1] f = open (os.path.join ("ccm/Constants.py.in"), "rt") data = f.read () f.close () data = data.replace ("@prefix@", prefix) data = data.replace ("@version@", VERSION) f = open (os.path.join ("ccm/Constants.py"), "wt") f.write (data) f.close () cmd = "intltool-merge -d -u po/ ccsm.desktop.in ccsm.desktop".split(" ") proc = subprocess.Popen(cmd) proc.wait() custom_images = [] data_files = [ ("share/applications", ["ccsm.desktop"]), ] global_icon_path = "share/icons/hicolor/" local_icon_path = "share/ccsm/icons/hicolor/" for dir, subdirs, files in os.walk("images/"): if dir == "images/": for file in files: custom_images.append(dir + file) else: images = [] global_images = [] for file in files: if file.find(".svg") or file.find(".png"): file_path = "%s/%s" % (dir, file) # global image if file[:-4] == "ccsm": global_images.append(file_path) # local image else: images.append(file_path) # local if len(images) > 0: data_files.append((local_icon_path + dir[7:], images)) # global if len(global_images) > 0: data_files.append((global_icon_path + dir[7:], global_images)) data_files.append(("share/ccsm/images", custom_images)) podir = os.path.join (os.path.realpath ("."), "po") if os.path.isdir (podir): buildcmd = "msgfmt -o build/locale/%s/ccsm.mo po/%s.po" mopath = "build/locale/%s/ccsm.mo" destpath = "share/locale/%s/LC_MESSAGES" for name in os.listdir (podir): if name[-2:] == "po": name = name[:-3] if sys.argv[1] == "build" \ or (sys.argv[1] == "install" and \ not os.path.exists (mopath % name)): if not os.path.isdir ("build/locale/" + name): os.makedirs ("build/locale/" + name) os.system (buildcmd % (name, name)) data_files.append ((destpath % name, [mopath % name])) setup ( name = "ccsm", version = VERSION, description = "CompizConfig Settings Manager", author = "Patrick Niklaus", author_email = "marex@opencompositing.org", url = "https://launchpad.net/compiz", license = "GPL", data_files = data_files, packages = ["ccm"], scripts = ["ccsm"], cmdclass = {"build" : build, "uninstall" : uninstall, "install" : install, "install_data" : install_data} ) os.remove ("ccm/Constants.py") compiz-0.9.11+14.04.20140409/compizconfig/ccsm/Makefile0000644000015301777760000000027512321343002022552 0ustar pbusernogroup00000000000000all: @python setup.py build --prefix=${PREFIX} install: all @python setup.py install --prefix=${PREFIX} uninstall: @python setup.py uninstall --prefix=${PREFIX} clean: rm -rf build/ compiz-0.9.11+14.04.20140409/compizconfig/ccsm/ccsm.desktop.in0000644000015301777760000000034212321343002024032 0ustar pbusernogroup00000000000000[Desktop Entry] Encoding=UTF-8 _Name=CompizConfig Settings Manager _Comment=Configure Compiz with CompizConfig Icon=ccsm Exec=ccsm Terminal=false Type=Application Categories=Compiz;Settings;DesktopSettings; StartupNotify=true compiz-0.9.11+14.04.20140409/compizconfig/ccsm/INSTALL0000644000015301777760000000070212321343002022136 0ustar pbusernogroup00000000000000This software depends on Python and PyGTK >= 2.12 sexy-python (libsexy bindings) is also used but optionnal. Of course librsvg-common is needed for a proper svg support in gtk/gdk. Run the setup.py script to install, e.g.: python setup.py install (as root, or with root rights using sudo) To install it to /usr/local (or any other prefix) use: python setup.py install --prefix=/usr/local (specify --prefix _after_ install or it won't work) compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/0000755000015301777760000000000012321344021021526 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/fa.po0000644000015301777760000002626012321343002022460 0ustar pbusernogroup00000000000000# Translation of ccsm.po into Persian. # Copyright (C) 2008 Compiz-Fusion Developers # This file is distributed under the same license as the Compiz-Fusion package. # Ali Tarihi , 2008. # Mohammad Ebrahim Mohammadi Panah , 2008. # msgid "" msgstr "" "Project-Id-Version: Compiz-Fusion ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2008-01-29 13:04+0100\n" "PO-Revision-Date: 2008-02-07 19:21+0100\n" "Last-Translator: Ali Tarihi \n" "Language-Team: l10n.ir\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)ها را ØºÛŒØ±ÙØ¹Ø§Ù„ Ú©Ù†" #, python-format msgid "Don't set %(action)s" msgstr "" #, python-format msgid "Set %(action)s anyway" msgstr "" #, python-format #, fuzzy msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "شما سعی دارید Ú©Ù‡ از قابلیت %(feature)ها Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید Ú©Ù‡ توسط " "هیچپلاگینی ÙØ±Ø§Ù‡Ù… نشده است.\n" "آیا می‌خواید به هر حال از این قابلیت Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید؟" #, python-format #, fuzzy msgid "Use %(feature)s" msgstr "از %(feature)ها Ø§Ø³ØªÙØ§Ø¯Ù‡ Ú©Ù†" #, python-format msgid "Don't use %(feature)s" msgstr "از %(feature)ها Ø§Ø³ØªÙØ§Ø¯Ù‡ Ù†Ú©Ù†" #, python-format #, fuzzy msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "شما دارید سعی می‌کنید Ú©Ù‡ از قابلیت %(feature)ها Ú©Ù‡ توسط " "%(plugin)ها ایجاد شده است.\n" "این پلاگین هم اکنون ØºÛŒØ±ÙØ¹Ø§Ù„ است.\n" "آیا می‌خواهید Ú©Ù‡ %(plugin)ها ÙØ¹Ø§Ù„ گردد تا قابلیت در دسترس باشد؟" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)ها را ÙØ¹Ø§Ù„ Ú©Ù†" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)ها را ÙØ¹Ø§Ù„ Ù†Ú©Ù†" #, python-format #, fuzzy msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "پلاگین %(plugin_conflict)ها امکان %(feature)ها را اختیار " "می‌گذارد Ú©Ù‡ به وسیله %(plugin)ها نیز در اختیار قرار می‌گیرد." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)ها را ØºÛŒØ±ÙØ¹Ø§Ù„ Ú©Ù†" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)ها را ÙØ¹Ø§Ù„ Ù†Ú©Ù†" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "پلاگین %(plugin_conflict)ها با %(plugin)ها ناسازگار است." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)ها نیاز به قابلیت %(feature)ها دارد Ú©Ù‡ به وسیله این " "پلاگینها بدست می‌آید:\n" "%(plugin_list)ها" msgid "Enable these plugins" msgstr "این پلاگین ها را ÙØ¹Ø§Ù„ Ú©Ù†" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s نیازمند پلاگین %(require)ها می‌باشد." #, python-format msgid "Enable %(require)s" msgstr "%(require)ها را ÙØ¹Ø§Ù„ Ú©Ù†" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)ها قابلیت %(feature)ها را Ú©Ù‡ مورد نیاز پلاگینهای " "%(plugin_list)ها است، ÙØ±Ø§Ù‡Ù… می‌آورد." msgid "Disable these plugins" msgstr "این پلاگینها را غیر ÙØ¹Ø§Ù„ Ú©Ù†" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)ها را غیر ÙØ¹Ø§Ù„ Ú©Ù†" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)ها مورد نیاز %(plugin_list)ها می‌باشد." msgid "General" msgstr "همگانی" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "رومیزی" msgid "Extras" msgstr "" msgid "Window Management" msgstr "مدیریت پنجره" msgid "Effects" msgstr "جلوه‌ها" msgid "Image Loading" msgstr "بارگذاری تصویر" msgid "Utility" msgstr "ابزار" #, fuzzy msgid "Reset setting to the default value" msgstr "بازنشانی به مقدار Ù¾ÛŒØ´â€ŒÙØ±Ø¶" msgid "Browse for " msgstr "" msgid "Images" msgstr "تصاویر" msgid "File" msgstr "ÙØ§ÛŒÙ„" msgid "Open directory..." msgstr "بازکردن پوشه..." msgid "Open file..." msgstr "باز کردن ÙØ§ÛŒÙ„..." msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "تنظیمات چند-لیستی. شما می‌توانید با دوکلیک کردن یک سطر، مقادیر آن را ویرایش " "کنید. " msgid "Edit" msgstr "ویرایش" #, python-format msgid "Value (%s)" msgstr "مقدار (%s)" #, python-format msgid "Edit %s" msgstr "ویرایش %s" #, python-format msgid "Value (%(value)s) for %(setting)s" msgstr "مقدار (%(value)ها) برای %(setting)ها" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" یک میانبر معتبر نیست" msgid "Disabled" msgstr "ØºÛŒØ±ÙØ¹Ø§Ù„" msgid "Enabled" msgstr "ÙØ¹Ø§Ù„" #, fuzzy msgid "Grab key combination" msgstr "Ú¯Ø±ÙØªÙ† ترکیب کلیدها" msgid "Computing possible conflicts, please wait" msgstr "محاسبه ناسازگاریهای ممکن، Ù„Ø·ÙØ§ صبر کنید" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" یک دکمه معتبر نیست" #, python-format #, fuzzy msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Ø§Ø³ØªÙØ§Ø¯Ù‡ از Button1 بدون تغییر دهنده می‌تواند جلوی هر کلیک Ú†Ù¾ÛŒ را بگیرد Ùˆ " "بدین‌سان تنظیمات شما را خراب کند. آیا واقعا تمایل دارید Ú©Ù‡ دکمه \"%s\" را به " "Button1 اختصاص دهید؟" #, python-format #, fuzzy msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" یک Mask معتبر نیست" msgid "None" msgstr "هیچ یک" #, python-format msgid "Unhandled list type %s for %s" msgstr "" msgid "CompizConfig Settings Manager" msgstr "" msgid "Filter" msgstr "Ùیلتر" msgid "Filter your Plugin list" msgstr "لیست پلاگین‌های خود را Ùیلتر نمایید" #, python-format msgid "Screen %i" msgstr "ØµÙØ­Ù‡ %i" msgid "Screen" msgstr "ØµÙØ­Ù‡" #. Settings msgid "All" msgstr "همه" msgid "Uncategorized" msgstr "دسته‌بندی نشده" #, fuzzy msgid "Category" msgstr "دسته" msgid "Advanced Search" msgstr "جستجوی Ù¾ÛŒØ´Ø±ÙØªÙ‡" msgid "Preferences" msgstr "" #, python-format msgid "Enable %s" msgstr "%s را ÙØ¹Ø§Ù„ Ú©Ù†" msgid "Please press the new key combination" msgstr "Ù„Ø·ÙØ§ ترکیب کلید جدید را ÙØ´Ø§Ø± دهید" msgid "Window Title" msgstr "عنوان پنجره" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "نام پنجره" msgid "Window Class" msgstr "رده پنجره" msgid "Window Type" msgstr "نوع پنجره" msgid "Window ID" msgstr "" msgid "And" msgstr "Ùˆ" msgid "Or" msgstr "یا" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "نوع" #. Value msgid "Value" msgstr "مقدار" msgid "Grab" msgstr "Ú¯Ø±ÙØªÙ†" #. Relation msgid "Relation" msgstr "ارتباط" #. Invert msgid "Invert" msgstr "معکوس" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "این یک مدیر تنظیمات برای سیستم تنظیمات CompizConfig می‌باشد" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "یک خطا رخ داده است." msgid "Warning" msgstr "هشدار" #, python-format msgid "Search %s Plugin Options" msgstr "جستجوی گزینه‌های پلاگین %s" msgid "Use This Plugin" msgstr "از این پلاگین Ø§Ø³ØªÙØ§Ø¯Ù‡ Ú©Ù†" msgid "Search Compiz Core Options" msgstr "گزینه‌های هسته Compiz را جستجو Ú©Ù†" msgid "Error" msgstr "خطا" msgid "Search in..." msgstr "جستجو Ú©Ù† در..." msgid "Short description and name" msgstr "توضیح کوتاه Ùˆ نام" msgid "Long description" msgstr "توضیح بلند" msgid "Settings value" msgstr "قرار دادن مقدار" #. Notebook msgid "Settings" msgstr "تنظیمات" #, fuzzy msgid "Add a New Profile" msgstr "اضاÙÙ‡ کردن یک مشخصات جدید" #, fuzzy msgid "Remove This Profile" msgstr "حذ٠این مشخصات" msgid "Default" msgstr "Ù¾ÛŒØ´â€ŒÙØ±Ø¶" #, fuzzy msgid "Profile" msgstr "مشخصات" msgid "Import" msgstr "" msgid "Import a CompizConfig Profile" msgstr "" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "" msgid "All files" msgstr "" msgid "Save file.." msgstr "" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/ko.po0000644000015301777760000003212112321343002022474 0ustar pbusernogroup00000000000000# ccsm Korean translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Jeong Seungwon (jeongsw) , # Hyunho Kwak (coolhex) , # Lee June Hee (bugbear5) , # Gyu Cheol Lee(supaflow), 2008 # msgid "" msgstr "" "Project-Id-Version: ccsm 0.7.4\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-08-30 18:12+0200\n" "Last-Translator: Lee June Hee \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(plugin)s 플러그ì¸ì˜ %(action)s ë™ìž‘ì— ëŒ€í•œ %(binding)s ë°”ì¸ë”©" "ì˜ ìƒˆë¡œìš´ ê°’ì€ %(plugin_conflict)s 플러그ì¸ì˜ %(action_conflict)s ë™ìž‘ê³¼ ì¶©ëŒí•©ë‹ˆë‹¤.\n" "(plugin_conflict)s 플러그ì¸ì˜ %(action_conflict)s ë™ìž‘ì„ ë¹„í™œì„±" "화시키시겠습니까?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)sì„(를) 사용하지 않ìŒ" #, python-format msgid "Don't set %(action)s" msgstr "%(action)sì„(를) 설정하지 않ìŒ" #, python-format msgid "Set %(action)s anyway" msgstr "무조건 %(action)sì„(를) 설정" msgid "key" msgstr "키" msgid "button" msgstr "버튼" msgid "edge" msgstr "모서리" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "ì–´ë–¤ 플러그ì¸ì—ì„œë„ ì œê³µí•˜ì§€ 않는 %(feature)s ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë ¤" "ê³  합니다.\n" "어쨌든 ì´ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)sì„(를) 사용하지 않ìŒ" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)sì„(를) 사용하지 않ìŒ" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "%(plugin)s 플러그ì¸ì— ì˜í•´ 제공ë˜ëŠ” %(feature)s ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë ¤" "ê³  합니다.\n" "ì´ í”ŒëŸ¬ê·¸ì¸ì€ 현재 비활성화ë˜ì–´ 있습니다.\n" "%(plugin)s 플러그ì¸ì„ 활성화시키시겠습니까?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s 플러그ì¸ì„ 활성화" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)sì„(를) 사용하지 않ìŒ" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "%(plugin)s 플러그ì¸ì˜ %(bindings)s ë°”ì¸ë”©ì€ 다른 플러그ì¸ê³¼ ì¶©ëŒí•©ë‹ˆ" "다. ì´ ì¶©ëŒì„ 해결하겠습니까?" msgid "Resolve conflicts" msgstr "ì¶©ëŒ í•´ê²°" msgid "Ignore conflicts" msgstr "ì¶©ëŒ ë¬´ì‹œ" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s 플러그ì¸ì€ %(feature)s ê¸°ëŠ¥ì„ ì œê³µí•˜ë©°,ì´ " "ê¸°ëŠ¥ì€ %(plugin)s 플러그ì¸ì— ì˜í•´ì„œë„ 제공ë˜ê³  있습니다." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s를 사용하지 않ìŒ" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s를 사용하지 않ìŒ" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "%(plugin_conflict)s 플러그ì¸ì€ %(plugin)s 플러그ì¸ê³¼ ì¶©ëŒí•©ë‹ˆ" "다." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s는 ë‹¤ìŒ í”ŒëŸ¬ê·¸ì¸ì— ì˜í•´ 제공ë˜ëŠ” %(feature)s ê¸°ëŠ¥ì´ " "필요합니다:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "ì´ í”ŒëŸ¬ê·¸ì¸ë“¤ì„ 사용함" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "%(plugin)s 플러그ì¸ì€ %(require)s 플러그ì¸ì„ 필요로 합니다." #, python-format msgid "Enable %(require)s" msgstr "%(require)s를 활성화" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s 플러그ì¸ì€ %(plugin_list)s 플러그ì¸ì— ì˜í•´ 제공ë˜ëŠ” " "%(feature)s ê¸°ëŠ¥ì„ í•„ìš”ë¡œ 합니다." msgid "Disable these plugins" msgstr "ì´ í”ŒëŸ¬ê·¸ì¸ë“¤ì„ 비활성화" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s 플러그ì¸ì„ 비활성화하지 않ìŒ" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin_list)s 플러그ì¸ì€ %(plugin)s 플러그ì¸ì„ 필요로 합니다." msgid "General" msgstr "ì¼ë°˜" msgid "Accessibility" msgstr "접근가능 ì •ë„" msgid "Desktop" msgstr "ë°ìФí¬íƒ‘" msgid "Extras" msgstr "기타" msgid "Window Management" msgstr "ì°½ 관리" msgid "Effects" msgstr "효과" msgid "Image Loading" msgstr "ì´ë¯¸ì§€ 불러오기" msgid "Utility" msgstr "유틸리티" msgid "All" msgstr "모ë‘" msgid "Uncategorized" msgstr "분류 ì—†ìŒ" msgid "N/A" msgstr "ì—†ìŒ" msgid "Reset setting to the default value" msgstr "ì„¤ì •ì„ ê¸°ë³¸ê°’ìœ¼ë¡œ 초기화" msgid "Edit" msgstr "수정" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "다중 ëª©ë¡ ì„¤ì •. í–‰ì„ ë”블 í´ë¦­í•˜ì—¬ ê°’ì„ ë°”ê¿€ 수 있습니다." #, python-format msgid "Edit %s" msgstr "%s 수정" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\"ì€(는) 유효한 단축키가 아닙니다." msgid "Disabled" msgstr "비활성화ë¨" msgid "Enabled" msgstr "활성화ë¨" msgid "Grab key combination" msgstr "키 ì¡°í•©" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\"ì€(는) 유효한 ë²„íŠ¼ì´ ì•„ë‹™ë‹ˆë‹¤." #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "버튼1ì„ ë‹¤ë¥¸ 키와 함께 설정하지 않으면, 왼쪽 마우스 ë²„íŠ¼ì„ í´ë¦­í•  수 없게 ë©" "니다.ì •ë§ë¡œ \"%s\" ë²„íŠ¼ì„ ë²„íŠ¼1로 설정하시겠습니까?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\"ì€(는) 유효한 가장ìžë¦¬ê°€ 아닙니다. " msgid "None" msgstr "ì—†ìŒ" msgid "CompizConfig Settings Manager" msgstr "컴피즈 설정 관리ìž" msgid "Plugin" msgstr "í”ŒëŸ¬ê·¸ì¸ ëª©ë¡" msgid "Please press the new key combination" msgstr "새로운 키 ì¡°í•©ì„ ëˆ„ë¥´ì„¸ìš”." msgid "Window Title" msgstr "ì°½ 제목" msgid "Window Role" msgstr "ì°½ ì—­í• " msgid "Window Name" msgstr "ì°½ ì´ë¦„" msgid "Window Class" msgstr "ì°½ 종류" msgid "Window Type" msgstr "ì°½ 종류" msgid "Window ID" msgstr "ì°½ ID" msgid "And" msgstr "그리고" msgid "Or" msgstr "ë˜ëŠ”" msgid "Edit match" msgstr "편집" #. Type msgid "Type" msgstr "종류" #. Value msgid "Value" msgstr "ê°’ (%s)" msgid "Grab" msgstr "붙잡기" #. Relation msgid "Relation" msgstr "관계" #. Invert msgid "Invert" msgstr "반전" msgid "Browse..." msgstr "다ìŒì„ 찾아보기: " msgid "Images" msgstr "ì´ë¯¸ì§€" msgid "File" msgstr "파ì¼" msgid "Open directory..." msgstr "디렉토리 열기..." msgid "Open file..." msgstr "íŒŒì¼ ì—´ê¸°..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "컴피즈 환경 설정 ì‹œìŠ¤í…œì˜ ì„¤ì • 관리ìžìž…니다." msgid "translator-credits" msgstr "번역ìž" msgid "An error has occured" msgstr "ì—러가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." msgid "Warning" msgstr "경고" #, python-format msgid "Enable %s" msgstr "%sì„(를) 활성화" msgid "Filter" msgstr "í•„í„°" #, python-format msgid "Search %s Plugin Options" msgstr "%s í”ŒëŸ¬ê·¸ì¸ ì˜µì…˜ì„ ê²€ìƒ‰" msgid "Use This Plugin" msgstr "ì´ í”ŒëŸ¬ê·¸ì¸ì„ 사용" msgid "Search Compiz Core Options" msgstr "컴피즈 코어 옵션 검색" msgid "Error" msgstr "ì—러" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "필터를 입력하십시오.\n" "검색할 키를 붙잡기 위하여 키보드 ê·¸ë¦¼ì„ í´ë¦­í•˜ì‹­ì‹œì˜¤." msgid "Search in..." msgstr "다ìŒì—서 검색..." #. Options msgid "Short description and name" msgstr "ì´ë¦„ê³¼ ì§§ì€ ì„¤ëª…" msgid "Long description" msgstr "긴 설명" msgid "Settings value" msgstr "설정 ê°’" msgid "Group" msgstr "그룹" msgid "Subgroup" msgstr "하위 그룹" #. Notebook msgid "Settings" msgstr "설정" msgid "Loading Advanced Search" msgstr "고급 검색" msgid "Add a New Profile" msgstr "새로운 프로필 추가" msgid "Remove This Profile" msgstr "ì´ í”„ë¡œí•„ ì‚­ì œ" msgid "Default" msgstr "기본값" msgid "Profile" msgstr "프로필" msgid "Import" msgstr "가져오기" msgid "Import a CompizConfig Profile" msgstr "컴피즈 프로필 가져오기" msgid "Import as..." msgstr "다ìŒìœ¼ë¡œ 가져오기..." msgid "Import a CompizConfig Profile as a new profile" msgstr "컴피즈 í”„ë¡œí•„ì„ ìƒˆë¡œìš´ 프로필로 가져오기" msgid "Export" msgstr "내보내기" msgid "Export your CompizConfig Profile" msgstr "컴피즈 프로필 내보내기" msgid "Reset to defaults" msgstr "기본값으로 초기화" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "컴피즈 í”„ë¡œí•„ì„ ì „ì—­ 기본값으로 초기화" msgid "Backend" msgstr "백엔드" msgid "Integration" msgstr "통합" msgid "Enable integration into the desktop environment" msgstr "ë°ìФí¬íƒ‘ í™˜ê²½ì— í†µí•©í•¨" msgid "Profiles (*.profile)" msgstr "프로필 (*.profile)" msgid "All files" msgstr "모든 파ì¼" msgid "Save file.." msgstr "íŒŒì¼ ì €ìž¥.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "í”„ë¡œí•„ì„ ë‚´ë³´ë‚¼ 때 기본 설정 ê°’ì„ ìƒëžµí•˜ì‹œê² ìŠµë‹ˆê¹Œ?" msgid "Open file.." msgstr "íŒŒì¼ ì—´ê¸°..." msgid "Enter a profile name" msgstr "프로필 ì´ë¦„ ìž…ë ¥" msgid "Please enter a name for the new profile:" msgstr "새로운 í”„ë¡œí•„ì— ëŒ€í•œ ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”:" msgid "Backend not found." msgstr "백엔드를 ì°¾ì„ ìˆ˜ 없습니다." #. Auto sort msgid "Automatic plugin sorting" msgstr "플러그ì¸ì„ ìžë™ìœ¼ë¡œ 정렬함" msgid "Disabled Plugins" msgstr "ë¹„í™œì„±í™”ëœ í”ŒëŸ¬ê·¸ì¸ë“¤" msgid "Enabled Plugins" msgstr "í™œì„±í™”ëœ í”ŒëŸ¬ê·¸ì¸ë“¤" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "í”ŒëŸ¬ê·¸ì¸ ìžë™ ì •ë ¬ ê¸°ëŠ¥ì„ í•´ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ? ì¶©ëŒ ì²˜ë¦¬ ê¸°ëŠ¥ë„ í•´ì œë©ë‹ˆë‹¤. ì´ê²ƒ" "ì— ëŒ€í•´ì„œ 잘 아는 경우ì—ë§Œ 계ì†í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤." msgid "Add plugin" msgstr "í”ŒëŸ¬ê·¸ì¸ ì¶”ê°€" msgid "Plugin name:" msgstr "í”ŒëŸ¬ê·¸ì¸ ì´ë¦„:" msgid "Insert plugin name" msgstr "í”ŒëŸ¬ê·¸ì¸ ì´ë¦„ 삽입" msgid "Preferences" msgstr "환경 설정" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "백엔드와 프로필 그리고 컴피즈 환경 설정 ì‹œìŠ¤í…œì— ì˜í•´ 사용ë˜ëŠ” 다른 ë‚´ë¶€ 설정" "들ì„변경합니다." msgid "About" msgstr "ì •ë³´" msgid "About CCSM..." msgstr "CCSM ì •ë³´..." msgid "Profile & Backend" msgstr "프로필 ë° ë°±ì—”ë“œ" msgid "Plugin List" msgstr "í”ŒëŸ¬ê·¸ì¸ ëª©ë¡" msgid "Filter your Plugin list" msgstr "í”ŒëŸ¬ê·¸ì¸ ëª©ë¡ì„ í•„í„°ë§í•©ë‹ˆë‹¤." #, python-format msgid "Screen %i" msgstr "화면 %i" msgid "Screen" msgstr "화면" msgid "Category" msgstr "분류" msgid "Advanced Search" msgstr "고급 검색" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "ì¼ì¹˜í•˜ëŠ” í•­ëª©ì´ ì—†ìŠµë‹ˆë‹¤. \n" "\n" " \"%s\"ì€(는) ì–´ëŠ í•­ëª©ê³¼ë„ ì¼ì¹˜í•˜ì§€ 않습니다." msgid "Configure Compiz with CompizConfig" msgstr "CompizConfig으로 Compiz 설정" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "가능한 ì¶©ëŒì„ 계산하고 있습니다. 잠시만 기다려주세요." #~ msgid "Value (%s)" #~ msgstr "ê°’ (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)sì— ëŒ€í•œ ê°’ (%(value)s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "처리ë˜ì§€ ì•Šì€ ëª©ë¡ íƒ€ìž… %s - %s" #~ msgid "Actions" #~ msgstr "ë™ìž‘" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/zh_CN.po0000644000015301777760000003001012321343002023057 0ustar pbusernogroup00000000000000# translation of zh_CN-ccsm.po to Chinese # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Thruth , 2007 # msgid "" msgstr "" "Project-Id-Version: zh_CN-ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-11-07 20:05+0100\n" "Last-Translator: JING Cheng \n" "Language-Team: Chinese\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(binding)s组åˆ%(action)s动作的新值在%(plugin)sæ’件中与%" "(plugin_conflict)sæ’件中的动作%(action_conflict)s相冲çªã€‚\n" "您è¦ç¦ç”¨%(plugin_conflict)sæ’件中的%(action_conflict)så—?" #, python-format msgid "Disable %(action_conflict)s" msgstr "ç¦ç”¨%(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "ä¸è¦è®¾ç½®%(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "强制设置%(action)s" msgid "key" msgstr "按键" msgid "button" msgstr "按钮" msgid "edge" msgstr "边缘" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "您试图使用%(feature)s功能,而该功能ä¸è¢«ä»»ä½•æ’件所支æŒã€‚\n" "您ä»ç„¶å¸Œæœ›å°è¯•使用此功能å—?" #, python-format msgid "Use %(feature)s" msgstr "使用%(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "ä¸ä½¿ç”¨%(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "您试图使用%(feature)s功能,该功能由%(plugin)sæ’ä»¶æä¾›ã€‚\n" "该æ’ä»¶ç›®å‰è¢«ç¦ç”¨ã€‚\n" "您ä»ç„¶å¸Œæœ›å¯ç”¨%(plugin)sæ’件以实现功能å—?" #, python-format msgid "Enable %(plugin)s" msgstr "å¯ç”¨æ’ä»¶%(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "ä¸è¦å¯ç”¨%(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "æ’ä»¶%(plugin)s中的一些按键组åˆ%(bindings)s与其它æ’件产生了冲çªã€‚您是å¦" "想è¦è§£å†³è¿™äº›å†²çªï¼Ÿ" msgid "Resolve conflicts" msgstr "解决冲çª" msgid "Ignore conflicts" msgstr "忽略冲çª" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)sæ’ä»¶æä¾›%(feature)s功能,该功能也å¯ä»¥ç”±%" "(plugin)sæä¾›" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "ç¦ç”¨%(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "ä¸è¦å¯ç”¨æ’ä»¶%(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "æ’ä»¶%(plugin_conflict)så’Œ%(plugin)s冲çªã€‚" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s需è¦%(feature)s功能,å¯ä»¥ç”±ä¸‹åˆ—æ’ä»¶æä¾›:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "å¯ç”¨è¿™äº›æ’ä»¶" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s需è¦%(require)sæ’件。" #, python-format msgid "Enable %(require)s" msgstr "å¯ç”¨%(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin_list)sæ’件需è¦%(plugin)sæä¾›çš„%(feature)s功能。" msgid "Disable these plugins" msgstr "ç¦ç”¨è¿™äº›æ’ä»¶" #, python-format msgid "Don't disable %(plugin)s" msgstr "ä¸è¦ç¦ç”¨%(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "æ’ä»¶%(plugin)s被æ’ä»¶%(plugin_list)s需è¦ã€‚" msgid "General" msgstr "常规" msgid "Accessibility" msgstr "辅助功能" msgid "Desktop" msgstr "桌é¢" msgid "Extras" msgstr "附加功能" msgid "Window Management" msgstr "窗å£ç®¡ç†" msgid "Effects" msgstr "特效" msgid "Image Loading" msgstr "图åƒåŠ è½½" msgid "Utility" msgstr "工具" msgid "All" msgstr "全部" msgid "Uncategorized" msgstr "未分类" msgid "N/A" msgstr "æ— " msgid "Reset setting to the default value" msgstr "é‡ç½®ä¸ºé»˜è®¤å€¼" msgid "Edit" msgstr "编辑" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "多选列表设置。你å¯ä»¥åŒå‡»ä¸€è¡Œå¯¹è¯¥å€¼è¿›è¡Œç¼–辑。" #, python-format msgid "Edit %s" msgstr "编辑%s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\"䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„å¿«æ·é”®" msgid "Disabled" msgstr "å·²ç¦ç”¨" msgid "Enabled" msgstr "å·²å¯ç”¨" msgid "Grab key combination" msgstr "èŽ·å–æŒ‰é”®ç»„åˆ" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\"䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„æŒ‰é”®" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "在ä¸ä½¿ç”¨ä¿®æ­£é”®çš„æƒ…况下使用按键1会导致所有的左键点击失çµä»Žè€Œä¸­æ–­æ‚¨çš„é…置。你真" "çš„æƒ³è¦æŠŠ\"%s\"设置到按键1上å—?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "边缘蒙æ¿\"%s\"无效" msgid "None" msgstr "æ— " msgid "CompizConfig Settings Manager" msgstr "CompizConfig设置管ç†å™¨" msgid "Plugin" msgstr "æ’ä»¶" msgid "Please press the new key combination" msgstr "请按下新按键组åˆ" msgid "Window Title" msgstr "çª—å£æ ‡é¢˜" msgid "Window Role" msgstr "窗å£è§’色" msgid "Window Name" msgstr "窗å£åç§°" msgid "Window Class" msgstr "窗å£ç±»åˆ«" msgid "Window Type" msgstr "窗å£ç±»åž‹" msgid "Window ID" msgstr "窗å£ID" msgid "And" msgstr "å’Œ" msgid "Or" msgstr "或" msgid "Edit match" msgstr "编辑匹é…" #. Type msgid "Type" msgstr "类型" #. Value msgid "Value" msgstr "值" msgid "Grab" msgstr "抓å–" #. Relation msgid "Relation" msgstr "关系" #. Invert msgid "Invert" msgstr "åå‘" msgid "Browse..." msgstr "æµè§ˆ..." msgid "Images" msgstr "图åƒ" msgid "File" msgstr "文件" msgid "Open directory..." msgstr "打开目录..." msgid "Open file..." msgstr "打开文件..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "这是一个针对CompizConfigé…置系统的设置管ç†å™¨" msgid "translator-credits" msgstr "译者" msgid "An error has occured" msgstr "产生了一个错误" msgid "Warning" msgstr "警告" #, python-format msgid "Enable %s" msgstr "å¯ç”¨%s" msgid "Filter" msgstr "关键字" #, python-format msgid "Search %s Plugin Options" msgstr "æœç´¢%sæ’件选项" msgid "Use This Plugin" msgstr "使用此æ’ä»¶" msgid "Search Compiz Core Options" msgstr "æœç´¢Compiz Core选项" msgid "Error" msgstr "错误" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "输入过滤æ¡ä»¶ã€‚\n" "以按下的键盘上的键进行æœç´¢ã€‚" msgid "Search in..." msgstr "于...中寻找" #. Options msgid "Short description and name" msgstr "简短æè¿°å’Œåç§°" msgid "Long description" msgstr "具体æè¿°" msgid "Settings value" msgstr "设置值" msgid "Group" msgstr "组" msgid "Subgroup" msgstr "å­ç»„" #. Notebook msgid "Settings" msgstr "设置" msgid "Loading Advanced Search" msgstr "加载高级æœç´¢" msgid "Add a New Profile" msgstr "添加新存档" msgid "Remove This Profile" msgstr "删除此存档" msgid "Default" msgstr "默认" msgid "Profile" msgstr "存档" msgid "Import" msgstr "导入" msgid "Import a CompizConfig Profile" msgstr "导入一个CompizConfig存档" msgid "Import as..." msgstr "åšä¸ºâ€¦å¯¼å…¥" msgid "Import a CompizConfig Profile as a new profile" msgstr "导入一个CompizConfig存档作为新的存档" msgid "Export" msgstr "导出" msgid "Export your CompizConfig Profile" msgstr "导出你的CompizConfig存档" msgid "Reset to defaults" msgstr "é‡ç½®åˆ°é»˜è®¤" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "é‡ç½®ä½ çš„CompizConfig存档到全局默认" msgid "Backend" msgstr "åŽç«¯" msgid "Integration" msgstr "æ•´åˆ" msgid "Enable integration into the desktop environment" msgstr "å¼€å¯ä¸Žæ¡Œé¢çŽ¯å¢ƒçš„æ•´åˆ" msgid "Profiles (*.profile)" msgstr "存档 (*.profile)" msgid "All files" msgstr "所有文件" msgid "Save file.." msgstr "ä¿å­˜æ–‡ä»¶.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "您想在导出存档时忽略默认设置å—?" msgid "Open file.." msgstr "打开文件.." msgid "Enter a profile name" msgstr "输入存档åç§°" msgid "Please enter a name for the new profile:" msgstr "请输入一个新存档åç§°:" msgid "Backend not found." msgstr "未找到åŽç«¯ç¨‹åºã€‚" #. Auto sort msgid "Automatic plugin sorting" msgstr "æ’件自动排åº" msgid "Disabled Plugins" msgstr "å·²ç¦ç”¨æ’ä»¶" msgid "Enabled Plugins" msgstr "å·²å¯ç”¨æ’ä»¶" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "您真的想ç¦ç”¨æ’件自动排åºå—ï¼Ÿè¿™å°†åŒæ—¶ç¦ç”¨å†²çªæ£€æµ‹ã€‚å¦‚æžœæ‚¨æ˜Žç¡®çŸ¥é“æ‚¨å°†å¯¼è‡´çš„结" "果,方å¯ç»§ç»­ã€‚" msgid "Add plugin" msgstr "添加æ’ä»¶" msgid "Plugin name:" msgstr "æ’ä»¶å称:" msgid "Insert plugin name" msgstr "æ’å…¥æ’ä»¶åç§°" msgid "Preferences" msgstr "首选项" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "é…ç½®Conpizé…置系统使用的åŽç«¯ã€å­˜æ¡£ä»¥åŠå…¶å®ƒå†…部设定。" msgid "About" msgstr "关于" msgid "About CCSM..." msgstr "关于CCSM…" msgid "Profile & Backend" msgstr "存档和åŽç«¯" msgid "Plugin List" msgstr "æ’件列表" msgid "Filter your Plugin list" msgstr "过滤你的æ’件列表" #, python-format msgid "Screen %i" msgstr "å±å¹•%i" msgid "Screen" msgstr "å±å¹•" msgid "Category" msgstr "类别" msgid "Advanced Search" msgstr "高级æœç´¢" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "未找到匹é…项。 \n" "\n" "你的过滤æ¡ä»¶\"%s\"未匹é…任何æ¡ç›®ã€‚" msgid "Configure Compiz with CompizConfig" msgstr "使用CompizConfig对Compiz进行é…ç½®" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "正在计算å¯èƒ½å­˜åœ¨çš„冲çªï¼Œè¯·ç¨å€™" #~ msgid "Value (%s)" #~ msgstr "值 (%s)" #, fuzzy #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "值 (%s) 于 %s:" #~ msgid "Unhandled list type %s for %s" #~ msgstr "未处ç†çš„列表类型 %s 于 %s" #~ msgid "Actions" #~ msgstr "动作" #~ msgid "PyGtk 2.10.0 or later required" #~ msgstr "éœ€è¦ PyGtk 2.10.0或更新版本" #~ msgid "Multi-list settings" #~ msgstr "多列表设置" #~ msgid "Name" #~ msgstr "åç§°" #~ msgid "Screen Edge" #~ msgstr "å±å¹•边缘" #~ msgid "On System Bell" #~ msgstr "基于系统铃声" #~ msgid "Edit Action: %s" #~ msgstr "编辑动作: %s" #~ msgid "Screen Edges" #~ msgstr "å±å¹•边缘" #~ msgid "Backend & Profile" #~ msgstr "åŽç«¯ & 存档" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/it.po0000644000015301777760000003236012321343002022504 0ustar pbusernogroup00000000000000# CompizConfig Italian translation # Copyright (C) 2007, 2008, 2009 The Free Software Foundation, Inc. # This file is distributed under the same license as the ccsm package. # Treviño (Marco Trevisan) , 2007 # Milo Casagrande , 2007-2009 # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-02-17 17:52+0100\n" "Last-Translator: Milo Casagrande \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Il nuovo valore per la scorciatoia %(binding)s dell'azione %(action)s " "nel plugin %(plugin)s, va in conflitto con l'azione %" "(action_conflict)s del plugin %(plugin_conflict)s\n" "Disabilitare %(action_conflict)s nel plugin %(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Disabilita %(action_conflict)s" # (ndt) pulsante #, python-format msgid "Don't set %(action)s" msgstr "Non impostare %(action)s" # (ndt) pulsante #, python-format msgid "Set %(action)s anyway" msgstr "Imposta %(action)s comunque" msgid "key" msgstr "tasto" msgid "button" msgstr "pulsante" msgid "edge" msgstr "bordo" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Si sta cercando di usare la funzionalità %(feature)s che non è " "fornita da alcun plugin.\n" "Usare ugualmente questa funzionalità?" #, python-format msgid "Use %(feature)s" msgstr "Usare %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Non usare %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Si sta cercando di usare la funzionalità %(feature)s che è fornita da " "%(plugin)s.\n" "Questo plugin è attualmente disabilitato.\n" "Abilitare %(plugin)s per rendere la funzionalità disponibile?" #, python-format msgid "Enable %(plugin)s" msgstr "Abilita %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Non abilitare %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Alcuni binding %(bindings)s del plugin %(plugin)s vanno in conflitto " "con altri plugin. Risolvere questi conflitti?" msgid "Resolve conflicts" msgstr "Risolvi conflitti" msgid "Ignore conflicts" msgstr "Ignora conflitti" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Il plugin %(plugin_conflict)s fornisce la funzionalità %(feature)" "s fornita anche da %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Disabilita %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Non abilitare %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Il plugin %(plugin_conflict)s va in conflitto con %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s richiede la funzionalità %(feature)s che viene " "fornita dai seguenti plugin:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Abilita questi plugin" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s richiede il plugin %(require)s." # (NdT) opzione #, python-format msgid "Enable %(require)s" msgstr "Abilitare %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s fornisce la funzionalità %(feature)s richiesta dai " "plugin %(plugin_list)s." # (NdT) pulsante msgid "Disable these plugins" msgstr "Disabilita questi plugin" # (NdT) pulsante #, python-format msgid "Don't disable %(plugin)s" msgstr "Non disabilitare %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s è richiesto dai plugin %(plugin_list)s." msgid "General" msgstr "Generale" msgid "Accessibility" msgstr "Accessibilità" msgid "Desktop" msgstr "Desktop" msgid "Extras" msgstr "Extra" msgid "Window Management" msgstr "Gestione finestre" msgid "Effects" msgstr "Effetti" msgid "Image Loading" msgstr "Caricamento immagini" msgid "Utility" msgstr "Utilità" msgid "All" msgstr "Tutti" msgid "Uncategorized" msgstr "Senza categoria" msgid "N/A" msgstr "N/D" msgid "Reset setting to the default value" msgstr "Ripristina l'impostazione al valore predefinito" msgid "Edit" msgstr "Modifica" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Impostazioni multi elenco. Fare doppio clic su una riga per modificarne i " "valori." #, python-format msgid "Edit %s" msgstr "Modifica %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "«%s» non è una scorciatoia valida" msgid "Disabled" msgstr "Disabilitato" msgid "Enabled" msgstr "Abilitato" msgid "Grab key combination" msgstr "Ottieni combinazione tasti" #, python-format msgid "\"%s\" is not a valid button" msgstr "«%s» non è un pulsante valido" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Usare Pulsante1 senza alcun modificatore può prevenire il clic col tasto " "sinistro del mouse e rompere la configurazione. Impostare veramente «%s» per " "Pulsante1?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "«%s» non è una maschera valida" # (NdT) questo è quello che si vede nella scheda Azioni # quando non è associato nulla alla particolare azione... msgid "None" msgstr "Nessuno" msgid "CompizConfig Settings Manager" msgstr "Gestore configurazione CompizConfig" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Premere la nuova combinazione di tasti" msgid "Window Title" msgstr "Titolo finestra" msgid "Window Role" msgstr "Ruolo finestra" msgid "Window Name" msgstr "Nome finestra" msgid "Window Class" msgstr "Classe finestra" msgid "Window Type" msgstr "Tipo finestra" msgid "Window ID" msgstr "ID finestra" # (ndt) non capisco bene a cosa si riferiscano questi due... msgid "And" msgstr "E" msgid "Or" msgstr "O" msgid "Edit match" msgstr "Modifica corrispondenza" #. Type msgid "Type" msgstr "Tipo" #. Value msgid "Value" msgstr "Valore" # (ndt) da rivedere msgid "Grab" msgstr "Ottieni" #. Relation msgid "Relation" msgstr "Relazione" # (ndt) da rivedere #. Invert msgid "Invert" msgstr "Inverti" msgid "Browse..." msgstr "Esplora..." msgid "Images" msgstr "Immagini" msgid "File" msgstr "File" msgid "Open directory..." msgstr "Apri directory..." msgid "Open file..." msgstr "Apri file..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Un gestore delle impostazioni per il sistema di configurazione CompizConfig." msgid "translator-credits" msgstr "Milo Casagrande " msgid "An error has occured" msgstr "Si è verificato un errore" msgid "Warning" msgstr "Avviso" # (NdT) opzione #, python-format msgid "Enable %s" msgstr "Abilitare «%s»" msgid "Filter" msgstr "Filtro" #, python-format msgid "Search %s Plugin Options" msgstr "Cerca tra le opzioni del plugin %s" msgid "Use This Plugin" msgstr "Usa questo plugin" msgid "Search Compiz Core Options" msgstr "Cerca tra le opzioni principali di Compiz" msgid "Error" msgstr "Errore" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Inserire un filtro.\n" "Fare clic sull'immagine della tastiera per ottenere una lettera da cercare." msgid "Search in..." msgstr "Cerca in..." #. Options msgid "Short description and name" msgstr "Descrizione breve e nome" msgid "Long description" msgstr "Descrizione completa" msgid "Settings value" msgstr "Valore delle impostazioni" msgid "Group" msgstr "Gruppo" msgid "Subgroup" msgstr "Sottogruppo" #. Notebook msgid "Settings" msgstr "Impostazioni" msgid "Loading Advanced Search" msgstr "Caricamento ricerca avanzata" # (NdT) suggerimento msgid "Add a New Profile" msgstr "Aggiunge un nuovo profilo" # (NdT) suggerimento msgid "Remove This Profile" msgstr "Rimuove questo profilo" msgid "Default" msgstr "Predefinito" msgid "Profile" msgstr "Profilo" # (NdT) pulsante msgid "Import" msgstr "Importa" # (NdT) suggerimento msgid "Import a CompizConfig Profile" msgstr "Importa un profilo di CompizConfig" msgid "Import as..." msgstr "Importa come..." # (NdT) suggerimento msgid "Import a CompizConfig Profile as a new profile" msgstr "Importa un profilo di CompizConfig come un nuovo profilo" # (NdT) pulsante msgid "Export" msgstr "Esporta" # (NdT) suggerimento msgid "Export your CompizConfig Profile" msgstr "Esporta il profilo di CompizConfig selezionato" # (ndt) pulsante msgid "Reset to defaults" msgstr "Ripristina predefiniti" # (NdT) suggerimento msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Ripristina il profilo ai valori predefiniti" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integrazione" # (NdT) opzione msgid "Enable integration into the desktop environment" msgstr "Abilitare l'integrazione con l'ambiente grafico" msgid "Profiles (*.profile)" msgstr "Profili (*.profile)" msgid "All files" msgstr "Tutti i file" msgid "Save file.." msgstr "Salva file..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Tralasciare i valori predefiniti per le opzioni nell'esportare il profilo?" msgid "Open file.." msgstr "Apri file..." # (NdT) titolo finestra di dialogo msgid "Enter a profile name" msgstr "Inserimento nome profilo" # (NdT) stringa al di sopra di una casella di testo msgid "Please enter a name for the new profile:" msgstr "Inserire il nome del nuovo profilo:" msgid "Backend not found." msgstr "Backend non trovato. " # (NdT) opzione #. Auto sort msgid "Automatic plugin sorting" msgstr "Ordinamento plugin automatico" # (NdT) intestazione elenco msgid "Disabled Plugins" msgstr "Plugin disabilitati" # (NdT) intestazione elenco msgid "Enabled Plugins" msgstr "Plugin abilitati" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Disabilitare l'ordinamento automatico dei plugin? Questo disabiliterà anche " "la gestione dei conflitti. Procedere solo se si è certi di cosa si fa." # (NdT) titolo finestra di dialogo msgid "Add plugin" msgstr "Aggiungi plugin" # (NdT) stringa presente prima di una casella di # inserimento testo msgid "Plugin name:" msgstr "Nome del plugin:" # (NdT) questo è il suggerimento che compare # sulla stringa sopra... msgid "Insert plugin name" msgstr "Inserire il nome del plugin" msgid "Preferences" msgstr "Preferenze" # (NdT) descrizione di cosa si può fare... msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configura il backend e il profilo usati dal sistema di configurazione di " "Compiz." msgid "About" msgstr "Informazioni" # (NdT) siccome CCSM sta per CompizConfig Setting Manager, # ma è stato tradotto in altro modo tralascio l'acronimo... msgid "About CCSM..." msgstr "Informazioni su..." # (NdT) non vedo perché debbano essere diverse... # Uno è un pulsante l'altro il nome di una scheda... # Il pulsante visualizza la scheda msgid "Profile & Backend" msgstr "Profilo e backend" # (NdT) titolo di una scheda msgid "Plugin List" msgstr "Elenco plugin" msgid "Filter your Plugin list" msgstr "Filtra l'elenco dei plugin" #, python-format msgid "Screen %i" msgstr "Schermo: %i" msgid "Screen" msgstr "Schermo" # (NdT) benché l'originale sia al singolare # nella UI c'è l'elenco di tutte le categorie sotto... msgid "Category" msgstr "Categorie" msgid "Advanced Search" msgstr "Ricerca avanzata" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Nessuna corrispondenza trovata. \n" "\n" " Il filtro «%s» non corrisponde ad alcuna voce." msgid "Configure Compiz with CompizConfig" msgstr "Configura Compiz attraverso CompizConfig" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/es.po0000644000015301777760000003203512321343002022476 0ustar pbusernogroup00000000000000# Translation of CCSM to es_ES # Copyright (C) 2007 compiz-fusion # This file is distributed under the same license as the Compiz Fusion packages. # # Festor Wailon Dacoba , 2007. # # Para los traductores que usen Gobby, # por favor tener cuidado si modificais un " ya que pueden dar lugar a problemas. # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-01-31 21:50+0100\n" "Last-Translator: Pablo Lopez \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" "X-Poedit-Language: Spanish\n" "X-Poedit-Country: SPAIN\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "El nuevo valor para la opción %(binding)s de la acción%(action)s en " "el plugin %(plugin)s está en conflicto con la acción %" "(action_conflict)s del plugin %(plugin_conflict)s .\n" "¿Desea deshabilitar %(action_conflict)s en el plugin %" "(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Deshabilitar %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "No aplicar %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Ignorar y Aplicar %(action)s" msgid "key" msgstr "tecla" msgid "button" msgstr "botón" msgid "edge" msgstr "borde" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Está intentando usar la característica %(feature)s que no está " "disponible en ninguno de los plugins. ¿Desea habilitar esta característica " "de todas formas?" #, python-format msgid "Use %(feature)s" msgstr "Usar %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "No usar %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Está intentando usar la característica %(feature)s que está " "disponible en %(plugin)s.\n" "Este plugin actualmente está deshabilitado.\n" "¿Desea habilitar %(plugin)s para que la característica esté " "disponible?" #, python-format msgid "Enable %(plugin)s" msgstr "Habilitar %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "No habilitar %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Algunos de los vínculos %(bindings)s del Plugin %(plugin)s producen " "conflictos con otros plugins. ¿Desea resolverlos?" msgid "Resolve conflicts" msgstr "Resolver conflictos" msgid "Ignore conflicts" msgstr "Ignorar conflictos" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "El plugin %(plugin_conflict)s proporciona la característica %" "(feature)s que también es proporcionada por %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Deshabilitar %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "No habilitar %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "El plugin %(plugin_conflict)s no es compatible con %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s requiere %(feature)s que es proporcionado por los " "siguientes plugins:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Habilitar estos plugins" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s requiere el plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Habilitar %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s proporciona la característica %(feature)s la cual " "es requerida por los plugins %(plugin_list)s." msgid "Disable these plugins" msgstr "Deshabilitar estos plugins" #, python-format msgid "Don't disable %(plugin)s" msgstr "No deshabilitar %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s es requerido por los siguientes plugins %(plugin_list)" "s." msgid "General" msgstr "General" msgid "Accessibility" msgstr "Accesibilidad" msgid "Desktop" msgstr "Escritorio" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Administrador de ventanas" msgid "Effects" msgstr "Efectos" msgid "Image Loading" msgstr "Compatibilidad con imágenes" msgid "Utility" msgstr "Utilidades" msgid "All" msgstr "Todo" msgid "Uncategorized" msgstr "Sin categoría" msgid "N/A" msgstr "N/D" msgid "Reset setting to the default value" msgstr "Reestablecer opciones predeterminadas" msgid "Edit" msgstr "Editar" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Opciones de la Multi-lista. Puedes hacer doble-click en un fila para editar " "los valores." #, python-format msgid "Edit %s" msgstr "Editar %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" no es un acceso directo válido" msgid "Disabled" msgstr "Deshabilitado" msgid "Enabled" msgstr "Habilitado" # Solucionando ortografía. msgid "Grab key combination" msgstr "Escoger combinación de teclas" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" no es un botón válido" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Usar el Botón1 sin modificadores puede prevenir cualquier click izquierdo y " "dañar tu configuración. Realmente deseas asignar \"%s\" boton al Botón1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" no es un borde de mascara válido" msgid "None" msgstr "Ninguno" msgid "CompizConfig Settings Manager" msgstr "Administrador de Opciones CompizConfig" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Por favor introduzca una nueva combinación de teclas" msgid "Window Title" msgstr "Titulo de la Ventana" msgid "Window Role" msgstr "Rol de la Ventana" msgid "Window Name" msgstr "Nombre de la Ventana" msgid "Window Class" msgstr "Clase de Ventana" msgid "Window Type" msgstr "Tipo de Ventana" msgid "Window ID" msgstr "Identificacion de la Ventana" msgid "And" msgstr "Y" msgid "Or" msgstr "O" msgid "Edit match" msgstr "Editar coincidencia" #. Type msgid "Type" msgstr "Tipo" #. Value msgid "Value" msgstr "Valor" msgid "Grab" msgstr "Tomar" #. Relation msgid "Relation" msgstr "Relación" #. Invert msgid "Invert" msgstr "Inverso" msgid "Browse..." msgstr "Examinar..." msgid "Images" msgstr "Imágenes" msgid "File" msgstr "Archivo" msgid "Open directory..." msgstr "Abrir directorio..." msgid "Open file..." msgstr "Abrir archivo..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Este es un administrador de opciones para el sistema de configuración " "CompizConfig" msgid "translator-credits" msgstr "" "Traducción al Español:\n" "Festor Wailon Dacoba,\n" "CarvaX,\n" "\n" "Nacho Molina correcciones y aportes.\n" "\n" "Roger Chacon Correcciones y aportes." msgid "An error has occured" msgstr "Se ha producido un error" msgid "Warning" msgstr "Atención" #, python-format msgid "Enable %s" msgstr "Habilitar %s" msgid "Filter" msgstr "Filtro" #, python-format msgid "Search %s Plugin Options" msgstr "Buscar %s opciones de plugin" msgid "Use This Plugin" msgstr "Usar este plugin" msgid "Search Compiz Core Options" msgstr "Buscar opciones Compiz Core" msgid "Error" msgstr "Error" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Escriba un filtro.Pulse en la imagen del teclado para coger la tecla por la " "que quiere buscar." msgid "Search in..." msgstr "Buscar en..." #. Options msgid "Short description and name" msgstr "Descripción corta y nombre" msgid "Long description" msgstr "Descripción larga" msgid "Settings value" msgstr "Valor de las opciones" msgid "Group" msgstr "Grupo" msgid "Subgroup" msgstr "Sub-grupo" #. Notebook msgid "Settings" msgstr "Opciones" msgid "Loading Advanced Search" msgstr "Cargando la búsqueda avanzada" msgid "Add a New Profile" msgstr "Añadir un nuevo perfil" msgid "Remove This Profile" msgstr "Eliminar este perfil" msgid "Default" msgstr "Por defecto" msgid "Profile" msgstr "Perfil" msgid "Import" msgstr "Importar Configuración" msgid "Import a CompizConfig Profile" msgstr "Importar un perfil de CompizConfig" msgid "Import as..." msgstr "Importar como..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importar un perfil de CompizConfig como un nuevo perfil" msgid "Export" msgstr "Exportar Configuración" msgid "Export your CompizConfig Profile" msgstr "Exportar tu perfil de CompizConfig" msgid "Reset to defaults" msgstr "Reestablecer valores por defecto" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Reiniciar tu perfil CompizConfig a las opciones globales por defecto. " msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integración" msgid "Enable integration into the desktop environment" msgstr "Habilitar integración con el entorno de escritorio" msgid "Profiles (*.profile)" msgstr "Perfiles (*.profile)" msgid "All files" msgstr "Todos los archivos" msgid "Save file.." msgstr "Guardar archivo..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "¿Desea omitir los valores predeterminados de las opciones al exportar su " "perfil?" msgid "Open file.." msgstr "Abrir archivo.." # Pequeños cambios msgid "Enter a profile name" msgstr "Introduzca un nombre del perfil" msgid "Please enter a name for the new profile:" msgstr "Por favor introduzca un nombre para el nuevo perfil:" msgid "Backend not found." msgstr "Backend no encontrado." #. Auto sort msgid "Automatic plugin sorting" msgstr "Ordenar automáticamente los plugins" msgid "Disabled Plugins" msgstr "Plugins deshabilitados" msgid "Enabled Plugins" msgstr "Plugins habilitados" # Pequeño cambio msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Realmente quiere desactivar la organización automática de los plugins? Esto " "desabilitara el manejo de conflictos. Sólo deberia de hacer esto si sabe lo " "que esta haciendo." msgid "Add plugin" msgstr "Añadir plugin" msgid "Plugin name:" msgstr "Nombre del plugin:" msgid "Insert plugin name" msgstr "Insertar nombre del plugin" msgid "Preferences" msgstr "Preferencias" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configurar el backend, los perfiles y otras opciones internas usadas por el " "Sistema de Configuración de Compiz" msgid "About" msgstr "Acerca" msgid "About CCSM..." msgstr "Acerca de CCSM..." msgid "Profile & Backend" msgstr "Perfil & Backend" msgid "Plugin List" msgstr "Lista de plugins" msgid "Filter your Plugin list" msgstr "Filtrar tu lista de plugins" #, python-format msgid "Screen %i" msgstr "Pantalla %i" msgid "Screen" msgstr "Pantalla" msgid "Category" msgstr "Categoría" msgid "Advanced Search" msgstr "Búsqueda avanzada" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Ninguna coincidencia. \n" "\n" " Tu filtro \"%s\" no ha devuelto ningún resultado." msgid "Configure Compiz with CompizConfig" msgstr "Configurar Compiz con CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Verificando posibles conflictos, por favor espere" #~ msgid "Value (%s)" #~ msgstr "Valor (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Valor (%(value)s) para %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Tipo de lista inusual %s para %s" #~ msgid "Actions" #~ msgstr "Acciones" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/bg.po0000644000015301777760000003045012321343002022456 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-02-06 11:24+0530\n" "PO-Revision-Date: 2009-05-20 14:34+0200\n" "Last-Translator: Svetoslav Stefanov \n" "Language-Team: Svetoslav Stefanov \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Bulgarian\n" "X-Poedit-Country: BULGARIA\n" "X-Poedit-SourceCharset: utf-8\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s in plugin %(plugin)s conflicts with the action %(action_conflict)s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "Изключване на %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Да не Ñе задава %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Задаване на %(action)s въпреки това" msgid "key" msgstr "ключ" msgid "button" msgstr "клавиш" msgid "edge" msgstr "край" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" #, python-format msgid "Use %(feature)s" msgstr "Използване на %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Да не Ñе използва %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by %(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" #, python-format msgid "Enable %(plugin)s" msgstr "Включване на %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Да не Ñе включва %(feature)s" #, python-format msgid "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "Разрешаване на конфликтите" msgid "Ignore conflicts" msgstr "Игнориране на конфликтите" #, python-format msgid "Plugin %(plugin_conflict)s provides feature %(feature)s which is also provided by %(plugin)s" msgstr "" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Изключване на %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Да не Ñе включва %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "ПриÑтавката %(plugin_conflict)s е в конфликт Ñ %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "Включване на тези приÑтавки" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s изиÑква приÑтавката %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Включване на %(require)s" #, python-format msgid "%(plugin)s provides the feature %(feature)s which is required by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "Изключване на тези приÑтавки" #, python-format msgid "Don't disable %(plugin)s" msgstr "Да не Ñе изключва %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s е изиÑкуем от приÑтавките %(plugin_list)s." msgid "General" msgstr "Общи" msgid "Accessibility" msgstr "ДоÑтъпноÑÑ‚" msgid "Desktop" msgstr "Работен плот" msgid "Extras" msgstr "ЕкÑтри" msgid "Window Management" msgstr "Управление на прозорци" msgid "Effects" msgstr "Ефекти" msgid "Image Loading" msgstr "Зареждане на изображение" msgid "Utility" msgstr "ИнÑтрумент" msgid "All" msgstr "Ð’Ñички" msgid "Uncategorized" msgstr "Без категориÑ" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Връщане на ÑтойноÑтта по подразбиране" msgid "Edit" msgstr "Редактиране" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" #, python-format msgid "Edit %s" msgstr "Редактира %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" не е валидна препратка" msgid "Disabled" msgstr "Изключено" msgid "Enabled" msgstr "Включено" msgid "Grab key combination" msgstr "Прихващане на клавишна комбинациÑ" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" не е валиден бутон" #, python-format msgid "Using Button1 without modifiers can prevent any left click and thus break your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "Без" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Settings Manager" msgid "Plugin" msgstr "ПриÑтавка" msgid "Please press the new key combination" msgstr "ÐœÐ¾Ð»Ñ Ð½Ð°Ñ‚Ð¸Ñнете новата клавишна комбинациÑ" msgid "Window Title" msgstr "Заглавие на прозореца" msgid "Window Role" msgstr "Ð Ð¾Ð»Ñ Ð½Ð° прозореца" msgid "Window Name" msgstr "Име на прозореца" msgid "Window Class" msgstr "ÐšÐ»Ð°Ñ Ð½Ð° прозореца" msgid "Window Type" msgstr "Тип на прозореца" msgid "Window ID" msgstr "ID на прозореца" msgid "And" msgstr "И" msgid "Or" msgstr "Или" msgid "Edit match" msgstr "Зачитане на региÑтъра" #. Type msgid "Type" msgstr "Тип" #. Value msgid "Value" msgstr "СтойноÑÑ‚" msgid "Grab" msgstr "Прихващане" #. Relation msgid "Relation" msgstr "" #. Invert msgid "Invert" msgstr "Обръщане" msgid "Browse..." msgstr "Преглед..." msgid "Images" msgstr "ИзображениÑ" msgid "File" msgstr "Файл" msgid "Open directory..." msgstr "ОтварÑне на директориÑ..." msgid "Open file..." msgstr "ОтварÑне на файл..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "СветоÑлав Стефанов " msgid "An error has occured" msgstr "Възникна грешка" msgid "Warning" msgstr "Предупреждение" #, python-format msgid "Enable %s" msgstr "Включване на %s" msgid "Filter" msgstr "Филтър" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "Използване на тази приÑтавка" msgid "Search Compiz Core Options" msgstr "" msgid "Error" msgstr "Грешка" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "ТърÑене в..." #. Options msgid "Short description and name" msgstr "Кратко опиÑание и име" msgid "Long description" msgstr "Дълго опиÑание" msgid "Settings value" msgstr "СтойноÑÑ‚ на наÑтройките" msgid "Group" msgstr "Група" msgid "Subgroup" msgstr "Подгрупа" #. Notebook msgid "Settings" msgstr "ÐаÑтройки" msgid "Loading Advanced Search" msgstr "Зареждане на разширено търÑене" msgid "Add a New Profile" msgstr "ДобавÑне на нов профил" msgid "Remove This Profile" msgstr "Премахване на този профил" msgid "Default" msgstr "Стандартни" msgid "Profile" msgstr "Профил" msgid "Import" msgstr "ВнаÑÑне" msgid "Import a CompizConfig Profile" msgstr "ВнаÑÑне на профил на CompizConfig" msgid "Import as..." msgstr "ВнаÑÑне като..." msgid "Import a CompizConfig Profile as a new profile" msgstr "ВнаÑÑне на профил на CompizConfig като нов " msgid "Export" msgstr "ИзнаÑÑне" msgid "Export your CompizConfig Profile" msgstr "ИзнаÑÑне на Ð²Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð» на CompizConfig" msgid "Reset to defaults" msgstr "Върни виÑÑщите опции" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Върнете ÑÐ²Ð¾Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð» на CompizConfig към глобалните Ñтандартни наÑтройки" msgid "Backend" msgstr "Контрол за Dbus" msgid "Integration" msgstr "ИнтеграциÑ" msgid "Enable integration into the desktop environment" msgstr "Включване на интегрирането в работната Ñреда" msgid "Profiles (*.profile)" msgstr "Профили (*.profile)" msgid "All files" msgstr "Ð’Ñички файлове" msgid "Save file.." msgstr "Запазване на файл..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Желаете ли приизнаÑÑнето на Ð²Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð» да бъдат пропуÑнати Ñтандартните ÑтойноÑти на наÑтройките?" msgid "Open file.." msgstr "ОтварÑне на файл..." msgid "Enter a profile name" msgstr "Въведете име на профила" msgid "Please enter a name for the new profile:" msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ име за Ð½Ð¾Ð²Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»:" msgid "Backend not found." msgstr "Файлът не е намерен" #. Auto sort msgid "Automatic plugin sorting" msgstr "Ðвтоматично Ñортиране на приÑтавките" msgid "Disabled Plugins" msgstr "Изключени приÑтавки" msgid "Enabled Plugins" msgstr "Включени приÑтавки" msgid "Do you really want to disable automatic plugin sorting? This will also disable conflict handling. You should only do this if you know what you are doing." msgstr "" msgid "Add plugin" msgstr "ДобавÑне на приÑтавка" msgid "Plugin name:" msgstr "Име на приÑтавката:" msgid "Insert plugin name" msgstr "Въведете име на приÑтавката" msgid "Preferences" msgstr "ПредпочитаниÑ" msgid "Configure the backend, profile and other internal settings used by the Compiz Configuration System." msgstr "" msgid "About" msgstr "ОтноÑно" msgid "About CCSM..." msgstr "ОтноÑно CCSM..." msgid "Profile & Backend" msgstr "Профил по подразбиране:" msgid "Plugin List" msgstr "СпиÑък Ñ Ð¿Ñ€Ð¸Ñтавки" msgid "Filter your Plugin list" msgstr "Филтрирайте ÑÐ²Ð¾Ñ ÑпиÑък Ñ Ð¿Ñ€Ð¸Ñтавки" #, python-format msgid "Screen %i" msgstr "Екран %i" msgid "Screen" msgstr "ПрожекциÑ" msgid "Category" msgstr "КатегориÑ" msgid "Advanced Search" msgstr "Разширено търÑене" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Ðе Ñа открити ÑъвпадениÑ. \n" "\n" " Филтърът ви \"%s\" не Ñъвпада Ñ Ð½Ð¸Ñ‰Ð¾." msgid "Configure Compiz with CompizConfig" msgstr "ÐаÑтройка на Compiz Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° на CompizConfig" msgid "Computing possible conflicts, please wait" msgstr "ИзчиÑлÑване на възможните конфликти, Ð¼Ð¾Ð»Ñ Ð¸Ð·Ñ‡Ð°ÐºÐ°Ð¹Ñ‚Ðµ" msgid "Value (%s)" msgstr "СтойноÑÑ‚ (%s)" msgid "Value (%(value)s) for %(setting)s" msgstr "СтойноÑÑ‚ (%(value)s) за %(setting)s" msgid "Unhandled list type %s for %s" msgstr "" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/sv.po0000644000015301777760000003167512321343002022530 0ustar pbusernogroup00000000000000# Swedish translation for ccsm. # Copyright (C) 2007 Free Software Foundation, Inc. # This file is distributed under the same license as the compiz-fusion package. # Daniel Nylander , 2007. # Erik Eloff , 2007. # Sebastian Parborg , 2007. # Fredrik Karlsson , 2007. # msgid "" msgstr "" "Project-Id-Version: compiz-fusion-plugins 0.0.1\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-12-07 18:22+0100\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Compiz Fusion Translators \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Det nya värdet för tangentbindningen %(binding)s för Ã¥tgärden %(action)si insticksmodulen %(plugin)s stÃ¥r i konflikt med Ã¥tgärden %" "(action_conflict)sför insticksmodulen %(plugin_conflict)s.\n" "Vill du inaktivera %(action_conflict)s i insticksmodulen %" "(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Inaktivera %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Ställ inte in %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Ställ in %(action)s ändÃ¥" msgid "key" msgstr "tangent" msgid "button" msgstr "knapp" msgid "edge" msgstr "kant" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Du försöker använda funktionen %(feature)s som inte " "tillhandahÃ¥lls av nÃ¥gon insticksmodul.\n" "Vill du använda den här funktionen ändÃ¥? " # TvÃ¥ "Aktivera inte" mÃ¥ste bli förvirrande #, python-format msgid "Use %(feature)s" msgstr "Använd %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Använd inte %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Du försöker använda funktionen %(feature)s som tillhandahÃ¥lls av %" "(plugin)s.\n" "Den här insticksmodulen är för närvarande inaktiverad.\n" "Vill du aktivera %(plugin)s sÃ¥ att funktionen blir tillgänglig?" #, python-format msgid "Enable %(plugin)s" msgstr "Aktivera %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Aktivera inte %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "NÃ¥gra %(bindings)s bindningar för insticksmodulen %(plugin)s är i " "konflikt med andra insticksmoduler. Vill du lösa dessa konflikter? " msgid "Resolve conflicts" msgstr "Lös konflikter" msgid "Ignore conflicts" msgstr "Ignorera konflikter" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Insticksmodulen %(plugin_conflict)s tillhandahÃ¥ller funktionen %" "(feature)s, som även finns i %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Inaktivera %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Aktivera inte %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Insticksmodulen %(plugin_conflict)s stÃ¥r i konflikt med %(plugin)" "s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s kräver funktionen %(feature)s som tillhandahÃ¥lls av " "följande insticksmoduler:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Aktivera dessa insticksmoduler" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s kräver insticksmodulen %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Aktivera %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s tillhandahÃ¥ller funktionen %(feature)s som krävs av " "insticksmodulerna %(plugin_list)s." msgid "Disable these plugins" msgstr "Inaktivera dessa insticksmoduler" #, python-format msgid "Don't disable %(plugin)s" msgstr "Inaktivera inte %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s krävs av insticksmodulerna %(plugin_list)s." msgid "General" msgstr "Allmänt" # This is what gnomes translation looks like... msgid "Accessibility" msgstr "Tillgänglighet" msgid "Desktop" msgstr "Skrivbord" msgid "Extras" msgstr "Extrafunktioner" msgid "Window Management" msgstr "Fönsterhantering" msgid "Effects" msgstr "Effekter" msgid "Image Loading" msgstr "Bildinläsning" msgid "Utility" msgstr "Verktyg" msgid "All" msgstr "Alla" msgid "Uncategorized" msgstr "Okategoriserade" msgid "N/A" msgstr "-" msgid "Reset setting to the default value" msgstr "Ã…terställ inställning till standardvärde" msgid "Edit" msgstr "Redigera" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Multilist-inställningar. Du kan dubbelklicka i en rad för att ändra värdena." #, python-format msgid "Edit %s" msgstr "Redigera %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" är inte en giltig genväg" msgid "Disabled" msgstr "Inaktiverad" msgid "Enabled" msgstr "Aktiverad" msgid "Grab key combination" msgstr "FÃ¥nga tangentkombination" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" är inte en giltig knapp" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Användandet av Knapp1 utan modifierare kan förhindra vänsterklickande och pÃ¥ " "sÃ¥ sätt ha sönder din konfiguration. Vill du verkligen binda \"%s\" knappen " "till Knapp1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" är inte en giltig kantmask" msgid "None" msgstr "Inget" msgid "CompizConfig Settings Manager" msgstr "Inställningshanteraren CompizConfig" msgid "Plugin" msgstr "Insticksmodul" msgid "Please press the new key combination" msgstr "Tryck den nya tangentkombinationen" msgid "Window Title" msgstr "Fönstertitel" # Särskrivning msgid "Window Role" msgstr "Fönsterroll" # Ersatte "Fönsterhantering" med "Fönsternamn" msgid "Window Name" msgstr "Fönsternamn" msgid "Window Class" msgstr "Fönsterklass" msgid "Window Type" msgstr "Fönstertyp" msgid "Window ID" msgstr "Fönster-ID" msgid "And" msgstr "Och" msgid "Or" msgstr "Eller" msgid "Edit match" msgstr "Redigera träff" #. Type msgid "Type" msgstr "Typ" # Ersatte "Värde (%s)" med "Värde" #. Value msgid "Value" msgstr "Värde" msgid "Grab" msgstr "FÃ¥nga" #. Relation msgid "Relation" msgstr "Relation" #. Invert msgid "Invert" msgstr "Invertera" msgid "Browse..." msgstr "Bläddra efter... " msgid "Images" msgstr "Bilder" msgid "File" msgstr "Fil" msgid "Open directory..." msgstr "Öppna katalog..." msgid "Open file..." msgstr "Öppna fil..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Det här är en inställningshanterare för CompizConfig konfigurationssystem." msgid "translator-credits" msgstr "" "Daniel Nylander \n" "Sebastian Parborg" msgid "An error has occured" msgstr "Ett fel har inträffat" msgid "Warning" msgstr "Varning" #, python-format msgid "Enable %s" msgstr "Aktivera %s" msgid "Filter" msgstr "Filtrera" #, python-format msgid "Search %s Plugin Options" msgstr "Sök alternativ för insticksmodulen %s" msgid "Use This Plugin" msgstr "Använd denna insticksmodul" msgid "Search Compiz Core Options" msgstr "Sök Compiz Core-alternativ" msgid "Error" msgstr "Fel" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Skriv in ett filter.\n" "Klicka pÃ¥ tangentbordsbilden för att fÃ¥nga en tangent att söka efter." msgid "Search in..." msgstr "Sök i..." #. Options msgid "Short description and name" msgstr "Kort beskrivning och namn" msgid "Long description" msgstr "LÃ¥ng beskrivning" msgid "Settings value" msgstr "Inställningsvärde" msgid "Group" msgstr "Grupp" msgid "Subgroup" msgstr "Undergrupp" #. Notebook msgid "Settings" msgstr "Inställningar" msgid "Loading Advanced Search" msgstr "Läser in avancerad sökning" msgid "Add a New Profile" msgstr "Lägg till en ny profil" msgid "Remove This Profile" msgstr "Ta bort den här profilen" msgid "Default" msgstr "Standard" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importera" msgid "Import a CompizConfig Profile" msgstr "Importera en CompizConfig-profil" msgid "Import as..." msgstr "Importera som..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importera en CompizConfig-profil som ny profil" msgid "Export" msgstr "Exportera" msgid "Export your CompizConfig Profile" msgstr "Exportera en CompizConfig profil" msgid "Reset to defaults" msgstr "Ã…terställ till standardvärden" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Ã…terställ din CompizConfig profil till de globala standardvärdena" msgid "Backend" msgstr "Bakände" msgid "Integration" msgstr "Integration" msgid "Enable integration into the desktop environment" msgstr "Aktivera integration med skrivbordsmiljö" msgid "Profiles (*.profile)" msgstr "Profiler (*.profile)" msgid "All files" msgstr "Alla filer" msgid "Save file.." msgstr "Spara fil.." # Kanske duger? msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Vill du hoppa över standardvärdena pÃ¥ alternativ när du exporterar din " "profil?" msgid "Open file.." msgstr "Öppna fil.." msgid "Enter a profile name" msgstr "Ange ett profilnamn" msgid "Please enter a name for the new profile:" msgstr "Ange ett namn för den nya profilen:" msgid "Backend not found." msgstr "Bakände hittades inte." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatisk sortering av insticksmoduler" msgid "Disabled Plugins" msgstr "Inaktiverade insticksmoduler" msgid "Enabled Plugins" msgstr "Aktiverade insticksmoduler" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Vill du verkligen avaktivera den automatiska sorteringen av insticksmoduler? " "Detta kommer ocksÃ¥ att avaktivera konflikthantering. Du borde bara göra " "detta om du vet vad du gör." msgid "Add plugin" msgstr "Lägg till instickmodul" msgid "Plugin name:" msgstr "Insticksmodulens namn:" msgid "Insert plugin name" msgstr "Ange insticksmodulens namn" msgid "Preferences" msgstr "Inställningar" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Konfigurera bakände, profil och andra interna inställningar som används av " "Compiz konfigurationssystem." msgid "About" msgstr "Om" msgid "About CCSM..." msgstr "Om CCSM..." msgid "Profile & Backend" msgstr "Profil och bakände" msgid "Plugin List" msgstr "Plugin lista" msgid "Filter your Plugin list" msgstr "Filtrera din insticksmodullista" #, python-format msgid "Screen %i" msgstr "Skärm %i" msgid "Screen" msgstr "Skärm" msgid "Category" msgstr "Kategori" msgid "Advanced Search" msgstr "Avancerad sökning" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Inga matchingar hittades. \n" "\n" " Ditt filter \"%s\" matchar inga objekt." msgid "Configure Compiz with CompizConfig" msgstr "Konfigurera Compiz med CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Beräknar eventuella konflikter, var snäll vänta" #~ msgid "Value (%s)" #~ msgstr "Värde (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Värde (%(value)s) för %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Ohanterad listtyp %s för %s" #~ msgid "Actions" #~ msgstr "Ã…tgärder" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/zh_HK.po0000644000015301777760000001645412321343002023101 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2008-01-13 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "" #, python-format msgid "Don't set %(action)s" msgstr "" #, python-format msgid "Set %(action)s anyway" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" #, python-format msgid "Use %(feature)s" msgstr "" #, python-format msgid "Don't use %(feature)s" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" #, python-format msgid "Enable %(plugin)s" msgstr "" #, python-format msgid "Don't enable %(feature)s" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "" #, python-format msgid "Don't enable %(plugin)s" msgstr "" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" #, python-format msgid "Enable %(require)s" msgstr "" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "" #, python-format msgid "Don't disable %(plugin)s" msgstr "" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" msgid "General" msgstr "" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "" msgid "Extras" msgstr "" msgid "Window Management" msgstr "" msgid "Effects" msgstr "" msgid "Image Loading" msgstr "" msgid "Utility" msgstr "" msgid "Reset setting to the default value" msgstr "" msgid "Browse for " msgstr "" msgid "Images" msgstr "" msgid "File" msgstr "" msgid "Open directory..." msgstr "" msgid "Open file..." msgstr "" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" msgid "Edit" msgstr "" #, python-format msgid "Value (%s)" msgstr "" #, python-format msgid "Edit %s" msgstr "" #, python-format msgid "Value (%(value)s) for %(setting)s" msgstr "" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "" msgid "Disabled" msgstr "" msgid "Enabled" msgstr "" msgid "Grab key combination" msgstr "" msgid "Computing possible conflicts, please wait" msgstr "" #, python-format msgid "\"%s\" is not a valid button" msgstr "" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "" #, python-format msgid "Unhandled list type %s for %s" msgstr "" msgid "CompizConfig Settings Manager" msgstr "" msgid "Filter" msgstr "" msgid "Filter your Plugin list" msgstr "" #, python-format msgid "Screen %i" msgstr "" msgid "Screen" msgstr "" msgid "All" msgstr "" msgid "Uncategorized" msgstr "" msgid "Category" msgstr "" msgid "Advanced Search" msgstr "" msgid "Preferences" msgstr "" #, python-format msgid "Enable %s" msgstr "" msgid "Please press the new key combination" msgstr "" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "" #. Value msgid "Value" msgstr "" msgid "Grab" msgstr "" #. Relation msgid "Relation" msgstr "" #. Invert msgid "Invert" msgstr "" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "" msgid "Warning" msgstr "" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "" msgid "Search Compiz Core Options" msgstr "" msgid "Actions" msgstr "" msgid "Error" msgstr "" msgid "Search in..." msgstr "" msgid "Short description and name" msgstr "" msgid "Long description" msgstr "" msgid "Settings value" msgstr "" #. Notebook msgid "Settings" msgstr "" msgid "Add a New Profile" msgstr "" msgid "Remove This Profile" msgstr "" msgid "Default" msgstr "" msgid "Profile" msgstr "" msgid "Import" msgstr "" msgid "Import a CompizConfig Profile" msgstr "" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "" msgid "All files" msgstr "" msgid "Save file.." msgstr "" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/id.po0000644000015301777760000002533112321343002022464 0ustar pbusernogroup00000000000000# CompizConfig Indonesian Translation # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Andi Darmawan , 2007. # msgid "" msgstr "" "Project-Id-Version: Compiz Settings Manager 0.5.2\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-03-31 06:10+0700\n" "Last-Translator: Mahyuddin Susanto \n" "Language-Team: Indonesian Translator \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "Non-aktifkan %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Jangan atur %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Tetap atur %(action)s" msgid "key" msgstr "kunci" msgid "button" msgstr "tombol" msgid "edge" msgstr "tepi" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Anda mencoba untuk menggunakan fitur %(feature)s yang tidak " "disediakan oleh plugin.\n" "Apakah anda ingin mengaktifkan fitur ini apa adanya?" #, python-format msgid "Use %(feature)s" msgstr "Gunakan %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Jangan aktifkan %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Anda mencoba untuk menggunakan fitur %(feature)s yang disediakan " "oleh%(plugin)s.\n" "Plugin tersebut sedang tidak aktif.\n" "Apakah anda ingin mengaktifkan %(plugin)s sehingga fitur menjadi " "tersedia?" #, python-format msgid "Enable %(plugin)s" msgstr "Aktifkan %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Jangan aktifkan %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "Abaikan konflik" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "Plugin %(plugin_conflict)s menyediakan fasilitas %(feature)s yang juga disediakan oleh %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Non-aktifkan %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Jangan aktifkan %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "Plugin %(plugin_conflict)s konflik dengan %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "Aktifkan plugin-plugin ini" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s membutuhkan plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Aktifkan %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "Non-aktifkan plugin-plugin ini" #, python-format msgid "Don't disable %(plugin)s" msgstr "Jangan non-aktifkan %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s dibutuhkan oleh plugin %(plugin_list)s." msgid "General" msgstr "Umum" msgid "Accessibility" msgstr "Aksesibilitas" msgid "Desktop" msgstr "Destop" msgid "Extras" msgstr "Ekstra" msgid "Window Management" msgstr "Manajemen Jendela" msgid "Effects" msgstr "Efek" msgid "Image Loading" msgstr "Loading Gambar" msgid "Utility" msgstr "Utilitas" msgid "All" msgstr "Semua" msgid "Uncategorized" msgstr "Tidak dikategorikan" msgid "N/A" msgstr "N/A" msgid "Reset setting to the default value" msgstr "Rest nilai pengaturan ke pengaturan default " msgid "Edit" msgstr "Ubah" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" #, python-format msgid "Edit %s" msgstr "Ubah %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" bukan tombol cepat yang valid" msgid "Disabled" msgstr "Non-aktif" msgid "Enabled" msgstr "Aktif" msgid "Grab key combination" msgstr "Ambil kombinasi tombol" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" bukan tombol yang valid" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "Tidak Ada" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Settings Manager" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Silahkan tekan kombinasi tombol yang baru" msgid "Window Title" msgstr "Judul Window" msgid "Window Role" msgstr "Aturan Window" msgid "Window Name" msgstr "Nama Window" msgid "Window Class" msgstr "Klas Window" msgid "Window Type" msgstr "Jenis Window" msgid "Window ID" msgstr "ID Window" msgid "And" msgstr "Dan" msgid "Or" msgstr "Atau" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "Tipe" #. Value msgid "Value" msgstr "Nilai" msgid "Grab" msgstr "Grab" #. Relation msgid "Relation" msgstr "Kesamaan" #. Invert msgid "Invert" msgstr "Kebalikan" msgid "Browse..." msgstr "Jelajah..." msgid "Images" msgstr "Gambar" msgid "File" msgstr "Berkas" msgid "Open directory..." msgstr "Buka direktori..." msgid "Open file..." msgstr "Buka berkas..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "kredit-penerjemah" msgid "An error has occured" msgstr "Sebuah kesalahan telah terjadi" msgid "Warning" msgstr "Peringatan" #, python-format msgid "Enable %s" msgstr "Aktifkan %s" msgid "Filter" msgstr "Penyaring" #, python-format msgid "Search %s Plugin Options" msgstr "Cari Opsi Plugin %s" msgid "Use This Plugin" msgstr "Gunakan Plugin Ini" msgid "Search Compiz Core Options" msgstr "Cari Opsi Compiz Core" msgid "Error" msgstr "Kesalahan" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Masukkan penyaring.\n" "Klik pada gambar papan ketik untuk mengambil kunci untuk pencarian" msgid "Search in..." msgstr "Cari di..." #. Options msgid "Short description and name" msgstr "Deskripsi pendek dan nama" msgid "Long description" msgstr "Deskripsi panjang" msgid "Settings value" msgstr "Nilai pengaturan" msgid "Group" msgstr "Kelompok" msgid "Subgroup" msgstr "Sub kelompok" #. Notebook msgid "Settings" msgstr "Pengaturan" msgid "Loading Advanced Search" msgstr "Sedang memposes Pencarian Lanjut" msgid "Add a New Profile" msgstr "Tambah Profil Baru" msgid "Remove This Profile" msgstr "Hapus Profil Ini" msgid "Default" msgstr "Default" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Impor" msgid "Import a CompizConfig Profile" msgstr "Impor Profil CompizConfig" msgid "Import as..." msgstr "Impor sebagai.." msgid "Import a CompizConfig Profile as a new profile" msgstr "Impor OmpizConfig profil sebagai profil baru" msgid "Export" msgstr "Ekspor" msgid "Export your CompizConfig Profile" msgstr "Ekspor Profil CompizConfig anda" msgid "Reset to defaults" msgstr "Reset ke default" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Reset profil CompizConfig ke default umum" msgid "Backend" msgstr "Bagian Belakang" msgid "Integration" msgstr "Integrasi" msgid "Enable integration into the desktop environment" msgstr "Aktifkan integrasi dengan lingkungan destop" msgid "Profiles (*.profile)" msgstr "Profil (*.profile)" msgid "All files" msgstr "Semua berkas" msgid "Save file.." msgstr "Simpan berkas.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Apakah anda ingin mengabaikan opsi isian default ketika mengekspor profil? " msgid "Open file.." msgstr "Buka berkas.." msgid "Enter a profile name" msgstr "Masukkan nama profil" msgid "Please enter a name for the new profile:" msgstr "Silahkan masukkan nama untuk profil baru:" msgid "Backend not found." msgstr "Bagian Belakang tidak ditemukan." #. Auto sort msgid "Automatic plugin sorting" msgstr "Pengurutan plugin otomatis" msgid "Disabled Plugins" msgstr "Plugin Non-aktif" msgid "Enabled Plugins" msgstr "Plugin Aktif" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "Tambah plugin" msgid "Plugin name:" msgstr "Nama plugin:" msgid "Insert plugin name" msgstr "Masukkan nama plugin" msgid "Preferences" msgstr "Pengaturan" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Mengatur backend, profil dan pengaturan internal lainya yang digunakan oleh " "System Pengatur Compiz" msgid "About" msgstr "Perihal" msgid "About CCSM..." msgstr "Perihal CCSM..." msgid "Profile & Backend" msgstr "Profil & Bagian Belakang" msgid "Plugin List" msgstr "Daftar Plugin" msgid "Filter your Plugin list" msgstr "Saring daftar plugin" #, python-format msgid "Screen %i" msgstr "Screen %i" msgid "Screen" msgstr "Screen" msgid "Category" msgstr "Kategori" msgid "Advanced Search" msgstr "Pencarian Lanjut" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Tidak menemukan. \n" "\n" " Penyaring anda \"%s\" tidak menemukan apapun." msgid "Configure Compiz with CompizConfig" msgstr "Atur Compiz dengan CompizConfig" #~ msgid "Value (%s)" #~ msgstr "Nilai (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Nilai (%(value)s) untuk %(setting)s" #~ msgid "Actions" #~ msgstr "Aksi" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/ja.po0000644000015301777760000003322112321343002022457 0ustar pbusernogroup00000000000000# ccsm Japanese translation. # Copyright (C) 2007 opencompositing.org # This file is distributed under the same license as the compiz-fusion package. # Masaaki KANEMOTO , 2007. # msgid "" msgstr "" "Project-Id-Version: ccsm 0.6\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-06-06 08:56+0200\n" "Last-Translator: Chris Hsin \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(plugin)s プラグイン㮠%(action)s アクションã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸ %" "(binding)s ã®æ–°ã—ã„設定ã¯ã€ %(plugin_conflict)s プラグイン㮠%" "(action_conflict)s アクションã¨å¹²æ¸‰ã—ã¾ã™ã€‚\n" "%(plugin_conflict)s プラグイン㮠%(action_conflict)s を無効ã«ã—" "ã¾ã™ã‹ï¼Ÿ" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s を無効化" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s ã®è¨­å®šä¸­æ­¢" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s ã‚’ã¨ã«ã‹ã設定" msgid "key" msgstr "キー" msgid "button" msgstr "ボタン" msgid "edge" msgstr "エッジ" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "ã©ã®ãƒ—ラグインã‹ã‚‰ã‚‚æä¾›ã•れã¦ã„ãªã„ %(feature)s 機能を使用ã—よ" "ã†ã¨ã—ã¦ã„ã¾ã™ã€‚\n" "ã“ã®æ©Ÿèƒ½ã‚’ã“ã®ã¾ã¾ä½¿ç”¨ã—ã¾ã™ã‹ï¼Ÿ" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s を使用" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s ã®ä½¿ç”¨åŒ–中止" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "%(plugin)s ã«ã‚ˆã‚Šæä¾›ã•れã¦ã„ã‚‹ %(feature)s 機能を使用ã—よã†ã¨" "ã—ã¦ã„ã¾ã™ã€‚\n" "ã“ã®ãƒ—ラグインã¯ç¾åœ¨ç„¡åйã®çŠ¶æ…‹ã§ã™ã€‚\n" "ã“ã®æ©Ÿèƒ½ã‚’利用å¯èƒ½ã«ã™ã‚‹ãŸã‚ %(plugin)s を有効ã«ã—ã¾ã™ã‹ï¼Ÿ" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s を有効化" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s ã®æœ‰åŠ¹åŒ–ä¸­æ­¢" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "%(plugin)s プラグイン㮠%(bindings)s 割り当ã¦ã®ã„ãã¤ã‹ã¯ä»–ã®ãƒ—ラグイ" "ンã¨å¹²æ¸‰ã—ã¾ã™ã€‚ã“れらã®å¹²æ¸‰ã‚’解決ã—ã¾ã™ã‹ï¼Ÿ" msgid "Resolve conflicts" msgstr "干渉を解決" msgid "Ignore conflicts" msgstr "干渉を無視" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s プラグインãŒã€%(plugin)s ã‹ã‚‰ã‚‚æä¾›ã•れる " "%(feature)s 機能をæä¾›ã—ã¦ã„ã¾ã™ã€‚" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s を無効化" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s ã®æœ‰åŠ¹åŒ–ä¸­æ­¢" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "%(plugin_conflict)s プラグイン㌠%(plugin)s ã¨å¹²æ¸‰ã—ã¾ã™ã€‚" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s ã®å‹•作ã«ã¯ã€ä»¥ä¸‹ã®ãƒ—ãƒ©ã‚°ã‚¤ãƒ³ã§æä¾›ã•れる %(feature)s 機能ãŒå¿…è¦ã§ã™:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "ã“れらã®ãƒ—ラグインを有効化" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "%(plugin)s ã®å‹•作ã«ã¯ã€ %(require)s プラグインãŒå¿…è¦ã§ã™ã€‚" #, python-format msgid "Enable %(require)s" msgstr "%(require)s を有効化" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s ã¯ã€ %(plugin_list)s プラグインã®å‹•作ã«å¿…è¦ãª %" "(feature)s 機能をæä¾›ã—ã¾ã™ã€‚" msgid "Disable these plugins" msgstr "ã“れらã®ãƒ—ラグインを無効化" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s ã®ç„¡åŠ¹åŒ–ä¸­æ­¢" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s 㯠%(plugin_list)s プラグインã®å‹•作ã«å¿…è¦ã§ã™ã€‚" msgid "General" msgstr "一般" msgid "Accessibility" msgstr "アクセシビリティ" msgid "Desktop" msgstr "デスクトップ" msgid "Extras" msgstr "エクストラ" msgid "Window Management" msgstr "ウィンドウ・マãƒã‚¸ãƒ¡ãƒ³ãƒˆ" msgid "Effects" msgstr "エフェクト" msgid "Image Loading" msgstr "ç”»åƒã®èª­ã¿è¾¼ã¿" msgid "Utility" msgstr "ユーティリティ" msgid "All" msgstr "ã™ã¹ã¦" msgid "Uncategorized" msgstr "未分類" msgid "N/A" msgstr "é©ç”¨ä¸å¯" msgid "Reset setting to the default value" msgstr "è¨­å®šã‚’ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã«æˆ»ã™" msgid "Edit" msgstr "編集" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "複数リストã®è¨­å®šã€‚列をダブルクリックã—ã¦å€¤ã‚’編集ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #, python-format msgid "Edit %s" msgstr "%s を編集" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ã¯æœ‰åйãªã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã§ã¯ã‚りã¾ã›ã‚“" msgid "Disabled" msgstr "無効" msgid "Enabled" msgstr "有効" msgid "Grab key combination" msgstr "キーã®çµ„ã¿åˆã‚ã›ã‚’ã¤ã‹ã‚€" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ã¯æœ‰åйãªãƒœã‚¿ãƒ³ã§ã¯ã‚りã¾ã›ã‚“" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "修飾キーãªã—ã§ Button1 ã‚’å˜ç‹¬ä½¿ç”¨ã™ã‚‹ã¨ã€ã‚らゆる左クリックæ“作ãŒé˜»å®³ã•れã€è¨­" "定ãŒç ´ç¶»ã—ã¾ã™ã€‚本当㫠\"%s\" ボタンを Button1 ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" ã¯æœ‰åйãªã‚¨ãƒƒã‚¸ãƒžã‚¹ã‚¯ã§ã¯ã‚りã¾ã›ã‚“" msgid "None" msgstr "ãªã—" msgid "CompizConfig Settings Manager" msgstr "CompizConfig 設定マãƒãƒ¼ã‚¸ãƒ£" msgid "Plugin" msgstr "プラグイン" msgid "Please press the new key combination" msgstr "æ–°ã—ã„キーã®çµ„ã¿åˆã‚ã›ã‚’入力ã—ã¦ãã ã•ã„" msgid "Window Title" msgstr "ウィンドウ・タイトル" msgid "Window Role" msgstr "ウィンドウ・ロール" msgid "Window Name" msgstr "ウィンドウ・ãƒãƒ¼ãƒ " msgid "Window Class" msgstr "ウィンドウ・クラス" msgid "Window Type" msgstr "ウィンドウ・タイプ" msgid "Window ID" msgstr "ウィンドウ ID" msgid "And" msgstr "ã‹ã¤" msgid "Or" msgstr "ã¾ãŸã¯" msgid "Edit match" msgstr "ãƒžãƒƒãƒæ¡ä»¶ã®ç·¨é›†" #. Type msgid "Type" msgstr "種類" #. Value msgid "Value" msgstr "値" msgid "Grab" msgstr "å–å¾—" #. Relation msgid "Relation" msgstr "è«–ç†æ¼”ç®—å­" #. Invert msgid "Invert" msgstr "å¦å®š" # スカイドーム画åƒã®å‚照ボタンã§è¡¨ç¤º msgid "Browse..." msgstr "å‚ç…§..." msgid "Images" msgstr "ç”»åƒ" msgid "File" msgstr "ファイル" msgid "Open directory..." msgstr "ディレクトリを開ã..." msgid "Open file..." msgstr "ファイルを開ã..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "ã“れ㯠CompizConfig 設定システム用ã®è¨­å®šãƒžãƒãƒ¼ã‚¸ãƒ£ã§ã™ã€‚" msgid "translator-credits" msgstr "" "Nishio Futoshi \n" "Yohsuke Ooi \n" "TABUCHI Takaaki \n" "Masaaki Kanemoto \n" "Jiro Kawada " msgid "An error has occured" msgstr "エラーãŒç™ºç”Ÿã—ã¾ã—ãŸ" msgid "Warning" msgstr "警告" #, python-format msgid "Enable %s" msgstr "%s を有効ã«ã™ã‚‹" msgid "Filter" msgstr "フィルタ" #, python-format msgid "Search %s Plugin Options" msgstr "%s プラグインã®ã‚ªãƒ—ションを検索" msgid "Use This Plugin" msgstr "ã“ã®ãƒ—ラグインã®ä½¿ç”¨" msgid "Search Compiz Core Options" msgstr "Compiz Core ã®ã‚ªãƒ—ションを検索" msgid "Error" msgstr "エラー" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "フィルタを入力ã€\n" "キーショートカット検索ã®ãŸã‚キーをã¤ã‹ã‚€ã«ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ç”»åƒã‚’クリック" msgid "Search in..." msgstr "検索対象..." #. Options msgid "Short description and name" msgstr "åå‰ã‚„ç°¡å˜ãªèª¬æ˜Ž" msgid "Long description" msgstr "詳細ãªèª¬æ˜Ž" msgid "Settings value" msgstr "設定値" msgid "Group" msgstr "グループ" msgid "Subgroup" msgstr "サブグループ" #. Notebook msgid "Settings" msgstr "設定" msgid "Loading Advanced Search" msgstr "詳細検索を読ã¿è¾¼ã¿ä¸­" msgid "Add a New Profile" msgstr "æ–°ã—ã„プロファイルを追加" msgid "Remove This Profile" msgstr "ã“ã®ãƒ—ロファイルを削除" msgid "Default" msgstr "デフォルト" msgid "Profile" msgstr "プロファイル" msgid "Import" msgstr "インãƒãƒ¼ãƒˆ" msgid "Import a CompizConfig Profile" msgstr "CompizConfig ã®ãƒ—ロファイルをインãƒãƒ¼ãƒˆ" msgid "Import as..." msgstr "別åã§ã‚¤ãƒ³ãƒãƒ¼ãƒˆ..." msgid "Import a CompizConfig Profile as a new profile" msgstr "CompizConfig ã®ãƒ—ロファイルを新ã—ã„プロファイルã¨ã—ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆ" msgid "Export" msgstr "エクスãƒãƒ¼ãƒˆ" msgid "Export your CompizConfig Profile" msgstr "CompizConfig ã®ãƒ—ロファイルをエクスãƒãƒ¼ãƒˆ" msgid "Reset to defaults" msgstr "ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã«æˆ»ã™" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "ã“ã® CompizConfig プロファイル内容全体をデフォルト値ã«ãƒªã‚»ãƒƒãƒˆ" msgid "Backend" msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰" msgid "Integration" msgstr "çµ±åˆ" msgid "Enable integration into the desktop environment" msgstr "デスクトップ環境ã¸ã®çµ±åˆã‚’有効ã«ã™ã‚‹" msgid "Profiles (*.profile)" msgstr "プロファイル (*.profile)" msgid "All files" msgstr "ã™ã¹ã¦ã®ãƒ•ァイル" msgid "Save file.." msgstr "ファイルをä¿å­˜..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "プロファイルをエクスãƒãƒ¼ãƒˆã™ã‚‹éš›ã«ã€ãƒ‡ãƒ•ォルトã®ã‚ªãƒ—ション値をçœãã¾ã™ã‹ï¼Ÿ" msgid "Open file.." msgstr "ファイルを開ã.." msgid "Enter a profile name" msgstr "プロファイルåを入力" msgid "Please enter a name for the new profile:" msgstr "æ–°ã—ã„プロファイルåを入力ã—ã¦ãã ã•ã„:" msgid "Backend not found." msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。" #. Auto sort msgid "Automatic plugin sorting" msgstr "プラグインã®è‡ªå‹•分類" msgid "Disabled Plugins" msgstr "無効ãªãƒ—ラグイン" msgid "Enabled Plugins" msgstr "有効ãªãƒ—ラグイン" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "本当ã«ãƒ—ラグインã®è‡ªå‹•分類を無効ã«ã—ã¾ã™ã‹ï¼Ÿã“ã®æ“作ã§å¹²æ¸‰ã®å‡¦ç†ã‚‚無効ã«ãªã‚Š" "ã¾ã™ã€‚何をã—よã†ã¨ã—ã¦ã„ã‚‹ã‹ç†è§£ã•れã¦ã„ãªã„å ´åˆã¯ã€ç„¡åйã«ã™ã¹ãã§ã¯ã‚りã¾ã›" "ん。" msgid "Add plugin" msgstr "プラグインを追加" msgid "Plugin name:" msgstr "プラグインã®åå‰:" msgid "Insert plugin name" msgstr "プラグインåを入力" msgid "Preferences" msgstr "設定" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Compiz 制御システムã«ã‚ˆã£ã¦ä½¿ç”¨ã•れるãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã‚„プロファイルã€ãã®ä»–内部設" "定を設定ã—ã¾ã™ã€‚" msgid "About" msgstr "詳細情報" msgid "About CCSM..." msgstr "CCSM ã«ã¤ã„ã¦..." msgid "Profile & Backend" msgstr "プロファイルã¨ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰" msgid "Plugin List" msgstr "プラグイン・リスト" msgid "Filter your Plugin list" msgstr "プラグインリストã®ãƒ•ィルタ" #, python-format msgid "Screen %i" msgstr "スクリーン %i" msgid "Screen" msgstr "スクリーン" msgid "Category" msgstr "カテゴリ" msgid "Advanced Search" msgstr "詳細検索" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ \n" "フィルタ \"%s\" ã¯ã©ã®ã‚¢ã‚¤ãƒ†ãƒ ã«ã‚‚一致ã—ã¾ã›ã‚“。" msgid "Configure Compiz with CompizConfig" msgstr "CompizConfig ã§ Compiz を設定ã—ã¾ã™" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "干渉ã®å¯èƒ½æ€§ã‚’計算ã—ã¦ã„ã¾ã™ã®ã§ãŠå¾…ã¡ãã ã•ã„" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/ccsm.pot0000644000015301777760000001721512321343002023203 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 12:33+0530\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "" #, python-format msgid "Don't set %(action)s" msgstr "" #, python-format msgid "Set %(action)s anyway" msgstr "" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" #, python-format msgid "Use %(feature)s" msgstr "" #, python-format msgid "Don't use %(feature)s" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" #, python-format msgid "Enable %(plugin)s" msgstr "" #, python-format msgid "Don't enable %(feature)s" msgstr "" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "" #, python-format msgid "Don't enable %(plugin)s" msgstr "" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" #, python-format msgid "Enable %(require)s" msgstr "" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "" #, python-format msgid "Don't disable %(plugin)s" msgstr "" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" msgid "General" msgstr "" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "" msgid "Extras" msgstr "" msgid "Window Management" msgstr "" msgid "Effects" msgstr "" msgid "Image Loading" msgstr "" msgid "Utility" msgstr "" msgid "All" msgstr "" msgid "Uncategorized" msgstr "" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "" msgid "Edit" msgstr "" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" #, python-format msgid "Edit %s" msgstr "" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "" msgid "Disabled" msgstr "" msgid "Enabled" msgstr "" msgid "Grab key combination" msgstr "" #, python-format msgid "\"%s\" is not a valid button" msgstr "" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "" msgid "CompizConfig Settings Manager" msgstr "" msgid "Plugin" msgstr "" msgid "Please press the new key combination" msgstr "" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "" #. Value msgid "Value" msgstr "" msgid "Grab" msgstr "" #. Relation msgid "Relation" msgstr "" #. Invert msgid "Invert" msgstr "" msgid "Browse..." msgstr "" msgid "Images" msgstr "" msgid "File" msgstr "" msgid "Open directory..." msgstr "" msgid "Open file..." msgstr "" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "" msgid "Warning" msgstr "" #, python-format msgid "Enable %s" msgstr "" msgid "Filter" msgstr "" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "" msgid "Search Compiz Core Options" msgstr "" msgid "Error" msgstr "" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "" #. Options msgid "Short description and name" msgstr "" msgid "Long description" msgstr "" msgid "Settings value" msgstr "" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "" msgid "Loading Advanced Search" msgstr "" msgid "Add a New Profile" msgstr "" msgid "Remove This Profile" msgstr "" msgid "Default" msgstr "" msgid "Profile" msgstr "" msgid "Import" msgstr "" msgid "Import a CompizConfig Profile" msgstr "" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "" msgid "All files" msgstr "" msgid "Save file.." msgstr "" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "Preferences" msgstr "" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" msgid "Filter your Plugin list" msgstr "" #, python-format msgid "Screen %i" msgstr "" msgid "Screen" msgstr "" msgid "Category" msgstr "" msgid "Advanced Search" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" msgid "Configure Compiz with CompizConfig" msgstr "" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/nl.po0000644000015301777760000003233612321343002022504 0ustar pbusernogroup00000000000000# Compizconfig Settings manager Dutch translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Rick - , 2007. # ./martijn - , 2007. # msgid "" msgstr "" "Project-Id-Version: 0.5.2\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-02-27 11:11+0100\n" "Last-Translator: Harald van Bree \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "De nieuwe waarde voor de %(binding)s binding for de actie %(action)s " "in plugin %(plugin)s conflicteert met de actie %(action_conflict)" "s van de %(plugin_conflict)s plugin.\n" "Wilt u %(action_conflict)s in plugin %(plugin_conflict)s " "uitschakelen?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Schakel %(action_conflict)s uit" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s niet instellen" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s alsnog instellen" msgid "key" msgstr "sleutel" msgid "button" msgstr "knop" msgid "edge" msgstr "rand" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Je probeert de optie %(feature)s te gebruiken dat door geen enkele " "plugin wordt geleverd.\n" "Wil je deze feature toch gebruiken?" #, python-format msgid "Use %(feature)s" msgstr "Gebruik %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s niet instellen" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Je probeert de eigenschap %(feature)s te gebruiken dat wordt geleverd " "door %(plugin)s.\n" "Deze plugin is momenteel uitgeschakeld.\n" "Wil je %(plugin)s inschakelen, zodat deze eigenschap beschikbaar is?" #, python-format msgid "Enable %(plugin)s" msgstr "Inschakelen %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s niet inschakelen" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Sommige %(bindings)s bindings van Plugin %(plugin)s conflicteren met " "andere plugins. Wil je deze conflicten oplossen?" msgid "Resolve conflicts" msgstr "Conflicten oplossen" msgid "Ignore conflicts" msgstr "Conflicten negeren" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Plugin %(plugin_conflict)s biedt de eigenschap %(feature)s dat " "ook wordt geleverd door %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s uitschakelen" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s niet inschakelen" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "Plugin %(plugin_conflict)s conclicteert met %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s vereist de eigenschap %(feature)s dat wordt " "geleverd door de volgende plugins:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Deze plugins inschakelen" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s vereist de plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "%(require)s inschakelen" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s biedt de eigenschap %(feature)s dat verplicht is " "voor de plugins %(plugin_list)s." msgid "Disable these plugins" msgstr "Deze plugins uitschakelen" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s niet uitschakelen" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s is vereist voor de plugins %(plugin_list)s." msgid "General" msgstr "Algemeen" msgid "Accessibility" msgstr "Toegankelijkheid" msgid "Desktop" msgstr "Bureaublad" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Venster beheer" msgid "Effects" msgstr "Effecten" msgid "Image Loading" msgstr "Afbeelding wordt geladen" msgid "Utility" msgstr "Gereedschap" msgid "All" msgstr "Alle" msgid "Uncategorized" msgstr "Niet gecategoriseerd" msgid "N/A" msgstr "N.V.T" msgid "Reset setting to the default value" msgstr "Instelling naar standaard herstellen" msgid "Edit" msgstr "Wijzigen" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Keuzelijst instellingen. U kunt een rij dubbelklikken om de inhoud te " "bewerken." #, python-format msgid "Edit %s" msgstr "Wijzigen %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s \" is geen valide verwijzing" msgid "Disabled" msgstr "Uitgeschakeld" msgid "Enabled" msgstr "Ingeschakeld" msgid "Grab key combination" msgstr "vang toets combinatie af" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" is geen valide knop" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Het gebruik van enkel Button1 zonder andere aanpassingen kan leiden tot het " "niet meer werken van de linker muisknop en kan dus uw systeem onwerkbaar " "maken. Weet u zeker dat u de \"%s\" knop op de plaats van Button1 wilt?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" is geen valide rand markering" msgid "None" msgstr "Geen" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Instellingen Beheerder" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Druk op de nieuwe toetsencombinatie." msgid "Window Title" msgstr "Venster titel" msgid "Window Role" msgstr "Vester rol" msgid "Window Name" msgstr "Venster naam" msgid "Window Class" msgstr "Venster klasse" msgid "Window Type" msgstr "Venster type" msgid "Window ID" msgstr "Venster ID" msgid "And" msgstr "En" msgid "Or" msgstr "Of" # In deze context is "match" waarschijnlijk "resultaat" van een zoekopdracht. Het betekent eigenlijk "gelijke" of "overeenkomstig", maar dit past volgens mij niet hier. # --- mahler: "Mee eens" msgid "Edit match" msgstr "Wijzigen resultaat" #. Type msgid "Type" msgstr "Type" #. Value msgid "Value" msgstr "Waarde" msgid "Grab" msgstr "Pak" #. Relation msgid "Relation" msgstr "Relatie" #. Invert msgid "Invert" msgstr "Inverteren" # --- mahler: Het is mogelijk dat "Bladeren naar..." beter zou zijn. msgid "Browse..." msgstr "Bladeren..." msgid "Images" msgstr "Afbeeldingen" msgid "File" msgstr "Bestand" msgid "Open directory..." msgstr "Open map..." msgid "Open file..." msgstr "Open bestand..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Dit is een instellingen beheer voor het CompizConfig configuratie syteem." msgid "translator-credits" msgstr "Vertalers eerbewijs" msgid "An error has occured" msgstr "Er is een fout opgetreden" msgid "Warning" msgstr "Waarschuwing" #, python-format msgid "Enable %s" msgstr "%s inschakelen" msgid "Filter" msgstr "Filter" #, python-format msgid "Search %s Plugin Options" msgstr "Zoeken in %s plugin opties" msgid "Use This Plugin" msgstr "Gebruik deze plugin" msgid "Search Compiz Core Options" msgstr "Doorzoek de Compiz Core opties" msgid "Error" msgstr "Fout" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Voer een filter in.\n" "Klik op de toetsenbord afbeelding om een toets te selecteren waarop wordt " "gezocht." msgid "Search in..." msgstr "Zoeken in..." #. Options msgid "Short description and name" msgstr "Korte beschrijving en naam" msgid "Long description" msgstr "Lange beschrijving" msgid "Settings value" msgstr "Instellingswaarde" msgid "Group" msgstr "Groep" msgid "Subgroup" msgstr "Subgroep" #. Notebook msgid "Settings" msgstr "Instellingen" # --- mahler: Het is waarschijnlijk dat dit een laadmelding is. msgid "Loading Advanced Search" msgstr "Laden geavanceerd zoeken" msgid "Add a New Profile" msgstr "Voeg nieuw profiel toe" msgid "Remove This Profile" msgstr "Verwijder dit profiel" msgid "Default" msgstr "Standaard" msgid "Profile" msgstr "Profiel" msgid "Import" msgstr "Importeren" msgid "Import a CompizConfig Profile" msgstr "Importeer een CompizConfig profiel" msgid "Import as..." msgstr "Importeer als..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importeer een CompizConfig profiel als nieuw profiel" msgid "Export" msgstr "Exporteren" msgid "Export your CompizConfig Profile" msgstr "Exporteer je CompizConfig profiel" msgid "Reset to defaults" msgstr "Standaard waarden herstellen" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "CompizConfig profiel herstellen naar standaardwaarden" msgid "Backend" msgstr "Onderliggend systeem" msgid "Integration" msgstr "Integratie" msgid "Enable integration into the desktop environment" msgstr "Intergratie met de desktop omgeving aanzetten" msgid "Profiles (*.profile)" msgstr "Profielen (*.profile)" msgid "All files" msgstr "Alle bestanden" msgid "Save file.." msgstr "Bestand opslaan.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Wil je de standaard instellingen overslaan tijdens het exporteren van je " "profiel" msgid "Open file.." msgstr "Open bestand.." msgid "Enter a profile name" msgstr "Geef een profiel naam" msgid "Please enter a name for the new profile:" msgstr "Geef een naam voor het nieuwe profiel:" msgid "Backend not found." msgstr "Onderliggend systeem niet gevonden." #. Auto sort msgid "Automatic plugin sorting" msgstr "Plugins automatisch sorteren" msgid "Disabled Plugins" msgstr "Plugins uitschakelen" msgid "Enabled Plugins" msgstr "Ingeschakelde plugins" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Weet je het zeker dat je het automatisch sorteren van plugins uit wilt " "zetten. Dit zet tevens de conflict waarschuwing uit. Doe dit alleen als je " "weet waarmee je bezig bent." msgid "Add plugin" msgstr "Plugin toevoegen" msgid "Plugin name:" msgstr "Naam plugin:" msgid "Insert plugin name" msgstr "Invoeren naam plugin" msgid "Preferences" msgstr "Voorkeuren" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configureer het onderliggend systeem, profielen en overige interne " "instellingen via het Compiz Configuratie Systeem." msgid "About" msgstr "Info" msgid "About CCSM..." msgstr "Info over CCSM..." msgid "Profile & Backend" msgstr "Profiel & onderliggend systeem" msgid "Plugin List" msgstr "Lijst plugins" msgid "Filter your Plugin list" msgstr "Filter je plugin lijst" #, python-format msgid "Screen %i" msgstr "Scherm %i" msgid "Screen" msgstr "Scherm" msgid "Category" msgstr "Categorie" msgid "Advanced Search" msgstr "Geavanceerd zoeken" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Geen overeenkomsten gevonden. \n" "\n" " Uw filter \"%s\" komt op geen enkel punt overeen." msgid "Configure Compiz with CompizConfig" msgstr "Beheer Compiz in met CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "" #~ "Bezig met berekenen van mogelijke conflicten. Een ogenblik geduld a.u.b." #~ msgid "Value (%s)" #~ msgstr "Waarde (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Waarde (%(value)s) voor %(setting)s:" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Niet afgehandelde type lijst %s for %s" #~ msgid "Actions" #~ msgstr "Acties" #~ msgid "Name" #~ msgstr "Naam" #~ msgid "Screen Edge" #~ msgstr "Scherm rand" #~ msgid "Button %i" #~ msgstr "Knop %i" #~ msgid "Edge Button" #~ msgstr "Rand knop" #~ msgid "On System Bell" #~ msgstr "Bij systeem melding" #~ msgid "Edit Action: %s" #~ msgstr "Wijzig actie: %s" #~ msgid "Screen Edges" #~ msgstr "Scherm randen" #~ msgid "Reset To Defaults" #~ msgstr "Standaardwaarden herstellen" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/pa.po0000644000015301777760000003743012321343002022473 0ustar pbusernogroup00000000000000# translation of ccsm.po to Punjabi # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # A S Alam , 2007. # Amanpreet Singh Alam , 2007. msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-11-11 19:50+0100\n" "Last-Translator: amandeep singh \n" "Language-Team: Punjabi/Panjabi \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "ਪਲੱਗਇਨ %(plugin)s ਵਿੱਚ %(action)s à¨à¨•ਸ਼ਨ ਲਈ %(binding)s ਬਾਈਡਿੰਗ ਦਾ " "ਨਵਾਂ ਮà©à©±à¨² %(plugin_conflict)s ਪਲੱਗਇਨ ਦੇ %(action_conflict)s à¨à¨•ਸ਼ਨ " "ਨਾਲ ਟਕਰਾ ਰਿਹ ਹੈ।\n" "ਕੀ ਤà©à¨¸à©€à¨‚ %(plugin_conflict)s ਪਲੱਗਇਨ ਵਿੱਚ %(action_conflict)s ਨੂੰ ਆਯੋਗ " "ਕਰਨਾ ਚਾਹà©à©°à¨¦à©‡ ਹੋ?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s ਆਯੋਗ" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s ਸੈੱਟ ਕਰੋ" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s ਦੂਰ ਸੈੱਟ ਕਰੋ" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "ਤà©à¨¸à©€à¨‚ %(feature)s ਫੀਚਰ ਵਰਤਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੇ ਹੋ, ਜੋ ਕਿ ਕਿਸੇ ਪਲੱਗਇਨ ਰਾਹੀਂ " "ਨਹੀਂ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ? ਕੀ ਤà©à¨¸à©€à¨‚ ਇਹ ਫੀਚਰ ਵਰਤਣਾ ਚਾਹà©à©°à¨¦à©‡ ਹੋ?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s ਵਰਤੋਂ" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s ਨਾ ਵਰਤੋਂ" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "ਤà©à¨¸à©€à¨‚ ਫੀਚਰ %(feature)s ਵਰਤਣਾ ਚਾਹà©à©°à¨¦à©‡ ਹੋ, ਜੋ ਕਿ %(plugin)s ਪਲੱਗਇਨ ਰਾਹੀਂ " "ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ।\n" "ਇਹ ਪਲੱਗਇਨ ਇਸ ਸਮੇਂ ਆਯੋਗ ਹੈ।\n" "ਕੀ ਤà©à¨¸à©€à¨‚ ਫੀਚਰ ਵਰਤਣ ਲਈ %(plugin)s ਯੋਗ ਕਰਨੀ ਚਾਹà©à©°à¨¦à©‡ ਹੋ?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s ਯੋਗ ਕਰੋ" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s ਯੋਗ ਨਾ ਕਰੋ" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "ਪਲੱਗਇਨ %(plugin_conflict)s ਫੀਚਰ %(feature)s ਦਿੰਦੀ ਹੈ, ਜੋ ਕਿ %" "(plugin)s ਵਲੋਂ ਵੀ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s ਆਯੋਗ ਕਰੋ" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s ਯੋਗ ਨਾ ਕਰੋ" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "ਪਲੱਗਇਨ %(plugin_conflict)s %(plugin)s ਨਾਲ ਟਕਰਾ ਰਹੀ ਹੈ।" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s ਲਈ %(feature)s ਫੀਚਰ ਦੀ ਲੋੜ ਹੈ, ਜੋ ਕਿ ਅੱਗੇ ਦਿੱਤੀ ਪਲੱਗਇਨ ਵਲੋਂ " "ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "ਇਹ ਪਲੱਗਇਨ ਯੋਗ ਹੈ" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s ਲਈ ਪਲੱਗਇਨ %(require)s ਲੋੜੀਦੀ ਹੈ।" #, python-format msgid "Enable %(require)s" msgstr "%(require)s ਲੋੜੀਦੀ ਹੈ" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s %(feature)s ਫੀਚਰ ਦਿੰਦੀ ਹੈ, ਜੋ ਕਿ %(plugin_list)s ਪਲੱਗਇਨ ਲਈ ਲੋੜੀਦਾ ਹੈ।" msgid "Disable these plugins" msgstr "ਇਹ ਪਲੱਗਇਨ ਆਯੋਗ ਕਰੋ" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s ਆਯੋਗ ਨਾ ਕਰੋ" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s ਪਲੱਗਇਨ %(plugin_list)s ਰਾਹੀਂ ਲੋੜੀਦੀ ਹੈ।" msgid "General" msgstr "ਸਧਾਰਨ" msgid "Accessibility" msgstr "ਅਸੈੱਸੇਬਿਲਟੀ" msgid "Desktop" msgstr "ਡੈਸਕਟਾਪ" msgid "Extras" msgstr "à¨à¨•ਸਟਰਾ" msgid "Window Management" msgstr "ਵਿੰਡੋ ਮੈਨਜੇਮੈਂਟ" msgid "Effects" msgstr "ਪਰਭਾਵ" msgid "Image Loading" msgstr "ਚਿੱਤਰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" msgid "Utility" msgstr "ਸਹੂਲਤਾਂ" msgid "All" msgstr "ਸਭ" msgid "Uncategorized" msgstr "ਅਣ-ਕੈਟਾਗਰੀ ਕੀਤੇ" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "ਸੈਟਿੰਗ ਨੂੰ ਡਿਫਾਲਟ ਮà©à©±à¨² ਲਈ ਮà©à©œ-ਸੈੱਟ ਕਰੋ" msgid "Edit" msgstr "ਸੋਧ" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "ਮਲਟੀ-ਲਿਸਟ ਸੈਟਿੰਗ ਹੈ। ਮà©à©±à¨² ਸੋਧਣ ਲਈ ਤà©à¨¸à©€à¨‚ ਡਬਲ-ਕਲਿੱਕ ਕਰ ਸਕਦੇ ਹੋ।" #, python-format msgid "Edit %s" msgstr "%s ਸੋਧ" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ਠੀਕ ਸ਼ਾਰਟਕੱਟ ਨਹੀਂ ਹੈ" msgid "Disabled" msgstr "ਆਯੋਗ ਹੈ" msgid "Enabled" msgstr "ਯੋਗ ਹੈ" msgid "Grab key combination" msgstr "ਸਵਿੱਚ ਸੰਯੋਗ ਲਵੋ" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ਇੱਕ ਵੈਧ ਬਟਨ ਨਹੀਂ ਹੈ" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "ਬਟਨ1 ਨੂੰ ਬਿਨਾਂ ਮੋਡੀਫਾਇਰ ਦੇ ਵਰਤਣ ਨਾਲ ਕੋਈ ਵੀ ਖੱਬਾ ਕਲਿੱਕ ਰà©à¨• ਸਕਦਾ ਹੈ ਅਤੇ ਤà©à¨¹à¨¾à¨¡à©€ ਸੰਰਚਨਾ ਖਰਾਬ " "ਹੋ ਸਕਦੀ ਹੈ। ਕੀ ਤà©à¨¸à©€à¨‚ ਬਟਨ1 ਲਈ \"%s\" ਬਟਨ ਸੈੱਟ ਕਰਨਾ ਚਾਹà©à©°à¨¦à©‡ ਹੋ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" ਇੱਕ ਵੈਧ ਕੋਨਾ ਮਾਸਕ ਨਹੀਂ ਹੈ" msgid "None" msgstr "ਕੋਈ ਨਹੀਂ" msgid "CompizConfig Settings Manager" msgstr "CompizConfig ਸੈਟਿੰਗ ਮੈਨੇਜਰ" #, fuzzy msgid "Plugin" msgstr "ਪਲੱਗਇਨ ਲਿਸਟ" msgid "Please press the new key combination" msgstr "ਨਵੇਂ ਸਵਿੱਚ ਸੰਯੋਗ ਲਈ ਦੱਬੋ ਜੀ" msgid "Window Title" msgstr "ਵਿੰਡੋ ਟਾਇਟਲ" msgid "Window Role" msgstr "ਵਿੰਡੋ ਰੋਲ" msgid "Window Name" msgstr "ਵਿੰਡੋ ਨਾਂ" msgid "Window Class" msgstr "ਵਿੰਡੋ ਕਲਾਸ" msgid "Window Type" msgstr "ਵਿੰਡੋ ਟਾਇਪ" msgid "Window ID" msgstr "ਵਿੰਡੋ ID" msgid "And" msgstr "ਅਤੇ" msgid "Or" msgstr "ਜਾਂ" msgid "Edit match" msgstr "ਮੇਲ ਸੋਧ" #. Type msgid "Type" msgstr "ਟਾਇਪ" #. Value msgid "Value" msgstr "ਮà©à©±à¨²" msgid "Grab" msgstr "ਲਵੋ" #. Relation msgid "Relation" msgstr "ਸਬੰਧ" #. Invert msgid "Invert" msgstr "ਉਲਟ" #, fuzzy msgid "Browse..." msgstr "à¨à¨²à¨• " msgid "Images" msgstr "ਚਿੱਤਰ" msgid "File" msgstr "ਫਾਇਲ" msgid "Open directory..." msgstr "ਡਾਇਰੈਕਟਰੀ ਖੋਲà©à¨¹à©‹..." msgid "Open file..." msgstr "ਫਾਇਲ ਖੋਲà©à¨¹à©‹..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "ਇਹ CompizConfig ਸੰਰਚਨਾ ਸਿਸਟਮ ਲਈ ਇੱਕ ਸੈਟਿੰਗ ਮੈਨੇਜਰ ਹੈ।" msgid "translator-credits" msgstr "ਅਨà©à¨µà¨¾à¨¦-ਮਾਣ" msgid "An error has occured" msgstr "ਇੱਕ ਗਲਤੀ ਆਈ ਹੈ" msgid "Warning" msgstr "ਚੇਤਾਵਨੀ" #, python-format msgid "Enable %s" msgstr "%s ਯੋਗ" msgid "Filter" msgstr "ਫਿਲਟਰ" #, python-format msgid "Search %s Plugin Options" msgstr "%s ਪਲੱਗਇਨ ਖੋਜ ਚੋਣ" msgid "Use This Plugin" msgstr "ਇਹ ਪਲੱਗਇਨ ਵਰਤੋਂ" msgid "Search Compiz Core Options" msgstr "ਕੰਪੋਜ਼ ਕੋਰ ਚੋਣ ਖੋਜ" msgid "Error" msgstr "ਗਲਤੀ" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "ਇਸ ਵਿੱਚ ਖੋਜ..." #. Options msgid "Short description and name" msgstr "ਸੰਖੇਪ ਵੇਰਵਾ ਅਤੇ ਨਾਂ" msgid "Long description" msgstr "ਵੱਧ ਵੇਰਵਾ" msgid "Settings value" msgstr "ਸੈਟਿੰਗ ਮà©à©±à¨²" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "ਸੈਟਿੰਗ" #, fuzzy msgid "Loading Advanced Search" msgstr "ਤਕਨੀਕੀ ਖੋਜ" msgid "Add a New Profile" msgstr "ਇੱਕ ਨਵਾਂ ਪਰੋਫਾਇਲ ਸ਼ਾਮਲ" msgid "Remove This Profile" msgstr "ਇਹ ਪਰੋਫਾਇਲ ਹਟਾਓ" msgid "Default" msgstr "ਡਿਫਾਲਟ" msgid "Profile" msgstr "ਪਰੋਫਾਇਲ" msgid "Import" msgstr "ਇੰਪੋਰਟ" msgid "Import a CompizConfig Profile" msgstr "ਇੱਕ CompizConfig ਪਰੋਫਾਇਲ ਇੰਪੋਰਟ ਕਰੋ" msgid "Import as..." msgstr "ਇੰਠਇੰਪੋਰਟ ਕਰੋ..." msgid "Import a CompizConfig Profile as a new profile" msgstr "ਇੱਕ CompizConfig ਪਰੋਫਾਇਲ ਨਵੇਂ ਪਰੋਫਾਇਲ ਵਾਂਗ ਇੰਪੋਰਟ ਕਰੋ" msgid "Export" msgstr "à¨à¨•ਸਪੋਰਟ" msgid "Export your CompizConfig Profile" msgstr "ਆਪਣਾ CompizConfig ਪਰੋਫਾਇਲ à¨à¨•ਸਪੋਰਟ ਕਰੋ" msgid "Reset to defaults" msgstr "ਡਿਫਾਲਟ ਵਾਂਗ ਮà©à©œ-ਸੈੱਟ ਕਰੋ" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "ਆਪਣਾ CompizConfig ਪਰੋਫਾਇਲ ਗਲੋਬਲ ਡਿਫਾਲਟ ਮà©à©œ-ਸੈੱਟ ਕਰੋ" msgid "Backend" msgstr "ਬੈਕà¨à¨‚ਡ" msgid "Integration" msgstr "à¨à¨‚ਟੀਗਰੇਸ਼ਨ" msgid "Enable integration into the desktop environment" msgstr "ਡੈਸਕਟਾਪ ਇੰਵਾਇਰਨਮੈਂਟ ਵਿੱਚ à¨à¨‚ਟੀਗਰੇਸ਼ਨ ਯੋਗ ਕਰੋ" msgid "Profiles (*.profile)" msgstr "ਪਰੋਫਾਇਲ (*.profile)" msgid "All files" msgstr "ਸਭ ਫਾਇਲਾਂ" msgid "Save file.." msgstr "ਫਾਇਲ ਸੰਭਾਲੋ..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "ਕੀ ਤà©à¨¸à©€à¨‚ ਆਪਣਾ ਪਰੋਫਾਇਲ à¨à¨•ਸਪੋਰਟ ਕਰਨ ਦੌਰਾਨ ਡਿਫਾਲਟ ਚੋਣ ਮà©à©±à¨² ਛੱਡਣੇ ਚਾਹà©à©°à¨¦à©‡ ਹੋ?" msgid "Open file.." msgstr "ਫਾਇਲ ਖੋਲà©à¨¹à©‹..." msgid "Enter a profile name" msgstr "ਇੱਕ ਪਰੋਫਾਇਲ ਨਾਂ ਦਿਓ" msgid "Please enter a name for the new profile:" msgstr "ਨਵੇਂ ਪਰੋਫਾਇਲ ਲਈ ਇੱਕ ਨਵਾਂ ਦਿਓ ਜੀ:" msgid "Backend not found." msgstr "ਬੈਕà¨à¨‚ਡ ਨਹੀਂ ਲੱਭਾ ਹੈ।" #. Auto sort msgid "Automatic plugin sorting" msgstr "ਆਟੋਮੈਟਿਕ ਪਲੱਗਇਨ ਲੜੀਬੱਧ ਕਰੋ" msgid "Disabled Plugins" msgstr "ਪਲੱਗਇਨ ਆਯੋਗ ਹੈ" msgid "Enabled Plugins" msgstr "ਪਲੱਗਇਨ ਯੋਗ ਹੈ" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "ਕੀ ਤà©à¨¸à©€à¨‚ ਆਟੋਮੈਟਿਕ ਪਲੱਗਇਨ ਲੜੀਬੱਧ ਨੂੰ ਆਯੋਗ ਕਰਨਾ ਚਾਹà©à©°à¨¦à©‡ ਹੋ? ਇਸ ਨਾਲ ਅਪਵਾਦ ਹੈਂਡਲਿੰਗ ਵੀ ਆਯੋਗ ਹੋ " "ਜਾਵੇਗੀ। ਤà©à¨¹à¨¾à¨¨à©‚à©° ਇਹ ਤਾਂ ਹੀ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ, ਜੇ ਤà©à¨¸à©€à¨‚ ਜਾਣਦੇ ਹੋ ਕਿ ਤà©à¨¸à©€à¨‚ ਕੀ ਕਰ ਰਹੇ ਹੋ।" msgid "Add plugin" msgstr "ਪਲੱਗਇਨ ਸ਼ਾਮਲ" msgid "Plugin name:" msgstr "ਪਰੋਫਾਇਲ ਨਾਂ:" msgid "Insert plugin name" msgstr "ਪਲੱਗਇਨ ਨਾਂ ਸ਼ਾਮਲ ਕਰੋ" msgid "Preferences" msgstr "ਪਸੰਦ" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "ਬੈਕà¨à¨‚ਡ, ਪਰੋਫਾਇਲ ਅਤੇ ਹੋਰ ਅੰਦਰੂਨੀ ਸੈਟਿੰਗ ਦੀ ਸੰਰਚਨਾ ਕੰਪਿਜ਼ ਸੰਰਚਨਾ ਸਿਸਟਮ ਰਾਹੀਂ।" msgid "About" msgstr "ਇਸ ਬਾਰੇ" msgid "About CCSM..." msgstr "CCSM ਬਾਰੇ..." msgid "Profile & Backend" msgstr "ਪਰੋਫਾਇਲ ਅਤੇ ਬੈਂਕà¨à¨‚ਡ" msgid "Plugin List" msgstr "ਪਲੱਗਇਨ ਲਿਸਟ" msgid "Filter your Plugin list" msgstr "ਆਪਣੀ ਪਲੱਗਇਨ ਲਿਸਟ ਫਿਲਟਰ ਕਰੋ" #, python-format msgid "Screen %i" msgstr "%i ਸਕਰੀਨ" msgid "Screen" msgstr "ਸਕਰੀਨ" msgid "Category" msgstr "ਕੈਟਾਗਰੀ" msgid "Advanced Search" msgstr "ਤਕਨੀਕੀ ਖੋਜ" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "ਕੋਈ ਮੇਲ ਨਹੀਂ ਲੱਭਾ।\n" "\n" "ਤà©à¨¹à¨¾à¨¡à¨¾ ਫਿਲਟਰ \"%s\" ਕਿਸੇ ਆਈਟਮ ਨਾਲ ਮਿਲਦਾ ਨਹੀਂ ਹੈ।" msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "ਟਕਰਾ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ, ਉਡੀਕੋ ਜੀ" #~ msgid "Value (%s)" #~ msgstr "ਮà©à©±à¨² (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s ਲਈ ਮà©à©±à¨² (%(value)s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "ਅਣ-ਹੈਂਡਲ ਲਿਸਟ ਟਾਈਪ %s, %s ਲਈ" #~ msgid "Actions" #~ msgstr "à¨à¨•ਸ਼ਨ" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/tr.po0000644000015301777760000003224712321343002022521 0ustar pbusernogroup00000000000000# translation of ccsm.po to # translation of ccsm-new.po to # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # # Serdar Soytetir , 2007. msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-10-28 12:31+0100\n" "Last-Translator: Emre KURNAZ \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(binding)s baÄŸlayıcısı için belirlenen yeni deÄŸer (%(action)s " "davranışını saÄŸlayan ve %(plugin)s eklentisi içersinde bulunan) %" "(action_conflict)sdavranışı ile çakışıyor (%(plugin_conflict)s " "eklentisi içerisindeki).\n" "%(action_conflict)s özelliÄŸini (%(plugin_conflict)s eklentisi " "içerisindeki) pasifleÅŸtirmek ister misiniz?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s Eklentisini PasifleÅŸtir" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s ÖzelliÄŸini Kullanma" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s ÖzelliÄŸini HerÅŸeye RaÄŸmen Kullan" msgid "key" msgstr "anahtar" msgid "button" msgstr "düğme" msgid "edge" msgstr "kenar" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "%(feature)s özelliÄŸini kullanmaya çalışıyorsunuz ancak bu özellik " "hiçbir eklenti tarafından saÄŸlanmıyor.\n" "Yine de bu özelliÄŸi etkinleÅŸtirmek ister misiniz?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s ÖzelliÄŸini Kullan" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s ÖzelliÄŸini Kullanma" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "%(feature)s özelliÄŸini kullanmaya çalışıyorsunuz ancak bu özellik %" "(plugin)s eklentisi tarafından saÄŸlanıyor.\n" "Bu eklenti ÅŸuanda etkin durumda deÄŸil.\n" "%(plugin)s eklentisini etkinleÅŸtirerek bu özelliÄŸi kullanmak ister " "misiniz?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s Eklentisini EtkinleÅŸtir" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s ÖzelliÄŸini EtkinleÅŸtirme" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Eklentinin %(plugin)s bazı %(bindings)s baÄŸlayıcıları diÄŸer " "eklentilerle çakışıyor. Bu çakışmaları çözmek istiyor musunuz?" msgid "Resolve conflicts" msgstr "Çakışmaları çöz" msgid "Ignore conflicts" msgstr "Çakışmaları görmezden gel" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s eklentisi tarafından saÄŸlanan %(feature)s " "özelliÄŸi aynı zamanda %(plugin)s eklentisi tarafından da saÄŸlanıyor" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s Eklentisini PasifleÅŸtir" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s Eklentisini EtkinleÅŸtirme" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "%(plugin_conflict)s eklentisi %(plugin)s eklentisi ile " "çakışıyor." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s eklentisi %(feature)s özelliÄŸine gereksinim " "duyuyor, bu özellik ÅŸu eklentiler tarafından saÄŸlanıyor:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Bu eklentileri etkinleÅŸtir" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "%(plugin)s eklentisi %(require)s eklentisine gereksinim " "duyuyor." #, python-format msgid "Enable %(require)s" msgstr "%(require)s Eklentisini EtkinleÅŸtir" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s eklentisi tarafından saÄŸlanan %(feature)s " "özelliÄŸine %(plugin_list)seklentileri tarafından gereksinim duyuluyor." msgid "Disable these plugins" msgstr "Bu eklentileri pasifleÅŸtir" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s Eklentisini PasifleÅŸtir" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s eklentisine %(plugin_list)s eklentileri tarafından " "gereksinim duyuluyor." msgid "General" msgstr "Genel" msgid "Accessibility" msgstr "EriÅŸebilirlik" msgid "Desktop" msgstr "Masaüstü" msgid "Extras" msgstr "Daha Fazlası" msgid "Window Management" msgstr "Pencere Yönetimi" msgid "Effects" msgstr "Efektler" msgid "Image Loading" msgstr "Resim Yükleme" msgid "Utility" msgstr "Araçlar" msgid "All" msgstr "Tümü" msgid "Uncategorized" msgstr "KategorilenmemiÅŸ" msgid "N/A" msgstr "Mevcut DeÄŸil" msgid "Reset setting to the default value" msgstr "Ayarları öntanımlı deÄŸerlere döndür" msgid "Edit" msgstr "Düzenle" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Çoklu liste ayarları. Bir stıra çift tıklayarak deÄŸerleri " "düzenleyebilirsiniz." #, python-format msgid "Edit %s" msgstr "%s Ögesini Düzenle" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" geçerli bir kısayol deÄŸil" msgid "Disabled" msgstr "Pasif" msgid "Enabled" msgstr "Etkin" msgid "Grab key combination" msgstr "TuÅŸlara basarak kısayolu belirle" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" geçerli bir düğme deÄŸil" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Düğme1'i baÅŸka bir hızlandırıcı tuÅŸ ile kullanmanız farenizin sol düğmesi " "ile tıklama yapamayacaksınız ve tabii ki yapılandırmanız bozulacak. " "Gerçekten \"%s\" düğmesini Düğme1 olarak ayarlamak istediÄŸnizden emin " "misiniz?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" geçerli bir gölgeleme maskesi deÄŸil" msgid "None" msgstr "Hiçbiri" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Ayar Yöneticisi" #, fuzzy msgid "Plugin" msgstr "Eklenti Listesi" msgid "Please press the new key combination" msgstr "Lütfen yeni kısayol tuÅŸlarına basın" msgid "Window Title" msgstr "Pencere BaÅŸlığı" msgid "Window Role" msgstr "Pencere Rolü" msgid "Window Name" msgstr "Pencere Adı" msgid "Window Class" msgstr "Pencere Sınıfı" msgid "Window Type" msgstr "Pencere Tipi" msgid "Window ID" msgstr "Pencere KimliÄŸi" msgid "And" msgstr "Ve" msgid "Or" msgstr "Veya" msgid "Edit match" msgstr "EÅŸleÅŸenleri düzenle" #. Type msgid "Type" msgstr "Tip" #. Value msgid "Value" msgstr "DeÄŸer" msgid "Grab" msgstr "Yakala" #. Relation msgid "Relation" msgstr "İliÅŸki" #. Invert msgid "Invert" msgstr "Tersine Çevir" #, fuzzy msgid "Browse..." msgstr "Bunun için gözat " msgid "Images" msgstr "Resimler" msgid "File" msgstr "Dosya" msgid "Open directory..." msgstr "Dizin aç..." msgid "Open file..." msgstr "Dosya aç..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Bu, CompizConfig yapılandırma sistemi için bir ayar yöneticisidir." msgid "translator-credits" msgstr "Serdar Soytetir (tulliana@gmail.com)" msgid "An error has occured" msgstr "Bir hata oluÅŸtu" msgid "Warning" msgstr "Uyarı" #, python-format msgid "Enable %s" msgstr "%s Ögesini EtkinleÅŸtir" msgid "Filter" msgstr "Filtrele" #, python-format msgid "Search %s Plugin Options" msgstr "%s Eklentiye Ait Seçenekleri Ara" msgid "Use This Plugin" msgstr "Bu Eklentiyi Kullan" msgid "Search Compiz Core Options" msgstr "Compiz Core Seçeneklerinde Ara" msgid "Error" msgstr "Hata" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Bir süzgeç giriniz.\n" "Arama için bir tuÅŸ kapmak için tuÅŸ takımı görüntüsüne basınız." msgid "Search in..." msgstr "Burada ara..." #. Options msgid "Short description and name" msgstr "Kısa tanımlama ve isim" msgid "Long description" msgstr "Uzun tanımlama" msgid "Settings value" msgstr "Ayar deÄŸerleri" msgid "Group" msgstr "Küme" msgid "Subgroup" msgstr "Alt küme" #. Notebook msgid "Settings" msgstr "Ayarlar" #, fuzzy msgid "Loading Advanced Search" msgstr "GeliÅŸmiÅŸ Arama" msgid "Add a New Profile" msgstr "Yeni bir Profil Ekle" msgid "Remove This Profile" msgstr "Bu Profili Sil" msgid "Default" msgstr "Öntanımlı" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "İçeriye Aktar" msgid "Import a CompizConfig Profile" msgstr "CompizConfig Profilini İçeriye Aktar" msgid "Import as..." msgstr "İçeriye farklı aktar..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Bir CompizConfig Profilini yeni profil olarak içeriye aktar" msgid "Export" msgstr "Dışarıya Aktar" msgid "Export your CompizConfig Profile" msgstr "CompizConfig Profilini Dışarıya Aktar" msgid "Reset to defaults" msgstr "Öntanımlı ayarlara dön" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "CompizConfig Profilinini öntanımlı genel ayarlara döndür" msgid "Backend" msgstr "Arka Uç" msgid "Integration" msgstr "BütünleÅŸme" msgid "Enable integration into the desktop environment" msgstr "Masaüstü ortamı ile bütünleÅŸmeyi etkinleÅŸtir" msgid "Profiles (*.profile)" msgstr "Profiller (*.profile)" msgid "All files" msgstr "Tüm dosyalar" msgid "Save file.." msgstr "Dosyayı kaydet.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Profilinizi kaydederken varsayılan deÄŸerleri atlamak ister misiniz?" msgid "Open file.." msgstr "Dosya aç.." msgid "Enter a profile name" msgstr "Bir profil adı girin" msgid "Please enter a name for the new profile:" msgstr "Lütfen yeni profil için bir isim girin:" msgid "Backend not found." msgstr "Arka Uç bulunamadı." #. Auto sort msgid "Automatic plugin sorting" msgstr "Otomatik eklenti sıralaması" msgid "Disabled Plugins" msgstr "Pasif Eklentiler" msgid "Enabled Plugins" msgstr "Etkin Eklentiler" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Otomatik eklenti sıralamasını pasifleÅŸtirmek istediÄŸinizden emin misiniz? Bu " "aynı zamanda çakışmaların kontrol edilmesini de engelleyecektir. Bunu sadece " "ne yaptığınızı biliyorsanız yapın." msgid "Add plugin" msgstr "Eklenti Ekle" msgid "Plugin name:" msgstr "Eklenti adı:" msgid "Insert plugin name" msgstr "Eklenti adını girin" msgid "Preferences" msgstr "Tercihler" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "CompizConfig Yapılandırma Sistemi tarafından kullanılan Arka Uç, profil ve " "iç ayarları yapılandırın." msgid "About" msgstr "Hakkında" msgid "About CCSM..." msgstr "CCSM Hakkında..." msgid "Profile & Backend" msgstr "Profil & Arka Uç" msgid "Plugin List" msgstr "Eklenti Listesi" msgid "Filter your Plugin list" msgstr "Eklenti listenizi filtreleyin" #, python-format msgid "Screen %i" msgstr "Ekran %i" msgid "Screen" msgstr "Ekran" msgid "Category" msgstr "Kategori" msgid "Advanced Search" msgstr "GeliÅŸmiÅŸ Arama" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "EÅŸleÅŸme bulunamadı. \n" "\n" " Filtreniz \"%s\" hiçbir öge ile eÅŸleÅŸmedi." msgid "Configure Compiz with CompizConfig" msgstr "Compiz'i, CompizConfig ile yapılandır" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Olası çakışmalar kontrol ediliyor, lütfen bekleyin" #~ msgid "Value (%s)" #~ msgstr "DeÄŸer (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s ayarları için deÄŸerler (%(value)s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Kullanılamayan liste tipi %s %s için" #~ msgid "Actions" #~ msgstr "Davranışlar" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/wo.po0000644000015301777760000003041712321343002022516 0ustar pbusernogroup00000000000000# Wolof translation of ccsm # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR Werner Landgraf , 2007-09-12 # Algumas palavras não tenham tradução adequada, os quais no momento # coloco em portugues, geralmente entendido no local # iconv -t UTF-8 wo.pot > wo.po ; msgfmt -cv wo.po msgid "" msgstr "" "Project-Id-Version: ccsm 20070908\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2007-09-24 23:00+0200\n" "Last-Translator: Werner Landgraf \n" "Language-Team: Wolof\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Defaay %(action)s u %(binding)s ci biir %(plugin)sdef na jöffë-" "jöffë ak %(action_conflict)s ci biir %(plugin_conflict)s.\n" "Ndax nga bögge fayal %(action_conflict)s ci biir %(plugin_conflict)" "s ?" #, python-format msgid "Disable %(action_conflict)s" msgstr "fayal %(action_conflict)s ..." #, python-format msgid "Don't set %(action)s" msgstr "Bul ñörĩàl %(action)s !" #, python-format msgid "Set %(action)s anyway" msgstr "Ñörĩàlal %(action)s dê !" #, fuzzy msgid "key" msgstr "Botão u teclado" #, fuzzy msgid "button" msgstr "botão u jénnax" msgid "edge" msgstr "" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Da nga jêem y ñöriñ %(feature)s li %(plugin)s indil na ko.\n" "Waaye loolu dafa fayal\n" "Ndax nga böggë taxàl %(plugin)s ngir ko ñöriñ ?" #, fuzzy, python-format msgid "Use %(feature)s" msgstr "Bul ñöriñàl %(feature)s !" #, fuzzy, python-format msgid "Don't use %(feature)s" msgstr "Bul ñöriñàl %(feature)s !" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Da nga jêem y ñöriñ %(feature)s li %(plugin)s indil na ko.\n" "Waaye loolu dafa fayal\n" "Ndax nga böggë taxàl %(plugin)s ngir ko ñöriñ ?" #, python-format msgid "Enable %(plugin)s" msgstr "Ñöriñalal %(plugin)s !" #, python-format msgid "Don't enable %(feature)s" msgstr "Bul ñöriñàl %(feature)s !" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Def na jöffë-jöffë nä %(plugin_conflict)s waye %(plugin)s itam " "indil neñu %(feature)s lá." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Fayal %(plugin_conflict)s !" #, python-format msgid "Don't enable %(plugin)s" msgstr "Bul taxal %(plugin)s !" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "%(plugin_conflict)s dafa döppu ak %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s soxla na %(feature)s li %(plugin_list)s mën nañu " "indilàl" msgid "Enable these plugins" msgstr "taxalal defaay yooyu !" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s soxla na %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Taxalal %(require)s !" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s indil na defaay %(feature)s li %(plugin_list)s soxla neñu ko." msgid "Disable these plugins" msgstr "Fayal defukaay yoñu !" #, python-format msgid "Don't disable %(plugin)s" msgstr "Bul fay %(plugin)s !" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s dafa ñöriñu i %(plugin_list)s." msgid "General" msgstr "bu yoon" msgid "Accessibility" msgstr "çônêa" msgid "Desktop" msgstr "Taabal" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Gerênciador de Janélas" msgid "Effects" msgstr "luxus" msgid "Image Loading" msgstr "indil natal yi ..." msgid "Utility" msgstr "defekaay" msgid "All" msgstr "löppë" msgid "Uncategorized" msgstr "ñak xät" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Ñögal ñög gu wees gi" msgid "Edit" msgstr "binde ..." msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "Fí, mön nga tann dara ci, ngir nga mbinde ko" #, python-format msgid "Edit %s" msgstr "bindal %s !" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" du doxe" # msgid "Disabled" msgstr "dafa fayàl" # msgid "Enabled" msgstr "taxàl" msgid "Grab key combination" msgstr "taanal am mbootaay y butão !" #, python-format msgid "\"%s\" is not a valid button" msgstr "Mënesul taan butão \"%s\" !" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "ÑörÄ© Butão-1 fi, loolu mënna indil jöffe-jöffe ndaxte tere ñörÄ© ko naka yoon." "Ndax nga bögge teg \"%s\" ngir Butão-1 düggë-düggë ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr " Hamul koÄ© \"%s\" !" msgid "None" msgstr "du dara" msgid "CompizConfig Settings Manager" msgstr "Tannay u CompizConfig" #, fuzzy msgid "Plugin" msgstr "defëkaay yi" msgid "Please press the new key combination" msgstr "jänal mbootaay y butão mu taanoo !" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" #, fuzzy msgid "Window Name" msgstr "Gerênciador de Janélas" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "" #. Value #, fuzzy msgid "Value" msgstr "Ñög gi (%s)" msgid "Grab" msgstr "" #. Relation #, fuzzy msgid "Relation" msgstr "Integração" #. Invert msgid "Invert" msgstr "" #, fuzzy msgid "Browse..." msgstr "Wuutë ngir : ... " msgid "Images" msgstr "Natal yi" msgid "File" msgstr "Binday" msgid "Open directory..." msgstr "hubbi ndaal y bindaay ..." msgid "Open file..." msgstr "Ubbi binday.." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Li dafa programa bu ogosu na CompizConfig bi. " msgid "translator-credits" msgstr "tekkimi: Werner Landgraf " msgid "An error has occured" msgstr "Hamna ab njuumte !" msgid "Warning" msgstr "Möy tul !" #, python-format msgid "Enable %s" msgstr "Taxalal %s !" msgid "Filter" msgstr "tannaay" #, python-format msgid "Search %s Plugin Options" msgstr "Wuut na ngir defëkaay %s -am mënnéel yi ..." msgid "Use This Plugin" msgstr "Ñöriñal defëkaay bii !" msgid "Search Compiz Core Options" msgstr "Wuut na ngir Compiz Core mënnéel yi ..." msgid "Error" msgstr "njuumte !" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "wuutë ci biir ... :" #. Options msgid "Short description and name" msgstr "Tekke tey tudde:" msgid "Long description" msgstr "Tekke bu rey:" msgid "Settings value" msgstr "Ñeg ñu tegu:" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "Ñeg ñu" #, fuzzy msgid "Loading Advanced Search" msgstr "wut wu gönnë baax ..." msgid "Add a New Profile" msgstr "Tegal xät u lüggey bu bees ..." msgid "Remove This Profile" msgstr "Fayal xät u lüggey bii ..." msgid "Default" msgstr "bu yoon" msgid "Profile" msgstr "xät u lüggey" msgid "Import" msgstr "indil ..." msgid "Import a CompizConfig Profile" msgstr "indil ab xät u lüggey ngir CompizConfig ..." # msgid "Import as..." msgstr "indil naka ..." # msgid "Import a CompizConfig Profile as a new profile" msgstr "indil ab xät u lüggey u CompizConfig ngir ñeriñ ko lêegi ... " msgid "Export" msgstr "indal ..." msgid "Export your CompizConfig Profile" msgstr "indal sa xeet u CompizConfig" # msgid "Reset to defaults" msgstr "Teg ñög-yu-jaad yi ... " # msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Teg ñög-yu-jaad yi ñöppë ngir CompizConfig -am xät u lüggey ... " msgid "Backend" msgstr "Programa ci biir" msgid "Integration" msgstr "Integração" msgid "Enable integration into the desktop environment" msgstr "defare integração ci taabal" msgid "Profiles (*.profile)" msgstr "xät i lüggey yi (*.profile)" msgid "All files" msgstr "mbinday yöpp" msgid "Save file.." msgstr "denc binday ..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "hubbi binday ..." msgid "Enter a profile name" msgstr "bindal tudde u lüggey -am xät ! " msgid "Please enter a name for the new profile:" msgstr "bindal ab tudde ngir xät bu bees bi, bü là nääxë" msgid "Backend not found." msgstr "hamul programa ci biir bi ... :(" #. Auto sort msgid "Automatic plugin sorting" msgstr "sèddàl defëkaay yi ..." msgid "Disabled Plugins" msgstr "defëkaay yu fay nañu:" msgid "Enabled Plugins" msgstr "defëkaay yu tann nañu:" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "yookàl ab defukaay ..." msgid "Plugin name:" msgstr "tudde u defëkaay:" msgid "Insert plugin name" msgstr "bindal tudde u defekaay !" msgid "Preferences" msgstr "tanne yi" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "ogos na programa tey löpp ngir ogosu Compiz, tey xät yu lüggey i ñit ... " msgid "About" msgstr "Sobre" msgid "About CCSM..." msgstr "Sobre CCSM" msgid "Profile & Backend" msgstr "Programa ci biir & xéet u lüggey" msgid "Plugin List" msgstr "defëkaay yi" msgid "Filter your Plugin list" msgstr "tannal sa defëkaay yi !" #, python-format msgid "Screen %i" msgstr "Telha %i" msgid "Screen" msgstr "Telha" msgid "Category" msgstr "xät" msgid "Advanced Search" msgstr "wut wu gönnë baax ..." #, fuzzy, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Hamul du dara melo. \n" " \n" " Sa wuute ngir \"%s\" hamulhoon ndamm." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "gis ndax hame jöfë-jöfë ... , xaral bü là näxë !" #~ msgid "Value (%s)" #~ msgstr "Ñög gi (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Ñög gi (%(value)s) u %(setting)s:" #~ msgid "Unhandled list type %s for %s" #~ msgstr "%s u %s du xamee" #~ msgid "Actions" #~ msgstr "defaay yi" #~ msgid "Disable %s" #~ msgstr "Fay ... " #~ msgid "Name" #~ msgstr "Tudde" #~ msgid "Screen Edge" #~ msgstr "koÄ© u telha" #~ msgid "Button %i" #~ msgstr "Botão %i u jénnax" #~ msgid "Edge Button" #~ msgstr "butão ngir koÄ© u telha" #~ msgid "On System Bell" #~ msgstr "ao tocar a campaínha" #~ msgid "Edit Action: %s" #~ msgstr "bindal bu war na def defaay %s ! " #~ msgid "Screen Edges" #~ msgstr "ay koÄ© i telha" #~ msgid "Reset To Defaults" #~ msgstr "Ñögàl ñög ñu wees yi ..." compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/mnk.po0000644000015301777760000003126712321343002022662 0ustar pbusernogroup00000000000000# CompizConfig Mandingo translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Werner Landgraf # Por falta de ortografia oficial, uso essentialmente àquela de: # Carreira, António: Mandingas da Guiné Portuguesa. Bissão 1947 # mas substituo dj -> j ; j -> y . # Sonderzeichen ã,õ,Ä©,ẽ,Å©,ñ die auch nachfolgendes Å‹ einschließen # Palavras que não sei, coloquei em português. # iconv -t UTF-8 *.pot > *.po ; msgfmt -cv *.po msgid "" msgstr "" "Project-Id-Version: md-ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 12:33+0530\n" "PO-Revision-Date: 2007-09-24 23:00-0300\n" "Last-Translator: Werner Landgraf \n" "Language-Team: Mandingo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Dorão %(plugin)s -la kêebaarão %(action)s -la da %(binding)s a-" "ualita dorão %(plugin_conflict)s -la kêbarão %(action_conflict)s le ti.Fa i lafita dorão %(plugin_conflict)s -la kêbarão %" "(action_conflict)s dubẽna ?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s dubẽna ..." #, python-format msgid "Don't set %(action)s" msgstr "Kanna %(action)s malãdi !" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s malãdi jiko-o-jiko !" #, fuzzy msgid "key" msgstr "teclado-la Botão" #, fuzzy msgid "button" msgstr "niño-la botão" msgid "edge" msgstr "" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "I ka kitindila dorão %(plugin)s -lu-la kêebaarão %(feature)s " "naffala.\n" "Ñĩ dorão, a-dubẽta.\n" "Fa i lafta %(plugin)s malãdila, fo i a naffa nola?" #, fuzzy, python-format msgid "Use %(feature)s" msgstr "Kanna %(feature)s malãdi !" #, fuzzy, python-format msgid "Don't use %(feature)s" msgstr "Kanna %(feature)s malãdi !" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "I ka kitindila dorão %(plugin)s -lu-la kêebaarão %(feature)s " "naffala.\n" "Ñĩ dorão, a-dubẽta.\n" "Fa i lafta %(plugin)s malãdila, fo i a naffa nola?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s malãdi bã !" #, python-format msgid "Don't enable %(feature)s" msgstr "Kanna %(feature)s malãdi !" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Dorão %(plugin_conflict)s çãba nã kêbarão %(feature)s le mim " "çãba nã dorão %(plugin)s fanã. Ñĩ a-ualita." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s dubẽ bã !" #, python-format msgid "Don't enable %(plugin)s" msgstr "Kanna %(plugin)s malãdi ! " #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "Dorão-lu %(plugin_conflict)s anÄ© %(plugin)s a-ualita." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "Dorão-lu %(plugin)s çohla %(feature)s le ti, mim çãbãdi nã " "dorão-lu:\n" " %(plugin_list)s" msgid "Enable these plugins" msgstr "ñĩ dorão-lu malãdi bã !" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "Dorão-lu %(plugin)s, dorão %(require)s çohla." #, python-format msgid "Enable %(require)s" msgstr "%(require)s malãdi bã !" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "Dorão %(plugin)s , kêbarão %(feature)s çãba nã mim çohlãdi " "dorão-lu %(plugin_list)s." msgid "Disable these plugins" msgstr "dorão-lu ñĩ, dubẽ bã !" #, python-format msgid "Don't disable %(plugin)s" msgstr "Dorão-lu %(plugin)s, kanna dubẽ !" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "Dorão-lu %(plugin_list)s, dorão-lu %(plugin)s çohla." msgid "General" msgstr "TilÄ©dÄ©o" msgid "Accessibility" msgstr "çônêa" msgid "Desktop" msgstr "bẽtãdÄ©o" msgid "Extras" msgstr "lãkãolu" msgid "Window Management" msgstr "mãçã-parãterolu" msgid "Effects" msgstr "kêeolu" msgid "Image Loading" msgstr "natalolu çãbala nã ..." msgid "Utility" msgstr "dorão" msgid "All" msgstr "bê" msgid "Uncategorized" msgstr "çifa-tão" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "da-tillÄ©dÄ©olu çêĩdila ..." msgid "Edit" msgstr "çaferola ..." msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "Jã, i fẽ tõbonna anÄ© çaferola nole" #, python-format msgid "Edit %s" msgstr " %s çafe !" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" a-mãbetêa" # msgid "Disabled" msgstr "a-dubẽta" # msgid "Enabled" msgstr "a-malãta" msgid "Grab key combination" msgstr "teclado -la butão-lu la kafo tõbõ !" #, python-format msgid "\"%s\" is not a valid button" msgstr "Mo a mã butão \"%s\" naffa nole !" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "I butão-1 naffa jã, ñĩ tanolu çãba nã nole. Fa i lafta \"%s\" naffala kõmko " "butão-1 ñãoñã ? " #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" koofo mãçotto !" msgid "None" msgstr "Hanni fẽ" msgid "CompizConfig Settings Manager" msgstr "CompizConfig compiz -la tillÄ©dirão leti" #, fuzzy msgid "Plugin" msgstr "dorãolu" msgid "Please press the new key combination" msgstr "teclado -la butão-lu la kafo mim a-tõbõta, diki bã !" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" #, fuzzy msgid "Window Name" msgstr "mãçã-parãterolu" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "" #. Value #, fuzzy msgid "Value" msgstr "da (%s)" msgid "Grab" msgstr "" #. Relation #, fuzzy msgid "Relation" msgstr "mábôko" #. Invert msgid "Invert" msgstr "" #, fuzzy msgid "Browse..." msgstr "ñininna katuko : ... " msgid "Images" msgstr "natalolu" msgid "File" msgstr "kaito" msgid "Open directory..." msgstr "kaito-lu-la kulÅ©o iêlela ..." msgid "Open file..." msgstr "kaito iêlela ..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Ñĩ, CompizConfig mu compiz -la tillÄ©dirão, le ti :). " msgid "translator-credits" msgstr "kãaçorrla: Werner Landgraf " msgid "An error has occured" msgstr "tano çoto !" msgid "Warning" msgstr "I hakilto !" #, python-format msgid "Enable %s" msgstr " %s malã bã !" msgid "Filter" msgstr "tombõdão" #, python-format msgid "Search %s Plugin Options" msgstr "Dorão %s -la tõbõdãolu ñinnÄ©la ... " msgid "Use This Plugin" msgstr "Dorão ñĩ naffa bã !" msgid "Search Compiz Core Options" msgstr "CompizCore -la tõbõdãolu ñinnÄ©la ... " msgid "Error" msgstr "tano !" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "jubela ... kono : " #. Options msgid "Short description and name" msgstr "farãfãço anÄ© to:" msgid "Long description" msgstr "farãfãço ba:" msgid "Settings value" msgstr "Da:" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "Dalu" #, fuzzy msgid "Loading Advanced Search" msgstr "ñinnÄ©arla ba ..." msgid "Add a New Profile" msgstr "Dokuo-la kêeña kotoma kefÅ©na ..." msgid "Remove This Profile" msgstr "Dokuo-la kêeña dubẽna ..." msgid "Default" msgstr "da a-tillÄ©dÄ©" msgid "Profile" msgstr "Dokuo-la kêeña" msgid "Import" msgstr "çãbala nã ..." msgid "Import a CompizConfig Profile" msgstr "dokuo-la kêeñão CompizConfig -ya çãbala nã ..." # msgid "Import as..." msgstr "çãbala nã kõmko ..." # msgid "Import a CompizConfig Profile as a new profile" msgstr "çãba nã dokuo-la kêeñão a-kotama CompizConfig -ya le ..." msgid "Export" msgstr "çãba jêe ..." msgid "Export your CompizConfig Profile" msgstr "çãba jê i-la dokuo-la kêeñão CompizConfig -ya le ..." # msgid "Reset to defaults" msgstr "da-lu tilÄ©dÄ©olu çêĩdila ..." # msgid "Reset your CompizConfig Profile to the global defaults" msgstr "i-la dokuo-la kêeñão CompizConfig-ña -la da-lu tilÄ©dÄ©olu çêĩdi ... " msgid "Backend" msgstr "programa kono" msgid "Integration" msgstr "mábôko" msgid "Enable integration into the desktop environment" msgstr "mábôko bẽtãdÄ©o kono malãdi !" msgid "Profiles (*.profile)" msgstr "dokuola kêeño-lu (*.profile)" msgid "All files" msgstr "kaitalu bê" msgid "Save file.." msgstr "kaito mabôla ..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "kaito iêlela .." msgid "Enter a profile name" msgstr "dokuola kêeño tõbõ bã !" msgid "Please enter a name for the new profile:" msgstr "dokuola kêeño a-kotama -la to çafe !" msgid "Backend not found." msgstr "programma mãçotto ! :(" #. Auto sort msgid "Automatic plugin sorting" msgstr "dorão-lu ke kurÄ©na ..." msgid "Disabled Plugins" msgstr "dorão-lu a-dubẽta:" msgid "Enabled Plugins" msgstr "dorão-lu a-malãta:" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "dorão kafÅ©na ..." msgid "Plugin name:" msgstr "dorão-la to:" msgid "Insert plugin name" msgstr "dorão-la to çafê !" msgid "Preferences" msgstr "tõbõkelu" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "programa, dokuola kêeño-lu, anÄ© dokuo-la dalu, mim CompizConfig ka naffa le " "kono-ya, tillÄ©dÄ©dirÄ©la ..." msgid "About" msgstr "... dÅ©" msgid "About CCSM..." msgstr "CCSM dÅ©" msgid "Profile & Backend" msgstr "programma & dokuola kêeño kono" msgid "Plugin List" msgstr "dorãolu" msgid "Filter your Plugin list" msgstr "I i-la dorão-lu tombõ bã !" #, python-format msgid "Screen %i" msgstr "Telha %i" msgid "Screen" msgstr "Telha" msgid "Category" msgstr "çifo" msgid "Advanced Search" msgstr "ñinnÄ©arla ba ..." #, fuzzy, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Hanni fẽ a-ñinnÄ©ta. \n" " \n" " Feñ kommko \"%s\" mã çotto." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "jubela fa tanolu sotto ... , batu domãdÄ© !" #~ msgid "Value (%s)" #~ msgstr "da (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s -la da, (%(value)s) le ti." #~ msgid "Unhandled list type %s for %s" #~ msgstr " %s a mã naffa nole komko %s" #~ msgid "Actions" #~ msgstr "kêebaarolu" #~ msgid "Disable %s" #~ msgstr " dubẽna ... " #~ msgid "Name" #~ msgstr "To" #~ msgid "Screen Edge" #~ msgstr "tele-la koofo" #~ msgid "Button %i" #~ msgstr "niño-la Butão %i" #~ msgid "Edge Button" #~ msgstr "tele-la koofo -la butão" #~ msgid "On System Bell" #~ msgstr "Talão-la kumo -la tumo" #~ msgid "Edit Action: %s" #~ msgstr "kêebarão %s fãdi ! " #~ msgid "Screen Edges" #~ msgstr "tele-la koofo-lu" #~ msgid "Reset To Defaults" #~ msgstr "da-tillÄ©dÄ©olu çêĩdila ..." compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/hr.po0000644000015301777760000002562112321343002022503 0ustar pbusernogroup00000000000000# ccsm hr translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-06-16 13:24+0200\n" "Last-Translator: Matija Folnovic \n" "Language-Team: Matija Folnovic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "Onemoguci %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Nemoj postaviti %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Postavi %(action)s" msgid "key" msgstr "kljuc" msgid "button" msgstr "gumb" msgid "edge" msgstr "rub" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Pokusavate koristiti mogucnost %(feature)s koja nije ukljucen " "u nijednom dodatku.\n" "Zelite li ipak koristi ovu mogucnost?" #, python-format msgid "Use %(feature)s" msgstr "Koristi %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Nemoj koristiti %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Pokusavate koristiti mogucnost %(feature)s koja je ukljucena u " "dodatak %(plugin)s.\n" "Ovaj dodatak je iskljucen.\n" "Zelite li omoguciti %(plugin)s pa da ova mogucnost bude dostupna?" #, python-format msgid "Enable %(plugin)s" msgstr "Omoguci %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Nemoj omoguciti %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Neki %(bindings)s kratice za dodatak %(plugin)s se preklapaju s " "drugim dodacima. Zelite li rijesiti ta preklapanja?" msgid "Resolve conflicts" msgstr "Rijesi preklapanja" msgid "Ignore conflicts" msgstr "Ignoriraj preklapanja" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Dodatak %(plugin_conflict)s nudi mogucnost %(feature)s koju " "nudi i dodatak %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Onemoguci %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Nemoj ukljuciti %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Dodatak %(plugin_conflict)s se sukobljava s dodatkom %(plugin)s" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s zahtjeva mogucnost %(feature)s koju nude ovi " "dodaci:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Omoguci ove dodatke" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s trazi dodatak %(require)s" #, python-format msgid "Enable %(require)s" msgstr "Omoguci %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s nudi mogucnost %(feature)s koju traze dodaci %" "(plugin_list)s" msgid "Disable these plugins" msgstr "Onemoguci ove dodatke" #, python-format msgid "Don't disable %(plugin)s" msgstr "Nemoj onemoguciti %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin_list)s traze dodatak %(plugin)s" msgid "General" msgstr "Opcenito" msgid "Accessibility" msgstr "Pristupacnost" msgid "Desktop" msgstr "Radna povrsina" msgid "Extras" msgstr "Dodaci" msgid "Window Management" msgstr "Upravljanje prozora" msgid "Effects" msgstr "Efekti" msgid "Image Loading" msgstr "Ucitavanje slike" msgid "Utility" msgstr "Pomocni" msgid "All" msgstr "Svi" msgid "Uncategorized" msgstr "Bez kategorije" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Vrati vrijednost na njezinu pocetnu vrijednost" msgid "Edit" msgstr "Promijeni" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Visepopisne postavke. Mozete dvostuko kliknuti na red da promijenite " "vrijednost." #, python-format msgid "Edit %s" msgstr "Promijeni %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" nije pravilna precica" msgid "Disabled" msgstr "Onemoguceno" msgid "Enabled" msgstr "Omoguceno" msgid "Grab key combination" msgstr "Uhvati kombinaciju tipki" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" nije pravilan gumb" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Koristenjem Gumb1 bez ikakvog dodatka moze sprijeciti bilokoji lijevi klik i " "to moze unistiti tvoje opcije. Zelite li zaista staviti \"%s\"gumb u Gumb1?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" nije pravilna maska ruba" msgid "None" msgstr "Nista" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Upravitelj Konfiguracija" msgid "Plugin" msgstr "Dodatak" msgid "Please press the new key combination" msgstr "Molim pritisnite novu kombinaciju tipki" msgid "Window Title" msgstr "Naslov prozora" msgid "Window Role" msgstr "Uloga prozora" msgid "Window Name" msgstr "Ime prozora" msgid "Window Class" msgstr "Klasa prozora" msgid "Window Type" msgstr "Tip prozora" msgid "Window ID" msgstr "ID prozora" msgid "And" msgstr "I" msgid "Or" msgstr "Ili" msgid "Edit match" msgstr "Promjeni podudarnost" #. Type msgid "Type" msgstr "Tip" #. Value msgid "Value" msgstr "Vrijednost" msgid "Grab" msgstr "Uhvati" #. Relation msgid "Relation" msgstr "Odnos" #. Invert msgid "Invert" msgstr "Obrni" msgid "Browse..." msgstr "Pregled za" msgid "Images" msgstr "Slike" msgid "File" msgstr "Datoteka" msgid "Open directory..." msgstr "Otvori direktorij..." msgid "Open file..." msgstr "Otvori datoteku..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Ovo je upravitelj konfiguracija za CompizConfig konfiguracijski sustav" msgid "translator-credits" msgstr "O prevodiocima" msgid "An error has occured" msgstr "Dogodila se greska" msgid "Warning" msgstr "Upozorenje" #, python-format msgid "Enable %s" msgstr "Omoguci %s" msgid "Filter" msgstr "Filter" #, python-format msgid "Search %s Plugin Options" msgstr "Trazi opcije dodatka %s" msgid "Use This Plugin" msgstr "Koristi ovaj dodatak" msgid "Search Compiz Core Options" msgstr "Pretrazi Opcije Compizove jezgre" msgid "Error" msgstr "Greska" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Odaberi filtar.\n" "Klikni na sliku tipkovnice da uhvatis tipku koju trazis" msgid "Search in..." msgstr "Trazi u..." #. Options msgid "Short description and name" msgstr "Kratak opis i ime" msgid "Long description" msgstr "Dugacak opis" msgid "Settings value" msgstr "Vrijednost postavke" msgid "Group" msgstr "Grupa" msgid "Subgroup" msgstr "Podgrupa" #. Notebook msgid "Settings" msgstr "Postavke" #, fuzzy msgid "Loading Advanced Search" msgstr "Ucitavam napredno pretrazivanje" msgid "Add a New Profile" msgstr "Dodaj novi profil" msgid "Remove This Profile" msgstr "Pobrisi ovaj profil" msgid "Default" msgstr "Uobicajen" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Uvesti" msgid "Import a CompizConfig Profile" msgstr "Uvezi CompizConfig profil" msgid "Import as..." msgstr "Uvezi kao..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Uvezi CompizConfig profil kao novi profil" msgid "Export" msgstr "Izvezi" msgid "Export your CompizConfig Profile" msgstr "Izvezi svoj CompizConfig profil" msgid "Reset to defaults" msgstr "Vrati na pocetno" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Vrati svoj CompizConfig profil na pocetne vrijednost" msgid "Backend" msgstr "" msgid "Integration" msgstr "Integracija" msgid "Enable integration into the desktop environment" msgstr "Omoguci integraciju u okruzje desktopa" msgid "Profiles (*.profile)" msgstr "Profil (*.profile)" msgid "All files" msgstr "Sve datoteke" msgid "Save file.." msgstr "Spremi datoteku" msgid "Do you want to skip default option values while exporting your profile?" msgstr "Zelite li preskociti pocetne postavke pri eksportiranju profila?" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "Preferences" msgstr "Postavke" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" msgid "Filter your Plugin list" msgstr "Filtiriraj tvoju listu dodataka" #, python-format msgid "Screen %i" msgstr "Zaslon %i" msgid "Screen" msgstr "Zaslon" msgid "Category" msgstr "Kategorija" msgid "Advanced Search" msgstr "Napredno pretrazivanje" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Izracunavam moguce sukobe, molim pricekajte" #~ msgid "Value (%s)" #~ msgstr "Vrijednost (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Vrijednost (%(value)s) za %(setting)s" #~ msgid "Actions" #~ msgstr "Radnje" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/pl.po0000644000015301777760000003321612321343002022504 0ustar pbusernogroup00000000000000# CompizConfig polish translation. # Copyright (C) 2007 Karol Sikora # This file is distributed under the same license as the ccsm package. # Karol Sikora , 2007. # Mariusz Fik , 2007. # Maciej Warnecki , 2007. # msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-04-22 22:29+0200\n" "Last-Translator: Maciej Warnecki \n" "Language-Team: pl_PL \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Nowa wartość %(binding)s skrótu dla akcji %(action)s we wtyczce %" "(plugin)sjest w konflikcie z akcjÄ… %(action_conflict)s wtyczki " "%(plugin_conflict)s.\n" "Czy chcesz wyłączyć %(action_conflict)s we wtyczce %" "(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Wyłącz %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Nie ustawiaj %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Ustaw %(action)s mimo wszystko" msgid "key" msgstr "klawisz" msgid "button" msgstr "przycisk" msgid "edge" msgstr "krawÄ™dź" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Próbujesz użyć funkcji %(feature)s, która nie jest " "udostÄ™pniana przez żadnÄ… z wtyczek. \n" "Czy chcesz jej użyć mimo to?" #, python-format msgid "Use %(feature)s" msgstr "Użyj %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Nie używaj %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Próbujesz użyć funkcji %(feature)s która jest dostÄ™pna w %(plugin)" "s.\n" "Ta wtyczka jest aktualnie nieaktywna.\n" "Chcesz włączyć %(plugin)s aby ta funkcja byÅ‚a dostÄ™pna?" #, python-format msgid "Enable %(plugin)s" msgstr "Włącz %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Nie włączaj %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Niektóre %(bindings)s skróty pluginu %(plugin)s powodujÄ… konflikt z " "innymi pluginami. Czy chcesz rozwiÄ…zać te konflikty?" msgid "Resolve conflicts" msgstr "Rozwiąż konflikty" msgid "Ignore conflicts" msgstr "Ignoruj konflikty" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Wtyczka %(plugin_conflict)s dostarcza funkcjÄ™ %(feature)s, " "która jest już dostÄ™pna we wtyczce " #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Wyłącz %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Nie włączaj %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Wtyczka %(plugin_conflict)s jest w konflikcie z %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s wymaga funkcji %(feature)s, która jest dostÄ™pna w " "nastÄ™pujÄ…cych wtyczkach:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Włącz te wtyczki" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s wymaga wtyczki %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Włącz %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s dostarcza funkcjÄ™ %(feature)s, która jest wymagana " "przez wtyczki %(plugin_list)s" msgid "Disable these plugins" msgstr "Wyłącz te wtyczki" #, python-format msgid "Don't disable %(plugin)s" msgstr "Nie wyłączaj %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s jest wymagany przez wtyczki %(plugin_list)s" msgid "General" msgstr "Ogólne" msgid "Accessibility" msgstr "DostÄ™pność" msgid "Desktop" msgstr "Pulpit" msgid "Extras" msgstr "Dodatki" msgid "Window Management" msgstr "ZarzÄ…dzanie oknami" msgid "Effects" msgstr "Efekty" msgid "Image Loading" msgstr "Åadowanie obrazków" msgid "Utility" msgstr "NarzÄ™dzia" msgid "All" msgstr "Wszystkie" msgid "Uncategorized" msgstr "Bez kategorii" msgid "N/A" msgstr "NiedostÄ™pne" msgid "Reset setting to the default value" msgstr "Przywróć ustawienia domyÅ›lne" msgid "Edit" msgstr "Edycja" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Ustawienia wielu list. Możesz kliknąć podwójnie rzÄ…d by edytować wartoÅ›ci." #, python-format msgid "Edit %s" msgstr "Edycja %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" nie jest poprawnym skrótem" msgid "Disabled" msgstr "Wyłączone" msgid "Enabled" msgstr "Włączone" msgid "Grab key combination" msgstr "Przechwyć kombinacjÄ™ klawiszy" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" nie jest poprawnym przyciskiem" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Używanie Przycisku1 (LPM) bez modyfikatorów może uniemożliwić klikanie lewym " "przyciskiem myszki i może zakłócić twojÄ… konfiguracjÄ™. Czy na pewno chcesz " "przyporzÄ…dkować przycisk \"%s\" do Przycisku1? " #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" nie jest ważnÄ… maskÄ… brzegów" msgid "None" msgstr "Brak" msgid "CompizConfig Settings Manager" msgstr "Menedżer ustawieÅ„ CompizConfig" msgid "Plugin" msgstr "Wtyczka" msgid "Please press the new key combination" msgstr "ProszÄ™ wcisnąć nowÄ… kombinacjÄ™ klawiszy" msgid "Window Title" msgstr "TytuÅ‚ okna" msgid "Window Role" msgstr "Rola okna" msgid "Window Name" msgstr "Nazwa okna" msgid "Window Class" msgstr "Klasa okna" msgid "Window Type" msgstr "Typ okna" msgid "Window ID" msgstr "ID okna" msgid "And" msgstr "I" msgid "Or" msgstr "Lub" msgid "Edit match" msgstr "Edytuj ukÅ‚ad" #. Type msgid "Type" msgstr "Typ" #. Value msgid "Value" msgstr "Wartość " msgid "Grab" msgstr "ZÅ‚ap" #. Relation msgid "Relation" msgstr "Relacja" #. Invert msgid "Invert" msgstr "Odwróć" msgid "Browse..." msgstr "PrzeglÄ…daj..." msgid "Images" msgstr "Grafiki" msgid "File" msgstr "Plik" msgid "Open directory..." msgstr "Otwórz folder..." msgid "Open file..." msgstr "Otwórz plik..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "To jest menedżer ustawieÅ„ dla systemu konfiguracji CompizConfig." msgid "translator-credits" msgstr "" "TÅ‚umacze: " " Maciej Warnecki - maciekw5@gmail.com, Karol " "Sikora - elektrrrus@gmail.com, Mariusz Fik - fisiu82@gmail.com, Adam " "Kremienowski - akremen@gmail.com, Jakub Chromiak - silvervoxer@gmail.com " " Błędne " "tÅ‚umaczenie lub błędy merytoryczne prosimy zgÅ‚aszać tu: htt" "p://forum.compiz.org/showthread.php?s=bbd37bd28a4b508cb52dcc4cdabf889a&t=541" "7 " " Lub ew. na maila (maciekw5@gmail.com jest " "odpowiedni, nie wiem jak z innymi tÅ‚umaczami) " " v .01" msgid "An error has occured" msgstr "WystÄ…piÅ‚ błąd" msgid "Warning" msgstr "Ostrzeżenie" #, python-format msgid "Enable %s" msgstr "Włącz %s" msgid "Filter" msgstr "Filtr" #, python-format msgid "Search %s Plugin Options" msgstr "Znajdź %s opcjÄ™ wtyczki" msgid "Use This Plugin" msgstr "Użyj tej wtyczki" msgid "Search Compiz Core Options" msgstr "Znajdź opcjÄ™ Compiz Core" msgid "Error" msgstr "Błąd" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Wprowadź filtr.\n" "Kliknij na ikonÄ™ klawiatury, by wybrać szukany klawisz" msgid "Search in..." msgstr "Szukaj w..." #. Options msgid "Short description and name" msgstr "Krótki opis i nazwa" msgid "Long description" msgstr "PeÅ‚ny opis" msgid "Settings value" msgstr "Wartość ustawieÅ„" msgid "Group" msgstr "Grupa" msgid "Subgroup" msgstr "Podgrupa" #. Notebook msgid "Settings" msgstr "Ustawienia" msgid "Loading Advanced Search" msgstr "ÅadujÄ™ zaawansowane szukanie" msgid "Add a New Profile" msgstr "Dodaj nowy profil" msgid "Remove This Profile" msgstr "UsuÅ„ ten profil" msgid "Default" msgstr "Ustawienia domyÅ›lne" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importuj" msgid "Import a CompizConfig Profile" msgstr "Importowanie profilu CompizConfig" msgid "Import as..." msgstr "Importuj jako..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importowanie nowego profilu CompizConfig" msgid "Export" msgstr "Eksportuj" msgid "Export your CompizConfig Profile" msgstr "Eksportuj swój profil CompizConfig" msgid "Reset to defaults" msgstr "Przywróć ustawienia domyÅ›lne" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Resetuj swój profil CompizConfig do domyÅ›lnych wartoÅ›ci" msgid "Backend" msgstr "Sposób zapisania" msgid "Integration" msgstr "Integracja" msgid "Enable integration into the desktop environment" msgstr "Włącz integracjÄ™ ze Å›rodowiskiem pulpitu" msgid "Profiles (*.profile)" msgstr "Profile (*.profile)" msgid "All files" msgstr "Wszystkie pliki" msgid "Save file.." msgstr "Zapisz plik.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Czy chcesz ominąć domyÅ›lne wartoÅ›ci opcji eksportujÄ…c swój profil?" msgid "Open file.." msgstr "Otwórz plik.." msgid "Enter a profile name" msgstr "Wprowadź nazwÄ™ profilu" msgid "Please enter a name for the new profile:" msgstr "Wprowadź nazwÄ™ nowego profilu: " msgid "Backend not found." msgstr "Sposób zapisania nie znaleziony." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatyczne sortowanie wtyczek" msgid "Disabled Plugins" msgstr "Wyłączone wtyczki" msgid "Enabled Plugins" msgstr "Włączone wtyczki" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Czy na pewno chcesz wyłączyć automatyczne sortowanie wtyczek? To wyłączy " "także obsÅ‚ugÄ™ konfliktów. PowinieneÅ› to robić tylko jeÅ›li wiesz co robisz." msgid "Add plugin" msgstr "Dodaj wtyczkÄ™" msgid "Plugin name:" msgstr "Nazwa wtyczki:" msgid "Insert plugin name" msgstr "Wpisz nazwÄ™ wtyczki" msgid "Preferences" msgstr "Ustawienia" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Konfiguracja sposobu zapisania i profilu używanego przez system konfiguracji " "Compiz'a" msgid "About" msgstr "O..." msgid "About CCSM..." msgstr "O CCSM..." msgid "Profile & Backend" msgstr "Profile i sposób zapisania" msgid "Plugin List" msgstr "Lista wtyczek" msgid "Filter your Plugin list" msgstr "Filtr twojej listy wtyczek" #, python-format msgid "Screen %i" msgstr "Ekran %i" msgid "Screen" msgstr "Ekran" msgid "Category" msgstr "Kategoria" msgid "Advanced Search" msgstr "Zaawansowane szukanie" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Nic nie znaleziono. \n" "\n" " Twój filtr \"%s\" nie pasje do żadnych wyników wyszkiwania." msgid "Configure Compiz with CompizConfig" msgstr "Konfiguruj Compiz przy pomocy Menadżera UstawieÅ„ CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Obliczanie możliwych konfliktów, proszÄ™ czekać" #~ msgid "Value (%s)" #~ msgstr "Wartość (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Wartość (%(value)s) dla %(setting)s: " #~ msgid "Unhandled list type %s for %s" #~ msgstr "NieprawidÅ‚owa wartość %s dla %s" #~ msgid "Actions" #~ msgstr "Akcje" #~ msgid "PyGtk 2.10.0 or later required" #~ msgstr "Wymagany jest PyGtk w wersji 2.10.0 lub wyższej" #, fuzzy #~ msgid "Multi-list settings" #~ msgstr "Lista ustawieÅ„" #~ msgid "Name" #~ msgstr "Nazwa" #~ msgid "Screen Edge" #~ msgstr "Róg ekaranu" #, fuzzy #~ msgid "On System Bell" #~ msgstr "Na powiadomienie systemu" #~ msgid "Edit Action: %s" #~ msgstr "Edytuj akcjÄ™: %s" #~ msgid "Screen Edges" #~ msgstr "Narożniki ekranu" #~ msgid "Backend & Profile" #~ msgstr "Sposób zapisania i profile" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/bn.po0000644000015301777760000004110012321343002022457 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-01-03 02:28+0100\n" "Last-Translator: Mahdee Jameel \n" "Language-Team: gist bengali team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(plugin)s পà§à¦²à¦¾à¦—ইন à¦à¦° %(action)s কাজের জনà§à¦¯ নতà§à¦¨ মান %(binding)s " "বà§à¦¯à¦¬à¦¹à§ƒà¦¤ হবে,\n" "কিনà§à¦¤à§ à¦à¦Ÿà¦¿ %(plugin_conflict)s পà§à¦²à¦¾à¦—ইন à¦à¦° %(action_conflict)s à¦à¦° " "সাথে সাংঘরà§à¦·à¦¿à¦•।\n" "আপনি কি %(plugin_conflict)s পà§à¦²à¦¾à¦—ইন à¦à¦° জনà§à¦¯ %(action_conflict)s " "কে নিষà§à¦•à§à¦°à§€à§Ÿ করতে চান?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s কে নিষà§à¦•à§à¦°à§€à§Ÿ করো" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s কে বহাল করো না" #, python-format msgid "Set %(action)s anyway" msgstr "যেভাবে হোক %(action)s কে বহাল করো" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "আপনি %(feature)s বà§à¦¯à¦¬â€Œà¦¹à¦¾à¦° ক‌রতে চাচà§à¦›à§‡à¦¨à¥¤à¦à¦Ÿà¦¿à¦° জনà§à¦¯ %(plugin)s " "পà§à¦°à§Ÿà§‹à¦œà¦¨.\n" "যা বরà§à¦¤à¦®à¦¾à¦¨à§‡ নিষà§à¦•à§à¦°à§€à§Ÿ আছে.\n" "আপনি কি %(plugin)s কে সকà§à¦°à¦¿à§Ÿ করতে চান?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s কে সকà§à¦°à¦¿à§Ÿ করো" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s কে সকà§à¦°à¦¿à§Ÿ করো না" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "আপনি %(feature)s বà§à¦¯à¦¬â€Œà¦¹à¦¾à¦° ক‌রতে চাচà§à¦›à§‡à¦¨à¥¤à¦à¦Ÿà¦¿à¦° জনà§à¦¯ %(plugin)s " "পà§à¦°à§Ÿà§‹à¦œà¦¨.\n" "যা বরà§à¦¤à¦®à¦¾à¦¨à§‡ নিষà§à¦•à§à¦°à§€à§Ÿ আছে.\n" "আপনি কি %(plugin)s কে সকà§à¦°à¦¿à§Ÿ করতে চান?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s কে সকà§à¦°à¦¿à§Ÿ করো" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s কে সকà§à¦°à¦¿à§Ÿ করো না" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s পà§à¦²à¦¾à¦—ইন %(feature)s কাজ করে। %(plugin)s à¦à¦•ই কাজ করে" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s কে নিষà§à¦•à§à¦°à§€à§Ÿ করো" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s কে সকà§à¦°à¦¿à§Ÿ করো না" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "%(plugin_conflict)s à¦à¦° সাথে %(plugin)s à¦à¦° সংঘরà§à¦· হচà§à¦›à§‡" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s à¦à¦° জনà§à¦¯ %(feature)s পà§à¦°à§Ÿà§‹à¦œà¦¨,যা পাওয়া যাবে নিচের " "পà§à¦²à¦¾à¦—ইন থেকে:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "à¦à¦‡ পà§à¦²à¦¾à¦—ইন গà§à¦²à§‹ সকà§à¦°à¦¿à§Ÿ করো" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s à¦à¦° জনà§à¦¯ %(require)s পà§à¦²à¦¾à¦—ইন দরকার হবে " #, python-format msgid "Enable %(require)s" msgstr "%(require)s কে সকà§à¦°à¦¿à§Ÿ করো" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin_list)s পà§à¦²à¦¾à¦—ইন à¦à¦° জনà§à¦¯ %(feature)s লাগবে, যা %" "(plugin)s দিয়ে করা হয়" msgid "Disable these plugins" msgstr "à¦à¦‡ পà§à¦²à¦¾à¦—ইন গà§à¦²à§‹ নিষà§à¦•à§à¦°à§€à§Ÿ করো" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s কে নিষà§à¦•à§à¦°à§€à§Ÿ করো না" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin_list)s à¦à¦° জনà§à¦¯ %(plugin)s দরকার হবে" msgid "General" msgstr "সাধারন" msgid "Accessibility" msgstr "পà§à¦°à¦¬à§‡à¦¶à¦¯à§‹à¦—à§à¦¯à¦¤à¦¾" msgid "Desktop" msgstr "ডেসà§à¦•টপ" msgid "Extras" msgstr "অতিরিকà§à¦¤" msgid "Window Management" msgstr "উইনà§à¦¡à§‹ পরিচালনা" msgid "Effects" msgstr "পà§à¦°à¦­à¦¾à¦¬à¦—à§à¦²à¦¿" msgid "Image Loading" msgstr "চিতà§à¦° লোড করছে" msgid "Utility" msgstr "উপযোগিতা" msgid "All" msgstr "সব" msgid "Uncategorized" msgstr "সাজানো হয়নি" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "মূল মানে ফিরে যাও" msgid "Edit" msgstr "সমà§à¦ªà¦¾à¦¦à¦¨à¦¾" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "অনেকà§à¦—à§à¦²à§‹ পছনà§à¦¦à¥¤à¦†à¦ªà¦¨à¦¾à¦° কোন পছনà§à¦¦ সমà§à¦ªà¦¾à¦¦à¦¨ করতে হলে ওই সারিতে কà§à¦²à¦¿à¦• করà§à¦¨" #, python-format msgid "Edit %s" msgstr "%s কে সমà§à¦ªà¦¾à¦¦à¦¨à¦¾" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" লিনà§à¦• টি ভà§à¦²" msgid "Disabled" msgstr "নিষà§à¦•à§à¦°à¦¿à§Ÿ" msgid "Enabled" msgstr "সকà§à¦°à¦¿à§Ÿ" msgid "Grab key combination" msgstr "চাবি ঠিক করà§à¦¨" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" বাটন হিসেবে গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "সাথে আর কোন কী ছাড়া বাম বাটন বà§à¦¯à¦¬à¦¹à¦¾à¦° করলে আপনি আর অনà§à¦¯ কাজে লেফট কà§à¦²à¦¿à¦• বà§à¦¯à¦¬à¦¹à¦¾à¦° " "করতে পারবেন নাআপনি কি আসলেই \"%s\" হিসেবে বাম বাটন বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে চান?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" কোনার মাসà§à¦• হিসেবে গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়" msgid "None" msgstr "কোনটাই না" msgid "CompizConfig Settings Manager" msgstr "কমপিজ কনফিগ বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦ªà¦•" #, fuzzy msgid "Plugin" msgstr "পà§à¦²à¦¾à¦—ইন à¦à¦° তালিকা" msgid "Please press the new key combination" msgstr "নতà§à¦¨ কীগà§à¦²à§‹ চাপà§à¦¨" msgid "Window Title" msgstr "উইনà§à¦¡à§‹ শীরà§à¦·" msgid "Window Role" msgstr "উইনà§à¦¡à§‹à¦° ভূমিকা" msgid "Window Name" msgstr "উইনà§à¦¡à§‹à¦° নাম" msgid "Window Class" msgstr "উইনà§à¦¡à§‹à¦° শà§à¦°à§‡à¦£à§€" msgid "Window Type" msgstr "উইনà§à¦¡à§‹à¦° ধরণ" msgid "Window ID" msgstr "উইনà§à¦¡à§‹à¦° ID" msgid "And" msgstr "à¦à¦¬à¦‚" msgid "Or" msgstr "অথবা" msgid "Edit match" msgstr "মিলগà§à¦²à¦¿ সমà§à¦ªà¦¾à¦¦à¦¨ করা" #. Type msgid "Type" msgstr "পà§à¦°à¦•ার" #. Value msgid "Value" msgstr "মান" msgid "Grab" msgstr "ধরা" #. Relation msgid "Relation" msgstr "সমà§à¦ªà¦°à§à¦•" #. Invert msgid "Invert" msgstr "উলà§à¦Ÿà¦¾à¦¨à§‹" #, fuzzy msgid "Browse..." msgstr "খà§à¦œà§‡ দেখà§à¦¨" msgid "Images" msgstr "ছবি" msgid "File" msgstr "ফাইল" msgid "Open directory..." msgstr "ডিরেকà§à¦Ÿà¦°à¦¿ খà§à¦²à§à¦¨" msgid "Open file..." msgstr "ফাইল খà§à¦²à§à¦¨" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "à¦à¦Ÿà¦¿ হলো কমপিজ à¦à¦° পছনà§à¦¦ ঠিক করার জায়গা" msgid "translator-credits" msgstr "অনà§à¦¬à¦¾à¦¦ করেছেন" msgid "An error has occured" msgstr "à¦à¦•টা সমসà§à¦¯à¦¾ হয়েছে" msgid "Warning" msgstr "সতরà§à¦•তাবাণী" #, python-format msgid "Enable %s" msgstr "%s কে সকà§à¦°à¦¿à§Ÿ করো" msgid "Filter" msgstr "ছাকা" #, python-format msgid "Search %s Plugin Options" msgstr "%s পà§à¦²à¦¾à¦—ইন à¦à¦° পছনà§à¦¦ খোজো" msgid "Use This Plugin" msgstr "à¦à¦‡ পà§à¦²à¦¾à¦—ইন বà§à¦¯à¦¬à¦¹à¦¾à¦° করো" msgid "Search Compiz Core Options" msgstr "কমপিজ কোর à¦à¦° পছনà§à¦¦ à¦à¦° মধà§à¦¯à§‡ খোজো" msgid "Error" msgstr "সমসà§à¦¯à¦¾" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "à¦à¦° মধà§à¦¯à§‡ খোজো" #. Options msgid "Short description and name" msgstr "সংকà§à¦·à¦¿à¦ªà§à¦¤ নাম ও বিবরণ" msgid "Long description" msgstr "সমà§à¦ªà§‚রà§à¦£ বিবরন" msgid "Settings value" msgstr "পছনà§à¦¦à§‡à¦° মান" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "পছনà§à¦¦" #, fuzzy msgid "Loading Advanced Search" msgstr "উনà§à¦¨à¦¤ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨" msgid "Add a New Profile" msgstr "নতà§à¦¨ পà§à¦°à§‹à¦«à¦¾à¦‡à¦² যোগ করà§à¦¨" msgid "Remove This Profile" msgstr "à¦à¦‡ পà§à¦°à§‹à¦«à¦¾à¦‡à¦² সরিয়ে ফেলো" msgid "Default" msgstr "মূল মান" msgid "Profile" msgstr "পà§à¦°à§‹à¦«à¦¾à¦‡à¦²" msgid "Import" msgstr "আমদানি" msgid "Import a CompizConfig Profile" msgstr "কমপিজ কনফিগ à¦à¦° পà§à¦°à§‹à¦«à¦¾à¦‡à¦² আমদানি করো" msgid "Import as..." msgstr "বিশেষভাবে আমà§à¦¦à¦¾à¦¨à¦¿ করো" msgid "Import a CompizConfig Profile as a new profile" msgstr "কমপিজ কনফিগ à¦à¦° পà§à¦°à§‹à¦«à¦¾à¦‡à¦² নতà§à¦¨ পà§à¦°à§‹à¦«à¦¾à¦‡à¦² হিসেবে আমদানি করো" msgid "Export" msgstr "রপà§à¦¤à¦¾à¦¨à¦¿" msgid "Export your CompizConfig Profile" msgstr "আপনার কমপিজ কনফিগ à¦à¦° পà§à¦°à§‹à¦«à¦¾à¦‡à¦² রপà§à¦¤à¦¾à¦¨à¦¿ করà§à¦¨" msgid "Reset to defaults" msgstr "মূল মানে ফেরৎ নাও" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "আপনার কমপিজ কনফিগ à¦à¦° পà§à¦°à§‹à¦«à¦¾à¦‡à¦² মূল মানে ফেরৎ নিন" msgid "Backend" msgstr "বà§à¦¯à¦¾à¦•à¦à¦¨à§à¦¡" msgid "Integration" msgstr "মিশে যাওয়া" msgid "Enable integration into the desktop environment" msgstr "ডেসà§à¦•টপের পরিবেশের সাথে মিশে যাবে" msgid "Profiles (*.profile)" msgstr "পà§à¦°à§‹à¦«à¦¾à¦‡à¦² (*.profile)" msgid "All files" msgstr "সব ফাইল" msgid "Save file.." msgstr "ফাইল সংরকà§à¦·à¦£ করà§à¦¨" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "আপনার পà§à¦°à§‹à¦«à¦¾à¦‡à¦² পà§à¦°à§‡à¦°à¦£ করার সময় আপনি কি সতà§à¦¯à¦¿à¦‡ পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚প বিকলà§à¦ªà§‡à¦° মূলà§à¦¯à¦—à§à¦²à¦¿ বাদ দিয়ে " "যেতে চান?" msgid "Open file.." msgstr "ফাইল খà§à¦²à§à¦¨" msgid "Enter a profile name" msgstr "পà§à¦°à§‹à¦«à¦¾à¦‡à¦²à§‡à¦° নাম ঠিক করà§à¦¨" msgid "Please enter a name for the new profile:" msgstr "নতà§à¦¨ পà§à¦°à§‹à¦«à¦¾à¦‡à¦²à§‡à¦° নাম ঠিক করà§à¦¨à¦ƒ" msgid "Backend not found." msgstr "বà§à¦¯à¦•à¦à¦¨à§à¦¡ পাওয়া যায়নি" #. Auto sort msgid "Automatic plugin sorting" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿ পà§à¦²à¦¾à¦—ইন সাজানো" msgid "Disabled Plugins" msgstr "নিষà§à¦•à§à¦°à¦¿à§Ÿ পà§à¦²à¦¾à¦—ইন" msgid "Enabled Plugins" msgstr "সকà§à¦°à¦¿à§Ÿ পà§à¦²à¦¾à¦—ইন" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "আপনি কি সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿà¦­à¦¾à¦¬à§‡ পà§à¦²à¦¾à¦—ইন সঞà§à¦šà§Ÿà§‡à¦° বৈশিষà§à¦Ÿà§à¦¯à¦Ÿà¦¿ অসমরà§à¦¥ করতে চান ? à¦à¦Ÿà¦¿ করা হলে " "দà§à¦¬à¦¨à§à¦¦ পরিচালনার কাজটি বà§à¦¯à¦¾à¦¹à¦¤ হবে. আপনি কি করতে যাচà§à¦›à§‡à¦¨ তা যদি আপনার জানা থাকে " "তাহলে আপনি à¦à¦Ÿà¦¾ করতে পারেন." msgid "Add plugin" msgstr "পà§à¦²à¦¾à¦—ইন যোগ করà§à¦¨" msgid "Plugin name:" msgstr "পà§à¦²à¦¾à¦—ইন à¦à¦° নামঃ" msgid "Insert plugin name" msgstr "পà§à¦²à¦¾à¦—ইন à¦à¦° নাম লিখà§à¦¨" msgid "Preferences" msgstr "আনà§à¦•ূলà§à¦¯" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "কমপিজ কনফিগারেশন à¦à¦° বà§à¦¯à¦¬à¦¹à§ƒà¦¤ পà§à¦°à§‹à¦«à¦¾à¦‡à¦²,বà§à¦¯à¦•à¦à¦¨à§à¦¡ ও অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦¨ পছনà§à¦¦ à¦à¦° মান ঠিক করà§à¦¨" msgid "About" msgstr "পরিচিতি" msgid "About CCSM..." msgstr "সিসিà¦à¦¸à¦à¦® পরিচিতি" msgid "Profile & Backend" msgstr "পà§à¦°à§‹à¦«à¦¾à¦‡à¦² ও বà§à¦¯à¦•à¦à¦¨à§à¦¡" msgid "Plugin List" msgstr "পà§à¦²à¦¾à¦—ইন à¦à¦° তালিকা" msgid "Filter your Plugin list" msgstr "আপনার পà§à¦²à¦¾à¦—ইন তালিকা ছাকà§à¦¨" #, python-format msgid "Screen %i" msgstr "পরà§à¦¦à¦¾à¦° %i" msgid "Screen" msgstr "পরà§à¦¦à¦¾" msgid "Category" msgstr "শà§à¦°à§‡à¦£à§€" msgid "Advanced Search" msgstr "উনà§à¦¨à¦¤ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "à¦à¦°à¦•ম কিছৠপাওয়া যায়নি. \n" "\n" " আপনার ছাকà§à¦¨à¦¿ \"%s\" à¦à¦° সাথে মিলওয়ালা কোন কিছৠপাওয়া যায়নি." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "সমà§à¦­à¦¾à¦¬à§à¦¯ সংঘরà§à¦· হিসাব করা হচà§à¦›à§‡à¥¤à¦…নà§à¦—à§à¦°à¦¹ করে অপেকà§à¦·à¦¾ করà§à¦¨" #~ msgid "Value (%s)" #~ msgstr "মান (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s à¦à¦° জনà§à¦¯ মান (%(value)s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "%s হলো %s à¦à¦° জনà§à¦¯ অপরিচালিত তালিকা" #~ msgid "Actions" #~ msgstr "কাজ" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/de.po0000644000015301777760000003234312321343002022461 0ustar pbusernogroup00000000000000# CompizConfig German translation # Copyright (C) 2007 Danny Baumann # This file is distributed under the same license as the ccsm package. # Danny Baumann , 2007 # msgid "" msgstr "" "Project-Id-Version: ccsm 0.0.1\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-11-12 14:01+0100\n" "Last-Translator: Andreas Galonska \n" "Language-Team: Compiz Fusion translators \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" # Fehlendes Leerzeichen hinzugefügt. #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Der neue Wert für %(binding)s der Aktion %(action)s im Plugin %" "(plugin)s steht in Konflikt mit der Aktion %(action_conflict)s " "des Plugins %(plugin_conflict)s.\n" "Möchten Sie %(action_conflict)s im Plugin %(plugin_conflict)s " "deaktivieren?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s deaktivieren" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s nicht übernehmen" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s trotzdem setzen" msgid "key" msgstr "Taste" msgid "button" msgstr "Maustaste" msgid "edge" msgstr "Rand" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Sie versuchen, das Feature %(feature)s zu verwenden, welches von " "keinem Plugin zur Verfügung gestellt wird.\n" "Möchten Sie dieses Feature trotzdem verwenden?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s verwenden" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s nicht verwenden" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Sie versuchen, das von %(plugin)s zur Verfügung gestellte Feature %" "(feature)s zu verwenden.\n" "Dieses Plugin ist zur Zeit deaktiviert.\n" "Möchten Sie %(plugin)s aktivieren, so dass dieses Feature zur " "Verfügung steht?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s aktivieren" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s nicht aktivieren" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Einige %(bindings)s Tastenkombinationen des Plug-ins %(plugin)s " "kollidieren mit denen anderer Plug-ins. Möchtest du die Konflikte jetzt " "auflösen?" msgid "Resolve conflicts" msgstr "Konflikte beheben" msgid "Ignore conflicts" msgstr "Konflikte ignorieren" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Plugin %(plugin_conflict)s stellt das Feature %(feature)s " "bereit, welch auch von %(plugin)s bereitgestellt wird." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s deaktivieren" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s nicht aktivieren" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Plugin %(plugin_conflict)s steht in Konflikt mit dem Plugin %" "(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s benötigt das Feature %(feature)s, das von den " "folgenden Plugins bereit gestellt wird:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Diese Plugins aktivieren" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s benötigt das Plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "%(require)s aktivieren" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s stellt das Feature %(feature)s bereit, das von den " "Plugins %(plugin_list)s benötigt wird." msgid "Disable these plugins" msgstr "Diese Plugins deaktivieren" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s nicht deaktivieren" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s wird von den Plugins %(plugin_list)s benötigt." msgid "General" msgstr "Allgemein" msgid "Accessibility" msgstr "Barrierefreiheit" msgid "Desktop" msgstr "Arbeitsfläche" msgid "Extras" msgstr "Sonstiges" msgid "Window Management" msgstr "Fensterverwaltung" msgid "Effects" msgstr "Effekte" msgid "Image Loading" msgstr "Bildverarbeitung" msgid "Utility" msgstr "Werkzeuge" msgid "All" msgstr "Alle" msgid "Uncategorized" msgstr "Ohne Kategorie" msgid "N/A" msgstr "Nicht verfügbar" msgid "Reset setting to the default value" msgstr "Einstellung auf den Standardwert zurücksetzen" msgid "Edit" msgstr "Bearbeiten" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "Mehrfachliste - Doppelklick auf eine Zeile zum Bearbeiten" #, python-format msgid "Edit %s" msgstr "%s bearbeiten" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ist keine gültige Tastenkombination" msgid "Disabled" msgstr "Deaktiviert" msgid "Enabled" msgstr "Aktiviert" msgid "Grab key combination" msgstr "Tastenkombination auswählen" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ist keine gültige Taste" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Die Verwendung von Maustaste 1 kann Links-Klicks verhindern und damit Ihr " "System unverwendbar machen. Möchten Sie wirklich \"%s\" zu Maustaste 1 " "zuweisen?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" ist keine gültige Bildschirmecke" msgid "None" msgstr "Nichts" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Einstellungs-Manager" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Bitte drücken Sie die gewünschte Tastenkombination" msgid "Window Title" msgstr "Fenstertitel" msgid "Window Role" msgstr "Fensterfunktion" msgid "Window Name" msgstr "Fensterklassenname" msgid "Window Class" msgstr "Fensterklasse" msgid "Window Type" msgstr "Fenstertyp" msgid "Window ID" msgstr "Fenster-ID" msgid "And" msgstr "Und" msgid "Or" msgstr "Oder" msgid "Edit match" msgstr "Kriterien bearbeiten" #. Type msgid "Type" msgstr "Typ" #. Value msgid "Value" msgstr "Wert" msgid "Grab" msgstr "Auswählen" #. Relation msgid "Relation" msgstr "Beziehung" #. Invert msgid "Invert" msgstr "Umkehren" msgid "Browse..." msgstr "Suchen..." msgid "Images" msgstr "Bilder" msgid "File" msgstr "Datei" msgid "Open directory..." msgstr "Verzeichnis auswählen" msgid "Open file..." msgstr "Datei öffnen" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Ein Einstellungs-Manager für das CompizConfig Konfigurations-System" msgid "translator-credits" msgstr "" "Danny Baumann \n" "Patrick Niklaus " msgid "An error has occured" msgstr "Ein Fehler ist aufgetreten." msgid "Warning" msgstr "Warnung" #, python-format msgid "Enable %s" msgstr "%s aktivieren" msgid "Filter" msgstr "Filter" #, python-format msgid "Search %s Plugin Options" msgstr "Suche in den Einstellungen des Plugins %s" msgid "Use This Plugin" msgstr "Dieses Plugin aktivieren" msgid "Search Compiz Core Options" msgstr "Suche in den Einstellungen des Compiz-Kerns" msgid "Error" msgstr "Fehler" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Filterregel erstellen.\n" "Klicke auf die Virtuelle Tastatur, um eine Taste für die Suche zu definieren." msgid "Search in..." msgstr "Suche in..." #. Options msgid "Short description and name" msgstr "Kurzbeschreibung und Name" msgid "Long description" msgstr "Ausführlicher Beschreibung" msgid "Settings value" msgstr "Einstellungswert" msgid "Group" msgstr "Gruppe" msgid "Subgroup" msgstr "Untergruppe" #. Notebook msgid "Settings" msgstr "Einstellungen" msgid "Loading Advanced Search" msgstr "Lade erweiterte Suche" msgid "Add a New Profile" msgstr "Neues Profil hinzufügen" msgid "Remove This Profile" msgstr "Profil entfernen" msgid "Default" msgstr "Standard" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importieren" msgid "Import a CompizConfig Profile" msgstr "CompizConfig-Profil importieren" msgid "Import as..." msgstr "Import als..." msgid "Import a CompizConfig Profile as a new profile" msgstr "CompizConfig-Profil als neues Profil importieren" msgid "Export" msgstr "Exportieren" msgid "Export your CompizConfig Profile" msgstr "CompizConfig-Profil exportieren" msgid "Reset to defaults" msgstr "Zurücksetzen" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Aktuelles Profil auf Standardwerte zurücksetzen" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integration" msgid "Enable integration into the desktop environment" msgstr "Aktiviere Integration in die Desktopumgebung" msgid "Profiles (*.profile)" msgstr "Profile (*.profile)" msgid "All files" msgstr "Alle Dateien" msgid "Save file.." msgstr "Datei speichern" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Möchten Sie voreingestellte Werte beim Exportieren Ihres Profils ignorieren?" msgid "Open file.." msgstr "Datei öffnen" msgid "Enter a profile name" msgstr "Geben Sie einen Profilnamen ein" msgid "Please enter a name for the new profile:" msgstr "Bitte geben Sie einen Namen für das neue Profil an:" msgid "Backend not found." msgstr "Backend nicht gefunden." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatische Pluginsortierung" msgid "Disabled Plugins" msgstr "Deaktivierte Plugins" msgid "Enabled Plugins" msgstr "Aktivierte Plugins" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Soll das automatische Sortieren von Plugins wirklich abgeschaltet werden? In " "diesem Fall wird auch die automatische Konfiktlösung abgeschaltet. Sie " "sollten dies nur tun, wenn Sie sich ganz sicher sind." msgid "Add plugin" msgstr "Plugin hinzufügen" msgid "Plugin name:" msgstr "Pluginname:" msgid "Insert plugin name" msgstr "Plugin-Namen eingeben" msgid "Preferences" msgstr "Einstellungen" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Von Compiz Configuration System verwendetes Backend, Profil und andere " "interne Einstellungen konfigurieren." # Info == official German translation in GNOME msgid "About" msgstr "Info" msgid "About CCSM..." msgstr "Über CCSM..." msgid "Profile & Backend" msgstr "Profil & Backend" msgid "Plugin List" msgstr "Pluginliste" msgid "Filter your Plugin list" msgstr "Pluginliste filtern" #, python-format msgid "Screen %i" msgstr "Bildschirm %i" msgid "Screen" msgstr "Bildschirm" msgid "Category" msgstr "Kategorie" msgid "Advanced Search" msgstr "Erweiterte Suche" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Keine Übereinstimmungen gefunden. \n" "\n" " Der Filter \"%s\" stimmt mit keinem Element überein." msgid "Configure Compiz with CompizConfig" msgstr "Konfiguration von Compiz mit CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Werte mögliche Konflikte aus ... bitte warten." #~ msgid "Value (%s)" #~ msgstr "Wert (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Wert (%(value)s) für %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Nicht unterstützter Listentyp %s für %s" #~ msgid "Actions" #~ msgstr "Aktionen" #~ msgid "Disable %s" #~ msgstr "%s deaktivieren" #~ msgid "Name" #~ msgstr "Name" #~ msgid "Screen Edge" #~ msgstr "Bildschirmecke" #~ msgid "Button %i" #~ msgstr "Maustaste %i" #~ msgid "Edge Button" #~ msgstr "Maustaste für Bildschirmecke" #~ msgid "On System Bell" #~ msgstr "Bei Systemglocke" #~ msgid "Edit Action: %s" #~ msgstr "Aktion %s bearbeiten" #~ msgid "Screen Edges" #~ msgstr "Bildschirmecken" #~ msgid "Reset To Defaults" #~ msgstr "Auf Standardwert zurücksetzen" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/da.po0000644000015301777760000001645412321343002022462 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2007-12-13 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "" #, python-format msgid "Don't set %(action)s" msgstr "" #, python-format msgid "Set %(action)s anyway" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" #, python-format msgid "Use %(feature)s" msgstr "" #, python-format msgid "Don't use %(feature)s" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" #, python-format msgid "Enable %(plugin)s" msgstr "" #, python-format msgid "Don't enable %(feature)s" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "" #, python-format msgid "Don't enable %(plugin)s" msgstr "" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" #, python-format msgid "Enable %(require)s" msgstr "" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "" #, python-format msgid "Don't disable %(plugin)s" msgstr "" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" msgid "General" msgstr "" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "" msgid "Extras" msgstr "" msgid "Window Management" msgstr "" msgid "Effects" msgstr "" msgid "Image Loading" msgstr "" msgid "Utility" msgstr "" msgid "Reset setting to the default value" msgstr "" msgid "Browse for " msgstr "" msgid "Images" msgstr "" msgid "File" msgstr "" msgid "Open directory..." msgstr "" msgid "Open file..." msgstr "" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" msgid "Edit" msgstr "" #, python-format msgid "Value (%s)" msgstr "" #, python-format msgid "Edit %s" msgstr "" #, python-format msgid "Value (%(value)s) for %(setting)s" msgstr "" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "" msgid "Disabled" msgstr "" msgid "Enabled" msgstr "" msgid "Grab key combination" msgstr "" msgid "Computing possible conflicts, please wait" msgstr "" #, python-format msgid "\"%s\" is not a valid button" msgstr "" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "" #, python-format msgid "Unhandled list type %s for %s" msgstr "" msgid "CompizConfig Settings Manager" msgstr "" msgid "Filter" msgstr "" msgid "Filter your Plugin list" msgstr "" #, python-format msgid "Screen %i" msgstr "" msgid "Screen" msgstr "" msgid "All" msgstr "" msgid "Uncategorized" msgstr "" msgid "Category" msgstr "" msgid "Advanced Search" msgstr "" msgid "Preferences" msgstr "" #, python-format msgid "Enable %s" msgstr "" msgid "Please press the new key combination" msgstr "" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "" #. Value msgid "Value" msgstr "" msgid "Grab" msgstr "" #. Relation msgid "Relation" msgstr "" #. Invert msgid "Invert" msgstr "" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "" msgid "Warning" msgstr "" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "" msgid "Search Compiz Core Options" msgstr "" msgid "Actions" msgstr "" msgid "Error" msgstr "" msgid "Search in..." msgstr "" msgid "Short description and name" msgstr "" msgid "Long description" msgstr "" msgid "Settings value" msgstr "" #. Notebook msgid "Settings" msgstr "" msgid "Add a New Profile" msgstr "" msgid "Remove This Profile" msgstr "" msgid "Default" msgstr "" msgid "Profile" msgstr "" msgid "Import" msgstr "" msgid "Import a CompizConfig Profile" msgstr "" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "" msgid "All files" msgstr "" msgid "Save file.." msgstr "" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/as.po0000644000015301777760000002113512321343002022471 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2007-11-25 00:01+0100\n" "PO-Revision-Date: 2007-12-08 19:27+0100\n" "Last-Translator: biswajyoti mahanta \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "নতà§à¦¨ মূলà§à¦¯à§° বাবে %(binding)s à¦à¦•চন à§° কাৰণে %(action)s in পà§à¦²à¦¾à¦—িন " "%(plugin)s à¦à¦•চনৠৰ লগত দà§à¦¨à§à¦¦ %(action_conflict)s " "%(plugin_conflict)s পà§à¦²à¦¾à¦—িন.\n" "অকামৰ কৰিব বিছাৰে নেকি %(action_conflict)s পà§à¦²à¦¾à¦—িন " "%(plugin_conflict)s পà§à¦²à¦¾à¦—িন?" #, python-format msgid "Disable %(action_conflict)s" msgstr "অকামৰ %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "চেট নকৰিব %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "চেট %(action)s যিকৰেই anyway" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "আপà§à¦¨à¦¿ à¦à¦‡ feature বà§à¦¯à¦¬à¦¹à¦¾à§° কৰিব খà§à¦œà¦¿à¦›à§‡ %(feature)s যি টো not " "কোনো পà§à¦²à¦¾à¦—িনে দিয়া নাই.\n" "à¦à¦¤à¦¿à§Ÿà¦¾à¦“ à¦à¦‡ feature টো বà§à¦¯à¦¬à¦¹à¦¾à§° কৰিব খোজেনেকি ?" #, python-format msgid "Use %(feature)s" msgstr "বà§à¦¯à¦¬à¦¹à¦¾à§° কৰক %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "বà§à¦¯à¦¬à¦¹à¦¾à§° নকৰিব %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "আপà§à¦¨à¦¿ à¦à¦‡ feature বà§à¦¯à¦¬à¦¹à¦¾à§° কৰিব খà§à¦œà¦¿à¦›à§‡ %(feature)s যি টো provided by " "%(plugin)s.\n" "à¦à¦‡ পà§à¦²à¦¾à¦—িন বৰতমানে অকাযà§à¦¯à§ .\n" "আপà§à¦¨à¦¿ %(plugin)s so the feature is available?" #, python-format msgid "Enable %(plugin)s" msgstr "কাযà§à¦¯à¦•ৰি কৰক %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "কাযà§à¦¯à¦•ৰি নকৰিব %(feature)s" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "" #, python-format msgid "Don't enable %(plugin)s" msgstr "" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" #, python-format msgid "Enable %(require)s" msgstr "" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "" #, python-format msgid "Don't disable %(plugin)s" msgstr "" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" msgid "General" msgstr "" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "" msgid "Extras" msgstr "" msgid "Window Management" msgstr "" msgid "Effects" msgstr "" msgid "Image Loading" msgstr "" msgid "Utility" msgstr "" msgid "Reset setting to the default value" msgstr "" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" #, python-format msgid "Edit %s" msgstr "" msgid "Type" msgstr "" msgid "Value" msgstr "" msgid "Grab" msgstr "" msgid "Relation" msgstr "" msgid "Invert" msgstr "" msgid "Browse for " msgstr "" msgid "Images" msgstr "" msgid "File" msgstr "" msgid "Open directory..." msgstr "" msgid "Open file..." msgstr "" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" msgid "Edit" msgstr "" #, python-format msgid "Value (%s)" msgstr "" #, python-format msgid "Value (%(value)s) for %(setting)s" msgstr "" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "" msgid "Disabled" msgstr "" msgid "Enabled" msgstr "" msgid "Grab key combination" msgstr "" msgid "Computing possible conflicts, please wait" msgstr "" #, python-format msgid "\"%s\" is not a valid button" msgstr "" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "" #, python-format msgid "Unhandled list type %s for %s" msgstr "" msgid "CompizConfig Settings Manager" msgstr "" msgid "Filter" msgstr "" msgid "Filter your Plugin list" msgstr "" #, python-format msgid "Screen %i" msgstr "" msgid "Screen" msgstr "" msgid "All" msgstr "" msgid "Uncategorized" msgstr "" msgid "Category" msgstr "" msgid "Advanced Search" msgstr "" msgid "Preferences" msgstr "" #, python-format msgid "Enable %s" msgstr "" msgid "Please press the new key combination" msgstr "" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "" msgid "Warning" msgstr "" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "" msgid "Search Compiz Core Options" msgstr "" msgid "Actions" msgstr "" msgid "Error" msgstr "" msgid "Search in..." msgstr "" msgid "Short description and name" msgstr "" msgid "Long description" msgstr "" msgid "Settings value" msgstr "" #. Notebook msgid "Settings" msgstr "" msgid "Add a New Profile" msgstr "" msgid "Remove This Profile" msgstr "" msgid "Default" msgstr "" msgid "Profile" msgstr "" msgid "Import" msgstr "" msgid "Import a CompizConfig Profile" msgstr "" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "" msgid "All files" msgstr "" msgid "Save file.." msgstr "" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/ca.po0000644000015301777760000003015312321343002022451 0ustar pbusernogroup00000000000000# CompizConfig ca translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Gustau L. Castells (Karasu) , 2007. # msgid "" msgstr "" "Project-Id-Version: Compiz Settings Manager 0.5.2\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-06-28 16:29+0100\n" "Last-Translator: Rafa Ramírez \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" "X-Poedit-Language: Catalan\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "El nou valor per la vinculació %(binding)s per a l'acció %(action)s " "en el connector %(plugin)s entra en conflicte amb l'acció %" "(action_conflict)s del connector %(plugin_conflict)s.\n" "Vols desactivar %(action_conflict)s en el connector %" "(plugin_conflict)s ?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Desactiva %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "No marquis %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Marca %(action)s de totes maneres" msgid "key" msgstr "clau" msgid "button" msgstr "botó" msgid "edge" msgstr "cantonada" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Estàs intentant usar la característica %(feature)s que és " "proporcionada per %(plugin)s.\n" "Aquest connector està desactivat.\n" "Vols activar %(plugin)s per poder usar la característica ?" #, python-format msgid "Use %(feature)s" msgstr "Emprar %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "No emprar %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Estàs intentant usar la característica %(feature)s que és " "proporcionada per %(plugin)s.\n" "Aquest connector està desactivat.\n" "Vols activar %(plugin)s per poder usar la característica ?" #, python-format msgid "Enable %(plugin)s" msgstr "Activa %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "No activar %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "Resoldre conflictes" msgid "Ignore conflicts" msgstr "Ignorar conflictes" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "El connector %(plugin_conflict)s proporciona la característica %" "(feature)s que també és proporcionada per %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Desactiva %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "No activis %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "El connector %(plugin_conflict)s entra en conflicte amb %(plugin)" "s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s requereix la característica %(feature)s que es " "proporcionada pels següents connectors:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Activa aquests connectors" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s requereix el connector %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Activa %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s proporciona la característica %(feature)s que és " "requerida per els connectors %(plugin_list)s." msgid "Disable these plugins" msgstr "Desactiva aquests connectors" #, python-format msgid "Don't disable %(plugin)s" msgstr "No desactivis %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s es requerit pels connectors %(plugin_list)s." msgid "General" msgstr "General" msgid "Accessibility" msgstr "Accessibilitat" msgid "Desktop" msgstr "Escriptori" msgid "Extras" msgstr "Extres" msgid "Window Management" msgstr "Gestió de Finestres" msgid "Effects" msgstr "Efectes" msgid "Image Loading" msgstr "Càrrega d'imatges" msgid "Utility" msgstr "Utilitats" msgid "All" msgstr "Tot" msgid "Uncategorized" msgstr "Sense classificar" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Reseteja al seu valor per defecte" msgid "Edit" msgstr "Editar" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Paràmetres multillista. Pots fer un doble clic a una fila per editar els " "valors." #, python-format msgid "Edit %s" msgstr "Editar %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" no és una drecera vàlida" msgid "Disabled" msgstr "Desactivat" msgid "Enabled" msgstr "Activat" msgid "Grab key combination" msgstr "Captura combinació de tecles" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" no es un botó vàlid" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Usar el Botó1 sense modificadors pot prevenir qualsevol clic esquerre i " "trencar la configuració. Estàs segur que vols posar el botó \"%s\" al Botó1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" no és una màscara de vora vàlida" msgid "None" msgstr "Cap" msgid "CompizConfig Settings Manager" msgstr "Editor de la configuració de Compiz" #, fuzzy msgid "Plugin" msgstr "Llista de Connectors" msgid "Please press the new key combination" msgstr "Pressiona la nova combinació de tecles" msgid "Window Title" msgstr "Títol de la finestra" msgid "Window Role" msgstr "Rol de la finestra" msgid "Window Name" msgstr "Nom de la finestra" msgid "Window Class" msgstr "Classe de la finestra" msgid "Window Type" msgstr "Tipus de finestra" msgid "Window ID" msgstr "ID de la finestra" msgid "And" msgstr "I" msgid "Or" msgstr "O" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "Tipus" #. Value msgid "Value" msgstr "Valor" msgid "Grab" msgstr "" #. Relation #, fuzzy msgid "Relation" msgstr "Integració" #. Invert msgid "Invert" msgstr "Inverteix" msgid "Browse..." msgstr "Examinar..." msgid "Images" msgstr "Imatges" msgid "File" msgstr "Fitxer" msgid "Open directory..." msgstr "Obre directori..." msgid "Open file..." msgstr "Obre fitxer..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Això es un gestor dels paràmetres pel sistema de configuració del " "CompizConfig" msgid "translator-credits" msgstr "Karasu " msgid "An error has occured" msgstr "S'ha donat un error" msgid "Warning" msgstr "Alerta" #, python-format msgid "Enable %s" msgstr "Activa %s" msgid "Filter" msgstr "Filtre" #, python-format msgid "Search %s Plugin Options" msgstr "Busca opcions del connector %s" msgid "Use This Plugin" msgstr "Usa aquest connector" msgid "Search Compiz Core Options" msgstr "Cerca opcions del nucli del Compiz" msgid "Error" msgstr "Error" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "Cerca a..." #. Options msgid "Short description and name" msgstr "Descripció curta i nom" msgid "Long description" msgstr "Descripció llarga" msgid "Settings value" msgstr "Valor del paràmetre" msgid "Group" msgstr "Grup" msgid "Subgroup" msgstr "Subgrup" #. Notebook msgid "Settings" msgstr "Paràmetres" msgid "Loading Advanced Search" msgstr "Carregant cerca avançada" msgid "Add a New Profile" msgstr "Afegeix un perfil nou" msgid "Remove This Profile" msgstr "Esborra aquest perfil" msgid "Default" msgstr "Defecte" msgid "Profile" msgstr "Perfil" msgid "Import" msgstr "Importar" msgid "Import a CompizConfig Profile" msgstr "Importa un perfil CompizConfig" msgid "Import as..." msgstr "Importa com..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importa un perfil CompizConfig com un nou perfil" msgid "Export" msgstr "Exporta" msgid "Export your CompizConfig Profile" msgstr "Exporta el teu perfil CompizConfig" msgid "Reset to defaults" msgstr "Reseteja als valors per defecte" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Reseteja el teu perfil CompizConfig als valors per defecte" msgid "Backend" msgstr "Rerefons" msgid "Integration" msgstr "Integració" msgid "Enable integration into the desktop environment" msgstr "Activa integració amb l'escriptori" msgid "Profiles (*.profile)" msgstr "Perfils (*.profile)" msgid "All files" msgstr "Tots els arxius" msgid "Save file.." msgstr "Guarda arxiu..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "Obre arxiu..." msgid "Enter a profile name" msgstr "Entra un nom del prefil" msgid "Please enter a name for the new profile:" msgstr "Entra el nom del nou perfil:" msgid "Backend not found." msgstr "No trobo el rerefons." #. Auto sort msgid "Automatic plugin sorting" msgstr "Ordenació automàtica dels connectors" msgid "Disabled Plugins" msgstr "Connectors desactivats" msgid "Enabled Plugins" msgstr "Connectors activats" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "Afegeix connector" msgid "Plugin name:" msgstr "Nom del connector:" msgid "Insert plugin name" msgstr "Inserta el nom del connector" msgid "Preferences" msgstr "Preferències" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configura el rerefons, perfil i d'altres paràmetres interns usats pel " "Sistema de Configuració del Compiz" msgid "About" msgstr "Quant a" msgid "About CCSM..." msgstr "Quant a CCSM..." msgid "Profile & Backend" msgstr "Perfils i Rerefons" msgid "Plugin List" msgstr "Llista de Connectors" msgid "Filter your Plugin list" msgstr "Filtra la llista de connectors" #, python-format msgid "Screen %i" msgstr "Pantalla %i" msgid "Screen" msgstr "Pantalla" msgid "Category" msgstr "Categoria" msgid "Advanced Search" msgstr "Cerca avançada" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "No s'han trobat coincidències. \n" "\n" " El teu filtre \"%s\" no concorda amb cap element." msgid "Configure Compiz with CompizConfig" msgstr "Configura Compiz amb CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Calculant possibles conflictes, esperi" #~ msgid "Value (%s)" #~ msgstr "Valor (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Valor (%(value)s) per %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Tipus de llista %s no suportat per %s" #~ msgid "Actions" #~ msgstr "Accions" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/be.po0000644000015301777760000001640012321343002022453 0ustar pbusernogroup00000000000000# ccsm be translation # Copyright (C) 2008 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.7.4\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2008-04-03 11:00+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "" #, python-format msgid "Don't set %(action)s" msgstr "" #, python-format msgid "Set %(action)s anyway" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" #, python-format msgid "Use %(feature)s" msgstr "" #, python-format msgid "Don't use %(feature)s" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" #, python-format msgid "Enable %(plugin)s" msgstr "" #, python-format msgid "Don't enable %(feature)s" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "" #, python-format msgid "Don't enable %(plugin)s" msgstr "" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" #, python-format msgid "Enable %(require)s" msgstr "" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "" #, python-format msgid "Don't disable %(plugin)s" msgstr "" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" msgid "General" msgstr "" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "" msgid "Extras" msgstr "" msgid "Window Management" msgstr "" msgid "Effects" msgstr "" msgid "Image Loading" msgstr "" msgid "Utility" msgstr "" msgid "All" msgstr "" msgid "Uncategorized" msgstr "" msgid "Reset setting to the default value" msgstr "" msgid "Edit" msgstr "" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" #, python-format msgid "Edit %s" msgstr "" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "" msgid "Disabled" msgstr "" msgid "Enabled" msgstr "" msgid "Grab key combination" msgstr "" msgid "Computing possible conflicts, please wait" msgstr "" #, python-format msgid "\"%s\" is not a valid button" msgstr "" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "" msgid "CompizConfig Settings Manager" msgstr "" msgid "Filter" msgstr "" msgid "Filter your Plugin list" msgstr "" #, python-format msgid "Screen %i" msgstr "" msgid "Screen" msgstr "" msgid "Category" msgstr "" msgid "Advanced Search" msgstr "" msgid "Preferences" msgstr "" #, python-format msgid "Enable %s" msgstr "" msgid "Plugin" msgstr "" msgid "Please press the new key combination" msgstr "" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "" #. Value msgid "Value" msgstr "" msgid "Grab" msgstr "" #. Relation msgid "Relation" msgstr "" #. Invert msgid "Invert" msgstr "" msgid "Browse..." msgstr "" msgid "Images" msgstr "" msgid "File" msgstr "" msgid "Open directory..." msgstr "" msgid "Open file..." msgstr "" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "" msgid "Warning" msgstr "" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "" msgid "Search Compiz Core Options" msgstr "" msgid "Error" msgstr "" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "" #. Options msgid "Short description and name" msgstr "" msgid "Long description" msgstr "" msgid "Settings value" msgstr "" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "" msgid "Loading Advanced Search" msgstr "" msgid "Add a New Profile" msgstr "" msgid "Remove This Profile" msgstr "" msgid "Default" msgstr "" msgid "Profile" msgstr "" msgid "Import" msgstr "" msgid "Import a CompizConfig Profile" msgstr "" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "" msgid "All files" msgstr "" msgid "Save file.." msgstr "" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/or.po0000644000015301777760000003552312321343002022514 0ustar pbusernogroup00000000000000# Translate into Ukrainian # by # Roman Luchak , 2009. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Oriya\n" "X-Poedit-Country: India\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "ଅକà­à¬·à¬®à¬•ର %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr " %(action)sଗà­à¬¡à¬¿à¬•ୠସà­à¬¥à¬¿à¬° କରନାହିà¬" #, python-format #, python-format msgid "Set %(action)s anyway" msgstr "" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s ଡିକୠଉପୟୋଗକର" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s ଉପୟୋଗ କର ନାହିà¬" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" #, python-format msgid "Enable %(plugin)s" msgstr " %(plugin)s କୠସକà­à¬·à¬®à¬•ର" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s ସକà­à¬·à¬® କରନାହିà¬" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" #, python-format #, python-format msgid "Disable %(plugin_conflict)s" msgstr "" #, python-format #, python-format msgid "Don't enable %(plugin)s" msgstr "" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" #, python-format #, python-format msgid "Enable %(require)s" msgstr "" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "à¬à¬¹à¬¿ ପà­à¬²à¬—ଇନଗà­à¬¡à¬¿à¬•ୠଅକà­à¬·à¬®à¬•ର" #, python-format msgid "Don't disable %(plugin)s" msgstr " %(plugin)s କୠଅକà­à¬·à¬®à¬•ର ନାହିà¬" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" msgid "General" msgstr "ସାଧାରଣ" msgid "Accessibility" msgstr "ପà­à¬°à¬¬à­‡à¬¶à­Ÿà­‹à¬—à­à¬¯à¬¤à¬¾" msgid "Desktop" msgstr "ଡେସà­à¬•ଟପ" msgid "Extras" msgstr "ଅତିରିକà­à¬¤à¬—à­à¬¡à¬¿à¬•" msgid "Window Management" msgstr "ଉଇଣà­à¬¡à­‹ ପà­à¬°à¬¬à¬¨à­à¬§à¬¨" msgid "Effects" msgstr "ପà­à¬°à¬­à¬¾à¬¬à¬—à­à¬¡à¬¿à¬•" msgid "Image Loading" msgstr "ଚିତà­à¬° ଲୋଡକରିବା" msgid "Utility" msgstr "ଉପୟୋଗୀତା" msgid "All" msgstr "ସବà­" msgid "Uncategorized" msgstr "ଅବିଭାଜିତ" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "ଡିଫଲà­à¬Ÿ ମୂଲà­à¬¯à¬•ୠସେଟିଙà­à¬—କୠପà­à¬¨à¬ƒà¬¸à­à¬¥à¬¿à¬°à¬•ର" msgid "Edit" msgstr "ସଂପାଦନକର" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "ବହà­-ତାଲିକା ସେଟିଙà­à¬—ଗà­à¬¡à¬¿à¬• । ମୂଲà­à¬¯à¬—à­à¬¡à¬¿à¬•ୠସଂପାଦନ କରିବା ପାଇଠଆପଣ ଗୋଟିଠଧାଡିରେ ଦà­à¬‡à¬¥à¬° କà­à¬²à¬¿à¬• କରିପାରିବେ ।" #, python-format msgid "Edit %s" msgstr "ସଂପାଦନକର %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ଗୋଟିଠମାନà­à¬¯ ସରà­à¬Ÿà¬•ଟ ନà­à¬¹à­‡à¬" msgid "Disabled" msgstr "ଅକà­à¬·à¬®à¬¹à­‡à¬²à¬¾" msgid "Enabled" msgstr "ସକà­à¬·à¬®à¬¹à­‡à¬²à¬¾" msgid "Grab key combination" msgstr "ଟାଣିନେବା କି ସଂୟà­à¬•à­à¬¤à¬•ରଣ" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ଗୋଟିଠମାନà­à¬¯ ବଟନ ନà­à¬¹à­‡à¬" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "ପରିବରà­à¬¤à­à¬¤à¬•ଗà­à¬¡à¬¿à¬• ବିନା ବଟନ 1 କୠଉପୟୋଗ କରିବା à­Ÿà­‡ କୌଣସି ବାମ କà­à¬²à¬¿à¬•କୠବାଧା ଦେଇପାରିବ à¬à¬¬à¬‚ à¬à¬®à¬¿à¬¤à¬¿ " "ଆପଣଙà­à¬•ର କନଫିଗରେସନ ଭାଙà­à¬—ିୟିବ । ଆପଣ ପà­à¬°à¬•ୃତରେ \"%s\" ବଟନକୠବଟନ1କୠସà­à¬¥à¬¿à¬° କରିବାକୠଚାହାà¬à¬¨à­à¬¤à¬¿ କି ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" à¬à¬• ମାନà­à¬¯ ଧାର ମାସà­à¬• ନà­à¬¹à­‡à¬" msgid "None" msgstr "କିଛି ନà­à¬¹à­‡à¬" msgid "CompizConfig Settings Manager" msgstr "କମà­à¬ªà¬¿à¬œà¬•ନଫିଗ ସେଟିଙà­à¬— ପà­à¬°à¬¬à¬¨à­à¬§à¬•" msgid "Plugin" msgstr "" msgid "Please press the new key combination" msgstr "ଦଯାକରି ନୂଆ କି ସଂୟà­à¬•à­à¬¤à¬¿à¬•ରଣକୠଦବାନà­à¬¤à­" msgid "Window Title" msgstr "ଉଇଣà­à¬¡à­‹ ଶୀରà­à¬·à¬•" msgid "Window Role" msgstr "ଉଇଣà­à¬¡à­‹ ପାତà­à¬°" msgid "Window Name" msgstr "ଉଇଣà­à¬¡à­‹ ନାମ" msgid "Window Class" msgstr "ଉଇଣà­à¬¡à­‹ ଶà­à¬°à­‡à¬£à­€" msgid "Window Type" msgstr "ଉଇଣà­à¬¡à­‹ ପà­à¬°à¬•ାର" msgid "Window ID" msgstr "ଉଇଣà­à¬¡à­‹ ID" msgid "And" msgstr "à¬à¬¬à¬‚" msgid "Or" msgstr "କିମà­à¬¬à¬¾" msgid "Edit match" msgstr "ମିଶà­à¬¥à¬¿à¬¬à¬¾à¬•ୠସଂପାଦନକର" #. Type msgid "Type" msgstr "ପà­à¬°à¬•ାର" #. Value msgid "Value" msgstr " ମୂଲà­à¬¯" msgid "Grab" msgstr "ଟାଣିନିଅ" #. Relation msgid "Relation" msgstr "ସମà­à¬ªà¬°à­à¬•" #. Invert msgid "Invert" msgstr "ଓଲଟାଅ" msgid "Browse..." msgstr "" msgid "Images" msgstr "ଚିତà­à¬°à¬—à­à¬¡à¬¿à¬•" msgid "File" msgstr "ଫାଇଲ" msgid "Open directory..." msgstr "ବିବରଣୀପଞà­à¬œà¬¿à¬•ା ଖୋଲ..." msgid "Open file..." msgstr "ଫାଇଲ ଖୋଲ..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "କମà­à¬ªà¬¿à¬œà¬•ନଫିଗ କନଫିଗରେସନ ସିଷà­à¬Ÿà¬® ପାଇଠà¬à¬¹à¬¾ ଗୋଟିଠସେଟିଙà­à¬— ପà­à¬°à¬¬à¬¨à­à¬§à¬• ଅଟେ ।" msgid "translator-credits" msgstr "ଅନà­à¬¬à¬¾à¬¦à¬• - ଶà­à¬°à­‡à¬¯à¬—à­à¬¡à¬¿à¬•" msgid "An error has occured" msgstr "ଗୋଟିଠତà­à¬°à­à¬Ÿà¬¿ ଘଟିଛି" msgid "Warning" msgstr "ଚେତାବନୀ" #, python-format msgid "Enable %s" msgstr "%s ସକà­à¬·à¬®à¬•ର" msgid "Filter" msgstr "ଫିଲà­à¬Ÿà¬°" #, python-format msgid "Search %s Plugin Options" msgstr "ପà­à¬²à¬—ଇନ ବିକଳà­à¬ªà¬—à­à¬¡à¬¿à¬•à­ %s ତଦନà­à¬¤à¬•ର" msgid "Use This Plugin" msgstr "à¬à¬¹à¬¿ ପà­à¬²à¬—ଇନକୠଉପୟୋଗକର" msgid "Search Compiz Core Options" msgstr "କମà­à¬ªà¬¿à¬œ କେନà­à¬¦à­à¬°à­€à¬¯ ବିକଳà­à¬ªà¬—à­à¬¡à¬¿à¬•ୠତଦନà­à¬¤à¬•ର" msgid "Error" msgstr "ତà­à¬°à­à¬Ÿà¬¿" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "ରେ ତଦନà­à¬¤à¬•ର..." #. Options msgid "Short description and name" msgstr "ବରà­à¬£à­à¬£à¬¨à¬¾ à¬à¬¬à¬‚ ନାମ ଛୋଟକର" msgid "Long description" msgstr "ଲମà­à¬¬à¬¾ ବରà­à¬£à­à¬£à¬¨à¬¾" msgid "Settings value" msgstr "ସେଟିଙà­à¬—ଗà­à¬¡à¬¿à¬•ର ମୂଲà­à¬¯" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "ସେଟିଙà­à¬—ଗà­à¬¡à¬¿à¬•" msgid "Loading Advanced Search" msgstr "" msgid "Add a New Profile" msgstr "ଗୋଟିଠନୂଆ ପà­à¬°à­‹à¬«à¬¾à¬‡à¬² ୟୋଗକର" msgid "Remove This Profile" msgstr "à¬à¬¹à¬¿ ପà­à¬°à­‹à¬«à¬¾à¬‡à¬²à¬•ୠହଟାଅ" msgid "Default" msgstr "ଡିଫଲà­à¬Ÿ" msgid "Profile" msgstr "ପà­à¬°à­‹à¬«à¬¾à¬‡à¬²" msgid "Import" msgstr "ଆମଦାନୀକର" msgid "Import a CompizConfig Profile" msgstr "ଗୋଟିଠକମà­à¬ªà¬¿à¬œà¬•ନଫିଗ ପà­à¬°à­‹à¬«à¬¾à¬‡à¬² ଆମଦାନୀକର" msgid "Import as..." msgstr "ପରି ଆମଦାନୀକର ..." msgid "Import a CompizConfig Profile as a new profile" msgstr "ଗୋଟିଠକମà­à¬ªà¬¿à¬œà¬•ନଫିଗ ପà­à¬°à­‹à¬«à¬¾à¬‡à¬²à¬•à­ à¬à¬• ନୂଆ ପà­à¬°à­‹à¬«à¬¾à¬‡à¬² ପରି ଆମଦାନୀକର" msgid "Export" msgstr "ରପà­à¬¤à¬¾à¬¨à­€à¬•ର" msgid "Export your CompizConfig Profile" msgstr "ଆପଣଙà­à¬•ର କମà­à¬ªà¬¿à¬œà¬•ନଫିଗ ପà­à¬°à­‹à¬«à¬¾à¬‡à¬²à¬•ୠରପà­à¬¤à¬¾à¬¨à­€ କରନà­à¬¤à­" msgid "Reset to defaults" msgstr "ଡିଫଲà­à¬Ÿà¬—à­à¬¡à¬¿à¬•ୠପà­à¬¨à¬ƒà¬¸à­à¬¥à¬¿à¬° କର" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "ବିଶà­à¬¬à¬—ତ ଡିଫଲà­à¬Ÿà¬•ୠଆପଣଙà­à¬•ର କମà­à¬ªà¬¿à¬œà¬•ନଫିଗ ପà­à¬°à­‹à¬«à¬¾à¬‡à¬²à¬•ୠପà­à¬¨à¬ƒà¬¸à­à¬¥à¬¿à¬° କରନà­à¬¤à­ " msgid "Backend" msgstr "ବà­à¬¯à¬¾à¬•à¬à¬£à­à¬¡" msgid "Integration" msgstr "à¬à¬•ତà­à¬°à¬¿à¬•ରଣ" msgid "Enable integration into the desktop environment" msgstr "ଡେସà­à¬•ଟପ ପରିବେଶକୠà¬à¬•ତà­à¬°à¬¿à¬•ରଣ ସକà­à¬·à¬® କର" msgid "Profiles (*.profile)" msgstr "ପà­à¬°à­‡à¬«à¬¾à¬‡à¬²à¬—à­à¬¡à¬¿à¬• (*.ପà­à¬°à­‹à¬«à¬¾à¬‡à¬²)" msgid "All files" msgstr "ସବୠଫାଇଲଗà­à¬¡à¬¿à¬•" msgid "Save file.." msgstr "ଫାଇଲ ସଂଚଯକର" msgid "Do you want to skip default option values while exporting your profile?" msgstr "ଆପଣଙà­à¬•ର ପà­à¬°à­‹à¬«à¬¾à¬‡à¬²à¬•ୠରପà­à¬¤à¬¾à¬¨à­€ କରିବା ବେଳେ ଡିଫଲà­à¬Ÿ ବିକଳà­à¬ª ମୂଲà­à¬¯à¬•ୠବାଦ ଦେବାକୠଚାହାà¬à¬¨à­à¬¤à¬¿ କି ?" msgid "Open file.." msgstr "ଫାଇଲ ଖୋଲ ..." msgid "Enter a profile name" msgstr "ଗୋଟିଠପà­à¬°à­‹à¬«à¬¾à¬‡à¬² ନାମ ପà­à¬°à¬¬à¬¿à¬·à­à¬Ÿà¬•ର" msgid "Please enter a name for the new profile:" msgstr "ନୂଆ ପà­à¬°à­‹à¬«à¬¾à¬‡à¬² ପାଇଠଗୋଟିଠନାମ ଦଯାକରି ପà­à¬°à¬¬à¬¿à¬·à­à¬Ÿ କରନà­à¬¤à­ :" msgid "Backend not found." msgstr "ବà­à¬¯à¬¾à¬•à¬à¬£à­à¬¡ ମିଳିଲା ନାହିଠ।" #. Auto sort msgid "Automatic plugin sorting" msgstr "ସà­à¬¬à¬¯à¬‚ଚାଳିତ ପà­à¬²à¬—ଇନ ସଜାଇବା" msgid "Disabled Plugins" msgstr "ଅକà­à¬·à¬®à¬¹à­‹à¬‡à¬¥à¬¿à¬¬à¬¾ ପà­à¬²à¬—ଇନଗà­à¬¡à¬¿à¬•à­ " msgid "Enabled Plugins" msgstr "ସକà­à¬·à¬®à¬¹à­‹à¬‡à¬¥à¬¿à¬¬à¬¾ ପà­à¬²à¬—ଇନଗà­à¬¡à¬¿à¬•" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "ଆପଣ ସà­à¬¬à¬¯à¬‚ଚାଳିତ ପà­à¬²à¬—ଇନ ସଜାଇବାକୠପà­à¬°à¬•ୃତରେ ଅକà­à¬·à¬® କରିବାକୠଚାହାà¬à¬¨à­à¬¤à¬¿ କି ? à¬à¬¹à¬¾ ଦà­à¬¬à¬¨à­à¬¦ ପରିଚାଳନାକୠ" "ମଧà­à¬¯ ଅକà­à¬·à¬® କରିଦେବ । ୟଦି ଆପଣ ଜାଣିଛନà­à¬¤à¬¿, କଣ ଆପଣ କରà­à¬›à¬¨à­à¬¤à¬¿ ତେବେ ୟାଇ à¬à¬¹à¬¾ କରିବା ଉଚିତ ।" msgid "Add plugin" msgstr "ପà­à¬²à¬—ଇନ ୟୋଗକର" msgid "Plugin name:" msgstr "ପà­à¬²à¬‡à¬¨ ନାମ:" msgid "Insert plugin name" msgstr "ପà­à¬²à¬—ଇନ ନାମ ଭରà­à¬¤à­à¬¤à¬¿à¬•ର" msgid "Preferences" msgstr "ପସନà­à¬¦à¬—à­à¬¡à¬¿à¬•" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "କମà­à¬ªà¬¿à¬œ କନଫିଗରେସନ ସିଷà­à¬Ÿà¬® ଦà­à¬¬à¬¾à¬°à¬¾ ଉପୟୋଗ ହେଉଥିବା ବà­à¬¯à¬¾à¬•à¬à¬£à­à¬¡, ପà­à¬°à­‹à¬«à¬¾à¬‡à¬² à¬à¬¬à¬‚ ଅନà­à¬¯ ଅନà­à¬¤à¬¬à¬°à­à¬¤à­à¬¤à­€ " "ସେଟିଙà­à¬—ଗà­à¬¡à¬¿à¬•ୠକନଫିଗର କରନà­à¬¤à­ ।" msgid "About" msgstr "ବିଷଯରେ" msgid "About CCSM..." msgstr " CCSM ବିଷଯରେ..." msgid "Profile & Backend" msgstr "ପà­à¬°à­‹à¬«à¬¾à¬‡à¬² & ବà­à¬¯à¬¾à¬•à¬à¬£à­à¬¡" msgid "Plugin List" msgstr "ପà­à¬²à¬—ଇନ ତାଲିକା" msgid "Filter your Plugin list" msgstr "ଆପଣଙà­à¬•ର ପà­à¬²à¬—ଇନ ତାଲିକାକୠଫିଲà­à¬Ÿà¬° କରନà­à¬¤à­ " #, python-format msgid "Screen %i" msgstr "ସà­à¬•à­à¬°à¬¿à¬¨ %i" msgid "Screen" msgstr "ସà­à¬•à­à¬°à¬¿à¬¨" msgid "Category" msgstr "ବିଭାଗ" msgid "Advanced Search" msgstr "ଉନà­à¬¨à¬¤ ତଦନà­à¬¤" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "କୌଣସି ମେଳ ମିଳିଲା ନାହିଠ\n" "\n" " ଆପଣଙà­à¬•ର ଫିଲà­à¬Ÿà¬° \"%s\" କୌଣସି ସାମଗà­à¬°à­€ ସହିତ ମେଳ ଖାଉନି ।" msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "ସମà­à¬­à¬¾à¬¬à¬¿à¬¤ ଦà­à¬¬à¬¨à­à¬¦à¬—à­à¬¡à¬¿à¬•ୠଗଣନା କରà­à¬›à¬¿, ଦଯାକରି ଅପେକà­à¬·à¬¾ କରନà­à¬¤à­" #~ msgid "Value (%s)" #~ msgstr "ମୂଲà­à¬¯ (%s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "ଅପରିଚାଳିତ ତାଲିକା ପà­à¬°à¬•ାର %s ପାଇଠ%s" #~ msgid "Actions" #~ msgstr "କାରà­à­Ÿà­à¬¯à¬—à­à¬¡à¬¿à¬•" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/gu.po0000644000015301777760000004164412321343002022510 0ustar pbusernogroup00000000000000# translation of ccsm.po to Gujarati # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Krunaliben Patel , 2007. msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-06-13 05:57+0200\n" "Last-Translator: Jigish Gohil \n" "Language-Team: gist Gujarati team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s ને િનશકૃીય કરો" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s સà«àª¯à«‹àªœà«€àª¤ કરશો નહિં" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s ને ગમે તે રીતે સà«àª¯à«‹àªœà«€àª¤ કરો" msgid "key" msgstr "ચાવી" msgid "button" msgstr "બટન" msgid "edge" msgstr "" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "તમે %s લકà«àª·àª£ વાપરવાનો પà«àª°àª¯àª¾àª¸ કરી રહà«àª¯àª¾ છો કે જે %s દà«àªµàª¾àª°àª¾ પૂરà«àª‚ પાડવામાં " "આવેલ છે.\n" "આ પà«àª²àª—ઈન વરà«àª¤àª®àª¾àª¨àª®àª¾àª‚ નિષà«àª•à«àª°àª¿àª¯ કરેલ છે.\n" "શà«àª‚ તમે %s સકà«àª°àª¿àª¯ કરવા ઈચà«àª›à«‹ છો કે જેથી લકà«àª·àª£ ઉપલબà«àª§ બની જાય?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s વાપરો" #, fuzzy, python-format msgid "Don't use %(feature)s" msgstr "%s સà«àª¯à«‹àªœà«€àª¤ કરશો નહિં" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "તમે %s લકà«àª·àª£ વાપરવાનો પà«àª°àª¯àª¾àª¸ કરી રહà«àª¯àª¾ છો કે જે %s દà«àªµàª¾àª°àª¾ પૂરà«àª‚ પાડવામાં " "આવેલ છે.\n" "આ પà«àª²àª—ઈન વરà«àª¤àª®àª¾àª¨àª®àª¾àª‚ નિષà«àª•à«àª°àª¿àª¯ કરેલ છે.\n" "શà«àª‚ તમે %s સકà«àª°àª¿àª¯ કરવા ઈચà«àª›à«‹ છો કે જેથી લકà«àª·àª£ ઉપલબà«àª§ બની જાય?" #, fuzzy, python-format msgid "Enable %(plugin)s" msgstr "આ પà«àª²àª—ઈનો સકà«àª°àª¿àª¯ કરો" #, fuzzy, python-format msgid "Don't enable %(feature)s" msgstr "%s સકà«àª°àª¿àª¯ કરશો નહિં" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, fuzzy, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "પà«àª²àª—ઈન %s ઠ%s લકà«àª·àª£ પૂરà«àª‚ પાડે છે કે જે %s દà«àªµàª¾àª°àª¾ પણ પૂરà«àª‚ પાડવામાં " "આવે છે" #, fuzzy, python-format msgid "Disable %(plugin_conflict)s" msgstr "આ પà«àª²àª—ઈનો નિષà«àª•à«àª°àª¿àª¯ કરો" #, fuzzy, python-format msgid "Don't enable %(plugin)s" msgstr "%s સકà«àª°àª¿àª¯ કરશો નહિં" #, fuzzy, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "પà«àª²àª—ઈન %s ઠ%s સાથે તકરાય છે." #, fuzzy, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%s માટે %s લકà«àª·àª£ જરૂરી છે કે જે નીચેના પà«àª²àª—ઈનો દà«àªµàª¾àª°àª¾ પૂરà«àª‚ પાડવામાં આવે છે:\n" "%s" msgid "Enable these plugins" msgstr "આ પà«àª²àª—ઈનો સકà«àª°àª¿àª¯ કરો" #, fuzzy, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%s માટે %s પà«àª²àª—ઈન જરૂરી છે." #, fuzzy, python-format msgid "Enable %(require)s" msgstr "%s સકà«àª°àª¿àª¯ કરો" #, fuzzy, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%s ઠ%s નà«àª‚ લકà«àª·àª£ પૂરà«àª‚ પાડે છે કે જે પà«àª²àª—ઈનો %s દà«àªµàª¾àª°àª¾ જરૂરી છે." msgid "Disable these plugins" msgstr "આ પà«àª²àª—ઈનો નિષà«àª•à«àª°àª¿àª¯ કરો" #, fuzzy, python-format msgid "Don't disable %(plugin)s" msgstr "%s નિષà«àª•à«àª°àª¿àª¯ કરશો નહિં" #, fuzzy, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%s ઠપà«àª²àª—ઈનો %s દà«àªµàª¾àª°àª¾ જરૂરી છે." msgid "General" msgstr "સામાનà«àª¯" msgid "Accessibility" msgstr "સà«àª²àª­àª¤àª¾" msgid "Desktop" msgstr "ડેસà«àª•ટોપ" msgid "Extras" msgstr "વધારાનà«àª‚" msgid "Window Management" msgstr "વિનà«àª¡à«‹ વà«àª¯àªµàª¸à«àª¥àª¾àªªàª¨" msgid "Effects" msgstr "અસરો" msgid "Image Loading" msgstr "ચિતà«àª° લાવવાનà«àª‚" msgid "Utility" msgstr "ઉપયોગીતા" msgid "All" msgstr "બધà«àª‚" msgid "Uncategorized" msgstr "બિનવરà«àª—ીકૃત" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "સà«àª¯à«‹àªœàª¨àª¨à«‡ મૂળભૂત કિંમતમાં પà«àª¨àªƒàª¸à«àª¯à«‹àªœà«€àª¤ કરો" msgid "Edit" msgstr "ફેરફાર" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "વિવિધ-યાદી સà«àª¯à«‹àªœàª¨à«‹. તમે કિંમતોમાં ફેરફાર કરવા માટે હરોળ પર બમણà«àª‚-કà«àª²àª¿àª• કરી શકો છો." #, python-format msgid "Edit %s" msgstr "ફેરફાર %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ઠમાનà«àª¯ ટૂંકાણ નથી" #, fuzzy msgid "Disabled" msgstr "%s નિષà«àª•à«àª°àª¿àª¯ કરો" #, fuzzy msgid "Enabled" msgstr "%s સકà«àª°àª¿àª¯ કરો" msgid "Grab key combination" msgstr "કી જોડાણ મેળવો" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ઠમાનà«àª¯ બટન નથી" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Button1 ને સà«àª§àª¾àª°àª•à«‹ સાથે વાપરવાનà«àª‚ કોઈપણ ડાબા કà«àª²àª¿àª•ને અટકાવી શકે છે અને તેથી તમારà«àª‚ " "રૂપરેખાંકન ભાંગી જશે. શà«àª‚ તમે ખરેખર \"%s\" બટનને Button1 માં સà«àª¯à«‹àªœà«€àª¤ કરવા માંગો છો?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" ઠમાનà«àª¯ બાજૠમાસà«àª• નથી" msgid "None" msgstr "કંઈ નહિં" msgid "CompizConfig Settings Manager" msgstr "CompizConfig સà«àª¯à«‹àªœàª¨à«‹ વà«àª¯àªµàª¸à«àª¥àª¾àªªàª•" #, fuzzy msgid "Plugin" msgstr "પà«àª²àª—ઈન યાદી" msgid "Please press the new key combination" msgstr "મહેરબાની કરીને નવà«àª‚ કી જોડાણ દબાવો" msgid "Window Title" msgstr "વિનà«àª¡à«‹ શીરà«àª·àª•" msgid "Window Role" msgstr "વિનà«àª¡à«‹ ભૂમિકા" msgid "Window Name" msgstr "વિનà«àª¡à«‹ નામ" msgid "Window Class" msgstr "વિનà«àª¡à«‹ વરà«àª—" msgid "Window Type" msgstr "વિનà«àª¡à«‹ પà«àª°àª•ાર" msgid "Window ID" msgstr "વિનà«àª¡à«‹ ID" msgid "And" msgstr "અને" msgid "Or" msgstr "અથવા" msgid "Edit match" msgstr "ફેરફાર જોડણી" #. Type msgid "Type" msgstr "પà«àª°àª•ાર" #. Value #, fuzzy msgid "Value" msgstr "કિંમત (%s)" msgid "Grab" msgstr "મેળવો" #. Relation #, fuzzy msgid "Relation" msgstr "સંકલન" #. Invert msgid "Invert" msgstr "ઊંધà«" #, fuzzy msgid "Browse..." msgstr "માટે શોધો " msgid "Images" msgstr "ચિતà«àª°à«‹" msgid "File" msgstr "ફાઈલ" #, fuzzy msgid "Open directory..." msgstr "ફાઈલ ખોલો..." #, fuzzy msgid "Open file..." msgstr "ફાઈલ ખોલો..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "આ CompizConfig રૂપરેખાંકન સિસà«àªŸàª® માટે સà«àª¯à«‹àªœàª¨à«‹ વà«àª¯àªµàª¸à«àª¥àª¾àªªàª• છે." msgid "translator-credits" msgstr "અંકિત પટેલ " msgid "An error has occured" msgstr "ભૂલ ઉદà«àª­àªµà«€" msgid "Warning" msgstr "ચેતવણી" #, python-format msgid "Enable %s" msgstr "%s સકà«àª°àª¿àª¯ કરો" msgid "Filter" msgstr "ગાળક" #, python-format msgid "Search %s Plugin Options" msgstr "%s પà«àª²àª—ઈન વિકલà«àªªà«‹ શોધો" msgid "Use This Plugin" msgstr "આ પà«àª²àª—ઈન વાપરો" msgid "Search Compiz Core Options" msgstr "Compiz મૂળ વિકલà«àªªà«‹ શોધો" msgid "Error" msgstr "કà«àª·àª¤àª¿" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "માં શોધો..." #. Options msgid "Short description and name" msgstr "ટૂંકૠવરà«àª£àª¨ અને નામ" msgid "Long description" msgstr "લાંબૠવરà«àª£àª¨" msgid "Settings value" msgstr "સà«àª¯à«‹àªœàª¨à«‹ કિંમત" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "સà«àª¯à«‹àªœàª¨à«‹" #, fuzzy msgid "Loading Advanced Search" msgstr "અદà«àª¯àª¤àª¨ શોધ" msgid "Add a New Profile" msgstr "નવી રૂપરેખા ઉમેરો" msgid "Remove This Profile" msgstr "આ રૂપરેખા દૂર કરો" msgid "Default" msgstr "મૂળભૂત" msgid "Profile" msgstr "રૂપરેખા" msgid "Import" msgstr "આયાત કરો" msgid "Import a CompizConfig Profile" msgstr "CompizConfig રૂપરેખા આયાત કરો" #, fuzzy msgid "Import as..." msgstr "આયાત કરો" #, fuzzy msgid "Import a CompizConfig Profile as a new profile" msgstr "CompizConfig રૂપરેખા આયાત કરો" msgid "Export" msgstr "નિકાસ કરો" msgid "Export your CompizConfig Profile" msgstr "તમારી CompizConfig રૂપરેખાની નિકાસ કરો" #, fuzzy msgid "Reset to defaults" msgstr "મૂળભૂતોમાં પà«àª¨àªƒàª¸à«àª¯à«‹àªœà«€àª¤ કરો" #, fuzzy msgid "Reset your CompizConfig Profile to the global defaults" msgstr "તમારી CompizConfig રૂપરેખાની નિકાસ કરો" msgid "Backend" msgstr "પાશà«àªµàª­àª¾àª—" msgid "Integration" msgstr "સંકલન" msgid "Enable integration into the desktop environment" msgstr "ડેસà«àª•ટોપ પરà«àª¯àª¾àªµàª°àª£àª®àª¾àª‚ સંકલન સકà«àª°àª¿àª¯ કરો" msgid "Profiles (*.profile)" msgstr "રૂપરેખાઓ (*.profile)" msgid "All files" msgstr "બધી ફાઈલો" msgid "Save file.." msgstr "ફાઈલ સંગà«àª°àª¹à«‹..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "જà«àª¯àª¾àª°à«‡ તમે તમારી રૂપરેખાની નિકાસ કરી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ શà«àª‚ તમે મૂળભૂત વિકલà«àªª કિંમતો અવગણવા " "માંગો છો?" msgid "Open file.." msgstr "ફાઈલ ખોલો..." msgid "Enter a profile name" msgstr "રૂપરેખા નામ દાખલ કરો" msgid "Please enter a name for the new profile:" msgstr "મહેરબાની કરીને નવી રૂપરેખા માટેનà«àª‚ નામ દાખલ કરો:" msgid "Backend not found." msgstr "પાશà«àªµàª­àª¾àª— મળà«àª¯à«àª‚ નહિં." #. Auto sort msgid "Automatic plugin sorting" msgstr "આપોઆપ પà«àª²àª—ઈન કà«àª°àª®àª®àª¾àª‚ ગોઠવવાનà«àª‚" #, fuzzy msgid "Disabled Plugins" msgstr "આ પà«àª²àª—ઈનો નિષà«àª•à«àª°àª¿àª¯ કરો" #, fuzzy msgid "Enabled Plugins" msgstr "આ પà«àª²àª—ઈનો સકà«àª°àª¿àª¯ કરો" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "શà«àª‚ તમે ખરેખર આપોઆપ પà«àª²àª—ઈન કà«àª°àª®àª®àª¾àª‚ ગોઠવવાનà«àª‚ નિષà«àª•à«àª°àª¿àª¯ કરવા માંગો છો? આ તકરાર નિયંતà«àª°àª¿àª¤ " "કરવાનà«àª‚ પણ નિષà«àª•à«àª°àª¿àª¯ કરશે. તમારે આવà«àª‚ માતà«àª° તà«àª¯àª¾àª°à«‡ જ કરવà«àª‚ જોઈઠજો તમને ખબર હોય કે તમે શà«àª‚ કરી " "રહà«àª¯àª¾ છો." msgid "Add plugin" msgstr "પà«àª²àª—ઈન ઉમેરો" msgid "Plugin name:" msgstr "પà«àª²àª—ઈન નામ:" msgid "Insert plugin name" msgstr "પà«àª²àª—ઈન નામ દાખલ કરો" msgid "Preferences" msgstr "પસંદગીઓ" #, fuzzy msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Compiz રૂપરેખાંકન સિસà«àªŸàª® દà«àªµàª¾àª°àª¾ વાપરવામાં આવતા પાશà«àªµàª­àª¾àª— અને રૂપરેખા રૂપરેખાંકિત કરો." msgid "About" msgstr "વિશે" msgid "About CCSM..." msgstr "CCSM વિશે..." msgid "Profile & Backend" msgstr "રૂપરેખા & પાશà«àªµàª­àª¾àª—" msgid "Plugin List" msgstr "પà«àª²àª—ઈન યાદી" msgid "Filter your Plugin list" msgstr "તમારી પà«àª²àª—ઈન યાદી ગાળો" #, python-format msgid "Screen %i" msgstr "સà«àª•à«àª°à«€àª¨ %i" msgid "Screen" msgstr "સà«àª•à«àª°à«€àª¨" msgid "Category" msgstr "વરà«àª—" msgid "Advanced Search" msgstr "અદà«àª¯àª¤àª¨ શોધ" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "કંઈ બંધબેસતà«àª‚ મળà«àª¯à«àª‚ નહિં. \n" "\n" " તમારા ગાળક \"%s\" ઠકોઈ જોડણી વસà«àª¤à« શોધી નહિં." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "શકà«àª¯ તકરારો ગણી રહà«àª¯àª¾ છીàª, મહેરબાની કરીને રાહ જà«àª“" #~ msgid "Value (%s)" #~ msgstr "કિંમત (%s)" #, fuzzy #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "કિંમત (%s) ઠ%s માટે:" #~ msgid "Unhandled list type %s for %s" #~ msgstr "અનિયંતà«àª°àª¿àª¤ યાદી પà«àª°àª•ાર %s ઠ%s માટે" #~ msgid "Actions" #~ msgstr "કà«àª°àª¿àª¯àª¾àª“" #~ msgid "Name" #~ msgstr "નામ" #~ msgid "Screen Edge" #~ msgstr "સà«àª•à«àª°à«€àª¨ બાજà«" #~ msgid "Button %i" #~ msgstr "બટન %i" #~ msgid "Edge Button" #~ msgstr "બાજૠબટન" #~ msgid "On System Bell" #~ msgstr "સિસà«àªŸàª® ઘંટડી પર" #~ msgid "Edit Action: %s" #~ msgstr "ફેરફાર કà«àª°àª¿àª¯àª¾: %s" #~ msgid "Screen Edges" #~ msgstr "સà«àª•à«àª°à«€àª¨ બાજà«àª“" #~ msgid "Backend & Profile" #~ msgstr "પાશà«àªµàª­àª¾àª— & રૂપરેખા" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/nb.po0000644000015301777760000003015312321343002022465 0ustar pbusernogroup00000000000000# Norwegian Bokmaal translation for CSSM. # Copyright (C) 2007 Free Software Foundation, Inc. # This file is distributed under the same license as the CCSM package. # , 2007. # # msgid "" msgstr "" "Project-Id-Version: CompizConfig Settings Manager\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-06-10 22:53+0200\n" "Last-Translator: Markus Igeland \n" "Language-Team: Norwegian Bokmaal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Den nye verdien for snarveien %(binding)s for hendelsen %(action)s i " "tillegget %(plugin)s er i konflikt med hendelsen %(action_conflict)" "s i tillegget %(plugin_conflict)s.\n" "Vil du slÃ¥ av %(action_conflict)s i tillegget %(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "SlÃ¥ av %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Ikke velg %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Velg %(action)s uansett" msgid "key" msgstr "Tast" msgid "button" msgstr "Knapp" msgid "edge" msgstr "Kant" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Du prøver Ã¥ bruke funksjonaliteten %(feature)s som ikke " "leveres av noe tillegg.\n" "Ønsker du Ã¥ bruke denne funksjonaliteten uansett?" #, python-format msgid "Use %(feature)s" msgstr "Bruk %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Ikke bruk %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Du prøver Ã¥ bruke funksjonaliteten %(feature)s som leveres av " "tillegget %(plugin)s.\n" "Dette programtillegget er for tiden slÃ¥tt av.\n" "Vil du skru pÃ¥ %(plugin)s sÃ¥ funksjonaliteten er tilgjengelig?" #, python-format msgid "Enable %(plugin)s" msgstr "SlÃ¥ pÃ¥ %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Ikke slÃ¥ pÃ¥ %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "Løs conflikter" msgid "Ignore conflicts" msgstr "Ignorer konflikter" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Programtillegget %(plugin_conflict)s leverer funksjonaliteten %" "(feature)s som ogsÃ¥ leveres av %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "SlÃ¥ av %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Ikke skru pÃ¥ %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Programtillegget %(plugin_conflict)s er i konflikt med %(plugin)s" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s krever funksjonaliteten %(feature)s som leveres av " "de følgende programtilleggene:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Skru pÃ¥ disse tilleggene" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s krever programtillegget %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Skru pÃ¥ %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s leverer funksjonaliteten %(feature)s som kreves av " "programtilleggene %(plugin_list)s." msgid "Disable these plugins" msgstr "SlÃ¥ av disse tilleggene" #, python-format msgid "Don't disable %(plugin)s" msgstr "Ikke slÃ¥ av %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s kreves av programtilleggen %(plugin_list)s." msgid "General" msgstr "Generelt" msgid "Accessibility" msgstr "Tilgjengelighet" msgid "Desktop" msgstr "Skrivebord" msgid "Extras" msgstr "Ekstra" msgid "Window Management" msgstr "VindushÃ¥ndtering" msgid "Effects" msgstr "Effekter" msgid "Image Loading" msgstr "Bildelasting" msgid "Utility" msgstr "Nytte" msgid "All" msgstr "Alle" msgid "Uncategorized" msgstr "Ukategorisert" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Tilbakestill innstillingen til standardverdien" msgid "Edit" msgstr "Rediger" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Flerliste-innstillinger. Du kan dobbeltklikke pÃ¥ en rad for Ã¥ redigere " "verdiene." #, python-format msgid "Edit %s" msgstr "Rediger %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" er ikke en gyldig snarvei" msgid "Disabled" msgstr "SlÃ¥tt av" msgid "Enabled" msgstr "Skrudd pÃ¥" msgid "Grab key combination" msgstr "Hent tastekombinasjon" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" er ikke en gyldig knapp" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Ã… bruke Knapp1 uten modifikator kan hindre venstreklikk og ødelegge " "konfigurasjonen din. Vil du virkelig stille inn \"%s\"-knapp til Knapp1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" er ikke en gyldig kantmaske" msgid "None" msgstr "Ingen" msgid "CompizConfig Settings Manager" msgstr "CompizConfig InnstillingshÃ¥ndterer" msgid "Plugin" msgstr "Tillegg" msgid "Please press the new key combination" msgstr "Vennligst trykk den nye tastaturkombinasjonen" msgid "Window Title" msgstr "Vindustittel" msgid "Window Role" msgstr "Vindusrolle" msgid "Window Name" msgstr "Vindusnavn" msgid "Window Class" msgstr "Vindusklasse" msgid "Window Type" msgstr "Vindustype" msgid "Window ID" msgstr "Vindus-ID" msgid "And" msgstr "Og" msgid "Or" msgstr "Eller" msgid "Edit match" msgstr "Rediger treff" #. Type msgid "Type" msgstr "Type" #. Value msgid "Value" msgstr "Verdi" msgid "Grab" msgstr "Grip" #. Relation msgid "Relation" msgstr "Relasjon" #. Invert msgid "Invert" msgstr "Omvendt" msgid "Browse..." msgstr "Let etter..." msgid "Images" msgstr "Bilder" msgid "File" msgstr "Fil" msgid "Open directory..." msgstr "Ã…pne katalog..." msgid "Open file..." msgstr "Ã…pne fil..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Dette er en innstillingshÃ¥ndterer for CompizConfig-konfigurasjonssystemet" msgid "translator-credits" msgstr "oversetter-takk " msgid "An error has occured" msgstr "En feil har oppstÃ¥tt" msgid "Warning" msgstr "Advarsel" #, python-format msgid "Enable %s" msgstr "Skru pÃ¥ %s" msgid "Filter" msgstr "Filter" #, python-format msgid "Search %s Plugin Options" msgstr "Søk valg for programtillegget %s" msgid "Use This Plugin" msgstr "Bruk dette programtillegget" msgid "Search Compiz Core Options" msgstr "Søk Compiz Core-valg" msgid "Error" msgstr "Feil" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Skriv inn filteret.\n" "Klikk tastaturbildet for Ã¥ gripe en tast Ã¥ søke etter." msgid "Search in..." msgstr "Søk i..." #. Options msgid "Short description and name" msgstr "Kort beskrivelse og navn" msgid "Long description" msgstr "Lang beskrivelse" msgid "Settings value" msgstr "Verdi for innstilling" msgid "Group" msgstr "Grupper" msgid "Subgroup" msgstr "Undergruppe" #. Notebook msgid "Settings" msgstr "Innstillinger" msgid "Loading Advanced Search" msgstr "Laster avansert søk" msgid "Add a New Profile" msgstr "Legg til en ny profil" msgid "Remove This Profile" msgstr "Fjern denne profilen" msgid "Default" msgstr "Standard" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importer" msgid "Import a CompizConfig Profile" msgstr "Importer en CompizConfig-profil" msgid "Import as..." msgstr "Importer som..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importer en CompizConfig-profil som en ny profil" msgid "Export" msgstr "Eksporter" msgid "Export your CompizConfig Profile" msgstr "Eksporter din CompizConfig-profil" msgid "Reset to defaults" msgstr "Tilbakestill til standardvalg" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Tilbakestill din CompizConfig-profil til de globale standardvalgene" msgid "Backend" msgstr "Bakvegg" msgid "Integration" msgstr "Integrasjon" msgid "Enable integration into the desktop environment" msgstr "Aktiver integrasjon inn i skrivebordsmiljøet" msgid "Profiles (*.profile)" msgstr "Profiler (*.profile)" msgid "All files" msgstr "Alle filer" msgid "Save file.." msgstr "Lagre fil..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Vil du hoppe over standardverdiene nÃ¥r du eksporterer profilen din?" msgid "Open file.." msgstr "Ã…pne fil..." msgid "Enter a profile name" msgstr "Skriv inn et profilnavn" msgid "Please enter a name for the new profile:" msgstr "Vennligst skriv inn et navn for den nye profilen" msgid "Backend not found." msgstr "Bakvegg ikke funnet" #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatisk sortering av programtillegg" msgid "Disabled Plugins" msgstr "AvslÃ¥tte programtillegg" msgid "Enabled Plugins" msgstr "PÃ¥slÃ¥tte programtillegg" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Vil du virkelig slÃ¥ av automatisk sortering av programtillegg? Dette vil " "ogsÃ¥ slÃ¥ av konflikthÃ¥ndtering. Du burde bare gjøre dette om du vet hva du " "driver med." msgid "Add plugin" msgstr "Legg til programtillegg" msgid "Plugin name:" msgstr "Navn pÃ¥ programtillegg:" msgid "Insert plugin name" msgstr "Sett inn navnet pÃ¥ programtillegget" msgid "Preferences" msgstr "Preferanser" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Konfigurer bakveggen, profilen og andre interne innstillinger som brukes av " "Compiz-konfigurasjonssystemet." msgid "About" msgstr "Om" msgid "About CCSM..." msgstr "Om CCSM..." msgid "Profile & Backend" msgstr "Profil og bakvegg" msgid "Plugin List" msgstr "Tilleggsliste" msgid "Filter your Plugin list" msgstr "Filter programtilleggslisten din" #, python-format msgid "Screen %i" msgstr "Skjerm %i" msgid "Screen" msgstr "Skjerm" msgid "Category" msgstr "Kategori" msgid "Advanced Search" msgstr "Avansert søk" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Ingen treff. \n" "\n" " Filteret ditt, \"%s\", passer ikke til noen gjenstander." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Beregner mulige konflikter, vennligst vent" #~ msgid "Value (%s)" #~ msgstr "Verdi (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Verdi (%(value)s) for %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "UhÃ¥ndtert listetype %s for %s" #~ msgid "Actions" #~ msgstr "Handlingen" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/LINGUAS0000644000015301777760000000027412321343002022554 0ustar pbusernogroup00000000000000# Set of available languages. Keep it alphabatical. One lingua per line. ar bn bn_IN ca cs de el en_GB es fi fr gl gu he hi hu id it ja ko mnk nb nl or pa pt pt_BR pl ru sk sv tr wo zh_CN compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/en_GB.po0000644000015301777760000002746712321343002023056 0ustar pbusernogroup00000000000000# ccsm GB translation. # Copyright (C) 2008 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # David Lodge \n". # msgid "" msgstr "" "Project-Id-Version: ccsm 0.7.2\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-05-26 15:35+0200\n" "Last-Translator: David Lodge \n" "Language-Team: gb \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Disable %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Don't set %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Set %(action)s anyway" msgid "key" msgstr "key" msgid "button" msgstr "button" msgid "edge" msgstr "edge" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" #, python-format msgid "Use %(feature)s" msgstr "Use %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Don't use %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.Do you wish to enable %(plugin)s so " "the feature is available?" #, python-format msgid "Enable %(plugin)s" msgstr "Enable %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Don't enable %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgid "Resolve conflicts" msgstr "Resolve conflicts" msgid "Ignore conflicts" msgstr "Ignore conflicts" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Disable %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Don't enable %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "Plugin %(plugin_conflict)s conflicts with %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Enable these plugins" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s requires the plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Enable %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgid "Disable these plugins" msgstr "Disable these plugins" #, python-format msgid "Don't disable %(plugin)s" msgstr "Don't disable %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s is required by the plugins %(plugin_list)s." msgid "General" msgstr "General" msgid "Accessibility" msgstr "Accessibility" msgid "Desktop" msgstr "Desktop" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Window Management" msgid "Effects" msgstr "Effects" msgid "Image Loading" msgstr "Image Loading" msgid "Utility" msgstr "Utility" msgid "All" msgstr "All" msgid "Uncategorized" msgstr "Uncategorised" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Reset setting to the default value" msgid "Edit" msgstr "Edit" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "Multi-list settings. You can double-click a row to edit the values." #, python-format msgid "Edit %s" msgstr "Edit %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" is not a valid shortcut" msgid "Disabled" msgstr "Disabled" msgid "Enabled" msgstr "Enabled" msgid "Grab key combination" msgstr "Grab key combination" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" is not a valid button" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" is not a valid edge mask" msgid "None" msgstr "None" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Settings Manager" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Please press the new key combination" msgid "Window Title" msgstr "Window Title" msgid "Window Role" msgstr "Window Role" msgid "Window Name" msgstr "Window Name" msgid "Window Class" msgstr "Window Class" msgid "Window Type" msgstr "Window Type" msgid "Window ID" msgstr "Window ID" msgid "And" msgstr "And" msgid "Or" msgstr "Or" msgid "Edit match" msgstr "Edit match" #. Type msgid "Type" msgstr "Type" #. Value msgid "Value" msgstr "Value" msgid "Grab" msgstr "Grab" #. Relation msgid "Relation" msgstr "Relation" #. Invert msgid "Invert" msgstr "Invert" msgid "Browse..." msgstr "Browse..." msgid "Images" msgstr "Images" msgid "File" msgstr "File" msgid "Open directory..." msgstr "Open directory..." msgid "Open file..." msgstr "Open file..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "This is a settings manager for the CompizConfig configuration system." msgid "translator-credits" msgstr "David Lodge , 2008" msgid "An error has occured" msgstr "An error has occured" msgid "Warning" msgstr "Warning" #, python-format msgid "Enable %s" msgstr "Enable %s" msgid "Filter" msgstr "Filter" #, python-format msgid "Search %s Plugin Options" msgstr "Search %s Plugin Options" msgid "Use This Plugin" msgstr "Use This Plugin" msgid "Search Compiz Core Options" msgstr "Search Compiz Core Options" msgid "Error" msgstr "Error" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgid "Search in..." msgstr "Search in..." #. Options msgid "Short description and name" msgstr "Short description and name" msgid "Long description" msgstr "Long description" msgid "Settings value" msgstr "Settings value" msgid "Group" msgstr "Group" msgid "Subgroup" msgstr "Subgroup" #. Notebook msgid "Settings" msgstr "Settings" msgid "Loading Advanced Search" msgstr "Loading Advanced Search" msgid "Add a New Profile" msgstr "Add a New Profile" msgid "Remove This Profile" msgstr "Remove This Profile" msgid "Default" msgstr "Default" msgid "Profile" msgstr "Profile" msgid "Import" msgstr "Import" msgid "Import a CompizConfig Profile" msgstr "Import a CompizConfig Profile" msgid "Import as..." msgstr "Import as..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Import a CompizConfig Profile as a new profile" msgid "Export" msgstr "Export" msgid "Export your CompizConfig Profile" msgstr "Export your CompizConfig Profile" msgid "Reset to defaults" msgstr "Reset to defaults" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Reset your CompizConfig Profile to the global defaults" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integration" msgid "Enable integration into the desktop environment" msgstr "Enable integration into the desktop environment" msgid "Profiles (*.profile)" msgstr "Profiles (*.profile)" msgid "All files" msgstr "All files" msgid "Save file.." msgstr "Save file.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Do you want to skip default option values while exporting your profile?" msgid "Open file.." msgstr "Open file.." msgid "Enter a profile name" msgstr "Enter a profile name" msgid "Please enter a name for the new profile:" msgstr "Please enter a name for the new profile:" msgid "Backend not found." msgstr "Backend not found." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatic plugin sorting" msgid "Disabled Plugins" msgstr "Disabled Plugins" msgid "Enabled Plugins" msgstr "Enabled Plugins" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgid "Add plugin" msgstr "Add plugin" msgid "Plugin name:" msgstr "Plugin name:" msgid "Insert plugin name" msgstr "Insert plugin name" msgid "Preferences" msgstr "Preferences" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgid "About" msgstr "About" msgid "About CCSM..." msgstr "About CCSM..." msgid "Profile & Backend" msgstr "Profile & Backend" msgid "Plugin List" msgstr "Plugin List" msgid "Filter your Plugin list" msgstr "Filter your Plugin list" #, python-format msgid "Screen %i" msgstr "Screen %i" msgid "Screen" msgstr "Screen" msgid "Category" msgstr "Category" msgid "Advanced Search" msgstr "Advanced Search" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "No matches found. \n" " Your filter \"%s\" does not match any items." msgid "Configure Compiz with CompizConfig" msgstr "Configure Compiz with CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Computing possible conflicts, please wait" #~ msgid "Value (%s)" #~ msgstr "Value (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Value (%(value)s) for %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Unhandled list type %s for %s" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/cs.po0000644000015301777760000002775612321343002022512 0ustar pbusernogroup00000000000000# Czech translation of ccsm. # Copyright (C) 2007 Petr VlaÅ¡ic # This file is distributed under the same license as the ccsm package. # Petr VlaÅ¡ic , 2007. # msgid "" msgstr "" "Project-Id-Version: ccsm 0.6.0\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-02-11 03:46+0100\n" "Last-Translator: Tomas Hejatko \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Nová hodnota zkratky %(binding)s pro akci %(action)s v modulu %" "(plugin)s je ve sporu s akcí %(action_conflict)s v modulu %" "(plugin_conflict)s .\n" "Chcete zkázat %(action_conflict)sv modulu %(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Vypnout %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Nenastavovat %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "PÅ™esto nastavit %(action)s" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Pokoušíte se použít funkci %(feature)s, která není poskytována žádným " "modulem.\n" "PÅ™ejete si i pÅ™esto použít tuto funkci?" #, python-format msgid "Use %(feature)s" msgstr "Použít %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Nepoužívat %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Pokoušíte se použít funkci %(feature)s,která je poskytována modulem " "%(plugin)s.\n" "Tento modul je momentálnÄ› vypnut.\n" "PÅ™ejete si zapnout modul %(plugin)s aby bylo možno tuto funkci " "zpřístupnit?" #, python-format msgid "Enable %(plugin)s" msgstr "Zapnout %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Nezapínat %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Modul %(plugin_conflict)s poskytuje funkci %(feature)s, která " "je také poskytována modulem %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Vypnout %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Nezapínat %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Modul %(plugin_conflict)s je v konfliktu s modulem %(plugin)s" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "Modul %(plugin)s vyžaduje funkci %(feature)s, která je " "poskytována následujícími moduly:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Zapnout tyto moduly" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s vyžaduje modul %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Zapnout %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "Modul %(plugin)sposkytuje funkci %(feature)sjež je vyžadována " "moduly %(plugin_list)s" msgid "Disable these plugins" msgstr "Vypnout tyto moduly" #, python-format msgid "Don't disable %(plugin)s" msgstr "Nevypínat %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "Modul %(plugin)s je vyžadován moduly %(plugin_list)s." msgid "General" msgstr "Obecné" msgid "Accessibility" msgstr "Přístupnost" msgid "Desktop" msgstr "Pracovní plocha" msgid "Extras" msgstr "Doplňky" msgid "Window Management" msgstr "Správa oken" msgid "Effects" msgstr "Efekty" msgid "Image Loading" msgstr "NaÄítání obrázku" msgid "Utility" msgstr "Nástroj" msgid "All" msgstr "VÅ¡e" msgid "Uncategorized" msgstr "NezaÅ™azeno" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Vrátit nastavení do výchozích hodnot" msgid "Edit" msgstr "Editovat" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "Seznam nastavení. Poklepáním na řádek můžete editovat hodnoty." #, python-format msgid "Edit %s" msgstr "Editovat %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" není platná klávesová zkratka" msgid "Disabled" msgstr "Vypnuto" msgid "Enabled" msgstr "Zapnuto" msgid "Grab key combination" msgstr "Získat klávesovou kombinaci" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" není platné tlaÄítko" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Použití TlaÄítka1 bez modifikátorů může zabránit jakémukoliv kliknutí levým " "tlaÄítkem myÅ¡i a takto naruÅ¡it vaÅ¡i konfiguraci. Chcete opravdu nastavit \"%s" "\" na TlaÄítko1?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" není platná rohová maska" msgid "None" msgstr "Žádný" msgid "CompizConfig Settings Manager" msgstr "Manažer nastavení Compizu" #, fuzzy msgid "Plugin" msgstr "Seznam modulů" msgid "Please press the new key combination" msgstr "Prosím, zmáÄknÄ›te novou klávesovou kombinaci" msgid "Window Title" msgstr "Název okna" msgid "Window Role" msgstr "Úloha okna" msgid "Window Name" msgstr "Jméno okna" msgid "Window Class" msgstr "Třída okna" msgid "Window Type" msgstr "Typ okna" msgid "Window ID" msgstr "Identifikátor okna" msgid "And" msgstr "A" msgid "Or" msgstr "Nebo" msgid "Edit match" msgstr "Editovat shodu" #. Type msgid "Type" msgstr "Typ" #. Value msgid "Value" msgstr "Hodnota" msgid "Grab" msgstr "Uchopit" #. Relation msgid "Relation" msgstr "Relace" #. Invert msgid "Invert" msgstr "Invertovat" #, fuzzy msgid "Browse..." msgstr "Hledat pro" msgid "Images" msgstr "Obrázky" msgid "File" msgstr "Soubor" msgid "Open directory..." msgstr "Otevřít adresář..." msgid "Open file..." msgstr "Otevřít soubor..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Toto je manažer nastavení konfiguraÄního systému Compizu." msgid "translator-credits" msgstr "" "Petr VlaÅ¡ic \n" "David Å míd " msgid "An error has occured" msgstr "Vyskytla se chyba" msgid "Warning" msgstr "UpozornÄ›ní" #, python-format msgid "Enable %s" msgstr "Zapnout %s" msgid "Filter" msgstr "Filtr" #, python-format msgid "Search %s Plugin Options" msgstr "Hledat nastavení modulu %s" msgid "Use This Plugin" msgstr "Použít tento modul" msgid "Search Compiz Core Options" msgstr "Hledat nastavení jádra Compizu" msgid "Error" msgstr "Chyba" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "Hledat v..." #. Options msgid "Short description and name" msgstr "StruÄném popise a jménÄ›" msgid "Long description" msgstr "Podrobném popise" msgid "Settings value" msgstr "Nastavení hodnot" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "Nastavení" #, fuzzy msgid "Loading Advanced Search" msgstr "PokroÄilé vyhledávání" msgid "Add a New Profile" msgstr "PÅ™idat nový profil" msgid "Remove This Profile" msgstr "Odstranit vybraný profil" msgid "Default" msgstr "Výchozí" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importovat" msgid "Import a CompizConfig Profile" msgstr "Importovat profil" msgid "Import as..." msgstr "Importovat jako..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importovat profil jako nový" msgid "Export" msgstr "Exportovat" msgid "Export your CompizConfig Profile" msgstr "Exportovat svůj profil" msgid "Reset to defaults" msgstr "Vrátit nastavení do výchozích hodnot" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Resetovat profil do výchozích hodnot" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integrace" msgid "Enable integration into the desktop environment" msgstr "Zapnout integraci do pracovního prostÅ™edí" msgid "Profiles (*.profile)" msgstr "Profily (*.profile)" msgid "All files" msgstr "VÅ¡echny soubory" msgid "Save file.." msgstr "Uložit soubor.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Chcete pÅ™eskoÄit výchozí hodnoty nastavení bÄ›hem exportu svého profilu?" msgid "Open file.." msgstr "Otevřít soubor.." msgid "Enter a profile name" msgstr "Zadejte jméno profilu" msgid "Please enter a name for the new profile:" msgstr "Prosím zadejte jméno pro nový profil:" msgid "Backend not found." msgstr "Backend nenalezen." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatické Å™azení modulů" msgid "Disabled Plugins" msgstr "Vypnuté moduly" msgid "Enabled Plugins" msgstr "Zapnuté moduly" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Opravdu chcete vypnout automatické Å™azení modulů? Tato akce také zapříÄiní " "vypnutí vyhledávání konfliktů. PokraÄujte pouze v případÄ›, kdy opravdu víte " "co dÄ›láte." msgid "Add plugin" msgstr "PÅ™idat modul" msgid "Plugin name:" msgstr "Jméno modulu:" msgid "Insert plugin name" msgstr "Vložte jméno modulu" msgid "Preferences" msgstr "PÅ™edvolby" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Konfigurace backendu, profilu a ostatních interních nastavení používaných " "konfiguraÄním systémem Compizu." msgid "About" msgstr "O programu" msgid "About CCSM..." msgstr "O programu CCSM..." msgid "Profile & Backend" msgstr "Profil a backend" msgid "Plugin List" msgstr "Seznam modulů" msgid "Filter your Plugin list" msgstr "Filtrovat·váš seznam modulů" #, python-format msgid "Screen %i" msgstr "Obrazovka %i" msgid "Screen" msgstr "Obrazovka" msgid "Category" msgstr "Kategorie" msgid "Advanced Search" msgstr "PokroÄilé vyhledávání" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Nenalezena žádná shoda. \n" "\n" "Váš filtr \"%s\"nevyhovuje žádné položce." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Vyhodnocuji možné konfilkty, prosím Äekejte" #~ msgid "Value (%s)" #~ msgstr "Hodnota (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Hodnota (%(value)s) pro nastavení %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "NeÅ™eÅ¡itelný typ listu %s pro %s" #~ msgid "Actions" #~ msgstr "Akce" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/ml_IN.po0000644000015301777760000003422012321343002023063 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-04-10 13:32+0200\n" "Last-Translator: Jesse P Francis \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(plugin)s à´Žà´¨àµà´¨ à´ªàµà´²à´—ിനിലെ %(action)s à´Žà´¨àµà´¨ നടപടിയàµà´Ÿàµ† " "%(binding)s à´Žà´¨àµà´¨ ബൈനàµâ€à´¡à´¿à´™àµà´™à´¿à´¨àµà´±àµ† à´ªàµà´¤à´¿à´¯ മൂലàµà´¯à´‚ %(plugin_conflict)s " "à´Žà´¨àµà´¨ à´ªàµà´²à´—ിനിലെ %(action_conflict)s à´Žà´¨àµà´¨ നടപടിയàµà´®à´¾à´¯à´¿ " "പൊരàµà´¤àµà´¤à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨à´¿à´²àµà´².\n" " %(plugin_conflict)s à´Žà´¨àµà´¨ à´ªàµà´²à´—ിനിലെ %(action_conflict)s à´Žà´¨àµà´¨ " "നടപടി à´…à´ªàµà´°à´¾à´µà´°àµâ€à´¤àµà´¤à´¿à´•മാകàµà´•ണോ?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s à´…à´ªàµà´°à´¾à´µà´°àµâ€à´¤àµà´¤à´¿à´•മാകàµà´•àµà´•" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s സജàµà´œà´®à´¾à´•àµà´•à´°àµà´¤àµàµ" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s à´Žà´¨àµà´¤à´¾à´£àµ†à´™àµà´•à´¿à´²àµà´‚ സജàµà´œà´®à´¾à´•àµà´•àµà´•." msgid "key" msgstr "താകàµà´•ോലàµâ€" msgid "button" msgstr "ബടàµà´Ÿà´£àµâ€" msgid "edge" msgstr "വകàµà´•àµàµ" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "ഒരൠപàµà´²à´—à´¿à´¨àµà´‚ നലàµâ€à´•ാതàµà´¤ %(feature)s à´Žà´¨àµà´¨ വിശേഷത നിങàµà´™à´³àµâ€ " "ഉപയോഗികàµà´•ാനàµâ€ à´¶àµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨àµ.\n" "à´ˆ വിശേഷത à´Žà´¨àµà´¤à´¾à´£àµ†à´™àµà´•à´¿à´²àµà´‚ ഉപയോഗികàµà´•ണോ?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s ഉപയോഗികàµà´•àµà´•" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s ഉപയോഗികàµà´•ാതിരികàµà´•àµà´•" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "%(plugin)s à´Žà´¨àµà´¨ à´ªàµà´²à´—à´¿à´¨àµâ€ നലàµâ€à´•àµà´¨àµà´¨ %(feature)s à´Žà´¨àµà´¨ വിശേഷത " "നിങàµà´™à´³àµâ€ ഉപയോഗികàµà´•ാനàµâ€ à´¶àµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨àµ.\n" "à´ˆ à´ªàµà´²à´—à´¿à´¨àµâ€ ഇപàµà´ªàµ‹à´³àµâ€ à´…à´ªàµà´°à´¾à´µà´°àµâ€à´¤àµà´¤à´¿à´•മാണàµàµ.\n" "à´ˆ വിശേഷത ലഭàµà´¯à´®à´¾à´•àµà´•ാനായി %(plugin)s à´Žà´¨àµà´¨ à´ªàµà´²à´—à´¿à´¨àµâ€ " "à´ªàµà´°à´¾à´µà´°àµâ€à´¤àµà´¤à´¿à´•മാകàµà´•ണോ?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s à´ªàµà´°à´¾à´µà´°àµâ€à´¤àµà´¤à´¿à´•മാകàµà´•àµà´•" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s à´ªàµà´°à´¾à´µà´°àµâ€à´¤àµà´¤à´¿à´•മാകàµà´•à´°àµà´¤àµàµ" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "%(plugin)s à´Žà´¨àµà´¨ à´ªàµà´²à´—ിനിനàµà´±àµ† à´šà´¿à´² %(bindings)s ബൈനàµâ€à´¡à´¿à´™àµà´™àµà´•à´³àµâ€ വേറെ " "à´ªàµà´²à´—à´¿à´¨àµà´•à´³àµà´®à´¾à´¯à´¿ പൊരàµà´¤àµà´¤à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨à´¿à´²àµà´². à´ˆ പൊരàµà´¤àµà´¤à´•àµà´•േടàµà´•à´³àµâ€ പരിഹരികàµà´•ണോ?" msgid "Resolve conflicts" msgstr "പൊരàµà´¤àµà´¤à´•àµà´•േടàµà´•à´³àµâ€ പരിഹരികàµà´•àµà´•" msgid "Ignore conflicts" msgstr "പൊരàµà´¤àµà´¤à´•àµà´•േടàµà´•à´³àµâ€ അവഗണികàµà´•àµà´•" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s à´Žà´¨àµà´¨ à´ªàµà´²à´—à´¿à´¨àµâ€ നലàµâ€à´•àµà´¨àµà´¨ %(feature)s à´Žà´¨àµà´¨ " "വിശേഷത %(plugin)s -ഉം നലàµâ€à´•àµà´¨àµà´¨àµ." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s à´…à´ªàµà´°à´¾à´µà´°àµâ€à´¤àµà´¤à´¿à´•മാകàµà´•àµà´•" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s à´ªàµà´°à´¾à´µà´°àµâ€à´¤àµà´¤à´¿à´•മാകàµà´•ാതിരികàµà´•àµà´•" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "%(plugin_conflict)s à´Žà´¨àµà´¨ à´ªàµà´²à´—à´¿à´¨àµâ€ %(plugin)s à´Žà´¨àµà´¨à´¤àµà´®à´¾à´¯à´¿ " "പൊരàµà´¤àµà´¤à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨à´¿à´²àµà´²." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s à´Žà´¨àµà´¨à´¤à´¿à´¨àµàµ %(feature)s à´Žà´¨àµà´¨ വിശേഷത(à´•à´³àµâ€) " "ആവശàµà´¯à´®àµà´£àµà´Ÿàµàµ, ഇനിപàµà´ªà´±à´¯àµà´¨àµà´¨ à´ªàµà´²à´—à´¿à´¨àµà´•à´³àµâ€ à´…à´µ നലàµâ€à´•àµà´¨àµà´¨àµ:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "à´ˆ à´ªàµà´²à´—à´¿à´¨àµà´•à´³àµâ€ à´ªàµà´°à´¾à´µà´°àµâ€à´¤àµà´¤à´¿à´•മാകàµà´•àµà´•" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "%(plugin)s à´Žà´¨àµà´¨à´¤à´¿à´¨àµàµ %(require)s à´Žà´¨àµà´¨ à´ªàµà´²à´—à´¿à´¨àµâ€ ആവശàµà´¯à´®àµà´£àµà´Ÿàµàµ." #, python-format msgid "Enable %(require)s" msgstr "%(require)s à´ªàµà´°à´¾à´µà´°àµâ€à´¤àµà´¤à´¿à´•മാകàµà´•àµà´•" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s à´Žà´¨àµà´¨à´¤àµàµâ€Œ %(feature)s à´Žà´¨àµà´¨ വിശേഷത നലàµâ€à´•àµà´¨àµà´¨àµ, à´…à´¤àµàµ " "%(plugin_list)s à´Žà´¨àµà´¨àµ€ à´ªàµà´²à´—à´¿à´¨àµà´•à´³àµâ€à´•àµà´•ാവശàµà´¯à´®àµà´£àµà´Ÿàµàµ." msgid "Disable these plugins" msgstr "à´ˆ à´ªàµà´²à´—à´¿à´¨àµà´•à´³àµâ€ à´…à´ªàµà´°à´¾à´µà´°àµâ€à´¤àµà´¤à´¿à´•മാകàµà´•àµà´•" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s à´Žà´¨àµà´¨à´¤àµàµ à´…à´ªàµà´°à´¾à´µà´°àµâ€à´¤àµà´¤à´¿à´•മാകàµà´•ാതിരികàµà´•àµà´•" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s à´Žà´¨àµà´¨à´¤àµàµ %(plugin_list)s à´Žà´¨àµà´¨àµ€ " "à´ªàµà´²à´—à´¿à´¨àµà´•à´³àµâ€à´•àµà´•ാവശàµà´¯à´®àµà´£àµà´Ÿàµàµ." msgid "General" msgstr "പൊതàµà´µà´¾à´¯à´¤àµàµ" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "പണിയിടം" msgid "Extras" msgstr "കൂടàµà´¤à´²àµâ€" msgid "Window Management" msgstr "ജാലക നോകàµà´•ിനടതàµà´¤à´²àµâ€" msgid "Effects" msgstr "" msgid "Image Loading" msgstr "" msgid "Utility" msgstr "" msgid "All" msgstr "à´Žà´²àµà´²à´¾à´‚" msgid "Uncategorized" msgstr "വിഭാഗീകരികàµà´•à´ªàµà´ªàµ†à´Ÿà´¾à´¤àµà´¤à´µ" msgid "N/A" msgstr "N/A" msgid "Reset setting to the default value" msgstr "" msgid "Edit" msgstr "തിരàµà´¤àµà´¤àµà´•" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" #, python-format msgid "Edit %s" msgstr "%s തിരàµà´¤àµà´¤àµà´•" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ഒരൠശരിയായ à´•àµà´±àµà´•àµà´•àµà´µà´´à´¿à´¯à´²àµà´²" msgid "Disabled" msgstr "" msgid "Enabled" msgstr "" msgid "Grab key combination" msgstr "" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ഒരൠശരിയായ ബടàµà´Ÿà´£à´²àµà´²" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "à´’à´¨àµà´¨àµà´®à´¿à´²àµà´²" msgid "CompizConfig Settings Manager" msgstr "" msgid "Plugin" msgstr "à´ªàµà´²à´—àµà´—à´¿à´¨àµâ€" msgid "Please press the new key combination" msgstr "à´ªàµà´¤à´¿à´¯ കീ കോമàµà´ªà´¿à´¨àµ‡à´·à´¨àµâ€ അമരàµâ€à´¤àµà´¤àµà´•" msgid "Window Title" msgstr "വിനàµâ€à´¡àµ‹ തലകàµà´•െടàµà´Ÿàµ" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "തരം" #. Value msgid "Value" msgstr "മൂലàµà´¯à´‚" msgid "Grab" msgstr "" #. Relation msgid "Relation" msgstr "ബനàµà´§à´‚" #. Invert msgid "Invert" msgstr "" msgid "Browse..." msgstr "തിരയàµà´•..." msgid "Images" msgstr "à´šà´¿à´¤àµà´°à´™àµà´™à´³àµâ€" msgid "File" msgstr "ഫയലàµâ€" msgid "Open directory..." msgstr "ഡയറെകàµà´±àµà´±à´±à´¿ à´¤àµà´±à´•àµà´•àµà´•..." msgid "Open file..." msgstr "ഫയലàµâ€ à´¤àµà´±à´•àµà´•àµà´•..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "" msgid "Warning" msgstr "à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ" #, python-format msgid "Enable %s" msgstr "" msgid "Filter" msgstr "à´«à´¿à´²àµâ€à´Ÿàµà´Ÿà´°àµâ€" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "à´ˆ à´ªàµà´²à´—àµà´—à´¿à´¨àµâ€ ഉപയോഗികàµà´•àµà´•" msgid "Search Compiz Core Options" msgstr "" #, fuzzy msgid "Error" msgstr "പിഴവàµ" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "" #. Options msgid "Short description and name" msgstr "ചെറൠവിവരണവàµà´‚ പേരàµà´‚" msgid "Long description" msgstr "വിവരണം" #, fuzzy msgid "Settings value" msgstr "à´•àµà´°à´®àµ€à´•à´°à´£ മൂലàµà´¯à´‚" msgid "Group" msgstr "കൂടàµà´Ÿà´‚" msgid "Subgroup" msgstr "ചെറàµà´•ൂടàµà´Ÿà´‚" #. Notebook msgid "Settings" msgstr "à´•àµà´°à´®àµ€à´•രണങàµà´™à´³àµâ€" msgid "Loading Advanced Search" msgstr "" msgid "Add a New Profile" msgstr "à´ªàµà´¤à´¿à´¯ ഒരൠപàµà´°àµŠà´«àµˆà´²àµâ€ ചേരàµâ€à´•àµà´•àµà´•" msgid "Remove This Profile" msgstr "à´ˆ à´ªàµà´°àµŠà´«àµˆà´²àµâ€ ഉപേകàµà´·à´¿à´•àµà´•àµà´•" msgid "Default" msgstr "à´¸àµà´µà´¤àµ‡" msgid "Profile" msgstr "" msgid "Import" msgstr "ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯àµà´•" msgid "Import a CompizConfig Profile" msgstr "CompizConfig à´ªàµà´°àµŠà´«àµˆà´²àµâ€ ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯àµà´•" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "ഒരൠപàµà´¤à´¿à´¯ à´ªàµà´°àµŠà´«àµˆà´²àµâ€ പോലെ CompizConfig à´ªàµà´°àµŠà´«àµˆà´²àµâ€ ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯àµà´•" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "à´ªàµà´°àµŠà´«àµˆà´²àµà´•à´³àµâ€ (*.profile)" msgid "All files" msgstr "à´Žà´²àµà´²à´¾ ഫയലàµà´•à´³àµà´‚" msgid "Save file.." msgstr "സേവൠചെയàµà´¯àµà´•.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "ഫയലàµâ€ à´“à´ªàµà´ªà´£àµâ€ ചെയàµà´¯àµà´•.." msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "à´ªàµà´²à´—àµà´—à´¿à´¨àµâ€ ചേരàµâ€à´•àµà´•àµà´•" msgid "Plugin name:" msgstr "à´ªàµà´²à´—àµà´—à´¿à´¨àµâ€ പേരàµ:" msgid "Insert plugin name" msgstr "" msgid "Preferences" msgstr "à´•àµà´°à´®àµ€à´•à´°à´™àµà´™à´³àµâ€" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "CCSM-നെകàµà´•àµà´±à´¿à´šàµà´šàµ..." msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "à´ªàµà´²à´—àµà´—à´¿à´¨àµâ€ പടàµà´Ÿà´¿à´•" msgid "Filter your Plugin list" msgstr "" #, python-format msgid "Screen %i" msgstr "" msgid "Screen" msgstr "" msgid "Category" msgstr "വിഭാഗം" msgid "Advanced Search" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" msgid "Configure Compiz with CompizConfig" msgstr "കോമàµà´ªà´¿à´¸àµ CompizConfig ഉപയോഗിചàµà´šàµ à´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•àµà´•" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/ar.po0000644000015301777760000003217612321343002022477 0ustar pbusernogroup00000000000000# translation of ccsm.po to Arabic # OsamaKhalid , 2009. # ccsm ar translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # 2007, Banxoo msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-02-06 20:36+0300\n" "Last-Translator: OsamaKhalid \n" "Language-Team: Arabic\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "القيمة الجديدة للملزم %(binding)s لتنÙيذ الإجراء %(action)s ÙÙŠ الملحق " "%(plugin)s تتداخل مع الإجراء %(action_conflict)s الذي يتبع " "للملحق %(plugin_conflict)s.\n" "أتريد تعطيل %(action_conflict)s ÙÙŠ الملحق %(plugin_conflict)sØŸ" #, python-format msgid "Disable %(action_conflict)s" msgstr "عطّل %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "لا تضبط %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "حدد %(action)s على كل الأحوال" msgid "key" msgstr "Ù…ÙØªØ§Ø­" msgid "button" msgstr "زر" msgid "edge" msgstr "Ø­Ø§ÙØ©" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "أنت بصدد استعمال الميزة %(feature)s اللتي لم يوÙّرها أي ملحق.\n" "أتريد استخدام هذه الميزة على كل حال؟" #, python-format msgid "Use %(feature)s" msgstr "استخدم %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "لا تستخدم %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "أنت بصدد استعمال الميزة %(feature)s اللتي ÙˆÙّرها %(plugin)s.\n" "هذا الملحق معطّل حاليا.\n" "أتريد تمكين %(plugin)s لتصبح الميزة Ù…ØªÙˆÙØ±Ø©ØŸ" #, python-format msgid "Enable %(plugin)s" msgstr "مكّن %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "لا تمكّن %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "بعض تثبيتات %(bindings)s للملحقات %(plugin)s تتعارض مع ملحقات أخرى . " "أتريد حل هذا التعارض؟" msgid "Resolve conflicts" msgstr "حل التعارضات" msgid "Ignore conflicts" msgstr "تجاهل التعارضات" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "الملحق %(plugin_conflict)s ÙŠÙˆÙØ± الميزة %(feature)s الموÙّرة " "أيضا بواسطة %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "عطّل %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "لا تمكّن %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "الملحق %(plugin_conflict)s يتداخل مع %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s ØªÙˆÙØ± الميزة %(feature)s المطلوبة من الملحقات " "التالية:\n" " %(plugin_list)s" msgid "Enable these plugins" msgstr "مكّن هذه Ø§Ù„Ø¥Ø¶Ø§ÙØ§Øª" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s بحاجة إلى Ø§Ù„Ø¥Ø¶Ø§ÙØ© %(require)s." #, python-format msgid "Enable %(require)s" msgstr "مكّن %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s ØªÙˆÙØ± الميزة %(feature)s المطلوبة من الملحقات %" "(plugin_list)s." msgid "Disable these plugins" msgstr "عطّل هذه Ø§Ù„Ø¥Ø¶Ø§ÙØ§Øª" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s لا تعطّل " #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s مطلوبة للملحقات %(plugin_list)s." msgid "General" msgstr "عام" msgid "Accessibility" msgstr "الإتاحة" msgid "Desktop" msgstr "سطح المكتب" msgid "Extras" msgstr "زواىٔد" msgid "Window Management" msgstr "إدارة Ø§Ù„Ù†ÙˆÙØ°Ø©" msgid "Effects" msgstr "مؤثرات" msgid "Image Loading" msgstr "تحميل الصورة" msgid "Utility" msgstr "ÙØ§Ù‰Ù”دة" msgid "All" msgstr "الكل" msgid "Uncategorized" msgstr "غير مصنّÙ" msgid "N/A" msgstr "غير Ù…ØªÙˆÙØ±" msgid "Reset setting to the default value" msgstr "أعد الضبط إلى القيمة المبدئية" msgid "Edit" msgstr "حرّر" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "إعادات اللوائح المتعددة. تستطيع النقر مزدوجا على ص٠لتحرير قيمه." #, python-format msgid "Edit %s" msgstr "حرّر %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ليس اختصارا صحيحا" msgid "Disabled" msgstr "معطّل" msgid "Enabled" msgstr "ممكّن" msgid "Grab key combination" msgstr "اقبض تجميعة Ø§Ù„Ù…ÙØ§ØªÙŠØ­" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ليس زرا صحيحا" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "استخدام الزر1 بدون مغيرات يمكن أن يحجب أي نقر أيسر وبالتالي تعطيب تشكيلاتك. " "أتريد حقا تحديد الزر \"%s\" كالزر1ØŸ" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" ليس قناع Ø­Ø§ÙØ© صحيح" msgid "None" msgstr "لا شيء" msgid "CompizConfig Settings Manager" msgstr "مدير إعدادات CompizConfig" msgid "Plugin" msgstr "الملحق" msgid "Please press the new key combination" msgstr "من ÙØ¶Ù„Ùƒ أدخل تجميعة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ الجديدة" msgid "Window Title" msgstr "عنوان Ø§Ù„Ù†Ø§ÙØ°Ø©" msgid "Window Role" msgstr "دور Ø§Ù„Ù†Ø§ÙØ°Ø©" msgid "Window Name" msgstr "اسم Ø§Ù„Ù†Ø§ÙØ°Ø©" msgid "Window Class" msgstr "ÙØ¦Ø© Ø§Ù„Ù†Ø§ÙØ°Ø©" msgid "Window Type" msgstr "نوع Ø§Ù„Ù†Ø§ÙØ°Ø©" msgid "Window ID" msgstr "هوية Ø§Ù„Ù†Ø§ÙØ°Ø©" msgid "And" msgstr "Ùˆ" msgid "Or" msgstr "أو" msgid "Edit match" msgstr "حرّر المتطابقات" #. Type msgid "Type" msgstr "النوع" #. Value msgid "Value" msgstr "القيمة" msgid "Grab" msgstr "اقبض" #. Relation msgid "Relation" msgstr "العلاقة" #. Invert msgid "Invert" msgstr "اقلب" msgid "Browse..." msgstr "تصÙّح.." msgid "Images" msgstr "صور" msgid "File" msgstr "ملÙ" msgid "Open directory..." msgstr "Ø§ÙØªØ­ دليلا...." msgid "Open file..." msgstr "Ø§ÙØªØ­ Ù…Ù„ÙØ§..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "هذا مدير إعدادات لنظام تشكيل CompizConfig." msgid "translator-credits" msgstr "" "أسامة خالد \n" "وآخرون" msgid "An error has occured" msgstr "حدث خطأ" msgid "Warning" msgstr "إنذار" #, python-format msgid "Enable %s" msgstr "مكّن %s" msgid "Filter" msgstr "مرشّح" #, python-format msgid "Search %s Plugin Options" msgstr "ابحث ÙÙŠ خيارات الملحق %s" msgid "Use This Plugin" msgstr "استخدم هذه Ø§Ù„Ø¥Ø¶Ø§ÙØ©" msgid "Search Compiz Core Options" msgstr "ابحث ÙÙŠ خيارات نواة Compiz." msgid "Error" msgstr "خطأ" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "أدخل مرشّحا.\n" "انقر صورة لوحة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ لقبض Ù…ÙØªØ§Ø­ تبحث عنه." msgid "Search in..." msgstr "ابحث ÙÙŠ.." #. Options msgid "Short description and name" msgstr "وص٠قصير واسم" msgid "Long description" msgstr "وص٠طويل" msgid "Settings value" msgstr "قيمة الإعدادات" msgid "Group" msgstr "مجموعة" msgid "Subgroup" msgstr "مجموعة ÙØ±Ø¹ÙŠØ©" #. Notebook msgid "Settings" msgstr "إعدادات" msgid "Loading Advanced Search" msgstr "تحميل البحث المتقدم" msgid "Add a New Profile" msgstr "Ø£Ø¶Ù Ù…Ù„ÙØ§ جديدا" msgid "Remove This Profile" msgstr "أزل هذا الملÙ" msgid "Default" msgstr "المبدئي" msgid "Profile" msgstr "الملÙ" msgid "Import" msgstr "استورد" msgid "Import a CompizConfig Profile" msgstr "استورد مل٠CompizConfig" msgid "Import as..." msgstr "استورد كـ..." msgid "Import a CompizConfig Profile as a new profile" msgstr "استورد مل٠CompizConfig كمل٠جديد" msgid "Export" msgstr "صدّر" msgid "Export your CompizConfig Profile" msgstr "صدّر تشكيل CompizConfig المستخدم " msgid "Reset to defaults" msgstr "أعد الضبط إلى المبدئيات" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "أعد ضبط مل٠CompizConfig إلى المبدئيات العمومية" msgid "Backend" msgstr "الخلÙية" msgid "Integration" msgstr "دمج" msgid "Enable integration into the desktop environment" msgstr "مكّن الدمج إلى بيىٔة المكتب" msgid "Profiles (*.profile)" msgstr "Ù…Ù„ÙØ§Øª (*.profile)" msgid "All files" msgstr "كل Ø§Ù„Ù…Ù„ÙØ§Øª" msgid "Save file.." msgstr "Ø§Ø­ÙØ¸ الملÙ..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "أتريد تخطي قيم الخيارات المبدئية أثناء تصدير ملÙك؟" msgid "Open file.." msgstr "Ø§ÙØªØ­ Ù…Ù„ÙØ§.." msgid "Enter a profile name" msgstr "أدخل اسم ملÙ" msgid "Please enter a name for the new profile:" msgstr "من ÙØ¶Ù„Ùƒ أدخل اسما للمل٠الجديد:" msgid "Backend not found." msgstr "لم توجد الخلÙية." #. Auto sort msgid "Automatic plugin sorting" msgstr "ترتيب الملحقات تلقائيا" msgid "Disabled Plugins" msgstr "Ø§Ù„Ø¥Ø¶Ø§ÙØ§Øª المعطلة" msgid "Enabled Plugins" msgstr "الملحقات الممكنة" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "أتريد حقا تعطيل Ø§Ù„ÙØ±Ø² التلقائي للملحقات؟ هذا من شأنه أيضا تعطيل التعامل مع " "التعارضات. يتعين عليك ÙØ¹Ù„ ذلك Ùقط إذا كنت تعر٠ما أنت بصدد القيام به." msgid "Add plugin" msgstr "أض٠ملحقا" msgid "Plugin name:" msgstr "اسم الملحق:" msgid "Insert plugin name" msgstr "أدخل اسم الملحق" msgid "Preferences" msgstr "ØªÙØ¶ÙŠÙ„ات" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "اضبط الخلÙية ÙˆØ§Ù„Ù…Ù„ÙØŒ والإعدادات الداخلية الأخرى المستخدمة بواسطة تظام " "إعدادات Compiz." msgid "About" msgstr "عن" msgid "About CCSM..." msgstr "عن CCSM..." msgid "Profile & Backend" msgstr "المل٠والمنتهى الخلÙÙŠ" msgid "Plugin List" msgstr "قائمة الملحقات" msgid "Filter your Plugin list" msgstr "رشّح قائمة ملحقاتك" #, python-format msgid "Screen %i" msgstr "الشاشة %i" msgid "Screen" msgstr "شاشة" msgid "Category" msgstr "تصنيÙ" msgid "Advanced Search" msgstr "بحث متقدّم" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "لا وجود لتطابق. \n" "\n" " Your filter \"%s\" لا تطابق مع ايّ من الموجودات." msgid "Configure Compiz with CompizConfig" msgstr "شكّل Compiz بواسطة CompizConfig" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/fi.po0000644000015301777760000003103512321343002022464 0ustar pbusernogroup00000000000000# ccsm fi translation. # Copyright (C) 2008 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Birunthan Mohanathas . # Ilkka Tuohela , 2008. # Timo Jyrinki , 2008. # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-10-24 15:43+0200\n" "Last-Translator: Timo Jyrinki \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Uusi sidoksen %(binding)s arvo lisäosan %(plugin)s toiminnossa %" "(action)s on ristiriidassa lisäosan %(plugin_conflict)s toiminnon " "%(action_conflict)s kanssa.\n" "Haluatko poistaa käytöstä toiminnon %(action_conflict)s lisäosassa " "%(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Poista %(action_conflict)s käytöstä" #, python-format msgid "Don't set %(action)s" msgstr "Älä aseta toimintoa %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Aseta %(action)s joka tapauksessa" msgid "key" msgstr "näppäin" msgid "button" msgstr "painike" msgid "edge" msgstr "reuna" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Yrität käyttää toimintoa %(feature)s, jota yksikään lisäosa ei " "tarjoa.\n" "Haluatko silti käyttää tätä toimintoa?" #, python-format msgid "Use %(feature)s" msgstr "Käytä %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Älä käytä %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Yrität käyttää toimintoa %(feature)s, jonka tarjoaa lisäosa %" "(plugin)s.\n" "Tämä lisäosa ei ole käytössä.\n" "Haluatko ottaa lisäosan %(plugin)s käyttöön, jotta voit käyttää tätä " "toimintoa?" #, python-format msgid "Enable %(plugin)s" msgstr "Ota %(plugin)s käyttöön" #, python-format msgid "Don't enable %(feature)s" msgstr "Älä ota %(feature)s käyttöön" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Jotkin %(plugin)s-liitännäisen %(bindings)s-riippuvuudet ovat " "ristiriidassa muiden liitännäisten kanssa. Haluatko selvittää nämä " "ristiriidat?" msgid "Resolve conflicts" msgstr "Selvitä ristiriidat" msgid "Ignore conflicts" msgstr "Jätä ristiriidat huomiotta" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Lisäosa %(plugin_conflict)s tarjoaa toiminnon %(feature)s, " "jonka tarjoaa myös lisäosa %(plugin)s." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Poista %(plugin_conflict)s käytöstä" #, python-format msgid "Don't enable %(plugin)s" msgstr "Älä ota %(plugin)s käyttöön" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Lisäosa %(plugin_conflict)s on ristiriidassa lisäosan %(plugin)s kanssa." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s vaatii toiminnon %(feature)s, jonka tarjoavat " "seuraavat lisäosat:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Ota nämä lisäosat käyttöön" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s vaatii lisäosan %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Ota %(require)s käyttöön" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s tarjoaa %(feature)s ominaisuuden, jota seuraavat " "lisäosat tarvitsevat: %(plugin_list)s." msgid "Disable these plugins" msgstr "Poista nämä lisäosat käytöstä" #, python-format msgid "Don't disable %(plugin)s" msgstr "Älä poista lisäosaa %(plugin)s käytöstä" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "Lisäosa %(plugin)s vaativat seuraavat lisäosat:%(plugin_list)s." msgid "General" msgstr "Yleiset" msgid "Accessibility" msgstr "Esteettömyys" msgid "Desktop" msgstr "Työpöytä" msgid "Extras" msgstr "Ekstrat" msgid "Window Management" msgstr "Ikkunoiden hallinta" msgid "Effects" msgstr "Efektit" msgid "Image Loading" msgstr "Kuvien lataus" msgid "Utility" msgstr "Apuohjelmat" msgid "All" msgstr "Kaikki" msgid "Uncategorized" msgstr "Luokittelematon" msgid "N/A" msgstr "–" msgid "Reset setting to the default value" msgstr "Palauta asetukset oletusarvoihin" msgid "Edit" msgstr "Muokkaa" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "Moniriviset asetukset. Muokkaa arvoja kaksoisnapsauttamalla riviä." #, python-format msgid "Edit %s" msgstr "Muokkaa %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ei ole kelvollinen pikavalinta" msgid "Disabled" msgstr "Ei käytössä" msgid "Enabled" msgstr "Käytössä" msgid "Grab key combination" msgstr "Kaappaa näppäinyhdistelmä" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ei ole kelvollinen nappi" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Ensijaisen painikkeen käyttö ilman lisävalitsimia voi estää kaikki " "ensijaisen painikkeen painallukset ja siten tehdä tietokoneen " "käyttökelvottomaksi. Haluatko varmasti liittää painikkeen \"%s\" " "ensisijaiseksi painikkeeksi?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" on kelvoton reunamaski" msgid "None" msgstr "Ei mitään" msgid "CompizConfig Settings Manager" msgstr "Compiz-asetusten hallinta" msgid "Plugin" msgstr "Lisäosa" msgid "Please press the new key combination" msgstr "Anna uusi näppäinyhdistelmä" msgid "Window Title" msgstr "Ikkunan otsikko" msgid "Window Role" msgstr "Ikkunan rooli" msgid "Window Name" msgstr "Ikkunan nimi" msgid "Window Class" msgstr "Ikkunan luokka" msgid "Window Type" msgstr "Ikkunan tyyppi" msgid "Window ID" msgstr "Ikkunan ID" msgid "And" msgstr "ja" msgid "Or" msgstr "tai" msgid "Edit match" msgstr "Muokkaa osumaa" #. Type msgid "Type" msgstr "Tyyppi" #. Value msgid "Value" msgstr "Arvo" msgid "Grab" msgstr "Tartu" #. Relation msgid "Relation" msgstr "Suhde" #. Invert msgid "Invert" msgstr "Käännä" msgid "Browse..." msgstr "Selaa..." msgid "Images" msgstr "Kuvat" msgid "File" msgstr "Tiedosto" msgid "Open directory..." msgstr "Avaa hakemisto..." msgid "Open file..." msgstr "Avaa tiedosto..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Tämä on Compiz-asetusten hallintaohjelma" msgid "translator-credits" msgstr "" "Ilkka Tuohela, 2008\n" "Timo Jyrinki, 2008\n" "\n" "http://gnome.fi/" msgid "An error has occured" msgstr "Tapahtui virhe" msgid "Warning" msgstr "Varoitus" #, python-format msgid "Enable %s" msgstr "Käytä %s" msgid "Filter" msgstr "Suodata" #, python-format msgid "Search %s Plugin Options" msgstr "Etsi lisäosavalintaa %s" msgid "Use This Plugin" msgstr "Käytä tätä lisäosaa" msgid "Search Compiz Core Options" msgstr "Etsi Compiz Core -asetuksista" msgid "Error" msgstr "Virhe" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Syötä suodatin.\n" "Napsauta kuvaa näppäimistöstä valitaksesi etsittävän näppäimen." msgid "Search in..." msgstr "Etsi kohteesta..." #. Options msgid "Short description and name" msgstr "Lyhyt kuvaus ja nimi" msgid "Long description" msgstr "Pitkä kuvaus" msgid "Settings value" msgstr "Asetusten arvo" msgid "Group" msgstr "Ryhmä" msgid "Subgroup" msgstr "Alaryhmä" #. Notebook msgid "Settings" msgstr "Asetukset" msgid "Loading Advanced Search" msgstr "Ladataan tarkennettua hakua" msgid "Add a New Profile" msgstr "Lisää uusi profiili" msgid "Remove This Profile" msgstr "Poista tämä profiili" msgid "Default" msgstr "Oletus" msgid "Profile" msgstr "Profiili" msgid "Import" msgstr "Tuo" msgid "Import a CompizConfig Profile" msgstr "Tuo Compizin asetusprofiili" msgid "Import as..." msgstr "Tuo nimellä..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Tuo Compizin asetusprofiili uutena profiilina" msgid "Export" msgstr "Vie" msgid "Export your CompizConfig Profile" msgstr "Vie Compizin asetusprofiili" msgid "Reset to defaults" msgstr "Palauta oletusasetukset" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Palauta Compizin asetusprofiilin oletusasetukset" msgid "Backend" msgstr "Taustajärjestelmä" msgid "Integration" msgstr "Integrointi" msgid "Enable integration into the desktop environment" msgstr "Ota työpöytäympäristöön sulautuminen käyttöön" msgid "Profiles (*.profile)" msgstr "Profiilit (*.profile)" msgid "All files" msgstr "Kaikki tiedostot" msgid "Save file.." msgstr "Tallenna tiedosto..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Haluatko ohittaa oletusarvoiset valinnat profiilia vietäessä?" msgid "Open file.." msgstr "Avaa tiedosto..." msgid "Enter a profile name" msgstr "Anna profiilin nimi" msgid "Please enter a name for the new profile:" msgstr "Anna uuden profiilin nimi:" msgid "Backend not found." msgstr "Taustajärjestelmää ei löytynyt." #. Auto sort msgid "Automatic plugin sorting" msgstr "Järjestä lisäosat automaattisesti" msgid "Disabled Plugins" msgstr "Poissa käytöstä olevat lisäosat" msgid "Enabled Plugins" msgstr "Käytössä olevat lisäosat" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Haluatko todella poistaa lisäosien automaattisen järjestämisen käytöstä? " "Tämä poistaa myös ristiriitojen käsittelyn käytöstä. Älä tee tätä, jos et " "tiedä varmasti mitä teet." msgid "Add plugin" msgstr "Lisää lisäosa" msgid "Plugin name:" msgstr "Lisäosan nimi:" msgid "Insert plugin name" msgstr "Anna lisäosan nimi" msgid "Preferences" msgstr "Asetukset" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Määrittele käytettävä taustajärjestelmä, profiili ja muita Compizin " "asetusjärjestelmän käyttämiä sisäisiä asetuksia." msgid "About" msgstr "Tietoja" msgid "About CCSM..." msgstr "Tietoja CCSM:sta..." msgid "Profile & Backend" msgstr "Profiili ja taustajärjestelmä" msgid "Plugin List" msgstr "Luettelo lisäosista" msgid "Filter your Plugin list" msgstr "Suodata lisäosaluetteloa" #, python-format msgid "Screen %i" msgstr "Näyttö %i" msgid "Screen" msgstr "Näyttö" msgid "Category" msgstr "Luokka" msgid "Advanced Search" msgstr "Tarkennettu haku" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Ei hakutuloksia \n" "\n" "Suodattimesi %s ei vastaa mitään kohtia." msgid "Configure Compiz with CompizConfig" msgstr "Compiz-asetusten tekeminen CompizConfigilla" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Käsitellään mahdollisia ristiriitoja, odota hetki" #~ msgid "Value (%s)" #~ msgstr "Arvo (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Arvo (%(value)s) %(setting)slle" #~ msgid "Actions" #~ msgstr "Toimenpiteet" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/eu.po0000644000015301777760000003033212321343002022476 0ustar pbusernogroup00000000000000# translation of ccsm.po to Euskara # Copyright (C) 2007 compiz-fusion # This file is distributed under the same license as the PACKAGE package. # # Ander Elortondo , 2007. msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-09-01 11:41+0200\n" "Last-Translator: Ander Elortondo \n" "Language-Team: Euskara \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(plugin)s plugineko %(action)s ekintzaren %(binding)s lotura " "balio berriak gatazka sortzen du, %(plugin_conflict)s pluginaren %" "(action_conflict)s ekintzarekin. \n" "%(plugin_conflict)s pluginaren %(action_conflict)s ekintza " "ezgaitzerik nahi?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Ezgaitu %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Ez aukeratu %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Aukeratu %(action)s" msgid "key" msgstr "Tekla" msgid "button" msgstr "Botoia" msgid "edge" msgstr "Ertza" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "%(feature)s ezaugarria erabiltzekotan zaude. Hau Ez ez da " "egokia edozein pluginekin.\n" "hala ere ezaugarri hau erabili nahi duzu?" #, python-format msgid "Use %(feature)s" msgstr "Erabili %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Ez erabili %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "%(plugin)s plugineko %(feature)s ezaugarria erabili nahi " "duzu.\n" "Plugin hau orain ezgaitua dago.\n" "%(plugin)s gaitu nahi duzu, ezaugarria erabilgarri izateko?" #, python-format msgid "Enable %(plugin)s" msgstr "Gaitu %(plugin)s " #, python-format msgid "Don't enable %(feature)s" msgstr "Ez gaitu %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" " %(plugin)s plugineko hainbat laster-tekla %(bindings)s beste plugin " "batzuekoekin gatazkan daude. Gatazka hauek konpondu nahi dituzu?" msgid "Resolve conflicts" msgstr "Konpondu gatazkak" msgid "Ignore conflicts" msgstr "Ez ikusi gatazkak" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Plugina honek %(plugin_conflict)s beste %(plugin)s pluginak " "ere ematen duen %(feature)s ezaugarria ematen du" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Ezgaitu %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Ez gaitu %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "%(plugin_conflict)s pluginak gatazkan dago %(plugin)s " "pluginarekin." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s pluginak %(feature)s ezaugarria beharrezko du, " "ondorengo pluginek emana:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Gaitu plugin hauek" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "%(plugin)s pluginek beste hau beharrezko dute: %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Gaitu %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s pluginak %(feature)s ezaugarria ematen du, " "ondorengo pluginek beharrezko dutena: %(plugin_list)s." msgid "Disable these plugins" msgstr "Ezgaitu plugin hauek" #, python-format msgid "Don't disable %(plugin)s" msgstr "Ez ezgaitu %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s beharrezkoa da ondorengo plugnientzat: %(plugin_list)s." msgid "General" msgstr "Orokorra" msgid "Accessibility" msgstr "Erabilerraztasuna" msgid "Desktop" msgstr "Mahaigaina" msgid "Extras" msgstr "Extrak" msgid "Window Management" msgstr "Leiho kudeaketa" msgid "Effects" msgstr "Efektuak" msgid "Image Loading" msgstr "Irudia kargatzen" msgid "Utility" msgstr "Utilitate" msgid "All" msgstr "Denak" msgid "Uncategorized" msgstr "Kategori gabekoa" msgid "N/A" msgstr "E/E" msgid "Reset setting to the default value" msgstr "Lehenetsitako balioetan jarri ezarpenak" msgid "Edit" msgstr "Editatu" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Lerro anitzeko ezarpenak. Baloreak editatzeko klik bikoitza egin lerroan." #, python-format msgid "Edit %s" msgstr "Editatu %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\"ez da baliozko laster-tekla" msgid "Disabled" msgstr "Ezgaitua" msgid "Enabled" msgstr "Gaitua" msgid "Grab key combination" msgstr "Tekla konbinazioa grabatu" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ez da baliozko botoia" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "1botoia aldaketa gabe erabiltzeak ezkerreko edozein kliki aurrea hartu " "diezaioke eta ezarpenak hautsi. Ziur \"%s\" botoia 1botoiaz ezarri nahi " "duzula?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" eza da maskara ertz baliokoa" msgid "None" msgstr "Ezer ez" msgid "CompizConfig Settings Manager" msgstr "Compiz ezarpen kudeatzailea" msgid "Plugin" msgstr "Plugin " msgid "Please press the new key combination" msgstr "Mesedez sakatu tekla konbinaketa berria" msgid "Window Title" msgstr "Leiho Izenburua" msgid "Window Role" msgstr "Leiho-rola" msgid "Window Name" msgstr "Leiho izena" msgid "Window Class" msgstr "Leiho klase" msgid "Window Type" msgstr "Leiho mota" msgid "Window ID" msgstr "Leiho ID" msgid "And" msgstr "eta" msgid "Or" msgstr "edo" msgid "Edit match" msgstr "Editatu parekatzea" #. Type msgid "Type" msgstr "Mota" #. Value msgid "Value" msgstr "Balioa" msgid "Grab" msgstr "Eutsi" #. Relation msgid "Relation" msgstr "Relazioa" #. Invert msgid "Invert" msgstr "Alderantzikatu" msgid "Browse..." msgstr "Arakatu..." msgid "Images" msgstr "Irudiak" msgid "File" msgstr "Fitxategia" msgid "Open directory..." msgstr "Zabaldu karpeta..." msgid "Open file..." msgstr "Zabaldu fitxategia..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Hau ezarpen kudeatzailea da, Compiz sistemaren ezarpenerako." msgid "translator-credits" msgstr "Itzultzaile kredituak" msgid "An error has occured" msgstr "Errore bat eman da" msgid "Warning" msgstr "Kontuz" #, python-format msgid "Enable %s" msgstr "Gaitu %s" msgid "Filter" msgstr "Iragazki" #, python-format msgid "Search %s Plugin Options" msgstr "Bilatu %s plugin aukerak" msgid "Use This Plugin" msgstr "Plugin hau erabili" msgid "Search Compiz Core Options" msgstr "Compiz core aukerak bilatu" msgid "Error" msgstr "Errorea" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Sartu iragazkia.\n" "Click the keyboard image to grab a key for which to search." msgid "Search in..." msgstr "Bilatu..." #. Options msgid "Short description and name" msgstr "Izena eta deskribapen motza" msgid "Long description" msgstr "Deskribapen luzea" msgid "Settings value" msgstr "Ezarpen balioak" msgid "Group" msgstr "Taldea" msgid "Subgroup" msgstr "Azpitaldea" #. Notebook msgid "Settings" msgstr "Ezarpenak" msgid "Loading Advanced Search" msgstr "Bilaketa aurreratua kargatzen" msgid "Add a New Profile" msgstr "Profil berria gehitu" msgid "Remove This Profile" msgstr "Ezabatu profil hau" msgid "Default" msgstr "Lehenetsia" msgid "Profile" msgstr "Profila" msgid "Import" msgstr "Inportatu" msgid "Import a CompizConfig Profile" msgstr "Inportatu Compiz ezarpen profila" msgid "Import as..." msgstr "Inportatu honela..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Inportatu Compiz ezarpen profila, profil berrira" msgid "Export" msgstr "Esportatu" msgid "Export your CompizConfig Profile" msgstr "Esportatu zure Compiz ezarpen profila" msgid "Reset to defaults" msgstr "Ezarri lehenetsiak" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Ezarrri zure Compìz ezarpen profila, lehenetsi orokorretara" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integrazioa" msgid "Enable integration into the desktop environment" msgstr "Gaitu integrazioa mahagain ingurunean" msgid "Profiles (*.profile)" msgstr "Profilak (*.profile)" msgid "All files" msgstr "Fitxategi guztiak" msgid "Save file.." msgstr "Gorde fitxategia.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Zure porfila esportatzean salto egin nahi dituzu aukera lehenetsien balioak?" msgid "Open file.." msgstr "Ireki fitxategia.." msgid "Enter a profile name" msgstr "Sartu profile izena" msgid "Please enter a name for the new profile:" msgstr "Mesedez sartu izena profil berriari:" msgid "Backend not found." msgstr "Backend not found." #. Auto sort msgid "Automatic plugin sorting" msgstr "Pluginak automatikoki antolatu" msgid "Disabled Plugins" msgstr "Plugin ezgaituak" msgid "Enabled Plugins" msgstr "Plugin gaituak" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Ziur pluginak automatikoki ordenatzea ezgaitu nahi duzula? honek konfliktu " "kuduatzailea ere ezgaituko du. Hau egiten ari zarenarekin ziur bazaude " "bakarrik egin beharko zenuke." msgid "Add plugin" msgstr "Gehitu plugina" msgid "Plugin name:" msgstr "Plugin izena:" msgid "Insert plugin name" msgstr "Sartu plugin izena" msgid "Preferences" msgstr "Aukerak" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Backend, profil eta beste barne ezarpen batzuen konfigurazioa Copiz ezarpen " "sistema erabiliz." msgid "About" msgstr "Honi buruz" msgid "About CCSM..." msgstr "CCSMri buruz..." msgid "Profile & Backend" msgstr "Profil & Backend" msgid "Plugin List" msgstr "Plugin zerrenda" msgid "Filter your Plugin list" msgstr "Iragazi zure plugin zerrenda" #, python-format msgid "Screen %i" msgstr "%i pantaila" msgid "Screen" msgstr "Pantaila" msgid "Category" msgstr "Kategoria" msgid "Advanced Search" msgstr "Bilaketa aureratua" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" " ez du aurkitu \n" "\n" "Zure \"%s\" iragazkiak ez du elementurik aurkitu " msgid "Configure Compiz with CompizConfig" msgstr "Konfiguratu Compiz CompizConfig erabiliz" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Gatazkak ote dauden aztertzen. Mesedez itxaron" #~ msgid "Value (%s)" #~ msgstr "Balioa (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s-dako balioa (%(value)s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "%s ezohiko lista mota %s -entzat" #~ msgid "Actions" #~ msgstr "Ekintzak" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/POTFILES.in0000644000015301777760000000022112321343002023274 0ustar pbusernogroup00000000000000ccm/Conflicts.py ccm/Constants.py.in ccm/Settings.py ccm/Window.py ccm/Widgets.py ccm/Pages.py ccm/Utils.py ccm/__init__.py ccsm ccsm.desktop.in compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/sk.po0000644000015301777760000003216012321343002022503 0ustar pbusernogroup00000000000000# Slovak translation of ccsm. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # PEPINO , 2007. # Ivan Masár , 2008. # msgid "" msgstr "" "Project-Id-Version: ccsm 0.5.2\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-12-14 10:57+0100\n" "Last-Translator: Brusnica P \n" "Language-Team: SLOVAK \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Nová hodnota pre %(binding)s väzby na operáciu %(action)s v zásuvnom " "module %(plugin)s je v konflikte s operáciou %(action_conflict)s zásuvného modulu %(plugin_conflict)s.\n" "Želáte si vypnúť %(action_conflict)s v zásuvnom module %" "(plugin_conflict)s plugin?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Vypnúť %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "NenastavovaÅ¥ %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "NastaviÅ¥ %(action)s napriek tomu" msgid "key" msgstr "kľúÄ" msgid "button" msgstr "tlaÄidlo" msgid "edge" msgstr "okraj" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Práve sa pokúšate použiÅ¥ funkciu %(feature)s ktorú neposkytuje " "žiadny zásuvný modul.\n" "Želáte si napriek tomu zapnúť túto funkciu?" #, python-format msgid "Use %(feature)s" msgstr "PoužiÅ¥ %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "NepoužiÅ¥ %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Práve sa pokúšate použiÅ¥ funkciu %(feature)s ktorú poskytuje %" "(plugin)s.\n" "Tento zásuvný modul je momentálne vypnutý.\n" "Želáte si zapnúť %(plugin)s aby bola funkcia k dispozícii?" #, python-format msgid "Enable %(plugin)s" msgstr "Zapnúť %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "NezapínaÅ¥ %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Niektoré %(bindings)s väzby Pluginu %(plugin)s kolidujú s inými " "pluginmi. Prajete si vyrieÅ¡iÅ¥ tieto konflikty?" msgid "Resolve conflicts" msgstr "VyrieÅ¡iÅ¥ konflikty" msgid "Ignore conflicts" msgstr "IgnorovaÅ¥ konflikty" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Zásuvný modul %(plugin_conflict)s poskytuje funkcionalitu %" "(feature)s, ktorú poskytuje aj %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Vypnúť %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "NezapínaÅ¥ %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Zásuvný modul %(plugin_conflict)s je v konflikte s %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s vyžaduje funkcionalitu %(feature)s, ktorú posktujú " "nasledovné zásuvné moduly:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Zapnúť tieto zásuvné moduly" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s vyžaduje zásuvný modul %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Zapnúť %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s poskytuje funkcionalitu %(feature)s, ktorú vyžaduje " "zásuvný modul %(plugin_list)s." msgid "Disable these plugins" msgstr "Vypnúť tieto zásuvné moduly" #, python-format msgid "Don't disable %(plugin)s" msgstr "Nevypínajte %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s vyžadujú zásuvné moduly %(plugin_list)s." msgid "General" msgstr "VÅ¡eobecné" msgid "Accessibility" msgstr "PrístupnosÅ¥" msgid "Desktop" msgstr "Plocha" msgid "Extras" msgstr "Extra" msgid "Window Management" msgstr "Správa okien" msgid "Effects" msgstr "Efekty" msgid "Image Loading" msgstr "NaÄítavanie obrázka" msgid "Utility" msgstr "Nástroje" msgid "All" msgstr "VÅ¡etky" msgid "Uncategorized" msgstr "Nezaradené" msgid "N/A" msgstr "N/D" msgid "Reset setting to the default value" msgstr "VrátiÅ¥ nastavenia na Å¡atndardné hodnoty" msgid "Edit" msgstr "UpraviÅ¥" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Viac-zoznamové nastavenia. Hodnoty môžete upraviÅ¥ potom ako dvakrát kliknete " "na riadok." #, python-format msgid "Edit %s" msgstr "UpraviÅ¥ %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" nie je platná skratka" msgid "Disabled" msgstr "Vypnutý" msgid "Enabled" msgstr "Zapnutý" msgid "Grab key combination" msgstr "Kombinácia kláves zachytenia" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" nie je platné tlaÄidlo" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Použitie TlaÄidla1 bez modifikátorov môže zabrániÅ¥ akémukoľvek kliknutiu " "ľavým tlaÄidlom a tak pokaziÅ¥ vaÅ¡u konfiguráciu. SkutoÄne si želáte nastaviÅ¥ " "tlaÄidlo \"%s\" na TalÄidlo1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" nie je platná maska hrany" msgid "None" msgstr "Žiadne" msgid "CompizConfig Settings Manager" msgstr "Správca nastavení CompizConfig" msgid "Plugin" msgstr "Zásuvný modul" msgid "Please press the new key combination" msgstr "Prosím stlaÄte novú kombináciu kláves" msgid "Window Title" msgstr "Nadpis okna" msgid "Window Role" msgstr "Rola okna" msgid "Window Name" msgstr "Názov okna" msgid "Window Class" msgstr "Trieda okna" msgid "Window Type" msgstr "Typ okna" msgid "Window ID" msgstr "ID okna" msgid "And" msgstr "Aj" msgid "Or" msgstr "Alebo" msgid "Edit match" msgstr "UpraviÅ¥ zhodu" #. Type msgid "Type" msgstr "Typ" #. Value msgid "Value" msgstr "Hodnota" msgid "Grab" msgstr "ChytiÅ¥" #. Relation msgid "Relation" msgstr "VzÅ¥ah" #. Invert msgid "Invert" msgstr "InvertovaÅ¥" msgid "Browse..." msgstr "PrechádzaÅ¥..." msgid "Images" msgstr "Obrázky" msgid "File" msgstr "Súbor" msgid "Open directory..." msgstr "OtvoriÅ¥ adresár..." msgid "Open file..." msgstr "OtvoriÅ¥ súbor..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Toto je správca nastavení konfiguraÄného systému CompizConfig." msgid "translator-credits" msgstr "" "prekladatelia-zásluhy ivan masár < helix84 at centrum.sk < , 2008, " "pepino < sk.cfteam at gmail.com > , 2007" msgid "An error has occured" msgstr "Vyskytla sa chyba" msgid "Warning" msgstr "Upozornenie" #, python-format msgid "Enable %s" msgstr "Zapnúť %s" msgid "Filter" msgstr "Sito" #, python-format msgid "Search %s Plugin Options" msgstr "HÅ¥adaÅ¥ %s Možnosti zásuvného modulu" msgid "Use This Plugin" msgstr "PoužiÅ¥ tento zásuvný modul" msgid "Search Compiz Core Options" msgstr "HľadaÅ¥ Nastavenia Compiz Core" msgid "Error" msgstr "Chyba" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Zadajte filter.\n" "Kliknutím na obrázok klávesnice zachytíte kláves, ktorý sa má hľadaÅ¥." msgid "Search in..." msgstr "HľadaÅ¥ v..." #. Options msgid "Short description and name" msgstr "Krátky popis a názov" msgid "Long description" msgstr "Dlhý popis" msgid "Settings value" msgstr "Hodnoty nastavení" msgid "Group" msgstr "Skupina" msgid "Subgroup" msgstr "Podskupina" #. Notebook msgid "Settings" msgstr "Nastavenia" msgid "Loading Advanced Search" msgstr "NaÄítava sa rozšírené vyhľadávanie" msgid "Add a New Profile" msgstr "PridaÅ¥ nový profil" msgid "Remove This Profile" msgstr "OdstráňiÅ¥ tento profil" msgid "Default" msgstr "Å tandardné" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "ImportovaÅ¥" msgid "Import a CompizConfig Profile" msgstr "ImportovaÅ¥ CompizConfig Profil" msgid "Import as..." msgstr "ImportovaÅ¥ ako..." msgid "Import a CompizConfig Profile as a new profile" msgstr "ImportovaÅ¥ CompizConfig Profil ako nový profil" msgid "Export" msgstr "ExportovaÅ¥" msgid "Export your CompizConfig Profile" msgstr "ExportovaÅ¥ váš CompizConfig Profil" msgid "Reset to defaults" msgstr "VrátiÅ¥ Å¡tandardné hodnoty" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "PrestaviÅ¥ vaÅ¡e CompizConfig Profil na Å¡tandardné globálne hodnoty" msgid "Backend" msgstr "Na pozadí" msgid "Integration" msgstr "Integrácia" msgid "Enable integration into the desktop environment" msgstr "Zapnúť integráciu s pracovným prostredím" msgid "Profiles (*.profile)" msgstr "Profily (*.profile)" msgid "All files" msgstr "VÅ¡etky súbory" msgid "Save file.." msgstr "UložiÅ¥ súbor.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Prajete si preskoÄiÅ¥ Å¡tandardné hodnoty volieb pri exporte profilu?" msgid "Open file.." msgstr "OtvoriÅ¥ súbor.." msgid "Enter a profile name" msgstr "Zadajte názov profilu" msgid "Please enter a name for the new profile:" msgstr "Zadajte prosím názov nového profilu:" msgid "Backend not found." msgstr "Backend nebol nájdený." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatické triedenie zásuvných modulov" msgid "Disabled Plugins" msgstr "Vypnuté zásuvné moduly" msgid "Enabled Plugins" msgstr "Zapnuté zásuvné moduly" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Naozaj si želáte vypnúť automatické zoraÄovanie pluginov? Taktiež vypnete " "kontrolu konfliktov. Mali by ste to urobiÅ¥, iba ak ste si istí, Äo robíte." msgid "Add plugin" msgstr "PridaÅ¥ zásuvný modul" msgid "Plugin name:" msgstr "Názov zásuvného modulu:" msgid "Insert plugin name" msgstr "Zadajte názov zásuvného modulu" msgid "Preferences" msgstr "Nastavenia" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "KonfigurovaÅ¥ backend, profil a ostatné vnútorné nastavenia, ktoré používa " "Systém na konfiguráciu Compiz-u." msgid "About" msgstr "O aplikácii" msgid "About CCSM..." msgstr "O CCSM..." msgid "Profile & Backend" msgstr "Profil a backend" msgid "Plugin List" msgstr "Zoznam zásuvných modulov" msgid "Filter your Plugin list" msgstr "FiltrovaÅ¥ váš zoznam zásuvných modulov" #, python-format msgid "Screen %i" msgstr "Obrazovka %i" msgid "Screen" msgstr "Obrazovka" msgid "Category" msgstr "Kategória" msgid "Advanced Search" msgstr "Rozšírené vyhľadávanie" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Neboli nájdené žiadne zhody. \n" "\n" " Váš filter \"%s\" nesúhlasí so žiadnou položkou." msgid "Configure Compiz with CompizConfig" msgstr "Nastav Compiz s pomocou CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Prebieha hľadanie možných konfliktov, prosím poÄkajte" #~ msgid "Value (%s)" #~ msgstr "Hodnota (%s)" #, fuzzy #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Hodnota (%s) pre %s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Nezmenený zoznam typ %s pre %s" #~ msgid "Actions" #~ msgstr "Akcie" #~ msgid "Name" #~ msgstr "Meno" #~ msgid "Screen Edge" #~ msgstr "Kraj obrazovky" #~ msgid "Button %i" #~ msgstr "TlaÄidlo %i" #~ msgid "Edge Button" #~ msgstr "Krajné TlaÄidlo" #~ msgid "On System Bell" #~ msgstr "Na systémové upozornenie" #~ msgid "Edit Action: %s" #~ msgstr "Upravovacie Akcie: %s " #~ msgid "Screen Edges" #~ msgstr "Kraje Obrazovky" #~ msgid "Reset To Defaults" #~ msgstr "prestav na prednastavené" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/bn_IN.po0000644000015301777760000004134512321343002023060 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-03-15 16:15+0100\n" "Last-Translator: biswajyoti mahanta \n" "Language-Team: gist bengali team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(plugin)s পà§à¦²à¦¾à¦—ইন à¦à¦° %(action)s কাজের জনà§à¦¯ নতà§à¦¨ মান %(binding)s " "বà§à¦¯à¦¬à¦¹à§ƒà¦¤ হবে,\n" "কিনà§à¦¤à§ à¦à¦Ÿà¦¿ %(plugin_conflict)s পà§à¦²à¦¾à¦—ইন à¦à¦° %(action_conflict)s à¦à¦° " "সাথে সাংঘরà§à¦·à¦¿à¦•।\n" "আপনি কি %(plugin_conflict)s পà§à¦²à¦¾à¦—ইন à¦à¦° জনà§à¦¯ %(action_conflict)s " "কে নিষà§à¦•à§à¦°à§€à§Ÿ করতে চান?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s কে নিষà§à¦•à§à¦°à§€à§Ÿ করো" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s কে বহাল করো না" #, python-format msgid "Set %(action)s anyway" msgstr "যেভাবে হোক %(action)s কে বহাল করো" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "আপনি %(feature)s বà§à¦¯à¦¬â€Œà¦¹à¦¾à¦° ক‌রতে চাচà§à¦›à§‡à¦¨à¥¤à¦à¦Ÿà¦¿à¦° জনà§à¦¯ %(plugin)s " "পà§à¦°à§Ÿà§‹à¦œà¦¨.\n" "যা বরà§à¦¤à¦®à¦¾à¦¨à§‡ নিষà§à¦•à§à¦°à§€à§Ÿ আছে.\n" "আপনি কি %(plugin)s কে সকà§à¦°à¦¿à§Ÿ করতে চান?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s কে সকà§à¦°à¦¿à§Ÿ করো" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s কে সকà§à¦°à¦¿à§Ÿ করো না" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "আপনি %(feature)s বà§à¦¯à¦¬â€Œà¦¹à¦¾à¦° ক‌রতে চাচà§à¦›à§‡à¦¨à¥¤à¦à¦Ÿà¦¿à¦° জনà§à¦¯ %(plugin)s " "পà§à¦°à§Ÿà§‹à¦œà¦¨.\n" "যা বরà§à¦¤à¦®à¦¾à¦¨à§‡ নিষà§à¦•à§à¦°à§€à§Ÿ আছে.\n" "আপনি কি %(plugin)s কে সকà§à¦°à¦¿à§Ÿ করতে চান?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s কে সকà§à¦°à¦¿à§Ÿ করো" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s কে সকà§à¦°à¦¿à§Ÿ করো না" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s পà§à¦²à¦¾à¦—ইন %(feature)s কাজ করে। %(plugin)s à¦à¦•ই কাজ করে" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s কে নিষà§à¦•à§à¦°à§€à§Ÿ করো" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s কে সকà§à¦°à¦¿à§Ÿ করো না" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "%(plugin_conflict)s à¦à¦° সাথে %(plugin)s à¦à¦° সংঘরà§à¦· হচà§à¦›à§‡" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s à¦à¦° জনà§à¦¯ %(feature)s পà§à¦°à§Ÿà§‹à¦œà¦¨,যা পাওয়া যাবে নিচের " "পà§à¦²à¦¾à¦—ইন থেকে:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "à¦à¦‡ পà§à¦²à¦¾à¦—ইন গà§à¦²à§‹ সকà§à¦°à¦¿à§Ÿ করো" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s à¦à¦° জনà§à¦¯ %(require)s পà§à¦²à¦¾à¦—ইন দরকার হবে " #, python-format msgid "Enable %(require)s" msgstr "%(require)s কে সকà§à¦°à¦¿à§Ÿ করো" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin_list)s পà§à¦²à¦¾à¦—ইন à¦à¦° জনà§à¦¯ %(feature)s লাগবে, যা %" "(plugin)s দিয়ে করা হয়" msgid "Disable these plugins" msgstr "à¦à¦‡ পà§à¦²à¦¾à¦—ইন গà§à¦²à§‹ নিষà§à¦•à§à¦°à§€à§Ÿ করো" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s কে নিষà§à¦•à§à¦°à§€à§Ÿ করো না" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin_list)s à¦à¦° জনà§à¦¯ %(plugin)s দরকার হবে" msgid "General" msgstr "সাধারন" msgid "Accessibility" msgstr "পà§à¦°à¦¬à§‡à¦¶à¦¯à§‹à¦—à§à¦¯à¦¤à¦¾" msgid "Desktop" msgstr "ডেসà§à¦•টপ" msgid "Extras" msgstr "অতিরিকà§à¦¤" msgid "Window Management" msgstr "উইনà§à¦¡à§‹ পরিচালনা" msgid "Effects" msgstr "পà§à¦°à¦­à¦¾à¦¬à¦—à§à¦²à¦¿" msgid "Image Loading" msgstr "চিতà§à¦° লোড করছে" msgid "Utility" msgstr "উপযোগিতা" msgid "All" msgstr "সব" msgid "Uncategorized" msgstr "সাজানো হয়নি" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "মূল মানে ফিরে যাও" msgid "Edit" msgstr "সমà§à¦ªà¦¾à¦¦à¦¨à¦¾" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "অনেকà§à¦—à§à¦²à§‹ পছনà§à¦¦à¥¤à¦†à¦ªà¦¨à¦¾à¦° কোন পছনà§à¦¦ সমà§à¦ªà¦¾à¦¦à¦¨ করতে হলে ওই সারিতে কà§à¦²à¦¿à¦• করà§à¦¨" #, python-format msgid "Edit %s" msgstr "%s কে সমà§à¦ªà¦¾à¦¦à¦¨à¦¾" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" লিনà§à¦• টি ভà§à¦²" msgid "Disabled" msgstr "নিষà§à¦•à§à¦°à¦¿à§Ÿ" msgid "Enabled" msgstr "সকà§à¦°à¦¿à§Ÿ" msgid "Grab key combination" msgstr "চাবি ঠিক করà§à¦¨" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" বাটন হিসেবে গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "সাথে আর কোন কী ছাড়া বাম বাটন বà§à¦¯à¦¬à¦¹à¦¾à¦° করলে আপনি আর অনà§à¦¯ কাজে লেফট কà§à¦²à¦¿à¦• বà§à¦¯à¦¬à¦¹à¦¾à¦° " "করতে পারবেন নাআপনি কি আসলেই \"%s\" হিসেবে বাম বাটন বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে চান?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" কোনার মাসà§à¦• হিসেবে গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়" msgid "None" msgstr "কোনটাই না" msgid "CompizConfig Settings Manager" msgstr "কমপিজ কনফিগ বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦ªà¦•" #, fuzzy msgid "Plugin" msgstr "পà§à¦²à¦¾à¦—ইন à¦à¦° তালিকা" msgid "Please press the new key combination" msgstr "নতà§à¦¨ কীগà§à¦²à§‹ চাপà§à¦¨" msgid "Window Title" msgstr "উইনà§à¦¡à§‹ শীরà§à¦·" msgid "Window Role" msgstr "উইনà§à¦¡à§‹à¦° ভূমিকা" msgid "Window Name" msgstr "উইনà§à¦¡à§‹à¦° নাম" msgid "Window Class" msgstr "উইনà§à¦¡à§‹à¦° শà§à¦°à§‡à¦£à§€" msgid "Window Type" msgstr "উইনà§à¦¡à§‹à¦° ধরণ" msgid "Window ID" msgstr "উইনà§à¦¡à§‹à¦° ID" msgid "And" msgstr "à¦à¦¬à¦‚" msgid "Or" msgstr "অথবা" msgid "Edit match" msgstr "মিলগà§à¦²à¦¿ সমà§à¦ªà¦¾à¦¦à¦¨ করা" #. Type msgid "Type" msgstr "পà§à¦°à¦•ার" #. Value msgid "Value" msgstr "মান" msgid "Grab" msgstr "ধরা" #. Relation msgid "Relation" msgstr "সমà§à¦ªà¦°à§à¦•" #. Invert msgid "Invert" msgstr "উলà§à¦Ÿà¦¾à¦¨à§‹" #, fuzzy msgid "Browse..." msgstr "খà§à¦œà§‡ দেখà§à¦¨" msgid "Images" msgstr "ছবি" msgid "File" msgstr "ফাইল" msgid "Open directory..." msgstr "ডিরেকà§à¦Ÿà¦°à¦¿ খà§à¦²à§à¦¨" msgid "Open file..." msgstr "ফাইল খà§à¦²à§à¦¨" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "à¦à¦Ÿà¦¿ হলো কমপিজ à¦à¦° পছনà§à¦¦ ঠিক করার জায়গা" msgid "translator-credits" msgstr "অনà§à¦¬à¦¾à¦¦ করেছেন" msgid "An error has occured" msgstr "à¦à¦•টা সমসà§à¦¯à¦¾ হয়েছে" msgid "Warning" msgstr "সতরà§à¦•তাবাণী" #, python-format msgid "Enable %s" msgstr "%s কে সকà§à¦°à¦¿à§Ÿ করো" msgid "Filter" msgstr "ছাকা" #, python-format msgid "Search %s Plugin Options" msgstr "%s পà§à¦²à¦¾à¦—ইন à¦à¦° পছনà§à¦¦ খোজো" msgid "Use This Plugin" msgstr "à¦à¦‡ পà§à¦²à¦¾à¦—ইন বà§à¦¯à¦¬à¦¹à¦¾à¦° করো" msgid "Search Compiz Core Options" msgstr "কমপিজ কোর à¦à¦° পছনà§à¦¦ à¦à¦° মধà§à¦¯à§‡ খোজো" msgid "Error" msgstr "সমসà§à¦¯à¦¾" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "ফিলটার ঠà¦à¦¨à§à¦Ÿà¦¾à¦° করোন.\n" "পছনà§à¦¦ মতন কিবরà§à¦¡ ঠবাটান বà§à¦¯à¦¬à¦¹à¦¾à¦° করোন" msgid "Search in..." msgstr "à¦à¦° মধà§à¦¯à§‡ খোজো" #. Options msgid "Short description and name" msgstr "সংকà§à¦·à¦¿à¦ªà§à¦¤ নাম ও বিবরণ" msgid "Long description" msgstr "সমà§à¦ªà§‚রà§à¦£ বিবরন" msgid "Settings value" msgstr "পছনà§à¦¦à§‡à¦° মান" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "পছনà§à¦¦" #, fuzzy msgid "Loading Advanced Search" msgstr "উনà§à¦¨à¦¤ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨" msgid "Add a New Profile" msgstr "নতà§à¦¨ পà§à¦°à§‹à¦«à¦¾à¦‡à¦² যোগ করà§à¦¨" msgid "Remove This Profile" msgstr "à¦à¦‡ পà§à¦°à§‹à¦«à¦¾à¦‡à¦² সরিয়ে ফেলো" msgid "Default" msgstr "মূল মান" msgid "Profile" msgstr "পà§à¦°à§‹à¦«à¦¾à¦‡à¦²" msgid "Import" msgstr "আমদানি" msgid "Import a CompizConfig Profile" msgstr "কমপিজ কনফিগ à¦à¦° পà§à¦°à§‹à¦«à¦¾à¦‡à¦² আমদানি করো" msgid "Import as..." msgstr "বিশেষভাবে আমà§à¦¦à¦¾à¦¨à¦¿ করো" msgid "Import a CompizConfig Profile as a new profile" msgstr "কমপিজ কনফিগ à¦à¦° পà§à¦°à§‹à¦«à¦¾à¦‡à¦² নতà§à¦¨ পà§à¦°à§‹à¦«à¦¾à¦‡à¦² হিসেবে আমদানি করো" msgid "Export" msgstr "রপà§à¦¤à¦¾à¦¨à¦¿" msgid "Export your CompizConfig Profile" msgstr "আপনার কমপিজ কনফিগ à¦à¦° পà§à¦°à§‹à¦«à¦¾à¦‡à¦² রপà§à¦¤à¦¾à¦¨à¦¿ করà§à¦¨" msgid "Reset to defaults" msgstr "মূল মানে ফেরৎ নাও" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "আপনার কমপিজ কনফিগ à¦à¦° পà§à¦°à§‹à¦«à¦¾à¦‡à¦² মূল মানে ফেরৎ নিন" msgid "Backend" msgstr "বà§à¦¯à¦¾à¦•à¦à¦¨à§à¦¡" msgid "Integration" msgstr "মিশে যাওয়া" msgid "Enable integration into the desktop environment" msgstr "ডেসà§à¦•টপের পরিবেশের সাথে মিশে যাবে" msgid "Profiles (*.profile)" msgstr "পà§à¦°à§‹à¦«à¦¾à¦‡à¦² (*.profile)" msgid "All files" msgstr "সব ফাইল" msgid "Save file.." msgstr "ফাইল সংরকà§à¦·à¦£ করà§à¦¨" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "আপনার পà§à¦°à§‹à¦«à¦¾à¦‡à¦² পà§à¦°à§‡à¦°à¦£ করার সময় আপনি কি সতà§à¦¯à¦¿à¦‡ পà§à¦°à¦¥à¦¾à¦¸à§à¦¬à¦°à§‚প বিকলà§à¦ªà§‡à¦° মূলà§à¦¯à¦—à§à¦²à¦¿ বাদ দিয়ে " "যেতে চান?" msgid "Open file.." msgstr "ফাইল খà§à¦²à§à¦¨" msgid "Enter a profile name" msgstr "পà§à¦°à§‹à¦«à¦¾à¦‡à¦²à§‡à¦° নাম ঠিক করà§à¦¨" msgid "Please enter a name for the new profile:" msgstr "নতà§à¦¨ পà§à¦°à§‹à¦«à¦¾à¦‡à¦²à§‡à¦° নাম ঠিক করà§à¦¨à¦ƒ" msgid "Backend not found." msgstr "বà§à¦¯à¦•à¦à¦¨à§à¦¡ পাওয়া যায়নি" #. Auto sort msgid "Automatic plugin sorting" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿ পà§à¦²à¦¾à¦—ইন সাজানো" msgid "Disabled Plugins" msgstr "নিষà§à¦•à§à¦°à¦¿à§Ÿ পà§à¦²à¦¾à¦—ইন" msgid "Enabled Plugins" msgstr "সকà§à¦°à¦¿à§Ÿ পà§à¦²à¦¾à¦—ইন" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "আপনি কি সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿà¦­à¦¾à¦¬à§‡ পà§à¦²à¦¾à¦—ইন সঞà§à¦šà§Ÿà§‡à¦° বৈশিষà§à¦Ÿà§à¦¯à¦Ÿà¦¿ অসমরà§à¦¥ করতে চান ? à¦à¦Ÿà¦¿ করা হলে " "দà§à¦¬à¦¨à§à¦¦ পরিচালনার কাজটি বà§à¦¯à¦¾à¦¹à¦¤ হবে. আপনি কি করতে যাচà§à¦›à§‡à¦¨ তা যদি আপনার জানা থাকে " "তাহলে আপনি à¦à¦Ÿà¦¾ করতে পারেন." msgid "Add plugin" msgstr "পà§à¦²à¦¾à¦—ইন যোগ করà§à¦¨" msgid "Plugin name:" msgstr "পà§à¦²à¦¾à¦—ইন à¦à¦° নামঃ" msgid "Insert plugin name" msgstr "পà§à¦²à¦¾à¦—ইন à¦à¦° নাম লিখà§à¦¨" msgid "Preferences" msgstr "আনà§à¦•ূলà§à¦¯" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "কমপিজ কনফিগারেশন à¦à¦° বà§à¦¯à¦¬à¦¹à§ƒà¦¤ পà§à¦°à§‹à¦«à¦¾à¦‡à¦²,বà§à¦¯à¦•à¦à¦¨à§à¦¡ ও অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦¨ পছনà§à¦¦ à¦à¦° মান ঠিক করà§à¦¨" msgid "About" msgstr "পরিচিতি" msgid "About CCSM..." msgstr "সিসিà¦à¦¸à¦à¦® পরিচিতি" msgid "Profile & Backend" msgstr "পà§à¦°à§‹à¦«à¦¾à¦‡à¦² ও বà§à¦¯à¦•à¦à¦¨à§à¦¡" msgid "Plugin List" msgstr "পà§à¦²à¦¾à¦—ইন à¦à¦° তালিকা" msgid "Filter your Plugin list" msgstr "আপনার পà§à¦²à¦¾à¦—ইন তালিকা ছাকà§à¦¨" #, python-format msgid "Screen %i" msgstr "পরà§à¦¦à¦¾à¦° %i" msgid "Screen" msgstr "পরà§à¦¦à¦¾" msgid "Category" msgstr "শà§à¦°à§‡à¦£à§€" msgid "Advanced Search" msgstr "উনà§à¦¨à¦¤ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "à¦à¦°à¦•ম কিছৠপাওয়া যায়নি. \n" "\n" " আপনার ছাকà§à¦¨à¦¿ \"%s\" à¦à¦° সাথে মিলওয়ালা কোন কিছৠপাওয়া যায়নি." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "সমà§à¦­à¦¾à¦¬à§à¦¯ সংঘরà§à¦· হিসাব করা হচà§à¦›à§‡à¥¤à¦…নà§à¦—à§à¦°à¦¹ করে অপেকà§à¦·à¦¾ করà§à¦¨" #~ msgid "Value (%s)" #~ msgstr "মান (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s à¦à¦° জনà§à¦¯ মান (%(value)s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "%s হলো %s à¦à¦° জনà§à¦¯ অপরিচালিত তালিকা" #~ msgid "Actions" #~ msgstr "কাজ" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/gl.po0000644000015301777760000003177112321343002022477 0ustar pbusernogroup00000000000000# translation of ccsm.po to Galician # Translation of CCSM to gl_ES # Copyright (C) 2007 compiz-fusion # This file is distributed under the same license as the Compiz Fusion packages. # # Festor Wailon Dacoba , 2007. # Fran Diéguez (GLUG) , 2007. # Fran Diéguez , 2007. msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-05-24 18:40+0200\n" "Last-Translator: Fran Diéguez Souto \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "O novo valor para o atallo %(binding)s da acción %(action)s no " "complemento %(plugin)s ten un conflito coa acción %" "(action_conflict)s do complemento %(plugin_conflict)s.\n" "Quere desactivar %(action_conflict)s no complemento %" "(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Desactivar %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Non configuralas %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Activar %(action)s de todas formas" msgid "key" msgstr "chave" msgid "button" msgstr "botón" msgid "edge" msgstr "borde" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Esta tentando empregar a característica %(feature)s que non " "está sendo proporcionada por ningún complemento.\n" "¿Quere empregar esta funcionalidade de tódolos xeitos?" #, python-format msgid "Use %(feature)s" msgstr "Empregar %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Non empregar %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Esta tentando empregar a característica %(feature)s que inclúe %" "(plugin)s.\n" "Este complemento está desactivado neste intre.\n" "¿Queres habilitar %(plugin)s para que a característica este " "dispoñíbel?" #, python-format msgid "Enable %(plugin)s" msgstr "Activar %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Non activar %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Algúns atallos de teclado %(bindings)s do Complemento %(plugin)s " "entran en conflito con outros complementos. ¿Quere solucionar estes " "conflitos?" msgid "Resolve conflicts" msgstr "Solucionar conflictos" msgid "Ignore conflicts" msgstr "Ignorar conflitos" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "O complemento %(plugin_conflict)s proporciona a funcionalidade %" "(feature)s que tamén está proporcionada por %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Desactivar %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Non activar %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "O complemento %(plugin_conflict)s ten un conflito con %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s require a funcionalidade %(feature)s que é " "proporcionada polos seguintes complementos:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Activar estes complementos" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "O complemento %(plugin)s require o complemento %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Activar %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)sproporciona a funcionalidade %(feature)s que é " "requirida polos complementos %(plugin_list)s." msgid "Disable these plugins" msgstr "Desactivar os seguintes complementos" #, python-format msgid "Don't disable %(plugin)s" msgstr "Non desactivar %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s é necesario para os complementos %(plugin_list)s." msgid "General" msgstr "Xeral" msgid "Accessibility" msgstr "Accesibilidade" msgid "Desktop" msgstr "Escritorio" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Administración de xanelas" msgid "Effects" msgstr "Efectos" msgid "Image Loading" msgstr "Soporte de formatos de imaxe" msgid "Utility" msgstr "Utilidades" msgid "All" msgstr "Todas" msgid "Uncategorized" msgstr "Sen categoría" msgid "N/A" msgstr "N/D" msgid "Reset setting to the default value" msgstr "Reiniciar configuración ao valor por defecto" msgid "Edit" msgstr "Editar" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Configuracións das listas múltiples. Vostede pode facer dobre clic nunha " "fila para editar os valores." #, python-format msgid "Edit %s" msgstr "Editar %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" non é unha ligazón válida" msgid "Disabled" msgstr "Desactivado" msgid "Enabled" msgstr "Activado" msgid "Grab key combination" msgstr "Obter combinación de teclas" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" non é un botón válido" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Se emprega Botón1 sen modificadores pode evitar poder facer clic co botón " "esquerdo o que pode votar a perder a súa configuración. Está seguro que " "quere establecer o botón \"%s\" ao Botón1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" non é unha máscara de borde válida" msgid "None" msgstr "Ningún" msgid "CompizConfig Settings Manager" msgstr "Administrador de Configuracións CompizConfig" msgid "Plugin" msgstr "Complemento" msgid "Please press the new key combination" msgstr "Prema unha nova combinación de teclas" msgid "Window Title" msgstr "Título da xanela" msgid "Window Role" msgstr "Rol da xanela" msgid "Window Name" msgstr "Nome da xanela" msgid "Window Class" msgstr "Clase da xanela" msgid "Window Type" msgstr "Tipo de xanela" msgid "Window ID" msgstr "ID da xanela" msgid "And" msgstr "E" msgid "Or" msgstr "Ou" msgid "Edit match" msgstr "Editar coincidencia" #. Type msgid "Type" msgstr "Tipo" #. Value msgid "Value" msgstr "Valor" msgid "Grab" msgstr "Obter" #. Relation msgid "Relation" msgstr "Relación" #. Invert msgid "Invert" msgstr "Invertir" msgid "Browse..." msgstr "Examinar..." msgid "Images" msgstr "Imaxes" msgid "File" msgstr "Ficheiro" msgid "Open directory..." msgstr "Abrir cartafol..." msgid "Open file..." msgstr "Abrir ficheiro..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Este é o administrador de opcións do sistema de configuración CompizConfig" msgid "translator-credits" msgstr "Fran Diéguez Souto , 2009" msgid "An error has occured" msgstr "Produciuse un erro" msgid "Warning" msgstr "Advertencia" #, python-format msgid "Enable %s" msgstr "Activar %s" msgid "Filter" msgstr "Filtro" #, python-format msgid "Search %s Plugin Options" msgstr "Procurar nas opcións do complemento %s" msgid "Use This Plugin" msgstr "Empregar este complemento" msgid "Search Compiz Core Options" msgstr "Procurar nas opcións do núcleo de Compiz" msgid "Error" msgstr "Erro" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Insira un filtro.\n" "Faga clic na imaxe do teclado para gardar unha tecla coa que procurar." msgid "Search in..." msgstr "Procurar en..." #. Options msgid "Short description and name" msgstr "Descrición curta e nome" msgid "Long description" msgstr "Descrición longa" msgid "Settings value" msgstr "Valor das opcións" msgid "Group" msgstr "Grupo" msgid "Subgroup" msgstr "Subgrupo" #. Notebook msgid "Settings" msgstr "Opcións" msgid "Loading Advanced Search" msgstr "Cargando a procura avanzada" msgid "Add a New Profile" msgstr "Engadir un perfil novo" msgid "Remove This Profile" msgstr "Eliminar este perfil" msgid "Default" msgstr "Por defecto" msgid "Profile" msgstr "Perfil" msgid "Import" msgstr "Importar" msgid "Import a CompizConfig Profile" msgstr "Importa un perfil de CompizConfig" msgid "Import as..." msgstr "Importar como..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importa un perfil de CompizConfig como un novo perfil" msgid "Export" msgstr "Exportar" msgid "Export your CompizConfig Profile" msgstr "Exporta o seu perfil CompizConfig" msgid "Reset to defaults" msgstr "Volta ás configuracións predeterminadas" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" "Reinicia o seu perfil de CompizConfig ás opcións xerais predeterminadas" msgid "Backend" msgstr "Método de almacenamento de configuración" msgid "Integration" msgstr "Integración" msgid "Enable integration into the desktop environment" msgstr "Activar integración co entorno de escritorio" msgid "Profiles (*.profile)" msgstr "Perfís (*.profile)" msgid "All files" msgstr "Tódolos ficheiros" msgid "Save file.." msgstr "Gardar ficheiro.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Quere omitir os valores das opcións por defecto ao exportar o seu perfil?" msgid "Open file.." msgstr "Abrir ficheiro.." msgid "Enter a profile name" msgstr "Insira un nome para o perfil" msgid "Please enter a name for the new profile:" msgstr "Insira un nome para o novo perfil:" msgid "Backend not found." msgstr "Non atopou o método de almacenamento de configuración." #. Auto sort msgid "Automatic plugin sorting" msgstr "Ordenar os complementos automáticamente" msgid "Disabled Plugins" msgstr "Complementos desactivados" msgid "Enabled Plugins" msgstr "Complementos activados" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Quere desactivar a ordenación automática de complementos? Isto tamén " "desactiva a xestión de conflitos. So se debería facer isto se sabe ben o que " "esta a facer." msgid "Add plugin" msgstr "Engadir complemento" msgid "Plugin name:" msgstr "Nome do complemento:" msgid "Insert plugin name" msgstr "Insira un nome para o complemento" msgid "Preferences" msgstr "Preferencias" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configure o método de almacenamento de configuración, perfís e outras " "opcións internas empregadas polo sistema de configuración de Compiz" msgid "About" msgstr "Sobre" msgid "About CCSM..." msgstr "Acerca de CCSM..." msgid "Profile & Backend" msgstr "Perfil e método de almacenamento de configuración" msgid "Plugin List" msgstr "Lista de Complementos" msgid "Filter your Plugin list" msgstr "Filtra a súa lista de complementos" #, python-format msgid "Screen %i" msgstr "Pantalla %i" msgid "Screen" msgstr "Pantallla" msgid "Category" msgstr "Categoría" msgid "Advanced Search" msgstr "Procura avanzada" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Non se atopou ningunha coincidencia. \n" "\n" " O seu filtro \"%s\" non devolveu ningún resultado." msgid "Configure Compiz with CompizConfig" msgstr "Configurar Compiz con CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Posibles conflictos de computación, por favor espere" #~ msgid "Value (%s)" #~ msgstr "Valor (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Valor (%(value)s) para %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Tipo de lista non mantida %s para %s" #~ msgid "Actions" #~ msgstr "Accións" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/pt_BR.po0000644000015301777760000003322412321343002023076 0ustar pbusernogroup00000000000000# CompizConfig Brazilian Portuguese translation. # Translated from scratch by Werner Landgraf, 2007 Aug 31, # new itens 2007 Sep 12-4. Format corrected by the other authors # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Werner Landgraf # Marco Ribeiro (salsichad2) , 2007. # Marco A S Ribeiro # Emerson Ribeiro de Mello msgid "" msgstr "" "Project-Id-Version: pt_BR-ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-07-30 23:54+0200\n" "Last-Translator: Filipe Guide \n" "Language-Team: Portuguese/Brazil \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "O novo valor de %(binding)s para a ação %(action)s no plugin %" "(plugin)s está em conflito com a ação %(action_conflict)s do " "plugin %(plugin_conflict)s.\n" "Você quer desabilitar %(action_conflict)s no plugin %" "(plugin_conflict)s ?" # Acho que 'Disable' fica melhor traduzido como 'Desativa' #, python-format msgid "Disable %(action_conflict)s" msgstr "Desabilita %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Não atribua um valor a %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Atribua valor a %(action)s de qualquer forma !" msgid "key" msgstr "Atalho do Teclado" msgid "button" msgstr "Atalho do Mouse" msgid "edge" msgstr "Borda" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Você está tentando usar a função %(feature)s que não é provida " "por nenhum plugin.\n" "Você quer usar essa função assim mesmo?" #, python-format msgid "Use %(feature)s" msgstr "Habilitar %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Não habilita %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Você está tentando usar a função %(feature)s que é fornecida pelo " "plugin %(plugin)s.\n" "Esse plugin está desabilitado.\n" "Deseja habilitar o plugin %(plugin)s para tornar a função disponível?" #, python-format msgid "Enable %(plugin)s" msgstr "Habilitar %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Não habilitar %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Alguns atalhos do plugin %(bindings)s %(plugin)s conflitam com os de " "outros plugins. Deseja resolver esses conflitos?" msgid "Resolve conflicts" msgstr "Resolver conflitos" msgid "Ignore conflicts" msgstr "Ignorar conflitos" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Conflito: Plugin %(plugin_conflict)s provê a função %(feature)s a qual também está sendo provida pelo plugin %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Desabilitar %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Não habilitar %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Plugin %(plugin_conflict)s está em conflito com %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s requer a função %(feature)s a qual é provida pelos " "seguintes plugins:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Habilitar estes plugins" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s requer o plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Habilita %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s provê a função %(feature)s a qual é requerida pelos " "plugins %(plugin_list)s." msgid "Disable these plugins" msgstr "Desabilita estes plugins" #, python-format msgid "Don't disable %(plugin)s" msgstr "Não desabilita %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s é requerido pelos plugins %(plugin_list)s." msgid "General" msgstr "Geral" msgid "Accessibility" msgstr "Acessibilidade" msgid "Desktop" msgstr "Ãrea de Trabalho" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Gerenciamento de Janelas" msgid "Effects" msgstr "Efeitos" msgid "Image Loading" msgstr "Carregamento de Imagem" msgid "Utility" msgstr "Utilidade" msgid "All" msgstr "Todos" msgid "Uncategorized" msgstr "Sem Categoria" msgid "N/A" msgstr "N/D" msgid "Reset setting to the default value" msgstr "Restaurar as configurações para o valor padrão" msgid "Edit" msgstr "Editar" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Configurações multi-valor. Você pode clicar duas vezes em uma linha para " "editar seus valores" #, python-format msgid "Edit %s" msgstr "Editar %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" não é um atalho válido" msgid "Disabled" msgstr "Desabilitado" msgid "Enabled" msgstr "Habilitado" msgid "Grab key combination" msgstr "Selecionar combinação de teclas" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" não é um botão válido" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Usar o Botão-1 do mouse sem modificadores pode lhe impossibilitar de usar a " "função do botão esquerdo. Dessa forma, poderá haver um erro de " "configuração. Você realmente deseja atribuir o botão \"%s\" ao Botão-1 do " "mouse?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" não é um efeito de canto da tela válido" msgid "None" msgstr "Nenhum" msgid "CompizConfig Settings Manager" msgstr "Gerenciador de configurações do CompizConfig" msgid "Plugin" msgstr "Plugins" msgid "Please press the new key combination" msgstr "Por favor, pressione a nova combinação de teclas" msgid "Window Title" msgstr "Título da janela" msgid "Window Role" msgstr "Função da janela" msgid "Window Name" msgstr "Nome da janela" msgid "Window Class" msgstr "Classe da janela" msgid "Window Type" msgstr "Tipo da janela" msgid "Window ID" msgstr "ID da janela" msgid "And" msgstr "E" msgid "Or" msgstr "Ou" msgid "Edit match" msgstr "Editar resultado" #. Type msgid "Type" msgstr "Tipo" #. Value msgid "Value" msgstr "Valor" msgid "Grab" msgstr "Agarrar" #. Relation msgid "Relation" msgstr "Relação" #. Invert msgid "Invert" msgstr "Inverter" msgid "Browse..." msgstr "Pesquisar..." msgid "Images" msgstr "Imagens" msgid "File" msgstr "Arquivo" msgid "Open directory..." msgstr "Abrir diretório..." msgid "Open file..." msgstr "Abrir arquivo..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Este é o Gerenciador de configurações para o sistema de configuração do " "CompizConfig" # Não é um campo destinado ao nome do tradutor e sim um campo que tem que ser traduzido. msgid "translator-credits" msgstr "créditos-tradutor" msgid "An error has occured" msgstr "Ocorreu um erro" msgid "Warning" msgstr "Aviso" #, python-format msgid "Enable %s" msgstr "Habilita %s" msgid "Filter" msgstr "Filtro" #, python-format msgid "Search %s Plugin Options" msgstr "Procurar pelas opções do plugin %s" msgid "Use This Plugin" msgstr "Usar este plugin" msgid "Search Compiz Core Options" msgstr "Busca por opções do Compiz Core" msgid "Error" msgstr "Erro" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Entre com um filtro.\n" "Clique na imagem do teclado para capturar uma tecla para a busca." msgid "Search in..." msgstr "Procurar em..." #. Options msgid "Short description and name" msgstr "Descrição resumida e nome" msgid "Long description" msgstr "Descrição detalhada" msgid "Settings value" msgstr "Valor de configurações" msgid "Group" msgstr "Grupo" msgid "Subgroup" msgstr "Subgrupo" #. Notebook msgid "Settings" msgstr "Configurações" msgid "Loading Advanced Search" msgstr "Carregando a Busca Avançada" msgid "Add a New Profile" msgstr "Adicionar um novo Perfil" msgid "Remove This Profile" msgstr "Apagar este Perfil" msgid "Default" msgstr "Padrão" msgid "Profile" msgstr "Perfil" msgid "Import" msgstr "Importar" msgid "Import a CompizConfig Profile" msgstr "Importar um Perfil do CompizConfig" msgid "Import as..." msgstr "Importar como..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importar um Perfil do CompizConfig como um novo perfil" msgid "Export" msgstr "Exportar" msgid "Export your CompizConfig Profile" msgstr "Exportar o seu Perfil do CompizConfig" msgid "Reset to defaults" msgstr "Restaurar para valores padrões" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Restaurar o perfil do CompizConfig com todos os valores padrões" msgid "Backend" msgstr "Programa interno" msgid "Integration" msgstr "Integração" msgid "Enable integration into the desktop environment" msgstr "Habilitar a Integração com a Ãrea de Trabalho" msgid "Profiles (*.profile)" msgstr "Perfis (*.profile)" msgid "All files" msgstr "Todos os arquivos" msgid "Save file.." msgstr "Salvar arquivo.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Você quer pular os valores de opção padrão enquanto exporta o seu perfil?" msgid "Open file.." msgstr "Abrir arquivo.." msgid "Enter a profile name" msgstr "Entre com um nome de perfil" msgid "Please enter a name for the new profile:" msgstr "Por favor, entre com o nome para o novo perfil:" msgid "Backend not found." msgstr "Programa interno não encontrado." #. Auto sort msgid "Automatic plugin sorting" msgstr "Ordenação automática dos plugins" msgid "Disabled Plugins" msgstr "Plugins desabilitados" msgid "Enabled Plugins" msgstr "Plugins habilitados" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Você realmente deseja desabilitar a ordenação automática dos plugins? Isso " "também irá desabilitar o tratador de conflitos. Você deveria fazer isso " "somente se você souber o que está fazendo." msgid "Add plugin" msgstr "Adicionar plugin" msgid "Plugin name:" msgstr "Nome do plugin:" msgid "Insert plugin name" msgstr "Inserir nome do plugin" msgid "Preferences" msgstr "Preferências" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configuração do programa interno, dos perfis de uso, e de outras " "configurações internas usadas pelo sistema de configuração do Compiz." msgid "About" msgstr "Sobre" msgid "About CCSM..." msgstr "Sobre o CCSM..." msgid "Profile & Backend" msgstr "Perfil & Programa Interno" msgid "Plugin List" msgstr "Lista dos Plugins" msgid "Filter your Plugin list" msgstr "Filtrar sua lista de plugins" #, python-format msgid "Screen %i" msgstr "Tela %i" msgid "Screen" msgstr "Tela" msgid "Category" msgstr "Categoria" msgid "Advanced Search" msgstr "Busca Avançada" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Nenhum resultado encontrado. \n" "\n" " Seu filtro de busca \"%s\" não combina com nenhum item." msgid "Configure Compiz with CompizConfig" msgstr "Configurar o Compiz com o CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Verificando possíveis conflitos, por favor aguarde" #~ msgid "Value (%s)" #~ msgstr "Valor (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Valor (%(value)s) para %(setting)s:" #, fuzzy #~ msgid "Unhandled list type %s for %s" #~ msgstr "%s : Tipo não tratado por %s" #~ msgid "Actions" #~ msgstr "Ações" #~ msgid "Disable %s" #~ msgstr "deshabilitar %s" #~ msgid "Name" #~ msgstr "Nome" #~ msgid "Screen Edge" #~ msgstr "Canto da Telha" #~ msgid "Button %i" #~ msgstr "Botão no. %i do Rato" #~ msgid "Edge Button" #~ msgstr "Botão atribuido ao canto da telha" #~ msgid "On System Bell" #~ msgstr "Ao tocar a Campainha" #~ msgid "Edit Action: %s" #~ msgstr "Editar Ação: %s" #~ msgid "Screen Edges" #~ msgstr "Cantos da Telha" #~ msgid "Reset To Defaults" #~ msgstr "Voltar aos valores-padrão" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/Makevars0000644000015301777760000000345612321343002023230 0ustar pbusernogroup00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = ccsm # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ --no-location # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = opencompositing.org. # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = http://bugs.opencompositing.org # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/pt.po0000644000015301777760000003127312321343002022515 0ustar pbusernogroup00000000000000# translation of ccsm.po to Portuguese (Portugal) # CompizConfig Portuguese translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # # # Nicolau Gonçalves , 2007. # Joel Calado , 2007. msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-09-01 20:20+0200\n" "Last-Translator: Nicolau Gonçalves \n" "Language-Team: Portuguese (Portugal) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "O novo valor para o atalho %(binding)s da acção %(action)s do plugin " "%(plugin)s entra em conflito com a acção %(action_conflict)s " "do plugin %(plugin_conflict)s.\n" "Deseja desactivar %(action_conflict)s do plugin %(plugin_conflict)" "s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Desactivar %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Não activar %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Definir %(action)s de qualquer maneira" msgid "key" msgstr "tecla" msgid "button" msgstr "botão" msgid "edge" msgstr "margem" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Está a tentar utilizar a acção %(feature)s que não é " "proporcionada por nenhum plugin.\n" "Deseja usar esta acção de qualquer maneira?" #, python-format msgid "Use %(feature)s" msgstr "Usar %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Não usar %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Está a tentar utilizar a acção %(feature)s que é proporcionada por " "%(plugin)s.\n" "Este plugin está actualmente desactivado.\n" "Deseja activar %(plugin)s de modo a permitir realizar esta acção?" #, python-format msgid "Enable %(plugin)s" msgstr "Activar %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Não activar %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Alguns %(bindings)s atalhos do Plugin %(plugin)s entram em conflicto " "com outros plugins. Deseja resolver estes conflictos?" msgid "Resolve conflicts" msgstr "Resolve conflictos" msgid "Ignore conflicts" msgstr "Ignorar conflictos" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "O plugin %(plugin_conflict)s permite realizar a acção %(feature)s que também é activada por %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Desactivar %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Não activar %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "O plugin %(plugin_conflict)s entra em conflito com %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s necessita da acção %(feature)s que é proporcionada " "pelos seguintes plugins:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Activar estes plugins" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s requer o plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Activar %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s proporciona a acção %(feature)s que é requerida " "pelos plugins %(plugin_list)s." msgid "Disable these plugins" msgstr "Desactivar estes plugins" #, python-format msgid "Don't disable %(plugin)s" msgstr "Não desactivar %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s é necessária pelos plugins %(plugin_list)s." msgid "General" msgstr "Geral" msgid "Accessibility" msgstr "Acessibilidade" msgid "Desktop" msgstr "Ambiente de trabalho" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Gestão de Janelas" msgid "Effects" msgstr "Efeitos" msgid "Image Loading" msgstr "Carregamento de Imagens" msgid "Utility" msgstr "Utilitários" msgid "All" msgstr "Todas" msgid "Uncategorized" msgstr "Sem categoria" msgid "N/A" msgstr "N/A" msgid "Reset setting to the default value" msgstr "Colocar a definição no valor por omissão" msgid "Edit" msgstr "Editar" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Definições multi-lista. Pode clicar duas vezes numa linha para editar os " "valores." #, python-format msgid "Edit %s" msgstr "Editar %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" não é um atalho válido" msgid "Disabled" msgstr "Desactivado" msgid "Enabled" msgstr "Activado" msgid "Grab key combination" msgstr "Capturar combinação de teclas" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" não é um botão válido" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Utilizar o Botão1 sem modificadores pode impedir o uso de qualquer clique da " "tecla esquerda, impedindo assim o correcto funcionamento da sua " "configuração. De certeza que deseja definir o botão \"%s\" para o Botão1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" não é uma máscara válida para borda" msgid "None" msgstr "Nenhum" msgid "CompizConfig Settings Manager" msgstr "Sistema de Configuração do Compiz" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Por favor, pressione a nova combinação de teclas" msgid "Window Title" msgstr "Título Janela" msgid "Window Role" msgstr "Tipo de Janela" msgid "Window Name" msgstr "Nome da Janela" msgid "Window Class" msgstr "Classe Janela" msgid "Window Type" msgstr "Tipo Janela" msgid "Window ID" msgstr "ID da Janela" msgid "And" msgstr "E" msgid "Or" msgstr "Ou" msgid "Edit match" msgstr "Editar correspondência" #. Type msgid "Type" msgstr "Tipo" #. Value msgid "Value" msgstr "Valor" msgid "Grab" msgstr "Agarrar" #. Relation msgid "Relation" msgstr "Relação" #. Invert msgid "Invert" msgstr "Inverter" msgid "Browse..." msgstr "Procurar..." msgid "Images" msgstr "Imagens" msgid "File" msgstr "Ficheiro" msgid "Open directory..." msgstr "Abrir directório..." msgid "Open file..." msgstr "Abrir ficheiro..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Este é o gestor de definições para o sistema de configuração do CompizConfig." msgid "translator-credits" msgstr "Nicolau Gonçalves" msgid "An error has occured" msgstr "Ocorreu um erro" msgid "Warning" msgstr "Aviso" #, python-format msgid "Enable %s" msgstr "Definir %s" msgid "Filter" msgstr "Filtro" #, python-format msgid "Search %s Plugin Options" msgstr "Pesquisar opções do plugin %s" msgid "Use This Plugin" msgstr "Usar este plugin" msgid "Search Compiz Core Options" msgstr "Pesquisar opções do Compiz Core" msgid "Error" msgstr "Erro" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Seleccione um filtro.\n" "Clique na imagem do teclado para selecionar uma tecla para procurar." msgid "Search in..." msgstr "Pesquisar em..." #. Options msgid "Short description and name" msgstr "Descrição resumida e nome" msgid "Long description" msgstr "Descrição completa" msgid "Settings value" msgstr "Valor da definição" msgid "Group" msgstr "Grupo" msgid "Subgroup" msgstr "Sub-grupo" #. Notebook msgid "Settings" msgstr "Definições" msgid "Loading Advanced Search" msgstr "A Carregar Pesquisa avançada" msgid "Add a New Profile" msgstr "Adicionar um novo perfil" msgid "Remove This Profile" msgstr "Remover este perfil" msgid "Default" msgstr "Por omissão" msgid "Profile" msgstr "Perfil" msgid "Import" msgstr "Importar" msgid "Import a CompizConfig Profile" msgstr "Importar um perfil do Sistema de Configuração do Compiz" msgid "Import as..." msgstr "Importar como..." msgid "Import a CompizConfig Profile as a new profile" msgstr "" "Importar um perfil do Sistema de Configuração do Compiz como um novo perfil" msgid "Export" msgstr "Exportar" msgid "Export your CompizConfig Profile" msgstr "Exportar um perfil do Sistema de Configuração do Compiz" msgid "Reset to defaults" msgstr "Restaurar para valores por omissão" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Restaurar o seu perfil CompizConfig para valores por omissão" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integração" msgid "Enable integration into the desktop environment" msgstr "Activar integração com o ambiente gráfico" msgid "Profiles (*.profile)" msgstr "Perfis (*.profile)" msgid "All files" msgstr "Todos os ficheiros" msgid "Save file.." msgstr "Guardar ficheiro.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Deseja exportar o seu perfil sem guardar os valores por omissão?" msgid "Open file.." msgstr "Abrir ficheiro.." msgid "Enter a profile name" msgstr "Introduza um nome de perfil" msgid "Please enter a name for the new profile:" msgstr "Introduza um nome para o novo perfil:" msgid "Backend not found." msgstr "Backend não foi encontrado." #. Auto sort msgid "Automatic plugin sorting" msgstr "Ordenação automática dos plugins" msgid "Disabled Plugins" msgstr "Plugins Desactivados" msgid "Enabled Plugins" msgstr "Plugins Activados" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Deseja realmente desactivar a ordenação automática dos plugins? Isto também " "desactivará a gestão de conflitos. Deve fazer apenas quando sabe o que está " "a fazer." msgid "Add plugin" msgstr "Adicionar plugin" msgid "Plugin name:" msgstr "Nome do plugin:" msgid "Insert plugin name" msgstr "Inserir o nome do plugin" msgid "Preferences" msgstr "Preferências" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configurar o backend, o perfil e outras definições internas usadas pelo " "Sistema de Configuração do Compiz." msgid "About" msgstr "Acerca" msgid "About CCSM..." msgstr "Acerca do CCSM..." msgid "Profile & Backend" msgstr "Perfil e Backend" msgid "Plugin List" msgstr "Lista de Plugins" msgid "Filter your Plugin list" msgstr "Filtrar a lista de plugins" #, python-format msgid "Screen %i" msgstr "Ecrã %i" msgid "Screen" msgstr "Ecrã" msgid "Category" msgstr "Categoria" msgid "Advanced Search" msgstr "Pesquisa avançada" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Nenhuma ocorrência encontrada. \n" "\n" " O filtro \"%s\" não coincide com nenhum item." msgid "Configure Compiz with CompizConfig" msgstr "Configurar Compiz com CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "A verificar possíveis conflictos, por favor aguarde" #~ msgid "Value (%s)" #~ msgstr "Valor (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Valor (%(value)s) para %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Tipo de lista não gerido %s para %s" #~ msgid "Actions" #~ msgstr "Acções" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/fr.po0000644000015301777760000003145612321343002022504 0ustar pbusernogroup00000000000000# CompizConfig French translation # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # # Sylvain Debray , 2007. # Tristan RABLAT , 2007. # Guillaume Seguin . msgid "" msgstr "" "Project-Id-Version: fr-ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-09-03 14:27+0200\n" "Last-Translator: Florent \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "La nouvelle valeur assignée au raccourci %(binding)s pour l'action %" "(action)s dans l'extension %(plugin)s est en conflit avec " "l'action %(action_conflict)s de l'extension %(plugin_conflict)s.\n" "Voulez vous désactiver l'action %(action_conflict)s de l'extension " "%(plugin_conflict)s ?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Désactiver %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Ne pas définir %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Définir %(action)s malgré tout" msgid "key" msgstr "clé" msgid "button" msgstr "bouton" msgid "edge" msgstr "bordure" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Vous essayez d'utiliser la fonctionnalité %(feature)s qui n'est " "fournie par aucune extension.\n" "Voulez vous tout de même utiliser cette fonctionnalité?" #, python-format msgid "Use %(feature)s" msgstr "Utiliser %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Ne pas utiliser %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Vous essayez d'activer la fonctionnalité %(feature)s qui est fournie " "par %(plugin)s. Cette extension est actuellement désactivée.\n" " Voulez vous activer %(plugin)s pour que la fonctionnalité soit " "disponible?" #, python-format msgid "Enable %(plugin)s" msgstr "Activer \"%(plugin)s\"" #, python-format msgid "Don't enable %(feature)s" msgstr "Ne pas activer %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Quelques %(bindings)s fonctions du Plugin %(plugin)s sont en conflit " "avec d'autres plugins. Voulez-vous résoudre ces conflits ?" msgid "Resolve conflicts" msgstr "Résoudre les conflits" msgid "Ignore conflicts" msgstr "Ignorer les conflits" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "L'extension %(plugin_conflict)s fournit la fonctionnalité %" "(feature)s qui est aussi fournie par %(plugin)s." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Désactiver %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Ne pas activer %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "L'extension %(plugin_conflict)s est en conflit avec %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s requiert la fonctionnalité %(feature)s qui est " "fournie par les extensions suivantes:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Activer ces extensions" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s requiert l'extension %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Activer %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s fournit la fonctionnalité %(feature)s qui est " "requise par les extensions %(plugin_list)s." msgid "Disable these plugins" msgstr "Désactiver ces extensions" #, python-format msgid "Don't disable %(plugin)s" msgstr "Ne pas désactiver %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s est requis par les extensions %(plugin_list)s." msgid "General" msgstr "Général" msgid "Accessibility" msgstr "Accessibilité" msgid "Desktop" msgstr "Bureau" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Gestion des fenêtres" msgid "Effects" msgstr "Effets" msgid "Image Loading" msgstr "Chargement d'Image" msgid "Utility" msgstr "Utilitaire" msgid "All" msgstr "Tous" msgid "Uncategorized" msgstr "Sans catégorie" msgid "N/A" msgstr "N/A" msgid "Reset setting to the default value" msgstr "Revenir à la configuration par défaut" msgid "Edit" msgstr "Éditer" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Configuration multi-liste. Vous pouvez double-cliquer sur une ligne pour " "éditer la valeur." #, python-format msgid "Edit %s" msgstr "Éditer %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" n'est pas un raccourci valide" msgid "Disabled" msgstr "Désactivé" msgid "Enabled" msgstr "Activé" msgid "Grab key combination" msgstr "Saisir une combinaison de touches" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" n'est pas un bouton valide" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Utiliser Button1 sans modificateurs interceptera tous les clics gauches et " "risque donc de casser votre configuration. Voulez vous vraiment associer le " "bouton \"%s\" à Button1?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" n'est pas un masque d'arrête valide" msgid "None" msgstr "Aucun" msgid "CompizConfig Settings Manager" msgstr "Gestionnaire de Configuration CompizConfig" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Veuillez appuyer sur la nouvelle combinaison de touches" msgid "Window Title" msgstr "Titre de la fenêtre" msgid "Window Role" msgstr "Rôle de la fenêtre" msgid "Window Name" msgstr "Nom de la fenêtre" msgid "Window Class" msgstr "Classe de la fenêtre" msgid "Window Type" msgstr "Type de fenêtre" msgid "Window ID" msgstr "ID de la fenêtre" msgid "And" msgstr "Et" msgid "Or" msgstr "Ou" msgid "Edit match" msgstr "Modifier l'équivalence" #. Type msgid "Type" msgstr "Type" #. Value msgid "Value" msgstr "Valeur" msgid "Grab" msgstr "Saisir" #. Relation msgid "Relation" msgstr "Relation" #. Invert msgid "Invert" msgstr "Inverser" msgid "Browse..." msgstr "Parcourir..." msgid "Images" msgstr "Images" msgid "File" msgstr "Fichier" msgid "Open directory..." msgstr "Ouvrir un dossier..." msgid "Open file..." msgstr "Ouvrir un fichier..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Ceci est un gestionnaire de configuration pour le système de configuration " "CompizConfig" msgid "translator-credits" msgstr "Crédits Traducteurs" msgid "An error has occured" msgstr "Une erreur est survenue" msgid "Warning" msgstr "Attention" #, python-format msgid "Enable %s" msgstr "Activer %s" msgid "Filter" msgstr "Filtre" #, python-format msgid "Search %s Plugin Options" msgstr "Chercher les options de l'extension %s" msgid "Use This Plugin" msgstr "Utiliser cette Extension" msgid "Search Compiz Core Options" msgstr "Chercher les options du Noyau de Compiz (compiz-core)" msgid "Error" msgstr "Erreur" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Entrez un filtre.\n" "Cliquez sur l'image du clavier pour saisir une touche pour laquelle chercher." msgid "Search in..." msgstr "Chercher dans..." #. Options msgid "Short description and name" msgstr "Description courte et nom" msgid "Long description" msgstr "Description longue" msgid "Settings value" msgstr "Valeurs de réglage" msgid "Group" msgstr "Groupe" msgid "Subgroup" msgstr "Sous-groupe" #. Notebook msgid "Settings" msgstr "Réglage" msgid "Loading Advanced Search" msgstr "Chargement de la Recherche Avancée" msgid "Add a New Profile" msgstr "Ajouter un nouveau profil" msgid "Remove This Profile" msgstr "Effacer ce profil" msgid "Default" msgstr "Standard" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importer" msgid "Import a CompizConfig Profile" msgstr "Importer un profil CompizConfig" msgid "Import as..." msgstr "Importer en tant que..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importer un profil CompizConfig" msgid "Export" msgstr "Exporter" msgid "Export your CompizConfig Profile" msgstr "Exporter votre profil CompizConfig" msgid "Reset to defaults" msgstr "Revenir au défaut" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Initialiser votre profil CompizConfig avec les paramètres par défaut" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Intégration" msgid "Enable integration into the desktop environment" msgstr "Activer l'intégration avec l'environnement du bureau" msgid "Profiles (*.profile)" msgstr "Profils (*.profile)" msgid "All files" msgstr "Tous les fichiers" msgid "Save file.." msgstr "Sauvegarder..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Désirez vous ommettre les valeurs d'option par défaut en exportant votre " "profil?" msgid "Open file.." msgstr "Ouvrir un fichier..." msgid "Enter a profile name" msgstr "Entrer un nom pour le profil" msgid "Please enter a name for the new profile:" msgstr "Merci d'entrer un nom pour le nouveau profil:" msgid "Backend not found." msgstr "Backend non trouvé." #. Auto sort msgid "Automatic plugin sorting" msgstr "Tri automatique des extension" msgid "Disabled Plugins" msgstr "Extensions désactivées" msgid "Enabled Plugins" msgstr "Extensions activées" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Voulez vous vraiment désactiver le tri automatique des extensions? Cela " "désactivera également la gestion des conflits. Vous devriez seulement faire " "cela si vous êtes sûr de ce que vous faites." msgid "Add plugin" msgstr "Ajouter une extension" msgid "Plugin name:" msgstr "Nom de l'extension:" msgid "Insert plugin name" msgstr "Insérer le nom de l'extension" msgid "Preferences" msgstr "Préférences" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configurer le backend, le profil et d'autres réglages internes utilisés par " "le Système de Configuration de Compiz." msgid "About" msgstr "À propos" msgid "About CCSM..." msgstr "À propos de CCSM..." msgid "Profile & Backend" msgstr "Profil & Backend" msgid "Plugin List" msgstr "Liste des Extensions" msgid "Filter your Plugin list" msgstr "Filtrer votre liste d'extensions" #, python-format msgid "Screen %i" msgstr "Écran %i" msgid "Screen" msgstr "Écran" msgid "Category" msgstr "Catégorie" msgid "Advanced Search" msgstr "Recherche avancée" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Pas de concordance trouvée.

" "Votre filtre \"%s\" ne correspond à aucun objet." msgid "Configure Compiz with CompizConfig" msgstr "Configurer Compiz avec CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Recherche d'éventuels conflits, veuillez patienter" #~ msgid "Value (%s)" #~ msgstr "Valeur (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Valeur (%(value)s) pour %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Liste de type %s non supportée pour %s" #~ msgid "Actions" #~ msgstr "Actions" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/el.po0000644000015301777760000004240712321343002022473 0ustar pbusernogroup00000000000000# CompizConfig Greek Translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # ΔημήτÏης (djdoo) , 2007. # msgid "" msgstr "" "Project-Id-Version: ccsm 0.6.0\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-04-20 02:36+0200\n" "Last-Translator: Jim Dusis \n" "Language-Team: Compiz Fusion translators \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Η νέα τιμή για τον %(binding)s συνδυασμό για την ενέÏγεια %(action)s " "στο Ï€Ïόσθετο %(plugin)s συγκÏοÏεται με την ενέÏγεια %" "(action_conflict)s του %(plugin_conflict)s Ï€Ïόσθετου.\n" "Θέλετε να απενεÏγοποιήσετε το %(action_conflict)s στο %" "(plugin_conflict)s Ï€Ïόσθετο?" #, python-format msgid "Disable %(action_conflict)s" msgstr "ΑπενεÏγοποίηση %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Μην Θέσεις %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Θέσε %(action)s οπωσδήποτε" msgid "key" msgstr "πλήκτÏο" msgid "button" msgstr "κουμπί" msgid "edge" msgstr "άκÏη" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "ΠÏοσπαθείτε να χÏησιμοποιήσετε το χαÏακτηÏιστικό %(feature)s που " "δεν παÏέχεται απο κανένα Ï€Ïόσθετο.\n" "Θέλετε να χÏησιμοποιήσετε αυτό το χαÏακτηÏιστικό οπωσδήποτε?" #, python-format msgid "Use %(feature)s" msgstr "ΧÏήση %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Μη χÏήση %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "ΠÏοσπαθείτε να χÏησιμοποιήσετε το χαÏακτηÏιστικό %(feature)s που " "παÏέχεται απ το%(plugin)s.\n" " Το Ï€Ïόσθετο αυτό είναι τώÏα απενεÏγοποιημένο.\n" "Θέλετε να ενεÏγοποιήσετε το %(plugin)s ωστε το χαÏακτηÏιστικό να " "είναι διαθέσιμο?" #, python-format msgid "Enable %(plugin)s" msgstr "ΕνεÏγοποίηση %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Μην ενεÏγοποιήσεις %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "ΟÏισμένοι %(bindings)s σÏνδεσμοι του ΠÏόσθετου %(plugin)s " "συγκÏοÏωνται με άλλα Ï€Ïόσθετα. Θέλετε να επιλυθοÏν αυτές οι συγκÏοÏσεις?" msgid "Resolve conflicts" msgstr "Επίλυση συγκÏοÏσεων" msgid "Ignore conflicts" msgstr "Αγνόηση συγκÏοÏσεων" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Το Ï€Ïόσθετο %(plugin_conflict)s παÏέχει το χαÏακτηÏιστικό %" "(feature)s το οποίο επίσης παÏέχεται απο το %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "ΑπενεÏγοποίηση %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Μην ενεÏγοποιήσεις %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Το Ï€Ïόσθετο %(plugin_conflict)s έÏχεται σε σÏγκÏουση με το %" "(plugin)s" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s απαιτεί το χαÏακτηÏιστικό %(feature)s το οποίο " "παÏέχεται απο τα ακόλουθα Ï€Ïόσθετα:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "ΕνεÏγοποίηση συγκεκÏιμένων Ï€Ïοσθέτων" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s απαιτεί το Ï€Ïόσθετο %(require)s." #, python-format msgid "Enable %(require)s" msgstr "ΕνεÏγοποίηση %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s παÏέχει το στοιχείο %(feature)s το οποίο απαιτείται " "απο τα Ï€Ïόσθετα %(plugin_list)s." msgid "Disable these plugins" msgstr "ΑπενεÏγοποίηση αυτών των Ï€Ïόσθετων" #, python-format msgid "Don't disable %(plugin)s" msgstr "Μην απενεÏγοποιήσεις %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s απαιτείται απο τα Ï€Ïόσθετα %(plugin_list)s." msgid "General" msgstr "Γενικά" msgid "Accessibility" msgstr "ΠÏοσβασιμότητα" msgid "Desktop" msgstr "Επιφάνεια ΕÏγασίας" msgid "Extras" msgstr "ΕξτÏά" msgid "Window Management" msgstr "ΔιαχείÏιση ΠαÏαθÏÏων" msgid "Effects" msgstr "Εφέ" msgid "Image Loading" msgstr "ΦόÏτωση Εικόνας" msgid "Utility" msgstr "ΧÏήσιμες ΕφαÏμογές" msgid "All" msgstr "Όλα" msgid "Uncategorized" msgstr "ΧωÏίς ΚατηγοÏία" msgid "N/A" msgstr "Μη Διαθέσιμο" msgid "Reset setting to the default value" msgstr "ΕπαναφοÏά της ÏÏθμισης στη Ï€Ïοεπιλεγμένη τιμή" msgid "Edit" msgstr "ΕπεξεÏγασία" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Ρυθμίσεις πολλαπλών-λιστών. Κάνωντας διπλό κλικ σε μια σειÏά μποÏείτε να " "επεξεÏγαστείτε τις τιμές." #, python-format msgid "Edit %s" msgstr "ΕπεξεÏγασία %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" δεν είναι σωστή συντόμευση" msgid "Disabled" msgstr "ΑπενεÏγοποιημένο" msgid "Enabled" msgstr "ΕνεÏγοποιημένο" msgid "Grab key combination" msgstr "Πιάσιμο ÏƒÏ…Î½Î´Ï…Î±ÏƒÎ¼Î¿Ï Ï€Î»Î®ÎºÏ„Ïων" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" δεν είναι σωστό κουμπί" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Η χÏησιμοποίηση του ΚουμπιοÏ1 χωÏίς αλλαγές μποÏεί να σταματήσει κάθε " "αÏιστεÏο κλικ κ επομένως να καταστÏέψει την ÏÏθμισή σας. Θέλετε Ï€Ïαγματικά " "να θέσετε \"%s\" κουμπί στο Κουμπί1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" δεν είναι σωστή μάσκα άκÏης" msgid "None" msgstr "Κανένα" msgid "CompizConfig Settings Manager" msgstr "ΔιαχειÏιστής Ρυθμίσεων του Compiz" msgid "Plugin" msgstr "ΠÏόσθετο" msgid "Please press the new key combination" msgstr "ΠαÏακαλώ χÏησιμοποιήστε τον νέο συνδυασμό πλήκτÏων" msgid "Window Title" msgstr "Τίτλος ΠαÏαθÏÏου" msgid "Window Role" msgstr "Ρόλος ΠαÏαθÏÏου" msgid "Window Name" msgstr "Όνομα ΠαÏαθÏÏου" msgid "Window Class" msgstr "Κλάση ΠαÏαθÏÏου" msgid "Window Type" msgstr "ΤÏπος ΠαÏαθÏÏου" msgid "Window ID" msgstr "ID ΠαÏαθÏÏου" msgid "And" msgstr "Και" msgid "Or" msgstr "Ή" msgid "Edit match" msgstr "ΕπεξεÏγασία ταιÏιάσματος" #. Type msgid "Type" msgstr "ΤÏπος" #. Value msgid "Value" msgstr "Τιμή" msgid "Grab" msgstr "ΑÏπαγή" #. Relation msgid "Relation" msgstr "Σχέση" #. Invert msgid "Invert" msgstr "Αντίθετο" msgid "Browse..." msgstr "ΠεÏιήγηση..." msgid "Images" msgstr "Εικόνες" msgid "File" msgstr "ΑÏχείο" msgid "Open directory..." msgstr "Άνοιγμα διαδÏομής..." msgid "Open file..." msgstr "Άνοιγμα ΑÏχείου..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Αυτός είναι ο διαχειÏιστής Ïυθμίσεων του συστήματος ÏÏθμισης του Compiz." msgid "translator-credits" msgstr "" "ΔημήτÏης(djdoo) , Κώστας(diafanos) " ", Thodo Mitch(Teddy) , " "Dimman Ramone(dimmanramone) , ΆÏης(Arielis) " ", Μάνος(dark_banishing) " msgid "An error has occured" msgstr "Ένα σφάλμα Ï€Ïοέκυψε" msgid "Warning" msgstr "ΠÏοσοχή" #, python-format msgid "Enable %s" msgstr "ΕνεÏγοποίηση %s" msgid "Filter" msgstr "ΦίλτÏο" #, python-format msgid "Search %s Plugin Options" msgstr "Αναζήτηση %s Επιλογών ΠÏόσθετου" msgid "Use This Plugin" msgstr "ΧÏησιμοποίηση αυτου του Ï€Ïόσθετου" msgid "Search Compiz Core Options" msgstr "Αναζήτηση των επιλογών του πυÏήνα του Compiz" msgid "Error" msgstr "Σφάλμα" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Εισαγωγή ενός φίλτÏου.\n" "Κάντε κλικ στην εικόνα του πληκτÏολογίου για να επιλέξετε ένα πλήκτÏο για το " "οποίο θα γίνει έÏευνα." msgid "Search in..." msgstr "Αναζήτηση στο..." #. Options msgid "Short description and name" msgstr "ΣÏντομη πεÏιγÏαφή και όνομα" msgid "Long description" msgstr "ΑκÏιβής πεÏιγÏαφή" msgid "Settings value" msgstr "Τιμή Ïυθμίσεων" msgid "Group" msgstr "Ομάδα" msgid "Subgroup" msgstr "Υποομάδα" #. Notebook msgid "Settings" msgstr "Ρυθμίσεις" msgid "Loading Advanced Search" msgstr "ΦόÏτωση ΠÏοχωÏημένης Αναζήτησης" msgid "Add a New Profile" msgstr "ΠÏοσθήκη νέου Ï€Ïοφίλ" msgid "Remove This Profile" msgstr "ΑφαίÏεση Ï€Ïοφίλ" msgid "Default" msgstr "ΠÏοεπιλεγμένο" msgid "Profile" msgstr "ΠÏοφίλ" msgid "Import" msgstr "Εισαγωγή" msgid "Import a CompizConfig Profile" msgstr "Εισαγωγή ενός ΠÏοφίλ του CompizConfig" msgid "Import as..." msgstr "Εισαγωγή ως..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Εισαγωγή ενός ΠÏοφίλ του CompizConfig ως ένα νέο Ï€Ïοφίλ" msgid "Export" msgstr "Εξαγωγή" msgid "Export your CompizConfig Profile" msgstr "Εξαγωγή του ΠÏÎ¿ÏƒÏ‰Ï€Î¹ÎºÎ¿Ï ÏƒÎ±Ï‚ ΠÏοφίλ του CompizConfig" msgid "Reset to defaults" msgstr "ΕπαναφοÏά στα ΠÏοεπιλεγμένα" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" "ΕπαναφοÏά του ΠÏÎ¿ÏƒÏ‰Ï€Î¹ÎºÎ¿Ï ÏƒÎ±Ï‚ ΠÏοφίλ του CompizConfig στα ολικά Ï€ÏοκαθοÏισμένα" msgid "Backend" msgstr "ΚÏÏια ΕφαÏμογή" msgid "Integration" msgstr "Eνσωμάτωση" msgid "Enable integration into the desktop environment" msgstr "ΕνεÏγοποίηση ενσωμάτωσης στο πεÏιβάλλον επιφάνειας εÏγασίας" msgid "Profiles (*.profile)" msgstr "ΠÏοφίλ (*.profile)" msgid "All files" msgstr "Όλα τα αÏχεία" msgid "Save file.." msgstr "Αποθήκευση ΑÏχείου.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Θέλετε να αγνοηθοÏν οι Ï€Ïοεπιλεγμένες τιμές των επιλογών όταν εξάγετε το " "Ï€Ïοφίλ σας?" msgid "Open file.." msgstr "Άνοιγμα ΑÏχείου.." msgid "Enter a profile name" msgstr "Εισάγετε όνομα Ï€Ïοφίλ" msgid "Please enter a name for the new profile:" msgstr "Εισάγετε όνομα για το καινοÏÏγιο Ï€Ïοφίλ:" msgid "Backend not found." msgstr "ΚÏÏια ΕφαÏμογή δεν βÏέθηκε." #. Auto sort msgid "Automatic plugin sorting" msgstr "Αυτόματη ταξινόμηση Ï€Ïοσθέτων" msgid "Disabled Plugins" msgstr "ΑπενεÏγοποιημένα Ï€Ïόσθετα" msgid "Enabled Plugins" msgstr "ΕνεÏγοποιημένα Ï€Ïόσθετα" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Θέλετε όντως να απενεÏγοποιήσετε την αυτόματη ταξινόμηση τον Ï€Ïοσθέτων? Αυτό " "θα απενεÏγοποιήσει επίσης τον χειÏισμό διενέξεων. Θα Ï€Ïέπει να το κάνετε " "αυτό μόνο αν ξέÏετε τι κάνετε." msgid "Add plugin" msgstr "ΠÏοσθήκη Ï€Ïόσθετου" msgid "Plugin name:" msgstr "Όνομα Ï€Ïόσθετου:" msgid "Insert plugin name" msgstr "Εισαγωγή ονόματος Ï€Ïόσθετου" msgid "Preferences" msgstr "Ιδιότητες" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "ΡÏθμιση κÏÏιας εφαÏμογής, Ï€Ïοφίλ και άλλων εσωτεÏικών Ïυθμίσεων που " "χÏησιμοποιοÏνται απο ΣÏστημα ΡÏθμισης του Compiz." msgid "About" msgstr "Σχετικά" msgid "About CCSM..." msgstr "Σχετικά με το CCSM..." msgid "Profile & Backend" msgstr "ΠÏοφίλ & ΚÏÏια ΕφαÏμογή" msgid "Plugin List" msgstr "Λίστα ΠÏοσθέτων" msgid "Filter your Plugin list" msgstr "ΦιλτÏάÏισμα λίστας Ï€Ïόσθετων" #, python-format msgid "Screen %i" msgstr "Οθόνη %i" msgid "Screen" msgstr "Οθόνη" msgid "Category" msgstr "ΚατηγοÏία" msgid "Advanced Search" msgstr "ΠÏοχωÏημένη Αναζήτηση" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Δεν βÏέθηκε ταίÏιασμα. \n" "\n" "Το φίλτÏο σας \"%s\" δεν ταιÏιάζει με κανένα στοιχείο." msgid "Configure Compiz with CompizConfig" msgstr "ΡÏθμιση του Compiz με το CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Υπολογισμός πιθανών διενέξεων, παÏακαλώ πεÏιμένετε" #~ msgid "Value (%s)" #~ msgstr "Τιμή (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Τιμή (%(value)s) για %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Μη έγκυÏος Ï„Ïπος λίστας %s για %s" #~ msgid "Actions" #~ msgstr "ΕνέÏγειες" #~ msgid "Disable %s" #~ msgstr "ΑπενεÏγοποίηση %s" #~ msgid "Name" #~ msgstr "Όνομα" #~ msgid "Screen Edge" #~ msgstr "ΆκÏη Οθόνης" #~ msgid "Button %i" #~ msgstr "Κουμπί %i" #~ msgid "Edge Button" #~ msgstr "ΑκÏιανό Κουμπί" #~ msgid "On System Bell" #~ msgstr "Στο Καμπανάκι Συστήματος" #~ msgid "Edit Action: %s" #~ msgstr "ΕπεξεÏγασία ΕνέÏγειας: %s" #~ msgid "Screen Edges" #~ msgstr "ΆκÏες Οθόνης" #~ msgid "Reset To Defaults" #~ msgstr "ΕπαναφοÏά στις ΠÏοεπιλεγμένες Ρυθμίσεις" #~ msgid "PyGtk 2.10.0 or later required" #~ msgstr "PyGtk 2.10.0 ή νεότεÏο απαιτείται" #~ msgid "Multi-list settings" #~ msgstr "Ρυθμίσεις πολλαπλών λιστών" #~ msgid "Backend & Profile" #~ msgstr "ΚÏÏια ΕφαÏμογή & ΠÏοφίλ" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/hi.po0000644000015301777760000004120612321343002022467 0ustar pbusernogroup00000000000000# translation of ccsm.po to # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2007-12-16 16:36+0530\n" "Last-Translator: Sangeeta Kumari\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(action)s कà¥à¤°à¤¿à¤¯à¤¾ के %(binding)s बाइंडिंग के लिठनया मान %(plugin)s पà¥à¤²à¤—िन में %(action_conflict)s कà¥à¤°à¤¿à¤¯à¤¾ के साथ विरोध में है %" "(plugin_conflict)s पà¥à¤²à¤—िन के.\n" "कà¥à¤¯à¤¾ आप %(action_conflict)s को %(plugin_conflict)s पà¥à¤²à¤—िन में " "निषà¥à¤•à¥à¤°à¤¿à¤¯ करना चाहते हैं?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s निषà¥à¤•à¥à¤°à¤¿à¤¯ करें" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s सेट मत करें" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s किसी तरह सेट करें" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "आप %(feature)s फीचर पà¥à¤°à¤¯à¥‹à¤— करने की कोशिश कर रहे हैं जो नहीं दिया है " "किसी पà¥à¤²à¤—िन के दà¥à¤µà¤¾à¤°à¤¾.\n" "कà¥à¤¯à¤¾ आप इस फीचर को किसी तरह पà¥à¤°à¤¯à¥‹à¤— करना चाहते हैं?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s का उपयोग करें" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s का उपयोग मत करें" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "आप %(feature)s फीचर का पà¥à¤°à¤¯à¥‹à¤— करने की कोशिश कर रहे हैं जो %(plugin)s " "पà¥à¤²à¤—िन के दà¥à¤µà¤¾à¤°à¤¾ दिया हà¥à¤† है.\n" "यह पà¥à¤²à¤—िन अभी निषà¥à¤•à¥à¤°à¤¿à¤¯ किया हà¥à¤† है.\n" "कà¥à¤¯à¤¾ आप %(plugin)s को सकà¥à¤°à¤¿à¤¯ करना चाहते हैं ताकि फीचर उपलबà¥à¤§ रहे?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s सकà¥à¤°à¤¿à¤¯ करें" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s सकà¥à¤°à¤¿à¤¯ मत करें" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s पà¥à¤²à¤—िन %(feature)s फीचर देता है जो कि %" "(plugin)s के दà¥à¤µà¤¾à¤°à¤¾ दिया गया है." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s निषà¥à¤•à¥à¤°à¤¿à¤¯ करें" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s सकà¥à¤°à¤¿à¤¯ मत करें" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "%(plugin_conflict)s पà¥à¤²à¤—िन %(plugin)s के साथ विरोध में है." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s के लिये %(feature)s फीचर जरूरी है जो कि निमà¥à¤¨à¤²à¤¿à¤–ित पà¥à¤²à¤—िन " "के दà¥à¤µà¤¾à¤°à¤¾ दिया हà¥à¤† है:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "इन पà¥à¤²à¤—िन को सकà¥à¤°à¤¿à¤¯ करें" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s के लिठ%(require)s पà¥à¤²à¤—िन जरूरी है." #, python-format msgid "Enable %(require)s" msgstr "%(require)s सकà¥à¤°à¤¿à¤¯ करें" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s %(feature)s फीचर उपलबà¥à¤§ कराता है जो कि %" "(plugin_list)s पà¥à¤²à¤—िन के दà¥à¤µà¤¾à¤°à¤¾ जरूरी है." msgid "Disable these plugins" msgstr "इन पà¥à¤²à¤—िन को निषà¥à¤•à¥à¤°à¤¿à¤¯ करें" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s को मत निषà¥à¤•à¥à¤°à¤¿à¤¯ करें" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s %(plugin_list)s पà¥à¤²à¤—िन के दà¥à¤µà¤¾à¤°à¤¾ जरूरी होता है." msgid "General" msgstr "सामानà¥à¤¯" msgid "Accessibility" msgstr "अभिगमà¥à¤¯à¤¤à¤¾" msgid "Desktop" msgstr "डेसà¥à¤•टॉप" msgid "Extras" msgstr "अतिरिकà¥à¤¤" msgid "Window Management" msgstr "विंडो पà¥à¤°à¤¬à¤‚धन" msgid "Effects" msgstr "पà¥à¤°à¤­à¤¾à¤µ" msgid "Image Loading" msgstr "चितà¥à¤° लोडिंग" msgid "Utility" msgstr "उपयोगिता" msgid "All" msgstr "सभी" msgid "Uncategorized" msgstr "अवरà¥à¤—ीकृत" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "मूलभूत मान में सेटिंग फिर सेट करें" msgid "Edit" msgstr "संपादन" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "मलà¥à¤Ÿà¥€ लिसà¥à¤Ÿ सेटिंग. आप à¤à¤• पंकà¥à¤¤à¤¿ पर मानों के संपादन के लिठदो बार कà¥à¤²à¤¿à¤• कर सकते हैं." #, python-format msgid "Edit %s" msgstr "%s संपादित करें" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" à¤à¤• वैध शारà¥à¤Ÿà¤•रà¥à¤Ÿ नहीं है" msgid "Disabled" msgstr "निषà¥à¤•à¥à¤°à¤¿à¤¯ किया हà¥à¤†" msgid "Enabled" msgstr "सकà¥à¤°à¤¿à¤¯ किया हà¥à¤†" msgid "Grab key combination" msgstr "कà¥à¤‚जी यà¥à¤—à¥à¤® पकड़ें" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" à¤à¤• वैध बटन नहीं है" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "बिना रूपांतरक के बटन1 का पà¥à¤°à¤¯à¥‹à¤— किसी बायें कà¥à¤²à¤¿à¤• को रोक सकता है और इस पà¥à¤°à¤•ार आपके " "विनà¥à¤¯à¤¾à¤¸ को तोड़ सकता है. कà¥à¤¯à¤¾ आप वासà¥à¤¤à¤µ में \"%s\" बटन को बटन1 में सेट करना चाहते हैं?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" à¤à¤• वैध किनारा मासà¥à¤• नहीं है" msgid "None" msgstr "कोई नहीं" msgid "CompizConfig Settings Manager" msgstr "CompizConfig जमावट पà¥à¤°à¤¬à¤‚धक" #, fuzzy msgid "Plugin" msgstr "पà¥à¤²à¤—िन सूची" msgid "Please press the new key combination" msgstr "कृपया नया कà¥à¤‚जी यà¥à¤—à¥à¤® दबायें" msgid "Window Title" msgstr "विंडो शीरà¥à¤·à¤•" msgid "Window Role" msgstr "विंडो भूमिका" msgid "Window Name" msgstr "विंडो नाम" msgid "Window Class" msgstr "विंडो वरà¥à¤—" msgid "Window Type" msgstr "विंडो पà¥à¤°à¤•ार" msgid "Window ID" msgstr "विंडो ID" msgid "And" msgstr "और" msgid "Or" msgstr "या" msgid "Edit match" msgstr "मिलान संपादित करें" #. Type msgid "Type" msgstr "पà¥à¤°à¤•ार" #. Value msgid "Value" msgstr "मान" msgid "Grab" msgstr "पकड़ें" #. Relation msgid "Relation" msgstr "संबंध" #. Invert msgid "Invert" msgstr "उलटें" #, fuzzy msgid "Browse..." msgstr "इसके लिठबà¥à¤°à¤¾à¤‰à¤œà¤¼" msgid "Images" msgstr "बिंब" msgid "File" msgstr "फाइल" msgid "Open directory..." msgstr "निरà¥à¤¦à¥‡à¤¶à¤¿à¤•ा खोलें..." msgid "Open file..." msgstr "फाइल खोलें..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "यह CompizConfig विनà¥à¤¯à¤¾à¤¸ सिसà¥à¤Ÿà¤® के लिठसेटिंग मैनेजर है." msgid "translator-credits" msgstr "संगीता कà¥à¤®à¤¾à¤°à¥€ (sangeeta09@gmail.com)" msgid "An error has occured" msgstr "à¤à¤• तà¥à¤°à¥à¤Ÿà¤¿ आयी" msgid "Warning" msgstr "चेतावनी" #, python-format msgid "Enable %s" msgstr "%s सकà¥à¤°à¤¿à¤¯ करें" msgid "Filter" msgstr "फिलà¥à¤Ÿà¤°" #, python-format msgid "Search %s Plugin Options" msgstr "%s पà¥à¤²à¤—िन विकलà¥à¤ª खोजें" msgid "Use This Plugin" msgstr "इस पà¥à¤²à¤—िन का उपयोग करें" msgid "Search Compiz Core Options" msgstr "कोपिंज कोर विकलà¥à¤ª खोजें" msgid "Error" msgstr "तà¥à¤°à¥à¤Ÿà¤¿" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "इसमें खोजें..." #. Options msgid "Short description and name" msgstr "संकà¥à¤·à¤¿à¤ªà¥à¤¤ वरà¥à¤£à¤¨ और नाम" msgid "Long description" msgstr "लंबा वरà¥à¤£à¤¨" msgid "Settings value" msgstr "जमावट मान" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "जमावट" #, fuzzy msgid "Loading Advanced Search" msgstr "उनà¥à¤¨à¤¤ खोज" msgid "Add a New Profile" msgstr "नया पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² जोड़ें" msgid "Remove This Profile" msgstr "इस पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² को हटायें" msgid "Default" msgstr "मूलभूत" msgid "Profile" msgstr "पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤²" msgid "Import" msgstr "आयात" msgid "Import a CompizConfig Profile" msgstr "CompizConfig पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² आयात करें" msgid "Import as..." msgstr "à¤à¤¸à¥‡ आयात करें..." msgid "Import a CompizConfig Profile as a new profile" msgstr "CompizConfig पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² को नये पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² के रूप में आयात करें" msgid "Export" msgstr "निरà¥à¤¯à¤¾à¤¤" msgid "Export your CompizConfig Profile" msgstr "अपने CompizConfig पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² को निरà¥à¤¯à¤¾à¤¤ करें" msgid "Reset to defaults" msgstr "मूलभूत में फिर सेट करें" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "अपने CompizConfig पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² को वैशà¥à¤µà¤¿à¤• मूलभूत में फिर सेट करें" msgid "Backend" msgstr "बैकेंड" msgid "Integration" msgstr "संयोजन" msgid "Enable integration into the desktop environment" msgstr "डेसà¥à¤•टॉप वातावरण में संयोजन सकà¥à¤°à¤¿à¤¯ करें" msgid "Profiles (*.profile)" msgstr "पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² (*.profile)" msgid "All files" msgstr "सभी फ़ाइलें" msgid "Save file.." msgstr "फाइल सहेजें.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "कà¥à¤¯à¤¾ आप मूलभूत विकलà¥à¤ª मान को अपने पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² के निरà¥à¤¯à¤¾à¤¤ के दौरान छोड़ना चाहते हैं?" msgid "Open file.." msgstr "फाइल खोलें..." msgid "Enter a profile name" msgstr "पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² नाम दें" msgid "Please enter a name for the new profile:" msgstr "कृपया नये पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² के लिठà¤à¤• नाम दें:" msgid "Backend not found." msgstr "बैकेंड नहीं मिला." #. Auto sort msgid "Automatic plugin sorting" msgstr "सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ पà¥à¤²à¤—िन छांट" msgid "Disabled Plugins" msgstr "निषà¥à¤•à¥à¤°à¤¿à¤¯ किया हà¥à¤† पà¥à¤²à¤—िन" msgid "Enabled Plugins" msgstr "सकà¥à¤°à¤¿à¤¯ पà¥à¤²à¤—िन" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "कà¥à¤¯à¤¾ आप सचमà¥à¤š सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ पà¥à¤²à¤—िन छांट को निषà¥à¤•à¥à¤°à¤¿à¤¯ करना चाहते हैं? यह साथ ही विरोध नियंतà¥à¤°à¤£ " "को निषà¥à¤•à¥à¤°à¤¿à¤¯ करेगा. आप सिरà¥à¤« तभी करना चाहिठइसे जब आप जानते हों कि आप कà¥à¤¯à¤¾ कर रहे हैं." msgid "Add plugin" msgstr "पà¥à¤²à¤—िन जोड़ें" msgid "Plugin name:" msgstr "पà¥à¤²à¤—िन नाम:" msgid "Insert plugin name" msgstr "पà¥à¤²à¤—िन नाम जोड़ें" msgid "Preferences" msgstr "वरीयताà¤à¤" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Compiz विनà¥à¤¯à¤¾à¤¸ सिसà¥à¤Ÿà¤® के दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥à¤•à¥à¤¤ बैकैंड, पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² और दूसरे सेटिंग को विनà¥à¤¯à¤¸à¥à¤¤ करें." msgid "About" msgstr "के बारे में" msgid "About CCSM..." msgstr "CCSM के बारे में..." msgid "Profile & Backend" msgstr "पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² व बैकेंड" msgid "Plugin List" msgstr "पà¥à¤²à¤—िन सूची" msgid "Filter your Plugin list" msgstr "अपनी पà¥à¤²à¤—िन सूची फिलà¥à¤Ÿà¤° करें" #, python-format msgid "Screen %i" msgstr "सà¥à¤•à¥à¤°à¥€à¤¨ %i" msgid "Screen" msgstr "सà¥à¤•à¥à¤°à¥€à¤¨" msgid "Category" msgstr "शà¥à¤°à¥‡à¤£à¥€" msgid "Advanced Search" msgstr "उनà¥à¤¨à¤¤ खोज" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "कोई मेल नहीं मिला. \n" "\n" " आपका फिलà¥à¤Ÿà¤° \"%s\" किसी मद से नहीं मेल खाता है." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "संभावित विरोध की गणना कर रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें" #~ msgid "Value (%s)" #~ msgstr "मान (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "(%(value)s) मान %(setting)s के लिà¤" #~ msgid "Unhandled list type %s for %s" #~ msgstr "%s अनियंतà¥à¤°à¤¿à¤¤ सूची पà¥à¤°à¤•ार %s के लिà¤" #~ msgid "Actions" #~ msgstr "कà¥à¤°à¤¿à¤¯à¤¾à¤à¤" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/hu.po0000644000015301777760000003244312321343002022506 0ustar pbusernogroup00000000000000# translation of hu.po to hungarian # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Karoly Gossler , 2007. # KAMI911 , 2007-2008. msgid "" msgstr "" "Project-Id-Version: hu\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-03-25 09:07+0100\n" "Last-Translator: KAMI \n" "Language-Team: hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "A(z) %(binding)s összerendelés a(z) %(plugin)s bÅ‘vítményben lévÅ‘, a" "(z) %(action)s művelethez rendelt új értéke összeférhetetlen a(z) %" "(plugin_conflict)s bÅ‘vímény %(action_conflict)s műveletével.\n" "Le kívánja tiltani a(z) %(plugin_conflict)s bÅ‘vítmény %" "(action_conflict)s műveletét?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s letiltása" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s mellÅ‘zése" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s beállítása" msgid "key" msgstr "Billentyű" msgid "button" msgstr "Gomb" msgid "edge" msgstr "Szegély" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Olyan %(feature)s funkciót kíván használatba venni, amelyet semelyik " "bÅ‘vítmény nem tud kiszolgálni. Ennek ellenére engedélyezni kívánja " "ezt a funkciót?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s használata" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s mellÅ‘zése" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Olyan %(feature)s funkciót kíván használatba venni, amelyet a(z) %" "(plugin)s bÅ‘vítmény szolgáltat.\n" "Ez a bÅ‘vítmény jelenleg le van tiltva.\n" "Kívánja engedélyezni a(z) %(plugin)s bÅ‘vítményt?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s engedélyezése" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s mellÅ‘zése" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "A(z) %(plugin)s bÅ‘vítmény néhány kötése: %(bindings)s " "összeférhetetlen egyéb bÅ‘vítményekkel. Meg kívánja oldani ezeket az " "összeférhetetlenségeket?" msgid "Resolve conflicts" msgstr "Összeférhetetlenség megoldása" msgid "Ignore conflicts" msgstr "MellÅ‘zés" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "A(z) %(plugin_conflict)s bÅ‘vítmény biztosítja a(z) %(feature)s " "funkciót. Ezt a funkciót a(z) %(plugin)s bÅ‘vítmény is biztosítja." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s letiltása" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s mellÅ‘zése" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "A(z) %(plugin_conflict)s bÅ‘vítmény összeférhetetlen a(z) %(plugin)" "s bÅ‘vítménnyel." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "A(z) %(plugin)s bÅ‘vítmény igényli a(z) %(feature)s funkciót. " "Ezt a funkciót az alábbi bÅ‘vítmények biztosítják:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "KövetkezÅ‘ bÅ‘vítmények engedélyezése" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "A(z) %(plugin)s szükséges a(z) %(require)s bÅ‘vítmény számára." #, python-format msgid "Enable %(require)s" msgstr "%(require)s engedélyezése" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "A(z) %(plugin)s bÅ‘vítmény biztosítja a(z) %(feature)s " "funkciót. Ezt a funkciót az alábbi bÅ‘vítmények igényelik:\n" "%(plugin_list)s" msgid "Disable these plugins" msgstr "KövetkezÅ‘ bÅ‘vítmények tiltása" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s engedélyezése" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "A(z) %(plugin)s bÅ‘vítmény szükséges a(z) %(plugin_list)s " "bÅ‘vítmények számára." msgid "General" msgstr "Ãltalános" msgid "Accessibility" msgstr "Akadálymentesítés" msgid "Desktop" msgstr "Asztal" msgid "Extras" msgstr "Extrák" msgid "Window Management" msgstr "Ablakkezelés" msgid "Effects" msgstr "Effektusok" msgid "Image Loading" msgstr "Képbetöltés" msgid "Utility" msgstr "Eszközök" msgid "All" msgstr "Összes" msgid "Uncategorized" msgstr "Nem kategorizált" msgid "N/A" msgstr "Nem elérhetÅ‘" msgid "Reset setting to the default value" msgstr "Alapértelmezett beállítás visszaállítása" msgid "Edit" msgstr "Szerkesztés" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Többlistás beállítások. Kattintson duplán a sorokra az értékek " "szerkesztéséhez." #, python-format msgid "Edit %s" msgstr "%s szerkesztése" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "„%s†nem érvényes gyorsbillentyű" msgid "Disabled" msgstr "Letiltva" msgid "Enabled" msgstr "Engedélyezve" msgid "Grab key combination" msgstr "Billentyűzetkombináció megadása" #, python-format msgid "\"%s\" is not a valid button" msgstr "„%s†nem érvényes gomb" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "A Gomb 1 módosítók nélküli használata elérhetetlenné tesz minden bal gombbal " "történÅ‘ műveletet, így használhatatlanok lesznek a jelenlegi beállítások. " "Biztos benne, hogy a(z) „%s†gombot a Gomb 1 gombra állítja be?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "„%s†nem érvényes maszk" msgid "None" msgstr "Nincs" msgid "CompizConfig Settings Manager" msgstr "CompizConfig beállításkezelÅ‘" msgid "Plugin" msgstr "BÅ‘vítmények" msgid "Please press the new key combination" msgstr "Nyomja le az új billentyűzetkombinációt" msgid "Window Title" msgstr "Ablakcím" msgid "Window Role" msgstr "Ablak szerep" msgid "Window Name" msgstr "Ablaknév" msgid "Window Class" msgstr "Ablakosztály" msgid "Window Type" msgstr "Ablaktípus" msgid "Window ID" msgstr "Ablak azonosító" msgid "And" msgstr "És" msgid "Or" msgstr "Vagy" msgid "Edit match" msgstr "Egyezés szerkesztése" #. Type msgid "Type" msgstr "Típus" #. Value msgid "Value" msgstr "Érték" msgid "Grab" msgstr "Megadás" #. Relation msgid "Relation" msgstr "Összefüggés" #. Invert msgid "Invert" msgstr "Megfordítás" msgid "Browse..." msgstr "Tallózás…" msgid "Images" msgstr "Képek" msgid "File" msgstr "Fájl" msgid "Open directory..." msgstr "Mappa megnyitása…" msgid "Open file..." msgstr "Fájl megnyitása…" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "BeállításkezelÅ‘ a Compiz rendszerhez." msgid "translator-credits" msgstr "Fordították" msgid "An error has occured" msgstr "Hiba lépett fel" msgid "Warning" msgstr "Figyelmeztetés" #, python-format msgid "Enable %s" msgstr "%s engedélyezése" msgid "Filter" msgstr "SzűrÅ‘" #, python-format msgid "Search %s Plugin Options" msgstr "%s bÅ‘vítmény beállításainak keresése" msgid "Use This Plugin" msgstr "KövetkezÅ‘ bÅ‘vítmény használata" msgid "Search Compiz Core Options" msgstr "Compiz beállítások keresése" msgid "Error" msgstr "Hiba" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Adja meg a keresési feltételt.\n" "Kattintson a billentyűzet képére, hogy megadhassa a keresési feltételt." msgid "Search in..." msgstr "Keresés…" #. Options msgid "Short description and name" msgstr "Rövid leírásban és névben" msgid "Long description" msgstr "Hosszú leírásban" msgid "Settings value" msgstr "Beállítások értékeiben" msgid "Group" msgstr "Csoport" msgid "Subgroup" msgstr "Alcsoport" #. Notebook msgid "Settings" msgstr "Beállítások" msgid "Loading Advanced Search" msgstr "Haladó keresés betöltése" msgid "Add a New Profile" msgstr "Új profil hozzáadása" msgid "Remove This Profile" msgstr "Profil törlése" msgid "Default" msgstr "Alapértelmezett" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importálás" msgid "Import a CompizConfig Profile" msgstr "CompizConfig profil importálása" msgid "Import as..." msgstr "Importálás másként…" msgid "Import a CompizConfig Profile as a new profile" msgstr "CompizConfig profil importálása új profilként" msgid "Export" msgstr "Exportálás" msgid "Export your CompizConfig Profile" msgstr "CompizConfig profil exportálása" msgid "Reset to defaults" msgstr "Alapértelmezett" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "CompizConfig profil visszaállítása az általános alapértelmezésekre" msgid "Backend" msgstr "Kiszolgáló" msgid "Integration" msgstr "Integráció" msgid "Enable integration into the desktop environment" msgstr "Integráció engedélyezése az ablakkezelÅ‘-környezetbe" msgid "Profiles (*.profile)" msgstr "Profilok (*.profile)" msgid "All files" msgstr "Összes fájl" msgid "Save file.." msgstr "Fájl mentése…" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Ki kívánja hagyni az alapértelmezett értékeket tartalmazó beállításokat a " "profil exportálása során?" msgid "Open file.." msgstr "Fájl megnyitása…" msgid "Enter a profile name" msgstr "Profil név megadása" msgid "Please enter a name for the new profile:" msgstr "Adjon meg egy nevet az új profil számára:" msgid "Backend not found." msgstr "A kiszolgáló nem található." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatikus bÅ‘vítmény-sorrend" msgid "Disabled Plugins" msgstr "Tiltott bÅ‘vítmények" msgid "Enabled Plugins" msgstr "Engedélyezett bÅ‘vítmények" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Valóban ki kívánja kapcsolni az automatikus bÅ‘vítményrendezést? Ez a " "lehetÅ‘ség kikapcsolja a összeférhetetlenség-kezelést is, így ez a beállítás " "csak gyakorlott felhasználóknak ajánlható." msgid "Add plugin" msgstr "BÅ‘vítmény hozzáadása" msgid "Plugin name:" msgstr "BÅ‘vítmény neve:" msgid "Insert plugin name" msgstr "Adja meg a bÅ‘vítmény nevét" msgid "Preferences" msgstr "Beállítások" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Kiszolgáló, profil és Compiz beállítórendszer egyéb belsÅ‘ beállításainak " "szerkesztése." msgid "About" msgstr "Névjegy" msgid "About CCSM..." msgstr "CCSM névjegye…" msgid "Profile & Backend" msgstr "Profilok és kiszolgálók" msgid "Plugin List" msgstr "BÅ‘vítmény lista" msgid "Filter your Plugin list" msgstr "BÅ‘vítménylista szűrése" #, python-format msgid "Screen %i" msgstr "%i képernyÅ‘" msgid "Screen" msgstr "KépernyÅ‘" msgid "Category" msgstr "Kategória" msgid "Advanced Search" msgstr "Haladó keresés" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Nincs találat. \n" "\n" " A szűrÅ‘ („%sâ€) nem adott találatot." msgid "Configure Compiz with CompizConfig" msgstr "Compiz beállítása a CompizCOnfig programmal" #~ msgid "Open file…" #~ msgstr "Fájl megnyitása…" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Lehetséges összeférhetetlenségek keresése. Kérem várjon." #~ msgid "Value (%s)" #~ msgstr "Érték (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s beállítás értéke: %(value)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Nem kezelt listatípusok: %s a következÅ‘höz: %s" #~ msgid "Actions" #~ msgstr "Műveletek" #~ msgid "Name" #~ msgstr "Név" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/ru.po0000644000015301777760000003644012321343002022521 0ustar pbusernogroup00000000000000# translation of ccsm_new.po to Russian # Denis Rakhmangulov , 2007. # Dimitriy Ryazantcev , 2008. # Translation of CCSM to ru # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm packages. msgid "" msgstr "" "Project-Id-Version: ccsm_new\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-03-10 21:37+0100\n" "Last-Translator: Denis Rakhmangulov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 1.1.0\n" "X-Poedit-Language: Russian\n" "X-Poedit-Country: RUSSIAN FEDERATION\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Ðовое значение Ð´Ð»Ñ Ð·Ð°ÐºÑ€ÐµÐ¿Ð»ÐµÐ½Ð¸Ñ %(binding)s Ð´Ð»Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ %(action)s в " "модуле %(plugin)s конфликтует Ñ Ð´ÐµÐ¹Ñтвием %(action_conflict)s " "Ð¼Ð¾Ð´ÑƒÐ»Ñ %(plugin_conflict)s.\n" "Ð’Ñ‹ хотите отключить %(action_conflict)s в модуле %(plugin_conflict)" "s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Отключить %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Ðе уÑтанавливать %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "УÑтановить %(action)s вÑе равно" msgid "key" msgstr "ключ" msgid "button" msgstr "клавиша" msgid "edge" msgstr "край" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Ð’Ñ‹ пытаетеÑÑŒ иÑпользовать возможноÑть %(feature)s, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ " "предоÑтавлена ни одним модулем.\n" "Ð’Ñ‹ вÑе равно хотите иÑпользовать Ñту возможноÑть?" #, python-format msgid "Use %(feature)s" msgstr "ИÑпользовать %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Ðе иÑпользовать %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Ð’Ñ‹ пытаетеÑÑŒ воÑпользоватьÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтью %(feature)s которую " "предоÑтавлÑет %(plugin)s.\n" "Этот модуль ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½.\n" "Ð’Ñ‹ хотите включить %(plugin)s, чтобы Ñделать возможноÑть доÑтупной?" #, python-format msgid "Enable %(plugin)s" msgstr "Включить %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Ðе включать %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "ÐÐ°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ %(bindings)s Ð¼Ð¾Ð´ÑƒÐ»Ñ %(plugin)s конфликтуют Ñ " "другими модулÑми. Ð’Ñ‹ хотите разрешить Ñти конфликты?" msgid "Resolve conflicts" msgstr "Разрешить конфликты" msgid "Ignore conflicts" msgstr "Игнорировать конфикты" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Модуль %(plugin_conflict)s предоÑтавлÑет возможноÑть %(feature)s, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑƒÐ¶Ðµ предоÑтавлена %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Отключить %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Ðе включать %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "Модуль %(plugin_conflict)s конфликтует Ñ %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s требует возможноÑть %(feature)s, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ " "предоÑтавлена Ñледующими модулÑми:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Включить Ñти модули" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s требует модуль %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Включить %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s предоÑтавлÑет возможноÑть %(feature)s, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ " "требуетÑÑ Ð¼Ð¾Ð´ÑƒÐ»Ñм %(plugin_list)s." msgid "Disable these plugins" msgstr "Отключить Ñти модули" #, python-format msgid "Don't disable %(plugin)s" msgstr "Ðе отключать %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s требуетÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÑŽ %(plugin_list)s." msgid "General" msgstr "Общие" msgid "Accessibility" msgstr "Специальные возможноÑти" msgid "Desktop" msgstr "Рабочий Ñтол" msgid "Extras" msgstr "ДополнениÑ" msgid "Window Management" msgstr "Управление окнами" msgid "Effects" msgstr "Эффекты" msgid "Image Loading" msgstr "Загрузка изображениÑ" msgid "Utility" msgstr "Утилиты" msgid "All" msgstr "Ð’Ñе" msgid "Uncategorized" msgstr "Ðе категоризировано" msgid "N/A" msgstr "Ðе доÑтупно" msgid "Reset setting to the default value" msgstr "СброÑить наÑтройку на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию" msgid "Edit" msgstr "Изменить" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "МногоÑтрочные наÑтройки. Ð’Ñ‹ можете дважды щелкнуть Ñтроку Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ " "значений." #, python-format msgid "Edit %s" msgstr "Изменить %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ÑвлÑетÑÑ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ‹Ð¼ Ñочетанием клавиш" msgid "Disabled" msgstr "Отключено" msgid "Enabled" msgstr "Включено" msgid "Grab key combination" msgstr "Считать комбинацию клавиш" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ°" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "ИÑпользование Button1 без модификаторов может предотвратить любой левый клик " "и Ñто иÑпортит Вашу конфигурацию. Ð’Ñ‹ дейÑтвительно хотите уÑтановить клавишу " "\"%s\" на Button1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¼Ð°Ñка краÑ" msgid "None" msgstr "Ðет" msgid "CompizConfig Settings Manager" msgstr "Менеджер наÑтройки CompizConfig" msgid "Plugin" msgstr "Модуль" msgid "Please press the new key combination" msgstr "ПожалуйÑта, нажмите новую комбинацию клавиш" msgid "Window Title" msgstr "Заголовок окна" msgid "Window Role" msgstr "Роль окна" msgid "Window Name" msgstr "Ð˜Ð¼Ñ Ð¾ÐºÐ½Ð°" msgid "Window Class" msgstr "КлаÑÑ Ð¾ÐºÐ½Ð°" msgid "Window Type" msgstr "Тип окна" msgid "Window ID" msgstr "ID окна" msgid "And" msgstr "И" msgid "Or" msgstr "Или" msgid "Edit match" msgstr "Изменить ÑоответÑтвие" #. Type msgid "Type" msgstr "Тип" #. Value msgid "Value" msgstr "Значение" msgid "Grab" msgstr "Считать" #. Relation msgid "Relation" msgstr "Отношение" #. Invert msgid "Invert" msgstr "Инвертировать" msgid "Browse..." msgstr "Обзор..." msgid "Images" msgstr "ИзображениÑ" msgid "File" msgstr "Файл" msgid "Open directory..." msgstr "Открыть каталог..." msgid "Open file..." msgstr "Открыть файл..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Это менеджер наÑтроек Ð´Ð»Ñ ÑиÑтемы ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ CompizConfig." msgid "translator-credits" msgstr "" "Denis Rakhmangulov \n" "Дмитрий РÑзанцев \n" "ÐлекÑандр ÐœÑƒÑ€Ð°Ð²ÑŒÑ " msgid "An error has occured" msgstr "Произошла ошибка" msgid "Warning" msgstr "Предупреждение" #, python-format msgid "Enable %s" msgstr "Включить %s" msgid "Filter" msgstr "Фильтр" #, python-format msgid "Search %s Plugin Options" msgstr "ИÑкать %s опции модулÑ" msgid "Use This Plugin" msgstr "ИÑпользовать Ñтот модуль" msgid "Search Compiz Core Options" msgstr "ИÑкать опции Compiz Core" msgid "Error" msgstr "Ошибка" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Введите фильтр.\n" "Щелкните на иконке клавиатуры Ð´Ð»Ñ ÑÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ð¾Ð³Ð¾ Ñлова, по которому " "иÑкать." msgid "Search in..." msgstr "ИÑкать в..." #. Options msgid "Short description and name" msgstr "Кратком опиÑании и наименовании" msgid "Long description" msgstr "Подробном опиÑании" msgid "Settings value" msgstr "Значении наÑтроек" msgid "Group" msgstr "Группа" msgid "Subgroup" msgstr "Подгруппа" #. Notebook msgid "Settings" msgstr "ÐаÑтройки" msgid "Loading Advanced Search" msgstr "ЗагружаетÑÑ Ñ€Ð°Ñширенный поиÑк" msgid "Add a New Profile" msgstr "Добавить новый профиль" msgid "Remove This Profile" msgstr "Удалить Ñтот профиль" msgid "Default" msgstr "По умолчанию" msgid "Profile" msgstr "Профиль" msgid "Import" msgstr "Импортировать" msgid "Import a CompizConfig Profile" msgstr "Импортировать профиль CompizConfig" msgid "Import as..." msgstr "Импортировать как..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Импортировать профиль CompizConfig как новый профиль" msgid "Export" msgstr "ЭкÑпортировать" msgid "Export your CompizConfig Profile" msgstr "ЭкÑпортировать Ваш профиль CompizConfig" msgid "Reset to defaults" msgstr "СброÑить на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "СброÑить Ваш профиль CompizConfig на общие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию" msgid "Backend" msgstr "Формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек" msgid "Integration" msgstr "ИнтеграциÑ" msgid "Enable integration into the desktop environment" msgstr "Включить интеграцию в окружение рабочего Ñтола" msgid "Profiles (*.profile)" msgstr "Профили (*.profile)" msgid "All files" msgstr "Ð’Ñе файлы" msgid "Save file.." msgstr "Сохранить файл.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Хотите ли вы пропуÑтить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию, ÑкÑÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€ÑƒÑ Ð²Ð°Ñˆ профиль?" msgid "Open file.." msgstr "Открыть файл.." msgid "Enter a profile name" msgstr "Введите наименование профилÑ" msgid "Please enter a name for the new profile:" msgstr "ПожалуйÑта введите наименование нового профилÑ:" msgid "Backend not found." msgstr "Формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек не найден." #. Auto sort msgid "Automatic plugin sorting" msgstr "ÐвтоматичеÑÐºÐ°Ñ Ñортировка модулей" msgid "Disabled Plugins" msgstr "Отключенные модули" msgid "Enabled Plugins" msgstr "Включенные модули" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Ð’Ñ‹ дейÑтвительно хотите отключить автоматичеÑкую Ñортировку модулей? Это " "отключит разрешение конфликтов. Ð’Ñ‹ можете Ñто Ñделать только еÑли знаете, " "что делаете." msgid "Add plugin" msgstr "Добавить модуль" msgid "Plugin name:" msgstr "Ðаименование модулÑ:" msgid "Insert plugin name" msgstr "Введите наименование модулÑ" msgid "Preferences" msgstr "УÑтановки" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Конфигурировать формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек, профиль и другие внутренние " "наÑтройки иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑиÑтему конфигурации Compiz." msgid "About" msgstr "О программе" msgid "About CCSM..." msgstr "О CCSM..." msgid "Profile & Backend" msgstr "Профиль и формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек" msgid "Plugin List" msgstr "СпиÑок модулей" msgid "Filter your Plugin list" msgstr "Отфильтровать Ваш ÑпиÑок модулей" #, python-format msgid "Screen %i" msgstr "Экран %i" msgid "Screen" msgstr "Экран" msgid "Category" msgstr "КатегориÑ" msgid "Advanced Search" msgstr "РаÑширенный поиÑк" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Ðе найдено Ñовпадений. \n" "\n" " Ваш фильтр \"%s\" не Ñовпал ни Ñ Ñ‡ÐµÐ¼." msgid "Configure Compiz with CompizConfig" msgstr "ÐаÑтройка Compiz Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ CompizConfig" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/po/he.po0000644000015301777760000003207712321343002022471 0ustar pbusernogroup00000000000000# ccsm he translation. # Copyright (C) 2008 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Yotam Benshalom . # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-09-07 05:37+0200\n" "Last-Translator: Yotam Benshalom \n" "Language-Team: Yotam Benshalom \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "הערך החדש של הצירוף %(binding)s לפעולה %(action)s בהתקן %(plugin)" "s מתנגש ×¢× ×”×¤×¢×•×œ×” %(action_conflict)s בהתקן %(plugin_conflict)" "s .\n" "×”×× ×‘×¨×¦×•× ×š לנטרל ×ת %(action_conflict)s בהתקן %(plugin_conflict)" "s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "נטרל ×ת %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "×ל תקבע צירוף ל%(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "קבע צירוף ל%(action)s בכל ×–×ת" msgid "key" msgstr "מקש" msgid "button" msgstr "כפתור" msgid "edge" msgstr "קצה מסך" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "נסית להשתמש בתכונה %(feature)s ×שר ××™× ×” provided by נתמכת בידי " "×©×•× ×”×ª×§×Ÿ.\n" "×”×× ×‘×¨×¦×•× ×š להשתמש בה בכל ×–×ת?" #, python-format msgid "Use %(feature)s" msgstr "השתמש ב%(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "×ל תשתמש ב%(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "נסית להשתמש בתכונה %(feature)s ש×ותה מספק ההתקן %(plugin)s.\n" "ההתקן מנוטרל כרגע.\n" "×”×× ×‘×¨×¦×•× ×š להפעיל ×ת ההתקן %(plugin)s כדי ל×פשר תכונה זו?" #, python-format msgid "Enable %(plugin)s" msgstr "הפעל ×ת %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "×ל תפעיל ×ת %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "כמה צימודי %(bindings)s של ההתקן %(plugin)s ×ž×ª× ×’×©×™× ×¢× ×”×ª×§× ×™× ×חרי×. " "×”×× ×‘×¨×¦×•× ×š לפתור התנגשויות ×לה?" msgid "Resolve conflicts" msgstr "פתור התנגשויות" msgid "Ignore conflicts" msgstr "×”×ª×¢×œ× ×ž×”×ª× ×’×©×•×™×•×ª" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "ההתקן %(plugin_conflict)s מספק ×ת התכונה %(feature)s ש×ותה " "מספק ×’× %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "נטרל ×ת %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "×ל תפעיל ×ת %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "ההתקן %(plugin_conflict)s מתנגש ×¢× %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s זקוק לתכונה %(feature)s המצויה ×‘×”×ª×§× ×™× ×”×‘××™×:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "הפעל ×”×ª×§× ×™× ×לה" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s זקוק להתקן %(require)s." #, python-format msgid "Enable %(require)s" msgstr "הפעל ×ת %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s כולל ×ת התכונה %(feature)s שלה ×–×§×•×§×™× ×”×”×ª×§× ×™× %" "(plugin_list)s." msgid "Disable these plugins" msgstr "נטרל ×”×ª×§× ×™× ×לה" #, python-format msgid "Don't disable %(plugin)s" msgstr "×ל תנטרל ×ת %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)sנחוץ ×œ×”×ª×§× ×™× %(plugin_list)s." msgid "General" msgstr "כללי" msgid "Accessibility" msgstr "נגישות" msgid "Desktop" msgstr "שולחן עבודה" msgid "Extras" msgstr "תוספות" msgid "Window Management" msgstr "ניהול חלונות" msgid "Effects" msgstr "×פקטי×" msgid "Image Loading" msgstr "טעינת תמונות" msgid "Utility" msgstr "עזרי×" msgid "All" msgstr "הכל" msgid "Uncategorized" msgstr "שונות" msgid "N/A" msgstr "×œ× ×–×ž×™×Ÿ" msgid "Reset setting to the default value" msgstr "חזרה לברירת המחדל" msgid "Edit" msgstr "עריכה" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "הגדרות מרובות רשימות. ניתן להקליק הקלקה כפולה על שורה כדי לערוך ×ת הערכי×." #, python-format msgid "Edit %s" msgstr "עריכת %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ×ינו קיצור דרך תקין" msgid "Disabled" msgstr "מנוטרל" msgid "Enabled" msgstr "פועל" msgid "Grab key combination" msgstr "יירט צירוף מקשי×" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ×ינו כפתור תקין" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "שימוש בכפתור מס' 1 עלול למנוע ממך להפעיל קליק שמ×לי ובכך לשבש ×ת פעולת " "המערכת שלך. ×”×× ×תה בטוח שברצונך להצמיד ×ת הכפתור \"%s\" לכפתור מס' 1?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" ×ינו מסיכת קצה תקינה" msgid "None" msgstr "לל×" msgid "CompizConfig Settings Manager" msgstr "מנהל הגדרות CompizConfig" msgid "Plugin" msgstr "התקן" msgid "Please press the new key combination" msgstr "×× × ×œ×—×¥ על צירוף ×”×ž×§×©×™× ×”×¨×¦×•×™" msgid "Window Title" msgstr "כותרת החלון" msgid "Window Role" msgstr "תפקיד החלון" msgid "Window Name" msgstr "×©× ×”×—×œ×•×Ÿ" msgid "Window Class" msgstr "מחלקת החלון" msgid "Window Type" msgstr "סוג החלון" msgid "Window ID" msgstr "מזהה החלון" msgid "And" msgstr "וג×" msgid "Or" msgstr "×ו" # ×× ×™ ×œ× ×‘×˜×•×— ×›×ן. למה הכוונה? msgid "Edit match" msgstr "הת×מת עריכה" #. Type msgid "Type" msgstr "סוג" #. Value msgid "Value" msgstr "ערך" msgid "Grab" msgstr "יירוט" #. Relation msgid "Relation" msgstr "קשר" #. Invert msgid "Invert" msgstr "היפוך" msgid "Browse..." msgstr "עיון..." msgid "Images" msgstr "תמונות" msgid "File" msgstr "קובץ" msgid "Open directory..." msgstr "פתיחת ספריה..." msgid "Open file..." msgstr "פתיחת קובץ..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "זהו מנהל הגדרות עבור מערכת בקרת התצורה של CompizConfig." msgid "translator-credits" msgstr "מתרגמי×" msgid "An error has occured" msgstr "חלה שגי××”" msgid "Warning" msgstr "×זהרה" #, python-format msgid "Enable %s" msgstr "הפעל ×ת %s" msgid "Filter" msgstr "מסנן" #, python-format msgid "Search %s Plugin Options" msgstr "חפש ב×פשרויות ההתקן %s " msgid "Use This Plugin" msgstr "השתמש בהתקן ×–×”" msgid "Search Compiz Core Options" msgstr "חפש ב×פשרויות הליבה של קומפיז" msgid "Error" msgstr "שגי××”" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "הזן מסנן.\n" "הקלק על תמונת המקלדת כדי ליירט ×ת הכפתור שעליו יש לבצע חיפוש." msgid "Search in..." msgstr "חפש בתוך..." #. Options msgid "Short description and name" msgstr "תי×ור קצר וש×" msgid "Long description" msgstr "תי×ור מפורט" msgid "Settings value" msgstr "ערך ההגדרות" msgid "Group" msgstr "קבוצה" msgid "Subgroup" msgstr "תת-קבוצה" #. Notebook msgid "Settings" msgstr "הגדרות" msgid "Loading Advanced Search" msgstr "טוען חיפוש מתקד×" msgid "Add a New Profile" msgstr "הוספת פרופיל חדש" msgid "Remove This Profile" msgstr "הסרת פרופיל ×–×”" msgid "Default" msgstr "ברירת מחדל" msgid "Profile" msgstr "פרופיל" msgid "Import" msgstr "ייבו×" msgid "Import a CompizConfig Profile" msgstr "×™×™×‘×•× ×¤×¨×•×¤×™×œ CompizConfig" msgid "Import as..." msgstr "×™×™×‘×•× ×›..." msgid "Import a CompizConfig Profile as a new profile" msgstr "×™×™×‘×•× ×¤×¨×•×¤×™×œ CompizConfig כפרופיל חדש" msgid "Export" msgstr "ייצו×" msgid "Export your CompizConfig Profile" msgstr "×™×™×¦×•× ×¤×¨×•×¤×™×œ ×”-CompizConfig שלך" msgid "Reset to defaults" msgstr "חזרה לברירת המחדל" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "החזרת פרופיל ×”-CompizConfig שלך לברירת המחדל הגלובלית" msgid "Backend" msgstr "תשתית" msgid "Integration" msgstr "השתלבות" msgid "Enable integration into the desktop environment" msgstr "השתלב בסביבת שולחן העבודה" msgid "Profiles (*.profile)" msgstr "×¤×¨×•×¤×™×œ×™× (*.profile)" msgid "All files" msgstr "כל הקבצי×" msgid "Save file.." msgstr "שמירת קובץ..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "×”×× ×‘×¨×¦×•× ×š לדלג על ×פשרויות שנקבעו לברירת המחדל בעת ×™×™×¦×•× ×”×¤×¨×•×¤×™×œ שלך?" msgid "Open file.." msgstr "פתיחת קובץ..." msgid "Enter a profile name" msgstr "הזן ×©× ×¤×¨×•×¤×™×œ" msgid "Please enter a name for the new profile:" msgstr "× × ×œ×”×–×™×Ÿ ×ת ×©× ×”×¤×¨×•×¤×™×œ החדש:" msgid "Backend not found." msgstr "תשתית ×œ× × ×ž×¦××”." #. Auto sort msgid "Automatic plugin sorting" msgstr "הסדרת ×”×ª×§× ×™× ×וטומטית." msgid "Disabled Plugins" msgstr "×”×ª×§× ×™× ×ž× ×•×˜×¨×œ×™×" msgid "Enabled Plugins" msgstr "×”×ª×§× ×™× ×¤×•×¢×œ×™×" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "×”×× ×‘×¨×¦×•× ×š לנטרל ×ת הסדרת ×”×”×ª×§× ×™× ×”×וטומטית? הדבר ינטרל ×’× ×ת הטיפול " "בהתנגשויות. ×ין לעשות ×–×ת ×œ×œ× ×”×‘× ×ª ההשלכות." msgid "Add plugin" msgstr "הוספת התקן" msgid "Plugin name:" msgstr "×©× ×”×”×ª×§×Ÿ:" msgid "Insert plugin name" msgstr "הזן ×©× ×”×ª×§×Ÿ" msgid "Preferences" msgstr "העדפות" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "עריכת תצורת התשתית, הפרופיל וההגדרות הפנימיות של מערכת התצורה של קומפיז." msgid "About" msgstr "×ודות" msgid "About CCSM..." msgstr "×ודות CCSM..." msgid "Profile & Backend" msgstr "פרופיל ותשתית" msgid "Plugin List" msgstr "רשימת התקני×" msgid "Filter your Plugin list" msgstr "סנן ×ת רשימת ההתקני×" #, python-format msgid "Screen %i" msgstr "מסך %i" msgid "Screen" msgstr "מסך" msgid "Category" msgstr "קבוצה" msgid "Advanced Search" msgstr "חיפוש מתקד×" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "×œ× × ×ž×¦×ו הת×מות. \n" "\n" " המסנן \"%s\" ×ינו תו×× ×œ××£ ×חד מהפריטי×." msgid "Configure Compiz with CompizConfig" msgstr "ערוך ×ת תצורת קומפיז בעזרת CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "בודק התנגשויות ×פשריות, × × ×œ×”×ž×ª×™×Ÿ" compiz-0.9.11+14.04.20140409/compizconfig/ccsm/TODO0000644000015301777760000000000012321343002021564 0ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/0000755000015301777760000000000012321344021022355 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/display.png0000644000015301777760000002421112321343002024526 0ustar pbusernogroup00000000000000‰PNG  IHDRÄÄÀ¦Žk(PIDATxÚíœÅõÇgtýÎç»s/`cLh¡ãÆ@Œ „B5½„b05”Ÿên„Ð[PŠéšé`š 6pÅ×O]šÿÌêdm™ºEÒÝÍûXÖI;Z­¤÷Ýß{SÞB„ЦM[Æ B›6 „6mmÚ4Ú´i ´iÓ@hӦЦM¡M›B›6 „6mmÚ4Ú´õe n˜s-Äw»”––…o“ÓéôØd29 ï¯D­Úòe¡P(‰oøÖ ø,=ŠŸþïŸ.¼´-/@`J𛟎oWMœ0±bûÉ;T :,TQ^JJJõ/¤-¯Fü7•J‚D"ÚÛÛÁòo–G?ýäãP*z5ŸÁø40 0 SËÊÊÜz«m†ÿz÷=ªB!𛬠+>¸´þ…z¤¾»íX ûþÎïÆ÷ ‡¨„qÑ (Ç'fr¿fÍôÌsOG#‘ÈsØGÃ`tû Äs¯;¶²²ò¯G~Tõ°¡ÃAOO7!¡½¿h@(4 ùýþŽªªPQQ >ùôãÄËK_ü+È ÅJ_€˜·àÆ ÆŒ{õ¡VIÞ8î:תPŒ0˜­¤¤ \ššÑC?؉•b2†â;O@à0i›qŽ{÷ð?Yå‡H1íý†"A¼s!¨­­ëÖ5£z`e"™Ø†>qÀ0”UUU}qÊIÜ$Nù‚¶âa ‡H2PÔ×!áSü•W—>vî9é ˆ¹óo¸fÿý¼pâÆ›”õôti´*ô U  Ÿ·þí–pWWç$¬_+Õaòøñ½qØ¡‡WvuuèœA'Î}JhÇ3hP-hllD?ùèSX%RbÁ¢¹/üñÔ3öL¥R ‘p†JÓN¾ „£º—I[ñÚ»w`yLzŸ†‚Å7-ˆÆb±‘X%:¥€ÀêP³ÁØ [q"]NÔf;Ÿx'¨®¯4â3mÚŠÍZ»@«¯o¯½þjøýÞ›‰xLˆƒØÿÀ‡pîP‰„¹@œ{ø.8> YwJÏlèIŒBbäöµ´†õj(wŒô%?‹ü+ý¹U>£ô{KîSò;Sùà^¾ókî^ ~ü¡ Duu hmm<öðý8l:FˆËO9é´«ÊÊÊ kð- Ä•'Îp¡M[!íº{^aQVVnŒfÿíö[¿ž}öù›I1áÜ»N?íÌãȘC:âqù {€ÒB[ñØõ÷½Ê‚Ì·«­ –ܼ°ù¼ÙŽbÑ’ù/Ì:söžíÌ^•,—7”j…ÐVDvãý¯1€0† Jf_Ä.<ÿâJY –ž}Ö¹¿no'3hù@\rì¯5ÚŠÊæ>ð:bÇ$iÀI5ôˆ‹gî®ÐVT6ïÁ7 ÄEGï¦ÐVT¶àŸoˆ 1%!=¡­xláÃoŸ˜@ Ĩà€8ÿÈ]5ÚŠÊ?ò6Ô«qÞÓ4ÚŠÊ–<úŽ d ™Ôx±{{{+óM³@Ìþ©Ö@h+»ù±ÿ™€@”"@ Î>lªVmEe}âÝ^ Žg$Õ °…0ÈW fý~g „îeÒVmEe·?õ^á€8í _i…ÐVTvÇ¿ß/§þnŠB[QÙÏ|à;¯b v“âä§è^&mEew?÷aá€8é€ô8„¶"bø™q÷#F‘J”ØõQ)"í+'ì?Y‡LÚŠÊîý³› ÄñûmoT3Ц­Xìþÿ~dÂîâqì>“4ÚŠÊ|ñcˆÿÝIÏ!☽·Ó@h+*ûçKŸˆ£öÚN÷2i+*{øåO}â5 Ä®2@±ç¶mEeÿZúh\ËbμëQ:.Ã@¤|âðÛh ´•=òÊç…â°=¶Ö@h+*{ìÕ/ ġӷ%º¾«Øàúÿ<R-€= í‰×¿,‡ìþK  }qrÚ>üðzê žzã«ÂqÐn[ök 8=d9µ¼ûKè‚ÏJ‚ú­Ðw~æ­å P/£•x1MˆßNÛ¢ßs§}5(ü _eÞ–¿îÝ‚±û¤ †Lõô³¶=bµc9»Ýã…CsPÉ÷=4DªÄ¨Á@ËL›z¢™œ ©µÄÖ÷!G(evxÞ664ýˆÝ¶ È ‘ìŽÏÉxùɳ0L’‰˜‚N¤1±Â§ ¤'¨ çMm]Æø@ÎÁ=¯0ogÂÀ¡‚#o@dÛO=é.ˆiÛläkÈ!+ôa‡A4(¨JÀôgȇBåBë „÷3‘@Š#ÖfÈOJºH›ÚzŒü€„DVçGRéj`%_`äsÛ,S·ï‹B8C#k®§‡ˆ"AzOS)è¡’²ƒ}HR€ÆC4‘Ím™¢x"%éüe°ÁÀT sâmú;0‚Ö& ÄN[ód&Çd¤§ãäPp6´‡.ǤRhè&7@*J#s…²½DFHÄp~ nöÄ›§Š0 ˆì.GŽTâM ÄTëÀ²@ì¸å†º™,g|ÈR ÈoËH¦¥i(¡ â³ãÕR=±þŒÌñapn%ÎOzŠZ»Â g„0H„M2ù„ fàÚ°*›¿pN*™LVc âÒ@´¶¶0ß0 Ä”-6PWÈÁ™ 3@Ⱥ.+Õ)¡(Ê¡¥¡ÈC A…!…[ÒMÚÜ6¦H;B,d »%C’pHæò`äÚºQ‹,´— Ä›ody°†G™ C¢¶t@ §¯ÔÙÓÄ€B¢û*!g¤‹´çd]*…è!–* 8œJÁ…}»Û0Šñά"@ ¶ßl,Š˜Ö+d8= œá­ªÁJ¦!#‚4‡¶CÙI0M)ä{aýQ Eè‰$@SGØXG€LN/ ƒó9ëc¾RȆPtøÛs0ÈBQ0 &m:†«þ0f¦£Ãõê™~Ùs}Ê…J’2¨ †{©È…&d"I”#ñ¤Ãé…00q ƒ*ò0°rŽ¢bÛMF3ç2eŸæ%Ê–³;'AvœÍ¡3p¨d)…@Fïd ’¸„óÚ=mú­È¢¶®¨qK¦ÓTœ0PžGˆÂ™<ÁÂà^- ÄÖG9gRBèôü0À©€¥Çå£Ë2mH…W ÕHå· chÃj@zÇ዆õí°ðr Zò$oc v’â—FRǬÉ0-)¦« ö™ß¶:!Oå l(DÉ´oQþ‰º"qC ¢¦° àA°þ‘ão–³Ûà‘U®Z°{¢è@äªnôQƒˆù ÄÈu»Bz*µ×:ÇhJ!ã î…2na{-dåöP ²:ò é!jÇ rGwÌP£ŸýéKâd`°FXÈñ˜  ³£:Àp* ;d¨³/;°VÝ ˆÍÇ7€¦öîK+ìPȦœÄŽóR1‡CÜàJ™i»Üv†‘ „Æ‚{ĵ]Z-xp°`ý- ±€!{ŸQB¦ØlÜ0{ËÐ@À€‚–?:´|€29œœ2ÿ‰ö~ö Þ ÷¥1Ô‚ùº# ÐŽ󊸎ÎéE¼ðÉ¡ rpˆ0;;=”¢Ã ˆŽBõÇ2rˆ€€¨Á@l²á°LÈ$PYg~Žœ¥òº³S_C˜]¿Y¶ù]Ètk£ Vúd$šÁíl‰(Ï#¶‚Ða@rÛ+dò ¾j8»d3ÛÖýÜY ªÀÄ ‡` B¶D™®ÌÄÙ”+@êY:Â'öä?Hëpbbwe» 0òlöø†\€D’cR—ˆ„GÒƒr"ÜóT@(ÏÛæ  ž`0AÑò“¿@¼ƒØQÄ †*0aÌ‹B¬w(ZïU D `wz§:5€,G¶;<ä­£cåέDÈ*4%YdØ‘-Méöc`0UB& ”Pʦ-?upX¸x^2×b ¢>Q 6ÓЛT[8rÈT óð`(… Ú¤@¥€\§@ÁQ ó³ ìüdZE8–ðyM±†•_4ÿX j‡Tƒ G5ôÎe‚Ö³3d@Á ‘a‘C@(P0C& @ ¥`® B †“ãžh¢7Iö¾+bÄUH*ðLx€C(1Í?¶ˆ Dá$Ж4ØC"Hë1bæ4°>çpn h³mɰ=A§.ÀfÕƒ‚ÆZ’ªÔäoèÛBk$ÄÔÚIÔÑ\Ûzg;¬ež6G”W‰<Á`‚¢im€<´Œ^—QÈP p•ÂÑû)ÐT„ s²•ÀîÔö5$7ˆ%2åÙ3uŠÄõdåà@Ì‘k9èÏIÃ`Q Ó߇A EÓÚ¶|0wc ÑÃj39 AA;ëS `‚CÙ§-‘¦ÀƒÂ6ÕÒg Rº‰íŒŒP(šHƒDïzdÈÄð«0 ¯è° Ö¾T&îaPD:ŸPƒ¢1@d«nÜ ê0# ìg}jhU °â•, !©NÇ& @rƒ¸¥rµ\Ñ4/`ˆªoçÒ0ð’k0’P4®iõˆÅ7-øßÙgû++È2a 0 #j‰™ì=F¬0Iäð´°EU èêà<ëzϘi–n2…  iãû‚ÌðI •T‰KËÀ`}Ž—S˜úù•T‚’_0ÄîðÒÀ(@ñ³ƒ1@8€]NÎ1 ’ ¸0ÈÍ ÜÀH¨`y*¾K§Ó B ‡CihE¬“m†ëJ9TŒ q”qŸGHF)$À(Jœpüüú €hfþÃkÁºjc`Î9n@é9‚P:ðœm Jèí€r@ _h"‰Œ y˜•À®(èó;¤êÈz™ãÀäàp†ó9y¬I3··È%dßao–b0¢*Óí iŽÌÊ!€ è³àöd±º|}ÎSö8³­8,"£ÇNXìJà‡Rø™\»A  |ƒA ûàÝO«é@í¤.“' hÝ|ˆúƒAÝ * QF {Sܨ 8§Ã3ò†*˜ßˆ„@I|#aQö¢6,Õðïyocsˆ>Ñ®”oèq½µ­ |8ì0ûŸV·X€0û°k Ö­kfþ& ê@]M…ÕI!Ý‘¡H ¨g}Û>€´…H lHd”eá:?¿” dTíBáeLΑ[È€èÛ ðÁ"“OHªˆ 4Ößãÿ~4awñÀ€hÀ@ ª)—ïQbÁÄÊÀZ€dL˜kC¦RÈB³ÌWI_œÄAÑcžªÙµ\¥ë)Q•B† AÃ@ÝC5~\ÕÞþ=‡pÄ»ˆ)B Fb ªÊ%Çœ÷5éOƒõ>{Æ0¾´tæ‚ÊìäAXëIËt…a0‡@dV³!QødzÌszÞýÚUÍ\ -™ŸˆÅbõˆ°@ÔƒêÊRf¾ rïpH¨·Èè 2‚“ÌKBÁZÇ- dWd÷/AA±cÄïg¢Ô>EÈ= r•/ØÊà'î»[sǸv% „ C0¥Œˆß ËË#¬ÎŸí Ê}qôð r»XY*ÄN„\ä pÙéJ+̹ÎužW%èω•Á îzšrï›;æµ+›(@ ^… ˆQˆ²RaÞ “L£ÞÿSDaÝá©3d¡ó˜VÎ:M5ø¦ô¹"aè$®§du|1 âÊ®ó (k,@ [È  ¬,¤2e:} £¢… 4"˜p()…­WË/(üêf¢b»€Á –£‹aàCæû5+²@ JC1%%Ð2YY2o†B vh$ÀG(X•ÿ\ŽÄå^% ý^ż Lˆ™Œ¤Ú³Îœ=…·Âb4‚ŒÊy•hyƒ»D\Åá=@9ÅÑ(=èPÈf´ ›8!–‰8¾ ÒêÜ%È.U„¥?¬h”¢Ñ#bÉÍ ß?ëŒs&+!£nà„Een•W(¨W>…´Kø2ÊP)AÌDñB'4ǧ-ÜqäÔ…;òP¨8¿4’ ö߈a£‡€P TT¹PIj Â>BmÃéÌì•{¼×úšm ÌúNÒPßap.¯ô….S/Iµc¿ò*QX xêàC¨ä<ëË'ײc!\ø,ã"Ö‘u_ îzÁÀºÐ¡\Yy‡’° °=¦'ÏüçsÍÈm‚M6ýðýÏbÌg!£*ªà*oP…ƒ3Ș;åÌcüMO â8+—¹ê'­$½ü£»¾ù„¢ZX_ÏduÁ€( ¹Î¬Ž¯žGø{‚!d¨‚Ϊ²PƒDå» P ™|P‰Õ߈á¤j ¹ƒ;Uð ꕇ‚Q߉  ÄI®uYõ”d`ðuv);€bµ«„XAüâ Äö¼ª»œ|OÁ¸ƒùÐIÊÑ%'ªLM—U vErs7¨×yãüí¥)ÕBU%èêÛ&bÉM ‘hd¢ÛȤˆ±$‡(Q“$à`@qb•É3´É€be5` œmÖQR—xÉ´§0É»*8ØVüåÂ$fUAna6JQf™pTÉ`MņA0ùŽЏ ™¬¹„uPï}Zõm @°ç2M3B¦¡êIµ„JPÃ$ŽJðÔ·jO˜?HôRÑJû «“C ¤D°` _wPJÃÎîV©ÑÔ]ØÛTUÁüóÉ!FØð ‚*!£ .’kžªICA½–;¤ Ù»Ä!a­oö²TSF%8aW܆M`ä ˆlói§˜€p7¸S ù0‰½­ jPØgázƒ¸‚5åZºjH«ƒ ±*8Ž] '´" c ¢²@ÜtË¢Ï<ýìIv ÌM=¡ ‚Ûp‰§2êàqY¬(W•„Ay¹¥”J¸ ŸdÃ&/y+çY)Rˆ›Æ#‘È0 D—2´ºL íºÂîU•pIB%ŠCû Þ¡`^{›¢ 4¼L±f«„uIªå»c]ƒ! DÖGòëP9 J|J¨Uº[åÕB~bMlô  6§—VÁXΕÂvœë•ßþhÂìǮ୘£Ávzë6aB­ ‚ÅéÅ]¯²j¡ªÎÏ/YÚŸ7yƒR’9ÉMŠ~“0©¦áC‚í:±¦A»ŒÀ¨Qc¸q†@äSÄI6-ð-Ïqµ<–™Cð‚¯ìþ~oá’Ì„·ÄÚµRØ€xëö™ÔMq¡42-“Xû•GÈ„M¼PÊÝ‚( J f„ª †ï@P&ýyÏèªfÂêãùB5w(0Þ”AFè P{ÅLP8ŸÖ)Ÿ[œ_®—‰™?¨†NX|ía’Âéß$‡¸éæÅñp$<Ñ)Ä2 Ävˆüát$ „{ Ž¡ú®¢ˆC&È(K#‚ _࡚KôÉ©@ Ô¤š·D—¤Z&¹–V†þšT*rÁw»òæ2I¡\p] ÄÑí )c6(èÝ®‚3ïîv-8Á‡N}k`Ž^o–dMÙ°Aè9ù¹Q˜©Ü…@®Á0€§©n`(DE†½MÝð‚²2ø9uƒ¢fdê†o@Ü|Ëâegœ>K orŸÛÅA>$Ôª“ûTÕA þ” ñå!ä¦p°ë¨ú1¹?ø:¹« j‹„„@ܲ8‡Gb :d€ø±­' úÚôo:¨V$—™é*µ¤Ziú·zÁ/_§K/ÊÏôï<0÷ö«BÊ.ô¨d.¨ö…«äh¶UIŽ“±@(@ “BP€(æ%¤nVÇÉ–Äd¬«¯k„Úª¹B/!U—üXBJS‹<a«ºÞ‹ ðŽ•^ O0@ê×ì éEB²•6ü(2 ÒíêO‘€€@Œâ^k]&^…BÇn‹”I•ŸQ(CêÍä,.ÀÛ&QqÃE+4xJ¡¨ ehdzÅx•AzËÐDSÌw?í>Ž&€6mÅjl Æ’"ñHTr¶ë¢%óßœuæì©mm-!$|c‰&Šæm‡ÞŽÇߣ~,(P'Ê«Ó"”ß÷&êOÖTÏ™w}ò¢ .)sl§9ü¼7.>í”3f%“1L&û Þ%¿0ôôô€——¾ Ö¬Y‰?~<øÍž¿ÕÕU€¡ äïýKKKA}ý°äæEÍç;p„7̹öÄ£Ž8ú¶úúúÒX,:T¡0Êðô¿ŸÆÎ_c‹ÇÁêÕ«A}]øíjUÈÊË+@eeøû?nû|öÙço% ÄŽ{LŸñêÖ[m]ÑÝÝ¥C¤Ž…|ïsçÏÛo? Q" ::ÚÁ|þ|Å•–¶wÝs—ãõÇ{¼qÏ}÷€t:mÙ6óè™FïŸV§ÕÔ Ñh <ðÐ}Ïc ö•¢ªnpÝÚ“O:µ‘L&‚aà©‚ù½Ÿ|ê)ÐÔÜŒ“¼ •Bàû+À¦›lØÏ@„B%E¬ …äÇO?ýDxù7ËOÁ õR@ôB±×/·Üêé}öÞ¯¼»»Óˆqµ*ø›8‡ÃðâK/‚—-¤±Zì€sˆ=±¤Wê\!jkJ|Ç]·¯Âþ¼1"- ±ù çÜ>yÒ3wÞy—ròAb±>“¥ð)å8+iUÈ…Bº©ð0ˆJ’Б$ÒƒÕ‚îînðØ„›ššŽÃ0ÿà[`•‡oµ*~„ï)¶ÅãqCáx‰.ûGp;ƒL‡ëeÐÛYV´ HŸ`ˆO†Ùõü=Qð?”àuL#L(ê, •4âϽ‡H/àçcâÜãD ˆsТÅó_ŽEãÓÛÚÚ{çBAË—Mû2Š"›Û9gœŸ·oh»X<«}®­¹½èx¬ç ùר§±g‡Bttµß‰ê'"ÀÉM¶m;JÜlL§Ð¬pOŸ…ÓB§¥;¤¼Óú„ÕIíùmèû¦àÜ7‰¿#±p¢½½íì\óDÈ;P€Àaß©dz~–TØÒ‹ÓòÎÊ^ÏȪNË\ äqßäqII)hniê GzHú¸¢q,HÃ[ËË+ª‰¸§³²¸=Th“? ømœ@”••ƒ5kWw†#áÃ1Ïk úG——•ßV^VUG>‹ Thã 2Íaåªï;»{º5ýˆ#kªý½¢¼²&3? *$°ùBüþÁ‘û|9 ¾þfygOXÑ8upmݢʊªÊx<–7 xÉn>€È.œr Ä·ß}ÓÓÚ¶îD ÄÈ~ÖË4¤aè¬Ò’2Í!ÜAïÅa'Õ~awZY Ü워A457¥¾ûþÛ«/ºà’«4ýÈ-™ÿúða#¦Aê¬(ç´´ØÚo ¼8­û}ÓöimO¦ûüM5ý'ز$TúÞvÛNªîè kÊ'Ù¤;¤Ùy2ßÄèâýˆ^'ãü´³»8„’;²½¢¢<ûü3Qü™7ÁyÄZ DP‡…snÝ`ƒq'©RÒÓÓ-yvUqZqÒª9»‚ƒ‚ý:ò<™ÇôéçŸÅV¬øîº ÎûÓUˆ¾¯•¡P¨yÊä‘îÖÜ(µŸ@¨;m0@i Dûζ!aS<ž/¼ôŸ¦D"1 «Ò@ôa»qîugÔÕÕÏÙn›í«ÉMöY($Âì6±âxÙÜÀ-4ì×ñFØeöM–¸>ÿßçº[ZZŽÀ@<£è»ê0µ´´ôŧì\E~ÛX,.PœÖ ø¯ógÈdoCº_»ººÁ3Ï=MÖl‡¡X¥è{0LÀ0,›ºó´ºŠò `Ïd{cü‹Ób¤RÅwß—zãÍ×WàЉ@Ñ£è;04à³Ú²m·ÙvÃQ#G‡ºº:}ÎÜ‘ §dÛ©rŽíöuücÂy(//o½ýfì«å_-ÇãûõÇ|¢ßaØ+Ã=›þb³ÚÍ7Û¼œ ,™—‹©ö´u6VÂíëÔ@²ÿíp¼­´´ <ûü¿Ã?ÿüó‡ 2ÇéG DñA@xï]QQq1>‹í°÷^ûT× ®3ªZ^%òÉ’BrC½Õ¤³Å]–2Î'í9H¬í~Q Å矖zë·Âø»¼.•JÝŠÁhÓ@Îù‡àÛh|ÛC0;ö^õõõÕS&O©7n¼±"NT‚3kY@r  ÞuÎmö«åxÉÙËãõ,ž§ÁïOÖJ¼ìãO>Š~ùå—†à“X1žÄ›_ë˪QÔ@\ßíŠC ß”„JöJ¦’c±óWáÇñšššäر”Œ3¶jĈ‘`pí`‚¬"äÃì%ÝíÏÛ(7]"س¸OŸNØ"Sâ¥Ì¨Ùµjõ*ðë»ñ}?N`%iÅŸ«7kÄ ¼Ž?ûkøïE‹ü5lvÉñÓãÇo·á¸šÃGÂÚÚAÆ™)ë\Ù°'sKõ)gêOFÂ(©ƒDþ&¥"É ()F@sKKbåÊ‘¦æ¦JÜîÌËŒ„BÒnœ{ÝL ýõàßRÓÐÐ`*ކ!Ë@°¾öq ¹ÉÐxLnä7\úÊÒÈŠ•߆¡ØC±N!V†­«ªªÞ>âGÖ‰e™Å<Ñú»r!¿éG-K¼÷Á{d?q«‚bóÎùéè#E de¦ikgê¯F 455‘ÅGKÏ=ç‚=4ÎpiN¸¾:å¤Óª2W-ÒŽÚTQlÅßÿq[,N×a•ˆi ¬@ì=qâÄí³×¾µd”$_Æ(È •î ÖZZ±#r“>üPgsKónˆ5V ŽÜvÛI·OÝiju8œ™Yl¯®­C¡þ Z¹q$r½·_z±óëo–ÿñ‚"ãôÆd k¯¿úÌ]§í6‡\è1 kÏé*èm'$±~ÿÃ÷#o¿ýöé—_våý½;D9vòïœs³ßX7£ÙÕ×üùâýöÝÿò'l Ép¿v¤þoÙEGÏ>ûÌåW^ñ—Ŧ/&mú¢h7BKº¨p|îíÚ뮞sÐï>yäÈQ€ß媩¿¹4[cS#xüñÇn»ìÒ+.å }óª*®ÀþŸ½ÈœùÞ58‡¸ãàƒ9`ØÐ¡ jo @´··ƒG{之.¼ä?€0ÝÒn”D ²Î.õšënø¿Û0Ž>QêôÄM±YÊP äµ~ïÕê•à‰'ê²K®˜åÑéeÛpUC'79óKCqñ¥ÕÐP~(J™ œÊø+Êíz:Õ:ø .è}Èö;ªìy;hýb ¿}WW÷ÝW_u͵]IIX¹†¬B¨„J®ÚŒ;¦bØða•ÄÉÈ-N‡R©´QªÂx ¸þ1 Ïü8{3DžO¥³ÛÉO`ìdÿÆ÷¡tf}¨ñÞäùt*Ýë¨ÆïgjßÛv=ô?FÐÚÜñ#Ûã̾̽hxÐúž5Ó ^(p:Äèq~ÅÙ.ÎÄAµÍG›4/ñv“CxÊ\´ r2]Â!“ã2»%ÿf%ÎÀ,@dþF ]š~ßÜ@„i™(¯½L…tV?œ™æ¼²Ï‰ž€è1 $H>€)TnÀI»é† j"T$NíÆ¹Eήô1‡ `ˆ{ á‚€I*7È;>õP¶¹9³»qx7‘XËBƒ€ à30"PÒ6lZGAç2Asq"5ÕðËùYgÖc ñœjhä7<x€¨ã$iV;T ÇìS…Êl€lhd×+ žÃ§%Ô >àlæs˜T ൒PäC!dÜmxÕ'œZÑ÷!uz¸þa4Ú´i ´iÓ@hӦЦM¡M[_²ÿÆÓaXe“wIEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/0000755000015301777760000000000012321344021023134 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/apps/0000755000015301777760000000000012321344021024077 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/apps/ccsm.svg0000644000015301777760000003527212321343002025554 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/apps/ccsm.png0000644000015301777760000000136112321343002025531 0ustar pbusernogroup00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÚ ›ë,qIDAT8˵•ÍOAÆŸ™Ý.¥Û-¤.)©1Š@ù8ikBbH¸`¼ú?/ijgÞ%1F/zò@c4{å£xÒ !ˆ M ýZ0Ý2;;´µ|4Þä9ì컿yò¼ÙàŒŠÀØØØŸÏw·üì¦cßlÛ~(€®ëOnÜjÝùUrí’óöøøø´ ^¯WžZHáÕû9×<¾S&„øåòBs£Ý—ôS˸¾9‡ æu£”°÷ƒüu¨Šk§étúXÇqà8Žkp™QqÌ9?𾌅×gâ˜s~ì‡Åb¥½Z”ÒCï…Yq^K–eáù‹§¨S|^Jb~aîPÏ !ˆÇú1¿0‡ŽÎ.„Ãa,¯,×—³©¥õõ5L¼{ÇqF!`cc²BQ(d÷õ ®åt=µ†‘‘Û˜š™c [Ûi4ƒ°J4­áHÇ'ž_Õ°³k"cõË PØÍCñ(0Íc•A̘Tÿ$‰\ÀôôdY‚Ö‘3³àÜFÁÌ£½ý2³3°m»çœVÀ’$¡–TUE¤í" Ã@!gB0€ YA6—Awo‰O3 „€R ˲<2lnn.&“ÉÞêÌ*µ^#K‹ËĶmb•,ÚÙÕQßj&Åâ.¢Ý]øh|`j½šåœOVßü<Çmð·¤áá¡þÑ£ÂmáP‰YˆÌ³‰g?Sé{RU£À;2««_ç{{úކη üZJP1ÑÒd¶·TÉíÙ`FæÚÕØëæ¦ 46Môtö½ŒÅ®ÿ ýœ¼Y/¿IEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/devices/0000755000015301777760000000000012321344021024556 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/devices/input-mouse.png0000644000015301777760000000220512321343002027546 0ustar pbusernogroup00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ¿çÇ*赎m[+Åÿd¥ 5²mÇŽ­Kñ¸àЉ[¶l\sBÈ:,Ö [t¬=vòäé û£YÅ€ d7lÞ°içÛïý…µ|‚Š¥B Œã+¶|¼|þÚw|p¢÷ýGWtpøðá”á›ñx|·5f‘×°®á¥ö'9Ó3HräÜâ¶ ‚/«“™“þ#»»»^pâ±ïZ[»K–´UgRiN\*‹9AÈöÕIÆ únL Oê0ظÿG—ÿ|èЧ/¦Òéï7mÜœÊf³„aˆ±†‹ƒœíŸ`Ý’Ï,¬Š…`hø{þü¹)/ÖØwàbEpWWW}U*qóõŽ7rÉd­C¤ ÀXËù‹—y¾}VkB­£ïRr¿Pà§Ÿu˜nݳç`q–7wynuüÈúõ¯Ô¤RÕ`-XKal”ßoÑÛw•tÂpýF/üù;ã¥"‹Öš|.ÇÊe+j4ÉOrÜÝÝ=?•NîÚµ»z¼4ÎÝÑ$’ƆFj³9âñRJŒ1Ìx3‹îÝAC>?)$§¿ýf 3ݼwïÁDýŠ ½·Öµ¯Yc©Igi˜×ˆ”b®RZk<ßÃXrµyêêê1Z3^*2=3ÂOÈ›;ã³`×MÄ·57/L¨ ÀZƒÖ!Žã ¥ƒ`­E›(®ÃP‡„a´”R„:¤©©©jðöííÀW€Ò Ú²5µ”&ŠHé€c Bj`±c0Æ µ.¯è= |å“I× +#^v-6õi€”#5BJ„epä:‚ë9¸ïûøJáù™t Ö’\ ¤µÖXk0 B£¥DJ ˆr)"°µ³.C”Š ¾òPÊG)!„*wšŒÆ30rwxy<ž`b¢„ãÄp'r,Äœ[­u¹¾A PJá+E2™dllŒ hˆµ´,*øzõÙ5ÏÅ'''™˜,¡E ¾òËGöð|ß÷ð¼hïùUÉ*2é ===“}×ú>üõjo?0íá•+Wÿno_½lôþHËÓO­ŽU%«™ñ§#ò 9,»4Fãº.ù|®ëráÂ%ohhø‡cGã”­û×ú®ŸmnYXóÖ¥n• õb~c ó©ËבËÕ‘«Í“«Í‘JgСáÎ;æÒ/—ü‘‘¡¯ùl_÷‰FîCÓ-Óѱ}UkÛâwªS©—%¢ÁZë<8¹ÊÉw§¦¦Îô_¿õÅ©S§ú€‰ŠCè¹@j¶u§|ÛÐ@øÀTùùþß±=êäIEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/devices/input-keyboard.png0000644000015301777760000000134612321343002030223 0ustar pbusernogroup00000000000000‰PNG  IHDRójœ qPLTEUªÿ€€€€€€t¢Ñ"+9GcŽk”¼Ml‹s™Ìg’¾Nm’pžÑ€„{c‰¯Sy™‚‚}‚‚}^…­a‡²r Ñe¹sŸÏr¡Ð…ˆ‚q Ð‚‚}‚‚}oœÊpËh‘½qžÎ~€zq·‰ƒm—Æ‡Š„qžÍm˜Æƒ…€o›ÊŠŒ†qÍržÍqÎrŸÎ‰Š„rŸÏˆ‰ƒržÎrŸÎqŸÎržÎ‡‰„‘’Œ’“…‡‚ržÏ…‡©ª¥ª«¦‚„~ƒ…ƒ…~ƒ}ƒ}µ¸±¸»³¹»´º½¶»¾·»¿·¿ÅºÂ¿ÃÄÁÈÉÅÓÖÐÔÕÒÔÖÒÕÖÒÕØÓרÕ×ÙÔØÙÕØÙרÚÕØÛÖÙÜ×ÚÜØÚÝØÚÝÙÝÞÚÝÞÛÝßÜßáÜßáÝàâÞâãàâäàãäáåæäåçäçèåèéçìíêíïìûûûüüûÿÿÿåݘ2OtRNS !(/124677;ABCIPW\ahl~€Œ”¢¦©ª²·ÀÁÊËÓÞÞÞááââæçèððñòôõöûûüþó‡ÕIDATÓc` GaVRQQÕ–@V7VVTcB–1³¶w°¶µµ¶Ô—Bfáâçãã•ÔqDÓÂ¥káèdeȃ&¬e"+ÀÉÁÆÈÀ o€œÕXÝ"£ÂÂRÃÒ0%,.,0ÚƒAÚ%?8,;¬0¬$¬4¬(,/,#8ßUŽAÃ3+$3¬(VVV–’å¥É`ž––™aÉ¡‰F 6ñ±A( &ÉŽÁ»¢ Tú1èùøc_SnQ ÂMZtE(DžËÄØIEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/devices/video-display.png0000644000015301777760000000136612321343002030041 0ustar pbusernogroup00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÖ 4èØâcƒIDAT8˵”¿kAÇ?ïÍÌ)-,ì$–ÑÔb%‚&BZµô Dlã l[+ !‚…ÅÙ„b£`9Í{»3Ïbg½Ó¨ø#.<ÞîìòÏûÎÛÿé’¥¥w¹]Ö}ä¹vûrBË7«föw”eYÅåå›'=@-tvù‡ï‡Â׫˜X¿ßv™ÒðN™=u uŠsŠj"’£ÞIrEfFJuŽÉ Jî=x ÔÕúQº”i‚ µ(¢ õ;Ë̆fý¦Zÿ}ù†€Õ¢ˆ€*äÐ!±˜ÕâHÂF}û^xHÚxW‡¨RI.I¨ªÈF·ÇûÍ>eURå/„S®º±¥±AEb„·¶y¿õ™*FRþ++¬v³LÚœ:ÊhlölõJRJxïrk‚ZB?Ž ÄŒDMlýAäc1 Œ ª´B ¥H™EÍ•˜•›à[+ ,AJƧ~EPE !¼Çy%¥ÚKµHŒÑ„êO¯¬/^w -O-ZÁZrO;Å{Ÿ{7!.AU÷·HÝ7;„üçë/wmX|%~rç<£#BþP(šáFìðÎ3¦¦¦v…´Óé|›€[»<6/ÊHåÊÈ8¸téòÓÉÉ#SÞ{FCÕBÀ9ÇÚÚÚ“……«'vLH` Ø;66¯?ô>?0=}Ü©:œsYTpn˜WWWoÞÅàÍüü•ÓY´ Ÿ)÷ûÚíùWçέ&&&üïÔ;3sƇºÝîÁ~¿÷niéÚá Z51S³²rÛÿCwíºÀvãqÈÔ{FrÈ›ù.ÓÄ)ç"Çvލ¾»vQ/.¯ÆIEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/mimetypes/0000755000015301777760000000000012321344021025150 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/mimetypes/audio-x-generic.png0000644000015301777760000000116112321343002030633 0ustar pbusernogroup00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ(IDAT8íÒ¿kSQÀñï}?òÒ´M°µMUüQA´[©b]±Òˆàâ ®âìÐEé mwqö¤{Tèä Ô´jòÚ¦Mò’¼wï».Qb(jÒ.‚ÜáÜÏ=çp-Äô= „¦e¾ ÂêÕÌÓ[·ª5Z®_›àÄØˆµoÿàI[8ÏöŒÏtî±R…ôìî5“}Éd<ªgw–*Ä$~ Iö÷E1Œ+‡/ÜÞ6¬¤"ð%/‘b`0ǰŸ¤.NŶٱbuuU.¾y[]ɹå8¢+ß £¯÷OLŸ>~y*Ò,Cò¹5S¡Ïò…wÙ¥/^Gg·ÓÝÛsÔây¹ìÔÚ„ EfnòEXòF«µÊÃÜçåõÍüzQ˜bÎT°Z…µÖ?ϟ槪ÀÍzþ-wü·ñþ‡á-¿ÛÁôýs=â˜i [ Q’ Ô!ÅZ{ð¡ôƒÉXÌžNŸfxh@8‹ª¯X+”íÅÌw³=XáKã#bW"Æ×¼G._ÆÝð(U|zâQÎÒ8àòO°ºòß*”k wãèù=!ÕŠ0~ TÏ" a³é‘Žøà¨±ìÇÂPulaY–aà>+îºÎf]üBöQqéåB½[ @Ø‹¦ "@WêÔó‘Dê¶0­!–Ö @j娬¼ŸuÏ•ú*J€ß¼Šf¸1ìzZ “©†ƒßÜå;Òñã_$2+ÒIEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/categories/0000755000015301777760000000000012321344021025261 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/categories/plugins-extras.png0000644000015301777760000000220512321343002030751 0ustar pbusernogroup00000000000000‰PNG  IHDRÄ´l;LIDAT8Ë•”Kh”WÇ÷{Ì7ïÉkf2I3IPÓDK¢Ò&Ul …¶B¡Ðn+-Ý»·).ŠàBè®P许(T‹•1FãÛÄÄÉs’ÌÃyg&÷v‘M!=p¸ßÿžß=üïá Êĉ'm×ÎÕ@í¡š+—¾ÚÝ#ÜÐÀž®=âêÀeÆÆÇRâr:Õî={E]¨Î=yÒô¿˜#ã´µ¸¼×®"ºRŠ™t†x2Žv÷N‡C|øA/·n0t}Æp=ÝûE6—ýý‰Æ’™?G­Èº­Ÿýœ ¼¶í6Ã+tuuQUY…‚âò2ñDœá›Ãü–— ”J%:;:) ¤Òi¦gæ˜%èsªé…ŒŒ§ ßuµ•ÑO>ÚÛ4t'‚-“'tÿ*%n`:—¥¥©™’”<]ÈÐèw±-äÚàÕ‰Ûó®§Zih­ûß·ë§ýÇ®=÷Øf3© ¨ 7Ѩ¥íü¦“qîz‡ÑŽúy’ Ñw{‡|é«&[á¡&•ư»7ÖápX냠•7”¢¤iTVU㜛G “hÎB6¼olCI…¸x‰ŠÊ*–QeZy®"êóPït±²´„¦èºN…×¹®ËÙY–ØÿK%™õû©÷V KE¤”ôR©Bà“Š˜¦oŒ‚Y5Sº"Ýþ+›Àš¡Søú—‹EC[-ØF¹³”’Äìv®  t©Yvä]NÎÜ¿ÇÛmm¤4­÷ÕŽ•ÐHòdô4„IŠ¥l|Þ›÷îò,WdüÚ Åò×WÖ Mhô<ÃmÚ(n’ÞŽuM¨ž% [ôä‹(Prk`ËÐi<Ž’«½¬Ú—TAÆÝŠ ø¢¨¶Þ±\*õjIÑô‘u4ƒZÕ…R!¶>«ËF°Ã2‘šãÅ_õRn©cä†Î_x/^=ý5aÄ©*‹;Ã>’K¹Õ'Ï4ùÚBh7Ø,t ;ê½Ø4Éí»R‰¢¦N¼Í7†F' C·žxV2q£Ê·|ÝÝd=n¢ËØ+™[¢!裈AµÇ†™z„sC)cIùG_$zþÒÍ‘‘Ñ;§Ó“ÃgÄšnÀ¸Þ`MǾ?}³©ñ`KÈÚ1ö«êwhsKiëÝ]$ó%ù`l*£¥ÆŒÙÅüÜØÄ̹©Çç&®<2k™Þ|`œkߦé«óøš÷uøBÛ?×M[0—œÿ+¹u9>þï8P k™òÀ À-ÚÉIÝ€{IEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/categories/plugins-all.png0000644000015301777760000000257212321343002030222 0ustar pbusernogroup00000000000000‰PNG  IHDRÄ´l;AIDAT8…U[le=³3{™Ù™î¥ÛÝ-ÛJoXX  Ä66$$ÆDñE_4у‰>ÀGÁLôÅc ¢H±ˆ)B…Þ»Ûîv»»ÝËÌÎ}üfZ ›|™ìüßœ9ß9çÿ‡Ás~ccïw0œÿ0/ˆc4EÖ[͉ë׿Êÿßs̳N¾~î­dOç=½R{,Þ2L0>‚ŸÅúj©”Ÿ_ZX].|{ù"÷%pÆ~.ðø‰ÓéÁ]C²‡öc‘€a3¸øË$ZªŽhTÂØ¡,šŠÓ2Q+•͹ɩÉõ\îÔÕKŸ?x‡}üω7Ïe_8°ÿrj°oo,ÑÎË ÷g0=“ÇèÁa vÁ!.>†Á}º7=Wð1’ÔÅKâ©DööÒ̵ù§€ý¸}èÀdª÷Øø®üv²;±}[C}ÛIÇðû½ÞJMÆR¾ˆHDÄb®>‰Å㉎‘ò³W7Üî!pçPÏ÷VXê»;³‚µÊÀqpïAý;Ò舷A!)t®ëXÎQ#ð¦\‘GK3ÀðdP ÿHPû©Ÿ züä§G3ý;^^\­’A j …Xfðê+#4ø¦ ËR¹íV „B°ôŸÙ²ªÞTÁ%:v:òáÛG’±Š²"’îsxíØKxqOï¶:îÖ+ ômOC"VÖª¨Te’£C±Ð4L6½Gm_sããg8)™È®Tšü§çîÁî§â§‘ ¦i¡²ÑÄ­;³°,±x]f“·¬E±wtôÝgšÕm„"{Éý‘=; pžž6ÑwGw§Ð)ÃnÜó%LNÍÒ=–í P,ÓËl¢@z«†‚ຨپ]lvù@0·ZO Ã]hPN]£XØA«º™…¢ÇÔuïÛ´-\õº ^à¡4›àBÇpì ç8¬ óºŽð.£ˆÆzyÛ»’HÄ%OWÓ² é(À°m»àtulØemÚD!ÖVaضBæ19¥ÞhJíI¾¿¯ NÍ`eeßÇØá¬5“@ š •lGwWŠtÝÔº\®ÑKÜÖ(Í”s[S[>Ó™eóùòàð‘SB:•¢~Ü»¿D LO×Åüš7vÀô²ªP aA>D`@‰Rá®»,Â~ \£¶ÄsÚ/n…ÜÚTzÄÌÖT“Ü7`™›N–†›·ÐNSÉ$½—iºIæ4(‹ÀmËÚB€‚bÈäº|ÿ×K_hÞi®?)ü;³*·4¤SIÝòÆuãå–ëz­Ñò6A]Ö?ã#7[ž~,•m±¥b“©Lå]rmƒ@Mbk£=h¡žË_þýÚùó©?<„¢…¥‰Âþžƒm™LÆe%7eÏ”î]ЈµB2y:¨¡)p¨ µ‹ä‰ ô•ü½Û7¾;mšºæŠð8dY–PX¼ó—à‹î;Ò)› ð<à@Õ\0:ƒ5šB“ ”J•á35ÄC>G]ž›™ºõÓYE.]ÐÇU÷ܰ¬–›¸f¤T"K':¢ÇhÁh{}“¥£Ëð[:ŸA Øh”ç§ÿø{âÂgšZY&Œ2UÉþ“_‘*AÇûûzF߉ÄÚ„6) ¤`ÁV[šÖ’ëõJu!·pó›Rizšú«[ åÍcìÙß<7-•DŇÃQ)ÛÙé8[­Î­*ÊzckÊæVOü{pì‹æ‡?9IEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/categories/plugins-accessibility.png0000644000015301777760000000207112321343002032273 0ustar pbusernogroup00000000000000‰PNG  IHDRÄ´l;IDAT8TMlE}³³ë:Žcç·M1Äi )%ZæÀJ V)$®¨ˆgnHà€T‰žr@U/E"B¡ÐR ¥­ª¤¡¤©óã8 n›¤vb{½»Ì|;³vZNùíØ;ã7o¾÷}C0<6ðÁhãÆcxˆá2>wõÄ{)ý›ÉÇàñÑØP_÷ø‘¡¾ý­M&ÓK¬aÓ}à þ—l¾T=unúâØ¼óæí¯WLùº'ùæ£w¾>}¹7Á &`01´ ñÅóÙä亞˜=¸ž‹G:ZBŸŒ §>ûâ6ð!¿øtâà•¿–péÆ87±C𨇝Í#¥>¡Gä®ë"•)àÐÀ.¼ôTâÕÄ>"Þfq«b;°,^'³Á $wÆqôµ½X^-âÌ/Óp\è}B_­ëH!.ÇC4bZÐČɖi‚›>±Výñ±A$»ã¤vu½Œß&3¨u©áøáãˆåoIâ+®«æ¼Ú,µ,“ˆ=Eì8.©õQ÷ÃоKŦɅjŽ8À"˜8ùýî䊘œ]Áõ™„B&A®é=–ú™­ElQ,%¹Tmr?<+k›¿º€}ÉN<ûÄ´DBˆ7‡ðw:[‹ù¥Ž;%ÙÔi$O31AwÆ›nC¡XÅîDœz½TÁÚF¶0*$<©iBI£Ò´nžJ-Rª®kãø;pæ×”Ȉåíé © #BbOk¬ kÅ2©õo~_(|rƒTJȆŸëÁ5Óùì=2²#ÆÐ3 QÍHtµ6‰õ»ýñf×~(ˆ™**®H¥ê]Ý1Œ]Y$õòýÍtí-aÌ,­ãÜõ%‘Ï.ÞãIâQ>s"VÙ fižÊ Ã2†Ò$ß}g//âÂTé•"¿DY” _k4L“$Õ‰™60ˆ5ùU¼Ü¿S(âT8’\¦ÙÇ»àˆksƒãN¾„OGžÇÞžv…Æœ×y ušÆÔB^ü¡ Ç^߃‰ù‘õn¾=?K%~b?]ËP¹7·Õ¼ ƒÉŸg/¥ÑßÛŽþd…'w¯Šï.¦Q±]")+¨Vkø¿AÄ¢±¸ÒÊa[™5ÌeKTeRUM”°KkA † c¥b1¶þœZXܗ쌧º—tßqØÂ¬ª]C­æÀ‘ïÝv´GðhW ~ŸœœÔµ"‰ƒoyêì?ù’W*Û„ ŠímVj@¾×{ä~ÑO¼ÏNþœ‰öî?$8;ud·G:w÷ìyeä­¦h[’ªÒP±¦+[ï ©R5}1˽±ž›™?1foäîŠ ËFÊVóà qÊ øÓ1ØýñH_…IEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/categories/plugins-window_management.png0000644000015301777760000000204012321343002033143 0ustar pbusernogroup00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÚ iÌsó IDAT8Ë­”;lU@Ï̼ùï®íìÚŽóY’œ°H#+ŠP¤$Z ŠÑ!wHHˆ"% ¢ rŸ ‰‚Š‚…"ÁBN°EbR¬Â’¬;ö&þ®×»3ó>°Ž‰$,®ô4£™«óÎ̽ïZì/GQt†Dš¦sããã3Ö³/®\¹ž;wîÞòaÌ'­'k?ݸñšØgG¯¯¯Ïúò멃óé¥QW)Õ#ž—pñõ“Ʊÿºî 6Æpé‘×ëõ烔Rcž‚¯^½ú¶ïûþ t¥”=ÿ ¸T*Mœ9º±º…”†6RʽOR>ÿê[<ÏáòGïí ÖZ? !Ü›³ó\Ÿ¹æý·NîüŠéÛ÷X_ßâÍ‹£Ü¹[c3õðµbumƒB>æû¡òR™åÁ½Æ§Ž"S £$±RÒÜÚfòVVjS›ûõf†ã‚o¾»ÅP¸·Èôo8v¤¸×ØÃXå(c•£$IB­VC)Eú •"­Z4Ö´øB£´!5>‡J€¦¹{Š-vw1)%J©ÄÀsÉÅ£!{bC–IZ p]û;ùJ)+MS{ÇXkÖš¥¥%²,ã×;¿óxe›(*P޶{„½É…ó´1\Ÿ¬òhyƒãG‘d6?߬rx @.öììì Ý+¥È²Œf³ @«%ñE‘ö–M!0XÊ1üâŽãà AØXî?xB*]Â|‰ÅåulÛ¶Z­V$v·‰1†8Ž©V«t: ­­¡ßËÚcÁð™A¦g¦X=¾Œ1†X2U,?zHÚÙÌ¢H×§Vî/LNNÞ»•Rô÷÷ãº.I’ ¥äöí:}ùÎvFåÌ«,,-¢µ¡·§H§-‰‹6Ög>ùøò»@ ¬þø[€|>O>ŸGCà?&ôLš¦ÞnQô+¥D·ÝžW*/t§ •³eêµ9’¬Íñc'& C¦§3(.ØUJ)Ïópç_'W¹|„\.Æ<‚ xúÙ¶Ö:Ý}àМššú¢Ñh|`Y–}Q©µn_»ví3 Ù}ö'Örë죶IEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/categories/plugins-utility.png0000644000015301777760000000226512321343002031154 0ustar pbusernogroup00000000000000‰PNG  IHDRójœ —PLTE€€UUU@@€33f+UUIIm;NbI[mFdGNjANi@Mf=IgALgGRpLUpQU{ooQ]|^eƒIPqRUtWWqjmŒZ]zhk‹gg‡uuMUtdjŠ\dOWsknŠ||•P[{ttls‘rv–ow’oqŒ||XZxvz•}}™Tcƒ‡ qw“en‹hmŠ€‡Ÿ}›Ze†bkŠ‚†¢Œ‰£”˜¯›´~‡ y€„…¢ƒ‹¥ƒ„ ‹Ž©–˜²’‘©ŠŽ«Œ‰£lw–€†Ÿ‚ަžŸ·iu“‡©œ¡¶cp’\j‰‰Œ§¡¡º`oŽ›˜²¡·my˜••°Œ–®Ž˜¯¨°±Åœ™³™™³š´±µÈ¢ ¹…ލ’˜³¥¤½iw™†¥¤ »ª¥Àq ¦¦Â‘—¶¶°É”“¬ž¥»¯µÉ‹’±–±‘•¶ ª¿¸²Ê}ˆ¨¥¡¾ªªÅ ª¾‘˜¶«¨Â{‡¨²­Ëk}¢ºµÑ²¸Ìt†¨„°¡¢¿ª´È»µÑ¡¤Á¸³Ð½µÑƾÙat–– ¾¨¨Ç«ªÈµ½Ñu†©xˆ«š ¾Ç¿ÙÑÏâ]u_tŸax dw¡i{¤l}¦o€¨p€¨s‚«s†©w…¬{‹®|ˆ¯б²ƒ‘µ†“´ˆ¶‘–»‘š¼”™½•œ¾ ¡Ä §Å¡¢Å¡¥Ã¡«Æ¢£Æ¢¥Å£¥Æ¤¤Ç¦­É¦°Éª«Ê­¬Ì®°Í®·Î®¸Î¯«Í°¬Î±¸Ï±¼Ð²®Ï²¯Ï²¼Ñ³®Ïµ°ÑµµÑ¶±Ñ¶²Ñ·¼Ò·½Ó·¾Ó¸¸Óº´Ô»Ã־Ĩ¿·ÖÀ¸ÕÀÃÙ¹ØÂÄÚÄ»ÚÅ»ÚżØÇ¾ÚǾÛÒÑã×ÓæÁÍ.˜˜tRNS !$'(*/29<>BDFKORXXYYZ^ijkoprxyz~€‚…ˆŽ•Ÿ¢£¤¤¥¦©©¬±²µ···»¼¼½¿¿¿ÀÁÁÂÃÃÃÅÇÉËËÌÎÒÒÓÔÕÕÖרØÙÛÞàãåææêêêëëìììííîïñòóóõ÷ùúúúúúûûûûýýýýýþþþþþ<Éq*5IDATÓc`@â‘æ è@V„AwF(«#²¨hm…{ÞÌ&¿˜)VÈÂLñGöΛ3wþ‚*iClÎïhK/]¶4› IP΢äL¿>ƒ@ÆÚSþ–,páÛW—¹NWw®kç‡ k8”¯éRb`M=»ËÈÉ·ÍÛj3oŸ¬æEˆ1 sÙÞôĹ;WšÕÂ}aõ)—®ÝªŒêõ†ŠˆÙÍʲ¶2¹‘ÃÇ ÇŽ;رpöœÖÉ ÊE¾H–ÉOÚ³xÅòEK\8D¹].l V0¨[Y¬)„Uo9½~ª$ƒ×åÝ[ÃÂR>«6ª00$ŸàiŒH¦[6ä;GL?”ŒÒ ª÷:vîÎÅ\AáØî¤Îë7 £§™¡Ëè0(ö¤q2k3¢G$c‚# ä8b ÀïŠIEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/categories/plugins-effects.png0000644000015301777760000000257212321343002031071 0ustar pbusernogroup00000000000000‰PNG  IHDRÄ´l;AIDATxÚ¥ÔyL“wÀñWÐÁ¼æYu ,(ÐÊaK©¢b‰â1rÈáBg ™ rXd¬R(R¡ (<€I( Å"¥à¬ÔЖ£'Pz½{=öÇœWÜ7ù$Oò¾yò&ïû{ZfÀ'Bø€k¡;M€O±‡ƒd—½ ˜o «ä\(;‡¤nÅ„jNØùê¼Þ¿ 怶¶ˆ×óþU°Y ò˜°ÞIßà‘ûꚃ¡K¨^W%v9¾&€~ÿ즰ä;ÿ <ÂOq_ÂŒÅFslß]l¦ÁbïJœXâU«`*’MƒézJ_ЉØÛŸŸÚFäÏKH’—)œýòYÛ¦3=ã~p§äåÀRÛðR|èW‹~ÜóØñ¿?w²¶éÃI- µ·±åc¸ïO 7®«Wå[µ(òܧT±A%m¨§GéÞJ/§†Ÿ.zæùëp6¥‹Â.ü5¤åŠoí›§ÍsAé=k uî]F¶Wãd,2›·sù“é*×V¾Œ/g™t“¿Ù×LaÈÊÈÈõ– [S5µŠÔûîëBE›wä"‚ÆÏ`Ã5'-7‚K½u6q%^Iˆ3ó³º2‡jÉA,£"e¤b-cÕ隀ª_:7RÔˆ¯yNEõË“¢~ãÞ fkVãï4¨pQ9·tr>2HrÐÒ4^¥¦aŠr Nšl~wøÒ<‰„2O;g¡W»è_&¸é÷a§†6¹ªeèb¾Ugûu›AeTòL$¡Áp’À1œOâRB¹õ¨„|/Öµ›ÁŒš­ÿ¼S Ñ Ú_)7¡nk¯zЬµ\ ÎRÐñ}¹¶|)9±Ã˜k6ï`.¦öLV† ‚Ú÷Ò‚Ù1—v%P[žuVïýဃ^ÏÎÎÁú Ñ1Ò­ºÝBU»£»8–=Ì8ÉÔ\·x¨«öÈœfxpTÉi=“Œˆ¾@Mû%ÏâYµÀ§ÒQÞþuxáåÈ;ÅǧsRØšæ¨øÑb+¾ªË«òŽy¥Û‡D)ið¹5’b;ÓI܉¶DÚÌ“èD!ký‹n‘GÐDLc×¹M7m—UeÄóËKÃûðÀçÖ²Y`s-©EÙs!£IH>Üz××ÏC¼Ìšôlê<—Ý9`£\Ñé9M¾¤Þœ5Y‚ Xa{øÍ¡úêzÍ>i”öàSH¬¬þOšy2ïÆâf^hEê ¥l ˆ—{ƒaêàÿÖA1ÍmÏ6«¾°93È"ÈrȈ%^g’÷³Ï\h^±€| Y ™™ |f&y¯! !‹!ß¼µ²bþváà#ý g'žõ¾­WÈIEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/categories/plugins-search.png0000644000015301777760000000166112321343002030715 0ustar pbusernogroup00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÚ z ë¥1IDAT8˵•OkãFÆ3’lÙ‘qâÆ§7dwÁÐôOÚB›ÜºCÉ¥¡Ð ¹ï7è1{é) çRrÚS®aYh &—%¸‡:›†Mã&$±+§–=ú3=42²­äÖ4Òè7Ïû¼ïH‚ÛØÝÝ5¤”?d³Ù²išA@†h­ñ}Ÿ(Šà ð}Ÿ0 ‡ó0 é÷ûþùùù÷ÛÛÛ-3_\\<ÚØØx*¥´„h­B „ˆ—¡µ&-2™ [[[=àéXk-}ß×¾ï#¥¾ƒ“ðäuRJ„V<‚}ߟ€ôz=”RwÂb¥…Baâ¹™œŒ§~—Òñ{É 'ÀJ©TðøãÊ’YFQ”NS9^°xó4xrÝDJ© ¯“ ¥žç !RÊT+d²x¶m€ãqzzÊ`0À)˜ž)¡µ¦Ñh†aj–©'Uj­9::¢ú°Æî‹?("­é¸]¾úü}_±ººz¿ÇqzI¥®ëòðq_þÉw_~„“³¸ñ.þöxþs“oV>¤^¯³²²2–iíÃÇáòò’翞òÅ'‹d,ƒ ÔH N΢ú ÌO/^3===Qä ¯¯¯‡pÏóRråö1¤¦ç ðú}|¥¸¼v1£€bÛ6Ýn÷~‹ÅâH1 ÃÀ4$ä,%5^_áõdM%ÿ;¡–e¥wEÜǦiŽô§RŠÏjÎy}Öæ¯«.¥0¤Àí)çšÍ&ù|þþvjµJ%? '~?mÓ퇸ýˆfË¥ÝvyòÁ;…¥Z‘¬j¶mãº.ŸV³„Ù·xùêŒ0Ò|üømf³Z­óóóììì ”²ïìŠd8ŽC¹\¦V«Q©T¸zóŠmÞ+ßð¦ñ N‡F£A©Tbff†jµúíÚÚÚ»#ŠÏÎΦ£(šø6ƛٶÍòò2ZëSSSÔëufgg1 Ã\__o!cp©ÙlfÚ•J%ŸÊ†aÏç999É---‰………ÌÞÞÞ×I…P2c ÀºÍÎŒÛ1L PÅbQlnn>›››{°¿¿ÿ„ÿ+þ÷Õ›*¿¾ã!IEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/categories/plugins-profiles.png0000644000015301777760000000215712321343002031274 0ustar pbusernogroup00000000000000‰PNG  IHDRÄ´l;6IDATxÚ¥”[ObW†'mÒ«þ€^4Mšô²·ýý½ìÅôªIÓ4i´MíXFÅzÀO#Èas>³å$2 "°AÀÀ  ƒ" žÏo+© ±c›ÎJžì²÷³Þý}ßâIk ‚O¥²iR%wÿ £V¸Ô¥K£eœ*‚"WH ÓŽW’ ·p@Pï x ζ°¿¿O r•Ã1÷âI=VâiÑ/¸¼¼ë°#ÃívC­VcDÿGM3Áí™'é‹4=yîðXkðÀ`A¡ A<å…hÔÞƒB!OÉçó07 “/‚Q-Ã`ˆÀbõÞÏþúÆúÑqŒKÈI*^Lø(3 7æýAD"°¬ …̦ÔL}")ÙÈÝÝòýìçrÙã¨ñiBsó!’(™lZMzC&ÓfÙ¤’%LŽkàñy°•Ï!ÎÅÚf?_ÈŸ¼S¼IB©˜‡Q…E‡ÍÈaÖœ$DÀEsð±¨+ýßXM'·äU¿ˆ¥¤a6 µÊÖ¼‚ g Î h©+•Ò £Ú…ýj•½2G[‹RxL % •Z°¸ˆ …ŒEÈ›ÅÄ8ƒÖŠsQKÛØ.ná-³¬år™Îócb y ÕŠNçBbiz­×,9¾×h4ë¨ÖöHÆ^^j 2Ç‹ÍH*?67·ÐhÔ""Ÿ¬Ã†Íì:âÉ(–ÂA¤Ó©GÅÿº‰—LÇ›7kXÍp$ùk²Iüì=ÄírŽ[A~'‡b¡u¤Ïy<Þ—mâfóççgÿ‹Z­J¯»åÒ™P(üü^ÜÛÛû‰L.ñ+ùâû ‘NY»ºº>j9ÿ±íglT¹äIEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/categories/plugins-general.png0000644000015301777760000000206212321343002031061 0ustar pbusernogroup00000000000000‰PNG  IHDRójœ "PLTEUVSUXRVWSââÞèèæUVSéèçUWSmokˆŠ…UWSBC@mokÛÙ×ÝÜÛUWSmokÜÜÛ´´³UWS-.,UWSUWSXZVrsoÍÍÍÔÒÑUWS»»¹rrrøøøUWSmokkmilnjlnjééékmikmilnjZ\XY[Wbd`ÕÔÒnplÜÛÙ~~~mokoqmprnsuq}~{‚„€„†‚†‡…Š‹ˆŒŒŒŽŽŠ¦ºÔ«­¨«®¨­­­®°¬¯¯­µµµº»¸º½¶»»»»½¹»¾·¼¾º¼¿¸¼¿¹½À¹¾Áº¿Â»ÀýÁĽÂÃÀÄÇÁÅÈÂËÌÉËÍÊËÎÈÌÎÉÎÐËÏÍÊÏÒÍÐÑÎÑÒÎÑÒÐÑÓÏÑÓÐÒÓÐÒÔÏÒÔÐÒÔÑÔÕÒÔÕÓÔÖÑÕÖÓÕÖÔÕ×ÓÖ×ÔÖ×ÕØØ×ØÙÖØÚÖØÚ×ÙÚ×ÙÛ×ÙÛØÚÜØÛÝÙÛÝÚÝÞÛÝÞÜÝßÛÞßÜÞàÝßàÝßáÞàáßáâßáâàâãàâäáããâãäáãäâäåâäåãåæãåçäçèåèçäèçæéééêéèêëéëéçìêèíëéíëêòñïóòñööõø÷öøø÷ùø÷ùù÷ùùøúúùþþþ §ÿJtRNS  "$%&&&(***,-.2;<>tzæÒ¹ ¦©M­5´&iìÕ­5ˆÚ^H¸o˶}O‹ÅâêËèÇã±Ëþ€cK)¡”‚RRªm­zêh,ì…|×;Y?ÁÓÓÓf:=˜­Õ¾A) )w‹»u7\k@ЗÍçóî/àz½>E’­Ö&vw¼?h¿…‰Ø1¥èÚžg2¹X45úlqiÕ“ðÂ4EÏžöÊ/¼ÛÒ“˜ðârm¥ðÊ7xäN8}ܱ2xððýozºÓw¹—x»T†{ô©aÛq|3, €°lcdíÓ4š-Ô׫úñ£×U b€F‡£}™Mà ãkÍ ŠÍe&1ǣё„€K¥/7*ëå‹ÌÔGZÖï¿xyïOžorpìŒí–²B B©´øQì3ÏúËïAàƒ_ò?°Âè—=ÜÁµ?IEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/22x22/categories/plugins-image_loading.png0000644000015301777760000000177712321343002032237 0ustar pbusernogroup00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÚ 7¡"sIDAT8Ëå•OL\UÆ¿÷wî¼¾7ó^ XJ £VBÓ ZK]Tª¤Õ4²!bbÅ`HÁ6q6Fc«6151îºPꢘjŒÚèBiBR­ƒ¤tV¡-OóxæÞëfhÄèΛœÍ=ßýs¿Üœ ü/׋-äµÓíæÏ Pÿ3hw‹úÊw=ñ…¾ÑÏVïK›&¦Óâ3ôVú±û¾‘_–gg—xû•›aa%-l†ùp×û¦®¼k—›Uùe†ßçîä ÁűzŽ­hÄÍ€c¢ÛÛ¸gwu]}­H&«ªf+!ѶºÇߌ¯häBïÛr0Oo왽UÇ/zŠ*Fi`©Á¦l=¾_i~ûˆ–=׳‹ÏÌ8¼X,rÆ÷}Ÿ}é§««‹lØŠîGHmµ®œÛ»]Ù¡?ú2,˄뺘žžÆÔÔîMÕ—'“É76dÅÑÝNhìâ“;Õçôqàp"˜YðÕ¼àʵ?Pô Hè’`WVׯüzÂÛcOñÏ·^¸ºADfAÝ–úáÆ,ߎ四 \4ߣ¥Öm…µ-yöÙNZCåÏû>ä O6A„\!À’W¼«Ë»>…Xëêø½³g^:ØúÄ‘ùùœ@µžÑxøÓÉ)~Ó$”••ˆœ¢B-Ç|Nů·UD•PùÇŽO9µkïCûú9‡::úÓdÈéÑ“ï|Ò‰Dôš¸À頻¢*&`» ì®áЃUHUjèèèˆÿmÇétš4>Ðð±mW$¾ºôå¨Oƒçz»{¯cLWUUõ<™LžçA’$X–MÓ¶¨ªZ ópSSS<•J}à8NÓõk×˲—io?qâUgE£iš‰DdÇq ë:¢Ñ((¥ð<º®G ÃhX –cLÓlEƒƒƒ¿ù~øôððp@P$„Tˆ¢BDQD†wƒÃ0 Èbˆ$IoAÐ:22I’Ë寳ÙìŽ0à‰DâôÐÐAçÀ9c `ÛvOggç‡réà~JiÝøøø÷†aäEQœ\\\<_ÒÒYQ”ˆmÛ`ŒR Î9(¥`Œ1Ã0 ×ukÖŽM¡ôRÄU#•—BmkkkŽÅbu”R™s.€$IT–åP–åR:;00ð…ð/>aUq¶6ù'¦i®òvyIEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/modifier.png0000644000015301777760000000360012321343002024656 0ustar pbusernogroup00000000000000‰PNG  IHDR`0îÏGIDATxÚíZAÛÆþÞ G+íJ»ëÔj\7ŒÚâν¾iB÷P´ô7䔌"×rÈÅ·¢†aÀÇÞ4@sM€ @a(rH¼]íj½ÖJ¢Dr^$‡3äPÒÊ+û`>æÌáŒÈï{ï{ožHÌŒÆ^‰‚†€×Úû?þUøsÆqü‹e“‰*gDkLJy¤µþŒ™?ÿãÞy `æß_¿~ýÓÛ¿~g»ÛífR†+ùa&ZJNmšaó¸<Àƒ+òµØº®XŠ‹ëJßñª3Ýl6»ñäÉ“{OŸþÐð‘ÁÉNÂýí›;¿¹óN§ÓAœÄ|瘡kÓáràÅ~Ô3¬¸ðKDBØÌ­³uŠ£Kä«*8:ím´·¶Φøâ‹œ%IÒïOï'•Eѯz½]$:©Ÿ ø”~&r>ÛAþóT¾>[ÙXN°ÿìï/aɽô²e{½}(ÕÂùè J)ØÖZ÷ê$È<Wœ\·°xÎ%É@ÙÎäŠ9=ÇD N`.î%›çL01FH/°Ã®£,ü¹k·;èlmc:› §ÆÌÚŸ„µÖÆQˆ ð (¥@BV¼­z z¸¬Í¶>—ôÜ’”b¸”/˜¼PÍ\9‡ Ë”böüâ’$‹1Ck^B`3Z­-hÖˆ£™åù¹×G{ŽCBl.½ºîêvªçY(1×ä‚j±sÏfŒÐiw ~ޱsI‚t!AÖMÊ @N³µÃÝ•Gº*1¿(Y€­by®¤ÚdÌ›®‰Q4ÇÎv“éØ# %ˆ=Å AQÑv'­ÜÄ—'Õìá·…Ü_¶NÍêžëó5¬9¥àuîñ¥¡DRz‡.%AùíK!!!IÈ<ƒªRÏHAѲ–ì’µ {ö•Ô!òr–Ìö‚‘²)²ˆ¼ºX<_¹€€$¨–7“ñjr*2ŽM`°×ÃNÈÁ›c;¹²¥eUV°®2³s¢òÂ+)Åy¾ ¤´þ$ ePS‡¬ AVj e•ŃÙ%^F‚)[}À;›\ó!ß°½¸[`fê•I˜ãdÅbɯ‰­R—³2frÑ:ZÈ”¢6˜¹>Ì—£€A$ÒÅ÷[ÞFö ðòäx²¯ÏëþÜcÓý@¹ÔµBÄÓBùý0ùÉ‚‰ë½—|N¾¾L !k£gaHCÃõ~æÔ{˜KªOå†]N9+ùžaO9Ð…ÌdúNìx?8 K‰‹âÌiwø#àêÔ¿ ºÄ·t#Æv²"®V5¥N­µÅ'ƒûW¢Â ìhtKd_߉Ýþ[$zwê+Þ{ uÔØÂ$¬5[›r?Ýw éê§Tr¹Äre˜M·7ˆìéø‘/É›‰.çÒ º¾><ò¾Özd6.Y?ƺCò.Êx}JK½ŽSýÿ¨Ôi-ÏäË$Ô%Z+õ‚LÛ6Óý„ú=À÷T/¥Y#ˆ´ùït“0ÕJÖr ²ú+„ÚkckZ™á+½ÒÊÇí³4vU,ʹÁ׿mìJZuÌKÊÐ<ç?Î4¿³oT‚ª¿ˆ1Ìæ«¨C»²XÖ eó§Á3´  5©8;E¿¦¡áê°~íó÷}L‹°Á~£ÀÏ€é5o»½l)j«ÖN-„$Ú ¢¶bb-†Üÿµ4&§ïÏ缄"øðÞåˆhÏÆß¦iö:šÖ²E&£aß0 ]m6ëFfï3 Ä^e¹v,Y ‰š ƒ®®æñ»+A*»ð‘R•<,©ÈA ãYQ^Ö •wULˆ|YçÀ[ƒœmV¥”!Í¡{Ê؉QzÄö 9gÝã nÛ,œçâÿóãâÈûS#ºÌˆdIEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/32x32/0000755000015301777760000000000012321344021023136 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/32x32/apps/0000755000015301777760000000000012321344021024101 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/32x32/apps/ccsm.svg0000644000015301777760000003621012321343002025547 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/32x32/apps/ccsm.png0000644000015301777760000000217512321343002025537 0ustar pbusernogroup00000000000000‰PNG  IHDR szzôbKGDÿÿÿ ½§“tIMEØ ò=ËIDATX…å—[lUÇsf;í–¶»Ò.wÚ]Z) ]TššliŒ@bT ‰MÔ èŠ@|7¾4>øhbˆw4FÞŒ¨õš(7 %¥Ô²bÙm»Û‚ÐÒ;Íî¶»3çø`[\t m}ðŸ|ÉÌwÎ7ÿÿ|ß¹ÂÿÀʇ_«ÈÒõF)¥WMúæRéºÞ‰Lnïüæ•  7Gÿjݺ²Òšªœ†>§ô‰¤¥5·E|Á á¯Õ€‰ YZW]FÇÕ1FcÉ9àZ`P·±ŒóçÚW8°0߉ÔbäçåÌ©9É¥&ßS ‡ŽadÍ)¹kú °6›š5.Šòæ…ŸÒ%.9D¿PYœ`Ù"'.ÜyyN*‹âˆ)§â¶³ ;×ü±Þÿ¹€éY (¥þ©ï¬ÁNã°7H)çE€6 ©æKÀ_)pØ]ê´´¶ÒÔt ·Û…¦ ÊËËñWùq:ÐÛ3 @Ê™%%+–¯`ßÞ—èî‰ðÅ—l ÔâñxþU°{•’36¿ßOQQ1ï¼û¦iâv»Ù³{'Ož ‘ˆ§±+vQRÉŒ¬éô)"ÑRI„.ØX}?……‹xóíä:ódûö'8{îlÚx{ž…-H©2²¶¶ üòsÑH7R*„ÐÙpï}Äâ1†G†ð{è¹Ü“6þ®K`{_ÜO("é"•Jrôȶ=ò8ãƒHiaYºp̰Rfd–õçlÙù̳´·‡8|ø3êêÄëõ28Ô¦iF67ÆFÓÆ§Ÿ“ÈÅE‹éî‰Rà*`×®çЀ¡‘"—;¦3Ó2ñ–ø‡Ãø|Þ[¾&(JedU~?Ÿþgv.£7†éˆ^b`¨¡ t]'‘§å\3[¶l¥¯ï:ápÇMñiÇÀLJP¸¸’’Þ8ð:×®öRºªŒ{|•”¬\ƒou9FV6JJÚC¿²©v×®ö…g¯ëÖârÐÒÚÌ÷?|GÊ4A‚Ðužßý–i’²RôüÞC 6À±cGQJâõyùÛR¬iš™J¥†‘ÃøD"cK—/£x‰‡x,Ži™!ˆFº9xð=vìØIÿ@ºô^'¨¥ét¹ òYêY&4kJ€®P-çj­Ùàß(Œ¬»;˜®¯ðÓÕÕÅ¡CS__Ob"ŽHŽ‹ñ@M ÿñ˜Digͨ£ÇOì³,ùAsó™õܲEß),)ilüœGÛ†#Ã#ôÞ莰@v„#CÁ‹_ÔÔ5lಘūYuuuáÓ;ž|yóæ‡Ê'’._¹¸Þß—_àŽu†.E“IÙjï/c¶­¾¾~ч½ÿÔ¥ŽßöƒÁ*Àhhh0fë'3BCCƒPJ9”RË”R7þŒÄÓ–®’ IEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/48x48/0000755000015301777760000000000012321344021023154 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/48x48/apps/0000755000015301777760000000000012321344021024117 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/48x48/apps/ccsm.png0000644000015301777760000000321612321343002025552 0ustar pbusernogroup00000000000000‰PNG  IHDR00Wù‡UIDATxÚí—kL“gÇÕÍÍ,sæ4‹×ìÃ2çÜböa‰[̶˜Ía–Ét3Û‡}ÑLLÌÌP§C)"…V°ÊÍ+xwND®¡ŠÒÊ¥z£-åÖRnr)¥Â§O1ƒÚw•‘š@ò ÷íyÏï}Î9ÏÓY^hfff€qÞù:áÕ¥bw®Ø(°,Ûƒ@bE° }ù7ü°•ëxA^V…Ć­ÛvÖ}ðœ'nÕiXšæ~Sì1¯+C„}‘dØ•RùEEh¢‚¿äxo“Ð5‹Ç›3©€g©Îhñ‹H¤ˆ5Xµ9ë·E/ô*p±Øˆ'«’swõ$p [vñ–z¸VfÆî4E@r±Ä„| Ü(o X«ôrWoyØ*‚ÆÚt‰! Qš;ñÓÞS#;ÂxoM*+Œ†Ë5„ÎÎŽ€dhȉÄäC"o¾W·Û°ÃÃ.$¥$¼ÈÃH>™àš˜˜ð!àpØšBÜ::lWaØím‰ËÅA`˜Úm­SŽV§âQ5´j´¶5ûƒN ¨QÚÚ[¦ ³¥؃cÇã ˆã#±Y¿$¥p  á7q"5²=»ÑÝÛÅ$hòб²cJ›­JM͸€Ùjd=Qó¬Ø\œ0˜´~“‘yQÑž ‹½5[G›§DXâ*m-KúiÔº:vo®8Çâ¡5¨½Æä"@£Jߨà7µJ›(ùwÄlO¡³D½!«–â¡BÆ’ËÊÉ€(! zÕ¤±û¹ èŒêçâ^q+‰ìÜL¸ÇŽ­¶f¶ŽN;m`hnµ@^[…{%(•¡LZÌî»yëD'â Ñ)'Äå"À6 ­Aõ\htõä ^$Dø¡ý$TC£:}jêHKÑÓÛÍʪ¸ô.j”Õ(¯*…´²]Ýø;ý˜„¶þé¸\i •Ï “¸/)Âõô«HHb³ Œ~³Z?p¦M3mn¥åÅL¢ò¡„DÊ`wØpõúe’8 µ¶nîå#ÿn ©¼$å%H»p†I´´ZI©¬”$䨒—CöPŠÖöf\ºrž­„ª¡–Åò)@Íçîêéb³Y­«ÿ_yøH†T’ؾ—­‚Ébd+P«’ÓµJ›z&˜N»è ÐÇ‘Q‡æL“˜K¼>FÐt³ù‡å§Ï¥ðêUµ‰$²3;ïÖZ*³w/Y¼`Íš5Aé7ÓçFEó–PÙ½MÌfITë¯]¼œºÎÜdúÀ‚_çÇFÍŠy…Dñ$_>y:9h``À#0ÏÛ}ÿÚ~Æë¨‚âûIEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/0000755000015301777760000000000012321344021024123 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/0000755000015301777760000000000012321344021025066 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-imgjpeg.svg0000644000015301777760000006553612321343002030542 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-stackswitch.svg0000644000015301777760000006337012321343002031441 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Zoom compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-dialog.svg0000644000015301777760000002457412321343002030354 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-photowheel.svg0000644000015301777760000020612312321343002031263 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-workspacenames.svg0000644000015301777760000003544712321343002032140 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-resizeinfo.svg0000644000015301777760000004163712321343002031271 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-grid.svg0000644000015301777760000005373512321343002030043 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/ccsm.svg0000644000015301777760000003523512321343002026542 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-copytex.svg0000644000015301777760000012322012321343002030574 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-vidcap.svg0000644000015301777760000007154312321343002030361 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz video multimedia category compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-snowglobe.svg0000644000015301777760000023150512321343002031106 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-shift.svg0000644000015301777760000013034412321343002030223 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-mblur.svg0000644000015301777760000003304312321343002030225 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Windows window manager decoration behavior compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-bubbles.svg0000644000015301777760000023014712321343002030526 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-titleinfo.svg0000644000015301777760000002064712321343002031107 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-commands.svg0000644000015301777760000007205412321343002030712 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Character Map key map character accessory compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-winrules.svg0000644000015301777760000004451312321343002030760 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-3d.svg0000644000015301777760000013157212321343002027420 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Cube compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-crashhandler.svg0000644000015301777760000002646312321343002031552 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-neg.svg0000644000015301777760000007345512321343002027670 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-ezoom.svg0000644000015301777760000002662312321343002030243 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Zoom compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-mag.svg0000644000015301777760000004125212321343002027651 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Zoom compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-expo.svg0000644000015301777760000010547312321343002030066 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-autumn.svg0000644000015301777760000006241012321343002030415 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-dbus.svg0000644000015301777760000006045412321343002030047 0ustar pbusernogroup00000000000000 image/svg+xml Konversation application icon March 2006 Andreas Nilsson http://tango-project.org konversation chat irc compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-snap.svg0000644000015301777760000006402712321343002030053 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Visual Effects compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-place.svg0000644000015301777760000003242212321343002030170 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-bench.svg0000644000015301777760000002047512321343002030170 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-td.svg0000644000015301777760000005775312321343002027531 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Cube compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-elements.svg0000644000015301777760000007253512321343002030731 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz window manager decoration behavior compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-thumbnail.svg0000644000015301777760000011403012321343002031063 0ustar pbusernogroup00000000000000 image/svg+xml Thumbnail Patrick Niklaus, Andrew Wedderburn compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-staticswitcher.svg0000644000015301777760000006653012321343002032153 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus, Andrew Wedderburn Switcher compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-putplus.svg0000644000015301777760000006567212321343002030635 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-wobbly.svg0000644000015301777760000002325412321343002030405 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Wobbly compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-animation.svg0000644000015301777760000002151612321343002031065 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-startup.svg0000644000015301777760000004152512321343002030612 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner dialog info http://jimmac.musichall.cz Garrett LeSage compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-freewins.svg0000644000015301777760000004436012321343002030732 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-fireflies.svg0000644000015301777760000022240212321343002031053 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-colorfilter.svg0000644000015301777760000007364312321343002031442 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-animationaddon.svg0000644000015301777760000002125112321343002032067 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-wizard.svg0000644000015301777760000003150512321343002030405 0ustar pbusernogroup00000000000000 image/svg+xml edit find locate search Garrett LeSage Jakub Steiner, Steven Garrity compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-fakeargb.svg0000644000015301777760000004334212321343002030651 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-gnomecompat.svg0000644000015301777760000003052512321343002031417 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-screensaver.svg0000644000015301777760000004173412321343002031432 0ustar pbusernogroup00000000000000 image/svg+xml Lapo Calamandrei Jakub Steiner Luca Ferretti <elle.uca@libero.it> compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-unknown.svg0000644000015301777760000006672712321343002030622 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus SchemeP compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-decor.svg0000644000015301777760000002076712321343002030211 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-rotate.svg0000644000015301777760000005755112321343002030414 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-maximumize.svg0000644000015301777760000006710012321343002031272 0ustar pbusernogroup00000000000000 image/svg+xml Tile Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-gears.svg0000644000015301777760000004115712321343002030212 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Cube compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-animationsim.svg0000644000015301777760000002602512321343002031576 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-obs.svg0000644000015301777760000003271312321343002027672 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Windows window manager decoration behavior compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-swap.svg0000755000015301777760000065703412321343002030075 0ustar pbusernogroup00000000000000 image/svg+xml eJzsvQmPY8l1LvgLzn/g4MGAGjNN3H0RjAHuRj0NrAWSbHjGeGiUuktyvamuEqqr7bF//UScLU7E jUsyk6l2q18ywEwmmbxLLCfO8p3v/N3/9tvffzl98/GPb7+sz8UJ/u7vlk9v33z++OnnJ3z39Mv3 77//7vMn/9bPfvfFqazOhfun6ZfDV/yP//T203fvPn74OX6EH178t3+2vvm3d9+c/undnz98/PDu i9PP/umXv/j1b379y9M6/dMv1y/cv/3h3ef3b90//unj+2/efvrqj58+/vuH85t3X8g1uIOubz67 /6jGL4v2y6ooulPZ/bwc3T/MH7//8M27D3+eP/5/Pz8VrpXV4J/uo//+7ndvv7vy+frx6++/ffvh 828/ffz67XffLR/ff/z03c9Py3+8+XD61Zs/u0/enP7vt+/ff/z30/z+zdf/L7ibbb+6vHv/1t3X t28+nwZ/k9Mvy+qr+ft377/59fff/vGtu+GqKP3b9Vd4xH/8zh3KHdW/9m/3X/3yW/fO799+/uwu y53Pd9TvfjEvrnM/fov/RhdanH72L797++d32OeuC/7HF/SP9nLxP89d1Tdt6V70fdf05eln03/+ 5/efPn08ffv2m3ef33769ObD24+nP7//+Mc379/6o/zv1BOnn83vvz/95ftPyYela+7sv3j3xt18 +hFe2O8+fvfdx8w3C/qmmwnfvM0euDg341DUo/+v/+f7r79+Y/7Bd9kf3n77l/durHG4uubcnrra /5BX/F9uDPA/vqyq2t31OJy+rKvyVLfluXeHPzV9R/8Zxvjtv717++8/P/3644e3NJDTp8+/f/ef b38eZoR/93ffv3/76R8/vPvsRgaPMdIw/urjN2/fu//V717ev8HR467Un/QPf3jz6c9vP7v59/H9 959xUQwFf+SmyT+8+Y+3fqqVdILf/OXthz98/Ce8vi+7vj21tR+Csqm601B2J/fLH7o/9TWfh0aI L8Z/3X9Zjtq7vv6tm2K/+fTuz+8+/Jz/r//qF5/efROmXV+dBvqBl30ezHOUJ12fu9XPn99+4Ot1 0335lZm+xflXv3dn3D58s3z81vf1d35Zuon7wc3U9x//TJ/pa/zEff37v9DV499fuWH57ad3H/wx 4df4yfDVb99/7z76xaeP3//llx/+9BF+RnLot28+/6tbkG8/fPOdEyb+n75894Fl1J++9xLIC5kL vTq5tf/m23df/+tbJ1D+8sXVA//h05uv3flPv/nj/3z79Wd3jN+9+/rN+68/uldu9L93S+ETvXH7 UL//2vfYp9P86fvv/vX0h48f35tL/e3bDx+8WHHX9ie64LfuJd2B+7fff/6EU9atr/CP/60ftqn7 EZ/YzZFPbmzwQ9/9/k/swj+9d8Lqni77j2//+PH9u+++9VfyDl+HK6O/bx/kt3j3H37zgSZJrhPo H/UO/0LfyN/+m0/+9ovqR3xiJ4lun/S34bif3X7yDuf03+JpF7cjvfvzpzd/+dd3X+fPrAf9mv/1 T+60N2b512/8+dvm2vn9vf7p3Qenn5x+/73bVP0c91rA6euP3/7l43dOVZATsKx4+/7NHz9+evOf uMo+/7e+K6erJ6AbXN/+yR01rCO5rV9++De3k3z9KbqV8KYbkPduNr25Y6K+f/PhzacTvr8fsHef P3//6Y0IzTf+H5K39AztV06qW7n95ZfQnOYPRqr/4tObb965rnaq3T9+cF9/+83pz/zWqSy+gOy7 bjOqT/M38C/w91DQo3KtLhrXWtf6YnBtdG0uFtdW1y5l4Zp/VGXjWutaV/aujeVQTuXs2lKuUK7l pdzKS+X+r/KPumpca13rq8G10bWpml1bXduqS3WpS9eq2j8a19q6d21wbawnqKd6dm2pN9cu9cVd pL+A2h21aVrXOtf6ZnBtdG1uFtdW1zZ/K/4y3bn9P7Zt51oP/kc7uDa6NrWzaws+V9c21y6+dYVr ZVfhs+pqbHguf5Suw2fvn4AvBnwO3YhtwqdvMz4Xfa7uueDv0DZ8aoPu4n7R07W+oJ++2Vf027TS /4T/U0bVD1gY1c5/B0d1wqcfVf/cysKNrR/V2nVrzaPa4bhO+HTjCm5oFz+qOLKFG9WSR7Zz49rp yE7V4sZ1wXHdcFwrHtkWx7Vz4zr6cQ2jurpRXXVUKzeuDY5r58azxzGd3HjOOKabaxc3ppUb0xpH lEZ18KM64Gj6tmDzY+lG0T3d3bixq3D8aOz8gPVmsGZsflhoCFwvA3dqhc3PyLZv3BO/2ff90I/4 nPq5X9xzde3Sb/024OIZ3KJwM9j3C07NoQU3O3p8DsM4TO45u7a4tg7bcPFPt+JKfFaj6yY/m93l taM7ix1VGlMa0cGsUVmhNa7Ozl+AjJ9blFu5uYGjRUnLsQNdjQuP2aUueLxktHANuoFacaAuPEQ1 DpDrDxyeGYfHDQ3w6NS43mSZTby4cDhwOdFAdDwEE64G1+04hX1fUz87owO4g33nbv3F3ZHv0Np1 Z2d6cpY+1L5rXK91rt+GcRyncR6XcR238TIVMJWTu5+pcfOkn4ZpnKZpcW2dtrlwIqxyk7J1c6F3 YzPO87zM67y57i1dD9VuVnVL70ZsWuZlWdblshbghFjtBEfnLnFYp3VZ13XbCjf9aydKus2pdtu8 rdvl4sbHSa/24m7jMl7my3rZwqi+4ONHeMAyboDbDW05NQso2nj8pO5w3ckG5EXVjFPcb0KuY3Wa k8DCqQ4orwbch2S+r2YTqnHGk5iacPNBAcWTvdpN9gV0q6lwrpM4ku1lRTHkt5VKt5VBdxIa1cvl srm2ura4wZ4vk2ujG/rBTYDeyRe/xzSu1Re/AzrJein8Fzb/WLfFtdm1aXPz1k2iHpxk8Wuk9TLQ 74Tu+v2adh3izuG+sfrHsrr56mbhtI5uNg5+2biZ6Tc2vyPWfsP1PeMk/wWWiz+Jm8X+4Sa6m9Vu nXh55Oa4l4VeijZu1tdeOrgV4MbA34i7LH8W/5V5nlwbvRybe3CLpvNd4MWBW0Z+i/daQeHvfHJ3 4i7LLzX/ncktvNEtv8EtQr9LerHd4ML041NOfo+6wHhxN+/uxF+WW8T+O/4xeIGIkrtFEelFZeUW vhedBQrSzd+7uxF/YV7QjoN/9IBSw8ukxisXKEtKP9H8iDj54rtrQWHuLsufwwl4//ACvw2jKmMq IyrjKaMpYykj6UdxolHEQZQhdAMIfgR1/GT0RjNyMm48ajpkMmAyXH6o3GABjlSJI7XhSPlRmsMo 6RDVZnhkcGRoZGDcsACOC4+KGxAaEj8cMw7HgMPhh6LFoahwKPwwXHAYFhyGSYZg6EAHgLtfO1+6 XjredTruuTXuwCUpP6grLahLTbh5D4BamNfHGtzlvcZWoA63uYm/oG43oa7n1ARcq15tcCveqxF2 VGlMaURpPGk0aSxlJGkcaRRpEdIA0vDh4IGOHY0cjRuNGo2ZjFhNC4sX1aIDRcMkg+R2rYuOEI0P jQ4NDQ2MDMvEK6TTASl5VaxhKAA1ERkGGgQaAhoA6X7qfOp66njq9gH7XHrc9Tdod1NnU1dTR3tt rXCLY3Nz2Wtyk1u0XrfrnFhtUI8vm8KJW68HLk76Tl5FBCeOO9Qaa9QhCyclNye+vH45uUk2uDnh dc/GyW+vjRaom65u7s/l5Ea1Of3dV/MnN7hBM7Ytp0+Lpm20b6OUs5q+gmrtoscvRr8nfX9i/Z/U y4Ftg14MBjYeWuzABrAXa5272J88gy9oj6zcsQvuMDKXqYvDjG6wo11Xg+vtDS2gBft7xP6mHu9w M2twWyu53y9oWS2oj0/U+655lbdFc6wGHoPS71Q4CivabxNqjwOORYtjQaPhx6MkWwE34gWNwwnV UW8wuv3aX6m/gAotysLbILjB4yaD2z7KZVQJvHJQo7pA6ohfsrgFeB3PbgCFTnUre2bWtgfWvmne +0a6pNcbCsDTeQF9wW1gNktBlkPHS6JFa4DsAp06PElIMrkGZvh7lVCyYmpvk5B1olJqYeuFFs/A o0pLyOkawGtIVtGi62jglSRriUZ11fXEK8o9ZUm1fkCBrDMcUVlZC68tWV2drq+KV5h/4g6DI0om IpmLOKpkQ7pR9Wqa103YzpzY7hzYDg2jioPPo4pieGYR3LqZScJ3RcE7oND1IrdgcTvhPuklrZez XsqKjGUJCypgRbwG4cqiVdUSkauiiGSlKlwXqzi7urC5qVYh21oqVZ2pT2I1K1QjmSoLvmGZ6meD nw8Lml9+LnhzrAP3eU0TgUXqqhPgSKIuupI7Xse4gt3YuN0NRKiin2fw8xbHOKxaWbODjiyNq4yq uwmRXINKK3+i0mwKJKRIPPmrF8G07K7eTVy6fJq2M2r06XZQ8nYg1z7htfuJ2rHkwVlK9wBoV5D4 8bbGxJYHiaAebZJWRVHDVovYMIlx8zIWU/L4cR0QR5VdIT27QkbUmWdU4thad4YuOUJIznqr3c9i sdwHVMwn9oKsgCY8GfEFavPBCdKiJO3ZoB/REpjRKljJsPemvWslKqps34Nbyn4n7lGdHdHU9wou m/uuOW0Pjf4SbZUa7ZaWzf8e1eURDZwZjZ0VvC/AW0B+wqNHoELrqEHp3bFvYEArakIFfUEvgVfZ L95XgEp8hQ4Dvz23wH6DHm21Ee02bwEsaMt5m+DiJybaeRXafF7+t7jToKcJjcMJDUV/lhXQ5riw s6FEy7JGuwQ9mmipDOh+wHv3t4LWDH6F1mqJ7ps6uEuNn1S9aurICa6cTv1pE3vSvL50AVSvSvah NajRd2bKyISR6RIcPDRVZKJM4ioD3N3F0yO+HvH2iL9HPT44MWRaNLjBhhmB8wHCdNDJUJuJINNg Fm+QnwM4/uQTanD8w9hPwEPPA6/DzoOuIz6a0ZaxlpGWccZRBhzkCQd5pRHW8ZXRlbGVkZVxpVE1 TsALOgFjlwj54295ABf2ABZNCeynbdnzTk5AcYwUPIloCvXsmL3qAwSeNThndm7A4GYlLyBNE5ok B15AuO4GxClBE6JTP+DMM+GinsAm+AKB5cCqw1/x0qehH9UpKGNOIy6eQRptGmscaeCBpmEeeCHT CNP40ujS2NLI0rjSqLKB8y9QnBunjpTdqTi37nfbe1TB6NQsDzOoXe9W/p2mHYaq8e+UHsHiXri9 auzKU3Vqi5Pbtfzhfg9/99VLHW7+DgqFbviGn1Tj2S9sPdnxf/jvv8ClvOh94V25jUBicxJ9uzMg V7W5gJx71917EwXkSuPiJw/ogp5PCr51kWM/XdFuPeejBRIvmNiduqkbVSIGPR7YxAxuHUgOFftk W3MwDgy6AxX3eVpu+lnuddn8oAdSd4MVpl7FVmFKolQEqROlGPESORqkKIdSSIqS9N5IbkcjbeV3 LMGtFKe4KklyluZ0yOXQPz6qf9wfRK49bASL3Qjo+nlwrQvM+C9TH9ihFyz2g+F16g== IeWg4szmgyauNXvYzIHjQ4YD5v10d3np7NDjppfZ8jSSHAe95iu7HWrTEG15sunhtod3ktuZeUJd 25b3WzJtyhVwgDu+SNyW8Xy84VPcLz5+eo46o0MOiRa5gp66ZI2gkit4LDAWbDEbZ2qAg0xpiMmJ MTxf3vcaucef4nxt4Yr/Fc93xeN7xeF7eMab5wtnSM+xP8v+3lLXcgO7s9nzBf1kv8cXV/Z/0hzO pd+Z/UZcho14HIqGgJRob2Re4BHq/lz1Qxk2/hc4Fl5T7dSGzoM2K6cSFF5vqPg7HhhcjU1Z+ReN P41/UdZ91dFx+u48OnEcrukFjoXX1MpxGkEo16LUFKrvILIm82Kv+73M4R7SkoackjR40JLqSAq1 mdTaXBhII/78Uo3OmsRVJF3FW8HmJ6CU3VTSxk4Lkbfsu/AWR4++PrI7qJH1sWDgcVM7pFBnRqnI BLFY3Xpt2asRTFexU9C7IfvVyvHBCyILnNJBcV/9WaI6UnFcGH3EqKZQuHGIfjprcmK3gW+k2XgN ZyMXwjbT3tLh7jIK8Ar3llqBOSMqKgKxon3P2/ajk+9+h74g4sZvJX6kJu8OX3FgaKPrXA/6AVgY LeN6mno450+9J0p1EKOCK/5UdLPjWUMo8SCSuOnXQnCr16gLB7g0xLWCRrlCnEsiXRjroh6uWD8r 0Zl44djKxvEV8svOHGeZ2EMrvvke3Z0d+2sx8gIVHrGqJADjHbjotL+gL3SLtNQUiLcwEK/ACyLj X8x/0VoX1VqD3soeAMCbFW1gxZ64MPyOLrG2EDxsgtcyGoGg77oC1EtAGkFtgHcM3yKdJAUATnwV pJEIUqNI/Fq90YGsYyI5r58I4toK4mYOwoYFTckqXFDiVI0DlDJzRpWrYuESBMuggsXCw1KXVxd5 Nry82Ni3gd4NMO4N/9w7OMq9kyPycCQ+DkAnh3dxkIMjuDfIubGwQfWw1lbttbYADuqN5jYpNAit 2cgIjS1atWe9AQVo8NRiKxtzR5CKHQneY1BNp2ZDaoeEIP/OEgEDzIhhGSko45rOabROSJTATNSf 9L7FnI3OZ8/I51R9MJw1nLeNzxurnyneIB8auyLMIQF9ZFAHsgFT6DaG7my6Kci2EA5kD2W3hykg R1qOv+e2iFtAhgTKAHksgw28BSnstNDWLfravaj6onVKs1e/2mZ0xrRTQuUtfwNtq5qe9fupstZ5 LbH1Di15p/X6on+nFg2yap3OG3Rg1NW6nOb3wMHIZ+cVRa+86hFVs67k0K1o5I1ovyWpmXikpjVO u5c4GlkU2Nsn6e0T9zYZAfIW9XY4nTtCe6rK8zDW5qIeP9RDVxR5NR85yEN6+pjT08cv0I5jPX3n TiqjuMLE2mXwXNRXQgruCbtNPFYjVobwC3g/hKiaKEwl3o0JzIYum/pGG7uxI2hz90oXCZRWoeC0 2dOG77f8AVD6iIkxspExa6SL2oaqwKqBUnmK9RFaCagrlNwqBZXXbJ5ULBDDz/CbgmjYRFmynZtz DsVxmymO3EShPzeGYII4wWUUrDKN6LBdVppQoAQDfZMH9p703Ky4+k2x9ReNEha8A1An1LgviHk2 BC0KGPsz4Ta0sEK1sIVGzW1UfrvSoHOJm1jNqhYFoBuJMhIARKLRHe58tAOOHJn2D8KqktNkZvxq 1ETli+3IYEPuFb5GjcWBTzexmbhSWGsqgCNbBWLcKb5VowpIaiDFufzThsEvJhBeoEJYoVLglEJA vdA/R9QOKQw6UTQ8BMPds0Rt0ftJKRzaoOJDIfEOFaGJQqMhLu61Jaczec1J4+IEdvWaldevyIXs 9S2veS2oh61iDpMhDIyBJvu3Zcu3I0sXbV6CTw/OzEX92Jm4k7ZZ2lMV19TBmAWxQ+xijFXVrLIa 1FUTrw1ef+CEG/HS55I2GmOzTRxpuOClBfHaoWxwqx/Qhl91+UuaFFnyY2IbVUnQdlBzyMtNXN+A wrJmEdmKUFQ5KNCQkCUjplClK7lmX0AMqb0DUXvNWz/5AG7qZE3drIeKdqTvqhMUMipv6ggNmLCA OS8j0LNRXMEAzgX5rNhno8GuijKcDL7UQgxZoQXUaUuDJ90MnnRhj8asuMNRkaUD+ziwiRFhzZWc szo1VyIneeK0nsB6ytVkCYbDetiHB7BxUJdQrPuH3tsi7PikPScun+D0QUMAjOdn0X4atW8IyRZ8 QIy+ZWCeQDUFhOu2W2CDYeTduWdELvmHCMHZ4ColT1HFaE5qhTQxhcJ8KtSYWk32QjqV4q5Y2RSa xRTK90QROcCWpBNCFzCcPjjCQO9+NpZSuOlWb5adYgaKvKLxZAHJCAgnTHKHthQjkxHKWIkTjd1o exda1oEGqQcNo6rBhSZOtFKBfhfTNmkxFOOZ2ng9nIuxrU7l40aGOVQcIHiuXZePDzxytJtmR8pV UZWHWc/Tp6+R3OTDx9MfP717//7Nh89vnWGSfdt1XSemCSP3GlZYSFkhhaVnLNcQqWyoMBlUH7VN 0H2ATjFqJbfKtNq0hhvbKzYTeO2lAfqaQhujNh222fyeGWKGDcJLftt+bcy2gV1erqHYQa2DMucq 1DVGXKQrJobWiGMYVakoOSxAQQEfEvDeVG8kzBgNcJoCoJIwopp/QdumRX14Yi39ghpwg5ovOToD gCtO4pxJmQXFbgXHZq8Ivpxzs1FFtVfsphlnCABOHmE7svnxNGNKvVawwFg4DaINKHkEHs+MjO8E N3398eNCA/8VDsiAEnwd9OyQLCo6dojjx2p2YC3YKGWU1G0oSyYwEK07EBkQlcHASdOig8+c60Dp pKKNF5JILa7kRikOOtTPe1ZpKcJCMRbS1ldJjUetvWCATiXkB6CBlw43O2FBGHEfnDkMwwAizVGV kAzBhVjTuukbvhpsMx5aOM4Ku50XlksLA3WnPiszbJ/GAPdnhmESQ69JDJgCgL2m8j/eB3JtOGxm v4DE4p8O2nzYkgfoq/WgbQftkm+g+9W+lQfN7Gg2nKi+FPGoaNvFwMmjUal3JfhXBMfdkWnVaVx8 4Og44f4njXdJk92KLXy01yQjwG8UrgH+kuQAaQ0jwlvOFOjYTdKzs2SY9IxTeKDzBHQEV0aPoxeF PSnSJLVA9iNphC2nRg7CARBoTl6WkX0t0uwj+F5sk6SEgoHproG8MK1KWs0ZDNz+V6Ej+PEfsEQE cI1bnNvaQADACgFucbvys3pFwp0LGiwNkuz0fp4LuPVFH8cHROoCFCuUF0+rX1gOmOOA/klzqedt BPTOdQqq9dkPJadTU4bfHktaOVEu3h+CfAbPD+e/e+ePd/1M6rEwXp/I5yOeiuDtoX1Tds3Og3Rw y+Tt0m+Wfqts0fouMWnUW90T7o4t7owFJoLOTob53bBxO6E3ozfM8BwAc/gof8/ncPqkN7fTYcbm 5I7pdzZvx/qkPJ9WW1WiDpFCwImnFUcmQgLqRfOUrYsopCOTu8O4iiD2FgXfh3EWxa6iqbXJx6kL pIadF2TnAzEOkN5AY6wnQHwBbjpAxhUw7PwAkRcg8gAE658sf2fz92zzi7VPdr5Y95IyKEmDI+sL ceJgLWnLPnXwwsmDS5Q8aBMHJWWQc11pZcoG2WvjQbxw4jc5kS41t0ppQspLQU2Xk3vAhnAF3vJn 5g6ZGOs1sjO8ZxKRjvyADBWr2X1esUeDPOs+f0ghECvrGMFqHNUy7BkQEXhGBBhRsdZQCN+I0Fes rMnMitoOzCM961+tUFoYBpLAQXKZN4iISGYlIxGii5432MBIEjhJBO8gOAtMAQYGwk4RPYklKLEU JejTpB1TvPnFzrqIbYvR+PaVoob9+6WaEi0wFr83GC3x9W+K0RJ/f8umwqBGgpgHyqkFMVgrwWpt xv+fw0ctJqiqgb8YJb5P3sqlbx0lcHWemeWYyekpSVyKcoKjPK7jNC6r0OpG7K3OFpNwcAd2Q1wh R1qPXEOSflMZOBGlYUiwmynPgDm0iEGrZFahTvmzZBTCCEjvr0nQlTseFJEmPW/xaBWDXkN4WqIw IQ69MtvBJcSZY9CrDo7C0kbO2KWc3VmjqSQIKFkIJ5cX7CTUvf0WktC95Ca/bYH52yunnpPB5iUx +Un8CiUzrQHX3ZRovjCNwMAp5v9lytnLHxB7DuW3PC6cxUutvNqqfANO/5WfYReJdhK7i8iJbQsX IAeso5zikFU8kNmlucWSrbg9XZ28XyO9O6/sAQafp3P47HI64Ea00aZbZJNJ0twOSFw3B84bg5YO NCYcHKO4XshnFwuxVt948IvHPvHYF75YT3jwgwd/QfCSBt9ob/LexaE9cz70YjLgN1REyI3H+knF yfACdW85Jb5jDWfgxPgxCvMvjG/nJPl4idmFFCZ4w5pYp9Ocp3pqKKcUEDGMNSa7s62xDSIIQdy6 XduRf6ojVBsYEr24TZk2Z9tiG/CLvNNoO2gX2wz80bP4hGme41WR2S2cbTKvZU5LhLNhq+sC7I6U yDg5I8m6kTgmWTKjUpFo5FINFjFW3PWQrh7r2/kmj/V2g3v+KdtS154c0AvB0luId+XGK64pp1dF mhXklasIRG5jLZYvYdq5q5ykwSs1EyDax4pMR2+7jg0WzrSzcAZQEycYONa8IbbES8SYaOHdKWti C7oFBAo+QXpbGr6YN1HiisZuYebEDdhmObJXctaKtVXUWpG8PYjslYGdl51aLWS3NOr05GA4+UXJ iqEmflMP704DgXkA29UF8Yx2xwEvxVMa5N9+0mEiXevggM9v/zUHVIFR5PiElR8AzdrSpPWn+RQp oUgDURq5YRVJQGohtWiMiKC3lAhaMKvWbI25oIPpSqZTMF8DMtiQe4NaU4HX26YW9YbGO6T7RNhg Zd5GUwt2aYatYYkWBJxggkeNL4S0oEUtMmwhGTG0S9qsIPW4k6HpixbR8ZyliTCRStgsCqxf4z+u 3G43ZoAdzz0AYkw8vKPwiI9SXwhU5bSvneO+W55bZ/GdBn+6oQ5X8eiBCPHCwBmuutIwCmXs6VDn gm7Kfbs7OxuzObXDeRwqA3J55gGI8uRceS6RBqExlMaLRXmcqV/419Wp6fEIpwYTFiqTC/3kr/IZ AxiHoTdxGSD3vepMPeYvfhztKZ/8XT7nqN3CECSu0FOd6vpMecH2NPf8+1PSEeZ3bz58/fH/OH14 ++njFxD/iYe9n06lvU2ooqJshYQYw5J6BH70JvLu7ImRhBPBCSZgighy78TcC7FPLSWIiP1ppSh+ oLpf0P6s/rdHlYsWaLmzgi5Y2OBpY0i0LLFanlrNxkADzVoNGgQNPGujURqt2mjNU2Oa3slwwztY LiMwpsTyI14DwzjuY8VK2Dd2Y+82LHgiL1bKjJXOhA0OXHzWuWfZ96gIQR1586L0UuCE9YtJgNhP jSHh3Nsizr3SzIwOlF9NpkQgV7sTmnUv6VBKBd+a2hVhPfMYwxXms/nAuZ4f6QMOtA== XdLSbsRvkOlBoD/JDL9k0khWUqU5SWEeJGyMkGDurxMyWkrGSZ27q2VlBEVw2KkSSBrbCLaRI2r8 SVU8uJ4FIjMWPTBgqhhYodRwKEEma1CnGw7mDyyFJD+ZquNgQGFR3GWjpAx53CXtKwNX2kDkpZsw gzIwVL46Se8GTTCXNaY2ebTlxS3uxq1pnzS0YoJQi/lAC5bF8CUxekwLX5fLX4NLfYS7cj+ewKYO V8l1nsKmzg5YeBJTxR186nAEnHsKn7rFzcEN/t/7GNVfefJ/cjz5hG54dGyzo/tXX7cPj+9z1u3V EYZjyOvzRjis22ePcUrElZj94R1ne5X0l36qfz/XLjv5t7HwbP5tmyrOO+qrnfZqp73aaa922qud 9mqnvdQBX+20Vzvt1U57tdNe7bRXO+1vwU67ZofdsuHuttOWd+/fffjGGWNvvv763Zt3Poa2e8sd eXy1z17ts1f77NU+e7XPXu2zv9IBX+2zV/vs1T57tc9e7bNX++zHb5/9PShx04Lp3qHobSh5y6Vk JRc8VxWXMPdcNLfL/EtBqSe2DuC+CuB9/3JnLcG/B16x+6SydFhzA5sZVGAGBFy1OqBhOJvsUEYD aRaqLlMewN3wxYMXL09K3yeKJOFCjEjhwzzMcRhdnYrwBGlzqxgzMhZAbjYmMiflMmI2I5yZVIoh 4nOsIz7HVW8nLWiiPI57onu4KkSZpzG5tXBzUmvarDU4uL2YqsmSNekN0vqiYnbRW7yqhIAh1G0O NZujWs3P1Vqf8Hj4gET5eW9q150J83Cz7OmVZPlczVO4XfT0es1Tus0XvclpgNu1Xf9LbvMFb9Hf Idy8xSfWr4XHbvJSRvsK3yGJJSoERaIYpZN70J7ItUSphxoi2Al8t24Loj/8vtQgT7Se4cDblysi nLJQ1LGjj2gM9q6mlBNjQ5Mw72YKzPe0AyekG3Lo1I+1r2YQ+7Pcqa4b/kemtC2fY4vn0IA8rt+L pkCHu0+lvOOAdLgXskGG3s6XI42F60pFO32kcEqZ9LBDhn3f75E4PocknvjxFWGFH9sP40WOHx/W r7b3d5MYxyaa5lNNhdEbrQRIKHECIY7S4fgLU7J0WzOSBicQGeAQgY5RGKVn6J00ReKLlcpFtnaR XGeh15hepZBkdlSZr0GHHJOSJ1dKJGBCSZ7WI9oRu1NhC2sBPVP7pPGni7SdKRT0cqXBryJXK0Tq 0ruSUu/Z9vniA6e6XH7gEg/8ERGDhPKQReT0oDeTcoo/SQelke18xVM3Xp6SbUAuttLd3OJuiDjY Sne1xL7W+QWNV7G40/tT+9R/b3WsmPDf+2R/wDz/VZnXWs9Rg2rsggosWRfBtvDKKinirKdGKrg3 +lU93SmnT9FEiSf4WpjkqNTvccGcCq4GSUrjJz8OlkUbKOyiZc9S1YRK+kVvF27EhHIFmK/calp+ +dlaKd3sC46qv0u4OapPuFF/n/D4jfpNa8eh9XIR4w12xdTHZ8eLJ99jcGe8uE6Cg/uIMfcYaKeF brMdZ5k3bDWfg3gx0dbejhcHDtqLhgc1Rsy8s8w4C1GkOIkTPxoLNnUWsdJiQRTZx3HC4wVxZUmA UqblosE2LhiWhF37u2AgJLHAuISnNRnS6p0h8CcYARx10GFPgQK1Ce8N45Ab+FDBk8mK3bhDVMBp NBFhN+yPRnll/dHISZRXhi8zeikVYXUzno9R3jCEtyO8wdS6K8rb3RnlFXoGGd2IEg+igL+say3S ysN8T5T3YqO8toqY8luP/U8xfmtZrq7Gb4WaPwiSeCoGWhG7EQRiRarSiogh4OoTvr5Vw6JforcV CvyBaRQlfttz/Hbj+G2n8VssP+GdC776xIbR29aNsK+zdsF6E91PO3p3aDvDy8ZluxJeMrrj9Xa4 5lD/aY/aTzXm+rKj9kNFU+8dtxeNpj6OgnheNDUzds/IN+zHc1kVY4J2lXeR0WcsPS6HPyjPveu6 wNaT+xC/5a+w6uiDrjo77aQJ38p9SN8aBqde0Adtc3abkKnJlftQOIfcoNAH9egrEjcRn9DuQyqV PHqVgj6oOrwmU/k48yF+q2hcf/Phyu7slKkhfCv34Uvldu6q/ZZ9rgawe/dUnuoIOewf4o4mrWBQ q0KUAaHOblgZGCK7UNVRiLTRWBOtM4Z1YkMccXfWfH2kQ9foqmn1aukpegw9J3TyLOhGR5/Pir6f S6Rqy7PmW9sDLN0zpw1SeLLSa6v0Cht9tuYK6frk5+Drj+IvZgOdIvpPwtDJz5U1MtHL8B4Csy5V d1hNdYeRqes7pqlnaRzJ41giq0yGPTTtKTI5lLXY+KrkumZmHh6VVl/I9IVGv4oojzdlk5yBaSSF JD9ccB3xRm7RZjIJW6QttbGZ61q50M4cXd3IVyjU/4HyvzFXiuzNSoppqDD1opUCU8kvLfeldcRk XElHMOo84ztZWlL1dQT2kDgTC82rUM7ZMo0LYvbCETzU7tk9sLMtY4x48AnYlWzXsbuj4AfYB+qy YTpaZJuuz5JXaKUmsTg0pBpvG1YoXr19TugAnkGt5hX9whuXkSDzRaRWiWUmaiziS8uKtQurX1gN w+oYocSqVTOSUrWQqbJ6pG+gxkE1dh/VhZIysPBUTYhoRIWnlQpQ2JU2a/3fQTlZY05uueIlELGC 4WGt5dL14lOKbtfVqdJSIDtdifQEbXv26yMiszv4B9ychaKw8HR6A5IFMnufYTcceJM+D0Szh2yK dX12i8koNo8filSTohw7fxynvFS1Z/orhYKv8LpI75Wnc+vrePrj9P7TjrgVR6fZnYbBn81oMy9z vMcUjzGreIwRpQQaQhT8kmbqiQ3h0ZuwmITGqKB8w0FIDETCLkwWh8pmlHoSKrPBMgmXlVEl5w3i Ys5BC6jcrt5hzQmqONGgn3xGTajCGuADissL15jo0RW+r8K5tQWoG2RRJ0jDIHYqw1mwi7tHR4iv xElQ9hqdXd7JNbMPG2tx+tgoua2935Lcj1HdHJSLKCFJVtr6OR1rQBXGyyovgb0sZqm8sRayAKom BI70uo3XcSRoVtxTIfOGI0sKKllHoLgCxd2b9wXGKUCJFxCMx1/dgBkvYD67I+MGjsvWUaz7ed6F YyMVVDY/A++RM1AhtlBpo7lOtR1KB9VR6aBCRXyoGoSM25AtGmRLBqUFg0hhsvWCIlAExKiIuKhz y9yloZQx0sIKJW4vom5ARzSL4OpcVNZ0fOQgZCxiQWhkbB2dZi+cuCL/hV8VK0NXGYbfZ37/ITld 5cR0FUtpG2oc0fcaR8xsuNEGHCWF7sKAGF4oEMXKBo6V2UiZTaQrTIVGiZMRaE647AdIKjLOWqJz NZUYQwVGW2yxZpSdlNPAkhqQqTcdqopSfQ1bYyMuBmqrfa5ac0PqE2uV4n0lz6Nq1KF+sVbogKiQ cVykuk+a1KcOr6Skh3kNB/Wlr7V8XWoeQbhZ//oJ7VowhgLYnRYY9tbyZqIWAwKV41JQlbdqgM2a JaoIVWqoLLgp0ppdBeeiSbyMohoa+DR1u9jwsdW76rZlEvSOSdAHdPkJqFBCaStToXNEjaKkKSX6 nhbdUqNPEUH64oE/wpNuuNK5eIrwpUurlDa93pGnt6w0dWBY1OUxJG3Pq37MsM5BvohundtVvvWk sIppcPwR55I/oZE11CuclkrXhLJQtiBUZarV5GrVaAFeuIzaJtNmbQt7K67WanrRqk2vBzSv16jN URuTwYuHkIYRf8Pug9DGp7aXC04bPDLcrOEuGJMFMUJb4hNuFS3EeAWgPF9TP1FyfSnbl7zDS7Vp oXWqPdFpTfUZAxoexe6vqAKWuS3KohFtKL9ve5B7gcX5KhWwPeYFj6gueGGKIE2UoDVGmX2cufeg dC8sZ7S0fAu1IyokovCNSkWQMCPB5aUTiQERJVRPHikpGjVT6SGmreAPZN1Lue1aW8utDw3G8Jij ttm2qxZVZRpmCQFXm8m1/qmN4K7W+NibH7EBYmNkwQaJ6tUDh8okWDZGKFXBqMbAW4mbWZQqRc9q j7IsTQhti6rdhlq3nda6zVa6tYVuIUmmsrVu42q3JRrFtuKtpFjNPCpY9xZw+vRc+9bnlLVcATfU wK1wDZUMS72wG5PaqtY92fdu6c1SPkjrussmJjs8KxS4bqk12mrT8KzAflj7iKqpZYrY5KuNsdoL h7Xtl6c3srtv29pH1nbqCkWDG9Qbaq3uYHcHy1umv1jfsgDiJVACrwILlLcr4QZqmxdEqBTdS/5g jN7O14fOVYfO1IeubYVoUyM6VImmlTOzzBijatG0imQltb46kJSOlkVV6SRjCJLUT665ZKCxe6Ts /RwaSJUsXoChDVHrk9ZlGkoHoF/Z1jy14TzkP8Kj0hZWlVYYNPVAN9OCKbgASoxF5YY0K9tH0wbT +qhxCXGIpEwbSZvGSJ3Q0kcZNxCxFFq2EOq2a2u2LVAu2TYftOlqc6sUVArm2/0mAEtPKPtnti7f 4OiD57TEOxa8WSP5jigQwAEKbzdW3sHklL+x8o6lqjuPXWfrAz1yDPSNDRwZObf87fNIJaKKcycf FVLhig/i3vFHbXPFsF7kcI95zoqs66yIoBW6ocoWK1suzQSaUDQBJ60+LmBfqUG+cvCSyJ0UayEx SypK3uAS7lC9ltrkUp18UplB0OAVBYwXOBdAt0eBsklwwg0Kvx718L7OYh+e/6gwdlIDbi+xYUE4 hwuGVArUNmr04TTcV6PpmRU7okR/jkehYk12a1gQldCGt1ahGKZkxSQoJGEhGxSinbhj7V+zwdxM 35J92KmlwPQJJe64ljyhRfIEv4luuGn6bbLF/bDCmtuUz0TZTATO8rW2By+dayy0vWKUpnc94Pks Vgy4+FBLKciP3iAUAkrB4hSkoHR5FarAaBCI0AqCVeh2dTpLU6fzapVO2MUOdnEDgmaIYTvsgBdZ 6EUCFLmkuIv8jVy/jfgmkkKjsL8BU2YUgx5kCo1RuCgiBEvd4MIjp17wJG3A+7/BZIqHXHGbEJ9m ix/ki1PG+FrB7YxxC0xJlKqH24/wgFPcIKNbxv8y3tHm/QFvtfmu5sYYVC3et/WwbdmGCwpUA5fK 2kWsoSN2P9bdU8XXPloqCWpbb9oQtVGb9UTMprn5Chz72LRdpEXu9crUGQ1u9hbtHMlYwaqjQHV3 KZZk0VQGUVWym71lZ5F1sYfKo7M41jd1qofioxVnp1U7F3rHWKzORLgH3IA8nSFaEcdmybPaSx4Q ewayNtWtdsVGA35xvKzyKydeAnOY9JCb+1FF9yKa1MH8CQ87hzvAF/vJK1OVzGOJ1Mn8LLgGbol8 hTQ7eX4Cx4E6jgONHAea0GTXkricVlUmM7OJAj84I4En5BYlV5U6+ywCcOQIzIrOzEuUK0nQknbo IWZRRRdmSJmzVcp7E/cN/AgxDUI/jZDleomZXvy25sMeXtPbU6D4LZc2NL8ZN8DbmQ== bGj+8w03NCFAaY4IUPakW0IO8aLtJQ+Ij+vaeGqKq0l++wqPD3PlanZ/765w9/EdnySPn0oq3usB Dw/GuNvtZduP8IBr3CB941nNPGC57zHf1SYCcx218bAN2YY2Nyx90rpda5PWJC3a9YEBZaFZv2EU LDDR28201TR318C3Hx6TNgnBDdoEydBpY9VS1dgaDI+PcPmUjHAqNBS8Ka/Pql08C8MPhyqI5GcA DcN1zKLTsvpcK5tOxS5Q4dS5cLxw5bCGgNBp37tzQtzdXvKA0615+JwZOsLVqarT9eZs1VkK2cka q6j5WXowPyGZnNIh8ayMZ2Q8G+08rGkeJjNwN/fCvIvnnJ1sMtEqEHapHW9TzC+VYZiiAFpE3bR4 kK7wTOWiaEWWa8omXMYplxHdUY656Z502TjhsgKTbylsoZJqWaovL2UmIvZM5SUittOSMUUHBvpz 2w98wOrpDTJvZgJEBy0TV4YoyHw5bFum5R4LJFvsnLQYoxiDIAfTFMEm7lBpAcIZ0J1iu4YAoAQA QnycsaRBFYk1gEhkJruxFV9WUrFkAiOUgjCKkdlLIneGHWldoK2rIMNaF2SMJYPLSZcqEi0oWMCk Tk0ZuWIo4SKatTkRKi2TIZowmc+LqUsCfXNCj48rSWQrBJh8AGk4j21b2QjZ875OKUmM9z5XeBAf qeKQlYeby3vuJt1LTCTyCT7uMEN5bp2lfuqac9HYjOuXOiDB2vnGzpi/VAksXYNqBIfXECHmEfkg TwJuf+QojwXqmmygrsnnQNNjj4QjLNygMGNJ0SUk3AUTFivlXGoAMxMlL3Fi1pSFUhA17bDS0F3H OdNTBEleMYCFdVoA84jS5OmIwgddV3XC4bNk+EzR6QSGaStmS7XsZBFXasTUY9nJEJ8Lyk4m+TdK uGRSBkKyACUKcHwkYsxUxlzjJtpHIckpEdOodobRpjejJUnUG6ZPE26x8KgmojmrOaeUMr5HTmyf NHWUEkZLZryRvFjhvRkYhDF7rEYYtEKTZPfES4E8y6a+C6ecOMEX7/q29EuSCdxxTa2ZKZfs2NHI dQdkuxVEmcDKlBbxyllmucWkltHI9WbkPKMcog154NCI16z0ONt62eWBX8sEr6JM8A1MVrWE9kJg T7JT95ngNpzXazat22fBBPI2TaqVtFpJ3woJXOUuP1XYWhlaBgZbdge67CANuA2aMWSzuu4hHjmg HgGrBe9z4tOM+DgbPh6lMEaBVWDbVjDUAiFf/9YYpTwDXYi2QmaMJk2wCyl2AfhnoX8W/MepdqDK yFNGaDpMurvAHXl3T6KGgYgbxoySXU+b0WiXiMVgTjDlNqDOIXV4Bkwg5TSIWA1gBxVojFlg4+wx YCCGDJiIO6h2LDpxChzIpBxKdnmSb4gqLhymHOYTDnMczBEDM1gK5ojW2f9LTOuIxI4at59M3b9Q 80+43m2oA+P3YAL4FSeD2fi9RPAlhu+j+MT63nLQw4Y9tu0CnKVS4rPkHBXJVLnWcL4Q6a9wXAaW S62I6HtH2S3p5gcuVTDNRG+/4S1TgcOO/IH+fil1jm6UMt38TU44SRaN6DQ40fyN+cwbfy8VXpmP 4YyuQ6lkyoPZH38F8r8KWF+plWWnUQ5I/3NBepc8E6RlYtUSap65s3f9vDllw0dWF6dMNKw+LEix V7DO0GOO2WQoN5zG8FdlOEwjRWkwKgBgm0TF7pXAB5VswHQ+6o3a9IO7f1TGeietfe5e5bSsgWlI KqdJDW71bcxRrRBpAUlXEVA6hklPx4kEQiov1WSi2isMf24Z8czpA5o8EEqwDJovoAVYQJnVbLGc tL5MWtNKC7DQTcpNpfjvgP4+vq1ix5U/gfq8As2YJRozNHHJDcX1ZLSaDFy9mbhUjimUI3WaSPDE DvG866BmOpPIcaAw/gjID1bhirD8c1bnOtrVdV+HhD8+bO1ZD2Tqg7xKdLLzORz+A9rtnbCSdMpK 4jlBxOivvT3uiUA6ZDFxX+/dh2V9qlt/mGC5P3gc4ofzme31CUlJeieTPCy3ZkixwHLdCzcZR3+o Gk904El4gWM95E+oc+6EOkqZj8DzFl7Pskfx+ILTHxWpOxmk7sI+wA1rMeMWLZlypcJaa1x3lK4s RuaokLJFjU1xEyC4C9hXELKYOwVnjbyBSG6doFhCCnPDyKpeN5YZ1ItgC6KkDMCSmjwrQVVgAbbs zpxZbCmehdF7j1RpBlsdZkfszZl2FagBa4nRpW5rxOptXBHXeJ0VwWKL/dpyvyPjWQxUk8GaQj4Q lL6OoqLuqn9KzMOvB7zngCX/LAUdz7yB3ps1IC+/EATO6sfaKOWO/FjoxGp8EglmFhCji41drMbm SsIc2eBH5gH6asPn9ZaJvHgTkJ6ZgE02ynMUPGIknzbGyAH+6kzrd23ItJF/jmzZTpLZDwoPCOgN e5fhYV+T4XwxZAAFm1olKC9AYlUpdL+9dJmmNAeBNQBNe+UO2DMG5FoyHsaXoK+BKAYkw8Cmb9nM zosB3gcXgc0msG6CZzgKcnkF07qjJILEQRDzEcWugcH4jILXyHLPbU4pYGfAFDn4bPZo7OOLi7SK F8n4kcCUXNqXMgqh8BAIt5mkqcevClmka+JUStxKWc7hbPwb7giBP4Ez2gN50RaQyqZpy2UKX5K2 RWsrtAXMUgzonbBqQ0p8WN+y9jsz91qZgaCT0AayoyhzEjoOktNGhTUKDCb82+tc7aJIbxzjNfFd nbwmqAsa07UR3eNorkWZxIFcnePW6TUbBElAj+xjuZEDLA7ngonn7g2zOKprS32lwCSFjYBBJSWp qM9vjO2GJNP1uU3zDSBJpL2nddcaHH7UP7GxeQFRTvBRG+9uE+ToJTJtvqstcY5zvq13NKMiAP+K IvyGBnNgWjcfkBZiNX3B/1d53vGxKqNE2AeOgZZwL+ZyQUF3QgxoiqoGxEsKk+9TX597gMds3jZr 9Lbe6m2iGLpUuBHPpvgzxZfZMWXvvqJUjfaxKWMDmMIpzOFNVFdKAqk2+F1rCRvhUx4tF5en2hQW 4toQcAmpskkEMlWJ8kVsRptusUriT1LNxtaziYks91SWbNpCxGhZ6uIMWTONVrtplWdGqLbkEShU J4jYVScthpNp1u4Up22prOYxp7lwrfdsn0z8JLryQFm+KZ8zPUthdaZHrbzrwrwuNEISi++U2XlC duoJ0F8oqdGB1/nCzM6SHV1wzWrJka7Q8xhEdye50sBydVQhODChwqwybDJCaFF2BuRsEBYHZXWo wLhmak6obhi9YfKnOMlayClsUlRMZzHC3alQCVFeGSEkAkoioFoaY2l2jHAR9MQoXPrAMAoxQeUn QWCYYJ+bcNQL2EL46jfS88hoBRMZoEfFPyXpW5A0FcMzauWlaU1CPdq8/hXgH12UZ09FClolReiV 059eBzaGkXE6kovvZhvwtLP8EESaO5aWWmLm98YdDcUYE1RA9OFVNovA639PZZWj2iq7mjjA9lNv 4+sJR7cNrt8k6IaEDD2iQ48I0ZdIKzwsTwvGW3+MH96XVU0Lq26C+oOovqqQSwuldCCUFjrpJqaT 5hbIPwKZYMo/uHc0hOo4oTLDrKiXgKbI1T7YzMjaEgJqP7cJnuLOfPw9lS/YwHqGyzcOradWR8bm gAOjQzDsS2J3XMeuu2kFURpFo6nQQX8MK6fY5VMEI2WzxkraDjIH4loWAW0xH+BjLGVBCq5Q2xd2 rAU33SYZ6zX4Tmq4arWmEOec1TrFuGWIYMv3oJVzeGWDWYYItnwxRu5BStStZKU4s+Rq+kdU5F6A iFvE/B2yWLuI8ztT75MjA5zRCqa2tw8NrAGuyAgIoW2QmMBk4gGb5rgq+AMU/THinQX2Bgpko9Ir yEHBeg6MFdy4pl7NsRkuoso1VKVAyMi08lhdDwyz/OiukGCABALskbrQ91gAblLkRMF/pgK67wZf 4Nz3AN6/j4Z0fM8+o5d56L3qNhkG+pF5bwIT/aC7dMs7emM46aUaCPHPlYDk9BdWL1dWQEghmZAw ZWI4gRR57rVaEHHWN6wbEZr0mo9fOOn3xbdj4piQhRKTuAXymDkmcesjEjfFJiQUboHAbdAgfheo 2wJrGyjNoRAdClHbIDH0FypgR65JSNBuzy5fJ6FwOHZGBoL9pxHLH9LKY3WRHdArTVmIExaupSyg OgPHCVFWHKm/2gLZLLYxKiCQLUQTlRGwpe5kjI9GeElGWMaXRtePLY9sxSNr0Q52XGVUZyFEcuNZ IRvShmXdBXWCAwk8jiGryjuTvSu5REokSqfyRlBrirwvaI9JIlXJaVRebmBxdy8YClz9M672Hi2a Shft34NJ85Twa9wqVmDSHNOUAt43kzYobYp3p4QHXrjgtyQYY+jf4Sr7e741mR1Z3wn88F2mybae MsX3ZtNP3oEr/0z/IMhvdrzkS1nt67/fLHgPAcN+rT66qf98o0A67IoWJDXSo1yEsMOnrBUVR/yx ZrflZIoZmbJ8TMTGdETGBIGNCaObO/oKnNWBBEc5OtO2ZttumhOnJ0S0O4HiM27jrg2Zhp4viHh/ esOlErOExm3/UJohSJhE41buWpG2FNEKEfFoaIFCBlm95pttekqD3VvPf6BFC7Zq0t2tP25w7UOu kP2kBmq4H7RrwLe6Pns/2jHwLfwD1dMSH3wlBbrKQFnZKJqNP+O6Lugnr8azUzIzNWGefyhiv5R8 vF5rzPhj+upcPhGvdu8VCKGj1LxQiqtr3Htdb4gvHz2Svx5TlYyiFzV137lyil7p+TxbCjLgnYzj uXH6nen853z7ofBDNoOv+cJPgSKKPpTsoe7YKy0ZehdO9IoZ6jn+gKldNhVvIE7uSQkzEX1nGDI7 TegSlJ3wTF2YSSpA61qmjBqBkXXCFCWMZgFfJwi7mmVhxxi7XsmhRt4xEWwHgR+qY++tKRLimwha JpnqwqPXNoQGHNsIbTpo8+0WXNGlBoUCvlsCBXGV+UYh3r06YEMWHvKfblzEJSRPUtSoYxc+ue2p sMDKDnrJxavYD0/D1xFWQdLyAl7ScuYJZrJQhrA6GttWYZM9m1i8S9L+aRnBlpi7LmEGKyMOuzIE C0CngzShtksf3e12fVAkrzXNQbD1HWhoRvV+u4EBKasZ0dJKmKXnkN6otKyLBmstplXi9O4BTEIr oNZrwFZL8bYfrEoUh8aMWMxJGFO57RkIrZakOhTslKq8ArZFStpBu+XwzxVTPyjea5z+K0RlcCX5 MSrPGWXWhfzHcWdZKzvAUwzr6yiSkuhNi8RLm+O+EfabyehMIZ5p61GwPR5ae9COi2Bou13fPlfh 3sZhbJV7jsTIoISKqVLftc4yy+aHxLg6QHNTrw/IEUVDNCC+wZ1URNP1oQhjAJlhyHf5HTSpr4Py 4xyU4NSaVeDYusUSXxxNanWgSdoB1kLcCLKdtxcznYkTZbtQIJsQefOOKI66KcDVAg== k1bKooVzAAwdSRyoFHxnw1F7S0wSKI8k00hikz2YsGRjgpFlVNx274S2buiojggc+KAn8UGb+jpN lBwXMsii2iGA9ObW96zeZ/VGBPdzcECHSiFi6bM5D6bcTjDBQ/WPCd2Cgo8g/EQosqHFNUIhDdBs ulA2w5bKoNhuvtpOqHdhKu6AAlhtsZ0QxM/X2jmuscMVdUxVnWzlnIi5LsQ3TRulAf7qTeuS1iYt 4yCxDfTlDT7Sp+Y7PPlBCQ0jiubGSxQnjL08mZw08bKkRmm7OSERy9YgFjLIbcgwEAWlYbf0FZxg 4QmTXfcQcRFZlrPcwl8NOEGXvq58XCigKIRSmc8EapAvXyAwcCkkVEsMKpTW2tgLvLChFouBXCxK 0kkz0SiIwlFtLhzFAiEnDgZ1C6o4gF3trV31rYiJPfBI50pwYWptXIMrFQuxSAh1ctKiOCoYQNJX M3W4srW4EtFgBQSXkomlRK4GV50KC11/e6FhSmtdkxyjaaEmZlZ8wJMlSb1rUfo33EFK/ANKFtZK vD7iNBDUPLy6QeCmFmVHYfI9LKApzfnYxf9ydJvquE0oEUMmcsnjwuICTFpILDECRWJrwEuqK2iq 8sZhGhIYMyQqQ4hdS/TaxK85xie6g6Qzhxi2liILssNGsm0s28qPfa59x56MxocKjVoRhThSOTLk 5MheiECiWIgkiaXIXo6E+l22nN8FS+ekpboiVSOoGXFhv1TRSMtoRTJlL032MiVX1q8VWKSVKXlZ kq67vRKi4gR2EmVXePJVsljJgtVjF6dyeBu1dfPQ26abs0sntEhbNyFLtEFn1G7IZqrQXlqcvPAy qULNxksjt3DBTfvKiaLVCZ/BLcHazQFvkPhwfu9WUu16fENBMbmF3bp5XSIiY3HrfUCzoOJCRn4V j4Q+abl80YoB+5F1+9rNmgsvtsktsY4XVonLaeXyRSOumEaoT+uCFO9Z2U8lbF8zHrvgSR0oLHrm fSDmB52RPANX4Plm51aYT3bS2Alyhbn+bycv+PWArwfMfZGd+NaFL+k2uZhK7LafJZaiiTcNZbFF uTca9CLXfM3++D5in5SQV+AwbJTDkMNdexBIZUAgexjIZirwSPUdgoIMEFFHSKWdUgEhjSba2Oom CyfXSFZNxeCQxsObOkaIpBVOLEK0MghRqXQyKHvEbFGikIGJxiQSMY2EVPraMHk7oEaVPAwi8OjA hBKWQWwlVJPyiJXsRxM0k5JLYBuAwaWTYpYCUmlTnjHBJQUwkoUXBeQQY4VHJiKbGFRsaQYMG0CU 6G8T+SWVn5P44+T9kKQ/mhT9NC9/n5HPmcSIt7Yp+JqBn8vCv5aLr1B/SFLxh1199n0J+LRFUDA4 SNDPJ+tfb7vi9c/iPXuVLK+S5VWyvEqWV8nyKlleJcurZPmRSxYNPvOkvuicrmy6llbbtbN6Sma2 ILwLW39XKN7CNKe0Li8EKADdo694QJ/xqHN+5KD1wsjwBTCWzakI9PTBbpOUYEkv6iQtocZnKIjF GWM+AtYTdxzlJ2j2WFgoC885k3Rgcg5CTkEDaSqBAfkPURuTlsmr9A12hVOyDTeIiMkvFW8XZvOz Iq7BpyTvDSzohNhvApZ0UpOS4f0K8fdCr0a/fYP+e5kk3qNPnn0KDXpPP4YKKWYo8m/1QQHDdxzJ QUP9LOKw40kycJDS/QSeJwtPi5XQD1z6stbhllwUKuMi2I8lSTVxyxEIqWJSMIODOoas5bJCcokd u4HOtlBcPc/P6H+GjWtkGorJbl5OYEpSZkEJh8ABEdrFGk7WoNIR/pXfy/xjwVcrjvbmx9qNsc9P LHG8KzfaNY544yMzLcuE2g1v4wa3dYMbS4ZYOqh8cCO9zKVM7LnyswCBOW7IvTPcD3+HE6BXydBz LHpmqTDrPrioINhUwrpRh0QKWPxhXBAvLUp2UMIsTVY6KoWG+aWEjh0kzxSzTBsEuVKWqVOLmFS6 Q+ZPrwJ58HHF2aW+YAhqOlRuAlC9odxSUmikOIiUlvDLWcpKSF7phVWRTrJKWShXvnpZgx1LXbmY VBvpEX8zC4k7FHUy71uTaDPylo8gSakVW/K+3jJ1umzjgkwkAUr7dLo7y47s9l8h1w+M+2HPjXfY 6+x82u7cGIkD+np5sxy7m5Q4m01MvgvR+EpDaJbzWVife2Z9ViJrjo8J9/MShcJ64oDuOAZm41+F hrwk3DVrfGA04a1OIwUczwITyrLhqxC2iiNWcYQqjU2ZiFQuAnUl7nQccLrTzfs6fj+F8TsevTy3 4tHoMb8iGBL5dPQGHr1W8S4lM69bJvnZBKKZ7KjV8asClOWu8YsxKnUYPw0kR6FjO37z08YvH//9 K49fqOHRR41QZPuarqTslUp543sMjWKU74FbZAaEi8SQkYDFNcCRKGvcbVOUrx9jcenfpLJryR16 YZ6KhcEms2bxE9yEFGP/swXWmFPmUQGnBf7RhIGUkiHjjMUBtbCQTCjYt45PUrOiXrLKXogKzyfa wBAKjBEUrjWaYwC1KAaOrobO5n0ddEw66oThbwqA+xB4oCUYOHW9crP5wmHwCbFvLdbbQcyrhME7 txArk64+IHC1cYvHJqv7RViL+iSEX61JXwmpKzZXLC7aZst/afo07PKn906offZ023V/G1fTZa4m dtDFrH6hqB1mK+/r2tnc8sPrsQs9yh7asrlDkjYU2PFzWXyczwVRCl+LlVfC5ShDvpILXuPGR2ch JN7CzpAIJqz4hjOwNnXcJAWebS5ArXtVU9r6CsWM7tSMHtVbKBa0OFdKdq5UoB7DnG9lTryG5DMs GMVUJQ4VtJZZ+hL3a8zreVQC4XiKT5wvxrliEFVBqMzssvNr1OG1gxuXP+BpDziwMtOYO9LMt7rL MUcm5Q9498NRBk5Ls+wGEzMcyFDHJra4hptkuMnAXsDY1xelPKp0wFMHsbiIlwPyIxlwGp8cN6uO VDRaJr1vN146YrCTAyILrGyyHJ+DLseQUGuEArS2XsWe71Mc+JsyfloOirA0By6nyGwUS1RVURao 1K4ILn27UINbf7MUn5BUsdj7SCIHf0RcZUdRxxBoEP92qkjkC0XlS0P1UaaqCR1JtiooiyhV8tQk Vay6mhLNUqLwxpNU+GW94PDzz0uKEnDKEcsWFdUqMQG3x1zsFVd7iWU3PbeWnxze91GhrPb1NZd+ Q0otT6g1ocKDHg+qv3hYsTlUa76P3YjzoyDKwLTZD8pqlDDXx/UPO5P4QJSMpnzSNe76QA5l6aFs NURmiIJMQcSUKCpHFZUni0L2+hflrq87IIvqdXxex+d1fB4an8C72L9AM0QVYP84aK1plpqoThp6 RiCieS0jjlebOxGnW6XpEybhKmRcrl2uAFxLLGlsbS7a//ve5573XErc7b7LyduUrRXzxGaq5YD9 w2SKHbXFtJT+YyJlaWIekcEkmPUm3zSkmhniQ003iysYRulmnU5V213bcyarlCzcKu7W/gWaeUB3 +2E5OjI8WR3by5REAppXo+Ueoww9m2cjmTZznMCr6XpJrk2hHXnkVbadmXZnLyUgPQV68EQSj65m kTzSTDos2D+SLLdr2Slphor6IeEoSSXrj8x5IX/gRAMKmbcv0K7K1r0otg9LKZYWGMBNWDwOK6Ni LmrEBDPGeiBa44HYG6QRYqlKyvQFJt6YqY95+lKaPiHpAy5DPCBuYnnt1tdu/ZvqVtWzIulAQijU WLZGdKB6UoI0pEgruZAgUT1hFQRheqKKG5bkqWYYZseMaYLCjAnTyNtDrt4JLAgzqdrSJ76czZQd rbWK9RDTWoNxojJfaKALVbLQWj2n4o5ZFF8Ze0xxQvV730lcSSPuUOnUQT0T0q0rhsHIN1ECY1tr 46GwPGej6WYCHEopE+lq6WyGvIJBvYYyORb3aqnN1NGfR776bgdbKyfjUp+My+ySOvnVwWncm4Au 7Ac7M8zTVTq0LEBrh0jxGCn7Ebp04lRZ6dIwd8uEoMx1JxgQ8SoTOOnUGE6cAIqjjnXdCsY9mWPC bZS07RhQHPHhejUyMzNfXq34Gzzg3oGYk3qG4s4rj2so73DRQphS4kHKdUjBDluyI3CycdEOU80B CxRKzY6Baacs8VRMPbVmOdoC81RBgL4top0KZSyFHLw05OCzkoMLNXjD3otCCJCC4+KYAv4JJPCA XOGvnfnamT/WzrQB34VNVkHQNIKdEWuVMTODQmU4dR2pnyhtfURqp7ZsPPylRMDLwoWxerQWGyRN KthGM1gqQVJ1hghCjk7wG4HeEPCGUuMbpm0oKS0e0BKm8w1sqdI5K3vWgP8ZzDlj0JY942TOSOes FNXDifgzm89HZy3IKbsqy3nMc75jOucMiytU59sFEGhZYcJDi0kNA+YrzIiZ3Bj6+L/OWXUyo0aT 0q1KNpTmQ6kWzjo4KS1UjWUwCr5/Uim9LVLy6cA9ziCTakUHuDB/cqGalairorA2rGMRP698fUan kJ8tyl7KrIxR0bLAJdhFbIIsd/Aa9Kv2yyK9xt3X9wc4qJllqSBzpKkrH8DUF22EnLvmIqHKx+0Z uZkz+9wJTTa/2Jf4fPA4RPEdMaRX/dkZN9VpGM6ePfmISD39NyIv94Tnnt97YC703v/dUuFR18LX +uFcOCPYsJU/+at4RieAnCnhicTL3tknlmrdVzZt+FmPnuXcHqQ5l21fh/M/eiCq2CrfDT0vNVZb qcVa6dONwniu2rHac7c/eiC8GiVZx4MhI72bI81IFWn1Gb5dl+fG3V64jGcfgcj1K9eD2Hm1f+lf yE0UPMht5bp9zLxwE8uNeXP2gXnDsf9SR8zMe7mFEkn6y6N5n/7bE3tayg+ci6J9Tj/H5QtKucdC 5qq84/9/9GV98QVW/3Uvel+RwB+mcyfAkgChWPHDh3qMtr/I8vYXUdXgRHmVaoixApurcmkrXJKs RzkPxBCJUlpqWo6olbJOyvqo10WJ381roSVHdUX5JMUT1U5ArXNSfRO1TdQ1RdP0wUkfWbQVsIiN Ma2ShJFA4EJJFI2lWOyahGEPwoAchrFBGKfNQghoSeEkhvGL0inKX8Xlk1bc8AcshNpEOqzX7ToI Cmxkhhuz5NbDD9yC1FcT0l8NOMp+fP3YhjqXaJZMyIc1mAqHvKVrCUNKcJuQJ0uYsqTukd+XC+QE 9SO+CSpgQrrhUCesxSkgWIAKSUMDDiBP1Iw/wWACBnTMdhEmnOyYQDscqIctvblUEmMKYiIRlJ8B HT4yepJQ4rbEWGAmDcXGlHDQkpQKTSlBpFEXFCY6r8r5SUB6m8wDKUq7cjVlcj7KI3E+AteVFy7/ hdOiA8yPPGUpEDMg+rx2a+C1wPhai65lf5mpkBCj+PoYd2lKX7glAJyM1jNsb5SkNFOjW6pzE2Iv IPWocfq9FOO2GD1qEleQWIJg9CgxttCQgeSq2trNjYfgx+VvGJ1P3r2jBInwemD3aA== HNSUoKeEQ6nk8gUYGldxKYcqKugQO02l1jbV2554csxoGcj0wHIPCxur8iT/qqUslN+STxLTGAaT 0xmdYHgMew1r2zSTUPnR5pisagYnzHCg8dtc/s9xvshT/Y+0viqNg+y4KHZMFDEPReIyFg6KOAJy 5IfPAO3zIRC4UjDtjnJpPH9NrTR4RrG0g6AWpW/C80ul5SulgbWpg0ltbNaoVElaF75nEUf26lRd LVwCCRD9GhTdVphhSajoZsWj22IlncLSg2zMVhA6rCHkHqBCc1D48xRBoDnowFEdCT0IgD0GQ/eh TlCoBbQwnp1FLAtZAkZXibAlcLSFR0+gyQwGI92Ti0WFclqHLA30po8Uk8OllEBpbuNWJ61KWhk1 gxMBZsg9xFVloVTLMXwKlGA3tLSgWhz1voI+IgRSWgfoCF9kUEamlUkrIOFsZbjWYSz6BR7XDphi x1PO2PhqeQ8FfhEjgSx6KIYeBaLtSxkeIaJbgwZ1O6wyNpgtVbP1OB658A7KulZomI3JfjRQFQxF AyW8babFDAwhl39flTAqF6hLqKXCfIJkkCIVQkFtSagvrNzEHNSTclArcz0o3rJCi8gL0pi53sIo pwRA6SVEwj0dOOv9QrHE0wFEaNimI576gHrzsq+TIrRSsqLQksK72oaimRHOI+oR0x+BwX/CjVP6 QXuhwh6Q+ycYqQBIKRmxx/tu+Z4LLzm5ni5Bd31yortJYMiov8+CuXoXvb+eifd9umJp0oql6oak LTaIH0X+XmBymQkpfHvFQVZsOa4mDNJx2KA2QQOyHykM4heAxzewEelLb49S1Oqo6FVaijO0Ktt4 gYBZK0XcdsRC6WONGtMwAb+YozaZFi055XaiCFpoKuiBLdiWPduh2RKjmtNmSgdYxu3A/7CBXjM+ aFMM1E6XQLEdsoo0N6xi06WODJgYR9X7QFmfYKQsNmox1s0W5SEVvCxiWBRbOF2EjbLoqDlJMLOU TZxXmFCRdXCDt2lLsgtjLp4MIRnEjGTYrcqhFZdTlIKKe3UoNTMTbQhM1WKrCrWsjIsSlGb4BeI3 m8rphggiXqRA+lYaLT3UNLZVja2qbpR1UHK3g+LGe439enVjiHV2qxJEaVcLJ16V6DBo4+iUAYcF hFIwitgkArSJjEWUWEN5ONgVQwgylpCxhaTq8sYSFpVuU4E5/Ez/3n1DfrYFqObOP+lvo8/vf1aq 5+9/1sAGgP1ZM1LeY73RxzCqv2Bi4PTCAKuF5I8zhk1WnfstNA81uw/ILGcjHZQYQmgiyJqXKLZX e/yrxUCyZnUJbOx04roHfosBowlJKaY6+KN4czFhvsMYoUEmWFyCRSUoJgG0VJBAEpabaISrWASw YARN5anEURyK06+R53HmsofHdc5spbMqrnQGmqOUlooLZeJsiThb8SxUgasD14RWM4nKn6nOSTHU hqEhNcdJKy6cRxRkBRfQu3C5yY3jpysXnkxTuKZAWjWYXK5eDabAgRcKyNXKmSUqtuQFOJEFUk9O O3tVFi6f+BXFcb1yWfUnDNnQy+JcaDRHyh1rcKXxpZZLjr+WZydXTLTtBY7FJZs7iQq3VGYaay/7 +GaNcU0O5tQUY6pOXXlu66E9tdW5avqofPODR6IoVVOWfWdLThccvvOBJNwZTZXq8+AjnjXdV9ee eyf5TZjq8WNRbBKrXvvjSEix5AC6jfx2/mQ+qN5T7+/j7w8e56GYWZsLmbW+1HUnETOT9x3v9IH7 crfPG7ec3ehxqwfe60VNGnTHF/1oY65WYWsNTK0dM7UOTNKKegAoKWFgZy0N0aTlZSVeSfHqBTpW Q8NKqllK63FhHg2ByIr3cw57PplTuuvLzu/3/RHM5m/9oFYDCLn41itqPaPMU+hHAyInqdBQzhg6 lGyAS+QztSkB1nuKP8m3TH7K4F/uI5R9KJ1cR9Bki/a2tAkIShZnonEhRq5D4S0ZIh+h9Q5W7CZy vQ5aSnxA7r9Z9V8bbLE+QOv9m5QagegBt6fAm3OEAVnMr2g7gsi/7IimhWZ6iSimW8YsMUkAI6mc rgqqqgpFYo0BrFEpAgrUuloOU1mKRCJIjCgCyKCbTQ2/Tuv3VZzMG6LHktAbKnZqmT5mHEPHAOwo 4/K0YzaubBP8dqxjEJGOBcoxk+anZHGD1tATeKMFGyKEkrwuoymBFoqf3ZkKvcuEdmv6Vu9N2d4r O8vXZgLxEKVEHyVF2+TIo/RIDM+TvpeCYCMI7NM1TjiGvyYaZ5w1HueMG4ACRJnKx2yE+WzxXfqt tQCjYuq2Xa2brsmXErHk4oze1gmBjhAe7tjTP6AMG5Gow6ZXaLRDTfwaV2fr3WyB8SWlY7LM7RJP syQ9akraqBoMlpVnF1gjKT8dNL8e5qjR+7aorQTh6W+k/QOOyZMazoUvaaESw6NrxBZYa+Sq4jQt iV21uNAHimCBCWJRCGu2ISwNYNURZ1aHQrHDzYaiVzPODicigXYdNuVLw5jlJxWtk6ioZtpW08Qf mPu/8Ik3KVNnO1mbWnEv+Ytee5iEvGtqfrr3ILwZDFf5zbZrsftNP6vdZ77EcKgqGn6S6PQ/2eid t4O259ReTJsjy9JU0QZjYKa1yFMDszC2pa2iHaArbh1ARIShVBjKahgq56bi3woyI8rAkhBG0h/l GQGxpystR3gcsyRbHmVUX8AYmdfNzCIDIVpNp3Nng7Hkuwg4tIcLhe4NnRtMdS41CpmuXUPXBrP8 nlZfaYbaCxLLPrLwNUffshpvO3tfLH60+iE2+81YxeMS2/12MOp4MCAZjS0ejcgdGWqJxNCNGLgR wzYCaCNJnmzIEYL6JOmUvYJpBF6/aCETAdnTJchlBC2fLsYneeJBJWe04cP3eIIO8TIBszOyv03g XDN72RYDwEFoToDeNwK7N6D7Z7vTCI7fJYh+OfimCHsLy+8YxVfzrCp4zmhWER2012ylVkMpVYT6 vxzA+EcGZfUWzG+ngT/KLmtgiPKdyqgHaI72yiuUOBRhl+d0W8k7VvN6H6LdS8eg5h2KxWM1Dwwv UB+hUFMFL1XvrHJnyEBAgKiKQ201rapIkqp6m1JForvDKqdUwf2Cq1V6T3quwL4TfC71GvVYnfTZ 6Anw+girK2jdla33WVltQ79VSBJr+25AzQ57D3Y68hr1YKdKsqX0sWpyoigDa8qkLe9gvUdkNcb2 CgjfFXlrog4Ww6thx7nN85pYSnCeF7lWQoCgNiGD+HeIOMTxh0JYY0IEA5Ay98JqPFHJhMLNC3se ZrSW5eeIBHvUFdQdPc8xb0LQL9YtfS9xHym1+YV1UeoxWyZ+1CK11HvYg4CSnSrWYkfazjS5epMC Zyn7qeOEJurdOgTFgfKgGAVJgnZhuT+aLheAI6XXedAIxpQKvfiJA/IDDzWF5QvOTtyMkS3XQ1ci JN6oHAOfO0AqYzBlyYmEMYxy1ozCIcJPutGEOwCUL4bmedbjsWKqj2I2U8gmPIrZTCGb8ChmM4Vs wqOYzTT+C8/FbBI7tO3eow4+QsVm+hjYtM9181FH54PC3New6+yj7j7o8BQlC6amWq7Tj7o9H3j3 RDDZrj/qfAOZJdKzHd9EQkotlLfX/SDKSg2HSIa4fp30o/RkgMtbKAODjqVLpVNzrDopr05gnQ6w BuxhYECIVKfTSEfS0dLVvZahkwJ0m/Y39jhwXCN0+sjxDIlm2K4XvHK39RFV4hbRctOUkumUgq7D hBqi2RRiO1gwJ17FUxTTKU3lvTClpNjess9tBq0VNRzcHzm1eG2mso+mGC3IWOqFpdhzxaBI3IGR dzRxfPGgW3IuFXJhtZWwk2/SKzTyrjcYL75LhhZzkQzGyRDHbFFMplEguCG5B8ty7+WdKC8ZlusA AM+Rz5PtvoElvlZvafCUuot4Om1MnlEliq9ARKoSsk+ux1hsKc+QOWEIjaQTpQOjWIuA30RP31s5 qaoeK+rCNhl5tPcUqPeQoO6ZJVVdB9bX99q62kIU/3gClcU9Zh5k3PkP+fLhNpcmxTQSIM3O5H1i ZAN2vfGs/gjdARlK3KRPYgjI4IwPj9no3FpvWhv2Z4RGcS591qx/UUmWeUVQhT2g4EWORhAHTiE+ 14KZKDWnuPG59R7C0SWghAGTfU1e/kNHoeRoQYmUTj4VeATObrdIjZ7xJQGy0fvX7ohdipN5qQNy CjXdXiH3UtAA2KznUTp89EnPmG9fnn3ygL9Xk0H94JGIQsEDfzygpJdU8JqPW/GN6V1XdGMefoP/ il3fn51AbMx8epnj0YwS4E8Au4QccQUDBbALzRg8jEfKuFkcptXDh3oMOlNlsTPVF8g0weCZXNZT JuOpjco/WHBvAm+AULtDKzq3nIezxzl4PXKLYoQVlkQM1VoQ4jsoBFuA14GH0vsT4notQ6IgItwX q5yi1UGBAoFSC4o6IKiP6zl7Kd6ximSw06D1nJNazuTMqLhiQkDtblw1IVYJVzWFm0ghDLYZqoOQ mGXScaQMRqavWg+kDhpQlFpfnY9PGU1Qra6gCM6JItgYSysoxMa69fWkc8ZtG3H8UPXIkI1Yc7Xm XktD+oAJVkM+zLGXaEDJ2bwFZsSWDNElnqYLKmArZmKszIu8cH7sgARV4t7pUY9rAdU6/6zYuUPu nCe6dIxL5blf/IEP6G9T0sMGyv165Vd8+MHU12luNTsNSV08iiPbSPLAeZ+B9iDUv0vYDkARyZL9 FnLeBo0xS1JXo9GUKkly2wR2BFFmVyhJp/ldQyhLRyUEuGqASXOLKgaAZrDafLeQiGpz3krNJ7WJ b4L94uQ30LzPkAOHaZzUwS+ELRIFHB7Vv1PlG14KXRSHoNKAyT5YkouT5GIkAxjqPSXe8wKVAusS 55bItmDY4xIkaQGSwxIkkOEeEez/MWbgGJSxQHY1xSj/UE2yzID7k6UEmbUkKylaS9FKWo8XEuxW Eq+j2BDrkR4K8fOF0GYVHp6NeibRifmP3GaGvFBGBR/dwMd22EscDJXmWjTdyv9HE9kFndApKd/X QCYdWXL92Zkphibq8UM9pjR3WaW5M0pzwa3EFsYmJdGKjd78pxmOrqE/Deem6o++qZ8/dJ/Z2+wi 0wC3rwo1oZZVAsINI+U0+7LIk6V+LOMX3LF/gPFimUBS0DGEor1BlpIWVbKBfWoTRuPEn+Z1ykLV PbqSWv1qvRdXFmbCJD4cYDdbMz2r6FXFryxxcm1e+WdrXwH/2eqFkx7JGb8XpKtdkKR2RHraDrm9 asziLbJ8XldwKHCF+5HPFc4WzhfOGM4Zzhp4xAIGxp0d8vSRgfdq0/MRDW9MxLun4k3YzDRN2T3A 5CFLyrG7sFj6qfWufghO3TkxfZxIsREzVGidtf156NrKMtE9cJQcq15xurbOH8yA6frsUu2/wOPb tVriLJV1Y9dqqX7n4HUWbH/wORu4FySJqHu8V70L92IkkuLHtQIC7M+KcxZrxnhVjA== 9ioN/tOAPRU/sAFrI6v5GRBci/4UIiXSWtzP59svEsIvNbivTn9gUo1WUQBtgAYoTKCLyuegrSkS 4enyYI9MM7gseG6eJ2HJQuZ+oJsLqfo2PT9Ky5d0/JCJT2hGULztpJAzCzrrlfOlNZx1TlUlqbLn PMgSHBwQG+wIDWBHZpCnMtjRGERyJ8p483KBCFK9h5MT9EbSpHay4GnfI12KhI53gaO6FWX/9eJJ HCr2oQcna+Jkf/A4j8msMSuzRi+zNG/vmUZUzoTC6AXcaUDlzSc1nkwsh02n1HBKzabYaBKTydtL ZC2JrTQDA4oCUXjBiBuiKsHq6pQYvzIwbI5AYI1eZs1hJ7nYSQ09LeQWyC8rRXWRzbdGiK6eCakF yyViOeJghwxcTixCsQqDXci2oRLSCZJKmNJbHy5t1c2m7jXZPQhGVulv/yw4XyDsDpImL1R8s9kC JmZkGT2f3mR4/AR2JjcQboEhaBG/HoPDFCC2Ed/8xk5FuccV91pxLAbnYnAwDrgrk5NRtg71MwIr mKU6Gwulj38phJPE/uGlEE4HDBf3s9LlSekuLRzSyyfcHXJP+6xeuTGb1xuSejWlVzhPYh4Puc8Y /xFQLhe93R2uCPSu9xT3BuHCdy/3Lz0QXOHCdt8D94P0ROgLS9YSQg4M1ElTknuTkjwJQirOSQZF 7lRRUrKFt4SUZLrBVVKS+TbDjXogm95tj9vqqPcc7nrz+zffeUkkgnj3dP8d8flgF7hOAOyFGY0N 6omkAAArbLUaj9ZgpVpesQq8koppjNaIkAWO6wVoLnGA5e1Qj5z0KlSDk89CXUyYpzZZ2hm8o7WL gxXeGXuYsSVqA+exJaGAQeU51PLknMcwzyOgZ1Qk6zY1JwI9b91SfFMWMGNvy4Bm/I3Bbvis10EQ rDkE0qT0k9HtwQ2cZXSTP5UIiYlMWFfC08yUnKHCngN4GUqakD4CT3HkP/+WruQEwcENPe12TFAC nhKV+GneksryqEhhHuy9V4Y2jHkXEViUlSFItKFbYO8UJrpThQAxkXuK3jVGweI+GgNEZee8xABY QP2gZQSsgSALEoNwGA0GijoGCFgsxoJgAUM8a0hnS7efJIyzo0FiENWas7e81YWhO0Fi1IzEGBBn OigLnutsYOK7kkk/6qj+J3HbCasdwZMrBF7UCLvoFHZBoAs3gXFJYxyHaLlaqczcobQV1gbhHggF mkOt65VzaWbEhQobAbM5EJMwkRJoZpFaUZsWw5o57WRSqgLK4eowKbzmNHFnUIGCGFdOOB+1ulTP Fa1qNmEKTb1e0FQZ0UTscWdrqOhAWQIbGRvH1aJyyjGzR76lVK/SGAULpnLzPS1f89k0OeDRee21 7QtDp3cWR8p/MEzoAQISXQgvgQl9WgQWgjchsILYQOMuYB8H6zPhxSiyCEmAfhecT+LycUx+H49f IArG7+PwUTH7iI92yVRid18BKcTOSO3xhR9PPeBwq8Htf3laMweMcnN746E9SimOM3bTvXzBKiC0 kzdgNvKwjYdNXLJMF929uQ4M7dtkh3ppK+Qbkja3cXIqNQm5U7hdwuwSYqfQuvAyD8AzveF5TpSJ F0OC4NvEHMODmeG4+klsLhgf9AafNxp80vcFIx0S5xCTpzJ2nbcDLkhfFMovz0TMAQrX6xOwXsjd IPvtgkxGNW6ykrXBNE6xwBNxbQ2ghJfpesaATcQIaRhi/kQpGJERRPwmtc3leLRig9rAkEv+uz/3 z2bfBgqblMam18rnoyHvJ0IbAbMSnBUhrcDxjJjKNiayNQxeBu2KWhYJIMvLIRtQDMSXbUhyqTsF crCsNfnUS0pvFVM0ydYUJ2wYmiYrEnYEIuFS22ifiGlE7GW29jIlmyQLXqKa9QGfkm4ii35Rvhoj nyrdPATIheWf4huMclIowWXLbE/9Pskl2tLniOAqorgCOnbMEMbbEBn0lGWsrv5Rc51rdAtbbJQk FMcOcEkhZlcwmAqhrVGNAgbw3szXxBY6dArDNa/w7TM+o0AKXK2Rgme8O7/3iD4qPuetMxrgwAMU li9DhJmF+rj3q2vIgYpDgpLuUWt6g7yjaC09KVbApK83tobmsw+BVzBKDLHXYKKgwgqpTqikrZJ8 0UodSU9MmlQcfLkjPqtEJubvPL8wJn39kbGJC5w+/xgPhWmzyJI+JlfN5XEfZ3Jbh0rsUqEQDCbg tiaHIqQbayTDpBvbUIwlVp1CQi6gg2qLaFUrjV80JoLRUzUyJVXV4JQEakj/EEXFqiprQq7aqhgL xdQuLMxElLE4A5MILhItR7BqKVYl28Vk1RuOPNzSQ0K4le2TSHgcoDj6ZwtT8XBRuDVEPSwRvSh+ IfRBqp/m6qKqLPGA4DHngl2Ugyv5t+I0b0zvBgLCQKRqE460lgAYogLp6uDbssWUJMGIenxmtqwV XVtUue4Ob30Gpb9L9pX6cxi0AI5aBKU9r7aHMIwo2ymZak35vWDIVEsGWg0ZMtXhXjLVaacxVVfS gq0bJMZSsDMkOOaCP8SCKmJUep5GVfxsRASaJgdH3hHrH4kw6ruK7R6njvr6nkuvSpxG1m1kHUex 64h1YNj1XnklqfqISHW2RKrdYe8dk9AWud4jI/wFCVR9Z8GdDra7Uxzgr0SgesTgdx+BakqhygSq dcbqjO3N2M5M6VONFAMryIynHn0FEXVIo/pv0ICvEq8cokBIqu8Ktpk2ZNtomiVdxRUIzLRqOVaZ X5UdDUqtaqoBErFqoFWttSBgA0lNQFsZUOoCbrTXMLUV7TZCqdoppSoxQQyA/pp07ynVAeH2HuqZ 5qC1yB4VmvLq6qct80sJNSG+A/ovjby1+3v/V4cHCDUWu/AK9OX+w/h3z+UZpUhj+ldLf4G+2Zqf 8g5ey8uQqaZ0qkymelSvo07ZPg/pVDVpBwxDYKP5OgVLM0unOqpMu8qmDSrZDoMHxMo3X2m3aVZ3 5Krw5PodhU2Q2tdIgShJqj9MkgopUnE3R5y1VGHqWidjKhTlfqXsp0etuNYCRypk6VJT0tSYOHU5 GA7sfMgUTnlW5wuTKuxGYFen5i5i1fWQWDXjW2XXqmeLRtdtr0jGQKs6cnViYTndtBDxhVmTU3JV EQW9sLW2OyLVSUE3EwPtQ4GizdIyK5K/llP8VYlVLfOpxEBsuoolVrWxED5RRK3qqXf5oLcIVXN0 qhGZqp7EnSYK3oQeuPBxJq3e7r+974OUXFVyJakXTMgmVv9qs8RjBbDfkasKSTJHXnLU088mVwXW Ae8jV+1uk6uCMSAy5KqZiGqGXNXXui89mwFjVyy1akv0qlHQa+QtR/psQ6taICu8xzQmMCC9FuqC BtWZyVV3fTel8WmqfLmPUMcEq4UGU9OeVEUajCYtNTAFTF6zRhXMikXBD2m8WmPWgLSb5BbPpQ6n 6cNa19xLlZRg1dZkq1j5FipVW7NNyr1V4XegWIVQIS5LtBpgIeHnpBCRifn4B6YWQ6BIp/plIFmt VQMtlKfsonSrQrQqQHyucSFwfOlMIjCNu/TCgTqaujR9KegwMpRkYJC+0q2CSaOyRKuSH7UoBF4A +6PWkm+FZPXCFx5IVntOG6jp6lijX7j66cCBEFlWNaHyJUfL2uGjYusFWR+iIwJxWWVT5Xr1CdEq aKwkBZA8k2j1xwXTJFvkOeHWK2Sr8LSA6+1gDNwf/7kvFQEiP+QLpCJAhL57jGw128G5kHauj7WX wXRzrqNzXZ2LfGW5HnMdnuvyXP6H9joceukNIWjS9bnOV+wjhO7PDsBVytXrhKsxTW3w/kr92NRv wp4TyBSPjV3tcUXTXPXYiHQV1MVuSFeziSi5VBTpYUO7CtrNvVbhDekom+ZzBDpSS7w6LTviVVDM aZyVEkrJ5ZGnDQ9CIF29JLyzxKmV0s2GZSwL2SxjO58gzrqJ1nLK4WvvMEu46m8MkmjOYu6KV7cl XbVScItYthL5Z5YkLcfDgrhhGW53JV8x15YRdjgfgLHG0j/UNxHXlqTENez5CQYk/TxOdGiZ5D2i W6VSeBBRrJaKht3TraZkq/J7tgXzPOlqTLYavKvV80hX83SrtYGzIm4KOAwToFMxfOoYQLUmmT/U rzMkdnmc+YMIMYtJkeL1qe2zh5dmAKbWDALV3vdu8JwjPAc1jcCmwNWr9nhTtY9+YqSruSSEuyIh +VgI7Pri3t64YQ5fmREp6SqToXaMBmiFWVNpUguFKUgN2yukqy9wNCZdFZiC1utlvII9WCcoDqmb m2deffRQlDMvt1JSPn2ooXuK2FI5/X6g27tCv/pSB4zpV4W+SNhTT4Y1NX1xg3/12YciAlYlUjok TFUaprsIWF/meI9WLd4RsD58qIfgNWOWZMm9eypPrQBs3GYk3N8CCQjoZKlj6/cegVzUUb6pWCQC Tx4AVZ1g7Fn745hd/oqFBzdLPJDKI6gTW4sgrrjM6jBoaraigowKlNoceV7+qAIBIBOpJF+RDWJT mSWNmWBAksYcEplDKvNGrCag+cwlU5/UmtfcMPy+01TuQdObR2UWkcDZIjQkwkrCOc/UDKNJqRnQ leZBS4ti19RAXtxoQr6UvrdrkH/7ia1/iQP2+QZHHzy3/RAHFKVXiJkGjHL6yeUfXi8dMEFhwaqa IUgUqJgodB4lnwN7KYILKPgmrFci7/UZGLMmEAQnCkAdPglWzXALx6UmFiw3IaZyQAiyhQzK0yDG cct1OXquRiJG8YYZf6WyK3dqC0thjtVbQ8ASoGFD2K9+ITPwjy1a+MJf0ESLXpY9LnjANU88AmGh C1qEFjct7HhB0yqW9SvMRG6VgnIY+xamwKht1rZEHAZ6tITc+Ij1+LmP1wP+VQ4oqaqj5qX0+iRr rm8701qTzmqfod6cN5a1EjCVlPPRjoKeHNxYtQ5HqCI3c1hDanD3GsVAUoMGLfsqsvhtaW5BlkkQ SPiEQvUOMid9TKQCziYqUVGhXImQCyshg0nxezYzNmBaGgTBYOiIQhp1Wic4qWe8cux51UKeE6bT UkItxasnovkBzq/1MrbTaAS6SDjntuG/8Fz8Wv6SRxH+Bn6Dwg4XJBUx72hwQ7b0siyuND0g1TLt TOv5Zmybo7ZSFea0Af669jgCP4XWoxbKDSJU2NPanGuQf/v57Yc44I+A5ONoGhnvGFzNBQ8J3Wli d8cchZ0+6Z0O5EX0L3Gzn8mX06bvQvbj9IrsdUp2eZv/K8QI43+w7xylptskdX0Nu6z1fR67DUfm 3zUNEvz4jQT9JPc+7e3eezwzb0ZtuNlG2yD+80ltyjXIv/389kMckOA/C9KkCAOvB+sI16YH+RB+ yAN0QuVjgubUhClhRAm5Ibu5Bc2ivmi1XvE/5nDYN52woH7HnOcx9sTmoP4hOVJ58wNi3SD+I2DJ EuXoB0aOtrVsHMzFAYq8SKk4YjIOKRlGfBzCyFEaRg7SSzZgx7ZQc8SFbIOC0rOSIg== ikpb85FreTCsF2SfN2s2GN6btlDmfTHN7gsMkQZFSsctxVfnkNhdroHBEefa7T1ciEe4QYRrfko7 eMBVHeMZjx/igLTEL8iHRMvcY/2k3LlH9Xk0n0fxeRxeSpfQEnAMq3KbmtxgqBLSRW6RdvlUi6tL PGRZp6GWoxJ/l2SBY94zJEQc9yxv5d+IFzcZHnBjabfR0t4v7I0NDlnXM+yWdVjSfWZJxws6Wc1+ FUO0lHMLebeIk/WbrFs4XLL3rM7MwoJrqwsf5V0t0fyf1cpLrkH+7ee3H+KAFAjc1wy5CYdPMg9s 7sEEJgEhrcJDEPm0Ek9JSoWpIEI1RCg7YQHKjmDOkylhmemV6ifU6GkVYBrqi1RKAFSClO1hSoqL 8qWEwiNSfGTREiSzIlSl6TUAUwcFgpXQuqi1SWuiVksDfblPPCoz7UBxDW412Llat6ttvdVASZCe 2uZ8g6MPntAm2yD+8/H2N3lAC1Qy8YYQ6iDyw7jGxRH1IQH6J4HxQ0Dh7/IQQhaCJOGsV0u8IoAc NKVGdYEIapCq+xY8nstOLUHTLvOo+/txF4y8gAR4YaAXocxH+tiQcXJ03d/6zsau9jrVgF1cH2pU m0/Xn013ktVEeQxsMzEC/8KAjRF5o3zvhYyFyFSCHep+Yg3Kd1nQna6RyNvs3Qa0o/LwFISeR4ic AKYXf6olfWshweCY/AQCd81u3Bq3D28Im/Z88auWKhT2dHqOyi8u7y3MPC5M5G5ig/CUe4ckezBL ZTWvlSpYiuYQ+3l3mPqDBOqS/yM/5SklOFYFVWlukDyFr13520vQTKRKy4JImZBGs5Oe8ITjD8l3 Nxnq+Ua9NNdcaldbWs/vtp8ubTtnoHDgP7vMZHrAF35cOSDNYssilucRy0Hb8+D2hnIwUnx7nlEs B3HPgNxBQcT3gK/ztEMHFEt59GeGfD9hSEmwspCg3g1W9iXp2hTeDvsEgsfyB+Auzqon5A/A9VoG T88fgONaBkKVEfhwV1ObuEC1lDDkQj5MFYp7nRmWtIXKFCtHrlQqrhRVLdByYssdFLQv/DpauZhR 5oVUL67Q2LBgc4Gbj0qnu4T4Ok+vuJJxoyw8HcTFjBWEfk9pgWxxAUiqC0hOQBGnQyZUDYGYIRAy CBNDZxb6aNgXlFfez0ow+RZtkjtAFapjtoWUa+EK00IyRWN+hZQ/YTJRz4Xx2YuhSbh4dh3keykY 2+FJKGtA70an/PSBcMdSIljUdqFUCC3Xl5Z8FQwCA9fkQgJLpY2p2iYmQQhUB82O6iBwFgSCBPs7 7LOdkCB0ye/4K/FB7c/0P1rgq7M/K8x8S5gK0iTsaWf4d6ydi9GfZsCjqQ9J+nvIfY8BwrEPL+eq 3xELJK76mE4gpQuwSeohPf1qsVTfAZAtlZq6PBgPrc6OlZXseXfzLWQy/1el0r+W2W/S9y/Z5P19 0j4i+CxlQpqsn0vUv8qRABmaBOyfOM/lLkh3LsP5WVV8rxPcpOj2zadpLEme86ElgesoKkNl60rR 2QgyQiCRUR224qoNDEMrqgv+xAPmhZpEAjBnp2yCia+h16uQZOCUpYkMBqnD1GFORgtIfY41hbVk u9g0ZOsMGpam0G9daJXOkBsjTAaDakRpXkzQjBotA9Jx0qtVRRcIFGesMJWsNEkqcKP5gZ3KXNKj JpMZs8gOB2GLy+XFKDFakyMd+i+qAvXEGlDLBo/UgLqnuJNcbbjetLhTnE43gbn4mFWw0VuIc+ny xRtaKd8A+zy6NItOyx3tyjtJisqLPm4d8CppTa7B079ivhwlr5Rc4tCwWfoqg5wWMDIO/9zTi+pU dmdMNSkr909lbVIeHjwQ8Zc6XbDqsdJ1SS99OUT3eYdJAZJ7InyjnHmCmQB1fXaKo8lZeYFjPZS0 0pXnth7aU1udK7cTPZ60kh7w0TSMvjg7Va1/kTwMORYl0jxxKrjvj9256Prm+dPJHONaMoh746tf f/zw20/vPnx+9+HPX35pckTsB/Drv/hPavrkt28+f3776cPPTz9b3r19//H03ee379+/+fzxC0jf 8NO5dKb3qarPreuok5td7o3Wz/fevVP17u6+RxrhkomE//k/8M//y738n+7Nfz81p1+d/uV/FKdv 8P1//p37lR71W/OeHPj0D/7N9HTxu/L9f8gc07/3AU/5G1o/lArk52cl9LaF6/6CKH85wSkUncdJ /c9vcqf79uB0j97Cn9ILrQefZ+VfuA2/wMQrTZrThCa8dLrQsj13hRMIZVf7WxnpSt1lOcWxdWPX nJ3+OJ7e+3eL+tw5HcS96z6u3DrEd0u3QAcvxhp3sfKm+4o72dn7bfm/urO7Cneepj57Y5nedbfi TN/S/e9wdmJo4HdLPk8zuPlcy/8OPofMndx9Z6w7Pux47jucZI2TFy1f6O6m3nNX+RO6xeT+35My dx3fbXuua/fdsm3PXvvlW/C5XoM7SDueq/+fuXfdsS1HzsSe4LxD/jGgFtw5i3dy/KtV0gA2zsgD DSRIMIyBdKSS2+gsGT3dEObtzS9uvCxmnsrM3XZJKp1csbmCwWAwGDdydbvLRtuNIbR1z64qGZfv SqFrAhdjH4e07FPrGRSzU8pin6yuWFxIz7WMQfRWndsxdfm6lAvluZQQCVqDDg28qSlR/93w8sbH ZVg63pK6ooh9DFdnT++Dxls6sVdH0YBXmJPj83Xl+tTA3MgcLw7HK8tT7eOXjnLrnIpPpfWpuHic JT/juqSn2mnvU0iw2rnQH9CuiyOPp3q6IxrYSrikXe0SQoR0xSsgOtxZoMpi9kzcbRQ6vAqB7BSC /93mTzy8Pvm5tadWnj1Eg+guz7nb3jgZSvd5M9q+Zmsff/PP3ShmpuW+F3evCKPpPhQ3889gbe2r z1cjyNfon0qX+MiC0Yfa98+EZqVvtjo8d+X4VHuzyxsXXBeqzufuDAhsH4VJa8dZIQEBUq7S2sUJ Gsj5zqGkwtZH0vrGBUFIUWSi8xbt+spLJXBXrbfzVxfKyz0HJy39xTNCsu0b9x9cn7pYiagEiqll 7esDC9N13jZGiZXbfQ+i5wqF6fHpufi+OCDEoV0i5/twdJy9L0fLNXQet879F259VSxK6lQWRenL OTYsny6vKchKdSwqWButyIz33aXDU1/F3KZLZHd6CVh1Zl3HDJFsvStt6KFHKobo+/KTyeiarETi ZejLV6ay09WtBfC8cyjJWr4NZWieLmWuC0PpKqk11TzlufquJLqK6cIji7lLebfR2lPX97Wo2ukM hbzE1uU3K7ALazecnjozcO+yTHvnTHcyn7qeTVnoh7bxkEpone7NCtDBmqjdcHi2hhEWVp/ETlD/ R4TLd/6kPl8Z55qjvL2PxwbaqekeeG/dha07ebL1QRorDLjmQzVVGvpM9LUZsH+ofizdLXzqmjh0 zW37Tl8XT12R9p1MX+5rCt125ei9TnIXgO4h92H2hWQt+zx1p7o9xYwPjI9xXl1Cn/qe1R1VPxgS uvz3zqsJ7T4cHSe25i6LtHWlJBOaEzZXyGfXsVEY3XmZWteCwN/VWFGFGy8XSbx9Ykb33Yr3AQ+J btKwb3sN21BfU7SD0joIPCPg63XFpvqaVydWTLmCqqqahaIoW1vBN9ehLQLQyNq+jcf2kL4QrkoS TavrhRuHjM24Y0jNVdWdXfRZ9i8v+ryPqZuxfUyBzvOzkKbaFyG2K+gM2UcyJpKGlOGtNCUKGeEO 7OZ3TEE3odYnj1qmLFsOtH6CZuga56q2geW+q1HfzYk078MxuYVKhGECDL7rABbcvmEgwPaEdeVE IPvOIvMUsLXzmLoSye2KNHldx1YFXt3Y6oqj4jy5iLPj5YpBBV/VhOgairZ7aCWnItlFP7bKqq02 XQ9JjB6s9a5SzQapfU8haMi6oG6jGuONvInTRhKaWH69vU/UY1cqocq2gX26NZLBzsisY4uFdHzA WpIB9+2vZkdj6+tTR3wpw/AVDZ+NtG7TBtpNum4ew8jeMYbWPSobcibhgE0SojGH9Dco8MHYuI5q KOCuPsAJzB5stRcxnGjvbSKmrDG6qIJcbNItquHVF2fXtk+tz55u+qT6Mb8VhmrU11MfbZ/fBrdb N2i15npL0wGgsXVeN0iMznhXtmS2wBKrrlpDBA+fGgyrS1tuAxojhSHeedAng0TqRVoXTGxHEVXu SawwsQ3bS3I2qFa6mu920dhrOk987RtDH1QMOoPgHjGqT3bIzsjKmFayetoYACKnaFmS2bLd7u2T 2od/dXVnfCIzsQ9/Mv23AZnhgO2s70FQpl0WaaDYDLFgMyycaMZMn51EX2JRG663o/nsuqjv9zxK aDNMJ3afJhsqNvLu+T+l7s00GWNXkTSZvR1Jj9gIrXOyK3sSaoDixVOZIbSxajOaSQplyJzvw7Dh VR5216Fkabxw25J5eFU3yIAAUt/h4O2U6nQoNIl9yD6KxHQ20Bz2oZDJLmwg1nQYeWJCT05dwaZp w+10d8FwYNdVZVYjBLwAFKr4iJ1kmr5M36BJCluGocPr9k2oDV4aTK2LrfcES4X8q65Pgxhq3d90 pcLL65OlNi88PlgjrpMenGwDKfKOBi+xeBHz3lHfrDL5d9XJHg4L54JKwSu4fEQ2phS8J5xR9QHM HqgBkNRdP+m98yvB+utA+uN3pxHZUBsvUQcDKFy8ifbWCIKT02auRac7JpjTvWWft6CjYkUH+nRV JNpnAsVXbEr6CIVTsD+DkeVoa+rIneieTn9Oid82Lx0jhXoBsMCoV56AoP5vUUvrNp55oKlT3ec8 d1eDx9lXRrf3YXzS6pIRtdhXXxc/stiEpAiDN0DTincBGxix0a4qcvcLtXOyBbo4F+kapkdu1Mws N6w6TFtHF3Lxao2Qqd5JiV7cQFIKXTyxsqKOeRuGGX2OvPa+GCoMqBduSqYYjB4niwozS+Y2rMsh MB4iAXsSEQCd10oDIQZJM2aMHy42ST0is+hK1nynGgY1LN1LjI0c2A/qsGGTOVxYU8hF0LW3DULH dsFv6LsARYoQl+VvOD1ZHBmuM4ckl1gXtA+CslDnXRvynAfHXiM2w84BcR8LO9oAmnKHbeYzb+JX dQYkbQNjqEThVsB2HNgGKLJfBIQJEtw1uItR1Vfihv2FqnquG2Bdn1DfRfeQgHgCViC2J53n23gm BsltU9PFU/QNNNylRGF1Zkif/b5Hkh2ec5+3F8ZayTOA0crc6GJ8XewBmC9LVnJhI65vHV75RsqU gj/qVXQOd73tCFjESIHXkR2zjZxnGWRMFDDwZmwH+ESuEizoRHS2BbEfC6IbvzuN5bPS4iK85S7s XagRUJeYRjcFA7aSiK+siSGB+GHukoGAn3rsfcshLwXKT/cXiidgj0MAUtcH+mmIfyQElNSOipmk pDesur8jvNbhlFQwRxaxzIo9jVaoxMgQycOWDd1V/OhmGc57hYWie7lrOGi/YjGe7g== rEU2MMyIwTAvJEmgE1WhgSG+wGQJwzsE567+/zB2kpHffZlc3nRNgYGIQG9fK50x7bqijfPKFZdw dQ2hvXeOlAS+uzhzDloywQm0GdrG82mB8bIldwexz5lYs31gF+0/SCbJXPStpDXaqTqjNJ7Yt2ya Xd4lZSa7wXIVRN1j/7kUlbf+VuJd0uwZCtBA/hcxyuIOYb/XUDQcHji9vJvLRCQOAjnaWNX/2wf0 bpHBPgn9Bnsxa2ohZM/7scXR+4bjYWsjCp6iaANs3J3/tJ0HVcyRAr2Bht68zuRFXGIDqVa1z/v7 0E8RUTlba90WhU+dIq9Y4UdgzvXlksvgHCn73rtpsm08nxWYCkfcsyMtYRm4IthvEL/zRYx9hGLJ VOxjutR7qVlSD1cbW1RNPCyKhSaRtoZgaUJIuQsBrHcC9rFW9H0FzsQRsLMfZjlwBrWxu9NGbgpI ooghAb046w5uaeWOtvG8V1qaBAfhZceOnRmCYJZHR+IFUUddvVHIFxFjC+X3DSC3RIFTM6Nq/7t0 icDY2yWuZ4W6hpF6leEMI3dQcqSAs8WkusMHK6C3wyUvyo7IjIP9EwbjKATc+7bN8DaezysYz14s VFxIVf3lS1JTEQEJ0XidMxQupDjpWBNiv0NDO6eRCGR1sCS72dL7Hwkv0kIIP1WVGnJ6IVcINlKK j6GJsydAa6yHVUIWH+0RqmApFpApAdW3Pcuj7QN7t6bpxkrB7sIbZ20WzCWDAqm8GjUgWzkQiw0g eNWpyM9haWPzCW4KZsM8xj5lnhvFhirlAiEXeURYfMuN4pdj1+vDJe8ZbckdVtZ0DlYKYTpdPsxG uESdBnOF7yMbvPl4NrVhXXSfG3mfFnWlUTygeyhjofW9GlHwfA0jpiJA6CnMUNWgrwhRdhWDSzGd 5GWwdnwjS8kCVi1zBhYpQbV/WuI+uqLtkyA6B5qEabku3Q8ib+jZDwdhG4ZypndD7m8W9fDCTclX o9C1OF7InUUE9tNY8hXOhqMIjPl2XQGTGCDrqlnPChcHNg5EpFbVtA16ArkPNbG6akA13BPlxEWu EJDEPgJ3P4hYgg3wT+EuZdnT93Ho+GDrImuJTdTBNya7PYhGR2AiSHCGYva8W6oC01A6DIWqAT4k 0S6Y2WRRJQsoUQiMstteMHbZZE8kRo5ZE/Ci1AClmmWh959ZcafEKkOseZITAC02eRuNDjNCkcMT QTgja1gpS6AaDK3FvDDJ9/fdGlUK6mMgLoPR+yjbpudEKFsFOngEMCWL37eArE4G6t1Jd2iAAfGh TGoKa0WWOGxtpJcApI3SGEJxEER+xdC4jUcHiqWNAEHfOTreS5QX0vG0vPv09xUnKhwRPUrrdxuk aeZIU2hgYXeIgpnMEjiCF6vGdZGwOWxPr1hRJwEp5sICYSAkhAUAOiGrEQRskAbQNYL6sXEcCtAc mzoi28BsxHCLaNNCblsTqTGLP4xsSg3DHXAF85gbCprGkB0lyjsffNQwMaJ6iNA6TmUpbbAXKNaE fO4VjDbOY8BsDLo/xcYuBVnHSZIFaMIhLPpEtqp88IfSGxlhL91696GNMXfhR01YYHdazOGMmC2t FjEmkCrpEwR/TRz9blWgFBeBkBaKugtdthFImkKkfdPv7kDmmjhmto8s+8i0ZdlY4V4nhGQqRWZE T8DuRlFINKu4c7M8keuk/tY2Ah2ZD5xEV/X/wm1JT/T3cSuH2PmZUnxwZsxF6QyFg6/5XOobKaQ+ t93IGA4gtnLKIA9PD/t3N1c91oemRMReRNzsiqYEKTCOAHmV3Qk8QEYuuuFH7MP4rL1WGrOrL0ry 8qjmA85ppa2ExJfY0mnxmTxj2o4IllFK80QrUJiX2DiPiJeLmqkXe2gRghFsU6OyC4iU7p3dYKYl m8Sz1n0c9QPYn7WZp97SVOWyj+G9hlnFOPsDQqEIRbwwTtps4OiqCisS+0EMV7e6Au+1q14Eg5NQ XZAsQRigWqVKZ2nOGHDlchohm6IvMDI1UVGRa+9k0gr3ZsxcyHhDIuvELISXIOVOQvj7MD5tyl9I 3GArqSiOSXnkcMmDKlj8YnRX3YaR2E/qmVSWGahm32TD7jbEVRFV66otXlrJ1V2fDIOONl21NbsR HJxnizsntcPhH5MhT+VotvIil1qxFleViPoUhgZTc/dhAfqf3iEv5CxRbATCGIImeyOLoStY/2JZ eeRN0Rd4G809uyLXI3YNY14xxcuQK7mklKmbYAKJTksteifsLGKJtTaqBsmOpThEsJqlyMLBe7k3 9lFsqtuK2MhGAcg6oocJDxwrRM0W2YGmN1EW0fGT4WqSU0fOWAXHUyYnbnKDQr6SVrkJSJ2qgJjY 9JVlCWcRGijfZJ6myIxvk2LfR/NeFWMMhmkULO4mEhMQGlT3QySmbwRJE2kiMF33645k4hJGnaCI CzRCXoXl2qQkcoXmJiTPC7NISOAZeivW3IbwaRHJKEloyGKPWtnA1T3VjUrZSI4K1UmOOlmPIuKn goCyikLfaPsc5jg0osNG1ntAiY5WyaKeAOk7VMhoGhk5+tZntaShdSmhEAJ/cEKjkn2D6bZkdVN1 7DaI9woGMhPdxK9lFNBmTlpUP8pn+65B1bOIH43iWXxGwz+VOkpnA7bYThmKTTXm2uUhdoEvbvhs CLygGq/rZV00KAlC6gf7vK5CZMgQlewwK5lFyAW+Qqnc++9uYxgc+EQhNbJv5CguxZqUFrhVa3br DfWaS7km5WH3ek1ydFBnNddrwi6+F2w6VHrdKjZpy9tLNqEyPcLRS80mNsLiEYVaijZv4zLDu3d4 KNvEHner24T1fnF12Vy4mdKhchMFvmvtZqqn4s3s79Wb2CLu5ZsO4n+r33TFHwo476P6tNJIiDeg iG3JYCBWfvkthQFfmQt55xwGSQHyOUsSA94lO6JLFiNJ9HVNY8CDha7Z8hjXIZFBbhcM9TWT0X3z lvZUxm1o795lUOaA8ps5mQFqstuyGRAhT/UeczqDShoQpFryGWCjON5zQqOzfJR8WPSWQki3lAZK FG85DRAZmI1LUuPiaoI1q7GN7CFKJrWDs4t4F0J4s7dLwaXe/eLvIoQFx3p2eElMOoNWh7dPEpT3 5PFiZd1cXopVQPdOPq+jevnF6QUHDl5vO7u9MDJJD61+b9c+zq+OL0SCDkMsnm9C4SLqfSfXF6Y7 VXktvi+kd3N928H3hbzBYpmdXzLawfTZ+yV2YNHO7u9tOJ83Qi6uD1+skFSYBbMZAiGgiOlih6A4 ZTNEUjxYIvgyVPKLJYItgkY7myIYNfcy2SJwX0i9zcYItASO8KzWyDaa92uQSpv4Yo9cUoI4GSRQ lyQXi0UCp3w3SZz6/bNNApcGeanVKLn4mNRklfBqj6tZ4qhIPtTFLoFgUBh+Nky20XxWViLKh3Hc KElSBuzpKuEqUK/IF4Rm9TG8HSE24iRR0eW4T0niEK4aGhGxushB7VBlKUYEWVDRjYWm6z4WPuyC liWI40z5Fta2FlzBrkfB3k5R9Np5oo+6EbBe2fpZB/RecUHotNFZLwSYhSGkAhuda3Mqg93coaIr qiS8xDZBCskRj3wWnwrKlI6k0FEC4WaUw06UeZMC0d4LVzbGMBxWnPi6YAEhYBBlS0LIpWKngyBW P/GNYrBUgesUuIzms/KSEeVCygHSi9VPxf6R/6YtQA+tYc+7MgeVu7q3Yn8+4QM8RVYEMktUkohE RNBCvCSlYCgKLTLETLFzjreLCGUpZALGXPX0w6Vh475qs2SostTXUZQgRetmHc97xYXsSVjqfd33 terslAdKs9GVzjgKISH/BQcV9OiGznimehyp+VO5AluDcrP/7STkrZsR6VjIEFhdnR2IIGeGLJFm xzlyRRSH/AJnfIPxzTF/sXhvg3mITSLJCIpIqEmiSRZkb4NG8DXH4q/J/LAcC2oDLQuhlu0UHp1S LM8jmmIZFjdrek2w1KkAX/MrCFHHqh1JegWZcjNMtgGZXaIZCDp2IocNLbmC4wFjA5HcSvfcs2Yn LbWCSno9+jdlViYLZiRWuGRfqeK8yjW5bCOtMoWDRlalLy2zniWpgjKla5hPy4AepT1Q0FjiqjyQ ManFyoxJd+D4jGyGqjlw8kmLGkxxFC4OXPQGajPdpjbmmm3RG3RcdlMbOMmjEW3VGggbWWntNoyP 6gyq6qh5URkUv5OUv6gMRAbUolWNgZiFC1ZrzdW/08SrvvBysGbVF+ywz+rCT+X4qi702OesLiDF ZRw8W4ahbOhGFZ1qhUih1ISqHDhDjU09JtkrC4JuSGhiF7MiIXx5M3LZRRd4A3oU+dLO6EZ1AOUV qJ5ESKo4IIFIMELJehysBhF3rFufLV1Dxh4o0qx9RTnwxVnqLsWWnFlG89k1gKPPNXHBoK9ikKLU jDKwMHSiZp66R0PJ7L6Iu66sygo+soZaVs20lsol42BF94ulJe2mXG+DO50USIkZMMgXDVcHLgGh 0szijUEk8I6PRQ5OFkedF6dlcvuA3rscmuPwMGZZNlAcIuoLEFk7PfWKlBGM0g7zQaIuOECFAA3O f+upUVSuYVHSCUgtxXNsQ5Q4JBoFIoj/lMAFrgIjLVnyVB8KRz4wLRJEajjMH4mUZjUj6yA+KyWd kuy6FVyQe1emOK7hhCtSitX+0bosiL6oGDfxTjIf3yVY4ZLtEkdiDkzGkOCWaUS8OV4CFPoSwwnh e0gXDrVr7XWLXFFUUD5TjKMOCcFShmOzj+O9soEQFvxtKh/SAxWdDwjywYnTXG6k0sd8jcwmlivY iVMpVfQILGOEE1Pi0u/fcQ+0t8E/1sgZIgSwCxD50Y0FIaFIiVLdhnFYKHkqWUpazkh1J70HBEj0 7MQ+hs/KBh326es5+1EQDjOnTw3SxUEWDKqh4JuhmEt3LtQe2XFysTeh7LA4qLBM2+FQKJ9pq3r0 Gr4Pjt2mNOJdiA1BB+PQlxoIqMxCRWeaEl1JiiuwVV11nG2Zh/Fe0cAhTJxliG6IBqoJEbvAsRwV DYpr00kdkw2HKE6XRlRaqWzgIAk8JdRzqWygxLMlCuyYbGhiBZWYKhs4JFEov6WyARMCgSctXSKY Y98+1CEb+yA+Kxs4dI/jUvEasgGLDoGoNmRD04nxGrKBclSUgaFi0k68SwQCBxCv0Y7KjQFT2RCj MYSpvFvuaEHhmCWgIsdiUXqmogHeIYkJN1lFYx/Fe0XDST0sMh1UcvPCY6bS8iY1Cmzh0pnMhjCY msyV2UT11xrW4vs5oPScxq8a3yCDa0iaigvOm3VFibSuHgOk/BrOtRY2QnR4iESjHnGqhodP2to4 lXgbxaeFw3FcnJJF9bIlg1xf45sNdNIpKoO7UFIxIJ3aaHViC2qNEJnLtjVCsJCeAEgPd/cOLjpW bLXtsDZLoxebMQDXRaRIh5W1AJSYV2l+jPG3QbxXOKKXCilcm1W4NIZCwV1F4zyeHQ== xK2sykMeCWNUKUOPISZcq9Uc4oZbHNKjwh6CSUoRRwvVrIYZhoornHyrVsNINd4hDQs64hztRaQ4 N2odHc6nhqmifR/GZ4UjYidH4r5x1kwCgbR7h2H7IMmHAxIoKVVfKoLBgSLdWuKLAmucGkZt+yjD ZH7C8HI2CJy+QbWAHa2kQqtGrzZdWQgU+kinQb0qbDCv79KsTJTv2yDerTiiHM3HH+TjsQ8f+EAX xR2ylTdKmALePC5pFigcVXJgrnFqBC9WvlEjT7Xr6ARlAHSlRgwjKH/lzG2LReUR3SAb/RpWGCX2 2Ej3fHqRoZlPQ7g5t3Mb2WcFho7AFb6/Kms1NN9QJayqSc/ngzznuXrZWSozSNYWQdNanXGVDoM7 2ibjiAIxr8Owv4CMI6thOkNKRVgoX6PDFsFOnTUKJQAYvVZjIfjKRyXcuD3kNq53KxjY5LjvDJGY KvXTscpdFhfsTInExsQTTCdigp5SK1wNTbd46HlqzH6ApOASj6iqApdtoe7sQmJPytYQIUdBO50w KpPdh+p64NQDr0nv0bjKqKJNkrAAEB8X0X7WAX3agnV66KdRZc+LdELH43DAp0g+FB47igIubNDB dAGVDaBQyvZKW0m4ASwOy9bBjQewq08DsiRdqLpK5hhwkviicLs5BrzRoLA/xsFIrKLeuRWN7sMZ 7BnXV2rMtMmtmpCZBpY8XVTwzndv0h0bvLpgD9ENOH2b68tESokKb684NlODng7q4s8RY1ThOq2z xgaSoxyRtlxlELpR7jHq0Mk4Rm+wfjTy2PiOJLS0qntaf4Uir3UUeJGuo1UPA1wj3o4Ox6Pqv0Nb tOKdbWCf1kMwbK/ERSIXQiLKKjpYhKiYauE+eAo4oTKoDHKMdK8XAxFLoRDoAq5sAypS+IDAcVB9 gb2OC/ZwZCgMlvLZCDKJxulkuomB52RwNAae0xT1sNNtUI8QqtBGsVCWyxfQEaLl3QKsRVNbfZww 32Aqq+GJ4DxZYrZ5IyOI+33adJwviP2Kake9eQn7JC6rmi075AjJfK7jvjHaRrtoghLNVWG3QzwC 9qnGLPdRfNrykVJ4um8ohKpsiY5OMEI1jGve4C4AlvT+Kppnpnq0omNNrYxLpbAXwR5qiN2IqdBh 1RWylauWbmG8MGZwoVIQYaSjP6kuvMcuibg+ZqjaZTLrMB4iMYV4XZilzJnCAoM0mvpRcJAhMFnK aggGFwCXt0V1LGD7QGByGgoJyxQCkydbBysCApPlajJlMwQmyxIUBhLrc6U7sKQZyQuy5OpPb2P4 rLiAEvA5Ny4AEp6QtCAknpU69i2pIqIYA5hgSEYenAPBmY8ZCMEkLDkv1+uQsCD3YAtBjhIghacX 12EBQliI78X4ScKSq4noNoZHiArSBp7vjMupyZGDS47MBz8lYqsYHjj9FoPd2UbnZoMbx6pReI8b U+hIa7IcTaFrOgLKTiT87SU5igJXdRlwt1vE7WO4cTEGO/JRcGMp0eP1HIiTmq2Auw5Ef++j+azU FL2yFjESL9ZykUOH6Dkodxqde6PjrM4uVRWq3dghwEU+PgyHwBt3SNgAjFkUA9JaCObR8dcr212A nD2B62Vs5HwDz4Fx0SGhgrkq497XdSwPMXhg43W7AIc5Yeq9CIzsHQT1LzVWcKYc5g5OzprbdVW2 dnB9mt37cRU2dnBo32qwcHAfHdUyHbtGqTWWWs18R562JFsHt9DaQWqknGEvVDgUalj0lmTp4Ci+ HpLdB/RpOwfWN0wCuiKtVuMQzBxcmuvLGDbMHGRHoh2yqEJ2HZVIYCSMHNx+YJ7qVVnB4kDuZYfF Gps4OF4SNQ2OQUMM6nwJM9gDC2edh8YmTuVQ0O9Oo5nYI9eoP1F+Ar8Rc1SyuifOF2t3RxyV8OKM yrWsoXERgFUZXHxLk7eSVCrm6boam/m4pSVyVokUuZ2ilCQqnZQdMMrPUqxXPc7EYWSYlxYlRQk3 FQVO15xQjh5qLtSRYUZLCVD7okbhPhzjjtyI7uh/LWZBVQDYNr0oXkJANNXpnlYtwgqV/9Wu+Cor uL1TS4qjF7s0iS+3aRSoHVV8UWop6XhwGWENSlChpdVcxKwY7QAe8QhZbHSd2rg0ZhnO5wSDtl+6 MQNpCVk1lLmmuy2KXrqJIkwqJqPrk73Vw9AmgKpw2Rcy5BrKFPXjoyyJbntGO9tpLs6WoJ1plCzp D0KodwVip0FBJnrubxhKuf0DglBsa1jH8oZUoH+61qa3pRN+L4IAtUE4OGS3oOFeAXI/Eh+TFiBd ShpHyTQMLxQ/09UjV7BNiNQOgGqHZrmFCCNP6mZhK6eic7ytJ8VxUNdQ6t1RxCMnnZdqu/E6mk9q i8rhRFp6VexaXDJKl3RAF9ihicxXofPZNPUOi5xKQKzPwkaI0FS+YMPbebUqV7z7cREATmtx6R+u 1tJTFLjGjDLrYTrS3PiCTFqietLAiX6m9XgFC7uvA3pLXyBySxdb4ARqTpoc4bKxOMrGECEockF9 1wyWTbPDevhymHKJrkCmEqZL9Rru1Mlci9G3hKhAinhj8JcW4SEzQ5c14XW1ynAZuOFU05HYJDeL 1JqMI+uAPiccOIBCcZ+MMw/e6S0PVP+FMsOggRfcdIDIQU6T/a3hXxySSH5cTEeVaRn5UnHmkUCk y1cyJUeDugNcCIJ6J7Pfo9yJkOPIytNtbHKyAh/g05Z8N2TCWSG7wHMdzxuyge65ejDzni4Xpl6+ ck92fi9IwTId7Ch1DP4SLtmt00HOF9KNAXrzPS5SpWtu8iTaIXAIAoN3WT3nro9RL0yv++FbDZxF pyOOawGaqvDbiD6pORApwz0YKP02zRFEddAnXiyEJKoDCk1r9IJojtwmxRFEc5AmjqMWEpojV77t kWGiObAHhctZQxRb5zbK9oLoDWjNNkWpSG+U+TTRPpq31AZlfPpMFcoKysDlNtcylY9RRA16A36H GRRB9Ab8PLtZL2S7Ot0ukqEgG/QG9pE6MY4uUUUdmiWsqSS9W92ZL1LSsRtKs7CCqA10bvcRbeP5 pNKQC5Q09SJXprTMJ1KsehJBAYRDULOmaxZxkkznYYraf8g50u3zYZylgex0OrE7lWQBgICa2Ij9 c1yWQglnKG09SUD2Xl+sMY1UJnE0ECVZ6xj2UbylKapcCJD5BlOJgvBJ/zm+k7mUk8w/rYjPdlTH DtHQvS/daoDJrtd7BblzEDDvLDRJZ13paqlBNhUSop2eZMaUCz5dF0HKNdGtBam2YXxOCnDciCLB sBaSXIWP7ACV4CMjJpFkSrPQNQC4kFPqZlyX4sbtnN63kuhzJIHSfk2vFkiOzFfESy+9FdjrmYtr lDIkL5mw6MeN+TgPVzKbH93drNrSwRcmQ6VoAmQfzRvigP6T5y08Swg+2Vd6pqu6UWYcGjeklLv0 xFsUEpZWSoXA68XpwVJGdoutVQD1nnAcU/GBU67jBmIU9F98s1ixO3bDwGmrA2y6NF2q4e59QJ/0 QuSGa+xwl1b8UgUyLuONer04An4X/DM/IuUZbhncVTdS2mSLo3y8DTcCpjgCRzh4r2Yzhfcapdft 1rgsH1mhMoTLXJDutzAtWh0IBdqQ+/ej3T6MNwQCMSvyP6UCQkbMlyt33mqxIn3co5Ynurt3uGIo ZMcNx1pejfAokn4ITWklVhablcJV3hySUC66CdkCsdhIcKKYPr2SrMaZVBVgqjnBGSQeg58+erEN 45PWg5PbzXKavvFyNb7TNqMwQs+dXZWPjMIOVFuG8ouNKuYsagsYWVXZjfp5CmfRJfK4F90+LYWz U41uho/jEzFgSpATarpZ48JL+p6LXKKmOCn1mcP01ZltPG/ZD+ge2jxHDsa9KAKKiE/FHhShIzsn jvIFXI2Ju4lgQWf7EA7SDbjX3k8nmRGW6vZN9tOxRASggH6+Tgd9k35CSzNenOOa3jzdikFBLRi7 ZL63EQhcxvNZwxLXEdPZMVhKUfgT+LM4dK7b3CUIbaDjH9g0LbnpmRl0kKWYjeT0GpUwLkyB8Y6T AnR2OeoJEHJIPF+NnzX2jLZy9I6uQbamtLyILvsWCYx6cklQN2sE7ON608aMcm18gu2kX6ZAKBzh CjqZmicukLIHtCb9PARUJznsuHUnmpF8cYE4nf1NZgF6jmgR1Jv96fn8Oh18Nkc+iL1BbYtZ5FEv wIsjnwvlKNe/ZW93M+8j+5y44IAW7rOv052tCKdAX9a8aHuqtMSVi76atqe8KS5XUssPiRocHqxj tyuOPxBQ49h4iueMU29W9IhScRxHrelZ997iufK8U2IavMh1NnUEU/dBvCEZ6BjHcGphh+VFXsfR qIpvn2QbL7mQdZTiwinLTB9VZ+qWgI2sxvExNmyC2Ew7LOtFnJo6qZP6x1eUEOrHjEughk7tCjrZ xMAVHBvAOROtl9wH8TkR8HIlF4UIq5ym4m/iNAqpjdqxJvcjIT7Zil1HzdkefCQs6pVtl1yb2pWb XYiDI1eOG0b1RVG1e1HVBO6NEJVIJ+c4unldkqZCWeelMT51RlEJ7SQaWNUZvY3nDXHAsUE6qePi uMYLCOgyTWBtNsqAIkGOJl4GlNKMMIJdTUqxcDWgWtV0xS8UGkKZtRo7XHJyBUkKVqmaG0V2qarK +DFw5moMoTQ0dV6V7/t4JtH4eUfKoqinmGlILxvM+T52xFoQZqVzPo02XfkwJz9/+0IHzDjhN9ps SMLak7xksM7Z8DSw5K2nPHoyaqRN3JHEe090zWyTkE4gpfuygWIKVFdCMgSAp6rlpL/3R2BqlZ3P 0eKGYe5FXhEQBZXoJcGR1l7S1IvQwS3ajqHdeqGbZlVC4SrLPbMTiAhEipduWUZ6KpCNr79L5/Sx E8oGE8i3DcMMKPaKgAoTOHCUtZeivQw6tMWKYRuLDjEqM+lLQEWLJA1GwhblLAJ9RKc3Qu0fNZBn IKPSSEzCaHNDsvQkLxmMhM2w0J3LU0/yLC8xNdqm7kjqvSe6qDMxC1oaztAEow9feclsNEkw4lIv +l2eaXYiT4a1iRuOuPYj7yiM/jUcaesnTf0oLaPNiiPd+/mRlzTDy4geGwxnbbrNmeXGSVyyjDZQ A/I7PYs+YRq1TdhwhLUfVVwCI6POcJStnzL1o7SMNiuOeO+HNNAl3yCLY5wGC0wjMvJY+S0w7iol 6foMXMiHo6p3arPjWPqRdxRGNBqOuPUTl36YFoFN9BOOfTw6ThTW0M1oF3vYLxOMPONOY3G8KLLc LQjzSH6n529sDNHimtrsOJZ+5B2FEY2Ko1xrP/os7xAt1sZvOPy9H9JFIs8oQgtyY+wEi6g2ibIm stz8E2Xd6DMpCFlb1iZuOOLaj7zDMDlqZTjK1k+Z+lFaRpsVR7r38yPrAhp/KmM+DSZrC7fxgodJ zvx7uUlbn0k/BO53arPjWPqRdxRGc2E4ytZPWfphWrRN3HDEez/0kTHhaZzmc4LRXA== JFn7UeYqiX6I03wm0SHWJmw4wtqPvMMwmQvDUbZ+pvk0WkabFUe89yPfRdYImI1zghGNqO+ikhNZ P+FiPuuzbOH822iz41j6kXcYJt8KMBx+68cv/TAt3vpbcbh7PzSfiaN1vg65NVhhmUN4AjkLL7JC 3ybk302ecOQU4eWpzYojrv3IOwojmTMcdeunTv0oLdombTjSvR/+5GpiRRzbmNAZSLNBZxzAxtjE ZrnERVfAN3otinKYWt3wLL3pawRMUp9leNK19aYAfY2XqrVKO550702/M0v4UH84Bj2ARiyVThW/ Daf4mYzAOEarsOMJa2/6GgODEqt4wt5b2FhMNIWNNQNPvPdGg3byGVM63Kk2xAR1LJF0poBsTnwf hz9RlOVbjwohUlxWEqZ2d1xrn/qmQTkcNnD5W59+7VNos3blhmsfp9mKcn1HmnT0BKPJyvIxqSQE 0WcW+HebBHwnFetxarPicGs/8g7DRL8ajrL1M+loo0Xb+A2Hv/cz6y76DF9YVBd9xhuOmOoL+nJh MJUij7PmGi02DHHpZVZc/Fm/HJ4GDr/24q0Xo4NbpB1DuvXyo5g9BHZE3MsCQhgrUB6WzyQ6qjeO Shw/iiHE95JKi7BjCEsv9MoESpRlNhxu7cVNvQgd2uKGYe9FP5ls3/0q+m3oCUazAAhd1UNZmUDP TlsINlypS06Vtck3LHnpS9+SmNXFczHw4JLfuS9+/iYUMj2jzY6l3PrSj52zK+tn/TSgqlOuSwIc XvXOJRu/QVhV6r4wt7vjWvvUNw3KOmXg8rc+/dqn0Gbt3A3XPs7BAdWLU0htAVJwgU5p8he/OGAG AOvKKarGZwhB8tTqjmjpT98zIIUYJkx57y8v/QlV2irfEOV7f/xVHNnq6LLTqZ7YgExvDBqbqdxF 1K+tC4AIibo1Tq3uiJb+9D0DMr0DU9v7a0t/S8RoIVwQxXt/vMaDCAVlBIt9AN6ATC/uwCIVgm0C Xeh1FQrgpSelDHOrHZFf+9P3DMj0Dkx+789P/RlV2ircEIV7f3Rhl9ziMo97hhG1dRt19aIop0HX bcx2RZch8WtP8pLBiM66jXf0NIZbt9HO5DKScO+JpTvxLdFVrhJ42YBUt+j42k3Kc6ERldNTAwF8 kzVB2nVutaGJa2f6mgKpHGLgiXtvce5NSLJGaUeT7p1JtIq9jTaijxOMrv7CWRHxWGhTqc28GosK 1maej7ZZcEzPYXpHYXQdn+FoWz9t9GO0CGyilXDs47Gp1SO3Pk2OxARkBwBVg+C2V0VKHwPkFsO0 R3mchD6lVdnxlLU3fY2BWRwAw5P33vLcm9I0tdrw1HtvfOmkxO7KFFuegRQYxvUHHBmTyDHdHEEt pvCyU1dxbnXDs/SmrylQCr4UT9p7S2tvTJO2mqiWrPp1740XsR6uvq5pi5qAQq2wtTWlQ5jf2kyH TNFoVW6IytqfvmdA2VmKmnaXbD5V7b+RRTCq5lY7onrvT33lPA/gZQPKjQ7Rxs3fBb+ijXtM2xVs 3NIq7HjC2pu+NrjDf4Qx7EDGRhzDHqZMHMPWVjuieO+PveVLvchhfc8wtpuvpv4oW9ZXU691WN+X RUOszR3L3Je+xTCzmw2PWNbW12R9Gz3Sxig2LNu4bENWo3T6QvEEyrhHtl6KvOLrAVUtYH4k3atm srW4YZh7kVcE1Pg83MDR1l7a1IvQwS3cjsHdeiG32Ct4yhUNoASSk1PkkglKTgmY0kXJKZGj1Q3P 2pu8ZkAOyxmesvdWlt6EJm3ldzz72Kb8GOO7JBHzsgG9ZMj4G8KXpGOyhLkNIPmuYpEpSZJteMLW m7xmwCp5smIBu7W3NPVmNI1WG559bFMARJb5HAAxkAZAOId8OQk8OP19BEA4D31pAGTDEJde5BUB jQCI4PBrL3MAROjQFhuGdOuF8ipVYj9TBHOCkb2A26IpfiSRSV8kxjSFLykuHdPcZsVR1n7kHYZJ yNFwhK2fKXBptGibuuGo935IfqW6CrnWSy42mmB0KCXLUWic4UGbzF/MtOdv/A59Qsfa1A1HXfuh dwaMPnpmOOLWT1z6YVpGmx3HrR/J17PHwRKj+XqDZfgydHd34e/XYz/zGhyT52/8knxrR9rEHUlc e6KXDEYCGp4GlrT1lOaehBprc0Ny64n3VinTr1MSaQaytYtqV/JRTEc6Xj11yiNRjTCZ9W7sjhue a+1NX2Og5IEGHr/3Ngf7jaap1YbH3XujxJmuYzfsxxlGzmowZcChhJBGME85GEylSJu4I4lrT/KS wcjeMyzuWntyw2w0akabDUm696TX0lMJOd2FH/WblwOKSsXGf/B9bNjhYuJPVTdtQ5Bv4lwUXJK4 tNtxXVuf+qZBk/dPEyp/69LPXRpp1s7tqPZRDgFv/DE1ZGaj2swTkM7HO71tE0dE+KixnD9TAIuc XEo3WtUdT11709cUyHXIhifuvcW5N6VparXhaffefpQePVdHuzm/ZNBLc0KFTicCYCmcok2mVE/h A4tLuzuqtUt906CWEhJc7tanW/tk0qxZvaHaR2kaXINKvk4lVxOQ7tj0XvMd6qU7zYmUqRrKad5k tNrwuK03ec2AdMHywFP33qYoy6BJW/kdzz42HXSR4j2U8+iUK6xqqU1jNUKBmN4GF4fL78b5Ulkd WZu64ahrP/KOwrjURnC0a+2nTVKltExtVhzt3g+7/5LuTpMTPGDsu0a+kyFK6MBprnsOXMD0dXG0 CRuOsPYj7zAsayGk4MhbP3kOkAgto82KI977EXeBz1O66QzVgFFoAqYNxCXKjpklJabPavND8KY2 K46w9iPvKIxLiRSH2/pxUz9Ki7aJG45474fkNt8DlBOMaCx5DVCWdA9Q4lPdc4CypA1HugcOJxjR aDja1s8UkjBatE3ecORXApQU3/F0OmGqdBhAqVC4xKyxNDziI74ZgIKkUperMMRsZizTc5neYZik rA1H2Tua8t6DnKnVguY2LJNf8TXzfAZwwFT2yLGkOD7L1SW3wg+5EjfE2vgNh1/7kXcUpoe8GEfY +gnLOmFaRpsVR7j3I9Xaiyn8MsOQvY50IJE+LFrloyoqK/pMqp/yUWlus+O4mdwTjGgzHG7rxy39 MC0Cm+jnkq3r3o+sU88fbKGbqXSdGoyyDyXzl2norsuLFl3RBniWRcf3no02G5K09iQvGYwOyg8s buvJjZ6MGmmTdyT53pOUvnK0MiGt7qPWvgqQcu9UZeQTH0zLaIRTP9qAAESDfH1kbrWicVtf8pYB Y6zlaaApe2dl6sxI0lZ+x7OP7JZKoE+H7akEKPcllaCrxIL781KyFMDc6oZn6W1JJWjl9cCzJy7y lrhgmrTVRPWaSph746RRHjV5NugJyMQGUflJO8CV01IOONkGsnnMrTY8ae1NX1OgnJRQPGnvbbFE lCZrlXc8+d4bD1qslBDmTNkASoZLculBM+9BjJ8wF8Hpw9zqhmfpTV9jYNQMl+KJe29x7Y1pslZx xxPvvakfzFXDdRr0BGRicQ2DGBpSbnAx7xWgnqyaGtZqw3OtvelrDNTbfQ1P23ubSzmNJmvldjzu 3tuPIlsiC3Lx+csOpcvfAGGtQNeu4XCxBSEU8k2ERITN2sUbrrj1qW8alM67T7jarc8292m0Te12 XPs4LZeiP/g6ihsmGNclaHCFXDw6K8p0yDMlOjRIo23ijiSuPclLBuO6BMNSt55G0cygxtpsSNK9 J5ptidu22edXmLrpEvtVp8tJfHh2zJzEkKc2K46y9iPvKIx9c8Xhtn5mF19p0TZ1w1Hv/dCcyrVD MOK0HtxgXs7OyBevsnzfCZdcyu9Wp13lVv2pzY5j6UfeURifv1EcYesnLP0wLdqmbjjqvR9KnUjR X5mCGBOMthSqc+WvbtFiSuJUlimCQTtEFzprkzYcae1H3lEY/Ws46tbP5IAZLaPNiiPf+6FxWhFe sRTRBOIEj+YZPR0zTFbxZwcRrfTcWtwwzL3IKwKqkuAxHHXtpU69CB3cwu0Y3K0XDPFvv/zVl//p N/9r+G9/9dM//5d//MMf/uX3P/HzX/zLv/72J4H8x6c/+5t/+cNvv/3b7/7t6b//8elff//bf/3d b//xV1+O0O530YVQ8k/hGzvpn+R6j3/8gqPTTg5P//3/oMf/rf/5f3fgvz/Fp//89H/8n9fTPxP8 7/+GXL0Z4cuACNKnrzAwl35mkDT+esMEyE/Uzf/+hY4088FlnG3GV2Xnk83TWfcO6YuGzjnTLbl0 zvl6+htCURPuF8aPdNMZ5oTuG7bh/oaa5ad/H9TQhWxXngdG1wA5HoWTk/ozzGe+EiM4ju7OMPq3 D4NgnVwX3ALbegXon77Qbe50VwB1F7J+foiTq8YuegsXRA0Q4Q70ediGW50WmNBErzq6/XcG7X0u tPiFMQKamYBTSPLReoMluYZ9ZozCZiYgGN8WyNankkIyFFa23OUKF6eXsrDFep3YslAiPIBOj3UB 7X0qLYKdOkv5tYWg8jLDFDt1tsGIqLzKywzbet3lBbOAMr9XJkkF5ia9UHyev6+zwKaeRWJm0N7r JjEzawQ0s0ElZobpnMysUdjcM0vMjRZ/Y4zO3swYkZiZCSoyJ+mdGXOiRWRmBu29KjUqfjrbL6+s ztMqVkl6U4EqJPGn378e+lRapkUnlJwWxGnh6MRN/d51k0ImStYelY5NE32PJdTcvy7OJ9V0VyYH 9fdP9+X/PabMtJwk6CBoApppOeicWVZUrmbGLFrisH5Pu9RpMxMQpLSt0jL3MKRlpuW4LA9L5rQx vD5JMy33RT7Jy89lC3E3r/KyaKGDYrqrkoPym+Tl57JlpkXl5edZTTMtB30DWvCd2wI3n+4U508E eL4JCBZTUEMp63cFCu4N8nKn1msm0El7HJTMdWowC7lcUxMD4qwo3Q642RJmG/4Smy7jcuthrXk/ PvxwMELu6uSgc16zc/yBuk/wb1vWcjYi53Q3JVbGvWZwHLiHLpVt0/cyjG0g7sr9f4pcf7Qphpfv GACzNnvVzN0UzY+HRf/ynf107uctq3HvB1/QhFNArGfrnwVkXH/0nGHxR5quiIucUEqCl1aOqFDP HDnY0Ndr++5pe2YKPfwL8jgwM97hxjl8ll4Ei7wYke7+Ii7A54tRt112ZuHBir1e24ZPuzUTFvUj Ih4LLjy52bEywc9CG0Q92CdXbnbuaZM47CXX9yzXBymFmbRXDcOZsNdMWX+g7uOM21T3pBNupuLK t9cMyhPzHrUkqnxcYV4SN59l205f9W0mfA9bGjOBp73ztMe+5WHsBP7c0Mvf/vTTP778yz8/CeTJ /erLAfZUn3Ccv//fl4/EWPA2yQtw0Pz76a9Kf1T5FzGTP/8j7eF/+WWET6rOf9AV5O2DQuBumhdc wm2Cfr+tHHloFgjkzHjK8/RXZT3E7cY2BSpwrwc+bq2XnOsj6k9RZlr6vy4gxEcp6w== qH99Y+1CN7oJCIVgXUL0VX30Gk/GEy70xSv6Kr5sgArlqH9JDTR1KiClSd+dSNZw3J//LV4z4l5+ McS9i59nAYEeIG21WROqJHKij6RBpdFVk3KBoIoErt5nQcBnBewvEQRut4oEwueTSNijDAEHb6ch dCU3DSH5hevymV59VR+ZN/KknNNXhbEpz1zXTgWkNOm7E8mLSAziXn4xxL2Ln6/pDN3rxnfZ7Bts 9hN/bAwfoicljbAsqRM2Fkg/vPBfsYoZYH/ctMgQD5S3gX4Npeljk5XlhBmeBlH1D2LqYAiWJLNS 31PG0oLkB2G6vCZTUvUPrirl3vR70EqM17smjdZFLoyql18AVe/h4CvycKkxYVrBJOSC2QH1UNXe kMtpu+yQRcIGWlVx6H+JFMAWs79uOmQIRMyLQNijDAc37k/Didc8HpQ0TMynGoPBfX1kPumTcFFf FSZ3vNMMaKf6Y15nYCJ5kYtB3Msvhrh38fNPpi/qpQJSTU10wPhLxKJedwGBPpsExB5lQKQIx4CK nwc0K9EOUv0rrw51TG3TMgf66lDs0xxop/pjXedgInkRkEHcyy+GuHfx84E2BusHMTuD1w1j/HXT I3ezM16L2UmyPZlJkH02k+Sv2ewUkBhv+qo+XrNlp8tRX5XV2vHKX7NlJyClSd+dSN7NTqHk5RdD 3Lv4+SfTGawfxAgVsYh1+uumR+5GqAiIPYbVaJJh9JUwDWhWpMPO01eHSp7sPOWj6W9T7tMcaKcC UprmbeIkIIO4l18Mce/i55/K6GBlITao01CU/XFTKXcbVAp57bGsFlS4xIKSPyYbVCBs0tl7uvCG tWfrWUy3Itae/DFbewIyYq7V2ptKc8UGFRpefgFUvYeDf0IbVMSBvg+oe8f466ZC7jaoCIQ9ltVm klH0RTCNZ9ahw8zTV4c2nsw8U9V5mYCOd5oB7VR/zOsMTCTvNugkGL8M4t7Fzz+VfNRL5aOalsCX bOwvkYp63eVDbSSt/K/reNRkklF0k2kazxzaGVaevjqCRJOVZxGkukwBzgGOKdBO9ce6TsFE8m6C TvLxyyDuXfz8U8ZBXVaD9NLNw/64qZS7OVoXa5SU4GQ9uajWk/w1W6MCUnXrFoOvzvZe5E+k2Yt8 7AVY+a/Z3BOQ2XPydTUjd7dEhYqXXwRh7+LjY4OfIgf9r0v3DPvjpjruVmddjE6lX40koRrHcgb9 c3Bn2HX6qkWJJrNOeGYvMkeBdbDbumSQmW386iB3NzgnOfj/n7B38XGpLP30lqEa8GWyiASkJo+p wbiEae1RMwZuCdPWOUob11TDmmlYEg1LUFkDj0mmYAopcybu8y4YokODAxY6Ssumb/TkhQP2mNZN X8Pn18wCNTYEJKaIvqqPfrZTbOvKCx8GyYMRnxaE4mc+WIQkLZubEqTPQq49pnVzk6EWP/NhxjH2 Y31VH/28H1sUqS58GCQbHz6kDeHsNxu6RQLaEkcw11Kf86LBNbRkyS+vGnwKLZld4ecNx6LaZQml lyUaZmZnU3tliob9+CDzAE7tYIR5vG3xly0+5xdG2GNbVZiMNeWZETOOoXEtfttmRuiTX1380Whj RNW1NGs0AanKMsM/Lj6/PYZVo4mnX2eXPw6NYBrN3ltiWEuEQt3YIBptik88aCHD1RgMMD8kLArN yMkLA+wxrApNQzHXzIEZx1Bo+qo+XrNCM18tL2wYJD9SmoufGWEGd1g02qyVJ0bYY1g1moy1+JkR 8+4wNJq+OpT2pNFMo9eFEYPkT2s00R+zRtNo6rV6KvYcF42mnorFVS/VaJOnMuMYGs1iJGUJzJTF uTIj2hpNztUDNdrECDOryqLRZrU8McIey6rRZKwpz4yYt4eh0Swa0GZG6NO1arSh/2+MeICZJ2bo rBSdXiewWKb6WBeVaF6RvhtFJU6GaRxK1VSivTc7U7MNrS8xLXW2oB9o4k2jt7gOg0zlCTl5Hr0+ mS8QltEDcbzpQwHpluMWfVhndag+YV54MMh9rHk38cBiFwwybcf06GNdVKEOxN6NqgonHsyuwlCF +qrZ8ZMmVH+oLjwY5CoPPlrUFg5FbeFXT+nZx0b/n27PKzln/rfkLx8pc5vxvdizYOSg29rLAuP3 vm54tCTOPP3b56PrswPP8A93+5++8HdF6EDmCsbdj7HcWgsO/UbAjmSHK5YdLmj05x3NDtfnHd5V on4DOFrVp25/lxVYav1lsjpQXgQs6s85ty5C/I8eZoN+kKEPPt8Ag/EyoBtAcX299aSBkuXNlwGQ 8IpwZH16o9/F3dftL0iJbJksAvnzuVytXlQlyxDWgXbJLZP/wlooORzSGPTTBRp5YYyXqzhmUH2G 1E7vHZhzG8h9rDtRysG15cuNayo169NbPc1MNBvCzkYksSHAPJTzAla0CjmxQLI5gdv9W55lC196 KHlhT8LFNbUsINx4lhZROQ3+Tvh9cLaOp/c2upSPq3p5eRMd8xIH813K29M0EEV5AL0msnSMYzB5 KYlXm80W8lwTX/Hdg1gWbh8Gfx/TnaID2UWqp+eRrB2OyOes7a6foUa0/dfl7Z01wcGsJUHUAzly fgDyJ2a9/hv5p1nDyTKcVIyu1Wn90YpObdZXdM+MthJGzjTex3Ab5kGjrkRNxfJ82KDPsRrxdvTn 0rPsOIOAJlFMmMD23KK5dGyzOpgHp9psHp2qs3ksimeBMdELY+7sOzBZXpwGfVCXB6WqxE4v7uMc HMRX0x3EA/8VfbiEV3ZwQx1BOZ3AgX7RTrMAq3paJlj008yBE5NPROq701gOGvCkJ0VrTS/qWp7x K2ymQ1+d6d3HumvByfA5KTYBzW/rmyfY9OpD1rTqHh3RyysjP3FI350YedJur6vueYD65jLojThl LeuF2Yi77Omu+17TK/MbCy/VqwvQF3xOkfdkO7WknMx6w0aIROBsHpMw6jdTxEyFqKRFb6lEzdpt JuxO6n04J2Wq6GWRfL3T9ZCFbpbDNFgzvqfRquKZh6v6aR6citcCY/FaOHXn52F0+uLEg5MWPmlr o3d6dx/rYKCdcDPnYUQP+Ihr554eM0sqXn66b2Xn2csr/Sk9M10nxXpSSsrA+V0zYqY+zEmauGvv TpOgfSzCKbQsMKV5evckI7PSnDeOo4oU2NyPvnuCvWoLfXKtq4bSsb28wr8Tn+3daT6OWvCN7WAe q767jH+jb9WgGhOYVNQcJlAQeC0ghIRCXEE/S1/NeB9kp4uKoyGmRc8qJ76ex3Wn6E71SRdvHSov VZZnbhpsYtSBnQfidmx3hn3UFxd1OPPrpG5PalnV4Tx0JXRm9on41wVrfnMjTnmrRMy8NdjEyBO/ T8Ts+HbufsJJ3/nxMqm+eVgnFXlUpbJk53f195lzpyGdhn6arx8P7Hx5BedbgcRF5ZxUs8Dm6TlN 46KaPx2RU+U3S/xRSb6xcXxPeE4zsvdrhgI5oWKoN0kZ4E/1QwPdxYYBTiaWXsWmXqtXjdlYCAmB sKrE7RQ9X8+W+G6S1Y98+XJynl/3sN8Ou91jc68H8Obu7r4t38RifoxdU6eGlGVfinLLjuU72qqZ a8/BNhSWFhIllaA4khVq7opT9JsvNz9yXsnf8ZwPDvYbbvh3wnKH6N3Bw/0nkSyz09vQWE09PlNr xE3hkDOxYSa7wYaZu3rRAAsgMWjzql8mdTURe4qaHWJdb0TEvuOinzz5u7//T1+WVFYyS2/aOE2f 60qcIkHvX7a/+XL3NF6+HB2Sg9tyct1e9/C+Ezw6hJhOPpAsOl0yttPZ5SHX8Gwkrkbri1Ydv6VC ZQEIVkFuXrJVnMyLfcllsS2xooObc3KHTm7aW+7c9+JMp3jUyb3SNZfU4GoiVE/TfZpJ/1i0+Sgh sA1OhetpyrMWc0zkJo952S2sOoWkDgGcUyzlrZjL97zEozd58Dp19fE1UF08ZIBq2+NP1cFWeDFf AgNpkftXsrJuWoVVNXlUW8CxwlpW4RwrOpiaB4P0YOy/4RN8JzhxCGGcTG/hlWbWow130ui2vPSm l2X1mXB5YjF7AcRiKWLYjYPd2p8TdN9z2E+O/VsBgO95Dycv4+SN6Or7gC31fvW0e/MvX85e9Vve 9/dM+KOp/4ZLsERhDtEGMOijhQv5ULiQf/Xk8HH43iX+xfc78KlOBvAfH7wJecP6MsMEsSy9t6Hy /tcDzt2viBrHDMPoUZM6k9rWMp8GHawnIp9Ta/QdSXcpoQILDtfMcUetv3UG6ZtfD9jMQXjf+qWj Ne5OmMJmKvrvN8oUNpOx4xukfYhviq7dqXP5TskJ1u7EtZW2eJiceJiccJidcJieHd8npicfpicf picdpicdpmfH98npyffpyYfpSYfpSffpyefpKYfpKYfpyYfpyYfp2fF9YnraYXraYXrqYXrqYXp2 fJ+cnnafnnaYnnqYnnqfnnaeHneddNt1Um4n7XZSbztG60rg6aBF811lHkDpoEXT47RoOmjRfNCY J1g6aNE7aZ/SouGgRuNBZZ5g4aBHwyuKNB0UaT4ozRMsHRTpA2YoH2YoH2YoHWYoHWZox/cgRRoO mjQetOYJFg6qdJ+hcpihcpihfJihfJihHd8DdGk66NJ80JsnWDro0gfNUDvMUDvMUD3MUD3M0I7v pk7TSZ3mg+o8wdJJne6cUAVYD+qUyVt05wFUD+q0Pk6d1oM6nakwE+8Aqwd1eiftU+o0H9RpOajO Eywf1Gl+RZ3WgzqdhxwOExQOM7Tje4A6rQd1OpORDjOUDjO043uQOs0HdVoOqvMEywd1us9QOcxQ OcxQPsxQPszQju8B6rQe1OlMRj3MUD3M0I7vQeo0H9RpOajOEywf1Ok+Q6b86kmdLirtpOZOem7H qF2ZhqKXNmeVX9q81RNQ3/56wKg95UNP+dRTOvWUDj3tGLWnduipnXqqp57qoacd45Ajz9I7Sc90 cLDKf47Dvh/5yFSgLKYxn+Xp5cs5jiE/H0AH030C0XeJDlGp//plKhJ470DTneaTc3+KvZgAHrzx ler4aKrrneqTz3sKSeQ71fVMdXk01c7dyTbY93z1dqd7x2dCssceP035HqKbRTvd5fgA+l7Abxbu +GjhDgfp/p5PfIpUnkJhs3w/jPA9qDML+PdcxVMM7xQkmkX8YYSbSIaTjH/PhzrFt24Yb1L+MOL3 EMos5fUu0gfQ9wIys5SXR0t5Pkj591yVUyTpFKeYpfxhhO/u9izl37PgTwGWk/s+S/nDCDeZzCcp /55pe4o83DDepPxhxO+e7SzlQsZqlBxg3/OUF1NF02IPE/SZ8nSi3CyTE/B7PuRisDyM9t0XmmV9 ITOfaD/5vyfvajFbHka7CedM/DA+ZkLbifqTb3jDeTdeXqP/Y7Vh04fQ1EO7h6bmNEW7Zy7UjbtH pl4Jr0xdxEMX4dBHuHcSz52Ueyfl0Ek+dJLvnZRzJ8OfPfi4C29O/Dow7HqlH03qHA== ZiXep+AACodpeS2LEA4TEw+TcIKFw8y8FgsPh7mJh3k4wcJhcl6N6IbT9MTDVJxg4TQ/t640THyY oHKfjQMoHybotbhkPkxQOUzGCZYPE/RadC0fJqgcJuMEy4cJejVGlE8TVA6TcYLl0wTdutKFNcVT TK/NoRNdqAfYHDnZ8d1029RPPPUTTh2FQ087xpuCm3oqp57yqad86GnHeNdyM/OuI/eO7Dvxb8ep nX20/Kkcyp/Kr55c6LsfitkDtrqKDTXEmvnf9rG7W3acLxNM8OrOPve1wPTdrwd8gC0nh6yu0L4j xwHduVKcCnq5Rs6+bodvaJb67FsdF6/0Vloj7K08E3FiDmtXLUbX8v3ArRecOfV32TTWXvwzffbU dXr4E1zUKdRkbOP5hy9kaS5tFAWcgHhle1au/TB1Y21APN/KRjiUg3M/e5uN1HUsP6iob9NoXHua TrHMFbB21oU/LLgU6u9UzXJSE5dWuton04/Rnka/tzEiS59LF4eMX/E5Xlfkl7ZG5dlfY1zX0sH6 243EA3N//LhgJt8Jqv4gmB8/Iac4h2BaLzzbqfYxWJeZjw3OA1ob6Nsqb/o8M21v0/V0SPlt2d/b 7FQuw/gkn7X/myhTibccpmEsz1WSXIROYvlJfQXP52cXpPPkKUzlJcbnrtAHs07M29sYsSKt+ryI 9K1ReA7dS3tz7extdmJPs/QJpiuau3B7Y7pKuemOcURD29ipOMeV0gvuIeTWG4uPSqKCda+Zx7a3 0X+P76p62Nugu+zeWk57k43SdSif5Ll0/1A534b0MkAqOMU9X3XaKY6M29oopSK/8rjI+NYktf5T Dm+upb3NRuhhdj7B7N2m+dQGuQvoywRT8okT11Bj4FZoNS4s2BsZlcJGs7pmVu+NrMc3ZnRvc6P2 sOQ+wW3VaDTtzRu3FQ7tla64mGK0x3RrTu0sfVc1nT7PtpjCrD/shu5gI+0NxMbS99VUmPvY2+x0 7mPZTbGh7j69qnfyZoNMV5EaW9ztnQPr72Yb9ZXe3NkQ3duwtcXvXxPmGX6j6sDYB9hgu1zR7cF6 3rLMh5fs9mBmb+BDvQuyWRgVppPM5pV2JyppHszawOhjMbvbRVsDtavekvW9zY3EbRgPMr9u4mt3 FKuo6gHpp/mQmGpLsYkXlPOsGUwERQ0r7vbOuPV3s35ENI/+2t5GLKrXFsj6+07faWYeYG/dBFkv s7Vdic+LyU0wFge3Y/fsCi84Z3lWmArL4hg0b3p/Htbexmhlmb3bQHsDsaHeWDV7k53MfSiPsbRu Im0nOe3W4Ul16HnYbCdJp2t4tjFNdpYKjNpQ3OmBacvvauyIrB5sn62FdvPaell/32g7zMgDTKsH bni7WM4GlpmNYjvJxqPm1WDB2sAsHGHgyeLZ28ym6GkO199vBB7W1gNsqv4vRSUfIseKdA4JWkdi AKmxpR2rKtTn2SBTmBlHgIezsXRrI/0pDrUd5n72Njut+3g+yXMlYVapD7Pm5om0jmQTUmtNOz7x b2+jOGir9Gejdm/DtptiuBb86283Cg+z8wDL7g3p9sJUseXIApFscFH7I87fRBCUs2xbN2rck/mm nYpenIe0NjBbS0T2ZHvtbdR+e2v57G1uZG5DeZCNdxfrz0d79uHNxp7Kjhpz2v+JjXsbxaGSe3QL 9zbS31uraG+z03qargcYfm9pcb3wRG+nIMxiV5sW95zwWJDOkm4diQhNaQqt0KDdaR7X3sbMMBHl k1l2ayOm3Rtram+yk7oP5zHW30GHKxKL8aiwzxxPdkEjQ2ac8yxqNyI3at9pt0febW2yXbVK4nsw 07YWs3fy2kLa22x0HubnAbbgQzfMXVRna9Di5GLs2Xal9uDMir2RIlF2niy2vc0cgH9tXvc2N2IP a28OHc3r+K+/WEL16RO5vGsxM7C1jxyedncynvY2RuIE382AvQ0bEorhWvCvv230Ge0P2u9mvj4s pXQtWxxTrpuXdnjav/c2RuRk1t3M7L3NZIy9NoN7m5XSMYrHaNmHslhwXrN+ZbJVc2p3py1jb6MU ToHQTfFtLeYg5muzuLdZqDT6H6RVb8z9iEZQZNeiR5lgVZC2HlWLzkPeGxl1c7p/0257mzlH/9r8 7W02Um0YE3Ptq2niB0ephX2aQpTDlGLz6oEVIu+MOM4qf04lvbsC5P2x/R+/vJIT/0CRyydS1Vqq bJ88mz4iYKrB/I043V/+Hr69RfxrNSo/o4jkw8L2+aqPdwYDN4Kdus3qTDxN15hVPZwrw3m1fOLd NSHvD+H/+OWY0f5AzctHU80fnuP3cOwtyl8rOPne4npI0cV746GfXtWHyX53RcZ7A+s/fjkn9D9S cfKJNPuHJe0dPHuzWOZc8/GdJfKwhP4HIjef1mqntPpHsv4fCcTOG/CSF31vZcOH05YfFrj3sO1V ss8my88oG/i4cnlIvv8DAZhHbSUzvz9SFPCRiOq0A8/dv7fq4WPJyI9P9XtY9irVZ3vlT7myHpXB /0jM6tPa9CAmH0nzvz8mOm/gc+/vrmP4cDr3s3v3z+HZ69UXJ3vnO4vrYWnfD8SjHub6zeHgj+SF PxLanLftJcP1gfz3JzJPn967fw7v3qL9NZPne9nhh+RkPxCme5gHPDPuI1nbj0R9p0147v4DqemP poI+bbv8HLa9Rflrtsv31sqjMqMfiV++Mm0fyX6+P5Q9b4pz7x9J8X40nfWOwb+ZYT5bBN+R2lfO YyY8/7e//ref/svvf/vTH37707/++tcMpmOa8w9f/vr/wS+Vf/mL3//xv/9fiscObBIUxzZ/9eV6 +k3/7+///csfvyynMs9nMulE5q+r8+k5Y2OuPoVnxGl+3RdRQqwiKOzrCosOC8wReHr9FbBg+OkL UojjU3fPVcsI7JPEzS7d05/sg4SXLehOSfTPKXZDo3eZ8c3jyETT3RrJC9iV+gRg6MJWmgCvrlQZ GGOTlq4GTBmDfUvatk+ovp+lr5C6muGeWguFgcnnKO97VMfK+7mbl9I2Ny/A6F17Oo7ghy+QmP/w m9//4S9/++0Pv/23n/7x9//j6T920J8hMVVLzr96+g//9Q9dMP716c/+4i9+8+3bH1/+5t/+8I9o +qun/7k3/F/6f0RFfPYVAR8aXHBVuBPxWZUqYF+YDuRWdHTOR4FNzPGXk8FF/hAIg6HoGDjG4Uop CuwbmLK8jvdrqremoc+5AJNTpNsAHsic9Fyzykigb38wdFAcw8W0pefgmhBMGSgGXvkSLtBHOn4Q BINkn1OWtqlzR4FOsa4EPHTi+xpR8XN9qerEl0vnOOZahcclORVr14JOnKxwLKCnb190Nks04GmC /077iV6Hi/XLwNqa0BSuq77FRLS9sjI8ZCU0XoI11qKEbiP9/4KL+Coig0u01ZNVeuuQaBeFsa2r AGViMDZ0DahsjK3IeIsL7U8+tIRMOGl1ZIG9Cb/LwTHUuUvl3HkWGtnyGBjj1RgYurMk8wYdehUG 574NPzEQm4D0lRMjKPgSsAGL6s3S25KIJXxpObCOrsbINrR57eaykhWDV8XdbCJaF/ZI7E2uS2Gp jLWra8KKIUYYTwQMMcv8VKwM4UxpXojt61OoSsF7Xb4lyghCSslEN6dQmYC+BRTdZQREviTr/a7t hYPEdX7dPdNtoAx2mbtypj4an7JjoO8brXClb46GYPTvLtulrsaqpnaidN+pITGouhrHxidYa+80 qCRfPFlgak06/lWEHiedAazV5V/dpaZIN6p8FTXcXKVVgi8kxUAMK32L6CP/B2pbujuSVY/DmGNg qXlbZqGPkz+IC6w1CCM6OLqUBC8EhYHhqo6B4XJVgN0kqQyM+RIdhs4K7/YFX170SoGwF9TWoggu HW43EIoh8KLv8LEkX2S40RcB5qsvK+ZXagrsK1QpSPgqolDgI68FAINqqqaMuTH8oZPpLt41Oh98 qmZX+uKEv5ENpA6LoSisxvj24FKLCpY1Gcbu3YGJJR3Awsq1A2sdCKILCtaufDKamuFUY7cDY/X2 ui6pDg5NJ8JdQRGEkJ+ODHigHodCvAQ3KQFibld45I0wmLf0bnz76r1KA4luSqheUSHvy53H1sEh ZREcMhUZGLM33tYswJxVRmPMA4GofPRVhIDUVY8icCUw1r5juKjL9/KiRVM2a7Qv5MpLvQNzSdK2 L6ggwJaiDPWCwmIEeNDRXoVVVsIgXdPOXBZgd0yULK/iQeA0gxVYqi5fYQyAbdZA3wRBdCrMPgal gD4byZyFiSMIikktRFkpcFk1UA5BO6MtlIBFTCvwQIiqpdsW2v8VdIGUVnQArjRVH3mM6tw/xWd4 bh1bKglznwUB7coMLL7qUPM15qCJnV/Mskx1WmMhCYKug4OuMQ9aGUFv61W6XE3a2ZjwCfgKBcm4 5T3b3TSuVjY5fF0KLpPDVnW+xEya5bBMgtx3V3u/mMDgJi0e1fC0ugphYOuzpW5Du4IupIZP9M5b AwO7vaMqvO8MAiQtNLaxb4KgXU7HBSOyAzM+GpxMFbAnnHGWxck+2K0d2QczzrMoBfRNaAaSoDEQ aoeBrVOjdnF0hqCrbz/hFWBSW16FM188xGEaGwLZ9Ktsudl1S0B9llKupMCkbCFPgV/vxpNxtojb nz0iC2Ie5NQUSNaZGNxFEfjnauw2WkcwoTAqBsaiSsdloyB0v99JZzX6Km07B7Wz3gG7Th3cgtO5 lRhBjvC+VcdVXokdGEKLt866rVYvN21XjLVa2yJOKchyVahtZrdkhD4uMQxj5EgAeGAOGdwXZZcu GRLZb19ea3rE+Wr/B1qPo3qVA8rZgvuNqGnf0VpMU1MGDqsnN3ViEMIrVX3fWpXb3YZQZ6xyXOB1 Ag7TdZzYmxC8KTCbcP3Dl1cF8Siyr4h3x5uqrCU1pPoQomtqPouKISYWjRR0cnnCi+vLive0xNoO QJisWYA1sx+D62RTFWC3rvn9CkP2EqgL7Dy3vpgv1tyd857VTkPgiocV8Sldjkv0jdzcEyR6yCPv FldXzdo2sJ/d1d8zPB8AXRdZGUF3s55DZZ/JMYUIWzr+oigBkxNgnxnZkyXE+QOFOAt37h1tyAh5 erP9WQQBGxsE7Ur8aic5k8nYjTaimPsmR6KSE0eWv3NdVVeivTekkmd+/+Ltit0wIdMl2za6v8dR LOc8KrClJ/owMnOvIrhAznGSLarbsPDJCWlXlJl37lbVYu+m5HXJ+30n7WTz+8HsnJZUsNGWR0XT x9tOChw3JAGsfT0EdsQjr1IAL/X1EmK5kYSidJ/ZJcFKgUtCUC4NzAIsPnOuukl2BF4EKGd1ejsL pi0C8b1LwEmMRSzYyP6tV6nCGmrsNCjwm+wxnh1LgEPWLb2yVKEz2Xhg6UQnXZGa0T3u4uhpB0ex CTpWx64aEDinFFR2QTuwIuzwTfcNT25wBzeXdJMLwbNoZK+bpG9RQhlkfo1NukowQw== /dKMcwGkhkBrdyoE6HKRlg1RODVUoiFoEpzrg62xCAEplSxAd6nAkkSbpWSEdYFSo4rsAF4cops6 MJeg0Rz2p8Q7MMLKpT5L7bqW11EsUX2W/qjRjNB0BIiDNom8dK3PCKJGfkFVuNSTkh0OzCpFjU3b zzCwwEZJB3LNJQHF+sGayBo68kFUwQVJ5xA48MIbY6BoV+KLODLetGtjo0sR5OwEbBLXEThiLGJj 6sx5s+oqz7wiiE1ZY/z2OLCh4bdoIbUqLmJji/3bl1fbvoL1FQqO1B7HdeQBlKMXwiyA3zoCjWo1 cX77n0QhAWln/EECgOqgdFul8oZKQLbjq61PAG0IEVg1BHlJZAKhJV53oFGcqd42iCQO27rg5n3Z /hPfF8ptL1m46TL7HpqNrZIO1BRCB9ZUDIGa3NV0H1aQBfw0DEvccmbDqU2Q6E4XdRM1fdVYCfGm hpivDNY56erCElcmkkHFI5NpBDuCRiVK6Jz9O2kbLjVs1FSYYr74nnx9i98jfFYt0IbhDHYVNkPj CMlVXpaGwOy1WmRyb5GVf3hY1Aa6LhaxZkfWEootODFc/eVU20VJMBZLliGMENULn+I2RXecydlL 4JVOsSnWvgyS+stkNarDPSIssTndssiukXk3d3cbwrfHsOdvOc39Vz/985Lk/tm57yf34ex3YROk NEmH+Mq2j0G/rlCEiH0tkuUuR4i9aUnv733ti/LaofPs4phy5EzMi4ApKULgS6LzAWfH2QOIti4D diYnwBE19VjDSfFKVAvAi/O5EdGdLMAcixjVtRt+hoCsBgJrCrEDxXrpwJajAkPhrSBOIRk/Qj0d L5b4V8FLdhOBScUrsyvyrWzaN47VeCi1pqTJTj2mBXl62AfaHQVD2DwPfWdRvC3o6GhLUio6RQKW tH+HpchuU0csoQJwp11KV1EjBuDMy6obimJvAFjZP/IcXBesEsFAqYAs4AA7LSrU+EjpGR5t4nhX uFiBiiDkPN4vvMtECkIJ7NJ5oDK4o3whJo0fuvkZWXF7JNhE7vpu75vMDu0zXAfi2ahi1oAfBma7 ETIim2UHUqyLgN2HEhjFNXloTY3RDk7FRERH7NnvZwEpErD3al2h5aUFBmjrL1sRHC0IAfeJKB84 L9Zhl+PUQOQwkBFg3EkXe7SEtMnay8ErUJ26yAvuB+FXllKRLvueYxgBQflUhCodFnblrOs0a/w7 oOy0SmdquAaKj6n7K3UbkITkTRLqkITSnI4W+VUG0kpmoHhlABavwKpRN4Cbk/kiG+KrjOwKVcCW 1YKrrHPTF1PQ4cZLJjcENa8geZKi8WzgfdXuRMK6CybeFj6nI4LQXRkn6q7LYq5aZVRdNpbLugmt qXC4zCOAI9Tc00m+Ve5vbFSFq9tc1MgAL76mq0zcmtdX5LnthHUA94n8UeIjKriN9+oXAQfhQ7Ph 1WJZy2aRXQBDTZNNzX536gxomsPv/OCZALhavl+SJDUbDV0je9YsvWVNHCSqrA7Vn7+cmWkS7KtS ssFtE29SHdiXQRGzXK1XNPVRbO3sktKV2ZDk8SZOh9ZixQnVMuNomTTYR5l9xVtrywpusvNUFK4G YQPyU181KOUv8Ry7La29FVfFRaSXjtPD8+Z85MpSMWE5iQ2o82bc18Lxoji5DBRa0ZYa8+zOfZWA T9col6aQG8rlBFgNgUawdgJUoGBbB629cCrr1Yw/eOtYgsqfBMeXwPHieGqt/Cd7sJJJv+PVDhNi FrwDSl9JoxgIxBVhb5qjc5FjCAAyUg3ZqfC2kmVxk1n81cAhT2AFcohuB/oJaHidV7yeMzYk6FV0 lmqBZVAy0JZ1V08yUEC4wCkNFQYgTzcBGV9DoWCbY0g/KAJOfxOYnWcAU8k3BKNz5Tx9bdmzaUph GWY/4klk0ofGie6vAhZTITSr2+pAqXAMoiYYSOMmIMXBfhAEEsEAmPfYCvZqX8Z9K0gB0stUkuNo JRNQTSV5NTo7WESeURSaValVZiCZAQQsiN3/oAhylIJVL1VBg7BIJag6sBbZdrkmuxkDy1xlcnHN sHCxFUGgPj2AQRHEIa+OPXnmOMb49Tw/X1l5uMC1VrzXt8QTR+DoxGChON1XAzdtzTYqo3AKLORD H/D+MDq8shhtzeXv9UfJUN6rPK1UxJcljgsMsL9OaIcOGpVifbeMpoO6Fldl3JIqm84ejcyJ4XRS Nq9rc6haLzo6S4QYfcGMYxKkxuBO19iFUy6iTGm7fXlrU7HFjGA/LC3bw5rltty0gXhR6IhRPx27 UxWTOB9DS5+y8qpnZM+juJhohKTMR1yb9xoKzSeNQIfasukZKsXnCLSssQ6UVBjifaUc1IyQdFWJ U4tpD23G/ifVnUTNCogrhQho1XpiUMRVKB1cKi+uhhprYhXCrelSFScloAi2mr2OO2DKJekKiiUK Al6yyApIyq9JTS5zr2mpA/BKYsFbVRUpZNW8loLqfPYcfg9c1qMUpJCkbZP8JBImTRMmWmrVgTTx AMq7jV0ERikFlq3pQkjBHIAOpJlhnmjQpjXerSnYkJBLkm58lKSK1ky2alRyWILf79ASFSpx6wYr jWP/KEMtSnuWXNMcVGhYM5x/ES/qq4CzSF80wwFtfZFxaUFDk/wxj0tTCq1Mk63LvpmBC6DsRgDK UC8rwcfrbJfh879wwL8KONQqoZno2DlFDuuKTeWKzUjMf9bRjj0OYOOMV1ktskziEPasuwOSCOhS XxffVNMIDLxkPw9W2YjVwpBk9bEdRjsV9yQnLADV+tTwTMfFfi3ZtiLsKyoBwZIkos8ZbW8RqXQD Q3XskDQEV5LMiiQRCcgbLLCaCAXWJMw/x75IQ2SkCVLnOHPRgT43IYBOETACr05dkkjArykHLL6T ZSYB03URuaJH1f4rtmuR3q6+mDmt1YG1XFLlXIbt2jiUAaAVr9S+Nq+9Irpa/Q2ANet+RLmosZso Aqp8IrBmHioqfjUFZoZDQ/5JUk2jjLQiUKT1yLQXMzDmJruUCfFlIbQ21dI3SSgyBWJqN8/VZ5xa lGgKpICtQmjBNk1u38A0k+pEtjS9Cyc+F5HXrjy0HZ9kkU3IedlDikgRFE0RmCYGKbtfdQfCHsfv 4yiCZjYlk9BxdltadhxTLYnNU9nYlIH3DfOr7KR+qnanyqYXBTdN46nn1zzn6ViQGgcBASxa2J6L VmADnHxT+eLcBYCOZozkS2EbAbrHR84f8vCylsy2aBuFsyIYAhZtKyWna0vIh7LS56xgEUaw/SpO EXAh6+tzMbVNSYXBi+BK2cJxCMPwSzx1VGnfW6vhp9G1aiEk2HhSzF/tNACswarJLRfDMPxCsIRR k5VaORpU50QYuspOskC+XMkQaES28vIRoAR/4fEaWdsQxtg0MN14EDo2yvyyakCEQJXTMGs15FVH skXizq8YpQIuWiUiJdTUVFOlpP+PdInRf13mXJfhHgKs0cfKUfev2pp3FApdQFAIFrxmFWnnO2BV uS4aGSJ7dLJd6eQcg4eL21KWxTHZf2q+4SOLedpT7cwG1Qjqtih+f7rGtpi4zFi2hKBrQI70pIut HVM9VXeKKmHFBg9LixraJO6nBRdsu5aKbAZKfIvKKnRb9c5OnVhhStcQbQxMzkE1nNywjUIS1K/r IqnhnYI3Dc67E8HTGmJgbRrRuTQdD6gFf65YVW+lbHuaugqeI+UMtDJ5GAFsWZHoFt1oJIQ1RY9g mnD2E0DoXWNh1TCnVssSu9TLM48hsEpiJ88iOh3cqlGrZkzi8m1eEVKFjF2l6cxSbNU2kKq63xRk N85CsyFk3ZZyUivkCi6YeJKaoQnXtCxsXgvKGmOKlUJdMxNhympxjVlHyAF76YzCg7rCRsmPVkjd F57sgTBPbPnS0ntRcPYSraW1KUbHZcDAwwDQq05Iww1vk+KdEGgUZkGwUQBl8ed/JCxiTLJBEjUb 1cGpXFKZpWd7AHRVPDstVqqwUVPbTZIaNZ4Et1aWVQdmThfA3auXRh+l3J5MomsgaFEdTjqap9HH wAuLTI0qGCABAsNG+GuKA6gS8lNyFZFvrkynsjvhGmxfrySIe4hD8Bw/Q7lX1XMXHexKDDreGmRg qagSylIw34E+6k5O8XgdmKSNoMe6YSidebNMS4hKgcYW+gJQWxF5gqJrRQuz6xyGIKEXFogv6aca KERIgjL8GoGTovW/8K+97EgUJRG/DcGnoLmKyiY3ME85kKysDVdUv6Fook5NXt4uL469oO2wBChc RsDUSpn24KrW5ZXVQFD73vNbYjVcal0709BkduiA9agMTBQupZ/iEXBm5BTjRoEoEtjX+VIzQIp9 QFYwoHppfc4R+tS1KtYFiYJTy2nMg8YfesvL2E0bh1EgdYJ+RkB30HDb4WVJDgfAMekAV3EfpbyL fKQiIzBJanzAhhs2TfITXRoXkbPr5OU18bOvYV2pP4idNY05kJMLCFYFN2zHKk61RtSGyQWgxRog RhITCKbhkd2qXlx4PfAMdWCOrsRfGSyBb6IgaR7r4mOfQCBnbUbiA75+0I0aGkkYaGYqTuQzqNtM QfRhKBp9oa3sB1GoTioqsd9nCSsQWLUJXcMoKKoCk4sK3BQ1lLh7+kshTYLT+BFrXrW4Bk1EQLTT 5nWZaPk/Csez24Xhhpd2jr/9cnG/AfG7KhkeEjY9Rarl5t7K1UPmI20MFOUPoJwMRVpBdQbA4hMM CgFsXvLK4t/dCRA7ODc70jjHcDs4VCeIo8WSc+N9Y7QWFHK6a+idO17tMKrchzadZEeVP1tMQcII XwWcOHADsJfTPVFLS0JjpXvEq+n0ZjFtz7bYi4LFu/EcH/6qYHYWAZYdKjQrz0QJLG/oAOagLHWq RO/diX2DwJGUVzjYt3o+MnFMncASsU4Rp9Uiw4ooAQAlHehYLrRWuEmBibM0BSHIeiuKFE3eCRhT IrUYQSqtdEpk8wJYli0BNf9lp5WiplCDVLf+oFPNJg/h5bEByD4zgFI5cpq8I2HCS5zz8EF+oFTH i4INTRMDpwNxCuFpydgBmDU5N4oOgUDuWrk0+U3ApMNohRfZnYIfjLTomsgVVTgoaRom85wMYKDW DXveDwWYbDl5las7XuVF311SkSxf1vTcVVA/xrUA8IGTePrF9s142Rm2jqIJ7ovHesSrI/QaYydB zKIycCKC45O4OADTJkCONQEoBYFFDGDJo3uZbeBtCq4ciANMagcXpBsButSjZUET323yImBN5ie7 8gRAFgsCiuqMzKoB/EEReNaoif2Gr+fuvhodWkMhOUmlQwuUo9oWIbANyUlJyRcFpFT4uo0wilHQ NARNamotGzpIcXv/1r8wCD5bvUSIgPhFocKfYIfE0qj/C6Nw+1LvD4VUearRTllPPWnAC0CrmCrC 9RsBOnNZT38TrjI2yBGWtPI9eCxJ2lqRaTdQ+OwZHW6wKsbMNclL0CFkPXWRLts/7g== FAzSNsx6aYAaapdltQAMdnZFSotwowGXryUpj/1BEUSNh1DwULEqFRKQOQ2NZ9PrkRQ6dhDEYwY4 XXoaQev7vR2TxZES2RG8rfsOLG6c3WiXxTlEYxKCrEluuTnkToEyLVg5ZWTr+EXASeqDR8bpXKMZ 2ApgSYuaGsbdZkwFbbpWDqmrNozKOG9Zaz+dYg7e6t28qToqHi2CNTaFUQiAYN7OIKNOlAUKajjZ COqlbTWaEEa4yXOuVEeg9Qpy96hQJS1VL+AuriqWlrMdET1JtT2SJeyihVlJZjH5gUCsQMdXhGn3 FH5kI6BeqkT0qIzjEIFot5TVtvR56ELP+TmMVQs3g6bYaSOTu0QCkg8yAzm6MYUaXg98aP6rajdO vJKNpTratSzVt5ekkwOCI0Ekg8qYFG2W8tfAZTyK1vkgqsnmO1geKsAO0ALcs9ItYvqNenL0lbTI tLWiEruJ/NiVqOaUwkoUtdbdIHiNYVHpuG4qkteg1qKxIp/+ZaBKXbTDwZUrAX44dzcZCpcmpeg+ ohcFN41A0br/qmAJXTheXgzUIJazcO0d7xh4y3q52jhbQuA4g3Xg43C+BowIGPIduOJVyyRz0QFT Em2EmTMVQrWcCs4aOZ7SjgAWjWVZSpmalnhvOoAz0oUApQwXjgQ1LOGqvhi4iondJC1AwFY2Kxa+ tpm2iGYoabS/i23KGUIAr6AGq4jnnYKZaRpnm+zHGVwc5xbKKCF0VodyGvQNwdRWqguA9enYv7ol yU7KtYkwgJvuThqQyonFkYCUP/k7aVtK0HSXKJClrZwhuvelRBTbWyrvWC9n8FcFS+l4teNbAIbc dPFy7ATApDnCGvT07wEtb/VO42VUC1jG5Tp6/WEHPzEkyVnzixnBwByDvm31nGgrV5JcluCjkiur OpQ0y737SXiWBWOyw/WQ0B0SrelAqfFWPSNAPpBCwWMvV4VQ26GTxFsapapunMO+r1ieN6+xIbpb qgpl2fNJAQbLlWh5HKfItgoBtHOH11XFDQPY7oXScldCoIfdposPKO7BQGP6nTCZYhyHznr2kCye FwXbFRIWcunz4eweJwmJAigbWGErhDu8LLtTONzMwFHop1OP89ROb4EkZaIIvN3KqOYg3ZqiF2+a b48MrF5VSjnGH2QIA+90olyKSWIeZ9oRDLZbPs1kAA+c3sYi2WU09XYloRwfy87GmrkkS3k+3rdI hhUIR6nv45ZSE6bXRSoCMra4rTnThFfvqaG7Ib++NsUClsLdbNm/PI4N0UVyCrMrM8ZZJMyvXeyo QR2QIOZYMTV9F6UfTMY2EVEZC1YLmiTZk0exTrGyOwBb0NO4GpsAVNJxZQSFnBZ9xXE93ElGWcGN K6oqF5ToOVQ9WVIteZDKdCBXnTpcjxTVbqLp/CYIvMxc5ZCmIEjBEDQ73bpSoKUU8CHrNGatttVy 5PKs9SBJw+xR0i4CbMqckU+/gzVvV1JVVmoWKFlBV5lPrFx269woFLhRK+oFt6/IoaDEtQIvCpaI V7JqUYidHDJIVi1Kd8Vc2tLqcEiWo1yZohYIyX2RgElrnBTnq0dlcVJlnyFwupA1+jCRldUluo9A pfoyjyBzeu9FwIUrNOhuX6cXO2nYB7ZjC2/prUvDiWhbgl4XpSGQcZ/znYIfjOtqrGQOzyjXJUkx 3f6GO28uvZROL/uh+2X12rA4cz14XYda/RTzdIWe3vpA2jXoRXNJ08Y0+kvbOrkXN/PFedxW5Pc+ hDG2iwsy0Br2xYuB9UYvJzsDUaGg8h3CNB5exh2vK85kCNb+p3T9bXHYWR+uuNXN1I7qVL02j9xX A4sGzGbid6AeNM2jECxaxCRPzjbl5rNuGxK9RAr7diMxTrplXQQuTUl0KUfS1flV8PJl+/OSQRrd 7vnWO8WR2bKLioO7RpatRd2htFLv/2Xt3VZtW5IksS/If8gXgdSwkxhxj8fuLT1ILCEhqKaLRoji VJUusPOh1U2jv9d0dzPzWGuunSUJUSR1jp+xYsYYI0aEX8zNrIg1aBx1sXKH7iq7Uj7BbtE+vEU0 aMZ6TYu1Tysak70pKU0NIlFJvac6ftMGseKUxTN86L64a8snQ+a8qSSXPwL6SkLDdsJ83SeoCS8g MgwODB/t6g/dPgDAbNksXssu79/t6/2Cm/iijTujo7Dj9cajIT5ux4fyL1ZA211yhxEQZGBC8GOd INkt8O027qEO9MdmDbiy09PwQKCW3VVQhnK/s9cAmwAs+i/W+rSZnGS4sAFl2QGYE7sS3HTPf7HL CzAcuxAr7mEyzXO+g/1NCXpN33YXFW5LPteHtc4LJGW/1AmUztbiXQTszyzuvjlLmKXcRbvNCW+f A5DbK5p8fniNBce1Mxg1DtrXJPuOMGV2rTLGHoKyGYuNEOWeApsbSiRnwojo0nPrPdvXHnSMPCFS EUZCiC6w0SPwlkUsU39f1OtXCeV4yEngiZBCeiz4xgNNaHwwDfN6VK2wyXYiox6CSQq3jc94mELi 2KtjaJc4tIGyiWmtc7XMpNO+xFbgWM7oBPBrJxCPY2oGRbju7KSxa+tTP63OdS6wEvO/Zoyapt2r CITMHGQWRGKyBPcAofAo9rIkmuCZpAv+LrMWZkRJxE4zY4fjyqnFY+uyHwNKxLoQG40z+cbV+bCO 4Oklup2xQNVey/3M7uyQhTs7Ya24GNkoM6MXwK4NMitnmHq6HiM/8qYQZ60oQ8QAALSaEZvEIx6m V9y/9Mi9UssBwLVrgFYUndYiW5DdLiApS0BkG/Uh/ud17XmIYWcq3BgEoznc1gd8krWErX8CdskB nGgpXg5C87WuZOGM/scY4M+ZDuGfX4vDQrEPJETAtzBARBDGsfmJ8cD+Lp0G89D6Qoi3sq3smusU SvC5oKdrBnXhvoGfawTffawY8NcuCTHY42Y/7cs6tXcwYbCMm6/hDghvW4PEwL5LaW30i4CNWBf7 LdXGWP5cSZd3d1+szpwHN6q4lgxuTyAbYAQMDcg/FqjJIQcSug+YHfkZ5sPK/llcRuxKWY+60AC+ jWTXE61uYQZxwMoj9HE1i/ihIqRlcnwaYKDyedMjNW0gPJhHrJmrhBcaHw291FUiZs/H9QEzsja+ I0UmcZ4rX8ffmkf11OdOlR1mIXz/pSNjZiGu+YXNrXaQEkiPMLIVrViGbmlcYgcTbTwTdnOUZF2F 2Qqv/iqfbwVM4sPJPD0Pn4KlisGbOAXy81oKY5S5VYnfwaUWRmZ0DxuR3Yh8B+QSOADd/a2N0oyP ch1dA2Q56EpIZW/GjrON+edWVSdCinRaqEOOaC8N/Qj6yaiJmFvNpTDn3aRCMuWlwGIHs+KP7zLV TGAn6Qf1JfxuCx4tW97nJtrjk0M2l9iQTvwVb2wu5ew1r1V43hVUXSd427a6BDjsALtOnkw2aHnI Z8gVvsRte6IHjU/mEUPJhKNsAzx0XwfZdSc55NxrWPp7pJPtG0Gb2ZyMQczIJTOpWONew8oH2+lA +5vhc0EDke1pYimYd3GLsJmJPOunU8wKH3KWkwLTpgvIbPkLysxWN4nGEierjPDMnkuX9slmXWqO q9OBbOdGcizaFAI33is3HOB1AyRfZHZ2qAx6dLobYypGRePkHxiAkMyiyqERDCdXCLxaY3ku2qc6 2YGmlZHpfLk//8Pzl6BJ9EO/MafkSMF4sOpkvYhMLWu68I0aF2snCn+S+f9E9WOr6+cHyNW73k1J ftP0yIQO3AzIr9jAGF4XWVtz9xn3vsp6pjP+6cNBXd/Y/NWz8zTRi1o6hAEid2szNgYXA/zyUy22 doYw6DH5hdF5DrGpy2UdNlctM0ej3y2yKOCPu48gITXW8y2WWs/jf8AMZqyRLZrWXYzDtAg04Y3A AgGphcSujYIqUDkxbIuOsvBhF917A0jLUQLxmXftc1MhCZe3QFR8T0Vtuh4usUNOS6GoSF+Sh/Nh w5uHlNwqGNjAie6s4AEY79taeNZkd8HHK8mMKrq8I84yW6zq5mN/w3f4H9yuOkzpJdi1CMeKqmwW xSURtI4RmwEclVQ58mg+SaNpYwfmufiVvAlRRwOQ4VYAEEvVpNbbEqzyRKo7BrCsKl8CMz5esuDj Yj7QjJDgOhcPhGdNp3aagYSH5494YrTN0M2Sc8pOeBxIMwMMNrxZFu7wi6rQQLD0ZOUO1pTicsZ2 ds6Siszrnk1hS2OOdzf2zbrHo6fwsGTrjX6Y62BYzX61fn/8W3Ct7gpkBElQgW4JQf/cz5ZIv+fy tDInPlDDCyP7XzJqMML3OBsstfDQZzd2dzRePipN9TuUeJCh7gSlMkCKv3/tCHpcxM31Fqf9vdU5 /yP7sB69glckgVPoCdx+GNmGXsVMbGCmqqfSJVDYBHZ8FOA4+JLOgONjMKlAjPHM5wANLAlPgLTC mG2ArAkbTm4qDlgUEatUwrDNEx1TXQyKdO3/HteidcGDFrDX3t89e6Cc0UrM243c471EKB5fo6Qq ocY4Et12/T3WECebS4voNuNZmup85XIpOkQfdmzAvBMVVJAV7uVKxLCtqBciBP3zwlu4016ZsjFe qMoTj6g/x5hvNrOhcbMdNQuVfAvGYTUV4x0CkE/wiMY2aeovNJfOcalntS9Cb2lEbe0b5cpptiRc KWIJtQGEYiXxtdFotcN9S4nelk1QCl7t77tybIhy33+JE1hJW7AZ3Zg8WucxzD5V1zZDChhDsvh+ Aj8XQy4RVh4pNoYIGzG8xIBbAEBgr/O4cgBG+UXSAK6hRn/hGpXOSbk6y0xDbclDwzdn2nCTyTEB +yaboke5Ujh+LY/7AaT3vJ4URZzaUmtaobx9XJv+CqErVwvSUf3XjI+UCzfzg02UR3y0nKz8xkJp OZLwnhCf5d9PsVwBeOWwa56pwq4Ovhf/IcLMDUhddNhfenFd+Unwxfweck2uarAf/HA0IWtsmQ0w 5OmkY3OBTH+L2eyD6LELp5o+H0leOymbPO5PSG1Hieu18CFbYVJtygZQscqwrxFpOMWBBOh6CEFH KQphu2GtoWdq1BAwoYriVbedkOQt1nOvQeCxpF7VEvKSZfl19X3aDUTLoA0gv9s07ESSnnrNmUyg 4pUh3Av5LtRfNbhc/Ur91ojdJx7B5hogKGvHk8AvKUXiieufmhSZ34V1HvKOl9IDtjQ3a8i7j5wA gco73OcPLO4UsWRztW0agwybJCw0jcXnEf/ok/sDWA/6TqjrjlMojOCN3eK9XkFGxU3z2dRoo3JI W2oaE5unGw+hbVkyausCinUJSrZDZUJIkLpK5ULhs8tlNrPEEdl2eLjn3c91q5qKrJ8OjcPHIhT/ Eb8DCMNwRCYXSyHDxcu8hIcmONmYD4FauUREC6kk7ErtT9bnNLm0qC9mHVGLmJ4J7jbzB9A+JqYA jLuZFGPSwo7+zq9bVMmvWzgsde/rlCfF+PLUEY/zFG5jUcTJMon7OiA/t6e12vuKPQ== aoVYQT3F45TsxVnDbw5cYlmc+/FStX9e2g62YDa1oSYr6L7mY/Mekl+xs6cSsv1yMjuMLVi9+ry/ 8HlhNNmGbsZJZGB7tgaYgl0kr3NuEVMuq+8RxClRT8D2Y7wGdD1zP/sdQl1IJfbS25Yc/AkO0Vgy QptpXP2MvqcHjGWIz8k2JMzWGrIrT8AcdYkY6NroRqSUwghysz4UEv6+k40naw/fRAcY8Fo9d+VO ZoiXkSAu64fAnt6vnu/rvARzN8dNMlB9010nWxfy87uWtTCDS4bjYrYg+ujSZzcjGiz7pWbUxJrh pOaT50Vb6v8AF44928DiWyRVaz5yNgy1bPgZWnhV1QYbAPqGNXZIeS2DTd4kfjNjZcsdu+saUGbx U+1ym5hTbwIM2dIXDT4Z7WwAnG23FIA3hJOavq0nT6yJ1djkpS95z42U0PHxHtxtpsTN88MmmKSU TYkAXkvH70v3efwY/YOqTIKdOJEeteZQ6tZuxYXP/aFv9eHccQazXwDHxw5I3dsnnClujG0W9ll3 xTRskwYrbxhTOOESVv5tE/kD/7kqb9JSVqKK1bRtki30oGnhsB0bTQ1lixy24NkSj2hGbDVVWSL7 rUX6apAg4DFW9oRJsXlfk2V4bIGNXmPibdpiv0qvGa7sWFT7E4uBldcfLq51RXZJC8Byq73GJj0F tH7lHRhp63n093RdQFDKJ9M6l7Io+498l3Y7FKSUb1ldYdt6fCFAntm5W9hopu/uCB/WrpS6hf2R 6PJhdRp3Njs630pc+Oj3UyrK+64rm8+QErMxCz9xgJvMxUC0Ui/YgJ/8fImst3gDx2BfISVajiph z0U721IEJPvCG3gi3ciksXlUAECWC+9jN/awM7GcyltAie5qLPRcCLves+TUVbH2fVIDoO3J25uR Y3l0ardLRMC7xlMxhaXDLg5EW12NuRNbq4tCMf5F08y2jxohUhjBfuLSL5jaI8HMGhgCpqAAiXDm +M10F9KALloC0a8WalBhVLNCV1khm1H9ieizAf+sGw87SWfm63jCJx+md1p2Tgq5dzM27p5JUO5P gGQXSjtnAeNK+j5/4Uadm7pvIg9eOTts+qOY6ZELS7r9WAdyUUgUEL+PIL0/IhB/ru+DskCgo5cT 3jhVomK64x1wKhDa1LNt4Ym3oiQiGneTI8olOkiRoNfaiBvzZtqhF+hBfPwWk4XJXv5IvdlfSwE7 QrYI9fSxioAqtkobX2FXHprKEE/k/5izJpD8URa1K8+TQBlzDUHGWO7iR5ZkH+ZpvLFp8gRFh68H dRtPtSne6BkuPIGGx7VwIop4hZ2UsYpjgtRfzt/W8Fyk+XYfXtyOLY0iopNkYaQoW3wa6jH2pjye lZ6GMKMlUfm9HenLzcGTNsmJXIWEewY5FD1Nyx1doma/IUp4FF01CYd4Apr7AEG8ntYu59r8OUAq MPl++4F6Gdi4vSea8FrnAWOzeooiWSVOEgTUx8yu7KpM5lCZ4JPfZnTLg14PVQVHk/tcxdRjzFSQ 6Kmkjse48FMfURxdBcZHjHMkdsImc7JCSY6UxNONbM1/1CVjRnSUgcaFz5Ede1WxryNd+Tks1U1/ 0zqJHl0/DlEBr/IGrxJ6FTdGiTWnEmnwx3jNo0uhE6xLRSATp8xm4+5RxGXPEFmBotZW4xeDlni5 qR9SKLiqkX+o3OObK5qgsHzw6U+tgi0mgZETeIDQQCGR5W8yVT2BAJJZHmnhmunRfBAj83tqcolL AONYg2/4IErUx8JYRJREX92L+OP5uisZ95hYY/xc4MSYLICTpOL+Ic0Baa3t5yadLx5NrhRMwqdU vRpdDJOV3EVhpqhHDYwDzUA59JoF70FdCa+BoWafKQA7qLmcBjmKekoMD2kcMOr54ZAMptmeJO43 6+Ch6UiDD5hJvlnl+Ix5uZUVs5rC++Apclh26ttJNAgKQcY+eX6G4Lw+K30lS90nj0B5I5mUr51m K0C7y7dmBrnqo0YrG2BRx8dDFxgRC5aAzv2NGazXj6kZn5vlVOBZYoJ8BAOkP1mSHJYVqmjbZ5Q8 UtP8Ao6ZbjDoHJIDfExlQJIo215W33oEbWgArrhHOSP7rUUvraNr7zuCMFzbaK5ahRXkIEVwdfv7 6MXuYL/R2mzclBwihpUheR1/c/Fc9+RjyV4fE/jUVldVDhz7euB0k+zVRA63qcZkqqGb9GRy0/zP 2f3u2QGOSo3CEtkporb46ZeYL69mOFjk641NUeaeCtZjyy0tsetxFlW7O+nftj6wpHX2lcxX7jsL /56o0yeFmo88ikd0jy8jXehy90YX1V7AeM37PdpEK1o9DLpW6PIz8TaOTrLnKpXNcq0ayfW4+eF8 SwJXixSssq3Cm40Pv1MSJzyElNhOMa7m6MyuXN3cPLmqQNBmLLxyK5c0remJhDvsbZlVXvMjYp+Z AK3ncmrmo8ArKfGn2o7c61Xre8lYW/j06Z8yl0LlIwC/sC8FgRAZ/+ZvzzkHV+dDVoLWGoxj84mw tbxciTB7JpuLU7L1ld0+7cLyPhRzsZ1LQdtUu5DVMLDi5iNIdfkL5CLsJhf9qarsgT0nwJyL4vxZ SCPRi+S6Jjiu4w7EWTX9ivvzwmIrvC3dQVEbfrnhnilZUSJDEmu7dY5KhtFhzS8iCUyIcbInACDA lV0PP3DoHNh3pH3uulukxRuUxfUdFcqTEdhpT6aSNwZH6CwsFXohjH6TmfXCvAz0gQdeK2kYSdlm KzvQeO0QYWffRaxATxExLW5fBrqCS3YH1KCbgTsGZH5T/etO98wuqewq3292Crx5SkAA36O8ejpY c9z+HLxtQ/0+XSE9OBK6eqjN7acyqpFODnqq/tGQcpTpYwKfUbuIv+dH3AjjtXsVSGM2FTcfhZjT JZK0keFTbHLZnhs53dj2djkns0lRGFpyvLJenxf/ngmsEof4B8xQTrFFqwZMny5PCuZIZ7/E5Mgh YzBrydllGGJvDEz3+YUYQevYOoQ3OT7ZA1siTvqpx+3+TYO65cfn5+g8ow8fGSENRQBhewydQn+T abDZLu5RxzjrMaQroOjEF6MfKp60bZwwshBNYLTfMZ0O0nRfPE72xJAGKXG2/AgQfmHGIwGvU/RO n1wch+EzRUfQlPVjxEFjt4Y2f2tF6PI5xLZv7RDii2P3nrUdLB402hYn+7P8UGJSdU71YzxC7010 rnXoE+E6ndXJv2jTUoZrsesCOhC2bI+MjKdBFqM/HyzQeCjHrodMJxJWOjfR8gw8wwj+4P5cBV5v tWFwRvfVOlIyxwhHdy516tQLGWvPdTOzMpWHmVMJMcRLNJMaLuNcewso9j9BWBfGPFsW8T3eTaFQ m098SF+yBiM9rlR06FAhvsXn8H55Ek/qb3luE0S8xo/TFPBpr50Egfq1he8MbZWOXV3sv6FT3qIx ic8L3E1eoDls4GFw1tSL6w+c6bTMadorhz8KXsV4YyQzrNJueqeujgGOBH5rNJPBuFW6QiLKjJ1s ptdSPsT6WeqNz+uwQcKShyRwK8pK1FjWHIBSNlXVxnkkXFwVyX1Hnh3jEm8BnQI26u3F08Xr9GH+ hjA4zAAfe/S+MGH0TVyklqtcWT4p4a3nKp2rwVZkyD35sY3ltysFqg1l1Ys/ku9h1SsdpxbGHOC5 0Gors2wPs3ROHTy/bAjf0QTHZJmqyMjGeijzgCXb3SPa75Jx46rh3cVWjSrsuhVgJ1Leq6nq7OVB /H0jet18t4vSONKUtqcf2tC3F/VgTR8U7Cxl8rXOUJ/2Y3SSShqSEvZTfK/fMFeHuaSf17mQtyII ikxbE2mn8/ppcXoPno5h/H3l0cy3WuiMsbrIP18QpiraTNbDRiXPh06+qnzXCXKwcQeJTdmFm9it wFKHjVWvcrFuWPvnZD52Mry3vWQxrlL8d0SMWlQwN+NikiMlNYwwXxVUNANZq+rJRFHhrlVAh1ZC 7IF//ygbIQqiI2BiuXciMCN8eq7WgConkc3zdlQu+lHuWPIIbkqwsoXD+zT5vK7uT3S32I+ho972 +CJPLh39zdp8A5RWUgKFnwHLObaIIsvSknnDPsM4Z5xyn/lrWwc9mOh3wLXYjY1d9mUukPtZIKCN m+Cm01UUBbl0jCsVO8ZhYeRhbeHOZPM5UnP8kjlAW6TIh1Lt6oSv2deFRKq1xEf/KQUG+Pc7tlj3 USub4lkdLwJNvYzYtT6FfEsanBbGoVa3BjmuHFoBBgFTCRp4WNJ1dwJRfMtb1N1rEpRi76aRQMBP zRTvjr+XdlRPAhRjNgiSYcN7kANhs8Jks1KD4MuMQhsBsMlJO7g81pQVh7g/Rq6DwyPF9qNDzvZ1 qAXDrF8Ys3CDfiDn9GDmxTE4P/H3j3TJz829kSVbQi3s5jaVyZn6XercJrvrTw1wtNVuPh2ey1ll +o6XP8xomfNrGUfZkwSpU7kQ68tx2kwGks1hMSdgIR6VEqwFVCkQyczk22QiCQNAEqNIYXQZHpRp 7SnX3gY4jBHF5KLSQgPwPxbpefh+p9prbUEffWZIOS1rG+bT3eRdGAQGUwGCA0Bg6n7kI/aze8P+ jjqX85pfH4EE1q542GYVJBO9XGqma0hP7gkqqBigKVfgxXEYUfat16Fl/B2TbOhEytqDTYZy+hdL 6IF6lZPN/GTtak6tDpYcH9U3VsLOq9L4a6vC/FwNoPZJnsLCM7Rq/dN5iPtB83V+vL1e9VX7ehud V8968eutyEwkuMZokQrrm8zcOutMV2KDZIMrj85HJdqV7vajPKNzAi1EpAnGNPNWTQ2IJjfynVWE Ec4MxZ9K5oZd2IXfs//SjJVJeGxAO1kqnisUWxlxPN5nGLYN+NvDngizodXk+Uu6WZLwzRyzjZi1 bCB2jK6q8auV82m0VDqFTvLnFRHlpZClkUUdeURUHoOeTQwr+NquV/nQT0Jxnj2UkBDXXjax1JRn bZRoZ/r/JwYYqIfXeBs/QsFpUQLAcy1xJeOw51LzMUq6h2uLup1GqldVl1icQAdq687m7XZ5pSTu bJ8qgg9/n7QTN2Jzt6v82FD1duksRiCHynhNiQr4yhyASOWiSqMZAR6G242HXekUuoujGVSejX6L H3xjyuO3RS64TEyxpmdGJeIcscA3jtJ/y16yLZQZPT380iSb+aMGa7tWmzo26i3iXXMbRFCHNHHA TFf+eaTlvTOy8LkAEd2yTf9lLI2TusSwG4ll7WYfraL5MAg6D/8evWiOHZWcdyMuxIblVtaum6pd Cz7v4OLzaxcjvL6vdnHHM1FjCz5khtxP5SZtDIiDB6joFgczRYbgpf7cZMzkiGspNE4S/Njj5rWD ZdWWfVBbaqRsOuEAGRoQw2JadYOjij1vsZHARq16i5MZkYbDhVqMEOxzgPbiEFP1FWfJCaNjSeAq iz1vscLGNWdGdCDFU0gpRTRl2sRS/fKQFrFBtjiuvYj9qXldFMbcfDP7sPJo7ww+vA== CbA3Zp/Jq25ChFpz2Ti+s+knhW1TX7F/UnCv2pMvIuFDFkiPaBtn23aWfTQDVj7LxcVmdxbJW69y xTZ1CnPP/oXEoA/7lXlS8O+X0IketIWU8nNBD3ALB7oM4c7i3Z5HWPHn4j49zw1n6JwBOA08+oa4 cVGfGyDPejOVbh+7UG2uXa5z1Ary/h1LVZ7ruW5CUqw48gEziYlRiaE50V+cmQlKPkwdP1U2oGLK zfS6RYtdUvB0C8+c0exed8E+TyB9S/ZouVEvNXwW4ZHtA0N7793MvdeFqtugnzJj/xruvL7mzKFk A41tCEJOyLsQK3FLpsCdIea5Eq827gRIA38Lr/eKMowxOF4Lqj38U7QPtnPpIG6JP5lZS9P2s8Gi lW9dvJoJL4aGpvCrgtODrkIj4FUS8PqSewRuWxVvTFevUDvUjANqC2SnbbbQPayphLuFNpJarMKn z2tgROYn3oBIuYzJuGWBC76Fan89gY1xu8wtFbmTgw6D40k0BzBuuHtEG+Ehyf/Lz+ViEk2e3nqP RzbXenUZpnipQ4TxEQ1SNvWaBMJDIOV6tXx8HmCtXANQ4XUk3qAO8CjUUuJe6kuYgVo9udpPRmqc wlR24IlwHEakp5/oYuP3RsDpcyv+UtegqrXVtWYfpf3lNAv63ri9z8k8/KYGsflC2NpEtrKPAuVH C+IU8V0naNL21kXxzMShnKIiZP7+eUTwVUVsfR4esP1WwzzPJYiqmoepzKtdj8/0VG3vqR576tWp VibPwlMFM7+mUO9WN3BYuxz81qiM2o6S/l1y3HZpa4pZpEf/YBOtF3flQe8hFtBDmXrWcXO5Hytl q6C02Fp8mlZQFavU61rk+XpSkZ2m1FCNVl0OkDUil/7AAIiGm3yq0yVd1q50yUmlw0Romc5952eM UOoYBbeKqPn3Q1C7jP3PVI295sG/lOK/dYnPFjakqZf8HAGiVM96ShFGtqU4zzlX75kfera47GKS 5veA3tK8Hhorh2Uw2EhIbEYGni0qTz/558jFNfZQmJFkey1f4qe65Nw5AKdVif46YpHpqd12stx5 l3zPodCrt8T5ofHysIVDAZYnjKTqq1lQeu3JImOv7Ciza/vDjFWXbemTkdSfmZH2888LTdg2LKv0 FQBP/ymJ9g5aKpuYJOlu5twISqB5n9KE+KwMup7SCX6zXx/IB9i1XTVc5APsWlacG4N0H/Ww7Uz5 IzMTzNSIm/IB8HU31M7M9vp42RWyNIEuERg1Fb5ejqAPlW12dmW2DeszMvMAN0ulPrcZ2RFiWYCB Qem3teTPMDMolnqlLpz9PdvVVcV2I1onqsqfPixUARuPp9f6vnCWO/rjzEjdrBqRZAywBOoUEsCM Z7DYDPjfUwweQOPpm3eQjbiNuBwzJhYBYOLnKWoNauH3+ABPERdoCzzZB8xM4TRwdbzWr3rJGqqq ZkOdzP8csayZX8E0lqyHSx8wMzsnPffnqWr8alFtNGNTs71tBEg0uBn5YPwcBhDKItI3Zsu2ShUW /NJGhVoU981I+YVGBkgzjqBJ9KanlgPUzm0PdIJu1K4VmWuzlSecgtDH5fxLIzOAhB39ttBv2unU xiOINd+DGosPoIAC4Mn7auGeuVmIbjMTU9LJEmhGBtNdX+3TyPRtEyMS+XXEEApr1/Z4XF2wnhH9 aGHkVjASR2rmqXsAeM6MUA+w34rI338Jzk7Prngz86DsCfzwIVCKbqTdi4eg/tqDl5uthi1TdjYA E7qN2ZqXCy5YIDWNzUb6jJ4sQa+3JdGyHrjpMCIBY4QUD1byUs6xpw9jZvY19mhECiMRZh0cAH4h vMsW5Cj8+/5wIbqCUTyYraRIA0rheY52uc7siRkZ5PdMsT5V6gHOUQH2o1eAGU2tMeyaGAGl3d5Z YbMLC2Y7kj7WzMQpd2ISn5qysJ3KpW5EqaInJNrMVK3u7JMxI72wTi5UNw5OS3VkMy88ArTqm4mY 0x70dvh9QKuG677wr9n7M4iEfWq7eEL0AJq6F0e0n8UATYFgR6rIbMxV9SC1CGMbs1+fbPx96tm8 /r4+MYEhN7aTuvupUy1cIwXJzczC0iBNiBnZ5DKCIxmjHkpTTaIEzbyS2uVsXssK4yB3iBv1CFRH c7P07FBzMyOJogbV7MzIAGNmF4aZydExA5f0ATOf+Mpk0xPN2DvWHS8krxbEyPyXFul5IOkez5rk TyNfYb90CkE+6ddO0U/BMTQjTrSVSAR7tUk4hpKCL4wiibM0pviVgllbhXTDlgcYH7JqhGgw9u/l 8G5RbfLfwq4JqMIf+DiJK93McthGQCqOybKp7S4NPTMrywdm5kJeIPMzmyfjYlYPNsgtWbqVbQG+ aU0J6QUexDa4FI9r+P2l1KgJfWknJMJ7ybl/lqqIi7Bv+x1QOd6iknZt6XwvOn2nun03q21+GDz7 foMxwJD64o7EG06IQ8lBoBLi2CBdmGTj/OBJEjCEIk8XFHLpFT5NKucrGxD8TE4yvN559C2tInCZ +HkYuig2A+Ylw4fSnUWtJRw+rjf0RptzufUZuHDEVz9ys7/pdloXaeDcCFcB/WLhyW4FupvsuOYK ryoyvA73dt0LXm+h3K8cyV0b9dIGDZpN/yl4kSsb2v3HpiTnsMmXpQM1F4cZpay5qfLjnv/gd+Bv 7IPmSuk17P1liuFpUq3EjOzmmll3tShjajuBaqpfC2zG4EFfpGDiFGIK0+zvqfgFnXkzvjzVuFn8 O9p4XFn12frbnjJmB7HIsE8KTxrSeh4LVX7wfqpwgAexyGKmxAco5HjkyW8zQCFgZ9utj4vPe3sf zwciv9xLwaTu8Sj8gclqhhnpW69sJjAzawkrIFFhzHn1SMT7ldpfRMtt4fcZufMjUK6qnC+mws1I OOSK3DMHYGJmsUnLjYP0lYBZeZoAyR7spX8gqdCQSF4EpphxFBLs6cFIWszpLOjdm/nwJcTZ56Y6 eLOFuR7Ky604C/jnTZx73rDxgWQLG+EnaRavzNRWHvdsaVrexIPHatgHZq9Af8DMDflIz/EshW5b zTkvozPQ79CoZirYroWfsDOhmzCxrUaLs671LWbTo4be3IvMyMYnu5so0599qdY7ZoM3Roqwpbra EoZliefxLCF1Vxy4nABDJNuKAg165sXCqspmKo7iVpl1JOZ+K3E7hCrZEsKwrCd4D/YFZLJ07BT7 I3qBLXF75ChAWuI0hRzXQe8J4cKzwx3HD5hJ+rfUl24Z6UKlF/cikedupDHNAvOpFBzzL2HyWlSg LgVGH6DAtVxCcJwqkt8pyPwBvQ+OPzzv5yYhVYew5epFS8kWxFPUJLHpXnsJISSD7L4We6dPthjv nO2jLMgWT7NVnaUYvE5WYomkXFGZ/MCwfhCF2WJtVmIhXe+OFEAFR0rCK1XutuCv20NSVmLJA7il gm0F+UpCX6Dut/de0qZv3C4t/ETJfr3FlC2S370pCUOPNQvBVQ6XyrB98fieLDatoNKIG+2Ci6zr VJIi4Lo2ZLIE708fnQpb61rfLevAZVMkncRY9ktl6ABVXWpdgrG6dqpjVGelGzuPlNYSbeJIwrAC smQ1OLof+Lx3EjmsG/AzRbcFIVLW+8ZOR1yV7CER2wGqbavOHkqLXlCRKejaStnVeXkGetnfKD7/ M6Ik9vRAPu4XzfnG4lwy2+AXjhfmRoSv63KCzFw4M/pxNQtUHk98+/N/vOb1/Pm/ttsziTj4syOK Rb9gJopj6HQzkPtsSjnEB726+GBGpjXd/JAKlT11y1SaVv+8sa5bV/mToB3zE4uEWo5VFgUyurHW Up31ih8cQo2c9Yo7+OD9Ply8ZOJzUC8FpgkQtQE60wvJ/mXzQrgymPD1G0NVfTDa8Z8qTAS0lbDk Lw8cCuCrX5HYQx3z1cUwvXRAWWeC3GcyeK1kWF13402XKsoSHnN1arX0JbVaa2yYdCtFXeNdFIzZ yOzrl3JJUcr67QZs+Rcss64izoyAl3c3gMydKefo+TQaCdxO1qD5uZnjy7gfubYNGrg5kN9vqExX iv+ZeRCGuOGfKHgJDOPAcu3S4QxsIq4dvBC1tJlqrlX72Qw/jH/NIvxU27HNVIc1u3jep0/F+6q4 EiTQvC9Kc095jvuJsCGM0IIyDV9Q0czsybZL5f77PkEoqfejxEeLhmCbgp77xqp4nxcm7ABoaoB5 Ke0XzNxad4peqvHIgxvC2EnpsT43ZaRcuBo4jko6K1pMwng5TuKcMrO+I3VLHrWHLsHNzSh/rqjX cKvR+foOzelcbzfw2h7ur5h/D9GKy8Va0BOISbHzaiuHip4ADtAOXRm2Q2zhYXZgJHCng35bMl7b GwD0aKuvMallNikW3l/g9W1b2aaQd9urL79gztBf/Kqm0NCwRBCjuohP57pJxvqe2ckZDWv4MSUv eDBZvaDyrPCQPgZIBs+ZrJKVfSnX2e/l8o3XO9V/QSRDLhuSkJaHUQ/jtl4v/4kdkg5rH7iz9Iy9 ZK9YAqJpXvMnTziAk++P9mdub54Xqzh0PM75BTPd+Rnz/ICZPvYMsc0wMt5FD7sZZ7TXh9EyazHp SW4GZ0eXtBWOMm5llqepLJcsMQP3zB3Oq/W+Z/ZwJiX/ENva9IMzbGTEmle7sj0qReYkyvLZPNyg gaMwI/o9ZsRvf2AAxmRTrAKe+WfYwN59mzfiLEM7610O9d6vZA4dYmJaov+2ckBn4ikbJW2OlboI 2QhuPyexAhJl+xtlfkTf1FDxcWV9xW8YIf+WB+bXHpYMyOI7RaBycnOzeU0mdsUUmw9hM/HmOmib Iqj9XjAztK07GviwihZ3N1EOL2lj7KhD/MSSZV/W9WNLTMhbIU3cOKMn8WH7uDo3dhXTqQ4YRqAR Cb2/m6UetKmGV98iOMBBtypT6ngJbFDxrAIPHkfXkemUNzHZed2TJHuKgLyLisgnwFjLNe614cET H+VKC4pPMPuZLG2x9fdHviK9SpvA4mmIZhi3KQaX+LvpBlXlfQBbdmnMh4cRyGpcIYpfzdHB5XNl gcYbpz9gbgrCB3D5xsq6KAxI2TJXrqLYkZK7ThyKCOFEX0gYmUY/Oqap1xaL62YeVYmpkIPyuWR7 PR6lmYlNVHt09aRTQCpfk3LUh0viznoV2tTS5NSnfDX8akbSsk32LPtXyd24JrMuD/8h9gJ7FFgD I9Ki/xbXMjmSyhauY0NlC89AfXvSwLG7BIl7rKhfNGvkpIUZatkdogtwFp9F5AQZobKC2KP+5zc3 1ZPjoVMhzRIzgD21dJuY0UckOzgASVlNfnYlQRHlF5yy/Qf4s1icziTPbIIh9bggriXvf7+p6Ui8 NC75eeNnw/bXFWc4XRjFQMjktwbv1LGnsTasO1qVeHSZjyM4SGcV242PIANJa2sbMa5EOsVMSKSP VHW1nidiX1LKfByFKZBr+eEUh+QJH2ogsCsVi9RkiT2iQ4R6E9kMx2b81AMKEHOYyg== a1YaWZdFbKj7+mx+M1rk+2//H157G8v45sceYBSm2nz8hpmFpaSqNPlYpYq/96QgfospKTMuRouM AN24YVSTqPFP4pMZOn+G9Lq7tzP8CF5OcHaM6IKKP8/iMt4tuWTT6yt6M0uFnnHviFO+RQ/IpsyV Gw2PVuM9xTsf8oXMCCGTkQUk57mdj5xU8IOOKLTGAEXcxKydjKvvffQraeNAevL3ktE6NXiMzhkV nKEO9UsKeFyKtWbujFtSVWxkam2K+Wkkm/8UmdJoihnmX0RaNJJ2fkYoiXl1Dkr6QefvppMp6tcm VhTkdHGvoTrZVaF24+b8RVw1mjLsU5RHZjxMj1CH1+WYOaekdbS3gGYpy98M8tTWzI+QS9oSigx5 qi3LGGAIX7aSCnVcenUPEhkjdXpm8h0Ze24hrkZS10M4i6mO6eT0tVfFNtWxBM2dFx3fWDrXVPR0 tezKQia75o0tuTBy3DbUH/yaoNKwKbs4snVkqytrLH3MOwqhnNdVroJKtZQvzc0mrfES/mRHFM2/ J99y6qrZl4+s9RaPlKmNP5xVlhOGKD7MYYEiWLL3dgiYYQaTLm6f2qVWtKKGN4k26mQQ7is5gbdg 7ygYcgZXrNPFVJ6U0Yh2aCbj21YYZjcxWXUkFZ8ZkSHfNxf2lnLLDtofjss2oiyxXmymO2IBnOJb un9coPO5iiXMtM4iktzs4jWOVpS5982s9iieTo/WqFtRPt+SUDN60Mpik8d2HOAET5UNQA7JpN49 SQ5nLQEPnOdsMZ9VpdcT6RlyNSIlNoo4zSeEDGIIumggr3CjJ2r+oC8ESWgjO6DbBJ0DixDw4dm8 pGf/6cmgW8DMeAK7UbaYvcnzuURsBV90plspzlKGfT7sV7EB6CA+zEOZiqxCmPkQ/OfBjMiHERuO iyi3ElX5SYbXzIvzn6pQ5CO0GAcdauZOPlRMF6NTi8640OxV672RaDaKEbN9dNbLyG4mM0qe9pG+ h7nfQV/u15584albiz3NLsVWfSRfbStDQuzJzWHXoux3AtEB4+G1VL01dlHgJc4laeADsLAvUtt+ GekmmvEwNPPEbgzQtaVs6XvYbaFrZ0tCfKa0xr4yzmZWpkM8yuYyEH9Gtt+qolaoy+qNI3m57wdb AyK4iQfCM8RNKVSqQqbum9i6BSHZFkyNg5K9ZiWNWdVesJJlMTWVVmD99LSR3J6q8RgTq3JYm1S5 WQJcF3tNkrEyi0a2zZa1I2A+XkZ2SU2RfkwpKpvjp7TQTHzIkGiAMWNKkVHb5Ft4yrj1iAkJfxdx q7FsETvrpQ5xoala9kgrwgapX/CgTui2WDFnfdH4TAUSyWjIqNeUBvbIFqNeqehDTropTdrMfjq9 JTVp6b+tooaxTJAZ/Z58j6uYWS4BXPbnOYfk+QRaMFJC+JT70rRd1rpGhAdW/hKhiDtEGNLkdAYW ftK0ripZCRSAokbbJFGaxBWrKQexk5exC5y2Az+tmucSepV0X/36zgkLWsbSQZco60JdCZ8VWbcP mNOdQIuGjUCi6ave1C4/x1Pof+DGtqo4xHOsppW7FJusfqUTMz6yh/Ao2SwdzwXltDCDHN2MiHmm uOlXU/CHCjzHJQw745CXkXK5Uxws9m4WIe/XSmhKXi59fk6wyTsrIKpeVeCqdVGFmHkRBUxNxk8D iGAye2LWlfkyYsFCN5RaJkYsWIVYRorLiDubINvyeJ2ZkFgTlk8XdCNjF12Vo3LZzuhc4AAdiZB5 c3weCeNSF8c+Jw1w3cKjSHlKjWDdiGXmRoxzcWfUoVt4rsIUG1CNZbNqy66iDs1ncBVEi0rj1/PK vtgpR289V633oiZ8rtiVrdy2IwGalfHYKkrgziAx5AzaVnKFi65cr5yMmmZcjHP9c+WeyPaqrN3Y Rnn4wClAaT+1svbUk2qUmK0RaDnu9plN4foyI9QDPhlZaYPkMMdlenyolmAMpmpt2eIPZTVkRFKI f58ld0loHAFDZ5J9v51uV7V2F7V9Pu5s/KI1mbwbidtSvvWySawqH/qXS7v+/NGQk0xqySCQSrFv kzIUx7/6O/tPJhwM0YKR821dMrQjNYYtFcw8Kgn7TLl4sDVPD9OsnUkwQPNdfbmopSow3O+/DxfC RlAy2jIqnBdd36F8hE+hsycJb7k1qdCMi8CydQFtxwVje/s1gIZaNkdD/vwXzE0a7qSVbU3+yg6k lhnrBQFO9oxmPu2AB84ItTUVV/Z9H4Tin4umtYGFwM1Mgtmog64JBdRaVT/DZo07zNQx3YHSiB8b wmZscK28P4Ofejjs4DSGoz71cAiYPeE1fdAMvOu5Egs2SGNFyTflj+/HxhvpCgvJP/SL5iWWHDiL zlZBVuMDPBtpIXcI9hA3RuGwLVmbMF4Ca5VanF8mABiidd8MahC4s+QwxKtDE8qP0XY5hQYrpBUx I2H7JcoK346L52+VMGiNtkCi+KPwIJ60FqSvtRyC2DZI4eEriqwYl3Yb2Fb9rjuzpsZcIxFY5ptS 4uZman+f2IdmTIQjOKU441RZoOy2Sw+SkpDiD1Y+bBQ0mFL9sHGr6AePypLszX3ueil4gF1pgZXs 94lxuSH0iGBf+M2+6JV6voAJers6hJSHd0Wk9fMYfBxdHCxPRM6/YGbIDYEkieRVch4l9fn7IDk6 4V8lvsN/YfTfmL8Mkg8G1JBW6bW4mQ8GvccDqrR8BAh2xxPH/8f3g3DuRR/ZDiwmFwqTkzuCAZa1 6V5vNuF4Wfvhzoui9tuo/JKm6mYlMP6/kGMFF7Z9ugbaYvaasIfn1kycanMrF2nr+9i8x0b8vqWB DEDyC2Zg4m0NLdSaGpFSI/WdTFQyqkTjpiz/3QCQuBpJ5f4+Az4PawgQRs9AD3we7FrMpomx9FBX aokuMZqu8FOZtKYK7iLRqw262FREUr73CfyLM5sC7V8zI9OouvO+KT0onV5UKQK9jo9KJAqzuL+f 2hGh1Yqz5BfMJI1F48CHrmb+SFvWEfmQQNlWpz3sx8iGhnHU/WEwxsHyLfXWEjBpxsq+NcduqqZ7 CMrWHR81HE0l694LvRpAJVWG6/5jKq6hgWUkEHVGoMABCCGfqSN5RH+01Kjx/mgTIDHFR+67PQES JdlFCQMYrMA63SbSQYOg3HaugH0O5XNSuGBQjLed1MEadDE+sfNPw+YtmCWSMMhd3LIf7f0OeGtv I/+CmWSkR30oU9KTl5qAq4mRIbVKQMSu3WTcVF1hMO94Ma9+d2/8CAGvshT6c22X4HIazyU6ZWUx pMafaKP/+H4Q7ItzXfyE+YnPxWyeswsGpmomMeqhg2ZpTUl51J5SUKDacsbbhxI82EGNnBB4qPff /0NvpD1M2FSB7O0xDaErjp69QKJtdgqpsddgXjg+u3YJYwl3y1/zESQIJay3CXCt7Nv75Vl85UpT P2Qa1G+QppJh8su4qdl+qbndopuF6mZb2drkY3ybwAVgKkTC10dfZ+4nTfWuISaweUu0fRmBi6QT lmSLynbuXzADVDnEJG5KeZ3nocSXOhFMVprZT363PKxPRGhxLeCqI5VWbTdodOpWvT58fJ52Ji8m 9U/3jcfBZ1MT+HwD+d1/GZirDCwnLq4+uPtMVb5YRba9J7I5bixdM4O21UiNHx+10gh53e9u7Z+R feo6vhOOZkkpdfVK9+AR+mPxQfw+rcb2IPV2u3GzDq2U6dsEfmrP4D0jguCegQQn3SYKqHHrKVHj jCU8Yg91b6pKQC3au8dzKXzMzbbWIZ3wKZleB0lWlljQHucoyyc3oy/TvZqUKjlQvbjAPp5UFEyB e7s6inumX6LKsau1cFMMkhrvLVsS40Ad8P3X+KLFcubCKHrRv/k9o61xP8uvHlSSSBEVAr/fx+UP Jksm0L+/YC4ELrAiei53kSzrlvsTzckQb6WlD0XP0MFV/J7X/Pb3ObFkYStRLf4Fc0MFFcXpD169 SPSa2K/3Qfi6N+kHPh113mOjx6S4w7pJpIwjqsVQhSBDvMNOPr4f+0O3BI7zAZZRtiQCTWeRW2GL HUAmtqYfvljoWY8n21vtgdQHV7ZUrJix6t1MCSw183mE3qXPAxDAE67Xz+/nips4Se8HoYlfMKfm DI9N4+7sJBOn1sppqhmW8J/9B80s2Qb1T3fhMjN4si72SrWX1GczqtJHuixWOI6u6mRWLSoz+BDM ZpBW1Ypg1JNOheDTJBxsOZmgwDUK1eSWBuLpVDUkligh/8QEiIoscdiHkR1eQH7EqKyIlKvbx8wp ugvBxlNVlyqRQfkRfLODYuGZYbPuetHSi/gACiuxL6FyYHzmwVjt1PwXdTmqc+1Q4+w8l+JNzUHR 2OAE+Cc77qecXGaUjngH3SnnDQzJOT+SrjsCn9AD/ZCZLPyFD/FhJsg/4UbW3lW4f6bIqD2Yhzpx LKeeSpx624pWbBXF6mx3LteujY5739w7iWxxtLuI1OCnkJuCtx3+xGcD/Wk8hA9+Y4qNDGItq4QX CnBFRw2vdrv8xHo8/JhBF6VDD+hpHgI/gglXZwh51k8nys8moNPTWG8lweelnA+aNx8jkdZn0mNw Dz/wYUdE4e0ko5GZhzjQvewDo9QjxGAxmVnwGczkZ0EhDpEHKVtf8QGm22oXw0thNEN6u6SSNfmK UZK2leRDheANuxZJqHao+ej8LlUi3Oz1doYXUciPyK+akZnQQo/ApxV368590wQo8FOoXeZ/Ly11 L8PBiE//Eh1w4txDMaBJ1tMibEAJLqowphoD66ZuJYU9uyac4veQEfmJaodzFxdSuHsfHAdgZzz8 MBLPpD49U+UHDtIOUadAQhh3cOWedtSrfBKH/wQrCpln5iZBOBQKTkq4SrnorEjox2zVR2HmSllq r75xgTP5XQRsP0AkxBDkF0+qpnIp49kXkm9ns3HkDAFnnzgpwwisn6vsVH6lPFse9yx/4u9Zf9aL MGMqApHXwea1qOQ7xa3dFRbciW3bqxo1dohZsp1qFh7biMXenQF4b+9n4S/ul9JkY5bLjjJJBbHP 49RL0m2v3G/blKocyvg+aL1/6zeH8T/jk0IjETM2v/7mDjL1rVewhBqZs9RFQW/xPiofRKHqtO0W Bf688c1P7q/sNznQS7m3KxfzCLI3z7Mk3TzoT3xvrMk3XwK2dCW/jJhG6g4jPQW0aLk4UCqnfJ4s fT7JlPh5ghjPrOGKX6KZ5+Hq84Bp0fibY/13d3EkDomOkfOQftt+jIRIX+f1U/PlrnWu2pHNDZxj J3xQuRFq5/QN/eP7Qfg0GtUgO/R4ftGBRc/9CTUaOIpEZqGByoiVKuFaU9jU47TcgHYx5jqporXB 1vjNz//UvPA1D2yfmtc5KAxdO3BTBqPGzv/x/SAf+G6M4qRiB/Lo7RfNKsmIg3xeInhkDS7ZP/1c LM0lc1IPE3Y+6qKgCAD938wgP+lxhg6pxak15hX8mOvkXEvJuAbauco8on0ha1Ydvg== S+GdD8s9AXlyl7oiPXxjdcOslvuhmWS8RdzDRnM3tWsOOABNUuklemBjEv2qj5JZ0tjgp4Qlo4Th zPHKZydjpvGmL3qYnsgiKd85vAvJq/nVu3BjOiCqH5ebDDJxs0k+Clk0EEY+9PQdJBnDHjFsoz82 rqWURmHbhxmvoir52JwwUiJBhfSW85IuQl3AjEQ5lZtxcorWXlGYDxCxsx21G6thvv7s4bk+z7VO N105x3qJMFL6zV6VoZkSZSeGwzOXhDaZjY0dUX6X+9R8bXjFtk73IZmj52fjvCeL4LwUUdWMZ2YS exSm8Zy3EY17D0sQ335XmO1DTRZU9mzlsa3poXrcN99fAjOmQmqni/9F86C4oHI4bl7U9EQY4Ub0 +zxBD/btuPmD8Pjt/li6MSJVFikNsQeNWruaKF+DrvCb/f30SO6di8V/UMF9K5wzKUdLlra+mRy2 1qcKxFcCEcRZd8m/Yqt62lUDOAHKdaJ5AF2ehDr5XQPT8lARzwcoFN2EkFqwz1JpRzl5H+AQ/AbU pf/YpPoP+i2cK7/zS6wEo31zYzxMjpgvS/RZ/IIZ+SKGO9w9yKVREtf0zSA5+pdhODqJt+7XbWbh L4ID023oGS1B5B5Ginh8inC+mXS81nLBEpzU6xfMbKBWosvoex8lxRoIcZ/nFmw3UeGf34+bP8jG 4gsy42Y53YNC6N8OE+aZ6uRgSn8ZIa7oebg4Ft5/7qee/5cHzXmwSUXCrG7UgYNA0H+uS+B85X1/ dx/fvdZ/RtCFVjBLdy60QpxJdNN4bidwxt+GeREnY2MEAN2zozszHp+H5k9uyrYZ4iVdsC28yCPd +yPqpPFk1mSrZIYeqZ8cIOj3RyoF249F6W/oNPhmBnwpJZDqr//QAiTzC2akmkZTDdRoYUMCZ7Qk Ui5MKlnL705eWrTWjUqqdlcsQlPXJVsFr8SNV3bzkPtgQPAGA0SmykZFXCs5sFF5Z5zrgPnSFgLV 1KiZ1DqRv40JkFnXnljWAxVvb0bmI7Vyf/dyDmOpkfusPZcQHxnX8WvxLfvapHhpPmlFt1plo4Rn boI+dbi8kmwe1A7Q1vMd8A56YN7xvrFketS8v10EjB1E+jtQK//FW6vu5RkG7rnUnCqMC6SC/sA2 jckiq/K0TQ1SnIeJdrs03/iXCXDdNhW4VzQy/6JfLIgRD14TKRIZL3UPSr9IqZ+mbbup8X0lGt4d nCViVSoKtYsA0PMo304sZ6xWmr0Ui/zm1+jdLHZVhi6UmHcDe/910OvhiLTd66X8tQSBjYw6yCdy 0at/cxMwT1KegsAujOTmGSli9WUGP+XUPOkYl0qnRilVC10gY/FUJqZ7Ya7YVX2U+HO2ZPoUZAi6 TpEqefWMkt5nQNrS51J69ODzF8zpaorSyM2SeUfrrOswTOKTwUb6Nip/rl+0z5b8+EVrIzUw5ZFq v7l6o6HEjUs4cvItfrk20iQxqsi1IrH0PoE/cmKfB46ZDYnCb7b7hHIH+agZj9Qk/tpX6GHmzHBU 9EeGqIhoAp6RmiDsnNih54s5NNIoodnu2wfxz3/6uz/9F//6v93/y3/z13/8N//hP/2f/9v/+A// 8T/+03/4axj/zT/9r//7Xz+Z/8u/++tf/+HXP/3jn93655f5z/W/+lP5879+/e/f/ec//afX/3v+ XPz//t3/9fqX/+71D//Hy/Sf/9z//N//+d//z+XP/2hX/k8+c99Ih9UTYru0W4nQEdaPz9a+khsG oidvFv3lX1+/8z/8yZOXr4/lz/YPdssWvW7rS9A0/wE/sov4ywjHs58ebLdlF42rw5DCgXnGa5I7 sVv+yvjE2W5RM8e9xZb79vs4WOpWpfQEZP0XzWrDSHX3aj7RYfOBHdYf3w/CLhErnpLgzWuBv2Bu 4xBeCxBYTRWlI+byannSggGS1K8ehu82j8HeiGqlu4mm8MZGiupJI1jZBdacOgDZwA1KivfpsqHj Ea3ejkDgF8yrNfZPI13ejHqRPaAeFcSV1ATbF47MzINvRZ0xZhQNPRxPMy4SZlJLyayzcpMiYUl7 LtA3m9be7yBv7fPAvLPWuMeQ+ua63aWE8m8n9tnKBZECO9DS+QVzEy+Fawp+wNx7o7YFu26qOrYX O9daVS/QCl3s7AV68B3rJVtpnxQWbA59n1e28qAc6Y33z9aEcx9P6KY3NXFstnLaLIooUIE9fh/3 p55Q34LsL4ZFv//B13ajPTuKB27s+DrI1mV3uNiynXwvdm0hX8tuesRTTCWTK+htYjljHu6RBOeE X64djw20iNsq1AlByWC78jDtLxZIW0Gbxycx0La0l1QXaPz6+z+1+cwzAeHzI5GbD5q8DfUoOKVt CJ2sGkmR4FsV+S9Ij9UskUdmD0Aj3n8t+/USguVhFxv2XHQhluEc7Pkb4t4k57UZJ5fKeNi0aw17 lZ+YF5PYsMeofzOr7nMQbwxr9e8Tyxl/+UHOGD0pXi1hSdeuPnIFAH9p/eIC8C6v39yIPrJBPZJx 5tIS6pEa93W8tzrgnkWqF+8y/fh+EO4582KidAreGN0YoNjpbliuD1z8cohAGOAV04/vx8jBT2ef tjce/oJZkkBQbi1tSYRyhSuKv98ULUkS+WZ0DWr/blGsas49r1Z1DpqNEVuIoOYt7oTthbCkD/pQ s4u0pu83wJey9B+wZn7BvLvIQJAraeviAYBa0N+Y2mpcdqCUbFk+sDgr0MXvE+DMrN8gaTF31Qsd XVsk91nD8cq3hqvRRvQQxjcyialrQ83EO0DDHzQ/Q2YN8Yq7yHkEOuj3ieWM5+CG6hjlX3/7B628 yY8H3aqml9bI1xWJdjeqMXZO8Bv5peTRIDdOc1rO+Tbol3nlhHOz93QBJ0zSHAn/+V2XPJp2/d2j 4LVknNGp4KNiamTSeZ/B1VwL7aHzl2s3ZXXuRMIMGxzy/EfI8OZqoNjnVT6KVumD3YOgMLv2HBIH gdH86+//oSfWHpaXfd/Vptm6KImyq5pL+2QXuEUW/DWi3ezKwp07aQHff+0jX9zpZDCa17fxdj2u 7geu8XPYrfk+yIf2hHrop3nignsC40ZC5e3jlwSdXrR95mQMSvSNbxQKWELvzscshRQv53BLefaR kRBOMw9KV63ZuX0UfaGjak/6cgM/tY9THWMHETv38YF3Yh/Ywo75Gu7r52UQpE71LLVNmPkhecy1 5fLx7vBlv50AZ3ZujSK1OznWVHgEgIDa+RT6YXM+6mHZQZ73EwOsRWWt+9pFTnAnX6NRH22+treJ 5Sp5BumzHSDCZ8lqU/LBtSlWlh3HD4y6t111KBrhB73rPRfXVJIhQxvyb6wTtr27sANXRKFy2jm0 fbkBvgtjRJcaqp1Yv2gGBYxyRWZMfUoS+LUd1MphFKOcmU+mhXC0W4qJBGPsR3ufQS7gsVMGquVD TzeanGxmXPKYgZcz40zmR8VQVnhZ+EF2b7ixsN0YSMD3GfyLU3u9Q54blV/BauQiJHHi75fDyw3k Z8QvYF4Ehcyo/I2Pc/AxTHJ5zCtynUXT+v7WuhPzsQ5R1AVfyDLrpZ/ObwtiItY9FM1AjvmovHCR grKpsdSbpSYu7VMsdkBT/41v+5AbgyivT0aIw5ee2rTnIipwNAyZyxUBnkAQ7WCkWLCxEaIEqRr/ HpxXV9jkaJoFbgA2RDtaceIozD7TLvFs5z7kpa9nBRtZPLylfKCRIlWc3t/AB81RgRgCWBSvmbL8 xxaC9zeb+3HRAnGMJPeAUxmaOn74g1cfZoMWSLa8S+XRGoNfcS412exvcKQfVznboc04RD/GeO63 23RR6smBkR/f38aH9rjXYcm9kzQibYsi6gRkKozkLD5Em8QOJdLNZ2iHe0VwWL1EljZTWK8M2ejx WDD6yfngAHQosnPZYokyuaSZb9kibbI7I0NUczgTX9BTeFBQ4GcHKejfdFPIqHWd5VsA7msP+f0u X5h3H8GP5zbGm6Qfs+dyGMN7Jzj//lFi78pc3OYJWkI38gjzbezvee1kuockf2Ycj2KZ2vVupPEt OgA3K7aYQ7/FBzPn1n3phwwhm49AFQm6Pvv6HJyf7H0Z5s/3TtnthXZsu3Qy1rhezG8m8JorjwLy JG1FD1fa7u0J5gC6lufDlsr6l1fw7Vv8dqOw7YE3IT9mX3yCvpS/+0CvtM1hn6Yj8RmB4AA381Dq 5yHRKhsT3bhxoc+AkRGYt0YRHYIZdyMtLLOwbxPIme3TsPGnYJCZ4zwZ6p7wvNgh9YbcJovkslNZ e2NngujzAKhu2Y+NHOD7exvPYEMvV16nBKGz0pBJC26UZfdWpuBmY5OwV/MU3VWdidxUxhVLriFb J8XTTA6soQJ8CZBgGIHG9Pzk4LS+PNjb5RrIkV05LxG02AlcyHvZnKaC97GIonHffOHqKm6adJts JuT4moy1Paxe8qU+z+KKaTaT0anc9SmmKcTCujOh/enizXob5ENO2ZS27lS1xsyN21R9CLQ2B6Lz G/PUwcf3g2D0bSjR8M1aUKgHkZ14CYwcv1KU5WUuY8BMYZk9mPw34wj37H1cqu41Jm/tP3TC+80M tEsLEPcHzPAXDDAEkcGmruqm0tr7sEnX8npV3PhUtJsptrsDahtGhiN2FJOkvE9ucM8QubN5ZEwc jmjt5rA6AEFrMotQ1fZqN5UuvsyLrchGpLzgAnq38i+aKykPpI3ZYmGFu3ixxC564Wzucmshtox8 2KsGrWo2qP8AtSgX/xlJy3lWA1TfSf8w6CB+ny1B7zeQd4by5wC1Ne8MZRDHZC0kxo03NXwRQ1Vh izDe1N0BXuL2/T5udmacxZVyVH2yRsw9gR6SUpi1swaFn1vZLAQVRINAUZ38bVSGT1vEh3duw1Nd hfEpehNdQmkpnxPpXXdGFckWPvq+bylBnAE9RU3SWXyfwU995skFnGWb3a8oGdB+MzIcPqKAM2Nh 9vGRMJeNK95xVlbN2ESVT13gtxnwqZ2roOg3/QvmPTe/JNB5mLEp/kfUaCfQKffe9hMDMGG/tU14 zZxZCC/7/Y3HbtdWla8Of2zKY6zIwr7fAmFJi929to0+yF+6GTRfLVxfGBexkfCd3RgNTmack2Dr xY3Kt+fBSycvRZD7zQQumFBnVbWSNc7MLxeEgdET/arVIOqZ3600jkZyeetLI0wIH21G5f73W3HN LsIZfZ4AUs/duuUnUzQsUb+sU0lRIIL8UsFAGgg+3v7+57ejfujXXvs1vBOP4vlzyMM5b0zlz11S DcjGdMnLuv8gaTdjRDyb1xZO7XWYsdK6kDJ4m8EfYlH0Nx77KJv5zLrIwBD9gGEblbZB0kY6eTD+ 5N83/T3yTMG3yGtXFwnjp9//qUeWbrzXkvSGlCMfyIB1Y9omJGggdWNGlfm7ND7MPLqu3bw2vzf2 x7/PIKc2izjXn5JTG8qqkq/fjIVZB6pgd+uC4ByShtXMnUGps7rzWoHUGv/+ywQ4sw== rnruTni+S67mfoTWTFurS2A90CH//qHtKqrEwTu7YXlavL/5LBYT1r12rsjTGSuShfD9Bv4QKhSJ uOH9tgKFgkd0VHKyuPGZOL2JFzRj9Rszo1q7DOk5YfX6N4xImdUbVPr598kV1IWabyGn8EvmMmh+ KL1Q5wQEneSEUx00o11s+37t4rXtIc1TXXFnjZ3gUyQlbitP/v3neSXXFcSzB9jhOeFZHzwJstvO jBWb2j9//4N9i5xFKmPvP+ds0f9Jst+GI6h0syfFHfZWKrMKybJdDXnHtSSd2nbOxwbUAxMSLoOr RcNbIyvT9vQ2XTiAfLakPNkYwL7h5zx41qOFEpqNujtg3tSg3uILMpfOGhU4AOiJfLZ0OE/iYLqo Fq0T+EzeGXZGI/jQbCe76MKD3DhsWSU0b1EnMNrw3MgncEoSp0Cw3R0Ate9GTnH07Dew873iwapT x3t6nwO3lgKfRwhzc1bZcWHf0cQSdEUKNuivWoCKTyVO78XnbTE7YkZkpJsUisz4HDyspAM95mUu vLCKNNkxp2BgBaNjwIykYGuRLtHEBr9ZcrbbAJ3rF66KX7kWZuAdDaQuYL9NCzgqGRFGLgR2TFsv 5ODDIfXAMERk41vkWrYB8DE0VR2PoWsaVp2DbsLY+sNRuzgVTLi5cy0jYWr9PpFwHU18Vmcyg+kc r9edgVPZX+WTvBCj83lV3hczX+0mofCeI7xdNMs6K0RgNjzMWrqvyH9Ym4xyqMayEvwcZkbayhqc BsNxz06EEfhQj9EvGoxSuCG2g7YNFS1tADT6WGWdO4fjNfj3oD3xDbWwx2pdGQjvBacZJTWbrpBS 1smE51hDoTGufe2QWKNMdzjpB/3060U4DgWPzIFjpB4pUay7tkvrSRlaTeRYOtLssq+EwLhzyCbp iRSQN2w6z/dXfYiPt3Wn13PoN9gCieDRO3O0bhFHmREifn4gdJ7ERX5kI2AoiFY21zj5nKAAhsB4 JysMZN58X2K/0HpiW61BIh4XrsM+KqlFmRnoL3uRD5pvKiXdfQ/dbLdnobFlrcT5dgKXzn0tBihj ctUEpsyMGVctNjxVYWxasIeyM79NDlB2w9/nmQmxcKf1qNz+pDoUfczsOhP63DvzkYXVIeL9OIfN ZI41ZJ8QP33P3f+BAaC562qbPR7tvTOjsGNGFJL9wW42iJlIZeEAiAGdWuDhS2hsVEKya/h9y3MD fMBebSzuuAF6DU5Y8L3nhvnjy68h4oBBBzcZZDuCBWEhJQaaSMw/mjwtgiHjUae8ovujaP/vzLly L+AAyNDatdl8bzxXXF1wMXzczeQVYHpmRMA7GnmMf0RDPYLKys/ejC3Kc/bVyQZCVrqI/HuwxniT XiE1AmKbaxmaGGyjd7hRYHCaAG706K8ukwpv5hs+g0bu/o+0PowU4al8rPNgCXmedPC9NNiQE/r0 WhdFK/yYiK4r+/ncdetD4z6cfe1bf9/6Jm9hBIJO1FC39qbo7ypWGC5YQE5xHwNs8ob5W/UrD5sb 7Oe50m0jJ+mniit27euRI0Q+52HnNrUHq9omj+Un+K3Sh/H+cTWkin7G2oyfvpnQnJiCKWdMNZQG 78FTmJbjNvgTAwADZu8aXBXW9b05APB/Zlx9MaR6GhudjZOQ15IYw5rBB7dir/aF8bXTc/2S19XN UeL2Hyts7bb9ka/hBFu/d8ltrhduDtbPPx5tOCN77w4cMQQ+ZEZAjdq9iHg2Q0yvCupMZQOpgwF5 xRh2XvHXTMKFKemCBnpny5694haMcMhp8E1KLcxtMAJkwPqs60ACssiMLIi11Fx28+IEIOjnoz7K d6Ox97HmSS7bzVjezOi0ogPxAfN+Foew6miYrfFqMKyshTc8FVoBlmBX8sNvsR3+xABtHgzQsGwO 0xn0uSzTZ3wSle+cup1mBk7yfmeHnUW2GNGi+jJu+c4X48RRt28jIaONWvSZgaTYZyB3dk+S1dRy +dl2prEDc8gdRSvDU50r9fZ9zdjkxtVguoxhm1yTyv6xMDM8q3q2tVFmyzMa4dvUpoprvc612lXB qc4/hb9/GufVohm7ZsxXI1WTuVmeKpDbtdZHP/njsIw0uxmXvv5GwKGbcd4/zJg9dSoMKySAMyOJ Sk40bccAk8QCrKB+wEys0NHBai2CDyHMO1Ju3hfaqTZbswW0x36W137Q3AkRm5HVMWOTKCpZFn+b zMaycTwxHpgRHxHhxUO4dvGc7JS4t1XzLHbR9KDL9NW8KUKJNrBQDyJ2SDTj/qU3JskBzvVr9WSA DnfjIo4b+gLYgJTPP49+rCqV6ERy3OskQqljz7bFRcS3yP59E0Xz3Ilnj2srxZyQH8e+ymqSCI5e O3bdCXTFh/56tpsIAqzwxzbDg79HozMOhyO+tK5rW+eTYTu9HyMLL6EQbeHUNHtgXDQR2VHmlcZ4 3qGWFWeWQL27dh17gOrZj3VRl5Ak6lC4z0/jte9PhCd30pOL8Mb+kdD2wLf4wd1Yf9kUAvaTH7Xm E3364TqsxRcD4I27JJ1SXVdkZ31IAnEEssO8L0QVdgf4aMxP69Qs9hD7DziUa7L6J/6u17UPu2o3 w7X5+moO14vOvDLpK9mj7Zsx0IgYIdZMOVvm0QnnBrrajUVGNKaHkYuuVYYmwyR8WZgkFZqTXQqh 1+lBv86mzfVdM7RYydLXwbDahfKVyJvHBRI8P3I+LOTCDmgh/LxCiyqp1pOhIIkVdvS7xszgk9zT 7ZfkuJNV8dfy2wH6KPLthEpeASYgVPbWM+Iw3gtCIp/KfP2Z3Nu54Wdmv59skImokX9/cSlZWotP 16WSPxCnk1UWHXI/PFNA5Ft2rZytJp0T3RDMwYy6uUzRgHyWsY/znQEzfhbZfWxnTnqXJfejBHZW qaRGoBHTU70wp+4fBBJZkxw7pYvncpGlzpHSmJXtlTwaqL58cmM+4TIzw4Z8bwfvs2iBcMhaA9zD BGiWVYFetBxwI9pVLamWBC48MfyVMzPMziMqzARDK7t+yryYwpsWEtDtltl++KGz5cIZvbmBOYsW 8+UJOCuEKh3jWiVY2+EjyM1rWyPae5/gWo3tZ18Fhr2KVkw0P21zFrlVraK/b/xqsqXPqgbCPzD9 us/lNhDFZlUL0MaisP0TJZKl15i9rHupEe5cADQzA/KdqL1tLHnnC/ZgD9X1TnAqx88ZpQVfj0sy /gj8VZU/gHr570EcpCfOJ777hXZD1s2NjTecAtq7xwKKIu3AjzW17h6hurfFqNqR9InsKgT4IYWn GVmbTJ7ubed+o6eVyqlV6JIjXMd+rnYngVOeq5FF2Mdtmo1HJdPDSylUvRmbmzEbc1vRIyhMuVxf kw0QWXDvSd7Ubm2Q69npDfgAQpsIWudCeATdAt+7nR6NAEIpEuwi8s/sJ1rnFomBELGRAJMsKstq 61z9hY53pexE2fyaCAZeVvAWGI2K6RlRWmCFUffVEOFTiVEXAfgXZ8ZaRGh2Mn+aMgR6C22PODsF I17+OJsvpDK6Js9yuzpKaCZZ8cjNApTDBCfkxQONFOYahSbbEYoEWIaoIg57XUwzYy9dOihvgSSR GQUGMT2Uk+2Y8S2ZfEtXU0qEY2ZM/E3WmcwcqRv/cANCZgA5RVMjMj+OhXu413tASfQfeT/R4oIB FF1I0KWJ4axcNTwD9U16dZMS4vjX56EiODE6J2odRA7mfko9hqViZ0+ul3UTKtSEHj7au/dfUJxf VcJZKaK7KpGP/Fz+wARKYYsjeyXst7paepsmsNS5lq0OZq5Ez0rz/rlQEmR9WyoBM6rgAF1kAw2v 75Ho7NFaLWp03/frLxLoyl7alQSFB8KXK0Gp58KImFn0J+jUmIcNydwEwshmdqD5AkCwL3dtQ8ll TpZJrw3PpO8AnwEkLgYYStNKAsC19wLv1s+tdFU7nfFPolaEV8R3TQTD7EeuMPSd+nX4siQ7OzOM HQJwREYgZ+cfyxQWpJL+hwoqs7HNwQOgSRSwPhY/6VFLnPYNanORftJUXui+YTvkKJfMUuDLSJKq E93C8Wv3Kem+G649PGbhb00RyX/qCp/1IgRin/Z8xFZ75GnMR+f8zq6naTo+U948VNKLHI2dd1Wu OOm1zngD5QICSi7PeEsYnGolljs6Vy+BX0ukJoi6fNTGHpZeGzHXXaBbMUa7+WEfzTiV17ajfsij Ab4AvDlAzV7ESQGkWfQxb7aljCNyvx0q12FMkqXEfphZHA7k9rEBJlmOqKTzHW4c1yJ2yrb1kcmA 5NNxkU3tW/cMKElvzTmHM0hMHzmSzPiIIkXdJ34tH5h/+zCKs40ekP8Usfdu5AAZiHvQHsauKEWa 0dZxqAFYInq5ZRcY2aPgH1B8JU/JgZynifUWZp+yTXNM4st8eVUKwaJW3lNgx7SB26fEBQdgV+tW XX4kWdkRxuNlbHJuvfIVAwzd7s1KM1xnkssWQbAhglqiGiMmsgp3Y+9WAhjNjEbiFYCOGLfpkYOt 0oxVvT0rhCh/OBg0l52S+Ga2P8C4aHj3XgBi29kuO1wsmQPINfJOn6kWad2wZ+zlzEZ87fm78WWN 99+gv7de5VHHrQoZfad4/OseJwGUUzFRl4Pa0UoZfTTzojQazEyZGTqwPt1wh0zms6nFBM2ypm6p pn3fAuPnbuoTIYPHxTCEipAZ61LbpMKH3q/Wac9MfWBcigKn62PXdqbLUQl248NzwNMkHLcdnrGe A/+AuSoep0hu7xJXPmrEtwEUjfupxnHTUyYTsEFyO71fvrTGuq/vrCMRuW2xq5UyjobIHWSVoZ/m g3Jn9M2IA5BgfQu25EbFW5DudfSwmmLl03WgIj85kG7k0ke89R1amZcOXVoe/b2YpoShHl2sHZXb pZmrFsIWfHmzt4ztR7/HNGfLtBosDK3FDawhiDRjUwsUI4L+iaxtBjSx14spqx1Aj6vWPJoKOMBU 9y6R6F16V51yN2bri/0vTYwJTpCq/ECLeNHYUDtboAkVNIbVpoLH5HlhikWFITfDMhODkgtLBb9u SBR6aZ7q4gBnMZL2UuDHn3i/dL/gDNjTOhyW3UwO/aeyu3Mb/oG/35N+1iv67XyyAOsU8SCasdKL z8ycPdn6yIvmptrb9cDY4H4t4wwCDQEeW9coWXTxa9XrILR6v+gvARXwz7uQvDpxmA5CJ2fCYbOw QdsLu9Cutgj0pzsTAj6lLs37R4gj2+TYgGhU+cFr001weyJDS3I9EyCvlOgVRM527y5qc7SR2+4t xgQKbtnuPZi1zfjefmsywwvxnjAzS1J0apvq8aTULMk0bKcPUk/n7955YwiovXCE7eC1pRexhR50 lgxR4p37G59SCdoxX9xZ8EjaW5zA/K9wcmMlPTpGlxDUJaA6PBtZRmFGhezRiFnoVtqX9fCJsc/S Hf3G7PlUE9Zi5b+Qd9jP8cGaM6XbPCcqTXGerKIpMKfEisAcgHQYNb+bc0FZHQ0Sxg== J5GhpID2NrBo0neU2aArMVSLJ/udu4JtcwZNf58iwvShu9NOPJxVYRtZIirQOIlrKxnf2fNoJ6za gKJUWrq8de/9oYtWYiMPKyDknmoe8/MT/KbhJ6xIGtvLQhbVIWAsCIL2bojOktLV8fcGtOQmR+or b+rgpBgvWQ6XOCKhDooDX4TGAx1RQFnw/AviuMBcEs61d04gJakOdnSDsmgANng5SIdojC3nzMCk 66jpNLYSb7KbWK/sQnA47wAiUsll//vCDhdA3Q03WwdRIkjpmbERlCOgipnrIgqo4TMmcjfe61Np TA3zzGs6SHfjKxwMrbqoY5M02CKNznL9Em/LKy5BPcIZAwZCGDgQjkdh+EG+A6CV+ftoPjIgFYOw QbIeRylmXNQIuVK13mOopkfIwGoKqNrkwQzjOCMUzFPPjMwALXAw2UIKaeSGXsm179FhhASO2Zbx DOHv5cSYGVDLSligGWfIVSVW0UdtrA4SVWmBZH7HdEPHvvZCPa7NGrG3CnT9fbbjbGk9mnkIy80l u9TY3XT+m3E8X1Ue7Nc8tI83VkkvMCwRQcyVAtwtD6ApLzQ2KRMdfaeVYA4YW08gX+GjZn8HiHSH 0AkO75pVAwx9Ikz62VMUVwflhV/GOhl3+xfGJ7YOv4VCeSYzZ5FzVZk3k0teUmZaBQwtBLSF8XXu zmuBfcnL2AJDfs7yMs/gp3v2l7TKeK7IMDJWNAek3I2FIHGSz83ngmNDtyGu5f5p/h+pgOdzfTxU VH4ZoVtm4z4aF6TKjsel1zQt1S18J7bVWS8w6QM2QbuysrtUeDZPRzbCmYWrN3MPPVAbF9RIdm0h erg8MrKI/1zemKVJ5c5tPrGqOlINjnVcqdX8FOVZlb9FR2LYoGvp77HBNivFfVztgn+esHYyJdi1 D3rZ8O9gTfSfVqq90fW3LwFer2WvN5GSrLb9rjuxCY5XlSOxAQ4L7dzQLKW9yBxdB3utLNWu3qHn IXm5mfGJVnHiziFetBoCyzAOekGH9VH7+8l+0Nc2Fw91kuPLVizaaueyg0NXMjM2l/C5NfpYPmB+ TbTTESscYm85UhWrxejneYonZsTMhR8oe6XmZqbpOm7mUlBUQ0pL1ZFKr4vsDHOrI7uJsXgacmBr i6CDNbfa+eyjwyu73VZmIqaTHrK1ojX9PTsMqwrtE+iLuBTlyXlyEV7h4jzBU4oPcbG89Pof9wc8 QzN2QVCJvzTzmergehqLvO7vse8PABUzdm0bKOY9RIc5oHku1O3KxQBCaVabgsDP7DyyO6hyRRTY mfnRrhFevv09KD0eMhfZwxoU2FK/hl26AmAzniywPixo2zICEMRqgVXYbTkdq+qoqeFhfcAMHAc/ XZoPuB5qdKuSB6Vk70+QqHs1Nr/yId4VYeudifkP/H1ViwarG34tm4pZOH4aWxlyddtfN373gLBe ReZRxeJnxkGcuUe7HKAd9sWp+mujLuwRjOp+w1sjwIczFwYd2qrMh5vXRN6ZSjiPDyqogKrSQ7qd Xn5ujH8KoAZVu1EJN55/z26YIj5fM4pIn6W43xLnLGjcFvHRmTFI4pyjKr55/yUSV3nMxifYlWVa j1ZFOwRQ8JCzx7rpTBak/76j4wkzKL/tacW+ufq17dW1iBL4Qs9DSMJrBWkvIsjJAQzy2vB5Lmlt RjAXj2AQGOyxGBPvZu40C+ow/iJ3GD7jso7cguXmQj78c4rBqYl6TXFDPQp01rxO6cx3r2WtE9xJ 0KtsaBN1GtCrsSvVBJ7Mjktc994eiv1hkSuRXzyMiMHvdv21SCFhR0djI+nLzE6BJk5wg9E8CnaQ x7ABRIXlFKUx7ja4Ej1vQJzWlsxdkw70skw/u6XFwroOddpHUx5hbSI2rMM++jXsSnShtiVkTVLD NvlfBjlSy0sfhEdlz03uQ4ZuWuzVYM5pF72CrvVu8KjDdtNHitdm1okMfrUw5xkFbITDttjhw4fi YDB5wTr69nN17XbEfy9j0iH0kB0zIxvgWvQ1xgD1WkbMAxhIbW/cw2wy8hH0y7/3ceOQsS4E8ClU hYXoRQwjSjEeheffn17u6O0D89razvnCzBjE6zYsYK+7kcHRD7+m+2KqtVEm0IwDrfHtL3ywUsDx Y4te9G4idMDhT0I4nhxVBS3/LWbuNrzm3aKiCQ9qaVggku1S7JvbSilkDeDn+c5IxwGmmPG8Rhnz sv5SfTP8aLd1kHDRCUp6k41UQFGNn4JfgjRxv2HR47CZZSF7ol/LpnJmsfcgQ6nvBY1P4bVLFm6e emBD0VDXqb5ndJP4ABljvczcJpvKGWYsJEZjpdyQrE3UC9K82lPymC1EFD5oxk30nNhm+cY+EZz2 e4v6LjTMYtitftYufu+9VTXokdj94bBbcmj2bBH45rcE0p1rcZs4HOLle+FFUkrjnTbF+GgKOFUq NUs8+wFGFc9L8wkhffL6KrcIJ8jhY5964I19CyG99c4yVB5PtgMsdnse0EB//X0S81XtVzXoLn/B nAnZ2kkOmK6fGAcr8RijRoM9PZ+Gh5auug16OC/GjO8TIG3SuKAiom/OukgHhTqNhE5QPdSN0l0Q xLtbOpFwX3LsWg2+sczon/53E7CJgSHHKjGiqDOUFCdXK4dRut611NUOcjg2VTowY5Wz2icuaxpZ meZ23MWi2kG0xwGQ1LTaA0sehgQg+Kt0/v3nG8ilGpLwRIxKHMC7ZRaRdFCq836dzoIQ4NtmRGt4 F8X1N6PaT/6rv6NLq+S5g7tID4nmpUwzL+zIW6HOj78VgHSlpIihdiODKlL1vE/g4pHUEZn8s24m 4x4rO2YcdJPQ2PYbvp/7syU26gjrakasnu8YJ7+dFpik7F8f7kEPJbGLZ3JJpIElYDYwXuQx//sy ROnyw4nr8SYlCjUjHn6fAL9no+0gJq5KiafXC6LgFX4V0jdRQOgWd6MgLeK3f4MDsxD+CH7WILnX tQn6HDjol3mlRsZJ2WtL5Igf/2HqD3xfzZB7h4UyeHJmLGJITaG6HQ30WwzOorHvC2UWYuiMXx99 3Y/qJO/z4hO2M4KfXUr8mbkz4Ixub8c/PKQ+LguopecWozyMq8y8hGmFRoYZD6H1pdCWINHPf68e RlbxHIChtrVnEsHx5QbyzhJG4n2YvDOc7v2oS8MQH12tMtwuiyjvT2hvx9SK7chC93feRpnE0aOP /JsZJLtfE9RzURDLQFKD5H7CfFirHvsV0S3oxkYQm3OaECSF1I8rMRdu5NlCUwgK+DqBfGYgeLVl Itmz/kTHgb84Txl+cJEc5gSKvsK3MZI7c8xCvnHJePfGbiDWIIU+QQBVDAVCvNPzkDR9sRDfrmrl UsGhN2XeSsL/bA7k2ZxViK/P80p6yC8Dc/d5bb9q0COyhhRaJdTgYKykMp9Cgfu1LLoSd9qrwABF cd13d6Z98WGKwrMGnBnaUP0rn0P7IjuHn6uk8z4IX9SSuw9meRITk5OsBFT+g2YQpRSVNAPCyE2I GBtvq6IxsYhL3I25i7m8KR/SJrjvbWJ8HlOUcaih/IIZTTcOhRAoZx5W04DXN0jP5Pao4M+si0nx +gnU+fnH8rmxmo7c5S+aD1lrCGPvkjIyNwMRd79LBhf28K5PiIU4SYGr6ETfJkBWc4vQmBX1Q/AX zE0JwHZOwoebEpOeNfv4fhAyURqTLatQHvTF6Cec7QiZgMU2QLwiQdLwWYFzJGnZvjDmYsKqrKIZ 6y1/7ML/l4fVhxISRZhYVXnsCUSVs7Y/Cn8Svv/5Fn7q3r6MzHujh0aw1zgUq7sKkfYM5HkmUstR +QyozxL8/rXTf62mfnNnwcg8Lzymg/Z+wdwfCa9bkZGcGannsclu980gHxr9FRgKICa+58kKhZ0b Z5E5g6rTBBTYhdkY3KIM4X8tp4BsPu+/RA7yIgxHj0PnF83IkfToFVFiDnw6PWpKYUSIZsaC3Mlz 5bqcvPjn9z9HyYPkcuxBPEPJA6KHuoPSqHjAsn6Lcs/H92Nw8KOES49U9y+YSXHUhbLcW0mFzpqy 9Q6LhFRMIr/5+0Osa/LafTOB/19k6/v/Z9n6KY61fkvKjthp0/zxxYwD4ePLIL8xa5D/V0L2zl4z Cd9xiP0vrX/HWmlNJ8sb8FP3r1dqJMPceJpgP4svhaET4Gbf/HjqnTyTB4znj6l3UlGPbKL5btCA i2uByW3eAs/kqYhvTYasHNZeqX53yA4wqiRqXPFsi9auJuA5s4HUQ3AfLumoKmH/yXbk2wg9Wp9j 3HKoLIZ5CboiunVzdFk9Fdn/UMWjXieLmz9RHv1AJoYlKkWKRjxDdrp6hDMdljzQG57Mj2T91kkN w0hvsUKgO3yI0pilYPLUjPkQUITvM6gpYgLlguryaLtIB8NlEbH0Exl3cxUqTxt2/vQd2hc76nQz AbSJyGGS0puAhnIiQ87K4cTyxnZAW3CyRT7DG7xJ36nWNpMg4eIoklwcihxHSnaYsX0hqPMBSlHG fucALUh57hTFI4Hy68R+qMnJXAQBoMz/Vsmi+WtiTkWYSlvAIl7cAq1V8ZajUsfuqbKYjiV5un8Y rOLTRbX/XpjN9aIBgaGv90TuPlPa4LguMr7vmpLlWRrXEmmzefjsLxi5l7kT0OEcVXIDxRpLyJcd utKiYG+xn5gqwrJ902s+n34thh0CU+Oh/QCOM8tHk4hPdCONdskrWtOb0lv0k/z04gtmOcMgoz3f JJMLhvnUi3iQRxiO4aH3NSLgMJTeJkFd1ka9TZF4ikOMcTqx9e6IRKfXqBfIwFy9Vpg6bHRsPUEe NgS85qwO4VDt3SbKr9DXJEKr/GWIF/EaALImLIBxAC8J4jMvHOA8ZBp8EJg6TJBpx0waT29H5wvD OWLGzm93B00vriQgwGA9HKA1nTlEYj3UBB8XSPDOm5YLT3iK+HCxT8xHoNlKkU6zdUFe1SQ/ayz1 GBWgylmvndI3xR9omdakBE01jOERiGg86touXQcOhHoMOFgnS/eozxpE8Knc/wq5TWwA/lafBP8R El//gtaU2e7tW8BrwyKer8gBh+7pg8HmZ83sjYzIj8DnZn5YXXrA1GDGyg/GAcp/j2vXQwJnQv0N z1e7VuyBbUgH7FFT38sMnh/GNrg22BeuA2jeh+gF8hsBKv58t05/xIUVYOqX7XWHrIAqPJwkSvP9 Jcj6DSF46tcnaERPRKzVWRJk2ObhB4O2jLnUnpQlY4cjfjrAOMCs5H50SDpRisnY2dADYT92iHqj 9qKNu+SzSMF2rqAa/XTiO0pRBQ84SIZnXEQDirnMUYqDviYLHnNfjKHow5lHmE6A9gQybCLBRi/T dOEk1glIXnAkVFYjc0Ys3hf8ygfMe/P46XNxCHrLLbklLJrmMVMTr3oiNo+VAPzmgmpfjPqIHcPl OnCsCghVLmJ9AWvA1LWj3stBmcpvQZ/Av0+FhUJcTLlO9qc3oieX2GCLXs3yVjSlCQ== JiGR5WFtmYokhj3ckh5ROskhiXxcRUqqRjqS/Kg9MjNGUFKJAqpAq76M7GVpwaPEcbOVgu/Grl0i 5k8ulL6J+mpSl7Frn0+YmzCexoUw0QC31CI6LlJdZ3mRbgOJpcwIQZQmyK9xvGy6PE3tEVZt7iLr haPrQEG6c6JzMWg1H7gn64V/BGqnh4f/A5BM0efzz0vjjuqoLaHsxiDFOkqEBp3TQUGXevVo244B Eg3mPILMP6D4Y9cWsrnTFzTjww8hMwcGyJscgHIWZhySnUiUnlchcQvirumWc+EqgDdqREeVRmY7 DaUXPa4DdEOE5DlVWEwM3R3rpj2ndK+NeviBOPhCkMBKr5zYcaN10lbt8nhhTIdHvLNuVrsEutUc vrfY9wLUtOHpBGfzyjkheXlcbqVVX+ae2htEsS51H2RV14wCbixpO6ytoLGzfma4xMaHyL7VtQR6 bhe+eaUAalO797Kz5uAewF/sRhFkL22eNi9ttLqDbbsQB4A7bjxeg970BY7dklJsiv1tAFHS6xZs AC05eUcGQHxq+7ISraFoch1wi9iX3ktSAy0QweCVs2hl5hafSJdAkgEb+7qfQhjLkyBCPloQhObX FEYQZjmfxiRa0gkkY9C+EvDY5eT2cdGpgSPBzEj9G0ubXHK9hnPt1IkaWCeqJ/j2Oye2txY4ycgO ZcT8bgXcBaXQDjkOwI0MSZkLFPJJRd/dJwGnciX3wSns4ETlIhltGThS393KzOxzxZGsDxngKQgd /MeQDTWfnmhe3ymJLWR3eYu4K4xFLp3I9ioJTO3BkLLeBxDClZhsA0fpywPdqmMmD5fMTsbDJLdv 1E0IFsN2b+FhPIO34J3CgjcewghBF+/Gh6JK3Ckdx8grj6AN20DHOltxuu+m3GNXW6+xM9aHJ5uA yrsTZuS3KyTkGl90QszoqGv8VP59ynDd0p+VRpJCGFxxE9PidWcOMCGthX2G4MY9Dk8RMV/W1rhm UTQ3jWKlgJwjhthGMpo3lS+NI1MeDsu5L+NAyNsvVjBDLO4+P09gCfrSRcWyl4L2+8DcqX/RItAM 45InI0Tvy6uf2j0z2W+btQSkqJ/6Sd5zaYD+0E11gqecwaNV3zkDb5+I54JQ3IyP4EZqzbPZFi5a pj4MA9m1JU7BHadw2Qm6MhjlFkK1b0I2n0L08LMqVeKYz+gXU4SZS9N3B/iwHQHCViEdsVG4guMm wPhRf2O/xMG3kV8+3NPQnGc1EwnnkQjEjPKqvfuH43bFGxe77DySaYWju0F9n2suUFvlksv2UI4T 44GVX94pV35P8m9GyUFJuqlA//1a0unmava8chjb4QbKbPcppEP59CpPuTxQHg02B3VOLqhR208p 7ZjcrD5fPhwPIjEDnVhscfYZ6IOUshZYKj55sMYSXOSSwQV+GS9AnnkjxMk9D931hZYMMzZW8Nij bcbd6PoILu1mHgKsvr2MfVBxkHRlx3Lg2lS1GM+jjuEmIjaXFmRS+MAVMKP8A99ANcAjkP4qOYBk hNH/btOq3KwzO3eeS/wBCUqbLBxzdEqEcRV5f11/PXWEEPlnRp3CfjTidxrdcnW5n0zZNYdjSHFb bp7vMjLnkaupbnn71wPM3MFKJbZHdPu5fR5v7rzDuzAyO3j3vpsQ45Kbh+D91CsjwCakU8Mzw9I+ QwNQSrxF+S1uLFOJ1zoEEiImFgK5p0lixlgimCd3Mw9XXzAclqU2mxkGuFw0BEeXFGR3zGIM2i91 FzBxGOH3UIcCv27xYnLj49/z22QKypQZ6yevLYyMQOA788+ztUqPdShL3wUyP9mzcPtBZoZz0qkC 48baubIhjm76hXDpexQZYwDHK/BhU+RvhfCuGzvStkYDv1mbd9r6GMAIBbiRkR2e3EUtXB8YlzS7 h9QLjXhPIF70d5pREkFsYzg7sk5fPq0tdOj1qvPSLnqU/5u9d4Gy9SoLBLm5hDwrPC4BkhCoPG4S IFXZz/+RgJDckIBUHibABBEulbp1k+rU41K3KuFiq72mZy07M2P3YmaCurR9YhtHxWl17DXa0m0j Ok4vFgo2AkK7UEdbgyMJEYghZPb32nv/5/zn1n/uo+qcyjm5Sc79zv73v5/f+1FXRF+Z/Aq7U6f4 ZRcz9EDZQiNBRRkwicyJX6rrGDnqpOYFtjWGR2BifUCrZAOSFQyaRjqZlUiUvBg2OsxDLcM6KmMS eq4pWWN8l1RezA6GZMTD0oc+8gWaK9Ep8cTHsBEpUYghkMzySb0tAFfSVKdyiJyTKQmGCHSCXpHC SAe+qKVfqXmmIiKJsTdYODEuLBrOqANN4WORSkrxBOciPZOSjjrWWHKxIgu0tOIh0uhW+G5Hycxm qMyijRiSlOdYELGImqYqVniLJVnQkSeW2BMrnEuVC10+27xwH2f+9y5V7MSKF7Vsr9RUCW3riCI4 DBtaoqqU+hU/eSqZIaIlpxfBWiAcyOLEaww7sOIDJLoAClqIV9SlsiFeBmt8Ic+XlINdZiAdCIvq pIYndlDLu4yK1fyk8p+jgDHpoIihf3EVi2ixcxh3x3VW4gR8rMAJBWVjiCDxgNjUO9szgSIqXF3K X411WuLNxcs6x2AxUMZLipONmqKi5KIj4AkhEklU3uPrajHHojOG9IsBtRWZnLxsrthdY+2Xgtye EIiBvQcGPw6p4WM+mlhpMEnxsRoBlrUpxdJQGKmA49lkBxJoXO0wZrlekhMor5ToRPEObYt4NuN5 C28ykbEUSyT2mxSLcjTK6JIT9XpYFTGmEohEkUZQRsnWVNJWyRRsxViuzJBBqhWmSgl7QlStpQM5 g7qQ+ouY/D2hh+M+XXvREHEEANWPlJbZDkBdR0HSzHBDYUbFO+hi+TGVsr450uVTB1W0ejoxXWCv VUQkgqUrsmLwCprUgeR7cZJzBUtDlioiEsswV4mwnooXqiryQC7WHgNgut22khl4Kwy3ibXSFKfD TbzpDFVs0sKWlD7CKjltRsRMLE0ZHezQrWuOwTFcW0vFKA5IgEmRAQ0rRiUloY5dipuFE/8zANZ8 qjnFIYKcYJYYDhjwSuwO/xYVa07yQmBJKyfHAbdNXlzXwnhIlbvsxazpAlBiBIqEvfLHuXYt1N2M +yvlSGFMRo5zKlsHYCeovuCQUIAmJr1Ipb6KFGrq46yK+K5UHQ4Leor3IpfuRmAs4sy4B+p/aeFm fZXWE5LxS7eRXGoOCaC7I0XQwD1E6IKTOnA6um47ytMs/UqKLqArwjhBnVAjKjChovCyeKLlSkG/ kdxp0dQD2BZye5zUstREqGm+XE5P61gr1ZHji3QgSTNcKlmpKXIoUjyCVRHTRWMFdhsFgJgjGcFR MmGVPL3L9rB5OgXnOYkSm6ECcZFPY7cDLH9aSXwxJRaghpY3ssyfl9rKjtAhAZ0V2iIlurWJXlV0 f+X5dOjYQoed1sIlctgjAH1ECtkBBydAOTKsnOTyq5UgK64FmmJ7XFbZWJtcZC+kjhsUdi2ibFsU As697IR3g54rcbSO4wVHGdE9xaTh2LYUPbkhjRAW/4tOeuxjgVX+bHSlS0cc3O1E8yBVd7WNhZhc rHynLSH1uI30vIsKoWzHXMbjYPk5AopSrXFkkp7cSY51ABY+Jm0Q5OGiLcyltFXYNm5ZrNTqorXZ pXq17AbOe+5M1kHEVIrrBvtYsDK7447MA1WULKQDVMEyTiemEnpNKt4qDctFxYOzRRpB4ZpqAmyr U0VnLn3sKDw6AakDn2lSpZIdFJaMTtJSQzLAtI8G93gKfCzsHq0KuFxWdPLsbYpv8i5Svio+73R8 nnL7ITDF6gqmBbY+Mg6xBK720QPIUdgrA50QMUFoABM0G0152K0WQosa+TkGc0pn2FrJ2Q7gOuZG wFwo3AWbkD2boKFkp5jX2K2e3pZSQTgMtYuVQNl1OzsyPoZkRT5Fe4nrRD4nnsNiVhZGyLjG4mc5 68JvjxEXsfQYgo0wheKur2MZJxyTjrOqo7wjiSiwbdQpRORdxPwrlgL9CIgZQukeiOMkgEWv48RR FYCVicEkcg+K7MZEHxUsxxqFRpdqtIqGnmk+ASWPkiOqJx0UWuJIYuVoUCHFRaykcLSkbHTE9crz HLGTY/oys584KrcOU+W74SgSWZ5XdUp2V0hb8aZ0ZHVnYDQxRJMILoxX0cRQ+7haYgFiZhtgVYzT SqioiOXOow8zjqoSxSbLK1Bj28q+GklRTKW3YxKfVFE382KQ+q4lJbLoxURlzFlppRYArnb0F2O3 FdiWxEWhXwJ1EHbLRwM+y2YA1CJeiwyhyywPbVZ+HCpjxaxR5P8LwDqaB+MxhvgtWddE0eqMVMea wHWutqfktABMlCdqQQEspkgn7rcANDqSuUpLB0kv5qNeDDqoRC/GNilsa2MUmKxLTemhCah0GkEy 53odR1BEF5mIzutMEx7rjOEIvPBhupB3icoxOgUgUIuhP1YPxdrjiXax5gPaqqj5YPxiVCwnblPI GtUpF28xTtCLddLj4WR6YHR00bEpZxKAnZVDwHmBsHR5FQ2LfBENxJiIs0RURgM4GaQ9UQNjpMyM t/EiG0OuLnTjhKAadBCOjoikdjAmRmNHL0JsGS+MjRy6yflIRFBSOj1xVhz2ifXUq+gazloeY2O+ ekuk4wB34EtJNRsDOLB19AdSlRRfTz7MbKRGYCETS4oeAEf3Ka5QidXXY8xumEyq8y5u4JgVRDqo o7dvYbgDl2XTYU98rDBeiqst+pFTBy7GPfFopfJ5ckKzlPEOiqcrEzPGGoE5FznpiBABbCWoDNVK cwxORxGlvQiOzskcDQRALm8oHt4ErEtJe187UbZAEXorSxbDlgGsvUQpcWFTAPoYFVYU0q3TEr6R FNLQbfSgYs9cWJqkW2NvWwByqVFxZJYOBFkbyU6QL2OMysChupi0WJUmdiA+MkYSPeMICkklXLAF AkbgJeAOhWPZX3G+NKKwgQG4mA3eWCPAQsIUnET84fMxriQGIzIPSUDHM3DR9m4yNZJxUlfex1zX eBi1OJNLXXvjoiSfReYh2As4e1mKH+PAFLwMSrY7GwHwFPIy9q0AoMSaGYqbYKTCW6Dj0bJ5el+W Co2VIm547ZS83msJyojeq9g2xguyowECC7m3nIoCsZSVdLVo/41I0ViJamMibDDPrQQESJQpzE9i CGOKQULA0m/MCwtgw469JiHFHBhPtyYdKgEj1xTAQodNwnQquuk3gKaWE6cj1wPgUq5idm1V9GrV SQrlsiR8DJjFgoobgjhisn9gW7J1cFbYMUmIpiUNKwBThmA0gwo/6GsJnGInH5Q/tNTxwJQ7MySD xtSg0f8JBU4v+A9tXXNRYpXbGPt1VBGIL0Mm8kpohhXnTWwbb57Y2LTLVpepECgYmBBrCokRvYWo y000x2kbbTbgEMFAk9XUiWXNUNPD3kBcJEU0MogcEOxqUaxJsgzNbhio2fN1voaiWA== M/Fl7B6CqkElgWocnY66RS94MkYwkIY0Vk4hb1sAYn0zApJvMeptY46T6PyEml8tmWtEgwVKbI5I 05LlDdXlxstquUI6SDk9dDKOQGEgyRKMIZkznAHN8ggSpgYjIbOvmph10re76HeiKfxkhiylXjI6 cUpmsL9Ktggdk3tDU0njp4mFEGuvyKJa/CzRMEwFPXARYreukEr1SYWmYmlqmIWYBFVeiIlZPbBX q4L3xiUDiYreS6BWLQtum+ozkUkSrfOc0l4ntE7OBJKhxUqetDoyelqyTJCDgqThRl8E8VuQEBtN 9ss5Bhec9hPmS461NRduo8GKS1DKFamzWuR1Kr6hY+bFuszujRRrBo8OjlbTWdrDADalnDAJKKqL qM5VyZ/BEwNBY43+nwAuK0m4JA4VAX0ZGYEuuFdPOnMEYgYv6YArzQKYfRTRAUcOqBTZqF0UDrQk amOwkiXXXJUkcwBqdhDTqVsfc9vZmBdYkx56YK/g4yXbmAoh1CZGqKes27XJKEs8HuAaJ4XCUvrZ OtpwtTAI4CpqCpkBF/OoQKUgFyGGOlcpYkSTk0ZMT2qlslslbq0+6o11jOODvCGu4A6iKyP4JltB UzHRbMpzoKUQNPg2K8kvl+U0cZE6pwTf4MhdyimSNPWVjZl2dVbGG8B1PLLiRWyjdx97FDKwlLIG qepH5o2uKaxhBn3cRZObziamIC7iXZaAKnC99zICFOMJaGICfskOB8C4hT56wUG/rOTWJIbPUGZU H3OUccQIxBnYiKIkoUGlSTnP0Bi+4F08xrKxOtpwuQQddaBi7KlOIStYraaS5XKS9jsbVfTULYvs 2kvp8zLGJOsY0gBxS4UcIh/zGWA4k4ClNgQAjZQ/kxDTLB5KJ0UFJkQ3kqlQElgFoIQLmphXLgDT HqQwVwi+8lIpLEb4FNH9V6eonYLcSBibyiaUPi97xPn7fV7OhV2+Sx9TlmSJvADKFgWdZS4rk/FA U0aWGQzBExFIx6iM0kZv+uzWQ9RmJO1SUbLI6wUh9zaDkdKpeEpWcMLEcCiVV/sRX0IVfSR9CmpW FOqBHfhYBxaJJefFAM/HiOG42gOkQiilrEHKkOV9zMGsY+5XAKZzyA6t2FIyukXemapySTlH9kdF M4KcLXHcRyNATOgWwy98rHYKhI4zTaKgGzPNseM+nGkr6SeTuzgcNCW1JyXMAICVlBBiNgo7qCI2 jcQL9p6FeUXqiDkBO0k1WNfWRLBRsZKDi4lEJN0SJA4ykrNEDAhqNqsUXNENQLAwMpBgmFOl6RgO 5VhFQ6+KwRZYM1UOcyzHq6NqSok+lhJYxg6kLDukArXCdEkEtC2hK14bKcueZVdiHEEd+KzeEYvo LTmI3hkziZlMe2BTJjFMQ0rtKdkO6nucBKO7moX/Iqs0kjxmAFxokfPJIR9fVglS4hvdMgJOoabB JSQ6SAMSXRFwSsmbtNDCoVhJaIpAL/4xKhlb61hhxyVtQ9LhJocuABbiVaiSq0aKXXdRE6XRLUWc x2vRFvfMQKZWRTnCUarFFQGXYpGRQegq85PgEhRoCzDiexBr/7T0ywnj0CYTHZhANbnC4DL69XII JQJjCYIovoGxyBQCjMamIjJ2TiKxyK4jHhTi8NY/ggNxaCKWsYOKDE3YmOgPCZqA6Nhry1qG66Lb XgzJY+OU2BrEkhkre6PPiAys5/0yMJuZMDBUZkXAWgZWireDSD+Zec9Gd0bHSVy5aTRmRucMDvio yMknOmf0vF7GlfutgFp/RaAxvJOjhxGoIlCsMDra51xm79BYu0faFjb63vjoVyBif4r5d1S940Dr uCSJnsuKasTE6gGalRCppIY9gGOqBVQTzLX2MRdz3UuiL0tTlVz3gtxTQGdpMne0mEHBRN1lHhVb cipQvvlaEuOn+NXI0vSNQFJT+izADpnzFQHXMZdEJSUJAFyJ+g7VPnPtncydivx//oTz/wnahGJi OB9dZU7pCJ5rgAMHBWZuyfFXtkGyRyXhXxDOwJUWELCBsGdw6a+AcIZhAvoGuan/C6UBRBs+Ugjj smT3aBdGnGkyBxHIEYAo3sTYElREUgFn41ImXARTwTbjhLnIzPXGS6Ay2uApBBEybSZFJDAXyOqb KnmIFJIW3UiReXReIlOtgXCMInlKlVQuxZTCT6JykhzewHJDDEfLEixAMQAs+4oLpnE58YuG8FZY 1goqSxbwBXIrYrbFMIsgcMTsitojNVOYnzplNCUhWjnKdUBAVm+guz8rxEv6O2cRpWZcaQ7UcGzj NdFdGoCUIwOBxDSD83xEOZBz0aN6SPnoxx2A7IsKIQgpj2lz8Fgc4aSOGZgGKSUpHHZwvl9hTT6n /kN7Ob4ceFjEEUCgialEfTt51usqyfQArqhsNBxNFXX+XEsaHVwsw1iJBf5Mrk72BXbfgNPCgQBg CSa7ucZSzdHqQg7U4DOpYgdWwt0A+TPhBHsSuU+ActlGoyAzleIKKTYiPrzwskqJjagVyDsFvcJi LAzuwIsHNZBQ8FV81xSB2Z4NTnhUnAmNTER6wQVODLFQ/wSvBDiFGXEnBpMSOf9pL/lnyGiLUias t2a7CRjlUAGN/kDi8gSjJXOnTpcS1qtGdA74gck8XsWajwHW/5AOFCXuh4OQbNSIIxHIQXu0YwW3 tCJjtRxE5vrAb55+cKAwkDTB4OROornTKYKmAvUJAyWnKbi4kx7Dsb+w6Oe51rPTKVynlsLcLtaH IRdwZK6cSVmaUMFPa+ZijkAAOkrd4WIOBBhBXeNOuIw+oz+9qbiDSjvxvc868LVMQSvFwKiVxfAD rggQY6YRaFAR4iyFvcxQpAPFJjmb6gxQ/ILhgYktFl9GJVwcee3xLhAv4Rz5kUkH7AUIYEpZSTuG zCUAixiUgE6lBAQuYUFGQPoN56VQEMVaUJENOM4Mwj1CUEzAj2EdVNnVeYlKxAgOcpSGPgsXgVy4 w6ESQZ5XjhbLc9FFDE2qCn475tQjIJuOXE8UU+VK3gAdh8plYV1MotZyiomWBYwFmeiwsmlA2hkS R0ytId90/xfE3aDA59wcDpn4FQYG6hAPoJM4U8YPLlWohohUyonvWEV6gDtg7bPTMecIRH+SxRsS 9poYEKkoKNkpuuhirUCleUDLyelJOWEmrKa0kLyohWKuIQY742ElwwSgMPbTAK98ynoNhmorrtQF 5UxB0TlZSjnMJJAhtpagJzSzPVqqj6NjLRWKMTqlFEZPaKqTYGL9XXLFJg7FSGQ7Om2TsRes3JqO NHipE2YyJjltg2OG4j45lwyZPtGma9gsLR0AFuxry2o47LXwg99vIzNnoh0NFoXiF2D4JnJdbPsF YHKejJZiIbm8KKThBe8BZWQBg7AKG0DuB2kHAsUrCBy9/+GMIp8EZEFYPCeWOGOjLhUtxRUKDJRq 3jAWZqWpqZOHvSLEGY6VTUV2KI4FV9BGBzUd85lamwfHGDJUWwhgNoyUSlkXUE+xFAkRcOTuZAtJ 0IP4gzw6bZWtIDJ9iOxAE8ZxJcrKfbO1ZIpHu6uh6lOK9jraQguhblJbsoaKNHQzU4ogCKHm2is+ T65QSrw6ZJfm/E11IbovQBiStiImEncuN4ZCIGLBmF2U94BcnNALrFDagoaIKXVBfiiAF7WCu2xi 0gtOgN78P2G1JIuB9gQST5CIVktiMdgzRYljTawxo1KiQ1NTYZoAZC88USl6ckcCAzYnY3VaJqR0 7NWVkv8AA6Ml64grpOy9SiUOQ1tFVgOMpuQ04TXtGdx4YAKo6jGoXckUAFFrXDAeHBAVMicQIEn2 P4wIcPw4OjeQErmUyy5uCARkg69OOYkLHVlH1piQKQDYHy1comTsBBUzbj94DHPqLCiAUaKgAeJi rEToK/HCB98ZG9MqsxugUdHMhJ5ZjvlJdL+QJeC8KSAXsNIdVssZ7gBdCFi77gjdYcA4b0FN9d8J tbEh3EFXjpuinEnabi7HBo6pMS4/3DzWQxquZ0xKcM6Lhkn1TdR20zE0XG2JRqDFud+qVEBJySZY TS5rBORoK6uTeyQosVk3D2iM80ZZIw6aIAqQ7g3OMZc7N5wdEtcQSCWl4jacMgyABelbEI/WnFLH xOgK9E0Tiy8gddpcEx3w4NaxCgncri3l5O2/inS3LTIwCh9GnsXQPZ5GZw285H1f6HJDvlEyd0Me ABATSJ9Uy26Dv0elJG1sQUp58OGQgvUlp/7RdZ2lUyxqjhvU4IMRk6OiGjLASvH0xrKOWBdQAy5L 5eItM9gAlm0tLWNxjdiUFXCOnNjwTTFlSSn5mwEa7Z+asAeN1Umt+Z4FSGUlOZ7dcoITKdjF8aNW xcpwBZl+6WhyghJXSsyuKQlP0ZVVYnwzNen46HYy0jJptGglo+PmZWQELigBJlwOLhyMYVtIysCn ltIEgfGOnM6wEIwkE/HRbQBcYg2dTF8I2TQpwQm0JAxvuDIt4YzWtqWkqzYpibYHLRbKCOjwrFIi dE5jLfeIehUtlo4FsnwpMiVgBwnyxIzdpfCjHBAKiZ15uUAOltzeTs4x8JuizgAwp3nRJnrPYMJu Evp1rFIEGceZxsA55iUotHDUCoyxWpLJs3QOshGngfWFVC5WVZYQ2JeipsGkAVWsG0QICvIY0PH0 lUQQqywWBJebHFGBpJZFRPxEOZSWEGjM3V/KTc4qLlQSr6w4yHomzy+uTPRKgtzeZJcF3zHJho/J uRU/L14uRayyBZ2ygnwQgmhFJm1op+2GDrrMrbe+HUEAT024pIq1b0uJFsQ+VawrT8H/yHxk7g2O VAjKRo+aUpO9C4FCuNBjAG8BZLgQBQ26N5DiRzIkcK+0rCBecAnF0lFWC9AE6Yge2S4OsSNcpgGs DrbiK0R2KMxcXQodislCYKGzO0zJQjADOeWeAjGPFBWwp5w7CL2creEbUFBt71x4gA44xsrEhCuY lpzyFKFXfByBl1R0oG6VzOYcFpRoPPE+JXF/hivJUwdKYlZNLZFPWA6BPAusEj+pQksci1WkS15g LFSQMdrUsRwMvIuWEGQSLqXioZouOmdYrmzcw3xZR4FVfK+YyYAqTUZ8Kzitha2SXRURNDlo2kpC QxCTU9Y8W6U6FU6SetsqBeUpH0O1bZH8EpSUU7A+JqJzlVi6gOsG7muBOWghZj4m8QL5hMKZbMw5 ACxZFalh4uFR6nBGwDZ2oIy0ZT+lfnLKrAtoUMpMGgFjPtoJQAwRfqb3CzEv/SyhFJfsZx/bGc12 prSdgW1jdQdyxa0MdD+rPYgtb2Xh25j9AYJBuxDRKm60iyatYky7wDNAOGqTo9oErnbZrF2MGyDw tQqHteTtkxxbNABORwhEh3Q2WIgYeX1A+nV0gPORRwDCyTKERCATUEoKDSCxreS4lXAPIPJt/EAr 4zCAyWhjSFpZlwFcTitD1Mo6DWCzWlmyNuZtAKPXzhS2so8DWM1WtvSkmd1WFnoAuw== 3caZt7LwA9j9VtGgTYgYIHC0CydtUkwLhh6IzVvx/gAagRIeg6XQBpZ1Rs8oa2LG2AESers03yr3 t+gIkMiga2MUi4GEmprMsaVow3q/EInpJ90rwj73k/kBDEEb89DOaLSyJO3sSyunM4AlamWfWlmt VqZsAAPXyuy1soUDWMhWdrONMR3AxLbyu62McQsD3cpot7LkA9j3Vla/VSgYIEC0yRqtQkm7/FJy 4UJUkKjojZ6e52B8jB1ASwu8CG3R2EEV7ewwLK7sjm0tq18dp2WtYikRyP/Y9HFHL2DwnuB3GZHV 0BCgpHRBYBYq4jswjQXuP5RfoOch7QZX8IEqFsQigDmcS+6BLzqlAIQdrKKPu5fwIuCSqlJqY1SU FMNYyTaGlUTIJcAU5IUWRTB6mSmlnHJpxHsEnTu46AhMy0nDMh2BwCfLdeWMx1BNhu6gNVEjD2eI Mh4DanXiR114YVStj2eosKI5dCry5IWWWHrn8rKHtXgDQn1xcQUvxBcMKnRy/MYgCaJV2miVS1pk GECtBhh4cO/RYYVKjV8I24KnT/yXfagUJ54Gb60KLC7iZUjEQFclrLnkliIPTAAGVB/dF7ESIQJL n1wH8GYGcD1bi32YOGBdx2TOYAaiJO6kldRsoFPR7AaZWx1nsi25YntsO0O2WMqOolhpK8ad0Ak7 B8VMvJxnARKGiueDkuz2lKmSHrZiiZXEbgSslWNPjVj/AspmFT7DrniRKid1rMEBjCt7UASKo7Ml 3GdZi7+t4xh2uom1ZG9yXqxjcJHwpgRgGfEDBkqQj0ad5S4vOewZwXkZKcrIBIXhmcSDMqci94Iy RQoiKqfg0jACyWxfWrmewFlYrs9iJQWt05QgW9Q5JdUWsS7W0Ctjkk6rxMkZg4so8ybQuMqnqCfe WePJE4jaIsJGauJ1KfUvvK3YMUZXWgqOgGOVY4oSVlOS/nOlZRBjuIIQpE8nV2gQTYzg01oCnODA lU4i3yhXPGJ5HaP0CmBfAtBFKzvaErUtCBqPUc3p36kp+TYDaq80P5+ys4CbCSYExQ443SG6WQCG 0ZUnAbr1GjMuIMc+4CjhG+CCuoB6EshoFeAV1/IlGiJ6UKT43Lag0wGItw1Ht6LzNrw/gEQMICet hKeVSLUStFbS104mW0lqK+0dQKZbSfpA4t/KKKCLFIM5mM6DebcUoI+cRkUnqE45m3FgeGHAbBMr zhQcptgAlqx6ikBcAiiH4cTuI21rDj/Gq8FORXhfPJmNfBbxBCgW6wtrzCXPd8NxPTkEchTSgLvV eg3b7mv71W5FA+0IYwByGYCIWlFWG3prRYXtSHMAgm1Fxq1oux3FQxFG8ldxyaIH7D7delfEYUF5 ShLFIUTKRm1CKdkqnZdssCBbcISNY+dkqVLKnBXojBhDYEnVqpDRetGHtHFW7VxYG7/WxtshMgT0 51jg1Oh9QTxRYFRK2/IlupljxAtyOJjYUtzMKRU5Mj6VJm+fSkQILB3kJbKH7SJQjEfFkvNhRBhQ qivwfPMxlAjzCQAiL+tSEk+V3rrMpV46IBUyMmmaK3Fg6iky1MJ4S07Ao/i0IdDWEgxVM+9WJPUA gGm3YWClczF7FoqMulYp/SdIdMS9gXdUlgqkxMIpAC5czOJG+UwAWBdOsq2R1gJ5QtheZP8wR6Rl AQ0D/YjT5KAecB+slXgicmVmyHSrrXhtWlFm6JRBBzyRDAZUwpXlvD4KcgQZ8eQCrowYUC2xssYm 2l2RCE7AqhagpoJYQM+03E5IM6AtS/OS6AW0kSTOWpMQHMiN5DXlqBLOAUGxpNoFXygpm+Qk8TcU pE+R4CwPS3yFSINS7tjHOoWl+J1iaJ+XsNpWFrKV3WxlTNuZ2FaGt501bmejW1nuNuZ8ABvfwvC3 CgYDRYg+caNVMBkoxLQKPP2C0QARirKy8j2W1OuawyIQGLOX9mEoQngJ2bVFgQhr2PuFPWf7TiX5 lA84wX1nfeC9aLlDrbdt4M1svcWt970dN7TikXaMMwA7tWKyVpw3AD/W7LwJ/WYJFilLphY2iFEx KjCRe/JVIh2Y7gC5H4nzgNHCJEnVZGJWWC4iEeaV8t5gDASuF9htqoiMQ88czSN+9TCvyrDVCLXG MgVFrDF62NeSpJLjfsFooZxQNOafwMffxdSXNRNFAHMFHS07ikAuUIbJIJEBRKAuUuLIMG7cxlpy 4Jp4OlWdoiliAI7i8jTyvEgHKiWxrUXdCr60khOpksqXlMs8i/Ii/QuCC1kujnLWWqpFIVfAj9ex OghwkzQtYDYlkLOirB0ElAhTiPYl2cTkmflBC0wRLRBsWskessM5OB7HxLqc6AOzaakUOWtpASGK jItzaC+rqkvxksOUy6QvDUNJ2ZfAN5wkOV2JryxiLbKkyMkhIOfF1VVKGkB5vCT4pSrFC7sqtHjZ KXmcM1TqOl8AI6oycPMzElxi2Pwba/phuEFJftElZsU9wOhZCKwmf0ESzznq18aSZVgTiFhPCzg7 lpCCGrIY7QYUmqvNJrTndCywWXOIF/KuGIMhFIZrToKZRLIDwTV2HF8jxjRoaSw7EKtY8qyIz/uY PyUgCqa6gUXAMBcCGqpVC2bcVAQKijyjSdZVMXEFCG+ULAbovjfiF11VNICSMm3JCDiLjitpLwlY OpptKXnaAcjJwuBVPkVSoC8nQmPep5hv2FXR6AJz1cT5QOmN2IGnU0ptJW0TZJvkN7GRFJIrsWM4 pFMuUyEzds0AYUWqWEF0hBcmS+qQWUnOCVa5VCPQZjKUJC+B6moO+RYwhVfWHG8EnuzmtAImVkJj U5KrSHQjIFd5dXWW26d2zKZAegnJAwGjLSRLFmcYAPFYinbqlCEci+zFJGqS5qOGPIKSnq5kr2+o 0cfZPDC8Y4Ef12RMxHRrOhbu4yyFmgRGAkrhIZMZ1fH9kgdUs40HRPmY0ZDz1GMmqUrSZWaZt3Qs QJ4y60DFT0XZHxQ6yZF8X1CBHcdGLWKUwaYt+S4kCLxCJ7tYI49M9YM47TauvJV/b+P1T0Gcd3ly cd4kHqywbZnJPUPnmlDQeEE+lhTT3Q+JT0qQd+Wxgg98IX60xMjjNEyJO0YJHnEckHmJO/bW9sTf QVMjURoxmWoBGjh+Hp1pDnAHgTnmthjUMif9VhJsJ4QaFDRWYvWkOoLhZ6PyCpqJPacxpvSsFFXp mxPndsBgKiLpmqy+Kwz2yrsMPNcHRjWggEuqogTmGg6tM6BpRDu41lIovOV1Mg4l+Tk152ZbYTCW GqD2nDKzvy2rEKrKZkMTBlUODLNMoprgArTShYDR/yuNeYvWXNZB61gCDdrqyLjVMdkLKpjTIY16 k0LAmHaQZ2cNK3Ul6B+czRx64egs2xKAmclobpOSnKLQLxuYkIPHND0yBmIzme7Ky4QlDbjaZv0y kLjybNkbQF8UqYOyLoRTlHDkfDOZy2rMID3fv8XLIEjyNdX4T7isID7ahGKaK60pZnqlbwcbx0Ap W/ed575O5lCM7YA+GihvhiLhKFM5cAtg9l9hsCnQowfoqpQsAM9oFBrAQ03C9pT4/oBOpIhSi5J0 n66WctyYSNVZITWiyNOUoZ2AVVbNKIFFQgEgnZHQK7vTYNkhyuHsaqpPKB2UdNB99HejskOSrCyO wGQp0LIR5G2Ru5FksuwpLq8jUVn5Uve8zErRgubAYluZhFQT8sZza8xi1vu6wPqLAKolxzbwQhzt 3b+VCzE/Di8loDfgcWSPS4PzA7RJaisqblayYwpn9sJMs6bgMCElLCWKEEbEikIVUh2NM81ivuq6 bJ4cyC5gUl5d9sRiqNSr4jIFhkPhBVxriVlNBd/gAlDQJsTX1oL60pkwhjL09bfWtpJoYK63ACSB yvG2rNmBbhccQ0MLdqvF2EFZbHGR4/4IyNGFzTfjEiMw5iTMdtfopLRo28LGq1Kmckgt7MUhsTRe aq9xokCT5aJOUzBZlYHsZSZKfFqLbIzpJHQscOYllDiVX4AOSgkRztq2rH7fIh7oiuB6x4+qv7gF uuSobxahqKKdzc9PcwV7FiCBcVpSKY+zTQwGZwcWc0HbFrBsb+PA9k0FMX0PEsfSlz5KQUbSWoAE W5ZN1AFVLj0F89ZkCmYgVTkSzH6AO/CFqzPcPkO2dut68B8onJTVvahOYXYXQXW+igkoqqhF17HS Z20Eq2YjSG15CnPSr9PcOhYARe0Tj9Y4gYHYww1d36iS5gXzRFhew5gxum9hGaWCLZRyGIByCTiY FQa7khRIFaX8mGtuBKjClNSPw/qqjg2mUs9EFZh2iIFSXBQV5JwaJ5VZa/TbeB1vGxrUrI/gIPP5 np7jusPQZH/CEH02WnkZx9w3J5GDcWj9Y8CXzTVPKmaEKnTcT++qqg+cBlfGVEqNLmxppPxtz35w KCSKWBWrYzDOnZxgo9c3WHQprQi0La1hHY0EeYLzGJV9Fr/+A1PNtkV0bQDvM+1cXwcyAm4pHUjb IiqPGr1ygnFfkLt/akjPQ5bIDDjHnXISCFeIZy1m+3PcVBxjMRuiZjt1ijzwTvTSAiagt5JBRbOl PGvpMn9nqk3I+V4qzhaK1WNE3oyeeiZymBBlrJLPOONjx7WBJY1p7WpOVyDmOMwMi6cGchh4JTFE HAIEOUvqSrzpkXiIu6EuJLSIL2DWK6BF8gOWltgBIADr+WWmqjR3wIE18rIZdGavqFq6s5m/IujN mBu0kloy0xeIzN0E+lQfFMBcjw8cA6h8EgDrqFGRYwSbzztWprRIAGbfH8eZ3+YYzCKO4zpfBGRB WO4Nt6xr7qD2mZs+i9dhPbg+GawC8sykXOSkEaLlQyD6aVEHCRxpEgBLJhKSBhuWm8pGCDmRrbFa 9H2iHXYxGXqiMk0gSiXSgTdFU1jJN7yW+o0AZOwMMkGlZALwWMXCCmdqwoS6FNcBQIm/MLHCqKY4 pAN8vkU3yany5/g2SBJWRU7VAma+ERMHVzqC2V1eOuEXKtF6il82VtuRRM6xLHbegYr6XCyLpXka nIAFIz5IMJUJy/VPbVFom5tqtE58BGAQKaaQLU8q25mvb4auaknNlOMlpO0zEt1S954vX0hNOAEL tiybp7G3CxatWqiI8AFK4owaohUEFpNpIeO1G0DcvyawIVoFLrGoXZMtBeuKKkzGDJJtpa4lpAhb ismlcsKrYr9z3G/4SWfj7euXhQCwgnI6nlwMUZwwBcEcfVPXUqpMmhJQYg7z1Oo1MGQSisjFLzEZ DQePpBpI2VBzJryxMpRtVinJX4xZLCgXn9LRfaKxsFikg9M01Zz7SWkpbSQSU+vWMksBanjeMkvx fSusXC9ZvrKS1Ag17jwzRyp1AjL/CWkz4UaJdt5wpiIv/BkAueKswfzxAiNGF0uT6aTd5+w9kBpQ s4kJ9pZmUURnsBoEMQpfKSlSRewLrAAOYInJrWOF3yzgq/YxuM1ngTlguTEx9Qh45w== zjG4IOUgOPsxl4rmGGIAINGo2PRslDEh49h063KnfWA9suUagCsMxtI9CTzHYFaPQ4CWGLAM5TJB YGFiFQ70DgAY5qmTxdF07qwWdxjwoEC0ZnWke433YG2uAz2Dxcf7x6R4BeIxyt8jI1KpQHo+IkUp Reaax8CqGElVK5FuILxKiniAd4Vnb5RYdhfKiHDYlwkkkEo6gkWIuReIueJIOPCmqym4qc7ddgM5 J7Om5RJaZDti2mJjJjUAYsUAChCLwSUZ2KR621i1hE6dTRma0hhszA8GQE8qNgjnExssPE8ytnW5 My9rXq2LVuQAZMdji0kDyUvLk2cKJe1iPhjrqyBPZYsYpZmNqcwqc5TCJlkuoUOLzdw5NyVYRZWI A6ySmkawXVwDD2JbvJZM0JXUPLElMRwzbFNDydCWMcyzVlL+EgZg4rVPB4bBdI7ikbGAJJycIw6N BiALCBmwoGT8PfhMwHI+NVUwypaxViLpNYGMpiDRUYydy8YLQo7tG24Ra89kPaSEAtkyeHpG3AgL Ilg2+qVnnXpJAZ6PFQ+HPO214ZZRDM47AHlIRffvSoIto+NCmpXLTbYJxziy+coi1loCU9ETURAK emNTaCYHiWddYBrRHixlifnqxVJc/1e6Ff9ES1pzAoM3Tcn3EdNPCVh7J7dXPM5BY205GCJ6cPRh cEHtkcIhS6p8JLE8a6zBGE+qzmozSKw2bAhXCVeS9BjdJwspvoHM8MJU4xJm1Zgqdj6oqEaREiBL VmBBt7qKmEVyfhtKpdvAAhA0rQgRV1ggmZPgJw/zAC6cFDowVHExw8+QBZ8FvnTQvMuQQzrUuTk6 UX9Jrh+PCREUZMJVuplMenzMlAxAFpwxPTsfqb796aYdzy8kH/2VPjAqemT4glgGgrGTufa+T9Qq htWhIrFHZeBKH1hK3VQQoCFcQAxctVIgxWqynx3o70BqWTnhPjM2onIxk0nOhVSQejNjI3r71CrG YvRMgG9WWVP65sQGrTCYa6RASlUpHlPW4g7G0BmM/ymYtqU1KIFloEB7neKUSzIKIXGPOdNiifLM LbYEXzpZgRR8U0ZHIGuiWgB8sKkcWDYmKzpI6BREdbzWpY2I3sZrXTpxBRM8S2+iiGRMMwv+LtQB 5B/QVe9BAzApla2TcujkBF4yopYEIxC6Quys9CsrEw5HmYGlXxbr8/GWYurLxwtRiYXOWlK/lWT5 a1CFshJjWMY3QUUvJVRB+KbsGJhkzAUw2+sh44E2dTweLD9DfgAqw4xdFLJp4mXVf+pSTQhWyNia RDepCcFVDm0dy9sVGBtY9wC9qIRsJVIatfVUnU3A3AEl5BYGioCcdtmWyesWwLaqTcaDUfkJ0GTQ SatE/C3g9AnvgmrsGUwVYrXwdSlfIqSs4dtTkNM6AWU3y4jnC0XVdBFYxAp3PiYktdF3GYGm5Gyw EvVcYHAKKjIUlSOkEUAWRckGK7lhICMD8bvgdin5ebRkp4GEFbpMCeR4Co6rhs4xmFGAU5TFhFeB DoOLRY8wNwurXbiDA7y0op3UMXdTAHJxMcyhbhgmaW411ZqU58mvHHNNc5RXA8glTptAdB+ULVds gNfROT+dA5dCENNJBGBUI8Kho0pXsLS+SpVMRGupyPtXwErR8iqK4+oFcq2HJhB35wB3EMRxBlvB 2XB1yBICaaO0ksw3PDIAsjK2/+51JOKFkarCkGcYSMCK3A1f6ezAyZVRlCtDWs+1d3JKCrlUJ1vI BZ2acT5ITqVAE4LnmmCnkoWCnd/6IOlR8PG7qws7AqN/iAU+R1U6QfUPB31l6u6p/Qevu3F94+al hY2ltdX59WPT1wfQNTOYhawq9Wumr7t7Y31p9b7pa2666caFhc2Vu9Y25qHta6avDS1vCP+KZMLu tI5klFPVeWdXRo3TRF8qciEARXDB9ZDQySnqh6PHRC3XEdpK/aZYlAH8dwDXAqICD39DxBe0zlTB V0drXirLiynGCfuRlcjF1OlSoU6nFN91rEUajcQ1RAuxTIB+5Pg4RDd78atl72oI1RHtcp1ElZga F2wdSpnoL6zSsDLNRBXFmkRzpZQd5NoS3oWNY96mhjpWGXdUc3QGY1Yp0CoWBlsQ0sz+U44kWqI0 nlBRCpXD1GpSuCqWYAaaYslPENKssUwEqJc9wGx0Yy8KEaixhLy3kdSx0RtshZxRE1uIC7IgaTCY Rc9ulPWogyq2taJeK3VWEV27WrjlFB7goz60qMVVA+xayolVJ9VDFy0tZCAhuwfYzQpOhYf6GNTj gOGMivFA6nAuegqRvGxjsV6MNGBNrUUlAXYp3uxYZAbDhkk5BuY6VshWkM3ESUkJoE0LLJdmRktx Drex0EQmLtdEShGIERKiLpcIBR3d+CCGjN1CNAU50nGXaAquRk63oI4+KJqS/NHNYn4f6GflpUIT 51R3bNSiW1hLmIszIh1h7Rs6Rs6kMkclrTRmHCIvTS8nCEyfHC1nnIiJsAF8sY3lwGGM1ox+pqCZ thL1EMOkmGdHYCmOw168tsDOK4VgoW2hxCAv64eFtRSbZ6UwDIyAkma7Ihl9sRYOhQJAW7qxVCaI HFhiUgEcFtvISgoN5A4IUjoeqBV9J1hoKeU3lAKqvJzfWgIIwZ0pnl+pe5hcrGGl2M0G3H+Z1+TT eYA7EMalkHqxMABFtYjh/DIOxdmLCdlKvVgAi/t6JZV8sUCRi6EwiotmhhmUYuKztUTfwWzZyyL5 sUKavUqCecStCRfasQ06lcWBbOdOjIxxqSHvWyFeRZTpC9aADXGuprImtIgaognZjKzEFTzQUm7J kU/o2h1djdCAIY7GNVdUqNNJ12KFBnNoZWQPrS/ZJKu1zvaASz+rGPyGDvFSflxzFUMTzVLgwyo6 QZyAlQqynPADgbHoL+dvQCDp+DwxDLEDNs+jb4aRA2OlAq0EdhouBUtAKamN4FJqyzvxFQ8rxF1K ACa2E+VerP+BUCUcQx192FmoBqDUWVOxHLWSNIq3nCJ2q5XJOXWdh/PA7nCWMiZKkIRQJaj0pOSc iTuRRWMc4Vi501ai7k7N4IZlecs6wy4o3lKwjZFAM0+5d6ZbGfEHTx17XBjRhQJPllLoV1nNddFp gYmFDp7j5LSnaiCDxSEPwIO3r63eGfrYCN3MzBAYpaT8h6nbj8AvWtFPd7/z1luWlkM3U9fFr2Fo 191z29zta4cW4WtjzAN/uGH6mg+sLK+Gn2bCsNaX7t3cWDwKYw/TXp/vabFw/9LyofVFnJuZvu6t qxvpN/jPxrEji/DbNWp/WJh3rC4tBKCsT97wwfnlTWr5geM3BMEQ2sEgcFSjOo9jnedxbAfmsXbv P1lc2LhpbXP1UBjaTWtbrHqa1mE8WaHpxtHOE2w8s+1TvfGtB29cPjx/UHed4tKh7BIPmBK02faZ aNX9+N2/uHTf/Rudt0iaj/ScHlo6tHF/5ylx62s7DHxUsOTG5vq9m8uLqwuLXZeEHu24IvKebZ6V 6TqZ1c2VOxY25h9c7I5a8ke2fWKra3dvLG0sbHEk0/yOYuu3Ly0PMcHGM9s+QziQXWe3vnh0c7k7 xpHm20/Cg0DYdU73zh9dvGV98f2b4U52J+g9T3XBQAMmoo8zkXYalVHqxbfn6OT4Yz7OLmzz9iyt dt2ctSOL6/Mba+ud9yU9sO2H7u61zfWFxVvX54/cv7TQmRHZYilyfmR1xLHD0uoWZKAxGbODt+bA 2sqRtaNLG10uzekYADLLW777upsXD0/fMBH2RmMeE2FvxIQ9NxH2JsLeaAt7h9fng+SyfPva0tFd Je51vnoTcW8i7m2HuNdZ8TeR9ibS3kTam0h7E2lvSJb75qXl+Y35D4YXLR60p57zHh+e7hAsRGdu boLSdhildT6r6/OHlja7c3HSfMew2m1r60fuX1teu+/YBK2dGrRWTNDaBK2NCVrrfFYnaO05h9a8 mvZqOP3vXUPoL7InJmru00ycjgaUeRSI051LH1hcPh3+TeNDodYXV9Ye7EyhwuYtD7PTyzuwxUur hxYPL60udae764tHFuc3bt7sTnizJ3ZAm7raeWbz4Ee7uTUPkk0tf2Tb5za//ND8sS1wSUOTujG/ PpQqldpv+7yOHlle6r5rC/PLC7cFSOeJpQd2wDLVebsODXHBDu3I1dLT+gajprUP/1XT4d8bwvfw /xsg9LfrNPFbd3oozbd9sh15lAyZyLtvx9F3xSfNp7Z9mgFVL8939wudP3RoaWNpK4qYzy8+sP0W ms5bdy9EOnQ3zFDrHZJW5leXVuY7qZVHhYe6d3krzDZ+1j+S729cPnL//G6R7svu9udDNy8+uMTB R50N0PlD2z65Yc4gyjEdN6qjOHNatBa3zm8ePbo0v3oTzW1c0MGCWMbu2Nzioo8fWtidZuehLs+I Y7kTVMzuRrPzKCKEzsqmccEI8+tLG/evLG50P2zjhBlOBJePB4YYkrUbGj9st+jedSoPdJ/JAzsx kc42hge28BfNJ+JGeiJb7F0+ET3SR2sLt4h8Inbcaej4mDhOiPwOjcR3yrK7uH7fIizmDhl2aQAT q/LEqtw7tee4Vblz8P7EqjyxKosMN7EqnxYRdZdalcGmPN9ZcTWxKu+QVRlpPNiVjbphKHo/sSRP LMkTS/LEkjyQTo2FgnhiSZ5YkieW5BPaikNLhw9vdk9yMC4YYTeZWzsrFHkvD6ytBnFhtfsu9T23 /fxrZ2y3uX44MEh3B8GhO9fTfGh0949uy3Bzazyz7VM7tri8vPZQ1/ktQ2qb8PvMwtryELbZ3se2 fZZD4sjTQLFGhVpMlG4TpdtE6TZRup0wKfS7SOlGxO+G+9YXF1dvCAzn4g0BmSzdt3bDg0try4sb N6wvHrphbX1+9b7OF3BctHHDEPKJSm6ikpuo5I6fE6Czun5xOfxlKE1P9sT2Y/uq88TmP7i0sjlE TsnYfsf0PWCND8LyHGf33BHHmJtJMJljdDxGR/7okcWFwDau78L4hV2letrVipnAoO121YXujIHl Rg6tPex/cJSPKQ/2zR84EgTjE5hlenCit5nobSZ6m4neZqK3WRsvvQ1raUhvw0ocVN9M9DYTvc1E bzPR20z0Ntuht9kJ3LfbnI5GQQl1N0tGEy1Uy+mYZNHY6Q0bdRXb9oTK7xB+GsdUGstLG3fOL22l Gho/jLC7s2jsymThwzqejXwKje4JGyYpNEbMOXXUU2h035HnUgqNHaKdkxRUY0U8h2V5Rp1unpCY MOq0c5J+atRo5yT91K6mneNj3h+a7E5STw0zgB16+finnprR3WuKb5G7KTuRH9gBDDnMTLqXJz62 AzN5buXMevPhw4sbG2tzi/etrg1l/Olk9dl2L4zuh/D+xa3tXdl8pPlIz+mhpUNDmBq59Ti56e3e 3By7TDG7hWAyyc4xEGXuECM5ptk51g4fPrq4AYNeXzw0lI1wXNDDboqW6IwVDnVndg== D+0Et9t9It153UM7wuzi/dltyOwOmdW4oLGh3E3HBXMdXl5bO0SetNffuzy/8MAN0wRaOzK/sLRx 7Ho1OwSbcGyYsClqve0zHmobx+Uy3QJ7NkZ3afezBLvTdW24yzPinM6JH8LRt7MdvX/+0NpDB3Yj rhtHl4JJgsKRxwaTBIXjHQe/ixMUPnT/EBHC4xrkP8lPuOsjsmxnBDRmEVnD1bAZAx5rFEKyJnmB JhzfhB2a8Ayngucb67xAQ2c/eo7lBZrwS+PGL03YpVM/hkkE+yjyS7vTDDCJYJ8+MSvARGU+iWDf 1UF4u9JRchLBPonCGxVJdtSj8CYR7BPaOaGd27Jro042JwHsE9I5UhMZcdI5CWA/sbUeFap7Mv6E Q2LyHdrQYSLZR2VXTjtVHYO9OH0DGKODcHh9fmFjfvn2taXuojw93PE4yJtG1j64urlyR1iCB4fI 8p4/su0zW127e2NpY2ELs1YegAKt3760PMQEG89s+wzfvrl+7+by4mr3FO/jIqqdkD59tOWZWdXZ Hnvv/NHFW9YX378ZtrZ7dGHPUztGWhqnclzQ+8p86KpzHpBxQOy3hkePbu1zNH64YXisN+qoQU8r /qftW4R0ne4Jl2LZMUFveW39NrmA44IxdnP44S4kv9ubrmSHbtKYpvi4Y9fH826LWme788Htmlwf M50586GTfewQIhi79Big7IVLAszdbrv8u9OLb2j5YtTx2YlToYkr33ahhs6hcuOCG04E7436RdKz 3WOjJsz2Tpy4ew4vrt+ytL7rVEOnnyaNjz15Y/7e7uswDgpNM93ZVIVzf+dwarDGMzuXimtzdeGu McImu+6UzZbTavq5cc5unZyzHTxn+rmCzm7aKRcTFHYgIPnt6/OrRw93KCQxOucdxk5a+N3Ip+1O jciJcNajLsudYETWRB9y+rYEPeduXF4+7UhhfGSdE8OWE1/NYQawQy8f/wpQUIJnPSCZwIoc3ML1 vid3xVaHcswy0y2u0xnedYR/V4Ytdz6q6/OHlja7CybSfOfQ6dr6kfvXltfuOzZBaacApRUTlDZB aeOB0jof1QlKe86htBm/v+vpGPEynW5SpnMcy3TesXLv+vyti8vzG939Tka2SucQZ3BsqnQOUf52 11fp3HUOuoeWwsXbxZzcrvI81rPd/cBOlJMb1Qs1LklNh2JJRwWt7TrX492L1ibIbHSRWXdP1gky O427MGRNo9HHZrvGQ3qI0KkRry7c/ZCNy10fu9Cp3ZqZpnMQwSQxTf8EdzYxze6L0xkCz4047VHd +c1TlIdmZA/fuJCkscyoc293B4IJDhjdKzLyKXW7n7Ohr/uoetx0CHHLWYEdqiF3Y2cr5IH751dX F5fvXlxeXBhG/dT/4LZP8q7ORuMTnWT/gztGh25eOnpkeX5hcWVxdeO2+SNjRIx2X3q3ezurEMaG vHZH5CNOXlPOtum+r7rxteuMTzil28ieynHhvcczOd29nZUnY4Mdup+sEccO3cvOnorkGCN78E4D AhiV23d4fXHxg511sYeXtorlarqpLe/Atq6urXaez/zCwubK5tZ252xW+SPbb0lefmj+2Ba0tYEv N+bXh0KY1H7b57W8tLo437ncehASF25b28qZPZtYemD7LQOdd+vQVvXmc/vZ5o4UQ+2M5LMbJq+/ HUff9ZI1n9r2ma4vovDYeZKHDi1tLD04xPziA9vP8Hc+kPcu3jcEf8KtR9f0trHWXU5eG2Ve6/D6 2kp3IoyNd0gkmV9dWpnvFLB+WuShMc16tjBxhhlVeWim2i3OMN0P2bhoPybOMCOi7p2UaRpfb5iF XecNMwSiG3Hio7a/LNPInr5xIUpj6Q6zsOvcYXYPEhjiioy8O0z3czbq7jCdxYKJO8z0xB1mB+jQ xB2mZX92SD5a2HXuMEMg8hEnr1v4wOxid5jup3JceO/xdIdZ2HXuMEOcrBHHDrvaHab7wRsXBHCq 7D/j480zxB4Oe9V2aA+HSSg8KrswhGPZZBdO2y6cvqwbY7AJp28AO/TyXZC10XRPyjbiaRuHmMlo p22UXIZ3H95cmd+YPzicUXwUNZG7Mp3hEHPa9ekM713eyk90/CTEXZj3r7PMOykruu1XaC1WT95t F2kY5LBrbtCh7tzSoZ1gl05fAq0duvZj52l39Mjiwh2bW9zfyW3fydvevQz35vrh+YXFu4czpDce GmG9cTiom8vz6wfWVo9uzK92P4P9D46w26cM9s0foJqXQ88yPbgDkWpBBgpjnFkA69L1D92/1D1n 7dGNY8OcWWo9TrLJjFeq8ykYcR2HVkPMZbS1HDNmmLl8sPNcPriDPMida0urG3Osv9gRbejdjIzm GCNM+KGd5od2Z6neITdr1Bm9E9L1TGr0nk6OZuPO+aWtuLDxwwbz60sb968sbnSvCTdOWGFXFr0b GtWNuod7Z8Hvge4zeWAnJtKZe3xgC21XPhE30hPZYu/yieiRPlpbOOfmE7HjTjvHR1Ye3gixG/1U RmU3hmWCduNeTHyGRs5n6DlYVvR0+OCMD1WYeHeMhaDSOQh34t2xg4zV+uKhoU7duFyo3WT3nXh5 7F4vj/EhuyeOM3ajIDAqu7I9Os4x2JCJZDZyktmM9vt3i6dD95mMtp/Dc1FaHi5j1khGrNhJxMok YmXMRLBdqNMoJjqNkeWEJzqNcbpJ3ZNEj7hO4/Rlu57oNEYYZ+xGEXpUdmWi05joNEZVpxGEyrsP ry3Mb2wGwXK4dHC7zAw7id6e3JkTuDPlc/nOdJ785M48x+/Mc0tPe/dGOLQLWxQf292oYVLpZlLp pg2lTyrdTIpctM1EzU4K3Zy+XLujQhXWF1fWtqqZ2qD9I196emn10OLhpdUhUkKsLx5ZnN+4eYjS v9kTO0AVJqW1I02YlNaG8UxKa58a81d3MpZdMXn/7Tj8rres+dS2T3U319ae7awEGfVq1EOwYJN6 1B2VR2NZDHB3JlUZpozeaMtKk3wqp/HKjr+udbfknN8tGeefW7pvoHhrgeJ9cP7gFlkoxsFRWe1C R+Uh5rTrHZU3cv5s1xgpOjvxTWwU/RPcWRsFHMjdZqXYgSr2O8S8TsS9tVER94a5SBOBbyLwTQS+ icA3EfhOTuAbrpzsROAbvTnteoFvt/qldXZfn4h8E5FvO0S+zgdyIvFNJL6JxDeR+EZU4tt/41u1 Ovjm1UNR8gOQB8jB29dW7wxdYHGoGQLftHjf0mr+w9TtR7gP/OnuYyuBWw6M8/r8vYtHF9amZ6aP Lq2sLIahLKy9ZkpN3xj+veehqc2p126GWd4c/nbHlJr1zqu6mlazpipM6cKXWpeFK8MXBQAfvnij fVHDl9J4B1+MsrUx0/fMh170tMJ/7jkW/vKd4cs/CaCHpt30bdPvfo+aPgSvvWtqplLWz9alNtOV 8fWsL6yfXkFwMattweDCFNMEs8bmTQnodO0I6HQ5vQCPOz2rVFkB1ASo1tDUVbNKKxuAzs1WpQVY ocNkK2gYfq2Uruj5IjTwSgO4ni0LVWLbMry/KKFTFX6uHABLNVuE5vymOszkAHZQzdZVDe/yfraq Qr/UQWkRWKhZXVoBhmF7ANpZ7+uCR9AA82RhBNYh0IcNMH76XVMNcKlnnVE1tg3rVlewWmVYoqLG KZR2tq5xtcswL6cMvawMcy+xg8qGttRBVc56XSPQzWrncQS1D2uIHVR6NsyloOki2OXgViCOtg6j LUpYxiocHlXBKoRtmTW0NGU5W7vCIjCsgSlxtDaMgF+mtZu1ykMHpZ/VVQED0ya8QtMahPWyhUZg EdbAwe6G/QiHlHYXwKWyWsBmWmA4W4Cl50sdn7fh7ByQ5w0uQk9bU/m+Tq3ve781s1rLvLw12NbW szocluasXBHOsXG9KxDOn67DLjVWy4e2BW1iWldfhWNU+GwPcATh+NThfjX2VpcunD+8c+kU6HBO nMV1wRPjNI2gB6xMS9sAhA3XobfSmrpxEsMEZ8NJMI0zmwHlfOPLAKzx4stdmEOwD7ur68Z10mE+ zlnXuHi6MrNwP3suKfSrFS55utC6CjtV4TKmq69rTX010YRRPqxulSOUcCzCbHBQCfMYXcKtKZtI CqDhiLsGPgOgIbwheA9AztdZM3m6MJ6hSl5TmqIgmLVWYMprgoUzQkcY+ywQ7/lwHV24TXMRjAcr gE2YsrzfKcfAcMsEqGpDwLDqBY/KBnRI6Dict6rGCYRlChsK43JmNjTBva7NrCpxT1w4jHBs8GSG 5a893q1w9kMrPNphp31dFbT8uqjosIQ9CXtJu6fgFtHJdHIPkTTgBsDd0L6GDTBhy6wr8HKFDkpc /3BPXRUODd1OP1uWuDQBXIfB4O0ENG/gZaYOZ5TOWkIP4UZjB4Qe4LSVRbMtbJc3Pb3qQH18qXtG ABgy3ArfGC3g6FKZojEvFe6Or4zvWQMgCJW1vrFeQNNcibczrSzQPwtkvLkLCh+zzR0L1D3MS1WN vQX6qwyNIDsHSNaJ0KQzk9P6eLoQWBiXncQD3AFvo5zbOQEr1zjiAKuUF75A6Z5XxUtzODAdN08R UuQNqoDFCau2guBArwq8aEgPCakG1qdG1BOwcs1oyoXl1bg/pQm0rOKTFxbNK0Q9AayVIQxez9YK 8QHsVakt4URvZ6vCISuADRwja6FB4WTR0Q+7ZnVdEe4LjI5lBB5mX1penkDiCP+GCVQELBCLwC1R s2VV4C2xYayOSVgFA0dMG5oWTAACorZWcEpV1jUDA8uHWNaENfVMghBcuQw81w5e7gdXNF2gCwqH BuyWtYlaEDSwVtbTKoa77lVhaRvC8cbnS2BQELWF/dJa8f0Ni88IHDBEQUsT6IkzeFXDzEtF9Kr/ HMAhAdYHiCLO2QZ0pMLQkCkNKMvUFd93VeHIVPhGIzNV2BJD9zrQI428VwDWRbg+ODJdyLkJiMGH WTPj4jQSIRuGC/wtAJ3MwTpAPD5ilrLAGduC0DpzPg6PP7AQjBxNWLsKaXnAcnXg1XkEgN+1I3wR mHx8mQ50rkQWNmCD2EG4aI42JyyztyWPAOgyHcdAWMIQuK3VtLuBxVZOOlBVzbwPohDivcJ59IYv CSMGWBjDHIIFnhHRswqzsd7SQaiBbSDuTwlnHfotmOoHqms9HdJCmK9AisLm1nRznK2YwARwVWG3 gPsqX3Lb2pZy8lVR9AADFwUIQToQsAtclOf313QKPHAK3GlgKsqCOQlXeT6fCpYDyWnAw3ijAehF tnFALGkAKhxDg8Q0AJ0veBMDr6xqYjsCB2QQ4WmlBXc4oEoMCvKbUM1ALPhxBYwD0wxkhqitqlDg CViwKEp5va8YhyJbQM8HcCWo1TGeDECjqsiO1JUAbcHMTGKfVcA4FVKysAMmcBKEOgK4ciguwMZY zxJAoFs1wxRxcwoITc3AgABkXUuRAAqQ/jQ3Da81xCKWgSzI8wWx/2EpAnsclzUcrA== kgiRcPXheuua2BydhBUD+84bW9iqjB1oJ0KjAvxBwLLysgl8XMPCIAVHoCoNn6xwCHzgegEcKEw4 UDzasHwV98pIB75VwmW5imegAZUgkxJOZsBWFfMY4RoyS+cs8bMZMFx+r+PzDA0Lg2iPgKVFUboA saUw0/ImkU6zAYT1JDYrXMNwayoebGA1LaEM4ehws3BWgOVhqnI0mCEqAYXGu6FZigvHSLBDOFsO 17UAJquSDsJVZ5yDvDsyDXXYJYV0MYxAG9yYwKQGvsAxeqhYZK1qwEm8AiiqIDcDYFPqDAzAwIYp IqEBETnD4i1QVuK9vCfegZg3V6AgGKiwq0vNwnjlabvCOTbEPaogIwVsyeihIC5CBXnKaHzeWeLz WqkUkS9gDpCaNckXcMZG43VMnQARDeKKabwOBLmATXtGBs/XvZPQgavRqme6OixzkK+tLI3mzSkA Sdh8GeeEHSvwbbgTdOyBQbJpzwrhpTxypbC9vmBxGsEijovEFoDhXXI+KtKUAIsWrpyXo2RKFrKD HFA3Dx3gZiXAdEDDygV67vgwM7UOPHJZmrp57AOQtR+NKxLIcVH7nusUgKgGaFy8BMzvaAZN1xnf hYxMdvGDTGptIUgCpFvqoCA0lOMTQDckCWWIB37WZR+SApTnrG4iNA/8U100UV8AMn+GaNIzmgyj QbrfQKlAIZ0InoJ8w1DDMhe9iBpmYHC0GVIHoPamgf3heUvoKCcUAWyLQggNE5UA9JUwQUx9gJLy aWFCdYBXIGAxkduBrM0x2BirmyQQgK72TWIJwFL47ERYPTAxiQYTHxaAgR8xTWodgDrtQaTsYT1L Y0zOA4SHrK17eIXwfqtU1ctXQF+kj8h4EPga8YNwK+G8ea/4DOGgqAPQCnsnXBAdDQstikLYJWKQ M2DOWmXgxIYFoHdedoZ5q/CqgCKqXuYO9L4lbW3kA8NgWSOUMYzhcpja173MpQ24hm5nxogGZr8o 8RhlLCtw+6T7abK3FWGQJitcigyYM81l4IIIQeUMtg2SkicSlphxlJFr1jwL2x5aKocErMHik2gC 083EAVBfFAUrRaLgEPCuq1CayIUM6EDjJmQCSXisMLZHdAnI0GpcxIaY40Ghh4uYiUQwG2uaslM/ nWICZsGqQNJLWA4btmyF18aQTAIYjdFUGKRnnWF4ijrO9LascSThJczHetdsqkhr0egTNDie9Cf8 ftpcC1PnFQ+IqWJRrSRCA+sNZKAxAFjvyrGGIKxHaOB72oICgBBy6rV/BVg0BTUE8Z4i9KJoGshw bbCTJCCDCaAkjISiNM4tA7LUTRojuG/EKGfiPFg3WCELF5JuNLxLFaJmKFxJHIohNUJTzwCMj+A0 UUkA36K82HZYdwEsliY7Cuo5lKjCwuoS+kGVCDatQaND25h0Jwo06Zb1yahnOcDCSuVKvruobySG stDIcIj+5p1TxNYjJsl1PQGNi6IkKoVgUIXCSaHewLEVpYIbXzV1DEGoCgPwbARhbUTLJsLuvvYd YoUjvVrAb0z7EKeJXYxPG+i8QfQgYCDaOmtLwMAVV7zKViXLmC9FFV6DSoTUfb5EQhvQPaNYJfwJ Ivlwz3lHCtR5s/gYyDCdNGAbUPaCW0RXHs5J4A8sHQnEhXLU2MwQjoSFp8heZonMAakn6wf0Wle2 pqMaOZBeME0XgEoxD6aAgRDTGIPhhogqVYE+GvcfFsmSIQ+sH5Vsqjc1m8YiY1JZuhi808QshLMc JB46lkF6K3HHwk7XIBmIaYxVtAJuBYpprLY4sABGtSqdbCSFeFicyIR1jUirBHLBSn0wjFWkFCx9 VHIZNF2gGiWsliO2JBCfcNENXSElNgUEk+IZwECTBIhYHoBZB1XswNmaERzqdYv+trXc16xXkczz EQCtrZyW0RL9tGDKJJ1RmhcwbEVd9a6BB/0SSptxtQBLWdrCtKoeDLSmznaA9Kqgh9fNnQW9akDz vnEGQLGqFN4vPC/h3pNetAkmFN8PJFUnGDLRIJ3OIRilAqX2jRObAeV0iwHLh7OR3YQ5BodLbxuX CWwobLlN1w41vjWqYvIriq8ryYgVr7MGDO2JRY8XH6w4YZN6kQRYfGpiQhJCAdOY2MQj6gE7Urg1 ugdNoXWLpJSE0gBYFVrs54T8jA530RQua0kdBMRKZwbAxMkBMBrXKufl+cSMI9d9gJ8PYi3LWVUR UPScgA0eLwCT7IBA9jYoyUZKg61L4mVLssTTuILQXiJB8lpEPViuikR+QxY8WllUKiDj7SJ7V4Hc iuvlSpFTwI5J3F1A5Kham0ENP6toQA5zsrXhLJsauUYgELQJcENK0m8YH60JxDdHi1Up/GU4PQ4x dbjCIr5Z4FVRU2lA10L6+YQjwq3GDg4wF2Vr75ttYReM6uk1HBg2iecjACwZOBHXGC1qSMrGrIAl CTxY3bMCSGpqVB+m1QKqplzh8mUF21joyvbsABDLkuTXtFvKgb69Mo1tRRpe1a7nCCCYKE06Lhm9 TwcLgaRtl0N4gDtghCpHdk7A8STz8UanGaIJ6R60MBe5dayW/QHbEQhJYh0rLFLzsNQihoEEX5Al rEh2VeD6K1bxo9lcxOZAeSsCF6z58KgIMsyfiZomSIpBvDXEuDpSsfs6qvOBdNAlARa2KlnJAp2L cawmgzXqmcjeHA5+4XDbw2kX2RKcIrxjrrUqy2gcQ8RLNk0mAhXopmrulF1cAIMHedHS+1GOPTAV wVUGnmsHL/eD2TQcgIGw4es8mUWFZDA4rExV0CJWwNo6NlKGk0WKuUqMgeEbGFjJOGYFiYOekt0j wBukNuz4Ifb5/mOQjGOBR4A5g7iuq2gbq0ipEi47GuuJo/Y0MJA1k1kEaRLe/8Cbi12mlFMTZB8l prFwaRz1aW0hdiWeQZCKkUGNWIX0hRY1mqV0QApxYCEYMQaJj7WIgOFAoUnvR8xeEbao+dCAGS3a JGIHRTQ0VCRriVeQOK9UJBXQaCuyw4EHkKZlCcDCS0vEIAssnopOPCAWRwocsBkyjwDSJ1tbavAF 0MQjoGXpAOvvA2fN3Je4EAHVNZ7V78J9gRHMiXIyMw86wHNsmcHTTkAfODE++Ky/T8BwThT7keVQ sLdW8i5Xkl7MAOalTsO4HbJfoL2txbQUlqNEQgoKLFWxsIYaSWQlogknMGd1wRqsWvT0wCojz0bK KmvFWmNKQe3GkM5XhfnRxQciEM3qAaxrYXxEfROAKOUi5kBtG40g4FrhW4AnFONYSfo+wKxshAqw UtQOyhCbB4KpcizwJAYarT20/iWoKuYY6MJB4G1xlcgAhTVsxwSUycDSlwwEM55Yxth7CdwddZQh qpKERi3OAvA4kTZUmHobJ8VWmcA1C1evwBZN/I3JZRVHNxZc1JJpDpEzG8yQYFCv1tvItRQCrNlJ pUIVzQKbhbSu2YjmWD8OEyCmBToVjFOTLEAqyEKU1uG4cbfekb8m3QxXFMzL1c72AAuQEp1YthJY I9IjmCW/kyAqF1aLua2uHOsxGgMQC1IRVYBaCY8JPEm0eDJFK9kUIOdCvAMV+WPQ1ShJigM9jYmW WFAYEhIodKYIUa5kIQy5dzpa4Dmn2J6BKnaSTjUfLUc2LlLQlLUIFXX0VUKwYAeRpQNDWpcudzoT 01hVCwn2ytfMuClS3IDtgtTmIIyLV284x5YJM9jGSpJlw1Vm4wl0UFaWVWWeRMZ+IpVMY+w0lhEv 9BmrXLMLsIyVbD6PLwNJTjMuyAYGzIXvnQSYxgpa2zRdMI2FsxqXxttoGitZ8uZlnGNezJGvAe4E HXzgjlTcMxKD0NhiRHQ3cMAWWBxmcUG2nTixMor5RZBMo3EMfpPjxDpecP4TLww5eGAqLKNrRjyk LuAJMvvheSZ6DUpihwQsO/lgQCD9R+OWgLNZYXtuFBi36lo3rl4Gy29pAmc3Gt9F3HK6+2GorHQF PFEKAUSLjzZNnAI4x7mqiX3gd5ZwM0QFkjH7diSchs6lRd3EfkBf2FcLjlTtkgmHXIwyrAq+faqy TfwLVkvr+3C1Sy7PEa273OFC8D88r0rdQyoCtLZWN6kKnH82tiT6A3KSlvcjrRIuvyx0TtfEOFbW cr6FBgYg3MgGsQSYFX/+RFdBY8Bax4IU9jNoI7alaB2FWoeWZdqCSNkDWCyUiQsATo9M+Bm/ACMo KnFMjbwF9Fa6qsmH4NeiaDAs4cCz8xfum6uTaaq2Vtigku6BEp9tZJhI958BM94qQTM2DMxg2sjO MG8VgOKenjN3YF0go2HGCIInAGmFMpYRvJkLEvVy9jIw1iXdzowVRZtMqZtMK5iDyDm4yeDCndC9 zHAlEmDONoevXvex2NbB1vWw4yjMluwHLIw7mNE0krAGkw/qRW+YLMQOtHif5aJDLY7zDTHDRufC TCSx0SEpii4OvMxwCRtCDigHyJ00E4jg/ijVIzr1ESoxjYXL7ohxdUSKxDRWabkK4kEAcQaF48us uONMc8tKR5JewjIpYSdj2+isl/UaJK1Am+tsBLS54HlANNSQAWcGJR1WKON6F745AljvwJfxCAKB qgvXbBsW1JEfb9Zr/xqIcQy1t+zBCzIv2cbY5z8Xj9EGQAgJBWm0a2dAEboPsBXMlqRmzcR5DP1h paySGw1Gj8KKszy6mZGnj9G0jknNALaxhNNYIwGMS2HkmrPuApisgiwpqOZwogjz4ODHNxpDYpij I0Nr0p2Ayx4ZrFjLQiyhF89TdJklSzGw2lXJQJQa3skcPKKyXNEDtrHakrI+qoSQeSyqqDco62gc Y4Nm0jGoCh3W0GQStRH9m8i2sXdM7T943Y3rG414yP0Hbwj/TtXT17xm+p7/Lgufo8C3llC4t64e bka+6ekbj3DcWxVWIdwB+ELxbyX83adotmFC28CvtlDiJoguoys94DA/zxcFHFxQVxnIU1SgavE0 FWA00BMlEPAcowDrtW52ETAma3Gyl2VAHphgVwYDOY5hNhkYtGW6mG68rDDRmpAGJkAxu/M0BIz9 pilnXaTFyV6WAXlgB9rXdw5OyiZsLuwo/aPxn7BzhGIKZ4RthEO4wmAV3a/i4gM1EtdRVsii1aqW 2xnjgED1Y0yhe9qG2+mjtwGzPAFLOrJdAnsT6VLAqcy0AMevSAEPKi2OWgIWk/ijDBg4c5A0pQMB F0QJGFOTXg+M76TqDzBYcOI4yqrWCXuT+BDA4rxkYOfRB857kuYJWJOOyIOMVcoM4DHNEraBfucY HPhZS2DlC9F/1ezmg96xEivH9AO8C0th6U1BAiSCTUkMKQArEucNsWgMJM7XG9KDCdNhSR4W8NxU Y3vhdexHB9477O3ryMxGQPZBDsDAaMiKBQnDSNvoUhOku0q8IdH9nYCBk+dlRL5JZuY8aZmBzwxM /5ycpaIWTlfVccIBLfNO+lrCjxRr2woIlCzjTgS0y+BSidK0qC0bElSmhoxA60UEaQ== gNljAtSYqmYNkJYbAqbISpy4jDDK2QQqUIZx06ISmDiBoV1YxBoEysKKliBrG3bROL4LJauoTaQp vqIIBNlxOeIlecUwS+q1eHdrW/YBcbsWhMciI7SAlwVMPlBwHz0tIgaGlRKdJ3xTH55h7g2m4SvW L+LtXRHVsXVlBp5rgsFj0Jt4crkPhi639zx3SsnmHev3za8u3bc+v7IyPz0zfcv64sLC0nxvCPnp IKN4zCXaClVUK00wWOdqljMNxCxY1hCVvqS9N2QmRCIopivQtlMUMUj14FN3QDqwIv2Jj5iPwoQm Mxy9P5xSNjjg7REXL8tayaxtHQfgY7AryCI1mRfzAVglshM4K3t2MgOpWGg7Ctt8UcjkAitQRA8M BspqzbUvIhyP1pNxzQy4CIUzXWRJC2666UaonXPX2kYskMln6NQdsTs3l4/Or24shnOwsrZ5dHH6 yPriyuZGk1vDE4ZZB7qeH1WRqx2J0xVzYQkK9lxNB0UX4owA9lxtxZkQQ6wTcIGlYbYCZW1BH6Dr stlrAvIASByP0CDqoRNuo9OybJw0GoAASaUcB5u1TdPKeu1bgYWpm+6NDNJN9wcW+Jp3rEIuikPT 4YYfWlpc3Zg26jXTM6DAADkf/VemHTiqBtIfTmhpC77B9N+b7pvSgbxOQ/wvuCLI/2cQysieDPxg WAxXavqmFbQ533TTZJNOapNgbwKtAbVa6L5Ae2HYnFkFisyePQobiKI3eN0UPv1/Rn6gmVSUnwGo aqBe2U6BtAQ6Ae413D1MQ3LL0vLi9VlGkrvmj0LmknDzQ5tbp94dhzGDejT2ZS6BqQndv2c6UKvw J1zY+7duCz9Se/pTTVvg8Et8LkCm1dT+/TiKm+c35q+fBoF/6p63nvvsMJ8r9/5Axz9DdXvK3346 RnJibz9VIzn5t5/kSE7tAE5gGKdjAEMN4/QNoOMwTvcAthzG9gzgOMPYzgEMGsaOj2H7B9A/jB0f w04NIB/Gjo9hZwcw+TP5M/kz+TP5M/kzXn92nHSOCP+w48PY8THsOGs9gvLF9g+jdQDbOYzjDGB7 hrHlAE73MDoO4PQNY6gBnI5hnMAATuFITubtp2Qkp2oAJzCSobp9XvOzZ88Z8bNnz/OO89mz96wL 9r2UP/suOGvvwNZ79p69b/8b3nbHnfi5421v2L/v7PbW0PKqm5c+9Oiv8OfRDy3dfFVr6zPOgpYf /q3P/dVj/Pmrz/3Wh6H1WWf0NN17/uUHQsvPf+Ub33qGP9/6xlc+H1ofuPz8vT1Nr/nuD/0mtPx2 WqJvQ+vf/NB3X9NovPf817z3Jz/9WKMlt37s0z/53tdkjc84/5r3/vRnn+htSa2f+OxPv/ea82XM e866/Lt/8rNfe6Z9s5752md/8rsvP4tXY+++Ax/69BMDmobGT3z6Qwf20Sj2nH3V0m8+9q3Bx+Bb j/3m0lVn76Fu3/zhz3+jZaxxzN/4/IffjB1jt185Treh469wx1t2mzrec9b+rbqljveftWfPBW/4 0OeO3y10/LkPveGCPWfse9ujf7VFt6Hjv3r0bfvOOOOld370sYFrK59nHvvonS+Ftr/Spe2v7P62 3ddsiL0YZo87nZ1nvvo7K1eHQ9nhTD779F//0t0v39vprD/ztT/6oTe88IxOd+ibX/rIuy/Dm9zh bv7W6gxjiA53/uaX7h0elwyDowbjvmef+WYv7huEU595+mtf+ve9OHUArv7qX//RR1b7cHU7Dfid X/qhd8+8tI8GtNKWlbtef9n5gylRg2Zd/fIXtnQaWzdo4dl7zzge6Twujd2//82rh8CkPHXPW2JN DjZ0395wI85dm9o8C1Z23rNgx30rOrg2OPI/gXxZahac5yGkS09DnIu30zO0yOF/uiggI5Qr6vAV k6N7q8HZYQbyVIE/8gz440FAS/wSfyHXRkupgysKfEjuDu+I7ksDXJyumYGcr9rXtpOvFDguoaND dFwK/zs0VYiP1MH249IDP5EDg12c1JHBHk7u0GAXJ3Vs9h9cPdmNiMWGwkM3vnX6xs2NtWm6xksf zEoE4Z5NX3PjobV7Fw/e+Nb64B33Hl1cf3Dx0MG3LR47SI2Oco/5WKavu31t467FhbX1Q+E0w89b ndTr7lqcX75tPvT4gdB6+poDN771Vr4Ebz+8tr5CP72mf0RhFe7eOLa8eDC9Pztr4U7duLq2Oq2r Eg/XJv7D7nNNz/hejGV0DNbjpJErPWBH1VrEx9xx8laJkgVn8LowGVA8e4u6tD1tweGdYs6zXhOQ R7Aw1QSXeXZF6bWSTLHZAAgmTvIy1tQyTSrrsm8BwH93AA647rb5ow/gNzV93U1ra8vT17x19cHF 9Y3FQ7QdEXzz0tH5e5cFfM8bwn828fdAOfYfzD2pDvb5UoXTyt5U+w82fKSsjj5SWnykwn+0In+q Dq3xR3yC/ltlXmPsUHWw4VKlrQWPquNQUvz88/jtE08HzuLp38Pv/4kZjd+Bv/wN/+Vv81/+E7b7 fXjmW5847htgXEKVw4K+RRYuUeb9B29v3zUtmxJu0vQtmx/84LFp2MfsAu0/CBse/VcP3vM6vJ6h K2oUe5hbWn2gb68PLC8dORJwRLq34cb2vIGW2JAj3XGcWHvIxOk7hxka2IXn8WXx29Vvets9t934 Wvx+5Z3L3/c/fP/anVfCX677nu/9n/7XH/r+gwb+csWdK9/333/f6nftx3avfeN3zn3nm66enMeW 89jjzd/D1GjCbwMIS+8PJ0BaqIuTIi7UxUmQF+rgZAjMQN7m1HMsOYNwPJRyEh78q4FzmV9ebPju EwMSDkOvE/FxztrQ/sUQdO8lXaaGpGvvmXbltKta/Ivb2qJ/Mban/27lX1yU5fD+xfHzJv+Dx/9z Yt2ewgFsz6hObBinfEgnP4xTNaRTO5ITHs/pGMaJDel0j6T7eLZnJB3Hs52DOf54tnkkxxnM9o/k OOPZqcH0j2cHRzJqg8nHs+MjGc3B7Pgw8vHs+Bgmg5kMZvJn8ue5+WekbtNkMOMymBEZzwgyVyMy ntEZzCjLTTs4mP6R7NR4Bo1k1AazzeM5/ki2czxdRrI94+k+ktM9pBMYyekYzwkP49QO6ZQM4+SH dMqHcQKjOt1j2IZPv/U5ui8ePz6Am+4986xzzoXPOWeduYVb5BlnnnXuBS+95LIr9+/ff+Vll+yb OvvMgQ+Exue95JIrrq3e8vZ3vft73v2ut7+les2l+84b8MCevefsu9zd+s5Dmw//6E//7M/+7E// 6MNH3/ud/vJ957R4f+454wVTl+jbV/7Fjz36737v05/7whe+8LlP/96v/9TDK7frS6Ze0PsCdBR9 48LDv/jxz3zxLx57/Ml/+Id/ePLxx/78s7/7iw8vvLEv0GHP3nMv0ndu/vh/+PzfPP4P3/xH8nH9 1j9+44m/+fx/+PHNO/VF5zban3H2ReXBhz/6yb984qlvPfNtcZ/99jPfeuqJv/zkRx9+X3VJ3n7P C/bpg//Lb3/hK1/vj0n4+le+8LFHFquLzj4jDWVq/50P//afPf7UM30+v99+5qknvvzxR96n970g +gefc8kbNz/6hcefbnVq/vbTX/vyxx6+c/8UD2fPmfvMwo9/8itPDXCB/vbTT3zhoxtvvJiHs/e8 K+54+D/+5dcH+jV/+6nHPvlj89e9+PnoMP2CC8u1X/x8q68yf575+l/89j+/9ZXY/RnnXfFd/+r3 /3bQUGg4X/3MT77nNVN7ceR+5Zf+9MnjO3p//cu/frTad+ae5+0565Jbf/Djf3O8zkP3//jY7z38 lkvO2hNW8bK3/8gfPb5VaMPjn/7Rd1x+zhnPO+PcK7/7pz735BYu9c88+fmfec9V50Hz/d/zM1/4 h62af/1L//vhmQv2YvOf3bL5t7/5F7+xCXPt2Pwf//Z3f/CWi8/q2vzpv/t//uXcpWefpt7zsQ+1 MsOt+3C7OuSZGfJEDnne4TZVR375i8frPr9NcFfvOm73jbsql3UA3ujDBIQKPvblrw3AM996soFn YHH0+x75+JefaMFioe8n/+J3G1gMMGq1+MjHWnHkU49/+Xd/5HCd4UjA15dU74sYOLYNGPjJv/38 xx45fH0DA+f4/YlvMHpH/P63f/r7v/jw++pLzuulB0w9fvezf07Eg6jHJ375X63drnqoQUabHv6p XyfSxLRp9bvKy1vD5JDy+e9871EifEL5rrhwAKkEurrv0tcQWU109QUDo/vCA2dP7SOivSXVpgci S7A1T0BP7OkWkdjpc/z4ioHRFaqKSZA5c/ZKEww5BA1liNaQKLZi13NnYzU3qTjFQIlucL63LRQE odzXWa8JKCOQ1JEMhlIOnHQ29QqFscu6bo5AgBLgwaPN2qZ5Zb32rwEGWLRFVXjDURUVLONMHZZz Viufu1hiokjM+Kmw1C5Uly8gCzN8gSy26ScsF8CvxkLJhZ2+Z6X34XrLhy3Uo4O86jct5A9bqAJV uS3fDLUpDKapHPrNkLwXsyXftJCCPhSmLh7o0djJh17VsVZ9TTW0VppgB9W5HBXTK6UGPVaAt1XP uWSglF8tqQBk1tZBJnZdN3tNQBnBwlQDDBWheD1Sr2UplXXzc8lAKdTIo83apnllvfavASyynqxU p5XaOkRKl3SZdVnC/7Egw0wFxQxKiJPSkFy9516rWa8s5m+HnNQW6ivEL+k38npVBddNr3y4hHkS WBW7pS0MqMooLUmnocrECoN1XXIpEmO1FLXgSrtQ70cKBhWUqJ2AsaiANVBzjsG6omzccGNLqjik KBpJgJXkt46FBzMw1PCuJPF2pbBYMGwL+Jw3RlBCzndJJQ+D9bzbUr4Ap4XJ+EOnqqjcdOsSHBiI gwtM2gvJwwkFQ40b05erN/zmoCRTHVYIaklUqhIcRpVBXVxdeHdAdQH1QpwRIC+oNnH8h6qCaogG xBceslCAGupXbfEmD1WJMESu+5ug5gwUHUso9rTG0ZyiMIY6BibUEpgQqHn4f2sYQ0tr+JGeoP9u GcZgne4SxjD48+ZD73/wA8fC5wObRw69OcEPHPmJ3/q/P/Xpz/zxH3/m05/6/X//E+tv4R9uefg3 v/j3T7E09cxTX/2v//GR91wHP7h/+ht/8XRD0vibj//L2/CR//kTf9fkz5/8o3/9Tnzm2G/8eeOZ b/23j//Q2/A9t/6Pv/Wlr7Ig8O1vfeP/++LH/rfvUTK2f/1/feKTn/qj8PnUf/7Ev/vx9VvSuG9e OLL5EM9n4dYTX5exD8u4o4lxjxuaoYFVCZjHnAzmCXc0j+6AkpQD2aGW0Gc9Ie0nS9prJu1QKwJI O77BBRoVKIuahfoqven3Z70LM5qBOtoOM+/HL/wLlS8qsOZFwMkainkmqj4GOBmKUxKWhTKsnDo+ IFPdipPbWmNwBz5B/906tKxwnWLLTv6z9AOLW7ZZ++Gf/z//5M+/8Bu/+HMfPjKw0Q== Az/yq196UvQhX//irz5yf2uzf/qpx5t4/O/+8J+1vPHnvtyv7Pnyz6/2NPv+T329TSv09U9+X6PZ 9/6Xtlbw+eyxrNnKpwY1e/bZT62kdj/z5OB2T3wkNnv/nw5u9uyz/3VT2v3cN4/X7ul/w82OHLe7 Z5/9wpEu3YXF+Tma7BeO3+zZZ//0/dDukSe2avf1R6DdR7ZIxxIOBS7No1s1e/bZn4d2v7B1u184 He06jO/RYeb7w60nNP88+cPQbnWL7Q37QUfw17Zq92/pHPzYFi/+6o/yudriIHx2jQ/gT331eM3+ 7ifkPD/wh8dp9tQnpLtwez8zsNnTf/C92cU89ieDmv3n5kX/Z59p3ZWn/qDZ7HnPe+jTLbfk7z7x vc/r/az/my/1tHriT35ira9Z+PzAH/599vLH//gj622twmfpkZ//jS8+HljWp7/6+V89DkKFz8oj P/Poox955PiNTsHnOcmqZrxQG9c6PC/Uw8DanPuYcK+nn3stSpQzYMOgoq7106hoNs7VgxTNkB1l 1peujP/PlQlhHr42XCutrks9YVxHhnF9XhfbD5iK9u49Y89xDUV79ux9/plnviB8zjzz+XsHNd1z xvPPPOvsc887//zzzzvvnLPPOvP57QazvWeefe75F7zoxS8Jnxe/6ILzzz37zH5jWejsrHOnXvSS C1/+iovC5xUvv/AlL5o696zeLsGYdt4LX/Kyiy555aWvevWrX3XpKy9+xcte8sLzek1qodn5L7rw FZe8avqyy6+48sorLr/s1Zde8ooLX3R+aJh39/yzz3/xyy66dPryK6+6+prwufqqKy9/9aUXQcPn Z34je19w3otedvGrLrvyqmted+1M+Fz7umuuuvIyaJhb/vacec4FF1506WX7r3ndzHUqnBitrpt5 3dXQcN8FZ5+5J3Z31vkvecUrQ7NrZ5WxLnysUbOh4fQrX/7i82Oi0D3PP+eFL7vk1Vdefe112vqi DJ/CWx0aXvHqiy+84BwZ4d4XnP/iV1x6+VWvmw1Htqzr66+vqxIavnb/ZaHD815whkz2gn0Xv/rK a2YUVKi8/obXv/6G6+vSm+uuvfqKV120b4qnjK8No3vtrPFlfcPrvyN8Xh8aOuhw+pILXyjtzjz3 RS8Pr732OltU17/+O94YPt9xw/VV6PB1V4UXv+jcM6UdDO/qa5UtQndvfOOb3vTG0GFV2Ouuvery S7N25734Fa+6gtt9R2j2pje+8fU3hHbq2qsvv/QVL+7YX9YOx/e668J00/jKvvHF+WrH8w0LUxVO z8B8X/bCc2Rdzr7gQlm/Mqxf+MT1e/XFYYd5Q3B7aT9CQ6ihivuhQneXhWmEDZbjcu6LevfXWcX7 +8Jzzozn4Oyp0GHjvGg5Ly/JTuoZZ577wgvDMc3O3+zMa0MzOH/npJO/5/lnhWMP5/nq175uZmZ2 Fs/zFdN4nvM8tWC6Dg0vnb5i/1XXXPPa19L9eCXdj+wi7aGGF73yVXjdwoW7bDrct33YLL+YgAzO f9G+l1/8ynB7p6fDBb7korb7Sxf9ghdf+PKLLr74kosvvujlL2vFB4Q4zjn/hS9+yb4LL7xw30te /MKpgF9aMdEeMKufd/7UBeEzFRDWAHyFBnjAbPh5AbQanLgXmsJn79aW9z342aLRyX8mjOtJsUEt KtdqcKLA4zCtUHizpPKxXN08g0BNamJXA49pLVe0rVVh+9hVBC5I/XdDVYhTWxcmVFZVo9MMxi4M CQJ1ujW5QMTuPFT8Nj2csgAXphrDzNqm+aROG7Me6PyA2m8NJkc1jcrvyhbHY0j1bFWacjqgRl/X RYMhdSbO1QaG1Jrc7yE8GhalrLZ6FMpPa8cmuCK8TOmi49tuGv5tPswXcl+OlRnOGeGFofA48cJh +kH4aeWcW1rDj/QE/XdLzrnQJ2mG6/n429/13vfNz8+/7+B73jXnen7Uty38ix//hY/+6q/92q/9 6r/95Ud/9Afvu8NmP1///kd+5ROf/bP/96//W/j89V9+6b/83v/xw++/Pv58w7FH/+DP/v6b0R3y mf+fvTf7bafZEsPyD/B/ICVRJMWtu0k2Ny3cF4mSKJHaF6pJNkVKJJvqJr97vw/OIEjyEj8FyEMe YvghiIMMggQxkDwE2eDkzQYCBIYdA5MFA79lJoBhBBgjExupqt6qm71x+X3Lvb+5d35X7K4+VXXq 1NnqnDp/9c/+/B/86d84kV7T8z/9X/7yr7Vek7/+v//hf7ag0Ws/+7f+/l8shxj/5T/4Wyy6Gu3w b/zdPzPwzvzVn/3df/0Qvf+T/+r//Ovl9//if/8v/wS9D379p/+rgYf2n/3D/3gSRgNo/rv/w5/r G/yrf/5n/83fvBTHHx39+//dP/kL/Lbmf/lX/9c//q//vfeoNEHi/t/8j/7eP/qnf/n//L//37/6 l3/9L/75X/zTf/Q//of/xi2hIjD58m//7f/iv/+f/8n/8ed//r/947//3/7nf/vfekrrlueqw/3N v/V3/vRP/85/8O9MO1cJoyWkL+6fnu4vU47W2+H//VEKTEMp6YQr6+RjWispTQUlfvmckTtH92Id h454qe1GLh3xft+NnDri/b4buXV+xvvnovoe9L/D6UQsTSVIIuWO1gGN+Ns8MxXgbbgZ8Eefm7gF ViZb0GeMNIYrDsatfIzdDSx/YtGEctCEtm1i34Ik7JskdPf/1qfCnJn22A7kH516CWzPmQluV8Ql ZYLLleHQ24GzJTAykjeGo18JSOnl37O9BYSqXRfD25hT3+TCRcrwwkVCayVQMo805dTwTsRYJJ5K I50bqJXy3c/qU8BFaCmQDvI6Kg25U4oEr5OiFZHEfotaPBUBHJ3WNiOArkqieDkMoPpQ6lu8qV55 Cm8MT1JieJkCFGjRCdir3Lf8W7RAlCFizdTJYACX5m0eQx1wq8G/GikFDZKkKI3CCcil47QWdCom IgAYCykqEgeSQt+YiiUidAKZMnJjoLDHIokkmUgaQSbT6MZSpfHERVFA2qSXhwGlELxqVNOYjgDD AKnT2sbiMqrtSOiKTseX26GbPB01Bc/pGJHWNjZBA7boGBqs7BY/EGTArkymHN3ET7pLLqhppCkS 2ktgWwLEwzinJJWIQ3OdiCUg3cBoKYAe2CYRBwIW/kEBYwsIc4Og7wS80R5d66rZO8pTYJ8ARSch RQymEuga/Bgg0bR0c38S+y3unTj4IqFrRgBrN5XSAVQfavaO8pROih1qgMLMApJIKH3Lv0XDXxki 1kydDAZwad5wqSDFJSM0oHwdPtSnwJqlpZt6Y6CLVALuEeggSFDqmOTfIj4SoialaUbQ4E9E2BhA 9aEGH8pTmoYdit4DBWgS/CXhk0piv0V8KEPEmqmTwQAuzduUl0hFLkga7gAxHYMgYrR1OkY8DlqE 44kIlU4pQbfipOPy9JJgNBSxlI4RBwYyHLjlxzGKjFCplOSYIJx2JQYFx8E2jEEev8pHiUgK7Cq7 caFY9DSdkD6CweGxtC0mwLoQSVrnMgmTsUgS2hl2H8cAJihK6jEWSSdSMMje+qM4LPIQT8tR0lAC pew/SkQSKTqtYJFME7ajg94gQHHyJ6lUOm6LeLCrkzRN67NlHBEG3HSpZBJjxZIfsiQdS0v8QrPb lac0+IumYpJdk0qk02IgosxFqCT2WzmnjqUpbTNgu5AwrlEDUH2o2e3KUzAt2SBSgcaSCvcUOY30 Wz6ll4aINVMngwFcmreTI/IYcg3D28bh/8CqK2QK7n6aBNSGlQxJpIBCEIcuPzKRRmYdXPB3F1Rn aEhV6kKpfykvUcgnkSBS4uAoIOdsT84dVzMxHNo3qmbi2OduiVcrpwLhvtZndeXByp2Cb2MxoCpL 0pigab08U5/Gk2KujOi6BsIgLcpoglayasACJbCHsocdiB9S2xamFMTEhypU9SFO5upTGuoDMdqt AQoEdToma3XyAOSHsp9dGizWVp0WBnUJA45KOYlrQknUSkuCLkmZyjmY8gIUQxJlpEh/6OJB0vGE RNVkgkZyBLqXUP6eIV0j/7Tim9Zl78FHp9Agckm1BDBjRa6/ZGTsGJpFBpYEgmBodhgaKDo7RnTu GBk8hqaRgRUl+rmMTC5D40xnw3k7A2OcEpLJDA1Td4+bzLjFtO8WhsyMdU+4PqvxSMo+yDpJNpn5 nOWnl4v5eDRlKxzfmvHMjyyPtbcwgpGPtHPBTZtAy58DRT8cxmoD4C9cFzP4JiW+aY4X4N/L7gfb m7skZ0uBXwhD9zkzZd5Z3n0J2BwfsH7nFl8WmfF4BCh8Nhz1pJZtjhtH3TH3bO6ec9M+FzVoCtQ9 AAJvT8P2sxHACOc2+kLTGKB5hkBYdKH9IAHBcz8wYxZri0AYf0AR6nisoCMQ4oSJpS4ApVxOwSIP NaBbPYZnulyvNxxx7ndWQCAEzvqjIsN3uWlvNOXcYbcwWEyYOfaFiAvbz7j5fGQ2OgRC/qyy6NtM oj6FwxfmPAI84xc//cQhENaflX8Y9dnpTwCtHM+CL/kFeOBkIvne14Ll2fFY7I8VBEAmAXdEpGuw ETRUveXdYUJWYBeQhELm8Bcq1gP/K/6/ytMJq6Gu17NK0WLPCfjfBAH/S6P/So6ZrfeMbw3UNXhA iZMF2l88IU966x3HdLh2JxRMQ92GEj1736RnQotsCkUhgn+ThIR48hvNGWeLqOs4PLlFVBaGMw47 nPY2t4PR1obSwmCLQnIB7FxWhcT24FN3IuqW/wOPrkgaWDBAa3ZLusim+8ZkiEZc1HSIFD5E8mce m8iqTccW/3nHZsy2TUeX+nlHB6WV2VjUkUC3JkEp7kygLaegtykC3ZoEdJdCjeRbD9VQbJqhMfnz olGvlwjmIyM3GdnKrCgtvpEtY8EVPZtyv5uiH0D/lsp3RS/AIIHiHM0D3fwHVn4bLUr6eGU0Bso2 bF8cMqOpW2wgPhVPMqJSk5DRR6050/u0/qjACKMe/gXPfbKWn1Do7/ElL7UFQKzcDlGxmTQ1FdvO 6tRFS+zAnXW73H4MDDQ1sm7UqzvrckebDD83mEsRSN3FaG4yDYsP4fSssWY1YSUU40Zgyz+w08s+ OoFESFOxYHcNjX1IhooaBbIJYiymKm4uPA6F1MzUXx4MWCjHB7BJhBkBEyYqbg4YECaRL0Q14LJA CggDrgflkzvaHs3HtsRBRohELCE6ntz+a6Y/WggOV/cXHjm8hyRNrTXywpgFlvba9BVF36+6n1Rq UT83JRdXVDkVRy/Qt0YcTKxQ/J2L/TFzsZWYlr0T2KZ2vJEbeIucsMRzM3dryPS53y0xlMtJl2fc LAyemjKmDEXTyik3kZ1xPYHvGaMZ+kyJNAqAjVBUMp6AfxBJIoHOe0j5fJuA/wsRF0+niFh6I7Ei 9MbIq0dKg+uOp4gGCJnrDTn+J/QAhhFIz7gZ05M+EulnxowQFKUFjEdGDxQ4fYb/lA== vhEfdMcL/pdhpgBxcUfY+mb8NPWdn/5K+Ola6P6NMOHNgnmdM1xjLouFSep4LHiDXjBu7n26mHKm bFZpuAKLFXE5lzuXTjIEPQsTesyYrXUqTA9ohuLLuObdLf5OBisGHKKoWvwpOxgDE/JBwzd5GNPE dqDSyIjdxyUWOwPGLwfsSA0M1GdjNGUFI9D38OHS4Jss32NFOHFCN3jsnX5IJfadZ5V+0JCmi0mR m42Uh2L7CfcD7GWOnsLL5OIETeMvb+WXv35VPgYGn0g5UuX/WNiDjY62anLcHx6/IE2ZBfkrZxXw 5MGUV+hffgNmQfxGuQQJb40mfw0Gvz69dDs66nfGtv51Nd/523f+9pvnb5HUr4K/xRzu6e/MbevX xm7KxsDnRjysPv2BGy96POdm3Xn40Nx5Jr52TLIyJlGSCItzD3EoyhQQT5dpW3xX4/gR8l757xh+ lnHn+d4QSz8pjYTZmPlR/GkC4pYZL1jNnpeeSx6u3zD/B7LOwhymEr9yIUBbyIClwW9dBJAxaAol f6OCgIokqTj9ywsCYunq6u+yYHuK7hrlJ75rur8uJveb1XS3yibIb6sv/oGHhvxB80BDfdhhEa0/ VG4XIZLmDE//8tfI8/TD1/A8/fB/PTzv1x5ekJJCCtJEOkXE5RBTMXMrlqZgCTYKBSAoOfREBIal ktSvKMYgHknC1EldoIFqDCiBBpEYzD39FUQbaEvVbVl4/awT2f48HEVNFLjxmHEDXifMGB5sdfZ7 +MQvGD5hOeg/NvXDxgSLJZAmQsYJlFtLxShYLTMB9BHwZNvnDNsPk/pl+JYoRq9RrmqR46csLywJ 0vz0nRuP3AwPJD2gVmY+Mvc3LjV17HtU9Yk/wtjfIuS67yxA3ISbjpjvPPd7yNqK7FThh5J14iYD islLKP95wrjgi3v2De3gb80vqW+p6P2W1z32h73use/Lbrjs9B/4sn/f7sbrnvzDXvdveV71h69W XrDg7Q8jboyON8V0/D9O3fIanrLHY2QsiXJ5xGssEYVB3xu6ISsh33spPbnPa/cNuv8KrBwRoRPL i0durpb+TGiIxZJUAs6TlvLgRTTIfsp4PEkk0uoTMzSQv3E0xBOADCiMABAaaEgi0Bcbg5lgFHqC 7kU1QwMV+U1jISFd8ZqSMt8QEhIw1Q15qGWfdQJdj2CKhBhUx3/LWBCnp155K6KBTNJi7T0x9w88 EbeOGRri28HBNrSRn2sT0eD/IIpS0qGGuInQDRsolUG6L1jaVmaI+zbE88dne/xcEkTinLR4gCXJ D7DS8MArLnNQ6YnZmtO/jTX/9fsZfq5FFw8nCXifOhIK4rLLPDJOwyRq9YnZsid/I8v+LVf9t3Qj wZpOWTvD8Q/f9rqcMeCP0XTO8MKIc0+4hcC6Zzw7Wcz/SG2w7/79X9NxaZxAx6XpGGLfKXjvbSwR iZEpeGJKU0v1PH5NB6bkNw5S/CMmCzqN8luSwCKGh+jQYRImKVgii0wDwkhTqaWLqn9VlPFNGP52 KUM8c78cDAR2Dv24w6UT91aPE+ZgXaZzDobi9Hrw0kXTQ/dzrj8ajHqM2tTpobtyDQM3EMRcDils 7GM6nwXwBpPxaOJwPX+thG9E7VLUPlBe3UrJkTS9aTbXHy7BpL4TDIoxSsSgAYToJQarDG6NXv7o 9GK5VNt3jfi7RvwLqz5p+rtG/F0j/q4Rf9eI/+gVnO8a8XeN+LtG/DNpxE/gKbMYz18wJbg1mszG ihJsksMKj2VSKGwFZT6J2WRJMYxFmUze8TqTUvRXE+zGOTZcdPt+edpX7963vcC/ycCQIxYNutl1 MEz/0zX4TgDbD+LqJYAmev+TS//c1ewtY8JfGDHTHie+tMcIAwOjeLk5LR/u06gaBDzlhwdY6CgT hYagW5OlmBj9HxCWWrNDhqgAosBfsHUcFjaJi8dKkbjy//DrKs8MRnNW+jShROHIMGJyeBIhn6vK cSva/0UjYacsL4NCwT1o8FImIiV94MbnrPsDQqksJvJMSHkClNwuLkGD6AXgSYRfOaBIiqASkTIY sGMYoyiDUpAqj1vpm5DzH1NyYY5EmkIVniMx8ZJmEeJstuhhaI7JUSpq9IZ8Bk3JYQmJuEQDMdgk jorMoD+0EN1Cb6EQRFwJWpDjxdLy0aeyoCpylarJUrQUhDviej1ujMrKIIgS5pGKHonJMBLSkCSS vOZgrZxzwDkUlAGMEbT0GQFRi47V5VUUv1p0FYy4lUutoREjrolE9WoHM2Wi6N47iZzT0n3XblLN S0UfPQIEMTh60EaR7sTWfCVdkI19pnxAyeQvIxJ9IE8Etm9xY3nWhERWaBLw/9xydCvaLiNmPFYo QNotbokglVa3LGDx7iLLzzmBkbcW1rcaA6j9Ysari0ZLbASTZFhDlVzUyBd1vIQaN6aQCPz4HAhM xv0DBCF/LW3OmBSHldYV1kZDlaOwKGwEzDs/GnDv45EyDhnJCrORCSwSk8alph7L3Yn/q0KdMAr/ SMn7VAkIVKJ5CPkJIXMpmewSYgknxJPHC1h5jhl1RxLEpEjPCmFD/qJGW9Eyn0qKnALCyP/004Ln OTdQOACP5HlmynI6xMmxRhKUmMxmkmDrUrQykvyYGzJ6AYEFe6F1QtyHVL6Bi+x+xwkupWxCcZ6q JMK/0TdOQTYix0aRylrIARMpcQYyhJ8A5xypQGRUy+XZxaHCGcRNgLSZ6U/MVJUpKbe6mCKOZPQb fX07ApzL3eWBgsZMFRhJORoyJX2CACnSygwQO1e2U0IuJq8ZCi1fuG8+FI7vDUd9Vl48JXo1JfF4 cevLhKjAoUU2Igq0njASvxd1WFFdCLmnUAvAlIlljVXbVIKg9RfgLdxQKUbeTMdAlU/U4RVH49G0 D14hU2RkN8Sl5iqkPN/jugA4kHDqilpDM/wEQgT9sGMgKefsGIk2DRDxP/q0A/0nCMw1Ox8B6Qge L4ARMQIcjHEEy+g7O7GHyTz3+xjNS9IsP11G7xxKOEkqLkHUPrYTZ5IsWwaje24qjjBZtAzE4N06 XNiQBS/3ZtnKjndizFYPd+kNhNUsKAaIbGesUjqsAcwJ3OgySZNYTso1uhzB9DzDJgBoyahCo1qn MBpJiK/EmsAQzL8GdzHTZYUeKjA3mkzYOT+C9pG/Ph3A/7nk34GEACb8ZMKAJhWehawDvGguxgLc 8QD9uvHir9Q5Kg8p9aGuSrE4IvOZSatT4noL6K0pMXMGVV6XfruX6rDD3/fnjQuuzxq+zLr9v5+M p+B1GNgf/Ki7mIs30KCyzTzz84DYAnysFRCB4z6gOLGN7GKS38J/5j/OpBLT/v2p0PkBEF0Wu34T b/qDfM0maAufCybtoKNHbCaNRND8+o1iZ8pNWQeIGXO9T7bvBDNyy9AvOy9gB/bBQEkHcwPE0WLn F2gS9vPDW29p+TfEBGmJCUfzHzHdMeuE8G1X9be00TM/ON7qsOkvTNFwer2FMOcmvywn+3Z0mBEY 6OaFMg9sMafk+M33BRjLr2gofwi7VBj87lcsjX/TAl25N8gUqY4Q+ktzO9tp/OhkGj/+0tMgqZTd RIbs6H3ohMEoLX/1U/rdqD8fOpmR1PCXnVCUpBMxYI6TRMqgHT4vYTzqsfWSk5kpTX8FchWN5bct Nb5zte9c7Zee0m+Qq6VpmozHvnO1bzuI37hG/p23fuet33pKEYIg4n9YDFa5HdxsOl1uPucmDXYw v+RH76Opk5ktf/Nr4bQtbsH32AKMVP3FHTPC4He/9BAm7JzpM3Nm03GkNxzHbl86GHJCXVhjDQXn 6yTpbvKswPI/sO42+/u5u9wfzZnuaDya/6iwVzRQ1FY5jWqx88XM3WCm7wt4NNjkZouZ2D6utE+7 KyjybQoHd7VgIEx3g/2BHS8Pg3APxLYsD8/axAFxP7D8DB6SCdYf9MajmbvHQRfi7908+w44gc0X 3GI+Hk1Zt4AyiARlppaN5wA/YktYMkBGCt6SZ2D9hPAPLCxu4e4yY2bak9UyHYuKKZWwZky/rxvA BFXn0kxAmHFzXSuAUGnkSZlj9WejiHYZepxYCAHRQb7uzi/mnPsajVMqtQGI6emc7Y8YNz8SuPHi JzBK9gUjK6OVryhzRuQzd6vnIoSGumTKc39Oud4nQKX7nedkWjFpCofBzFl3FwYWS2XyACoSiqSH tHXOCkNlIigq1n3NwvHDP8UvYoTmi8vFfAb6t/4GG1LaPWNmYIbCaLIYM2oTCqNwVAwFHYL3foTh GH3Q+idWy2pgO4afdzmG77th6Ia0IAkqTqVM27gpMH95u9s2hTVHpg7b8vIpHZ1IxBLmLUlsALZN sQHYtlUGsKQLa4Raix3XmDkgvAbXY8aQwAT03kgAKm1BryxfL+Et8ddt6EyHvepW+zNfbzI86AJ8 LTRLFZicAZYcZ4Tysmua3g1HvWGT5wajMXvGSi2xGlmaxq1FF2yVCgcY2jWkJ+UDiDHaCHx50mX7 S+ANBw1HDLaioJBpFo5BCfLXIVufA+DtpCjFYAS7kXKfcl335Qx+ILhbOE2r22PKqSzaPZoiFswJ o7ljtkK5AUeyYCU4+0Zti5DTFyVOf23G6VHTS4lrt8xYvKZV25C3oyYiv4jeiky9gDN1DUsSW1fl fBBm2pd4lBVXEj+CtYnceV78CIlh/UekblCXOtHohIWXmy2nyBYbO8O22NYW3dpmxvgW2zhGuNh8 VYyLX62EcmnsOpzbbCg/wP/NdNQDypi8DFFVi4/ClQSMpiNKJZiYPFL7dvitlBPyo2YR0aCNWhch +wUdgWlALtHkgHr/o24RdN85VG5Wmirk0NO5xNSwkatLq/3WkagnLObd5pnZTBY5VgiSxlSf9sYL PYasvmvNAREBAWffssQK89EUTQEHbjJ6ayXUpB9bNdfBd+YK9XpEXQf2yHw0GLG8PYpMiARHl8NB YMjWaKdGXZPi+ouGR77Hc11m3mB+RGVgNE4mo+8KY5btQ9vdadsCsvYtcYEBHk0/nQK+Vt0+SAkx hayqIkgTsceNJDjamL7rdFBtbmY/VYW5YtzAtDHiZCXud1MxbkTPDOKWH59zU079tj4B9mu+C/QY ScujTFihUcdLHydou4/bgJ5VdcqqOZBrP2JK3dlo2rf/SOLxBl9Zjw12ph2aFQqB3Dln+E95b2B1 u41at/nRBDa/w5yStNUHYj5zhecmQED/juM/cbJeYfKSz0FrEJuRRG8I+mMNUWfVp/qpShbql7ZE XGB4a7asrI4ReLtvzHBhjUTxmzw/d8AxAf2jWGoHvHUELTNIB23FzWW92bSz1u+1mCV/M1oWPZtY jQZxnm3Vs0ztwjqdqEJkte9UFmvJ+rQYNVN4rURjfQxUI5iFzPHQUwhkb5GZif7CEavYIteqFYJS IZgXW4mNCxnwXrROnIntCtAM79ju7Yj9nUMeYbSXKJs9ofMGWG49qEQxc7Y9XEy6Uw== ZjQWluwQvYrr1DdlqjbdCCzaYm2YBSV5zPxXC1jQ1T2CZvmcgesxcgtgZ7i/Fux4zLr7I3dfTP8A T2D5XbcAGjDjHxj3YuqGqpcbW3CoEbKKl45zi5dPgM4j7hsB+uu+DLqT4M7YKWoCepxId0zwrHu6 4H5Ad1OAj8Zif6Mp3mVI/r4P9j1oBZAxHv30E8OPOdhyMfUB1R4ohoxIawD6mPkROhnRUOtToAKO 3qduTgYz9kkQONDbFOal9Fmp4//pP3ELPYAboTdazLmIYxWzx49mmOEm59PAsWATsdkAPW4MSxFr NNWs2w+6EDdCUXkvmZ6FkWx25lvFej2VKLEQNnwZP7ncfwoe3h35ssx96DS2fxku5PjqZJh5n3pO K56Q31ccMRFhj76plendTO6menweP8k0nn3nOX7RS1bK1HnKS8bjuwQhlD5K7yFiL5d9jRzkDkMz ISecUVGXN5dteHi50em88F67auQO42yrODo67pUiEd/7UleN/gPoL1mqeDPJx+q89PFSiD+GQ/kJ 1xDy9dZ8GDymdxeVUnzvrvAx9t25vKUBcdo1BLaXTA+St1dPz/l2MXJr3ineLvOSO/ysvOQyQmQS LIW8i4q/2h+4vAhZlTdgepQGL3fJwjg3vs8MCsN5cZh8JDXoeNsv9cjGV+7wxHcnwgFDFoqv768c +Gv/q1Tv1z2FcOpjL98K707FMdwz/YXLm/7wB3vlXuLKXxzGO9nDvDe2HyxchN6CuaLvplJkFwfH t6e7w2yvx3zCv0bB8qAxFHsmiSiT5Ed7b5nR62m/MPae+MJ88HmRb7T2v+D4A7ns6TDm8tLZ25dc ftrzTYJH59locvJ8NEomo8Iglud7dTL4mSEViL3SqXAL0Jb0scm7GNHPjIpRBqwveX7kD4fYwjjZ nIgzeGh4c8X64e5dOZROCGBd6k/07nGyyL0GD2/7Txmqu/uCwB5PvWBCx/TBLlySJ/qOvppCPB0X PgN0WCLN236DIF92z0tR5nC/4gk+8rAXGr54RVBQE5eX6O7U4+jv4HHlUPrr8K58JjYvhspvIjDq gaoD0r0ngsfH5RBVOnk/kuDcHR1m+x8Xr2gllQEDeJeFhNQLaFQ4VQbwog6A9B9dw0ZsHD1LeAql DkI12PUncfqR/ujl26WPYGkQPfsqM4xvr0B3b64Oa6XOcb497M3zzb3eeb5NxcDq55MvD7vgm/5j +f7tZKGgSKRaDZm+fqrAUuMIX5MX7IErDVrlPsInAMsEgse72TtxhSBkl7fcIYO3hfj9aSXH88Ob eOb87gStUCox4mmweAehYIFLv+pRqZ04jncZT+LCQlAubzZ4tPBXSmOyQJwmMuCfKjES4RzTXS6X bc938u3T+WIZlbqVxPAuL/w974HP2oCPfUVGeT2eFtdptuLfnwWKQ/r6sdwlDg9KLM+HCLZ5lFUG IqJDQUajmu+ckojaDsNvFbhTzyKl+keSEfe+uKCp1tfkLH/5WjivFAenKYI86/Yrxf7kATFPgzWo Fsb00Z0Km543jh4LtfbukW4MLi8YBXtZqn56WdDV1SHkMDFikLnjlkerb9cDf4Xm1dlON50OZuMX Ooxk6wI3KI6EEQ25ZfipSQV26zV1Vlk2sz8BO/k6AMnrPHh0+ngqd/r+DPhYDLz1Ng6q805/km+9 nZaio/hOWQQw8NXofPuce8/dtutMpZy6und5M+dBCgMB1yAhi5brSqUT8Aylr4k3otwDZgdilIeh h5NqPvnqEfLE8SKptit3o097+Wbo5EkcIWTMLi9izfj78Pj8MLQ7us+32/shTPqQRHdR9k2bT8q6 TILl2/uaLFAO9kuDfIzFOL/yFqy+9L48LJ3yB2/LX4de6LvIWbI0aPN06TRw36p6q6dxovKci8G3 HJBd74tKvvc0ABu8/wWaXD4A8jnB3oK5ZPLXO+hBxZ+mA+VwaBAvFc73/QqTih76OnfD5PVLPw2I OHcE/qkUwT9FuLkqefhPQf6ZhE2KFfjPFXxxDP9qAW6paQmfVi6Vli34z7X8E4FAjbEXLeXFiab7 YlP5p4B6EQeQ1wATf6LmRaX7ovxhpWAA+1jpOa/tPo960Q/0WAFWkn+Kb4syHHEgRWXOTQ3Gjkqa uVSKOoxVcsq4C/J40DMRbE5B1pV2IVQs5pTRKE2K12IvCkRxKIfaD080EHPw7RF8dgSbJC+UF3kN MnCKEHvRrpsjslmJaPS9mK7gsTp/0yEb0BBCm0jJ6itsQdUVymnhXCtDamkIBF8II4ypdGJNO+Iz hcaWSMmUkMReVFJqEM73gfpTnFBhGYFizwXdXNBfaBnFtVQx1tR2oJ0VtpHUGSj/FJtYL+p7I2Ix Xd+m8llVmVpRnpW0zVSM6TaaiHTYwZGyXyoqlShvRThGzAxDtNqLOrJkTjMec3yqn6n0cq10gFEO RskKI7UmtFlbGXdeQbSWRWMv0LiKeg5zISpOJ0NhIUrpeaN+mePn3ut8a+Hd0Yo3Dtgdgp9+nJQn UGU7jQ45L02clr+KUCwdlHrF4gQYCIVPoMOMvaMEZgyRaWAMnRVoH1ArA1eYCtU+XQRxAY23uwGq bcLYooOqHZT7onJ39IhJZMVWg4MKIoMFGq4hoGI8HmomROzmbn3+Qqk/brxUSolHStdLMvvYqABt PJGL3pRq/ulu/uyhNdW8Z55p/qrWyh2Gkzul0+BuQmOfAlMYqoO4ygZMWBwthe57iT0oA8tCM1dM NQoC86n9lW/WA8+lLjCZDUCIxrqq3yPbLyFMrwuiHjyfRa6CJ7fMl8sra94pZiuaNwTVAprSZXFe fux736m3w5MSoDGk8kD9//DtsFLa3JRQ6BNNDVEOWJdLsvZcYqbVO6iDf1bKJLBbW3SaIkhun0gO d1mAE5o+ULQ5vR2kAstfNuhC5bD8HFG0rAgyBV1eU2PQqSkIgSWTNy/sWWlwJbSio+ZTQdo0cM4x agdYSdbWrSPb9u4jJlHEjfdTcphozBmX9zA4y75V/IOzSJ44bD9Sgb3XQ1k9xfFUeg8HTkQCuYp9 cfmzu/s9sH2CX0toWzaAXF7cBMKGAmyVSr7EKrv7WloNhM+7o7C6AdKf7FkRmBL9YOWtc5wuFRoP n7phgl4ko+r9qRJojrNo/6o+icwpFfbrwKrWj9b2iUqd5omncj/VeyVOP5ka9ZY9aIoWH5HpT8YE 4JbkKWJcRjtL3gztZC579rADLLChR1n9DHTBXOZb1f4HoLEjnsrdeNLi9gjtRcHqH/kXFAuMwf2B +Eohd2TRkyF/Ma01UvUWe5Y4yb4VxtPbIjFIF+uSo2PxAPbIrFArxBcFwuUlQzeCsmtfIoBvPr3m 09mzsPKiLZvRx2/JZPuAJU5rO1mA70gw280Mkw56hhhb7nv9niWC1DmEAIehHj93i8NnTyZ4XO10 NLAjZ4XP8+Be8Lg5iGvX4LXwSR151BeKl4YqsZ6ri8KYLZDFkefJBxhq4QrsSmJvmC/3Pr/20Wqk P/h0pfI6KPsq+as6YPDVK9EqIyg6vy9x5/vTArDZuuno+fVzHsKOqX7JZXrJky6v3FLevxpguDvC YvfWwooENNy9yDsq7d/0uMINnDgw8IEseSTIavFsrIMHeHKzNr7FN1q0MCoOn4pgn9Pnb8tg5011 9waPH14OpCbHX0DFOH/35L5Oeqy8iL5FPtWdvbu8EbJ2G4KU0IZehYfSIOJJiBg9OuUFov5UPVRE VDlzynQjIgc9pi8I0FU7WDt6jlOY2kHVnn35dvGyVYpc98O5zMXnCFCyIrFUyhO9v/u163towj+V Q9z5Ip+Ojg9UYJLLEnoa/JfTNpTXb0BKdW8A7B6lSm6ZkskCBxanFXsrnZ1x2eLbZyEO1An6slTv Ba/AszYp6QJS96Hi+7ASBuqZfyfVys4ey90o8Q7+eRxlLt6zo3K3vf+lVWRocVc+pdr7e61KZ3f/ utJp5ufQs941Hvy79xOsX3oH+mprAGI5URgnr4KYciMKI/rQn+PD6UX+6qA0AFpfOMPO1G5Fdy+Z 8lxUAg/NOdCeyL7yohE8Orvol/qTdEjtGczP7wdiYv8ObOHDuOaFbxgdsq9vsg6DyVfEcGpVD9iV /dfcV4HMAoYU2y2HPRFaPzVNu+PMIH92ZtQE6JZyozr9Fc1SS43GLW+l8wn2YvPp9LncO9lPlM7q nla66f2o5ITTxgdqJ3GYZRoqjnb2wLpI2zBTBqMozEI66pCPVKLD3O3gpgAXeYZrhxKwYPUlGYjm E7WXulZDpSUfbCo1KjDl1wp1k7/K3nkxJVhaxrS/dCo04QkYHal6q8+d/LR6w1QOq6RfB0wiuUg/ lx4+58dgC5fO89ftHNAtcc1bGlkUKK+Ng3zyOVvMZe6+Rsm7WIzNt/PcEslRic+vQiJAP+antYOv ymGlJ2CkcnxExxQPPGwuK5gN+M+zhk5O6sYEQu/ugDGw7zma27svXHk5OjwNtRVl6iiWb9+efOYO j2cXgI/dRM8Oy11fwrTRLRAEAQFKw7zCjiAqa7uVYv7lHfwT7lRKzXNqGYAQynHhdg30cnWQHeq3 hTJX/UyVIwwczlPpGegUiQuA6OOhukyAJ5+1i8PEvAl1y7fZQeFjPhnhsO+O4kBGXAvl4AE9wJVz 8E941im85m735nPNdn1bpJunjy/YdCELjnl7E0DJKqoV738DMdx8a/40Kg32a+NUgs/eocOjLPva HBrQCw0FWB0wnIP9SrGQPoCK2gXQ6vJ8mXl78uO9EFQvtyi97z4/APPD3yv36MBhnjg+negINsve UL3S6fnNPeCltTCg6aeqdvtkkNNYVLB69xcD5OmtzoFuef9WOj2KUeXXy+5LadCeRlSw8ODmBBmX QBBkTqWjOmAqLPPIt3T+kuvN0heJzilYkuk1UDXLbXjKk75+1+7FD1ENAn8NFRULgtj9zMfmB6X8 9fS8VO4OOkfLvYAmcX/6EkgS4qrcu8ul0A7TYIwQQo/04/UBAxQZ371ORqBZ0TuV8324BsXSqWdA GPaSeFxc6gCoPBmAOL6Jl/OJk0Gj4j+rpjHLyWKnOiJ7+fxFOip4ZIujo5MUOp/Bz9fCnk9laQ+A EiGES/U6tF+ihXGJPXzdyTevHi+AVlQ4x0VeOj8BqsEd0JQkU0I6On3Mt7qzgXiARR2xN5pvMGfF CVXJhnYUp0ZaURtFtCRvx402dPbvlTszeI6MsIMLBVFraI7g+cQzNJlJoEedtcF0b490cgHHQ5f2 AuJ7C1T2n3zXwF6q0qX6ZBxDX+Crr/kmNa6+PHK+zMVr9wtI9oZvaS+i0QDrLZ8K3UzgmcWnwWEU La/LMV3eL9XHwVYlv3jndc0VTVFeafoKcK/zSgCpBsGTu+Br8nrg61EH/OKCCtAfx1T5sFah3jzh PFV5ybeoSiEK+Bj1FksXKeYsdCm+F1+1s9dUaUIUkJVEVc4SV+gnVeof5MV2pdrkmA== ChK3WaMxZNl071Y6DgY7FWqwkDpUmkc8pH559w70w/cOakkfVZ6P0Kk2PNKELjb5SFOzhWEvsf1y b4cGAx17+Eo5dV1DZIHvl+RX7bqBznCzg8n+PujggzaS4orydl4apMsRoCJGApYS987lLQcvfUGw vq9hq5bH0AQ42wM9VyKWPd/lDseVgI1u+aSyQr02A2V88aKcfstzw8uD4LHwmFblGZrQkf8q8FC4 auYuoqPdzKHqJhH3fqzSGUdpoEfT41zy/r2cT1WFOQygCFf8p+HbInkzEdQzTLxnI3tCUitFowIJ NUm7kCyLK6YGWAFHZAcLlpdiJxQJyR2Uopgg1Mhmmv4i0y2wF1uVSu49Nwa6ersvoYW+vEU+pYMF 9AZdZ8LvnhimLENHnshcvcTnEzTd/EB0znbp+dn8CMw+EsUaj15DgCpLwkEy8xpsIQ1dRbmsKcUC 0xjg6HEmH/f5uDR5dxbF0VZn7nNC4H6ndHb68iWyR43sigNFZjADguc5Sme6l/u6b11ey6+B5GvU apXO/CVcyfnYdv56zH3hqp9s9MqhIM3HZLuzmOZbu8Wj0nuC3jkMLZ6BLUYffx2U9aqhIjIUaSHL F0m0CJJ119wPHuWSOyUUkALHWky2+txhdbb3GlbduS5vpt/vtTMUc9AsjMNku3r/eD8FyzQvqD4A sQngm4vK28tiCEN4fIjLSWqebvWJOZNPhSM7QPqE7wAd3AAdJj/tvgvq2ToO8ZWaoANhLHBHA/Y2 30q8LsAiP3iB8na10L69y7dvkm2EO6D1QeylP3MfDTDzyZ3G8Q2x/HZH5rIzQsgThxcz3BSGyCr4 Dtulg1G0dxh6OCsAGVCHq7E/Ejeuoixinl4d5uXFUYzw92mhl788qzHIYoeYoDRDutop9x7Ypyxz x32UouUPb6Wc5kbl1/vhDbBf2vvhB4Pmb/TN5dOHSHftRuXZFHYlMM9yUEVMFM4DgVFyWr8K6sLJ kBQThYKv6q3sPZbDD6n3QvwuFsZWX9ly9NcZc3L0XGKBgSQcktr+FCgHR9lu5vOo9DJ62MU0JQwO 0guAxJ6YgYhdFYe5PtBhxsW7PJcf+PG1unreBXpEIZVvPoY4dfZaWwxQB4y78JV7i50RsO5eEsii VxmlpufHFODENRgbEeZkr8ljOnd3FdxHqrtqf4o8OQM0849QfnriaVbe/C8U3AzPSHvEhifB7rwC SVq7pjP3N10wF7YCNJyXt6oXkBoElQVcnHiHPtYA6OA5jGuwBJ3ZfXEUr5ZId4Ll82Aa7LtgCOyh tlDuHdcAsJv92V76pvy0l36/48G4anGo6b6K0VdghH9yLCe+6zJaS+gKBwdZfEZxvh9cNyJ8jmbd MYOl5hg241mYbcdCeLz+agd92xnzzvLM9N0i5Bk2g7GizFwNEpUucYA5uGCGMBrfrSY4+5s822cH o+lIE7AL4HAiJvQJuTiS1FhUu1RHvHTXimGuZtNEyUCM0B3NJ4x6XcBy9HRvNuMjQw5FxNs2wzJQ UoRhiD1sNoKpBpGuTZIWbClFT4uN0hF4D4MVyDGeI2Y+66502Yr1ZLDLcIygwSbircHWPfZRiDR2 vUEilYiodxEZT4RX8WgxQHxRbHL2hPlYGu1sZpE7AwcsUgSvi41PxU1xj6+6EVA0WHSRg0WbMR+Z gLFLK22NnbmcjeFg0mC6EO5Yva8lkTbMptItuRFFQngSRSpYtGsnpuU4Gu7sffIpLRKMmLcgPdiQ ncKrFizWssf3I0JvNrZMJISNOP49YkXosDdBLj+ouX1huTtmzFrBEruD2eSMddoFpIceSqWew5tZ LHK4xH57U8GKAkGbwXg0G3L8Tw6QIV1JbpQ7BZugOxhsR6/c3ACkWM9CikGIcyypxBa9PzinfZH4 prgsMCB8uL5dmEgK+ImGKzuhV8Ax5rB+qeMOxtZ5vNrGyk43JUweK9to07TH20JDHTseHW/N98RO YT5UV8lCNMvlRG0Bz4Dp5HaCBzaFuszIMjFwMJ1H+uMZP+CmVttHbKayXmOhDbucwKQ7PYmY9Sws uoJVpp0WIm+TuKptrRCFg7bWGsFMiEzZd0A7ctKj4T0Nv59FNLcxmEAakz2UxmbZCPC0OSoMIq2H wfiFCLwoYMoK1lltoJ0wZIDay1qIVdSj7t4ak3ZAk9D2a9KuizKjpKGZYEK9g8xYG+f7vGCrPAG0 c7P+wgJVCIx8q4LVsBEowWL5UIOexW4Su1pMe+Y7CcCQJRa6DsIGmK38VuFZ30kB241HlvmpoMm7 XqEzzu8FLXl9S3NZCQY3ZmaWAn8Ska+b4+ZDWRGyhehMxiE8MtMpZyX61QH0Jj9+mueigoZQWo6m FqgGbVROaXIlkMV4AXKnzuwyTlUAbXAAP1GB2klsoONijYXrasFdLxdpMk3TYSpC2liXEJXYyLS2 cV5u6Da4/qt1W4V3AF1OxRrqEn6Vd/DSvDOgqGgxD17ACzTa+E208otSu7TcxT2jv/cO9TuZqfY8 /gaZ6+jasxkj8/a42gUql4bl0qtvylOAIkVhi6kvmjzbGwlLCd/wE3jRmJh9bDhJ8b6QuaoFYuNs vg8Mv4HXtqm7NLvsNlBLamurnsFVE6uhwUWR37lQfjX+xDD9NXicKH3GTy7fjon+fiuHfh6na3sf 6otYIRVL0Y/05BGlgyEfGPZZrcMWef74qJsPzS5Oc2dp4ThVO7yLVLjH+G2Zf34kXN7SY+WhXTnK H/XIg3xymvAUA1dxIbYHQ8G6USIaPKfih1eZbOykPS+UBunqZ233+ogpDYiHY+UtFTy6poeeQKx2 5AlHfdee4PHnocfLkmee0PCj5fLCB5VIrJEGfxzNvFIHw3nseBY4nIEhn06kITPXBemvt9MTNJdI VEh8gb9as6UmYH5CqjJtU/70w57LC/BEohlcqoPin4X3FOg5tQgeVz37cYESzmWwqWrsLrs7AD+r Y/DtQ0mec0Pg+azwyL9km5dENN7yo7GiTkEvYrdV8jl+P2yEDDt9eS/UTDulqY+ox6zTLv8aDd6B XrTdSp1eFAK7N7Nxw6hTYfeVLph1Wju+Sk5vdZ3CXlC38cB9MNu7PDfqlF+8ZfwH3kPPm1GnRIU4 OTTplN7dS2UHaUTJBnONPzwTlXbhynCmO5VZxns5Or827LS6yzV0nUr7BXXrO23Ez80QfMM/96hT 2GlgCb3VnbuYNzH3gc/i3NKaZvbA6kvdNn0+3arG28nqGHUKNlK3rO30hX+57V6bdJrpJG7671G1 U5cX6/Y13L4w7TQZHbR8xp0eegK8kAkKxp02k6+gF4l+l+Yq+I4fSJNOE8OAr8BWjTuNB16Ch9kJ NlOUxq+uKpPY/aIX50adEpWzq4JJp/SuN5FKnJh0+tCBhz1cu204153q3tF+gx3eGHZavUrdmqG3 th/2RIZip+XnzwqgMRzBOwHBlwshBB8sdVrrTBJfBzMCdJqc6Ttt1C9epE4fwn7dTF3eZCISeVS7 1cz1sUA0JldJ407rO4tU46GXMuz0cszW1E7Bumi7PYt8zUImnT4FiVbja2Hc6VnstVGpnHiMOgXr 0q6P6qZzbZ3T7TezTkvELfGaNu60Ed5t9zsHWdSpy6uf6+3rkWDa6a2f7czMOj0n7sInBaNOXV7Q bTl4l0vxRUMEP4bar6adfuy0GwWTTp9p4oV5C6JOIY3p5npxM/rMeC9Chp2+vt53TDvl2BP/u1Gn Li/s9px4KzdKxgiu3JA79/OrulGnPH8R3pU67cYCuk0TTB+UY6hTl5dkduZVLVfK8ItYkYCdhpY6 vTzyf72W73Og0yNe12kwwz2EpE4/0wdqp4Anw269g6cdUZRThQeyrmUQ10T54qkKOw0vy9SL8N40 lm2CTotzPXrL5Y8I6hSui78c0rFCXz8ocaXYXqZ4pmWFbPAodfEEO40ud0p7d44eajXQ6alH7RT0 gjQpqnA5FOd6krmK6BD8wR2VP8VOT24aDS16wcJ+DDkkU4EK1Szib6n5xENlpl1Ju1h+v9j3xPqT mfHbeABsmuMEa/aWB8RwPlLfarll/KFJlA8vy+L7JV3g8Yho5GIUervM4B9PiMb1SdzoLaLkxzzR 6J/RZl8XiXPPXcrsbZm47NWvzd52iFbxcy5hbPn9U4ho3e56zN5GiHbu3G/2NkHceL4i6ludfPEQ /MKTlN4vc6oacXvjORLf6rdZ/OmUuH0Pnxi9RRh7ahB3e+m82dcXxB1dLpq9bRKPu8kXs7cfxMv9 44GMsaX3z0ni5WMQMnubJl5vsjGztzmiQ3fS6lsdjXV4MnJwljD5mvGT6Tfq3ORtd5cs7L9WTDHW bZFnVzunJl/3OPLikxqZvO0HyIePs33jt4nXaTt7OH80wxglND2+wOkFekv5jv017du8J1LLHYtv 9ZyPmo89h/HTD/UtwFgxfHCNW2D+fjtY4IQLke2J9lk8dA25UgHQHVswMj0l4/KE9Oaic1+x0j5J PiBbsvRYPoy44FOiUixEesViIXoWxO23N+8Yjicm9of1vBvzIVMQcTlo5zypnC96npr6iOjR/QLu jCfAHAeH6uqf70ZHR90A2EU7ZSF1lWlqGC6/Q/mOmmFRjEA7B+PyeKeJIbRzOF2ncF1Qt/GHe9St Yac7lX7UtFNk55h0ClRbYOcwuD6GzzX+8GbRaTWcxjrt7+/vqp0i7V/pNIY6RVaShGCo/WflTqtj DYJ3/Hin8dae2imwB8mIaadI+8f0sZhurlD7fzbuNP7wZNopQO+E0nXq8uIIBtq/aadQ+++bdcqa d5q6gNfEmM4V6RQmnaZqUKfomHV6pVtTlxfGlIakAaC/JErPLK2+cbusg3ai1tdwBDEeaIrtRG5B NWitQ0izcSsLYGn7noqKh4S5LiAdTmQuMm7VHZ8jQzdkSPnnCTfWAbYhUmf4bnoLTiGAa2UMV5CS m/scHF5R9Y+pHiLiNOH1on/ggt7hSrDUwaUymhK0/Sqoic735PIep6s3TfBg3yv9w9xjGrPkLpM3 Lmj8VCLLL0IVm64yZHinl1f6J3TOibiRbTGZHaszADRY1CAQx3whOmRLXvgPIMgTom49JNRElC8m gwqVQ+I/Ej5JI0/gFUT5whrlLq+KeWmGyK42nF/TYz8/9M+1bv00Fh9aQaAnnxutIL5+ncWBPHjR pjGaH6cscUz2w9ivoMn8skEH9OnSIMsCWGgTYpfnIpJ79WG2HcoiBuTOg4p3uPfXx7zSn83OcTlA FrEBsmZaz9VbhNMxH9BzaKbpQKG7FVkP1PnBNKoYCMzZj7GewD6iS2PcPYTm1qOR5Av6R8Idcpwa 4K78fOsxY9vGu1I0bAx2JXhKnjU2nFp4Vzc1ZV00qCbYZmRfPE0wwDKYbnNiP6t9cVbqXLTk/lom WOHzbtO1mqkSQtyVMWNKr57t63R1zTKVog4oEKEF7hdzxHTMpTTBzm+iEuUolCzaJw== xpRc7QobANOKfHK2tOu61Jdov2y87yrQiVQ3XUl0yrPwAV3vPKRwJb8JF2Qq1MuicKZM12Q54T/S 0EU39JUi9zUz1HJBDbBQwS8NCR9X0HRcxKAYeZLOX5aneXllpIVZLUn8a2lJPlM8mhU6fTPmtU5Z D5jVvWAmlkSNEV0UYq4zqutb1XNVvViyWl3cFgPN+1WS2fPVtqA9faY9KvVqTngxZB11/bYk169S hcf0qfGQlNHAf9T9Yj6oXVNZqS6d9fpJOj/A6OeepWKx63j9DBQ6CWMOVlCHLIJlOjdOiQE/ezUG 9sHerklZuNdaAqYVKOsBE0ENfF/3W8OYVq/bEGODjP9xaxiDPG1tYJJfS/bDzI+/VMMVkbDLSxXu X03Z0Cra8XvN1BR0eZdMCWMBXYMnLDWHho1eU5B3ZeH+c2cru7IGz0DOLGlsyVAOmGIntpc9azgy lAFuJD/M0nicm32GehTATSdix5MxncJsLnZMQTMQY3sfDsW51WI6EIULqPbLGjihnA4EW5floVhv e71lmPkyFlDzYwHuSlN5Z2STo2NJbZCR/EUYDUl1Z4PRfNQBF2DKlh4SXQcmTg3qRZjaODVcOvZh tkE+6nZqh9WQcCsJDGq+uxUGUNcxADN73wkD+Kg7ZQAuG08S9TIP+lbh2IZDQvIFUIKNrqCnWkmX 11Ptib80Jw8KHxXd/FDM1epENXS8IaW9r1rl+hU8rj5/bYwshCowlxW3uAWyTDe4gaxcRpZ2i0eW t/jkFG1xUyPNtdyBiXcptpfZ2VnJl6DiTpWVk1MLO28Vo+KEFN0E9h4Se5csmBrpczo1U84/OY2d 3LbP7exhK/dGbC/9RejsSgsHh5n2dAp6ueUcTMjlNVotjHZ0uvXqfp8T8nQB42Fwjr4mYhJ2vj69 D8TEY3Nq6a8xYgWYp8Hl1SvTJ5nmXKdMx05uvA6cieaqtLpfZmdaZXod3J3ckF6j0aDrFFcThGd6 TdiYInAxaLpfZmdaQbje1I4CaGrKmfgKXEkdiF74mdG5y2tB6Zkrj1byrTchb9yRr8+SAZwtSbtl tLgcIUYn6AwRY6XLynIfYkcr6kyw40iX9YGed33qUaxIyUXw1O/A3W1vwt63jE4njCw+S593tTlZ XdopHngDYOv5W41Aubwbbz64aUhHPNmSVuGqBfybULy6+oGDTXcOghI0giKf768AJ7T6aPRnSQhO eDXfv4ncQ6AijrQLZycVgcCyvnnfVk8YZH1MzzQc++MAMHtx43Jod8GRWRz6GJ/xKbNfXpf+PuXo JApTP604GjBcEgGRki/UXsDTjANFzgFHu1E5mtm6OOFot5xTjmbvgYfANuVoil0JgG2BowmfsS3s fXgQvwYnWqKx5eiHdTgahIJxEM252KpwIk5HY372iuBETc366JALHslUZKwL4F5ruGRBq0Mh7Ogw aqilSIFe0laBFs/Bkm8cPnWyEPYHsEXwom7IhDBt3F4zu7+1Psg1ZbJG5/sA2Mpavfm4YOyD6dmr UzbzMHNgS7vstjNcNTWsaU2mIK3+xqq9CMXMmNN6e+zhrGdQazwkEI7T0CPrbSiCUjahw/gxS2nI 7FSDelnI7DQwm0bjtV5VGt45jT6ysvigjbUdbxaiZABsW/r985eRLDTwwVoTGrlj43NxJsWYnfMt SDEARX9itS6cLUQQITjEVmZF6uz9taUhXLCwpT95dWmY8Yd00hA+M1cD8DhYB9IQDORp7ih0Sg3D ALM3PkmEIzM3SDWoVDek2ekbMBVgpP1WfNUQmOne1nJ+J7u7wzvSdDX0Yo4xejvGJVjJ2/AKUWom jPne0nUtUoQS1eloUA4pYmlzSX5LnWCiCvcPYZ1gWoqcWEEs6WKu7h+sBJOTyLVLzbiGHnPvqPn2 MiaVYsTQNlon2hYCcyRaDM5utJnCErBtEXHhYWffiT/Z8GxgaSVtg2/xM3GTzd4VrIJvcYowHZLq t0SDMncMO45VVeUZEa10DowtC2kNxMtYLofV8S3TKe32F+VKei/3WmkfN8tGOXTWGXR6rW/dHDo8 D2g5g069vWGzHDrrDDp0Wr2FHDrrDDqTbMGVc+iClhl0Srbghjl0Jp1KGXQqt9wsh846g07NFtws h868U5hBZ5otuGIOnXUGnXb118+hs86gU/L4Nsyhs86gEz0km+fQWWfQYefIfltD8qlkFOxiZbNJ eUAGMfDN/S/rYBfHQ1KcA2aWONB2HKUHal1MZiGnmJ5s5sl/Kmn1X3s8mXt6mz7PdvCkdTEZxSk5 xZNO0C/HmWkMLvnmFuM0PE24jmN6MgIF5Ys1cTqen0XenKLDaGZoOijbnALjIS1nPuoPc2yRbjok e8+VBZ60vMZRytxSnJIzgn0trxQKYpJdW36+NDW4VwoFKSOnsQNPrwO38WvZ2qJ1OfFXgak979qb YeZ+dRQJCZPdnAWD2CS7mfmLnXt6YbKb4wMXnYsJy3stOwgGsT1wAGgxCAVRLQtHhggOTJvNYGnT iDq/Bpgun6FLcTolQucsNqJzhzy5Sy2s18Bxiimz09lxGUZiOUgy1W6+inUCIzwXW8G2h15IanXH mQZjWsch1HVDWjdJFSKm7ECdcHBi1a9aSDZNHphtFlhqvsU8vteFtURaJY/PTvc6wJ1WmiFpYuB9 R6xpEowDVVqTmmYVA395bZCiaZ4bZRcDv0oen7n73On6qXl8t+GNgSmgIjpQBnLfOTDzE3MdKCVr wAKYTb7Nahgjt4cxfbT/RhiLbYYxreNXvCJSE+r0XrPT1TVqI9j7Jgp2zT5pV97sttlyZtlPDkDY MRy0t0kHmY/vtY2NPUVTmp/Y7m5ZdzbJojrZtwbgsgdxLGijCCxW2gwjUCLb5c/arpDuZMRIvihK jWmKm+12tUWGPp5/DXTYp8YeuJxEHsAJxVfxBui1SI1deeIv8To9knoR3ucrmJmmlAyE50puizXS 4/BcHsxcNc+IcubecaCPfdS3s+Mhlvbt9TFneDJy7+iI1OV1hKfV3Dumniuz3DhzT4PFkJY8MpjF 55guxSGt4pGxzrBbySNjMST7vFcLPGk9MkdzvUcGpiTZRUE788hMTh14ZOyi1GJ7Gf/exh4Z0Td+ urVAvsnpFiKIwNTi/tUdD7oz8cnp5h4ZuOY6jwx2MrJSGprNIbjOI2OYv3+6DY8MzM6ThahlRLd9 qjnEjoPkHAuJrFWWo8vK8uzMOg9V3dGSR9FMWT7b/N6wk8yV1y5SxamhETu5SZqnjrq8qzh1zta8 N0xDyWBygW2kjy2FLujli7O8ulXvDVs+F0N5dVvIgfRiASfrRg+eOUwh2TXzW+qS68ydoLa7V/G3 ST5YyCN9+pNU8MyGGJwJuvvWVu7rs82Hc60SU7d2PpzB2SsAtu18uLUjVFfKh7OIUN1iPtzmGalO 8uEcZwtulA+H8TEsI27b+XBYzFV7zVQNg22oz4fDraSVUzUc58O5DDPi9OuyaT6cQslKDgDMiFs5 H87m1BfPF9tYqkDxZjhnPF/McUwkAGaTTqtDILoL2vhGCwjM/ERnhYyvlqMTK+tcpRvHkZD2cBxd a2F9wovgaM3ndWdlrMSvlsl1s+ZdpIaWRdH6DmAH6QS6TYi81scH+m1Yfi5aI9BZ8AVYBrQJsajO NTOrbFIxJD+/o9Bk35ejnWN2rYw+x2o1e9FwTQ0CG1bXxmHK4DZuA0ZwNtuGMhRpE25ydweC48iW tr7rBsFxrtqbKvYih7ldumLG7rYpq+gGMD+dD0vKF3NqUlsa1DAH6dowfWE1Pna3zYzUu+1lpN5t JyP1+WsrGankTngrGakAzhYyUiGUbWSkQjjbyEiF+WvOroE2zl7TLphqXxuditpHLOm3YYdfCu6D z5RNaHarubNt6DQVTivFTLN1NkyF03pHYf7at0iFs7wHfmupcI5OEjdOhcPtyuVAkm2lwmG9rHRN /WqpcC4nN5aslwqHKYbIejVVDbuChX22wo3wokR+0F8ovFle3af+JsSl0zeHUVUQ2Jf18Q/mPpZ9 4yYOZAhs7sBcc6TDPOgvGV7zcEFMYVs+wDG4Tcvqdl7IzKMWIs9EOJjepgUGpbvre7W8Okk44Dnv BXS3h0F/eLFw//VeElUHh7XBG55wKtzxHJxlSU+odH3nCd2+tjyhTr/tOWjnafhXE7YresJnnQS0 ku4/k5I4OuI+8SHLZy3aZDe/RbJbM0rgOJazzqRanIJvj8MLoGqT3fzdvetPk7yzwLNVubjXsFbu 65LdCvSlSaf0riYtSp/s9mqZYVf1JIzmKtVCrvIPSqf6XCyLym2HnhdtjpUuBewqd411qkt2y45v Lkw6TQwPcncHM7MMu/jDg1Wy2zth2ilReamZZ9h5P6O3XfMMO8ai0yqRMe2UF95Pd3Wd4hl2nudd +sYMwSGrmdb3dWsKt2sYdY/+klc/dbHoW7eU2l3usk7a7VweebSRkCYt+UXnE88ih3NeUkTljQu+ Dfl14tT6LjX7kFudBtvcn+jD5LX+VNE7umYezczU7aTzmjioY5WzvqrZyZDESnn8dlLFTO/JUWOu tlVJzsi7ZFopz6aSnMOl8+2sFnNlURfNtuKILq5vwyJyOJ40oHC70kEROcfz016IbHAPvC4w32J+ +vBw0yGJ3lGrQdkGUzoYEuKWdvXjnOOpEX82GpJSWdI43HWNbDqjEWIZqVvKpjPB2Jaz6Yy0UfNa nOtm0xlNbelWjY2z6Yxy6UzPK9fOplsp83HtbDpsmRRv8yZea+NsOiPjA6PkLWXT2UZBbyWbzkwi bzebzonXevNsOqNcOjSXrWbTWcT2bDGbbpl8+lXLPPG1sumM5Idyr8LWsumMWKvhqehG2XSaIUm5 dJh3dEvZdEa5dGI2xzaz6YzWT+vp3UY2nVEunVnVv/Wz6dY+4V0pm85BfuUWsumMcuk2x5hN7ZzV MOY4m84YY9vOpjM6RhE5/zaz6YwAuLzbzqYz2tuqd3Rb2XRGuXQWN1GYgbDJpjMCoOUw28imM8ql 09d83DybziiXTrP3t5JNZ5R+Y3ILjSk6VjMAdTccaie0fjadbkiyAbhaRqrWAMwIS8k7/pKhiqGN uHOYSGdWptI0x8hQu6jb1arUod+82plUrc5Qu9ioXp1RgTKndRPs69VZ5axh52J1u6qVjvE01Itv mxt1zKdmX4cWG5JFvKWDUnVOhyRGd1gXoXWKJ/PNbHjLmQWebKvPGg5pmcOAQdFrsEzt7SKxvfRn VLWH5Nw3nUW0HH/kxA1mWuZupWiotcvcGeS/LBe6WykeUTM1qczdJr4L52XuxKwBm0J3GzhjxDJ3 G8cnOypz53KUYbhpmTtYlcm20J3Dy2zNy9zpKdlRFOLKZe5WuBcOyIXdNYkBky9nW8uzmJ3pMovM ckUdJLRnrraQy3PmKBbDLunRg95uFmsN19xJRLPLPpFu4xD82dmyrFwPMfZZac4KYQ== QOwk19y9og9Wl1HkXzaUYW269QWdRlNimY5hqbNVE7viet/w2tFQSOffVjQUyv7fNE4dZj5uvPlg 4L11EruijTuAs2pOrVH2E4CzcW1XEcry/lunTuLqhSYt6iRuJ7FWsiygr8G/lFj7wdqcJTlP+/pg CWf5lfYaHgR2YMrMTCtNmEbutaaOUImbkUFtvVd9DPXt8pEufLZyIoNp9lNu03sVYELW9ioY3myz guHNmhcE6Pb+LbdxoWpUds0okWHVGkMQzuqJDMs1IBCcbeRzBvW3Z68Lx6K0liZW1WW/DcEGsbC/ 1zjhBbrX8jYEzzbNJ5IqsZrWuFsxsctEncdiSJxuwzUq3JnWrZZq3G0oOqUKd5tnPjqpcOeoUt7G +URypbyNt6FlhbsVK+WtWeHOoMqMpsbdSsCwEFAlewJVuFuu97qVQAsUpKIuw/p8DCh3Ninpqppj d+8oBOYoF9ZSzZH9/ABYfGPTBWCbNcy9WDnzcdXEWsXXp4ezeWLtnc60Nq+TaA/H+SVV5tzyzvJe uNWSmODNk/rgms3y2w1Ca4oo7uLGWoA53IYd3jK/coU0JikjbNUkJoQx04ywrrn7biWzHWFs6CBc 0EEwFhzXp6Nd6aAI1/3qSUymdmWHd3QPnXUSU8YfQXLWTO6vluMKhmSZxITdN+4wx7W7dOKKnlkq hi7nOa6F+/7CjEps6tEZ1n3bLM5OO0ks1nrTHFcAzPJqKo0OY5fj2hVWL/dojrF13ZPLK9mJ6LIG 1shxfbAUebqsZ0eDckgRxsJB9sCr+/c4cT417E9ag4bA89R8T0rSO00/wNy+Nvwn5wn2Iqcwra+I cvsisUZ6D7OR93XDk/7SpKbxAunl8f2prcO2Q2XSJmXudvZdXtM0PH7xFgnjtKEtc3dIvZtXnNPV 1gProskSe7TK/fsgTTslKoOLlmmnLu8+edrpmeX+9a3qsBVaWKfa1DRhd8hi+XBwV2oQfPy1N1Hm qsuHC5gn4QH0HplXnAOrX0kTZrl/9O7e9YR6NUvCe7HKhxPiGj1Zl/tXDb3dmnbqY/3JoVkSXsS0 U5cXdNvwmc6VF26OPaadenIv4bZmTdm03D36S1oGlzdQfOxPHLQMvC4mU9t29O7Xa/n+UtdOOk3Q tEwMJbqTxCTM23nO65RO2SPjnyyJzsqC17Ej/PxFFXWmfmKttmpwGvRUMgqbXK+KWdNXMXExGXpI Dkx1/qfSaqFV5kMC6q72HsV1s60q1rfxOK/MUnIQWmXqztVZfE+l1UKrTPGkVXI3yko7MDWuVs1K s6l3sExPRqCQrw8CWyFOy3J+hvVdzKMHrVLcVorSAkMyzeLM2oajOx1SMfK0nf2SNQ9sVTLslqNj tewqsMyuXssr+ZjNa6aUt3Ad7UNIX/tp/Wyk8vOttS3tdTk1gMtbOeV5CK8bUqNJdjP2a63kH4NZ gGsdWWujbmAW4KaeZZgDqL+wcyl21BliVryy0dwPUzaN03LoH5tptL7aG7l8ttOlvuzcuE44DFPZ no3cje1YD8nl+NQb+gTXvezK4C5ogCyLy/AduOx0PpXP1AxyGG1ZGb2Dce1Q76qqtxnecrZaWTZb vQ1VZHOWCmhzz8FKOVbdVe45MK8Ut6Mb0orauGZIWnenVSKgJJEtUgG1/H69VE6kKfWrtlVvHKdy 8kZpOjrLYgVgdtldOCgkkS2A2VbRcTQuuC4QmD3NO52kg1we58DsTi5XwphtPZ1VMGaRkLaULmyq HZrnAGpOrNayiJzkACr3kKyVBeg0B9BGG7fJAlQRY50DuIo/ef2Kegolr5UFqBmDRQ7gchUzM5xs UlFPyRVdKwsQEwSWOYBLWTam6Nikoh7i/GtnARpMyDBtyNxGdpIFaKCZ3BjNCupjusSDb1CUT63I 9i2L8ll54bZXlM/UC7fVonwux0zDJpfQUj1ZPkn8FkX5tPWSvlVRPgd3qW2hKJ9NDPyWivKh+pWl +QZF+bRDYg13r8iTc+J47FKDLer6WVu5Du6GclTXzz6Taxt1/cRMru3dDWVc12/FaNs16/pZV/Vb 624og7p+1hMy9sGuXtfPcJm2cjcUXtfPOszENnLYYV0/61gpjFtuVNfPUmE/20Z9MVjXz86n5NTA t67rZx3PpIm1Lqxf1087NX0htzX8loZ1/azp06g6wzp1/Yyy7rYQoaqr62e9ca3yK7dS/EPJSdxa +pFpVT/7+pXO6vpZ7zrnWWmblAfQ1RpYu66f0bhUabdBNgfTcVSYy0E9Pse5wNZV/bZUj88m+dNx PT6bun7WUKSckY3r+mmHpM/OM+aWq9f1U3aOYVU//R1E69b1s05PEf1jm9f1w2SXASrlddm0rp91 VT85Y2jTun5qqpSR6r5GVprNnI30CGPdcvW6ftZV/baw91FdPyen1ZvX9bOGotbj2zzvwbyq3+r1 +NYpzq3P5liu67d+3oN6M7PxHd2r5z1YV/Uzt19Wq+u3eVaak7p+1uq8kjG0YV0/7bj01uIa2rhh Xb/VtfF16vqZQLnlNrZe8bp+1lAc1ONbZxvqoCAas/GAOU0mMa/qt9aNOgZ1/YKWVf2WT0Ysky1M 6/qtnJW2rfLFWFU/s8z6Vev6WetMtrc2Oazr56gen4M8XCd19My8WavW41vPg7lUj2/jO60MqvpR Wotv/bp+BqdKDu5OX7Wun7VfS/bAb1rXzyjnyUCKbVjXTzdJndlucM/VWnX9rM1215bq+lmfZmIY 26iun2Yll6r6WdmVJozLsK7futGDq9X1s1YMRStp87p+VophV4Axvduo63dsWdUPWRZbqOtnfWKD tPEt1PWzPDCD2bVbqet3bFnVT3uWtH5dPzNPp9nNLevV9TMfEgzLN632u3rRV3bpnBE908UpaYcs SgabS0yJwU0mqnftgmf6zayNUURgzQLvdWmLGnqa6XxYYHGaRdUe1K7LW3CKIwGlCSgpUMzOtCjh UwYmfdZhizx/fD3KReeHp3kyddeifMc7JdQEZlPBXJ52k+E93ufgvge6gjy+19rQEzn6yAezx1/p 4GH2+iHYHn1yRLn8ESXKH+EMUTm7KhEVbtQgqlfpMNGoX3SIxmTwTlyO2SHROo+liXZ9dEvcCMMB cUvM4a68fT1aEHfhWz/xGLoJEC/dnUvi9fV+QHSuY3PiLXbvI97O/Vc8z5ejvPDMZfkFOb3lF52U X/Al96FCcD2HmZ2+8Khfu6xdpAe525fHd8/Bvve+uZfKjoHW5222qqf7w0/vzk46euHfHfe89Xh6 /7L7cV86PJBTAT2L0Cx+8YaWREx7y1fabS+xx/bBsyZnyEGkdWkAbglGIQgwobThCRce4lgJSKmO YKZggqxMHKBj8UW8Hb4GeP4iHDSdKewlHrgPHsZ8OaJSOCsQlUHvlKheXkyE3Ve6C3NXPVJ/x1/l 4FHq4omIVjoemJN4RZRvkx1U5o+IXrIh3W5St4+c94oTmn+i+luxqanSR8EEXI19T2A0PvaEqErD E+yFrzzBR3/Js1dKXcIE3FNUUtPl9YTzsaYnHPVdwFePEHf3sLJm2RM6v695Dr52wayZr5RE3ZUF PHmngpCD7pEHRTJbHDFREs6vk8s2PDxapkqZOk+Bv1ozMvT+fow4zO0XMvCJ6OdOBH0d20tP5gTh j0TRT8ge/dJfH+wB+KIWEAt3DnxfQfgzKP3M+MPwZ1j62YiLAKBlcZOZl3ufX2kimqgT+QnXEPJn d3cvgB/M09JAj5MB9QU+g+OjIPaC2SseyS+KYfUFlC+PNyfyq3pUfQW0sPe8/OKSVF68gqXzjolo 9ehAfYb3XC2GsBewZ5dXflWPAHyHDoBQew4COLsB6kX4WIAX1yT4q0vETm484Gczp8LuIGURPKuE 4BcHQNtmC4ivQJaYAly1kQKM6ZKHNNa8jEIvcwiJYPDzhkTfiIsTbT7Fouetzxj4ug3Qv3u4C98G QQeRCRF9aKiIeZN7eQMLTz+GS1HmcD/zPvXduLyVw3L8Q2WfEnOt3l/hJqxsx8pyuJGWmecSRCN4 onfUBqLMYRHEwGnqKp2qVnI+tl2q96UylWBW96RMv20qWAp5FxV/rV6nAuPOrssrkdcDE1emzuDk 1b0MQxSFAFKTU/DzJiqRffeeILuNegD89USK2m+0+0odp+sUWKsuE0N/KV4FSQYWcaEHqAhnAMqu XJUBPCMGAPY++J8TuPcBMxjHGxYMQF9JN7oPJ+mXLAvArKUJXbIHaC8Csds6QHiAex8wDXiXOazz mSAQiNjJXZmpdAJPZ3DbR+B29oslN1nhEwY71w6k3U3uRKlS+CkIdvRRSF4XuPeB4gCeFSNQUbmX vaPgn4CkMScqUWM3CeAMMqlAb4fs8gB7Nu6H6jzYcH5/Rt7HGTQNP1l+zRwqu/I4h3YW1C6uv8DP SkTlAnBXfhbGO9MKGZoVidLpIUcs8wNghIuLCJgCCTSDYzCri6DC+dHunmdOTcWDKhxUj6lBsBmF r5pKSED3gFLsKPqB9g5SNwh2JxFVNS70zBu/KF0Rfe+0BBrzQVwYIfXl8KSFAag/hyJaAEOwK286 B2VZQxBuNDceIDIVdsGz1EIs+Lz/SJ1ikh3l4pcPL1UAV8sAFrvo9gYFRG2/hu+SeEvMokfME5DN BQXd+ZCAakH4V0R5FlWeASINtcDCzv28uN+BlHrE7P19ZdbDA++h5w27yUDSXMSqz8+AhcWr4AUZ 0QlyaULxwCumLhyWhBZcfVFXQJcmpHcNKiDL1WnBugg7lX40aHwfQulTPLhQikUrNyM86e+7OMAm 9MTHuvKEMppLKN7iX8bj1t2BMT/+QoMDNLZ4y8WCaqlmgCxOHR7cKhEVhHJbBLy4Ib0jTbx3eQ75 ys7SNRLB84jE+ZfHjTqVFiLgP3l6MVmI3MJ0IXTLIFX6XloI8ZJWEcQzDiI7uVZA3FuspHi9pAjg Ba2LIQgrYhB9487HAOayBKLDbzgNdBkSjkoZYwbINAExNFkNMAYN7T+rGHvVYkxHiM2OCcHqIbLK 4NGlLFI7YCAcNlE7+Y7u4ybnMYXobOPyO0pXE6yr2vlDT3vv6MOzQlkPz/ig8LrkFDrP0vxsTXU2 uebn2KPtpXmrad584DQ/u5obdZpDDbDm50K2lqH4np8EoZZF4/4xtEMJdp5LIS6gykBVsQIK7+QZ 6QJAnD4kRP2hcN9BIjYsyfXEswB/RmWNo+ZTTkVR39AuAarDgVZ1QJpESPpZjCA9I6KAiAbLt/c1 OJrn2MntrCAL97gfsxygLqDK/cwBZiJAlUBVCDANwHfSOJZfaFWDxWtOftHA7BPUvarzZwJIWOF6 SDUXxEwErOdqRdXBX1GmLHjWiEr6WPWSgEpXMLaXgTpo9YZCpzy7B7jK2iwGkQkgqazNeliW8YsD SYg2GxHRSvAd3YOt0rwmIO+GFkgf/rynRKPhpD2NSLYYFdiLBCTV96GO1jKI2zwPlw== EdRLrJCKpbLsa2BQHNKVy8I4tZvCNRdkcALNRQSlPXnG48cAxOvoxhA18G4IyTeOINI3R5li/mY/ +1YcJs9m+XZ+eicaFYWng1eRfgO9+5FsBbdjCnm94eTVbYQwy0E0pLrXEXFdQjDpPiD+xezciqaE qkwD0zNWg67NB0BKh3VxtFDQqQYCUngk6zyf8klaj0jxTU6OUgMKfVDeaK+CaJOPdpr7ik0uyGZ0 RHRxSyZlIh5AMUlgmDn4MxOUlVewzZTdhHywt4S426CbHoaMR5CqTVZfI4/i5jN27dYI5MZVDlv3 5RdnfqRYkCFi+oZwjPb+mbjZyVDR25UxfxaSnt2QcMefRTBeE3o/isoqeYMgEt0zeBp2RmJNqoUv GpDK+yVUyVHm4wMXQXiULzS6IOHZbEj2KAp/cuxKkVTSnaISCXf0ejFm+Ut+9D6aukOurCuar5Pk zbTPVXiWbbO/n5e43mLCTufujDuabxXr9VSixPa4PusOaepYYr5Yje9QJMdHevJ4GH6rcMm7GNFf 9iwy0+r49qNbeDu/yudDU/Ile0Lepkq7/UXZ5S0Va88vaL8b+IbRRsmCzTwvlAbp6mdt9/qIKQ2I h2NsGyFd2zdrf0GDsQavb/N6Qp3+EzQ3Wx5/TQBzgQ8eRMl1fDTz6j2w0D+kumt1x5PIpDimvS1v Jb230y6+nO7WgunErFl4O0ve5AbtWbZ8VzgHVix4X+zka/TbRb4WG16VToKtNnj1dZuLzg9K4IWn i9xP2j3iJ4OfSXht18OrTDfnU9WFou5dIObG8u6UhdEDL3G2uR9SWGcu7SqwW+S/SD/02/glnppI og0MLzKuz5Api36CbfLEIytWjiGFZqti5RI44fqGioPtLIC/SM8Z5UUQf9EI9pQXYfUFvL3pNckq r6L4N7Piu/JCtykO0H7An934lT13EcJfvMf7Lq/yKoJ4LmAUOUJkTLVwJSZuI7RPayfX8OcVDrv7 HoSYvZK2cm8vmZHYN7D7Rdd6L3xEov1yFUX2ENk7qUO0XUlge1c3CGwM81vVOrxX5HuBcBx6Edth 3MNzkssqtH9dGEfeD/LN3qAB9stZ3dNSiRMtrcKnvHouJhvtBSpQqxwaQTSCJ0V32kG8ahyp+zMx b+6x1ZfH1Hu+tdgblR/7Tch226RKv7jS8fAaA/tFdm7FsamXTpIKsdyJnlWqdFWEpuVdVCb7OwC7 +wIDfO9IWabcIfcTB/+KiX9pYq8snRbYrlyVAZQWTLbm8iIWUAiM+WYuKkyOS4/FyZMJA1B4ja2Q 1IlIJM22LyR1IlKsZrZ1IakTkequ3KqQ1IlItCt1QtLqYA0/iluKU9H4TFRCkk97crjrJ8FVdN4j z04xv6N4j24N3E8BHEBoVNYBgPEXeydl1c1F+dMPMZ2fbGfn+KQq+8m4A52fTNipVLzWjjaX9/6+ mVdAjPyaXQIsKNHbChes/JwNx/azTySQJaUQJBXxuBc9g0QVEZ+9CJ0Yspvk/d6ZQx85hvld3wa+ F5+JxyiHbgZ14nsJTq1tbtkMDk2NPF0ur97XBWsE4B4HaULP2nEHnXm6kvhZn4WvS0y4h6uGQKie rtzdAQPWKlgR74+FfEXByFhXnVPrKZHG/YovxPjmwmwhoqYLoVsGFBdjtBAB3Pu3jjszgCHV5RWn bgDCihgCoZXGgDyLehDhTacR0aESYGxFf2KAMFkNzR23tbeQFmMWhBgKOYSoDJ7e3UteBy7ki27f CW2s4luINIfoaJIhSu1KXWxhp3pW1EVGRA+wQU1j2aY8qIl28AG/PodI8zOq/Unqeglpm4cOtD/D 2p9aYCFC4rT+fhuI75wg6paKFJMZ5XH1zi8yYVUGYl6YS3Yq6QL3n2GqU+uH4PFcWFQ14dEX/DYi HX3d7CBZ6VOjbsHfMFgQqQ6inaCoDqKdIJ4zJXJh8eeLwIoGRGzv8PBNPEcbvOZU1R0fJtQFMLmP a9k6qxl7cUP2lRc61WCgvMDtk/BefYjp/OLRPVlt7CjGyQVunAARpeibF2H8xSwD99CF4um7IETt vkY3IN1dwHhYBLv76lVgXwXFRt0ZCbnAVVhhj3uU79gPo96uIpKVQBchnCsC8W6yV7tEPynJaHh8 IqXcRKAuV4LK6beoLlEBOqMgph0ReyECeymCGre85VA6AKxJ4nbPUHMRtWiD6E5F+WlHN4aohUfI vlgEkYzuCofBmyxPH9/EL/LJl75fMioeWx75YPuJUs/0VfKi/v/irnQ5quMKP8F9h05VVJES5qr3 BcpONINsyxlMFRhZxOVMxtIgxtZCicGY/Miz5zu93llESFKpoILpc6aX099Zu+8FDt5d/FwPCA+G J4evPqPQ812f9SIf/+VEJMN/fP40X+c+vnohc+vd93+ND7bl8cF8Vl7zmrqNZ2u5Bv/sZXolBP5w FP3v9/XNbhT0uRMcrZzJ9X47k9dj9O/SE6nFT4v4GslBeno2eKskF69wsz/95oe43fT3kh/E//Ak XrUdLs9WfSq1lw8e/iHGC/XbR8df7/rLMOqPp9/8Od0Q1D/oixe5sCivoHR7+SWUeEew8f5JvCj4 fDJKD5rX3zmpJTl8w51+Nfnbz0cXwzvGLx8ekKk8icjG9y59Ugmd2eNLAybeCLfLn3983j2COCdC zI5vLoa3VN3eHjjPF6t3b6iDmY0Xl8ub6fzD4q4TLP1w/NCfLjAhPaNrMM4Mcac/dvvT5S+Lq6tb Jg7Y9Kbbmx0e3a0eL89Xy9ub+d0H9pBYZ0+mL04es4es9J6h9yO2D4n4DP3x5QFdj80g5azj7Ai/ z9537/DxtONZBLA+gPgajZ/Aes80e8K+/4GzC+r9rBOqF94ZJoTsuVbsuqOGtbpyhOiFsfSJhhJ+ wOA9F8KxSVdYUvdKaMOmjSN7wz0Gyd5KzaTAnEzoXsvgMkXDRW+cUJlBo1WvnC3d0d9r7dpklZHX oykyq0o1HfKq6KoPStvB5mTvhWr7n2whMu3GP3Y8gzl+DQXvv7i5mV8vLtjl3fxiSbeW4YCNeC+4 5dgVWs5pqTUbBaihF4HT0tUiMMtlh06cfhk2IunQsoNW/dKIPoQAYZRj4+vuFQQZj0nFvTfeS8Wo wYPHpyPaNLXPSeiem2YGgEMqp1gIvXDKk65Vb4FH5dDerWXB98EISUpz3gmijQXM52QcmntJHOGc ox4iGEzpenQwREtuBdGClxGNI2knUHUQTNpeK+zsZRSCNi1NrzQhpXtDCoRyoTzoyPQWk1WalM17 5YOtrGk0Ie2DaqOwsApBt2lJdslDXXkSzcwFFapwyfI8Ny7tyJpoMibAg+OWvYsMKWhQQ4WsSKmG G60dJym4QjpnZWNMtpQxjcqFEe3QF1Y2AD3qK9i0dOSQ/FxHBXHto/4idBDeGxVFgyNJnhSUR0gM JRoYRHVImUYINJJgJpBvASYTCBIN/WCfADJwE/XBjY360laGpp9MD/WTWdPIChruVEcBkihBnZY0 SI288CTC6pxXVbhpYnkpm/wUWDx3bYOkZu/UEAOywWBCg4lcW2nZcKz6yYzJFvikH8GO3qxH1q2d QkcbcEzbVBbbsNlY03KNs4UYog62PBKBYoFkIy3gSOTOUJiGad4Xi6SJwQhaVjIGI++5EogzVsCi PXJTr4MT9MmFyWEJuARaTMKgFLx1pDkJBLdBrDKhxidFLY8WD71SHjwLvTrrmKZwQV+LQaDandiG NDv85nb1bHF+e3eBTVA2+zSxDp8t5ldP5qu75a8Yw/YnRydfZgS+fXV7d52+yvkROfPi9sfF7Ogk UOJ8vvpwtZg1KdayqGBnFyXi78Rc/leYr2eBCJJl+wfs7LvuRRdyiyc747kz/eRwrgemh9DrsiNx 6XLqTixox5CLNgZMUAPVxiDXMjoZOpcUmAtLWXiSkwOGQ0gVejgIrOS0HPFDIexqSthU63DfO4qO Gm4QaFARb9IBTaNl48Ropv2AsbmlCQzpP012FNhkDGMwHwIH6AkfCgNurQLiO0zLa8TfSseS47wr tPDYoKedpuFw74DIXqbPZA5W0HrhkE+b3nhSeh4iEJEslq5TFkZZszGyUHWKLHRdJNOTzW3uyiKl h0GOczohEZw3lYMMZAz1QE9PUbHQWaxCQ24Xoo7TeGHxKQdYZHoIRmYlNJKdlVFoeG0H0xZGg6Mw smB1jiJ5wyMzJlvbrYjssg2YfhCxECLTrDQ2KBxVCpg9bqzQRbBMIzYrE8Wg0VBe8F41ODI9hCOz Um2qrQhtFPbmFVlLnTQzGhyFUcQqc1S5KxyZMdnaaoFD7kAD0RtZKR8BAiWjzKHy2ZNvwD+tEo2u kiUaoofoI3l8zF2IBRWRTA8RyaxUeaFS1m0Ule/C6DZtYbR1C6MKludokhdEMmOytd2KyC4DwUYM NhIhsSgDKyeWtSoqx3JlhnQSrdAIGy5F4jQeUUpyUyEp9ACSwsrHIE2nxzIqFqzBt2kro0LSGEmw OkeRvK6TGZOt7RIkLRu924qt0ieFOJSKWlPRo1EAU5HtZfP3fPjaxUJCcZrW0Q4To6AYcCxKM0hX OMgjOIUFomMNqJHJHM5WHlWiFzEXQQqH2Oc8IjR6KEVnJubgWEpZdtop2h7AKhyqvpDQKv0yub8J wx7KiDjC0xkinmaREolOUaYwMgLTLUymKXWtx+JNmAAcTlwSwe8TgbOo720BjirYAcf20qIiKxwA ZyQCC2hpIm44qAnmDXJ4NDgqbjyKKqzjhPVMIS1RUeohcoCpnu7Q6qtOoc1p5wjjhlQvCRPsIDOA jA2o8zOZsKU3gdr3CidOopSwDVmbHPfToN0QYt1et6J9RU8V1BsLIKVsTYBy1B4DjoWZOFE5oA1P JAdcIBUnvOl8GUsAKnkMiiKPyalKBuSWolJZ93RblF2eJnc4mimOJkNvqUTCzqnUBjiUDLgrDEKb hM1khF9rqQffSzrxYsZgrW/4g0Z9N8TfbOFvmml/FFTsW8VcA4yCR3xe44iAyq4B8C8w4bHqG7gQ HAblwmBdneNZ4YCORynQ3sISNd3jkIupVNdOIoiIi4RJdD5sMN5elA2eklFrzxsH+cXDOSoNXFHR S9FA4eQqJBgYktwJEVrFizRHZoC4dI5CVlBME8SSJDJnDkJKLVNLUe2HbtQWGnEHYVfFyOxg8MrR QYTHT0daT3cYMBjvLBXpJiif6lQViwRDCf+UetiQ7t5srFpSrZOu1uhGTQ4u4rBOY+SkLGpeI105 y91gLgrPdbFJlxlVGumSp3qyKgQVAAe0BQcuYHm6moh9KJQjzBg65RHD2BA1GosWSqcujSclposm m+4Ci9YFCj4vEJwLY7JlKvFMvevI7NPpDWlTkaXRtR0Uzs19l3Z0FEYIgi5laol2Z4eQpugq0KQT FcpWxc6u81AUdmwEKVGbYrWPjfWSchFJPT6v6+IALGNx9GnLjq+HI/G1FdS4fyQZIw== XGdjIMovT2fXjwzUlGHhpeN/f6Mow2K5i23mS4O1CxYkKa+S8xrKd3B3aErHhBmzPgCJX1B88zq6 Ms5t1S0n0ZWpkBi4srPOrruyt0oNXVlF6x24skzhYODKylm6+aSkFJxDH9qGTHlLxjsDhdI0dtCU eCddlS1zphS6jJWk7d77GB/J0C0OPZssHW2iXMuCIXTyD0lX9dFhYLubDqPUhsPIsOEwwmw6jPID h6HYGqutYWxNPVpslYPQuqmve31O8Op06VJjp8ehoukRlCI5irebCHojRSWHocwbhYJ7QTn5Zn+9 pwccSMbB1s6wM4cTllTi45PClIX3dNEQ1jtqSqheDjves7qEjceLv8Ha2cbX8huMmseHRKRrP2hx fMYnRt09z4h4ugdj+/mmq9L5TmvwDGn2q5rMni/+jtELtI9nu58l0bJ5jteL5eXr1Rb7/fJi9Tpz 2eH49ha8+d1inlcU1ijvpUD9c3gCPe+/vVqeLzYeVf2ftjxT/8tdo54ip7xv19NxelZ4fHMRnxSO RvQvQMwvF9/ezZdXi7vu8u38lwWb39zcruarxRt8A29ZvF3d3i3Y29e374mDIaX73t7x0y+6fwIT ZiNW compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-static.svg0000644000015301777760000015422112321343002030375 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-ghost.svg0000644000015301777760000003377612321343002030245 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-toggledeco.svg0000644000015301777760000003100012321343002031207 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-composite.svg0000644000015301777760000014561012321343002031112 0ustar pbusernogroup00000000000000 image/svg+xml Lapo Calamandrei Jakub Steiner Luca Ferretti <elle.uca@libero.it> compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-winreflect.svg0000644000015301777760000003544012321343002031251 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-switcher.svg0000644000015301777760000005374512321343002030747 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus, Andrew Wedderburn Switcher compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-firepaint.svg0000644000015301777760000002543212321343002031070 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-kdecompat.svg0000644000015301777760000003740012321343002031054 0ustar pbusernogroup00000000000000 image/svg+xml March 2006 Andreas Nilsson http://tango-project.org konversation chat irc compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-blur.svg0000644000015301777760000003656012321343002030057 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Windows window manager decoration behavior compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-scalefilter.svg0000644000015301777760000007451012321343002031405 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-loginout.svg0000644000015301777760000005154112321343002030747 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-screenshot.svg0000644000015301777760000005647712321343002031301 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Photo Camera camera photo SLR compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-imgpng.svg0000644000015301777760000006072612321343002030375 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-vpswitch.svg0000644000015301777760000007574012321343002030765 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Visual Effects compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-move.svg0000644000015301777760000005077112321343002030061 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-animationjc.svg0000644000015301777760000004435612321343002031411 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-cubeaddon.svg0000644000015301777760000003412312321343002031030 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-splash.svg0000644000015301777760000001523412321343002030400 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Visual Effects compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-widget.svg0000644000015301777760000005233612321343002030375 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Zoom 7 o C compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-kde.svg0000644000015301777760000002014012321343002027641 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-annotate.svg0000644000015301777760000003327312321343002030722 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-trailfocus.svg0000644000015301777760000006547612321343002031276 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Trailfocus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-opengl.svg0000644000015301777760000004750612321343002030401 0ustar pbusernogroup00000000000000 image/svg+xml Lapo Calamandrei Jakub Steiner Luca Ferretti <elle.uca@libero.it> compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-zoom.svg0000644000015301777760000004500312321343002030067 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Zoom compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-snow.svg0000644000015301777760000001734012321343002030074 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-flash.svg0000644000015301777760000033413612321343002030210 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-glib.svg0000644000015301777760000005216712321343002030031 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus SchemeP compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-showmouse.svg0000644000015301777760000007005512321343002031141 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-inotify.svg0000644000015301777760000005074112321343002030571 0ustar pbusernogroup00000000000000 image/svg+xml Konversation application icon March 2006 Andreas Nilsson http://tango-project.org konversation chat irc compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-showdesktop.svg0000644000015301777760000003423612321343002031463 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-compiztoolbox.svg0000644000015301777760000023372012321343002032020 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-animationplus.svg0000644000015301777760000001202512321343002031764 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-tile.svg0000644000015301777760000004402412321343002030042 0ustar pbusernogroup00000000000000 image/svg+xml Tile Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-session.svg0000644000015301777760000005664612321343002030605 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Trailfocus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-debug.svg0000644000015301777760000004101412321343002030167 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus SchemeP compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-atlantis.svg0000644000015301777760000005120412321343002030722 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Cube compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-stars.svg0000644000015301777760000007325012321343002030244 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-extrawm.svg0000644000015301777760000011214412321343002030573 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-schemep.svg0000644000015301777760000005234412321343002030535 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus SchemeP compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-fs.svg0000644000015301777760000007740312321343002027524 0ustar pbusernogroup00000000000000 image/svg+xml Desktop compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-notification.svg0000644000015301777760000002111412321343002031566 0ustar pbusernogroup00000000000000 image/svg+xml Konversation application icon March 2006 Andreas Nilsson http://tango-project.org konversation chat irc compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-cube.svg0000644000015301777760000003720612321343002030027 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-anaglyph.svg0000644000015301777760000060417112321343002030715 0ustar pbusernogroup00000000000000 image/svg+xml eJzsvQmPY8l1LvgLzn/g4MGAGjNN3H0RjAHuRj0NrAWSbHjGeGiUuktyvamuEqqr7bF//UScLU7E jUsyk6l2q18ywEwmmbxLLCfO8p3v/N3/9tvffzl98/GPb7+sz8UJ/u7vlk9v33z++OnnJ3z39Mv3 77//7vMn/9bPfvfFqazOhfun6ZfDV/yP//T203fvPn74OX6EH178t3+2vvm3d9+c/undnz98/PDu i9PP/umXv/j1b379y9M6/dMv1y/cv/3h3ef3b90//unj+2/efvrqj58+/vuH85t3X8g1uIOubz67 /6jGL4v2y6ooulPZ/bwc3T/MH7//8M27D3+eP/5/Pz8VrpXV4J/uo//+7ndvv7vy+frx6++/ffvh 828/ffz67XffLR/ff/z03c9Py3+8+XD61Zs/u0/enP7vt+/ff/z30/z+zdf/L7ibbb+6vHv/1t3X t28+nwZ/k9Mvy+qr+ft377/59fff/vGtu+GqKP3b9Vd4xH/8zh3KHdW/9m/3X/3yW/fO799+/uwu y53Pd9TvfjEvrnM/fov/RhdanH72L797++d32OeuC/7HF/SP9nLxP89d1Tdt6V70fdf05eln03/+ 5/efPn08ffv2m3ef33769ObD24+nP7//+Mc379/6o/zv1BOnn83vvz/95ftPyYela+7sv3j3xt18 +hFe2O8+fvfdx8w3C/qmmwnfvM0euDg341DUo/+v/+f7r79+Y/7Bd9kf3n77l/durHG4uubcnrra /5BX/F9uDPA/vqyq2t31OJy+rKvyVLfluXeHPzV9R/8Zxvjtv717++8/P/3644e3NJDTp8+/f/ef b38eZoR/93ffv3/76R8/vPvsRgaPMdIw/urjN2/fu//V717ev8HR467Un/QPf3jz6c9vP7v59/H9 959xUQwFf+SmyT+8+Y+3fqqVdILf/OXthz98/Ce8vi+7vj21tR+Csqm601B2J/fLH7o/9TWfh0aI L8Z/3X9Zjtq7vv6tm2K/+fTuz+8+/Jz/r//qF5/efROmXV+dBvqBl30ezHOUJ12fu9XPn99+4Ot1 0335lZm+xflXv3dn3D58s3z81vf1d35Zuon7wc3U9x//TJ/pa/zEff37v9DV499fuWH57ad3H/wx 4df4yfDVb99/7z76xaeP3//llx/+9BF+RnLot28+/6tbkG8/fPOdEyb+n75894Fl1J++9xLIC5kL vTq5tf/m23df/+tbJ1D+8sXVA//h05uv3flPv/nj/3z79Wd3jN+9+/rN+68/uldu9L93S+ETvXH7 UL//2vfYp9P86fvv/vX0h48f35tL/e3bDx+8WHHX9ie64LfuJd2B+7fff/6EU9atr/CP/60ftqn7 EZ/YzZFPbmzwQ9/9/k/swj+9d8Lqni77j2//+PH9u+++9VfyDl+HK6O/bx/kt3j3H37zgSZJrhPo H/UO/0LfyN/+m0/+9ovqR3xiJ4lun/S34bif3X7yDuf03+JpF7cjvfvzpzd/+dd3X+fPrAf9mv/1 T+60N2b512/8+dvm2vn9vf7p3Qenn5x+/73bVP0c91rA6euP3/7l43dOVZATsKx4+/7NHz9+evOf uMo+/7e+K6erJ6AbXN/+yR01rCO5rV9++De3k3z9KbqV8KYbkPduNr25Y6K+f/PhzacTvr8fsHef P3//6Y0IzTf+H5K39AztV06qW7n95ZfQnOYPRqr/4tObb965rnaq3T9+cF9/+83pz/zWqSy+gOy7 bjOqT/M38C/w91DQo3KtLhrXWtf6YnBtdG0uFtdW1y5l4Zp/VGXjWutaV/aujeVQTuXs2lKuUK7l pdzKS+X+r/KPumpca13rq8G10bWpml1bXduqS3WpS9eq2j8a19q6d21wbawnqKd6dm2pN9cu9cVd pL+A2h21aVrXOtf6ZnBtdG1uFtdW1zZ/K/4y3bn9P7Zt51oP/kc7uDa6NrWzaws+V9c21y6+dYVr ZVfhs+pqbHguf5Suw2fvn4AvBnwO3YhtwqdvMz4Xfa7uueDv0DZ8aoPu4n7R07W+oJ++2Vf027TS /4T/U0bVD1gY1c5/B0d1wqcfVf/cysKNrR/V2nVrzaPa4bhO+HTjCm5oFz+qOLKFG9WSR7Zz49rp yE7V4sZ1wXHdcFwrHtkWx7Vz4zr6cQ2jurpRXXVUKzeuDY5r58azxzGd3HjOOKabaxc3ppUb0xpH lEZ18KM64Gj6tmDzY+lG0T3d3bixq3D8aOz8gPVmsGZsflhoCFwvA3dqhc3PyLZv3BO/2ff90I/4 nPq5X9xzde3Sb/024OIZ3KJwM9j3C07NoQU3O3p8DsM4TO45u7a4tg7bcPFPt+JKfFaj6yY/m93l taM7ix1VGlMa0cGsUVmhNa7Ozl+AjJ9blFu5uYGjRUnLsQNdjQuP2aUueLxktHANuoFacaAuPEQ1 DpDrDxyeGYfHDQ3w6NS43mSZTby4cDhwOdFAdDwEE64G1+04hX1fUz87owO4g33nbv3F3ZHv0Np1 Z2d6cpY+1L5rXK91rt+GcRyncR6XcR238TIVMJWTu5+pcfOkn4ZpnKZpcW2dtrlwIqxyk7J1c6F3 YzPO87zM67y57i1dD9VuVnVL70ZsWuZlWdblshbghFjtBEfnLnFYp3VZ13XbCjf9aydKus2pdtu8 rdvl4sbHSa/24m7jMl7my3rZwqi+4ONHeMAyboDbDW05NQso2nj8pO5w3ckG5EXVjFPcb0KuY3Wa k8DCqQ4orwbch2S+r2YTqnHGk5iacPNBAcWTvdpN9gV0q6lwrpM4ku1lRTHkt5VKt5VBdxIa1cvl srm2ura4wZ4vk2ujG/rBTYDeyRe/xzSu1Re/AzrJein8Fzb/WLfFtdm1aXPz1k2iHpxk8Wuk9TLQ 74Tu+v2adh3izuG+sfrHsrr56mbhtI5uNg5+2biZ6Tc2vyPWfsP1PeMk/wWWiz+Jm8X+4Sa6m9Vu nXh55Oa4l4VeijZu1tdeOrgV4MbA34i7LH8W/5V5nlwbvRybe3CLpvNd4MWBW0Z+i/daQeHvfHJ3 4i7LLzX/ncktvNEtv8EtQr9LerHd4ML041NOfo+6wHhxN+/uxF+WW8T+O/4xeIGIkrtFEelFZeUW vhedBQrSzd+7uxF/YV7QjoN/9IBSw8ukxisXKEtKP9H8iDj54rtrQWHuLsufwwl4//ACvw2jKmMq IyrjKaMpYykj6UdxolHEQZQhdAMIfgR1/GT0RjNyMm48ajpkMmAyXH6o3GABjlSJI7XhSPlRmsMo 6RDVZnhkcGRoZGDcsACOC4+KGxAaEj8cMw7HgMPhh6LFoahwKPwwXHAYFhyGSYZg6EAHgLtfO1+6 XjredTruuTXuwCUpP6grLahLTbh5D4BamNfHGtzlvcZWoA63uYm/oG43oa7n1ARcq15tcCveqxF2 VGlMaURpPGk0aSxlJGkcaRRpEdIA0vDh4IGOHY0cjRuNGo2ZjFhNC4sX1aIDRcMkg+R2rYuOEI0P jQ4NDQ2MDMvEK6TTASl5VaxhKAA1ERkGGgQaAhoA6X7qfOp66njq9gH7XHrc9Tdod1NnU1dTR3tt rXCLY3Nz2Wtyk1u0XrfrnFhtUI8vm8KJW68HLk76Tl5FBCeOO9Qaa9QhCyclNye+vH45uUk2uDnh dc/GyW+vjRaom65u7s/l5Ea1Of3dV/MnN7hBM7Ytp0+Lpm20b6OUs5q+gmrtoscvRr8nfX9i/Z/U y4Ftg14MBjYeWuzABrAXa5272J88gy9oj6zcsQvuMDKXqYvDjG6wo11Xg+vtDS2gBft7xP6mHu9w M2twWyu53y9oWS2oj0/U+655lbdFc6wGHoPS71Q4CivabxNqjwOORYtjQaPhx6MkWwE34gWNwwnV UW8wuv3aX6m/gAotysLbILjB4yaD2z7KZVQJvHJQo7pA6ohfsrgFeB3PbgCFTnUre2bWtgfWvmne +0a6pNcbCsDTeQF9wW1gNktBlkPHS6JFa4DsAp06PElIMrkGZvh7lVCyYmpvk5B1olJqYeuFFs/A o0pLyOkawGtIVtGi62jglSRriUZ11fXEK8o9ZUm1fkCBrDMcUVlZC68tWV2drq+KV5h/4g6DI0om IpmLOKpkQ7pR9Wqa103YzpzY7hzYDg2jioPPo4pieGYR3LqZScJ3RcE7oND1IrdgcTvhPuklrZez XsqKjGUJCypgRbwG4cqiVdUSkauiiGSlKlwXqzi7urC5qVYh21oqVZ2pT2I1K1QjmSoLvmGZ6meD nw8Lml9+LnhzrAP3eU0TgUXqqhPgSKIuupI7Xse4gt3YuN0NRKiin2fw8xbHOKxaWbODjiyNq4yq uwmRXINKK3+i0mwKJKRIPPmrF8G07K7eTVy6fJq2M2r06XZQ8nYg1z7htfuJ2rHkwVlK9wBoV5D4 8bbGxJYHiaAebZJWRVHDVovYMIlx8zIWU/L4cR0QR5VdIT27QkbUmWdU4thad4YuOUJIznqr3c9i sdwHVMwn9oKsgCY8GfEFavPBCdKiJO3ZoB/REpjRKljJsPemvWslKqps34Nbyn4n7lGdHdHU9wou m/uuOW0Pjf4SbZUa7ZaWzf8e1eURDZwZjZ0VvC/AW0B+wqNHoELrqEHp3bFvYEArakIFfUEvgVfZ L95XgEp8hQ4Dvz23wH6DHm21Ee02bwEsaMt5m+DiJybaeRXafF7+t7jToKcJjcMJDUV/lhXQ5riw s6FEy7JGuwQ9mmipDOh+wHv3t4LWDH6F1mqJ7ps6uEuNn1S9aurICa6cTv1pE3vSvL50AVSvSvah NajRd2bKyISR6RIcPDRVZKJM4ioD3N3F0yO+HvH2iL9HPT44MWRaNLjBhhmB8wHCdNDJUJuJINNg Fm+QnwM4/uQTanD8w9hPwEPPA6/DzoOuIz6a0ZaxlpGWccZRBhzkCQd5pRHW8ZXRlbGVkZVxpVE1 TsALOgFjlwj54295ABf2ABZNCeynbdnzTk5AcYwUPIloCvXsmL3qAwSeNThndm7A4GYlLyBNE5ok B15AuO4GxClBE6JTP+DMM+GinsAm+AKB5cCqw1/x0qehH9UpKGNOIy6eQRptGmscaeCBpmEeeCHT CNP40ujS2NLI0rjSqLKB8y9QnBunjpTdqTi37nfbe1TB6NQsDzOoXe9W/p2mHYaq8e+UHsHiXri9 auzKU3Vqi5Pbtfzhfg9/99VLHW7+DgqFbviGn1Tj2S9sPdnxf/jvv8ClvOh94V25jUBicxJ9uzMg V7W5gJx71917EwXkSuPiJw/ogp5PCr51kWM/XdFuPeejBRIvmNiduqkbVSIGPR7YxAxuHUgOFftk W3MwDgy6AxX3eVpu+lnuddn8oAdSd4MVpl7FVmFKolQEqROlGPESORqkKIdSSIqS9N5IbkcjbeV3 LMGtFKe4KklyluZ0yOXQPz6qf9wfRK49bASL3Qjo+nlwrQvM+C9TH9ihFyz2g+F16g== IeWg4szmgyauNXvYzIHjQ4YD5v10d3np7NDjppfZ8jSSHAe95iu7HWrTEG15sunhtod3ktuZeUJd 25b3WzJtyhVwgDu+SNyW8Xy84VPcLz5+eo46o0MOiRa5gp66ZI2gkit4LDAWbDEbZ2qAg0xpiMmJ MTxf3vcaucef4nxt4Yr/Fc93xeN7xeF7eMab5wtnSM+xP8v+3lLXcgO7s9nzBf1kv8cXV/Z/0hzO pd+Z/UZcho14HIqGgJRob2Re4BHq/lz1Qxk2/hc4Fl5T7dSGzoM2K6cSFF5vqPg7HhhcjU1Z+ReN P41/UdZ91dFx+u48OnEcrukFjoXX1MpxGkEo16LUFKrvILIm82Kv+73M4R7SkoackjR40JLqSAq1 mdTaXBhII/78Uo3OmsRVJF3FW8HmJ6CU3VTSxk4Lkbfsu/AWR4++PrI7qJH1sWDgcVM7pFBnRqnI BLFY3Xpt2asRTFexU9C7IfvVyvHBCyILnNJBcV/9WaI6UnFcGH3EqKZQuHGIfjprcmK3gW+k2XgN ZyMXwjbT3tLh7jIK8Ar3llqBOSMqKgKxon3P2/ajk+9+h74g4sZvJX6kJu8OX3FgaKPrXA/6AVgY LeN6mno450+9J0p1EKOCK/5UdLPjWUMo8SCSuOnXQnCr16gLB7g0xLWCRrlCnEsiXRjroh6uWD8r 0Zl44djKxvEV8svOHGeZ2EMrvvke3Z0d+2sx8gIVHrGqJADjHbjotL+gL3SLtNQUiLcwEK/ACyLj X8x/0VoX1VqD3soeAMCbFW1gxZ64MPyOLrG2EDxsgtcyGoGg77oC1EtAGkFtgHcM3yKdJAUATnwV pJEIUqNI/Fq90YGsYyI5r58I4toK4mYOwoYFTckqXFDiVI0DlDJzRpWrYuESBMuggsXCw1KXVxd5 Nry82Ni3gd4NMO4N/9w7OMq9kyPycCQ+DkAnh3dxkIMjuDfIubGwQfWw1lbttbYADuqN5jYpNAit 2cgIjS1atWe9AQVo8NRiKxtzR5CKHQneY1BNp2ZDaoeEIP/OEgEDzIhhGSko45rOabROSJTATNSf 9L7FnI3OZ8/I51R9MJw1nLeNzxurnyneIB8auyLMIQF9ZFAHsgFT6DaG7my6Kci2EA5kD2W3hykg R1qOv+e2iFtAhgTKAHksgw28BSnstNDWLfravaj6onVKs1e/2mZ0xrRTQuUtfwNtq5qe9fupstZ5 LbH1Di15p/X6on+nFg2yap3OG3Rg1NW6nOb3wMHIZ+cVRa+86hFVs67k0K1o5I1ovyWpmXikpjVO u5c4GlkU2Nsn6e0T9zYZAfIW9XY4nTtCe6rK8zDW5qIeP9RDVxR5NR85yEN6+pjT08cv0I5jPX3n TiqjuMLE2mXwXNRXQgruCbtNPFYjVobwC3g/hKiaKEwl3o0JzIYum/pGG7uxI2hz90oXCZRWoeC0 2dOG77f8AVD6iIkxspExa6SL2oaqwKqBUnmK9RFaCagrlNwqBZXXbJ5ULBDDz/CbgmjYRFmynZtz DsVxmymO3EShPzeGYII4wWUUrDKN6LBdVppQoAQDfZMH9p703Ky4+k2x9ReNEha8A1An1LgviHk2 BC0KGPsz4Ta0sEK1sIVGzW1UfrvSoHOJm1jNqhYFoBuJMhIARKLRHe58tAOOHJn2D8KqktNkZvxq 1ETli+3IYEPuFb5GjcWBTzexmbhSWGsqgCNbBWLcKb5VowpIaiDFufzThsEvJhBeoEJYoVLglEJA vdA/R9QOKQw6UTQ8BMPds0Rt0ftJKRzaoOJDIfEOFaGJQqMhLu61Jaczec1J4+IEdvWaldevyIXs 9S2veS2oh61iDpMhDIyBJvu3Zcu3I0sXbV6CTw/OzEX92Jm4k7ZZ2lMV19TBmAWxQ+xijFXVrLIa 1FUTrw1ef+CEG/HS55I2GmOzTRxpuOClBfHaoWxwqx/Qhl91+UuaFFnyY2IbVUnQdlBzyMtNXN+A wrJmEdmKUFQ5KNCQkCUjplClK7lmX0AMqb0DUXvNWz/5AG7qZE3drIeKdqTvqhMUMipv6ggNmLCA OS8j0LNRXMEAzgX5rNhno8GuijKcDL7UQgxZoQXUaUuDJ90MnnRhj8asuMNRkaUD+ziwiRFhzZWc szo1VyIneeK0nsB6ytVkCYbDetiHB7BxUJdQrPuH3tsi7PikPScun+D0QUMAjOdn0X4atW8IyRZ8 QIy+ZWCeQDUFhOu2W2CDYeTduWdELvmHCMHZ4ColT1HFaE5qhTQxhcJ8KtSYWk32QjqV4q5Y2RSa xRTK90QROcCWpBNCFzCcPjjCQO9+NpZSuOlWb5adYgaKvKLxZAHJCAgnTHKHthQjkxHKWIkTjd1o exda1oEGqQcNo6rBhSZOtFKBfhfTNmkxFOOZ2ng9nIuxrU7l40aGOVQcIHiuXZePDzxytJtmR8pV UZWHWc/Tp6+R3OTDx9MfP717//7Nh89vnWGSfdt1XSemCSP3GlZYSFkhhaVnLNcQqWyoMBlUH7VN 0H2ATjFqJbfKtNq0hhvbKzYTeO2lAfqaQhujNh222fyeGWKGDcJLftt+bcy2gV1erqHYQa2DMucq 1DVGXKQrJobWiGMYVakoOSxAQQEfEvDeVG8kzBgNcJoCoJIwopp/QdumRX14Yi39ghpwg5ovOToD gCtO4pxJmQXFbgXHZq8Ivpxzs1FFtVfsphlnCABOHmE7svnxNGNKvVawwFg4DaINKHkEHs+MjO8E N3398eNCA/8VDsiAEnwd9OyQLCo6dojjx2p2YC3YKGWU1G0oSyYwEK07EBkQlcHASdOig8+c60Dp pKKNF5JILa7kRikOOtTPe1ZpKcJCMRbS1ldJjUetvWCATiXkB6CBlw43O2FBGHEfnDkMwwAizVGV kAzBhVjTuukbvhpsMx5aOM4Ku50XlksLA3WnPiszbJ/GAPdnhmESQ69JDJgCgL2m8j/eB3JtOGxm v4DE4p8O2nzYkgfoq/WgbQftkm+g+9W+lQfN7Gg2nKi+FPGoaNvFwMmjUal3JfhXBMfdkWnVaVx8 4Og44f4njXdJk92KLXy01yQjwG8UrgH+kuQAaQ0jwlvOFOjYTdKzs2SY9IxTeKDzBHQEV0aPoxeF PSnSJLVA9iNphC2nRg7CARBoTl6WkX0t0uwj+F5sk6SEgoHproG8MK1KWs0ZDNz+V6Ej+PEfsEQE cI1bnNvaQADACgFucbvys3pFwp0LGiwNkuz0fp4LuPVFH8cHROoCFCuUF0+rX1gOmOOA/klzqedt BPTOdQqq9dkPJadTU4bfHktaOVEu3h+CfAbPD+e/e+ePd/1M6rEwXp/I5yOeiuDtoX1Tds3Og3Rw y+Tt0m+Wfqts0fouMWnUW90T7o4t7owFJoLOTob53bBxO6E3ozfM8BwAc/gof8/ncPqkN7fTYcbm 5I7pdzZvx/qkPJ9WW1WiDpFCwImnFUcmQgLqRfOUrYsopCOTu8O4iiD2FgXfh3EWxa6iqbXJx6kL pIadF2TnAzEOkN5AY6wnQHwBbjpAxhUw7PwAkRcg8gAE658sf2fz92zzi7VPdr5Y95IyKEmDI+sL ceJgLWnLPnXwwsmDS5Q8aBMHJWWQc11pZcoG2WvjQbxw4jc5kS41t0ppQspLQU2Xk3vAhnAF3vJn 5g6ZGOs1sjO8ZxKRjvyADBWr2X1esUeDPOs+f0ghECvrGMFqHNUy7BkQEXhGBBhRsdZQCN+I0Fes rMnMitoOzCM961+tUFoYBpLAQXKZN4iISGYlIxGii5432MBIEjhJBO8gOAtMAQYGwk4RPYklKLEU JejTpB1TvPnFzrqIbYvR+PaVoob9+6WaEi0wFr83GC3x9W+K0RJ/f8umwqBGgpgHyqkFMVgrwWpt xv+fw0ctJqiqgb8YJb5P3sqlbx0lcHWemeWYyekpSVyKcoKjPK7jNC6r0OpG7K3OFpNwcAd2Q1wh R1qPXEOSflMZOBGlYUiwmynPgDm0iEGrZFahTvmzZBTCCEjvr0nQlTseFJEmPW/xaBWDXkN4WqIw IQ69MtvBJcSZY9CrDo7C0kbO2KWc3VmjqSQIKFkIJ5cX7CTUvf0WktC95Ca/bYH52yunnpPB5iUx +Un8CiUzrQHX3ZRovjCNwMAp5v9lytnLHxB7DuW3PC6cxUutvNqqfANO/5WfYReJdhK7i8iJbQsX IAeso5zikFU8kNmlucWSrbg9XZ28XyO9O6/sAQafp3P47HI64Ea00aZbZJNJ0twOSFw3B84bg5YO NCYcHKO4XshnFwuxVt948IvHPvHYF75YT3jwgwd/QfCSBt9ob/LexaE9cz70YjLgN1REyI3H+knF yfACdW85Jb5jDWfgxPgxCvMvjG/nJPl4idmFFCZ4w5pYp9Ocp3pqKKcUEDGMNSa7s62xDSIIQdy6 XduRf6ojVBsYEr24TZk2Z9tiG/CLvNNoO2gX2wz80bP4hGme41WR2S2cbTKvZU5LhLNhq+sC7I6U yDg5I8m6kTgmWTKjUpFo5FINFjFW3PWQrh7r2/kmj/V2g3v+KdtS154c0AvB0luId+XGK64pp1dF mhXklasIRG5jLZYvYdq5q5ykwSs1EyDax4pMR2+7jg0WzrSzcAZQEycYONa8IbbES8SYaOHdKWti C7oFBAo+QXpbGr6YN1HiisZuYebEDdhmObJXctaKtVXUWpG8PYjslYGdl51aLWS3NOr05GA4+UXJ iqEmflMP704DgXkA29UF8Yx2xwEvxVMa5N9+0mEiXevggM9v/zUHVIFR5PiElR8AzdrSpPWn+RQp oUgDURq5YRVJQGohtWiMiKC3lAhaMKvWbI25oIPpSqZTMF8DMtiQe4NaU4HX26YW9YbGO6T7RNhg Zd5GUwt2aYatYYkWBJxggkeNL4S0oEUtMmwhGTG0S9qsIPW4k6HpixbR8ZyliTCRStgsCqxf4z+u 3G43ZoAdzz0AYkw8vKPwiI9SXwhU5bSvneO+W55bZ/GdBn+6oQ5X8eiBCPHCwBmuutIwCmXs6VDn gm7Kfbs7OxuzObXDeRwqA3J55gGI8uRceS6RBqExlMaLRXmcqV/419Wp6fEIpwYTFiqTC/3kr/IZ AxiHoTdxGSD3vepMPeYvfhztKZ/8XT7nqN3CECSu0FOd6vpMecH2NPf8+1PSEeZ3bz58/fH/OH14 ++njFxD/iYe9n06lvU2ooqJshYQYw5J6BH70JvLu7ImRhBPBCSZgighy78TcC7FPLSWIiP1ppSh+ oLpf0P6s/rdHlYsWaLmzgi5Y2OBpY0i0LLFanlrNxkADzVoNGgQNPGujURqt2mjNU2Oa3slwwztY LiMwpsTyI14DwzjuY8VK2Dd2Y+82LHgiL1bKjJXOhA0OXHzWuWfZ96gIQR1586L0UuCE9YtJgNhP jSHh3Nsizr3SzIwOlF9NpkQgV7sTmnUv6VBKBd+a2hVhPfMYwxXms/nAuZ4f6QMOtA== XdLSbsRvkOlBoD/JDL9k0khWUqU5SWEeJGyMkGDurxMyWkrGSZ27q2VlBEVw2KkSSBrbCLaRI2r8 SVU8uJ4FIjMWPTBgqhhYodRwKEEma1CnGw7mDyyFJD+ZquNgQGFR3GWjpAx53CXtKwNX2kDkpZsw gzIwVL46Se8GTTCXNaY2ebTlxS3uxq1pnzS0YoJQi/lAC5bF8CUxekwLX5fLX4NLfYS7cj+ewKYO V8l1nsKmzg5YeBJTxR186nAEnHsKn7rFzcEN/t/7GNVfefJ/cjz5hG54dGyzo/tXX7cPj+9z1u3V EYZjyOvzRjis22ePcUrElZj94R1ne5X0l36qfz/XLjv5t7HwbP5tmyrOO+qrnfZqp73aaa922qud 9mqnvdQBX+20Vzvt1U57tdNe7bRXO+1vwU67ZofdsuHuttOWd+/fffjGGWNvvv763Zt3Poa2e8sd eXy1z17ts1f77NU+e7XPXu2zv9IBX+2zV/vs1T57tc9e7bNX++zHb5/9PShx04Lp3qHobSh5y6Vk JRc8VxWXMPdcNLfL/EtBqSe2DuC+CuB9/3JnLcG/B16x+6SydFhzA5sZVGAGBFy1OqBhOJvsUEYD aRaqLlMewN3wxYMXL09K3yeKJOFCjEjhwzzMcRhdnYrwBGlzqxgzMhZAbjYmMiflMmI2I5yZVIoh 4nOsIz7HVW8nLWiiPI57onu4KkSZpzG5tXBzUmvarDU4uL2YqsmSNekN0vqiYnbRW7yqhIAh1G0O NZujWs3P1Vqf8Hj4gET5eW9q150J83Cz7OmVZPlczVO4XfT0es1Tus0XvclpgNu1Xf9LbvMFb9Hf Idy8xSfWr4XHbvJSRvsK3yGJJSoERaIYpZN70J7ItUSphxoi2Al8t24Loj/8vtQgT7Se4cDblysi nLJQ1LGjj2gM9q6mlBNjQ5Mw72YKzPe0AyekG3Lo1I+1r2YQ+7Pcqa4b/kemtC2fY4vn0IA8rt+L pkCHu0+lvOOAdLgXskGG3s6XI42F60pFO32kcEqZ9LBDhn3f75E4PocknvjxFWGFH9sP40WOHx/W r7b3d5MYxyaa5lNNhdEbrQRIKHECIY7S4fgLU7J0WzOSBicQGeAQgY5RGKVn6J00ReKLlcpFtnaR XGeh15hepZBkdlSZr0GHHJOSJ1dKJGBCSZ7WI9oRu1NhC2sBPVP7pPGni7SdKRT0cqXBryJXK0Tq 0ruSUu/Z9vniA6e6XH7gEg/8ERGDhPKQReT0oDeTcoo/SQelke18xVM3Xp6SbUAuttLd3OJuiDjY Sne1xL7W+QWNV7G40/tT+9R/b3WsmPDf+2R/wDz/VZnXWs9Rg2rsggosWRfBtvDKKinirKdGKrg3 +lU93SmnT9FEiSf4WpjkqNTvccGcCq4GSUrjJz8OlkUbKOyiZc9S1YRK+kVvF27EhHIFmK/calp+ +dlaKd3sC46qv0u4OapPuFF/n/D4jfpNa8eh9XIR4w12xdTHZ8eLJ99jcGe8uE6Cg/uIMfcYaKeF brMdZ5k3bDWfg3gx0dbejhcHDtqLhgc1Rsy8s8w4C1GkOIkTPxoLNnUWsdJiQRTZx3HC4wVxZUmA UqblosE2LhiWhF37u2AgJLHAuISnNRnS6p0h8CcYARx10GFPgQK1Ce8N45Ab+FDBk8mK3bhDVMBp NBFhN+yPRnll/dHISZRXhi8zeikVYXUzno9R3jCEtyO8wdS6K8rb3RnlFXoGGd2IEg+igL+say3S ysN8T5T3YqO8toqY8luP/U8xfmtZrq7Gb4WaPwiSeCoGWhG7EQRiRarSiogh4OoTvr5Vw6JforcV CvyBaRQlfttz/Hbj+G2n8VssP+GdC776xIbR29aNsK+zdsF6E91PO3p3aDvDy8ZluxJeMrrj9Xa4 5lD/aY/aTzXm+rKj9kNFU+8dtxeNpj6OgnheNDUzds/IN+zHc1kVY4J2lXeR0WcsPS6HPyjPveu6 wNaT+xC/5a+w6uiDrjo77aQJ38p9SN8aBqde0Adtc3abkKnJlftQOIfcoNAH9egrEjcRn9DuQyqV PHqVgj6oOrwmU/k48yF+q2hcf/Phyu7slKkhfCv34Uvldu6q/ZZ9rgawe/dUnuoIOewf4o4mrWBQ q0KUAaHOblgZGCK7UNVRiLTRWBOtM4Z1YkMccXfWfH2kQ9foqmn1aukpegw9J3TyLOhGR5/Pir6f S6Rqy7PmW9sDLN0zpw1SeLLSa6v0Cht9tuYK6frk5+Drj+IvZgOdIvpPwtDJz5U1MtHL8B4Csy5V d1hNdYeRqes7pqlnaRzJ41giq0yGPTTtKTI5lLXY+KrkumZmHh6VVl/I9IVGv4oojzdlk5yBaSSF JD9ccB3xRm7RZjIJW6QttbGZ61q50M4cXd3IVyjU/4HyvzFXiuzNSoppqDD1opUCU8kvLfeldcRk XElHMOo84ztZWlL1dQT2kDgTC82rUM7ZMo0LYvbCETzU7tk9sLMtY4x48AnYlWzXsbuj4AfYB+qy YTpaZJuuz5JXaKUmsTg0pBpvG1YoXr19TugAnkGt5hX9whuXkSDzRaRWiWUmaiziS8uKtQurX1gN w+oYocSqVTOSUrWQqbJ6pG+gxkE1dh/VhZIysPBUTYhoRIWnlQpQ2JU2a/3fQTlZY05uueIlELGC 4WGt5dL14lOKbtfVqdJSIDtdifQEbXv26yMiszv4B9ychaKw8HR6A5IFMnufYTcceJM+D0Szh2yK dX12i8koNo8filSTohw7fxynvFS1Z/orhYKv8LpI75Wnc+vrePrj9P7TjrgVR6fZnYbBn81oMy9z vMcUjzGreIwRpQQaQhT8kmbqiQ3h0ZuwmITGqKB8w0FIDETCLkwWh8pmlHoSKrPBMgmXlVEl5w3i Ys5BC6jcrt5hzQmqONGgn3xGTajCGuADissL15jo0RW+r8K5tQWoG2RRJ0jDIHYqw1mwi7tHR4iv xElQ9hqdXd7JNbMPG2tx+tgoua2935Lcj1HdHJSLKCFJVtr6OR1rQBXGyyovgb0sZqm8sRayAKom BI70uo3XcSRoVtxTIfOGI0sKKllHoLgCxd2b9wXGKUCJFxCMx1/dgBkvYD67I+MGjsvWUaz7ed6F YyMVVDY/A++RM1AhtlBpo7lOtR1KB9VR6aBCRXyoGoSM25AtGmRLBqUFg0hhsvWCIlAExKiIuKhz y9yloZQx0sIKJW4vom5ARzSL4OpcVNZ0fOQgZCxiQWhkbB2dZi+cuCL/hV8VK0NXGYbfZ37/ITld 5cR0FUtpG2oc0fcaR8xsuNEGHCWF7sKAGF4oEMXKBo6V2UiZTaQrTIVGiZMRaE647AdIKjLOWqJz NZUYQwVGW2yxZpSdlNPAkhqQqTcdqopSfQ1bYyMuBmqrfa5ac0PqE2uV4n0lz6Nq1KF+sVbogKiQ cVykuk+a1KcOr6Skh3kNB/Wlr7V8XWoeQbhZ//oJ7VowhgLYnRYY9tbyZqIWAwKV41JQlbdqgM2a JaoIVWqoLLgp0ppdBeeiSbyMohoa+DR1u9jwsdW76rZlEvSOSdAHdPkJqFBCaStToXNEjaKkKSX6 nhbdUqNPEUH64oE/wpNuuNK5eIrwpUurlDa93pGnt6w0dWBY1OUxJG3Pq37MsM5BvohundtVvvWk sIppcPwR55I/oZE11CuclkrXhLJQtiBUZarV5GrVaAFeuIzaJtNmbQt7K67WanrRqk2vBzSv16jN URuTwYuHkIYRf8Pug9DGp7aXC04bPDLcrOEuGJMFMUJb4hNuFS3EeAWgPF9TP1FyfSnbl7zDS7Vp oXWqPdFpTfUZAxoexe6vqAKWuS3KohFtKL9ve5B7gcX5KhWwPeYFj6gueGGKIE2UoDVGmX2cufeg dC8sZ7S0fAu1IyokovCNSkWQMCPB5aUTiQERJVRPHikpGjVT6SGmreAPZN1Lue1aW8utDw3G8Jij ttm2qxZVZRpmCQFXm8m1/qmN4K7W+NibH7EBYmNkwQaJ6tUDh8okWDZGKFXBqMbAW4mbWZQqRc9q j7IsTQhti6rdhlq3nda6zVa6tYVuIUmmsrVu42q3JRrFtuKtpFjNPCpY9xZw+vRc+9bnlLVcATfU wK1wDZUMS72wG5PaqtY92fdu6c1SPkjrussmJjs8KxS4bqk12mrT8KzAflj7iKqpZYrY5KuNsdoL h7Xtl6c3srtv29pH1nbqCkWDG9Qbaq3uYHcHy1umv1jfsgDiJVACrwILlLcr4QZqmxdEqBTdS/5g jN7O14fOVYfO1IeubYVoUyM6VImmlTOzzBijatG0imQltb46kJSOlkVV6SRjCJLUT665ZKCxe6Ts /RwaSJUsXoChDVHrk9ZlGkoHoF/Z1jy14TzkP8Kj0hZWlVYYNPVAN9OCKbgASoxF5YY0K9tH0wbT +qhxCXGIpEwbSZvGSJ3Q0kcZNxCxFFq2EOq2a2u2LVAu2TYftOlqc6sUVArm2/0mAEtPKPtnti7f 4OiD57TEOxa8WSP5jigQwAEKbzdW3sHklL+x8o6lqjuPXWfrAz1yDPSNDRwZObf87fNIJaKKcycf FVLhig/i3vFHbXPFsF7kcI95zoqs66yIoBW6ocoWK1suzQSaUDQBJ60+LmBfqUG+cvCSyJ0UayEx SypK3uAS7lC9ltrkUp18UplB0OAVBYwXOBdAt0eBsklwwg0Kvx718L7OYh+e/6gwdlIDbi+xYUE4 hwuGVArUNmr04TTcV6PpmRU7okR/jkehYk12a1gQldCGt1ahGKZkxSQoJGEhGxSinbhj7V+zwdxM 35J92KmlwPQJJe64ljyhRfIEv4luuGn6bbLF/bDCmtuUz0TZTATO8rW2By+dayy0vWKUpnc94Pks Vgy4+FBLKciP3iAUAkrB4hSkoHR5FarAaBCI0AqCVeh2dTpLU6fzapVO2MUOdnEDgmaIYTvsgBdZ 6EUCFLmkuIv8jVy/jfgmkkKjsL8BU2YUgx5kCo1RuCgiBEvd4MIjp17wJG3A+7/BZIqHXHGbEJ9m ix/ki1PG+FrB7YxxC0xJlKqH24/wgFPcIKNbxv8y3tHm/QFvtfmu5sYYVC3et/WwbdmGCwpUA5fK 2kWsoSN2P9bdU8XXPloqCWpbb9oQtVGb9UTMprn5Chz72LRdpEXu9crUGQ1u9hbtHMlYwaqjQHV3 KZZk0VQGUVWym71lZ5F1sYfKo7M41jd1qofioxVnp1U7F3rHWKzORLgH3IA8nSFaEcdmybPaSx4Q ewayNtWtdsVGA35xvKzyKydeAnOY9JCb+1FF9yKa1MH8CQ87hzvAF/vJK1OVzGOJ1Mn8LLgGbol8 hTQ7eX4Cx4E6jgONHAea0GTXkricVlUmM7OJAj84I4En5BYlV5U6+ywCcOQIzIrOzEuUK0nQknbo IWZRRRdmSJmzVcp7E/cN/AgxDUI/jZDleomZXvy25sMeXtPbU6D4LZc2NL8ZN8DbmQ== bGj+8w03NCFAaY4IUPakW0IO8aLtJQ+Ij+vaeGqKq0l++wqPD3PlanZ/765w9/EdnySPn0oq3usB Dw/GuNvtZduP8IBr3CB941nNPGC57zHf1SYCcx218bAN2YY2Nyx90rpda5PWJC3a9YEBZaFZv2EU LDDR28201TR318C3Hx6TNgnBDdoEydBpY9VS1dgaDI+PcPmUjHAqNBS8Ka/Pql08C8MPhyqI5GcA DcN1zKLTsvpcK5tOxS5Q4dS5cLxw5bCGgNBp37tzQtzdXvKA0615+JwZOsLVqarT9eZs1VkK2cka q6j5WXowPyGZnNIh8ayMZ2Q8G+08rGkeJjNwN/fCvIvnnJ1sMtEqEHapHW9TzC+VYZiiAFpE3bR4 kK7wTOWiaEWWa8omXMYplxHdUY656Z502TjhsgKTbylsoZJqWaovL2UmIvZM5SUittOSMUUHBvpz 2w98wOrpDTJvZgJEBy0TV4YoyHw5bFum5R4LJFvsnLQYoxiDIAfTFMEm7lBpAcIZ0J1iu4YAoAQA QnycsaRBFYk1gEhkJruxFV9WUrFkAiOUgjCKkdlLIneGHWldoK2rIMNaF2SMJYPLSZcqEi0oWMCk Tk0ZuWIo4SKatTkRKi2TIZowmc+LqUsCfXNCj48rSWQrBJh8AGk4j21b2QjZ875OKUmM9z5XeBAf qeKQlYeby3vuJt1LTCTyCT7uMEN5bp2lfuqac9HYjOuXOiDB2vnGzpi/VAksXYNqBIfXECHmEfkg TwJuf+QojwXqmmygrsnnQNNjj4QjLNygMGNJ0SUk3AUTFivlXGoAMxMlL3Fi1pSFUhA17bDS0F3H OdNTBEleMYCFdVoA84jS5OmIwgddV3XC4bNk+EzR6QSGaStmS7XsZBFXasTUY9nJEJ8Lyk4m+TdK uGRSBkKyACUKcHwkYsxUxlzjJtpHIckpEdOodobRpjejJUnUG6ZPE26x8KgmojmrOaeUMr5HTmyf NHWUEkZLZryRvFjhvRkYhDF7rEYYtEKTZPfES4E8y6a+C6ecOMEX7/q29EuSCdxxTa2ZKZfs2NHI dQdkuxVEmcDKlBbxyllmucWkltHI9WbkPKMcog154NCI16z0ONt62eWBX8sEr6JM8A1MVrWE9kJg T7JT95ngNpzXazat22fBBPI2TaqVtFpJ3woJXOUuP1XYWhlaBgZbdge67CANuA2aMWSzuu4hHjmg HgGrBe9z4tOM+DgbPh6lMEaBVWDbVjDUAiFf/9YYpTwDXYi2QmaMJk2wCyl2AfhnoX8W/MepdqDK yFNGaDpMurvAHXl3T6KGgYgbxoySXU+b0WiXiMVgTjDlNqDOIXV4Bkwg5TSIWA1gBxVojFlg4+wx YCCGDJiIO6h2LDpxChzIpBxKdnmSb4gqLhymHOYTDnMczBEDM1gK5ojW2f9LTOuIxI4at59M3b9Q 80+43m2oA+P3YAL4FSeD2fi9RPAlhu+j+MT63nLQw4Y9tu0CnKVS4rPkHBXJVLnWcL4Q6a9wXAaW S62I6HtH2S3p5gcuVTDNRG+/4S1TgcOO/IH+fil1jm6UMt38TU44SRaN6DQ40fyN+cwbfy8VXpmP 4YyuQ6lkyoPZH38F8r8KWF+plWWnUQ5I/3NBepc8E6RlYtUSap65s3f9vDllw0dWF6dMNKw+LEix V7DO0GOO2WQoN5zG8FdlOEwjRWkwKgBgm0TF7pXAB5VswHQ+6o3a9IO7f1TGeietfe5e5bSsgWlI KqdJDW71bcxRrRBpAUlXEVA6hklPx4kEQiov1WSi2isMf24Z8czpA5o8EEqwDJovoAVYQJnVbLGc tL5MWtNKC7DQTcpNpfjvgP4+vq1ix5U/gfq8As2YJRozNHHJDcX1ZLSaDFy9mbhUjimUI3WaSPDE DvG866BmOpPIcaAw/gjID1bhirD8c1bnOtrVdV+HhD8+bO1ZD2Tqg7xKdLLzORz+A9rtnbCSdMpK 4jlBxOivvT3uiUA6ZDFxX+/dh2V9qlt/mGC5P3gc4ofzme31CUlJeieTPCy3ZkixwHLdCzcZR3+o Gk904El4gWM95E+oc+6EOkqZj8DzFl7Pskfx+ILTHxWpOxmk7sI+wA1rMeMWLZlypcJaa1x3lK4s RuaokLJFjU1xEyC4C9hXELKYOwVnjbyBSG6doFhCCnPDyKpeN5YZ1ItgC6KkDMCSmjwrQVVgAbbs zpxZbCmehdF7j1RpBlsdZkfszZl2FagBa4nRpW5rxOptXBHXeJ0VwWKL/dpyvyPjWQxUk8GaQj4Q lL6OoqLuqn9KzMOvB7zngCX/LAUdz7yB3ps1IC+/EATO6sfaKOWO/FjoxGp8EglmFhCji41drMbm SsIc2eBH5gH6asPn9ZaJvHgTkJ6ZgE02ynMUPGIknzbGyAH+6kzrd23ItJF/jmzZTpLZDwoPCOgN e5fhYV+T4XwxZAAFm1olKC9AYlUpdL+9dJmmNAeBNQBNe+UO2DMG5FoyHsaXoK+BKAYkw8Cmb9nM zosB3gcXgc0msG6CZzgKcnkF07qjJILEQRDzEcWugcH4jILXyHLPbU4pYGfAFDn4bPZo7OOLi7SK F8n4kcCUXNqXMgqh8BAIt5mkqcevClmka+JUStxKWc7hbPwb7giBP4Ez2gN50RaQyqZpy2UKX5K2 RWsrtAXMUgzonbBqQ0p8WN+y9jsz91qZgaCT0AayoyhzEjoOktNGhTUKDCb82+tc7aJIbxzjNfFd nbwmqAsa07UR3eNorkWZxIFcnePW6TUbBElAj+xjuZEDLA7ngonn7g2zOKprS32lwCSFjYBBJSWp qM9vjO2GJNP1uU3zDSBJpL2nddcaHH7UP7GxeQFRTvBRG+9uE+ToJTJtvqstcY5zvq13NKMiAP+K IvyGBnNgWjcfkBZiNX3B/1d53vGxKqNE2AeOgZZwL+ZyQUF3QgxoiqoGxEsKk+9TX597gMds3jZr 9Lbe6m2iGLpUuBHPpvgzxZfZMWXvvqJUjfaxKWMDmMIpzOFNVFdKAqk2+F1rCRvhUx4tF5en2hQW 4toQcAmpskkEMlWJ8kVsRptusUriT1LNxtaziYks91SWbNpCxGhZ6uIMWTONVrtplWdGqLbkEShU J4jYVScthpNp1u4Up22prOYxp7lwrfdsn0z8JLryQFm+KZ8zPUthdaZHrbzrwrwuNEISi++U2XlC duoJ0F8oqdGB1/nCzM6SHV1wzWrJka7Q8xhEdye50sBydVQhODChwqwybDJCaFF2BuRsEBYHZXWo wLhmak6obhi9YfKnOMlayClsUlRMZzHC3alQCVFeGSEkAkoioFoaY2l2jHAR9MQoXPrAMAoxQeUn QWCYYJ+bcNQL2EL46jfS88hoBRMZoEfFPyXpW5A0FcMzauWlaU1CPdq8/hXgH12UZ09FClolReiV 059eBzaGkXE6kovvZhvwtLP8EESaO5aWWmLm98YdDcUYE1RA9OFVNovA639PZZWj2iq7mjjA9lNv 4+sJR7cNrt8k6IaEDD2iQ48I0ZdIKzwsTwvGW3+MH96XVU0Lq26C+oOovqqQSwuldCCUFjrpJqaT 5hbIPwKZYMo/uHc0hOo4oTLDrKiXgKbI1T7YzMjaEgJqP7cJnuLOfPw9lS/YwHqGyzcOradWR8bm gAOjQzDsS2J3XMeuu2kFURpFo6nQQX8MK6fY5VMEI2WzxkraDjIH4loWAW0xH+BjLGVBCq5Q2xd2 rAU33SYZ6zX4Tmq4arWmEOec1TrFuGWIYMv3oJVzeGWDWYYItnwxRu5BStStZKU4s+Rq+kdU5F6A iFvE/B2yWLuI8ztT75MjA5zRCqa2tw8NrAGuyAgIoW2QmMBk4gGb5rgq+AMU/THinQX2Bgpko9Ir yEHBeg6MFdy4pl7NsRkuoso1VKVAyMi08lhdDwyz/OiukGCABALskbrQ91gAblLkRMF/pgK67wZf 4Nz3AN6/j4Z0fM8+o5d56L3qNhkG+pF5bwIT/aC7dMs7emM46aUaCPHPlYDk9BdWL1dWQEghmZAw ZWI4gRR57rVaEHHWN6wbEZr0mo9fOOn3xbdj4piQhRKTuAXymDkmcesjEjfFJiQUboHAbdAgfheo 2wJrGyjNoRAdClHbIDH0FypgR65JSNBuzy5fJ6FwOHZGBoL9pxHLH9LKY3WRHdArTVmIExaupSyg OgPHCVFWHKm/2gLZLLYxKiCQLUQTlRGwpe5kjI9GeElGWMaXRtePLY9sxSNr0Q52XGVUZyFEcuNZ IRvShmXdBXWCAwk8jiGryjuTvSu5REokSqfyRlBrirwvaI9JIlXJaVRebmBxdy8YClz9M672Hi2a Shft34NJ85Twa9wqVmDSHNOUAt43kzYobYp3p4QHXrjgtyQYY+jf4Sr7e741mR1Z3wn88F2mybae MsX3ZtNP3oEr/0z/IMhvdrzkS1nt67/fLHgPAcN+rT66qf98o0A67IoWJDXSo1yEsMOnrBUVR/yx ZrflZIoZmbJ8TMTGdETGBIGNCaObO/oKnNWBBEc5OtO2ZttumhOnJ0S0O4HiM27jrg2Zhp4viHh/ esOlErOExm3/UJohSJhE41buWpG2FNEKEfFoaIFCBlm95pttekqD3VvPf6BFC7Zq0t2tP25w7UOu kP2kBmq4H7RrwLe6Pns/2jHwLfwD1dMSH3wlBbrKQFnZKJqNP+O6Lugnr8azUzIzNWGefyhiv5R8 vF5rzPhj+upcPhGvdu8VCKGj1LxQiqtr3Htdb4gvHz2Svx5TlYyiFzV137lyil7p+TxbCjLgnYzj uXH6nen853z7ofBDNoOv+cJPgSKKPpTsoe7YKy0ZehdO9IoZ6jn+gKldNhVvIE7uSQkzEX1nGDI7 TegSlJ3wTF2YSSpA61qmjBqBkXXCFCWMZgFfJwi7mmVhxxi7XsmhRt4xEWwHgR+qY++tKRLimwha JpnqwqPXNoQGHNsIbTpo8+0WXNGlBoUCvlsCBXGV+UYh3r06YEMWHvKfblzEJSRPUtSoYxc+ue2p sMDKDnrJxavYD0/D1xFWQdLyAl7ScuYJZrJQhrA6GttWYZM9m1i8S9L+aRnBlpi7LmEGKyMOuzIE C0CngzShtksf3e12fVAkrzXNQbD1HWhoRvV+u4EBKasZ0dJKmKXnkN6otKyLBmstplXi9O4BTEIr oNZrwFZL8bYfrEoUh8aMWMxJGFO57RkIrZakOhTslKq8ArZFStpBu+XwzxVTPyjea5z+K0RlcCX5 MSrPGWXWhfzHcWdZKzvAUwzr6yiSkuhNi8RLm+O+EfabyehMIZ5p61GwPR5ae9COi2Bou13fPlfh 3sZhbJV7jsTIoISKqVLftc4yy+aHxLg6QHNTrw/IEUVDNCC+wZ1URNP1oQhjAJlhyHf5HTSpr4Py 4xyU4NSaVeDYusUSXxxNanWgSdoB1kLcCLKdtxcznYkTZbtQIJsQefOOKI66KcDVAg== k1bKooVzAAwdSRyoFHxnw1F7S0wSKI8k00hikz2YsGRjgpFlVNx274S2buiojggc+KAn8UGb+jpN lBwXMsii2iGA9ObW96zeZ/VGBPdzcECHSiFi6bM5D6bcTjDBQ/WPCd2Cgo8g/EQosqHFNUIhDdBs ulA2w5bKoNhuvtpOqHdhKu6AAlhtsZ0QxM/X2jmuscMVdUxVnWzlnIi5LsQ3TRulAf7qTeuS1iYt 4yCxDfTlDT7Sp+Y7PPlBCQ0jiubGSxQnjL08mZw08bKkRmm7OSERy9YgFjLIbcgwEAWlYbf0FZxg 4QmTXfcQcRFZlrPcwl8NOEGXvq58XCigKIRSmc8EapAvXyAwcCkkVEsMKpTW2tgLvLChFouBXCxK 0kkz0SiIwlFtLhzFAiEnDgZ1C6o4gF3trV31rYiJPfBI50pwYWptXIMrFQuxSAh1ctKiOCoYQNJX M3W4srW4EtFgBQSXkomlRK4GV50KC11/e6FhSmtdkxyjaaEmZlZ8wJMlSb1rUfo33EFK/ANKFtZK vD7iNBDUPLy6QeCmFmVHYfI9LKApzfnYxf9ydJvquE0oEUMmcsnjwuICTFpILDECRWJrwEuqK2iq 8sZhGhIYMyQqQ4hdS/TaxK85xie6g6Qzhxi2liILssNGsm0s28qPfa59x56MxocKjVoRhThSOTLk 5MheiECiWIgkiaXIXo6E+l22nN8FS+ekpboiVSOoGXFhv1TRSMtoRTJlL032MiVX1q8VWKSVKXlZ kq67vRKi4gR2EmVXePJVsljJgtVjF6dyeBu1dfPQ26abs0sntEhbNyFLtEFn1G7IZqrQXlqcvPAy qULNxksjt3DBTfvKiaLVCZ/BLcHazQFvkPhwfu9WUu16fENBMbmF3bp5XSIiY3HrfUCzoOJCRn4V j4Q+abl80YoB+5F1+9rNmgsvtsktsY4XVonLaeXyRSOumEaoT+uCFO9Z2U8lbF8zHrvgSR0oLHrm fSDmB52RPANX4Plm51aYT3bS2Alyhbn+bycv+PWArwfMfZGd+NaFL+k2uZhK7LafJZaiiTcNZbFF uTca9CLXfM3++D5in5SQV+AwbJTDkMNdexBIZUAgexjIZirwSPUdgoIMEFFHSKWdUgEhjSba2Oom CyfXSFZNxeCQxsObOkaIpBVOLEK0MghRqXQyKHvEbFGikIGJxiQSMY2EVPraMHk7oEaVPAwi8OjA hBKWQWwlVJPyiJXsRxM0k5JLYBuAwaWTYpYCUmlTnjHBJQUwkoUXBeQQY4VHJiKbGFRsaQYMG0CU 6G8T+SWVn5P44+T9kKQ/mhT9NC9/n5HPmcSIt7Yp+JqBn8vCv5aLr1B/SFLxh1199n0J+LRFUDA4 SNDPJ+tfb7vi9c/iPXuVLK+S5VWyvEqWV8nyKlleJcurZPmRSxYNPvOkvuicrmy6llbbtbN6Sma2 ILwLW39XKN7CNKe0Li8EKADdo694QJ/xqHN+5KD1wsjwBTCWzakI9PTBbpOUYEkv6iQtocZnKIjF GWM+AtYTdxzlJ2j2WFgoC885k3Rgcg5CTkEDaSqBAfkPURuTlsmr9A12hVOyDTeIiMkvFW8XZvOz Iq7BpyTvDSzohNhvApZ0UpOS4f0K8fdCr0a/fYP+e5kk3qNPnn0KDXpPP4YKKWYo8m/1QQHDdxzJ QUP9LOKw40kycJDS/QSeJwtPi5XQD1z6stbhllwUKuMi2I8lSTVxyxEIqWJSMIODOoas5bJCcokd u4HOtlBcPc/P6H+GjWtkGorJbl5OYEpSZkEJh8ABEdrFGk7WoNIR/pXfy/xjwVcrjvbmx9qNsc9P LHG8KzfaNY544yMzLcuE2g1v4wa3dYMbS4ZYOqh8cCO9zKVM7LnyswCBOW7IvTPcD3+HE6BXydBz LHpmqTDrPrioINhUwrpRh0QKWPxhXBAvLUp2UMIsTVY6KoWG+aWEjh0kzxSzTBsEuVKWqVOLmFS6 Q+ZPrwJ58HHF2aW+YAhqOlRuAlC9odxSUmikOIiUlvDLWcpKSF7phVWRTrJKWShXvnpZgx1LXbmY VBvpEX8zC4k7FHUy71uTaDPylo8gSakVW/K+3jJ1umzjgkwkAUr7dLo7y47s9l8h1w+M+2HPjXfY 6+x82u7cGIkD+np5sxy7m5Q4m01MvgvR+EpDaJbzWVife2Z9ViJrjo8J9/MShcJ64oDuOAZm41+F hrwk3DVrfGA04a1OIwUczwITyrLhqxC2iiNWcYQqjU2ZiFQuAnUl7nQccLrTzfs6fj+F8TsevTy3 4tHoMb8iGBL5dPQGHr1W8S4lM69bJvnZBKKZ7KjV8asClOWu8YsxKnUYPw0kR6FjO37z08YvH//9 K49fqOHRR41QZPuarqTslUp543sMjWKU74FbZAaEi8SQkYDFNcCRKGvcbVOUrx9jcenfpLJryR16 YZ6KhcEms2bxE9yEFGP/swXWmFPmUQGnBf7RhIGUkiHjjMUBtbCQTCjYt45PUrOiXrLKXogKzyfa wBAKjBEUrjWaYwC1KAaOrobO5n0ddEw66oThbwqA+xB4oCUYOHW9crP5wmHwCbFvLdbbQcyrhME7 txArk64+IHC1cYvHJqv7RViL+iSEX61JXwmpKzZXLC7aZst/afo07PKn906offZ023V/G1fTZa4m dtDFrH6hqB1mK+/r2tnc8sPrsQs9yh7asrlDkjYU2PFzWXyczwVRCl+LlVfC5ShDvpILXuPGR2ch JN7CzpAIJqz4hjOwNnXcJAWebS5ArXtVU9r6CsWM7tSMHtVbKBa0OFdKdq5UoB7DnG9lTryG5DMs GMVUJQ4VtJZZ+hL3a8zreVQC4XiKT5wvxrliEFVBqMzssvNr1OG1gxuXP+BpDziwMtOYO9LMt7rL MUcm5Q9498NRBk5Ls+wGEzMcyFDHJra4hptkuMnAXsDY1xelPKp0wFMHsbiIlwPyIxlwGp8cN6uO VDRaJr1vN146YrCTAyILrGyyHJ+DLseQUGuEArS2XsWe71Mc+JsyfloOirA0By6nyGwUS1RVURao 1K4ILn27UINbf7MUn5BUsdj7SCIHf0RcZUdRxxBoEP92qkjkC0XlS0P1UaaqCR1JtiooiyhV8tQk Vay6mhLNUqLwxpNU+GW94PDzz0uKEnDKEcsWFdUqMQG3x1zsFVd7iWU3PbeWnxze91GhrPb1NZd+ Q0otT6g1ocKDHg+qv3hYsTlUa76P3YjzoyDKwLTZD8pqlDDXx/UPO5P4QJSMpnzSNe76QA5l6aFs NURmiIJMQcSUKCpHFZUni0L2+hflrq87IIvqdXxex+d1fB4an8C72L9AM0QVYP84aK1plpqoThp6 RiCieS0jjlebOxGnW6XpEybhKmRcrl2uAFxLLGlsbS7a//ve5573XErc7b7LyduUrRXzxGaq5YD9 w2SKHbXFtJT+YyJlaWIekcEkmPUm3zSkmhniQ003iysYRulmnU5V213bcyarlCzcKu7W/gWaeUB3 +2E5OjI8WR3by5REAppXo+Ueoww9m2cjmTZznMCr6XpJrk2hHXnkVbadmXZnLyUgPQV68EQSj65m kTzSTDos2D+SLLdr2Slphor6IeEoSSXrj8x5IX/gRAMKmbcv0K7K1r0otg9LKZYWGMBNWDwOK6Ni LmrEBDPGeiBa44HYG6QRYqlKyvQFJt6YqY95+lKaPiHpAy5DPCBuYnnt1tdu/ZvqVtWzIulAQijU WLZGdKB6UoI0pEgruZAgUT1hFQRheqKKG5bkqWYYZseMaYLCjAnTyNtDrt4JLAgzqdrSJ76czZQd rbWK9RDTWoNxojJfaKALVbLQWj2n4o5ZFF8Ze0xxQvV730lcSSPuUOnUQT0T0q0rhsHIN1ECY1tr 46GwPGej6WYCHEopE+lq6WyGvIJBvYYyORb3aqnN1NGfR776bgdbKyfjUp+My+ySOvnVwWncm4Au 7Ac7M8zTVTq0LEBrh0jxGCn7Ebp04lRZ6dIwd8uEoMx1JxgQ8SoTOOnUGE6cAIqjjnXdCsY9mWPC bZS07RhQHPHhejUyMzNfXq34Gzzg3oGYk3qG4s4rj2so73DRQphS4kHKdUjBDluyI3CycdEOU80B CxRKzY6Baacs8VRMPbVmOdoC81RBgL4top0KZSyFHLw05OCzkoMLNXjD3otCCJCC4+KYAv4JJPCA XOGvnfnamT/WzrQB34VNVkHQNIKdEWuVMTODQmU4dR2pnyhtfURqp7ZsPPylRMDLwoWxerQWGyRN KthGM1gqQVJ1hghCjk7wG4HeEPCGUuMbpm0oKS0e0BKm8w1sqdI5K3vWgP8ZzDlj0JY942TOSOes FNXDifgzm89HZy3IKbsqy3nMc75jOucMiytU59sFEGhZYcJDi0kNA+YrzIiZ3Bj6+L/OWXUyo0aT 0q1KNpTmQ6kWzjo4KS1UjWUwCr5/Uim9LVLy6cA9ziCTakUHuDB/cqGalairorA2rGMRP698fUan kJ8tyl7KrIxR0bLAJdhFbIIsd/Aa9Kv2yyK9xt3X9wc4qJllqSBzpKkrH8DUF22EnLvmIqHKx+0Z uZkz+9wJTTa/2Jf4fPA4RPEdMaRX/dkZN9VpGM6ePfmISD39NyIv94Tnnt97YC703v/dUuFR18LX +uFcOCPYsJU/+at4RieAnCnhicTL3tknlmrdVzZt+FmPnuXcHqQ5l21fh/M/eiCq2CrfDT0vNVZb qcVa6dONwniu2rHac7c/eiC8GiVZx4MhI72bI81IFWn1Gb5dl+fG3V64jGcfgcj1K9eD2Hm1f+lf yE0UPMht5bp9zLxwE8uNeXP2gXnDsf9SR8zMe7mFEkn6y6N5n/7bE3tayg+ci6J9Tj/H5QtKucdC 5qq84/9/9GV98QVW/3Uvel+RwB+mcyfAkgChWPHDh3qMtr/I8vYXUdXgRHmVaoixApurcmkrXJKs RzkPxBCJUlpqWo6olbJOyvqo10WJ381roSVHdUX5JMUT1U5ArXNSfRO1TdQ1RdP0wUkfWbQVsIiN Ma2ShJFA4EJJFI2lWOyahGEPwoAchrFBGKfNQghoSeEkhvGL0inKX8Xlk1bc8AcshNpEOqzX7ToI Cmxkhhuz5NbDD9yC1FcT0l8NOMp+fP3YhjqXaJZMyIc1mAqHvKVrCUNKcJuQJ0uYsqTukd+XC+QE 9SO+CSpgQrrhUCesxSkgWIAKSUMDDiBP1Iw/wWACBnTMdhEmnOyYQDscqIctvblUEmMKYiIRlJ8B HT4yepJQ4rbEWGAmDcXGlHDQkpQKTSlBpFEXFCY6r8r5SUB6m8wDKUq7cjVlcj7KI3E+AteVFy7/ hdOiA8yPPGUpEDMg+rx2a+C1wPhai65lf5mpkBCj+PoYd2lKX7glAJyM1jNsb5SkNFOjW6pzE2Iv IPWocfq9FOO2GD1qEleQWIJg9CgxttCQgeSq2trNjYfgx+VvGJ1P3r2jBInwemD3aA== HNSUoKeEQ6nk8gUYGldxKYcqKugQO02l1jbV2554csxoGcj0wHIPCxur8iT/qqUslN+STxLTGAaT 0xmdYHgMew1r2zSTUPnR5pisagYnzHCg8dtc/s9xvshT/Y+0viqNg+y4KHZMFDEPReIyFg6KOAJy 5IfPAO3zIRC4UjDtjnJpPH9NrTR4RrG0g6AWpW/C80ul5SulgbWpg0ltbNaoVElaF75nEUf26lRd LVwCCRD9GhTdVphhSajoZsWj22IlncLSg2zMVhA6rCHkHqBCc1D48xRBoDnowFEdCT0IgD0GQ/eh TlCoBbQwnp1FLAtZAkZXibAlcLSFR0+gyQwGI92Ti0WFclqHLA30po8Uk8OllEBpbuNWJ61KWhk1 gxMBZsg9xFVloVTLMXwKlGA3tLSgWhz1voI+IgRSWgfoCF9kUEamlUkrIOFsZbjWYSz6BR7XDphi x1PO2PhqeQ8FfhEjgSx6KIYeBaLtSxkeIaJbgwZ1O6wyNpgtVbP1OB658A7KulZomI3JfjRQFQxF AyW8babFDAwhl39flTAqF6hLqKXCfIJkkCIVQkFtSagvrNzEHNSTclArcz0o3rJCi8gL0pi53sIo pwRA6SVEwj0dOOv9QrHE0wFEaNimI576gHrzsq+TIrRSsqLQksK72oaimRHOI+oR0x+BwX/CjVP6 QXuhwh6Q+ycYqQBIKRmxx/tu+Z4LLzm5ni5Bd31yortJYMiov8+CuXoXvb+eifd9umJp0oql6oak LTaIH0X+XmBymQkpfHvFQVZsOa4mDNJx2KA2QQOyHykM4heAxzewEelLb49S1Oqo6FVaijO0Ktt4 gYBZK0XcdsRC6WONGtMwAb+YozaZFi055XaiCFpoKuiBLdiWPduh2RKjmtNmSgdYxu3A/7CBXjM+ aFMM1E6XQLEdsoo0N6xi06WODJgYR9X7QFmfYKQsNmox1s0W5SEVvCxiWBRbOF2EjbLoqDlJMLOU TZxXmFCRdXCDt2lLsgtjLp4MIRnEjGTYrcqhFZdTlIKKe3UoNTMTbQhM1WKrCrWsjIsSlGb4BeI3 m8rphggiXqRA+lYaLT3UNLZVja2qbpR1UHK3g+LGe439enVjiHV2qxJEaVcLJ16V6DBo4+iUAYcF hFIwitgkArSJjEWUWEN5ONgVQwgylpCxhaTq8sYSFpVuU4E5/Ez/3n1DfrYFqObOP+lvo8/vf1aq 5+9/1sAGgP1ZM1LeY73RxzCqv2Bi4PTCAKuF5I8zhk1WnfstNA81uw/ILGcjHZQYQmgiyJqXKLZX e/yrxUCyZnUJbOx04roHfosBowlJKaY6+KN4czFhvsMYoUEmWFyCRSUoJgG0VJBAEpabaISrWASw YARN5anEURyK06+R53HmsofHdc5spbMqrnQGmqOUlooLZeJsiThb8SxUgasD14RWM4nKn6nOSTHU hqEhNcdJKy6cRxRkBRfQu3C5yY3jpysXnkxTuKZAWjWYXK5eDabAgRcKyNXKmSUqtuQFOJEFUk9O O3tVFi6f+BXFcb1yWfUnDNnQy+JcaDRHyh1rcKXxpZZLjr+WZydXTLTtBY7FJZs7iQq3VGYaay/7 +GaNcU0O5tQUY6pOXXlu66E9tdW5avqofPODR6IoVVOWfWdLThccvvOBJNwZTZXq8+AjnjXdV9ee eyf5TZjq8WNRbBKrXvvjSEix5AC6jfx2/mQ+qN5T7+/j7w8e56GYWZsLmbW+1HUnETOT9x3v9IH7 crfPG7ec3ehxqwfe60VNGnTHF/1oY65WYWsNTK0dM7UOTNKKegAoKWFgZy0N0aTlZSVeSfHqBTpW Q8NKqllK63FhHg2ByIr3cw57PplTuuvLzu/3/RHM5m/9oFYDCLn41itqPaPMU+hHAyInqdBQzhg6 lGyAS+QztSkB1nuKP8m3TH7K4F/uI5R9KJ1cR9Bki/a2tAkIShZnonEhRq5D4S0ZIh+h9Q5W7CZy vQ5aSnxA7r9Z9V8bbLE+QOv9m5QagegBt6fAm3OEAVnMr2g7gsi/7IimhWZ6iSimW8YsMUkAI6mc rgqqqgpFYo0BrFEpAgrUuloOU1mKRCJIjCgCyKCbTQ2/Tuv3VZzMG6LHktAbKnZqmT5mHEPHAOwo 4/K0YzaubBP8dqxjEJGOBcoxk+anZHGD1tATeKMFGyKEkrwuoymBFoqf3ZkKvcuEdmv6Vu9N2d4r O8vXZgLxEKVEHyVF2+TIo/RIDM+TvpeCYCMI7NM1TjiGvyYaZ5w1HueMG4ACRJnKx2yE+WzxXfqt tQCjYuq2Xa2brsmXErHk4oze1gmBjhAe7tjTP6AMG5Gow6ZXaLRDTfwaV2fr3WyB8SWlY7LM7RJP syQ9akraqBoMlpVnF1gjKT8dNL8e5qjR+7aorQTh6W+k/QOOyZMazoUvaaESw6NrxBZYa+Sq4jQt iV21uNAHimCBCWJRCGu2ISwNYNURZ1aHQrHDzYaiVzPODicigXYdNuVLw5jlJxWtk6ioZtpW08Qf mPu/8Ik3KVNnO1mbWnEv+Ytee5iEvGtqfrr3ILwZDFf5zbZrsftNP6vdZ77EcKgqGn6S6PQ/2eid t4O259ReTJsjy9JU0QZjYKa1yFMDszC2pa2iHaArbh1ARIShVBjKahgq56bi3woyI8rAkhBG0h/l GQGxpystR3gcsyRbHmVUX8AYmdfNzCIDIVpNp3Nng7Hkuwg4tIcLhe4NnRtMdS41CpmuXUPXBrP8 nlZfaYbaCxLLPrLwNUffshpvO3tfLH60+iE2+81YxeMS2/12MOp4MCAZjS0ejcgdGWqJxNCNGLgR wzYCaCNJnmzIEYL6JOmUvYJpBF6/aCETAdnTJchlBC2fLsYneeJBJWe04cP3eIIO8TIBszOyv03g XDN72RYDwEFoToDeNwK7N6D7Z7vTCI7fJYh+OfimCHsLy+8YxVfzrCp4zmhWER2012ylVkMpVYT6 vxzA+EcGZfUWzG+ngT/KLmtgiPKdyqgHaI72yiuUOBRhl+d0W8k7VvN6H6LdS8eg5h2KxWM1Dwwv UB+hUFMFL1XvrHJnyEBAgKiKQ201rapIkqp6m1JForvDKqdUwf2Cq1V6T3quwL4TfC71GvVYnfTZ 6Anw+girK2jdla33WVltQ79VSBJr+25AzQ57D3Y68hr1YKdKsqX0sWpyoigDa8qkLe9gvUdkNcb2 CgjfFXlrog4Ww6thx7nN85pYSnCeF7lWQoCgNiGD+HeIOMTxh0JYY0IEA5Ay98JqPFHJhMLNC3se ZrSW5eeIBHvUFdQdPc8xb0LQL9YtfS9xHym1+YV1UeoxWyZ+1CK11HvYg4CSnSrWYkfazjS5epMC Zyn7qeOEJurdOgTFgfKgGAVJgnZhuT+aLheAI6XXedAIxpQKvfiJA/IDDzWF5QvOTtyMkS3XQ1ci JN6oHAOfO0AqYzBlyYmEMYxy1ozCIcJPutGEOwCUL4bmedbjsWKqj2I2U8gmPIrZTCGb8ChmM4Vs wqOYzTT+C8/FbBI7tO3eow4+QsVm+hjYtM9181FH54PC3New6+yj7j7o8BQlC6amWq7Tj7o9H3j3 RDDZrj/qfAOZJdKzHd9EQkotlLfX/SDKSg2HSIa4fp30o/RkgMtbKAODjqVLpVNzrDopr05gnQ6w BuxhYECIVKfTSEfS0dLVvZahkwJ0m/Y39jhwXCN0+sjxDIlm2K4XvHK39RFV4hbRctOUkumUgq7D hBqi2RRiO1gwJ17FUxTTKU3lvTClpNjess9tBq0VNRzcHzm1eG2mso+mGC3IWOqFpdhzxaBI3IGR dzRxfPGgW3IuFXJhtZWwk2/SKzTyrjcYL75LhhZzkQzGyRDHbFFMplEguCG5B8ty7+WdKC8ZlusA AM+Rz5PtvoElvlZvafCUuot4Om1MnlEliq9ARKoSsk+ux1hsKc+QOWEIjaQTpQOjWIuA30RP31s5 qaoeK+rCNhl5tPcUqPeQoO6ZJVVdB9bX99q62kIU/3gClcU9Zh5k3PkP+fLhNpcmxTQSIM3O5H1i ZAN2vfGs/gjdARlK3KRPYgjI4IwPj9no3FpvWhv2Z4RGcS591qx/UUmWeUVQhT2g4EWORhAHTiE+ 14KZKDWnuPG59R7C0SWghAGTfU1e/kNHoeRoQYmUTj4VeATObrdIjZ7xJQGy0fvX7ohdipN5qQNy CjXdXiH3UtAA2KznUTp89EnPmG9fnn3ygL9Xk0H94JGIQsEDfzygpJdU8JqPW/GN6V1XdGMefoP/ il3fn51AbMx8epnj0YwS4E8Au4QccQUDBbALzRg8jEfKuFkcptXDh3oMOlNlsTPVF8g0weCZXNZT JuOpjco/WHBvAm+AULtDKzq3nIezxzl4PXKLYoQVlkQM1VoQ4jsoBFuA14GH0vsT4notQ6IgItwX q5yi1UGBAoFSC4o6IKiP6zl7Kd6ximSw06D1nJNazuTMqLhiQkDtblw1IVYJVzWFm0ghDLYZqoOQ mGXScaQMRqavWg+kDhpQlFpfnY9PGU1Qra6gCM6JItgYSysoxMa69fWkc8ZtG3H8UPXIkI1Yc7Xm XktD+oAJVkM+zLGXaEDJ2bwFZsSWDNElnqYLKmArZmKszIu8cH7sgARV4t7pUY9rAdU6/6zYuUPu nCe6dIxL5blf/IEP6G9T0sMGyv165Vd8+MHU12luNTsNSV08iiPbSPLAeZ+B9iDUv0vYDkARyZL9 FnLeBo0xS1JXo9GUKkly2wR2BFFmVyhJp/ldQyhLRyUEuGqASXOLKgaAZrDafLeQiGpz3krNJ7WJ b4L94uQ30LzPkAOHaZzUwS+ELRIFHB7Vv1PlG14KXRSHoNKAyT5YkouT5GIkAxjqPSXe8wKVAusS 55bItmDY4xIkaQGSwxIkkOEeEez/MWbgGJSxQHY1xSj/UE2yzID7k6UEmbUkKylaS9FKWo8XEuxW Eq+j2BDrkR4K8fOF0GYVHp6NeibRifmP3GaGvFBGBR/dwMd22EscDJXmWjTdyv9HE9kFndApKd/X QCYdWXL92Zkphibq8UM9pjR3WaW5M0pzwa3EFsYmJdGKjd78pxmOrqE/Deem6o++qZ8/dJ/Z2+wi 0wC3rwo1oZZVAsINI+U0+7LIk6V+LOMX3LF/gPFimUBS0DGEor1BlpIWVbKBfWoTRuPEn+Z1ykLV PbqSWv1qvRdXFmbCJD4cYDdbMz2r6FXFryxxcm1e+WdrXwH/2eqFkx7JGb8XpKtdkKR2RHraDrm9 asziLbJ8XldwKHCF+5HPFc4WzhfOGM4Zzhp4xAIGxp0d8vSRgfdq0/MRDW9MxLun4k3YzDRN2T3A 5CFLyrG7sFj6qfWufghO3TkxfZxIsREzVGidtf156NrKMtE9cJQcq15xurbOH8yA6frsUu2/wOPb tVriLJV1Y9dqqX7n4HUWbH/wORu4FySJqHu8V70L92IkkuLHtQIC7M+KcxZrxnhVjA== 9ioN/tOAPRU/sAFrI6v5GRBci/4UIiXSWtzP59svEsIvNbivTn9gUo1WUQBtgAYoTKCLyuegrSkS 4enyYI9MM7gseG6eJ2HJQuZ+oJsLqfo2PT9Ky5d0/JCJT2hGULztpJAzCzrrlfOlNZx1TlUlqbLn PMgSHBwQG+wIDWBHZpCnMtjRGERyJ8p483KBCFK9h5MT9EbSpHay4GnfI12KhI53gaO6FWX/9eJJ HCr2oQcna+Jkf/A4j8msMSuzRi+zNG/vmUZUzoTC6AXcaUDlzSc1nkwsh02n1HBKzabYaBKTydtL ZC2JrTQDA4oCUXjBiBuiKsHq6pQYvzIwbI5AYI1eZs1hJ7nYSQ09LeQWyC8rRXWRzbdGiK6eCakF yyViOeJghwxcTixCsQqDXci2oRLSCZJKmNJbHy5t1c2m7jXZPQhGVulv/yw4XyDsDpImL1R8s9kC JmZkGT2f3mR4/AR2JjcQboEhaBG/HoPDFCC2Ed/8xk5FuccV91pxLAbnYnAwDrgrk5NRtg71MwIr mKU6Gwulj38phJPE/uGlEE4HDBf3s9LlSekuLRzSyyfcHXJP+6xeuTGb1xuSejWlVzhPYh4Puc8Y /xFQLhe93R2uCPSu9xT3BuHCdy/3Lz0QXOHCdt8D94P0ROgLS9YSQg4M1ElTknuTkjwJQirOSQZF 7lRRUrKFt4SUZLrBVVKS+TbDjXogm95tj9vqqPcc7nrz+zffeUkkgnj3dP8d8flgF7hOAOyFGY0N 6omkAAArbLUaj9ZgpVpesQq8koppjNaIkAWO6wVoLnGA5e1Qj5z0KlSDk89CXUyYpzZZ2hm8o7WL gxXeGXuYsSVqA+exJaGAQeU51PLknMcwzyOgZ1Qk6zY1JwI9b91SfFMWMGNvy4Bm/I3Bbvis10EQ rDkE0qT0k9HtwQ2cZXSTP5UIiYlMWFfC08yUnKHCngN4GUqakD4CT3HkP/+WruQEwcENPe12TFAC nhKV+GneksryqEhhHuy9V4Y2jHkXEViUlSFItKFbYO8UJrpThQAxkXuK3jVGweI+GgNEZee8xABY QP2gZQSsgSALEoNwGA0GijoGCFgsxoJgAUM8a0hnS7efJIyzo0FiENWas7e81YWhO0Fi1IzEGBBn OigLnutsYOK7kkk/6qj+J3HbCasdwZMrBF7UCLvoFHZBoAs3gXFJYxyHaLlaqczcobQV1gbhHggF mkOt65VzaWbEhQobAbM5EJMwkRJoZpFaUZsWw5o57WRSqgLK4eowKbzmNHFnUIGCGFdOOB+1ulTP Fa1qNmEKTb1e0FQZ0UTscWdrqOhAWQIbGRvH1aJyyjGzR76lVK/SGAULpnLzPS1f89k0OeDRee21 7QtDp3cWR8p/MEzoAQISXQgvgQl9WgQWgjchsILYQOMuYB8H6zPhxSiyCEmAfhecT+LycUx+H49f IArG7+PwUTH7iI92yVRid18BKcTOSO3xhR9PPeBwq8Htf3laMweMcnN746E9SimOM3bTvXzBKiC0 kzdgNvKwjYdNXLJMF929uQ4M7dtkh3ppK+Qbkja3cXIqNQm5U7hdwuwSYqfQuvAyD8AzveF5TpSJ F0OC4NvEHMODmeG4+klsLhgf9AafNxp80vcFIx0S5xCTpzJ2nbcDLkhfFMovz0TMAQrX6xOwXsjd IPvtgkxGNW6ykrXBNE6xwBNxbQ2ghJfpesaATcQIaRhi/kQpGJERRPwmtc3leLRig9rAkEv+uz/3 z2bfBgqblMam18rnoyHvJ0IbAbMSnBUhrcDxjJjKNiayNQxeBu2KWhYJIMvLIRtQDMSXbUhyqTsF crCsNfnUS0pvFVM0ydYUJ2wYmiYrEnYEIuFS22ifiGlE7GW29jIlmyQLXqKa9QGfkm4ii35Rvhoj nyrdPATIheWf4huMclIowWXLbE/9Pskl2tLniOAqorgCOnbMEMbbEBn0lGWsrv5Rc51rdAtbbJQk FMcOcEkhZlcwmAqhrVGNAgbw3szXxBY6dArDNa/w7TM+o0AKXK2Rgme8O7/3iD4qPuetMxrgwAMU li9DhJmF+rj3q2vIgYpDgpLuUWt6g7yjaC09KVbApK83tobmsw+BVzBKDLHXYKKgwgqpTqikrZJ8 0UodSU9MmlQcfLkjPqtEJubvPL8wJn39kbGJC5w+/xgPhWmzyJI+JlfN5XEfZ3Jbh0rsUqEQDCbg tiaHIqQbayTDpBvbUIwlVp1CQi6gg2qLaFUrjV80JoLRUzUyJVXV4JQEakj/EEXFqiprQq7aqhgL xdQuLMxElLE4A5MILhItR7BqKVYl28Vk1RuOPNzSQ0K4le2TSHgcoDj6ZwtT8XBRuDVEPSwRvSh+ IfRBqp/m6qKqLPGA4DHngl2Ugyv5t+I0b0zvBgLCQKRqE460lgAYogLp6uDbssWUJMGIenxmtqwV XVtUue4Ob30Gpb9L9pX6cxi0AI5aBKU9r7aHMIwo2ymZak35vWDIVEsGWg0ZMtXhXjLVaacxVVfS gq0bJMZSsDMkOOaCP8SCKmJUep5GVfxsRASaJgdH3hHrH4kw6ruK7R6njvr6nkuvSpxG1m1kHUex 64h1YNj1XnklqfqISHW2RKrdYe8dk9AWud4jI/wFCVR9Z8GdDra7Uxzgr0SgesTgdx+BakqhygSq dcbqjO3N2M5M6VONFAMryIynHn0FEXVIo/pv0ICvEq8cokBIqu8Ktpk2ZNtomiVdxRUIzLRqOVaZ X5UdDUqtaqoBErFqoFWttSBgA0lNQFsZUOoCbrTXMLUV7TZCqdoppSoxQQyA/pp07ynVAeH2HuqZ 5qC1yB4VmvLq6qct80sJNSG+A/ovjby1+3v/V4cHCDUWu/AK9OX+w/h3z+UZpUhj+ldLf4G+2Zqf 8g5ey8uQqaZ0qkymelSvo07ZPg/pVDVpBwxDYKP5OgVLM0unOqpMu8qmDSrZDoMHxMo3X2m3aVZ3 5Krw5PodhU2Q2tdIgShJqj9MkgopUnE3R5y1VGHqWidjKhTlfqXsp0etuNYCRypk6VJT0tSYOHU5 GA7sfMgUTnlW5wuTKuxGYFen5i5i1fWQWDXjW2XXqmeLRtdtr0jGQKs6cnViYTndtBDxhVmTU3JV EQW9sLW2OyLVSUE3EwPtQ4GizdIyK5K/llP8VYlVLfOpxEBsuoolVrWxED5RRK3qqXf5oLcIVXN0 qhGZqp7EnSYK3oQeuPBxJq3e7r+974OUXFVyJakXTMgmVv9qs8RjBbDfkasKSTJHXnLU088mVwXW Ae8jV+1uk6uCMSAy5KqZiGqGXNXXui89mwFjVyy1akv0qlHQa+QtR/psQ6taICu8xzQmMCC9FuqC BtWZyVV3fTel8WmqfLmPUMcEq4UGU9OeVEUajCYtNTAFTF6zRhXMikXBD2m8WmPWgLSb5BbPpQ6n 6cNa19xLlZRg1dZkq1j5FipVW7NNyr1V4XegWIVQIS5LtBpgIeHnpBCRifn4B6YWQ6BIp/plIFmt VQMtlKfsonSrQrQqQHyucSFwfOlMIjCNu/TCgTqaujR9KegwMpRkYJC+0q2CSaOyRKuSH7UoBF4A +6PWkm+FZPXCFx5IVntOG6jp6lijX7j66cCBEFlWNaHyJUfL2uGjYusFWR+iIwJxWWVT5Xr1CdEq aKwkBZA8k2j1xwXTJFvkOeHWK2Sr8LSA6+1gDNwf/7kvFQEiP+QLpCJAhL57jGw128G5kHauj7WX wXRzrqNzXZ2LfGW5HnMdnuvyXP6H9joceukNIWjS9bnOV+wjhO7PDsBVytXrhKsxTW3w/kr92NRv wp4TyBSPjV3tcUXTXPXYiHQV1MVuSFeziSi5VBTpYUO7CtrNvVbhDekom+ZzBDpSS7w6LTviVVDM aZyVEkrJ5ZGnDQ9CIF29JLyzxKmV0s2GZSwL2SxjO58gzrqJ1nLK4WvvMEu46m8MkmjOYu6KV7cl XbVScItYthL5Z5YkLcfDgrhhGW53JV8x15YRdjgfgLHG0j/UNxHXlqTENez5CQYk/TxOdGiZ5D2i W6VSeBBRrJaKht3TraZkq/J7tgXzPOlqTLYavKvV80hX83SrtYGzIm4KOAwToFMxfOoYQLUmmT/U rzMkdnmc+YMIMYtJkeL1qe2zh5dmAKbWDALV3vdu8JwjPAc1jcCmwNWr9nhTtY9+YqSruSSEuyIh +VgI7Pri3t64YQ5fmREp6SqToXaMBmiFWVNpUguFKUgN2yukqy9wNCZdFZiC1utlvII9WCcoDqmb m2deffRQlDMvt1JSPn2ooXuK2FI5/X6g27tCv/pSB4zpV4W+SNhTT4Y1NX1xg3/12YciAlYlUjok TFUaprsIWF/meI9WLd4RsD58qIfgNWOWZMm9eypPrQBs3GYk3N8CCQjoZKlj6/cegVzUUb6pWCQC Tx4AVZ1g7Fn745hd/oqFBzdLPJDKI6gTW4sgrrjM6jBoaraigowKlNoceV7+qAIBIBOpJF+RDWJT mSWNmWBAksYcEplDKvNGrCag+cwlU5/UmtfcMPy+01TuQdObR2UWkcDZIjQkwkrCOc/UDKNJqRnQ leZBS4ti19RAXtxoQr6UvrdrkH/7ia1/iQP2+QZHHzy3/RAHFKVXiJkGjHL6yeUfXi8dMEFhwaqa IUgUqJgodB4lnwN7KYILKPgmrFci7/UZGLMmEAQnCkAdPglWzXALx6UmFiw3IaZyQAiyhQzK0yDG cct1OXquRiJG8YYZf6WyK3dqC0thjtVbQ8ASoGFD2K9+ITPwjy1a+MJf0ESLXpY9LnjANU88AmGh C1qEFjct7HhB0yqW9SvMRG6VgnIY+xamwKht1rZEHAZ6tITc+Ij1+LmP1wP+VQ4oqaqj5qX0+iRr rm8701qTzmqfod6cN5a1EjCVlPPRjoKeHNxYtQ5HqCI3c1hDanD3GsVAUoMGLfsqsvhtaW5BlkkQ SPiEQvUOMid9TKQCziYqUVGhXImQCyshg0nxezYzNmBaGgTBYOiIQhp1Wic4qWe8cux51UKeE6bT UkItxasnovkBzq/1MrbTaAS6SDjntuG/8Fz8Wv6SRxH+Bn6Dwg4XJBUx72hwQ7b0siyuND0g1TLt TOv5Zmybo7ZSFea0Af669jgCP4XWoxbKDSJU2NPanGuQf/v57Yc44I+A5ONoGhnvGFzNBQ8J3Wli d8cchZ0+6Z0O5EX0L3Gzn8mX06bvQvbj9IrsdUp2eZv/K8QI43+w7xylptskdX0Nu6z1fR67DUfm 3zUNEvz4jQT9JPc+7e3eezwzb0ZtuNlG2yD+80ltyjXIv/389kMckOA/C9KkCAOvB+sI16YH+RB+ yAN0QuVjgubUhClhRAm5Ibu5Bc2ivmi1XvE/5nDYN52woH7HnOcx9sTmoP4hOVJ58wNi3SD+I2DJ EuXoB0aOtrVsHMzFAYq8SKk4YjIOKRlGfBzCyFEaRg7SSzZgx7ZQc8SFbIOC0rOSIg== ikpb85FreTCsF2SfN2s2GN6btlDmfTHN7gsMkQZFSsctxVfnkNhdroHBEefa7T1ciEe4QYRrfko7 eMBVHeMZjx/igLTEL8iHRMvcY/2k3LlH9Xk0n0fxeRxeSpfQEnAMq3KbmtxgqBLSRW6RdvlUi6tL PGRZp6GWoxJ/l2SBY94zJEQc9yxv5d+IFzcZHnBjabfR0t4v7I0NDlnXM+yWdVjSfWZJxws6Wc1+ FUO0lHMLebeIk/WbrFs4XLL3rM7MwoJrqwsf5V0t0fyf1cpLrkH+7ee3H+KAFAjc1wy5CYdPMg9s 7sEEJgEhrcJDEPm0Ek9JSoWpIEI1RCg7YQHKjmDOkylhmemV6ifU6GkVYBrqi1RKAFSClO1hSoqL 8qWEwiNSfGTREiSzIlSl6TUAUwcFgpXQuqi1SWuiVksDfblPPCoz7UBxDW412Llat6ttvdVASZCe 2uZ8g6MPntAm2yD+8/H2N3lAC1Qy8YYQ6iDyw7jGxRH1IQH6J4HxQ0Dh7/IQQhaCJOGsV0u8IoAc NKVGdYEIapCq+xY8nstOLUHTLvOo+/txF4y8gAR4YaAXocxH+tiQcXJ03d/6zsau9jrVgF1cH2pU m0/Xn013ktVEeQxsMzEC/8KAjRF5o3zvhYyFyFSCHep+Yg3Kd1nQna6RyNvs3Qa0o/LwFISeR4ic AKYXf6olfWshweCY/AQCd81u3Bq3D28Im/Z88auWKhT2dHqOyi8u7y3MPC5M5G5ig/CUe4ckezBL ZTWvlSpYiuYQ+3l3mPqDBOqS/yM/5SklOFYFVWlukDyFr13520vQTKRKy4JImZBGs5Oe8ITjD8l3 Nxnq+Ua9NNdcaldbWs/vtp8ubTtnoHDgP7vMZHrAF35cOSDNYssilucRy0Hb8+D2hnIwUnx7nlEs B3HPgNxBQcT3gK/ztEMHFEt59GeGfD9hSEmwspCg3g1W9iXp2hTeDvsEgsfyB+Auzqon5A/A9VoG T88fgONaBkKVEfhwV1ObuEC1lDDkQj5MFYp7nRmWtIXKFCtHrlQqrhRVLdByYssdFLQv/DpauZhR 5oVUL67Q2LBgc4Gbj0qnu4T4Ok+vuJJxoyw8HcTFjBWEfk9pgWxxAUiqC0hOQBGnQyZUDYGYIRAy CBNDZxb6aNgXlFfez0ow+RZtkjtAFapjtoWUa+EK00IyRWN+hZQ/YTJRz4Xx2YuhSbh4dh3keykY 2+FJKGtA70an/PSBcMdSIljUdqFUCC3Xl5Z8FQwCA9fkQgJLpY2p2iYmQQhUB82O6iBwFgSCBPs7 7LOdkCB0ye/4K/FB7c/0P1rgq7M/K8x8S5gK0iTsaWf4d6ydi9GfZsCjqQ9J+nvIfY8BwrEPL+eq 3xELJK76mE4gpQuwSeohPf1qsVTfAZAtlZq6PBgPrc6OlZXseXfzLWQy/1el0r+W2W/S9y/Z5P19 0j4i+CxlQpqsn0vUv8qRABmaBOyfOM/lLkh3LsP5WVV8rxPcpOj2zadpLEme86ElgesoKkNl60rR 2QgyQiCRUR224qoNDEMrqgv+xAPmhZpEAjBnp2yCia+h16uQZOCUpYkMBqnD1GFORgtIfY41hbVk u9g0ZOsMGpam0G9daJXOkBsjTAaDakRpXkzQjBotA9Jx0qtVRRcIFGesMJWsNEkqcKP5gZ3KXNKj JpMZs8gOB2GLy+XFKDFakyMd+i+qAvXEGlDLBo/UgLqnuJNcbbjetLhTnE43gbn4mFWw0VuIc+ny xRtaKd8A+zy6NItOyx3tyjtJisqLPm4d8CppTa7B079ivhwlr5Rc4tCwWfoqg5wWMDIO/9zTi+pU dmdMNSkr909lbVIeHjwQ8Zc6XbDqsdJ1SS99OUT3eYdJAZJ7InyjnHmCmQB1fXaKo8lZeYFjPZS0 0pXnth7aU1udK7cTPZ60kh7w0TSMvjg7Va1/kTwMORYl0jxxKrjvj9256Prm+dPJHONaMoh746tf f/zw20/vPnx+9+HPX35pckTsB/Drv/hPavrkt28+f3776cPPTz9b3r19//H03ee379+/+fzxC0jf 8NO5dKb3qarPreuok5td7o3Wz/fevVP17u6+RxrhkomE//k/8M//y738n+7Nfz81p1+d/uV/FKdv 8P1//p37lR71W/OeHPj0D/7N9HTxu/L9f8gc07/3AU/5G1o/lArk52cl9LaF6/6CKH85wSkUncdJ /c9vcqf79uB0j97Cn9ILrQefZ+VfuA2/wMQrTZrThCa8dLrQsj13hRMIZVf7WxnpSt1lOcWxdWPX nJ3+OJ7e+3eL+tw5HcS96z6u3DrEd0u3QAcvxhp3sfKm+4o72dn7bfm/urO7Cneepj57Y5nedbfi TN/S/e9wdmJo4HdLPk8zuPlcy/8OPofMndx9Z6w7Pux47jucZI2TFy1f6O6m3nNX+RO6xeT+35My dx3fbXuua/fdsm3PXvvlW/C5XoM7SDueq/+fuXfdsS1HzsSe4LxD/jGgFtw5i3dy/KtV0gA2zsgD DSRIMIyBdKSS2+gsGT3dEObtzS9uvCxmnsrM3XZJKp1csbmCwWAwGDdydbvLRtuNIbR1z64qGZfv SqFrAhdjH4e07FPrGRSzU8pin6yuWFxIz7WMQfRWndsxdfm6lAvluZQQCVqDDg28qSlR/93w8sbH ZVg63pK6ooh9DFdnT++Dxls6sVdH0YBXmJPj83Xl+tTA3MgcLw7HK8tT7eOXjnLrnIpPpfWpuHic JT/juqSn2mnvU0iw2rnQH9CuiyOPp3q6IxrYSrikXe0SQoR0xSsgOtxZoMpi9kzcbRQ6vAqB7BSC /93mTzy8Pvm5tadWnj1Eg+guz7nb3jgZSvd5M9q+Zmsff/PP3ShmpuW+F3evCKPpPhQ3889gbe2r z1cjyNfon0qX+MiC0Yfa98+EZqVvtjo8d+X4VHuzyxsXXBeqzufuDAhsH4VJa8dZIQEBUq7S2sUJ Gsj5zqGkwtZH0vrGBUFIUWSi8xbt+spLJXBXrbfzVxfKyz0HJy39xTNCsu0b9x9cn7pYiagEiqll 7esDC9N13jZGiZXbfQ+i5wqF6fHpufi+OCDEoV0i5/twdJy9L0fLNXQet879F259VSxK6lQWRenL OTYsny6vKchKdSwqWButyIz33aXDU1/F3KZLZHd6CVh1Zl3HDJFsvStt6KFHKobo+/KTyeiarETi ZejLV6ay09WtBfC8cyjJWr4NZWieLmWuC0PpKqk11TzlufquJLqK6cIji7lLebfR2lPX97Wo2ukM hbzE1uU3K7ALazecnjozcO+yTHvnTHcyn7qeTVnoh7bxkEpone7NCtDBmqjdcHi2hhEWVp/ETlD/ R4TLd/6kPl8Z55qjvL2PxwbaqekeeG/dha07ebL1QRorDLjmQzVVGvpM9LUZsH+ofizdLXzqmjh0 zW37Tl8XT12R9p1MX+5rCt125ei9TnIXgO4h92H2hWQt+zx1p7o9xYwPjI9xXl1Cn/qe1R1VPxgS uvz3zqsJ7T4cHSe25i6LtHWlJBOaEzZXyGfXsVEY3XmZWteCwN/VWFGFGy8XSbx9Ykb33Yr3AQ+J btKwb3sN21BfU7SD0joIPCPg63XFpvqaVydWTLmCqqqahaIoW1vBN9ehLQLQyNq+jcf2kL4QrkoS TavrhRuHjM24Y0jNVdWdXfRZ9i8v+ryPqZuxfUyBzvOzkKbaFyG2K+gM2UcyJpKGlOGtNCUKGeEO 7OZ3TEE3odYnj1qmLFsOtH6CZuga56q2geW+q1HfzYk078MxuYVKhGECDL7rABbcvmEgwPaEdeVE IPvOIvMUsLXzmLoSye2KNHldx1YFXt3Y6oqj4jy5iLPj5YpBBV/VhOgairZ7aCWnItlFP7bKqq02 XQ9JjB6s9a5SzQapfU8haMi6oG6jGuONvInTRhKaWH69vU/UY1cqocq2gX26NZLBzsisY4uFdHzA WpIB9+2vZkdj6+tTR3wpw/AVDZ+NtG7TBtpNum4ew8jeMYbWPSobcibhgE0SojGH9Dco8MHYuI5q KOCuPsAJzB5stRcxnGjvbSKmrDG6qIJcbNItquHVF2fXtk+tz55u+qT6Mb8VhmrU11MfbZ/fBrdb N2i15npL0wGgsXVeN0iMznhXtmS2wBKrrlpDBA+fGgyrS1tuAxojhSHeedAng0TqRVoXTGxHEVXu SawwsQ3bS3I2qFa6mu920dhrOk987RtDH1QMOoPgHjGqT3bIzsjKmFayetoYACKnaFmS2bLd7u2T 2od/dXVnfCIzsQ9/Mv23AZnhgO2s70FQpl0WaaDYDLFgMyycaMZMn51EX2JRG663o/nsuqjv9zxK aDNMJ3afJhsqNvLu+T+l7s00GWNXkTSZvR1Jj9gIrXOyK3sSaoDixVOZIbSxajOaSQplyJzvw7Dh VR5216Fkabxw25J5eFU3yIAAUt/h4O2U6nQoNIl9yD6KxHQ20Bz2oZDJLmwg1nQYeWJCT05dwaZp w+10d8FwYNdVZVYjBLwAFKr4iJ1kmr5M36BJCluGocPr9k2oDV4aTK2LrfcES4X8q65Pgxhq3d90 pcLL65OlNi88PlgjrpMenGwDKfKOBi+xeBHz3lHfrDL5d9XJHg4L54JKwSu4fEQ2phS8J5xR9QHM HqgBkNRdP+m98yvB+utA+uN3pxHZUBsvUQcDKFy8ifbWCIKT02auRac7JpjTvWWft6CjYkUH+nRV JNpnAsVXbEr6CIVTsD+DkeVoa+rIneieTn9Oid82Lx0jhXoBsMCoV56AoP5vUUvrNp55oKlT3ec8 d1eDx9lXRrf3YXzS6pIRtdhXXxc/stiEpAiDN0DTincBGxix0a4qcvcLtXOyBbo4F+kapkdu1Mws N6w6TFtHF3Lxao2Qqd5JiV7cQFIKXTyxsqKOeRuGGX2OvPa+GCoMqBduSqYYjB4niwozS+Y2rMsh MB4iAXsSEQCd10oDIQZJM2aMHy42ST0is+hK1nynGgY1LN1LjI0c2A/qsGGTOVxYU8hF0LW3DULH dsFv6LsARYoQl+VvOD1ZHBmuM4ckl1gXtA+CslDnXRvynAfHXiM2w84BcR8LO9oAmnKHbeYzb+JX dQYkbQNjqEThVsB2HNgGKLJfBIQJEtw1uItR1Vfihv2FqnquG2Bdn1DfRfeQgHgCViC2J53n23gm BsltU9PFU/QNNNylRGF1Zkif/b5Hkh2ec5+3F8ZayTOA0crc6GJ8XewBmC9LVnJhI65vHV75RsqU gj/qVXQOd73tCFjESIHXkR2zjZxnGWRMFDDwZmwH+ESuEizoRHS2BbEfC6IbvzuN5bPS4iK85S7s XagRUJeYRjcFA7aSiK+siSGB+GHukoGAn3rsfcshLwXKT/cXiidgj0MAUtcH+mmIfyQElNSOipmk pDesur8jvNbhlFQwRxaxzIo9jVaoxMgQycOWDd1V/OhmGc57hYWie7lrOGi/YjGe7g== rEU2MMyIwTAvJEmgE1WhgSG+wGQJwzsE567+/zB2kpHffZlc3nRNgYGIQG9fK50x7bqijfPKFZdw dQ2hvXeOlAS+uzhzDloywQm0GdrG82mB8bIldwexz5lYs31gF+0/SCbJXPStpDXaqTqjNJ7Yt2ya Xd4lZSa7wXIVRN1j/7kUlbf+VuJd0uwZCtBA/hcxyuIOYb/XUDQcHji9vJvLRCQOAjnaWNX/2wf0 bpHBPgn9Bnsxa2ohZM/7scXR+4bjYWsjCp6iaANs3J3/tJ0HVcyRAr2Bht68zuRFXGIDqVa1z/v7 0E8RUTlba90WhU+dIq9Y4UdgzvXlksvgHCn73rtpsm08nxWYCkfcsyMtYRm4IthvEL/zRYx9hGLJ VOxjutR7qVlSD1cbW1RNPCyKhSaRtoZgaUJIuQsBrHcC9rFW9H0FzsQRsLMfZjlwBrWxu9NGbgpI ooghAb046w5uaeWOtvG8V1qaBAfhZceOnRmCYJZHR+IFUUddvVHIFxFjC+X3DSC3RIFTM6Nq/7t0 icDY2yWuZ4W6hpF6leEMI3dQcqSAs8WkusMHK6C3wyUvyo7IjIP9EwbjKATc+7bN8DaezysYz14s VFxIVf3lS1JTEQEJ0XidMxQupDjpWBNiv0NDO6eRCGR1sCS72dL7Hwkv0kIIP1WVGnJ6IVcINlKK j6GJsydAa6yHVUIWH+0RqmApFpApAdW3Pcuj7QN7t6bpxkrB7sIbZ20WzCWDAqm8GjUgWzkQiw0g eNWpyM9haWPzCW4KZsM8xj5lnhvFhirlAiEXeURYfMuN4pdj1+vDJe8ZbckdVtZ0DlYKYTpdPsxG uESdBnOF7yMbvPl4NrVhXXSfG3mfFnWlUTygeyhjofW9GlHwfA0jpiJA6CnMUNWgrwhRdhWDSzGd 5GWwdnwjS8kCVi1zBhYpQbV/WuI+uqLtkyA6B5qEabku3Q8ib+jZDwdhG4ZypndD7m8W9fDCTclX o9C1OF7InUUE9tNY8hXOhqMIjPl2XQGTGCDrqlnPChcHNg5EpFbVtA16ArkPNbG6akA13BPlxEWu EJDEPgJ3P4hYgg3wT+EuZdnT93Ho+GDrImuJTdTBNya7PYhGR2AiSHCGYva8W6oC01A6DIWqAT4k 0S6Y2WRRJQsoUQiMstteMHbZZE8kRo5ZE/Ci1AClmmWh959ZcafEKkOseZITAC02eRuNDjNCkcMT QTgja1gpS6AaDK3FvDDJ9/fdGlUK6mMgLoPR+yjbpudEKFsFOngEMCWL37eArE4G6t1Jd2iAAfGh TGoKa0WWOGxtpJcApI3SGEJxEER+xdC4jUcHiqWNAEHfOTreS5QX0vG0vPv09xUnKhwRPUrrdxuk aeZIU2hgYXeIgpnMEjiCF6vGdZGwOWxPr1hRJwEp5sICYSAkhAUAOiGrEQRskAbQNYL6sXEcCtAc mzoi28BsxHCLaNNCblsTqTGLP4xsSg3DHXAF85gbCprGkB0lyjsffNQwMaJ6iNA6TmUpbbAXKNaE fO4VjDbOY8BsDLo/xcYuBVnHSZIFaMIhLPpEtqp88IfSGxlhL91696GNMXfhR01YYHdazOGMmC2t FjEmkCrpEwR/TRz9blWgFBeBkBaKugtdthFImkKkfdPv7kDmmjhmto8s+8i0ZdlY4V4nhGQqRWZE T8DuRlFINKu4c7M8keuk/tY2Ah2ZD5xEV/X/wm1JT/T3cSuH2PmZUnxwZsxF6QyFg6/5XOobKaQ+ t93IGA4gtnLKIA9PD/t3N1c91oemRMReRNzsiqYEKTCOAHmV3Qk8QEYuuuFH7MP4rL1WGrOrL0ry 8qjmA85ppa2ExJfY0mnxmTxj2o4IllFK80QrUJiX2DiPiJeLmqkXe2gRghFsU6OyC4iU7p3dYKYl m8Sz1n0c9QPYn7WZp97SVOWyj+G9hlnFOPsDQqEIRbwwTtps4OiqCisS+0EMV7e6Au+1q14Eg5NQ XZAsQRigWqVKZ2nOGHDlchohm6IvMDI1UVGRa+9k0gr3ZsxcyHhDIuvELISXIOVOQvj7MD5tyl9I 3GArqSiOSXnkcMmDKlj8YnRX3YaR2E/qmVSWGahm32TD7jbEVRFV66otXlrJ1V2fDIOONl21NbsR HJxnizsntcPhH5MhT+VotvIil1qxFleViPoUhgZTc/dhAfqf3iEv5CxRbATCGIImeyOLoStY/2JZ eeRN0Rd4G809uyLXI3YNY14xxcuQK7mklKmbYAKJTksteifsLGKJtTaqBsmOpThEsJqlyMLBe7k3 9lFsqtuK2MhGAcg6oocJDxwrRM0W2YGmN1EW0fGT4WqSU0fOWAXHUyYnbnKDQr6SVrkJSJ2qgJjY 9JVlCWcRGijfZJ6myIxvk2LfR/NeFWMMhmkULO4mEhMQGlT3QySmbwRJE2kiMF33645k4hJGnaCI CzRCXoXl2qQkcoXmJiTPC7NISOAZeivW3IbwaRHJKEloyGKPWtnA1T3VjUrZSI4K1UmOOlmPIuKn goCyikLfaPsc5jg0osNG1ntAiY5WyaKeAOk7VMhoGhk5+tZntaShdSmhEAJ/cEKjkn2D6bZkdVN1 7DaI9woGMhPdxK9lFNBmTlpUP8pn+65B1bOIH43iWXxGwz+VOkpnA7bYThmKTTXm2uUhdoEvbvhs CLygGq/rZV00KAlC6gf7vK5CZMgQlewwK5lFyAW+Qqnc++9uYxgc+EQhNbJv5CguxZqUFrhVa3br DfWaS7km5WH3ek1ydFBnNddrwi6+F2w6VHrdKjZpy9tLNqEyPcLRS80mNsLiEYVaijZv4zLDu3d4 KNvEHner24T1fnF12Vy4mdKhchMFvmvtZqqn4s3s79Wb2CLu5ZsO4n+r33TFHwo476P6tNJIiDeg iG3JYCBWfvkthQFfmQt55xwGSQHyOUsSA94lO6JLFiNJ9HVNY8CDha7Z8hjXIZFBbhcM9TWT0X3z lvZUxm1o795lUOaA8ps5mQFqstuyGRAhT/UeczqDShoQpFryGWCjON5zQqOzfJR8WPSWQki3lAZK FG85DRAZmI1LUuPiaoI1q7GN7CFKJrWDs4t4F0J4s7dLwaXe/eLvIoQFx3p2eElMOoNWh7dPEpT3 5PFiZd1cXopVQPdOPq+jevnF6QUHDl5vO7u9MDJJD61+b9c+zq+OL0SCDkMsnm9C4SLqfSfXF6Y7 VXktvi+kd3N928H3hbzBYpmdXzLawfTZ+yV2YNHO7u9tOJ83Qi6uD1+skFSYBbMZAiGgiOlih6A4 ZTNEUjxYIvgyVPKLJYItgkY7myIYNfcy2SJwX0i9zcYItASO8KzWyDaa92uQSpv4Yo9cUoI4GSRQ lyQXi0UCp3w3SZz6/bNNApcGeanVKLn4mNRklfBqj6tZ4qhIPtTFLoFgUBh+Nky20XxWViLKh3Hc KElSBuzpKuEqUK/IF4Rm9TG8HSE24iRR0eW4T0niEK4aGhGxushB7VBlKUYEWVDRjYWm6z4WPuyC liWI40z5Fta2FlzBrkfB3k5R9Np5oo+6EbBe2fpZB/RecUHotNFZLwSYhSGkAhuda3Mqg93coaIr qiS8xDZBCskRj3wWnwrKlI6k0FEC4WaUw06UeZMC0d4LVzbGMBxWnPi6YAEhYBBlS0LIpWKngyBW P/GNYrBUgesUuIzms/KSEeVCygHSi9VPxf6R/6YtQA+tYc+7MgeVu7q3Yn8+4QM8RVYEMktUkohE RNBCvCSlYCgKLTLETLFzjreLCGUpZALGXPX0w6Vh475qs2SostTXUZQgRetmHc97xYXsSVjqfd33 terslAdKs9GVzjgKISH/BQcV9OiGznimehyp+VO5AluDcrP/7STkrZsR6VjIEFhdnR2IIGeGLJFm xzlyRRSH/AJnfIPxzTF/sXhvg3mITSLJCIpIqEmiSRZkb4NG8DXH4q/J/LAcC2oDLQuhlu0UHp1S LM8jmmIZFjdrek2w1KkAX/MrCFHHqh1JegWZcjNMtgGZXaIZCDp2IocNLbmC4wFjA5HcSvfcs2Yn LbWCSno9+jdlViYLZiRWuGRfqeK8yjW5bCOtMoWDRlalLy2zniWpgjKla5hPy4AepT1Q0FjiqjyQ ManFyoxJd+D4jGyGqjlw8kmLGkxxFC4OXPQGajPdpjbmmm3RG3RcdlMbOMmjEW3VGggbWWntNoyP 6gyq6qh5URkUv5OUv6gMRAbUolWNgZiFC1ZrzdW/08SrvvBysGbVF+ywz+rCT+X4qi702OesLiDF ZRw8W4ahbOhGFZ1qhUih1ISqHDhDjU09JtkrC4JuSGhiF7MiIXx5M3LZRRd4A3oU+dLO6EZ1AOUV qJ5ESKo4IIFIMELJehysBhF3rFufLV1Dxh4o0qx9RTnwxVnqLsWWnFlG89k1gKPPNXHBoK9ikKLU jDKwMHSiZp66R0PJ7L6Iu66sygo+soZaVs20lsol42BF94ulJe2mXG+DO50USIkZMMgXDVcHLgGh 0szijUEk8I6PRQ5OFkedF6dlcvuA3rscmuPwMGZZNlAcIuoLEFk7PfWKlBGM0g7zQaIuOECFAA3O f+upUVSuYVHSCUgtxXNsQ5Q4JBoFIoj/lMAFrgIjLVnyVB8KRz4wLRJEajjMH4mUZjUj6yA+KyWd kuy6FVyQe1emOK7hhCtSitX+0bosiL6oGDfxTjIf3yVY4ZLtEkdiDkzGkOCWaUS8OV4CFPoSwwnh e0gXDrVr7XWLXFFUUD5TjKMOCcFShmOzj+O9soEQFvxtKh/SAxWdDwjywYnTXG6k0sd8jcwmlivY iVMpVfQILGOEE1Pi0u/fcQ+0t8E/1sgZIgSwCxD50Y0FIaFIiVLdhnFYKHkqWUpazkh1J70HBEj0 7MQ+hs/KBh326es5+1EQDjOnTw3SxUEWDKqh4JuhmEt3LtQe2XFysTeh7LA4qLBM2+FQKJ9pq3r0 Gr4Pjt2mNOJdiA1BB+PQlxoIqMxCRWeaEl1JiiuwVV11nG2Zh/Fe0cAhTJxliG6IBqoJEbvAsRwV DYpr00kdkw2HKE6XRlRaqWzgIAk8JdRzqWygxLMlCuyYbGhiBZWYKhs4JFEov6WyARMCgSctXSKY Y98+1CEb+yA+Kxs4dI/jUvEasgGLDoGoNmRD04nxGrKBclSUgaFi0k68SwQCBxCv0Y7KjQFT2RCj MYSpvFvuaEHhmCWgIsdiUXqmogHeIYkJN1lFYx/Fe0XDST0sMh1UcvPCY6bS8iY1Cmzh0pnMhjCY msyV2UT11xrW4vs5oPScxq8a3yCDa0iaigvOm3VFibSuHgOk/BrOtRY2QnR4iESjHnGqhodP2to4 lXgbxaeFw3FcnJJF9bIlg1xf45sNdNIpKoO7UFIxIJ3aaHViC2qNEJnLtjVCsJCeAEgPd/cOLjpW bLXtsDZLoxebMQDXRaRIh5W1AJSYV2l+jPG3QbxXOKKXCilcm1W4NIZCwV1F4zyeHQ== xK2sykMeCWNUKUOPISZcq9Uc4oZbHNKjwh6CSUoRRwvVrIYZhoornHyrVsNINd4hDQs64hztRaQ4 N2odHc6nhqmifR/GZ4UjYidH4r5x1kwCgbR7h2H7IMmHAxIoKVVfKoLBgSLdWuKLAmucGkZt+yjD ZH7C8HI2CJy+QbWAHa2kQqtGrzZdWQgU+kinQb0qbDCv79KsTJTv2yDerTiiHM3HH+TjsQ8f+EAX xR2ylTdKmALePC5pFigcVXJgrnFqBC9WvlEjT7Xr6ARlAHSlRgwjKH/lzG2LReUR3SAb/RpWGCX2 2Ej3fHqRoZlPQ7g5t3Mb2WcFho7AFb6/Kms1NN9QJayqSc/ngzznuXrZWSozSNYWQdNanXGVDoM7 2ibjiAIxr8Owv4CMI6thOkNKRVgoX6PDFsFOnTUKJQAYvVZjIfjKRyXcuD3kNq53KxjY5LjvDJGY KvXTscpdFhfsTInExsQTTCdigp5SK1wNTbd46HlqzH6ApOASj6iqApdtoe7sQmJPytYQIUdBO50w KpPdh+p64NQDr0nv0bjKqKJNkrAAEB8X0X7WAX3agnV66KdRZc+LdELH43DAp0g+FB47igIubNDB dAGVDaBQyvZKW0m4ASwOy9bBjQewq08DsiRdqLpK5hhwkviicLs5BrzRoLA/xsFIrKLeuRWN7sMZ 7BnXV2rMtMmtmpCZBpY8XVTwzndv0h0bvLpgD9ENOH2b68tESokKb684NlODng7q4s8RY1ThOq2z xgaSoxyRtlxlELpR7jHq0Mk4Rm+wfjTy2PiOJLS0qntaf4Uir3UUeJGuo1UPA1wj3o4Ox6Pqv0Nb tOKdbWCf1kMwbK/ERSIXQiLKKjpYhKiYauE+eAo4oTKoDHKMdK8XAxFLoRDoAq5sAypS+IDAcVB9 gb2OC/ZwZCgMlvLZCDKJxulkuomB52RwNAae0xT1sNNtUI8QqtBGsVCWyxfQEaLl3QKsRVNbfZww 32Aqq+GJ4DxZYrZ5IyOI+33adJwviP2Kake9eQn7JC6rmi075AjJfK7jvjHaRrtoghLNVWG3QzwC 9qnGLPdRfNrykVJ4um8ohKpsiY5OMEI1jGve4C4AlvT+Kppnpnq0omNNrYxLpbAXwR5qiN2IqdBh 1RWylauWbmG8MGZwoVIQYaSjP6kuvMcuibg+ZqjaZTLrMB4iMYV4XZilzJnCAoM0mvpRcJAhMFnK aggGFwCXt0V1LGD7QGByGgoJyxQCkydbBysCApPlajJlMwQmyxIUBhLrc6U7sKQZyQuy5OpPb2P4 rLiAEvA5Ny4AEp6QtCAknpU69i2pIqIYA5hgSEYenAPBmY8ZCMEkLDkv1+uQsCD3YAtBjhIghacX 12EBQliI78X4ScKSq4noNoZHiArSBp7vjMupyZGDS47MBz8lYqsYHjj9FoPd2UbnZoMbx6pReI8b U+hIa7IcTaFrOgLKTiT87SU5igJXdRlwt1vE7WO4cTEGO/JRcGMp0eP1HIiTmq2Auw5Ef++j+azU FL2yFjESL9ZykUOH6Dkodxqde6PjrM4uVRWq3dghwEU+PgyHwBt3SNgAjFkUA9JaCObR8dcr212A nD2B62Vs5HwDz4Fx0SGhgrkq497XdSwPMXhg43W7AIc5Yeq9CIzsHQT1LzVWcKYc5g5OzprbdVW2 dnB9mt37cRU2dnBo32qwcHAfHdUyHbtGqTWWWs18R562JFsHt9DaQWqknGEvVDgUalj0lmTp4Ci+ HpLdB/RpOwfWN0wCuiKtVuMQzBxcmuvLGDbMHGRHoh2yqEJ2HZVIYCSMHNx+YJ7qVVnB4kDuZYfF Gps4OF4SNQ2OQUMM6nwJM9gDC2edh8YmTuVQ0O9Oo5nYI9eoP1F+Ar8Rc1SyuifOF2t3RxyV8OKM yrWsoXERgFUZXHxLk7eSVCrm6boam/m4pSVyVokUuZ2ilCQqnZQdMMrPUqxXPc7EYWSYlxYlRQk3 FQVO15xQjh5qLtSRYUZLCVD7okbhPhzjjtyI7uh/LWZBVQDYNr0oXkJANNXpnlYtwgqV/9Wu+Cor uL1TS4qjF7s0iS+3aRSoHVV8UWop6XhwGWENSlChpdVcxKwY7QAe8QhZbHSd2rg0ZhnO5wSDtl+6 MQNpCVk1lLmmuy2KXrqJIkwqJqPrk73Vw9AmgKpw2Rcy5BrKFPXjoyyJbntGO9tpLs6WoJ1plCzp D0KodwVip0FBJnrubxhKuf0DglBsa1jH8oZUoH+61qa3pRN+L4IAtUE4OGS3oOFeAXI/Eh+TFiBd ShpHyTQMLxQ/09UjV7BNiNQOgGqHZrmFCCNP6mZhK6eic7ytJ8VxUNdQ6t1RxCMnnZdqu/E6mk9q i8rhRFp6VexaXDJKl3RAF9ihicxXofPZNPUOi5xKQKzPwkaI0FS+YMPbebUqV7z7cREATmtx6R+u 1tJTFLjGjDLrYTrS3PiCTFqietLAiX6m9XgFC7uvA3pLXyBySxdb4ARqTpoc4bKxOMrGECEockF9 1wyWTbPDevhymHKJrkCmEqZL9Rru1Mlci9G3hKhAinhj8JcW4SEzQ5c14XW1ynAZuOFU05HYJDeL 1JqMI+uAPiccOIBCcZ+MMw/e6S0PVP+FMsOggRfcdIDIQU6T/a3hXxySSH5cTEeVaRn5UnHmkUCk y1cyJUeDugNcCIJ6J7Pfo9yJkOPIytNtbHKyAh/g05Z8N2TCWSG7wHMdzxuyge65ejDzni4Xpl6+ ck92fi9IwTId7Ch1DP4SLtmt00HOF9KNAXrzPS5SpWtu8iTaIXAIAoN3WT3nro9RL0yv++FbDZxF pyOOawGaqvDbiD6pORApwz0YKP02zRFEddAnXiyEJKoDCk1r9IJojtwmxRFEc5AmjqMWEpojV77t kWGiObAHhctZQxRb5zbK9oLoDWjNNkWpSG+U+TTRPpq31AZlfPpMFcoKysDlNtcylY9RRA16A36H GRRB9Ab8PLtZL2S7Ot0ukqEgG/QG9pE6MY4uUUUdmiWsqSS9W92ZL1LSsRtKs7CCqA10bvcRbeP5 pNKQC5Q09SJXprTMJ1KsehJBAYRDULOmaxZxkkznYYraf8g50u3zYZylgex0OrE7lWQBgICa2Ij9 c1yWQglnKG09SUD2Xl+sMY1UJnE0ECVZ6xj2UbylKapcCJD5BlOJgvBJ/zm+k7mUk8w/rYjPdlTH DtHQvS/daoDJrtd7BblzEDDvLDRJZ13paqlBNhUSop2eZMaUCz5dF0HKNdGtBam2YXxOCnDciCLB sBaSXIWP7ACV4CMjJpFkSrPQNQC4kFPqZlyX4sbtnN63kuhzJIHSfk2vFkiOzFfESy+9FdjrmYtr lDIkL5mw6MeN+TgPVzKbH93drNrSwRcmQ6VoAmQfzRvigP6T5y08Swg+2Vd6pqu6UWYcGjeklLv0 xFsUEpZWSoXA68XpwVJGdoutVQD1nnAcU/GBU67jBmIU9F98s1ixO3bDwGmrA2y6NF2q4e59QJ/0 QuSGa+xwl1b8UgUyLuONer04An4X/DM/IuUZbhncVTdS2mSLo3y8DTcCpjgCRzh4r2Yzhfcapdft 1rgsH1mhMoTLXJDutzAtWh0IBdqQ+/ej3T6MNwQCMSvyP6UCQkbMlyt33mqxIn3co5Ynurt3uGIo ZMcNx1pejfAokn4ITWklVhablcJV3hySUC66CdkCsdhIcKKYPr2SrMaZVBVgqjnBGSQeg58+erEN 45PWg5PbzXKavvFyNb7TNqMwQs+dXZWPjMIOVFuG8ouNKuYsagsYWVXZjfp5CmfRJfK4F90+LYWz U41uho/jEzFgSpATarpZ48JL+p6LXKKmOCn1mcP01ZltPG/ZD+ge2jxHDsa9KAKKiE/FHhShIzsn jvIFXI2Ju4lgQWf7EA7SDbjX3k8nmRGW6vZN9tOxRASggH6+Tgd9k35CSzNenOOa3jzdikFBLRi7 ZL63EQhcxvNZwxLXEdPZMVhKUfgT+LM4dK7b3CUIbaDjH9g0LbnpmRl0kKWYjeT0GpUwLkyB8Y6T AnR2OeoJEHJIPF+NnzX2jLZy9I6uQbamtLyILvsWCYx6cklQN2sE7ON608aMcm18gu2kX6ZAKBzh CjqZmicukLIHtCb9PARUJznsuHUnmpF8cYE4nf1NZgF6jmgR1Jv96fn8Oh18Nkc+iL1BbYtZ5FEv wIsjnwvlKNe/ZW93M+8j+5y44IAW7rOv052tCKdAX9a8aHuqtMSVi76atqe8KS5XUssPiRocHqxj tyuOPxBQ49h4iueMU29W9IhScRxHrelZ997iufK8U2IavMh1NnUEU/dBvCEZ6BjHcGphh+VFXsfR qIpvn2QbL7mQdZTiwinLTB9VZ+qWgI2sxvExNmyC2Ew7LOtFnJo6qZP6x1eUEOrHjEughk7tCjrZ xMAVHBvAOROtl9wH8TkR8HIlF4UIq5ym4m/iNAqpjdqxJvcjIT7Zil1HzdkefCQs6pVtl1yb2pWb XYiDI1eOG0b1RVG1e1HVBO6NEJVIJ+c4unldkqZCWeelMT51RlEJ7SQaWNUZvY3nDXHAsUE6qePi uMYLCOgyTWBtNsqAIkGOJl4GlNKMMIJdTUqxcDWgWtV0xS8UGkKZtRo7XHJyBUkKVqmaG0V2qarK +DFw5moMoTQ0dV6V7/t4JtH4eUfKoqinmGlILxvM+T52xFoQZqVzPo02XfkwJz9/+0IHzDjhN9ps SMLak7xksM7Z8DSw5K2nPHoyaqRN3JHEe090zWyTkE4gpfuygWIKVFdCMgSAp6rlpL/3R2BqlZ3P 0eKGYe5FXhEQBZXoJcGR1l7S1IvQwS3ajqHdeqGbZlVC4SrLPbMTiAhEipduWUZ6KpCNr79L5/Sx E8oGE8i3DcMMKPaKgAoTOHCUtZeivQw6tMWKYRuLDjEqM+lLQEWLJA1GwhblLAJ9RKc3Qu0fNZBn IKPSSEzCaHNDsvQkLxmMhM2w0J3LU0/yLC8xNdqm7kjqvSe6qDMxC1oaztAEow9feclsNEkw4lIv +l2eaXYiT4a1iRuOuPYj7yiM/jUcaesnTf0oLaPNiiPd+/mRlzTDy4geGwxnbbrNmeXGSVyyjDZQ A/I7PYs+YRq1TdhwhLUfVVwCI6POcJStnzL1o7SMNiuOeO+HNNAl3yCLY5wGC0wjMvJY+S0w7iol 6foMXMiHo6p3arPjWPqRdxRGNBqOuPUTl36YFoFN9BOOfTw6ThTW0M1oF3vYLxOMPONOY3G8KLLc LQjzSH6n529sDNHimtrsOJZ+5B2FEY2Ko1xrP/os7xAt1sZvOPy9H9JFIs8oQgtyY+wEi6g2ibIm stz8E2Xd6DMpCFlb1iZuOOLaj7zDMDlqZTjK1k+Z+lFaRpsVR7r38yPrAhp/KmM+DSZrC7fxgodJ zvx7uUlbn0k/BO53arPjWPqRdxRGc2E4ytZPWfphWrRN3HDEez/0kTHhaZzmc4LRXA== JFn7UeYqiX6I03wm0SHWJmw4wtqPvMMwmQvDUbZ+pvk0WkabFUe89yPfRdYImI1zghGNqO+ikhNZ P+FiPuuzbOH822iz41j6kXcYJt8KMBx+68cv/TAt3vpbcbh7PzSfiaN1vg65NVhhmUN4AjkLL7JC 3ybk302ecOQU4eWpzYojrv3IOwojmTMcdeunTv0oLdombTjSvR/+5GpiRRzbmNAZSLNBZxzAxtjE ZrnERVfAN3otinKYWt3wLL3pawRMUp9leNK19aYAfY2XqrVKO550702/M0v4UH84Bj2ARiyVThW/ Daf4mYzAOEarsOMJa2/6GgODEqt4wt5b2FhMNIWNNQNPvPdGg3byGVM63Kk2xAR1LJF0poBsTnwf hz9RlOVbjwohUlxWEqZ2d1xrn/qmQTkcNnD5W59+7VNos3blhmsfp9mKcn1HmnT0BKPJyvIxqSQE 0WcW+HebBHwnFetxarPicGs/8g7DRL8ajrL1M+loo0Xb+A2Hv/cz6y76DF9YVBd9xhuOmOoL+nJh MJUij7PmGi02DHHpZVZc/Fm/HJ4GDr/24q0Xo4NbpB1DuvXyo5g9BHZE3MsCQhgrUB6WzyQ6qjeO Shw/iiHE95JKi7BjCEsv9MoESpRlNhxu7cVNvQgd2uKGYe9FP5ls3/0q+m3oCUazAAhd1UNZmUDP TlsINlypS06Vtck3LHnpS9+SmNXFczHw4JLfuS9+/iYUMj2jzY6l3PrSj52zK+tn/TSgqlOuSwIc XvXOJRu/QVhV6r4wt7vjWvvUNw3KOmXg8rc+/dqn0Gbt3A3XPs7BAdWLU0htAVJwgU5p8he/OGAG AOvKKarGZwhB8tTqjmjpT98zIIUYJkx57y8v/QlV2irfEOV7f/xVHNnq6LLTqZ7YgExvDBqbqdxF 1K+tC4AIibo1Tq3uiJb+9D0DMr0DU9v7a0t/S8RoIVwQxXt/vMaDCAVlBIt9AN6ATC/uwCIVgm0C Xeh1FQrgpSelDHOrHZFf+9P3DMj0Dkx+789P/RlV2ircEIV7f3Rhl9ziMo97hhG1dRt19aIop0HX bcx2RZch8WtP8pLBiM66jXf0NIZbt9HO5DKScO+JpTvxLdFVrhJ42YBUt+j42k3Kc6ERldNTAwF8 kzVB2nVutaGJa2f6mgKpHGLgiXtvce5NSLJGaUeT7p1JtIq9jTaijxOMrv7CWRHxWGhTqc28GosK 1maej7ZZcEzPYXpHYXQdn+FoWz9t9GO0CGyilXDs47Gp1SO3Pk2OxARkBwBVg+C2V0VKHwPkFsO0 R3mchD6lVdnxlLU3fY2BWRwAw5P33vLcm9I0tdrw1HtvfOmkxO7KFFuegRQYxvUHHBmTyDHdHEEt pvCyU1dxbnXDs/SmrylQCr4UT9p7S2tvTJO2mqiWrPp1740XsR6uvq5pi5qAQq2wtTWlQ5jf2kyH TNFoVW6IytqfvmdA2VmKmnaXbD5V7b+RRTCq5lY7onrvT33lPA/gZQPKjQ7Rxs3fBb+ijXtM2xVs 3NIq7HjC2pu+NrjDf4Qx7EDGRhzDHqZMHMPWVjuieO+PveVLvchhfc8wtpuvpv4oW9ZXU691WN+X RUOszR3L3Je+xTCzmw2PWNbW12R9Gz3Sxig2LNu4bENWo3T6QvEEyrhHtl6KvOLrAVUtYH4k3atm srW4YZh7kVcE1Pg83MDR1l7a1IvQwS3cjsHdeiG32Ct4yhUNoASSk1PkkglKTgmY0kXJKZGj1Q3P 2pu8ZkAOyxmesvdWlt6EJm3ldzz72Kb8GOO7JBHzsgG9ZMj4G8KXpGOyhLkNIPmuYpEpSZJteMLW m7xmwCp5smIBu7W3NPVmNI1WG559bFMARJb5HAAxkAZAOId8OQk8OP19BEA4D31pAGTDEJde5BUB jQCI4PBrL3MAROjQFhuGdOuF8ipVYj9TBHOCkb2A26IpfiSRSV8kxjSFLykuHdPcZsVR1n7kHYZJ yNFwhK2fKXBptGibuuGo935IfqW6CrnWSy42mmB0KCXLUWic4UGbzF/MtOdv/A59Qsfa1A1HXfuh dwaMPnpmOOLWT1z6YVpGmx3HrR/J17PHwRKj+XqDZfgydHd34e/XYz/zGhyT52/8knxrR9rEHUlc e6KXDEYCGp4GlrT1lOaehBprc0Ny64n3VinTr1MSaQaytYtqV/JRTEc6Xj11yiNRjTCZ9W7sjhue a+1NX2Og5IEGHr/3Ngf7jaap1YbH3XujxJmuYzfsxxlGzmowZcChhJBGME85GEylSJu4I4lrT/KS wcjeMyzuWntyw2w0akabDUm696TX0lMJOd2FH/WblwOKSsXGf/B9bNjhYuJPVTdtQ5Bv4lwUXJK4 tNtxXVuf+qZBk/dPEyp/69LPXRpp1s7tqPZRDgFv/DE1ZGaj2swTkM7HO71tE0dE+KixnD9TAIuc XEo3WtUdT11709cUyHXIhifuvcW5N6VparXhaffefpQePVdHuzm/ZNBLc0KFTicCYCmcok2mVE/h A4tLuzuqtUt906CWEhJc7tanW/tk0qxZvaHaR2kaXINKvk4lVxOQ7tj0XvMd6qU7zYmUqRrKad5k tNrwuK03ec2AdMHywFP33qYoy6BJW/kdzz42HXSR4j2U8+iUK6xqqU1jNUKBmN4GF4fL78b5Ulkd WZu64ahrP/KOwrjURnC0a+2nTVKltExtVhzt3g+7/5LuTpMTPGDsu0a+kyFK6MBprnsOXMD0dXG0 CRuOsPYj7zAsayGk4MhbP3kOkAgto82KI977EXeBz1O66QzVgFFoAqYNxCXKjpklJabPavND8KY2 K46w9iPvKIxLiRSH2/pxUz9Ki7aJG45474fkNt8DlBOMaCx5DVCWdA9Q4lPdc4CypA1HugcOJxjR aDja1s8UkjBatE3ecORXApQU3/F0OmGqdBhAqVC4xKyxNDziI74ZgIKkUperMMRsZizTc5neYZik rA1H2Tua8t6DnKnVguY2LJNf8TXzfAZwwFT2yLGkOD7L1SW3wg+5EjfE2vgNh1/7kXcUpoe8GEfY +gnLOmFaRpsVR7j3I9Xaiyn8MsOQvY50IJE+LFrloyoqK/pMqp/yUWlus+O4mdwTjGgzHG7rxy39 MC0Cm+jnkq3r3o+sU88fbKGbqXSdGoyyDyXzl2norsuLFl3RBniWRcf3no02G5K09iQvGYwOyg8s buvJjZ6MGmmTdyT53pOUvnK0MiGt7qPWvgqQcu9UZeQTH0zLaIRTP9qAAESDfH1kbrWicVtf8pYB Y6zlaaApe2dl6sxI0lZ+x7OP7JZKoE+H7akEKPcllaCrxIL781KyFMDc6oZn6W1JJWjl9cCzJy7y lrhgmrTVRPWaSph746RRHjV5NugJyMQGUflJO8CV01IOONkGsnnMrTY8ae1NX1OgnJRQPGnvbbFE lCZrlXc8+d4bD1qslBDmTNkASoZLculBM+9BjJ8wF8Hpw9zqhmfpTV9jYNQMl+KJe29x7Y1pslZx xxPvvakfzFXDdRr0BGRicQ2DGBpSbnAx7xWgnqyaGtZqw3OtvelrDNTbfQ1P23ubSzmNJmvldjzu 3tuPIlsiC3Lx+csOpcvfAGGtQNeu4XCxBSEU8k2ERITN2sUbrrj1qW8alM67T7jarc8292m0Te12 XPs4LZeiP/g6ihsmGNclaHCFXDw6K8p0yDMlOjRIo23ijiSuPclLBuO6BMNSt55G0cygxtpsSNK9 J5ptidu22edXmLrpEvtVp8tJfHh2zJzEkKc2K46y9iPvKIx9c8Xhtn5mF19p0TZ1w1Hv/dCcyrVD MOK0HtxgXs7OyBevsnzfCZdcyu9Wp13lVv2pzY5j6UfeURifv1EcYesnLP0wLdqmbjjqvR9KnUjR X5mCGBOMthSqc+WvbtFiSuJUlimCQTtEFzprkzYcae1H3lEY/Ws46tbP5IAZLaPNiiPf+6FxWhFe sRTRBOIEj+YZPR0zTFbxZwcRrfTcWtwwzL3IKwKqkuAxHHXtpU69CB3cwu0Y3K0XDPFvv/zVl//p N/9r+G9/9dM//5d//MMf/uX3P/HzX/zLv/72J4H8x6c/+5t/+cNvv/3b7/7t6b//8elff//bf/3d b//xV1+O0O530YVQ8k/hGzvpn+R6j3/8gqPTTg5P//3/oMf/rf/5f3fgvz/Fp//89H/8n9fTPxP8 7/+GXL0Z4cuACNKnrzAwl35mkDT+esMEyE/Uzf/+hY4088FlnG3GV2Xnk83TWfcO6YuGzjnTLbl0 zvl6+htCURPuF8aPdNMZ5oTuG7bh/oaa5ad/H9TQhWxXngdG1wA5HoWTk/ozzGe+EiM4ju7OMPq3 D4NgnVwX3ALbegXon77Qbe50VwB1F7J+foiTq8YuegsXRA0Q4Q70ediGW50WmNBErzq6/XcG7X0u tPiFMQKamYBTSPLReoMluYZ9ZozCZiYgGN8WyNankkIyFFa23OUKF6eXsrDFep3YslAiPIBOj3UB 7X0qLYKdOkv5tYWg8jLDFDt1tsGIqLzKywzbet3lBbOAMr9XJkkF5ia9UHyev6+zwKaeRWJm0N7r JjEzawQ0s0ElZobpnMysUdjcM0vMjRZ/Y4zO3swYkZiZCSoyJ+mdGXOiRWRmBu29KjUqfjrbL6+s ztMqVkl6U4EqJPGn378e+lRapkUnlJwWxGnh6MRN/d51k0ImStYelY5NE32PJdTcvy7OJ9V0VyYH 9fdP9+X/PabMtJwk6CBoApppOeicWVZUrmbGLFrisH5Pu9RpMxMQpLSt0jL3MKRlpuW4LA9L5rQx vD5JMy33RT7Jy89lC3E3r/KyaKGDYrqrkoPym+Tl57JlpkXl5edZTTMtB30DWvCd2wI3n+4U508E eL4JCBZTUEMp63cFCu4N8nKn1msm0El7HJTMdWowC7lcUxMD4qwo3Q642RJmG/4Smy7jcuthrXk/ PvxwMELu6uSgc16zc/yBuk/wb1vWcjYi53Q3JVbGvWZwHLiHLpVt0/cyjG0g7sr9f4pcf7Qphpfv GACzNnvVzN0UzY+HRf/ynf107uctq3HvB1/QhFNArGfrnwVkXH/0nGHxR5quiIucUEqCl1aOqFDP HDnY0Ndr++5pe2YKPfwL8jgwM97hxjl8ll4Ei7wYke7+Ii7A54tRt112ZuHBir1e24ZPuzUTFvUj Ih4LLjy52bEywc9CG0Q92CdXbnbuaZM47CXX9yzXBymFmbRXDcOZsNdMWX+g7uOM21T3pBNupuLK t9cMyhPzHrUkqnxcYV4SN59l205f9W0mfA9bGjOBp73ztMe+5WHsBP7c0Mvf/vTTP778yz8/CeTJ /erLAfZUn3Ccv//fl4/EWPA2yQtw0Pz76a9Kf1T5FzGTP/8j7eF/+WWET6rOf9AV5O2DQuBumhdc wm2Cfr+tHHloFgjkzHjK8/RXZT3E7cY2BSpwrwc+bq2XnOsj6k9RZlr6vy4gxEcp6w== qH99Y+1CN7oJCIVgXUL0VX30Gk/GEy70xSv6Kr5sgArlqH9JDTR1KiClSd+dSNZw3J//LV4z4l5+ McS9i59nAYEeIG21WROqJHKij6RBpdFVk3KBoIoErt5nQcBnBewvEQRut4oEwueTSNijDAEHb6ch dCU3DSH5hevymV59VR+ZN/KknNNXhbEpz1zXTgWkNOm7E8mLSAziXn4xxL2Ln6/pDN3rxnfZ7Bts 9hN/bAwfoicljbAsqRM2Fkg/vPBfsYoZYH/ctMgQD5S3gX4Npeljk5XlhBmeBlH1D2LqYAiWJLNS 31PG0oLkB2G6vCZTUvUPrirl3vR70EqM17smjdZFLoyql18AVe/h4CvycKkxYVrBJOSC2QH1UNXe kMtpu+yQRcIGWlVx6H+JFMAWs79uOmQIRMyLQNijDAc37k/Didc8HpQ0TMynGoPBfX1kPumTcFFf FSZ3vNMMaKf6Y15nYCJ5kYtB3Msvhrh38fNPpi/qpQJSTU10wPhLxKJedwGBPpsExB5lQKQIx4CK nwc0K9EOUv0rrw51TG3TMgf66lDs0xxop/pjXedgInkRkEHcyy+GuHfx84E2BusHMTuD1w1j/HXT I3ezM16L2UmyPZlJkH02k+Sv2ewUkBhv+qo+XrNlp8tRX5XV2vHKX7NlJyClSd+dSN7NTqHk5RdD 3Lv4+SfTGawfxAgVsYh1+uumR+5GqAiIPYbVaJJh9JUwDWhWpMPO01eHSp7sPOWj6W9T7tMcaKcC UprmbeIkIIO4l18Mce/i55/K6GBlITao01CU/XFTKXcbVAp57bGsFlS4xIKSPyYbVCBs0tl7uvCG tWfrWUy3Itae/DFbewIyYq7V2ptKc8UGFRpefgFUvYeDf0IbVMSBvg+oe8f466ZC7jaoCIQ9ltVm klH0RTCNZ9ahw8zTV4c2nsw8U9V5mYCOd5oB7VR/zOsMTCTvNugkGL8M4t7Fzz+VfNRL5aOalsCX bOwvkYp63eVDbSSt/K/reNRkklF0k2kazxzaGVaevjqCRJOVZxGkukwBzgGOKdBO9ce6TsFE8m6C TvLxyyDuXfz8U8ZBXVaD9NLNw/64qZS7OVoXa5SU4GQ9uajWk/w1W6MCUnXrFoOvzvZe5E+k2Yt8 7AVY+a/Z3BOQ2XPydTUjd7dEhYqXXwRh7+LjY4OfIgf9r0v3DPvjpjruVmddjE6lX40koRrHcgb9 c3Bn2HX6qkWJJrNOeGYvMkeBdbDbumSQmW386iB3NzgnOfj/n7B38XGpLP30lqEa8GWyiASkJo+p wbiEae1RMwZuCdPWOUob11TDmmlYEg1LUFkDj0mmYAopcybu8y4YokODAxY6Ssumb/TkhQP2mNZN X8Pn18wCNTYEJKaIvqqPfrZTbOvKCx8GyYMRnxaE4mc+WIQkLZubEqTPQq49pnVzk6EWP/NhxjH2 Y31VH/28H1sUqS58GCQbHz6kDeHsNxu6RQLaEkcw11Kf86LBNbRkyS+vGnwKLZld4ecNx6LaZQml lyUaZmZnU3tliob9+CDzAE7tYIR5vG3xly0+5xdG2GNbVZiMNeWZETOOoXEtfttmRuiTX1380Whj RNW1NGs0AanKMsM/Lj6/PYZVo4mnX2eXPw6NYBrN3ltiWEuEQt3YIBptik88aCHD1RgMMD8kLArN yMkLA+wxrApNQzHXzIEZx1Bo+qo+XrNCM18tL2wYJD9SmoufGWEGd1g02qyVJ0bYY1g1moy1+JkR 8+4wNJq+OpT2pNFMo9eFEYPkT2s00R+zRtNo6rV6KvYcF42mnorFVS/VaJOnMuMYGs1iJGUJzJTF uTIj2hpNztUDNdrECDOryqLRZrU8McIey6rRZKwpz4yYt4eh0Swa0GZG6NO1arSh/2+MeICZJ2bo rBSdXiewWKb6WBeVaF6RvhtFJU6GaRxK1VSivTc7U7MNrS8xLXW2oB9o4k2jt7gOg0zlCTl5Hr0+ mS8QltEDcbzpQwHpluMWfVhndag+YV54MMh9rHk38cBiFwwybcf06GNdVKEOxN6NqgonHsyuwlCF +qrZ8ZMmVH+oLjwY5CoPPlrUFg5FbeFXT+nZx0b/n27PKzln/rfkLx8pc5vxvdizYOSg29rLAuP3 vm54tCTOPP3b56PrswPP8A93+5++8HdF6EDmCsbdj7HcWgsO/UbAjmSHK5YdLmj05x3NDtfnHd5V on4DOFrVp25/lxVYav1lsjpQXgQs6s85ty5C/I8eZoN+kKEPPt8Ag/EyoBtAcX299aSBkuXNlwGQ 8IpwZH16o9/F3dftL0iJbJksAvnzuVytXlQlyxDWgXbJLZP/wlooORzSGPTTBRp5YYyXqzhmUH2G 1E7vHZhzG8h9rDtRysG15cuNayo169NbPc1MNBvCzkYksSHAPJTzAla0CjmxQLI5gdv9W55lC196 KHlhT8LFNbUsINx4lhZROQ3+Tvh9cLaOp/c2upSPq3p5eRMd8xIH813K29M0EEV5AL0msnSMYzB5 KYlXm80W8lwTX/Hdg1gWbh8Gfx/TnaID2UWqp+eRrB2OyOes7a6foUa0/dfl7Z01wcGsJUHUAzly fgDyJ2a9/hv5p1nDyTKcVIyu1Wn90YpObdZXdM+MthJGzjTex3Ab5kGjrkRNxfJ82KDPsRrxdvTn 0rPsOIOAJlFMmMD23KK5dGyzOpgHp9psHp2qs3ksimeBMdELY+7sOzBZXpwGfVCXB6WqxE4v7uMc HMRX0x3EA/8VfbiEV3ZwQx1BOZ3AgX7RTrMAq3paJlj008yBE5NPROq701gOGvCkJ0VrTS/qWp7x K2ymQ1+d6d3HumvByfA5KTYBzW/rmyfY9OpD1rTqHh3RyysjP3FI350YedJur6vueYD65jLojThl LeuF2Yi77Omu+17TK/MbCy/VqwvQF3xOkfdkO7WknMx6w0aIROBsHpMw6jdTxEyFqKRFb6lEzdpt JuxO6n04J2Wq6GWRfL3T9ZCFbpbDNFgzvqfRquKZh6v6aR6citcCY/FaOHXn52F0+uLEg5MWPmlr o3d6dx/rYKCdcDPnYUQP+Ihr554eM0sqXn66b2Xn2csr/Sk9M10nxXpSSsrA+V0zYqY+zEmauGvv TpOgfSzCKbQsMKV5evckI7PSnDeOo4oU2NyPvnuCvWoLfXKtq4bSsb28wr8Tn+3daT6OWvCN7WAe q767jH+jb9WgGhOYVNQcJlAQeC0ghIRCXEE/S1/NeB9kp4uKoyGmRc8qJ76ex3Wn6E71SRdvHSov VZZnbhpsYtSBnQfidmx3hn3UFxd1OPPrpG5PalnV4Tx0JXRm9on41wVrfnMjTnmrRMy8NdjEyBO/ T8Ts+HbufsJJ3/nxMqm+eVgnFXlUpbJk53f195lzpyGdhn6arx8P7Hx5BedbgcRF5ZxUs8Dm6TlN 46KaPx2RU+U3S/xRSb6xcXxPeE4zsvdrhgI5oWKoN0kZ4E/1QwPdxYYBTiaWXsWmXqtXjdlYCAmB sKrE7RQ9X8+W+G6S1Y98+XJynl/3sN8Ou91jc68H8Obu7r4t38RifoxdU6eGlGVfinLLjuU72qqZ a8/BNhSWFhIllaA4khVq7opT9JsvNz9yXsnf8ZwPDvYbbvh3wnKH6N3Bw/0nkSyz09vQWE09PlNr xE3hkDOxYSa7wYaZu3rRAAsgMWjzql8mdTURe4qaHWJdb0TEvuOinzz5u7//T1+WVFYyS2/aOE2f 60qcIkHvX7a/+XL3NF6+HB2Sg9tyct1e9/C+Ezw6hJhOPpAsOl0yttPZ5SHX8Gwkrkbri1Ydv6VC ZQEIVkFuXrJVnMyLfcllsS2xooObc3KHTm7aW+7c9+JMp3jUyb3SNZfU4GoiVE/TfZpJ/1i0+Sgh sA1OhetpyrMWc0zkJo952S2sOoWkDgGcUyzlrZjL97zEozd58Dp19fE1UF08ZIBq2+NP1cFWeDFf AgNpkftXsrJuWoVVNXlUW8CxwlpW4RwrOpiaB4P0YOy/4RN8JzhxCGGcTG/hlWbWow130ui2vPSm l2X1mXB5YjF7AcRiKWLYjYPd2p8TdN9z2E+O/VsBgO95Dycv4+SN6Or7gC31fvW0e/MvX85e9Vve 9/dM+KOp/4ZLsERhDtEGMOijhQv5ULiQf/Xk8HH43iX+xfc78KlOBvAfH7wJecP6MsMEsSy9t6Hy /tcDzt2viBrHDMPoUZM6k9rWMp8GHawnIp9Ta/QdSXcpoQILDtfMcUetv3UG6ZtfD9jMQXjf+qWj Ne5OmMJmKvrvN8oUNpOx4xukfYhviq7dqXP5TskJ1u7EtZW2eJiceJiccJidcJieHd8npicfpicf picdpicdpmfH98npyffpyYfpSYfpSffpyefpKYfpKYfpyYfpyYfp2fF9YnraYXraYXrqYXrqYXp2 fJ+cnnafnnaYnnqYnnqfnnaeHneddNt1Um4n7XZSbztG60rg6aBF811lHkDpoEXT47RoOmjRfNCY J1g6aNE7aZ/SouGgRuNBZZ5g4aBHwyuKNB0UaT4ozRMsHRTpA2YoH2YoH2YoHWYoHWZox/cgRRoO mjQetOYJFg6qdJ+hcpihcpihfJihfJihHd8DdGk66NJ80JsnWDro0gfNUDvMUDvMUD3MUD3M0I7v pk7TSZ3mg+o8wdJJne6cUAVYD+qUyVt05wFUD+q0Pk6d1oM6nakwE+8Aqwd1eiftU+o0H9RpOajO Eywf1Gl+RZ3WgzqdhxwOExQOM7Tje4A6rQd1OpORDjOUDjO043uQOs0HdVoOqvMEywd1us9QOcxQ OcxQPsxQPszQju8B6rQe1OlMRj3MUD3M0I7vQeo0H9RpOajOEywf1Ok+Q6b86kmdLirtpOZOem7H qF2ZhqKXNmeVX9q81RNQ3/56wKg95UNP+dRTOvWUDj3tGLWnduipnXqqp57qoacd45Ajz9I7Sc90 cLDKf47Dvh/5yFSgLKYxn+Xp5cs5jiE/H0AH030C0XeJDlGp//plKhJ470DTneaTc3+KvZgAHrzx ler4aKrrneqTz3sKSeQ71fVMdXk01c7dyTbY93z1dqd7x2dCssceP035HqKbRTvd5fgA+l7Abxbu +GjhDgfp/p5PfIpUnkJhs3w/jPA9qDML+PdcxVMM7xQkmkX8YYSbSIaTjH/PhzrFt24Yb1L+MOL3 EMos5fUu0gfQ9wIys5SXR0t5Pkj591yVUyTpFKeYpfxhhO/u9izl37PgTwGWk/s+S/nDCDeZzCcp /55pe4o83DDepPxhxO+e7SzlQsZqlBxg3/OUF1NF02IPE/SZ8nSi3CyTE/B7PuRisDyM9t0XmmV9 ITOfaD/5vyfvajFbHka7CedM/DA+ZkLbifqTb3jDeTdeXqP/Y7Vh04fQ1EO7h6bmNEW7Zy7UjbtH pl4Jr0xdxEMX4dBHuHcSz52Ueyfl0Ek+dJLvnZRzJ8OfPfi4C29O/Dow7HqlH03qHA== ZiXep+AACodpeS2LEA4TEw+TcIKFw8y8FgsPh7mJh3k4wcJhcl6N6IbT9MTDVJxg4TQ/t640THyY oHKfjQMoHybotbhkPkxQOUzGCZYPE/RadC0fJqgcJuMEy4cJejVGlE8TVA6TcYLl0wTdutKFNcVT TK/NoRNdqAfYHDnZ8d1029RPPPUTTh2FQ087xpuCm3oqp57yqad86GnHeNdyM/OuI/eO7Dvxb8ep nX20/Kkcyp/Kr55c6LsfitkDtrqKDTXEmvnf9rG7W3acLxNM8OrOPve1wPTdrwd8gC0nh6yu0L4j xwHduVKcCnq5Rs6+bodvaJb67FsdF6/0Vloj7K08E3FiDmtXLUbX8v3ArRecOfV32TTWXvwzffbU dXr4E1zUKdRkbOP5hy9kaS5tFAWcgHhle1au/TB1Y21APN/KRjiUg3M/e5uN1HUsP6iob9NoXHua TrHMFbB21oU/LLgU6u9UzXJSE5dWuton04/Rnka/tzEiS59LF4eMX/E5Xlfkl7ZG5dlfY1zX0sH6 243EA3N//LhgJt8Jqv4gmB8/Iac4h2BaLzzbqfYxWJeZjw3OA1ob6Nsqb/o8M21v0/V0SPlt2d/b 7FQuw/gkn7X/myhTibccpmEsz1WSXIROYvlJfQXP52cXpPPkKUzlJcbnrtAHs07M29sYsSKt+ryI 9K1ReA7dS3tz7extdmJPs/QJpiuau3B7Y7pKuemOcURD29ipOMeV0gvuIeTWG4uPSqKCda+Zx7a3 0X+P76p62Nugu+zeWk57k43SdSif5Ll0/1A534b0MkAqOMU9X3XaKY6M29oopSK/8rjI+NYktf5T Dm+upb3NRuhhdj7B7N2m+dQGuQvoywRT8okT11Bj4FZoNS4s2BsZlcJGs7pmVu+NrMc3ZnRvc6P2 sOQ+wW3VaDTtzRu3FQ7tla64mGK0x3RrTu0sfVc1nT7PtpjCrD/shu5gI+0NxMbS99VUmPvY2+x0 7mPZTbGh7j69qnfyZoNMV5EaW9ztnQPr72Yb9ZXe3NkQ3duwtcXvXxPmGX6j6sDYB9hgu1zR7cF6 3rLMh5fs9mBmb+BDvQuyWRgVppPM5pV2JyppHszawOhjMbvbRVsDtavekvW9zY3EbRgPMr9u4mt3 FKuo6gHpp/mQmGpLsYkXlPOsGUwERQ0r7vbOuPV3s35ENI/+2t5GLKrXFsj6+07faWYeYG/dBFkv s7Vdic+LyU0wFge3Y/fsCi84Z3lWmArL4hg0b3p/Htbexmhlmb3bQHsDsaHeWDV7k53MfSiPsbRu Im0nOe3W4Ul16HnYbCdJp2t4tjFNdpYKjNpQ3OmBacvvauyIrB5sn62FdvPaell/32g7zMgDTKsH bni7WM4GlpmNYjvJxqPm1WDB2sAsHGHgyeLZ28ym6GkO199vBB7W1gNsqv4vRSUfIseKdA4JWkdi AKmxpR2rKtTn2SBTmBlHgIezsXRrI/0pDrUd5n72Njut+3g+yXMlYVapD7Pm5om0jmQTUmtNOz7x b2+jOGir9Gejdm/DtptiuBb86283Cg+z8wDL7g3p9sJUseXIApFscFH7I87fRBCUs2xbN2rck/mm nYpenIe0NjBbS0T2ZHvtbdR+e2v57G1uZG5DeZCNdxfrz0d79uHNxp7Kjhpz2v+JjXsbxaGSe3QL 9zbS31uraG+z03qargcYfm9pcb3wRG+nIMxiV5sW95zwWJDOkm4diQhNaQqt0KDdaR7X3sbMMBHl k1l2ayOm3Rtram+yk7oP5zHW30GHKxKL8aiwzxxPdkEjQ2ac8yxqNyI3at9pt0febW2yXbVK4nsw 07YWs3fy2kLa22x0HubnAbbgQzfMXVRna9Di5GLs2Xal9uDMir2RIlF2niy2vc0cgH9tXvc2N2IP a28OHc3r+K+/WEL16RO5vGsxM7C1jxyedncynvY2RuIE382AvQ0bEorhWvCvv230Ge0P2u9mvj4s pXQtWxxTrpuXdnjav/c2RuRk1t3M7L3NZIy9NoN7m5XSMYrHaNmHslhwXrN+ZbJVc2p3py1jb6MU ToHQTfFtLeYg5muzuLdZqDT6H6RVb8z9iEZQZNeiR5lgVZC2HlWLzkPeGxl1c7p/0257mzlH/9r8 7W02Um0YE3Ptq2niB0ephX2aQpTDlGLz6oEVIu+MOM4qf04lvbsC5P2x/R+/vJIT/0CRyydS1Vqq bJ88mz4iYKrB/I043V/+Hr69RfxrNSo/o4jkw8L2+aqPdwYDN4Kdus3qTDxN15hVPZwrw3m1fOLd NSHvD+H/+OWY0f5AzctHU80fnuP3cOwtyl8rOPne4npI0cV746GfXtWHyX53RcZ7A+s/fjkn9D9S cfKJNPuHJe0dPHuzWOZc8/GdJfKwhP4HIjef1mqntPpHsv4fCcTOG/CSF31vZcOH05YfFrj3sO1V ss8my88oG/i4cnlIvv8DAZhHbSUzvz9SFPCRiOq0A8/dv7fq4WPJyI9P9XtY9irVZ3vlT7myHpXB /0jM6tPa9CAmH0nzvz8mOm/gc+/vrmP4cDr3s3v3z+HZ69UXJ3vnO4vrYWnfD8SjHub6zeHgj+SF PxLanLftJcP1gfz3JzJPn967fw7v3qL9NZPne9nhh+RkPxCme5gHPDPuI1nbj0R9p0147v4DqemP poI+bbv8HLa9Rflrtsv31sqjMqMfiV++Mm0fyX6+P5Q9b4pz7x9J8X40nfWOwb+ZYT5bBN+R2lfO YyY8/7e//ref/svvf/vTH37707/++tcMpmOa8w9f/vr/wS+Vf/mL3//xv/9fiscObBIUxzZ/9eV6 +k3/7+///csfvyynMs9nMulE5q+r8+k5Y2OuPoVnxGl+3RdRQqwiKOzrCosOC8wReHr9FbBg+OkL UojjU3fPVcsI7JPEzS7d05/sg4SXLehOSfTPKXZDo3eZ8c3jyETT3RrJC9iV+gRg6MJWmgCvrlQZ GGOTlq4GTBmDfUvatk+ovp+lr5C6muGeWguFgcnnKO97VMfK+7mbl9I2Ny/A6F17Oo7ghy+QmP/w m9//4S9/++0Pv/23n/7x9//j6T920J8hMVVLzr96+g//9Q9dMP716c/+4i9+8+3bH1/+5t/+8I9o +qun/7k3/F/6f0RFfPYVAR8aXHBVuBPxWZUqYF+YDuRWdHTOR4FNzPGXk8FF/hAIg6HoGDjG4Uop CuwbmLK8jvdrqremoc+5AJNTpNsAHsic9Fyzykigb38wdFAcw8W0pefgmhBMGSgGXvkSLtBHOn4Q BINkn1OWtqlzR4FOsa4EPHTi+xpR8XN9qerEl0vnOOZahcclORVr14JOnKxwLKCnb190Nks04GmC /077iV6Hi/XLwNqa0BSuq77FRLS9sjI8ZCU0XoI11qKEbiP9/4KL+Coig0u01ZNVeuuQaBeFsa2r AGViMDZ0DahsjK3IeIsL7U8+tIRMOGl1ZIG9Cb/LwTHUuUvl3HkWGtnyGBjj1RgYurMk8wYdehUG 574NPzEQm4D0lRMjKPgSsAGL6s3S25KIJXxpObCOrsbINrR57eaykhWDV8XdbCJaF/ZI7E2uS2Gp jLWra8KKIUYYTwQMMcv8VKwM4UxpXojt61OoSsF7Xb4lyghCSslEN6dQmYC+BRTdZQREviTr/a7t hYPEdX7dPdNtoAx2mbtypj4an7JjoO8brXClb46GYPTvLtulrsaqpnaidN+pITGouhrHxidYa+80 qCRfPFlgak06/lWEHiedAazV5V/dpaZIN6p8FTXcXKVVgi8kxUAMK32L6CP/B2pbujuSVY/DmGNg qXlbZqGPkz+IC6w1CCM6OLqUBC8EhYHhqo6B4XJVgN0kqQyM+RIdhs4K7/YFX170SoGwF9TWoggu HW43EIoh8KLv8LEkX2S40RcB5qsvK+ZXagrsK1QpSPgqolDgI68FAINqqqaMuTH8oZPpLt41Oh98 qmZX+uKEv5ENpA6LoSisxvj24FKLCpY1Gcbu3YGJJR3Awsq1A2sdCKILCtaufDKamuFUY7cDY/X2 ui6pDg5NJ8JdQRGEkJ+ODHigHodCvAQ3KQFibld45I0wmLf0bnz76r1KA4luSqheUSHvy53H1sEh ZREcMhUZGLM33tYswJxVRmPMA4GofPRVhIDUVY8icCUw1r5juKjL9/KiRVM2a7Qv5MpLvQNzSdK2 L6ggwJaiDPWCwmIEeNDRXoVVVsIgXdPOXBZgd0yULK/iQeA0gxVYqi5fYQyAbdZA3wRBdCrMPgal gD4byZyFiSMIikktRFkpcFk1UA5BO6MtlIBFTCvwQIiqpdsW2v8VdIGUVnQArjRVH3mM6tw/xWd4 bh1bKglznwUB7coMLL7qUPM15qCJnV/Mskx1WmMhCYKug4OuMQ9aGUFv61W6XE3a2ZjwCfgKBcm4 5T3b3TSuVjY5fF0KLpPDVnW+xEya5bBMgtx3V3u/mMDgJi0e1fC0ugphYOuzpW5Du4IupIZP9M5b AwO7vaMqvO8MAiQtNLaxb4KgXU7HBSOyAzM+GpxMFbAnnHGWxck+2K0d2QczzrMoBfRNaAaSoDEQ aoeBrVOjdnF0hqCrbz/hFWBSW16FM188xGEaGwLZ9Ktsudl1S0B9llKupMCkbCFPgV/vxpNxtojb nz0iC2Ie5NQUSNaZGNxFEfjnauw2WkcwoTAqBsaiSsdloyB0v99JZzX6Km07B7Wz3gG7Th3cgtO5 lRhBjvC+VcdVXokdGEKLt866rVYvN21XjLVa2yJOKchyVahtZrdkhD4uMQxj5EgAeGAOGdwXZZcu GRLZb19ea3rE+Wr/B1qPo3qVA8rZgvuNqGnf0VpMU1MGDqsnN3ViEMIrVX3fWpXb3YZQZ6xyXOB1 Ag7TdZzYmxC8KTCbcP3Dl1cF8Siyr4h3x5uqrCU1pPoQomtqPouKISYWjRR0cnnCi+vLive0xNoO QJisWYA1sx+D62RTFWC3rvn9CkP2EqgL7Dy3vpgv1tyd857VTkPgiocV8Sldjkv0jdzcEyR6yCPv FldXzdo2sJ/d1d8zPB8AXRdZGUF3s55DZZ/JMYUIWzr+oigBkxNgnxnZkyXE+QOFOAt37h1tyAh5 erP9WQQBGxsE7Ur8aic5k8nYjTaimPsmR6KSE0eWv3NdVVeivTekkmd+/+Ltit0wIdMl2za6v8dR LOc8KrClJ/owMnOvIrhAznGSLarbsPDJCWlXlJl37lbVYu+m5HXJ+30n7WTz+8HsnJZUsNGWR0XT x9tOChw3JAGsfT0EdsQjr1IAL/X1EmK5kYSidJ/ZJcFKgUtCUC4NzAIsPnOuukl2BF4EKGd1ejsL pi0C8b1LwEmMRSzYyP6tV6nCGmrsNCjwm+wxnh1LgEPWLb2yVKEz2Xhg6UQnXZGa0T3u4uhpB0ex CTpWx64aEDinFFR2QTuwIuzwTfcNT25wBzeXdJMLwbNoZK+bpG9RQhlkfo1NukowQw== /dKMcwGkhkBrdyoE6HKRlg1RODVUoiFoEpzrg62xCAEplSxAd6nAkkSbpWSEdYFSo4rsAF4cops6 MJeg0Rz2p8Q7MMLKpT5L7bqW11EsUX2W/qjRjNB0BIiDNom8dK3PCKJGfkFVuNSTkh0OzCpFjU3b zzCwwEZJB3LNJQHF+sGayBo68kFUwQVJ5xA48MIbY6BoV+KLODLetGtjo0sR5OwEbBLXEThiLGJj 6sx5s+oqz7wiiE1ZY/z2OLCh4bdoIbUqLmJji/3bl1fbvoL1FQqO1B7HdeQBlKMXwiyA3zoCjWo1 cX77n0QhAWln/EECgOqgdFul8oZKQLbjq61PAG0IEVg1BHlJZAKhJV53oFGcqd42iCQO27rg5n3Z /hPfF8ptL1m46TL7HpqNrZIO1BRCB9ZUDIGa3NV0H1aQBfw0DEvccmbDqU2Q6E4XdRM1fdVYCfGm hpivDNY56erCElcmkkHFI5NpBDuCRiVK6Jz9O2kbLjVs1FSYYr74nnx9i98jfFYt0IbhDHYVNkPj CMlVXpaGwOy1WmRyb5GVf3hY1Aa6LhaxZkfWEootODFc/eVU20VJMBZLliGMENULn+I2RXecydlL 4JVOsSnWvgyS+stkNarDPSIssTndssiukXk3d3cbwrfHsOdvOc39Vz/985Lk/tm57yf34ex3YROk NEmH+Mq2j0G/rlCEiH0tkuUuR4i9aUnv733ti/LaofPs4phy5EzMi4ApKULgS6LzAWfH2QOIti4D diYnwBE19VjDSfFKVAvAi/O5EdGdLMAcixjVtRt+hoCsBgJrCrEDxXrpwJajAkPhrSBOIRk/Qj0d L5b4V8FLdhOBScUrsyvyrWzaN47VeCi1pqTJTj2mBXl62AfaHQVD2DwPfWdRvC3o6GhLUio6RQKW tH+HpchuU0csoQJwp11KV1EjBuDMy6obimJvAFjZP/IcXBesEsFAqYAs4AA7LSrU+EjpGR5t4nhX uFiBiiDkPN4vvMtECkIJ7NJ5oDK4o3whJo0fuvkZWXF7JNhE7vpu75vMDu0zXAfi2ahi1oAfBma7 ETIim2UHUqyLgN2HEhjFNXloTY3RDk7FRERH7NnvZwEpErD3al2h5aUFBmjrL1sRHC0IAfeJKB84 L9Zhl+PUQOQwkBFg3EkXe7SEtMnay8ErUJ26yAvuB+FXllKRLvueYxgBQflUhCodFnblrOs0a/w7 oOy0SmdquAaKj6n7K3UbkITkTRLqkITSnI4W+VUG0kpmoHhlABavwKpRN4Cbk/kiG+KrjOwKVcCW 1YKrrHPTF1PQ4cZLJjcENa8geZKi8WzgfdXuRMK6CybeFj6nI4LQXRkn6q7LYq5aZVRdNpbLugmt qXC4zCOAI9Tc00m+Ve5vbFSFq9tc1MgAL76mq0zcmtdX5LnthHUA94n8UeIjKriN9+oXAQfhQ7Ph 1WJZy2aRXQBDTZNNzX536gxomsPv/OCZALhavl+SJDUbDV0je9YsvWVNHCSqrA7Vn7+cmWkS7KtS ssFtE29SHdiXQRGzXK1XNPVRbO3sktKV2ZDk8SZOh9ZixQnVMuNomTTYR5l9xVtrywpusvNUFK4G YQPyU181KOUv8Ry7La29FVfFRaSXjtPD8+Z85MpSMWE5iQ2o82bc18Lxoji5DBRa0ZYa8+zOfZWA T9col6aQG8rlBFgNgUawdgJUoGBbB629cCrr1Yw/eOtYgsqfBMeXwPHieGqt/Cd7sJJJv+PVDhNi FrwDSl9JoxgIxBVhb5qjc5FjCAAyUg3ZqfC2kmVxk1n81cAhT2AFcohuB/oJaHidV7yeMzYk6FV0 lmqBZVAy0JZ1V08yUEC4wCkNFQYgTzcBGV9DoWCbY0g/KAJOfxOYnWcAU8k3BKNz5Tx9bdmzaUph GWY/4klk0ofGie6vAhZTITSr2+pAqXAMoiYYSOMmIMXBfhAEEsEAmPfYCvZqX8Z9K0gB0stUkuNo JRNQTSV5NTo7WESeURSaValVZiCZAQQsiN3/oAhylIJVL1VBg7BIJag6sBbZdrkmuxkDy1xlcnHN sHCxFUGgPj2AQRHEIa+OPXnmOMb49Tw/X1l5uMC1VrzXt8QTR+DoxGChON1XAzdtzTYqo3AKLORD H/D+MDq8shhtzeXv9UfJUN6rPK1UxJcljgsMsL9OaIcOGpVifbeMpoO6Fldl3JIqm84ejcyJ4XRS Nq9rc6haLzo6S4QYfcGMYxKkxuBO19iFUy6iTGm7fXlrU7HFjGA/LC3bw5rltty0gXhR6IhRPx27 UxWTOB9DS5+y8qpnZM+juJhohKTMR1yb9xoKzSeNQIfasukZKsXnCLSssQ6UVBjifaUc1IyQdFWJ U4tpD23G/ifVnUTNCogrhQho1XpiUMRVKB1cKi+uhhprYhXCrelSFScloAi2mr2OO2DKJekKiiUK Al6yyApIyq9JTS5zr2mpA/BKYsFbVRUpZNW8loLqfPYcfg9c1qMUpJCkbZP8JBImTRMmWmrVgTTx AMq7jV0ERikFlq3pQkjBHIAOpJlhnmjQpjXerSnYkJBLkm58lKSK1ky2alRyWILf79ASFSpx6wYr jWP/KEMtSnuWXNMcVGhYM5x/ES/qq4CzSF80wwFtfZFxaUFDk/wxj0tTCq1Mk63LvpmBC6DsRgDK UC8rwcfrbJfh879wwL8KONQqoZno2DlFDuuKTeWKzUjMf9bRjj0OYOOMV1ktskziEPasuwOSCOhS XxffVNMIDLxkPw9W2YjVwpBk9bEdRjsV9yQnLADV+tTwTMfFfi3ZtiLsKyoBwZIkos8ZbW8RqXQD Q3XskDQEV5LMiiQRCcgbLLCaCAXWJMw/x75IQ2SkCVLnOHPRgT43IYBOETACr05dkkjArykHLL6T ZSYB03URuaJH1f4rtmuR3q6+mDmt1YG1XFLlXIbt2jiUAaAVr9S+Nq+9Irpa/Q2ANet+RLmosZso Aqp8IrBmHioqfjUFZoZDQ/5JUk2jjLQiUKT1yLQXMzDmJruUCfFlIbQ21dI3SSgyBWJqN8/VZ5xa lGgKpICtQmjBNk1u38A0k+pEtjS9Cyc+F5HXrjy0HZ9kkU3IedlDikgRFE0RmCYGKbtfdQfCHsfv 4yiCZjYlk9BxdltadhxTLYnNU9nYlIH3DfOr7KR+qnanyqYXBTdN46nn1zzn6ViQGgcBASxa2J6L VmADnHxT+eLcBYCOZozkS2EbAbrHR84f8vCylsy2aBuFsyIYAhZtKyWna0vIh7LS56xgEUaw/SpO EXAh6+tzMbVNSYXBi+BK2cJxCMPwSzx1VGnfW6vhp9G1aiEk2HhSzF/tNACswarJLRfDMPxCsIRR k5VaORpU50QYuspOskC+XMkQaES28vIRoAR/4fEaWdsQxtg0MN14EDo2yvyyakCEQJXTMGs15FVH skXizq8YpQIuWiUiJdTUVFOlpP+PdInRf13mXJfhHgKs0cfKUfev2pp3FApdQFAIFrxmFWnnO2BV uS4aGSJ7dLJd6eQcg4eL21KWxTHZf2q+4SOLedpT7cwG1Qjqtih+f7rGtpi4zFi2hKBrQI70pIut HVM9VXeKKmHFBg9LixraJO6nBRdsu5aKbAZKfIvKKnRb9c5OnVhhStcQbQxMzkE1nNywjUIS1K/r IqnhnYI3Dc67E8HTGmJgbRrRuTQdD6gFf65YVW+lbHuaugqeI+UMtDJ5GAFsWZHoFt1oJIQ1RY9g mnD2E0DoXWNh1TCnVssSu9TLM48hsEpiJ88iOh3cqlGrZkzi8m1eEVKFjF2l6cxSbNU2kKq63xRk N85CsyFk3ZZyUivkCi6YeJKaoQnXtCxsXgvKGmOKlUJdMxNhympxjVlHyAF76YzCg7rCRsmPVkjd F57sgTBPbPnS0ntRcPYSraW1KUbHZcDAwwDQq05Iww1vk+KdEGgUZkGwUQBl8ed/JCxiTLJBEjUb 1cGpXFKZpWd7AHRVPDstVqqwUVPbTZIaNZ4Et1aWVQdmThfA3auXRh+l3J5MomsgaFEdTjqap9HH wAuLTI0qGCABAsNG+GuKA6gS8lNyFZFvrkynsjvhGmxfrySIe4hD8Bw/Q7lX1XMXHexKDDreGmRg qagSylIw34E+6k5O8XgdmKSNoMe6YSidebNMS4hKgcYW+gJQWxF5gqJrRQuz6xyGIKEXFogv6aca KERIgjL8GoGTovW/8K+97EgUJRG/DcGnoLmKyiY3ME85kKysDVdUv6Fook5NXt4uL469oO2wBChc RsDUSpn24KrW5ZXVQFD73vNbYjVcal0709BkduiA9agMTBQupZ/iEXBm5BTjRoEoEtjX+VIzQIp9 QFYwoHppfc4R+tS1KtYFiYJTy2nMg8YfesvL2E0bh1EgdYJ+RkB30HDb4WVJDgfAMekAV3EfpbyL fKQiIzBJanzAhhs2TfITXRoXkbPr5OU18bOvYV2pP4idNY05kJMLCFYFN2zHKk61RtSGyQWgxRog RhITCKbhkd2qXlx4PfAMdWCOrsRfGSyBb6IgaR7r4mOfQCBnbUbiA75+0I0aGkkYaGYqTuQzqNtM QfRhKBp9oa3sB1GoTioqsd9nCSsQWLUJXcMoKKoCk4sK3BQ1lLh7+kshTYLT+BFrXrW4Bk1EQLTT 5nWZaPk/Csez24Xhhpd2jr/9cnG/AfG7KhkeEjY9Rarl5t7K1UPmI20MFOUPoJwMRVpBdQbA4hMM CgFsXvLK4t/dCRA7ODc70jjHcDs4VCeIo8WSc+N9Y7QWFHK6a+idO17tMKrchzadZEeVP1tMQcII XwWcOHADsJfTPVFLS0JjpXvEq+n0ZjFtz7bYi4LFu/EcH/6qYHYWAZYdKjQrz0QJLG/oAOagLHWq RO/diX2DwJGUVzjYt3o+MnFMncASsU4Rp9Uiw4ooAQAlHehYLrRWuEmBibM0BSHIeiuKFE3eCRhT IrUYQSqtdEpk8wJYli0BNf9lp5WiplCDVLf+oFPNJg/h5bEByD4zgFI5cpq8I2HCS5zz8EF+oFTH i4INTRMDpwNxCuFpydgBmDU5N4oOgUDuWrk0+U3ApMNohRfZnYIfjLTomsgVVTgoaRom85wMYKDW DXveDwWYbDl5las7XuVF311SkSxf1vTcVVA/xrUA8IGTePrF9s142Rm2jqIJ7ovHesSrI/QaYydB zKIycCKC45O4OADTJkCONQEoBYFFDGDJo3uZbeBtCq4ciANMagcXpBsButSjZUET323yImBN5ie7 8gRAFgsCiuqMzKoB/EEReNaoif2Gr+fuvhodWkMhOUmlQwuUo9oWIbANyUlJyRcFpFT4uo0wilHQ NARNamotGzpIcXv/1r8wCD5bvUSIgPhFocKfYIfE0qj/C6Nw+1LvD4VUearRTllPPWnAC0CrmCrC 9RsBOnNZT38TrjI2yBGWtPI9eCxJ2lqRaTdQ+OwZHW6wKsbMNclL0CFkPXWRLts/7g== FAzSNsx6aYAaapdltQAMdnZFSotwowGXryUpj/1BEUSNh1DwULEqFRKQOQ2NZ9PrkRQ6dhDEYwY4 XXoaQev7vR2TxZES2RG8rfsOLG6c3WiXxTlEYxKCrEluuTnkToEyLVg5ZWTr+EXASeqDR8bpXKMZ 2ApgSYuaGsbdZkwFbbpWDqmrNozKOG9Zaz+dYg7e6t28qToqHi2CNTaFUQiAYN7OIKNOlAUKajjZ COqlbTWaEEa4yXOuVEeg9Qpy96hQJS1VL+AuriqWlrMdET1JtT2SJeyihVlJZjH5gUCsQMdXhGn3 FH5kI6BeqkT0qIzjEIFot5TVtvR56ELP+TmMVQs3g6bYaSOTu0QCkg8yAzm6MYUaXg98aP6rajdO vJKNpTratSzVt5ekkwOCI0Ekg8qYFG2W8tfAZTyK1vkgqsnmO1geKsAO0ALcs9ItYvqNenL0lbTI tLWiEruJ/NiVqOaUwkoUtdbdIHiNYVHpuG4qkteg1qKxIp/+ZaBKXbTDwZUrAX44dzcZCpcmpeg+ ohcFN41A0br/qmAJXTheXgzUIJazcO0d7xh4y3q52jhbQuA4g3Xg43C+BowIGPIduOJVyyRz0QFT Em2EmTMVQrWcCs4aOZ7SjgAWjWVZSpmalnhvOoAz0oUApQwXjgQ1LOGqvhi4iondJC1AwFY2Kxa+ tpm2iGYoabS/i23KGUIAr6AGq4jnnYKZaRpnm+zHGVwc5xbKKCF0VodyGvQNwdRWqguA9enYv7ol yU7KtYkwgJvuThqQyonFkYCUP/k7aVtK0HSXKJClrZwhuvelRBTbWyrvWC9n8FcFS+l4teNbAIbc dPFy7ATApDnCGvT07wEtb/VO42VUC1jG5Tp6/WEHPzEkyVnzixnBwByDvm31nGgrV5JcluCjkiur OpQ0y737SXiWBWOyw/WQ0B0SrelAqfFWPSNAPpBCwWMvV4VQ26GTxFsapapunMO+r1ieN6+xIbpb qgpl2fNJAQbLlWh5HKfItgoBtHOH11XFDQPY7oXScldCoIfdposPKO7BQGP6nTCZYhyHznr2kCye FwXbFRIWcunz4eweJwmJAigbWGErhDu8LLtTONzMwFHop1OP89ROb4EkZaIIvN3KqOYg3ZqiF2+a b48MrF5VSjnGH2QIA+90olyKSWIeZ9oRDLZbPs1kAA+c3sYi2WU09XYloRwfy87GmrkkS3k+3rdI hhUIR6nv45ZSE6bXRSoCMra4rTnThFfvqaG7Ib++NsUClsLdbNm/PI4N0UVyCrMrM8ZZJMyvXeyo QR2QIOZYMTV9F6UfTMY2EVEZC1YLmiTZk0exTrGyOwBb0NO4GpsAVNJxZQSFnBZ9xXE93ElGWcGN K6oqF5ToOVQ9WVIteZDKdCBXnTpcjxTVbqLp/CYIvMxc5ZCmIEjBEDQ73bpSoKUU8CHrNGatttVy 5PKs9SBJw+xR0i4CbMqckU+/gzVvV1JVVmoWKFlBV5lPrFx269woFLhRK+oFt6/IoaDEtQIvCpaI V7JqUYidHDJIVi1Kd8Vc2tLqcEiWo1yZohYIyX2RgElrnBTnq0dlcVJlnyFwupA1+jCRldUluo9A pfoyjyBzeu9FwIUrNOhuX6cXO2nYB7ZjC2/prUvDiWhbgl4XpSGQcZ/znYIfjOtqrGQOzyjXJUkx 3f6GO28uvZROL/uh+2X12rA4cz14XYda/RTzdIWe3vpA2jXoRXNJ08Y0+kvbOrkXN/PFedxW5Pc+ hDG2iwsy0Br2xYuB9UYvJzsDUaGg8h3CNB5exh2vK85kCNb+p3T9bXHYWR+uuNXN1I7qVL02j9xX A4sGzGbid6AeNM2jECxaxCRPzjbl5rNuGxK9RAr7diMxTrplXQQuTUl0KUfS1flV8PJl+/OSQRrd 7vnWO8WR2bKLioO7RpatRd2htFLv/2Xt3VZtW5IksS/If8gXgdSwkxhxj8fuLT1ILCEhqKaLRoji VJUusPOh1U2jv9d0dzPzWGuunSUJUSR1jp+xYsYYI0aEX8zNrIg1aBx1sXKH7iq7Uj7BbtE+vEU0 aMZ6TYu1Tysak70pKU0NIlFJvac6ftMGseKUxTN86L64a8snQ+a8qSSXPwL6SkLDdsJ83SeoCS8g MgwODB/t6g/dPgDAbNksXssu79/t6/2Cm/iijTujo7Dj9cajIT5ux4fyL1ZA211yhxEQZGBC8GOd INkt8O027qEO9MdmDbiy09PwQKCW3VVQhnK/s9cAmwAs+i/W+rSZnGS4sAFl2QGYE7sS3HTPf7HL CzAcuxAr7mEyzXO+g/1NCXpN33YXFW5LPteHtc4LJGW/1AmUztbiXQTszyzuvjlLmKXcRbvNCW+f A5DbK5p8fniNBce1Mxg1DtrXJPuOMGV2rTLGHoKyGYuNEOWeApsbSiRnwojo0nPrPdvXHnSMPCFS EUZCiC6w0SPwlkUsU39f1OtXCeV4yEngiZBCeiz4xgNNaHwwDfN6VK2wyXYiox6CSQq3jc94mELi 2KtjaJc4tIGyiWmtc7XMpNO+xFbgWM7oBPBrJxCPY2oGRbju7KSxa+tTP63OdS6wEvO/Zoyapt2r CITMHGQWRGKyBPcAofAo9rIkmuCZpAv+LrMWZkRJxE4zY4fjyqnFY+uyHwNKxLoQG40z+cbV+bCO 4Oklup2xQNVey/3M7uyQhTs7Ya24GNkoM6MXwK4NMitnmHq6HiM/8qYQZ60oQ8QAALSaEZvEIx6m V9y/9Mi9UssBwLVrgFYUndYiW5DdLiApS0BkG/Uh/ud17XmIYWcq3BgEoznc1gd8krWErX8CdskB nGgpXg5C87WuZOGM/scY4M+ZDuGfX4vDQrEPJETAtzBARBDGsfmJ8cD+Lp0G89D6Qoi3sq3smusU SvC5oKdrBnXhvoGfawTffawY8NcuCTHY42Y/7cs6tXcwYbCMm6/hDghvW4PEwL5LaW30i4CNWBf7 LdXGWP5cSZd3d1+szpwHN6q4lgxuTyAbYAQMDcg/FqjJIQcSug+YHfkZ5sPK/llcRuxKWY+60AC+ jWTXE61uYQZxwMoj9HE1i/ihIqRlcnwaYKDyedMjNW0gPJhHrJmrhBcaHw291FUiZs/H9QEzsja+ I0UmcZ4rX8ffmkf11OdOlR1mIXz/pSNjZiGu+YXNrXaQEkiPMLIVrViGbmlcYgcTbTwTdnOUZF2F 2Qqv/iqfbwVM4sPJPD0Pn4KlisGbOAXy81oKY5S5VYnfwaUWRmZ0DxuR3Yh8B+QSOADd/a2N0oyP ch1dA2Q56EpIZW/GjrON+edWVSdCinRaqEOOaC8N/Qj6yaiJmFvNpTDn3aRCMuWlwGIHs+KP7zLV TGAn6Qf1JfxuCx4tW97nJtrjk0M2l9iQTvwVb2wu5ew1r1V43hVUXSd427a6BDjsALtOnkw2aHnI Z8gVvsRte6IHjU/mEUPJhKNsAzx0XwfZdSc55NxrWPp7pJPtG0Gb2ZyMQczIJTOpWONew8oH2+lA +5vhc0EDke1pYimYd3GLsJmJPOunU8wKH3KWkwLTpgvIbPkLysxWN4nGEierjPDMnkuX9slmXWqO q9OBbOdGcizaFAI33is3HOB1AyRfZHZ2qAx6dLobYypGRePkHxiAkMyiyqERDCdXCLxaY3ku2qc6 2YGmlZHpfLk//8Pzl6BJ9EO/MafkSMF4sOpkvYhMLWu68I0aF2snCn+S+f9E9WOr6+cHyNW73k1J ftP0yIQO3AzIr9jAGF4XWVtz9xn3vsp6pjP+6cNBXd/Y/NWz8zTRi1o6hAEid2szNgYXA/zyUy22 doYw6DH5hdF5DrGpy2UdNlctM0ej3y2yKOCPu48gITXW8y2WWs/jf8AMZqyRLZrWXYzDtAg04Y3A AgGphcSujYIqUDkxbIuOsvBhF917A0jLUQLxmXftc1MhCZe3QFR8T0Vtuh4usUNOS6GoSF+Sh/Nh w5uHlNwqGNjAie6s4AEY79taeNZkd8HHK8mMKrq8I84yW6zq5mN/w3f4H9yuOkzpJdi1CMeKqmwW xSURtI4RmwEclVQ58mg+SaNpYwfmufiVvAlRRwOQ4VYAEEvVpNbbEqzyRKo7BrCsKl8CMz5esuDj Yj7QjJDgOhcPhGdNp3aagYSH5494YrTN0M2Sc8pOeBxIMwMMNrxZFu7wi6rQQLD0ZOUO1pTicsZ2 ds6Siszrnk1hS2OOdzf2zbrHo6fwsGTrjX6Y62BYzX61fn/8W3Ct7gpkBElQgW4JQf/cz5ZIv+fy tDInPlDDCyP7XzJqMML3OBsstfDQZzd2dzRePipN9TuUeJCh7gSlMkCKv3/tCHpcxM31Fqf9vdU5 /yP7sB69glckgVPoCdx+GNmGXsVMbGCmqqfSJVDYBHZ8FOA4+JLOgONjMKlAjPHM5wANLAlPgLTC mG2ArAkbTm4qDlgUEatUwrDNEx1TXQyKdO3/HteidcGDFrDX3t89e6Cc0UrM243c471EKB5fo6Qq ocY4Et12/T3WECebS4voNuNZmup85XIpOkQfdmzAvBMVVJAV7uVKxLCtqBciBP3zwlu4016ZsjFe qMoTj6g/x5hvNrOhcbMdNQuVfAvGYTUV4x0CkE/wiMY2aeovNJfOcalntS9Cb2lEbe0b5cpptiRc KWIJtQGEYiXxtdFotcN9S4nelk1QCl7t77tybIhy33+JE1hJW7AZ3Zg8WucxzD5V1zZDChhDsvh+ Aj8XQy4RVh4pNoYIGzG8xIBbAEBgr/O4cgBG+UXSAK6hRn/hGpXOSbk6y0xDbclDwzdn2nCTyTEB +yaboke5Ujh+LY/7AaT3vJ4URZzaUmtaobx9XJv+CqErVwvSUf3XjI+UCzfzg02UR3y0nKz8xkJp OZLwnhCf5d9PsVwBeOWwa56pwq4Ovhf/IcLMDUhddNhfenFd+Unwxfweck2uarAf/HA0IWtsmQ0w 5OmkY3OBTH+L2eyD6LELp5o+H0leOymbPO5PSG1Hieu18CFbYVJtygZQscqwrxFpOMWBBOh6CEFH KQphu2GtoWdq1BAwoYriVbedkOQt1nOvQeCxpF7VEvKSZfl19X3aDUTLoA0gv9s07ESSnnrNmUyg 4pUh3Av5LtRfNbhc/Ur91ojdJx7B5hogKGvHk8AvKUXiieufmhSZ34V1HvKOl9IDtjQ3a8i7j5wA gco73OcPLO4UsWRztW0agwybJCw0jcXnEf/ok/sDWA/6TqjrjlMojOCN3eK9XkFGxU3z2dRoo3JI W2oaE5unGw+hbVkyausCinUJSrZDZUJIkLpK5ULhs8tlNrPEEdl2eLjn3c91q5qKrJ8OjcPHIhT/ Eb8DCMNwRCYXSyHDxcu8hIcmONmYD4FauUREC6kk7ErtT9bnNLm0qC9mHVGLmJ4J7jbzB9A+JqYA jLuZFGPSwo7+zq9bVMmvWzgsde/rlCfF+PLUEY/zFG5jUcTJMon7OiA/t6e12vuKPQ== aoVYQT3F45TsxVnDbw5cYlmc+/FStX9e2g62YDa1oSYr6L7mY/Mekl+xs6cSsv1yMjuMLVi9+ry/ 8HlhNNmGbsZJZGB7tgaYgl0kr3NuEVMuq+8RxClRT8D2Y7wGdD1zP/sdQl1IJfbS25Yc/AkO0Vgy QptpXP2MvqcHjGWIz8k2JMzWGrIrT8AcdYkY6NroRqSUwghysz4UEv6+k40naw/fRAcY8Fo9d+VO ZoiXkSAu64fAnt6vnu/rvARzN8dNMlB9010nWxfy87uWtTCDS4bjYrYg+ujSZzcjGiz7pWbUxJrh pOaT50Vb6v8AF44928DiWyRVaz5yNgy1bPgZWnhV1QYbAPqGNXZIeS2DTd4kfjNjZcsdu+saUGbx U+1ym5hTbwIM2dIXDT4Z7WwAnG23FIA3hJOavq0nT6yJ1djkpS95z42U0PHxHtxtpsTN88MmmKSU TYkAXkvH70v3efwY/YOqTIKdOJEeteZQ6tZuxYXP/aFv9eHccQazXwDHxw5I3dsnnClujG0W9ll3 xTRskwYrbxhTOOESVv5tE/kD/7kqb9JSVqKK1bRtki30oGnhsB0bTQ1lixy24NkSj2hGbDVVWSL7 rUX6apAg4DFW9oRJsXlfk2V4bIGNXmPibdpiv0qvGa7sWFT7E4uBldcfLq51RXZJC8Byq73GJj0F tH7lHRhp63n093RdQFDKJ9M6l7Io+498l3Y7FKSUb1ldYdt6fCFAntm5W9hopu/uCB/WrpS6hf2R 6PJhdRp3Njs630pc+Oj3UyrK+64rm8+QErMxCz9xgJvMxUC0Ui/YgJ/8fImst3gDx2BfISVajiph z0U721IEJPvCG3gi3ciksXlUAECWC+9jN/awM7GcyltAie5qLPRcCLves+TUVbH2fVIDoO3J25uR Y3l0ardLRMC7xlMxhaXDLg5EW12NuRNbq4tCMf5F08y2jxohUhjBfuLSL5jaI8HMGhgCpqAAiXDm +M10F9KALloC0a8WalBhVLNCV1khm1H9ieizAf+sGw87SWfm63jCJx+md1p2Tgq5dzM27p5JUO5P gGQXSjtnAeNK+j5/4Uadm7pvIg9eOTts+qOY6ZELS7r9WAdyUUgUEL+PIL0/IhB/ru+DskCgo5cT 3jhVomK64x1wKhDa1LNt4Ym3oiQiGneTI8olOkiRoNfaiBvzZtqhF+hBfPwWk4XJXv5IvdlfSwE7 QrYI9fSxioAqtkobX2FXHprKEE/k/5izJpD8URa1K8+TQBlzDUHGWO7iR5ZkH+ZpvLFp8gRFh68H dRtPtSne6BkuPIGGx7VwIop4hZ2UsYpjgtRfzt/W8Fyk+XYfXtyOLY0iopNkYaQoW3wa6jH2pjye lZ6GMKMlUfm9HenLzcGTNsmJXIWEewY5FD1Nyx1doma/IUp4FF01CYd4Apr7AEG8ntYu59r8OUAq MPl++4F6Gdi4vSea8FrnAWOzeooiWSVOEgTUx8yu7KpM5lCZ4JPfZnTLg14PVQVHk/tcxdRjzFSQ 6Kmkjse48FMfURxdBcZHjHMkdsImc7JCSY6UxNONbM1/1CVjRnSUgcaFz5Ede1WxryNd+Tks1U1/ 0zqJHl0/DlEBr/IGrxJ6FTdGiTWnEmnwx3jNo0uhE6xLRSATp8xm4+5RxGXPEFmBotZW4xeDlni5 qR9SKLiqkX+o3OObK5qgsHzw6U+tgi0mgZETeIDQQCGR5W8yVT2BAJJZHmnhmunRfBAj83tqcolL AONYg2/4IErUx8JYRJREX92L+OP5uisZ95hYY/xc4MSYLICTpOL+Ic0Baa3t5yadLx5NrhRMwqdU vRpdDJOV3EVhpqhHDYwDzUA59JoF70FdCa+BoWafKQA7qLmcBjmKekoMD2kcMOr54ZAMptmeJO43 6+Ch6UiDD5hJvlnl+Ix5uZUVs5rC++Apclh26ttJNAgKQcY+eX6G4Lw+K30lS90nj0B5I5mUr51m K0C7y7dmBrnqo0YrG2BRx8dDFxgRC5aAzv2NGazXj6kZn5vlVOBZYoJ8BAOkP1mSHJYVqmjbZ5Q8 UtP8Ao6ZbjDoHJIDfExlQJIo215W33oEbWgArrhHOSP7rUUvraNr7zuCMFzbaK5ahRXkIEVwdfv7 6MXuYL/R2mzclBwihpUheR1/c/Fc9+RjyV4fE/jUVldVDhz7euB0k+zVRA63qcZkqqGb9GRy0/zP 2f3u2QGOSo3CEtkporb46ZeYL69mOFjk641NUeaeCtZjyy0tsetxFlW7O+nftj6wpHX2lcxX7jsL /56o0yeFmo88ikd0jy8jXehy90YX1V7AeM37PdpEK1o9DLpW6PIz8TaOTrLnKpXNcq0ayfW4+eF8 SwJXixSssq3Cm40Pv1MSJzyElNhOMa7m6MyuXN3cPLmqQNBmLLxyK5c0remJhDvsbZlVXvMjYp+Z AK3ncmrmo8ArKfGn2o7c61Xre8lYW/j06Z8yl0LlIwC/sC8FgRAZ/+ZvzzkHV+dDVoLWGoxj84mw tbxciTB7JpuLU7L1ld0+7cLyPhRzsZ1LQdtUu5DVMLDi5iNIdfkL5CLsJhf9qarsgT0nwJyL4vxZ SCPRi+S6Jjiu4w7EWTX9ivvzwmIrvC3dQVEbfrnhnilZUSJDEmu7dY5KhtFhzS8iCUyIcbInACDA lV0PP3DoHNh3pH3uulukxRuUxfUdFcqTEdhpT6aSNwZH6CwsFXohjH6TmfXCvAz0gQdeK2kYSdlm KzvQeO0QYWffRaxATxExLW5fBrqCS3YH1KCbgTsGZH5T/etO98wuqewq3292Crx5SkAA36O8ejpY c9z+HLxtQ/0+XSE9OBK6eqjN7acyqpFODnqq/tGQcpTpYwKfUbuIv+dH3AjjtXsVSGM2FTcfhZjT JZK0keFTbHLZnhs53dj2djkns0lRGFpyvLJenxf/ngmsEof4B8xQTrFFqwZMny5PCuZIZ7/E5Mgh YzBrydllGGJvDEz3+YUYQevYOoQ3OT7ZA1siTvqpx+3+TYO65cfn5+g8ow8fGSENRQBhewydQn+T abDZLu5RxzjrMaQroOjEF6MfKp60bZwwshBNYLTfMZ0O0nRfPE72xJAGKXG2/AgQfmHGIwGvU/RO n1wch+EzRUfQlPVjxEFjt4Y2f2tF6PI5xLZv7RDii2P3nrUdLB402hYn+7P8UGJSdU71YzxC7010 rnXoE+E6ndXJv2jTUoZrsesCOhC2bI+MjKdBFqM/HyzQeCjHrodMJxJWOjfR8gw8wwj+4P5cBV5v tWFwRvfVOlIyxwhHdy516tQLGWvPdTOzMpWHmVMJMcRLNJMaLuNcewso9j9BWBfGPFsW8T3eTaFQ m098SF+yBiM9rlR06FAhvsXn8H55Ek/qb3luE0S8xo/TFPBpr50Egfq1he8MbZWOXV3sv6FT3qIx ic8L3E1eoDls4GFw1tSL6w+c6bTMadorhz8KXsV4YyQzrNJueqeujgGOBH5rNJPBuFW6QiLKjJ1s ptdSPsT6WeqNz+uwQcKShyRwK8pK1FjWHIBSNlXVxnkkXFwVyX1Hnh3jEm8BnQI26u3F08Xr9GH+ hjA4zAAfe/S+MGH0TVyklqtcWT4p4a3nKp2rwVZkyD35sY3ltysFqg1l1Ys/ku9h1SsdpxbGHOC5 0Gors2wPs3ROHTy/bAjf0QTHZJmqyMjGeijzgCXb3SPa75Jx46rh3cVWjSrsuhVgJ1Leq6nq7OVB /H0jet18t4vSONKUtqcf2tC3F/VgTR8U7Cxl8rXOUJ/2Y3SSShqSEvZTfK/fMFeHuaSf17mQtyII ikxbE2mn8/ppcXoPno5h/H3l0cy3WuiMsbrIP18QpiraTNbDRiXPh06+qnzXCXKwcQeJTdmFm9it wFKHjVWvcrFuWPvnZD52Mry3vWQxrlL8d0SMWlQwN+NikiMlNYwwXxVUNANZq+rJRFHhrlVAh1ZC 7IF//ygbIQqiI2BiuXciMCN8eq7WgConkc3zdlQu+lHuWPIIbkqwsoXD+zT5vK7uT3S32I+ho972 +CJPLh39zdp8A5RWUgKFnwHLObaIIsvSknnDPsM4Z5xyn/lrWwc9mOh3wLXYjY1d9mUukPtZIKCN m+Cm01UUBbl0jCsVO8ZhYeRhbeHOZPM5UnP8kjlAW6TIh1Lt6oSv2deFRKq1xEf/KQUG+Pc7tlj3 USub4lkdLwJNvYzYtT6FfEsanBbGoVa3BjmuHFoBBgFTCRp4WNJ1dwJRfMtb1N1rEpRi76aRQMBP zRTvjr+XdlRPAhRjNgiSYcN7kANhs8Jks1KD4MuMQhsBsMlJO7g81pQVh7g/Rq6DwyPF9qNDzvZ1 qAXDrF8Ys3CDfiDn9GDmxTE4P/H3j3TJz829kSVbQi3s5jaVyZn6XercJrvrTw1wtNVuPh2ey1ll +o6XP8xomfNrGUfZkwSpU7kQ68tx2kwGks1hMSdgIR6VEqwFVCkQyczk22QiCQNAEqNIYXQZHpRp 7SnX3gY4jBHF5KLSQgPwPxbpefh+p9prbUEffWZIOS1rG+bT3eRdGAQGUwGCA0Bg6n7kI/aze8P+ jjqX85pfH4EE1q542GYVJBO9XGqma0hP7gkqqBigKVfgxXEYUfat16Fl/B2TbOhEytqDTYZy+hdL 6IF6lZPN/GTtak6tDpYcH9U3VsLOq9L4a6vC/FwNoPZJnsLCM7Rq/dN5iPtB83V+vL1e9VX7ehud V8968eutyEwkuMZokQrrm8zcOutMV2KDZIMrj85HJdqV7vajPKNzAi1EpAnGNPNWTQ2IJjfynVWE Ec4MxZ9K5oZd2IXfs//SjJVJeGxAO1kqnisUWxlxPN5nGLYN+NvDngizodXk+Uu6WZLwzRyzjZi1 bCB2jK6q8auV82m0VDqFTvLnFRHlpZClkUUdeURUHoOeTQwr+NquV/nQT0Jxnj2UkBDXXjax1JRn bZRoZ/r/JwYYqIfXeBs/QsFpUQLAcy1xJeOw51LzMUq6h2uLup1GqldVl1icQAdq687m7XZ5pSTu bJ8qgg9/n7QTN2Jzt6v82FD1duksRiCHynhNiQr4yhyASOWiSqMZAR6G242HXekUuoujGVSejX6L H3xjyuO3RS64TEyxpmdGJeIcscA3jtJ/y16yLZQZPT380iSb+aMGa7tWmzo26i3iXXMbRFCHNHHA TFf+eaTlvTOy8LkAEd2yTf9lLI2TusSwG4ll7WYfraL5MAg6D/8evWiOHZWcdyMuxIblVtaum6pd Cz7v4OLzaxcjvL6vdnHHM1FjCz5khtxP5SZtDIiDB6joFgczRYbgpf7cZMzkiGspNE4S/Njj5rWD ZdWWfVBbaqRsOuEAGRoQw2JadYOjij1vsZHARq16i5MZkYbDhVqMEOxzgPbiEFP1FWfJCaNjSeAq iz1vscLGNWdGdCDFU0gpRTRl2sRS/fKQFrFBtjiuvYj9qXldFMbcfDP7sPJo7ww+vA== CbA3Zp/Jq25ChFpz2Ti+s+knhW1TX7F/UnCv2pMvIuFDFkiPaBtn23aWfTQDVj7LxcVmdxbJW69y xTZ1CnPP/oXEoA/7lXlS8O+X0IketIWU8nNBD3ALB7oM4c7i3Z5HWPHn4j49zw1n6JwBOA08+oa4 cVGfGyDPejOVbh+7UG2uXa5z1Ary/h1LVZ7ruW5CUqw48gEziYlRiaE50V+cmQlKPkwdP1U2oGLK zfS6RYtdUvB0C8+c0exed8E+TyB9S/ZouVEvNXwW4ZHtA0N7793MvdeFqtugnzJj/xruvL7mzKFk A41tCEJOyLsQK3FLpsCdIea5Eq827gRIA38Lr/eKMowxOF4Lqj38U7QPtnPpIG6JP5lZS9P2s8Gi lW9dvJoJL4aGpvCrgtODrkIj4FUS8PqSewRuWxVvTFevUDvUjANqC2SnbbbQPayphLuFNpJarMKn z2tgROYn3oBIuYzJuGWBC76Fan89gY1xu8wtFbmTgw6D40k0BzBuuHtEG+Ehyf/Lz+ViEk2e3nqP RzbXenUZpnipQ4TxEQ1SNvWaBMJDIOV6tXx8HmCtXANQ4XUk3qAO8CjUUuJe6kuYgVo9udpPRmqc wlR24IlwHEakp5/oYuP3RsDpcyv+UtegqrXVtWYfpf3lNAv63ri9z8k8/KYGsflC2NpEtrKPAuVH C+IU8V0naNL21kXxzMShnKIiZP7+eUTwVUVsfR4esP1WwzzPJYiqmoepzKtdj8/0VG3vqR576tWp VibPwlMFM7+mUO9WN3BYuxz81qiM2o6S/l1y3HZpa4pZpEf/YBOtF3flQe8hFtBDmXrWcXO5Hytl q6C02Fp8mlZQFavU61rk+XpSkZ2m1FCNVl0OkDUil/7AAIiGm3yq0yVd1q50yUmlw0Romc5952eM UOoYBbeKqPn3Q1C7jP3PVI295sG/lOK/dYnPFjakqZf8HAGiVM96ShFGtqU4zzlX75kfera47GKS 5veA3tK8Hhorh2Uw2EhIbEYGni0qTz/558jFNfZQmJFkey1f4qe65Nw5AKdVif46YpHpqd12stx5 l3zPodCrt8T5ofHysIVDAZYnjKTqq1lQeu3JImOv7Ciza/vDjFWXbemTkdSfmZH2888LTdg2LKv0 FQBP/ymJ9g5aKpuYJOlu5twISqB5n9KE+KwMup7SCX6zXx/IB9i1XTVc5APsWlacG4N0H/Ww7Uz5 IzMTzNSIm/IB8HU31M7M9vp42RWyNIEuERg1Fb5ejqAPlW12dmW2DeszMvMAN0ulPrcZ2RFiWYCB Qem3teTPMDMolnqlLpz9PdvVVcV2I1onqsqfPixUARuPp9f6vnCWO/rjzEjdrBqRZAywBOoUEsCM Z7DYDPjfUwweQOPpm3eQjbiNuBwzJhYBYOLnKWoNauH3+ABPERdoCzzZB8xM4TRwdbzWr3rJGqqq ZkOdzP8csayZX8E0lqyHSx8wMzsnPffnqWr8alFtNGNTs71tBEg0uBn5YPwcBhDKItI3Zsu2ShUW /NJGhVoU981I+YVGBkgzjqBJ9KanlgPUzm0PdIJu1K4VmWuzlSecgtDH5fxLIzOAhB39ttBv2unU xiOINd+DGosPoIAC4Mn7auGeuVmIbjMTU9LJEmhGBtNdX+3TyPRtEyMS+XXEEApr1/Z4XF2wnhH9 aGHkVjASR2rmqXsAeM6MUA+w34rI338Jzk7Prngz86DsCfzwIVCKbqTdi4eg/tqDl5uthi1TdjYA E7qN2ZqXCy5YIDWNzUb6jJ4sQa+3JdGyHrjpMCIBY4QUD1byUs6xpw9jZvY19mhECiMRZh0cAH4h vMsW5Cj8+/5wIbqCUTyYraRIA0rheY52uc7siRkZ5PdMsT5V6gHOUQH2o1eAGU2tMeyaGAGl3d5Z YbMLC2Y7kj7WzMQpd2ISn5qysJ3KpW5EqaInJNrMVK3u7JMxI72wTi5UNw5OS3VkMy88ArTqm4mY 0x70dvh9QKuG677wr9n7M4iEfWq7eEL0AJq6F0e0n8UATYFgR6rIbMxV9SC1CGMbs1+fbPx96tm8 /r4+MYEhN7aTuvupUy1cIwXJzczC0iBNiBnZ5DKCIxmjHkpTTaIEzbyS2uVsXssK4yB3iBv1CFRH c7P07FBzMyOJogbV7MzIAGNmF4aZydExA5f0ATOf+Mpk0xPN2DvWHS8krxbEyPyXFul5IOkez5rk TyNfYb90CkE+6ddO0U/BMTQjTrSVSAR7tUk4hpKCL4wiibM0pviVgllbhXTDlgcYH7JqhGgw9u/l 8G5RbfLfwq4JqMIf+DiJK93McthGQCqOybKp7S4NPTMrywdm5kJeIPMzmyfjYlYPNsgtWbqVbQG+ aU0J6QUexDa4FI9r+P2l1KgJfWknJMJ7ybl/lqqIi7Bv+x1QOd6iknZt6XwvOn2nun03q21+GDz7 foMxwJD64o7EG06IQ8lBoBLi2CBdmGTj/OBJEjCEIk8XFHLpFT5NKucrGxD8TE4yvN559C2tInCZ +HkYuig2A+Ylw4fSnUWtJRw+rjf0RptzufUZuHDEVz9ys7/pdloXaeDcCFcB/WLhyW4FupvsuOYK ryoyvA73dt0LXm+h3K8cyV0b9dIGDZpN/yl4kSsb2v3HpiTnsMmXpQM1F4cZpay5qfLjnv/gd+Bv 7IPmSuk17P1liuFpUq3EjOzmmll3tShjajuBaqpfC2zG4EFfpGDiFGIK0+zvqfgFnXkzvjzVuFn8 O9p4XFn12frbnjJmB7HIsE8KTxrSeh4LVX7wfqpwgAexyGKmxAco5HjkyW8zQCFgZ9utj4vPe3sf zwciv9xLwaTu8Sj8gclqhhnpW69sJjAzawkrIFFhzHn1SMT7ldpfRMtt4fcZufMjUK6qnC+mws1I OOSK3DMHYGJmsUnLjYP0lYBZeZoAyR7spX8gqdCQSF4EpphxFBLs6cFIWszpLOjdm/nwJcTZ56Y6 eLOFuR7Ky604C/jnTZx73rDxgWQLG+EnaRavzNRWHvdsaVrexIPHatgHZq9Af8DMDflIz/EshW5b zTkvozPQ79CoZirYroWfsDOhmzCxrUaLs671LWbTo4be3IvMyMYnu5so0599qdY7ZoM3Roqwpbra EoZliefxLCF1Vxy4nABDJNuKAg165sXCqspmKo7iVpl1JOZ+K3E7hCrZEsKwrCd4D/YFZLJ07BT7 I3qBLXF75ChAWuI0hRzXQe8J4cKzwx3HD5hJ+rfUl24Z6UKlF/cikedupDHNAvOpFBzzL2HyWlSg LgVGH6DAtVxCcJwqkt8pyPwBvQ+OPzzv5yYhVYew5epFS8kWxFPUJLHpXnsJISSD7L4We6dPthjv nO2jLMgWT7NVnaUYvE5WYomkXFGZ/MCwfhCF2WJtVmIhXe+OFEAFR0rCK1XutuCv20NSVmLJA7il gm0F+UpCX6Dut/de0qZv3C4t/ETJfr3FlC2S370pCUOPNQvBVQ6XyrB98fieLDatoNKIG+2Ci6zr VJIi4Lo2ZLIE708fnQpb61rfLevAZVMkncRY9ktl6ABVXWpdgrG6dqpjVGelGzuPlNYSbeJIwrAC smQ1OLof+Lx3EjmsG/AzRbcFIVLW+8ZOR1yV7CER2wGqbavOHkqLXlCRKejaStnVeXkGetnfKD7/ M6Ik9vRAPu4XzfnG4lwy2+AXjhfmRoSv63KCzFw4M/pxNQtUHk98+/N/vOb1/Pm/ttsziTj4syOK Rb9gJopj6HQzkPtsSjnEB726+GBGpjXd/JAKlT11y1SaVv+8sa5bV/mToB3zE4uEWo5VFgUyurHW Up31ih8cQo2c9Yo7+OD9Ply8ZOJzUC8FpgkQtQE60wvJ/mXzQrgymPD1G0NVfTDa8Z8qTAS0lbDk Lw8cCuCrX5HYQx3z1cUwvXRAWWeC3GcyeK1kWF13402XKsoSHnN1arX0JbVaa2yYdCtFXeNdFIzZ yOzrl3JJUcr67QZs+Rcss64izoyAl3c3gMydKefo+TQaCdxO1qD5uZnjy7gfubYNGrg5kN9vqExX iv+ZeRCGuOGfKHgJDOPAcu3S4QxsIq4dvBC1tJlqrlX72Qw/jH/NIvxU27HNVIc1u3jep0/F+6q4 EiTQvC9Kc095jvuJsCGM0IIyDV9Q0czsybZL5f77PkEoqfejxEeLhmCbgp77xqp4nxcm7ABoaoB5 Ke0XzNxad4peqvHIgxvC2EnpsT43ZaRcuBo4jko6K1pMwng5TuKcMrO+I3VLHrWHLsHNzSh/rqjX cKvR+foOzelcbzfw2h7ur5h/D9GKy8Va0BOISbHzaiuHip4ADtAOXRm2Q2zhYXZgJHCng35bMl7b GwD0aKuvMallNikW3l/g9W1b2aaQd9urL79gztBf/Kqm0NCwRBCjuohP57pJxvqe2ckZDWv4MSUv eDBZvaDyrPCQPgZIBs+ZrJKVfSnX2e/l8o3XO9V/QSRDLhuSkJaHUQ/jtl4v/4kdkg5rH7iz9Iy9 ZK9YAqJpXvMnTziAk++P9mdub54Xqzh0PM75BTPd+Rnz/ICZPvYMsc0wMt5FD7sZZ7TXh9EyazHp SW4GZ0eXtBWOMm5llqepLJcsMQP3zB3Oq/W+Z/ZwJiX/ENva9IMzbGTEmle7sj0qReYkyvLZPNyg gaMwI/o9ZsRvf2AAxmRTrAKe+WfYwN59mzfiLEM7610O9d6vZA4dYmJaov+2ckBn4ikbJW2OlboI 2QhuPyexAhJl+xtlfkTf1FDxcWV9xW8YIf+WB+bXHpYMyOI7RaBycnOzeU0mdsUUmw9hM/HmOmib Iqj9XjAztK07GviwihZ3N1EOL2lj7KhD/MSSZV/W9WNLTMhbIU3cOKMn8WH7uDo3dhXTqQ4YRqAR Cb2/m6UetKmGV98iOMBBtypT6ngJbFDxrAIPHkfXkemUNzHZed2TJHuKgLyLisgnwFjLNe614cET H+VKC4pPMPuZLG2x9fdHviK9SpvA4mmIZhi3KQaX+LvpBlXlfQBbdmnMh4cRyGpcIYpfzdHB5XNl gcYbpz9gbgrCB3D5xsq6KAxI2TJXrqLYkZK7ThyKCOFEX0gYmUY/Oqap1xaL62YeVYmpkIPyuWR7 PR6lmYlNVHt09aRTQCpfk3LUh0viznoV2tTS5NSnfDX8akbSsk32LPtXyd24JrMuD/8h9gJ7FFgD I9Ki/xbXMjmSyhauY0NlC89AfXvSwLG7BIl7rKhfNGvkpIUZatkdogtwFp9F5AQZobKC2KP+5zc3 1ZPjoVMhzRIzgD21dJuY0UckOzgASVlNfnYlQRHlF5yy/Qf4s1icziTPbIIh9bggriXvf7+p6Ui8 NC75eeNnw/bXFWc4XRjFQMjktwbv1LGnsTasO1qVeHSZjyM4SGcV242PIANJa2sbMa5EOsVMSKSP VHW1nidiX1LKfByFKZBr+eEUh+QJH2ogsCsVi9RkiT2iQ4R6E9kMx2b81AMKEHOYyg== a1YaWZdFbKj7+mx+M1rk+2//H157G8v45sceYBSm2nz8hpmFpaSqNPlYpYq/96QgfospKTMuRouM AN24YVSTqPFP4pMZOn+G9Lq7tzP8CF5OcHaM6IKKP8/iMt4tuWTT6yt6M0uFnnHviFO+RQ/IpsyV Gw2PVuM9xTsf8oXMCCGTkQUk57mdj5xU8IOOKLTGAEXcxKydjKvvffQraeNAevL3ktE6NXiMzhkV nKEO9UsKeFyKtWbujFtSVWxkam2K+Wkkm/8UmdJoihnmX0RaNJJ2fkYoiXl1Dkr6QefvppMp6tcm VhTkdHGvoTrZVaF24+b8RVw1mjLsU5RHZjxMj1CH1+WYOaekdbS3gGYpy98M8tTWzI+QS9oSigx5 qi3LGGAIX7aSCnVcenUPEhkjdXpm8h0Ze24hrkZS10M4i6mO6eT0tVfFNtWxBM2dFx3fWDrXVPR0 tezKQia75o0tuTBy3DbUH/yaoNKwKbs4snVkqytrLH3MOwqhnNdVroJKtZQvzc0mrfES/mRHFM2/ J99y6qrZl4+s9RaPlKmNP5xVlhOGKD7MYYEiWLL3dgiYYQaTLm6f2qVWtKKGN4k26mQQ7is5gbdg 7ygYcgZXrNPFVJ6U0Yh2aCbj21YYZjcxWXUkFZ8ZkSHfNxf2lnLLDtofjss2oiyxXmymO2IBnOJb un9coPO5iiXMtM4iktzs4jWOVpS5982s9iieTo/WqFtRPt+SUDN60Mpik8d2HOAET5UNQA7JpN49 SQ5nLQEPnOdsMZ9VpdcT6RlyNSIlNoo4zSeEDGIIumggr3CjJ2r+oC8ESWgjO6DbBJ0DixDw4dm8 pGf/6cmgW8DMeAK7UbaYvcnzuURsBV90plspzlKGfT7sV7EB6CA+zEOZiqxCmPkQ/OfBjMiHERuO iyi3ElX5SYbXzIvzn6pQ5CO0GAcdauZOPlRMF6NTi8640OxV672RaDaKEbN9dNbLyG4mM0qe9pG+ h7nfQV/u15584albiz3NLsVWfSRfbStDQuzJzWHXoux3AtEB4+G1VL01dlHgJc4laeADsLAvUtt+ GekmmvEwNPPEbgzQtaVs6XvYbaFrZ0tCfKa0xr4yzmZWpkM8yuYyEH9Gtt+qolaoy+qNI3m57wdb AyK4iQfCM8RNKVSqQqbum9i6BSHZFkyNg5K9ZiWNWdVesJJlMTWVVmD99LSR3J6q8RgTq3JYm1S5 WQJcF3tNkrEyi0a2zZa1I2A+XkZ2SU2RfkwpKpvjp7TQTHzIkGiAMWNKkVHb5Ft4yrj1iAkJfxdx q7FsETvrpQ5xoala9kgrwgapX/CgTui2WDFnfdH4TAUSyWjIqNeUBvbIFqNeqehDTropTdrMfjq9 JTVp6b+tooaxTJAZ/Z58j6uYWS4BXPbnOYfk+QRaMFJC+JT70rRd1rpGhAdW/hKhiDtEGNLkdAYW ftK0ripZCRSAokbbJFGaxBWrKQexk5exC5y2Az+tmucSepV0X/36zgkLWsbSQZco60JdCZ8VWbcP mNOdQIuGjUCi6ave1C4/x1Pof+DGtqo4xHOsppW7FJusfqUTMz6yh/Ao2SwdzwXltDCDHN2MiHmm uOlXU/CHCjzHJQw745CXkXK5Uxws9m4WIe/XSmhKXi59fk6wyTsrIKpeVeCqdVGFmHkRBUxNxk8D iGAye2LWlfkyYsFCN5RaJkYsWIVYRorLiDubINvyeJ2ZkFgTlk8XdCNjF12Vo3LZzuhc4AAdiZB5 c3weCeNSF8c+Jw1w3cKjSHlKjWDdiGXmRoxzcWfUoVt4rsIUG1CNZbNqy66iDs1ncBVEi0rj1/PK vtgpR289V633oiZ8rtiVrdy2IwGalfHYKkrgziAx5AzaVnKFi65cr5yMmmZcjHP9c+WeyPaqrN3Y Rnn4wClAaT+1svbUk2qUmK0RaDnu9plN4foyI9QDPhlZaYPkMMdlenyolmAMpmpt2eIPZTVkRFKI f58ld0loHAFDZ5J9v51uV7V2F7V9Pu5s/KI1mbwbidtSvvWySawqH/qXS7v+/NGQk0xqySCQSrFv kzIUx7/6O/tPJhwM0YKR821dMrQjNYYtFcw8Kgn7TLl4sDVPD9OsnUkwQPNdfbmopSow3O+/DxfC RlAy2jIqnBdd36F8hE+hsycJb7k1qdCMi8CydQFtxwVje/s1gIZaNkdD/vwXzE0a7qSVbU3+yg6k lhnrBQFO9oxmPu2AB84ItTUVV/Z9H4Tin4umtYGFwM1Mgtmog64JBdRaVT/DZo07zNQx3YHSiB8b wmZscK28P4Ofejjs4DSGoz71cAiYPeE1fdAMvOu5Egs2SGNFyTflj+/HxhvpCgvJP/SL5iWWHDiL zlZBVuMDPBtpIXcI9hA3RuGwLVmbMF4Ca5VanF8mABiidd8MahC4s+QwxKtDE8qP0XY5hQYrpBUx I2H7JcoK346L52+VMGiNtkCi+KPwIJ60FqSvtRyC2DZI4eEriqwYl3Yb2Fb9rjuzpsZcIxFY5ptS 4uZman+f2IdmTIQjOKU441RZoOy2Sw+SkpDiD1Y+bBQ0mFL9sHGr6AePypLszX3ueil4gF1pgZXs 94lxuSH0iGBf+M2+6JV6voAJers6hJSHd0Wk9fMYfBxdHCxPRM6/YGbIDYEkieRVch4l9fn7IDk6 4V8lvsN/YfTfmL8Mkg8G1JBW6bW4mQ8GvccDqrR8BAh2xxPH/8f3g3DuRR/ZDiwmFwqTkzuCAZa1 6V5vNuF4Wfvhzoui9tuo/JKm6mYlMP6/kGMFF7Z9ugbaYvaasIfn1kycanMrF2nr+9i8x0b8vqWB DEDyC2Zg4m0NLdSaGpFSI/WdTFQyqkTjpiz/3QCQuBpJ5f4+Az4PawgQRs9AD3we7FrMpomx9FBX aokuMZqu8FOZtKYK7iLRqw262FREUr73CfyLM5sC7V8zI9OouvO+KT0onV5UKQK9jo9KJAqzuL+f 2hGh1Yqz5BfMJI1F48CHrmb+SFvWEfmQQNlWpz3sx8iGhnHU/WEwxsHyLfXWEjBpxsq+NcduqqZ7 CMrWHR81HE0l694LvRpAJVWG6/5jKq6hgWUkEHVGoMABCCGfqSN5RH+01Kjx/mgTIDHFR+67PQES JdlFCQMYrMA63SbSQYOg3HaugH0O5XNSuGBQjLed1MEadDE+sfNPw+YtmCWSMMhd3LIf7f0OeGtv I/+CmWSkR30oU9KTl5qAq4mRIbVKQMSu3WTcVF1hMO94Ma9+d2/8CAGvshT6c22X4HIazyU6ZWUx pMafaKP/+H4Q7ItzXfyE+YnPxWyeswsGpmomMeqhg2ZpTUl51J5SUKDacsbbhxI82EGNnBB4qPff /0NvpD1M2FSB7O0xDaErjp69QKJtdgqpsddgXjg+u3YJYwl3y1/zESQIJay3CXCt7Nv75Vl85UpT P2Qa1G+QppJh8su4qdl+qbndopuF6mZb2drkY3ybwAVgKkTC10dfZ+4nTfWuISaweUu0fRmBi6QT lmSLynbuXzADVDnEJG5KeZ3nocSXOhFMVprZT363PKxPRGhxLeCqI5VWbTdodOpWvT58fJ52Ji8m 9U/3jcfBZ1MT+HwD+d1/GZirDCwnLq4+uPtMVb5YRba9J7I5bixdM4O21UiNHx+10gh53e9u7Z+R feo6vhOOZkkpdfVK9+AR+mPxQfw+rcb2IPV2u3GzDq2U6dsEfmrP4D0jguCegQQn3SYKqHHrKVHj jCU8Yg91b6pKQC3au8dzKXzMzbbWIZ3wKZleB0lWlljQHucoyyc3oy/TvZqUKjlQvbjAPp5UFEyB e7s6inumX6LKsau1cFMMkhrvLVsS40Ad8P3X+KLFcubCKHrRv/k9o61xP8uvHlSSSBEVAr/fx+UP Jksm0L+/YC4ELrAiei53kSzrlvsTzckQb6WlD0XP0MFV/J7X/Pb3ObFkYStRLf4Fc0MFFcXpD169 SPSa2K/3Qfi6N+kHPh113mOjx6S4w7pJpIwjqsVQhSBDvMNOPr4f+0O3BI7zAZZRtiQCTWeRW2GL HUAmtqYfvljoWY8n21vtgdQHV7ZUrJix6t1MCSw183mE3qXPAxDAE67Xz+/nips4Se8HoYlfMKfm DI9N4+7sJBOn1sppqhmW8J/9B80s2Qb1T3fhMjN4si72SrWX1GczqtJHuixWOI6u6mRWLSoz+BDM ZpBW1Ypg1JNOheDTJBxsOZmgwDUK1eSWBuLpVDUkligh/8QEiIoscdiHkR1eQH7EqKyIlKvbx8wp ugvBxlNVlyqRQfkRfLODYuGZYbPuetHSi/gACiuxL6FyYHzmwVjt1PwXdTmqc+1Q4+w8l+JNzUHR 2OAE+Cc77qecXGaUjngH3SnnDQzJOT+SrjsCn9AD/ZCZLPyFD/FhJsg/4UbW3lW4f6bIqD2Yhzpx LKeeSpx624pWbBXF6mx3LteujY5739w7iWxxtLuI1OCnkJuCtx3+xGcD/Wk8hA9+Y4qNDGItq4QX CnBFRw2vdrv8xHo8/JhBF6VDD+hpHgI/gglXZwh51k8nys8moNPTWG8lweelnA+aNx8jkdZn0mNw Dz/wYUdE4e0ko5GZhzjQvewDo9QjxGAxmVnwGczkZ0EhDpEHKVtf8QGm22oXw0thNEN6u6SSNfmK UZK2leRDheANuxZJqHao+ej8LlUi3Oz1doYXUciPyK+akZnQQo/ApxV368590wQo8FOoXeZ/Ly11 L8PBiE//Eh1w4txDMaBJ1tMibEAJLqowphoD66ZuJYU9uyac4veQEfmJaodzFxdSuHsfHAdgZzz8 MBLPpD49U+UHDtIOUadAQhh3cOWedtSrfBKH/wQrCpln5iZBOBQKTkq4SrnorEjox2zVR2HmSllq r75xgTP5XQRsP0AkxBDkF0+qpnIp49kXkm9ns3HkDAFnnzgpwwisn6vsVH6lPFse9yx/4u9Zf9aL MGMqApHXwea1qOQ7xa3dFRbciW3bqxo1dohZsp1qFh7biMXenQF4b+9n4S/ul9JkY5bLjjJJBbHP 49RL0m2v3G/blKocyvg+aL1/6zeH8T/jk0IjETM2v/7mDjL1rVewhBqZs9RFQW/xPiofRKHqtO0W Bf688c1P7q/sNznQS7m3KxfzCLI3z7Mk3TzoT3xvrMk3XwK2dCW/jJhG6g4jPQW0aLk4UCqnfJ4s fT7JlPh5ghjPrOGKX6KZ5+Hq84Bp0fibY/13d3EkDomOkfOQftt+jIRIX+f1U/PlrnWu2pHNDZxj J3xQuRFq5/QN/eP7Qfg0GtUgO/R4ftGBRc/9CTUaOIpEZqGByoiVKuFaU9jU47TcgHYx5jqporXB 1vjNz//UvPA1D2yfmtc5KAxdO3BTBqPGzv/x/SAf+G6M4qRiB/Lo7RfNKsmIg3xeInhkDS7ZP/1c LM0lc1IPE3Y+6qKgCAD938wgP+lxhg6pxak15hX8mOvkXEvJuAbauco8on0ha1Ydvg== S+GdD8s9AXlyl7oiPXxjdcOslvuhmWS8RdzDRnM3tWsOOABNUuklemBjEv2qj5JZ0tjgp4Qlo4Th zPHKZydjpvGmL3qYnsgiKd85vAvJq/nVu3BjOiCqH5ebDDJxs0k+Clk0EEY+9PQdJBnDHjFsoz82 rqWURmHbhxmvoir52JwwUiJBhfSW85IuQl3AjEQ5lZtxcorWXlGYDxCxsx21G6thvv7s4bk+z7VO N105x3qJMFL6zV6VoZkSZSeGwzOXhDaZjY0dUX6X+9R8bXjFtk73IZmj52fjvCeL4LwUUdWMZ2YS exSm8Zy3EY17D0sQ335XmO1DTRZU9mzlsa3poXrcN99fAjOmQmqni/9F86C4oHI4bl7U9EQY4Ub0 +zxBD/btuPmD8Pjt/li6MSJVFikNsQeNWruaKF+DrvCb/f30SO6di8V/UMF9K5wzKUdLlra+mRy2 1qcKxFcCEcRZd8m/Yqt62lUDOAHKdaJ5AF2ehDr5XQPT8lARzwcoFN2EkFqwz1JpRzl5H+AQ/AbU pf/YpPoP+i2cK7/zS6wEo31zYzxMjpgvS/RZ/IIZ+SKGO9w9yKVREtf0zSA5+pdhODqJt+7XbWbh L4ID023oGS1B5B5Ginh8inC+mXS81nLBEpzU6xfMbKBWosvoex8lxRoIcZ/nFmw3UeGf34+bP8jG 4gsy42Y53YNC6N8OE+aZ6uRgSn8ZIa7oebg4Ft5/7qee/5cHzXmwSUXCrG7UgYNA0H+uS+B85X1/ dx/fvdZ/RtCFVjBLdy60QpxJdNN4bidwxt+GeREnY2MEAN2zozszHp+H5k9uyrYZ4iVdsC28yCPd +yPqpPFk1mSrZIYeqZ8cIOj3RyoF249F6W/oNPhmBnwpJZDqr//QAiTzC2akmkZTDdRoYUMCZ7Qk Ui5MKlnL705eWrTWjUqqdlcsQlPXJVsFr8SNV3bzkPtgQPAGA0SmykZFXCs5sFF5Z5zrgPnSFgLV 1KiZ1DqRv40JkFnXnljWAxVvb0bmI7Vyf/dyDmOpkfusPZcQHxnX8WvxLfvapHhpPmlFt1plo4Rn boI+dbi8kmwe1A7Q1vMd8A56YN7xvrFketS8v10EjB1E+jtQK//FW6vu5RkG7rnUnCqMC6SC/sA2 jckiq/K0TQ1SnIeJdrs03/iXCXDdNhW4VzQy/6JfLIgRD14TKRIZL3UPSr9IqZ+mbbup8X0lGt4d nCViVSoKtYsA0PMo304sZ6xWmr0Ui/zm1+jdLHZVhi6UmHcDe/910OvhiLTd66X8tQSBjYw6yCdy 0at/cxMwT1KegsAujOTmGSli9WUGP+XUPOkYl0qnRilVC10gY/FUJqZ7Ya7YVX2U+HO2ZPoUZAi6 TpEqefWMkt5nQNrS51J69ODzF8zpaorSyM2SeUfrrOswTOKTwUb6Nip/rl+0z5b8+EVrIzUw5ZFq v7l6o6HEjUs4cvItfrk20iQxqsi1IrH0PoE/cmKfB46ZDYnCb7b7hHIH+agZj9Qk/tpX6GHmzHBU 9EeGqIhoAp6RmiDsnNih54s5NNIoodnu2wfxz3/6uz/9F//6v93/y3/z13/8N//hP/2f/9v/+A// 8T/+03/4axj/zT/9r//7Xz+Z/8u/++tf/+HXP/3jn93655f5z/W/+lP5879+/e/f/ec//afX/3v+ XPz//t3/9fqX/+71D//Hy/Sf/9z//N//+d//z+XP/2hX/k8+c99Ih9UTYru0W4nQEdaPz9a+khsG oidvFv3lX1+/8z/8yZOXr4/lz/YPdssWvW7rS9A0/wE/sov4ywjHs58ebLdlF42rw5DCgXnGa5I7 sVv+yvjE2W5RM8e9xZb79vs4WOpWpfQEZP0XzWrDSHX3aj7RYfOBHdYf3w/CLhErnpLgzWuBv2Bu 4xBeCxBYTRWlI+byannSggGS1K8ehu82j8HeiGqlu4mm8MZGiupJI1jZBdacOgDZwA1KivfpsqHj Ea3ejkDgF8yrNfZPI13ejHqRPaAeFcSV1ATbF47MzINvRZ0xZhQNPRxPMy4SZlJLyayzcpMiYUl7 LtA3m9be7yBv7fPAvLPWuMeQ+ua63aWE8m8n9tnKBZECO9DS+QVzEy+Fawp+wNx7o7YFu26qOrYX O9daVS/QCl3s7AV68B3rJVtpnxQWbA59n1e28qAc6Y33z9aEcx9P6KY3NXFstnLaLIooUIE9fh/3 p55Q34LsL4ZFv//B13ajPTuKB27s+DrI1mV3uNiynXwvdm0hX8tuesRTTCWTK+htYjljHu6RBOeE X64djw20iNsq1AlByWC78jDtLxZIW0Gbxycx0La0l1QXaPz6+z+1+cwzAeHzI5GbD5q8DfUoOKVt CJ2sGkmR4FsV+S9Ij9UskUdmD0Aj3n8t+/USguVhFxv2XHQhluEc7Pkb4t4k57UZJ5fKeNi0aw17 lZ+YF5PYsMeofzOr7nMQbwxr9e8Tyxl/+UHOGD0pXi1hSdeuPnIFAH9p/eIC8C6v39yIPrJBPZJx 5tIS6pEa93W8tzrgnkWqF+8y/fh+EO4582KidAreGN0YoNjpbliuD1z8cohAGOAV04/vx8jBT2ef tjce/oJZkkBQbi1tSYRyhSuKv98ULUkS+WZ0DWr/blGsas49r1Z1DpqNEVuIoOYt7oTthbCkD/pQ s4u0pu83wJey9B+wZn7BvLvIQJAraeviAYBa0N+Y2mpcdqCUbFk+sDgr0MXvE+DMrN8gaTF31Qsd XVsk91nD8cq3hqvRRvQQxjcyialrQ83EO0DDHzQ/Q2YN8Yq7yHkEOuj3ieWM5+CG6hjlX3/7B628 yY8H3aqml9bI1xWJdjeqMXZO8Bv5peTRIDdOc1rO+Tbol3nlhHOz93QBJ0zSHAn/+V2XPJp2/d2j 4LVknNGp4KNiamTSeZ/B1VwL7aHzl2s3ZXXuRMIMGxzy/EfI8OZqoNjnVT6KVumD3YOgMLv2HBIH gdH86+//oSfWHpaXfd/Vptm6KImyq5pL+2QXuEUW/DWi3ezKwp07aQHff+0jX9zpZDCa17fxdj2u 7geu8XPYrfk+yIf2hHrop3nignsC40ZC5e3jlwSdXrR95mQMSvSNbxQKWELvzscshRQv53BLefaR kRBOMw9KV63ZuX0UfaGjak/6cgM/tY9THWMHETv38YF3Yh/Ywo75Gu7r52UQpE71LLVNmPkhecy1 5fLx7vBlv50AZ3ZujSK1OznWVHgEgIDa+RT6YXM+6mHZQZ73EwOsRWWt+9pFTnAnX6NRH22+treJ 5Sp5BumzHSDCZ8lqU/LBtSlWlh3HD4y6t111KBrhB73rPRfXVJIhQxvyb6wTtr27sANXRKFy2jm0 fbkBvgtjRJcaqp1Yv2gGBYxyRWZMfUoS+LUd1MphFKOcmU+mhXC0W4qJBGPsR3ufQS7gsVMGquVD TzeanGxmXPKYgZcz40zmR8VQVnhZ+EF2b7ixsN0YSMD3GfyLU3u9Q54blV/BauQiJHHi75fDyw3k Z8QvYF4Ehcyo/I2Pc/AxTHJ5zCtynUXT+v7WuhPzsQ5R1AVfyDLrpZ/ObwtiItY9FM1AjvmovHCR grKpsdSbpSYu7VMsdkBT/41v+5AbgyivT0aIw5ee2rTnIipwNAyZyxUBnkAQ7WCkWLCxEaIEqRr/ HpxXV9jkaJoFbgA2RDtaceIozD7TLvFs5z7kpa9nBRtZPLylfKCRIlWc3t/AB81RgRgCWBSvmbL8 xxaC9zeb+3HRAnGMJPeAUxmaOn74g1cfZoMWSLa8S+XRGoNfcS412exvcKQfVznboc04RD/GeO63 23RR6smBkR/f38aH9rjXYcm9kzQibYsi6gRkKozkLD5Em8QOJdLNZ2iHe0VwWL1EljZTWK8M2ejx WDD6yfngAHQosnPZYokyuaSZb9kibbI7I0NUczgTX9BTeFBQ4GcHKejfdFPIqHWd5VsA7msP+f0u X5h3H8GP5zbGm6Qfs+dyGMN7Jzj//lFi78pc3OYJWkI38gjzbezvee1kuockf2Ycj2KZ2vVupPEt OgA3K7aYQ7/FBzPn1n3phwwhm49AFQm6Pvv6HJyf7H0Z5s/3TtnthXZsu3Qy1rhezG8m8JorjwLy JG1FD1fa7u0J5gC6lufDlsr6l1fw7Vv8dqOw7YE3IT9mX3yCvpS/+0CvtM1hn6Yj8RmB4AA381Dq 5yHRKhsT3bhxoc+AkRGYt0YRHYIZdyMtLLOwbxPIme3TsPGnYJCZ4zwZ6p7wvNgh9YbcJovkslNZ e2NngujzAKhu2Y+NHOD7exvPYEMvV16nBKGz0pBJC26UZfdWpuBmY5OwV/MU3VWdidxUxhVLriFb J8XTTA6soQJ8CZBgGIHG9Pzk4LS+PNjb5RrIkV05LxG02AlcyHvZnKaC97GIonHffOHqKm6adJts JuT4moy1Paxe8qU+z+KKaTaT0anc9SmmKcTCujOh/enizXob5ENO2ZS27lS1xsyN21R9CLQ2B6Lz G/PUwcf3g2D0bSjR8M1aUKgHkZ14CYwcv1KU5WUuY8BMYZk9mPw34wj37H1cqu41Jm/tP3TC+80M tEsLEPcHzPAXDDAEkcGmruqm0tr7sEnX8npV3PhUtJsptrsDahtGhiN2FJOkvE9ucM8QubN5ZEwc jmjt5rA6AEFrMotQ1fZqN5UuvsyLrchGpLzgAnq38i+aKykPpI3ZYmGFu3ixxC564Wzucmshtox8 2KsGrWo2qP8AtSgX/xlJy3lWA1TfSf8w6CB+ny1B7zeQd4by5wC1Ne8MZRDHZC0kxo03NXwRQ1Vh izDe1N0BXuL2/T5udmacxZVyVH2yRsw9gR6SUpi1swaFn1vZLAQVRINAUZ38bVSGT1vEh3duw1Nd hfEpehNdQmkpnxPpXXdGFckWPvq+bylBnAE9RU3SWXyfwU995skFnGWb3a8oGdB+MzIcPqKAM2Nh 9vGRMJeNK95xVlbN2ESVT13gtxnwqZ2roOg3/QvmPTe/JNB5mLEp/kfUaCfQKffe9hMDMGG/tU14 zZxZCC/7/Y3HbtdWla8Of2zKY6zIwr7fAmFJi929to0+yF+6GTRfLVxfGBexkfCd3RgNTmack2Dr xY3Kt+fBSycvRZD7zQQumFBnVbWSNc7MLxeEgdET/arVIOqZ3600jkZyeetLI0wIH21G5f73W3HN LsIZfZ4AUs/duuUnUzQsUb+sU0lRIIL8UsFAGgg+3v7+57ejfujXXvs1vBOP4vlzyMM5b0zlz11S DcjGdMnLuv8gaTdjRDyb1xZO7XWYsdK6kDJ4m8EfYlH0Nx77KJv5zLrIwBD9gGEblbZB0kY6eTD+ 5N83/T3yTMG3yGtXFwnjp9//qUeWbrzXkvSGlCMfyIB1Y9omJGggdWNGlfm7ND7MPLqu3bw2vzf2 x7/PIKc2izjXn5JTG8qqkq/fjIVZB6pgd+uC4ByShtXMnUGps7rzWoHUGv/+ywQ4sw== rnruTni+S67mfoTWTFurS2A90CH//qHtKqrEwTu7YXlavL/5LBYT1r12rsjTGSuShfD9Bv4QKhSJ uOH9tgKFgkd0VHKyuPGZOL2JFzRj9Rszo1q7DOk5YfX6N4xImdUbVPr598kV1IWabyGn8EvmMmh+ KL1Q5wQEneSEUx00o11s+37t4rXtIc1TXXFnjZ3gUyQlbitP/v3neSXXFcSzB9jhOeFZHzwJstvO jBWb2j9//4N9i5xFKmPvP+ds0f9Jst+GI6h0syfFHfZWKrMKybJdDXnHtSSd2nbOxwbUAxMSLoOr RcNbIyvT9vQ2XTiAfLakPNkYwL7h5zx41qOFEpqNujtg3tSg3uILMpfOGhU4AOiJfLZ0OE/iYLqo Fq0T+EzeGXZGI/jQbCe76MKD3DhsWSU0b1EnMNrw3MgncEoSp0Cw3R0Ate9GTnH07Dew873iwapT x3t6nwO3lgKfRwhzc1bZcWHf0cQSdEUKNuivWoCKTyVO78XnbTE7YkZkpJsUisz4HDyspAM95mUu vLCKNNkxp2BgBaNjwIykYGuRLtHEBr9ZcrbbAJ3rF66KX7kWZuAdDaQuYL9NCzgqGRFGLgR2TFsv 5ODDIfXAMERk41vkWrYB8DE0VR2PoWsaVp2DbsLY+sNRuzgVTLi5cy0jYWr9PpFwHU18Vmcyg+kc r9edgVPZX+WTvBCj83lV3hczX+0mofCeI7xdNMs6K0RgNjzMWrqvyH9Ym4xyqMayEvwcZkbayhqc BsNxz06EEfhQj9EvGoxSuCG2g7YNFS1tADT6WGWdO4fjNfj3oD3xDbWwx2pdGQjvBacZJTWbrpBS 1smE51hDoTGufe2QWKNMdzjpB/3060U4DgWPzIFjpB4pUay7tkvrSRlaTeRYOtLssq+EwLhzyCbp iRSQN2w6z/dXfYiPt3Wn13PoN9gCieDRO3O0bhFHmREifn4gdJ7ERX5kI2AoiFY21zj5nKAAhsB4 JysMZN58X2K/0HpiW61BIh4XrsM+KqlFmRnoL3uRD5pvKiXdfQ/dbLdnobFlrcT5dgKXzn0tBihj ctUEpsyMGVctNjxVYWxasIeyM79NDlB2w9/nmQmxcKf1qNz+pDoUfczsOhP63DvzkYXVIeL9OIfN ZI41ZJ8QP33P3f+BAaC562qbPR7tvTOjsGNGFJL9wW42iJlIZeEAiAGdWuDhS2hsVEKya/h9y3MD fMBebSzuuAF6DU5Y8L3nhvnjy68h4oBBBzcZZDuCBWEhJQaaSMw/mjwtgiHjUae8ovujaP/vzLly L+AAyNDatdl8bzxXXF1wMXzczeQVYHpmRMA7GnmMf0RDPYLKys/ejC3Kc/bVyQZCVrqI/HuwxniT XiE1AmKbaxmaGGyjd7hRYHCaAG706K8ukwpv5hs+g0bu/o+0PowU4al8rPNgCXmedPC9NNiQE/r0 WhdFK/yYiK4r+/ncdetD4z6cfe1bf9/6Jm9hBIJO1FC39qbo7ypWGC5YQE5xHwNs8ob5W/UrD5sb 7Oe50m0jJ+mniit27euRI0Q+52HnNrUHq9omj+Un+K3Sh/H+cTWkin7G2oyfvpnQnJiCKWdMNZQG 78FTmJbjNvgTAwADZu8aXBXW9b05APB/Zlx9MaR6GhudjZOQ15IYw5rBB7dir/aF8bXTc/2S19XN UeL2Hyts7bb9ka/hBFu/d8ltrhduDtbPPx5tOCN77w4cMQQ+ZEZAjdq9iHg2Q0yvCupMZQOpgwF5 xRh2XvHXTMKFKemCBnpny5694haMcMhp8E1KLcxtMAJkwPqs60ACssiMLIi11Fx28+IEIOjnoz7K d6Ox97HmSS7bzVjezOi0ogPxAfN+Foew6miYrfFqMKyshTc8FVoBlmBX8sNvsR3+xABtHgzQsGwO 0xn0uSzTZ3wSle+cup1mBk7yfmeHnUW2GNGi+jJu+c4X48RRt28jIaONWvSZgaTYZyB3dk+S1dRy +dl2prEDc8gdRSvDU50r9fZ9zdjkxtVguoxhm1yTyv6xMDM8q3q2tVFmyzMa4dvUpoprvc612lXB qc4/hb9/GufVohm7ZsxXI1WTuVmeKpDbtdZHP/njsIw0uxmXvv5GwKGbcd4/zJg9dSoMKySAMyOJ Sk40bccAk8QCrKB+wEys0NHBai2CDyHMO1Ju3hfaqTZbswW0x36W137Q3AkRm5HVMWOTKCpZFn+b zMaycTwxHpgRHxHhxUO4dvGc7JS4t1XzLHbR9KDL9NW8KUKJNrBQDyJ2SDTj/qU3JskBzvVr9WSA DnfjIo4b+gLYgJTPP49+rCqV6ERy3OskQqljz7bFRcS3yP59E0Xz3Ilnj2srxZyQH8e+ymqSCI5e O3bdCXTFh/56tpsIAqzwxzbDg79HozMOhyO+tK5rW+eTYTu9HyMLL6EQbeHUNHtgXDQR2VHmlcZ4 3qGWFWeWQL27dh17gOrZj3VRl5Ak6lC4z0/jte9PhCd30pOL8Mb+kdD2wLf4wd1Yf9kUAvaTH7Xm E3364TqsxRcD4I27JJ1SXVdkZ31IAnEEssO8L0QVdgf4aMxP69Qs9hD7DziUa7L6J/6u17UPu2o3 w7X5+moO14vOvDLpK9mj7Zsx0IgYIdZMOVvm0QnnBrrajUVGNKaHkYuuVYYmwyR8WZgkFZqTXQqh 1+lBv86mzfVdM7RYydLXwbDahfKVyJvHBRI8P3I+LOTCDmgh/LxCiyqp1pOhIIkVdvS7xszgk9zT 7ZfkuJNV8dfy2wH6KPLthEpeASYgVPbWM+Iw3gtCIp/KfP2Z3Nu54Wdmv59skImokX9/cSlZWotP 16WSPxCnk1UWHXI/PFNA5Ft2rZytJp0T3RDMwYy6uUzRgHyWsY/znQEzfhbZfWxnTnqXJfejBHZW qaRGoBHTU70wp+4fBBJZkxw7pYvncpGlzpHSmJXtlTwaqL58cmM+4TIzw4Z8bwfvs2iBcMhaA9zD BGiWVYFetBxwI9pVLamWBC48MfyVMzPMziMqzARDK7t+yryYwpsWEtDtltl++KGz5cIZvbmBOYsW 8+UJOCuEKh3jWiVY2+EjyM1rWyPae5/gWo3tZ18Fhr2KVkw0P21zFrlVraK/b/xqsqXPqgbCPzD9 us/lNhDFZlUL0MaisP0TJZKl15i9rHupEe5cADQzA/KdqL1tLHnnC/ZgD9X1TnAqx88ZpQVfj0sy /gj8VZU/gHr570EcpCfOJ777hXZD1s2NjTecAtq7xwKKIu3AjzW17h6hurfFqNqR9InsKgT4IYWn GVmbTJ7ubed+o6eVyqlV6JIjXMd+rnYngVOeq5FF2Mdtmo1HJdPDSylUvRmbmzEbc1vRIyhMuVxf kw0QWXDvSd7Ubm2Q69npDfgAQpsIWudCeATdAt+7nR6NAEIpEuwi8s/sJ1rnFomBELGRAJMsKstq 61z9hY53pexE2fyaCAZeVvAWGI2K6RlRWmCFUffVEOFTiVEXAfgXZ8ZaRGh2Mn+aMgR6C22PODsF I17+OJsvpDK6Js9yuzpKaCZZ8cjNApTDBCfkxQONFOYahSbbEYoEWIaoIg57XUwzYy9dOihvgSSR GQUGMT2Uk+2Y8S2ZfEtXU0qEY2ZM/E3WmcwcqRv/cANCZgA5RVMjMj+OhXu413tASfQfeT/R4oIB FF1I0KWJ4axcNTwD9U16dZMS4vjX56EiODE6J2odRA7mfko9hqViZ0+ul3UTKtSEHj7au/dfUJxf VcJZKaK7KpGP/Fz+wARKYYsjeyXst7paepsmsNS5lq0OZq5Ez0rz/rlQEmR9WyoBM6rgAF1kAw2v 75Ho7NFaLWp03/frLxLoyl7alQSFB8KXK0Gp58KImFn0J+jUmIcNydwEwshmdqD5AkCwL3dtQ8ll TpZJrw3PpO8AnwEkLgYYStNKAsC19wLv1s+tdFU7nfFPolaEV8R3TQTD7EeuMPSd+nX4siQ7OzOM HQJwREYgZ+cfyxQWpJL+hwoqs7HNwQOgSRSwPhY/6VFLnPYNanORftJUXui+YTvkKJfMUuDLSJKq E93C8Wv3Kem+G649PGbhb00RyX/qCp/1IgRin/Z8xFZ75GnMR+f8zq6naTo+U948VNKLHI2dd1Wu OOm1zngD5QICSi7PeEsYnGolljs6Vy+BX0ukJoi6fNTGHpZeGzHXXaBbMUa7+WEfzTiV17ajfsij Ab4AvDlAzV7ESQGkWfQxb7aljCNyvx0q12FMkqXEfphZHA7k9rEBJlmOqKTzHW4c1yJ2yrb1kcmA 5NNxkU3tW/cMKElvzTmHM0hMHzmSzPiIIkXdJ34tH5h/+zCKs40ekP8Usfdu5AAZiHvQHsauKEWa 0dZxqAFYInq5ZRcY2aPgH1B8JU/JgZynifUWZp+yTXNM4st8eVUKwaJW3lNgx7SB26fEBQdgV+tW XX4kWdkRxuNlbHJuvfIVAwzd7s1KM1xnkssWQbAhglqiGiMmsgp3Y+9WAhjNjEbiFYCOGLfpkYOt 0oxVvT0rhCh/OBg0l52S+Ga2P8C4aHj3XgBi29kuO1wsmQPINfJOn6kWad2wZ+zlzEZ87fm78WWN 99+gv7de5VHHrQoZfad4/OseJwGUUzFRl4Pa0UoZfTTzojQazEyZGTqwPt1wh0zms6nFBM2ypm6p pn3fAuPnbuoTIYPHxTCEipAZ61LbpMKH3q/Wac9MfWBcigKn62PXdqbLUQl248NzwNMkHLcdnrGe A/+AuSoep0hu7xJXPmrEtwEUjfupxnHTUyYTsEFyO71fvrTGuq/vrCMRuW2xq5UyjobIHWSVoZ/m g3Jn9M2IA5BgfQu25EbFW5DudfSwmmLl03WgIj85kG7k0ke89R1amZcOXVoe/b2YpoShHl2sHZXb pZmrFsIWfHmzt4ztR7/HNGfLtBosDK3FDawhiDRjUwsUI4L+iaxtBjSx14spqx1Aj6vWPJoKOMBU 9y6R6F16V51yN2bri/0vTYwJTpCq/ECLeNHYUDtboAkVNIbVpoLH5HlhikWFITfDMhODkgtLBb9u SBR6aZ7q4gBnMZL2UuDHn3i/dL/gDNjTOhyW3UwO/aeyu3Mb/oG/35N+1iv67XyyAOsU8SCasdKL z8ycPdn6yIvmptrb9cDY4H4t4wwCDQEeW9coWXTxa9XrILR6v+gvARXwz7uQvDpxmA5CJ2fCYbOw QdsLu9Cutgj0pzsTAj6lLs37R4gj2+TYgGhU+cFr001weyJDS3I9EyCvlOgVRM527y5qc7SR2+4t xgQKbtnuPZi1zfjefmsywwvxnjAzS1J0apvq8aTULMk0bKcPUk/n7955YwiovXCE7eC1pRexhR50 lgxR4p37G59SCdoxX9xZ8EjaW5zA/K9wcmMlPTpGlxDUJaA6PBtZRmFGhezRiFnoVtqX9fCJsc/S Hf3G7PlUE9Zi5b+Qd9jP8cGaM6XbPCcqTXGerKIpMKfEisAcgHQYNb+bc0FZHQ0Sxg== J5GhpID2NrBo0neU2aArMVSLJ/udu4JtcwZNf58iwvShu9NOPJxVYRtZIirQOIlrKxnf2fNoJ6za gKJUWrq8de/9oYtWYiMPKyDknmoe8/MT/KbhJ6xIGtvLQhbVIWAsCIL2bojOktLV8fcGtOQmR+or b+rgpBgvWQ6XOCKhDooDX4TGAx1RQFnw/AviuMBcEs61d04gJakOdnSDsmgANng5SIdojC3nzMCk 66jpNLYSb7KbWK/sQnA47wAiUsll//vCDhdA3Q03WwdRIkjpmbERlCOgipnrIgqo4TMmcjfe61Np TA3zzGs6SHfjKxwMrbqoY5M02CKNznL9Em/LKy5BPcIZAwZCGDgQjkdh+EG+A6CV+ftoPjIgFYOw QbIeRylmXNQIuVK13mOopkfIwGoKqNrkwQzjOCMUzFPPjMwALXAw2UIKaeSGXsm179FhhASO2Zbx DOHv5cSYGVDLSligGWfIVSVW0UdtrA4SVWmBZH7HdEPHvvZCPa7NGrG3CnT9fbbjbGk9mnkIy80l u9TY3XT+m3E8X1Ue7Nc8tI83VkkvMCwRQcyVAtwtD6ApLzQ2KRMdfaeVYA4YW08gX+GjZn8HiHSH 0AkO75pVAwx9Ikz62VMUVwflhV/GOhl3+xfGJ7YOv4VCeSYzZ5FzVZk3k0teUmZaBQwtBLSF8XXu zmuBfcnL2AJDfs7yMs/gp3v2l7TKeK7IMDJWNAek3I2FIHGSz83ngmNDtyGu5f5p/h+pgOdzfTxU VH4ZoVtm4z4aF6TKjsel1zQt1S18J7bVWS8w6QM2QbuysrtUeDZPRzbCmYWrN3MPPVAbF9RIdm0h erg8MrKI/1zemKVJ5c5tPrGqOlINjnVcqdX8FOVZlb9FR2LYoGvp77HBNivFfVztgn+esHYyJdi1 D3rZ8O9gTfSfVqq90fW3LwFer2WvN5GSrLb9rjuxCY5XlSOxAQ4L7dzQLKW9yBxdB3utLNWu3qHn IXm5mfGJVnHiziFetBoCyzAOekGH9VH7+8l+0Nc2Fw91kuPLVizaaueyg0NXMjM2l/C5NfpYPmB+ TbTTESscYm85UhWrxejneYonZsTMhR8oe6XmZqbpOm7mUlBUQ0pL1ZFKr4vsDHOrI7uJsXgacmBr i6CDNbfa+eyjwyu73VZmIqaTHrK1ojX9PTsMqwrtE+iLuBTlyXlyEV7h4jzBU4oPcbG89Pof9wc8 QzN2QVCJvzTzmergehqLvO7vse8PABUzdm0bKOY9RIc5oHku1O3KxQBCaVabgsDP7DyyO6hyRRTY mfnRrhFevv09KD0eMhfZwxoU2FK/hl26AmAzniywPixo2zICEMRqgVXYbTkdq+qoqeFhfcAMHAc/ XZoPuB5qdKuSB6Vk70+QqHs1Nr/yId4VYeudifkP/H1ViwarG34tm4pZOH4aWxlyddtfN373gLBe ReZRxeJnxkGcuUe7HKAd9sWp+mujLuwRjOp+w1sjwIczFwYd2qrMh5vXRN6ZSjiPDyqogKrSQ7qd Xn5ujH8KoAZVu1EJN55/z26YIj5fM4pIn6W43xLnLGjcFvHRmTFI4pyjKr55/yUSV3nMxifYlWVa j1ZFOwRQ8JCzx7rpTBak/76j4wkzKL/tacW+ufq17dW1iBL4Qs9DSMJrBWkvIsjJAQzy2vB5Lmlt RjAXj2AQGOyxGBPvZu40C+ow/iJ3GD7jso7cguXmQj78c4rBqYl6TXFDPQp01rxO6cx3r2WtE9xJ 0KtsaBN1GtCrsSvVBJ7Mjktc994eiv1hkSuRXzyMiMHvdv21SCFhR0djI+nLzE6BJk5wg9E8CnaQ x7ABRIXlFKUx7ja4Ej1vQJzWlsxdkw70skw/u6XFwroOddpHUx5hbSI2rMM++jXsSnShtiVkTVLD NvlfBjlSy0sfhEdlz03uQ4ZuWuzVYM5pF72CrvVu8KjDdtNHitdm1okMfrUw5xkFbITDttjhw4fi YDB5wTr69nN17XbEfy9j0iH0kB0zIxvgWvQ1xgD1WkbMAxhIbW/cw2wy8hH0y7/3ceOQsS4E8ClU hYXoRQwjSjEeheffn17u6O0D89razvnCzBjE6zYsYK+7kcHRD7+m+2KqtVEm0IwDrfHtL3ywUsDx Y4te9G4idMDhT0I4nhxVBS3/LWbuNrzm3aKiCQ9qaVggku1S7JvbSilkDeDn+c5IxwGmmPG8Rhnz sv5SfTP8aLd1kHDRCUp6k41UQFGNn4JfgjRxv2HR47CZZSF7ol/LpnJmsfcgQ6nvBY1P4bVLFm6e emBD0VDXqb5ndJP4ABljvczcJpvKGWYsJEZjpdyQrE3UC9K82lPymC1EFD5oxk30nNhm+cY+EZz2 e4v6LjTMYtitftYufu+9VTXokdj94bBbcmj2bBH45rcE0p1rcZs4HOLle+FFUkrjnTbF+GgKOFUq NUs8+wFGFc9L8wkhffL6KrcIJ8jhY5964I19CyG99c4yVB5PtgMsdnse0EB//X0S81XtVzXoLn/B nAnZ2kkOmK6fGAcr8RijRoM9PZ+Gh5auug16OC/GjO8TIG3SuKAiom/OukgHhTqNhE5QPdSN0l0Q xLtbOpFwX3LsWg2+sczon/53E7CJgSHHKjGiqDOUFCdXK4dRut611NUOcjg2VTowY5Wz2icuaxpZ meZ23MWi2kG0xwGQ1LTaA0sehgQg+Kt0/v3nG8ilGpLwRIxKHMC7ZRaRdFCq836dzoIQ4NtmRGt4 F8X1N6PaT/6rv6NLq+S5g7tID4nmpUwzL+zIW6HOj78VgHSlpIihdiODKlL1vE/g4pHUEZn8s24m 4x4rO2YcdJPQ2PYbvp/7syU26gjrakasnu8YJ7+dFpik7F8f7kEPJbGLZ3JJpIElYDYwXuQx//sy ROnyw4nr8SYlCjUjHn6fAL9no+0gJq5KiafXC6LgFX4V0jdRQOgWd6MgLeK3f4MDsxD+CH7WILnX tQn6HDjol3mlRsZJ2WtL5Igf/2HqD3xfzZB7h4UyeHJmLGJITaG6HQ30WwzOorHvC2UWYuiMXx99 3Y/qJO/z4hO2M4KfXUr8mbkz4Ixub8c/PKQ+LguopecWozyMq8y8hGmFRoYZD6H1pdCWINHPf68e RlbxHIChtrVnEsHx5QbyzhJG4n2YvDOc7v2oS8MQH12tMtwuiyjvT2hvx9SK7chC93feRpnE0aOP /JsZJLtfE9RzURDLQFKD5H7CfFirHvsV0S3oxkYQm3OaECSF1I8rMRdu5NlCUwgK+DqBfGYgeLVl Itmz/kTHgb84Txl+cJEc5gSKvsK3MZI7c8xCvnHJePfGbiDWIIU+QQBVDAVCvNPzkDR9sRDfrmrl UsGhN2XeSsL/bA7k2ZxViK/P80p6yC8Dc/d5bb9q0COyhhRaJdTgYKykMp9Cgfu1LLoSd9qrwABF cd13d6Z98WGKwrMGnBnaUP0rn0P7IjuHn6uk8z4IX9SSuw9meRITk5OsBFT+g2YQpRSVNAPCyE2I GBtvq6IxsYhL3I25i7m8KR/SJrjvbWJ8HlOUcaih/IIZTTcOhRAoZx5W04DXN0jP5Pao4M+si0nx +gnU+fnH8rmxmo7c5S+aD1lrCGPvkjIyNwMRd79LBhf28K5PiIU4SYGr6ETfJkBWc4vQmBX1Q/AX zE0JwHZOwoebEpOeNfv4fhAyURqTLatQHvTF6Cec7QiZgMU2QLwiQdLwWYFzJGnZvjDmYsKqrKIZ 6y1/7ML/l4fVhxISRZhYVXnsCUSVs7Y/Cn8Svv/5Fn7q3r6MzHujh0aw1zgUq7sKkfYM5HkmUstR +QyozxL8/rXTf62mfnNnwcg8Lzymg/Z+wdwfCa9bkZGcGannsclu980gHxr9FRgKICa+58kKhZ0b Z5E5g6rTBBTYhdkY3KIM4X8tp4BsPu+/RA7yIgxHj0PnF83IkfToFVFiDnw6PWpKYUSIZsaC3Mlz 5bqcvPjn9z9HyYPkcuxBPEPJA6KHuoPSqHjAsn6Lcs/H92Nw8KOES49U9y+YSXHUhbLcW0mFzpqy 9Q6LhFRMIr/5+0Osa/LafTOB/19k6/v/Z9n6KY61fkvKjthp0/zxxYwD4ePLIL8xa5D/V0L2zl4z Cd9xiP0vrX/HWmlNJ8sb8FP3r1dqJMPceJpgP4svhaET4Gbf/HjqnTyTB4znj6l3UlGPbKL5btCA i2uByW3eAs/kqYhvTYasHNZeqX53yA4wqiRqXPFsi9auJuA5s4HUQ3AfLumoKmH/yXbk2wg9Wp9j 3HKoLIZ5CboiunVzdFk9Fdn/UMWjXieLmz9RHv1AJoYlKkWKRjxDdrp6hDMdljzQG57Mj2T91kkN w0hvsUKgO3yI0pilYPLUjPkQUITvM6gpYgLlguryaLtIB8NlEbH0Exl3cxUqTxt2/vQd2hc76nQz AbSJyGGS0puAhnIiQ87K4cTyxnZAW3CyRT7DG7xJ36nWNpMg4eIoklwcihxHSnaYsX0hqPMBSlHG fucALUh57hTFI4Hy68R+qMnJXAQBoMz/Vsmi+WtiTkWYSlvAIl7cAq1V8ZajUsfuqbKYjiV5un8Y rOLTRbX/XpjN9aIBgaGv90TuPlPa4LguMr7vmpLlWRrXEmmzefjsLxi5l7kT0OEcVXIDxRpLyJcd utKiYG+xn5gqwrJ902s+n34thh0CU+Oh/QCOM8tHk4hPdCONdskrWtOb0lv0k/z04gtmOcMgoz3f JJMLhvnUi3iQRxiO4aH3NSLgMJTeJkFd1ka9TZF4ikOMcTqx9e6IRKfXqBfIwFy9Vpg6bHRsPUEe NgS85qwO4VDt3SbKr9DXJEKr/GWIF/EaALImLIBxAC8J4jMvHOA8ZBp8EJg6TJBpx0waT29H5wvD OWLGzm93B00vriQgwGA9HKA1nTlEYj3UBB8XSPDOm5YLT3iK+HCxT8xHoNlKkU6zdUFe1SQ/ayz1 GBWgylmvndI3xR9omdakBE01jOERiGg86touXQcOhHoMOFgnS/eozxpE8Knc/wq5TWwA/lafBP8R El//gtaU2e7tW8BrwyKer8gBh+7pg8HmZ83sjYzIj8DnZn5YXXrA1GDGyg/GAcp/j2vXQwJnQv0N z1e7VuyBbUgH7FFT38sMnh/GNrg22BeuA2jeh+gF8hsBKv58t05/xIUVYOqX7XWHrIAqPJwkSvP9 Jcj6DSF46tcnaERPRKzVWRJk2ObhB4O2jLnUnpQlY4cjfjrAOMCs5H50SDpRisnY2dADYT92iHqj 9qKNu+SzSMF2rqAa/XTiO0pRBQ84SIZnXEQDirnMUYqDviYLHnNfjKHow5lHmE6A9gQybCLBRi/T dOEk1glIXnAkVFYjc0Ys3hf8ygfMe/P46XNxCHrLLbklLJrmMVMTr3oiNo+VAPzmgmpfjPqIHcPl OnCsCghVLmJ9AWvA1LWj3stBmcpvQZ/Av0+FhUJcTLlO9qc3oieX2GCLXs3yVjSlCQ== JiGR5WFtmYokhj3ckh5ROskhiXxcRUqqRjqS/Kg9MjNGUFKJAqpAq76M7GVpwaPEcbOVgu/Grl0i 5k8ulL6J+mpSl7Frn0+YmzCexoUw0QC31CI6LlJdZ3mRbgOJpcwIQZQmyK9xvGy6PE3tEVZt7iLr haPrQEG6c6JzMWg1H7gn64V/BGqnh4f/A5BM0efzz0vjjuqoLaHsxiDFOkqEBp3TQUGXevVo244B Eg3mPILMP6D4Y9cWsrnTFzTjww8hMwcGyJscgHIWZhySnUiUnlchcQvirumWc+EqgDdqREeVRmY7 DaUXPa4DdEOE5DlVWEwM3R3rpj2ndK+NeviBOPhCkMBKr5zYcaN10lbt8nhhTIdHvLNuVrsEutUc vrfY9wLUtOHpBGfzyjkheXlcbqVVX+ae2htEsS51H2RV14wCbixpO6ytoLGzfma4xMaHyL7VtQR6 bhe+eaUAalO797Kz5uAewF/sRhFkL22eNi9ttLqDbbsQB4A7bjxeg970BY7dklJsiv1tAFHS6xZs AC05eUcGQHxq+7ISraFoch1wi9iX3ktSAy0QweCVs2hl5hafSJdAkgEb+7qfQhjLkyBCPloQhObX FEYQZjmfxiRa0gkkY9C+EvDY5eT2cdGpgSPBzEj9G0ubXHK9hnPt1IkaWCeqJ/j2Oye2txY4ycgO ZcT8bgXcBaXQDjkOwI0MSZkLFPJJRd/dJwGnciX3wSns4ETlIhltGThS393KzOxzxZGsDxngKQgd /MeQDTWfnmhe3ymJLWR3eYu4K4xFLp3I9ioJTO3BkLLeBxDClZhsA0fpywPdqmMmD5fMTsbDJLdv 1E0IFsN2b+FhPIO34J3CgjcewghBF+/Gh6JK3Ckdx8grj6AN20DHOltxuu+m3GNXW6+xM9aHJ5uA yrsTZuS3KyTkGl90QszoqGv8VP59ynDd0p+VRpJCGFxxE9PidWcOMCGthX2G4MY9Dk8RMV/W1rhm UTQ3jWKlgJwjhthGMpo3lS+NI1MeDsu5L+NAyNsvVjBDLO4+P09gCfrSRcWyl4L2+8DcqX/RItAM 45InI0Tvy6uf2j0z2W+btQSkqJ/6Sd5zaYD+0E11gqecwaNV3zkDb5+I54JQ3IyP4EZqzbPZFi5a pj4MA9m1JU7BHadw2Qm6MhjlFkK1b0I2n0L08LMqVeKYz+gXU4SZS9N3B/iwHQHCViEdsVG4guMm wPhRf2O/xMG3kV8+3NPQnGc1EwnnkQjEjPKqvfuH43bFGxe77DySaYWju0F9n2suUFvlksv2UI4T 44GVX94pV35P8m9GyUFJuqlA//1a0unmava8chjb4QbKbPcppEP59CpPuTxQHg02B3VOLqhR208p 7ZjcrD5fPhwPIjEDnVhscfYZ6IOUshZYKj55sMYSXOSSwQV+GS9AnnkjxMk9D931hZYMMzZW8Nij bcbd6PoILu1mHgKsvr2MfVBxkHRlx3Lg2lS1GM+jjuEmIjaXFmRS+MAVMKP8A99ANcAjkP4qOYBk hNH/btOq3KwzO3eeS/wBCUqbLBxzdEqEcRV5f11/PXWEEPlnRp3CfjTidxrdcnW5n0zZNYdjSHFb bp7vMjLnkaupbnn71wPM3MFKJbZHdPu5fR5v7rzDuzAyO3j3vpsQ45Kbh+D91CsjwCakU8Mzw9I+ QwNQSrxF+S1uLFOJ1zoEEiImFgK5p0lixlgimCd3Mw9XXzAclqU2mxkGuFw0BEeXFGR3zGIM2i91 FzBxGOH3UIcCv27xYnLj49/z22QKypQZ6yevLYyMQOA788+ztUqPdShL3wUyP9mzcPtBZoZz0qkC 48baubIhjm76hXDpexQZYwDHK/BhU+RvhfCuGzvStkYDv1mbd9r6GMAIBbiRkR2e3EUtXB8YlzS7 h9QLjXhPIF70d5pREkFsYzg7sk5fPq0tdOj1qvPSLnqU/5u9d4Gy9SoLBLm5hDwrPC4BkhCoPG4S IFXZz/+RgJDckIBUHibABBEulbp1k+rU41K3KuFiq72mZy07M2P3YmaCurR9YhtHxWl17DXa0m0j Ok4vFgo2AkK7UEdbgyMJEYghZPb32nv/5/zn1n/uo+qcyjm5Sc79zv73v5/f+1FXRF+Z/Aq7U6f4 ZRcz9EDZQiNBRRkwicyJX6rrGDnqpOYFtjWGR2BifUCrZAOSFQyaRjqZlUiUvBg2OsxDLcM6KmMS eq4pWWN8l1RezA6GZMTD0oc+8gWaK9Ep8cTHsBEpUYghkMzySb0tAFfSVKdyiJyTKQmGCHSCXpHC SAe+qKVfqXmmIiKJsTdYODEuLBrOqANN4WORSkrxBOciPZOSjjrWWHKxIgu0tOIh0uhW+G5Hycxm qMyijRiSlOdYELGImqYqVniLJVnQkSeW2BMrnEuVC10+27xwH2f+9y5V7MSKF7Vsr9RUCW3riCI4 DBtaoqqU+hU/eSqZIaIlpxfBWiAcyOLEaww7sOIDJLoAClqIV9SlsiFeBmt8Ic+XlINdZiAdCIvq pIYndlDLu4yK1fyk8p+jgDHpoIihf3EVi2ixcxh3x3VW4gR8rMAJBWVjiCDxgNjUO9szgSIqXF3K X411WuLNxcs6x2AxUMZLipONmqKi5KIj4AkhEklU3uPrajHHojOG9IsBtRWZnLxsrthdY+2Xgtye EIiBvQcGPw6p4WM+mlhpMEnxsRoBlrUpxdJQGKmA49lkBxJoXO0wZrlekhMor5ToRPEObYt4NuN5 C28ykbEUSyT2mxSLcjTK6JIT9XpYFTGmEohEkUZQRsnWVNJWyRRsxViuzJBBqhWmSgl7QlStpQM5 g7qQ+ouY/D2hh+M+XXvREHEEANWPlJbZDkBdR0HSzHBDYUbFO+hi+TGVsr450uVTB1W0ejoxXWCv VUQkgqUrsmLwCprUgeR7cZJzBUtDlioiEsswV4mwnooXqiryQC7WHgNgut22khl4Kwy3ibXSFKfD TbzpDFVs0sKWlD7CKjltRsRMLE0ZHezQrWuOwTFcW0vFKA5IgEmRAQ0rRiUloY5dipuFE/8zANZ8 qjnFIYKcYJYYDhjwSuwO/xYVa07yQmBJKyfHAbdNXlzXwnhIlbvsxazpAlBiBIqEvfLHuXYt1N2M +yvlSGFMRo5zKlsHYCeovuCQUIAmJr1Ipb6KFGrq46yK+K5UHQ4Leor3IpfuRmAs4sy4B+p/aeFm fZXWE5LxS7eRXGoOCaC7I0XQwD1E6IKTOnA6um47ytMs/UqKLqArwjhBnVAjKjChovCyeKLlSkG/ kdxp0dQD2BZye5zUstREqGm+XE5P61gr1ZHji3QgSTNcKlmpKXIoUjyCVRHTRWMFdhsFgJgjGcFR MmGVPL3L9rB5OgXnOYkSm6ECcZFPY7cDLH9aSXwxJRaghpY3ssyfl9rKjtAhAZ0V2iIlurWJXlV0 f+X5dOjYQoed1sIlctgjAH1ECtkBBydAOTKsnOTyq5UgK64FmmJ7XFbZWJtcZC+kjhsUdi2ibFsU As697IR3g54rcbSO4wVHGdE9xaTh2LYUPbkhjRAW/4tOeuxjgVX+bHSlS0cc3O1E8yBVd7WNhZhc rHynLSH1uI30vIsKoWzHXMbjYPk5AopSrXFkkp7cSY51ABY+Jm0Q5OGiLcyltFXYNm5ZrNTqorXZ pXq17AbOe+5M1kHEVIrrBvtYsDK7447MA1WULKQDVMEyTiemEnpNKt4qDctFxYOzRRpB4ZpqAmyr U0VnLn3sKDw6AakDn2lSpZIdFJaMTtJSQzLAtI8G93gKfCzsHq0KuFxWdPLsbYpv8i5Svio+73R8 nnL7ITDF6gqmBbY+Mg6xBK720QPIUdgrA50QMUFoABM0G0152K0WQosa+TkGc0pn2FrJ2Q7gOuZG wFwo3AWbkD2boKFkp5jX2K2e3pZSQTgMtYuVQNl1OzsyPoZkRT5Fe4nrRD4nnsNiVhZGyLjG4mc5 68JvjxEXsfQYgo0wheKur2MZJxyTjrOqo7wjiSiwbdQpRORdxPwrlgL9CIgZQukeiOMkgEWv48RR FYCVicEkcg+K7MZEHxUsxxqFRpdqtIqGnmk+ASWPkiOqJx0UWuJIYuVoUCHFRaykcLSkbHTE9crz HLGTY/oys584KrcOU+W74SgSWZ5XdUp2V0hb8aZ0ZHVnYDQxRJMILoxX0cRQ+7haYgFiZhtgVYzT SqioiOXOow8zjqoSxSbLK1Bj28q+GklRTKW3YxKfVFE382KQ+q4lJbLoxURlzFlppRYArnb0F2O3 FdiWxEWhXwJ1EHbLRwM+y2YA1CJeiwyhyywPbVZ+HCpjxaxR5P8LwDqaB+MxhvgtWddE0eqMVMea wHWutqfktABMlCdqQQEspkgn7rcANDqSuUpLB0kv5qNeDDqoRC/GNilsa2MUmKxLTemhCah0GkEy 53odR1BEF5mIzutMEx7rjOEIvPBhupB3icoxOgUgUIuhP1YPxdrjiXax5gPaqqj5YPxiVCwnblPI GtUpF28xTtCLddLj4WR6YHR00bEpZxKAnZVDwHmBsHR5FQ2LfBENxJiIs0RURgM4GaQ9UQNjpMyM t/EiG0OuLnTjhKAadBCOjoikdjAmRmNHL0JsGS+MjRy6yflIRFBSOj1xVhz2ifXUq+gazloeY2O+ ekuk4wB34EtJNRsDOLB19AdSlRRfTz7MbKRGYCETS4oeAEf3Ka5QidXXY8xumEyq8y5u4JgVRDqo o7dvYbgDl2XTYU98rDBeiqst+pFTBy7GPfFopfJ5ckKzlPEOiqcrEzPGGoE5FznpiBABbCWoDNVK cwxORxGlvQiOzskcDQRALm8oHt4ErEtJe187UbZAEXorSxbDlgGsvUQpcWFTAPoYFVYU0q3TEr6R FNLQbfSgYs9cWJqkW2NvWwByqVFxZJYOBFkbyU6QL2OMysChupi0WJUmdiA+MkYSPeMICkklXLAF AkbgJeAOhWPZX3G+NKKwgQG4mA3eWCPAQsIUnET84fMxriQGIzIPSUDHM3DR9m4yNZJxUlfex1zX eBi1OJNLXXvjoiSfReYh2As4e1mKH+PAFLwMSrY7GwHwFPIy9q0AoMSaGYqbYKTCW6Dj0bJ5el+W Co2VIm547ZS83msJyojeq9g2xguyowECC7m3nIoCsZSVdLVo/41I0ViJamMibDDPrQQESJQpzE9i CGOKQULA0m/MCwtgw469JiHFHBhPtyYdKgEj1xTAQodNwnQquuk3gKaWE6cj1wPgUq5idm1V9GrV SQrlsiR8DJjFgoobgjhisn9gW7J1cFbYMUmIpiUNKwBThmA0gwo/6GsJnGInH5Q/tNTxwJQ7MySD xtSg0f8JBU4v+A9tXXNRYpXbGPt1VBGIL0Mm8kpohhXnTWwbb57Y2LTLVpepECgYmBBrCokRvYWo y000x2kbbTbgEMFAk9XUiWXNUNPD3kBcJEU0MogcEOxqUaxJsgzNbhio2fN1voaiWA== M/Fl7B6CqkElgWocnY66RS94MkYwkIY0Vk4hb1sAYn0zApJvMeptY46T6PyEml8tmWtEgwVKbI5I 05LlDdXlxstquUI6SDk9dDKOQGEgyRKMIZkznAHN8ggSpgYjIbOvmph10re76HeiKfxkhiylXjI6 cUpmsL9Ktggdk3tDU0njp4mFEGuvyKJa/CzRMEwFPXARYreukEr1SYWmYmlqmIWYBFVeiIlZPbBX q4L3xiUDiYreS6BWLQtum+ozkUkSrfOc0l4ntE7OBJKhxUqetDoyelqyTJCDgqThRl8E8VuQEBtN 9ss5Bhec9hPmS461NRduo8GKS1DKFamzWuR1Kr6hY+bFuszujRRrBo8OjlbTWdrDADalnDAJKKqL qM5VyZ/BEwNBY43+nwAuK0m4JA4VAX0ZGYEuuFdPOnMEYgYv6YArzQKYfRTRAUcOqBTZqF0UDrQk amOwkiXXXJUkcwBqdhDTqVsfc9vZmBdYkx56YK/g4yXbmAoh1CZGqKes27XJKEs8HuAaJ4XCUvrZ OtpwtTAI4CpqCpkBF/OoQKUgFyGGOlcpYkSTk0ZMT2qlslslbq0+6o11jOODvCGu4A6iKyP4JltB UzHRbMpzoKUQNPg2K8kvl+U0cZE6pwTf4MhdyimSNPWVjZl2dVbGG8B1PLLiRWyjdx97FDKwlLIG qepH5o2uKaxhBn3cRZObziamIC7iXZaAKnC99zICFOMJaGICfskOB8C4hT56wUG/rOTWJIbPUGZU H3OUccQIxBnYiKIkoUGlSTnP0Bi+4F08xrKxOtpwuQQddaBi7KlOIStYraaS5XKS9jsbVfTULYvs 2kvp8zLGJOsY0gBxS4UcIh/zGWA4k4ClNgQAjZQ/kxDTLB5KJ0UFJkQ3kqlQElgFoIQLmphXLgDT HqQwVwi+8lIpLEb4FNH9V6eonYLcSBibyiaUPi97xPn7fV7OhV2+Sx9TlmSJvADKFgWdZS4rk/FA U0aWGQzBExFIx6iM0kZv+uzWQ9RmJO1SUbLI6wUh9zaDkdKpeEpWcMLEcCiVV/sRX0IVfSR9CmpW FOqBHfhYBxaJJefFAM/HiOG42gOkQiilrEHKkOV9zMGsY+5XAKZzyA6t2FIyukXemapySTlH9kdF M4KcLXHcRyNATOgWwy98rHYKhI4zTaKgGzPNseM+nGkr6SeTuzgcNCW1JyXMAICVlBBiNgo7qCI2 jcQL9p6FeUXqiDkBO0k1WNfWRLBRsZKDi4lEJN0SJA4ykrNEDAhqNqsUXNENQLAwMpBgmFOl6RgO 5VhFQ6+KwRZYM1UOcyzHq6NqSok+lhJYxg6kLDukArXCdEkEtC2hK14bKcueZVdiHEEd+KzeEYvo LTmI3hkziZlMe2BTJjFMQ0rtKdkO6nucBKO7moX/Iqs0kjxmAFxokfPJIR9fVglS4hvdMgJOoabB JSQ6SAMSXRFwSsmbtNDCoVhJaIpAL/4xKhlb61hhxyVtQ9LhJocuABbiVaiSq0aKXXdRE6XRLUWc x2vRFvfMQKZWRTnCUarFFQGXYpGRQegq85PgEhRoCzDiexBr/7T0ywnj0CYTHZhANbnC4DL69XII JQJjCYIovoGxyBQCjMamIjJ2TiKxyK4jHhTi8NY/ggNxaCKWsYOKDE3YmOgPCZqA6Nhry1qG66Lb XgzJY+OU2BrEkhkre6PPiAys5/0yMJuZMDBUZkXAWgZWireDSD+Zec9Gd0bHSVy5aTRmRucMDvio yMknOmf0vF7GlfutgFp/RaAxvJOjhxGoIlCsMDra51xm79BYu0faFjb63vjoVyBif4r5d1S940Dr uCSJnsuKasTE6gGalRCppIY9gGOqBVQTzLX2MRdz3UuiL0tTlVz3gtxTQGdpMne0mEHBRN1lHhVb cipQvvlaEuOn+NXI0vSNQFJT+izADpnzFQHXMZdEJSUJAFyJ+g7VPnPtncydivx//oTz/wnahGJi OB9dZU7pCJ5rgAMHBWZuyfFXtkGyRyXhXxDOwJUWELCBsGdw6a+AcIZhAvoGuan/C6UBRBs+Ugjj smT3aBdGnGkyBxHIEYAo3sTYElREUgFn41ImXARTwTbjhLnIzPXGS6Ay2uApBBEybSZFJDAXyOqb KnmIFJIW3UiReXReIlOtgXCMInlKlVQuxZTCT6JykhzewHJDDEfLEixAMQAs+4oLpnE58YuG8FZY 1goqSxbwBXIrYrbFMIsgcMTsitojNVOYnzplNCUhWjnKdUBAVm+guz8rxEv6O2cRpWZcaQ7UcGzj NdFdGoCUIwOBxDSD83xEOZBz0aN6SPnoxx2A7IsKIQgpj2lz8Fgc4aSOGZgGKSUpHHZwvl9hTT6n /kN7Ob4ceFjEEUCgialEfTt51usqyfQArqhsNBxNFXX+XEsaHVwsw1iJBf5Mrk72BXbfgNPCgQBg CSa7ucZSzdHqQg7U4DOpYgdWwt0A+TPhBHsSuU+ActlGoyAzleIKKTYiPrzwskqJjagVyDsFvcJi LAzuwIsHNZBQ8FV81xSB2Z4NTnhUnAmNTER6wQVODLFQ/wSvBDiFGXEnBpMSOf9pL/lnyGiLUias t2a7CRjlUAGN/kDi8gSjJXOnTpcS1qtGdA74gck8XsWajwHW/5AOFCXuh4OQbNSIIxHIQXu0YwW3 tCJjtRxE5vrAb55+cKAwkDTB4OROornTKYKmAvUJAyWnKbi4kx7Dsb+w6Oe51rPTKVynlsLcLtaH IRdwZK6cSVmaUMFPa+ZijkAAOkrd4WIOBBhBXeNOuIw+oz+9qbiDSjvxvc868LVMQSvFwKiVxfAD rggQY6YRaFAR4iyFvcxQpAPFJjmb6gxQ/ILhgYktFl9GJVwcee3xLhAv4Rz5kUkH7AUIYEpZSTuG zCUAixiUgE6lBAQuYUFGQPoN56VQEMVaUJENOM4Mwj1CUEzAj2EdVNnVeYlKxAgOcpSGPgsXgVy4 w6ESQZ5XjhbLc9FFDE2qCn475tQjIJuOXE8UU+VK3gAdh8plYV1MotZyiomWBYwFmeiwsmlA2hkS R0ytId90/xfE3aDA59wcDpn4FQYG6hAPoJM4U8YPLlWohohUyonvWEV6gDtg7bPTMecIRH+SxRsS 9poYEKkoKNkpuuhirUCleUDLyelJOWEmrKa0kLyohWKuIQY742ElwwSgMPbTAK98ynoNhmorrtQF 5UxB0TlZSjnMJJAhtpagJzSzPVqqj6NjLRWKMTqlFEZPaKqTYGL9XXLFJg7FSGQ7Om2TsRes3JqO NHipE2YyJjltg2OG4j45lwyZPtGma9gsLR0AFuxry2o47LXwg99vIzNnoh0NFoXiF2D4JnJdbPsF YHKejJZiIbm8KKThBe8BZWQBg7AKG0DuB2kHAsUrCBy9/+GMIp8EZEFYPCeWOGOjLhUtxRUKDJRq 3jAWZqWpqZOHvSLEGY6VTUV2KI4FV9BGBzUd85lamwfHGDJUWwhgNoyUSlkXUE+xFAkRcOTuZAtJ 0IP4gzw6bZWtIDJ9iOxAE8ZxJcrKfbO1ZIpHu6uh6lOK9jraQguhblJbsoaKNHQzU4ogCKHm2is+ T65QSrw6ZJfm/E11IbovQBiStiImEncuN4ZCIGLBmF2U94BcnNALrFDagoaIKXVBfiiAF7WCu2xi 0gtOgN78P2G1JIuB9gQST5CIVktiMdgzRYljTawxo1KiQ1NTYZoAZC88USl6ckcCAzYnY3VaJqR0 7NWVkv8AA6Ml64grpOy9SiUOQ1tFVgOMpuQ04TXtGdx4YAKo6jGoXckUAFFrXDAeHBAVMicQIEn2 P4wIcPw4OjeQErmUyy5uCARkg69OOYkLHVlH1piQKQDYHy1comTsBBUzbj94DHPqLCiAUaKgAeJi rEToK/HCB98ZG9MqsxugUdHMhJ5ZjvlJdL+QJeC8KSAXsNIdVssZ7gBdCFi77gjdYcA4b0FN9d8J tbEh3EFXjpuinEnabi7HBo6pMS4/3DzWQxquZ0xKcM6Lhkn1TdR20zE0XG2JRqDFud+qVEBJySZY TS5rBORoK6uTeyQosVk3D2iM80ZZIw6aIAqQ7g3OMZc7N5wdEtcQSCWl4jacMgyABelbEI/WnFLH xOgK9E0Tiy8gddpcEx3w4NaxCgncri3l5O2/inS3LTIwCh9GnsXQPZ5GZw285H1f6HJDvlEyd0Me ABATSJ9Uy26Dv0elJG1sQUp58OGQgvUlp/7RdZ2lUyxqjhvU4IMRk6OiGjLASvH0xrKOWBdQAy5L 5eItM9gAlm0tLWNxjdiUFXCOnNjwTTFlSSn5mwEa7Z+asAeN1Umt+Z4FSGUlOZ7dcoITKdjF8aNW xcpwBZl+6WhyghJXSsyuKQlP0ZVVYnwzNen46HYy0jJptGglo+PmZWQELigBJlwOLhyMYVtIysCn ltIEgfGOnM6wEIwkE/HRbQBcYg2dTF8I2TQpwQm0JAxvuDIt4YzWtqWkqzYpibYHLRbKCOjwrFIi dE5jLfeIehUtlo4FsnwpMiVgBwnyxIzdpfCjHBAKiZ15uUAOltzeTs4x8JuizgAwp3nRJnrPYMJu Evp1rFIEGceZxsA55iUotHDUCoyxWpLJs3QOshGngfWFVC5WVZYQ2JeipsGkAVWsG0QICvIY0PH0 lUQQqywWBJebHFGBpJZFRPxEOZSWEGjM3V/KTc4qLlQSr6w4yHomzy+uTPRKgtzeZJcF3zHJho/J uRU/L14uRayyBZ2ygnwQgmhFJm1op+2GDrrMrbe+HUEAT024pIq1b0uJFsQ+VawrT8H/yHxk7g2O VAjKRo+aUpO9C4FCuNBjAG8BZLgQBQ26N5DiRzIkcK+0rCBecAnF0lFWC9AE6Yge2S4OsSNcpgGs DrbiK0R2KMxcXQodislCYKGzO0zJQjADOeWeAjGPFBWwp5w7CL2creEbUFBt71x4gA44xsrEhCuY lpzyFKFXfByBl1R0oG6VzOYcFpRoPPE+JXF/hivJUwdKYlZNLZFPWA6BPAusEj+pQksci1WkS15g LFSQMdrUsRwMvIuWEGQSLqXioZouOmdYrmzcw3xZR4FVfK+YyYAqTUZ8Kzitha2SXRURNDlo2kpC QxCTU9Y8W6U6FU6SetsqBeUpH0O1bZH8EpSUU7A+JqJzlVi6gOsG7muBOWghZj4m8QL5hMKZbMw5 ACxZFalh4uFR6nBGwDZ2oIy0ZT+lfnLKrAtoUMpMGgFjPtoJQAwRfqb3CzEv/SyhFJfsZx/bGc12 prSdgW1jdQdyxa0MdD+rPYgtb2Xh25j9AYJBuxDRKm60iyatYky7wDNAOGqTo9oErnbZrF2MGyDw tQqHteTtkxxbNABORwhEh3Q2WIgYeX1A+nV0gPORRwDCyTKERCATUEoKDSCxreS4lXAPIPJt/EAr 4zCAyWhjSFpZlwFcTitD1Mo6DWCzWlmyNuZtAKPXzhS2so8DWM1WtvSkmd1WFnoAuw== 3caZt7LwA9j9VtGgTYgYIHC0CydtUkwLhh6IzVvx/gAagRIeg6XQBpZ1Rs8oa2LG2AESers03yr3 t+gIkMiga2MUi4GEmprMsaVow3q/EInpJ90rwj73k/kBDEEb89DOaLSyJO3sSyunM4AlamWfWlmt VqZsAAPXyuy1soUDWMhWdrONMR3AxLbyu62McQsD3cpot7LkA9j3Vla/VSgYIEC0yRqtQkm7/FJy 4UJUkKjojZ6e52B8jB1ASwu8CG3R2EEV7ewwLK7sjm0tq18dp2WtYikRyP/Y9HFHL2DwnuB3GZHV 0BCgpHRBYBYq4jswjQXuP5RfoOch7QZX8IEqFsQigDmcS+6BLzqlAIQdrKKPu5fwIuCSqlJqY1SU FMNYyTaGlUTIJcAU5IUWRTB6mSmlnHJpxHsEnTu46AhMy0nDMh2BwCfLdeWMx1BNhu6gNVEjD2eI Mh4DanXiR114YVStj2eosKI5dCry5IWWWHrn8rKHtXgDQn1xcQUvxBcMKnRy/MYgCaJV2miVS1pk GECtBhh4cO/RYYVKjV8I24KnT/yXfagUJ54Gb60KLC7iZUjEQFclrLnkliIPTAAGVB/dF7ESIQJL n1wH8GYGcD1bi32YOGBdx2TOYAaiJO6kldRsoFPR7AaZWx1nsi25YntsO0O2WMqOolhpK8ad0Ak7 B8VMvJxnARKGiueDkuz2lKmSHrZiiZXEbgSslWNPjVj/AspmFT7DrniRKid1rMEBjCt7UASKo7Ml 3GdZi7+t4xh2uom1ZG9yXqxjcJHwpgRgGfEDBkqQj0ad5S4vOewZwXkZKcrIBIXhmcSDMqci94Iy RQoiKqfg0jACyWxfWrmewFlYrs9iJQWt05QgW9Q5JdUWsS7W0Ctjkk6rxMkZg4so8ybQuMqnqCfe WePJE4jaIsJGauJ1KfUvvK3YMUZXWgqOgGOVY4oSVlOS/nOlZRBjuIIQpE8nV2gQTYzg01oCnODA lU4i3yhXPGJ5HaP0CmBfAtBFKzvaErUtCBqPUc3p36kp+TYDaq80P5+ys4CbCSYExQ443SG6WQCG 0ZUnAbr1GjMuIMc+4CjhG+CCuoB6EshoFeAV1/IlGiJ6UKT43Lag0wGItw1Ht6LzNrw/gEQMICet hKeVSLUStFbS104mW0lqK+0dQKZbSfpA4t/KKKCLFIM5mM6DebcUoI+cRkUnqE45m3FgeGHAbBMr zhQcptgAlqx6ikBcAiiH4cTuI21rDj/Gq8FORXhfPJmNfBbxBCgW6wtrzCXPd8NxPTkEchTSgLvV eg3b7mv71W5FA+0IYwByGYCIWlFWG3prRYXtSHMAgm1Fxq1oux3FQxFG8ldxyaIH7D7delfEYUF5 ShLFIUTKRm1CKdkqnZdssCBbcISNY+dkqVLKnBXojBhDYEnVqpDRetGHtHFW7VxYG7/WxtshMgT0 51jg1Oh9QTxRYFRK2/IlupljxAtyOJjYUtzMKRU5Mj6VJm+fSkQILB3kJbKH7SJQjEfFkvNhRBhQ qivwfPMxlAjzCQAiL+tSEk+V3rrMpV46IBUyMmmaK3Fg6iky1MJ4S07Ao/i0IdDWEgxVM+9WJPUA gGm3YWClczF7FoqMulYp/SdIdMS9gXdUlgqkxMIpAC5czOJG+UwAWBdOsq2R1gJ5QtheZP8wR6Rl AQ0D/YjT5KAecB+slXgicmVmyHSrrXhtWlFm6JRBBzyRDAZUwpXlvD4KcgQZ8eQCrowYUC2xssYm 2l2RCE7AqhagpoJYQM+03E5IM6AtS/OS6AW0kSTOWpMQHMiN5DXlqBLOAUGxpNoFXygpm+Qk8TcU pE+R4CwPS3yFSINS7tjHOoWl+J1iaJ+XsNpWFrKV3WxlTNuZ2FaGt501bmejW1nuNuZ8ABvfwvC3 CgYDRYg+caNVMBkoxLQKPP2C0QARirKy8j2W1OuawyIQGLOX9mEoQngJ2bVFgQhr2PuFPWf7TiX5 lA84wX1nfeC9aLlDrbdt4M1svcWt970dN7TikXaMMwA7tWKyVpw3AD/W7LwJ/WYJFilLphY2iFEx KjCRe/JVIh2Y7gC5H4nzgNHCJEnVZGJWWC4iEeaV8t5gDASuF9htqoiMQ88czSN+9TCvyrDVCLXG MgVFrDF62NeSpJLjfsFooZxQNOafwMffxdSXNRNFAHMFHS07ikAuUIbJIJEBRKAuUuLIMG7cxlpy 4Jp4OlWdoiliAI7i8jTyvEgHKiWxrUXdCr60khOpksqXlMs8i/Ii/QuCC1kujnLWWqpFIVfAj9ex OghwkzQtYDYlkLOirB0ElAhTiPYl2cTkmflBC0wRLRBsWskessM5OB7HxLqc6AOzaakUOWtpASGK jItzaC+rqkvxksOUy6QvDUNJ2ZfAN5wkOV2JryxiLbKkyMkhIOfF1VVKGkB5vCT4pSrFC7sqtHjZ KXmcM1TqOl8AI6oycPMzElxi2Pwba/phuEFJftElZsU9wOhZCKwmf0ESzznq18aSZVgTiFhPCzg7 lpCCGrIY7QYUmqvNJrTndCywWXOIF/KuGIMhFIZrToKZRLIDwTV2HF8jxjRoaSw7EKtY8qyIz/uY PyUgCqa6gUXAMBcCGqpVC2bcVAQKijyjSdZVMXEFCG+ULAbovjfiF11VNICSMm3JCDiLjitpLwlY OpptKXnaAcjJwuBVPkVSoC8nQmPep5hv2FXR6AJz1cT5QOmN2IGnU0ptJW0TZJvkN7GRFJIrsWM4 pFMuUyEzds0AYUWqWEF0hBcmS+qQWUnOCVa5VCPQZjKUJC+B6moO+RYwhVfWHG8EnuzmtAImVkJj U5KrSHQjIFd5dXWW26d2zKZAegnJAwGjLSRLFmcYAPFYinbqlCEci+zFJGqS5qOGPIKSnq5kr2+o 0cfZPDC8Y4Ef12RMxHRrOhbu4yyFmgRGAkrhIZMZ1fH9kgdUs40HRPmY0ZDz1GMmqUrSZWaZt3Qs QJ4y60DFT0XZHxQ6yZF8X1CBHcdGLWKUwaYt+S4kCLxCJ7tYI49M9YM47TauvJV/b+P1T0Gcd3ly cd4kHqywbZnJPUPnmlDQeEE+lhTT3Q+JT0qQd+Wxgg98IX60xMjjNEyJO0YJHnEckHmJO/bW9sTf QVMjURoxmWoBGjh+Hp1pDnAHgTnmthjUMif9VhJsJ4QaFDRWYvWkOoLhZ6PyCpqJPacxpvSsFFXp mxPndsBgKiLpmqy+Kwz2yrsMPNcHRjWggEuqogTmGg6tM6BpRDu41lIovOV1Mg4l+Tk152ZbYTCW GqD2nDKzvy2rEKrKZkMTBlUODLNMoprgArTShYDR/yuNeYvWXNZB61gCDdrqyLjVMdkLKpjTIY16 k0LAmHaQZ2cNK3Ul6B+czRx64egs2xKAmclobpOSnKLQLxuYkIPHND0yBmIzme7Ky4QlDbjaZv0y kLjybNkbQF8UqYOyLoRTlHDkfDOZy2rMID3fv8XLIEjyNdX4T7isID7ahGKaK60pZnqlbwcbx0Ap W/ed575O5lCM7YA+GihvhiLhKFM5cAtg9l9hsCnQowfoqpQsAM9oFBrAQ03C9pT4/oBOpIhSi5J0 n66WctyYSNVZITWiyNOUoZ2AVVbNKIFFQgEgnZHQK7vTYNkhyuHsaqpPKB2UdNB99HejskOSrCyO wGQp0LIR5G2Ru5FksuwpLq8jUVn5Uve8zErRgubAYluZhFQT8sZza8xi1vu6wPqLAKolxzbwQhzt 3b+VCzE/Di8loDfgcWSPS4PzA7RJaisqblayYwpn9sJMs6bgMCElLCWKEEbEikIVUh2NM81ivuq6 bJ4cyC5gUl5d9sRiqNSr4jIFhkPhBVxriVlNBd/gAlDQJsTX1oL60pkwhjL09bfWtpJoYK63ACSB yvG2rNmBbhccQ0MLdqvF2EFZbHGR4/4IyNGFzTfjEiMw5iTMdtfopLRo28LGq1Kmckgt7MUhsTRe aq9xokCT5aJOUzBZlYHsZSZKfFqLbIzpJHQscOYllDiVX4AOSgkRztq2rH7fIh7oiuB6x4+qv7gF uuSobxahqKKdzc9PcwV7FiCBcVpSKY+zTQwGZwcWc0HbFrBsb+PA9k0FMX0PEsfSlz5KQUbSWoAE W5ZN1AFVLj0F89ZkCmYgVTkSzH6AO/CFqzPcPkO2dut68B8onJTVvahOYXYXQXW+igkoqqhF17HS Z20Eq2YjSG15CnPSr9PcOhYARe0Tj9Y4gYHYww1d36iS5gXzRFhew5gxum9hGaWCLZRyGIByCTiY FQa7khRIFaX8mGtuBKjClNSPw/qqjg2mUs9EFZh2iIFSXBQV5JwaJ5VZa/TbeB1vGxrUrI/gIPP5 np7jusPQZH/CEH02WnkZx9w3J5GDcWj9Y8CXzTVPKmaEKnTcT++qqg+cBlfGVEqNLmxppPxtz35w KCSKWBWrYzDOnZxgo9c3WHQprQi0La1hHY0EeYLzGJV9Fr/+A1PNtkV0bQDvM+1cXwcyAm4pHUjb IiqPGr1ygnFfkLt/akjPQ5bIDDjHnXISCFeIZy1m+3PcVBxjMRuiZjt1ijzwTvTSAiagt5JBRbOl PGvpMn9nqk3I+V4qzhaK1WNE3oyeeiZymBBlrJLPOONjx7WBJY1p7WpOVyDmOMwMi6cGchh4JTFE HAIEOUvqSrzpkXiIu6EuJLSIL2DWK6BF8gOWltgBIADr+WWmqjR3wIE18rIZdGavqFq6s5m/IujN mBu0kloy0xeIzN0E+lQfFMBcjw8cA6h8EgDrqFGRYwSbzztWprRIAGbfH8eZ3+YYzCKO4zpfBGRB WO4Nt6xr7qD2mZs+i9dhPbg+GawC8sykXOSkEaLlQyD6aVEHCRxpEgBLJhKSBhuWm8pGCDmRrbFa 9H2iHXYxGXqiMk0gSiXSgTdFU1jJN7yW+o0AZOwMMkGlZALwWMXCCmdqwoS6FNcBQIm/MLHCqKY4 pAN8vkU3yany5/g2SBJWRU7VAma+ERMHVzqC2V1eOuEXKtF6il82VtuRRM6xLHbegYr6XCyLpXka nIAFIz5IMJUJy/VPbVFom5tqtE58BGAQKaaQLU8q25mvb4auaknNlOMlpO0zEt1S954vX0hNOAEL tiybp7G3CxatWqiI8AFK4owaohUEFpNpIeO1G0DcvyawIVoFLrGoXZMtBeuKKkzGDJJtpa4lpAhb ismlcsKrYr9z3G/4SWfj7euXhQCwgnI6nlwMUZwwBcEcfVPXUqpMmhJQYg7z1Oo1MGQSisjFLzEZ DQePpBpI2VBzJryxMpRtVinJX4xZLCgXn9LRfaKxsFikg9M01Zz7SWkpbSQSU+vWMksBanjeMkvx fSusXC9ZvrKS1Ag17jwzRyp1AjL/CWkz4UaJdt5wpiIv/BkAueKswfzxAiNGF0uT6aTd5+w9kBpQ s4kJ9pZmUURnsBoEMQpfKSlSRewLrAAOYInJrWOF3yzgq/YxuM1ngTlguTEx9Qh45w== zjG4IOUgOPsxl4rmGGIAINGo2PRslDEh49h063KnfWA9suUagCsMxtI9CTzHYFaPQ4CWGLAM5TJB YGFiFQ70DgAY5qmTxdF07qwWdxjwoEC0ZnWke433YG2uAz2Dxcf7x6R4BeIxyt8jI1KpQHo+IkUp Reaax8CqGElVK5FuILxKiniAd4Vnb5RYdhfKiHDYlwkkkEo6gkWIuReIueJIOPCmqym4qc7ddgM5 J7Om5RJaZDti2mJjJjUAYsUAChCLwSUZ2KR621i1hE6dTRma0hhszA8GQE8qNgjnExssPE8ytnW5 My9rXq2LVuQAZMdji0kDyUvLk2cKJe1iPhjrqyBPZYsYpZmNqcwqc5TCJlkuoUOLzdw5NyVYRZWI A6ySmkawXVwDD2JbvJZM0JXUPLElMRwzbFNDydCWMcyzVlL+EgZg4rVPB4bBdI7ikbGAJJycIw6N BiALCBmwoGT8PfhMwHI+NVUwypaxViLpNYGMpiDRUYydy8YLQo7tG24Ra89kPaSEAtkyeHpG3AgL Ilg2+qVnnXpJAZ6PFQ+HPO214ZZRDM47AHlIRffvSoIto+NCmpXLTbYJxziy+coi1loCU9ETURAK emNTaCYHiWddYBrRHixlifnqxVJc/1e6Ff9ES1pzAoM3Tcn3EdNPCVh7J7dXPM5BY205GCJ6cPRh cEHtkcIhS6p8JLE8a6zBGE+qzmozSKw2bAhXCVeS9BjdJwspvoHM8MJU4xJm1Zgqdj6oqEaREiBL VmBBt7qKmEVyfhtKpdvAAhA0rQgRV1ggmZPgJw/zAC6cFDowVHExw8+QBZ8FvnTQvMuQQzrUuTk6 UX9Jrh+PCREUZMJVuplMenzMlAxAFpwxPTsfqb796aYdzy8kH/2VPjAqemT4glgGgrGTufa+T9Qq htWhIrFHZeBKH1hK3VQQoCFcQAxctVIgxWqynx3o70BqWTnhPjM2onIxk0nOhVSQejNjI3r71CrG YvRMgG9WWVP65sQGrTCYa6RASlUpHlPW4g7G0BmM/ymYtqU1KIFloEB7neKUSzIKIXGPOdNiifLM LbYEXzpZgRR8U0ZHIGuiWgB8sKkcWDYmKzpI6BREdbzWpY2I3sZrXTpxBRM8S2+iiGRMMwv+LtQB 5B/QVe9BAzApla2TcujkBF4yopYEIxC6Quys9CsrEw5HmYGlXxbr8/GWYurLxwtRiYXOWlK/lWT5 a1CFshJjWMY3QUUvJVRB+KbsGJhkzAUw2+sh44E2dTweLD9DfgAqw4xdFLJp4mXVf+pSTQhWyNia RDepCcFVDm0dy9sVGBtY9wC9qIRsJVIatfVUnU3A3AEl5BYGioCcdtmWyesWwLaqTcaDUfkJ0GTQ SatE/C3g9AnvgmrsGUwVYrXwdSlfIqSs4dtTkNM6AWU3y4jnC0XVdBFYxAp3PiYktdF3GYGm5Gyw EvVcYHAKKjIUlSOkEUAWRckGK7lhICMD8bvgdin5ebRkp4GEFbpMCeR4Co6rhs4xmFGAU5TFhFeB DoOLRY8wNwurXbiDA7y0op3UMXdTAHJxMcyhbhgmaW411ZqU58mvHHNNc5RXA8glTptAdB+ULVds gNfROT+dA5dCENNJBGBUI8Kho0pXsLS+SpVMRGupyPtXwErR8iqK4+oFcq2HJhB35wB3EMRxBlvB 2XB1yBICaaO0ksw3PDIAsjK2/+51JOKFkarCkGcYSMCK3A1f6ezAyZVRlCtDWs+1d3JKCrlUJ1vI BZ2acT5ITqVAE4LnmmCnkoWCnd/6IOlR8PG7qws7AqN/iAU+R1U6QfUPB31l6u6p/Qevu3F94+al hY2ltdX59WPT1wfQNTOYhawq9Wumr7t7Y31p9b7pa2666caFhc2Vu9Y25qHta6avDS1vCP+KZMLu tI5klFPVeWdXRo3TRF8qciEARXDB9ZDQySnqh6PHRC3XEdpK/aZYlAH8dwDXAqICD39DxBe0zlTB V0drXirLiynGCfuRlcjF1OlSoU6nFN91rEUajcQ1RAuxTIB+5Pg4RDd78atl72oI1RHtcp1ElZga F2wdSpnoL6zSsDLNRBXFmkRzpZQd5NoS3oWNY96mhjpWGXdUc3QGY1Yp0CoWBlsQ0sz+U44kWqI0 nlBRCpXD1GpSuCqWYAaaYslPENKssUwEqJc9wGx0Yy8KEaixhLy3kdSx0RtshZxRE1uIC7IgaTCY Rc9ulPWogyq2taJeK3VWEV27WrjlFB7goz60qMVVA+xayolVJ9VDFy0tZCAhuwfYzQpOhYf6GNTj gOGMivFA6nAuegqRvGxjsV6MNGBNrUUlAXYp3uxYZAbDhkk5BuY6VshWkM3ESUkJoE0LLJdmRktx Drex0EQmLtdEShGIERKiLpcIBR3d+CCGjN1CNAU50nGXaAquRk63oI4+KJqS/NHNYn4f6GflpUIT 51R3bNSiW1hLmIszIh1h7Rs6Rs6kMkclrTRmHCIvTS8nCEyfHC1nnIiJsAF8sY3lwGGM1ox+pqCZ thL1EMOkmGdHYCmOw168tsDOK4VgoW2hxCAv64eFtRSbZ6UwDIyAkma7Ihl9sRYOhQJAW7qxVCaI HFhiUgEcFtvISgoN5A4IUjoeqBV9J1hoKeU3lAKqvJzfWgIIwZ0pnl+pe5hcrGGl2M0G3H+Z1+TT eYA7EMalkHqxMABFtYjh/DIOxdmLCdlKvVgAi/t6JZV8sUCRi6EwiotmhhmUYuKztUTfwWzZyyL5 sUKavUqCecStCRfasQ06lcWBbOdOjIxxqSHvWyFeRZTpC9aADXGuprImtIgaognZjKzEFTzQUm7J kU/o2h1djdCAIY7GNVdUqNNJ12KFBnNoZWQPrS/ZJKu1zvaASz+rGPyGDvFSflxzFUMTzVLgwyo6 QZyAlQqynPADgbHoL+dvQCDp+DwxDLEDNs+jb4aRA2OlAq0EdhouBUtAKamN4FJqyzvxFQ8rxF1K ACa2E+VerP+BUCUcQx192FmoBqDUWVOxHLWSNIq3nCJ2q5XJOXWdh/PA7nCWMiZKkIRQJaj0pOSc iTuRRWMc4Vi501ai7k7N4IZlecs6wy4o3lKwjZFAM0+5d6ZbGfEHTx17XBjRhQJPllLoV1nNddFp gYmFDp7j5LSnaiCDxSEPwIO3r63eGfrYCN3MzBAYpaT8h6nbj8AvWtFPd7/z1luWlkM3U9fFr2Fo 191z29zta4cW4WtjzAN/uGH6mg+sLK+Gn2bCsNaX7t3cWDwKYw/TXp/vabFw/9LyofVFnJuZvu6t qxvpN/jPxrEji/DbNWp/WJh3rC4tBKCsT97wwfnlTWr5geM3BMEQ2sEgcFSjOo9jnedxbAfmsXbv P1lc2LhpbXP1UBjaTWtbrHqa1mE8WaHpxtHOE2w8s+1TvfGtB29cPjx/UHed4tKh7BIPmBK02faZ aNX9+N2/uHTf/Rudt0iaj/ScHlo6tHF/5ylx62s7DHxUsOTG5vq9m8uLqwuLXZeEHu24IvKebZ6V 6TqZ1c2VOxY25h9c7I5a8ke2fWKra3dvLG0sbHEk0/yOYuu3Ly0PMcHGM9s+QziQXWe3vnh0c7k7 xpHm20/Cg0DYdU73zh9dvGV98f2b4U52J+g9T3XBQAMmoo8zkXYalVHqxbfn6OT4Yz7OLmzz9iyt dt2ctSOL6/Mba+ud9yU9sO2H7u61zfWFxVvX54/cv7TQmRHZYilyfmR1xLHD0uoWZKAxGbODt+bA 2sqRtaNLG10uzekYADLLW777upsXD0/fMBH2RmMeE2FvxIQ9NxH2JsLeaAt7h9fng+SyfPva0tFd Je51vnoTcW8i7m2HuNdZ8TeR9ibS3kTam0h7E2lvSJb75qXl+Y35D4YXLR60p57zHh+e7hAsRGdu boLSdhildT6r6/OHlja7c3HSfMew2m1r60fuX1teu+/YBK2dGrRWTNDaBK2NCVrrfFYnaO05h9a8 mvZqOP3vXUPoL7InJmru00ycjgaUeRSI051LH1hcPh3+TeNDodYXV9Ye7EyhwuYtD7PTyzuwxUur hxYPL60udae764tHFuc3bt7sTnizJ3ZAm7raeWbz4Ee7uTUPkk0tf2Tb5za//ND8sS1wSUOTujG/ PpQqldpv+7yOHlle6r5rC/PLC7cFSOeJpQd2wDLVebsODXHBDu3I1dLT+gajprUP/1XT4d8bwvfw /xsg9LfrNPFbd3oozbd9sh15lAyZyLtvx9F3xSfNp7Z9mgFVL8939wudP3RoaWNpK4qYzy8+sP0W ms5bdy9EOnQ3zFDrHZJW5leXVuY7qZVHhYe6d3krzDZ+1j+S729cPnL//G6R7svu9udDNy8+uMTB R50N0PlD2z65Yc4gyjEdN6qjOHNatBa3zm8ePbo0v3oTzW1c0MGCWMbu2Nzioo8fWtidZuehLs+I Y7kTVMzuRrPzKCKEzsqmccEI8+tLG/evLG50P2zjhBlOBJePB4YYkrUbGj9st+jedSoPdJ/JAzsx kc42hge28BfNJ+JGeiJb7F0+ET3SR2sLt4h8Inbcaej4mDhOiPwOjcR3yrK7uH7fIizmDhl2aQAT q/LEqtw7tee4Vblz8P7EqjyxKosMN7EqnxYRdZdalcGmPN9ZcTWxKu+QVRlpPNiVjbphKHo/sSRP LMkTS/LEkjyQTo2FgnhiSZ5YkieW5BPaikNLhw9vdk9yMC4YYTeZWzsrFHkvD6ytBnFhtfsu9T23 /fxrZ2y3uX44MEh3B8GhO9fTfGh0949uy3Bzazyz7VM7tri8vPZQ1/ktQ2qb8PvMwtryELbZ3se2 fZZD4sjTQLFGhVpMlG4TpdtE6TZRup0wKfS7SOlGxO+G+9YXF1dvCAzn4g0BmSzdt3bDg0try4sb N6wvHrphbX1+9b7OF3BctHHDEPKJSm6ikpuo5I6fE6Czun5xOfxlKE1P9sT2Y/uq88TmP7i0sjlE TsnYfsf0PWCND8LyHGf33BHHmJtJMJljdDxGR/7okcWFwDau78L4hV2letrVipnAoO121YXujIHl Rg6tPex/cJSPKQ/2zR84EgTjE5hlenCit5nobSZ6m4neZqK3WRsvvQ1raUhvw0ocVN9M9DYTvc1E bzPR20z0Ntuht9kJ3LfbnI5GQQl1N0tGEy1Uy+mYZNHY6Q0bdRXb9oTK7xB+GsdUGstLG3fOL22l Gho/jLC7s2jsymThwzqejXwKje4JGyYpNEbMOXXUU2h035HnUgqNHaKdkxRUY0U8h2V5Rp1unpCY MOq0c5J+atRo5yT91K6mneNj3h+a7E5STw0zgB16+finnprR3WuKb5G7KTuRH9gBDDnMTLqXJz62 AzN5buXMevPhw4sbG2tzi/etrg1l/Olk9dl2L4zuh/D+xa3tXdl8pPlIz+mhpUNDmBq59Ti56e3e 3By7TDG7hWAyyc4xEGXuECM5ptk51g4fPrq4AYNeXzw0lI1wXNDDboqW6IwVDnVndg== D+0Et9t9It153UM7wuzi/dltyOwOmdW4oLGh3E3HBXMdXl5bO0SetNffuzy/8MAN0wRaOzK/sLRx 7Ho1OwSbcGyYsClqve0zHmobx+Uy3QJ7NkZ3afezBLvTdW24yzPinM6JH8LRt7MdvX/+0NpDB3Yj rhtHl4JJgsKRxwaTBIXjHQe/ixMUPnT/EBHC4xrkP8lPuOsjsmxnBDRmEVnD1bAZAx5rFEKyJnmB JhzfhB2a8Ayngucb67xAQ2c/eo7lBZrwS+PGL03YpVM/hkkE+yjyS7vTDDCJYJ8+MSvARGU+iWDf 1UF4u9JRchLBPonCGxVJdtSj8CYR7BPaOaGd27Jro042JwHsE9I5UhMZcdI5CWA/sbUeFap7Mv6E Q2LyHdrQYSLZR2VXTjtVHYO9OH0DGKODcHh9fmFjfvn2taXuojw93PE4yJtG1j64urlyR1iCB4fI 8p4/su0zW127e2NpY2ELs1YegAKt3760PMQEG89s+wzfvrl+7+by4mr3FO/jIqqdkD59tOWZWdXZ Hnvv/NHFW9YX378ZtrZ7dGHPUztGWhqnclzQ+8p86KpzHpBxQOy3hkePbu1zNH64YXisN+qoQU8r /qftW4R0ne4Jl2LZMUFveW39NrmA44IxdnP44S4kv9ubrmSHbtKYpvi4Y9fH826LWme788Htmlwf M50586GTfewQIhi79Big7IVLAszdbrv8u9OLb2j5YtTx2YlToYkr33ahhs6hcuOCG04E7436RdKz 3WOjJsz2Tpy4ew4vrt+ytL7rVEOnnyaNjz15Y/7e7uswDgpNM93ZVIVzf+dwarDGMzuXimtzdeGu McImu+6UzZbTavq5cc5unZyzHTxn+rmCzm7aKRcTFHYgIPnt6/OrRw93KCQxOucdxk5a+N3Ip+1O jciJcNajLsudYETWRB9y+rYEPeduXF4+7UhhfGSdE8OWE1/NYQawQy8f/wpQUIJnPSCZwIoc3ML1 vid3xVaHcswy0y2u0xnedYR/V4Ytdz6q6/OHlja7CybSfOfQ6dr6kfvXltfuOzZBaacApRUTlDZB aeOB0jof1QlKe86htBm/v+vpGPEynW5SpnMcy3TesXLv+vyti8vzG939Tka2SucQZ3BsqnQOUf52 11fp3HUOuoeWwsXbxZzcrvI81rPd/cBOlJMb1Qs1LklNh2JJRwWt7TrX492L1ibIbHSRWXdP1gky O427MGRNo9HHZrvGQ3qI0KkRry7c/ZCNy10fu9Cp3ZqZpnMQwSQxTf8EdzYxze6L0xkCz4047VHd +c1TlIdmZA/fuJCkscyoc293B4IJDhjdKzLyKXW7n7Ohr/uoetx0CHHLWYEdqiF3Y2cr5IH751dX F5fvXlxeXBhG/dT/4LZP8q7ORuMTnWT/gztGh25eOnpkeX5hcWVxdeO2+SNjRIx2X3q3ezurEMaG vHZH5CNOXlPOtum+r7rxteuMTzil28ieynHhvcczOd29nZUnY4Mdup+sEccO3cvOnorkGCN78E4D AhiV23d4fXHxg511sYeXtorlarqpLe/Atq6urXaez/zCwubK5tZ252xW+SPbb0lefmj+2Ba0tYEv N+bXh0KY1H7b57W8tLo437ncehASF25b28qZPZtYemD7LQOdd+vQVvXmc/vZ5o4UQ+2M5LMbJq+/ HUff9ZI1n9r2ma4vovDYeZKHDi1tLD04xPziA9vP8Hc+kPcu3jcEf8KtR9f0trHWXU5eG2Ve6/D6 2kp3IoyNd0gkmV9dWpnvFLB+WuShMc16tjBxhhlVeWim2i3OMN0P2bhoPybOMCOi7p2UaRpfb5iF XecNMwSiG3Hio7a/LNPInr5xIUpj6Q6zsOvcYXYPEhjiioy8O0z3czbq7jCdxYKJO8z0xB1mB+jQ xB2mZX92SD5a2HXuMEMg8hEnr1v4wOxid5jup3JceO/xdIdZ2HXuMEOcrBHHDrvaHab7wRsXBHCq 7D/j480zxB4Oe9V2aA+HSSg8KrswhGPZZBdO2y6cvqwbY7AJp28AO/TyXZC10XRPyjbiaRuHmMlo p22UXIZ3H95cmd+YPzicUXwUNZG7Mp3hEHPa9ekM713eyk90/CTEXZj3r7PMOykruu1XaC1WT95t F2kY5LBrbtCh7tzSoZ1gl05fAq0duvZj52l39Mjiwh2bW9zfyW3fydvevQz35vrh+YXFu4czpDce GmG9cTiom8vz6wfWVo9uzK92P4P9D46w26cM9s0foJqXQ88yPbgDkWpBBgpjnFkA69L1D92/1D1n 7dGNY8OcWWo9TrLJjFeq8ykYcR2HVkPMZbS1HDNmmLl8sPNcPriDPMida0urG3Osv9gRbejdjIzm GCNM+KGd5od2Z6neITdr1Bm9E9L1TGr0nk6OZuPO+aWtuLDxwwbz60sb968sbnSvCTdOWGFXFr0b GtWNuod7Z8Hvge4zeWAnJtKZe3xgC21XPhE30hPZYu/yieiRPlpbOOfmE7HjTjvHR1Ye3gixG/1U RmU3hmWCduNeTHyGRs5n6DlYVvR0+OCMD1WYeHeMhaDSOQh34t2xg4zV+uKhoU7duFyo3WT3nXh5 7F4vj/EhuyeOM3ajIDAqu7I9Os4x2JCJZDZyktmM9vt3i6dD95mMtp/Dc1FaHi5j1khGrNhJxMok YmXMRLBdqNMoJjqNkeWEJzqNcbpJ3ZNEj7hO4/Rlu57oNEYYZ+xGEXpUdmWi05joNEZVpxGEyrsP ry3Mb2wGwXK4dHC7zAw7id6e3JkTuDPlc/nOdJ785M48x+/Mc0tPe/dGOLQLWxQf292oYVLpZlLp pg2lTyrdTIpctM1EzU4K3Zy+XLujQhXWF1fWtqqZ2qD9I196emn10OLhpdUhUkKsLx5ZnN+4eYjS v9kTO0AVJqW1I02YlNaG8UxKa58a81d3MpZdMXn/7Tj8rres+dS2T3U319ae7awEGfVq1EOwYJN6 1B2VR2NZDHB3JlUZpozeaMtKk3wqp/HKjr+udbfknN8tGeefW7pvoHhrgeJ9cP7gFlkoxsFRWe1C R+Uh5rTrHZU3cv5s1xgpOjvxTWwU/RPcWRsFHMjdZqXYgSr2O8S8TsS9tVER94a5SBOBbyLwTQS+ icA3EfhOTuAbrpzsROAbvTnteoFvt/qldXZfn4h8E5FvO0S+zgdyIvFNJL6JxDeR+EZU4tt/41u1 Ovjm1UNR8gOQB8jB29dW7wxdYHGoGQLftHjf0mr+w9TtR7gP/OnuYyuBWw6M8/r8vYtHF9amZ6aP Lq2sLIahLKy9ZkpN3xj+veehqc2p126GWd4c/nbHlJr1zqu6mlazpipM6cKXWpeFK8MXBQAfvnij fVHDl9J4B1+MsrUx0/fMh170tMJ/7jkW/vKd4cs/CaCHpt30bdPvfo+aPgSvvWtqplLWz9alNtOV 8fWsL6yfXkFwMattweDCFNMEs8bmTQnodO0I6HQ5vQCPOz2rVFkB1ASo1tDUVbNKKxuAzs1WpQVY ocNkK2gYfq2Uruj5IjTwSgO4ni0LVWLbMry/KKFTFX6uHABLNVuE5vymOszkAHZQzdZVDe/yfraq Qr/UQWkRWKhZXVoBhmF7ANpZ7+uCR9AA82RhBNYh0IcNMH76XVMNcKlnnVE1tg3rVlewWmVYoqLG KZR2tq5xtcswL6cMvawMcy+xg8qGttRBVc56XSPQzWrncQS1D2uIHVR6NsyloOki2OXgViCOtg6j LUpYxiocHlXBKoRtmTW0NGU5W7vCIjCsgSlxtDaMgF+mtZu1ykMHpZ/VVQED0ya8QtMahPWyhUZg EdbAwe6G/QiHlHYXwKWyWsBmWmA4W4Cl50sdn7fh7ByQ5w0uQk9bU/m+Tq3ve781s1rLvLw12NbW szocluasXBHOsXG9KxDOn67DLjVWy4e2BW1iWldfhWNU+GwPcATh+NThfjX2VpcunD+8c+kU6HBO nMV1wRPjNI2gB6xMS9sAhA3XobfSmrpxEsMEZ8NJMI0zmwHlfOPLAKzx4stdmEOwD7ur68Z10mE+ zlnXuHi6MrNwP3suKfSrFS55utC6CjtV4TKmq69rTX010YRRPqxulSOUcCzCbHBQCfMYXcKtKZtI CqDhiLsGPgOgIbwheA9AztdZM3m6MJ6hSl5TmqIgmLVWYMprgoUzQkcY+ywQ7/lwHV24TXMRjAcr gE2YsrzfKcfAcMsEqGpDwLDqBY/KBnRI6Dict6rGCYRlChsK43JmNjTBva7NrCpxT1w4jHBs8GSG 5a893q1w9kMrPNphp31dFbT8uqjosIQ9CXtJu6fgFtHJdHIPkTTgBsDd0L6GDTBhy6wr8HKFDkpc /3BPXRUODd1OP1uWuDQBXIfB4O0ENG/gZaYOZ5TOWkIP4UZjB4Qe4LSVRbMtbJc3Pb3qQH18qXtG ABgy3ArfGC3g6FKZojEvFe6Or4zvWQMgCJW1vrFeQNNcibczrSzQPwtkvLkLCh+zzR0L1D3MS1WN vQX6qwyNIDsHSNaJ0KQzk9P6eLoQWBiXncQD3AFvo5zbOQEr1zjiAKuUF75A6Z5XxUtzODAdN08R UuQNqoDFCau2guBArwq8aEgPCakG1qdG1BOwcs1oyoXl1bg/pQm0rOKTFxbNK0Q9AayVIQxez9YK 8QHsVakt4URvZ6vCISuADRwja6FB4WTR0Q+7ZnVdEe4LjI5lBB5mX1penkDiCP+GCVQELBCLwC1R s2VV4C2xYayOSVgFA0dMG5oWTAACorZWcEpV1jUDA8uHWNaENfVMghBcuQw81w5e7gdXNF2gCwqH BuyWtYlaEDSwVtbTKoa77lVhaRvC8cbnS2BQELWF/dJa8f0Ni88IHDBEQUsT6IkzeFXDzEtF9Kr/ HMAhAdYHiCLO2QZ0pMLQkCkNKMvUFd93VeHIVPhGIzNV2BJD9zrQI428VwDWRbg+ODJdyLkJiMGH WTPj4jQSIRuGC/wtAJ3MwTpAPD5ilrLAGduC0DpzPg6PP7AQjBxNWLsKaXnAcnXg1XkEgN+1I3wR mHx8mQ50rkQWNmCD2EG4aI42JyyztyWPAOgyHcdAWMIQuK3VtLuBxVZOOlBVzbwPohDivcJ59IYv CSMGWBjDHIIFnhHRswqzsd7SQaiBbSDuTwlnHfotmOoHqms9HdJCmK9AisLm1nRznK2YwARwVWG3 gPsqX3Lb2pZy8lVR9AADFwUIQToQsAtclOf313QKPHAK3GlgKsqCOQlXeT6fCpYDyWnAw3ijAehF tnFALGkAKhxDg8Q0AJ0veBMDr6xqYjsCB2QQ4WmlBXc4oEoMCvKbUM1ALPhxBYwD0wxkhqitqlDg CViwKEp5va8YhyJbQM8HcCWo1TGeDECjqsiO1JUAbcHMTGKfVcA4FVKysAMmcBKEOgK4ciguwMZY zxJAoFs1wxRxcwoITc3AgABkXUuRAAqQ/jQ3Da81xCKWgSzI8wWx/2EpAnsclzUcrA== kgiRcPXheuua2BydhBUD+84bW9iqjB1oJ0KjAvxBwLLysgl8XMPCIAVHoCoNn6xwCHzgegEcKEw4 UDzasHwV98pIB75VwmW5imegAZUgkxJOZsBWFfMY4RoyS+cs8bMZMFx+r+PzDA0Lg2iPgKVFUboA saUw0/ImkU6zAYT1JDYrXMNwayoebGA1LaEM4ehws3BWgOVhqnI0mCEqAYXGu6FZigvHSLBDOFsO 17UAJquSDsJVZ5yDvDsyDXXYJYV0MYxAG9yYwKQGvsAxeqhYZK1qwEm8AiiqIDcDYFPqDAzAwIYp IqEBETnD4i1QVuK9vCfegZg3V6AgGKiwq0vNwnjlabvCOTbEPaogIwVsyeihIC5CBXnKaHzeWeLz WqkUkS9gDpCaNckXcMZG43VMnQARDeKKabwOBLmATXtGBs/XvZPQgavRqme6OixzkK+tLI3mzSkA Sdh8GeeEHSvwbbgTdOyBQbJpzwrhpTxypbC9vmBxGsEijovEFoDhXXI+KtKUAIsWrpyXo2RKFrKD HFA3Dx3gZiXAdEDDygV67vgwM7UOPHJZmrp57AOQtR+NKxLIcVH7nusUgKgGaFy8BMzvaAZN1xnf hYxMdvGDTGptIUgCpFvqoCA0lOMTQDckCWWIB37WZR+SApTnrG4iNA/8U100UV8AMn+GaNIzmgyj QbrfQKlAIZ0InoJ8w1DDMhe9iBpmYHC0GVIHoPamgf3heUvoKCcUAWyLQggNE5UA9JUwQUx9gJLy aWFCdYBXIGAxkduBrM0x2BirmyQQgK72TWIJwFL47ERYPTAxiQYTHxaAgR8xTWodgDrtQaTsYT1L Y0zOA4SHrK17eIXwfqtU1ctXQF+kj8h4EPga8YNwK+G8ea/4DOGgqAPQCnsnXBAdDQstikLYJWKQ M2DOWmXgxIYFoHdedoZ5q/CqgCKqXuYO9L4lbW3kA8NgWSOUMYzhcpja173MpQ24hm5nxogGZr8o 8RhlLCtw+6T7abK3FWGQJitcigyYM81l4IIIQeUMtg2SkicSlphxlJFr1jwL2x5aKocErMHik2gC 083EAVBfFAUrRaLgEPCuq1CayIUM6EDjJmQCSXisMLZHdAnI0GpcxIaY40Ghh4uYiUQwG2uaslM/ nWICZsGqQNJLWA4btmyF18aQTAIYjdFUGKRnnWF4ijrO9LascSThJczHetdsqkhr0egTNDie9Cf8 ftpcC1PnFQ+IqWJRrSRCA+sNZKAxAFjvyrGGIKxHaOB72oICgBBy6rV/BVg0BTUE8Z4i9KJoGshw bbCTJCCDCaAkjISiNM4tA7LUTRojuG/EKGfiPFg3WCELF5JuNLxLFaJmKFxJHIohNUJTzwCMj+A0 UUkA36K82HZYdwEsliY7Cuo5lKjCwuoS+kGVCDatQaND25h0Jwo06Zb1yahnOcDCSuVKvruobySG stDIcIj+5p1TxNYjJsl1PQGNi6IkKoVgUIXCSaHewLEVpYIbXzV1DEGoCgPwbARhbUTLJsLuvvYd YoUjvVrAb0z7EKeJXYxPG+i8QfQgYCDaOmtLwMAVV7zKViXLmC9FFV6DSoTUfb5EQhvQPaNYJfwJ Ivlwz3lHCtR5s/gYyDCdNGAbUPaCW0RXHs5J4A8sHQnEhXLU2MwQjoSFp8heZonMAakn6wf0Wle2 pqMaOZBeME0XgEoxD6aAgRDTGIPhhogqVYE+GvcfFsmSIQ+sH5Vsqjc1m8YiY1JZuhi808QshLMc JB46lkF6K3HHwk7XIBmIaYxVtAJuBYpprLY4sABGtSqdbCSFeFicyIR1jUirBHLBSn0wjFWkFCx9 VHIZNF2gGiWsliO2JBCfcNENXSElNgUEk+IZwECTBIhYHoBZB1XswNmaERzqdYv+trXc16xXkczz EQCtrZyW0RL9tGDKJJ1RmhcwbEVd9a6BB/0SSptxtQBLWdrCtKoeDLSmznaA9Kqgh9fNnQW9akDz vnEGQLGqFN4vPC/h3pNetAkmFN8PJFUnGDLRIJ3OIRilAqX2jRObAeV0iwHLh7OR3YQ5BodLbxuX CWwobLlN1w41vjWqYvIriq8ryYgVr7MGDO2JRY8XH6w4YZN6kQRYfGpiQhJCAdOY2MQj6gE7Urg1 ugdNoXWLpJSE0gBYFVrs54T8jA530RQua0kdBMRKZwbAxMkBMBrXKufl+cSMI9d9gJ8PYi3LWVUR UPScgA0eLwCT7IBA9jYoyUZKg61L4mVLssTTuILQXiJB8lpEPViuikR+QxY8WllUKiDj7SJ7V4Hc iuvlSpFTwI5J3F1A5Kham0ENP6toQA5zsrXhLJsauUYgELQJcENK0m8YH60JxDdHi1Up/GU4PQ4x dbjCIr5Z4FVRU2lA10L6+YQjwq3GDg4wF2Vr75ttYReM6uk1HBg2iecjACwZOBHXGC1qSMrGrIAl CTxY3bMCSGpqVB+m1QKqplzh8mUF21joyvbsABDLkuTXtFvKgb69Mo1tRRpe1a7nCCCYKE06Lhm9 TwcLgaRtl0N4gDtghCpHdk7A8STz8UanGaIJ6R60MBe5dayW/QHbEQhJYh0rLFLzsNQihoEEX5Al rEh2VeD6K1bxo9lcxOZAeSsCF6z58KgIMsyfiZomSIpBvDXEuDpSsfs6qvOBdNAlARa2KlnJAp2L cawmgzXqmcjeHA5+4XDbw2kX2RKcIrxjrrUqy2gcQ8RLNk0mAhXopmrulF1cAIMHedHS+1GOPTAV wVUGnmsHL/eD2TQcgIGw4es8mUWFZDA4rExV0CJWwNo6NlKGk0WKuUqMgeEbGFjJOGYFiYOekt0j wBukNuz4Ifb5/mOQjGOBR4A5g7iuq2gbq0ipEi47GuuJo/Y0MJA1k1kEaRLe/8Cbi12mlFMTZB8l prFwaRz1aW0hdiWeQZCKkUGNWIX0hRY1mqV0QApxYCEYMQaJj7WIgOFAoUnvR8xeEbao+dCAGS3a JGIHRTQ0VCRriVeQOK9UJBXQaCuyw4EHkKZlCcDCS0vEIAssnopOPCAWRwocsBkyjwDSJ1tbavAF 0MQjoGXpAOvvA2fN3Je4EAHVNZ7V78J9gRHMiXIyMw86wHNsmcHTTkAfODE++Ky/T8BwThT7keVQ sLdW8i5Xkl7MAOalTsO4HbJfoL2txbQUlqNEQgoKLFWxsIYaSWQlogknMGd1wRqsWvT0wCojz0bK KmvFWmNKQe3GkM5XhfnRxQciEM3qAaxrYXxEfROAKOUi5kBtG40g4FrhW4AnFONYSfo+wKxshAqw UtQOyhCbB4KpcizwJAYarT20/iWoKuYY6MJB4G1xlcgAhTVsxwSUycDSlwwEM55Yxth7CdwddZQh qpKERi3OAvA4kTZUmHobJ8VWmcA1C1evwBZN/I3JZRVHNxZc1JJpDpEzG8yQYFCv1tvItRQCrNlJ pUIVzQKbhbSu2YjmWD8OEyCmBToVjFOTLEAqyEKU1uG4cbfekb8m3QxXFMzL1c72AAuQEp1YthJY I9IjmCW/kyAqF1aLua2uHOsxGgMQC1IRVYBaCY8JPEm0eDJFK9kUIOdCvAMV+WPQ1ShJigM9jYmW WFAYEhIodKYIUa5kIQy5dzpa4Dmn2J6BKnaSTjUfLUc2LlLQlLUIFXX0VUKwYAeRpQNDWpcudzoT 01hVCwn2ytfMuClS3IDtgtTmIIyLV284x5YJM9jGSpJlw1Vm4wl0UFaWVWWeRMZ+IpVMY+w0lhEv 9BmrXLMLsIyVbD6PLwNJTjMuyAYGzIXvnQSYxgpa2zRdMI2FsxqXxttoGitZ8uZlnGNezJGvAe4E HXzgjlTcMxKD0NhiRHQ3cMAWWBxmcUG2nTixMor5RZBMo3EMfpPjxDpecP4TLww5eGAqLKNrRjyk LuAJMvvheSZ6DUpihwQsO/lgQCD9R+OWgLNZYXtuFBi36lo3rl4Gy29pAmc3Gt9F3HK6+2GorHQF PFEKAUSLjzZNnAI4x7mqiX3gd5ZwM0QFkjH7diSchs6lRd3EfkBf2FcLjlTtkgmHXIwyrAq+faqy TfwLVkvr+3C1Sy7PEa273OFC8D88r0rdQyoCtLZWN6kKnH82tiT6A3KSlvcjrRIuvyx0TtfEOFbW cr6FBgYg3MgGsQSYFX/+RFdBY8Bax4IU9jNoI7alaB2FWoeWZdqCSNkDWCyUiQsATo9M+Bm/ACMo KnFMjbwF9Fa6qsmH4NeiaDAs4cCz8xfum6uTaaq2Vtigku6BEp9tZJhI958BM94qQTM2DMxg2sjO MG8VgOKenjN3YF0go2HGCIInAGmFMpYRvJkLEvVy9jIw1iXdzowVRZtMqZtMK5iDyDm4yeDCndC9 zHAlEmDONoevXvex2NbB1vWw4yjMluwHLIw7mNE0krAGkw/qRW+YLMQOtHif5aJDLY7zDTHDRufC TCSx0SEpii4OvMxwCRtCDigHyJ00E4jg/ijVIzr1ESoxjYXL7ohxdUSKxDRWabkK4kEAcQaF48us uONMc8tKR5JewjIpYSdj2+isl/UaJK1Am+tsBLS54HlANNSQAWcGJR1WKON6F745AljvwJfxCAKB qgvXbBsW1JEfb9Zr/xqIcQy1t+zBCzIv2cbY5z8Xj9EGQAgJBWm0a2dAEboPsBXMlqRmzcR5DP1h paySGw1Gj8KKszy6mZGnj9G0jknNALaxhNNYIwGMS2HkmrPuApisgiwpqOZwogjz4ODHNxpDYpij I0Nr0p2Ayx4ZrFjLQiyhF89TdJklSzGw2lXJQJQa3skcPKKyXNEDtrHakrI+qoSQeSyqqDco62gc Y4Nm0jGoCh3W0GQStRH9m8i2sXdM7T943Y3rG414yP0Hbwj/TtXT17xm+p7/Lgufo8C3llC4t64e bka+6ekbj3DcWxVWIdwB+ELxbyX83adotmFC28CvtlDiJoguoys94DA/zxcFHFxQVxnIU1SgavE0 FWA00BMlEPAcowDrtW52ETAma3Gyl2VAHphgVwYDOY5hNhkYtGW6mG68rDDRmpAGJkAxu/M0BIz9 pilnXaTFyV6WAXlgB9rXdw5OyiZsLuwo/aPxn7BzhGIKZ4RthEO4wmAV3a/i4gM1EtdRVsii1aqW 2xnjgED1Y0yhe9qG2+mjtwGzPAFLOrJdAnsT6VLAqcy0AMevSAEPKi2OWgIWk/ijDBg4c5A0pQMB F0QJGFOTXg+M76TqDzBYcOI4yqrWCXuT+BDA4rxkYOfRB857kuYJWJOOyIOMVcoM4DHNEraBfucY HPhZS2DlC9F/1ezmg96xEivH9AO8C0th6U1BAiSCTUkMKQArEucNsWgMJM7XG9KDCdNhSR4W8NxU Y3vhdexHB9477O3ryMxGQPZBDsDAaMiKBQnDSNvoUhOku0q8IdH9nYCBk+dlRL5JZuY8aZmBzwxM /5ycpaIWTlfVccIBLfNO+lrCjxRr2woIlCzjTgS0y+BSidK0qC0bElSmhoxA60UEaQ== gNljAtSYqmYNkJYbAqbISpy4jDDK2QQqUIZx06ISmDiBoV1YxBoEysKKliBrG3bROL4LJauoTaQp vqIIBNlxOeIlecUwS+q1eHdrW/YBcbsWhMciI7SAlwVMPlBwHz0tIgaGlRKdJ3xTH55h7g2m4SvW L+LtXRHVsXVlBp5rgsFj0Jt4crkPhi639zx3SsnmHev3za8u3bc+v7IyPz0zfcv64sLC0nxvCPnp IKN4zCXaClVUK00wWOdqljMNxCxY1hCVvqS9N2QmRCIopivQtlMUMUj14FN3QDqwIv2Jj5iPwoQm Mxy9P5xSNjjg7REXL8tayaxtHQfgY7AryCI1mRfzAVglshM4K3t2MgOpWGg7Ctt8UcjkAitQRA8M BspqzbUvIhyP1pNxzQy4CIUzXWRJC2666UaonXPX2kYskMln6NQdsTs3l4/Or24shnOwsrZ5dHH6 yPriyuZGk1vDE4ZZB7qeH1WRqx2J0xVzYQkK9lxNB0UX4owA9lxtxZkQQ6wTcIGlYbYCZW1BH6Dr stlrAvIASByP0CDqoRNuo9OybJw0GoAASaUcB5u1TdPKeu1bgYWpm+6NDNJN9wcW+Jp3rEIuikPT 4YYfWlpc3Zg26jXTM6DAADkf/VemHTiqBtIfTmhpC77B9N+b7pvSgbxOQ/wvuCLI/2cQysieDPxg WAxXavqmFbQ533TTZJNOapNgbwKtAbVa6L5Ae2HYnFkFisyePQobiKI3eN0UPv1/Rn6gmVSUnwGo aqBe2U6BtAQ6Ae413D1MQ3LL0vLi9VlGkrvmj0LmknDzQ5tbp94dhzGDejT2ZS6BqQndv2c6UKvw J1zY+7duCz9Se/pTTVvg8Et8LkCm1dT+/TiKm+c35q+fBoF/6p63nvvsMJ8r9/5Axz9DdXvK3346 RnJibz9VIzn5t5/kSE7tAE5gGKdjAEMN4/QNoOMwTvcAthzG9gzgOMPYzgEMGsaOj2H7B9A/jB0f w04NIB/Gjo9hZwcw+TP5M/kz+TP5M/kzXn92nHSOCP+w48PY8THsOGs9gvLF9g+jdQDbOYzjDGB7 hrHlAE73MDoO4PQNY6gBnI5hnMAATuFITubtp2Qkp2oAJzCSobp9XvOzZ88Z8bNnz/OO89mz96wL 9r2UP/suOGvvwNZ79p69b/8b3nbHnfi5421v2L/v7PbW0PKqm5c+9Oiv8OfRDy3dfFVr6zPOgpYf /q3P/dVj/Pmrz/3Wh6H1WWf0NN17/uUHQsvPf+Ub33qGP9/6xlc+H1ofuPz8vT1Nr/nuD/0mtPx2 WqJvQ+vf/NB3X9NovPf817z3Jz/9WKMlt37s0z/53tdkjc84/5r3/vRnn+htSa2f+OxPv/ea82XM e866/Lt/8rNfe6Z9s5752md/8rsvP4tXY+++Ax/69BMDmobGT3z6Qwf20Sj2nH3V0m8+9q3Bx+Bb j/3m0lVn76Fu3/zhz3+jZaxxzN/4/IffjB1jt185Treh469wx1t2mzrec9b+rbqljveftWfPBW/4 0OeO3y10/LkPveGCPWfse9ujf7VFt6Hjv3r0bfvOOOOld370sYFrK59nHvvonS+Ftr/Spe2v7P62 3ddsiL0YZo87nZ1nvvo7K1eHQ9nhTD779F//0t0v39vprD/ztT/6oTe88IxOd+ibX/rIuy/Dm9zh bv7W6gxjiA53/uaX7h0elwyDowbjvmef+WYv7huEU595+mtf+ve9OHUArv7qX//RR1b7cHU7Dfid X/qhd8+8tI8GtNKWlbtef9n5gylRg2Zd/fIXtnQaWzdo4dl7zzge6Twujd2//82rh8CkPHXPW2JN DjZ0395wI85dm9o8C1Z23rNgx30rOrg2OPI/gXxZahac5yGkS09DnIu30zO0yOF/uiggI5Qr6vAV k6N7q8HZYQbyVIE/8gz440FAS/wSfyHXRkupgysKfEjuDu+I7ksDXJyumYGcr9rXtpOvFDguoaND dFwK/zs0VYiP1MH249IDP5EDg12c1JHBHk7u0GAXJ3Vs9h9cPdmNiMWGwkM3vnX6xs2NtWm6xksf zEoE4Z5NX3PjobV7Fw/e+Nb64B33Hl1cf3Dx0MG3LR47SI2Oco/5WKavu31t467FhbX1Q+E0w89b ndTr7lqcX75tPvT4gdB6+poDN771Vr4Ebz+8tr5CP72mf0RhFe7eOLa8eDC9Pztr4U7duLq2Oq2r Eg/XJv7D7nNNz/hejGV0DNbjpJErPWBH1VrEx9xx8laJkgVn8LowGVA8e4u6tD1tweGdYs6zXhOQ R7Aw1QSXeXZF6bWSTLHZAAgmTvIy1tQyTSrrsm8BwH93AA647rb5ow/gNzV93U1ra8vT17x19cHF 9Y3FQ7QdEXzz0tH5e5cFfM8bwn828fdAOfYfzD2pDvb5UoXTyt5U+w82fKSsjj5SWnykwn+0In+q Dq3xR3yC/ltlXmPsUHWw4VKlrQWPquNQUvz88/jtE08HzuLp38Pv/4kZjd+Bv/wN/+Vv81/+E7b7 fXjmW5847htgXEKVw4K+RRYuUeb9B29v3zUtmxJu0vQtmx/84LFp2MfsAu0/CBse/VcP3vM6vJ6h K2oUe5hbWn2gb68PLC8dORJwRLq34cb2vIGW2JAj3XGcWHvIxOk7hxka2IXn8WXx29Vvets9t934 Wvx+5Z3L3/c/fP/anVfCX677nu/9n/7XH/r+gwb+csWdK9/333/f6nftx3avfeN3zn3nm66enMeW 89jjzd/D1GjCbwMIS+8PJ0BaqIuTIi7UxUmQF+rgZAjMQN7m1HMsOYNwPJRyEh78q4FzmV9ebPju EwMSDkOvE/FxztrQ/sUQdO8lXaaGpGvvmXbltKta/Ivb2qJ/Mban/27lX1yU5fD+xfHzJv+Dx/9z Yt2ewgFsz6hObBinfEgnP4xTNaRTO5ITHs/pGMaJDel0j6T7eLZnJB3Hs52DOf54tnkkxxnM9o/k OOPZqcH0j2cHRzJqg8nHs+MjGc3B7Pgw8vHs+Bgmg5kMZvJn8ue5+WekbtNkMOMymBEZzwgyVyMy ntEZzCjLTTs4mP6R7NR4Bo1k1AazzeM5/ki2czxdRrI94+k+ktM9pBMYyekYzwkP49QO6ZQM4+SH dMqHcQKjOt1j2IZPv/U5ui8ePz6Am+4986xzzoXPOWeduYVb5BlnnnXuBS+95LIr9+/ff+Vll+yb OvvMgQ+Exue95JIrrq3e8vZ3vft73v2ut7+les2l+84b8MCevefsu9zd+s5Dmw//6E//7M/+7E// 6MNH3/ud/vJ957R4f+454wVTl+jbV/7Fjz36737v05/7whe+8LlP/96v/9TDK7frS6Ze0PsCdBR9 48LDv/jxz3zxLx57/Ml/+Id/ePLxx/78s7/7iw8vvLEv0GHP3nMv0ndu/vh/+PzfPP4P3/xH8nH9 1j9+44m/+fx/+PHNO/VF5zban3H2ReXBhz/6yb984qlvPfNtcZ/99jPfeuqJv/zkRx9+X3VJ3n7P C/bpg//Lb3/hK1/vj0n4+le+8LFHFquLzj4jDWVq/50P//afPf7UM30+v99+5qknvvzxR96n970g +gefc8kbNz/6hcefbnVq/vbTX/vyxx6+c/8UD2fPmfvMwo9/8itPDXCB/vbTT3zhoxtvvJiHs/e8 K+54+D/+5dcH+jV/+6nHPvlj89e9+PnoMP2CC8u1X/x8q68yf575+l/89j+/9ZXY/RnnXfFd/+r3 /3bQUGg4X/3MT77nNVN7ceR+5Zf+9MnjO3p//cu/frTad+ae5+0565Jbf/Djf3O8zkP3//jY7z38 lkvO2hNW8bK3/8gfPb5VaMPjn/7Rd1x+zhnPO+PcK7/7pz735BYu9c88+fmfec9V50Hz/d/zM1/4 h62af/1L//vhmQv2YvOf3bL5t7/5F7+xCXPt2Pwf//Z3f/CWi8/q2vzpv/t//uXcpWefpt7zsQ+1 MsOt+3C7OuSZGfJEDnne4TZVR375i8frPr9NcFfvOm73jbsql3UA3ujDBIQKPvblrw3AM996soFn YHH0+x75+JefaMFioe8n/+J3G1gMMGq1+MjHWnHkU49/+Xd/5HCd4UjA15dU74sYOLYNGPjJv/38 xx45fH0DA+f4/YlvMHpH/P63f/r7v/jw++pLzuulB0w9fvezf07Eg6jHJ375X63drnqoQUabHv6p XyfSxLRp9bvKy1vD5JDy+e9871EifEL5rrhwAKkEurrv0tcQWU109QUDo/vCA2dP7SOivSXVpgci S7A1T0BP7OkWkdjpc/z4ioHRFaqKSZA5c/ZKEww5BA1liNaQKLZi13NnYzU3qTjFQIlucL63LRQE odzXWa8JKCOQ1JEMhlIOnHQ29QqFscu6bo5AgBLgwaPN2qZ5Zb32rwEGWLRFVXjDURUVLONMHZZz Viufu1hiokjM+Kmw1C5Uly8gCzN8gSy26ScsF8CvxkLJhZ2+Z6X34XrLhy3Uo4O86jct5A9bqAJV uS3fDLUpDKapHPrNkLwXsyXftJCCPhSmLh7o0djJh17VsVZ9TTW0VppgB9W5HBXTK6UGPVaAt1XP uWSglF8tqQBk1tZBJnZdN3tNQBnBwlQDDBWheD1Sr2UplXXzc8lAKdTIo83apnllvfavASyynqxU p5XaOkRKl3SZdVnC/7Egw0wFxQxKiJPSkFy9516rWa8s5m+HnNQW6ivEL+k38npVBddNr3y4hHkS WBW7pS0MqMooLUmnocrECoN1XXIpEmO1FLXgSrtQ70cKBhWUqJ2AsaiANVBzjsG6omzccGNLqjik KBpJgJXkt46FBzMw1PCuJPF2pbBYMGwL+Jw3RlBCzndJJQ+D9bzbUr4Ap4XJ+EOnqqjcdOsSHBiI gwtM2gvJwwkFQ40b05erN/zmoCRTHVYIaklUqhIcRpVBXVxdeHdAdQH1QpwRIC+oNnH8h6qCaogG xBceslCAGupXbfEmD1WJMESu+5ug5gwUHUso9rTG0ZyiMIY6BibUEpgQqHn4f2sYQ0tr+JGeoP9u GcZgne4SxjD48+ZD73/wA8fC5wObRw69OcEPHPmJ3/q/P/Xpz/zxH3/m05/6/X//E+tv4R9uefg3 v/j3T7E09cxTX/2v//GR91wHP7h/+ht/8XRD0vibj//L2/CR//kTf9fkz5/8o3/9Tnzm2G/8eeOZ b/23j//Q2/A9t/6Pv/Wlr7Ig8O1vfeP/++LH/rfvUTK2f/1/feKTn/qj8PnUf/7Ev/vx9VvSuG9e OLL5EM9n4dYTX5exD8u4o4lxjxuaoYFVCZjHnAzmCXc0j+6AkpQD2aGW0Gc9Ie0nS9prJu1QKwJI O77BBRoVKIuahfoqven3Z70LM5qBOtoOM+/HL/wLlS8qsOZFwMkainkmqj4GOBmKUxKWhTKsnDo+ IFPdipPbWmNwBz5B/906tKxwnWLLTv6z9AOLW7ZZ++Gf/z//5M+/8Bu/+HMfPjKw0Q== Az/yq196UvQhX//irz5yf2uzf/qpx5t4/O/+8J+1vPHnvtyv7Pnyz6/2NPv+T329TSv09U9+X6PZ 9/6Xtlbw+eyxrNnKpwY1e/bZT62kdj/z5OB2T3wkNnv/nw5u9uyz/3VT2v3cN4/X7ul/w82OHLe7 Z5/9wpEu3YXF+Tma7BeO3+zZZ//0/dDukSe2avf1R6DdR7ZIxxIOBS7No1s1e/bZn4d2v7B1u184 He06jO/RYeb7w60nNP88+cPQbnWL7Q37QUfw17Zq92/pHPzYFi/+6o/yudriIHx2jQ/gT331eM3+ 7ifkPD/wh8dp9tQnpLtwez8zsNnTf/C92cU89ieDmv3n5kX/Z59p3ZWn/qDZ7HnPe+jTLbfk7z7x vc/r/az/my/1tHriT35ira9Z+PzAH/599vLH//gj622twmfpkZ//jS8+HljWp7/6+V89DkKFz8oj P/Poox955PiNTsHnOcmqZrxQG9c6PC/Uw8DanPuYcK+nn3stSpQzYMOgoq7106hoNs7VgxTNkB1l 1peujP/PlQlhHr42XCutrks9YVxHhnF9XhfbD5iK9u49Y89xDUV79ux9/plnviB8zjzz+XsHNd1z xvPPPOvsc887//zzzzvvnLPPOvP57QazvWeefe75F7zoxS8Jnxe/6ILzzz37zH5jWejsrHOnXvSS C1/+iovC5xUvv/AlL5o696zeLsGYdt4LX/Kyiy555aWvevWrX3XpKy9+xcte8sLzek1qodn5L7rw FZe8avqyy6+48sorLr/s1Zde8ooLX3R+aJh39/yzz3/xyy66dPryK6+6+prwufqqKy9/9aUXQcPn Z34je19w3otedvGrLrvyqmted+1M+Fz7umuuuvIyaJhb/vacec4FF1506WX7r3ndzHUqnBitrpt5 3dXQcN8FZ5+5J3Z31vkvecUrQ7NrZ5WxLnysUbOh4fQrX/7i82Oi0D3PP+eFL7vk1Vdefe112vqi DJ/CWx0aXvHqiy+84BwZ4d4XnP/iV1x6+VWvmw1Htqzr66+vqxIavnb/ZaHD815whkz2gn0Xv/rK a2YUVKi8/obXv/6G6+vSm+uuvfqKV120b4qnjK8No3vtrPFlfcPrvyN8Xh8aOuhw+pILXyjtzjz3 RS8Pr732OltU17/+O94YPt9xw/VV6PB1V4UXv+jcM6UdDO/qa5UtQndvfOOb3vTG0GFV2Ouuvery S7N25734Fa+6gtt9R2j2pje+8fU3hHbq2qsvv/QVL+7YX9YOx/e668J00/jKvvHF+WrH8w0LUxVO z8B8X/bCc2Rdzr7gQlm/Mqxf+MT1e/XFYYd5Q3B7aT9CQ6ihivuhQneXhWmEDZbjcu6LevfXWcX7 +8Jzzozn4Oyp0GHjvGg5Ly/JTuoZZ577wgvDMc3O3+zMa0MzOH/npJO/5/lnhWMP5/nq175uZmZ2 Fs/zFdN4nvM8tWC6Dg0vnb5i/1XXXPPa19L9eCXdj+wi7aGGF73yVXjdwoW7bDrct33YLL+YgAzO f9G+l1/8ynB7p6fDBb7korb7Sxf9ghdf+PKLLr74kosvvujlL2vFB4Q4zjn/hS9+yb4LL7xw30te /MKpgF9aMdEeMKufd/7UBeEzFRDWAHyFBnjAbPh5AbQanLgXmsJn79aW9z342aLRyX8mjOtJsUEt KtdqcKLA4zCtUHizpPKxXN08g0BNamJXA49pLVe0rVVh+9hVBC5I/XdDVYhTWxcmVFZVo9MMxi4M CQJ1ujW5QMTuPFT8Nj2csgAXphrDzNqm+aROG7Me6PyA2m8NJkc1jcrvyhbHY0j1bFWacjqgRl/X RYMhdSbO1QaG1Jrc7yE8GhalrLZ6FMpPa8cmuCK8TOmi49tuGv5tPswXcl+OlRnOGeGFofA48cJh +kH4aeWcW1rDj/QE/XdLzrnQJ2mG6/n429/13vfNz8+/7+B73jXnen7Uty38ix//hY/+6q/92q/9 6r/95Ud/9Afvu8NmP1///kd+5ROf/bP/96//W/j89V9+6b/83v/xw++/Pv58w7FH/+DP/v6b0R3y mf+fvTf7bafZEsPyD/B/ICVRJMWtu0k2Ny3cF4mSKJHaF6pJNkVKJJvqJr97vw/OIEjyEj8FyEMe YvghiIMMggQxkDwE2eDkzQYCBIYdA5MFA79lJoBhBBgjExupqt6qm71x+X3Lvb+5d35X7K4+VXXq 1NnqnDp/9c/+/B/86d84kV7T8z/9X/7yr7Vek7/+v//hf7ag0Ws/+7f+/l8shxj/5T/4Wyy6Gu3w b/zdPzPwzvzVn/3df/0Qvf+T/+r//Ovl9//if/8v/wS9D379p/+rgYf2n/3D/3gSRgNo/rv/w5/r G/yrf/5n/83fvBTHHx39+//dP/kL/Lbmf/lX/9c//q//vfeoNEHi/t/8j/7eP/qnf/n//L//37/6 l3/9L/75X/zTf/Q//of/xi2hIjD58m//7f/iv/+f/8n/8ed//r/947//3/7nf/vfekrrlueqw/3N v/V3/vRP/85/8O9MO1cJoyWkL+6fnu4vU47W2+H//VEKTEMp6YQr6+RjWispTQUlfvmckTtH92Id h454qe1GLh3xft+NnDri/b4buXV+xvvnovoe9L/D6UQsTSVIIuWO1gGN+Ns8MxXgbbgZ8Eefm7gF ViZb0GeMNIYrDsatfIzdDSx/YtGEctCEtm1i34Ik7JskdPf/1qfCnJn22A7kH516CWzPmQluV8Ql ZYLLleHQ24GzJTAykjeGo18JSOnl37O9BYSqXRfD25hT3+TCRcrwwkVCayVQMo805dTwTsRYJJ5K I50bqJXy3c/qU8BFaCmQDvI6Kg25U4oEr5OiFZHEfotaPBUBHJ3WNiOArkqieDkMoPpQ6lu8qV55 Cm8MT1JieJkCFGjRCdir3Lf8W7RAlCFizdTJYACX5m0eQx1wq8G/GikFDZKkKI3CCcil47QWdCom IgAYCykqEgeSQt+YiiUidAKZMnJjoLDHIokkmUgaQSbT6MZSpfHERVFA2qSXhwGlELxqVNOYjgDD AKnT2sbiMqrtSOiKTseX26GbPB01Bc/pGJHWNjZBA7boGBqs7BY/EGTArkymHN3ET7pLLqhppCkS 2ktgWwLEwzinJJWIQ3OdiCUg3cBoKYAe2CYRBwIW/kEBYwsIc4Og7wS80R5d66rZO8pTYJ8ARSch RQymEuga/Bgg0bR0c38S+y3unTj4IqFrRgBrN5XSAVQfavaO8pROih1qgMLMApJIKH3Lv0XDXxki 1kydDAZwad5wqSDFJSM0oHwdPtSnwJqlpZt6Y6CLVALuEeggSFDqmOTfIj4SoialaUbQ4E9E2BhA 9aEGH8pTmoYdit4DBWgS/CXhk0piv0V8KEPEmqmTwQAuzduUl0hFLkga7gAxHYMgYrR1OkY8DlqE 44kIlU4pQbfipOPy9JJgNBSxlI4RBwYyHLjlxzGKjFCplOSYIJx2JQYFx8E2jEEev8pHiUgK7Cq7 caFY9DSdkD6CweGxtC0mwLoQSVrnMgmTsUgS2hl2H8cAJihK6jEWSSdSMMje+qM4LPIQT8tR0lAC pew/SkQSKTqtYJFME7ajg94gQHHyJ6lUOm6LeLCrkzRN67NlHBEG3HSpZBJjxZIfsiQdS0v8QrPb lac0+IumYpJdk0qk02IgosxFqCT2WzmnjqUpbTNgu5AwrlEDUH2o2e3KUzAt2SBSgcaSCvcUOY30 Wz6ll4aINVMngwFcmreTI/IYcg3D28bh/8CqK2QK7n6aBNSGlQxJpIBCEIcuPzKRRmYdXPB3F1Rn aEhV6kKpfykvUcgnkSBS4uAoIOdsT84dVzMxHNo3qmbi2OduiVcrpwLhvtZndeXByp2Cb2MxoCpL 0pigab08U5/Gk2KujOi6BsIgLcpoglayasACJbCHsocdiB9S2xamFMTEhypU9SFO5upTGuoDMdqt AQoEdToma3XyAOSHsp9dGizWVp0WBnUJA45KOYlrQknUSkuCLkmZyjmY8gIUQxJlpEh/6OJB0vGE RNVkgkZyBLqXUP6eIV0j/7Tim9Zl78FHp9Agckm1BDBjRa6/ZGTsGJpFBpYEgmBodhgaKDo7RnTu GBk8hqaRgRUl+rmMTC5D40xnw3k7A2OcEpLJDA1Td4+bzLjFtO8WhsyMdU+4PqvxSMo+yDpJNpn5 nOWnl4v5eDRlKxzfmvHMjyyPtbcwgpGPtHPBTZtAy58DRT8cxmoD4C9cFzP4JiW+aY4X4N/L7gfb m7skZ0uBXwhD9zkzZd5Z3n0J2BwfsH7nFl8WmfF4BCh8Nhz1pJZtjhtH3TH3bO6ec9M+FzVoCtQ9 AAJvT8P2sxHACOc2+kLTGKB5hkBYdKH9IAHBcz8wYxZri0AYf0AR6nisoCMQ4oSJpS4ApVxOwSIP NaBbPYZnulyvNxxx7ndWQCAEzvqjIsN3uWlvNOXcYbcwWEyYOfaFiAvbz7j5fGQ2OgRC/qyy6NtM oj6FwxfmPAI84xc//cQhENaflX8Y9dnpTwCtHM+CL/kFeOBkIvne14Ll2fFY7I8VBEAmAXdEpGuw ETRUveXdYUJWYBeQhELm8Bcq1gP/K/6/ytMJq6Gu17NK0WLPCfjfBAH/S6P/So6ZrfeMbw3UNXhA iZMF2l88IU966x3HdLh2JxRMQ92GEj1736RnQotsCkUhgn+ThIR48hvNGWeLqOs4PLlFVBaGMw47 nPY2t4PR1obSwmCLQnIB7FxWhcT24FN3IuqW/wOPrkgaWDBAa3ZLusim+8ZkiEZc1HSIFD5E8mce m8iqTccW/3nHZsy2TUeX+nlHB6WV2VjUkUC3JkEp7kygLaegtykC3ZoEdJdCjeRbD9VQbJqhMfnz olGvlwjmIyM3GdnKrCgtvpEtY8EVPZtyv5uiH0D/lsp3RS/AIIHiHM0D3fwHVn4bLUr6eGU0Bso2 bF8cMqOpW2wgPhVPMqJSk5DRR6050/u0/qjACKMe/gXPfbKWn1Do7/ElL7UFQKzcDlGxmTQ1FdvO 6tRFS+zAnXW73H4MDDQ1sm7UqzvrckebDD83mEsRSN3FaG4yDYsP4fSssWY1YSUU40Zgyz+w08s+ OoFESFOxYHcNjX1IhooaBbIJYiymKm4uPA6F1MzUXx4MWCjHB7BJhBkBEyYqbg4YECaRL0Q14LJA CggDrgflkzvaHs3HtsRBRohELCE6ntz+a6Y/WggOV/cXHjm8hyRNrTXywpgFlvba9BVF36+6n1Rq UT83JRdXVDkVRy/Qt0YcTKxQ/J2L/TFzsZWYlr0T2KZ2vJEbeIucsMRzM3dryPS53y0xlMtJl2fc LAyemjKmDEXTyik3kZ1xPYHvGaMZ+kyJNAqAjVBUMp6AfxBJIoHOe0j5fJuA/wsRF0+niFh6I7Ei 9MbIq0dKg+uOp4gGCJnrDTn+J/QAhhFIz7gZ05M+EulnxowQFKUFjEdGDxQ4fYb/lA== vhEfdMcL/pdhpgBxcUfY+mb8NPWdn/5K+Ola6P6NMOHNgnmdM1xjLouFSep4LHiDXjBu7n26mHKm bFZpuAKLFXE5lzuXTjIEPQsTesyYrXUqTA9ohuLLuObdLf5OBisGHKKoWvwpOxgDE/JBwzd5GNPE dqDSyIjdxyUWOwPGLwfsSA0M1GdjNGUFI9D38OHS4Jss32NFOHFCN3jsnX5IJfadZ5V+0JCmi0mR m42Uh2L7CfcD7GWOnsLL5OIETeMvb+WXv35VPgYGn0g5UuX/WNiDjY62anLcHx6/IE2ZBfkrZxXw 5MGUV+hffgNmQfxGuQQJb40mfw0Gvz69dDs66nfGtv51Nd/523f+9pvnb5HUr4K/xRzu6e/MbevX xm7KxsDnRjysPv2BGy96POdm3Xn40Nx5Jr52TLIyJlGSCItzD3EoyhQQT5dpW3xX4/gR8l757xh+ lnHn+d4QSz8pjYTZmPlR/GkC4pYZL1jNnpeeSx6u3zD/B7LOwhymEr9yIUBbyIClwW9dBJAxaAol f6OCgIokqTj9ywsCYunq6u+yYHuK7hrlJ75rur8uJveb1XS3yibIb6sv/oGHhvxB80BDfdhhEa0/ VG4XIZLmDE//8tfI8/TD1/A8/fB/PTzv1x5ekJJCCtJEOkXE5RBTMXMrlqZgCTYKBSAoOfREBIal ktSvKMYgHknC1EldoIFqDCiBBpEYzD39FUQbaEvVbVl4/awT2f48HEVNFLjxmHEDXifMGB5sdfZ7 +MQvGD5hOeg/NvXDxgSLJZAmQsYJlFtLxShYLTMB9BHwZNvnDNsPk/pl+JYoRq9RrmqR46csLywJ 0vz0nRuP3AwPJD2gVmY+Mvc3LjV17HtU9Yk/wtjfIuS67yxA3ISbjpjvPPd7yNqK7FThh5J14iYD islLKP95wrjgi3v2De3gb80vqW+p6P2W1z32h73use/Lbrjs9B/4sn/f7sbrnvzDXvdveV71h69W XrDg7Q8jboyON8V0/D9O3fIanrLHY2QsiXJ5xGssEYVB3xu6ISsh33spPbnPa/cNuv8KrBwRoRPL i0durpb+TGiIxZJUAs6TlvLgRTTIfsp4PEkk0uoTMzSQv3E0xBOADCiMABAaaEgi0Bcbg5lgFHqC 7kU1QwMV+U1jISFd8ZqSMt8QEhIw1Q15qGWfdQJdj2CKhBhUx3/LWBCnp155K6KBTNJi7T0x9w88 EbeOGRri28HBNrSRn2sT0eD/IIpS0qGGuInQDRsolUG6L1jaVmaI+zbE88dne/xcEkTinLR4gCXJ D7DS8MArLnNQ6YnZmtO/jTX/9fsZfq5FFw8nCXifOhIK4rLLPDJOwyRq9YnZsid/I8v+LVf9t3Qj wZpOWTvD8Q/f9rqcMeCP0XTO8MKIc0+4hcC6Zzw7Wcz/SG2w7/79X9NxaZxAx6XpGGLfKXjvbSwR iZEpeGJKU0v1PH5NB6bkNw5S/CMmCzqN8luSwCKGh+jQYRImKVgii0wDwkhTqaWLqn9VlPFNGP52 KUM8c78cDAR2Dv24w6UT91aPE+ZgXaZzDobi9Hrw0kXTQ/dzrj8ajHqM2tTpobtyDQM3EMRcDils 7GM6nwXwBpPxaOJwPX+thG9E7VLUPlBe3UrJkTS9aTbXHy7BpL4TDIoxSsSgAYToJQarDG6NXv7o 9GK5VNt3jfi7RvwLqz5p+rtG/F0j/q4Rf9eI/+gVnO8a8XeN+LtG/DNpxE/gKbMYz18wJbg1mszG ihJsksMKj2VSKGwFZT6J2WRJMYxFmUze8TqTUvRXE+zGOTZcdPt+edpX7963vcC/ycCQIxYNutl1 MEz/0zX4TgDbD+LqJYAmev+TS//c1ewtY8JfGDHTHie+tMcIAwOjeLk5LR/u06gaBDzlhwdY6CgT hYagW5OlmBj9HxCWWrNDhqgAosBfsHUcFjaJi8dKkbjy//DrKs8MRnNW+jShROHIMGJyeBIhn6vK cSva/0UjYacsL4NCwT1o8FImIiV94MbnrPsDQqksJvJMSHkClNwuLkGD6AXgSYRfOaBIiqASkTIY sGMYoyiDUpAqj1vpm5DzH1NyYY5EmkIVniMx8ZJmEeJstuhhaI7JUSpq9IZ8Bk3JYQmJuEQDMdgk jorMoD+0EN1Cb6EQRFwJWpDjxdLy0aeyoCpylarJUrQUhDviej1ujMrKIIgS5pGKHonJMBLSkCSS vOZgrZxzwDkUlAGMEbT0GQFRi47V5VUUv1p0FYy4lUutoREjrolE9WoHM2Wi6N47iZzT0n3XblLN S0UfPQIEMTh60EaR7sTWfCVdkI19pnxAyeQvIxJ9IE8Etm9xY3nWhERWaBLw/9xydCvaLiNmPFYo QNotbokglVa3LGDx7iLLzzmBkbcW1rcaA6j9Ysari0ZLbASTZFhDlVzUyBd1vIQaN6aQCPz4HAhM xv0DBCF/LW3OmBSHldYV1kZDlaOwKGwEzDs/GnDv45EyDhnJCrORCSwSk8alph7L3Yn/q0KdMAr/ SMn7VAkIVKJ5CPkJIXMpmewSYgknxJPHC1h5jhl1RxLEpEjPCmFD/qJGW9Eyn0qKnALCyP/004Ln OTdQOACP5HlmynI6xMmxRhKUmMxmkmDrUrQykvyYGzJ6AYEFe6F1QtyHVL6Bi+x+xwkupWxCcZ6q JMK/0TdOQTYix0aRylrIARMpcQYyhJ8A5xypQGRUy+XZxaHCGcRNgLSZ6U/MVJUpKbe6mCKOZPQb fX07ApzL3eWBgsZMFRhJORoyJX2CACnSygwQO1e2U0IuJq8ZCi1fuG8+FI7vDUd9Vl48JXo1JfF4 cevLhKjAoUU2Igq0njASvxd1WFFdCLmnUAvAlIlljVXbVIKg9RfgLdxQKUbeTMdAlU/U4RVH49G0 D14hU2RkN8Sl5iqkPN/jugA4kHDqilpDM/wEQgT9sGMgKefsGIk2DRDxP/q0A/0nCMw1Ox8B6Qge L4ARMQIcjHEEy+g7O7GHyTz3+xjNS9IsP11G7xxKOEkqLkHUPrYTZ5IsWwaje24qjjBZtAzE4N06 XNiQBS/3ZtnKjndizFYPd+kNhNUsKAaIbGesUjqsAcwJ3OgySZNYTso1uhzB9DzDJgBoyahCo1qn MBpJiK/EmsAQzL8GdzHTZYUeKjA3mkzYOT+C9pG/Ph3A/7nk34GEACb8ZMKAJhWehawDvGguxgLc 8QD9uvHir9Q5Kg8p9aGuSrE4IvOZSatT4noL6K0pMXMGVV6XfruX6rDD3/fnjQuuzxq+zLr9v5+M p+B1GNgf/Ki7mIs30KCyzTzz84DYAnysFRCB4z6gOLGN7GKS38J/5j/OpBLT/v2p0PkBEF0Wu34T b/qDfM0maAufCybtoKNHbCaNRND8+o1iZ8pNWQeIGXO9T7bvBDNyy9AvOy9gB/bBQEkHcwPE0WLn F2gS9vPDW29p+TfEBGmJCUfzHzHdMeuE8G1X9be00TM/ON7qsOkvTNFwer2FMOcmvywn+3Z0mBEY 6OaFMg9sMafk+M33BRjLr2gofwi7VBj87lcsjX/TAl25N8gUqY4Q+ktzO9tp/OhkGj/+0tMgqZTd RIbs6H3ohMEoLX/1U/rdqD8fOpmR1PCXnVCUpBMxYI6TRMqgHT4vYTzqsfWSk5kpTX8FchWN5bct Nb5zte9c7Zee0m+Qq6VpmozHvnO1bzuI37hG/p23fuet33pKEYIg4n9YDFa5HdxsOl1uPucmDXYw v+RH76Opk5ktf/Nr4bQtbsH32AKMVP3FHTPC4He/9BAm7JzpM3Nm03GkNxzHbl86GHJCXVhjDQXn 6yTpbvKswPI/sO42+/u5u9wfzZnuaDya/6iwVzRQ1FY5jWqx88XM3WCm7wt4NNjkZouZ2D6utE+7 KyjybQoHd7VgIEx3g/2BHS8Pg3APxLYsD8/axAFxP7D8DB6SCdYf9MajmbvHQRfi7908+w44gc0X 3GI+Hk1Zt4AyiARlppaN5wA/YktYMkBGCt6SZ2D9hPAPLCxu4e4yY2bak9UyHYuKKZWwZky/rxvA BFXn0kxAmHFzXSuAUGnkSZlj9WejiHYZepxYCAHRQb7uzi/mnPsajVMqtQGI6emc7Y8YNz8SuPHi JzBK9gUjK6OVryhzRuQzd6vnIoSGumTKc39Oud4nQKX7nedkWjFpCofBzFl3FwYWS2XyACoSiqSH tHXOCkNlIigq1n3NwvHDP8UvYoTmi8vFfAb6t/4GG1LaPWNmYIbCaLIYM2oTCqNwVAwFHYL3foTh GH3Q+idWy2pgO4afdzmG77th6Ia0IAkqTqVM27gpMH95u9s2hTVHpg7b8vIpHZ1IxBLmLUlsALZN sQHYtlUGsKQLa4Raix3XmDkgvAbXY8aQwAT03kgAKm1BryxfL+Et8ddt6EyHvepW+zNfbzI86AJ8 LTRLFZicAZYcZ4Tysmua3g1HvWGT5wajMXvGSi2xGlmaxq1FF2yVCgcY2jWkJ+UDiDHaCHx50mX7 S+ANBw1HDLaioJBpFo5BCfLXIVufA+DtpCjFYAS7kXKfcl335Qx+ILhbOE2r22PKqSzaPZoiFswJ o7ljtkK5AUeyYCU4+0Zti5DTFyVOf23G6VHTS4lrt8xYvKZV25C3oyYiv4jeiky9gDN1DUsSW1fl fBBm2pd4lBVXEj+CtYnceV78CIlh/UekblCXOtHohIWXmy2nyBYbO8O22NYW3dpmxvgW2zhGuNh8 VYyLX62EcmnsOpzbbCg/wP/NdNQDypi8DFFVi4/ClQSMpiNKJZiYPFL7dvitlBPyo2YR0aCNWhch +wUdgWlALtHkgHr/o24RdN85VG5Wmirk0NO5xNSwkatLq/3WkagnLObd5pnZTBY5VgiSxlSf9sYL PYasvmvNAREBAWffssQK89EUTQEHbjJ6ayXUpB9bNdfBd+YK9XpEXQf2yHw0GLG8PYpMiARHl8NB YMjWaKdGXZPi+ouGR77Hc11m3mB+RGVgNE4mo+8KY5btQ9vdadsCsvYtcYEBHk0/nQK+Vt0+SAkx hayqIkgTsceNJDjamL7rdFBtbmY/VYW5YtzAtDHiZCXud1MxbkTPDOKWH59zU079tj4B9mu+C/QY ScujTFihUcdLHydou4/bgJ5VdcqqOZBrP2JK3dlo2rf/SOLxBl9Zjw12ph2aFQqB3Dln+E95b2B1 u41at/nRBDa/w5yStNUHYj5zhecmQED/juM/cbJeYfKSz0FrEJuRRG8I+mMNUWfVp/qpShbql7ZE XGB4a7asrI4ReLtvzHBhjUTxmzw/d8AxAf2jWGoHvHUELTNIB23FzWW92bSz1u+1mCV/M1oWPZtY jQZxnm3Vs0ztwjqdqEJkte9UFmvJ+rQYNVN4rURjfQxUI5iFzPHQUwhkb5GZif7CEavYIteqFYJS IZgXW4mNCxnwXrROnIntCtAM79ju7Yj9nUMeYbSXKJs9ofMGWG49qEQxc7Y9XEy6Uw== ZjQWluwQvYrr1DdlqjbdCCzaYm2YBSV5zPxXC1jQ1T2CZvmcgesxcgtgZ7i/Fux4zLr7I3dfTP8A T2D5XbcAGjDjHxj3YuqGqpcbW3CoEbKKl45zi5dPgM4j7hsB+uu+DLqT4M7YKWoCepxId0zwrHu6 4H5Ad1OAj8Zif6Mp3mVI/r4P9j1oBZAxHv30E8OPOdhyMfUB1R4ohoxIawD6mPkROhnRUOtToAKO 3qduTgYz9kkQONDbFOal9Fmp4//pP3ELPYAboTdazLmIYxWzx49mmOEm59PAsWATsdkAPW4MSxFr NNWs2w+6EDdCUXkvmZ6FkWx25lvFej2VKLEQNnwZP7ncfwoe3h35ssx96DS2fxku5PjqZJh5n3pO K56Q31ccMRFhj76plendTO6menweP8k0nn3nOX7RS1bK1HnKS8bjuwQhlD5K7yFiL5d9jRzkDkMz ISecUVGXN5dteHi50em88F67auQO42yrODo67pUiEd/7UleN/gPoL1mqeDPJx+q89PFSiD+GQ/kJ 1xDy9dZ8GDymdxeVUnzvrvAx9t25vKUBcdo1BLaXTA+St1dPz/l2MXJr3ineLvOSO/ysvOQyQmQS LIW8i4q/2h+4vAhZlTdgepQGL3fJwjg3vs8MCsN5cZh8JDXoeNsv9cjGV+7wxHcnwgFDFoqv768c +Gv/q1Tv1z2FcOpjL98K707FMdwz/YXLm/7wB3vlXuLKXxzGO9nDvDe2HyxchN6CuaLvplJkFwfH t6e7w2yvx3zCv0bB8qAxFHsmiSiT5Ed7b5nR62m/MPae+MJ88HmRb7T2v+D4A7ns6TDm8tLZ25dc ftrzTYJH59locvJ8NEomo8Iglud7dTL4mSEViL3SqXAL0Jb0scm7GNHPjIpRBqwveX7kD4fYwjjZ nIgzeGh4c8X64e5dOZROCGBd6k/07nGyyL0GD2/7Txmqu/uCwB5PvWBCx/TBLlySJ/qOvppCPB0X PgN0WCLN236DIF92z0tR5nC/4gk+8rAXGr54RVBQE5eX6O7U4+jv4HHlUPrr8K58JjYvhspvIjDq gaoD0r0ngsfH5RBVOnk/kuDcHR1m+x8Xr2gllQEDeJeFhNQLaFQ4VQbwog6A9B9dw0ZsHD1LeAql DkI12PUncfqR/ujl26WPYGkQPfsqM4xvr0B3b64Oa6XOcb497M3zzb3eeb5NxcDq55MvD7vgm/5j +f7tZKGgSKRaDZm+fqrAUuMIX5MX7IErDVrlPsInAMsEgse72TtxhSBkl7fcIYO3hfj9aSXH88Ob eOb87gStUCox4mmweAehYIFLv+pRqZ04jncZT+LCQlAubzZ4tPBXSmOyQJwmMuCfKjES4RzTXS6X bc938u3T+WIZlbqVxPAuL/w974HP2oCPfUVGeT2eFtdptuLfnwWKQ/r6sdwlDg9KLM+HCLZ5lFUG IqJDQUajmu+ckojaDsNvFbhTzyKl+keSEfe+uKCp1tfkLH/5WjivFAenKYI86/Yrxf7kATFPgzWo Fsb00Z0Km543jh4LtfbukW4MLi8YBXtZqn56WdDV1SHkMDFikLnjlkerb9cDf4Xm1dlON50OZuMX Ooxk6wI3KI6EEQ25ZfipSQV26zV1Vlk2sz8BO/k6AMnrPHh0+ngqd/r+DPhYDLz1Ng6q805/km+9 nZaio/hOWQQw8NXofPuce8/dtutMpZy6und5M+dBCgMB1yAhi5brSqUT8Aylr4k3otwDZgdilIeh h5NqPvnqEfLE8SKptit3o097+Wbo5EkcIWTMLi9izfj78Pj8MLQ7us+32/shTPqQRHdR9k2bT8q6 TILl2/uaLFAO9kuDfIzFOL/yFqy+9L48LJ3yB2/LX4de6LvIWbI0aPN06TRw36p6q6dxovKci8G3 HJBd74tKvvc0ABu8/wWaXD4A8jnB3oK5ZPLXO+hBxZ+mA+VwaBAvFc73/QqTih76OnfD5PVLPw2I OHcE/qkUwT9FuLkqefhPQf6ZhE2KFfjPFXxxDP9qAW6paQmfVi6Vli34z7X8E4FAjbEXLeXFiab7 YlP5p4B6EQeQ1wATf6LmRaX7ovxhpWAA+1jpOa/tPo960Q/0WAFWkn+Kb4syHHEgRWXOTQ3Gjkqa uVSKOoxVcsq4C/J40DMRbE5B1pV2IVQs5pTRKE2K12IvCkRxKIfaD080EHPw7RF8dgSbJC+UF3kN MnCKEHvRrpsjslmJaPS9mK7gsTp/0yEb0BBCm0jJ6itsQdUVymnhXCtDamkIBF8II4ypdGJNO+Iz hcaWSMmUkMReVFJqEM73gfpTnFBhGYFizwXdXNBfaBnFtVQx1tR2oJ0VtpHUGSj/FJtYL+p7I2Ix Xd+m8llVmVpRnpW0zVSM6TaaiHTYwZGyXyoqlShvRThGzAxDtNqLOrJkTjMec3yqn6n0cq10gFEO RskKI7UmtFlbGXdeQbSWRWMv0LiKeg5zISpOJ0NhIUrpeaN+mePn3ut8a+Hd0Yo3Dtgdgp9+nJQn UGU7jQ45L02clr+KUCwdlHrF4gQYCIVPoMOMvaMEZgyRaWAMnRVoH1ArA1eYCtU+XQRxAY23uwGq bcLYooOqHZT7onJ39IhJZMVWg4MKIoMFGq4hoGI8HmomROzmbn3+Qqk/brxUSolHStdLMvvYqABt PJGL3pRq/ulu/uyhNdW8Z55p/qrWyh2Gkzul0+BuQmOfAlMYqoO4ygZMWBwthe57iT0oA8tCM1dM NQoC86n9lW/WA8+lLjCZDUCIxrqq3yPbLyFMrwuiHjyfRa6CJ7fMl8sra94pZiuaNwTVAprSZXFe fux736m3w5MSoDGk8kD9//DtsFLa3JRQ6BNNDVEOWJdLsvZcYqbVO6iDf1bKJLBbW3SaIkhun0gO d1mAE5o+ULQ5vR2kAstfNuhC5bD8HFG0rAgyBV1eU2PQqSkIgSWTNy/sWWlwJbSio+ZTQdo0cM4x agdYSdbWrSPb9u4jJlHEjfdTcphozBmX9zA4y75V/IOzSJ44bD9Sgb3XQ1k9xfFUeg8HTkQCuYp9 cfmzu/s9sH2CX0toWzaAXF7cBMKGAmyVSr7EKrv7WloNhM+7o7C6AdKf7FkRmBL9YOWtc5wuFRoP n7phgl4ko+r9qRJojrNo/6o+icwpFfbrwKrWj9b2iUqd5omncj/VeyVOP5ka9ZY9aIoWH5HpT8YE 4JbkKWJcRjtL3gztZC579rADLLChR1n9DHTBXOZb1f4HoLEjnsrdeNLi9gjtRcHqH/kXFAuMwf2B +Eohd2TRkyF/Ma01UvUWe5Y4yb4VxtPbIjFIF+uSo2PxAPbIrFArxBcFwuUlQzeCsmtfIoBvPr3m 09mzsPKiLZvRx2/JZPuAJU5rO1mA70gw280Mkw56hhhb7nv9niWC1DmEAIehHj93i8NnTyZ4XO10 NLAjZ4XP8+Be8Lg5iGvX4LXwSR151BeKl4YqsZ6ri8KYLZDFkefJBxhq4QrsSmJvmC/3Pr/20Wqk P/h0pfI6KPsq+as6YPDVK9EqIyg6vy9x5/vTArDZuuno+fVzHsKOqX7JZXrJky6v3FLevxpguDvC YvfWwooENNy9yDsq7d/0uMINnDgw8IEseSTIavFsrIMHeHKzNr7FN1q0MCoOn4pgn9Pnb8tg5011 9waPH14OpCbHX0DFOH/35L5Oeqy8iL5FPtWdvbu8EbJ2G4KU0IZehYfSIOJJiBg9OuUFov5UPVRE VDlzynQjIgc9pi8I0FU7WDt6jlOY2kHVnn35dvGyVYpc98O5zMXnCFCyIrFUyhO9v/u163towj+V Q9z5Ip+Ojg9UYJLLEnoa/JfTNpTXb0BKdW8A7B6lSm6ZkskCBxanFXsrnZ1x2eLbZyEO1An6slTv Ba/AszYp6QJS96Hi+7ASBuqZfyfVys4ey90o8Q7+eRxlLt6zo3K3vf+lVWRocVc+pdr7e61KZ3f/ utJp5ufQs941Hvy79xOsX3oH+mprAGI5URgnr4KYciMKI/rQn+PD6UX+6qA0AFpfOMPO1G5Fdy+Z 8lxUAg/NOdCeyL7yohE8Orvol/qTdEjtGczP7wdiYv8ObOHDuOaFbxgdsq9vsg6DyVfEcGpVD9iV /dfcV4HMAoYU2y2HPRFaPzVNu+PMIH92ZtQE6JZyozr9Fc1SS43GLW+l8wn2YvPp9LncO9lPlM7q nla66f2o5ITTxgdqJ3GYZRoqjnb2wLpI2zBTBqMozEI66pCPVKLD3O3gpgAXeYZrhxKwYPUlGYjm E7WXulZDpSUfbCo1KjDl1wp1k7/K3nkxJVhaxrS/dCo04QkYHal6q8+d/LR6w1QOq6RfB0wiuUg/ lx4+58dgC5fO89ftHNAtcc1bGlkUKK+Ng3zyOVvMZe6+Rsm7WIzNt/PcEslRic+vQiJAP+antYOv ymGlJ2CkcnxExxQPPGwuK5gN+M+zhk5O6sYEQu/ugDGw7zma27svXHk5OjwNtRVl6iiWb9+efOYO j2cXgI/dRM8Oy11fwrTRLRAEAQFKw7zCjiAqa7uVYv7lHfwT7lRKzXNqGYAQynHhdg30cnWQHeq3 hTJX/UyVIwwczlPpGegUiQuA6OOhukyAJ5+1i8PEvAl1y7fZQeFjPhnhsO+O4kBGXAvl4AE9wJVz 8E941im85m735nPNdn1bpJunjy/YdCELjnl7E0DJKqoV738DMdx8a/40Kg32a+NUgs/eocOjLPva HBrQCw0FWB0wnIP9SrGQPoCK2gXQ6vJ8mXl78uO9EFQvtyi97z4/APPD3yv36MBhnjg+negINsve UL3S6fnNPeCltTCg6aeqdvtkkNNYVLB69xcD5OmtzoFuef9WOj2KUeXXy+5LadCeRlSw8ODmBBmX QBBkTqWjOmAqLPPIt3T+kuvN0heJzilYkuk1UDXLbXjKk75+1+7FD1ENAn8NFRULgtj9zMfmB6X8 9fS8VO4OOkfLvYAmcX/6EkgS4qrcu8ul0A7TYIwQQo/04/UBAxQZ371ORqBZ0TuV8324BsXSqWdA GPaSeFxc6gCoPBmAOL6Jl/OJk0Gj4j+rpjHLyWKnOiJ7+fxFOip4ZIujo5MUOp/Bz9fCnk9laQ+A EiGES/U6tF+ihXGJPXzdyTevHi+AVlQ4x0VeOj8BqsEd0JQkU0I6On3Mt7qzgXiARR2xN5pvMGfF CVXJhnYUp0ZaURtFtCRvx402dPbvlTszeI6MsIMLBVFraI7g+cQzNJlJoEedtcF0b490cgHHQ5f2 AuJ7C1T2n3zXwF6q0qX6ZBxDX+Crr/kmNa6+PHK+zMVr9wtI9oZvaS+i0QDrLZ8K3UzgmcWnwWEU La/LMV3eL9XHwVYlv3jndc0VTVFeafoKcK/zSgCpBsGTu+Br8nrg61EH/OKCCtAfx1T5sFah3jzh PFV5ybeoSiEK+Bj1FksXKeYsdCm+F1+1s9dUaUIUkJVEVc4SV+gnVeof5MV2pdrkmA== ChK3WaMxZNl071Y6DgY7FWqwkDpUmkc8pH559w70w/cOakkfVZ6P0Kk2PNKELjb5SFOzhWEvsf1y b4cGAx17+Eo5dV1DZIHvl+RX7bqBznCzg8n+PujggzaS4orydl4apMsRoCJGApYS987lLQcvfUGw vq9hq5bH0AQ42wM9VyKWPd/lDseVgI1u+aSyQr02A2V88aKcfstzw8uD4LHwmFblGZrQkf8q8FC4 auYuoqPdzKHqJhH3fqzSGUdpoEfT41zy/r2cT1WFOQygCFf8p+HbInkzEdQzTLxnI3tCUitFowIJ NUm7kCyLK6YGWAFHZAcLlpdiJxQJyR2Uopgg1Mhmmv4i0y2wF1uVSu49Nwa6ersvoYW+vEU+pYMF 9AZdZ8LvnhimLENHnshcvcTnEzTd/EB0znbp+dn8CMw+EsUaj15DgCpLwkEy8xpsIQ1dRbmsKcUC 0xjg6HEmH/f5uDR5dxbF0VZn7nNC4H6ndHb68iWyR43sigNFZjADguc5Sme6l/u6b11ey6+B5GvU apXO/CVcyfnYdv56zH3hqp9s9MqhIM3HZLuzmOZbu8Wj0nuC3jkMLZ6BLUYffx2U9aqhIjIUaSHL F0m0CJJ119wPHuWSOyUUkALHWky2+txhdbb3GlbduS5vpt/vtTMUc9AsjMNku3r/eD8FyzQvqD4A sQngm4vK28tiCEN4fIjLSWqebvWJOZNPhSM7QPqE7wAd3AAdJj/tvgvq2ToO8ZWaoANhLHBHA/Y2 30q8LsAiP3iB8na10L69y7dvkm2EO6D1QeylP3MfDTDzyZ3G8Q2x/HZH5rIzQsgThxcz3BSGyCr4 Dtulg1G0dxh6OCsAGVCHq7E/Ejeuoixinl4d5uXFUYzw92mhl788qzHIYoeYoDRDutop9x7Ypyxz x32UouUPb6Wc5kbl1/vhDbBf2vvhB4Pmb/TN5dOHSHftRuXZFHYlMM9yUEVMFM4DgVFyWr8K6sLJ kBQThYKv6q3sPZbDD6n3QvwuFsZWX9ly9NcZc3L0XGKBgSQcktr+FCgHR9lu5vOo9DJ62MU0JQwO 0guAxJ6YgYhdFYe5PtBhxsW7PJcf+PG1unreBXpEIZVvPoY4dfZaWwxQB4y78JV7i50RsO5eEsii VxmlpufHFODENRgbEeZkr8ljOnd3FdxHqrtqf4o8OQM0849QfnriaVbe/C8U3AzPSHvEhifB7rwC SVq7pjP3N10wF7YCNJyXt6oXkBoElQVcnHiHPtYA6OA5jGuwBJ3ZfXEUr5ZId4Ll82Aa7LtgCOyh tlDuHdcAsJv92V76pvy0l36/48G4anGo6b6K0VdghH9yLCe+6zJaS+gKBwdZfEZxvh9cNyJ8jmbd MYOl5hg241mYbcdCeLz+agd92xnzzvLM9N0i5Bk2g7GizFwNEpUucYA5uGCGMBrfrSY4+5s822cH o+lIE7AL4HAiJvQJuTiS1FhUu1RHvHTXimGuZtNEyUCM0B3NJ4x6XcBy9HRvNuMjQw5FxNs2wzJQ UoRhiD1sNoKpBpGuTZIWbClFT4uN0hF4D4MVyDGeI2Y+66502Yr1ZLDLcIygwSbircHWPfZRiDR2 vUEilYiodxEZT4RX8WgxQHxRbHL2hPlYGu1sZpE7AwcsUgSvi41PxU1xj6+6EVA0WHSRg0WbMR+Z gLFLK22NnbmcjeFg0mC6EO5Yva8lkTbMptItuRFFQngSRSpYtGsnpuU4Gu7sffIpLRKMmLcgPdiQ ncKrFizWssf3I0JvNrZMJISNOP49YkXosDdBLj+ouX1huTtmzFrBEruD2eSMddoFpIceSqWew5tZ LHK4xH57U8GKAkGbwXg0G3L8Tw6QIV1JbpQ7BZugOxhsR6/c3ACkWM9CikGIcyypxBa9PzinfZH4 prgsMCB8uL5dmEgK+ImGKzuhV8Ax5rB+qeMOxtZ5vNrGyk43JUweK9to07TH20JDHTseHW/N98RO YT5UV8lCNMvlRG0Bz4Dp5HaCBzaFuszIMjFwMJ1H+uMZP+CmVttHbKayXmOhDbucwKQ7PYmY9Sws uoJVpp0WIm+TuKptrRCFg7bWGsFMiEzZd0A7ctKj4T0Nv59FNLcxmEAakz2UxmbZCPC0OSoMIq2H wfiFCLwoYMoK1lltoJ0wZIDay1qIVdSj7t4ak3ZAk9D2a9KuizKjpKGZYEK9g8xYG+f7vGCrPAG0 c7P+wgJVCIx8q4LVsBEowWL5UIOexW4Su1pMe+Y7CcCQJRa6DsIGmK38VuFZ30kB241HlvmpoMm7 XqEzzu8FLXl9S3NZCQY3ZmaWAn8Ska+b4+ZDWRGyhehMxiE8MtMpZyX61QH0Jj9+mueigoZQWo6m FqgGbVROaXIlkMV4AXKnzuwyTlUAbXAAP1GB2klsoONijYXrasFdLxdpMk3TYSpC2liXEJXYyLS2 cV5u6Da4/qt1W4V3AF1OxRrqEn6Vd/DSvDOgqGgxD17ACzTa+E208otSu7TcxT2jv/cO9TuZqfY8 /gaZ6+jasxkj8/a42gUql4bl0qtvylOAIkVhi6kvmjzbGwlLCd/wE3jRmJh9bDhJ8b6QuaoFYuNs vg8Mv4HXtqm7NLvsNlBLamurnsFVE6uhwUWR37lQfjX+xDD9NXicKH3GTy7fjon+fiuHfh6na3sf 6otYIRVL0Y/05BGlgyEfGPZZrcMWef74qJsPzS5Oc2dp4ThVO7yLVLjH+G2Zf34kXN7SY+WhXTnK H/XIg3xymvAUA1dxIbYHQ8G6USIaPKfih1eZbOykPS+UBunqZ233+ogpDYiHY+UtFTy6poeeQKx2 5AlHfdee4PHnocfLkmee0PCj5fLCB5VIrJEGfxzNvFIHw3nseBY4nIEhn06kITPXBemvt9MTNJdI VEh8gb9as6UmYH5CqjJtU/70w57LC/BEohlcqoPin4X3FOg5tQgeVz37cYESzmWwqWrsLrs7AD+r Y/DtQ0mec0Pg+azwyL9km5dENN7yo7GiTkEvYrdV8jl+P2yEDDt9eS/UTDulqY+ox6zTLv8aDd6B XrTdSp1eFAK7N7Nxw6hTYfeVLph1Wju+Sk5vdZ3CXlC38cB9MNu7PDfqlF+8ZfwH3kPPm1GnRIU4 OTTplN7dS2UHaUTJBnONPzwTlXbhynCmO5VZxns5Or827LS6yzV0nUr7BXXrO23Ez80QfMM/96hT 2GlgCb3VnbuYNzH3gc/i3NKaZvbA6kvdNn0+3arG28nqGHUKNlK3rO30hX+57V6bdJrpJG7671G1 U5cX6/Y13L4w7TQZHbR8xp0eegK8kAkKxp02k6+gF4l+l+Yq+I4fSJNOE8OAr8BWjTuNB16Ch9kJ NlOUxq+uKpPY/aIX50adEpWzq4JJp/SuN5FKnJh0+tCBhz1cu204153q3tF+gx3eGHZavUrdmqG3 th/2RIZip+XnzwqgMRzBOwHBlwshBB8sdVrrTBJfBzMCdJqc6Ttt1C9epE4fwn7dTF3eZCISeVS7 1cz1sUA0JldJ407rO4tU46GXMuz0cszW1E7Bumi7PYt8zUImnT4FiVbja2Hc6VnstVGpnHiMOgXr 0q6P6qZzbZ3T7TezTkvELfGaNu60Ed5t9zsHWdSpy6uf6+3rkWDa6a2f7czMOj0n7sInBaNOXV7Q bTl4l0vxRUMEP4bar6adfuy0GwWTTp9p4oV5C6JOIY3p5npxM/rMeC9Chp2+vt53TDvl2BP/u1Gn Li/s9px4KzdKxgiu3JA79/OrulGnPH8R3pU67cYCuk0TTB+UY6hTl5dkduZVLVfK8ItYkYCdhpY6 vTzyf72W73Og0yNe12kwwz2EpE4/0wdqp4Anw269g6cdUZRThQeyrmUQ10T54qkKOw0vy9SL8N40 lm2CTotzPXrL5Y8I6hSui78c0rFCXz8ocaXYXqZ4pmWFbPAodfEEO40ud0p7d44eajXQ6alH7RT0 gjQpqnA5FOd6krmK6BD8wR2VP8VOT24aDS16wcJ+DDkkU4EK1Szib6n5xENlpl1Ju1h+v9j3xPqT mfHbeABsmuMEa/aWB8RwPlLfarll/KFJlA8vy+L7JV3g8Yho5GIUervM4B9PiMb1SdzoLaLkxzzR 6J/RZl8XiXPPXcrsbZm47NWvzd52iFbxcy5hbPn9U4ho3e56zN5GiHbu3G/2NkHceL4i6ludfPEQ /MKTlN4vc6oacXvjORLf6rdZ/OmUuH0Pnxi9RRh7ahB3e+m82dcXxB1dLpq9bRKPu8kXs7cfxMv9 44GMsaX3z0ni5WMQMnubJl5vsjGztzmiQ3fS6lsdjXV4MnJwljD5mvGT6Tfq3ORtd5cs7L9WTDHW bZFnVzunJl/3OPLikxqZvO0HyIePs33jt4nXaTt7OH80wxglND2+wOkFekv5jv017du8J1LLHYtv 9ZyPmo89h/HTD/UtwFgxfHCNW2D+fjtY4IQLke2J9lk8dA25UgHQHVswMj0l4/KE9Oaic1+x0j5J PiBbsvRYPoy44FOiUixEesViIXoWxO23N+8Yjicm9of1vBvzIVMQcTlo5zypnC96npr6iOjR/QLu jCfAHAeH6uqf70ZHR90A2EU7ZSF1lWlqGC6/Q/mOmmFRjEA7B+PyeKeJIbRzOF2ncF1Qt/GHe9St Yac7lX7UtFNk55h0ClRbYOcwuD6GzzX+8GbRaTWcxjrt7+/vqp0i7V/pNIY6RVaShGCo/WflTqtj DYJ3/Hin8dae2imwB8mIaadI+8f0sZhurlD7fzbuNP7wZNopQO+E0nXq8uIIBtq/aadQ+++bdcqa d5q6gNfEmM4V6RQmnaZqUKfomHV6pVtTlxfGlIakAaC/JErPLK2+cbusg3ai1tdwBDEeaIrtRG5B NWitQ0izcSsLYGn7noqKh4S5LiAdTmQuMm7VHZ8jQzdkSPnnCTfWAbYhUmf4bnoLTiGAa2UMV5CS m/scHF5R9Y+pHiLiNOH1on/ggt7hSrDUwaUymhK0/Sqoic735PIep6s3TfBg3yv9w9xjGrPkLpM3 Lmj8VCLLL0IVm64yZHinl1f6J3TOibiRbTGZHaszADRY1CAQx3whOmRLXvgPIMgTom49JNRElC8m gwqVQ+I/Ej5JI0/gFUT5whrlLq+KeWmGyK42nF/TYz8/9M+1bv00Fh9aQaAnnxutIL5+ncWBPHjR pjGaH6cscUz2w9ivoMn8skEH9OnSIMsCWGgTYpfnIpJ79WG2HcoiBuTOg4p3uPfXx7zSn83OcTlA FrEBsmZaz9VbhNMxH9BzaKbpQKG7FVkP1PnBNKoYCMzZj7GewD6iS2PcPYTm1qOR5Av6R8Idcpwa 4K78fOsxY9vGu1I0bAx2JXhKnjU2nFp4Vzc1ZV00qCbYZmRfPE0wwDKYbnNiP6t9cVbqXLTk/lom WOHzbtO1mqkSQtyVMWNKr57t63R1zTKVog4oEKEF7hdzxHTMpTTBzm+iEuUolCzaJw== xpRc7QobANOKfHK2tOu61Jdov2y87yrQiVQ3XUl0yrPwAV3vPKRwJb8JF2Qq1MuicKZM12Q54T/S 0EU39JUi9zUz1HJBDbBQwS8NCR9X0HRcxKAYeZLOX5aneXllpIVZLUn8a2lJPlM8mhU6fTPmtU5Z D5jVvWAmlkSNEV0UYq4zqutb1XNVvViyWl3cFgPN+1WS2fPVtqA9faY9KvVqTngxZB11/bYk169S hcf0qfGQlNHAf9T9Yj6oXVNZqS6d9fpJOj/A6OeepWKx63j9DBQ6CWMOVlCHLIJlOjdOiQE/ezUG 9sHerklZuNdaAqYVKOsBE0ENfF/3W8OYVq/bEGODjP9xaxiDPG1tYJJfS/bDzI+/VMMVkbDLSxXu X03Z0Cra8XvN1BR0eZdMCWMBXYMnLDWHho1eU5B3ZeH+c2cru7IGz0DOLGlsyVAOmGIntpc9azgy lAFuJD/M0nicm32GehTATSdix5MxncJsLnZMQTMQY3sfDsW51WI6EIULqPbLGjihnA4EW5floVhv e71lmPkyFlDzYwHuSlN5Z2STo2NJbZCR/EUYDUl1Z4PRfNQBF2DKlh4SXQcmTg3qRZjaODVcOvZh tkE+6nZqh9WQcCsJDGq+uxUGUNcxADN73wkD+Kg7ZQAuG08S9TIP+lbh2IZDQvIFUIKNrqCnWkmX 11Ptib80Jw8KHxXd/FDM1epENXS8IaW9r1rl+hU8rj5/bYwshCowlxW3uAWyTDe4gaxcRpZ2i0eW t/jkFG1xUyPNtdyBiXcptpfZ2VnJl6DiTpWVk1MLO28Vo+KEFN0E9h4Se5csmBrpczo1U84/OY2d 3LbP7exhK/dGbC/9RejsSgsHh5n2dAp6ueUcTMjlNVotjHZ0uvXqfp8T8nQB42Fwjr4mYhJ2vj69 D8TEY3Nq6a8xYgWYp8Hl1SvTJ5nmXKdMx05uvA6cieaqtLpfZmdaZXod3J3ckF6j0aDrFFcThGd6 TdiYInAxaLpfZmdaQbje1I4CaGrKmfgKXEkdiF74mdG5y2tB6Zkrj1byrTchb9yRr8+SAZwtSbtl tLgcIUYn6AwRY6XLynIfYkcr6kyw40iX9YGed33qUaxIyUXw1O/A3W1vwt63jE4njCw+S593tTlZ XdopHngDYOv5W41Aubwbbz64aUhHPNmSVuGqBfybULy6+oGDTXcOghI0giKf768AJ7T6aPRnSQhO eDXfv4ncQ6AijrQLZycVgcCyvnnfVk8YZH1MzzQc++MAMHtx43Jod8GRWRz6GJ/xKbNfXpf+PuXo JApTP604GjBcEgGRki/UXsDTjANFzgFHu1E5mtm6OOFot5xTjmbvgYfANuVoil0JgG2BowmfsS3s fXgQvwYnWqKx5eiHdTgahIJxEM252KpwIk5HY372iuBETc366JALHslUZKwL4F5ruGRBq0Mh7Ogw aqilSIFe0laBFs/Bkm8cPnWyEPYHsEXwom7IhDBt3F4zu7+1Psg1ZbJG5/sA2Mpavfm4YOyD6dmr UzbzMHNgS7vstjNcNTWsaU2mIK3+xqq9CMXMmNN6e+zhrGdQazwkEI7T0CPrbSiCUjahw/gxS2nI 7FSDelnI7DQwm0bjtV5VGt45jT6ysvigjbUdbxaiZABsW/r985eRLDTwwVoTGrlj43NxJsWYnfMt SDEARX9itS6cLUQQITjEVmZF6uz9taUhXLCwpT95dWmY8Yd00hA+M1cD8DhYB9IQDORp7ih0Sg3D ALM3PkmEIzM3SDWoVDek2ekbMBVgpP1WfNUQmOne1nJ+J7u7wzvSdDX0Yo4xejvGJVjJ2/AKUWom jPne0nUtUoQS1eloUA4pYmlzSX5LnWCiCvcPYZ1gWoqcWEEs6WKu7h+sBJOTyLVLzbiGHnPvqPn2 MiaVYsTQNlon2hYCcyRaDM5utJnCErBtEXHhYWffiT/Z8GxgaSVtg2/xM3GTzd4VrIJvcYowHZLq t0SDMncMO45VVeUZEa10DowtC2kNxMtYLofV8S3TKe32F+VKei/3WmkfN8tGOXTWGXR6rW/dHDo8 D2g5g069vWGzHDrrDDp0Wr2FHDrrDDqTbMGVc+iClhl0Srbghjl0Jp1KGXQqt9wsh846g07NFtws h868U5hBZ5otuGIOnXUGnXb118+hs86gU/L4Nsyhs86gEz0km+fQWWfQYefIfltD8qlkFOxiZbNJ eUAGMfDN/S/rYBfHQ1KcA2aWONB2HKUHal1MZiGnmJ5s5sl/Kmn1X3s8mXt6mz7PdvCkdTEZxSk5 xZNO0C/HmWkMLvnmFuM0PE24jmN6MgIF5Ys1cTqen0XenKLDaGZoOijbnALjIS1nPuoPc2yRbjok e8+VBZ60vMZRytxSnJIzgn0trxQKYpJdW36+NDW4VwoFKSOnsQNPrwO38WvZ2qJ1OfFXgak979qb YeZ+dRQJCZPdnAWD2CS7mfmLnXt6YbKb4wMXnYsJy3stOwgGsT1wAGgxCAVRLQtHhggOTJvNYGnT iDq/Bpgun6FLcTolQucsNqJzhzy5Sy2s18Bxiimz09lxGUZiOUgy1W6+inUCIzwXW8G2h15IanXH mQZjWsch1HVDWjdJFSKm7ECdcHBi1a9aSDZNHphtFlhqvsU8vteFtURaJY/PTvc6wJ1WmiFpYuB9 R6xpEowDVVqTmmYVA395bZCiaZ4bZRcDv0oen7n73On6qXl8t+GNgSmgIjpQBnLfOTDzE3MdKCVr wAKYTb7Nahgjt4cxfbT/RhiLbYYxreNXvCJSE+r0XrPT1TVqI9j7Jgp2zT5pV97sttlyZtlPDkDY MRy0t0kHmY/vtY2NPUVTmp/Y7m5ZdzbJojrZtwbgsgdxLGijCCxW2gwjUCLb5c/arpDuZMRIvihK jWmKm+12tUWGPp5/DXTYp8YeuJxEHsAJxVfxBui1SI1deeIv8To9knoR3ucrmJmmlAyE50puizXS 4/BcHsxcNc+IcubecaCPfdS3s+Mhlvbt9TFneDJy7+iI1OV1hKfV3Dumniuz3DhzT4PFkJY8MpjF 55guxSGt4pGxzrBbySNjMST7vFcLPGk9MkdzvUcGpiTZRUE788hMTh14ZOyi1GJ7Gf/exh4Z0Td+ urVAvsnpFiKIwNTi/tUdD7oz8cnp5h4ZuOY6jwx2MrJSGprNIbjOI2OYv3+6DY8MzM6ThahlRLd9 qjnEjoPkHAuJrFWWo8vK8uzMOg9V3dGSR9FMWT7b/N6wk8yV1y5SxamhETu5SZqnjrq8qzh1zta8 N0xDyWBygW2kjy2FLujli7O8ulXvDVs+F0N5dVvIgfRiASfrRg+eOUwh2TXzW+qS68ydoLa7V/G3 ST5YyCN9+pNU8MyGGJwJuvvWVu7rs82Hc60SU7d2PpzB2SsAtu18uLUjVFfKh7OIUN1iPtzmGalO 8uEcZwtulA+H8TEsI27b+XBYzFV7zVQNg22oz4fDraSVUzUc58O5DDPi9OuyaT6cQslKDgDMiFs5 H87m1BfPF9tYqkDxZjhnPF/McUwkAGaTTqtDILoL2vhGCwjM/ERnhYyvlqMTK+tcpRvHkZD2cBxd a2F9wovgaM3ndWdlrMSvlsl1s+ZdpIaWRdH6DmAH6QS6TYi81scH+m1Yfi5aI9BZ8AVYBrQJsajO NTOrbFIxJD+/o9Bk35ejnWN2rYw+x2o1e9FwTQ0CG1bXxmHK4DZuA0ZwNtuGMhRpE25ydweC48iW tr7rBsFxrtqbKvYih7ldumLG7rYpq+gGMD+dD0vKF3NqUlsa1DAH6dowfWE1Pna3zYzUu+1lpN5t JyP1+WsrGankTngrGakAzhYyUiGUbWSkQjjbyEiF+WvOroE2zl7TLphqXxuditpHLOm3YYdfCu6D z5RNaHarubNt6DQVTivFTLN1NkyF03pHYf7at0iFs7wHfmupcI5OEjdOhcPtyuVAkm2lwmG9rHRN /WqpcC4nN5aslwqHKYbIejVVDbuChX22wo3wokR+0F8ovFle3af+JsSl0zeHUVUQ2Jf18Q/mPpZ9 4yYOZAhs7sBcc6TDPOgvGV7zcEFMYVs+wDG4Tcvqdl7IzKMWIs9EOJjepgUGpbvre7W8Okk44Dnv BXS3h0F/eLFw//VeElUHh7XBG55wKtzxHJxlSU+odH3nCd2+tjyhTr/tOWjnafhXE7YresJnnQS0 ku4/k5I4OuI+8SHLZy3aZDe/RbJbM0rgOJazzqRanIJvj8MLoGqT3fzdvetPk7yzwLNVubjXsFbu 65LdCvSlSaf0riYtSp/s9mqZYVf1JIzmKtVCrvIPSqf6XCyLym2HnhdtjpUuBewqd411qkt2y45v Lkw6TQwPcncHM7MMu/jDg1Wy2zth2ilReamZZ9h5P6O3XfMMO8ai0yqRMe2UF95Pd3Wd4hl2nudd +sYMwSGrmdb3dWsKt2sYdY/+klc/dbHoW7eU2l3usk7a7VweebSRkCYt+UXnE88ih3NeUkTljQu+ Dfl14tT6LjX7kFudBtvcn+jD5LX+VNE7umYezczU7aTzmjioY5WzvqrZyZDESnn8dlLFTO/JUWOu tlVJzsi7ZFopz6aSnMOl8+2sFnNlURfNtuKILq5vwyJyOJ40oHC70kEROcfz016IbHAPvC4w32J+ +vBw0yGJ3lGrQdkGUzoYEuKWdvXjnOOpEX82GpJSWdI43HWNbDqjEWIZqVvKpjPB2Jaz6Yy0UfNa nOtm0xlNbelWjY2z6Yxy6UzPK9fOplsp83HtbDpsmRRv8yZea+NsOiPjA6PkLWXT2UZBbyWbzkwi bzebzonXevNsOqNcOjSXrWbTWcT2bDGbbpl8+lXLPPG1sumM5Idyr8LWsumMWKvhqehG2XSaIUm5 dJh3dEvZdEa5dGI2xzaz6YzWT+vp3UY2nVEunVnVv/Wz6dY+4V0pm85BfuUWsumMcuk2x5hN7ZzV MOY4m84YY9vOpjM6RhE5/zaz6YwAuLzbzqYz2tuqd3Rb2XRGuXQWN1GYgbDJpjMCoOUw28imM8ql 09d83DybziiXTrP3t5JNZ5R+Y3ILjSk6VjMAdTccaie0fjadbkiyAbhaRqrWAMwIS8k7/pKhiqGN uHOYSGdWptI0x8hQu6jb1arUod+82plUrc5Qu9ioXp1RgTKndRPs69VZ5axh52J1u6qVjvE01Itv mxt1zKdmX4cWG5JFvKWDUnVOhyRGd1gXoXWKJ/PNbHjLmQWebKvPGg5pmcOAQdFrsEzt7SKxvfRn VLWH5Nw3nUW0HH/kxA1mWuZupWiotcvcGeS/LBe6WykeUTM1qczdJr4L52XuxKwBm0J3GzhjxDJ3 G8cnOypz53KUYbhpmTtYlcm20J3Dy2zNy9zpKdlRFOLKZe5WuBcOyIXdNYkBky9nW8uzmJ3pMovM ckUdJLRnrraQy3PmKBbDLunRg95uFmsN19xJRLPLPpFu4xD82dmyrFwPMfZZac4KYQ== QOwk19y9og9Wl1HkXzaUYW269QWdRlNimY5hqbNVE7viet/w2tFQSOffVjQUyv7fNE4dZj5uvPlg 4L11EruijTuAs2pOrVH2E4CzcW1XEcry/lunTuLqhSYt6iRuJ7FWsiygr8G/lFj7wdqcJTlP+/pg CWf5lfYaHgR2YMrMTCtNmEbutaaOUImbkUFtvVd9DPXt8pEufLZyIoNp9lNu03sVYELW9ioY3myz guHNmhcE6Pb+LbdxoWpUds0okWHVGkMQzuqJDMs1IBCcbeRzBvW3Z68Lx6K0liZW1WW/DcEGsbC/ 1zjhBbrX8jYEzzbNJ5IqsZrWuFsxsctEncdiSJxuwzUq3JnWrZZq3G0oOqUKd5tnPjqpcOeoUt7G +URypbyNt6FlhbsVK+WtWeHOoMqMpsbdSsCwEFAlewJVuFuu97qVQAsUpKIuw/p8DCh3Ninpqppj d+8oBOYoF9ZSzZH9/ABYfGPTBWCbNcy9WDnzcdXEWsXXp4ezeWLtnc60Nq+TaA/H+SVV5tzyzvJe uNWSmODNk/rgms3y2w1Ca4oo7uLGWoA53IYd3jK/coU0JikjbNUkJoQx04ywrrn7biWzHWFs6CBc 0EEwFhzXp6Nd6aAI1/3qSUymdmWHd3QPnXUSU8YfQXLWTO6vluMKhmSZxITdN+4wx7W7dOKKnlkq hi7nOa6F+/7CjEps6tEZ1n3bLM5OO0ks1nrTHFcAzPJqKo0OY5fj2hVWL/dojrF13ZPLK9mJ6LIG 1shxfbAUebqsZ0eDckgRxsJB9sCr+/c4cT417E9ag4bA89R8T0rSO00/wNy+Nvwn5wn2Iqcwra+I cvsisUZ6D7OR93XDk/7SpKbxAunl8f2prcO2Q2XSJmXudvZdXtM0PH7xFgnjtKEtc3dIvZtXnNPV 1gProskSe7TK/fsgTTslKoOLlmmnLu8+edrpmeX+9a3qsBVaWKfa1DRhd8hi+XBwV2oQfPy1N1Hm qsuHC5gn4QH0HplXnAOrX0kTZrl/9O7e9YR6NUvCe7HKhxPiGj1Zl/tXDb3dmnbqY/3JoVkSXsS0 U5cXdNvwmc6VF26OPaadenIv4bZmTdm03D36S1oGlzdQfOxPHLQMvC4mU9t29O7Xa/n+UtdOOk3Q tEwMJbqTxCTM23nO65RO2SPjnyyJzsqC17Ej/PxFFXWmfmKttmpwGvRUMgqbXK+KWdNXMXExGXpI Dkx1/qfSaqFV5kMC6q72HsV1s60q1rfxOK/MUnIQWmXqztVZfE+l1UKrTPGkVXI3yko7MDWuVs1K s6l3sExPRqCQrw8CWyFOy3J+hvVdzKMHrVLcVorSAkMyzeLM2oajOx1SMfK0nf2SNQ9sVTLslqNj tewqsMyuXssr+ZjNa6aUt3Ad7UNIX/tp/Wyk8vOttS3tdTk1gMtbOeV5CK8bUqNJdjP2a63kH4NZ gGsdWWujbmAW4KaeZZgDqL+wcyl21BliVryy0dwPUzaN03LoH5tptL7aG7l8ttOlvuzcuE44DFPZ no3cje1YD8nl+NQb+gTXvezK4C5ogCyLy/AduOx0PpXP1AxyGG1ZGb2Dce1Q76qqtxnecrZaWTZb vQ1VZHOWCmhzz8FKOVbdVe45MK8Ut6Mb0orauGZIWnenVSKgJJEtUgG1/H69VE6kKfWrtlVvHKdy 8kZpOjrLYgVgdtldOCgkkS2A2VbRcTQuuC4QmD3NO52kg1we58DsTi5XwphtPZ1VMGaRkLaULmyq HZrnAGpOrNayiJzkACr3kKyVBeg0B9BGG7fJAlQRY50DuIo/ef2Kegolr5UFqBmDRQ7gchUzM5xs UlFPyRVdKwsQEwSWOYBLWTam6Nikoh7i/GtnARpMyDBtyNxGdpIFaKCZ3BjNCupjusSDb1CUT63I 9i2L8ll54bZXlM/UC7fVonwux0zDJpfQUj1ZPkn8FkX5tPWSvlVRPgd3qW2hKJ9NDPyWivKh+pWl +QZF+bRDYg13r8iTc+J47FKDLer6WVu5Du6GclTXzz6Taxt1/cRMru3dDWVc12/FaNs16/pZV/Vb 624og7p+1hMy9sGuXtfPcJm2cjcUXtfPOszENnLYYV0/61gpjFtuVNfPUmE/20Z9MVjXz86n5NTA t67rZx3PpIm1Lqxf1087NX0htzX8loZ1/azp06g6wzp1/Yyy7rYQoaqr62e9ca3yK7dS/EPJSdxa +pFpVT/7+pXO6vpZ7zrnWWmblAfQ1RpYu66f0bhUabdBNgfTcVSYy0E9Pse5wNZV/bZUj88m+dNx PT6bun7WUKSckY3r+mmHpM/OM+aWq9f1U3aOYVU//R1E69b1s05PEf1jm9f1w2SXASrlddm0rp91 VT85Y2jTun5qqpSR6r5GVprNnI30CGPdcvW6ftZV/baw91FdPyen1ZvX9bOGotbj2zzvwbyq3+r1 +NYpzq3P5liu67d+3oN6M7PxHd2r5z1YV/Uzt19Wq+u3eVaak7p+1uq8kjG0YV0/7bj01uIa2rhh Xb/VtfF16vqZQLnlNrZe8bp+1lAc1ONbZxvqoCAas/GAOU0mMa/qt9aNOgZ1/YKWVf2WT0Ysky1M 6/qtnJW2rfLFWFU/s8z6Vev6WetMtrc2Oazr56gen4M8XCd19My8WavW41vPg7lUj2/jO60MqvpR Wotv/bp+BqdKDu5OX7Wun7VfS/bAb1rXzyjnyUCKbVjXTzdJndlucM/VWnX9rM1215bq+lmfZmIY 26iun2Yll6r6WdmVJozLsK7futGDq9X1s1YMRStp87p+VophV4Axvduo63dsWdUPWRZbqOtnfWKD tPEt1PWzPDCD2bVbqet3bFnVT3uWtH5dPzNPp9nNLevV9TMfEgzLN632u3rRV3bpnBE908UpaYcs SgabS0yJwU0mqnftgmf6zayNUURgzQLvdWmLGnqa6XxYYHGaRdUe1K7LW3CKIwGlCSgpUMzOtCjh UwYmfdZhizx/fD3KReeHp3kyddeifMc7JdQEZlPBXJ52k+E93ufgvge6gjy+19rQEzn6yAezx1/p 4GH2+iHYHn1yRLn8ESXKH+EMUTm7KhEVbtQgqlfpMNGoX3SIxmTwTlyO2SHROo+liXZ9dEvcCMMB cUvM4a68fT1aEHfhWz/xGLoJEC/dnUvi9fV+QHSuY3PiLXbvI97O/Vc8z5ejvPDMZfkFOb3lF52U X/Al96FCcD2HmZ2+8Khfu6xdpAe525fHd8/Bvve+uZfKjoHW5222qqf7w0/vzk46euHfHfe89Xh6 /7L7cV86PJBTAT2L0Cx+8YaWREx7y1fabS+xx/bBsyZnyEGkdWkAbglGIQgwobThCRce4lgJSKmO YKZggqxMHKBj8UW8Hb4GeP4iHDSdKewlHrgPHsZ8OaJSOCsQlUHvlKheXkyE3Ve6C3NXPVJ/x1/l 4FHq4omIVjoemJN4RZRvkx1U5o+IXrIh3W5St4+c94oTmn+i+luxqanSR8EEXI19T2A0PvaEqErD E+yFrzzBR3/Js1dKXcIE3FNUUtPl9YTzsaYnHPVdwFePEHf3sLJm2RM6v695Dr52wayZr5RE3ZUF PHmngpCD7pEHRTJbHDFREs6vk8s2PDxapkqZOk+Bv1ozMvT+fow4zO0XMvCJ6OdOBH0d20tP5gTh j0TRT8ge/dJfH+wB+KIWEAt3DnxfQfgzKP3M+MPwZ1j62YiLAKBlcZOZl3ufX2kimqgT+QnXEPJn d3cvgB/M09JAj5MB9QU+g+OjIPaC2SseyS+KYfUFlC+PNyfyq3pUfQW0sPe8/OKSVF68gqXzjolo 9ehAfYb3XC2GsBewZ5dXflWPAHyHDoBQew4COLsB6kX4WIAX1yT4q0vETm484Gczp8LuIGURPKuE 4BcHQNtmC4ivQJaYAly1kQKM6ZKHNNa8jEIvcwiJYPDzhkTfiIsTbT7Fouetzxj4ug3Qv3u4C98G QQeRCRF9aKiIeZN7eQMLTz+GS1HmcD/zPvXduLyVw3L8Q2WfEnOt3l/hJqxsx8pyuJGWmecSRCN4 onfUBqLMYRHEwGnqKp2qVnI+tl2q96UylWBW96RMv20qWAp5FxV/rV6nAuPOrssrkdcDE1emzuDk 1b0MQxSFAFKTU/DzJiqRffeeILuNegD89USK2m+0+0odp+sUWKsuE0N/KV4FSQYWcaEHqAhnAMqu XJUBPCMGAPY++J8TuPcBMxjHGxYMQF9JN7oPJ+mXLAvArKUJXbIHaC8Csds6QHiAex8wDXiXOazz mSAQiNjJXZmpdAJPZ3DbR+B29oslN1nhEwY71w6k3U3uRKlS+CkIdvRRSF4XuPeB4gCeFSNQUbmX vaPgn4CkMScqUWM3CeAMMqlAb4fs8gB7Nu6H6jzYcH5/Rt7HGTQNP1l+zRwqu/I4h3YW1C6uv8DP SkTlAnBXfhbGO9MKGZoVidLpIUcs8wNghIuLCJgCCTSDYzCri6DC+dHunmdOTcWDKhxUj6lBsBmF r5pKSED3gFLsKPqB9g5SNwh2JxFVNS70zBu/KF0Rfe+0BBrzQVwYIfXl8KSFAag/hyJaAEOwK286 B2VZQxBuNDceIDIVdsGz1EIs+Lz/SJ1ikh3l4pcPL1UAV8sAFrvo9gYFRG2/hu+SeEvMokfME5DN BQXd+ZCAakH4V0R5FlWeASINtcDCzv28uN+BlHrE7P19ZdbDA++h5w27yUDSXMSqz8+AhcWr4AUZ 0QlyaULxwCumLhyWhBZcfVFXQJcmpHcNKiDL1WnBugg7lX40aHwfQulTPLhQikUrNyM86e+7OMAm 9MTHuvKEMppLKN7iX8bj1t2BMT/+QoMDNLZ4y8WCaqlmgCxOHR7cKhEVhHJbBLy4Ib0jTbx3eQ75 ys7SNRLB84jE+ZfHjTqVFiLgP3l6MVmI3MJ0IXTLIFX6XloI8ZJWEcQzDiI7uVZA3FuspHi9pAjg Ba2LIQgrYhB9487HAOayBKLDbzgNdBkSjkoZYwbINAExNFkNMAYN7T+rGHvVYkxHiM2OCcHqIbLK 4NGlLFI7YCAcNlE7+Y7u4ybnMYXobOPyO0pXE6yr2vlDT3vv6MOzQlkPz/ig8LrkFDrP0vxsTXU2 uebn2KPtpXmrad584DQ/u5obdZpDDbDm50K2lqH4np8EoZZF4/4xtEMJdp5LIS6gykBVsQIK7+QZ 6QJAnD4kRP2hcN9BIjYsyfXEswB/RmWNo+ZTTkVR39AuAarDgVZ1QJpESPpZjCA9I6KAiAbLt/c1 OJrn2MntrCAL97gfsxygLqDK/cwBZiJAlUBVCDANwHfSOJZfaFWDxWtOftHA7BPUvarzZwJIWOF6 SDUXxEwErOdqRdXBX1GmLHjWiEr6WPWSgEpXMLaXgTpo9YZCpzy7B7jK2iwGkQkgqazNeliW8YsD SYg2GxHRSvAd3YOt0rwmIO+GFkgf/rynRKPhpD2NSLYYFdiLBCTV96GO1jKI2zwPlw== EdRLrJCKpbLsa2BQHNKVy8I4tZvCNRdkcALNRQSlPXnG48cAxOvoxhA18G4IyTeOINI3R5li/mY/ +1YcJs9m+XZ+eicaFYWng1eRfgO9+5FsBbdjCnm94eTVbYQwy0E0pLrXEXFdQjDpPiD+xezciqaE qkwD0zNWg67NB0BKh3VxtFDQqQYCUngk6zyf8klaj0jxTU6OUgMKfVDeaK+CaJOPdpr7ik0uyGZ0 RHRxSyZlIh5AMUlgmDn4MxOUlVewzZTdhHywt4S426CbHoaMR5CqTVZfI4/i5jN27dYI5MZVDlv3 5RdnfqRYkCFi+oZwjPb+mbjZyVDR25UxfxaSnt2QcMefRTBeE3o/isoqeYMgEt0zeBp2RmJNqoUv GpDK+yVUyVHm4wMXQXiULzS6IOHZbEj2KAp/cuxKkVTSnaISCXf0ejFm+Ut+9D6aukOurCuar5Pk zbTPVXiWbbO/n5e43mLCTufujDuabxXr9VSixPa4PusOaepYYr5Yje9QJMdHevJ4GH6rcMm7GNFf 9iwy0+r49qNbeDu/yudDU/Ile0Lepkq7/UXZ5S0Va88vaL8b+IbRRsmCzTwvlAbp6mdt9/qIKQ2I h2NsGyFd2zdrf0GDsQavb/N6Qp3+EzQ3Wx5/TQBzgQ8eRMl1fDTz6j2w0D+kumt1x5PIpDimvS1v Jb230y6+nO7WgunErFl4O0ve5AbtWbZ8VzgHVix4X+zka/TbRb4WG16VToKtNnj1dZuLzg9K4IWn i9xP2j3iJ4OfSXht18OrTDfnU9WFou5dIObG8u6UhdEDL3G2uR9SWGcu7SqwW+S/SD/02/glnppI og0MLzKuz5Api36CbfLEIytWjiGFZqti5RI44fqGioPtLIC/SM8Z5UUQf9EI9pQXYfUFvL3pNckq r6L4N7Piu/JCtykO0H7An934lT13EcJfvMf7Lq/yKoJ4LmAUOUJkTLVwJSZuI7RPayfX8OcVDrv7 HoSYvZK2cm8vmZHYN7D7Rdd6L3xEov1yFUX2ENk7qUO0XUlge1c3CGwM81vVOrxX5HuBcBx6Edth 3MNzkssqtH9dGEfeD/LN3qAB9stZ3dNSiRMtrcKnvHouJhvtBSpQqxwaQTSCJ0V32kG8ahyp+zMx b+6x1ZfH1Hu+tdgblR/7Tch226RKv7jS8fAaA/tFdm7FsamXTpIKsdyJnlWqdFWEpuVdVCb7OwC7 +wIDfO9IWabcIfcTB/+KiX9pYq8snRbYrlyVAZQWTLbm8iIWUAiM+WYuKkyOS4/FyZMJA1B4ja2Q 1IlIJM22LyR1IlKsZrZ1IakTkequ3KqQ1IlItCt1QtLqYA0/iluKU9H4TFRCkk97crjrJ8FVdN4j z04xv6N4j24N3E8BHEBoVNYBgPEXeydl1c1F+dMPMZ2fbGfn+KQq+8m4A52fTNipVLzWjjaX9/6+ mVdAjPyaXQIsKNHbChes/JwNx/azTySQJaUQJBXxuBc9g0QVEZ+9CJ0Yspvk/d6ZQx85hvld3wa+ F5+JxyiHbgZ14nsJTq1tbtkMDk2NPF0ur97XBWsE4B4HaULP2nEHnXm6kvhZn4WvS0y4h6uGQKie rtzdAQPWKlgR74+FfEXByFhXnVPrKZHG/YovxPjmwmwhoqYLoVsGFBdjtBAB3Pu3jjszgCHV5RWn bgDCihgCoZXGgDyLehDhTacR0aESYGxFf2KAMFkNzR23tbeQFmMWhBgKOYSoDJ7e3UteBy7ki27f CW2s4luINIfoaJIhSu1KXWxhp3pW1EVGRA+wQU1j2aY8qIl28AG/PodI8zOq/Unqeglpm4cOtD/D 2p9aYCFC4rT+fhuI75wg6paKFJMZ5XH1zi8yYVUGYl6YS3Yq6QL3n2GqU+uH4PFcWFQ14dEX/DYi HX3d7CBZ6VOjbsHfMFgQqQ6inaCoDqKdIJ4zJXJh8eeLwIoGRGzv8PBNPEcbvOZU1R0fJtQFMLmP a9k6qxl7cUP2lRc61WCgvMDtk/BefYjp/OLRPVlt7CjGyQVunAARpeibF2H8xSwD99CF4um7IETt vkY3IN1dwHhYBLv76lVgXwXFRt0ZCbnAVVhhj3uU79gPo96uIpKVQBchnCsC8W6yV7tEPynJaHh8 IqXcRKAuV4LK6beoLlEBOqMgph0ReyECeymCGre85VA6AKxJ4nbPUHMRtWiD6E5F+WlHN4aohUfI vlgEkYzuCofBmyxPH9/EL/LJl75fMioeWx75YPuJUs/0VfKi/v/irnQ5quMKP8F9h05VVJES5qr3 BcpONINsyxlMFRhZxOVMxtIgxtZCicGY/Miz5zu93llESFKpoILpc6aX099Zu+8FDt5d/FwPCA+G J4evPqPQ812f9SIf/+VEJMN/fP40X+c+vnohc+vd93+ND7bl8cF8Vl7zmrqNZ2u5Bv/sZXolBP5w FP3v9/XNbhT0uRMcrZzJ9X47k9dj9O/SE6nFT4v4GslBeno2eKskF69wsz/95oe43fT3kh/E//Ak XrUdLs9WfSq1lw8e/iHGC/XbR8df7/rLMOqPp9/8Od0Q1D/oixe5sCivoHR7+SWUeEew8f5JvCj4 fDJKD5rX3zmpJTl8w51+Nfnbz0cXwzvGLx8ekKk8icjG9y59Ugmd2eNLAybeCLfLn3983j2COCdC zI5vLoa3VN3eHjjPF6t3b6iDmY0Xl8ub6fzD4q4TLP1w/NCfLjAhPaNrMM4Mcac/dvvT5S+Lq6tb Jg7Y9Kbbmx0e3a0eL89Xy9ub+d0H9pBYZ0+mL04es4es9J6h9yO2D4n4DP3x5QFdj80g5azj7Ai/ z9537/DxtONZBLA+gPgajZ/Aes80e8K+/4GzC+r9rBOqF94ZJoTsuVbsuqOGtbpyhOiFsfSJhhJ+ wOA9F8KxSVdYUvdKaMOmjSN7wz0Gyd5KzaTAnEzoXsvgMkXDRW+cUJlBo1WvnC3d0d9r7dpklZHX oykyq0o1HfKq6KoPStvB5mTvhWr7n2whMu3GP3Y8gzl+DQXvv7i5mV8vLtjl3fxiSbeW4YCNeC+4 5dgVWs5pqTUbBaihF4HT0tUiMMtlh06cfhk2IunQsoNW/dKIPoQAYZRj4+vuFQQZj0nFvTfeS8Wo wYPHpyPaNLXPSeiem2YGgEMqp1gIvXDKk65Vb4FH5dDerWXB98EISUpz3gmijQXM52QcmntJHOGc ox4iGEzpenQwREtuBdGClxGNI2knUHUQTNpeK+zsZRSCNi1NrzQhpXtDCoRyoTzoyPQWk1WalM17 5YOtrGk0Ie2DaqOwsApBt2lJdslDXXkSzcwFFapwyfI8Ny7tyJpoMibAg+OWvYsMKWhQQ4WsSKmG G60dJym4QjpnZWNMtpQxjcqFEe3QF1Y2AD3qK9i0dOSQ/FxHBXHto/4idBDeGxVFgyNJnhSUR0gM JRoYRHVImUYINJJgJpBvASYTCBIN/WCfADJwE/XBjY360laGpp9MD/WTWdPIChruVEcBkihBnZY0 SI288CTC6pxXVbhpYnkpm/wUWDx3bYOkZu/UEAOywWBCg4lcW2nZcKz6yYzJFvikH8GO3qxH1q2d QkcbcEzbVBbbsNlY03KNs4UYog62PBKBYoFkIy3gSOTOUJiGad4Xi6SJwQhaVjIGI++5EogzVsCi PXJTr4MT9MmFyWEJuARaTMKgFLx1pDkJBLdBrDKhxidFLY8WD71SHjwLvTrrmKZwQV+LQaDandiG NDv85nb1bHF+e3eBTVA2+zSxDp8t5ldP5qu75a8Yw/YnRydfZgS+fXV7d52+yvkROfPi9sfF7Ogk UOJ8vvpwtZg1KdayqGBnFyXi78Rc/leYr2eBCJJl+wfs7LvuRRdyiyc747kz/eRwrgemh9DrsiNx 6XLqTixox5CLNgZMUAPVxiDXMjoZOpcUmAtLWXiSkwOGQ0gVejgIrOS0HPFDIexqSthU63DfO4qO Gm4QaFARb9IBTaNl48Ropv2AsbmlCQzpP012FNhkDGMwHwIH6AkfCgNurQLiO0zLa8TfSseS47wr tPDYoKedpuFw74DIXqbPZA5W0HrhkE+b3nhSeh4iEJEslq5TFkZZszGyUHWKLHRdJNOTzW3uyiKl h0GOczohEZw3lYMMZAz1QE9PUbHQWaxCQ24Xoo7TeGHxKQdYZHoIRmYlNJKdlVFoeG0H0xZGg6Mw smB1jiJ5wyMzJlvbrYjssg2YfhCxECLTrDQ2KBxVCpg9bqzQRbBMIzYrE8Wg0VBe8F41ODI9hCOz Um2qrQhtFPbmFVlLnTQzGhyFUcQqc1S5KxyZMdnaaoFD7kAD0RtZKR8BAiWjzKHy2ZNvwD+tEo2u kiUaoofoI3l8zF2IBRWRTA8RyaxUeaFS1m0Ule/C6DZtYbR1C6MKludokhdEMmOytd2KyC4DwUYM NhIhsSgDKyeWtSoqx3JlhnQSrdAIGy5F4jQeUUpyUyEp9ACSwsrHIE2nxzIqFqzBt2kro0LSGEmw OkeRvK6TGZOt7RIkLRu924qt0ieFOJSKWlPRo1EAU5HtZfP3fPjaxUJCcZrW0Q4To6AYcCxKM0hX OMgjOIUFomMNqJHJHM5WHlWiFzEXQQqH2Oc8IjR6KEVnJubgWEpZdtop2h7AKhyqvpDQKv0yub8J wx7KiDjC0xkinmaREolOUaYwMgLTLUymKXWtx+JNmAAcTlwSwe8TgbOo720BjirYAcf20qIiKxwA ZyQCC2hpIm44qAnmDXJ4NDgqbjyKKqzjhPVMIS1RUeohcoCpnu7Q6qtOoc1p5wjjhlQvCRPsIDOA jA2o8zOZsKU3gdr3CidOopSwDVmbHPfToN0QYt1et6J9RU8V1BsLIKVsTYBy1B4DjoWZOFE5oA1P JAdcIBUnvOl8GUsAKnkMiiKPyalKBuSWolJZ93RblF2eJnc4mimOJkNvqUTCzqnUBjiUDLgrDEKb hM1khF9rqQffSzrxYsZgrW/4g0Z9N8TfbOFvmml/FFTsW8VcA4yCR3xe44iAyq4B8C8w4bHqG7gQ HAblwmBdneNZ4YCORynQ3sISNd3jkIupVNdOIoiIi4RJdD5sMN5elA2eklFrzxsH+cXDOSoNXFHR S9FA4eQqJBgYktwJEVrFizRHZoC4dI5CVlBME8SSJDJnDkJKLVNLUe2HbtQWGnEHYVfFyOxg8MrR QYTHT0daT3cYMBjvLBXpJiif6lQViwRDCf+UetiQ7t5srFpSrZOu1uhGTQ4u4rBOY+SkLGpeI105 y91gLgrPdbFJlxlVGumSp3qyKgQVAAe0BQcuYHm6moh9KJQjzBg65RHD2BA1GosWSqcujSclposm m+4Ci9YFCj4vEJwLY7JlKvFMvevI7NPpDWlTkaXRtR0Uzs19l3Z0FEYIgi5laol2Z4eQpugq0KQT FcpWxc6u81AUdmwEKVGbYrWPjfWSchFJPT6v6+IALGNx9GnLjq+HI/G1FdS4fyQZIw== XGdjIMovT2fXjwzUlGHhpeN/f6Mow2K5i23mS4O1CxYkKa+S8xrKd3B3aErHhBmzPgCJX1B88zq6 Ms5t1S0n0ZWpkBi4srPOrruyt0oNXVlF6x24skzhYODKylm6+aSkFJxDH9qGTHlLxjsDhdI0dtCU eCddlS1zphS6jJWk7d77GB/J0C0OPZssHW2iXMuCIXTyD0lX9dFhYLubDqPUhsPIsOEwwmw6jPID h6HYGqutYWxNPVpslYPQuqmve31O8Op06VJjp8ehoukRlCI5irebCHojRSWHocwbhYJ7QTn5Zn+9 pwccSMbB1s6wM4cTllTi45PClIX3dNEQ1jtqSqheDjves7qEjceLv8Ha2cbX8huMmseHRKRrP2hx fMYnRt09z4h4ugdj+/mmq9L5TmvwDGn2q5rMni/+jtELtI9nu58l0bJ5jteL5eXr1Rb7/fJi9Tpz 2eH49ha8+d1inlcU1ijvpUD9c3gCPe+/vVqeLzYeVf2ftjxT/8tdo54ip7xv19NxelZ4fHMRnxSO RvQvQMwvF9/ezZdXi7vu8u38lwWb39zcruarxRt8A29ZvF3d3i3Y29e374mDIaX73t7x0y+6fwIT ZiNW compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-wall.svg0000644000015301777760000002715312321343002030050 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Visual Effects compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-regex.svg0000644000015301777760000003004412321343002030214 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-mswitch.svg0000644000015301777760000007076412321343002030575 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-core.svg0000644000015301777760000005015612321343002030040 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Preferences System preferences settings control panel tweaks system compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-ring.svg0000644000015301777760000010103512321343002030040 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus, Andrew Wedderburn Switcher compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-wallpaper.svg0000644000015301777760000003272712321343002031103 0ustar pbusernogroup00000000000000 image/svg+xml Lapo Calamandrei Jakub Steiner Luca Ferretti <elle.uca@libero.it> compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-scaleaddon.svg0000644000015301777760000025204612321343002031207 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Scale compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-clone.svg0000644000015301777760000012555512321343002030216 0ustar pbusernogroup00000000000000 image/svg+xml Clone Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-cubemodel.svg0000644000015301777760000004333712321343002031052 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-reflex.svg0000644000015301777760000002326612321343002030377 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklau Reflection compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-imgsvg.svg0000644000015301777760000001605112321343002030400 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-group.svg0000644000015301777760000006137012321343002030244 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-fade.svg0000644000015301777760000006203412321343002030005 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-showrepaint.svg0000644000015301777760000002670312321343002031454 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-scale.svg0000644000015301777760000017223612321343002030203 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Scale compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-shelf.svg0000644000015301777760000004375512321343002030220 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-mousegestures.svg0000644000015301777760000003175012321343002032021 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-bicubic.svg0000644000015301777760000003507212321343002030510 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Windows window manager decoration behavior compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-photo.svg0000755000015301777760000020612312321343002030241 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-fadedesktop.svg0000644000015301777760000005557212321343002031410 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Zoom compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-resize.svg0000644000015301777760000005400012321343002030401 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-text.svg0000644000015301777760000002064612321343002030075 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-minimize.svg0000644000015301777760000004552512321343002030735 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-trip.svg0000644000015301777760000003401212321343002030057 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-addhelper.svg0000644000015301777760000004712112321343002031036 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-smartput.svg0000644000015301777760000007106012321343002030764 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-swapper.svg0000644000015301777760000065703412321343002030601 0ustar pbusernogroup00000000000000 image/svg+xml eJzsvQmPY8l1LvgLzn/g4MGAGjNN3H0RjAHuRj0NrAWSbHjGeGiUuktyvamuEqqr7bF//UScLU7E jUsyk6l2q18ywEwmmbxLLCfO8p3v/N3/9tvffzl98/GPb7+sz8UJ/u7vlk9v33z++OnnJ3z39Mv3 77//7vMn/9bPfvfFqazOhfun6ZfDV/yP//T203fvPn74OX6EH178t3+2vvm3d9+c/undnz98/PDu i9PP/umXv/j1b379y9M6/dMv1y/cv/3h3ef3b90//unj+2/efvrqj58+/vuH85t3X8g1uIOubz67 /6jGL4v2y6ooulPZ/bwc3T/MH7//8M27D3+eP/5/Pz8VrpXV4J/uo//+7ndvv7vy+frx6++/ffvh 828/ffz67XffLR/ff/z03c9Py3+8+XD61Zs/u0/enP7vt+/ff/z30/z+zdf/L7ibbb+6vHv/1t3X t28+nwZ/k9Mvy+qr+ft377/59fff/vGtu+GqKP3b9Vd4xH/8zh3KHdW/9m/3X/3yW/fO799+/uwu y53Pd9TvfjEvrnM/fov/RhdanH72L797++d32OeuC/7HF/SP9nLxP89d1Tdt6V70fdf05eln03/+ 5/efPn08ffv2m3ef33769ObD24+nP7//+Mc379/6o/zv1BOnn83vvz/95ftPyYela+7sv3j3xt18 +hFe2O8+fvfdx8w3C/qmmwnfvM0euDg341DUo/+v/+f7r79+Y/7Bd9kf3n77l/durHG4uubcnrra /5BX/F9uDPA/vqyq2t31OJy+rKvyVLfluXeHPzV9R/8Zxvjtv717++8/P/3644e3NJDTp8+/f/ef b38eZoR/93ffv3/76R8/vPvsRgaPMdIw/urjN2/fu//V717ev8HR467Un/QPf3jz6c9vP7v59/H9 959xUQwFf+SmyT+8+Y+3fqqVdILf/OXthz98/Ce8vi+7vj21tR+Csqm601B2J/fLH7o/9TWfh0aI L8Z/3X9Zjtq7vv6tm2K/+fTuz+8+/Jz/r//qF5/efROmXV+dBvqBl30ezHOUJ12fu9XPn99+4Ot1 0335lZm+xflXv3dn3D58s3z81vf1d35Zuon7wc3U9x//TJ/pa/zEff37v9DV499fuWH57ad3H/wx 4df4yfDVb99/7z76xaeP3//llx/+9BF+RnLot28+/6tbkG8/fPOdEyb+n75894Fl1J++9xLIC5kL vTq5tf/m23df/+tbJ1D+8sXVA//h05uv3flPv/nj/3z79Wd3jN+9+/rN+68/uldu9L93S+ETvXH7 UL//2vfYp9P86fvv/vX0h48f35tL/e3bDx+8WHHX9ie64LfuJd2B+7fff/6EU9atr/CP/60ftqn7 EZ/YzZFPbmzwQ9/9/k/swj+9d8Lqni77j2//+PH9u+++9VfyDl+HK6O/bx/kt3j3H37zgSZJrhPo H/UO/0LfyN/+m0/+9ovqR3xiJ4lun/S34bif3X7yDuf03+JpF7cjvfvzpzd/+dd3X+fPrAf9mv/1 T+60N2b512/8+dvm2vn9vf7p3Qenn5x+/73bVP0c91rA6euP3/7l43dOVZATsKx4+/7NHz9+evOf uMo+/7e+K6erJ6AbXN/+yR01rCO5rV9++De3k3z9KbqV8KYbkPduNr25Y6K+f/PhzacTvr8fsHef P3//6Y0IzTf+H5K39AztV06qW7n95ZfQnOYPRqr/4tObb965rnaq3T9+cF9/+83pz/zWqSy+gOy7 bjOqT/M38C/w91DQo3KtLhrXWtf6YnBtdG0uFtdW1y5l4Zp/VGXjWutaV/aujeVQTuXs2lKuUK7l pdzKS+X+r/KPumpca13rq8G10bWpml1bXduqS3WpS9eq2j8a19q6d21wbawnqKd6dm2pN9cu9cVd pL+A2h21aVrXOtf6ZnBtdG1uFtdW1zZ/K/4y3bn9P7Zt51oP/kc7uDa6NrWzaws+V9c21y6+dYVr ZVfhs+pqbHguf5Suw2fvn4AvBnwO3YhtwqdvMz4Xfa7uueDv0DZ8aoPu4n7R07W+oJ++2Vf027TS /4T/U0bVD1gY1c5/B0d1wqcfVf/cysKNrR/V2nVrzaPa4bhO+HTjCm5oFz+qOLKFG9WSR7Zz49rp yE7V4sZ1wXHdcFwrHtkWx7Vz4zr6cQ2jurpRXXVUKzeuDY5r58azxzGd3HjOOKabaxc3ppUb0xpH lEZ18KM64Gj6tmDzY+lG0T3d3bixq3D8aOz8gPVmsGZsflhoCFwvA3dqhc3PyLZv3BO/2ff90I/4 nPq5X9xzde3Sb/024OIZ3KJwM9j3C07NoQU3O3p8DsM4TO45u7a4tg7bcPFPt+JKfFaj6yY/m93l taM7ix1VGlMa0cGsUVmhNa7Ozl+AjJ9blFu5uYGjRUnLsQNdjQuP2aUueLxktHANuoFacaAuPEQ1 DpDrDxyeGYfHDQ3w6NS43mSZTby4cDhwOdFAdDwEE64G1+04hX1fUz87owO4g33nbv3F3ZHv0Np1 Z2d6cpY+1L5rXK91rt+GcRyncR6XcR238TIVMJWTu5+pcfOkn4ZpnKZpcW2dtrlwIqxyk7J1c6F3 YzPO87zM67y57i1dD9VuVnVL70ZsWuZlWdblshbghFjtBEfnLnFYp3VZ13XbCjf9aydKus2pdtu8 rdvl4sbHSa/24m7jMl7my3rZwqi+4ONHeMAyboDbDW05NQso2nj8pO5w3ckG5EXVjFPcb0KuY3Wa k8DCqQ4orwbch2S+r2YTqnHGk5iacPNBAcWTvdpN9gV0q6lwrpM4ku1lRTHkt5VKt5VBdxIa1cvl srm2ura4wZ4vk2ujG/rBTYDeyRe/xzSu1Re/AzrJein8Fzb/WLfFtdm1aXPz1k2iHpxk8Wuk9TLQ 74Tu+v2adh3izuG+sfrHsrr56mbhtI5uNg5+2biZ6Tc2vyPWfsP1PeMk/wWWiz+Jm8X+4Sa6m9Vu nXh55Oa4l4VeijZu1tdeOrgV4MbA34i7LH8W/5V5nlwbvRybe3CLpvNd4MWBW0Z+i/daQeHvfHJ3 4i7LLzX/ncktvNEtv8EtQr9LerHd4ML041NOfo+6wHhxN+/uxF+WW8T+O/4xeIGIkrtFEelFZeUW vhedBQrSzd+7uxF/YV7QjoN/9IBSw8ukxisXKEtKP9H8iDj54rtrQWHuLsufwwl4//ACvw2jKmMq IyrjKaMpYykj6UdxolHEQZQhdAMIfgR1/GT0RjNyMm48ajpkMmAyXH6o3GABjlSJI7XhSPlRmsMo 6RDVZnhkcGRoZGDcsACOC4+KGxAaEj8cMw7HgMPhh6LFoahwKPwwXHAYFhyGSYZg6EAHgLtfO1+6 XjredTruuTXuwCUpP6grLahLTbh5D4BamNfHGtzlvcZWoA63uYm/oG43oa7n1ARcq15tcCveqxF2 VGlMaURpPGk0aSxlJGkcaRRpEdIA0vDh4IGOHY0cjRuNGo2ZjFhNC4sX1aIDRcMkg+R2rYuOEI0P jQ4NDQ2MDMvEK6TTASl5VaxhKAA1ERkGGgQaAhoA6X7qfOp66njq9gH7XHrc9Tdod1NnU1dTR3tt rXCLY3Nz2Wtyk1u0XrfrnFhtUI8vm8KJW68HLk76Tl5FBCeOO9Qaa9QhCyclNye+vH45uUk2uDnh dc/GyW+vjRaom65u7s/l5Ea1Of3dV/MnN7hBM7Ytp0+Lpm20b6OUs5q+gmrtoscvRr8nfX9i/Z/U y4Ftg14MBjYeWuzABrAXa5272J88gy9oj6zcsQvuMDKXqYvDjG6wo11Xg+vtDS2gBft7xP6mHu9w M2twWyu53y9oWS2oj0/U+655lbdFc6wGHoPS71Q4CivabxNqjwOORYtjQaPhx6MkWwE34gWNwwnV UW8wuv3aX6m/gAotysLbILjB4yaD2z7KZVQJvHJQo7pA6ohfsrgFeB3PbgCFTnUre2bWtgfWvmne +0a6pNcbCsDTeQF9wW1gNktBlkPHS6JFa4DsAp06PElIMrkGZvh7lVCyYmpvk5B1olJqYeuFFs/A o0pLyOkawGtIVtGi62jglSRriUZ11fXEK8o9ZUm1fkCBrDMcUVlZC68tWV2drq+KV5h/4g6DI0om IpmLOKpkQ7pR9Wqa103YzpzY7hzYDg2jioPPo4pieGYR3LqZScJ3RcE7oND1IrdgcTvhPuklrZez XsqKjGUJCypgRbwG4cqiVdUSkauiiGSlKlwXqzi7urC5qVYh21oqVZ2pT2I1K1QjmSoLvmGZ6meD nw8Lml9+LnhzrAP3eU0TgUXqqhPgSKIuupI7Xse4gt3YuN0NRKiin2fw8xbHOKxaWbODjiyNq4yq uwmRXINKK3+i0mwKJKRIPPmrF8G07K7eTVy6fJq2M2r06XZQ8nYg1z7htfuJ2rHkwVlK9wBoV5D4 8bbGxJYHiaAebZJWRVHDVovYMIlx8zIWU/L4cR0QR5VdIT27QkbUmWdU4thad4YuOUJIznqr3c9i sdwHVMwn9oKsgCY8GfEFavPBCdKiJO3ZoB/REpjRKljJsPemvWslKqps34Nbyn4n7lGdHdHU9wou m/uuOW0Pjf4SbZUa7ZaWzf8e1eURDZwZjZ0VvC/AW0B+wqNHoELrqEHp3bFvYEArakIFfUEvgVfZ L95XgEp8hQ4Dvz23wH6DHm21Ee02bwEsaMt5m+DiJybaeRXafF7+t7jToKcJjcMJDUV/lhXQ5riw s6FEy7JGuwQ9mmipDOh+wHv3t4LWDH6F1mqJ7ps6uEuNn1S9aurICa6cTv1pE3vSvL50AVSvSvah NajRd2bKyISR6RIcPDRVZKJM4ioD3N3F0yO+HvH2iL9HPT44MWRaNLjBhhmB8wHCdNDJUJuJINNg Fm+QnwM4/uQTanD8w9hPwEPPA6/DzoOuIz6a0ZaxlpGWccZRBhzkCQd5pRHW8ZXRlbGVkZVxpVE1 TsALOgFjlwj54295ABf2ABZNCeynbdnzTk5AcYwUPIloCvXsmL3qAwSeNThndm7A4GYlLyBNE5ok B15AuO4GxClBE6JTP+DMM+GinsAm+AKB5cCqw1/x0qehH9UpKGNOIy6eQRptGmscaeCBpmEeeCHT CNP40ujS2NLI0rjSqLKB8y9QnBunjpTdqTi37nfbe1TB6NQsDzOoXe9W/p2mHYaq8e+UHsHiXri9 auzKU3Vqi5Pbtfzhfg9/99VLHW7+DgqFbviGn1Tj2S9sPdnxf/jvv8ClvOh94V25jUBicxJ9uzMg V7W5gJx71917EwXkSuPiJw/ogp5PCr51kWM/XdFuPeejBRIvmNiduqkbVSIGPR7YxAxuHUgOFftk W3MwDgy6AxX3eVpu+lnuddn8oAdSd4MVpl7FVmFKolQEqROlGPESORqkKIdSSIqS9N5IbkcjbeV3 LMGtFKe4KklyluZ0yOXQPz6qf9wfRK49bASL3Qjo+nlwrQvM+C9TH9ihFyz2g+F16g== IeWg4szmgyauNXvYzIHjQ4YD5v10d3np7NDjppfZ8jSSHAe95iu7HWrTEG15sunhtod3ktuZeUJd 25b3WzJtyhVwgDu+SNyW8Xy84VPcLz5+eo46o0MOiRa5gp66ZI2gkit4LDAWbDEbZ2qAg0xpiMmJ MTxf3vcaucef4nxt4Yr/Fc93xeN7xeF7eMab5wtnSM+xP8v+3lLXcgO7s9nzBf1kv8cXV/Z/0hzO pd+Z/UZcho14HIqGgJRob2Re4BHq/lz1Qxk2/hc4Fl5T7dSGzoM2K6cSFF5vqPg7HhhcjU1Z+ReN P41/UdZ91dFx+u48OnEcrukFjoXX1MpxGkEo16LUFKrvILIm82Kv+73M4R7SkoackjR40JLqSAq1 mdTaXBhII/78Uo3OmsRVJF3FW8HmJ6CU3VTSxk4Lkbfsu/AWR4++PrI7qJH1sWDgcVM7pFBnRqnI BLFY3Xpt2asRTFexU9C7IfvVyvHBCyILnNJBcV/9WaI6UnFcGH3EqKZQuHGIfjprcmK3gW+k2XgN ZyMXwjbT3tLh7jIK8Ar3llqBOSMqKgKxon3P2/ajk+9+h74g4sZvJX6kJu8OX3FgaKPrXA/6AVgY LeN6mno450+9J0p1EKOCK/5UdLPjWUMo8SCSuOnXQnCr16gLB7g0xLWCRrlCnEsiXRjroh6uWD8r 0Zl44djKxvEV8svOHGeZ2EMrvvke3Z0d+2sx8gIVHrGqJADjHbjotL+gL3SLtNQUiLcwEK/ACyLj X8x/0VoX1VqD3soeAMCbFW1gxZ64MPyOLrG2EDxsgtcyGoGg77oC1EtAGkFtgHcM3yKdJAUATnwV pJEIUqNI/Fq90YGsYyI5r58I4toK4mYOwoYFTckqXFDiVI0DlDJzRpWrYuESBMuggsXCw1KXVxd5 Nry82Ni3gd4NMO4N/9w7OMq9kyPycCQ+DkAnh3dxkIMjuDfIubGwQfWw1lbttbYADuqN5jYpNAit 2cgIjS1atWe9AQVo8NRiKxtzR5CKHQneY1BNp2ZDaoeEIP/OEgEDzIhhGSko45rOabROSJTATNSf 9L7FnI3OZ8/I51R9MJw1nLeNzxurnyneIB8auyLMIQF9ZFAHsgFT6DaG7my6Kci2EA5kD2W3hykg R1qOv+e2iFtAhgTKAHksgw28BSnstNDWLfravaj6onVKs1e/2mZ0xrRTQuUtfwNtq5qe9fupstZ5 LbH1Di15p/X6on+nFg2yap3OG3Rg1NW6nOb3wMHIZ+cVRa+86hFVs67k0K1o5I1ovyWpmXikpjVO u5c4GlkU2Nsn6e0T9zYZAfIW9XY4nTtCe6rK8zDW5qIeP9RDVxR5NR85yEN6+pjT08cv0I5jPX3n TiqjuMLE2mXwXNRXQgruCbtNPFYjVobwC3g/hKiaKEwl3o0JzIYum/pGG7uxI2hz90oXCZRWoeC0 2dOG77f8AVD6iIkxspExa6SL2oaqwKqBUnmK9RFaCagrlNwqBZXXbJ5ULBDDz/CbgmjYRFmynZtz DsVxmymO3EShPzeGYII4wWUUrDKN6LBdVppQoAQDfZMH9p703Ky4+k2x9ReNEha8A1An1LgviHk2 BC0KGPsz4Ta0sEK1sIVGzW1UfrvSoHOJm1jNqhYFoBuJMhIARKLRHe58tAOOHJn2D8KqktNkZvxq 1ETli+3IYEPuFb5GjcWBTzexmbhSWGsqgCNbBWLcKb5VowpIaiDFufzThsEvJhBeoEJYoVLglEJA vdA/R9QOKQw6UTQ8BMPds0Rt0ftJKRzaoOJDIfEOFaGJQqMhLu61Jaczec1J4+IEdvWaldevyIXs 9S2veS2oh61iDpMhDIyBJvu3Zcu3I0sXbV6CTw/OzEX92Jm4k7ZZ2lMV19TBmAWxQ+xijFXVrLIa 1FUTrw1ef+CEG/HS55I2GmOzTRxpuOClBfHaoWxwqx/Qhl91+UuaFFnyY2IbVUnQdlBzyMtNXN+A wrJmEdmKUFQ5KNCQkCUjplClK7lmX0AMqb0DUXvNWz/5AG7qZE3drIeKdqTvqhMUMipv6ggNmLCA OS8j0LNRXMEAzgX5rNhno8GuijKcDL7UQgxZoQXUaUuDJ90MnnRhj8asuMNRkaUD+ziwiRFhzZWc szo1VyIneeK0nsB6ytVkCYbDetiHB7BxUJdQrPuH3tsi7PikPScun+D0QUMAjOdn0X4atW8IyRZ8 QIy+ZWCeQDUFhOu2W2CDYeTduWdELvmHCMHZ4ColT1HFaE5qhTQxhcJ8KtSYWk32QjqV4q5Y2RSa xRTK90QROcCWpBNCFzCcPjjCQO9+NpZSuOlWb5adYgaKvKLxZAHJCAgnTHKHthQjkxHKWIkTjd1o exda1oEGqQcNo6rBhSZOtFKBfhfTNmkxFOOZ2ng9nIuxrU7l40aGOVQcIHiuXZePDzxytJtmR8pV UZWHWc/Tp6+R3OTDx9MfP717//7Nh89vnWGSfdt1XSemCSP3GlZYSFkhhaVnLNcQqWyoMBlUH7VN 0H2ATjFqJbfKtNq0hhvbKzYTeO2lAfqaQhujNh222fyeGWKGDcJLftt+bcy2gV1erqHYQa2DMucq 1DVGXKQrJobWiGMYVakoOSxAQQEfEvDeVG8kzBgNcJoCoJIwopp/QdumRX14Yi39ghpwg5ovOToD gCtO4pxJmQXFbgXHZq8Ivpxzs1FFtVfsphlnCABOHmE7svnxNGNKvVawwFg4DaINKHkEHs+MjO8E N3398eNCA/8VDsiAEnwd9OyQLCo6dojjx2p2YC3YKGWU1G0oSyYwEK07EBkQlcHASdOig8+c60Dp pKKNF5JILa7kRikOOtTPe1ZpKcJCMRbS1ldJjUetvWCATiXkB6CBlw43O2FBGHEfnDkMwwAizVGV kAzBhVjTuukbvhpsMx5aOM4Ku50XlksLA3WnPiszbJ/GAPdnhmESQ69JDJgCgL2m8j/eB3JtOGxm v4DE4p8O2nzYkgfoq/WgbQftkm+g+9W+lQfN7Gg2nKi+FPGoaNvFwMmjUal3JfhXBMfdkWnVaVx8 4Og44f4njXdJk92KLXy01yQjwG8UrgH+kuQAaQ0jwlvOFOjYTdKzs2SY9IxTeKDzBHQEV0aPoxeF PSnSJLVA9iNphC2nRg7CARBoTl6WkX0t0uwj+F5sk6SEgoHproG8MK1KWs0ZDNz+V6Ej+PEfsEQE cI1bnNvaQADACgFucbvys3pFwp0LGiwNkuz0fp4LuPVFH8cHROoCFCuUF0+rX1gOmOOA/klzqedt BPTOdQqq9dkPJadTU4bfHktaOVEu3h+CfAbPD+e/e+ePd/1M6rEwXp/I5yOeiuDtoX1Tds3Og3Rw y+Tt0m+Wfqts0fouMWnUW90T7o4t7owFJoLOTob53bBxO6E3ozfM8BwAc/gof8/ncPqkN7fTYcbm 5I7pdzZvx/qkPJ9WW1WiDpFCwImnFUcmQgLqRfOUrYsopCOTu8O4iiD2FgXfh3EWxa6iqbXJx6kL pIadF2TnAzEOkN5AY6wnQHwBbjpAxhUw7PwAkRcg8gAE658sf2fz92zzi7VPdr5Y95IyKEmDI+sL ceJgLWnLPnXwwsmDS5Q8aBMHJWWQc11pZcoG2WvjQbxw4jc5kS41t0ppQspLQU2Xk3vAhnAF3vJn 5g6ZGOs1sjO8ZxKRjvyADBWr2X1esUeDPOs+f0ghECvrGMFqHNUy7BkQEXhGBBhRsdZQCN+I0Fes rMnMitoOzCM961+tUFoYBpLAQXKZN4iISGYlIxGii5432MBIEjhJBO8gOAtMAQYGwk4RPYklKLEU JejTpB1TvPnFzrqIbYvR+PaVoob9+6WaEi0wFr83GC3x9W+K0RJ/f8umwqBGgpgHyqkFMVgrwWpt xv+fw0ctJqiqgb8YJb5P3sqlbx0lcHWemeWYyekpSVyKcoKjPK7jNC6r0OpG7K3OFpNwcAd2Q1wh R1qPXEOSflMZOBGlYUiwmynPgDm0iEGrZFahTvmzZBTCCEjvr0nQlTseFJEmPW/xaBWDXkN4WqIw IQ69MtvBJcSZY9CrDo7C0kbO2KWc3VmjqSQIKFkIJ5cX7CTUvf0WktC95Ca/bYH52yunnpPB5iUx +Un8CiUzrQHX3ZRovjCNwMAp5v9lytnLHxB7DuW3PC6cxUutvNqqfANO/5WfYReJdhK7i8iJbQsX IAeso5zikFU8kNmlucWSrbg9XZ28XyO9O6/sAQafp3P47HI64Ea00aZbZJNJ0twOSFw3B84bg5YO NCYcHKO4XshnFwuxVt948IvHPvHYF75YT3jwgwd/QfCSBt9ob/LexaE9cz70YjLgN1REyI3H+knF yfACdW85Jb5jDWfgxPgxCvMvjG/nJPl4idmFFCZ4w5pYp9Ocp3pqKKcUEDGMNSa7s62xDSIIQdy6 XduRf6ojVBsYEr24TZk2Z9tiG/CLvNNoO2gX2wz80bP4hGme41WR2S2cbTKvZU5LhLNhq+sC7I6U yDg5I8m6kTgmWTKjUpFo5FINFjFW3PWQrh7r2/kmj/V2g3v+KdtS154c0AvB0luId+XGK64pp1dF mhXklasIRG5jLZYvYdq5q5ykwSs1EyDax4pMR2+7jg0WzrSzcAZQEycYONa8IbbES8SYaOHdKWti C7oFBAo+QXpbGr6YN1HiisZuYebEDdhmObJXctaKtVXUWpG8PYjslYGdl51aLWS3NOr05GA4+UXJ iqEmflMP704DgXkA29UF8Yx2xwEvxVMa5N9+0mEiXevggM9v/zUHVIFR5PiElR8AzdrSpPWn+RQp oUgDURq5YRVJQGohtWiMiKC3lAhaMKvWbI25oIPpSqZTMF8DMtiQe4NaU4HX26YW9YbGO6T7RNhg Zd5GUwt2aYatYYkWBJxggkeNL4S0oEUtMmwhGTG0S9qsIPW4k6HpixbR8ZyliTCRStgsCqxf4z+u 3G43ZoAdzz0AYkw8vKPwiI9SXwhU5bSvneO+W55bZ/GdBn+6oQ5X8eiBCPHCwBmuutIwCmXs6VDn gm7Kfbs7OxuzObXDeRwqA3J55gGI8uRceS6RBqExlMaLRXmcqV/419Wp6fEIpwYTFiqTC/3kr/IZ AxiHoTdxGSD3vepMPeYvfhztKZ/8XT7nqN3CECSu0FOd6vpMecH2NPf8+1PSEeZ3bz58/fH/OH14 ++njFxD/iYe9n06lvU2ooqJshYQYw5J6BH70JvLu7ImRhBPBCSZgighy78TcC7FPLSWIiP1ppSh+ oLpf0P6s/rdHlYsWaLmzgi5Y2OBpY0i0LLFanlrNxkADzVoNGgQNPGujURqt2mjNU2Oa3slwwztY LiMwpsTyI14DwzjuY8VK2Dd2Y+82LHgiL1bKjJXOhA0OXHzWuWfZ96gIQR1586L0UuCE9YtJgNhP jSHh3Nsizr3SzIwOlF9NpkQgV7sTmnUv6VBKBd+a2hVhPfMYwxXms/nAuZ4f6QMOtA== XdLSbsRvkOlBoD/JDL9k0khWUqU5SWEeJGyMkGDurxMyWkrGSZ27q2VlBEVw2KkSSBrbCLaRI2r8 SVU8uJ4FIjMWPTBgqhhYodRwKEEma1CnGw7mDyyFJD+ZquNgQGFR3GWjpAx53CXtKwNX2kDkpZsw gzIwVL46Se8GTTCXNaY2ebTlxS3uxq1pnzS0YoJQi/lAC5bF8CUxekwLX5fLX4NLfYS7cj+ewKYO V8l1nsKmzg5YeBJTxR186nAEnHsKn7rFzcEN/t/7GNVfefJ/cjz5hG54dGyzo/tXX7cPj+9z1u3V EYZjyOvzRjis22ePcUrElZj94R1ne5X0l36qfz/XLjv5t7HwbP5tmyrOO+qrnfZqp73aaa922qud 9mqnvdQBX+20Vzvt1U57tdNe7bRXO+1vwU67ZofdsuHuttOWd+/fffjGGWNvvv763Zt3Poa2e8sd eXy1z17ts1f77NU+e7XPXu2zv9IBX+2zV/vs1T57tc9e7bNX++zHb5/9PShx04Lp3qHobSh5y6Vk JRc8VxWXMPdcNLfL/EtBqSe2DuC+CuB9/3JnLcG/B16x+6SydFhzA5sZVGAGBFy1OqBhOJvsUEYD aRaqLlMewN3wxYMXL09K3yeKJOFCjEjhwzzMcRhdnYrwBGlzqxgzMhZAbjYmMiflMmI2I5yZVIoh 4nOsIz7HVW8nLWiiPI57onu4KkSZpzG5tXBzUmvarDU4uL2YqsmSNekN0vqiYnbRW7yqhIAh1G0O NZujWs3P1Vqf8Hj4gET5eW9q150J83Cz7OmVZPlczVO4XfT0es1Tus0XvclpgNu1Xf9LbvMFb9Hf Idy8xSfWr4XHbvJSRvsK3yGJJSoERaIYpZN70J7ItUSphxoi2Al8t24Loj/8vtQgT7Se4cDblysi nLJQ1LGjj2gM9q6mlBNjQ5Mw72YKzPe0AyekG3Lo1I+1r2YQ+7Pcqa4b/kemtC2fY4vn0IA8rt+L pkCHu0+lvOOAdLgXskGG3s6XI42F60pFO32kcEqZ9LBDhn3f75E4PocknvjxFWGFH9sP40WOHx/W r7b3d5MYxyaa5lNNhdEbrQRIKHECIY7S4fgLU7J0WzOSBicQGeAQgY5RGKVn6J00ReKLlcpFtnaR XGeh15hepZBkdlSZr0GHHJOSJ1dKJGBCSZ7WI9oRu1NhC2sBPVP7pPGni7SdKRT0cqXBryJXK0Tq 0ruSUu/Z9vniA6e6XH7gEg/8ERGDhPKQReT0oDeTcoo/SQelke18xVM3Xp6SbUAuttLd3OJuiDjY Sne1xL7W+QWNV7G40/tT+9R/b3WsmPDf+2R/wDz/VZnXWs9Rg2rsggosWRfBtvDKKinirKdGKrg3 +lU93SmnT9FEiSf4WpjkqNTvccGcCq4GSUrjJz8OlkUbKOyiZc9S1YRK+kVvF27EhHIFmK/calp+ +dlaKd3sC46qv0u4OapPuFF/n/D4jfpNa8eh9XIR4w12xdTHZ8eLJ99jcGe8uE6Cg/uIMfcYaKeF brMdZ5k3bDWfg3gx0dbejhcHDtqLhgc1Rsy8s8w4C1GkOIkTPxoLNnUWsdJiQRTZx3HC4wVxZUmA UqblosE2LhiWhF37u2AgJLHAuISnNRnS6p0h8CcYARx10GFPgQK1Ce8N45Ab+FDBk8mK3bhDVMBp NBFhN+yPRnll/dHISZRXhi8zeikVYXUzno9R3jCEtyO8wdS6K8rb3RnlFXoGGd2IEg+igL+say3S ysN8T5T3YqO8toqY8luP/U8xfmtZrq7Gb4WaPwiSeCoGWhG7EQRiRarSiogh4OoTvr5Vw6JforcV CvyBaRQlfttz/Hbj+G2n8VssP+GdC776xIbR29aNsK+zdsF6E91PO3p3aDvDy8ZluxJeMrrj9Xa4 5lD/aY/aTzXm+rKj9kNFU+8dtxeNpj6OgnheNDUzds/IN+zHc1kVY4J2lXeR0WcsPS6HPyjPveu6 wNaT+xC/5a+w6uiDrjo77aQJ38p9SN8aBqde0Adtc3abkKnJlftQOIfcoNAH9egrEjcRn9DuQyqV PHqVgj6oOrwmU/k48yF+q2hcf/Phyu7slKkhfCv34Uvldu6q/ZZ9rgawe/dUnuoIOewf4o4mrWBQ q0KUAaHOblgZGCK7UNVRiLTRWBOtM4Z1YkMccXfWfH2kQ9foqmn1aukpegw9J3TyLOhGR5/Pir6f S6Rqy7PmW9sDLN0zpw1SeLLSa6v0Cht9tuYK6frk5+Drj+IvZgOdIvpPwtDJz5U1MtHL8B4Csy5V d1hNdYeRqes7pqlnaRzJ41giq0yGPTTtKTI5lLXY+KrkumZmHh6VVl/I9IVGv4oojzdlk5yBaSSF JD9ccB3xRm7RZjIJW6QttbGZ61q50M4cXd3IVyjU/4HyvzFXiuzNSoppqDD1opUCU8kvLfeldcRk XElHMOo84ztZWlL1dQT2kDgTC82rUM7ZMo0LYvbCETzU7tk9sLMtY4x48AnYlWzXsbuj4AfYB+qy YTpaZJuuz5JXaKUmsTg0pBpvG1YoXr19TugAnkGt5hX9whuXkSDzRaRWiWUmaiziS8uKtQurX1gN w+oYocSqVTOSUrWQqbJ6pG+gxkE1dh/VhZIysPBUTYhoRIWnlQpQ2JU2a/3fQTlZY05uueIlELGC 4WGt5dL14lOKbtfVqdJSIDtdifQEbXv26yMiszv4B9ychaKw8HR6A5IFMnufYTcceJM+D0Szh2yK dX12i8koNo8filSTohw7fxynvFS1Z/orhYKv8LpI75Wnc+vrePrj9P7TjrgVR6fZnYbBn81oMy9z vMcUjzGreIwRpQQaQhT8kmbqiQ3h0ZuwmITGqKB8w0FIDETCLkwWh8pmlHoSKrPBMgmXlVEl5w3i Ys5BC6jcrt5hzQmqONGgn3xGTajCGuADissL15jo0RW+r8K5tQWoG2RRJ0jDIHYqw1mwi7tHR4iv xElQ9hqdXd7JNbMPG2tx+tgoua2935Lcj1HdHJSLKCFJVtr6OR1rQBXGyyovgb0sZqm8sRayAKom BI70uo3XcSRoVtxTIfOGI0sKKllHoLgCxd2b9wXGKUCJFxCMx1/dgBkvYD67I+MGjsvWUaz7ed6F YyMVVDY/A++RM1AhtlBpo7lOtR1KB9VR6aBCRXyoGoSM25AtGmRLBqUFg0hhsvWCIlAExKiIuKhz y9yloZQx0sIKJW4vom5ARzSL4OpcVNZ0fOQgZCxiQWhkbB2dZi+cuCL/hV8VK0NXGYbfZ37/ITld 5cR0FUtpG2oc0fcaR8xsuNEGHCWF7sKAGF4oEMXKBo6V2UiZTaQrTIVGiZMRaE647AdIKjLOWqJz NZUYQwVGW2yxZpSdlNPAkhqQqTcdqopSfQ1bYyMuBmqrfa5ac0PqE2uV4n0lz6Nq1KF+sVbogKiQ cVykuk+a1KcOr6Skh3kNB/Wlr7V8XWoeQbhZ//oJ7VowhgLYnRYY9tbyZqIWAwKV41JQlbdqgM2a JaoIVWqoLLgp0ppdBeeiSbyMohoa+DR1u9jwsdW76rZlEvSOSdAHdPkJqFBCaStToXNEjaKkKSX6 nhbdUqNPEUH64oE/wpNuuNK5eIrwpUurlDa93pGnt6w0dWBY1OUxJG3Pq37MsM5BvohundtVvvWk sIppcPwR55I/oZE11CuclkrXhLJQtiBUZarV5GrVaAFeuIzaJtNmbQt7K67WanrRqk2vBzSv16jN URuTwYuHkIYRf8Pug9DGp7aXC04bPDLcrOEuGJMFMUJb4hNuFS3EeAWgPF9TP1FyfSnbl7zDS7Vp oXWqPdFpTfUZAxoexe6vqAKWuS3KohFtKL9ve5B7gcX5KhWwPeYFj6gueGGKIE2UoDVGmX2cufeg dC8sZ7S0fAu1IyokovCNSkWQMCPB5aUTiQERJVRPHikpGjVT6SGmreAPZN1Lue1aW8utDw3G8Jij ttm2qxZVZRpmCQFXm8m1/qmN4K7W+NibH7EBYmNkwQaJ6tUDh8okWDZGKFXBqMbAW4mbWZQqRc9q j7IsTQhti6rdhlq3nda6zVa6tYVuIUmmsrVu42q3JRrFtuKtpFjNPCpY9xZw+vRc+9bnlLVcATfU wK1wDZUMS72wG5PaqtY92fdu6c1SPkjrussmJjs8KxS4bqk12mrT8KzAflj7iKqpZYrY5KuNsdoL h7Xtl6c3srtv29pH1nbqCkWDG9Qbaq3uYHcHy1umv1jfsgDiJVACrwILlLcr4QZqmxdEqBTdS/5g jN7O14fOVYfO1IeubYVoUyM6VImmlTOzzBijatG0imQltb46kJSOlkVV6SRjCJLUT665ZKCxe6Ts /RwaSJUsXoChDVHrk9ZlGkoHoF/Z1jy14TzkP8Kj0hZWlVYYNPVAN9OCKbgASoxF5YY0K9tH0wbT +qhxCXGIpEwbSZvGSJ3Q0kcZNxCxFFq2EOq2a2u2LVAu2TYftOlqc6sUVArm2/0mAEtPKPtnti7f 4OiD57TEOxa8WSP5jigQwAEKbzdW3sHklL+x8o6lqjuPXWfrAz1yDPSNDRwZObf87fNIJaKKcycf FVLhig/i3vFHbXPFsF7kcI95zoqs66yIoBW6ocoWK1suzQSaUDQBJ60+LmBfqUG+cvCSyJ0UayEx SypK3uAS7lC9ltrkUp18UplB0OAVBYwXOBdAt0eBsklwwg0Kvx718L7OYh+e/6gwdlIDbi+xYUE4 hwuGVArUNmr04TTcV6PpmRU7okR/jkehYk12a1gQldCGt1ahGKZkxSQoJGEhGxSinbhj7V+zwdxM 35J92KmlwPQJJe64ljyhRfIEv4luuGn6bbLF/bDCmtuUz0TZTATO8rW2By+dayy0vWKUpnc94Pks Vgy4+FBLKciP3iAUAkrB4hSkoHR5FarAaBCI0AqCVeh2dTpLU6fzapVO2MUOdnEDgmaIYTvsgBdZ 6EUCFLmkuIv8jVy/jfgmkkKjsL8BU2YUgx5kCo1RuCgiBEvd4MIjp17wJG3A+7/BZIqHXHGbEJ9m ix/ki1PG+FrB7YxxC0xJlKqH24/wgFPcIKNbxv8y3tHm/QFvtfmu5sYYVC3et/WwbdmGCwpUA5fK 2kWsoSN2P9bdU8XXPloqCWpbb9oQtVGb9UTMprn5Chz72LRdpEXu9crUGQ1u9hbtHMlYwaqjQHV3 KZZk0VQGUVWym71lZ5F1sYfKo7M41jd1qofioxVnp1U7F3rHWKzORLgH3IA8nSFaEcdmybPaSx4Q ewayNtWtdsVGA35xvKzyKydeAnOY9JCb+1FF9yKa1MH8CQ87hzvAF/vJK1OVzGOJ1Mn8LLgGbol8 hTQ7eX4Cx4E6jgONHAea0GTXkricVlUmM7OJAj84I4En5BYlV5U6+ywCcOQIzIrOzEuUK0nQknbo IWZRRRdmSJmzVcp7E/cN/AgxDUI/jZDleomZXvy25sMeXtPbU6D4LZc2NL8ZN8DbmQ== bGj+8w03NCFAaY4IUPakW0IO8aLtJQ+Ij+vaeGqKq0l++wqPD3PlanZ/765w9/EdnySPn0oq3usB Dw/GuNvtZduP8IBr3CB941nNPGC57zHf1SYCcx218bAN2YY2Nyx90rpda5PWJC3a9YEBZaFZv2EU LDDR28201TR318C3Hx6TNgnBDdoEydBpY9VS1dgaDI+PcPmUjHAqNBS8Ka/Pql08C8MPhyqI5GcA DcN1zKLTsvpcK5tOxS5Q4dS5cLxw5bCGgNBp37tzQtzdXvKA0615+JwZOsLVqarT9eZs1VkK2cka q6j5WXowPyGZnNIh8ayMZ2Q8G+08rGkeJjNwN/fCvIvnnJ1sMtEqEHapHW9TzC+VYZiiAFpE3bR4 kK7wTOWiaEWWa8omXMYplxHdUY656Z502TjhsgKTbylsoZJqWaovL2UmIvZM5SUittOSMUUHBvpz 2w98wOrpDTJvZgJEBy0TV4YoyHw5bFum5R4LJFvsnLQYoxiDIAfTFMEm7lBpAcIZ0J1iu4YAoAQA QnycsaRBFYk1gEhkJruxFV9WUrFkAiOUgjCKkdlLIneGHWldoK2rIMNaF2SMJYPLSZcqEi0oWMCk Tk0ZuWIo4SKatTkRKi2TIZowmc+LqUsCfXNCj48rSWQrBJh8AGk4j21b2QjZ875OKUmM9z5XeBAf qeKQlYeby3vuJt1LTCTyCT7uMEN5bp2lfuqac9HYjOuXOiDB2vnGzpi/VAksXYNqBIfXECHmEfkg TwJuf+QojwXqmmygrsnnQNNjj4QjLNygMGNJ0SUk3AUTFivlXGoAMxMlL3Fi1pSFUhA17bDS0F3H OdNTBEleMYCFdVoA84jS5OmIwgddV3XC4bNk+EzR6QSGaStmS7XsZBFXasTUY9nJEJ8Lyk4m+TdK uGRSBkKyACUKcHwkYsxUxlzjJtpHIckpEdOodobRpjejJUnUG6ZPE26x8KgmojmrOaeUMr5HTmyf NHWUEkZLZryRvFjhvRkYhDF7rEYYtEKTZPfES4E8y6a+C6ecOMEX7/q29EuSCdxxTa2ZKZfs2NHI dQdkuxVEmcDKlBbxyllmucWkltHI9WbkPKMcog154NCI16z0ONt62eWBX8sEr6JM8A1MVrWE9kJg T7JT95ngNpzXazat22fBBPI2TaqVtFpJ3woJXOUuP1XYWhlaBgZbdge67CANuA2aMWSzuu4hHjmg HgGrBe9z4tOM+DgbPh6lMEaBVWDbVjDUAiFf/9YYpTwDXYi2QmaMJk2wCyl2AfhnoX8W/MepdqDK yFNGaDpMurvAHXl3T6KGgYgbxoySXU+b0WiXiMVgTjDlNqDOIXV4Bkwg5TSIWA1gBxVojFlg4+wx YCCGDJiIO6h2LDpxChzIpBxKdnmSb4gqLhymHOYTDnMczBEDM1gK5ojW2f9LTOuIxI4at59M3b9Q 80+43m2oA+P3YAL4FSeD2fi9RPAlhu+j+MT63nLQw4Y9tu0CnKVS4rPkHBXJVLnWcL4Q6a9wXAaW S62I6HtH2S3p5gcuVTDNRG+/4S1TgcOO/IH+fil1jm6UMt38TU44SRaN6DQ40fyN+cwbfy8VXpmP 4YyuQ6lkyoPZH38F8r8KWF+plWWnUQ5I/3NBepc8E6RlYtUSap65s3f9vDllw0dWF6dMNKw+LEix V7DO0GOO2WQoN5zG8FdlOEwjRWkwKgBgm0TF7pXAB5VswHQ+6o3a9IO7f1TGeietfe5e5bSsgWlI KqdJDW71bcxRrRBpAUlXEVA6hklPx4kEQiov1WSi2isMf24Z8czpA5o8EEqwDJovoAVYQJnVbLGc tL5MWtNKC7DQTcpNpfjvgP4+vq1ix5U/gfq8As2YJRozNHHJDcX1ZLSaDFy9mbhUjimUI3WaSPDE DvG866BmOpPIcaAw/gjID1bhirD8c1bnOtrVdV+HhD8+bO1ZD2Tqg7xKdLLzORz+A9rtnbCSdMpK 4jlBxOivvT3uiUA6ZDFxX+/dh2V9qlt/mGC5P3gc4ofzme31CUlJeieTPCy3ZkixwHLdCzcZR3+o Gk904El4gWM95E+oc+6EOkqZj8DzFl7Pskfx+ILTHxWpOxmk7sI+wA1rMeMWLZlypcJaa1x3lK4s RuaokLJFjU1xEyC4C9hXELKYOwVnjbyBSG6doFhCCnPDyKpeN5YZ1ItgC6KkDMCSmjwrQVVgAbbs zpxZbCmehdF7j1RpBlsdZkfszZl2FagBa4nRpW5rxOptXBHXeJ0VwWKL/dpyvyPjWQxUk8GaQj4Q lL6OoqLuqn9KzMOvB7zngCX/LAUdz7yB3ps1IC+/EATO6sfaKOWO/FjoxGp8EglmFhCji41drMbm SsIc2eBH5gH6asPn9ZaJvHgTkJ6ZgE02ynMUPGIknzbGyAH+6kzrd23ItJF/jmzZTpLZDwoPCOgN e5fhYV+T4XwxZAAFm1olKC9AYlUpdL+9dJmmNAeBNQBNe+UO2DMG5FoyHsaXoK+BKAYkw8Cmb9nM zosB3gcXgc0msG6CZzgKcnkF07qjJILEQRDzEcWugcH4jILXyHLPbU4pYGfAFDn4bPZo7OOLi7SK F8n4kcCUXNqXMgqh8BAIt5mkqcevClmka+JUStxKWc7hbPwb7giBP4Ez2gN50RaQyqZpy2UKX5K2 RWsrtAXMUgzonbBqQ0p8WN+y9jsz91qZgaCT0AayoyhzEjoOktNGhTUKDCb82+tc7aJIbxzjNfFd nbwmqAsa07UR3eNorkWZxIFcnePW6TUbBElAj+xjuZEDLA7ngonn7g2zOKprS32lwCSFjYBBJSWp qM9vjO2GJNP1uU3zDSBJpL2nddcaHH7UP7GxeQFRTvBRG+9uE+ToJTJtvqstcY5zvq13NKMiAP+K IvyGBnNgWjcfkBZiNX3B/1d53vGxKqNE2AeOgZZwL+ZyQUF3QgxoiqoGxEsKk+9TX597gMds3jZr 9Lbe6m2iGLpUuBHPpvgzxZfZMWXvvqJUjfaxKWMDmMIpzOFNVFdKAqk2+F1rCRvhUx4tF5en2hQW 4toQcAmpskkEMlWJ8kVsRptusUriT1LNxtaziYks91SWbNpCxGhZ6uIMWTONVrtplWdGqLbkEShU J4jYVScthpNp1u4Up22prOYxp7lwrfdsn0z8JLryQFm+KZ8zPUthdaZHrbzrwrwuNEISi++U2XlC duoJ0F8oqdGB1/nCzM6SHV1wzWrJka7Q8xhEdye50sBydVQhODChwqwybDJCaFF2BuRsEBYHZXWo wLhmak6obhi9YfKnOMlayClsUlRMZzHC3alQCVFeGSEkAkoioFoaY2l2jHAR9MQoXPrAMAoxQeUn QWCYYJ+bcNQL2EL46jfS88hoBRMZoEfFPyXpW5A0FcMzauWlaU1CPdq8/hXgH12UZ09FClolReiV 059eBzaGkXE6kovvZhvwtLP8EESaO5aWWmLm98YdDcUYE1RA9OFVNovA639PZZWj2iq7mjjA9lNv 4+sJR7cNrt8k6IaEDD2iQ48I0ZdIKzwsTwvGW3+MH96XVU0Lq26C+oOovqqQSwuldCCUFjrpJqaT 5hbIPwKZYMo/uHc0hOo4oTLDrKiXgKbI1T7YzMjaEgJqP7cJnuLOfPw9lS/YwHqGyzcOradWR8bm gAOjQzDsS2J3XMeuu2kFURpFo6nQQX8MK6fY5VMEI2WzxkraDjIH4loWAW0xH+BjLGVBCq5Q2xd2 rAU33SYZ6zX4Tmq4arWmEOec1TrFuGWIYMv3oJVzeGWDWYYItnwxRu5BStStZKU4s+Rq+kdU5F6A iFvE/B2yWLuI8ztT75MjA5zRCqa2tw8NrAGuyAgIoW2QmMBk4gGb5rgq+AMU/THinQX2Bgpko9Ir yEHBeg6MFdy4pl7NsRkuoso1VKVAyMi08lhdDwyz/OiukGCABALskbrQ91gAblLkRMF/pgK67wZf 4Nz3AN6/j4Z0fM8+o5d56L3qNhkG+pF5bwIT/aC7dMs7emM46aUaCPHPlYDk9BdWL1dWQEghmZAw ZWI4gRR57rVaEHHWN6wbEZr0mo9fOOn3xbdj4piQhRKTuAXymDkmcesjEjfFJiQUboHAbdAgfheo 2wJrGyjNoRAdClHbIDH0FypgR65JSNBuzy5fJ6FwOHZGBoL9pxHLH9LKY3WRHdArTVmIExaupSyg OgPHCVFWHKm/2gLZLLYxKiCQLUQTlRGwpe5kjI9GeElGWMaXRtePLY9sxSNr0Q52XGVUZyFEcuNZ IRvShmXdBXWCAwk8jiGryjuTvSu5REokSqfyRlBrirwvaI9JIlXJaVRebmBxdy8YClz9M672Hi2a Shft34NJ85Twa9wqVmDSHNOUAt43kzYobYp3p4QHXrjgtyQYY+jf4Sr7e741mR1Z3wn88F2mybae MsX3ZtNP3oEr/0z/IMhvdrzkS1nt67/fLHgPAcN+rT66qf98o0A67IoWJDXSo1yEsMOnrBUVR/yx ZrflZIoZmbJ8TMTGdETGBIGNCaObO/oKnNWBBEc5OtO2ZttumhOnJ0S0O4HiM27jrg2Zhp4viHh/ esOlErOExm3/UJohSJhE41buWpG2FNEKEfFoaIFCBlm95pttekqD3VvPf6BFC7Zq0t2tP25w7UOu kP2kBmq4H7RrwLe6Pns/2jHwLfwD1dMSH3wlBbrKQFnZKJqNP+O6Lugnr8azUzIzNWGefyhiv5R8 vF5rzPhj+upcPhGvdu8VCKGj1LxQiqtr3Htdb4gvHz2Svx5TlYyiFzV137lyil7p+TxbCjLgnYzj uXH6nen853z7ofBDNoOv+cJPgSKKPpTsoe7YKy0ZehdO9IoZ6jn+gKldNhVvIE7uSQkzEX1nGDI7 TegSlJ3wTF2YSSpA61qmjBqBkXXCFCWMZgFfJwi7mmVhxxi7XsmhRt4xEWwHgR+qY++tKRLimwha JpnqwqPXNoQGHNsIbTpo8+0WXNGlBoUCvlsCBXGV+UYh3r06YEMWHvKfblzEJSRPUtSoYxc+ue2p sMDKDnrJxavYD0/D1xFWQdLyAl7ScuYJZrJQhrA6GttWYZM9m1i8S9L+aRnBlpi7LmEGKyMOuzIE C0CngzShtksf3e12fVAkrzXNQbD1HWhoRvV+u4EBKasZ0dJKmKXnkN6otKyLBmstplXi9O4BTEIr oNZrwFZL8bYfrEoUh8aMWMxJGFO57RkIrZakOhTslKq8ArZFStpBu+XwzxVTPyjea5z+K0RlcCX5 MSrPGWXWhfzHcWdZKzvAUwzr6yiSkuhNi8RLm+O+EfabyehMIZ5p61GwPR5ae9COi2Bou13fPlfh 3sZhbJV7jsTIoISKqVLftc4yy+aHxLg6QHNTrw/IEUVDNCC+wZ1URNP1oQhjAJlhyHf5HTSpr4Py 4xyU4NSaVeDYusUSXxxNanWgSdoB1kLcCLKdtxcznYkTZbtQIJsQefOOKI66KcDVAg== k1bKooVzAAwdSRyoFHxnw1F7S0wSKI8k00hikz2YsGRjgpFlVNx274S2buiojggc+KAn8UGb+jpN lBwXMsii2iGA9ObW96zeZ/VGBPdzcECHSiFi6bM5D6bcTjDBQ/WPCd2Cgo8g/EQosqHFNUIhDdBs ulA2w5bKoNhuvtpOqHdhKu6AAlhtsZ0QxM/X2jmuscMVdUxVnWzlnIi5LsQ3TRulAf7qTeuS1iYt 4yCxDfTlDT7Sp+Y7PPlBCQ0jiubGSxQnjL08mZw08bKkRmm7OSERy9YgFjLIbcgwEAWlYbf0FZxg 4QmTXfcQcRFZlrPcwl8NOEGXvq58XCigKIRSmc8EapAvXyAwcCkkVEsMKpTW2tgLvLChFouBXCxK 0kkz0SiIwlFtLhzFAiEnDgZ1C6o4gF3trV31rYiJPfBI50pwYWptXIMrFQuxSAh1ctKiOCoYQNJX M3W4srW4EtFgBQSXkomlRK4GV50KC11/e6FhSmtdkxyjaaEmZlZ8wJMlSb1rUfo33EFK/ANKFtZK vD7iNBDUPLy6QeCmFmVHYfI9LKApzfnYxf9ydJvquE0oEUMmcsnjwuICTFpILDECRWJrwEuqK2iq 8sZhGhIYMyQqQ4hdS/TaxK85xie6g6Qzhxi2liILssNGsm0s28qPfa59x56MxocKjVoRhThSOTLk 5MheiECiWIgkiaXIXo6E+l22nN8FS+ekpboiVSOoGXFhv1TRSMtoRTJlL032MiVX1q8VWKSVKXlZ kq67vRKi4gR2EmVXePJVsljJgtVjF6dyeBu1dfPQ26abs0sntEhbNyFLtEFn1G7IZqrQXlqcvPAy qULNxksjt3DBTfvKiaLVCZ/BLcHazQFvkPhwfu9WUu16fENBMbmF3bp5XSIiY3HrfUCzoOJCRn4V j4Q+abl80YoB+5F1+9rNmgsvtsktsY4XVonLaeXyRSOumEaoT+uCFO9Z2U8lbF8zHrvgSR0oLHrm fSDmB52RPANX4Plm51aYT3bS2Alyhbn+bycv+PWArwfMfZGd+NaFL+k2uZhK7LafJZaiiTcNZbFF uTca9CLXfM3++D5in5SQV+AwbJTDkMNdexBIZUAgexjIZirwSPUdgoIMEFFHSKWdUgEhjSba2Oom CyfXSFZNxeCQxsObOkaIpBVOLEK0MghRqXQyKHvEbFGikIGJxiQSMY2EVPraMHk7oEaVPAwi8OjA hBKWQWwlVJPyiJXsRxM0k5JLYBuAwaWTYpYCUmlTnjHBJQUwkoUXBeQQY4VHJiKbGFRsaQYMG0CU 6G8T+SWVn5P44+T9kKQ/mhT9NC9/n5HPmcSIt7Yp+JqBn8vCv5aLr1B/SFLxh1199n0J+LRFUDA4 SNDPJ+tfb7vi9c/iPXuVLK+S5VWyvEqWV8nyKlleJcurZPmRSxYNPvOkvuicrmy6llbbtbN6Sma2 ILwLW39XKN7CNKe0Li8EKADdo694QJ/xqHN+5KD1wsjwBTCWzakI9PTBbpOUYEkv6iQtocZnKIjF GWM+AtYTdxzlJ2j2WFgoC885k3Rgcg5CTkEDaSqBAfkPURuTlsmr9A12hVOyDTeIiMkvFW8XZvOz Iq7BpyTvDSzohNhvApZ0UpOS4f0K8fdCr0a/fYP+e5kk3qNPnn0KDXpPP4YKKWYo8m/1QQHDdxzJ QUP9LOKw40kycJDS/QSeJwtPi5XQD1z6stbhllwUKuMi2I8lSTVxyxEIqWJSMIODOoas5bJCcokd u4HOtlBcPc/P6H+GjWtkGorJbl5OYEpSZkEJh8ABEdrFGk7WoNIR/pXfy/xjwVcrjvbmx9qNsc9P LHG8KzfaNY544yMzLcuE2g1v4wa3dYMbS4ZYOqh8cCO9zKVM7LnyswCBOW7IvTPcD3+HE6BXydBz LHpmqTDrPrioINhUwrpRh0QKWPxhXBAvLUp2UMIsTVY6KoWG+aWEjh0kzxSzTBsEuVKWqVOLmFS6 Q+ZPrwJ58HHF2aW+YAhqOlRuAlC9odxSUmikOIiUlvDLWcpKSF7phVWRTrJKWShXvnpZgx1LXbmY VBvpEX8zC4k7FHUy71uTaDPylo8gSakVW/K+3jJ1umzjgkwkAUr7dLo7y47s9l8h1w+M+2HPjXfY 6+x82u7cGIkD+np5sxy7m5Q4m01MvgvR+EpDaJbzWVife2Z9ViJrjo8J9/MShcJ64oDuOAZm41+F hrwk3DVrfGA04a1OIwUczwITyrLhqxC2iiNWcYQqjU2ZiFQuAnUl7nQccLrTzfs6fj+F8TsevTy3 4tHoMb8iGBL5dPQGHr1W8S4lM69bJvnZBKKZ7KjV8asClOWu8YsxKnUYPw0kR6FjO37z08YvH//9 K49fqOHRR41QZPuarqTslUp543sMjWKU74FbZAaEi8SQkYDFNcCRKGvcbVOUrx9jcenfpLJryR16 YZ6KhcEms2bxE9yEFGP/swXWmFPmUQGnBf7RhIGUkiHjjMUBtbCQTCjYt45PUrOiXrLKXogKzyfa wBAKjBEUrjWaYwC1KAaOrobO5n0ddEw66oThbwqA+xB4oCUYOHW9crP5wmHwCbFvLdbbQcyrhME7 txArk64+IHC1cYvHJqv7RViL+iSEX61JXwmpKzZXLC7aZst/afo07PKn906offZ023V/G1fTZa4m dtDFrH6hqB1mK+/r2tnc8sPrsQs9yh7asrlDkjYU2PFzWXyczwVRCl+LlVfC5ShDvpILXuPGR2ch JN7CzpAIJqz4hjOwNnXcJAWebS5ArXtVU9r6CsWM7tSMHtVbKBa0OFdKdq5UoB7DnG9lTryG5DMs GMVUJQ4VtJZZ+hL3a8zreVQC4XiKT5wvxrliEFVBqMzssvNr1OG1gxuXP+BpDziwMtOYO9LMt7rL MUcm5Q9498NRBk5Ls+wGEzMcyFDHJra4hptkuMnAXsDY1xelPKp0wFMHsbiIlwPyIxlwGp8cN6uO VDRaJr1vN146YrCTAyILrGyyHJ+DLseQUGuEArS2XsWe71Mc+JsyfloOirA0By6nyGwUS1RVURao 1K4ILn27UINbf7MUn5BUsdj7SCIHf0RcZUdRxxBoEP92qkjkC0XlS0P1UaaqCR1JtiooiyhV8tQk Vay6mhLNUqLwxpNU+GW94PDzz0uKEnDKEcsWFdUqMQG3x1zsFVd7iWU3PbeWnxze91GhrPb1NZd+ Q0otT6g1ocKDHg+qv3hYsTlUa76P3YjzoyDKwLTZD8pqlDDXx/UPO5P4QJSMpnzSNe76QA5l6aFs NURmiIJMQcSUKCpHFZUni0L2+hflrq87IIvqdXxex+d1fB4an8C72L9AM0QVYP84aK1plpqoThp6 RiCieS0jjlebOxGnW6XpEybhKmRcrl2uAFxLLGlsbS7a//ve5573XErc7b7LyduUrRXzxGaq5YD9 w2SKHbXFtJT+YyJlaWIekcEkmPUm3zSkmhniQ003iysYRulmnU5V213bcyarlCzcKu7W/gWaeUB3 +2E5OjI8WR3by5REAppXo+Ueoww9m2cjmTZznMCr6XpJrk2hHXnkVbadmXZnLyUgPQV68EQSj65m kTzSTDos2D+SLLdr2Slphor6IeEoSSXrj8x5IX/gRAMKmbcv0K7K1r0otg9LKZYWGMBNWDwOK6Ni LmrEBDPGeiBa44HYG6QRYqlKyvQFJt6YqY95+lKaPiHpAy5DPCBuYnnt1tdu/ZvqVtWzIulAQijU WLZGdKB6UoI0pEgruZAgUT1hFQRheqKKG5bkqWYYZseMaYLCjAnTyNtDrt4JLAgzqdrSJ76czZQd rbWK9RDTWoNxojJfaKALVbLQWj2n4o5ZFF8Ze0xxQvV730lcSSPuUOnUQT0T0q0rhsHIN1ECY1tr 46GwPGej6WYCHEopE+lq6WyGvIJBvYYyORb3aqnN1NGfR776bgdbKyfjUp+My+ySOvnVwWncm4Au 7Ac7M8zTVTq0LEBrh0jxGCn7Ebp04lRZ6dIwd8uEoMx1JxgQ8SoTOOnUGE6cAIqjjnXdCsY9mWPC bZS07RhQHPHhejUyMzNfXq34Gzzg3oGYk3qG4s4rj2so73DRQphS4kHKdUjBDluyI3CycdEOU80B CxRKzY6Baacs8VRMPbVmOdoC81RBgL4top0KZSyFHLw05OCzkoMLNXjD3otCCJCC4+KYAv4JJPCA XOGvnfnamT/WzrQB34VNVkHQNIKdEWuVMTODQmU4dR2pnyhtfURqp7ZsPPylRMDLwoWxerQWGyRN KthGM1gqQVJ1hghCjk7wG4HeEPCGUuMbpm0oKS0e0BKm8w1sqdI5K3vWgP8ZzDlj0JY942TOSOes FNXDifgzm89HZy3IKbsqy3nMc75jOucMiytU59sFEGhZYcJDi0kNA+YrzIiZ3Bj6+L/OWXUyo0aT 0q1KNpTmQ6kWzjo4KS1UjWUwCr5/Uim9LVLy6cA9ziCTakUHuDB/cqGalairorA2rGMRP698fUan kJ8tyl7KrIxR0bLAJdhFbIIsd/Aa9Kv2yyK9xt3X9wc4qJllqSBzpKkrH8DUF22EnLvmIqHKx+0Z uZkz+9wJTTa/2Jf4fPA4RPEdMaRX/dkZN9VpGM6ePfmISD39NyIv94Tnnt97YC703v/dUuFR18LX +uFcOCPYsJU/+at4RieAnCnhicTL3tknlmrdVzZt+FmPnuXcHqQ5l21fh/M/eiCq2CrfDT0vNVZb qcVa6dONwniu2rHac7c/eiC8GiVZx4MhI72bI81IFWn1Gb5dl+fG3V64jGcfgcj1K9eD2Hm1f+lf yE0UPMht5bp9zLxwE8uNeXP2gXnDsf9SR8zMe7mFEkn6y6N5n/7bE3tayg+ci6J9Tj/H5QtKucdC 5qq84/9/9GV98QVW/3Uvel+RwB+mcyfAkgChWPHDh3qMtr/I8vYXUdXgRHmVaoixApurcmkrXJKs RzkPxBCJUlpqWo6olbJOyvqo10WJ381roSVHdUX5JMUT1U5ArXNSfRO1TdQ1RdP0wUkfWbQVsIiN Ma2ShJFA4EJJFI2lWOyahGEPwoAchrFBGKfNQghoSeEkhvGL0inKX8Xlk1bc8AcshNpEOqzX7ToI Cmxkhhuz5NbDD9yC1FcT0l8NOMp+fP3YhjqXaJZMyIc1mAqHvKVrCUNKcJuQJ0uYsqTukd+XC+QE 9SO+CSpgQrrhUCesxSkgWIAKSUMDDiBP1Iw/wWACBnTMdhEmnOyYQDscqIctvblUEmMKYiIRlJ8B HT4yepJQ4rbEWGAmDcXGlHDQkpQKTSlBpFEXFCY6r8r5SUB6m8wDKUq7cjVlcj7KI3E+AteVFy7/ hdOiA8yPPGUpEDMg+rx2a+C1wPhai65lf5mpkBCj+PoYd2lKX7glAJyM1jNsb5SkNFOjW6pzE2Iv IPWocfq9FOO2GD1qEleQWIJg9CgxttCQgeSq2trNjYfgx+VvGJ1P3r2jBInwemD3aA== HNSUoKeEQ6nk8gUYGldxKYcqKugQO02l1jbV2554csxoGcj0wHIPCxur8iT/qqUslN+STxLTGAaT 0xmdYHgMew1r2zSTUPnR5pisagYnzHCg8dtc/s9xvshT/Y+0viqNg+y4KHZMFDEPReIyFg6KOAJy 5IfPAO3zIRC4UjDtjnJpPH9NrTR4RrG0g6AWpW/C80ul5SulgbWpg0ltbNaoVElaF75nEUf26lRd LVwCCRD9GhTdVphhSajoZsWj22IlncLSg2zMVhA6rCHkHqBCc1D48xRBoDnowFEdCT0IgD0GQ/eh TlCoBbQwnp1FLAtZAkZXibAlcLSFR0+gyQwGI92Ti0WFclqHLA30po8Uk8OllEBpbuNWJ61KWhk1 gxMBZsg9xFVloVTLMXwKlGA3tLSgWhz1voI+IgRSWgfoCF9kUEamlUkrIOFsZbjWYSz6BR7XDphi x1PO2PhqeQ8FfhEjgSx6KIYeBaLtSxkeIaJbgwZ1O6wyNpgtVbP1OB658A7KulZomI3JfjRQFQxF AyW8babFDAwhl39flTAqF6hLqKXCfIJkkCIVQkFtSagvrNzEHNSTclArcz0o3rJCi8gL0pi53sIo pwRA6SVEwj0dOOv9QrHE0wFEaNimI576gHrzsq+TIrRSsqLQksK72oaimRHOI+oR0x+BwX/CjVP6 QXuhwh6Q+ycYqQBIKRmxx/tu+Z4LLzm5ni5Bd31yortJYMiov8+CuXoXvb+eifd9umJp0oql6oak LTaIH0X+XmBymQkpfHvFQVZsOa4mDNJx2KA2QQOyHykM4heAxzewEelLb49S1Oqo6FVaijO0Ktt4 gYBZK0XcdsRC6WONGtMwAb+YozaZFi055XaiCFpoKuiBLdiWPduh2RKjmtNmSgdYxu3A/7CBXjM+ aFMM1E6XQLEdsoo0N6xi06WODJgYR9X7QFmfYKQsNmox1s0W5SEVvCxiWBRbOF2EjbLoqDlJMLOU TZxXmFCRdXCDt2lLsgtjLp4MIRnEjGTYrcqhFZdTlIKKe3UoNTMTbQhM1WKrCrWsjIsSlGb4BeI3 m8rphggiXqRA+lYaLT3UNLZVja2qbpR1UHK3g+LGe439enVjiHV2qxJEaVcLJ16V6DBo4+iUAYcF hFIwitgkArSJjEWUWEN5ONgVQwgylpCxhaTq8sYSFpVuU4E5/Ez/3n1DfrYFqObOP+lvo8/vf1aq 5+9/1sAGgP1ZM1LeY73RxzCqv2Bi4PTCAKuF5I8zhk1WnfstNA81uw/ILGcjHZQYQmgiyJqXKLZX e/yrxUCyZnUJbOx04roHfosBowlJKaY6+KN4czFhvsMYoUEmWFyCRSUoJgG0VJBAEpabaISrWASw YARN5anEURyK06+R53HmsofHdc5spbMqrnQGmqOUlooLZeJsiThb8SxUgasD14RWM4nKn6nOSTHU hqEhNcdJKy6cRxRkBRfQu3C5yY3jpysXnkxTuKZAWjWYXK5eDabAgRcKyNXKmSUqtuQFOJEFUk9O O3tVFi6f+BXFcb1yWfUnDNnQy+JcaDRHyh1rcKXxpZZLjr+WZydXTLTtBY7FJZs7iQq3VGYaay/7 +GaNcU0O5tQUY6pOXXlu66E9tdW5avqofPODR6IoVVOWfWdLThccvvOBJNwZTZXq8+AjnjXdV9ee eyf5TZjq8WNRbBKrXvvjSEix5AC6jfx2/mQ+qN5T7+/j7w8e56GYWZsLmbW+1HUnETOT9x3v9IH7 crfPG7ec3ehxqwfe60VNGnTHF/1oY65WYWsNTK0dM7UOTNKKegAoKWFgZy0N0aTlZSVeSfHqBTpW Q8NKqllK63FhHg2ByIr3cw57PplTuuvLzu/3/RHM5m/9oFYDCLn41itqPaPMU+hHAyInqdBQzhg6 lGyAS+QztSkB1nuKP8m3TH7K4F/uI5R9KJ1cR9Bki/a2tAkIShZnonEhRq5D4S0ZIh+h9Q5W7CZy vQ5aSnxA7r9Z9V8bbLE+QOv9m5QagegBt6fAm3OEAVnMr2g7gsi/7IimhWZ6iSimW8YsMUkAI6mc rgqqqgpFYo0BrFEpAgrUuloOU1mKRCJIjCgCyKCbTQ2/Tuv3VZzMG6LHktAbKnZqmT5mHEPHAOwo 4/K0YzaubBP8dqxjEJGOBcoxk+anZHGD1tATeKMFGyKEkrwuoymBFoqf3ZkKvcuEdmv6Vu9N2d4r O8vXZgLxEKVEHyVF2+TIo/RIDM+TvpeCYCMI7NM1TjiGvyYaZ5w1HueMG4ACRJnKx2yE+WzxXfqt tQCjYuq2Xa2brsmXErHk4oze1gmBjhAe7tjTP6AMG5Gow6ZXaLRDTfwaV2fr3WyB8SWlY7LM7RJP syQ9akraqBoMlpVnF1gjKT8dNL8e5qjR+7aorQTh6W+k/QOOyZMazoUvaaESw6NrxBZYa+Sq4jQt iV21uNAHimCBCWJRCGu2ISwNYNURZ1aHQrHDzYaiVzPODicigXYdNuVLw5jlJxWtk6ioZtpW08Qf mPu/8Ik3KVNnO1mbWnEv+Ytee5iEvGtqfrr3ILwZDFf5zbZrsftNP6vdZ77EcKgqGn6S6PQ/2eid t4O259ReTJsjy9JU0QZjYKa1yFMDszC2pa2iHaArbh1ARIShVBjKahgq56bi3woyI8rAkhBG0h/l GQGxpystR3gcsyRbHmVUX8AYmdfNzCIDIVpNp3Nng7Hkuwg4tIcLhe4NnRtMdS41CpmuXUPXBrP8 nlZfaYbaCxLLPrLwNUffshpvO3tfLH60+iE2+81YxeMS2/12MOp4MCAZjS0ejcgdGWqJxNCNGLgR wzYCaCNJnmzIEYL6JOmUvYJpBF6/aCETAdnTJchlBC2fLsYneeJBJWe04cP3eIIO8TIBszOyv03g XDN72RYDwEFoToDeNwK7N6D7Z7vTCI7fJYh+OfimCHsLy+8YxVfzrCp4zmhWER2012ylVkMpVYT6 vxzA+EcGZfUWzG+ngT/KLmtgiPKdyqgHaI72yiuUOBRhl+d0W8k7VvN6H6LdS8eg5h2KxWM1Dwwv UB+hUFMFL1XvrHJnyEBAgKiKQ201rapIkqp6m1JForvDKqdUwf2Cq1V6T3quwL4TfC71GvVYnfTZ 6Anw+girK2jdla33WVltQ79VSBJr+25AzQ57D3Y68hr1YKdKsqX0sWpyoigDa8qkLe9gvUdkNcb2 CgjfFXlrog4Ww6thx7nN85pYSnCeF7lWQoCgNiGD+HeIOMTxh0JYY0IEA5Ay98JqPFHJhMLNC3se ZrSW5eeIBHvUFdQdPc8xb0LQL9YtfS9xHym1+YV1UeoxWyZ+1CK11HvYg4CSnSrWYkfazjS5epMC Zyn7qeOEJurdOgTFgfKgGAVJgnZhuT+aLheAI6XXedAIxpQKvfiJA/IDDzWF5QvOTtyMkS3XQ1ci JN6oHAOfO0AqYzBlyYmEMYxy1ozCIcJPutGEOwCUL4bmedbjsWKqj2I2U8gmPIrZTCGb8ChmM4Vs wqOYzTT+C8/FbBI7tO3eow4+QsVm+hjYtM9181FH54PC3New6+yj7j7o8BQlC6amWq7Tj7o9H3j3 RDDZrj/qfAOZJdKzHd9EQkotlLfX/SDKSg2HSIa4fp30o/RkgMtbKAODjqVLpVNzrDopr05gnQ6w BuxhYECIVKfTSEfS0dLVvZahkwJ0m/Y39jhwXCN0+sjxDIlm2K4XvHK39RFV4hbRctOUkumUgq7D hBqi2RRiO1gwJ17FUxTTKU3lvTClpNjess9tBq0VNRzcHzm1eG2mso+mGC3IWOqFpdhzxaBI3IGR dzRxfPGgW3IuFXJhtZWwk2/SKzTyrjcYL75LhhZzkQzGyRDHbFFMplEguCG5B8ty7+WdKC8ZlusA AM+Rz5PtvoElvlZvafCUuot4Om1MnlEliq9ARKoSsk+ux1hsKc+QOWEIjaQTpQOjWIuA30RP31s5 qaoeK+rCNhl5tPcUqPeQoO6ZJVVdB9bX99q62kIU/3gClcU9Zh5k3PkP+fLhNpcmxTQSIM3O5H1i ZAN2vfGs/gjdARlK3KRPYgjI4IwPj9no3FpvWhv2Z4RGcS591qx/UUmWeUVQhT2g4EWORhAHTiE+ 14KZKDWnuPG59R7C0SWghAGTfU1e/kNHoeRoQYmUTj4VeATObrdIjZ7xJQGy0fvX7ohdipN5qQNy CjXdXiH3UtAA2KznUTp89EnPmG9fnn3ygL9Xk0H94JGIQsEDfzygpJdU8JqPW/GN6V1XdGMefoP/ il3fn51AbMx8epnj0YwS4E8Au4QccQUDBbALzRg8jEfKuFkcptXDh3oMOlNlsTPVF8g0weCZXNZT JuOpjco/WHBvAm+AULtDKzq3nIezxzl4PXKLYoQVlkQM1VoQ4jsoBFuA14GH0vsT4notQ6IgItwX q5yi1UGBAoFSC4o6IKiP6zl7Kd6ximSw06D1nJNazuTMqLhiQkDtblw1IVYJVzWFm0ghDLYZqoOQ mGXScaQMRqavWg+kDhpQlFpfnY9PGU1Qra6gCM6JItgYSysoxMa69fWkc8ZtG3H8UPXIkI1Yc7Xm XktD+oAJVkM+zLGXaEDJ2bwFZsSWDNElnqYLKmArZmKszIu8cH7sgARV4t7pUY9rAdU6/6zYuUPu nCe6dIxL5blf/IEP6G9T0sMGyv165Vd8+MHU12luNTsNSV08iiPbSPLAeZ+B9iDUv0vYDkARyZL9 FnLeBo0xS1JXo9GUKkly2wR2BFFmVyhJp/ldQyhLRyUEuGqASXOLKgaAZrDafLeQiGpz3krNJ7WJ b4L94uQ30LzPkAOHaZzUwS+ELRIFHB7Vv1PlG14KXRSHoNKAyT5YkouT5GIkAxjqPSXe8wKVAusS 55bItmDY4xIkaQGSwxIkkOEeEez/MWbgGJSxQHY1xSj/UE2yzID7k6UEmbUkKylaS9FKWo8XEuxW Eq+j2BDrkR4K8fOF0GYVHp6NeibRifmP3GaGvFBGBR/dwMd22EscDJXmWjTdyv9HE9kFndApKd/X QCYdWXL92Zkphibq8UM9pjR3WaW5M0pzwa3EFsYmJdGKjd78pxmOrqE/Deem6o++qZ8/dJ/Z2+wi 0wC3rwo1oZZVAsINI+U0+7LIk6V+LOMX3LF/gPFimUBS0DGEor1BlpIWVbKBfWoTRuPEn+Z1ykLV PbqSWv1qvRdXFmbCJD4cYDdbMz2r6FXFryxxcm1e+WdrXwH/2eqFkx7JGb8XpKtdkKR2RHraDrm9 asziLbJ8XldwKHCF+5HPFc4WzhfOGM4Zzhp4xAIGxp0d8vSRgfdq0/MRDW9MxLun4k3YzDRN2T3A 5CFLyrG7sFj6qfWufghO3TkxfZxIsREzVGidtf156NrKMtE9cJQcq15xurbOH8yA6frsUu2/wOPb tVriLJV1Y9dqqX7n4HUWbH/wORu4FySJqHu8V70L92IkkuLHtQIC7M+KcxZrxnhVjA== 9ioN/tOAPRU/sAFrI6v5GRBci/4UIiXSWtzP59svEsIvNbivTn9gUo1WUQBtgAYoTKCLyuegrSkS 4enyYI9MM7gseG6eJ2HJQuZ+oJsLqfo2PT9Ky5d0/JCJT2hGULztpJAzCzrrlfOlNZx1TlUlqbLn PMgSHBwQG+wIDWBHZpCnMtjRGERyJ8p483KBCFK9h5MT9EbSpHay4GnfI12KhI53gaO6FWX/9eJJ HCr2oQcna+Jkf/A4j8msMSuzRi+zNG/vmUZUzoTC6AXcaUDlzSc1nkwsh02n1HBKzabYaBKTydtL ZC2JrTQDA4oCUXjBiBuiKsHq6pQYvzIwbI5AYI1eZs1hJ7nYSQ09LeQWyC8rRXWRzbdGiK6eCakF yyViOeJghwxcTixCsQqDXci2oRLSCZJKmNJbHy5t1c2m7jXZPQhGVulv/yw4XyDsDpImL1R8s9kC JmZkGT2f3mR4/AR2JjcQboEhaBG/HoPDFCC2Ed/8xk5FuccV91pxLAbnYnAwDrgrk5NRtg71MwIr mKU6Gwulj38phJPE/uGlEE4HDBf3s9LlSekuLRzSyyfcHXJP+6xeuTGb1xuSejWlVzhPYh4Puc8Y /xFQLhe93R2uCPSu9xT3BuHCdy/3Lz0QXOHCdt8D94P0ROgLS9YSQg4M1ElTknuTkjwJQirOSQZF 7lRRUrKFt4SUZLrBVVKS+TbDjXogm95tj9vqqPcc7nrz+zffeUkkgnj3dP8d8flgF7hOAOyFGY0N 6omkAAArbLUaj9ZgpVpesQq8koppjNaIkAWO6wVoLnGA5e1Qj5z0KlSDk89CXUyYpzZZ2hm8o7WL gxXeGXuYsSVqA+exJaGAQeU51PLknMcwzyOgZ1Qk6zY1JwI9b91SfFMWMGNvy4Bm/I3Bbvis10EQ rDkE0qT0k9HtwQ2cZXSTP5UIiYlMWFfC08yUnKHCngN4GUqakD4CT3HkP/+WruQEwcENPe12TFAC nhKV+GneksryqEhhHuy9V4Y2jHkXEViUlSFItKFbYO8UJrpThQAxkXuK3jVGweI+GgNEZee8xABY QP2gZQSsgSALEoNwGA0GijoGCFgsxoJgAUM8a0hnS7efJIyzo0FiENWas7e81YWhO0Fi1IzEGBBn OigLnutsYOK7kkk/6qj+J3HbCasdwZMrBF7UCLvoFHZBoAs3gXFJYxyHaLlaqczcobQV1gbhHggF mkOt65VzaWbEhQobAbM5EJMwkRJoZpFaUZsWw5o57WRSqgLK4eowKbzmNHFnUIGCGFdOOB+1ulTP Fa1qNmEKTb1e0FQZ0UTscWdrqOhAWQIbGRvH1aJyyjGzR76lVK/SGAULpnLzPS1f89k0OeDRee21 7QtDp3cWR8p/MEzoAQISXQgvgQl9WgQWgjchsILYQOMuYB8H6zPhxSiyCEmAfhecT+LycUx+H49f IArG7+PwUTH7iI92yVRid18BKcTOSO3xhR9PPeBwq8Htf3laMweMcnN746E9SimOM3bTvXzBKiC0 kzdgNvKwjYdNXLJMF929uQ4M7dtkh3ppK+Qbkja3cXIqNQm5U7hdwuwSYqfQuvAyD8AzveF5TpSJ F0OC4NvEHMODmeG4+klsLhgf9AafNxp80vcFIx0S5xCTpzJ2nbcDLkhfFMovz0TMAQrX6xOwXsjd IPvtgkxGNW6ykrXBNE6xwBNxbQ2ghJfpesaATcQIaRhi/kQpGJERRPwmtc3leLRig9rAkEv+uz/3 z2bfBgqblMam18rnoyHvJ0IbAbMSnBUhrcDxjJjKNiayNQxeBu2KWhYJIMvLIRtQDMSXbUhyqTsF crCsNfnUS0pvFVM0ydYUJ2wYmiYrEnYEIuFS22ifiGlE7GW29jIlmyQLXqKa9QGfkm4ii35Rvhoj nyrdPATIheWf4huMclIowWXLbE/9Pskl2tLniOAqorgCOnbMEMbbEBn0lGWsrv5Rc51rdAtbbJQk FMcOcEkhZlcwmAqhrVGNAgbw3szXxBY6dArDNa/w7TM+o0AKXK2Rgme8O7/3iD4qPuetMxrgwAMU li9DhJmF+rj3q2vIgYpDgpLuUWt6g7yjaC09KVbApK83tobmsw+BVzBKDLHXYKKgwgqpTqikrZJ8 0UodSU9MmlQcfLkjPqtEJubvPL8wJn39kbGJC5w+/xgPhWmzyJI+JlfN5XEfZ3Jbh0rsUqEQDCbg tiaHIqQbayTDpBvbUIwlVp1CQi6gg2qLaFUrjV80JoLRUzUyJVXV4JQEakj/EEXFqiprQq7aqhgL xdQuLMxElLE4A5MILhItR7BqKVYl28Vk1RuOPNzSQ0K4le2TSHgcoDj6ZwtT8XBRuDVEPSwRvSh+ IfRBqp/m6qKqLPGA4DHngl2Ugyv5t+I0b0zvBgLCQKRqE460lgAYogLp6uDbssWUJMGIenxmtqwV XVtUue4Ob30Gpb9L9pX6cxi0AI5aBKU9r7aHMIwo2ymZak35vWDIVEsGWg0ZMtXhXjLVaacxVVfS gq0bJMZSsDMkOOaCP8SCKmJUep5GVfxsRASaJgdH3hHrH4kw6ruK7R6njvr6nkuvSpxG1m1kHUex 64h1YNj1XnklqfqISHW2RKrdYe8dk9AWud4jI/wFCVR9Z8GdDra7Uxzgr0SgesTgdx+BakqhygSq dcbqjO3N2M5M6VONFAMryIynHn0FEXVIo/pv0ICvEq8cokBIqu8Ktpk2ZNtomiVdxRUIzLRqOVaZ X5UdDUqtaqoBErFqoFWttSBgA0lNQFsZUOoCbrTXMLUV7TZCqdoppSoxQQyA/pp07ynVAeH2HuqZ 5qC1yB4VmvLq6qct80sJNSG+A/ovjby1+3v/V4cHCDUWu/AK9OX+w/h3z+UZpUhj+ldLf4G+2Zqf 8g5ey8uQqaZ0qkymelSvo07ZPg/pVDVpBwxDYKP5OgVLM0unOqpMu8qmDSrZDoMHxMo3X2m3aVZ3 5Krw5PodhU2Q2tdIgShJqj9MkgopUnE3R5y1VGHqWidjKhTlfqXsp0etuNYCRypk6VJT0tSYOHU5 GA7sfMgUTnlW5wuTKuxGYFen5i5i1fWQWDXjW2XXqmeLRtdtr0jGQKs6cnViYTndtBDxhVmTU3JV EQW9sLW2OyLVSUE3EwPtQ4GizdIyK5K/llP8VYlVLfOpxEBsuoolVrWxED5RRK3qqXf5oLcIVXN0 qhGZqp7EnSYK3oQeuPBxJq3e7r+974OUXFVyJakXTMgmVv9qs8RjBbDfkasKSTJHXnLU088mVwXW Ae8jV+1uk6uCMSAy5KqZiGqGXNXXui89mwFjVyy1akv0qlHQa+QtR/psQ6taICu8xzQmMCC9FuqC BtWZyVV3fTel8WmqfLmPUMcEq4UGU9OeVEUajCYtNTAFTF6zRhXMikXBD2m8WmPWgLSb5BbPpQ6n 6cNa19xLlZRg1dZkq1j5FipVW7NNyr1V4XegWIVQIS5LtBpgIeHnpBCRifn4B6YWQ6BIp/plIFmt VQMtlKfsonSrQrQqQHyucSFwfOlMIjCNu/TCgTqaujR9KegwMpRkYJC+0q2CSaOyRKuSH7UoBF4A +6PWkm+FZPXCFx5IVntOG6jp6lijX7j66cCBEFlWNaHyJUfL2uGjYusFWR+iIwJxWWVT5Xr1CdEq aKwkBZA8k2j1xwXTJFvkOeHWK2Sr8LSA6+1gDNwf/7kvFQEiP+QLpCJAhL57jGw128G5kHauj7WX wXRzrqNzXZ2LfGW5HnMdnuvyXP6H9joceukNIWjS9bnOV+wjhO7PDsBVytXrhKsxTW3w/kr92NRv wp4TyBSPjV3tcUXTXPXYiHQV1MVuSFeziSi5VBTpYUO7CtrNvVbhDekom+ZzBDpSS7w6LTviVVDM aZyVEkrJ5ZGnDQ9CIF29JLyzxKmV0s2GZSwL2SxjO58gzrqJ1nLK4WvvMEu46m8MkmjOYu6KV7cl XbVScItYthL5Z5YkLcfDgrhhGW53JV8x15YRdjgfgLHG0j/UNxHXlqTENez5CQYk/TxOdGiZ5D2i W6VSeBBRrJaKht3TraZkq/J7tgXzPOlqTLYavKvV80hX83SrtYGzIm4KOAwToFMxfOoYQLUmmT/U rzMkdnmc+YMIMYtJkeL1qe2zh5dmAKbWDALV3vdu8JwjPAc1jcCmwNWr9nhTtY9+YqSruSSEuyIh +VgI7Pri3t64YQ5fmREp6SqToXaMBmiFWVNpUguFKUgN2yukqy9wNCZdFZiC1utlvII9WCcoDqmb m2deffRQlDMvt1JSPn2ooXuK2FI5/X6g27tCv/pSB4zpV4W+SNhTT4Y1NX1xg3/12YciAlYlUjok TFUaprsIWF/meI9WLd4RsD58qIfgNWOWZMm9eypPrQBs3GYk3N8CCQjoZKlj6/cegVzUUb6pWCQC Tx4AVZ1g7Fn745hd/oqFBzdLPJDKI6gTW4sgrrjM6jBoaraigowKlNoceV7+qAIBIBOpJF+RDWJT mSWNmWBAksYcEplDKvNGrCag+cwlU5/UmtfcMPy+01TuQdObR2UWkcDZIjQkwkrCOc/UDKNJqRnQ leZBS4ti19RAXtxoQr6UvrdrkH/7ia1/iQP2+QZHHzy3/RAHFKVXiJkGjHL6yeUfXi8dMEFhwaqa IUgUqJgodB4lnwN7KYILKPgmrFci7/UZGLMmEAQnCkAdPglWzXALx6UmFiw3IaZyQAiyhQzK0yDG cct1OXquRiJG8YYZf6WyK3dqC0thjtVbQ8ASoGFD2K9+ITPwjy1a+MJf0ESLXpY9LnjANU88AmGh C1qEFjct7HhB0yqW9SvMRG6VgnIY+xamwKht1rZEHAZ6tITc+Ij1+LmP1wP+VQ4oqaqj5qX0+iRr rm8701qTzmqfod6cN5a1EjCVlPPRjoKeHNxYtQ5HqCI3c1hDanD3GsVAUoMGLfsqsvhtaW5BlkkQ SPiEQvUOMid9TKQCziYqUVGhXImQCyshg0nxezYzNmBaGgTBYOiIQhp1Wic4qWe8cux51UKeE6bT UkItxasnovkBzq/1MrbTaAS6SDjntuG/8Fz8Wv6SRxH+Bn6Dwg4XJBUx72hwQ7b0siyuND0g1TLt TOv5Zmybo7ZSFea0Af669jgCP4XWoxbKDSJU2NPanGuQf/v57Yc44I+A5ONoGhnvGFzNBQ8J3Wli d8cchZ0+6Z0O5EX0L3Gzn8mX06bvQvbj9IrsdUp2eZv/K8QI43+w7xylptskdX0Nu6z1fR67DUfm 3zUNEvz4jQT9JPc+7e3eezwzb0ZtuNlG2yD+80ltyjXIv/389kMckOA/C9KkCAOvB+sI16YH+RB+ yAN0QuVjgubUhClhRAm5Ibu5Bc2ivmi1XvE/5nDYN52woH7HnOcx9sTmoP4hOVJ58wNi3SD+I2DJ EuXoB0aOtrVsHMzFAYq8SKk4YjIOKRlGfBzCyFEaRg7SSzZgx7ZQc8SFbIOC0rOSIg== ikpb85FreTCsF2SfN2s2GN6btlDmfTHN7gsMkQZFSsctxVfnkNhdroHBEefa7T1ciEe4QYRrfko7 eMBVHeMZjx/igLTEL8iHRMvcY/2k3LlH9Xk0n0fxeRxeSpfQEnAMq3KbmtxgqBLSRW6RdvlUi6tL PGRZp6GWoxJ/l2SBY94zJEQc9yxv5d+IFzcZHnBjabfR0t4v7I0NDlnXM+yWdVjSfWZJxws6Wc1+ FUO0lHMLebeIk/WbrFs4XLL3rM7MwoJrqwsf5V0t0fyf1cpLrkH+7ee3H+KAFAjc1wy5CYdPMg9s 7sEEJgEhrcJDEPm0Ek9JSoWpIEI1RCg7YQHKjmDOkylhmemV6ifU6GkVYBrqi1RKAFSClO1hSoqL 8qWEwiNSfGTREiSzIlSl6TUAUwcFgpXQuqi1SWuiVksDfblPPCoz7UBxDW412Llat6ttvdVASZCe 2uZ8g6MPntAm2yD+8/H2N3lAC1Qy8YYQ6iDyw7jGxRH1IQH6J4HxQ0Dh7/IQQhaCJOGsV0u8IoAc NKVGdYEIapCq+xY8nstOLUHTLvOo+/txF4y8gAR4YaAXocxH+tiQcXJ03d/6zsau9jrVgF1cH2pU m0/Xn013ktVEeQxsMzEC/8KAjRF5o3zvhYyFyFSCHep+Yg3Kd1nQna6RyNvs3Qa0o/LwFISeR4ic AKYXf6olfWshweCY/AQCd81u3Bq3D28Im/Z88auWKhT2dHqOyi8u7y3MPC5M5G5ig/CUe4ckezBL ZTWvlSpYiuYQ+3l3mPqDBOqS/yM/5SklOFYFVWlukDyFr13520vQTKRKy4JImZBGs5Oe8ITjD8l3 Nxnq+Ua9NNdcaldbWs/vtp8ubTtnoHDgP7vMZHrAF35cOSDNYssilucRy0Hb8+D2hnIwUnx7nlEs B3HPgNxBQcT3gK/ztEMHFEt59GeGfD9hSEmwspCg3g1W9iXp2hTeDvsEgsfyB+Auzqon5A/A9VoG T88fgONaBkKVEfhwV1ObuEC1lDDkQj5MFYp7nRmWtIXKFCtHrlQqrhRVLdByYssdFLQv/DpauZhR 5oVUL67Q2LBgc4Gbj0qnu4T4Ok+vuJJxoyw8HcTFjBWEfk9pgWxxAUiqC0hOQBGnQyZUDYGYIRAy CBNDZxb6aNgXlFfez0ow+RZtkjtAFapjtoWUa+EK00IyRWN+hZQ/YTJRz4Xx2YuhSbh4dh3keykY 2+FJKGtA70an/PSBcMdSIljUdqFUCC3Xl5Z8FQwCA9fkQgJLpY2p2iYmQQhUB82O6iBwFgSCBPs7 7LOdkCB0ye/4K/FB7c/0P1rgq7M/K8x8S5gK0iTsaWf4d6ydi9GfZsCjqQ9J+nvIfY8BwrEPL+eq 3xELJK76mE4gpQuwSeohPf1qsVTfAZAtlZq6PBgPrc6OlZXseXfzLWQy/1el0r+W2W/S9y/Z5P19 0j4i+CxlQpqsn0vUv8qRABmaBOyfOM/lLkh3LsP5WVV8rxPcpOj2zadpLEme86ElgesoKkNl60rR 2QgyQiCRUR224qoNDEMrqgv+xAPmhZpEAjBnp2yCia+h16uQZOCUpYkMBqnD1GFORgtIfY41hbVk u9g0ZOsMGpam0G9daJXOkBsjTAaDakRpXkzQjBotA9Jx0qtVRRcIFGesMJWsNEkqcKP5gZ3KXNKj JpMZs8gOB2GLy+XFKDFakyMd+i+qAvXEGlDLBo/UgLqnuJNcbbjetLhTnE43gbn4mFWw0VuIc+ny xRtaKd8A+zy6NItOyx3tyjtJisqLPm4d8CppTa7B079ivhwlr5Rc4tCwWfoqg5wWMDIO/9zTi+pU dmdMNSkr909lbVIeHjwQ8Zc6XbDqsdJ1SS99OUT3eYdJAZJ7InyjnHmCmQB1fXaKo8lZeYFjPZS0 0pXnth7aU1udK7cTPZ60kh7w0TSMvjg7Va1/kTwMORYl0jxxKrjvj9256Prm+dPJHONaMoh746tf f/zw20/vPnx+9+HPX35pckTsB/Drv/hPavrkt28+f3776cPPTz9b3r19//H03ee379+/+fzxC0jf 8NO5dKb3qarPreuok5td7o3Wz/fevVP17u6+RxrhkomE//k/8M//y738n+7Nfz81p1+d/uV/FKdv 8P1//p37lR71W/OeHPj0D/7N9HTxu/L9f8gc07/3AU/5G1o/lArk52cl9LaF6/6CKH85wSkUncdJ /c9vcqf79uB0j97Cn9ILrQefZ+VfuA2/wMQrTZrThCa8dLrQsj13hRMIZVf7WxnpSt1lOcWxdWPX nJ3+OJ7e+3eL+tw5HcS96z6u3DrEd0u3QAcvxhp3sfKm+4o72dn7bfm/urO7Cneepj57Y5nedbfi TN/S/e9wdmJo4HdLPk8zuPlcy/8OPofMndx9Z6w7Pux47jucZI2TFy1f6O6m3nNX+RO6xeT+35My dx3fbXuua/fdsm3PXvvlW/C5XoM7SDueq/+fuXfdsS1HzsSe4LxD/jGgFtw5i3dy/KtV0gA2zsgD DSRIMIyBdKSS2+gsGT3dEObtzS9uvCxmnsrM3XZJKp1csbmCwWAwGDdydbvLRtuNIbR1z64qGZfv SqFrAhdjH4e07FPrGRSzU8pin6yuWFxIz7WMQfRWndsxdfm6lAvluZQQCVqDDg28qSlR/93w8sbH ZVg63pK6ooh9DFdnT++Dxls6sVdH0YBXmJPj83Xl+tTA3MgcLw7HK8tT7eOXjnLrnIpPpfWpuHic JT/juqSn2mnvU0iw2rnQH9CuiyOPp3q6IxrYSrikXe0SQoR0xSsgOtxZoMpi9kzcbRQ6vAqB7BSC /93mTzy8Pvm5tadWnj1Eg+guz7nb3jgZSvd5M9q+Zmsff/PP3ShmpuW+F3evCKPpPhQ3889gbe2r z1cjyNfon0qX+MiC0Yfa98+EZqVvtjo8d+X4VHuzyxsXXBeqzufuDAhsH4VJa8dZIQEBUq7S2sUJ Gsj5zqGkwtZH0vrGBUFIUWSi8xbt+spLJXBXrbfzVxfKyz0HJy39xTNCsu0b9x9cn7pYiagEiqll 7esDC9N13jZGiZXbfQ+i5wqF6fHpufi+OCDEoV0i5/twdJy9L0fLNXQet879F259VSxK6lQWRenL OTYsny6vKchKdSwqWButyIz33aXDU1/F3KZLZHd6CVh1Zl3HDJFsvStt6KFHKobo+/KTyeiarETi ZejLV6ay09WtBfC8cyjJWr4NZWieLmWuC0PpKqk11TzlufquJLqK6cIji7lLebfR2lPX97Wo2ukM hbzE1uU3K7ALazecnjozcO+yTHvnTHcyn7qeTVnoh7bxkEpone7NCtDBmqjdcHi2hhEWVp/ETlD/ R4TLd/6kPl8Z55qjvL2PxwbaqekeeG/dha07ebL1QRorDLjmQzVVGvpM9LUZsH+ofizdLXzqmjh0 zW37Tl8XT12R9p1MX+5rCt125ei9TnIXgO4h92H2hWQt+zx1p7o9xYwPjI9xXl1Cn/qe1R1VPxgS uvz3zqsJ7T4cHSe25i6LtHWlJBOaEzZXyGfXsVEY3XmZWteCwN/VWFGFGy8XSbx9Ykb33Yr3AQ+J btKwb3sN21BfU7SD0joIPCPg63XFpvqaVydWTLmCqqqahaIoW1vBN9ehLQLQyNq+jcf2kL4QrkoS TavrhRuHjM24Y0jNVdWdXfRZ9i8v+ryPqZuxfUyBzvOzkKbaFyG2K+gM2UcyJpKGlOGtNCUKGeEO 7OZ3TEE3odYnj1qmLFsOtH6CZuga56q2geW+q1HfzYk078MxuYVKhGECDL7rABbcvmEgwPaEdeVE IPvOIvMUsLXzmLoSye2KNHldx1YFXt3Y6oqj4jy5iLPj5YpBBV/VhOgairZ7aCWnItlFP7bKqq02 XQ9JjB6s9a5SzQapfU8haMi6oG6jGuONvInTRhKaWH69vU/UY1cqocq2gX26NZLBzsisY4uFdHzA WpIB9+2vZkdj6+tTR3wpw/AVDZ+NtG7TBtpNum4ew8jeMYbWPSobcibhgE0SojGH9Dco8MHYuI5q KOCuPsAJzB5stRcxnGjvbSKmrDG6qIJcbNItquHVF2fXtk+tz55u+qT6Mb8VhmrU11MfbZ/fBrdb N2i15npL0wGgsXVeN0iMznhXtmS2wBKrrlpDBA+fGgyrS1tuAxojhSHeedAng0TqRVoXTGxHEVXu SawwsQ3bS3I2qFa6mu920dhrOk987RtDH1QMOoPgHjGqT3bIzsjKmFayetoYACKnaFmS2bLd7u2T 2od/dXVnfCIzsQ9/Mv23AZnhgO2s70FQpl0WaaDYDLFgMyycaMZMn51EX2JRG663o/nsuqjv9zxK aDNMJ3afJhsqNvLu+T+l7s00GWNXkTSZvR1Jj9gIrXOyK3sSaoDixVOZIbSxajOaSQplyJzvw7Dh VR5216Fkabxw25J5eFU3yIAAUt/h4O2U6nQoNIl9yD6KxHQ20Bz2oZDJLmwg1nQYeWJCT05dwaZp w+10d8FwYNdVZVYjBLwAFKr4iJ1kmr5M36BJCluGocPr9k2oDV4aTK2LrfcES4X8q65Pgxhq3d90 pcLL65OlNi88PlgjrpMenGwDKfKOBi+xeBHz3lHfrDL5d9XJHg4L54JKwSu4fEQ2phS8J5xR9QHM HqgBkNRdP+m98yvB+utA+uN3pxHZUBsvUQcDKFy8ifbWCIKT02auRac7JpjTvWWft6CjYkUH+nRV JNpnAsVXbEr6CIVTsD+DkeVoa+rIneieTn9Oid82Lx0jhXoBsMCoV56AoP5vUUvrNp55oKlT3ec8 d1eDx9lXRrf3YXzS6pIRtdhXXxc/stiEpAiDN0DTincBGxix0a4qcvcLtXOyBbo4F+kapkdu1Mws N6w6TFtHF3Lxao2Qqd5JiV7cQFIKXTyxsqKOeRuGGX2OvPa+GCoMqBduSqYYjB4niwozS+Y2rMsh MB4iAXsSEQCd10oDIQZJM2aMHy42ST0is+hK1nynGgY1LN1LjI0c2A/qsGGTOVxYU8hF0LW3DULH dsFv6LsARYoQl+VvOD1ZHBmuM4ckl1gXtA+CslDnXRvynAfHXiM2w84BcR8LO9oAmnKHbeYzb+JX dQYkbQNjqEThVsB2HNgGKLJfBIQJEtw1uItR1Vfihv2FqnquG2Bdn1DfRfeQgHgCViC2J53n23gm BsltU9PFU/QNNNylRGF1Zkif/b5Hkh2ec5+3F8ZayTOA0crc6GJ8XewBmC9LVnJhI65vHV75RsqU gj/qVXQOd73tCFjESIHXkR2zjZxnGWRMFDDwZmwH+ESuEizoRHS2BbEfC6IbvzuN5bPS4iK85S7s XagRUJeYRjcFA7aSiK+siSGB+GHukoGAn3rsfcshLwXKT/cXiidgj0MAUtcH+mmIfyQElNSOipmk pDesur8jvNbhlFQwRxaxzIo9jVaoxMgQycOWDd1V/OhmGc57hYWie7lrOGi/YjGe7g== rEU2MMyIwTAvJEmgE1WhgSG+wGQJwzsE567+/zB2kpHffZlc3nRNgYGIQG9fK50x7bqijfPKFZdw dQ2hvXeOlAS+uzhzDloywQm0GdrG82mB8bIldwexz5lYs31gF+0/SCbJXPStpDXaqTqjNJ7Yt2ya Xd4lZSa7wXIVRN1j/7kUlbf+VuJd0uwZCtBA/hcxyuIOYb/XUDQcHji9vJvLRCQOAjnaWNX/2wf0 bpHBPgn9Bnsxa2ohZM/7scXR+4bjYWsjCp6iaANs3J3/tJ0HVcyRAr2Bht68zuRFXGIDqVa1z/v7 0E8RUTlba90WhU+dIq9Y4UdgzvXlksvgHCn73rtpsm08nxWYCkfcsyMtYRm4IthvEL/zRYx9hGLJ VOxjutR7qVlSD1cbW1RNPCyKhSaRtoZgaUJIuQsBrHcC9rFW9H0FzsQRsLMfZjlwBrWxu9NGbgpI ooghAb046w5uaeWOtvG8V1qaBAfhZceOnRmCYJZHR+IFUUddvVHIFxFjC+X3DSC3RIFTM6Nq/7t0 icDY2yWuZ4W6hpF6leEMI3dQcqSAs8WkusMHK6C3wyUvyo7IjIP9EwbjKATc+7bN8DaezysYz14s VFxIVf3lS1JTEQEJ0XidMxQupDjpWBNiv0NDO6eRCGR1sCS72dL7Hwkv0kIIP1WVGnJ6IVcINlKK j6GJsydAa6yHVUIWH+0RqmApFpApAdW3Pcuj7QN7t6bpxkrB7sIbZ20WzCWDAqm8GjUgWzkQiw0g eNWpyM9haWPzCW4KZsM8xj5lnhvFhirlAiEXeURYfMuN4pdj1+vDJe8ZbckdVtZ0DlYKYTpdPsxG uESdBnOF7yMbvPl4NrVhXXSfG3mfFnWlUTygeyhjofW9GlHwfA0jpiJA6CnMUNWgrwhRdhWDSzGd 5GWwdnwjS8kCVi1zBhYpQbV/WuI+uqLtkyA6B5qEabku3Q8ib+jZDwdhG4ZypndD7m8W9fDCTclX o9C1OF7InUUE9tNY8hXOhqMIjPl2XQGTGCDrqlnPChcHNg5EpFbVtA16ArkPNbG6akA13BPlxEWu EJDEPgJ3P4hYgg3wT+EuZdnT93Ho+GDrImuJTdTBNya7PYhGR2AiSHCGYva8W6oC01A6DIWqAT4k 0S6Y2WRRJQsoUQiMstteMHbZZE8kRo5ZE/Ci1AClmmWh959ZcafEKkOseZITAC02eRuNDjNCkcMT QTgja1gpS6AaDK3FvDDJ9/fdGlUK6mMgLoPR+yjbpudEKFsFOngEMCWL37eArE4G6t1Jd2iAAfGh TGoKa0WWOGxtpJcApI3SGEJxEER+xdC4jUcHiqWNAEHfOTreS5QX0vG0vPv09xUnKhwRPUrrdxuk aeZIU2hgYXeIgpnMEjiCF6vGdZGwOWxPr1hRJwEp5sICYSAkhAUAOiGrEQRskAbQNYL6sXEcCtAc mzoi28BsxHCLaNNCblsTqTGLP4xsSg3DHXAF85gbCprGkB0lyjsffNQwMaJ6iNA6TmUpbbAXKNaE fO4VjDbOY8BsDLo/xcYuBVnHSZIFaMIhLPpEtqp88IfSGxlhL91696GNMXfhR01YYHdazOGMmC2t FjEmkCrpEwR/TRz9blWgFBeBkBaKugtdthFImkKkfdPv7kDmmjhmto8s+8i0ZdlY4V4nhGQqRWZE T8DuRlFINKu4c7M8keuk/tY2Ah2ZD5xEV/X/wm1JT/T3cSuH2PmZUnxwZsxF6QyFg6/5XOobKaQ+ t93IGA4gtnLKIA9PD/t3N1c91oemRMReRNzsiqYEKTCOAHmV3Qk8QEYuuuFH7MP4rL1WGrOrL0ry 8qjmA85ppa2ExJfY0mnxmTxj2o4IllFK80QrUJiX2DiPiJeLmqkXe2gRghFsU6OyC4iU7p3dYKYl m8Sz1n0c9QPYn7WZp97SVOWyj+G9hlnFOPsDQqEIRbwwTtps4OiqCisS+0EMV7e6Au+1q14Eg5NQ XZAsQRigWqVKZ2nOGHDlchohm6IvMDI1UVGRa+9k0gr3ZsxcyHhDIuvELISXIOVOQvj7MD5tyl9I 3GArqSiOSXnkcMmDKlj8YnRX3YaR2E/qmVSWGahm32TD7jbEVRFV66otXlrJ1V2fDIOONl21NbsR HJxnizsntcPhH5MhT+VotvIil1qxFleViPoUhgZTc/dhAfqf3iEv5CxRbATCGIImeyOLoStY/2JZ eeRN0Rd4G809uyLXI3YNY14xxcuQK7mklKmbYAKJTksteifsLGKJtTaqBsmOpThEsJqlyMLBe7k3 9lFsqtuK2MhGAcg6oocJDxwrRM0W2YGmN1EW0fGT4WqSU0fOWAXHUyYnbnKDQr6SVrkJSJ2qgJjY 9JVlCWcRGijfZJ6myIxvk2LfR/NeFWMMhmkULO4mEhMQGlT3QySmbwRJE2kiMF33645k4hJGnaCI CzRCXoXl2qQkcoXmJiTPC7NISOAZeivW3IbwaRHJKEloyGKPWtnA1T3VjUrZSI4K1UmOOlmPIuKn goCyikLfaPsc5jg0osNG1ntAiY5WyaKeAOk7VMhoGhk5+tZntaShdSmhEAJ/cEKjkn2D6bZkdVN1 7DaI9woGMhPdxK9lFNBmTlpUP8pn+65B1bOIH43iWXxGwz+VOkpnA7bYThmKTTXm2uUhdoEvbvhs CLygGq/rZV00KAlC6gf7vK5CZMgQlewwK5lFyAW+Qqnc++9uYxgc+EQhNbJv5CguxZqUFrhVa3br DfWaS7km5WH3ek1ydFBnNddrwi6+F2w6VHrdKjZpy9tLNqEyPcLRS80mNsLiEYVaijZv4zLDu3d4 KNvEHner24T1fnF12Vy4mdKhchMFvmvtZqqn4s3s79Wb2CLu5ZsO4n+r33TFHwo476P6tNJIiDeg iG3JYCBWfvkthQFfmQt55xwGSQHyOUsSA94lO6JLFiNJ9HVNY8CDha7Z8hjXIZFBbhcM9TWT0X3z lvZUxm1o795lUOaA8ps5mQFqstuyGRAhT/UeczqDShoQpFryGWCjON5zQqOzfJR8WPSWQki3lAZK FG85DRAZmI1LUuPiaoI1q7GN7CFKJrWDs4t4F0J4s7dLwaXe/eLvIoQFx3p2eElMOoNWh7dPEpT3 5PFiZd1cXopVQPdOPq+jevnF6QUHDl5vO7u9MDJJD61+b9c+zq+OL0SCDkMsnm9C4SLqfSfXF6Y7 VXktvi+kd3N928H3hbzBYpmdXzLawfTZ+yV2YNHO7u9tOJ83Qi6uD1+skFSYBbMZAiGgiOlih6A4 ZTNEUjxYIvgyVPKLJYItgkY7myIYNfcy2SJwX0i9zcYItASO8KzWyDaa92uQSpv4Yo9cUoI4GSRQ lyQXi0UCp3w3SZz6/bNNApcGeanVKLn4mNRklfBqj6tZ4qhIPtTFLoFgUBh+Nky20XxWViLKh3Hc KElSBuzpKuEqUK/IF4Rm9TG8HSE24iRR0eW4T0niEK4aGhGxushB7VBlKUYEWVDRjYWm6z4WPuyC liWI40z5Fta2FlzBrkfB3k5R9Np5oo+6EbBe2fpZB/RecUHotNFZLwSYhSGkAhuda3Mqg93coaIr qiS8xDZBCskRj3wWnwrKlI6k0FEC4WaUw06UeZMC0d4LVzbGMBxWnPi6YAEhYBBlS0LIpWKngyBW P/GNYrBUgesUuIzms/KSEeVCygHSi9VPxf6R/6YtQA+tYc+7MgeVu7q3Yn8+4QM8RVYEMktUkohE RNBCvCSlYCgKLTLETLFzjreLCGUpZALGXPX0w6Vh475qs2SostTXUZQgRetmHc97xYXsSVjqfd33 terslAdKs9GVzjgKISH/BQcV9OiGznimehyp+VO5AluDcrP/7STkrZsR6VjIEFhdnR2IIGeGLJFm xzlyRRSH/AJnfIPxzTF/sXhvg3mITSLJCIpIqEmiSRZkb4NG8DXH4q/J/LAcC2oDLQuhlu0UHp1S LM8jmmIZFjdrek2w1KkAX/MrCFHHqh1JegWZcjNMtgGZXaIZCDp2IocNLbmC4wFjA5HcSvfcs2Yn LbWCSno9+jdlViYLZiRWuGRfqeK8yjW5bCOtMoWDRlalLy2zniWpgjKla5hPy4AepT1Q0FjiqjyQ ManFyoxJd+D4jGyGqjlw8kmLGkxxFC4OXPQGajPdpjbmmm3RG3RcdlMbOMmjEW3VGggbWWntNoyP 6gyq6qh5URkUv5OUv6gMRAbUolWNgZiFC1ZrzdW/08SrvvBysGbVF+ywz+rCT+X4qi702OesLiDF ZRw8W4ahbOhGFZ1qhUih1ISqHDhDjU09JtkrC4JuSGhiF7MiIXx5M3LZRRd4A3oU+dLO6EZ1AOUV qJ5ESKo4IIFIMELJehysBhF3rFufLV1Dxh4o0qx9RTnwxVnqLsWWnFlG89k1gKPPNXHBoK9ikKLU jDKwMHSiZp66R0PJ7L6Iu66sygo+soZaVs20lsol42BF94ulJe2mXG+DO50USIkZMMgXDVcHLgGh 0szijUEk8I6PRQ5OFkedF6dlcvuA3rscmuPwMGZZNlAcIuoLEFk7PfWKlBGM0g7zQaIuOECFAA3O f+upUVSuYVHSCUgtxXNsQ5Q4JBoFIoj/lMAFrgIjLVnyVB8KRz4wLRJEajjMH4mUZjUj6yA+KyWd kuy6FVyQe1emOK7hhCtSitX+0bosiL6oGDfxTjIf3yVY4ZLtEkdiDkzGkOCWaUS8OV4CFPoSwwnh e0gXDrVr7XWLXFFUUD5TjKMOCcFShmOzj+O9soEQFvxtKh/SAxWdDwjywYnTXG6k0sd8jcwmlivY iVMpVfQILGOEE1Pi0u/fcQ+0t8E/1sgZIgSwCxD50Y0FIaFIiVLdhnFYKHkqWUpazkh1J70HBEj0 7MQ+hs/KBh326es5+1EQDjOnTw3SxUEWDKqh4JuhmEt3LtQe2XFysTeh7LA4qLBM2+FQKJ9pq3r0 Gr4Pjt2mNOJdiA1BB+PQlxoIqMxCRWeaEl1JiiuwVV11nG2Zh/Fe0cAhTJxliG6IBqoJEbvAsRwV DYpr00kdkw2HKE6XRlRaqWzgIAk8JdRzqWygxLMlCuyYbGhiBZWYKhs4JFEov6WyARMCgSctXSKY Y98+1CEb+yA+Kxs4dI/jUvEasgGLDoGoNmRD04nxGrKBclSUgaFi0k68SwQCBxCv0Y7KjQFT2RCj MYSpvFvuaEHhmCWgIsdiUXqmogHeIYkJN1lFYx/Fe0XDST0sMh1UcvPCY6bS8iY1Cmzh0pnMhjCY msyV2UT11xrW4vs5oPScxq8a3yCDa0iaigvOm3VFibSuHgOk/BrOtRY2QnR4iESjHnGqhodP2to4 lXgbxaeFw3FcnJJF9bIlg1xf45sNdNIpKoO7UFIxIJ3aaHViC2qNEJnLtjVCsJCeAEgPd/cOLjpW bLXtsDZLoxebMQDXRaRIh5W1AJSYV2l+jPG3QbxXOKKXCilcm1W4NIZCwV1F4zyeHQ== xK2sykMeCWNUKUOPISZcq9Uc4oZbHNKjwh6CSUoRRwvVrIYZhoornHyrVsNINd4hDQs64hztRaQ4 N2odHc6nhqmifR/GZ4UjYidH4r5x1kwCgbR7h2H7IMmHAxIoKVVfKoLBgSLdWuKLAmucGkZt+yjD ZH7C8HI2CJy+QbWAHa2kQqtGrzZdWQgU+kinQb0qbDCv79KsTJTv2yDerTiiHM3HH+TjsQ8f+EAX xR2ylTdKmALePC5pFigcVXJgrnFqBC9WvlEjT7Xr6ARlAHSlRgwjKH/lzG2LReUR3SAb/RpWGCX2 2Ej3fHqRoZlPQ7g5t3Mb2WcFho7AFb6/Kms1NN9QJayqSc/ngzznuXrZWSozSNYWQdNanXGVDoM7 2ibjiAIxr8Owv4CMI6thOkNKRVgoX6PDFsFOnTUKJQAYvVZjIfjKRyXcuD3kNq53KxjY5LjvDJGY KvXTscpdFhfsTInExsQTTCdigp5SK1wNTbd46HlqzH6ApOASj6iqApdtoe7sQmJPytYQIUdBO50w KpPdh+p64NQDr0nv0bjKqKJNkrAAEB8X0X7WAX3agnV66KdRZc+LdELH43DAp0g+FB47igIubNDB dAGVDaBQyvZKW0m4ASwOy9bBjQewq08DsiRdqLpK5hhwkviicLs5BrzRoLA/xsFIrKLeuRWN7sMZ 7BnXV2rMtMmtmpCZBpY8XVTwzndv0h0bvLpgD9ENOH2b68tESokKb684NlODng7q4s8RY1ThOq2z xgaSoxyRtlxlELpR7jHq0Mk4Rm+wfjTy2PiOJLS0qntaf4Uir3UUeJGuo1UPA1wj3o4Ox6Pqv0Nb tOKdbWCf1kMwbK/ERSIXQiLKKjpYhKiYauE+eAo4oTKoDHKMdK8XAxFLoRDoAq5sAypS+IDAcVB9 gb2OC/ZwZCgMlvLZCDKJxulkuomB52RwNAae0xT1sNNtUI8QqtBGsVCWyxfQEaLl3QKsRVNbfZww 32Aqq+GJ4DxZYrZ5IyOI+33adJwviP2Kake9eQn7JC6rmi075AjJfK7jvjHaRrtoghLNVWG3QzwC 9qnGLPdRfNrykVJ4um8ohKpsiY5OMEI1jGve4C4AlvT+Kppnpnq0omNNrYxLpbAXwR5qiN2IqdBh 1RWylauWbmG8MGZwoVIQYaSjP6kuvMcuibg+ZqjaZTLrMB4iMYV4XZilzJnCAoM0mvpRcJAhMFnK aggGFwCXt0V1LGD7QGByGgoJyxQCkydbBysCApPlajJlMwQmyxIUBhLrc6U7sKQZyQuy5OpPb2P4 rLiAEvA5Ny4AEp6QtCAknpU69i2pIqIYA5hgSEYenAPBmY8ZCMEkLDkv1+uQsCD3YAtBjhIghacX 12EBQliI78X4ScKSq4noNoZHiArSBp7vjMupyZGDS47MBz8lYqsYHjj9FoPd2UbnZoMbx6pReI8b U+hIa7IcTaFrOgLKTiT87SU5igJXdRlwt1vE7WO4cTEGO/JRcGMp0eP1HIiTmq2Auw5Ef++j+azU FL2yFjESL9ZykUOH6Dkodxqde6PjrM4uVRWq3dghwEU+PgyHwBt3SNgAjFkUA9JaCObR8dcr212A nD2B62Vs5HwDz4Fx0SGhgrkq497XdSwPMXhg43W7AIc5Yeq9CIzsHQT1LzVWcKYc5g5OzprbdVW2 dnB9mt37cRU2dnBo32qwcHAfHdUyHbtGqTWWWs18R562JFsHt9DaQWqknGEvVDgUalj0lmTp4Ci+ HpLdB/RpOwfWN0wCuiKtVuMQzBxcmuvLGDbMHGRHoh2yqEJ2HZVIYCSMHNx+YJ7qVVnB4kDuZYfF Gps4OF4SNQ2OQUMM6nwJM9gDC2edh8YmTuVQ0O9Oo5nYI9eoP1F+Ar8Rc1SyuifOF2t3RxyV8OKM yrWsoXERgFUZXHxLk7eSVCrm6boam/m4pSVyVokUuZ2ilCQqnZQdMMrPUqxXPc7EYWSYlxYlRQk3 FQVO15xQjh5qLtSRYUZLCVD7okbhPhzjjtyI7uh/LWZBVQDYNr0oXkJANNXpnlYtwgqV/9Wu+Cor uL1TS4qjF7s0iS+3aRSoHVV8UWop6XhwGWENSlChpdVcxKwY7QAe8QhZbHSd2rg0ZhnO5wSDtl+6 MQNpCVk1lLmmuy2KXrqJIkwqJqPrk73Vw9AmgKpw2Rcy5BrKFPXjoyyJbntGO9tpLs6WoJ1plCzp D0KodwVip0FBJnrubxhKuf0DglBsa1jH8oZUoH+61qa3pRN+L4IAtUE4OGS3oOFeAXI/Eh+TFiBd ShpHyTQMLxQ/09UjV7BNiNQOgGqHZrmFCCNP6mZhK6eic7ytJ8VxUNdQ6t1RxCMnnZdqu/E6mk9q i8rhRFp6VexaXDJKl3RAF9ihicxXofPZNPUOi5xKQKzPwkaI0FS+YMPbebUqV7z7cREATmtx6R+u 1tJTFLjGjDLrYTrS3PiCTFqietLAiX6m9XgFC7uvA3pLXyBySxdb4ARqTpoc4bKxOMrGECEockF9 1wyWTbPDevhymHKJrkCmEqZL9Rru1Mlci9G3hKhAinhj8JcW4SEzQ5c14XW1ynAZuOFU05HYJDeL 1JqMI+uAPiccOIBCcZ+MMw/e6S0PVP+FMsOggRfcdIDIQU6T/a3hXxySSH5cTEeVaRn5UnHmkUCk y1cyJUeDugNcCIJ6J7Pfo9yJkOPIytNtbHKyAh/g05Z8N2TCWSG7wHMdzxuyge65ejDzni4Xpl6+ ck92fi9IwTId7Ch1DP4SLtmt00HOF9KNAXrzPS5SpWtu8iTaIXAIAoN3WT3nro9RL0yv++FbDZxF pyOOawGaqvDbiD6pORApwz0YKP02zRFEddAnXiyEJKoDCk1r9IJojtwmxRFEc5AmjqMWEpojV77t kWGiObAHhctZQxRb5zbK9oLoDWjNNkWpSG+U+TTRPpq31AZlfPpMFcoKysDlNtcylY9RRA16A36H GRRB9Ab8PLtZL2S7Ot0ukqEgG/QG9pE6MY4uUUUdmiWsqSS9W92ZL1LSsRtKs7CCqA10bvcRbeP5 pNKQC5Q09SJXprTMJ1KsehJBAYRDULOmaxZxkkznYYraf8g50u3zYZylgex0OrE7lWQBgICa2Ij9 c1yWQglnKG09SUD2Xl+sMY1UJnE0ECVZ6xj2UbylKapcCJD5BlOJgvBJ/zm+k7mUk8w/rYjPdlTH DtHQvS/daoDJrtd7BblzEDDvLDRJZ13paqlBNhUSop2eZMaUCz5dF0HKNdGtBam2YXxOCnDciCLB sBaSXIWP7ACV4CMjJpFkSrPQNQC4kFPqZlyX4sbtnN63kuhzJIHSfk2vFkiOzFfESy+9FdjrmYtr lDIkL5mw6MeN+TgPVzKbH93drNrSwRcmQ6VoAmQfzRvigP6T5y08Swg+2Vd6pqu6UWYcGjeklLv0 xFsUEpZWSoXA68XpwVJGdoutVQD1nnAcU/GBU67jBmIU9F98s1ixO3bDwGmrA2y6NF2q4e59QJ/0 QuSGa+xwl1b8UgUyLuONer04An4X/DM/IuUZbhncVTdS2mSLo3y8DTcCpjgCRzh4r2Yzhfcapdft 1rgsH1mhMoTLXJDutzAtWh0IBdqQ+/ej3T6MNwQCMSvyP6UCQkbMlyt33mqxIn3co5Ynurt3uGIo ZMcNx1pejfAokn4ITWklVhablcJV3hySUC66CdkCsdhIcKKYPr2SrMaZVBVgqjnBGSQeg58+erEN 45PWg5PbzXKavvFyNb7TNqMwQs+dXZWPjMIOVFuG8ouNKuYsagsYWVXZjfp5CmfRJfK4F90+LYWz U41uho/jEzFgSpATarpZ48JL+p6LXKKmOCn1mcP01ZltPG/ZD+ge2jxHDsa9KAKKiE/FHhShIzsn jvIFXI2Ju4lgQWf7EA7SDbjX3k8nmRGW6vZN9tOxRASggH6+Tgd9k35CSzNenOOa3jzdikFBLRi7 ZL63EQhcxvNZwxLXEdPZMVhKUfgT+LM4dK7b3CUIbaDjH9g0LbnpmRl0kKWYjeT0GpUwLkyB8Y6T AnR2OeoJEHJIPF+NnzX2jLZy9I6uQbamtLyILvsWCYx6cklQN2sE7ON608aMcm18gu2kX6ZAKBzh CjqZmicukLIHtCb9PARUJznsuHUnmpF8cYE4nf1NZgF6jmgR1Jv96fn8Oh18Nkc+iL1BbYtZ5FEv wIsjnwvlKNe/ZW93M+8j+5y44IAW7rOv052tCKdAX9a8aHuqtMSVi76atqe8KS5XUssPiRocHqxj tyuOPxBQ49h4iueMU29W9IhScRxHrelZ997iufK8U2IavMh1NnUEU/dBvCEZ6BjHcGphh+VFXsfR qIpvn2QbL7mQdZTiwinLTB9VZ+qWgI2sxvExNmyC2Ew7LOtFnJo6qZP6x1eUEOrHjEughk7tCjrZ xMAVHBvAOROtl9wH8TkR8HIlF4UIq5ym4m/iNAqpjdqxJvcjIT7Zil1HzdkefCQs6pVtl1yb2pWb XYiDI1eOG0b1RVG1e1HVBO6NEJVIJ+c4unldkqZCWeelMT51RlEJ7SQaWNUZvY3nDXHAsUE6qePi uMYLCOgyTWBtNsqAIkGOJl4GlNKMMIJdTUqxcDWgWtV0xS8UGkKZtRo7XHJyBUkKVqmaG0V2qarK +DFw5moMoTQ0dV6V7/t4JtH4eUfKoqinmGlILxvM+T52xFoQZqVzPo02XfkwJz9/+0IHzDjhN9ps SMLak7xksM7Z8DSw5K2nPHoyaqRN3JHEe090zWyTkE4gpfuygWIKVFdCMgSAp6rlpL/3R2BqlZ3P 0eKGYe5FXhEQBZXoJcGR1l7S1IvQwS3ajqHdeqGbZlVC4SrLPbMTiAhEipduWUZ6KpCNr79L5/Sx E8oGE8i3DcMMKPaKgAoTOHCUtZeivQw6tMWKYRuLDjEqM+lLQEWLJA1GwhblLAJ9RKc3Qu0fNZBn IKPSSEzCaHNDsvQkLxmMhM2w0J3LU0/yLC8xNdqm7kjqvSe6qDMxC1oaztAEow9feclsNEkw4lIv +l2eaXYiT4a1iRuOuPYj7yiM/jUcaesnTf0oLaPNiiPd+/mRlzTDy4geGwxnbbrNmeXGSVyyjDZQ A/I7PYs+YRq1TdhwhLUfVVwCI6POcJStnzL1o7SMNiuOeO+HNNAl3yCLY5wGC0wjMvJY+S0w7iol 6foMXMiHo6p3arPjWPqRdxRGNBqOuPUTl36YFoFN9BOOfTw6ThTW0M1oF3vYLxOMPONOY3G8KLLc LQjzSH6n529sDNHimtrsOJZ+5B2FEY2Ko1xrP/os7xAt1sZvOPy9H9JFIs8oQgtyY+wEi6g2ibIm stz8E2Xd6DMpCFlb1iZuOOLaj7zDMDlqZTjK1k+Z+lFaRpsVR7r38yPrAhp/KmM+DSZrC7fxgodJ zvx7uUlbn0k/BO53arPjWPqRdxRGc2E4ytZPWfphWrRN3HDEez/0kTHhaZzmc4LRXA== JFn7UeYqiX6I03wm0SHWJmw4wtqPvMMwmQvDUbZ+pvk0WkabFUe89yPfRdYImI1zghGNqO+ikhNZ P+FiPuuzbOH822iz41j6kXcYJt8KMBx+68cv/TAt3vpbcbh7PzSfiaN1vg65NVhhmUN4AjkLL7JC 3ybk302ecOQU4eWpzYojrv3IOwojmTMcdeunTv0oLdombTjSvR/+5GpiRRzbmNAZSLNBZxzAxtjE ZrnERVfAN3otinKYWt3wLL3pawRMUp9leNK19aYAfY2XqrVKO550702/M0v4UH84Bj2ARiyVThW/ Daf4mYzAOEarsOMJa2/6GgODEqt4wt5b2FhMNIWNNQNPvPdGg3byGVM63Kk2xAR1LJF0poBsTnwf hz9RlOVbjwohUlxWEqZ2d1xrn/qmQTkcNnD5W59+7VNos3blhmsfp9mKcn1HmnT0BKPJyvIxqSQE 0WcW+HebBHwnFetxarPicGs/8g7DRL8ajrL1M+loo0Xb+A2Hv/cz6y76DF9YVBd9xhuOmOoL+nJh MJUij7PmGi02DHHpZVZc/Fm/HJ4GDr/24q0Xo4NbpB1DuvXyo5g9BHZE3MsCQhgrUB6WzyQ6qjeO Shw/iiHE95JKi7BjCEsv9MoESpRlNhxu7cVNvQgd2uKGYe9FP5ls3/0q+m3oCUazAAhd1UNZmUDP TlsINlypS06Vtck3LHnpS9+SmNXFczHw4JLfuS9+/iYUMj2jzY6l3PrSj52zK+tn/TSgqlOuSwIc XvXOJRu/QVhV6r4wt7vjWvvUNw3KOmXg8rc+/dqn0Gbt3A3XPs7BAdWLU0htAVJwgU5p8he/OGAG AOvKKarGZwhB8tTqjmjpT98zIIUYJkx57y8v/QlV2irfEOV7f/xVHNnq6LLTqZ7YgExvDBqbqdxF 1K+tC4AIibo1Tq3uiJb+9D0DMr0DU9v7a0t/S8RoIVwQxXt/vMaDCAVlBIt9AN6ATC/uwCIVgm0C Xeh1FQrgpSelDHOrHZFf+9P3DMj0Dkx+789P/RlV2ircEIV7f3Rhl9ziMo97hhG1dRt19aIop0HX bcx2RZch8WtP8pLBiM66jXf0NIZbt9HO5DKScO+JpTvxLdFVrhJ42YBUt+j42k3Kc6ERldNTAwF8 kzVB2nVutaGJa2f6mgKpHGLgiXtvce5NSLJGaUeT7p1JtIq9jTaijxOMrv7CWRHxWGhTqc28GosK 1maej7ZZcEzPYXpHYXQdn+FoWz9t9GO0CGyilXDs47Gp1SO3Pk2OxARkBwBVg+C2V0VKHwPkFsO0 R3mchD6lVdnxlLU3fY2BWRwAw5P33vLcm9I0tdrw1HtvfOmkxO7KFFuegRQYxvUHHBmTyDHdHEEt pvCyU1dxbnXDs/SmrylQCr4UT9p7S2tvTJO2mqiWrPp1740XsR6uvq5pi5qAQq2wtTWlQ5jf2kyH TNFoVW6IytqfvmdA2VmKmnaXbD5V7b+RRTCq5lY7onrvT33lPA/gZQPKjQ7Rxs3fBb+ijXtM2xVs 3NIq7HjC2pu+NrjDf4Qx7EDGRhzDHqZMHMPWVjuieO+PveVLvchhfc8wtpuvpv4oW9ZXU691WN+X RUOszR3L3Je+xTCzmw2PWNbW12R9Gz3Sxig2LNu4bENWo3T6QvEEyrhHtl6KvOLrAVUtYH4k3atm srW4YZh7kVcE1Pg83MDR1l7a1IvQwS3cjsHdeiG32Ct4yhUNoASSk1PkkglKTgmY0kXJKZGj1Q3P 2pu8ZkAOyxmesvdWlt6EJm3ldzz72Kb8GOO7JBHzsgG9ZMj4G8KXpGOyhLkNIPmuYpEpSZJteMLW m7xmwCp5smIBu7W3NPVmNI1WG559bFMARJb5HAAxkAZAOId8OQk8OP19BEA4D31pAGTDEJde5BUB jQCI4PBrL3MAROjQFhuGdOuF8ipVYj9TBHOCkb2A26IpfiSRSV8kxjSFLykuHdPcZsVR1n7kHYZJ yNFwhK2fKXBptGibuuGo935IfqW6CrnWSy42mmB0KCXLUWic4UGbzF/MtOdv/A59Qsfa1A1HXfuh dwaMPnpmOOLWT1z6YVpGmx3HrR/J17PHwRKj+XqDZfgydHd34e/XYz/zGhyT52/8knxrR9rEHUlc e6KXDEYCGp4GlrT1lOaehBprc0Ny64n3VinTr1MSaQaytYtqV/JRTEc6Xj11yiNRjTCZ9W7sjhue a+1NX2Og5IEGHr/3Ngf7jaap1YbH3XujxJmuYzfsxxlGzmowZcChhJBGME85GEylSJu4I4lrT/KS wcjeMyzuWntyw2w0akabDUm696TX0lMJOd2FH/WblwOKSsXGf/B9bNjhYuJPVTdtQ5Bv4lwUXJK4 tNtxXVuf+qZBk/dPEyp/69LPXRpp1s7tqPZRDgFv/DE1ZGaj2swTkM7HO71tE0dE+KixnD9TAIuc XEo3WtUdT11709cUyHXIhifuvcW5N6VparXhaffefpQePVdHuzm/ZNBLc0KFTicCYCmcok2mVE/h A4tLuzuqtUt906CWEhJc7tanW/tk0qxZvaHaR2kaXINKvk4lVxOQ7tj0XvMd6qU7zYmUqRrKad5k tNrwuK03ec2AdMHywFP33qYoy6BJW/kdzz42HXSR4j2U8+iUK6xqqU1jNUKBmN4GF4fL78b5Ulkd WZu64ahrP/KOwrjURnC0a+2nTVKltExtVhzt3g+7/5LuTpMTPGDsu0a+kyFK6MBprnsOXMD0dXG0 CRuOsPYj7zAsayGk4MhbP3kOkAgto82KI977EXeBz1O66QzVgFFoAqYNxCXKjpklJabPavND8KY2 K46w9iPvKIxLiRSH2/pxUz9Ki7aJG45474fkNt8DlBOMaCx5DVCWdA9Q4lPdc4CypA1HugcOJxjR aDja1s8UkjBatE3ecORXApQU3/F0OmGqdBhAqVC4xKyxNDziI74ZgIKkUperMMRsZizTc5neYZik rA1H2Tua8t6DnKnVguY2LJNf8TXzfAZwwFT2yLGkOD7L1SW3wg+5EjfE2vgNh1/7kXcUpoe8GEfY +gnLOmFaRpsVR7j3I9Xaiyn8MsOQvY50IJE+LFrloyoqK/pMqp/yUWlus+O4mdwTjGgzHG7rxy39 MC0Cm+jnkq3r3o+sU88fbKGbqXSdGoyyDyXzl2norsuLFl3RBniWRcf3no02G5K09iQvGYwOyg8s buvJjZ6MGmmTdyT53pOUvnK0MiGt7qPWvgqQcu9UZeQTH0zLaIRTP9qAAESDfH1kbrWicVtf8pYB Y6zlaaApe2dl6sxI0lZ+x7OP7JZKoE+H7akEKPcllaCrxIL781KyFMDc6oZn6W1JJWjl9cCzJy7y lrhgmrTVRPWaSph746RRHjV5NugJyMQGUflJO8CV01IOONkGsnnMrTY8ae1NX1OgnJRQPGnvbbFE lCZrlXc8+d4bD1qslBDmTNkASoZLculBM+9BjJ8wF8Hpw9zqhmfpTV9jYNQMl+KJe29x7Y1pslZx xxPvvakfzFXDdRr0BGRicQ2DGBpSbnAx7xWgnqyaGtZqw3OtvelrDNTbfQ1P23ubSzmNJmvldjzu 3tuPIlsiC3Lx+csOpcvfAGGtQNeu4XCxBSEU8k2ERITN2sUbrrj1qW8alM67T7jarc8292m0Te12 XPs4LZeiP/g6ihsmGNclaHCFXDw6K8p0yDMlOjRIo23ijiSuPclLBuO6BMNSt55G0cygxtpsSNK9 J5ptidu22edXmLrpEvtVp8tJfHh2zJzEkKc2K46y9iPvKIx9c8Xhtn5mF19p0TZ1w1Hv/dCcyrVD MOK0HtxgXs7OyBevsnzfCZdcyu9Wp13lVv2pzY5j6UfeURifv1EcYesnLP0wLdqmbjjqvR9KnUjR X5mCGBOMthSqc+WvbtFiSuJUlimCQTtEFzprkzYcae1H3lEY/Ws46tbP5IAZLaPNiiPf+6FxWhFe sRTRBOIEj+YZPR0zTFbxZwcRrfTcWtwwzL3IKwKqkuAxHHXtpU69CB3cwu0Y3K0XDPFvv/zVl//p N/9r+G9/9dM//5d//MMf/uX3P/HzX/zLv/72J4H8x6c/+5t/+cNvv/3b7/7t6b//8elff//bf/3d b//xV1+O0O530YVQ8k/hGzvpn+R6j3/8gqPTTg5P//3/oMf/rf/5f3fgvz/Fp//89H/8n9fTPxP8 7/+GXL0Z4cuACNKnrzAwl35mkDT+esMEyE/Uzf/+hY4088FlnG3GV2Xnk83TWfcO6YuGzjnTLbl0 zvl6+htCURPuF8aPdNMZ5oTuG7bh/oaa5ad/H9TQhWxXngdG1wA5HoWTk/ozzGe+EiM4ju7OMPq3 D4NgnVwX3ALbegXon77Qbe50VwB1F7J+foiTq8YuegsXRA0Q4Q70ediGW50WmNBErzq6/XcG7X0u tPiFMQKamYBTSPLReoMluYZ9ZozCZiYgGN8WyNankkIyFFa23OUKF6eXsrDFep3YslAiPIBOj3UB 7X0qLYKdOkv5tYWg8jLDFDt1tsGIqLzKywzbet3lBbOAMr9XJkkF5ia9UHyev6+zwKaeRWJm0N7r JjEzawQ0s0ElZobpnMysUdjcM0vMjRZ/Y4zO3swYkZiZCSoyJ+mdGXOiRWRmBu29KjUqfjrbL6+s ztMqVkl6U4EqJPGn378e+lRapkUnlJwWxGnh6MRN/d51k0ImStYelY5NE32PJdTcvy7OJ9V0VyYH 9fdP9+X/PabMtJwk6CBoApppOeicWVZUrmbGLFrisH5Pu9RpMxMQpLSt0jL3MKRlpuW4LA9L5rQx vD5JMy33RT7Jy89lC3E3r/KyaKGDYrqrkoPym+Tl57JlpkXl5edZTTMtB30DWvCd2wI3n+4U508E eL4JCBZTUEMp63cFCu4N8nKn1msm0El7HJTMdWowC7lcUxMD4qwo3Q642RJmG/4Smy7jcuthrXk/ PvxwMELu6uSgc16zc/yBuk/wb1vWcjYi53Q3JVbGvWZwHLiHLpVt0/cyjG0g7sr9f4pcf7Qphpfv GACzNnvVzN0UzY+HRf/ynf107uctq3HvB1/QhFNArGfrnwVkXH/0nGHxR5quiIucUEqCl1aOqFDP HDnY0Ndr++5pe2YKPfwL8jgwM97hxjl8ll4Ei7wYke7+Ii7A54tRt112ZuHBir1e24ZPuzUTFvUj Ih4LLjy52bEywc9CG0Q92CdXbnbuaZM47CXX9yzXBymFmbRXDcOZsNdMWX+g7uOM21T3pBNupuLK t9cMyhPzHrUkqnxcYV4SN59l205f9W0mfA9bGjOBp73ztMe+5WHsBP7c0Mvf/vTTP778yz8/CeTJ /erLAfZUn3Ccv//fl4/EWPA2yQtw0Pz76a9Kf1T5FzGTP/8j7eF/+WWET6rOf9AV5O2DQuBumhdc wm2Cfr+tHHloFgjkzHjK8/RXZT3E7cY2BSpwrwc+bq2XnOsj6k9RZlr6vy4gxEcp6w== qH99Y+1CN7oJCIVgXUL0VX30Gk/GEy70xSv6Kr5sgArlqH9JDTR1KiClSd+dSNZw3J//LV4z4l5+ McS9i59nAYEeIG21WROqJHKij6RBpdFVk3KBoIoErt5nQcBnBewvEQRut4oEwueTSNijDAEHb6ch dCU3DSH5hevymV59VR+ZN/KknNNXhbEpz1zXTgWkNOm7E8mLSAziXn4xxL2Ln6/pDN3rxnfZ7Bts 9hN/bAwfoicljbAsqRM2Fkg/vPBfsYoZYH/ctMgQD5S3gX4Npeljk5XlhBmeBlH1D2LqYAiWJLNS 31PG0oLkB2G6vCZTUvUPrirl3vR70EqM17smjdZFLoyql18AVe/h4CvycKkxYVrBJOSC2QH1UNXe kMtpu+yQRcIGWlVx6H+JFMAWs79uOmQIRMyLQNijDAc37k/Didc8HpQ0TMynGoPBfX1kPumTcFFf FSZ3vNMMaKf6Y15nYCJ5kYtB3Msvhrh38fNPpi/qpQJSTU10wPhLxKJedwGBPpsExB5lQKQIx4CK nwc0K9EOUv0rrw51TG3TMgf66lDs0xxop/pjXedgInkRkEHcyy+GuHfx84E2BusHMTuD1w1j/HXT I3ezM16L2UmyPZlJkH02k+Sv2ewUkBhv+qo+XrNlp8tRX5XV2vHKX7NlJyClSd+dSN7NTqHk5RdD 3Lv4+SfTGawfxAgVsYh1+uumR+5GqAiIPYbVaJJh9JUwDWhWpMPO01eHSp7sPOWj6W9T7tMcaKcC UprmbeIkIIO4l18Mce/i55/K6GBlITao01CU/XFTKXcbVAp57bGsFlS4xIKSPyYbVCBs0tl7uvCG tWfrWUy3Itae/DFbewIyYq7V2ptKc8UGFRpefgFUvYeDf0IbVMSBvg+oe8f466ZC7jaoCIQ9ltVm klH0RTCNZ9ahw8zTV4c2nsw8U9V5mYCOd5oB7VR/zOsMTCTvNugkGL8M4t7Fzz+VfNRL5aOalsCX bOwvkYp63eVDbSSt/K/reNRkklF0k2kazxzaGVaevjqCRJOVZxGkukwBzgGOKdBO9ce6TsFE8m6C TvLxyyDuXfz8U8ZBXVaD9NLNw/64qZS7OVoXa5SU4GQ9uajWk/w1W6MCUnXrFoOvzvZe5E+k2Yt8 7AVY+a/Z3BOQ2XPydTUjd7dEhYqXXwRh7+LjY4OfIgf9r0v3DPvjpjruVmddjE6lX40koRrHcgb9 c3Bn2HX6qkWJJrNOeGYvMkeBdbDbumSQmW386iB3NzgnOfj/n7B38XGpLP30lqEa8GWyiASkJo+p wbiEae1RMwZuCdPWOUob11TDmmlYEg1LUFkDj0mmYAopcybu8y4YokODAxY6Ssumb/TkhQP2mNZN X8Pn18wCNTYEJKaIvqqPfrZTbOvKCx8GyYMRnxaE4mc+WIQkLZubEqTPQq49pnVzk6EWP/NhxjH2 Y31VH/28H1sUqS58GCQbHz6kDeHsNxu6RQLaEkcw11Kf86LBNbRkyS+vGnwKLZld4ecNx6LaZQml lyUaZmZnU3tliob9+CDzAE7tYIR5vG3xly0+5xdG2GNbVZiMNeWZETOOoXEtfttmRuiTX1380Whj RNW1NGs0AanKMsM/Lj6/PYZVo4mnX2eXPw6NYBrN3ltiWEuEQt3YIBptik88aCHD1RgMMD8kLArN yMkLA+wxrApNQzHXzIEZx1Bo+qo+XrNCM18tL2wYJD9SmoufGWEGd1g02qyVJ0bYY1g1moy1+JkR 8+4wNJq+OpT2pNFMo9eFEYPkT2s00R+zRtNo6rV6KvYcF42mnorFVS/VaJOnMuMYGs1iJGUJzJTF uTIj2hpNztUDNdrECDOryqLRZrU8McIey6rRZKwpz4yYt4eh0Swa0GZG6NO1arSh/2+MeICZJ2bo rBSdXiewWKb6WBeVaF6RvhtFJU6GaRxK1VSivTc7U7MNrS8xLXW2oB9o4k2jt7gOg0zlCTl5Hr0+ mS8QltEDcbzpQwHpluMWfVhndag+YV54MMh9rHk38cBiFwwybcf06GNdVKEOxN6NqgonHsyuwlCF +qrZ8ZMmVH+oLjwY5CoPPlrUFg5FbeFXT+nZx0b/n27PKzln/rfkLx8pc5vxvdizYOSg29rLAuP3 vm54tCTOPP3b56PrswPP8A93+5++8HdF6EDmCsbdj7HcWgsO/UbAjmSHK5YdLmj05x3NDtfnHd5V on4DOFrVp25/lxVYav1lsjpQXgQs6s85ty5C/I8eZoN+kKEPPt8Ag/EyoBtAcX299aSBkuXNlwGQ 8IpwZH16o9/F3dftL0iJbJksAvnzuVytXlQlyxDWgXbJLZP/wlooORzSGPTTBRp5YYyXqzhmUH2G 1E7vHZhzG8h9rDtRysG15cuNayo169NbPc1MNBvCzkYksSHAPJTzAla0CjmxQLI5gdv9W55lC196 KHlhT8LFNbUsINx4lhZROQ3+Tvh9cLaOp/c2upSPq3p5eRMd8xIH813K29M0EEV5AL0msnSMYzB5 KYlXm80W8lwTX/Hdg1gWbh8Gfx/TnaID2UWqp+eRrB2OyOes7a6foUa0/dfl7Z01wcGsJUHUAzly fgDyJ2a9/hv5p1nDyTKcVIyu1Wn90YpObdZXdM+MthJGzjTex3Ab5kGjrkRNxfJ82KDPsRrxdvTn 0rPsOIOAJlFMmMD23KK5dGyzOpgHp9psHp2qs3ksimeBMdELY+7sOzBZXpwGfVCXB6WqxE4v7uMc HMRX0x3EA/8VfbiEV3ZwQx1BOZ3AgX7RTrMAq3paJlj008yBE5NPROq701gOGvCkJ0VrTS/qWp7x K2ymQ1+d6d3HumvByfA5KTYBzW/rmyfY9OpD1rTqHh3RyysjP3FI350YedJur6vueYD65jLojThl LeuF2Yi77Omu+17TK/MbCy/VqwvQF3xOkfdkO7WknMx6w0aIROBsHpMw6jdTxEyFqKRFb6lEzdpt JuxO6n04J2Wq6GWRfL3T9ZCFbpbDNFgzvqfRquKZh6v6aR6citcCY/FaOHXn52F0+uLEg5MWPmlr o3d6dx/rYKCdcDPnYUQP+Ihr554eM0sqXn66b2Xn2csr/Sk9M10nxXpSSsrA+V0zYqY+zEmauGvv TpOgfSzCKbQsMKV5evckI7PSnDeOo4oU2NyPvnuCvWoLfXKtq4bSsb28wr8Tn+3daT6OWvCN7WAe q767jH+jb9WgGhOYVNQcJlAQeC0ghIRCXEE/S1/NeB9kp4uKoyGmRc8qJ76ex3Wn6E71SRdvHSov VZZnbhpsYtSBnQfidmx3hn3UFxd1OPPrpG5PalnV4Tx0JXRm9on41wVrfnMjTnmrRMy8NdjEyBO/ T8Ts+HbufsJJ3/nxMqm+eVgnFXlUpbJk53f195lzpyGdhn6arx8P7Hx5BedbgcRF5ZxUs8Dm6TlN 46KaPx2RU+U3S/xRSb6xcXxPeE4zsvdrhgI5oWKoN0kZ4E/1QwPdxYYBTiaWXsWmXqtXjdlYCAmB sKrE7RQ9X8+W+G6S1Y98+XJynl/3sN8Ou91jc68H8Obu7r4t38RifoxdU6eGlGVfinLLjuU72qqZ a8/BNhSWFhIllaA4khVq7opT9JsvNz9yXsnf8ZwPDvYbbvh3wnKH6N3Bw/0nkSyz09vQWE09PlNr xE3hkDOxYSa7wYaZu3rRAAsgMWjzql8mdTURe4qaHWJdb0TEvuOinzz5u7//T1+WVFYyS2/aOE2f 60qcIkHvX7a/+XL3NF6+HB2Sg9tyct1e9/C+Ezw6hJhOPpAsOl0yttPZ5SHX8Gwkrkbri1Ydv6VC ZQEIVkFuXrJVnMyLfcllsS2xooObc3KHTm7aW+7c9+JMp3jUyb3SNZfU4GoiVE/TfZpJ/1i0+Sgh sA1OhetpyrMWc0zkJo952S2sOoWkDgGcUyzlrZjL97zEozd58Dp19fE1UF08ZIBq2+NP1cFWeDFf AgNpkftXsrJuWoVVNXlUW8CxwlpW4RwrOpiaB4P0YOy/4RN8JzhxCGGcTG/hlWbWow130ui2vPSm l2X1mXB5YjF7AcRiKWLYjYPd2p8TdN9z2E+O/VsBgO95Dycv4+SN6Or7gC31fvW0e/MvX85e9Vve 9/dM+KOp/4ZLsERhDtEGMOijhQv5ULiQf/Xk8HH43iX+xfc78KlOBvAfH7wJecP6MsMEsSy9t6Hy /tcDzt2viBrHDMPoUZM6k9rWMp8GHawnIp9Ta/QdSXcpoQILDtfMcUetv3UG6ZtfD9jMQXjf+qWj Ne5OmMJmKvrvN8oUNpOx4xukfYhviq7dqXP5TskJ1u7EtZW2eJiceJiccJidcJieHd8npicfpicf picdpicdpmfH98npyffpyYfpSYfpSffpyefpKYfpKYfpyYfpyYfp2fF9YnraYXraYXrqYXrqYXp2 fJ+cnnafnnaYnnqYnnqfnnaeHneddNt1Um4n7XZSbztG60rg6aBF811lHkDpoEXT47RoOmjRfNCY J1g6aNE7aZ/SouGgRuNBZZ5g4aBHwyuKNB0UaT4ozRMsHRTpA2YoH2YoH2YoHWYoHWZox/cgRRoO mjQetOYJFg6qdJ+hcpihcpihfJihfJihHd8DdGk66NJ80JsnWDro0gfNUDvMUDvMUD3MUD3M0I7v pk7TSZ3mg+o8wdJJne6cUAVYD+qUyVt05wFUD+q0Pk6d1oM6nakwE+8Aqwd1eiftU+o0H9RpOajO Eywf1Gl+RZ3WgzqdhxwOExQOM7Tje4A6rQd1OpORDjOUDjO043uQOs0HdVoOqvMEywd1us9QOcxQ OcxQPsxQPszQju8B6rQe1OlMRj3MUD3M0I7vQeo0H9RpOajOEywf1Ok+Q6b86kmdLirtpOZOem7H qF2ZhqKXNmeVX9q81RNQ3/56wKg95UNP+dRTOvWUDj3tGLWnduipnXqqp57qoacd45Ajz9I7Sc90 cLDKf47Dvh/5yFSgLKYxn+Xp5cs5jiE/H0AH030C0XeJDlGp//plKhJ470DTneaTc3+KvZgAHrzx ler4aKrrneqTz3sKSeQ71fVMdXk01c7dyTbY93z1dqd7x2dCssceP035HqKbRTvd5fgA+l7Abxbu +GjhDgfp/p5PfIpUnkJhs3w/jPA9qDML+PdcxVMM7xQkmkX8YYSbSIaTjH/PhzrFt24Yb1L+MOL3 EMos5fUu0gfQ9wIys5SXR0t5Pkj591yVUyTpFKeYpfxhhO/u9izl37PgTwGWk/s+S/nDCDeZzCcp /55pe4o83DDepPxhxO+e7SzlQsZqlBxg3/OUF1NF02IPE/SZ8nSi3CyTE/B7PuRisDyM9t0XmmV9 ITOfaD/5vyfvajFbHka7CedM/DA+ZkLbifqTb3jDeTdeXqP/Y7Vh04fQ1EO7h6bmNEW7Zy7UjbtH pl4Jr0xdxEMX4dBHuHcSz52Ueyfl0Ek+dJLvnZRzJ8OfPfi4C29O/Dow7HqlH03qHA== ZiXep+AACodpeS2LEA4TEw+TcIKFw8y8FgsPh7mJh3k4wcJhcl6N6IbT9MTDVJxg4TQ/t640THyY oHKfjQMoHybotbhkPkxQOUzGCZYPE/RadC0fJqgcJuMEy4cJejVGlE8TVA6TcYLl0wTdutKFNcVT TK/NoRNdqAfYHDnZ8d1029RPPPUTTh2FQ087xpuCm3oqp57yqad86GnHeNdyM/OuI/eO7Dvxb8ep nX20/Kkcyp/Kr55c6LsfitkDtrqKDTXEmvnf9rG7W3acLxNM8OrOPve1wPTdrwd8gC0nh6yu0L4j xwHduVKcCnq5Rs6+bodvaJb67FsdF6/0Vloj7K08E3FiDmtXLUbX8v3ArRecOfV32TTWXvwzffbU dXr4E1zUKdRkbOP5hy9kaS5tFAWcgHhle1au/TB1Y21APN/KRjiUg3M/e5uN1HUsP6iob9NoXHua TrHMFbB21oU/LLgU6u9UzXJSE5dWuton04/Rnka/tzEiS59LF4eMX/E5Xlfkl7ZG5dlfY1zX0sH6 243EA3N//LhgJt8Jqv4gmB8/Iac4h2BaLzzbqfYxWJeZjw3OA1ob6Nsqb/o8M21v0/V0SPlt2d/b 7FQuw/gkn7X/myhTibccpmEsz1WSXIROYvlJfQXP52cXpPPkKUzlJcbnrtAHs07M29sYsSKt+ryI 9K1ReA7dS3tz7extdmJPs/QJpiuau3B7Y7pKuemOcURD29ipOMeV0gvuIeTWG4uPSqKCda+Zx7a3 0X+P76p62Nugu+zeWk57k43SdSif5Ll0/1A534b0MkAqOMU9X3XaKY6M29oopSK/8rjI+NYktf5T Dm+upb3NRuhhdj7B7N2m+dQGuQvoywRT8okT11Bj4FZoNS4s2BsZlcJGs7pmVu+NrMc3ZnRvc6P2 sOQ+wW3VaDTtzRu3FQ7tla64mGK0x3RrTu0sfVc1nT7PtpjCrD/shu5gI+0NxMbS99VUmPvY2+x0 7mPZTbGh7j69qnfyZoNMV5EaW9ztnQPr72Yb9ZXe3NkQ3duwtcXvXxPmGX6j6sDYB9hgu1zR7cF6 3rLMh5fs9mBmb+BDvQuyWRgVppPM5pV2JyppHszawOhjMbvbRVsDtavekvW9zY3EbRgPMr9u4mt3 FKuo6gHpp/mQmGpLsYkXlPOsGUwERQ0r7vbOuPV3s35ENI/+2t5GLKrXFsj6+07faWYeYG/dBFkv s7Vdic+LyU0wFge3Y/fsCi84Z3lWmArL4hg0b3p/Htbexmhlmb3bQHsDsaHeWDV7k53MfSiPsbRu Im0nOe3W4Ul16HnYbCdJp2t4tjFNdpYKjNpQ3OmBacvvauyIrB5sn62FdvPaell/32g7zMgDTKsH bni7WM4GlpmNYjvJxqPm1WDB2sAsHGHgyeLZ28ym6GkO199vBB7W1gNsqv4vRSUfIseKdA4JWkdi AKmxpR2rKtTn2SBTmBlHgIezsXRrI/0pDrUd5n72Njut+3g+yXMlYVapD7Pm5om0jmQTUmtNOz7x b2+jOGir9Gejdm/DtptiuBb86283Cg+z8wDL7g3p9sJUseXIApFscFH7I87fRBCUs2xbN2rck/mm nYpenIe0NjBbS0T2ZHvtbdR+e2v57G1uZG5DeZCNdxfrz0d79uHNxp7Kjhpz2v+JjXsbxaGSe3QL 9zbS31uraG+z03qargcYfm9pcb3wRG+nIMxiV5sW95zwWJDOkm4diQhNaQqt0KDdaR7X3sbMMBHl k1l2ayOm3Rtram+yk7oP5zHW30GHKxKL8aiwzxxPdkEjQ2ac8yxqNyI3at9pt0febW2yXbVK4nsw 07YWs3fy2kLa22x0HubnAbbgQzfMXVRna9Di5GLs2Xal9uDMir2RIlF2niy2vc0cgH9tXvc2N2IP a28OHc3r+K+/WEL16RO5vGsxM7C1jxyedncynvY2RuIE382AvQ0bEorhWvCvv230Ge0P2u9mvj4s pXQtWxxTrpuXdnjav/c2RuRk1t3M7L3NZIy9NoN7m5XSMYrHaNmHslhwXrN+ZbJVc2p3py1jb6MU ToHQTfFtLeYg5muzuLdZqDT6H6RVb8z9iEZQZNeiR5lgVZC2HlWLzkPeGxl1c7p/0257mzlH/9r8 7W02Um0YE3Ptq2niB0ephX2aQpTDlGLz6oEVIu+MOM4qf04lvbsC5P2x/R+/vJIT/0CRyydS1Vqq bJ88mz4iYKrB/I043V/+Hr69RfxrNSo/o4jkw8L2+aqPdwYDN4Kdus3qTDxN15hVPZwrw3m1fOLd NSHvD+H/+OWY0f5AzctHU80fnuP3cOwtyl8rOPne4npI0cV746GfXtWHyX53RcZ7A+s/fjkn9D9S cfKJNPuHJe0dPHuzWOZc8/GdJfKwhP4HIjef1mqntPpHsv4fCcTOG/CSF31vZcOH05YfFrj3sO1V ss8my88oG/i4cnlIvv8DAZhHbSUzvz9SFPCRiOq0A8/dv7fq4WPJyI9P9XtY9irVZ3vlT7myHpXB /0jM6tPa9CAmH0nzvz8mOm/gc+/vrmP4cDr3s3v3z+HZ69UXJ3vnO4vrYWnfD8SjHub6zeHgj+SF PxLanLftJcP1gfz3JzJPn967fw7v3qL9NZPne9nhh+RkPxCme5gHPDPuI1nbj0R9p0147v4DqemP poI+bbv8HLa9Rflrtsv31sqjMqMfiV++Mm0fyX6+P5Q9b4pz7x9J8X40nfWOwb+ZYT5bBN+R2lfO YyY8/7e//ref/svvf/vTH37707/++tcMpmOa8w9f/vr/wS+Vf/mL3//xv/9fiscObBIUxzZ/9eV6 +k3/7+///csfvyynMs9nMulE5q+r8+k5Y2OuPoVnxGl+3RdRQqwiKOzrCosOC8wReHr9FbBg+OkL UojjU3fPVcsI7JPEzS7d05/sg4SXLehOSfTPKXZDo3eZ8c3jyETT3RrJC9iV+gRg6MJWmgCvrlQZ GGOTlq4GTBmDfUvatk+ovp+lr5C6muGeWguFgcnnKO97VMfK+7mbl9I2Ny/A6F17Oo7ghy+QmP/w m9//4S9/++0Pv/23n/7x9//j6T920J8hMVVLzr96+g//9Q9dMP716c/+4i9+8+3bH1/+5t/+8I9o +qun/7k3/F/6f0RFfPYVAR8aXHBVuBPxWZUqYF+YDuRWdHTOR4FNzPGXk8FF/hAIg6HoGDjG4Uop CuwbmLK8jvdrqremoc+5AJNTpNsAHsic9Fyzykigb38wdFAcw8W0pefgmhBMGSgGXvkSLtBHOn4Q BINkn1OWtqlzR4FOsa4EPHTi+xpR8XN9qerEl0vnOOZahcclORVr14JOnKxwLKCnb190Nks04GmC /077iV6Hi/XLwNqa0BSuq77FRLS9sjI8ZCU0XoI11qKEbiP9/4KL+Coig0u01ZNVeuuQaBeFsa2r AGViMDZ0DahsjK3IeIsL7U8+tIRMOGl1ZIG9Cb/LwTHUuUvl3HkWGtnyGBjj1RgYurMk8wYdehUG 574NPzEQm4D0lRMjKPgSsAGL6s3S25KIJXxpObCOrsbINrR57eaykhWDV8XdbCJaF/ZI7E2uS2Gp jLWra8KKIUYYTwQMMcv8VKwM4UxpXojt61OoSsF7Xb4lyghCSslEN6dQmYC+BRTdZQREviTr/a7t hYPEdX7dPdNtoAx2mbtypj4an7JjoO8brXClb46GYPTvLtulrsaqpnaidN+pITGouhrHxidYa+80 qCRfPFlgak06/lWEHiedAazV5V/dpaZIN6p8FTXcXKVVgi8kxUAMK32L6CP/B2pbujuSVY/DmGNg qXlbZqGPkz+IC6w1CCM6OLqUBC8EhYHhqo6B4XJVgN0kqQyM+RIdhs4K7/YFX170SoGwF9TWoggu HW43EIoh8KLv8LEkX2S40RcB5qsvK+ZXagrsK1QpSPgqolDgI68FAINqqqaMuTH8oZPpLt41Oh98 qmZX+uKEv5ENpA6LoSisxvj24FKLCpY1Gcbu3YGJJR3Awsq1A2sdCKILCtaufDKamuFUY7cDY/X2 ui6pDg5NJ8JdQRGEkJ+ODHigHodCvAQ3KQFibld45I0wmLf0bnz76r1KA4luSqheUSHvy53H1sEh ZREcMhUZGLM33tYswJxVRmPMA4GofPRVhIDUVY8icCUw1r5juKjL9/KiRVM2a7Qv5MpLvQNzSdK2 L6ggwJaiDPWCwmIEeNDRXoVVVsIgXdPOXBZgd0yULK/iQeA0gxVYqi5fYQyAbdZA3wRBdCrMPgal gD4byZyFiSMIikktRFkpcFk1UA5BO6MtlIBFTCvwQIiqpdsW2v8VdIGUVnQArjRVH3mM6tw/xWd4 bh1bKglznwUB7coMLL7qUPM15qCJnV/Mskx1WmMhCYKug4OuMQ9aGUFv61W6XE3a2ZjwCfgKBcm4 5T3b3TSuVjY5fF0KLpPDVnW+xEya5bBMgtx3V3u/mMDgJi0e1fC0ugphYOuzpW5Du4IupIZP9M5b AwO7vaMqvO8MAiQtNLaxb4KgXU7HBSOyAzM+GpxMFbAnnHGWxck+2K0d2QczzrMoBfRNaAaSoDEQ aoeBrVOjdnF0hqCrbz/hFWBSW16FM188xGEaGwLZ9Ktsudl1S0B9llKupMCkbCFPgV/vxpNxtojb nz0iC2Ie5NQUSNaZGNxFEfjnauw2WkcwoTAqBsaiSsdloyB0v99JZzX6Km07B7Wz3gG7Th3cgtO5 lRhBjvC+VcdVXokdGEKLt866rVYvN21XjLVa2yJOKchyVahtZrdkhD4uMQxj5EgAeGAOGdwXZZcu GRLZb19ea3rE+Wr/B1qPo3qVA8rZgvuNqGnf0VpMU1MGDqsnN3ViEMIrVX3fWpXb3YZQZ6xyXOB1 Ag7TdZzYmxC8KTCbcP3Dl1cF8Siyr4h3x5uqrCU1pPoQomtqPouKISYWjRR0cnnCi+vLive0xNoO QJisWYA1sx+D62RTFWC3rvn9CkP2EqgL7Dy3vpgv1tyd857VTkPgiocV8Sldjkv0jdzcEyR6yCPv FldXzdo2sJ/d1d8zPB8AXRdZGUF3s55DZZ/JMYUIWzr+oigBkxNgnxnZkyXE+QOFOAt37h1tyAh5 erP9WQQBGxsE7Ur8aic5k8nYjTaimPsmR6KSE0eWv3NdVVeivTekkmd+/+Ltit0wIdMl2za6v8dR LOc8KrClJ/owMnOvIrhAznGSLarbsPDJCWlXlJl37lbVYu+m5HXJ+30n7WTz+8HsnJZUsNGWR0XT x9tOChw3JAGsfT0EdsQjr1IAL/X1EmK5kYSidJ/ZJcFKgUtCUC4NzAIsPnOuukl2BF4EKGd1ejsL pi0C8b1LwEmMRSzYyP6tV6nCGmrsNCjwm+wxnh1LgEPWLb2yVKEz2Xhg6UQnXZGa0T3u4uhpB0ex CTpWx64aEDinFFR2QTuwIuzwTfcNT25wBzeXdJMLwbNoZK+bpG9RQhlkfo1NukowQw== /dKMcwGkhkBrdyoE6HKRlg1RODVUoiFoEpzrg62xCAEplSxAd6nAkkSbpWSEdYFSo4rsAF4cops6 MJeg0Rz2p8Q7MMLKpT5L7bqW11EsUX2W/qjRjNB0BIiDNom8dK3PCKJGfkFVuNSTkh0OzCpFjU3b zzCwwEZJB3LNJQHF+sGayBo68kFUwQVJ5xA48MIbY6BoV+KLODLetGtjo0sR5OwEbBLXEThiLGJj 6sx5s+oqz7wiiE1ZY/z2OLCh4bdoIbUqLmJji/3bl1fbvoL1FQqO1B7HdeQBlKMXwiyA3zoCjWo1 cX77n0QhAWln/EECgOqgdFul8oZKQLbjq61PAG0IEVg1BHlJZAKhJV53oFGcqd42iCQO27rg5n3Z /hPfF8ptL1m46TL7HpqNrZIO1BRCB9ZUDIGa3NV0H1aQBfw0DEvccmbDqU2Q6E4XdRM1fdVYCfGm hpivDNY56erCElcmkkHFI5NpBDuCRiVK6Jz9O2kbLjVs1FSYYr74nnx9i98jfFYt0IbhDHYVNkPj CMlVXpaGwOy1WmRyb5GVf3hY1Aa6LhaxZkfWEootODFc/eVU20VJMBZLliGMENULn+I2RXecydlL 4JVOsSnWvgyS+stkNarDPSIssTndssiukXk3d3cbwrfHsOdvOc39Vz/985Lk/tm57yf34ex3YROk NEmH+Mq2j0G/rlCEiH0tkuUuR4i9aUnv733ti/LaofPs4phy5EzMi4ApKULgS6LzAWfH2QOIti4D diYnwBE19VjDSfFKVAvAi/O5EdGdLMAcixjVtRt+hoCsBgJrCrEDxXrpwJajAkPhrSBOIRk/Qj0d L5b4V8FLdhOBScUrsyvyrWzaN47VeCi1pqTJTj2mBXl62AfaHQVD2DwPfWdRvC3o6GhLUio6RQKW tH+HpchuU0csoQJwp11KV1EjBuDMy6obimJvAFjZP/IcXBesEsFAqYAs4AA7LSrU+EjpGR5t4nhX uFiBiiDkPN4vvMtECkIJ7NJ5oDK4o3whJo0fuvkZWXF7JNhE7vpu75vMDu0zXAfi2ahi1oAfBma7 ETIim2UHUqyLgN2HEhjFNXloTY3RDk7FRERH7NnvZwEpErD3al2h5aUFBmjrL1sRHC0IAfeJKB84 L9Zhl+PUQOQwkBFg3EkXe7SEtMnay8ErUJ26yAvuB+FXllKRLvueYxgBQflUhCodFnblrOs0a/w7 oOy0SmdquAaKj6n7K3UbkITkTRLqkITSnI4W+VUG0kpmoHhlABavwKpRN4Cbk/kiG+KrjOwKVcCW 1YKrrHPTF1PQ4cZLJjcENa8geZKi8WzgfdXuRMK6CybeFj6nI4LQXRkn6q7LYq5aZVRdNpbLugmt qXC4zCOAI9Tc00m+Ve5vbFSFq9tc1MgAL76mq0zcmtdX5LnthHUA94n8UeIjKriN9+oXAQfhQ7Ph 1WJZy2aRXQBDTZNNzX536gxomsPv/OCZALhavl+SJDUbDV0je9YsvWVNHCSqrA7Vn7+cmWkS7KtS ssFtE29SHdiXQRGzXK1XNPVRbO3sktKV2ZDk8SZOh9ZixQnVMuNomTTYR5l9xVtrywpusvNUFK4G YQPyU181KOUv8Ry7La29FVfFRaSXjtPD8+Z85MpSMWE5iQ2o82bc18Lxoji5DBRa0ZYa8+zOfZWA T9col6aQG8rlBFgNgUawdgJUoGBbB629cCrr1Yw/eOtYgsqfBMeXwPHieGqt/Cd7sJJJv+PVDhNi FrwDSl9JoxgIxBVhb5qjc5FjCAAyUg3ZqfC2kmVxk1n81cAhT2AFcohuB/oJaHidV7yeMzYk6FV0 lmqBZVAy0JZ1V08yUEC4wCkNFQYgTzcBGV9DoWCbY0g/KAJOfxOYnWcAU8k3BKNz5Tx9bdmzaUph GWY/4klk0ofGie6vAhZTITSr2+pAqXAMoiYYSOMmIMXBfhAEEsEAmPfYCvZqX8Z9K0gB0stUkuNo JRNQTSV5NTo7WESeURSaValVZiCZAQQsiN3/oAhylIJVL1VBg7BIJag6sBbZdrkmuxkDy1xlcnHN sHCxFUGgPj2AQRHEIa+OPXnmOMb49Tw/X1l5uMC1VrzXt8QTR+DoxGChON1XAzdtzTYqo3AKLORD H/D+MDq8shhtzeXv9UfJUN6rPK1UxJcljgsMsL9OaIcOGpVifbeMpoO6Fldl3JIqm84ejcyJ4XRS Nq9rc6haLzo6S4QYfcGMYxKkxuBO19iFUy6iTGm7fXlrU7HFjGA/LC3bw5rltty0gXhR6IhRPx27 UxWTOB9DS5+y8qpnZM+juJhohKTMR1yb9xoKzSeNQIfasukZKsXnCLSssQ6UVBjifaUc1IyQdFWJ U4tpD23G/ifVnUTNCogrhQho1XpiUMRVKB1cKi+uhhprYhXCrelSFScloAi2mr2OO2DKJekKiiUK Al6yyApIyq9JTS5zr2mpA/BKYsFbVRUpZNW8loLqfPYcfg9c1qMUpJCkbZP8JBImTRMmWmrVgTTx AMq7jV0ERikFlq3pQkjBHIAOpJlhnmjQpjXerSnYkJBLkm58lKSK1ky2alRyWILf79ASFSpx6wYr jWP/KEMtSnuWXNMcVGhYM5x/ES/qq4CzSF80wwFtfZFxaUFDk/wxj0tTCq1Mk63LvpmBC6DsRgDK UC8rwcfrbJfh879wwL8KONQqoZno2DlFDuuKTeWKzUjMf9bRjj0OYOOMV1ktskziEPasuwOSCOhS XxffVNMIDLxkPw9W2YjVwpBk9bEdRjsV9yQnLADV+tTwTMfFfi3ZtiLsKyoBwZIkos8ZbW8RqXQD Q3XskDQEV5LMiiQRCcgbLLCaCAXWJMw/x75IQ2SkCVLnOHPRgT43IYBOETACr05dkkjArykHLL6T ZSYB03URuaJH1f4rtmuR3q6+mDmt1YG1XFLlXIbt2jiUAaAVr9S+Nq+9Irpa/Q2ANet+RLmosZso Aqp8IrBmHioqfjUFZoZDQ/5JUk2jjLQiUKT1yLQXMzDmJruUCfFlIbQ21dI3SSgyBWJqN8/VZ5xa lGgKpICtQmjBNk1u38A0k+pEtjS9Cyc+F5HXrjy0HZ9kkU3IedlDikgRFE0RmCYGKbtfdQfCHsfv 4yiCZjYlk9BxdltadhxTLYnNU9nYlIH3DfOr7KR+qnanyqYXBTdN46nn1zzn6ViQGgcBASxa2J6L VmADnHxT+eLcBYCOZozkS2EbAbrHR84f8vCylsy2aBuFsyIYAhZtKyWna0vIh7LS56xgEUaw/SpO EXAh6+tzMbVNSYXBi+BK2cJxCMPwSzx1VGnfW6vhp9G1aiEk2HhSzF/tNACswarJLRfDMPxCsIRR k5VaORpU50QYuspOskC+XMkQaES28vIRoAR/4fEaWdsQxtg0MN14EDo2yvyyakCEQJXTMGs15FVH skXizq8YpQIuWiUiJdTUVFOlpP+PdInRf13mXJfhHgKs0cfKUfev2pp3FApdQFAIFrxmFWnnO2BV uS4aGSJ7dLJd6eQcg4eL21KWxTHZf2q+4SOLedpT7cwG1Qjqtih+f7rGtpi4zFi2hKBrQI70pIut HVM9VXeKKmHFBg9LixraJO6nBRdsu5aKbAZKfIvKKnRb9c5OnVhhStcQbQxMzkE1nNywjUIS1K/r IqnhnYI3Dc67E8HTGmJgbRrRuTQdD6gFf65YVW+lbHuaugqeI+UMtDJ5GAFsWZHoFt1oJIQ1RY9g mnD2E0DoXWNh1TCnVssSu9TLM48hsEpiJ88iOh3cqlGrZkzi8m1eEVKFjF2l6cxSbNU2kKq63xRk N85CsyFk3ZZyUivkCi6YeJKaoQnXtCxsXgvKGmOKlUJdMxNhympxjVlHyAF76YzCg7rCRsmPVkjd F57sgTBPbPnS0ntRcPYSraW1KUbHZcDAwwDQq05Iww1vk+KdEGgUZkGwUQBl8ed/JCxiTLJBEjUb 1cGpXFKZpWd7AHRVPDstVqqwUVPbTZIaNZ4Et1aWVQdmThfA3auXRh+l3J5MomsgaFEdTjqap9HH wAuLTI0qGCABAsNG+GuKA6gS8lNyFZFvrkynsjvhGmxfrySIe4hD8Bw/Q7lX1XMXHexKDDreGmRg qagSylIw34E+6k5O8XgdmKSNoMe6YSidebNMS4hKgcYW+gJQWxF5gqJrRQuz6xyGIKEXFogv6aca KERIgjL8GoGTovW/8K+97EgUJRG/DcGnoLmKyiY3ME85kKysDVdUv6Fook5NXt4uL469oO2wBChc RsDUSpn24KrW5ZXVQFD73vNbYjVcal0709BkduiA9agMTBQupZ/iEXBm5BTjRoEoEtjX+VIzQIp9 QFYwoHppfc4R+tS1KtYFiYJTy2nMg8YfesvL2E0bh1EgdYJ+RkB30HDb4WVJDgfAMekAV3EfpbyL fKQiIzBJanzAhhs2TfITXRoXkbPr5OU18bOvYV2pP4idNY05kJMLCFYFN2zHKk61RtSGyQWgxRog RhITCKbhkd2qXlx4PfAMdWCOrsRfGSyBb6IgaR7r4mOfQCBnbUbiA75+0I0aGkkYaGYqTuQzqNtM QfRhKBp9oa3sB1GoTioqsd9nCSsQWLUJXcMoKKoCk4sK3BQ1lLh7+kshTYLT+BFrXrW4Bk1EQLTT 5nWZaPk/Csez24Xhhpd2jr/9cnG/AfG7KhkeEjY9Rarl5t7K1UPmI20MFOUPoJwMRVpBdQbA4hMM CgFsXvLK4t/dCRA7ODc70jjHcDs4VCeIo8WSc+N9Y7QWFHK6a+idO17tMKrchzadZEeVP1tMQcII XwWcOHADsJfTPVFLS0JjpXvEq+n0ZjFtz7bYi4LFu/EcH/6qYHYWAZYdKjQrz0QJLG/oAOagLHWq RO/diX2DwJGUVzjYt3o+MnFMncASsU4Rp9Uiw4ooAQAlHehYLrRWuEmBibM0BSHIeiuKFE3eCRhT IrUYQSqtdEpk8wJYli0BNf9lp5WiplCDVLf+oFPNJg/h5bEByD4zgFI5cpq8I2HCS5zz8EF+oFTH i4INTRMDpwNxCuFpydgBmDU5N4oOgUDuWrk0+U3ApMNohRfZnYIfjLTomsgVVTgoaRom85wMYKDW DXveDwWYbDl5las7XuVF311SkSxf1vTcVVA/xrUA8IGTePrF9s142Rm2jqIJ7ovHesSrI/QaYydB zKIycCKC45O4OADTJkCONQEoBYFFDGDJo3uZbeBtCq4ciANMagcXpBsButSjZUET323yImBN5ie7 8gRAFgsCiuqMzKoB/EEReNaoif2Gr+fuvhodWkMhOUmlQwuUo9oWIbANyUlJyRcFpFT4uo0wilHQ NARNamotGzpIcXv/1r8wCD5bvUSIgPhFocKfYIfE0qj/C6Nw+1LvD4VUearRTllPPWnAC0CrmCrC 9RsBOnNZT38TrjI2yBGWtPI9eCxJ2lqRaTdQ+OwZHW6wKsbMNclL0CFkPXWRLts/7g== FAzSNsx6aYAaapdltQAMdnZFSotwowGXryUpj/1BEUSNh1DwULEqFRKQOQ2NZ9PrkRQ6dhDEYwY4 XXoaQev7vR2TxZES2RG8rfsOLG6c3WiXxTlEYxKCrEluuTnkToEyLVg5ZWTr+EXASeqDR8bpXKMZ 2ApgSYuaGsbdZkwFbbpWDqmrNozKOG9Zaz+dYg7e6t28qToqHi2CNTaFUQiAYN7OIKNOlAUKajjZ COqlbTWaEEa4yXOuVEeg9Qpy96hQJS1VL+AuriqWlrMdET1JtT2SJeyihVlJZjH5gUCsQMdXhGn3 FH5kI6BeqkT0qIzjEIFot5TVtvR56ELP+TmMVQs3g6bYaSOTu0QCkg8yAzm6MYUaXg98aP6rajdO vJKNpTratSzVt5ekkwOCI0Ekg8qYFG2W8tfAZTyK1vkgqsnmO1geKsAO0ALcs9ItYvqNenL0lbTI tLWiEruJ/NiVqOaUwkoUtdbdIHiNYVHpuG4qkteg1qKxIp/+ZaBKXbTDwZUrAX44dzcZCpcmpeg+ ohcFN41A0br/qmAJXTheXgzUIJazcO0d7xh4y3q52jhbQuA4g3Xg43C+BowIGPIduOJVyyRz0QFT Em2EmTMVQrWcCs4aOZ7SjgAWjWVZSpmalnhvOoAz0oUApQwXjgQ1LOGqvhi4iondJC1AwFY2Kxa+ tpm2iGYoabS/i23KGUIAr6AGq4jnnYKZaRpnm+zHGVwc5xbKKCF0VodyGvQNwdRWqguA9enYv7ol yU7KtYkwgJvuThqQyonFkYCUP/k7aVtK0HSXKJClrZwhuvelRBTbWyrvWC9n8FcFS+l4teNbAIbc dPFy7ATApDnCGvT07wEtb/VO42VUC1jG5Tp6/WEHPzEkyVnzixnBwByDvm31nGgrV5JcluCjkiur OpQ0y737SXiWBWOyw/WQ0B0SrelAqfFWPSNAPpBCwWMvV4VQ26GTxFsapapunMO+r1ieN6+xIbpb qgpl2fNJAQbLlWh5HKfItgoBtHOH11XFDQPY7oXScldCoIfdposPKO7BQGP6nTCZYhyHznr2kCye FwXbFRIWcunz4eweJwmJAigbWGErhDu8LLtTONzMwFHop1OP89ROb4EkZaIIvN3KqOYg3ZqiF2+a b48MrF5VSjnGH2QIA+90olyKSWIeZ9oRDLZbPs1kAA+c3sYi2WU09XYloRwfy87GmrkkS3k+3rdI hhUIR6nv45ZSE6bXRSoCMra4rTnThFfvqaG7Ib++NsUClsLdbNm/PI4N0UVyCrMrM8ZZJMyvXeyo QR2QIOZYMTV9F6UfTMY2EVEZC1YLmiTZk0exTrGyOwBb0NO4GpsAVNJxZQSFnBZ9xXE93ElGWcGN K6oqF5ToOVQ9WVIteZDKdCBXnTpcjxTVbqLp/CYIvMxc5ZCmIEjBEDQ73bpSoKUU8CHrNGatttVy 5PKs9SBJw+xR0i4CbMqckU+/gzVvV1JVVmoWKFlBV5lPrFx269woFLhRK+oFt6/IoaDEtQIvCpaI V7JqUYidHDJIVi1Kd8Vc2tLqcEiWo1yZohYIyX2RgElrnBTnq0dlcVJlnyFwupA1+jCRldUluo9A pfoyjyBzeu9FwIUrNOhuX6cXO2nYB7ZjC2/prUvDiWhbgl4XpSGQcZ/znYIfjOtqrGQOzyjXJUkx 3f6GO28uvZROL/uh+2X12rA4cz14XYda/RTzdIWe3vpA2jXoRXNJ08Y0+kvbOrkXN/PFedxW5Pc+ hDG2iwsy0Br2xYuB9UYvJzsDUaGg8h3CNB5exh2vK85kCNb+p3T9bXHYWR+uuNXN1I7qVL02j9xX A4sGzGbid6AeNM2jECxaxCRPzjbl5rNuGxK9RAr7diMxTrplXQQuTUl0KUfS1flV8PJl+/OSQRrd 7vnWO8WR2bKLioO7RpatRd2htFLv/2Xt3VZtW5IksS/If8gXgdSwkxhxj8fuLT1ILCEhqKaLRoji VJUusPOh1U2jv9d0dzPzWGuunSUJUSR1jp+xYsYYI0aEX8zNrIg1aBx1sXKH7iq7Uj7BbtE+vEU0 aMZ6TYu1Tysak70pKU0NIlFJvac6ftMGseKUxTN86L64a8snQ+a8qSSXPwL6SkLDdsJ83SeoCS8g MgwODB/t6g/dPgDAbNksXssu79/t6/2Cm/iijTujo7Dj9cajIT5ux4fyL1ZA211yhxEQZGBC8GOd INkt8O027qEO9MdmDbiy09PwQKCW3VVQhnK/s9cAmwAs+i/W+rSZnGS4sAFl2QGYE7sS3HTPf7HL CzAcuxAr7mEyzXO+g/1NCXpN33YXFW5LPteHtc4LJGW/1AmUztbiXQTszyzuvjlLmKXcRbvNCW+f A5DbK5p8fniNBce1Mxg1DtrXJPuOMGV2rTLGHoKyGYuNEOWeApsbSiRnwojo0nPrPdvXHnSMPCFS EUZCiC6w0SPwlkUsU39f1OtXCeV4yEngiZBCeiz4xgNNaHwwDfN6VK2wyXYiox6CSQq3jc94mELi 2KtjaJc4tIGyiWmtc7XMpNO+xFbgWM7oBPBrJxCPY2oGRbju7KSxa+tTP63OdS6wEvO/Zoyapt2r CITMHGQWRGKyBPcAofAo9rIkmuCZpAv+LrMWZkRJxE4zY4fjyqnFY+uyHwNKxLoQG40z+cbV+bCO 4Oklup2xQNVey/3M7uyQhTs7Ya24GNkoM6MXwK4NMitnmHq6HiM/8qYQZ60oQ8QAALSaEZvEIx6m V9y/9Mi9UssBwLVrgFYUndYiW5DdLiApS0BkG/Uh/ud17XmIYWcq3BgEoznc1gd8krWErX8CdskB nGgpXg5C87WuZOGM/scY4M+ZDuGfX4vDQrEPJETAtzBARBDGsfmJ8cD+Lp0G89D6Qoi3sq3smusU SvC5oKdrBnXhvoGfawTffawY8NcuCTHY42Y/7cs6tXcwYbCMm6/hDghvW4PEwL5LaW30i4CNWBf7 LdXGWP5cSZd3d1+szpwHN6q4lgxuTyAbYAQMDcg/FqjJIQcSug+YHfkZ5sPK/llcRuxKWY+60AC+ jWTXE61uYQZxwMoj9HE1i/ihIqRlcnwaYKDyedMjNW0gPJhHrJmrhBcaHw291FUiZs/H9QEzsja+ I0UmcZ4rX8ffmkf11OdOlR1mIXz/pSNjZiGu+YXNrXaQEkiPMLIVrViGbmlcYgcTbTwTdnOUZF2F 2Qqv/iqfbwVM4sPJPD0Pn4KlisGbOAXy81oKY5S5VYnfwaUWRmZ0DxuR3Yh8B+QSOADd/a2N0oyP ch1dA2Q56EpIZW/GjrON+edWVSdCinRaqEOOaC8N/Qj6yaiJmFvNpTDn3aRCMuWlwGIHs+KP7zLV TGAn6Qf1JfxuCx4tW97nJtrjk0M2l9iQTvwVb2wu5ew1r1V43hVUXSd427a6BDjsALtOnkw2aHnI Z8gVvsRte6IHjU/mEUPJhKNsAzx0XwfZdSc55NxrWPp7pJPtG0Gb2ZyMQczIJTOpWONew8oH2+lA +5vhc0EDke1pYimYd3GLsJmJPOunU8wKH3KWkwLTpgvIbPkLysxWN4nGEierjPDMnkuX9slmXWqO q9OBbOdGcizaFAI33is3HOB1AyRfZHZ2qAx6dLobYypGRePkHxiAkMyiyqERDCdXCLxaY3ku2qc6 2YGmlZHpfLk//8Pzl6BJ9EO/MafkSMF4sOpkvYhMLWu68I0aF2snCn+S+f9E9WOr6+cHyNW73k1J ftP0yIQO3AzIr9jAGF4XWVtz9xn3vsp6pjP+6cNBXd/Y/NWz8zTRi1o6hAEid2szNgYXA/zyUy22 doYw6DH5hdF5DrGpy2UdNlctM0ej3y2yKOCPu48gITXW8y2WWs/jf8AMZqyRLZrWXYzDtAg04Y3A AgGphcSujYIqUDkxbIuOsvBhF917A0jLUQLxmXftc1MhCZe3QFR8T0Vtuh4usUNOS6GoSF+Sh/Nh w5uHlNwqGNjAie6s4AEY79taeNZkd8HHK8mMKrq8I84yW6zq5mN/w3f4H9yuOkzpJdi1CMeKqmwW xSURtI4RmwEclVQ58mg+SaNpYwfmufiVvAlRRwOQ4VYAEEvVpNbbEqzyRKo7BrCsKl8CMz5esuDj Yj7QjJDgOhcPhGdNp3aagYSH5494YrTN0M2Sc8pOeBxIMwMMNrxZFu7wi6rQQLD0ZOUO1pTicsZ2 ds6Siszrnk1hS2OOdzf2zbrHo6fwsGTrjX6Y62BYzX61fn/8W3Ct7gpkBElQgW4JQf/cz5ZIv+fy tDInPlDDCyP7XzJqMML3OBsstfDQZzd2dzRePipN9TuUeJCh7gSlMkCKv3/tCHpcxM31Fqf9vdU5 /yP7sB69glckgVPoCdx+GNmGXsVMbGCmqqfSJVDYBHZ8FOA4+JLOgONjMKlAjPHM5wANLAlPgLTC mG2ArAkbTm4qDlgUEatUwrDNEx1TXQyKdO3/HteidcGDFrDX3t89e6Cc0UrM243c471EKB5fo6Qq ocY4Et12/T3WECebS4voNuNZmup85XIpOkQfdmzAvBMVVJAV7uVKxLCtqBciBP3zwlu4016ZsjFe qMoTj6g/x5hvNrOhcbMdNQuVfAvGYTUV4x0CkE/wiMY2aeovNJfOcalntS9Cb2lEbe0b5cpptiRc KWIJtQGEYiXxtdFotcN9S4nelk1QCl7t77tybIhy33+JE1hJW7AZ3Zg8WucxzD5V1zZDChhDsvh+ Aj8XQy4RVh4pNoYIGzG8xIBbAEBgr/O4cgBG+UXSAK6hRn/hGpXOSbk6y0xDbclDwzdn2nCTyTEB +yaboke5Ujh+LY/7AaT3vJ4URZzaUmtaobx9XJv+CqErVwvSUf3XjI+UCzfzg02UR3y0nKz8xkJp OZLwnhCf5d9PsVwBeOWwa56pwq4Ovhf/IcLMDUhddNhfenFd+Unwxfweck2uarAf/HA0IWtsmQ0w 5OmkY3OBTH+L2eyD6LELp5o+H0leOymbPO5PSG1Hieu18CFbYVJtygZQscqwrxFpOMWBBOh6CEFH KQphu2GtoWdq1BAwoYriVbedkOQt1nOvQeCxpF7VEvKSZfl19X3aDUTLoA0gv9s07ESSnnrNmUyg 4pUh3Av5LtRfNbhc/Ur91ojdJx7B5hogKGvHk8AvKUXiieufmhSZ34V1HvKOl9IDtjQ3a8i7j5wA gco73OcPLO4UsWRztW0agwybJCw0jcXnEf/ok/sDWA/6TqjrjlMojOCN3eK9XkFGxU3z2dRoo3JI W2oaE5unGw+hbVkyausCinUJSrZDZUJIkLpK5ULhs8tlNrPEEdl2eLjn3c91q5qKrJ8OjcPHIhT/ Eb8DCMNwRCYXSyHDxcu8hIcmONmYD4FauUREC6kk7ErtT9bnNLm0qC9mHVGLmJ4J7jbzB9A+JqYA jLuZFGPSwo7+zq9bVMmvWzgsde/rlCfF+PLUEY/zFG5jUcTJMon7OiA/t6e12vuKPQ== aoVYQT3F45TsxVnDbw5cYlmc+/FStX9e2g62YDa1oSYr6L7mY/Mekl+xs6cSsv1yMjuMLVi9+ry/ 8HlhNNmGbsZJZGB7tgaYgl0kr3NuEVMuq+8RxClRT8D2Y7wGdD1zP/sdQl1IJfbS25Yc/AkO0Vgy QptpXP2MvqcHjGWIz8k2JMzWGrIrT8AcdYkY6NroRqSUwghysz4UEv6+k40naw/fRAcY8Fo9d+VO ZoiXkSAu64fAnt6vnu/rvARzN8dNMlB9010nWxfy87uWtTCDS4bjYrYg+ujSZzcjGiz7pWbUxJrh pOaT50Vb6v8AF44928DiWyRVaz5yNgy1bPgZWnhV1QYbAPqGNXZIeS2DTd4kfjNjZcsdu+saUGbx U+1ym5hTbwIM2dIXDT4Z7WwAnG23FIA3hJOavq0nT6yJ1djkpS95z42U0PHxHtxtpsTN88MmmKSU TYkAXkvH70v3efwY/YOqTIKdOJEeteZQ6tZuxYXP/aFv9eHccQazXwDHxw5I3dsnnClujG0W9ll3 xTRskwYrbxhTOOESVv5tE/kD/7kqb9JSVqKK1bRtki30oGnhsB0bTQ1lixy24NkSj2hGbDVVWSL7 rUX6apAg4DFW9oRJsXlfk2V4bIGNXmPibdpiv0qvGa7sWFT7E4uBldcfLq51RXZJC8Byq73GJj0F tH7lHRhp63n093RdQFDKJ9M6l7Io+498l3Y7FKSUb1ldYdt6fCFAntm5W9hopu/uCB/WrpS6hf2R 6PJhdRp3Njs630pc+Oj3UyrK+64rm8+QErMxCz9xgJvMxUC0Ui/YgJ/8fImst3gDx2BfISVajiph z0U721IEJPvCG3gi3ciksXlUAECWC+9jN/awM7GcyltAie5qLPRcCLves+TUVbH2fVIDoO3J25uR Y3l0ardLRMC7xlMxhaXDLg5EW12NuRNbq4tCMf5F08y2jxohUhjBfuLSL5jaI8HMGhgCpqAAiXDm +M10F9KALloC0a8WalBhVLNCV1khm1H9ieizAf+sGw87SWfm63jCJx+md1p2Tgq5dzM27p5JUO5P gGQXSjtnAeNK+j5/4Uadm7pvIg9eOTts+qOY6ZELS7r9WAdyUUgUEL+PIL0/IhB/ru+DskCgo5cT 3jhVomK64x1wKhDa1LNt4Ym3oiQiGneTI8olOkiRoNfaiBvzZtqhF+hBfPwWk4XJXv5IvdlfSwE7 QrYI9fSxioAqtkobX2FXHprKEE/k/5izJpD8URa1K8+TQBlzDUHGWO7iR5ZkH+ZpvLFp8gRFh68H dRtPtSne6BkuPIGGx7VwIop4hZ2UsYpjgtRfzt/W8Fyk+XYfXtyOLY0iopNkYaQoW3wa6jH2pjye lZ6GMKMlUfm9HenLzcGTNsmJXIWEewY5FD1Nyx1doma/IUp4FF01CYd4Apr7AEG8ntYu59r8OUAq MPl++4F6Gdi4vSea8FrnAWOzeooiWSVOEgTUx8yu7KpM5lCZ4JPfZnTLg14PVQVHk/tcxdRjzFSQ 6Kmkjse48FMfURxdBcZHjHMkdsImc7JCSY6UxNONbM1/1CVjRnSUgcaFz5Ede1WxryNd+Tks1U1/ 0zqJHl0/DlEBr/IGrxJ6FTdGiTWnEmnwx3jNo0uhE6xLRSATp8xm4+5RxGXPEFmBotZW4xeDlni5 qR9SKLiqkX+o3OObK5qgsHzw6U+tgi0mgZETeIDQQCGR5W8yVT2BAJJZHmnhmunRfBAj83tqcolL AONYg2/4IErUx8JYRJREX92L+OP5uisZ95hYY/xc4MSYLICTpOL+Ic0Baa3t5yadLx5NrhRMwqdU vRpdDJOV3EVhpqhHDYwDzUA59JoF70FdCa+BoWafKQA7qLmcBjmKekoMD2kcMOr54ZAMptmeJO43 6+Ch6UiDD5hJvlnl+Ix5uZUVs5rC++Apclh26ttJNAgKQcY+eX6G4Lw+K30lS90nj0B5I5mUr51m K0C7y7dmBrnqo0YrG2BRx8dDFxgRC5aAzv2NGazXj6kZn5vlVOBZYoJ8BAOkP1mSHJYVqmjbZ5Q8 UtP8Ao6ZbjDoHJIDfExlQJIo215W33oEbWgArrhHOSP7rUUvraNr7zuCMFzbaK5ahRXkIEVwdfv7 6MXuYL/R2mzclBwihpUheR1/c/Fc9+RjyV4fE/jUVldVDhz7euB0k+zVRA63qcZkqqGb9GRy0/zP 2f3u2QGOSo3CEtkporb46ZeYL69mOFjk641NUeaeCtZjyy0tsetxFlW7O+nftj6wpHX2lcxX7jsL /56o0yeFmo88ikd0jy8jXehy90YX1V7AeM37PdpEK1o9DLpW6PIz8TaOTrLnKpXNcq0ayfW4+eF8 SwJXixSssq3Cm40Pv1MSJzyElNhOMa7m6MyuXN3cPLmqQNBmLLxyK5c0remJhDvsbZlVXvMjYp+Z AK3ncmrmo8ArKfGn2o7c61Xre8lYW/j06Z8yl0LlIwC/sC8FgRAZ/+ZvzzkHV+dDVoLWGoxj84mw tbxciTB7JpuLU7L1ld0+7cLyPhRzsZ1LQdtUu5DVMLDi5iNIdfkL5CLsJhf9qarsgT0nwJyL4vxZ SCPRi+S6Jjiu4w7EWTX9ivvzwmIrvC3dQVEbfrnhnilZUSJDEmu7dY5KhtFhzS8iCUyIcbInACDA lV0PP3DoHNh3pH3uulukxRuUxfUdFcqTEdhpT6aSNwZH6CwsFXohjH6TmfXCvAz0gQdeK2kYSdlm KzvQeO0QYWffRaxATxExLW5fBrqCS3YH1KCbgTsGZH5T/etO98wuqewq3292Crx5SkAA36O8ejpY c9z+HLxtQ/0+XSE9OBK6eqjN7acyqpFODnqq/tGQcpTpYwKfUbuIv+dH3AjjtXsVSGM2FTcfhZjT JZK0keFTbHLZnhs53dj2djkns0lRGFpyvLJenxf/ngmsEof4B8xQTrFFqwZMny5PCuZIZ7/E5Mgh YzBrydllGGJvDEz3+YUYQevYOoQ3OT7ZA1siTvqpx+3+TYO65cfn5+g8ow8fGSENRQBhewydQn+T abDZLu5RxzjrMaQroOjEF6MfKp60bZwwshBNYLTfMZ0O0nRfPE72xJAGKXG2/AgQfmHGIwGvU/RO n1wch+EzRUfQlPVjxEFjt4Y2f2tF6PI5xLZv7RDii2P3nrUdLB402hYn+7P8UGJSdU71YzxC7010 rnXoE+E6ndXJv2jTUoZrsesCOhC2bI+MjKdBFqM/HyzQeCjHrodMJxJWOjfR8gw8wwj+4P5cBV5v tWFwRvfVOlIyxwhHdy516tQLGWvPdTOzMpWHmVMJMcRLNJMaLuNcewso9j9BWBfGPFsW8T3eTaFQ m098SF+yBiM9rlR06FAhvsXn8H55Ek/qb3luE0S8xo/TFPBpr50Egfq1he8MbZWOXV3sv6FT3qIx ic8L3E1eoDls4GFw1tSL6w+c6bTMadorhz8KXsV4YyQzrNJueqeujgGOBH5rNJPBuFW6QiLKjJ1s ptdSPsT6WeqNz+uwQcKShyRwK8pK1FjWHIBSNlXVxnkkXFwVyX1Hnh3jEm8BnQI26u3F08Xr9GH+ hjA4zAAfe/S+MGH0TVyklqtcWT4p4a3nKp2rwVZkyD35sY3ltysFqg1l1Ys/ku9h1SsdpxbGHOC5 0Gors2wPs3ROHTy/bAjf0QTHZJmqyMjGeijzgCXb3SPa75Jx46rh3cVWjSrsuhVgJ1Leq6nq7OVB /H0jet18t4vSONKUtqcf2tC3F/VgTR8U7Cxl8rXOUJ/2Y3SSShqSEvZTfK/fMFeHuaSf17mQtyII ikxbE2mn8/ppcXoPno5h/H3l0cy3WuiMsbrIP18QpiraTNbDRiXPh06+qnzXCXKwcQeJTdmFm9it wFKHjVWvcrFuWPvnZD52Mry3vWQxrlL8d0SMWlQwN+NikiMlNYwwXxVUNANZq+rJRFHhrlVAh1ZC 7IF//ygbIQqiI2BiuXciMCN8eq7WgConkc3zdlQu+lHuWPIIbkqwsoXD+zT5vK7uT3S32I+ho972 +CJPLh39zdp8A5RWUgKFnwHLObaIIsvSknnDPsM4Z5xyn/lrWwc9mOh3wLXYjY1d9mUukPtZIKCN m+Cm01UUBbl0jCsVO8ZhYeRhbeHOZPM5UnP8kjlAW6TIh1Lt6oSv2deFRKq1xEf/KQUG+Pc7tlj3 USub4lkdLwJNvYzYtT6FfEsanBbGoVa3BjmuHFoBBgFTCRp4WNJ1dwJRfMtb1N1rEpRi76aRQMBP zRTvjr+XdlRPAhRjNgiSYcN7kANhs8Jks1KD4MuMQhsBsMlJO7g81pQVh7g/Rq6DwyPF9qNDzvZ1 qAXDrF8Ys3CDfiDn9GDmxTE4P/H3j3TJz829kSVbQi3s5jaVyZn6XercJrvrTw1wtNVuPh2ey1ll +o6XP8xomfNrGUfZkwSpU7kQ68tx2kwGks1hMSdgIR6VEqwFVCkQyczk22QiCQNAEqNIYXQZHpRp 7SnX3gY4jBHF5KLSQgPwPxbpefh+p9prbUEffWZIOS1rG+bT3eRdGAQGUwGCA0Bg6n7kI/aze8P+ jjqX85pfH4EE1q542GYVJBO9XGqma0hP7gkqqBigKVfgxXEYUfat16Fl/B2TbOhEytqDTYZy+hdL 6IF6lZPN/GTtak6tDpYcH9U3VsLOq9L4a6vC/FwNoPZJnsLCM7Rq/dN5iPtB83V+vL1e9VX7ehud V8968eutyEwkuMZokQrrm8zcOutMV2KDZIMrj85HJdqV7vajPKNzAi1EpAnGNPNWTQ2IJjfynVWE Ec4MxZ9K5oZd2IXfs//SjJVJeGxAO1kqnisUWxlxPN5nGLYN+NvDngizodXk+Uu6WZLwzRyzjZi1 bCB2jK6q8auV82m0VDqFTvLnFRHlpZClkUUdeURUHoOeTQwr+NquV/nQT0Jxnj2UkBDXXjax1JRn bZRoZ/r/JwYYqIfXeBs/QsFpUQLAcy1xJeOw51LzMUq6h2uLup1GqldVl1icQAdq687m7XZ5pSTu bJ8qgg9/n7QTN2Jzt6v82FD1duksRiCHynhNiQr4yhyASOWiSqMZAR6G242HXekUuoujGVSejX6L H3xjyuO3RS64TEyxpmdGJeIcscA3jtJ/y16yLZQZPT380iSb+aMGa7tWmzo26i3iXXMbRFCHNHHA TFf+eaTlvTOy8LkAEd2yTf9lLI2TusSwG4ll7WYfraL5MAg6D/8evWiOHZWcdyMuxIblVtaum6pd Cz7v4OLzaxcjvL6vdnHHM1FjCz5khtxP5SZtDIiDB6joFgczRYbgpf7cZMzkiGspNE4S/Njj5rWD ZdWWfVBbaqRsOuEAGRoQw2JadYOjij1vsZHARq16i5MZkYbDhVqMEOxzgPbiEFP1FWfJCaNjSeAq iz1vscLGNWdGdCDFU0gpRTRl2sRS/fKQFrFBtjiuvYj9qXldFMbcfDP7sPJo7ww+vA== CbA3Zp/Jq25ChFpz2Ti+s+knhW1TX7F/UnCv2pMvIuFDFkiPaBtn23aWfTQDVj7LxcVmdxbJW69y xTZ1CnPP/oXEoA/7lXlS8O+X0IketIWU8nNBD3ALB7oM4c7i3Z5HWPHn4j49zw1n6JwBOA08+oa4 cVGfGyDPejOVbh+7UG2uXa5z1Ary/h1LVZ7ruW5CUqw48gEziYlRiaE50V+cmQlKPkwdP1U2oGLK zfS6RYtdUvB0C8+c0exed8E+TyB9S/ZouVEvNXwW4ZHtA0N7793MvdeFqtugnzJj/xruvL7mzKFk A41tCEJOyLsQK3FLpsCdIea5Eq827gRIA38Lr/eKMowxOF4Lqj38U7QPtnPpIG6JP5lZS9P2s8Gi lW9dvJoJL4aGpvCrgtODrkIj4FUS8PqSewRuWxVvTFevUDvUjANqC2SnbbbQPayphLuFNpJarMKn z2tgROYn3oBIuYzJuGWBC76Fan89gY1xu8wtFbmTgw6D40k0BzBuuHtEG+Ehyf/Lz+ViEk2e3nqP RzbXenUZpnipQ4TxEQ1SNvWaBMJDIOV6tXx8HmCtXANQ4XUk3qAO8CjUUuJe6kuYgVo9udpPRmqc wlR24IlwHEakp5/oYuP3RsDpcyv+UtegqrXVtWYfpf3lNAv63ri9z8k8/KYGsflC2NpEtrKPAuVH C+IU8V0naNL21kXxzMShnKIiZP7+eUTwVUVsfR4esP1WwzzPJYiqmoepzKtdj8/0VG3vqR576tWp VibPwlMFM7+mUO9WN3BYuxz81qiM2o6S/l1y3HZpa4pZpEf/YBOtF3flQe8hFtBDmXrWcXO5Hytl q6C02Fp8mlZQFavU61rk+XpSkZ2m1FCNVl0OkDUil/7AAIiGm3yq0yVd1q50yUmlw0Romc5952eM UOoYBbeKqPn3Q1C7jP3PVI295sG/lOK/dYnPFjakqZf8HAGiVM96ShFGtqU4zzlX75kfera47GKS 5veA3tK8Hhorh2Uw2EhIbEYGni0qTz/558jFNfZQmJFkey1f4qe65Nw5AKdVif46YpHpqd12stx5 l3zPodCrt8T5ofHysIVDAZYnjKTqq1lQeu3JImOv7Ciza/vDjFWXbemTkdSfmZH2888LTdg2LKv0 FQBP/ymJ9g5aKpuYJOlu5twISqB5n9KE+KwMup7SCX6zXx/IB9i1XTVc5APsWlacG4N0H/Ww7Uz5 IzMTzNSIm/IB8HU31M7M9vp42RWyNIEuERg1Fb5ejqAPlW12dmW2DeszMvMAN0ulPrcZ2RFiWYCB Qem3teTPMDMolnqlLpz9PdvVVcV2I1onqsqfPixUARuPp9f6vnCWO/rjzEjdrBqRZAywBOoUEsCM Z7DYDPjfUwweQOPpm3eQjbiNuBwzJhYBYOLnKWoNauH3+ABPERdoCzzZB8xM4TRwdbzWr3rJGqqq ZkOdzP8csayZX8E0lqyHSx8wMzsnPffnqWr8alFtNGNTs71tBEg0uBn5YPwcBhDKItI3Zsu2ShUW /NJGhVoU981I+YVGBkgzjqBJ9KanlgPUzm0PdIJu1K4VmWuzlSecgtDH5fxLIzOAhB39ttBv2unU xiOINd+DGosPoIAC4Mn7auGeuVmIbjMTU9LJEmhGBtNdX+3TyPRtEyMS+XXEEApr1/Z4XF2wnhH9 aGHkVjASR2rmqXsAeM6MUA+w34rI338Jzk7Prngz86DsCfzwIVCKbqTdi4eg/tqDl5uthi1TdjYA E7qN2ZqXCy5YIDWNzUb6jJ4sQa+3JdGyHrjpMCIBY4QUD1byUs6xpw9jZvY19mhECiMRZh0cAH4h vMsW5Cj8+/5wIbqCUTyYraRIA0rheY52uc7siRkZ5PdMsT5V6gHOUQH2o1eAGU2tMeyaGAGl3d5Z YbMLC2Y7kj7WzMQpd2ISn5qysJ3KpW5EqaInJNrMVK3u7JMxI72wTi5UNw5OS3VkMy88ArTqm4mY 0x70dvh9QKuG677wr9n7M4iEfWq7eEL0AJq6F0e0n8UATYFgR6rIbMxV9SC1CGMbs1+fbPx96tm8 /r4+MYEhN7aTuvupUy1cIwXJzczC0iBNiBnZ5DKCIxmjHkpTTaIEzbyS2uVsXssK4yB3iBv1CFRH c7P07FBzMyOJogbV7MzIAGNmF4aZydExA5f0ATOf+Mpk0xPN2DvWHS8krxbEyPyXFul5IOkez5rk TyNfYb90CkE+6ddO0U/BMTQjTrSVSAR7tUk4hpKCL4wiibM0pviVgllbhXTDlgcYH7JqhGgw9u/l 8G5RbfLfwq4JqMIf+DiJK93McthGQCqOybKp7S4NPTMrywdm5kJeIPMzmyfjYlYPNsgtWbqVbQG+ aU0J6QUexDa4FI9r+P2l1KgJfWknJMJ7ybl/lqqIi7Bv+x1QOd6iknZt6XwvOn2nun03q21+GDz7 foMxwJD64o7EG06IQ8lBoBLi2CBdmGTj/OBJEjCEIk8XFHLpFT5NKucrGxD8TE4yvN559C2tInCZ +HkYuig2A+Ylw4fSnUWtJRw+rjf0RptzufUZuHDEVz9ys7/pdloXaeDcCFcB/WLhyW4FupvsuOYK ryoyvA73dt0LXm+h3K8cyV0b9dIGDZpN/yl4kSsb2v3HpiTnsMmXpQM1F4cZpay5qfLjnv/gd+Bv 7IPmSuk17P1liuFpUq3EjOzmmll3tShjajuBaqpfC2zG4EFfpGDiFGIK0+zvqfgFnXkzvjzVuFn8 O9p4XFn12frbnjJmB7HIsE8KTxrSeh4LVX7wfqpwgAexyGKmxAco5HjkyW8zQCFgZ9utj4vPe3sf zwciv9xLwaTu8Sj8gclqhhnpW69sJjAzawkrIFFhzHn1SMT7ldpfRMtt4fcZufMjUK6qnC+mws1I OOSK3DMHYGJmsUnLjYP0lYBZeZoAyR7spX8gqdCQSF4EpphxFBLs6cFIWszpLOjdm/nwJcTZ56Y6 eLOFuR7Ky604C/jnTZx73rDxgWQLG+EnaRavzNRWHvdsaVrexIPHatgHZq9Af8DMDflIz/EshW5b zTkvozPQ79CoZirYroWfsDOhmzCxrUaLs671LWbTo4be3IvMyMYnu5so0599qdY7ZoM3Roqwpbra EoZliefxLCF1Vxy4nABDJNuKAg165sXCqspmKo7iVpl1JOZ+K3E7hCrZEsKwrCd4D/YFZLJ07BT7 I3qBLXF75ChAWuI0hRzXQe8J4cKzwx3HD5hJ+rfUl24Z6UKlF/cikedupDHNAvOpFBzzL2HyWlSg LgVGH6DAtVxCcJwqkt8pyPwBvQ+OPzzv5yYhVYew5epFS8kWxFPUJLHpXnsJISSD7L4We6dPthjv nO2jLMgWT7NVnaUYvE5WYomkXFGZ/MCwfhCF2WJtVmIhXe+OFEAFR0rCK1XutuCv20NSVmLJA7il gm0F+UpCX6Dut/de0qZv3C4t/ETJfr3FlC2S370pCUOPNQvBVQ6XyrB98fieLDatoNKIG+2Ci6zr VJIi4Lo2ZLIE708fnQpb61rfLevAZVMkncRY9ktl6ABVXWpdgrG6dqpjVGelGzuPlNYSbeJIwrAC smQ1OLof+Lx3EjmsG/AzRbcFIVLW+8ZOR1yV7CER2wGqbavOHkqLXlCRKejaStnVeXkGetnfKD7/ M6Ik9vRAPu4XzfnG4lwy2+AXjhfmRoSv63KCzFw4M/pxNQtUHk98+/N/vOb1/Pm/ttsziTj4syOK Rb9gJopj6HQzkPtsSjnEB726+GBGpjXd/JAKlT11y1SaVv+8sa5bV/mToB3zE4uEWo5VFgUyurHW Up31ih8cQo2c9Yo7+OD9Ply8ZOJzUC8FpgkQtQE60wvJ/mXzQrgymPD1G0NVfTDa8Z8qTAS0lbDk Lw8cCuCrX5HYQx3z1cUwvXRAWWeC3GcyeK1kWF13402XKsoSHnN1arX0JbVaa2yYdCtFXeNdFIzZ yOzrl3JJUcr67QZs+Rcss64izoyAl3c3gMydKefo+TQaCdxO1qD5uZnjy7gfubYNGrg5kN9vqExX iv+ZeRCGuOGfKHgJDOPAcu3S4QxsIq4dvBC1tJlqrlX72Qw/jH/NIvxU27HNVIc1u3jep0/F+6q4 EiTQvC9Kc095jvuJsCGM0IIyDV9Q0czsybZL5f77PkEoqfejxEeLhmCbgp77xqp4nxcm7ABoaoB5 Ke0XzNxad4peqvHIgxvC2EnpsT43ZaRcuBo4jko6K1pMwng5TuKcMrO+I3VLHrWHLsHNzSh/rqjX cKvR+foOzelcbzfw2h7ur5h/D9GKy8Va0BOISbHzaiuHip4ADtAOXRm2Q2zhYXZgJHCng35bMl7b GwD0aKuvMallNikW3l/g9W1b2aaQd9urL79gztBf/Kqm0NCwRBCjuohP57pJxvqe2ckZDWv4MSUv eDBZvaDyrPCQPgZIBs+ZrJKVfSnX2e/l8o3XO9V/QSRDLhuSkJaHUQ/jtl4v/4kdkg5rH7iz9Iy9 ZK9YAqJpXvMnTziAk++P9mdub54Xqzh0PM75BTPd+Rnz/ICZPvYMsc0wMt5FD7sZZ7TXh9EyazHp SW4GZ0eXtBWOMm5llqepLJcsMQP3zB3Oq/W+Z/ZwJiX/ENva9IMzbGTEmle7sj0qReYkyvLZPNyg gaMwI/o9ZsRvf2AAxmRTrAKe+WfYwN59mzfiLEM7610O9d6vZA4dYmJaov+2ckBn4ikbJW2OlboI 2QhuPyexAhJl+xtlfkTf1FDxcWV9xW8YIf+WB+bXHpYMyOI7RaBycnOzeU0mdsUUmw9hM/HmOmib Iqj9XjAztK07GviwihZ3N1EOL2lj7KhD/MSSZV/W9WNLTMhbIU3cOKMn8WH7uDo3dhXTqQ4YRqAR Cb2/m6UetKmGV98iOMBBtypT6ngJbFDxrAIPHkfXkemUNzHZed2TJHuKgLyLisgnwFjLNe614cET H+VKC4pPMPuZLG2x9fdHviK9SpvA4mmIZhi3KQaX+LvpBlXlfQBbdmnMh4cRyGpcIYpfzdHB5XNl gcYbpz9gbgrCB3D5xsq6KAxI2TJXrqLYkZK7ThyKCOFEX0gYmUY/Oqap1xaL62YeVYmpkIPyuWR7 PR6lmYlNVHt09aRTQCpfk3LUh0viznoV2tTS5NSnfDX8akbSsk32LPtXyd24JrMuD/8h9gJ7FFgD I9Ki/xbXMjmSyhauY0NlC89AfXvSwLG7BIl7rKhfNGvkpIUZatkdogtwFp9F5AQZobKC2KP+5zc3 1ZPjoVMhzRIzgD21dJuY0UckOzgASVlNfnYlQRHlF5yy/Qf4s1icziTPbIIh9bggriXvf7+p6Ui8 NC75eeNnw/bXFWc4XRjFQMjktwbv1LGnsTasO1qVeHSZjyM4SGcV242PIANJa2sbMa5EOsVMSKSP VHW1nidiX1LKfByFKZBr+eEUh+QJH2ogsCsVi9RkiT2iQ4R6E9kMx2b81AMKEHOYyg== a1YaWZdFbKj7+mx+M1rk+2//H157G8v45sceYBSm2nz8hpmFpaSqNPlYpYq/96QgfospKTMuRouM AN24YVSTqPFP4pMZOn+G9Lq7tzP8CF5OcHaM6IKKP8/iMt4tuWTT6yt6M0uFnnHviFO+RQ/IpsyV Gw2PVuM9xTsf8oXMCCGTkQUk57mdj5xU8IOOKLTGAEXcxKydjKvvffQraeNAevL3ktE6NXiMzhkV nKEO9UsKeFyKtWbujFtSVWxkam2K+Wkkm/8UmdJoihnmX0RaNJJ2fkYoiXl1Dkr6QefvppMp6tcm VhTkdHGvoTrZVaF24+b8RVw1mjLsU5RHZjxMj1CH1+WYOaekdbS3gGYpy98M8tTWzI+QS9oSigx5 qi3LGGAIX7aSCnVcenUPEhkjdXpm8h0Ze24hrkZS10M4i6mO6eT0tVfFNtWxBM2dFx3fWDrXVPR0 tezKQia75o0tuTBy3DbUH/yaoNKwKbs4snVkqytrLH3MOwqhnNdVroJKtZQvzc0mrfES/mRHFM2/ J99y6qrZl4+s9RaPlKmNP5xVlhOGKD7MYYEiWLL3dgiYYQaTLm6f2qVWtKKGN4k26mQQ7is5gbdg 7ygYcgZXrNPFVJ6U0Yh2aCbj21YYZjcxWXUkFZ8ZkSHfNxf2lnLLDtofjss2oiyxXmymO2IBnOJb un9coPO5iiXMtM4iktzs4jWOVpS5982s9iieTo/WqFtRPt+SUDN60Mpik8d2HOAET5UNQA7JpN49 SQ5nLQEPnOdsMZ9VpdcT6RlyNSIlNoo4zSeEDGIIumggr3CjJ2r+oC8ESWgjO6DbBJ0DixDw4dm8 pGf/6cmgW8DMeAK7UbaYvcnzuURsBV90plspzlKGfT7sV7EB6CA+zEOZiqxCmPkQ/OfBjMiHERuO iyi3ElX5SYbXzIvzn6pQ5CO0GAcdauZOPlRMF6NTi8640OxV672RaDaKEbN9dNbLyG4mM0qe9pG+ h7nfQV/u15584albiz3NLsVWfSRfbStDQuzJzWHXoux3AtEB4+G1VL01dlHgJc4laeADsLAvUtt+ GekmmvEwNPPEbgzQtaVs6XvYbaFrZ0tCfKa0xr4yzmZWpkM8yuYyEH9Gtt+qolaoy+qNI3m57wdb AyK4iQfCM8RNKVSqQqbum9i6BSHZFkyNg5K9ZiWNWdVesJJlMTWVVmD99LSR3J6q8RgTq3JYm1S5 WQJcF3tNkrEyi0a2zZa1I2A+XkZ2SU2RfkwpKpvjp7TQTHzIkGiAMWNKkVHb5Ft4yrj1iAkJfxdx q7FsETvrpQ5xoala9kgrwgapX/CgTui2WDFnfdH4TAUSyWjIqNeUBvbIFqNeqehDTropTdrMfjq9 JTVp6b+tooaxTJAZ/Z58j6uYWS4BXPbnOYfk+QRaMFJC+JT70rRd1rpGhAdW/hKhiDtEGNLkdAYW ftK0ripZCRSAokbbJFGaxBWrKQexk5exC5y2Az+tmucSepV0X/36zgkLWsbSQZco60JdCZ8VWbcP mNOdQIuGjUCi6ave1C4/x1Pof+DGtqo4xHOsppW7FJusfqUTMz6yh/Ao2SwdzwXltDCDHN2MiHmm uOlXU/CHCjzHJQw745CXkXK5Uxws9m4WIe/XSmhKXi59fk6wyTsrIKpeVeCqdVGFmHkRBUxNxk8D iGAye2LWlfkyYsFCN5RaJkYsWIVYRorLiDubINvyeJ2ZkFgTlk8XdCNjF12Vo3LZzuhc4AAdiZB5 c3weCeNSF8c+Jw1w3cKjSHlKjWDdiGXmRoxzcWfUoVt4rsIUG1CNZbNqy66iDs1ncBVEi0rj1/PK vtgpR289V633oiZ8rtiVrdy2IwGalfHYKkrgziAx5AzaVnKFi65cr5yMmmZcjHP9c+WeyPaqrN3Y Rnn4wClAaT+1svbUk2qUmK0RaDnu9plN4foyI9QDPhlZaYPkMMdlenyolmAMpmpt2eIPZTVkRFKI f58ld0loHAFDZ5J9v51uV7V2F7V9Pu5s/KI1mbwbidtSvvWySawqH/qXS7v+/NGQk0xqySCQSrFv kzIUx7/6O/tPJhwM0YKR821dMrQjNYYtFcw8Kgn7TLl4sDVPD9OsnUkwQPNdfbmopSow3O+/DxfC RlAy2jIqnBdd36F8hE+hsycJb7k1qdCMi8CydQFtxwVje/s1gIZaNkdD/vwXzE0a7qSVbU3+yg6k lhnrBQFO9oxmPu2AB84ItTUVV/Z9H4Tin4umtYGFwM1Mgtmog64JBdRaVT/DZo07zNQx3YHSiB8b wmZscK28P4Ofejjs4DSGoz71cAiYPeE1fdAMvOu5Egs2SGNFyTflj+/HxhvpCgvJP/SL5iWWHDiL zlZBVuMDPBtpIXcI9hA3RuGwLVmbMF4Ca5VanF8mABiidd8MahC4s+QwxKtDE8qP0XY5hQYrpBUx I2H7JcoK346L52+VMGiNtkCi+KPwIJ60FqSvtRyC2DZI4eEriqwYl3Yb2Fb9rjuzpsZcIxFY5ptS 4uZman+f2IdmTIQjOKU441RZoOy2Sw+SkpDiD1Y+bBQ0mFL9sHGr6AePypLszX3ueil4gF1pgZXs 94lxuSH0iGBf+M2+6JV6voAJers6hJSHd0Wk9fMYfBxdHCxPRM6/YGbIDYEkieRVch4l9fn7IDk6 4V8lvsN/YfTfmL8Mkg8G1JBW6bW4mQ8GvccDqrR8BAh2xxPH/8f3g3DuRR/ZDiwmFwqTkzuCAZa1 6V5vNuF4Wfvhzoui9tuo/JKm6mYlMP6/kGMFF7Z9ugbaYvaasIfn1kycanMrF2nr+9i8x0b8vqWB DEDyC2Zg4m0NLdSaGpFSI/WdTFQyqkTjpiz/3QCQuBpJ5f4+Az4PawgQRs9AD3we7FrMpomx9FBX aokuMZqu8FOZtKYK7iLRqw262FREUr73CfyLM5sC7V8zI9OouvO+KT0onV5UKQK9jo9KJAqzuL+f 2hGh1Yqz5BfMJI1F48CHrmb+SFvWEfmQQNlWpz3sx8iGhnHU/WEwxsHyLfXWEjBpxsq+NcduqqZ7 CMrWHR81HE0l694LvRpAJVWG6/5jKq6hgWUkEHVGoMABCCGfqSN5RH+01Kjx/mgTIDHFR+67PQES JdlFCQMYrMA63SbSQYOg3HaugH0O5XNSuGBQjLed1MEadDE+sfNPw+YtmCWSMMhd3LIf7f0OeGtv I/+CmWSkR30oU9KTl5qAq4mRIbVKQMSu3WTcVF1hMO94Ma9+d2/8CAGvshT6c22X4HIazyU6ZWUx pMafaKP/+H4Q7ItzXfyE+YnPxWyeswsGpmomMeqhg2ZpTUl51J5SUKDacsbbhxI82EGNnBB4qPff /0NvpD1M2FSB7O0xDaErjp69QKJtdgqpsddgXjg+u3YJYwl3y1/zESQIJay3CXCt7Nv75Vl85UpT P2Qa1G+QppJh8su4qdl+qbndopuF6mZb2drkY3ybwAVgKkTC10dfZ+4nTfWuISaweUu0fRmBi6QT lmSLynbuXzADVDnEJG5KeZ3nocSXOhFMVprZT363PKxPRGhxLeCqI5VWbTdodOpWvT58fJ52Ji8m 9U/3jcfBZ1MT+HwD+d1/GZirDCwnLq4+uPtMVb5YRba9J7I5bixdM4O21UiNHx+10gh53e9u7Z+R feo6vhOOZkkpdfVK9+AR+mPxQfw+rcb2IPV2u3GzDq2U6dsEfmrP4D0jguCegQQn3SYKqHHrKVHj jCU8Yg91b6pKQC3au8dzKXzMzbbWIZ3wKZleB0lWlljQHucoyyc3oy/TvZqUKjlQvbjAPp5UFEyB e7s6inumX6LKsau1cFMMkhrvLVsS40Ad8P3X+KLFcubCKHrRv/k9o61xP8uvHlSSSBEVAr/fx+UP Jksm0L+/YC4ELrAiei53kSzrlvsTzckQb6WlD0XP0MFV/J7X/Pb3ObFkYStRLf4Fc0MFFcXpD169 SPSa2K/3Qfi6N+kHPh113mOjx6S4w7pJpIwjqsVQhSBDvMNOPr4f+0O3BI7zAZZRtiQCTWeRW2GL HUAmtqYfvljoWY8n21vtgdQHV7ZUrJix6t1MCSw183mE3qXPAxDAE67Xz+/nips4Se8HoYlfMKfm DI9N4+7sJBOn1sppqhmW8J/9B80s2Qb1T3fhMjN4si72SrWX1GczqtJHuixWOI6u6mRWLSoz+BDM ZpBW1Ypg1JNOheDTJBxsOZmgwDUK1eSWBuLpVDUkligh/8QEiIoscdiHkR1eQH7EqKyIlKvbx8wp ugvBxlNVlyqRQfkRfLODYuGZYbPuetHSi/gACiuxL6FyYHzmwVjt1PwXdTmqc+1Q4+w8l+JNzUHR 2OAE+Cc77qecXGaUjngH3SnnDQzJOT+SrjsCn9AD/ZCZLPyFD/FhJsg/4UbW3lW4f6bIqD2Yhzpx LKeeSpx624pWbBXF6mx3LteujY5739w7iWxxtLuI1OCnkJuCtx3+xGcD/Wk8hA9+Y4qNDGItq4QX CnBFRw2vdrv8xHo8/JhBF6VDD+hpHgI/gglXZwh51k8nys8moNPTWG8lweelnA+aNx8jkdZn0mNw Dz/wYUdE4e0ko5GZhzjQvewDo9QjxGAxmVnwGczkZ0EhDpEHKVtf8QGm22oXw0thNEN6u6SSNfmK UZK2leRDheANuxZJqHao+ej8LlUi3Oz1doYXUciPyK+akZnQQo/ApxV368590wQo8FOoXeZ/Ly11 L8PBiE//Eh1w4txDMaBJ1tMibEAJLqowphoD66ZuJYU9uyac4veQEfmJaodzFxdSuHsfHAdgZzz8 MBLPpD49U+UHDtIOUadAQhh3cOWedtSrfBKH/wQrCpln5iZBOBQKTkq4SrnorEjox2zVR2HmSllq r75xgTP5XQRsP0AkxBDkF0+qpnIp49kXkm9ns3HkDAFnnzgpwwisn6vsVH6lPFse9yx/4u9Zf9aL MGMqApHXwea1qOQ7xa3dFRbciW3bqxo1dohZsp1qFh7biMXenQF4b+9n4S/ul9JkY5bLjjJJBbHP 49RL0m2v3G/blKocyvg+aL1/6zeH8T/jk0IjETM2v/7mDjL1rVewhBqZs9RFQW/xPiofRKHqtO0W Bf688c1P7q/sNznQS7m3KxfzCLI3z7Mk3TzoT3xvrMk3XwK2dCW/jJhG6g4jPQW0aLk4UCqnfJ4s fT7JlPh5ghjPrOGKX6KZ5+Hq84Bp0fibY/13d3EkDomOkfOQftt+jIRIX+f1U/PlrnWu2pHNDZxj J3xQuRFq5/QN/eP7Qfg0GtUgO/R4ftGBRc/9CTUaOIpEZqGByoiVKuFaU9jU47TcgHYx5jqporXB 1vjNz//UvPA1D2yfmtc5KAxdO3BTBqPGzv/x/SAf+G6M4qRiB/Lo7RfNKsmIg3xeInhkDS7ZP/1c LM0lc1IPE3Y+6qKgCAD938wgP+lxhg6pxak15hX8mOvkXEvJuAbauco8on0ha1Ydvg== S+GdD8s9AXlyl7oiPXxjdcOslvuhmWS8RdzDRnM3tWsOOABNUuklemBjEv2qj5JZ0tjgp4Qlo4Th zPHKZydjpvGmL3qYnsgiKd85vAvJq/nVu3BjOiCqH5ebDDJxs0k+Clk0EEY+9PQdJBnDHjFsoz82 rqWURmHbhxmvoir52JwwUiJBhfSW85IuQl3AjEQ5lZtxcorWXlGYDxCxsx21G6thvv7s4bk+z7VO N105x3qJMFL6zV6VoZkSZSeGwzOXhDaZjY0dUX6X+9R8bXjFtk73IZmj52fjvCeL4LwUUdWMZ2YS exSm8Zy3EY17D0sQ335XmO1DTRZU9mzlsa3poXrcN99fAjOmQmqni/9F86C4oHI4bl7U9EQY4Ub0 +zxBD/btuPmD8Pjt/li6MSJVFikNsQeNWruaKF+DrvCb/f30SO6di8V/UMF9K5wzKUdLlra+mRy2 1qcKxFcCEcRZd8m/Yqt62lUDOAHKdaJ5AF2ehDr5XQPT8lARzwcoFN2EkFqwz1JpRzl5H+AQ/AbU pf/YpPoP+i2cK7/zS6wEo31zYzxMjpgvS/RZ/IIZ+SKGO9w9yKVREtf0zSA5+pdhODqJt+7XbWbh L4ID023oGS1B5B5Ginh8inC+mXS81nLBEpzU6xfMbKBWosvoex8lxRoIcZ/nFmw3UeGf34+bP8jG 4gsy42Y53YNC6N8OE+aZ6uRgSn8ZIa7oebg4Ft5/7qee/5cHzXmwSUXCrG7UgYNA0H+uS+B85X1/ dx/fvdZ/RtCFVjBLdy60QpxJdNN4bidwxt+GeREnY2MEAN2zozszHp+H5k9uyrYZ4iVdsC28yCPd +yPqpPFk1mSrZIYeqZ8cIOj3RyoF249F6W/oNPhmBnwpJZDqr//QAiTzC2akmkZTDdRoYUMCZ7Qk Ui5MKlnL705eWrTWjUqqdlcsQlPXJVsFr8SNV3bzkPtgQPAGA0SmykZFXCs5sFF5Z5zrgPnSFgLV 1KiZ1DqRv40JkFnXnljWAxVvb0bmI7Vyf/dyDmOpkfusPZcQHxnX8WvxLfvapHhpPmlFt1plo4Rn boI+dbi8kmwe1A7Q1vMd8A56YN7xvrFketS8v10EjB1E+jtQK//FW6vu5RkG7rnUnCqMC6SC/sA2 jckiq/K0TQ1SnIeJdrs03/iXCXDdNhW4VzQy/6JfLIgRD14TKRIZL3UPSr9IqZ+mbbup8X0lGt4d nCViVSoKtYsA0PMo304sZ6xWmr0Ui/zm1+jdLHZVhi6UmHcDe/910OvhiLTd66X8tQSBjYw6yCdy 0at/cxMwT1KegsAujOTmGSli9WUGP+XUPOkYl0qnRilVC10gY/FUJqZ7Ya7YVX2U+HO2ZPoUZAi6 TpEqefWMkt5nQNrS51J69ODzF8zpaorSyM2SeUfrrOswTOKTwUb6Nip/rl+0z5b8+EVrIzUw5ZFq v7l6o6HEjUs4cvItfrk20iQxqsi1IrH0PoE/cmKfB46ZDYnCb7b7hHIH+agZj9Qk/tpX6GHmzHBU 9EeGqIhoAp6RmiDsnNih54s5NNIoodnu2wfxz3/6uz/9F//6v93/y3/z13/8N//hP/2f/9v/+A// 8T/+03/4axj/zT/9r//7Xz+Z/8u/++tf/+HXP/3jn93655f5z/W/+lP5879+/e/f/ec//afX/3v+ XPz//t3/9fqX/+71D//Hy/Sf/9z//N//+d//z+XP/2hX/k8+c99Ih9UTYru0W4nQEdaPz9a+khsG oidvFv3lX1+/8z/8yZOXr4/lz/YPdssWvW7rS9A0/wE/sov4ywjHs58ebLdlF42rw5DCgXnGa5I7 sVv+yvjE2W5RM8e9xZb79vs4WOpWpfQEZP0XzWrDSHX3aj7RYfOBHdYf3w/CLhErnpLgzWuBv2Bu 4xBeCxBYTRWlI+byannSggGS1K8ehu82j8HeiGqlu4mm8MZGiupJI1jZBdacOgDZwA1KivfpsqHj Ea3ejkDgF8yrNfZPI13ejHqRPaAeFcSV1ATbF47MzINvRZ0xZhQNPRxPMy4SZlJLyayzcpMiYUl7 LtA3m9be7yBv7fPAvLPWuMeQ+ua63aWE8m8n9tnKBZECO9DS+QVzEy+Fawp+wNx7o7YFu26qOrYX O9daVS/QCl3s7AV68B3rJVtpnxQWbA59n1e28qAc6Y33z9aEcx9P6KY3NXFstnLaLIooUIE9fh/3 p55Q34LsL4ZFv//B13ajPTuKB27s+DrI1mV3uNiynXwvdm0hX8tuesRTTCWTK+htYjljHu6RBOeE X64djw20iNsq1AlByWC78jDtLxZIW0Gbxycx0La0l1QXaPz6+z+1+cwzAeHzI5GbD5q8DfUoOKVt CJ2sGkmR4FsV+S9Ij9UskUdmD0Aj3n8t+/USguVhFxv2XHQhluEc7Pkb4t4k57UZJ5fKeNi0aw17 lZ+YF5PYsMeofzOr7nMQbwxr9e8Tyxl/+UHOGD0pXi1hSdeuPnIFAH9p/eIC8C6v39yIPrJBPZJx 5tIS6pEa93W8tzrgnkWqF+8y/fh+EO4582KidAreGN0YoNjpbliuD1z8cohAGOAV04/vx8jBT2ef tjce/oJZkkBQbi1tSYRyhSuKv98ULUkS+WZ0DWr/blGsas49r1Z1DpqNEVuIoOYt7oTthbCkD/pQ s4u0pu83wJey9B+wZn7BvLvIQJAraeviAYBa0N+Y2mpcdqCUbFk+sDgr0MXvE+DMrN8gaTF31Qsd XVsk91nD8cq3hqvRRvQQxjcyialrQ83EO0DDHzQ/Q2YN8Yq7yHkEOuj3ieWM5+CG6hjlX3/7B628 yY8H3aqml9bI1xWJdjeqMXZO8Bv5peTRIDdOc1rO+Tbol3nlhHOz93QBJ0zSHAn/+V2XPJp2/d2j 4LVknNGp4KNiamTSeZ/B1VwL7aHzl2s3ZXXuRMIMGxzy/EfI8OZqoNjnVT6KVumD3YOgMLv2HBIH gdH86+//oSfWHpaXfd/Vptm6KImyq5pL+2QXuEUW/DWi3ezKwp07aQHff+0jX9zpZDCa17fxdj2u 7geu8XPYrfk+yIf2hHrop3nignsC40ZC5e3jlwSdXrR95mQMSvSNbxQKWELvzscshRQv53BLefaR kRBOMw9KV63ZuX0UfaGjak/6cgM/tY9THWMHETv38YF3Yh/Ywo75Gu7r52UQpE71LLVNmPkhecy1 5fLx7vBlv50AZ3ZujSK1OznWVHgEgIDa+RT6YXM+6mHZQZ73EwOsRWWt+9pFTnAnX6NRH22+treJ 5Sp5BumzHSDCZ8lqU/LBtSlWlh3HD4y6t111KBrhB73rPRfXVJIhQxvyb6wTtr27sANXRKFy2jm0 fbkBvgtjRJcaqp1Yv2gGBYxyRWZMfUoS+LUd1MphFKOcmU+mhXC0W4qJBGPsR3ufQS7gsVMGquVD TzeanGxmXPKYgZcz40zmR8VQVnhZ+EF2b7ixsN0YSMD3GfyLU3u9Q54blV/BauQiJHHi75fDyw3k Z8QvYF4Ehcyo/I2Pc/AxTHJ5zCtynUXT+v7WuhPzsQ5R1AVfyDLrpZ/ObwtiItY9FM1AjvmovHCR grKpsdSbpSYu7VMsdkBT/41v+5AbgyivT0aIw5ee2rTnIipwNAyZyxUBnkAQ7WCkWLCxEaIEqRr/ HpxXV9jkaJoFbgA2RDtaceIozD7TLvFs5z7kpa9nBRtZPLylfKCRIlWc3t/AB81RgRgCWBSvmbL8 xxaC9zeb+3HRAnGMJPeAUxmaOn74g1cfZoMWSLa8S+XRGoNfcS412exvcKQfVznboc04RD/GeO63 23RR6smBkR/f38aH9rjXYcm9kzQibYsi6gRkKozkLD5Em8QOJdLNZ2iHe0VwWL1EljZTWK8M2ejx WDD6yfngAHQosnPZYokyuaSZb9kibbI7I0NUczgTX9BTeFBQ4GcHKejfdFPIqHWd5VsA7msP+f0u X5h3H8GP5zbGm6Qfs+dyGMN7Jzj//lFi78pc3OYJWkI38gjzbezvee1kuockf2Ycj2KZ2vVupPEt OgA3K7aYQ7/FBzPn1n3phwwhm49AFQm6Pvv6HJyf7H0Z5s/3TtnthXZsu3Qy1rhezG8m8JorjwLy JG1FD1fa7u0J5gC6lufDlsr6l1fw7Vv8dqOw7YE3IT9mX3yCvpS/+0CvtM1hn6Yj8RmB4AA381Dq 5yHRKhsT3bhxoc+AkRGYt0YRHYIZdyMtLLOwbxPIme3TsPGnYJCZ4zwZ6p7wvNgh9YbcJovkslNZ e2NngujzAKhu2Y+NHOD7exvPYEMvV16nBKGz0pBJC26UZfdWpuBmY5OwV/MU3VWdidxUxhVLriFb J8XTTA6soQJ8CZBgGIHG9Pzk4LS+PNjb5RrIkV05LxG02AlcyHvZnKaC97GIonHffOHqKm6adJts JuT4moy1Paxe8qU+z+KKaTaT0anc9SmmKcTCujOh/enizXob5ENO2ZS27lS1xsyN21R9CLQ2B6Lz G/PUwcf3g2D0bSjR8M1aUKgHkZ14CYwcv1KU5WUuY8BMYZk9mPw34wj37H1cqu41Jm/tP3TC+80M tEsLEPcHzPAXDDAEkcGmruqm0tr7sEnX8npV3PhUtJsptrsDahtGhiN2FJOkvE9ucM8QubN5ZEwc jmjt5rA6AEFrMotQ1fZqN5UuvsyLrchGpLzgAnq38i+aKykPpI3ZYmGFu3ixxC564Wzucmshtox8 2KsGrWo2qP8AtSgX/xlJy3lWA1TfSf8w6CB+ny1B7zeQd4by5wC1Ne8MZRDHZC0kxo03NXwRQ1Vh izDe1N0BXuL2/T5udmacxZVyVH2yRsw9gR6SUpi1swaFn1vZLAQVRINAUZ38bVSGT1vEh3duw1Nd hfEpehNdQmkpnxPpXXdGFckWPvq+bylBnAE9RU3SWXyfwU995skFnGWb3a8oGdB+MzIcPqKAM2Nh 9vGRMJeNK95xVlbN2ESVT13gtxnwqZ2roOg3/QvmPTe/JNB5mLEp/kfUaCfQKffe9hMDMGG/tU14 zZxZCC/7/Y3HbtdWla8Of2zKY6zIwr7fAmFJi929to0+yF+6GTRfLVxfGBexkfCd3RgNTmack2Dr xY3Kt+fBSycvRZD7zQQumFBnVbWSNc7MLxeEgdET/arVIOqZ3600jkZyeetLI0wIH21G5f73W3HN LsIZfZ4AUs/duuUnUzQsUb+sU0lRIIL8UsFAGgg+3v7+57ejfujXXvs1vBOP4vlzyMM5b0zlz11S DcjGdMnLuv8gaTdjRDyb1xZO7XWYsdK6kDJ4m8EfYlH0Nx77KJv5zLrIwBD9gGEblbZB0kY6eTD+ 5N83/T3yTMG3yGtXFwnjp9//qUeWbrzXkvSGlCMfyIB1Y9omJGggdWNGlfm7ND7MPLqu3bw2vzf2 x7/PIKc2izjXn5JTG8qqkq/fjIVZB6pgd+uC4ByShtXMnUGps7rzWoHUGv/+ywQ4sw== rnruTni+S67mfoTWTFurS2A90CH//qHtKqrEwTu7YXlavL/5LBYT1r12rsjTGSuShfD9Bv4QKhSJ uOH9tgKFgkd0VHKyuPGZOL2JFzRj9Rszo1q7DOk5YfX6N4xImdUbVPr598kV1IWabyGn8EvmMmh+ KL1Q5wQEneSEUx00o11s+37t4rXtIc1TXXFnjZ3gUyQlbitP/v3neSXXFcSzB9jhOeFZHzwJstvO jBWb2j9//4N9i5xFKmPvP+ds0f9Jst+GI6h0syfFHfZWKrMKybJdDXnHtSSd2nbOxwbUAxMSLoOr RcNbIyvT9vQ2XTiAfLakPNkYwL7h5zx41qOFEpqNujtg3tSg3uILMpfOGhU4AOiJfLZ0OE/iYLqo Fq0T+EzeGXZGI/jQbCe76MKD3DhsWSU0b1EnMNrw3MgncEoSp0Cw3R0Ate9GTnH07Dew873iwapT x3t6nwO3lgKfRwhzc1bZcWHf0cQSdEUKNuivWoCKTyVO78XnbTE7YkZkpJsUisz4HDyspAM95mUu vLCKNNkxp2BgBaNjwIykYGuRLtHEBr9ZcrbbAJ3rF66KX7kWZuAdDaQuYL9NCzgqGRFGLgR2TFsv 5ODDIfXAMERk41vkWrYB8DE0VR2PoWsaVp2DbsLY+sNRuzgVTLi5cy0jYWr9PpFwHU18Vmcyg+kc r9edgVPZX+WTvBCj83lV3hczX+0mofCeI7xdNMs6K0RgNjzMWrqvyH9Ym4xyqMayEvwcZkbayhqc BsNxz06EEfhQj9EvGoxSuCG2g7YNFS1tADT6WGWdO4fjNfj3oD3xDbWwx2pdGQjvBacZJTWbrpBS 1smE51hDoTGufe2QWKNMdzjpB/3060U4DgWPzIFjpB4pUay7tkvrSRlaTeRYOtLssq+EwLhzyCbp iRSQN2w6z/dXfYiPt3Wn13PoN9gCieDRO3O0bhFHmREifn4gdJ7ERX5kI2AoiFY21zj5nKAAhsB4 JysMZN58X2K/0HpiW61BIh4XrsM+KqlFmRnoL3uRD5pvKiXdfQ/dbLdnobFlrcT5dgKXzn0tBihj ctUEpsyMGVctNjxVYWxasIeyM79NDlB2w9/nmQmxcKf1qNz+pDoUfczsOhP63DvzkYXVIeL9OIfN ZI41ZJ8QP33P3f+BAaC562qbPR7tvTOjsGNGFJL9wW42iJlIZeEAiAGdWuDhS2hsVEKya/h9y3MD fMBebSzuuAF6DU5Y8L3nhvnjy68h4oBBBzcZZDuCBWEhJQaaSMw/mjwtgiHjUae8ovujaP/vzLly L+AAyNDatdl8bzxXXF1wMXzczeQVYHpmRMA7GnmMf0RDPYLKys/ejC3Kc/bVyQZCVrqI/HuwxniT XiE1AmKbaxmaGGyjd7hRYHCaAG706K8ukwpv5hs+g0bu/o+0PowU4al8rPNgCXmedPC9NNiQE/r0 WhdFK/yYiK4r+/ncdetD4z6cfe1bf9/6Jm9hBIJO1FC39qbo7ypWGC5YQE5xHwNs8ob5W/UrD5sb 7Oe50m0jJ+mniit27euRI0Q+52HnNrUHq9omj+Un+K3Sh/H+cTWkin7G2oyfvpnQnJiCKWdMNZQG 78FTmJbjNvgTAwADZu8aXBXW9b05APB/Zlx9MaR6GhudjZOQ15IYw5rBB7dir/aF8bXTc/2S19XN UeL2Hyts7bb9ka/hBFu/d8ltrhduDtbPPx5tOCN77w4cMQQ+ZEZAjdq9iHg2Q0yvCupMZQOpgwF5 xRh2XvHXTMKFKemCBnpny5694haMcMhp8E1KLcxtMAJkwPqs60ACssiMLIi11Fx28+IEIOjnoz7K d6Ox97HmSS7bzVjezOi0ogPxAfN+Foew6miYrfFqMKyshTc8FVoBlmBX8sNvsR3+xABtHgzQsGwO 0xn0uSzTZ3wSle+cup1mBk7yfmeHnUW2GNGi+jJu+c4X48RRt28jIaONWvSZgaTYZyB3dk+S1dRy +dl2prEDc8gdRSvDU50r9fZ9zdjkxtVguoxhm1yTyv6xMDM8q3q2tVFmyzMa4dvUpoprvc612lXB qc4/hb9/GufVohm7ZsxXI1WTuVmeKpDbtdZHP/njsIw0uxmXvv5GwKGbcd4/zJg9dSoMKySAMyOJ Sk40bccAk8QCrKB+wEys0NHBai2CDyHMO1Ju3hfaqTZbswW0x36W137Q3AkRm5HVMWOTKCpZFn+b zMaycTwxHpgRHxHhxUO4dvGc7JS4t1XzLHbR9KDL9NW8KUKJNrBQDyJ2SDTj/qU3JskBzvVr9WSA DnfjIo4b+gLYgJTPP49+rCqV6ERy3OskQqljz7bFRcS3yP59E0Xz3Ilnj2srxZyQH8e+ymqSCI5e O3bdCXTFh/56tpsIAqzwxzbDg79HozMOhyO+tK5rW+eTYTu9HyMLL6EQbeHUNHtgXDQR2VHmlcZ4 3qGWFWeWQL27dh17gOrZj3VRl5Ak6lC4z0/jte9PhCd30pOL8Mb+kdD2wLf4wd1Yf9kUAvaTH7Xm E3364TqsxRcD4I27JJ1SXVdkZ31IAnEEssO8L0QVdgf4aMxP69Qs9hD7DziUa7L6J/6u17UPu2o3 w7X5+moO14vOvDLpK9mj7Zsx0IgYIdZMOVvm0QnnBrrajUVGNKaHkYuuVYYmwyR8WZgkFZqTXQqh 1+lBv86mzfVdM7RYydLXwbDahfKVyJvHBRI8P3I+LOTCDmgh/LxCiyqp1pOhIIkVdvS7xszgk9zT 7ZfkuJNV8dfy2wH6KPLthEpeASYgVPbWM+Iw3gtCIp/KfP2Z3Nu54Wdmv59skImokX9/cSlZWotP 16WSPxCnk1UWHXI/PFNA5Ft2rZytJp0T3RDMwYy6uUzRgHyWsY/znQEzfhbZfWxnTnqXJfejBHZW qaRGoBHTU70wp+4fBBJZkxw7pYvncpGlzpHSmJXtlTwaqL58cmM+4TIzw4Z8bwfvs2iBcMhaA9zD BGiWVYFetBxwI9pVLamWBC48MfyVMzPMziMqzARDK7t+yryYwpsWEtDtltl++KGz5cIZvbmBOYsW 8+UJOCuEKh3jWiVY2+EjyM1rWyPae5/gWo3tZ18Fhr2KVkw0P21zFrlVraK/b/xqsqXPqgbCPzD9 us/lNhDFZlUL0MaisP0TJZKl15i9rHupEe5cADQzA/KdqL1tLHnnC/ZgD9X1TnAqx88ZpQVfj0sy /gj8VZU/gHr570EcpCfOJ777hXZD1s2NjTecAtq7xwKKIu3AjzW17h6hurfFqNqR9InsKgT4IYWn GVmbTJ7ubed+o6eVyqlV6JIjXMd+rnYngVOeq5FF2Mdtmo1HJdPDSylUvRmbmzEbc1vRIyhMuVxf kw0QWXDvSd7Ubm2Q69npDfgAQpsIWudCeATdAt+7nR6NAEIpEuwi8s/sJ1rnFomBELGRAJMsKstq 61z9hY53pexE2fyaCAZeVvAWGI2K6RlRWmCFUffVEOFTiVEXAfgXZ8ZaRGh2Mn+aMgR6C22PODsF I17+OJsvpDK6Js9yuzpKaCZZ8cjNApTDBCfkxQONFOYahSbbEYoEWIaoIg57XUwzYy9dOihvgSSR GQUGMT2Uk+2Y8S2ZfEtXU0qEY2ZM/E3WmcwcqRv/cANCZgA5RVMjMj+OhXu413tASfQfeT/R4oIB FF1I0KWJ4axcNTwD9U16dZMS4vjX56EiODE6J2odRA7mfko9hqViZ0+ul3UTKtSEHj7au/dfUJxf VcJZKaK7KpGP/Fz+wARKYYsjeyXst7paepsmsNS5lq0OZq5Ez0rz/rlQEmR9WyoBM6rgAF1kAw2v 75Ho7NFaLWp03/frLxLoyl7alQSFB8KXK0Gp58KImFn0J+jUmIcNydwEwshmdqD5AkCwL3dtQ8ll TpZJrw3PpO8AnwEkLgYYStNKAsC19wLv1s+tdFU7nfFPolaEV8R3TQTD7EeuMPSd+nX4siQ7OzOM HQJwREYgZ+cfyxQWpJL+hwoqs7HNwQOgSRSwPhY/6VFLnPYNanORftJUXui+YTvkKJfMUuDLSJKq E93C8Wv3Kem+G649PGbhb00RyX/qCp/1IgRin/Z8xFZ75GnMR+f8zq6naTo+U948VNKLHI2dd1Wu OOm1zngD5QICSi7PeEsYnGolljs6Vy+BX0ukJoi6fNTGHpZeGzHXXaBbMUa7+WEfzTiV17ajfsij Ab4AvDlAzV7ESQGkWfQxb7aljCNyvx0q12FMkqXEfphZHA7k9rEBJlmOqKTzHW4c1yJ2yrb1kcmA 5NNxkU3tW/cMKElvzTmHM0hMHzmSzPiIIkXdJ34tH5h/+zCKs40ekP8Usfdu5AAZiHvQHsauKEWa 0dZxqAFYInq5ZRcY2aPgH1B8JU/JgZynifUWZp+yTXNM4st8eVUKwaJW3lNgx7SB26fEBQdgV+tW XX4kWdkRxuNlbHJuvfIVAwzd7s1KM1xnkssWQbAhglqiGiMmsgp3Y+9WAhjNjEbiFYCOGLfpkYOt 0oxVvT0rhCh/OBg0l52S+Ga2P8C4aHj3XgBi29kuO1wsmQPINfJOn6kWad2wZ+zlzEZ87fm78WWN 99+gv7de5VHHrQoZfad4/OseJwGUUzFRl4Pa0UoZfTTzojQazEyZGTqwPt1wh0zms6nFBM2ypm6p pn3fAuPnbuoTIYPHxTCEipAZ61LbpMKH3q/Wac9MfWBcigKn62PXdqbLUQl248NzwNMkHLcdnrGe A/+AuSoep0hu7xJXPmrEtwEUjfupxnHTUyYTsEFyO71fvrTGuq/vrCMRuW2xq5UyjobIHWSVoZ/m g3Jn9M2IA5BgfQu25EbFW5DudfSwmmLl03WgIj85kG7k0ke89R1amZcOXVoe/b2YpoShHl2sHZXb pZmrFsIWfHmzt4ztR7/HNGfLtBosDK3FDawhiDRjUwsUI4L+iaxtBjSx14spqx1Aj6vWPJoKOMBU 9y6R6F16V51yN2bri/0vTYwJTpCq/ECLeNHYUDtboAkVNIbVpoLH5HlhikWFITfDMhODkgtLBb9u SBR6aZ7q4gBnMZL2UuDHn3i/dL/gDNjTOhyW3UwO/aeyu3Mb/oG/35N+1iv67XyyAOsU8SCasdKL z8ycPdn6yIvmptrb9cDY4H4t4wwCDQEeW9coWXTxa9XrILR6v+gvARXwz7uQvDpxmA5CJ2fCYbOw QdsLu9Cutgj0pzsTAj6lLs37R4gj2+TYgGhU+cFr001weyJDS3I9EyCvlOgVRM527y5qc7SR2+4t xgQKbtnuPZi1zfjefmsywwvxnjAzS1J0apvq8aTULMk0bKcPUk/n7955YwiovXCE7eC1pRexhR50 lgxR4p37G59SCdoxX9xZ8EjaW5zA/K9wcmMlPTpGlxDUJaA6PBtZRmFGhezRiFnoVtqX9fCJsc/S Hf3G7PlUE9Zi5b+Qd9jP8cGaM6XbPCcqTXGerKIpMKfEisAcgHQYNb+bc0FZHQ0Sxg== J5GhpID2NrBo0neU2aArMVSLJ/udu4JtcwZNf58iwvShu9NOPJxVYRtZIirQOIlrKxnf2fNoJ6za gKJUWrq8de/9oYtWYiMPKyDknmoe8/MT/KbhJ6xIGtvLQhbVIWAsCIL2bojOktLV8fcGtOQmR+or b+rgpBgvWQ6XOCKhDooDX4TGAx1RQFnw/AviuMBcEs61d04gJakOdnSDsmgANng5SIdojC3nzMCk 66jpNLYSb7KbWK/sQnA47wAiUsll//vCDhdA3Q03WwdRIkjpmbERlCOgipnrIgqo4TMmcjfe61Np TA3zzGs6SHfjKxwMrbqoY5M02CKNznL9Em/LKy5BPcIZAwZCGDgQjkdh+EG+A6CV+ftoPjIgFYOw QbIeRylmXNQIuVK13mOopkfIwGoKqNrkwQzjOCMUzFPPjMwALXAw2UIKaeSGXsm179FhhASO2Zbx DOHv5cSYGVDLSligGWfIVSVW0UdtrA4SVWmBZH7HdEPHvvZCPa7NGrG3CnT9fbbjbGk9mnkIy80l u9TY3XT+m3E8X1Ue7Nc8tI83VkkvMCwRQcyVAtwtD6ApLzQ2KRMdfaeVYA4YW08gX+GjZn8HiHSH 0AkO75pVAwx9Ikz62VMUVwflhV/GOhl3+xfGJ7YOv4VCeSYzZ5FzVZk3k0teUmZaBQwtBLSF8XXu zmuBfcnL2AJDfs7yMs/gp3v2l7TKeK7IMDJWNAek3I2FIHGSz83ngmNDtyGu5f5p/h+pgOdzfTxU VH4ZoVtm4z4aF6TKjsel1zQt1S18J7bVWS8w6QM2QbuysrtUeDZPRzbCmYWrN3MPPVAbF9RIdm0h erg8MrKI/1zemKVJ5c5tPrGqOlINjnVcqdX8FOVZlb9FR2LYoGvp77HBNivFfVztgn+esHYyJdi1 D3rZ8O9gTfSfVqq90fW3LwFer2WvN5GSrLb9rjuxCY5XlSOxAQ4L7dzQLKW9yBxdB3utLNWu3qHn IXm5mfGJVnHiziFetBoCyzAOekGH9VH7+8l+0Nc2Fw91kuPLVizaaueyg0NXMjM2l/C5NfpYPmB+ TbTTESscYm85UhWrxejneYonZsTMhR8oe6XmZqbpOm7mUlBUQ0pL1ZFKr4vsDHOrI7uJsXgacmBr i6CDNbfa+eyjwyu73VZmIqaTHrK1ojX9PTsMqwrtE+iLuBTlyXlyEV7h4jzBU4oPcbG89Pof9wc8 QzN2QVCJvzTzmergehqLvO7vse8PABUzdm0bKOY9RIc5oHku1O3KxQBCaVabgsDP7DyyO6hyRRTY mfnRrhFevv09KD0eMhfZwxoU2FK/hl26AmAzniywPixo2zICEMRqgVXYbTkdq+qoqeFhfcAMHAc/ XZoPuB5qdKuSB6Vk70+QqHs1Nr/yId4VYeudifkP/H1ViwarG34tm4pZOH4aWxlyddtfN373gLBe ReZRxeJnxkGcuUe7HKAd9sWp+mujLuwRjOp+w1sjwIczFwYd2qrMh5vXRN6ZSjiPDyqogKrSQ7qd Xn5ujH8KoAZVu1EJN55/z26YIj5fM4pIn6W43xLnLGjcFvHRmTFI4pyjKr55/yUSV3nMxifYlWVa j1ZFOwRQ8JCzx7rpTBak/76j4wkzKL/tacW+ufq17dW1iBL4Qs9DSMJrBWkvIsjJAQzy2vB5Lmlt RjAXj2AQGOyxGBPvZu40C+ow/iJ3GD7jso7cguXmQj78c4rBqYl6TXFDPQp01rxO6cx3r2WtE9xJ 0KtsaBN1GtCrsSvVBJ7Mjktc994eiv1hkSuRXzyMiMHvdv21SCFhR0djI+nLzE6BJk5wg9E8CnaQ x7ABRIXlFKUx7ja4Ej1vQJzWlsxdkw70skw/u6XFwroOddpHUx5hbSI2rMM++jXsSnShtiVkTVLD NvlfBjlSy0sfhEdlz03uQ4ZuWuzVYM5pF72CrvVu8KjDdtNHitdm1okMfrUw5xkFbITDttjhw4fi YDB5wTr69nN17XbEfy9j0iH0kB0zIxvgWvQ1xgD1WkbMAxhIbW/cw2wy8hH0y7/3ceOQsS4E8ClU hYXoRQwjSjEeheffn17u6O0D89razvnCzBjE6zYsYK+7kcHRD7+m+2KqtVEm0IwDrfHtL3ywUsDx Y4te9G4idMDhT0I4nhxVBS3/LWbuNrzm3aKiCQ9qaVggku1S7JvbSilkDeDn+c5IxwGmmPG8Rhnz sv5SfTP8aLd1kHDRCUp6k41UQFGNn4JfgjRxv2HR47CZZSF7ol/LpnJmsfcgQ6nvBY1P4bVLFm6e emBD0VDXqb5ndJP4ABljvczcJpvKGWYsJEZjpdyQrE3UC9K82lPymC1EFD5oxk30nNhm+cY+EZz2 e4v6LjTMYtitftYufu+9VTXokdj94bBbcmj2bBH45rcE0p1rcZs4HOLle+FFUkrjnTbF+GgKOFUq NUs8+wFGFc9L8wkhffL6KrcIJ8jhY5964I19CyG99c4yVB5PtgMsdnse0EB//X0S81XtVzXoLn/B nAnZ2kkOmK6fGAcr8RijRoM9PZ+Gh5auug16OC/GjO8TIG3SuKAiom/OukgHhTqNhE5QPdSN0l0Q xLtbOpFwX3LsWg2+sczon/53E7CJgSHHKjGiqDOUFCdXK4dRut611NUOcjg2VTowY5Wz2icuaxpZ meZ23MWi2kG0xwGQ1LTaA0sehgQg+Kt0/v3nG8ilGpLwRIxKHMC7ZRaRdFCq836dzoIQ4NtmRGt4 F8X1N6PaT/6rv6NLq+S5g7tID4nmpUwzL+zIW6HOj78VgHSlpIihdiODKlL1vE/g4pHUEZn8s24m 4x4rO2YcdJPQ2PYbvp/7syU26gjrakasnu8YJ7+dFpik7F8f7kEPJbGLZ3JJpIElYDYwXuQx//sy ROnyw4nr8SYlCjUjHn6fAL9no+0gJq5KiafXC6LgFX4V0jdRQOgWd6MgLeK3f4MDsxD+CH7WILnX tQn6HDjol3mlRsZJ2WtL5Igf/2HqD3xfzZB7h4UyeHJmLGJITaG6HQ30WwzOorHvC2UWYuiMXx99 3Y/qJO/z4hO2M4KfXUr8mbkz4Ixub8c/PKQ+LguopecWozyMq8y8hGmFRoYZD6H1pdCWINHPf68e RlbxHIChtrVnEsHx5QbyzhJG4n2YvDOc7v2oS8MQH12tMtwuiyjvT2hvx9SK7chC93feRpnE0aOP /JsZJLtfE9RzURDLQFKD5H7CfFirHvsV0S3oxkYQm3OaECSF1I8rMRdu5NlCUwgK+DqBfGYgeLVl Itmz/kTHgb84Txl+cJEc5gSKvsK3MZI7c8xCvnHJePfGbiDWIIU+QQBVDAVCvNPzkDR9sRDfrmrl UsGhN2XeSsL/bA7k2ZxViK/P80p6yC8Dc/d5bb9q0COyhhRaJdTgYKykMp9Cgfu1LLoSd9qrwABF cd13d6Z98WGKwrMGnBnaUP0rn0P7IjuHn6uk8z4IX9SSuw9meRITk5OsBFT+g2YQpRSVNAPCyE2I GBtvq6IxsYhL3I25i7m8KR/SJrjvbWJ8HlOUcaih/IIZTTcOhRAoZx5W04DXN0jP5Pao4M+si0nx +gnU+fnH8rmxmo7c5S+aD1lrCGPvkjIyNwMRd79LBhf28K5PiIU4SYGr6ETfJkBWc4vQmBX1Q/AX zE0JwHZOwoebEpOeNfv4fhAyURqTLatQHvTF6Cec7QiZgMU2QLwiQdLwWYFzJGnZvjDmYsKqrKIZ 6y1/7ML/l4fVhxISRZhYVXnsCUSVs7Y/Cn8Svv/5Fn7q3r6MzHujh0aw1zgUq7sKkfYM5HkmUstR +QyozxL8/rXTf62mfnNnwcg8Lzymg/Z+wdwfCa9bkZGcGannsclu980gHxr9FRgKICa+58kKhZ0b Z5E5g6rTBBTYhdkY3KIM4X8tp4BsPu+/RA7yIgxHj0PnF83IkfToFVFiDnw6PWpKYUSIZsaC3Mlz 5bqcvPjn9z9HyYPkcuxBPEPJA6KHuoPSqHjAsn6Lcs/H92Nw8KOES49U9y+YSXHUhbLcW0mFzpqy 9Q6LhFRMIr/5+0Osa/LafTOB/19k6/v/Z9n6KY61fkvKjthp0/zxxYwD4ePLIL8xa5D/V0L2zl4z Cd9xiP0vrX/HWmlNJ8sb8FP3r1dqJMPceJpgP4svhaET4Gbf/HjqnTyTB4znj6l3UlGPbKL5btCA i2uByW3eAs/kqYhvTYasHNZeqX53yA4wqiRqXPFsi9auJuA5s4HUQ3AfLumoKmH/yXbk2wg9Wp9j 3HKoLIZ5CboiunVzdFk9Fdn/UMWjXieLmz9RHv1AJoYlKkWKRjxDdrp6hDMdljzQG57Mj2T91kkN w0hvsUKgO3yI0pilYPLUjPkQUITvM6gpYgLlguryaLtIB8NlEbH0Exl3cxUqTxt2/vQd2hc76nQz AbSJyGGS0puAhnIiQ87K4cTyxnZAW3CyRT7DG7xJ36nWNpMg4eIoklwcihxHSnaYsX0hqPMBSlHG fucALUh57hTFI4Hy68R+qMnJXAQBoMz/Vsmi+WtiTkWYSlvAIl7cAq1V8ZajUsfuqbKYjiV5un8Y rOLTRbX/XpjN9aIBgaGv90TuPlPa4LguMr7vmpLlWRrXEmmzefjsLxi5l7kT0OEcVXIDxRpLyJcd utKiYG+xn5gqwrJ902s+n34thh0CU+Oh/QCOM8tHk4hPdCONdskrWtOb0lv0k/z04gtmOcMgoz3f JJMLhvnUi3iQRxiO4aH3NSLgMJTeJkFd1ka9TZF4ikOMcTqx9e6IRKfXqBfIwFy9Vpg6bHRsPUEe NgS85qwO4VDt3SbKr9DXJEKr/GWIF/EaALImLIBxAC8J4jMvHOA8ZBp8EJg6TJBpx0waT29H5wvD OWLGzm93B00vriQgwGA9HKA1nTlEYj3UBB8XSPDOm5YLT3iK+HCxT8xHoNlKkU6zdUFe1SQ/ayz1 GBWgylmvndI3xR9omdakBE01jOERiGg86touXQcOhHoMOFgnS/eozxpE8Knc/wq5TWwA/lafBP8R El//gtaU2e7tW8BrwyKer8gBh+7pg8HmZ83sjYzIj8DnZn5YXXrA1GDGyg/GAcp/j2vXQwJnQv0N z1e7VuyBbUgH7FFT38sMnh/GNrg22BeuA2jeh+gF8hsBKv58t05/xIUVYOqX7XWHrIAqPJwkSvP9 Jcj6DSF46tcnaERPRKzVWRJk2ObhB4O2jLnUnpQlY4cjfjrAOMCs5H50SDpRisnY2dADYT92iHqj 9qKNu+SzSMF2rqAa/XTiO0pRBQ84SIZnXEQDirnMUYqDviYLHnNfjKHow5lHmE6A9gQybCLBRi/T dOEk1glIXnAkVFYjc0Ys3hf8ygfMe/P46XNxCHrLLbklLJrmMVMTr3oiNo+VAPzmgmpfjPqIHcPl OnCsCghVLmJ9AWvA1LWj3stBmcpvQZ/Av0+FhUJcTLlO9qc3oieX2GCLXs3yVjSlCQ== JiGR5WFtmYokhj3ckh5ROskhiXxcRUqqRjqS/Kg9MjNGUFKJAqpAq76M7GVpwaPEcbOVgu/Grl0i 5k8ulL6J+mpSl7Frn0+YmzCexoUw0QC31CI6LlJdZ3mRbgOJpcwIQZQmyK9xvGy6PE3tEVZt7iLr haPrQEG6c6JzMWg1H7gn64V/BGqnh4f/A5BM0efzz0vjjuqoLaHsxiDFOkqEBp3TQUGXevVo244B Eg3mPILMP6D4Y9cWsrnTFzTjww8hMwcGyJscgHIWZhySnUiUnlchcQvirumWc+EqgDdqREeVRmY7 DaUXPa4DdEOE5DlVWEwM3R3rpj2ndK+NeviBOPhCkMBKr5zYcaN10lbt8nhhTIdHvLNuVrsEutUc vrfY9wLUtOHpBGfzyjkheXlcbqVVX+ae2htEsS51H2RV14wCbixpO6ytoLGzfma4xMaHyL7VtQR6 bhe+eaUAalO797Kz5uAewF/sRhFkL22eNi9ttLqDbbsQB4A7bjxeg970BY7dklJsiv1tAFHS6xZs AC05eUcGQHxq+7ISraFoch1wi9iX3ktSAy0QweCVs2hl5hafSJdAkgEb+7qfQhjLkyBCPloQhObX FEYQZjmfxiRa0gkkY9C+EvDY5eT2cdGpgSPBzEj9G0ubXHK9hnPt1IkaWCeqJ/j2Oye2txY4ycgO ZcT8bgXcBaXQDjkOwI0MSZkLFPJJRd/dJwGnciX3wSns4ETlIhltGThS393KzOxzxZGsDxngKQgd /MeQDTWfnmhe3ymJLWR3eYu4K4xFLp3I9ioJTO3BkLLeBxDClZhsA0fpywPdqmMmD5fMTsbDJLdv 1E0IFsN2b+FhPIO34J3CgjcewghBF+/Gh6JK3Ckdx8grj6AN20DHOltxuu+m3GNXW6+xM9aHJ5uA yrsTZuS3KyTkGl90QszoqGv8VP59ynDd0p+VRpJCGFxxE9PidWcOMCGthX2G4MY9Dk8RMV/W1rhm UTQ3jWKlgJwjhthGMpo3lS+NI1MeDsu5L+NAyNsvVjBDLO4+P09gCfrSRcWyl4L2+8DcqX/RItAM 45InI0Tvy6uf2j0z2W+btQSkqJ/6Sd5zaYD+0E11gqecwaNV3zkDb5+I54JQ3IyP4EZqzbPZFi5a pj4MA9m1JU7BHadw2Qm6MhjlFkK1b0I2n0L08LMqVeKYz+gXU4SZS9N3B/iwHQHCViEdsVG4guMm wPhRf2O/xMG3kV8+3NPQnGc1EwnnkQjEjPKqvfuH43bFGxe77DySaYWju0F9n2suUFvlksv2UI4T 44GVX94pV35P8m9GyUFJuqlA//1a0unmava8chjb4QbKbPcppEP59CpPuTxQHg02B3VOLqhR208p 7ZjcrD5fPhwPIjEDnVhscfYZ6IOUshZYKj55sMYSXOSSwQV+GS9AnnkjxMk9D931hZYMMzZW8Nij bcbd6PoILu1mHgKsvr2MfVBxkHRlx3Lg2lS1GM+jjuEmIjaXFmRS+MAVMKP8A99ANcAjkP4qOYBk hNH/btOq3KwzO3eeS/wBCUqbLBxzdEqEcRV5f11/PXWEEPlnRp3CfjTidxrdcnW5n0zZNYdjSHFb bp7vMjLnkaupbnn71wPM3MFKJbZHdPu5fR5v7rzDuzAyO3j3vpsQ45Kbh+D91CsjwCakU8Mzw9I+ QwNQSrxF+S1uLFOJ1zoEEiImFgK5p0lixlgimCd3Mw9XXzAclqU2mxkGuFw0BEeXFGR3zGIM2i91 FzBxGOH3UIcCv27xYnLj49/z22QKypQZ6yevLYyMQOA788+ztUqPdShL3wUyP9mzcPtBZoZz0qkC 48baubIhjm76hXDpexQZYwDHK/BhU+RvhfCuGzvStkYDv1mbd9r6GMAIBbiRkR2e3EUtXB8YlzS7 h9QLjXhPIF70d5pREkFsYzg7sk5fPq0tdOj1qvPSLnqU/5u9d4Gy9SoLBLm5hDwrPC4BkhCoPG4S IFXZz/+RgJDckIBUHibABBEulbp1k+rU41K3KuFiq72mZy07M2P3YmaCurR9YhtHxWl17DXa0m0j Ok4vFgo2AkK7UEdbgyMJEYghZPb32nv/5/zn1n/uo+qcyjm5Sc79zv73v5/f+1FXRF+Z/Aq7U6f4 ZRcz9EDZQiNBRRkwicyJX6rrGDnqpOYFtjWGR2BifUCrZAOSFQyaRjqZlUiUvBg2OsxDLcM6KmMS eq4pWWN8l1RezA6GZMTD0oc+8gWaK9Ep8cTHsBEpUYghkMzySb0tAFfSVKdyiJyTKQmGCHSCXpHC SAe+qKVfqXmmIiKJsTdYODEuLBrOqANN4WORSkrxBOciPZOSjjrWWHKxIgu0tOIh0uhW+G5Hycxm qMyijRiSlOdYELGImqYqVniLJVnQkSeW2BMrnEuVC10+27xwH2f+9y5V7MSKF7Vsr9RUCW3riCI4 DBtaoqqU+hU/eSqZIaIlpxfBWiAcyOLEaww7sOIDJLoAClqIV9SlsiFeBmt8Ic+XlINdZiAdCIvq pIYndlDLu4yK1fyk8p+jgDHpoIihf3EVi2ixcxh3x3VW4gR8rMAJBWVjiCDxgNjUO9szgSIqXF3K X411WuLNxcs6x2AxUMZLipONmqKi5KIj4AkhEklU3uPrajHHojOG9IsBtRWZnLxsrthdY+2Xgtye EIiBvQcGPw6p4WM+mlhpMEnxsRoBlrUpxdJQGKmA49lkBxJoXO0wZrlekhMor5ToRPEObYt4NuN5 C28ykbEUSyT2mxSLcjTK6JIT9XpYFTGmEohEkUZQRsnWVNJWyRRsxViuzJBBqhWmSgl7QlStpQM5 g7qQ+ouY/D2hh+M+XXvREHEEANWPlJbZDkBdR0HSzHBDYUbFO+hi+TGVsr450uVTB1W0ejoxXWCv VUQkgqUrsmLwCprUgeR7cZJzBUtDlioiEsswV4mwnooXqiryQC7WHgNgut22khl4Kwy3ibXSFKfD TbzpDFVs0sKWlD7CKjltRsRMLE0ZHezQrWuOwTFcW0vFKA5IgEmRAQ0rRiUloY5dipuFE/8zANZ8 qjnFIYKcYJYYDhjwSuwO/xYVa07yQmBJKyfHAbdNXlzXwnhIlbvsxazpAlBiBIqEvfLHuXYt1N2M +yvlSGFMRo5zKlsHYCeovuCQUIAmJr1Ipb6KFGrq46yK+K5UHQ4Leor3IpfuRmAs4sy4B+p/aeFm fZXWE5LxS7eRXGoOCaC7I0XQwD1E6IKTOnA6um47ytMs/UqKLqArwjhBnVAjKjChovCyeKLlSkG/ kdxp0dQD2BZye5zUstREqGm+XE5P61gr1ZHji3QgSTNcKlmpKXIoUjyCVRHTRWMFdhsFgJgjGcFR MmGVPL3L9rB5OgXnOYkSm6ECcZFPY7cDLH9aSXwxJRaghpY3ssyfl9rKjtAhAZ0V2iIlurWJXlV0 f+X5dOjYQoed1sIlctgjAH1ECtkBBydAOTKsnOTyq5UgK64FmmJ7XFbZWJtcZC+kjhsUdi2ibFsU As697IR3g54rcbSO4wVHGdE9xaTh2LYUPbkhjRAW/4tOeuxjgVX+bHSlS0cc3O1E8yBVd7WNhZhc rHynLSH1uI30vIsKoWzHXMbjYPk5AopSrXFkkp7cSY51ABY+Jm0Q5OGiLcyltFXYNm5ZrNTqorXZ pXq17AbOe+5M1kHEVIrrBvtYsDK7447MA1WULKQDVMEyTiemEnpNKt4qDctFxYOzRRpB4ZpqAmyr U0VnLn3sKDw6AakDn2lSpZIdFJaMTtJSQzLAtI8G93gKfCzsHq0KuFxWdPLsbYpv8i5Svio+73R8 nnL7ITDF6gqmBbY+Mg6xBK720QPIUdgrA50QMUFoABM0G0152K0WQosa+TkGc0pn2FrJ2Q7gOuZG wFwo3AWbkD2boKFkp5jX2K2e3pZSQTgMtYuVQNl1OzsyPoZkRT5Fe4nrRD4nnsNiVhZGyLjG4mc5 68JvjxEXsfQYgo0wheKur2MZJxyTjrOqo7wjiSiwbdQpRORdxPwrlgL9CIgZQukeiOMkgEWv48RR FYCVicEkcg+K7MZEHxUsxxqFRpdqtIqGnmk+ASWPkiOqJx0UWuJIYuVoUCHFRaykcLSkbHTE9crz HLGTY/oys584KrcOU+W74SgSWZ5XdUp2V0hb8aZ0ZHVnYDQxRJMILoxX0cRQ+7haYgFiZhtgVYzT SqioiOXOow8zjqoSxSbLK1Bj28q+GklRTKW3YxKfVFE382KQ+q4lJbLoxURlzFlppRYArnb0F2O3 FdiWxEWhXwJ1EHbLRwM+y2YA1CJeiwyhyywPbVZ+HCpjxaxR5P8LwDqaB+MxhvgtWddE0eqMVMea wHWutqfktABMlCdqQQEspkgn7rcANDqSuUpLB0kv5qNeDDqoRC/GNilsa2MUmKxLTemhCah0GkEy 53odR1BEF5mIzutMEx7rjOEIvPBhupB3icoxOgUgUIuhP1YPxdrjiXax5gPaqqj5YPxiVCwnblPI GtUpF28xTtCLddLj4WR6YHR00bEpZxKAnZVDwHmBsHR5FQ2LfBENxJiIs0RURgM4GaQ9UQNjpMyM t/EiG0OuLnTjhKAadBCOjoikdjAmRmNHL0JsGS+MjRy6yflIRFBSOj1xVhz2ifXUq+gazloeY2O+ ekuk4wB34EtJNRsDOLB19AdSlRRfTz7MbKRGYCETS4oeAEf3Ka5QidXXY8xumEyq8y5u4JgVRDqo o7dvYbgDl2XTYU98rDBeiqst+pFTBy7GPfFopfJ5ckKzlPEOiqcrEzPGGoE5FznpiBABbCWoDNVK cwxORxGlvQiOzskcDQRALm8oHt4ErEtJe187UbZAEXorSxbDlgGsvUQpcWFTAPoYFVYU0q3TEr6R FNLQbfSgYs9cWJqkW2NvWwByqVFxZJYOBFkbyU6QL2OMysChupi0WJUmdiA+MkYSPeMICkklXLAF AkbgJeAOhWPZX3G+NKKwgQG4mA3eWCPAQsIUnET84fMxriQGIzIPSUDHM3DR9m4yNZJxUlfex1zX eBi1OJNLXXvjoiSfReYh2As4e1mKH+PAFLwMSrY7GwHwFPIy9q0AoMSaGYqbYKTCW6Dj0bJ5el+W Co2VIm547ZS83msJyojeq9g2xguyowECC7m3nIoCsZSVdLVo/41I0ViJamMibDDPrQQESJQpzE9i CGOKQULA0m/MCwtgw469JiHFHBhPtyYdKgEj1xTAQodNwnQquuk3gKaWE6cj1wPgUq5idm1V9GrV SQrlsiR8DJjFgoobgjhisn9gW7J1cFbYMUmIpiUNKwBThmA0gwo/6GsJnGInH5Q/tNTxwJQ7MySD xtSg0f8JBU4v+A9tXXNRYpXbGPt1VBGIL0Mm8kpohhXnTWwbb57Y2LTLVpepECgYmBBrCokRvYWo y000x2kbbTbgEMFAk9XUiWXNUNPD3kBcJEU0MogcEOxqUaxJsgzNbhio2fN1voaiWA== M/Fl7B6CqkElgWocnY66RS94MkYwkIY0Vk4hb1sAYn0zApJvMeptY46T6PyEml8tmWtEgwVKbI5I 05LlDdXlxstquUI6SDk9dDKOQGEgyRKMIZkznAHN8ggSpgYjIbOvmph10re76HeiKfxkhiylXjI6 cUpmsL9Ktggdk3tDU0njp4mFEGuvyKJa/CzRMEwFPXARYreukEr1SYWmYmlqmIWYBFVeiIlZPbBX q4L3xiUDiYreS6BWLQtum+ozkUkSrfOc0l4ntE7OBJKhxUqetDoyelqyTJCDgqThRl8E8VuQEBtN 9ss5Bhec9hPmS461NRduo8GKS1DKFamzWuR1Kr6hY+bFuszujRRrBo8OjlbTWdrDADalnDAJKKqL qM5VyZ/BEwNBY43+nwAuK0m4JA4VAX0ZGYEuuFdPOnMEYgYv6YArzQKYfRTRAUcOqBTZqF0UDrQk amOwkiXXXJUkcwBqdhDTqVsfc9vZmBdYkx56YK/g4yXbmAoh1CZGqKes27XJKEs8HuAaJ4XCUvrZ OtpwtTAI4CpqCpkBF/OoQKUgFyGGOlcpYkSTk0ZMT2qlslslbq0+6o11jOODvCGu4A6iKyP4JltB UzHRbMpzoKUQNPg2K8kvl+U0cZE6pwTf4MhdyimSNPWVjZl2dVbGG8B1PLLiRWyjdx97FDKwlLIG qepH5o2uKaxhBn3cRZObziamIC7iXZaAKnC99zICFOMJaGICfskOB8C4hT56wUG/rOTWJIbPUGZU H3OUccQIxBnYiKIkoUGlSTnP0Bi+4F08xrKxOtpwuQQddaBi7KlOIStYraaS5XKS9jsbVfTULYvs 2kvp8zLGJOsY0gBxS4UcIh/zGWA4k4ClNgQAjZQ/kxDTLB5KJ0UFJkQ3kqlQElgFoIQLmphXLgDT HqQwVwi+8lIpLEb4FNH9V6eonYLcSBibyiaUPi97xPn7fV7OhV2+Sx9TlmSJvADKFgWdZS4rk/FA U0aWGQzBExFIx6iM0kZv+uzWQ9RmJO1SUbLI6wUh9zaDkdKpeEpWcMLEcCiVV/sRX0IVfSR9CmpW FOqBHfhYBxaJJefFAM/HiOG42gOkQiilrEHKkOV9zMGsY+5XAKZzyA6t2FIyukXemapySTlH9kdF M4KcLXHcRyNATOgWwy98rHYKhI4zTaKgGzPNseM+nGkr6SeTuzgcNCW1JyXMAICVlBBiNgo7qCI2 jcQL9p6FeUXqiDkBO0k1WNfWRLBRsZKDi4lEJN0SJA4ykrNEDAhqNqsUXNENQLAwMpBgmFOl6RgO 5VhFQ6+KwRZYM1UOcyzHq6NqSok+lhJYxg6kLDukArXCdEkEtC2hK14bKcueZVdiHEEd+KzeEYvo LTmI3hkziZlMe2BTJjFMQ0rtKdkO6nucBKO7moX/Iqs0kjxmAFxokfPJIR9fVglS4hvdMgJOoabB JSQ6SAMSXRFwSsmbtNDCoVhJaIpAL/4xKhlb61hhxyVtQ9LhJocuABbiVaiSq0aKXXdRE6XRLUWc x2vRFvfMQKZWRTnCUarFFQGXYpGRQegq85PgEhRoCzDiexBr/7T0ywnj0CYTHZhANbnC4DL69XII JQJjCYIovoGxyBQCjMamIjJ2TiKxyK4jHhTi8NY/ggNxaCKWsYOKDE3YmOgPCZqA6Nhry1qG66Lb XgzJY+OU2BrEkhkre6PPiAys5/0yMJuZMDBUZkXAWgZWireDSD+Zec9Gd0bHSVy5aTRmRucMDvio yMknOmf0vF7GlfutgFp/RaAxvJOjhxGoIlCsMDra51xm79BYu0faFjb63vjoVyBif4r5d1S940Dr uCSJnsuKasTE6gGalRCppIY9gGOqBVQTzLX2MRdz3UuiL0tTlVz3gtxTQGdpMne0mEHBRN1lHhVb cipQvvlaEuOn+NXI0vSNQFJT+izADpnzFQHXMZdEJSUJAFyJ+g7VPnPtncydivx//oTz/wnahGJi OB9dZU7pCJ5rgAMHBWZuyfFXtkGyRyXhXxDOwJUWELCBsGdw6a+AcIZhAvoGuan/C6UBRBs+Ugjj smT3aBdGnGkyBxHIEYAo3sTYElREUgFn41ImXARTwTbjhLnIzPXGS6Ay2uApBBEybSZFJDAXyOqb KnmIFJIW3UiReXReIlOtgXCMInlKlVQuxZTCT6JykhzewHJDDEfLEixAMQAs+4oLpnE58YuG8FZY 1goqSxbwBXIrYrbFMIsgcMTsitojNVOYnzplNCUhWjnKdUBAVm+guz8rxEv6O2cRpWZcaQ7UcGzj NdFdGoCUIwOBxDSD83xEOZBz0aN6SPnoxx2A7IsKIQgpj2lz8Fgc4aSOGZgGKSUpHHZwvl9hTT6n /kN7Ob4ceFjEEUCgialEfTt51usqyfQArqhsNBxNFXX+XEsaHVwsw1iJBf5Mrk72BXbfgNPCgQBg CSa7ucZSzdHqQg7U4DOpYgdWwt0A+TPhBHsSuU+ActlGoyAzleIKKTYiPrzwskqJjagVyDsFvcJi LAzuwIsHNZBQ8FV81xSB2Z4NTnhUnAmNTER6wQVODLFQ/wSvBDiFGXEnBpMSOf9pL/lnyGiLUias t2a7CRjlUAGN/kDi8gSjJXOnTpcS1qtGdA74gck8XsWajwHW/5AOFCXuh4OQbNSIIxHIQXu0YwW3 tCJjtRxE5vrAb55+cKAwkDTB4OROornTKYKmAvUJAyWnKbi4kx7Dsb+w6Oe51rPTKVynlsLcLtaH IRdwZK6cSVmaUMFPa+ZijkAAOkrd4WIOBBhBXeNOuIw+oz+9qbiDSjvxvc868LVMQSvFwKiVxfAD rggQY6YRaFAR4iyFvcxQpAPFJjmb6gxQ/ILhgYktFl9GJVwcee3xLhAv4Rz5kUkH7AUIYEpZSTuG zCUAixiUgE6lBAQuYUFGQPoN56VQEMVaUJENOM4Mwj1CUEzAj2EdVNnVeYlKxAgOcpSGPgsXgVy4 w6ESQZ5XjhbLc9FFDE2qCn475tQjIJuOXE8UU+VK3gAdh8plYV1MotZyiomWBYwFmeiwsmlA2hkS R0ytId90/xfE3aDA59wcDpn4FQYG6hAPoJM4U8YPLlWohohUyonvWEV6gDtg7bPTMecIRH+SxRsS 9poYEKkoKNkpuuhirUCleUDLyelJOWEmrKa0kLyohWKuIQY742ElwwSgMPbTAK98ynoNhmorrtQF 5UxB0TlZSjnMJJAhtpagJzSzPVqqj6NjLRWKMTqlFEZPaKqTYGL9XXLFJg7FSGQ7Om2TsRes3JqO NHipE2YyJjltg2OG4j45lwyZPtGma9gsLR0AFuxry2o47LXwg99vIzNnoh0NFoXiF2D4JnJdbPsF YHKejJZiIbm8KKThBe8BZWQBg7AKG0DuB2kHAsUrCBy9/+GMIp8EZEFYPCeWOGOjLhUtxRUKDJRq 3jAWZqWpqZOHvSLEGY6VTUV2KI4FV9BGBzUd85lamwfHGDJUWwhgNoyUSlkXUE+xFAkRcOTuZAtJ 0IP4gzw6bZWtIDJ9iOxAE8ZxJcrKfbO1ZIpHu6uh6lOK9jraQguhblJbsoaKNHQzU4ogCKHm2is+ T65QSrw6ZJfm/E11IbovQBiStiImEncuN4ZCIGLBmF2U94BcnNALrFDagoaIKXVBfiiAF7WCu2xi 0gtOgN78P2G1JIuB9gQST5CIVktiMdgzRYljTawxo1KiQ1NTYZoAZC88USl6ckcCAzYnY3VaJqR0 7NWVkv8AA6Ml64grpOy9SiUOQ1tFVgOMpuQ04TXtGdx4YAKo6jGoXckUAFFrXDAeHBAVMicQIEn2 P4wIcPw4OjeQErmUyy5uCARkg69OOYkLHVlH1piQKQDYHy1comTsBBUzbj94DHPqLCiAUaKgAeJi rEToK/HCB98ZG9MqsxugUdHMhJ5ZjvlJdL+QJeC8KSAXsNIdVssZ7gBdCFi77gjdYcA4b0FN9d8J tbEh3EFXjpuinEnabi7HBo6pMS4/3DzWQxquZ0xKcM6Lhkn1TdR20zE0XG2JRqDFud+qVEBJySZY TS5rBORoK6uTeyQosVk3D2iM80ZZIw6aIAqQ7g3OMZc7N5wdEtcQSCWl4jacMgyABelbEI/WnFLH xOgK9E0Tiy8gddpcEx3w4NaxCgncri3l5O2/inS3LTIwCh9GnsXQPZ5GZw285H1f6HJDvlEyd0Me ABATSJ9Uy26Dv0elJG1sQUp58OGQgvUlp/7RdZ2lUyxqjhvU4IMRk6OiGjLASvH0xrKOWBdQAy5L 5eItM9gAlm0tLWNxjdiUFXCOnNjwTTFlSSn5mwEa7Z+asAeN1Umt+Z4FSGUlOZ7dcoITKdjF8aNW xcpwBZl+6WhyghJXSsyuKQlP0ZVVYnwzNen46HYy0jJptGglo+PmZWQELigBJlwOLhyMYVtIysCn ltIEgfGOnM6wEIwkE/HRbQBcYg2dTF8I2TQpwQm0JAxvuDIt4YzWtqWkqzYpibYHLRbKCOjwrFIi dE5jLfeIehUtlo4FsnwpMiVgBwnyxIzdpfCjHBAKiZ15uUAOltzeTs4x8JuizgAwp3nRJnrPYMJu Evp1rFIEGceZxsA55iUotHDUCoyxWpLJs3QOshGngfWFVC5WVZYQ2JeipsGkAVWsG0QICvIY0PH0 lUQQqywWBJebHFGBpJZFRPxEOZSWEGjM3V/KTc4qLlQSr6w4yHomzy+uTPRKgtzeZJcF3zHJho/J uRU/L14uRayyBZ2ygnwQgmhFJm1op+2GDrrMrbe+HUEAT024pIq1b0uJFsQ+VawrT8H/yHxk7g2O VAjKRo+aUpO9C4FCuNBjAG8BZLgQBQ26N5DiRzIkcK+0rCBecAnF0lFWC9AE6Yge2S4OsSNcpgGs DrbiK0R2KMxcXQodislCYKGzO0zJQjADOeWeAjGPFBWwp5w7CL2creEbUFBt71x4gA44xsrEhCuY lpzyFKFXfByBl1R0oG6VzOYcFpRoPPE+JXF/hivJUwdKYlZNLZFPWA6BPAusEj+pQksci1WkS15g LFSQMdrUsRwMvIuWEGQSLqXioZouOmdYrmzcw3xZR4FVfK+YyYAqTUZ8Kzitha2SXRURNDlo2kpC QxCTU9Y8W6U6FU6SetsqBeUpH0O1bZH8EpSUU7A+JqJzlVi6gOsG7muBOWghZj4m8QL5hMKZbMw5 ACxZFalh4uFR6nBGwDZ2oIy0ZT+lfnLKrAtoUMpMGgFjPtoJQAwRfqb3CzEv/SyhFJfsZx/bGc12 prSdgW1jdQdyxa0MdD+rPYgtb2Xh25j9AYJBuxDRKm60iyatYky7wDNAOGqTo9oErnbZrF2MGyDw tQqHteTtkxxbNABORwhEh3Q2WIgYeX1A+nV0gPORRwDCyTKERCATUEoKDSCxreS4lXAPIPJt/EAr 4zCAyWhjSFpZlwFcTitD1Mo6DWCzWlmyNuZtAKPXzhS2so8DWM1WtvSkmd1WFnoAuw== 3caZt7LwA9j9VtGgTYgYIHC0CydtUkwLhh6IzVvx/gAagRIeg6XQBpZ1Rs8oa2LG2AESers03yr3 t+gIkMiga2MUi4GEmprMsaVow3q/EInpJ90rwj73k/kBDEEb89DOaLSyJO3sSyunM4AlamWfWlmt VqZsAAPXyuy1soUDWMhWdrONMR3AxLbyu62McQsD3cpot7LkA9j3Vla/VSgYIEC0yRqtQkm7/FJy 4UJUkKjojZ6e52B8jB1ASwu8CG3R2EEV7ewwLK7sjm0tq18dp2WtYikRyP/Y9HFHL2DwnuB3GZHV 0BCgpHRBYBYq4jswjQXuP5RfoOch7QZX8IEqFsQigDmcS+6BLzqlAIQdrKKPu5fwIuCSqlJqY1SU FMNYyTaGlUTIJcAU5IUWRTB6mSmlnHJpxHsEnTu46AhMy0nDMh2BwCfLdeWMx1BNhu6gNVEjD2eI Mh4DanXiR114YVStj2eosKI5dCry5IWWWHrn8rKHtXgDQn1xcQUvxBcMKnRy/MYgCaJV2miVS1pk GECtBhh4cO/RYYVKjV8I24KnT/yXfagUJ54Gb60KLC7iZUjEQFclrLnkliIPTAAGVB/dF7ESIQJL n1wH8GYGcD1bi32YOGBdx2TOYAaiJO6kldRsoFPR7AaZWx1nsi25YntsO0O2WMqOolhpK8ad0Ak7 B8VMvJxnARKGiueDkuz2lKmSHrZiiZXEbgSslWNPjVj/AspmFT7DrniRKid1rMEBjCt7UASKo7Ml 3GdZi7+t4xh2uom1ZG9yXqxjcJHwpgRgGfEDBkqQj0ad5S4vOewZwXkZKcrIBIXhmcSDMqci94Iy RQoiKqfg0jACyWxfWrmewFlYrs9iJQWt05QgW9Q5JdUWsS7W0Ctjkk6rxMkZg4so8ybQuMqnqCfe WePJE4jaIsJGauJ1KfUvvK3YMUZXWgqOgGOVY4oSVlOS/nOlZRBjuIIQpE8nV2gQTYzg01oCnODA lU4i3yhXPGJ5HaP0CmBfAtBFKzvaErUtCBqPUc3p36kp+TYDaq80P5+ys4CbCSYExQ443SG6WQCG 0ZUnAbr1GjMuIMc+4CjhG+CCuoB6EshoFeAV1/IlGiJ6UKT43Lag0wGItw1Ht6LzNrw/gEQMICet hKeVSLUStFbS104mW0lqK+0dQKZbSfpA4t/KKKCLFIM5mM6DebcUoI+cRkUnqE45m3FgeGHAbBMr zhQcptgAlqx6ikBcAiiH4cTuI21rDj/Gq8FORXhfPJmNfBbxBCgW6wtrzCXPd8NxPTkEchTSgLvV eg3b7mv71W5FA+0IYwByGYCIWlFWG3prRYXtSHMAgm1Fxq1oux3FQxFG8ldxyaIH7D7delfEYUF5 ShLFIUTKRm1CKdkqnZdssCBbcISNY+dkqVLKnBXojBhDYEnVqpDRetGHtHFW7VxYG7/WxtshMgT0 51jg1Oh9QTxRYFRK2/IlupljxAtyOJjYUtzMKRU5Mj6VJm+fSkQILB3kJbKH7SJQjEfFkvNhRBhQ qivwfPMxlAjzCQAiL+tSEk+V3rrMpV46IBUyMmmaK3Fg6iky1MJ4S07Ao/i0IdDWEgxVM+9WJPUA gGm3YWClczF7FoqMulYp/SdIdMS9gXdUlgqkxMIpAC5czOJG+UwAWBdOsq2R1gJ5QtheZP8wR6Rl AQ0D/YjT5KAecB+slXgicmVmyHSrrXhtWlFm6JRBBzyRDAZUwpXlvD4KcgQZ8eQCrowYUC2xssYm 2l2RCE7AqhagpoJYQM+03E5IM6AtS/OS6AW0kSTOWpMQHMiN5DXlqBLOAUGxpNoFXygpm+Qk8TcU pE+R4CwPS3yFSINS7tjHOoWl+J1iaJ+XsNpWFrKV3WxlTNuZ2FaGt501bmejW1nuNuZ8ABvfwvC3 CgYDRYg+caNVMBkoxLQKPP2C0QARirKy8j2W1OuawyIQGLOX9mEoQngJ2bVFgQhr2PuFPWf7TiX5 lA84wX1nfeC9aLlDrbdt4M1svcWt970dN7TikXaMMwA7tWKyVpw3AD/W7LwJ/WYJFilLphY2iFEx KjCRe/JVIh2Y7gC5H4nzgNHCJEnVZGJWWC4iEeaV8t5gDASuF9htqoiMQ88czSN+9TCvyrDVCLXG MgVFrDF62NeSpJLjfsFooZxQNOafwMffxdSXNRNFAHMFHS07ikAuUIbJIJEBRKAuUuLIMG7cxlpy 4Jp4OlWdoiliAI7i8jTyvEgHKiWxrUXdCr60khOpksqXlMs8i/Ii/QuCC1kujnLWWqpFIVfAj9ex OghwkzQtYDYlkLOirB0ElAhTiPYl2cTkmflBC0wRLRBsWskessM5OB7HxLqc6AOzaakUOWtpASGK jItzaC+rqkvxksOUy6QvDUNJ2ZfAN5wkOV2JryxiLbKkyMkhIOfF1VVKGkB5vCT4pSrFC7sqtHjZ KXmcM1TqOl8AI6oycPMzElxi2Pwba/phuEFJftElZsU9wOhZCKwmf0ESzznq18aSZVgTiFhPCzg7 lpCCGrIY7QYUmqvNJrTndCywWXOIF/KuGIMhFIZrToKZRLIDwTV2HF8jxjRoaSw7EKtY8qyIz/uY PyUgCqa6gUXAMBcCGqpVC2bcVAQKijyjSdZVMXEFCG+ULAbovjfiF11VNICSMm3JCDiLjitpLwlY OpptKXnaAcjJwuBVPkVSoC8nQmPep5hv2FXR6AJz1cT5QOmN2IGnU0ptJW0TZJvkN7GRFJIrsWM4 pFMuUyEzds0AYUWqWEF0hBcmS+qQWUnOCVa5VCPQZjKUJC+B6moO+RYwhVfWHG8EnuzmtAImVkJj U5KrSHQjIFd5dXWW26d2zKZAegnJAwGjLSRLFmcYAPFYinbqlCEci+zFJGqS5qOGPIKSnq5kr2+o 0cfZPDC8Y4Ef12RMxHRrOhbu4yyFmgRGAkrhIZMZ1fH9kgdUs40HRPmY0ZDz1GMmqUrSZWaZt3Qs QJ4y60DFT0XZHxQ6yZF8X1CBHcdGLWKUwaYt+S4kCLxCJ7tYI49M9YM47TauvJV/b+P1T0Gcd3ly cd4kHqywbZnJPUPnmlDQeEE+lhTT3Q+JT0qQd+Wxgg98IX60xMjjNEyJO0YJHnEckHmJO/bW9sTf QVMjURoxmWoBGjh+Hp1pDnAHgTnmthjUMif9VhJsJ4QaFDRWYvWkOoLhZ6PyCpqJPacxpvSsFFXp mxPndsBgKiLpmqy+Kwz2yrsMPNcHRjWggEuqogTmGg6tM6BpRDu41lIovOV1Mg4l+Tk152ZbYTCW GqD2nDKzvy2rEKrKZkMTBlUODLNMoprgArTShYDR/yuNeYvWXNZB61gCDdrqyLjVMdkLKpjTIY16 k0LAmHaQZ2cNK3Ul6B+czRx64egs2xKAmclobpOSnKLQLxuYkIPHND0yBmIzme7Ky4QlDbjaZv0y kLjybNkbQF8UqYOyLoRTlHDkfDOZy2rMID3fv8XLIEjyNdX4T7isID7ahGKaK60pZnqlbwcbx0Ap W/ed575O5lCM7YA+GihvhiLhKFM5cAtg9l9hsCnQowfoqpQsAM9oFBrAQ03C9pT4/oBOpIhSi5J0 n66WctyYSNVZITWiyNOUoZ2AVVbNKIFFQgEgnZHQK7vTYNkhyuHsaqpPKB2UdNB99HejskOSrCyO wGQp0LIR5G2Ru5FksuwpLq8jUVn5Uve8zErRgubAYluZhFQT8sZza8xi1vu6wPqLAKolxzbwQhzt 3b+VCzE/Di8loDfgcWSPS4PzA7RJaisqblayYwpn9sJMs6bgMCElLCWKEEbEikIVUh2NM81ivuq6 bJ4cyC5gUl5d9sRiqNSr4jIFhkPhBVxriVlNBd/gAlDQJsTX1oL60pkwhjL09bfWtpJoYK63ACSB yvG2rNmBbhccQ0MLdqvF2EFZbHGR4/4IyNGFzTfjEiMw5iTMdtfopLRo28LGq1Kmckgt7MUhsTRe aq9xokCT5aJOUzBZlYHsZSZKfFqLbIzpJHQscOYllDiVX4AOSgkRztq2rH7fIh7oiuB6x4+qv7gF uuSobxahqKKdzc9PcwV7FiCBcVpSKY+zTQwGZwcWc0HbFrBsb+PA9k0FMX0PEsfSlz5KQUbSWoAE W5ZN1AFVLj0F89ZkCmYgVTkSzH6AO/CFqzPcPkO2dut68B8onJTVvahOYXYXQXW+igkoqqhF17HS Z20Eq2YjSG15CnPSr9PcOhYARe0Tj9Y4gYHYww1d36iS5gXzRFhew5gxum9hGaWCLZRyGIByCTiY FQa7khRIFaX8mGtuBKjClNSPw/qqjg2mUs9EFZh2iIFSXBQV5JwaJ5VZa/TbeB1vGxrUrI/gIPP5 np7jusPQZH/CEH02WnkZx9w3J5GDcWj9Y8CXzTVPKmaEKnTcT++qqg+cBlfGVEqNLmxppPxtz35w KCSKWBWrYzDOnZxgo9c3WHQprQi0La1hHY0EeYLzGJV9Fr/+A1PNtkV0bQDvM+1cXwcyAm4pHUjb IiqPGr1ygnFfkLt/akjPQ5bIDDjHnXISCFeIZy1m+3PcVBxjMRuiZjt1ijzwTvTSAiagt5JBRbOl PGvpMn9nqk3I+V4qzhaK1WNE3oyeeiZymBBlrJLPOONjx7WBJY1p7WpOVyDmOMwMi6cGchh4JTFE HAIEOUvqSrzpkXiIu6EuJLSIL2DWK6BF8gOWltgBIADr+WWmqjR3wIE18rIZdGavqFq6s5m/IujN mBu0kloy0xeIzN0E+lQfFMBcjw8cA6h8EgDrqFGRYwSbzztWprRIAGbfH8eZ3+YYzCKO4zpfBGRB WO4Nt6xr7qD2mZs+i9dhPbg+GawC8sykXOSkEaLlQyD6aVEHCRxpEgBLJhKSBhuWm8pGCDmRrbFa 9H2iHXYxGXqiMk0gSiXSgTdFU1jJN7yW+o0AZOwMMkGlZALwWMXCCmdqwoS6FNcBQIm/MLHCqKY4 pAN8vkU3yany5/g2SBJWRU7VAma+ERMHVzqC2V1eOuEXKtF6il82VtuRRM6xLHbegYr6XCyLpXka nIAFIz5IMJUJy/VPbVFom5tqtE58BGAQKaaQLU8q25mvb4auaknNlOMlpO0zEt1S954vX0hNOAEL tiybp7G3CxatWqiI8AFK4owaohUEFpNpIeO1G0DcvyawIVoFLrGoXZMtBeuKKkzGDJJtpa4lpAhb ismlcsKrYr9z3G/4SWfj7euXhQCwgnI6nlwMUZwwBcEcfVPXUqpMmhJQYg7z1Oo1MGQSisjFLzEZ DQePpBpI2VBzJryxMpRtVinJX4xZLCgXn9LRfaKxsFikg9M01Zz7SWkpbSQSU+vWMksBanjeMkvx fSusXC9ZvrKS1Ag17jwzRyp1AjL/CWkz4UaJdt5wpiIv/BkAueKswfzxAiNGF0uT6aTd5+w9kBpQ s4kJ9pZmUURnsBoEMQpfKSlSRewLrAAOYInJrWOF3yzgq/YxuM1ngTlguTEx9Qh45w== zjG4IOUgOPsxl4rmGGIAINGo2PRslDEh49h063KnfWA9suUagCsMxtI9CTzHYFaPQ4CWGLAM5TJB YGFiFQ70DgAY5qmTxdF07qwWdxjwoEC0ZnWke433YG2uAz2Dxcf7x6R4BeIxyt8jI1KpQHo+IkUp Reaax8CqGElVK5FuILxKiniAd4Vnb5RYdhfKiHDYlwkkkEo6gkWIuReIueJIOPCmqym4qc7ddgM5 J7Om5RJaZDti2mJjJjUAYsUAChCLwSUZ2KR621i1hE6dTRma0hhszA8GQE8qNgjnExssPE8ytnW5 My9rXq2LVuQAZMdji0kDyUvLk2cKJe1iPhjrqyBPZYsYpZmNqcwqc5TCJlkuoUOLzdw5NyVYRZWI A6ySmkawXVwDD2JbvJZM0JXUPLElMRwzbFNDydCWMcyzVlL+EgZg4rVPB4bBdI7ikbGAJJycIw6N BiALCBmwoGT8PfhMwHI+NVUwypaxViLpNYGMpiDRUYydy8YLQo7tG24Ra89kPaSEAtkyeHpG3AgL Ilg2+qVnnXpJAZ6PFQ+HPO214ZZRDM47AHlIRffvSoIto+NCmpXLTbYJxziy+coi1loCU9ETURAK emNTaCYHiWddYBrRHixlifnqxVJc/1e6Ff9ES1pzAoM3Tcn3EdNPCVh7J7dXPM5BY205GCJ6cPRh cEHtkcIhS6p8JLE8a6zBGE+qzmozSKw2bAhXCVeS9BjdJwspvoHM8MJU4xJm1Zgqdj6oqEaREiBL VmBBt7qKmEVyfhtKpdvAAhA0rQgRV1ggmZPgJw/zAC6cFDowVHExw8+QBZ8FvnTQvMuQQzrUuTk6 UX9Jrh+PCREUZMJVuplMenzMlAxAFpwxPTsfqb796aYdzy8kH/2VPjAqemT4glgGgrGTufa+T9Qq htWhIrFHZeBKH1hK3VQQoCFcQAxctVIgxWqynx3o70BqWTnhPjM2onIxk0nOhVSQejNjI3r71CrG YvRMgG9WWVP65sQGrTCYa6RASlUpHlPW4g7G0BmM/ymYtqU1KIFloEB7neKUSzIKIXGPOdNiifLM LbYEXzpZgRR8U0ZHIGuiWgB8sKkcWDYmKzpI6BREdbzWpY2I3sZrXTpxBRM8S2+iiGRMMwv+LtQB 5B/QVe9BAzApla2TcujkBF4yopYEIxC6Quys9CsrEw5HmYGlXxbr8/GWYurLxwtRiYXOWlK/lWT5 a1CFshJjWMY3QUUvJVRB+KbsGJhkzAUw2+sh44E2dTweLD9DfgAqw4xdFLJp4mXVf+pSTQhWyNia RDepCcFVDm0dy9sVGBtY9wC9qIRsJVIatfVUnU3A3AEl5BYGioCcdtmWyesWwLaqTcaDUfkJ0GTQ SatE/C3g9AnvgmrsGUwVYrXwdSlfIqSs4dtTkNM6AWU3y4jnC0XVdBFYxAp3PiYktdF3GYGm5Gyw EvVcYHAKKjIUlSOkEUAWRckGK7lhICMD8bvgdin5ebRkp4GEFbpMCeR4Co6rhs4xmFGAU5TFhFeB DoOLRY8wNwurXbiDA7y0op3UMXdTAHJxMcyhbhgmaW411ZqU58mvHHNNc5RXA8glTptAdB+ULVds gNfROT+dA5dCENNJBGBUI8Kho0pXsLS+SpVMRGupyPtXwErR8iqK4+oFcq2HJhB35wB3EMRxBlvB 2XB1yBICaaO0ksw3PDIAsjK2/+51JOKFkarCkGcYSMCK3A1f6ezAyZVRlCtDWs+1d3JKCrlUJ1vI BZ2acT5ITqVAE4LnmmCnkoWCnd/6IOlR8PG7qws7AqN/iAU+R1U6QfUPB31l6u6p/Qevu3F94+al hY2ltdX59WPT1wfQNTOYhawq9Wumr7t7Y31p9b7pa2666caFhc2Vu9Y25qHta6avDS1vCP+KZMLu tI5klFPVeWdXRo3TRF8qciEARXDB9ZDQySnqh6PHRC3XEdpK/aZYlAH8dwDXAqICD39DxBe0zlTB V0drXirLiynGCfuRlcjF1OlSoU6nFN91rEUajcQ1RAuxTIB+5Pg4RDd78atl72oI1RHtcp1ElZga F2wdSpnoL6zSsDLNRBXFmkRzpZQd5NoS3oWNY96mhjpWGXdUc3QGY1Yp0CoWBlsQ0sz+U44kWqI0 nlBRCpXD1GpSuCqWYAaaYslPENKssUwEqJc9wGx0Yy8KEaixhLy3kdSx0RtshZxRE1uIC7IgaTCY Rc9ulPWogyq2taJeK3VWEV27WrjlFB7goz60qMVVA+xayolVJ9VDFy0tZCAhuwfYzQpOhYf6GNTj gOGMivFA6nAuegqRvGxjsV6MNGBNrUUlAXYp3uxYZAbDhkk5BuY6VshWkM3ESUkJoE0LLJdmRktx Drex0EQmLtdEShGIERKiLpcIBR3d+CCGjN1CNAU50nGXaAquRk63oI4+KJqS/NHNYn4f6GflpUIT 51R3bNSiW1hLmIszIh1h7Rs6Rs6kMkclrTRmHCIvTS8nCEyfHC1nnIiJsAF8sY3lwGGM1ox+pqCZ thL1EMOkmGdHYCmOw168tsDOK4VgoW2hxCAv64eFtRSbZ6UwDIyAkma7Ihl9sRYOhQJAW7qxVCaI HFhiUgEcFtvISgoN5A4IUjoeqBV9J1hoKeU3lAKqvJzfWgIIwZ0pnl+pe5hcrGGl2M0G3H+Z1+TT eYA7EMalkHqxMABFtYjh/DIOxdmLCdlKvVgAi/t6JZV8sUCRi6EwiotmhhmUYuKztUTfwWzZyyL5 sUKavUqCecStCRfasQ06lcWBbOdOjIxxqSHvWyFeRZTpC9aADXGuprImtIgaognZjKzEFTzQUm7J kU/o2h1djdCAIY7GNVdUqNNJ12KFBnNoZWQPrS/ZJKu1zvaASz+rGPyGDvFSflxzFUMTzVLgwyo6 QZyAlQqynPADgbHoL+dvQCDp+DwxDLEDNs+jb4aRA2OlAq0EdhouBUtAKamN4FJqyzvxFQ8rxF1K ACa2E+VerP+BUCUcQx192FmoBqDUWVOxHLWSNIq3nCJ2q5XJOXWdh/PA7nCWMiZKkIRQJaj0pOSc iTuRRWMc4Vi501ai7k7N4IZlecs6wy4o3lKwjZFAM0+5d6ZbGfEHTx17XBjRhQJPllLoV1nNddFp gYmFDp7j5LSnaiCDxSEPwIO3r63eGfrYCN3MzBAYpaT8h6nbj8AvWtFPd7/z1luWlkM3U9fFr2Fo 191z29zta4cW4WtjzAN/uGH6mg+sLK+Gn2bCsNaX7t3cWDwKYw/TXp/vabFw/9LyofVFnJuZvu6t qxvpN/jPxrEji/DbNWp/WJh3rC4tBKCsT97wwfnlTWr5geM3BMEQ2sEgcFSjOo9jnedxbAfmsXbv P1lc2LhpbXP1UBjaTWtbrHqa1mE8WaHpxtHOE2w8s+1TvfGtB29cPjx/UHed4tKh7BIPmBK02faZ aNX9+N2/uHTf/Rudt0iaj/ScHlo6tHF/5ylx62s7DHxUsOTG5vq9m8uLqwuLXZeEHu24IvKebZ6V 6TqZ1c2VOxY25h9c7I5a8ke2fWKra3dvLG0sbHEk0/yOYuu3Ly0PMcHGM9s+QziQXWe3vnh0c7k7 xpHm20/Cg0DYdU73zh9dvGV98f2b4U52J+g9T3XBQAMmoo8zkXYalVHqxbfn6OT4Yz7OLmzz9iyt dt2ctSOL6/Mba+ud9yU9sO2H7u61zfWFxVvX54/cv7TQmRHZYilyfmR1xLHD0uoWZKAxGbODt+bA 2sqRtaNLG10uzekYADLLW777upsXD0/fMBH2RmMeE2FvxIQ9NxH2JsLeaAt7h9fng+SyfPva0tFd Je51vnoTcW8i7m2HuNdZ8TeR9ibS3kTam0h7E2lvSJb75qXl+Y35D4YXLR60p57zHh+e7hAsRGdu boLSdhildT6r6/OHlja7c3HSfMew2m1r60fuX1teu+/YBK2dGrRWTNDaBK2NCVrrfFYnaO05h9a8 mvZqOP3vXUPoL7InJmru00ycjgaUeRSI051LH1hcPh3+TeNDodYXV9Ye7EyhwuYtD7PTyzuwxUur hxYPL60udae764tHFuc3bt7sTnizJ3ZAm7raeWbz4Ee7uTUPkk0tf2Tb5za//ND8sS1wSUOTujG/ PpQqldpv+7yOHlle6r5rC/PLC7cFSOeJpQd2wDLVebsODXHBDu3I1dLT+gajprUP/1XT4d8bwvfw /xsg9LfrNPFbd3oozbd9sh15lAyZyLtvx9F3xSfNp7Z9mgFVL8939wudP3RoaWNpK4qYzy8+sP0W ms5bdy9EOnQ3zFDrHZJW5leXVuY7qZVHhYe6d3krzDZ+1j+S729cPnL//G6R7svu9udDNy8+uMTB R50N0PlD2z65Yc4gyjEdN6qjOHNatBa3zm8ePbo0v3oTzW1c0MGCWMbu2Nzioo8fWtidZuehLs+I Y7kTVMzuRrPzKCKEzsqmccEI8+tLG/evLG50P2zjhBlOBJePB4YYkrUbGj9st+jedSoPdJ/JAzsx kc42hge28BfNJ+JGeiJb7F0+ET3SR2sLt4h8Inbcaej4mDhOiPwOjcR3yrK7uH7fIizmDhl2aQAT q/LEqtw7tee4Vblz8P7EqjyxKosMN7EqnxYRdZdalcGmPN9ZcTWxKu+QVRlpPNiVjbphKHo/sSRP LMkTS/LEkjyQTo2FgnhiSZ5YkieW5BPaikNLhw9vdk9yMC4YYTeZWzsrFHkvD6ytBnFhtfsu9T23 /fxrZ2y3uX44MEh3B8GhO9fTfGh0949uy3Bzazyz7VM7tri8vPZQ1/ktQ2qb8PvMwtryELbZ3se2 fZZD4sjTQLFGhVpMlG4TpdtE6TZRup0wKfS7SOlGxO+G+9YXF1dvCAzn4g0BmSzdt3bDg0try4sb N6wvHrphbX1+9b7OF3BctHHDEPKJSm6ikpuo5I6fE6Czun5xOfxlKE1P9sT2Y/uq88TmP7i0sjlE TsnYfsf0PWCND8LyHGf33BHHmJtJMJljdDxGR/7okcWFwDau78L4hV2letrVipnAoO121YXujIHl Rg6tPex/cJSPKQ/2zR84EgTjE5hlenCit5nobSZ6m4neZqK3WRsvvQ1raUhvw0ocVN9M9DYTvc1E bzPR20z0Ntuht9kJ3LfbnI5GQQl1N0tGEy1Uy+mYZNHY6Q0bdRXb9oTK7xB+GsdUGstLG3fOL22l Gho/jLC7s2jsymThwzqejXwKje4JGyYpNEbMOXXUU2h035HnUgqNHaKdkxRUY0U8h2V5Rp1unpCY MOq0c5J+atRo5yT91K6mneNj3h+a7E5STw0zgB16+finnprR3WuKb5G7KTuRH9gBDDnMTLqXJz62 AzN5buXMevPhw4sbG2tzi/etrg1l/Olk9dl2L4zuh/D+xa3tXdl8pPlIz+mhpUNDmBq59Ti56e3e 3By7TDG7hWAyyc4xEGXuECM5ptk51g4fPrq4AYNeXzw0lI1wXNDDboqW6IwVDnVndg== D+0Et9t9It153UM7wuzi/dltyOwOmdW4oLGh3E3HBXMdXl5bO0SetNffuzy/8MAN0wRaOzK/sLRx 7Ho1OwSbcGyYsClqve0zHmobx+Uy3QJ7NkZ3afezBLvTdW24yzPinM6JH8LRt7MdvX/+0NpDB3Yj rhtHl4JJgsKRxwaTBIXjHQe/ixMUPnT/EBHC4xrkP8lPuOsjsmxnBDRmEVnD1bAZAx5rFEKyJnmB JhzfhB2a8Ayngucb67xAQ2c/eo7lBZrwS+PGL03YpVM/hkkE+yjyS7vTDDCJYJ8+MSvARGU+iWDf 1UF4u9JRchLBPonCGxVJdtSj8CYR7BPaOaGd27Jro042JwHsE9I5UhMZcdI5CWA/sbUeFap7Mv6E Q2LyHdrQYSLZR2VXTjtVHYO9OH0DGKODcHh9fmFjfvn2taXuojw93PE4yJtG1j64urlyR1iCB4fI 8p4/su0zW127e2NpY2ELs1YegAKt3760PMQEG89s+wzfvrl+7+by4mr3FO/jIqqdkD59tOWZWdXZ Hnvv/NHFW9YX378ZtrZ7dGHPUztGWhqnclzQ+8p86KpzHpBxQOy3hkePbu1zNH64YXisN+qoQU8r /qftW4R0ne4Jl2LZMUFveW39NrmA44IxdnP44S4kv9ubrmSHbtKYpvi4Y9fH826LWme788Htmlwf M50586GTfewQIhi79Big7IVLAszdbrv8u9OLb2j5YtTx2YlToYkr33ahhs6hcuOCG04E7436RdKz 3WOjJsz2Tpy4ew4vrt+ytL7rVEOnnyaNjz15Y/7e7uswDgpNM93ZVIVzf+dwarDGMzuXimtzdeGu McImu+6UzZbTavq5cc5unZyzHTxn+rmCzm7aKRcTFHYgIPnt6/OrRw93KCQxOucdxk5a+N3Ip+1O jciJcNajLsudYETWRB9y+rYEPeduXF4+7UhhfGSdE8OWE1/NYQawQy8f/wpQUIJnPSCZwIoc3ML1 vid3xVaHcswy0y2u0xnedYR/V4Ytdz6q6/OHlja7CybSfOfQ6dr6kfvXltfuOzZBaacApRUTlDZB aeOB0jof1QlKe86htBm/v+vpGPEynW5SpnMcy3TesXLv+vyti8vzG939Tka2SucQZ3BsqnQOUf52 11fp3HUOuoeWwsXbxZzcrvI81rPd/cBOlJMb1Qs1LklNh2JJRwWt7TrX492L1ibIbHSRWXdP1gky O427MGRNo9HHZrvGQ3qI0KkRry7c/ZCNy10fu9Cp3ZqZpnMQwSQxTf8EdzYxze6L0xkCz4047VHd +c1TlIdmZA/fuJCkscyoc293B4IJDhjdKzLyKXW7n7Ohr/uoetx0CHHLWYEdqiF3Y2cr5IH751dX F5fvXlxeXBhG/dT/4LZP8q7ORuMTnWT/gztGh25eOnpkeX5hcWVxdeO2+SNjRIx2X3q3ezurEMaG vHZH5CNOXlPOtum+r7rxteuMTzil28ieynHhvcczOd29nZUnY4Mdup+sEccO3cvOnorkGCN78E4D AhiV23d4fXHxg511sYeXtorlarqpLe/Atq6urXaez/zCwubK5tZ252xW+SPbb0lefmj+2Ba0tYEv N+bXh0KY1H7b57W8tLo437ncehASF25b28qZPZtYemD7LQOdd+vQVvXmc/vZ5o4UQ+2M5LMbJq+/ HUff9ZI1n9r2ma4vovDYeZKHDi1tLD04xPziA9vP8Hc+kPcu3jcEf8KtR9f0trHWXU5eG2Ve6/D6 2kp3IoyNd0gkmV9dWpnvFLB+WuShMc16tjBxhhlVeWim2i3OMN0P2bhoPybOMCOi7p2UaRpfb5iF XecNMwSiG3Hio7a/LNPInr5xIUpj6Q6zsOvcYXYPEhjiioy8O0z3czbq7jCdxYKJO8z0xB1mB+jQ xB2mZX92SD5a2HXuMEMg8hEnr1v4wOxid5jup3JceO/xdIdZ2HXuMEOcrBHHDrvaHab7wRsXBHCq 7D/j480zxB4Oe9V2aA+HSSg8KrswhGPZZBdO2y6cvqwbY7AJp28AO/TyXZC10XRPyjbiaRuHmMlo p22UXIZ3H95cmd+YPzicUXwUNZG7Mp3hEHPa9ekM713eyk90/CTEXZj3r7PMOykruu1XaC1WT95t F2kY5LBrbtCh7tzSoZ1gl05fAq0duvZj52l39Mjiwh2bW9zfyW3fydvevQz35vrh+YXFu4czpDce GmG9cTiom8vz6wfWVo9uzK92P4P9D46w26cM9s0foJqXQ88yPbgDkWpBBgpjnFkA69L1D92/1D1n 7dGNY8OcWWo9TrLJjFeq8ykYcR2HVkPMZbS1HDNmmLl8sPNcPriDPMida0urG3Osv9gRbejdjIzm GCNM+KGd5od2Z6neITdr1Bm9E9L1TGr0nk6OZuPO+aWtuLDxwwbz60sb968sbnSvCTdOWGFXFr0b GtWNuod7Z8Hvge4zeWAnJtKZe3xgC21XPhE30hPZYu/yieiRPlpbOOfmE7HjTjvHR1Ye3gixG/1U RmU3hmWCduNeTHyGRs5n6DlYVvR0+OCMD1WYeHeMhaDSOQh34t2xg4zV+uKhoU7duFyo3WT3nXh5 7F4vj/EhuyeOM3ajIDAqu7I9Os4x2JCJZDZyktmM9vt3i6dD95mMtp/Dc1FaHi5j1khGrNhJxMok YmXMRLBdqNMoJjqNkeWEJzqNcbpJ3ZNEj7hO4/Rlu57oNEYYZ+xGEXpUdmWi05joNEZVpxGEyrsP ry3Mb2wGwXK4dHC7zAw7id6e3JkTuDPlc/nOdJ785M48x+/Mc0tPe/dGOLQLWxQf292oYVLpZlLp pg2lTyrdTIpctM1EzU4K3Zy+XLujQhXWF1fWtqqZ2qD9I196emn10OLhpdUhUkKsLx5ZnN+4eYjS v9kTO0AVJqW1I02YlNaG8UxKa58a81d3MpZdMXn/7Tj8rres+dS2T3U319ae7awEGfVq1EOwYJN6 1B2VR2NZDHB3JlUZpozeaMtKk3wqp/HKjr+udbfknN8tGeefW7pvoHhrgeJ9cP7gFlkoxsFRWe1C R+Uh5rTrHZU3cv5s1xgpOjvxTWwU/RPcWRsFHMjdZqXYgSr2O8S8TsS9tVER94a5SBOBbyLwTQS+ icA3EfhOTuAbrpzsROAbvTnteoFvt/qldXZfn4h8E5FvO0S+zgdyIvFNJL6JxDeR+EZU4tt/41u1 Ovjm1UNR8gOQB8jB29dW7wxdYHGoGQLftHjf0mr+w9TtR7gP/OnuYyuBWw6M8/r8vYtHF9amZ6aP Lq2sLIahLKy9ZkpN3xj+veehqc2p126GWd4c/nbHlJr1zqu6mlazpipM6cKXWpeFK8MXBQAfvnij fVHDl9J4B1+MsrUx0/fMh170tMJ/7jkW/vKd4cs/CaCHpt30bdPvfo+aPgSvvWtqplLWz9alNtOV 8fWsL6yfXkFwMattweDCFNMEs8bmTQnodO0I6HQ5vQCPOz2rVFkB1ASo1tDUVbNKKxuAzs1WpQVY ocNkK2gYfq2Uruj5IjTwSgO4ni0LVWLbMry/KKFTFX6uHABLNVuE5vymOszkAHZQzdZVDe/yfraq Qr/UQWkRWKhZXVoBhmF7ANpZ7+uCR9AA82RhBNYh0IcNMH76XVMNcKlnnVE1tg3rVlewWmVYoqLG KZR2tq5xtcswL6cMvawMcy+xg8qGttRBVc56XSPQzWrncQS1D2uIHVR6NsyloOki2OXgViCOtg6j LUpYxiocHlXBKoRtmTW0NGU5W7vCIjCsgSlxtDaMgF+mtZu1ykMHpZ/VVQED0ya8QtMahPWyhUZg EdbAwe6G/QiHlHYXwKWyWsBmWmA4W4Cl50sdn7fh7ByQ5w0uQk9bU/m+Tq3ve781s1rLvLw12NbW szocluasXBHOsXG9KxDOn67DLjVWy4e2BW1iWldfhWNU+GwPcATh+NThfjX2VpcunD+8c+kU6HBO nMV1wRPjNI2gB6xMS9sAhA3XobfSmrpxEsMEZ8NJMI0zmwHlfOPLAKzx4stdmEOwD7ur68Z10mE+ zlnXuHi6MrNwP3suKfSrFS55utC6CjtV4TKmq69rTX010YRRPqxulSOUcCzCbHBQCfMYXcKtKZtI CqDhiLsGPgOgIbwheA9AztdZM3m6MJ6hSl5TmqIgmLVWYMprgoUzQkcY+ywQ7/lwHV24TXMRjAcr gE2YsrzfKcfAcMsEqGpDwLDqBY/KBnRI6Dict6rGCYRlChsK43JmNjTBva7NrCpxT1w4jHBs8GSG 5a893q1w9kMrPNphp31dFbT8uqjosIQ9CXtJu6fgFtHJdHIPkTTgBsDd0L6GDTBhy6wr8HKFDkpc /3BPXRUODd1OP1uWuDQBXIfB4O0ENG/gZaYOZ5TOWkIP4UZjB4Qe4LSVRbMtbJc3Pb3qQH18qXtG ABgy3ArfGC3g6FKZojEvFe6Or4zvWQMgCJW1vrFeQNNcibczrSzQPwtkvLkLCh+zzR0L1D3MS1WN vQX6qwyNIDsHSNaJ0KQzk9P6eLoQWBiXncQD3AFvo5zbOQEr1zjiAKuUF75A6Z5XxUtzODAdN08R UuQNqoDFCau2guBArwq8aEgPCakG1qdG1BOwcs1oyoXl1bg/pQm0rOKTFxbNK0Q9AayVIQxez9YK 8QHsVakt4URvZ6vCISuADRwja6FB4WTR0Q+7ZnVdEe4LjI5lBB5mX1penkDiCP+GCVQELBCLwC1R s2VV4C2xYayOSVgFA0dMG5oWTAACorZWcEpV1jUDA8uHWNaENfVMghBcuQw81w5e7gdXNF2gCwqH BuyWtYlaEDSwVtbTKoa77lVhaRvC8cbnS2BQELWF/dJa8f0Ni88IHDBEQUsT6IkzeFXDzEtF9Kr/ HMAhAdYHiCLO2QZ0pMLQkCkNKMvUFd93VeHIVPhGIzNV2BJD9zrQI428VwDWRbg+ODJdyLkJiMGH WTPj4jQSIRuGC/wtAJ3MwTpAPD5ilrLAGduC0DpzPg6PP7AQjBxNWLsKaXnAcnXg1XkEgN+1I3wR mHx8mQ50rkQWNmCD2EG4aI42JyyztyWPAOgyHcdAWMIQuK3VtLuBxVZOOlBVzbwPohDivcJ59IYv CSMGWBjDHIIFnhHRswqzsd7SQaiBbSDuTwlnHfotmOoHqms9HdJCmK9AisLm1nRznK2YwARwVWG3 gPsqX3Lb2pZy8lVR9AADFwUIQToQsAtclOf313QKPHAK3GlgKsqCOQlXeT6fCpYDyWnAw3ijAehF tnFALGkAKhxDg8Q0AJ0veBMDr6xqYjsCB2QQ4WmlBXc4oEoMCvKbUM1ALPhxBYwD0wxkhqitqlDg CViwKEp5va8YhyJbQM8HcCWo1TGeDECjqsiO1JUAbcHMTGKfVcA4FVKysAMmcBKEOgK4ciguwMZY zxJAoFs1wxRxcwoITc3AgABkXUuRAAqQ/jQ3Da81xCKWgSzI8wWx/2EpAnsclzUcrA== kgiRcPXheuua2BydhBUD+84bW9iqjB1oJ0KjAvxBwLLysgl8XMPCIAVHoCoNn6xwCHzgegEcKEw4 UDzasHwV98pIB75VwmW5imegAZUgkxJOZsBWFfMY4RoyS+cs8bMZMFx+r+PzDA0Lg2iPgKVFUboA saUw0/ImkU6zAYT1JDYrXMNwayoebGA1LaEM4ehws3BWgOVhqnI0mCEqAYXGu6FZigvHSLBDOFsO 17UAJquSDsJVZ5yDvDsyDXXYJYV0MYxAG9yYwKQGvsAxeqhYZK1qwEm8AiiqIDcDYFPqDAzAwIYp IqEBETnD4i1QVuK9vCfegZg3V6AgGKiwq0vNwnjlabvCOTbEPaogIwVsyeihIC5CBXnKaHzeWeLz WqkUkS9gDpCaNckXcMZG43VMnQARDeKKabwOBLmATXtGBs/XvZPQgavRqme6OixzkK+tLI3mzSkA Sdh8GeeEHSvwbbgTdOyBQbJpzwrhpTxypbC9vmBxGsEijovEFoDhXXI+KtKUAIsWrpyXo2RKFrKD HFA3Dx3gZiXAdEDDygV67vgwM7UOPHJZmrp57AOQtR+NKxLIcVH7nusUgKgGaFy8BMzvaAZN1xnf hYxMdvGDTGptIUgCpFvqoCA0lOMTQDckCWWIB37WZR+SApTnrG4iNA/8U100UV8AMn+GaNIzmgyj QbrfQKlAIZ0InoJ8w1DDMhe9iBpmYHC0GVIHoPamgf3heUvoKCcUAWyLQggNE5UA9JUwQUx9gJLy aWFCdYBXIGAxkduBrM0x2BirmyQQgK72TWIJwFL47ERYPTAxiQYTHxaAgR8xTWodgDrtQaTsYT1L Y0zOA4SHrK17eIXwfqtU1ctXQF+kj8h4EPga8YNwK+G8ea/4DOGgqAPQCnsnXBAdDQstikLYJWKQ M2DOWmXgxIYFoHdedoZ5q/CqgCKqXuYO9L4lbW3kA8NgWSOUMYzhcpja173MpQ24hm5nxogGZr8o 8RhlLCtw+6T7abK3FWGQJitcigyYM81l4IIIQeUMtg2SkicSlphxlJFr1jwL2x5aKocErMHik2gC 083EAVBfFAUrRaLgEPCuq1CayIUM6EDjJmQCSXisMLZHdAnI0GpcxIaY40Ghh4uYiUQwG2uaslM/ nWICZsGqQNJLWA4btmyF18aQTAIYjdFUGKRnnWF4ijrO9LascSThJczHetdsqkhr0egTNDie9Cf8 ftpcC1PnFQ+IqWJRrSRCA+sNZKAxAFjvyrGGIKxHaOB72oICgBBy6rV/BVg0BTUE8Z4i9KJoGshw bbCTJCCDCaAkjISiNM4tA7LUTRojuG/EKGfiPFg3WCELF5JuNLxLFaJmKFxJHIohNUJTzwCMj+A0 UUkA36K82HZYdwEsliY7Cuo5lKjCwuoS+kGVCDatQaND25h0Jwo06Zb1yahnOcDCSuVKvruobySG stDIcIj+5p1TxNYjJsl1PQGNi6IkKoVgUIXCSaHewLEVpYIbXzV1DEGoCgPwbARhbUTLJsLuvvYd YoUjvVrAb0z7EKeJXYxPG+i8QfQgYCDaOmtLwMAVV7zKViXLmC9FFV6DSoTUfb5EQhvQPaNYJfwJ Ivlwz3lHCtR5s/gYyDCdNGAbUPaCW0RXHs5J4A8sHQnEhXLU2MwQjoSFp8heZonMAakn6wf0Wle2 pqMaOZBeME0XgEoxD6aAgRDTGIPhhogqVYE+GvcfFsmSIQ+sH5Vsqjc1m8YiY1JZuhi808QshLMc JB46lkF6K3HHwk7XIBmIaYxVtAJuBYpprLY4sABGtSqdbCSFeFicyIR1jUirBHLBSn0wjFWkFCx9 VHIZNF2gGiWsliO2JBCfcNENXSElNgUEk+IZwECTBIhYHoBZB1XswNmaERzqdYv+trXc16xXkczz EQCtrZyW0RL9tGDKJJ1RmhcwbEVd9a6BB/0SSptxtQBLWdrCtKoeDLSmznaA9Kqgh9fNnQW9akDz vnEGQLGqFN4vPC/h3pNetAkmFN8PJFUnGDLRIJ3OIRilAqX2jRObAeV0iwHLh7OR3YQ5BodLbxuX CWwobLlN1w41vjWqYvIriq8ryYgVr7MGDO2JRY8XH6w4YZN6kQRYfGpiQhJCAdOY2MQj6gE7Urg1 ugdNoXWLpJSE0gBYFVrs54T8jA530RQua0kdBMRKZwbAxMkBMBrXKufl+cSMI9d9gJ8PYi3LWVUR UPScgA0eLwCT7IBA9jYoyUZKg61L4mVLssTTuILQXiJB8lpEPViuikR+QxY8WllUKiDj7SJ7V4Hc iuvlSpFTwI5J3F1A5Kham0ENP6toQA5zsrXhLJsauUYgELQJcENK0m8YH60JxDdHi1Up/GU4PQ4x dbjCIr5Z4FVRU2lA10L6+YQjwq3GDg4wF2Vr75ttYReM6uk1HBg2iecjACwZOBHXGC1qSMrGrIAl CTxY3bMCSGpqVB+m1QKqplzh8mUF21joyvbsABDLkuTXtFvKgb69Mo1tRRpe1a7nCCCYKE06Lhm9 TwcLgaRtl0N4gDtghCpHdk7A8STz8UanGaIJ6R60MBe5dayW/QHbEQhJYh0rLFLzsNQihoEEX5Al rEh2VeD6K1bxo9lcxOZAeSsCF6z58KgIMsyfiZomSIpBvDXEuDpSsfs6qvOBdNAlARa2KlnJAp2L cawmgzXqmcjeHA5+4XDbw2kX2RKcIrxjrrUqy2gcQ8RLNk0mAhXopmrulF1cAIMHedHS+1GOPTAV wVUGnmsHL/eD2TQcgIGw4es8mUWFZDA4rExV0CJWwNo6NlKGk0WKuUqMgeEbGFjJOGYFiYOekt0j wBukNuz4Ifb5/mOQjGOBR4A5g7iuq2gbq0ipEi47GuuJo/Y0MJA1k1kEaRLe/8Cbi12mlFMTZB8l prFwaRz1aW0hdiWeQZCKkUGNWIX0hRY1mqV0QApxYCEYMQaJj7WIgOFAoUnvR8xeEbao+dCAGS3a JGIHRTQ0VCRriVeQOK9UJBXQaCuyw4EHkKZlCcDCS0vEIAssnopOPCAWRwocsBkyjwDSJ1tbavAF 0MQjoGXpAOvvA2fN3Je4EAHVNZ7V78J9gRHMiXIyMw86wHNsmcHTTkAfODE++Ky/T8BwThT7keVQ sLdW8i5Xkl7MAOalTsO4HbJfoL2txbQUlqNEQgoKLFWxsIYaSWQlogknMGd1wRqsWvT0wCojz0bK KmvFWmNKQe3GkM5XhfnRxQciEM3qAaxrYXxEfROAKOUi5kBtG40g4FrhW4AnFONYSfo+wKxshAqw UtQOyhCbB4KpcizwJAYarT20/iWoKuYY6MJB4G1xlcgAhTVsxwSUycDSlwwEM55Yxth7CdwddZQh qpKERi3OAvA4kTZUmHobJ8VWmcA1C1evwBZN/I3JZRVHNxZc1JJpDpEzG8yQYFCv1tvItRQCrNlJ pUIVzQKbhbSu2YjmWD8OEyCmBToVjFOTLEAqyEKU1uG4cbfekb8m3QxXFMzL1c72AAuQEp1YthJY I9IjmCW/kyAqF1aLua2uHOsxGgMQC1IRVYBaCY8JPEm0eDJFK9kUIOdCvAMV+WPQ1ShJigM9jYmW WFAYEhIodKYIUa5kIQy5dzpa4Dmn2J6BKnaSTjUfLUc2LlLQlLUIFXX0VUKwYAeRpQNDWpcudzoT 01hVCwn2ytfMuClS3IDtgtTmIIyLV284x5YJM9jGSpJlw1Vm4wl0UFaWVWWeRMZ+IpVMY+w0lhEv 9BmrXLMLsIyVbD6PLwNJTjMuyAYGzIXvnQSYxgpa2zRdMI2FsxqXxttoGitZ8uZlnGNezJGvAe4E HXzgjlTcMxKD0NhiRHQ3cMAWWBxmcUG2nTixMor5RZBMo3EMfpPjxDpecP4TLww5eGAqLKNrRjyk LuAJMvvheSZ6DUpihwQsO/lgQCD9R+OWgLNZYXtuFBi36lo3rl4Gy29pAmc3Gt9F3HK6+2GorHQF PFEKAUSLjzZNnAI4x7mqiX3gd5ZwM0QFkjH7diSchs6lRd3EfkBf2FcLjlTtkgmHXIwyrAq+faqy TfwLVkvr+3C1Sy7PEa273OFC8D88r0rdQyoCtLZWN6kKnH82tiT6A3KSlvcjrRIuvyx0TtfEOFbW cr6FBgYg3MgGsQSYFX/+RFdBY8Bax4IU9jNoI7alaB2FWoeWZdqCSNkDWCyUiQsATo9M+Bm/ACMo KnFMjbwF9Fa6qsmH4NeiaDAs4cCz8xfum6uTaaq2Vtigku6BEp9tZJhI958BM94qQTM2DMxg2sjO MG8VgOKenjN3YF0go2HGCIInAGmFMpYRvJkLEvVy9jIw1iXdzowVRZtMqZtMK5iDyDm4yeDCndC9 zHAlEmDONoevXvex2NbB1vWw4yjMluwHLIw7mNE0krAGkw/qRW+YLMQOtHif5aJDLY7zDTHDRufC TCSx0SEpii4OvMxwCRtCDigHyJ00E4jg/ijVIzr1ESoxjYXL7ohxdUSKxDRWabkK4kEAcQaF48us uONMc8tKR5JewjIpYSdj2+isl/UaJK1Am+tsBLS54HlANNSQAWcGJR1WKON6F745AljvwJfxCAKB qgvXbBsW1JEfb9Zr/xqIcQy1t+zBCzIv2cbY5z8Xj9EGQAgJBWm0a2dAEboPsBXMlqRmzcR5DP1h paySGw1Gj8KKszy6mZGnj9G0jknNALaxhNNYIwGMS2HkmrPuApisgiwpqOZwogjz4ODHNxpDYpij I0Nr0p2Ayx4ZrFjLQiyhF89TdJklSzGw2lXJQJQa3skcPKKyXNEDtrHakrI+qoSQeSyqqDco62gc Y4Nm0jGoCh3W0GQStRH9m8i2sXdM7T943Y3rG414yP0Hbwj/TtXT17xm+p7/Lgufo8C3llC4t64e bka+6ekbj3DcWxVWIdwB+ELxbyX83adotmFC28CvtlDiJoguoys94DA/zxcFHFxQVxnIU1SgavE0 FWA00BMlEPAcowDrtW52ETAma3Gyl2VAHphgVwYDOY5hNhkYtGW6mG68rDDRmpAGJkAxu/M0BIz9 pilnXaTFyV6WAXlgB9rXdw5OyiZsLuwo/aPxn7BzhGIKZ4RthEO4wmAV3a/i4gM1EtdRVsii1aqW 2xnjgED1Y0yhe9qG2+mjtwGzPAFLOrJdAnsT6VLAqcy0AMevSAEPKi2OWgIWk/ijDBg4c5A0pQMB F0QJGFOTXg+M76TqDzBYcOI4yqrWCXuT+BDA4rxkYOfRB857kuYJWJOOyIOMVcoM4DHNEraBfucY HPhZS2DlC9F/1ezmg96xEivH9AO8C0th6U1BAiSCTUkMKQArEucNsWgMJM7XG9KDCdNhSR4W8NxU Y3vhdexHB9477O3ryMxGQPZBDsDAaMiKBQnDSNvoUhOku0q8IdH9nYCBk+dlRL5JZuY8aZmBzwxM /5ycpaIWTlfVccIBLfNO+lrCjxRr2woIlCzjTgS0y+BSidK0qC0bElSmhoxA60UEaQ== gNljAtSYqmYNkJYbAqbISpy4jDDK2QQqUIZx06ISmDiBoV1YxBoEysKKliBrG3bROL4LJauoTaQp vqIIBNlxOeIlecUwS+q1eHdrW/YBcbsWhMciI7SAlwVMPlBwHz0tIgaGlRKdJ3xTH55h7g2m4SvW L+LtXRHVsXVlBp5rgsFj0Jt4crkPhi639zx3SsnmHev3za8u3bc+v7IyPz0zfcv64sLC0nxvCPnp IKN4zCXaClVUK00wWOdqljMNxCxY1hCVvqS9N2QmRCIopivQtlMUMUj14FN3QDqwIv2Jj5iPwoQm Mxy9P5xSNjjg7REXL8tayaxtHQfgY7AryCI1mRfzAVglshM4K3t2MgOpWGg7Ctt8UcjkAitQRA8M BspqzbUvIhyP1pNxzQy4CIUzXWRJC2666UaonXPX2kYskMln6NQdsTs3l4/Or24shnOwsrZ5dHH6 yPriyuZGk1vDE4ZZB7qeH1WRqx2J0xVzYQkK9lxNB0UX4owA9lxtxZkQQ6wTcIGlYbYCZW1BH6Dr stlrAvIASByP0CDqoRNuo9OybJw0GoAASaUcB5u1TdPKeu1bgYWpm+6NDNJN9wcW+Jp3rEIuikPT 4YYfWlpc3Zg26jXTM6DAADkf/VemHTiqBtIfTmhpC77B9N+b7pvSgbxOQ/wvuCLI/2cQysieDPxg WAxXavqmFbQ533TTZJNOapNgbwKtAbVa6L5Ae2HYnFkFisyePQobiKI3eN0UPv1/Rn6gmVSUnwGo aqBe2U6BtAQ6Ae413D1MQ3LL0vLi9VlGkrvmj0LmknDzQ5tbp94dhzGDejT2ZS6BqQndv2c6UKvw J1zY+7duCz9Se/pTTVvg8Et8LkCm1dT+/TiKm+c35q+fBoF/6p63nvvsMJ8r9/5Axz9DdXvK3346 RnJibz9VIzn5t5/kSE7tAE5gGKdjAEMN4/QNoOMwTvcAthzG9gzgOMPYzgEMGsaOj2H7B9A/jB0f w04NIB/Gjo9hZwcw+TP5M/kz+TP5M/kzXn92nHSOCP+w48PY8THsOGs9gvLF9g+jdQDbOYzjDGB7 hrHlAE73MDoO4PQNY6gBnI5hnMAATuFITubtp2Qkp2oAJzCSobp9XvOzZ88Z8bNnz/OO89mz96wL 9r2UP/suOGvvwNZ79p69b/8b3nbHnfi5421v2L/v7PbW0PKqm5c+9Oiv8OfRDy3dfFVr6zPOgpYf /q3P/dVj/Pmrz/3Wh6H1WWf0NN17/uUHQsvPf+Ub33qGP9/6xlc+H1ofuPz8vT1Nr/nuD/0mtPx2 WqJvQ+vf/NB3X9NovPf817z3Jz/9WKMlt37s0z/53tdkjc84/5r3/vRnn+htSa2f+OxPv/ea82XM e866/Lt/8rNfe6Z9s5752md/8rsvP4tXY+++Ax/69BMDmobGT3z6Qwf20Sj2nH3V0m8+9q3Bx+Bb j/3m0lVn76Fu3/zhz3+jZaxxzN/4/IffjB1jt185Treh469wx1t2mzrec9b+rbqljveftWfPBW/4 0OeO3y10/LkPveGCPWfse9ujf7VFt6Hjv3r0bfvOOOOld370sYFrK59nHvvonS+Ftr/Spe2v7P62 3ddsiL0YZo87nZ1nvvo7K1eHQ9nhTD779F//0t0v39vprD/ztT/6oTe88IxOd+ibX/rIuy/Dm9zh bv7W6gxjiA53/uaX7h0elwyDowbjvmef+WYv7huEU595+mtf+ve9OHUArv7qX//RR1b7cHU7Dfid X/qhd8+8tI8GtNKWlbtef9n5gylRg2Zd/fIXtnQaWzdo4dl7zzge6Twujd2//82rh8CkPHXPW2JN DjZ0395wI85dm9o8C1Z23rNgx30rOrg2OPI/gXxZahac5yGkS09DnIu30zO0yOF/uiggI5Qr6vAV k6N7q8HZYQbyVIE/8gz440FAS/wSfyHXRkupgysKfEjuDu+I7ksDXJyumYGcr9rXtpOvFDguoaND dFwK/zs0VYiP1MH249IDP5EDg12c1JHBHk7u0GAXJ3Vs9h9cPdmNiMWGwkM3vnX6xs2NtWm6xksf zEoE4Z5NX3PjobV7Fw/e+Nb64B33Hl1cf3Dx0MG3LR47SI2Oco/5WKavu31t467FhbX1Q+E0w89b ndTr7lqcX75tPvT4gdB6+poDN771Vr4Ebz+8tr5CP72mf0RhFe7eOLa8eDC9Pztr4U7duLq2Oq2r Eg/XJv7D7nNNz/hejGV0DNbjpJErPWBH1VrEx9xx8laJkgVn8LowGVA8e4u6tD1tweGdYs6zXhOQ R7Aw1QSXeXZF6bWSTLHZAAgmTvIy1tQyTSrrsm8BwH93AA647rb5ow/gNzV93U1ra8vT17x19cHF 9Y3FQ7QdEXzz0tH5e5cFfM8bwn828fdAOfYfzD2pDvb5UoXTyt5U+w82fKSsjj5SWnykwn+0In+q Dq3xR3yC/ltlXmPsUHWw4VKlrQWPquNQUvz88/jtE08HzuLp38Pv/4kZjd+Bv/wN/+Vv81/+E7b7 fXjmW5847htgXEKVw4K+RRYuUeb9B29v3zUtmxJu0vQtmx/84LFp2MfsAu0/CBse/VcP3vM6vJ6h K2oUe5hbWn2gb68PLC8dORJwRLq34cb2vIGW2JAj3XGcWHvIxOk7hxka2IXn8WXx29Vvets9t934 Wvx+5Z3L3/c/fP/anVfCX677nu/9n/7XH/r+gwb+csWdK9/333/f6nftx3avfeN3zn3nm66enMeW 89jjzd/D1GjCbwMIS+8PJ0BaqIuTIi7UxUmQF+rgZAjMQN7m1HMsOYNwPJRyEh78q4FzmV9ebPju EwMSDkOvE/FxztrQ/sUQdO8lXaaGpGvvmXbltKta/Ivb2qJ/Mban/27lX1yU5fD+xfHzJv+Dx/9z Yt2ewgFsz6hObBinfEgnP4xTNaRTO5ITHs/pGMaJDel0j6T7eLZnJB3Hs52DOf54tnkkxxnM9o/k OOPZqcH0j2cHRzJqg8nHs+MjGc3B7Pgw8vHs+Bgmg5kMZvJn8ue5+WekbtNkMOMymBEZzwgyVyMy ntEZzCjLTTs4mP6R7NR4Bo1k1AazzeM5/ki2czxdRrI94+k+ktM9pBMYyekYzwkP49QO6ZQM4+SH dMqHcQKjOt1j2IZPv/U5ui8ePz6Am+4986xzzoXPOWeduYVb5BlnnnXuBS+95LIr9+/ff+Vll+yb OvvMgQ+Exue95JIrrq3e8vZ3vft73v2ut7+les2l+84b8MCevefsu9zd+s5Dmw//6E//7M/+7E// 6MNH3/ud/vJ957R4f+454wVTl+jbV/7Fjz36737v05/7whe+8LlP/96v/9TDK7frS6Ze0PsCdBR9 48LDv/jxz3zxLx57/Ml/+Id/ePLxx/78s7/7iw8vvLEv0GHP3nMv0ndu/vh/+PzfPP4P3/xH8nH9 1j9+44m/+fx/+PHNO/VF5zban3H2ReXBhz/6yb984qlvPfNtcZ/99jPfeuqJv/zkRx9+X3VJ3n7P C/bpg//Lb3/hK1/vj0n4+le+8LFHFquLzj4jDWVq/50P//afPf7UM30+v99+5qknvvzxR96n970g +gefc8kbNz/6hcefbnVq/vbTX/vyxx6+c/8UD2fPmfvMwo9/8itPDXCB/vbTT3zhoxtvvJiHs/e8 K+54+D/+5dcH+jV/+6nHPvlj89e9+PnoMP2CC8u1X/x8q68yf575+l/89j+/9ZXY/RnnXfFd/+r3 /3bQUGg4X/3MT77nNVN7ceR+5Zf+9MnjO3p//cu/frTad+ae5+0565Jbf/Djf3O8zkP3//jY7z38 lkvO2hNW8bK3/8gfPb5VaMPjn/7Rd1x+zhnPO+PcK7/7pz735BYu9c88+fmfec9V50Hz/d/zM1/4 h62af/1L//vhmQv2YvOf3bL5t7/5F7+xCXPt2Pwf//Z3f/CWi8/q2vzpv/t//uXcpWefpt7zsQ+1 MsOt+3C7OuSZGfJEDnne4TZVR375i8frPr9NcFfvOm73jbsql3UA3ujDBIQKPvblrw3AM996soFn YHH0+x75+JefaMFioe8n/+J3G1gMMGq1+MjHWnHkU49/+Xd/5HCd4UjA15dU74sYOLYNGPjJv/38 xx45fH0DA+f4/YlvMHpH/P63f/r7v/jw++pLzuulB0w9fvezf07Eg6jHJ375X63drnqoQUabHv6p XyfSxLRp9bvKy1vD5JDy+e9871EifEL5rrhwAKkEurrv0tcQWU109QUDo/vCA2dP7SOivSXVpgci S7A1T0BP7OkWkdjpc/z4ioHRFaqKSZA5c/ZKEww5BA1liNaQKLZi13NnYzU3qTjFQIlucL63LRQE odzXWa8JKCOQ1JEMhlIOnHQ29QqFscu6bo5AgBLgwaPN2qZ5Zb32rwEGWLRFVXjDURUVLONMHZZz Viufu1hiokjM+Kmw1C5Uly8gCzN8gSy26ScsF8CvxkLJhZ2+Z6X34XrLhy3Uo4O86jct5A9bqAJV uS3fDLUpDKapHPrNkLwXsyXftJCCPhSmLh7o0djJh17VsVZ9TTW0VppgB9W5HBXTK6UGPVaAt1XP uWSglF8tqQBk1tZBJnZdN3tNQBnBwlQDDBWheD1Sr2UplXXzc8lAKdTIo83apnllvfavASyynqxU p5XaOkRKl3SZdVnC/7Egw0wFxQxKiJPSkFy9516rWa8s5m+HnNQW6ivEL+k38npVBddNr3y4hHkS WBW7pS0MqMooLUmnocrECoN1XXIpEmO1FLXgSrtQ70cKBhWUqJ2AsaiANVBzjsG6omzccGNLqjik KBpJgJXkt46FBzMw1PCuJPF2pbBYMGwL+Jw3RlBCzndJJQ+D9bzbUr4Ap4XJ+EOnqqjcdOsSHBiI gwtM2gvJwwkFQ40b05erN/zmoCRTHVYIaklUqhIcRpVBXVxdeHdAdQH1QpwRIC+oNnH8h6qCaogG xBceslCAGupXbfEmD1WJMESu+5ug5gwUHUso9rTG0ZyiMIY6BibUEpgQqHn4f2sYQ0tr+JGeoP9u GcZgne4SxjD48+ZD73/wA8fC5wObRw69OcEPHPmJ3/q/P/Xpz/zxH3/m05/6/X//E+tv4R9uefg3 v/j3T7E09cxTX/2v//GR91wHP7h/+ht/8XRD0vibj//L2/CR//kTf9fkz5/8o3/9Tnzm2G/8eeOZ b/23j//Q2/A9t/6Pv/Wlr7Ig8O1vfeP/++LH/rfvUTK2f/1/feKTn/qj8PnUf/7Ev/vx9VvSuG9e OLL5EM9n4dYTX5exD8u4o4lxjxuaoYFVCZjHnAzmCXc0j+6AkpQD2aGW0Gc9Ie0nS9prJu1QKwJI O77BBRoVKIuahfoqven3Z70LM5qBOtoOM+/HL/wLlS8qsOZFwMkainkmqj4GOBmKUxKWhTKsnDo+ IFPdipPbWmNwBz5B/906tKxwnWLLTv6z9AOLW7ZZ++Gf/z//5M+/8Bu/+HMfPjKw0Q== Az/yq196UvQhX//irz5yf2uzf/qpx5t4/O/+8J+1vPHnvtyv7Pnyz6/2NPv+T329TSv09U9+X6PZ 9/6Xtlbw+eyxrNnKpwY1e/bZT62kdj/z5OB2T3wkNnv/nw5u9uyz/3VT2v3cN4/X7ul/w82OHLe7 Z5/9wpEu3YXF+Tma7BeO3+zZZ//0/dDukSe2avf1R6DdR7ZIxxIOBS7No1s1e/bZn4d2v7B1u184 He06jO/RYeb7w60nNP88+cPQbnWL7Q37QUfw17Zq92/pHPzYFi/+6o/yudriIHx2jQ/gT331eM3+ 7ifkPD/wh8dp9tQnpLtwez8zsNnTf/C92cU89ieDmv3n5kX/Z59p3ZWn/qDZ7HnPe+jTLbfk7z7x vc/r/az/my/1tHriT35ira9Z+PzAH/599vLH//gj622twmfpkZ//jS8+HljWp7/6+V89DkKFz8oj P/Poox955PiNTsHnOcmqZrxQG9c6PC/Uw8DanPuYcK+nn3stSpQzYMOgoq7106hoNs7VgxTNkB1l 1peujP/PlQlhHr42XCutrks9YVxHhnF9XhfbD5iK9u49Y89xDUV79ux9/plnviB8zjzz+XsHNd1z xvPPPOvsc887//zzzzvvnLPPOvP57QazvWeefe75F7zoxS8Jnxe/6ILzzz37zH5jWejsrHOnXvSS C1/+iovC5xUvv/AlL5o696zeLsGYdt4LX/Kyiy555aWvevWrX3XpKy9+xcte8sLzek1qodn5L7rw FZe8avqyy6+48sorLr/s1Zde8ooLX3R+aJh39/yzz3/xyy66dPryK6+6+prwufqqKy9/9aUXQcPn Z34je19w3otedvGrLrvyqmted+1M+Fz7umuuuvIyaJhb/vacec4FF1506WX7r3ndzHUqnBitrpt5 3dXQcN8FZ5+5J3Z31vkvecUrQ7NrZ5WxLnysUbOh4fQrX/7i82Oi0D3PP+eFL7vk1Vdefe112vqi DJ/CWx0aXvHqiy+84BwZ4d4XnP/iV1x6+VWvmw1Htqzr66+vqxIavnb/ZaHD815whkz2gn0Xv/rK a2YUVKi8/obXv/6G6+vSm+uuvfqKV120b4qnjK8No3vtrPFlfcPrvyN8Xh8aOuhw+pILXyjtzjz3 RS8Pr732OltU17/+O94YPt9xw/VV6PB1V4UXv+jcM6UdDO/qa5UtQndvfOOb3vTG0GFV2Ouuvery S7N25734Fa+6gtt9R2j2pje+8fU3hHbq2qsvv/QVL+7YX9YOx/e668J00/jKvvHF+WrH8w0LUxVO z8B8X/bCc2Rdzr7gQlm/Mqxf+MT1e/XFYYd5Q3B7aT9CQ6ihivuhQneXhWmEDZbjcu6LevfXWcX7 +8Jzzozn4Oyp0GHjvGg5Ly/JTuoZZ577wgvDMc3O3+zMa0MzOH/npJO/5/lnhWMP5/nq175uZmZ2 Fs/zFdN4nvM8tWC6Dg0vnb5i/1XXXPPa19L9eCXdj+wi7aGGF73yVXjdwoW7bDrct33YLL+YgAzO f9G+l1/8ynB7p6fDBb7korb7Sxf9ghdf+PKLLr74kosvvujlL2vFB4Q4zjn/hS9+yb4LL7xw30te /MKpgF9aMdEeMKufd/7UBeEzFRDWAHyFBnjAbPh5AbQanLgXmsJn79aW9z342aLRyX8mjOtJsUEt KtdqcKLA4zCtUHizpPKxXN08g0BNamJXA49pLVe0rVVh+9hVBC5I/XdDVYhTWxcmVFZVo9MMxi4M CQJ1ujW5QMTuPFT8Nj2csgAXphrDzNqm+aROG7Me6PyA2m8NJkc1jcrvyhbHY0j1bFWacjqgRl/X RYMhdSbO1QaG1Jrc7yE8GhalrLZ6FMpPa8cmuCK8TOmi49tuGv5tPswXcl+OlRnOGeGFofA48cJh +kH4aeWcW1rDj/QE/XdLzrnQJ2mG6/n429/13vfNz8+/7+B73jXnen7Uty38ix//hY/+6q/92q/9 6r/95Ud/9Afvu8NmP1///kd+5ROf/bP/96//W/j89V9+6b/83v/xw++/Pv58w7FH/+DP/v6b0R3y mf+fvTf7bafZEsPyD/B/ICVRJMWtu0k2Ny3cF4mSKJHaF6pJNkVKJJvqJr97vw/OIEjyEj8FyEMe YvghiIMMggQxkDwE2eDkzQYCBIYdA5MFA79lJoBhBBgjExupqt6qm71x+X3Lvb+5d35X7K4+VXXq 1NnqnDp/9c/+/B/86d84kV7T8z/9X/7yr7Vek7/+v//hf7ag0Ws/+7f+/l8shxj/5T/4Wyy6Gu3w b/zdPzPwzvzVn/3df/0Qvf+T/+r//Ovl9//if/8v/wS9D379p/+rgYf2n/3D/3gSRgNo/rv/w5/r G/yrf/5n/83fvBTHHx39+//dP/kL/Lbmf/lX/9c//q//vfeoNEHi/t/8j/7eP/qnf/n//L//37/6 l3/9L/75X/zTf/Q//of/xi2hIjD58m//7f/iv/+f/8n/8ed//r/947//3/7nf/vfekrrlueqw/3N v/V3/vRP/85/8O9MO1cJoyWkL+6fnu4vU47W2+H//VEKTEMp6YQr6+RjWispTQUlfvmckTtH92Id h454qe1GLh3xft+NnDri/b4buXV+xvvnovoe9L/D6UQsTSVIIuWO1gGN+Ns8MxXgbbgZ8Eefm7gF ViZb0GeMNIYrDsatfIzdDSx/YtGEctCEtm1i34Ik7JskdPf/1qfCnJn22A7kH516CWzPmQluV8Ql ZYLLleHQ24GzJTAykjeGo18JSOnl37O9BYSqXRfD25hT3+TCRcrwwkVCayVQMo805dTwTsRYJJ5K I50bqJXy3c/qU8BFaCmQDvI6Kg25U4oEr5OiFZHEfotaPBUBHJ3WNiOArkqieDkMoPpQ6lu8qV55 Cm8MT1JieJkCFGjRCdir3Lf8W7RAlCFizdTJYACX5m0eQx1wq8G/GikFDZKkKI3CCcil47QWdCom IgAYCykqEgeSQt+YiiUidAKZMnJjoLDHIokkmUgaQSbT6MZSpfHERVFA2qSXhwGlELxqVNOYjgDD AKnT2sbiMqrtSOiKTseX26GbPB01Bc/pGJHWNjZBA7boGBqs7BY/EGTArkymHN3ET7pLLqhppCkS 2ktgWwLEwzinJJWIQ3OdiCUg3cBoKYAe2CYRBwIW/kEBYwsIc4Og7wS80R5d66rZO8pTYJ8ARSch RQymEuga/Bgg0bR0c38S+y3unTj4IqFrRgBrN5XSAVQfavaO8pROih1qgMLMApJIKH3Lv0XDXxki 1kydDAZwad5wqSDFJSM0oHwdPtSnwJqlpZt6Y6CLVALuEeggSFDqmOTfIj4SoialaUbQ4E9E2BhA 9aEGH8pTmoYdit4DBWgS/CXhk0piv0V8KEPEmqmTwQAuzduUl0hFLkga7gAxHYMgYrR1OkY8DlqE 44kIlU4pQbfipOPy9JJgNBSxlI4RBwYyHLjlxzGKjFCplOSYIJx2JQYFx8E2jEEev8pHiUgK7Cq7 caFY9DSdkD6CweGxtC0mwLoQSVrnMgmTsUgS2hl2H8cAJihK6jEWSSdSMMje+qM4LPIQT8tR0lAC pew/SkQSKTqtYJFME7ajg94gQHHyJ6lUOm6LeLCrkzRN67NlHBEG3HSpZBJjxZIfsiQdS0v8QrPb lac0+IumYpJdk0qk02IgosxFqCT2WzmnjqUpbTNgu5AwrlEDUH2o2e3KUzAt2SBSgcaSCvcUOY30 Wz6ll4aINVMngwFcmreTI/IYcg3D28bh/8CqK2QK7n6aBNSGlQxJpIBCEIcuPzKRRmYdXPB3F1Rn aEhV6kKpfykvUcgnkSBS4uAoIOdsT84dVzMxHNo3qmbi2OduiVcrpwLhvtZndeXByp2Cb2MxoCpL 0pigab08U5/Gk2KujOi6BsIgLcpoglayasACJbCHsocdiB9S2xamFMTEhypU9SFO5upTGuoDMdqt AQoEdToma3XyAOSHsp9dGizWVp0WBnUJA45KOYlrQknUSkuCLkmZyjmY8gIUQxJlpEh/6OJB0vGE RNVkgkZyBLqXUP6eIV0j/7Tim9Zl78FHp9Agckm1BDBjRa6/ZGTsGJpFBpYEgmBodhgaKDo7RnTu GBk8hqaRgRUl+rmMTC5D40xnw3k7A2OcEpLJDA1Td4+bzLjFtO8WhsyMdU+4PqvxSMo+yDpJNpn5 nOWnl4v5eDRlKxzfmvHMjyyPtbcwgpGPtHPBTZtAy58DRT8cxmoD4C9cFzP4JiW+aY4X4N/L7gfb m7skZ0uBXwhD9zkzZd5Z3n0J2BwfsH7nFl8WmfF4BCh8Nhz1pJZtjhtH3TH3bO6ec9M+FzVoCtQ9 AAJvT8P2sxHACOc2+kLTGKB5hkBYdKH9IAHBcz8wYxZri0AYf0AR6nisoCMQ4oSJpS4ApVxOwSIP NaBbPYZnulyvNxxx7ndWQCAEzvqjIsN3uWlvNOXcYbcwWEyYOfaFiAvbz7j5fGQ2OgRC/qyy6NtM oj6FwxfmPAI84xc//cQhENaflX8Y9dnpTwCtHM+CL/kFeOBkIvne14Ll2fFY7I8VBEAmAXdEpGuw ETRUveXdYUJWYBeQhELm8Bcq1gP/K/6/ytMJq6Gu17NK0WLPCfjfBAH/S6P/So6ZrfeMbw3UNXhA iZMF2l88IU966x3HdLh2JxRMQ92GEj1736RnQotsCkUhgn+ThIR48hvNGWeLqOs4PLlFVBaGMw47 nPY2t4PR1obSwmCLQnIB7FxWhcT24FN3IuqW/wOPrkgaWDBAa3ZLusim+8ZkiEZc1HSIFD5E8mce m8iqTccW/3nHZsy2TUeX+nlHB6WV2VjUkUC3JkEp7kygLaegtykC3ZoEdJdCjeRbD9VQbJqhMfnz olGvlwjmIyM3GdnKrCgtvpEtY8EVPZtyv5uiH0D/lsp3RS/AIIHiHM0D3fwHVn4bLUr6eGU0Bso2 bF8cMqOpW2wgPhVPMqJSk5DRR6050/u0/qjACKMe/gXPfbKWn1Do7/ElL7UFQKzcDlGxmTQ1FdvO 6tRFS+zAnXW73H4MDDQ1sm7UqzvrckebDD83mEsRSN3FaG4yDYsP4fSssWY1YSUU40Zgyz+w08s+ OoFESFOxYHcNjX1IhooaBbIJYiymKm4uPA6F1MzUXx4MWCjHB7BJhBkBEyYqbg4YECaRL0Q14LJA CggDrgflkzvaHs3HtsRBRohELCE6ntz+a6Y/WggOV/cXHjm8hyRNrTXywpgFlvba9BVF36+6n1Rq UT83JRdXVDkVRy/Qt0YcTKxQ/J2L/TFzsZWYlr0T2KZ2vJEbeIucsMRzM3dryPS53y0xlMtJl2fc LAyemjKmDEXTyik3kZ1xPYHvGaMZ+kyJNAqAjVBUMp6AfxBJIoHOe0j5fJuA/wsRF0+niFh6I7Ei 9MbIq0dKg+uOp4gGCJnrDTn+J/QAhhFIz7gZ05M+EulnxowQFKUFjEdGDxQ4fYb/lA== vhEfdMcL/pdhpgBxcUfY+mb8NPWdn/5K+Ola6P6NMOHNgnmdM1xjLouFSep4LHiDXjBu7n26mHKm bFZpuAKLFXE5lzuXTjIEPQsTesyYrXUqTA9ohuLLuObdLf5OBisGHKKoWvwpOxgDE/JBwzd5GNPE dqDSyIjdxyUWOwPGLwfsSA0M1GdjNGUFI9D38OHS4Jss32NFOHFCN3jsnX5IJfadZ5V+0JCmi0mR m42Uh2L7CfcD7GWOnsLL5OIETeMvb+WXv35VPgYGn0g5UuX/WNiDjY62anLcHx6/IE2ZBfkrZxXw 5MGUV+hffgNmQfxGuQQJb40mfw0Gvz69dDs66nfGtv51Nd/523f+9pvnb5HUr4K/xRzu6e/MbevX xm7KxsDnRjysPv2BGy96POdm3Xn40Nx5Jr52TLIyJlGSCItzD3EoyhQQT5dpW3xX4/gR8l757xh+ lnHn+d4QSz8pjYTZmPlR/GkC4pYZL1jNnpeeSx6u3zD/B7LOwhymEr9yIUBbyIClwW9dBJAxaAol f6OCgIokqTj9ywsCYunq6u+yYHuK7hrlJ75rur8uJveb1XS3yibIb6sv/oGHhvxB80BDfdhhEa0/ VG4XIZLmDE//8tfI8/TD1/A8/fB/PTzv1x5ekJJCCtJEOkXE5RBTMXMrlqZgCTYKBSAoOfREBIal ktSvKMYgHknC1EldoIFqDCiBBpEYzD39FUQbaEvVbVl4/awT2f48HEVNFLjxmHEDXifMGB5sdfZ7 +MQvGD5hOeg/NvXDxgSLJZAmQsYJlFtLxShYLTMB9BHwZNvnDNsPk/pl+JYoRq9RrmqR46csLywJ 0vz0nRuP3AwPJD2gVmY+Mvc3LjV17HtU9Yk/wtjfIuS67yxA3ISbjpjvPPd7yNqK7FThh5J14iYD islLKP95wrjgi3v2De3gb80vqW+p6P2W1z32h73use/Lbrjs9B/4sn/f7sbrnvzDXvdveV71h69W XrDg7Q8jboyON8V0/D9O3fIanrLHY2QsiXJ5xGssEYVB3xu6ISsh33spPbnPa/cNuv8KrBwRoRPL i0durpb+TGiIxZJUAs6TlvLgRTTIfsp4PEkk0uoTMzSQv3E0xBOADCiMABAaaEgi0Bcbg5lgFHqC 7kU1QwMV+U1jISFd8ZqSMt8QEhIw1Q15qGWfdQJdj2CKhBhUx3/LWBCnp155K6KBTNJi7T0x9w88 EbeOGRri28HBNrSRn2sT0eD/IIpS0qGGuInQDRsolUG6L1jaVmaI+zbE88dne/xcEkTinLR4gCXJ D7DS8MArLnNQ6YnZmtO/jTX/9fsZfq5FFw8nCXifOhIK4rLLPDJOwyRq9YnZsid/I8v+LVf9t3Qj wZpOWTvD8Q/f9rqcMeCP0XTO8MKIc0+4hcC6Zzw7Wcz/SG2w7/79X9NxaZxAx6XpGGLfKXjvbSwR iZEpeGJKU0v1PH5NB6bkNw5S/CMmCzqN8luSwCKGh+jQYRImKVgii0wDwkhTqaWLqn9VlPFNGP52 KUM8c78cDAR2Dv24w6UT91aPE+ZgXaZzDobi9Hrw0kXTQ/dzrj8ajHqM2tTpobtyDQM3EMRcDils 7GM6nwXwBpPxaOJwPX+thG9E7VLUPlBe3UrJkTS9aTbXHy7BpL4TDIoxSsSgAYToJQarDG6NXv7o 9GK5VNt3jfi7RvwLqz5p+rtG/F0j/q4Rf9eI/+gVnO8a8XeN+LtG/DNpxE/gKbMYz18wJbg1mszG ihJsksMKj2VSKGwFZT6J2WRJMYxFmUze8TqTUvRXE+zGOTZcdPt+edpX7963vcC/ycCQIxYNutl1 MEz/0zX4TgDbD+LqJYAmev+TS//c1ewtY8JfGDHTHie+tMcIAwOjeLk5LR/u06gaBDzlhwdY6CgT hYagW5OlmBj9HxCWWrNDhqgAosBfsHUcFjaJi8dKkbjy//DrKs8MRnNW+jShROHIMGJyeBIhn6vK cSva/0UjYacsL4NCwT1o8FImIiV94MbnrPsDQqksJvJMSHkClNwuLkGD6AXgSYRfOaBIiqASkTIY sGMYoyiDUpAqj1vpm5DzH1NyYY5EmkIVniMx8ZJmEeJstuhhaI7JUSpq9IZ8Bk3JYQmJuEQDMdgk jorMoD+0EN1Cb6EQRFwJWpDjxdLy0aeyoCpylarJUrQUhDviej1ujMrKIIgS5pGKHonJMBLSkCSS vOZgrZxzwDkUlAGMEbT0GQFRi47V5VUUv1p0FYy4lUutoREjrolE9WoHM2Wi6N47iZzT0n3XblLN S0UfPQIEMTh60EaR7sTWfCVdkI19pnxAyeQvIxJ9IE8Etm9xY3nWhERWaBLw/9xydCvaLiNmPFYo QNotbokglVa3LGDx7iLLzzmBkbcW1rcaA6j9Ysari0ZLbASTZFhDlVzUyBd1vIQaN6aQCPz4HAhM xv0DBCF/LW3OmBSHldYV1kZDlaOwKGwEzDs/GnDv45EyDhnJCrORCSwSk8alph7L3Yn/q0KdMAr/ SMn7VAkIVKJ5CPkJIXMpmewSYgknxJPHC1h5jhl1RxLEpEjPCmFD/qJGW9Eyn0qKnALCyP/004Ln OTdQOACP5HlmynI6xMmxRhKUmMxmkmDrUrQykvyYGzJ6AYEFe6F1QtyHVL6Bi+x+xwkupWxCcZ6q JMK/0TdOQTYix0aRylrIARMpcQYyhJ8A5xypQGRUy+XZxaHCGcRNgLSZ6U/MVJUpKbe6mCKOZPQb fX07ApzL3eWBgsZMFRhJORoyJX2CACnSygwQO1e2U0IuJq8ZCi1fuG8+FI7vDUd9Vl48JXo1JfF4 cevLhKjAoUU2Igq0njASvxd1WFFdCLmnUAvAlIlljVXbVIKg9RfgLdxQKUbeTMdAlU/U4RVH49G0 D14hU2RkN8Sl5iqkPN/jugA4kHDqilpDM/wEQgT9sGMgKefsGIk2DRDxP/q0A/0nCMw1Ox8B6Qge L4ARMQIcjHEEy+g7O7GHyTz3+xjNS9IsP11G7xxKOEkqLkHUPrYTZ5IsWwaje24qjjBZtAzE4N06 XNiQBS/3ZtnKjndizFYPd+kNhNUsKAaIbGesUjqsAcwJ3OgySZNYTso1uhzB9DzDJgBoyahCo1qn MBpJiK/EmsAQzL8GdzHTZYUeKjA3mkzYOT+C9pG/Ph3A/7nk34GEACb8ZMKAJhWehawDvGguxgLc 8QD9uvHir9Q5Kg8p9aGuSrE4IvOZSatT4noL6K0pMXMGVV6XfruX6rDD3/fnjQuuzxq+zLr9v5+M p+B1GNgf/Ki7mIs30KCyzTzz84DYAnysFRCB4z6gOLGN7GKS38J/5j/OpBLT/v2p0PkBEF0Wu34T b/qDfM0maAufCybtoKNHbCaNRND8+o1iZ8pNWQeIGXO9T7bvBDNyy9AvOy9gB/bBQEkHcwPE0WLn F2gS9vPDW29p+TfEBGmJCUfzHzHdMeuE8G1X9be00TM/ON7qsOkvTNFwer2FMOcmvywn+3Z0mBEY 6OaFMg9sMafk+M33BRjLr2gofwi7VBj87lcsjX/TAl25N8gUqY4Q+ktzO9tp/OhkGj/+0tMgqZTd RIbs6H3ohMEoLX/1U/rdqD8fOpmR1PCXnVCUpBMxYI6TRMqgHT4vYTzqsfWSk5kpTX8FchWN5bct Nb5zte9c7Zee0m+Qq6VpmozHvnO1bzuI37hG/p23fuet33pKEYIg4n9YDFa5HdxsOl1uPucmDXYw v+RH76Opk5ktf/Nr4bQtbsH32AKMVP3FHTPC4He/9BAm7JzpM3Nm03GkNxzHbl86GHJCXVhjDQXn 6yTpbvKswPI/sO42+/u5u9wfzZnuaDya/6iwVzRQ1FY5jWqx88XM3WCm7wt4NNjkZouZ2D6utE+7 KyjybQoHd7VgIEx3g/2BHS8Pg3APxLYsD8/axAFxP7D8DB6SCdYf9MajmbvHQRfi7908+w44gc0X 3GI+Hk1Zt4AyiARlppaN5wA/YktYMkBGCt6SZ2D9hPAPLCxu4e4yY2bak9UyHYuKKZWwZky/rxvA BFXn0kxAmHFzXSuAUGnkSZlj9WejiHYZepxYCAHRQb7uzi/mnPsajVMqtQGI6emc7Y8YNz8SuPHi JzBK9gUjK6OVryhzRuQzd6vnIoSGumTKc39Oud4nQKX7nedkWjFpCofBzFl3FwYWS2XyACoSiqSH tHXOCkNlIigq1n3NwvHDP8UvYoTmi8vFfAb6t/4GG1LaPWNmYIbCaLIYM2oTCqNwVAwFHYL3foTh GH3Q+idWy2pgO4afdzmG77th6Ia0IAkqTqVM27gpMH95u9s2hTVHpg7b8vIpHZ1IxBLmLUlsALZN sQHYtlUGsKQLa4Raix3XmDkgvAbXY8aQwAT03kgAKm1BryxfL+Et8ddt6EyHvepW+zNfbzI86AJ8 LTRLFZicAZYcZ4Tysmua3g1HvWGT5wajMXvGSi2xGlmaxq1FF2yVCgcY2jWkJ+UDiDHaCHx50mX7 S+ANBw1HDLaioJBpFo5BCfLXIVufA+DtpCjFYAS7kXKfcl335Qx+ILhbOE2r22PKqSzaPZoiFswJ o7ljtkK5AUeyYCU4+0Zti5DTFyVOf23G6VHTS4lrt8xYvKZV25C3oyYiv4jeiky9gDN1DUsSW1fl fBBm2pd4lBVXEj+CtYnceV78CIlh/UekblCXOtHohIWXmy2nyBYbO8O22NYW3dpmxvgW2zhGuNh8 VYyLX62EcmnsOpzbbCg/wP/NdNQDypi8DFFVi4/ClQSMpiNKJZiYPFL7dvitlBPyo2YR0aCNWhch +wUdgWlALtHkgHr/o24RdN85VG5Wmirk0NO5xNSwkatLq/3WkagnLObd5pnZTBY5VgiSxlSf9sYL PYasvmvNAREBAWffssQK89EUTQEHbjJ6ayXUpB9bNdfBd+YK9XpEXQf2yHw0GLG8PYpMiARHl8NB YMjWaKdGXZPi+ouGR77Hc11m3mB+RGVgNE4mo+8KY5btQ9vdadsCsvYtcYEBHk0/nQK+Vt0+SAkx hayqIkgTsceNJDjamL7rdFBtbmY/VYW5YtzAtDHiZCXud1MxbkTPDOKWH59zU079tj4B9mu+C/QY ScujTFihUcdLHydou4/bgJ5VdcqqOZBrP2JK3dlo2rf/SOLxBl9Zjw12ph2aFQqB3Dln+E95b2B1 u41at/nRBDa/w5yStNUHYj5zhecmQED/juM/cbJeYfKSz0FrEJuRRG8I+mMNUWfVp/qpShbql7ZE XGB4a7asrI4ReLtvzHBhjUTxmzw/d8AxAf2jWGoHvHUELTNIB23FzWW92bSz1u+1mCV/M1oWPZtY jQZxnm3Vs0ztwjqdqEJkte9UFmvJ+rQYNVN4rURjfQxUI5iFzPHQUwhkb5GZif7CEavYIteqFYJS IZgXW4mNCxnwXrROnIntCtAM79ju7Yj9nUMeYbSXKJs9ofMGWG49qEQxc7Y9XEy6Uw== ZjQWluwQvYrr1DdlqjbdCCzaYm2YBSV5zPxXC1jQ1T2CZvmcgesxcgtgZ7i/Fux4zLr7I3dfTP8A T2D5XbcAGjDjHxj3YuqGqpcbW3CoEbKKl45zi5dPgM4j7hsB+uu+DLqT4M7YKWoCepxId0zwrHu6 4H5Ad1OAj8Zif6Mp3mVI/r4P9j1oBZAxHv30E8OPOdhyMfUB1R4ohoxIawD6mPkROhnRUOtToAKO 3qduTgYz9kkQONDbFOal9Fmp4//pP3ELPYAboTdazLmIYxWzx49mmOEm59PAsWATsdkAPW4MSxFr NNWs2w+6EDdCUXkvmZ6FkWx25lvFej2VKLEQNnwZP7ncfwoe3h35ssx96DS2fxku5PjqZJh5n3pO K56Q31ccMRFhj76plendTO6menweP8k0nn3nOX7RS1bK1HnKS8bjuwQhlD5K7yFiL5d9jRzkDkMz ISecUVGXN5dteHi50em88F67auQO42yrODo67pUiEd/7UleN/gPoL1mqeDPJx+q89PFSiD+GQ/kJ 1xDy9dZ8GDymdxeVUnzvrvAx9t25vKUBcdo1BLaXTA+St1dPz/l2MXJr3ineLvOSO/ysvOQyQmQS LIW8i4q/2h+4vAhZlTdgepQGL3fJwjg3vs8MCsN5cZh8JDXoeNsv9cjGV+7wxHcnwgFDFoqv768c +Gv/q1Tv1z2FcOpjL98K707FMdwz/YXLm/7wB3vlXuLKXxzGO9nDvDe2HyxchN6CuaLvplJkFwfH t6e7w2yvx3zCv0bB8qAxFHsmiSiT5Ed7b5nR62m/MPae+MJ88HmRb7T2v+D4A7ns6TDm8tLZ25dc ftrzTYJH59locvJ8NEomo8Iglud7dTL4mSEViL3SqXAL0Jb0scm7GNHPjIpRBqwveX7kD4fYwjjZ nIgzeGh4c8X64e5dOZROCGBd6k/07nGyyL0GD2/7Txmqu/uCwB5PvWBCx/TBLlySJ/qOvppCPB0X PgN0WCLN236DIF92z0tR5nC/4gk+8rAXGr54RVBQE5eX6O7U4+jv4HHlUPrr8K58JjYvhspvIjDq gaoD0r0ngsfH5RBVOnk/kuDcHR1m+x8Xr2gllQEDeJeFhNQLaFQ4VQbwog6A9B9dw0ZsHD1LeAql DkI12PUncfqR/ujl26WPYGkQPfsqM4xvr0B3b64Oa6XOcb497M3zzb3eeb5NxcDq55MvD7vgm/5j +f7tZKGgSKRaDZm+fqrAUuMIX5MX7IErDVrlPsInAMsEgse72TtxhSBkl7fcIYO3hfj9aSXH88Ob eOb87gStUCox4mmweAehYIFLv+pRqZ04jncZT+LCQlAubzZ4tPBXSmOyQJwmMuCfKjES4RzTXS6X bc938u3T+WIZlbqVxPAuL/w974HP2oCPfUVGeT2eFtdptuLfnwWKQ/r6sdwlDg9KLM+HCLZ5lFUG IqJDQUajmu+ckojaDsNvFbhTzyKl+keSEfe+uKCp1tfkLH/5WjivFAenKYI86/Yrxf7kATFPgzWo Fsb00Z0Km543jh4LtfbukW4MLi8YBXtZqn56WdDV1SHkMDFikLnjlkerb9cDf4Xm1dlON50OZuMX Ooxk6wI3KI6EEQ25ZfipSQV26zV1Vlk2sz8BO/k6AMnrPHh0+ngqd/r+DPhYDLz1Ng6q805/km+9 nZaio/hOWQQw8NXofPuce8/dtutMpZy6und5M+dBCgMB1yAhi5brSqUT8Aylr4k3otwDZgdilIeh h5NqPvnqEfLE8SKptit3o097+Wbo5EkcIWTMLi9izfj78Pj8MLQ7us+32/shTPqQRHdR9k2bT8q6 TILl2/uaLFAO9kuDfIzFOL/yFqy+9L48LJ3yB2/LX4de6LvIWbI0aPN06TRw36p6q6dxovKci8G3 HJBd74tKvvc0ABu8/wWaXD4A8jnB3oK5ZPLXO+hBxZ+mA+VwaBAvFc73/QqTih76OnfD5PVLPw2I OHcE/qkUwT9FuLkqefhPQf6ZhE2KFfjPFXxxDP9qAW6paQmfVi6Vli34z7X8E4FAjbEXLeXFiab7 YlP5p4B6EQeQ1wATf6LmRaX7ovxhpWAA+1jpOa/tPo960Q/0WAFWkn+Kb4syHHEgRWXOTQ3Gjkqa uVSKOoxVcsq4C/J40DMRbE5B1pV2IVQs5pTRKE2K12IvCkRxKIfaD080EHPw7RF8dgSbJC+UF3kN MnCKEHvRrpsjslmJaPS9mK7gsTp/0yEb0BBCm0jJ6itsQdUVymnhXCtDamkIBF8II4ypdGJNO+Iz hcaWSMmUkMReVFJqEM73gfpTnFBhGYFizwXdXNBfaBnFtVQx1tR2oJ0VtpHUGSj/FJtYL+p7I2Ix Xd+m8llVmVpRnpW0zVSM6TaaiHTYwZGyXyoqlShvRThGzAxDtNqLOrJkTjMec3yqn6n0cq10gFEO RskKI7UmtFlbGXdeQbSWRWMv0LiKeg5zISpOJ0NhIUrpeaN+mePn3ut8a+Hd0Yo3Dtgdgp9+nJQn UGU7jQ45L02clr+KUCwdlHrF4gQYCIVPoMOMvaMEZgyRaWAMnRVoH1ArA1eYCtU+XQRxAY23uwGq bcLYooOqHZT7onJ39IhJZMVWg4MKIoMFGq4hoGI8HmomROzmbn3+Qqk/brxUSolHStdLMvvYqABt PJGL3pRq/ulu/uyhNdW8Z55p/qrWyh2Gkzul0+BuQmOfAlMYqoO4ygZMWBwthe57iT0oA8tCM1dM NQoC86n9lW/WA8+lLjCZDUCIxrqq3yPbLyFMrwuiHjyfRa6CJ7fMl8sra94pZiuaNwTVAprSZXFe fux736m3w5MSoDGk8kD9//DtsFLa3JRQ6BNNDVEOWJdLsvZcYqbVO6iDf1bKJLBbW3SaIkhun0gO d1mAE5o+ULQ5vR2kAstfNuhC5bD8HFG0rAgyBV1eU2PQqSkIgSWTNy/sWWlwJbSio+ZTQdo0cM4x agdYSdbWrSPb9u4jJlHEjfdTcphozBmX9zA4y75V/IOzSJ44bD9Sgb3XQ1k9xfFUeg8HTkQCuYp9 cfmzu/s9sH2CX0toWzaAXF7cBMKGAmyVSr7EKrv7WloNhM+7o7C6AdKf7FkRmBL9YOWtc5wuFRoP n7phgl4ko+r9qRJojrNo/6o+icwpFfbrwKrWj9b2iUqd5omncj/VeyVOP5ka9ZY9aIoWH5HpT8YE 4JbkKWJcRjtL3gztZC579rADLLChR1n9DHTBXOZb1f4HoLEjnsrdeNLi9gjtRcHqH/kXFAuMwf2B +Eohd2TRkyF/Ma01UvUWe5Y4yb4VxtPbIjFIF+uSo2PxAPbIrFArxBcFwuUlQzeCsmtfIoBvPr3m 09mzsPKiLZvRx2/JZPuAJU5rO1mA70gw280Mkw56hhhb7nv9niWC1DmEAIehHj93i8NnTyZ4XO10 NLAjZ4XP8+Be8Lg5iGvX4LXwSR151BeKl4YqsZ6ri8KYLZDFkefJBxhq4QrsSmJvmC/3Pr/20Wqk P/h0pfI6KPsq+as6YPDVK9EqIyg6vy9x5/vTArDZuuno+fVzHsKOqX7JZXrJky6v3FLevxpguDvC YvfWwooENNy9yDsq7d/0uMINnDgw8IEseSTIavFsrIMHeHKzNr7FN1q0MCoOn4pgn9Pnb8tg5011 9waPH14OpCbHX0DFOH/35L5Oeqy8iL5FPtWdvbu8EbJ2G4KU0IZehYfSIOJJiBg9OuUFov5UPVRE VDlzynQjIgc9pi8I0FU7WDt6jlOY2kHVnn35dvGyVYpc98O5zMXnCFCyIrFUyhO9v/u163towj+V Q9z5Ip+Ojg9UYJLLEnoa/JfTNpTXb0BKdW8A7B6lSm6ZkskCBxanFXsrnZ1x2eLbZyEO1An6slTv Ba/AszYp6QJS96Hi+7ASBuqZfyfVys4ey90o8Q7+eRxlLt6zo3K3vf+lVWRocVc+pdr7e61KZ3f/ utJp5ufQs941Hvy79xOsX3oH+mprAGI5URgnr4KYciMKI/rQn+PD6UX+6qA0AFpfOMPO1G5Fdy+Z 8lxUAg/NOdCeyL7yohE8Orvol/qTdEjtGczP7wdiYv8ObOHDuOaFbxgdsq9vsg6DyVfEcGpVD9iV /dfcV4HMAoYU2y2HPRFaPzVNu+PMIH92ZtQE6JZyozr9Fc1SS43GLW+l8wn2YvPp9LncO9lPlM7q nla66f2o5ITTxgdqJ3GYZRoqjnb2wLpI2zBTBqMozEI66pCPVKLD3O3gpgAXeYZrhxKwYPUlGYjm E7WXulZDpSUfbCo1KjDl1wp1k7/K3nkxJVhaxrS/dCo04QkYHal6q8+d/LR6w1QOq6RfB0wiuUg/ lx4+58dgC5fO89ftHNAtcc1bGlkUKK+Ng3zyOVvMZe6+Rsm7WIzNt/PcEslRic+vQiJAP+antYOv ymGlJ2CkcnxExxQPPGwuK5gN+M+zhk5O6sYEQu/ugDGw7zma27svXHk5OjwNtRVl6iiWb9+efOYO j2cXgI/dRM8Oy11fwrTRLRAEAQFKw7zCjiAqa7uVYv7lHfwT7lRKzXNqGYAQynHhdg30cnWQHeq3 hTJX/UyVIwwczlPpGegUiQuA6OOhukyAJ5+1i8PEvAl1y7fZQeFjPhnhsO+O4kBGXAvl4AE9wJVz 8E941im85m735nPNdn1bpJunjy/YdCELjnl7E0DJKqoV738DMdx8a/40Kg32a+NUgs/eocOjLPva HBrQCw0FWB0wnIP9SrGQPoCK2gXQ6vJ8mXl78uO9EFQvtyi97z4/APPD3yv36MBhnjg+negINsve UL3S6fnNPeCltTCg6aeqdvtkkNNYVLB69xcD5OmtzoFuef9WOj2KUeXXy+5LadCeRlSw8ODmBBmX QBBkTqWjOmAqLPPIt3T+kuvN0heJzilYkuk1UDXLbXjKk75+1+7FD1ENAn8NFRULgtj9zMfmB6X8 9fS8VO4OOkfLvYAmcX/6EkgS4qrcu8ul0A7TYIwQQo/04/UBAxQZ371ORqBZ0TuV8324BsXSqWdA GPaSeFxc6gCoPBmAOL6Jl/OJk0Gj4j+rpjHLyWKnOiJ7+fxFOip4ZIujo5MUOp/Bz9fCnk9laQ+A EiGES/U6tF+ihXGJPXzdyTevHi+AVlQ4x0VeOj8BqsEd0JQkU0I6On3Mt7qzgXiARR2xN5pvMGfF CVXJhnYUp0ZaURtFtCRvx402dPbvlTszeI6MsIMLBVFraI7g+cQzNJlJoEedtcF0b490cgHHQ5f2 AuJ7C1T2n3zXwF6q0qX6ZBxDX+Crr/kmNa6+PHK+zMVr9wtI9oZvaS+i0QDrLZ8K3UzgmcWnwWEU La/LMV3eL9XHwVYlv3jndc0VTVFeafoKcK/zSgCpBsGTu+Br8nrg61EH/OKCCtAfx1T5sFah3jzh PFV5ybeoSiEK+Bj1FksXKeYsdCm+F1+1s9dUaUIUkJVEVc4SV+gnVeof5MV2pdrkmA== ChK3WaMxZNl071Y6DgY7FWqwkDpUmkc8pH559w70w/cOakkfVZ6P0Kk2PNKELjb5SFOzhWEvsf1y b4cGAx17+Eo5dV1DZIHvl+RX7bqBznCzg8n+PujggzaS4orydl4apMsRoCJGApYS987lLQcvfUGw vq9hq5bH0AQ42wM9VyKWPd/lDseVgI1u+aSyQr02A2V88aKcfstzw8uD4LHwmFblGZrQkf8q8FC4 auYuoqPdzKHqJhH3fqzSGUdpoEfT41zy/r2cT1WFOQygCFf8p+HbInkzEdQzTLxnI3tCUitFowIJ NUm7kCyLK6YGWAFHZAcLlpdiJxQJyR2Uopgg1Mhmmv4i0y2wF1uVSu49Nwa6ersvoYW+vEU+pYMF 9AZdZ8LvnhimLENHnshcvcTnEzTd/EB0znbp+dn8CMw+EsUaj15DgCpLwkEy8xpsIQ1dRbmsKcUC 0xjg6HEmH/f5uDR5dxbF0VZn7nNC4H6ndHb68iWyR43sigNFZjADguc5Sme6l/u6b11ey6+B5GvU apXO/CVcyfnYdv56zH3hqp9s9MqhIM3HZLuzmOZbu8Wj0nuC3jkMLZ6BLUYffx2U9aqhIjIUaSHL F0m0CJJ119wPHuWSOyUUkALHWky2+txhdbb3GlbduS5vpt/vtTMUc9AsjMNku3r/eD8FyzQvqD4A sQngm4vK28tiCEN4fIjLSWqebvWJOZNPhSM7QPqE7wAd3AAdJj/tvgvq2ToO8ZWaoANhLHBHA/Y2 30q8LsAiP3iB8na10L69y7dvkm2EO6D1QeylP3MfDTDzyZ3G8Q2x/HZH5rIzQsgThxcz3BSGyCr4 Dtulg1G0dxh6OCsAGVCHq7E/Ejeuoixinl4d5uXFUYzw92mhl788qzHIYoeYoDRDutop9x7Ypyxz x32UouUPb6Wc5kbl1/vhDbBf2vvhB4Pmb/TN5dOHSHftRuXZFHYlMM9yUEVMFM4DgVFyWr8K6sLJ kBQThYKv6q3sPZbDD6n3QvwuFsZWX9ly9NcZc3L0XGKBgSQcktr+FCgHR9lu5vOo9DJ62MU0JQwO 0guAxJ6YgYhdFYe5PtBhxsW7PJcf+PG1unreBXpEIZVvPoY4dfZaWwxQB4y78JV7i50RsO5eEsii VxmlpufHFODENRgbEeZkr8ljOnd3FdxHqrtqf4o8OQM0849QfnriaVbe/C8U3AzPSHvEhifB7rwC SVq7pjP3N10wF7YCNJyXt6oXkBoElQVcnHiHPtYA6OA5jGuwBJ3ZfXEUr5ZId4Ll82Aa7LtgCOyh tlDuHdcAsJv92V76pvy0l36/48G4anGo6b6K0VdghH9yLCe+6zJaS+gKBwdZfEZxvh9cNyJ8jmbd MYOl5hg241mYbcdCeLz+agd92xnzzvLM9N0i5Bk2g7GizFwNEpUucYA5uGCGMBrfrSY4+5s822cH o+lIE7AL4HAiJvQJuTiS1FhUu1RHvHTXimGuZtNEyUCM0B3NJ4x6XcBy9HRvNuMjQw5FxNs2wzJQ UoRhiD1sNoKpBpGuTZIWbClFT4uN0hF4D4MVyDGeI2Y+66502Yr1ZLDLcIygwSbircHWPfZRiDR2 vUEilYiodxEZT4RX8WgxQHxRbHL2hPlYGu1sZpE7AwcsUgSvi41PxU1xj6+6EVA0WHSRg0WbMR+Z gLFLK22NnbmcjeFg0mC6EO5Yva8lkTbMptItuRFFQngSRSpYtGsnpuU4Gu7sffIpLRKMmLcgPdiQ ncKrFizWssf3I0JvNrZMJISNOP49YkXosDdBLj+ouX1huTtmzFrBEruD2eSMddoFpIceSqWew5tZ LHK4xH57U8GKAkGbwXg0G3L8Tw6QIV1JbpQ7BZugOxhsR6/c3ACkWM9CikGIcyypxBa9PzinfZH4 prgsMCB8uL5dmEgK+ImGKzuhV8Ax5rB+qeMOxtZ5vNrGyk43JUweK9to07TH20JDHTseHW/N98RO YT5UV8lCNMvlRG0Bz4Dp5HaCBzaFuszIMjFwMJ1H+uMZP+CmVttHbKayXmOhDbucwKQ7PYmY9Sws uoJVpp0WIm+TuKptrRCFg7bWGsFMiEzZd0A7ctKj4T0Nv59FNLcxmEAakz2UxmbZCPC0OSoMIq2H wfiFCLwoYMoK1lltoJ0wZIDay1qIVdSj7t4ak3ZAk9D2a9KuizKjpKGZYEK9g8xYG+f7vGCrPAG0 c7P+wgJVCIx8q4LVsBEowWL5UIOexW4Su1pMe+Y7CcCQJRa6DsIGmK38VuFZ30kB241HlvmpoMm7 XqEzzu8FLXl9S3NZCQY3ZmaWAn8Ska+b4+ZDWRGyhehMxiE8MtMpZyX61QH0Jj9+mueigoZQWo6m FqgGbVROaXIlkMV4AXKnzuwyTlUAbXAAP1GB2klsoONijYXrasFdLxdpMk3TYSpC2liXEJXYyLS2 cV5u6Da4/qt1W4V3AF1OxRrqEn6Vd/DSvDOgqGgxD17ACzTa+E208otSu7TcxT2jv/cO9TuZqfY8 /gaZ6+jasxkj8/a42gUql4bl0qtvylOAIkVhi6kvmjzbGwlLCd/wE3jRmJh9bDhJ8b6QuaoFYuNs vg8Mv4HXtqm7NLvsNlBLamurnsFVE6uhwUWR37lQfjX+xDD9NXicKH3GTy7fjon+fiuHfh6na3sf 6otYIRVL0Y/05BGlgyEfGPZZrcMWef74qJsPzS5Oc2dp4ThVO7yLVLjH+G2Zf34kXN7SY+WhXTnK H/XIg3xymvAUA1dxIbYHQ8G6USIaPKfih1eZbOykPS+UBunqZ233+ogpDYiHY+UtFTy6poeeQKx2 5AlHfdee4PHnocfLkmee0PCj5fLCB5VIrJEGfxzNvFIHw3nseBY4nIEhn06kITPXBemvt9MTNJdI VEh8gb9as6UmYH5CqjJtU/70w57LC/BEohlcqoPin4X3FOg5tQgeVz37cYESzmWwqWrsLrs7AD+r Y/DtQ0mec0Pg+azwyL9km5dENN7yo7GiTkEvYrdV8jl+P2yEDDt9eS/UTDulqY+ox6zTLv8aDd6B XrTdSp1eFAK7N7Nxw6hTYfeVLph1Wju+Sk5vdZ3CXlC38cB9MNu7PDfqlF+8ZfwH3kPPm1GnRIU4 OTTplN7dS2UHaUTJBnONPzwTlXbhynCmO5VZxns5Or827LS6yzV0nUr7BXXrO23Ez80QfMM/96hT 2GlgCb3VnbuYNzH3gc/i3NKaZvbA6kvdNn0+3arG28nqGHUKNlK3rO30hX+57V6bdJrpJG7671G1 U5cX6/Y13L4w7TQZHbR8xp0eegK8kAkKxp02k6+gF4l+l+Yq+I4fSJNOE8OAr8BWjTuNB16Ch9kJ NlOUxq+uKpPY/aIX50adEpWzq4JJp/SuN5FKnJh0+tCBhz1cu204153q3tF+gx3eGHZavUrdmqG3 th/2RIZip+XnzwqgMRzBOwHBlwshBB8sdVrrTBJfBzMCdJqc6Ttt1C9epE4fwn7dTF3eZCISeVS7 1cz1sUA0JldJ407rO4tU46GXMuz0cszW1E7Bumi7PYt8zUImnT4FiVbja2Hc6VnstVGpnHiMOgXr 0q6P6qZzbZ3T7TezTkvELfGaNu60Ed5t9zsHWdSpy6uf6+3rkWDa6a2f7czMOj0n7sInBaNOXV7Q bTl4l0vxRUMEP4bar6adfuy0GwWTTp9p4oV5C6JOIY3p5npxM/rMeC9Chp2+vt53TDvl2BP/u1Gn Li/s9px4KzdKxgiu3JA79/OrulGnPH8R3pU67cYCuk0TTB+UY6hTl5dkduZVLVfK8ItYkYCdhpY6 vTzyf72W73Og0yNe12kwwz2EpE4/0wdqp4Anw269g6cdUZRThQeyrmUQ10T54qkKOw0vy9SL8N40 lm2CTotzPXrL5Y8I6hSui78c0rFCXz8ocaXYXqZ4pmWFbPAodfEEO40ud0p7d44eajXQ6alH7RT0 gjQpqnA5FOd6krmK6BD8wR2VP8VOT24aDS16wcJ+DDkkU4EK1Szib6n5xENlpl1Ju1h+v9j3xPqT mfHbeABsmuMEa/aWB8RwPlLfarll/KFJlA8vy+L7JV3g8Yho5GIUervM4B9PiMb1SdzoLaLkxzzR 6J/RZl8XiXPPXcrsbZm47NWvzd52iFbxcy5hbPn9U4ho3e56zN5GiHbu3G/2NkHceL4i6ludfPEQ /MKTlN4vc6oacXvjORLf6rdZ/OmUuH0Pnxi9RRh7ahB3e+m82dcXxB1dLpq9bRKPu8kXs7cfxMv9 44GMsaX3z0ni5WMQMnubJl5vsjGztzmiQ3fS6lsdjXV4MnJwljD5mvGT6Tfq3ORtd5cs7L9WTDHW bZFnVzunJl/3OPLikxqZvO0HyIePs33jt4nXaTt7OH80wxglND2+wOkFekv5jv017du8J1LLHYtv 9ZyPmo89h/HTD/UtwFgxfHCNW2D+fjtY4IQLke2J9lk8dA25UgHQHVswMj0l4/KE9Oaic1+x0j5J PiBbsvRYPoy44FOiUixEesViIXoWxO23N+8Yjicm9of1vBvzIVMQcTlo5zypnC96npr6iOjR/QLu jCfAHAeH6uqf70ZHR90A2EU7ZSF1lWlqGC6/Q/mOmmFRjEA7B+PyeKeJIbRzOF2ncF1Qt/GHe9St Yac7lX7UtFNk55h0ClRbYOcwuD6GzzX+8GbRaTWcxjrt7+/vqp0i7V/pNIY6RVaShGCo/WflTqtj DYJ3/Hin8dae2imwB8mIaadI+8f0sZhurlD7fzbuNP7wZNopQO+E0nXq8uIIBtq/aadQ+++bdcqa d5q6gNfEmM4V6RQmnaZqUKfomHV6pVtTlxfGlIakAaC/JErPLK2+cbusg3ai1tdwBDEeaIrtRG5B NWitQ0izcSsLYGn7noqKh4S5LiAdTmQuMm7VHZ8jQzdkSPnnCTfWAbYhUmf4bnoLTiGAa2UMV5CS m/scHF5R9Y+pHiLiNOH1on/ggt7hSrDUwaUymhK0/Sqoic735PIep6s3TfBg3yv9w9xjGrPkLpM3 Lmj8VCLLL0IVm64yZHinl1f6J3TOibiRbTGZHaszADRY1CAQx3whOmRLXvgPIMgTom49JNRElC8m gwqVQ+I/Ej5JI0/gFUT5whrlLq+KeWmGyK42nF/TYz8/9M+1bv00Fh9aQaAnnxutIL5+ncWBPHjR pjGaH6cscUz2w9ivoMn8skEH9OnSIMsCWGgTYpfnIpJ79WG2HcoiBuTOg4p3uPfXx7zSn83OcTlA FrEBsmZaz9VbhNMxH9BzaKbpQKG7FVkP1PnBNKoYCMzZj7GewD6iS2PcPYTm1qOR5Av6R8Idcpwa 4K78fOsxY9vGu1I0bAx2JXhKnjU2nFp4Vzc1ZV00qCbYZmRfPE0wwDKYbnNiP6t9cVbqXLTk/lom WOHzbtO1mqkSQtyVMWNKr57t63R1zTKVog4oEKEF7hdzxHTMpTTBzm+iEuUolCzaJw== xpRc7QobANOKfHK2tOu61Jdov2y87yrQiVQ3XUl0yrPwAV3vPKRwJb8JF2Qq1MuicKZM12Q54T/S 0EU39JUi9zUz1HJBDbBQwS8NCR9X0HRcxKAYeZLOX5aneXllpIVZLUn8a2lJPlM8mhU6fTPmtU5Z D5jVvWAmlkSNEV0UYq4zqutb1XNVvViyWl3cFgPN+1WS2fPVtqA9faY9KvVqTngxZB11/bYk169S hcf0qfGQlNHAf9T9Yj6oXVNZqS6d9fpJOj/A6OeepWKx63j9DBQ6CWMOVlCHLIJlOjdOiQE/ezUG 9sHerklZuNdaAqYVKOsBE0ENfF/3W8OYVq/bEGODjP9xaxiDPG1tYJJfS/bDzI+/VMMVkbDLSxXu X03Z0Cra8XvN1BR0eZdMCWMBXYMnLDWHho1eU5B3ZeH+c2cru7IGz0DOLGlsyVAOmGIntpc9azgy lAFuJD/M0nicm32GehTATSdix5MxncJsLnZMQTMQY3sfDsW51WI6EIULqPbLGjihnA4EW5floVhv e71lmPkyFlDzYwHuSlN5Z2STo2NJbZCR/EUYDUl1Z4PRfNQBF2DKlh4SXQcmTg3qRZjaODVcOvZh tkE+6nZqh9WQcCsJDGq+uxUGUNcxADN73wkD+Kg7ZQAuG08S9TIP+lbh2IZDQvIFUIKNrqCnWkmX 11Ptib80Jw8KHxXd/FDM1epENXS8IaW9r1rl+hU8rj5/bYwshCowlxW3uAWyTDe4gaxcRpZ2i0eW t/jkFG1xUyPNtdyBiXcptpfZ2VnJl6DiTpWVk1MLO28Vo+KEFN0E9h4Se5csmBrpczo1U84/OY2d 3LbP7exhK/dGbC/9RejsSgsHh5n2dAp6ueUcTMjlNVotjHZ0uvXqfp8T8nQB42Fwjr4mYhJ2vj69 D8TEY3Nq6a8xYgWYp8Hl1SvTJ5nmXKdMx05uvA6cieaqtLpfZmdaZXod3J3ckF6j0aDrFFcThGd6 TdiYInAxaLpfZmdaQbje1I4CaGrKmfgKXEkdiF74mdG5y2tB6Zkrj1byrTchb9yRr8+SAZwtSbtl tLgcIUYn6AwRY6XLynIfYkcr6kyw40iX9YGed33qUaxIyUXw1O/A3W1vwt63jE4njCw+S593tTlZ XdopHngDYOv5W41Aubwbbz64aUhHPNmSVuGqBfybULy6+oGDTXcOghI0giKf768AJ7T6aPRnSQhO eDXfv4ncQ6AijrQLZycVgcCyvnnfVk8YZH1MzzQc++MAMHtx43Jod8GRWRz6GJ/xKbNfXpf+PuXo JApTP604GjBcEgGRki/UXsDTjANFzgFHu1E5mtm6OOFot5xTjmbvgYfANuVoil0JgG2BowmfsS3s fXgQvwYnWqKx5eiHdTgahIJxEM252KpwIk5HY372iuBETc366JALHslUZKwL4F5ruGRBq0Mh7Ogw aqilSIFe0laBFs/Bkm8cPnWyEPYHsEXwom7IhDBt3F4zu7+1Psg1ZbJG5/sA2Mpavfm4YOyD6dmr UzbzMHNgS7vstjNcNTWsaU2mIK3+xqq9CMXMmNN6e+zhrGdQazwkEI7T0CPrbSiCUjahw/gxS2nI 7FSDelnI7DQwm0bjtV5VGt45jT6ysvigjbUdbxaiZABsW/r985eRLDTwwVoTGrlj43NxJsWYnfMt SDEARX9itS6cLUQQITjEVmZF6uz9taUhXLCwpT95dWmY8Yd00hA+M1cD8DhYB9IQDORp7ih0Sg3D ALM3PkmEIzM3SDWoVDek2ekbMBVgpP1WfNUQmOne1nJ+J7u7wzvSdDX0Yo4xejvGJVjJ2/AKUWom jPne0nUtUoQS1eloUA4pYmlzSX5LnWCiCvcPYZ1gWoqcWEEs6WKu7h+sBJOTyLVLzbiGHnPvqPn2 MiaVYsTQNlon2hYCcyRaDM5utJnCErBtEXHhYWffiT/Z8GxgaSVtg2/xM3GTzd4VrIJvcYowHZLq t0SDMncMO45VVeUZEa10DowtC2kNxMtYLofV8S3TKe32F+VKei/3WmkfN8tGOXTWGXR6rW/dHDo8 D2g5g069vWGzHDrrDDp0Wr2FHDrrDDqTbMGVc+iClhl0Srbghjl0Jp1KGXQqt9wsh846g07NFtws h868U5hBZ5otuGIOnXUGnXb118+hs86gU/L4Nsyhs86gEz0km+fQWWfQYefIfltD8qlkFOxiZbNJ eUAGMfDN/S/rYBfHQ1KcA2aWONB2HKUHal1MZiGnmJ5s5sl/Kmn1X3s8mXt6mz7PdvCkdTEZxSk5 xZNO0C/HmWkMLvnmFuM0PE24jmN6MgIF5Ys1cTqen0XenKLDaGZoOijbnALjIS1nPuoPc2yRbjok e8+VBZ60vMZRytxSnJIzgn0trxQKYpJdW36+NDW4VwoFKSOnsQNPrwO38WvZ2qJ1OfFXgak979qb YeZ+dRQJCZPdnAWD2CS7mfmLnXt6YbKb4wMXnYsJy3stOwgGsT1wAGgxCAVRLQtHhggOTJvNYGnT iDq/Bpgun6FLcTolQucsNqJzhzy5Sy2s18Bxiimz09lxGUZiOUgy1W6+inUCIzwXW8G2h15IanXH mQZjWsch1HVDWjdJFSKm7ECdcHBi1a9aSDZNHphtFlhqvsU8vteFtURaJY/PTvc6wJ1WmiFpYuB9 R6xpEowDVVqTmmYVA395bZCiaZ4bZRcDv0oen7n73On6qXl8t+GNgSmgIjpQBnLfOTDzE3MdKCVr wAKYTb7Nahgjt4cxfbT/RhiLbYYxreNXvCJSE+r0XrPT1TVqI9j7Jgp2zT5pV97sttlyZtlPDkDY MRy0t0kHmY/vtY2NPUVTmp/Y7m5ZdzbJojrZtwbgsgdxLGijCCxW2gwjUCLb5c/arpDuZMRIvihK jWmKm+12tUWGPp5/DXTYp8YeuJxEHsAJxVfxBui1SI1deeIv8To9knoR3ucrmJmmlAyE50puizXS 4/BcHsxcNc+IcubecaCPfdS3s+Mhlvbt9TFneDJy7+iI1OV1hKfV3Dumniuz3DhzT4PFkJY8MpjF 55guxSGt4pGxzrBbySNjMST7vFcLPGk9MkdzvUcGpiTZRUE788hMTh14ZOyi1GJ7Gf/exh4Z0Td+ urVAvsnpFiKIwNTi/tUdD7oz8cnp5h4ZuOY6jwx2MrJSGprNIbjOI2OYv3+6DY8MzM6ThahlRLd9 qjnEjoPkHAuJrFWWo8vK8uzMOg9V3dGSR9FMWT7b/N6wk8yV1y5SxamhETu5SZqnjrq8qzh1zta8 N0xDyWBygW2kjy2FLujli7O8ulXvDVs+F0N5dVvIgfRiASfrRg+eOUwh2TXzW+qS68ydoLa7V/G3 ST5YyCN9+pNU8MyGGJwJuvvWVu7rs82Hc60SU7d2PpzB2SsAtu18uLUjVFfKh7OIUN1iPtzmGalO 8uEcZwtulA+H8TEsI27b+XBYzFV7zVQNg22oz4fDraSVUzUc58O5DDPi9OuyaT6cQslKDgDMiFs5 H87m1BfPF9tYqkDxZjhnPF/McUwkAGaTTqtDILoL2vhGCwjM/ERnhYyvlqMTK+tcpRvHkZD2cBxd a2F9wovgaM3ndWdlrMSvlsl1s+ZdpIaWRdH6DmAH6QS6TYi81scH+m1Yfi5aI9BZ8AVYBrQJsajO NTOrbFIxJD+/o9Bk35ejnWN2rYw+x2o1e9FwTQ0CG1bXxmHK4DZuA0ZwNtuGMhRpE25ydweC48iW tr7rBsFxrtqbKvYih7ldumLG7rYpq+gGMD+dD0vKF3NqUlsa1DAH6dowfWE1Pna3zYzUu+1lpN5t JyP1+WsrGankTngrGakAzhYyUiGUbWSkQjjbyEiF+WvOroE2zl7TLphqXxuditpHLOm3YYdfCu6D z5RNaHarubNt6DQVTivFTLN1NkyF03pHYf7at0iFs7wHfmupcI5OEjdOhcPtyuVAkm2lwmG9rHRN /WqpcC4nN5aslwqHKYbIejVVDbuChX22wo3wokR+0F8ovFle3af+JsSl0zeHUVUQ2Jf18Q/mPpZ9 4yYOZAhs7sBcc6TDPOgvGV7zcEFMYVs+wDG4Tcvqdl7IzKMWIs9EOJjepgUGpbvre7W8Okk44Dnv BXS3h0F/eLFw//VeElUHh7XBG55wKtzxHJxlSU+odH3nCd2+tjyhTr/tOWjnafhXE7YresJnnQS0 ku4/k5I4OuI+8SHLZy3aZDe/RbJbM0rgOJazzqRanIJvj8MLoGqT3fzdvetPk7yzwLNVubjXsFbu 65LdCvSlSaf0riYtSp/s9mqZYVf1JIzmKtVCrvIPSqf6XCyLym2HnhdtjpUuBewqd411qkt2y45v Lkw6TQwPcncHM7MMu/jDg1Wy2zth2ilReamZZ9h5P6O3XfMMO8ai0yqRMe2UF95Pd3Wd4hl2nudd +sYMwSGrmdb3dWsKt2sYdY/+klc/dbHoW7eU2l3usk7a7VweebSRkCYt+UXnE88ih3NeUkTljQu+ Dfl14tT6LjX7kFudBtvcn+jD5LX+VNE7umYezczU7aTzmjioY5WzvqrZyZDESnn8dlLFTO/JUWOu tlVJzsi7ZFopz6aSnMOl8+2sFnNlURfNtuKILq5vwyJyOJ40oHC70kEROcfz016IbHAPvC4w32J+ +vBw0yGJ3lGrQdkGUzoYEuKWdvXjnOOpEX82GpJSWdI43HWNbDqjEWIZqVvKpjPB2Jaz6Yy0UfNa nOtm0xlNbelWjY2z6Yxy6UzPK9fOplsp83HtbDpsmRRv8yZea+NsOiPjA6PkLWXT2UZBbyWbzkwi bzebzonXevNsOqNcOjSXrWbTWcT2bDGbbpl8+lXLPPG1sumM5Idyr8LWsumMWKvhqehG2XSaIUm5 dJh3dEvZdEa5dGI2xzaz6YzWT+vp3UY2nVEunVnVv/Wz6dY+4V0pm85BfuUWsumMcuk2x5hN7ZzV MOY4m84YY9vOpjM6RhE5/zaz6YwAuLzbzqYz2tuqd3Rb2XRGuXQWN1GYgbDJpjMCoOUw28imM8ql 09d83DybziiXTrP3t5JNZ5R+Y3ILjSk6VjMAdTccaie0fjadbkiyAbhaRqrWAMwIS8k7/pKhiqGN uHOYSGdWptI0x8hQu6jb1arUod+82plUrc5Qu9ioXp1RgTKndRPs69VZ5axh52J1u6qVjvE01Itv mxt1zKdmX4cWG5JFvKWDUnVOhyRGd1gXoXWKJ/PNbHjLmQWebKvPGg5pmcOAQdFrsEzt7SKxvfRn VLWH5Nw3nUW0HH/kxA1mWuZupWiotcvcGeS/LBe6WykeUTM1qczdJr4L52XuxKwBm0J3GzhjxDJ3 G8cnOypz53KUYbhpmTtYlcm20J3Dy2zNy9zpKdlRFOLKZe5WuBcOyIXdNYkBky9nW8uzmJ3pMovM ckUdJLRnrraQy3PmKBbDLunRg95uFmsN19xJRLPLPpFu4xD82dmyrFwPMfZZac4KYQ== QOwk19y9og9Wl1HkXzaUYW269QWdRlNimY5hqbNVE7viet/w2tFQSOffVjQUyv7fNE4dZj5uvPlg 4L11EruijTuAs2pOrVH2E4CzcW1XEcry/lunTuLqhSYt6iRuJ7FWsiygr8G/lFj7wdqcJTlP+/pg CWf5lfYaHgR2YMrMTCtNmEbutaaOUImbkUFtvVd9DPXt8pEufLZyIoNp9lNu03sVYELW9ioY3myz guHNmhcE6Pb+LbdxoWpUds0okWHVGkMQzuqJDMs1IBCcbeRzBvW3Z68Lx6K0liZW1WW/DcEGsbC/ 1zjhBbrX8jYEzzbNJ5IqsZrWuFsxsctEncdiSJxuwzUq3JnWrZZq3G0oOqUKd5tnPjqpcOeoUt7G +URypbyNt6FlhbsVK+WtWeHOoMqMpsbdSsCwEFAlewJVuFuu97qVQAsUpKIuw/p8DCh3Ninpqppj d+8oBOYoF9ZSzZH9/ABYfGPTBWCbNcy9WDnzcdXEWsXXp4ezeWLtnc60Nq+TaA/H+SVV5tzyzvJe uNWSmODNk/rgms3y2w1Ca4oo7uLGWoA53IYd3jK/coU0JikjbNUkJoQx04ywrrn7biWzHWFs6CBc 0EEwFhzXp6Nd6aAI1/3qSUymdmWHd3QPnXUSU8YfQXLWTO6vluMKhmSZxITdN+4wx7W7dOKKnlkq hi7nOa6F+/7CjEps6tEZ1n3bLM5OO0ks1nrTHFcAzPJqKo0OY5fj2hVWL/dojrF13ZPLK9mJ6LIG 1shxfbAUebqsZ0eDckgRxsJB9sCr+/c4cT417E9ag4bA89R8T0rSO00/wNy+Nvwn5wn2Iqcwra+I cvsisUZ6D7OR93XDk/7SpKbxAunl8f2prcO2Q2XSJmXudvZdXtM0PH7xFgnjtKEtc3dIvZtXnNPV 1gProskSe7TK/fsgTTslKoOLlmmnLu8+edrpmeX+9a3qsBVaWKfa1DRhd8hi+XBwV2oQfPy1N1Hm qsuHC5gn4QH0HplXnAOrX0kTZrl/9O7e9YR6NUvCe7HKhxPiGj1Zl/tXDb3dmnbqY/3JoVkSXsS0 U5cXdNvwmc6VF26OPaadenIv4bZmTdm03D36S1oGlzdQfOxPHLQMvC4mU9t29O7Xa/n+UtdOOk3Q tEwMJbqTxCTM23nO65RO2SPjnyyJzsqC17Ej/PxFFXWmfmKttmpwGvRUMgqbXK+KWdNXMXExGXpI Dkx1/qfSaqFV5kMC6q72HsV1s60q1rfxOK/MUnIQWmXqztVZfE+l1UKrTPGkVXI3yko7MDWuVs1K s6l3sExPRqCQrw8CWyFOy3J+hvVdzKMHrVLcVorSAkMyzeLM2oajOx1SMfK0nf2SNQ9sVTLslqNj tewqsMyuXssr+ZjNa6aUt3Ad7UNIX/tp/Wyk8vOttS3tdTk1gMtbOeV5CK8bUqNJdjP2a63kH4NZ gGsdWWujbmAW4KaeZZgDqL+wcyl21BliVryy0dwPUzaN03LoH5tptL7aG7l8ttOlvuzcuE44DFPZ no3cje1YD8nl+NQb+gTXvezK4C5ogCyLy/AduOx0PpXP1AxyGG1ZGb2Dce1Q76qqtxnecrZaWTZb vQ1VZHOWCmhzz8FKOVbdVe45MK8Ut6Mb0orauGZIWnenVSKgJJEtUgG1/H69VE6kKfWrtlVvHKdy 8kZpOjrLYgVgdtldOCgkkS2A2VbRcTQuuC4QmD3NO52kg1we58DsTi5XwphtPZ1VMGaRkLaULmyq HZrnAGpOrNayiJzkACr3kKyVBeg0B9BGG7fJAlQRY50DuIo/ef2Kegolr5UFqBmDRQ7gchUzM5xs UlFPyRVdKwsQEwSWOYBLWTam6Nikoh7i/GtnARpMyDBtyNxGdpIFaKCZ3BjNCupjusSDb1CUT63I 9i2L8ll54bZXlM/UC7fVonwux0zDJpfQUj1ZPkn8FkX5tPWSvlVRPgd3qW2hKJ9NDPyWivKh+pWl +QZF+bRDYg13r8iTc+J47FKDLer6WVu5Du6GclTXzz6Taxt1/cRMru3dDWVc12/FaNs16/pZV/Vb 624og7p+1hMy9sGuXtfPcJm2cjcUXtfPOszENnLYYV0/61gpjFtuVNfPUmE/20Z9MVjXz86n5NTA t67rZx3PpIm1Lqxf1087NX0htzX8loZ1/azp06g6wzp1/Yyy7rYQoaqr62e9ca3yK7dS/EPJSdxa +pFpVT/7+pXO6vpZ7zrnWWmblAfQ1RpYu66f0bhUabdBNgfTcVSYy0E9Pse5wNZV/bZUj88m+dNx PT6bun7WUKSckY3r+mmHpM/OM+aWq9f1U3aOYVU//R1E69b1s05PEf1jm9f1w2SXASrlddm0rp91 VT85Y2jTun5qqpSR6r5GVprNnI30CGPdcvW6ftZV/baw91FdPyen1ZvX9bOGotbj2zzvwbyq3+r1 +NYpzq3P5liu67d+3oN6M7PxHd2r5z1YV/Uzt19Wq+u3eVaak7p+1uq8kjG0YV0/7bj01uIa2rhh Xb/VtfF16vqZQLnlNrZe8bp+1lAc1ONbZxvqoCAas/GAOU0mMa/qt9aNOgZ1/YKWVf2WT0Ysky1M 6/qtnJW2rfLFWFU/s8z6Vev6WetMtrc2Oazr56gen4M8XCd19My8WavW41vPg7lUj2/jO60MqvpR Wotv/bp+BqdKDu5OX7Wun7VfS/bAb1rXzyjnyUCKbVjXTzdJndlucM/VWnX9rM1215bq+lmfZmIY 26iun2Yll6r6WdmVJozLsK7futGDq9X1s1YMRStp87p+VophV4Axvduo63dsWdUPWRZbqOtnfWKD tPEt1PWzPDCD2bVbqet3bFnVT3uWtH5dPzNPp9nNLevV9TMfEgzLN632u3rRV3bpnBE908UpaYcs SgabS0yJwU0mqnftgmf6zayNUURgzQLvdWmLGnqa6XxYYHGaRdUe1K7LW3CKIwGlCSgpUMzOtCjh UwYmfdZhizx/fD3KReeHp3kyddeifMc7JdQEZlPBXJ52k+E93ufgvge6gjy+19rQEzn6yAezx1/p 4GH2+iHYHn1yRLn8ESXKH+EMUTm7KhEVbtQgqlfpMNGoX3SIxmTwTlyO2SHROo+liXZ9dEvcCMMB cUvM4a68fT1aEHfhWz/xGLoJEC/dnUvi9fV+QHSuY3PiLXbvI97O/Vc8z5ejvPDMZfkFOb3lF52U X/Al96FCcD2HmZ2+8Khfu6xdpAe525fHd8/Bvve+uZfKjoHW5222qqf7w0/vzk46euHfHfe89Xh6 /7L7cV86PJBTAT2L0Cx+8YaWREx7y1fabS+xx/bBsyZnyEGkdWkAbglGIQgwobThCRce4lgJSKmO YKZggqxMHKBj8UW8Hb4GeP4iHDSdKewlHrgPHsZ8OaJSOCsQlUHvlKheXkyE3Ve6C3NXPVJ/x1/l 4FHq4omIVjoemJN4RZRvkx1U5o+IXrIh3W5St4+c94oTmn+i+luxqanSR8EEXI19T2A0PvaEqErD E+yFrzzBR3/Js1dKXcIE3FNUUtPl9YTzsaYnHPVdwFePEHf3sLJm2RM6v695Dr52wayZr5RE3ZUF PHmngpCD7pEHRTJbHDFREs6vk8s2PDxapkqZOk+Bv1ozMvT+fow4zO0XMvCJ6OdOBH0d20tP5gTh j0TRT8ge/dJfH+wB+KIWEAt3DnxfQfgzKP3M+MPwZ1j62YiLAKBlcZOZl3ufX2kimqgT+QnXEPJn d3cvgB/M09JAj5MB9QU+g+OjIPaC2SseyS+KYfUFlC+PNyfyq3pUfQW0sPe8/OKSVF68gqXzjolo 9ehAfYb3XC2GsBewZ5dXflWPAHyHDoBQew4COLsB6kX4WIAX1yT4q0vETm484Gczp8LuIGURPKuE 4BcHQNtmC4ivQJaYAly1kQKM6ZKHNNa8jEIvcwiJYPDzhkTfiIsTbT7Fouetzxj4ug3Qv3u4C98G QQeRCRF9aKiIeZN7eQMLTz+GS1HmcD/zPvXduLyVw3L8Q2WfEnOt3l/hJqxsx8pyuJGWmecSRCN4 onfUBqLMYRHEwGnqKp2qVnI+tl2q96UylWBW96RMv20qWAp5FxV/rV6nAuPOrssrkdcDE1emzuDk 1b0MQxSFAFKTU/DzJiqRffeeILuNegD89USK2m+0+0odp+sUWKsuE0N/KV4FSQYWcaEHqAhnAMqu XJUBPCMGAPY++J8TuPcBMxjHGxYMQF9JN7oPJ+mXLAvArKUJXbIHaC8Csds6QHiAex8wDXiXOazz mSAQiNjJXZmpdAJPZ3DbR+B29oslN1nhEwY71w6k3U3uRKlS+CkIdvRRSF4XuPeB4gCeFSNQUbmX vaPgn4CkMScqUWM3CeAMMqlAb4fs8gB7Nu6H6jzYcH5/Rt7HGTQNP1l+zRwqu/I4h3YW1C6uv8DP SkTlAnBXfhbGO9MKGZoVidLpIUcs8wNghIuLCJgCCTSDYzCri6DC+dHunmdOTcWDKhxUj6lBsBmF r5pKSED3gFLsKPqB9g5SNwh2JxFVNS70zBu/KF0Rfe+0BBrzQVwYIfXl8KSFAag/hyJaAEOwK286 B2VZQxBuNDceIDIVdsGz1EIs+Lz/SJ1ikh3l4pcPL1UAV8sAFrvo9gYFRG2/hu+SeEvMokfME5DN BQXd+ZCAakH4V0R5FlWeASINtcDCzv28uN+BlHrE7P19ZdbDA++h5w27yUDSXMSqz8+AhcWr4AUZ 0QlyaULxwCumLhyWhBZcfVFXQJcmpHcNKiDL1WnBugg7lX40aHwfQulTPLhQikUrNyM86e+7OMAm 9MTHuvKEMppLKN7iX8bj1t2BMT/+QoMDNLZ4y8WCaqlmgCxOHR7cKhEVhHJbBLy4Ib0jTbx3eQ75 ys7SNRLB84jE+ZfHjTqVFiLgP3l6MVmI3MJ0IXTLIFX6XloI8ZJWEcQzDiI7uVZA3FuspHi9pAjg Ba2LIQgrYhB9487HAOayBKLDbzgNdBkSjkoZYwbINAExNFkNMAYN7T+rGHvVYkxHiM2OCcHqIbLK 4NGlLFI7YCAcNlE7+Y7u4ybnMYXobOPyO0pXE6yr2vlDT3vv6MOzQlkPz/ig8LrkFDrP0vxsTXU2 uebn2KPtpXmrad584DQ/u5obdZpDDbDm50K2lqH4np8EoZZF4/4xtEMJdp5LIS6gykBVsQIK7+QZ 6QJAnD4kRP2hcN9BIjYsyfXEswB/RmWNo+ZTTkVR39AuAarDgVZ1QJpESPpZjCA9I6KAiAbLt/c1 OJrn2MntrCAL97gfsxygLqDK/cwBZiJAlUBVCDANwHfSOJZfaFWDxWtOftHA7BPUvarzZwJIWOF6 SDUXxEwErOdqRdXBX1GmLHjWiEr6WPWSgEpXMLaXgTpo9YZCpzy7B7jK2iwGkQkgqazNeliW8YsD SYg2GxHRSvAd3YOt0rwmIO+GFkgf/rynRKPhpD2NSLYYFdiLBCTV96GO1jKI2zwPlw== EdRLrJCKpbLsa2BQHNKVy8I4tZvCNRdkcALNRQSlPXnG48cAxOvoxhA18G4IyTeOINI3R5li/mY/ +1YcJs9m+XZ+eicaFYWng1eRfgO9+5FsBbdjCnm94eTVbYQwy0E0pLrXEXFdQjDpPiD+xezciqaE qkwD0zNWg67NB0BKh3VxtFDQqQYCUngk6zyf8klaj0jxTU6OUgMKfVDeaK+CaJOPdpr7ik0uyGZ0 RHRxSyZlIh5AMUlgmDn4MxOUlVewzZTdhHywt4S426CbHoaMR5CqTVZfI4/i5jN27dYI5MZVDlv3 5RdnfqRYkCFi+oZwjPb+mbjZyVDR25UxfxaSnt2QcMefRTBeE3o/isoqeYMgEt0zeBp2RmJNqoUv GpDK+yVUyVHm4wMXQXiULzS6IOHZbEj2KAp/cuxKkVTSnaISCXf0ejFm+Ut+9D6aukOurCuar5Pk zbTPVXiWbbO/n5e43mLCTufujDuabxXr9VSixPa4PusOaepYYr5Yje9QJMdHevJ4GH6rcMm7GNFf 9iwy0+r49qNbeDu/yudDU/Ile0Lepkq7/UXZ5S0Va88vaL8b+IbRRsmCzTwvlAbp6mdt9/qIKQ2I h2NsGyFd2zdrf0GDsQavb/N6Qp3+EzQ3Wx5/TQBzgQ8eRMl1fDTz6j2w0D+kumt1x5PIpDimvS1v Jb230y6+nO7WgunErFl4O0ve5AbtWbZ8VzgHVix4X+zka/TbRb4WG16VToKtNnj1dZuLzg9K4IWn i9xP2j3iJ4OfSXht18OrTDfnU9WFou5dIObG8u6UhdEDL3G2uR9SWGcu7SqwW+S/SD/02/glnppI og0MLzKuz5Api36CbfLEIytWjiGFZqti5RI44fqGioPtLIC/SM8Z5UUQf9EI9pQXYfUFvL3pNckq r6L4N7Piu/JCtykO0H7An934lT13EcJfvMf7Lq/yKoJ4LmAUOUJkTLVwJSZuI7RPayfX8OcVDrv7 HoSYvZK2cm8vmZHYN7D7Rdd6L3xEov1yFUX2ENk7qUO0XUlge1c3CGwM81vVOrxX5HuBcBx6Edth 3MNzkssqtH9dGEfeD/LN3qAB9stZ3dNSiRMtrcKnvHouJhvtBSpQqxwaQTSCJ0V32kG8ahyp+zMx b+6x1ZfH1Hu+tdgblR/7Tch226RKv7jS8fAaA/tFdm7FsamXTpIKsdyJnlWqdFWEpuVdVCb7OwC7 +wIDfO9IWabcIfcTB/+KiX9pYq8snRbYrlyVAZQWTLbm8iIWUAiM+WYuKkyOS4/FyZMJA1B4ja2Q 1IlIJM22LyR1IlKsZrZ1IakTkequ3KqQ1IlItCt1QtLqYA0/iluKU9H4TFRCkk97crjrJ8FVdN4j z04xv6N4j24N3E8BHEBoVNYBgPEXeydl1c1F+dMPMZ2fbGfn+KQq+8m4A52fTNipVLzWjjaX9/6+ mVdAjPyaXQIsKNHbChes/JwNx/azTySQJaUQJBXxuBc9g0QVEZ+9CJ0Yspvk/d6ZQx85hvld3wa+ F5+JxyiHbgZ14nsJTq1tbtkMDk2NPF0ur97XBWsE4B4HaULP2nEHnXm6kvhZn4WvS0y4h6uGQKie rtzdAQPWKlgR74+FfEXByFhXnVPrKZHG/YovxPjmwmwhoqYLoVsGFBdjtBAB3Pu3jjszgCHV5RWn bgDCihgCoZXGgDyLehDhTacR0aESYGxFf2KAMFkNzR23tbeQFmMWhBgKOYSoDJ7e3UteBy7ki27f CW2s4luINIfoaJIhSu1KXWxhp3pW1EVGRA+wQU1j2aY8qIl28AG/PodI8zOq/Unqeglpm4cOtD/D 2p9aYCFC4rT+fhuI75wg6paKFJMZ5XH1zi8yYVUGYl6YS3Yq6QL3n2GqU+uH4PFcWFQ14dEX/DYi HX3d7CBZ6VOjbsHfMFgQqQ6inaCoDqKdIJ4zJXJh8eeLwIoGRGzv8PBNPEcbvOZU1R0fJtQFMLmP a9k6qxl7cUP2lRc61WCgvMDtk/BefYjp/OLRPVlt7CjGyQVunAARpeibF2H8xSwD99CF4um7IETt vkY3IN1dwHhYBLv76lVgXwXFRt0ZCbnAVVhhj3uU79gPo96uIpKVQBchnCsC8W6yV7tEPynJaHh8 IqXcRKAuV4LK6beoLlEBOqMgph0ReyECeymCGre85VA6AKxJ4nbPUHMRtWiD6E5F+WlHN4aohUfI vlgEkYzuCofBmyxPH9/EL/LJl75fMioeWx75YPuJUs/0VfKi/v/irnQ5quMKP8F9h05VVJES5qr3 BcpONINsyxlMFRhZxOVMxtIgxtZCicGY/Miz5zu93llESFKpoILpc6aX099Zu+8FDt5d/FwPCA+G J4evPqPQ812f9SIf/+VEJMN/fP40X+c+vnohc+vd93+ND7bl8cF8Vl7zmrqNZ2u5Bv/sZXolBP5w FP3v9/XNbhT0uRMcrZzJ9X47k9dj9O/SE6nFT4v4GslBeno2eKskF69wsz/95oe43fT3kh/E//Ak XrUdLs9WfSq1lw8e/iHGC/XbR8df7/rLMOqPp9/8Od0Q1D/oixe5sCivoHR7+SWUeEew8f5JvCj4 fDJKD5rX3zmpJTl8w51+Nfnbz0cXwzvGLx8ekKk8icjG9y59Ugmd2eNLAybeCLfLn3983j2COCdC zI5vLoa3VN3eHjjPF6t3b6iDmY0Xl8ub6fzD4q4TLP1w/NCfLjAhPaNrMM4Mcac/dvvT5S+Lq6tb Jg7Y9Kbbmx0e3a0eL89Xy9ub+d0H9pBYZ0+mL04es4es9J6h9yO2D4n4DP3x5QFdj80g5azj7Ai/ z9537/DxtONZBLA+gPgajZ/Aes80e8K+/4GzC+r9rBOqF94ZJoTsuVbsuqOGtbpyhOiFsfSJhhJ+ wOA9F8KxSVdYUvdKaMOmjSN7wz0Gyd5KzaTAnEzoXsvgMkXDRW+cUJlBo1WvnC3d0d9r7dpklZHX oykyq0o1HfKq6KoPStvB5mTvhWr7n2whMu3GP3Y8gzl+DQXvv7i5mV8vLtjl3fxiSbeW4YCNeC+4 5dgVWs5pqTUbBaihF4HT0tUiMMtlh06cfhk2IunQsoNW/dKIPoQAYZRj4+vuFQQZj0nFvTfeS8Wo wYPHpyPaNLXPSeiem2YGgEMqp1gIvXDKk65Vb4FH5dDerWXB98EISUpz3gmijQXM52QcmntJHOGc ox4iGEzpenQwREtuBdGClxGNI2knUHUQTNpeK+zsZRSCNi1NrzQhpXtDCoRyoTzoyPQWk1WalM17 5YOtrGk0Ie2DaqOwsApBt2lJdslDXXkSzcwFFapwyfI8Ny7tyJpoMibAg+OWvYsMKWhQQ4WsSKmG G60dJym4QjpnZWNMtpQxjcqFEe3QF1Y2AD3qK9i0dOSQ/FxHBXHto/4idBDeGxVFgyNJnhSUR0gM JRoYRHVImUYINJJgJpBvASYTCBIN/WCfADJwE/XBjY360laGpp9MD/WTWdPIChruVEcBkihBnZY0 SI288CTC6pxXVbhpYnkpm/wUWDx3bYOkZu/UEAOywWBCg4lcW2nZcKz6yYzJFvikH8GO3qxH1q2d QkcbcEzbVBbbsNlY03KNs4UYog62PBKBYoFkIy3gSOTOUJiGad4Xi6SJwQhaVjIGI++5EogzVsCi PXJTr4MT9MmFyWEJuARaTMKgFLx1pDkJBLdBrDKhxidFLY8WD71SHjwLvTrrmKZwQV+LQaDandiG NDv85nb1bHF+e3eBTVA2+zSxDp8t5ldP5qu75a8Yw/YnRydfZgS+fXV7d52+yvkROfPi9sfF7Ogk UOJ8vvpwtZg1KdayqGBnFyXi78Rc/leYr2eBCJJl+wfs7LvuRRdyiyc747kz/eRwrgemh9DrsiNx 6XLqTixox5CLNgZMUAPVxiDXMjoZOpcUmAtLWXiSkwOGQ0gVejgIrOS0HPFDIexqSthU63DfO4qO Gm4QaFARb9IBTaNl48Ropv2AsbmlCQzpP012FNhkDGMwHwIH6AkfCgNurQLiO0zLa8TfSseS47wr tPDYoKedpuFw74DIXqbPZA5W0HrhkE+b3nhSeh4iEJEslq5TFkZZszGyUHWKLHRdJNOTzW3uyiKl h0GOczohEZw3lYMMZAz1QE9PUbHQWaxCQ24Xoo7TeGHxKQdYZHoIRmYlNJKdlVFoeG0H0xZGg6Mw smB1jiJ5wyMzJlvbrYjssg2YfhCxECLTrDQ2KBxVCpg9bqzQRbBMIzYrE8Wg0VBe8F41ODI9hCOz Um2qrQhtFPbmFVlLnTQzGhyFUcQqc1S5KxyZMdnaaoFD7kAD0RtZKR8BAiWjzKHy2ZNvwD+tEo2u kiUaoofoI3l8zF2IBRWRTA8RyaxUeaFS1m0Ule/C6DZtYbR1C6MKludokhdEMmOytd2KyC4DwUYM NhIhsSgDKyeWtSoqx3JlhnQSrdAIGy5F4jQeUUpyUyEp9ACSwsrHIE2nxzIqFqzBt2kro0LSGEmw OkeRvK6TGZOt7RIkLRu924qt0ieFOJSKWlPRo1EAU5HtZfP3fPjaxUJCcZrW0Q4To6AYcCxKM0hX OMgjOIUFomMNqJHJHM5WHlWiFzEXQQqH2Oc8IjR6KEVnJubgWEpZdtop2h7AKhyqvpDQKv0yub8J wx7KiDjC0xkinmaREolOUaYwMgLTLUymKXWtx+JNmAAcTlwSwe8TgbOo720BjirYAcf20qIiKxwA ZyQCC2hpIm44qAnmDXJ4NDgqbjyKKqzjhPVMIS1RUeohcoCpnu7Q6qtOoc1p5wjjhlQvCRPsIDOA jA2o8zOZsKU3gdr3CidOopSwDVmbHPfToN0QYt1et6J9RU8V1BsLIKVsTYBy1B4DjoWZOFE5oA1P JAdcIBUnvOl8GUsAKnkMiiKPyalKBuSWolJZ93RblF2eJnc4mimOJkNvqUTCzqnUBjiUDLgrDEKb hM1khF9rqQffSzrxYsZgrW/4g0Z9N8TfbOFvmml/FFTsW8VcA4yCR3xe44iAyq4B8C8w4bHqG7gQ HAblwmBdneNZ4YCORynQ3sISNd3jkIupVNdOIoiIi4RJdD5sMN5elA2eklFrzxsH+cXDOSoNXFHR S9FA4eQqJBgYktwJEVrFizRHZoC4dI5CVlBME8SSJDJnDkJKLVNLUe2HbtQWGnEHYVfFyOxg8MrR QYTHT0daT3cYMBjvLBXpJiif6lQViwRDCf+UetiQ7t5srFpSrZOu1uhGTQ4u4rBOY+SkLGpeI105 y91gLgrPdbFJlxlVGumSp3qyKgQVAAe0BQcuYHm6moh9KJQjzBg65RHD2BA1GosWSqcujSclposm m+4Ci9YFCj4vEJwLY7JlKvFMvevI7NPpDWlTkaXRtR0Uzs19l3Z0FEYIgi5laol2Z4eQpugq0KQT FcpWxc6u81AUdmwEKVGbYrWPjfWSchFJPT6v6+IALGNx9GnLjq+HI/G1FdS4fyQZIw== XGdjIMovT2fXjwzUlGHhpeN/f6Mow2K5i23mS4O1CxYkKa+S8xrKd3B3aErHhBmzPgCJX1B88zq6 Ms5t1S0n0ZWpkBi4srPOrruyt0oNXVlF6x24skzhYODKylm6+aSkFJxDH9qGTHlLxjsDhdI0dtCU eCddlS1zphS6jJWk7d77GB/J0C0OPZssHW2iXMuCIXTyD0lX9dFhYLubDqPUhsPIsOEwwmw6jPID h6HYGqutYWxNPVpslYPQuqmve31O8Op06VJjp8ehoukRlCI5irebCHojRSWHocwbhYJ7QTn5Zn+9 pwccSMbB1s6wM4cTllTi45PClIX3dNEQ1jtqSqheDjves7qEjceLv8Ha2cbX8huMmseHRKRrP2hx fMYnRt09z4h4ugdj+/mmq9L5TmvwDGn2q5rMni/+jtELtI9nu58l0bJ5jteL5eXr1Rb7/fJi9Tpz 2eH49ha8+d1inlcU1ijvpUD9c3gCPe+/vVqeLzYeVf2ftjxT/8tdo54ip7xv19NxelZ4fHMRnxSO RvQvQMwvF9/ezZdXi7vu8u38lwWb39zcruarxRt8A29ZvF3d3i3Y29e374mDIaX73t7x0y+6fwIT ZiNW compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-water.svg0000644000015301777760000001445312321343002030232 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-mousepoll.svg0000644000015301777760000003000512321343002031116 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-video.svg0000644000015301777760000004774612321343002030231 0ustar pbusernogroup00000000000000 image/svg+xml compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-workarounds.svg0000644000015301777760000006575012321343002031474 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-put.svg0000644000015301777760000005643712321343002027730 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-sound.svg0000644000015301777760000006606212321343002030243 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner Lapo Calamandrei http://www.tango-project.org compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/apps/plugin-opacify.svg0000644000015301777760000004441412321343002030542 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus State compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/0000755000015301777760000000000012321344021026250 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-desktop.svg0000644000015301777760000004327112321343002032126 0ustar pbusernogroup00000000000000 image/svg+xml Desktop Jakub Steiner http://jimmac.musichall.cz Desktop location. desktop storage files default location Garrett LeSage compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-image_loading.svg0000644000015301777760000005647012321343002033241 0ustar pbusernogroup00000000000000 image/svg+xml Graphics Category Jakub Steiner graphics category pixel vector editor draw paint http://tango-project.org compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-utility.svg0000644000015301777760000005121512321343002032155 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz/ system applications group category admin root compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-accessibility.svg0000644000015301777760000002351212321343002033300 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Accessibility accessibility assist compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-profiles.svg0000644000015301777760000005577512321343002032314 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus SchemeP ././@LongLink0000000000000000000000000000015000000000000011211 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-window_management.svgcompiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-window_management.0000644000015301777760000005577312321343002033452 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-all.svg0000644000015301777760000003750512321343002031230 0ustar pbusernogroup00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Web Browser compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-extras.svg0000644000015301777760000006005112321343002031756 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Image compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-general.svg0000644000015301777760000003224412321343002032070 0ustar pbusernogroup00000000000000 image/svg+xml System Applications Jakub Steiner http://jimmac.musichall.cz/ system applications group category admin root compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-search.svg0000644000015301777760000007305012321343002031720 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus SchemeP compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-effects.svg0000644000015301777760000020477112321343002032100 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Visual Effects compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/scalable/categories/plugins-uncategorized.svg0000644000015301777760000003206212321343002033314 0ustar pbusernogroup00000000000000 image/svg+xml Patrick Niklaus Uncategorized compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/24x24/0000755000015301777760000000000012321344021023140 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/24x24/apps/0000755000015301777760000000000012321344021024103 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/images/24x24/apps/ccsm.png0000644000015301777760000000146512321343002025542 0ustar pbusernogroup00000000000000‰PNG  IHDRשÍʶPLTE&&&\\\))$666dddgkg!KŠ#Jˆ‹‰ŠŒ†…†’’$M‰$Mˆ"Kˆ‰‹†‰‹†¤§¡ÉËÆ«­¨ J‡i–Èn™Êoqlo•ÃprmrtorŸÏsuptvqtwqvxrxzuy{wz|x}z~€{€‡‡‡‡„…„†€‡ˆƒˆ‰„ˆŠ…‰Œ†‹Œˆ‹Ž‡ŒˆŽŒ•²Õ–—“—´ÖŸ œŸ¡œŸ¼Ü £ž¤¥¢¦§¤§Ãᮯ¬°²­³µ±´´±´·°µ·³¶¸³º½¹¼½ºÃÅÀÄÆÀÅÆÁÅÇÁÅÇÃÇÈÆÇÉÄÈËÆÈÌÅÉÊÇÊÎÈÍÑËÏÑÍÒÖÏÓÔÑÔÖÒÔ×ÑÕ×ÓÖÚÒ×ÚÔ×ÛÔØÚÖÙÛÖÙÜÕÚÝÖÛÜØÛÝØÛߨÜÞØÝÞÛÞàÛßáÜàáßàâÝâãßâãáâäßåæâæéêçèäçèåçéæèéçéêçéêèéëçêëèëëéëìêìíêìíëííëîîìðñïñòðôôóôõöõöô÷÷öøø÷øùøùùøùúùúúùúúúûûúûûûüüûÿÿÿÆt;ÆtRNS "$%&2489fgÀÆÍÚøùúûüüýþ«ññ©IDATxÚ}ÉeSQ€á»[0VÀ×Â@ÅîîÄÄ51ÁB]þ±gÏ•Ü;ø|zg^&ºLKQdÀÈÓè»%ôš|¬AU"¡2°â0–SŒâhtÞPœ 0¸à;%Èý;vJ€Œg þǰêÎá;1ü8|·a}•§“m¯…:ºìçBƒ#^žktVZ·{¬þxè€öàp_ ýª u͘í¾ÚÃÅM!ÁúºóT¶Àó.‚™¯=ÿ|{™ZÖΚ2‰ƒÑÖú Ýæâœv‡òëdï×úÊRWËöêLûUŒ¬"Çw„ù^ÓÖZq6ŒÄ%I×3Q˜›CŸ”üGJjZ‚Œò˜X‰89Ý隘<ÑÈÒ½IEND®B`‚compiz-0.9.11+14.04.20140409/compizconfig/ccsm/ccsm0000755000015301777760000000765012321343002021771 0ustar pbusernogroup00000000000000#!/usr/bin/env python # -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Copyright (C) 2007 Quinn Storm DBUS_CCSM_SERVICE = 'org.compiz_fusion.ccsm' DBUS_CCSM_PATH = '/org/compiz_fusion/ccsm' DBUS_CCSM_INTERFACE = 'org.compiz_fusion.ccsm' # from the D-Bus specification DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER = 1 from optparse import OptionParser import pygtk pygtk.require('2.0') import gtk import sys def try_register_dbus (): '''Return instance of dbus control object on success, None on failure''' try: import dbus, dbus.service from dbus.mainloop.glib import DBusGMainLoop except ImportError: return # rely on a reasonably new dbus-python if dbus.version < (0, 80, 0): return class CCSMObject(dbus.service.Object): main_window = None @dbus.service.method(DBUS_CCSM_INTERFACE, in_signature='s', out_signature='') def present (self, startup_id): if startup_id: self.main_window.set_startup_id(startup_id) else: self.main_window.present() DBusGMainLoop(set_as_default=True) try: bus = dbus.SessionBus() except dbus.DBusException: return try: obj = bus.get_object(DBUS_CCSM_SERVICE, DBUS_CCSM_PATH) obj = dbus.Interface(obj, DBUS_CCSM_INTERFACE) except dbus.DBusException: # no ccsm instance running if (bus.request_name(DBUS_CCSM_SERVICE) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER): return CCSMObject(bus, DBUS_CCSM_PATH) else: return else: try: display = gtk.gdk.display_get_default() startup_id = gtk.gdk.x11_display_get_startup_notification_id(display) obj.present(startup_id or "") print('Another CCSM instance already running') sys.exit(0) except dbus.DBusException: # error on present call so pretend it doesn't exist and start up normally return dbusObj = try_register_dbus() if gtk.pygtk_version < (2,12,0): raise SystemExit("PyGtk 2.12.0 or later required") import compizconfig import ccm from ccm.Utils import GlobalUpdater from ccm.Constants import Version plugin = None category = None parser = OptionParser() parser.add_option("-p", "--plugin", dest = "plugin", help = "Directly jump to the page of PLUGIN", metavar = "PLUGIN") parser.add_option("-c", "--category", dest = "category", help = "Directly jump to CATEGORY", metavar = "CATEGORY") parser.add_option("-v", "--version", dest = "version", action = "store_true", help = "Version") (options, args) = parser.parse_args() if options.version: print("CCSM %s" % Version) sys.exit(0) if options.plugin: plugin = options.plugin if options.category: category = options.category context = compizconfig.Context(ccm.getDefaultScreen()) GlobalUpdater.SetContext (context) mainWin = ccm.MainWin(context, plugin, category) if dbusObj is not None: dbusObj.main_window = mainWin idle = ccm.IdleSettingsParser(context, mainWin) mainWin.show_all() gtk.main() compiz-0.9.11+14.04.20140409/compizconfig/ccsm/LICENSE0000644000015301777760000000132312321343002022112 0ustar pbusernogroup00000000000000This program and all files included in this package are free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. compiz-0.9.11+14.04.20140409/compizconfig/ccsm/CMakeLists.txt0000644000015301777760000000466112321343002023655 0ustar pbusernogroup00000000000000find_package (CompizConfig REQUIRED) include (LibCompizConfigCommon) # Hack set (CMAKE_PROJECT_NAME ccsm) add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/compizconfig_wrapper.c COMMAND echo \"int main (void) { return 0\; }\" >> ${CMAKE_CURRENT_BINARY_DIR}/compizconfig_wrapper.c WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) # Get arch execute_process (COMMAND uname -p OUTPUT_VARIABLE PROC_ARCH) # Get Python Version execute_process (COMMAND python -c "import sys; print str (sys.version_info[0]) + '.' + str (sys.version_info[1])" OUTPUT_VARIABLE PY_VERSION) string (REPLACE "\n" "" PROC_ARCH ${PROC_ARCH}) string (REPLACE "\n" "" PY_VERSION ${PY_VERSION}) set (PY_BUILD_DIR lib.linux-${PROC_ARCH}-${PY_VERSION}) set (PY_SCRIPTS_DIR scripts-${PY_VERSION}) set (PY_CCSM_LIB ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Conflicts.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Constants.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/__init__.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Pages.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Settings.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Utils.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Widgets.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Window.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_SCRIPTS_DIR}/ccsm) file (READ ${CMAKE_SOURCE_DIR}/VERSION COMPIZ_RELEASE_VERSION LIMIT 12 OFFSET 0) string (STRIP ${COMPIZ_RELEASE_VERSION} COMPIZ_RELEASE_VERSION) set (VERSION ${COMPIZ_RELEASE_VERSION}) add_custom_command (OUTPUT ${PY_CCSM_LIB} COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/setup.py build --build-base=${CMAKE_CURRENT_BINARY_DIR}/build --version=${VERSION} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Generating Python Bytecode") add_custom_target (ccsm_module ALL DEPENDS ${PY_CCSM_LIB}) set (UNINSTALL_COMMAND "python ${CMAKE_CURRENT_SOURCE_DIR}/setup.py uninstall --prefix=${CMAKE_INSTALL_PREFIX} --version=${VERSION}") compiz_add_code_to_uninstall_target (${UNINSTALL_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR}) install (CODE "message (\"Installing python files\") execute_process (COMMAND cmake -DSETUP=${CMAKE_CURRENT_SOURCE_DIR}/setup.py -DPREFIX=${CMAKE_INSTALL_PREFIX} -DWDIR=${CMAKE_CURRENT_SOURCE_DIR} -DVERSION=${VERSION} -P ${compiz_SOURCE_DIR}/compizconfig/cmake/exec_setup_py_with_destdir.cmake)") compiz-0.9.11+14.04.20140409/compizconfig/ccsm/COPYING0000644000015301777760000004311012321343002022140 0ustar pbusernogroup00000000000000 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. compiz-0.9.11+14.04.20140409/compizconfig/ccsm/ccm/0000755000015301777760000000000012321344021021652 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/ccsm/ccm/Settings.py0000644000015301777760000014104112321343002024023 0ustar pbusernogroup00000000000000# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import pygtk import gtk import gobject import os from ccm.Constants import * from ccm.Conflicts import * from ccm.Widgets import * from ccm.Utils import * from ccm.Pages import * import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext NAItemText = _("N/A") class Setting(object): NoneValue = '' def __init__(self, Setting=None, Settings=None, List=False): self.Setting = Setting self.Settings = Settings # for multi-list settings self.List = List if List: self.CurrentRow = None self.Blocked = 0 self.EBox = gtk.EventBox() self.Box = gtk.HBox() self.EBox.set_visible_window(False) if Setting: self.EBox.set_sensitive(not Setting.ReadOnly) self.Box.set_spacing(5) self.EBox.add(self.Box) self.Reset = gtk.Button() if not Settings: self.MakeLabel() markup = "%s\n%s" % (self.Setting.LongDesc, self.Setting.Name) self.EBox.set_tooltip_markup(markup) self.Reset.set_tooltip_text(_("Reset setting to the default value")) self.Reset.set_image (Image (name = gtk.STOCK_CLEAR, type = ImageStock, size = gtk.ICON_SIZE_BUTTON)) self.Reset.connect('clicked', self.DoReset) self._Init() self.EBox.connect("destroy", self.OnDestroy) self.AddUpdater() def AddUpdater(self): GlobalUpdater.Append(self) def RemoveUpdater(self): GlobalUpdater.Remove(self) def OnDestroy(self, widget): self.RemoveUpdater() def GetColumn(self, num): return (str, gtk.TreeViewColumn(self.Setting.ShortDesc, gtk.CellRendererText(), text=num)) def PureVirtual (self, func): message = "Missing %(function)s function for %(name)s setting (%(class)s)" msg_dict = {'function': func, 'name': self.Setting.Name, 'class': self} value = message % msg_dict raise PureVirtualError(value) def _Init(self): self.PureVirtual('_Init') def DoReset(self, foo): self.Setting.Reset() self.Setting.Plugin.Context.Write() self.Read() def MakeLabel(self): if not self.Setting: return label = gtk.Label() desc = protect_pango_markup (self.Setting.ShortDesc) style = "%s" if self.Setting.Integrated: style = "%s" label.set_markup(style % desc) label.props.xalign = 0 label.set_size_request(160, -1) label.props.wrap_mode = pango.WRAP_WORD label.set_line_wrap(True) self.Label = label def Block(self): self.Blocked += 1 def UnBlock(self): self.Blocked -= 1 def Read(self): self.Block() self._Read() self.UnBlock() def _Read(self): self.PureVirtual('_Read') def Changed(self, *args, **kwargs): if self.Blocked <= 0: self._Changed() self.Setting.Plugin.Context.Write() def _Changed(self): self.PureVirtual('_Changed') def Get(self): if self.List: if self.CurrentRow is not None: return self.Setting.Value[self.CurrentRow] else: return self.NoneValue else: return self.Setting.Value def GetForRenderer(self): return self.Setting.Value def Set(self, value): if self.List: if self.CurrentRow is not None: vlist = self.Setting.Value vlist[self.CurrentRow] = value self.Setting.Value = vlist else: self.Setting.Value = value def Swap(self, a, b): vlist = self.Setting.Value vlist.insert(b, vlist.pop(a)) self.Setting.Value = vlist def _SetHidden(self, visible): self.EBox.props.no_show_all = not visible if visible: self.EBox.show() else: self.EBox.hide() def _Filter(self, text, level): visible = False if text is not None: if level & FilterName: visible = (text in self.Setting.Name.lower() or text in self.Setting.ShortDesc.lower()) if not visible and level & FilterLongDesc: visible = text in self.Setting.LongDesc.lower() if not visible and level & FilterValue: visible = text in str(self.Setting.Value).lower() else: visible = True return visible def Filter(self, text, level=FilterAll): visible = self._Filter(text, level=level) self._SetHidden(visible) return visible def __hash__(self): if self.Setting is not None: return hash(self.Setting) else: raise TypeError class StockSetting(Setting): def _Init(self): self.Box.pack_start(self.Label, False, False) self.Box.pack_end(self.Reset, False, False) class StringSetting(StockSetting): def _Init(self): StockSetting._Init(self) self.Entry = gtk.Entry() self.Entry.connect('activate', self.Changed) self.Entry.connect('focus-out-event', self.Changed) self.Widget = self.Entry self.Box.pack_start(self.Widget, True, True) def _Read(self): self.Entry.set_text(self.Get()) def _Changed(self): self.Set(self.Entry.get_text()) class MatchSetting(StringSetting): def _Init(self): StringSetting._Init(self) self.MatchButton = MatchButton(self.Entry) self.Box.pack_start(self.MatchButton, False, False) class FileStringSetting(StringSetting): def __init__(self, setting, List=False, isImage=False, isDirectory=False): self.isImage = isImage self.isDirectory = isDirectory StringSetting.__init__(self, setting, List=List) def _Init(self): StringSetting._Init(self) self.FileButton = FileButton(self.Setting.Plugin.Context, self.Entry, self.isDirectory, self.isImage) self.Box.pack_start(self.FileButton, False, False) class EnumSetting(StockSetting): NoneValue = 0 def _Init(self): StockSetting._Init(self) self.Combo = gtk.combo_box_new_text() if self.List: self.Info = self.Setting.Info[1][2] else: self.Info = self.Setting.Info[2] self.SortedItems = sorted(self.Info.items(), key=EnumSettingKeyFunc) for name, value in self.SortedItems: self.Combo.append_text(name) self.Combo.connect('changed', self.Changed) self.Widget = self.Combo self.Box.pack_start(self.Combo, True, True) def _CellEdited(self, cell, path, new_text): self.CurrentRow = int(path[0]) value = self.Info[new_text] self.Store[path][self.Num] = new_text self.Set(value) self.Setting.Plugin.Context.Write() def GetColumn(self, num): self.Num = num cell = gtk.CellRendererCombo() column = gtk.TreeViewColumn(self.Setting.ShortDesc, cell, text=num) model = gtk.ListStore(str) for property, value in [("model", model), ("text_column", 0), ("editable", False), ("has_entry", False)]: cell.set_property (property, value) cell.connect("edited", self._CellEdited) for item, i in self.SortedItems: model.append([item]) return (str, column) def GetForRenderer(self): return [self.SortedItems[pos][0] for pos in self.Setting.Value] def _Read(self): self.Combo.set_active(self.Get()) def _Changed(self): active = self.Combo.get_active_text() self.Set(self.Info[active]) def _Filter(self, text, level): visible = Setting._Filter(self, text, level=level) if text is not None and not visible and level & FilterValue: visible = any(text in s.lower() for s in self.Info) return visible class RestrictedStringSetting(StockSetting): NoneValue = '' def _Init(self): StockSetting._Init(self) self.Combo = gtk.combo_box_new_text() if self.List: info = self.Setting.Info[1] else: info = self.Setting.Info self.ItemsByName = info[0] self.ItemsByValue = info[1] self.SortedItems = info[2] # Use the first item in the list as the default value self.NoneValue = self.ItemsByName[self.SortedItems[0][0]] for (i, (name, value)) in enumerate(self.SortedItems): self.Combo.append_text(name) self.Combo.connect('changed', self.Changed) self.Widget = self.Combo self.Box.pack_start(self.Combo, True, True) self.OriginalValue = None self.NAItemShift = 0 def _CellEdited(self, cell, path, new_text): self.CurrentRow = int(path[0]) value = self.ItemsByName[new_text] self.Store[path][self.Num] = new_text self.Set(value) self.Setting.Plugin.Context.Write() def GetColumn(self, num): self.Num = num cell = gtk.CellRendererCombo() column = gtk.TreeViewColumn(self.Setting.ShortDesc, cell, text=num) model = gtk.ListStore(str) for property, value in [("model", model), ("text_column", 0), ("editable", False), ("has_entry", False)]: cell.set_property (property, value) cell.connect("edited", self._CellEdited) for item, i in self.SortedItems: model.append([item]) return (str, column) def GetItemText (self, val): text = self.ItemsByValue.get(val) if text is None: return NAItemText return self.SortedItems[text[1]][0] def GetForRenderer(self): return [self.GetItemText(val) for val in self.Setting.Value] def _Read(self): value = self.Get() if not self.OriginalValue: self.OriginalValue = value # if current value is not provided by any restricted string extension, # insert an N/A item at the beginning if self.OriginalValue not in self.ItemsByValue: self.NAItemShift = 1 self.Combo.insert_text(0, NAItemText) if value in self.ItemsByValue: self.Combo.set_active(self.ItemsByValue[self.Get()][1] + \ self.NAItemShift) else: self.Combo.set_active(0) def _Changed(self): active = self.Combo.get_active_text() if active == NAItemText: activeValue = self.OriginalValue else: activeValue = self.ItemsByName[active] self.Set(activeValue) def _Filter(self, text, level): visible = Setting._Filter(self, text, level=level) if text is not None and not visible and level & FilterValue: visible = any(text in s.lower() for s in self.ItemsByName) return visible class BoolSetting (StockSetting): NoneValue = False def _Init (self): StockSetting._Init(self) self.Label.set_size_request(-1, -1) self.CheckButton = gtk.CheckButton () align = gtk.Alignment(yalign=0.5) align.add(self.CheckButton) self.Box.pack_end(align, False, False) self.CheckButton.connect ('toggled', self.Changed) def _Read (self): self.CheckButton.set_active (self.Get()) def _Changed (self): self.Set(self.CheckButton.get_active ()) def CellToggled (self, cell, path): self.CurrentRow = int(path) self.Set(not cell.props.active) self.Store[path][self.Num] = self.Get() self.Setting.Plugin.Context.Write() def GetColumn (self, num): self.Num = num cell = gtk.CellRendererToggle() cell.set_property("activatable", True) cell.connect('toggled', self.CellToggled) return (bool, gtk.TreeViewColumn(self.Setting.ShortDesc, cell, active=num)) class NumberSetting(StockSetting): NoneValue = 0 def _Init(self): StockSetting._Init(self) if self.List: self.Info = info = self.Setting.Info[1] else: self.Info = info = self.Setting.Info if self.Inc is None: self.Inc = info[2] inc = self.Inc self.NoneValue = info[0] self.Adj = gtk.Adjustment(self.Get(), info[0], info[1], inc, inc*10) self.Spin = gtk.SpinButton(self.Adj) self.Scale = gtk.HScale(self.Adj) self.Scale.set_update_policy(gtk.UPDATE_DISCONTINUOUS) self.Scale.connect("value-changed", self.Changed) self.Spin.connect("value-changed", self.Changed) self.Widget = self.Scale self.Box.pack_start(self.Scale, True, True) self.Box.pack_start(self.Spin, False, False) def _Read(self): self.Adj.set_value(self.Get()) def _Changed(self): self.Set(self.Adj.get_value()) class IntSetting(NumberSetting): def _Init(self): self.Inc = 1 NumberSetting._Init(self) self.Spin.set_digits(0) self.Scale.set_digits(0) class FloatSetting(NumberSetting): NoneValue = 0.0 def _Init(self): self.Inc = None NumberSetting._Init(self) self.Spin.set_digits(4) self.Scale.set_digits(4) class ColorSetting(StockSetting): NoneValue = (0, 0, 0, 65535) # opaque black def _Init(self): StockSetting._Init(self) self.Button = gtk.ColorButton() self.Button.set_size_request (100, -1) self.Button.set_use_alpha(True) self.Button.connect('color-set', self.Changed) self.Widget = gtk.Alignment (1, 0.5) self.Widget.add (self.Button) self.Box.pack_start(self.Widget, True, True) def GetForRenderer(self): return ["#%.4x%.4x%.4x%.4x" %tuple(seq) for seq in self.Setting.Value] def GetColumn(self, num): return (str, gtk.TreeViewColumn(self.Setting.ShortDesc, CellRendererColor(), text=num)) def _Read(self): col = gtk.gdk.Color() value = self.Get() col.red, col.green, col.blue = value[:3] self.Button.set_color(col) self.Button.set_alpha(value[3]) def _Changed(self): col = self.Button.get_color() alpha = self.Button.get_alpha() self.Set([col.red, col.green, col.blue, alpha]) class BaseListSetting(Setting): def _Init(self): self.Widget = gtk.VBox() self.EditDialog = None self.EditDialogOpen = False self.PageToBeRefreshed = None self.Widgets = [] for i, setting in enumerate(self.Settings): self.Widgets.append(MakeSetting(setting, List=True)) types, cols = self.ListInfo() self.Types = types self.Store = gtk.ListStore(*types) self.View = gtk.TreeView(self.Store) self.View.set_headers_visible(True) for widget in self.Widgets: widget.Store = self.Store widget.Box.remove(widget.Reset) widget.ListWidget = self for col in cols: self.View.append_column(col) self.View.connect('row-activated', self.Activated) self.View.connect('button-press-event', self.ButtonPressEvent) self.View.connect('key-press-event', self.KeyPressEvent) self.Select = self.View.get_selection() self.Select.set_mode(gtk.SELECTION_SINGLE) self.Select.connect('changed', self.SelectionChanged) self.Widget.set_spacing(5) self.Scroll = gtk.ScrolledWindow() self.Scroll.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC self.Scroll.props.vscrollbar_policy = gtk.POLICY_NEVER self.Scroll.add(self.View) self.Widget.pack_start(self.Scroll, True, True) self.Widget.set_child_packing(self.Scroll, True, True, 0, gtk.PACK_START) buttonBox = gtk.HBox(False) buttonBox.set_spacing(5) buttonBox.set_border_width(5) self.Widget.pack_start(buttonBox, False, False) buttonTypes = ((gtk.STOCK_NEW, self.Add, None, True), (gtk.STOCK_DELETE, self.Delete, None, False), (gtk.STOCK_EDIT, self.Edit, None, False), (gtk.STOCK_GO_UP, self.Move, 'up', False), (gtk.STOCK_GO_DOWN, self.Move, 'down', False),) self.Buttons = {} for stock, callback, data, sensitive in buttonTypes: b = gtk.Button(stock) b.set_use_stock(True) buttonBox.pack_start(b, False, False) if data is not None: b.connect('clicked', callback, data) else: b.connect('clicked', callback) b.set_sensitive(sensitive) self.Buttons[stock] = b self.Popup = gtk.Menu() self.PopupItems = {} edit = gtk.ImageMenuItem(stock_id=gtk.STOCK_EDIT) edit.connect('activate', self.Edit) edit.set_sensitive(False) self.Popup.append(edit) self.PopupItems[gtk.STOCK_EDIT] = edit delete = gtk.ImageMenuItem(stock_id=gtk.STOCK_DELETE) delete.connect('activate', self.Delete) delete.set_sensitive(False) self.Popup.append(delete) self.PopupItems[gtk.STOCK_DELETE] = delete self.Popup.show_all() buttonBox.pack_end(self.Reset, False, False) self.Box.pack_start(self.Widget) def AddUpdater(self): pass def RemoveUpdater(self): if self.Settings: for widget in self.Widgets: widget.EBox.destroy() def DoReset(self, widget): for setting in self.Settings: setting.Reset() self.Settings[0].Plugin.Context.Write() self.Read() def MakeLabel(self): pass def Add(self, *args): for widget, setting in zip(self.Widgets, self.Settings): vlist = setting.Value vlist.append(widget.NoneValue) setting.Value = vlist self.Settings[0].Plugin.Context.Write() self.Read() self._Edit(len(self.Store)-1) def _Delete(self, row): for setting in self.Settings: vlist = setting.Value del vlist[row] setting.Value = vlist self.Settings[0].Plugin.Context.Write() def Delete(self, *args): model, it = self.Select.get_selected() if it is not None: path = model.get_path(it) if path is not None: row = path[0] else: return model.remove(it) self._Delete(row) def _MakeEditDialog(self): dlg = gtk.Dialog(_("Edit")) vbox = gtk.VBox(spacing=TableX) vbox.props.border_width = 6 dlg.vbox.pack_start(vbox, True, True) dlg.set_default_size(500, -1) dlg.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) dlg.set_default_response(gtk.RESPONSE_CLOSE) group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) for widget in self.Widgets: vbox.pack_start(widget.EBox, False, False) group.add_widget(widget.Label) return dlg def Edit(self, widget): model, it = self.Select.get_selected() if it: path = model.get_path(it) if path is not None: row = path[0] else: return self._Edit(row) def _Edit(self, row): if not self.EditDialog: self.EditDialog = self._MakeEditDialog() for widget in self.Widgets: widget.CurrentRow = row widget.Read() self.EditDialogOpen = True self.EditDialog.show_all() response = self.EditDialog.run() self.EditDialog.hide_all() self.EditDialogOpen = False if self.PageToBeRefreshed: self.PageToBeRefreshed[0].RefreshPage(self.PageToBeRefreshed[1], self.PageToBeRefreshed[2]) self.PageToBeRefreshed = None self.Read() def Move(self, widget, direction): model, it = self.Select.get_selected() if it is not None: path = model.get_path(it) if path is not None: row = path[0] else: return if direction == 'up': dest = row - 1 elif direction == 'down': dest = row + 1 for widget in self.Widgets: widget.Swap(row, dest) self.Settings[0].Plugin.Context.Write() order = list(range(len(model))) order.insert(dest, order.pop(row)) model.reorder(order) self.SelectionChanged(self.Select) def SelectionChanged(self, selection): model, it = selection.get_selected() for widget in (self.Buttons[gtk.STOCK_EDIT], self.Buttons[gtk.STOCK_DELETE], self.PopupItems[gtk.STOCK_EDIT], self.PopupItems[gtk.STOCK_DELETE]): widget.set_sensitive(it is not None) if it is not None: path = model.get_path(it) if path is not None: row = path[0] self.Buttons[gtk.STOCK_GO_UP].set_sensitive(row > 0) self.Buttons[gtk.STOCK_GO_DOWN].set_sensitive(row < (len(model) - 1)) else: self.Buttons[gtk.STOCK_GO_UP].set_sensitive(False) self.Buttons[gtk.STOCK_GO_DOWN].set_sensitive(False) def ButtonPressEvent(self, treeview, event): if event.button == 3: pthinfo = treeview.get_path_at_pos(int(event.x), int(event.y)) if pthinfo is not None: path, col, cellx, celly = pthinfo treeview.grab_focus() treeview.set_cursor(path, col, 0) self.Popup.popup(None, None, None, event.button, event.time) return True def KeyPressEvent(self, treeview, event): if gtk.gdk.keyval_name(event.keyval) == "Delete": model, it = treeview.get_selection().get_selected() if it is not None: path = model.get_path(it) if path is not None: row = path[0] model.remove(it) self._Delete(row) return True def ListInfo(self): types = [] cols = [] for i, widget in enumerate(self.Widgets): t, col = widget.GetColumn(i) types.append(t) cols.append(col) return types, cols def Activated(self, obj, path, col): self._Edit(path[0]) def _Read(self): self.Store.clear() # FIXME: The list types are being defined as all str # in self.Widgets (which goes to self.Store) - this # is a problem since values can be of other types, # however explicitly converting to a string seems to # work here for values in zip(*[w.GetForRenderer() for w in self.Widgets]): self.Store.append([str (x) for x in values]) def OnDestroy(self, widget): for w in self.Widgets: w.EBox.destroy() class ListSetting(BaseListSetting): def _Init(self): self.Settings = [self.Setting] BaseListSetting._Init(self) class MultiListSetting(BaseListSetting): def _Init(self): self.EBox.set_tooltip_text(_("Multi-list settings. You can double-click a row to edit the values.")) BaseListSetting._Init(self) def Filter(self, text, level=FilterAll): visible = False for setting in self.Widgets: if setting._Filter(text, level=level): visible = True self._SetHidden(visible) return visible class EnumFlagsSetting(Setting): def _Init(self): frame = gtk.Frame(self.Setting.ShortDesc) table = gtk.Table() row = col = 0 self.Checks = [] sortedItems = sorted(self.Setting.Info[1][2].items(), key=EnumSettingKeyFunc) self.minVal = sortedItems[0][1] for key, value in sortedItems: box = gtk.CheckButton(key) self.Checks.append((key, box)) table.attach(box, col, col+1, row, row+1, TableDef, TableDef, TableX, TableX) box.connect('toggled', self.Changed) col = col+1 if col >= 3: col = 0 row += 1 vbox = gtk.VBox() vbox.pack_start(self.Reset, False, False) hbox = gtk.HBox() hbox.pack_start(table, True, True) hbox.pack_start(vbox, False, False) frame.add(hbox) self.Box.pack_start(frame, True, True) def _Read(self): for key, box in self.Checks: box.set_active(False) for setVal in self.Setting.Value: self.Checks[setVal-self.minVal][1].set_active(True) def _Changed(self): values = [] for key, box in self.Checks: if box.get_active(): values.append(self.Setting.Info[1][2][key]) self.Setting.Value = values def _Filter(self, text, level=FilterAll): visible = Setting._Filter(self, text, level=level) if text is not None and not visible and level & FilterValue: visible = any(text in s.lower() for s in self.Setting.Info[1][2]) return visible class RestrictedStringFlagsSetting(Setting): def _Init(self): frame = gtk.Frame(self.Setting.ShortDesc) table = gtk.Table() row = col = 0 self.Checks = [] info = self.Setting.Info[1] self.ItemsByName = info[0] self.ItemsByValue = info[1] sortedItems = info[2] for key, value in sortedItems: box = gtk.CheckButton(key) self.Checks.append((key, box)) table.attach(box, col, col+1, row, row+1, TableDef, TableDef, TableX, TableX) box.connect('toggled', self.Changed) col = col+1 if col >= 3: col = 0 row += 1 vbox = gtk.VBox() vbox.pack_start(self.Reset, False, False) hbox = gtk.HBox() hbox.pack_start(table, True, True) hbox.pack_start(vbox, False, False) frame.add(hbox) self.Box.pack_start(frame, True, True) def _Read(self): for key, box in self.Checks: box.set_active(False) for setVal in self.Setting.Value: if setVal in self.ItemsByValue: self.Checks[self.ItemsByValue[setVal][1]][1].set_active(True) def _Changed(self): values = [] for key, box in self.Checks: if box.get_active(): values.append(self.ItemsByName[key]) self.Setting.Value = values def _Filter(self, text, level=FilterAll): visible = Setting._Filter(self, text, level=level) if text is not None and not visible and level & FilterValue: visible = any(text in s.lower() for s in self.ItemsByName) return visible class EditableActionSetting (StockSetting): def _Init (self, widget, action): StockSetting._Init(self) alignment = gtk.Alignment (0, 0.5) alignment.add (widget) self.Label.set_size_request(-1, -1) editButton = gtk.Button () editButton.add (Image (name = gtk.STOCK_EDIT, type = ImageStock, size = gtk.ICON_SIZE_BUTTON)) editButton.set_tooltip_text(_("Edit %s" % self.Setting.ShortDesc)) editButton.connect ("clicked", self.RunEditDialog) action = ActionImage (action) self.Box.pack_start (action, False, False) self.Box.reorder_child (action, 0) self.Box.pack_end (editButton, False, False) self.Box.pack_end(alignment, False, False) self.Widget = widget def RunEditDialog (self, widget): dlg = gtk.Dialog (_("Edit %s") % self.Setting.ShortDesc) dlg.set_position (gtk.WIN_POS_CENTER_ON_PARENT) dlg.set_transient_for (self.Widget.get_toplevel ()) dlg.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button (gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default() dlg.set_default_response (gtk.RESPONSE_OK) entry = gtk.Entry (max = 200) entry.set_text (self.GetDialogText ()) entry.connect ("activate", lambda *a: dlg.response (gtk.RESPONSE_OK)) alignment = gtk.Alignment (0.5, 0.5, 1, 1) alignment.set_padding (10, 10, 10, 10) alignment.add (entry) entry.set_tooltip_text(self.Setting.LongDesc) dlg.vbox.pack_start (alignment) dlg.vbox.show_all () ret = dlg.run () dlg.destroy () if ret != gtk.RESPONSE_OK: return self.HandleDialogText (entry.get_text ().strip ()) def GetDialogText (self): self.PureVirtual ('GetDialogText') def HandleDialogText (self, text): self.PureVirtual ('HandleDialogText') class KeySetting (EditableActionSetting): current = "" def _Init (self): self.Button = SizedButton (minWidth = 100) self.Button.connect ("clicked", self.RunKeySelector) self.SetButtonLabel () EditableActionSetting._Init (self, self.Button, "keyboard") def DoReset (self, widget): conflict = KeyConflict (self.Setting, self.Setting.DefaultValue) if conflict.Resolve (GlobalUpdater): self.Setting.Reset () self.Setting.Plugin.Context.Write () self.Read () def ReorderKeyString (self, accel): key, mods = gtk.accelerator_parse (accel) return GetAcceleratorName (key, mods) def GetDialogText (self): return self.current def HandleDialogText (self, accel): name = self.ReorderKeyString (accel) if len (accel) != len (name): accel = protect_pango_markup (accel) ErrorDialog (self.Widget.get_toplevel (), _("\"%s\" is not a valid shortcut") % accel) return self.BindingEdited (accel) def GetLabelText (self, text): if not len (text) or text.lower() == "disabled": text = _("Disabled") return text def SetButtonLabel (self): self.Button.set_label (self.GetLabelText (self.current)) def RunKeySelector (self, widget): def ShowHideBox (button, box, dialog): if button.get_active (): box.show () else: box.hide () dialog.resize (1, 1) def HandleGrabberChanged (grabber, key, mods, label, selector): new = GetAcceleratorName (key, mods) mods = "" for mod in KeyModifier: if "%s_L" % mod in new: new = new.replace ("%s_L" % mod, "<%s>" % mod) if "%s_R" % mod in new: new = new.replace ("%s_R" % mod, "<%s>" % mod) if "<%s>" % mod in new: mods += "%s|" % mod mods.rstrip ("|") label.set_text (self.GetLabelText (new)) selector.current = mods def HandleModifierAdded (selector, modifier, label): current = label.get_text () if current == _("Disabled"): current = "<%s>" % modifier else: current = ("<%s>" % modifier) + current label.set_text (self.ReorderKeyString (current)) def HandleModifierRemoved (selector, modifier, label): current = label.get_text () if "<%s>" % modifier in current: new = current.replace ("<%s>" % modifier, "") elif "%s_L" % modifier in current: new = current.replace ("%s_L" % modifier, "") elif "%s_R" % modifier in current: new = current.replace ("%s_R" % modifier, "") label.set_text (self.GetLabelText (new)) dlg = gtk.Dialog (_("Edit %s") % self.Setting.ShortDesc) dlg.set_position (gtk.WIN_POS_CENTER_ALWAYS) dlg.set_transient_for (self.Widget.get_toplevel ()) dlg.set_icon (self.Widget.get_toplevel ().get_icon ()) dlg.set_modal (True) dlg.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button (gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default () dlg.set_default_response (gtk.RESPONSE_OK) mainBox = gtk.VBox () alignment = gtk.Alignment () alignment.set_padding (10, 10, 10, 10) alignment.add (mainBox) dlg.vbox.pack_start (alignment) checkButton = gtk.CheckButton (_("Enabled")) active = len (self.current) \ and self.current.lower () not in ("disabled", "none") checkButton.set_active (active) checkButton.set_tooltip_text(self.Setting.LongDesc) mainBox.pack_start (checkButton) box = gtk.VBox () checkButton.connect ("toggled", ShowHideBox, box, dlg) mainBox.pack_start (box) currentMods = "" for mod in KeyModifier: if "<%s>" % mod in self.current: currentMods += "%s|" % mod currentMods.rstrip ("|") modifierSelector = ModifierSelector (currentMods) modifierSelector.set_tooltip_text (self.Setting.LongDesc) alignment = gtk.Alignment (0.5) alignment.add (modifierSelector) box.pack_start (alignment) key, mods = gtk.accelerator_parse (self.current) grabber = KeyGrabber (key = key, mods = mods, label = _("Grab key combination")) grabber.set_tooltip_text (self.Setting.LongDesc) box.pack_start (grabber) label = gtk.Label (self.current) label.set_tooltip_text (self.Setting.LongDesc) alignment = gtk.Alignment (0.5, 0.5) alignment.set_padding (15, 0, 0, 0) alignment.add (label) box.pack_start (alignment) modifierSelector.connect ("added", HandleModifierAdded, label) modifierSelector.connect ("removed", HandleModifierRemoved, label) grabber.connect ("changed", HandleGrabberChanged, label, modifierSelector) grabber.connect ("current-changed", HandleGrabberChanged, label, modifierSelector) dlg.vbox.show_all () ShowHideBox (checkButton, box, dlg) ret = dlg.run () dlg.destroy () if ret != gtk.RESPONSE_OK: return if not checkButton.get_active (): self.BindingEdited ("Disabled") return new = label.get_text () new = self.ReorderKeyString (new) self.BindingEdited (new) def BindingEdited (self, accel): '''Binding edited callback''' # Update & save binding conflict = KeyConflict (self.Setting, accel) if conflict.Resolve (GlobalUpdater): self.current = accel self.Changed () self.SetButtonLabel () def _Read (self): self.current = self.Get() self.SetButtonLabel () def _Changed (self): self.Set(self.current) class ButtonSetting (EditableActionSetting): current = "" def _Init (self): self.Button = SizedButton (minWidth = 100) self.Button.connect ("clicked", self.RunButtonSelector) self.Button.set_tooltip_text(self.Setting.LongDesc) self.SetButtonLabel () EditableActionSetting._Init (self, self.Button, "button") def DoReset (self, widget): conflict = ButtonConflict (self.Setting, self.Setting.DefaultValue) if conflict.Resolve (GlobalUpdater): self.Setting.Reset () self.Setting.Plugin.Context.Write () self.Read () def ReorderButtonString (self, old): new = "" edges = ["%sEdge" % e for e in Edges] for s in edges + KeyModifier: if "<%s>" % s in old: new += "<%s>" % s for i in range (99, 0, -1): if "Button%d" % i in old: new += "Button%d" % i break return new def GetDialogText (self): return self.current def HandleDialogText (self, button): def ShowErrorDialog (button): button = protect_pango_markup (button) ErrorDialog (self.Widget.get_toplevel (), _("\"%s\" is not a valid button") % button) if button.lower ().strip () in ("", "disabled", "none"): self.ButtonEdited ("Disabled") return new = self.ReorderButtonString (button) if len (button) != len (new): ShowErrorDialog (button) return self.ButtonEdited (new) def SetButtonLabel (self): label = self.current if not len (self.current) or self.current.lower() == "disabled": label = _("Disabled") self.Button.set_label (label) def RunButtonSelector (self, widget): def ShowHideBox (button, box, dialog): if button.get_active (): box.show () else: box.hide () dialog.resize (1, 1) dlg = gtk.Dialog (_("Edit %s") % self.Setting.ShortDesc) dlg.set_position (gtk.WIN_POS_CENTER_ALWAYS) dlg.set_transient_for (self.Widget.get_toplevel ()) dlg.set_modal (True) dlg.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button (gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default () dlg.set_default_response (gtk.RESPONSE_OK) mainBox = gtk.VBox () alignment = gtk.Alignment () alignment.set_padding (10, 10, 10, 10) alignment.add (mainBox) dlg.vbox.pack_start (alignment) checkButton = gtk.CheckButton (_("Enabled")) active = len (self.current) \ and self.current.lower () not in ("disabled", "none") checkButton.set_active (active) checkButton.set_tooltip_text (self.Setting.LongDesc) mainBox.pack_start (checkButton) box = gtk.VBox () checkButton.connect ("toggled", ShowHideBox, box, dlg) mainBox.pack_start (box) currentEdges = "" for edge in Edges: if "<%sEdge>" % edge in self.current: currentEdges += "%s|" % edge currentEdges.rstrip ("|") edgeSelector = SingleEdgeSelector (currentEdges) edgeSelector.set_tooltip_text(self.Setting.LongDesc) box.pack_start (edgeSelector) currentMods = "" for mod in KeyModifier: if "<%s>" % mod in self.current: currentMods += "%s|" % mod currentMods.rstrip ("|") modifierSelector = ModifierSelector (currentMods) modifierSelector.set_tooltip_text(self.Setting.LongDesc) box.pack_start (modifierSelector) buttonCombo = gtk.combo_box_new_text () currentButton = 1 for i in range (99, 0, -1): if "Button%d" % i in self.current: currentButton = i break maxButton = 20 for i in range (1, maxButton + 1): button = "Button%d" % i buttonCombo.append_text (button) if currentButton > maxButton: buttonCombo.append_text ("Button%d" % currentButton) buttonCombo.set_active (maxButton) else: buttonCombo.set_active (currentButton - 1) buttonCombo.set_tooltip_text(self.Setting.LongDesc) box.pack_start (buttonCombo) dlg.vbox.show_all () ShowHideBox (checkButton, box, dlg) ret = dlg.run () dlg.destroy () if ret != gtk.RESPONSE_OK: return if not checkButton.get_active (): self.ButtonEdited ("Disabled") return edges = edgeSelector.current modifiers = modifierSelector.current button = buttonCombo.get_active_text () edges = edges.split ("|") if len (edges): edges = "<%sEdge>" % "Edge><".join (edges) else: edges = "" modifiers = modifiers.split ("|") if len (modifiers): modifiers = "<%s>" % "><".join (modifiers) else: modifiers = "" button = "%s%s%s" % (edges, modifiers, button) button = self.ReorderButtonString (button) self.ButtonEdited (button) def ButtonEdited (self, button): '''Button edited callback''' if button == "Button1": warning = WarningDialog (self.Widget.get_toplevel (), _("Using Button1 without modifiers can \ prevent any left click and thus break your configuration. Do you really want \ to set \"%s\" button to Button1 ?") % self.Setting.ShortDesc) response = warning.run () if response != gtk.RESPONSE_YES: return conflict = ButtonConflict (self.Setting, button) if conflict.Resolve (GlobalUpdater): self.current = button self.Changed () self.SetButtonLabel () def _Read (self): self.current = self.Get() self.SetButtonLabel () def _Changed (self): self.Set(self.current) class EdgeSetting (EditableActionSetting): current = "" def _Init (self): self.Button = SizedButton (minWidth = 100) self.Button.connect ("clicked", self.RunEdgeSelector) self.Button.set_tooltip_text(self.Setting.LongDesc) self.SetButtonLabel () EditableActionSetting._Init (self, self.Button, "edges") def DoReset (self, widget): conflict = EdgeConflict (self.Setting, self.Setting.DefaultValue) if conflict.Resolve (GlobalUpdater): self.Setting.Reset () self.Setting.Plugin.Context.Write () self.Read () def GetDialogText (self): return self.current def HandleDialogText (self, mask): edges = mask.split ("|") valid = True for edge in edges: if edge not in Edges: valid = False break if not valid: mask = protect_pango_markup (mask) ErrorDialog (self.Widget.get_toplevel (), _("\"%s\" is not a valid edge mask") % mask) return self.EdgeEdited ("|".join (edges)) def SetButtonLabel (self): label = self.current if len (self.current): edges = self.current.split ("|") edges = [_(s) for s in edges] label = ", ".join (edges) else: label = _("None") self.Button.set_label (label) def RunEdgeSelector (self, widget): dlg = gtk.Dialog (_("Edit %s") % self.Setting.ShortDesc) dlg.set_position (gtk.WIN_POS_CENTER_ON_PARENT) dlg.set_transient_for (self.Widget.get_toplevel ()) dlg.set_modal (True) dlg.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button (gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default() dlg.set_default_response (gtk.RESPONSE_OK) selector = SingleEdgeSelector (self.current) alignment = gtk.Alignment () alignment.set_padding (10, 10, 10, 10) alignment.add (selector) selector.set_tooltip_text (self.Setting.LongDesc) dlg.vbox.pack_start (alignment) dlg.vbox.show_all () ret = dlg.run () dlg.destroy () if ret != gtk.RESPONSE_OK: return self.EdgeEdited (selector.current) def EdgeEdited (self, edge): '''Edge edited callback''' conflict = EdgeConflict (self.Setting, edge) if conflict.Resolve (GlobalUpdater): self.current = edge self.Changed () self.SetButtonLabel () def _Read (self): self.current = self.Get() self.SetButtonLabel () def _Changed (self): self.Set(self.current) self.SetButtonLabel () class BellSetting (BoolSetting): def _Init (self): BoolSetting._Init (self) bell = ActionImage ("bell") self.Box.pack_start (bell, False, False) self.Box.reorder_child (bell, 0) def MakeStringSetting (setting, List=False): if setting.Hints: if "file" in setting.Hints: if "image" in setting.Hints: return FileStringSetting (setting, isImage=True, List=List) else: return FileStringSetting (setting, List=List) elif "directory" in setting.Hints: return FileStringSetting (setting, isDirectory=True, List=List) else: return StringSetting (setting, List=List) elif (List and setting.Info[1][2]) or \ (not List and setting.Info[2]): return RestrictedStringSetting (setting, List=List) else: return StringSetting (setting, List=List) def MakeIntSetting (setting, List=False): if List: info = setting.Info[1][2] else: info = setting.Info[2] if info: return EnumSetting (setting, List=List) else: return IntSetting (setting, List=List) def MakeListSetting (setting, List=False): if List: raise TypeError ("Lists of lists are not supported") if setting.Info[0] == "Int" and setting.Info[1][2]: return EnumFlagsSetting (setting) elif setting.Info[0] == "String" and setting.Info[1][2]: return RestrictedStringFlagsSetting (setting) else: return ListSetting (setting) SettingTypeDict = { "Match": MatchSetting, "String": MakeStringSetting, "Bool": BoolSetting, "Float": FloatSetting, "Int": MakeIntSetting, "Color": ColorSetting, "List": MakeListSetting, "Key": KeySetting, "Button": ButtonSetting, "Edge": EdgeSetting, "Bell": BellSetting, } def MakeSetting(setting, List=False): if List: t = setting.Info[0] else: t = setting.Type stype = SettingTypeDict.get(t, None) if not stype: return return stype(setting, List=List) class SubGroupArea(object): def __init__(self, name, subGroup): self.MySettings = [] self.SubGroup = subGroup self.Name = name settings = sorted(GetSettings(subGroup), key=SettingKeyFunc) if not name: self.Child = self.Widget = gtk.VBox() else: self.Widget = gtk.Frame() self.Expander = gtk.Expander(name) self.Widget.add(self.Expander) self.Expander.set_expanded(False) self.Child = gtk.VBox() self.Expander.add(self.Child) self.Child.set_spacing(TableX) self.Child.set_border_width(TableX) # create a special widget for list subGroups if len(settings) > 1 and HasOnlyType(settings, 'List'): multiList = MultiListSetting(Settings=settings) multiList.Read() self.Child.pack_start(multiList.EBox, True, True) self.MySettings.append(multiList) self.Empty = False if name: self.Expander.set_expanded(True) return # exit earlier to avoid unneeded logic's self.Empty = True for setting in settings: if not (setting.Plugin.Name == 'core' and setting.Name == 'active_plugins'): setting = MakeSetting(setting) if setting is not None: setting.Read() self.Child.pack_start(setting.EBox, True, True) self.MySettings.append(setting) self.Empty = False if name and len(settings) < 4: # ahi hay magic numbers! self.Expander.set_expanded(True) def Filter(self, text, level=FilterAll): empty = True count = 0 for setting in self.MySettings: if setting.Filter(text, level=level): empty = False count += 1 if self.Name: self.Expander.set_expanded(count < 4) self.Widget.props.no_show_all = empty if empty: self.Widget.hide() else: self.Widget.show() return not empty compiz-0.9.11+14.04.20140409/compizconfig/ccsm/ccm/Utils.py0000644000015301777760000003130412321343002023323 0ustar pbusernogroup00000000000000# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import os import pygtk import gtk import gtk.gdk import gobject import pango import weakref from ccm.Constants import * from cgi import escape as protect_pango_markup import operator import itertools import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext IconTheme = gtk.icon_theme_get_default() if not IconDir in IconTheme.get_search_path(): IconTheme.prepend_search_path(IconDir) def gtk_process_events (): while gtk.events_pending (): gtk.main_iteration () def getScreens(): screens = [] display = gtk.gdk.display_get_default() nScreens = display.get_n_screens() for i in range(nScreens): screens.append(i) return screens def getDefaultScreen(): display = gtk.gdk.display_get_default() return display.get_default_screen().get_number() def protect_markup_dict (dict_): return dict((k, protect_pango_markup (v)) for (k, v) in dict_.items()) class Image (gtk.Image): def __init__ (self, name = None, type = ImageNone, size = 32, useMissingImage = False): gtk.Image.__init__ (self) if not name: return if useMissingImage: self.set_from_stock (gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_LARGE_TOOLBAR) return try: if type in (ImagePlugin, ImageCategory, ImageThemed): pixbuf = None if type == ImagePlugin: name = "plugin-" + name try: pixbuf = IconTheme.load_icon (name, size, 0) except gobject.GError: pixbuf = IconTheme.load_icon ("plugin-unknown", size, 0) elif type == ImageCategory: name = "plugins-" + name try: pixbuf = IconTheme.load_icon (name, size, 0) except gobject.GError: pixbuf = IconTheme.load_icon ("plugins-unknown", size, 0) else: pixbuf = IconTheme.load_icon (name, size, 0) self.set_from_pixbuf (pixbuf) elif type == ImageStock: self.set_from_stock (name, size) except gobject.GError as e: self.set_from_stock (gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_BUTTON) class ActionImage (gtk.Alignment): map = { "keyboard" : "input-keyboard", "button" : "input-mouse", "edges" : "video-display", "bell" : "audio-x-generic" } def __init__ (self, action): gtk.Alignment.__init__ (self, 0, 0.5) self.set_padding (0, 0, 0, 10) if action in self.map: action = self.map[action] self.add (Image (name = action, type = ImageThemed, size = 22)) class SizedButton (gtk.Button): minWidth = -1 minHeight = -1 def __init__ (self, minWidth = -1, minHeight = -1): super (SizedButton, self).__init__ () self.minWidth = minWidth self.minHeight = minHeight self.connect ("size-request", self.adjust_size) def adjust_size (self, widget, requisition): width, height = requisition.width, requisition.height newWidth = max (width, self.minWidth) newHeight = max (height, self.minHeight) self.set_size_request (newWidth, newHeight) class PrettyButton (gtk.Button): __gsignals__ = { 'expose-event' : 'override', } _old_toplevel = None def __init__ (self): super (PrettyButton, self).__init__ () self.states = { "focus" : False, "pointer" : False } self.set_size_request (200, -1) self.set_relief (gtk.RELIEF_NONE) self.connect ("focus-in-event", self.update_state_in, "focus") self.connect ("focus-out-event", self.update_state_out, "focus") self.connect ("hierarchy-changed", self.hierarchy_changed) def hierarchy_changed (self, widget, old_toplevel): if old_toplevel == self._old_toplevel: return if not old_toplevel and self.state != gtk.STATE_NORMAL: self.set_state(gtk.STATE_PRELIGHT) self.set_state(gtk.STATE_NORMAL) self._old_toplevel = old_toplevel def update_state_in (self, *args): state = args[-1] self.set_state (gtk.STATE_PRELIGHT) self.states[state] = True def update_state_out (self, *args): state = args[-1] self.states[state] = False if True in self.states.values (): self.set_state (gtk.STATE_PRELIGHT) else: self.set_state (gtk.STATE_NORMAL) def do_expose_event (self, event): has_focus = self.flags () & gtk.HAS_FOCUS if has_focus: self.unset_flags (gtk.HAS_FOCUS) ret = gtk.Button.do_expose_event (self, event) if has_focus: self.set_flags (gtk.HAS_FOCUS) return ret class Label(gtk.Label): def __init__(self, value = "", wrap = 160): gtk.Label.__init__(self, value) self.props.xalign = 0 self.props.wrap_mode = pango.WRAP_WORD self.set_line_wrap(True) self.set_size_request(wrap, -1) class NotFoundBox(gtk.Alignment): def __init__(self, value=""): gtk.Alignment.__init__(self, 0.5, 0.5, 0.0, 0.0) box = gtk.HBox() self.Warning = gtk.Label() self.Markup = _("No matches found. \n\n Your filter \"%s\" does not match any items.") value = protect_pango_markup(value) self.Warning.set_markup(self.Markup % value) image = Image("face-surprise", ImageThemed, 48) box.pack_start(image, False, False, 0) box.pack_start(self.Warning, True, True, 15) self.add(box) def update(self, value): value = protect_pango_markup(value) self.Warning.set_markup(self.Markup % value) class IdleSettingsParser: def __init__(self, context, main): def FilterPlugin (p): return not p.Initialized and p.Enabled self.Context = context self.Main = main self.PluginList = [p for p in self.Context.Plugins.items() if FilterPlugin(p[1])] nCategories = len (main.MainPage.RightWidget._boxes) self.CategoryLoadIconsList = list(range(3, nCategories)) # Skip the first 3 print('Loading icons...') gobject.timeout_add (150, self.Wait) def Wait(self): if not self.PluginList: return False if len (self.CategoryLoadIconsList) == 0: # If we're done loading icons gobject.idle_add (self.ParseSettings) else: gobject.idle_add (self.LoadCategoryIcons) return False def ParseSettings(self): name, plugin = self.PluginList[0] if not plugin.Initialized: plugin.Update () self.Main.RefreshPage(plugin) self.PluginList.remove (self.PluginList[0]) gobject.timeout_add (200, self.Wait) return False def LoadCategoryIcons(self): from ccm.Widgets import PluginButton catIndex = self.CategoryLoadIconsList[0] pluginWindow = self.Main.MainPage.RightWidget categoryBox = pluginWindow._boxes[catIndex] for (pluginIndex, plugin) in \ enumerate (categoryBox.get_unfiltered_plugins()): categoryBox._buttons[pluginIndex] = PluginButton (plugin) categoryBox.rebuild_table (categoryBox._current_cols, True) pluginWindow.connect_buttons (categoryBox) self.CategoryLoadIconsList.remove (self.CategoryLoadIconsList[0]) gobject.timeout_add (150, self.Wait) return False # Updates all registered setting when they where changed through CompizConfig class Updater: def __init__ (self): self.VisibleSettings = {} self.Plugins = [] self.Block = 0 def SetContext (self, context): self.Context = context gobject.timeout_add (2000, self.Update) def Append (self, widget): reference = weakref.ref(widget) setting = widget.Setting self.VisibleSettings.setdefault((setting.Plugin.Name, setting.Name), []).append(reference) def AppendPlugin (self, plugin): self.Plugins.append (plugin) def Remove (self, widget): setting = widget.Setting l = self.VisibleSettings.get((setting.Plugin.Name, setting.Name)) if not l: return for i, ref in enumerate(list(l)): if ref() is widget: l.remove(ref) break def UpdatePlugins(self): for plugin in self.Plugins: plugin.Read() def UpdateSetting (self, setting): widgets = self.VisibleSettings.get((setting.Plugin.Name, setting.Name)) if not widgets: return for reference in widgets: widget = reference() if widget is not None: widget.Read() def Update (self): if self.Block > 0: return True if self.Context.ProcessEvents(): changed = self.Context.ChangedSettings if [s for s in changed if s.Plugin.Name == "core" and s.Name == "active_plugins"]: self.UpdatePlugins() for setting in list(changed): widgets = self.VisibleSettings.get((setting.Plugin.Name, setting.Name)) if widgets: for reference in widgets: widget = reference() if widget is not None: widget.Read() if widget.List: widget.ListWidget.Read() changed.remove(setting) self.Context.ChangedSettings = changed return True GlobalUpdater = Updater () class PluginSetting: def __init__ (self, plugin, widget, handler): self.Widget = widget self.Plugin = plugin self.Handler = handler GlobalUpdater.AppendPlugin (self) def Read (self): widget = self.Widget widget.handler_block(self.Handler) widget.set_active (self.Plugin.Enabled) widget.set_sensitive (self.Plugin.Context.AutoSort) widget.handler_unblock(self.Handler) class PureVirtualError(Exception): pass def SettingKeyFunc(value): return value.Plugin.Ranking[value.Name] def CategoryKeyFunc(category): if 'General' == category: return '' else: return category or 'zzzzzzzz' def GroupIndexKeyFunc(item): return item[1][0] FirstItemKeyFunc = operator.itemgetter(0) EnumSettingKeyFunc = operator.itemgetter(1) PluginKeyFunc = operator.attrgetter('ShortDesc') def HasOnlyType (settings, stype): return settings and not [s for s in settings if s.Type != stype] def GetSettings(group, types=None): def TypeFilter (settings, types): for setting in settings: if setting.Type in types: yield setting if types: screen = TypeFilter(iter(group.Screen.values()), types) else: screen = iter(group.Screen.values()) return screen def GetAcceleratorName(key, mods): # is everywhere except for Mac OS return gtk.accelerator_name(key, mods).replace('', '') # Support python 2.4 try: any all except NameError: def any(iterable): for element in iterable: if element: return True return False def all(iterable): for element in iterable: if not element: return False return True compiz-0.9.11+14.04.20140409/compizconfig/ccsm/ccm/__init__.py0000644000015301777760000000023612321343002023762 0ustar pbusernogroup00000000000000from ccm.Conflicts import * from ccm.Window import * from ccm.Settings import * from ccm.Constants import * from ccm.Widgets import * from ccm.Utils import * compiz-0.9.11+14.04.20140409/compizconfig/ccsm/ccm/Widgets.py0000644000015301777760000015760612321343002023647 0ustar pbusernogroup00000000000000# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import pygtk import gtk import gtk.gdk import gobject import cairo, pangocairo from math import pi, sqrt import time import re import mimetypes mimetypes.init() from ccm.Utils import * from ccm.Constants import * from ccm.Conflicts import * import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext # # Try to use gtk like coding style for consistency # class ClearEntry(gtk.Entry): def __init__(self): gtk.Entry.__init__(self) self.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY, gtk.STOCK_CLEAR) self.set_icon_tooltip_text(gtk.ENTRY_ICON_SECONDARY, _("Clear")) self.connect('icon-press', self._clear_pressed) def _clear_pressed(self, widget, pos, event): if pos == gtk.ENTRY_ICON_SECONDARY: self.set_text("") # Cell Renderer for MultiList class CellRendererColor(gtk.GenericCellRenderer): __gproperties__ = { 'text': (gobject.TYPE_STRING, 'color markup text', 'The color as markup like this: #rrrrggggbbbbaaaa', '#0000000000000000', gobject.PARAM_READWRITE) } _text = '#0000000000000000' _color = [0, 0, 0, 0] _surface = None _surface_size = (-1, -1) def __init__(self): gtk.GenericCellRenderer.__init__(self) def _parse_color(self): color = gtk.gdk.color_parse(self._text[:-4]) alpha = int("0x%s" % self._text[-4:], base=16) self._color = [color.red/65535.0, color.green/65535.0, color.blue/65535.0, alpha/65535.0] def do_set_property(self, property, value): if property.name == 'text': self._text = value self._parse_color() def do_get_property(self, property): if property.name == 'text': return self._text def on_get_size(self, widget, cell_area): return (0, 0, 0, 0) # FIXME def redraw(self, width, height): # found in gtk-color-button.c CHECK_SIZE = 4 CHECK_DARK = 21845 # 65535 / 3 CHECK_LIGHT = 43690 width += 10 height += 10 self._surface_size = (width, height) self._surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) cr = cairo.Context(self._surface) x = 0 y = 0 colors = [CHECK_DARK, CHECK_LIGHT] state = 0 begin_state = 0 while y < height: while x < width: cr.rectangle(x, y, CHECK_SIZE, CHECK_SIZE) c = colors[state] / 65535.0 cr.set_source_rgb(c, c, c) cr.fill() x += CHECK_SIZE state = not state state = not begin_state begin_state = state x = 0 y += CHECK_SIZE def on_render(self, window, widget, background_area, cell_area, expose_area, flags): cr = window.cairo_create() height, width = (cell_area.height, cell_area.width) sheight, swidth = self._surface_size if height > sheight or width > swidth: self.redraw(width, height) cr.rectangle(cell_area.x, cell_area.y, width, height) cr.clip() cr.set_source_surface(self._surface, cell_area.x, cell_area.y) cr.paint() r, g, b, a = self._color cr.set_source_rgba(r, g, b, a) cr.paint() class PluginView(gtk.TreeView): def __init__(self, plugins): liststore = gtk.ListStore(str, gtk.gdk.Pixbuf, bool, object) self.model = liststore.filter_new() gtk.TreeView.__init__(self, self.model) self.SelectionHandler = None self.Plugins = set(plugins) for plugin in sorted(plugins.values(), key=PluginKeyFunc): liststore.append([plugin.ShortDesc, Image(plugin.Name, type=ImagePlugin).props.pixbuf, plugin.Enabled, plugin]) column = self.insert_column_with_attributes(0, _('Plugin'), gtk.CellRendererPixbuf(), pixbuf=1, sensitive=2) cell = gtk.CellRendererText() cell.props.wrap_width = 200 column.pack_start(cell) column.set_attributes(cell, text=0) self.model.set_visible_func(self.VisibleFunc) self.get_selection().connect('changed', self.SelectionChanged) def VisibleFunc(self, model, iter): return model[iter][3].Name in self.Plugins def Filter(self, plugins): self.Plugins = set(plugins) self.model.refilter() def SelectionChanged(self, selection): model, iter = selection.get_selected() if iter is None: return self.SelectionHandler(None) return self.SelectionHandler(model[iter][3]) class GroupView(gtk.TreeView): def __init__(self, name): self.model = gtk.ListStore(str, str) gtk.TreeView.__init__(self, self.model) self.SelectionHandler = None self.Visible = set() cell = gtk.CellRendererText() cell.props.ypad = 5 cell.props.wrap_width = 200 column = gtk.TreeViewColumn(name, cell, text=0) self.append_column(column) self.get_selection().connect('changed', self.SelectionChanged) self.hide_all() self.props.no_show_all = True def Update(self, items): self.model.clear() self.model.append([_('All'), 'All']) length = 0 for item in items: self.model.append([item or _("General"), item]) if item: # exclude "General" from count length += 1 if length: self.show_all() self.props.no_show_all = False else: self.hide_all() self.props.no_show_all = True def SelectionChanged(self, selection): model, iter = selection.get_selected() if iter is None: return None return self.SelectionHandler(model[iter][1]) # Selector Buttons # class SelectorButtons(gtk.HBox): def __init__(self): gtk.HBox.__init__(self) self.set_border_width(10) self.set_spacing(5) self.buttons = [] self.arrows = [] def clear_buttons(self): for widget in (self.arrows + self.buttons): widget.destroy() self.arrows = [] self.buttons = [] def add_button(self, label, callback): arrow = gtk.Arrow(gtk.ARROW_RIGHT, gtk.SHADOW_NONE) button = gtk.Button(label) button.set_relief(gtk.RELIEF_NONE) button.connect('clicked', self.on_button_clicked, callback) if self.get_children(): self.pack_start(arrow, False, False) self.arrows.append(arrow) self.pack_start(button, False, False) self.buttons.append(button) self.show_all() def remove_button(self, pos): if pos > len(self.buttons)-1: return self.buttons[pos].destroy() self.buttons.remove(self.buttons[pos]) if pos > 0: self.arrows[pos-1].destroy() self.arrows.remove(self.arrows[pos-1]) def on_button_clicked(self, widget, callback): callback(selector=True) # Selector Box # class SelectorBox(gtk.ScrolledWindow): def __init__(self, backgroundColor): gtk.ScrolledWindow.__init__(self) self.viewport = gtk.Viewport() self.viewport.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(backgroundColor)) self.props.hscrollbar_policy = gtk.POLICY_NEVER self.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC self.box = gtk.VBox() self.box.set_spacing(5) self.viewport.add(self.box) self.add(self.viewport) def close(self): self.destroy() self.viewport.destroy() for button in self.box.get_children(): button.destroy() self.box.destroy() def add_item(self, item, callback, markup="%s", image=None, info=None): button = gtk.Button() label = Label(wrap=170) text = protect_pango_markup(item) label.set_markup(markup % text or _("General")) labelBox = gtk.VBox() labelBox.set_spacing(5) labelBox.pack_start(label) if info: infoLabel = Label() infoLabel.set_markup("%s" % info) labelBox.pack_start(infoLabel) box = gtk.HBox() box.set_spacing(5) if image: box.pack_start(image, False, False) box.pack_start(labelBox) button.add(box) button.connect("clicked", callback, item) button.set_relief(gtk.RELIEF_NONE) self.box.pack_start(button, False, False) def clear_list(self): for button in self.box.get_children(): button.destroy() def set_item_list(self, list, callback): self.clear_list() for item in list: self.add_item(item) self.box.show_all() # Scrolled List # class ScrolledList(gtk.ScrolledWindow): def __init__(self, name): gtk.ScrolledWindow.__init__(self) self.props.hscrollbar_policy = gtk.POLICY_NEVER self.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC self.store = gtk.ListStore(gobject.TYPE_STRING) self.view = gtk.TreeView(self.store) self.view.set_headers_visible(True) self.view.insert_column_with_attributes(-1, name, gtk.CellRendererText(), text=0) self.set_size_request(300, 300) self.add(self.view) self.select = self.view.get_selection() self.select.set_mode(gtk.SELECTION_SINGLE) def get_list(self): values = [] iter = self.store.get_iter_first() while iter: value = self.store.get(iter, 0)[0] if value != "": values.append(value) iter = self.store.iter_next(iter) return values def clear(self): self.store.clear() def append(self, value): iter = self.store.append() self.store.set(iter, 0, value) def set(self, pos, value): iter = self.store.get_iter(pos) self.store.set(iter, 0, value) def delete(self, b): selected_rows = self.select.get_selected_rows()[1] for path in selected_rows: iter = self.store.get_iter(path) self.store.remove(iter) def move_up(self, b): selected_rows = self.select.get_selected_rows()[1] if len(selected_rows) == 1: iter = self.store.get_iter(selected_rows[0]) prev = self.store.get_iter_first() if not self.store.get_path(prev) == self.store.get_path(iter): while prev is not None and not self.store.get_path(self.store.iter_next(prev)) == self.store.get_path(iter): prev = self.store.iter_next(prev) self.store.swap(iter, prev) def move_down(self, b): selected_rows = self.select.get_selected_rows()[1] if len(selected_rows) == 1: iter = self.store.get_iter(selected_rows[0]) next = self.store.iter_next(iter) if next is not None: self.store.swap(iter, next) # Button modifier selection widget # class ModifierSelector (gtk.DrawingArea): __gsignals__ = {"added" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_STRING]), "removed" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_STRING])} _current = [] _base_surface = None _surface = None _x0 = 0 _y0 = 12 _width = 100 _height = 50 _font = "Sans 12 Bold" def __init__ (self, mods): '''Prepare widget''' super (ModifierSelector, self).__init__ () self._current = mods.split ("|") modifier = "%s/modifier.png" % PixmapDir self._base_surface = cairo.ImageSurface.create_from_png (modifier) self.add_events (gtk.gdk.BUTTON_PRESS_MASK) self.connect ("expose_event", self.expose) self.connect ("button_press_event", self.button_press) self.set_size_request (200, 120) x0, y0, width, height = self._x0, self._y0, self._width, self._height self._modifiers = { "Shift" : (x0, y0), "Control" : (x0, y0 + height), "Super" : (x0 + width, y0), "Alt" : (x0 + width, y0 + height) } self._names = { "Control" : "Ctrl" } def set_current (self, value): self._current = value.split ("|") self.redraw (queue = True) def get_current (self): return "|".join ([s for s in self._current if len (s) > 0]) current = property (get_current, set_current) def draw (self, cr, width, height): '''The actual drawing function''' for mod in self._modifiers: x, y = self._modifiers[mod] if mod in self._names: text = self._names[mod] else: text = mod cr.set_source_surface (self._base_surface, x, y) cr.rectangle (x, y, self._width, self._height) cr.fill_preserve () if mod in self._current: cr.set_source_rgb (0.3, 0.3, 0.3) self.write (cr, x + 23, y + 15, text) cr.set_source_rgb (0.5, 1, 0) else: cr.set_source_rgb (0, 0, 0) self.write (cr, x + 22, y + 14, text) def write (self, cr, x, y, text): cr.move_to (x, y) markup = '''%s''' % (self._font, text) pcr = pangocairo.CairoContext (cr) layout = pcr.create_layout () layout.set_markup (markup) pcr.show_layout (layout) def redraw (self, queue = False): '''Redraw internal surface''' alloc = self.get_allocation () # Prepare drawing surface width, height = alloc.width, alloc.height self._surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, width, height) cr = cairo.Context (self._surface) # Clear cr.set_operator (cairo.OPERATOR_CLEAR) cr.paint () cr.set_operator (cairo.OPERATOR_OVER) # Draw self.draw (cr, alloc.width, alloc.height) # Queue expose event if required if queue: self.queue_draw () def expose (self, widget, event): '''Expose event handler''' cr = self.window.cairo_create () if not self._surface: self.redraw () cr.set_source_surface (self._surface) cr.rectangle (event.area.x, event.area.y, event.area.width, event.area.height) cr.clip () cr.paint () return False def in_rect (self, x, y, x0, y0, x1, y1): return x >= x0 and y >= y0 and x <= x1 and y <= y1 def button_press (self, widget, event): x, y = event.x, event.y mod = "" for modifier in self._modifiers: x0, y0 = self._modifiers[modifier] if self.in_rect (x, y, x0, y0, x0 + self._width, y0 + self._height): mod = modifier break if not len (mod): return if mod in self._current: self._current.remove (mod) self.emit ("removed", mod) else: self._current.append (mod) self.emit ("added", mod) self.redraw (queue = True) # Edge selection widget # class EdgeSelector (gtk.DrawingArea): __gsignals__ = {"clicked" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT,))} _base_surface = None _surface = None _radius = 13 _cradius = 20 _coords = [] def __init__ (self): '''Prepare widget''' super (EdgeSelector, self).__init__ () background = "%s/display.png" % PixmapDir self._base_surface = cairo.ImageSurface.create_from_png (background) self.add_events (gtk.gdk.BUTTON_PRESS_MASK) self.connect ("expose_event", self.expose) self.connect ("button_press_event", self.button_press) self.set_size_request (196, 196) # Useful vars x0 = 16 y0 = 24 x1 = 181 y1 = 133 x2 = x0 + 39 y2 = y0 + 26 x3 = x1 - 39 y3 = y1 - 26 self._coords = (x0, y0, x1, y1, x2, y2, x3, y3) def draw (self, cr, width, height): '''The actual drawing function''' # Useful vars x0, y0, x1, y1, x2, y2, x3, y3 = self._coords cradius = self._cradius radius = self._radius cr.set_line_width(1.0) # Top left edge cr.new_path () cr.move_to (x0, y0 + cradius) cr.line_to (x0, y0) cr.line_to (x0 + cradius, y0) cr.arc (x0, y0, cradius, 0, pi / 2) cr.close_path () self.set_fill_color (cr, "TopLeft") cr.fill_preserve () self.set_stroke_color (cr, "TopLeft") cr.stroke () # Top right edge cr.new_path () cr.move_to (x1, y0 + cradius) cr.line_to (x1, y0) cr.line_to (x1 - cradius, y0) cr.arc_negative (x1, y0, cradius, pi, pi/2) cr.close_path () self.set_fill_color (cr, "TopRight") cr.fill_preserve () self.set_stroke_color (cr, "TopRight") cr.stroke () # Bottom left edge cr.new_path () cr.move_to (x0, y1 - cradius) cr.line_to (x0, y1) cr.line_to (x0 + cradius, y1) cr.arc_negative (x0, y1, cradius, 2 * pi, 3 * pi / 2) cr.close_path () self.set_fill_color (cr, "BottomLeft") cr.fill_preserve () self.set_stroke_color (cr, "BottomLeft") cr.stroke () # Bottom right edge cr.new_path () cr.move_to (x1, y1 - cradius) cr.line_to (x1, y1) cr.line_to (x1 - cradius, y1) cr.arc (x1, y1, cradius, pi, 3 * pi / 2) cr.close_path () self.set_fill_color (cr, "BottomRight") cr.fill_preserve () self.set_stroke_color (cr, "BottomRight") cr.stroke () # Top edge cr.new_path () cr.move_to (x2 + radius, y0) cr.line_to (x3 - radius, y0) cr.arc (x3 - radius, y0, radius, 0, pi / 2) cr.line_to (x2 + radius, y0 + radius) cr.arc (x2 + radius, y0, radius, pi / 2, pi) cr.close_path () self.set_fill_color (cr, "Top") cr.fill_preserve () self.set_stroke_color (cr, "Top") cr.stroke () # Bottom edge cr.new_path () cr.move_to (x2 + radius, y1) cr.line_to (x3 - radius, y1) cr.arc_negative (x3 - radius, y1, radius, 0, - pi / 2) cr.line_to (x2 + radius, y1 - radius) cr.arc_negative (x2 + radius, y1, radius, - pi / 2, pi) cr.close_path () self.set_fill_color (cr, "Bottom") cr.fill_preserve () self.set_stroke_color (cr, "Bottom") cr.stroke () # Left edge cr.new_path () cr.move_to (x0, y2 + radius) cr.line_to (x0, y3 - radius) cr.arc_negative (x0, y3 - radius, radius, pi / 2, 0) cr.line_to (x0 + radius, y2 + radius) cr.arc_negative (x0, y2 + radius, radius, 0, 3 * pi / 2) cr.close_path () self.set_fill_color (cr, "Left") cr.fill_preserve () self.set_stroke_color (cr, "Left") cr.stroke () # Right edge cr.new_path () cr.move_to (x1, y2 + radius) cr.line_to (x1, y3 - radius) cr.arc (x1, y3 - radius, radius, pi / 2, pi) cr.line_to (x1 - radius, y2 + radius) cr.arc (x1, y2 + radius, radius, pi, 3 * pi / 2) cr.close_path () self.set_fill_color (cr, "Right") cr.fill_preserve () self.set_stroke_color (cr, "Right") cr.stroke () def set_fill_color (self, cr, edge): '''Set painting color for edge''' cr.set_source_rgb (0.9, 0.9, 0.9) def set_stroke_color (self, cr, edge): '''Set stroke color for edge''' cr.set_source_rgb (0.45, 0.45, 0.45) def redraw (self, queue = False): '''Redraw internal surface''' alloc = self.get_allocation () # Prepare drawing surface width, height = alloc.width, alloc.height self._surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, width, height) cr = cairo.Context (self._surface) # Draw background cr.set_source_surface (self._base_surface) cr.paint () # Draw self.draw (cr, alloc.width, alloc.height) # Queue expose event if required if queue: self.queue_draw () def expose (self, widget, event): '''Expose event handler''' cr = self.window.cairo_create () if not self._surface: self.redraw () cr.set_source_surface (self._surface) cr.rectangle (event.area.x, event.area.y, event.area.width, event.area.height) cr.clip () cr.paint () return False def in_circle_quarter (self, x, y, x0, y0, x1, y1, x2, y2, radius): '''Args: x, y = point coordinates x0, y0 = center coordinates x1, y1 = circle square top left coordinates x2, y2 = circle square bottom right coordinates radius = circle radius''' if not self.in_rect (x, y, x1, y1, x2, y2): return False return self.dist (x, y, x0, y0) <= radius def dist (self, x1, y1, x2, y2): return sqrt ((x2 - x1) ** 2 + (y2 - y1) ** 2) def in_rect (self, x, y, x0, y0, x1, y1): return x >= x0 and y >= y0 and x <= x1 and y <= y1 def button_press (self, widget, event): x, y = event.x, event.y edge = "" # Useful vars x0, y0, x1, y1, x2, y2, x3, y3 = self._coords cradius = self._cradius radius = self._radius if self.in_circle_quarter (x, y, x0, y0, x0, y0, x0 + cradius, y0 + cradius, cradius): edge = "TopLeft" elif self.in_circle_quarter (x, y, x1, y0, x1 - cradius, y0, x1, y0 + cradius, cradius): edge = "TopRight" elif self.in_circle_quarter (x, y, x0, y1, x0, y1 - cradius, x0 + cradius, y1, cradius): edge = "BottomLeft" elif self.in_circle_quarter (x, y, x1, y1, x1 - cradius, y1 - cradius, x1, y1, cradius): edge = "BottomRight" elif self.in_rect (x, y, x2 + radius, y0, x3 - radius, y0 + radius) \ or self.in_circle_quarter (x, y, x2 + radius, y0, x2, y0, x2 + radius, y0 + radius, radius) \ or self.in_circle_quarter (x, y, x3 - radius, y0, x3 - radius, y0, x3, y0 + radius, radius): edge = "Top" elif self.in_rect (x, y, x2 + radius, y1 - radius, x3 - radius, y1) \ or self.in_circle_quarter (x, y, x2 + radius, y1, x2, y1 - radius, x2 + radius, y1, radius) \ or self.in_circle_quarter (x, y, x3 - radius, y1, x3 - radius, y1 - radius, x3, y1, radius): edge = "Bottom" elif self.in_rect (x, y, x0, y2 + radius, x0 + radius, y3 - radius) \ or self.in_circle_quarter (x, y, x0, y2 + radius, x0, y2, x0 + radius, y2 + radius, radius) \ or self.in_circle_quarter (x, y, x0, y3 - radius, x0, y3 - radius, x0 + radius, y3, radius): edge = "Left" elif self.in_rect (x, y, x1 - radius, y2 + radius, x1, y3 - radius) \ or self.in_circle_quarter (x, y, x1, y2 + radius, x1 - radius, y2, x1, y2 + radius, radius) \ or self.in_circle_quarter (x, y, x1, y3 - radius, x1 - radius, y3 - radius, x1, y3, radius): edge = "Right" if edge: self.emit ("clicked", edge, event) # Edge selection widget # class SingleEdgeSelector (EdgeSelector): _current = [] def __init__ (self, edge): '''Prepare widget''' EdgeSelector.__init__ (self) self._current = edge.split ("|") self.connect ('clicked', self.edge_clicked) def set_current (self, value): self._current = value.split ("|") self.redraw (queue = True) def get_current (self): return "|".join ([s for s in self._current if len (s) > 0]) current = property (get_current, set_current) def set_fill_color (self, cr, edge): '''Set painting color for edge''' if edge in self._current: cr.set_source_rgb (0.64, 1.0, 0.09) else: cr.set_source_rgb (0.80, 0.00, 0.00) def set_stroke_color (self, cr, edge): '''Set stroke color for edge''' if edge in self._current: cr.set_source_rgb (0.31, 0.60, 0.02) else: cr.set_source_rgb (0.64, 0.00, 0.00) def edge_clicked (self, widget, edge, event): if not len (edge): return if edge in self._current: self._current.remove (edge) else: self._current.append (edge) self.redraw (queue = True) # Global Edge Selector # class GlobalEdgeSelector(EdgeSelector): _settings = [] _edges = {} _text = {} _context = None def __init__ (self, context, settings=[]): EdgeSelector.__init__ (self) self._context = context self._settings = settings self.connect ("clicked", self.show_popup) if len (settings) <= 0: self.generate_setting_list () def set_fill_color (self, cr, edge): '''Set painting color for edge''' if edge in self._edges: cr.set_source_rgb (0.64, 1.0, 0.09) else: cr.set_source_rgb (0.80, 0.00, 0.00) def set_stroke_color (self, cr, edge): '''Set stroke color for edge''' if edge in self._edges: cr.set_source_rgb (0.31, 0.60, 0.02) else: cr.set_source_rgb (0.64, 0.00, 0.00) def set_settings (self, value): self._settings = value def get_settings (self): return self._settings settings = property (get_settings, set_settings) def generate_setting_list (self): self._settings = [] def filter_settings(plugin): if plugin.Enabled: settings = sorted (GetSettings(plugin), key=SettingKeyFunc) settings = [s for s in settings if s.Type == 'Edge'] return settings return [] for plugin in self._context.Plugins.values (): self._settings += filter_settings (plugin) for setting in self._settings: edges = setting.Value.split ("|") for edge in edges: self._edges[edge] = setting def set_edge_setting (self, setting, edge): if not setting: if edge in self._edges: self._edges.pop(edge) for setting in self._settings: value = setting.Value.split ("|") if edge in value: value.remove(edge) value = "|".join ([s for s in value if len (s) > 0]) setting.Value = value else: value = setting.Value.split ("|") if not edge in value: value.append (edge) value = "|".join ([s for s in value if len (s) > 0]) conflict = EdgeConflict (setting, value, settings = self._settings, autoResolve = True) if conflict.Resolve (GlobalUpdater): setting.Value = value self._edges[edge] = setting self._context.Write() self.redraw (queue = True) def show_popup (self, widget, edge, event): self._text = {} comboBox = gtk.combo_box_new_text () comboBox.append_text (_("None")) comboBox.set_active (0) i = 1 for setting in self._settings: text = "%s: %s" % (setting.Plugin.ShortDesc, setting.ShortDesc) comboBox.append_text (text) self._text[text] = setting if edge in setting.Value.split ("|"): comboBox.set_active (i) i += 1 comboBox.set_size_request (200, -1) comboBox.connect ('changed', self.combo_changed, edge) popup = Popup (self, child=comboBox, decorated=False, mouse=True, modal=False) popup.show_all() popup.connect ('focus-out-event', self.focus_out) def focus_out (self, widget, event): combo = widget.get_child () if combo.props.popup_shown: return gtk_process_events () widget.destroy () def combo_changed (self, widget, edge): text = widget.get_active_text () setting = None if text != _("None"): setting = self._text[text] self.set_edge_setting (setting, edge) popup = widget.get_parent () popup.destroy () # Popup # class Popup (gtk.Window): def __init__ (self, parent=None, text=None, child=None, decorated=True, mouse=False, modal=True): gtk.Window.__init__ (self, gtk.WINDOW_TOPLEVEL) self.set_type_hint (gtk.gdk.WINDOW_TYPE_HINT_UTILITY) self.set_position (mouse and gtk.WIN_POS_MOUSE or gtk.WIN_POS_CENTER_ALWAYS) if parent: self.set_transient_for (parent.get_toplevel ()) self.set_modal (modal) self.set_decorated (decorated) self.set_property("skip-taskbar-hint", True) if text: label = gtk.Label (text) align = gtk.Alignment () align.set_padding (20, 20, 20, 20) align.add (label) self.add (align) elif child: self.add (child) gtk_process_events () def destroy (self): gtk.Window.destroy (self) gtk_process_events () # Key Grabber # class KeyGrabber (gtk.Button): __gsignals__ = {"changed" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_INT, gobject.TYPE_INT]), "current-changed" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_INT, gobject.TYPE_INT])} key = 0 mods = 0 handler = None popup = None label = None def __init__ (self, key = 0, mods = 0, label = None): '''Prepare widget''' super (KeyGrabber, self).__init__ () self.key = key self.mods = mods self.label = label self.connect ("clicked", self.begin_key_grab) self.set_label () def begin_key_grab (self, widget): self.add_events (gtk.gdk.KEY_PRESS_MASK) self.popup = Popup (self, _("Please press the new key combination")) self.popup.show_all() self.handler = self.popup.connect ("key-press-event", self.on_key_press_event) while gtk.gdk.keyboard_grab (self.popup.window) != gtk.gdk.GRAB_SUCCESS: time.sleep (0.1) def end_key_grab (self): gtk.gdk.keyboard_ungrab (gtk.get_current_event_time ()) self.popup.disconnect (self.handler) self.popup.destroy () def on_key_press_event (self, widget, event): mods = event.state & gtk.accelerator_get_default_mod_mask () if event.keyval in (gtk.keysyms.Escape, gtk.keysyms.Return) \ and not mods: if event.keyval == gtk.keysyms.Escape: self.emit ("changed", self.key, self.mods) self.end_key_grab () self.set_label () return key = gtk.gdk.keyval_to_lower (event.keyval) if (key == gtk.keysyms.ISO_Left_Tab): key = gtk.keysyms.Tab if gtk.accelerator_valid (key, mods) \ or (key == gtk.keysyms.Tab and mods): self.set_label (key, mods) self.end_key_grab () self.key = key self.mods = mods self.emit ("changed", self.key, self.mods) return self.set_label (key, mods) def set_label (self, key = None, mods = None): if self.label: if key != None and mods != None: self.emit ("current-changed", key, mods) gtk.Button.set_label (self, self.label) return if key == None and mods == None: key = self.key mods = self.mods label = GetAcceleratorName (key, mods) if not len (label): label = _("Disabled") gtk.Button.set_label (self, label) # Match Button # class MatchButton(gtk.Button): __gsignals__ = {"changed" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_STRING])} prefix = {\ _("Window Title"): 'title', _("Window Role"): 'role', _("Window Name"): 'name', _("Window Class"): 'class', _("Window Type"): 'type', _("Window ID"): 'xid', } symbols = {\ _("And"): '&', _("Or"): '|' } match = None def __init__ (self, entry = None): '''Prepare widget''' super (MatchButton, self).__init__ () self.entry = entry self.match = entry.get_text() self.add (Image (name = gtk.STOCK_ADD, type = ImageStock, size = gtk.ICON_SIZE_BUTTON)) self.connect ("clicked", self.run_edit_dialog) def set_match (self, value): self.match = value self.entry.set_text(value) self.entry.activate() def get_xprop (self, regexp, proc = "xprop"): proc = os.popen (proc) output = proc.readlines () rex = re.compile (regexp) value = "" for line in output: if rex.search (line): m = rex.match (line) value = m.groups () [-1] break return value # Regular Expressions taken from beryl-settings def grab_value (self, widget, value_widget, type_widget): value = "" prefix = self.prefix[type_widget.get_active_text()] if prefix == "type": value = self.get_xprop("^_NET_WM_WINDOW_TYPE\(ATOM\) = _NET_WM_WINDOW_TYPE_(\w+)") value = value.lower().capitalize() elif prefix == "role": value = self.get_xprop("^WM_WINDOW_ROLE\(STRING\) = \"([^\"]+)\"") elif prefix == "name": value = self.get_xprop("^WM_CLASS\(STRING\) = \"([^\"]+)\"") elif prefix == "class": value = self.get_xprop("^WM_CLASS\(STRING\) = \"([^\"]+)\", \"([^\"]+)\"") elif prefix == "title": value = self.get_xprop("^_NET_WM_NAME\(UTF8_STRING\) = ([^\n]+)") if value: list = value.split(", ") value = "" for hex in list: value += "%c" % int(hex, 16) else: value = self.get_xprop("^WM_NAME\(STRING\) = \"([^\"]+)\"") elif prefix == "id": value = self.get_xprop("^xwininfo: Window id: ([^\s]+)", "xwininfo") value_widget.set_text(value) def generate_match (self, t, value, relation, invert): match = "" text = self.match prefix = self.prefix[t] symbol = self.symbols[relation] # check if the current match needs some brackets if len(text) > 0 and text[-1] != ')' and text[0] != '(': match = "(%s)" % text else: match = text if invert: match = "%s %s !(%s=%s)" % (match, symbol, prefix, value) elif len(match) > 0: match = "%s %s %s=%s" % (match, symbol, prefix, value) else: match = "%s=%s" % (prefix, value) self.set_match (match) def _check_entry_value (self, entry, dialog): is_valid = False value = entry.get_text() if value != "": is_valid = True dialog.set_response_sensitive(gtk.RESPONSE_OK, is_valid) def run_edit_dialog (self, widget): '''Run dialog to generate a match''' self.match = self.entry.get_text () dlg = gtk.Dialog (_("Edit match")) dlg.set_position (gtk.WIN_POS_CENTER_ON_PARENT) dlg.set_transient_for (self.get_parent ().get_toplevel ()) dlg.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button (gtk.STOCK_ADD, gtk.RESPONSE_OK).grab_default () dlg.set_response_sensitive(gtk.RESPONSE_OK, False) dlg.set_default_response (gtk.RESPONSE_OK) table = gtk.Table () rows = [] # Type label = Label (_("Type")) type_chooser = gtk.combo_box_new_text () for t in self.prefix: type_chooser.append_text (t) type_chooser.set_active (0) rows.append ((label, type_chooser)) # Value label = Label (_("Value")) box = gtk.HBox () box.set_spacing (5) entry = gtk.Entry () entry.connect ('changed', self._check_entry_value, dlg) button = gtk.Button (_("Grab")) button.connect ('clicked', self.grab_value, entry, type_chooser) box.pack_start (entry, True, True) box.pack_start (button, False, False) rows.append ((label, box)) # Relation label = Label (_("Relation")) relation_chooser = gtk.combo_box_new_text () for relation in self.symbols: relation_chooser.append_text (relation) relation_chooser.set_active (0) rows.append ((label, relation_chooser)) # Invert label = Label (_("Invert")) check = gtk.CheckButton () rows.append ((label, check)) row = 0 for label, widget in rows: table.attach(label, 0, 1, row, row+1, yoptions=0, xpadding=TableX, ypadding=TableY) table.attach(widget, 1, 2, row, row+1, yoptions=0, xpadding=TableX, ypadding=TableY) row += 1 dlg.vbox.pack_start (table) dlg.vbox.set_spacing (5) dlg.show_all () response = dlg.run () dlg.hide () if response == gtk.RESPONSE_OK: t = type_chooser.get_active_text () value = entry.get_text () relation = relation_chooser.get_active_text () invert = check.get_active () self.generate_match (t, value, relation, invert) dlg.destroy () class FileButton (gtk.Button): __gsignals__ = {"changed" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_STRING])} _directory = False _context = None _image = False _path = "" def __init__ (self, context, entry, directory=False, image=False, path=""): gtk.Button.__init__ (self) self._entry = entry self._directory = directory self._context = context self._image = image self._path = path self.set_tooltip_text(_("Browse...")) self.set_image(gtk.image_new_from_stock( gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON)) self.connect('clicked', self.open_dialog) def set_path (self, value): self._path = value self._entry.set_text (value) self._entry.activate () def create_filter(self): filter = gtk.FileFilter () if self._image: filter.set_name (_("Images")) filter.add_pattern ("*.png") filter.add_pattern ("*.jpg") filter.add_pattern ("*.jpeg") filter.add_pattern ("*.svg") else: filter.add_pattern ("*") filter.set_name (_("File")) return filter def check_type (self, filename): if filename.find (".") == -1: return True ext = filename.split (".") [-1] try: mime = mimetypes.types_map [".%s" %ext] except KeyError: return True if self._image: require = FeatureRequirement (self._context, 'imagemime:' + mime) return require.Resolve () return True def update_preview (self, widget): path = widget.get_preview_filename () if path is None or os.path.isdir (path): widget.get_preview_widget ().set_from_file (None) return try: pixbuf = gtk.gdk.pixbuf_new_from_file_at_size (path, 128, 128) except gobject.GError: return widget.get_preview_widget ().set_from_pixbuf (pixbuf) def open_dialog (self, widget): b = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK) if self._directory: title = _("Open directory...") else: title = _("Open file...") chooser = gtk.FileChooserDialog (title = title, buttons = b) if self._directory: chooser.set_action (gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) else: chooser.set_filter (self.create_filter ()) if self._path and os.path.exists (self._path): chooser.set_filename (self._path) else: chooser.set_current_folder (os.environ.get("HOME")) if self._image: chooser.set_use_preview_label (False) chooser.set_preview_widget (gtk.Image ()) chooser.connect ("selection-changed", self.update_preview) ret = chooser.run () filename = chooser.get_filename () chooser.destroy () if ret == gtk.RESPONSE_OK: if self._directory or self.check_type (filename): self.set_path (filename) # About Dialog # class AboutDialog (gtk.AboutDialog): def __init__ (self, parent): gtk.AboutDialog.__init__ (self) self.set_transient_for (parent) self.set_name (_("CompizConfig Settings Manager")) self.set_version (Version) self.set_comments (_("This is a settings manager for the CompizConfig configuration system.")) self.set_copyright ("Copyright \xC2\xA9 2007-2008 Patrick Niklaus/Christopher Williams/Guillaume Seguin/Quinn Storm") self.set_translator_credits (_("translator-credits")) self.set_authors (["Patrick Niklaus ", "Christopher Williams ", "Guillaume Seguin ", "Quinn Storm "]) self.set_artists (["Andrew Wedderburn ", "Patrick Niklaus ", "Gnome Icon Theme Team"]) if IconTheme.lookup_icon("ccsm", 64, 0): icon = IconTheme.load_icon("ccsm", 64, 0) self.set_logo (icon) self.set_website ("https://launchpad.net/compiz") # Error dialog # class ErrorDialog (gtk.MessageDialog): '''Display an error dialog''' def __init__ (self, parent, message): gtk.MessageDialog.__init__ (self, parent, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE) self.set_position (gtk.WIN_POS_CENTER) self.set_markup (message) self.set_title (_("An error has occured")) self.set_transient_for (parent) self.set_modal (True) self.show_all () self.connect ("response", lambda *args: self.destroy ()) # Warning dialog # class WarningDialog (gtk.MessageDialog): '''Display a warning dialog''' def __init__ (self, parent, message): gtk.MessageDialog.__init__ (self, parent, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO) self.set_position (gtk.WIN_POS_CENTER) self.set_markup (message) self.set_title (_("Warning")) self.set_transient_for (parent) self.connect_after ("response", lambda *args: self.destroy ()) # Plugin Button # class PluginButton (gtk.HBox): __gsignals__ = {"clicked" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), "activated" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [])} _plugin = None def __init__ (self, plugin, useMissingImage = False): gtk.HBox.__init__(self) self._plugin = plugin image = Image (plugin.Name, ImagePlugin, 32, useMissingImage) label = Label (plugin.ShortDesc, 120) label.connect ('style-set', self.style_set) box = gtk.HBox () box.set_spacing (5) box.pack_start (image, False, False) box.pack_start (label) button = PrettyButton () button.connect ('clicked', self.show_plugin_page) button.set_tooltip_text (plugin.LongDesc) button.add (box) if plugin.Name != 'core': enable = gtk.CheckButton () enable.set_tooltip_text(_("Enable %s") % plugin.ShortDesc) enable.set_active (plugin.Enabled) enable.set_sensitive (plugin.Context.AutoSort) self._toggled_handler = enable.connect ("toggled", self.enable_plugin) PluginSetting (plugin, enable, self._toggled_handler) self.pack_start (enable, False, False) self.pack_start (button, False, False) self.set_size_request (220, -1) StyleBlock = 0 def style_set (self, widget, previous): if self.StyleBlock > 0: return self.StyleBlock += 1 widget.modify_fg(gtk.STATE_NORMAL, widget.style.text[gtk.STATE_NORMAL]) self.StyleBlock -= 1 def enable_plugin (self, widget): plugin = self._plugin conflicts = plugin.Enabled and plugin.DisableConflicts or plugin.EnableConflicts conflict = PluginConflict (plugin, conflicts) if conflict.Resolve (): plugin.Enabled = widget.get_active () else: widget.handler_block(self._toggled_handler) widget.set_active (plugin.Enabled) widget.handler_unblock(self._toggled_handler) plugin.Context.Write () GlobalUpdater.UpdatePlugins() plugin.Context.UpdateExtensiblePlugins () self.emit ('activated') def show_plugin_page (self, widget): self.emit ('clicked') def filter (self, text, level=FilterAll): found = False if level & FilterName: if (text in self._plugin.Name.lower () or text in self._plugin.ShortDesc.lower ()): found = True if not found and level & FilterLongDesc: if text in self._plugin.LongDesc.lower(): found = True if not found and level & FilterCategory: if text == None \ or (text == "" and self._plugin.Category.lower() == "") \ or (text != "" and text in self._plugin.Category.lower()): found = True return found def get_plugin (self): return self._plugin # Category Box # class CategoryBox(gtk.VBox): _plugins = None _unfiltered_plugins = None _buttons = None _context = None _name = "" _tabel = None _alignment = None _current_cols = 0 _current_plugins = 0 def __init__ (self, context, name, plugins=None, categoryIndex=0): gtk.VBox.__init__ (self) self.set_spacing (5) self._context = context if plugins is not None: self._plugins = plugins else: self._plugins = [] if not plugins: for plugin in context.Plugins.values (): if plugin.Category == name: self._plugins.append (plugin) self._plugins.sort(key=PluginKeyFunc) self._name = name text = name or 'Uncategorized' # Keep unfiltered list of plugins for correct background icon loading self._unfiltered_plugins = self._plugins header = gtk.HBox () header.set_border_width (5) header.set_spacing (10) label = Label ('', -1) label.set_markup ("%s" % _(text)) icon = text.lower ().replace (" ", "_") image = Image (icon, ImageCategory) header.pack_start (image, False, False) header.pack_start (label, False, False) self._table = gtk.Table () self._table.set_border_width (10) # load icons now only for the first 3 categories dontLoadIcons = (categoryIndex >= 3); self._buttons = [] for plugin in self._plugins: button = PluginButton(plugin, dontLoadIcons) self._buttons.append(button) self._alignment = gtk.Alignment (0, 0, 1, 1) self._alignment.set_padding (0, 20, 0, 0) self._alignment.add (gtk.HSeparator ()) self.pack_start (header, False, False) self.pack_start (self._table, False, False) self.pack_start (self._alignment) def show_separator (self, show): children = self.get_children () if show: if self._alignment not in children: self.pack_start (self._alignment) else: if self._alignment in children: self.remove(self._alignment) def filter_buttons (self, text, level=FilterAll): self._plugins = [] for button in self._buttons: if button.filter (text, level=level): self._plugins.append (button.get_plugin()) return bool(self._plugins) def rebuild_table (self, ncols, force = False): if (not force and ncols == self._current_cols and len (self._plugins) == self._current_plugins): return self._current_cols = ncols self._current_plugins = len (self._plugins) children = self._table.get_children () if children: for child in children: self._table.remove(child) row = 0 col = 0 for button in self._buttons: if button.get_plugin () in self._plugins: self._table.attach (button, col, col+1, row, row+1, 0, xpadding=TableX, ypadding=TableY) col += 1 if col == ncols: col = 0 row += 1 self.show_all () def get_buttons (self): return self._buttons def get_plugins (self): return self._plugins def get_unfiltered_plugins (self): return self._unfiltered_plugins # Plugin Window # class PluginWindow(gtk.ScrolledWindow): __gsignals__ = {"show-plugin" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT])} _not_found_box = None _style_block = 0 _context = None _categories = None _viewport = None _boxes = None _box = None def __init__ (self, context, categories=[], plugins=[]): gtk.ScrolledWindow.__init__ (self) self._categories = {} self._boxes = [] self._context = context pool = plugins or list(self._context.Plugins.values()) if len (categories): for plugin in pool: category = plugin.Category if category in categories: if not category in self._categories: self._categories[category] = [] self._categories[category].append(plugin) else: for plugin in pool: category = plugin.Category if not category in self._categories: self._categories[category] = [] self._categories[category].append(plugin) self.props.hscrollbar_policy = gtk.POLICY_NEVER self.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC self.connect ('size-allocate', self.rebuild_boxes) self._box = gtk.VBox () self._box.set_spacing (5) self._not_found_box = NotFoundBox () categories = sorted(self._categories, key=CategoryKeyFunc) for (i, category) in enumerate(categories): plugins = self._categories[category] category_box = CategoryBox(context, category, plugins, i) self.connect_buttons (category_box) self._boxes.append (category_box) self._box.pack_start (category_box, False, False) viewport = gtk.Viewport () viewport.connect("style-set", self.set_viewport_style) viewport.set_focus_vadjustment (self.get_vadjustment ()) viewport.add (self._box) self.add (viewport) def connect_buttons (self, category_box): buttons = category_box.get_buttons () for button in buttons: button.connect('clicked', self.show_plugin_page) def set_viewport_style (self, widget, previous): if self._style_block > 0: return self._style_block += 1 widget.modify_bg(gtk.STATE_NORMAL, widget.style.base[gtk.STATE_NORMAL]) self._style_block -= 1 def filter_boxes (self, text, level=FilterAll): found = False for box in self._boxes: found |= box.filter_buttons (text, level) viewport = self.get_child () child = viewport.get_child () if not found: if child is not self._not_found_box: viewport.remove (self._box) viewport.add (self._not_found_box) self._not_found_box.update (text) else: if child is self._not_found_box: viewport.remove (self._not_found_box) viewport.add (self._box) self.queue_resize() self.show_all() def rebuild_boxes (self, widget, request): ncols = request.width / 220 width = ncols * (220 + 2 * TableX) + 40 if width > request.width: ncols -= 1 pos = 0 last_box = None children = self._box.get_children () for box in self._boxes: plugins = box.get_plugins () if len (plugins) == 0: if box in children: self._box.remove(box) else: if last_box: last_box.show_separator (True) if box not in children: self._box.pack_start (box, False, False) self._box.reorder_child (box, pos) box.rebuild_table (ncols) box.show_separator (False) pos += 1 last_box = box def get_categories (self): return list(self._categories) def show_plugin_page (self, widget): plugin = widget.get_plugin () self.emit ('show-plugin', plugin) compiz-0.9.11+14.04.20140409/compizconfig/ccsm/ccm/Pages.py0000644000015301777760000014641612321343002023275 0ustar pbusernogroup00000000000000# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import pygtk import gtk import gobject import gtk.gdk import compizconfig ccs = compizconfig from ccm.Constants import * from ccm.Settings import * from ccm.Conflicts import * from ccm.Utils import * from ccm.Widgets import * import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext CurrentUpdater = None # Generic Page # class GenericPage(gobject.GObject): __gsignals__ = {"go-back" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [])} LeftWidget = None RightWidget = None def __init__(self): gobject.GObject.__init__(self) def GoBack(self, widget): self.emit('go-back') # Plugin Page # class PluginPage(GenericPage): def __init__(self, plugin): GenericPage.__init__(self) self.Plugin = plugin self.LeftWidget = gtk.VBox(False, 10) self.LeftWidget.set_border_width(10) pluginLabel = Label() pluginLabel.set_markup(HeaderMarkup % (plugin.ShortDesc)) pluginLabel.connect("style-set", self.HeaderStyleSet) pluginImg = Image(plugin.Name, ImagePlugin, 64) filterLabel = Label() filterLabel.set_markup(HeaderMarkup % (_("Filter"))) filterLabel.connect("style-set", self.HeaderStyleSet) self.FilterEntry = ClearEntry() self.FilterEntry.connect("changed", self.FilterChanged) self.LeftWidget.pack_start(pluginImg, False, False) self.LeftWidget.pack_start(filterLabel, False, False) self.LeftWidget.pack_start(self.FilterEntry, False, False) self.LeftWidget.pack_start(pluginLabel, False, False) infoLabelCont = gtk.HBox() infoLabelCont.set_border_width(10) self.LeftWidget.pack_start(infoLabelCont, False, False) infoLabel = Label(plugin.LongDesc, 180) infoLabelCont.pack_start(infoLabel, True, True) self.NotFoundBox = None if plugin.Name != 'core': self.FilterEntry.set_tooltip_text(_("Search %s Plugin Options") % plugin.ShortDesc) enableLabel = Label() enableLabel.set_markup(HeaderMarkup % (_("Use This Plugin"))) enableLabel.connect("style-set", self.HeaderStyleSet) self.LeftWidget.pack_start(enableLabel, False, False) enableCheckCont = gtk.HBox() enableCheckCont.set_border_width(10) self.LeftWidget.pack_start(enableCheckCont, False, False) enableCheck = gtk.CheckButton() enableCheck.add(Label(_("Enable %s") % plugin.ShortDesc, 120)) enableCheck.set_tooltip_text(plugin.LongDesc) enableCheck.set_active(plugin.Enabled) enableCheck.set_sensitive(plugin.Context.AutoSort) enableCheckCont.pack_start(enableCheck, True, True) enableCheck.connect('toggled', self.EnablePlugin) else: self.FilterEntry.set_tooltip_text(_("Search Compiz Core Options")) backButton = gtk.Button(gtk.STOCK_GO_BACK) backButton.set_use_stock(True) self.LeftWidget.pack_end(backButton, False, False) backButton.connect('clicked', self.GoBack) self.RightWidget = gtk.Notebook() self.RightWidget.set_scrollable(True) self.Pages = [] sortedGroups = sorted(plugin.Groups.items(), key=GroupIndexKeyFunc) for (name, (groupIndex, group)) in sortedGroups: name = name or _("General") groupPage = GroupPage(name, group) groupPage.Wrap() if not groupPage.Empty: self.RightWidget.append_page(groupPage.Scroll, gtk.Label(name)) self.Pages.append(groupPage) self.RightWidget.connect('size-allocate', self.ResetFocus) self.Block = 0 StyleBlock = 0 def HeaderStyleSet(self, widget, previous): if self.StyleBlock > 0: return self.StyleBlock += 1 for state in (gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE): widget.modify_fg(state, widget.style.bg[gtk.STATE_SELECTED]) self.StyleBlock -= 1 def ResetFocus(self, widget, data): pos = self.FilterEntry.get_position() self.FilterEntry.grab_focus() self.FilterEntry.set_position(pos) def GetPageSpot(self, new): vpos = 0 #visible position for page in self.Pages: if page is new: break if page.Visible: vpos += 1 return vpos def ShowFilterError(self, text): if self.NotFoundBox is None: self.NotFoundBox = NotFoundBox(text) self.RightWidget.append_page(self.NotFoundBox, gtk.Label(_("Error"))) else: self.NotFoundBox.update(text) def HideFilterError(self): if self.NotFoundBox is None: return num = self.RightWidget.page_num(self.NotFoundBox) if num >= 0: self.RightWidget.remove_page(num) self.NotFoundBox.destroy() self.NotFoundBox = None self.RightWidget.set_current_page(0) def FilterChanged(self, widget): text = widget.get_text().lower() if text == "": text = None empty = True for page in self.Pages: num = self.RightWidget.page_num(page.Scroll) if page.Filter(text): empty = False if num < 0: self.RightWidget.insert_page(page.Scroll, gtk.Label(page.Name), self.GetPageSpot(page)) else: if num >= 0: self.RightWidget.remove_page(num) if empty: self.ShowFilterError(text) else: self.HideFilterError() self.RightWidget.show_all() # This seems to be necessary to ensure all gaps from hidden settings are removed on all tabs for page in self.Pages: page.Scroll.queue_resize_no_redraw() def EnablePlugin(self, widget): if self.Block > 0: return self.Block += 1 # attempt to resolve conflicts... conflicts = self.Plugin.Enabled and self.Plugin.DisableConflicts or self.Plugin.EnableConflicts conflict = PluginConflict(self.Plugin, conflicts) if conflict.Resolve(): self.Plugin.Enabled = widget.get_active() else: widget.set_active(self.Plugin.Enabled) self.Plugin.Context.Write() self.Block -= 1 GlobalUpdater.UpdatePlugins() # Checks if any edit dialog is open, and if so, makes sure a refresh # happens when it closes. def CheckDialogs(self, basePlugin, main): for groupPage in self.Pages: if isinstance(groupPage, GroupPage): for sga in groupPage.subGroupAreas: for setting in sga.MySettings: if isinstance(setting, BaseListSetting) and \ setting.EditDialog and setting.EditDialogOpen: setting.PageToBeRefreshed = (self, basePlugin, main) return False return True def RefreshPage(self, basePlugin, main): curPage = self.RightWidget.get_current_page () main.BackToMain (None) main.MainPage.ShowPlugin (None, basePlugin) main.CurrentPage.RightWidget.set_current_page (curPage) # Filter Page # class FilterPage(GenericPage): def __init__(self, context): GenericPage.__init__(self) self.Context = context self.LeftWidget = gtk.VBox(False, 10) self.LeftWidget.set_border_width(10) self.RightWidget = gtk.Notebook() self.RightChild = gtk.VBox() # Image + Label filterLabel = Label() filterLabel.set_markup(HeaderMarkup % (_("Filter"))) filterLabel.connect("style-set", self.HeaderStyleSet) filterImg = Image("search", ImageCategory, 64) self.LeftWidget.pack_start(filterImg, False, False) self.LeftWidget.pack_start(filterLabel, False, False) # Entry FIXME find a solution with std gtk self.FilterEntry = ClearEntry() self.FilterEntry.set_icon_from_icon_name(gtk.ENTRY_ICON_PRIMARY, "input-keyboard") self.FilterEntry.set_icon_tooltip_text(gtk.ENTRY_ICON_PRIMARY, _("Grab Keys")) self.FilterEntry.connect('icon-press', self.GrabKey) self.FilterEntry.set_tooltip_text(_("Enter a filter.\nClick the keyboard image to grab a key for which to search.")) self.FilterEntry.connect("changed", self.FilterChanged) self.LeftWidget.pack_start(self.FilterEntry, False, False) # Search in... filterSearchLabel = Label() filterSearchLabel.set_markup(HeaderMarkup % (_("Search in..."))) filterSearchLabel.connect("style-set", self.HeaderStyleSet) self.LeftWidget.pack_start(filterSearchLabel, False, False) # Options self.FilterNameCheck = check = gtk.CheckButton(_("Short description and name")) check.set_active(True) check.connect("toggled", self.LevelChanged, FilterName) self.LeftWidget.pack_start(check, False, False) self.FilterLongDescCheck = check = gtk.CheckButton(_("Long description")) check.set_active(True) check.connect("toggled", self.LevelChanged, FilterLongDesc) self.LeftWidget.pack_start(check, False, False) self.FilterValueCheck = check = gtk.CheckButton(_("Settings value")) check.set_active(False) check.connect("toggled", self.LevelChanged, FilterValue) self.LeftWidget.pack_start(check, False, False) # Back Button self.BackButton = gtk.Button(gtk.STOCK_GO_BACK) self.BackButton.set_use_stock(True) self.BackButton.connect('clicked', self.GoBack) self.LeftWidget.pack_end(self.BackButton, False, False) self.NotFoundBox = None # Selector self.CurrentPlugin = None self.CurrentGroup = None self.CurrentSubGroup = None self.PackedPlugins = () self.PackedGroups = () self.PackedSubGroups = () self.SelectorButtons = SelectorButtons() self.PluginBox = PluginView(context.Plugins) self.PluginBox.SelectionHandler = self.PluginChanged self.GroupBox = GroupView(_("Group")) self.GroupBox.SelectionHandler = self.GroupChanged self.SubGroupBox = GroupView(_("Subgroup")) self.SubGroupBox.SelectionHandler = self.SubGroupChanged self.PluginBox.set_size_request(250, 180) self.GroupBox.set_size_request(220, 180) self.SubGroupBox.set_size_request(220, 180) self.SelectorButtons.set_size_request(-1, 50) self.SelectorBoxes = gtk.HBox() self.SelectorBoxes.set_border_width(5) self.SelectorBoxes.set_spacing(5) scroll = gtk.ScrolledWindow() scroll.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC scroll.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC scroll.add(self.PluginBox) self.SelectorBoxes.pack_start(scroll, False, False) scroll = gtk.ScrolledWindow() scroll.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC scroll.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC scroll.add(self.GroupBox) self.SelectorBoxes.pack_start(scroll, False, False) scroll = gtk.ScrolledWindow() scroll.add(self.SubGroupBox) scroll.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC scroll.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC self.SelectorBoxes.pack_start(scroll, False, False) self.RightChild.pack_start(self.SelectorButtons, False, False) self.RightChild.pack_start(self.SelectorBoxes, False, False) self.SettingsArea = gtk.ScrolledWindow() ebox = gtk.EventBox() self.SettingsBox = gtk.VBox() ebox.add(self.SettingsBox) self.SettingsBox.set_border_width(5) self.SettingsArea.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC self.SettingsArea.props.vscrollbar_policy = gtk.POLICY_ALWAYS self.SettingsArea.set_border_width(5) self.SettingsArea.add_with_viewport(ebox) self.RightChild.pack_start(self.SettingsArea, True, True) GlobalUpdater.Block += 1 # Notebook self.NotebookLabel = gtk.Label(_("Settings")) self.NotebookChild = gtk.EventBox() self.NotebookChild.add(self.RightChild) self.RightWidget.append_page(self.NotebookChild, self.NotebookLabel) box = gtk.VBox() box.set_border_width(5) progress = Popup(child=box) progress.connect("delete-event", lambda *a: True) progress.set_title(_("Loading Advanced Search")) bar = gtk.ProgressBar() box.pack_start(bar, False, False) label = gtk.Label() box.pack_start(label, False, False) progress.set_size_request(300, -1) progress.show_all() self.GroupPages = {} length = len(context.Plugins) for index, n in enumerate(context.Plugins): plugin = context.Plugins[n] bar.set_fraction((index+1)/float(length)) label.set_markup("%s" %protect_pango_markup(plugin.ShortDesc)) gtk_process_events() groups = [] sortedGroups = sorted(plugin.Groups.items(), key=GroupIndexKeyFunc) for (name, (groupIndex, group)) in sortedGroups: groups.append((name, GroupPage(name or _('General'), group))) self.GroupPages[n] = groups self.Level = FilterName | FilterLongDesc self.FilterChanged() progress.destroy() gtk_process_events() GlobalUpdater.Block -= 1 StyleBlock = 0 def HeaderStyleSet(self, widget, previous): if self.StyleBlock > 0: return self.StyleBlock += 1 for state in (gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE): widget.modify_fg(state, widget.style.bg[gtk.STATE_SELECTED]) self.StyleBlock -= 1 def Filter(self, text, level=FilterAll): text = text.lower() for plugin in self.GroupPages: groups = self.GroupPages[plugin] results = dict((n, sg) for (n, sg) in groups if sg.Filter(text, level=level)) if results: yield plugin, results def GotKey(self, widget, key, mods): new = GetAcceleratorName (key, mods) for mod in KeyModifier: if "%s_L" % mod in new: new = new.replace ("%s_L" % mod, "<%s>" % mod) if "%s_R" % mod in new: new = new.replace ("%s_R" % mod, "<%s>" % mod) widget.destroy() self.FilterValueCheck.set_active(True) self.FilterEntry.set_text(new) def GrabKey(self, widget, pos, event): if pos != gtk.ENTRY_ICON_PRIMARY: return grabber = KeyGrabber(label = _("Grab key combination")) self.LeftWidget.pack_start(grabber, False, False) grabber.hide() grabber.set_no_show_all(True) grabber.connect('changed', self.GotKey) grabber.begin_key_grab(None) def ShowFilterError(self, text): if self.NotFoundBox is None: self.NotFoundBox = NotFoundBox(text) self.NotebookChild.remove(self.RightChild) self.NotebookChild.add(self.NotFoundBox) self.NotebookLabel.set_text(_("Error")) self.NotebookChild.show_all() else: self.NotFoundBox.update(text) def HideFilterError(self): if self.NotFoundBox is None: return num = self.RightWidget.page_num(self.NotFoundBox) if num >= 0: self.RightWidget.remove_page(num) self.NotebookChild.remove(self.NotFoundBox) self.NotebookChild.add(self.RightChild) self.NotFoundBox.destroy() self.NotFoundBox = None self.NotebookLabel.set_text(_("Settings")) self.NotebookChild.show_all() def UpdatePluginBox(self): self.PluginBox.Filter(self.Results) self.UpdateGroupBox() def UpdateGroupBox(self): if self.CurrentPlugin is None: self.GroupBox.Update(()) else: self.GroupBox.Update(self.Results[self.CurrentPlugin.Name]) self.UpdateSubGroupBox() def UpdateSubGroupBox(self): if self.CurrentPlugin is not None and self.CurrentGroup in self.Results[self.CurrentPlugin.Name]: grouppage = self.Results[self.CurrentPlugin.Name][self.CurrentGroup] self.SubGroupBox.Update(sga.Name for sga in grouppage.VisibleAreas) else: self.SubGroupBox.Update(()) def UpdateSelectorButtons(self): self.SelectorButtons.clear_buttons() if self.CurrentPlugin is not None: self.SelectorButtons.add_button(self.CurrentPlugin.ShortDesc, self.PluginChanged) if self.CurrentGroup is not None: self.SelectorButtons.add_button(self.CurrentGroup or _("General"), self.GroupChanged) if self.CurrentSubGroup is not None: self.SelectorButtons.add_button(self.CurrentSubGroup or _("General"), self.SubGroupChanged) def PluginChanged(self, plugin=None, selector=False): if not selector: self.CurrentPlugin = plugin self.CurrentGroup = None self.CurrentSubGroup = None self.UpdateSelectorButtons() if not selector: self.UpdateGroupBox() else: self.GroupBox.get_selection().unselect_all() self.UpdateSubGroupBox() if self.CurrentPlugin is not None: self.PackSettingsBox(plugins=[self.CurrentPlugin]) else: self.PackSettingsBox() self.RightChild.show_all() def GroupChanged(self, group=None, selector=False): if group == 'All': self.PluginChanged(selector=True) return if not selector: self.CurrentGroup = group self.CurrentSubGroup = None self.UpdateSelectorButtons() if not selector: self.UpdateSubGroupBox() else: self.SubGroupBox.get_selection().unselect_all() if self.CurrentGroup is not None: page = self.Results[self.CurrentPlugin.Name][self.CurrentGroup] self.PackSettingsBox(groups=[page]) else: self.PackSettingsBox() self.RightChild.show_all() def SubGroupChanged(self, subGroup=None, selector=False): if subGroup == 'All': self.GroupChanged(selector=True) return if not selector: self.CurrentSubGroup = subGroup self.UpdateSelectorButtons() if self.CurrentSubGroup is not None: sgas = self.Results[self.CurrentPlugin.Name][self.CurrentGroup].VisibleAreas sga = [sga for sga in sgas if sga.Name == self.CurrentSubGroup] self.PackSettingsBox(subgroups=sga) else: self.PackSettingsBox() self.RightChild.show_all() def LevelChanged(self, widget, level): if widget.get_active(): if level & self.Level: return self.Level |= level else: if not level & self.Level: return self.Level &= ~level self.FilterChanged() def PackSettingsBox(self, plugins=None, groups=None, subgroups=None): for pluginbox in self.PackedPlugins: for child in pluginbox.get_children(): pluginbox.remove(child) pluginbox.destroy() self.PackedPlugins = () for group in self.PackedGroups: if group.Widget.get_parent(): group.Widget.get_parent().remove(group.Widget) self.PackedGroups = () for subgroup in self.PackedSubGroups: if subgroup.Widget.get_parent(): subgroup.Widget.get_parent().remove(subgroup.Widget) subgroup.Widget.destroy() self.PackedSubGroups = () if plugins is not None: self.PackedPlugins = [] self.PackedGroups = [] for plugin in plugins: box = gtk.VBox() for (pageName, page) in self.GroupPages[plugin.Name]: box.pack_start(page.Label, False, False) box.pack_start(page.Widget, False, False) self.PackedGroups.append(page) self.SettingsBox.pack_start(box, False, False) self.PackedPlugins.append(box) if groups is not None: self.PackedGroups = [] for page in groups: self.SettingsBox.pack_start(page.Widget, False, False) self.PackedGroups.append(page) if subgroups is not None: self.PackedSubGroups = [] for area in subgroups: sga = SubGroupArea('', area.SubGroup) sga.Filter(self.FilterEntry.get_text().lower()) self.SettingsBox.pack_start(sga.Widget, False, False) self.PackedSubGroups.append(sga) self.SettingsBox.show_all() def FilterChanged(self, widget=None): self.Results = dict(self.Filter(self.FilterEntry.get_text(), level=self.Level)) self.PluginBox.Filter(self.Results) self.UpdateGroupBox() self.UpdateSelectorButtons() for sga in self.PackedSubGroups: sga.Filter(self.FilterEntry.get_text().lower()) self.SettingsBox.queue_resize_no_redraw() self.RightWidget.show_all() if not self.Results: self.ShowFilterError(self.FilterEntry.get_text()) elif self.NotFoundBox: self.HideFilterError() def GoBack(self, widget): for groups in self.GroupPages.values(): for (pageName, page) in groups: page.SetContainer.destroy() self.GroupPages = None self.emit('go-back') # Profile and Backend Page # class ProfileBackendPage(object): def __init__(self, context): self.Context = context rightChild = gtk.VBox() rightChild.set_border_width(10) # Profiles profileBox = gtk.HBox() profileBox.set_spacing(5) profileAdd = gtk.Button() profileAdd.set_tooltip_text(_("Add a New Profile")) profileAdd.set_image(gtk.image_new_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_BUTTON)) self.ProfileRemoveButton = profileRemove = gtk.Button() profileRemove.set_tooltip_text(_("Remove This Profile")) profileRemove.set_image(gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_BUTTON)) self.ProfileComboBox = gtk.combo_box_new_text() self.ProfileComboBox.set_sensitive(self.Context.CurrentBackend.ProfileSupport) self.ProfileComboBox.append_text(_("Default")) active = -1 for i, name in enumerate(self.Context.Profiles): profile = self.Context.Profiles[name] self.ProfileComboBox.append_text(profile.Name) if name == self.Context.CurrentProfile.Name: active = i self.ProfileHandler = self.ProfileComboBox.connect("changed", self.ProfileChangedAddTimeout) self.ProfileComboBox.set_active(active+1) profileAdd.connect("clicked", self.AddProfile) profileRemove.connect("clicked", self.RemoveProfile) profileBox.pack_start(self.ProfileComboBox, True, True) profileBox.pack_start(profileAdd, False, False) profileBox.pack_start(profileRemove, False, False) profileLabel = Label() profileLabel.set_markup(HeaderMarkup % (_("Profile"))) profileLabel.connect("style-set", self.HeaderStyleSet) self.ProfileImportExportBox = gtk.HBox() self.ProfileImportExportBox.set_spacing(5) profileImportButton = gtk.Button(_("Import")) profileImportButton.set_tooltip_text(_("Import a CompizConfig Profile")) profileImportAsButton = gtk.Button(_("Import as...")) profileImportAsButton.set_tooltip_text(_("Import a CompizConfig Profile as a new profile")) profileExportButton = gtk.Button(_("Export")) profileExportButton.set_tooltip_text(_("Export your CompizConfig Profile")) profileResetButton = gtk.Button(_("Reset to defaults")) profileResetButton.set_tooltip_text(_("Reset your CompizConfig Profile to the global defaults")) profileResetButton.set_image(gtk.image_new_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_BUTTON)) profileImportButton.set_image(gtk.image_new_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON)) profileImportAsButton.set_image(gtk.image_new_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON)) profileExportButton.set_image(gtk.image_new_from_stock(gtk.STOCK_SAVE, gtk.ICON_SIZE_BUTTON)) profileImportButton.connect("clicked", self.ImportProfile) profileImportAsButton.connect("clicked", self.ImportProfileAs) profileExportButton.connect("clicked", self.ExportProfile) profileResetButton.connect("clicked", self.ResetProfile) self.ProfileImportExportBox.pack_start(profileImportButton, False, False) self.ProfileImportExportBox.pack_start(profileImportAsButton, False, False) self.ProfileImportExportBox.pack_start(profileExportButton, False, False) self.ProfileImportExportBox.pack_start(profileResetButton, False, False) rightChild.pack_start(profileLabel, False, False, 5) rightChild.pack_start(profileBox, False, False, 5) rightChild.pack_start(self.ProfileImportExportBox, False, False, 5) # Backends backendBox = gtk.combo_box_new_text() active = 0 for i, name in enumerate(self.Context.Backends): backend = self.Context.Backends[name] backendBox.append_text(backend.ShortDesc) if name == self.Context.CurrentBackend.Name: active = i backendBox.set_active(active) backendBox.connect("changed", self.BackendChangedAddTimeout) backendLabel = Label() backendLabel.set_markup(HeaderMarkup % (_("Backend"))) backendLabel.connect("style-set", self.HeaderStyleSet) rightChild.pack_start(backendLabel, False, False, 5) rightChild.pack_start(backendBox, False, False, 5) # Integration integrationLabel = Label() integrationLabel.set_markup(HeaderMarkup % (_("Integration"))) integrationLabel.connect("style-set", self.HeaderStyleSet) self.IntegrationButton = gtk.CheckButton(_("Enable integration into the desktop environment")) self.IntegrationButton.set_active(self.Context.Integration) self.IntegrationButton.set_sensitive(self.Context.CurrentBackend.IntegrationSupport) self.IntegrationButton.connect("toggled", self.IntegrationChanged) rightChild.pack_start(integrationLabel, False, False, 5) rightChild.pack_start(self.IntegrationButton, False, False, 5) self.Widget = rightChild StyleBlock = 0 def HeaderStyleSet(self, widget, previous): if self.StyleBlock > 0: return self.StyleBlock += 1 for state in (gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE): widget.modify_fg(state, widget.style.bg[gtk.STATE_SELECTED]) self.StyleBlock -= 1 def UpdateProfiles (self, current=_("Default")): self.ProfileComboBox.handler_block (self.ProfileHandler) self.Context.Read () self.Context.UpdateProfiles () self.ProfileComboBox.get_model ().clear () set = False for index, profile in enumerate ([_("Default")] + list (self.Context.Profiles)): self.ProfileComboBox.append_text (profile) if profile == current and not set: self.ProfileComboBox.set_active (index) set = True self.ProfileRemoveButton.set_sensitive (self.ProfileComboBox.get_active() != 0) self.ProfileComboBox.handler_unblock (self.ProfileHandler) GlobalUpdater.UpdatePlugins() def IntegrationChanged(self, widget): value = widget.get_active() self.Context.Integration = value def ProfileChanged(self, widget): name = widget.get_active_text() if name == _("Default"): self.Context.ResetProfile() elif name in self.Context.Profiles: self.Context.CurrentProfile = self.Context.Profiles[name] else: self.ProfileComboBox.set_active (0) return self.ProfileRemoveButton.set_sensitive (self.ProfileComboBox.get_active() != 0) self.Context.Read() self.Context.Write() GlobalUpdater.UpdatePlugins() return False def ProfileChangedAddTimeout(self, widget): gobject.timeout_add (500, self.ProfileChanged, widget) def CreateFilter(self, chooser): filter = gtk.FileFilter() filter.add_pattern("*.profile") filter.set_name(_("Profiles (*.profile)")) chooser.add_filter(filter) filter = gtk.FileFilter() filter.add_pattern("*") filter.set_name(_("All files")) chooser.add_filter(filter) def ResetProfile(self, widget): for plugin in self.Context.Plugins.values(): settings = GetSettings(plugin) for setting in settings: setting.Reset() activePlugins = self.Context.Plugins['core'].Screen['active_plugins'].Value for plugin in self.Context.Plugins.values(): plugin.Enabled = plugin.Name in activePlugins self.Context.Write() GlobalUpdater.UpdatePlugins() def ExportProfile(self, widget): main = widget.get_toplevel() b = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK) chooser = gtk.FileChooserDialog(title=_("Save file.."), parent=main, buttons=b, action=gtk.FILE_CHOOSER_ACTION_SAVE) chooser.set_current_folder(os.environ.get("HOME")) self.CreateFilter(chooser) ret = chooser.run() path = chooser.get_filename() chooser.destroy() if ret == gtk.RESPONSE_OK: dlg = gtk.MessageDialog(type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_YES_NO) dlg.set_markup(_("Do you want to skip default option values while exporting your profile?")) ret = dlg.run() dlg.destroy() if not path.endswith(".profile"): path = "%s.profile" % path self.Context.Export(path, ret == gtk.RESPONSE_YES) def ImportProfileDialog (self, main): b = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK) chooser = gtk.FileChooserDialog (title = _("Open file.."), parent = main, buttons = b) chooser.set_current_folder (os.environ.get ("HOME")) self.CreateFilter (chooser) ret = chooser.run () path = chooser.get_filename () chooser.destroy () if ret == gtk.RESPONSE_OK: return path return None def ProfileNameDialog (self, main): dlg = gtk.Dialog (_("Enter a profile name"), main, gtk.DIALOG_MODAL) dlg.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button (gtk.STOCK_ADD, gtk.RESPONSE_OK) entry = gtk.Entry () label = gtk.Label (_("Please enter a name for the new profile:")) dlg.vbox.pack_start (label, False, False, 5) dlg.vbox.pack_start (entry, False, False, 5) dlg.set_size_request (340, 120) dlg.show_all () ret = dlg.run () text = entry.get_text () dlg.destroy() if ret == gtk.RESPONSE_OK: return text return None def ImportProfile (self, widget): main = widget.get_toplevel () path = self.ImportProfileDialog (main) if path: self.Context.Import (path) GlobalUpdater.UpdatePlugins() def ImportProfileAs (self, widget): main = widget.get_toplevel () path = self.ImportProfileDialog (main) if not path: return name = self.ProfileNameDialog (main) if not name: return self.Context.CurrentProfile = ccs.Profile (self.Context, name) self.UpdateProfiles (name) self.Context.Import (path) def AddProfile (self, widget): main = widget.get_toplevel () name = self.ProfileNameDialog (main) if name: self.Context.CurrentProfile = ccs.Profile (self.Context, name) self.UpdateProfiles (name) def RemoveProfile(self, widget): name = self.ProfileComboBox.get_active_text() if name != _("Default"): self.Context.ResetProfile() self.Context.Profiles[name].Delete() self.UpdateProfiles() def BackendChanged(self, widget): shortDesc = widget.get_active_text() name = "" for backend in self.Context.Backends.values(): if backend.ShortDesc == shortDesc: name = backend.Name break if name != "": self.Context.ResetProfile() self.Context.CurrentBackend = self.Context.Backends[name] self.UpdateProfiles() else: raise Exception(_("Backend not found.")) self.ProfileComboBox.set_sensitive(self.Context.CurrentBackend.ProfileSupport) self.IntegrationButton.set_sensitive(self.Context.CurrentBackend.IntegrationSupport) GlobalUpdater.UpdatePlugins() return False def BackendChangedAddTimeout(self, widget): gobject.timeout_add (500, self.BackendChanged, widget) # Plugin List Page # class PluginListPage(object): def __init__(self, context): self.Context = context self.Block = 0 rightChild = gtk.VBox() rightChild.set_border_width(10) # Auto sort autoSort = gtk.CheckButton(_("Automatic plugin sorting")) rightChild.pack_start(autoSort, False, False, 10) # Lists listBox = gtk.HBox() listBox.set_spacing(5) self.DisabledPluginsList = ScrolledList(_("Disabled Plugins")) self.EnabledPluginsList = ScrolledList(_("Enabled Plugins")) # Left/Right buttons self.MiddleButtonBox = buttonBox = gtk.VBox() buttonBox.set_spacing(5) boxAlignment = gtk.Alignment(0.0, 0.5, 0.0, 0.0) boxAlignment.add(buttonBox) rightButton = gtk.Button() rightImage = Image(gtk.STOCK_GO_FORWARD, ImageStock, gtk.ICON_SIZE_BUTTON) rightButton.set_image(rightImage) rightButton.connect("clicked", self.EnablePlugins) leftButton = gtk.Button() leftImage = Image(gtk.STOCK_GO_BACK, ImageStock, gtk.ICON_SIZE_BUTTON) leftButton.set_image(leftImage) leftButton.connect("clicked", self.EnabledPluginsList.delete) buttonBox.pack_start(rightButton, False, False) buttonBox.pack_start(leftButton, False, False) # Up/Down buttons enabledBox = gtk.VBox() enabledBox.set_spacing(10) enabledAlignment = gtk.Alignment(0.5, 0.0, 0.0, 0.0) self.EnabledButtonBox = enabledButtonBox = gtk.HBox() enabledButtonBox.set_spacing(5) enabledAlignment.add(enabledButtonBox) upButton = gtk.Button(gtk.STOCK_GO_UP) downButton = gtk.Button(gtk.STOCK_GO_DOWN) upButton.set_use_stock(True) downButton.set_use_stock(True) upButton.connect('clicked', self.EnabledPluginsList.move_up) downButton.connect('clicked', self.EnabledPluginsList.move_down) # Add buttons addButton = gtk.Button(gtk.STOCK_ADD) addButton.set_use_stock(True) addButton.connect('clicked', self.AddPlugin) enabledButtonBox.pack_start(addButton, False, False) enabledButtonBox.pack_start(upButton, False, False) enabledButtonBox.pack_start(downButton, False, False) enabledBox.pack_start(self.EnabledPluginsList, True, True) enabledBox.pack_start(enabledAlignment, False, False) listBox.pack_start(self.DisabledPluginsList, True, True) listBox.pack_start(boxAlignment, True, False) listBox.pack_start(enabledBox, True, True) self.UpdateEnabledPluginsList() self.UpdateDisabledPluginsList() # Connect Store self.EnabledPluginsList.store.connect('row-changed', self.ListChanged) self.EnabledPluginsList.store.connect('row-deleted', self.ListChanged) self.EnabledPluginsList.store.connect('rows-reordered', self.ListChanged) rightChild.pack_start(listBox, True, True) # Auto sort autoSort.connect('toggled', self.AutoSortChanged) autoSort.set_active(self.Context.AutoSort) self.Widget = rightChild def AutoSortChanged(self, widget): if self.Block > 0: return autoSort = widget.get_active() if not autoSort: dlg = gtk.MessageDialog(type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_YES_NO) dlg.set_markup(_("Do you really want to disable automatic plugin sorting? This will also disable conflict handling. You should only do this if you know what you are doing.")) response = dlg.run() dlg.destroy() if response == gtk.RESPONSE_NO: self.Block += 1 widget.set_active(True) self.Block -= 1 return self.Context.AutoSort = autoSort for widget in (self.EnabledPluginsList.view, self.DisabledPluginsList.view, self.MiddleButtonBox, self.EnabledButtonBox): widget.set_sensitive(not self.Context.AutoSort) GlobalUpdater.UpdatePlugins() def UpdateEnabledPluginsList(self): activePlugins = self.Context.Plugins['core'].Screen['active_plugins'].Value self.EnabledPluginsList.clear() for name in activePlugins: self.EnabledPluginsList.append(name) def UpdateDisabledPluginsList(self): activePlugins = self.Context.Plugins['core'].Screen['active_plugins'].Value self.DisabledPluginsList.clear() for plugin in sorted(self.Context.Plugins.values(), key=PluginKeyFunc): if not plugin.Name in activePlugins and plugin.Name != "core": self.DisabledPluginsList.append(plugin.Name) def AddPlugin(self, widget): dlg = gtk.Dialog(_("Add plugin")) dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default() dlg.set_default_response(gtk.RESPONSE_OK) label = gtk.Label(_("Plugin name:")) label.set_tooltip_text(_("Insert plugin name")) dlg.vbox.pack_start(label) entry = gtk.Entry() entry.props.activates_default = True dlg.vbox.pack_start(entry) dlg.vbox.set_spacing(5) dlg.vbox.show_all() ret = dlg.run() dlg.destroy() if ret == gtk.RESPONSE_OK: self.EnabledPluginsList.append(entry.get_text()) def EnablePlugins(self, widget): selectedRows = self.DisabledPluginsList.select.get_selected_rows()[1] for path in selectedRows: iter = self.DisabledPluginsList.store.get_iter(path) name = self.DisabledPluginsList.store.get(iter, 0)[0] self.EnabledPluginsList.append(name) self.DisabledPluginsList.delete(widget) def ListChanged(self, *args, **kwargs): if self.Block > 0: return self.Block += 1 plugins = self.EnabledPluginsList.get_list() self.Context.Plugins['core'].Screen['active_plugins'].Value = plugins self.Context.Write() self.UpdateDisabledPluginsList() self.Block -= 1 # Preferences Page # class PreferencesPage(GenericPage): def __init__(self, context): GenericPage.__init__(self) self.Context = context self.LeftWidget = gtk.VBox(False, 10) self.LeftWidget.set_border_width(10) self.RightWidget = gtk.Notebook() # Left Pane self.DescLabel = Label() self.DescLabel.set_markup(HeaderMarkup % (_("Preferences"))) self.DescLabel.connect("style-set", self.HeaderStyleSet) self.DescImg = Image("profiles",ImageCategory, 64) self.LeftWidget.pack_start(self.DescImg, False, False) self.LeftWidget.pack_start(self.DescLabel, False, False) self.InfoLabelCont = gtk.HBox() self.InfoLabelCont.set_border_width(10) self.LeftWidget.pack_start(self.InfoLabelCont, False, False) self.InfoLabel = Label(_("Configure the backend, profile and other internal settings used by the Compiz Configuration System."), 180) self.InfoLabelCont.pack_start(self.InfoLabel, True, True) # About Button aboutLabel = Label() aboutLabel.set_markup(HeaderMarkup % (_("About"))) aboutLabel.connect("style-set", self.HeaderStyleSet) aboutButton = gtk.Button() aboutButton.set_relief(gtk.RELIEF_NONE) aboutImage = Image(gtk.STOCK_ABOUT, ImageStock, gtk.ICON_SIZE_BUTTON) aboutFrame = gtk.HBox() aboutFrame.set_spacing(5) aboutFrame.pack_start(aboutImage, False, False) aboutFrame.pack_start(Label(_("About CCSM...")), False, False) aboutButton.add(aboutFrame) aboutButton.set_tooltip_text(_("About")) aboutButton.connect('clicked', self.ShowAboutDialog) aboutBin = gtk.HBox() aboutBin.set_border_width(10) aboutBin.pack_start(aboutButton, False, False) self.LeftWidget.pack_start(aboutLabel, False, False) self.LeftWidget.pack_start(aboutBin, False, False) # Back Button backButton = gtk.Button(gtk.STOCK_GO_BACK) backButton.set_use_stock(True) backButton.connect('clicked', self.GoBack) self.LeftWidget.pack_end(backButton, False, False) # Profile & Backend Page self.ProfileBackendPage = ProfileBackendPage(context) self.RightWidget.append_page(self.ProfileBackendPage.Widget, gtk.Label(_("Profile & Backend"))) # Plugin List self.PluginListPage = PluginListPage(context) self.RightWidget.append_page(self.PluginListPage.Widget, gtk.Label(_("Plugin List"))) StyleBlock = 0 def HeaderStyleSet(self, widget, previous): if self.StyleBlock > 0: return self.StyleBlock += 1 for state in (gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE): widget.modify_fg(state, widget.style.bg[gtk.STATE_SELECTED]) self.StyleBlock -= 1 def ShowAboutDialog(self, widget): about = AboutDialog(widget.get_toplevel()) about.show_all() about.run() about.destroy() # Main Page # class MainPage(object): def __init__(self, main, context): self.Context = context self.Main = main sidebar = gtk.VBox(False, 10) sidebar.set_border_width(10) pluginWindow = PluginWindow(self.Context) pluginWindow.connect('show-plugin', self.ShowPlugin) # Filter filterLabel = Label() filterLabel.set_markup(HeaderMarkup % (_("Filter"))) filterLabel.connect("style-set", self.HeaderStyleSet) filterLabel.props.xalign = 0.1 filterEntry = ClearEntry() filterEntry.set_tooltip_text(_("Filter your Plugin list")) filterEntry.connect("changed", self.FilterChanged) self.filterEntry = filterEntry # Screens if len(getScreens()) > 1: screenBox = gtk.combo_box_new_text() for screen in getScreens(): screenBox.append_text(_("Screen %i") % screen) name = self.Context.CurrentBackend.Name screenBox.set_active(CurrentScreenNum) screenBox.connect("changed", self.ScreenChanged) screenLabel = Label() screenLabel.set_markup(HeaderMarkup % (_("Screen"))) screenLabel.connect("style-set", self.HeaderStyleSet) sidebar.pack_start(screenLabel, False, False) sidebar.pack_start(screenBox, False, False) # Categories categoryBox = gtk.VBox() categoryBox.set_border_width(5) categories = ['All'] + sorted(pluginWindow.get_categories(), key=CategoryKeyFunc) for category in categories: # name: untranslated name/interal identifier # label: translated name name = category or 'Uncategorized' label = _(name) iconName = name.lower ().replace (" ", "_") categoryToggleIcon = Image (name = iconName, type = ImageCategory, size = 22) categoryToggleLabel = Label (label) align = gtk.Alignment (0, 0.5, 1, 1) align.set_padding (0, 0, 0, 10) align.add (categoryToggleIcon) categoryToggleBox = gtk.HBox () categoryToggleBox.pack_start (align, False, False) categoryToggleBox.pack_start (categoryToggleLabel, True, True) categoryToggle = PrettyButton () categoryToggle.add(categoryToggleBox) categoryToggle.connect("clicked", self.ToggleCategory, category) categoryBox.pack_start(categoryToggle, False, False) categoryLabel = Label() categoryLabel.props.xalign = 0.1 categoryLabel.set_markup(HeaderMarkup % (_("Category"))) categoryLabel.connect("style-set", self.HeaderStyleSet) # Exit Button exitButton = gtk.Button(gtk.STOCK_CLOSE) exitButton.set_use_stock(True) exitButton.connect('clicked', self.Main.Quit) # Advanced Search searchLabel = Label() searchLabel.set_markup(HeaderMarkup % (_("Advanced Search"))) searchLabel.connect("style-set", self.HeaderStyleSet) searchImage = gtk.Image() searchImage.set_from_stock(gtk.STOCK_GO_FORWARD, gtk.ICON_SIZE_BUTTON) searchButton = PrettyButton() searchButton.connect("clicked", self.ShowAdvancedFilter) searchButton.set_relief(gtk.RELIEF_NONE) searchFrame = gtk.HBox() searchFrame.pack_start(searchLabel, False, False) searchFrame.pack_end(searchImage, False, False) searchButton.add(searchFrame) # Preferences prefLabel = Label() prefLabel.set_markup(HeaderMarkup % (_("Preferences"))) prefLabel.connect("style-set", self.HeaderStyleSet) prefImage = gtk.Image() prefImage.set_from_stock(gtk.STOCK_GO_FORWARD, gtk.ICON_SIZE_BUTTON) prefButton = PrettyButton() prefButton.connect("clicked", self.ShowPreferences) prefButton.set_relief(gtk.RELIEF_NONE) prefFrame = gtk.HBox() prefFrame.pack_start(prefLabel, False, False) prefFrame.pack_end(prefImage, False, False) prefButton.add(prefFrame) # Pack widgets into sidebar sidebar.pack_start(filterLabel, False, False) sidebar.pack_start(filterEntry, False, False) sidebar.pack_start(categoryLabel, False, False) sidebar.pack_start(categoryBox, False, False) sidebar.pack_end(exitButton, False, False) sidebar.pack_end(searchButton, False, False) sidebar.pack_end(prefButton, False, False) self.LeftWidget = sidebar self.RightWidget = pluginWindow StyleBlock = 0 def HeaderStyleSet(self, widget, previous): if self.StyleBlock > 0: return self.StyleBlock += 1 for state in (gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE): widget.modify_fg(state, widget.style.bg[gtk.STATE_SELECTED]) self.StyleBlock -= 1 def ShowPlugin(self, widget, plugin): pluginPage = PluginPage(plugin) self.Main.SetPage(pluginPage) def ShowAdvancedFilter(self, widget): filterPage = FilterPage(self.Context) self.Main.SetPage(filterPage) def ShowPreferences(self, widget): preferencesPage = PreferencesPage(self.Context) self.Main.SetPage(preferencesPage) def ToggleCategory(self, widget, category): if category == 'All': category = None else: category = category.lower() self.RightWidget.filter_boxes(category, level=FilterCategory) def FilterChanged(self, widget): text = widget.get_text().lower() self.RightWidget.filter_boxes(text) def ScreenChanged(self, widget): self.Context.Write() self.CurrentScreenNum = widget.get_active() self.Context.Read() # Page # class Page(object): def __init__(self): self.SetContainer = gtk.VBox() self.Widget = gtk.EventBox() self.Widget.add(self.SetContainer) self.Empty = True def Wrap(self): scroll = gtk.ScrolledWindow() scroll.props.hscrollbar_policy = gtk.POLICY_NEVER scroll.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC view = gtk.Viewport() view.set_border_width(5) view.set_shadow_type(gtk.SHADOW_NONE) scroll.add(view) view.add(self.Widget) self.Scroll = scroll # Group Page # class GroupPage(Page): def __init__(self, name, group): Page.__init__(self) self.Name = name self.VisibleAreas = self.subGroupAreas = [] self.Label = gtk.Alignment(xalign=0.0, yalign=0.5) self.Label.set_padding(4, 4, 4, 4) label = gtk.Label("%s" %(protect_pango_markup(name or _('General')))) label.set_use_markup(True) self.Label.add(label) if '' in group: sga = SubGroupArea('', group[''][1]) if not sga.Empty: self.SetContainer.pack_start(sga.Widget, False, False) self.Empty = False self.subGroupAreas.append(sga) sortedSubGroups = sorted(group.items(), key=GroupIndexKeyFunc) for (subGroupName, (subGroupIndex, subGroup)) in sortedSubGroups: if not subGroupName == '': sga = SubGroupArea(subGroupName, subGroup) if not sga.Empty: self.SetContainer.pack_start(sga.Widget, False, False) self.Empty = False self.subGroupAreas.append(sga) self.Visible = not self.Empty def Filter(self, text, level=FilterAll): empty = True self.VisibleAreas = [] for area in self.subGroupAreas: if area.Filter(text, level=level): self.VisibleAreas.append(area) empty = False self.Visible = not empty self.Label.props.no_show_all = empty if empty: self.Label.hide() else: self.Label.show() return not empty compiz-0.9.11+14.04.20140409/compizconfig/ccsm/ccm/Window.py0000644000015301777760000000772612321343002023505 0ustar pbusernogroup00000000000000# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import pygtk import gtk import gtk.gdk from ccm.Pages import * from ccm.Utils import * from ccm.Constants import * from ccm.Conflicts import * import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext class MainWin(gtk.Window): currentCategory = None def __init__(self, Context, pluginPage=None, categoryName=None): gtk.Window.__init__(self) self.ShowingPlugin = None self.Context = Context self.connect("destroy", self.Quit) self.set_default_size(990, 580) self.set_title(_("CompizConfig Settings Manager")) # Build the panes self.MainBox = gtk.HBox() self.add(self.MainBox) self.LeftPane = gtk.VBox() self.RightPane = gtk.VBox() self.RightPane.set_border_width(5) self.MainBox.pack_start(self.LeftPane, False, False) self.MainBox.pack_start(self.RightPane, True, True) self.MainPage = MainPage(self, self.Context) self.CurrentPage = None self.SetPage(self.MainPage) self.LeftPane.set_size_request(self.LeftPane.size_request()[0], -1) self.show_all() if pluginPage in self.Context.Plugins: self.MainPage.ShowPlugin(None, self.Context.Plugins[pluginPage]) if categoryName in self.Context.Categories: self.MainPage.ToggleCategory(None, categoryName) def Quit(self, *args): gtk.main_quit() def SetPage(self, page): if page == self.CurrentPage: return if page != self.MainPage: page.connect('go-back', self.BackToMain) if self.CurrentPage: leftWidget = self.CurrentPage.LeftWidget rightWidget = self.CurrentPage.RightWidget leftWidget.hide_all() rightWidget.hide_all() self.LeftPane.remove(leftWidget) self.RightPane.remove(rightWidget) if self.CurrentPage != self.MainPage: leftWidget.destroy() rightWidget.destroy() self.LeftPane.pack_start(page.LeftWidget, True, True) self.RightPane.pack_start(page.RightWidget, True, True) self.CurrentPage = page self.show_all() def BackToMain(self, widget): self.SetPage(self.MainPage) self.MainPage.filterEntry.grab_focus() def RefreshPage(self, updatedPlugin): currentPage = self.CurrentPage if isinstance(currentPage, PluginPage) and currentPage.Plugin: for basePlugin in updatedPlugin.GetExtensionBasePlugins (): # If updatedPlugin is an extension plugin and a base plugin # is currently being displayed, then update its current page if currentPage.Plugin.Name == basePlugin.Name: if currentPage.CheckDialogs(basePlugin, self): currentPage.RefreshPage(basePlugin, self) break gtk.window_set_default_icon_name('ccsm') compiz-0.9.11+14.04.20140409/compizconfig/ccsm/ccm/Conflicts.py0000644000015301777760000004703212321343002024154 0ustar pbusernogroup00000000000000# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import pygtk import gtk from ccm.Constants import * from ccm.Utils import * import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext class Conflict: def __init__(self, autoResolve): self.AutoResolve = autoResolve # buttons = (text, type/icon, response_id) def Ask(self, message, buttons, custom_widgets=None): if self.AutoResolve: return gtk.RESPONSE_YES dialog = gtk.MessageDialog(flags=gtk.DIALOG_MODAL, type=gtk.MESSAGE_WARNING) for text, icon, response in buttons: button = gtk.Button(text) button.set_image(gtk.image_new_from_stock(icon, gtk.ICON_SIZE_BUTTON)) dialog.add_action_widget(button, response) if custom_widgets != None: for widget in custom_widgets: dialog.vbox.pack_start(widget, False, False) dialog.set_markup(message) dialog.show_all() answer = dialog.run() dialog.destroy() return answer class ActionConflict (Conflict): ActionTypes = set(('Bell', 'Button', 'Edge', 'Key')) def __init__ (self, setting, settings, autoResolve): def ExcludeInternal (settings): for setting in settings: if not setting.Info[0]: yield setting Conflict.__init__(self, autoResolve) self.Conflicts = [] self.Name = "" self.Setting = setting if settings is None: settings = [] self.Settings = settings # if the action is internal, include all global actions plus internal # actions from the same plugin. If it is global, include all actions. if not settings: for n in self.Setting.Plugin.Context.Plugins: plugin = self.Setting.Plugin.Context.Plugins[n] if plugin.Enabled: pluginActions = GetSettings(plugin, types=self.ActionTypes) if len(setting.Info) and setting.Info[0] and plugin is not setting.Plugin: settings.extend(ExcludeInternal(pluginActions)) else: settings.extend(pluginActions) def Resolve (self, updater = None): if len (self.Conflicts): for setting in self.Conflicts: answer = self.AskUser (self.Setting, setting) if answer == gtk.RESPONSE_YES: setting.Value = 'Disabled' if updater: updater.UpdateSetting (setting) if answer == gtk.RESPONSE_NO: return False return True def AskUser (self, setting, conflict): msg = _("The new value for the %(binding)s binding for the action %(action)s "\ "in plugin %(plugin)s conflicts with the action %(action_conflict)s of the %(plugin_conflict)s plugin.\n"\ "Do you wish to disable %(action_conflict)s in the %(plugin_conflict)s plugin?") msg_dict = {'binding': self.Name, 'action': setting.ShortDesc, 'plugin': setting.Plugin.ShortDesc, 'action_conflict': conflict.ShortDesc, 'plugin_conflict': conflict.Plugin.ShortDesc} msg = msg % protect_markup_dict (msg_dict) yesButton = (_("Disable %(action_conflict)s") % msg_dict, gtk.STOCK_YES, gtk.RESPONSE_YES) noButton = (_("Don't set %(action)s") % msg_dict, gtk.STOCK_NO, gtk.RESPONSE_NO) ignoreButton = (_("Set %(action)s anyway") % msg_dict, gtk.STOCK_STOP, gtk.RESPONSE_REJECT) return self.Ask (msg, (ignoreButton, noButton, yesButton)) class KeyConflict(ActionConflict): def __init__(self, setting, newValue, settings=None, autoResolve=False, ignoreOld=False): ActionConflict.__init__(self, setting, settings, autoResolve) self.Name = _("key") if not newValue: return newValue = newValue.lower () oldValue = self.Setting.Value.lower () badValues = ["disabled", "none"] if not ignoreOld: badValues.append (oldValue) if newValue in badValues: return for s in self.Settings: if s is setting: continue if s.Type == 'Key': if s.Value.lower() == newValue: self.Conflicts.append (s) class ButtonConflict(ActionConflict): def __init__(self, setting, newValue, settings=None, autoResolve=False, ignoreOld=False): ActionConflict.__init__(self, setting, settings, autoResolve) self.Name = _("button") if not newValue: return newValue = newValue.lower () oldValue = self.Setting.Value.lower () badValues = ["disabled", "none"] if not ignoreOld: badValues.append (oldValue) if newValue in badValues: return for s in self.Settings: if s is setting: continue if s.Type == 'Button': if s.Value.lower() == newValue: self.Conflicts.append (s) class EdgeConflict(ActionConflict): def __init__(self, setting, newValue, settings=None, autoResolve=False, ignoreOld=False): ActionConflict.__init__(self, setting, settings, autoResolve) self.Name = _("edge") if not newValue: return newEdges = set(newValue.split("|")) if not ignoreOld: oldEdges = set(self.Setting.Value.split("|")) diff = newEdges - oldEdges if diff: newEdges = diff # no need to check edges that were already set else: return for s in self.Settings: if s is setting: continue elif s.Type == 'Edge': settingEdges = set(s.Value.split("|")) union = newEdges & settingEdges if union: for edge in union: self.Conflicts.append ((s, edge)) break def Resolve (self, updater = None): if len (self.Conflicts): for setting, edge in self.Conflicts: answer = self.AskUser (self.Setting, setting) if answer == gtk.RESPONSE_YES: value = setting.Value.split ("|") value.remove (edge) setting.Value = "|".join (value) if updater: updater.UpdateSetting (setting) if answer == gtk.RESPONSE_NO: return False return True # Not used for plugin dependencies (which are handled by ccs) but own feature checking e.g. image support class FeatureRequirement(Conflict): def __init__(self, context, feature, autoResolve=False): Conflict.__init__(self, autoResolve) self.Requirements = [] self.Context = context self.Feature = feature self.Found = False for plugin in context.Plugins.values(): if feature in plugin.Features: self.Found = True if not plugin.Enabled: self.Requirements.append(plugin) def Resolve(self): if len(self.Requirements) == 0 and self.Found: return True elif not self.Found: answer = self.ErrorAskUser() if answer == gtk.RESPONSE_YES: return True else: return False for plugin in self.Requirements: answer = self.AskUser(plugin) if answer == gtk.RESPONSE_YES: plugin.Enabled = True self.Context.Write() return True def ErrorAskUser(self): msg = _("You are trying to use the feature %(feature)s which is not provided by any plugin.\n"\ "Do you wish to use this feature anyway?") msg_dict = {'feature': self.Feature} msg = msg % protect_markup_dict (msg_dict) yesButton = (_("Use %(feature)s") % msg_dict, gtk.STOCK_YES, gtk.RESPONSE_YES) noButton = (_("Don't use %(feature)s") % msg_dict, gtk.STOCK_NO, gtk.RESPONSE_NO) answer = self.Ask(msg, (noButton, yesButton)) return answer def AskUser(self, plugin): msg = _("You are trying to use the feature %(feature)s which is provided by %(plugin)s.\n"\ "This plugin is currently disabled.\n"\ "Do you wish to enable %(plugin)s so the feature is available?") msg_dict = {'feature': self.Feature, 'plugin': plugin.ShortDesc} msg = msg % protect_markup_dict (msg_dict) yesButton = (_("Enable %(plugin)s") % msg_dict, gtk.STOCK_YES, gtk.RESPONSE_YES) noButton = (_("Don't enable %(feature)s") % msg_dict, gtk.STOCK_NO, gtk.RESPONSE_NO) answer = self.Ask(msg, (noButton, yesButton)) return answer class PluginConflict(Conflict): def __init__(self, plugin, conflicts, autoResolve=False): Conflict.__init__(self, autoResolve) self.Conflicts = conflicts self.Plugin = plugin def Resolve(self): for conflict in self.Conflicts: if conflict[0] == 'ConflictFeature': answer = self.AskUser(self.Plugin, conflict) if answer == gtk.RESPONSE_YES: disableConflicts = conflict[2][0].DisableConflicts con = PluginConflict(conflict[2][0], disableConflicts, self.AutoResolve) if con.Resolve(): conflict[2][0].Enabled = False else: return False else: return False elif conflict[0] == 'ConflictPlugin': answer = self.AskUser(self.Plugin, conflict) if answer == gtk.RESPONSE_YES: disableConflicts = conflict[2][0].DisableConflicts con = PluginConflict(conflict[2][0], disableConflicts, self.AutoResolve) if con.Resolve(): conflict[2][0].Enabled = False else: return False else: return False elif conflict[0] == 'RequiresFeature': answer, choice = self.AskUser(self.Plugin, conflict) if answer == gtk.RESPONSE_YES: for plg in conflict[2]: if plg.ShortDesc == choice: enableConflicts = plg.EnableConflicts con = PluginConflict(plg, enableConflicts, self.AutoResolve) if con.Resolve(): plg.Enabled = True else: return False break else: return False elif conflict[0] == 'RequiresPlugin': answer = self.AskUser(self.Plugin, conflict) if answer == gtk.RESPONSE_YES: enableConflicts = conflict[2][0].EnableConflicts con = PluginConflict(conflict[2][0], enableConflicts, self.AutoResolve) if con.Resolve(): conflict[2][0].Enabled = True else: return False else: return False elif conflict[0] == 'FeatureNeeded': answer = self.AskUser(self.Plugin, conflict) if answer == gtk.RESPONSE_YES: for plg in conflict[2]: disableConflicts = plg.DisableConflicts con = PluginConflict(plg, disableConflicts, self.AutoResolve) if con.Resolve(): plg.Enabled = False else: return False else: return False elif conflict[0] == 'PluginNeeded': answer = self.AskUser(self.Plugin, conflict) if answer == gtk.RESPONSE_YES: for plg in conflict[2]: disableConflicts = plg.DisableConflicts con = PluginConflict(plg, disableConflicts, self.AutoResolve) if con.Resolve(): plg.Enabled = False else: return False else: return False # Only when enabling a plugin types = [] actionConflicts = [] if not self.Plugin.Enabled and not self.AutoResolve: for setting in GetSettings(self.Plugin): conflict = None if setting.Type == 'Key': conflict = KeyConflict(setting, setting.Value, ignoreOld=True) elif setting.Type == 'Button': conflict = ButtonConflict(setting, setting.Value, ignoreOld=True) elif setting.Type == 'Edge': conflict = EdgeConflict(setting, setting.Value, ignoreOld=True) # Conflicts were found if conflict and conflict.Conflicts: name = conflict.Name if name not in types: types.append(name) actionConflicts.append(conflict) if actionConflicts: answer = self.AskUser(self.Plugin, ('ConflictAction', types)) if answer == gtk.RESPONSE_YES: for conflict in actionConflicts: conflict.Resolve() return True def AskUser(self, plugin, conflict): msg = "" okMsg = "" cancelMsg = "" widgets = [] # CCSM custom conflict if conflict[0] == 'ConflictAction': msg = _("Some %(bindings)s bindings of Plugin %(plugin)s " \ "conflict with other plugins. Do you want to resolve " \ "these conflicts?") types = conflict[1] bindings = ", ".join(types[:-1]) if len(types) > 1: bindings = "%s and %s" % (bindings, types[-1]) msg_dict = {'plugin': plugin.ShortDesc, 'bindings': bindings} msg = msg % protect_markup_dict (msg_dict) okMsg = _("Resolve conflicts") % msg_dict cancelMsg = _("Ignore conflicts") % msg_dict elif conflict[0] == 'ConflictFeature': msg = _("Plugin %(plugin_conflict)s provides feature " \ "%(feature)s which is also provided by " \ "%(plugin)s") msg_dict = {'plugin_conflict': conflict[2][0].ShortDesc, 'feature': conflict[1], 'plugin': plugin.ShortDesc} msg = msg % protect_markup_dict (msg_dict) okMsg = _("Disable %(plugin_conflict)s") % msg_dict cancelMsg = _("Don't enable %(plugin)s") % msg_dict elif conflict[0] == 'ConflictPlugin': msg = _("Plugin %(plugin_conflict)s conflicts with " \ "%(plugin)s.") msg_dict = {'plugin_conflict': conflict[2][0].ShortDesc, 'plugin': plugin.ShortDesc} msg = msg % protect_markup_dict (msg_dict) okMsg = _("Disable %(plugin_conflict)s") % msg_dict cancelMsg = _("Don't enable %(plugin)s") % msg_dict elif conflict[0] == 'RequiresFeature': pluginList = ', '.join("\"%s\"" % plugin.ShortDesc for plugin in conflict[2]) msg = _("%(plugin)s requires feature %(feature)s " \ "which is provided by the following " \ "plugins:\n%(plugin_list)s") msg_dict = {'plugin': plugin.ShortDesc, 'feature': conflict[1], 'plugin_list': pluginList} msg = msg % protect_markup_dict (msg_dict) cmb = gtk.combo_box_new_text() for plugin in conflict[2]: cmb.append_text(plugin.ShortDesc) cmb.set_active(0) widgets.append(cmb) okMsg = _("Enable these plugins") cancelMsg = _("Don't enable %(plugin)s") % msg_dict elif conflict[0] == 'RequiresPlugin': msg = _("%(plugin)s requires the plugin %(require)s.") msg_dict = {'plugin': plugin.ShortDesc, 'require': conflict[2][0].ShortDesc} msg = msg % protect_markup_dict (msg_dict) okMsg = _("Enable %(require)s") % msg_dict cancelMsg = _("Don't enable %(plugin)s") % msg_dict elif conflict[0] == 'FeatureNeeded': pluginList = ', '.join("\"%s\"" % plugin.ShortDesc for plugin in conflict[2]) msg = _("%(plugin)s provides the feature " \ "%(feature)s which is required by the plugins " \ "%(plugin_list)s.") msg_dict = {'plugin': plugin.ShortDesc, 'feature': conflict[1], 'plugin_list': pluginList} msg = msg % protect_markup_dict (msg_dict) okMsg = _("Disable these plugins") cancelMsg = _("Don't disable %(plugin)s") % msg_dict elif conflict[0] == 'PluginNeeded': pluginList = ', '.join("\"%s\"" % plugin.ShortDesc for plugin in conflict[2]) msg = _("%(plugin)s is required by the plugins " \ "%(plugin_list)s.") msg_dict = {'plugin': plugin.ShortDesc, 'plugin_list': pluginList} msg = msg % protect_markup_dict (msg_dict) okMsg = _("Disable these plugins") cancelMsg = _("Don't disable %(plugin)s") % msg_dict okButton = (okMsg, gtk.STOCK_OK, gtk.RESPONSE_YES) cancelButton = (cancelMsg, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) answer = self.Ask(msg, (cancelButton, okButton), widgets) if conflict[0] == 'RequiresFeature': choice = widgets[0].get_active_text() return answer, choice return answer e compiz-0.9.11+14.04.20140409/compizconfig/ccsm/ccm/Constants.py.in0000644000015301777760000000502312321343002024603 0ustar pbusernogroup00000000000000# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import pygtk import gtk import gtk.gdk # Current Screen # CurrentScreenNum = gtk.gdk.display_get_default().get_default_screen().get_number() # Settings Table # TableDef = gtk.FILL | gtk.EXPAND TableX = 4 TableY = 2 # Action Constants # KeyModifier = ["Shift", "Control", "Mod1", "Mod2", "Mod3", "Mod4", "Mod5", "Alt", "Meta", "Super", "Hyper", "ModeSwitch"] Edges = ["Left", "Right", "Top", "Bottom", "TopLeft", "TopRight", "BottomLeft", "BottomRight"] # Label Styles # HeaderMarkup = "%s" # Image Types # ImageNone = 0 ImagePlugin = 1 ImageCategory = 2 ImageThemed = 3 ImageStock = 4 # Filter Levels # FilterName = 1 << 0 FilterLongDesc = 1 << 1 FilterValue = 1 << 2 # Settings Only FilterCategory = 1 << 3 # Plugins Only FilterAll = FilterName | FilterLongDesc | FilterValue | FilterCategory # Paths # DataDir = "@prefix@/share" IconDir = DataDir+"/ccsm/icons" PixmapDir = DataDir+"/ccsm/images" # Version # Version = "@version@" # Translation # import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext # Category Transaltion Table # Just to get them into gettext # CategoryTranslation = { "General": _("General"), "Accessibility": _("Accessibility"), "Desktop": _("Desktop"), "Extras": _("Extras"), "Window Management": _("Window Management"), "Effects": _("Effects"), "Image Loading": _("Image Loading"), "Utility": _("Utility"), "All": _("All"), "Uncategorized": _("Uncategorized") } compiz-0.9.11+14.04.20140409/compizconfig/ccsm/MANIFEST.in0000644000015301777760000000030412321343002022641 0ustar pbusernogroup00000000000000include po/* include TODO README INSTALL AUTHORS COPYING LICENSE NEWS VERSION ChangeLog include ccsm.desktop.in include ccm/Constants.py.in include Makefile MANIFEST.in recursive-include images * compiz-0.9.11+14.04.20140409/compizconfig/mocks/0000755000015301777760000000000012321344021021277 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/0000755000015301777760000000000012321344021024455 5ustar pbusernogroup00000000000000compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_setting_mock.cpp0000644000015301777760000000576412321343002033260 0ustar pbusernogroup00000000000000#include #include #include #include "compizconfig_ccs_setting_mock.h" using ::testing::NiceMock; CCSSettingInterface CCSSettingGMockInterface = { CCSSettingGMock::ccsSettingGetName, CCSSettingGMock::ccsSettingGetShortDesc, CCSSettingGMock::ccsSettingGetLongDesc, CCSSettingGMock::ccsSettingGetType, CCSSettingGMock::ccsSettingGetInfo, CCSSettingGMock::ccsSettingGetGroup, CCSSettingGMock::ccsSettingGetSubGroup, CCSSettingGMock::ccsSettingGetHints, CCSSettingGMock::ccsSettingGetDefaultValue, CCSSettingGMock::ccsSettingGetValue, CCSSettingGMock::ccsSettingGetIsDefault, CCSSettingGMock::ccsSettingGetParent, CCSSettingGMock::ccsSettingGetPrivatePtr, CCSSettingGMock::ccsSettingSetPrivatePtr, CCSSettingGMock::ccsSetInt, CCSSettingGMock::ccsSetFloat, CCSSettingGMock::ccsSetBool, CCSSettingGMock::ccsSetString, CCSSettingGMock::ccsSetColor, CCSSettingGMock::ccsSetMatch, CCSSettingGMock::ccsSetKey, CCSSettingGMock::ccsSetButton, CCSSettingGMock::ccsSetEdge, CCSSettingGMock::ccsSetBell, CCSSettingGMock::ccsSetList, CCSSettingGMock::ccsSetValue, CCSSettingGMock::ccsGetInt, CCSSettingGMock::ccsGetFloat, CCSSettingGMock::ccsGetBool, CCSSettingGMock::ccsGetString, CCSSettingGMock::ccsGetColor, CCSSettingGMock::ccsGetMatch, CCSSettingGMock::ccsGetKey, CCSSettingGMock::ccsGetButton, CCSSettingGMock::ccsGetEdge, CCSSettingGMock::ccsGetBell, CCSSettingGMock::ccsGetList, CCSSettingGMock::ccsResetToDefault, CCSSettingGMock::ccsSettingIsIntegrated, CCSSettingGMock::ccsSettingIsReadOnly, CCSSettingGMock::ccsSettingIsReadableByBackend, CCSSettingGMock::ccsSettingFree }; static CCSSetting * allocateSettingObjectWithMockInterface () { CCSSetting *setting = (CCSSetting *) calloc (1, sizeof (CCSSetting)); if (!setting) return NULL; ccsObjectInit (setting, &ccsDefaultObjectAllocator); ccsObjectAddInterface (setting, (CCSInterface *) &CCSSettingGMockInterface, GET_INTERFACE_TYPE (CCSSettingInterface)); ccsSettingRef (setting); return setting; } CCSSetting * ccsMockSettingNew () { CCSSetting *setting = allocateSettingObjectWithMockInterface (); if (!setting) return NULL; CCSSettingGMock *mock = new CCSSettingGMock (setting); ccsObjectSetPrivate (setting, (CCSPrivate *) mock); return setting; } CCSSetting * ccsNiceMockSettingNew () { CCSSetting *setting = allocateSettingObjectWithMockInterface (); if (!setting) return NULL; NiceMock *mock = new NiceMock (setting); ccsObjectSetPrivate (setting, (CCSPrivate *) mock); return setting; } void ccsFreeMockSetting (CCSSetting *setting) { /* Need to delete the mock correctly */ CCSSettingGMock *mock = (CCSSettingGMock *) ccsObjectGetPrivate (setting); delete mock; ccsObjectSetPrivate (setting, NULL); ccsObjectFinalize (setting); free (setting); } ././@LongLink0000000000000000000000000000016500000000000011217 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_storage_mock.cppcompiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_0000644000015301777760000000524412321343002034024 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_integrated_setting_storage_mock.h" const CCSIntegratedSettingsStorageInterface mockIntegratedSettingsStorageInterface = { CCSIntegratedSettingsStorageGMock::ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate, CCSIntegratedSettingsStorageGMock::ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName, CCSIntegratedSettingsStorageGMock::ccsIntegratedSettingsStorageAddSetting, CCSIntegratedSettingsStorageGMock::ccsIntegratedSettingsStorageEmpty, CCSIntegratedSettingsStorageGMock::ccsIntegratedSettingsStorageFree }; CCSIntegratedSettingsStorage * ccsMockIntegratedSettingsStorageNew (CCSObjectAllocationInterface *ai) { CCSIntegratedSettingsStorage *storage = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingsStorage))); if (!storage) return NULL; CCSIntegratedSettingsStorageGMock *gmockBackend = new CCSIntegratedSettingsStorageGMock (storage); ccsObjectInit (storage, ai); ccsObjectSetPrivate (storage, (CCSPrivate *) gmockBackend); ccsObjectAddInterface (storage, reinterpret_cast (&mockIntegratedSettingsStorageInterface), GET_INTERFACE_TYPE (CCSIntegratedSettingsStorageInterface)); ccsObjectRef (storage); return storage; } void ccsMockIntegratedSettingsStorageFree (CCSIntegratedSettingsStorage *storage) { CCSIntegratedSettingsStorageGMock *gmockStorage = GET_PRIVATE (CCSIntegratedSettingsStorageGMock, storage); delete gmockStorage; ccsObjectSetPrivate (storage, NULL); ccsObjectFinalize (storage); (*storage->object.object_allocation->free_) (storage->object.object_allocation->allocator, storage); } ././@LongLink0000000000000000000000000000014700000000000011217 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_backend_loader_mock.hcompiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_backend_loader_mock0000644000015301777760000000454012321343002033726 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef COMPIZCONFIG_CCS_BACKEND_LOADER_MOCK_H #define COMPIZCONFIG_CCS_BACKEND_LOADER_MOCK_H #include #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSBackend CCSBackend; typedef struct _CCSInterfaceTable CCSInterfaceTable; typedef struct _CCSBackendLoader CCSBackendLoader; typedef struct _CCSObjectAllocationInterface CCSObjectAllocationInterface; CCSBackendLoader * ccsMockBackendLoaderNew (CCSObjectAllocationInterface *ai); void ccsFreeMockBackendLoader (CCSBackendLoader *); typedef void (*ConfigChangeCallbackProc) (unsigned int watchId, void *closure); COMPIZCONFIG_END_DECLS class CCSBackendLoaderGMockInterface { public: virtual ~CCSBackendLoaderGMockInterface () {} virtual CCSBackend * loadBackend (const CCSInterfaceTable *, CCSContext *, const char *) = 0; }; class CCSBackendLoaderGMock : public CCSBackendLoaderGMockInterface { public: MOCK_METHOD3 (loadBackend, CCSBackend * (const CCSInterfaceTable *, CCSContext *, const char *)); public: static CCSBackend * ccsBackendLoaderLoadBackend (CCSBackendLoader *loader, const CCSInterfaceTable *interfaces, CCSContext *context, const char *name) { return reinterpret_cast (ccsObjectGetPrivate (loader))->loadBackend (interfaces, context, name); } static void ccsFreeBackendLoader (CCSBackendLoader *config) { ccsFreeMockBackendLoader (config); } }; #endif compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_context_mock.cpp0000644000015301777760000000456412321343002033264 0ustar pbusernogroup00000000000000#include #include #include #include "compizconfig_ccs_context_mock.h" CCSContextInterface CCSContextGMockInterface = { CCSContextGMock::ccsContextGetPlugins, CCSContextGMock::ccsContextGetCategories, CCSContextGMock::ccsContextGetChangedSettings, CCSContextGMock::ccsContextGetScreenNum, CCSContextGMock::ccsContextAddChangedSetting, CCSContextGMock::ccsContextClearChangedSettings, CCSContextGMock::ccsContextStealChangedSettings, CCSContextGMock::ccsContextGetPrivatePtr, CCSContextGMock::ccsContextSetPrivatePtr, CCSContextGMock::ccsLoadPlugin, CCSContextGMock::ccsFindPlugin, CCSContextGMock::ccsPluginIsActive, CCSContextGMock::ccsGetActivePluginList, CCSContextGMock::ccsGetSortedPluginStringList, CCSContextGMock::ccsSetBackend, CCSContextGMock::ccsGetBackend, CCSContextGMock::ccsSetIntegrationEnabled, CCSContextGMock::ccsSetProfile, CCSContextGMock::ccsSetPluginListAutoSort, CCSContextGMock::ccsGetProfile, CCSContextGMock::ccsGetIntegrationEnabled, CCSContextGMock::ccsGetPluginListAutoSort, CCSContextGMock::ccsProcessEvents, CCSContextGMock::ccsReadSettings, CCSContextGMock::ccsWriteSettings, CCSContextGMock::ccsWriteChangedSettings, CCSContextGMock::ccsExportToFile, CCSContextGMock::ccsImportFromFile, CCSContextGMock::ccsCanEnablePlugin, CCSContextGMock::ccsCanDisablePlugin, CCSContextGMock::ccsGetExistingProfiles, CCSContextGMock::ccsDeleteProfile, CCSContextGMock::ccsCheckForSettingsUpgrade, CCSContextGMock::ccsLoadPlugins, CCSContextGMock::ccsFreeContext }; CCSContext * ccsMockContextNew () { CCSContext *context = (CCSContext *) calloc (1, sizeof (CCSContext)); if (!context) return NULL; ccsObjectInit (context, &ccsDefaultObjectAllocator); CCSContextGMock *mock = new CCSContextGMock (context); ccsObjectSetPrivate (context, (CCSPrivate *) mock); ccsObjectAddInterface (context, (CCSInterface *) &CCSContextGMockInterface, GET_INTERFACE_TYPE (CCSContextInterface)); return context; } void ccsFreeMockContext (CCSContext *context) { /* Need to delete the mock correctly */ CCSContextGMock *mock = (CCSContextGMock *) ccsObjectGetPrivate (context); delete mock; ccsObjectSetPrivate (context, NULL); ccsObjectFinalize (context); free (context); } compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_setting_stub.cpp0000644000015301777760000003002112321343002033264 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2013 Sam Spilsbury . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_setting_stub.h" typedef struct _Private { Bool integrated; Bool readOnly; const char *name; const char *shortDesc; const char *longDesc; const char *hints; const char *group; const char *subGroup; CCSSettingType type; CCSPlugin *parent; CCSSettingValue *value; CCSSettingValue *defaultValue; CCSSettingInfo info; } Private; static Bool ccsStubSettingGetInt (CCSSetting *setting, int *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asInt; return TRUE; } static Bool ccsStubSettingGetFloat (CCSSetting *setting, float *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asFloat; return TRUE; } static Bool ccsStubSettingGetBool (CCSSetting *setting, Bool *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asBool; return TRUE; } static Bool ccsStubSettingGetString (CCSSetting *setting, const char **data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asString; return TRUE; } static Bool ccsStubSettingGetColor (CCSSetting *setting, CCSSettingColorValue *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asColor; return TRUE; } static Bool ccsStubSettingGetMatch (CCSSetting *setting, const char **data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asMatch; return TRUE; } static Bool ccsStubSettingGetKey (CCSSetting *setting, CCSSettingKeyValue *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asKey; return TRUE; } static Bool ccsStubSettingGetButton (CCSSetting *setting, CCSSettingButtonValue *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asButton; return TRUE; } static Bool ccsStubSettingGetEdge (CCSSetting *setting, unsigned int *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asEdge; return TRUE; } static Bool ccsStubSettingGetBell (CCSSetting *setting, Bool *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asBell; return TRUE; } static Bool ccsStubSettingGetList (CCSSetting *setting, CCSSettingValueList *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asList; return TRUE; } static CCSSetStatus ccsStubSettingSetInt (CCSSetting *setting, int data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asInt = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetFloat (CCSSetting *setting, float data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asFloat = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetBool (CCSSetting *setting, Bool data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asBool = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetString (CCSSetting *setting, const char *data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asString = (char *) data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetColor (CCSSetting *setting, CCSSettingColorValue data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asColor = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetMatch (CCSSetting *setting, const char *data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asMatch = (char *) data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetKey (CCSSetting *setting, CCSSettingKeyValue data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asKey = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetButton (CCSSetting *setting, CCSSettingButtonValue data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asButton = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetEdge (CCSSetting *setting, unsigned int data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asEdge = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetBell (CCSSetting *setting, Bool data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asBell = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetList (CCSSetting *setting, CCSSettingValueList data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asList = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetValue (CCSSetting *setting, CCSSettingValue *data, Bool processChanged) { Private *priv = (Private *) ccsObjectGetPrivate (setting); ccsCopyValueInto (data, priv->value, priv->type, &priv->info); return SetToNewValue; } static void ccsStubSettingResetToDefault (CCSSetting * setting, Bool processChanged) { } static Bool ccsStubSettingIsIntegrated (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->integrated; } static Bool ccsStubSettingReadOnly (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->readOnly; } static const char * ccsStubSettingGetName (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->name; } static const char * ccsStubSettingGetShortDesc (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->shortDesc; } static const char * ccsStubSettingGetLongDesc (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->longDesc; } static CCSSettingType ccsStubSettingGetType (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->type; } static CCSSettingInfo * ccsStubSettingGetInfo (CCSSetting *setting) { return &((Private *) ccsObjectGetPrivate (setting))->info; } static const char * ccsStubSettingGetGroup (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->group; } static const char * ccsStubSettingGetSubGroup (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->subGroup; } static const char * ccsStubSettingGetHints (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->hints; } static CCSSettingValue * ccsStubSettingGetDefaultValue (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->defaultValue; } static CCSSettingValue * ccsStubSettingGetValue (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->value; } static Bool ccsStubSettingIsDefault (CCSSetting *setting) { Private *priv = (Private *) ccsObjectGetPrivate (setting); return ccsCheckValueEq (priv->value, priv->type, &priv->info, priv->defaultValue, priv->type, &priv->info); } static CCSPlugin * ccsStubSettingGetParent (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->parent; } static void * ccsStubSettingGetPrivatePtr (CCSSetting *setting) { return NULL; } static void ccsStubSettingSetPrivatePtr (CCSSetting *setting, void *ptr) { } static Bool ccsStubSettingIsReadableByBackend (CCSSetting *setting) { return TRUE; } static void ccsFreeSettingTypeStub (CCSSetting *setting) { Private *priv = (Private *) ccsObjectGetPrivate (setting); ccsFreeSettingValueWithType (priv->value, priv->type); ccsFreeSettingValueWithType (priv->defaultValue, priv->type); ccsCleanupSettingInfo (&priv->info, priv->type); ccsObjectFinalize (setting); free (setting); } static const CCSSettingInterface ccsStubSettingInterface = { ccsStubSettingGetName, ccsStubSettingGetShortDesc, ccsStubSettingGetLongDesc, ccsStubSettingGetType, ccsStubSettingGetInfo, ccsStubSettingGetGroup, ccsStubSettingGetSubGroup, ccsStubSettingGetHints, ccsStubSettingGetDefaultValue, ccsStubSettingGetValue, ccsStubSettingIsDefault, ccsStubSettingGetParent, ccsStubSettingGetPrivatePtr, ccsStubSettingSetPrivatePtr, ccsStubSettingSetInt, ccsStubSettingSetFloat, ccsStubSettingSetBool, ccsStubSettingSetString, ccsStubSettingSetColor, ccsStubSettingSetMatch, ccsStubSettingSetKey, ccsStubSettingSetButton, ccsStubSettingSetEdge, ccsStubSettingSetBell, ccsStubSettingSetList, ccsStubSettingSetValue, ccsStubSettingGetInt, ccsStubSettingGetFloat, ccsStubSettingGetBool, ccsStubSettingGetString, ccsStubSettingGetColor, ccsStubSettingGetMatch, ccsStubSettingGetKey, ccsStubSettingGetButton, ccsStubSettingGetEdge, ccsStubSettingGetBell, ccsStubSettingGetList, ccsStubSettingResetToDefault, ccsStubSettingIsIntegrated, ccsStubSettingReadOnly, ccsStubSettingIsReadableByBackend, ccsFreeSettingTypeStub }; CCSSetting * ccsSettingTypeStubNew (CCSSettingType type, Bool integrated, Bool readOnly, const char *name, const char *shortDesc, const char *longDesc, const char *hints, const char *group, const char *subGroup, CCSSettingValue *value, CCSSettingValue *defaultValue, CCSSettingInfo *info, CCSObjectAllocationInterface *ai) { Private *priv = (Private *) calloc (1, sizeof (Private)); priv->integrated = integrated; priv->readOnly = readOnly; priv->name = name; priv->shortDesc = shortDesc; priv->longDesc = longDesc; priv->hints = hints; priv->group = group; priv->subGroup = subGroup; priv->type = type; priv->value = (CCSSettingValue *) calloc (1, sizeof (CCSSettingValue)); priv->defaultValue = (CCSSettingValue *) calloc (1, sizeof (CCSSettingValue)); if (value) ccsCopyValueInto (value, priv->value, priv->type, info); if (defaultValue) ccsCopyValueInto (defaultValue, priv->defaultValue, priv->type, info); if (info) ccsCopyInfo (info, &priv->info, priv->type); CCSSetting *setting = (CCSSetting *) calloc (1, sizeof (CCSSetting)); ccsObjectInit (setting, ai); ccsObjectSetPrivate (setting, (CCSPrivate *) priv); ccsObjectAddInterface (setting, (CCSInterface *) &ccsStubSettingInterface, GET_INTERFACE_TYPE (CCSSettingInterface)); ccsSettingRef (setting); return setting; } compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_backend_mock.h0000644000015301777760000001171012321343002032623 0ustar pbusernogroup00000000000000#ifndef _COMPIZCONFIG_CCS_BACKEND_MOCK_H #define _COMPIZCONFIG_CCS_BACKEND_MOCK_H #include #include #include CCSBackend * ccsMockBackendNew (); void ccsFreeMockBackend (CCSBackend *); class CCSBackendGMockInterface { public: virtual ~CCSBackendGMockInterface () {}; virtual const CCSBackendInfo * getInfo () = 0; virtual void executeEvents (unsigned int) = 0; virtual Bool init (CCSContext *context) = 0; virtual Bool fini () = 0; virtual Bool readInit (CCSContext *context) = 0; virtual void readSetting (CCSContext *context, CCSSetting *setting) = 0; virtual void readDone (CCSContext *context) = 0; virtual Bool writeInit (CCSContext *conxtext) = 0; virtual void writeSetting (CCSContext *context, CCSSetting *setting) = 0; virtual void writeDone (CCSContext *context) = 0; virtual void updateSetting (CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) = 0; virtual Bool getSettingIsIntegrated (CCSSetting *setting) = 0; virtual Bool getSettingIsReadOnly (CCSSetting *setting) = 0; virtual CCSStringList getExistingProfiles (CCSContext *context) = 0; virtual Bool deleteProfile (CCSContext *context, char *name) = 0; }; class CCSBackendGMock : public CCSBackendGMockInterface { public: CCSBackendGMock (CCSBackend *b) : mBackend (b) { } CCSBackend * backend () { return mBackend; } /* Mock implementations */ MOCK_METHOD0 (getInfo, const CCSBackendInfo * ()); MOCK_METHOD1 (executeEvents, void (unsigned int)); MOCK_METHOD1 (init, Bool (CCSContext *)); MOCK_METHOD0 (fini, Bool ()); MOCK_METHOD1 (readInit, Bool (CCSContext *)); MOCK_METHOD2 (readSetting, void (CCSContext *, CCSSetting *)); MOCK_METHOD1 (readDone, void (CCSContext *)); MOCK_METHOD1 (writeInit, Bool (CCSContext *)); MOCK_METHOD2 (writeSetting, void (CCSContext *, CCSSetting *)); MOCK_METHOD1 (writeDone, void (CCSContext *)); MOCK_METHOD3 (updateSetting, void (CCSContext *, CCSPlugin *, CCSSetting *)); MOCK_METHOD1 (getSettingIsIntegrated, Bool (CCSSetting *)); MOCK_METHOD1 (getSettingIsReadOnly, Bool (CCSSetting *)); MOCK_METHOD1 (getExistingProfiles, CCSStringList (CCSContext *)); MOCK_METHOD2 (deleteProfile, Bool (CCSContext *, char *name)); private: CCSBackend *mBackend; public: /* Thunking C to C++ */ static const CCSBackendInfo * ccsBackendGetInfo (CCSBackend *backend) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->getInfo (); } static void ccsBackendExecuteEvents (CCSBackend *backend, unsigned int flags) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->executeEvents (flags); } static Bool ccsBackendInit (CCSBackend *backend, CCSContext *context) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->init (context); } static Bool ccsBackendFini (CCSBackend *backend) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->fini (); } static Bool ccsBackendReadInit (CCSBackend *backend, CCSContext *context) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->readInit (context); } static void ccsBackendReadSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->readSetting (context, setting); } static void ccsBackendReadDone (CCSBackend *backend, CCSContext *context) { ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->readDone (context); } static Bool ccsBackendWriteInit (CCSBackend *backend, CCSContext *context) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->writeInit (context); } static void ccsBackendWriteSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->writeSetting (context, setting); } static void ccsBackendWriteDone (CCSBackend *backend, CCSContext *context) { ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->writeDone (context); } static void ccsBackendUpdateSetting (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) { ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->updateSetting (context, plugin, setting); } static Bool ccsBackendGetSettingIsIntegrated (CCSBackend *backend, CCSSetting *setting) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->getSettingIsIntegrated (setting); } static Bool ccsBackendGetSettingIsReadOnly (CCSBackend *backend, CCSSetting *setting) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->getSettingIsReadOnly (setting); } static CCSStringList ccsBackendGetExistingProfiles (CCSBackend *backend, CCSContext *context) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->getExistingProfiles (context); } static Bool ccsBackendDeleteProfile (CCSBackend *backend, CCSContext *context, char *name) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->deleteProfile (context, name); } }; extern CCSBackendInterface CCSBackendGMockInterface; #endif compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_setting_mock.h0000644000015301777760000003136612321343002032722 0ustar pbusernogroup00000000000000#ifndef _COMPIZCONFIG_CCS_SETTING_MOCK #define _COMPIZCONFIG_CCS_SETTING_MOCK #include #include #include using ::testing::_; using ::testing::Return; CCSSetting * ccsMockSettingNew (); CCSSetting * ccsNiceMockSettingNew (); void ccsFreeMockSetting (CCSSetting *); class CCSSettingGMockInterface { public: virtual ~CCSSettingGMockInterface () {}; virtual const char * getName () = 0; virtual const char * getShortDesc () = 0; virtual const char * getLongDesc () = 0; virtual CCSSettingType getType () = 0; virtual CCSSettingInfo * getInfo () = 0; virtual const char * getGroup () = 0; virtual const char * getSubGroup () = 0; virtual const char * getHints () = 0; virtual CCSSettingValue * getDefaultValue () = 0; virtual CCSSettingValue * getValue () = 0; virtual Bool getIsDefault () = 0; virtual CCSPlugin * getParent () = 0; virtual void * getPrivatePtr () = 0; virtual void setPrivatePtr (void *) = 0; virtual CCSSetStatus setInt (int, Bool) = 0; virtual CCSSetStatus setFloat (float, Bool) = 0; virtual CCSSetStatus setBool (Bool, Bool) = 0; virtual CCSSetStatus setString (const char *, Bool) = 0; virtual CCSSetStatus setColor (CCSSettingColorValue, Bool) = 0; virtual CCSSetStatus setMatch (const char *, Bool) = 0; virtual CCSSetStatus setKey (CCSSettingKeyValue, Bool) = 0; virtual CCSSetStatus setButton (CCSSettingButtonValue, Bool) = 0; virtual CCSSetStatus setEdge (unsigned int, Bool) = 0; virtual CCSSetStatus setBell (Bool, Bool) = 0; virtual CCSSetStatus setList (CCSSettingValueList, Bool) = 0; virtual CCSSetStatus setValue (CCSSettingValue *, Bool) = 0; virtual Bool getInt (int *) = 0; virtual Bool getFloat (float *) = 0; virtual Bool getBool (Bool *) = 0; virtual Bool getString (const char **) = 0; virtual Bool getColor (CCSSettingColorValue *) = 0; virtual Bool getMatch (const char **) = 0; virtual Bool getKey (CCSSettingKeyValue *) = 0; virtual Bool getButton (CCSSettingButtonValue *) = 0; virtual Bool getEdge (unsigned int *) = 0; virtual Bool getBell (Bool *) = 0; virtual Bool getList (CCSSettingValueList *) = 0; virtual void resetToDefault (Bool) = 0; virtual Bool isIntegrated () = 0; virtual Bool isReadOnly () = 0; virtual Bool isReadableByBackend () = 0; }; class CCSSettingGMock : public CCSSettingGMockInterface { public: /* Mock implementations */ CCSSettingGMock (CCSSetting *s) : mSetting (s) { /* Teach GMock how to handle it */ ON_CALL (*this, getType ()).WillByDefault (Return (TypeNum)); ON_CALL (*this, setInt (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setFloat (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setBool (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setString (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setMatch (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setColor (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setKey (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setButton (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setEdge (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setList (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setBell (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setValue (_, _)).WillByDefault (Return (SetFailed)); } CCSSetting * setting () { return mSetting; } MOCK_METHOD0 (getName, const char * ()); MOCK_METHOD0 (getShortDesc, const char * ()); MOCK_METHOD0 (getLongDesc, const char * ()); MOCK_METHOD0 (getType, CCSSettingType ()); MOCK_METHOD0 (getInfo, CCSSettingInfo * ()); MOCK_METHOD0 (getGroup, const char * ()); MOCK_METHOD0 (getSubGroup, const char * ()); MOCK_METHOD0 (getHints, const char * ()); MOCK_METHOD0 (getDefaultValue, CCSSettingValue * ()); MOCK_METHOD0 (getValue, CCSSettingValue * ()); MOCK_METHOD0 (getIsDefault, Bool ()); MOCK_METHOD0 (getParent, CCSPlugin * ()); MOCK_METHOD0 (getPrivatePtr, void * ()); MOCK_METHOD1 (setPrivatePtr, void (void *)); MOCK_METHOD2 (setInt, CCSSetStatus (int, Bool)); MOCK_METHOD2 (setFloat, CCSSetStatus (float, Bool)); MOCK_METHOD2 (setBool, CCSSetStatus (Bool, Bool)); MOCK_METHOD2 (setString, CCSSetStatus (const char *, Bool)); MOCK_METHOD2 (setColor, CCSSetStatus (CCSSettingColorValue, Bool)); MOCK_METHOD2 (setMatch, CCSSetStatus (const char *, Bool)); MOCK_METHOD2 (setKey, CCSSetStatus (CCSSettingKeyValue, Bool)); MOCK_METHOD2 (setButton, CCSSetStatus (CCSSettingButtonValue, Bool)); MOCK_METHOD2 (setEdge, CCSSetStatus (unsigned int, Bool)); MOCK_METHOD2 (setBell, CCSSetStatus (Bool, Bool)); MOCK_METHOD2 (setList, CCSSetStatus (CCSSettingValueList, Bool)); MOCK_METHOD2 (setValue, CCSSetStatus (CCSSettingValue *, Bool)); MOCK_METHOD1 (getInt, Bool (int *)); MOCK_METHOD1 (getFloat, Bool (float *)); MOCK_METHOD1 (getBool, Bool (Bool *)); MOCK_METHOD1 (getString, Bool (const char **)); MOCK_METHOD1 (getColor, Bool (CCSSettingColorValue *)); MOCK_METHOD1 (getMatch, Bool (const char **)); MOCK_METHOD1 (getKey, Bool (CCSSettingKeyValue *)); MOCK_METHOD1 (getButton, Bool (CCSSettingButtonValue *)); MOCK_METHOD1 (getEdge, Bool (unsigned int *)); MOCK_METHOD1 (getBell, Bool (Bool *)); MOCK_METHOD1 (getList, Bool (CCSSettingValueList *)); MOCK_METHOD1 (resetToDefault, void (Bool)); MOCK_METHOD0 (isIntegrated, Bool ()); MOCK_METHOD0 (isReadOnly, Bool ()); MOCK_METHOD0 (isReadableByBackend, Bool ()); private: CCSSetting *mSetting; public: static Bool ccsGetInt (CCSSetting *setting, int *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getInt (data); } static Bool ccsGetFloat (CCSSetting *setting, float *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getFloat (data); } static Bool ccsGetBool (CCSSetting *setting, Bool *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getBool (data); } static Bool ccsGetString (CCSSetting *setting, const char **data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getString (data); } static Bool ccsGetColor (CCSSetting *setting, CCSSettingColorValue *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getColor (data); } static Bool ccsGetMatch (CCSSetting *setting, const char **data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getMatch (data); } static Bool ccsGetKey (CCSSetting *setting, CCSSettingKeyValue *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getKey (data); } static Bool ccsGetButton (CCSSetting *setting, CCSSettingButtonValue *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getButton (data); } static Bool ccsGetEdge (CCSSetting *setting, unsigned int *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getEdge (data); } static Bool ccsGetBell (CCSSetting *setting, Bool *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getBell (data); } static Bool ccsGetList (CCSSetting *setting, CCSSettingValueList *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getList (data); } static CCSSetStatus ccsSetInt (CCSSetting *setting, int data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setInt (data, processChanged); } static CCSSetStatus ccsSetFloat (CCSSetting *setting, float data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setFloat (data, processChanged); } static CCSSetStatus ccsSetBool (CCSSetting *setting, Bool data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setBool (data, processChanged); } static CCSSetStatus ccsSetString (CCSSetting *setting, const char *data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setString (data, processChanged); } static CCSSetStatus ccsSetColor (CCSSetting *setting, CCSSettingColorValue data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setColor (data, processChanged); } static CCSSetStatus ccsSetMatch (CCSSetting *setting, const char *data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setMatch (data, processChanged); } static CCSSetStatus ccsSetKey (CCSSetting *setting, CCSSettingKeyValue data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setKey (data, processChanged); } static CCSSetStatus ccsSetButton (CCSSetting *setting, CCSSettingButtonValue data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setButton (data, processChanged); } static CCSSetStatus ccsSetEdge (CCSSetting *setting, unsigned int data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setEdge (data, processChanged); } static CCSSetStatus ccsSetBell (CCSSetting *setting, Bool data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setBell (data, processChanged); } static CCSSetStatus ccsSetList (CCSSetting *setting, CCSSettingValueList data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setList (data, processChanged); } static CCSSetStatus ccsSetValue (CCSSetting *setting, CCSSettingValue *data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setValue (data, processChanged); } static void ccsResetToDefault (CCSSetting * setting, Bool processChanged) { ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->resetToDefault (processChanged); } static Bool ccsSettingIsIntegrated (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->isIntegrated (); } static Bool ccsSettingIsReadOnly (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->isReadOnly (); } static const char * ccsSettingGetName (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getName (); } static const char * ccsSettingGetShortDesc (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getShortDesc (); } static const char * ccsSettingGetLongDesc (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getLongDesc (); } static CCSSettingType ccsSettingGetType (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getType (); } static CCSSettingInfo * ccsSettingGetInfo (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getInfo (); } static const char * ccsSettingGetGroup (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getGroup (); } static const char * ccsSettingGetSubGroup (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getSubGroup (); } static const char * ccsSettingGetHints (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getHints (); } static CCSSettingValue * ccsSettingGetDefaultValue (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getDefaultValue (); } static CCSSettingValue *ccsSettingGetValue (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getValue (); } static Bool ccsSettingGetIsDefault (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getIsDefault (); } static CCSPlugin * ccsSettingGetParent (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getParent (); } static void * ccsSettingGetPrivatePtr (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getPrivatePtr (); } static void ccsSettingSetPrivatePtr (CCSSetting *setting, void *ptr) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setPrivatePtr (ptr); } static Bool ccsSettingIsReadableByBackend (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->isReadableByBackend (); } static void ccsSettingFree (CCSSetting *setting) { ccsFreeMockSetting (setting); } }; extern CCSSettingInterface CCSSettingGMockInterface; #endif compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_context_mock.h0000644000015301777760000002375212321343002032731 0ustar pbusernogroup00000000000000#ifndef _COMPIZCONFIG_CCS_CONTEXT_MOCK_H #define _COMPIZCONFIG_CCS_CONTEXT_MOCK_H #include #include #include CCSContext * ccsMockContextNew (); void ccsFreeMockContext (CCSContext *); class CCSContextGMockInterface { public: virtual ~CCSContextGMockInterface () {}; virtual CCSPluginList getPlugins () = 0; virtual CCSPluginCategory * getCategories () = 0; virtual CCSSettingList getChangedSettings () = 0; virtual unsigned int getScreenNum () = 0; virtual Bool addChangedSetting (CCSSetting *) = 0; virtual Bool clearChangedSettings () = 0; virtual CCSSettingList stealChangedSettings () = 0; virtual void * getPrivatePtr () = 0; virtual void setPrivatePtr (void *) = 0; virtual Bool loadPlugin (char *name) = 0; virtual CCSPlugin * findPlugin (const char *name) = 0; virtual Bool pluginIsActive (const char *name) = 0; virtual CCSPluginList getActivePluginList () = 0; virtual CCSStringList getSortedPluginStringList () = 0; virtual const char * getBackend () = 0; virtual Bool setBackend (char *name) = 0; virtual void setIntegrationEnabled (Bool value) = 0; virtual void setProfile (const char *name) = 0; virtual void setPluginListAutoSort (Bool value) = 0; virtual const char * getProfile () = 0; virtual Bool getIntegrationEnabled () = 0; virtual Bool getPluginListAutoSort () = 0; virtual void processEvents (unsigned int flags) = 0; virtual void readSettings () = 0; virtual void writeSettings () = 0; virtual void writeChangedSettings () = 0; virtual Bool exportToFile (const char *fileName, Bool skipDefaults) = 0; virtual Bool importFromFile (const char *fileName, Bool overwriteNonDefaults) = 0; virtual CCSPluginConflictList canEnablePlugin (CCSPlugin *) = 0; virtual CCSPluginConflictList canDisablePlugin (CCSPlugin *) = 0; virtual void deleteProfile (char *name) = 0; virtual CCSStringList getExistingProfiles () = 0; virtual Bool checkForSettingsUpgrade () = 0; virtual void loadPlugins () = 0; }; class CCSContextGMock : public CCSContextGMockInterface { public: CCSContextGMock (CCSContext *c) : mContext (c) { } CCSContext * context () { return mContext; } MOCK_METHOD0 (getPlugins, CCSPluginList ()); MOCK_METHOD0 (getCategories, CCSPluginCategory * ()); MOCK_METHOD0 (getChangedSettings, CCSSettingList ()); MOCK_METHOD0 (getScreenNum, unsigned int ()); MOCK_METHOD1 (addChangedSetting, Bool (CCSSetting *)); MOCK_METHOD0 (clearChangedSettings, Bool ()); MOCK_METHOD0 (stealChangedSettings, CCSSettingList ()); MOCK_METHOD0 (getPrivatePtr, void * ()); MOCK_METHOD1 (setPrivatePtr, void (void *)); MOCK_METHOD1 (loadPlugin, Bool (char *)); MOCK_METHOD1 (findPlugin, CCSPlugin * (const char *)); MOCK_METHOD1 (pluginIsActive, Bool (const char *)); MOCK_METHOD0 (getActivePluginList, CCSPluginList ()); MOCK_METHOD0 (getSortedPluginStringList, CCSStringList ()); MOCK_METHOD0 (getBackend, const char * ()); MOCK_METHOD1 (setBackend, Bool (char *)); MOCK_METHOD1 (setIntegrationEnabled, void (Bool)); MOCK_METHOD1 (setProfile, void (const char *)); MOCK_METHOD1 (setPluginListAutoSort, void (Bool)); MOCK_METHOD0 (getProfile, const char * ()); MOCK_METHOD0 (getIntegrationEnabled, Bool ()); MOCK_METHOD0 (getPluginListAutoSort, Bool ()); MOCK_METHOD1 (processEvents, void (unsigned int)); MOCK_METHOD0 (readSettings, void ()); MOCK_METHOD0 (writeSettings, void ()); MOCK_METHOD0 (writeChangedSettings, void ()); MOCK_METHOD2 (exportToFile, Bool (const char *, Bool)); MOCK_METHOD2 (importFromFile, Bool (const char *, Bool)); MOCK_METHOD1 (canEnablePlugin, CCSPluginConflictList (CCSPlugin *)); MOCK_METHOD1 (canDisablePlugin, CCSPluginConflictList (CCSPlugin *)); MOCK_METHOD1 (deleteProfile, void (char *)); MOCK_METHOD0 (getExistingProfiles, CCSStringList ()); MOCK_METHOD0 (checkForSettingsUpgrade, Bool ()); MOCK_METHOD0 (loadPlugins, void ()); private: CCSContext *mContext; public: /* Thunking from C interface callbacks to the virtual functions ... */ static CCSPluginList ccsContextGetPlugins (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getPlugins (); } static CCSPluginCategory * ccsContextGetCategories (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getCategories (); } static CCSSettingList ccsContextGetChangedSettings (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getChangedSettings (); } static unsigned int ccsContextGetScreenNum (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getScreenNum (); } static Bool ccsContextAddChangedSetting (CCSContext *context, CCSSetting *setting) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->addChangedSetting (setting); } static Bool ccsContextClearChangedSettings (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->clearChangedSettings (); } static CCSSettingList ccsContextStealChangedSettings (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->stealChangedSettings (); } static void * ccsContextGetPrivatePtr (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getPrivatePtr (); } static void ccsContextSetPrivatePtr (CCSContext *context, void *ptr) { ((CCSContextGMock *) ccsObjectGetPrivate (context))->setPrivatePtr (ptr); } static CCSPlugin * ccsFindPlugin (CCSContext *context, const char *name) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->findPlugin ((char *) name); } static Bool ccsPluginIsActive (CCSContext *context, const char *name) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->pluginIsActive (name); } static Bool ccsSetBackend (CCSContext *context, char *name) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->setBackend (name); } static CCSPluginList ccsGetActivePluginList (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getActivePluginList (); } static CCSStringList ccsGetSortedPluginStringList (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getSortedPluginStringList (); } static const char * ccsGetBackend (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getBackend (); } static Bool ccsGetIntegrationEnabled (CCSContext *context) { if (!context) return FALSE; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getIntegrationEnabled (); } static const char * ccsGetProfile (CCSContext *context) { if (!context) return NULL; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getProfile (); } static Bool ccsGetPluginListAutoSort (CCSContext *context) { if (!context) return FALSE; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getPluginListAutoSort (); } static void ccsSetIntegrationEnabled (CCSContext *context, Bool value) { ((CCSContextGMock *) ccsObjectGetPrivate (context))->setIntegrationEnabled (value); } static void ccsSetPluginListAutoSort (CCSContext *context, Bool value) { ((CCSContextGMock *) ccsObjectGetPrivate (context))->setPluginListAutoSort (value); } static void ccsSetProfile (CCSContext *context, const char *name) { ((CCSContextGMock *) ccsObjectGetPrivate (context))->setProfile (name); } static void ccsProcessEvents (CCSContext *context, unsigned int flags) { if (!context) return; ((CCSContextGMock *) ccsObjectGetPrivate (context))->processEvents (flags); } static void ccsReadSettings (CCSContext *context) { if (!context) return; ((CCSContextGMock *) ccsObjectGetPrivate (context))->readSettings (); } static void ccsWriteSettings (CCSContext *context) { if (!context) return; ((CCSContextGMock *) ccsObjectGetPrivate (context))->writeSettings (); } static void ccsWriteChangedSettings (CCSContext *context) { if (!context) return; ((CCSContextGMock *) ccsObjectGetPrivate (context))->writeChangedSettings (); } static CCSPluginConflictList ccsCanEnablePlugin (CCSContext *context, CCSPlugin *plugin) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->canEnablePlugin (plugin); } static CCSPluginConflictList ccsCanDisablePlugin (CCSContext *context, CCSPlugin *plugin) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->canDisablePlugin (plugin); } static CCSStringList ccsGetExistingProfiles (CCSContext *context) { if (!context) return NULL; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getExistingProfiles (); } static void ccsDeleteProfile (CCSContext *context, char *name) { if (!context) return; ((CCSContextGMock *) ccsObjectGetPrivate (context))->deleteProfile (name); } static Bool ccsCheckForSettingsUpgrade (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->checkForSettingsUpgrade (); } static Bool ccsImportFromFile (CCSContext *context, const char *fileName, Bool overwriteNonDefault) { if (!context) return FALSE; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->importFromFile (fileName, overwriteNonDefault); } static Bool ccsLoadPlugin (CCSContext *context, char *name) { if (!context) return FALSE; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->loadPlugin (name); } static Bool ccsExportToFile (CCSContext *context, const char *fileName, Bool skipDefaults) { if (!context) return FALSE; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->exportToFile (fileName, skipDefaults); } static void ccsLoadPlugins (CCSContext *context) { if (!context) return; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->loadPlugins (); } static void ccsFreeContext (CCSContext *context) { if (!context) return; ccsFreeMockContext (context); } }; extern CCSContextInterface CCSContextGMockInterface; #endif ././@LongLink0000000000000000000000000000016300000000000011215 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_storage_mock.hcompiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_0000644000015301777760000001025612321343002034023 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_INTEGRATED_SETTING_STORAGE_MOCK_H #define _COMPIZCONFIG_CCS_INTEGRATED_SETTING_STORAGE_MOCK_H #include #include #include #include CCSIntegratedSettingsStorage * ccsMockIntegratedSettingsStorageNew (CCSObjectAllocationInterface *ai); void ccsMockIntegratedSettingsStorageFree (CCSIntegratedSettingsStorage *); class CCSIntegratedSettingsStorageGMockInterface { public: virtual ~CCSIntegratedSettingsStorageGMockInterface () {} virtual CCSIntegratedSettingList findMatchingSettingsByPluginAndSettingName (const char *pluginName, const char *settingName) = 0; virtual void addSetting (CCSIntegratedSetting *setting) = 0; virtual CCSIntegratedSettingList findMatchingSettingsByPredicate (CCSIntegratedSettingsStorageFindPredicate pred, void *data) = 0; virtual Bool empty () = 0; }; class CCSIntegratedSettingsStorageGMock : public CCSIntegratedSettingsStorageGMockInterface { public: MOCK_METHOD2 (findMatchingSettingsByPluginAndSettingName, CCSIntegratedSettingList (const char *, const char *)); MOCK_METHOD1 (addSetting, void (CCSIntegratedSetting *)); MOCK_METHOD2 (findMatchingSettingsByPredicate, CCSIntegratedSettingList (CCSIntegratedSettingsStorageFindPredicate , void *)); MOCK_METHOD0 (empty, Bool ()); CCSIntegratedSettingsStorageGMock (CCSIntegratedSettingsStorage *integratedSetting) : mIntegrationSetting (integratedSetting) { } CCSIntegratedSettingsStorage * getIntegratedSettingsStorage () { return mIntegrationSetting; } public: static CCSIntegratedSettingList ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate (CCSIntegratedSettingsStorage *storage, CCSIntegratedSettingsStorageFindPredicate pred, void *data) { return reinterpret_cast (ccsObjectGetPrivate (storage))->findMatchingSettingsByPredicate (pred, data); } static CCSIntegratedSettingList ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (CCSIntegratedSettingsStorage *storage, const char *pluginName, const char *settingName) { return reinterpret_cast (ccsObjectGetPrivate (storage))->findMatchingSettingsByPluginAndSettingName (pluginName, settingName); } static void ccsIntegratedSettingsStorageAddSetting (CCSIntegratedSettingsStorage *storage, CCSIntegratedSetting *setting) { return reinterpret_cast (ccsObjectGetPrivate (storage))->addSetting (setting); } static Bool ccsIntegratedSettingsStorageEmpty (CCSIntegratedSettingsStorage *storage) { return reinterpret_cast (ccsObjectGetPrivate (storage))->empty (); } static void ccsIntegratedSettingsStorageFree (CCSIntegratedSettingsStorage *integratedSetting) { ccsMockIntegratedSettingsStorageFree (integratedSetting); } private: CCSIntegratedSettingsStorage *mIntegrationSetting; }; extern const CCSIntegratedSettingsStorageInterface mockIntegratedSettingsStorageInterface; #endif ././@LongLink0000000000000000000000000000016500000000000011217 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_factory_mock.cppcompiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_0000644000015301777760000000523012321343002034017 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_integrated_setting_factory_mock.h" const CCSIntegratedSettingFactoryInterface mockIntegratedSettingFactoryInterface = { CCSIntegratedSettingFactoryGMock::ccsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType, CCSIntegratedSettingFactoryGMock::ccsIntegratedSettingFactoryFree }; CCSIntegratedSettingFactory * ccsMockIntegratedSettingFactoryNew (CCSObjectAllocationInterface *ai) { CCSIntegratedSettingFactory *integratedSettingFactory = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingFactory))); if (!integratedSettingFactory) return NULL; CCSIntegratedSettingFactoryGMock *gmockFactory = new CCSIntegratedSettingFactoryGMock (integratedSettingFactory); ccsObjectInit (integratedSettingFactory, ai); ccsObjectSetPrivate (integratedSettingFactory, (CCSPrivate *) gmockFactory); ccsObjectAddInterface (integratedSettingFactory, reinterpret_cast (&mockIntegratedSettingFactoryInterface), GET_INTERFACE_TYPE (CCSIntegratedSettingFactoryInterface)); ccsObjectRef (integratedSettingFactory); return integratedSettingFactory; } void ccsMockIntegratedSettingFactoryFree (CCSIntegratedSettingFactory *integratedSettingFactory) { CCSIntegratedSettingFactoryGMock *gmockFactory = GET_PRIVATE (CCSIntegratedSettingFactoryGMock, integratedSettingFactory); delete gmockFactory; ccsObjectSetPrivate (integratedSettingFactory, NULL); ccsObjectFinalize (integratedSettingFactory); (*integratedSettingFactory->object.object_allocation->free_) (integratedSettingFactory->object.object_allocation->allocator, integratedSettingFactory); } compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_text_file_mock.cpp0000644000015301777760000000531612321343002033557 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include "compizconfig_ccs_text_file_mock.h" const CCSTextFileInterface ccsMockTextFileInterface = { CCSTextFileGMock::ccsTextFileReadFromStart, CCSTextFileGMock::ccsTextFileAppendString, CCSTextFileGMock::ccsFreeTextFile }; static void finalizeAndFreeTextFile (CCSTextFile *textFile) { CCSObjectAllocationInterface *ai = textFile->object.object_allocation; ccsObjectFinalize (textFile); (*ai->free_) (ai->allocator, textFile); } void ccsFreeMockTextFile (CCSTextFile *textFile) { CCSTextFileGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (textFile)); delete gmock; ccsObjectSetPrivate (textFile, NULL); finalizeAndFreeTextFile (textFile); } static CCSTextFileGMock * newCCSTextFileGMockInterface (CCSTextFile *textFile) { CCSTextFileGMock *gmock = new CCSTextFileGMock (); if (!gmock) { finalizeAndFreeTextFile (textFile); return NULL; } return gmock; } static CCSTextFile * allocateCCSTextFile (CCSObjectAllocationInterface *ai) { CCSTextFile *textFile = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSTextFile))); if (!textFile) return NULL; ccsObjectInit (textFile, ai); return textFile; } CCSTextFile * ccsMockTextFileNew (CCSObjectAllocationInterface *ai) { CCSTextFile *textFile = allocateCCSTextFile (ai); if (!textFile) return NULL; CCSTextFileGMock *gmock = newCCSTextFileGMockInterface (textFile); if (!gmock) return NULL; ccsObjectSetPrivate (textFile, (CCSPrivate *) gmock); ccsObjectAddInterface (textFile, (const CCSInterface *) &ccsMockTextFileInterface, GET_INTERFACE_TYPE (CCSTextFileInterface)); ccsObjectRef (textFile); return textFile; } compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_config_file_mock.h0000644000015301777760000000570412321343002033506 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef COMPIZCONFIG_CCS_CONFIG_FILE_MOCK_H #define COMPIZCONFIG_CCS_CONFIG_FILE_MOCK_H #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSConfigFile CCSConfigFile; typedef struct _CCSObjectAllocationInterface CCSObjectAllocationInterface; CCSConfigFile * ccsMockConfigFileNew (CCSObjectAllocationInterface *ai); void ccsFreeMockConfigFile (CCSConfigFile *); typedef void (*ConfigChangeCallbackProc) (unsigned int watchId, void *closure); COMPIZCONFIG_END_DECLS class CCSConfigFileGMockInterface { public: virtual ~CCSConfigFileGMockInterface () {} virtual Bool readConfigOption (ConfigOption, char **) = 0; virtual Bool writeConfigOption (ConfigOption, const char *) = 0; virtual void setConfigWatchCallback (ConfigChangeCallbackProc, void *closure) = 0; }; class CCSConfigFileGMock : public CCSConfigFileGMockInterface { public: MOCK_METHOD2 (readConfigOption, Bool (ConfigOption, char **)); MOCK_METHOD2 (writeConfigOption, Bool (ConfigOption, const char *)); MOCK_METHOD2 (setConfigWatchCallback, void (ConfigChangeCallbackProc, void *)); public: static Bool ccsConfigFileReadConfigOption (CCSConfigFile *config, ConfigOption option, char **value) { return reinterpret_cast (ccsObjectGetPrivate (config))->readConfigOption (option, value); } static Bool ccsConfigFileWriteConfigOption (CCSConfigFile *config, ConfigOption option, const char *value) { return reinterpret_cast (ccsObjectGetPrivate (config))->writeConfigOption (option, value); } static void ccsSetConfigWatchCallback (CCSConfigFile *config, ConfigChangeCallbackProc proc, void *closure) { reinterpret_cast (ccsObjectGetPrivate (config))->setConfigWatchCallback (proc, closure); } static void ccsFreeConfigFile (CCSConfigFile *config) { ccsFreeMockConfigFile (config); } }; #endif compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_text_file_mock.h0000644000015301777760000000441612321343002033224 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef COMPIZCONFIG_CCS_TEST_FILE_MOCK_H #define COMPIZCONFIG_CCS_TEST_FILE_MOCK_H #include #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSTextFile CCSTextFile; typedef struct _CCSObjectAllocationInterface CCSObjectAllocationInterface; CCSTextFile * ccsMockTextFileNew (CCSObjectAllocationInterface *ai); void ccsFreeMockTextFile (CCSTextFile *); COMPIZCONFIG_END_DECLS class CCSTextFileGMockInterface { public: virtual ~CCSTextFileGMockInterface () {} virtual char * readFromStart () = 0; virtual Bool appendString (const char *) = 0; virtual void free () = 0; }; class CCSTextFileGMock : public CCSTextFileGMockInterface { public: MOCK_METHOD0 (readFromStart, char * ()); MOCK_METHOD1 (appendString, Bool (const char *)); MOCK_METHOD0 (free, void ()); public: static char * ccsTextFileReadFromStart (CCSTextFile *file) { return reinterpret_cast (ccsObjectGetPrivate (file))->readFromStart (); } static Bool ccsTextFileAppendString (CCSTextFile *file, const char *str) { return reinterpret_cast (ccsObjectGetPrivate (file))->appendString (str); } static void ccsFreeTextFile (CCSTextFile *file) { reinterpret_cast (ccsObjectGetPrivate (file))->free (); ccsFreeMockTextFile (file); } }; #endif ././@LongLink0000000000000000000000000000014600000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_config_file_mock.cppcompiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_config_file_mock.cp0000644000015301777760000000556312321343002033664 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include "compizconfig_ccs_config_file_mock.h" const CCSConfigFileInterface ccsMockConfigFileInterface = { CCSConfigFileGMock::ccsConfigFileReadConfigOption, CCSConfigFileGMock::ccsConfigFileWriteConfigOption, CCSConfigFileGMock::ccsSetConfigWatchCallback, CCSConfigFileGMock::ccsFreeConfigFile }; static void finalizeAndFreeConfigFile (CCSConfigFile *configFile) { CCSObjectAllocationInterface *ai = configFile->object.object_allocation; ccsObjectFinalize (configFile); (*ai->free_) (ai->allocator, configFile); } void ccsFreeMockConfigFile (CCSConfigFile *configFile) { CCSConfigFileGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (configFile)); delete gmock; ccsObjectSetPrivate (configFile, NULL); finalizeAndFreeConfigFile (configFile); } static CCSConfigFileGMock * newCCSConfigFileGMockInterface (CCSConfigFile *configFile) { CCSConfigFileGMock *gmock = new CCSConfigFileGMock (); if (!gmock) { finalizeAndFreeConfigFile (configFile); return NULL; } return gmock; } static CCSConfigFile * allocateCCSConfigFile (CCSObjectAllocationInterface *ai) { CCSConfigFile *configFile = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSConfigFile))); if (!configFile) return NULL; ccsObjectInit (configFile, ai); return configFile; } CCSConfigFile * ccsMockConfigFileNew (CCSObjectAllocationInterface *ai) { CCSConfigFile *configFile = allocateCCSConfigFile (ai); if (!configFile) return NULL; CCSConfigFileGMock *gmock = newCCSConfigFileGMockInterface (configFile); if (!gmock) return NULL; ccsObjectSetPrivate (configFile, (CCSPrivate *) gmock); ccsObjectAddInterface (configFile, (const CCSInterface *) &ccsMockConfigFileInterface, GET_INTERFACE_TYPE (CCSConfigFileInterface)); ccsObjectRef (configFile); return configFile; } ././@LongLink0000000000000000000000000000015100000000000011212 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_backend_loader_mock.cppcompiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_backend_loader_mock0000644000015301777760000000542512321343002033731 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include "compizconfig_ccs_backend_loader_mock.h" const CCSBackendLoaderInterface ccsMockBackendLoaderInterface = { CCSBackendLoaderGMock::ccsBackendLoaderLoadBackend, CCSBackendLoaderGMock::ccsFreeBackendLoader }; static void finalizeAndFreeBackendLoader (CCSBackendLoader *loader) { CCSObjectAllocationInterface *ai = loader->object.object_allocation; ccsObjectFinalize (loader); (*ai->free_) (ai->allocator, loader); } void ccsFreeMockBackendLoader (CCSBackendLoader *loader) { CCSBackendLoaderGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (loader)); delete gmock; ccsObjectSetPrivate (loader, NULL); finalizeAndFreeBackendLoader (loader); } static CCSBackendLoaderGMock * newCCSBackendLoaderGMockInterface (CCSBackendLoader *loader) { CCSBackendLoaderGMock *gmock = new CCSBackendLoaderGMock (); if (!gmock) { finalizeAndFreeBackendLoader (loader); return NULL; } return gmock; } static CCSBackendLoader * allocateCCSBackendLoader (CCSObjectAllocationInterface *ai) { CCSBackendLoader *loader = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSBackendLoader))); if (!loader) return NULL; ccsObjectInit (loader, ai); return loader; } CCSBackendLoader * ccsMockBackendLoaderNew (CCSObjectAllocationInterface *ai) { CCSBackendLoader *loader = allocateCCSBackendLoader (ai); if (!loader) return NULL; CCSBackendLoaderGMock *gmock = newCCSBackendLoaderGMockInterface (loader); if (!gmock) return NULL; ccsObjectSetPrivate (loader, (CCSPrivate *) gmock); ccsObjectAddInterface (loader, (const CCSInterface *) &ccsMockBackendLoaderInterface, GET_INTERFACE_TYPE (CCSBackendLoaderInterface)); ccsObjectRef (loader); return loader; } compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_plugin_mock.h0000644000015301777760000001245612321343002032542 0ustar pbusernogroup00000000000000#include #include #include CCSPlugin * ccsMockPluginNew (); void ccsFreeMockPlugin (CCSPlugin *); class CCSPluginGMockInterface { public: virtual ~CCSPluginGMockInterface () {}; virtual const char * getName () = 0; virtual const char * getShortDesc () = 0; virtual const char * getLongDesc () = 0; virtual const char * getHints () = 0; virtual const char * getCategory () = 0; virtual CCSStringList getLoadAfter () = 0; virtual CCSStringList getLoadBefore () = 0; virtual CCSStringList getRequiresPlugins () = 0; virtual CCSStringList getConflictPlugins () = 0; virtual CCSStringList getProvidesFeatures () = 0; virtual CCSStringList getRequiresFeatures () = 0; virtual void * getPrivatePtr () = 0; virtual void setPrivatePtr (void *) = 0; virtual CCSContext * getContext () = 0; virtual CCSSetting * findSetting (const char *name) = 0; virtual CCSSettingList getPluginSettings () = 0; virtual CCSGroupList getPluginGroups () = 0; virtual void readPluginSettings () = 0; virtual CCSStrExtensionList getPluginStrExtensions () = 0; }; class CCSPluginGMock : public CCSPluginGMockInterface { public: CCSPluginGMock (CCSPlugin *p) : mPlugin (p) { } CCSPlugin * plugin () { return mPlugin; } /* Mock implementations */ MOCK_METHOD0 (getName, const char * ()); MOCK_METHOD0 (getShortDesc, const char * ()); MOCK_METHOD0 (getLongDesc, const char * ()); MOCK_METHOD0 (getHints, const char * ()); MOCK_METHOD0 (getCategory, const char * ()); MOCK_METHOD0 (getLoadAfter, CCSStringList ()); MOCK_METHOD0 (getLoadBefore, CCSStringList ()); MOCK_METHOD0 (getRequiresPlugins, CCSStringList ()); MOCK_METHOD0 (getConflictPlugins, CCSStringList ()); MOCK_METHOD0 (getProvidesFeatures, CCSStringList ()); MOCK_METHOD0 (getRequiresFeatures, CCSStringList ()); MOCK_METHOD0 (getPrivatePtr, void * ()); MOCK_METHOD1 (setPrivatePtr, void (void *)); MOCK_METHOD0 (getContext, CCSContext * ()); MOCK_METHOD1 (findSetting, CCSSetting * (const char *)); MOCK_METHOD0 (getPluginSettings, CCSSettingList ()); MOCK_METHOD0 (getPluginGroups, CCSGroupList ()); MOCK_METHOD0 (readPluginSettings, void ()); MOCK_METHOD0 (getPluginStrExtensions, CCSStrExtensionList ()); private: CCSPlugin *mPlugin; public: /* Thunking C to C++ */ static const char * ccsPluginGetName (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getName (); } static const char * ccsPluginGetShortDesc (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getShortDesc (); } static const char * ccsPluginGetLongDesc (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getLongDesc (); } static const char * ccsPluginGetHints (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getHints (); } static const char * ccsPluginGetCategory (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getCategory (); } static CCSStringList ccsPluginGetLoadAfter (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getLoadAfter (); } static CCSStringList ccsPluginGetLoadBefore (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getLoadBefore (); } static CCSStringList ccsPluginGetRequiresPlugins (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getRequiresPlugins (); } static CCSStringList ccsPluginGetConflictPlugins (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getConflictPlugins (); } static CCSStringList ccsPluginGetProvidesFeatures (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getProvidesFeatures (); } static CCSStringList ccsPluginGetRequiresFeatures (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getRequiresFeatures (); } static void * ccsPluginGetPrivatePtr (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getPrivatePtr (); } static void ccsPluginSetPrivatePtr (CCSPlugin *plugin, void *ptr) { ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->setPrivatePtr (ptr); } static CCSContext * ccsPluginGetContext (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getContext (); } static CCSSettingList ccsGetPluginSettings (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getPluginSettings (); } static CCSGroupList ccsGetPluginGroups (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getPluginGroups (); } static CCSSetting * ccsFindSetting (CCSPlugin *plugin, const char *name) { if (!plugin) return NULL; return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->findSetting (name); } static void ccsReadPluginSettings (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->readPluginSettings (); } static CCSStrExtensionList ccsGetPluginStrExtensions (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getPluginStrExtensions (); } static void ccsFreePlugin (CCSPlugin *plugin) { ccsFreeMockPlugin (plugin); } }; extern CCSPluginInterface CCSPluginGMockInterface; compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integration_mock.h0000644000015301777760000001103712321343002033561 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_INTEGRATION_MOCK_H #define _COMPIZCONFIG_CCS_INTEGRATION_MOCK_H #include #include #include CCSIntegration * ccsMockIntegrationBackendNew (CCSObjectAllocationInterface *ai); void ccsMockIntegrationBackendFree (CCSIntegration *integration); class CCSIntegrationGMockInterface { public: virtual ~CCSIntegrationGMockInterface () {} virtual CCSIntegratedSetting * getIntegratedOptionIndex (const char *pluginName, const char *settingName) = 0; virtual Bool readOptionIntoSetting (CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *) = 0; virtual void writeOptionFromSetting (CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *) = 0; virtual void updateIntegratedSettings (CCSContext *context, CCSIntegratedSettingList settingList) = 0; virtual void disallowIntegratedWrites () = 0; virtual void allowIntegratedWrites () = 0; }; class CCSIntegrationGMock : public CCSIntegrationGMockInterface { public: MOCK_METHOD2 (getIntegratedOptionIndex, CCSIntegratedSetting * (const char *, const char *)); MOCK_METHOD3 (readOptionIntoSetting, Bool (CCSContext *, CCSSetting *, CCSIntegratedSetting *)); MOCK_METHOD3 (writeOptionFromSetting, void (CCSContext *, CCSSetting *, CCSIntegratedSetting *)); MOCK_METHOD2 (updateIntegratedSettings, void (CCSContext *, CCSIntegratedSettingList)); MOCK_METHOD0 (disallowIntegratedWrites, void ()); MOCK_METHOD0 (allowIntegratedWrites, void ()); CCSIntegrationGMock (CCSIntegration *integration) : mIntegration (integration) { } CCSIntegration * getIntegrationBackend () { return mIntegration; } public: static CCSIntegratedSetting * ccsIntegrationGetIntegratedOptionIndex (CCSIntegration *integration, const char *pluginName, const char *settingName) { return reinterpret_cast (ccsObjectGetPrivate (integration))->getIntegratedOptionIndex (pluginName, settingName); } static Bool ccsIntegrationReadOptionIntoSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integrated) { return reinterpret_cast (ccsObjectGetPrivate (integration))->readOptionIntoSetting (context, setting, integrated); } static void ccsIntegrationWriteSettingIntoOption (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integrated) { return reinterpret_cast (ccsObjectGetPrivate (integration))->writeOptionFromSetting (context, setting, integrated); } static void ccsIntegrationUpdateIntegratedSettings (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList settingList) { return reinterpret_cast (ccsObjectGetPrivate (integration))->updateIntegratedSettings (context, settingList); } static void ccsFreeIntegration (CCSIntegration *integration) { ccsMockIntegrationBackendFree (integration); } static void ccsIntegrationDisallowIntegratedWrites (CCSIntegration *integration) { reinterpret_cast (ccsObjectGetPrivate (integration))->disallowIntegratedWrites (); } static void ccsIntegrationAllowIntegratedWrites (CCSIntegration *integration) { reinterpret_cast (ccsObjectGetPrivate (integration))->allowIntegratedWrites (); } private: CCSIntegration *mIntegration; }; extern const CCSIntegrationInterface mockIntegrationBackendInterface; #endif compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/CMakeLists.txt0000644000015301777760000001057612321343002027224 0ustar pbusernogroup00000000000000include_directories (${GTEST_INCLUDE_DIRS}) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../libcompizconfig/include) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../libcompizconfig/src) link_directories (${CMAKE_INSTALL_PREFIX}/lib) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../libcompizconfig/src) if (HAVE_PROTOBUF) set (LIBCOMPIZCONFIG_LIBRARIES ${LIBCOMPIZCONFIG_LIBRARIES} protobuf) endif (HAVE_PROTOBUF) add_library (compizconfig_ccs_context_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_context_mock.cpp) add_library (compizconfig_ccs_plugin_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_plugin_mock.cpp) add_library (compizconfig_ccs_setting_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_setting_mock.cpp) add_library (compizconfig_ccs_setting_stub ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_setting_stub.cpp) add_library (compizconfig_ccs_backend_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_backend_mock.cpp) add_library (compizconfig_ccs_text_file_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_text_file_mock.cpp) add_library (compizconfig_ccs_backend_loader_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_backend_loader_mock.cpp) add_library (compizconfig_ccs_config_file_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_config_file_mock.cpp) add_library (compizconfig_ccs_integration_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_integration_mock.cpp) add_library (compizconfig_ccs_integrated_setting_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_integrated_setting_mock.cpp) add_library (compizconfig_ccs_integrated_setting_storage_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_integrated_setting_storage_mock.cpp) add_library (compizconfig_ccs_integrated_setting_factory_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_integrated_setting_factory_mock.cpp) target_link_libraries (compizconfig_ccs_context_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig) target_link_libraries (compizconfig_ccs_plugin_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig) target_link_libraries (compizconfig_ccs_setting_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig) target_link_libraries (compizconfig_ccs_setting_stub ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig) target_link_libraries (compizconfig_ccs_backend_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig) target_link_libraries (compizconfig_ccs_text_file_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) target_link_libraries (compizconfig_ccs_config_file_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig) target_link_libraries (compizconfig_ccs_backend_loader_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig) target_link_libraries (compizconfig_ccs_integration_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig) target_link_libraries (compizconfig_ccs_integrated_setting_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig) target_link_libraries (compizconfig_ccs_integrated_setting_factory_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig) target_link_libraries (compizconfig_ccs_integrated_setting_storage_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig) ././@LongLink0000000000000000000000000000015300000000000011214 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_mock.hcompiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_0000644000015301777760000000533612321343002034026 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_INTEGRATED_SETTING_MOCK_H #define _COMPIZCONFIG_CCS_INTEGRATED_SETTING_MOCK_H #include #include #include #include CCSIntegratedSetting * ccsMockIntegratedSettingNew (CCSObjectAllocationInterface *ai); void ccsMockIntegratedSettingFree (CCSIntegratedSetting *); class CCSIntegratedSettingGMockInterface { public: virtual ~CCSIntegratedSettingGMockInterface () {} virtual CCSSettingValue * readValue (CCSSettingType) = 0; virtual void writeValue (CCSSettingValue *, CCSSettingType) = 0; }; class CCSIntegratedSettingGMock : public CCSIntegratedSettingGMockInterface { public: MOCK_METHOD1 (readValue, CCSSettingValue * (CCSSettingType)); MOCK_METHOD2 (writeValue, void (CCSSettingValue *, CCSSettingType)); CCSIntegratedSettingGMock (CCSIntegratedSetting *integratedSetting) : mIntegrationSetting (integratedSetting) { } CCSIntegratedSetting * getIntegratedSetting () { return mIntegrationSetting; } public: static CCSSettingValue * ccsIntegratedSettingReadValue (CCSIntegratedSetting *integratedSetting, CCSSettingType type) { return reinterpret_cast (ccsObjectGetPrivate (integratedSetting))->readValue (type); } static void ccsIntegratedSettingWriteValue (CCSIntegratedSetting *integratedSetting, CCSSettingValue *value, CCSSettingType type) { reinterpret_cast (ccsObjectGetPrivate (integratedSetting))->writeValue (value, type); } static void ccsIntegratedSettingFree (CCSIntegratedSetting *integratedSetting) { ccsMockIntegratedSettingFree (integratedSetting); } private: CCSIntegratedSetting *mIntegrationSetting; }; extern const CCSIntegratedSettingInterface mockIntegratedSettingInterface; #endif compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_setting_stub.h0000644000015301777760000000316412321343002032741 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2013 Sam Spilsbury . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_SETTING_STUB #define _COMPIZCONFIG_CCS_SETTING_STUB #include CCSSetting * ccsSettingTypeStubNew (CCSSettingType type, Bool integrated, Bool readOnly, const char *name, const char *shortDesc, const char *longDesc, const char *hints, const char *group, const char *subGroup, CCSSettingValue *value, CCSSettingValue *defaultValue, CCSSettingInfo *info, CCSObjectAllocationInterface *ai); #endif compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_plugin_mock.cpp0000644000015301777760000000336212321343002033071 0ustar pbusernogroup00000000000000#include #include #include #include "compizconfig_ccs_plugin_mock.h" CCSPluginInterface CCSPluginGMockInterface = { CCSPluginGMock::ccsPluginGetName, CCSPluginGMock::ccsPluginGetShortDesc, CCSPluginGMock::ccsPluginGetLongDesc, CCSPluginGMock::ccsPluginGetHints, CCSPluginGMock::ccsPluginGetCategory, CCSPluginGMock::ccsPluginGetLoadAfter, CCSPluginGMock::ccsPluginGetLoadBefore, CCSPluginGMock::ccsPluginGetRequiresPlugins, CCSPluginGMock::ccsPluginGetConflictPlugins, CCSPluginGMock::ccsPluginGetProvidesFeatures, CCSPluginGMock::ccsPluginGetRequiresFeatures, CCSPluginGMock::ccsPluginGetPrivatePtr, CCSPluginGMock::ccsPluginSetPrivatePtr, CCSPluginGMock::ccsPluginGetContext, CCSPluginGMock::ccsFindSetting, CCSPluginGMock::ccsGetPluginSettings, CCSPluginGMock::ccsGetPluginGroups, CCSPluginGMock::ccsReadPluginSettings, CCSPluginGMock::ccsGetPluginStrExtensions, CCSPluginGMock::ccsFreePlugin }; CCSPlugin * ccsMockPluginNew () { CCSPlugin *plugin = (CCSPlugin *) calloc (1, sizeof (CCSPlugin)); if (!plugin) return NULL; ccsObjectInit (plugin, &ccsDefaultObjectAllocator); CCSPluginGMock *mock = new CCSPluginGMock (plugin); ccsObjectSetPrivate (plugin, (CCSPrivate *) mock); ccsObjectAddInterface (plugin, (CCSInterface *) &CCSPluginGMockInterface, GET_INTERFACE_TYPE (CCSPluginInterface)); ccsPluginRef (plugin); return plugin; } void ccsFreeMockPlugin (CCSPlugin *plugin) { /* Need to delete the mock correctly */ CCSPluginGMock *mock = (CCSPluginGMock *) ccsObjectGetPrivate (plugin); delete mock; ccsObjectSetPrivate (plugin, NULL); ccsObjectFinalize (plugin); free (plugin); } ././@LongLink0000000000000000000000000000014600000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integration_mock.cppcompiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integration_mock.cp0000644000015301777760000000500112321343002033726 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_integration_mock.h" const CCSIntegrationInterface mockIntegrationBackendInterface = { CCSIntegrationGMock::ccsIntegrationGetIntegratedOptionIndex, CCSIntegrationGMock::ccsIntegrationReadOptionIntoSetting, CCSIntegrationGMock::ccsIntegrationWriteSettingIntoOption, CCSIntegrationGMock::ccsIntegrationUpdateIntegratedSettings, CCSIntegrationGMock::ccsIntegrationDisallowIntegratedWrites, CCSIntegrationGMock::ccsIntegrationAllowIntegratedWrites, CCSIntegrationGMock::ccsFreeIntegration }; CCSIntegration * ccsMockIntegrationBackendNew (CCSObjectAllocationInterface *ai) { CCSIntegration *integration = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegration))); if (!integration) return NULL; CCSIntegrationGMock *gmockBackend = new CCSIntegrationGMock (integration); ccsObjectInit (integration, ai); ccsObjectSetPrivate (integration, (CCSPrivate *) gmockBackend); ccsObjectAddInterface (integration, (const CCSInterface *) &mockIntegrationBackendInterface, GET_INTERFACE_TYPE (CCSIntegrationInterface)); ccsObjectRef (integration); return integration; } void ccsMockIntegrationBackendFree (CCSIntegration *integration) { CCSIntegrationGMock *gmockBackend = reinterpret_cast (ccsObjectGetPrivate (integration)); delete gmockBackend; ccsObjectSetPrivate (integration, NULL); ccsObjectFinalize (integration); (*integration->object.object_allocation->free_) (integration->object.object_allocation->allocator, integration); } ././@LongLink0000000000000000000000000000015500000000000011216 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_mock.cppcompiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_0000644000015301777760000000463112321343002034023 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_integrated_setting_mock.h" const CCSIntegratedSettingInterface mockIntegratedSettingInterface = { CCSIntegratedSettingGMock::ccsIntegratedSettingReadValue, CCSIntegratedSettingGMock::ccsIntegratedSettingWriteValue, CCSIntegratedSettingGMock::ccsIntegratedSettingFree }; CCSIntegratedSetting * ccsMockIntegratedSettingNew (CCSObjectAllocationInterface *ai) { CCSIntegratedSetting *integratedSetting = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSetting))); if (!integratedSetting) return NULL; CCSIntegratedSettingGMock *gmockBackend = new CCSIntegratedSettingGMock (integratedSetting); ccsObjectInit (integratedSetting, ai); ccsObjectSetPrivate (integratedSetting, (CCSPrivate *) gmockBackend); ccsObjectAddInterface (integratedSetting, reinterpret_cast (&mockIntegratedSettingInterface), GET_INTERFACE_TYPE (CCSIntegratedSettingInterface)); ccsObjectRef (integratedSetting); return integratedSetting; } void ccsMockIntegratedSettingFree (CCSIntegratedSetting *integration) { CCSIntegratedSettingGMock *gmockIntegration = GET_PRIVATE (CCSIntegratedSettingGMock, integration); delete gmockIntegration; ccsObjectSetPrivate (integration, NULL); ccsObjectFinalize (integration); (*integration->object.object_allocation->free_) (integration->object.object_allocation->allocator, integration); } compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_backend_mock.cpp0000644000015301777760000000311612321343002033157 0ustar pbusernogroup00000000000000#include #include #include #include "compizconfig_ccs_backend_mock.h" CCSBackendInterface CCSBackendGMockInterface = { CCSBackendGMock::ccsBackendGetInfo, CCSBackendGMock::ccsBackendExecuteEvents, CCSBackendGMock::ccsBackendInit, CCSBackendGMock::ccsBackendFini, CCSBackendGMock::ccsBackendReadInit, CCSBackendGMock::ccsBackendReadSetting, CCSBackendGMock::ccsBackendReadDone, CCSBackendGMock::ccsBackendWriteInit, CCSBackendGMock::ccsBackendWriteSetting, CCSBackendGMock::ccsBackendWriteDone, CCSBackendGMock::ccsBackendUpdateSetting, CCSBackendGMock::ccsBackendGetSettingIsIntegrated, CCSBackendGMock::ccsBackendGetSettingIsReadOnly, CCSBackendGMock::ccsBackendGetExistingProfiles, CCSBackendGMock::ccsBackendDeleteProfile }; CCSBackend * ccsMockBackendNew () { CCSBackend *backend = (CCSBackend *) calloc (1, sizeof (CCSBackend)); if (!backend) return NULL; ccsObjectInit (backend, &ccsDefaultObjectAllocator); CCSBackendGMock *mock = new CCSBackendGMock (backend); ccsObjectSetPrivate (backend, (CCSPrivate *) mock); ccsObjectAddInterface (backend, (CCSInterface *) &CCSBackendGMockInterface, GET_INTERFACE_TYPE (CCSBackendInterface)); ccsBackendRef (backend); return backend; } void ccsFreeMockBackend (CCSBackend *backend) { /* Need to delete the mock correctly */ CCSBackendGMock *mock = (CCSBackendGMock *) ccsObjectGetPrivate (backend); delete mock; ccsObjectSetPrivate (backend, NULL); ccsObjectFinalize (backend); free (backend); } ././@LongLink0000000000000000000000000000016300000000000011215 Lustar 00000000000000compiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_factory_mock.hcompiz-0.9.11+14.04.20140409/compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_0000644000015301777760000000613612321343002034025 0ustar pbusernogroup00000000000000/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_INTEGRATED_SETTING_FACTORY_MOCK_H #define _COMPIZCONFIG_CCS_INTEGRATED_SETTING_FACTORY_MOCK_H #include #include #include #include CCSIntegratedSettingFactory * ccsMockIntegratedSettingFactoryNew (CCSObjectAllocationInterface *ai); void ccsMockIntegratedSettingFactoryFree (CCSIntegratedSettingFactory *); class CCSIntegratedSettingFactoryGMockInterface { public: virtual ~CCSIntegratedSettingFactoryGMockInterface () {} virtual CCSIntegratedSetting * createIntegratedSettingForCCSNameAndType (CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type) = 0; }; class CCSIntegratedSettingFactoryGMock : public CCSIntegratedSettingFactoryGMockInterface { public: MOCK_METHOD4 (createIntegratedSettingForCCSNameAndType, CCSIntegratedSetting * (CCSIntegration *, const char *, const char *, CCSSettingType )); CCSIntegratedSettingFactoryGMock (CCSIntegratedSettingFactory *integratedSettingFactory) : mIntegratedSettingFactory (integratedSettingFactory) { } CCSIntegratedSettingFactory * getIntegratedSettingFactory () { return mIntegratedSettingFactory; } public: static CCSIntegratedSetting * ccsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (CCSIntegratedSettingFactory *factory, CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type) { return reinterpret_cast (factory)->createIntegratedSettingForCCSNameAndType (integration, pluginName, settingName, type); } static void ccsIntegratedSettingFactoryFree (CCSIntegratedSettingFactory *integratedSettingFactory) { ccsMockIntegratedSettingFactoryFree (integratedSettingFactory); } private: CCSIntegratedSettingFactory *mIntegratedSettingFactory; }; extern const CCSIntegratedSettingFactoryInterface mockIntegratedSettingFactoryInterface; #endif compiz-0.9.11+14.04.20140409/compizconfig/mocks/CMakeLists.txt0000644000015301777760000000004312321343002024032 0ustar pbusernogroup00000000000000add_subdirectory (libcompizconfig) compiz-0.9.11+14.04.20140409/compizconfig/CMakeLists.txt0000644000015301777760000000325012321343002022721 0ustar pbusernogroup00000000000000set (_COMPIZCONFIG_INTERNAL ON) set (LIBCOMPIZCONFIG_CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/libcompizconfig/cmake ) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LIBCOMPIZCONFIG_CMAKE_MODULE_PATH}) set (COMPIZCONFIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/libcompizconfig/include) set (COMPIZCONFIG_LIBRARY_DIRS ${CMAKE_CURRENT_BINARY_DIR}/libcompizconfig) if (COMPIZ_PACKAGING_ENABLED) set (libcompizconfig_libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX} CACHE PATH "libdir") set (libcompizconfig_includedir ${CMAKE_INSTALL_PREFIX}/include/compizconfig CACHE PATH "includedir") set (libcompizconfig_prefix ${CMAKE_INSTALL_PREFIX} CACHE PATH "prefix") set (libcompizconfig_exec_prefix ${CMAKE_INSTALL_PREFIX}/bin CACHE PATH "bindir") else (COMPIZ_PACKAGING_ENABLED) set (libcompizconfig_libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) set (libcompizconfig_includedir ${CMAKE_INSTALL_PREFIX}/include/compizconfig) set (libcompizconfig_prefix ${CMAKE_INSTALL_PREFIX}) set (libcompizconfig_exec_prefix ${CMAKE_INSTALL_PREFIX}/bin) endif (COMPIZ_PACKAGING_ENABLED) option (USE_GCONF "Enable legacy GNOME 2.x option integration with GConf" ON) add_subdirectory (libcompizconfig) add_subdirectory (compizconfig-python) add_subdirectory (integration) add_subdirectory (ccsm) if (USE_GCONF) add_subdirectory (gconf) endif (USE_GCONF) if (USE_GSETTINGS) add_subdirectory (gsettings) endif (USE_GSETTINGS) if (COMPIZ_BUILD_TESTING) add_subdirectory (mocks) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) add_custom_target (pyclean) add_dependencies (pyclean pyclean_ccsm pyclean_compizconfig) compiz-0.9.11+14.04.20140409/Doxyfile0000644000015301777760000017363312321343002017215 0ustar pbusernogroup00000000000000# 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 = Compiz # 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 = 0.9 # 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 = doc # 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 = # 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 = NO # 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 = NO # 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 # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # 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 = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # 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 = NO # 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 = NO # 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 = NO # 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 = NO # 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 = NO # 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 = YES # 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 = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = 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 = NO # 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 = NO # 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 = include/ src/ # 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 = *.h # 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 = private* # 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 = _* *Private* *Wrap* # 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 = YES #--------------------------------------------------------------------------- # 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 = YES # 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 = _,Private #--------------------------------------------------------------------------- # 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 = html # 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_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # 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 = YES # 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 = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # 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 = YES #--------------------------------------------------------------------------- # 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 = NO # 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 = latex # 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 # 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 # 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 = a4wide # 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 = YES # 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 # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # 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 = NO # 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 = NO # 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_SHOULD_SKIP_THIS # 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 = # 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 = NO # 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 = NO # 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 = FreeSans # 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 = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # 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 = NO # 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 = # 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 = 50 # 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 = 0 # 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 = NO # 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 = YES # 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